angular-three-cannon 2.0.0-beta.9 → 2.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.
Files changed (49) hide show
  1. package/README.md +71 -4
  2. package/body/README.md +49 -0
  3. package/body/index.d.ts +2 -0
  4. package/body/lib/body.d.ts +17 -0
  5. package/body/lib/types.d.ts +49 -0
  6. package/body/lib/utils.d.ts +50 -0
  7. package/constraint/README.md +47 -0
  8. package/constraint/index.d.ts +1 -0
  9. package/constraint/lib/constraint.d.ts +32 -0
  10. package/debug/README.md +48 -2
  11. package/debug/lib/debug.d.ts +15 -33
  12. package/esm2022/body/angular-three-cannon-body.mjs +5 -0
  13. package/esm2022/body/index.mjs +2 -0
  14. package/esm2022/body/lib/body.mjs +108 -0
  15. package/esm2022/body/lib/types.mjs +2 -0
  16. package/esm2022/body/lib/utils.mjs +193 -0
  17. package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
  18. package/esm2022/constraint/index.mjs +2 -0
  19. package/esm2022/constraint/lib/constraint.mjs +67 -0
  20. package/esm2022/debug/lib/debug.mjs +56 -71
  21. package/esm2022/lib/physics.mjs +79 -176
  22. package/fesm2022/angular-three-cannon-body.mjs +306 -0
  23. package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
  24. package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
  25. package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
  26. package/fesm2022/angular-three-cannon-debug.mjs +56 -71
  27. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  28. package/fesm2022/angular-three-cannon.mjs +79 -176
  29. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  30. package/lib/physics.d.ts +31 -49
  31. package/package.json +25 -15
  32. package/esm2022/services/angular-three-cannon-services.mjs +0 -5
  33. package/esm2022/services/index.mjs +0 -7
  34. package/esm2022/services/lib/body.mjs +0 -293
  35. package/esm2022/services/lib/constraints.mjs +0 -58
  36. package/esm2022/services/lib/contact-material.mjs +0 -20
  37. package/esm2022/services/lib/ray.mjs +0 -30
  38. package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
  39. package/esm2022/services/lib/spring.mjs +0 -31
  40. package/fesm2022/angular-three-cannon-services.mjs +0 -490
  41. package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
  42. package/services/README.md +0 -3
  43. package/services/index.d.ts +0 -6
  44. package/services/lib/body.d.ts +0 -60
  45. package/services/lib/constraints.d.ts +0 -31
  46. package/services/lib/contact-material.d.ts +0 -9
  47. package/services/lib/ray.d.ts +0 -12
  48. package/services/lib/raycast-vehicle.d.ts +0 -30
  49. package/services/lib/spring.d.ts +0 -19
@@ -0,0 +1,306 @@
1
+ import { inject, isSignal, signal, computed, effect, untracked } from '@angular/core';
2
+ import { resolveRef } from 'angular-three';
3
+ import { NgtcPhysics } from 'angular-three-cannon';
4
+ import { NgtcDebug } from 'angular-three-cannon/debug';
5
+ import { assertInjector } from 'ngxtension/assert-injector';
6
+ import { Euler, Quaternion, Vector3, InstancedMesh, DynamicDrawUsage, Object3D } from 'three';
7
+
8
+ function capitalize(str) {
9
+ return (str.charAt(0).toUpperCase() + str.slice(1));
10
+ }
11
+ function getUUID(body, index) {
12
+ const suffix = index === undefined ? '' : `/${index}`;
13
+ if (typeof body === 'function')
14
+ return null;
15
+ return body && body && `${body.uuid}${suffix}`;
16
+ }
17
+ const e = new Euler();
18
+ const q = new Quaternion();
19
+ function quaternionToRotation(callback) {
20
+ return (v) => callback(e.setFromQuaternion(q.fromArray(v)).toArray());
21
+ }
22
+ let incrementingId = 0;
23
+ function createSubscribe(body, worker, subscriptions, type, index, target = 'bodies') {
24
+ return (callback) => {
25
+ const id = incrementingId++;
26
+ subscriptions[id] = { [type]: callback };
27
+ const uuid = getUUID(body, index);
28
+ uuid && worker.subscribe({ props: { id, target, type }, uuid });
29
+ return () => {
30
+ delete subscriptions[id];
31
+ worker.unsubscribe({ props: id });
32
+ };
33
+ };
34
+ }
35
+ function makeTriplet(v) {
36
+ return v instanceof Vector3 ? [v.x, v.y, v.z] : v;
37
+ }
38
+ function prepare(object, { position = [0, 0, 0], rotation = [0, 0, 0], userData = {} }) {
39
+ object.userData = userData;
40
+ object.position.set(...position);
41
+ object.rotation.set(...rotation);
42
+ object.updateMatrix();
43
+ }
44
+ function setupCollision(events, { onCollide, onCollideBegin, onCollideEnd }, uuid) {
45
+ events[uuid] = { collide: onCollide, collideBegin: onCollideBegin, collideEnd: onCollideEnd };
46
+ }
47
+ function makeBodyApi(body, worker, { subscriptions, scaleOverrides }) {
48
+ const makeAtomic = (type, index) => {
49
+ const op = `set${capitalize(type)}`;
50
+ return {
51
+ set: (value) => {
52
+ const uuid = getUUID(body, index);
53
+ uuid && worker[op]({ props: value, uuid });
54
+ },
55
+ subscribe: createSubscribe(body, worker, subscriptions, type, index),
56
+ };
57
+ };
58
+ const makeQuaternion = (index) => {
59
+ const type = 'quaternion';
60
+ return {
61
+ copy: ({ w, x, y, z }) => {
62
+ const uuid = getUUID(body, index);
63
+ uuid && worker.setQuaternion({ props: [x, y, z, w], uuid });
64
+ },
65
+ set: (x, y, z, w) => {
66
+ const uuid = getUUID(body, index);
67
+ uuid && worker.setQuaternion({ props: [x, y, z, w], uuid });
68
+ },
69
+ subscribe: createSubscribe(body, worker, subscriptions, type, index),
70
+ };
71
+ };
72
+ const makeRotation = (index) => {
73
+ return {
74
+ copy: ({ x, y, z }) => {
75
+ const uuid = getUUID(body, index);
76
+ uuid && worker.setRotation({ props: [x, y, z], uuid });
77
+ },
78
+ set: (x, y, z) => {
79
+ const uuid = getUUID(body, index);
80
+ uuid && worker.setRotation({ props: [x, y, z], uuid });
81
+ },
82
+ subscribe: (callback) => {
83
+ const id = incrementingId++;
84
+ const target = 'bodies';
85
+ const type = 'quaternion';
86
+ const uuid = getUUID(body, index);
87
+ subscriptions[id] = { [type]: quaternionToRotation(callback) };
88
+ uuid && worker.subscribe({ props: { id, target, type }, uuid });
89
+ return () => {
90
+ delete subscriptions[id];
91
+ worker.unsubscribe({ props: id });
92
+ };
93
+ },
94
+ };
95
+ };
96
+ const makeVec = (type, index) => {
97
+ const op = `set${capitalize(type)}`;
98
+ return {
99
+ copy: ({ x, y, z }) => {
100
+ const uuid = getUUID(body, index);
101
+ uuid && worker[op]({ props: [x, y, z], uuid });
102
+ },
103
+ set: (x, y, z) => {
104
+ const uuid = getUUID(body, index);
105
+ uuid && worker[op]({ props: [x, y, z], uuid });
106
+ },
107
+ subscribe: createSubscribe(body, worker, subscriptions, type, index),
108
+ };
109
+ };
110
+ const makeRemove = (index) => {
111
+ const uuid = getUUID(body, index);
112
+ return () => {
113
+ if (uuid)
114
+ worker.removeBodies({ uuid: [uuid] });
115
+ };
116
+ };
117
+ function makeApi(index) {
118
+ return {
119
+ allowSleep: makeAtomic('allowSleep', index),
120
+ angularDamping: makeAtomic('angularDamping', index),
121
+ angularFactor: makeVec('angularFactor', index),
122
+ angularVelocity: makeVec('angularVelocity', index),
123
+ applyForce(force, worldPoint) {
124
+ const uuid = getUUID(body, index);
125
+ uuid && worker.applyForce({ props: [force, worldPoint], uuid });
126
+ },
127
+ applyImpulse(impulse, worldPoint) {
128
+ const uuid = getUUID(body, index);
129
+ uuid && worker.applyImpulse({ props: [impulse, worldPoint], uuid });
130
+ },
131
+ applyLocalForce(force, localPoint) {
132
+ const uuid = getUUID(body, index);
133
+ uuid && worker.applyLocalForce({ props: [force, localPoint], uuid });
134
+ },
135
+ applyLocalImpulse(impulse, localPoint) {
136
+ const uuid = getUUID(body, index);
137
+ uuid && worker.applyLocalImpulse({ props: [impulse, localPoint], uuid });
138
+ },
139
+ applyTorque(torque) {
140
+ const uuid = getUUID(body, index);
141
+ uuid && worker.applyTorque({ props: [torque], uuid });
142
+ },
143
+ collisionFilterGroup: makeAtomic('collisionFilterGroup', index),
144
+ collisionFilterMask: makeAtomic('collisionFilterMask', index),
145
+ collisionResponse: makeAtomic('collisionResponse', index),
146
+ fixedRotation: makeAtomic('fixedRotation', index),
147
+ isTrigger: makeAtomic('isTrigger', index),
148
+ linearDamping: makeAtomic('linearDamping', index),
149
+ linearFactor: makeVec('linearFactor', index),
150
+ mass: makeAtomic('mass', index),
151
+ material: makeAtomic('material', index),
152
+ position: makeVec('position', index),
153
+ quaternion: makeQuaternion(index),
154
+ rotation: makeRotation(index),
155
+ scaleOverride(scale) {
156
+ const uuid = getUUID(body, index);
157
+ if (uuid)
158
+ scaleOverrides[uuid] = new Vector3(...scale);
159
+ },
160
+ sleep() {
161
+ const uuid = getUUID(body, index);
162
+ uuid && worker.sleep({ uuid });
163
+ },
164
+ sleepSpeedLimit: makeAtomic('sleepSpeedLimit', index),
165
+ sleepTimeLimit: makeAtomic('sleepTimeLimit', index),
166
+ userData: makeAtomic('userData', index),
167
+ velocity: makeVec('velocity', index),
168
+ remove: makeRemove(index),
169
+ wakeUp() {
170
+ const uuid = getUUID(body, index);
171
+ uuid && worker.wakeUp({ uuid });
172
+ },
173
+ };
174
+ }
175
+ const cache = {};
176
+ return { ...makeApi(), at: (index) => cache[index] || (cache[index] = makeApi(index)) };
177
+ }
178
+ const defaultTransformArgs = {
179
+ Plane: (_) => [],
180
+ Box: (args = [1, 1, 1]) => args,
181
+ Trimesh: (args) => args,
182
+ Cylinder: (_ = []) => [],
183
+ Heightfield: (args) => args,
184
+ ConvexPolyhedron: ([vertices, faces, normals, axes, boundingSphereRadius] = []) => [
185
+ vertices && vertices.map(makeTriplet),
186
+ faces,
187
+ normals && normals.map(makeTriplet),
188
+ axes && axes.map(makeTriplet),
189
+ boundingSphereRadius,
190
+ ],
191
+ Particle: (_) => [],
192
+ Sphere: (args = [1]) => {
193
+ if (!Array.isArray(args))
194
+ throw new Error('Sphere body args must be an array');
195
+ return [args[0]];
196
+ },
197
+ Compound: (args) => args,
198
+ };
199
+
200
+ function createInjectBody(type) {
201
+ return (getPropFn, ref, options) => injectBody(type, getPropFn, ref, options);
202
+ }
203
+ function injectBody(type, getPropFn, ref, { transformArgs, injector } = {}) {
204
+ return assertInjector(injectBody, injector, () => {
205
+ const physics = inject(NgtcPhysics, { optional: true });
206
+ if (!physics) {
207
+ throw new Error(`[NGT Cannon] injectBody was called outside of <ngtc-physics>`);
208
+ }
209
+ const debug = inject(NgtcDebug, { optional: true });
210
+ const transform = transformArgs ?? defaultTransformArgs[type];
211
+ const bodyRef = isSignal(ref) ? ref : signal(ref);
212
+ const body = computed(() => resolveRef(bodyRef()));
213
+ const api = computed(() => {
214
+ const _body = body();
215
+ if (!_body)
216
+ return null;
217
+ const { worker, ...rest } = physics.api;
218
+ if (!worker())
219
+ return null;
220
+ return makeBodyApi(_body, worker(), rest);
221
+ });
222
+ effect((onCleanup) => {
223
+ const currentWorker = physics.api.worker();
224
+ if (!currentWorker)
225
+ return;
226
+ const object = body();
227
+ if (!isSignal(ref) && !object) {
228
+ untracked(() => {
229
+ bodyRef.set(resolveRef(ref));
230
+ });
231
+ return;
232
+ }
233
+ if (!object)
234
+ return;
235
+ const [uuid, props] = (() => {
236
+ let uuids = [];
237
+ let temp;
238
+ if (object instanceof InstancedMesh) {
239
+ object.instanceMatrix.setUsage(DynamicDrawUsage);
240
+ uuids = new Array(object.count).fill(0).map((_, i) => `${object.uuid}/${i}`);
241
+ temp = new Object3D();
242
+ }
243
+ else {
244
+ uuids = [object.uuid];
245
+ }
246
+ return [
247
+ uuids,
248
+ uuids.map((id, index) => {
249
+ const props = getPropFn(index);
250
+ if (temp) {
251
+ prepare(temp, props);
252
+ object.setMatrixAt(index, temp.matrix);
253
+ object.instanceMatrix.needsUpdate = true;
254
+ }
255
+ else {
256
+ prepare(object, props);
257
+ }
258
+ physics.api.refs[id] = object;
259
+ debug?.add(id, props, type);
260
+ setupCollision(physics.api.events, props, id);
261
+ // @ts-expect-error - if args is undefined, there's default
262
+ return { ...props, args: transform(props.args) };
263
+ }),
264
+ ];
265
+ })();
266
+ // Register on mount, unregister on unmount
267
+ currentWorker.addBodies({
268
+ props: props.map(({ onCollide, onCollideBegin, onCollideEnd, ...serializableProps }) => {
269
+ return {
270
+ onCollide: Boolean(onCollide),
271
+ onCollideBegin: Boolean(onCollideBegin),
272
+ onCollideEnd: Boolean(onCollideEnd),
273
+ ...serializableProps,
274
+ };
275
+ }),
276
+ type,
277
+ uuid,
278
+ });
279
+ onCleanup(() => {
280
+ uuid.forEach((id) => {
281
+ delete physics.api.refs[id];
282
+ debug?.remove(id);
283
+ delete physics.api.events[id];
284
+ });
285
+ currentWorker.removeBodies({ uuid });
286
+ });
287
+ });
288
+ return api;
289
+ });
290
+ }
291
+ const injectBox = createInjectBody('Box');
292
+ const injectConvexPolyhedron = createInjectBody('ConvexPolyhedron');
293
+ const injectCylinder = createInjectBody('Cylinder');
294
+ const injectHeightfield = createInjectBody('Heightfield');
295
+ const injectParticle = createInjectBody('Particle');
296
+ const injectPlane = createInjectBody('Plane');
297
+ const injectSphere = createInjectBody('Sphere');
298
+ const injectTrimesh = createInjectBody('Trimesh');
299
+ const injectCompound = createInjectBody('Compound');
300
+
301
+ /**
302
+ * Generated bundle index. Do not edit.
303
+ */
304
+
305
+ export { injectBox, injectCompound, injectConvexPolyhedron, injectCylinder, injectHeightfield, injectParticle, injectPlane, injectSphere, injectTrimesh };
306
+ //# sourceMappingURL=angular-three-cannon-body.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-three-cannon-body.mjs","sources":["../../../../libs/cannon/body/src/lib/utils.ts","../../../../libs/cannon/body/src/lib/body.ts","../../../../libs/cannon/body/src/angular-three-cannon-body.ts"],"sourcesContent":["import {\n\tAtomicName,\n\tBodyProps,\n\tBoxProps,\n\tCannonWorkerAPI,\n\tCompoundBodyProps,\n\tConvexPolyhedronArgs,\n\tCylinderArgs,\n\tHeightfieldArgs,\n\tParticleProps,\n\tPlaneProps,\n\tPropValue,\n\tQuad,\n\tSetOpName,\n\tSphereArgs,\n\tSubscriptionName,\n\tSubscriptionTarget,\n\tSubscriptions,\n\tTrimeshArgs,\n\tTriplet,\n\tVectorName,\n} from '@pmndrs/cannon-worker-api';\nimport { NgtcCannonEvents, NgtcPhysicsApi } from 'angular-three-cannon';\nimport { Euler, Object3D, Quaternion, Vector3 } from 'three';\nimport { NgtcWorkerApi } from './types';\n\nfunction capitalize<T extends string>(str: T): Capitalize<T> {\n\treturn (str.charAt(0).toUpperCase() + str.slice(1)) as Capitalize<T>;\n}\n\nfunction getUUID(body: Object3D, index?: number) {\n\tconst suffix = index === undefined ? '' : `/${index}`;\n\tif (typeof body === 'function') return null;\n\treturn body && body && `${body.uuid}${suffix}`;\n}\n\nconst e = new Euler();\nconst q = new Quaternion();\n\nfunction quaternionToRotation(callback: (v: Triplet) => void) {\n\treturn (v: Quad) => callback(e.setFromQuaternion(q.fromArray(v)).toArray() as Triplet);\n}\n\nlet incrementingId = 0;\nexport function createSubscribe<T extends SubscriptionName>(\n\tbody: Object3D,\n\tworker: CannonWorkerAPI,\n\tsubscriptions: Subscriptions,\n\ttype: T,\n\tindex?: number,\n\ttarget: SubscriptionTarget = 'bodies',\n) {\n\treturn (callback: (value: PropValue<T>) => void) => {\n\t\tconst id = incrementingId++;\n\t\tsubscriptions[id] = { [type]: callback };\n\t\tconst uuid = getUUID(body, index);\n\t\tuuid && worker.subscribe({ props: { id, target, type }, uuid });\n\t\treturn () => {\n\t\t\tdelete subscriptions[id];\n\t\t\tworker.unsubscribe({ props: id });\n\t\t};\n\t};\n}\n\nfunction makeTriplet(v: Vector3 | Triplet): Triplet {\n\treturn v instanceof Vector3 ? [v.x, v.y, v.z] : v;\n}\n\nexport function prepare(object: Object3D, { position = [0, 0, 0], rotation = [0, 0, 0], userData = {} }: BodyProps) {\n\tobject.userData = userData;\n\tobject.position.set(...position);\n\tobject.rotation.set(...rotation);\n\tobject.updateMatrix();\n}\n\nexport function setupCollision(\n\tevents: NgtcCannonEvents,\n\t{ onCollide, onCollideBegin, onCollideEnd }: Partial<BodyProps>,\n\tuuid: string,\n) {\n\tevents[uuid] = { collide: onCollide, collideBegin: onCollideBegin, collideEnd: onCollideEnd };\n}\n\nexport function makeBodyApi(\n\tbody: Object3D,\n\tworker: CannonWorkerAPI,\n\t{ subscriptions, scaleOverrides }: Pick<NgtcPhysicsApi, 'subscriptions' | 'scaleOverrides'>,\n) {\n\tconst makeAtomic = <T extends AtomicName>(type: T, index?: number) => {\n\t\tconst op: SetOpName<T> = `set${capitalize(type)}`;\n\n\t\treturn {\n\t\t\tset: (value: PropValue<T>) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker[op]({ props: value, uuid } as never);\n\t\t\t},\n\t\t\tsubscribe: createSubscribe(body, worker, subscriptions, type, index),\n\t\t};\n\t};\n\n\tconst makeQuaternion = (index?: number) => {\n\t\tconst type = 'quaternion';\n\t\treturn {\n\t\t\tcopy: ({ w, x, y, z }: Quaternion) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.setQuaternion({ props: [x, y, z, w], uuid });\n\t\t\t},\n\t\t\tset: (x: number, y: number, z: number, w: number) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.setQuaternion({ props: [x, y, z, w], uuid });\n\t\t\t},\n\t\t\tsubscribe: createSubscribe(body, worker, subscriptions, type, index),\n\t\t};\n\t};\n\n\tconst makeRotation = (index?: number) => {\n\t\treturn {\n\t\t\tcopy: ({ x, y, z }: Vector3 | Euler) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.setRotation({ props: [x, y, z], uuid });\n\t\t\t},\n\t\t\tset: (x: number, y: number, z: number) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.setRotation({ props: [x, y, z], uuid });\n\t\t\t},\n\t\t\tsubscribe: (callback: (value: Triplet) => void) => {\n\t\t\t\tconst id = incrementingId++;\n\t\t\t\tconst target = 'bodies';\n\t\t\t\tconst type = 'quaternion';\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tsubscriptions[id] = { [type]: quaternionToRotation(callback) };\n\t\t\t\tuuid && worker.subscribe({ props: { id, target, type }, uuid });\n\t\t\t\treturn () => {\n\t\t\t\t\tdelete subscriptions[id];\n\t\t\t\t\tworker.unsubscribe({ props: id });\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t};\n\tconst makeVec = (type: VectorName, index?: number) => {\n\t\tconst op: SetOpName<VectorName> = `set${capitalize(type)}`;\n\t\treturn {\n\t\t\tcopy: ({ x, y, z }: Vector3 | Euler) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker[op]({ props: [x, y, z], uuid });\n\t\t\t},\n\t\t\tset: (x: number, y: number, z: number) => {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker[op]({ props: [x, y, z], uuid });\n\t\t\t},\n\t\t\tsubscribe: createSubscribe(body, worker, subscriptions, type, index),\n\t\t};\n\t};\n\n\tconst makeRemove = (index?: number) => {\n\t\tconst uuid = getUUID(body, index);\n\t\treturn () => {\n\t\t\tif (uuid) worker.removeBodies({ uuid: [uuid] });\n\t\t};\n\t};\n\n\tfunction makeApi(index?: number): NgtcWorkerApi {\n\t\treturn {\n\t\t\tallowSleep: makeAtomic('allowSleep', index),\n\t\t\tangularDamping: makeAtomic('angularDamping', index),\n\t\t\tangularFactor: makeVec('angularFactor', index),\n\t\t\tangularVelocity: makeVec('angularVelocity', index),\n\t\t\tapplyForce(force: Triplet, worldPoint: Triplet) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.applyForce({ props: [force, worldPoint], uuid });\n\t\t\t},\n\t\t\tapplyImpulse(impulse: Triplet, worldPoint: Triplet) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.applyImpulse({ props: [impulse, worldPoint], uuid });\n\t\t\t},\n\t\t\tapplyLocalForce(force: Triplet, localPoint: Triplet) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.applyLocalForce({ props: [force, localPoint], uuid });\n\t\t\t},\n\t\t\tapplyLocalImpulse(impulse: Triplet, localPoint: Triplet) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.applyLocalImpulse({ props: [impulse, localPoint], uuid });\n\t\t\t},\n\t\t\tapplyTorque(torque: Triplet) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.applyTorque({ props: [torque], uuid });\n\t\t\t},\n\t\t\tcollisionFilterGroup: makeAtomic('collisionFilterGroup', index),\n\t\t\tcollisionFilterMask: makeAtomic('collisionFilterMask', index),\n\t\t\tcollisionResponse: makeAtomic('collisionResponse', index),\n\t\t\tfixedRotation: makeAtomic('fixedRotation', index),\n\t\t\tisTrigger: makeAtomic('isTrigger', index),\n\t\t\tlinearDamping: makeAtomic('linearDamping', index),\n\t\t\tlinearFactor: makeVec('linearFactor', index),\n\t\t\tmass: makeAtomic('mass', index),\n\t\t\tmaterial: makeAtomic('material', index),\n\t\t\tposition: makeVec('position', index),\n\t\t\tquaternion: makeQuaternion(index),\n\t\t\trotation: makeRotation(index),\n\t\t\tscaleOverride(scale) {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tif (uuid) scaleOverrides[uuid] = new Vector3(...scale);\n\t\t\t},\n\t\t\tsleep() {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.sleep({ uuid });\n\t\t\t},\n\t\t\tsleepSpeedLimit: makeAtomic('sleepSpeedLimit', index),\n\t\t\tsleepTimeLimit: makeAtomic('sleepTimeLimit', index),\n\t\t\tuserData: makeAtomic('userData', index),\n\t\t\tvelocity: makeVec('velocity', index),\n\t\t\tremove: makeRemove(index),\n\t\t\twakeUp() {\n\t\t\t\tconst uuid = getUUID(body, index);\n\t\t\t\tuuid && worker.wakeUp({ uuid });\n\t\t\t},\n\t\t};\n\t}\n\tconst cache: Record<number, NgtcWorkerApi> = {};\n\treturn { ...makeApi(), at: (index: number) => cache[index] || (cache[index] = makeApi(index)) };\n}\n\nexport const defaultTransformArgs = {\n\tPlane: (_: PlaneProps['args']) => [],\n\tBox: (args: BoxProps['args'] = [1, 1, 1]) => args,\n\tTrimesh: (args: TrimeshArgs) => args,\n\tCylinder: (_: CylinderArgs = []) => [],\n\tHeightfield: (args: HeightfieldArgs) => args,\n\tConvexPolyhedron: ([vertices, faces, normals, axes, boundingSphereRadius]: ConvexPolyhedronArgs = []) => [\n\t\tvertices && vertices.map(makeTriplet),\n\t\tfaces,\n\t\tnormals && normals.map(makeTriplet),\n\t\taxes && axes.map(makeTriplet),\n\t\tboundingSphereRadius,\n\t],\n\tParticle: (_: ParticleProps['args']) => [],\n\tSphere: (args: SphereArgs = [1]) => {\n\t\tif (!Array.isArray(args)) throw new Error('Sphere body args must be an array');\n\t\treturn [args[0]];\n\t},\n\tCompound: (args: CompoundBodyProps['args']) => args,\n};\n","import {\n\tElementRef,\n\tInjector,\n\tSignal,\n\tWritableSignal,\n\tcomputed,\n\teffect,\n\tinject,\n\tisSignal,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport { BodyShapeType } from '@pmndrs/cannon-worker-api';\nimport { resolveRef } from 'angular-three';\nimport { NgtcPhysics } from 'angular-three-cannon';\nimport { NgtcDebug } from 'angular-three-cannon/debug';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { DynamicDrawUsage, InstancedMesh, Object3D } from 'three';\nimport { NgtcArgFn, NgtcBodyPropsMap, NgtcBodyPublicApi, NgtcGetByIndex } from './types';\nimport { defaultTransformArgs, makeBodyApi, prepare, setupCollision } from './utils';\n\nexport interface NgtcBodyOptions<TShape extends BodyShapeType> {\n\ttransformArgs?: NgtcArgFn<NgtcBodyPropsMap[TShape]>;\n\tinjector?: Injector;\n}\n\nfunction createInjectBody<TShape extends BodyShapeType>(type: TShape) {\n\treturn <TObject extends Object3D>(\n\t\tgetPropFn: NgtcGetByIndex<NgtcBodyPropsMap[TShape]>,\n\t\tref: ElementRef<TObject> | TObject | Signal<ElementRef<TObject> | TObject | undefined>,\n\t\toptions?: NgtcBodyOptions<TShape>,\n\t) => injectBody<TShape, TObject>(type, getPropFn, ref, options);\n}\n\nfunction injectBody<TShape extends BodyShapeType, TObject extends Object3D>(\n\ttype: TShape,\n\tgetPropFn: NgtcGetByIndex<NgtcBodyPropsMap[TShape]>,\n\tref: ElementRef<TObject> | TObject | Signal<ElementRef<TObject> | TObject | undefined>,\n\t{ transformArgs, injector }: NgtcBodyOptions<TShape> = {},\n): Signal<NgtcBodyPublicApi | null> {\n\treturn assertInjector(injectBody, injector, () => {\n\t\tconst physics = inject(NgtcPhysics, { optional: true });\n\n\t\tif (!physics) {\n\t\t\tthrow new Error(`[NGT Cannon] injectBody was called outside of <ngtc-physics>`);\n\t\t}\n\n\t\tconst debug = inject(NgtcDebug, { optional: true });\n\n\t\tconst transform = transformArgs ?? defaultTransformArgs[type];\n\t\tconst bodyRef = isSignal(ref) ? ref : signal(ref);\n\t\tconst body = computed(() => resolveRef(bodyRef()));\n\n\t\tconst api = computed(() => {\n\t\t\tconst _body = body();\n\t\t\tif (!_body) return null;\n\t\t\tconst { worker, ...rest } = physics.api;\n\t\t\tif (!worker()) return null;\n\t\t\treturn makeBodyApi(_body, worker(), rest);\n\t\t});\n\n\t\teffect((onCleanup) => {\n\t\t\tconst currentWorker = physics.api.worker();\n\t\t\tif (!currentWorker) return;\n\n\t\t\tconst object = body();\n\n\t\t\tif (!isSignal(ref) && !object) {\n\t\t\t\tuntracked(() => {\n\t\t\t\t\t(bodyRef as WritableSignal<TObject | undefined>).set(resolveRef(ref));\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!object) return;\n\n\t\t\tconst [uuid, props] = (() => {\n\t\t\t\tlet uuids: string[] = [];\n\t\t\t\tlet temp: Object3D;\n\t\t\t\tif (object instanceof InstancedMesh) {\n\t\t\t\t\tobject.instanceMatrix.setUsage(DynamicDrawUsage);\n\t\t\t\t\tuuids = new Array(object.count).fill(0).map((_, i) => `${object.uuid}/${i}`);\n\t\t\t\t\ttemp = new Object3D();\n\t\t\t\t} else {\n\t\t\t\t\tuuids = [object.uuid];\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\tuuids,\n\t\t\t\t\tuuids.map((id, index) => {\n\t\t\t\t\t\tconst props = getPropFn(index);\n\t\t\t\t\t\tif (temp) {\n\t\t\t\t\t\t\tprepare(temp, props);\n\t\t\t\t\t\t\t(object as unknown as InstancedMesh).setMatrixAt(index, temp.matrix);\n\t\t\t\t\t\t\t(object as unknown as InstancedMesh).instanceMatrix.needsUpdate = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprepare(object, props);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tphysics.api.refs[id] = object;\n\t\t\t\t\t\tdebug?.add(id, props, type);\n\t\t\t\t\t\tsetupCollision(physics.api.events, props, id);\n\t\t\t\t\t\t// @ts-expect-error - if args is undefined, there's default\n\t\t\t\t\t\treturn { ...props, args: transform(props.args) };\n\t\t\t\t\t}),\n\t\t\t\t];\n\t\t\t})();\n\t\t\t// Register on mount, unregister on unmount\n\t\t\tcurrentWorker.addBodies({\n\t\t\t\tprops: props.map(({ onCollide, onCollideBegin, onCollideEnd, ...serializableProps }) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tonCollide: Boolean(onCollide),\n\t\t\t\t\t\tonCollideBegin: Boolean(onCollideBegin),\n\t\t\t\t\t\tonCollideEnd: Boolean(onCollideEnd),\n\t\t\t\t\t\t...serializableProps,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t\ttype,\n\t\t\t\tuuid,\n\t\t\t});\n\n\t\t\tonCleanup(() => {\n\t\t\t\tuuid.forEach((id) => {\n\t\t\t\t\tdelete physics.api.refs[id];\n\t\t\t\t\tdebug?.remove(id);\n\t\t\t\t\tdelete physics.api.events[id];\n\t\t\t\t});\n\t\t\t\tcurrentWorker.removeBodies({ uuid });\n\t\t\t});\n\t\t});\n\n\t\treturn api;\n\t});\n}\n\nexport const injectBox = createInjectBody('Box');\nexport const injectConvexPolyhedron = createInjectBody('ConvexPolyhedron');\nexport const injectCylinder = createInjectBody('Cylinder');\nexport const injectHeightfield = createInjectBody('Heightfield');\nexport const injectParticle = createInjectBody('Particle');\nexport const injectPlane = createInjectBody('Plane');\nexport const injectSphere = createInjectBody('Sphere');\nexport const injectTrimesh = createInjectBody('Trimesh');\nexport const injectCompound = createInjectBody('Compound');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { inject, isSignal, signal, computed, effect, untracked } from '@angular/core';
2
+ import { makeId, resolveRef } from 'angular-three';
3
+ import { NgtcPhysics } from 'angular-three-cannon';
4
+ import { assertInjector } from 'ngxtension/assert-injector';
5
+
6
+ function createInjectConstraint(type) {
7
+ return (bodyA, bodyB, options) => injectConstraint(type, bodyA, bodyB, options);
8
+ }
9
+ function injectConstraint(type, bodyA, bodyB, { injector, options = {}, disableOnStart = false, } = {}) {
10
+ return assertInjector(injectConstraint, injector, () => {
11
+ const physics = inject(NgtcPhysics, { optional: true });
12
+ if (!physics) {
13
+ throw new Error(`[NGT Cannon] injectConstraint was called outside of <ngtc-physics>`);
14
+ }
15
+ const worker = physics.api.worker;
16
+ const uuid = makeId();
17
+ const bodyARef = isSignal(bodyA) ? bodyA : signal(bodyA);
18
+ const bodyBRef = isSignal(bodyB) ? bodyB : signal(bodyB);
19
+ const bodyAValue = computed(() => resolveRef(bodyARef()));
20
+ const bodyBValue = computed(() => resolveRef(bodyBRef()));
21
+ const api = computed(() => {
22
+ const _worker = worker();
23
+ if (!_worker)
24
+ return null;
25
+ const enableDisable = {
26
+ disable: () => _worker.disableConstraint({ uuid }),
27
+ enable: () => _worker.enableConstraint({ uuid }),
28
+ remove: () => _worker.removeConstraint({ uuid }),
29
+ };
30
+ if (type === 'Hinge') {
31
+ return {
32
+ ...enableDisable,
33
+ disableMotor: () => _worker.disableConstraintMotor({ uuid }),
34
+ enableMotor: () => _worker.enableConstraintMotor({ uuid }),
35
+ setMotorMaxForce: (value) => _worker.setConstraintMotorMaxForce({ props: value, uuid }),
36
+ setMotorSpeed: (value) => _worker.setConstraintMotorSpeed({ props: value, uuid }),
37
+ };
38
+ }
39
+ return enableDisable;
40
+ });
41
+ let alreadyDisabled = false;
42
+ effect((onCleanup) => {
43
+ const currentWorker = worker();
44
+ if (!currentWorker)
45
+ return;
46
+ const [a, b] = [bodyAValue(), bodyBValue()];
47
+ if (!a || !b)
48
+ return;
49
+ currentWorker.addConstraint({
50
+ props: [a.uuid, b.uuid, options],
51
+ type,
52
+ uuid,
53
+ });
54
+ if (disableOnStart && !alreadyDisabled) {
55
+ alreadyDisabled = true;
56
+ untracked(api)?.disable();
57
+ }
58
+ onCleanup(() => currentWorker.removeConstraint({ uuid }));
59
+ });
60
+ return api;
61
+ });
62
+ }
63
+ const injectPointToPoint = createInjectConstraint('PointToPoint');
64
+ const injectConeTwist = createInjectConstraint('ConeTwist');
65
+ const injectDistance = createInjectConstraint('Distance');
66
+ const injectLock = createInjectConstraint('Lock');
67
+ const injectHinge = createInjectConstraint('Hinge');
68
+
69
+ /**
70
+ * Generated bundle index. Do not edit.
71
+ */
72
+
73
+ export { injectConeTwist, injectDistance, injectHinge, injectLock, injectPointToPoint };
74
+ //# sourceMappingURL=angular-three-cannon-constraint.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-three-cannon-constraint.mjs","sources":["../../../../libs/cannon/constraint/src/lib/constraint.ts","../../../../libs/cannon/constraint/src/angular-three-cannon-constraint.ts"],"sourcesContent":["import { ElementRef, Injector, Signal, computed, effect, inject, isSignal, signal, untracked } from '@angular/core';\nimport {\n\tConeTwistConstraintOpts,\n\tConstraintTypes,\n\tDistanceConstraintOpts,\n\tHingeConstraintOpts,\n\tLockConstraintOpts,\n\tPointToPointConstraintOpts,\n} from '@pmndrs/cannon-worker-api';\nimport { makeId, resolveRef } from 'angular-three';\nimport { NgtcPhysics } from 'angular-three-cannon';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { Object3D } from 'three';\n\nexport interface NgtcConstraintApi {\n\tdisable: () => void;\n\tenable: () => void;\n\tremove: () => void;\n}\n\nexport interface NgtcHingeConstraintApi extends NgtcConstraintApi {\n\tdisableMotor: () => void;\n\tenableMotor: () => void;\n\tsetMotorMaxForce: (value: number) => void;\n\tsetMotorSpeed: (value: number) => void;\n}\n\nexport type NgtcConstraintORHingeApi<T extends 'Hinge' | ConstraintTypes> = T extends ConstraintTypes\n\t? NgtcConstraintApi\n\t: NgtcHingeConstraintApi;\n\nexport type NgtcConstraintOptionsMap = {\n\tConeTwist: ConeTwistConstraintOpts;\n\tPointToPoint: PointToPointConstraintOpts;\n\tDistance: DistanceConstraintOpts;\n\tLock: LockConstraintOpts;\n\tHinge: HingeConstraintOpts;\n};\n\nexport type NgtcConstraintOptions<TConstraintType extends 'Hinge' | ConstraintTypes> = {\n\tinjector?: Injector;\n\tdisableOnStart?: boolean;\n\toptions?: NgtcConstraintOptionsMap[TConstraintType];\n};\n\nfunction createInjectConstraint<TConstraint extends ConstraintTypes | 'Hinge'>(type: TConstraint) {\n\treturn <A extends Object3D = Object3D, B extends Object3D = Object3D>(\n\t\tbodyA: ElementRef<A> | A | Signal<ElementRef<A> | A | undefined>,\n\t\tbodyB: ElementRef<B> | B | Signal<ElementRef<B> | B | undefined>,\n\t\toptions?: NgtcConstraintOptions<TConstraint>,\n\t) => injectConstraint<TConstraint, A, B>(type, bodyA, bodyB, options);\n}\n\nfunction injectConstraint<\n\tTConstraint extends ConstraintTypes | 'Hinge',\n\tA extends Object3D = Object3D,\n\tB extends Object3D = Object3D,\n>(\n\ttype: TConstraint,\n\tbodyA: ElementRef<A> | A | Signal<ElementRef<A> | A | undefined>,\n\tbodyB: ElementRef<B> | B | Signal<ElementRef<B> | B | undefined>,\n\t{\n\t\tinjector,\n\t\toptions = {} as NgtcConstraintOptionsMap[TConstraint],\n\t\tdisableOnStart = false,\n\t}: NgtcConstraintOptions<TConstraint> = {},\n) {\n\treturn assertInjector(injectConstraint, injector, () => {\n\t\tconst physics = inject(NgtcPhysics, { optional: true });\n\n\t\tif (!physics) {\n\t\t\tthrow new Error(`[NGT Cannon] injectConstraint was called outside of <ngtc-physics>`);\n\t\t}\n\n\t\tconst worker = physics.api.worker;\n\n\t\tconst uuid = makeId();\n\t\tconst bodyARef = isSignal(bodyA) ? bodyA : signal(bodyA);\n\t\tconst bodyBRef = isSignal(bodyB) ? bodyB : signal(bodyB);\n\t\tconst bodyAValue = computed(() => resolveRef(bodyARef()));\n\t\tconst bodyBValue = computed(() => resolveRef(bodyBRef()));\n\n\t\tconst api = computed(() => {\n\t\t\tconst _worker = worker();\n\t\t\tif (!_worker) return null;\n\n\t\t\tconst enableDisable = {\n\t\t\t\tdisable: () => _worker.disableConstraint({ uuid }),\n\t\t\t\tenable: () => _worker.enableConstraint({ uuid }),\n\t\t\t\tremove: () => _worker.removeConstraint({ uuid }),\n\t\t\t};\n\t\t\tif (type === 'Hinge') {\n\t\t\t\treturn {\n\t\t\t\t\t...enableDisable,\n\t\t\t\t\tdisableMotor: () => _worker.disableConstraintMotor({ uuid }),\n\t\t\t\t\tenableMotor: () => _worker.enableConstraintMotor({ uuid }),\n\t\t\t\t\tsetMotorMaxForce: (value: number) => _worker.setConstraintMotorMaxForce({ props: value, uuid }),\n\t\t\t\t\tsetMotorSpeed: (value: number) => _worker.setConstraintMotorSpeed({ props: value, uuid }),\n\t\t\t\t} as NgtcHingeConstraintApi;\n\t\t\t}\n\t\t\treturn enableDisable as NgtcConstraintApi;\n\t\t});\n\n\t\tlet alreadyDisabled = false;\n\t\teffect((onCleanup) => {\n\t\t\tconst currentWorker = worker();\n\t\t\tif (!currentWorker) return;\n\n\t\t\tconst [a, b] = [bodyAValue(), bodyBValue()];\n\t\t\tif (!a || !b) return;\n\n\t\t\tcurrentWorker.addConstraint({\n\t\t\t\tprops: [a.uuid, b.uuid, options],\n\t\t\t\ttype,\n\t\t\t\tuuid,\n\t\t\t});\n\n\t\t\tif (disableOnStart && !alreadyDisabled) {\n\t\t\t\talreadyDisabled = true;\n\t\t\t\tuntracked(api)?.disable();\n\t\t\t}\n\n\t\t\tonCleanup(() => currentWorker.removeConstraint({ uuid }));\n\t\t});\n\n\t\treturn api;\n\t});\n}\n\nexport const injectPointToPoint = createInjectConstraint('PointToPoint');\nexport const injectConeTwist = createInjectConstraint('ConeTwist');\nexport const injectDistance = createInjectConstraint('Distance');\nexport const injectLock = createInjectConstraint('Lock');\nexport const injectHinge = createInjectConstraint('Hinge');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,104 +1,89 @@
1
1
  import * as i0 from '@angular/core';
2
- import { forwardRef, Component, CUSTOM_ELEMENTS_SCHEMA, Input } from '@angular/core';
2
+ import { inject, input, afterNextRender, Directive } from '@angular/core';
3
3
  import { propsToBody } from '@pmndrs/cannon-worker-api';
4
- import { createInjectionToken, injectBeforeRender, NgtArgs } from 'angular-three';
5
- import { injectNgtcPhysicsApi, provideNgtcPhysicsApi } from 'angular-three-cannon';
4
+ import { injectStore, injectBeforeRender } from 'angular-three';
5
+ import { NgtcPhysics } from 'angular-three-cannon';
6
6
  import CannonDebugger from 'cannon-es-debugger';
7
- import * as THREE from 'three';
7
+ import { mergeInputs } from 'ngxtension/inject-inputs';
8
+ import { Quaternion, Vector3, Matrix4, InstancedMesh, Scene } from 'three';
8
9
 
9
- const q = new THREE.Quaternion();
10
- const s = new THREE.Vector3(1, 1, 1);
11
- const v = new THREE.Vector3();
12
- const m = new THREE.Matrix4();
10
+ const q = new Quaternion();
11
+ const s = new Vector3(1, 1, 1);
12
+ const v = new Vector3();
13
+ const m = new Matrix4();
13
14
  function getMatrix(o) {
14
- if (o instanceof THREE.InstancedMesh) {
15
+ if (o instanceof InstancedMesh) {
15
16
  o.getMatrixAt(parseInt(o.uuid.split('/')[1]), m);
16
17
  return m;
17
18
  }
18
19
  return o.matrix;
19
20
  }
20
- const [injectNgtcDebugApi, provideNgtcDebugApi] = createInjectionToken((debug) => debug.api, {
21
- isRoot: false,
22
- deps: [forwardRef(() => NgtcDebug)],
23
- });
21
+ const defaultOptions = {
22
+ enabled: true,
23
+ scale: 1,
24
+ color: 'black',
25
+ impl: CannonDebugger,
26
+ };
24
27
  class NgtcDebug {
25
28
  constructor() {
26
- this.color = 'black';
27
- this.scale = 1;
28
- this.impl = CannonDebugger;
29
- this.disabled = false;
29
+ this.store = injectStore();
30
+ this.physics = inject(NgtcPhysics);
31
+ this.debug = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
32
+ this.defaultScene = this.store.select('scene');
33
+ this.scene = new Scene();
30
34
  this.bodies = [];
31
35
  this.bodyMap = {};
32
- this.physicsApi = injectNgtcPhysicsApi();
33
- this.scene = new THREE.Scene();
34
- this.api = {
35
- add: (uuid, props, type) => {
36
- const body = propsToBody({ uuid, props, type });
37
- this.bodies.push(body);
38
- this.bodyMap[uuid] = body;
39
- },
40
- remove: (id) => {
41
- const debugBodyIndex = this.bodies.indexOf(this.bodyMap[id]);
42
- if (debugBodyIndex > -1)
43
- this.bodies.splice(debugBodyIndex, 1);
44
- delete this.bodyMap[id];
45
- },
46
- };
36
+ this.api = {};
37
+ afterNextRender(() => {
38
+ this.defaultScene().add(this.scene);
39
+ this.cannonDebugger = this.debug().impl(this.scene, { bodies: this.bodies }, {
40
+ color: this.debug().color,
41
+ scale: this.debug().scale,
42
+ });
43
+ });
47
44
  injectBeforeRender(() => {
48
45
  if (!this.cannonDebugger)
49
46
  return;
50
- const refs = this.physicsApi.get('refs');
47
+ const refs = this.physics.api.refs;
51
48
  for (const uuid in this.bodyMap) {
52
- getMatrix(refs[uuid]).decompose(v, q, s);
53
- this.bodyMap[uuid].position.copy(v);
54
- this.bodyMap[uuid].quaternion.copy(q);
49
+ const ref = refs[uuid];
50
+ const body = this.bodyMap[uuid];
51
+ if (ref) {
52
+ getMatrix(ref).decompose(v, q, s);
53
+ body.position.copy(v);
54
+ body.quaternion.copy(q);
55
+ }
55
56
  }
56
57
  for (const child of this.scene.children) {
57
- child.visible = !this.disabled;
58
+ child.visible = this.debug().enabled;
58
59
  }
59
- if (!this.disabled) {
60
+ if (this.debug().enabled) {
60
61
  this.cannonDebugger.update();
61
62
  }
62
63
  });
63
64
  }
64
- ngOnInit() {
65
- this.cannonDebugger = this.impl(this.scene, { bodies: this.bodies }, {
66
- color: this.color,
67
- scale: this.scale,
68
- });
65
+ add(uuid, props, type) {
66
+ const body = propsToBody({ uuid, props, type });
67
+ this.bodies.push(body);
68
+ this.bodyMap[uuid] = body;
69
+ }
70
+ remove(uuid) {
71
+ const debugBodyIndex = this.bodies.indexOf(this.bodyMap[uuid]);
72
+ if (debugBodyIndex > -1)
73
+ this.bodies.splice(debugBodyIndex, 1);
74
+ delete this.bodyMap[uuid];
69
75
  }
70
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtcDebug, isStandalone: true, selector: "ngtc-debug", inputs: { color: "color", scale: "scale", impl: "impl", disabled: "disabled" }, providers: [provideNgtcPhysicsApi()], ngImport: i0, template: `
72
- <ngt-primitive *args="[scene]" />
73
- <ng-content />
74
- `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }] }); }
76
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
77
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgtcDebug, isStandalone: true, selector: "ngtc-physics[debug]", inputs: { debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
75
78
  }
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcDebug, decorators: [{
77
- type: Component,
78
- args: [{
79
- selector: 'ngtc-debug',
80
- standalone: true,
81
- template: `
82
- <ngt-primitive *args="[scene]" />
83
- <ng-content />
84
- `,
85
- providers: [provideNgtcPhysicsApi()],
86
- imports: [NgtArgs],
87
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
88
- }]
89
- }], ctorParameters: function () { return []; }, propDecorators: { color: [{
90
- type: Input
91
- }], scale: [{
92
- type: Input
93
- }], impl: [{
94
- type: Input
95
- }], disabled: [{
96
- type: Input
97
- }] } });
79
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcDebug, decorators: [{
80
+ type: Directive,
81
+ args: [{ selector: 'ngtc-physics[debug]', standalone: true }]
82
+ }], ctorParameters: () => [] });
98
83
 
99
84
  /**
100
85
  * Generated bundle index. Do not edit.
101
86
  */
102
87
 
103
- export { NgtcDebug, injectNgtcDebugApi, provideNgtcDebugApi };
88
+ export { NgtcDebug };
104
89
  //# sourceMappingURL=angular-three-cannon-debug.mjs.map