Hi,

 

I thought a few people in the list might be interested in a little bit about
how I use Softimage as the core of the 3d asset pipeline I have created for
my game engine. A mini post mortem, if you will. I'm always promoting
Softimage in the various social spaces I hang out in, giving advice and
looking for others who use it for making games. Seems like there aren't a
lot of us to be honest and this seems as good of a place as any to share
this kind of thing.

 

Before I get into it, and apologies for the spam, but I also wanted to
quickly plug the game I've been working on for so long. Thunder Moon hit the
Xbox marketplace last week. If you have an Xbox and don't mind helping out a
fellow softie, please find Thunder Moon in the marketplace
http://bit.ly/15TgjB6, trial it (or even buy it!) and give it a rating,
hopefully 5-stars. It really helps me out at this critical stage of the PR
process to maintain visibility in the ratings list. You can find out more
about the game here, http://blog.boundingboxgames.com/ or here
https://www.facebook.com/thundermoongame.

 

So, here are some of my experiences with Softimage in the context of the
exporter & pipeline I created for my game engine. 

 

I have written an exporter for Softimage that produces files in an
intermediate binary format (.ecf, for Engine Content File) that is processed
by tools specific to my game engine to make the final data loaded by the
game. Pretty typical stuff I suppose, but I wanted to mention that for me, I
found it easier and more useful to make my own exporters than to write
parsers for FBX or Collada (which I put a lot of effort into trying to do,
not just guessing here). Those formats are either proprietary or pretty dang
complicated to deal with and by writing my own exporter to my own binary
format I regained control of the situation and the problem of how to get
data from Softimage to the game became much more straightforward. There were
some challenges getting all the UV data and shader data out of Softimage,
but in the end it all worked out well enough. 

 

One challenging part of this has been the real time shaders, because the
pipeline supports arbitrary shaders and will export all the parameter
settings. The APIs for this work well enough but there seems to have been
some undocumented changes over the past few versions. For instance, SI2014
seems to have a few new shader parameters associated with RT shaders that
are automatically created by Softimage, which my exporter discovers and
exports like it does any other global glsl variable despite me not actually
having these variables in the code. This was a small issue for me because
the game runs using parallel HLSL shaders and expects to be able to set all
parameters that were exported. Since these "ghost" variables do not exist in
either the glsl or hlsl source, I had to put special case code to handle
this recent change. Of all the things I wish Softimage would open up the
source to and let us tinker, this would be it. One thing that worked well
here was to make a "property dictionary" that had was basically a set of
dictionaries, one for each data type, all keyed by string, which let me
export an arbitrary amount of loose data without having to change the file
format. This was essential for dealing with different shaders that usually
had different parameters to push to the game engine.

 

The game supports rigid bodies made of composite shapes. The exporter knows
how to produce physics data for the models being exported. Originally, these
were set up with the Softimage rigid body objects but I had to stop using
them because of crashes that would occur when attempting to get data out of
them with the C++ api (I think it was GetPatriarch or something like that).
I reported these bugs, and I think it was about a year and a half later that
they were fixed with SI2014 but I had long since moved on to a workaround as
is often the case with Softimage. I now do something a little different,
which works better for me anyway. I use a collection of meshes that are each
constrained to a bone in the character or model. The hierarchy of these
messages, combined with custom properties for essentially "rigid body root"
and "rigid body part" allow me to define a collection of rigid bodies for an
asset. When exported, each RBR is composed of all the RBPs underneath it,
with any sub-RBR's defining a new rigid body. The RBR property has various
parameters to define the rigid body as a whole such as total mass and
various game metadata, and the RBP has parameters that mainly define that
shape of that part of the composite rigid body. Shape being a sphere,
capsule, box, or mesh etc, the actual final geometry being derived by the
local axis and the points the mesh is composed of. It took a little work to
get the shape generators to properly contain these control points but it
wasn't too big of a deal and this approach allows me to circumvent the
limited set of primitive objects provided by Softimage's physics system. The
custom properties also allow for additional metadata specific to my game
engine's physics such as friction parameters and so forth. 

 

Speaking of additional metadata, there are a number of custom properties the
exporter knows how to deal with. "Locators" is one of them, these are nulls
that have been tagged with the "Locator" property. These allow the game to
find named transforms relative to the animated hierarchy of deformers.
Locators exist in the hierarchy of deformers and their data propagates all
the way to the game runtime, but these matrices are not included in the set
of matrices that are constantly updated for the characters - they are
updated on demand when they are occasionally needed. This allows for any
number of locators to be set up for an asset without incurring continuous
overhead. This is used for particle emitter points and attachment points,
among other things.

 

As you can see, for better or worse I've coupled my pipeline to Softimage.
If I want to switch to another package in the future, I'll need to do the
same sort of exporter there. This would be a lot of work and is easily the
biggest downside of taking this approach to the pipeline. Before deciding to
commit to this, I really tried to make the other formats work but I just
couldn't convince myself I would get the kind of user experience I wanted
for the artists. The way it is set up now, I can hit export and have
everything related to the asset get sent out with a minimum of human error.
There is no massaging of meshes to make them deal with quirks of the file
format. All animation sources are included in the exported data. It works
with referenced models, and can export meshes and animations separately or
together, whichever makes sense for the asset. It knows how to deal with
subdivided meshes. It all just works, and by eliminating the manual steps in
the export I have avoided a lot of "oops I forgot" type of problems I've
seen in the past with other pipelines.

 

Originally, I had set up the exporter to be something that ran as a XSIBatch
thing, constantly listening to network requests to export a SCN. The idea
was that if the content pipeline changed, or if an .SCN file was changed,
the build system would trigger rebuilds of all affected assets. This
actually worked, and was really quite fast, but in practice it just turned
out to be easier to make a list of all assets the game uses and make a
single batch file and run it when that happened (which wasn't very often,
and hardly ever happens now). Typically, triggering a manual export when
"done" building/tuning an asset is how it works now. It's just simpler at so
many levels this way. Rather than having the pipeline deal with .SCN
objects, it just deals with .ECFs. This is good for another reason; since
the ECF format is something I made, I can make other tools that create these
files and not have everything coupled to Softimage.

 

In a sense, it's kind of like having written my own FBX or DAE format.
Perhaps in the end it might be better to have just parsed either of those,
but I don't think so. They are both great for pushing data between 3D apps
at a high level, and I do use them for that. I think it's likely either of
them could theoretically work as an intermediate format, there is probably a
way to get the extra metadata I need, but the downsides of working with them
just didn't make sense for me. With FBX being closed format and given my
experiences with waiting over a year for show stopping bugs to get fixed the
potential for that to happen is unacceptable. Collada is better in that
regard but the parsers I could find were difficult to work with. Both of
these formats have export steps that require things to be remembered and
performed manually, correctly, every time. As I looked into both of these, I
realized I was essentially making a layer between Softimage -> FBX -> ECF ->
Game when I could just go Softimage -> ECF -> Game and skip the step of
dealing with either of them, avoiding any limitations they may have and
reducing chances of human error in the process.

 

I'm planning to do a Windows version of the game at some point, which has
been designed from the outset to be moddable by the players. If & when that
happens, I plan to provide this exporter to players to help them get their
assets into the game.

 

Hope someone finds this useful. 

 

Have a great day,

 

Eric Cosky

 

Reply via email to