feat(editor): implement Enabled controls for Camera/Light components in Inspector with Prefab override support
This commit is contained in:
parent
d195294b17
commit
4a95a1a4d5
@ -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()) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user