From 81e88e79e4659f35c5862d75bda47008dd849e02 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Tue, 16 Sep 2025 00:30:29 +0200 Subject: [PATCH 01/11] tr_image: extend internal image detection --- src/engine/renderer/tr_image.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index bdbe237f89..abf7bce550 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -1819,11 +1819,20 @@ image_t *R_FindImageFile( const char *imageName, imageParams_t &imageParams ) } // Built-in images can't be reloaded with different parameters, so return them as-is. - // For most of the usable ones e.g. _white, parameters wouldn't make a difference anyway. + // For most of the usable ones e.g. $white, parameters wouldn't make a difference anyway. // HACK: detect built-in images by naming convention, though nothing stops users from using such names - if ( image->name[ 0 ] == '_' && !strchr( image->name, '/' ) ) + switch ( image->name[ 0 ] ) { - return image; + case '_': + case '*': + case '$': + if ( !strchr( image->name, '/' ) ) + { + return image; + } + break; + default: + break; } bool compatible = false; From d8023261918c49a9cd8d2b0e57ad6547bdd7f63b Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Mon, 8 Sep 2025 20:22:34 +0200 Subject: [PATCH 02/11] tr_image: do not rely on previously set data for cinematic, numberize and rename as *name --- src/engine/renderer/tr_image.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index abf7bce550..054c9fbfaf 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2700,9 +2700,14 @@ void R_CreateBuiltinImages() imageParams.bits = IF_NOPICMIP; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; + // Don't reuse previously set data, we test the values for selecting the upload format. + memset( data, 255, sizeof( data ) ); + + size_t numCinematicImages = 0; for ( image_t * &image : tr.cinematicImage ) { - image = R_CreateImage( "_cinematic", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + std::string name = Str::Format( "*cinematic%d", numCinematicImages++ ); + image = R_CreateImage( name.c_str(), ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); } R_CreateContrastRenderFBOImage(); From 3bb45212cdffb8a3c9ce6f335077d174d69d1ca1 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sun, 14 Sep 2025 23:09:28 +0200 Subject: [PATCH 03/11] =?UTF-8?q?tr=5Fimage:=20resize=20builtin=20images?= =?UTF-8?q?=20as=201=C3=971?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/engine/renderer/tr_image.cpp | 43 +++++++++----------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 054c9fbfaf..8155479730 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2636,11 +2636,8 @@ R_CreateBuiltinImages */ void R_CreateBuiltinImages() { - constexpr int DIMENSION = 8; - int x; - byte data[ DIMENSION * DIMENSION * 4 ]; + byte data[ 1 * 1 * 4 ]; byte *dataPtr = data; - byte *out; R_CreateDefaultImage(); @@ -2652,50 +2649,34 @@ void R_CreateBuiltinImages() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_REPEAT; - tr.whiteImage = R_CreateImage( "_white", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + tr.whiteImage = R_CreateImage( "_white", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // we use a solid black image instead of disabling texturing memset( data, 0, sizeof( data ) ); - tr.blackImage = R_CreateImage( "_black", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + + tr.blackImage = R_CreateImage( "_black", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // red - for ( x = DIMENSION * DIMENSION, out = data; x; --x, out += 4 ) - { - out[ 1 ] = out[ 2 ] = 0; - out[ 0 ] = out[ 3 ] = 255; - } + Vector4Set( data, 255, 0, 0, 255 ); - tr.redImage = R_CreateImage( "_red", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + tr.redImage = R_CreateImage( "_red", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // green - for ( x = DIMENSION * DIMENSION, out = data; x; --x, out += 4 ) - { - out[ 0 ] = out[ 2 ] = 0; - out[ 1 ] = out[ 3 ] = 255; - } + Vector4Set( data, 0, 255, 0, 255 ); - tr.greenImage = R_CreateImage( "_green", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + tr.greenImage = R_CreateImage( "_green", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // blue - for ( x = DIMENSION * DIMENSION, out = data; x; --x, out += 4 ) - { - out[ 0 ] = out[ 1 ] = 0; - out[ 2 ] = out[ 3 ] = 255; - } + Vector4Set( data, 0, 0, 255, 255 ); - tr.blueImage = R_CreateImage( "_blue", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + tr.blueImage = R_CreateImage( "_blue", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // generate a default normalmap with a fully opaque heightmap (no displacement) - for ( x = DIMENSION * DIMENSION, out = data; x; --x, out += 4 ) - { - out[ 0 ] = out[ 1 ] = 128; - out[ 2 ] = 255; - out[ 3 ] = 255; - } + Vector4Set( data, 128, 128, 255, 255 ); imageParams.bits = IF_NOPICMIP | IF_NORMALMAP; - tr.flatImage = R_CreateImage( "_flat", ( const byte ** ) &dataPtr, DIMENSION, DIMENSION, 1, imageParams ); + tr.flatImage = R_CreateImage( "_flat", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); imageParams.bits = IF_NOPICMIP; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; From 774dee44c85d8b51349cab6b76a3aca977139490 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sun, 14 Sep 2025 23:28:23 +0200 Subject: [PATCH 04/11] renderer: simplify builtin color image name parsing, rename as $name, forget about unused aliases --- src/engine/renderer/tr_image.cpp | 12 ++++++------ src/engine/renderer/tr_shader.cpp | 15 +++++---------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 8155479730..4d6a458892 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2649,34 +2649,34 @@ void R_CreateBuiltinImages() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_REPEAT; - tr.whiteImage = R_CreateImage( "_white", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.whiteImage = R_CreateImage( "$white", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // we use a solid black image instead of disabling texturing memset( data, 0, sizeof( data ) ); - tr.blackImage = R_CreateImage( "_black", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.blackImage = R_CreateImage( "$black", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // red Vector4Set( data, 255, 0, 0, 255 ); - tr.redImage = R_CreateImage( "_red", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.redImage = R_CreateImage( "$red", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // green Vector4Set( data, 0, 255, 0, 255 ); - tr.greenImage = R_CreateImage( "_green", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.greenImage = R_CreateImage( "$green", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // blue Vector4Set( data, 0, 0, 255, 255 ); - tr.blueImage = R_CreateImage( "_blue", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.blueImage = R_CreateImage( "$blue", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // generate a default normalmap with a fully opaque heightmap (no displacement) Vector4Set( data, 128, 128, 255, 255 ); imageParams.bits = IF_NOPICMIP | IF_NORMALMAP; - tr.flatImage = R_CreateImage( "_flat", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); + tr.flatImage = R_CreateImage( "$flat", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); imageParams.bits = IF_NOPICMIP; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; diff --git a/src/engine/renderer/tr_shader.cpp b/src/engine/renderer/tr_shader.cpp index 13116c89e6..647eae66c6 100644 --- a/src/engine/renderer/tr_shader.cpp +++ b/src/engine/renderer/tr_shader.cpp @@ -1429,24 +1429,19 @@ static bool LoadMap( shaderStage_t *stage, const char *buffer, stageType_t type, return true; } - if ( !Q_stricmp( token, "$whiteimage" ) || !Q_stricmp( token, "$white" ) || !Q_stricmp( token, "_white" ) || - !Q_stricmp( token, "*white" ) ) + // Quake III backward compatibility. + if ( !Q_stricmp( token, "$whiteimage" ) || !Q_stricmp( token, "*white" ) ) { stage->bundle[ bundleIndex ].image[ 0 ] = tr.whiteImage; return true; } - else if ( !Q_stricmp( token, "$blackimage" ) || !Q_stricmp( token, "$black" ) || !Q_stricmp( token, "_black" ) || - !Q_stricmp( token, "*black" ) ) + + // Other engine compatibility (old XeaL, QFusion…) + if ( !Q_stricmp( token, "$blackimage" ) || !Q_stricmp( token, "*black" ) ) { stage->bundle[ bundleIndex ].image[ 0 ] = tr.blackImage; return true; } - else if ( !Q_stricmp( token, "$flatimage" ) || !Q_stricmp( token, "$flat" ) || !Q_stricmp( token, "_flat" ) || - !Q_stricmp( token, "*flat" ) ) - { - stage->bundle[ bundleIndex ].image[ 0 ] = tr.flatImage; - return true; - } else if ( !Q_stricmp( token, "$lightmap" ) ) { From b2e519d60ba1b76e9f5157af573f569c1314fd64 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Tue, 16 Sep 2025 00:22:38 +0200 Subject: [PATCH 05/11] tr_image: rename framebuffer images as *name --- src/engine/renderer/tr_image.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 4d6a458892..798d1c1658 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2410,7 +2410,7 @@ static void R_CreateContrastRenderFBOImage() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.contrastRenderFBOImage = R_CreateImage( "_contrastRenderFBO", nullptr, width, height, 1, imageParams ); + tr.contrastRenderFBOImage = R_CreateImage( "*contrastRenderFBO", nullptr, width, height, 1, imageParams ); } static void R_CreateBloomRenderFBOImages() @@ -2430,7 +2430,7 @@ static void R_CreateBloomRenderFBOImages() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.bloomRenderFBOImage[i] = R_CreateImage( va( "_bloomRenderFBO%d", i ), nullptr, width, height, 1, imageParams ); + tr.bloomRenderFBOImage[i] = R_CreateImage( va( "*bloomRenderFBO%d", i ), nullptr, width, height, 1, imageParams ); } } @@ -2465,15 +2465,15 @@ static void R_CreateCurrentRenderImage() imageParams.filterType = filterType_t::FT_NEAREST; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.currentRenderImage[0] = R_CreateImage( "_currentRender[0]", nullptr, width, height, 1, imageParams ); - tr.currentRenderImage[1] = R_CreateImage( "_currentRender[1]", nullptr, width, height, 1, imageParams ); + tr.currentRenderImage[0] = R_CreateImage( "*currentRender0", nullptr, width, height, 1, imageParams ); + tr.currentRenderImage[1] = R_CreateImage( "*currentRender1", nullptr, width, height, 1, imageParams ); imageParams = {}; imageParams.bits = IF_NOPICMIP | IF_PACKED_DEPTH24_STENCIL8; imageParams.filterType = filterType_t::FT_NEAREST; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.currentDepthImage = R_CreateImage( "_currentDepth", nullptr, width, height, 1, imageParams ); + tr.currentDepthImage = R_CreateImage( "*currentDepth", nullptr, width, height, 1, imageParams ); if ( glConfig.usingMaterialSystem ) { materialSystem.GenerateDepthImages( width, height, imageParams ); @@ -2503,18 +2503,18 @@ static void R_CreateDepthRenderImage() imageParams.bits = IF_NOPICMIP; imageParams.bits |= r_highPrecisionRendering.Get() ? IF_TWOCOMP32F : IF_TWOCOMP16F; - tr.depthtile1RenderImage = R_CreateImage( "_depthtile1Render", nullptr, w, h, 1, imageParams ); + tr.depthtile1RenderImage = R_CreateImage( "*depthtile1Render", nullptr, w, h, 1, imageParams ); w = (width + TILE_SIZE - 1) >> TILE_SHIFT; h = (height + TILE_SIZE - 1) >> TILE_SHIFT; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.depthtile2RenderImage = R_CreateImage( "_depthtile2Render", nullptr, w, h, 1, imageParams ); + tr.depthtile2RenderImage = R_CreateImage( "*depthtile2Render", nullptr, w, h, 1, imageParams ); imageParams.bits = IF_NOPICMIP | IF_RGBA32UI; - tr.lighttileRenderImage = R_Create3DImage( "_lighttileRender", nullptr, w, h, glConfig.realtimeLightLayers, imageParams ); + tr.lighttileRenderImage = R_Create3DImage( "*lighttileRender", nullptr, w, h, glConfig.realtimeLightLayers, imageParams ); } } @@ -2535,7 +2535,7 @@ static void R_CreatePortalRenderImage() imageParams.filterType = filterType_t::FT_NEAREST; imageParams.wrapType = wrapTypeEnum_t::WT_CLAMP; - tr.portalRenderImage = R_CreateImage( "_portalRender", nullptr, width, height, 1, imageParams ); + tr.portalRenderImage = R_CreateImage( "*portalRender", nullptr, width, height, 1, imageParams ); } // *INDENT-OFF* From 2707d5a3bcfd1f814bbc9e9b2c5c1355fcfcb270 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Tue, 16 Sep 2025 00:23:45 +0200 Subject: [PATCH 06/11] tr_image: rename remaining builtin images as $name --- src/engine/renderer/tr_image.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 798d1c1658..205058497f 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2392,7 +2392,7 @@ static void R_CreateDefaultImage() imageParams.filterType = filterType_t::FT_DEFAULT; imageParams.wrapType = wrapTypeEnum_t::WT_REPEAT; - tr.defaultImage = R_CreateImage( "_default", ( const byte ** ) &dataPtr, DEFAULT_SIZE, DEFAULT_SIZE, 1, imageParams ); + tr.defaultImage = R_CreateImage( "$default", ( const byte ** ) &dataPtr, DEFAULT_SIZE, DEFAULT_SIZE, 1, imageParams ); } static void R_CreateContrastRenderFBOImage() @@ -2555,7 +2555,7 @@ static void R_CreateBlackCubeImage() imageParams.wrapType = wrapTypeEnum_t::WT_EDGE_CLAMP; const byte *dataPtrs[ 6 ] = { data, data, data, data, data, data }; - tr.blackCubeImage = R_CreateCubeImage( "_blackCube", dataPtrs, width, height, imageParams ); + tr.blackCubeImage = R_CreateCubeImage( "$blackCube", dataPtrs, width, height, imageParams ); } // *INDENT-ON* @@ -2581,7 +2581,7 @@ static void R_CreateWhiteCubeImage() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_EDGE_CLAMP; - tr.whiteCubeImage = R_CreateCubeImage( "_whiteCube", ( const byte ** ) data, width, height, imageParams ); + tr.whiteCubeImage = R_CreateCubeImage( "$whiteCube", ( const byte ** ) data, width, height, imageParams ); for ( i = 5; i >= 0; i-- ) { @@ -2624,7 +2624,7 @@ static void R_CreateColorGradeImage() imageParams.filterType = filterType_t::FT_LINEAR; imageParams.wrapType = wrapTypeEnum_t::WT_EDGE_CLAMP; - tr.colorGradeImage = R_Create3DImage( "_colorGrade", data, REF_COLORGRADEMAP_SIZE, REF_COLORGRADEMAP_SIZE, REF_COLORGRADE_SLOTS * REF_COLORGRADEMAP_SIZE, imageParams ); + tr.colorGradeImage = R_Create3DImage( "$colorGrade", data, REF_COLORGRADEMAP_SIZE, REF_COLORGRADEMAP_SIZE, REF_COLORGRADE_SLOTS * REF_COLORGRADEMAP_SIZE, imageParams ); ri.Hunk_FreeTempMemory( data ); } From bc0107e8fc94974ba5ade586511d0195712add85 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Tue, 16 Sep 2025 17:11:26 +0200 Subject: [PATCH 07/11] tr_image: rename generated textures as *name --- src/engine/renderer/tr_image.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 205058497f..ee92928f0b 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2850,7 +2850,7 @@ qhandle_t RE_GenerateTexture( const byte *pic, int width, int height ) { R_SyncRenderThread(); - std::string name = Str::Format( "$generatedTexture%d", tr.numGeneratedTextures++ ); + std::string name = Str::Format( "*generatedTexture%d", tr.numGeneratedTextures++ ); imageParams_t imageParams = {}; imageParams.bits = IF_NOPICMIP; From 7e9cf8809e1792de818b9815553bdd1044216567 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 18 Sep 2025 00:57:25 +0200 Subject: [PATCH 08/11] tr_image: make the $black builtin image opaque --- src/engine/renderer/tr_image.cpp | 2 +- src/engine/renderer/tr_local.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index ee92928f0b..6b2bca21a0 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2652,7 +2652,7 @@ void R_CreateBuiltinImages() tr.whiteImage = R_CreateImage( "$white", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); // we use a solid black image instead of disabling texturing - memset( data, 0, sizeof( data ) ); + Vector4Set( data, 0, 0, 0, 255 ); tr.blackImage = R_CreateImage( "$black", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 231015c716..8e0bed566a 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -2445,7 +2445,7 @@ enum image_t *defaultImage; image_t *cinematicImage[ MAX_IN_GAME_VIDEOS ]; image_t *whiteImage; // full of 0xff - image_t *blackImage; // full of 0x0 + image_t *blackImage; // 0x0 color channels, 0xff alpha channel image_t *redImage; image_t *greenImage; image_t *blueImage; From 08c8c41c6c5b2194f1ba647bdb31812772747720 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 18 Sep 2025 00:57:48 +0200 Subject: [PATCH 09/11] tr_image: NUKE the $red, $green and $blue builtin images --- src/engine/renderer/tr_image.cpp | 15 --------------- src/engine/renderer/tr_local.h | 3 --- 2 files changed, 18 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 6b2bca21a0..644ee7c8c6 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -2656,21 +2656,6 @@ void R_CreateBuiltinImages() tr.blackImage = R_CreateImage( "$black", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); - // red - Vector4Set( data, 255, 0, 0, 255 ); - - tr.redImage = R_CreateImage( "$red", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); - - // green - Vector4Set( data, 0, 255, 0, 255 ); - - tr.greenImage = R_CreateImage( "$green", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); - - // blue - Vector4Set( data, 0, 0, 255, 255 ); - - tr.blueImage = R_CreateImage( "$blue", ( const byte ** ) &dataPtr, 1, 1, 1, imageParams ); - // generate a default normalmap with a fully opaque heightmap (no displacement) Vector4Set( data, 128, 128, 255, 255 ); diff --git a/src/engine/renderer/tr_local.h b/src/engine/renderer/tr_local.h index 8e0bed566a..d97ef87f3a 100644 --- a/src/engine/renderer/tr_local.h +++ b/src/engine/renderer/tr_local.h @@ -2446,9 +2446,6 @@ enum image_t *cinematicImage[ MAX_IN_GAME_VIDEOS ]; image_t *whiteImage; // full of 0xff image_t *blackImage; // 0x0 color channels, 0xff alpha channel - image_t *redImage; - image_t *greenImage; - image_t *blueImage; image_t *flatImage; // use this as default normalmap image_t *blackCubeImage; image_t *whiteCubeImage; From 1d93ff30e5c375453b623264a517bf4cd5eef25e Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 17:43:19 +0200 Subject: [PATCH 10/11] tr_image: drop the _name builtin image detection as this convention isn't used anymore Also drop the check for / as files cannot have a * or $ in their names. --- src/engine/renderer/tr_image.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 644ee7c8c6..1f93a5fd51 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -1820,16 +1820,12 @@ image_t *R_FindImageFile( const char *imageName, imageParams_t &imageParams ) // Built-in images can't be reloaded with different parameters, so return them as-is. // For most of the usable ones e.g. $white, parameters wouldn't make a difference anyway. - // HACK: detect built-in images by naming convention, though nothing stops users from using such names + // Detect built-in images by naming convention. switch ( image->name[ 0 ] ) { - case '_': case '*': case '$': - if ( !strchr( image->name, '/' ) ) - { - return image; - } + return image; break; default: break; From 0fbfbd1e9a3e53942548330a1f5fc5aa39f0ba02 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Fri, 26 Sep 2025 19:55:14 +0200 Subject: [PATCH 11/11] tr_image: add comment about image *name and $name --- src/engine/renderer/tr_image.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/engine/renderer/tr_image.cpp b/src/engine/renderer/tr_image.cpp index 1f93a5fd51..d6b24472ab 100644 --- a/src/engine/renderer/tr_image.cpp +++ b/src/engine/renderer/tr_image.cpp @@ -1823,7 +1823,9 @@ image_t *R_FindImageFile( const char *imageName, imageParams_t &imageParams ) // Detect built-in images by naming convention. switch ( image->name[ 0 ] ) { + // Private images not meant to be reused (like framebuffers, UI-generated images…). case '*': + // Public images reusable by the user, like $white that can be used in .shader files. case '$': return image; break;