I recently stumbled across a post by Timothee Besset about his plan for an experimental framework for low latency, high fps multiplayer games. TTimo is a games programmer who wrote QRadient and has worked at id software, so knows a bit about what he does.

His post outlines the architecture for a modern FPS game engine, which struck a chord with me. Mostly because at a high level, it's similar to an idea I've had before, a message-oriented game engine using ZeroMQ and its zero-copy message model.

It's always nice to see your idea validated, especially by someone who knows what they're talking about. I'm most definitely not a game programmer, despite having tinkered and modded a lot over the years.

I also happened upon a fantastic interview with Edmund McMillen of Team Meat. Whilst being a talk about game development - Edmunds discussion about motivation, career and dealing with people really struck home about a lot of things I have been thinking about recently. Some of those things I'm not ready to talk about, but in terms of game development, the message is clear - keep going at it, the first 30+ things you make are going to be absolute horse shit..

Combined with discussions with one of my coworkers who is writing his own WebGL MMO, Langenium, the interest has definitely been reawakened, for now.

Onwards and upwards

As a result, I've been putting a small amount of time into this project over the last three weeks. One of the biggest problems I've had working on game-related projects (or really, anything at all) is trying to do too much all at once. You get no reward and make all the wrong design decisions at once.

Instead, I've been working at this iteratively - starting with a 2D maze game and upgrading a single thing at a time towards the end goal of a 3D FPS. A high-level of the iterations are as follows:

  • Tile-based 2D maze game using Windows Forms
  • Moving from tiles to continuous coordinate space
  • Move to OpenGL render in 2D
  • Generate 3D geometry
  • Move to 3D
  • Writing Quake 3 BSP parser
  • Move to BSP geometry
  • Quake 3 BSP culling

So currently, I can load and render a Quake 3 map - moving around within the world. I've implemented visibility testing using the BSP tree, however have a bug in either that code or my BSP loader which is preventing it from working correctly.

Before I push on - I need to fix that and implement support for Vertex Buffer Objects, as I am currently making an OpenGL call for each vertex, which is very expensive and thrashes the frame rate way down. I'm currently getting 10-15FPS, which is much better than I was expecting for my simplistic engine so far.

The Quake 3 map format is super-efficient and designed so data can be slurped straight off disk into OpenGL buffers. My BSP loader takes the data and interprets it into an object graph - so currently does not do this. The current plan is to implement my own load handler to re-flatten the data internally.

Whilst this is a bit of a waste for now, I don't have my own BSP tooling and want to keep my engine from being tied to the IBSP format. This is primarily a learning exercise, and I would like to support early versions of the Valve BSP format as well before I'm done.

From here

I'll be happy with my progress when I can come up with a simple death match game with netcode, similar to Quake 3 - complete with bots. Once I'm done with the game side I want to explore the map 'compilation' side of things, BSP partitioning and portal testing.

I've never really understood that side of things before now, and conceptually it's very straightforward - which is a nice refresher. I'm hopeful that as long as I can stay motivated and get past where I'm currently stuck, I can start to play with game ideas on top of my own engine stack.

image image image image image image image image

Time for another update I suppose. Last year I noticed that it seems I'm most intellectually active around April and October, which definitely seems to hold true this year.

Coworking

This year, I've been trying to force myself to spend four hours a week at a coworking space. I'm a member of a local space called Spacecubed, who host the local Startup Weekend events and have become a great hub for local special interest groups.

Using the space is fantastic, mostly because its a comfortable place where I can zone out and set time aside weekly for getting things done.

Java EE 7

I've recently started foraying into Java again. Borne mostly out of need at work, where I am writing some software to manage software deployments where reliable Git integration is possible. Plus, y'know... all the cool kids are on JVM these days.

Self-learning EE has been rewarding, and it looks like it has come a long way since I last looked at it. It looks like Java 8 will also bring about a lot of long-needed language improvements as well, including Lambda expressions - something I've found makes writing fluent code really nice in C#.

Angular JS

As part of the deployment software I'm writing - I've also had the time to start learning a good Javascript framework for web applications. I've been using AngularJS with Bootstrap as a base, and it's refreshing to be able to rapidly prototype web apps that don't feel like they've been written by a programmer.

Together with Java EE and JAX-RS - this has given me a good common patern for developing web apps again, so should cut down on the hemming and hawing when I get motivated about some of my many forever projects.

Visual Effects

This has been an interest for a long time, and having recently picked up a dslr that shoots 1080p, has been something I've been toying around with.

Whilst I'm interested in the effects side of things, to keep it interesting - I really need to be able to tell a story effectively. Even a one minute narrative is stretching myself a bit thin, but it's hard to get motivated when you're camera shy.

In the meantime I'm reading some good books on scriptwriting and creative writing and will keep hammering away on this in the background.

3D Game Engine

This one I'm particularly happy and motivated about. So much so, it's going to get its own post. Bully for me.

Another thing that has been on my shitlist for quite a while now - is this site.

The original system for this website was custom PERL/PHP loading articles straight from a MySQL database - I would use phpmyadmin as an editor of sorts and all was good, for a time.

In 2005 I wanted more flexibility on what kind of entries I could post. I wanted to move to a format including the main article content, as well as a micro-blogging feed. This lasted for a few years until around 2007-8 when social media started being the outlet for this kind of dribble.

But the move to Drupal was my main choice, it was a compromise between getting things done and having some control over the content. That and I never quite figured out how to get Xaraya to do what I wanted.

One of the things that really bothered me though is that themeing for Drupal is a pain in the butt (ain't nobody got time for that). Back in the day my website used to be both designed and built end-to-end by yours truly. Moving to Drupal had the unintended side-effect of making this too-hard(tm) to do and carry over between upgrades.

Add on top the difficulty of reformatting content and managing comment spam and I'm finally shitted off to do something about it...

Without further ado...

Tada! Here's the new site... pretty, huh?

The site itself is statically generated HTML, driven by a nifty piece of software called Pelican.

Pelican takes a path full of files and converts them from their source format (in this case, Markdown) and generates static html pages from them using templates.

I've been looking at a setup like this for a while, as I've been keen to get my website content in something presentation-agnostic like docbook/markdown for quite a while now. One of my mates has also done this with his website recently, with great success.

Out of the box, Pelican hits 90% of what I want from it.. but to convert the site over I had to write some modules.

URL Redirection

My old site used a horrible URL scheme, generating content at URIs like: /node/###. The way I have the new site uses a much more sensible scheme of /YYYY/SHORTNAME.

That being said, it would be nice to make sure any links on social media or elsewhere pointing to my site (hah), continue to work. Something that Pelican doesn't support.

So the first module hooks each article and looks for a metadata tag oldurl. If present, it will add it to the site's global .htaccess file.

Page media

One thing that seems particularly broken is page media, ie: images or downloads attached to a page. In Pelican's standard model, these files need to be stored in a special folder in your content root called static, where they will be copied into the final output folder. Files copied from this location can be linked to using the standard |filename|blah.jpg tag in Pelican's template engine.

This doesn't make a lot of sense to me, as I'm using my own structure in my content hierachy:

- content/
     - YYYY/ 
          - MMDD_SHORT/
               - *.md
               - (other files)

I'd like to keep the files for each post alongside the post itself. And in case I add new source formats or whatnot later, I don't want to blind copy things either. And I want the |filename|blah.jpg syntax to work too, so Pelican needs to know that there's a file with that name being copied.

This ended up being fairly tricky, at first I wrote a generator plugin to scan the content folders and find any file that wouldn't be picked up by other generators. However this got tricky, because without actually parsing the content alongside it, I wouldn't know where to put the file (eg: ipv6.png on my IPv6 Article should be output to /2013/IPv6/ipv6.png).

Itch: Scratched.

And that's about it. I'm reasonably happy with the way it's turned out. The sites content is now tracked in a git repository, and looks a hell of a lot better (even if the styling is blatently ripped from svbtle).

I'll try and remember to push the two python modules above onto my github, as well as the changes I'm contributing back to core also.

The logo is likely to change, as there's an ongoing discussion about how poor it looks currently - when that's finalised I'll generate some matching busines cards and move onto the next project in the pipeline!

image

One of the big things on my todo list for a while now has been to get as many services on my VPS running on IPv6 as possible.

Getting up to speed on v6 is important to me for both personal and professional reasons - however, an important part of testing this is having somewhere to test from.

So for the first part of my challenge, I needed to get IPv6 working at home. Fortunately my ISP has IPv6 available via a tunnel-broker service available two hops away, so it's almost as good as having it native and far superior to tunneling to HE.net for their otherwise excellent v6 service.

Having recently purchased an awesome Juniper SRX110H-VA for home, I've got a great platform for getting IPv6 up and running.

Here's a somewhat cutdown configuration with all the bits needed to get it working.

interfaces {
    ...
    ip-0/0/0 {
        unit 0 {
            description "iiNet 6RD";
            tunnel {
                source 203.59.XXX.XX;
                destination XXX.X.XXX.XX;
            }
            family inet6 {
                address 2001:4479:cb3b:XXXX::1/64;
            }
        }
    }
    pp0 {
        unit 0 {
            ...
            description "ISP IPv4 Interface";
            family inet {
                filter {
                    input fix-6in4;
                }
                ...
            }
        }
    }
    vlan {
        unit 1 {
            description "Home clients";
            family inet {
                address 10.0.0.254/24;
            }
            family inet6 {
                address 2001:4479:cb3b:XXXX::2/64;
            }
        }
    }
}
security {
    forwarding-options {
        family {
            inet6 {
                mode flow-based;
            }
        }
    }
    zones {
        security-zone world {
            interfaces {
                ip-0/0/0.0 {
                    host-inbound-traffic {
                        system-services {
                            ssh;
                            ping;
                        }
                    }
                }
            }
            ...
        }
    }
}
firewall {
    family inet {
        filter fix-6in4 {
            term term1 {
                from {
                    destination-address {
                        203.59.XXX.XX/32;
                    }
                    protocol 41;
                }
                then packet-mode;
            }
            term term2 {
                then accept;
            }
        }
    }
}
routing-options {
    rib inet6.0 {
        static {
            route ::/0 next-hop ip-0/0/0.0;
        }
    }
}
protocols {
    router-advertisement {
        interface vlan.1 {
            prefix 2001:4479:cb3b:XXXX::/64;
        }
    }
}

OK, maybe that wasn't such a quick snippet, and you'll want to be putting some zone rules to control what traffic can ingress onto home network - as all machines will autoconfigure their own public IPv6 address. Death to NAT, yeeeeeeah baby.

Anyway, after a lot of messing wondering why things weren't working - I realised my Ubiquiti WiFi bridges weren't letting v6 traffic across the links. This is easily fixed by turning on it's WDS which makes it act like a proper Layer 2 bridge.

So now I can IPv6 at home, and have been able to validate my configuration on my VPS. As of the time of writing, the following services are exposed and configured for IPv6...

  • DNS
  • SMTP & Submission
  • HTTP/SSL
  • IMAP/TLS
  • SSH
  • XMPP

Which is everything! Huzzah. Over the last few days I've been tracking and it looks like between 10-50% of my traffic is being delivered via IPv6, which isn't too suprising.

I suspect that my home connection will be doing somewhere near 80% IPv6 traffic, though I've yet to graph that. I also need to get clients performing native IPv6 queries - currently they're getting their DNS settings via DHCPv4.

And that's one off the list... I've learnt a bit about v6, but excepting my WiFi issues it's not as scary as everyone makes out (either that, or I've got a bit of a dunning-krueger thing going on, which wouldn't suprise me).

image

I'm quite notorious for picking up an idea, half-completing it and putting it back down again.

It's pretty frustrating for me, let alone other people - and probably one of the reasons I don't share a lot of what I'm working on; but I still think it's a great way to scratch an itch and move on.

Anyway in the interest of getting out there a bit more, I'll try to share things I come across in my project boneyard...

For the first Half-Baked Sunday: a Left 4 Dead map I was working on in 2010... The map is of the iconic Perth Concert Hall here in Perth and is based on some drawings for it.

The idea was to put together a quick Left 4 Dead campaign starting in the old tunnels under St Georges terrace, breaking through the main auditorium and out to escape on a boat on the river.

I'd still like to complete this - if only because I had such a good start to it. However trying to draw up a map in Hammer based off drawings is a major pain in the butt, and was in fact the motivation to write Jocular.

Jocular was a tool to take a set of 2d lines and extrude them into 3d walls - with control points in the map to handle alignment/scaling of multiple floors (ie: stitching extruded segments together).

Whilst Jocular was working as a tool, at some point it scope creeped to include a GUI editor as well - which then came down to a decision on what vector and 3d library to use (Jocular was written in .NET).

It got a bit too hard and put on the backburner - if I approach this again I will consider writing it in Python as a Blender3D import tool and use the features available there.

... And that's it for the first Half-Baked Sunday, hopefully I'll be able to share some of my stalled projects in future weeks :)

image image image

This is the personal website of Will Dowling, a Solutions Architect hailing from Perth, Western Australia.

Twitter

I talk shit here sometimes.

GitHub

My terrible code. For free.

LinkedIn

Pay me to write bad code and talk shit for you.

Tumblr

Pretty pictures, rarely my own.

Flickr

Pretty pictures, actually mine.