From 5cf299a1c796a6f0abc5601f63942f4ade8cab9f Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Thu, 5 Feb 2026 08:21:19 -0600 Subject: [PATCH] Mesh working, lua broken --- assets/init.lua | 2 +- src/display/camera/camera.c | 8 ++- src/display/display.c | 107 +++++++++++------------------------- src/display/framebuffer.c | 3 + src/display/mesh/mesh.c | 31 +++++++++++ src/display/mesh/mesh.h | 12 +++- src/engine/engine.c | 45 ++++++++++++++- 7 files changed, 126 insertions(+), 82 deletions(-) diff --git a/assets/init.lua b/assets/init.lua index 46a3d5e..dc559d5 100644 --- a/assets/init.lua +++ b/assets/init.lua @@ -38,4 +38,4 @@ else end localeSet(DUSK_LOCALE_EN_US) -sceneSet('scene/initial.dsf') \ No newline at end of file +-- sceneSet('scene/initial.dsf') \ No newline at end of file diff --git a/src/display/camera/camera.c b/src/display/camera/camera.c index 4a1f6af..bee5166 100644 --- a/src/display/camera/camera.c +++ b/src/display/camera/camera.c @@ -67,7 +67,6 @@ void cameraPushMatrix(camera_t *camera) { break; case CAMERA_PROJECTION_TYPE_PERSPECTIVE: - case CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED: guPerspective( guProjection, // FOV is in degrees. @@ -79,6 +78,10 @@ void cameraPushMatrix(camera_t *camera) { ); break; + case CAMERA_PROJECTION_TYPE_PERSPECTIVE_FLIPPED: + assertUnreachable("Flipped perspective not implemented on Dolphin"); + break; + default: assertUnreachable("Invalid camera projection type"); } @@ -104,12 +107,15 @@ void cameraPushMatrix(camera_t *camera) { break; case CAMERA_VIEW_TYPE_MATRIX: + assertUnreachable("Matrix camera not implemented"); break; case CAMERA_VIEW_TYPE_LOOKAT_PIXEL_PERFECT: + assertUnreachable("Pixel perfect camera not implemented"); break; case CAMERA_VIEW_TYPE_2D: + assertUnreachable("2D camera not implemented"); break; default: diff --git a/src/display/display.c b/src/display/display.c index c155bc5..408cd66 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -22,39 +22,44 @@ #include #include #include -#include display_t DISPLAY = { 0 }; -static vu8 readyForCopy; -PADStatus pads[4]; -Mtx view; -Mtx44 projection; -#define FIFO_SIZE (256*1024) +#if DOLPHIN + static vu8 readyForCopy; + #define FIFO_SIZE (256*1024) + static void copy_buffers(u32 count __attribute__ ((unused))) + { + if (readyForCopy==GX_TRUE) { + GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GX_SetColorUpdate(GX_TRUE); + GX_CopyDisp(DISPLAY.frameBuffer,GX_TRUE); + GX_Flush(); + readyForCopy = GX_FALSE; + } + } +#endif -float_t vertices[] ATTRIBUTE_ALIGN(32) = { - 0, 15, 0, - -15, -15, 0, - 15, -15, 0}; +meshvertex_t vertices[3] = { + { + .color = COLOR_RED_4B, + .uv = { 0.5f, 1.0f }, + .pos = { 0.0f, 15.0f, 0.0f } + }, + { + .color = COLOR_GREEN_4B, + .uv = { 0.0f, 0.0f }, + .pos = { -15.0f, -15.0f, 0.0f } + }, -u8 colors[] ATTRIBUTE_ALIGN(32) = { - 255, 0, 0, 255, - 0, 255, 0, 255, - 0, 0, 255, 255 + { + .color = COLOR_BLUE_4B, + .uv = { 1.0f, 0.0f }, + .pos = { 15.0f, -15.0f, 0.0f } + } }; -static void copy_buffers(u32 count __attribute__ ((unused))) -{ - if (readyForCopy==GX_TRUE) { - GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); - GX_SetColorUpdate(GX_TRUE); - GX_CopyDisp(DISPLAY.frameBuffer,GX_TRUE); - GX_Flush(); - readyForCopy = GX_FALSE; - } -} - errorret_t displayInit(void) { #if DISPLAY_SDL2 uint32_t flags = SDL_INIT_VIDEO; @@ -149,29 +154,12 @@ errorret_t displayInit(void) { //? GX_CopyDisp(DISPLAY.frameBuffer, GX_TRUE); - - // Set up view and projection matrices - guPerspective(projection, 60, 1.33F, 10.0F, 300.0F); - GX_LoadProjectionMtx(projection, GX_PERSPECTIVE); - - // Prepare Vertex descriptor - GX_ClearVtxDesc(); - GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); - GX_SetVtxDesc(GX_VA_CLR0, GX_INDEX8); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); - GX_SetArray(GX_VA_POS, vertices, 3*sizeof(float_t)); - GX_SetArray(GX_VA_CLR0, colors, 4*sizeof(u8)); - GX_SetNumChans(1); - GX_SetNumTexGens(0); - GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); #endif quadInit(); frameBufferInitBackbuffer(); spriteBatchInit(); - errorChain(textInit()); + // errorChain(textInit()); screenInit(); errorOk(); @@ -225,39 +213,8 @@ errorret_t displayUpdate(void) { ); errorChain(sceneRender()); - GX_InvVtxCache(); - GX_InvalidateTexAll(); - - // This seems to setup camera - // guVector camera = {0.0F, 0.0F, 0.0F}; - // guVector up = {0.0F, 1.0F, 0.0F}; - // guVector look = {0.0F, 0.0F, -1.0F}; - // guLookAt(view, &camera, &up, &look); - // Mtx modelView; - // guMtxIdentity(modelView); - // guMtxTransApply(modelView, modelView, 0.0F, 0.0F, -50.0F); - // guMtxConcat(view,modelView,modelView); - // // This seems to load the matrix into the GX pipeline? - // GX_LoadPosMtxImm(modelView, GX_PNMTX0); - - camera_t camera; - cameraInitPerspective(&camera); - camera.lookat.position[0] = 32; - camera.lookat.position[1] = 32; - camera.lookat.position[2] = 32; - cameraPushMatrix(&camera); - GX_Begin(GX_TRIANGLES, GX_VTXFMT0, 3); - GX_Position1x8(0); - GX_Color1x8(0); - GX_Position1x8(1); - GX_Color1x8(1); - GX_Position1x8(2); - GX_Color1x8(2); - GX_End(); - cameraPopMatrix(); - // Render UI - uiRender(); + // uiRender(); // Finish up screenUnbind(); diff --git a/src/display/framebuffer.c b/src/display/framebuffer.c index 1dbc476..e4e620b 100644 --- a/src/display/framebuffer.c +++ b/src/display/framebuffer.c @@ -130,6 +130,9 @@ void frameBufferBind(const framebuffer_t *framebuffer) { ); #elif DOLPHIN + GX_InvVtxCache(); + GX_InvalidateTexAll(); + GX_SetViewport( 0, 0, frameBufferGetWidth(framebuffer), diff --git a/src/display/mesh/mesh.c b/src/display/mesh/mesh.c index 0e0882c..d35e429 100644 --- a/src/display/mesh/mesh.c +++ b/src/display/mesh/mesh.c @@ -69,6 +69,37 @@ void meshDraw( 0, count ); + + #elif DOLPHIN + // Prepare Vertex descriptor + GX_ClearVtxDesc();// Just clears so may be un-needed? + + GX_SetVtxDesc(GX_VA_POS, GX_INDEX16); + // GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX16); + GX_SetVtxDesc(GX_VA_CLR0, GX_INDEX16); + + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + // GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + + const u8 stride = (u8)sizeof(meshvertex_t); + GX_SetArray(GX_VA_POS, &mesh->vertices[offset].pos[0], stride); + // GX_SetArray(GX_VA_TEX0, &mesh->vertices[offset].uv[0], stride); + GX_SetArray(GX_VA_CLR0, &mesh->vertices[offset].color, stride); + + GX_SetNumChans(1);// How many color channels are used + GX_SetNumTexGens(0);// How many texture coordinate generators are used + // Basically the shader setup + GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + + GX_Begin(mesh->primitiveType, GX_VTXFMT0, (uint16_t)count); + for(u16 i = 0; i < (u16)count; ++i) { + GX_Position1x16(i); + // GX_TexCoord1x16(i); + GX_Color1x16(i); + } + GX_End(); #endif } diff --git a/src/display/mesh/mesh.h b/src/display/mesh/mesh.h index 730a96d..8853c54 100644 --- a/src/display/mesh/mesh.h +++ b/src/display/mesh/mesh.h @@ -22,13 +22,21 @@ typedef enum { #define MESH_VERTEX_UV_SIZE 2 #define MESH_VERTEX_POS_SIZE 3 -typedef struct { +#if DOLPHIN + typedef struct ATTRIBUTE_ALIGN(32) { +#else + typedef struct { +#endif color4b_t color; float uv[MESH_VERTEX_UV_SIZE]; float pos[MESH_VERTEX_POS_SIZE]; } meshvertex_t; -typedef struct { +#if DOLPHIN + typedef struct ATTRIBUTE_ALIGN(32) { +#else + typedef struct { +#endif const meshvertex_t *vertices; int32_t vertexCount; meshprimitivetype_t primitiveType; diff --git a/src/engine/engine.c b/src/engine/engine.c index 0c73218..fe49cf3 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -41,10 +41,49 @@ errorret_t engineInit(const int32_t argc, const char_t **argv) { backpackInit(); // Run the initial script. - // scriptcontext_t ctx; - // errorChain(scriptContextInit(&ctx)); + scriptcontext_t ctx; + errorChain(scriptContextInit(&ctx)); // errorChain(scriptContextExecFile(&ctx, "init.dsf")); - // scriptContextDispose(&ctx); + + errorChain(scriptContextExec(&ctx, + "printf('Lua still working')" + // "module('platform')\n" + // "module('input')\n" + // "module('scene')\n" + // "module('locale')\n" + // "if PLATFORM == \"psp\" then\n" + // " inputBind(\"up\", INPUT_ACTION_UP)\n" + // " inputBind(\"down\", INPUT_ACTION_DOWN)\n" + // " inputBind(\"left\", INPUT_ACTION_LEFT)\n" + // " inputBind(\"right\", INPUT_ACTION_RIGHT)\n" + // " inputBind(\"circle\", INPUT_ACTION_CANCEL)\n" + // " inputBind(\"cross\", INPUT_ACTION_ACCEPT)\n" + // " inputBind(\"select\", INPUT_ACTION_RAGEQUIT)\n" + // " inputBind(\"lstick_up\", INPUT_ACTION_UP)\n" + // " inputBind(\"lstick_down\", INPUT_ACTION_DOWN)\n" + // " inputBind(\"lstick_left\", INPUT_ACTION_LEFT)\n" + // " inputBind(\"lstick_right\", INPUT_ACTION_RIGHT)\n" + // "else\n" + // " if INPUT_KEYBOARD then\n" + // " inputBind(\"w\", INPUT_ACTION_UP)\n" + // " inputBind(\"s\", INPUT_ACTION_DOWN)\n" + // " inputBind(\"a\", INPUT_ACTION_LEFT)\n" + // " inputBind(\"d\", INPUT_ACTION_RIGHT)\n" + // " inputBind(\"left\", INPUT_ACTION_LEFT)\n" + // " inputBind(\"right\", INPUT_ACTION_RIGHT)\n" + // " inputBind(\"up\", INPUT_ACTION_UP)\n" + // " inputBind(\"down\", INPUT_ACTION_DOWN)\n" + // " inputBind(\"enter\", INPUT_ACTION_ACCEPT)\n" + // " inputBind(\"e\", INPUT_ACTION_ACCEPT)\n" + // " inputBind(\"q\", INPUT_ACTION_CANCEL)\n" + // " inputBind(\"escape\", INPUT_ACTION_RAGEQUIT)\n" + // " end \n" + // "end\n" + // "localeSet(DUSK_LOCALE_EN_US)\n" + // "print('Good here')" + )); + + scriptContextDispose(&ctx); errorOk(); }