From 3476715c68f0aa0e8e4923194f5bf83df21c9684 Mon Sep 17 00:00:00 2001 From: Max Tobias Weber Date: Fri, 9 Jan 2026 09:22:01 +0100 Subject: [PATCH 1/7] refactor: streamline MlThreeModelLayer and MlThreeSplatLayer props for transform handling --- .../MlThreeModelLayer.stories.tsx | 65 ++-------- .../MlThreeModelLayer/MlThreeModelLayer.tsx | 90 +++++++------- .../MlThreeSplatLayer.stories.tsx | 69 ++--------- .../MlThreeSplatLayer/MlThreeSplatLayer.tsx | 87 +++++++------ .../src/components/ThreeObjectControls.tsx | 115 +++++++----------- 5 files changed, 145 insertions(+), 281 deletions(-) diff --git a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.stories.tsx b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.stories.tsx index c6446386..28c25356 100644 --- a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.stories.tsx +++ b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.stories.tsx @@ -5,7 +5,6 @@ import { useMap, TopToolbar, Sidebar } from '@mapcomponents/react-maplibre'; import ThreejsContextDecorator from '../../decorators/ThreejsContextDecorator'; import { useThree } from '../ThreeContext'; import { ThreeObjectControls } from '../ThreeObjectControls'; -import ThreejsUtils from '../../lib/ThreejsUtils'; import * as THREE from 'three'; const storyoptions = { @@ -48,16 +47,11 @@ const Lights = () => { }; const Template: any = () => { - const { worldMatrix } = useThree(); const [showLayer, setShowLayer] = useState(true); const [scale, setScale] = useState(1); const [rotation, setRotation] = useState({ x: 90, y: 90, z: 0 }); - const [useMapCoords, setUseMapCoords] = useState(true); const [mapPosition, setMapPosition] = useState({ lng: 7.097, lat: 50.7355 }); - const [altitude, setAltitude] = useState(0); const [position, setPosition] = useState({ x: 0, y: 0, z: 0 }); - const [enableTransformControls, setEnableTransformControls] = useState(false); - const [transformMode, setTransformMode] = useState<'translate' | 'rotate' | 'scale'>('translate'); const [sidebarOpen, setSidebarOpen] = useState(true); const mapHook = useMap({ mapId: 'map_1' }); @@ -68,55 +62,22 @@ const Template: any = () => { mapHook.map?.setCenter([7.097, 50.7355]); }, [mapHook.map]); - // Center map on position when switching coordinate modes - useEffect(() => { - if (!mapHook.map) return; - if (useMapCoords) { - mapHook.map.setCenter([mapPosition.lng, mapPosition.lat]); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [useMapCoords, mapHook.map]); - - const handleTransformChange = (object: THREE.Object3D) => { - setRotation({ - x: (object.rotation.x * 180) / Math.PI, - y: (object.rotation.y * 180) / Math.PI, - z: (object.rotation.z * 180) / Math.PI, - }); - setScale(object.scale.x); - - if (useMapCoords && worldMatrix) { - const [lng, lat, alt] = ThreejsUtils.toMapPosition(worldMatrix, object.position); - setMapPosition({ lng, lat }); - setAltitude(alt); - } else { - setPosition({ x: object.position.x, y: object.position.y, z: object.position.z }); - } - }; - return ( <> {showLayer && ( )} @@ -138,18 +99,10 @@ const Template: any = () => { setScale={setScale} rotation={rotation} setRotation={setRotation} - useMapCoords={useMapCoords} - setUseMapCoords={setUseMapCoords} mapPosition={mapPosition} setMapPosition={setMapPosition} - altitude={altitude} - setAltitude={setAltitude} position={position} setPosition={setPosition} - enableTransformControls={enableTransformControls} - setEnableTransformControls={setEnableTransformControls} - transformMode={transformMode} - setTransformMode={setTransformMode} layerName="Model" /> diff --git a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.tsx b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.tsx index 954509bd..89f336e9 100644 --- a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.tsx +++ b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.tsx @@ -5,7 +5,6 @@ import { OBJLoader } from 'three/addons/loaders/OBJLoader.js'; import { LngLatLike } from 'maplibre-gl'; import { useThree } from '../ThreeContext'; import ThreejsUtils from '../../lib/ThreejsUtils'; -import MlTransformControls from '../MlTransformControls'; /** * Renders obj or gltf 3D Models on the MapLibreMap referenced by props.mapId @@ -16,14 +15,12 @@ import MlTransformControls from '../MlTransformControls'; export interface MlThreeModelLayerProps { mapId?: string; url: string; - position?: { x: number; y: number; z: number }; - mapPosition?: LngLatLike; - altitude?: number; - rotation?: { x: number; y: number; z: number }; - scale?: { x: number; y: number; z: number } | number; - enableTransformControls?: boolean; - transformMode?: 'translate' | 'rotate' | 'scale'; - onTransformChange?: (object: THREE.Object3D) => void; + position: LngLatLike; + transform?: { + rotation?: { x: number; y: number; z: number }; + scale?: { x: number; y: number; z: number } | number; + position?: { x: number; y: number; z: number }; + }; init?: () => void; onDone?: () => void; } @@ -32,13 +29,7 @@ const MlThreeModelLayer = (props: MlThreeModelLayerProps) => { const { url, position, - mapPosition, - altitude, - rotation, - scale, - enableTransformControls, - transformMode, - onTransformChange, + transform, init, onDone, } = props; @@ -52,8 +43,8 @@ const MlThreeModelLayer = (props: MlThreeModelLayerProps) => { initRef.current = init; onDoneRef.current = onDone; - const transformRef = useRef({ position, mapPosition, altitude, rotation, scale }); - transformRef.current = { position, mapPosition, altitude, rotation, scale }; + const transformRef = useRef({ position, transform }); + transformRef.current = { position, transform }; const worldMatrixInvRef = useRef(worldMatrixInv); worldMatrixInvRef.current = worldMatrixInv; @@ -67,24 +58,29 @@ const MlThreeModelLayer = (props: MlThreeModelLayerProps) => { const extension = url.split('.').pop()?.toLowerCase(); const onLoad = (object: THREE.Object3D) => { - const { position, mapPosition, altitude, rotation, scale } = transformRef.current; + const { position, transform } = transformRef.current; const worldMatrixInv = worldMatrixInvRef.current; - if (mapPosition && worldMatrixInv) { - const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, mapPosition, altitude); + if (position && worldMatrixInv) { + const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, position, 0); object.position.set(scenePos.x, scenePos.y, scenePos.z); - } else if (position) { - object.position.set(position.x, position.y, position.z); + + // Apply local position offset if provided + if (transform?.position) { + object.position.x += transform.position.x; + object.position.y += transform.position.y; + object.position.z += transform.position.z; + } } - if (rotation) { - object.rotation.set(rotation.x, rotation.y, rotation.z); + if (transform?.rotation) { + object.rotation.set(transform.rotation.x, transform.rotation.y, transform.rotation.z); } - if (scale) { - if (typeof scale === 'number') { - object.scale.set(scale, scale, scale); + if (transform?.scale) { + if (typeof transform.scale === 'number') { + object.scale.set(transform.scale, transform.scale, transform.scale); } else { - object.scale.set(scale.x, scale.y, scale.z); + object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z); } } @@ -122,32 +118,32 @@ const MlThreeModelLayer = (props: MlThreeModelLayerProps) => { useEffect(() => { if (!model) return; - // Handle position: mapPosition takes precedence over position - if (mapPosition && worldMatrixInv) { - const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, mapPosition, altitude); + if (position && worldMatrixInv) { + const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, position, 0); model.position.set(scenePos.x, scenePos.y, scenePos.z); - } else if (position) { - model.position.set(position.x, position.y, position.z); + + // Apply local position offset if provided + if (transform?.position) { + model.position.x += transform.position.x; + model.position.y += transform.position.y; + model.position.z += transform.position.z; + } } - if (rotation) { - model.rotation.set(rotation.x, rotation.y, rotation.z); + if (transform?.rotation) { + model.rotation.set(transform.rotation.x, transform.rotation.y, transform.rotation.z); } - if (scale) { - if (typeof scale === 'number') { - model.scale.set(scale, scale, scale); + if (transform?.scale) { + if (typeof transform.scale === 'number') { + model.scale.set(transform.scale, transform.scale, transform.scale); } else { - model.scale.set(scale.x, scale.y, scale.z); + model.scale.set(transform.scale.x, transform.scale.y, transform.scale.z); } } - }, [model, position, mapPosition, altitude, rotation, scale, worldMatrixInv]); + model.updateMatrixWorld(true); + }, [model, position, transform, worldMatrixInv]); - if (enableTransformControls && model) { - return ( - - ); - } return null; }; -export default MlThreeModelLayer; +export default MlThreeModelLayer; \ No newline at end of file diff --git a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.stories.tsx b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.stories.tsx index c67535e6..da6b69a2 100644 --- a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.stories.tsx +++ b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.stories.tsx @@ -6,9 +6,6 @@ import MlThreeSplatLayer from './MlThreeSplatLayer'; import { useMap, TopToolbar, Sidebar } from '@mapcomponents/react-maplibre'; import MlThreeJsContextDecorator from '../../decorators/ThreejsContextDecorator'; import { ThreeObjectControls } from '../ThreeObjectControls'; -import { useThree } from '../ThreeContext'; -import ThreejsUtils from '../../lib/ThreejsUtils'; -import * as THREE from 'three'; const storyoptions = { title: 'MapComponents/MlThreeSplatLayer', @@ -25,16 +22,11 @@ const storyoptions = { export default storyoptions; const Template: any = () => { - const { worldMatrix } = useThree(); const [showLayer, setShowLayer] = useState(true); const [scale, setScale] = useState(100); const [rotation, setRotation] = useState({ x: 270, y: 0, z: 5 }); - const [useMapCoords, setUseMapCoords] = useState(true); const [mapPosition, setMapPosition] = useState({ lng: 7.0968, lat: 50.736 }); - const [altitude, setAltitude] = useState(30); - const [position, setPosition] = useState({ x: 0, y: 0, z: 100 }); - const [enableTransformControls, setEnableTransformControls] = useState(false); - const [transformMode, setTransformMode] = useState<'translate' | 'rotate' | 'scale'>('translate'); + const [position, setPosition] = useState({ x: 0, y: 0, z: 30 }); const [sidebarOpen, setSidebarOpen] = useState(true); const mapHook = useMap({ mapId: 'map_1' }); @@ -45,54 +37,21 @@ const Template: any = () => { mapHook.map?.setCenter([7.096614581535903, 50.736500960686556]); }, [mapHook.map]); - // Center map on position when switching coordinate modes - useEffect(() => { - if (!mapHook.map) return; - if (useMapCoords) { - mapHook.map.setCenter([mapPosition.lng, mapPosition.lat]); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [useMapCoords, mapHook.map]); - - const handleTransformChange = (object: THREE.Object3D) => { - setRotation({ - x: (object.rotation.x * 180) / Math.PI, - y: (object.rotation.y * 180) / Math.PI, - z: (object.rotation.z * 180) / Math.PI, - }); - setScale(object.scale.x); - - if (useMapCoords && worldMatrix) { - const [lng, lat, alt] = ThreejsUtils.toMapPosition(worldMatrix, object.position); - setMapPosition({ lng, lat }); - setAltitude(parseFloat(alt.toFixed(2))); - } else { - setPosition({ x: object.position.x, y: object.position.y, z: object.position.z }); - } - }; - return ( <> {showLayer && ( )} @@ -114,18 +73,10 @@ const Template: any = () => { setScale={setScale} rotation={rotation} setRotation={setRotation} - useMapCoords={useMapCoords} - setUseMapCoords={setUseMapCoords} mapPosition={mapPosition} setMapPosition={setMapPosition} - altitude={altitude} - setAltitude={setAltitude} position={position} setPosition={setPosition} - enableTransformControls={enableTransformControls} - setEnableTransformControls={setEnableTransformControls} - transformMode={transformMode} - setTransformMode={setTransformMode} layerName="Splat" /> void; + position: LngLatLike; + transform?: { + rotation?: { x: number; y: number; z: number }; + scale?: { x: number; y: number; z: number } | number; + position?: { x: number; y: number; z: number }; + }; init?: () => void; onDone?: () => void; } @@ -32,13 +29,7 @@ const MlThreeSplatLayer = (props: MlThreeSplatLayerProps) => { const { url, position, - mapPosition, - altitude, - rotation, - scale, - enableTransformControls, - transformMode, - onTransformChange, + transform, init, onDone, } = props; @@ -52,8 +43,8 @@ const MlThreeSplatLayer = (props: MlThreeSplatLayerProps) => { initRef.current = init; onDoneRef.current = onDone; - const transformRef = useRef({ position, mapPosition, altitude, rotation, scale }); - transformRef.current = { position, mapPosition, altitude, rotation, scale }; + const transformRef = useRef({ position, transform }); + transformRef.current = { position, transform }; const worldMatrixInvRef = useRef(worldMatrixInv); worldMatrixInvRef.current = worldMatrixInv; @@ -67,24 +58,29 @@ const MlThreeSplatLayer = (props: MlThreeSplatLayerProps) => { const extension = url.split('.').pop()?.toLowerCase(); const onLoad = (object: THREE.Object3D) => { - const { position, mapPosition, altitude, rotation, scale } = transformRef.current; + const { position, transform } = transformRef.current; const worldMatrixInv = worldMatrixInvRef.current; - if (mapPosition && worldMatrixInv) { - const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, mapPosition, altitude); + if (position && worldMatrixInv) { + const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, position, 0); object.position.set(scenePos.x, scenePos.y, scenePos.z); - } else if (position) { - object.position.set(position.x, position.y, position.z); + + // Apply local position offset if provided + if (transform?.position) { + object.position.x += transform.position.x; + object.position.y += transform.position.y; + object.position.z += transform.position.z; + } } - if (rotation) { - object.rotation.set(rotation.x, rotation.y, rotation.z); + if (transform?.rotation) { + object.rotation.set(transform.rotation.x, transform.rotation.y, transform.rotation.z); } - if (scale) { - if (typeof scale === 'number') { - object.scale.set(scale, scale, scale); + if (transform?.scale) { + if (typeof transform.scale === 'number') { + object.scale.set(transform.scale, transform.scale, transform.scale); } else { - object.scale.set(scale.x, scale.y, scale.z); + object.scale.set(transform.scale.x, transform.scale.y, transform.scale.z); } } object.updateMatrixWorld(true); @@ -126,32 +122,31 @@ const MlThreeSplatLayer = (props: MlThreeSplatLayerProps) => { useEffect(() => { if (!model) return; - // Handle position: mapPosition takes precedence over position - if (mapPosition && worldMatrixInv) { - const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, mapPosition, altitude); + if (position && worldMatrixInv) { + const scenePos = ThreejsUtils.toScenePosition(worldMatrixInv, position, 0); model.position.set(scenePos.x, scenePos.y, scenePos.z); - } else if (position) { - model.position.set(position.x, position.y, position.z); + + // Apply local position offset if provided + if (transform?.position) { + model.position.x += transform.position.x; + model.position.y += transform.position.y; + model.position.z += transform.position.z; + } } - if (rotation) { - model.rotation.set(rotation.x, rotation.y, rotation.z); + if (transform?.rotation) { + model.rotation.set(transform.rotation.x, transform.rotation.y, transform.rotation.z); } - if (scale) { - if (typeof scale === 'number') { - model.scale.set(scale, scale, scale); + if (transform?.scale) { + if (typeof transform.scale === 'number') { + model.scale.set(transform.scale, transform.scale, transform.scale); } else { - model.scale.set(scale.x, scale.y, scale.z); + model.scale.set(transform.scale.x, transform.scale.y, transform.scale.z); } } model.updateMatrixWorld(true); - }, [model, position, mapPosition, altitude, rotation, scale, worldMatrixInv]); + }, [model, position, transform, worldMatrixInv]); - if (enableTransformControls && model) { - return ( - - ); - } return null; }; diff --git a/packages/three/src/components/ThreeObjectControls.tsx b/packages/three/src/components/ThreeObjectControls.tsx index aa653e1c..785b9fcd 100644 --- a/packages/three/src/components/ThreeObjectControls.tsx +++ b/packages/three/src/components/ThreeObjectControls.tsx @@ -11,12 +11,8 @@ export interface ThreeObjectControlsProps { setScale: (scale: number) => void; rotation: { x: number; y: number; z: number }; setRotation: (rotation: { x: number; y: number; z: number }) => void; - useMapCoords: boolean; - setUseMapCoords: (use: boolean) => void; mapPosition: { lng: number; lat: number }; setMapPosition: (position: { lng: number; lat: number }) => void; - altitude: number; - setAltitude: (altitude: number) => void; position: { x: number; y: number; z: number }; setPosition: (position: { x: number; y: number; z: number }) => void; enableTransformControls?: boolean; @@ -33,12 +29,8 @@ export const ThreeObjectControls = ({ setScale, rotation, setRotation, - useMapCoords, - setUseMapCoords, mapPosition, setMapPosition, - altitude, - setAltitude, position, setPosition, enableTransformControls, @@ -58,14 +50,6 @@ export const ThreeObjectControls = ({ > {showLayer ? 'Hide' : 'Show'} {layerName} - {setEnableTransformControls && ( - {setEnableTransformControls && ( + - )} - - - {setTransformMode && enableTransformControls && ( - - - + {setEnableTransformControls && ( - - + )} - )} - Scale: {scale.toFixed(2)} - setScale(newValue as number)} - min={0.01} - max={150} - step={0.01} - valueLabelDisplay="auto" - /> - Rotation X: {rotation.x}° - setRotation({ ...rotation, x: newValue as number })} - min={0} - max={360} - valueLabelDisplay="auto" - /> - Rotation Y: {rotation.y}° - setRotation({ ...rotation, y: newValue as number })} - min={0} - max={360} - valueLabelDisplay="auto" - /> - Rotation Z: {rotation.z}° - setRotation({ ...rotation, z: newValue as number })} - min={0} - max={360} - valueLabelDisplay="auto" - /> - Longitude: {mapPosition.lng.toFixed(6)} - setMapPosition({ ...mapPosition, lng: newValue as number })} - min={7.09} - max={7.11} - step={0.0001} - valueLabelDisplay="auto" - /> - Latitude: {mapPosition.lat.toFixed(6)} - setMapPosition({ ...mapPosition, lat: newValue as number })} - min={50.73} - max={50.74} - step={0.0001} - valueLabelDisplay="auto" - /> - Position X: {position.x} - setPosition({ ...position, x: newValue as number })} - min={-100} - max={100} - valueLabelDisplay="auto" - /> - Position Y: {position.y} - setPosition({ ...position, y: newValue as number })} - min={-100} - max={100} - valueLabelDisplay="auto" - /> - Position Z: {position.z} - setPosition({ ...position, z: newValue as number })} - min={-500} - max={100} - valueLabelDisplay="auto" - /> - + + {setTransformMode && enableTransformControls && ( + + + + + + + + )} + Scale: {scale.toFixed(2)} + setScale(newValue as number)} + min={0.01} + max={150} + step={0.01} + valueLabelDisplay="auto" + /> + Rotation X: {rotation.x}° + setRotation({ ...rotation, x: newValue as number })} + min={0} + max={360} + valueLabelDisplay="auto" + /> + Rotation Y: {rotation.y}° + setRotation({ ...rotation, y: newValue as number })} + min={0} + max={360} + valueLabelDisplay="auto" + /> + Rotation Z: {rotation.z}° + setRotation({ ...rotation, z: newValue as number })} + min={0} + max={360} + valueLabelDisplay="auto" + /> + Longitude: {mapPosition.lng.toFixed(6)} + setMapPosition({ ...mapPosition, lng: newValue as number })} + min={7.09} + max={7.11} + step={0.0001} + valueLabelDisplay="auto" + /> + Latitude: {mapPosition.lat.toFixed(6)} + setMapPosition({ ...mapPosition, lat: newValue as number })} + min={50.73} + max={50.74} + step={0.0001} + valueLabelDisplay="auto" + /> + Position X: {position.x} + setPosition({ ...position, x: newValue as number })} + min={-100} + max={100} + valueLabelDisplay="auto" + /> + Position Y: {position.y} + setPosition({ ...position, y: newValue as number })} + min={-100} + max={100} + valueLabelDisplay="auto" + /> + Position Z: {position.z} + setPosition({ ...position, z: newValue as number })} + min={-500} + max={100} + valueLabelDisplay="auto" + /> + ); }; diff --git a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.tsx b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.tsx index 35f779e2..caf06cb3 100644 --- a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.tsx +++ b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.tsx @@ -14,25 +14,21 @@ export type MlThreeSplatLayerProps = Omit & { }; const MlThreeSplatLayer = (props: MlThreeSplatLayerProps) => { - const { - url, - position, - transform, - init, - onDone, - customLoaders, - } = props; + const { url, position, transform, init, onDone, customLoaders } = props; - const loaders = useMemo>(() => ({ - splat: (url, onLoad) => { - const loader = new SplatLoader(); - loader.load(url, (splatMesh) => onLoad(splatMesh)); - }, - ply: (url, onLoad) => { - const loader = new PlySplatLoader(); - loader.load(url, (splatMesh) => onLoad(splatMesh)); - }, - }), []); + const loaders = useMemo>( + () => ({ + splat: (url, onLoad) => { + const loader = new SplatLoader(); + loader.load(url, (splatMesh) => onLoad(splatMesh)); + }, + ply: (url, onLoad) => { + const loader = new PlySplatLoader(); + loader.load(url, (splatMesh) => onLoad(splatMesh)); + }, + }), + [] + ); useThreeModel({ url, diff --git a/packages/three/src/hooks/useThreeModel.tsx b/packages/three/src/hooks/useThreeModel.tsx index 834852c6..be1e6656 100644 --- a/packages/three/src/hooks/useThreeModel.tsx +++ b/packages/three/src/hooks/useThreeModel.tsx @@ -29,7 +29,7 @@ const disposeObject = (obj: THREE.Object3D): void => { if ((obj as any).geometry) { (obj as any).geometry.dispose(); } - + if ((obj as any).material) { const material = (obj as any).material; if (Array.isArray(material)) { @@ -38,7 +38,7 @@ const disposeObject = (obj: THREE.Object3D): void => { material.dispose(); } } - + if ('dispose' in obj && typeof (obj as any).dispose === 'function') { (obj as any).dispose(); } @@ -63,21 +63,14 @@ export const useThreeModel = (props: UseThreeModelProps) => { const worldMatrixInvRef = useRef(worldMatrixInv); worldMatrixInvRef.current = worldMatrixInv; - const allLoaders = useMemo( - () => ({ ...loaders, ...customLoaders }), - [loaders, customLoaders] - ); + const allLoaders = useMemo(() => ({ ...loaders, ...customLoaders }), [loaders, customLoaders]); const updateModelTransform = useCallback( (object: THREE.Object3D, currentWorldMatrixInv: THREE.Matrix4 | undefined) => { const { position: currentPosition, transform: currentTransform } = transformRef.current; if (currentPosition && currentWorldMatrixInv) { - const scenePos = ThreejsUtils.toScenePosition( - currentWorldMatrixInv, - currentPosition, - 0 - ); + const scenePos = ThreejsUtils.toScenePosition(currentWorldMatrixInv, currentPosition, 0); object.position.set(scenePos.x, scenePos.y, scenePos.z); if (currentTransform?.position) { @@ -97,11 +90,7 @@ export const useThreeModel = (props: UseThreeModelProps) => { if (currentTransform?.scale) { if (typeof currentTransform.scale === 'number') { - object.scale.set( - currentTransform.scale, - currentTransform.scale, - currentTransform.scale - ); + object.scale.set(currentTransform.scale, currentTransform.scale, currentTransform.scale); } else { object.scale.set( currentTransform.scale.x, From 9bbccfee27bbbc77420e29076e694b0f9d6ded89 Mon Sep 17 00:00:00 2001 From: Max Tobias Weber Date: Fri, 9 Jan 2026 14:04:28 +0100 Subject: [PATCH 7/7] fix imports for cypress tests --- .../components/MlThreeModelLayer/MlThreeModelLayer.cy.tsx | 5 ++--- .../components/MlThreeSplatLayer/MlThreeSplatLayer.cy.tsx | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.cy.tsx b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.cy.tsx index 6fe9fb52..52e5ab58 100644 --- a/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.cy.tsx +++ b/packages/three/src/components/MlThreeModelLayer/MlThreeModelLayer.cy.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { MapComponentsProvider, MapLibreMap, useMap } from '@mapcomponents/react-maplibre'; -import { ThreeProvider } from '../ThreeProvider'; +import { ThreeProvider } from '../../contexts/ThreeProvider'; import MlThreeModelLayer from './MlThreeModelLayer'; const MapExposer = () => { @@ -20,8 +20,7 @@ const TestComponent = ({ onDone }: { onDone: () => void }) => { diff --git a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.cy.tsx b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.cy.tsx index c96cb275..8b1b02c7 100644 --- a/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.cy.tsx +++ b/packages/three/src/components/MlThreeSplatLayer/MlThreeSplatLayer.cy.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import { MapComponentsProvider, MapLibreMap, useMap } from '@mapcomponents/react-maplibre'; -import { ThreeProvider } from '../ThreeProvider'; +import { ThreeProvider } from '../../contexts/ThreeProvider'; import MlThreeSplatLayer from './MlThreeSplatLayer'; const MapExposer = () => { @@ -20,8 +20,7 @@ const TestComponent = ({ onDone }: { onDone: () => void }) => {