I'll drop any notes I came across for modding the game with the 2025 mod tools.

- For the Definitive Edition assets, I used these models from DeviantArt. As for the size, I set the imported XPS model armature to 7.14286 units to match the game's armature as close as I could get them (basically I just zoomed in to overlapping vertices and eyeballed that they're in the 1/100th or something range close to each other).

- Some objects index or material (I'm not sure which dictates in this case) must match the original objects. Lara's wound decals, bandage, pouch and holster models will dynamically appear and disappear as the player progresses through the game and the modded objects must match these parameters. You can't set a permament visual object with the temporary object, or else you will have missing geometry in some parts of the game.

- Make sure objects' UV map names match if you are directly merging modded 3D-assets with the original game's. Also, make sure objects only use channel 1, or else the geometry will just straight up disappear from the game.

- At least eye position can be adjusted for the skeleton by selecting your individual eye ball models (if your eyes consist of inner and outer models, select the bigger outer shell) and moving the Blender cursor to the origin of the selection. Then, select the eye bones of the current outfit's skeleton and move their origin to the cursor (where the eyes' origins were). I didn't have to edit the laracroft.drm assets at all, only each individual outfit's skeleton. I know it works, because with the previous mod tools, if I used the SOTR eye position, which I use in this mod, the eyes would clip through the whole head as Lara is looking around, because the pivot was all over the place.

- Mod tools support the import of resolution higher than what the game intended. Unfortunately it only supports either DXT or DXT5 formats, which introduce heavy artifacts especially to normal maps. I've also tried both the DXTnm and downsized resolution, 8.8.8.8 ARGB 32 bpp / unsigned methods and both just either instantly crash the game upon loading a save or the normal map doesn't work at all. However, SpecialK allows these formats to be imported to the game, obviously at the cost of messing around with even more 3rd party software interference.

- TressFX hair by default have 2 points weighted to 1.000 to a single bone (bone_0). Maximum amount of points in the entire hair entity spread over all of the objects must be exactly 65535, else the exporter throws an Overflow error. Game also only accepts 16 points per curve.

  • More over, when weight painting the hair, after you have entered the hair objects weight edit mode, enter the edit mode and from there you can select each strand sprouting from the scalp by pressing Select > First, then ctrl+NumpadPLUS to select the second point. Note that the scalp hairs have weights both and the beginning and the end.
  • If your curves don't match exactly 16 points, you can use Geometry Nodes to change the count to that exactly, by selecting the object, going to the Geometry Nodes Editor, making a new node group, adding a Resample Curve node between input and output geometry, changing point count to 16 and converting the curve to mesh and back to curve. It'll make the point count to exactly 16 while keeping the shape the curve had before (end and start points also remain the same).
  • Don't make your curves shorter thinking it'll cut back the vert count. The addon will automatically give the splines 16 verts. The only way to really cut back the vert count is to remove strands. Otherwise even if you think you've optimized the hair, it will convert the shorter splines to 16 verts and give an Overflow error upon exporter. Use the geometry node setup from above paragraph to get the true vert count for reference.
  • Don't worry about all the attributes in the hair curve data properties tab, only bone_0 vertex group matters.

Article information

Added on

Edited on

Written by

zMaZT3Rz

3 comments

  1. anotheraza
    anotheraza
    • member
    • 22 kudos
    A couple of Blender plugins that will make tedious tasks much easier (they’re built in under the “get extensions” tab):

    Vertex Group Assistant: for removing unused vertex groups from a mesh (TR 2013 supports a maximum of 42 vertex groups per mesh and manually removing unweighted groups is a pain in the arse).
    https://extensions.blender.org/add-ons/vertex-group-assistant/

    Simple Renaming: for batch renaming objects and matching object and data names.
    https://extensions.blender.org/add-ons/simple-renaming-panel/
    1. zMaZT3Rz
      zMaZT3Rz
      • supporter
      • 30 kudos
      I actually have a vertex group remover script I had ChatGPT make me couple of years ago. Affects multiple selected objects simultaniously.

      import bpy
      from bpy.types import Operator

      ob = bpy.context.object
      ob.update_from_editmode()
         
      vgroup_used = {i: False for i, k in enumerate(ob.vertex_groups)}
         
      for v in ob.data.vertices:
          for g in v.groups:
              if g.weight > 0.0:
                  vgroup_used[g.group] = True
         
      for i, used in sorted(vgroup_used.items(), reverse=True):
          if not used:
              ob.vertex_groups.remove(ob.vertex_groups[i])

      And another that checks vertex group count for the currently selected object (prints the result to the console):
      import bpy

      # Get the active object
      obj = bpy.context.active_object

      if obj is None:
          print("No active object selected.")
      elif obj.type != 'MESH':
          print(f"The selected object '{obj.name}' is not a mesh.")
      else:
          num_vertex_groups = len(obj.vertex_groups)
          print(f"Object '{obj.name}' has {num_vertex_groups} vertex group(s).")
    2. anotheraza
      anotheraza
      • member
      • 22 kudos
      Vertex Group Assistant works on multiple objects at once, but I don’t think it lets/helps you count the number of groups already assigned to an object (it just tells you how many have been removed and from how many objects). I ended up just using the size of the scroll bar as a guide.