Skip to content

Commit

Permalink
feat(environment): add new model for 3d environment props
Browse files Browse the repository at this point in the history
  • Loading branch information
Zaehiel committed Aug 21, 2023
1 parent 594ef2e commit d976aca
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import React, { FC } from 'react';
import { useFallback, useGltfLoader, CustomNode, Transform } from 'src/services';
import { useGraph } from '@react-three/fiber';
import { BaseModelProps } from 'src/types';

export interface EnvironmentModelProps extends BaseModelProps {
modelSrc: string | Blob;
scale?: number;
}

export const EnvironmentModel: FC<EnvironmentModelProps> = ({ modelSrc, scale = 1, setModelFallback }) => {
const { scene } = useGltfLoader(modelSrc);
const { nodes } = useGraph(scene);

useFallback(nodes, setModelFallback);
const transform = new Transform();

return (
<group>
{Object.keys(nodes).map((key) => {
const node = nodes[key] as CustomNode;
if (node.type === 'Mesh') {
return (
<mesh
receiveShadow
key={node.name}
scale={scale}
position={transform.position}
rotation={transform.rotation}
geometry={node.geometry}
material={node.material}
morphTargetInfluences={node.morphTargetInfluences || []}
/>
);
}

return null;
})}
</group>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import React, { FC, Suspense, useState } from 'react';
import { EnvironmentModel, EnvironmentModelProps } from './EnvironmentModel.component';

/**
* Contains model to handle suspense fallback.
*/
export const EnvironmentModelContainer: FC<EnvironmentModelProps> = (props) => {
/* eslint-disable-next-line react/jsx-no-useless-fragment */
const [fallback, setFallback] = useState<JSX.Element>(<></>);

return (
<Suspense fallback={fallback}>
<EnvironmentModel setModelFallback={setFallback} {...props} />
</Suspense>
);
};
1 change: 1 addition & 0 deletions src/components/Models/EnvironmentModel/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { EnvironmentModelContainer as EnvironmentModel } from './EnvironmentModel.container';
15 changes: 15 additions & 0 deletions src/components/Models/Model/Model.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Group, Mesh } from 'three';
import { normaliseMaterialsConfig, triggerCallback } from 'src/services';
import { useGraph } from '@react-three/fiber';
import { BaseModelProps } from 'src/types';
import { ArcballControls } from 'three-stdlib';

Check failure on line 6 in src/components/Models/Model/Model.component.tsx

View workflow job for this annotation

GitHub Actions / Linting

'ArcballControls' is defined but never used
import { Spawn } from '../../Spawn/Spawn';

interface ModelProps extends BaseModelProps {
Expand All @@ -14,6 +15,7 @@ interface ModelProps extends BaseModelProps {

export const Model: FC<ModelProps> = ({ scene, scale = 1, modelRef, onLoaded, onSpawnAnimationFinish, bloom }) => {
const { materials } = useGraph(scene);
console.log(scene);

Check warning on line 18 in src/components/Models/Model/Model.component.tsx

View workflow job for this annotation

GitHub Actions / Linting

Unexpected console statement
normaliseMaterialsConfig(materials, bloom);
scene.traverse((object) => {
const node = object;
Expand All @@ -29,6 +31,19 @@ export const Model: FC<ModelProps> = ({ scene, scale = 1, modelRef, onLoaded, on

useEffect(() => triggerCallback(onLoaded), [scene, materials, onLoaded]);

useEffect(() => {
if (scene.children.length === 1) {
document.addEventListener('mousemove', onMouseMove);

Check failure on line 36 in src/components/Models/Model/Model.component.tsx

View workflow job for this annotation

GitHub Actions / Linting

'onMouseMove' was used before it was defined
}
return () => {
document.removeEventListener('mousemove', onMouseMove);

Check failure on line 39 in src/components/Models/Model/Model.component.tsx

View workflow job for this annotation

GitHub Actions / Linting

'onMouseMove' was used before it was defined
};
});

function onMouseMove(event) {
scene.rotation.y += event.movementX * 0.005;

Check failure on line 44 in src/components/Models/Model/Model.component.tsx

View workflow job for this annotation

GitHub Actions / Linting

Assignment to property of function parameter 'scene'
}

return (
<group ref={modelRef} dispose={null} rotation={[0, 0, 0]}>
<primitive object={scene} scale={scale} />
Expand Down
1 change: 1 addition & 0 deletions src/components/Models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ export { HalfBodyModel } from './HalfBodyModel';
export { StaticModel } from './StaticModel';
export { PoseModel } from './PoseModel';
export { Model } from './Model';
export { EnvironmentModel } from './EnvironmentModel';
3 changes: 2 additions & 1 deletion src/library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { AnimationModel } from './components/Models/AnimationModel';
import { HalfBodyModel } from './components/Models/HalfBodyModel';
import { StaticModel } from './components/Models/StaticModel';
import { PoseModel } from './components/Models/PoseModel';
import { EnvironmentModel } from './components/Models/EnvironmentModel';
import { Avatar, CAMERA } from './components/Avatar';

export { Exhibit, FloatingModel, AnimationModel, HalfBodyModel, StaticModel, PoseModel, Avatar, CAMERA };
export { Exhibit, FloatingModel, EnvironmentModel, AnimationModel, HalfBodyModel, StaticModel, PoseModel, Avatar, CAMERA };

0 comments on commit d976aca

Please sign in to comment.