From ff80ddaf8634508dcf93516bacc4e65af881269f Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 20 Jul 2025 11:29:43 +0200 Subject: [PATCH 1/4] Fix incorrect order of LcdScreenEffect_s members waveOffset comes before waveScale. --- src/assets/lcd_screen_effect.cpp | 2 +- src/public/lcd_screen_effect.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/lcd_screen_effect.cpp b/src/assets/lcd_screen_effect.cpp index 74856631..6d85682a 100644 --- a/src/assets/lcd_screen_effect.cpp +++ b/src/assets/lcd_screen_effect.cpp @@ -25,8 +25,8 @@ static void LcdScreenEffect_InternalAddRLCD(CPakFileBuilder* const pak, const Pa rlcd->contrast = JSON_GetNumberRequired(document, "contrast"); // Shutter banding effects. - rlcd->waveScale = JSON_GetNumberRequired(document, "waveScale"); rlcd->waveOffset = JSON_GetNumberRequired(document, "waveOffset"); + rlcd->waveScale = JSON_GetNumberRequired(document, "waveScale"); rlcd->waveSpeed = JSON_GetNumberRequired(document, "waveSpeed"); rlcd->wavePeriod = JSON_GetNumberRequired(document, "wavePeriod"); diff --git a/src/public/lcd_screen_effect.h b/src/public/lcd_screen_effect.h index 051588c2..22f6581f 100644 --- a/src/public/lcd_screen_effect.h +++ b/src/public/lcd_screen_effect.h @@ -7,8 +7,8 @@ struct LcdScreenEffect_s float pixelScaleY; float brightness; float contrast; - float waveScale; float waveOffset; + float waveScale; float waveSpeed; float wavePeriod; float bloomAdd; From d7842d0e102abb75e699beab8f088942de079e33 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 20 Jul 2025 11:35:14 +0200 Subject: [PATCH 2/4] Material samplers is 64-bit Engine reads it out as 64-bit, write it as 64-bit. --- src/assets/material.cpp | 6 +++--- src/public/material.h | 14 +++----------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/assets/material.cpp b/src/assets/material.cpp index c4546f4c..71185987 100644 --- a/src/assets/material.cpp +++ b/src/assets/material.cpp @@ -416,6 +416,9 @@ void MaterialAsset_t::FromJSON(const rapidjson::Value& mapEntry) // used for blend materials and the like this->surface2 = JSON_GetValueRequired(mapEntry, "surfaceProp2"); + // Set samplers properly. Responsible for texture stretching, tiling etc. + *(uint64_t*)this->samplers = JSON_GetNumberRequired(mapEntry, "samplers"); + // This seems to be set on all materials, i haven't it being used yet in // the engine by hardware breakpointing it. but given that it was // preinitialized in the pak file, and the possible fact that various @@ -423,9 +426,6 @@ void MaterialAsset_t::FromJSON(const rapidjson::Value& mapEntry) // provided by the user. this->features = JSON_GetNumberRequired(mapEntry, "features"); - // Set samplers properly. Responsible for texture stretching, tiling etc. - *(uint32_t*)this->samplers = JSON_GetNumberRequired(mapEntry, "samplers"); - Material_SetDXStates(mapEntry, dxStates); } diff --git a/src/public/material.h b/src/public/material.h index ce577d9a..42c867ac 100644 --- a/src/public/material.h +++ b/src/public/material.h @@ -464,10 +464,7 @@ struct __declspec(align(16)) MaterialAssetHeader_v12_t PagePtr_t streamingTextureHandles; // Streamable TextureGUID Map short numStreamingTextureHandles; // Number of textures with streamed mip levels. - char samplers[4]; // 0x503000 - - short unk_AE; - uint64_t unk_B0; // haven't observed anything here. + char samplers[8]; // 0x503000 // seems to be 0xFBA63181 for loadscreens uint32_t features; // no clue tbh, 0xFBA63181 @@ -514,9 +511,7 @@ struct __declspec(align(16)) MaterialAssetHeader_v15_t // array of indices into sampler states array. must be set properly to have accurate texture tiling // used in CShaderGlue::SetupShader (1403B3C60) - char samplers[4];// = 0x1D0300; - - uint32_t unk_7C; + char samplers[8];// = 0x1D0300; // most materials have this set as '0x1F5A92BD', PTCS/PTCU // materials have it set as 0x75C8DF6F typically, and in @@ -568,11 +563,9 @@ struct MaterialAsset_t short height; short depth; - uint32_t unk_7C; + char samplers[8]; uint32_t features; // 0x1F5A92BD, REQUIRED but why? - char samplers[4]; - uint32_t flags; uint32_t flags2; @@ -652,7 +645,6 @@ struct MaterialAsset_t matl->height = this->height; matl->depth = this->depth; - matl->unk_7C = this->unk_7C; matl->features = this->features; memcpy(matl->samplers, this->samplers, sizeof(matl->samplers)); From db03646b1f35e1cacf151cc5656c77fed7271d1a Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Mon, 11 Aug 2025 11:05:24 +0200 Subject: [PATCH 3/4] Rename LCD screen effect field based on shader field name Used for bloom luminance. --- src/assets/lcd_screen_effect.cpp | 2 +- src/public/lcd_screen_effect.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/lcd_screen_effect.cpp b/src/assets/lcd_screen_effect.cpp index 6d85682a..be25de85 100644 --- a/src/assets/lcd_screen_effect.cpp +++ b/src/assets/lcd_screen_effect.cpp @@ -32,7 +32,7 @@ static void LcdScreenEffect_InternalAddRLCD(CPakFileBuilder* const pak, const Pa // Noise effects. rlcd->bloomAdd = JSON_GetNumberRequired(document, "bloomAdd"); - rlcd->reserved = JSON_GetNumberOrDefault(document, "reserved", 0u); + rlcd->doBloomLuminance = JSON_GetValueRequired(document, "doBloomLuminance"); rlcd->pixelFlicker = JSON_GetNumberRequired(document, "pixelFlicker"); asset.InitAsset(hdrLump.GetPointer(), sizeof(LcdScreenEffect_s), PagePtr_t::NullPtr(), RLCD_VERSION, AssetType::RLCD); diff --git a/src/public/lcd_screen_effect.h b/src/public/lcd_screen_effect.h index 22f6581f..611b78a1 100644 --- a/src/public/lcd_screen_effect.h +++ b/src/public/lcd_screen_effect.h @@ -12,6 +12,6 @@ struct LcdScreenEffect_s float waveSpeed; float wavePeriod; float bloomAdd; - uint32_t reserved; // [amos]: always 0 and appears to do nothing in the runtime. + bool doBloomLuminance; float pixelFlicker; }; From 42fdca73aaf48ffe1eed045402eeb22a5972dfbe Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 12 Aug 2025 00:21:56 +0200 Subject: [PATCH 4/4] Fix regression for Material V12 Material V12's output data was incorrect after the change in d7842d0e102abb75e699beab8f088942de079e33. Revert this for now (it is currently also unknown whether V12 has 4 or 8 samplers, but only 4 are ever filled on all observed materials so reverting to that, as V12 also uses 4 blend states instead of 8 like V15 does, so its very likely it also only has 4 samplers). --- src/assets/material.cpp | 5 ++++- src/public/material.h | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/assets/material.cpp b/src/assets/material.cpp index 71185987..62e3bd8e 100644 --- a/src/assets/material.cpp +++ b/src/assets/material.cpp @@ -417,7 +417,10 @@ void MaterialAsset_t::FromJSON(const rapidjson::Value& mapEntry) this->surface2 = JSON_GetValueRequired(mapEntry, "surfaceProp2"); // Set samplers properly. Responsible for texture stretching, tiling etc. - *(uint64_t*)this->samplers = JSON_GetNumberRequired(mapEntry, "samplers"); + if (assetVersion == 12) + *(uint32_t*)this->samplers = JSON_GetNumberRequired(mapEntry, "samplers"); + else // 15 uses 8 samplers, which is 64 bits total. + *(uint64_t*)this->samplers = JSON_GetNumberRequired(mapEntry, "samplers"); // This seems to be set on all materials, i haven't it being used yet in // the engine by hardware breakpointing it. but given that it was diff --git a/src/public/material.h b/src/public/material.h index 42c867ac..dee5007a 100644 --- a/src/public/material.h +++ b/src/public/material.h @@ -464,7 +464,10 @@ struct __declspec(align(16)) MaterialAssetHeader_v12_t PagePtr_t streamingTextureHandles; // Streamable TextureGUID Map short numStreamingTextureHandles; // Number of textures with streamed mip levels. - char samplers[8]; // 0x503000 + char samplers[4]; // 0x503000 + + short unk_AE; + uint64_t unk_B0; // haven't observed anything here. // seems to be 0xFBA63181 for loadscreens uint32_t features; // no clue tbh, 0xFBA63181