EvilEngine/JSP: Difference between revisions

→‎Version 3 (BFBB): Add visible flag and correct z-write and culling flags
m (Seil moved page JSP to EvilEngine/JSP)
(→‎Version 3 (BFBB): Add visible flag and correct z-write and culling flags)
 
(3 intermediate revisions by one other user not shown)
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.
 
===Section header format===
===Format (Visibility/Collision JSP)===
====Section header format====
This is the standard format for RenderWare section headers.
 
Line 25 ⟶ 24:
</source>
 
====Section 1 (BSP Tree)====
This section contains a k-d tree, used for collision checking.
 
Line 31 ⟶ 30:
__rwMark mark; // type = 0xBEEF01
 
unsigned int magic = 'CCOL'; // 'LOCC' on GameCube
unsigned int numBranchNodes;
unsigned int numTriangles;
Line 38 ⟶ 37:
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 ⟶ 61:
float rightValue;
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || u32 || '''leftInfo''' || rowspan="2" |
* (this & 0x3) = NodeType
** 1 = Triangle
** 2 = Branch
* (this & 0xC) = Axis
** 0 = X
** 4 = Y
** 8 = Z
* (this >> 12) = Index
|-
| 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''' || BFBB:
* 0x1 = Has sibling (There is another triangle after this one in memory. If not set means this is the last triangle in its chain)
* 0x2 = Counter-clockwise (This triangle is in reverse orientation (every other triangle in a tristrip mesh))
* 0x4 = Solid (This triangle has collision enabled)
* 0x8 = Visible (This triangle is visible in the world)
* 0x10 = No stand (Force the player to slide off this triangle instead of stand on it)
* 0x20 = Force receive shadows (Force this triangle to receive shadows in the world)
|-
| 0x05 || u8 || '''platData''' / '''detailed_info_cache_index''' ||
|-
| 0x06 || u16 || '''matIndex''' || Material index into the geometry's material list
|}
 
====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 ⟶ 152:
};
</source>
{| class="wikitable"
! Offset !! Type !! Variable !! Description
|-
| 0x00 || s32 || ''' originalMatIndex''' ||
|-
| 0x04 || s32 || '''nodeFlags''' || Used to toggle various rendering states:
* 0x1 - Visible (unused)
* 0x2 - Disable z-buffer write
* 0x4 - Disable back-face culling
|}
 
----
<code>xJSPNodeInfo::nodeFlags</code> is 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.
 
====SectionVersion 35 (PreTSSM -calculated Vertices, GCN onlyRatProto)====
<source lang=cpp>
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.
__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"
! Size(h) !! Type !! Variable !! Description
|-
| 4h || char[4] || '''idtag''' || "JSP\0"
|-
| 4h || u32 || '''version''' || Always 5
|-
| 4h || u32 || '''jspNodeCount''' || Amount of xJSPNodeInfo entries
|-
| 4h || RpClump* || '''clump''' || Always null
|-
| 4h || xClumpCollBSPTree* || '''colltree''' || Always null
|-
| 4h || xJSPNodeInfo* || '''jspNodeList''' || Always null
|-
| 4h || u32 || '''stripVecCount''' || Always null
|-
| 4h || RwV3d* || '''stripVecList''' || Always null
|-
| 2h || u16 || '''vertDataFlags''' || Always null
|-
| 2h || u16 || '''vertDataStride''' || Always null
|-
| 4h || xJSPNodeTree* || '''nodetree''' || Always null
|-
| 4h || xJSPNodeLight* || '''nodelight''' || Always null
|-
| 8h * jspNodeCount || xJSPNodeInfo[] || '''jspNodeList''' || Array of xJSPNodeInfo entries
|-
| 4h || s32 || '''numBranchNodes''' || Amount of xJSPNodeTreeBranch entries
|-
| 4h || xJSPNodeTreeBranch* || '''branchNodes''' || Always null
|-
| 4h || s32 || '''numLeafNodes''' || Amount of xJSPTreeLeaf entries
|-
| 4h || xJSPNodeTreeLeaf* || '''leafNodes''' || Always null
|-
| 10h * numBranchNodes || xJSPNodeTreeBranch[] || '''branchNodes''' || Array of xJSPNodeTreeBranch entries
|-
| 20h * numLeafNodes || xJSPNodeTreeLeaf[] || '''leafNodes''' || Array of xJSPNodeTreeLeaf entries
|-
| 4h || u32 || '''stripVecCount''' || Amount of array entries
|-
| Ch * stripVecCount || 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 97 ⟶ 330:
{
float x, y, z;
};
</source>
 
==Section 4 (Extra Info)==
Not present in BFBB.
 
<source lang=cpp>
__rwMark mark; // type = 0xBEEF04
 
char idtag[4] = "JSPX";
xBox bounds;
</source>
 
<source lang=cpp>
struct xBox
{
xVec3 upper;
xVec3 lower;
};
</source>