update models loading in /editor
This commit is contained in:
@@ -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,8 +133,9 @@ export default function MapViewer({
|
|||||||
|
|
||||||
if (modelUrl) {
|
if (modelUrl) {
|
||||||
return (
|
return (
|
||||||
|
<ErrorBoundary key={index} fallback={null}>
|
||||||
|
<Suspense fallback={null}>
|
||||||
<ModelNodeWithRef
|
<ModelNodeWithRef
|
||||||
key={index}
|
|
||||||
index={index}
|
index={index}
|
||||||
node={node}
|
node={node}
|
||||||
modelUrl={modelUrl}
|
modelUrl={modelUrl}
|
||||||
@@ -112,6 +145,8 @@ export default function MapViewer({
|
|||||||
onSelectNode={onSelectNode}
|
onSelectNode={onSelectNode}
|
||||||
onHoverNode={onHoverNode}
|
onHoverNode={onHoverNode}
|
||||||
/>
|
/>
|
||||||
|
</Suspense>
|
||||||
|
</ErrorBoundary>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user