ab2b778f44
build / build (push) Successful in 3m36s
Extends the MDL system beyond text overrides: bitmaps/<label>.json names a model/scale and resource list, and mdlp extracts each resource's frames, runs them through an ONNX Runtime CPU upscaler baked into mdlp-image, re-quantizes to the game's palette, and writes the result back - same build-time pipeline as message overrides. Adds animgallery, a standalone viewer that renders any data directory's animated resources as an HTML/GIF gallery with a checkbox-driven MDL JSON generator, and -only-changed to preview just what a mod overrides against the base game. Fixes a real data race in hacked's ChangeNotifier.hashAll() (found via go build -race causing non-deterministic resource counts), via a new numbered patch rather than editing the vendored source. Adds engine-patches/, a general-fixes counterpart to android/engine-patches/ now staged and applied to the desktop builds too (previously unpatched): a real GL_UNPACK_ROW_LENGTH stride bug, an audio error-logging improvement, and two critter-rendering fixes - mod art was losing to the base game's own re-opened resource files, and critters rendered at the wrong size/position once that was fixed, both from how the billboard renderer derives on-screen size and placement straight from bitmap pixel dimensions. Updates README.md and AGENTS.md to document engine-patches/.
31 lines
1.5 KiB
Diff
31 lines
1.5 KiB
Diff
--- a/src/MacSrc/OpenGL.cc 2026-07-19 13:11:51.000000000 +0200
|
|
+++ b/src/MacSrc/OpenGL.cc 2026-09-27 11:42:22.497868697 +0200
|
|
@@ -562,7 +562,14 @@
|
|
static bool opengl_cache_texture(CachedTexture toCache, grs_bitmap *bm) {
|
|
SDL_GL_MakeCurrent(window, context);
|
|
|
|
- glPixelStorei(GL_UNPACK_ROW_LENGTH, bm->row);
|
|
+ // GL_UNPACK_ROW_LENGTH must describe the buffer actually passed to
|
|
+ // glTexImage2D() below (toCache.converted->pixels, a separately
|
|
+ // allocated SDL_PIXELFORMAT_RGBA32 surface from
|
|
+ // SDL_ConvertSurfaceFormat()) - not bm->row, the original 8-bit source
|
|
+ // bitmap's own unrelated row stride. Using bm->row here describes the
|
|
+ // wrong stride to OpenGL whenever the two differ, corrupting the
|
|
+ // texture upload.
|
|
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, toCache.converted->pitch / 4);
|
|
|
|
if (texturesByBitsPtr.size() < MAX_CACHED_TEXTURES) {
|
|
// We have enough room, generate the new texture
|
|
@@ -696,7 +703,10 @@
|
|
t->lastDrawTime = *tmd_ticks;
|
|
|
|
if (isDirty) {
|
|
- glPixelStorei(GL_UNPACK_ROW_LENGTH, bm->row);
|
|
+ // Same fix as opengl_cache_texture() above - t->converted->pixels is
|
|
+ // what's actually uploaded, so its own pitch is what
|
|
+ // GL_UNPACK_ROW_LENGTH needs to describe, not bm->row.
|
|
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, t->converted->pitch / 4);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bm->w, bm->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, t->converted->pixels);
|
|
}
|
|
}
|