@threlte/rapier 0.1.0 → 0.2.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 CHANGED
@@ -1,5 +1,15 @@
1
1
  # @threlte/extras
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 73b533d: Added contact force events and streamlined event management
8
+
9
+ ### Patch Changes
10
+
11
+ - 7d46de2: sensors need events too!
12
+
3
13
  ## 0.1.0
4
14
 
5
15
  ### 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.setActiveEvents(ActiveEvents.COLLISION_EVENTS);
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.setActiveEvents(ActiveEvents.COLLISION_EVENTS);
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,40 @@ 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(): ColliderEventMap;
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
+ manifold: import("@dimforge/rapier3d-compat").TempContactManifold;
80
+ flipped: boolean;
81
+ maxForceDirection: import("@dimforge/rapier3d-compat").Vector;
82
+ maxForceMagnitude: number;
83
+ totalForce: import("@dimforge/rapier3d-compat").Vector;
84
+ totalForceMagnitude: number;
85
+ }>;
86
+ };
56
87
  slots(): {
57
88
  default: {};
58
89
  };
@@ -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
- export const rigidBodyTemp = world.createRigidBody(desc);
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,50 @@ 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
- * RigidBody init
26
- */ rigidBodyTemp?: RigidBody | undefined;
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
- rigidBodyTemp: RigidBody;
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
+ manifold: import("@dimforge/rapier3d-compat").TempContactManifold;
53
+ flipped: boolean;
54
+ maxForceDirection: import("@dimforge/rapier3d-compat").Vector;
55
+ maxForceMagnitude: number;
56
+ totalForce: import("@dimforge/rapier3d-compat").Vector;
57
+ totalForceMagnitude: number;
58
+ }>;
59
+ sleep: CustomEvent<void>;
60
+ wake: CustomEvent<void>;
33
61
  };
34
- events: RigidBodyEventMap;
35
62
  };
36
63
  export declare type RigidBodyProps = typeof __propDef.props;
37
64
  export declare type RigidBodyEvents = typeof __propDef.events;
38
65
  export declare type RigidBodySlots = typeof __propDef.slots;
39
66
  export default class RigidBody extends SvelteComponentTyped<RigidBodyProps, RigidBodyEvents, RigidBodySlots> {
40
- get rigidBodyTemp(): RigidBody;
41
67
  }
42
68
  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,61 @@ 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
+ world.contactPair(collider1, collider2, (manifold, flipped) => {
84
+ // Collider events
85
+ colliderDispatcher1?.('contact', {
86
+ flipped,
87
+ manifold,
88
+ targetCollider: collider2,
89
+ targetRigidBody: rigidBody2,
90
+ maxForceDirection: e.maxForceDirection(),
91
+ maxForceMagnitude: e.maxForceMagnitude(),
92
+ totalForce: e.totalForce(),
93
+ totalForceMagnitude: e.totalForceMagnitude()
94
+ });
95
+ colliderDispatcher2?.('contact', {
96
+ flipped,
97
+ manifold,
98
+ targetCollider: collider1,
99
+ targetRigidBody: rigidBody1,
100
+ maxForceDirection: e.maxForceDirection(),
101
+ maxForceMagnitude: e.maxForceMagnitude(),
102
+ totalForce: e.totalForce(),
103
+ totalForceMagnitude: e.totalForceMagnitude()
104
+ });
105
+ // RigidBody Events
106
+ rigidBodyDispatcher1?.('contact', {
107
+ flipped,
108
+ manifold,
109
+ targetCollider: collider2,
110
+ targetRigidBody: rigidBody2,
111
+ maxForceDirection: e.maxForceDirection(),
112
+ maxForceMagnitude: e.maxForceMagnitude(),
113
+ totalForce: e.totalForce(),
114
+ totalForceMagnitude: e.totalForceMagnitude()
115
+ });
116
+ rigidBodyDispatcher2?.('contact', {
117
+ flipped,
118
+ manifold,
119
+ targetCollider: collider1,
120
+ targetRigidBody: rigidBody1,
121
+ maxForceDirection: e.maxForceDirection(),
122
+ maxForceMagnitude: e.maxForceMagnitude(),
123
+ totalForce: e.totalForce(),
124
+ totalForceMagnitude: e.totalForceMagnitude()
125
+ });
126
+ });
127
+ });
55
128
  // Collision events
56
129
  eventQueue.drainCollisionEvents((handle1, handle2, started) => {
57
130
  const collider1 = world.getCollider(handle1);
@@ -60,16 +133,9 @@ export const useFrameHandler = (ctx) => {
60
133
  if (!collider1 || !collider2) {
61
134
  return;
62
135
  }
63
- const colliderDispatcher1 = ctx.colliderEventDispatchers.get(collider1.handle);
64
- const colliderDispatcher2 = ctx.colliderEventDispatchers.get(collider2.handle);
136
+ const { colliderDispatcher1, colliderDispatcher2, rigidBodyDispatcher1, rigidBodyDispatcher2 } = getEventDispatchers(ctx, collider1, collider2);
65
137
  const rigidBody1 = collider1.parent();
66
138
  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
139
  if (started) {
74
140
  // intersections are triggered by sensors
75
141
  const isIntersection = world.intersectionPair(collider1, collider2);
@@ -0,0 +1,3 @@
1
+ export declare const useHasEventListeners: <T extends (type: any) => any = any>() => {
2
+ hasEventListeners: (type: Parameters<T>[0]) => boolean;
3
+ };
@@ -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;
@@ -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
+ };
@@ -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,6 +24,16 @@ 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
+ manifold: TempContactManifold;
31
+ flipped: boolean;
32
+ maxForceDirection: Vector;
33
+ maxForceMagnitude: number;
34
+ totalForce: Vector;
35
+ totalForceMagnitude: number;
36
+ };
26
37
  };
27
38
  export declare type RigidBodyEventMap = ColliderEventMap & {
28
39
  sleep: void;
@@ -34,5 +45,11 @@ export declare type RigidBodyEventDispatchers = Map<RigidBodyHandle, RigidBodyEv
34
45
  export declare type ColliderEventDispatchers = Map<ColliderHandle, ColliderEventDispatcher>;
35
46
  export declare type RapierContext = ReturnType<typeof createRapierContext>;
36
47
  export declare type CollisionGroupsContext = Writable<number> | undefined;
37
- export declare type RigidBodyContext = RigidBody;
48
+ export declare type RigidBodyUserData = {
49
+ hasEventListeners?: ReturnType<typeof useHasEventListeners<RigidBodyEventDispatcher>>['hasEventListeners'];
50
+ };
51
+ export declare type ThrelteRigidBody = RigidBody & {
52
+ userData?: RigidBodyUserData;
53
+ };
54
+ export declare type RigidBodyContext = ThrelteRigidBody;
38
55
  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.0",
3
+ "version": "0.2.0",
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.1",
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",