Skip to content
View in the app

A better way to browse. Learn more.

ResHax

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
Help us keep the site running.

LEGOR Star WarsT: The Skywalker Saga ( .model )

Featured Replies

  • Author
  • Localization

ddj, posted Thu Apr 07, 2022 4:47 pm (70937)


wondering the same,
didnt get further then figuring out for a particular droid dx11.ghg file, then again I'm a noob :) :
000005b6 MESH Version 0xc9
000005ba Number of Parts: 0x00000030
  • Author
  • Localization

spiritovod, posted Thu Apr 07, 2022 8:28 pm (70942)


They have quite complex mesh system, but for static meshes ("model" files) it's more or less simple.

In general, every mesh file consists of header and SMNR containers - you can find count of them in a model file before the first container, for example, for tree_stump and maz_castle from provided sample it will be 4. Those containers can include other kind of containers and other info. For static meshes they would contain mostly mesh data (vertices indices and such) in DXTV sub-containers. Right before every DXTV container there will be vertices count in big endian - pay attention that fields should be parsed in big endian, but data itself is little endian. Depending on SMNR type (I think it's a second field after container's header) it can consist of one or two DXTV subcontainer - tree_stump is the first one and maz_castle is the second. In the first case all data will be included in the first block (positions as half-float normals UV other) and after that there is block with indices. In the second case first DXTV subcontainer contains only normals UV other and the second one contains positions as float and block with indices. I believe that types of included in DXTV data are serialized in its header, also the header has variable size. You can see the purpose of each SMNR container at the end of file - for example, for tree_stump the first one will be base model, second and third are LODs and the last one is "shadow" mesh (it's usually used for effects).

Here is visual representation of results for the things explained above:
for tree_stump: https://i.imgur.com/0DWDomn.png
for maz_castle: https://i.imgur.com/ARSXUY9.png

===========================================

Update:
Ok, here is a brief explanation about skeletal meshes ("ghg" files):
They work in around the same way as static meshes, but more complicated. They have single indices block for all submeshes. Also, at the end of all SMNR containers with DXTV subcontainers with mesh data there will be 78 bytes block with usage of geometry of this DXTV block. For example, in incinerator_stormtrooper file first DXTV contains both positions other info and indices data. Right after indices there is field with start index for indices, indices count, start index for positions and positions count (actually it's stride value * count). If you're serializing them separately, start index for positions will be always zero, as in most cases current DXTV contains separate positions data (either float or half-float) - but if you'll take a look at SMNR containers hierarchy, you should notice the same index values, which are shared among submeshes, considering current SMNR container. I suppose it allows to create groups of submeshes and process them in connection with each other if needed.

Here is visual representation of results for the things explained above:
for incinerator_stormtrooper (1st DXTV block submesh): https://i.imgur.com/QfMYTzv.png
for incinerator_stormtrooper (3rd DXTV block submesh): https://i.imgur.com/bR0wUlz.png
for incinerator_stormtrooper (4th DXTV block submesh): https://i.imgur.com/okAKBJi.png

===========================================

Samples, used here: link
  • Author
  • Localization

ddj, posted Fri Apr 08, 2022 1:14 pm (70959)


well that's helpfull :)

Managed to pull out verts for a dx11.ghg, not entirely sure how to figure out the indices blocks yet, but this feels like a victory :D
Image
  • Author
  • Localization

spiritovod, posted Fri Apr 08, 2022 3:38 pm (70962)


I've updated my previous post with more info about skeletal meshes ("ghg" files).
  • Author
  • Localization

ddj, posted Fri Apr 08, 2022 4:55 pm (70964)


ok, thanks a lot.

Not entirely sure if i grasp it all yet, but it will definatly help in doing so.
still searching for the marker that gives a clue about the different offsets between the verts as well (uv's vert colors, normals etc that lay in between)
it seems to differ from one file to another, comparing SMNR headers from different files will spread clarity on that i suppose.

Takes a tremendeous time figuring it out when you don't exactly know what you're doing but pretty satisfactory gettin something out of it

What tool is that by the way? Looks complicated enough to completely loose my headings .
  • Author
  • Localization

spiritovod, posted Fri Apr 08, 2022 5:14 pm (70965)


@ddj: It's Advanced Mesh Reaper (AXE). As for what data is contained in each DXTV, I'm pretty sure it's serialized in DXTV header, which contains list of properties and their values (looks very similar to overall structure of unversioned properties in UE4). Unlike other engines, here you can actually guess their values, considering block contents, if you'll invest enough time.
  • Author
  • Localization

KL3W, posted Sun Apr 10, 2022 5:39 pm (71035)


So is there a script for .model files yet??? Or is it only manual work?
  • Author
  • Localization

DKDave, posted Sun Apr 10, 2022 10:04 pm (71039)


I haven't looked at it a massive amount, but the face indices are referenced from a submesh table at the end of the block of vertex data. So just by doing some manual tinkering, I managed to get this for Kuill. It should be possible to script it, but there are a few annoying things in there.

The DXTV header does contain information on which vertex types are present - there are 3 bytes for each entry after the vertex types count value, but not sure about most of them. As spiritovod says, they can probably be worked out though with a bit of time spent analysing them. The 3 bytes seem to be as follows:

Vertex element type (0 = vertices, 5 = UVs, etc.)
Number type
Vertex element offset within vertex stride (so offset 0 is usually vertices)

Image
  • Author
  • Localization

ddj, posted Mon Apr 11, 2022 11:38 am (71054)


interesting to try make sense of it all, but I might have better picked some easyer files :lol:

Not entirely sure how to use that submesh table works but it appears in multiple places,

There seems to be one at the end of DXTV blocks (if it has indices it's after them, if it only has vert info its at the end of the verts. 0x00000000 dividing em? )
and there seem to be separate SMNR's aswell that hold those kind of tables.

general grievious ghg has all those variants

As for the DXTV header i assume after the 0x000000A9 comes the amount of vertex components in this form 0x00000001, after that the types?

Code:
0001 00 00 05 02 00000125 44585456 000000A9 00000001 00 06 00


not entirely sure what the 0x003C, but seems to always come after position half floats (terminator or extra unused vector4 ?)
gives these:
Code:
899D 7936 43B1 003C 
129C 6536 50B1 003C
509F 6536 49B1 003C
099D 5536 54B1 003C



Edit...
these seem to be the types 2byte identifier 1 byte dunowhat for most DXTV's from general grievious that seem relevant
Code:
vert_cnt DXTV              list_cnt verts    ???      ???      ???      ???      ???       ???      ???      ???
0000040A 44585456 000000A9 00000005 0006 00  0108 08  0209 0C                                       0907 10  0A08 14  00 00 00 00 00 00
00000125 44585456 000000A9 00000001 0006 00                                                                           00 00 00 00 00 00
00000125 44585456 000000A9 00000004          0108 00  0209 04                                       0907 08  0A08 0C  00 00 00 00 00 00
0000485E 44585456 000000A9 00000008 0006 00  0108 08  0209 0C  0308 10            0506 14  0704 1C  0907 2C  0A08 30  00 00 00 00 00 00
000017C4 44585456 000000A9 00000004 0006 00  0108 08                                                0907 0C  0A08 10  00 00 00 00 00 00
000032EC 44585456 000000A9 00000009 0006 00  0108 08  0209 0C  0308 10  0409 14  0506 18  0704 20   0907 30  0A08 34  00 00 00 00 00 00
000016FD 44585456 000000A9 00000006 0006 00  0108 08  0209 0C  0308 10           0506 14  0704 1C                     00 00 00 00 00 00
0000014E 44585456 000000A9 00000003 0006 00  0108 08  0209 0C                                                         00 00 00 00 00 00
00000054 44585456 000000A9 00000001 0006 00                                                                           00 00 00 00 00 00
00000054 44585456 000000A9 00000002          0108 00  0209 04                                                         00 00 00 00 00 00
000005D7 44585456 000000A9 00000002 0006 00  0108 08                                                                  00 00 00 00 00 00
00001A57 44585456 000000A9 00000007 0006 00  0108 08  0209 0C  0308 10  0409 14  0506 18  0704 20                     00 00 00 00 00 00
  • Author
  • Localization

Sluicer, posted Mon Apr 11, 2022 3:47 pm (71057)


I called the values after the DXTV (and its version (0xA9)) VertexDefinitions: This is what I found in the past:
At first there is the number of definitions (n). After that there are n times 3 byte: variable, type, offset.
Code:
enum VariableEnum
    {
      position = 0,
      normal = 1,
      colorSet0 = 2,
      tangent = 3,
      colorSet1 = 4,
      uvSet01 = 5,
      unknown6 = 6,
      uvSet2 = 7,
      unknown8 = 8, // A
      blendIndices0 = 9, // B
      blendWeight0 = 10, // C
      unknown11 = 11, // D
      lightDirSet = 12, // E
      lightColSet = 13, // F
    }

Code:
enum VariableTypeEnum
    {
      vec2float = 2, // --> 8 byte
      vec3float = 3, // --> 12 byte
      vec4float = 4, // --> 16 byte
      vec2half = 5, // --> 4 byte
      vec4half = 6, // --> 8 byte (2 byte are lost)
      vec4char = 7, // --> 4 byte
      vec4mini = 8, // --> 4 byte (4 floating point values)
      color4char = 9, // --> 4 byte
    }


So in the fist line of your example:
Code:
0006 00  0108 08  0209 0C  0907 10  0A08 14

position (0x00) of type vec4half (0x06) at offset (0x00)
normal (0x01) of type vec4mini (0x08) at offset (0x08)
colorSet0 (0x02) of type color4char (0x09) at offset (0x0C)
blendIndices0 (0x09) of type vec4char (0x07) at offset (0x10)
blendWeight0 (0x0A) of type vec4mini (0x08) at offset (0x14)
  • Author
  • Localization

KL3W, posted Tue Apr 12, 2022 2:18 pm (71087)


I wish there was a tool for this, because I thought I knew some stuff about this but clearly I don't understand a thing...
  • Author
  • Localization

Karpati, posted Fri Apr 15, 2022 6:10 pm (71143)


KL3W wrote:
I wish there was a tool for this, because I thought I knew some stuff about this but clearly I don't understand a thing...

I have added the NTT Engine .model loader module to the 3D Object Converter v8.024.
(I did not released it yet.)

I have tested it on the
1159 .model files I did find in the game.dat and
1929 .model files I did find in the game1.dat archive files.

  • Author
  • Localization

KillzXGaming, posted Fri Apr 15, 2022 8:23 pm (71148)


I made my own dump tool for those interested which outputs as .dae (only works on .model atm).

Should support vertex colors and multiple UV sets aswell.

Source is included so feel free to use that to make your own tools. Just drag/drop a .model onto the .exe to use it.

Image

Download here:

https://drive.google.com/file/d/1YxNQmOPerNHR8trAMLFsQijWilEqJYv-/view?usp=sharing

Tool requires net 5.0 or higher.
  • Author
  • Localization

MilkPls, posted Sat Apr 16, 2022 2:22 am (71149)


KillzXGaming wrote:
I made my own dump tool for those interested which outputs as .dae (only works on .model atm).

Should support vertex colors and multiple UV sets aswell.

Source is included so feel free to use that to make your own tools. Just drag/drop a .model onto the .exe to use it.

Image

Download here:

https://drive.google.com/file/d/1YxNQmOPerNHR8trAMLFsQijWilEqJYv-/view?usp=sharing

Tool requires net 5.0 or higher.

Hi, tried to use this tool with one of the falcon cutscene files but it just opened and flashed the command prompt for a second and didn't extract the mesh. Any idea on how I could fix this?
  • Author
  • Localization

09williamsad, posted Sat Apr 16, 2022 7:59 am (71152)


KillzXGaming wrote:
I made my own dump tool for those interested which outputs as .dae (only works on .model atm).
Should support vertex colors and multiple UV sets aswell.
Source is included so feel free to use that to make your own tools. Just drag/drop a .model onto the .exe to use it.
Download here: https://drive.google.com/file/d/1YxNQmOPerNHR8trAMLFsQijWilEqJYv-/view?usp=sharing
Tool requires net 5.0 or higher.

The default console and desktop installers for .net 5.0 put hostpolicy.dll in a different place to what the program expects.
"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.16\hostpolicy.dll"
Code:
The default installers for .net 5.0 put hostpolicy.dll in a different place to what the program expects.
ModelDumper.exe TANTIVEIV_X3SCALE_DX11.MODEL
Cannot use file stream for [C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.deps.json]: No such file or directory
A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet\'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because 'C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.runtimeconfig.json' was not found.
  - If this should be a framework-dependent app, add the 'C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.runtimeconfig.json' file and specify the appropriate framework.

Copying the dll to that folder "C:\Program Files\dotnet\" gets past that error but another occurs.
Code:
ModelDumper.exe TANTIVEIV_X3SCALE_DX11.MODEL
Cannot use file stream for [C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.deps.json]: No such file or directory
Could not resolve CoreCLR path. For more details, enable tracing by setting COREHOST_TRACE environment variable to 1
  • Author
  • Localization

KillzXGaming, posted Sat Apr 16, 2022 5:43 pm (71160)


09williamsad wrote:
KillzXGaming wrote:
I made my own dump tool for those interested which outputs as .dae (only works on .model atm).
Should support vertex colors and multiple UV sets aswell.
Source is included so feel free to use that to make your own tools. Just drag/drop a .model onto the .exe to use it.
Download here: https://drive.google.com/file/d/1YxNQmOPerNHR8trAMLFsQijWilEqJYv-/view?usp=sharing
Tool requires net 5.0 or higher.

The default console and desktop installers for .net 5.0 put hostpolicy.dll in a different place to what the program expects.
"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.16\hostpolicy.dll"
Code:
The default installers for .net 5.0 put hostpolicy.dll in a different place to what the program expects.
ModelDumper.exe TANTIVEIV_X3SCALE_DX11.MODEL
Cannot use file stream for [C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.deps.json]: No such file or directory
A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'C:\Program Files\dotnet\'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because 'C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.runtimeconfig.json' was not found.
  - If this should be a framework-dependent app, add the 'C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.runtimeconfig.json' file and specify the appropriate framework.

Copying the dll to that folder "C:\Program Files\dotnet\" gets past that error but another occurs.
Code:
ModelDumper.exe TANTIVEIV_X3SCALE_DX11.MODEL
Cannot use file stream for [C:\Users\Adam\Downloads\LegoStarwarsSkywalkerSagaModelDumper (1)\ModelDumper.deps.json]: No such file or directory
Could not resolve CoreCLR path. For more details, enable tracing by setting COREHOST_TRACE environment variable to 1


Does this work?

https://drive.google.com/file/d/1YOQnC0_5If32u3ssIDAur31k3qclerT7/view?usp=sharing

And net5.0

https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-5.0.16-windows-x64-installer
  • Author
  • Localization

09williamsad, posted Sat Apr 16, 2022 6:06 pm (71161)


KillzXGaming wrote:

That 2nd one worked.
I already have that runtime installed, repair has no effect on the dll location.
I am guessing that the dll install location changed at some point, and you have the dll from before it changed.
  • Author
  • Localization

Karpati, posted Sun Apr 17, 2022 9:51 am (71173)


I have finished my NTT Engine (LEGO Star Wars: The Skywalker Saga) *.model loader module and I have released the following programs as web updates:

- 3D Object Converter v8.024 (Windows)
- i3DConverter v4.204 (macOS)
- i3DConverter v2.204 (Linux)

How to get the 3D Object Converter v8.024:
Download the 3D Object Converter from http://3doc.i3dconverter.com and install it or download and use the portable version (if you don't have it yet).
After it just use the Help/Check for updates... function to get the v8.024.

How to get the i3DConverter macOS v4.203:
Download the i3DConverter from http://www.i3dconverter.com and install it (if you don't have it yet).
After it just use the Help/Check for updates... function to get the v4.203.

How to get the i3DConverter Linux v2.203:
Download the i3DConverter from http://www.i3dconverter.com and install it (if you don't have it yet).
After it just use the Help/Check for updates... function to get the v2.203.
Guest
This topic is now closed to further replies.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.