diff --git a/code/render/coregraphics/meshloader.cc b/code/render/coregraphics/meshloader.cc index af944d680..fcd847c68 100644 --- a/code/render/coregraphics/meshloader.cc +++ b/code/render/coregraphics/meshloader.cc @@ -26,7 +26,7 @@ MeshLoader::MeshLoader() this->failResourceName = "sysmsh:error.nvx"; this->async = true; - this->streamerThreadName = "Mesh Pool Streamer Thread"; + this->streamerThreadName = "Mesh Streamer Thread"; // Setup vertex layouts CoreGraphics::VertexLayoutCreateInfo vlCreateInfo; diff --git a/code/render/coregraphics/textureloader.cc b/code/render/coregraphics/textureloader.cc index f4ee0a327..6970a028e 100644 --- a/code/render/coregraphics/textureloader.cc +++ b/code/render/coregraphics/textureloader.cc @@ -23,7 +23,7 @@ TextureLoader::TextureLoader() this->placeholderResourceName = "systex:white.dds"; this->failResourceName = "systex:error.dds"; - this->streamerThreadName = "Texture Pool Streamer Thread"; + this->streamerThreadName = "Texture Streamer Thread"; } //------------------------------------------------------------------------------ @@ -117,7 +117,7 @@ TextureLoader::LoadFromStream(Ids::Id32 entry, const Util::StringAtom& tag, cons // now load texture by walking through all images and mips for (int i = 0; i < ctx.num_faces(); i++) { - for (int j = streamData->lowestLod; j < ctx.num_mipmaps(i); j++) + for (int j = streamData->lowestLod; j < ctx.num_mipmaps(i) - streamData->lowestLod; j++) { // Perform a texture update CoreGraphics::TextureUpdate( diff --git a/code/render/decals/decalcontext.cc b/code/render/decals/decalcontext.cc index 420e0c2f6..e7ffded5a 100644 --- a/code/render/decals/decalcontext.cc +++ b/code/render/decals/decalcontext.cc @@ -233,9 +233,9 @@ DecalContext::SetupDecalPBR( pbrDecalAllocator.Set(decal, normal); pbrDecalAllocator.Set(decal, material); - Resources::SetMaxLOD(albedo, 0.0f, false); - Resources::SetMaxLOD(normal, 0.0f, false); - Resources::SetMaxLOD(material, 0.0f, false); + Resources::SetMinLod(albedo, 0.0f, false); + Resources::SetMinLod(normal, 0.0f, false); + Resources::SetMinLod(material, 0.0f, false); genericDecalAllocator.Set(cid.id, transform); genericDecalAllocator.Set(cid.id, PBRDecal); diff --git a/code/render/graphics/environmentcontext.cc b/code/render/graphics/environmentcontext.cc index 3ed1a6e69..a02a742c5 100644 --- a/code/render/graphics/environmentcontext.cc +++ b/code/render/graphics/environmentcontext.cc @@ -77,14 +77,14 @@ EnvironmentContext::Create(const Graphics::GraphicsEntityId sun) [](const Resources::ResourceId id) { envState.defaultEnvironmentMap = id; - Resources::SetMaxLOD(id, 0.0f, false); + Resources::SetMinLod(id, 0.0f, false); }); envState.defaultIrradianceMap = Resources::CreateResource("systex:sky_irr.dds"_atm, "system"_atm, [](const Resources::ResourceId id) { envState.defaultIrradianceMap = id; - Resources::SetMaxLOD(id, 0.0f, false); + Resources::SetMinLod(id, 0.0f, false); }); } diff --git a/code/render/materials/material.cc b/code/render/materials/material.cc index 05c601477..1fb4039f8 100644 --- a/code/render/materials/material.cc +++ b/code/render/materials/material.cc @@ -228,15 +228,18 @@ MaterialSetTexture(const MaterialId mat, IndexT name, const CoreGraphics::Textur void MaterialAddLODTexture(const MaterialId mat, const Resources::ResourceId tex) { + Threading::CriticalScope scope(&materialTextureLoadSection); materialAllocator.Get(mat.resourceId).Append(tex); - materialAllocator.Set(mat.resourceId, 1.0f); + + // When a new texture is added, make sure to update it's LOD as well + Resources::SetMinLod(tex, materialAllocator.Get(mat.resourceId), false); } //------------------------------------------------------------------------------ /** */ void -MaterialSetHighestLod(const MaterialId mat, float lod) +MaterialSetLowestLod(const MaterialId mat, float lod) { Threading::CriticalScope scope(&materialTextureLoadSection); Util::Array& textures = materialAllocator.Get(mat.resourceId); @@ -247,7 +250,7 @@ MaterialSetHighestLod(const MaterialId mat, float lod) for (IndexT i = 0; i < textures.Size(); i++) { - Resources::SetMaxLOD(textures[i], lod, false); + Resources::SetMinLod(textures[i], lod, false); } } diff --git a/code/render/materials/material.h b/code/render/materials/material.h index 1b0380aaa..0455e731a 100644 --- a/code/render/materials/material.h +++ b/code/render/materials/material.h @@ -44,7 +44,7 @@ void MaterialSetTexture(const MaterialId mat, IndexT name, const CoreGraphics::T /// Add texture to LOD update void MaterialAddLODTexture(const MaterialId mat, const Resources::ResourceId tex); /// Update LOD for material -void MaterialSetHighestLod(const MaterialId mat, float lod); +void MaterialSetLowestLod(const MaterialId mat, float lod); /// Apply material void MaterialApply(const MaterialId id, const CoreGraphics::CmdBufferId buf, IndexT index); diff --git a/code/render/models/modelcontext.cc b/code/render/models/modelcontext.cc index 9efbd5bfd..ea1c5e5a5 100644 --- a/code/render/models/modelcontext.cc +++ b/code/render/models/modelcontext.cc @@ -270,7 +270,7 @@ ModelContext::Setup( nodeInstances.renderable.origBoundingBoxes.Append(boundingBox); nodeInstances.renderable.nodeLodDistances.Append(Util::MakeTuple(FLT_MAX, FLT_MAX)); nodeInstances.renderable.nodeLods.Append(0.0f); - nodeInstances.renderable.textureLods.Append(0.0f); + nodeInstances.renderable.textureLods.Append(1.0f); nodeInstances.renderable.nodeFlags.Append(Models::NodeInstanceFlags::NodeInstance_Active); nodeInstances.renderable.nodeMaterials.Append(material); nodeInstances.renderable.nodeShaderConfigs.Append(MaterialGetShaderConfig(material)); @@ -638,12 +638,12 @@ ModelContext::UpdateTransforms(const Graphics::FrameContext& ctx) // calculate view vector to calculate LOD Math::vec4 viewVector = context->cameraTransform.position - transform.position; float viewDistance = length(viewVector); - float textureLod = viewDistance - 38.5f; + float textureLod = Math::max(0.0f, (viewDistance - 10.0f) / 30.5f); if (textureLod < nodeInstances.renderable.textureLods[j]) { // Notify materials system this LOD might be used (this is a bit shitty in comparison to actually using texture sampling feedback) - Materials::MaterialSetHighestLod(nodeInstances.renderable.nodeMaterials[j], textureLod); + Materials::MaterialSetLowestLod(nodeInstances.renderable.nodeMaterials[j], textureLod); nodeInstances.renderable.textureLods[j] = textureLod; } @@ -714,7 +714,6 @@ ModelContext::UpdateTransforms(const Graphics::FrameContext& ctx) }, nodeInstanceStateRanges.Size(), 256, renderCtx, { &lodUpdateCounter }, &ConstantsUpdateCounter, &ModelContext::completionEvent); } - //------------------------------------------------------------------------------ /** */ diff --git a/code/render/models/nodes/shaderstatenode.cc b/code/render/models/nodes/shaderstatenode.cc index df4acd520..b71bcfa72 100644 --- a/code/render/models/nodes/shaderstatenode.cc +++ b/code/render/models/nodes/shaderstatenode.cc @@ -33,15 +33,6 @@ ShaderStateNode::~ShaderStateNode() // empty } -//------------------------------------------------------------------------------ -/** -*/ -void -ShaderStateNode::SetMaxLOD(const float lod) -{ - Materials::MaterialSetHighestLod(this->material, lod); -} - //------------------------------------------------------------------------------ /** */ diff --git a/code/render/models/nodes/shaderstatenode.h b/code/render/models/nodes/shaderstatenode.h index 1d4599e44..981d378b5 100644 --- a/code/render/models/nodes/shaderstatenode.h +++ b/code/render/models/nodes/shaderstatenode.h @@ -47,8 +47,6 @@ class ShaderStateNode : public TransformNode /// get surface const Materials::MaterialId GetMaterial() const { return this->material; }; - /// trigger an LOD update - void SetMaxLOD(const float lod); /// Create resource table static Util::FixedArray CreateResourceTables(); diff --git a/code/render/terrain/terraincontext.cc b/code/render/terrain/terraincontext.cc index 9e69bd6c5..8e2e6a71e 100644 --- a/code/render/terrain/terraincontext.cc +++ b/code/render/terrain/terraincontext.cc @@ -1082,8 +1082,8 @@ TerrainContext::SetupTerrain( runtimeInfo.decisionMap = Resources::CreateResource(decisionMap, "terrain"_atm, nullptr, nullptr, true); runtimeInfo.heightMap = Resources::CreateResource(heightMap, "terrain"_atm, nullptr, nullptr, true); - Resources::SetMaxLOD(runtimeInfo.decisionMap, 0.0f, false); - Resources::SetMaxLOD(runtimeInfo.heightMap, 0.0f, false); + Resources::SetMinLod(runtimeInfo.decisionMap, 0.0f, false); + Resources::SetMinLod(runtimeInfo.heightMap, 0.0f, false); runtimeInfo.worldWidth = terrainState.settings.worldSizeX; runtimeInfo.worldHeight = terrainState.settings.worldSizeZ; diff --git a/code/resource/resources/resourceloader.cc b/code/resource/resources/resourceloader.cc index b401a2891..51ca00789 100644 --- a/code/resource/resources/resourceloader.cc +++ b/code/resource/resources/resourceloader.cc @@ -691,7 +691,7 @@ ResourceLoader::ReloadResource(const Resources::ResourceId& id, std::function success, std::function failed); /// begin updating a resources lod - void SetMaxLOD(const Resources::ResourceId& id, const float lod, bool immediate); + void SetMinLod(const Resources::ResourceId& id, const float lod, bool immediate); protected: friend class ResourceServer; diff --git a/code/resource/resources/resourceserver.h b/code/resource/resources/resourceserver.h index 1a044b2dd..b1efb5e0c 100644 --- a/code/resource/resources/resourceserver.h +++ b/code/resource/resources/resourceserver.h @@ -53,7 +53,7 @@ class ResourceServer : public Core::RefCounted /// reload resource void ReloadResource(const ResourceName& res, std::function success = nullptr, std::function failed = nullptr); /// stream in a new LOD - void SetMaxLOD(const ResourceId& id, float lod, bool immediate); + void SetMinLod(const ResourceId& id, float lod, bool immediate); /// get type of resource pool this resource was allocated with Core::Rtti* GetType(const Resources::ResourceId id); @@ -170,7 +170,7 @@ ResourceServer::ReloadResource(const ResourceName& res, std::function& loader = this->loaders[loaderid].downcast(); // update LOD - loader->SetMaxLOD(id, lod, immediate); + loader->SetMinLod(id, lod, immediate); } //------------------------------------------------------------------------------ @@ -319,9 +319,9 @@ CreateResource(const ResourceName& res, const METADATA& metaData, const Util::St /** */ inline void -SetMaxLOD(const ResourceId& id, float lod, bool immediate) +SetMinLod(const ResourceId& id, float lod, bool immediate) { - return ResourceServer::Instance()->SetMaxLOD(id, lod, immediate); + return ResourceServer::Instance()->SetMinLod(id, lod, immediate); } //------------------------------------------------------------------------------