diff --git a/Editor/ObjectWindow.cpp b/Editor/ObjectWindow.cpp index 0f83c2243..831548023 100644 --- a/Editor/ObjectWindow.cpp +++ b/Editor/ObjectWindow.cpp @@ -426,6 +426,7 @@ ObjectWindow::ObjectWindow(wiGUI* gui) : GUI(gui) objectcomponent->ClearLightmap(); objectcomponent->SetLightmapRenderRequest(true); + wiRenderer::InvalidateBVH(); } } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 202ab2ba4..d349a4072 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -91,6 +91,7 @@ bool requestReflectionRendering = false; bool advancedLightCulling = true; bool advancedRefractions = false; bool ldsSkinningEnabled = true; +bool scene_bvh_invalid = true; float SPECULARAA = 0.0f; float renderTime = 0; float renderTime_Prev = 0; @@ -6964,31 +6965,11 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID) SAFE_DELETE_ARRAY(out_rects); } - static TracedRenderingMaterial materialArray[1000] = {}; // todo realloc! - static GPUBuffer* materialBuffer = nullptr; - - if (materialBuffer == nullptr) - { - GPUBufferDesc desc; - HRESULT hr; - - SAFE_DELETE(materialBuffer); - materialBuffer = new GPUBuffer; - - desc.BindFlags = BIND_SHADER_RESOURCE; - desc.StructureByteStride = sizeof(TracedRenderingMaterial); - desc.ByteWidth = desc.StructureByteStride * ARRAYSIZE(materialArray); - desc.CPUAccessFlags = 0; - desc.Format = FORMAT_UNKNOWN; - desc.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; - desc.Usage = USAGE_DEFAULT; - hr = device->CreateBuffer(&desc, nullptr, materialBuffer); - assert(SUCCEEDED(hr)); - } + static std::vector materialArray; + materialArray.clear(); // Pre-gather scene properties: uint32_t totalTriangles = 0; - uint32_t totalMaterials = 0; for (size_t i = 0; i < scene.objects.GetCount(); ++i) { const ObjectComponent& object = scene.objects[i]; @@ -7003,17 +6984,19 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID) { const MaterialComponent& material = *scene.materials.GetComponent(subset.materialID); + TracedRenderingMaterial global_material; + // Copy base params: - materialArray[totalMaterials].baseColor = material.baseColor; - materialArray[totalMaterials].texMulAdd = material.texMulAdd; - materialArray[totalMaterials].roughness = material.roughness; - materialArray[totalMaterials].reflectance = material.reflectance; - materialArray[totalMaterials].metalness = material.metalness; - materialArray[totalMaterials].emissive = material.emissive; - materialArray[totalMaterials].refractionIndex = material.refractionIndex; - materialArray[totalMaterials].subsurfaceScattering = material.subsurfaceScattering; - materialArray[totalMaterials].normalMapStrength = material.normalMapStrength; - materialArray[totalMaterials].parallaxOcclusionMapping = material.parallaxOcclusionMapping; + global_material.baseColor = material.baseColor; + global_material.texMulAdd = material.texMulAdd; + global_material.roughness = material.roughness; + global_material.reflectance = material.reflectance; + global_material.metalness = material.metalness; + global_material.emissive = material.emissive; + global_material.refractionIndex = material.refractionIndex; + global_material.subsurfaceScattering = material.subsurfaceScattering; + global_material.normalMapStrength = material.normalMapStrength; + global_material.parallaxOcclusionMapping = material.parallaxOcclusionMapping; // Add extended properties: const TextureDesc& desc = atlasTexture->GetDesc(); @@ -7033,7 +7016,7 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID) rect.y += atlasWrapBorder; rect.w -= atlasWrapBorder * 2; rect.h -= atlasWrapBorder * 2; - materialArray[totalMaterials].baseColorAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, + global_material.baseColorAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, (float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height); @@ -7051,7 +7034,7 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID) rect.y += atlasWrapBorder; rect.w -= atlasWrapBorder * 2; rect.h -= atlasWrapBorder * 2; - materialArray[totalMaterials].surfaceMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, + global_material.surfaceMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, (float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height); @@ -7070,19 +7053,38 @@ TracedSceneParams PrepareTracedSceneResources(GRAPHICSTHREAD threadID) rect.y += atlasWrapBorder; rect.w -= atlasWrapBorder * 2; rect.h -= atlasWrapBorder * 2; - materialArray[totalMaterials].normalMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, + global_material.normalMapAtlasMulAdd = XMFLOAT4((float)rect.w / (float)desc.Width, (float)rect.h / (float)desc.Height, (float)rect.x / (float)desc.Width, (float)rect.y / (float)desc.Height); - - totalMaterials++; + materialArray.push_back(global_material); } } } - device->UpdateBuffer(materialBuffer, materialArray, threadID, sizeof(TracedRenderingMaterial) * totalMaterials); + + static GPUBuffer* materialBuffer = nullptr; + if (materialBuffer == nullptr || materialBuffer->GetDesc().ByteWidth != sizeof(TracedRenderingMaterial) * materialArray.size()) + { + GPUBufferDesc desc; + HRESULT hr; + + SAFE_DELETE(materialBuffer); + materialBuffer = new GPUBuffer; + + desc.BindFlags = BIND_SHADER_RESOURCE; + desc.StructureByteStride = sizeof(TracedRenderingMaterial); + desc.ByteWidth = desc.StructureByteStride * (UINT)materialArray.size(); + desc.CPUAccessFlags = 0; + desc.Format = FORMAT_UNKNOWN; + desc.MiscFlags = RESOURCE_MISC_BUFFER_STRUCTURED; + desc.Usage = USAGE_DEFAULT; + hr = device->CreateBuffer(&desc, nullptr, materialBuffer); + assert(SUCCEEDED(hr)); + } + device->UpdateBuffer(materialBuffer, materialArray.data(), threadID, sizeof(TracedRenderingMaterial) * (int)materialArray.size()); TracedSceneParams result; result.triangleCount = totalTriangles; - result.materialCount = totalMaterials; + result.materialCount = (uint)materialArray.size(); result.materialBuffer = materialBuffer; result.materialAtlas = atlasTexture; @@ -7532,7 +7534,11 @@ void RenderObjectLightMap(ObjectComponent& object, bool updateBVHAndScene, GRAPH if (updateBVHAndScene) { - BuildSceneBVH(threadID); + if (scene_bvh_invalid) + { + scene_bvh_invalid = false; + BuildSceneBVH(threadID); + } TracedSceneParams tracedSceneParams = PrepareTracedSceneResources(threadID); GPUResource* res[] = { @@ -8404,5 +8410,6 @@ void SetOceanEnabled(bool enabled) } } bool GetOceanEnabled() { return ocean != nullptr; } +void InvalidateBVH() { scene_bvh_invalid = true; } } diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index cbeedaf03..da10fce02 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -263,6 +263,7 @@ namespace wiRenderer float GetGameSpeed(); void SetOceanEnabled(bool enabled); bool GetOceanEnabled(); + void InvalidateBVH(); // invalidates scene bvh so if something wants to use it, it will recompute and validate it // Gets pick ray according to the current screen resolution and pointer coordinates. Can be used as input into RayIntersectWorld() RAY GetPickRay(long cursorX, long cursorY); diff --git a/WickedEngine/wiSceneSystem.cpp b/WickedEngine/wiSceneSystem.cpp index 530ed3619..3d8242915 100644 --- a/WickedEngine/wiSceneSystem.cpp +++ b/WickedEngine/wiSceneSystem.cpp @@ -789,7 +789,7 @@ namespace wiSceneSystem } FORMAT ObjectComponent::GetLightmapFormat() { - uint32_t stride = lightmapTextureData.size() / lightmapWidth / lightmapHeight; + uint32_t stride = (uint32_t)lightmapTextureData.size() / lightmapWidth / lightmapHeight; switch (stride) { diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 0c24f11eb..c066e02b7 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 24; // minor bug fixes, alterations, refactors, updates - const int revision = 5; + const int revision = 6; long GetVersion()