11 hours ago11 hr @Jason Voorhees most characters and props are stored as .msh files, the actual levels are more complicated. Things like walls, floors, stairs, terrain, doors, and collision geometry are stored inside the game’s .SLS level files, so I wrote my own extraction and conversion tools in Python. I first examined the files in a hex editor and compared lots of different models to find recurring structures.From that, I worked out where the files store:verticestrianglestriangle stripsnormalsUV coordinatesmaterialstexture referencesbonesskin weightsobject positions and rotationsI used the game’s original linker .map files and Ghidra to figure out the Slayer Engine stuff.The mesh format actually has several variations. Some models use different vertex layouts, and normals aren’t always stored the same way.The game also uses both normal triangle lists and triangle strips. The custom converter turns them into ordinary triangles and removes the empty “stitching” triangles that the engine uses.Textures are stored separately in .mtx archives (compressed DXT1 or DXT5 textures) which were figured out by others already. The custom converter matches each material with the correct extracted texture and then exports the model as a glTF .glb file.Characters files contain skeletons, bone mappings, skin weights, and per-material bone palettes. I am trying to reconstruct all of that so Godot imports them as properly rigged characters with a Skeleton3D. The animations come from separate .ban and .boneanim files, which also need custom parsers but i havent fully figured that out yet.For each level, the custom parser pipeline reads the .SLS file and extracts:the world architectureplaced propscharactersterraindoors and moving platformscollision volumeslightstriggersspawn positionsall the original transformsIt then converts the geometry to GLB and automatically generates the Godot scene with everything placed in the correct position.I also used Ninja Ripper occasionally to capture individual draw calls from the running game as ground for searching.It was mainly a way to compare my converted geometry and UVs with what the original game actually rendered.Ninja Ripper captures are affected by camera culling and repeated model instances, so they aren’t as reliable. Edited 11 hours ago11 hr by nochnichda
Create an account or sign in to comment