feat: add camera culling masks

This commit is contained in:
2026-04-01 01:42:06 +08:00
parent 51736253e3
commit 0fe02fd1b4
9 changed files with 81 additions and 3 deletions

View File

@@ -64,10 +64,11 @@ RenderSceneData RenderSceneExtractor::Extract(
sceneData.cameraData = BuildCameraData(*sceneData.camera, viewportWidth, viewportHeight);
const Math::Vector3 cameraPosition = sceneData.cameraData.worldPosition;
const uint32_t cullingMask = sceneData.camera->GetCullingMask();
const std::vector<Components::GameObject*> rootGameObjects = scene.GetRootGameObjects();
for (Components::GameObject* rootGameObject : rootGameObjects) {
ExtractVisibleItems(rootGameObject, cameraPosition, sceneData.visibleItems);
ExtractVisibleItems(rootGameObject, cameraPosition, cullingMask, sceneData.visibleItems);
}
std::stable_sort(
@@ -92,10 +93,11 @@ RenderSceneData RenderSceneExtractor::ExtractForCamera(
sceneData.camera = &camera;
sceneData.cameraData = BuildCameraData(camera, viewportWidth, viewportHeight);
const Math::Vector3 cameraPosition = sceneData.cameraData.worldPosition;
const uint32_t cullingMask = camera.GetCullingMask();
const std::vector<Components::GameObject*> rootGameObjects = scene.GetRootGameObjects();
for (Components::GameObject* rootGameObject : rootGameObjects) {
ExtractVisibleItems(rootGameObject, cameraPosition, sceneData.visibleItems);
ExtractVisibleItems(rootGameObject, cameraPosition, cullingMask, sceneData.visibleItems);
}
std::stable_sort(
@@ -224,15 +226,20 @@ void RenderSceneExtractor::ExtractLighting(
void RenderSceneExtractor::ExtractVisibleItems(
Components::GameObject* gameObject,
const Math::Vector3& cameraPosition,
uint32_t cullingMask,
std::vector<VisibleRenderItem>& visibleItems) const {
if (gameObject == nullptr || !gameObject->IsActiveInHierarchy()) {
return;
}
const uint32_t gameObjectLayerMask = 1u << gameObject->GetLayer();
const bool isVisibleInCameraMask = (cullingMask & gameObjectLayerMask) != 0;
auto* meshFilter = gameObject->GetComponent<Components::MeshFilterComponent>();
auto* meshRenderer = gameObject->GetComponent<Components::MeshRendererComponent>();
if (meshFilter != nullptr &&
meshRenderer != nullptr &&
isVisibleInCameraMask &&
meshFilter->IsEnabled() &&
meshRenderer->IsEnabled()) {
Resources::Mesh* mesh = meshFilter->GetMesh();
@@ -279,7 +286,7 @@ void RenderSceneExtractor::ExtractVisibleItems(
}
for (Components::GameObject* child : gameObject->GetChildren()) {
ExtractVisibleItems(child, cameraPosition, visibleItems);
ExtractVisibleItems(child, cameraPosition, cullingMask, visibleItems);
}
}