@threlte/rapier 0.0.3 → 0.1.0
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 +6 -0
- package/dist/components/Colliders/AutoColliders.svelte +12 -12
- package/dist/components/Colliders/Collider.svelte +19 -14
- package/dist/components/Colliders/Collider.svelte.d.ts +63 -10
- package/dist/components/Joints/RevoluteJoint.svelte +5 -0
- package/dist/components/Joints/RevoluteJoint.svelte.d.ts +23 -0
- package/dist/components/RigidBody/RigidBody.svelte +27 -18
- package/dist/components/RigidBody/RigidBody.svelte.d.ts +6 -3
- package/dist/hooks/useFixedJoint.d.ts +7 -0
- package/dist/hooks/useFixedJoint.js +10 -0
- package/dist/hooks/useJoint.d.ts +7 -0
- package/dist/hooks/useJoint.js +31 -0
- package/dist/hooks/usePrismaticJoint.d.ts +7 -0
- package/dist/hooks/usePrismaticJoint.js +13 -0
- package/dist/hooks/useRevoluteJoint.d.ts +7 -0
- package/dist/hooks/useRevoluteJoint.js +13 -0
- package/dist/hooks/useSphericalJoint.d.ts +7 -0
- package/dist/hooks/useSphericalJoint.js +11 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.js +5 -0
- package/dist/types/components.d.ts +1 -0
- package/package.json +1 -1
- package/dist/components/Colliders/AutoColliders.svelte.d.ts +0 -33
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @threlte/extras
|
|
2
2
|
|
|
3
|
+
## 0.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- c272617: Hooks added to add Joints, Collider and AutoColliders now accepts density, mass or massProperties, documentation for joints hooks added, "Basic Vehicle Controller" Recipe added.
|
|
8
|
+
|
|
3
9
|
## 0.0.3
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1,26 +1,27 @@
|
|
|
1
1
|
<script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
|
|
2
2
|
import { SceneGraphObject } from '@threlte/core';
|
|
3
3
|
import { createEventDispatcher, onDestroy, onMount } from 'svelte';
|
|
4
|
-
import { Object3D
|
|
4
|
+
import { Object3D } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
6
6
|
import { useRapier } from '../../hooks/useRapier';
|
|
7
7
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
8
8
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
9
9
|
import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
|
|
10
10
|
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
11
|
+
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
11
12
|
export let shape = 'convexHull';
|
|
12
13
|
export let position = undefined;
|
|
13
14
|
export let rotation = undefined;
|
|
14
15
|
export let scale = undefined;
|
|
15
16
|
export let lookAt = undefined;
|
|
16
|
-
export let mass = undefined;
|
|
17
|
-
export let centerOfMass = undefined;
|
|
18
|
-
export let principalAngularInertia = undefined;
|
|
19
17
|
export let restitution = undefined;
|
|
20
18
|
export let restitutionCombineRule = undefined;
|
|
21
19
|
export let friction = undefined;
|
|
22
20
|
export let frictionCombineRule = undefined;
|
|
23
21
|
export let sensor = undefined;
|
|
22
|
+
export let density = undefined;
|
|
23
|
+
export let mass = undefined;
|
|
24
|
+
export let massProperties = undefined;
|
|
24
25
|
const object = new Object3D();
|
|
25
26
|
/**
|
|
26
27
|
* Immediately apply transforms
|
|
@@ -33,7 +34,7 @@ export let colliders = [];
|
|
|
33
34
|
const collisionGroups = useCollisionGroups();
|
|
34
35
|
const dispatcher = createEventDispatcher();
|
|
35
36
|
onMount(() => {
|
|
36
|
-
colliders = createCollidersFromChildren(object, shape, world, rigidBody);
|
|
37
|
+
colliders = createCollidersFromChildren(object, shape ?? 'convexHull', world, rigidBody);
|
|
37
38
|
colliders.forEach((c) => addColliderToContext(c, object, dispatcher));
|
|
38
39
|
collisionGroups.registerColliders(colliders);
|
|
39
40
|
});
|
|
@@ -47,13 +48,12 @@ $: {
|
|
|
47
48
|
collider.setFriction(friction ?? 0.7);
|
|
48
49
|
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
49
50
|
collider.setSensor(sensor ?? false);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
collider.setMassProperties(mass
|
|
56
|
-
}
|
|
51
|
+
if (density)
|
|
52
|
+
collider.setDensity(density);
|
|
53
|
+
if (mass)
|
|
54
|
+
collider.setMass(mass);
|
|
55
|
+
if (massProperties)
|
|
56
|
+
collider.setMassProperties(massProperties.mass, positionToVector3(massProperties.centerOfMass), positionToVector3(massProperties.principalAngularInertia), rotationToQuaternion(massProperties.angularInertiaLocalFrame));
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script>import { ActiveCollisionTypes, ActiveEvents, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
|
|
2
2
|
import { SceneGraphObject, TransformableObject, useFrame } from '@threlte/core';
|
|
3
|
-
import { createEventDispatcher, onDestroy, onMount } from 'svelte';
|
|
3
|
+
import { createEventDispatcher, onDestroy, onMount, tick } from 'svelte';
|
|
4
4
|
import { Object3D, Quaternion, Vector3 } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
6
6
|
import { useRapier } from '../../hooks/useRapier';
|
|
@@ -8,6 +8,7 @@ import { useRigidBody } from '../../hooks/useRigidBody';
|
|
|
8
8
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
9
9
|
import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
|
|
10
10
|
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
11
|
+
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
11
12
|
import { scaleColliderArgs } from '../../lib/scaleColliderArgs';
|
|
12
13
|
export let shape;
|
|
13
14
|
export let args;
|
|
@@ -15,14 +16,14 @@ export let position = undefined;
|
|
|
15
16
|
export let rotation = undefined;
|
|
16
17
|
export let scale = undefined;
|
|
17
18
|
export let lookAt = undefined;
|
|
18
|
-
export let mass = undefined;
|
|
19
|
-
export let centerOfMass = undefined;
|
|
20
|
-
export let principalAngularInertia = undefined;
|
|
21
19
|
export let restitution = undefined;
|
|
22
20
|
export let restitutionCombineRule = undefined;
|
|
23
21
|
export let friction = undefined;
|
|
24
22
|
export let frictionCombineRule = undefined;
|
|
25
23
|
export let sensor = undefined;
|
|
24
|
+
export let density = undefined;
|
|
25
|
+
export let mass = undefined;
|
|
26
|
+
export let massProperties = undefined;
|
|
26
27
|
const object = new Object3D();
|
|
27
28
|
/**
|
|
28
29
|
* Immediately apply transforms
|
|
@@ -40,7 +41,8 @@ const dispatcher = createEventDispatcher();
|
|
|
40
41
|
* Actual collider setup happens onMount as only then
|
|
41
42
|
* the transforms are finished.
|
|
42
43
|
*/
|
|
43
|
-
onMount(() => {
|
|
44
|
+
onMount(async () => {
|
|
45
|
+
await tick();
|
|
44
46
|
const scale = object.getWorldScale(new Vector3());
|
|
45
47
|
const scaledArgs = scaleColliderArgs(shape, args, scale);
|
|
46
48
|
// @ts-ignore
|
|
@@ -64,8 +66,12 @@ onMount(() => {
|
|
|
64
66
|
rigidBodyWorldQuatInversed.invert();
|
|
65
67
|
}
|
|
66
68
|
});
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
const worldPosition = object.getWorldPosition(new Vector3()).sub(rigidBodyWorldPos);
|
|
70
|
+
const worldRotation = object
|
|
71
|
+
.getWorldQuaternion(new Quaternion())
|
|
72
|
+
.premultiply(rigidBodyWorldQuatInversed);
|
|
73
|
+
collider.setTranslationWrtParent(worldPosition);
|
|
74
|
+
collider.setRotationWrtParent(worldRotation);
|
|
69
75
|
}
|
|
70
76
|
else {
|
|
71
77
|
collider.setTranslation(object.getWorldPosition(new Vector3()));
|
|
@@ -81,13 +87,12 @@ $: {
|
|
|
81
87
|
collider.setFriction(friction ?? 0.7);
|
|
82
88
|
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
83
89
|
collider.setSensor(sensor ?? false);
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
collider.setMassProperties(mass
|
|
90
|
-
}
|
|
90
|
+
if (density)
|
|
91
|
+
collider.setDensity(density);
|
|
92
|
+
if (mass)
|
|
93
|
+
collider.setMass(mass);
|
|
94
|
+
if (massProperties)
|
|
95
|
+
collider.setMassProperties(massProperties.mass, positionToVector3(massProperties.centerOfMass), positionToVector3(massProperties.principalAngularInertia), rotationToQuaternion(massProperties.angularInertiaLocalFrame));
|
|
91
96
|
}
|
|
92
97
|
}
|
|
93
98
|
useFrame(() => {
|
|
@@ -1,32 +1,85 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
import { CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
|
|
3
|
+
import { type Position, type Rotation } from '@threlte/core';
|
|
3
4
|
import type { ColliderEventMap } from '../../types/types';
|
|
4
|
-
declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]
|
|
5
|
+
declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
6
|
+
mass: number;
|
|
7
|
+
centerOfMass: Position;
|
|
8
|
+
principalAngularInertia: Position;
|
|
9
|
+
angularInertiaLocalFrame: Rotation;
|
|
10
|
+
} : undefined : undefined> {
|
|
5
11
|
props(): {
|
|
6
12
|
shape: Shape;
|
|
7
13
|
args: Args;
|
|
8
|
-
position?:
|
|
9
|
-
rotation?:
|
|
14
|
+
position?: Position | undefined;
|
|
15
|
+
rotation?: Rotation | undefined;
|
|
10
16
|
scale?: import("@threlte/core").Scale | undefined;
|
|
11
17
|
lookAt?: import("@threlte/core").LookAt | undefined;
|
|
12
|
-
mass?: number | undefined;
|
|
13
|
-
centerOfMass?: import("@threlte/core").Position | undefined;
|
|
14
|
-
principalAngularInertia?: import("@threlte/core").Position | undefined;
|
|
15
18
|
restitution?: number | undefined;
|
|
16
19
|
restitutionCombineRule?: CoefficientCombineRule | undefined;
|
|
17
20
|
friction?: number | undefined;
|
|
18
21
|
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
19
22
|
sensor?: boolean | undefined;
|
|
20
23
|
collider?: Collider | undefined;
|
|
24
|
+
density?: Density | undefined;
|
|
25
|
+
} | {
|
|
26
|
+
shape: Shape;
|
|
27
|
+
args: Args;
|
|
28
|
+
position?: Position | undefined;
|
|
29
|
+
rotation?: Rotation | undefined;
|
|
30
|
+
scale?: import("@threlte/core").Scale | undefined;
|
|
31
|
+
lookAt?: import("@threlte/core").LookAt | undefined;
|
|
32
|
+
restitution?: number | undefined;
|
|
33
|
+
restitutionCombineRule?: CoefficientCombineRule | undefined;
|
|
34
|
+
friction?: number | undefined;
|
|
35
|
+
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
36
|
+
sensor?: boolean | undefined;
|
|
37
|
+
collider?: Collider | undefined;
|
|
38
|
+
mass?: Mass | undefined;
|
|
39
|
+
} | {
|
|
40
|
+
shape: Shape;
|
|
41
|
+
args: Args;
|
|
42
|
+
position?: Position | undefined;
|
|
43
|
+
rotation?: Rotation | undefined;
|
|
44
|
+
scale?: import("@threlte/core").Scale | undefined;
|
|
45
|
+
lookAt?: import("@threlte/core").LookAt | undefined;
|
|
46
|
+
restitution?: number | undefined;
|
|
47
|
+
restitutionCombineRule?: CoefficientCombineRule | undefined;
|
|
48
|
+
friction?: number | undefined;
|
|
49
|
+
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
50
|
+
sensor?: boolean | undefined;
|
|
51
|
+
collider?: Collider | undefined;
|
|
52
|
+
mass?: Mass | undefined;
|
|
53
|
+
massProperties?: MassProperties | undefined;
|
|
21
54
|
};
|
|
22
55
|
events(): ColliderEventMap;
|
|
23
56
|
slots(): {
|
|
24
57
|
default: {};
|
|
25
58
|
};
|
|
26
59
|
}
|
|
27
|
-
export declare type ColliderProps<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
60
|
+
export declare type ColliderProps<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
61
|
+
mass: number;
|
|
62
|
+
centerOfMass: Position;
|
|
63
|
+
principalAngularInertia: Position;
|
|
64
|
+
angularInertiaLocalFrame: Rotation;
|
|
65
|
+
} : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['props']>;
|
|
66
|
+
export declare type ColliderEvents<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
67
|
+
mass: number;
|
|
68
|
+
centerOfMass: Position;
|
|
69
|
+
principalAngularInertia: Position;
|
|
70
|
+
angularInertiaLocalFrame: Rotation;
|
|
71
|
+
} : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['events']>;
|
|
72
|
+
export declare type ColliderSlots<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
73
|
+
mass: number;
|
|
74
|
+
centerOfMass: Position;
|
|
75
|
+
principalAngularInertia: Position;
|
|
76
|
+
angularInertiaLocalFrame: Rotation;
|
|
77
|
+
} : undefined : undefined> = ReturnType<__sveltets_Render<Shape, Args, Density, Mass, MassProperties>['slots']>;
|
|
78
|
+
export default class Collider<Shape extends 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh', Args extends Parameters<typeof ColliderDesc[Shape]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
79
|
+
mass: number;
|
|
80
|
+
centerOfMass: Position;
|
|
81
|
+
principalAngularInertia: Position;
|
|
82
|
+
angularInertiaLocalFrame: Rotation;
|
|
83
|
+
} : undefined : undefined> extends SvelteComponentTyped<ColliderProps<Shape, Args, Density, Mass, MassProperties>, ColliderEvents<Shape, Args, Density, Mass, MassProperties>, ColliderSlots<Shape, Args, Density, Mass, MassProperties>> {
|
|
31
84
|
}
|
|
32
85
|
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
joint?: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RevoluteImpulseJoint> | undefined;
|
|
5
|
+
rigidBodyA?: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined> | undefined;
|
|
6
|
+
rigidBodyB?: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined> | undefined;
|
|
7
|
+
};
|
|
8
|
+
events: {
|
|
9
|
+
[evt: string]: CustomEvent<any>;
|
|
10
|
+
};
|
|
11
|
+
slots: {
|
|
12
|
+
default: {
|
|
13
|
+
rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
14
|
+
rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare type RevoluteJointProps = typeof __propDef.props;
|
|
19
|
+
export declare type RevoluteJointEvents = typeof __propDef.events;
|
|
20
|
+
export declare type RevoluteJointSlots = typeof __propDef.slots;
|
|
21
|
+
export default class RevoluteJoint extends SvelteComponentTyped<RevoluteJointProps, RevoluteJointEvents, RevoluteJointSlots> {
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -8,6 +8,7 @@ import { parseRigidBodyType } from '../../lib/parseRigidBodyType';
|
|
|
8
8
|
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
9
9
|
import { rotationToEuler } from '../../lib/rotationToEuler';
|
|
10
10
|
const { world, rapier, addRigidBodyToContext, removeRigidBodyFromContext } = useRapier();
|
|
11
|
+
export let debug = false;
|
|
11
12
|
export let type = 'dynamic';
|
|
12
13
|
export let canSleep = true;
|
|
13
14
|
export let linearVelocity = {};
|
|
@@ -57,10 +58,11 @@ object.updateWorldMatrix(true, false);
|
|
|
57
58
|
* RigidBody Description
|
|
58
59
|
*/
|
|
59
60
|
const desc = new rapier.RigidBodyDesc(parseRigidBodyType(type)).setCanSleep(canSleep);
|
|
61
|
+
export let rigidBody = undefined;
|
|
60
62
|
/**
|
|
61
63
|
* RigidBody init
|
|
62
64
|
*/
|
|
63
|
-
export const
|
|
65
|
+
export const rigidBodyTemp = world.createRigidBody(desc);
|
|
64
66
|
/**
|
|
65
67
|
* Apply transforms after the parent component added "object" to itself
|
|
66
68
|
*/
|
|
@@ -72,44 +74,51 @@ const initPosition = async () => {
|
|
|
72
74
|
const parentWorldScale = object.parent ? getWorldScale(object.parent) : new Vector3(1, 1, 1);
|
|
73
75
|
const worldPosition = getWorldPosition(object).multiply(parentWorldScale);
|
|
74
76
|
const worldQuaternion = getWorldQuaternion(object);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
rigidBodyTemp.setTranslation(worldPosition, true);
|
|
78
|
+
rigidBodyTemp.setRotation(worldQuaternion, true);
|
|
79
|
+
if (debug) {
|
|
80
|
+
console.log('worldPosition', worldPosition);
|
|
81
|
+
console.log('worldQuaternion', worldQuaternion);
|
|
82
|
+
}
|
|
83
|
+
if (debug)
|
|
84
|
+
console.log(JSON.stringify(desc, null, 2));
|
|
85
|
+
rigidBody = rigidBodyTemp;
|
|
77
86
|
};
|
|
78
87
|
initPosition();
|
|
79
88
|
/**
|
|
80
89
|
* Will come in handy in the future for joints
|
|
81
90
|
*/
|
|
82
|
-
object.userData.rigidBody =
|
|
91
|
+
object.userData.rigidBody = rigidBodyTemp;
|
|
83
92
|
/**
|
|
84
93
|
* Reactive RigidBody properties
|
|
85
94
|
*/
|
|
86
95
|
$: {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
rigidBodyTemp.setBodyType(parseRigidBodyType(type));
|
|
97
|
+
rigidBodyTemp.setLinvel(positionToVector3(linearVelocity), true);
|
|
98
|
+
rigidBodyTemp.setAngvel(rotationToEuler(angularVelocity), true);
|
|
99
|
+
rigidBodyTemp.setGravityScale(gravityScale, true);
|
|
100
|
+
rigidBodyTemp.enableCcd(ccd);
|
|
101
|
+
rigidBodyTemp.setDominanceGroup(dominance);
|
|
102
|
+
rigidBodyTemp.lockRotations(lockRotations, true);
|
|
103
|
+
rigidBodyTemp.lockTranslations(lockTranslations, true);
|
|
104
|
+
rigidBodyTemp.setEnabledRotations(...enabledRotations, true);
|
|
105
|
+
rigidBodyTemp.setEnabledTranslations(...enabledTranslations, true);
|
|
97
106
|
}
|
|
98
107
|
/**
|
|
99
108
|
* Setting the RigidBody context so that colliders can
|
|
100
109
|
* hook onto.
|
|
101
110
|
*/
|
|
102
|
-
setContext('threlte-rapier-rigidbody',
|
|
111
|
+
setContext('threlte-rapier-rigidbody', rigidBodyTemp);
|
|
103
112
|
/**
|
|
104
113
|
* Add the mesh to the context
|
|
105
114
|
*/
|
|
106
|
-
addRigidBodyToContext(
|
|
115
|
+
addRigidBodyToContext(rigidBodyTemp, object, dispatcher);
|
|
107
116
|
/**
|
|
108
117
|
* cleanup
|
|
109
118
|
*/
|
|
110
119
|
onDestroy(() => {
|
|
111
|
-
removeRigidBodyFromContext(
|
|
112
|
-
world.removeRigidBody(
|
|
120
|
+
removeRigidBodyFromContext(rigidBodyTemp);
|
|
121
|
+
world.removeRigidBody(rigidBodyTemp);
|
|
113
122
|
});
|
|
114
123
|
</script>
|
|
115
124
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import type { RigidBody } from '@dimforge/rapier3d-compat';
|
|
2
3
|
import type { RigidBodyProperties } from '../../types/components';
|
|
3
4
|
import type { RigidBodyEventMap } from '../../types/types';
|
|
4
5
|
declare const __propDef: {
|
|
5
6
|
props: {
|
|
7
|
+
debug?: boolean | undefined;
|
|
6
8
|
type?: import("../../lib/parseRigidBodyType").RigidBodyTypeString | undefined;
|
|
7
9
|
canSleep?: boolean | undefined;
|
|
8
10
|
linearVelocity?: import("@threlte/core").Position | undefined;
|
|
@@ -18,15 +20,16 @@ declare const __propDef: {
|
|
|
18
20
|
enabledRotations?: import("../../types/components").Boolean3Array | undefined;
|
|
19
21
|
enabledTranslations?: import("../../types/components").Boolean3Array | undefined;
|
|
20
22
|
dominance?: number | undefined;
|
|
23
|
+
rigidBody?: RigidBody | undefined;
|
|
21
24
|
/**
|
|
22
25
|
* RigidBody init
|
|
23
|
-
*/
|
|
26
|
+
*/ rigidBodyTemp?: RigidBody | undefined;
|
|
24
27
|
};
|
|
25
28
|
slots: {
|
|
26
29
|
default: {};
|
|
27
30
|
};
|
|
28
31
|
getters: {
|
|
29
|
-
|
|
32
|
+
rigidBodyTemp: RigidBody;
|
|
30
33
|
};
|
|
31
34
|
events: RigidBodyEventMap;
|
|
32
35
|
};
|
|
@@ -34,6 +37,6 @@ export declare type RigidBodyProps = typeof __propDef.props;
|
|
|
34
37
|
export declare type RigidBodyEvents = typeof __propDef.events;
|
|
35
38
|
export declare type RigidBodySlots = typeof __propDef.slots;
|
|
36
39
|
export default class RigidBody extends SvelteComponentTyped<RigidBodyProps, RigidBodyEvents, RigidBodySlots> {
|
|
37
|
-
get
|
|
40
|
+
get rigidBodyTemp(): RigidBody;
|
|
38
41
|
}
|
|
39
42
|
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FixedImpulseJoint } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { Position, Rotation } from '@threlte/core';
|
|
3
|
+
export declare const useFixedJoint: (anchorA: Position, frameA: Rotation, anchorB: Position, frameB: Rotation) => {
|
|
4
|
+
joint: import("svelte/store").Writable<FixedImpulseJoint>;
|
|
5
|
+
rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
6
|
+
rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { positionToVector3 } from '../lib/positionToVector3';
|
|
2
|
+
import { rotationToQuaternion } from '../lib/rotationToQuaternion';
|
|
3
|
+
import { useJoint } from './useJoint';
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
5
|
+
export const useFixedJoint = (anchorA, frameA, anchorB, frameB) => {
|
|
6
|
+
return useJoint((rbA, rbB, { world, rapier }) => {
|
|
7
|
+
const params = rapier.JointData.fixed(positionToVector3(anchorA), rotationToQuaternion(frameA), positionToVector3(anchorB), rotationToQuaternion(frameB));
|
|
8
|
+
return world.createImpulseJoint(params, rbA, rbB, true);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ImpulseJoint, RigidBody } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { RapierContext } from '../types/types';
|
|
3
|
+
export declare const useJoint: <T extends ImpulseJoint>(initializeJoint: (rigidBodyA: RigidBody, rigidBodyB: RigidBody, ctx: RapierContext) => T) => {
|
|
4
|
+
joint: import("svelte/store").Writable<T>;
|
|
5
|
+
rigidBodyA: import("svelte/store").Writable<RigidBody | undefined>;
|
|
6
|
+
rigidBodyB: import("svelte/store").Writable<RigidBody | undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { onDestroy } from 'svelte';
|
|
2
|
+
import { derived, get, writable } from 'svelte/store';
|
|
3
|
+
import { useRapier } from './useRapier';
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
5
|
+
export const useJoint = (initializeJoint) => {
|
|
6
|
+
const rigidBodyA = writable(undefined);
|
|
7
|
+
const rigidBodyB = writable(undefined);
|
|
8
|
+
const ctx = useRapier();
|
|
9
|
+
const bodies = derived([rigidBodyA, rigidBodyB], ([rbA, rbB]) => {
|
|
10
|
+
if (!!rbA && !!rbB) {
|
|
11
|
+
return [rbA, rbB];
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const joint = writable(undefined);
|
|
15
|
+
const unsubscribeBodies = bodies.subscribe((bodies) => {
|
|
16
|
+
if (bodies)
|
|
17
|
+
joint.set(initializeJoint(...bodies, ctx));
|
|
18
|
+
});
|
|
19
|
+
onDestroy(() => {
|
|
20
|
+
unsubscribeBodies();
|
|
21
|
+
const j = get(joint);
|
|
22
|
+
if (!j)
|
|
23
|
+
return;
|
|
24
|
+
ctx.world.removeImpulseJoint(j, true);
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
joint,
|
|
28
|
+
rigidBodyA,
|
|
29
|
+
rigidBodyB
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PrismaticImpulseJoint } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { Position } from '@threlte/core';
|
|
3
|
+
export declare const usePrismaticJoint: (anchorA: Position, anchorB: Position, axis: Position, limits?: [min: number, max: number]) => {
|
|
4
|
+
joint: import("svelte/store").Writable<PrismaticImpulseJoint>;
|
|
5
|
+
rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
6
|
+
rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { positionToVector3 } from '../lib/positionToVector3';
|
|
2
|
+
import { useJoint } from './useJoint';
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
4
|
+
export const usePrismaticJoint = (anchorA, anchorB, axis, limits) => {
|
|
5
|
+
return useJoint((rbA, rbB, { world, rapier }) => {
|
|
6
|
+
const params = rapier.JointData.prismatic(positionToVector3(anchorA), positionToVector3(anchorB), positionToVector3(axis).normalize());
|
|
7
|
+
if (limits) {
|
|
8
|
+
params.limitsEnabled = true;
|
|
9
|
+
params.limits = limits;
|
|
10
|
+
}
|
|
11
|
+
return world.createImpulseJoint(params, rbA, rbB, true);
|
|
12
|
+
});
|
|
13
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RevoluteImpulseJoint } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { Position } from '@threlte/core';
|
|
3
|
+
export declare const useRevoluteJoint: (anchorA: Position, anchorB: Position, axis: Position, limits?: [min: number, max: number]) => {
|
|
4
|
+
joint: import("svelte/store").Writable<RevoluteImpulseJoint>;
|
|
5
|
+
rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
6
|
+
rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { positionToVector3 } from '../lib/positionToVector3';
|
|
2
|
+
import { useJoint } from './useJoint';
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
4
|
+
export const useRevoluteJoint = (anchorA, anchorB, axis, limits) => {
|
|
5
|
+
return useJoint((rbA, rbB, { world, rapier }) => {
|
|
6
|
+
const params = rapier.JointData.revolute(positionToVector3(anchorA), positionToVector3(anchorB), positionToVector3(axis).normalize());
|
|
7
|
+
if (limits) {
|
|
8
|
+
params.limitsEnabled = true;
|
|
9
|
+
params.limits = limits;
|
|
10
|
+
}
|
|
11
|
+
return world.createImpulseJoint(params, rbA, rbB, true);
|
|
12
|
+
});
|
|
13
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SphericalImpulseJoint } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { Position } from '@threlte/core';
|
|
3
|
+
export declare const useSphericalJoint: (anchorA: Position, anchorB: Position) => {
|
|
4
|
+
joint: import("svelte/store").Writable<SphericalImpulseJoint>;
|
|
5
|
+
rigidBodyA: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
6
|
+
rigidBodyB: import("svelte/store").Writable<import("@dimforge/rapier3d-compat").RigidBody | undefined>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { navigating } from '$app/stores';
|
|
2
|
+
import { positionToVector3 } from '../lib/positionToVector3';
|
|
3
|
+
import { useJoint } from './useJoint';
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
5
|
+
export const useSphericalJoint = (anchorA, anchorB) => {
|
|
6
|
+
return useJoint((rbA, rbB, { world, rapier }) => {
|
|
7
|
+
const params = rapier.JointData.spherical(positionToVector3(anchorA), positionToVector3(anchorB));
|
|
8
|
+
return world.createImpulseJoint(params, rbA, rbB, true);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
navigating;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export { useRapier } from './hooks/useRapier';
|
|
2
2
|
export { useCollisionGroups } from './hooks/useCollisionGroups';
|
|
3
3
|
export { useRigidBody } from './hooks/useRigidBody';
|
|
4
|
+
export { useRevoluteJoint } from './hooks/useRevoluteJoint';
|
|
5
|
+
export { usePrismaticJoint } from './hooks/usePrismaticJoint';
|
|
6
|
+
export { useFixedJoint } from './hooks/useFixedJoint';
|
|
7
|
+
export { useSphericalJoint } from './hooks/useSphericalJoint';
|
|
4
8
|
export { default as World } from './components/World/World.svelte';
|
|
5
9
|
export { default as RigidBody } from './components/RigidBody/RigidBody.svelte';
|
|
6
10
|
export { default as Debug } from './components/Debug/Debug.svelte';
|
|
@@ -8,5 +12,5 @@ export { default as Collider } from './components/Colliders/Collider.svelte';
|
|
|
8
12
|
export { default as AutoColliders } from './components/Colliders/AutoColliders.svelte';
|
|
9
13
|
export { default as CollisionGroups } from './components/CollisionGroups/CollisionGroups.svelte';
|
|
10
14
|
export { default as BasicPlayerController } from './recipes/BasicPlayerController.svelte';
|
|
11
|
-
export type { AutoCollidersProperties,
|
|
15
|
+
export type { AutoCollidersProperties, Boolean3Array, RigidBodyProperties, WorldProperties } from './types/components';
|
|
12
16
|
export type { CollisionGroupsBitMask, AutoCollidersShapes, ColliderEventDispatcher, ColliderShapes, RapierContext, RigidBodyEventDispatcher } from './types/types';
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
export { useRapier } from './hooks/useRapier';
|
|
3
3
|
export { useCollisionGroups } from './hooks/useCollisionGroups';
|
|
4
4
|
export { useRigidBody } from './hooks/useRigidBody';
|
|
5
|
+
// Joints
|
|
6
|
+
export { useRevoluteJoint } from './hooks/useRevoluteJoint';
|
|
7
|
+
export { usePrismaticJoint } from './hooks/usePrismaticJoint';
|
|
8
|
+
export { useFixedJoint } from './hooks/useFixedJoint';
|
|
9
|
+
export { useSphericalJoint } from './hooks/useSphericalJoint';
|
|
5
10
|
// components
|
|
6
11
|
export { default as World } from './components/World/World.svelte';
|
|
7
12
|
export { default as RigidBody } from './components/RigidBody/RigidBody.svelte';
|
|
@@ -72,6 +72,7 @@ export declare type ColliderProperties<Shape extends ColliderShapes> = Omit<Tran
|
|
|
72
72
|
* More info https://rapier.rs/docs/user_guides/javascript/colliders#mass-properties
|
|
73
73
|
*/
|
|
74
74
|
mass?: number;
|
|
75
|
+
density?: number;
|
|
75
76
|
/**
|
|
76
77
|
* The center of mass of this rigid body
|
|
77
78
|
*/
|
package/package.json
CHANGED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import { type Collider } from '@dimforge/rapier3d-compat';
|
|
3
|
-
import type { AutoCollidersProperties } from '../../types/components';
|
|
4
|
-
import type { ColliderEventMap } from '../../types/types';
|
|
5
|
-
declare const __propDef: {
|
|
6
|
-
props: {
|
|
7
|
-
shape?: import("../../types/types").AutoCollidersShapes | undefined;
|
|
8
|
-
position?: AutoCollidersProperties['position'];
|
|
9
|
-
rotation?: AutoCollidersProperties['rotation'];
|
|
10
|
-
scale?: AutoCollidersProperties['scale'];
|
|
11
|
-
lookAt?: AutoCollidersProperties['lookAt'];
|
|
12
|
-
mass?: AutoCollidersProperties['mass'];
|
|
13
|
-
centerOfMass?: AutoCollidersProperties['centerOfMass'];
|
|
14
|
-
principalAngularInertia?: AutoCollidersProperties['principalAngularInertia'];
|
|
15
|
-
restitution?: AutoCollidersProperties['restitution'];
|
|
16
|
-
restitutionCombineRule?: AutoCollidersProperties['restitutionCombineRule'];
|
|
17
|
-
friction?: AutoCollidersProperties['friction'];
|
|
18
|
-
frictionCombineRule?: AutoCollidersProperties['frictionCombineRule'];
|
|
19
|
-
sensor?: AutoCollidersProperties['sensor'];
|
|
20
|
-
colliders?: Collider[] | undefined;
|
|
21
|
-
};
|
|
22
|
-
slots: {
|
|
23
|
-
default: {};
|
|
24
|
-
};
|
|
25
|
-
getters: {};
|
|
26
|
-
events: ColliderEventMap;
|
|
27
|
-
};
|
|
28
|
-
export declare type AutoCollidersProps = typeof __propDef.props;
|
|
29
|
-
export declare type AutoCollidersEvents = typeof __propDef.events;
|
|
30
|
-
export declare type AutoCollidersSlots = typeof __propDef.slots;
|
|
31
|
-
export default class AutoColliders extends SvelteComponentTyped<AutoCollidersProps, AutoCollidersEvents, AutoCollidersSlots> {
|
|
32
|
-
}
|
|
33
|
-
export {};
|