Asura Engine RSCF (Model)

From XentaxWiki
Jump to: navigation, search

Format Specifications

RSCF - Model

uint32 Chunk Signature ('RSCF')
uint32 Chunk Length // from start of Header
uint32 Version (1 or 2, 3? , 4)
uint32 Subversion (0)
uint32 Resource Type (0)
uint32 Resource Type2 (0xF)
uint32 Resource Data Length
C_str_padded Model_name

if (Version == 1 or Version == 2){
  struct model_header {
    uint32 model_part_info_count
    uint32 total_amount_vertexes
    uint32 total_amount_indeces
    uint32 unk
    uint32 count_unk // some uint32 array at the end of file
    bool vertex_layout; // 0 - TRIANGLESTRIP 1 - TRIANGLE LIST
  } // packed to 1 bytes (sizeof(model_header) => 21)
}
if (Version == 4) {
  struct model_header {
    uint32 model_part_info_count
    uint32 total_amount_vertexes
    uint32 total_amount_indeces
    uint32 unk
    uint32 count_unk // some uint32 array at the end of file
  } 
}


model_header hdr

struct model_part_info {
    uint32 mat_hash // hash of materials found in MARE chunk
    uint32 unk
    uint32 points_count
    uint32 some_flags // 0 bit set is (meat part?) others is body part identification ? 
    uint32 unk2
    uint32 unk3
} 

model_part_info mpi[model_part_info_count] // array of model parts

struct model_vtx // this is only for Version == 1
{
	float[3] Pos // x,y,z
	uint8 BlendIndices[4] // bone ids
	snorm16 BlendWeight[4] // bone weights
	half Tangent[4] 
	half Binormal[4]
	half Normal[4]
	half TexCoord1[4] // x,y = u,v coords
	float TextCoord2
};

struct model_vtx // this is only for Version == 2 
{
	float[4] Pos // x,y,z,0
	uint8 BlendIndices[4] // bone ids
	snorm16 BlendWeight[4] // bone weights
	half Tangent[4] 
	half Binormal[4]
	half Normal[4]
	half TexCoord1[4] // x,y = u,v coords
	float TextCoord2
};

// about vertex layout of Version 4 see notes

model_vtx vrtx[total_amount_vertexes] // vertices

uint16 indeces[total_amount_indeces] // indeces

uint32 unk_arr[count_unk] //unknown

HSKN - Skeleton

uint32 Chunk Signature ('HSKN')
uint32 Chunk Length // from start of Header
uint32 Version (9 or 10) 
uint32 Subversion (different)
uint32 unk_amount
uint32 num_bones
C_str_padded Model_name

if (unk_amount && !(Subversion & 0x40))
{
	72 bytes * unk_amount // Idk
}

uint32 bone_parent[num_bones] // 0 is root bone

struct skeleton_point
{
	float rel_pos[3]
	float rel_rot[4]
}

skeleton_point pts[num_bones]

if (Version >= 10)
{
	uint8 unk
}

if (Subversion & 1)
{
	C_str_padded bone_name
	if (Version >= 10) uint8 unk
	uint32 val
        if (val != 0)
        {
               uint32 type // something like collision model
               if (type >= 3)
               {
                      uint32 amount_pts
                      uint32 amount2
                      uint32 unk_val1
                      uint32 unk_val2
                      if (type >= 9) uint32 unk_val3
                      uint16 w1
                      uint16 w2
                      if (type >= 9) uint32 unk_val4
                      float bbox[6] // x1,x2,y1,y2,z1,z2 format
                      float bbox_radius
                      float pts[3 * amount_pts]
                      uint16 indeces[4 * amount2] // some indeces ?
                      if(unk_val1) uint16 unk_val1_arr[amount2]
                      if(unk_val2) uint16 unk_val2_arr[amount2] // some sequence
                      if(unk_val3) uint32 unk_val3_arr[amount2] // some hashes
                      if(type >= 8) {
                             uint32 unk
                             uint32 val
                             if(val) uint32 unk_arr[amount2]
                      }
               }
        }

}

if (Version >= 5 && (Subversion & 2))
{
       float bbox[6] // x1,x2,y1,y2,z1,z2 format
}

if (Version >= 6 && (Subversion & 4))
{
	uint32 unk_dw
	collision_structure // see '// something like collision model' above 
}

if (Version >= 7) uint32 some_other_bone_ids[num_bones] // unknown
if (Version >= 8 && (Subversion & 0x10)) 28 bytes * unk_amount // idk
if (Version >= 9 && (Subversion & 0x20)) uint32 unknown_arr[unk_amount] // idk

Notes

half type is 16 bit float point IEEE-754

snorm16 type is 16 bit single point float value between -1.0 and 1.0

   float val = ((float) snorm16 /32767.0f)

C_str_padded type is C string with padding to a multiple of 4 bytes.

Skeleton points all contains relative offset and rotation to parent point. 0 is root point.

For Version 4 RSCF model format, some games uses diffent vertex layouts. There some of them

Import Scripts

Supported Programs

Related Games

  • Alien vs Predator (2010)
  • Rogue Warrior
  • Shellshock 2: Blood Trails
  • Sniper Elite Nazi Zombie Army
  • Sniper Elite Nazi Zombie Army 2
  • Sniper Elite 3
  • Sniper Elite V2 Remastered
  • Sniper Elite 4