Skip to content

Commit 12bf31f

Browse files
authored
Merge pull request #140 from musehq/dev
v2.6.5
2 parents 23f1f55 + 3a9b92d commit 12bf31f

File tree

4 files changed

+48
-24
lines changed

4 files changed

+48
-24
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "spacesvr",
3-
"version": "2.6.4",
3+
"version": "2.6.5",
44
"private": true,
55
"description": "A standardized reality for future of the 3D Web",
66
"keywords": [

src/ideas/modifiers/Collidable/components/TrimeshCollider.tsx

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import { BufferGeometry, Euler, Group, Quaternion, Vector3 } from "three";
1+
import {
2+
BufferGeometry,
3+
Euler,
4+
Group,
5+
Matrix4,
6+
Quaternion,
7+
Vector3,
8+
} from "three";
29
import { useMemo, useRef, useState } from "react";
3-
import { useLimiter } from "../../../../logic/limiter";
4-
import { useFrame } from "@react-three/fiber";
10+
import { useLimitedFrame } from "../../../../logic/limiter";
511
import { useTrimeshCollision } from "../utils/trimesh";
612

713
type TrimeshColliderProps = {
@@ -13,33 +19,51 @@ export default function TrimeshCollider(props: TrimeshColliderProps) {
1319

1420
const group = useRef<Group>(null);
1521

16-
const dummyPos = useMemo(() => new Vector3(), []);
17-
const dummyQuat = useMemo(() => new Quaternion(), []);
18-
const dummyEuler = useMemo(() => new Euler(), []);
19-
const dummyScale = useMemo(() => new Vector3(1, 1, 1), []);
20-
const [scale, setScale] = useState(new Vector3(1, 1, 1));
22+
const [pos] = useState(() => new Vector3());
23+
const [quat] = useState(() => new Quaternion());
24+
const [scale] = useState(() => new Vector3());
25+
const [euler] = useState(() => new Euler());
26+
const [curScale, setCurScale] = useState(new Vector3(1, 1, 1));
2127

2228
const geometry = useMemo(() => {
23-
const g = geo.clone().scale(scale.x, scale.y, scale.z);
29+
const g = geo.clone().scale(curScale.x, curScale.y, curScale.z);
2430
g.computeVertexNormals();
2531
return g;
26-
}, [geo, scale]);
32+
}, [geo, curScale]);
2733

2834
const [, api] = useTrimeshCollision(geometry);
2935

30-
const limiter = useLimiter(5);
31-
useFrame(({ clock }) => {
32-
if (!limiter.isReady(clock) || !group.current) return;
36+
// there's some state update that causes the api not to receive an out of sync position
37+
// i think it's whenever the api gets recreated. for now, just re-apply transforms every 2 seconds
38+
const needsUpdate = useRef(false);
39+
useLimitedFrame(1 / 2, () => {
40+
needsUpdate.current = true;
41+
});
42+
43+
const lastUpdatedMatrix = useRef<Matrix4>(new Matrix4());
44+
useLimitedFrame(8, () => {
45+
if (!group.current) return;
3346

34-
group.current.getWorldPosition(dummyPos);
35-
group.current.getWorldQuaternion(dummyQuat);
36-
group.current.getWorldScale(dummyScale);
47+
// get global position, rotation, scale
48+
group.current.updateWorldMatrix(true, false);
49+
group.current.matrixWorld.decompose(pos, quat, scale);
3750

38-
api.position.copy(dummyPos);
39-
api.rotation.copy(dummyEuler.setFromQuaternion(dummyQuat));
40-
if (!dummyScale.equals(scale)) {
41-
setScale(dummyScale.clone());
51+
// no need to update if nothing changed
52+
if (
53+
lastUpdatedMatrix.current.equals(group.current.matrixWorld) &&
54+
!needsUpdate.current
55+
) {
56+
return;
4257
}
58+
59+
// update last values
60+
lastUpdatedMatrix.current.copy(group.current.matrixWorld);
61+
needsUpdate.current = false;
62+
63+
// if a change was found, update collider
64+
api.position.copy(pos);
65+
api.rotation.copy(euler.setFromQuaternion(quat));
66+
if (!scale.equals(curScale)) setCurScale(scale.clone());
4367
});
4468

4569
return <group ref={group} />;

src/layers/Environment/ui/PauseMenu/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default function PauseMenu(props: PauseMenuProps) {
4848
const PAUSE_ITEMS: PauseItem[] = [
4949
...pauseMenuItems,
5050
{
51-
text: "v2.6.4",
51+
text: "v2.6.5",
5252
link: "https://www.npmjs.com/package/spacesvr",
5353
},
5454
...menuItems,

src/layers/Player/components/colliders/CapsuleCollider.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { Group } from "three";
55

66
// height of 0.9 (eye level) for a perceived height of 1
77
const HEIGHT = 0.9;
8-
const RADIUS = 0.2;
9-
const SEGMENTS = 10;
8+
const RADIUS = 0.225;
9+
const SEGMENTS = 8;
1010

1111
const SPHERE_SHAPE: ShapeType = "Sphere";
1212

0 commit comments

Comments
 (0)