update models loading in /editor

This commit is contained in:
math-pixel
2026-04-27 16:27:56 +02:00
parent 868f7a1cfd
commit 21d91f1de1
+49 -14
View File
@@ -1,4 +1,12 @@
import { useMemo, useRef, useEffect, useState } from "react"; import {
useMemo,
useRef,
useEffect,
useState,
Suspense,
Component,
type ReactNode,
} from "react";
import { useGLTF } from "@react-three/drei"; import { useGLTF } from "@react-three/drei";
import { Grid, TransformControls } from "@react-three/drei"; import { Grid, TransformControls } from "@react-three/drei";
import * as THREE from "three"; import * as THREE from "three";
@@ -19,6 +27,31 @@ interface MapViewerProps {
const clonedScenesCache = new Map<string, THREE.Group>(); const clonedScenesCache = new Map<string, THREE.Group>();
class ErrorBoundary extends Component<
{ children: ReactNode; fallback?: ReactNode },
{ hasError: boolean }
> {
constructor(props: { children: ReactNode; fallback?: ReactNode }) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(): { hasError: boolean } {
return { hasError: true };
}
componentDidCatch(error: Error, _errorInfo: React.ErrorInfo): void {
console.warn("Model loading error:", error.message);
}
render() {
if (this.state.hasError) {
return this.props.fallback || null;
}
return this.props.children;
}
}
export default function MapViewer({ export default function MapViewer({
sceneData, sceneData,
selectedNodeIndex, selectedNodeIndex,
@@ -29,7 +62,7 @@ export default function MapViewer({
onTransformStart, onTransformStart,
onTransformEnd, onTransformEnd,
onNodeTransform, onNodeTransform,
}: MapViewerProps) { }: MapViewerProps): React.JSX.Element {
const isTransforming = useRef(false); const isTransforming = useRef(false);
const objectsMapRef = useRef<Map<number, THREE.Object3D>>(new Map()); const objectsMapRef = useRef<Map<number, THREE.Object3D>>(new Map());
@@ -52,7 +85,6 @@ export default function MapViewer({
rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z], rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z],
scale: [obj.scale.x, obj.scale.y, obj.scale.z], scale: [obj.scale.x, obj.scale.y, obj.scale.z],
}; };
// Call onNodeTransform BEFORE onTransformEnd so history captures final state
onNodeTransform?.(selectedNodeIndex, updatedNode); onNodeTransform?.(selectedNodeIndex, updatedNode);
} }
} }
@@ -101,17 +133,20 @@ export default function MapViewer({
if (modelUrl) { if (modelUrl) {
return ( return (
<ModelNodeWithRef <ErrorBoundary key={index} fallback={null}>
key={index} <Suspense fallback={null}>
index={index} <ModelNodeWithRef
node={node} index={index}
modelUrl={modelUrl} node={node}
isSelected={selectedNodeIndex === index} modelUrl={modelUrl}
isHovered={hoveredNodeIndex === index} isSelected={selectedNodeIndex === index}
objectsMapRef={objectsMapRef} isHovered={hoveredNodeIndex === index}
onSelectNode={onSelectNode} objectsMapRef={objectsMapRef}
onHoverNode={onHoverNode} onSelectNode={onSelectNode}
/> onHoverNode={onHoverNode}
/>
</Suspense>
</ErrorBoundary>
); );
} else { } else {
return ( return (