diff --git a/CMakeLists.txt b/CMakeLists.txt index ec7b3a6..caea886 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,6 +125,9 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wi DOLPHIN ) + # Disable all warnings + target_compile_options(${DUSK_LIBRARY_TARGET_NAME} PRIVATE -w) + # Custom flags for cglm set(CGLM_SHARED OFF CACHE BOOL "Build cglm shared" FORCE) set(CGLM_STATIC ON CACHE BOOL "Build cglm static" FORCE) diff --git a/assets/minesweeper/CMakeLists.txt b/assets/minesweeper/CMakeLists.txt index c98c82d..5ffcc3b 100644 --- a/assets/minesweeper/CMakeLists.txt +++ b/assets/minesweeper/CMakeLists.txt @@ -5,4 +5,4 @@ add_asset(TILESET ui.png type=PALETTIZED tileWidth=8 tileHeight=8) add_asset(TILESET cell.png type=PALETTIZED tileWidth=8 tileHeight=8) -add_asset(TILESET grid.png type=PALETTIZED tileWidth=8 tileHeight=8) \ No newline at end of file +add_asset(IMAGE grid_bg.png type=PALETTIZED) \ No newline at end of file diff --git a/assets/minesweeper/grid_bg.png b/assets/minesweeper/grid_bg.png new file mode 100644 index 0000000..a854dc4 Binary files /dev/null and b/assets/minesweeper/grid_bg.png differ diff --git a/assets/scene/minesweeper.lua b/assets/scene/minesweeper.lua index 4be4ba9..6f37379 100644 --- a/assets/scene/minesweeper.lua +++ b/assets/scene/minesweeper.lua @@ -20,10 +20,7 @@ camera = cameraCreate(CAMERA_PROJECTION_TYPE_ORTHOGRAPHIC) tilesetUi = tilesetGetByName("ui") textureUi = textureLoad(tilesetUi.texture) -tilesetGrid = tilesetGetByName("grid") -textureGrid = textureLoad(tilesetGrid.texture) -gridPiece = tilesetPositionGetUV(tilesetGrid, 0, 0) -gridSlice = tilesetPositionGetUV(tilesetGrid, 11, 3) +textureGrid = textureLoad("minesweeper/grid_bg.dpi") tilesetCell = tilesetGetByName("cell") textureCell = textureLoad(tilesetCell.texture) @@ -65,28 +62,21 @@ function cellDraw(x, y, type) end function backgroundDraw() - local t = (TIME.time * 3) % 1 - local offXStart = gridPiece.u1 * t - local offYStart = gridPiece.v1 * t - local offXEnd = offXStart + gridPiece.u1 - local offYEnd = offYStart + gridPiece.v1 - - -- Tile background - local cols = math.ceil(screenGetWidth() / tilesetGrid.tileWidth) - local rows = math.ceil(screenGetHeight() / tilesetGrid.tileHeight) + local t = (TIME.time / 20) % 1 + local scaleX = screenGetWidth() / textureGrid.width + local scaleY = screenGetHeight() / textureGrid.height + local u0 = t * scaleX + local v0 = t * scaleY + local u1 = scaleX + u0 + local v1 = scaleY + v0 - for y = 0, rows do - for x = 0, cols do - spriteBatchPush( - textureGrid, - x * tilesetGrid.tileWidth, y * tilesetGrid.tileHeight, - (x + 1) * tilesetGrid.tileWidth, (y + 1) * tilesetGrid.tileHeight, - colorWhite(), - gridSlice.u0 + offXStart, gridSlice.v0 + offYStart, - gridSlice.u1 + offXEnd, gridSlice.v1 + offYEnd - ) - end - end + spriteBatchPush(textureGrid, + 0, 0, + screenGetWidth(), screenGetHeight(), + colorWhite(), + u0, v0, + u1, v1 + ) end function sceneDispose() @@ -112,6 +102,7 @@ function sceneRender() y * tilesetCell.tileHeight + offsetY, cells[i] ) + break end end spriteBatchFlush() diff --git a/src/display/display.c b/src/display/display.c index 7d63a7f..5731c16 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -138,8 +138,17 @@ errorret_t displayInit(void) { // Setup cull modes GX_SetCullMode(GX_CULL_NONE); + GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE); GX_SetDispCopyGamma(GX_GM_1_0); + + GX_ClearVtxDesc(); + GX_SetVtxDesc(GX_VA_POS, GX_INDEX16); + GX_SetVtxDesc(GX_VA_CLR0, GX_INDEX16); + GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX16); + 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_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); #endif quadInit(); diff --git a/src/display/mesh/mesh.c b/src/display/mesh/mesh.c index 5ee8deb..d8459ce 100644 --- a/src/display/mesh/mesh.c +++ b/src/display/mesh/mesh.c @@ -80,23 +80,14 @@ void meshDraw( (void*)&mesh->vertices[offset], sizeof(meshvertex_t) * count ); - GX_ClearVtxDesc();// Just clears so may be un-needed? - - GX_SetVtxDesc(GX_VA_POS, GX_INDEX16); - GX_SetVtxDesc(GX_VA_CLR0, GX_INDEX16); - GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX16); - - 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_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); const u8 stride = (u8)sizeof(meshvertex_t); - GX_SetArray(GX_VA_POS, &mesh->vertices[offset].pos[0], stride); - GX_SetArray(GX_VA_CLR0, &mesh->vertices[offset].color, stride); - GX_SetArray(GX_VA_TEX0, &mesh->vertices[offset].uv[0], stride); + GX_SetArray(GX_VA_POS, (void*)&mesh->vertices[offset].pos[0], stride); + GX_SetArray(GX_VA_CLR0, (void*)&mesh->vertices[offset].color, stride); + GX_SetArray(GX_VA_TEX0, (void*)&mesh->vertices[offset].uv[0], stride); textureDolphinUploadTEV(); - + GX_Begin(mesh->primitiveType, GX_VTXFMT0, (uint16_t)count); for(u16 i = 0; i < (u16)count; ++i) { GX_Position1x16(i); diff --git a/src/display/spritebatch.c b/src/display/spritebatch.c index 9669992..c7438ee 100644 --- a/src/display/spritebatch.c +++ b/src/display/spritebatch.c @@ -78,7 +78,6 @@ void spriteBatchPush3D( &SPRITEBATCH_VERTICES[SPRITEBATCH.spriteCount * QUAD_VERTEX_COUNT], min, max, color, uv0, uv1 ); - SPRITEBATCH.spriteCount++; } diff --git a/src/display/spritebatch.h b/src/display/spritebatch.h index bd051ab..2dc685b 100644 --- a/src/display/spritebatch.h +++ b/src/display/spritebatch.h @@ -9,7 +9,7 @@ #include "display/mesh/quad.h" #include "display/texture.h" -#define SPRITEBATCH_SPRITES_MAX 32 +#define SPRITEBATCH_SPRITES_MAX 128 #define SPRITEBATCH_VERTEX_COUNT (SPRITEBATCH_SPRITES_MAX * QUAD_VERTEX_COUNT) diff --git a/src/display/texture.c b/src/display/texture.c index 126d83e..0a1bcc8 100644 --- a/src/display/texture.c +++ b/src/display/texture.c @@ -179,8 +179,8 @@ void textureInit( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindTexture(GL_TEXTURE_2D, 0); texture->ready = true; @@ -242,7 +242,7 @@ void textureInit( texture->rgba, width, height, GX_TF_RGB5A3, - GX_CLAMP, GX_CLAMP, + GX_REPEAT, GX_REPEAT, GX_FALSE ); @@ -300,7 +300,7 @@ void textureInit( texture->alpha, width, height, GX_TF_I8, - GX_CLAMP, GX_CLAMP, + GX_REPEAT, GX_REPEAT, GX_FALSE ); @@ -317,7 +317,6 @@ void textureInit( case TEXTURE_FORMAT_PALETTE: { // Not supported, convert to RGBA using lookup - printf("Warning: Palette textures not supported on Dolphin, converted to RGBA1\n"); color_t* formatted = memoryAllocate(width * height * sizeof(color_t)); for(int32_t i = 0; i < width * height; i++) { uint8_t index = data.palette.data[i]; @@ -326,9 +325,7 @@ void textureInit( "Palette index out of range" ); formatted[i] = data.palette.palette->colors[index]; - printf("Index %i: Color %02X%02X%02X%02X\n", index, formatted[i].r, formatted[i].g, formatted[i].b, formatted[i].a); } - printf("Warning: Palette textures not supported on Dolphin, converted to RGBA2\n"); textureInit( texture, width, height, TEXTURE_FORMAT_RGBA, @@ -349,6 +346,10 @@ void textureInit( #endif } +#if DOLPHIN + static uint8_t dolphinTextureNextSlot = 0; +#endif + void textureBind(texture_t *texture) { if(TEXTURE_BOUND == texture) return; @@ -371,7 +372,9 @@ void textureBind(texture_t *texture) { glBindTexture(GL_TEXTURE_2D, texture->id); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); #elif DOLPHIN - GX_LoadTexObj(&texture->texObj, GX_TEXMAP0); + GX_InvalidateTexAll(); + GX_LoadTexObj(&TEXTURE_BOUND->texObj, GX_TEXMAP0 + dolphinTextureNextSlot); + dolphinTextureNextSlot = (dolphinTextureNextSlot + 1) % GX_MAX_TEXMAP; #endif TEXTURE_BOUND = texture; } @@ -406,6 +409,13 @@ void textureDispose(texture_t *texture) { #if DOLPHIN void textureDolphinUploadTEV() { + if(TEXTURE_BOUND == NULL) { + GX_SetNumTexGens(0); + GX_SetNumTevStages(1); + GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); + return; + } + // Add channel for vertex color GX_SetNumChans(1); GX_SetChanCtrl( @@ -418,13 +428,6 @@ void textureDispose(texture_t *texture) { GX_AF_NONE// Attenuation function ); - if(!TEXTURE_BOUND) { - GX_SetNumTexGens(0); - GX_SetNumTevStages(1); - GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR); - return; - } - // One set of UVs GX_SetNumTexGens(1); GX_SetTexCoordGen( @@ -446,6 +449,8 @@ void textureDispose(texture_t *texture) { GX_COLOR0A0 ); GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE); + GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR); + GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0); break; case TEXTURE_FORMAT_ALPHA: diff --git a/src/script/module/display/moduletexture.c b/src/script/module/display/moduletexture.c index b016a3b..4c3621b 100644 --- a/src/script/module/display/moduletexture.c +++ b/src/script/module/display/moduletexture.c @@ -43,10 +43,10 @@ int moduleTextureIndex(lua_State *l) { assertNotNull(key, "Key cannot be NULL."); if(stringCompare(key, "width") == 0) { - lua_pushinteger(l, tex->width); + lua_pushnumber(l, tex->width); return 1; } else if(stringCompare(key, "height") == 0) { - lua_pushinteger(l, tex->height); + lua_pushnumber(l, tex->height); return 1; }