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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-three-cannon-debug.mjs","sources":["../../../../libs/cannon/debug/src/lib/debug.ts","../../../../libs/cannon/debug/src/angular-three-cannon-debug.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"angular-three-cannon-debug.mjs","sources":["../../../../libs/cannon/debug/src/lib/debug.ts","../../../../libs/cannon/debug/src/angular-three-cannon-debug.ts"],"sourcesContent":["import { Directive, afterNextRender, inject, input } from '@angular/core';\nimport { BodyProps, BodyShapeType, propsToBody } from '@pmndrs/cannon-worker-api';\nimport { injectBeforeRender, injectStore } from 'angular-three';\nimport { NgtcPhysics } from 'angular-three-cannon';\nimport { Body, Quaternion as CQuarternion, Vec3, World } from 'cannon-es';\nimport CannonDebugger from 'cannon-es-debugger';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { InstancedMesh, Matrix4, Object3D, Quaternion, Scene, Vector3 } from 'three';\n\nconst q = new Quaternion();\nconst s = new Vector3(1, 1, 1);\nconst v = new Vector3();\nconst m = new Matrix4();\nfunction getMatrix(o: Object3D) {\n\tif (o instanceof InstancedMesh) {\n\t\to.getMatrixAt(parseInt(o.uuid.split('/')[1]), m);\n\t\treturn m;\n\t}\n\treturn o.matrix;\n}\n\nexport interface NgtcDebugInputs {\n\tenabled: boolean;\n\tcolor: string;\n\timpl: typeof CannonDebugger;\n\tscale: number;\n}\n\nconst defaultOptions: NgtcDebugInputs = {\n\tenabled: true,\n\tscale: 1,\n\tcolor: 'black',\n\timpl: CannonDebugger,\n};\n\n@Directive({ selector: 'ngtc-physics[debug]', standalone: true })\nexport class NgtcDebug {\n\tprivate store = injectStore();\n\tprivate physics = inject(NgtcPhysics);\n\n\tdebug = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate defaultScene = this.store.select('scene');\n\n\tprivate scene = new Scene();\n\tprivate bodies: Body[] = [];\n\tprivate bodyMap: Record<string, Body> = {};\n\n\tprivate cannonDebugger!: ReturnType<typeof CannonDebugger>;\n\n\tapi = {};\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.defaultScene().add(this.scene);\n\t\t\tthis.cannonDebugger = this.debug().impl(this.scene, { bodies: this.bodies } as World, {\n\t\t\t\tcolor: this.debug().color,\n\t\t\t\tscale: this.debug().scale,\n\t\t\t});\n\t\t});\n\n\t\tinjectBeforeRender(() => {\n\t\t\tif (!this.cannonDebugger) return;\n\t\t\tconst refs = this.physics.api.refs;\n\t\t\tfor (const uuid in this.bodyMap) {\n\t\t\t\tconst ref = refs[uuid];\n\t\t\t\tconst body = this.bodyMap[uuid];\n\t\t\t\tif (ref) {\n\t\t\t\t\tgetMatrix(ref).decompose(v, q, s);\n\t\t\t\t\tbody.position.copy(v as unknown as Vec3);\n\t\t\t\t\tbody.quaternion.copy(q as unknown as CQuarternion);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const child of this.scene.children) {\n\t\t\t\tchild.visible = this.debug().enabled;\n\t\t\t}\n\n\t\t\tif (this.debug().enabled) {\n\t\t\t\tthis.cannonDebugger.update();\n\t\t\t}\n\t\t});\n\t}\n\n\tadd(uuid: string, props: BodyProps, type: BodyShapeType) {\n\t\tconst body = propsToBody({ uuid, props, type });\n\t\tthis.bodies.push(body);\n\t\tthis.bodyMap[uuid] = body;\n\t}\n\n\tremove(uuid: string) {\n\t\tconst debugBodyIndex = this.bodies.indexOf(this.bodyMap[uuid]);\n\t\tif (debugBodyIndex > -1) this.bodies.splice(debugBodyIndex, 1);\n\t\tdelete this.bodyMap[uuid];\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, signal, afterNextRender, inject, DestroyRef, computed, untracked, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
3
|
import { CannonWorkerAPI } from '@pmndrs/cannon-worker-api';
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
4
|
+
import { injectStore, injectBeforeRender } from 'angular-three';
|
|
5
|
+
import { injectAutoEffect } from 'ngxtension/auto-effect';
|
|
6
|
+
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
7
|
+
import { Vector3, Quaternion, Matrix4, InstancedMesh } from 'three';
|
|
6
8
|
|
|
7
|
-
const v = new
|
|
8
|
-
const s = new
|
|
9
|
-
const q = new
|
|
10
|
-
const m = new
|
|
9
|
+
const v = new Vector3();
|
|
10
|
+
const s = new Vector3(1, 1, 1);
|
|
11
|
+
const q = new Quaternion();
|
|
12
|
+
const m = new Matrix4();
|
|
11
13
|
function apply(index, positions, quaternions, scale = s, object) {
|
|
12
14
|
if (index !== undefined) {
|
|
13
15
|
m.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions, index * 4), scale);
|
|
@@ -19,107 +21,68 @@ function apply(index, positions, quaternions, scale = s, object) {
|
|
|
19
21
|
}
|
|
20
22
|
return m.identity();
|
|
21
23
|
}
|
|
22
|
-
|
|
24
|
+
function unique() {
|
|
23
25
|
const values = [];
|
|
24
26
|
return (value) => (values.includes(value) ? false : !!values.push(value));
|
|
27
|
+
}
|
|
28
|
+
const defaultOptions = {
|
|
29
|
+
allowSleep: false,
|
|
30
|
+
axisIndex: 0,
|
|
31
|
+
broadphase: 'Naive',
|
|
32
|
+
defaultContactMaterial: { contactEquationStiffness: 1e6 },
|
|
33
|
+
frictionGravity: null,
|
|
34
|
+
gravity: [0, -9.81, 0],
|
|
35
|
+
isPaused: false,
|
|
36
|
+
iterations: 5,
|
|
37
|
+
maxSubSteps: 10,
|
|
38
|
+
quatNormalizeFast: false,
|
|
39
|
+
quatNormalizeSkip: 0,
|
|
40
|
+
shouldInvalidate: true,
|
|
41
|
+
size: 1000,
|
|
42
|
+
solver: 'GS',
|
|
43
|
+
stepSize: 1 / 60,
|
|
44
|
+
tolerance: 0.001,
|
|
25
45
|
};
|
|
26
|
-
const [injectNgtcPhysicsApi, provideNgtcPhysicsApi] = createInjectionToken((physics) => physics.api, { isRoot: false, deps: [forwardRef(() => NgtcPhysics)] });
|
|
27
46
|
class NgtcPhysics {
|
|
28
47
|
constructor() {
|
|
29
|
-
this.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
broadphase: 'Naive',
|
|
33
|
-
defaultContactMaterial: { contactEquationStiffness: 1e6 },
|
|
34
|
-
frictionGravity: null,
|
|
35
|
-
gravity: [0, -9.81, 0],
|
|
36
|
-
isPaused: false,
|
|
37
|
-
iterations: 5,
|
|
38
|
-
maxSubSteps: 10,
|
|
39
|
-
quatNormalizeFast: false,
|
|
40
|
-
quatNormalizeSkip: 0,
|
|
41
|
-
shouldInvalidate: true,
|
|
42
|
-
size: 1000,
|
|
43
|
-
solver: 'GS',
|
|
44
|
-
stepSize: 1 / 60,
|
|
45
|
-
tolerance: 0.001,
|
|
46
|
-
});
|
|
47
|
-
this.zone = inject(NgZone);
|
|
48
|
-
this.injector = inject(Injector);
|
|
49
|
-
this.store = injectNgtStore();
|
|
48
|
+
this.autoEffect = injectAutoEffect();
|
|
49
|
+
this.store = injectStore();
|
|
50
|
+
this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
50
51
|
this.invalidate = this.store.select('invalidate');
|
|
51
|
-
|
|
52
|
+
// @ts-expect-error - worker is not nullable, and we don't want to use ! operator
|
|
53
|
+
this.worker = signal(null);
|
|
54
|
+
this.api = {
|
|
52
55
|
bodies: {},
|
|
53
56
|
events: {},
|
|
54
57
|
refs: {},
|
|
55
58
|
scaleOverrides: {},
|
|
56
59
|
subscriptions: {},
|
|
57
|
-
worker:
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
set _isPaused(isPaused) {
|
|
62
|
-
this.inputs.set({ isPaused });
|
|
63
|
-
}
|
|
64
|
-
set _maxSubSteps(maxSubSteps) {
|
|
65
|
-
this.inputs.set({ maxSubSteps });
|
|
66
|
-
}
|
|
67
|
-
set _shouldInvalidate(shouldInvalidate) {
|
|
68
|
-
this.inputs.set({ shouldInvalidate });
|
|
69
|
-
}
|
|
70
|
-
set _stepSize(stepSize) {
|
|
71
|
-
this.inputs.set({ stepSize });
|
|
72
|
-
}
|
|
73
|
-
set _size(size) {
|
|
74
|
-
this.inputs.set({ size });
|
|
75
|
-
}
|
|
76
|
-
set _allowSleep(allowSleep) {
|
|
77
|
-
this.inputs.set({ allowSleep });
|
|
78
|
-
}
|
|
79
|
-
set _axisIndex(axisIndex) {
|
|
80
|
-
this.inputs.set({ axisIndex });
|
|
81
|
-
}
|
|
82
|
-
set _broadphase(broadphase) {
|
|
83
|
-
this.inputs.set({ broadphase });
|
|
84
|
-
}
|
|
85
|
-
set _defaultContactMaterial(defaultContactMaterial) {
|
|
86
|
-
this.inputs.set({ defaultContactMaterial });
|
|
87
|
-
}
|
|
88
|
-
set _frictionGravity(frictionGravity) {
|
|
89
|
-
this.inputs.set({ frictionGravity });
|
|
90
|
-
}
|
|
91
|
-
set _gravity(gravity) {
|
|
92
|
-
this.inputs.set({ gravity });
|
|
93
|
-
}
|
|
94
|
-
set _iterations(iterations) {
|
|
95
|
-
this.inputs.set({ iterations });
|
|
96
|
-
}
|
|
97
|
-
set _quatNormalizeFast(quatNormalizeFast) {
|
|
98
|
-
this.inputs.set({ quatNormalizeFast });
|
|
99
|
-
}
|
|
100
|
-
set _quatNormalizeSkip(quatNormalizeSkip) {
|
|
101
|
-
this.inputs.set({ quatNormalizeSkip });
|
|
102
|
-
}
|
|
103
|
-
set _solver(solver) {
|
|
104
|
-
this.inputs.set({ solver });
|
|
105
|
-
}
|
|
106
|
-
set _tolerance(tolerance) {
|
|
107
|
-
this.inputs.set({ tolerance });
|
|
108
|
-
}
|
|
109
|
-
ngOnInit() {
|
|
110
|
-
this.zone.runOutsideAngular(() => {
|
|
111
|
-
this.api.set({ worker: new CannonWorkerAPI(this.inputs.state()) });
|
|
60
|
+
worker: this.worker.asReadonly(),
|
|
61
|
+
};
|
|
62
|
+
afterNextRender(() => {
|
|
63
|
+
this.worker.set(new CannonWorkerAPI(this.options()));
|
|
112
64
|
this.connectWorker();
|
|
113
65
|
this.updateWorkerState('axisIndex');
|
|
114
66
|
this.updateWorkerState('broadphase');
|
|
115
67
|
this.updateWorkerState('gravity');
|
|
116
68
|
this.updateWorkerState('iterations');
|
|
117
69
|
this.updateWorkerState('tolerance');
|
|
118
|
-
|
|
70
|
+
});
|
|
71
|
+
let timeSinceLastCalled = 0;
|
|
72
|
+
injectBeforeRender(({ delta }) => {
|
|
73
|
+
const [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];
|
|
74
|
+
if (isPaused || !worker || stepSize == null)
|
|
75
|
+
return;
|
|
76
|
+
timeSinceLastCalled += delta;
|
|
77
|
+
worker.step({ maxSubSteps, stepSize, timeSinceLastCalled });
|
|
78
|
+
timeSinceLastCalled = 0;
|
|
79
|
+
});
|
|
80
|
+
inject(DestroyRef).onDestroy(() => {
|
|
81
|
+
this.ref?.destroy();
|
|
119
82
|
});
|
|
120
83
|
}
|
|
121
84
|
connectWorker() {
|
|
122
|
-
|
|
85
|
+
this.autoEffect(() => {
|
|
123
86
|
const worker = this.worker();
|
|
124
87
|
if (!worker)
|
|
125
88
|
return;
|
|
@@ -130,34 +93,29 @@ class NgtcPhysics {
|
|
|
130
93
|
worker.on('collideEnd', this.collideEndHandler.bind(this));
|
|
131
94
|
worker.on('frame', this.frameHandler.bind(this));
|
|
132
95
|
worker.on('rayhit', this.rayhitHandler.bind(this));
|
|
133
|
-
|
|
96
|
+
return () => {
|
|
134
97
|
worker.terminate();
|
|
135
98
|
worker.removeAllListeners();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
99
|
+
};
|
|
100
|
+
});
|
|
138
101
|
}
|
|
139
102
|
updateWorkerState(key) {
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
const [worker, value] = [untracked(this.worker),
|
|
143
|
-
// @ts-expect-error
|
|
103
|
+
const computedValue = computed(() => this.options()[key]);
|
|
104
|
+
this.autoEffect(() => {
|
|
105
|
+
const [worker, value] = [untracked(this.worker), computedValue()];
|
|
106
|
+
// @ts-expect-error - we know key is a valid key of CannonWorkerAPI
|
|
144
107
|
worker[key] = value;
|
|
145
|
-
}
|
|
108
|
+
});
|
|
146
109
|
}
|
|
147
110
|
collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
|
|
148
|
-
const { events, refs } = this.api
|
|
111
|
+
const { events, refs } = this.api;
|
|
149
112
|
const cb = events[target]?.collide;
|
|
150
113
|
if (cb) {
|
|
151
|
-
cb({
|
|
152
|
-
body: refs[body],
|
|
153
|
-
contact: { bi: refs[bi], bj: refs[bj], ...contactRest },
|
|
154
|
-
target: refs[target],
|
|
155
|
-
...rest,
|
|
156
|
-
});
|
|
114
|
+
cb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });
|
|
157
115
|
}
|
|
158
116
|
}
|
|
159
117
|
collideBeginHandler({ bodyA, bodyB }) {
|
|
160
|
-
const { events, refs } = this.api
|
|
118
|
+
const { events, refs } = this.api;
|
|
161
119
|
const cbA = events[bodyA]?.collideBegin;
|
|
162
120
|
if (cbA)
|
|
163
121
|
cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });
|
|
@@ -166,7 +124,7 @@ class NgtcPhysics {
|
|
|
166
124
|
cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });
|
|
167
125
|
}
|
|
168
126
|
collideEndHandler({ bodyA, bodyB }) {
|
|
169
|
-
const { events, refs } = this.api
|
|
127
|
+
const { events, refs } = this.api;
|
|
170
128
|
const cbA = events[bodyA]?.collideEnd;
|
|
171
129
|
if (cbA)
|
|
172
130
|
cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });
|
|
@@ -176,8 +134,8 @@ class NgtcPhysics {
|
|
|
176
134
|
}
|
|
177
135
|
frameHandler({ active, bodies: uuids = [], observations, positions, quaternions, }) {
|
|
178
136
|
const [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [
|
|
179
|
-
this.
|
|
180
|
-
this.api
|
|
137
|
+
untracked(this.options),
|
|
138
|
+
this.api,
|
|
181
139
|
this.invalidate(),
|
|
182
140
|
];
|
|
183
141
|
for (let i = 0; i < uuids.length; i++) {
|
|
@@ -186,13 +144,13 @@ class NgtcPhysics {
|
|
|
186
144
|
observations.forEach(([id, value, type]) => {
|
|
187
145
|
const subscription = subscriptions[id] || {};
|
|
188
146
|
const cb = subscription[type];
|
|
189
|
-
//
|
|
147
|
+
// @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it
|
|
190
148
|
cb && cb(value);
|
|
191
149
|
});
|
|
192
150
|
if (!active)
|
|
193
151
|
return;
|
|
194
152
|
for (const ref of Object.values(refs).filter(unique())) {
|
|
195
|
-
if (ref instanceof
|
|
153
|
+
if (ref instanceof InstancedMesh) {
|
|
196
154
|
for (let i = 0; i < ref.count; i++) {
|
|
197
155
|
const uuid = `${ref.uuid}/${i}`;
|
|
198
156
|
const index = bodies[uuid];
|
|
@@ -211,86 +169,31 @@ class NgtcPhysics {
|
|
|
211
169
|
invalidate();
|
|
212
170
|
}
|
|
213
171
|
rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }) {
|
|
214
|
-
const { events, refs } = this.api
|
|
172
|
+
const { events, refs } = this.api;
|
|
215
173
|
const cb = events[uuid]?.rayhit;
|
|
216
174
|
if (cb)
|
|
217
175
|
cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
|
|
218
176
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (isPaused || !worker)
|
|
224
|
-
return;
|
|
225
|
-
timeSinceLastCalled += delta;
|
|
226
|
-
worker.step({ maxSubSteps, stepSize: stepSize, timeSinceLastCalled });
|
|
227
|
-
timeSinceLastCalled = 0;
|
|
228
|
-
}, { injector: this.injector });
|
|
229
|
-
}
|
|
230
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
231
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { _isPaused: ["isPaused", "_isPaused"], _maxSubSteps: ["maxSubSteps", "_maxSubSteps"], _shouldInvalidate: ["shouldInvalidate", "_shouldInvalidate"], _stepSize: ["stepSize", "_stepSize"], _size: ["size", "_size"], _allowSleep: ["allowSleep", "_allowSleep"], _axisIndex: ["axisIndex", "_axisIndex"], _broadphase: ["broadphase", "_broadphase"], _defaultContactMaterial: ["defaultContactMaterial", "_defaultContactMaterial"], _frictionGravity: ["frictionGravity", "_frictionGravity"], _gravity: ["gravity", "_gravity"], _iterations: ["iterations", "_iterations"], _quatNormalizeFast: ["quatNormalizeFast", "_quatNormalizeFast"], _quatNormalizeSkip: ["quatNormalizeSkip", "_quatNormalizeSkip"], _solver: ["solver", "_solver"], _tolerance: ["tolerance", "_tolerance"] }, providers: [provideNgtcPhysicsApi()], ngImport: i0, template: `<ng-content />`, isInline: true }); }
|
|
177
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
178
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
179
|
+
<ng-content />
|
|
180
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
232
181
|
}
|
|
233
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, decorators: [{
|
|
234
183
|
type: Component,
|
|
235
184
|
args: [{
|
|
236
185
|
selector: 'ngtc-physics',
|
|
237
186
|
standalone: true,
|
|
238
|
-
template:
|
|
239
|
-
|
|
187
|
+
template: `
|
|
188
|
+
<ng-content />
|
|
189
|
+
`,
|
|
190
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
240
191
|
}]
|
|
241
|
-
}],
|
|
242
|
-
type: Input,
|
|
243
|
-
args: [{ alias: 'isPaused' }]
|
|
244
|
-
}], _maxSubSteps: [{
|
|
245
|
-
type: Input,
|
|
246
|
-
args: [{ alias: 'maxSubSteps' }]
|
|
247
|
-
}], _shouldInvalidate: [{
|
|
248
|
-
type: Input,
|
|
249
|
-
args: [{ alias: 'shouldInvalidate' }]
|
|
250
|
-
}], _stepSize: [{
|
|
251
|
-
type: Input,
|
|
252
|
-
args: [{ alias: 'stepSize' }]
|
|
253
|
-
}], _size: [{
|
|
254
|
-
type: Input,
|
|
255
|
-
args: [{ alias: 'size' }]
|
|
256
|
-
}], _allowSleep: [{
|
|
257
|
-
type: Input,
|
|
258
|
-
args: [{ alias: 'allowSleep' }]
|
|
259
|
-
}], _axisIndex: [{
|
|
260
|
-
type: Input,
|
|
261
|
-
args: [{ alias: 'axisIndex' }]
|
|
262
|
-
}], _broadphase: [{
|
|
263
|
-
type: Input,
|
|
264
|
-
args: [{ alias: 'broadphase' }]
|
|
265
|
-
}], _defaultContactMaterial: [{
|
|
266
|
-
type: Input,
|
|
267
|
-
args: [{ alias: 'defaultContactMaterial' }]
|
|
268
|
-
}], _frictionGravity: [{
|
|
269
|
-
type: Input,
|
|
270
|
-
args: [{ alias: 'frictionGravity' }]
|
|
271
|
-
}], _gravity: [{
|
|
272
|
-
type: Input,
|
|
273
|
-
args: [{ alias: 'gravity' }]
|
|
274
|
-
}], _iterations: [{
|
|
275
|
-
type: Input,
|
|
276
|
-
args: [{ alias: 'iterations' }]
|
|
277
|
-
}], _quatNormalizeFast: [{
|
|
278
|
-
type: Input,
|
|
279
|
-
args: [{ alias: 'quatNormalizeFast' }]
|
|
280
|
-
}], _quatNormalizeSkip: [{
|
|
281
|
-
type: Input,
|
|
282
|
-
args: [{ alias: 'quatNormalizeSkip' }]
|
|
283
|
-
}], _solver: [{
|
|
284
|
-
type: Input,
|
|
285
|
-
args: [{ alias: 'solver' }]
|
|
286
|
-
}], _tolerance: [{
|
|
287
|
-
type: Input,
|
|
288
|
-
args: [{ alias: 'tolerance' }]
|
|
289
|
-
}] } });
|
|
192
|
+
}], ctorParameters: () => [] });
|
|
290
193
|
|
|
291
194
|
/**
|
|
292
195
|
* Generated bundle index. Do not edit.
|
|
293
196
|
*/
|
|
294
197
|
|
|
295
|
-
export { NgtcPhysics
|
|
198
|
+
export { NgtcPhysics };
|
|
296
199
|
//# sourceMappingURL=angular-three-cannon.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-three-cannon.mjs","sources":["../../../../libs/cannon/src/lib/physics.ts","../../../../libs/cannon/src/angular-three-cannon.ts"],"sourcesContent":["import { Component, Injector, Input, NgZone, effect, forwardRef, inject, untracked, type OnInit } from '@angular/core';\nimport {\n\tCannonWorkerAPI,\n\ttype Broadphase,\n\ttype CannonWorkerProps,\n\ttype CollideBeginEvent,\n\ttype CollideEndEvent,\n\ttype CollideEvent,\n\ttype ContactMaterialOptions,\n\ttype RayhitEvent,\n\ttype Refs,\n\ttype Solver,\n\ttype Subscriptions,\n\ttype Triplet,\n\ttype WorkerCollideBeginEvent,\n\ttype WorkerCollideEndEvent,\n\ttype WorkerCollideEvent,\n\ttype WorkerFrameMessage,\n\ttype WorkerRayhitEvent,\n} from '@pmndrs/cannon-worker-api';\nimport { createInjectionToken, injectBeforeRender, injectNgtStore, signalStore } from 'angular-three';\nimport * as THREE from 'three';\n\nconst v = new THREE.Vector3();\nconst s = new THREE.Vector3(1, 1, 1);\nconst q = new THREE.Quaternion();\nconst m = new THREE.Matrix4();\n\nfunction apply(index: number, positions: Float32Array, quaternions: Float32Array, scale = s, object?: THREE.Object3D) {\n\tif (index !== undefined) {\n\t\tm.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions, index * 4), scale);\n\t\tif (object) {\n\t\t\tobject.matrixAutoUpdate = false;\n\t\t\tobject.matrix.copy(m);\n\t\t}\n\t\treturn m;\n\t}\n\treturn m.identity();\n}\n\nconst unique = () => {\n\tconst values: unknown[] = [];\n\treturn (value: unknown) => (values.includes(value) ? false : !!values.push(value));\n};\n\nexport type NgtcPhysicsState = CannonWorkerProps & {\n\tisPaused?: boolean;\n\tmaxSubSteps?: number;\n\tshouldInvalidate?: boolean;\n\tstepSize?: number;\n};\n\ntype NgtcCannonEvent = CollideBeginEvent | CollideEndEvent | CollideEvent | RayhitEvent;\ntype NgtcCallbackByType<T extends { type: string }> = {\n\t[K in T['type']]?: T extends { type: K } ? (e: T) => void : never;\n};\n\nexport type NgtcCannonEvents = { [uuid: string]: Partial<NgtcCallbackByType<NgtcCannonEvent>> };\n\nexport type ScaleOverrides = { [uuid: string]: THREE.Vector3 };\n\nexport type NgtcPhysicsApi = {\n\tbodies: { [uuid: string]: number };\n\tevents: NgtcCannonEvents;\n\trefs: Refs;\n\tscaleOverrides: ScaleOverrides;\n\tsubscriptions: Subscriptions;\n\tworker: CannonWorkerAPI;\n};\n\nexport const [injectNgtcPhysicsApi, provideNgtcPhysicsApi] = createInjectionToken(\n\t(physics: NgtcPhysics) => physics.api,\n\t{ isRoot: false, deps: [forwardRef(() => NgtcPhysics)] },\n);\n\n@Component({\n\tselector: 'ngtc-physics',\n\tstandalone: true,\n\ttemplate: `<ng-content />`,\n\tproviders: [provideNgtcPhysicsApi()],\n})\nexport class NgtcPhysics implements OnInit {\n\tprivate inputs = signalStore<NgtcPhysicsState>({\n\t\tallowSleep: false,\n\t\taxisIndex: 0,\n\t\tbroadphase: 'Naive',\n\t\tdefaultContactMaterial: { contactEquationStiffness: 1e6 },\n\t\tfrictionGravity: null,\n\t\tgravity: [0, -9.81, 0],\n\t\tisPaused: false,\n\t\titerations: 5,\n\t\tmaxSubSteps: 10,\n\t\tquatNormalizeFast: false,\n\t\tquatNormalizeSkip: 0,\n\t\tshouldInvalidate: true,\n\t\tsize: 1000,\n\t\tsolver: 'GS',\n\t\tstepSize: 1 / 60,\n\t\ttolerance: 0.001,\n\t});\n\n\t@Input({ alias: 'isPaused' }) set _isPaused(isPaused: boolean) {\n\t\tthis.inputs.set({ isPaused });\n\t}\n\n\t@Input({ alias: 'maxSubSteps' }) set _maxSubSteps(maxSubSteps: number) {\n\t\tthis.inputs.set({ maxSubSteps });\n\t}\n\n\t@Input({ alias: 'shouldInvalidate' }) set _shouldInvalidate(shouldInvalidate: boolean) {\n\t\tthis.inputs.set({ shouldInvalidate });\n\t}\n\n\t@Input({ alias: 'stepSize' }) set _stepSize(stepSize: number) {\n\t\tthis.inputs.set({ stepSize });\n\t}\n\n\t@Input({ alias: 'size' }) set _size(size: number) {\n\t\tthis.inputs.set({ size });\n\t}\n\n\t@Input({ alias: 'allowSleep' }) set _allowSleep(allowSleep: boolean) {\n\t\tthis.inputs.set({ allowSleep });\n\t}\n\n\t@Input({ alias: 'axisIndex' }) set _axisIndex(axisIndex: 0 | 1 | 2) {\n\t\tthis.inputs.set({ axisIndex });\n\t}\n\n\t@Input({ alias: 'broadphase' }) set _broadphase(broadphase: Broadphase) {\n\t\tthis.inputs.set({ broadphase });\n\t}\n\n\t@Input({ alias: 'defaultContactMaterial' }) set _defaultContactMaterial(\n\t\tdefaultContactMaterial: ContactMaterialOptions,\n\t) {\n\t\tthis.inputs.set({ defaultContactMaterial });\n\t}\n\n\t@Input({ alias: 'frictionGravity' }) set _frictionGravity(frictionGravity: Triplet | null) {\n\t\tthis.inputs.set({ frictionGravity });\n\t}\n\n\t@Input({ alias: 'gravity' }) set _gravity(gravity: Triplet) {\n\t\tthis.inputs.set({ gravity });\n\t}\n\n\t@Input({ alias: 'iterations' }) set _iterations(iterations: number) {\n\t\tthis.inputs.set({ iterations });\n\t}\n\n\t@Input({ alias: 'quatNormalizeFast' }) set _quatNormalizeFast(quatNormalizeFast: boolean) {\n\t\tthis.inputs.set({ quatNormalizeFast });\n\t}\n\n\t@Input({ alias: 'quatNormalizeSkip' }) set _quatNormalizeSkip(quatNormalizeSkip: number) {\n\t\tthis.inputs.set({ quatNormalizeSkip });\n\t}\n\n\t@Input({ alias: 'solver' }) set _solver(solver: Solver) {\n\t\tthis.inputs.set({ solver });\n\t}\n\n\t@Input({ alias: 'tolerance' }) set _tolerance(tolerance: number) {\n\t\tthis.inputs.set({ tolerance });\n\t}\n\n\tprivate zone = inject(NgZone);\n\tprivate injector = inject(Injector);\n\n\tprivate store = injectNgtStore();\n\tprivate invalidate = this.store.select('invalidate');\n\n\tapi = signalStore<NgtcPhysicsApi>({\n\t\tbodies: {},\n\t\tevents: {},\n\t\trefs: {},\n\t\tscaleOverrides: {},\n\t\tsubscriptions: {},\n\t\tworker: null!,\n\t});\n\n\tprivate worker = this.api.select('worker');\n\n\tngOnInit() {\n\t\tthis.zone.runOutsideAngular(() => {\n\t\t\tthis.api.set({ worker: new CannonWorkerAPI(this.inputs.state()) });\n\t\t\tthis.connectWorker();\n\t\t\tthis.updateWorkerState('axisIndex');\n\t\t\tthis.updateWorkerState('broadphase');\n\t\t\tthis.updateWorkerState('gravity');\n\t\t\tthis.updateWorkerState('iterations');\n\t\t\tthis.updateWorkerState('tolerance');\n\t\t\tthis.beforeRender();\n\t\t});\n\t}\n\n\tprivate connectWorker() {\n\t\teffect(\n\t\t\t(onCleanup) => {\n\t\t\t\tconst worker = this.worker();\n\t\t\t\tif (!worker) return;\n\n\t\t\t\tworker.connect();\n\t\t\t\tworker.init();\n\n\t\t\t\t(worker as any).on('collide', this.collideHandler.bind(this));\n\t\t\t\t(worker as any).on('collideBegin', this.collideBeginHandler.bind(this));\n\t\t\t\t(worker as any).on('collideEnd', this.collideEndHandler.bind(this));\n\t\t\t\t(worker as any).on('frame', this.frameHandler.bind(this));\n\t\t\t\t(worker as any).on('rayhit', this.rayhitHandler.bind(this));\n\n\t\t\t\tonCleanup(() => {\n\t\t\t\t\tworker.terminate();\n\t\t\t\t\t(worker as any).removeAllListeners();\n\t\t\t\t});\n\t\t\t},\n\t\t\t{ injector: this.injector },\n\t\t);\n\t}\n\n\tprivate updateWorkerState(key: keyof NgtcPhysicsState) {\n\t\tconst compute = this.inputs.select(key);\n\t\teffect(\n\t\t\t() => {\n\t\t\t\tconst [worker, value] = [untracked(this.worker), compute()];\n\t\t\t\t// @ts-expect-error\n\t\t\t\tworker[key] = value;\n\t\t\t},\n\t\t\t{ injector: this.injector },\n\t\t);\n\t}\n\n\tprivate collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }: WorkerCollideEvent['data']) {\n\t\tconst { events, refs } = this.api.get();\n\t\tconst cb = events[target]?.collide;\n\n\t\tif (cb) {\n\t\t\tcb({\n\t\t\t\tbody: refs[body],\n\t\t\t\tcontact: { bi: refs[bi], bj: refs[bj], ...contactRest },\n\t\t\t\ttarget: refs[target],\n\t\t\t\t...rest,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate collideBeginHandler({ bodyA, bodyB }: WorkerCollideBeginEvent['data']) {\n\t\tconst { events, refs } = this.api.get();\n\t\tconst cbA = events[bodyA]?.collideBegin;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });\n\t\tconst cbB = events[bodyB]?.collideBegin;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });\n\t}\n\n\tprivate collideEndHandler({ bodyA, bodyB }: WorkerCollideEndEvent['data']) {\n\t\tconst { events, refs } = this.api.get();\n\t\tconst cbA = events[bodyA]?.collideEnd;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });\n\t\tconst cbB = events[bodyB]?.collideEnd;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideEnd' });\n\t}\n\n\tprivate frameHandler({\n\t\tactive,\n\t\tbodies: uuids = [],\n\t\tobservations,\n\t\tpositions,\n\t\tquaternions,\n\t}: WorkerFrameMessage['data']) {\n\t\tconst [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [\n\t\t\tthis.inputs.get(),\n\t\t\tthis.api.get(),\n\t\t\tthis.invalidate(),\n\t\t];\n\n\t\tfor (let i = 0; i < uuids.length; i++) {\n\t\t\tbodies[uuids[i]] = i;\n\t\t}\n\n\t\tobservations.forEach(([id, value, type]) => {\n\t\t\tconst subscription = subscriptions[id] || {};\n\t\t\tconst cb = subscription[type];\n\t\t\t// HELP: We clearly know the type of the callback, but typescript can't deal with it\n\t\t\tcb && cb(value as never);\n\t\t});\n\n\t\tif (!active) return;\n\n\t\tfor (const ref of Object.values(refs).filter(unique())) {\n\t\t\tif (ref instanceof THREE.InstancedMesh) {\n\t\t\t\tfor (let i = 0; i < ref.count; i++) {\n\t\t\t\t\tconst uuid = `${ref.uuid}/${i}`;\n\t\t\t\t\tconst index = bodies[uuid];\n\t\t\t\t\tif (index !== undefined) {\n\t\t\t\t\t\tref.setMatrixAt(i, apply(index, positions, quaternions, scaleOverrides[uuid]));\n\t\t\t\t\t\tref.instanceMatrix.needsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst scale = scaleOverrides[ref.uuid] || ref.scale;\n\t\t\t\tapply(bodies[ref.uuid], positions, quaternions, scale, ref);\n\t\t\t}\n\t\t}\n\t\tif (shouldInvalidate) invalidate();\n\t}\n\n\tprivate rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }: WorkerRayhitEvent['data']) {\n\t\tconst { events, refs } = this.api.get();\n\t\tconst cb = events[uuid]?.rayhit;\n\t\tif (cb) cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });\n\t}\n\n\tprivate beforeRender() {\n\t\tlet timeSinceLastCalled = 0;\n\t\tinjectBeforeRender(\n\t\t\t({ delta }) => {\n\t\t\t\tconst [{ isPaused, maxSubSteps, stepSize }, worker] = [this.inputs.get(), this.worker()];\n\t\t\t\tif (isPaused || !worker) return;\n\t\t\t\ttimeSinceLastCalled += delta;\n\t\t\t\tworker.step({ maxSubSteps, stepSize: stepSize!, timeSinceLastCalled });\n\t\t\t\ttimeSinceLastCalled = 0;\n\t\t\t},\n\t\t\t{ injector: this.injector },\n\t\t);\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAuBA,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAC9B,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;AACjC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAE9B,SAAS,KAAK,CAAC,KAAa,EAAE,SAAuB,EAAE,WAAyB,EAAE,KAAK,GAAG,CAAC,EAAE,MAAuB,EAAA;IACnH,IAAI,KAAK,KAAK,SAAS,EAAE;QACxB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACzF,QAAA,IAAI,MAAM,EAAE;AACX,YAAA,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAChC,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,SAAA;AACD,QAAA,OAAO,CAAC,CAAC;AACT,KAAA;AACD,IAAA,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,MAAM,GAAG,MAAK;IACnB,MAAM,MAAM,GAAc,EAAE,CAAC;AAC7B,IAAA,OAAO,CAAC,KAAc,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpF,CAAC,CAAC;AA2BW,MAAA,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,GAAG,oBAAoB,CAChF,CAAC,OAAoB,KAAK,OAAO,CAAC,GAAG,EACrC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,WAAW,CAAC,CAAC,EAAE,EACvD;MAQW,WAAW,CAAA;AANxB,IAAA,WAAA,GAAA;QAOS,IAAM,CAAA,MAAA,GAAG,WAAW,CAAmB;AAC9C,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,sBAAsB,EAAE,EAAE,wBAAwB,EAAE,GAAG,EAAE;AACzD,YAAA,eAAe,EAAE,IAAI;YACrB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACtB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,WAAW,EAAE,EAAE;AACf,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,iBAAiB,EAAE,CAAC;AACpB,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,CAAC,GAAG,EAAE;AAChB,YAAA,SAAS,EAAE,KAAK;AAChB,SAAA,CAAC,CAAC;AAoEK,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5B,IAAK,CAAA,KAAA,GAAG,cAAc,EAAE,CAAC;QACzB,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAErD,IAAG,CAAA,GAAA,GAAG,WAAW,CAAiB;AACjC,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,MAAM,EAAE,IAAK;AACb,SAAA,CAAC,CAAC;QAEK,IAAM,CAAA,MAAA,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAgJ3C,KAAA;IAjOA,IAAkC,SAAS,CAAC,QAAiB,EAAA;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC9B;IAED,IAAqC,YAAY,CAAC,WAAmB,EAAA;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;KACjC;IAED,IAA0C,iBAAiB,CAAC,gBAAyB,EAAA;QACpF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;KACtC;IAED,IAAkC,SAAS,CAAC,QAAgB,EAAA;QAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;KAC9B;IAED,IAA8B,KAAK,CAAC,IAAY,EAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAC1B;IAED,IAAoC,WAAW,CAAC,UAAmB,EAAA;QAClE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;KAChC;IAED,IAAmC,UAAU,CAAC,SAAoB,EAAA;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;KAC/B;IAED,IAAoC,WAAW,CAAC,UAAsB,EAAA;QACrE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;KAChC;IAED,IAAgD,uBAAuB,CACtE,sBAA8C,EAAA;QAE9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAAC;KAC5C;IAED,IAAyC,gBAAgB,CAAC,eAA+B,EAAA;QACxF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;KACrC;IAED,IAAiC,QAAQ,CAAC,OAAgB,EAAA;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;KAC7B;IAED,IAAoC,WAAW,CAAC,UAAkB,EAAA;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;KAChC;IAED,IAA2C,kBAAkB,CAAC,iBAA0B,EAAA;QACvF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;KACvC;IAED,IAA2C,kBAAkB,CAAC,iBAAyB,EAAA;QACtF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;KACvC;IAED,IAAgC,OAAO,CAAC,MAAc,EAAA;QACrD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;KAC5B;IAED,IAAmC,UAAU,CAAC,SAAiB,EAAA;QAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;KAC/B;IAmBD,QAAQ,GAAA;AACP,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,YAAY,EAAE,CAAC;AACrB,SAAC,CAAC,CAAC;KACH;IAEO,aAAa,GAAA;AACpB,QAAA,MAAM,CACL,CAAC,SAAS,KAAI;AACb,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,EAAE,CAAC;AAEb,YAAA,MAAc,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,YAAA,MAAc,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,YAAA,MAAc,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,YAAA,MAAc,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,YAAA,MAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAE5D,SAAS,CAAC,MAAK;gBACd,MAAM,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAc,CAAC,kBAAkB,EAAE,CAAC;AACtC,aAAC,CAAC,CAAC;SACH,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC3B,CAAC;KACF;AAEO,IAAA,iBAAiB,CAAC,GAA2B,EAAA;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CACL,MAAK;AACJ,YAAA,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;;AAE5D,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;SACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC3B,CAAC;KACF;AAEO,IAAA,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAA8B,EAAA;AAChH,QAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;AAEnC,QAAA,IAAI,EAAE,EAAE;AACP,YAAA,EAAE,CAAC;AACF,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;AAChB,gBAAA,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE;AACvD,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;AACpB,gBAAA,GAAG,IAAI;AACP,aAAA,CAAC,CAAC;AACH,SAAA;KACD;AAEO,IAAA,mBAAmB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAmC,EAAA;AAC5E,QAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;KAC5F;AAEO,IAAA,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAiC,EAAA;AACxE,QAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;KAC1F;AAEO,IAAA,YAAY,CAAC,EACpB,MAAM,EACN,MAAM,EAAE,KAAK,GAAG,EAAE,EAClB,YAAY,EACZ,SAAS,EACT,WAAW,GACiB,EAAA;AAC5B,QAAA,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,UAAU,CAAC,GAAG;AAC3F,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;AACjB,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,UAAU,EAAE;SACjB,CAAC;AAEF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,SAAA;AAED,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAI;YAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7C,YAAA,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;;AAE9B,YAAA,EAAE,IAAI,EAAE,CAAC,KAAc,CAAC,CAAC;AAC1B,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;AAEpB,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;AACvD,YAAA,IAAI,GAAG,YAAY,KAAK,CAAC,aAAa,EAAE;AACvC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACnC,MAAM,IAAI,GAAG,CAAG,EAAA,GAAG,CAAC,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;AAChC,oBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC3B,IAAI,KAAK,KAAK,SAAS,EAAE;AACxB,wBAAA,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/E,wBAAA,GAAG,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;AACtC,qBAAA;AACD,iBAAA;AACD,aAAA;AAAM,iBAAA;AACN,gBAAA,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;AACpD,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5D,aAAA;AACD,SAAA;AACD,QAAA,IAAI,gBAAgB;AAAE,YAAA,UAAU,EAAE,CAAC;KACnC;AAEO,IAAA,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,EAA6B,EAAA;AAC5F,QAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;AAChC,QAAA,IAAI,EAAE;AAAE,YAAA,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KACnF;IAEO,YAAY,GAAA;QACnB,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,QAAA,kBAAkB,CACjB,CAAC,EAAE,KAAK,EAAE,KAAI;YACb,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzF,IAAI,QAAQ,IAAI,CAAC,MAAM;gBAAE,OAAO;YAChC,mBAAmB,IAAI,KAAK,CAAC;AAC7B,YAAA,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACvE,mBAAmB,GAAG,CAAC,CAAC;SACxB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC3B,CAAC;KACF;8GApPW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,g0BAFZ,CAAC,qBAAqB,EAAE,CAAC,0BAD1B,CAAgB,cAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;2FAGd,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAgB,cAAA,CAAA;AAC1B,oBAAA,SAAS,EAAE,CAAC,qBAAqB,EAAE,CAAC;AACpC,iBAAA,CAAA;8BAqBkC,SAAS,EAAA,CAAA;sBAA1C,KAAK;uBAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;gBAIS,YAAY,EAAA,CAAA;sBAAhD,KAAK;uBAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAA;gBAIW,iBAAiB,EAAA,CAAA;sBAA1D,KAAK;uBAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAA;gBAIF,SAAS,EAAA,CAAA;sBAA1C,KAAK;uBAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;gBAIE,KAAK,EAAA,CAAA;sBAAlC,KAAK;uBAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;gBAIY,WAAW,EAAA,CAAA;sBAA9C,KAAK;uBAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;gBAIK,UAAU,EAAA,CAAA;sBAA5C,KAAK;uBAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;gBAIO,WAAW,EAAA,CAAA;sBAA9C,KAAK;uBAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;gBAIkB,uBAAuB,EAAA,CAAA;sBAAtE,KAAK;uBAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAA;gBAMD,gBAAgB,EAAA,CAAA;sBAAxD,KAAK;uBAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;gBAIF,QAAQ,EAAA,CAAA;sBAAxC,KAAK;uBAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;gBAIS,WAAW,EAAA,CAAA;sBAA9C,KAAK;uBAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;gBAIa,kBAAkB,EAAA,CAAA;sBAA5D,KAAK;uBAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;gBAIM,kBAAkB,EAAA,CAAA;sBAA5D,KAAK;uBAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;gBAIL,OAAO,EAAA,CAAA;sBAAtC,KAAK;uBAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;gBAIS,UAAU,EAAA,CAAA;sBAA5C,KAAK;uBAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAA;;;ACnK9B;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"angular-three-cannon.mjs","sources":["../../../../libs/cannon/src/lib/physics.ts","../../../../libs/cannon/src/angular-three-cannon.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tDestroyRef,\n\tEmbeddedViewRef,\n\tSignal,\n\tafterNextRender,\n\tcomputed,\n\tinject,\n\tinput,\n\tsignal,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCannonWorkerAPI,\n\tCannonWorkerProps,\n\tCollideBeginEvent,\n\tCollideEndEvent,\n\tCollideEvent,\n\tRayhitEvent,\n\tRefs,\n\tSubscriptions,\n\tWorkerCollideBeginEvent,\n\tWorkerCollideEndEvent,\n\tWorkerCollideEvent,\n\tWorkerFrameMessage,\n\tWorkerRayhitEvent,\n} from '@pmndrs/cannon-worker-api';\nimport { injectBeforeRender, injectStore } from 'angular-three';\nimport { injectAutoEffect } from 'ngxtension/auto-effect';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport { InstancedMesh, Matrix4, Object3D, Quaternion, QuaternionTuple, Vector3 } from 'three';\n\nexport interface NgtcCannonWorkerEvents {\n\tcollide: WorkerCollideEvent;\n\tcollideBegin: WorkerCollideBeginEvent;\n\tcollideEnd: WorkerCollideEndEvent;\n\tframe: WorkerFrameMessage;\n\trayhit: WorkerRayhitEvent;\n}\n\nexport type NgtcCannonWorker = CannonWorkerAPI & {\n\ton: <K extends keyof NgtcCannonWorkerEvents>(event: K, cb: (data: NgtcCannonWorkerEvents[K]['data']) => void) => void;\n\tremoveAllListeners: () => void;\n};\n\nconst v = new Vector3();\nconst s = new Vector3(1, 1, 1);\nconst q = new Quaternion();\nconst m = new Matrix4();\n\nfunction apply(\n\tindex: number,\n\tpositions: ArrayLike<number>,\n\tquaternions: ArrayLike<number>,\n\tscale = s,\n\tobject?: Object3D,\n) {\n\tif (index !== undefined) {\n\t\tm.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions as QuaternionTuple, index * 4), scale);\n\t\tif (object) {\n\t\t\tobject.matrixAutoUpdate = false;\n\t\t\tobject.matrix.copy(m);\n\t\t}\n\t\treturn m;\n\t}\n\treturn m.identity();\n}\n\nfunction unique() {\n\tconst values: unknown[] = [];\n\treturn (value: unknown) => (values.includes(value) ? false : !!values.push(value));\n}\n\ntype NgtcCannonEvent = CollideBeginEvent | CollideEndEvent | CollideEvent | RayhitEvent;\ntype NgtcCallbackByType<T extends { type: string }> = {\n\t[K in T['type']]?: T extends { type: K } ? (e: T) => void : never;\n};\n\nexport type NgtcCannonEvents = Record<string, Partial<NgtcCallbackByType<NgtcCannonEvent>>>;\n\nexport type ScaleOverrides = Record<string, Vector3>;\n\nexport interface NgtcPhysicsInputs extends CannonWorkerProps {\n\tisPaused?: boolean;\n\tmaxSubSteps?: number;\n\tshouldInvalidate?: boolean;\n\tstepSize?: number;\n}\n\nexport interface NgtcPhysicsApi {\n\tbodies: { [uuid: string]: number };\n\tevents: NgtcCannonEvents;\n\trefs: Refs;\n\tscaleOverrides: ScaleOverrides;\n\tsubscriptions: Subscriptions;\n\tworker: Signal<CannonWorkerAPI>;\n}\n\nconst defaultOptions: NgtcPhysicsInputs = {\n\tallowSleep: false,\n\taxisIndex: 0,\n\tbroadphase: 'Naive',\n\tdefaultContactMaterial: { contactEquationStiffness: 1e6 },\n\tfrictionGravity: null,\n\tgravity: [0, -9.81, 0],\n\tisPaused: false,\n\titerations: 5,\n\tmaxSubSteps: 10,\n\tquatNormalizeFast: false,\n\tquatNormalizeSkip: 0,\n\tshouldInvalidate: true,\n\tsize: 1000,\n\tsolver: 'GS',\n\tstepSize: 1 / 60,\n\ttolerance: 0.001,\n};\n\n@Component({\n\tselector: 'ngtc-physics',\n\tstandalone: true,\n\ttemplate: `\n\t\t<ng-content />\n\t`,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgtcPhysics {\n\tprivate autoEffect = injectAutoEffect();\n\tprivate store = injectStore();\n\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate invalidate = this.store.select('invalidate');\n\t// @ts-expect-error - worker is not nullable, and we don't want to use ! operator\n\tprivate worker = signal<CannonWorkerAPI>(null);\n\n\tapi: NgtcPhysicsApi = {\n\t\tbodies: {},\n\t\tevents: {},\n\t\trefs: {},\n\t\tscaleOverrides: {},\n\t\tsubscriptions: {},\n\t\tworker: this.worker.asReadonly(),\n\t};\n\n\tprivate ref?: EmbeddedViewRef<{ $implicit: NgtcPhysicsApi }>;\n\n\tconstructor() {\n\t\tafterNextRender(() => {\n\t\t\tthis.worker.set(new CannonWorkerAPI(this.options()));\n\t\t\tthis.connectWorker();\n\t\t\tthis.updateWorkerState('axisIndex');\n\t\t\tthis.updateWorkerState('broadphase');\n\t\t\tthis.updateWorkerState('gravity');\n\t\t\tthis.updateWorkerState('iterations');\n\t\t\tthis.updateWorkerState('tolerance');\n\t\t});\n\n\t\tlet timeSinceLastCalled = 0;\n\t\tinjectBeforeRender(({ delta }) => {\n\t\t\tconst [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];\n\t\t\tif (isPaused || !worker || stepSize == null) return;\n\t\t\ttimeSinceLastCalled += delta;\n\t\t\tworker.step({ maxSubSteps, stepSize, timeSinceLastCalled });\n\t\t\ttimeSinceLastCalled = 0;\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.ref?.destroy();\n\t\t});\n\t}\n\n\tprivate connectWorker() {\n\t\tthis.autoEffect(() => {\n\t\t\tconst worker = this.worker() as NgtcCannonWorker;\n\t\t\tif (!worker) return;\n\n\t\t\tworker.connect();\n\t\t\tworker.init();\n\n\t\t\tworker.on('collide', this.collideHandler.bind(this));\n\t\t\tworker.on('collideBegin', this.collideBeginHandler.bind(this));\n\t\t\tworker.on('collideEnd', this.collideEndHandler.bind(this));\n\t\t\tworker.on('frame', this.frameHandler.bind(this));\n\t\t\tworker.on('rayhit', this.rayhitHandler.bind(this));\n\n\t\t\treturn () => {\n\t\t\t\tworker.terminate();\n\t\t\t\tworker.removeAllListeners();\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate updateWorkerState(key: keyof NgtcPhysicsInputs) {\n\t\tconst computedValue = computed(() => this.options()[key]);\n\n\t\tthis.autoEffect(() => {\n\t\t\tconst [worker, value] = [untracked(this.worker), computedValue()];\n\t\t\t// @ts-expect-error - we know key is a valid key of CannonWorkerAPI\n\t\t\tworker[key] = value;\n\t\t});\n\t}\n\n\tprivate collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }: WorkerCollideEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[target]?.collide;\n\t\tif (cb) {\n\t\t\tcb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });\n\t\t}\n\t}\n\n\tprivate collideBeginHandler({ bodyA, bodyB }: WorkerCollideBeginEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideBegin;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });\n\t\tconst cbB = events[bodyB]?.collideBegin;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });\n\t}\n\n\tprivate collideEndHandler({ bodyA, bodyB }: WorkerCollideEndEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cbA = events[bodyA]?.collideEnd;\n\t\tif (cbA) cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });\n\t\tconst cbB = events[bodyB]?.collideEnd;\n\t\tif (cbB) cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideEnd' });\n\t}\n\n\tprivate frameHandler({\n\t\tactive,\n\t\tbodies: uuids = [],\n\t\tobservations,\n\t\tpositions,\n\t\tquaternions,\n\t}: WorkerFrameMessage['data']) {\n\t\tconst [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [\n\t\t\tuntracked(this.options),\n\t\t\tthis.api,\n\t\t\tthis.invalidate(),\n\t\t];\n\t\tfor (let i = 0; i < uuids.length; i++) {\n\t\t\tbodies[uuids[i]] = i;\n\t\t}\n\t\tobservations.forEach(([id, value, type]) => {\n\t\t\tconst subscription = subscriptions[id] || {};\n\t\t\tconst cb = subscription[type];\n\t\t\t// @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it\n\t\t\tcb && cb(value);\n\t\t});\n\t\tif (!active) return;\n\t\tfor (const ref of Object.values(refs).filter(unique())) {\n\t\t\tif (ref instanceof InstancedMesh) {\n\t\t\t\tfor (let i = 0; i < ref.count; i++) {\n\t\t\t\t\tconst uuid = `${ref.uuid}/${i}`;\n\t\t\t\t\tconst index = bodies[uuid];\n\t\t\t\t\tif (index !== undefined) {\n\t\t\t\t\t\tref.setMatrixAt(i, apply(index, positions, quaternions, scaleOverrides[uuid]));\n\t\t\t\t\t\tref.instanceMatrix.needsUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst scale = scaleOverrides[ref.uuid] || ref.scale;\n\t\t\t\tapply(bodies[ref.uuid], positions, quaternions, scale, ref);\n\t\t\t}\n\t\t}\n\t\tif (shouldInvalidate) invalidate();\n\t}\n\n\tprivate rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }: WorkerRayhitEvent['data']) {\n\t\tconst { events, refs } = this.api;\n\t\tconst cb = events[uuid]?.rayhit;\n\t\tif (cb) cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AA8CA,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AACxB,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;AAC3B,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AAExB,SAAS,KAAK,CACb,KAAa,EACb,SAA4B,EAC5B,WAA8B,EAC9B,KAAK,GAAG,CAAC,EACT,MAAiB,EAAA;AAEjB,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;QACxB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,WAA8B,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5G,IAAI,MAAM,EAAE;AACX,YAAA,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAChC,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACtB;AACD,QAAA,OAAO,CAAC,CAAC;KACT;AACD,IAAA,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,MAAM,GAAA;IACd,MAAM,MAAM,GAAc,EAAE,CAAC;AAC7B,IAAA,OAAO,CAAC,KAAc,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpF,CAAC;AA2BD,MAAM,cAAc,GAAsB;AACzC,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,UAAU,EAAE,OAAO;AACnB,IAAA,sBAAsB,EAAE,EAAE,wBAAwB,EAAE,GAAG,EAAE;AACzD,IAAA,eAAe,EAAE,IAAI;IACrB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACtB,IAAA,QAAQ,EAAE,KAAK;AACf,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,iBAAiB,EAAE,KAAK;AACxB,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,CAAC,GAAG,EAAE;AAChB,IAAA,SAAS,EAAE,KAAK;CAChB,CAAC;MAUW,WAAW,CAAA;AAqBvB,IAAA,WAAA,GAAA;QApBQ,IAAU,CAAA,UAAA,GAAG,gBAAgB,EAAE,CAAC;QAChC,IAAK,CAAA,KAAA,GAAG,WAAW,EAAE,CAAC;AAE9B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAEpE,IAAU,CAAA,UAAA,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;;AAE7C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;AAE/C,QAAA,IAAA,CAAA,GAAG,GAAmB;AACrB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;SAChC,CAAC;QAKD,eAAe,CAAC,MAAK;AACpB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;AACrC,SAAC,CAAC,CAAC;QAEH,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAC5B,QAAA,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,KAAI;YAChC,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACtF,YAAA,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,QAAQ,IAAI,IAAI;gBAAE,OAAO;YACpD,mBAAmB,IAAI,KAAK,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC5D,mBAAmB,GAAG,CAAC,CAAC;AACzB,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AACjC,YAAA,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;AACrB,SAAC,CAAC,CAAC;KACH;IAEO,aAAa,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,MAAK;AACpB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAsB,CAAC;AACjD,YAAA,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,EAAE,CAAC;AAEd,YAAA,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,YAAA,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,YAAA,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,YAAA,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,YAAA,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnD,YAAA,OAAO,MAAK;gBACX,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,kBAAkB,EAAE,CAAC;AAC7B,aAAC,CAAC;AACH,SAAC,CAAC,CAAC;KACH;AAEO,IAAA,iBAAiB,CAAC,GAA4B,EAAA;AACrD,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,QAAA,IAAI,CAAC,UAAU,CAAC,MAAK;AACpB,YAAA,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;;AAElE,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACrB,SAAC,CAAC,CAAC;KACH;AAEO,IAAA,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAA8B,EAAA;QAChH,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACnC,IAAI,EAAE,EAAE;AACP,YAAA,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;SACjH;KACD;AAEO,IAAA,mBAAmB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAmC,EAAA;QAC5E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;AACxC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;KAC5F;AAEO,IAAA,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAiC,EAAA;QACxE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;AACtC,QAAA,IAAI,GAAG;YAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;KAC1F;AAEO,IAAA,YAAY,CAAC,EACpB,MAAM,EACN,MAAM,EAAE,KAAK,GAAG,EAAE,EAClB,YAAY,EACZ,SAAS,EACT,WAAW,GACiB,EAAA;AAC5B,QAAA,MAAM,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,UAAU,CAAC,GAAG;AAC3F,YAAA,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AACvB,YAAA,IAAI,CAAC,GAAG;YACR,IAAI,CAAC,UAAU,EAAE;SACjB,CAAC;AACF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SACrB;AACD,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAI;YAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7C,YAAA,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;;AAE9B,YAAA,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;AACjB,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;AACpB,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;AACvD,YAAA,IAAI,GAAG,YAAY,aAAa,EAAE;AACjC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACnC,MAAM,IAAI,GAAG,CAAG,EAAA,GAAG,CAAC,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAC;AAChC,oBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,oBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACxB,wBAAA,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/E,wBAAA,GAAG,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC;qBACtC;iBACD;aACD;iBAAM;AACN,gBAAA,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;AACpD,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;aAC5D;SACD;AACD,QAAA,IAAI,gBAAgB;AAAE,YAAA,UAAU,EAAE,CAAC;KACnC;AAEO,IAAA,aAAa,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,EAA6B,EAAA;QAC5F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;QAClC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;AAChC,QAAA,IAAI,EAAE;AAAE,YAAA,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KACnF;8GAjJW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EALb,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;AAET,CAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;2FAGW,WAAW,EAAA,UAAA,EAAA,CAAA;kBARvB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA;;AAET,CAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,iBAAA,CAAA;;;AC7HD;;AAEG;;;;"}
|
package/lib/physics.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import * as THREE from 'three';
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
import { CannonWorkerAPI, CannonWorkerProps, CollideBeginEvent, CollideEndEvent, CollideEvent, RayhitEvent, Refs, Subscriptions, WorkerCollideBeginEvent, WorkerCollideEndEvent, WorkerCollideEvent, WorkerFrameMessage, WorkerRayhitEvent } from '@pmndrs/cannon-worker-api';
|
|
3
|
+
import { Vector3 } from 'three';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
export interface NgtcCannonWorkerEvents {
|
|
6
|
+
collide: WorkerCollideEvent;
|
|
7
|
+
collideBegin: WorkerCollideBeginEvent;
|
|
8
|
+
collideEnd: WorkerCollideEndEvent;
|
|
9
|
+
frame: WorkerFrameMessage;
|
|
10
|
+
rayhit: WorkerRayhitEvent;
|
|
11
|
+
}
|
|
12
|
+
export type NgtcCannonWorker = CannonWorkerAPI & {
|
|
13
|
+
on: <K extends keyof NgtcCannonWorkerEvents>(event: K, cb: (data: NgtcCannonWorkerEvents[K]['data']) => void) => void;
|
|
14
|
+
removeAllListeners: () => void;
|
|
11
15
|
};
|
|
12
16
|
type NgtcCannonEvent = CollideBeginEvent | CollideEndEvent | CollideEvent | RayhitEvent;
|
|
13
17
|
type NgtcCallbackByType<T extends {
|
|
@@ -17,13 +21,15 @@ type NgtcCallbackByType<T extends {
|
|
|
17
21
|
type: K;
|
|
18
22
|
} ? (e: T) => void : never;
|
|
19
23
|
};
|
|
20
|
-
export type NgtcCannonEvents =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
export type NgtcCannonEvents = Record<string, Partial<NgtcCallbackByType<NgtcCannonEvent>>>;
|
|
25
|
+
export type ScaleOverrides = Record<string, Vector3>;
|
|
26
|
+
export interface NgtcPhysicsInputs extends CannonWorkerProps {
|
|
27
|
+
isPaused?: boolean;
|
|
28
|
+
maxSubSteps?: number;
|
|
29
|
+
shouldInvalidate?: boolean;
|
|
30
|
+
stepSize?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface NgtcPhysicsApi {
|
|
27
33
|
bodies: {
|
|
28
34
|
[uuid: string]: number;
|
|
29
35
|
};
|
|
@@ -31,40 +37,17 @@ export type NgtcPhysicsApi = {
|
|
|
31
37
|
refs: Refs;
|
|
32
38
|
scaleOverrides: ScaleOverrides;
|
|
33
39
|
subscriptions: Subscriptions;
|
|
34
|
-
worker: CannonWorkerAPI
|
|
35
|
-
}
|
|
36
|
-
export declare
|
|
37
|
-
|
|
38
|
-
(injectOptions: import("@angular/core").InjectOptions & {
|
|
39
|
-
optional?: false | undefined;
|
|
40
|
-
}): import("angular-three").NgtSignalStore<NgtcPhysicsApi>;
|
|
41
|
-
(injectOptions: import("@angular/core").InjectOptions): import("angular-three").NgtSignalStore<NgtcPhysicsApi> | null;
|
|
42
|
-
}, provideNgtcPhysicsApi: (value?: import("angular-three").NgtSignalStore<NgtcPhysicsApi> | undefined) => import("@angular/core").Provider;
|
|
43
|
-
export declare class NgtcPhysics implements OnInit {
|
|
44
|
-
private inputs;
|
|
45
|
-
set _isPaused(isPaused: boolean);
|
|
46
|
-
set _maxSubSteps(maxSubSteps: number);
|
|
47
|
-
set _shouldInvalidate(shouldInvalidate: boolean);
|
|
48
|
-
set _stepSize(stepSize: number);
|
|
49
|
-
set _size(size: number);
|
|
50
|
-
set _allowSleep(allowSleep: boolean);
|
|
51
|
-
set _axisIndex(axisIndex: 0 | 1 | 2);
|
|
52
|
-
set _broadphase(broadphase: Broadphase);
|
|
53
|
-
set _defaultContactMaterial(defaultContactMaterial: ContactMaterialOptions);
|
|
54
|
-
set _frictionGravity(frictionGravity: Triplet | null);
|
|
55
|
-
set _gravity(gravity: Triplet);
|
|
56
|
-
set _iterations(iterations: number);
|
|
57
|
-
set _quatNormalizeFast(quatNormalizeFast: boolean);
|
|
58
|
-
set _quatNormalizeSkip(quatNormalizeSkip: number);
|
|
59
|
-
set _solver(solver: Solver);
|
|
60
|
-
set _tolerance(tolerance: number);
|
|
61
|
-
private zone;
|
|
62
|
-
private injector;
|
|
40
|
+
worker: Signal<CannonWorkerAPI>;
|
|
41
|
+
}
|
|
42
|
+
export declare class NgtcPhysics {
|
|
43
|
+
private autoEffect;
|
|
63
44
|
private store;
|
|
45
|
+
options: import("@angular/core").InputSignalWithTransform<NgtcPhysicsInputs, "" | Partial<NgtcPhysicsInputs>>;
|
|
64
46
|
private invalidate;
|
|
65
|
-
api: import("angular-three").NgtSignalStore<NgtcPhysicsApi>;
|
|
66
47
|
private worker;
|
|
67
|
-
|
|
48
|
+
api: NgtcPhysicsApi;
|
|
49
|
+
private ref?;
|
|
50
|
+
constructor();
|
|
68
51
|
private connectWorker;
|
|
69
52
|
private updateWorkerState;
|
|
70
53
|
private collideHandler;
|
|
@@ -72,8 +55,7 @@ export declare class NgtcPhysics implements OnInit {
|
|
|
72
55
|
private collideEndHandler;
|
|
73
56
|
private frameHandler;
|
|
74
57
|
private rayhitHandler;
|
|
75
|
-
private beforeRender;
|
|
76
58
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtcPhysics, never>;
|
|
77
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtcPhysics, "ngtc-physics", never, { "
|
|
59
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtcPhysics, "ngtc-physics", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
78
60
|
}
|
|
79
61
|
export {};
|