From 08d528c6863e361368bdc8ed8eb1cd9c791facdb Mon Sep 17 00:00:00 2001 From: Rowland <975945824@qq.com> Date: Thu, 2 Jul 2026 10:33:09 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MetaCoreBuiltinCoreServicesModule.cpp | 214 ++++++------ .../Private/MetaCoreBuiltinEditorModule.cpp | 329 +++++++++--------- 2 files changed, 278 insertions(+), 265 deletions(-) diff --git a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp index 5cc9d88..ec8a310 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp @@ -1912,10 +1912,10 @@ void MetaCoreDrawMeshRendererMaterialSlotSummary( std::size_t materialSlotIndex, const MetaCoreAssetGuid& materialGuid ) { - ImGui::TextDisabled("Slot %d", static_cast(materialSlotIndex)); + ImGui::TextDisabled("槽位 %d", static_cast(materialSlotIndex)); if (!materialGuid.IsValid()) { ImGui::SameLine(); - ImGui::TextDisabled(""); + ImGui::TextDisabled("<无>"); return; } @@ -1937,27 +1937,27 @@ void MetaCoreDrawMeshRendererMaterialSlotSummary( if (resolvedMaterial.has_value()) { ImGui::TextDisabled( - "Source: %s / %s", + "来源: %s / %s", resolvedMaterial->SourceAsset.RelativePath.filename().string().c_str(), resolvedMaterial->GeneratedKind.c_str() ); } - ImGui::TextDisabled("Guid: %s", materialGuid.ToString().c_str()); + ImGui::TextDisabled("GUID: %s", materialGuid.ToString().c_str()); if (materialAsset.has_value()) { const std::string baseColorTexture = MetaCoreBuildTextureSlotSummary( editorContext, - "BaseColor", + "基础颜色", materialAsset->BaseColorTexture ); const std::string normalTexture = MetaCoreBuildTextureSlotSummary( editorContext, - "Normal", + "法线", materialAsset->NormalTexture ); const std::string metalRoughTexture = MetaCoreBuildTextureSlotSummary( editorContext, - "MetalRough", + "金属粗糙度", materialAsset->MetallicRoughnessTexture ); @@ -2377,7 +2377,7 @@ void MetaCoreDrawCameraComponentInspector(MetaCoreEditorContext& editorContext, } float backgroundAlpha = camera.BackgroundAlpha; - ImGui::DragFloat("背景 Alpha", &backgroundAlpha, 0.01F, 0.0F, 1.0F); + ImGui::DragFloat("背景透明度", &backgroundAlpha, 0.01F, 0.0F, 1.0F); MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", true); if (ImGui::IsItemEdited()) { MetaCoreApplyValueToSelectedObjects( @@ -2403,7 +2403,7 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M const bool multiEdit = editorContext.GetSelectedObjectIds().size() > 1; if (multiEdit) { - ImGui::TextDisabled("Multi-edit %zu objects", editorContext.GetSelectedObjectIds().size()); + ImGui::TextDisabled("多选编辑 %zu 个对象", editorContext.GetSelectedObjectIds().size()); } const auto sharedColor = MetaCoreGetSharedSelectedValue( @@ -2415,22 +2415,22 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M ); glm::vec3 color = sharedColor.value_or(gameObject.GetComponent().Color); if (multiEdit && !sharedColor.has_value()) { - ImGui::TextDisabled("Color: Mixed"); + ImGui::TextDisabled("颜色: 混合值"); } if (prefabObject != nullptr && prefabObject->Light.has_value() && !MetaCoreNearlyEqualVec3(gameObject.GetComponent().Color, prefabObject->Light->Color)) { - ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Color Overrides"); + ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "颜色已覆盖"); ImGui::SameLine(); - if (ImGui::SmallButton("Apply##LightColor")) { + if (ImGui::SmallButton("应用##LightColor")) { (void)MetaCoreApplySelectedPrefabField(editorContext, "Light", "color"); } ImGui::SameLine(); - if (ImGui::SmallButton("Revert##LightColor")) { + if (ImGui::SmallButton("回退##LightColor")) { (void)MetaCoreRevertSelectedPrefabField(editorContext, "Light", "color"); color = prefabObject->Light->Color; } } - ImGui::ColorEdit3("Color", glm::value_ptr(color)); + ImGui::ColorEdit3("颜色", glm::value_ptr(color)); MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", true); if (ImGui::IsItemEdited()) { MetaCoreApplyValueToSelectedObjects( @@ -2451,22 +2451,22 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M ); float intensity = sharedIntensity.value_or(gameObject.GetComponent().Intensity); if (multiEdit && !sharedIntensity.has_value()) { - ImGui::TextDisabled("Intensity: Mixed"); + ImGui::TextDisabled("强度: 混合值"); } if (prefabObject != nullptr && prefabObject->Light.has_value() && !MetaCoreNearlyEqual(gameObject.GetComponent().Intensity, prefabObject->Light->Intensity)) { - ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Intensity Overrides"); + ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "强度已覆盖"); ImGui::SameLine(); - if (ImGui::SmallButton("Apply##LightIntensity")) { + if (ImGui::SmallButton("应用##LightIntensity")) { (void)MetaCoreApplySelectedPrefabField(editorContext, "Light", "intensity"); } ImGui::SameLine(); - if (ImGui::SmallButton("Revert##LightIntensity")) { + if (ImGui::SmallButton("回退##LightIntensity")) { (void)MetaCoreRevertSelectedPrefabField(editorContext, "Light", "intensity"); intensity = prefabObject->Light->Intensity; } } - ImGui::DragFloat("Intensity", &intensity, 0.05F, 0.0F, 8.0F); + ImGui::DragFloat("强度", &intensity, 0.05F, 0.0F, 8.0F); MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", true); if (ImGui::IsItemEdited()) { MetaCoreApplyValueToSelectedObjects( @@ -2488,23 +2488,23 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M ); bool isEnabled = sharedEnabled.value_or(gameObject.GetComponent().Enabled); if (multiEdit && !sharedEnabled.has_value()) { - ImGui::TextDisabled("Enabled: Mixed"); + ImGui::TextDisabled("启用: 混合值"); } // 处理 Prefab 覆盖标记以及应用和回退按钮 if (prefabObject != nullptr && prefabObject->Light.has_value() && gameObject.GetComponent().Enabled != prefabObject->Light->Enabled) { - ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Enabled Overrides"); + ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "启用已覆盖"); ImGui::SameLine(); - if (ImGui::SmallButton("Apply##LightEnabled")) { + if (ImGui::SmallButton("应用##LightEnabled")) { (void)MetaCoreApplySelectedPrefabField(editorContext, "Light", "enabled"); } ImGui::SameLine(); - if (ImGui::SmallButton("Revert##LightEnabled")) { + if (ImGui::SmallButton("回退##LightEnabled")) { (void)MetaCoreRevertSelectedPrefabField(editorContext, "Light", "enabled"); isEnabled = prefabObject->Light->Enabled; } } - ImGui::Checkbox("Enabled##Light", &isEnabled); + ImGui::Checkbox("启用##Light", &isEnabled); MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); if (ImGui::IsItemEdited()) { // 应用新的启用状态到所有选中的光源组件 @@ -2637,9 +2637,9 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext if (animator.SourceModelAssetGuid.IsValid()) { sourceLabel += " [" + animator.SourceModelAssetGuid.ToString() + "]"; } - ImGui::TextDisabled("Source: %s", sourceLabel.c_str()); + ImGui::TextDisabled("来源: %s", sourceLabel.c_str()); if (modelDocument.has_value()) { - ImGui::TextDisabled("Clips: %d", static_cast(modelDocument->Animations.size())); + ImGui::TextDisabled("动画片段: %d", static_cast(modelDocument->Animations.size())); } else { ImGui::TextColored(ImVec4(0.95F, 0.55F, 0.20F, 1.0F), "模型动画元数据不可用"); } @@ -2676,8 +2676,8 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext }; drawPersistedBool("启用##Animator", &MetaCoreAnimatorComponent::Enabled); - drawPersistedBool("Play On Start", &MetaCoreAnimatorComponent::PlayOnStart); - drawPersistedBool("Loop", &MetaCoreAnimatorComponent::Loop); + drawPersistedBool("开始时播放", &MetaCoreAnimatorComponent::PlayOnStart); + drawPersistedBool("循环", &MetaCoreAnimatorComponent::Loop); if (modelDocument.has_value() && !modelDocument->Animations.empty()) { std::int32_t clipIndex = std::clamp( @@ -2687,20 +2687,20 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext ); const std::string currentClipLabel = modelDocument->Animations[static_cast(clipIndex)].Name.empty() - ? ("Clip " + std::to_string(clipIndex)) + ? ("动画片段 " + std::to_string(clipIndex)) : modelDocument->Animations[static_cast(clipIndex)].Name; ImGui::SetNextItemWidth(-1); - if (ImGui::BeginCombo("Clip", currentClipLabel.c_str())) { + if (ImGui::BeginCombo("动画片段", currentClipLabel.c_str())) { for (std::size_t index = 0; index < modelDocument->Animations.size(); ++index) { const auto& clip = modelDocument->Animations[index]; const std::string label = clip.Name.empty() - ? ("Clip " + std::to_string(index)) + ? ("动画片段 " + std::to_string(index)) : clip.Name; const bool selected = static_cast(clipIndex) == index; if (ImGui::Selectable(label.c_str(), selected)) { const auto newClipIndex = static_cast(index); const std::string newClipName = clip.Name; - (void)editorContext.ExecuteSnapshotCommand("修改 Animator Clip", [&]() { + (void)editorContext.ExecuteSnapshotCommand("修改 Animator 动画片段", [&]() { MetaCoreForEachSelectedGameObject(editorContext, [&](MetaCoreGameObject& selectedObject) { if (!selectedObject.HasComponent()) { return; @@ -2721,7 +2721,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext ImGui::EndCombo(); } } else { - ImGui::TextDisabled("没有可播放动画 Clip"); + ImGui::TextDisabled("没有可播放动画片段"); } float speed = MetaCoreGetSharedSelectedValue( @@ -2733,7 +2733,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext }, [](float lhs, float rhs) { return MetaCoreNearlyEqual(lhs, rhs); } ).value_or(animator.Speed); - ImGui::DragFloat("Speed", &speed, 0.05F, 0.0F, 8.0F); + ImGui::DragFloat("速度", &speed, 0.05F, 0.0F, 8.0F); MetaCoreTrackComponentInspectorEdit(editorContext, "修改 Animator", true); if (ImGui::IsItemEdited()) { MetaCoreApplyValueToSelectedObjects( @@ -2752,7 +2752,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext float timeSeconds = std::max(0.0F, animator.RuntimeTimeSeconds); const float sliderMax = durationSeconds > 0.0F ? durationSeconds : std::max(1.0F, timeSeconds); - if (ImGui::Button(animator.RuntimePlaying ? "Pause" : "Play")) { + if (ImGui::Button(animator.RuntimePlaying ? "暂停" : "播放")) { const bool play = !animator.RuntimePlaying; MetaCoreForEachSelectedGameObject(editorContext, [&](MetaCoreGameObject& selectedObject) { if (!selectedObject.HasComponent()) { @@ -2767,7 +2767,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext editorContext.GetScene().IncrementRevision(); } ImGui::SameLine(); - if (ImGui::Button("Stop")) { + if (ImGui::Button("停止")) { MetaCoreForEachSelectedGameObject(editorContext, [&](MetaCoreGameObject& selectedObject) { if (!selectedObject.HasComponent()) { return; @@ -2780,7 +2780,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext timeSeconds = 0.0F; } - ImGui::SliderFloat("Time", &timeSeconds, 0.0F, sliderMax, "%.3f s"); + ImGui::SliderFloat("时间", &timeSeconds, 0.0F, sliderMax, "%.3f s"); if (ImGui::IsItemEdited()) { MetaCoreForEachSelectedGameObject(editorContext, [&](MetaCoreGameObject& selectedObject) { if (!selectedObject.HasComponent()) { @@ -2799,7 +2799,7 @@ void MetaCoreDrawAnimatorComponentInspector(MetaCoreEditorContext& editorContext } if (durationSeconds > 0.0F) { - ImGui::TextDisabled("Duration: %.3f s", durationSeconds); + ImGui::TextDisabled("时长: %.3f s", durationSeconds); } } @@ -2870,7 +2870,7 @@ void MetaCoreDrawScriptComponentInspector(MetaCoreEditorContext& editorContext, } if (open) { - ImGui::TextDisabled("TypeId: %s", instance.ScriptTypeId.empty() ? "" : instance.ScriptTypeId.c_str()); + ImGui::TextDisabled("类型 ID: %s", instance.ScriptTypeId.empty() ? "<空>" : instance.ScriptTypeId.c_str()); bool enabled = instance.Enabled; ImGui::Checkbox("启用", &enabled); @@ -3196,7 +3196,7 @@ void MetaCoreDrawUiRendererComponentInspector(MetaCoreEditorContext& editorConte editorContext.GetScene().IncrementRevision(); } - ImGui::TextDisabled("2D 使用屏幕空间层级;3D 使用对象 Transform、世界尺寸和每单位像素。"); + ImGui::TextDisabled("2D 使用屏幕空间层级;3D 使用对象变换、世界尺寸和每单位像素。"); } void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) { @@ -3225,8 +3225,8 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0F); int meshSourceIndex = static_cast(meshRenderer.MeshSource); - const char* meshSourceItems[] = {"Builtin", "Asset"}; - if (ImGui::Combo("Mesh Source", &meshSourceIndex, meshSourceItems, IM_ARRAYSIZE(meshSourceItems))) { + const char* meshSourceItems[] = {"内置", "资源"}; + if (ImGui::Combo("网格来源", &meshSourceIndex, meshSourceItems, IM_ARRAYSIZE(meshSourceItems))) { MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); const MetaCoreMeshSourceKind meshSource = static_cast(meshSourceIndex); MetaCoreApplyValueToSelectedObjects( @@ -3240,8 +3240,8 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon if (meshRenderer.MeshSource == MetaCoreMeshSourceKind::Builtin) { int builtinMeshIndex = static_cast(meshRenderer.BuiltinMesh); - const char* builtinMeshItems[] = {"Cube", "Plane"}; - if (ImGui::Combo("Builtin Mesh", &builtinMeshIndex, builtinMeshItems, IM_ARRAYSIZE(builtinMeshItems))) { + const char* builtinMeshItems[] = {"立方体", "平面"}; + if (ImGui::Combo("内置网格", &builtinMeshIndex, builtinMeshItems, IM_ARRAYSIZE(builtinMeshItems))) { MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); const MetaCoreBuiltinMeshType builtinMesh = static_cast(builtinMeshIndex); MetaCoreApplyValueToSelectedObjects( @@ -3259,18 +3259,18 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon // 清爽显示模型资源,避免过于冗长 if (sourceAsset.has_value()) { - ImGui::Text("Model: %s", sourceAsset->RelativePath.filename().string().c_str()); + ImGui::Text("模型: %s", sourceAsset->RelativePath.filename().string().c_str()); } else { - ImGui::Text("Model: %s", meshRenderer.SourceModelPath.c_str()); + ImGui::Text("模型: %s", meshRenderer.SourceModelPath.c_str()); } ImGui::SameLine(); - ImGui::TextDisabled("(Node %d)", meshRenderer.ModelNodeIndex); + ImGui::TextDisabled("(节点 %d)", meshRenderer.ModelNodeIndex); ImGui::SameLine(); ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.18F, 0.18F, 0.18F, 1.0F)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.24F, 0.24F, 0.24F, 1.0F)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.20F, 0.20F, 0.20F, 1.0F)); - if (ImGui::Button("Open##SourceModel")) { + if (ImGui::Button("打开##SourceModel")) { MetaCoreOpenSourceModelFromMeshRenderer(editorContext, meshRenderer); } ImGui::PopStyleColor(3); @@ -3279,7 +3279,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon const auto meshChoices = MetaCoreCollectMeshAssetChoices(editorContext); MetaCoreAssetGuid meshAssetGuid = meshRenderer.MeshAssetGuid; // 渲染 Mesh 资源选择 Combo,隐藏底层的 Mesh Asset Guid 输入框 - if (MetaCoreDrawGeneratedAssetCombo("Mesh Asset", meshChoices, meshAssetGuid)) { + if (MetaCoreDrawGeneratedAssetCombo("网格资源", meshChoices, meshAssetGuid)) { MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); MetaCoreApplyValueToSelectedObjects( editorContext, @@ -3295,16 +3295,16 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::PopStyleColor(); // Materials 材质槽位折叠重构 - if (ImGui::TreeNodeEx("Materials", ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth)) { + if (ImGui::TreeNodeEx("材质", ImGuiTreeNodeFlags_DefaultOpen | ImGuiTreeNodeFlags_SpanAvailWidth)) { int materialSlotCount = static_cast(meshRenderer.MaterialAssetGuids.size()); // Size 槽位数量排版 if (ImGui::BeginTable("MaterialSizeTable", 2, ImGuiTableFlags_SizingStretchProp)) { - ImGui::TableSetupColumn("Label", ImGuiTableColumnFlags_WidthFixed, 100.0F); - ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("标签", ImGuiTableColumnFlags_WidthFixed, 100.0F); + ImGui::TableSetupColumn("值", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(); ImGui::TableNextColumn(); - ImGui::TextUnformatted("Size"); + ImGui::TextUnformatted("槽位数"); ImGui::TableNextColumn(); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0F, 0.0F, 0.0F, 0.0F)); @@ -3353,14 +3353,14 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon // 槽位列表循环 for (std::size_t materialIndex = 0; materialIndex < meshRenderer.MaterialAssetGuids.size(); ++materialIndex) { MetaCoreAssetGuid materialGuid = meshRenderer.MaterialAssetGuids[materialIndex]; - const std::string elementLabel = "Element " + std::to_string(materialIndex); + const std::string elementLabel = "元素 " + std::to_string(materialIndex); const std::string materialSlotTableId = "MaterialSlotTable_" + std::to_string(materialIndex); if (!ImGui::BeginTable(materialSlotTableId.c_str(), 2, ImGuiTableFlags_SizingStretchProp)) { continue; } - ImGui::TableSetupColumn("Label", ImGuiTableColumnFlags_WidthFixed, 100.0F); - ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("标签", ImGuiTableColumnFlags_WidthFixed, 100.0F); + ImGui::TableSetupColumn("值", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::TextUnformatted(elementLabel.c_str()); @@ -3373,16 +3373,16 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon comboWidth = 1.0F; } - std::string materialName = "None (Material)"; + std::string materialName = "无 (材质)"; if (materialGuid.IsValid()) { const auto assetEditingService = editorContext.GetModuleRegistry().ResolveService(); const auto materialAsset = assetEditingService != nullptr ? assetEditingService->LoadMaterialAsset(materialGuid) : std::nullopt; if (materialAsset.has_value() && !materialAsset->Name.empty()) { - materialName = materialAsset->Name + " (Material)"; + materialName = materialAsset->Name + " (材质)"; } else { - materialName = materialGuid.ToString() + " (Material)"; + materialName = materialGuid.ToString() + " (材质)"; } } @@ -3450,7 +3450,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::OpenPopup(popupName.c_str()); } if (ImGui::BeginPopup(popupName.c_str())) { - if (ImGui::Selectable("", !materialGuid.IsValid())) { + if (ImGui::Selectable("<无>", !materialGuid.IsValid())) { materialGuid = MetaCoreAssetGuid{}; } if (ImGui::Selectable("新建材质并绑定", false)) { @@ -3481,7 +3481,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon // 右键快捷弹出菜单,收容所有高级/调试指令 if (ImGui::BeginPopupContextItem(("MaterialSlotContext##" + std::to_string(materialIndex)).c_str())) { - if (ImGui::MenuItem("清空槽位 (Clear Slot)")) { + if (ImGui::MenuItem("清空槽位")) { MetaCoreClearMaterialSlotOnSelectedObjects(editorContext, materialIndex); materialGuid = MetaCoreAssetGuid{}; editorContext.AddConsoleMessage(MetaCoreLogLevel::Info, "Material", "已清空材质槽位"); @@ -3493,7 +3493,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon editorContext.AddConsoleMessage(MetaCoreLogLevel::Warning, "Material", "新建材质并绑定失败"); } } - if (ImGui::MenuItem("恢复模型默认材质 (Restore Default)")) { + if (ImGui::MenuItem("恢复模型默认材质")) { if (MetaCoreRestoreDefaultMaterialSlotOnSelectedObjects(editorContext, materialIndex)) { editorContext.AddConsoleMessage(MetaCoreLogLevel::Info, "Material", "已恢复模型默认材质槽位"); if (gameObject.HasComponent() && @@ -3506,7 +3506,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon } if (materialGuid.IsValid()) { ImGui::Separator(); - if (ImGui::MenuItem("重新应用材质资源到实例 (Reapply to Instance)")) { + if (ImGui::MenuItem("重新应用材质资源到实例")) { if (MetaCoreReapplyMaterialResourceToSelectedObjects(editorContext, materialIndex)) { editorContext.AddConsoleMessage(MetaCoreLogLevel::Info, "Material", "已将材质资源重新应用到实例"); } else { @@ -3514,7 +3514,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon } } if (editorContext.GetSelectedObjectIds().size() == 1) { - if (ImGui::MenuItem("将实例预览写回材质资源 (Push to Resource)")) { + if (ImGui::MenuItem("将实例预览写回材质资源")) { if (MetaCorePushSelectedMeshRendererPreviewToMaterialResource(editorContext, materialIndex)) { editorContext.AddConsoleMessage(MetaCoreLogLevel::Info, "Material", "已将当前实例预览写回材质资源"); } else { @@ -3523,7 +3523,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon } } ImGui::Separator(); - if (ImGui::MenuItem("打开材质资源 (Open Material Resource)")) { + if (ImGui::MenuItem("打开材质资源")) { const auto assetEditingService = editorContext.GetModuleRegistry().ResolveService(); if (const auto resolvedMaterial = assetEditingService != nullptr ? assetEditingService->ResolveGeneratedAsset(materialGuid) @@ -3563,22 +3563,22 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::TreePop(); } - // 二级折叠菜单:Lighting (照明设置占位,对标 Unity) - if (ImGui::CollapsingHeader("Lighting")) { + // 二级折叠菜单:照明设置占位,对标 Unity + if (ImGui::CollapsingHeader("照明")) { ImGui::Columns(2, "LightingCols", false); ImGui::SetColumnWidth(0, 160.0F); - ImGui::Text("Cast Shadows"); + ImGui::Text("投射阴影"); ImGui::NextColumn(); ImGui::BeginDisabled(); - const char* shadowItems[] = {"Off", "On", "Two Sided", "Shadows Only"}; + const char* shadowItems[] = {"关闭", "开启", "双面", "仅阴影"}; int shadowIndex = 1; // 默认 "On" ImGui::SetNextItemWidth(-1); ImGui::Combo("##CastShadows", &shadowIndex, shadowItems, IM_ARRAYSIZE(shadowItems)); ImGui::EndDisabled(); ImGui::NextColumn(); - ImGui::Text("Receive Shadows"); + ImGui::Text("接收阴影"); ImGui::NextColumn(); ImGui::BeginDisabled(); bool receiveShadows = true; @@ -3586,7 +3586,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::EndDisabled(); ImGui::NextColumn(); - ImGui::Text("Contribute GI"); + ImGui::Text("参与全局光照"); ImGui::NextColumn(); ImGui::BeginDisabled(); bool contributeGI = false; @@ -3596,57 +3596,57 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::Columns(1); } - // 二级折叠菜单:Probes (探测器设置占位,对标 Unity) - if (ImGui::CollapsingHeader("Probes")) { + // 二级折叠菜单:探针设置占位,对标 Unity + if (ImGui::CollapsingHeader("探针")) { ImGui::Columns(2, "ProbesCols", false); ImGui::SetColumnWidth(0, 160.0F); - ImGui::Text("Light Probes"); + ImGui::Text("光照探针"); ImGui::NextColumn(); ImGui::BeginDisabled(); - const char* lightProbeItems[] = {"Off", "Blend Probes", "Use Proxy Volume"}; + const char* lightProbeItems[] = {"关闭", "混合探针", "使用代理体积"}; int lpIndex = 1; ImGui::SetNextItemWidth(-1); ImGui::Combo("##LightProbes", &lpIndex, lightProbeItems, IM_ARRAYSIZE(lightProbeItems)); ImGui::EndDisabled(); ImGui::NextColumn(); - ImGui::Text("Reflection Probes"); + ImGui::Text("反射探针"); ImGui::NextColumn(); ImGui::BeginDisabled(); - const char* reflProbeItems[] = {"Off", "Blend Probes", "Blend Probes And Skybox"}; + const char* reflProbeItems[] = {"关闭", "混合探针", "混合探针和天空盒"}; int rpIndex = 1; ImGui::SetNextItemWidth(-1); ImGui::Combo("##ReflectionProbes", &rpIndex, reflProbeItems, IM_ARRAYSIZE(reflProbeItems)); ImGui::EndDisabled(); ImGui::NextColumn(); - ImGui::Text("Anchor Override"); + ImGui::Text("锚点覆盖"); ImGui::NextColumn(); ImGui::BeginDisabled(); ImGui::SetNextItemWidth(-1); - ImGui::Button("None (Transform)"); + ImGui::Button("无 (变换)"); ImGui::EndDisabled(); ImGui::Columns(1); } - // 二级折叠菜单:Additional Settings (额外渲染设置占位,对标 Unity) - if (ImGui::CollapsingHeader("Additional Settings")) { + // 二级折叠菜单:额外渲染设置占位,对标 Unity + if (ImGui::CollapsingHeader("额外设置")) { ImGui::Columns(2, "AddSettingsCols", false); ImGui::SetColumnWidth(0, 160.0F); - ImGui::Text("Motion Vectors"); + ImGui::Text("运动矢量"); ImGui::NextColumn(); ImGui::BeginDisabled(); - const char* mvItems[] = {"Camera Motion Only", "Per Object Motion", "Force No Motion"}; + const char* mvItems[] = {"仅相机运动", "逐对象运动", "强制无运动"}; int mvIndex = 1; ImGui::SetNextItemWidth(-1); ImGui::Combo("##MotionVectors", &mvIndex, mvItems, IM_ARRAYSIZE(mvItems)); ImGui::EndDisabled(); ImGui::NextColumn(); - ImGui::Text("Dynamic Occlusion"); + ImGui::Text("动态遮挡"); ImGui::NextColumn(); ImGui::BeginDisabled(); bool dynOcc = true; @@ -3708,7 +3708,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::Columns(2, "MeshInstanceProps", false); ImGui::SetColumnWidth(0, 160.0F); - ImGui::Text("BaseColor (Instance)"); + ImGui::Text("基础颜色 (实例)"); ImGui::NextColumn(); ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.0F, 0.0F, 0.0F, 0.0F)); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0F); @@ -3731,7 +3731,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon ImGui::PopStyleColor(); ImGui::NextColumn(); - ImGui::Text("Visible (Instance)"); + ImGui::Text("可见 (实例)"); ImGui::NextColumn(); if (multiEdit && !sharedVisible.has_value()) { ImGui::TextDisabled("混合值"); @@ -3757,7 +3757,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon continue; } - std::string materialName = "Default-Material"; + std::string materialName = "默认材质"; const auto assetEditingService = editorContext.GetModuleRegistry().ResolveService(); const auto materialDocument = assetEditingService != nullptr ? assetEditingService->LoadMaterialAsset(materialGuid) @@ -3770,7 +3770,7 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon float frameHeight = ImGui::GetFrameHeight(); // 留出材质球图标的空间 - std::string headerLabel = " " + materialName + " (Material)##InlineMaterialPanel_" + std::to_string(materialIndex); + std::string headerLabel = " " + materialName + " (材质)##InlineMaterialPanel_" + std::to_string(materialIndex); bool isPanelOpen = ImGui::CollapsingHeader(headerLabel.c_str()); @@ -3829,36 +3829,36 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon // 材质基本属性编辑 float baseColorRes[3] = {materialAsset.BaseColor.x, materialAsset.BaseColor.y, materialAsset.BaseColor.z}; - const bool baseColorChanged = ImGui::ColorEdit3(("Base Color##Res" + std::to_string(materialIndex)).c_str(), baseColorRes); + const bool baseColorChanged = ImGui::ColorEdit3(("基础颜色##Res" + std::to_string(materialIndex)).c_str(), baseColorRes); if (baseColorChanged) { materialAsset.BaseColor = {baseColorRes[0], baseColorRes[1], baseColorRes[2]}; } markContinuousEdit(baseColorChanged); markContinuousEdit(ImGui::SliderFloat( - ("Metallic##Res" + std::to_string(materialIndex)).c_str(), + ("金属度##Res" + std::to_string(materialIndex)).c_str(), &materialAsset.Metallic, 0.0F, 1.0F )); markContinuousEdit(ImGui::SliderFloat( - ("Roughness##Res" + std::to_string(materialIndex)).c_str(), + ("粗糙度##Res" + std::to_string(materialIndex)).c_str(), &materialAsset.Roughness, 0.0F, 1.0F )); - markDiscreteEdit(ImGui::Checkbox(("Double Sided##Res" + std::to_string(materialIndex)).c_str(), &materialAsset.DoubleSided)); + markDiscreteEdit(ImGui::Checkbox(("双面渲染##Res" + std::to_string(materialIndex)).c_str(), &materialAsset.DoubleSided)); - const char* alphaModeItems[] = {"Opaque", "Mask", "Blend"}; + const char* alphaModeItems[] = {"不透明", "镂空裁剪", "透明混合"}; int alphaModeIndex = static_cast(materialAsset.AlphaMode); - if (ImGui::Combo(("Alpha Mode##Res" + std::to_string(materialIndex)).c_str(), &alphaModeIndex, alphaModeItems, IM_ARRAYSIZE(alphaModeItems))) { + if (ImGui::Combo(("透明模式##Res" + std::to_string(materialIndex)).c_str(), &alphaModeIndex, alphaModeItems, IM_ARRAYSIZE(alphaModeItems))) { materialAsset.AlphaMode = static_cast(alphaModeIndex); previewModified = true; commitModified = true; } if (materialAsset.AlphaMode == MetaCoreMaterialAlphaMode::Mask) { markContinuousEdit(ImGui::SliderFloat( - ("Alpha Cutoff##Res" + std::to_string(materialIndex)).c_str(), + ("裁剪阈值##Res" + std::to_string(materialIndex)).c_str(), &materialAsset.AlphaCutoff, 0.0F, 1.0F @@ -3868,37 +3868,37 @@ void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorCon // 贴图通道配置 const auto textureChoices = MetaCoreCollectTextureAssetChoices(editorContext); MetaCoreAssetGuid baseColorTexture = materialAsset.BaseColorTexture; - if (MetaCoreDrawGeneratedAssetCombo(("Base Color Texture##Res" + std::to_string(materialIndex)).c_str(), textureChoices, baseColorTexture)) { + if (MetaCoreDrawGeneratedAssetCombo(("基础颜色贴图##Res" + std::to_string(materialIndex)).c_str(), textureChoices, baseColorTexture)) { materialAsset.BaseColorTexture = baseColorTexture; previewModified = true; commitModified = true; } MetaCoreAssetGuid metalRoughTexture = materialAsset.MetallicRoughnessTexture; - if (MetaCoreDrawGeneratedAssetCombo(("MetalRough Texture##Res" + std::to_string(materialIndex)).c_str(), textureChoices, metalRoughTexture)) { + if (MetaCoreDrawGeneratedAssetCombo(("金属粗糙度贴图##Res" + std::to_string(materialIndex)).c_str(), textureChoices, metalRoughTexture)) { materialAsset.MetallicRoughnessTexture = metalRoughTexture; previewModified = true; commitModified = true; } MetaCoreAssetGuid normalTexture = materialAsset.NormalTexture; - if (MetaCoreDrawGeneratedAssetCombo(("Normal Texture##Res" + std::to_string(materialIndex)).c_str(), textureChoices, normalTexture)) { + if (MetaCoreDrawGeneratedAssetCombo(("法线贴图##Res" + std::to_string(materialIndex)).c_str(), textureChoices, normalTexture)) { materialAsset.NormalTexture = normalTexture; previewModified = true; commitModified = true; } float emissiveColor[3] = {materialAsset.EmissiveColor.x, materialAsset.EmissiveColor.y, materialAsset.EmissiveColor.z}; - const bool emissiveColorChanged = ImGui::ColorEdit3(("Emissive Color##Res" + std::to_string(materialIndex)).c_str(), emissiveColor); + const bool emissiveColorChanged = ImGui::ColorEdit3(("发光颜色##Res" + std::to_string(materialIndex)).c_str(), emissiveColor); if (emissiveColorChanged) { materialAsset.EmissiveColor = {emissiveColor[0], emissiveColor[1], emissiveColor[2]}; } markContinuousEdit(emissiveColorChanged); MetaCoreAssetGuid emissiveTexture = materialAsset.EmissiveTexture; - if (MetaCoreDrawGeneratedAssetCombo(("Emissive Texture##Res" + std::to_string(materialIndex)).c_str(), textureChoices, emissiveTexture)) { + if (MetaCoreDrawGeneratedAssetCombo(("发光贴图##Res" + std::to_string(materialIndex)).c_str(), textureChoices, emissiveTexture)) { materialAsset.EmissiveTexture = emissiveTexture; previewModified = true; commitModified = true; } MetaCoreAssetGuid aoTexture = materialAsset.AoTexture; - if (MetaCoreDrawGeneratedAssetCombo(("AO Texture##Res" + std::to_string(materialIndex)).c_str(), textureChoices, aoTexture)) { + if (MetaCoreDrawGeneratedAssetCombo(("遮蔽 AO 贴图##Res" + std::to_string(materialIndex)).c_str(), textureChoices, aoTexture)) { materialAsset.AoTexture = aoTexture; previewModified = true; commitModified = true; @@ -7906,7 +7906,7 @@ public: Descriptors_.clear(); Descriptors_.push_back(MetaCoreComponentDescriptor{ "Transform", - "Transform", + "变换", [](const MetaCoreGameObject&) { return true; }, [](MetaCoreGameObject&) { return false; }, [](MetaCoreGameObject&) { return false; }, @@ -7924,7 +7924,7 @@ public: }); Descriptors_.push_back(MetaCoreComponentDescriptor{ "Camera", - "Camera", + "相机", [](const MetaCoreGameObject& gameObject) { return gameObject.HasComponent(); }, [](MetaCoreGameObject& gameObject) { if (gameObject.HasComponent()) { @@ -7969,7 +7969,7 @@ public: }); Descriptors_.push_back(MetaCoreComponentDescriptor{ "Light", - "Light", + "灯光", [](const MetaCoreGameObject& gameObject) { return gameObject.HasComponent(); }, [](MetaCoreGameObject& gameObject) { if (gameObject.HasComponent()) { @@ -8059,7 +8059,7 @@ public: }); Descriptors_.push_back(MetaCoreComponentDescriptor{ "Animator", - "Animator", + "动画器", [](const MetaCoreGameObject& gameObject) { return gameObject.HasComponent(); }, [](MetaCoreGameObject& gameObject) { if (gameObject.HasComponent()) { @@ -8149,7 +8149,7 @@ public: }); Descriptors_.push_back(MetaCoreComponentDescriptor{ "UiRenderer", - "UI Renderer", + "UI 渲染器", [](const MetaCoreGameObject& gameObject) { return gameObject.HasComponent(); }, [](MetaCoreGameObject& gameObject) { if (gameObject.HasComponent()) { @@ -8194,7 +8194,7 @@ public: }); Descriptors_.push_back(MetaCoreComponentDescriptor{ "MeshRenderer", - "Mesh Renderer", + "网格渲染器", [](const MetaCoreGameObject& gameObject) { return gameObject.HasComponent(); }, [](MetaCoreGameObject& gameObject) { if (gameObject.HasComponent()) { diff --git a/Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.cpp b/Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.cpp index 08039b2..2fe3960 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.cpp @@ -126,10 +126,10 @@ static std::unordered_map Model case MetaCoreModelAssetKind::Gltf: return "glTF"; case MetaCoreModelAssetKind::Generic: - return "Generic"; + return "通用"; case MetaCoreModelAssetKind::Unknown: default: - return "Unknown"; + return "未知"; } } @@ -2759,13 +2759,13 @@ private: } if (isModelInstance && ImGui::IsItemHovered()) { ImGui::BeginTooltip(); - ImGui::TextDisabled("Model Instance"); + ImGui::TextDisabled("模型实例"); if (sourceModelAsset.has_value()) { - ImGui::Text("Source: %s", sourceModelAsset->RelativePath.filename().string().c_str()); + ImGui::Text("来源: %s", sourceModelAsset->RelativePath.filename().string().c_str()); } else { - ImGui::Text("Source: %s", gameObject.GetComponent().SourceModelPath.c_str()); + ImGui::Text("来源: %s", gameObject.GetComponent().SourceModelPath.c_str()); } - ImGui::Text("Node Index: %d", gameObject.GetComponent().ModelNodeIndex); + ImGui::Text("节点索引: %d", gameObject.GetComponent().ModelNodeIndex); ImGui::EndTooltip(); } @@ -4271,6 +4271,19 @@ struct MetaCoreGeneratedResourceListEntry { std::string SecondaryText{}; }; +[[nodiscard]] const char* MetaCoreGeneratedResourceKindLabel(std::string_view kind) { + if (kind == "mesh") { + return "网格"; + } + if (kind == "material") { + return "材质"; + } + if (kind == "texture") { + return "贴图"; + } + return "资源"; +} + [[nodiscard]] std::string MetaCoreBuildGeneratedResourceSubId( std::string_view kind, const MetaCoreAssetGuid& assetGuid @@ -4328,9 +4341,9 @@ void MetaCoreClearGeneratedResourceSelection(MetaCoreEditorContext& editorContex ) { std::vector entries; entries.reserve(document.GeneratedMeshAssets.size() + document.GeneratedMaterialAssets.size() + document.GeneratedTextureAssets.size()); - for (const auto& meshAsset : document.GeneratedMeshAssets) entries.push_back({meshAsset.AssetGuid, "mesh", meshAsset.Name, "Mesh"}); - for (const auto& materialAsset : document.GeneratedMaterialAssets) entries.push_back({materialAsset.AssetGuid, "material", materialAsset.Name, "Material"}); - for (const auto& textureAsset : document.GeneratedTextureAssets) entries.push_back({textureAsset.AssetGuid, "texture", textureAsset.Name, "Texture"}); + for (const auto& meshAsset : document.GeneratedMeshAssets) entries.push_back({meshAsset.AssetGuid, "mesh", meshAsset.Name, "网格"}); + for (const auto& materialAsset : document.GeneratedMaterialAssets) entries.push_back({materialAsset.AssetGuid, "material", materialAsset.Name, "材质"}); + for (const auto& textureAsset : document.GeneratedTextureAssets) entries.push_back({textureAsset.AssetGuid, "texture", textureAsset.Name, "贴图"}); return entries; } @@ -4697,8 +4710,8 @@ void MetaCoreDrawMaterialPreviewCard(const MetaCoreMaterialAssetDocument& materi bool changed = false; ImGui::PushID(id); if (ImGui::BeginTable("TextureSlot", 2, ImGuiTableFlags_SizingStretchProp)) { - ImGui::TableSetupColumn("Label", ImGuiTableColumnFlags_WidthFixed, 118.0F); - ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("标签", ImGuiTableColumnFlags_WidthFixed, 118.0F); + ImGui::TableSetupColumn("值", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::TextUnformatted(label); @@ -4828,8 +4841,8 @@ void MetaCoreDrawMaterialPreviewCard(const MetaCoreMaterialAssetDocument& materi const bool useTwoColumns = availableWidth >= 520.0F; if (useTwoColumns) { ImGui::BeginTable("MaterialVisualLayout", 2, ImGuiTableFlags_SizingStretchProp); - ImGui::TableSetupColumn("Properties", ImGuiTableColumnFlags_WidthStretch, 0.62F); - ImGui::TableSetupColumn("Preview", ImGuiTableColumnFlags_WidthStretch, 0.38F); + ImGui::TableSetupColumn("属性", ImGuiTableColumnFlags_WidthStretch, 0.62F); + ImGui::TableSetupColumn("预览", ImGuiTableColumnFlags_WidthStretch, 0.38F); ImGui::TableNextRow(); ImGui::TableNextColumn(); } @@ -4891,7 +4904,7 @@ void MetaCoreDrawMaterialPreviewCard(const MetaCoreMaterialAssetDocument& materi if (ImGui::CollapsingHeader("高级信息")) { ImGui::TextDisabled("着色模型: %s", MetaCoreMaterialShaderModelLabel(materialDocument.ShaderModel)); ImGui::TextDisabled("透明模式: %s", MetaCoreMaterialAlphaModeLabel(materialDocument.AlphaMode)); - ImGui::TextDisabled("StableImportKey: %s", materialDocument.StableImportKey.empty() ? "<无>" : materialDocument.StableImportKey.c_str()); + ImGui::TextDisabled("稳定导入键: %s", materialDocument.StableImportKey.empty() ? "<无>" : materialDocument.StableImportKey.c_str()); } if (useTwoColumns) { @@ -5008,48 +5021,48 @@ void DrawGeneratedMeshDetails( const MetaCoreMeshAssetDocument& meshAsset = loadedMesh.value_or(selectedMesh); ImGui::Separator(); - ImGui::TextDisabled("MESH RESOURCE"); - ImGui::Text("Name: %s", meshAsset.Name.empty() ? "" : meshAsset.Name.c_str()); - ImGui::TextDisabled("Guid: %s", meshAsset.AssetGuid.ToString().c_str()); - ImGui::Text("Vertices: %d", meshAsset.VertexCount); - ImGui::Text("Indices: %d", meshAsset.IndexCount); - ImGui::Text("SubMeshes: %d", static_cast(meshAsset.SubMeshes.size())); + ImGui::TextDisabled("网格资源"); + ImGui::Text("名称: %s", meshAsset.Name.empty() ? "<未命名>" : meshAsset.Name.c_str()); + ImGui::TextDisabled("GUID: %s", meshAsset.AssetGuid.ToString().c_str()); + ImGui::Text("顶点: %d", meshAsset.VertexCount); + ImGui::Text("索引: %d", meshAsset.IndexCount); + ImGui::Text("子网格: %d", static_cast(meshAsset.SubMeshes.size())); ImGui::Text( - "Bounds Min: %.2f, %.2f, %.2f", + "包围盒最小值: %.2f, %.2f, %.2f", meshAsset.BoundingBoxMin.x, meshAsset.BoundingBoxMin.y, meshAsset.BoundingBoxMin.z ); ImGui::Text( - "Bounds Max: %.2f, %.2f, %.2f", + "包围盒最大值: %.2f, %.2f, %.2f", meshAsset.BoundingBoxMax.x, meshAsset.BoundingBoxMax.y, meshAsset.BoundingBoxMax.z ); const auto references = FindSceneObjectsUsingMesh(editorContext, meshAsset.AssetGuid); - ImGui::Text("Scene References: %d", static_cast(references.size())); + ImGui::Text("场景引用: %d", static_cast(references.size())); if (!references.empty()) { - if (ImGui::Button("Highlight Scene Objects##SelectedMesh")) { + if (ImGui::Button("高亮场景对象##SelectedMesh")) { editorContext.SetSelection(references, references.front()); } DrawReferencedObjectList(editorContext, references, "SelectedMeshRefs"); } - if (!meshAsset.SubMeshes.empty() && ImGui::TreeNode("SubMeshes##SelectedMesh")) { + if (!meshAsset.SubMeshes.empty() && ImGui::TreeNode("子网格##SelectedMesh")) { for (std::size_t subMeshIndex = 0; subMeshIndex < meshAsset.SubMeshes.size(); ++subMeshIndex) { const MetaCoreMeshSubMeshDocument& subMesh = meshAsset.SubMeshes[subMeshIndex]; const std::string subMeshLabel = - (subMesh.Name.empty() ? ("SubMesh " + std::to_string(subMeshIndex)) : subMesh.Name) + + (subMesh.Name.empty() ? ("子网格 " + std::to_string(subMeshIndex)) : subMesh.Name) + "##SelectedMeshSub_" + std::to_string(subMeshIndex); if (ImGui::TreeNode(subMeshLabel.c_str())) { - ImGui::Text("Material Slot: %d", subMesh.MaterialSlotIndex); + ImGui::Text("材质槽位: %d", subMesh.MaterialSlotIndex); if (subMesh.MaterialSlotIndex >= 0 && static_cast(subMesh.MaterialSlotIndex) < importedDocument.GeneratedMaterialAssets.size()) { const MetaCoreMaterialAssetDocument& slotMaterial = importedDocument.GeneratedMaterialAssets[static_cast(subMesh.MaterialSlotIndex)]; - ImGui::Text("Material: %s", slotMaterial.Name.empty() ? "" : slotMaterial.Name.c_str()); - if (ImGui::Button(("Open Material##SelectedMeshSub_" + std::to_string(subMeshIndex)).c_str())) { + ImGui::Text("材质: %s", slotMaterial.Name.empty() ? "<未命名>" : slotMaterial.Name.c_str()); + if (ImGui::Button(("打开材质##SelectedMeshSub_" + std::to_string(subMeshIndex)).c_str())) { MetaCoreSelectGeneratedResource(editorContext, "material", slotMaterial.AssetGuid); } } @@ -5072,34 +5085,34 @@ void DrawGeneratedTextureDetails( const MetaCoreTextureAssetDocument& textureAsset = loadedTexture.value_or(selectedTexture); ImGui::Separator(); - ImGui::TextDisabled("TEXTURE RESOURCE"); - ImGui::Text("Name: %s", textureAsset.Name.empty() ? "" : textureAsset.Name.c_str()); - ImGui::TextDisabled("Guid: %s", textureAsset.AssetGuid.ToString().c_str()); - ImGui::Text("Source: %s", textureAsset.SourcePath.generic_string().c_str()); - ImGui::Text("Usage: %s", textureAsset.UsageHint.empty() ? "" : textureAsset.UsageHint.c_str()); + ImGui::TextDisabled("贴图资源"); + ImGui::Text("名称: %s", textureAsset.Name.empty() ? "<未命名>" : textureAsset.Name.c_str()); + ImGui::TextDisabled("GUID: %s", textureAsset.AssetGuid.ToString().c_str()); + ImGui::Text("来源: %s", textureAsset.SourcePath.generic_string().c_str()); + ImGui::Text("用途: %s", textureAsset.UsageHint.empty() ? "<未知>" : textureAsset.UsageHint.c_str()); ImGui::Text( - "Size: %d x %d x %d", + "尺寸: %d x %d x %d", textureAsset.Width, textureAsset.Height, textureAsset.Channels ); ImGui::Text( - "Payload: index=%llu size=%llu", + "载荷: 索引=%llu 大小=%llu", static_cast(textureAsset.PayloadIndex), static_cast(textureAsset.PayloadSize) ); const auto sceneReferences = FindSceneObjectsUsingTexture(editorContext, importedDocument, textureAsset.AssetGuid); - ImGui::Text("Scene References: %d", static_cast(sceneReferences.size())); + ImGui::Text("场景引用: %d", static_cast(sceneReferences.size())); if (!sceneReferences.empty()) { - if (ImGui::Button("Highlight Scene Objects##SelectedTexture")) { + if (ImGui::Button("高亮场景对象##SelectedTexture")) { editorContext.SetSelection(sceneReferences, sceneReferences.front()); } DrawReferencedObjectList(editorContext, sceneReferences, "SelectedTextureRefs"); } const auto materialReferences = MetaCoreFindMaterialTextureReferences(importedDocument, textureAsset.AssetGuid); - if (!materialReferences.empty() && ImGui::TreeNode("Material Slots##SelectedTexture")) { + if (!materialReferences.empty() && ImGui::TreeNode("材质槽位##SelectedTexture")) { for (std::size_t referenceIndex = 0; referenceIndex < materialReferences.size(); ++referenceIndex) { const MetaCoreMaterialTextureReference& reference = materialReferences[referenceIndex]; const std::string label = @@ -5115,38 +5128,38 @@ void DrawGeneratedTextureDetails( [[nodiscard]] const char* MetaCoreModelImportUpAxisLabel(MetaCoreModelImportUpAxis upAxis) { switch (upAxis) { case MetaCoreModelImportUpAxis::YUp: - return "Y-Up"; + return "Y 轴向上"; case MetaCoreModelImportUpAxis::ZUp: - return "Z-Up"; + return "Z 轴向上"; case MetaCoreModelImportUpAxis::XUp: - return "X-Up"; + return "X 轴向上"; case MetaCoreModelImportUpAxis::PreserveSource: default: - return "Preserve Source"; + return "保留源文件"; } } [[nodiscard]] const char* MetaCoreImportResultLabel(MetaCoreModelImportResult result) { switch (result) { case MetaCoreModelImportResult::Warning: - return "Warning"; + return "警告"; case MetaCoreModelImportResult::Error: - return "Error"; + return "错误"; case MetaCoreModelImportResult::Success: default: - return "Success"; + return "成功"; } } [[nodiscard]] const char* MetaCoreImportMessageSeverityLabel(MetaCoreImportMessageSeverity severity) { switch (severity) { case MetaCoreImportMessageSeverity::Warning: - return "Warning"; + return "警告"; case MetaCoreImportMessageSeverity::Error: - return "Error"; + return "错误"; case MetaCoreImportMessageSeverity::Info: default: - return "Info"; + return "信息"; } } @@ -5238,7 +5251,7 @@ void DrawMissingAnimatorPrompt(MetaCoreEditorContext& editorContext, MetaCoreGam ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.18F, 0.16F, 0.10F, 1.0F)); ImGui::BeginChild("MissingAnimatorPrompt", ImVec2(0, 58), true, ImGuiWindowFlags_NoScrollbar); ImGui::Text("该模型包含 %d 个动画 Clip,但当前根对象没有 Animator。", static_cast(modelDocument->Animations.size())); - if (ImGui::Button("添加 Animator 并播放", ImVec2(-1, 24))) { + if (ImGui::Button("添加动画器并播放", ImVec2(-1, 24))) { const MetaCoreId objectId = selectedObject.GetId(); const MetaCoreAssetRecord sourceRecord = *sourceAsset; const MetaCoreModelAssetDocument sourceDocument = *modelDocument; @@ -5470,60 +5483,60 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 4)); if (ImGui::BeginChild("ModelInspector", ImVec2(0, 0), true, 0)) { - ImGui::TextDisabled("MODEL ASSET"); + ImGui::TextDisabled("模型资源"); ImGui::SameLine(ImGui::GetWindowWidth() - 70.0F); - if (ImGui::Button("Instantiate", ImVec2(60, 0))) (void)MetaCoreInstantiateModelAsset(editorContext, selectedAsset.Guid, std::nullopt); + if (ImGui::Button("实例化", ImVec2(60, 0))) (void)MetaCoreInstantiateModelAsset(editorContext, selectedAsset.Guid, std::nullopt); ImGui::Separator(); // Summary Table if (ImGui::BeginTable("ModelSummaryTable", 2, ImGuiTableFlags_SizingFixedFit)) { - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("File Name"); ImGui::TableNextColumn(); ImGui::TextUnformatted(selectedAsset.RelativePath.filename().string().c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Root Display"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->RootDisplayName.c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Type"); ImGui::TableNextColumn(); ImGui::Text("%s (%s)", MetaCoreModelAssetKindLabel(importedDocument->ModelKind), importedDocument->SourceFormat.c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Importer"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->ImporterId.c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Guid"); ImGui::TableNextColumn(); ImGui::TextDisabled("%s", selectedAsset.Guid.ToString().c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Source"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->SourcePath.generic_string().c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Package"); ImGui::TableNextColumn(); ImGui::TextUnformatted((!assetRecord->PackagePath.empty() ? assetRecord->PackagePath : assetRecord->RelativePath).generic_string().c_str()); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Source Hash"); ImGui::TableNextColumn(); ImGui::Text("%llu", static_cast(importedDocument->SourceHash)); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Nodes"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->Nodes.size())); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Meshes"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedMeshAssets.size())); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Materials"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedMaterialAssets.size())); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Textures"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedTextureAssets.size())); - ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("Import Report"); ImGui::TableNextColumn(); ImGui::Text("%s (W:%d E:%d)", MetaCoreImportResultLabel(importedDocument->ImportReport.Result), warningCount, errorCount); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("文件名"); ImGui::TableNextColumn(); ImGui::TextUnformatted(selectedAsset.RelativePath.filename().string().c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("根显示名"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->RootDisplayName.c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("类型"); ImGui::TableNextColumn(); ImGui::Text("%s (%s)", MetaCoreModelAssetKindLabel(importedDocument->ModelKind), importedDocument->SourceFormat.c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("导入器"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->ImporterId.c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("GUID"); ImGui::TableNextColumn(); ImGui::TextDisabled("%s", selectedAsset.Guid.ToString().c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("来源"); ImGui::TableNextColumn(); ImGui::TextUnformatted(importedDocument->SourcePath.generic_string().c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("资源包"); ImGui::TableNextColumn(); ImGui::TextUnformatted((!assetRecord->PackagePath.empty() ? assetRecord->PackagePath : assetRecord->RelativePath).generic_string().c_str()); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("源文件哈希"); ImGui::TableNextColumn(); ImGui::Text("%llu", static_cast(importedDocument->SourceHash)); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("节点"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->Nodes.size())); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("网格"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedMeshAssets.size())); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("材质"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedMaterialAssets.size())); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("贴图"); ImGui::TableNextColumn(); ImGui::Text("%d", static_cast(importedDocument->GeneratedTextureAssets.size())); + ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text("导入报告"); ImGui::TableNextColumn(); ImGui::Text("%s (警告:%d 错误:%d)", MetaCoreImportResultLabel(importedDocument->ImportReport.Result), warningCount, errorCount); ImGui::EndTable(); } if (ImGui::BeginTabBar("ModelTabs")) { - if (ImGui::BeginTabItem("Overview")) { - ImGui::TextDisabled("Imported Structure"); - ImGui::BulletText("Source Mesh Entries: %d", static_cast(importedDocument->Meshes.size())); - ImGui::BulletText("Source Material Entries: %d", static_cast(importedDocument->Materials.size())); - ImGui::BulletText("Source Texture Entries: %d", static_cast(importedDocument->Textures.size())); - ImGui::BulletText("Generated Mesh Assets: %d", static_cast(importedDocument->GeneratedMeshAssets.size())); - ImGui::BulletText("Generated Material Assets: %d", static_cast(importedDocument->GeneratedMaterialAssets.size())); - ImGui::BulletText("Generated Texture Assets: %d", static_cast(importedDocument->GeneratedTextureAssets.size())); + if (ImGui::BeginTabItem("概览")) { + ImGui::TextDisabled("导入结构"); + ImGui::BulletText("源网格条目: %d", static_cast(importedDocument->Meshes.size())); + ImGui::BulletText("源材质条目: %d", static_cast(importedDocument->Materials.size())); + ImGui::BulletText("源贴图条目: %d", static_cast(importedDocument->Textures.size())); + ImGui::BulletText("生成网格资源: %d", static_cast(importedDocument->GeneratedMeshAssets.size())); + ImGui::BulletText("生成材质资源: %d", static_cast(importedDocument->GeneratedMaterialAssets.size())); + ImGui::BulletText("生成贴图资源: %d", static_cast(importedDocument->GeneratedTextureAssets.size())); ImGui::Separator(); - ImGui::TextDisabled("Hierarchy Summary"); + ImGui::TextDisabled("层级摘要"); std::size_t rootCount = 0; std::size_t meshNodeCount = 0; for (const auto& node : importedDocument->Nodes) { rootCount += node.ParentIndex < 0 ? 1U : 0U; meshNodeCount += node.MeshIndex >= 0 ? 1U : 0U; } - ImGui::BulletText("Root Nodes: %d", static_cast(rootCount)); - ImGui::BulletText("Renderable Nodes: %d", static_cast(meshNodeCount)); + ImGui::BulletText("根节点: %d", static_cast(rootCount)); + ImGui::BulletText("可渲染节点: %d", static_cast(meshNodeCount)); ImGui::Separator(); - ImGui::TextDisabled("Import State"); - ImGui::BulletText("Result: %s", MetaCoreImportResultLabel(importedDocument->ImportReport.Result)); - ImGui::BulletText("Fallback Used: %s", importedDocument->ImportReport.UsedFallback ? "Yes" : "No"); - ImGui::BulletText("Warnings: %d", warningCount); - ImGui::BulletText("Errors: %d", errorCount); + ImGui::TextDisabled("导入状态"); + ImGui::BulletText("结果: %s", MetaCoreImportResultLabel(importedDocument->ImportReport.Result)); + ImGui::BulletText("使用回退: %s", importedDocument->ImportReport.UsedFallback ? "是" : "否"); + ImGui::BulletText("警告: %d", warningCount); + ImGui::BulletText("错误: %d", errorCount); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Nodes")) { + if (ImGui::BeginTabItem("节点")) { if (importedDocument->Nodes.empty()) { - ImGui::TextDisabled("No nodes imported."); + ImGui::TextDisabled("没有导入节点。"); } else { DrawModelNodeTreeRecursive(editorContext, *importedDocument, importedDocument->SourcePath, -1); const std::string& selectedAssetSubId = editorContext.GetSelectedAssetSubId(); @@ -5533,45 +5546,45 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD static_cast(selectedNodeIndex) < importedDocument->Nodes.size()) { const auto& selectedNode = importedDocument->Nodes[static_cast(selectedNodeIndex)]; ImGui::Separator(); - ImGui::TextDisabled("Selected Node"); - ImGui::Text("Name: %s", selectedNode.Name.empty() ? "" : selectedNode.Name.c_str()); - ImGui::Text("Stable Path: %s", selectedNode.StableNodePath.empty() ? "" : selectedNode.StableNodePath.c_str()); - ImGui::Text("Index: %d", selectedNodeIndex); - ImGui::Text("Parent: %d", selectedNode.ParentIndex); - ImGui::Text("Mesh: %d", selectedNode.MeshIndex); + ImGui::TextDisabled("选中节点"); + ImGui::Text("名称: %s", selectedNode.Name.empty() ? "<未命名>" : selectedNode.Name.c_str()); + ImGui::Text("稳定路径: %s", selectedNode.StableNodePath.empty() ? "<无>" : selectedNode.StableNodePath.c_str()); + ImGui::Text("索引: %d", selectedNodeIndex); + ImGui::Text("父节点: %d", selectedNode.ParentIndex); + ImGui::Text("网格: %d", selectedNode.MeshIndex); std::size_t childCount = 0; for (const auto& node : importedDocument->Nodes) { if (node.ParentIndex == selectedNodeIndex) { ++childCount; } } - ImGui::Text("Children: %d", static_cast(childCount)); + ImGui::Text("子节点: %d", static_cast(childCount)); if (selectedNode.MeshIndex >= 0 && static_cast(selectedNode.MeshIndex) < importedDocument->Meshes.size()) { const auto& meshMeta = importedDocument->Meshes[static_cast(selectedNode.MeshIndex)]; - ImGui::Text("Mesh Name: %s", meshMeta.Name.empty() ? "" : meshMeta.Name.c_str()); - ImGui::Text("Primitives: %d", meshMeta.PrimitiveCount); - ImGui::Text("Material Slots: %d", static_cast(meshMeta.MaterialSlots.size())); + ImGui::Text("网格名称: %s", meshMeta.Name.empty() ? "<未命名>" : meshMeta.Name.c_str()); + ImGui::Text("图元: %d", meshMeta.PrimitiveCount); + ImGui::Text("材质槽位: %d", static_cast(meshMeta.MaterialSlots.size())); } const auto refs = FindSceneObjectsUsingModelNode( editorContext, importedDocument->SourcePath, selectedNodeIndex ); - ImGui::Text("Scene Instances: %d", static_cast(refs.size())); - if (ImGui::Button("Highlight Scene Objects##Node")) { + ImGui::Text("场景实例: %d", static_cast(refs.size())); + if (ImGui::Button("高亮场景对象##Node")) { if (!refs.empty()) { editorContext.SetSelection(refs, refs.front()); } } if (!refs.empty()) { ImGui::SameLine(); - if (ImGui::Button("Select First Instance##Node")) { + if (ImGui::Button("选择第一个实例##Node")) { editorContext.SelectOnly(refs.front()); } if (refs.size() > 1) { ImGui::SameLine(); - if (ImGui::Button("Select All Instances##Node")) { + if (ImGui::Button("选择全部实例##Node")) { editorContext.SetSelection(refs, refs.front()); } } @@ -5581,12 +5594,12 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Meshes")) { + if (ImGui::BeginTabItem("网格")) { if (ImGui::BeginTable("MeshesTable", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Name"); - ImGui::TableSetupColumn("Verts", ImGuiTableColumnFlags_WidthFixed, 50); - ImGui::TableSetupColumn("Indices", ImGuiTableColumnFlags_WidthFixed, 50); - ImGui::TableSetupColumn("SubMeshes", ImGuiTableColumnFlags_WidthFixed, 60); + ImGui::TableSetupColumn("名称"); + ImGui::TableSetupColumn("顶点", ImGuiTableColumnFlags_WidthFixed, 50); + ImGui::TableSetupColumn("索引", ImGuiTableColumnFlags_WidthFixed, 50); + ImGui::TableSetupColumn("子网格", ImGuiTableColumnFlags_WidthFixed, 60); ImGui::TableHeadersRow(); for (const auto& mesh : importedDocument->GeneratedMeshAssets) { ImGui::TableNextRow(); @@ -5609,11 +5622,11 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Materials")) { + if (ImGui::BeginTabItem("材质")) { if (ImGui::BeginTable("MatsTable", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Name"); - ImGui::TableSetupColumn("DoubleSided", ImGuiTableColumnFlags_WidthFixed, 30); - ImGui::TableSetupColumn("Alpha", ImGuiTableColumnFlags_WidthFixed, 60); + ImGui::TableSetupColumn("名称"); + ImGui::TableSetupColumn("双面", ImGuiTableColumnFlags_WidthFixed, 30); + ImGui::TableSetupColumn("透明", ImGuiTableColumnFlags_WidthFixed, 60); ImGui::TableHeadersRow(); for (const auto& mat : importedDocument->GeneratedMaterialAssets) { ImGui::TableNextRow(); @@ -5634,11 +5647,11 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD sizeof(payload) ); ImGui::TextUnformatted(mat.Name.c_str()); - ImGui::TextDisabled("Material"); + ImGui::TextDisabled("材质"); ImGui::EndDragDropSource(); } ImGui::TableNextColumn(); ImGui::TextUnformatted(mat.DoubleSided ? "Y" : "-"); - ImGui::TableNextColumn(); ImGui::TextUnformatted(mat.AlphaMode == MetaCoreMaterialAlphaMode::Blend ? "Blend" : (mat.AlphaMode == MetaCoreMaterialAlphaMode::Mask ? "Mask" : "Opaque")); + ImGui::TableNextColumn(); ImGui::TextUnformatted(mat.AlphaMode == MetaCoreMaterialAlphaMode::Blend ? "透明混合" : (mat.AlphaMode == MetaCoreMaterialAlphaMode::Mask ? "镂空裁剪" : "不透明")); if (ImGui::IsItemHovered()) { ImGui::SetTooltip("%s", mat.StableImportKey.c_str()); } @@ -5647,12 +5660,12 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Textures")) { + if (ImGui::BeginTabItem("贴图")) { if (ImGui::BeginTable("TexturesTable", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Name"); - ImGui::TableSetupColumn("Usage", ImGuiTableColumnFlags_WidthFixed, 100); - ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, 120); - ImGui::TableSetupColumn("Source"); + ImGui::TableSetupColumn("名称"); + ImGui::TableSetupColumn("用途", ImGuiTableColumnFlags_WidthFixed, 100); + ImGui::TableSetupColumn("尺寸", ImGuiTableColumnFlags_WidthFixed, 120); + ImGui::TableSetupColumn("来源"); ImGui::TableHeadersRow(); for (std::size_t textureIndex = 0; textureIndex < importedDocument->GeneratedTextureAssets.size(); ++textureIndex) { const auto& textureAsset = importedDocument->GeneratedTextureAssets[textureIndex]; @@ -5693,9 +5706,9 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Animations")) { + if (ImGui::BeginTabItem("动画")) { if (importedDocument->Animations.empty()) { - ImGui::TextDisabled("No animations imported."); + ImGui::TextDisabled("没有导入动画。"); } else { const std::string previewKey = selectedAsset.Guid.ToString(); auto& previewState = ModelAnimationPreviewStates_[previewKey]; @@ -5728,14 +5741,14 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } const std::string currentClipLabel = selectedClip.Name.empty() - ? ("Clip " + std::to_string(previewState.ClipIndex)) + ? ("动画片段 " + std::to_string(previewState.ClipIndex)) : selectedClip.Name; ImGui::SetNextItemWidth(-1); - if (ImGui::BeginCombo("Clip##ModelAnimationPreview", currentClipLabel.c_str())) { + if (ImGui::BeginCombo("动画片段##ModelAnimationPreview", currentClipLabel.c_str())) { for (std::size_t clipIndex = 0; clipIndex < importedDocument->Animations.size(); ++clipIndex) { const auto& clip = importedDocument->Animations[clipIndex]; const std::string clipLabel = clip.Name.empty() - ? ("Clip " + std::to_string(clipIndex)) + ? ("动画片段 " + std::to_string(clipIndex)) : clip.Name; const bool selected = clipIndex == static_cast(previewState.ClipIndex); if (ImGui::Selectable(clipLabel.c_str(), selected)) { @@ -5750,16 +5763,16 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD ImGui::EndCombo(); } - if (ImGui::Button(previewState.Playing ? "Pause##ModelAnimationPreview" : "Play##ModelAnimationPreview")) { + if (ImGui::Button(previewState.Playing ? "暂停##ModelAnimationPreview" : "播放##ModelAnimationPreview")) { previewState.Playing = !previewState.Playing; } ImGui::SameLine(); - if (ImGui::Button("Stop##ModelAnimationPreview")) { + if (ImGui::Button("停止##ModelAnimationPreview")) { previewState.Playing = false; previewState.TimeSeconds = 0.0F; } ImGui::SameLine(); - if (ImGui::Button("Instantiate and Play##ModelAnimationPreview")) { + if (ImGui::Button("实例化并播放##ModelAnimationPreview")) { if (const auto instantiatedRootId = MetaCoreInstantiateModelAsset(editorContext, selectedAsset.Guid, std::nullopt); instantiatedRootId.has_value()) { if (MetaCoreGameObject rootObject = editorContext.GetScene().FindGameObject(*instantiatedRootId); @@ -5781,17 +5794,17 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } const float sliderMax = durationSeconds > 0.0F ? durationSeconds : std::max(1.0F, previewState.TimeSeconds); - ImGui::SliderFloat("Time##ModelAnimationPreview", &previewState.TimeSeconds, 0.0F, sliderMax, "%.3f s"); - ImGui::DragFloat("Speed##ModelAnimationPreview", &previewState.Speed, 0.05F, 0.0F, 8.0F); + ImGui::SliderFloat("时间##ModelAnimationPreview", &previewState.TimeSeconds, 0.0F, sliderMax, "%.3f s"); + ImGui::DragFloat("速度##ModelAnimationPreview", &previewState.Speed, 0.05F, 0.0F, 8.0F); previewState.Speed = std::max(0.0F, previewState.Speed); - ImGui::Checkbox("Loop##ModelAnimationPreview", &previewState.Loop); + ImGui::Checkbox("循环##ModelAnimationPreview", &previewState.Loop); if (ImGui::BeginTable("AnimationsTable", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg)) { - ImGui::TableSetupColumn("Name"); - ImGui::TableSetupColumn("Duration", ImGuiTableColumnFlags_WidthFixed, 80); - ImGui::TableSetupColumn("Channels", ImGuiTableColumnFlags_WidthFixed, 70); - ImGui::TableSetupColumn("Samplers", ImGuiTableColumnFlags_WidthFixed, 70); - ImGui::TableSetupColumn("Targets", ImGuiTableColumnFlags_WidthFixed, 70); + ImGui::TableSetupColumn("名称"); + ImGui::TableSetupColumn("时长", ImGuiTableColumnFlags_WidthFixed, 80); + ImGui::TableSetupColumn("通道", ImGuiTableColumnFlags_WidthFixed, 70); + ImGui::TableSetupColumn("采样器", ImGuiTableColumnFlags_WidthFixed, 70); + ImGui::TableSetupColumn("目标", ImGuiTableColumnFlags_WidthFixed, 70); ImGui::TableHeadersRow(); for (std::size_t clipIndex = 0; clipIndex < importedDocument->Animations.size(); ++clipIndex) { const auto& clip = importedDocument->Animations[clipIndex]; @@ -5799,7 +5812,7 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD ImGui::TableNextColumn(); const bool selected = clipIndex == static_cast(previewState.ClipIndex); const std::string label = clip.Name.empty() - ? ("Clip " + std::to_string(clipIndex)) + ? ("动画片段 " + std::to_string(clipIndex)) : clip.Name; if (ImGui::Selectable(label.c_str(), selected, ImGuiSelectableFlags_SpanAllColumns)) { previewState.ClipIndex = static_cast(clipIndex); @@ -5823,18 +5836,18 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD } ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Import Settings")) { + if (ImGui::BeginTabItem("导入设置")) { // 当前阶段 Import Settings 为只读显示,后续迭代再开放编辑 - const char* upAxisNames[] = {"Preserve Source", "Y-Up", "Z-Up", "X-Up"}; + const char* upAxisNames[] = {"保留源文件", "Y 轴向上", "Z 轴向上", "X 轴向上"}; const int upAxisIndex = static_cast(importedDocument->ImportSettings.UpAxis); - ImGui::Text("Up Axis: %s", (upAxisIndex >= 0 && upAxisIndex < 4) ? upAxisNames[upAxisIndex] : "Unknown"); - ImGui::Text("Scale Factor: %.3f", importedDocument->ImportSettings.ScaleFactor); - ImGui::Text("Preserve Hierarchy: %s", importedDocument->ImportSettings.PreserveHierarchy ? "Yes" : "No"); - ImGui::Text("Preserve Empty Nodes: %s", importedDocument->ImportSettings.PreserveEmptyNodes ? "Yes" : "No"); - ImGui::Text("Preserve Material Slots: %s", importedDocument->ImportSettings.PreserveMaterialSlots ? "Yes" : "No"); + ImGui::Text("向上轴: %s", (upAxisIndex >= 0 && upAxisIndex < 4) ? upAxisNames[upAxisIndex] : "未知"); + ImGui::Text("缩放系数: %.3f", importedDocument->ImportSettings.ScaleFactor); + ImGui::Text("保留层级: %s", importedDocument->ImportSettings.PreserveHierarchy ? "是" : "否"); + ImGui::Text("保留空节点: %s", importedDocument->ImportSettings.PreserveEmptyNodes ? "是" : "否"); + ImGui::Text("保留材质槽位: %s", importedDocument->ImportSettings.PreserveMaterialSlots ? "是" : "否"); ImGui::Separator(); - if (ImGui::Button("Reimport")) { + if (ImGui::Button("重新导入")) { if (importPipelineService != nullptr && importPipelineService->ReimportAsset(selectedAsset.Guid)) { (void)assetDatabaseService.Refresh(); editorContext.AddConsoleMessage(MetaCoreLogLevel::Info, "Import", "模型重新导入完成"); @@ -5845,14 +5858,14 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Import Report")) { - ImGui::Text("Result: %s", MetaCoreImportResultLabel(importedDocument->ImportReport.Result)); - ImGui::Text("Fallback Used: %s", importedDocument->ImportReport.UsedFallback ? "Yes" : "No"); - ImGui::Text("Warnings: %d", warningCount); - ImGui::Text("Errors: %d", errorCount); + if (ImGui::BeginTabItem("导入报告")) { + ImGui::Text("结果: %s", MetaCoreImportResultLabel(importedDocument->ImportReport.Result)); + ImGui::Text("使用回退: %s", importedDocument->ImportReport.UsedFallback ? "是" : "否"); + ImGui::Text("警告: %d", warningCount); + ImGui::Text("错误: %d", errorCount); ImGui::Separator(); if (importedDocument->ImportReport.Messages.empty()) { - ImGui::TextDisabled("No import messages recorded."); + ImGui::TextDisabled("没有导入消息。"); } else { for (std::size_t messageIndex = 0; messageIndex < importedDocument->ImportReport.Messages.size(); ++messageIndex) { const MetaCoreImportMessageDocument& message = importedDocument->ImportReport.Messages[messageIndex]; @@ -5884,21 +5897,21 @@ void DrawModelAssetDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD MetaCoreFindGeneratedResourceEntry(generatedEntries, selectedGeneratedGuid); const std::string selectedLabel = selectedEntry != nullptr - ? selectedEntry->Kind + " | " + selectedEntry->Name - : selectedGeneratedKind + " | " + selectedGeneratedGuid.ToString(); - ImGui::TextColored(ImVec4(0.2F, 0.7F, 0.9F, 1.0F), "Selected: %s", selectedLabel.c_str()); - if (selectedGeneratedKind == "mesh" && ImGui::Button("Highlight Scene Objects")) { + ? std::string(MetaCoreGeneratedResourceKindLabel(selectedEntry->Kind)) + " | " + selectedEntry->Name + : std::string(MetaCoreGeneratedResourceKindLabel(selectedGeneratedKind)) + " | " + selectedGeneratedGuid.ToString(); + ImGui::TextColored(ImVec4(0.2F, 0.7F, 0.9F, 1.0F), "已选中: %s", selectedLabel.c_str()); + if (selectedGeneratedKind == "mesh" && ImGui::Button("高亮场景对象")) { const auto refs = FindSceneObjectsUsingMesh(editorContext, selectedGeneratedGuid); if (!refs.empty()) editorContext.SetSelection(refs, refs.front()); - } else if (selectedGeneratedKind == "material" && ImGui::Button("Highlight Scene Objects")) { + } else if (selectedGeneratedKind == "material" && ImGui::Button("高亮场景对象")) { const auto refs = FindSceneObjectsUsingMaterial(editorContext, selectedGeneratedGuid); if (!refs.empty()) editorContext.SetSelection(refs, refs.front()); - } else if (selectedGeneratedKind == "texture" && ImGui::Button("Highlight Scene Objects")) { + } else if (selectedGeneratedKind == "texture" && ImGui::Button("高亮场景对象")) { const auto refs = FindSceneObjectsUsingTexture(editorContext, *importedDocument, selectedGeneratedGuid); if (!refs.empty()) editorContext.SetSelection(refs, refs.front()); } ImGui::SameLine(); - if (ImGui::Button("Unselect")) editorContext.ClearSelectedAssetSubId(); + if (ImGui::Button("取消选择")) editorContext.ClearSelectedAssetSubId(); } if (hasSelectedGeneratedResource && selectedGeneratedKind == "material") { @@ -6110,17 +6123,17 @@ void DrawPrefabDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetDatab ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 4)); if (ImGui::BeginChild("PrefabInspector", ImVec2(0, 0), true, 0)) { - ImGui::TextDisabled("PREFAB ASSET"); + ImGui::TextDisabled("预制体资源"); ImGui::Separator(); ImGui::Text("名称: %s", summary->Name.c_str()); ImGui::Text("对象总数: %d", (int)summary->ObjectCount); ImGui::Text("根节点数: %d", (int)summary->RootCount); if (summary->RootCount > 0) { - ImGui::Text("Root Nodes:"); + ImGui::Text("根节点:"); for (const auto& rootName : summary->RootNames) ImGui::BulletText("%s", rootName.c_str()); } ImGui::Spacing(); - if (ImGui::Button("Open in Editor", ImVec2(-1, 0))) { /* Logic */ } + if (ImGui::Button("在编辑器中打开", ImVec2(-1, 0))) { /* Logic */ } } ImGui::EndChild(); ImGui::PopStyleVar(); @@ -6137,13 +6150,13 @@ void DrawUiDocumentDetails(MetaCoreEditorContext& editorContext, MetaCoreIAssetD ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 4)); if (ImGui::BeginChild("UiInspector", ImVec2(0, 0), true, 0)) { - ImGui::TextDisabled("UI DOCUMENT"); + ImGui::TextDisabled("UI 文档"); ImGui::Separator(); ImGui::Text("名称: %s", summary->Name.c_str()); ImGui::Text("节点总数: %d", (int)summary->NodeCount); ImGui::Text("根节点数: %d", (int)summary->RootCount); ImGui::Spacing(); - if (ImGui::Button("Edit Layout", ImVec2(-1, 0))) { /* Logic */ } + if (ImGui::Button("编辑布局", ImVec2(-1, 0))) { /* Logic */ } } ImGui::EndChild(); ImGui::PopStyleVar(); @@ -6362,7 +6375,7 @@ void MetaCoreDrawAssetInspector(MetaCoreEditorContext& editorContext, MetaCoreIA ImGui::Separator(); ImGui::Text("资源: %s", selectedAsset.RelativePath.filename().string().c_str()); ImGui::TextDisabled("类型: %s", selectedAsset.Type.c_str()); - ImGui::TextDisabled("Guid: %s", selectedAsset.Guid.ToString().c_str()); + ImGui::TextDisabled("GUID: %s", selectedAsset.Guid.ToString().c_str()); } } @@ -7998,7 +8011,7 @@ public: MetaCoreHasMeshRendererOverride(selectedObject, *prefabSourceObject); } - ImGui::Text("Prefab 实例%s", hasAnyOverride ? " [覆盖]" : ""); + ImGui::Text("预制体实例%s", hasAnyOverride ? " [覆盖]" : ""); ImGui::SameLine(); if (ImGui::SmallButton("应用")) { (void)MetaCoreApplySelectedPrefabInstance(editorContext);