Trying to find dolphin texture bug
All checks were successful
Build Dusk / run-tests (push) Successful in 1m37s
Build Dusk / build-linux (push) Successful in 1m23s
Build Dusk / build-psp (push) Successful in 1m45s
Build Dusk / build-dolphin (push) Successful in 2m20s

This commit is contained in:
2026-02-09 14:53:27 -06:00
parent a26e51cf46
commit 073ee8dca9
10 changed files with 56 additions and 58 deletions

View File

@@ -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)

View File

@@ -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)
add_asset(IMAGE grid_bg.png type=PALETTIZED)

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

View File

@@ -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
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
-- Tile background
local cols = math.ceil(screenGetWidth() / tilesetGrid.tileWidth)
local rows = math.ceil(screenGetHeight() / tilesetGrid.tileHeight)
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()

View File

@@ -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();

View File

@@ -80,20 +80,11 @@ 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();

View File

@@ -78,7 +78,6 @@ void spriteBatchPush3D(
&SPRITEBATCH_VERTICES[SPRITEBATCH.spriteCount * QUAD_VERTEX_COUNT],
min, max, color, uv0, uv1
);
SPRITEBATCH.spriteCount++;
}

View File

@@ -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)

View File

@@ -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:

View File

@@ -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;
}