Skip to content

Commit

Permalink
fix(react-components): fixed camera not setting to fit to model when …
Browse files Browse the repository at this point in the history
…no camera setting in scene configuration (#4937)

* fixed camera not setting to fit to model when scene configuration do not have camera position and rotation

* bumped the version
  • Loading branch information
pramod-cog authored Dec 6, 2024
1 parent cb289e9 commit b1ee799
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 22 deletions.
2 changes: 1 addition & 1 deletion react-components/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cognite/reveal-react-components",
"version": "0.73.6",
"version": "0.73.7",
"exports": {
".": {
"import": "./dist/index.js",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ export const ResetCameraButton = ({
if (viewer.get360ImageCollections() !== undefined) {
viewer.exit360Image();
}
if (sceneExternalId !== undefined && sceneSpaceId !== undefined) {
if (
sceneExternalId !== undefined &&
sceneSpaceId !== undefined &&
resetToDefaultSceneCamera !== undefined
) {
resetToDefaultSceneCamera.fitCameraToSceneDefault();
return;
}
Expand Down
1 change: 1 addition & 0 deletions react-components/src/hooks/scenes/useSceneConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export const useSceneConfig = (
};
return scene;
},
enabled: sceneExternalId !== undefined && sceneSpace !== undefined,
staleTime: Infinity
});
};
Expand Down
30 changes: 13 additions & 17 deletions react-components/src/hooks/useSceneDefaultCamera.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,26 @@ import { Vector3, Quaternion, Euler, MathUtils, Matrix4 } from 'three';
import { CDF_TO_VIEWER_TRANSFORMATION } from '@cognite/reveal';
import { type SceneConfiguration } from '../components/SceneContainer/sceneTypes';
import { useReveal } from '../components/RevealCanvas/ViewerContext';
import { use3dModels } from './use3dModels';

export const useSceneDefaultCamera = (
sceneExternalId: string | undefined,
sceneSpaceId: string | undefined
): { fitCameraToSceneDefault: () => void; isFetched: boolean } => {
const { data } = useSceneConfig(sceneExternalId, sceneSpaceId);
): { fitCameraToSceneDefault: () => void } | undefined => {
const { data, isFetched } = useSceneConfig(sceneExternalId, sceneSpaceId);
const viewer = useReveal();
const models = use3dModels();

return useMemo(() => {
if (data === null) {
return {
fitCameraToSceneDefault: () => {
viewer.fitCameraToModels(viewer.models);
},
isFetched: true
viewer.fitCameraToModels(models, 0, true);
}
};
}
if (data === undefined) {
return {
fitCameraToSceneDefault: () => {},
isFetched: false
};
if (data === undefined || !isFetched) {
return undefined;
}

const cameraNotSet =
Expand All @@ -47,17 +45,16 @@ export const useSceneDefaultCamera = (
if (cameraNotSet) {
return {
fitCameraToSceneDefault: () => {
if (viewer.models.length === 0) {
if (models.length === 0) {
// If no models are loaded, set a default camera position
// This is the same default position that have been used in SceneBuilder
const position = new Vector3(-100, 200, 400);
const target = new Vector3();
viewer.cameraManager.setCameraState({ position, target });
} else {
viewer.fitCameraToModels(viewer.models);
viewer.fitCameraToModels(models, 0, true);
}
},
isFetched: false
}
};
}

Expand Down Expand Up @@ -89,10 +86,9 @@ export const useSceneDefaultCamera = (
const quaternion = getLookAtRotation(position, target);
viewer.cameraManager.setCameraState({ position, rotation: quaternion });
}
},
isFetched: true
}
};
}, [viewer, data?.sceneConfiguration]);
}, [viewer, data, isFetched, models]);
};

function extractCameraTarget(scene: SceneConfiguration): Vector3 {
Expand Down
9 changes: 6 additions & 3 deletions react-components/stories/SceneContainer.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,13 @@ const SceneContainerStoryContent = ({
defaultResourceStyling
}: SceneContainerStoryContentProps): ReactElement => {
const reveal = useReveal();
const { fitCameraToSceneDefault } = useSceneDefaultCamera(sceneExternalId, sceneSpaceId);
const cameraToSceneDefault = useSceneDefaultCamera(sceneExternalId, sceneSpaceId);
useEffect(() => {
fitCameraToSceneDefault();
}, [reveal, fitCameraToSceneDefault]);
if (cameraToSceneDefault === undefined) {
return;
}
cameraToSceneDefault.fitCameraToSceneDefault();
}, [reveal, cameraToSceneDefault]);
return (
<>
<SceneContainer
Expand Down

0 comments on commit b1ee799

Please sign in to comment.