From ed85166756cfd2a0e4bdba81f957b06d52147d3c Mon Sep 17 00:00:00 2001 From: MegaMech Date: Tue, 10 Sep 2024 16:27:31 -0600 Subject: [PATCH] [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 --- src/enhancements/collision_viewer.c | 288 ++++++++++++++++++++++++++++ src/enhancements/collision_viewer.h | 9 + src/port/ui/ImguiUI.cpp | 8 +- src/racing/render_courses.c | 11 +- 4 files changed, 313 insertions(+), 3 deletions(-) create mode 100644 src/enhancements/collision_viewer.c create mode 100644 src/enhancements/collision_viewer.h 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 +#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 + +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 +#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;