From 336c9d8d862f23aa45d6b3faefdc6dac9ad2b0c2 Mon Sep 17 00:00:00 2001 From: njohnson Date: Mon, 11 May 2026 14:55:04 -0400 Subject: [PATCH] Fix LMAP parsing and don't resolve till after ptr is ready. --- .../Game/IW3/LightDef/LightDefLoaderIW3.cpp | 5 ++-- .../Game/IW4/LightDef/LightDefLoaderIW4.cpp | 6 ++--- .../Game/IW5/LightDef/LightDefLoaderIW5.cpp | 24 ++++++++----------- .../Game/T5/LightDef/LightDefLoaderT5.cpp | 11 ++++----- .../Game/T6/LightDef/LightDefLoaderT6.cpp | 11 ++++----- .../Game/IW3/LightDef/LightDefDumperIW3.cpp | 12 +++++++--- .../Game/IW4/LightDef/LightDefDumperIW4.cpp | 14 ++++++++--- .../Game/IW5/LightDef/LightDefDumperIW5.cpp | 16 ++++++++++--- .../Game/T5/LightDef/LightDefDumperT5.cpp | 14 ++++++++--- .../Game/T6/LightDef/LightDefDumperT6.cpp | 14 ++++++++--- 10 files changed, 79 insertions(+), 48 deletions(-) diff --git a/src/ObjLoading/Game/IW3/LightDef/LightDefLoaderIW3.cpp b/src/ObjLoading/Game/IW3/LightDef/LightDefLoaderIW3.cpp index 17bd0d19..b060b7c8 100644 --- a/src/ObjLoading/Game/IW3/LightDef/LightDefLoaderIW3.cpp +++ b/src/ObjLoading/Game/IW3/LightDef/LightDefLoaderIW3.cpp @@ -32,13 +32,10 @@ namespace auto* lightDef = m_memory.Alloc(); lightDef->name = m_memory.Dup(assetName.c_str()); - context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); - AssetRegistration registration(assetName, lightDef); std::string imageName; int8_t samplerState; - int8_t lmapLookupStart; file.m_stream->read(reinterpret_cast(&samplerState), sizeof(int8_t)); std::getline(*file.m_stream, imageName, '\0'); @@ -53,6 +50,8 @@ namespace lightDef->attenuation.samplerState = samplerState; lightDef->attenuation.image = imageDependency->Asset(); + context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); + return AssetCreationResult::Success(context.AddAsset(std::move(registration))); } diff --git a/src/ObjLoading/Game/IW4/LightDef/LightDefLoaderIW4.cpp b/src/ObjLoading/Game/IW4/LightDef/LightDefLoaderIW4.cpp index e46f6e52..ef638766 100644 --- a/src/ObjLoading/Game/IW4/LightDef/LightDefLoaderIW4.cpp +++ b/src/ObjLoading/Game/IW4/LightDef/LightDefLoaderIW4.cpp @@ -32,13 +32,10 @@ namespace auto* lightDef = m_memory.Alloc(); lightDef->name = m_memory.Dup(assetName.c_str()); - context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); - AssetRegistration registration(assetName, lightDef); std::string imageName; int8_t samplerState; - int8_t lmapLookupStart; file.m_stream->read(reinterpret_cast(&samplerState), sizeof(int8_t)); std::getline(*file.m_stream, imageName, '\0'); @@ -52,7 +49,8 @@ namespace lightDef->attenuation.samplerState = samplerState; lightDef->attenuation.image = imageDependency->Asset(); - lightDef->lmapLookupStart = static_cast(static_cast(lmapLookupStart)); + + context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); return AssetCreationResult::Success(context.AddAsset(std::move(registration))); } diff --git a/src/ObjLoading/Game/IW5/LightDef/LightDefLoaderIW5.cpp b/src/ObjLoading/Game/IW5/LightDef/LightDefLoaderIW5.cpp index 467dd355..fe0d27ea 100644 --- a/src/ObjLoading/Game/IW5/LightDef/LightDefLoaderIW5.cpp +++ b/src/ObjLoading/Game/IW5/LightDef/LightDefLoaderIW5.cpp @@ -33,8 +33,6 @@ namespace auto* lightDef = m_memory.Alloc(); lightDef->name = m_memory.Dup(assetName.c_str()); - context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); - AssetRegistration registration(assetName, lightDef); int8_t attenuationSamplerState; @@ -55,24 +53,22 @@ namespace std::string cucolorisName; std::getline(*file.m_stream, cucolorisName, '\0'); - auto* cucolorisImageDependency = context.LoadDependency(cucolorisName); - if (!cucolorisImageDependency) - { - con::warn("Could not load GfxLightDef \"{}\" due to missing cucoloris image \"{}\"", assetName, cucolorisName); - } - else + if (!cucolorisName.empty()) { + auto* cucolorisImageDependency = context.LoadDependency(cucolorisName); + if (!cucolorisImageDependency) + { + con::warn("Could not load GfxLightDef \"{}\" due to missing cucoloris image \"{}\"", assetName, cucolorisName); + return AssetCreationResult::Failure(); + } registration.AddDependency(cucolorisImageDependency); + lightDef->cucoloris.image = cucolorisImageDependency->Asset(); } - - int8_t lmapLookupStart; - file.m_stream->read(reinterpret_cast(&lmapLookupStart), sizeof(int8_t)); - lightDef->attenuation.samplerState = attenuationSamplerState; lightDef->attenuation.image = attenuationImageDependency->Asset(); lightDef->cucoloris.samplerState = cucolorisSamplerState; - lightDef->cucoloris.image = cucolorisImageDependency->Asset(); - lightDef->lmapLookupStart = static_cast(static_cast(lmapLookupStart)); + + context.GetZoneAssetCreationState().SetLightDefLookupStart(lightDef, context); return AssetCreationResult::Success(context.AddAsset(std::move(registration))); } diff --git a/src/ObjLoading/Game/T5/LightDef/LightDefLoaderT5.cpp b/src/ObjLoading/Game/T5/LightDef/LightDefLoaderT5.cpp index ea4e4a64..acd68b55 100644 --- a/src/ObjLoading/Game/T5/LightDef/LightDefLoaderT5.cpp +++ b/src/ObjLoading/Game/T5/LightDef/LightDefLoaderT5.cpp @@ -35,20 +35,19 @@ namespace std::string attenuationName; int8_t samplerState; - int8_t lmapLookupStart; file.m_stream->read(reinterpret_cast(&samplerState), sizeof(int8_t)); std::getline(*file.m_stream, attenuationName, '\0'); - auto* imageDependency = context.LoadDependency(imageName); - if (!imageDependency) + auto* attenuationImageDependency = context.LoadDependency(attenuationName); + if (!attenuationImageDependency) { - con::error("Could not load GfxLightDef \"{}\" due to missing image \"{}\"", assetName, imageName); + con::error("Could not load GfxLightDef \"{}\" due to missing attenuation image \"{}\"", assetName, attenuationName); return AssetCreationResult::Failure(); } - registration.AddDependency(imageDependency); + registration.AddDependency(attenuationImageDependency); lightDef->attenuation.samplerState = samplerState; - lightDef->attenuation.image = imageDependency->Asset(); + lightDef->attenuation.image = attenuationImageDependency->Asset(); lightDef->lmapLookupStart = 0; return AssetCreationResult::Success(context.AddAsset(std::move(registration))); diff --git a/src/ObjLoading/Game/T6/LightDef/LightDefLoaderT6.cpp b/src/ObjLoading/Game/T6/LightDef/LightDefLoaderT6.cpp index 3b26ce98..4a59c6a4 100644 --- a/src/ObjLoading/Game/T6/LightDef/LightDefLoaderT6.cpp +++ b/src/ObjLoading/Game/T6/LightDef/LightDefLoaderT6.cpp @@ -35,20 +35,19 @@ namespace std::string attenuationName; int8_t samplerState; - int8_t lmapLookupStart; file.m_stream->read(reinterpret_cast(&samplerState), sizeof(int8_t)); std::getline(*file.m_stream, attenuationName, '\0'); - auto* imageDependency = context.LoadDependency(imageName); - if (!imageDependency) + auto* attenuationImageDependency = context.LoadDependency(attenuationName); + if (!attenuationImageDependency) { - con::error("Could not load GfxLightDef \"{}\" due to missing image \"{}\"", assetName, imageName); + con::error("Could not load GfxLightDef \"{}\" due to missing attenuation image \"{}\"", assetName, attenuationName); return AssetCreationResult::Failure(); } - registration.AddDependency(imageDependency); + registration.AddDependency(attenuationImageDependency); lightDef->attenuation.samplerState = samplerState; - lightDef->attenuation.image = imageDependency->Asset(); + lightDef->attenuation.image = attenuationImageDependency->Asset(); lightDef->lmapLookupStart = 0; return AssetCreationResult::Success(context.AddAsset(std::move(registration))); diff --git a/src/ObjWriting/Game/IW3/LightDef/LightDefDumperIW3.cpp b/src/ObjWriting/Game/IW3/LightDef/LightDefDumperIW3.cpp index 6b116ded..47e45684 100644 --- a/src/ObjWriting/Game/IW3/LightDef/LightDefDumperIW3.cpp +++ b/src/ObjWriting/Game/IW3/LightDef/LightDefDumperIW3.cpp @@ -10,9 +10,15 @@ namespace light_def { const auto* lightDef = asset.Asset(); const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name)); - - if (!assetFile || lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + if (!assetFile) { + con::error("Could not open GfxLightDef file for dumping!"); + return; + } + + if (lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + { + con::error("GfxLightDef attenuation data was invalid!"); return; } @@ -22,6 +28,6 @@ namespace light_def if (imageName[0] == ',') imageName = &imageName[1]; - stream << lightDef->attenuation.samplerState << imageName; + stream << lightDef->attenuation.samplerState << imageName << '\0'; } } // namespace light_def diff --git a/src/ObjWriting/Game/IW4/LightDef/LightDefDumperIW4.cpp b/src/ObjWriting/Game/IW4/LightDef/LightDefDumperIW4.cpp index 3806cddf..208aac0f 100644 --- a/src/ObjWriting/Game/IW4/LightDef/LightDefDumperIW4.cpp +++ b/src/ObjWriting/Game/IW4/LightDef/LightDefDumperIW4.cpp @@ -10,9 +10,17 @@ namespace light_def { const auto* lightDef = asset.Asset(); const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name)); - - if (!assetFile || lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + if (!assetFile) + { + con::error("Could not open GfxLightDef file for dumping!"); return; + } + + if (lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + { + con::error("GfxLightDef attenuation data was invalid!"); + return; + } auto& stream = *assetFile; @@ -20,6 +28,6 @@ namespace light_def if (imageName[0] == ',') imageName = &imageName[1]; - stream << lightDef->attenuation.samplerState << imageName << static_cast(lightDef->lmapLookupStart); + stream << lightDef->attenuation.samplerState << imageName << '\0'; } } // namespace light_def diff --git a/src/ObjWriting/Game/IW5/LightDef/LightDefDumperIW5.cpp b/src/ObjWriting/Game/IW5/LightDef/LightDefDumperIW5.cpp index 7938a813..0b61a8f4 100644 --- a/src/ObjWriting/Game/IW5/LightDef/LightDefDumperIW5.cpp +++ b/src/ObjWriting/Game/IW5/LightDef/LightDefDumperIW5.cpp @@ -13,20 +13,30 @@ namespace light_def const auto* lightDef = asset.Asset(); const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name)); auto& stream = *assetFile; + if (!assetFile) + { + con::error("Could not open GfxLightDef file for dumping!"); + return; + } + + if (lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + { + con::error("GfxLightDef attenuation data was invalid!"); + return; + } - assert(lightDef->attenuation.image != nullptr); const auto* attenuationImageName = lightDef->attenuation.image->name; if (attenuationImageName && attenuationImageName[0] == ',') attenuationImageName = &attenuationImageName[1]; const auto* cucolorisImageName = ""; - if (lightDef->cucoloris.image) + if (lightDef->cucoloris.image && lightDef->cucoloris.image->name) { cucolorisImageName = lightDef->cucoloris.image->name; if (cucolorisImageName && cucolorisImageName[0] == ',') cucolorisImageName = &cucolorisImageName[1]; } - stream << lightDef->attenuation.samplerState << attenuationImageName << '\0' << lightDef->cucoloris.samplerState << cucolorisImageName; + stream << lightDef->attenuation.samplerState << attenuationImageName << '\0' << lightDef->cucoloris.samplerState << cucolorisImageName << '\0'; } } // namespace light_def diff --git a/src/ObjWriting/Game/T5/LightDef/LightDefDumperT5.cpp b/src/ObjWriting/Game/T5/LightDef/LightDefDumperT5.cpp index 386a7646..37572774 100644 --- a/src/ObjWriting/Game/T5/LightDef/LightDefDumperT5.cpp +++ b/src/ObjWriting/Game/T5/LightDef/LightDefDumperT5.cpp @@ -10,9 +10,17 @@ namespace light_def { const auto* lightDef = asset.Asset(); const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name)); - - if (!assetFile || lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + if (!assetFile) + { + con::error("Could not open GfxLightDef file for dumping!"); return; + } + + if (lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + { + con::error("GfxLightDef attenuation data was invalid!"); + return; + } auto& stream = *assetFile; @@ -20,6 +28,6 @@ namespace light_def if (imageName[0] == ',') imageName = &imageName[1]; - stream << lightDef->attenuation.samplerState << imageName << static_cast(lightDef->lmapLookupStart); + stream << lightDef->attenuation.samplerState << imageName << '\0'; } } // namespace light_def diff --git a/src/ObjWriting/Game/T6/LightDef/LightDefDumperT6.cpp b/src/ObjWriting/Game/T6/LightDef/LightDefDumperT6.cpp index f748e408..d3b4f370 100644 --- a/src/ObjWriting/Game/T6/LightDef/LightDefDumperT6.cpp +++ b/src/ObjWriting/Game/T6/LightDef/LightDefDumperT6.cpp @@ -10,9 +10,17 @@ namespace light_def { const auto* lightDef = asset.Asset(); const auto assetFile = context.OpenAssetFile(GetFileNameForAsset(asset.m_name)); - - if (!assetFile || lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + if (!assetFile) + { + con::error("Could not open GfxLightDef file for dumping!"); return; + } + + if (lightDef->attenuation.image == nullptr || lightDef->attenuation.image->name == nullptr) + { + con::error("GfxLightDef attenuation data was invalid!"); + return; + } auto& stream = *assetFile; @@ -20,6 +28,6 @@ namespace light_def if (imageName[0] == ',') imageName = &imageName[1]; - stream << lightDef->attenuation.samplerState << imageName << static_cast(lightDef->lmapLookupStart); + stream << lightDef->attenuation.samplerState << imageName << '\0'; } } // namespace light_def