summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2024-09-10 16:27:31 -0600
committerGitHub <noreply@github.com>2024-09-10 16:27:31 -0600
commited85166756cfd2a0e4bdba81f957b06d52147d3c (patch)
treeab18b4d25b09456d1cc79d89a046aea4d8c834d4 /src
parentb36b9e318095e0ae5fc720319a55418d9aa5a4c3 (diff)
[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
Diffstat (limited to 'src')
-rw-r--r--src/enhancements/collision_viewer.c288
-rw-r--r--src/enhancements/collision_viewer.h9
-rw-r--r--src/port/ui/ImguiUI.cpp8
-rw-r--r--src/racing/render_courses.c11
4 files changed, 313 insertions, 3 deletions
diff --git a/src/enhancements/collision_viewer.c b/src/enhancements/collision_viewer.c
new file mode 100644
index 000000000..d66fa2998
--- /dev/null
+++ b/src/enhancements/collision_viewer.c
@@ -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);
+ }
+ }
diff --git a/src/enhancements/collision_viewer.h b/src/enhancements/collision_viewer.h
new file mode 100644
index 000000000..8a2a3ab74
--- /dev/null
+++ b/src/enhancements/collision_viewer.h
@@ -0,0 +1,9 @@
+#ifndef COLLISION_VIEWER_H
+#define COLLISION_VIEWER_H
+
+#include <libultraship.h>
+
+void render_collision(void);
+
+
+#endif // COLLISION_VIEWER_H
diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp
index 69d3d82e9..d434de37a 100644
--- a/src/port/ui/ImguiUI.cpp
+++ b/src/port/ui/ImguiUI.cpp
@@ -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,
diff --git a/src/racing/render_courses.c b/src/racing/render_courses.c
index e2017cad2..4f0b67c33 100644
--- a/src/racing/render_courses.c
+++ b/src/racing/render_courses.c
@@ -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;