From e92681914f021cfb43da51b3422f369f814fd3d7 Mon Sep 17 00:00:00 2001 From: njohnson Date: Sat, 2 May 2026 15:29:50 -0400 Subject: [PATCH] Add CreationState to fill in lightdef lookup start. --- .../LightDefAssetCreationStateIW3.cpp | 37 +++++++++++++++++++ .../LightDef/LightDefAssetCreationStateIW3.h | 21 +++++++++++ .../LightDefAssetCreationStateIW4.cpp | 37 +++++++++++++++++++ .../LightDef/LightDefAssetCreationStateIW4.h | 21 +++++++++++ .../LightDefAssetCreationStateIW5.cpp | 37 +++++++++++++++++++ .../LightDef/LightDefAssetCreationStateIW5.h | 21 +++++++++++ 6 files changed, 174 insertions(+) create mode 100644 src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.h create mode 100644 src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.cpp create mode 100644 src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.h create mode 100644 src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.cpp create mode 100644 src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.h diff --git a/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.cpp b/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.cpp new file mode 100644 index 00000000..112144fd --- /dev/null +++ b/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.cpp @@ -0,0 +1,37 @@ +#include "LightDefAssetCreationStateIW3.h" + +#include "Utils/Logging/Log.h" + +using namespace IW3; + +LightDefAssetCreationState::LightDefAssetCreationState() + : m_lmap_pixels_used_for_falloff(0) +{ +} + +void LightDefAssetCreationState::SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context) +{ + const auto* image = lightDef->attenuation.image; + if (!image) + return; + + // We need the actual image to determine the width, so force load it, if it is a reference + if (image->name && image->name[0] == ',') + { + const auto forceLoadedImage = context.ForceLoadDependency(&image->name[1]); + if (!forceLoadedImage) + return; + + image = forceLoadedImage->Asset(); + } + + const int newLmapUsage = image->width + 2; + if (m_lmap_pixels_used_for_falloff + newLmapUsage > MAX_LMAP_USAGE) + { + con::error( + "Total pixel width of all attenuation textures plus 2 border pixels is {} > {}", m_lmap_pixels_used_for_falloff + newLmapUsage, MAX_LMAP_USAGE); + } + + lightDef->lmapLookupStart = m_lmap_pixels_used_for_falloff + 1; + m_lmap_pixels_used_for_falloff += newLmapUsage; +} diff --git a/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.h b/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.h new file mode 100644 index 00000000..324ad65a --- /dev/null +++ b/src/ObjLoading/Game/IW3/LightDef/LightDefAssetCreationStateIW3.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Asset/IZoneAssetCreationState.h" +#include "Asset/AssetCreationContext.h" +#include "Game/IW3/IW3.h" + +namespace IW3 +{ + constexpr auto MAX_LMAP_USAGE = 512; + + class LightDefAssetCreationState : public IZoneAssetCreationState + { + public: + LightDefAssetCreationState(); + + void SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context); + + private: + int m_lmap_pixels_used_for_falloff; + }; +} // namespace diff --git a/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.cpp b/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.cpp new file mode 100644 index 00000000..c811e6a1 --- /dev/null +++ b/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.cpp @@ -0,0 +1,37 @@ +#include "LightDefAssetCreationStateIW4.h" + +#include "Utils/Logging/Log.h" + +using namespace IW4; + +LightDefAssetCreationState::LightDefAssetCreationState() + : m_lmap_pixels_used_for_falloff(0) +{ +} + +void LightDefAssetCreationState::SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context) +{ + const auto* image = lightDef->attenuation.image; + if (!image) + return; + + // We need the actual image to determine the width, so force load it, if it is a reference + if (image->name && image->name[0] == ',') + { + const auto forceLoadedImage = context.ForceLoadDependency(&image->name[1]); + if (!forceLoadedImage) + return; + + image = forceLoadedImage->Asset(); + } + + const int newLmapUsage = image->width + 2; + if (m_lmap_pixels_used_for_falloff + newLmapUsage > MAX_LMAP_USAGE) + { + con::error( + "Total pixel width of all attenuation textures plus 2 border pixels is {} > {}", m_lmap_pixels_used_for_falloff + newLmapUsage, MAX_LMAP_USAGE); + } + + lightDef->lmapLookupStart = m_lmap_pixels_used_for_falloff + 1; + m_lmap_pixels_used_for_falloff += newLmapUsage; +} diff --git a/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.h b/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.h new file mode 100644 index 00000000..8646b861 --- /dev/null +++ b/src/ObjLoading/Game/IW4/LightDef/LightDefAssetCreationStateIW4.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Asset/IZoneAssetCreationState.h" +#include "Asset/AssetCreationContext.h" +#include "Game/IW4/IW4.h" + +namespace IW4 +{ + constexpr auto MAX_LMAP_USAGE = 512; + + class LightDefAssetCreationState : public IZoneAssetCreationState + { + public: + LightDefAssetCreationState(); + + void SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context); + + private: + int m_lmap_pixels_used_for_falloff; + }; +} // namespace diff --git a/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.cpp b/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.cpp new file mode 100644 index 00000000..1bd15ed8 --- /dev/null +++ b/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.cpp @@ -0,0 +1,37 @@ +#include "LightDefAssetCreationStateIW5.h" + +#include "Utils/Logging/Log.h" + +using namespace IW5; + +LightDefAssetCreationState::LightDefAssetCreationState() + : m_lmap_pixels_used_for_falloff(0) +{ +} + +void LightDefAssetCreationState::SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context) +{ + const auto* image = lightDef->attenuation.image; + if (!image) + return; + + // We need the actual image to determine the width, so force load it, if it is a reference + if (image->name && image->name[0] == ',') + { + const auto forceLoadedImage = context.ForceLoadDependency(&image->name[1]); + if (!forceLoadedImage) + return; + + image = forceLoadedImage->Asset(); + } + + const int newLmapUsage = image->width + 2; + if (m_lmap_pixels_used_for_falloff + newLmapUsage > MAX_LMAP_USAGE) + { + con::error( + "Total pixel width of all attenuation textures plus 2 border pixels is {} > {}", m_lmap_pixels_used_for_falloff + newLmapUsage, MAX_LMAP_USAGE); + } + + lightDef->lmapLookupStart = m_lmap_pixels_used_for_falloff + 1; + m_lmap_pixels_used_for_falloff += newLmapUsage; +} diff --git a/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.h b/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.h new file mode 100644 index 00000000..1902411f --- /dev/null +++ b/src/ObjLoading/Game/IW5/LightDef/LightDefAssetCreationStateIW5.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Asset/IZoneAssetCreationState.h" +#include "Asset/AssetCreationContext.h" +#include "Game/IW5/IW5.h" + +namespace IW5 +{ + constexpr auto MAX_LMAP_USAGE = 512; + + class LightDefAssetCreationState : public IZoneAssetCreationState + { + public: + LightDefAssetCreationState(); + + void SetLightDefLookupStart(GfxLightDef* lightDef, AssetCreationContext& context); + + private: + int m_lmap_pixels_used_for_falloff; + }; +} // namespace light_def