Skip to content

Commit

Permalink
Merge pull request #67 from readyplayerme/fix/ACT-384
Browse files Browse the repository at this point in the history
fix(scene): persist rotation across model changes
  • Loading branch information
davidkarolyi committed Jan 25, 2024
2 parents 621c348 + 9f6dcb0 commit b1fd881
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 16 deletions.
7 changes: 5 additions & 2 deletions src/components/Models/Model/Model.component.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { FC, Ref, useEffect, useState, useCallback, useMemo } from 'react';
import { Group, Mesh } from 'three';
import { normaliseMaterialsConfig, triggerCallback } from 'src/services';
import { normaliseMaterialsConfig, triggerCallback, usePersistantRotation } from 'src/services';
import { useGraph, useThree } from '@react-three/fiber';
import { hasWindow } from 'src/services/Client.service';
import { BaseModelProps } from 'src/types';
Expand Down Expand Up @@ -32,6 +32,9 @@ export const Model: FC<ModelProps> = ({ scene, scale = 1, modelRef, onLoaded, on
}
setIsTouching(false);
};

usePersistantRotation(scene);

const onTouchMove = useCallback(
(event: MouseEvent | TouchEvent) => {
if (isTouching && event instanceof MouseEvent) {
Expand All @@ -47,7 +50,7 @@ export const Model: FC<ModelProps> = ({ scene, scale = 1, modelRef, onLoaded, on
setTouchEvent(event);
}
},
[isTouching, touchEvent]
[isTouching, touchEvent, scene]
);

normaliseMaterialsConfig(materials, bloom);
Expand Down
31 changes: 17 additions & 14 deletions src/services/Models.service.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import {
Euler,
Vector3,
BufferGeometry,
Skeleton
Skeleton,
Group
} from 'three';
import { useFrame } from '@react-three/fiber';
import type { ObjectMap, SkinnedMeshProps } from '@react-three/fiber';
Expand Down Expand Up @@ -214,29 +215,31 @@ const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/1.5.5/');
loader.setDRACOLoader(dracoLoader);

export const useGltfLoader = (source: Blob | string): GLTF => {
const gltfRef = useRef<GLTF>();
return suspend(
export const useGltfLoader = (source: Blob | string): GLTF =>
suspend(
async () => {
if (source instanceof Blob) {
const buffer = await source.arrayBuffer();
return (await loader.parseAsync(buffer, '')) as unknown as GLTF;
}

const gltf = await loader.loadAsync(source);

if (gltfRef.current) {
gltf.scene.rotation.y = gltfRef.current.scene.rotation.y;
}

gltfRef.current = gltf;

return gltf;
return loader.loadAsync(source);
},
[source],
{ lifespan: 100 }
);
};

export function usePersistantRotation(scene: Group) {
const refToPreviousScene = useRef(scene);

useEffect(() => {
if (refToPreviousScene.current !== scene) {
// eslint-disable-next-line no-param-reassign
scene.rotation.y = refToPreviousScene.current.rotation.y;
refToPreviousScene.current = scene;
}
}, [scene]);
}

export class Transform {
constructor() {
Expand Down

0 comments on commit b1fd881

Please sign in to comment.