@@ -23,20 +23,20 @@ TileOcclusionState CesiumViewExtension::getPrimitiveOcclusionState(
23
23
24
24
for (const SceneViewOcclusionResults& viewOcclusionResults :
25
25
_currentOcclusionResults.occlusionResultsByView ) {
26
- const FPrimitiveOcclusionHistory* pHistory =
27
- viewOcclusionResults.PrimitiveOcclusionHistorySet .Find (
28
- FPrimitiveOcclusionHistoryKey (id, 0 ));
26
+ const PrimitiveOcclusionResult* pOcclusionResult =
27
+ viewOcclusionResults.PrimitiveOcclusionResults .Find (id);
29
28
30
- if (pHistory && pHistory->LastConsideredTime >= frameTimeCutoff) {
31
- if (!pHistory->OcclusionStateWasDefiniteLastFrame ) {
29
+ if (pOcclusionResult &&
30
+ pOcclusionResult->LastConsideredTime >= frameTimeCutoff) {
31
+ if (!pOcclusionResult->OcclusionStateWasDefiniteLastFrame ) {
32
32
return TileOcclusionState::OcclusionUnavailable;
33
33
}
34
34
35
35
if (previouslyOccluded) {
36
- if (pHistory ->LastPixelsPercentage > 0 .01f ) {
36
+ if (pOcclusionResult ->LastPixelsPercentage > 0 .01f ) {
37
37
return TileOcclusionState::NotOccluded;
38
38
}
39
- } else if (!pHistory ->WasOccludedLastFrame ) {
39
+ } else if (!pOcclusionResult ->WasOccludedLastFrame ) {
40
40
return TileOcclusionState::NotOccluded;
41
41
}
42
42
@@ -71,9 +71,9 @@ void CesiumViewExtension::BeginRenderViewFamily(
71
71
// Recycle the current occlusion results.
72
72
for (SceneViewOcclusionResults& occlusionResults :
73
73
_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 ));
77
77
}
78
78
_currentOcclusionResults = {};
79
79
@@ -121,19 +121,21 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
121
121
// Do we actually need the view?
122
122
occlusionResults.pView = pView;
123
123
124
- if (!_recycledOcclusionHistorySets .IsEmpty ()) {
124
+ if (!_recycledOcclusionResultSets .IsEmpty ()) {
125
125
// Recycle a previously allocated occlusion history set, if one is
126
126
// 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 ();
132
130
} else {
133
131
// If no previously-allocated set exists, just allocate a new one. It
134
132
// 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);
137
139
}
138
140
139
141
// Unreal will not execute occlusion queries that get frustum culled in a
@@ -147,7 +149,7 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
147
149
if (pView->bIsViewInfo && pScene != nullptr ) {
148
150
const FViewInfo* pViewInfo = static_cast <const FViewInfo*>(pView);
149
151
const FSceneBitArray& visibility = pViewInfo->PrimitiveVisibilityMap ;
150
- auto & occlusion = occlusionResults.PrimitiveOcclusionHistorySet ;
152
+ auto & occlusion = occlusionResults.PrimitiveOcclusionResults ;
151
153
152
154
const uint32 PrimitiveCount = pScene->Primitives .Num ();
153
155
for (uint32 i = 0 ; i < PrimitiveCount; ++i) {
@@ -159,21 +161,18 @@ void CesiumViewExtension::PostRenderViewFamily_RenderThread(
159
161
if (pSceneInfo == nullptr )
160
162
continue ;
161
163
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 ) {
168
168
// No valid occlusion history for this culled primitive, so create
169
169
// 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 ));
177
176
}
178
177
}
179
178
}
0 commit comments