This shows you the differences between two versions of the page.
| — |
extreme_g:gfx_collision_commands [2020/06/14 04:50] (current) shygoo created |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Extreme-G GFX/Collision Commands ===== | ||
| + | Extreme-G uses high level commands to define level models' GFX and collision data. | ||
| + | |||
| + | ---- | ||
| + | ==== 00 end_submesh ==== | ||
| + | ''00'' | ||
| + | |||
| + | Presumably pushes the address of the current display list to some array and ends the current display list. | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSPEndDisplayList() | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 01 vertex_list ==== | ||
| + | ''01 [NN] [XX XX] [YY YY] [ZZ ZZ] [TI] [RR] [GG] [BB] [...]'' | ||
| + | |||
| + | Defines a list of vertices to be used by ''tri1'' and ''tri2'' commands. | ||
| + | |||
| + | ''TI'' indexes the level's texture coordinate table to obtain the vertices' S and T texture coordinate values. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''NN'' | Number of vertices | | ||
| + | | ''XXXX'' | X coordinate (signed) | | ||
| + | | ''YYYY'' | Y coordinate (signed) | | ||
| + | | ''ZZZZ'' | Z coordinate (signed) | | ||
| + | | ''TI'' | Texture coordinate index | | ||
| + | | ''RR'' | Vertex color red channel | | ||
| + | | ''GG'' | Vertex color green channel | | ||
| + | | ''BB'' | Vertex color blue channel | | ||
| + | | ... | ... more vertices | | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSPVertex(..., NN) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 02 level_texture ==== | ||
| + | ''02 [II]'' | ||
| + | |||
| + | Loads a CI8 or CI4 texture into TMEM. | ||
| + | ''II'' indexes the level's texture meta table to obtain the texture's CI/TLUT addresses, format, and dimensions. | ||
| + | Texture data is obtained from the level's texture file. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''II'' | Level texture index | | ||
| + | |||
| + | Emits (if the current palette needs to be updated): | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPTileSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsSPLoadSync() | ||
| + | gsDPLoadTLUT(...) | ||
| + | gsSPPipeSync() | ||
| + | </code> | ||
| + | |||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPSetTile(...) | ||
| + | gsDPLoadSync() | ||
| + | gsDPLoadBlock(...) | ||
| + | gsDPPipeSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsDPSetTileSize(...) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 03 set_primcolor ==== | ||
| + | ''03 [RR] [GG] [BB]'' | ||
| + | |||
| + | Sets the RDP's primcolor register. | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPSetPrimColor(0, 0, 0, RR, GG, BB) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 04 tri1 ==== | ||
| + | ''04 [-aaaaabb] [bbbccccc]'' (bitwise) | ||
| + | |||
| + | Renders a single triangle. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''aaaaa'' | RSP vertex index 0 | | ||
| + | | ''bbbbb'' | RSP vertex index 1 | | ||
| + | | ''ccccc'' | RSP vertex index 2 | | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSP1Triangle(aaaaa, bbbbb, ccccc, 0) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 05 tri2 ==== | ||
| + | ''05 [-aaaaabb] [bbbccccc] [-dddddee] [eeefffff]'' (bitwise) | ||
| + | |||
| + | Renders two triangles. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''aaaaa'' | RSP vertex index 0 | | ||
| + | | ''bbbbb'' | RSP vertex index 1 | | ||
| + | | ''ccccc'' | RSP vertex index 2 | | ||
| + | | ''ddddd'' | RSP vertex index 3 | | ||
| + | | ''eeeee'' | RSP vertex index 4 | | ||
| + | | ''fffff'' | RSP vertex index 5 | | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSP2Triangles(aaaaa, bbbbb, ccccc, ddddd, eeeee, fffff, 0) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 06 setcombine0 ==== | ||
| + | ''06'' | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPPipeSync() | ||
| + | gsDPSetCombineMode(G_CC_MODULATERGBDECALA, G_CC_PASS2) // FC127FFF FFFFF238 | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 07 setcombine1 ==== | ||
| + | ''07'' | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPPipeSync() | ||
| + | gsDPSetCombineMode(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, 1, G_CC_PASS2) // FC327FFF FFFFFC38 | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 08 collision_vertex_list ==== | ||
| + | ''08 [NN] [XX XX] [YY YY] [ZZ ZZ] [...]'' | ||
| + | |||
| + | Defines a list of collision vertices. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''NN'' | Number of vertices | | ||
| + | | ''XX'' | X position | | ||
| + | | ''YY'' | Y position | | ||
| + | | ''ZZ'' | Z position | | ||
| + | | ... | ... More vertices | | ||
| + | |||
| + | ---- | ||
| + | ==== 09 update_vertex_texcoord ==== | ||
| + | ''09 [VI] [TI]'' | ||
| + | |||
| + | Updates a single vertex's S and T texture coordinate values in the RSP's vertex buffer. | ||
| + | |||
| + | ''TI'' indexes the level's texture coordinate table. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''VI'' | RSP vertex index | | ||
| + | | ''TI'' | Texture coordinate index | | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSPModifyVertex(VI, G_MWO_POINT_ST, ((table[TI].s / 2) << 16) | (table[TI].t / 2)) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 0A unknown_dl ==== | ||
| + | ''0A'' | ||
| + | |||
| + | Jump to some display list, unknown purpose. The address of the display list is obtained from 801712E8. | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsSPDisplayList(...) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 0B setcombine2 ==== | ||
| + | ''0B'' | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPSetCombineMode(PRIMITIVE, 0, SHADE, 0, 0, 0, 0, 1, G_CC_PASS2) // FC327FFF FFFFFC38 | ||
| + | </code> | ||
| + | |||
| + | This command seems the same as command 07 but without the pipesync. | ||
| + | |||
| + | ---- | ||
| + | ==== 0C global_texture ==== | ||
| + | ''0C [II]'' | ||
| + | |||
| + | Loads a CI8 texture into TMEM. ''II'' indexes the table in the "global texture" bank to obtain the texture's CI/TLUT addresses, dimensions, and data. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''II''| Global texture index | | ||
| + | |||
| + | Emits (if the current palette needs to be updated): | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPTileSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsSPLoadSync() | ||
| + | gsDPLoadTLUT(...) | ||
| + | gsSPPipeSync() | ||
| + | </code> | ||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPSetTile(...) | ||
| + | gsDPLoadSync() | ||
| + | gsDPLoadBlock(...) | ||
| + | gsDPPipeSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsDPSetTileSize(...) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 0D common_texture ==== | ||
| + | ''0D [II]'' | ||
| + | |||
| + | Loads a CI8 texture into TMEM. ''II'' indexes the table in the level's "common texture" bank to obtain the texture's CI/TLUT addresses, dimensions, and data. | ||
| + | |||
| + | ^Parameter^Description^ | ||
| + | | ''II'' | Common texture index | | ||
| + | |||
| + | Emits (if the current palette needs to be updated): | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPTileSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsSPLoadSync() | ||
| + | gsDPLoadTLUT(...) | ||
| + | gsSPPipeSync() | ||
| + | </code> | ||
| + | |||
| + | |||
| + | Emits: | ||
| + | <code> | ||
| + | gsDPSetTextureImage(...) | ||
| + | gsDPSetTile(...) | ||
| + | gsDPLoadSync() | ||
| + | gsDPLoadBlock(...) | ||
| + | gsDPPipeSync() | ||
| + | gsDPSetTile(...) | ||
| + | gsDPSetTileSize(...) | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | ==== 0E nop0 ==== | ||
| + | (no operation) | ||
| + | |||
| + | ---- | ||
| + | ==== 0F nop1 ==== | ||
| + | (no operation) | ||
| + | |||
| + | ---- | ||
| + | ===== Assembly Information ===== | ||
| + | |||
| + | * The function responsible for loading a level and parsing these commands is at 8004F954. | ||
| + | * The jump table for the parser's switch statement is at 8004BA98. | ||
| + | |||
| + | Assembly location of each command: | ||
| + | |||
| + | ^ Command ^ ASM Location ^ | ||
| + | | 00: end_submesh | 800518FC | | ||
| + | | 01: vertex_list | 8004FF70 | | ||
| + | | 02: level_texture | 800500B8 | | ||
| + | | 03: set_primcolor | 80050AE8 | | ||
| + | | 04: tri1 | 80050B34 | | ||
| + | | 05: tri2 | 80050B84 | | ||
| + | | 06: setcombine0 | 80050C18 | | ||
| + | | 07: setcombine1 | 80050C40 | | ||
| + | | 08: collision_vertex_list | 80050C6C | | ||
| + | | 09: update_vertex_texcoord | 80050D44 | | ||
| + | | 0A: unknown_dl | 80050DBC | | ||
| + | | 0B: setcombine2 | 80050DDC | | ||
| + | | 0C: global_texture | 80050E20 | | ||
| + | | 0D: common_texture | 8005136C | | ||
| + | | 0E: nop0 | 8004FF3C | | ||
| + | | 0F: nop1 | 8004FF3C | | ||