There's a solution: skeletal animation.chuck_starchaser wrote:2) The opening hatch has to be a subobject in order to be animated. The cost of displaying it as a subobject could be ameliorated by making it share the texture with... which model, now? The inside? The outside?
Neither.
Skeletal animation does not require multiple submeshes, it may animate different parts of the same submesh, because each vertex is assigned to a bone (or more than one), and shaders (or software) does the vertex animation as required.
So... keep the hatch as a part of the outside mesh.
As a general rule, you must get outside models as close to a single batch as possible (that is... a single submesh - a single material, a single texture).
Inside models (or docked models) are not necessarily that critical, because they're meant to be rendered themselves only. Outside models will be all over the screen - you may have 20 ferrets and 10 hellcats on screen, while you will only have 1 ferret cockpit or 1 docked ferret. So making cockpit/docked models use several batches is OK.
And models are divided in three "variants": space model (seen from outside), cockpit model (seen from inside), and docked model (seen from outside, when landed - up close, and by itself or with very few others on a hangar bay). Usually, you make the docked model equal to the outside model for simplicity, but the new engine's specs already support separating them, in case you need to.
For instance, the landing gear is a model component that is Dock-only (ah... you can flag submeshes to be dock-only, so you have a generic hull and need not duplicate the hull for the dock-only version).
Do check Model.h. It will change (I'm redesigning it), but only to expand the featureset and unify interfaces a bit, so all you see there will still be a feature.
The problem with aiming only at a replacement engine is that the design itself is very flexible and unified, so I can't write the framework without all the features. But what I can do (and I'm doing whenever possible), is to only implement a subset of the interface. Like, for instance, CEGUI interfaces will wait (they get a tad difficult to implement, and aren't at all critical).