feat: add camera culling masks
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user