@threlte/rapier 0.5.0 → 1.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +12 -0
- package/dist/components/Attractor/Attractor.svelte +17 -13
- package/dist/components/Attractor/Attractor.svelte.d.ts +20 -22
- package/dist/components/Colliders/AutoColliders.svelte +52 -50
- package/dist/components/Colliders/AutoColliders.svelte.d.ts +80 -0
- package/dist/components/Colliders/Collider.svelte +40 -30
- package/dist/components/Colliders/Collider.svelte.d.ts +110 -112
- package/dist/components/CollisionGroups/CollisionGroups.svelte +1 -20
- package/dist/components/CollisionGroups/CollisionGroups.svelte.d.ts +29 -19
- package/dist/components/Debug/Debug.svelte +13 -10
- package/dist/components/Debug/Debug.svelte.d.ts +6 -60
- package/dist/components/RigidBody/RigidBody.svelte +23 -58
- package/dist/components/RigidBody/RigidBody.svelte.d.ts +94 -67
- package/dist/components/World/InnerWorld.svelte +11 -7
- package/dist/components/World/InnerWorld.svelte.d.ts +15 -15
- package/dist/components/World/World.svelte +13 -2
- package/dist/components/World/World.svelte.d.ts +36 -32
- package/dist/hooks/useFixedJoint.d.ts +2 -2
- package/dist/hooks/useFixedJoint.js +6 -3
- package/dist/hooks/useFrameHandler.d.ts +1 -1
- package/dist/hooks/useFrameHandler.js +9 -8
- package/dist/hooks/usePrismaticJoint.d.ts +2 -2
- package/dist/hooks/usePrismaticJoint.js +5 -2
- package/dist/hooks/useRevoluteJoint.d.ts +2 -2
- package/dist/hooks/useRevoluteJoint.js +5 -2
- package/dist/hooks/useSphericalJoint.d.ts +2 -2
- package/dist/hooks/useSphericalJoint.js +4 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -0
- package/dist/lib/applyTransforms.d.ts +2 -3
- package/dist/lib/applyTransforms.js +7 -16
- package/dist/lib/computeBitMask.d.ts +5 -0
- package/dist/lib/computeBitMask.js +20 -0
- package/dist/lib/createRapierContext.d.ts +3 -0
- package/dist/lib/createRapierContext.js +10 -1
- package/dist/lib/eulerToQuaternion.d.ts +7 -0
- package/dist/lib/eulerToQuaternion.js +12 -0
- package/dist/lib/scaleColliderArgs.js +3 -3
- package/dist/recipes/BasicPlayerController.svelte +28 -27
- package/dist/recipes/BasicPlayerController.svelte.d.ts +2 -5
- package/dist/types/components.d.ts +1 -88
- package/dist/types/types.d.ts +5 -5
- package/package.json +10 -9
- package/dist/components/Joints/RevoluteJoint.svelte +0 -5
- package/dist/components/Joints/RevoluteJoint.svelte.d.ts +0 -23
- package/dist/lib/positionToVector3.d.ts +0 -3
- package/dist/lib/positionToVector3.js +0 -8
- package/dist/lib/rotationToEuler.d.ts +0 -3
- package/dist/lib/rotationToEuler.js +0 -8
- package/dist/lib/rotationToQuaternion.d.ts +0 -3
- package/dist/lib/rotationToQuaternion.js +0 -10
- package/dist/lib/scaleToVector3.d.ts +0 -3
- package/dist/lib/scaleToVector3.js +0 -16
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @threlte/extras
|
|
2
2
|
|
|
3
|
+
## 1.0.0-next.1
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 4b67b473: Removed transform properties on rapier components Collider, AutoColliders and RigidBody
|
|
8
|
+
|
|
9
|
+
## 1.0.0-next.0
|
|
10
|
+
|
|
11
|
+
### Major Changes
|
|
12
|
+
|
|
13
|
+
- d41cb6cf: Adapted rapier package to Threlte v6 syntax
|
|
14
|
+
|
|
3
15
|
## 0.5.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
<script>import {
|
|
2
|
-
import {
|
|
1
|
+
<script>import { T, useFrame } from '@threlte/core';
|
|
2
|
+
import { Group, Vector3 } from 'three';
|
|
3
3
|
import { useRapier } from '../../hooks/useRapier';
|
|
4
|
-
export let position = undefined;
|
|
5
4
|
export let strength = 1;
|
|
6
5
|
export let range = 50;
|
|
7
6
|
export let gravityType = 'static';
|
|
8
7
|
export let gravitationalConstant = 6.673e-11;
|
|
9
8
|
const { world, debug } = useRapier();
|
|
10
9
|
const gravitySource = new Vector3();
|
|
11
|
-
let obj = new
|
|
10
|
+
let obj = new Group();
|
|
12
11
|
const calcForceByType = {
|
|
13
12
|
static: (s, m2, r, d, G) => s,
|
|
14
13
|
linear: (s, m2, r, d, G) => s * (d / r),
|
|
@@ -35,16 +34,21 @@ useFrame(() => {
|
|
|
35
34
|
});
|
|
36
35
|
</script>
|
|
37
36
|
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
-
{
|
|
37
|
+
<T
|
|
38
|
+
let:ref
|
|
39
|
+
is={obj}
|
|
40
|
+
{...$$restProps}
|
|
41
41
|
>
|
|
42
|
-
<slot />
|
|
42
|
+
<slot {ref} />
|
|
43
43
|
|
|
44
44
|
{#if $debug}
|
|
45
|
-
<Mesh
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
<T.Mesh>
|
|
46
|
+
<T.SphereGeometry args={[range]} />
|
|
47
|
+
<T.MeshBasicMaterial
|
|
48
|
+
wireframe
|
|
49
|
+
transparent
|
|
50
|
+
opacity={0.25}
|
|
51
|
+
/>
|
|
52
|
+
</T.Mesh>
|
|
49
53
|
{/if}
|
|
50
|
-
</
|
|
54
|
+
</T>
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
import { SvelteComponentTyped } from
|
|
2
|
-
import type { AttractorProperties } from '../../types/components'
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
events: {
|
|
12
|
-
[evt: string]: CustomEvent<any>;
|
|
13
|
-
};
|
|
14
|
-
slots: {
|
|
15
|
-
default: {};
|
|
16
|
-
};
|
|
17
|
-
};
|
|
18
|
-
export declare type AttractorProps = typeof __propDef.props;
|
|
19
|
-
export declare type AttractorEvents = typeof __propDef.events;
|
|
20
|
-
export declare type AttractorSlots = typeof __propDef.slots;
|
|
21
|
-
export default class Attractor extends SvelteComponentTyped<AttractorProps, AttractorEvents, AttractorSlots> {
|
|
1
|
+
import { SvelteComponentTyped } from 'svelte'
|
|
2
|
+
import type { AttractorProperties } from '../../types/components'
|
|
3
|
+
import { Props, type Events, type Slots } from '@threlte/core'
|
|
4
|
+
import type { Group } from 'three'
|
|
5
|
+
|
|
6
|
+
type AttractorProps = Props<Group> & {
|
|
7
|
+
strength?: NonNullable<AttractorProperties['strength']>
|
|
8
|
+
range?: NonNullable<AttractorProperties['range']>
|
|
9
|
+
gravityType?: NonNullable<AttractorProperties['gravityType']>
|
|
10
|
+
gravitationalConstant?: NonNullable<AttractorProperties['gravitationalConstant']>
|
|
22
11
|
}
|
|
23
|
-
|
|
12
|
+
|
|
13
|
+
type AttractorEvents = Events<Group>
|
|
14
|
+
|
|
15
|
+
type AttractorSlots = Slots<Group>
|
|
16
|
+
|
|
17
|
+
export default class Attractor extends SvelteComponentTyped<
|
|
18
|
+
AttractorProps,
|
|
19
|
+
AttractorEvents,
|
|
20
|
+
AttractorSlots
|
|
21
|
+
> {}
|
|
@@ -1,21 +1,15 @@
|
|
|
1
|
-
<script>import { ActiveCollisionTypes,
|
|
2
|
-
import { SceneGraphObject } from '@threlte/core';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
<script>import { ActiveCollisionTypes, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import { createRawEventDispatcher, SceneGraphObject } from '@threlte/core';
|
|
3
|
+
import { onDestroy, onMount } from 'svelte';
|
|
4
|
+
import { Group } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
6
6
|
import { useHasEventListeners } from '../../hooks/useHasEventListener';
|
|
7
7
|
import { useRapier } from '../../hooks/useRapier';
|
|
8
8
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
9
9
|
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
10
|
-
import { applyTransforms } from '../../lib/applyTransforms';
|
|
11
10
|
import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
|
|
12
|
-
import {
|
|
13
|
-
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
11
|
+
import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
|
|
14
12
|
export let shape = 'convexHull';
|
|
15
|
-
export let position = undefined;
|
|
16
|
-
export let rotation = undefined;
|
|
17
|
-
export let scale = undefined;
|
|
18
|
-
export let lookAt = undefined;
|
|
19
13
|
export let restitution = undefined;
|
|
20
14
|
export let restitutionCombineRule = undefined;
|
|
21
15
|
export let friction = undefined;
|
|
@@ -24,56 +18,64 @@ export let sensor = undefined;
|
|
|
24
18
|
export let contactForceEventThreshold = undefined;
|
|
25
19
|
export let density = undefined;
|
|
26
20
|
export let mass = undefined;
|
|
27
|
-
export let
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
*/
|
|
32
|
-
applyTransforms(object, position, rotation, scale, lookAt);
|
|
33
|
-
object.updateWorldMatrix(true, false);
|
|
21
|
+
export let centerOfMass = undefined;
|
|
22
|
+
export let principalAngularInertia = undefined;
|
|
23
|
+
export let angularInertiaLocalFrame = undefined;
|
|
24
|
+
const group = new Group();
|
|
34
25
|
const rigidBody = useRigidBody();
|
|
35
26
|
const { world, addColliderToContext, removeColliderFromContext } = useRapier();
|
|
36
27
|
export let colliders = [];
|
|
37
28
|
const collisionGroups = useCollisionGroups();
|
|
38
|
-
const dispatcher =
|
|
29
|
+
const dispatcher = createRawEventDispatcher();
|
|
39
30
|
const { hasEventListeners: colliderHasEventListeners } = useHasEventListeners();
|
|
40
|
-
|
|
41
|
-
colliders = createCollidersFromChildren(object, shape ?? 'convexHull', world, rigidBody);
|
|
42
|
-
colliders.forEach((c) => addColliderToContext(c, object, dispatcher));
|
|
43
|
-
collisionGroups.registerColliders(colliders);
|
|
44
|
-
});
|
|
45
|
-
$: {
|
|
46
|
-
if (colliders.length > 0) {
|
|
47
|
-
colliders.forEach((collider) => {
|
|
48
|
-
applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
|
|
49
|
-
collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
|
|
50
|
-
collider.setRestitution(restitution ?? 0);
|
|
51
|
-
collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
|
|
52
|
-
collider.setFriction(friction ?? 0.7);
|
|
53
|
-
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
54
|
-
collider.setSensor(sensor ?? false);
|
|
55
|
-
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
56
|
-
if (density)
|
|
57
|
-
collider.setDensity(density);
|
|
58
|
-
if (mass)
|
|
59
|
-
collider.setMass(mass);
|
|
60
|
-
if (massProperties)
|
|
61
|
-
collider.setMassProperties(massProperties.mass, positionToVector3(massProperties.centerOfMass), positionToVector3(massProperties.principalAngularInertia), rotationToQuaternion(massProperties.angularInertiaLocalFrame));
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Cleanup
|
|
67
|
-
*/
|
|
68
|
-
onDestroy(() => {
|
|
31
|
+
const cleanup = () => {
|
|
69
32
|
collisionGroups.removeColliders(colliders);
|
|
70
33
|
colliders.forEach((c) => {
|
|
71
34
|
removeColliderFromContext(c);
|
|
72
35
|
world.removeCollider(c, true);
|
|
73
36
|
});
|
|
37
|
+
colliders.length = 0;
|
|
38
|
+
};
|
|
39
|
+
export const create = () => {
|
|
40
|
+
cleanup();
|
|
41
|
+
colliders = createCollidersFromChildren(group, shape ?? 'convexHull', world, rigidBody);
|
|
42
|
+
colliders.forEach((c) => addColliderToContext(c, group, dispatcher));
|
|
43
|
+
collisionGroups.registerColliders(colliders);
|
|
44
|
+
colliders.forEach((collider) => {
|
|
45
|
+
applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
|
|
46
|
+
collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
|
|
47
|
+
collider.setRestitution(restitution ?? 0);
|
|
48
|
+
collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
|
|
49
|
+
collider.setFriction(friction ?? 0.7);
|
|
50
|
+
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
51
|
+
collider.setSensor(sensor ?? false);
|
|
52
|
+
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
53
|
+
if (density)
|
|
54
|
+
collider.setDensity(density);
|
|
55
|
+
if (mass) {
|
|
56
|
+
if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame)
|
|
57
|
+
collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
|
|
58
|
+
x: principalAngularInertia[0],
|
|
59
|
+
y: principalAngularInertia[1],
|
|
60
|
+
z: principalAngularInertia[2]
|
|
61
|
+
}, eulerToQuaternion(angularInertiaLocalFrame));
|
|
62
|
+
else
|
|
63
|
+
collider.setMass(mass);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
onMount(() => {
|
|
68
|
+
create();
|
|
74
69
|
});
|
|
70
|
+
export const refresh = () => {
|
|
71
|
+
create();
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Cleanup
|
|
75
|
+
*/
|
|
76
|
+
onDestroy(cleanup);
|
|
75
77
|
</script>
|
|
76
78
|
|
|
77
|
-
<SceneGraphObject {
|
|
78
|
-
<slot />
|
|
79
|
+
<SceneGraphObject object={group}>
|
|
80
|
+
<slot {colliders} {refresh} />
|
|
79
81
|
</SceneGraphObject>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { CoefficientCombineRule, Collider } from '@dimforge/rapier3d-compat'
|
|
2
|
+
import { SvelteComponentTyped } from 'svelte'
|
|
3
|
+
import type { Euler, Vector3 } from 'three'
|
|
4
|
+
import type { AutoCollidersShapes, ColliderEventMap } from '../../types/types'
|
|
5
|
+
|
|
6
|
+
// ------------------ BASE ------------------
|
|
7
|
+
|
|
8
|
+
type BaseProps = {
|
|
9
|
+
shape?: AutoCollidersShapes
|
|
10
|
+
restitution?: number
|
|
11
|
+
restitutionCombineRule?: CoefficientCombineRule
|
|
12
|
+
friction?: number
|
|
13
|
+
frictionCombineRule?: CoefficientCombineRule
|
|
14
|
+
sensor?: boolean
|
|
15
|
+
colliders?: Collider[]
|
|
16
|
+
contactForceEventThreshold?: number
|
|
17
|
+
refresh?: () => void
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ------------------ MASS ------------------
|
|
21
|
+
|
|
22
|
+
type Density = {
|
|
23
|
+
density: number
|
|
24
|
+
|
|
25
|
+
mass?: never
|
|
26
|
+
centerOfMass?: never
|
|
27
|
+
principalAngularInertia?: never
|
|
28
|
+
angularInertiaLocalFrame?: never
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Mass = {
|
|
32
|
+
mass: number
|
|
33
|
+
density?: never
|
|
34
|
+
centerOfMass?: never
|
|
35
|
+
principalAngularInertia?: never
|
|
36
|
+
angularInertiaLocalFrame?: never
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type MassProperties = {
|
|
40
|
+
mass: number
|
|
41
|
+
centerOfMass: Parameters<Vector3['set']>
|
|
42
|
+
principalAngularInertia: Parameters<Vector3['set']>
|
|
43
|
+
angularInertiaLocalFrame: Parameters<Euler['set']>
|
|
44
|
+
density?: never
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
type NoMassProperties = {
|
|
48
|
+
density?: never
|
|
49
|
+
mass?: never
|
|
50
|
+
centerOfMass?: never
|
|
51
|
+
principalAngularInertia?: never
|
|
52
|
+
angularInertiaLocalFrame?: never
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type MassDef = Density | Mass | MassProperties | NoMassProperties
|
|
56
|
+
|
|
57
|
+
type MassProps<TMassDef extends MassDef> = TMassDef extends Density
|
|
58
|
+
? Density
|
|
59
|
+
: TMassDef extends MassProperties
|
|
60
|
+
? MassProperties
|
|
61
|
+
: TMassDef extends Mass
|
|
62
|
+
? Mass
|
|
63
|
+
: NoMassProperties
|
|
64
|
+
|
|
65
|
+
// ------------------ COLLIDER ------------------
|
|
66
|
+
|
|
67
|
+
export type AutoCollidersProps<TMassDef extends MassDef> = BaseProps & MassProps<TMassDef>
|
|
68
|
+
|
|
69
|
+
type AutoCollidersSlots = {
|
|
70
|
+
default: {
|
|
71
|
+
colliders: Collider[]
|
|
72
|
+
refresh: () => void
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default class AutoColliders<TMassDef extends MassDef> extends SvelteComponentTyped<
|
|
77
|
+
AutoCollidersProps<TMassDef>,
|
|
78
|
+
ColliderEventMap,
|
|
79
|
+
AutoCollidersSlots
|
|
80
|
+
> {}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
<script>import { ActiveCollisionTypes,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
<script>import { ActiveCollisionTypes, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import { createRawEventDispatcher, SceneGraphObject, useFrame } from '@threlte/core';
|
|
3
|
+
import { onDestroy, onMount, tick } from 'svelte';
|
|
4
4
|
import { Object3D, Quaternion, Vector3 } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
6
6
|
import { useHasEventListeners } from '../../hooks/useHasEventListener';
|
|
7
7
|
import { useRapier } from '../../hooks/useRapier';
|
|
8
8
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
9
9
|
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
10
|
-
import {
|
|
10
|
+
import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
|
|
11
11
|
import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
|
|
12
|
-
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
13
|
-
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
14
12
|
import { scaleColliderArgs } from '../../lib/scaleColliderArgs';
|
|
15
13
|
export let shape;
|
|
16
14
|
export let args;
|
|
17
|
-
export let
|
|
18
|
-
export let rotation = undefined;
|
|
19
|
-
export let scale = undefined;
|
|
20
|
-
export let lookAt = undefined;
|
|
15
|
+
export let type = undefined;
|
|
21
16
|
export let restitution = undefined;
|
|
22
17
|
export let restitutionCombineRule = undefined;
|
|
23
18
|
export let friction = undefined;
|
|
@@ -26,20 +21,17 @@ export let sensor = undefined;
|
|
|
26
21
|
export let contactForceEventThreshold = undefined;
|
|
27
22
|
export let density = undefined;
|
|
28
23
|
export let mass = undefined;
|
|
29
|
-
export let
|
|
24
|
+
export let centerOfMass = undefined;
|
|
25
|
+
export let principalAngularInertia = undefined;
|
|
26
|
+
export let angularInertiaLocalFrame = undefined;
|
|
30
27
|
const object = new Object3D();
|
|
31
|
-
/**
|
|
32
|
-
* Immediately apply transforms
|
|
33
|
-
*/
|
|
34
|
-
applyTransforms(object, position, rotation, scale, lookAt);
|
|
35
|
-
object.updateWorldMatrix(true, false);
|
|
36
28
|
const rigidBody = useRigidBody();
|
|
37
|
-
const
|
|
29
|
+
const hasRigidBodyParent = !!rigidBody;
|
|
38
30
|
const rapierContext = useRapier();
|
|
39
31
|
const { world } = rapierContext;
|
|
40
32
|
export let collider = undefined;
|
|
41
33
|
const collisionGroups = useCollisionGroups();
|
|
42
|
-
const dispatcher =
|
|
34
|
+
const dispatcher = createRawEventDispatcher();
|
|
43
35
|
/**
|
|
44
36
|
* Actual collider setup happens onMount as only then
|
|
45
37
|
* the transforms are finished.
|
|
@@ -59,7 +51,7 @@ onMount(async () => {
|
|
|
59
51
|
* For use in conjunction with component <CollisionGroups>
|
|
60
52
|
*/
|
|
61
53
|
collisionGroups.registerColliders([collider]);
|
|
62
|
-
if (
|
|
54
|
+
if (hasRigidBodyParent) {
|
|
63
55
|
const rigidBodyWorldPos = new Vector3();
|
|
64
56
|
const rigidBodyWorldQuatInversed = new Quaternion();
|
|
65
57
|
object.traverseAncestors((child) => {
|
|
@@ -95,20 +87,41 @@ $: {
|
|
|
95
87
|
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
96
88
|
if (density)
|
|
97
89
|
collider.setDensity(density);
|
|
98
|
-
if (mass)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
90
|
+
if (mass) {
|
|
91
|
+
if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame) {
|
|
92
|
+
collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
|
|
93
|
+
x: principalAngularInertia[0],
|
|
94
|
+
y: principalAngularInertia[1],
|
|
95
|
+
z: principalAngularInertia[2]
|
|
96
|
+
}, eulerToQuaternion(angularInertiaLocalFrame));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
collider.setMass(mass);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
export const refresh = () => {
|
|
105
105
|
if (!collider)
|
|
106
106
|
return;
|
|
107
107
|
collider.setTranslation(getWorldPosition(object));
|
|
108
108
|
collider.setRotation(getWorldQuaternion(object));
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* If the Collider isAttached (i.e. NOT child of a RigidBody), update the
|
|
112
|
+
* transforms on every frame.
|
|
113
|
+
*/
|
|
114
|
+
const { start, stop } = useFrame(() => {
|
|
115
|
+
refresh();
|
|
109
116
|
}, {
|
|
110
|
-
autostart: !
|
|
117
|
+
autostart: !hasRigidBodyParent && type === 'dynamic'
|
|
111
118
|
});
|
|
119
|
+
$: {
|
|
120
|
+
if (!hasRigidBodyParent && type === 'dynamic')
|
|
121
|
+
start();
|
|
122
|
+
else
|
|
123
|
+
stop();
|
|
124
|
+
}
|
|
112
125
|
/**
|
|
113
126
|
* Cleanup
|
|
114
127
|
*/
|
|
@@ -118,13 +131,10 @@ onDestroy(() => {
|
|
|
118
131
|
rapierContext.removeColliderFromContext(collider);
|
|
119
132
|
collisionGroups.removeColliders([collider]);
|
|
120
133
|
world.removeCollider(collider, true);
|
|
134
|
+
collider = undefined;
|
|
121
135
|
});
|
|
122
136
|
</script>
|
|
123
137
|
|
|
124
138
|
<SceneGraphObject {object}>
|
|
125
|
-
<slot />
|
|
139
|
+
<slot {collider} />
|
|
126
140
|
</SceneGraphObject>
|
|
127
|
-
|
|
128
|
-
{#if !isAttached}
|
|
129
|
-
<TransformableObject {object} {position} {rotation} {scale} />
|
|
130
|
-
{/if}
|