Friday, April 26, 2013

Long time, no post, let's do something about that...

The major downside to having this as a personal hobby project is that just about everything else comes first priority-wise, leading to some long breaks in the action if the perfect storm of life events and daily workload hits.  Blah.  Here's the latest:

Resource packages can now contain shader objects as well as geometry data, so now I'm one step closer to a fully-featured material system being in place.  That'll make materials themselves very lightweight objects, basically named references to individual shaders, textures, and tune-able values.  The renderer is prepped to use a material-based sorting process for minimizing changes to the render pipeline, so the sooner I finish up with the material system's pre-reqs, the happier I'll be with the graphics side (which currently just draws everything out in a linear fashion, oblivious to shared material properties).  Not a lot of impact on the current system right now because the asset count is so low, but it'll be mandatory with a full scene of objects, players, and effects.

I've escaped from the jungles of dynamic mesh topology algorithms with a fairly efficient means for rebuilding local mesh patches on the fly (to respond to new intersection events), which came about as part of the process for getting the automatic Navigational Mesh generator tool up and running in my level editor.  The idea there is that anyone building a level won't have to custom-paint their own navmesh polygons, because the editor will be able to analyze the geometry of the entire terrain and build a navmesh with minimal polygons as part of the "compile" process for the map.  It really deserves its own post soon, I had a lot of fun (and learned a lot) getting it working.  The next step is going to be hooking the patch re-triangulation portion up to the in-game world manager so that the mesh gets rebuilt as players drop in structures or walls get destroyed, etc.

Also, work is progressing well on Cryamore, if anyone was able to check out the demo at GDC last month, here's hoping you enjoyed it!

Friday, February 15, 2013

Behind the Scenes :: Critter Exploration

Life's been...well...life, as is often the case, but I have managed to put in a little time recently for some concept development.  Thought it might be fun to share, so here we go.

I've had a running idea in my head of the various kinds of bugs that will assail the player(s) as they try and reap the rewards of the planet's mineralogy, but none of the concepts were very fine-tuned.  I'm sure of the behaviors I want them to express, but their actual appearance is in that "perfect in my head, undefined on paper" kind of state.

The following, therefore, is what my visual exploration and refinement process looks like for one of the first bug types the player will meet.
(click to enlarge)
 
I knew that I wanted a pack-critter, something that roamed in small-to-large groups and harassed the players due to their speed and melee preference.  I had initially thought to try and model the bug off a dog's anatomy, but those all channeled a little too much Skagg (of Borderlands fame) so I kept digging.  The end result was more of a rabbit-insect hybrid, and I've been happy with how that's coming out.

As these are all roughs, I'll put up a "final pass" of this fella in a more formal spotlighting post, much like our heroes and any supporting cast.  I'll make sure to save the bigger/rarer creatures' reveal for the game itself, but these guys will be roaming around on the intro level, so guilt-free: it's not much of a spoiler. :)

Sunday, January 27, 2013

Other rumblings in the indie development scene

I've been picked up as a programmer for an old-school action RPG that some of you may have heard of, it's been pitched around various twitter/tumblr feeds for the last few months:

The team has some awesome talent involved, check out the trailer through the link for more!

(Work will still continue on this project, no worries)

Thursday, January 24, 2013

Meet the Cast: Episode 1

Meet Nero:
Half of the two-person team that take us through the game's storyline, and one of the playable options.  I wanted to post both of the playable characters as a pair, but her cohort is still half-finished, and since I made mention of the fact that I'd have some art to show people, I'll just leave her solo for now.

What she's wearing is part of the standard-issue gear for all new employees of the RATE (Resource Acquisition & Territorial Expansion) program, the meal ticket that brings both of our heroes to the shores of the game's home planet.  If you're familiar with US history, it's similar to the deals handed out to homesteaders that pushed westward from the Mississippi, only...in space.

Stay tuned for Episode 2, where we meet her cavalier red-headed team mate, and learn more about what waits for players in this backwoods corner of the galaxy!

Tuesday, January 8, 2013

New year, new focus

Not much to add, just throwing a quick post up that says the project is still in progress, albeit recovering from the slowdown that the holidays bring.  All christmanewyears revelry being finished, and with life attempting to resume its normal, 10%-less-hectic pace, I've picked back up on getting this game to a playable, demo-able state.

I think 2013 is going to be a good, fun year.

Tuesday, November 27, 2012

Once more unto the chopping block

So some great news for me, the SharpDX Toolkit was released at the end of October, providing a clean high-level interface with DirectX11 similar to the XNA model, only not reliant on XNA support.  I'm especially excited because it allows me to fall back on what is most assuredly a better-structured library than what I cobbled together while learning how to program a DirectX pipeline.

While this doesn't break my current code, it does give me a great foundation to make one final sweeping overhaul to the main engine/library to focus on a data-centric model.  My existing code wraps a lot of data objects with personality and functions that really should just belong to an authoritative "Renderer" object, so I've started moving towards a design that simplifies my camera classes, effect libraries, and other infrastructure entities and makes them components of a primary Renderer.  That renderer will work with a single source of world data and state data to render the entire scene (from world geometry to actors, UI, etc) appropriately for the gamestate.

The other impetus for cleaning up and officializing (is that a word?) my data components is interoperability with other sub-systems.  My physics and AI managers are going to need to access subsets of the world data to do things like calculate navigation meshes and collision hulls based on a dynamic worldspace, as the players will be creating (and destroying) walls, buildings, nests, resources, and so on.  Moving data management and world change responses into a singular "world manager" that can handle manipulation and access to a geometry and materials heirarchy will keep that organized and clean behind some simple interface calls.

So aside from the (I promised myself, final) design overhaul, I've been off in right-brain land honing my art chops before I start cranking out assets I actually want to use in the game.  I'm pleased with the practice and progress, and should have some character sheets of the main characters (in their designer-blessed officialdome) available shortly, with environment shots to follow.  Everybody loves some good concept art.

Monday, October 8, 2012

Running Silent

I wanted to throw something up here so the blog didn't look like it had gone dead, but there's nothing really new to show for the work that's gone into the project recently.

An interesting part of programming is how much you can do for no visible difference.  My focus has recently been on improving the resource infrastructure of the code, specifically creating a generic resource package class that can hold serializable data for the engine to convert at run-time into the actual 3d assets for the game (models, props, all that fun stuff).  This also required a quick thrown-together packaging tool to be built.

Initially, (as I've mentioned using Assimp.NET before) I was loading from the COLLADA model format because it had a handy exporter from Blender and is known for playing nice between most graphics tools and pipelines.  Part of this is because it's designed to store as much information as possible about the 3d scene.  My engine only needs a handful of data types from the .dae file (mostly vertex information, a material string, and skeleton/animation keyframes).  That meant everything else that Assimp loaded from the file (and the resulting Scene object in memory during the load process) was superfluous wasted effort during runtime.  The process (while the game was running, mind you) went

  • Load COLLADA file from disk
  • Parse COLLADA file into Assimp's Scene object
  • Hand completed Scene object to content manager
  • Have content manager pick apart Scene object and convert data types into SharpDX-specific formats
  • Build new Mesh object (specific to my library) from the few pieces content manager pulled out of the Scene
  • Delete Scene and Importer objects
  • Return the Mesh
Deciding this was all better done offline, I moved all that functionality into a new Resource Packager tool.  This is one reason I love C#: you can throw together a Windows tool in an afternoon with WinForms.  Yes, I know WPF is the new, Win8-friendly answer, but since this is just for in-house work, I'm fine with drag-n'-drop winforms for now.

Now the tool does all the conversion (of multiple COLLADA files, as many as I want really) to in-memory Mesh objects, and then packs those objects into a tight, serializable format that only stores specifically what I need to re-create the object at runtime.  That data (in memory) is then written out to a proprietary resource pack file format (on disk).  This all means smaller resource files, fewer files to manage on disk(since the resource pack tracks everything internally, I just have to know which resource file holds which models), and faster loading of resources on the fly.

The new resource flow?
  • At level load-time, read list of required resource packs from level file
  • Pass list to resource manager, loads any not currently ready from disk and closes handles to those no longer needed
  • Call "ResourceManager.Load(modelX)" for resource named modelX at any point I need to create a mesh object (again, mostly at initial level load).
This lets me group assets thematically (i.e. "props for desert level" vs "props for snowy level") and future plans include adding other asset types to the packaging process (audio, textures, scripts, etc).

As a bonus, I tasked the Resource Manager with smart object loading: it tracks which meshes have been deserialized into memory, and if a requested object is already built, it just copies the existing object instead of building a brand new one.

The funny part, appropriate to the post title, is that my metric for completion is that there is no visible difference in the game with the new resource system.  It makes my code simpler and more data-driven, but if someone were to run the previous build alongside the new enhanced-resource-manager version, it just looks like I sat on my hands for two weeks.

Other than that, I've been making tweaks to the level editor, camera system, and laying some groundwork for AI and Physics.  Thinking I'll need some kind of marshaller between data the physics library can play with, and data the AI routines can use for Navigational-Mesh generation.

Oh, and I've been exploring character designs and more bug concepts to nail down the look of the heroes and their new unfriendly neighbors.  Getting close, I like what I'm homing in on, so I should have more of that available to show soon.

Man, these video games are a lot of work.  Who knew? :)