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.

Scholarship Edition msh

Featured Replies

  • Localization

The file size is quite small, so I reckon its format can be identified quickly. I haven’t got home yet though; I’ll examine the structure thoroughly once I’m back. Fingers someone can work out the parsing in the meantime 😏

bli.7z

pt12.png

Solved by KuWuniss6

  • Author
  • Localization
  • Solution

Okay, it looks far simpler than I’d anticipated; I overcomplicated things. I can search for standard face indices just like usual, and vertex coordinates are located nearby as well.

nd2.thumb.png.df415014940a9cffcdf05f8179e58c5b.png

put34.thumb.png.9b4fcd325fce0749e1456ea977682bad.png

After examining multiple samples, I’ve reached a final conclusion: the TEX container holds multiple textures, predominantly DDS files with a smaller portion being other common formats such as TGA.ndtex.png.c75843a480786aa47033dedd87079e0c.png

  • Supporter

Here's struct of *.tex.

//------------------------------------------------
//--- 010 Editor v14.0 Binary Template
//
//      File: 
//   Authors: 
//   Version: 
//   Purpose: 
//  Category: 
// File Mask: 
//  ID Bytes: 
//   History: 
//------------------------------------------------
LittleEndian();OutputPaneClear();

local uint32 i;

uint32 Version;
uint32 ResourceCount;
struct
{
    uint32 ResourceType;
    uint32 ResourceOffset;
}Resource[ResourceCount];

struct
{
    for (i=0; i < ResourceCount; i++)
    {
        FSeek(Resource[i].ResourceOffset);
        if (Resource[i].ResourceType == 110)
        {
            struct
            {
                uint32 DescSize;
                char DescText[DescSize];
            }Description;
        }
        else if (Resource[i].ResourceType == 5 | Resource[i].ResourceType == 9)
        {
            struct
            {
                enum <uint32>
                {
                    PF_DXT1 = 5,
                    PF_PVRTCI_4BPP = 9,
                }PixelFormat;
                uint32 TextureWidth;
                uint32 TextureHeight;
                uint32 MipMaps;
                uint32 RawDataSize;
                byte RawData[RawDataSize];
            }Texture;
        }
    }
}Resources;

There may be more pixel formats, but can't tell from one sample.

 

And here is guess-work for mesh.

//------------------------------------------------
//--- 010 Editor v14.0 Binary Template
//
//      File: 
//   Authors: 
//   Version: 
//   Purpose: 
//  Category: 
// File Mask: 
//  ID Bytes: 
//   History: 
//------------------------------------------------
LittleEndian();OutputPaneClear();

local uint32 i;

uint32 Version;
uint32 Unknown_0;
uint32 Unknown_1;
uint32 MaterialOffset;
uint32 Unknown_2;
uint32 ModelOffset;

FSeek(MaterialOffset);
struct
{
    uint32 MaterialIndex;
    struct
    {
        uint32 StrLen;
        char MaterialName[StrLen];
    }Material[MaterialIndex]<optimize=false>;
}Materials;


struct
{
    uint32 BoneIndex;
    struct
    {
        uint32 StrLen;
        char BoneName[StrLen];
        float Matrix4x3[12];
        uint32 ParentBoneId;
    }Bone[BoneIndex]<optimize=false>;
    //Preserved
}Skeleton;


FSeek(ModelOffset);
struct
{
    uint32 ModelIndex;
    uint32 StrLen;
    char ModelName[StrLen];
    byte Align[StrLen];
    uint32 ElementCount;
    uint32 IndexCount;
    uint16 IndexBuffer[IndexCount];
    
    byte Unknown_0[74];
    
    struct
    {
        float VPosX,VPosY,VPosZ;
        byte Unknown_0[12];
        byte VNPosX,VNPosY,VNPosZ,Null;
        byte Unknown_1[4];
        int16 UVPosX,UVPosY;
    }ElementBuffer[ElementCount]<optimize=false>;
    
    uint32 ShapeIndex;
    struct
    {
        uint32 IndexOffset;
        uint32 IndexCount;
        uint32 MaterialId;
        uint32 Null;
    }ShapeInfo[ShapeIndex]<optimize=false>;
    
    FSeek(startof(IndexBuffer));
    struct
    {
        for (i=0; i < ShapeIndex; i++)
        {
            FSeek(startof(IndexBuffer) + ShapeInfo[i].IndexOffset * 2);
            struct
            {
                uint16 F1,F2,F3; 
            }Indices[ShapeInfo[i].IndexCount / 3]<optimize=false>;
        }
    }Shapes;
}Model;

Small note. UV's are divided by 2048.0. But normals doesn't work well when i divide them with 255.0. Maybe these are not normals at all.

Edited by h3x3r

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.