@threlte/rapier 1.1.4 → 2.0.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.
@@ -1,4 +1,4 @@
1
- <script>import { T, useFrame } from '@threlte/core';
1
+ <script>import { T, useTask } from '@threlte/core';
2
2
  import { Group, Vector3 } from 'three';
3
3
  import { useRapier } from '../../hooks/useRapier';
4
4
  export let strength = 1;
@@ -13,14 +13,15 @@ const calcForceByType = {
13
13
  linear: (s, m2, r, d, G) => s * (d / r),
14
14
  newtonian: (s, m2, r, d, G) => (G * s * m2) / Math.pow(d, 2)
15
15
  };
16
+ const impulseVector = new Vector3();
17
+ const bodyV3 = new Vector3();
16
18
  function applyImpulseToBodiesInRange() {
17
- const impulseVector = new Vector3();
18
19
  obj.getWorldPosition(gravitySource);
19
20
  world.forEachRigidBody((body) => {
20
21
  const { x, y, z } = body.translation();
21
- const bodyV3 = new Vector3(x, y, z);
22
- const distance = gravitySource.distanceTo(bodyV3);
23
- if (distance < range) {
22
+ bodyV3.set(x, y, z);
23
+ const distance = gravitySource.distanceToSquared(bodyV3);
24
+ if (distance < range ** 2) {
24
25
  let force = calcForceByType[gravityType](strength, body.mass(), range, distance, gravitationalConstant);
25
26
  // Prevent wild forces when Attractors collide
26
27
  force = force === Infinity ? strength : force;
@@ -29,7 +30,7 @@ function applyImpulseToBodiesInRange() {
29
30
  }
30
31
  });
31
32
  }
32
- useFrame(() => {
33
+ useTask(() => {
33
34
  applyImpulseToBodiesInRange();
34
35
  });
35
36
  </script>
@@ -1,5 +1,5 @@
1
1
  <script>import { ActiveCollisionTypes, CoefficientCombineRule, Collider, ColliderDesc } from '@dimforge/rapier3d-compat';
2
- import { createRawEventDispatcher, SceneGraphObject, useFrame } from '@threlte/core';
2
+ import { createRawEventDispatcher, SceneGraphObject, useTask } from '@threlte/core';
3
3
  import { onDestroy, onMount, tick } from 'svelte';
4
4
  import { Object3D, Quaternion, Vector3 } from 'three';
5
5
  import { useCollisionGroups } from '../../hooks/useCollisionGroups';
@@ -109,10 +109,10 @@ export const refresh = () => {
109
109
  * If the Collider isAttached (i.e. NOT child of a RigidBody), update the
110
110
  * transforms on every frame.
111
111
  */
112
- const { start, stop } = useFrame(() => {
112
+ const { start, stop } = useTask(() => {
113
113
  refresh();
114
114
  }, {
115
- autostart: !hasRigidBodyParent && type === 'dynamic'
115
+ autoStart: !hasRigidBodyParent && type === 'dynamic'
116
116
  });
117
117
  $: {
118
118
  if (!hasRigidBodyParent && type === 'dynamic')
@@ -1,11 +1,11 @@
1
- <script>import { T, useFrame } from '@threlte/core';
1
+ <script>import { T, useTask } from '@threlte/core';
2
2
  import { onDestroy } from 'svelte';
3
3
  import { BufferAttribute, BufferGeometry } from 'three';
4
4
  import { useRapier } from '../../hooks/useRapier';
5
5
  const { world, debug } = useRapier();
6
6
  const geometry = new BufferGeometry();
7
7
  debug.set(true);
8
- useFrame(() => {
8
+ useTask(() => {
9
9
  const buffers = world.debugRender();
10
10
  const vertices = new BufferAttribute(buffers.vertices, 3);
11
11
  const colors = new BufferAttribute(buffers.colors, 4);
@@ -20,13 +20,13 @@ export let rawQueryPipeline = undefined;
20
20
  export let rawPhysicsPipeline = undefined;
21
21
  export let rawSerializationPipeline = undefined;
22
22
  export let rawDebugRenderPipeline = undefined;
23
- export let order = undefined;
23
+ export let stage = undefined;
24
24
  const rapierContext = createRapierContext({ x: gravity[0], y: gravity[1], z: gravity[2] }, rawIntegrationParameters, rawIslands, rawBroadPhase, rawNarrowPhase, rawBodies, rawColliders, rawImpulseJoints, rawMultibodyJoints, rawCCDSolver, rawQueryPipeline, rawPhysicsPipeline, rawSerializationPipeline, rawDebugRenderPipeline);
25
25
  setContext('threlte-rapier-context', rapierContext);
26
26
  $: if (gravity !== undefined) {
27
27
  rapierContext.world.gravity = { x: gravity[0], y: gravity[1], z: gravity[2] };
28
28
  }
29
- useFrameHandler(rapierContext, order);
29
+ useFrameHandler(rapierContext, stage);
30
30
  onDestroy(async () => {
31
31
  await tick();
32
32
  rapierContext.world.free();
@@ -15,7 +15,7 @@ declare const __propDef: {
15
15
  rawPhysicsPipeline?: import("@dimforge/rapier3d-compat/rapier_wasm3d").RawPhysicsPipeline | undefined;
16
16
  rawSerializationPipeline?: import("@dimforge/rapier3d-compat/rapier_wasm3d").RawSerializationPipeline | undefined;
17
17
  rawDebugRenderPipeline?: import("@dimforge/rapier3d-compat/rapier_wasm3d").RawDebugRenderPipeline | undefined;
18
- order?: number | undefined;
18
+ stage?: import("@threlte/core").Key | import("@threlte/core").Stage | undefined;
19
19
  };
20
20
  events: {
21
21
  [evt: string]: CustomEvent<any>;
@@ -27,11 +27,11 @@ export let rawPhysicsPipeline = undefined;
27
27
  export let rawSerializationPipeline = undefined;
28
28
  export let rawDebugRenderPipeline = undefined;
29
29
  /**
30
- * The property order is passed to the useFrame handler.
30
+ * This is passed to the useTask handler.
31
31
  * Use this to control when the rapier physics engine is updating the scene.
32
32
  * @default undefined
33
33
  */
34
- export let order = undefined;
34
+ export let stage = undefined;
35
35
  let error = false;
36
36
  const init = async () => {
37
37
  if ($initialized)
@@ -63,7 +63,7 @@ onMount(init);
63
63
  {rawPhysicsPipeline}
64
64
  {rawSerializationPipeline}
65
65
  {rawDebugRenderPipeline}
66
- {order}
66
+ {stage}
67
67
  >
68
68
  <slot />
69
69
  </InnerWorld>
@@ -13,8 +13,9 @@ import type {
13
13
  RawRigidBodySet,
14
14
  RawSerializationPipeline
15
15
  } from '@dimforge/rapier3d-compat/raw'
16
- import { SvelteComponentTyped } from 'svelte'
16
+ import { SvelteComponent } from 'svelte'
17
17
  import type { Vector3 } from 'three'
18
+ import type { Key, Stage } from '@threlte/core'
18
19
 
19
20
  export type WorldProps = {
20
21
  gravity?: Parameters<Vector3['set']>
@@ -31,7 +32,7 @@ export type WorldProps = {
31
32
  rawPhysicsPipeline?: RawPhysicsPipeline
32
33
  rawSerializationPipeline?: RawSerializationPipeline
33
34
  rawDebugRenderPipeline?: RawDebugRenderPipeline
34
- order?: number
35
+ stage?: Key | Stage
35
36
  }
36
37
 
37
- export default class World extends SvelteComponentTyped<WorldProps> {}
38
+ export default class World extends SvelteComponent<WorldProps> {}
@@ -1,2 +1,3 @@
1
+ import { type Stage, type Key } from '@threlte/core';
1
2
  import type { RapierContext } from '../types/types';
2
- export declare const useFrameHandler: (ctx: RapierContext, order?: number) => void;
3
+ export declare const useFrameHandler: (ctx: RapierContext, stage?: Stage | Key) => void;
@@ -1,5 +1,5 @@
1
1
  import { Collider, EventQueue } from '@dimforge/rapier3d-compat';
2
- import { useFrame } from '@threlte/core';
2
+ import { useTask } from '@threlte/core';
3
3
  import { derived } from 'svelte/store';
4
4
  import { Object3D, Quaternion, Vector3 } from 'three';
5
5
  const tempObject = new Object3D();
@@ -23,9 +23,9 @@ const getEventDispatchers = (ctx, collider1, collider2) => {
23
23
  rigidBodyDispatcher2
24
24
  };
25
25
  };
26
- export const useFrameHandler = (ctx, order) => {
26
+ export const useFrameHandler = (ctx, stage) => {
27
27
  const eventQueue = new EventQueue(false);
28
- const { start, started, stop } = useFrame((_, delta) => {
28
+ const { start, started, stop } = useTask((delta) => {
29
29
  // if (!eventQueue) return
30
30
  const { world } = ctx;
31
31
  // Set timestep to current delta, to allow for variable frame rates
@@ -122,6 +122,12 @@ export const useFrameHandler = (ctx, order) => {
122
122
  return;
123
123
  }
124
124
  const { colliderDispatcher1, colliderDispatcher2, rigidBodyDispatcher1, rigidBodyDispatcher2 } = getEventDispatchers(ctx, collider1, collider2);
125
+ if (!colliderDispatcher1 &&
126
+ !colliderDispatcher2 &&
127
+ !rigidBodyDispatcher1 &&
128
+ !rigidBodyDispatcher2) {
129
+ return;
130
+ }
125
131
  const rigidBody1 = collider1.parent();
126
132
  const rigidBody2 = collider2.parent();
127
133
  if (started) {
@@ -225,7 +231,7 @@ export const useFrameHandler = (ctx, order) => {
225
231
  });
226
232
  }
227
233
  });
228
- }, { order });
234
+ }, { stage });
229
235
  // replacing the original pause and resume functions as well as the paused property
230
236
  ctx.pause = () => stop();
231
237
  ctx.resume = () => start();
@@ -1,4 +1,4 @@
1
- <script>import { createRawEventDispatcher, T, useFrame } from '@threlte/core';
1
+ <script>import { createRawEventDispatcher, T, useTask } from '@threlte/core';
2
2
  import { Vector2, Vector3 } from 'three';
3
3
  import Collider from '../components/Colliders/Collider.svelte';
4
4
  import CollisionGroups from '../components/CollisionGroups/CollisionGroups.svelte';
@@ -29,10 +29,8 @@ $: {
29
29
  grounded = true;
30
30
  }
31
31
  $: grounded ? dispatch('groundenter') : dispatch('groundexit');
32
- useFrame(() => {
33
- if (!rigidBody)
34
- return;
35
- t.fromArray([0, 0, 0]);
32
+ const { start } = useTask(() => {
33
+ t.set(0, 0, 0);
36
34
  if (keys.down)
37
35
  t.x += 1;
38
36
  if (keys.up)
@@ -53,18 +51,24 @@ useFrame(() => {
53
51
  t.y = linVel.y;
54
52
  rigidBody.setLinvel(t, true);
55
53
  });
54
+ $: if (rigidBody)
55
+ start();
56
56
  const onKeyDown = (e) => {
57
- switch (e.key) {
58
- case 'ArrowDown':
57
+ switch (e.key.toLowerCase()) {
58
+ case 's':
59
+ case 'arrowdown':
59
60
  keys.down = true;
60
61
  break;
61
- case 'ArrowUp':
62
+ case 'w':
63
+ case 'arrowup':
62
64
  keys.up = true;
63
65
  break;
64
- case 'ArrowLeft':
66
+ case 'a':
67
+ case 'arrowleft':
65
68
  keys.left = true;
66
69
  break;
67
- case 'ArrowRight':
70
+ case 'd':
71
+ case 'arrowright':
68
72
  keys.right = true;
69
73
  break;
70
74
  case ' ':
@@ -76,17 +80,21 @@ const onKeyDown = (e) => {
76
80
  }
77
81
  };
78
82
  const onKeyUp = (e) => {
79
- switch (e.key) {
80
- case 'ArrowDown':
83
+ switch (e.key.toLowerCase()) {
84
+ case 's':
85
+ case 'arrowdown':
81
86
  keys.down = false;
82
87
  break;
83
- case 'ArrowUp':
88
+ case 'w':
89
+ case 'arrowup':
84
90
  keys.up = false;
85
91
  break;
86
- case 'ArrowLeft':
92
+ case 'a':
93
+ case 'arrowleft':
87
94
  keys.left = false;
88
95
  break;
89
- case 'ArrowRight':
96
+ case 'd':
97
+ case 'arrowright':
90
98
  keys.right = false;
91
99
  break;
92
100
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threlte/rapier",
3
- "version": "1.1.4",
3
+ "version": "2.0.0",
4
4
  "author": "Grischa Erbe <hello@legrisch.com> (https://legrisch.com)",
5
5
  "license": "MIT",
6
6
  "devDependencies": {
@@ -27,7 +27,7 @@
27
27
  "type-fest": "^2.13.0",
28
28
  "typescript": "^5.0.0",
29
29
  "vite": "^4.3.6",
30
- "@threlte/core": "7.0.4"
30
+ "@threlte/core": "7.0.12"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "svelte": ">=4",
@@ -47,6 +47,7 @@
47
47
  "dist"
48
48
  ],
49
49
  "scripts": {
50
+ "dev": "vite dev",
50
51
  "package": "svelte-kit sync && svelte-package && node ./scripts/cleanupPackage.js && publint",
51
52
  "check": "svelte-check --tsconfig ./tsconfig.json",
52
53
  "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",