[enhancement] Collision Viewer (#59)

* Update render_courses.c

* Update render_courses.c

* Update ImguiUI.cpp

* Create collision_viewer.c

* Update render_courses.c

* Update render_courses.c

* Create collision_viewer.h

* Update collision_viewer.c

* Update render_courses.c

* Update render_courses.c
This commit is contained in:
MegaMech
2024-09-10 16:27:31 -06:00
committed by GitHub
parent b36b9e3180
commit ed85166756
4 changed files with 313 additions and 3 deletions
+288
View File
@@ -0,0 +1,288 @@
#include <libultraship.h>
#include "mk64.h"
//! @todo decide to use colours or textures and fix displaylists because they are buggy
void render_collision(void) {
Mat4 matrix;
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF);
gSPSetGeometryMode(gDisplayListHead++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH);
gSPClearGeometryMode(gDisplayListHead++, G_CULL_BACK);
gDPPipeSync(gDisplayListHead++);
gDPSetOtherMode(gDisplayListHead++, G_AD_NOTPATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE | G_TD_CLAMP | G_TP_PERSP | G_CYC_1CYCLE | G_PM_NPRIMITIVE, G_AC_NONE | G_ZS_PIXEL | G_RM_AA_ZB_OPA_SURF | G_RM_AA_ZB_OPA_SURF2);
gDPSetCombineMode(gDisplayListHead++, G_CC_SHADE, G_CC_SHADE);
// Set matrix
gSPMatrix(gDisplayListHead++, &gIdentityMtx2, G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH);
for (size_t i = 0; i < gCollisionMeshCount; i++) {
// Load vertices for this tri
switch(gCollisionMesh[i].surfaceType) {
case ASPHALT:
// gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_MIRROR | G_TX_WRAP, 6, G_TX_NOLOD);
// gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x00FC, 0x007C);
// gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTextureRoad1);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
// gDPLoadSync(gDisplayListHead++);
// gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 2047, 128);
// gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
// gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
gCollisionMesh[i].vtx1->v.cn[0] = 50;
gCollisionMesh[i].vtx1->v.cn[1] = 50;
gCollisionMesh[i].vtx1->v.cn[2] = 50;
gCollisionMesh[i].vtx2->v.cn[0] = 50;
gCollisionMesh[i].vtx2->v.cn[1] = 50;
gCollisionMesh[i].vtx2->v.cn[2] = 50;
gCollisionMesh[i].vtx3->v.cn[0] = 50;
gCollisionMesh[i].vtx3->v.cn[1] = 50;
gCollisionMesh[i].vtx3->v.cn[2] = 50;
break;
case DIRT: // gTexture64619C
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture64AF50);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 255;
// gCollisionMesh[i].vtx1->v.cn[1] = 248;
// gCollisionMesh[i].vtx1->v.cn[2] = 220;
// gCollisionMesh[i].vtx2->v.cn[0] = 255;
// gCollisionMesh[i].vtx2->v.cn[1] = 248;
// gCollisionMesh[i].vtx2->v.cn[2] = 220;
// gCollisionMesh[i].vtx3->v.cn[0] = 255;
// gCollisionMesh[i].vtx3->v.cn[1] = 248;
// gCollisionMesh[i].vtx3->v.cn[2] = 220;
break;
case SAND:
// gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
// gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
// gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture67BEE8);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
// gDPLoadSync(gDisplayListHead++);
// gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
// gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
// gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 255;
// gCollisionMesh[i].vtx1->v.cn[1] = 121;
// gCollisionMesh[i].vtx1->v.cn[2] = 25;
// gCollisionMesh[i].vtx2->v.cn[0] = 255;
// gCollisionMesh[i].vtx2->v.cn[1] = 121;
// gCollisionMesh[i].vtx2->v.cn[2] = 25;
// gCollisionMesh[i].vtx3->v.cn[0] = 255;
// gCollisionMesh[i].vtx3->v.cn[1] = 121;
// gCollisionMesh[i].vtx3->v.cn[2] = 25;
break;
case STONE:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture6528DC);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 128;
// gCollisionMesh[i].vtx1->v.cn[1] = 128;
// gCollisionMesh[i].vtx1->v.cn[2] = 128;
// gCollisionMesh[i].vtx2->v.cn[0] = 128;
// gCollisionMesh[i].vtx2->v.cn[1] = 128;
// gCollisionMesh[i].vtx2->v.cn[2] = 128;
// gCollisionMesh[i].vtx3->v.cn[0] = 128;
// gCollisionMesh[i].vtx3->v.cn[1] = 128;
// gCollisionMesh[i].vtx3->v.cn[2] = 128;
break;
case SNOW:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture677F04);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
break;
case SAND_OFFROAD:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture67B9B0);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
break;
case GRASS: // gTextureGrass1
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTextureGrass1);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 50;
// gCollisionMesh[i].vtx1->v.cn[1] = 180;
// gCollisionMesh[i].vtx1->v.cn[2] = 50;
// gCollisionMesh[i].vtx2->v.cn[0] = 50;
// gCollisionMesh[i].vtx2->v.cn[1] = 180;
// gCollisionMesh[i].vtx2->v.cn[2] = 50;
// gCollisionMesh[i].vtx3->v.cn[0] = 50;
// gCollisionMesh[i].vtx3->v.cn[1] = 180;
// gCollisionMesh[i].vtx3->v.cn[2] = 50;
break;
case ICE:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture643B3C);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
break;
case WET_SAND:
// gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, 6, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
// gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x00FC);
// gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture66DD38);
// gDPTileSync(gDisplayListHead++);
// gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
// gDPLoadSync(gDisplayListHead++);
// gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
// gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
// gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
break;
case SNOW_OFFROAD:
gCollisionMesh[i].vtx1->v.cn[0] = 80;
gCollisionMesh[i].vtx1->v.cn[1] = 80;
gCollisionMesh[i].vtx1->v.cn[2] = 80;
gCollisionMesh[i].vtx2->v.cn[0] = 80;
gCollisionMesh[i].vtx2->v.cn[1] = 80;
gCollisionMesh[i].vtx2->v.cn[2] = 80;
gCollisionMesh[i].vtx3->v.cn[0] = 80;
gCollisionMesh[i].vtx3->v.cn[1] = 80;
gCollisionMesh[i].vtx3->v.cn[2] = 80;
break;
case CLIFF:
break;
case DIRT_OFFROAD:
break;
case TRAIN_TRACK: // gTextureRailroadTrack
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 6, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x00FC, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTextureRailroadTrack);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 2047, 128);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
break;
case CAVE:
break;
case OUT_OF_BOUNDS:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture64313C);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 255;
// gCollisionMesh[i].vtx1->v.cn[1] = 0;
// gCollisionMesh[i].vtx1->v.cn[2] = 0;
// gCollisionMesh[i].vtx2->v.cn[0] = 255;
// gCollisionMesh[i].vtx2->v.cn[1] = 0;
// gCollisionMesh[i].vtx2->v.cn[2] = 0;
// gCollisionMesh[i].vtx3->v.cn[0] = 255;
// gCollisionMesh[i].vtx3->v.cn[1] = 0;
// gCollisionMesh[i].vtx3->v.cn[2] = 0;
break;
case BOOST_RAMP_WOOD:
case BOOST_RAMP_ASPHALT:
case RAMP:
gCollisionMesh[i].vtx1->v.cn[0] = 255;
gCollisionMesh[i].vtx1->v.cn[1] = 255;
gCollisionMesh[i].vtx1->v.cn[2] = 0;
gCollisionMesh[i].vtx2->v.cn[0] = 255;
gCollisionMesh[i].vtx2->v.cn[1] = 255;
gCollisionMesh[i].vtx2->v.cn[2] = 0;
gCollisionMesh[i].vtx3->v.cn[0] = 255;
gCollisionMesh[i].vtx3->v.cn[1] = 255;
gCollisionMesh[i].vtx3->v.cn[2] = 0;
break;
case WOOD_BRIDGE:
case ROPE_BRIDGE:
case BRIDGE:
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, 0x007C, 0x007C);
gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, gTexture676FB0);
gDPTileSync(gDisplayListHead++);
gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync(gDisplayListHead++);
gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 1023, 256);
gDPSetCombineMode(gDisplayListHead++, G_CC_MODULATEIA, G_CC_MODULATEIA);
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_ZB_XLU_INTER, G_RM_NOOP2);
// gCollisionMesh[i].vtx1->v.cn[0] = 0;
// gCollisionMesh[i].vtx1->v.cn[1] = 255;
// gCollisionMesh[i].vtx1->v.cn[2] = 0;
// gCollisionMesh[i].vtx2->v.cn[0] = 0;
// gCollisionMesh[i].vtx2->v.cn[1] = 255;
// gCollisionMesh[i].vtx2->v.cn[2] = 0;
// gCollisionMesh[i].vtx3->v.cn[0] = 0;
// gCollisionMesh[i].vtx3->v.cn[1] = 255;
// gCollisionMesh[i].vtx3->v.cn[2] = 0;
break;
}
gSPVertex(gDisplayListHead++, gCollisionMesh[i].vtx1, 1, 0);
gSPVertex(gDisplayListHead++, gCollisionMesh[i].vtx2, 1, 1);
gSPVertex(gDisplayListHead++, gCollisionMesh[i].vtx3, 1, 2);
// Draw tri
gSP1Triangle(gDisplayListHead++, 0, 1, 2, 0);
gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF);
}
}
+9
View File
@@ -0,0 +1,9 @@
#ifndef COLLISION_VIEWER_H
#define COLLISION_VIEWER_H
#include <libultraship.h>
void render_collision(void);
#endif // COLLISION_VIEWER_H
+7 -1
View File
@@ -494,7 +494,9 @@ void DrawDebugMenu() {
{ .tooltip =
"Enables the Gfx Debugger window, allowing you to input commands, type help for some examples" });
UIWidgets::CVarCheckbox("Debug mode", "gEnableDebugMode", { .tooltip = "TBD" });
UIWidgets::CVarCheckbox("Debug mode", "gEnableDebugMode", {
.tooltip = "Enable debug mode"
});
UIWidgets::CVarCheckbox("Level Selector", "gLevelSelector",
{ .tooltip = "Allows you to select any level from the main menu" });
@@ -502,6 +504,10 @@ void DrawDebugMenu() {
UIWidgets::CVarCheckbox("SFX Jukebox", "gSfxJukebox",
{ .tooltip = "Allows you to play sound effects from the game" });
UIWidgets::CVarCheckbox("Render Collision", "gRenderCollisionMesh", {
.tooltip = "Renders the collision mesh instead of the course mesh"
});
UIWidgets::Spacer(0);
UIWidgets::WindowButton("GameInfo", "gGameInfoEnabled", GameUI::mGameInfoWindow,
+9 -2
View File
@@ -22,6 +22,8 @@
#include "courses/all_course_offsets.h"
#include <assert.h>
#include "enhancements/collision_viewer.h"
s16 D_802B87B0 = 995;
s16 D_802B87B4 = 1000;
UNUSED s32 D_802B87B8 = 0;
@@ -1368,10 +1370,15 @@ void func_8029569C(void) {
}
void render_course(struct UnkStruct_800DC5EC *arg0) {
func_802B5D64(D_800DC610, D_802B87D4, 0, 1);
if ((CVarGetInteger("gFreecam", 0) == 1) ) {
// Freecam priority renders collision.
if (CVarGetInteger("gRenderCollisionMesh", 0) == true) {
render_collision();
return;
}
if ((CVarGetInteger("gFreecam", 0) == true) ) {
// Render credits courses
func_8029569C();
return;