Add volume renderer extraction stage 5

This commit is contained in:
2026-04-08 20:12:14 +08:00
parent c6815fa809
commit b839fd98af
14 changed files with 906 additions and 7 deletions

View File

@@ -115,6 +115,10 @@ bool CompareVisibleItems(const VisibleRenderItem& lhs, const VisibleRenderItem&
return CompareVisibleRenderItemsStable(lhs, rhs);
}
bool CompareVisibleVolumes(const VisibleVolumeItem& lhs, const VisibleVolumeItem& rhs) {
return CompareVisibleVolumesStable(lhs, rhs);
}
} // namespace
RenderSceneData RenderSceneExtractor::Extract(
@@ -134,13 +138,22 @@ RenderSceneData RenderSceneExtractor::Extract(
const std::vector<Components::GameObject*> rootGameObjects = scene.GetRootGameObjects();
for (Components::GameObject* rootGameObject : rootGameObjects) {
ExtractVisibleItems(rootGameObject, cameraPosition, cullingMask, sceneData.visibleItems);
ExtractVisibleContent(
rootGameObject,
cameraPosition,
cullingMask,
sceneData.visibleItems,
sceneData.visibleVolumes);
}
std::stable_sort(
sceneData.visibleItems.begin(),
sceneData.visibleItems.end(),
CompareVisibleItems);
std::stable_sort(
sceneData.visibleVolumes.begin(),
sceneData.visibleVolumes.end(),
CompareVisibleVolumes);
ExtractLighting(scene, cameraPosition, cullingMask, sceneData.lighting);
return sceneData;
@@ -163,13 +176,22 @@ RenderSceneData RenderSceneExtractor::ExtractForCamera(
const std::vector<Components::GameObject*> rootGameObjects = scene.GetRootGameObjects();
for (Components::GameObject* rootGameObject : rootGameObjects) {
ExtractVisibleItems(rootGameObject, cameraPosition, cullingMask, sceneData.visibleItems);
ExtractVisibleContent(
rootGameObject,
cameraPosition,
cullingMask,
sceneData.visibleItems,
sceneData.visibleVolumes);
}
std::stable_sort(
sceneData.visibleItems.begin(),
sceneData.visibleItems.end(),
CompareVisibleItems);
std::stable_sort(
sceneData.visibleVolumes.begin(),
sceneData.visibleVolumes.end(),
CompareVisibleVolumes);
ExtractLighting(scene, cameraPosition, cullingMask, sceneData.lighting);
return sceneData;
@@ -281,11 +303,12 @@ void RenderSceneExtractor::ExtractLighting(
}
}
void RenderSceneExtractor::ExtractVisibleItems(
void RenderSceneExtractor::ExtractVisibleContent(
Components::GameObject* gameObject,
const Math::Vector3& cameraPosition,
uint32_t cullingMask,
std::vector<VisibleRenderItem>& visibleItems) const {
std::vector<VisibleRenderItem>& visibleItems,
std::vector<VisibleVolumeItem>& visibleVolumes) const {
if (gameObject == nullptr || !gameObject->IsActiveInHierarchy()) {
return;
}
@@ -295,10 +318,11 @@ void RenderSceneExtractor::ExtractVisibleItems(
if (isVisibleInCameraMask) {
AppendRenderItemsForGameObject(*gameObject, cameraPosition, visibleItems);
AppendVisibleVolumesForGameObject(*gameObject, cameraPosition, visibleVolumes);
}
for (Components::GameObject* child : gameObject->GetChildren()) {
ExtractVisibleItems(child, cameraPosition, cullingMask, visibleItems);
ExtractVisibleContent(child, cameraPosition, cullingMask, visibleItems, visibleVolumes);
}
}