@@ -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