@threlte/rapier 0.1.0 → 0.3.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 +26 -0
- package/dist/components/Colliders/AutoColliders.svelte +6 -1
- package/dist/components/Colliders/Collider.svelte +7 -1
- package/dist/components/Colliders/Collider.svelte.d.ts +32 -3
- package/dist/components/RigidBody/RigidBody.svelte +13 -2
- package/dist/components/RigidBody/RigidBody.svelte.d.ts +32 -8
- package/dist/hooks/useFrameHandler.js +65 -9
- package/dist/hooks/useHasEventListener.d.ts +3 -0
- package/dist/hooks/useHasEventListener.js +11 -0
- package/dist/hooks/useRigidBody.d.ts +1 -1
- package/dist/hooks/useSphericalJoint.js +0 -2
- package/dist/index.d.ts +1 -1
- package/dist/lib/applyColliderActiveEvents.d.ts +4 -0
- package/dist/lib/applyColliderActiveEvents.js +20 -0
- package/dist/types/types.d.ts +22 -2
- package/package.json +2 -2
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @threlte/extras
|
|
2
2
|
|
|
3
|
+
## 0.3.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9d29fc0: removed unused variable
|
|
8
|
+
|
|
9
|
+
## 0.3.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 1a0f305: removed properties "manifold" and "flipped" from contact force event
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 291af9b: Exporting rapier event types for easier method typing
|
|
18
|
+
|
|
19
|
+
## 0.2.0
|
|
20
|
+
|
|
21
|
+
### Minor Changes
|
|
22
|
+
|
|
23
|
+
- 73b533d: Added contact force events and streamlined event management
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- 7d46de2: sensors need events too!
|
|
28
|
+
|
|
3
29
|
## 0.1.0
|
|
4
30
|
|
|
5
31
|
### Minor Changes
|
|
@@ -3,8 +3,10 @@ import { SceneGraphObject } from '@threlte/core';
|
|
|
3
3
|
import { createEventDispatcher, onDestroy, onMount } from 'svelte';
|
|
4
4
|
import { Object3D } from 'three';
|
|
5
5
|
import { useCollisionGroups } from '../../hooks/useCollisionGroups';
|
|
6
|
+
import { useHasEventListeners } from '../../hooks/useHasEventListener';
|
|
6
7
|
import { useRapier } from '../../hooks/useRapier';
|
|
7
8
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
9
|
+
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
8
10
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
9
11
|
import { createCollidersFromChildren } from '../../lib/createCollidersFromChildren';
|
|
10
12
|
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
@@ -19,6 +21,7 @@ export let restitutionCombineRule = undefined;
|
|
|
19
21
|
export let friction = undefined;
|
|
20
22
|
export let frictionCombineRule = undefined;
|
|
21
23
|
export let sensor = undefined;
|
|
24
|
+
export let contactForceEventThreshold = undefined;
|
|
22
25
|
export let density = undefined;
|
|
23
26
|
export let mass = undefined;
|
|
24
27
|
export let massProperties = undefined;
|
|
@@ -33,6 +36,7 @@ const { world, addColliderToContext, removeColliderFromContext } = useRapier();
|
|
|
33
36
|
export let colliders = [];
|
|
34
37
|
const collisionGroups = useCollisionGroups();
|
|
35
38
|
const dispatcher = createEventDispatcher();
|
|
39
|
+
const { hasEventListeners: colliderHasEventListeners } = useHasEventListeners();
|
|
36
40
|
onMount(() => {
|
|
37
41
|
colliders = createCollidersFromChildren(object, shape ?? 'convexHull', world, rigidBody);
|
|
38
42
|
colliders.forEach((c) => addColliderToContext(c, object, dispatcher));
|
|
@@ -41,13 +45,14 @@ onMount(() => {
|
|
|
41
45
|
$: {
|
|
42
46
|
if (colliders.length > 0) {
|
|
43
47
|
colliders.forEach((collider) => {
|
|
44
|
-
collider
|
|
48
|
+
applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
|
|
45
49
|
collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
|
|
46
50
|
collider.setRestitution(restitution ?? 0);
|
|
47
51
|
collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
|
|
48
52
|
collider.setFriction(friction ?? 0.7);
|
|
49
53
|
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
50
54
|
collider.setSensor(sensor ?? false);
|
|
55
|
+
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
51
56
|
if (density)
|
|
52
57
|
collider.setDensity(density);
|
|
53
58
|
if (mass)
|
|
@@ -3,8 +3,10 @@ import { SceneGraphObject, TransformableObject, 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';
|
|
6
|
+
import { useHasEventListeners } from '../../hooks/useHasEventListener';
|
|
6
7
|
import { useRapier } from '../../hooks/useRapier';
|
|
7
8
|
import { useRigidBody } from '../../hooks/useRigidBody';
|
|
9
|
+
import { applyColliderActiveEvents } from '../../lib/applyColliderActiveEvents';
|
|
8
10
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
9
11
|
import { getWorldPosition, getWorldQuaternion } from '../../lib/getWorldTransforms';
|
|
10
12
|
import { positionToVector3 } from '../../lib/positionToVector3';
|
|
@@ -21,6 +23,7 @@ export let restitutionCombineRule = undefined;
|
|
|
21
23
|
export let friction = undefined;
|
|
22
24
|
export let frictionCombineRule = undefined;
|
|
23
25
|
export let sensor = undefined;
|
|
26
|
+
export let contactForceEventThreshold = undefined;
|
|
24
27
|
export let density = undefined;
|
|
25
28
|
export let mass = undefined;
|
|
26
29
|
export let massProperties = undefined;
|
|
@@ -78,15 +81,18 @@ onMount(async () => {
|
|
|
78
81
|
collider.setRotation(object.getWorldQuaternion(new Quaternion()));
|
|
79
82
|
}
|
|
80
83
|
});
|
|
84
|
+
const { hasEventListeners: colliderHasEventListeners } = useHasEventListeners();
|
|
81
85
|
$: {
|
|
82
86
|
if (collider) {
|
|
83
|
-
collider
|
|
87
|
+
applyColliderActiveEvents(collider, colliderHasEventListeners, rigidBody?.userData?.hasEventListeners);
|
|
84
88
|
collider.setActiveCollisionTypes(ActiveCollisionTypes.ALL);
|
|
85
89
|
collider.setRestitution(restitution ?? 0);
|
|
90
|
+
collider.setContactForceEventThreshold(1);
|
|
86
91
|
collider.setRestitutionCombineRule(restitutionCombineRule ?? CoefficientCombineRule.Average);
|
|
87
92
|
collider.setFriction(friction ?? 0.7);
|
|
88
93
|
collider.setFrictionCombineRule(frictionCombineRule ?? CoefficientCombineRule.Average);
|
|
89
94
|
collider.setSensor(sensor ?? false);
|
|
95
|
+
collider.setContactForceEventThreshold(contactForceEventThreshold ?? 0);
|
|
90
96
|
if (density)
|
|
91
97
|
collider.setDensity(density);
|
|
92
98
|
if (mass)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import { CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import { CoefficientCombineRule, Collider, ColliderDesc, type RigidBody } from '@dimforge/rapier3d-compat';
|
|
3
3
|
import { type Position, type Rotation } from '@threlte/core';
|
|
4
|
-
import type { ColliderEventMap } from '../../types/types';
|
|
5
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]>, Density extends number | undefined, Mass extends Density extends undefined ? number | undefined : undefined, MassProperties extends Density extends undefined ? Mass extends undefined ? {
|
|
6
5
|
mass: number;
|
|
7
6
|
centerOfMass: Position;
|
|
@@ -21,6 +20,7 @@ declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | '
|
|
|
21
20
|
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
22
21
|
sensor?: boolean | undefined;
|
|
23
22
|
collider?: Collider | undefined;
|
|
23
|
+
contactForceEventThreshold?: number | undefined;
|
|
24
24
|
density?: Density | undefined;
|
|
25
25
|
} | {
|
|
26
26
|
shape: Shape;
|
|
@@ -35,6 +35,7 @@ declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | '
|
|
|
35
35
|
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
36
36
|
sensor?: boolean | undefined;
|
|
37
37
|
collider?: Collider | undefined;
|
|
38
|
+
contactForceEventThreshold?: number | undefined;
|
|
38
39
|
mass?: Mass | undefined;
|
|
39
40
|
} | {
|
|
40
41
|
shape: Shape;
|
|
@@ -49,10 +50,38 @@ declare class __sveltets_Render<Shape extends 'ball' | 'capsule' | 'segment' | '
|
|
|
49
50
|
frictionCombineRule?: CoefficientCombineRule | undefined;
|
|
50
51
|
sensor?: boolean | undefined;
|
|
51
52
|
collider?: Collider | undefined;
|
|
53
|
+
contactForceEventThreshold?: number | undefined;
|
|
52
54
|
mass?: Mass | undefined;
|
|
53
55
|
massProperties?: MassProperties | undefined;
|
|
54
56
|
};
|
|
55
|
-
events():
|
|
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
|
+
};
|
|
56
85
|
slots(): {
|
|
57
86
|
default: {};
|
|
58
87
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>import { LayerableObject, SceneGraphObject } from '@threlte/core';
|
|
2
2
|
import { createEventDispatcher, onDestroy, setContext, tick } from 'svelte';
|
|
3
3
|
import { Object3D, Vector3 } from 'three';
|
|
4
|
+
import { useHasEventListeners } from '../../hooks/useHasEventListener';
|
|
4
5
|
import { useRapier } from '../../hooks/useRapier';
|
|
5
6
|
import { applyTransforms } from '../../lib/applyTransforms';
|
|
6
7
|
import { getWorldPosition, getWorldQuaternion, getWorldScale } from '../../lib/getWorldTransforms';
|
|
@@ -58,11 +59,14 @@ object.updateWorldMatrix(true, false);
|
|
|
58
59
|
* RigidBody Description
|
|
59
60
|
*/
|
|
60
61
|
const desc = new rapier.RigidBodyDesc(parseRigidBodyType(type)).setCanSleep(canSleep);
|
|
62
|
+
/**
|
|
63
|
+
* Export the rigidBody only after positional initialization
|
|
64
|
+
*/
|
|
61
65
|
export let rigidBody = undefined;
|
|
62
66
|
/**
|
|
63
|
-
* RigidBody init
|
|
67
|
+
* Temporary RigidBody init
|
|
64
68
|
*/
|
|
65
|
-
|
|
69
|
+
const rigidBodyTemp = world.createRigidBody(desc);
|
|
66
70
|
/**
|
|
67
71
|
* Apply transforms after the parent component added "object" to itself
|
|
68
72
|
*/
|
|
@@ -104,6 +108,13 @@ $: {
|
|
|
104
108
|
rigidBodyTemp.setEnabledRotations(...enabledRotations, true);
|
|
105
109
|
rigidBodyTemp.setEnabledTranslations(...enabledTranslations, true);
|
|
106
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Add userData to the rigidBody
|
|
113
|
+
*/
|
|
114
|
+
const { hasEventListeners } = useHasEventListeners();
|
|
115
|
+
rigidBodyTemp.userData = {
|
|
116
|
+
hasEventListeners
|
|
117
|
+
};
|
|
107
118
|
/**
|
|
108
119
|
* Setting the RigidBody context so that colliders can
|
|
109
120
|
* hook onto.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { SvelteComponentTyped } from "svelte";
|
|
2
2
|
import type { RigidBody } from '@dimforge/rapier3d-compat';
|
|
3
3
|
import type { RigidBodyProperties } from '../../types/components';
|
|
4
|
-
import type { RigidBodyEventMap } from '../../types/types';
|
|
5
4
|
declare const __propDef: {
|
|
6
5
|
props: {
|
|
7
6
|
debug?: boolean | undefined;
|
|
@@ -20,23 +19,48 @@ declare const __propDef: {
|
|
|
20
19
|
enabledRotations?: import("../../types/components").Boolean3Array | undefined;
|
|
21
20
|
enabledTranslations?: import("../../types/components").Boolean3Array | undefined;
|
|
22
21
|
dominance?: number | undefined;
|
|
23
|
-
rigidBody?: RigidBody | undefined;
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
26
|
-
*/
|
|
23
|
+
* Export the rigidBody only after positional initialization
|
|
24
|
+
*/ rigidBody?: RigidBody | undefined;
|
|
27
25
|
};
|
|
28
26
|
slots: {
|
|
29
27
|
default: {};
|
|
30
28
|
};
|
|
31
|
-
getters: {
|
|
32
|
-
|
|
29
|
+
getters: {};
|
|
30
|
+
events: {
|
|
31
|
+
collisionenter: CustomEvent<{
|
|
32
|
+
targetCollider: import("@dimforge/rapier3d-compat").Collider;
|
|
33
|
+
targetRigidBody: RigidBody | null;
|
|
34
|
+
manifold: import("@dimforge/rapier3d-compat").TempContactManifold;
|
|
35
|
+
flipped: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
collisionexit: CustomEvent<{
|
|
38
|
+
targetCollider: import("@dimforge/rapier3d-compat").Collider;
|
|
39
|
+
targetRigidBody: RigidBody | null;
|
|
40
|
+
}>;
|
|
41
|
+
sensorenter: CustomEvent<{
|
|
42
|
+
targetCollider: import("@dimforge/rapier3d-compat").Collider;
|
|
43
|
+
targetRigidBody: RigidBody | null;
|
|
44
|
+
}>;
|
|
45
|
+
sensorexit: CustomEvent<{
|
|
46
|
+
targetCollider: import("@dimforge/rapier3d-compat").Collider;
|
|
47
|
+
targetRigidBody: RigidBody | null;
|
|
48
|
+
}>;
|
|
49
|
+
contact: CustomEvent<{
|
|
50
|
+
targetCollider: import("@dimforge/rapier3d-compat").Collider;
|
|
51
|
+
targetRigidBody: RigidBody | null;
|
|
52
|
+
maxForceDirection: import("@dimforge/rapier3d-compat").Vector;
|
|
53
|
+
maxForceMagnitude: number;
|
|
54
|
+
totalForce: import("@dimforge/rapier3d-compat").Vector;
|
|
55
|
+
totalForceMagnitude: number;
|
|
56
|
+
}>;
|
|
57
|
+
sleep: CustomEvent<void>;
|
|
58
|
+
wake: CustomEvent<void>;
|
|
33
59
|
};
|
|
34
|
-
events: RigidBodyEventMap;
|
|
35
60
|
};
|
|
36
61
|
export declare type RigidBodyProps = typeof __propDef.props;
|
|
37
62
|
export declare type RigidBodyEvents = typeof __propDef.events;
|
|
38
63
|
export declare type RigidBodySlots = typeof __propDef.slots;
|
|
39
64
|
export default class RigidBody extends SvelteComponentTyped<RigidBodyProps, RigidBodyEvents, RigidBodySlots> {
|
|
40
|
-
get rigidBodyTemp(): RigidBody;
|
|
41
65
|
}
|
|
42
66
|
export {};
|
|
@@ -1,9 +1,27 @@
|
|
|
1
|
-
import { EventQueue } from '@dimforge/rapier3d-compat';
|
|
1
|
+
import { Collider, EventQueue } from '@dimforge/rapier3d-compat';
|
|
2
2
|
import { useFrame } from '@threlte/core';
|
|
3
3
|
import { Object3D, Quaternion, Vector3 } from 'three';
|
|
4
4
|
const tempObject = new Object3D();
|
|
5
5
|
const tempVector3 = new Vector3();
|
|
6
6
|
const tempQuaternion = new Quaternion();
|
|
7
|
+
const getEventDispatchers = (ctx, collider1, collider2) => {
|
|
8
|
+
const colliderDispatcher1 = ctx.colliderEventDispatchers.get(collider1.handle);
|
|
9
|
+
const colliderDispatcher2 = ctx.colliderEventDispatchers.get(collider2.handle);
|
|
10
|
+
const rigidBody1 = collider1.parent();
|
|
11
|
+
const rigidBody2 = collider2.parent();
|
|
12
|
+
const rigidBodyDispatcher1 = rigidBody1
|
|
13
|
+
? ctx.rigidBodyEventDispatchers.get(rigidBody1.handle)
|
|
14
|
+
: undefined;
|
|
15
|
+
const rigidBodyDispatcher2 = rigidBody2
|
|
16
|
+
? ctx.rigidBodyEventDispatchers.get(rigidBody2.handle)
|
|
17
|
+
: undefined;
|
|
18
|
+
return {
|
|
19
|
+
colliderDispatcher1,
|
|
20
|
+
colliderDispatcher2,
|
|
21
|
+
rigidBodyDispatcher1,
|
|
22
|
+
rigidBodyDispatcher2
|
|
23
|
+
};
|
|
24
|
+
};
|
|
7
25
|
export const useFrameHandler = (ctx) => {
|
|
8
26
|
const eventQueue = new EventQueue(false);
|
|
9
27
|
let time = performance.now();
|
|
@@ -52,6 +70,51 @@ export const useFrameHandler = (ctx) => {
|
|
|
52
70
|
mesh.position.setFromMatrixPosition(tempObject.matrix);
|
|
53
71
|
mesh.rotation.setFromRotationMatrix(tempObject.matrix);
|
|
54
72
|
});
|
|
73
|
+
eventQueue.drainContactForceEvents((e) => {
|
|
74
|
+
const collider1 = world.getCollider(e.collider1());
|
|
75
|
+
const collider2 = world.getCollider(e.collider2());
|
|
76
|
+
// Sanity check
|
|
77
|
+
if (!collider1 || !collider2) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const { colliderDispatcher1, colliderDispatcher2, rigidBodyDispatcher1, rigidBodyDispatcher2 } = getEventDispatchers(ctx, collider1, collider2);
|
|
81
|
+
const rigidBody1 = collider1.parent();
|
|
82
|
+
const rigidBody2 = collider2.parent();
|
|
83
|
+
// Collider events
|
|
84
|
+
colliderDispatcher1?.('contact', {
|
|
85
|
+
targetCollider: collider2,
|
|
86
|
+
targetRigidBody: rigidBody2,
|
|
87
|
+
maxForceDirection: e.maxForceDirection(),
|
|
88
|
+
maxForceMagnitude: e.maxForceMagnitude(),
|
|
89
|
+
totalForce: e.totalForce(),
|
|
90
|
+
totalForceMagnitude: e.totalForceMagnitude()
|
|
91
|
+
});
|
|
92
|
+
colliderDispatcher2?.('contact', {
|
|
93
|
+
targetCollider: collider1,
|
|
94
|
+
targetRigidBody: rigidBody1,
|
|
95
|
+
maxForceDirection: e.maxForceDirection(),
|
|
96
|
+
maxForceMagnitude: e.maxForceMagnitude(),
|
|
97
|
+
totalForce: e.totalForce(),
|
|
98
|
+
totalForceMagnitude: e.totalForceMagnitude()
|
|
99
|
+
});
|
|
100
|
+
// RigidBody Events
|
|
101
|
+
rigidBodyDispatcher1?.('contact', {
|
|
102
|
+
targetCollider: collider2,
|
|
103
|
+
targetRigidBody: rigidBody2,
|
|
104
|
+
maxForceDirection: e.maxForceDirection(),
|
|
105
|
+
maxForceMagnitude: e.maxForceMagnitude(),
|
|
106
|
+
totalForce: e.totalForce(),
|
|
107
|
+
totalForceMagnitude: e.totalForceMagnitude()
|
|
108
|
+
});
|
|
109
|
+
rigidBodyDispatcher2?.('contact', {
|
|
110
|
+
targetCollider: collider1,
|
|
111
|
+
targetRigidBody: rigidBody1,
|
|
112
|
+
maxForceDirection: e.maxForceDirection(),
|
|
113
|
+
maxForceMagnitude: e.maxForceMagnitude(),
|
|
114
|
+
totalForce: e.totalForce(),
|
|
115
|
+
totalForceMagnitude: e.totalForceMagnitude()
|
|
116
|
+
});
|
|
117
|
+
});
|
|
55
118
|
// Collision events
|
|
56
119
|
eventQueue.drainCollisionEvents((handle1, handle2, started) => {
|
|
57
120
|
const collider1 = world.getCollider(handle1);
|
|
@@ -60,16 +123,9 @@ export const useFrameHandler = (ctx) => {
|
|
|
60
123
|
if (!collider1 || !collider2) {
|
|
61
124
|
return;
|
|
62
125
|
}
|
|
63
|
-
const colliderDispatcher1 = ctx
|
|
64
|
-
const colliderDispatcher2 = ctx.colliderEventDispatchers.get(collider2.handle);
|
|
126
|
+
const { colliderDispatcher1, colliderDispatcher2, rigidBodyDispatcher1, rigidBodyDispatcher2 } = getEventDispatchers(ctx, collider1, collider2);
|
|
65
127
|
const rigidBody1 = collider1.parent();
|
|
66
128
|
const rigidBody2 = collider2.parent();
|
|
67
|
-
const rigidBodyDispatcher1 = rigidBody1
|
|
68
|
-
? ctx.rigidBodyEventDispatchers.get(rigidBody1.handle)
|
|
69
|
-
: undefined;
|
|
70
|
-
const rigidBodyDispatcher2 = rigidBody2
|
|
71
|
-
? ctx.rigidBodyEventDispatchers.get(rigidBody2.handle)
|
|
72
|
-
: undefined;
|
|
73
129
|
if (started) {
|
|
74
130
|
// intersections are triggered by sensors
|
|
75
131
|
const isIntersection = world.intersectionPair(collider1, collider2);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { get_current_component } from 'svelte/internal';
|
|
2
|
+
export const useHasEventListeners = () => {
|
|
3
|
+
const component = get_current_component();
|
|
4
|
+
const hasEventListeners = (type) => {
|
|
5
|
+
const callbacks = component.$$.callbacks;
|
|
6
|
+
return type in callbacks && callbacks[type].length > 0;
|
|
7
|
+
};
|
|
8
|
+
return {
|
|
9
|
+
hasEventListeners
|
|
10
|
+
};
|
|
11
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { RigidBodyContext } from '../types/types';
|
|
2
|
-
export declare const useRigidBody: () => RigidBodyContext;
|
|
2
|
+
export declare const useRigidBody: () => RigidBodyContext | undefined;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { navigating } from '$app/stores';
|
|
2
1
|
import { positionToVector3 } from '../lib/positionToVector3';
|
|
3
2
|
import { useJoint } from './useJoint';
|
|
4
3
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
@@ -8,4 +7,3 @@ export const useSphericalJoint = (anchorA, anchorB) => {
|
|
|
8
7
|
return world.createImpulseJoint(params, rbA, rbB, true);
|
|
9
8
|
});
|
|
10
9
|
};
|
|
11
|
-
navigating;
|
package/dist/index.d.ts
CHANGED
|
@@ -13,4 +13,4 @@ export { default as AutoColliders } from './components/Colliders/AutoColliders.s
|
|
|
13
13
|
export { default as CollisionGroups } from './components/CollisionGroups/CollisionGroups.svelte';
|
|
14
14
|
export { default as BasicPlayerController } from './recipes/BasicPlayerController.svelte';
|
|
15
15
|
export type { AutoCollidersProperties, Boolean3Array, RigidBodyProperties, WorldProperties } from './types/components';
|
|
16
|
-
export type { CollisionGroupsBitMask, AutoCollidersShapes, ColliderEventDispatcher, ColliderShapes, RapierContext, RigidBodyEventDispatcher } from './types/types';
|
|
16
|
+
export type { CollisionGroupsBitMask, AutoCollidersShapes, ColliderEventDispatcher, ColliderShapes, RapierContext, RigidBodyEventDispatcher, CollisionEnterEvent, CollisionExitEvent, SensorEnterEvent, SensorExitEvent, ContactEvent } from './types/types';
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Collider } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { useHasEventListeners } from '../hooks/useHasEventListener';
|
|
3
|
+
import type { ColliderEventDispatcher, RigidBodyEventDispatcher } from '../types/types';
|
|
4
|
+
export declare const applyColliderActiveEvents: (collider: Collider, colliderHasEventListeners: ReturnType<typeof useHasEventListeners<ColliderEventDispatcher>>['hasEventListeners'], rigidBodyHasEventListeners?: ReturnType<typeof useHasEventListeners<RigidBodyEventDispatcher>>['hasEventListeners']) => void;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ActiveEvents } from '@dimforge/rapier3d-compat';
|
|
2
|
+
export const applyColliderActiveEvents = (collider, colliderHasEventListeners, rigidBodyHasEventListeners) => {
|
|
3
|
+
let events = 0;
|
|
4
|
+
if (colliderHasEventListeners('collisionenter') ||
|
|
5
|
+
colliderHasEventListeners('collisionexit') ||
|
|
6
|
+
rigidBodyHasEventListeners?.('collisionenter') ||
|
|
7
|
+
rigidBodyHasEventListeners?.('collisionexit') ||
|
|
8
|
+
colliderHasEventListeners('sensorenter') ||
|
|
9
|
+
colliderHasEventListeners('sensorexit') ||
|
|
10
|
+
rigidBodyHasEventListeners?.('sensorenter') ||
|
|
11
|
+
rigidBodyHasEventListeners?.('sensorexit')) {
|
|
12
|
+
events = events | ActiveEvents.COLLISION_EVENTS;
|
|
13
|
+
}
|
|
14
|
+
if (colliderHasEventListeners('contact') || rigidBodyHasEventListeners?.('contact')) {
|
|
15
|
+
events = events | ActiveEvents.CONTACT_FORCE_EVENTS;
|
|
16
|
+
}
|
|
17
|
+
if (events > 0) {
|
|
18
|
+
collider.setActiveEvents(events);
|
|
19
|
+
}
|
|
20
|
+
};
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { createEventDispatcher } from 'svelte';
|
|
2
|
-
import type { RigidBody, RigidBodyHandle, TempContactManifold, ColliderHandle, Collider } from '@dimforge/rapier3d-compat';
|
|
2
|
+
import type { RigidBody, RigidBodyHandle, TempContactManifold, ColliderHandle, Collider, Vector } from '@dimforge/rapier3d-compat';
|
|
3
3
|
import type { createRapierContext } from '../lib/createRapierContext';
|
|
4
4
|
import type { Writable } from 'svelte/store';
|
|
5
|
+
import type { useHasEventListeners } from '../hooks/useHasEventListener';
|
|
5
6
|
export declare type ColliderShapes = 'ball' | 'capsule' | 'segment' | 'triangle' | 'roundTriangle' | 'polyline' | 'trimesh' | 'cuboid' | 'roundCuboid' | 'heightfield' | 'cylinder' | 'roundCylinder' | 'cone' | 'roundCone' | 'convexHull' | 'convexMesh' | 'roundConvexHull' | 'roundConvexMesh';
|
|
6
7
|
export declare type AutoCollidersShapes = 'cuboid' | 'ball' | 'trimesh' | 'convexHull' | 'capsule';
|
|
7
8
|
export declare type ColliderEventMap = {
|
|
@@ -23,7 +24,20 @@ export declare type ColliderEventMap = {
|
|
|
23
24
|
targetCollider: Collider;
|
|
24
25
|
targetRigidBody: RigidBody | null;
|
|
25
26
|
};
|
|
27
|
+
contact: {
|
|
28
|
+
targetCollider: Collider;
|
|
29
|
+
targetRigidBody: RigidBody | null;
|
|
30
|
+
maxForceDirection: Vector;
|
|
31
|
+
maxForceMagnitude: number;
|
|
32
|
+
totalForce: Vector;
|
|
33
|
+
totalForceMagnitude: number;
|
|
34
|
+
};
|
|
26
35
|
};
|
|
36
|
+
export declare type CollisionEnterEvent = CustomEvent<ColliderEventMap['collisionenter']>;
|
|
37
|
+
export declare type CollisionExitEvent = CustomEvent<ColliderEventMap['collisionexit']>;
|
|
38
|
+
export declare type SensorEnterEvent = CustomEvent<ColliderEventMap['sensorenter']>;
|
|
39
|
+
export declare type SensorExitEvent = CustomEvent<ColliderEventMap['sensorexit']>;
|
|
40
|
+
export declare type ContactEvent = CustomEvent<ColliderEventMap['contact']>;
|
|
27
41
|
export declare type RigidBodyEventMap = ColliderEventMap & {
|
|
28
42
|
sleep: void;
|
|
29
43
|
wake: void;
|
|
@@ -34,5 +48,11 @@ export declare type RigidBodyEventDispatchers = Map<RigidBodyHandle, RigidBodyEv
|
|
|
34
48
|
export declare type ColliderEventDispatchers = Map<ColliderHandle, ColliderEventDispatcher>;
|
|
35
49
|
export declare type RapierContext = ReturnType<typeof createRapierContext>;
|
|
36
50
|
export declare type CollisionGroupsContext = Writable<number> | undefined;
|
|
37
|
-
export declare type
|
|
51
|
+
export declare type RigidBodyUserData = {
|
|
52
|
+
hasEventListeners?: ReturnType<typeof useHasEventListeners<RigidBodyEventDispatcher>>['hasEventListeners'];
|
|
53
|
+
};
|
|
54
|
+
export declare type ThrelteRigidBody = RigidBody & {
|
|
55
|
+
userData?: RigidBodyUserData;
|
|
56
|
+
};
|
|
57
|
+
export declare type RigidBodyContext = ThrelteRigidBody;
|
|
38
58
|
export declare type CollisionGroupsBitMask = (0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15)[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@threlte/rapier",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"devDependencies": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"@sveltejs/adapter-auto": "next",
|
|
9
9
|
"@sveltejs/adapter-static": "^1.0.0-next.29",
|
|
10
10
|
"@sveltejs/kit": "next",
|
|
11
|
-
"@threlte/core": "4.3.
|
|
11
|
+
"@threlte/core": "4.3.2",
|
|
12
12
|
"@types/node": "^18.0.3",
|
|
13
13
|
"@types/three": "^0.140.0",
|
|
14
14
|
"@typescript-eslint/eslint-plugin": "^4.31.1",
|