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/MetaCoreEditorAssetTypes.h"
|
||||||
#include "MetaCoreEditor/MetaCoreEditorContext.h"
|
#include "MetaCoreEditor/MetaCoreEditorContext.h"
|
||||||
@ -1453,6 +1453,45 @@ void MetaCoreDrawCameraComponentInspector(MetaCoreEditorContext& editorContext,
|
|||||||
isPrimary
|
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) {
|
void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) {
|
||||||
@ -1542,6 +1581,45 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M
|
|||||||
intensity
|
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) {
|
void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) {
|
||||||
@ -2166,6 +2244,10 @@ template <typename T>
|
|||||||
} else if (fieldId == "primary") {
|
} else if (fieldId == "primary") {
|
||||||
prefabObjectIterator->Camera->IsPrimary = selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary;
|
prefabObjectIterator->Camera->IsPrimary = selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary;
|
||||||
changed = true;
|
changed = true;
|
||||||
|
} else if (fieldId == "enabled") {
|
||||||
|
// 应用相机的启用状态到 Prefab 模板中
|
||||||
|
prefabObjectIterator->Camera->Enabled = selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled;
|
||||||
|
changed = true;
|
||||||
}
|
}
|
||||||
} else if (componentTypeId == "Light" && selectedObject.HasComponent<MetaCoreLightComponent>()) {
|
} else if (componentTypeId == "Light" && selectedObject.HasComponent<MetaCoreLightComponent>()) {
|
||||||
if (!prefabObjectIterator->Light.has_value()) {
|
if (!prefabObjectIterator->Light.has_value()) {
|
||||||
@ -2177,6 +2259,10 @@ template <typename T>
|
|||||||
} else if (fieldId == "intensity") {
|
} else if (fieldId == "intensity") {
|
||||||
prefabObjectIterator->Light->Intensity = selectedObject.GetComponent<MetaCoreLightComponent>().Intensity;
|
prefabObjectIterator->Light->Intensity = selectedObject.GetComponent<MetaCoreLightComponent>().Intensity;
|
||||||
changed = true;
|
changed = true;
|
||||||
|
} else if (fieldId == "enabled") {
|
||||||
|
// 应用光源的启用状态到 Prefab 模板中
|
||||||
|
prefabObjectIterator->Light->Enabled = selectedObject.GetComponent<MetaCoreLightComponent>().Enabled;
|
||||||
|
changed = true;
|
||||||
}
|
}
|
||||||
} else if (componentTypeId == "MeshRenderer" && selectedObject.HasComponent<MetaCoreMeshRendererComponent>()) {
|
} else if (componentTypeId == "MeshRenderer" && selectedObject.HasComponent<MetaCoreMeshRendererComponent>()) {
|
||||||
if (!prefabObjectIterator->MeshRenderer.has_value()) {
|
if (!prefabObjectIterator->MeshRenderer.has_value()) {
|
||||||
@ -2240,6 +2326,11 @@ template <typename T>
|
|||||||
selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary = prefabObject->Camera->IsPrimary;
|
selectedObject.GetComponent<MetaCoreCameraComponent>().IsPrimary = prefabObject->Camera->IsPrimary;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (fieldId == "enabled") {
|
||||||
|
// 将相机的启用状态回退为 Prefab 的设定值
|
||||||
|
selectedObject.GetComponent<MetaCoreCameraComponent>().Enabled = prefabObject->Camera->Enabled;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentTypeId == "Light" && prefabObject->Light.has_value()) {
|
if (componentTypeId == "Light" && prefabObject->Light.has_value()) {
|
||||||
@ -2254,6 +2345,11 @@ template <typename T>
|
|||||||
selectedObject.GetComponent<MetaCoreLightComponent>().Intensity = prefabObject->Light->Intensity;
|
selectedObject.GetComponent<MetaCoreLightComponent>().Intensity = prefabObject->Light->Intensity;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (fieldId == "enabled") {
|
||||||
|
// 将光源的启用状态回退为 Prefab 的设定值
|
||||||
|
selectedObject.GetComponent<MetaCoreLightComponent>().Enabled = prefabObject->Light->Enabled;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (componentTypeId == "MeshRenderer" && prefabObject->MeshRenderer.has_value()) {
|
if (componentTypeId == "MeshRenderer" && prefabObject->MeshRenderer.has_value()) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user