From 6c7f02c1428456c29b30c7d1d7f61864841eeee0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 6 Apr 2026 20:16:50 +0800 Subject: [PATCH] refactor: white-label 3d world workspace --- app/canvas/[id]/model3d/page.tsx | 202 +++++-------------- components/canvas/nodes/World3DNode.tsx | 84 ++++---- components/canvas/world3d/World3DViewer.tsx | 18 +- components/canvas/world3d/WorldSharePage.tsx | 26 +-- 4 files changed, 111 insertions(+), 219 deletions(-) diff --git a/app/canvas/[id]/model3d/page.tsx b/app/canvas/[id]/model3d/page.tsx index 1a68259b5..3276653f7 100644 --- a/app/canvas/[id]/model3d/page.tsx +++ b/app/canvas/[id]/model3d/page.tsx @@ -190,6 +190,15 @@ const WORLDLABS_MODEL_OPTIONS = [ "marble-1.0", "marble-1.0-draft", ] as const; +const WORLD_MODEL_DISPLAY_LABELS: Record< + (typeof WORLDLABS_MODEL_OPTIONS)[number], + string +> = { + "marble-1.1": "标准质量", + "marble-1.1-plus": "高保真", + "marble-1.0": "兼容质量", + "marble-1.0-draft": "快速草稿", +}; const ENV_PRESET_OPTIONS: Model3DViewerSettings["envPreset"][] = [ "city", @@ -540,6 +549,11 @@ function worldModeToTaskMode(mode: WorldGenerationMode): TaskMode { } } +function getWorldModelDisplayLabel(value?: string | null) { + const normalized = String(value || "").trim() as (typeof WORLDLABS_MODEL_OPTIONS)[number]; + return WORLD_MODEL_DISPLAY_LABELS[normalized] || "标准质量"; +} + export default function CanvasModel3DPage() { const router = useRouter(); const routeParams = useParams(); @@ -1666,9 +1680,7 @@ export default function CanvasModel3DPage() { status: "completed", activeView: primarySplatUrl ? "splat" - : worldAssetPayload?.worldUrl - ? "world" - : worldImageUrl + : worldImageUrl ? "image" : "mesh", firstPerson: false, @@ -1829,15 +1841,6 @@ export default function CanvasModel3DPage() { } }, [currentTask, updateWorldShareState]); - const handleOpenWorldUrl = () => { - const worldUrl = currentTask?.assetPayload?.worldUrl; - if (!worldUrl) { - toast.error("当前任务暂无可打开的 World 链接"); - return; - } - window.open(worldUrl, "_blank", "noopener,noreferrer"); - }; - const handleOpenPanoUrl = () => { const imageUrl = currentTask?.assetPayload?.panoUrl || @@ -2139,8 +2142,6 @@ export default function CanvasModel3DPage() { const currentWorldAsset = currentTask?.provider === "worldlabs-3d" ? currentTask.assetPayload ?? null : null; - const currentWorldId = - currentWorldAsset?.worldId || currentTask?.sourceTaskId || null; const currentWorldShareUrl = currentTask?.provider === "worldlabs-3d" && currentTask?.shareEnabled ? buildWorldShareUrl(currentTask.shareToken) @@ -2166,21 +2167,18 @@ export default function CanvasModel3DPage() { const availableWorldViewportModes = useMemo(() => { const modes: WorldViewportMode[] = []; if (currentPrimarySpzUrl) modes.push("splat"); - if (currentWorldAsset?.worldUrl) modes.push("world"); if (currentWorldImageUrl) modes.push("imagery"); if (currentModelUrl) modes.push("mesh"); return modes; - }, [currentModelUrl, currentPrimarySpzUrl, currentWorldAsset?.worldUrl, currentWorldImageUrl]); + }, [currentModelUrl, currentPrimarySpzUrl, currentWorldImageUrl]); const preferredWorldViewportMode: WorldViewportMode = currentPrimarySpzUrl ? "splat" - : currentWorldAsset?.worldUrl - ? "world" : currentWorldImageUrl ? "imagery" : currentModelUrl ? "mesh" - : "world"; + : "splat"; const activeWorkspaceTitle = workspaceMode === "world" ? "3D 世界工作台" : "3D 工作台"; const viewerEmptyStateTitle = @@ -2245,15 +2243,6 @@ export default function CanvasModel3DPage() {
- {/* DCC Bridge (Mock) */} - -
积分 {pointsLabel} @@ -2821,7 +2810,7 @@ export default function CanvasModel3DPage() {
- +