angular-three-rapier 4.0.0-next.115 → 4.0.0-next.118
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 +130 -4
- package/fesm2022/angular-three-rapier-addons.mjs +75 -6
- package/fesm2022/angular-three-rapier-addons.mjs.map +1 -1
- package/fesm2022/angular-three-rapier.mjs +884 -224
- package/fesm2022/angular-three-rapier.mjs.map +1 -1
- package/package.json +6 -6
- package/{addons/index.d.ts → types/angular-three-rapier-addons.d.ts} +59 -0
- package/{index.d.ts → types/angular-three-rapier.d.ts} +920 -50
package/README.md
CHANGED
|
@@ -1,7 +1,133 @@
|
|
|
1
|
-
# rapier
|
|
1
|
+
# `angular-three-rapier`
|
|
2
2
|
|
|
3
|
-
This library
|
|
3
|
+
This library provides Rapier physics integration for Angular Three. [Rapier](https://rapier.rs/) is a fast, cross-platform physics engine written in Rust with JavaScript bindings.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Documentation
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
All public APIs are documented with JSDoc comments. Your IDE will provide inline documentation, parameter hints, and examples as you code.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install angular-three-rapier @dimforge/rapier3d-compat
|
|
13
|
+
# yarn add angular-three-rapier @dimforge/rapier3d-compat
|
|
14
|
+
# pnpm add angular-three-rapier @dimforge/rapier3d-compat
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
> Make sure to already have `angular-three` installed
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { Component, CUSTOM_ELEMENTS_SCHEMA, viewChild, ElementRef } from '@angular/core';
|
|
23
|
+
import { NgtrPhysics, NgtrRigidBody, NgtrCuboidCollider } from 'angular-three-rapier';
|
|
24
|
+
import { Mesh } from 'three';
|
|
25
|
+
|
|
26
|
+
@Component({
|
|
27
|
+
selector: 'app-box',
|
|
28
|
+
template: `
|
|
29
|
+
<ngt-mesh ngtrRigidBody="dynamic" [position]="[0, 5, 0]">
|
|
30
|
+
<ngt-box-geometry />
|
|
31
|
+
<ngt-mesh-standard-material color="hotpink" />
|
|
32
|
+
</ngt-mesh>
|
|
33
|
+
`,
|
|
34
|
+
imports: [NgtrRigidBody],
|
|
35
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
36
|
+
})
|
|
37
|
+
export class Box {}
|
|
38
|
+
|
|
39
|
+
@Component({
|
|
40
|
+
selector: 'app-ground',
|
|
41
|
+
template: `
|
|
42
|
+
<ngt-mesh ngtrRigidBody="fixed" [position]="[0, -1, 0]">
|
|
43
|
+
<ngt-box-geometry [args]="[20, 1, 20]" />
|
|
44
|
+
<ngt-mesh-standard-material color="gray" />
|
|
45
|
+
</ngt-mesh>
|
|
46
|
+
`,
|
|
47
|
+
imports: [NgtrRigidBody],
|
|
48
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
49
|
+
})
|
|
50
|
+
export class Ground {}
|
|
51
|
+
|
|
52
|
+
@Component({
|
|
53
|
+
template: `
|
|
54
|
+
<ngtr-physics [options]="{ gravity: [0, -9.81, 0] }">
|
|
55
|
+
<app-box />
|
|
56
|
+
<app-ground />
|
|
57
|
+
</ngtr-physics>
|
|
58
|
+
`,
|
|
59
|
+
imports: [NgtrPhysics, Box, Ground],
|
|
60
|
+
})
|
|
61
|
+
export class SceneGraph {}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Physics Options
|
|
65
|
+
|
|
66
|
+
| Property | Description | Default |
|
|
67
|
+
| ------------- | ----------------------------------------------- | --------------- |
|
|
68
|
+
| `gravity` | Gravity vector `[x, y, z]` | `[0, -9.81, 0]` |
|
|
69
|
+
| `colliders` | Default collider type for rigid bodies | `'cuboid'` |
|
|
70
|
+
| `paused` | Whether physics simulation is paused | `false` |
|
|
71
|
+
| `timeStep` | Fixed timestep for physics simulation | `1/60` |
|
|
72
|
+
| `debug` | Enable debug visualization | `false` |
|
|
73
|
+
| `interpolate` | Enable transform interpolation | `true` |
|
|
74
|
+
| `updateLoop` | Update loop type: `'follow'` or `'independent'` | `'follow'` |
|
|
75
|
+
|
|
76
|
+
## Rigid Body Types
|
|
77
|
+
|
|
78
|
+
- `'dynamic'` - Affected by forces and collisions
|
|
79
|
+
- `'fixed'` - Static, immovable body
|
|
80
|
+
- `'kinematicPosition'` - Controlled by position, affects dynamic bodies
|
|
81
|
+
- `'kinematicVelocity'` - Controlled by velocity, affects dynamic bodies
|
|
82
|
+
|
|
83
|
+
## Collider Types
|
|
84
|
+
|
|
85
|
+
Built-in collider directives:
|
|
86
|
+
|
|
87
|
+
- `NgtrCuboidCollider` - Box shape
|
|
88
|
+
- `NgtrBallCollider` - Sphere shape
|
|
89
|
+
- `NgtrCapsuleCollider` - Capsule shape
|
|
90
|
+
- `NgtrCylinderCollider` - Cylinder shape
|
|
91
|
+
- `NgtrConeCollider` - Cone shape
|
|
92
|
+
- `NgtrTrimeshCollider` - Triangle mesh (static only)
|
|
93
|
+
- `NgtrConvexHullCollider` - Convex hull
|
|
94
|
+
- `NgtrHeightfieldCollider` - Terrain heightfield
|
|
95
|
+
|
|
96
|
+
## Joints
|
|
97
|
+
|
|
98
|
+
Create joints between rigid bodies:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { fixedJoint, sphericalJoint, revoluteJoint, prismaticJoint } from 'angular-three-rapier';
|
|
102
|
+
|
|
103
|
+
// In your component
|
|
104
|
+
fixedJoint(bodyA, bodyB, {
|
|
105
|
+
body1Anchor: [0, 0, 0],
|
|
106
|
+
body2Anchor: [0, 1, 0],
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Debug Visualization
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<ngtr-physics>
|
|
114
|
+
<ngtr-debug />
|
|
115
|
+
<!-- your physics objects -->
|
|
116
|
+
</ngtr-physics>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Addons
|
|
120
|
+
|
|
121
|
+
### Attractor
|
|
122
|
+
|
|
123
|
+
Apply gravitational or magnetic forces:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { NgtrAttractor } from 'angular-three-rapier/addons';
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<ngt-mesh ngtrAttractor [options]="{ strength: 10, range: 20, type: 'linear' }">
|
|
131
|
+
<!-- attractor geometry -->
|
|
132
|
+
</ngt-mesh>
|
|
133
|
+
```
|
|
@@ -8,6 +8,19 @@ import { assertInjector } from 'ngxtension/assert-injector';
|
|
|
8
8
|
import { VertexNormalsHelper } from 'three-stdlib';
|
|
9
9
|
|
|
10
10
|
const _v3 = new THREE.Vector3();
|
|
11
|
+
/**
|
|
12
|
+
* Creates debug visualization for an attractor.
|
|
13
|
+
* Shows a sphere at the attractor position with normals indicating the range.
|
|
14
|
+
* Blue indicates attraction, red indicates repulsion.
|
|
15
|
+
*
|
|
16
|
+
* This is automatically called by NgtrAttractor when physics debug mode is enabled.
|
|
17
|
+
*
|
|
18
|
+
* @param object - The Object3D representing the attractor position
|
|
19
|
+
* @param options - Getter function for attractor options
|
|
20
|
+
* @param injector - Optional injector for dependency injection context
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
11
24
|
function attractorDebug(object, options, injector) {
|
|
12
25
|
return assertInjector(attractorDebug, injector, () => {
|
|
13
26
|
const physics = inject(NgtrPhysics);
|
|
@@ -46,6 +59,12 @@ function attractorDebug(object, options, injector) {
|
|
|
46
59
|
});
|
|
47
60
|
}
|
|
48
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Force calculation functions for different gravity types.
|
|
64
|
+
* - static: Constant force regardless of distance
|
|
65
|
+
* - linear: Force increases linearly as distance decreases
|
|
66
|
+
* - newtonian: Force follows Newton's law of universal gravitation
|
|
67
|
+
*/
|
|
49
68
|
const calcForceByType = {
|
|
50
69
|
static: (s, m2, r, d, G) => s,
|
|
51
70
|
linear: (s, m2, r, d, G) => s * (d / r),
|
|
@@ -53,6 +72,30 @@ const calcForceByType = {
|
|
|
53
72
|
};
|
|
54
73
|
const _position = new THREE.Vector3();
|
|
55
74
|
const _vector3 = new THREE.Vector3();
|
|
75
|
+
/**
|
|
76
|
+
* Applies attractor force to a rigid body based on its distance from the attractor.
|
|
77
|
+
* Used internally by NgtrAttractor but can be called manually for custom behavior.
|
|
78
|
+
*
|
|
79
|
+
* @param rigidBody - The rigid body to apply the force to
|
|
80
|
+
* @param options - The attractor configuration including position, strength, and type
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* beforePhysicsStep((world) => {
|
|
85
|
+
* world.bodies.forEach((body) => {
|
|
86
|
+
* if (body.isDynamic()) {
|
|
87
|
+
* applyAttractorForceOnRigidBody(body, {
|
|
88
|
+
* object: attractorMesh,
|
|
89
|
+
* strength: 10,
|
|
90
|
+
* range: 20,
|
|
91
|
+
* type: 'newtonian',
|
|
92
|
+
* gravitationalConstant: 6.673e-11
|
|
93
|
+
* });
|
|
94
|
+
* }
|
|
95
|
+
* });
|
|
96
|
+
* });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
56
99
|
function applyAttractorForceOnRigidBody(rigidBody, { object, strength, range, gravitationalConstant, collisionGroups, type, }) {
|
|
57
100
|
const rbPosition = rigidBody.translation();
|
|
58
101
|
_position.set(rbPosition.x, rbPosition.y, rbPosition.z);
|
|
@@ -87,12 +130,38 @@ const defaultOptions = {
|
|
|
87
130
|
type: 'static',
|
|
88
131
|
gravitationalConstant: 6.673e-11,
|
|
89
132
|
};
|
|
133
|
+
/**
|
|
134
|
+
* Directive that creates a gravitational attractor point in the physics world.
|
|
135
|
+
* All dynamic rigid bodies within range will be attracted (or repelled) towards this point.
|
|
136
|
+
*
|
|
137
|
+
* The attractor can use different gravity models:
|
|
138
|
+
* - Static: constant force
|
|
139
|
+
* - Linear: force increases as objects get closer
|
|
140
|
+
* - Newtonian: realistic inverse-square law
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```html
|
|
144
|
+
* <!-- Simple attractor at origin -->
|
|
145
|
+
* <ngt-object3D attractor [options]="{ strength: 5, range: 20 }" />
|
|
146
|
+
*
|
|
147
|
+
* <!-- Repeller (negative strength) -->
|
|
148
|
+
* <ngt-object3D attractor [options]="{ strength: -10, range: 15 }" [position]="[5, 0, 0]" />
|
|
149
|
+
*
|
|
150
|
+
* <!-- Newtonian gravity -->
|
|
151
|
+
* <ngt-object3D attractor [options]="{
|
|
152
|
+
* strength: 1000,
|
|
153
|
+
* range: 50,
|
|
154
|
+
* type: 'newtonian',
|
|
155
|
+
* gravitationalConstant: 0.01
|
|
156
|
+
* }" />
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
90
159
|
class NgtrAttractor {
|
|
91
160
|
position = input([0, 0, 0], ...(ngDevMode ? [{ debugName: "position" }] : []));
|
|
92
|
-
options = input(defaultOptions, ...(ngDevMode ?
|
|
161
|
+
options = input(defaultOptions, { ...(ngDevMode ? { debugName: "options" } : {}), transform: mergeInputs(defaultOptions) });
|
|
93
162
|
objectRef = inject(ElementRef);
|
|
94
163
|
collisionGroups = pick(this.options, 'collisionGroups');
|
|
95
|
-
linkedCollisionGroups = linkedSignal(this.collisionGroups);
|
|
164
|
+
linkedCollisionGroups = linkedSignal(this.collisionGroups, ...(ngDevMode ? [{ debugName: "linkedCollisionGroups" }] : []));
|
|
96
165
|
constructor() {
|
|
97
166
|
effect(() => {
|
|
98
167
|
applyProps(this.objectRef.nativeElement, { position: this.position() });
|
|
@@ -115,8 +184,8 @@ class NgtrAttractor {
|
|
|
115
184
|
});
|
|
116
185
|
attractorDebug(this.objectRef.nativeElement, this.options);
|
|
117
186
|
}
|
|
118
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
119
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
187
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgtrAttractor, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
188
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.6", type: NgtrAttractor, isStandalone: true, selector: "ngt-object3D[attractor]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
120
189
|
{
|
|
121
190
|
provide: COLLISION_GROUPS_HANDLER,
|
|
122
191
|
useFactory: (attractor) => {
|
|
@@ -128,7 +197,7 @@ class NgtrAttractor {
|
|
|
128
197
|
},
|
|
129
198
|
], ngImport: i0 });
|
|
130
199
|
}
|
|
131
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: NgtrAttractor, decorators: [{
|
|
132
201
|
type: Directive,
|
|
133
202
|
args: [{
|
|
134
203
|
selector: 'ngt-object3D[attractor]',
|
|
@@ -144,7 +213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
144
213
|
},
|
|
145
214
|
],
|
|
146
215
|
}]
|
|
147
|
-
}], ctorParameters: () => [] });
|
|
216
|
+
}], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
|
|
148
217
|
|
|
149
218
|
/**
|
|
150
219
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-three-rapier-addons.mjs","sources":["../tmp-esm2022/addons/lib/attractor-debug.js","../tmp-esm2022/addons/lib/attractor.js","../tmp-esm2022/addons/angular-three-rapier-addons.js"],"sourcesContent":["import { computed, effect, inject } from '@angular/core';\nimport { beforeRender, injectStore, pick } from 'angular-three';\nimport { NgtrPhysics } from 'angular-three-rapier';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\nimport { VertexNormalsHelper } from 'three-stdlib';\nconst _v3 = new THREE.Vector3();\nexport function attractorDebug(object, options, injector) {\n return assertInjector(attractorDebug, injector, () => {\n const physics = inject(NgtrPhysics);\n const store = injectStore();\n const strength = pick(options, 'strength');\n const range = pick(options, 'range');\n const color = computed(() => (strength() > 0 ? 0x0000ff : 0xff0000), ...(ngDevMode ? [{ debugName: \"color\" }] : []));\n let mesh;\n let normalsHelper;\n effect((onCleanup) => {\n if (!physics['debug']())\n return;\n mesh = new THREE.Mesh(new THREE.SphereGeometry(0.2, 6, 6), new THREE.MeshBasicMaterial({ color: color(), wireframe: true }));\n normalsHelper = new VertexNormalsHelper(mesh, range(), color());\n normalsHelper.frustumCulled = false;\n store.snapshot.scene.add(mesh);\n store.snapshot.scene.add(normalsHelper);\n onCleanup(() => {\n if (mesh) {\n store.snapshot.scene.remove(mesh);\n }\n if (normalsHelper) {\n store.snapshot.scene.remove(normalsHelper);\n }\n });\n });\n beforeRender(() => {\n if (!physics['debug']())\n return;\n if (mesh) {\n const worldPosition = object.getWorldPosition(_v3);\n mesh.position.copy(worldPosition);\n normalsHelper?.update();\n }\n });\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmFjdG9yLWRlYnVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9saWIvYXR0cmFjdG9yLWRlYnVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7QUFFaEMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFzQixFQUFFLE9BQWtDLEVBQUUsUUFBbUI7SUFDN0csT0FBTyxjQUFjLENBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLFdBQVcsRUFBRSxDQUFDO1FBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGlEQUFDLENBQUM7UUFFckUsSUFBSSxJQUFnQixDQUFDO1FBQ3JCLElBQUksYUFBa0MsQ0FBQztRQUV2QyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLE9BQU87WUFFaEMsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FDcEIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25DLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUNoRSxDQUFDO1lBRUYsYUFBYSxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDaEUsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFFcEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV4QyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1YsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUVELElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQUUsT0FBTztZQUVoQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNWLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBiZWZvcmVSZW5kZXIsIGluamVjdFN0b3JlLCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBOZ3RyUGh5c2ljcyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtcmFwaWVyJztcbmltcG9ydCB7IGFzc2VydEluamVjdG9yIH0gZnJvbSAnbmd4dGVuc2lvbi9hc3NlcnQtaW5qZWN0b3InO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgVmVydGV4Tm9ybWFsc0hlbHBlciB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5pbXBvcnQgeyBOZ3RyQXR0YWN0b3JPcHRpb25zIH0gZnJvbSAnLi9hdHRyYWN0b3InO1xuXG5jb25zdCBfdjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG5leHBvcnQgZnVuY3Rpb24gYXR0cmFjdG9yRGVidWcob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgb3B0aW9uczogKCkgPT4gTmd0ckF0dGFjdG9yT3B0aW9ucywgaW5qZWN0b3I/OiBJbmplY3Rvcikge1xuXHRyZXR1cm4gYXNzZXJ0SW5qZWN0b3IoYXR0cmFjdG9yRGVidWcsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcGh5c2ljcyA9IGluamVjdChOZ3RyUGh5c2ljcyk7XG5cdFx0Y29uc3Qgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdFx0Y29uc3Qgc3RyZW5ndGggPSBwaWNrKG9wdGlvbnMsICdzdHJlbmd0aCcpO1xuXHRcdGNvbnN0IHJhbmdlID0gcGljayhvcHRpb25zLCAncmFuZ2UnKTtcblx0XHRjb25zdCBjb2xvciA9IGNvbXB1dGVkKCgpID0+IChzdHJlbmd0aCgpID4gMCA/IDB4MDAwMGZmIDogMHhmZjAwMDApKTtcblxuXHRcdGxldCBtZXNoOiBUSFJFRS5NZXNoO1xuXHRcdGxldCBub3JtYWxzSGVscGVyOiBWZXJ0ZXhOb3JtYWxzSGVscGVyO1xuXG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGlmICghcGh5c2ljc1snZGVidWcnXSgpKSByZXR1cm47XG5cblx0XHRcdG1lc2ggPSBuZXcgVEhSRUUuTWVzaChcblx0XHRcdFx0bmV3IFRIUkVFLlNwaGVyZUdlb21ldHJ5KDAuMiwgNiwgNiksXG5cdFx0XHRcdG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiBjb2xvcigpLCB3aXJlZnJhbWU6IHRydWUgfSksXG5cdFx0XHQpO1xuXG5cdFx0XHRub3JtYWxzSGVscGVyID0gbmV3IFZlcnRleE5vcm1hbHNIZWxwZXIobWVzaCwgcmFuZ2UoKSwgY29sb3IoKSk7XG5cdFx0XHRub3JtYWxzSGVscGVyLmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblxuXHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUuYWRkKG1lc2gpO1xuXHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUuYWRkKG5vcm1hbHNIZWxwZXIpO1xuXG5cdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRpZiAobWVzaCkge1xuXHRcdFx0XHRcdHN0b3JlLnNuYXBzaG90LnNjZW5lLnJlbW92ZShtZXNoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChub3JtYWxzSGVscGVyKSB7XG5cdFx0XHRcdFx0c3RvcmUuc25hcHNob3Quc2NlbmUucmVtb3ZlKG5vcm1hbHNIZWxwZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGJlZm9yZVJlbmRlcigoKSA9PiB7XG5cdFx0XHRpZiAoIXBoeXNpY3NbJ2RlYnVnJ10oKSkgcmV0dXJuO1xuXG5cdFx0XHRpZiAobWVzaCkge1xuXHRcdFx0XHRjb25zdCB3b3JsZFBvc2l0aW9uID0gb2JqZWN0LmdldFdvcmxkUG9zaXRpb24oX3YzKTtcblx0XHRcdFx0bWVzaC5wb3NpdGlvbi5jb3B5KHdvcmxkUG9zaXRpb24pO1xuXHRcdFx0XHRub3JtYWxzSGVscGVyPy51cGRhdGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG4iXX0=","import { Directive, effect, ElementRef, inject, input, linkedSignal, untracked } from '@angular/core';\nimport { applyProps, pick } from 'angular-three';\nimport { beforePhysicsStep, COLLISION_GROUPS_HANDLER } from 'angular-three-rapier';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport * as THREE from 'three';\nimport { attractorDebug } from './attractor-debug';\nimport * as i0 from \"@angular/core\";\nconst calcForceByType = {\n static: (s, m2, r, d, G) => s,\n linear: (s, m2, r, d, G) => s * (d / r),\n newtonian: (s, m2, r, d, G) => (G * s * m2) / Math.pow(d, 2),\n};\nconst _position = new THREE.Vector3();\nconst _vector3 = new THREE.Vector3();\nexport function applyAttractorForceOnRigidBody(rigidBody, { object, strength, range, gravitationalConstant, collisionGroups, type, }) {\n const rbPosition = rigidBody.translation();\n _position.set(rbPosition.x, rbPosition.y, rbPosition.z);\n const worldPosition = object.getWorldPosition(new THREE.Vector3());\n const distance = worldPosition.distanceTo(_position);\n if (distance < range) {\n let force = calcForceByType[type](strength, rigidBody.mass(), range, distance, gravitationalConstant);\n // Prevent wild forces when Attractors collide\n force = force === Infinity ? strength : force;\n // Naively test if the rigidBody contains a collider in one of the collision groups\n let isRigidBodyInCollisionGroup = collisionGroups === undefined;\n if (collisionGroups !== undefined) {\n for (let i = 0; i < rigidBody.numColliders(); i++) {\n const collider = rigidBody.collider(i);\n const colliderCollisionGroups = collider.collisionGroups();\n if (((collisionGroups >> 16) & colliderCollisionGroups) != 0 &&\n ((colliderCollisionGroups >> 16) & collisionGroups) != 0) {\n isRigidBodyInCollisionGroup = true;\n break;\n }\n }\n }\n if (isRigidBodyInCollisionGroup) {\n _vector3.set(0, 0, 0).subVectors(worldPosition, _position).normalize().multiplyScalar(force);\n rigidBody.applyImpulse(_vector3, true);\n }\n }\n}\nconst defaultOptions = {\n strength: 1,\n range: 10,\n type: 'static',\n gravitationalConstant: 6.673e-11,\n};\nexport class NgtrAttractor {\n position = input([0, 0, 0], ...(ngDevMode ? [{ debugName: \"position\" }] : []));\n options = input(defaultOptions, ...(ngDevMode ? [{ debugName: \"options\", transform: mergeInputs(defaultOptions) }] : [{ transform: mergeInputs(defaultOptions) }]));\n objectRef = inject(ElementRef);\n collisionGroups = pick(this.options, 'collisionGroups');\n linkedCollisionGroups = linkedSignal(this.collisionGroups);\n constructor() {\n effect(() => {\n applyProps(this.objectRef.nativeElement, { position: this.position() });\n });\n beforePhysicsStep((world) => {\n const { strength, range, type, gravitationalConstant } = untracked(this.options);\n const collisionGroups = untracked(this.linkedCollisionGroups);\n world.bodies.forEach((body) => {\n if (body.isDynamic()) {\n applyAttractorForceOnRigidBody(body, {\n object: this.objectRef.nativeElement,\n strength,\n range,\n type,\n gravitationalConstant,\n collisionGroups,\n });\n }\n });\n });\n attractorDebug(this.objectRef.nativeElement, this.options);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: NgtrAttractor, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"17.1.0\", version: \"20.1.7\", type: NgtrAttractor, isStandalone: true, selector: \"ngt-object3D[attractor]\", inputs: { position: { classPropertyName: \"position\", publicName: \"position\", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: \"options\", publicName: \"options\", isSignal: true, isRequired: false, transformFunction: null } }, providers: [\n {\n provide: COLLISION_GROUPS_HANDLER,\n useFactory: (attractor) => {\n return () => (interactionGroups) => {\n attractor.linkedCollisionGroups.set(interactionGroups);\n };\n },\n deps: [NgtrAttractor],\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.1.7\", ngImport: i0, type: NgtrAttractor, decorators: [{\n type: Directive,\n args: [{\n selector: 'ngt-object3D[attractor]',\n providers: [\n {\n provide: COLLISION_GROUPS_HANDLER,\n useFactory: (attractor) => {\n return () => (interactionGroups) => {\n attractor.linkedCollisionGroups.set(interactionGroups);\n };\n },\n deps: [NgtrAttractor],\n },\n ],\n }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9saWIvYXR0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLFVBQVUsRUFBYyxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFbkQsTUFBTSxlQUFlLEdBQUc7SUFDdkIsTUFBTSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQVUsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9FLFNBQVMsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDcEcsQ0FBQztBQUVGLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXJDLE1BQU0sVUFBVSw4QkFBOEIsQ0FDN0MsU0FBb0IsRUFDcEIsRUFDQyxNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLElBQUksR0FDOEM7SUFFbkQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUVuRSxNQUFNLFFBQVEsR0FBVyxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdELElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ3RCLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUV0Ryw4Q0FBOEM7UUFDOUMsS0FBSyxHQUFHLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRTlDLG1GQUFtRjtRQUNuRixJQUFJLDJCQUEyQixHQUFHLGVBQWUsS0FBSyxTQUFTLENBQUM7UUFDaEUsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDM0QsSUFDQyxDQUFDLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQztvQkFDeEQsQ0FBQyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFDdkQsQ0FBQztvQkFDRiwyQkFBMkIsR0FBRyxJQUFJLENBQUM7b0JBQ25DLE1BQU07Z0JBQ1AsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBRUQsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3RixTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0YsQ0FBQztBQUNGLENBQUM7QUEwQ0QsTUFBTSxjQUFjLEdBQXdCO0lBQzNDLFFBQVEsRUFBRSxDQUFDO0lBQ1gsS0FBSyxFQUFFLEVBQUU7SUFDVCxJQUFJLEVBQUUsUUFBUTtJQUNkLHFCQUFxQixFQUFFLFNBQVM7Q0FDaEMsQ0FBQztBQWdCRixNQUFNLE9BQU8sYUFBYTtJQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsb0RBQUMsQ0FBQztJQUN4QyxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsMkNBQUksU0FBUyxFQUFFLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBeEMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUMsQ0FBQztJQUVwRSxTQUFTLEdBQUcsTUFBTSxDQUE2QixVQUFVLENBQUMsQ0FBQztJQUMzRCxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNoRSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTNEO1FBQ0MsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO29CQUN0Qiw4QkFBOEIsQ0FBQyxJQUFJLEVBQUU7d0JBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWE7d0JBQ3BDLFFBQVE7d0JBQ1IsS0FBSzt3QkFDTCxJQUFJO3dCQUNKLHFCQUFxQjt3QkFDckIsZUFBZTtxQkFDZixDQUFDLENBQUM7Z0JBQ0osQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7dUdBL0JXLGFBQWE7MkZBQWIsYUFBYSxpVkFaZDtZQUNWO2dCQUNDLE9BQU8sRUFBRSx3QkFBd0I7Z0JBQ2pDLFVBQVUsRUFBRSxDQUFDLFNBQXdCLEVBQUUsRUFBRTtvQkFDeEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFvQyxFQUFFLEVBQUU7d0JBQ3JELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQ3JCO1NBQ0Q7OzJGQUVXLGFBQWE7a0JBZHpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsU0FBUyxFQUFFO3dCQUNWOzRCQUNDLE9BQU8sRUFBRSx3QkFBd0I7NEJBQ2pDLFVBQVUsRUFBRSxDQUFDLFNBQXdCLEVBQUUsRUFBRTtnQ0FDeEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFvQyxFQUFFLEVBQUU7b0NBQ3JELFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQ0FDeEQsQ0FBQyxDQUFDOzRCQUNILENBQUM7NEJBQ0QsSUFBSSxFQUFFLGVBQWU7eUJBQ3JCO3FCQUNEO2lCQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIGxpbmtlZFNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbkdyb3VwcywgUmlnaWRCb2R5IH0gZnJvbSAnQGRpbWZvcmdlL3JhcGllcjNkLWNvbXBhdCc7XG5pbXBvcnQgeyBhcHBseVByb3BzLCBOZ3RWZWN0b3IzLCBwaWNrIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBiZWZvcmVQaHlzaWNzU3RlcCwgQ09MTElTSU9OX0dST1VQU19IQU5ETEVSIH0gZnJvbSAnYW5ndWxhci10aHJlZS1yYXBpZXInO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgYXR0cmFjdG9yRGVidWcgfSBmcm9tICcuL2F0dHJhY3Rvci1kZWJ1Zyc7XG5cbmNvbnN0IGNhbGNGb3JjZUJ5VHlwZSA9IHtcblx0c3RhdGljOiAoczogbnVtYmVyLCBtMjogbnVtYmVyLCByOiBudW1iZXIsIGQ6IG51bWJlciwgRzogbnVtYmVyKSA9PiBzLFxuXHRsaW5lYXI6IChzOiBudW1iZXIsIG0yOiBudW1iZXIsIHI6IG51bWJlciwgZDogbnVtYmVyLCBHOiBudW1iZXIpID0+IHMgKiAoZCAvIHIpLFxuXHRuZXd0b25pYW46IChzOiBudW1iZXIsIG0yOiBudW1iZXIsIHI6IG51bWJlciwgZDogbnVtYmVyLCBHOiBudW1iZXIpID0+IChHICogcyAqIG0yKSAvIE1hdGgucG93KGQsIDIpLFxufTtcblxuY29uc3QgX3Bvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbmNvbnN0IF92ZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmFjdG9yRm9yY2VPblJpZ2lkQm9keShcblx0cmlnaWRCb2R5OiBSaWdpZEJvZHksXG5cdHtcblx0XHRvYmplY3QsXG5cdFx0c3RyZW5ndGgsXG5cdFx0cmFuZ2UsXG5cdFx0Z3Jhdml0YXRpb25hbENvbnN0YW50LFxuXHRcdGNvbGxpc2lvbkdyb3Vwcyxcblx0XHR0eXBlLFxuXHR9OiBOZ3RyQXR0YWN0b3JPcHRpb25zICYgeyBvYmplY3Q6IFRIUkVFLk9iamVjdDNEIH0sXG4pIHtcblx0Y29uc3QgcmJQb3NpdGlvbiA9IHJpZ2lkQm9keS50cmFuc2xhdGlvbigpO1xuXHRfcG9zaXRpb24uc2V0KHJiUG9zaXRpb24ueCwgcmJQb3NpdGlvbi55LCByYlBvc2l0aW9uLnopO1xuXG5cdGNvbnN0IHdvcmxkUG9zaXRpb24gPSBvYmplY3QuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTtcblxuXHRjb25zdCBkaXN0YW5jZTogbnVtYmVyID0gd29ybGRQb3NpdGlvbi5kaXN0YW5jZVRvKF9wb3NpdGlvbik7XG5cblx0aWYgKGRpc3RhbmNlIDwgcmFuZ2UpIHtcblx0XHRsZXQgZm9yY2UgPSBjYWxjRm9yY2VCeVR5cGVbdHlwZV0oc3RyZW5ndGgsIHJpZ2lkQm9keS5tYXNzKCksIHJhbmdlLCBkaXN0YW5jZSwgZ3Jhdml0YXRpb25hbENvbnN0YW50KTtcblxuXHRcdC8vIFByZXZlbnQgd2lsZCBmb3JjZXMgd2hlbiBBdHRyYWN0b3JzIGNvbGxpZGVcblx0XHRmb3JjZSA9IGZvcmNlID09PSBJbmZpbml0eSA/IHN0cmVuZ3RoIDogZm9yY2U7XG5cblx0XHQvLyBOYWl2ZWx5IHRlc3QgaWYgdGhlIHJpZ2lkQm9keSBjb250YWlucyBhIGNvbGxpZGVyIGluIG9uZSBvZiB0aGUgY29sbGlzaW9uIGdyb3Vwc1xuXHRcdGxldCBpc1JpZ2lkQm9keUluQ29sbGlzaW9uR3JvdXAgPSBjb2xsaXNpb25Hcm91cHMgPT09IHVuZGVmaW5lZDtcblx0XHRpZiAoY29sbGlzaW9uR3JvdXBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmlnaWRCb2R5Lm51bUNvbGxpZGVycygpOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgY29sbGlkZXIgPSByaWdpZEJvZHkuY29sbGlkZXIoaSk7XG5cdFx0XHRcdGNvbnN0IGNvbGxpZGVyQ29sbGlzaW9uR3JvdXBzID0gY29sbGlkZXIuY29sbGlzaW9uR3JvdXBzKCk7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoKGNvbGxpc2lvbkdyb3VwcyA+PiAxNikgJiBjb2xsaWRlckNvbGxpc2lvbkdyb3VwcykgIT0gMCAmJlxuXHRcdFx0XHRcdCgoY29sbGlkZXJDb2xsaXNpb25Hcm91cHMgPj4gMTYpICYgY29sbGlzaW9uR3JvdXBzKSAhPSAwXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGlzUmlnaWRCb2R5SW5Db2xsaXNpb25Hcm91cCA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaXNSaWdpZEJvZHlJbkNvbGxpc2lvbkdyb3VwKSB7XG5cdFx0XHRfdmVjdG9yMy5zZXQoMCwgMCwgMCkuc3ViVmVjdG9ycyh3b3JsZFBvc2l0aW9uLCBfcG9zaXRpb24pLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGZvcmNlKTtcblxuXHRcdFx0cmlnaWRCb2R5LmFwcGx5SW1wdWxzZShfdmVjdG9yMywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCB0eXBlIE5ndHJBdHRyYWN0b3JHcmF2aXR5VHlwZSA9ICdzdGF0aWMnIHwgJ2xpbmVhcicgfCAnbmV3dG9uaWFuJztcbmV4cG9ydCBpbnRlcmZhY2UgTmd0ckF0dGFjdG9yT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBUaGUgc3RyZW5ndGggb2YgdGhlIGF0dHJhY3Rvci5cblx0ICogUG9zaXRpdmUgdmFsdWVzIGF0dHJhY3QsIG5lZ2F0aXZlIHZhbHVlcyByZXBlbC5cblx0ICpcblx0ICogQGRlZmF1bHRWYWx1ZSAxXG5cdCAqL1xuXHRzdHJlbmd0aDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmFuZ2Ugb2YgdGhlIGF0dHJhY3Rvci4gV2lsbCBub3QgYWZmZWN0IG9iamVjdHMgb3V0c2lkZSBvZiB0aGlzIHJhbmdlLlxuXHQgKlxuXHQgKiBAZGVmYXVsdFZhbHVlIDEwXG5cdCAqIEBtaW4gMFxuXHQgKi9cblx0cmFuZ2U6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgZ3Jhdml0eSB0byB1c2UuXG5cdCAqIC0gc3RhdGljOiBUaGUgZ3Jhdml0eSBpcyBjb25zdGFudCBhbmQgZG9lcyBub3QgY2hhbmdlIG92ZXIgdGltZS5cblx0ICogLSBsaW5lYXI6IFRoZSBncmF2aXR5IGlzIGxpbmVhcmx5IGludGVycG9sYXRlZCB0aGUgY2xvc2VyIHRoZSBvYmplY3QgaXMgdG8gdGhlIGF0dHJhY3Rvci5cblx0ICogLSBuZXd0b25pYW46IFRoZSBncmF2aXR5IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIG5ld3RvbmlhbiBncmF2aXR5IGZvcm11bGEuXG5cdCAqIEBkZWZhdWx0VmFsdWUgXCJzdGF0aWNcIlxuXHQgKi9cblx0dHlwZTogTmd0ckF0dHJhY3RvckdyYXZpdHlUeXBlO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWFzcyBvZiB0aGUgYXR0cmFjdG9yLiBVc2VkIHdoZW4gdHlwZSBpcyBgbmV3dG9uaWFuYC5cblx0ICogQGRlZmF1bHRWYWx1ZSA2LjY3M2UtMTFcblx0ICovXG5cdGdyYXZpdGF0aW9uYWxDb25zdGFudDogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgY29sbGlzaW9uIGdyb3VwcyB0aGF0IHRoaXMgYXR0cmFjdG9yIHdpbGwgYXBwbHkgZWZmZWN0cyB0by4gSWYgYSBSaWdpZEJvZHkgY29udGFpbnMgb25lIG9yIG1vcmUgY29sbGlkZXJzIHRoYXQgYXJlIGluIG9uZSBvZiB0aGUgbWFzayBncm91cCwgaXQgd2lsbCBiZSBhZmZlY3RlZCBieSB0aGlzIGF0dHJhY3Rvci5cblx0ICogSWYgbm90IHNwZWNpZmllZCwgdGhlIGF0dHJhY3RvciB3aWxsIGFwcGx5IGVmZmVjdHMgdG8gYWxsIFJpZ2lkQm9kaWVzLlxuXHQgKi9cblx0Y29sbGlzaW9uR3JvdXBzPzogSW50ZXJhY3Rpb25Hcm91cHM7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RyQXR0YWN0b3JPcHRpb25zID0ge1xuXHRzdHJlbmd0aDogMSxcblx0cmFuZ2U6IDEwLFxuXHR0eXBlOiAnc3RhdGljJyxcblx0Z3Jhdml0YXRpb25hbENvbnN0YW50OiA2LjY3M2UtMTEsXG59O1xuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICduZ3Qtb2JqZWN0M0RbYXR0cmFjdG9yXScsXG5cdHByb3ZpZGVyczogW1xuXHRcdHtcblx0XHRcdHByb3ZpZGU6IENPTExJU0lPTl9HUk9VUFNfSEFORExFUixcblx0XHRcdHVzZUZhY3Rvcnk6IChhdHRyYWN0b3I6IE5ndHJBdHRyYWN0b3IpID0+IHtcblx0XHRcdFx0cmV0dXJuICgpID0+IChpbnRlcmFjdGlvbkdyb3VwczogSW50ZXJhY3Rpb25Hcm91cHMpID0+IHtcblx0XHRcdFx0XHRhdHRyYWN0b3IubGlua2VkQ29sbGlzaW9uR3JvdXBzLnNldChpbnRlcmFjdGlvbkdyb3Vwcyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXHRcdFx0ZGVwczogW05ndHJBdHRyYWN0b3JdLFxuXHRcdH0sXG5cdF0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHJBdHRyYWN0b3Ige1xuXHRwb3NpdGlvbiA9IGlucHV0PE5ndFZlY3RvcjM+KFswLCAwLCAwXSk7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIG9iamVjdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPFRIUkVFLk9iamVjdDNEPj4oRWxlbWVudFJlZik7XG5cdHByaXZhdGUgY29sbGlzaW9uR3JvdXBzID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xsaXNpb25Hcm91cHMnKTtcblx0bGlua2VkQ29sbGlzaW9uR3JvdXBzID0gbGlua2VkU2lnbmFsKHRoaXMuY29sbGlzaW9uR3JvdXBzKTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0YXBwbHlQcm9wcyh0aGlzLm9iamVjdFJlZi5uYXRpdmVFbGVtZW50LCB7IHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uKCkgfSk7XG5cdFx0fSk7XG5cblx0XHRiZWZvcmVQaHlzaWNzU3RlcCgod29ybGQpID0+IHtcblx0XHRcdGNvbnN0IHsgc3RyZW5ndGgsIHJhbmdlLCB0eXBlLCBncmF2aXRhdGlvbmFsQ29uc3RhbnQgfSA9IHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpO1xuXHRcdFx0Y29uc3QgY29sbGlzaW9uR3JvdXBzID0gdW50cmFja2VkKHRoaXMubGlua2VkQ29sbGlzaW9uR3JvdXBzKTtcblx0XHRcdHdvcmxkLmJvZGllcy5mb3JFYWNoKChib2R5KSA9PiB7XG5cdFx0XHRcdGlmIChib2R5LmlzRHluYW1pYygpKSB7XG5cdFx0XHRcdFx0YXBwbHlBdHRyYWN0b3JGb3JjZU9uUmlnaWRCb2R5KGJvZHksIHtcblx0XHRcdFx0XHRcdG9iamVjdDogdGhpcy5vYmplY3RSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0XHRcdHN0cmVuZ3RoLFxuXHRcdFx0XHRcdFx0cmFuZ2UsXG5cdFx0XHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRcdFx0Z3Jhdml0YXRpb25hbENvbnN0YW50LFxuXHRcdFx0XHRcdFx0Y29sbGlzaW9uR3JvdXBzLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGF0dHJhY3RvckRlYnVnKHRoaXMub2JqZWN0UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG5cdH1cbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1yYXBpZXItYWRkb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9yYXBpZXIvYWRkb25zL3NyYy9hbmd1bGFyLXRocmVlLXJhcGllci1hZGRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":";;;;;;;;;AAMA,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AACxB,SAAS,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAC1D,IAAI,OAAO,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM;AAC1D,QAAQ,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;AAC3C,QAAQ,MAAM,KAAK,GAAG,WAAW,EAAE;AACnC,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;AAClD,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5C,QAAQ,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,EAAE,GAAG,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5H,QAAQ,IAAI,IAAI;AAChB,QAAQ,IAAI,aAAa;AACzB,QAAQ,MAAM,CAAC,CAAC,SAAS,KAAK;AAC9B,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAgB;AAChB,YAAY,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACxI,YAAY,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC;AAC3E,YAAY,aAAa,CAAC,aAAa,GAAG,KAAK;AAC/C,YAAY,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1C,YAAY,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;AACnD,YAAY,SAAS,CAAC,MAAM;AAC5B,gBAAgB,IAAI,IAAI,EAAE;AAC1B,oBAAoB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AACrD;AACA,gBAAgB,IAAI,aAAa,EAAE;AACnC,oBAAoB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;AAC9D;AACA,aAAa,CAAC;AACd,SAAS,CAAC;AACV,QAAQ,YAAY,CAAC,MAAM;AAC3B,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAgB;AAChB,YAAY,IAAI,IAAI,EAAE;AACtB,gBAAgB,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC;AAClE,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;AACjD,gBAAgB,aAAa,EAAE,MAAM,EAAE;AACvC;AACA,SAAS,CAAC;AACV,KAAK,CAAC;AACN;;ACpCA,MAAM,eAAe,GAAG;AACxB,IAAI,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;AACjC,IAAI,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,IAAI,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC;AACD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AACrC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE;AAC7B,SAAS,8BAA8B,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,IAAI,GAAG,EAAE;AACtI,IAAI,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE;AAC9C,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAC3D,IAAI,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AACtE,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC;AACxD,IAAI,IAAI,QAAQ,GAAG,KAAK,EAAE;AAC1B,QAAQ,IAAI,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,qBAAqB,CAAC;AAC7G;AACA,QAAQ,KAAK,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,KAAK;AACrD;AACA,QAAQ,IAAI,2BAA2B,GAAG,eAAe,KAAK,SAAS;AACvE,QAAQ,IAAI,eAAe,KAAK,SAAS,EAAE;AAC3C,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;AAC/D,gBAAgB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,gBAAgB,MAAM,uBAAuB,GAAG,QAAQ,CAAC,eAAe,EAAE;AAC1E,gBAAgB,IAAI,CAAC,CAAC,eAAe,IAAI,EAAE,IAAI,uBAAuB,KAAK,CAAC;AAC5E,oBAAoB,CAAC,CAAC,uBAAuB,IAAI,EAAE,IAAI,eAAe,KAAK,CAAC,EAAE;AAC9E,oBAAoB,2BAA2B,GAAG,IAAI;AACtD,oBAAoB;AACpB;AACA;AACA;AACA,QAAQ,IAAI,2BAA2B,EAAE;AACzC,YAAY,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;AACxG,YAAY,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC;AAClD;AACA;AACA;AACA,MAAM,cAAc,GAAG;AACvB,IAAI,QAAQ,EAAE,CAAC;AACf,IAAI,KAAK,EAAE,EAAE;AACb,IAAI,IAAI,EAAE,QAAQ;AAClB,IAAI,qBAAqB,EAAE,SAAS;AACpC,CAAC;AACM,MAAM,aAAa,CAAC;AAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClF,IAAI,OAAO,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;AACvK,IAAI,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;AAClC,IAAI,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC;AAC3D,IAAI,qBAAqB,GAAG,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AAC9D,IAAI,WAAW,GAAG;AAClB,QAAQ,MAAM,CAAC,MAAM;AACrB,YAAY,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AACnF,SAAS,CAAC;AACV,QAAQ,iBAAiB,CAAC,CAAC,KAAK,KAAK;AACrC,YAAY,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5F,YAAY,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACzE,YAAY,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;AAC3C,gBAAgB,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACtC,oBAAoB,8BAA8B,CAAC,IAAI,EAAE;AACzD,wBAAwB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5D,wBAAwB,QAAQ;AAChC,wBAAwB,KAAK;AAC7B,wBAAwB,IAAI;AAC5B,wBAAwB,qBAAqB;AAC7C,wBAAwB,eAAe;AACvC,qBAAqB,CAAC;AACtB;AACA,aAAa,CAAC;AACd,SAAS,CAAC;AACV,QAAQ,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC;AAClE;AACA,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AACvK,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE;AACzb,YAAY;AACZ,gBAAgB,OAAO,EAAE,wBAAwB;AACjD,gBAAgB,UAAU,EAAE,CAAC,SAAS,KAAK;AAC3C,oBAAoB,OAAO,MAAM,CAAC,iBAAiB,KAAK;AACxD,wBAAwB,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC9E,qBAAqB;AACrB,iBAAiB;AACjB,gBAAgB,IAAI,EAAE,CAAC,aAAa,CAAC;AACrC,aAAa;AACb,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1B;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvH,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC;AACnB,oBAAoB,QAAQ,EAAE,yBAAyB;AACvD,oBAAoB,SAAS,EAAE;AAC/B,wBAAwB;AACxB,4BAA4B,OAAO,EAAE,wBAAwB;AAC7D,4BAA4B,UAAU,EAAE,CAAC,SAAS,KAAK;AACvD,gCAAgC,OAAO,MAAM,CAAC,iBAAiB,KAAK;AACpE,oCAAoC,SAAS,CAAC,qBAAqB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC1F,iCAAiC;AACjC,6BAA6B;AAC7B,4BAA4B,IAAI,EAAE,CAAC,aAAa,CAAC;AACjD,yBAAyB;AACzB,qBAAqB;AACrB,iBAAiB;AACjB,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;;ACzGvC;AACA;AACA;;;;"}
|
|
1
|
+
{"version":3,"file":"angular-three-rapier-addons.mjs","sources":["../../../../libs/rapier/addons/src/lib/attractor-debug.ts","../../../../libs/rapier/addons/src/lib/attractor.ts","../../../../libs/rapier/addons/src/angular-three-rapier-addons.ts"],"sourcesContent":["import { computed, effect, inject, Injector } from '@angular/core';\nimport { beforeRender, injectStore, pick } from 'angular-three';\nimport { NgtrPhysics } from 'angular-three-rapier';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport * as THREE from 'three';\nimport { VertexNormalsHelper } from 'three-stdlib';\nimport { NgtrAttactorOptions } from './attractor';\n\nconst _v3 = new THREE.Vector3();\n\n/**\n * Creates debug visualization for an attractor.\n * Shows a sphere at the attractor position with normals indicating the range.\n * Blue indicates attraction, red indicates repulsion.\n *\n * This is automatically called by NgtrAttractor when physics debug mode is enabled.\n *\n * @param object - The Object3D representing the attractor position\n * @param options - Getter function for attractor options\n * @param injector - Optional injector for dependency injection context\n *\n * @internal\n */\nexport function attractorDebug(object: THREE.Object3D, options: () => NgtrAttactorOptions, injector?: Injector) {\n\treturn assertInjector(attractorDebug, injector, () => {\n\t\tconst physics = inject(NgtrPhysics);\n\t\tconst store = injectStore();\n\n\t\tconst strength = pick(options, 'strength');\n\t\tconst range = pick(options, 'range');\n\t\tconst color = computed(() => (strength() > 0 ? 0x0000ff : 0xff0000));\n\n\t\tlet mesh: THREE.Mesh;\n\t\tlet normalsHelper: VertexNormalsHelper;\n\n\t\teffect((onCleanup) => {\n\t\t\tif (!physics['debug']()) return;\n\n\t\t\tmesh = new THREE.Mesh(\n\t\t\t\tnew THREE.SphereGeometry(0.2, 6, 6),\n\t\t\t\tnew THREE.MeshBasicMaterial({ color: color(), wireframe: true }),\n\t\t\t);\n\n\t\t\tnormalsHelper = new VertexNormalsHelper(mesh, range(), color());\n\t\t\tnormalsHelper.frustumCulled = false;\n\n\t\t\tstore.snapshot.scene.add(mesh);\n\t\t\tstore.snapshot.scene.add(normalsHelper);\n\n\t\t\tonCleanup(() => {\n\t\t\t\tif (mesh) {\n\t\t\t\t\tstore.snapshot.scene.remove(mesh);\n\t\t\t\t}\n\n\t\t\t\tif (normalsHelper) {\n\t\t\t\t\tstore.snapshot.scene.remove(normalsHelper);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tbeforeRender(() => {\n\t\t\tif (!physics['debug']()) return;\n\n\t\t\tif (mesh) {\n\t\t\t\tconst worldPosition = object.getWorldPosition(_v3);\n\t\t\t\tmesh.position.copy(worldPosition);\n\t\t\t\tnormalsHelper?.update();\n\t\t\t}\n\t\t});\n\t});\n}\n","import { Directive, effect, ElementRef, inject, input, linkedSignal, untracked } from '@angular/core';\nimport { InteractionGroups, RigidBody } from '@dimforge/rapier3d-compat';\nimport { applyProps, NgtVector3, pick } from 'angular-three';\nimport { beforePhysicsStep, COLLISION_GROUPS_HANDLER } from 'angular-three-rapier';\nimport { mergeInputs } from 'ngxtension/inject-inputs';\nimport * as THREE from 'three';\nimport { attractorDebug } from './attractor-debug';\n\n/**\n * Force calculation functions for different gravity types.\n * - static: Constant force regardless of distance\n * - linear: Force increases linearly as distance decreases\n * - newtonian: Force follows Newton's law of universal gravitation\n */\nconst calcForceByType = {\n\tstatic: (s: number, m2: number, r: number, d: number, G: number) => s,\n\tlinear: (s: number, m2: number, r: number, d: number, G: number) => s * (d / r),\n\tnewtonian: (s: number, m2: number, r: number, d: number, G: number) => (G * s * m2) / Math.pow(d, 2),\n};\n\nconst _position = new THREE.Vector3();\nconst _vector3 = new THREE.Vector3();\n\n/**\n * Applies attractor force to a rigid body based on its distance from the attractor.\n * Used internally by NgtrAttractor but can be called manually for custom behavior.\n *\n * @param rigidBody - The rigid body to apply the force to\n * @param options - The attractor configuration including position, strength, and type\n *\n * @example\n * ```typescript\n * beforePhysicsStep((world) => {\n * world.bodies.forEach((body) => {\n * if (body.isDynamic()) {\n * applyAttractorForceOnRigidBody(body, {\n * object: attractorMesh,\n * strength: 10,\n * range: 20,\n * type: 'newtonian',\n * gravitationalConstant: 6.673e-11\n * });\n * }\n * });\n * });\n * ```\n */\nexport function applyAttractorForceOnRigidBody(\n\trigidBody: RigidBody,\n\t{\n\t\tobject,\n\t\tstrength,\n\t\trange,\n\t\tgravitationalConstant,\n\t\tcollisionGroups,\n\t\ttype,\n\t}: NgtrAttactorOptions & { object: THREE.Object3D },\n) {\n\tconst rbPosition = rigidBody.translation();\n\t_position.set(rbPosition.x, rbPosition.y, rbPosition.z);\n\n\tconst worldPosition = object.getWorldPosition(new THREE.Vector3());\n\n\tconst distance: number = worldPosition.distanceTo(_position);\n\n\tif (distance < range) {\n\t\tlet force = calcForceByType[type](strength, rigidBody.mass(), range, distance, gravitationalConstant);\n\n\t\t// Prevent wild forces when Attractors collide\n\t\tforce = force === Infinity ? strength : force;\n\n\t\t// Naively test if the rigidBody contains a collider in one of the collision groups\n\t\tlet isRigidBodyInCollisionGroup = collisionGroups === undefined;\n\t\tif (collisionGroups !== undefined) {\n\t\t\tfor (let i = 0; i < rigidBody.numColliders(); i++) {\n\t\t\t\tconst collider = rigidBody.collider(i);\n\t\t\t\tconst colliderCollisionGroups = collider.collisionGroups();\n\t\t\t\tif (\n\t\t\t\t\t((collisionGroups >> 16) & colliderCollisionGroups) != 0 &&\n\t\t\t\t\t((colliderCollisionGroups >> 16) & collisionGroups) != 0\n\t\t\t\t) {\n\t\t\t\t\tisRigidBodyInCollisionGroup = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isRigidBodyInCollisionGroup) {\n\t\t\t_vector3.set(0, 0, 0).subVectors(worldPosition, _position).normalize().multiplyScalar(force);\n\n\t\t\trigidBody.applyImpulse(_vector3, true);\n\t\t}\n\t}\n}\n\n/**\n * Type of gravity calculation for attractors.\n * - `'static'` - Constant force regardless of distance\n * - `'linear'` - Force scales linearly with distance (closer = stronger)\n * - `'newtonian'` - Force follows Newton's law of universal gravitation (inverse square)\n */\nexport type NgtrAttractorGravityType = 'static' | 'linear' | 'newtonian';\n\n/**\n * Configuration options for the attractor directive.\n */\nexport interface NgtrAttactorOptions {\n\t/**\n\t * The strength of the attractor.\n\t * Positive values attract, negative values repel.\n\t *\n\t * @defaultValue 1\n\t */\n\tstrength: number;\n\n\t/**\n\t * The range of the attractor. Will not affect objects outside of this range.\n\t *\n\t * @defaultValue 10\n\t * @min 0\n\t */\n\trange: number;\n\n\t/**\n\t * The type of gravity to use.\n\t * - static: The gravity is constant and does not change over time.\n\t * - linear: The gravity is linearly interpolated the closer the object is to the attractor.\n\t * - newtonian: The gravity is calculated using the newtonian gravity formula.\n\t * @defaultValue \"static\"\n\t */\n\ttype: NgtrAttractorGravityType;\n\n\t/**\n\t * The mass of the attractor. Used when type is `newtonian`.\n\t * @defaultValue 6.673e-11\n\t */\n\tgravitationalConstant: number;\n\n\t/**\n\t * The collision groups that this attractor will apply effects to. If a RigidBody contains one or more colliders that are in one of the mask group, it will be affected by this attractor.\n\t * If not specified, the attractor will apply effects to all RigidBodies.\n\t */\n\tcollisionGroups?: InteractionGroups;\n}\n\nconst defaultOptions: NgtrAttactorOptions = {\n\tstrength: 1,\n\trange: 10,\n\ttype: 'static',\n\tgravitationalConstant: 6.673e-11,\n};\n\n/**\n * Directive that creates a gravitational attractor point in the physics world.\n * All dynamic rigid bodies within range will be attracted (or repelled) towards this point.\n *\n * The attractor can use different gravity models:\n * - Static: constant force\n * - Linear: force increases as objects get closer\n * - Newtonian: realistic inverse-square law\n *\n * @example\n * ```html\n * <!-- Simple attractor at origin -->\n * <ngt-object3D attractor [options]=\"{ strength: 5, range: 20 }\" />\n *\n * <!-- Repeller (negative strength) -->\n * <ngt-object3D attractor [options]=\"{ strength: -10, range: 15 }\" [position]=\"[5, 0, 0]\" />\n *\n * <!-- Newtonian gravity -->\n * <ngt-object3D attractor [options]=\"{\n * strength: 1000,\n * range: 50,\n * type: 'newtonian',\n * gravitationalConstant: 0.01\n * }\" />\n * ```\n */\n@Directive({\n\tselector: 'ngt-object3D[attractor]',\n\tproviders: [\n\t\t{\n\t\t\tprovide: COLLISION_GROUPS_HANDLER,\n\t\t\tuseFactory: (attractor: NgtrAttractor) => {\n\t\t\t\treturn () => (interactionGroups: InteractionGroups) => {\n\t\t\t\t\tattractor.linkedCollisionGroups.set(interactionGroups);\n\t\t\t\t};\n\t\t\t},\n\t\t\tdeps: [NgtrAttractor],\n\t\t},\n\t],\n})\nexport class NgtrAttractor {\n\tposition = input<NgtVector3>([0, 0, 0]);\n\toptions = input(defaultOptions, { transform: mergeInputs(defaultOptions) });\n\n\tprivate objectRef = inject<ElementRef<THREE.Object3D>>(ElementRef);\n\tprivate collisionGroups = pick(this.options, 'collisionGroups');\n\tlinkedCollisionGroups = linkedSignal(this.collisionGroups);\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tapplyProps(this.objectRef.nativeElement, { position: this.position() });\n\t\t});\n\n\t\tbeforePhysicsStep((world) => {\n\t\t\tconst { strength, range, type, gravitationalConstant } = untracked(this.options);\n\t\t\tconst collisionGroups = untracked(this.linkedCollisionGroups);\n\t\t\tworld.bodies.forEach((body) => {\n\t\t\t\tif (body.isDynamic()) {\n\t\t\t\t\tapplyAttractorForceOnRigidBody(body, {\n\t\t\t\t\t\tobject: this.objectRef.nativeElement,\n\t\t\t\t\t\tstrength,\n\t\t\t\t\t\trange,\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tgravitationalConstant,\n\t\t\t\t\t\tcollisionGroups,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tattractorDebug(this.objectRef.nativeElement, this.options);\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|