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

[ANDROID] Transformers Robots in Disguise .DAT tutorial for how to extract it in ModelResearcher

Featured Replies

awhile back i asked for help on the texture format for the rid game

@DKDave quickly figured it out so credits to him and did figure out the format for the model which was part of the examples zip

he posted how and i made it into a template for modelresearcher

however

the template only worked on ironhide as other models had issues when i looked into how the template worked for ironhide i found out something

the model format has no header and is unique in a way that a template wouldnt work

and since i dont how to write a noesis script i am going to show you how to import the model in modelresearcher

the first 4 bytes are important very important

for the vertices

get the first 4 bytes which is in case for our example beeside is 41 0c 00 00 so set the offset by 0x4

image.png

and make sure the end block ends before the 2nd instance of the magic 4 bytes

image.png

and when you hit render you get the vertices

image.png

for the faces

in faces set type to short

image.png

start the offset at 00 00 02 00 it is usually the starting face offset and before it is 4 bytes which end with a single 00

image.png

and end the end block before the final 4 bytes which are usually 00 00 00 00

image.png

image.png

for the uvs get the byte that is after the 3rd instance of the magic 4 bytes and use the same count as the vertices which the end block ends at the start of the 00 00 00 00 that is before the 4th instance of the magic 4 bytes

image.png

image.png

optional but for normals from @DKDave 's research

same count as the vertices and uvs the offset is of course the byte after the 2nd instance of the magic 4 bytes

image.png

remember the uvs are upside down when exported

a way that i fixed it is insert a plane into the model and using the constrain image pixels fit S and Y and -1 and delete the plane

without custom normals

image.png

with custom normals

image.png

image.png

Edited by wedjklwkerfjgfkewgfh43ertg

  • Localization
2 hours ago, wedjklwkerfjgfkewgfh43ertg said:

I did find it already, but it does not work on my .bin files:

signature of 4 bytes at offset 0x00000000 doesn't match the one expected by the script

I have a com-hasbro-tf360appstore-1009000-24499790-acfe611344909db62f9976c9660c6f58.apk file (about 45 MB).

.apk\assets\database_bin\database\character\characters.bin

  • Author
9 minutes ago, Karpati said:

I did find it already, but it does not work on my .bin files:

signature of 4 bytes at offset 0x00000000 doesn't match the one expected by the script

I have a com-hasbro-tf360appstore-1009000-24499790-acfe611344909db62f9976c9660c6f58.apk file (about 45 MB).

.apk\assets\database_bin\database\character\characters.bin

dont use the characters.bin from the apk instead use the bin files from the obb

which is in main.1009000.com.hasbro.tf360appstore.obb\hydra\characters\

  • Localization
56 minutes ago, wedjklwkerfjgfkewgfh43ertg said:

dont use the characters.bin from the apk instead use the bin files from the obb

which is in main.1009000.com.hasbro.tf360appstore.obb\hydra\characters\

Thank you for your information. I did find the Transformers_+RobotsInDisguise_1.9.0_APKPure.xapk file on the Net and I have .dat files from the .obb / .bin files.

Edited by Karpati

  • Supporter

Well there's no need for header. Everything is here. The first uint32 is vertex count. After that is buffer which can be sometimes aligned on the end.

//------------------------------------------------
//--- 010 Editor v14.0 Binary Template
//
//      File: 
//   Authors: 
//   Version: 
//   Purpose: 
//  Category: 
// File Mask: 
//  ID Bytes: 
//   History: 
//------------------------------------------------
uint32 VertexCount;
struct
{
    float VPosX,VPosY,VPosZ;
}Vertices[VertexCount];

uint32 NormalCount;
struct
{
    float VNPosX,VNPosY,VNPosZ;
}Normals[NormalCount];

uint32 UVCount;
struct
{
    float UVPosX,UVPosY;
}UV[UVCount];

uint32 Unknown_0;
uint32 BoneIndexCount;
struct
{
    byte BIndX,BIndY,BIndZ,Reserved;
}BoneIndices[BoneIndexCount]<optimize=false>;

uint32 BoneWeightCount;
struct
{
    float BWeightX,BWeightY,BWeightZ,Reserved;
}BoneWeights[BoneWeightCount];

uint32 Unknown_1;
uint32 IndexCount;
struct
{
    uint16 F1,F2,F3;
}Indices[IndexCount / 3];

Send more samples if you want solve it.

image.png

Edited by h3x3r

  • Author

nice!

i wonder if its possible to figure out the skeletal data there is an .ent file that is an animation database of some sorts that has names for the bones

interesting in beeside using the highlight function in modelresearcher besides the 41 0c 00 00 and other bytes there is a whole chunk which starts at the 4th instance of the magic 4 bytes after the 00 00 00 00 at the end of the uv chunk (offset 0x18834) and end at the 4 bytes that presede the face chunk (offset 0x027d53)

i wonder if this is the skeletal data?

image.png

ironhide's case

image.png

here is beeside's mesh if anyone more skilled wants to investigate

00000027.rar

  • Localization
On 10/19/2026 at 5:24 PM, wedjklwkerfjgfkewgfh43ertg said:

awhile back i asked for help on the texture format for the rid game

@DKDave quickly figured it out so credits to him and did figure out the format for the model which was part of the examples zip

you get the vertices

Can you tell us how did you extract the texture files?

(I don't know which file contains the texture files.)

  • Author
8 minutes ago, Karpati said:

Can you tell us how did you extract the texture files?

(I don't know which file contains the texture files.)

i wonder what these 12 bytes contain looking at them they are like this

04 00 00 00 XX XX XX XX XX XX XX 00

the first 4 bytes and the last byte never change

but i tried making a noesis script which is a modified version of the script for the xgm texture for angry birds transformers by Acewell

but not know how code got error on line 12

tex_transformers_rid.py

  • Supporter
1 hour ago, wedjklwkerfjgfkewgfh43ertg said:

there is a whole chunk which starts at the 4th instance of the magic 4 bytes after the 00 00 00 00 at the end of the uv chunk (offset 0x18834) and end at the 4 bytes that presede the face chunk (offset 0x027d53)

i wonder if this is the skeletal data?

Could be. I checked values and they are to low to be vertex colors. So maybe these are bone indexes. But no idea where is skeleton or hpw to apply to the model.

  • Supporter

Yep that's definitely include skeleton data. But still no idea how to bind it to the model.

I will check textures and try to write noesis if it support ETC algo.

Also that align check looks like static based on another model.

Here's struct for textures. Not sure how many pixel formats are there.

uint32 PixelFormat;
uint16 TextureWidth;
uint16 TextureHeight;
uint32 TextureDataSize;
byte TextureData[TextureDataSize];

Well this should work... If you encounter any other pixel format just let me know. I don't have game files so I can't check.

from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Transformers - Robots in Disguise / Android - Texture", ".dat")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    ctx = rapi.rpgCreateContext()
    bs = NoeBitStream(data)
    baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))
    PixelFormat = bs.readUInt()
    TextureWidth = bs.readUShort()
    TextureHeight = bs.readUShort()
    TextureDataSize = bs.readUInt()
    data = bs.read(TextureDataSize)

    if PixelFormat == 4:
        data = rapi.imageDecodeETC(data, TextureWidth, TextureHeight, "RGB")
        texFmt = noesis.NOESISTEX_RGBA32
    else:
        print("Unknown Pixel Format > ", PixelFormat)
    texList.append(NoeTexture(rapi.getInputName(), TextureWidth, TextureHeight, data, texFmt))
    return 1

And here for model.

from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Transformers - Robots in Disguise / Android - Model", ".dat")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadModel(handle, noepyLoadModel)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data)
   if len(data) < 20:
      return 0
   return 1
        
def noepyLoadModel(data, mdlList):
	bs = NoeBitStream(data)
	baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))
	ctx = rapi.rpgCreateContext()
	Underline = "_"
    
	#
	VertexCount = bs.readUInt()
	VertexBuffer = bs.read(VertexCount * 12)
	NormalCount = bs.readUInt()
	NormalBuffer = bs.read(NormalCount * 12)
	UVCount = bs.readUInt()
	UVBuffer = bs.read(UVCount * 8)
	bs.read(4)
	BoneIndexCount = bs.readUInt()
	BoneIndexBuffer = bs.read(BoneIndexCount * 4)
	BoneWeightCount = bs.readUInt()
	BoneWeightBuffer = bs.read(BoneWeightCount * 16)
	Unknown = bs.readUInt()
	IndexCount = bs.readUInt() // 3
	IndexBuffer = bs.read(IndexCount * 6)

    
	rapi.rpgBindPositionBuffer(VertexBuffer, noesis.RPGEODATA_FLOAT, 12)
	rapi.rpgBindNormalBuffer(NormalBuffer, noesis.RPGEODATA_FLOAT, 12)
	rapi.rpgBindUV1Buffer(UVBuffer, noesis.RPGEODATA_FLOAT, 8)
	rapi.rpgBindBoneIndexBuffer(BoneIndexBuffer, noesis.RPGEODATA_BYTE, 4, 3)
	rapi.rpgBindBoneWeightBuffer(BoneWeightBuffer, noesis.RPGEODATA_FLOAT, 4, 3)
	rapi.rpgCommitTriangles(IndexBuffer, noesis.RPGEODATA_USHORT, IndexCount * 3, noesis.RPGEO_TRIANGLE)
	rapi.rpgSetOption(noesis.RPGOPT_TRIWINDBACKWARD, 1)
	mdl = rapi.rpgConstructModel()
	mdlList.append(mdl)
	return 1

Edited by h3x3r

  • Author
44 minutes ago, h3x3r said:

Yep that's definitely include skeleton data. But still no idea how to bind it to the model.

I will check textures and try to write noesis if it support ETC algo.

Also that align check looks like static based on another model.

Here's struct for textures. Not sure how many pixel formats are there.

uint32 PixelFormat;
uint16 TextureWidth;
uint16 TextureHeight;
uint32 TextureDataSize;
byte TextureData[TextureDataSize];

Well this should work... If you encounter any other pixel format just let me know. I don't have game files so I can't check.

from inc_noesis import *
import noesis
import rapi
import os

def registerNoesisTypes():
   handle = noesis.register("Transformers - Robots in Disguise / Android - Texture", ".dat")
   noesis.setHandlerTypeCheck(handle, noepyCheckType)
   noesis.setHandlerLoadRGBA(handle, noepyLoadRGBA)
   noesis.logPopup()
   return 1
        
def noepyCheckType(data):
   bs = NoeBitStream(data)
   if len(data) < 20:
      return 0
   return 1
   
def noepyLoadRGBA(data, texList):
    ctx = rapi.rpgCreateContext()
    bs = NoeBitStream(data)
    baseName = rapi.getExtensionlessName(rapi.getLocalFileName(rapi.getInputName()))
    PixelFormat = bs.readUInt()
    TextureWidth = bs.readUShort()
    TextureHeight = bs.readUShort()
    TextureDataSize = bs.readUInt()
    data = bs.read(TextureDataSize)

    if PixelFormat == 4:
        data = rapi.imageDecodeETC(data, TextureWidth, TextureHeight, "RGB")
        texFmt = noesis.NOESISTEX_RGBA32
    else:
        print("Unknown Pixel Format > ", PixelFormat)
    texList.append(NoeTexture(rapi.getInputName(), TextureWidth, TextureHeight, data, texFmt))
    return 1

works thanks

image.png

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.