@threlte/rapier 0.4.0 → 1.0.0-next.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 +12 -0
- package/dist/components/Attractor/Attractor.svelte +54 -0
- package/dist/components/Attractor/Attractor.svelte.d.ts +21 -0
- package/dist/components/Colliders/AutoColliders.svelte +16 -10
- package/dist/components/Colliders/AutoColliders.svelte.d.ts +74 -0
- package/dist/components/Colliders/Collider.svelte +24 -15
- package/dist/components/Colliders/Collider.svelte.d.ts +105 -112
- package/dist/components/CollisionGroups/CollisionGroups.svelte.d.ts +29 -19
- package/dist/components/Debug/Debug.svelte +15 -10
- package/dist/components/Debug/Debug.svelte.d.ts +6 -60
- package/dist/components/RigidBody/RigidBody.svelte +14 -32
- package/dist/components/RigidBody/RigidBody.svelte.d.ts +93 -67
- package/dist/components/World/InnerWorld.svelte +9 -6
- package/dist/components/World/InnerWorld.svelte.d.ts +14 -15
- package/dist/components/World/World.svelte +6 -2
- package/dist/components/World/World.svelte.d.ts +35 -32
- package/dist/hooks/useFixedJoint.d.ts +2 -2
- package/dist/hooks/useFixedJoint.js +6 -3
- 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 +1 -0
- package/dist/lib/applyTransforms.d.ts +2 -3
- package/dist/lib/applyTransforms.js +7 -16
- package/dist/lib/createRapierContext.d.ts +1 -0
- package/dist/lib/createRapierContext.js +3 -1
- package/dist/lib/eulerToQuaternion.d.ts +7 -0
- package/dist/lib/eulerToQuaternion.js +12 -0
- package/dist/lib/scaleColliderArgs.js +2 -2
- package/dist/recipes/BasicPlayerController.svelte +12 -6
- package/dist/recipes/BasicPlayerController.svelte.d.ts +2 -2
- package/dist/types/components.d.ts +29 -88
- package/package.json +9 -8
- 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.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- d41cb6cf: Adapted rapier package to Threlte v6 syntax
|
|
8
|
+
|
|
9
|
+
## 0.5.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- d69391a: Add Attractor component and documentation
|
|
14
|
+
|
|
3
15
|
## 0.4.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script>import { T, useFrame } from '@threlte/core';
|
|
2
|
+
import { Group, Vector3 } from 'three';
|
|
3
|
+
import { useRapier } from '../../hooks/useRapier';
|
|
4
|
+
export let strength = 1;
|
|
5
|
+
export let range = 50;
|
|
6
|
+
export let gravityType = 'static';
|
|
7
|
+
export let gravitationalConstant = 6.673e-11;
|
|
8
|
+
const { world, debug } = useRapier();
|
|
9
|
+
const gravitySource = new Vector3();
|
|
10
|
+
let obj = new Group();
|
|
11
|
+
const calcForceByType = {
|
|
12
|
+
static: (s, m2, r, d, G) => s,
|
|
13
|
+
linear: (s, m2, r, d, G) => s * (d / r),
|
|
14
|
+
newtonian: (s, m2, r, d, G) => (G * s * m2) / Math.pow(d, 2)
|
|
15
|
+
};
|
|
16
|
+
function applyImpulseToBodiesInRange() {
|
|
17
|
+
const impulseVector = new Vector3();
|
|
18
|
+
obj.getWorldPosition(gravitySource);
|
|
19
|
+
world.forEachRigidBody((body) => {
|
|
20
|
+
const { x, y, z } = body.translation();
|
|
21
|
+
const bodyV3 = new Vector3(x, y, z);
|
|
22
|
+
const distance = gravitySource.distanceTo(bodyV3);
|
|
23
|
+
if (distance < range) {
|
|
24
|
+
let force = calcForceByType[gravityType](strength, body.mass(), range, distance, gravitationalConstant);
|
|
25
|
+
// Prevent wild forces when Attractors collide
|
|
26
|
+
force = force === Infinity ? strength : force;
|
|
27
|
+
impulseVector.subVectors(gravitySource, bodyV3).normalize().multiplyScalar(force);
|
|
28
|
+
body.applyImpulse(impulseVector, true);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
useFrame(() => {
|
|
33
|
+
applyImpulseToBodiesInRange();
|
|
34
|
+
});
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<T
|
|
38
|
+
let:ref
|
|
39
|
+
is={obj}
|
|
40
|
+
{...$$restProps}
|
|
41
|
+
>
|
|
42
|
+
<slot {ref} />
|
|
43
|
+
|
|
44
|
+
{#if $debug}
|
|
45
|
+
<T.Mesh>
|
|
46
|
+
<T.SphereGeometry args={[range]} />
|
|
47
|
+
<T.MeshBasicMaterial
|
|
48
|
+
wireframe
|
|
49
|
+
transparent
|
|
50
|
+
opacity={0.25}
|
|
51
|
+
/>
|
|
52
|
+
</T.Mesh>
|
|
53
|
+
{/if}
|
|
54
|
+
</T>
|
|
@@ -0,0 +1,21 @@
|
|
|
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']>
|
|
11
|
+
}
|
|
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,4 +1,4 @@
|
|
|
1
|
-
<script>import { ActiveCollisionTypes,
|
|
1
|
+
<script>import { ActiveCollisionTypes, CoefficientCombineRule } from '@dimforge/rapier3d-compat';
|
|
2
2
|
import { SceneGraphObject } from '@threlte/core';
|
|
3
3
|
import { createEventDispatcher, onDestroy, onMount } from 'svelte';
|
|
4
4
|
import { Object3D } from 'three';
|
|
@@ -9,13 +9,11 @@ import { useRigidBody } from '../../hooks/useRigidBody';
|
|
|
9
9
|
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
10
10
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
11
11
|
import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
|
|
12
|
-
import {
|
|
13
|
-
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
12
|
+
import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
|
|
14
13
|
export let shape = 'convexHull';
|
|
15
14
|
export let position = undefined;
|
|
16
15
|
export let rotation = undefined;
|
|
17
16
|
export let scale = undefined;
|
|
18
|
-
export let lookAt = undefined;
|
|
19
17
|
export let restitution = undefined;
|
|
20
18
|
export let restitutionCombineRule = undefined;
|
|
21
19
|
export let friction = undefined;
|
|
@@ -24,12 +22,14 @@ export let sensor = undefined;
|
|
|
24
22
|
export let contactForceEventThreshold = undefined;
|
|
25
23
|
export let density = undefined;
|
|
26
24
|
export let mass = undefined;
|
|
27
|
-
export let
|
|
25
|
+
export let centerOfMass = undefined;
|
|
26
|
+
export let principalAngularInertia = undefined;
|
|
27
|
+
export let angularInertiaLocalFrame = undefined;
|
|
28
28
|
const object = new Object3D();
|
|
29
29
|
/**
|
|
30
30
|
* Immediately apply transforms
|
|
31
31
|
*/
|
|
32
|
-
applyTransforms(object, position, rotation, scale
|
|
32
|
+
applyTransforms(object, position, rotation, scale);
|
|
33
33
|
object.updateWorldMatrix(true, false);
|
|
34
34
|
const rigidBody = useRigidBody();
|
|
35
35
|
const { world, addColliderToContext, removeColliderFromContext } = useRapier();
|
|
@@ -55,10 +55,16 @@ $: {
|
|
|
55
55
|
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
56
56
|
if (density)
|
|
57
57
|
collider.setDensity(density);
|
|
58
|
-
if (mass)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
if (mass) {
|
|
59
|
+
if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame)
|
|
60
|
+
collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
|
|
61
|
+
x: principalAngularInertia[0],
|
|
62
|
+
y: principalAngularInertia[1],
|
|
63
|
+
z: principalAngularInertia[2]
|
|
64
|
+
}, eulerToQuaternion(angularInertiaLocalFrame));
|
|
65
|
+
else
|
|
66
|
+
collider.setMass(mass);
|
|
67
|
+
}
|
|
62
68
|
});
|
|
63
69
|
}
|
|
64
70
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { CoefficientCombineRule, Collider } from '@dimforge/rapier3d-compat'
|
|
2
|
+
import type { Position, Rotation } from '@threlte/core'
|
|
3
|
+
import { SvelteComponentTyped } from 'svelte'
|
|
4
|
+
import type { Euler, Vector3 } from 'three'
|
|
5
|
+
import type { AutoCollidersShapes } from '../../types/types'
|
|
6
|
+
|
|
7
|
+
// ------------------ BASE ------------------
|
|
8
|
+
|
|
9
|
+
type BaseProps = {
|
|
10
|
+
shape?: AutoCollidersShapes
|
|
11
|
+
position?: Parameters<Vector3['set']>
|
|
12
|
+
rotation?: Parameters<Euler['set']>
|
|
13
|
+
scale?: Parameters<Vector3['set']>
|
|
14
|
+
restitution?: number
|
|
15
|
+
restitutionCombineRule?: CoefficientCombineRule
|
|
16
|
+
friction?: number
|
|
17
|
+
frictionCombineRule?: CoefficientCombineRule
|
|
18
|
+
sensor?: boolean
|
|
19
|
+
colliders?: Collider[]
|
|
20
|
+
contactForceEventThreshold?: number
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// ------------------ MASS ------------------
|
|
24
|
+
|
|
25
|
+
type Density = {
|
|
26
|
+
density: number
|
|
27
|
+
|
|
28
|
+
mass?: never
|
|
29
|
+
centerOfMass?: never
|
|
30
|
+
principalAngularInertia?: never
|
|
31
|
+
angularInertiaLocalFrame?: never
|
|
32
|
+
}
|
|
33
|
+
type Mass = {
|
|
34
|
+
mass: number
|
|
35
|
+
|
|
36
|
+
density?: never
|
|
37
|
+
centerOfMass?: never
|
|
38
|
+
principalAngularInertia?: never
|
|
39
|
+
angularInertiaLocalFrame?: never
|
|
40
|
+
}
|
|
41
|
+
type MassProperties = {
|
|
42
|
+
mass: number
|
|
43
|
+
centerOfMass: Parameters<Vector3['set']>
|
|
44
|
+
principalAngularInertia: Parameters<Vector3['set']>
|
|
45
|
+
angularInertiaLocalFrame: Parameters<Euler['set']>
|
|
46
|
+
|
|
47
|
+
density?: never
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type NoMassProperties = {
|
|
51
|
+
density?: never
|
|
52
|
+
mass?: never
|
|
53
|
+
centerOfMass?: never
|
|
54
|
+
principalAngularInertia?: never
|
|
55
|
+
angularInertiaLocalFrame?: never
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type MassDef = Density | Mass | MassProperties | NoMassProperties
|
|
59
|
+
|
|
60
|
+
type MassProps<TMassDef extends MassDef> = TMassDef extends Density
|
|
61
|
+
? Density
|
|
62
|
+
: TMassDef extends MassProperties
|
|
63
|
+
? MassProperties
|
|
64
|
+
: TMassDef extends Mass
|
|
65
|
+
? Mass
|
|
66
|
+
: NoMassProperties
|
|
67
|
+
|
|
68
|
+
// ------------------ COLLIDER ------------------
|
|
69
|
+
|
|
70
|
+
export type AutoCollidersProps<TMassDef extends MassDef> = BaseProps & MassProps<TMassDef>
|
|
71
|
+
|
|
72
|
+
export default class AutoColliders<TMassDef extends MassDef> extends SvelteComponentTyped<
|
|
73
|
+
AutoCollidersProps<TMassDef>
|
|
74
|
+
> {}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<script>import { ActiveCollisionTypes,
|
|
2
|
-
import { SceneGraphObject,
|
|
1
|
+
<script>import { ActiveCollisionTypes, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import { SceneGraphObject, useFrame } from '@threlte/core';
|
|
3
3
|
import { createEventDispatcher, onDestroy, onMount, tick } from 'svelte';
|
|
4
4
|
import { Object3D, Quaternion, Vector3 } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
@@ -8,16 +8,14 @@ import { useRapier } from '../../hooks/useRapier';
|
|
|
8
8
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
9
9
|
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
10
10
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
11
|
+
import { eulerToQuaternion } from '../../lib/eulerToQuaternion';
|
|
11
12
|
import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
|
|
12
|
-
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
13
|
-
import { rotationToQuaternion } from '../../lib/rotationToQuaternion';
|
|
14
13
|
import { scaleColliderArgs } from '../../lib/scaleColliderArgs';
|
|
15
14
|
export let shape;
|
|
16
15
|
export let args;
|
|
17
16
|
export let position = undefined;
|
|
18
17
|
export let rotation = undefined;
|
|
19
18
|
export let scale = undefined;
|
|
20
|
-
export let lookAt = undefined;
|
|
21
19
|
export let restitution = undefined;
|
|
22
20
|
export let restitutionCombineRule = undefined;
|
|
23
21
|
export let friction = undefined;
|
|
@@ -26,12 +24,14 @@ export let sensor = undefined;
|
|
|
26
24
|
export let contactForceEventThreshold = undefined;
|
|
27
25
|
export let density = undefined;
|
|
28
26
|
export let mass = undefined;
|
|
29
|
-
export let
|
|
27
|
+
export let centerOfMass = undefined;
|
|
28
|
+
export let principalAngularInertia = undefined;
|
|
29
|
+
export let angularInertiaLocalFrame = undefined;
|
|
30
30
|
const object = new Object3D();
|
|
31
31
|
/**
|
|
32
32
|
* Immediately apply transforms
|
|
33
33
|
*/
|
|
34
|
-
applyTransforms(object, position, rotation, scale
|
|
34
|
+
applyTransforms(object, position, rotation, scale);
|
|
35
35
|
object.updateWorldMatrix(true, false);
|
|
36
36
|
const rigidBody = useRigidBody();
|
|
37
37
|
const isAttached = !!rigidBody;
|
|
@@ -95,15 +95,28 @@ $: {
|
|
|
95
95
|
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
96
96
|
if (density)
|
|
97
97
|
collider.setDensity(density);
|
|
98
|
-
if (mass)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
if (mass) {
|
|
99
|
+
if (centerOfMass && principalAngularInertia && angularInertiaLocalFrame) {
|
|
100
|
+
collider.setMassProperties(mass, { x: centerOfMass[0], y: centerOfMass[1], z: centerOfMass[2] }, {
|
|
101
|
+
x: principalAngularInertia[0],
|
|
102
|
+
y: principalAngularInertia[1],
|
|
103
|
+
z: principalAngularInertia[2]
|
|
104
|
+
}, eulerToQuaternion(angularInertiaLocalFrame));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
collider.setMass(mass);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
102
110
|
}
|
|
103
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* If the Collider isAttached (i.e. NOT child of a RigidBody), update the
|
|
114
|
+
* transforms on every frame.
|
|
115
|
+
*/
|
|
104
116
|
useFrame(() => {
|
|
105
117
|
if (!collider)
|
|
106
118
|
return;
|
|
119
|
+
applyTransforms(object, position, rotation, scale);
|
|
107
120
|
collider.setTranslation(getWorldPosition(object));
|
|
108
121
|
collider.setRotation(getWorldQuaternion(object));
|
|
109
122
|
}, {
|
|
@@ -124,7 +137,3 @@ onDestroy(() => {
|
|
|
124
137
|
<SceneGraphObject {object}>
|
|
125
138
|
<slot />
|
|
126
139
|
</SceneGraphObject>
|
|
127
|
-
|
|
128
|
-
{#if !isAttached}
|
|
129
|
-
<TransformableObject {object} {position} {rotation} {scale} />
|
|
130
|
-
{/if}
|
|
@@ -1,114 +1,107 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
collider?: Collider | undefined;
|
|
23
|
-
contactForceEventThreshold?: number | 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
|
-
contactForceEventThreshold?: number | undefined;
|
|
39
|
-
mass?: Mass | undefined;
|
|
40
|
-
} | {
|
|
41
|
-
shape: Shape;
|
|
42
|
-
args: Args;
|
|
43
|
-
position?: Position | undefined;
|
|
44
|
-
rotation?: Rotation | undefined;
|
|
45
|
-
scale?: import("@threlte/core").Scale | undefined;
|
|
46
|
-
lookAt?: import("@threlte/core").LookAt | undefined;
|
|
47
|
-
restitution?: number | undefined;
|
|
48
|
-
restitutionCombineRule?: CoefficientCombineRule | undefined;
|
|
49
|
-
friction?: number | undefined;
|
|
50
|
-
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
51
|
-
sensor?: boolean | undefined;
|
|
52
|
-
collider?: Collider | undefined;
|
|
53
|
-
contactForceEventThreshold?: number | undefined;
|
|
54
|
-
mass?: Mass | undefined;
|
|
55
|
-
massProperties?: MassProperties | undefined;
|
|
56
|
-
};
|
|
57
|
-
events(): {
|
|
58
|
-
collisionenter: CustomEvent<{
|
|
59
|
-
targetCollider: Collider;
|
|
60
|
-
targetRigidBody: RigidBody | null;
|
|
61
|
-
manifold: import("@dimforge/rapier3d-compat").TempContactManifold;
|
|
62
|
-
flipped: boolean;
|
|
63
|
-
}>;
|
|
64
|
-
collisionexit: CustomEvent<{
|
|
65
|
-
targetCollider: Collider;
|
|
66
|
-
targetRigidBody: RigidBody | null;
|
|
67
|
-
}>;
|
|
68
|
-
sensorenter: CustomEvent<{
|
|
69
|
-
targetCollider: Collider;
|
|
70
|
-
targetRigidBody: RigidBody | null;
|
|
71
|
-
}>;
|
|
72
|
-
sensorexit: CustomEvent<{
|
|
73
|
-
targetCollider: Collider;
|
|
74
|
-
targetRigidBody: RigidBody | null;
|
|
75
|
-
}>;
|
|
76
|
-
contact: CustomEvent<{
|
|
77
|
-
targetCollider: Collider;
|
|
78
|
-
targetRigidBody: RigidBody | null;
|
|
79
|
-
maxForceDirection: import("@dimforge/rapier3d-compat").Vector;
|
|
80
|
-
maxForceMagnitude: number;
|
|
81
|
-
totalForce: import("@dimforge/rapier3d-compat").Vector;
|
|
82
|
-
totalForceMagnitude: number;
|
|
83
|
-
}>;
|
|
84
|
-
};
|
|
85
|
-
slots(): {
|
|
86
|
-
default: {};
|
|
87
|
-
};
|
|
1
|
+
import type {
|
|
2
|
+
CoefficientCombineRule,
|
|
3
|
+
Collider as rapierCollider,
|
|
4
|
+
ColliderDesc
|
|
5
|
+
} from '@dimforge/rapier3d-compat'
|
|
6
|
+
import { SvelteComponentTyped } from 'svelte'
|
|
7
|
+
import type { Euler, Vector3 } from 'three'
|
|
8
|
+
|
|
9
|
+
// ------------------ BASE ------------------
|
|
10
|
+
|
|
11
|
+
type BaseProps = {
|
|
12
|
+
position?: Parameters<Vector3['set']>
|
|
13
|
+
rotation?: Parameters<Euler['set']>
|
|
14
|
+
scale?: Parameters<Vector3['set']>
|
|
15
|
+
restitution?: number
|
|
16
|
+
restitutionCombineRule?: CoefficientCombineRule
|
|
17
|
+
friction?: number
|
|
18
|
+
frictionCombineRule?: CoefficientCombineRule
|
|
19
|
+
sensor?: boolean
|
|
20
|
+
collider?: rapierCollider
|
|
21
|
+
contactForceEventThreshold?: number
|
|
88
22
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
23
|
+
|
|
24
|
+
// ------------------ SHAPE ------------------
|
|
25
|
+
|
|
26
|
+
export type Shape =
|
|
27
|
+
| 'ball'
|
|
28
|
+
| 'capsule'
|
|
29
|
+
| 'segment'
|
|
30
|
+
| 'triangle'
|
|
31
|
+
| 'roundTriangle'
|
|
32
|
+
| 'polyline'
|
|
33
|
+
| 'trimesh'
|
|
34
|
+
| 'cuboid'
|
|
35
|
+
| 'roundCuboid'
|
|
36
|
+
| 'heightfield'
|
|
37
|
+
| 'cylinder'
|
|
38
|
+
| 'roundCylinder'
|
|
39
|
+
| 'cone'
|
|
40
|
+
| 'roundCone'
|
|
41
|
+
| 'convexHull'
|
|
42
|
+
| 'convexMesh'
|
|
43
|
+
| 'roundConvexHull'
|
|
44
|
+
| 'roundConvexMesh'
|
|
45
|
+
|
|
46
|
+
type Args<TShape extends Shape> = Parameters<typeof ColliderDesc[TShape]>
|
|
47
|
+
|
|
48
|
+
type ShapeProps<TShape extends Shape> = {
|
|
49
|
+
shape: TShape
|
|
50
|
+
args: Args<TShape>
|
|
113
51
|
}
|
|
114
|
-
|
|
52
|
+
|
|
53
|
+
// ------------------ MASS ------------------
|
|
54
|
+
|
|
55
|
+
type Density = {
|
|
56
|
+
density: number
|
|
57
|
+
|
|
58
|
+
mass?: never
|
|
59
|
+
centerOfMass?: never
|
|
60
|
+
principalAngularInertia?: never
|
|
61
|
+
angularInertiaLocalFrame?: never
|
|
62
|
+
}
|
|
63
|
+
type Mass = {
|
|
64
|
+
mass: number
|
|
65
|
+
|
|
66
|
+
density?: never
|
|
67
|
+
centerOfMass?: never
|
|
68
|
+
principalAngularInertia?: never
|
|
69
|
+
angularInertiaLocalFrame?: never
|
|
70
|
+
}
|
|
71
|
+
type MassProperties = {
|
|
72
|
+
mass: number
|
|
73
|
+
centerOfMass: Parameters<Vector3['set']>
|
|
74
|
+
principalAngularInertia: Parameters<Vector3['set']>
|
|
75
|
+
angularInertiaLocalFrame: Parameters<Euler['set']>
|
|
76
|
+
|
|
77
|
+
density?: never
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
type NoMassProperties = {
|
|
81
|
+
density?: never
|
|
82
|
+
mass?: never
|
|
83
|
+
centerOfMass?: never
|
|
84
|
+
principalAngularInertia?: never
|
|
85
|
+
angularInertiaLocalFrame?: never
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type MassDef = Density | Mass | MassProperties | NoMassProperties
|
|
89
|
+
|
|
90
|
+
type MassProps<TMassDef extends MassDef> = TMassDef extends Density
|
|
91
|
+
? Density
|
|
92
|
+
: TMassDef extends MassProperties
|
|
93
|
+
? MassProperties
|
|
94
|
+
: TMassDef extends Mass
|
|
95
|
+
? Mass
|
|
96
|
+
: NoMassProperties
|
|
97
|
+
|
|
98
|
+
// ------------------ COLLIDER ------------------
|
|
99
|
+
|
|
100
|
+
export type ColliderProps<TShape extends Shape, TMassDef extends MassDef> = BaseProps &
|
|
101
|
+
ShapeProps<TShape> &
|
|
102
|
+
MassProps<TMassDef>
|
|
103
|
+
|
|
104
|
+
export default class Collider<
|
|
105
|
+
TShape extends Shape,
|
|
106
|
+
TMassDef extends MassDef
|
|
107
|
+
> extends SvelteComponentTyped<ColliderProps<TShape, TMassDef>> {}
|
|
@@ -1,21 +1,31 @@
|
|
|
1
|
-
import { SvelteComponentTyped } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
1
|
+
import { SvelteComponentTyped } from 'svelte'
|
|
2
|
+
|
|
3
|
+
type N = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
|
|
4
|
+
|
|
5
|
+
export type Groups = N[]
|
|
6
|
+
|
|
7
|
+
export type MembershipsAndFilter = N[]
|
|
8
|
+
|
|
9
|
+
type GroupsProps = {
|
|
10
|
+
groups: N[]
|
|
11
|
+
|
|
12
|
+
filter?: never
|
|
13
|
+
memberships?: never
|
|
15
14
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
|
|
16
|
+
type MembershipsAndFilterProps = {
|
|
17
|
+
filter: N[]
|
|
18
|
+
memberships: N[]
|
|
19
|
+
|
|
20
|
+
groups?: never
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
+
|
|
23
|
+
type GroupsDef = GroupsProps | MembershipsAndFilterProps
|
|
24
|
+
|
|
25
|
+
export type CollisionGroupsProps<TGroupsDef extends GroupsDef> = TGroupsDef extends GroupsProps
|
|
26
|
+
? GroupsProps
|
|
27
|
+
: MembershipsAndFilterProps
|
|
28
|
+
|
|
29
|
+
export default class CollisionGroups<TGroupsDef extends GroupsDef> extends SvelteComponentTyped<
|
|
30
|
+
CollisionGroupsProps<TGroupsDef>
|
|
31
|
+
> {}
|
|
@@ -1,19 +1,15 @@
|
|
|
1
|
-
<script>import {
|
|
1
|
+
<script>import { T, useFrame } from '@threlte/core';
|
|
2
2
|
import { onDestroy } from 'svelte';
|
|
3
|
-
import { BufferAttribute, BufferGeometry
|
|
3
|
+
import { BufferAttribute, BufferGeometry } from 'three';
|
|
4
4
|
import { useRapier } from '../../hooks/useRapier';
|
|
5
|
-
|
|
6
|
-
const material = new LineBasicMaterial({
|
|
7
|
-
vertexColors,
|
|
8
|
-
...$$props
|
|
9
|
-
});
|
|
10
|
-
const { world } = useRapier();
|
|
5
|
+
const { world, debug } = useRapier();
|
|
11
6
|
const buffers = world.debugRender();
|
|
12
7
|
const vertices = new BufferAttribute(buffers.vertices, 3);
|
|
13
8
|
const colors = new BufferAttribute(buffers.colors, 4);
|
|
14
9
|
const geometry = new BufferGeometry();
|
|
15
10
|
geometry.setAttribute('position', vertices);
|
|
16
11
|
geometry.setAttribute('color', colors);
|
|
12
|
+
debug.set(true);
|
|
17
13
|
useFrame(() => {
|
|
18
14
|
const buffers = world.debugRender();
|
|
19
15
|
const vertices = new BufferAttribute(buffers.vertices, 3);
|
|
@@ -23,8 +19,17 @@ useFrame(() => {
|
|
|
23
19
|
});
|
|
24
20
|
onDestroy(() => {
|
|
25
21
|
geometry.dispose();
|
|
26
|
-
|
|
22
|
+
debug.set(false);
|
|
27
23
|
});
|
|
28
24
|
</script>
|
|
29
25
|
|
|
30
|
-
<LineSegments renderOrder={Infinity}
|
|
26
|
+
<T.LineSegments renderOrder={Infinity}>
|
|
27
|
+
<T
|
|
28
|
+
is={geometry}
|
|
29
|
+
attach="geometry"
|
|
30
|
+
/>
|
|
31
|
+
<T.LineBasicMaterial
|
|
32
|
+
vertexColors
|
|
33
|
+
{...$$restProps}
|
|
34
|
+
/>
|
|
35
|
+
</T.LineSegments>
|