diff --git a/code/Mesh/Instance/InstanceMesh.cpp b/code/Mesh/Instance/InstanceMesh.cpp
index ddd71d1aab..aa522464a1 100644
--- a/code/Mesh/Instance/InstanceMesh.cpp
+++ b/code/Mesh/Instance/InstanceMesh.cpp
@@ -18,6 +18,7 @@
#include "Render/Context/RenderContext.h"
#include "Render/Mesh/Mesh.h"
#include "World/IWorldRenderPass.h"
+#include "World/WorldHandles.h"
#include "World/WorldRenderView.h"
namespace traktor::mesh
@@ -29,8 +30,6 @@ render::Handle s_handleInstanceWorld(L"InstanceWorld");
render::Handle s_handleInstanceWorldLast(L"InstanceWorldLast");
render::Handle s_handleBoundingBoxMin(L"InstanceMesh_BoundingBoxMin");
render::Handle s_handleBoundingBoxMax(L"InstanceMesh_BoundingBoxMax");
-render::Handle s_handleView(L"InstanceMesh_View");
-render::Handle s_handleViewInverse(L"InstanceMesh_ViewInverse");
render::Handle s_handleVisibility(L"InstanceMesh_Visibility");
render::Handle s_handleCullFrustum(L"InstanceMesh_CullFrustum");
render::Handle s_handleDraw(L"InstanceMesh_Draw");
@@ -87,7 +86,7 @@ void InstanceMesh::build(
const AlignedVector< Part >& parts = it->second;
const auto& meshParts = m_renderMesh->getParts();
- const uint32_t bufferItemCount = alignUp(m_instances.size(), 16);
+ const uint32_t bufferItemCount = (uint32_t)alignUp(m_instances.size(), 16);
// Lazy create the buffers.
if (!m_instanceBuffer || bufferItemCount > m_instanceAllocatedCount)
@@ -100,11 +99,11 @@ void InstanceMesh::build(
}
const uint32_t peakCascade = worldRenderView.getCascade();
- const uint32_t vbSize = m_visibilityBuffers.size();
+ const uint32_t vbSize = (uint32_t)m_visibilityBuffers.size();
for (uint32_t i = vbSize; i < peakCascade + 1; ++i)
m_visibilityBuffers.push_back(m_renderSystem->createBuffer(render::BufferUsage::BuStructured, bufferItemCount * sizeof(float), false));
- const uint32_t dbSize = m_drawBuffers.size();
+ const uint32_t dbSize = (uint32_t)m_drawBuffers.size();
for (uint32_t i = dbSize; i < (peakCascade + 1) * parts.size(); ++i)
m_drawBuffers.push_back(m_renderSystem->createBuffer(render::BufferUsage::BuStructured | render::BufferUsage::BuIndirect, bufferItemCount * sizeof(render::IndexedIndirectDraw), false));
@@ -128,29 +127,42 @@ void InstanceMesh::build(
const Frustum& cf = worldRenderView.getCullFrustum();
T_FATAL_ASSERT(cf.planes.size() <= sizeof_array(cullFrustum));
- for (int32_t i = 0; i < cf.planes.size(); ++i)
+ for (int32_t i = 0; i < (int32_t)cf.planes.size(); ++i)
cullFrustum[i] = cf.planes[i].normal().xyz0() + Vector4(0.0f, 0.0f, 0.0f, cf.planes[i].distance());
- for (int32_t i = cf.planes.size(); i < sizeof_array(cullFrustum); ++i)
+ for (int32_t i = (int32_t)cf.planes.size(); i < sizeof_array(cullFrustum); ++i)
cullFrustum[i] = Vector4::zero();
auto renderBlock = renderContext->allocNamed< render::ComputeRenderBlock >(
str(L"InstanceMesh cull %d", worldRenderView.getCascade())
);
- renderBlock->program = m_shaderCull->getProgram().program;
+ render::Shader::Permutation perm;
+ if (worldRenderPass.getTechnique() == world::s_techniqueDeferredGBufferWrite)
+ {
+ // Deferred g-buffer pass has access to HiZ texture.
+ m_shaderCull->setCombination(render::getParameterHandle(L"InstanceMesh_HiZ"), true, perm);
+ }
+ else
+ {
+ // All other paths use simple frustum culling only.
+ m_shaderCull->setCombination(render::getParameterHandle(L"InstanceMesh_HiZ"), false, perm);
+ }
+
+ renderBlock->program = m_shaderCull->getProgram(perm).program;
renderBlock->programParams = renderContext->alloc< render::ProgramParameters >();
renderBlock->programParams->beginParameters(renderContext);
+
+ worldRenderPass.setProgramParameters(renderBlock->programParams);
+
renderBlock->programParams->setVectorParameter(s_handleBoundingBoxMin, m_renderMesh->getBoundingBox().mn);
renderBlock->programParams->setVectorParameter(s_handleBoundingBoxMax, m_renderMesh->getBoundingBox().mx);
renderBlock->programParams->setVectorArrayParameter(s_handleCullFrustum, cullFrustum, sizeof_array(cullFrustum));
- renderBlock->programParams->setMatrixParameter(s_handleView, worldRenderView.getView());
- renderBlock->programParams->setMatrixParameter(s_handleViewInverse, worldRenderView.getView().inverse());
renderBlock->programParams->setBufferViewParameter(s_handleInstanceWorld, m_instanceBuffer->getBufferView());
renderBlock->programParams->setBufferViewParameter(s_handleVisibility, visibilityBuffer->getBufferView());
renderBlock->programParams->endParameters(renderContext);
- renderBlock->workSize[0] = m_instances.size();
+ renderBlock->workSize[0] = (int32_t)m_instances.size();
renderContext->compute(renderBlock);
renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Compute);
@@ -185,7 +197,7 @@ void InstanceMesh::build(
renderBlock->programParams->setBufferViewParameter(s_handleDraw, drawBuffer->getBufferView());
renderBlock->programParams->endParameters(renderContext);
- renderBlock->workSize[0] = m_instances.size();
+ renderBlock->workSize[0] = (int32_t)m_instances.size();
renderContext->compute(renderBlock);
}
@@ -217,7 +229,7 @@ void InstanceMesh::build(
renderBlock->vertexLayout = m_renderMesh->getVertexLayout();
renderBlock->primitive = meshParts[part.meshPart].primitives.type;
renderBlock->drawBuffer = drawBuffer->getBufferView();
- renderBlock->drawCount = m_instances.size();
+ renderBlock->drawCount = (uint32_t)m_instances.size();
renderBlock->programParams->beginParameters(renderContext);
@@ -248,12 +260,13 @@ InstanceMesh::Instance* InstanceMesh::allocateInstance()
return instance;
}
-void InstanceMesh::releaseInstance(Instance* instance)
+void InstanceMesh::releaseInstance(Instance*& instance)
{
T_FATAL_ASSERT(instance->mesh == this);
auto it = std::find(m_instances.begin(), m_instances.end(), instance);
m_instances.erase(it);
delete instance;
+ instance = nullptr;
}
void InstanceMesh::Instance::setTransform(const Transform& transform)
diff --git a/code/Mesh/Instance/InstanceMesh.h b/code/Mesh/Instance/InstanceMesh.h
index 5a0785870b..0e87c30955 100644
--- a/code/Mesh/Instance/InstanceMesh.h
+++ b/code/Mesh/Instance/InstanceMesh.h
@@ -100,7 +100,7 @@ class T_DLLCLASS InstanceMesh : public IMesh
Instance* allocateInstance();
- void releaseInstance(Instance* instance);
+ void releaseInstance(Instance*& instance);
//
diff --git a/code/Mesh/Instance/InstanceMeshComponent.cpp b/code/Mesh/Instance/InstanceMeshComponent.cpp
index d1cdf02bf3..c008994375 100644
--- a/code/Mesh/Instance/InstanceMeshComponent.cpp
+++ b/code/Mesh/Instance/InstanceMeshComponent.cpp
@@ -23,9 +23,17 @@ InstanceMeshComponent::InstanceMeshComponent(const resource::Proxy< InstanceMesh
m_meshInstance = m_mesh->allocateInstance();
}
+InstanceMeshComponent::~InstanceMeshComponent()
+{
+ // Need to call destroy here since editor doesn't always call destroy on components
+ // but instead rely on reference counting to do the cleanup.
+ destroy();
+}
+
void InstanceMeshComponent::destroy()
{
- m_mesh->releaseInstance(m_meshInstance);
+ if (m_mesh && m_meshInstance != nullptr)
+ m_mesh->releaseInstance(m_meshInstance);
m_mesh.clear();
MeshComponent::destroy();
}
@@ -33,7 +41,6 @@ void InstanceMeshComponent::destroy()
void InstanceMeshComponent::setTransform(const Transform& transform)
{
MeshComponent::setTransform(transform);
-
m_meshInstance->setTransform(transform);
}
diff --git a/code/Mesh/Instance/InstanceMeshComponent.h b/code/Mesh/Instance/InstanceMeshComponent.h
index b8445c2f82..2e2a2d3e88 100644
--- a/code/Mesh/Instance/InstanceMeshComponent.h
+++ b/code/Mesh/Instance/InstanceMeshComponent.h
@@ -34,6 +34,8 @@ class T_DLLCLASS InstanceMeshComponent : public MeshComponent
public:
explicit InstanceMeshComponent(const resource::Proxy< InstanceMesh >& mesh);
+ virtual ~InstanceMeshComponent();
+
virtual void destroy() override final;
virtual void setTransform(const Transform& transform) override;
diff --git a/code/Render/Frame/RenderGraph.cpp b/code/Render/Frame/RenderGraph.cpp
index a09f9aff90..8cd104ca37 100644
--- a/code/Render/Frame/RenderGraph.cpp
+++ b/code/Render/Frame/RenderGraph.cpp
@@ -196,6 +196,18 @@ handle_t RenderGraph::addTransientTexture(const wchar_t* const name, const Rende
return resourceId;
}
+handle_t RenderGraph::addPersistentTexture(const wchar_t* const name, handle_t persistentHandle, const RenderGraphTextureDesc& textureDesc)
+{
+ const handle_t resourceId = m_nextResourceId++;
+
+ auto& tr = m_textures[resourceId];
+ tr.name = name;
+ tr.persistentHandle = persistentHandle;
+ tr.textureDesc = textureDesc;
+
+ return resourceId;
+}
+
IRenderTargetSet* RenderGraph::getTargetSet(handle_t resource) const
{
auto it = m_targets.find(resource);
@@ -355,10 +367,7 @@ bool RenderGraph::build(RenderContext* renderContext, int32_t width, int32_t hei
auto& sbuffer = it.second;
if (sbuffer.buffer == nullptr)
{
- sbuffer.buffer = m_bufferPool->acquire(
- sbuffer.bufferSize,
- sbuffer.persistentHandle
- );
+ sbuffer.buffer = m_bufferPool->acquire(sbuffer.bufferSize, sbuffer.persistentHandle);
if (!sbuffer.buffer)
return false;
}
@@ -369,7 +378,7 @@ bool RenderGraph::build(RenderContext* renderContext, int32_t width, int32_t hei
auto& texture = it.second;
if (texture.texture == nullptr)
{
- texture.texture = m_texturePool->acquire(texture.textureDesc);
+ texture.texture = m_texturePool->acquire(texture.textureDesc, texture.persistentHandle);
if (!texture.texture)
return false;
}
diff --git a/code/Render/Frame/RenderGraph.h b/code/Render/Frame/RenderGraph.h
index d8ad179a6e..e8460fce2a 100644
--- a/code/Render/Frame/RenderGraph.h
+++ b/code/Render/Frame/RenderGraph.h
@@ -89,6 +89,7 @@ class T_DLLCLASS RenderGraph : public Object
struct TextureResource
{
const wchar_t* name = nullptr;
+ handle_t persistentHandle = 0;
RenderGraphTextureDesc textureDesc;
Ref< ITexture > texture;
};
@@ -192,6 +193,10 @@ class T_DLLCLASS RenderGraph : public Object
*/
handle_t addTransientTexture(const wchar_t* const name, const RenderGraphTextureDesc& textureDesc);
+ /*!
+ */
+ handle_t addPersistentTexture(const wchar_t* const name, handle_t persistentHandle, const RenderGraphTextureDesc& textureDesc);
+
/*! Get target set from resource handle.
*
* \param resource Opaque resource handle.
diff --git a/code/Render/Frame/RenderGraphTexturePool.cpp b/code/Render/Frame/RenderGraphTexturePool.cpp
index 7949d07d84..7920446a93 100644
--- a/code/Render/Frame/RenderGraphTexturePool.cpp
+++ b/code/Render/Frame/RenderGraphTexturePool.cpp
@@ -26,13 +26,16 @@ void RenderGraphTexturePool::destroy()
m_renderSystem = nullptr;
}
-Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& textureDesc)
+Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& textureDesc, uint32_t persistentHandle)
{
auto it = std::find_if(
m_pool.begin(),
m_pool.end(),
[&](const RenderGraphTexturePool::Pool& p)
{
+ if (p.persistentHandle != persistentHandle)
+ return false;
+
return std::memcmp(&p.textureDesc, &textureDesc, sizeof(textureDesc)) == 0;
}
);
@@ -45,6 +48,7 @@ Ref< ITexture > RenderGraphTexturePool::acquire(const RenderGraphTextureDesc& te
{
pool = &m_pool.push_back();
pool->textureDesc = textureDesc;
+ pool->persistentHandle = persistentHandle;
}
// Acquire free texture, if no one left we need to create a new texture.
diff --git a/code/Render/Frame/RenderGraphTexturePool.h b/code/Render/Frame/RenderGraphTexturePool.h
index 3f0124583c..93b0d4eedb 100644
--- a/code/Render/Frame/RenderGraphTexturePool.h
+++ b/code/Render/Frame/RenderGraphTexturePool.h
@@ -31,7 +31,7 @@ class RenderGraphTexturePool : public Object
void destroy();
- Ref< ITexture > acquire(const RenderGraphTextureDesc& textureDesc);
+ Ref< ITexture > acquire(const RenderGraphTextureDesc& textureDesc, uint32_t persistentHandle);
void release(Ref< ITexture >& texture);
@@ -40,6 +40,7 @@ class RenderGraphTexturePool : public Object
{
// Pool identification.
RenderGraphTextureDesc textureDesc;
+ uint32_t persistentHandle;
// Pool buffers.
RefArray< ITexture > free;
diff --git a/code/Weather/Sky/SkyComponent.cpp b/code/Weather/Sky/SkyComponent.cpp
index ddfe86721d..3140c9fc33 100644
--- a/code/Weather/Sky/SkyComponent.cpp
+++ b/code/Weather/Sky/SkyComponent.cpp
@@ -20,6 +20,7 @@
#include "Weather/Sky/SkyComponent.h"
#include "World/Entity.h"
#include "World/IWorldRenderPass.h"
+#include "World/WorldHandles.h"
#include "World/WorldRenderView.h"
#include "World/WorldSetupContext.h"
#include "World/Entity/LightComponent.h"
@@ -43,6 +44,8 @@ const render::Handle s_handleWeather_SkySunDirection(L"Weather_SkySunDirection")
const render::Handle s_handleWeather_SkySunColor(L"Weather_SkySunColor");
const render::Handle s_handleWeather_SkyEyePosition(L"Weather_SkyEyePosition");
const render::Handle s_handleWeather_SkyCloudTexture(L"Weather_SkyCloudTexture");
+const render::Handle s_handleWeather_InputTexture(L"Weather_InputTexture");
+const render::Handle s_handleWeather_OutputTexture(L"Weather_OutputTexture");
const int32_t c_longitudes = 16;
const int32_t c_latitudes = 24;
@@ -134,6 +137,8 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I
);
render::SimpleTextureCreateDesc stcd = {};
+ render::VolumeTextureCreateDesc vtcd = {};
+
stcd.width = 512;
stcd.height = 512;
stcd.mipCount = 1;
@@ -141,7 +146,6 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I
stcd.shaderStorage = true;
m_cloudTextures[0] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W);
- render::VolumeTextureCreateDesc vtcd = {};
vtcd.width = 64;
vtcd.height = 64;
vtcd.depth = 64;
@@ -150,7 +154,6 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I
vtcd.shaderStorage = true;
m_cloudTextures[1] = renderSystem->createVolumeTexture(vtcd, T_FILE_LINE_W);
- //render::SimpleTextureCreateDesc stcd = {};
stcd.width = 1024;
stcd.height = 256;
stcd.mipCount = 1;
@@ -159,7 +162,7 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I
m_cloudDomeTexture[0] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W);
m_cloudDomeTexture[1] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W);
- if (!m_cloudTextures[0] || !m_cloudTextures[1])
+ if (!m_cloudTextures[0] || !m_cloudTextures[1] || !m_cloudDomeTexture[0] || !m_cloudDomeTexture[1])
return false;
if (!resourceManager->bind(c_shaderClouds2D, m_shaderClouds2D))
@@ -183,6 +186,8 @@ void SkyComponent::destroy()
safeDestroy(m_vertexBuffer);
safeDestroy(m_cloudTextures[0]);
safeDestroy(m_cloudTextures[1]);
+ safeDestroy(m_cloudDomeTexture[0]);
+ safeDestroy(m_cloudDomeTexture[1]);
m_shader.clear();
m_texture.clear();
m_shaderClouds2D.clear();
@@ -214,8 +219,6 @@ void SkyComponent::setup(
const world::WorldRenderView& worldRenderView
)
{
- const static render::Handle s_handleInputTexture(L"Weather_InputTexture");
- const static render::Handle s_handleOutputTexture(L"Weather_OutputTexture");
render::RenderGraph& renderGraph = context.getRenderGraph();
if (m_shaderClouds2D.changed() || m_shaderClouds3D.changed())
@@ -238,7 +241,7 @@ void SkyComponent::setup(
renderBlock->programParams = renderContext->alloc< render::ProgramParameters >();
renderBlock->programParams->beginParameters(renderContext);
- renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, m_cloudTextures[0], 0);
+ renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, m_cloudTextures[0], 0);
renderBlock->programParams->endParameters(renderContext);
renderContext->compute(renderBlock);
@@ -253,7 +256,7 @@ void SkyComponent::setup(
renderBlock->programParams = renderContext->alloc< render::ProgramParameters >();
renderBlock->programParams->beginParameters(renderContext);
- renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, m_cloudTextures[1], 0);
+ renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, m_cloudTextures[1], 0);
renderBlock->programParams->endParameters(renderContext);
renderContext->compute(renderBlock);
@@ -265,7 +268,7 @@ void SkyComponent::setup(
m_dirty = false;
}
- const int32_t cloudFrame = int32_t(worldRenderView.getTime() * 4.0f);
+ const int32_t cloudFrame = int32_t(worldRenderView.getTime() * 8.0f);
// Generate dome projected cloud layer.
if (worldRenderView.getIndex() == 0 && cloudFrame != m_cloudFrame)
@@ -293,17 +296,14 @@ void SkyComponent::setup(
renderBlock->programParams = renderContext->alloc< render::ProgramParameters >();
renderBlock->programParams->beginParameters(renderContext);
-
- renderBlock->programParams->setImageViewParameter(s_handleInputTexture, input, 0);
- renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, output, 0);
-
+ renderBlock->programParams->setImageViewParameter(s_handleWeather_InputTexture, input, 0);
+ renderBlock->programParams->setImageViewParameter(s_handleWeather_OutputTexture, output, 0);
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]);
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]);
renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRadius, worldRenderView.getViewFrustum().getFarZ() - 10.0f);
renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunColor, sunColor);
renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunDirection, sunDirection);
- renderBlock->programParams->setFloatParameter(render::getParameterHandle(L"World_Time"), worldRenderView.getTime());
-
+ renderBlock->programParams->setFloatParameter(world::s_handleTime, worldRenderView.getTime());
renderBlock->programParams->endParameters(renderContext);
renderContext->compute(renderBlock);
@@ -355,23 +355,17 @@ void SkyComponent::build(
renderBlock->primitives = m_primitives;
renderBlock->programParams->beginParameters(renderContext);
-
worldRenderPass.setProgramParameters(renderBlock->programParams);
-
renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRadius, worldRenderView.getViewFrustum().getFarZ() - 10.0f);
renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRotation, rotation);
renderBlock->programParams->setFloatParameter(s_handleWeather_SkyIntensity, m_intensity);
-
renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunDirection, sunDirection);
renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunColor, sunColor);
renderBlock->programParams->setVectorParameter(s_handleWeather_SkyEyePosition, eyePosition);
-
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyTexture, m_texture);
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]);
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]);
-
renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloudTexture, cloudDomeTexture);
-
renderBlock->programParams->endParameters(renderContext);
renderContext->draw(sp.priority, renderBlock);
diff --git a/code/World/Deferred/WorldRendererDeferred.cpp b/code/World/Deferred/WorldRendererDeferred.cpp
index 7689e9cd4a..771d7910a5 100644
--- a/code/World/Deferred/WorldRendererDeferred.cpp
+++ b/code/World/Deferred/WorldRendererDeferred.cpp
@@ -53,12 +53,18 @@ namespace traktor::world
namespace
{
-const render::Handle s_handleVisualTargetSet[] =
+const render::Handle s_persistentVisualTargetSet[] =
{
render::Handle(L"World_VisualTargetSet_Even"),
render::Handle(L"World_VisualTargetSet_Odd")
};
+const render::Handle s_persistentHiZTexture[] =
+{
+ render::Handle(L"World_HiZTexture_Even"),
+ render::Handle(L"World_HiZTexture_Odd")
+};
+
const resource::Id< render::Shader > c_lightShader(L"{707DE0B0-0E2B-A44A-9441-9B1FCFD428AA}");
}
@@ -127,23 +133,40 @@ void WorldRendererDeferred::setup(
}
// Add visual target sets.
- render::RenderGraphTargetSetDesc rgtd;
- rgtd.count = 1;
- rgtd.createDepthStencil = false;
- rgtd.referenceWidthDenom = 1;
- rgtd.referenceHeightDenom = 1;
- rgtd.targets[0].colorFormat = render::TfR16G16B16A16F;
+ render::RenderGraphTargetSetDesc rgtsd;
+ rgtsd.count = 1;
+ rgtsd.createDepthStencil = false;
+ rgtsd.referenceWidthDenom = 1;
+ rgtsd.referenceHeightDenom = 1;
+ rgtsd.targets[0].colorFormat = render::TfR16G16B16A16F;
const DoubleBufferedTarget visualTargetSetId =
{
- renderGraph.addPersistentTargetSet(L"Previous", s_handleVisualTargetSet[count % 2], false, rgtd, outputTargetSetId, outputTargetSetId),
- renderGraph.addPersistentTargetSet(L"Current", s_handleVisualTargetSet[(count + 1) % 2], false, rgtd, outputTargetSetId, outputTargetSetId)
+ renderGraph.addPersistentTargetSet(L"Previous", s_persistentVisualTargetSet[count % 2], false, rgtsd, outputTargetSetId, outputTargetSetId),
+ renderGraph.addPersistentTargetSet(L"Current", s_persistentVisualTargetSet[(count + 1) % 2], false, rgtsd, outputTargetSetId, outputTargetSetId)
};
+ // Add Hi-Z textures.
+ const Vector2 viewSize = worldRenderView.getViewSize();
+ const int32_t viewWidth = (int32_t)viewSize.x;
+ const int32_t viewHeight = (int32_t)viewSize.y;
+ const int32_t mipCount = log2(std::max(viewWidth, viewHeight)) + 1;
+
+ render::RenderGraphTextureDesc rgtxd;
+ rgtxd.width = viewWidth >> 1;
+ rgtxd.height = viewHeight >> 1;
+ rgtxd.mipCount = mipCount - 1;
+ rgtxd.format = render::TfR32F;
+ const DoubleBufferedTarget hizTextureId =
+ {
+ renderGraph.addPersistentTexture(L"HiZ Previous", s_persistentHiZTexture[count % 2], rgtxd),
+ renderGraph.addPersistentTexture(L"HiZ Current", s_persistentHiZTexture[(count + 1) % 2], rgtxd)
+ };
+
// Add passes to render graph.
m_lightClusterPass->setup(worldRenderView, m_gatheredView);
- auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, m_irradianceGrid, s_techniqueDeferredGBufferWrite, renderGraph, outputTargetSetId);
+ auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, m_irradianceGrid, s_techniqueDeferredGBufferWrite, renderGraph, hizTextureId.previous, outputTargetSetId);
auto dbufferTargetSetId = m_dbufferPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId);
- auto hiZTextureId = m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId);
+ m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId, hizTextureId.current);
auto velocityTargetSetId = m_velocityPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, outputTargetSetId);
auto ambientOcclusionTargetSetId = m_ambientOcclusionPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId);
auto contactShadowsTargetSetId = m_contactShadowsPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId);
@@ -163,11 +186,11 @@ void WorldRendererDeferred::setup(
visualTargetSetId.current,
gbufferTargetSetId,
dbufferTargetSetId,
- hiZTextureId,
ambientOcclusionTargetSetId,
contactShadowsTargetSetId,
reflectionsTargetSetId,
- shadowMapAtlasTargetSetId
+ shadowMapAtlasTargetSetId,
+ hizTextureId.current
);
m_postProcessPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, velocityTargetSetId, visualTargetSetId, outputTargetSetId);
@@ -181,11 +204,11 @@ void WorldRendererDeferred::setupVisualPass(
render::handle_t visualWriteTargetSetId,
render::handle_t gbufferTargetSetId,
render::handle_t dbufferTargetSetId,
- render::handle_t hiZTextureId,
render::handle_t ambientOcclusionTargetSetId,
render::handle_t contactShadowsTargetSetId,
render::handle_t reflectionsTargetSetId,
- render::handle_t shadowMapAtlasTargetSetId
+ render::handle_t shadowMapAtlasTargetSetId,
+ render::handle_t outputHiZTextureId
) const
{
T_PROFILER_SCOPE(L"World setup visual");
@@ -211,11 +234,11 @@ void WorldRendererDeferred::setupVisualPass(
Ref< render::RenderPass > rp = new render::RenderPass(L"Visual");
rp->addInput(gbufferTargetSetId);
rp->addInput(dbufferTargetSetId);
- // rp->addInput(hiZTextureId);
rp->addInput(ambientOcclusionTargetSetId);
// rp->addInput(contactShadowsTargetSetId);
rp->addInput(reflectionsTargetSetId);
rp->addInput(shadowMapAtlasTargetSetId);
+ rp->addInput(outputHiZTextureId);
for (auto attachment : m_visualAttachments)
rp->addInput(attachment);
diff --git a/code/World/Deferred/WorldRendererDeferred.h b/code/World/Deferred/WorldRendererDeferred.h
index b96e0625a4..3ed55a174a 100644
--- a/code/World/Deferred/WorldRendererDeferred.h
+++ b/code/World/Deferred/WorldRendererDeferred.h
@@ -65,11 +65,11 @@ class T_DLLCLASS WorldRendererDeferred : public WorldRendererShared
render::handle_t visualWriteTargetSetId,
render::handle_t gbufferTargetSetId,
render::handle_t dbufferTargetSetId,
- render::handle_t hiZTextureId,
render::handle_t ambientOcclusionTargetSetId,
render::handle_t contactShadowsTargetSetId,
render::handle_t reflectionsTargetSetId,
- render::handle_t shadowMapAtlasTargetSetId
+ render::handle_t shadowMapAtlasTargetSetId,
+ render::handle_t outputHiZTextureId
) const;
};
diff --git a/code/World/Forward/WorldRendererForward.cpp b/code/World/Forward/WorldRendererForward.cpp
index 0ee8944dd3..6e84a3ef22 100644
--- a/code/World/Forward/WorldRendererForward.cpp
+++ b/code/World/Forward/WorldRendererForward.cpp
@@ -139,9 +139,9 @@ void WorldRendererForward::setup(
// Add passes to render graph.
m_lightClusterPass->setup(worldRenderView, m_gatheredView);
- auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, nullptr, s_techniqueForwardGBufferWrite, renderGraph, outputTargetSetId);
+ auto gbufferTargetSetId = m_gbufferPass->setup(worldRenderView, m_gatheredView, nullptr, s_techniqueForwardGBufferWrite, renderGraph, 0, outputTargetSetId);
auto dbufferTargetSetId = m_dbufferPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId);
- auto hiZTargetSetId = m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId);
+ //m_hiZPass->setup(worldRenderView, renderGraph, gbufferTargetSetId);
auto velocityTargetSetId = m_velocityPass->setup(worldRenderView, m_gatheredView, count, renderGraph, gbufferTargetSetId, outputTargetSetId);
auto ambientOcclusionTargetSetId = m_ambientOcclusionPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, outputTargetSetId);
auto reflectionsTargetSetId = m_reflectionsPass->setup(worldRenderView, m_gatheredView, renderGraph, gbufferTargetSetId, dbufferTargetSetId, visualTargetSetId.previous, outputTargetSetId);
diff --git a/code/World/Shared/Passes/GBufferPass.cpp b/code/World/Shared/Passes/GBufferPass.cpp
index 9987bd3e0d..5ab95913d0 100644
--- a/code/World/Shared/Passes/GBufferPass.cpp
+++ b/code/World/Shared/Passes/GBufferPass.cpp
@@ -40,6 +40,7 @@ render::handle_t GBufferPass::setup(
const IrradianceGrid* irradianceGrid,
render::handle_t gbufferWriteTechnique,
render::RenderGraph& renderGraph,
+ render::handle_t hiZTextureId,
render::handle_t outputTargetSetId
) const
{
@@ -60,6 +61,7 @@ render::handle_t GBufferPass::setup(
// Add GBuffer render pass.
Ref< render::RenderPass > rp = new render::RenderPass(L"GBuffer");
+ rp->addInput(hiZTextureId);
render::Clear clear;
clear.mask = render::CfColor | render::CfDepth | render::CfStencil;
@@ -95,6 +97,12 @@ render::handle_t GBufferPass::setup(
sharedParams->setBufferViewParameter(s_handleIrradianceGridSBuffer, irradianceGrid->getBuffer()->getBufferView());
}
+ if (hiZTextureId != 0)
+ {
+ auto hiZTexture = renderGraph.getTexture(hiZTextureId);
+ sharedParams->setTextureParameter(s_handleHiZTexture, hiZTexture);
+ }
+
sharedParams->endParameters(renderContext);
const WorldRenderPassShared gbufferPass(
diff --git a/code/World/Shared/Passes/GBufferPass.h b/code/World/Shared/Passes/GBufferPass.h
index 4f36afe23d..f28cf3254a 100644
--- a/code/World/Shared/Passes/GBufferPass.h
+++ b/code/World/Shared/Passes/GBufferPass.h
@@ -44,6 +44,7 @@ class GBufferPass : public Object
const IrradianceGrid* irradianceGrid,
render::handle_t gbufferWriteTechnique,
render::RenderGraph& renderGraph,
+ render::handle_t hiZTextureId,
render::handle_t outputTargetSetId
) const;
diff --git a/code/World/Shared/Passes/HiZPass.cpp b/code/World/Shared/Passes/HiZPass.cpp
index 3a76476def..a7a020319f 100644
--- a/code/World/Shared/Passes/HiZPass.cpp
+++ b/code/World/Shared/Passes/HiZPass.cpp
@@ -47,10 +47,11 @@ bool HiZPass::create(resource::IResourceManager* resourceManager)
return true;
}
-render::handle_t HiZPass::setup(
+void HiZPass::setup(
const WorldRenderView& worldRenderView,
render::RenderGraph& renderGraph,
- render::handle_t gbufferTargetSetId
+ render::handle_t gbufferTargetSetId,
+ render::handle_t outputHiZTextureId
) const
{
T_PROFILER_SCOPE(L"HiZPass::setup");
@@ -60,16 +61,16 @@ render::handle_t HiZPass::setup(
const int32_t viewHeight = (int32_t)viewSize.y;
const int32_t mipCount = log2(std::max(viewWidth, viewHeight)) + 1;
- render::RenderGraphTextureDesc rgtd;
- rgtd.width = viewWidth >> 1;
- rgtd.height = viewHeight >> 1;
- rgtd.mipCount = mipCount - 1;
- rgtd.format = render::TfR32F;
- auto hizTextureId = renderGraph.addTransientTexture(L"HiZ", rgtd);
+ //render::RenderGraphTextureDesc rgtd;
+ //rgtd.width = viewWidth >> 1;
+ //rgtd.height = viewHeight >> 1;
+ //rgtd.mipCount = mipCount - 1;
+ //rgtd.format = render::TfR32F;
+ //auto hizTextureId = renderGraph.addTransientTexture(L"HiZ", rgtd);
Ref< render::RenderPass > rp = new render::RenderPass(L"HiZ");
rp->addInput(gbufferTargetSetId);
- rp->setOutput(hizTextureId);
+ rp->setOutput(outputHiZTextureId);
for (int32_t i = 0; i < mipCount - 2; ++i)
{
@@ -92,14 +93,14 @@ render::handle_t HiZPass::setup(
if (i == 0)
{
const auto inputTexture = renderGraph.getTargetSet(gbufferTargetSetId)->getColorTexture(0);
- const auto outputTexture = renderGraph.getTexture(hizTextureId);
+ const auto outputTexture = renderGraph.getTexture(outputHiZTextureId);
renderBlock->programParams->setImageViewParameter(s_handleHiZInput, inputTexture, 0);
renderBlock->programParams->setImageViewParameter(s_handleHiZOutput, outputTexture, 0);
}
else
{
- const auto inoutTexture = renderGraph.getTexture(hizTextureId);
+ const auto inoutTexture = renderGraph.getTexture(outputHiZTextureId);
renderBlock->programParams->setImageViewParameter(s_handleHiZInput, inoutTexture, i - 1);
renderBlock->programParams->setImageViewParameter(s_handleHiZOutput, inoutTexture, i);
@@ -116,7 +117,7 @@ render::handle_t HiZPass::setup(
renderGraph.addPass(rp);
- return hizTextureId;
+ //return hizTextureId;
}
}
diff --git a/code/World/Shared/Passes/HiZPass.h b/code/World/Shared/Passes/HiZPass.h
index c23936411d..774b80ead3 100644
--- a/code/World/Shared/Passes/HiZPass.h
+++ b/code/World/Shared/Passes/HiZPass.h
@@ -1,6 +1,6 @@
/*
* TRAKTOR
- * Copyright (c) 2023 Anders Pistol.
+ * Copyright (c) 2023-2024 Anders Pistol.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -42,10 +42,11 @@ class HiZPass : public Object
public:
bool create(resource::IResourceManager* resourceManager);
- render::handle_t setup(
+ void setup(
const WorldRenderView& worldRenderView,
render::RenderGraph& renderGraph,
- render::handle_t gbufferTargetSetId
+ render::handle_t gbufferTargetSetId,
+ render::handle_t outputHiZTextureId
) const;
private:
diff --git a/code/World/WorldHandles.cpp b/code/World/WorldHandles.cpp
index 2c06b31ecf..cb1eece320 100644
--- a/code/World/WorldHandles.cpp
+++ b/code/World/WorldHandles.cpp
@@ -69,6 +69,7 @@ const render::Handle s_handleGBufferNormalMap(L"World_GBufferNormalMap");
const render::Handle s_handleDBufferColorMap(L"World_DBufferColorMap");
const render::Handle s_handleDBufferMiscMap(L"World_DBufferMiscMap");
const render::Handle s_handleDBufferNormalMap(L"World_DBufferNormalMap");
+const render::Handle s_handleHiZTexture(L"World_HiZTexture");
// Irradiance grid.
const render::Handle s_handleIrradianceGridBoundsMax(L"World_IrradianceGridBoundsMax");
diff --git a/code/World/WorldHandles.h b/code/World/WorldHandles.h
index e6f5923af5..5d4e17846d 100644
--- a/code/World/WorldHandles.h
+++ b/code/World/WorldHandles.h
@@ -33,91 +33,92 @@ extern const render::Handle T_DLLCLASS s_techniqueVelocityWrite;
extern const render::Handle T_DLLCLASS s_techniqueShadow;
// Permutations
-extern const render::Handle s_handleIrradianceEnable;
-extern const render::Handle s_handleIrradianceSingle;
-extern const render::Handle s_handleVolumetricFogEnable;
+extern const render::Handle T_DLLCLASS s_handleIrradianceEnable;
+extern const render::Handle T_DLLCLASS s_handleIrradianceSingle;
+extern const render::Handle T_DLLCLASS s_handleVolumetricFogEnable;
// Shader parameters.
-extern const render::Handle s_handleIrradianceMap;
-extern const render::Handle s_handleDecalParams;
-extern const render::Handle s_handleExposure;
-extern const render::Handle s_handleFxRotate;
-extern const render::Handle s_handleExtent;
-extern const render::Handle s_handleFogColor;
-extern const render::Handle s_handleFogDistanceAndDensity;
-extern const render::Handle s_handleGamma;
-extern const render::Handle s_handleGammaInverse;
-extern const render::Handle s_handleLastWorld;
-extern const render::Handle s_handleLastWorldView;
-extern const render::Handle s_handleLightDiffuseMap;
-extern const render::Handle s_handleLightIndexSBuffer;
-extern const render::Handle s_handleLightMap;
-extern const render::Handle s_handleLightSBuffer;
-extern const render::Handle s_handleLightSpecularMap;
-extern const render::Handle s_handleMagicCoeffs;
-extern const render::Handle s_handleOcclusionMap;
-extern const render::Handle s_handleContactShadowsMap;
-extern const render::Handle s_handleProjection;
-extern const render::Handle s_handleReflectionMap;
-extern const render::Handle s_handleScreenMap;
-extern const render::Handle s_handleShadowMapAtlas;
-extern const render::Handle s_handleShadowBias;
-extern const render::Handle s_handleTileSBuffer;
-extern const render::Handle s_handleTime;
-extern const render::Handle s_handleViewDistance;
-extern const render::Handle s_handleView;
-extern const render::Handle s_handleViewInverse;
-extern const render::Handle s_handleWorld;
-extern const render::Handle s_handleWorldView;
-extern const render::Handle s_handleWorldViewInv;
-extern const render::Handle s_handleJitter;
-extern const render::Handle s_handleSlicePositions;
-extern const render::Handle s_handleGBufferColorMap;
-extern const render::Handle s_handleGBufferDepthMap;
-extern const render::Handle s_handleGBufferMiscMap;
-extern const render::Handle s_handleGBufferNormalMap;
-extern const render::Handle s_handleDBufferColorMap;
-extern const render::Handle s_handleDBufferMiscMap;
-extern const render::Handle s_handleDBufferNormalMap;
+extern const render::Handle T_DLLCLASS s_handleIrradianceMap;
+extern const render::Handle T_DLLCLASS s_handleDecalParams;
+extern const render::Handle T_DLLCLASS s_handleExposure;
+extern const render::Handle T_DLLCLASS s_handleFxRotate;
+extern const render::Handle T_DLLCLASS s_handleExtent;
+extern const render::Handle T_DLLCLASS s_handleFogColor;
+extern const render::Handle T_DLLCLASS s_handleFogDistanceAndDensity;
+extern const render::Handle T_DLLCLASS s_handleGamma;
+extern const render::Handle T_DLLCLASS s_handleGammaInverse;
+extern const render::Handle T_DLLCLASS s_handleLastWorld;
+extern const render::Handle T_DLLCLASS s_handleLastWorldView;
+extern const render::Handle T_DLLCLASS s_handleLightDiffuseMap;
+extern const render::Handle T_DLLCLASS s_handleLightIndexSBuffer;
+extern const render::Handle T_DLLCLASS s_handleLightMap;
+extern const render::Handle T_DLLCLASS s_handleLightSBuffer;
+extern const render::Handle T_DLLCLASS s_handleLightSpecularMap;
+extern const render::Handle T_DLLCLASS s_handleMagicCoeffs;
+extern const render::Handle T_DLLCLASS s_handleOcclusionMap;
+extern const render::Handle T_DLLCLASS s_handleContactShadowsMap;
+extern const render::Handle T_DLLCLASS s_handleProjection;
+extern const render::Handle T_DLLCLASS s_handleReflectionMap;
+extern const render::Handle T_DLLCLASS s_handleScreenMap;
+extern const render::Handle T_DLLCLASS s_handleShadowMapAtlas;
+extern const render::Handle T_DLLCLASS s_handleShadowBias;
+extern const render::Handle T_DLLCLASS s_handleTileSBuffer;
+extern const render::Handle T_DLLCLASS s_handleTime;
+extern const render::Handle T_DLLCLASS s_handleViewDistance;
+extern const render::Handle T_DLLCLASS s_handleView;
+extern const render::Handle T_DLLCLASS s_handleViewInverse;
+extern const render::Handle T_DLLCLASS s_handleWorld;
+extern const render::Handle T_DLLCLASS s_handleWorldView;
+extern const render::Handle T_DLLCLASS s_handleWorldViewInv;
+extern const render::Handle T_DLLCLASS s_handleJitter;
+extern const render::Handle T_DLLCLASS s_handleSlicePositions;
+extern const render::Handle T_DLLCLASS s_handleGBufferColorMap;
+extern const render::Handle T_DLLCLASS s_handleGBufferDepthMap;
+extern const render::Handle T_DLLCLASS s_handleGBufferMiscMap;
+extern const render::Handle T_DLLCLASS s_handleGBufferNormalMap;
+extern const render::Handle T_DLLCLASS s_handleDBufferColorMap;
+extern const render::Handle T_DLLCLASS s_handleDBufferMiscMap;
+extern const render::Handle T_DLLCLASS s_handleDBufferNormalMap;
+extern const render::Handle T_DLLCLASS s_handleHiZTexture;
// Irradiance grid.
-extern const render::Handle s_handleIrradianceGridBoundsMax;
-extern const render::Handle s_handleIrradianceGridBoundsMin;
-extern const render::Handle s_handleIrradianceGridSBuffer;
-extern const render::Handle s_handleIrradianceGridSize;
+extern const render::Handle T_DLLCLASS s_handleIrradianceGridBoundsMax;
+extern const render::Handle T_DLLCLASS s_handleIrradianceGridBoundsMin;
+extern const render::Handle T_DLLCLASS s_handleIrradianceGridSBuffer;
+extern const render::Handle T_DLLCLASS s_handleIrradianceGridSize;
// Reflection probe.
-extern const render::Handle s_handleProbeDiffuse;
-extern const render::Handle s_handleProbeIntensity;
-extern const render::Handle s_handleProbeTexture;
-extern const render::Handle s_handleProbeTextureMips;
-extern const render::Handle s_handleProbeVolumeCenter;
-extern const render::Handle s_handleProbeVolumeExtent;
-extern const render::Handle s_handleProbeRoughness;
-extern const render::Handle s_handleProbeFilterCorners;
+extern const render::Handle T_DLLCLASS s_handleProbeDiffuse;
+extern const render::Handle T_DLLCLASS s_handleProbeIntensity;
+extern const render::Handle T_DLLCLASS s_handleProbeTexture;
+extern const render::Handle T_DLLCLASS s_handleProbeTextureMips;
+extern const render::Handle T_DLLCLASS s_handleProbeVolumeCenter;
+extern const render::Handle T_DLLCLASS s_handleProbeVolumeExtent;
+extern const render::Handle T_DLLCLASS s_handleProbeRoughness;
+extern const render::Handle T_DLLCLASS s_handleProbeFilterCorners;
// Volumetric fog.
-extern const render::Handle s_handleFogVolume;
-extern const render::Handle s_handleFogVolumeTexture;
-extern const render::Handle s_handleFogVolumeRange;
-extern const render::Handle s_handleFogVolumeSliceCount;
-extern const render::Handle s_handleFogVolumeSliceCurrent;
-extern const render::Handle s_handleFogVolumeMediumColor;
-extern const render::Handle s_handleFogVolumeMediumDensity;
+extern const render::Handle T_DLLCLASS s_handleFogVolume;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeTexture;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeRange;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeSliceCount;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeSliceCurrent;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeMediumColor;
+extern const render::Handle T_DLLCLASS s_handleFogVolumeMediumDensity;
// Contact shadows.
-extern const render::Handle s_handleContactLightDirection;
+extern const render::Handle T_DLLCLASS s_handleContactLightDirection;
// ImageGraph inputs.
-extern const render::Handle s_handleInputColor;
-extern const render::Handle s_handleInputColorLast;
-extern const render::Handle s_handleInputDepth;
-extern const render::Handle s_handleInputNormal;
-extern const render::Handle s_handleInputVelocity;
-extern const render::Handle s_handleInputVelocityLast;
-extern const render::Handle s_handleInputColorGrading;
+extern const render::Handle T_DLLCLASS s_handleInputColor;
+extern const render::Handle T_DLLCLASS s_handleInputColorLast;
+extern const render::Handle T_DLLCLASS s_handleInputDepth;
+extern const render::Handle T_DLLCLASS s_handleInputNormal;
+extern const render::Handle T_DLLCLASS s_handleInputVelocity;
+extern const render::Handle T_DLLCLASS s_handleInputVelocityLast;
+extern const render::Handle T_DLLCLASS s_handleInputColorGrading;
// Persistent targets.
-extern const render::Handle s_handleTargetShadowMap[];
+extern const render::Handle T_DLLCLASS s_handleTargetShadowMap[];
}
diff --git a/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi b/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi
index a21073625b..cbfe69b036 100644
--- a/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi
+++ b/data/Source/System/Mesh/Shaders/Instance/Cull/Cull.xdi
@@ -5,8 +5,8 @@
{4BAA3A0D-D779-C141-B519-197EEA8640D6}
- 19
- 103
+ -336
+ 123
Global
@@ -14,8 +14,8 @@
{B63DBBD3-72C0-C645-8A24-4893BBF22E30}
- 248
- 112
+ -107
+ 132
x
@@ -23,8 +23,8 @@
{A4DC3ED3-6068-054F-9623-163C10D79FD1}
- 440
- 36
+ 85
+ 56
- rotation
@@ -35,8 +35,8 @@
{7E76A642-57F5-1F4D-90C1-E578206B7057}
- 109
- 20
+ -246
+ 40
InstanceWorld
@@ -54,8 +54,8 @@
{FB4B169C-944B-E049-927D-F60F28080923}
- 733
- 120
+ 378
+ 140
w
@@ -63,8 +63,8 @@
{91EC5EF9-EBF6-8546-A91A-4550CAEB6CDE}
- 733
- 50
+ 378
+ 70
xyz
@@ -72,10 +72,10 @@
{91A1C374-33C8-6F4C-B0E5-0D7C530C3452}
- 318
- 394
+ 383
+ 388
- InstanceMesh_View
+ World_View
Matrix
Frame
@@ -83,7 +83,7 @@
{012016E9-7DB1-D849-AF8D-3641CE8D9C6C}
- 269
+ 271
306
InstanceMesh_BoundingBoxMin
@@ -95,7 +95,7 @@
271
- 346
+ 347
InstanceMesh_BoundingBoxMax
Vector
@@ -105,8 +105,8 @@
{A12CD3AB-ABC5-BE47-882A-206186C7504A}
- 723
- 339
+ 722
+ 340
Frustum
@@ -186,8 +186,8 @@ $Output = (inside0 && inside1) ? 1.0f : 0.0f;
{861D7610-0664-6C4B-A21F-0D64852C2041}
- 1209
- 249
+ 1572
+ 363
WriteOut
Default
@@ -224,8 +224,8 @@ $Buffer[index].visible = $Input;
{32AF829B-BE26-9242-99ED-1189D698205D}
- 923
- 257
+ 1286
+ 371
InstanceMesh_Visibility
@@ -239,22 +239,155 @@ $Buffer[index].visible = $Input;
{91A8C6C3-38AF-0E49-9137-BEB73CB41DD4}
- 296
- 450
+ 223
+ 548
InstanceMesh_CullFrustum
Vector
Frame
12
- -
- {132DCAD9-5472-4B66-A84F-D5C4227C923A}
+
-
+ {2524AA09-8565-774A-B5BA-F09DAE6026BD}
+
+
+ 1212
+ 579
+
+ InstanceMesh_HiZ
+
+ -
+ {6FAE432D-36E8-D046-96BA-65165BB9DCCC}
+
+
+ 435
+ 918
+
+ World_HiZTexture
+ Texture2D
+ Frame
+
+ -
+ {B3BCC5CA-6F48-3A42-BB0C-3DE19CDFE7DF}
+
+
+ 721
+ 756
+
+ HiZ
+
+
+ 1
+ 1
+ 1
+
+
+
- {45D674A1-6AC4-6B4E-B7CB-DC7F9C2EC215}
+
+
+ -
+ {38213B60-FC63-A541-BCC2-95E414C2276D}
+ Bbmn
+
+ -
+ {484ABC89-3116-A645-8DEB-1DD2AD5B66E9}
+ Bbmx
+
+ -
+ {1384E810-955D-844D-B29B-91D1A448D1AC}
+ Translation
+
+ -
+ {38C7084D-4F8D-D749-A614-108D37B2EF5D}
+ View
+
+ -
+ {2D477B25-59BB-AB41-AD8A-B373447C47C4}
+ Projection
+
+ -
+ {B53AF0D1-D6CC-9A40-9334-2C4CD642EE5B}
+ HiZTexture
+
+ -
+ {6D0649E3-ED26-0646-A195-028038D29BD8}
+ HiZState
+
+
+
+ -
+ {5D1C8949-65AE-2046-A34D-469B22E09B20}
+ Output
+ Scalar
+
+
+
+
+ -
+ {E6AAA1C9-EEBE-3143-A4AB-7A05E14E17AB}
+
+
+ 435
+ 875
+
+ World_Projection
+ Matrix
+ Frame
+
+ -
+ {7B83C271-F045-4343-9666-B5DC8E2A479D}
+
+
+ 453
+ 961
+
+ FtPoint
+ FtPoint
+ FtPoint
+ AdWrap
+ AdWrap
+ AdWrap
+ CfNone
+ 0
+ false
+ false
+
+ -
+ {B2B588B8-DCC2-004F-AE5B-672497EEBFAB}
- 1038
- 370
+ 1011
+ 651
- 1
@@ -383,11 +516,121 @@ $Buffer[index].visible = $Input;
{C2E0B588-DBCB-F04B-9978-8C1B6593F31A}
+
+
+ {92AA3735-BB4C-4541-81DA-AC500930B2E6}
+
+
+ -
+
{89D6EAF6-DAAD-C647-B640-7F86B233A509}
+ -
+
+
+
+ {38213B60-FC63-A541-BCC2-95E414C2276D}
+
+
+ -
+
+
+
+ {484ABC89-3116-A645-8DEB-1DD2AD5B66E9}
+
+
+ -
+
+
+
+ {38C7084D-4F8D-D749-A614-108D37B2EF5D}
+
+
+ -
+
+
+
+ {1384E810-955D-844D-B29B-91D1A448D1AC}
+
+
+ -
+
+
+
+ {2D477B25-59BB-AB41-AD8A-B373447C47C4}
+
+
+ -
+
+
+
+ {B53AF0D1-D6CC-9A40-9334-2C4CD642EE5B}
+
+
+ -
+
+
+
+ {6D0649E3-ED26-0646-A195-028038D29BD8}
+
+
+ -
+
+
+
+ {D2D716D6-C4A1-471F-894A-D718515F6281}
+
+
+ -
+
+
+
+ {69997292-C813-490C-910C-620B9AD3A2BB}
+
+
+ -
+
+
+
+ {A1DDB166-9422-45A3-AE93-6702275DAD1C}
+
+
diff --git a/data/Source/System/Shaders/Modules/Frustum.xdi b/data/Source/System/Shaders/Modules/Frustum.xdi
index 64222753d0..51026471f4 100644
--- a/data/Source/System/Shaders/Modules/Frustum.xdi
+++ b/data/Source/System/Shaders/Modules/Frustum.xdi
@@ -23,6 +23,31 @@ bool FrustumInside(in Frustum frustum, in vec3 center, in float radius)
return true;
}
+// Sphere
+
+bool ProjectSphere(in vec3 center, in float radius, float znear, float P00, float P11, out vec4 aabb)
+{
+ if (center.z < radius + znear)
+ return false;
+
+ vec3 cr = center * radius;
+ float czr2 = center.z * center.z - radius * radius;
+
+ float vx = sqrt(center.x * center.x + czr2);
+ float minx = (vx * center.x - cr.z) / (vx * center.z + cr.x);
+ float maxx = (vx * center.x + cr.z) / (vx * center.z - cr.x);
+
+ float vy = sqrt(center.y * center.y + czr2);
+ float miny = (vy * center.y - cr.z) / (vy * center.z + cr.y);
+ float maxy = (vy * center.y + cr.z) / (vy * center.z - cr.y);
+
+ aabb = vec4(minx * P00, miny * P11, maxx * P00, maxy * P11);
+ aabb = aabb.xwzy * vec4(0.5f, -0.5f, 0.5f, -0.5f) + vec4(0.5f); // clip space -> uv space
+
+ return true;
+}
+
+
]]>