@@ -241,33 +241,25 @@ namespace EveryRay_Core
241
241
242
242
// all probes positions GPU buffer
243
243
{
244
- XMFLOAT4* diffuseProbesPositionsCPUBuffer = new XMFLOAT4[mDiffuseProbesCountTotal ];
244
+ assert (!mDiffuseProbesPositionsTempCPUBuffer );
245
+
246
+ mDiffuseProbesPositionsTempCPUBuffer = new XMFLOAT4[mDiffuseProbesCountTotal ];
245
247
for (int probeIndex = 0 ; probeIndex < mDiffuseProbesCountTotal ; probeIndex++)
246
- diffuseProbesPositionsCPUBuffer [probeIndex] = XMFLOAT4 (mDiffuseProbes [probeIndex].GetPosition ().x , mDiffuseProbes [probeIndex].GetPosition ().y , mDiffuseProbes [probeIndex].GetPosition ().z , 1.0 );
248
+ mDiffuseProbesPositionsTempCPUBuffer [probeIndex] = XMFLOAT4 (mDiffuseProbes [probeIndex].GetPosition ().x , mDiffuseProbes [probeIndex].GetPosition ().y , mDiffuseProbes [probeIndex].GetPosition ().z , 1.0 );
247
249
248
250
mDiffuseProbesPositionsGPUBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: diffuse probes positions buffer" );
249
- mDiffuseProbesPositionsGPUBuffer ->CreateGPUBufferResource (rhi, diffuseProbesPositionsCPUBuffer , mDiffuseProbesCountTotal , sizeof (XMFLOAT4), mIsPlacedOnTerrain , ER_BIND_SHADER_RESOURCE, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
251
+ mDiffuseProbesPositionsGPUBuffer ->CreateGPUBufferResource (rhi, mDiffuseProbesPositionsTempCPUBuffer , mDiffuseProbesCountTotal , sizeof (XMFLOAT4), mIsPlacedOnTerrain , ER_BIND_SHADER_RESOURCE, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
250
252
251
253
if (mIsPlacedOnTerrain )
252
254
{
253
255
mDiffuseInputPositionsOnTerrainBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: On-terrain placement input positions buffer (diffuse probes)" );
254
- mDiffuseInputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, diffuseProbesPositionsCPUBuffer , mDiffuseProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_UNORDERED_ACCESS, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
256
+ mDiffuseInputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, mDiffuseProbesPositionsTempCPUBuffer , mDiffuseProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_UNORDERED_ACCESS, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
255
257
256
258
mDiffuseOutputPositionsOnTerrainBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: On-terrain placement output positions buffer (diffuse probes)" );
257
- mDiffuseOutputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, diffuseProbesPositionsCPUBuffer, mDiffuseProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_NONE, 0x10000L | 0x20000L /* legacy from DX11*/ , ER_RESOURCE_MISC_BUFFER_STRUCTURED); // should be STAGING
258
-
259
- PlaceProbesOnTerrain (core, mDiffuseOutputPositionsOnTerrainBuffer , mDiffuseInputPositionsOnTerrainBuffer , diffuseProbesPositionsCPUBuffer, mDiffuseProbesCountTotal , mTerrainPlacementHeightDeltaDiffuseProbes );
260
-
261
- rhi->UpdateBuffer (mDiffuseProbesPositionsGPUBuffer , (void *)diffuseProbesPositionsCPUBuffer, mDiffuseProbesCountTotal * sizeof (XMFLOAT4));
259
+ mDiffuseOutputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, mDiffuseProbesPositionsTempCPUBuffer , mDiffuseProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_NONE, 0x10000L | 0x20000L /* legacy from DX11*/ , ER_RESOURCE_MISC_BUFFER_STRUCTURED); // should be STAGING
262
260
263
- for (int i = 0 ; i < mDiffuseProbesCountTotal ; i++)
264
- mDiffuseProbes [i].SetPosition (XMFLOAT3 (diffuseProbesPositionsCPUBuffer[i].x , diffuseProbesPositionsCPUBuffer[i].y , diffuseProbesPositionsCPUBuffer[i].z ));
265
-
266
- DeleteObject (mDiffuseInputPositionsOnTerrainBuffer );
267
- DeleteObject (mDiffuseOutputPositionsOnTerrainBuffer );
261
+ PlaceProbesOnTerrain (core, DIFFUSE_PROBE, mDiffuseOutputPositionsOnTerrainBuffer , mDiffuseInputPositionsOnTerrainBuffer , mDiffuseProbesPositionsTempCPUBuffer , mDiffuseProbesCountTotal , mTerrainPlacementHeightDeltaDiffuseProbes );
268
262
}
269
-
270
- DeleteObjects (diffuseProbesPositionsCPUBuffer);
271
263
}
272
264
273
265
// probe cell's indices GPU buffer, tex. array indices GPU/CPU buffers
@@ -396,33 +388,24 @@ namespace EveryRay_Core
396
388
397
389
// all probes positions GPU buffer
398
390
{
399
- XMFLOAT4* specularProbesPositionsCPUBuffer = new XMFLOAT4[mSpecularProbesCountTotal ];
391
+ assert (!mSpecularProbesPositionsTempCPUBuffer );
392
+ mSpecularProbesPositionsTempCPUBuffer = new XMFLOAT4[mSpecularProbesCountTotal ];
400
393
401
394
for (int probeIndex = 0 ; probeIndex < mSpecularProbesCountTotal ; probeIndex++)
402
- specularProbesPositionsCPUBuffer [probeIndex] = XMFLOAT4 (mSpecularProbes [probeIndex].GetPosition ().x ,mSpecularProbes [probeIndex].GetPosition ().y ,mSpecularProbes [probeIndex].GetPosition ().z , 1.0 );
395
+ mSpecularProbesPositionsTempCPUBuffer [probeIndex] = XMFLOAT4 (mSpecularProbes [probeIndex].GetPosition ().x ,mSpecularProbes [probeIndex].GetPosition ().y ,mSpecularProbes [probeIndex].GetPosition ().z , 1.0 );
403
396
mSpecularProbesPositionsGPUBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: specular probes positions buffer" );
404
- mSpecularProbesPositionsGPUBuffer ->CreateGPUBufferResource (rhi, specularProbesPositionsCPUBuffer , mSpecularProbesCountTotal , sizeof (XMFLOAT4), mIsPlacedOnTerrain , ER_BIND_SHADER_RESOURCE, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
397
+ mSpecularProbesPositionsGPUBuffer ->CreateGPUBufferResource (rhi, mSpecularProbesPositionsTempCPUBuffer , mSpecularProbesCountTotal , sizeof (XMFLOAT4), mIsPlacedOnTerrain , ER_BIND_SHADER_RESOURCE, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
405
398
406
399
if (mIsPlacedOnTerrain )
407
400
{
408
401
mSpecularInputPositionsOnTerrainBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: On-terrain placement input positions buffer (specular probes)" );
409
- mSpecularInputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, specularProbesPositionsCPUBuffer , mSpecularProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_UNORDERED_ACCESS, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
402
+ mSpecularInputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, mSpecularProbesPositionsTempCPUBuffer , mSpecularProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_UNORDERED_ACCESS, 0 , ER_RESOURCE_MISC_BUFFER_STRUCTURED);
410
403
411
404
mSpecularOutputPositionsOnTerrainBuffer = rhi->CreateGPUBuffer (" ER_RHI_GPUBuffer: On-terrain placement output positions buffer (specular probes)" );
412
- mSpecularOutputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, specularProbesPositionsCPUBuffer, mSpecularProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_NONE, 0x10000L | 0x20000L /* legacy from DX11*/ , ER_RESOURCE_MISC_BUFFER_STRUCTURED); // should be STAGING
413
-
414
- PlaceProbesOnTerrain (game, mSpecularOutputPositionsOnTerrainBuffer , mSpecularInputPositionsOnTerrainBuffer , specularProbesPositionsCPUBuffer, mSpecularProbesCountTotal , mTerrainPlacementHeightDeltaSpecularProbes );
405
+ mSpecularOutputPositionsOnTerrainBuffer ->CreateGPUBufferResource (rhi, mSpecularProbesPositionsTempCPUBuffer , mSpecularProbesCountTotal , sizeof (XMFLOAT4), false , ER_BIND_NONE, 0x10000L | 0x20000L /* legacy from DX11*/ , ER_RESOURCE_MISC_BUFFER_STRUCTURED); // should be STAGING
415
406
416
- rhi->UpdateBuffer (mSpecularProbesPositionsGPUBuffer , (void *)specularProbesPositionsCPUBuffer, mSpecularProbesCountTotal * sizeof (XMFLOAT4));
417
-
418
- for (int i = 0 ; i < mSpecularProbesCountTotal ; i++)
419
- mSpecularProbes [i].SetPosition (XMFLOAT3 (specularProbesPositionsCPUBuffer[i].x , specularProbesPositionsCPUBuffer[i].y , specularProbesPositionsCPUBuffer[i].z ));
420
-
421
- DeleteObject (mSpecularInputPositionsOnTerrainBuffer );
422
- DeleteObject (mSpecularOutputPositionsOnTerrainBuffer );
407
+ PlaceProbesOnTerrain (game, SPECULAR_PROBE, mSpecularOutputPositionsOnTerrainBuffer , mSpecularInputPositionsOnTerrainBuffer , mSpecularProbesPositionsTempCPUBuffer , mSpecularProbesCountTotal , mTerrainPlacementHeightDeltaSpecularProbes );
423
408
}
424
-
425
- DeleteObjects (specularProbesPositionsCPUBuffer);
426
409
}
427
410
428
411
// probe cell's indices GPU buffer, tex. array indices GPU/CPU buffers
@@ -834,6 +817,12 @@ namespace EveryRay_Core
834
817
oldInstancedData[i].World ._44 = isCulled ? 1 .0f : 0 .0f ;
835
818
// writing cubemap index to [0][0] of world instanced matrix (since we don't need scale)
836
819
oldInstancedData[i].World ._11 = -1 .0f ;
820
+ // updating position
821
+ const XMFLOAT3& pos = probes[i].GetPosition ();
822
+ oldInstancedData[i].World ._41 = pos.x ;
823
+ oldInstancedData[i].World ._42 = pos.y ;
824
+ oldInstancedData[i].World ._43 = pos.z ;
825
+
837
826
if (!isCulled)
838
827
{
839
828
if (aType == DIFFUSE_PROBE)
@@ -885,6 +874,12 @@ namespace EveryRay_Core
885
874
886
875
void ER_LightProbesManager::UpdateProbes (ER_Core& game)
887
876
{
877
+ // delete temp CPU buffers in the first frame (we should have the positions in probes already)
878
+ if (mDiffuseProbesPositionsTempCPUBuffer )
879
+ DeleteObjects (mDiffuseProbesPositionsTempCPUBuffer );
880
+ if (mSpecularProbesPositionsTempCPUBuffer )
881
+ DeleteObjects (mSpecularProbesPositionsTempCPUBuffer );
882
+
888
883
// int difProbeCellIndexCamera = GetCellIndex(mMainCamera.Position(), DIFFUSE_PROBE);
889
884
if (mDistanceBetweenSpecularProbes > 0 )
890
885
assert (mMaxSpecularProbesInVolumeCount > 0 );
@@ -893,7 +888,7 @@ namespace EveryRay_Core
893
888
UpdateProbesByType (game, SPECULAR_PROBE);
894
889
}
895
890
896
- void ER_LightProbesManager::PlaceProbesOnTerrain (ER_Core& game, ER_RHI_GPUBuffer* outputBuffer, ER_RHI_GPUBuffer* inputBuffer, XMFLOAT4* positions, int positionsCount, float customDampDelta /* = FLT_MAX*/ )
891
+ void ER_LightProbesManager::PlaceProbesOnTerrain (ER_Core& game, ER_ProbeType aType, ER_RHI_GPUBuffer* outputBuffer, ER_RHI_GPUBuffer* inputBuffer, XMFLOAT4* positions, int positionsCount, float customDampDelta /* = FLT_MAX*/ )
897
892
{
898
893
assert (mIsPlacedOnTerrain );
899
894
@@ -902,5 +897,35 @@ namespace EveryRay_Core
902
897
throw ER_CoreException (" You want to place light probes on terrain but terrain is not found in the scene!" );
903
898
904
899
terrain->PlaceOnTerrain (outputBuffer, inputBuffer, positions, positionsCount, TerrainSplatChannels::NONE, nullptr , 0 , customDampDelta);
900
+
901
+ ER_RHI_GPUBuffer* finalGPUBuffer = (aType == DIFFUSE_PROBE) ? mDiffuseProbesPositionsGPUBuffer : mSpecularProbesPositionsGPUBuffer ;
902
+
903
+ #ifndef ER_PLATFORM_WIN64_DX11
904
+ const std::string probeTypeName = (aType == DIFFUSE_PROBE) ? " diffuse" : " specular" ;
905
+ const std::string eventName = " On-terrain placement callback - placement of probes: " + probeTypeName;
906
+ terrain->ReadbackPlacedPositionsOnInitEvent ->AddListener (eventName,
907
+ [&, aType, finalGPUBuffer, outputBuffer, inputBuffer, positions, positionsCount, rhi = game.GetRHI (), sandbox = game.GetLevel ()](ER_Terrain* aTerrain)
908
+ {
909
+ assert (aTerrain);
910
+ aTerrain->ReadbackPlacedPositions (outputBuffer, inputBuffer, positions, positionsCount);
911
+
912
+ rhi->UpdateBuffer (finalGPUBuffer, (void *)positions, positionsCount * sizeof (XMFLOAT4), true );
913
+
914
+ if (aType == DIFFUSE_PROBE)
915
+ for (int i = 0 ; i < positionsCount; i++)
916
+ sandbox->mLightProbesManager ->SetDiffuseProbePosition (i, XMFLOAT3 (positions[i].x , positions[i].y , positions[i].z ));
917
+ else
918
+ for (int i = 0 ; i < positionsCount; i++)
919
+ sandbox->mLightProbesManager ->SetSpecularProbePosition (i, XMFLOAT3 (positions[i].x , positions[i].y , positions[i].z ));
920
+ }
921
+ );
922
+ #else
923
+ std::vector<ER_LightProbe>& probes = (aType == DIFFUSE_PROBE) ? mDiffuseProbes : mSpecularProbes ;
924
+
925
+ game.GetRHI ()->UpdateBuffer (finalGPUBuffer, (void *)positions, positionsCount * sizeof (XMFLOAT4));
926
+
927
+ for (int i = 0 ; i < positionsCount; i++)
928
+ probes[i].SetPosition (XMFLOAT3 (positions[i].x , positions[i].y , positions[i].z ));
929
+ #endif
905
930
}
906
931
}
0 commit comments