diff --git a/neo/renderer/Image.h b/neo/renderer/Image.h index b4fb1a6c..182a1592 100644 --- a/neo/renderer/Image.h +++ b/neo/renderer/Image.h @@ -548,6 +548,7 @@ public: idImage* alphaNotchImage; // 2x1 texture with just 1110 and 1111 with point sampling idImage* whiteImage; // full of 0xff idImage* blackImage; // full of 0x00 + idImage* cyanImage; // cyan idImage* noFalloffImage; // all 255, but zero clamped idImage* fogImage; // increasing alpha is denser fog idImage* fogEnterImage; // adjust fogImage alpha based on terminator plane @@ -577,6 +578,8 @@ public: idImage* hierarchicalZbufferImage; // zbuffer with mip maps to accelerate screen space ray tracing idImage* imguiFontImage; + idImage* chromeSpecImage; // only for the PBR color checker chart + idImage* plasticSpecImage; // only for the PBR color checker chart idImage* brdfLutImage; idImage* defaultUACIrradianceCube; idImage* defaultUACRadianceCube; diff --git a/neo/renderer/Image_intrinsic.cpp b/neo/renderer/Image_intrinsic.cpp index b983acfd..87f0f6bd 100644 --- a/neo/renderer/Image_intrinsic.cpp +++ b/neo/renderer/Image_intrinsic.cpp @@ -136,6 +136,60 @@ static void R_BlackImage( idImage* image ) TF_DEFAULT, TR_REPEAT, TD_DEFAULT ); } +static void R_CyanImage( idImage* image ) +{ + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + for( int x = 0; x < DEFAULT_SIZE; x++ ) + { + for( int y = 0; y < DEFAULT_SIZE; y++ ) + { + data[y][x][0] = byte( colorCyan.x * 255 ); + data[y][x][1] = byte( colorCyan.y * 255 ); + data[y][x][2] = byte( colorCyan.z * 255 ); + data[y][x][3] = byte( colorCyan.w * 255 ); + } + } + + image->GenerateImage( ( byte* )data, DEFAULT_SIZE, DEFAULT_SIZE, TF_DEFAULT, TR_REPEAT, TD_DIFFUSE ); +} + +static void R_ChromeSpecImage( idImage* image ) +{ + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + for( int x = 0; x < DEFAULT_SIZE; x++ ) + { + for( int y = 0; y < DEFAULT_SIZE; y++ ) + { + data[y][x][0] = 0; + data[y][x][1] = 255; + data[y][x][2] = 255; + data[y][x][3] = 255; + } + } + + image->GenerateImage( ( byte* )data, DEFAULT_SIZE, DEFAULT_SIZE, TF_DEFAULT, TR_REPEAT, TD_SPECULAR_PBR_RMAO ); +} + +static void R_PlasticSpecImage( idImage* image ) +{ + byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; + + for( int x = 0; x < DEFAULT_SIZE; x++ ) + { + for( int y = 0; y < DEFAULT_SIZE; y++ ) + { + data[y][x][0] = 0; + data[y][x][1] = 0; + data[y][x][2] = 255; + data[y][x][3] = 255; + } + } + + image->GenerateImage( ( byte* )data, DEFAULT_SIZE, DEFAULT_SIZE, TF_DEFAULT, TR_REPEAT, TD_SPECULAR_PBR_RMAO ); +} + static void R_RGBA8Image( idImage* image ) { byte data[DEFAULT_SIZE][DEFAULT_SIZE][4]; @@ -877,6 +931,7 @@ void idImageManager::CreateIntrinsicImages() defaultImage = ImageFromFunction( "_default", R_DefaultImage ); whiteImage = ImageFromFunction( "_white", R_WhiteImage ); blackImage = ImageFromFunction( "_black", R_BlackImage ); + cyanImage = ImageFromFunction( "_cyan", R_CyanImage ); flatNormalMap = ImageFromFunction( "_flat", R_FlatNormalImage ); alphaNotchImage = ImageFromFunction( "_alphaNotch", R_AlphaNotchImage ); fogImage = ImageFromFunction( "_fog", R_FogImage ); @@ -929,7 +984,9 @@ void idImageManager::CreateIntrinsicImages() imguiFontImage = ImageFromFunction( "_imguiFont", R_CreateImGuiFontImage ); - brdfLutImage = globalImages->ImageFromFunction( "_brdfLut", R_CreateBrdfLutImage ); + chromeSpecImage = ImageFromFunction( "_chromeSpec", R_ChromeSpecImage ); + plasticSpecImage = ImageFromFunction( "_plasticSpec", R_PlasticSpecImage ); + brdfLutImage = ImageFromFunction( "_brdfLut", R_CreateBrdfLutImage ); // RB end // scratchImage is used for screen wipes/doublevision etc.. diff --git a/neo/renderer/Material.cpp b/neo/renderer/Material.cpp index d8905646..d128fdd3 100644 --- a/neo/renderer/Material.cpp +++ b/neo/renderer/Material.cpp @@ -2512,6 +2512,17 @@ void idMaterial::ParseMaterial( idLexer& src ) newSrc.FreeSource(); continue; } + // RB: rmaomap for stage shortcut + else if( !token.Icmp( "rmaomap" ) || !token.Icmp( "reflectionmap" ) || !token.Icmp( "pbrmap" ) ) + { + str = R_ParsePastImageProgram( src ); + idStr::snPrintf( buffer, sizeof( buffer ), "blend rmaomap\nmap %s\n}\n", str ); + newSrc.LoadMemory( buffer, strlen( buffer ), "rmaomap" ); + newSrc.SetFlags( LEXFL_NOFATALERRORS | LEXFL_NOSTRINGCONCAT | LEXFL_NOSTRINGESCAPECHARS | LEXFL_ALLOWPATHNAMES ); + ParseStage( newSrc, trpDefault ); + newSrc.FreeSource(); + continue; + } // normalmap for stage shortcut else if( !token.Icmp( "bumpmap" ) || !token.Icmp( "normalmap" ) ) {