@@ -4549,7 +4549,6 @@ void UpdatePerFrameData(
45494549 const XMMATRIX viewMatrix = vis.camera->GetView();
45504550
45514551 uint32_t entityCounter = 0;
4552- uint32_t matrixCounter = 0;
45534552
45544553 // Write decals into entity array:
45554554 decalarray_offset = entityCounter;
@@ -4561,11 +4560,6 @@ void UpdatePerFrameData(
45614560 entityCounter--;
45624561 break;
45634562 }
4564- if (matrixCounter >= MATRIXARRAY_COUNT)
4565- {
4566- matrixCounter--;
4567- break;
4568- }
45694563 ShaderEntity shaderentity = {};
45704564 XMMATRIX shadermatrix;
45714565
@@ -4596,7 +4590,7 @@ void UpdatePerFrameData(
45964590 shaderentity.SetAngleScale(decal.normal_strength);
45974591 shaderentity.SetLength(decal.displacement_strength);
45984592
4599- shaderentity.SetIndices(matrixCounter , 0);
4593+ shaderentity.SetIndices(entityCounter , 0);
46004594 shadermatrix = XMMatrixInverse(nullptr, XMLoadFloat4x4(&decal.world));
46014595
46024596 int texture = -1;
@@ -4629,8 +4623,7 @@ void UpdatePerFrameData(
46294623 XMStoreFloat3(&cullsphere.center, XMVector3Transform(XMLoadFloat3(&shaderentity.position), viewMatrix));
46304624 cullsphere.radius = decal.range;
46314625
4632- XMStoreFloat4x4(matrixArray + matrixCounter, shadermatrix);
4633- matrixCounter++;
4626+ XMStoreFloat4x4(matrixArray + entityCounter, shadermatrix); // note: straight entity-matrix mapping ok
46344627
46354628 std::memcpy(entityArray + entityCounter, &shaderentity, sizeof(ShaderEntity));
46364629 std::memcpy(entityCullingArray + entityCounter, &cullsphere, sizeof(ShaderSphere));
@@ -4648,11 +4641,6 @@ void UpdatePerFrameData(
46484641 entityCounter--;
46494642 break;
46504643 }
4651- if (matrixCounter >= MATRIXARRAY_COUNT)
4652- {
4653- matrixCounter--;
4654- break;
4655- }
46564644 ShaderEntity shaderentity = {};
46574645 XMMATRIX shadermatrix;
46584646
@@ -4673,33 +4661,29 @@ void UpdatePerFrameData(
46734661 shaderentity.position = probe.position;
46744662 shaderentity.SetRange(probe.range);
46754663
4676- shaderentity.SetIndices(matrixCounter, 0);
4677- shadermatrix = XMLoadFloat4x4(&probe.inverseMatrix);
4678-
4679- int texture = -1;
4664+ int texture_index = -1;
46804665 if (probe.texture.IsValid())
46814666 {
4682- texture = device->GetDescriptorIndex(&probe.texture, SubresourceType::SRV, probe.subresource);
4667+ texture_index = device->GetDescriptorIndex(&probe.texture, SubresourceType::SRV, probe.subresource);
46834668 }
4669+ texture_index = std::max(0, texture_index);
46844670
4685- shadermatrix.r[0] = XMVectorSetW(shadermatrix.r[0], *(float*)&texture);
4686- shadermatrix.r[1] = XMVectorSetW(shadermatrix.r[1], 0);
4687- shadermatrix.r[2] = XMVectorSetW(shadermatrix.r[2], 0);
4688- shadermatrix.r[3] = XMVectorSetW(shadermatrix.r[3], 0);
4671+ shaderentity.SetIndices(entityCounter, (uint)texture_index);
4672+ shadermatrix = XMLoadFloat4x4(&probe.inverseMatrix);
46894673
46904674 ShaderSphere cullsphere = {};
46914675 XMStoreFloat3(&cullsphere.center, XMVector3Transform(XMLoadFloat3(&shaderentity.position), viewMatrix));
46924676 cullsphere.radius = probe.range;
46934677
4694- XMStoreFloat4x4(matrixArray + matrixCounter, shadermatrix);
4695- matrixCounter++;
4678+ XMStoreFloat4x4(matrixArray + entityCounter, shadermatrix); // note: straight entity-matrix mapping ok
46964679
46974680 std::memcpy(entityArray + entityCounter, &shaderentity, sizeof(ShaderEntity));
46984681 std::memcpy(entityCullingArray + entityCounter, &cullsphere, sizeof(ShaderSphere));
46994682 entityCounter++;
47004683 envprobearray_count++;
47014684 }
47024685
4686+ uint32_t matrixCounter = entityCounter; // so far entities and matrices had 1-1 mapping, this is not true below this part:
47034687 const XMFLOAT2 atlas_dim_rcp = XMFLOAT2(1.0f / float(shadowMapAtlas.desc.width), 1.0f / float(shadowMapAtlas.desc.height));
47044688
47054689 // Write directional lights into entity array:
@@ -4759,6 +4743,7 @@ void UpdatePerFrameData(
47594743 for (size_t cascade = 0; cascade < cascade_count; ++cascade)
47604744 {
47614745 XMStoreFloat4x4(&matrixArray[matrixCounter++], shcams[cascade].view_projection);
4746+ matrixCounter = std::min(matrixCounter, MATRIXARRAY_COUNT - 1);
47624747 }
47634748 }
47644749
@@ -4851,6 +4836,7 @@ void UpdatePerFrameData(
48514836 SHCAM shcam;
48524837 CreateSpotLightShadowCam(light, shcam);
48534838 XMStoreFloat4x4(&matrixArray[matrixCounter++], shcam.view_projection);
4839+ matrixCounter = std::min(matrixCounter, MATRIXARRAY_COUNT - 1);
48544840 }
48554841
48564842 if (light.IsCastingShadow())
@@ -5015,6 +5001,7 @@ void UpdatePerFrameData(
50155001 SHCAM shcam;
50165002 CreateSpotLightShadowCam(light, shcam);
50175003 XMStoreFloat4x4(&matrixArray[matrixCounter++], shcam.view_projection);
5004+ matrixCounter = std::min(matrixCounter, MATRIXARRAY_COUNT - 1);
50185005 }
50195006
50205007 if (light.IsCastingShadow())
@@ -5093,6 +5080,7 @@ void UpdatePerFrameData(
50935080 XMStoreFloat3(&cullsphere.center, XMVector3Transform(XMLoadFloat3(&shaderentity.position), viewMatrix));
50945081 cullsphere.radius = FLT_MAX;
50955082 matrixArray[matrixCounter++] = collider.plane.projection;
5083+ matrixCounter = std::min(matrixCounter, MATRIXARRAY_COUNT - 1);
50965084 break;
50975085 default:
50985086 assert(0);
0 commit comments