This adds support for generating collide meshes when importing custom models. A couple of things to keep in mind:
A single collide-mesh may only have up to 255 vertices.
When exporting a GLTF file in Blender, a collide-mesh will be generated for every mesh object that has collision properties applied (ideally, you would set all visual meshes to ignore and your collision meshes to invisible in the OpenGOAL plugin's custom properties).
~One annoying problem that I haven't fully figured out yet (unrelated to the actual functionality):
collide-meshes are stored in art groups as an (array collide-mesh) in the art-joint-geo's extra, so I had to add a new Res type to support this. The way that arrays are stored in res-lumps is a bit of a hack right now. The lump only stores a pointer to the array, so the size of that is 4 bytes, but because we have to generate all the actual array data too, the current ResLump code in C++ doesn't handle this case well and would assert, so I decided to omit the asserts if an array tag is present and "fake" the size so the object file is generated more closely to how the game expects it until we figure out something better.~
This was fixed by generating the array data beforehand and creating a ResRef class that takes the pointer to the array data and adds it to the lump.
This adds support for generating collide meshes when importing custom models. A couple of things to keep in mind:
collide-mesh
may only have up to 255 vertices.collide-mesh
will be generated for every mesh object that has collision properties applied (ideally, you would set all visual meshes toignore
and your collision meshes toinvisible
in the OpenGOAL plugin's custom properties).collide-shape-prim-mesh
es for eachcollide-mesh
(example from the original game that uses multiple meshes).~One annoying problem that I haven't fully figured out yet (unrelated to the actual functionality):
collide-mesh
es are stored in art groups as an(array collide-mesh)
in theart-joint-geo
'sextra
, so I had to add a newRes
type to support this. The way thatarray
s are stored inres-lump
s is a bit of a hack right now. The lump only stores a pointer to the array, so the size of that is 4 bytes, but because we have to generate all the actual array data too, the currentResLump
code in C++ doesn't handle this case well and would assert, so I decided to omit the asserts if anarray
tag is present and "fake" the size so the object file is generated more closely to how the game expects it until we figure out something better.~ This was fixed by generating the array data beforehand and creating aResRef
class that takes the pointer to the array data and adds it to the lump.