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.
Zero Tolerance for Disrespect

(MeshFinder) Bonemap data and export option for models from Giana Sisters: Twisted Dreams

Featured Replies

Hello everyone.

So very few people here from XenTax knew me for trying to rip models from Giana Sisters: Twisted Dreams. Well, I have the good news that I eventually figured out the model and skeleton format! I mainly use MeshFinder made by Durik256. It's a bit tricky as I had to do A LOT of fail & retry but the results were worth it.

Long story short, the vertices data are 32 bytes long in half-float; 8 bytes for the position, 8 bytes for the normals and 8 bytes for the two UV maps (UV 1 is the first half and UV 2 is the second half). I still have no idea what the other 8 bytes are. Bone indices and weight are 4 bytes each, each bytes represent a bone which means a vertex can be affected by 4 weight groups. The skeleton is abit tricky for me to explain, so I hope the picture below can explain itself.

giana_cute model info meshfinder.png

giana_cute model herself.png

With everything in place, the model can be exported with everything it needs. However, I've come to an issue with the tool regarding the bonemap. I always export it to the tool's format (.durik256) and use the Noesis script to convert as the tool doesn't let me use the other export options. but when doing so in Noesis, It always says "weight contains an out of range bone index", even though I double checked multiple times.

giana_cute model noesis error.png

I've come to the conclusion I might be doing something wrong with the bonemap. Or it could be the tool that can't understand that FF means 00 in the bone indices, and not data for a non-existing 256th bone.

Here are the files below. The model can be found in giana_cute mesh.bin.nx and hold vertices, weight and face data. It used to be combined with all the models of the game, so I isolated it for convenience. rendershape.bin.nx holds the skeleton data and can be found at the address 1D0D0. I also added the template so you wouldn't have to insert everything on your own.

If any here who is familiar with MeshFinder and can help would be appreciated, altough I highly doubt only Durik himself can help as he made the tool and Noesis script.

giana_cute model data.zip

Solved by Durik256

  • Supporter

I can't see any element buffer info. It must be in another file. I mean element count, index count and offsets.

Well maybe in rendershape.bin.

Edited by h3x3r

  • Author
22 minutes ago, h3x3r said:

I can't see any element buffer info. It must be in another file. I mean element count, index count and offsets.

Well maybe in rendershape.bin.

Element buffer? Honestly, that's the first time I read about it. I have other files that might help, but I'm not sure if that could help as I'm not familiar with the element buffer at all you mentioned.

Here:

the rest.zip

  • Supporter

So the info is in rendershape.bin as I suspected.

I got first glimps... I'll take a look once i got some time. After work.

image.png

  • Author

Okay, I managed to get the model with her weight groups intact but by manualy edit the bone indices from 255 to 0. Even if it's a way to rip the models, there's no way I'm doing this again how much this is time consuming. If only the BoneMap area in MeshFinder was doing something and makes things easy, or a script that can automatically edit the bone indices from 255 to 0 for any models of the game.

image.pngimage.png

  • Supporter
  • Solution
On 10/7/2026 at 4:48 PM, GianaSistersFan64 said:

Noesis script

try it fmt_nx.py

rendershape.bin.nx contains several different skeletons.

I then analyzed the file structure in greater detail and discovered direct links:

Shape → LOD → Surface → Skeleton

In other words, each model in rendershape.bin.nx explicitly specifies the skeleton it requires.

  • Author
23 minutes ago, Durik256 said:

try it fmt_nx.py

rendershape.bin.nx contains several different skeletons.

I then analyzed the file structure in greater detail and discovered direct links:

Shape → LOD → Surface → Skeleton

In other words, each model in rendershape.bin.nx explicitly specifies the skeleton it requires.

yes. YES!

This is doing exactly what I needed, thank you so much! I tried with another model and it works smoothly. Although for this to work, I have to grab a model inside the rendermesh files and isolate it (the same thing as I did for Cute Giana's model). But it's not much of an issue.

image.png

Finally after 6 years, my dream as came true. Even though the vertex animation/morph isn't still fully covered yet, it's better than nothing or just plain OBJs.

  • Author
3 hours ago, Durik256 said:

try it fmt_nx.py

rendershape.bin.nx contains several different skeletons.

I then analyzed the file structure in greater detail and discovered direct links:

Shape → LOD → Surface → Skeleton

In other words, each model in rendershape.bin.nx explicitly specifies the skeleton it requires.

I looked at the script and I noticed it says:

# The isolated raw mesh has lost its original owning ShapeEntry ID.
# Aliases may therefore remain (in this sample: giana and maria), but they
# describe identical geometry and point to the same SkeletonEntry. We only
# accept the direct metadata path if all remaining aliases agree.

So I'm putting the original rendermesh_1.bin.nx file, but I have to warn the file is almost 100 MB. I excluded rendermesh_0.bin.nx as it only contains models that don't have rigging stuff (and the zip file would be way too big).

I'm sharing the file through Drive because it seems too big to be attached here: https://drive.google.com/file/d/13g9QMkHWc7-K65Lk7dHcl9mthkfS3E7f/view?usp=sharing

Also, There are two games that use the same engine therefore use the same format, that being Giana Sisters: Dream Runners and Bubsy: The Woolies Strike Back. But their keys differences are the files have 32-bit integers with the win32 extension, while the nx files have 64-bit integers for certain offset fields. Dream Runners also have every models of the game assembled in two files, while Bubsy only have the models that the level needs (which means the file is at the same directory as rendershape).

bubsy_win32.zip

But thanks again for the script!

EDIT: While checking other models in rendermesh_1, I found some of them having a different model format. Here's an example at adresse FEE8B4

image.png

EDIT2: Okay, turns out the vertices data are 36 bytes long instead of 32 with a shift of 4 bytes before the normals data. I edited the script a bit and it works! Also I was 8 bytes too far from the previous screenshot.

image.png

EDIT3: Had to do the same thing for the piranha model, as it uses only one UV map, which makes the vertices data 28 bytes long.

image.png

Edited by GianaSistersFan64

Create an account or sign in to comment

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.