Skip to content

Commit 6f6412f

Browse files
committed
fix: multiviewport shadow issues
1 parent 25812ae commit 6f6412f

File tree

2 files changed

+64
-22
lines changed

2 files changed

+64
-22
lines changed

docs/changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ away, please see git history for details.
77

88
- v0.5.4 (2025-xx-xx) add ACES & Reinhard tonemapping
99
add exposure, contrast, brightness, & saturation controls
10+
fix long standing shadow mapping viewport technique issue
1011
- v0.5.3 (2025-08-01) fix pl_ds.h hm32 reset (v1.0.1)
1112
fix several internal issues with the metal backend
1213
add debug names to vulkan pipelines

extensions/pl_renderer_ext.c

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,39 +2006,80 @@ pl_renderer_prepare_scene(plScene* ptScene)
20062006
uint32_t uInstanceOffset = 0;
20072007
const uint32_t uObjectCount = pl_sb_size(ptScene->sbtDrawables);
20082008
const plEcsTypeKey tTransformComponentType = gptECS->get_ecs_type_key_transform();
2009-
for(uint32_t i = 0; i < uObjectCount; i++)
2009+
2010+
if(gptData->tRuntimeOptions.bMultiViewportShadows)
20102011
{
2012+
for(uint32_t i = 0; i < uObjectCount; i++)
2013+
{
20112014

2012-
plObjectComponent* ptObject = gptECS->get_component(ptScene->ptComponentLibrary, gptData->tObjectComponentType, ptScene->sbtDrawables[i].tEntity);
2015+
plObjectComponent* ptObject = gptECS->get_component(ptScene->ptComponentLibrary, gptData->tObjectComponentType, ptScene->sbtDrawables[i].tEntity);
20132016

2014-
// copy transform into proper location in CPU side buffer
2015-
plTransformComponent* ptTransform = gptECS->get_component(ptScene->ptComponentLibrary, tTransformComponentType, ptObject->tTransform);
2016-
memcpy(&ptTransformBuffer->tMemoryAllocation.pHostMapped[ptScene->sbtDrawables[i].uTransformIndex * sizeof(plMat4)], &ptTransform->tWorld, sizeof(plMat4));
2017+
// copy transform into proper location in CPU side buffer
2018+
plTransformComponent* ptTransform = gptECS->get_component(ptScene->ptComponentLibrary, tTransformComponentType, ptObject->tTransform);
2019+
memcpy(&ptTransformBuffer->tMemoryAllocation.pHostMapped[ptScene->sbtDrawables[i].uTransformIndex * sizeof(plMat4)], &ptTransform->tWorld, sizeof(plMat4));
2020+
2021+
// if using instancing, set index into instance buffer and
2022+
// this includes setting the viewport instance data for multiviewport
2023+
// shadow technique
2024+
if(ptScene->sbtDrawables[i].uInstanceCount != 0)
2025+
{
2026+
ptScene->sbtDrawables[i].uInstanceIndex = uInstanceOffset;
2027+
2028+
for(int32_t iViewport = 0; iViewport < 6; iViewport++)
2029+
{
2030+
for(uint32_t uInstance = 0; uInstance < ptScene->sbtDrawables[i].uInstanceCount; uInstance++)
2031+
{
2032+
uint32_t uTransformIndex = ptScene->sbtDrawables[i + uInstance].uTransformIndex;
2033+
2034+
plShadowInstanceBufferData tShadowInstanceData = {
2035+
.uTransformIndex = uTransformIndex,
2036+
.iViewportIndex = iViewport
2037+
};
2038+
2039+
memcpy(&ptInstanceBuffer->tMemoryAllocation.pHostMapped[uInstanceOffset * sizeof(tShadowInstanceData)], &tShadowInstanceData, sizeof(tShadowInstanceData));
2040+
uInstanceOffset++;
2041+
}
2042+
}
2043+
}
20172044

2018-
// if using instancing, set index into instance buffer and
2019-
// this includes setting the viewport instance data for multiviewport
2020-
// shadow technique
2021-
if(ptScene->sbtDrawables[i].uInstanceCount != 0)
2045+
}
2046+
}
2047+
else
2048+
{
2049+
for(uint32_t i = 0; i < uObjectCount; i++)
20222050
{
2023-
ptScene->sbtDrawables[i].uInstanceIndex = uInstanceOffset;
20242051

2025-
for(int32_t iViewport = 0; iViewport < 6; iViewport++)
2052+
plObjectComponent* ptObject = gptECS->get_component(ptScene->ptComponentLibrary, gptData->tObjectComponentType, ptScene->sbtDrawables[i].tEntity);
2053+
2054+
// copy transform into proper location in CPU side buffer
2055+
plTransformComponent* ptTransform = gptECS->get_component(ptScene->ptComponentLibrary, tTransformComponentType, ptObject->tTransform);
2056+
memcpy(&ptTransformBuffer->tMemoryAllocation.pHostMapped[ptScene->sbtDrawables[i].uTransformIndex * sizeof(plMat4)], &ptTransform->tWorld, sizeof(plMat4));
2057+
2058+
// if using instancing, set index into instance buffer and
2059+
// this includes setting the viewport instance data for multiviewport
2060+
// shadow technique
2061+
if(ptScene->sbtDrawables[i].uInstanceCount != 0)
20262062
{
2027-
for(uint32_t uInstance = 0; uInstance < ptScene->sbtDrawables[i].uInstanceCount; uInstance++)
2028-
{
2029-
uint32_t uTransformIndex = ptScene->sbtDrawables[i + uInstance].uTransformIndex;
2063+
ptScene->sbtDrawables[i].uInstanceIndex = uInstanceOffset;
20302064

2031-
plShadowInstanceBufferData tShadowInstanceData = {
2032-
.uTransformIndex = uTransformIndex,
2033-
.iViewportIndex = iViewport
2034-
};
2035-
2036-
memcpy(&ptInstanceBuffer->tMemoryAllocation.pHostMapped[uInstanceOffset * sizeof(tShadowInstanceData)], &tShadowInstanceData, sizeof(tShadowInstanceData));
2037-
uInstanceOffset++;
2065+
for(int32_t iViewport = 0; iViewport < 6; iViewport++)
2066+
{
2067+
for(uint32_t uInstance = 0; uInstance < ptScene->sbtDrawables[i].uInstanceCount; uInstance++)
2068+
{
2069+
uint32_t uTransformIndex = ptScene->sbtDrawables[i + uInstance].uTransformIndex;
2070+
2071+
plShadowInstanceBufferData tShadowInstanceData = {
2072+
.uTransformIndex = uTransformIndex,
2073+
.iViewportIndex = 0
2074+
};
2075+
2076+
memcpy(&ptInstanceBuffer->tMemoryAllocation.pHostMapped[uInstanceOffset * sizeof(tShadowInstanceData)], &tShadowInstanceData, sizeof(tShadowInstanceData));
2077+
uInstanceOffset++;
2078+
}
20382079
}
20392080
}
2040-
}
20412081

2082+
}
20422083
}
20432084

20442085
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~perform skinning~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)