EvilEngine/JSP: Difference between revisions

Begin version 5 jsp
m (Seil moved page JSP to EvilEngine/JSP)
(Begin version 5 jsp)
Line 10:
{{AutoAssetInfobox}}
 
JSP is an asset type which defines a 3D model. It's a RenderWare binary stream file. There are two types of JSP: the normal (model) has a format much similar to a DFF and is stored in the BSP layer. They can be opened by RWAnalyze and other tools that work with RenderWare models. [https://gtamods.com/wiki/RenderWare_binary_stream_file GTAModding] has a lot of useful information regarding this format. The other format is used for visibility and collision data and is very different from a normal JSP/DFF, but still follows the layout of a RenderWare binary stream file, with threefour custom sections and is stored in the JSP Info layer.
 
===Format (Visibility/Collision JSP)===
Line 31:
__rwMark mark; // type = 0xBEEF01
 
unsigned int magic = 'CCOL'; // 'LOCC' on GameCube
unsigned int numBranchNodes;
unsigned int numTriangles;
Line 38:
xClumpCollBSPTriangle triangles[numTriangles];
</source>
 
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || u32 || magic || "CCOL" (little-endian, PS2/XBOX)<br>"LOCC" (big-endian, GameCube)
|-
| 0x04 || u32 || '''numBranchNodes''' || Amount of xClumpCollBSPBranchNode entries
|-
| 0x08 || u32 || '''numTriangles''' || Amount of xClumpCollBSPTriangle entries
|-
| 0x0C || xClumpCollBSPBranchNode[] || '''branchNodes''' ||
|-
| 0x0C + (0x10*numBranchNodes) || xClumpCollBSPTriangle[] || '''triangles''' ||
|}
 
 
<source lang=cpp>
Line 47 ⟶ 62:
float rightValue;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || u32 || '''leftInfo''' ||
|-
| 0x04 || u32 || '''rightInfo''' ||
|-
| 0x08 || f32 || '''leftValue''' ||
|-
| 0x0C || f32 || '''rightValue''' ||
|}
 
 
<source lang=cpp>
struct xClumpCollBSPTriangle
{
unsigned short atomIndex; // atomic index in all JSPs combined
unsigned short meshVertIndex; // vertex index in atomic's mesh
unsigned char flags;
unsigned char platData; // BFBB
unsigned char detailed_info_cache_index // TSSM-RatProto
unsigned short matIndex;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || u16 || '''atomIndex''' || Atomic index in all JSPs combined
|-
| 0x02 || u16 || '''meshVertIndex''' || Vertex index in atomic's mesh
|-
| 0x04 || u8 || '''flags''' ||
|-
| 0x05 || u8 || '''platData''' / '''detailed_info_cache_index''' ||
|-
| 0x06 || u16 || '''matIndex'''
|}
 
 
====Section 2 (JSP Info)====
This section contains rendering info for all of the RW Atomics ("nodes") in the other JSPs.
 
=====Version 3 (BFBB)=====
<source lang=cpp>
__rwMark mark; // type = 0xBEEF02
 
char idtag[4] = "JSP\0";
unsigned int version; // usually 3
unsigned int jspNodeCount;
RpClump* clump;
void* unused[3]; // always null (0), used interally as C++ pointers at runtime
xClumpCollBSPTree* colltree;
xJSPNodeInfo* jspNodeList;
 
xJSPNodeInfo jspNodeList[jspNodeCount];
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || char[4] || '''idtag''' || "JSP\0"
|-
| 0x04 || u32 || '''version ''' || Always 3 in BFBB
|-
| 0x08 || u32 || '''jspNodeCount''' || Amount of xJSPNodeInfo entries
|-
| 0x0C || u32*[3] || - || Always null (0), used internally as C++ pointers at runtime
|-
| 0x18 || xJSPNodeInfo[] || '''jspNodeList''' ||
|}
 
 
<source lang=cpp>
Line 79 ⟶ 140:
};
</source>
{| class="wikitable"
 
! Offset !! Type !! Variable !! Description
<code>xJSPNodeInfo::nodeFlags</code> is used to toggle various rendering states:
|-
| 0x00 || s32 || ''' originalMatIndex''' ||
|-
| 0x04 || s32 || '''nodeFlags''' || Used to toggle various rendering states:
* 0x2 - Toggle Z-Buffer write on/off. Starting state is on.
* 0x4 - Toggle Cull Mode between Front/Back face. Starting state is Back.
|}
 
 
====Section 3 (Pre-calculated Vertices, GCN only)====
=====Version 5 (TSSM - RatProto)=====
This section contains a list of vertices extracted from every mesh in every JSP's atomic combined. This is used for collision checking on GameCube only.
<source lang=cpp>
__rwMark mark; // type = 0xBEEF02
 
char idtag[4];
unsigned int version;
unsigned int jspNodeCount;
RpClump* clump;
xClumpCollBSPTree* colltree;
xJSPNodeInfo* jspNodeList;
unsigned int stripVecCount;
RwV3d* stripVecList;
unsigned short vertDataFlags;
unsigned short vertDataStride;
xJSPNodeTree* nodetree;
xJSPNodeLight* nodelight;
 
xJSPNodeInfo jspNodeList[jspNodeCount];
 
int numBranchNodes;
xJSPNodeTreeBranch* branchNodes;
int numLeafNodes;
xJSPNodeTreeLeaf* leafNodes;
 
xJSPNodeTreeBranch branchNodes[numBranchNodes];
xJSPNodeTreeLeaf leafNodes[numLeafNodes];
 
//This is the same as Section 3 in BFBB
unsigned int stripVecCount;
RwV3d stripVecList[vertCount];
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || char[4] || '''idtag''' || "JSP\0"
|-
| 0x04 || u32 || '''version''' || Always 5
|-
| 0x08 || u32 || '''jspNodeCount''' || Amount of xJSPNodeInfo entries
|-
| 0x0C || RpClump* || '''clump''' || Always null
|-
| 0x10 || xClumpCollBSPTree* || '''colltree''' || Always null
|-
| 0x14 || xJSPNodeInfo* || '''jspNodeList''' || Always null
|-
| 0x18 || u32 || '''stripVecCount''' || Always null
|-
| 0x1C || RwV3d* || '''stripVecList''' || Always null
|-
| 0x20 || u16 || '''vertDataFlags''' || Always null
|-
| 0x22 || u16 || '''vertDataStride''' || Always null
|-
| 0x24 || xJSPNodeTree* || '''nodetree''' || Always null
|-
| 0x28 || xJSPNodeLight* || '''nodelight''' || Always null
|-
| 0x2C || xJSPNodeInfo[] || '''jspNodeList''' || Array of xJSPNodeInfo entries
|-
| || s32 || '''numBranchNodes''' || Amount of xJSPNodeTreeBranch entries
|-
| || xJSPNodeTreeBranch* || '''branchNodes''' || Always null
|-
| || s32 || '''numLeafNodes''' || Amount of xJSPTreeLeaf entries
|-
| || xJSPNodeTreeLeaf* || '''leafNodes''' || Always null
|-
| || xJSPNodeTreeBranch[] || '''branchNodes''' || Array of xJSPNodeTreeBranch entries
|-
| || xJSPNodeTreeLeaf[] || '''leafNodes''' || Array of xJSPNodeTreeLeaf entries
|-
| || u32 || '''stripVecCount''' || Amount of array entries
|-
| || RwV3d[] || '''stripVecList''' || Vector3 array of pre-calculated vertices
|}
 
 
<source lang=cpp>
struct xJSPNodeInfo
{
int originalMatIndex;
unsigned short nodeFlags;
signed short sortOrder;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || s32 || '''originalMatIndex''' ||
|-
| 0x04 || u16 || '''nodeFlags''' ||
|-
| 0x06 || s16 || '''sortOrder''' ||
|}
 
<source lang=cpp>
struct xJSPNodeTreeBranch
{
unsigned short leftNode;
unsigned short rightNode;
unsigned char leftType;
unsigned char rightType;
unsigned short coord;
float leftValue;
float rightValue;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || u16 || '''leftNode''' ||
|-
| 0x02 || u16 || '''rightNode''' ||
|-
| 0x04 || u8 || '''leftType''' ||
|-
| 0x05 || u8 || '''rightType''' ||
|-
| 0x06 || u16 || '''coord''' ||
|-
| 0x08 || f32 || '''leftValue''' ||
|-
| 0x0C || f32 || '''rightValue''' ||
|}
<source lang=cpp>
struct xJSPNodeTreeLeaf
{
int nodeIndex;
int leafCount;
RwBBox box;
};
 
struct RwBBox
{
RwV3d sup;
RwV3d inf;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || s32 || '''nodeIndex''' ||
|-
| 0x04 || s32 || '''leafCount''' ||
|-
| 0x08 || RwBBox || '''box''' ||
|}
 
 
====Section 3 (Pre-calculated Vertices, BFBB GCN only)====
This section contains a list of vertices extracted from every mesh in every JSP's atomic combined. This is used for collision checking on BFBB GameCube only.
<source lang=cpp>
__rwMark mark; // type = 0xBEEF03
Line 99 ⟶ 316:
};
</source>
 
 
====Section 4 (Extra Info)====
Not present in BFBB.
 
<source lang=cpp>
__rwMark mark; // type = 0xBEEF04
 
char idtag[4] = "JSP\0";
xBox bounds;
</source>
 
<source lang=cpp>
struct xBox
{
xVec3 upper;
xVec3 lower;
};
</source>
 
 
 
==Jason Hoerner's information on the custom JSP==
2,079

edits