feat: add camera culling masks
This commit is contained in:
@@ -34,6 +34,7 @@ void CameraComponent::Serialize(std::ostream& os) const {
|
||||
os << "depth=" << m_depth << ";";
|
||||
os << "primary=" << (m_primary ? 1 : 0) << ";";
|
||||
os << "clearMode=" << static_cast<int>(m_clearMode) << ";";
|
||||
os << "cullingMask=" << m_cullingMask << ";";
|
||||
os << "clearColor=" << m_clearColor.r << "," << m_clearColor.g << "," << m_clearColor.b << "," << m_clearColor.a << ";";
|
||||
}
|
||||
|
||||
@@ -68,6 +69,8 @@ void CameraComponent::Deserialize(std::istream& is) {
|
||||
m_primary = (std::stoi(value) != 0);
|
||||
} else if (key == "clearMode") {
|
||||
m_clearMode = static_cast<CameraClearMode>(std::stoi(value));
|
||||
} else if (key == "cullingMask") {
|
||||
m_cullingMask = static_cast<uint32_t>(std::stoul(value));
|
||||
} else if (key == "clearColor") {
|
||||
std::replace(value.begin(), value.end(), ',', ' ');
|
||||
std::istringstream ss(value);
|
||||
|
||||
@@ -317,6 +317,7 @@ void GameObject::Destroy() {
|
||||
void GameObject::Serialize(std::ostream& os) const {
|
||||
os << "name=" << m_name << ";";
|
||||
os << "active=" << (m_activeSelf ? "1" : "0") << ";";
|
||||
os << "layer=" << static_cast<uint32_t>(m_layer) << ";";
|
||||
os << "id=" << m_id << ";";
|
||||
os << "uuid=" << m_uuid << ";";
|
||||
os << "transform=";
|
||||
@@ -346,6 +347,11 @@ void GameObject::Deserialize(std::istream& is) {
|
||||
is.get(val);
|
||||
m_activeSelf = (val == '1');
|
||||
if (is.peek() == ';') is.get();
|
||||
} else if (strcmp(key, "layer") == 0) {
|
||||
uint32_t layer = 0;
|
||||
is >> layer;
|
||||
SetLayer(static_cast<uint8_t>(layer));
|
||||
if (is.peek() == ';') is.get();
|
||||
} else if (strcmp(key, "id") == 0) {
|
||||
is >> m_id;
|
||||
if (is.peek() == ';') is.get();
|
||||
|
||||
@@ -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