@@ -23,20 +23,20 @@ TileOcclusionState CesiumViewExtension::getPrimitiveOcclusionState(
2323
2424 for (const SceneViewOcclusionResults& viewOcclusionResults :
2525 _currentOcclusionResults.occlusionResultsByView ) {
26- const FPrimitiveOcclusionHistory* pHistory =
27- viewOcclusionResults.PrimitiveOcclusionHistorySet .Find (
28- FPrimitiveOcclusionHistoryKey (id, 0 ));
26+ const PrimitiveOcclusionResult* pOcclusionResult =
27+ viewOcclusionResults.PrimitiveOcclusionResults .Find (id);
2928
30- if (pHistory && pHistory->LastConsideredTime >= frameTimeCutoff) {
31- if (!pHistory->OcclusionStateWasDefiniteLastFrame ) {
29+ if (pOcclusionResult &&
30+ pOcclusionResult->LastConsideredTime >= frameTimeCutoff) {
31+ if (!pOcclusionResult->OcclusionStateWasDefiniteLastFrame ) {
3232 return TileOcclusionState::OcclusionUnavailable;
3333 }
3434
3535 if (previouslyOccluded) {
36- if (pHistory ->LastPixelsPercentage > 0 .01f ) {
36+ if (pOcclusionResult ->LastPixelsPercentage > 0 .01f ) {
3737 return TileOcclusionState::NotOccluded;
3838 }
39- } else if (!pHistory ->WasOccludedLastFrame ) {
39+ } else if (!pOcclusionResult ->WasOccludedLastFrame ) {
4040 return TileOcclusionState::NotOccluded;
4141 }
4242
@@ -71,9 +71,9 @@ void CesiumViewExtension::BeginRenderViewFamily(
7171 // Recycle the current occlusion results.
7272 for (SceneViewOcclusionResults& occlusionResults :
7373 _currentOcclusionResults.occlusionResultsByView ) {
74- occlusionResults.PrimitiveOcclusionHistorySet .Reset ();
75- _recycledOcclusionHistorySets .Enqueue (
76- std::move (occlusionResults.PrimitiveOcclusionHistorySet ));
74+ occlusionResults.PrimitiveOcclusionResults .Reset ();
75+ _recycledOcclusionResultSets .Enqueue (
76+ std::move (occlusionResults.PrimitiveOcclusionResults ));
7777 }
7878 _currentOcclusionResults = {};
7979
@@ -121,19 +121,21 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
121121 // Do we actually need the view?
122122 occlusionResults.pView = pView;
123123
124- if (!_recycledOcclusionHistorySets .IsEmpty ()) {
124+ if (!_recycledOcclusionResultSets .IsEmpty ()) {
125125 // Recycle a previously allocated occlusion history set, if one is
126126 // available.
127- occlusionResults.PrimitiveOcclusionHistorySet =
128- std::move (*_recycledOcclusionHistorySets.Peek ());
129- _recycledOcclusionHistorySets.Pop ();
130- occlusionResults.PrimitiveOcclusionHistorySet .Append (
131- pViewState->PrimitiveOcclusionHistorySet );
127+ occlusionResults.PrimitiveOcclusionResults =
128+ std::move (*_recycledOcclusionResultSets.Peek ());
129+ _recycledOcclusionResultSets.Pop ();
132130 } else {
133131 // If no previously-allocated set exists, just allocate a new one. It
134132 // will be recycled later.
135- occlusionResults.PrimitiveOcclusionHistorySet =
136- pViewState->PrimitiveOcclusionHistorySet ;
133+ }
134+
135+ occlusionResults.PrimitiveOcclusionResults .Reserve (
136+ pViewState->PrimitiveOcclusionHistorySet .Num ());
137+ for (const auto & element : pViewState->PrimitiveOcclusionHistorySet ) {
138+ occlusionResults.PrimitiveOcclusionResults .Emplace (element);
137139 }
138140
139141 // Unreal will not execute occlusion queries that get frustum culled in a
@@ -147,7 +149,7 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
147149 if (pView->bIsViewInfo && pScene != nullptr ) {
148150 const FViewInfo* pViewInfo = static_cast <const FViewInfo*>(pView);
149151 const FSceneBitArray& visibility = pViewInfo->PrimitiveVisibilityMap ;
150- auto & occlusion = occlusionResults.PrimitiveOcclusionHistorySet ;
152+ auto & occlusion = occlusionResults.PrimitiveOcclusionResults ;
151153
152154 const uint32 PrimitiveCount = pScene->Primitives .Num ();
153155 for (uint32 i = 0 ; i < PrimitiveCount; ++i) {
@@ -159,21 +161,18 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
159161 if (pSceneInfo == nullptr )
160162 continue ;
161163
162- const FPrimitiveOcclusionHistory* pHistory =
163- occlusion.Find (FPrimitiveOcclusionHistoryKey (
164- pSceneInfo->PrimitiveComponentId ,
165- 0 ));
166- if (!pHistory ||
167- pHistory->LastConsideredTime < pViewState->LastRenderTime ) {
164+ const PrimitiveOcclusionResult* pOcclusionResult =
165+ occlusion.Find (pSceneInfo->PrimitiveComponentId );
166+ if (!pOcclusionResult || pOcclusionResult->LastConsideredTime <
167+ pViewState->LastRenderTime ) {
168168 // No valid occlusion history for this culled primitive, so create
169169 // it.
170- FPrimitiveOcclusionHistory historyEntry{};
171- historyEntry.PrimitiveId = pSceneInfo->PrimitiveComponentId ;
172- historyEntry.LastConsideredTime = pViewState->LastRenderTime ;
173- historyEntry.LastPixelsPercentage = 0 .0f ;
174- historyEntry.WasOccludedLastFrame = true ;
175- historyEntry.OcclusionStateWasDefiniteLastFrame = true ;
176- occlusion.Add (std::move (historyEntry));
170+ occlusion.Emplace (PrimitiveOcclusionResult (
171+ pSceneInfo->PrimitiveComponentId ,
172+ pViewState->LastRenderTime ,
173+ 0 .0f ,
174+ true ,
175+ true ));
177176 }
178177 }
179178 }
0 commit comments