From 9c9d2d548e9aa441b702aa2e263e53259328eedf Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Mon, 16 Feb 2026 12:29:25 -0600 Subject: [PATCH] Fixed whatever problem was with texture loading. --- assets/scene/minesweeper.lua | 2 +- assets/ui/minogram.dpt | Bin 8201 -> 8204 bytes assets/ui/minogram.dtf | Bin 0 -> 24 bytes src/asset/type/assettexture.h | 2 - src/asset/type/assettileset.c | 49 +++++++++++++++++++++- src/asset/type/assettileset.h | 8 ++++ src/display/display.c | 3 +- src/display/palette/palette.c | 2 +- src/display/text.c | 1 - src/display/texture.c | 13 ++++-- src/display/tileset/tileset.h | 14 +++---- src/script/module/display/moduletileset.c | 12 ++---- tools/tileset-creator.html | 14 +++---- 13 files changed, 86 insertions(+), 34 deletions(-) create mode 100644 assets/ui/minogram.dtf diff --git a/assets/scene/minesweeper.lua b/assets/scene/minesweeper.lua index 9c85b4d..c9f855e 100644 --- a/assets/scene/minesweeper.lua +++ b/assets/scene/minesweeper.lua @@ -199,7 +199,7 @@ function sceneRender() 1, 1 ) - textDraw(10, 10, "Minesweeper") + textDraw(10, 10, "A") -- centerX = math.floor(screenGetWidth() / 2) -- centerY = math.floor(screenGetHeight() / 2) diff --git a/assets/ui/minogram.dpt b/assets/ui/minogram.dpt index 9fb8c56af371be43d7227b06c04e2d02f47ee1a6..223156eb483456521145ed2483c28143739ed0a9 100644 GIT binary patch delta 25 gcmeBl=yBk52?$|qU|?Wym>kH`GVuY+#=dHK0ACRZ0ssI2 delta 27 icmeBi=yYIn2?$|qaF`s((lS{absX(;9?L3l1vON3=9kowhRmkb^sbj0qXz& literal 0 HcmV?d00001 diff --git a/src/asset/type/assettexture.h b/src/asset/type/assettexture.h index 258101a..35f42b7 100644 --- a/src/asset/type/assettexture.h +++ b/src/asset/type/assettexture.h @@ -20,10 +20,8 @@ typedef struct assetentire_s assetentire_t; typedef struct { char_t header[3]; uint8_t version; - uint32_t width; uint32_t height; - uint8_t paletteIndex; uint8_t palette[ASSET_TEXTURE_SIZE_MAX]; } assettexture_t; #pragma pack(pop) diff --git a/src/asset/type/assettileset.c b/src/asset/type/assettileset.c index 04469cb..dd6ef14 100644 --- a/src/asset/type/assettileset.c +++ b/src/asset/type/assettileset.c @@ -8,6 +8,7 @@ #include "asset/asset.h" #include "assert/assert.h" #include "display/tileset/tileset.h" +#include "util/memory.h" errorret_t assetTilesetLoad(assetentire_t entire) { assertNotNull(entire.data, "Asset data cannot be null"); @@ -28,5 +29,51 @@ errorret_t assetTilesetLoad(assetentire_t entire) { errorThrow("Unsupported tileset version"); } - errorThrow("unfinished"); + // Fix endianness + tilesetData->tileWidth = le16toh(tilesetData->tileWidth); + tilesetData->tileHeight = le16toh(tilesetData->tileHeight); + tilesetData->columnCount = le16toh(tilesetData->columnCount); + tilesetData->rowCount = le16toh(tilesetData->rowCount); + tilesetData->right = le16toh(tilesetData->right); + tilesetData->bottom = le16toh(tilesetData->bottom); + + if(tilesetData->tileWidth == 0) { + errorThrow("Tile width cannot be 0"); + } + if(tilesetData->tileHeight == 0) { + errorThrow("Tile height cannot be 0"); + } + if(tilesetData->columnCount == 0) { + errorThrow("Column count cannot be 0"); + } + if(tilesetData->rowCount == 0) { + errorThrow("Row count cannot be 0"); + } + + uint32_t temp; + memoryCopy(&temp, &tilesetData->u0, sizeof(float_t)); + temp = le32toh(temp); + memoryCopy(&tilesetData->u0, &temp, sizeof(float_t)); + + if(tilesetData->u0 < 0.0f || tilesetData->u0 > 1.0f) { + errorThrow("Invalid u0 value in tileset"); + } + + memoryCopy(&temp, &tilesetData->v0, sizeof(float_t)); + temp = le32toh(temp); + memoryCopy(&tilesetData->v0, &temp, sizeof(float_t)); + + if(tilesetData->v0 < 0.0f || tilesetData->v0 > 1.0f) { + errorThrow("Invalid v0 value in tileset"); + } + + // Setup tileset + tileset->tileWidth = tilesetData->tileWidth; + tileset->tileHeight = tilesetData->tileHeight; + tileset->tileCount = tilesetData->columnCount * tilesetData->rowCount; + tileset->columns = tilesetData->columnCount; + tileset->rows = tilesetData->rowCount; + tileset->uv[0] = tilesetData->u0; + tileset->uv[1] = tilesetData->v0; + errorOk(); } \ No newline at end of file diff --git a/src/asset/type/assettileset.h b/src/asset/type/assettileset.h index 0bee407..a659fea 100644 --- a/src/asset/type/assettileset.h +++ b/src/asset/type/assettileset.h @@ -12,6 +12,14 @@ typedef struct { char_t header[3]; uint8_t version; + uint16_t tileWidth; + uint16_t tileHeight; + uint16_t columnCount; + uint16_t rowCount; + uint16_t right; + uint16_t bottom; + float_t u0; + float_t v0; } assettileset_t; #pragma pack(pop) diff --git a/src/display/display.c b/src/display/display.c index 0520af2..7844114 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -88,6 +88,7 @@ errorret_t displayInit(void) { #else GLint mask = 0; glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); + DISPLAY.usingShaderedPalettes = true; if(mask & GL_CONTEXT_CORE_PROFILE_BIT) { GLint numExtens = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &numExtens); @@ -100,7 +101,7 @@ errorret_t displayInit(void) { } } else { const char* ext = (const char*)glGetString(GL_EXTENSIONS); - DISPLAY.usingShaderedPalettes = ( + DISPLAY.usingShaderedPalettes = !( ext && strstr(ext, "GL_EXT_paletted_texture") ); } diff --git a/src/display/palette/palette.c b/src/display/palette/palette.c index c556551..3c0b5af 100644 --- a/src/display/palette/palette.c +++ b/src/display/palette/palette.c @@ -28,7 +28,7 @@ void paletteInit( memoryZero(palette, sizeof(palette_t)); palette->colorCount = colorCount; - memoryCopy(colors, palette->colors, colorCount * sizeof(color_t)); + memoryCopy(palette->colors, colors, colorCount * sizeof(color_t)); } void paletteBind(palette_t *palette, const uint8_t slot) { diff --git a/src/display/text.c b/src/display/text.c index 8453e2e..51fdfce 100644 --- a/src/display/text.c +++ b/src/display/text.c @@ -36,7 +36,6 @@ void textDrawChar( if(tileIndex < 0 || tileIndex >= tileset->tileCount) { tileIndex = ((int32_t)'@') - TEXT_CHAR_START; } - assertTrue( tileIndex >= 0 && tileIndex <= tileset->tileCount, "Character is out of bounds for font tiles" diff --git a/src/display/texture.c b/src/display/texture.c index d2ac69e..e7a1ee5 100644 --- a/src/display/texture.c +++ b/src/display/texture.c @@ -52,12 +52,13 @@ void textureInit( uint8_t formatted[width * height]; for(int32_t i = 0; i < width * height; i++) { uint8_t index = data.paletteData[i]; - formatted[i] = index; + formatted[i] = index * 128; } glTexImage2D( - GL_TEXTURE_2D, 0, GL_R, width, height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, (void*)formatted + GL_TEXTURE_2D, 0, GL_R8, width, height, 0, + GL_RED, GL_UNSIGNED_BYTE, (void*)formatted ); + } else { glTexImage2D( GL_TEXTURE_2D, @@ -66,12 +67,16 @@ void textureInit( 0, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, (void*)data.paletteData ); - // glColorTableEXT( // GL_TEXTURE_2D, GL_RGBA, data.palette.palette->colorCount, GL_RGBA, // GL_UNSIGNED_BYTE, (const void*)data.palette.palette->colors // ); } + + GLenum err = glGetError(); + if(err != GL_NO_ERROR) { + assertUnreachable("GL error uploading palette texture"); + } break; default: diff --git a/src/display/tileset/tileset.h b/src/display/tileset/tileset.h index 01e3405..df53516 100644 --- a/src/display/tileset/tileset.h +++ b/src/display/tileset/tileset.h @@ -9,14 +9,12 @@ #include "dusk.h" typedef struct tileset_s { - const char_t *name; - const uint16_t tileWidth; - const uint16_t tileHeight; - const uint16_t tileCount; - const uint16_t columns; - const uint16_t rows; - const vec2 uv; - const char_t *image; + uint16_t tileWidth; + uint16_t tileHeight; + uint16_t tileCount; + uint16_t columns; + uint16_t rows; + vec2 uv; } tileset_t; /** diff --git a/src/script/module/display/moduletileset.c b/src/script/module/display/moduletileset.c index 55f8c60..ff68251 100644 --- a/src/script/module/display/moduletileset.c +++ b/src/script/module/display/moduletileset.c @@ -41,13 +41,7 @@ int moduleTilesetIndex(lua_State *l) { tileset_t *ts = (tileset_t *)luaL_checkudata(l, 1, "tileset_mt"); assertNotNull(ts, "Tileset pointer cannot be NULL."); - if(stringCompare(key, "name") == 0) { - lua_pushstring(l, ts->name); - return 1; - } else if(stringCompare(key, "texture") == 0) { - lua_pushstring(l, ts->image); - return 1; - } else if(stringCompare(key, "tileWidth") == 0) { + if(stringCompare(key, "tileWidth") == 0) { lua_pushnumber(l, ts->tileWidth); return 1; } else if(stringCompare(key, "tileHeight") == 0) { @@ -72,7 +66,9 @@ int moduleTilesetToString(lua_State *l) { tileset_t *ts = (tileset_t *)luaL_checkudata(l, 1, "tileset_mt"); assertNotNull(ts, "Tileset pointer cannot be NULL."); - lua_pushfstring(l, "Tileset: %s", ts->name); + lua_pushfstring(l, "Tileset: %dx%d tile, %d columns, %d rows", + ts->tileWidth, ts->tileHeight, ts->columns, ts->rows + ); return 1; } diff --git a/tools/tileset-creator.html b/tools/tileset-creator.html index 883240c..3dc5ae3 100644 --- a/tools/tileset-creator.html +++ b/tools/tileset-creator.html @@ -151,7 +151,7 @@ const getValues = () => { if(!pixels) return null; - let tileWidth, tileHeight, columnCount, rowCount, right, bottom; + let tileWidth, tileHeight, columnCount, rowCount; if(elDefineBySize.checked) { console.log('Defining by size'); tileWidth = parseInt(elTileWidth.value) || 0; @@ -166,8 +166,8 @@ tileHeight = Math.floor(imageHeight / rowCount); } - right = parseInt(elRight.value) || 0; - bottom = parseInt(elBottom.value) || 0; + const right = parseInt(elRight.value) || 0; + const bottom = parseInt(elBottom.value) || 0; const scale = parseInt(elScale.value) || 1; const scaledWidth = imageWidth * scale; @@ -177,13 +177,13 @@ const scaledRight = right * scale; const scaledBottom = bottom * scale; - const u0 = tileWidth / imageWidth - (right / imageWidth); - const v0 = tileHeight / imageHeight - (bottom / imageHeight); + const u0 = (tileWidth / imageWidth); + const v0 = (tileHeight / imageHeight); const hoveredTileX = isNaN(hoveredX) || hoveredX < 0 ? 0 : hoveredX; const hoveredTileY = isNaN(hoveredY) || hoveredY < 0 ? 0 : hoveredY; - const hoveredU0 = hoveredTileX * tileWidth / imageWidth; - const hoveredV0 = hoveredTileY * tileHeight / imageHeight; + const hoveredU0 = hoveredTileX * u0; + const hoveredV0 = hoveredTileY * v0; const hoveredU1 = hoveredU0 + u0; const hoveredV1 = hoveredV0 + v0; const hoveredTileIndex = hoveredTileY * columnCount + hoveredTileX;