feat: add explicit camera clear modes

This commit is contained in:
2026-04-01 01:33:46 +08:00
parent 96a66d6f6d
commit 51736253e3
5 changed files with 65 additions and 2 deletions

View File

@@ -11,6 +11,13 @@ enum class CameraProjectionType {
Orthographic
};
enum class CameraClearMode {
Auto = 0,
ColorAndDepth,
DepthOnly,
None
};
class CameraComponent : public Component {
public:
std::string GetName() const override { return "Camera"; }
@@ -36,6 +43,9 @@ public:
bool IsPrimary() const { return m_primary; }
void SetPrimary(bool value) { m_primary = value; }
CameraClearMode GetClearMode() const { return m_clearMode; }
void SetClearMode(CameraClearMode value) { m_clearMode = value; }
const Math::Color& GetClearColor() const { return m_clearColor; }
void SetClearColor(const Math::Color& value) { m_clearColor = value; }
@@ -50,6 +60,7 @@ private:
float m_farClipPlane = 1000.0f;
float m_depth = 0.0f;
bool m_primary = true;
CameraClearMode m_clearMode = CameraClearMode::Auto;
Math::Color m_clearColor = Math::Color(0.192f, 0.302f, 0.475f, 1.0f);
};

View File

@@ -33,6 +33,7 @@ void CameraComponent::Serialize(std::ostream& os) const {
os << "far=" << m_farClipPlane << ";";
os << "depth=" << m_depth << ";";
os << "primary=" << (m_primary ? 1 : 0) << ";";
os << "clearMode=" << static_cast<int>(m_clearMode) << ";";
os << "clearColor=" << m_clearColor.r << "," << m_clearColor.g << "," << m_clearColor.b << "," << m_clearColor.a << ";";
}
@@ -65,6 +66,8 @@ void CameraComponent::Deserialize(std::istream& is) {
m_depth = std::stof(value);
} else if (key == "primary") {
m_primary = (std::stoi(value) != 0);
} else if (key == "clearMode") {
m_clearMode = static_cast<CameraClearMode>(std::stoi(value));
} else if (key == "clearColor") {
std::replace(value.begin(), value.end(), ',', ' ');
std::istringstream ss(value);

View File

@@ -26,6 +26,20 @@ bool IsUsableCamera(const Components::CameraComponent* camera) {
camera->GetGameObject()->IsActiveInHierarchy();
}
RenderClearFlags ResolveClearFlags(const Components::CameraComponent& camera, size_t cameraIndex) {
switch (camera.GetClearMode()) {
case Components::CameraClearMode::ColorAndDepth:
return RenderClearFlags::All;
case Components::CameraClearMode::DepthOnly:
return RenderClearFlags::Depth;
case Components::CameraClearMode::None:
return RenderClearFlags::None;
case Components::CameraClearMode::Auto:
default:
return cameraIndex == 0 ? RenderClearFlags::All : RenderClearFlags::Depth;
}
}
} // namespace
SceneRenderer::SceneRenderer() = default;
@@ -88,7 +102,7 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
request.context = context;
request.surface = surface;
request.cameraDepth = camera->GetDepth();
request.clearFlags = cameraIndex == 0 ? RenderClearFlags::All : RenderClearFlags::Depth;
request.clearFlags = ResolveClearFlags(*camera, cameraIndex);
requests.push_back(request);
}