angular-three-rapier 2.13.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/angular-three-rapier.mjs +69 -74
- package/fesm2022/angular-three-rapier.mjs.map +1 -1
- package/lib/instanced-rigid-bodies.d.ts +2 -2
- package/lib/mesh-collider.d.ts +2 -2
- package/lib/physics.d.ts +1 -1
- package/lib/types.d.ts +0 -10
- package/package.json +4 -6
- package/esm2022/angular-three-rapier.mjs +0 -5
- package/esm2022/index.mjs +0 -7
- package/esm2022/lib/colliders.mjs +0 -356
- package/esm2022/lib/debug.mjs +0 -46
- package/esm2022/lib/frame-stepper.mjs +0 -44
- package/esm2022/lib/instanced-rigid-bodies.mjs +0 -192
- package/esm2022/lib/joints.mjs +0 -111
- package/esm2022/lib/mesh-collider.mjs +0 -67
- package/esm2022/lib/physics.mjs +0 -391
- package/esm2022/lib/rigid-body.mjs +0 -561
- package/esm2022/lib/shared.mjs +0 -10
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/utils.mjs +0 -151
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, ElementRef, inject, input, untracked, viewChild, viewChildren, } from '@angular/core';
|
|
2
|
-
import { applyProps, extend, getLocalState, pick, } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { DynamicDrawUsage, Object3D } from 'three';
|
|
5
|
-
import { NgtrPhysics } from './physics';
|
|
6
|
-
import { NgtrAnyCollider, NgtrRigidBody, rigidBodyDefaultOptions } from './rigid-body';
|
|
7
|
-
import { createColliderOptions } from './utils';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
const defaultOptions = rigidBodyDefaultOptions;
|
|
10
|
-
export class NgtrInstancedRigidBodies {
|
|
11
|
-
position = input([0, 0, 0]);
|
|
12
|
-
rotation = input([0, 0, 0]);
|
|
13
|
-
scale = input([1, 1, 1]);
|
|
14
|
-
quaternion = input([0, 0, 0, 1]);
|
|
15
|
-
userData = input({});
|
|
16
|
-
instances = input([], {
|
|
17
|
-
alias: 'ngtrInstancedRigidBodies',
|
|
18
|
-
transform: (value) => {
|
|
19
|
-
if (value === '')
|
|
20
|
-
return [];
|
|
21
|
-
return value;
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
|
|
25
|
-
object3DParameters = computed(() => {
|
|
26
|
-
return {
|
|
27
|
-
position: this.position(),
|
|
28
|
-
rotation: this.rotation(),
|
|
29
|
-
scale: this.scale(),
|
|
30
|
-
quaternion: this.quaternion(),
|
|
31
|
-
userData: this.userData(),
|
|
32
|
-
};
|
|
33
|
-
});
|
|
34
|
-
instanceWrapperRef = viewChild.required('instanceWrapper');
|
|
35
|
-
rigidBodyRefs = viewChildren(NgtrRigidBody);
|
|
36
|
-
physics = inject(NgtrPhysics);
|
|
37
|
-
objectRef = inject(ElementRef);
|
|
38
|
-
colliders = pick(this.options, 'colliders');
|
|
39
|
-
instancedMesh = computed(() => {
|
|
40
|
-
const instanceWrapper = this.instanceWrapperRef().nativeElement;
|
|
41
|
-
if (!instanceWrapper)
|
|
42
|
-
return null;
|
|
43
|
-
const localState = getLocalState(instanceWrapper);
|
|
44
|
-
if (!localState)
|
|
45
|
-
return null;
|
|
46
|
-
// track object's children
|
|
47
|
-
localState.objects();
|
|
48
|
-
const firstChild = instanceWrapper.children[0];
|
|
49
|
-
if (!firstChild || !firstChild.isInstancedMesh)
|
|
50
|
-
return null;
|
|
51
|
-
return firstChild;
|
|
52
|
-
});
|
|
53
|
-
instancesOptions = computed(() => {
|
|
54
|
-
const [instances, options, instancedMesh] = [this.instances(), untracked(this.options), this.instancedMesh()];
|
|
55
|
-
if (!instancedMesh)
|
|
56
|
-
return [];
|
|
57
|
-
return instances.map((instance, index) => ({
|
|
58
|
-
...instance,
|
|
59
|
-
options: {
|
|
60
|
-
...options,
|
|
61
|
-
...(instance.options || {}),
|
|
62
|
-
transformState: (state) => {
|
|
63
|
-
return {
|
|
64
|
-
...state,
|
|
65
|
-
getMatrix: (matrix) => {
|
|
66
|
-
instancedMesh.getMatrixAt(index, matrix);
|
|
67
|
-
return matrix;
|
|
68
|
-
},
|
|
69
|
-
setMatrix: (matrix) => {
|
|
70
|
-
instancedMesh.setMatrixAt(index, matrix);
|
|
71
|
-
instancedMesh.instanceMatrix.needsUpdate = true;
|
|
72
|
-
},
|
|
73
|
-
meshType: 'instancedMesh',
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
key: `${instance.key}-${index}` + `${instancedMesh?.uuid || ''}`,
|
|
78
|
-
}));
|
|
79
|
-
});
|
|
80
|
-
childColliderOptions = computed(() => {
|
|
81
|
-
const colliders = this.colliders();
|
|
82
|
-
// if self colliders is false explicitly, disable auto colliders for this object entirely.
|
|
83
|
-
if (colliders === false)
|
|
84
|
-
return [];
|
|
85
|
-
const physicsColliders = this.physics.colliders();
|
|
86
|
-
// if physics colliders is false explicitly AND colliders is not set, disable auto colliders for this object entirely.
|
|
87
|
-
if (physicsColliders === false && colliders === undefined)
|
|
88
|
-
return [];
|
|
89
|
-
const options = this.options();
|
|
90
|
-
// if colliders on object is not set, use physics colliders
|
|
91
|
-
if (!options.colliders)
|
|
92
|
-
options.colliders = physicsColliders;
|
|
93
|
-
const objectLocalState = getLocalState(this.objectRef.nativeElement);
|
|
94
|
-
if (!objectLocalState)
|
|
95
|
-
return [];
|
|
96
|
-
// track object's parent and non-object children
|
|
97
|
-
const [parent] = [objectLocalState.parent(), objectLocalState.nonObjects()];
|
|
98
|
-
if (!parent || !parent.isObject3D)
|
|
99
|
-
return [];
|
|
100
|
-
return createColliderOptions(this.objectRef.nativeElement, options);
|
|
101
|
-
});
|
|
102
|
-
constructor() {
|
|
103
|
-
extend({ Object3D });
|
|
104
|
-
effect(() => {
|
|
105
|
-
const object3DParameters = this.object3DParameters();
|
|
106
|
-
applyProps(this.objectRef.nativeElement, object3DParameters);
|
|
107
|
-
});
|
|
108
|
-
effect(() => {
|
|
109
|
-
const instancedMesh = this.instancedMesh();
|
|
110
|
-
if (!instancedMesh)
|
|
111
|
-
return;
|
|
112
|
-
instancedMesh.instanceMatrix.setUsage(DynamicDrawUsage);
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrInstancedRigidBodies, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
116
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtrInstancedRigidBodies, isStandalone: true, selector: "ngt-object3D[ngtrInstancedRigidBodies]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, rotation: { classPropertyName: "rotation", publicName: "rotation", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, quaternion: { classPropertyName: "quaternion", publicName: "quaternion", isSignal: true, isRequired: false, transformFunction: null }, userData: { classPropertyName: "userData", publicName: "userData", isSignal: true, isRequired: false, transformFunction: null }, instances: { classPropertyName: "instances", publicName: "ngtrInstancedRigidBodies", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "instanceWrapperRef", first: true, predicate: ["instanceWrapper"], descendants: true, isSignal: true }, { propertyName: "rigidBodyRefs", predicate: NgtrRigidBody, descendants: true, isSignal: true }], exportAs: ["instancedRigidBodies"], ngImport: i0, template: `
|
|
117
|
-
<ngt-object3D #instanceWrapper>
|
|
118
|
-
<ng-content />
|
|
119
|
-
</ngt-object3D>
|
|
120
|
-
|
|
121
|
-
@for (instance of instancesOptions(); track instance.key) {
|
|
122
|
-
<ngt-object3D
|
|
123
|
-
[ngtrRigidBody]="instance.type"
|
|
124
|
-
[options]="instance.options"
|
|
125
|
-
[position]="instance.position"
|
|
126
|
-
[rotation]="instance.rotation"
|
|
127
|
-
[scale]="instance.scale"
|
|
128
|
-
[quaternion]="instance.quaternion"
|
|
129
|
-
[userData]="instance.userData"
|
|
130
|
-
[name]="instance.key + '-instanced-rigid-body-' + $index"
|
|
131
|
-
>
|
|
132
|
-
<ng-content select="[data-colliders]" />
|
|
133
|
-
|
|
134
|
-
@for (childColliderOption of childColliderOptions(); track $index) {
|
|
135
|
-
<ngt-object3D
|
|
136
|
-
[ngtrCollider]="childColliderOption.shape"
|
|
137
|
-
[args]="childColliderOption.args"
|
|
138
|
-
[position]="childColliderOption.position"
|
|
139
|
-
[rotation]="childColliderOption.rotation"
|
|
140
|
-
[scale]="childColliderOption.scale"
|
|
141
|
-
[name]="objectRef.nativeElement.name + '-instanced-collider-' + $index"
|
|
142
|
-
[options]="childColliderOption.colliderOptions"
|
|
143
|
-
/>
|
|
144
|
-
}
|
|
145
|
-
</ngt-object3D>
|
|
146
|
-
}
|
|
147
|
-
`, isInline: true, dependencies: [{ kind: "component", type: NgtrRigidBody, selector: "ngt-object3D[ngtrRigidBody]", inputs: ["ngtrRigidBody", "position", "rotation", "scale", "quaternion", "userData", "options"], outputs: ["wake", "sleep", "collisionEnter", "collisionExit", "intersectionEnter", "intersectionExit", "contactForce"], exportAs: ["rigidBody"] }, { kind: "directive", type: NgtrAnyCollider, selector: "ngt-object3D[ngtrCollider]", inputs: ["position", "rotation", "scale", "quaternion", "userData", "name", "options", "ngtrCollider", "args"], outputs: ["ngtrColliderChange", "argsChange", "collisionEnter", "collisionExit", "intersectionEnter", "intersectionExit", "contactForce"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
148
|
-
}
|
|
149
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrInstancedRigidBodies, decorators: [{
|
|
150
|
-
type: Component,
|
|
151
|
-
args: [{
|
|
152
|
-
selector: 'ngt-object3D[ngtrInstancedRigidBodies]',
|
|
153
|
-
exportAs: 'instancedRigidBodies',
|
|
154
|
-
standalone: true,
|
|
155
|
-
template: `
|
|
156
|
-
<ngt-object3D #instanceWrapper>
|
|
157
|
-
<ng-content />
|
|
158
|
-
</ngt-object3D>
|
|
159
|
-
|
|
160
|
-
@for (instance of instancesOptions(); track instance.key) {
|
|
161
|
-
<ngt-object3D
|
|
162
|
-
[ngtrRigidBody]="instance.type"
|
|
163
|
-
[options]="instance.options"
|
|
164
|
-
[position]="instance.position"
|
|
165
|
-
[rotation]="instance.rotation"
|
|
166
|
-
[scale]="instance.scale"
|
|
167
|
-
[quaternion]="instance.quaternion"
|
|
168
|
-
[userData]="instance.userData"
|
|
169
|
-
[name]="instance.key + '-instanced-rigid-body-' + $index"
|
|
170
|
-
>
|
|
171
|
-
<ng-content select="[data-colliders]" />
|
|
172
|
-
|
|
173
|
-
@for (childColliderOption of childColliderOptions(); track $index) {
|
|
174
|
-
<ngt-object3D
|
|
175
|
-
[ngtrCollider]="childColliderOption.shape"
|
|
176
|
-
[args]="childColliderOption.args"
|
|
177
|
-
[position]="childColliderOption.position"
|
|
178
|
-
[rotation]="childColliderOption.rotation"
|
|
179
|
-
[scale]="childColliderOption.scale"
|
|
180
|
-
[name]="objectRef.nativeElement.name + '-instanced-collider-' + $index"
|
|
181
|
-
[options]="childColliderOption.colliderOptions"
|
|
182
|
-
/>
|
|
183
|
-
}
|
|
184
|
-
</ngt-object3D>
|
|
185
|
-
}
|
|
186
|
-
`,
|
|
187
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
188
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
189
|
-
imports: [NgtrRigidBody, NgtrAnyCollider],
|
|
190
|
-
}]
|
|
191
|
-
}], ctorParameters: () => [] });
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2VkLXJpZ2lkLWJvZGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmFwaWVyL3NyYy9saWIvaW5zdGFuY2VkLXJpZ2lkLWJvZGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixhQUFhLEVBS2IsSUFBSSxHQUNKLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQWlCLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXZGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFhaEQsTUFBTSxjQUFjLEdBQXlCLHVCQUF1QixDQUFDO0FBMENyRSxNQUFNLE9BQU8sd0JBQXdCO0lBQ3BDLFFBQVEsR0FBRyxLQUFLLENBQXlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELFFBQVEsR0FBRyxLQUFLLENBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELEtBQUssR0FBRyxLQUFLLENBQXlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lB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QUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0JUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztpQkFDekMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRjb21wdXRlZCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdGlucHV0LFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcblx0dmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdGFwcGx5UHJvcHMsXG5cdGV4dGVuZCxcblx0Z2V0TG9jYWxTdGF0ZSxcblx0Tmd0RXVsZXIsXG5cdE5ndE9iamVjdDNELFxuXHROZ3RRdWF0ZXJuaW9uLFxuXHROZ3RWZWN0b3IzLFxuXHRwaWNrLFxufSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IER5bmFtaWNEcmF3VXNhZ2UsIEluc3RhbmNlZE1lc2gsIE9iamVjdDNEIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0clBoeXNpY3MgfSBmcm9tICcuL3BoeXNpY3MnO1xuaW1wb3J0IHsgTmd0ckFueUNvbGxpZGVyLCBOZ3RyUmlnaWRCb2R5LCByaWdpZEJvZHlEZWZhdWx0T3B0aW9ucyB9IGZyb20gJy4vcmlnaWQtYm9keSc7XG5pbXBvcnQgeyBOZ3RyUmlnaWRCb2R5T3B0aW9ucywgTmd0clJpZ2lkQm9keVN0YXRlLCBOZ3RyUmlnaWRCb2R5VHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29sbGlkZXJPcHRpb25zIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0ckluc3RhbmNlZFJpZ2lkQm9keU9wdGlvbnMge1xuXHRrZXk6IHN0cmluZyB8IG51bWJlcjtcblx0dHlwZT86IE5ndHJSaWdpZEJvZHlUeXBlO1xuXHRwb3NpdGlvbj86IE5ndFZlY3RvcjM7XG5cdHJvdGF0aW9uPzogTmd0RXVsZXI7XG5cdHNjYWxlPzogTmd0VmVjdG9yMztcblx0cXVhdGVybmlvbj86IE5ndFF1YXRlcm5pb247XG5cdHVzZXJEYXRhPzogTmd0T2JqZWN0M0RbJ3VzZXJEYXRhJ107XG5cdG9wdGlvbnM/OiBOZ3RyUmlnaWRCb2R5T3B0aW9ucztcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHJSaWdpZEJvZHlPcHRpb25zID0gcmlnaWRCb2R5RGVmYXVsdE9wdGlvbnM7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndC1vYmplY3QzRFtuZ3RySW5zdGFuY2VkUmlnaWRCb2RpZXNdJyxcblx0ZXhwb3J0QXM6ICdpbnN0YW5jZWRSaWdpZEJvZGllcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1vYmplY3QzRCAjaW5zdGFuY2VXcmFwcGVyPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1vYmplY3QzRD5cblxuXHRcdEBmb3IgKGluc3RhbmNlIG9mIGluc3RhbmNlc09wdGlvbnMoKTsgdHJhY2sgaW5zdGFuY2Uua2V5KSB7XG5cdFx0XHQ8bmd0LW9iamVjdDNEXG5cdFx0XHRcdFtuZ3RyUmlnaWRCb2R5XT1cImluc3RhbmNlLnR5cGVcIlxuXHRcdFx0XHRbb3B0aW9uc109XCJpbnN0YW5jZS5vcHRpb25zXCJcblx0XHRcdFx0W3Bvc2l0aW9uXT1cImluc3RhbmNlLnBvc2l0aW9uXCJcblx0XHRcdFx0W3JvdGF0aW9uXT1cImluc3RhbmNlLnJvdGF0aW9uXCJcblx0XHRcdFx0W3NjYWxlXT1cImluc3RhbmNlLnNjYWxlXCJcblx0XHRcdFx0W3F1YXRlcm5pb25dPVwiaW5zdGFuY2UucXVhdGVybmlvblwiXG5cdFx0XHRcdFt1c2VyRGF0YV09XCJpbnN0YW5jZS51c2VyRGF0YVwiXG5cdFx0XHRcdFtuYW1lXT1cImluc3RhbmNlLmtleSArICctaW5zdGFuY2VkLXJpZ2lkLWJvZHktJyArICRpbmRleFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIltkYXRhLWNvbGxpZGVyc11cIiAvPlxuXG5cdFx0XHRcdEBmb3IgKGNoaWxkQ29sbGlkZXJPcHRpb24gb2YgY2hpbGRDb2xsaWRlck9wdGlvbnMoKTsgdHJhY2sgJGluZGV4KSB7XG5cdFx0XHRcdFx0PG5ndC1vYmplY3QzRFxuXHRcdFx0XHRcdFx0W25ndHJDb2xsaWRlcl09XCJjaGlsZENvbGxpZGVyT3B0aW9uLnNoYXBlXCJcblx0XHRcdFx0XHRcdFthcmdzXT1cImNoaWxkQ29sbGlkZXJPcHRpb24uYXJnc1wiXG5cdFx0XHRcdFx0XHRbcG9zaXRpb25dPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5wb3NpdGlvblwiXG5cdFx0XHRcdFx0XHRbcm90YXRpb25dPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5yb3RhdGlvblwiXG5cdFx0XHRcdFx0XHRbc2NhbGVdPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5zY2FsZVwiXG5cdFx0XHRcdFx0XHRbbmFtZV09XCJvYmplY3RSZWYubmF0aXZlRWxlbWVudC5uYW1lICsgJy1pbnN0YW5jZWQtY29sbGlkZXItJyArICRpbmRleFwiXG5cdFx0XHRcdFx0XHRbb3B0aW9uc109XCJjaGlsZENvbGxpZGVyT3B0aW9uLmNvbGxpZGVyT3B0aW9uc1wiXG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0fVxuXHRcdFx0PC9uZ3Qtb2JqZWN0M0Q+XG5cdFx0fVxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0clJpZ2lkQm9keSwgTmd0ckFueUNvbGxpZGVyXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0ckluc3RhbmNlZFJpZ2lkQm9kaWVzIHtcblx0cG9zaXRpb24gPSBpbnB1dDxOZ3RWZWN0b3IzIHwgdW5kZWZpbmVkPihbMCwgMCwgMF0pO1xuXHRyb3RhdGlvbiA9IGlucHV0PE5ndEV1bGVyIHwgdW5kZWZpbmVkPihbMCwgMCwgMF0pO1xuXHRzY2FsZSA9IGlucHV0PE5ndFZlY3RvcjMgfCB1bmRlZmluZWQ+KFsxLCAxLCAxXSk7XG5cdHF1YXRlcm5pb24gPSBpbnB1dDxOZ3RRdWF0ZXJuaW9uIHwgdW5kZWZpbmVkPihbMCwgMCwgMCwgMV0pO1xuXHR1c2VyRGF0YSA9IGlucHV0PE5ndE9iamVjdDNEWyd1c2VyRGF0YSddIHwgdW5kZWZpbmVkPih7fSk7XG5cdGluc3RhbmNlcyA9IGlucHV0KFtdLCB7XG5cdFx0YWxpYXM6ICduZ3RySW5zdGFuY2VkUmlnaWRCb2RpZXMnLFxuXHRcdHRyYW5zZm9ybTogKHZhbHVlOiBBcnJheTxOZ3RySW5zdGFuY2VkUmlnaWRCb2R5T3B0aW9ucz4gfCAnJykgPT4ge1xuXHRcdFx0aWYgKHZhbHVlID09PSAnJykgcmV0dXJuIFtdO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cdH0pO1xuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cblx0cHJpdmF0ZSBvYmplY3QzRFBhcmFtZXRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uKCksXG5cdFx0XHRyb3RhdGlvbjogdGhpcy5yb3RhdGlvbigpLFxuXHRcdFx0c2NhbGU6IHRoaXMuc2NhbGUoKSxcblx0XHRcdHF1YXRlcm5pb246IHRoaXMucXVhdGVybmlvbigpLFxuXHRcdFx0dXNlckRhdGE6IHRoaXMudXNlckRhdGEoKSxcblx0XHR9O1xuXHR9KTtcblxuXHRwcml2YXRlIGluc3RhbmNlV3JhcHBlclJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPE9iamVjdDNEPj4oJ2luc3RhbmNlV3JhcHBlcicpO1xuXHRyaWdpZEJvZHlSZWZzID0gdmlld0NoaWxkcmVuKE5ndHJSaWdpZEJvZHkpO1xuXG5cdHByaXZhdGUgcGh5c2ljcyA9IGluamVjdChOZ3RyUGh5c2ljcyk7XG5cdG9iamVjdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPE9iamVjdDNEPj4oRWxlbWVudFJlZik7XG5cblx0cHJpdmF0ZSBjb2xsaWRlcnMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbGxpZGVycycpO1xuXG5cdHByaXZhdGUgaW5zdGFuY2VkTWVzaCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBpbnN0YW5jZVdyYXBwZXIgPSB0aGlzLmluc3RhbmNlV3JhcHBlclJlZigpLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKCFpbnN0YW5jZVdyYXBwZXIpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2VXcmFwcGVyKTtcblx0XHRpZiAoIWxvY2FsU3RhdGUpIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gdHJhY2sgb2JqZWN0J3MgY2hpbGRyZW5cblx0XHRsb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRjb25zdCBmaXJzdENoaWxkID0gaW5zdGFuY2VXcmFwcGVyLmNoaWxkcmVuWzBdO1xuXHRcdGlmICghZmlyc3RDaGlsZCB8fCAhKGZpcnN0Q2hpbGQgYXMgSW5zdGFuY2VkTWVzaCkuaXNJbnN0YW5jZWRNZXNoKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBmaXJzdENoaWxkIGFzIEluc3RhbmNlZE1lc2g7XG5cdH0pO1xuXG5cdHByb3RlY3RlZCBpbnN0YW5jZXNPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IFtpbnN0YW5jZXMsIG9wdGlvbnMsIGluc3RhbmNlZE1lc2hdID0gW3RoaXMuaW5zdGFuY2VzKCksIHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLCB0aGlzLmluc3RhbmNlZE1lc2goKV07XG5cdFx0aWYgKCFpbnN0YW5jZWRNZXNoKSByZXR1cm4gW107XG5cdFx0cmV0dXJuIGluc3RhbmNlcy5tYXAoXG5cdFx0XHQoaW5zdGFuY2UsIGluZGV4KSA9PlxuXHRcdFx0XHQoe1xuXHRcdFx0XHRcdC4uLmluc3RhbmNlLFxuXHRcdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRcdFx0XHQuLi4oaW5zdGFuY2Uub3B0aW9ucyB8fCB7fSksXG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm1TdGF0ZTogKHN0YXRlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0Li4uc3RhdGUsXG5cdFx0XHRcdFx0XHRcdFx0Z2V0TWF0cml4OiAobWF0cml4KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpbnN0YW5jZWRNZXNoLmdldE1hdHJpeEF0KGluZGV4LCBtYXRyaXgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1hdHJpeDtcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHNldE1hdHJpeDogKG1hdHJpeCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0aW5zdGFuY2VkTWVzaC5zZXRNYXRyaXhBdChpbmRleCwgbWF0cml4KTtcblx0XHRcdFx0XHRcdFx0XHRcdGluc3RhbmNlZE1lc2guaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0bWVzaFR5cGU6ICdpbnN0YW5jZWRNZXNoJyxcblx0XHRcdFx0XHRcdFx0fSBhcyBOZ3RyUmlnaWRCb2R5U3RhdGU7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0a2V5OiBgJHtpbnN0YW5jZS5rZXl9LSR7aW5kZXh9YCArIGAke2luc3RhbmNlZE1lc2g/LnV1aWQgfHwgJyd9YCxcblx0XHRcdFx0fSkgYXMgT21pdDxOZ3RySW5zdGFuY2VkUmlnaWRCb2R5T3B0aW9ucywgJ29wdGlvbnMnPiAmIHsgb3B0aW9uczogUGFydGlhbDxOZ3RyUmlnaWRCb2R5T3B0aW9ucz4gfSxcblx0XHQpO1xuXHR9KTtcblxuXHRwcm90ZWN0ZWQgY2hpbGRDb2xsaWRlck9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgY29sbGlkZXJzID0gdGhpcy5jb2xsaWRlcnMoKTtcblx0XHQvLyBpZiBzZWxmIGNvbGxpZGVycyBpcyBmYWxzZSBleHBsaWNpdGx5LCBkaXNhYmxlIGF1dG8gY29sbGlkZXJzIGZvciB0aGlzIG9iamVjdCBlbnRpcmVseS5cblx0XHRpZiAoY29sbGlkZXJzID09PSBmYWxzZSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgcGh5c2ljc0NvbGxpZGVycyA9IHRoaXMucGh5c2ljcy5jb2xsaWRlcnMoKTtcblx0XHQvLyBpZiBwaHlzaWNzIGNvbGxpZGVycyBpcyBmYWxzZSBleHBsaWNpdGx5IEFORCBjb2xsaWRlcnMgaXMgbm90IHNldCwgZGlzYWJsZSBhdXRvIGNvbGxpZGVycyBmb3IgdGhpcyBvYmplY3QgZW50aXJlbHkuXG5cdFx0aWYgKHBoeXNpY3NDb2xsaWRlcnMgPT09IGZhbHNlICYmIGNvbGxpZGVycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0Ly8gaWYgY29sbGlkZXJzIG9uIG9iamVjdCBpcyBub3Qgc2V0LCB1c2UgcGh5c2ljcyBjb2xsaWRlcnNcblx0XHRpZiAoIW9wdGlvbnMuY29sbGlkZXJzKSBvcHRpb25zLmNvbGxpZGVycyA9IHBoeXNpY3NDb2xsaWRlcnM7XG5cblx0XHRjb25zdCBvYmplY3RMb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZSh0aGlzLm9iamVjdFJlZi5uYXRpdmVFbGVtZW50KTtcblx0XHRpZiAoIW9iamVjdExvY2FsU3RhdGUpIHJldHVybiBbXTtcblxuXHRcdC8vIHRyYWNrIG9iamVjdCdzIHBhcmVudCBhbmQgbm9uLW9iamVjdCBjaGlsZHJlblxuXHRcdGNvbnN0IFtwYXJlbnRdID0gW29iamVjdExvY2FsU3RhdGUucGFyZW50KCksIG9iamVjdExvY2FsU3RhdGUubm9uT2JqZWN0cygpXTtcblx0XHRpZiAoIXBhcmVudCB8fCAhKHBhcmVudCBhcyBPYmplY3QzRCkuaXNPYmplY3QzRCkgcmV0dXJuIFtdO1xuXG5cdFx0cmV0dXJuIGNyZWF0ZUNvbGxpZGVyT3B0aW9ucyh0aGlzLm9iamVjdFJlZi5uYXRpdmVFbGVtZW50LCBvcHRpb25zKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgT2JqZWN0M0QgfSk7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3Qgb2JqZWN0M0RQYXJhbWV0ZXJzID0gdGhpcy5vYmplY3QzRFBhcmFtZXRlcnMoKTtcblx0XHRcdGFwcGx5UHJvcHModGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCwgb2JqZWN0M0RQYXJhbWV0ZXJzKTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZWRNZXNoID0gdGhpcy5pbnN0YW5jZWRNZXNoKCk7XG5cdFx0XHRpZiAoIWluc3RhbmNlZE1lc2gpIHJldHVybjtcblx0XHRcdGluc3RhbmNlZE1lc2guaW5zdGFuY2VNYXRyaXguc2V0VXNhZ2UoRHluYW1pY0RyYXdVc2FnZSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
|
package/esm2022/lib/joints.mjs
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { computed, effect, inject } from '@angular/core';
|
|
2
|
-
import { resolveRef } from 'angular-three';
|
|
3
|
-
import { assertInjector } from 'ngxtension/assert-injector';
|
|
4
|
-
import { NgtrPhysics } from './physics';
|
|
5
|
-
import { quaternionToRapierQuaternion, vector3ToRapierVector } from './utils';
|
|
6
|
-
function injectImpulseJoint(bodyA, bodyB, { injector, data }) {
|
|
7
|
-
return assertInjector(injectImpulseJoint, injector, () => {
|
|
8
|
-
const physics = inject(NgtrPhysics);
|
|
9
|
-
const newJoint = computed(() => {
|
|
10
|
-
const worldSingleton = physics.worldSingleton();
|
|
11
|
-
if (!worldSingleton)
|
|
12
|
-
return null;
|
|
13
|
-
const a = typeof bodyA === 'function' ? resolveRef(bodyA()) : resolveRef(bodyA);
|
|
14
|
-
const b = typeof bodyB === 'function' ? resolveRef(bodyB()) : resolveRef(bodyB);
|
|
15
|
-
if (!a || !b)
|
|
16
|
-
return null;
|
|
17
|
-
const jointData = typeof data === 'function' ? data() : data;
|
|
18
|
-
if (!jointData)
|
|
19
|
-
return null;
|
|
20
|
-
return worldSingleton.proxy.createImpulseJoint(jointData, a, b, true);
|
|
21
|
-
});
|
|
22
|
-
effect((onCleanup) => {
|
|
23
|
-
const worldSingleton = physics.worldSingleton();
|
|
24
|
-
if (!worldSingleton)
|
|
25
|
-
return;
|
|
26
|
-
const joint = newJoint();
|
|
27
|
-
if (!joint)
|
|
28
|
-
return;
|
|
29
|
-
onCleanup(() => {
|
|
30
|
-
if (worldSingleton.proxy.getImpulseJoint(joint.handle)) {
|
|
31
|
-
worldSingleton.proxy.removeImpulseJoint(joint, true);
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
return newJoint;
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function createJoint(jointDataFn) {
|
|
39
|
-
return function _injectJoint(bodyA, bodyB, { injector, data }) {
|
|
40
|
-
return assertInjector(_injectJoint, injector, () => {
|
|
41
|
-
const physics = inject(NgtrPhysics);
|
|
42
|
-
const jointData = computed(() => {
|
|
43
|
-
const rapier = physics.rapier();
|
|
44
|
-
if (!rapier)
|
|
45
|
-
return null;
|
|
46
|
-
return jointDataFn(rapier, data);
|
|
47
|
-
});
|
|
48
|
-
return injectImpulseJoint(bodyA, bodyB, { injector, data: jointData });
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* A fixed joint ensures that two rigid-bodies don't move relative to each other.
|
|
54
|
-
* Fixed joints are characterized by one local frame (represented by an isometry) on each rigid-body.
|
|
55
|
-
* The fixed-joint makes these frames coincide in world-space.
|
|
56
|
-
*
|
|
57
|
-
* @category Hooks - Joints
|
|
58
|
-
*/
|
|
59
|
-
export const injectFixedJoint = createJoint((rapier, data) => rapier.JointData.fixed(vector3ToRapierVector(data.body1Anchor), quaternionToRapierQuaternion(data.body1LocalFrame), vector3ToRapierVector(data.body2Anchor), quaternionToRapierQuaternion(data.body2LocalFrame)));
|
|
60
|
-
/**
|
|
61
|
-
* The spherical joint ensures that two points on the local-spaces of two rigid-bodies always coincide (it prevents any relative
|
|
62
|
-
* translational motion at this points). This is typically used to simulate ragdolls arms, pendulums, etc.
|
|
63
|
-
* They are characterized by one local anchor on each rigid-body. Each anchor represents the location of the
|
|
64
|
-
* points that need to coincide on the local-space of each rigid-body.
|
|
65
|
-
*
|
|
66
|
-
* @category Hooks - Joints
|
|
67
|
-
*/
|
|
68
|
-
export const injectSphericalJoint = createJoint((rapier, data) => rapier.JointData.spherical(vector3ToRapierVector(data.body1Anchor), vector3ToRapierVector(data.body2Anchor)));
|
|
69
|
-
/**
|
|
70
|
-
* The revolute joint prevents any relative movement between two rigid-bodies, except for relative
|
|
71
|
-
* rotations along one axis. This is typically used to simulate wheels, fans, etc.
|
|
72
|
-
* They are characterized by one local anchor as well as one local axis on each rigid-body.
|
|
73
|
-
*
|
|
74
|
-
* @category Hooks - Joints
|
|
75
|
-
*/
|
|
76
|
-
export const injectRevoluteJoint = createJoint((rapier, data) => {
|
|
77
|
-
const jointData = rapier.JointData.revolute(vector3ToRapierVector(data.body1Anchor), vector3ToRapierVector(data.body2Anchor), vector3ToRapierVector(data.axis));
|
|
78
|
-
if (data.limits) {
|
|
79
|
-
jointData.limitsEnabled = true;
|
|
80
|
-
jointData.limits = data.limits;
|
|
81
|
-
}
|
|
82
|
-
return jointData;
|
|
83
|
-
});
|
|
84
|
-
/**
|
|
85
|
-
* The prismatic joint prevents any relative movement between two rigid-bodies, except for relative translations along one axis.
|
|
86
|
-
* It is characterized by one local anchor as well as one local axis on each rigid-body. In 3D, an optional
|
|
87
|
-
* local tangent axis can be specified for each rigid-body.
|
|
88
|
-
*
|
|
89
|
-
* @category Hooks - Joints
|
|
90
|
-
*/
|
|
91
|
-
export const injectPrismaticJoint = createJoint((rapier, data) => {
|
|
92
|
-
const jointData = rapier.JointData.prismatic(vector3ToRapierVector(data.body1Anchor), vector3ToRapierVector(data.body2Anchor), vector3ToRapierVector(data.axis));
|
|
93
|
-
if (data.limits) {
|
|
94
|
-
jointData.limitsEnabled = true;
|
|
95
|
-
jointData.limits = data.limits;
|
|
96
|
-
}
|
|
97
|
-
return jointData;
|
|
98
|
-
});
|
|
99
|
-
/**
|
|
100
|
-
* The rope joint limits the max distance between two bodies.
|
|
101
|
-
* @category Hooks - Joints
|
|
102
|
-
*/
|
|
103
|
-
export const injectRopeJoint = createJoint((rapier, data) => rapier.JointData.rope(data.length, vector3ToRapierVector(data.body1Anchor), vector3ToRapierVector(data.body2Anchor)));
|
|
104
|
-
/**
|
|
105
|
-
* The spring joint applies a force proportional to the distance between two objects.
|
|
106
|
-
* @category Hooks - Joints
|
|
107
|
-
*/
|
|
108
|
-
export const injectSpringJoint = createJoint((rapier, data) => {
|
|
109
|
-
return rapier.JointData.spring(data.restLength, data.stiffness, data.damping, vector3ToRapierVector(data.body1Anchor), vector3ToRapierVector(data.body2Anchor));
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvc3JjL2xpYi9qb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWMsTUFBTSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBWS9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFTeEMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRTlFLFNBQVMsa0JBQWtCLENBQzFCLEtBQXVHLEVBQ3ZHLEtBQXVHLEVBQ3ZHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBdUU7SUFFdkYsT0FBTyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFcEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFtQixHQUFHLEVBQUU7WUFDaEQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRWpDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRixNQUFNLENBQUMsR0FBRyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMs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QUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQ2xHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUNwSCxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUE0QyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtJQUN4RyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUM3QixJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLE9BQU8sRUFDWixxQkFBcUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQ3ZDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDdkMsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Rml4ZWRJbXB1bHNlSm9pbnQsXG5cdEltcHVsc2VKb2ludCxcblx0Sm9pbnREYXRhLFxuXHRQcmlzbWF0aWNJbXB1bHNlSm9pbnQsXG5cdFJldm9sdXRlSW1wdWxzZUpvaW50LFxuXHRSaWdpZEJvZHksXG5cdFJvcGVJbXB1bHNlSm9pbnQsXG5cdFNwaGVyaWNhbEltcHVsc2VKb2ludCxcblx0U3ByaW5nSW1wdWxzZUpvaW50LFxufSBmcm9tICdAZGltZm9yZ2UvcmFwaWVyM2QtY29tcGF0JztcbmltcG9ydCB7IHJlc29sdmVSZWYgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0IHsgTmd0clBoeXNpY3MgfSBmcm9tICcuL3BoeXNpY3MnO1xuaW1wb3J0IHtcblx0Tmd0ckZpeGVkSm9pbnRQYXJhbXMsXG5cdE5ndHJQcmlzbWF0aWNKb2ludFBhcmFtcyxcblx0Tmd0clJldm9sdXRlSm9pbnRQYXJhbXMsXG5cdE5ndHJSb3BlSm9pbnRQYXJhbXMsXG5cdE5ndHJTcGhlcmljYWxKb2ludFBhcmFtcyxcblx0Tmd0clNwcmluZ0pvaW50UGFyYW1zLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHF1YXRlcm5pb25Ub1JhcGllclF1YXRlcm5pb24sIHZlY3RvcjNUb1JhcGllclZlY3RvciB9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBpbmplY3RJbXB1bHNlSm9pbnQ8VEpvaW5UeXBlIGV4dGVuZHMgSW1wdWxzZUpvaW50Pihcblx0Ym9keUE6IEVsZW1lbnRSZWY8UmlnaWRCb2R5PiB8IFJpZ2lkQm9keSB8ICgoKSA9PiBFbGVtZW50UmVmPFJpZ2lkQm9keT4gfCBSaWdpZEJvZHkgfCB1bmRlZmluZWQgfCBudWxsKSxcblx0Ym9keUI6IEVsZW1lbnRSZWY8UmlnaWRCb2R5PiB8IFJpZ2lkQm9keSB8ICgoKSA9PiBFbGVtZW50UmVmPFJpZ2lkQm9keT4gfCBSaWdpZEJvZHkgfCB1bmRlZmluZWQgfCBudWxsKSxcblx0eyBpbmplY3RvciwgZGF0YSB9OiB7IGluamVjdG9yPzogSW5qZWN0b3I7IGRhdGE6IEpvaW50RGF0YSB8ICgoKSA9PiBKb2ludERhdGEgfCBudWxsKSB9LFxuKSB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3RJbXB1bHNlSm9pbnQsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGh5c2ljcyA9IGluamVjdChOZ3RyUGh5c2ljcyk7XG5cblx0XHRjb25zdCBuZXdKb2ludCA9IGNvbXB1dGVkPFRKb2luVHlwZSB8IG51bGw+KCgpID0+IHtcblx0XHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gcGh5c2ljcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuIG51bGw7XG5cblx0XHRcdGNvbnN0IGEgPSB0eXBlb2YgYm9keUEgPT09ICdmdW5jdGlvbicgPyByZXNvbHZlUmVmKGJvZHlBKCkpIDogcmVzb2x2ZVJlZihib2R5QSk7XG5cdFx0XHRjb25zdCBiID0gdHlwZW9mIGJvZHlCID09PSAnZnVuY3Rpb24nID8gcmVzb2x2ZVJlZihib2R5QigpKSA6IHJlc29sdmVSZWYoYm9keUIpO1xuXHRcdFx0aWYgKCFhIHx8ICFiKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0Y29uc3Qgam9pbnREYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyBkYXRhKCkgOiBkYXRhO1xuXHRcdFx0aWYgKCFqb2ludERhdGEpIHJldHVybiBudWxsO1xuXG5cdFx0XHRyZXR1cm4gd29ybGRTaW5nbGV0b24ucHJveHkuY3JlYXRlSW1wdWxzZUpvaW50KGpvaW50RGF0YSwgYSwgYiwgdHJ1ZSkgYXMgVEpvaW5UeXBlO1xuXHRcdH0pO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IHdvcmxkU2luZ2xldG9uID0gcGh5c2ljcy53b3JsZFNpbmdsZXRvbigpO1xuXHRcdFx0aWYgKCF3b3JsZFNpbmdsZXRvbikgcmV0dXJuO1xuXG5cdFx0XHRjb25zdCBqb2ludCA9IG5ld0pvaW50KCk7XG5cdFx0XHRpZiAoIWpvaW50KSByZXR1cm47XG5cblx0XHRcdG9uQ2xlYW51cCgoKSA9PiB7XG5cdFx0XHRcdGlmICh3b3JsZFNpbmdsZXRvbi5wcm94eS5nZXRJbXB1bHNlSm9pbnQoam9pbnQuaGFuZGxlKSkge1xuXHRcdFx0XHRcdHdvcmxkU2luZ2xldG9uLnByb3h5LnJlbW92ZUltcHVsc2VKb2ludChqb2ludCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG5ld0pvaW50O1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSm9pbnQ8VEpvaW50UGFyYW1zLCBUSm9pblR5cGUgZXh0ZW5kcyBJbXB1bHNlSm9pbnQ+KFxuXHRqb2ludERhdGFGbjogKHJhcGllcjogTm9uTnVsbGFibGU8UmV0dXJuVHlwZTxOZ3RyUGh5c2ljc1sncmFwaWVyJ10+PiwgZGF0YTogVEpvaW50UGFyYW1zKSA9PiBKb2ludERhdGEsXG4pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIF9pbmplY3RKb2ludChcblx0XHRib2R5QTogRWxlbWVudFJlZjxSaWdpZEJvZHk+IHwgUmlnaWRCb2R5IHwgKCgpID0+IEVsZW1lbnRSZWY8UmlnaWRCb2R5PiB8IFJpZ2lkQm9keSB8IHVuZGVmaW5lZCB8IG51bGwpLFxuXHRcdGJvZHlCOiBFbGVtZW50UmVmPFJpZ2lkQm9keT4gfCBSaWdpZEJvZHkgfCAoKCkgPT4gRWxlbWVudFJlZjxSaWdpZEJvZHk+IHwgUmlnaWRCb2R5IHwgdW5kZWZpbmVkIHwgbnVsbCksXG5cdFx0eyBpbmplY3RvciwgZGF0YSB9OiB7IGluamVjdG9yPzogSW5qZWN0b3I7IGRhdGE6IFRKb2ludFBhcmFtcyB9LFxuXHQpIHtcblx0XHRyZXR1cm4gYXNzZXJ0SW5qZWN0b3IoX2luamVjdEpvaW50LCBpbmplY3RvciwgKCkgPT4ge1xuXHRcdFx0Y29uc3QgcGh5c2ljcyA9IGluamVjdChOZ3RyUGh5c2ljcyk7XG5cblx0XHRcdGNvbnN0IGpvaW50RGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRcdFx0Y29uc3QgcmFwaWVyID0gcGh5c2ljcy5yYXBpZXIoKTtcblx0XHRcdFx0aWYgKCFyYXBpZXIpIHJldHVybiBudWxsO1xuXHRcdFx0XHRyZXR1cm4gam9pbnREYXRhRm4ocmFwaWVyLCBkYXRhKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gaW5qZWN0SW1wdWxzZUpvaW50PFRKb2luVHlwZT4oYm9keUEsIGJvZHlCLCB7IGluamVjdG9yLCBkYXRhOiBqb2ludERhdGEgfSk7XG5cdFx0fSk7XG5cdH07XG59XG5cbi8qKlxuICogQSBmaXhlZCBqb2ludCBlbnN1cmVzIHRoYXQgdHdvIHJpZ2lkLWJvZGllcyBkb24ndCBtb3ZlIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuXG4gKiBGaXhlZCBqb2ludHMgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgb25lIGxvY2FsIGZyYW1lIChyZXByZXNlbnRlZCBieSBhbiBpc29tZXRyeSkgb24gZWFjaCByaWdpZC1ib2R5LlxuICogVGhlIGZpeGVkLWpvaW50IG1ha2VzIHRoZXNlIGZyYW1lcyBjb2luY2lkZSBpbiB3b3JsZC1zcGFjZS5cbiAqXG4gKiBAY2F0ZWdvcnkgSG9va3MgLSBKb2ludHNcbiAqL1xuZXhwb3J0IGNvbnN0IGluamVjdEZpeGVkSm9pbnQgPSBjcmVhdGVKb2ludDxOZ3RyRml4ZWRKb2ludFBhcmFtcywgRml4ZWRJbXB1bHNlSm9pbnQ+KChyYXBpZXIsIGRhdGEpID0+XG5cdHJhcGllci5Kb2ludERhdGEuZml4ZWQoXG5cdFx0dmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYm9keTFBbmNob3IpLFxuXHRcdHF1YXRlcm5pb25Ub1JhcGllclF1YXRlcm5pb24oZGF0YS5ib2R5MUxvY2FsRnJhbWUpLFxuXHRcdHZlY3RvcjNUb1JhcGllclZlY3RvcihkYXRhLmJvZHkyQW5jaG9yKSxcblx0XHRxdWF0ZXJuaW9uVG9SYXBpZXJRdWF0ZXJuaW9uKGRhdGEuYm9keTJMb2NhbEZyYW1lKSxcblx0KSxcbik7XG5cbi8qKlxuICogVGhlIHNwaGVyaWNhbCBqb2ludCBlbnN1cmVzIHRoYXQgdHdvIHBvaW50cyBvbiB0aGUgbG9jYWwtc3BhY2VzIG9mIHR3byByaWdpZC1ib2RpZXMgYWx3YXlzIGNvaW5jaWRlIChpdCBwcmV2ZW50cyBhbnkgcmVsYXRpdmVcbiAqIHRyYW5zbGF0aW9uYWwgbW90aW9uIGF0IHRoaXMgcG9pbnRzKS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byBzaW11bGF0ZSByYWdkb2xscyBhcm1zLCBwZW5kdWx1bXMsIGV0Yy5cbiAqIFRoZXkgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgb25lIGxvY2FsIGFuY2hvciBvbiBlYWNoIHJpZ2lkLWJvZHkuIEVhY2ggYW5jaG9yIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZVxuICogcG9pbnRzIHRoYXQgbmVlZCB0byBjb2luY2lkZSBvbiB0aGUgbG9jYWwtc3BhY2Ugb2YgZWFjaCByaWdpZC1ib2R5LlxuICpcbiAqIEBjYXRlZ29yeSBIb29rcyAtIEpvaW50c1xuICovXG5leHBvcnQgY29uc3QgaW5qZWN0U3BoZXJpY2FsSm9pbnQgPSBjcmVhdGVKb2ludDxOZ3RyU3BoZXJpY2FsSm9pbnRQYXJhbXMsIFNwaGVyaWNhbEltcHVsc2VKb2ludD4oKHJhcGllciwgZGF0YSkgPT5cblx0cmFwaWVyLkpvaW50RGF0YS5zcGhlcmljYWwodmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYm9keTFBbmNob3IpLCB2ZWN0b3IzVG9SYXBpZXJWZWN0b3IoZGF0YS5ib2R5MkFuY2hvcikpLFxuKTtcblxuLyoqXG4gKiBUaGUgcmV2b2x1dGUgam9pbnQgcHJldmVudHMgYW55IHJlbGF0aXZlIG1vdmVtZW50IGJldHdlZW4gdHdvIHJpZ2lkLWJvZGllcywgZXhjZXB0IGZvciByZWxhdGl2ZVxuICogcm90YXRpb25zIGFsb25nIG9uZSBheGlzLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIHNpbXVsYXRlIHdoZWVscywgZmFucywgZXRjLlxuICogVGhleSBhcmUgY2hhcmFjdGVyaXplZCBieSBvbmUgbG9jYWwgYW5jaG9yIGFzIHdlbGwgYXMgb25lIGxvY2FsIGF4aXMgb24gZWFjaCByaWdpZC1ib2R5LlxuICpcbiAqIEBjYXRlZ29yeSBIb29rcyAtIEpvaW50c1xuICovXG5leHBvcnQgY29uc3QgaW5qZWN0UmV2b2x1dGVKb2ludCA9IGNyZWF0ZUpvaW50PE5ndHJSZXZvbHV0ZUpvaW50UGFyYW1zLCBSZXZvbHV0ZUltcHVsc2VKb2ludD4oKHJhcGllciwgZGF0YSkgPT4ge1xuXHRjb25zdCBqb2ludERhdGEgPSByYXBpZXIuSm9pbnREYXRhLnJldm9sdXRlKFxuXHRcdHZlY3RvcjNUb1JhcGllclZlY3RvcihkYXRhLmJvZHkxQW5jaG9yKSxcblx0XHR2ZWN0b3IzVG9SYXBpZXJWZWN0b3IoZGF0YS5ib2R5MkFuY2hvciksXG5cdFx0dmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYXhpcyksXG5cdCk7XG5cblx0aWYgKGRhdGEubGltaXRzKSB7XG5cdFx0am9pbnREYXRhLmxpbWl0c0VuYWJsZWQgPSB0cnVlO1xuXHRcdGpvaW50RGF0YS5saW1pdHMgPSBkYXRhLmxpbWl0cztcblx0fVxuXG5cdHJldHVybiBqb2ludERhdGE7XG59KTtcblxuLyoqXG4gKiBUaGUgcHJpc21hdGljIGpvaW50IHByZXZlbnRzIGFueSByZWxhdGl2ZSBtb3ZlbWVudCBiZXR3ZWVuIHR3byByaWdpZC1ib2RpZXMsIGV4Y2VwdCBmb3IgcmVsYXRpdmUgdHJhbnNsYXRpb25zIGFsb25nIG9uZSBheGlzLlxuICogSXQgaXMgY2hhcmFjdGVyaXplZCBieSBvbmUgbG9jYWwgYW5jaG9yIGFzIHdlbGwgYXMgb25lIGxvY2FsIGF4aXMgb24gZWFjaCByaWdpZC1ib2R5LiBJbiAzRCwgYW4gb3B0aW9uYWxcbiAqIGxvY2FsIHRhbmdlbnQgYXhpcyBjYW4gYmUgc3BlY2lmaWVkIGZvciBlYWNoIHJpZ2lkLWJvZHkuXG4gKlxuICogQGNhdGVnb3J5IEhvb2tzIC0gSm9pbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RQcmlzbWF0aWNKb2ludCA9IGNyZWF0ZUpvaW50PE5ndHJQcmlzbWF0aWNKb2ludFBhcmFtcywgUHJpc21hdGljSW1wdWxzZUpvaW50PigocmFwaWVyLCBkYXRhKSA9PiB7XG5cdGNvbnN0IGpvaW50RGF0YSA9IHJhcGllci5Kb2ludERhdGEucHJpc21hdGljKFxuXHRcdHZlY3RvcjNUb1JhcGllclZlY3RvcihkYXRhLmJvZHkxQW5jaG9yKSxcblx0XHR2ZWN0b3IzVG9SYXBpZXJWZWN0b3IoZGF0YS5ib2R5MkFuY2hvciksXG5cdFx0dmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYXhpcyksXG5cdCk7XG5cblx0aWYgKGRhdGEubGltaXRzKSB7XG5cdFx0am9pbnREYXRhLmxpbWl0c0VuYWJsZWQgPSB0cnVlO1xuXHRcdGpvaW50RGF0YS5saW1pdHMgPSBkYXRhLmxpbWl0cztcblx0fVxuXG5cdHJldHVybiBqb2ludERhdGE7XG59KTtcblxuLyoqXG4gKiBUaGUgcm9wZSBqb2ludCBsaW1pdHMgdGhlIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBib2RpZXMuXG4gKiBAY2F0ZWdvcnkgSG9va3MgLSBKb2ludHNcbiAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFJvcGVKb2ludCA9IGNyZWF0ZUpvaW50PE5ndHJSb3BlSm9pbnRQYXJhbXMsIFJvcGVJbXB1bHNlSm9pbnQ+KChyYXBpZXIsIGRhdGEpID0+XG5cdHJhcGllci5Kb2ludERhdGEucm9wZShkYXRhLmxlbmd0aCwgdmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYm9keTFBbmNob3IpLCB2ZWN0b3IzVG9SYXBpZXJWZWN0b3IoZGF0YS5ib2R5MkFuY2hvcikpLFxuKTtcblxuLyoqXG4gKiBUaGUgc3ByaW5nIGpvaW50IGFwcGxpZXMgYSBmb3JjZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIG9iamVjdHMuXG4gKiBAY2F0ZWdvcnkgSG9va3MgLSBKb2ludHNcbiAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFNwcmluZ0pvaW50ID0gY3JlYXRlSm9pbnQ8Tmd0clNwcmluZ0pvaW50UGFyYW1zLCBTcHJpbmdJbXB1bHNlSm9pbnQ+KChyYXBpZXIsIGRhdGEpID0+IHtcblx0cmV0dXJuIHJhcGllci5Kb2ludERhdGEuc3ByaW5nKFxuXHRcdGRhdGEucmVzdExlbmd0aCxcblx0XHRkYXRhLnN0aWZmbmVzcyxcblx0XHRkYXRhLmRhbXBpbmcsXG5cdFx0dmVjdG9yM1RvUmFwaWVyVmVjdG9yKGRhdGEuYm9keTFBbmNob3IpLFxuXHRcdHZlY3RvcjNUb1JhcGllclZlY3RvcihkYXRhLmJvZHkyQW5jaG9yKSxcblx0KTtcbn0pO1xuIl19
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, input, } from '@angular/core';
|
|
2
|
-
import { extend, getLocalState } from 'angular-three';
|
|
3
|
-
import { Object3D } from 'three';
|
|
4
|
-
import { NgtrAnyCollider, NgtrRigidBody } from './rigid-body';
|
|
5
|
-
import { createColliderOptions } from './utils';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class NgtrMeshCollider {
|
|
8
|
-
colliders = input.required({ alias: 'ngtrMeshCollider' });
|
|
9
|
-
objectRef = inject(ElementRef);
|
|
10
|
-
rigidBody = inject(NgtrRigidBody);
|
|
11
|
-
childColliderOptions = computed(() => {
|
|
12
|
-
const rigidBodyOptions = this.rigidBody.options();
|
|
13
|
-
rigidBodyOptions.colliders = this.colliders();
|
|
14
|
-
const objectLocalState = getLocalState(this.objectRef.nativeElement);
|
|
15
|
-
if (!objectLocalState)
|
|
16
|
-
return [];
|
|
17
|
-
// track object's children
|
|
18
|
-
objectLocalState.nonObjects();
|
|
19
|
-
objectLocalState.objects();
|
|
20
|
-
return createColliderOptions(this.objectRef.nativeElement, rigidBodyOptions, false);
|
|
21
|
-
});
|
|
22
|
-
constructor() {
|
|
23
|
-
extend({ Object3D });
|
|
24
|
-
this.objectRef.nativeElement.userData ??= {};
|
|
25
|
-
this.objectRef.nativeElement.userData['ngtrRapierType'] = 'MeshCollider';
|
|
26
|
-
}
|
|
27
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrMeshCollider, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
28
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtrMeshCollider, isStandalone: true, selector: "ngt-object3D[ngtrMeshCollider]", inputs: { colliders: { classPropertyName: "colliders", publicName: "ngtrMeshCollider", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
29
|
-
<ng-content />
|
|
30
|
-
@for (childColliderOption of childColliderOptions(); track $index) {
|
|
31
|
-
<ngt-object3D
|
|
32
|
-
[ngtrCollider]="childColliderOption.shape"
|
|
33
|
-
[args]="childColliderOption.args"
|
|
34
|
-
[position]="childColliderOption.position"
|
|
35
|
-
[rotation]="childColliderOption.rotation"
|
|
36
|
-
[scale]="childColliderOption.scale"
|
|
37
|
-
[name]="objectRef.nativeElement.name + '-mesh-collider-' + $index"
|
|
38
|
-
[options]="childColliderOption.colliderOptions"
|
|
39
|
-
/>
|
|
40
|
-
}
|
|
41
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtrAnyCollider, selector: "ngt-object3D[ngtrCollider]", inputs: ["position", "rotation", "scale", "quaternion", "userData", "name", "options", "ngtrCollider", "args"], outputs: ["ngtrColliderChange", "argsChange", "collisionEnter", "collisionExit", "intersectionEnter", "intersectionExit", "contactForce"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
42
|
-
}
|
|
43
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtrMeshCollider, decorators: [{
|
|
44
|
-
type: Component,
|
|
45
|
-
args: [{
|
|
46
|
-
selector: 'ngt-object3D[ngtrMeshCollider]',
|
|
47
|
-
standalone: true,
|
|
48
|
-
template: `
|
|
49
|
-
<ng-content />
|
|
50
|
-
@for (childColliderOption of childColliderOptions(); track $index) {
|
|
51
|
-
<ngt-object3D
|
|
52
|
-
[ngtrCollider]="childColliderOption.shape"
|
|
53
|
-
[args]="childColliderOption.args"
|
|
54
|
-
[position]="childColliderOption.position"
|
|
55
|
-
[rotation]="childColliderOption.rotation"
|
|
56
|
-
[scale]="childColliderOption.scale"
|
|
57
|
-
[name]="objectRef.nativeElement.name + '-mesh-collider-' + $index"
|
|
58
|
-
[options]="childColliderOption.colliderOptions"
|
|
59
|
-
/>
|
|
60
|
-
}
|
|
61
|
-
`,
|
|
62
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
63
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
64
|
-
imports: [NgtrAnyCollider],
|
|
65
|
-
}]
|
|
66
|
-
}], ctorParameters: () => [] });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1jb2xsaWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmFwaWVyL3NyYy9saWIvbWVzaC1jb2xsaWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sU0FBUyxDQUFDOztBQXVCaEQsTUFBTSxPQUFPLGdCQUFnQjtJQUM1QixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBNEIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRXJGLFNBQVMsR0FBRyxNQUFNLENBQXVCLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFaEMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM5QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU5QyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVqQywwQkFBMEI7UUFDMUIsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFM0IsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUVIO1FBQ0MsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUMxRSxDQUFDO3dHQXhCVyxnQkFBZ0I7NEZBQWhCLGdCQUFnQixnUEFsQmxCOzs7Ozs7Ozs7Ozs7O0VBYVQsNERBR1MsZUFBZTs7NEZBRWIsZ0JBQWdCO2tCQXJCNUIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsZ0NBQWdDO29CQUMxQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7O0VBYVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRMb2NhbFN0YXRlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE5ndHJBbnlDb2xsaWRlciwgTmd0clJpZ2lkQm9keSB9IGZyb20gJy4vcmlnaWQtYm9keSc7XG5pbXBvcnQgeyBOZ3RyUmlnaWRCb2R5QXV0b0NvbGxpZGVyIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVDb2xsaWRlck9wdGlvbnMgfSBmcm9tICcuL3V0aWxzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0LW9iamVjdDNEW25ndHJNZXNoQ29sbGlkZXJdJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGVudCAvPlxuXHRcdEBmb3IgKGNoaWxkQ29sbGlkZXJPcHRpb24gb2YgY2hpbGRDb2xsaWRlck9wdGlvbnMoKTsgdHJhY2sgJGluZGV4KSB7XG5cdFx0XHQ8bmd0LW9iamVjdDNEXG5cdFx0XHRcdFtuZ3RyQ29sbGlkZXJdPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5zaGFwZVwiXG5cdFx0XHRcdFthcmdzXT1cImNoaWxkQ29sbGlkZXJPcHRpb24uYXJnc1wiXG5cdFx0XHRcdFtwb3NpdGlvbl09XCJjaGlsZENvbGxpZGVyT3B0aW9uLnBvc2l0aW9uXCJcblx0XHRcdFx0W3JvdGF0aW9uXT1cImNoaWxkQ29sbGlkZXJPcHRpb24ucm90YXRpb25cIlxuXHRcdFx0XHRbc2NhbGVdPVwiY2hpbGRDb2xsaWRlck9wdGlvbi5zY2FsZVwiXG5cdFx0XHRcdFtuYW1lXT1cIm9iamVjdFJlZi5uYXRpdmVFbGVtZW50Lm5hbWUgKyAnLW1lc2gtY29sbGlkZXItJyArICRpbmRleFwiXG5cdFx0XHRcdFtvcHRpb25zXT1cImNoaWxkQ29sbGlkZXJPcHRpb24uY29sbGlkZXJPcHRpb25zXCJcblx0XHRcdC8+XG5cdFx0fVxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuXHRpbXBvcnRzOiBbTmd0ckFueUNvbGxpZGVyXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0ck1lc2hDb2xsaWRlciB7XG5cdGNvbGxpZGVycyA9IGlucHV0LnJlcXVpcmVkPE5ndHJSaWdpZEJvZHlBdXRvQ29sbGlkZXI+KHsgYWxpYXM6ICduZ3RyTWVzaENvbGxpZGVyJyB9KTtcblxuXHRvYmplY3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxPYmplY3QzRD4+KEVsZW1lbnRSZWYpO1xuXHRwcml2YXRlIHJpZ2lkQm9keSA9IGluamVjdChOZ3RyUmlnaWRCb2R5KTtcblxuXHRwcm90ZWN0ZWQgY2hpbGRDb2xsaWRlck9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgcmlnaWRCb2R5T3B0aW9ucyA9IHRoaXMucmlnaWRCb2R5Lm9wdGlvbnMoKTtcblx0XHRyaWdpZEJvZHlPcHRpb25zLmNvbGxpZGVycyA9IHRoaXMuY29sbGlkZXJzKCk7XG5cblx0XHRjb25zdCBvYmplY3RMb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZSh0aGlzLm9iamVjdFJlZi5uYXRpdmVFbGVtZW50KTtcblx0XHRpZiAoIW9iamVjdExvY2FsU3RhdGUpIHJldHVybiBbXTtcblxuXHRcdC8vIHRyYWNrIG9iamVjdCdzIGNoaWxkcmVuXG5cdFx0b2JqZWN0TG9jYWxTdGF0ZS5ub25PYmplY3RzKCk7XG5cdFx0b2JqZWN0TG9jYWxTdGF0ZS5vYmplY3RzKCk7XG5cblx0XHRyZXR1cm4gY3JlYXRlQ29sbGlkZXJPcHRpb25zKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQsIHJpZ2lkQm9keU9wdGlvbnMsIGZhbHNlKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgT2JqZWN0M0QgfSk7XG5cdFx0dGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudC51c2VyRGF0YSA/Pz0ge307XG5cdFx0dGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudC51c2VyRGF0YVsnbmd0clJhcGllclR5cGUnXSA9ICdNZXNoQ29sbGlkZXInO1xuXHR9XG59XG4iXX0=
|