-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRenderScene.cpp
More file actions
147 lines (131 loc) · 4 KB
/
Copy pathRenderScene.cpp
File metadata and controls
147 lines (131 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "RenderScene.h"
// ImGuiRegister.h include는 죽어 있었다(E4-6a 실측 — ImGui:: 사용 0건). 걷었다.
#include "Skeleton.h"
#include "Benchmark.hpp"
#include "TimeSystem.h"
#include "DataSystem.h"
#include "PrimitiveRenderProxy.h"
#include "LightRenderProxy.h"
RenderScene::~RenderScene()
{
}
void RenderScene::Initialize()
{
}
void RenderScene::Finalize()
{
{
SpinLock lightLock(m_lightProxyMapFlag);
m_lightProxyMap.clear();
}
{
SpinLock uiLock(m_uiProxyMapFlag);
m_uiProxyMap.clear();
}
{
SpinLock lock(m_proxyMapFlag);
m_proxyMap.clear();
}
m_animationJob.Finalize();
}
bool RenderScene::BeginProxyFrame(uint64_t sceneEpoch)
{
if (sceneEpoch < m_consumedSceneEpoch) return false;
if (sceneEpoch == m_consumedSceneEpoch) return true;
// epoch가 바뀌는 프레임 경계에서만 기존 씬 저장소를 한꺼번에 접는다.
// producer의 SetScene/OnDestroy는 이 맵들을 직접 만지지 않는다.
{
SpinLock lock(m_proxyMapFlag);
m_proxyMap.clear();
}
{
SpinLock lock(m_lightProxyMapFlag);
m_lightProxyMap.clear();
}
{
SpinLock lock(m_uiProxyMapFlag);
m_uiProxyMap.clear();
}
m_consumedSceneEpoch = sceneEpoch;
return true;
}
// Update()가 여기 있었다. 남은 일이 없어 걷었다 (PHASE 4-2).
//
// 두 가지가 순서대로 사라졌다:
// ① 광원 재수집 — 옛 Scene::m_lights 전체를 매 프레임 훑어 LightController로
// 복사했다. 광원이 등록/해제 기반 프록시가 된 뒤로 소비자가 없다
// (RenderSceneViewPlan ①).
// ② 활성 씬 당김 — m_currentScene = SceneManagers->GetActiveScene().
// 씬은 이미 SetScene으로 밀려 들어온다(초기화·씬 생성·활성 씬 변경
// 세 자리 전부 EnhancedSceneRenderer::SetActiveScene을 거친다).
// ★ 당김이 푸시를 덮고 있었다: SetActiveScene은 SetScene(scene) 직후
// Update(0.f)를 불렀는데, 그 Update가 방금 받은 scene을 버리고 전역의
// 활성 씬으로 되돌렸다. 둘이 어긋나는 전환 순간에만 드러나는 종류다.
//
// 이 당김이 RenderScene의 마지막 SceneManager 의존이었다.
RenderScene::ResourceCounts RenderScene::GetResourceCounts()
{
ResourceCounts counts{};
{
// 프록시 맵을 조작하는 다른 경로와 동일한 락 규약을 따른다.
SpinLock lock(m_proxyMapFlag);
counts.proxies = m_proxyMap.size();
}
counts.animators = m_animationJob.GetAnimatorCount();
// 팔레트는 더 이상 RenderScene registry가 아니다. Animator의 pose를 update
// delta가 명령 소유 버퍼로 복사하므로 진단 행은 활성 animator와 1:1이다.
counts.animationPalettes = counts.animators;
{
SpinLock lock(m_lightProxyMapFlag);
counts.lightProxies = m_lightProxyMap.size();
}
{
SpinLock lock(m_uiProxyMapFlag);
counts.uiProxies = m_uiProxyMap.size();
}
return counts;
}
RenderScene::ProxySnapshot RenderScene::GetPrimitiveProxySnapshot()
{
ProxySnapshot snapshot;
SpinLock lock(m_proxyMapFlag);
snapshot.reserve(m_proxyMap.size());
for (const auto& [guid, proxy] : m_proxyMap)
{
(void)guid;
if (proxy != nullptr)
{
snapshot.push_back(proxy);
}
}
return snapshot;
}
RenderScene::LightProxySnapshot RenderScene::GetLightProxySnapshot()
{
LightProxySnapshot snapshot;
SpinLock lock(m_lightProxyMapFlag);
snapshot.reserve(m_lightProxyMap.size());
for (const auto& [guid, proxy] : m_lightProxyMap)
{
(void)guid;
// 꺼진 광원은 여기서 거른다. 뷰마다 다시 거르면 카메라 수만큼
// 같은 판정을 반복하게 되고, 이 판정은 뷰와 무관하다.
if (nullptr != proxy && proxy->IsEnabled())
{
snapshot.push_back(proxy);
}
}
return snapshot;
}
RenderScene::UIProxySnapshot RenderScene::GetUIProxySnapshot()
{
UIProxySnapshot snapshot;
SpinLock lock(m_uiProxyMapFlag);
snapshot.reserve(m_uiProxyMap.size());
for (const auto& [guid, proxy] : m_uiProxyMap)
{
(void)guid;
if (nullptr != proxy && proxy->IsEnabled()) snapshot.push_back(proxy);
}
return snapshot;
}