feat(editor): implement Enabled controls for Camera/Light components in Inspector with Prefab override support

This commit is contained in:
ayuan9957 2026-05-21 16:22:35 +08:00
parent d195294b17
commit 4a95a1a4d5

View File

@ -1,4 +1,4 @@
#include "MetaCoreEditor/MetaCoreBuiltinModules.h"
#include "MetaCoreEditor/MetaCoreBuiltinModules.h"
#include "MetaCoreEditor/MetaCoreEditorAssetTypes.h"
#include "MetaCoreEditor/MetaCoreEditorContext.h"
@ -1453,6 +1453,45 @@ void MetaCoreDrawCameraComponentInspector(MetaCoreEditorContext& editorContext,
isPrimary
);
}
// 获取所有选中相机的共享启用状态(支持多选和 Mixed 提示)
const auto sharedEnabled = MetaCoreGetSharedSelectedValue<bool>(
editorContext,
[](MetaCoreGameObject& selectedObject) -> std::optional<bool> {
return selectedObject.HasComponent<MetaCoreCameraComponent>() ? std::optional<bool>(selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled) : std::nullopt;
},
[](bool lhs, bool rhs) { return lhs == rhs; }
);
bool isEnabled = sharedEnabled.value_or(gameObject.GetComponent<MetaCoreCameraComponent>().Enabled);
if (multiEdit && !sharedEnabled.has_value()) {
ImGui::TextDisabled("Enabled: Mixed");
}
// 处理 Prefab 覆盖标记以及应用和回退按钮
if (prefabObject != nullptr && prefabObject->Camera.has_value() &&
gameObject.GetComponent<MetaCoreCameraComponent>().Enabled != prefabObject->Camera->Enabled) {
ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Enabled Overrides");
ImGui::SameLine();
if (ImGui::SmallButton("Apply##CameraEnabled")) {
(void)MetaCoreApplySelectedPrefabField(editorContext, "Camera", "enabled");
}
ImGui::SameLine();
if (ImGui::SmallButton("Revert##CameraEnabled")) {
(void)MetaCoreRevertSelectedPrefabField(editorContext, "Camera", "enabled");
isEnabled = prefabObject->Camera->Enabled;
}
}
ImGui::Checkbox("Enabled##Camera", &isEnabled);
MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false);
if (ImGui::IsItemEdited()) {
// 应用新的启用状态到所有选中的相机组件
MetaCoreApplyValueToSelectedObjects(
editorContext,
[](MetaCoreGameObject& selectedObject) -> bool* {
return selectedObject.HasComponent<MetaCoreCameraComponent>() ? &selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled : nullptr;
},
isEnabled
);
}
}
void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) {
@ -1542,6 +1581,45 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M
intensity
);
}
// 获取所有选中光源的共享启用状态(支持多选和 Mixed 提示)
const auto sharedEnabled = MetaCoreGetSharedSelectedValue<bool>(
editorContext,
[](MetaCoreGameObject& selectedObject) -> std::optional<bool> {
return selectedObject.HasComponent<MetaCoreLightComponent>() ? std::optional<bool>(selectedObject.GetComponent<MetaCoreLightComponent>().Enabled) : std::nullopt;
},
[](bool lhs, bool rhs) { return lhs == rhs; }
);
bool isEnabled = sharedEnabled.value_or(gameObject.GetComponent<MetaCoreLightComponent>().Enabled);
if (multiEdit && !sharedEnabled.has_value()) {
ImGui::TextDisabled("Enabled: Mixed");
}
// 处理 Prefab 覆盖标记以及应用和回退按钮
if (prefabObject != nullptr && prefabObject->Light.has_value() &&
gameObject.GetComponent<MetaCoreLightComponent>().Enabled != prefabObject->Light->Enabled) {
ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Enabled Overrides");
ImGui::SameLine();
if (ImGui::SmallButton("Apply##LightEnabled")) {
(void)MetaCoreApplySelectedPrefabField(editorContext, "Light", "enabled");
}
ImGui::SameLine();
if (ImGui::SmallButton("Revert##LightEnabled")) {
(void)MetaCoreRevertSelectedPrefabField(editorContext, "Light", "enabled");
isEnabled = prefabObject->Light->Enabled;
}
}
ImGui::Checkbox("Enabled##Light", &isEnabled);
MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false);
if (ImGui::IsItemEdited()) {
// 应用新的启用状态到所有选中的光源组件
MetaCoreApplyValueToSelectedObjects(
editorContext,
[](MetaCoreGameObject& selectedObject) -> bool* {
return selectedObject.HasComponent<MetaCoreLightComponent>() ? &selectedObject.GetComponent<MetaCoreLightComponent>().Enabled : nullptr;
},
isEnabled
);
}
}
void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) {
@ -2166,6 +2244,10 @@ template <typename T>
} else if (fieldId == "primary") {
prefabObjectIterator->Camera->IsPrimary = selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary;
changed = true;
} else if (fieldId == "enabled") {
// 应用相机的启用状态到 Prefab 模板中
prefabObjectIterator->Camera->Enabled = selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled;
changed = true;
}
} else if (componentTypeId == "Light" && selectedObject.HasComponent<MetaCoreLightComponent>()) {
if (!prefabObjectIterator->Light.has_value()) {
@ -2177,6 +2259,10 @@ template <typename T>
} else if (fieldId == "intensity") {
prefabObjectIterator->Light->Intensity = selectedObject.GetComponent<MetaCoreLightComponent>().Intensity;
changed = true;
} else if (fieldId == "enabled") {
// 应用光源的启用状态到 Prefab 模板中
prefabObjectIterator->Light->Enabled = selectedObject.GetComponent<MetaCoreLightComponent>().Enabled;
changed = true;
}
} else if (componentTypeId == "MeshRenderer" && selectedObject.HasComponent<MetaCoreMeshRendererComponent>()) {
if (!prefabObjectIterator->MeshRenderer.has_value()) {
@ -2240,6 +2326,11 @@ template <typename T>
selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary = prefabObject->Camera->IsPrimary;
return true;
}
if (fieldId == "enabled") {
// 将相机的启用状态回退为 Prefab 的设定值
selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled = prefabObject->Camera->Enabled;
return true;
}
}
if (componentTypeId == "Light" && prefabObject->Light.has_value()) {
@ -2254,6 +2345,11 @@ template <typename T>
selectedObject.GetComponent<MetaCoreLightComponent>().Intensity = prefabObject->Light->Intensity;
return true;
}
if (fieldId == "enabled") {
// 将光源的启用状态回退为 Prefab 的设定值
selectedObject.GetComponent<MetaCoreLightComponent>().Enabled = prefabObject->Light->Enabled;
return true;
}
}
if (componentTypeId == "MeshRenderer" && prefabObject->MeshRenderer.has_value()) {