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.
- package/README.md +71 -4
- package/body/README.md +49 -0
- package/body/index.d.ts +2 -0
- package/body/lib/body.d.ts +17 -0
- package/body/lib/types.d.ts +49 -0
- package/body/lib/utils.d.ts +50 -0
- package/constraint/README.md +47 -0
- package/constraint/index.d.ts +1 -0
- package/constraint/lib/constraint.d.ts +32 -0
- package/debug/README.md +48 -2
- package/debug/lib/debug.d.ts +15 -33
- package/esm2022/body/angular-three-cannon-body.mjs +5 -0
- package/esm2022/body/index.mjs +2 -0
- package/esm2022/body/lib/body.mjs +108 -0
- package/esm2022/body/lib/types.mjs +2 -0
- package/esm2022/body/lib/utils.mjs +193 -0
- package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
- package/esm2022/constraint/index.mjs +2 -0
- package/esm2022/constraint/lib/constraint.mjs +67 -0
- package/esm2022/debug/lib/debug.mjs +56 -71
- package/esm2022/lib/physics.mjs +79 -176
- package/fesm2022/angular-three-cannon-body.mjs +306 -0
- package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
- package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
- package/fesm2022/angular-three-cannon-debug.mjs +56 -71
- package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
- package/fesm2022/angular-three-cannon.mjs +79 -176
- package/fesm2022/angular-three-cannon.mjs.map +1 -1
- package/lib/physics.d.ts +31 -49
- package/package.json +25 -15
- package/esm2022/services/angular-three-cannon-services.mjs +0 -5
- package/esm2022/services/index.mjs +0 -7
- package/esm2022/services/lib/body.mjs +0 -293
- package/esm2022/services/lib/constraints.mjs +0 -58
- package/esm2022/services/lib/contact-material.mjs +0 -20
- package/esm2022/services/lib/ray.mjs +0 -30
- package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
- package/esm2022/services/lib/spring.mjs +0 -31
- package/fesm2022/angular-three-cannon-services.mjs +0 -490
- package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
- package/services/README.md +0 -3
- package/services/index.d.ts +0 -6
- package/services/lib/body.d.ts +0 -60
- package/services/lib/constraints.d.ts +0 -31
- package/services/lib/contact-material.d.ts +0 -9
- package/services/lib/ray.d.ts +0 -12
- package/services/lib/raycast-vehicle.d.ts +0 -30
- 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 {
|
|
2
|
+
import { inject, input, afterNextRender, Directive } from '@angular/core';
|
|
3
3
|
import { propsToBody } from '@pmndrs/cannon-worker-api';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { injectStore, injectBeforeRender } from 'angular-three';
|
|
5
|
+
import { NgtcPhysics } from 'angular-three-cannon';
|
|
6
6
|
import CannonDebugger from 'cannon-es-debugger';
|
|
7
|
-
import
|
|
7
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
8
|
+
import { Quaternion, Vector3, Matrix4, InstancedMesh, Scene } from 'three';
|
|
8
9
|
|
|
9
|
-
const q = new
|
|
10
|
-
const s = new
|
|
11
|
-
const v = new
|
|
12
|
-
const m = new
|
|
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
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
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.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
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.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
this.
|
|
38
|
-
|
|
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.
|
|
47
|
+
const refs = this.physics.api.refs;
|
|
51
48
|
for (const uuid in this.bodyMap) {
|
|
52
|
-
|
|
53
|
-
this.bodyMap[uuid]
|
|
54
|
-
|
|
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 =
|
|
58
|
+
child.visible = this.debug().enabled;
|
|
58
59
|
}
|
|
59
|
-
if (
|
|
60
|
+
if (this.debug().enabled) {
|
|
60
61
|
this.cannonDebugger.update();
|
|
61
62
|
}
|
|
62
63
|
});
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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: "
|
|
71
|
-
static { this.ɵ
|
|
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: "
|
|
77
|
-
type:
|
|
78
|
-
args: [{
|
|
79
|
-
|
|
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
|
|
88
|
+
export { NgtcDebug };
|
|
104
89
|
//# sourceMappingURL=angular-three-cannon-debug.mjs.map
|