@esotericsoftware/spine-core 4.3.10 → 4.3.11

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.
@@ -0,0 +1,57 @@
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated April 5, 2025. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2025, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software or
13
+ * otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ import type { Bone } from "./Bone.js";
30
+ /** Converts points between Spine skeleton coordinates and host runtime game coordinates. */
31
+ export interface SkeletonCoordinateConverter {
32
+ /**
33
+ * Converts `point` in-place from skeleton coordinates to host runtime game coordinates.
34
+ * @param point The point to convert.
35
+ */
36
+ skeletonToGame(point: {
37
+ x: number;
38
+ y: number;
39
+ }): void;
40
+ /**
41
+ * Converts `point` in-place from host runtime game coordinates to skeleton coordinates.
42
+ * @param point The point to convert.
43
+ */
44
+ gameToSkeleton(point: {
45
+ x: number;
46
+ y: number;
47
+ }): void;
48
+ /**
49
+ * Converts `point` in-place from host runtime game coordinates to the local coordinates of `bone`.
50
+ * @param point The point to convert.
51
+ * @param bone The bone whose local coordinates should receive the converted point.
52
+ */
53
+ gameToBone(point: {
54
+ x: number;
55
+ y: number;
56
+ }, bone: Bone): void;
57
+ }
@@ -0,0 +1,30 @@
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated April 5, 2025. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2025, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software or
13
+ * otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ export {};
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Db29yZGluYXRlQ29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uQ29vcmRpbmF0ZUNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0UiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB0eXBlIHsgQm9uZSB9IGZyb20gXCIuL0JvbmUuanNcIjtcblxuLyoqIENvbnZlcnRzIHBvaW50cyBiZXR3ZWVuIFNwaW5lIHNrZWxldG9uIGNvb3JkaW5hdGVzIGFuZCBob3N0IHJ1bnRpbWUgZ2FtZSBjb29yZGluYXRlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tlbGV0b25Db29yZGluYXRlQ29udmVydGVyIHtcblx0LyoqXG5cdCAqIENvbnZlcnRzIGBwb2ludGAgaW4tcGxhY2UgZnJvbSBza2VsZXRvbiBjb29yZGluYXRlcyB0byBob3N0IHJ1bnRpbWUgZ2FtZSBjb29yZGluYXRlcy5cblx0ICogQHBhcmFtIHBvaW50IFRoZSBwb2ludCB0byBjb252ZXJ0LlxuXHQgKi9cblx0c2tlbGV0b25Ub0dhbWUgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBgcG9pbnRgIGluLXBsYWNlIGZyb20gaG9zdCBydW50aW1lIGdhbWUgY29vcmRpbmF0ZXMgdG8gc2tlbGV0b24gY29vcmRpbmF0ZXMuXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQgdG8gY29udmVydC5cblx0ICovXG5cdGdhbWVUb1NrZWxldG9uIChwb2ludDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZDtcblxuXHQvKipcblx0ICogQ29udmVydHMgYHBvaW50YCBpbi1wbGFjZSBmcm9tIGhvc3QgcnVudGltZSBnYW1lIGNvb3JkaW5hdGVzIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiBgYm9uZWAuXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQgdG8gY29udmVydC5cblx0ICogQHBhcmFtIGJvbmUgVGhlIGJvbmUgd2hvc2UgbG9jYWwgY29vcmRpbmF0ZXMgc2hvdWxkIHJlY2VpdmUgdGhlIGNvbnZlcnRlZCBwb2ludC5cblx0ICovXG5cdGdhbWVUb0JvbmUgKHBvaW50OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIGJvbmU6IEJvbmUpOiB2b2lkO1xufVxuIl19
@@ -0,0 +1,134 @@
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated April 5, 2025. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2025, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software or
13
+ * otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ import type { Skeleton } from "./Skeleton.js";
30
+ /** A host runtime object's world position and rotation used for skeleton physics movement inheritance. */
31
+ export interface SkeletonPhysicsMovementTransform {
32
+ /** The host object's X position in world coordinates. */
33
+ x: number;
34
+ /** The host object's Y position in world coordinates. */
35
+ y: number;
36
+ /** The host object's Z position in world coordinates. Set to `0` in 2D runtimes. */
37
+ z: number;
38
+ /** The host object's rotation around the skeleton plane normal, in degrees and in the direction expected by Spine physics. */
39
+ rotation: number;
40
+ }
41
+ /** Initial movement inheritance values for {@link SkeletonPhysicsMovement}. */
42
+ export interface SkeletonPhysicsMovementOptions {
43
+ /** Initial horizontal position inheritance. Defaults to `0`. */
44
+ positionInheritanceX?: number;
45
+ /** Initial vertical position inheritance. Defaults to `0`. */
46
+ positionInheritanceY?: number;
47
+ /** Initial rotation inheritance. Defaults to `0`. */
48
+ rotationInheritance?: number;
49
+ }
50
+ /** Runtime-specific hooks needed by {@link SkeletonPhysicsMovement}. */
51
+ export interface SkeletonPhysicsMovementAdapter {
52
+ /**
53
+ * Writes the current host object world position to `out` and, when `readRotation` is true, its rotation.
54
+ * Implementations may skip calculating and writing `out.rotation` when `readRotation` is false.
55
+ * @param out Receives the current host object transform.
56
+ * @param readRotation Whether the current rotation is needed.
57
+ */
58
+ readTransform(out: SkeletonPhysicsMovementTransform, readRotation: boolean): void;
59
+ /**
60
+ * Converts `point` in-place from host world coordinates to skeleton coordinates.
61
+ * The converted skeleton coordinates are returned in `point.x` and `point.y`.
62
+ */
63
+ worldToSkeleton(point: {
64
+ x: number;
65
+ y: number;
66
+ z: number;
67
+ }): void;
68
+ }
69
+ /**
70
+ * Tracks movement of a host runtime object and applies that movement to skeleton physics constraints.
71
+ *
72
+ * This is useful for runtimes where a Spine skeleton is displayed by a movable object or container.
73
+ * When enabled, changes in the host object's position are converted to skeleton coordinates and passed to
74
+ * {@link Skeleton.physicsTranslate}. Changes in its rotation are passed to {@link Skeleton.physicsRotate}.
75
+ *
76
+ * Movement inheritance is opt-in. Position and rotation inheritance default to `0`, so
77
+ * {@link applyTransformMovement} returns immediately until one of the inheritance values is non-zero.
78
+ */
79
+ export declare class SkeletonPhysicsMovement {
80
+ private skeleton;
81
+ private adapter;
82
+ private positionInheritanceFactorX;
83
+ private positionInheritanceFactorY;
84
+ private rotationInheritanceFactor;
85
+ private hasLastTransform;
86
+ private lastX;
87
+ private lastY;
88
+ private lastZ;
89
+ private lastRotation;
90
+ private readonly currentTransform;
91
+ private readonly currentPosition;
92
+ private readonly lastPosition;
93
+ /**
94
+ * Creates a movement tracker for a skeleton displayed by a host runtime object.
95
+ * @param skeleton The skeleton whose physics constraints receive inherited movement.
96
+ * @param adapter Runtime-specific hooks used to read and convert the host object's transform.
97
+ * @param options Initial movement inheritance values.
98
+ */
99
+ constructor(skeleton: Skeleton, adapter: SkeletonPhysicsMovementAdapter, options?: SkeletonPhysicsMovementOptions);
100
+ /** Horizontal position inheritance factor. `0` disables horizontal position inheritance. */
101
+ get positionInheritanceX(): number;
102
+ /** Vertical position inheritance factor. `0` disables vertical position inheritance. */
103
+ get positionInheritanceY(): number;
104
+ /**
105
+ * Sets how much host object translation is inherited by skeleton physics constraints.
106
+ * Use `(1, 1)` for normal inheritance, or `(0, 0)` to disable position inheritance.
107
+ * @param x The horizontal position inheritance factor.
108
+ * @param y The vertical position inheritance factor.
109
+ */
110
+ setPositionInheritance(x: number, y: number): void;
111
+ /** Rotation inheritance factor. `0` disables rotation inheritance. */
112
+ get rotationInheritance(): number;
113
+ /**
114
+ * Sets how much host object rotation is inherited by skeleton physics constraints.
115
+ * @param value The rotation inheritance factor.
116
+ */
117
+ set rotationInheritance(value: number);
118
+ /** Resets the previous position used to calculate inherited translation. */
119
+ resetPosition(): void;
120
+ /** Resets the previous rotation used to calculate inherited rotation. */
121
+ resetRotation(): void;
122
+ /** Resets both previous position and previous rotation. */
123
+ resetTransform(): void;
124
+ /**
125
+ * Applies host object transform movement since the previous call to the skeleton's physics constraints.
126
+ *
127
+ * The first call records the current transform as the baseline and does not apply movement.
128
+ */
129
+ applyTransformMovement(): void;
130
+ private applyPositionMovement;
131
+ private applyRotationMovement;
132
+ private setLastTransform;
133
+ private getRotationDelta;
134
+ }
@@ -0,0 +1,189 @@
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated April 5, 2025. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2025, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software or
13
+ * otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ /**
30
+ * Tracks movement of a host runtime object and applies that movement to skeleton physics constraints.
31
+ *
32
+ * This is useful for runtimes where a Spine skeleton is displayed by a movable object or container.
33
+ * When enabled, changes in the host object's position are converted to skeleton coordinates and passed to
34
+ * {@link Skeleton.physicsTranslate}. Changes in its rotation are passed to {@link Skeleton.physicsRotate}.
35
+ *
36
+ * Movement inheritance is opt-in. Position and rotation inheritance default to `0`, so
37
+ * {@link applyTransformMovement} returns immediately until one of the inheritance values is non-zero.
38
+ */
39
+ export class SkeletonPhysicsMovement {
40
+ skeleton;
41
+ adapter;
42
+ positionInheritanceFactorX = 0;
43
+ positionInheritanceFactorY = 0;
44
+ rotationInheritanceFactor = 0;
45
+ hasLastTransform = false;
46
+ lastX = 0;
47
+ lastY = 0;
48
+ lastZ = 0;
49
+ lastRotation = 0;
50
+ currentTransform = { x: 0, y: 0, z: 0, rotation: 0 };
51
+ currentPosition = { x: 0, y: 0, z: 0 };
52
+ lastPosition = { x: 0, y: 0, z: 0 };
53
+ /**
54
+ * Creates a movement tracker for a skeleton displayed by a host runtime object.
55
+ * @param skeleton The skeleton whose physics constraints receive inherited movement.
56
+ * @param adapter Runtime-specific hooks used to read and convert the host object's transform.
57
+ * @param options Initial movement inheritance values.
58
+ */
59
+ constructor(skeleton, adapter, options = {}) {
60
+ this.skeleton = skeleton;
61
+ this.adapter = adapter;
62
+ this.positionInheritanceFactorX = options.positionInheritanceX ?? 0;
63
+ this.positionInheritanceFactorY = options.positionInheritanceY ?? 0;
64
+ this.rotationInheritanceFactor = options.rotationInheritance ?? 0;
65
+ }
66
+ /** Horizontal position inheritance factor. `0` disables horizontal position inheritance. */
67
+ get positionInheritanceX() {
68
+ return this.positionInheritanceFactorX;
69
+ }
70
+ /** Vertical position inheritance factor. `0` disables vertical position inheritance. */
71
+ get positionInheritanceY() {
72
+ return this.positionInheritanceFactorY;
73
+ }
74
+ /**
75
+ * Sets how much host object translation is inherited by skeleton physics constraints.
76
+ * Use `(1, 1)` for normal inheritance, or `(0, 0)` to disable position inheritance.
77
+ * @param x The horizontal position inheritance factor.
78
+ * @param y The vertical position inheritance factor.
79
+ */
80
+ setPositionInheritance(x, y) {
81
+ const wasDisabled = this.positionInheritanceFactorX === 0 && this.positionInheritanceFactorY === 0;
82
+ const isEnabled = x !== 0 || y !== 0;
83
+ this.positionInheritanceFactorX = x;
84
+ this.positionInheritanceFactorY = y;
85
+ if (wasDisabled && isEnabled)
86
+ this.resetPosition();
87
+ }
88
+ /** Rotation inheritance factor. `0` disables rotation inheritance. */
89
+ get rotationInheritance() {
90
+ return this.rotationInheritanceFactor;
91
+ }
92
+ /**
93
+ * Sets how much host object rotation is inherited by skeleton physics constraints.
94
+ * @param value The rotation inheritance factor.
95
+ */
96
+ set rotationInheritance(value) {
97
+ const wasDisabled = this.rotationInheritanceFactor === 0;
98
+ this.rotationInheritanceFactor = value;
99
+ if (wasDisabled && value !== 0)
100
+ this.resetRotation();
101
+ }
102
+ /** Resets the previous position used to calculate inherited translation. */
103
+ resetPosition() {
104
+ const transform = this.currentTransform;
105
+ const readRotation = !this.hasLastTransform && this.rotationInheritanceFactor !== 0;
106
+ this.adapter.readTransform(transform, readRotation);
107
+ this.lastX = transform.x;
108
+ this.lastY = transform.y;
109
+ this.lastZ = transform.z;
110
+ if (readRotation)
111
+ this.lastRotation = transform.rotation;
112
+ this.hasLastTransform = true;
113
+ }
114
+ /** Resets the previous rotation used to calculate inherited rotation. */
115
+ resetRotation() {
116
+ const transform = this.currentTransform;
117
+ this.adapter.readTransform(transform, true);
118
+ this.lastRotation = transform.rotation;
119
+ if (!this.hasLastTransform) {
120
+ this.lastX = transform.x;
121
+ this.lastY = transform.y;
122
+ this.lastZ = transform.z;
123
+ }
124
+ this.hasLastTransform = true;
125
+ }
126
+ /** Resets both previous position and previous rotation. */
127
+ resetTransform() {
128
+ const transform = this.currentTransform;
129
+ this.adapter.readTransform(transform, true);
130
+ this.setLastTransform(transform.x, transform.y, transform.z, transform.rotation);
131
+ }
132
+ /**
133
+ * Applies host object transform movement since the previous call to the skeleton's physics constraints.
134
+ *
135
+ * The first call records the current transform as the baseline and does not apply movement.
136
+ */
137
+ applyTransformMovement() {
138
+ const inheritPosition = this.positionInheritanceFactorX !== 0 || this.positionInheritanceFactorY !== 0;
139
+ const inheritRotation = this.rotationInheritanceFactor !== 0;
140
+ if (!inheritPosition && !inheritRotation)
141
+ return;
142
+ const transform = this.currentTransform;
143
+ this.adapter.readTransform(transform, inheritRotation);
144
+ const { x, y, z } = transform;
145
+ const currentRotation = inheritRotation ? transform.rotation : this.lastRotation;
146
+ const positionChanged = x !== this.lastX || y !== this.lastY || z !== this.lastZ;
147
+ if (this.hasLastTransform) {
148
+ if (!positionChanged && currentRotation === this.lastRotation)
149
+ return;
150
+ if (inheritPosition && positionChanged)
151
+ this.applyPositionMovement(x, y, z);
152
+ if (inheritRotation && currentRotation !== this.lastRotation)
153
+ this.applyRotationMovement(currentRotation);
154
+ }
155
+ this.setLastTransform(x, y, z, currentRotation);
156
+ }
157
+ applyPositionMovement(currentX, currentY, currentZ) {
158
+ const currentPosition = this.currentPosition;
159
+ currentPosition.x = currentX;
160
+ currentPosition.y = currentY;
161
+ currentPosition.z = currentZ;
162
+ this.adapter.worldToSkeleton(currentPosition);
163
+ const lastPosition = this.lastPosition;
164
+ lastPosition.x = this.lastX;
165
+ lastPosition.y = this.lastY;
166
+ lastPosition.z = this.lastZ;
167
+ this.adapter.worldToSkeleton(lastPosition);
168
+ this.skeleton.physicsTranslate((currentPosition.x - lastPosition.x) * this.positionInheritanceFactorX, (currentPosition.y - lastPosition.y) * this.positionInheritanceFactorY);
169
+ }
170
+ applyRotationMovement(currentRotation) {
171
+ const rotationFactor = this.rotationInheritanceFactor;
172
+ if (rotationFactor === 0)
173
+ return;
174
+ this.skeleton.physicsRotate(0, 0, this.getRotationDelta(currentRotation, this.lastRotation) * rotationFactor);
175
+ }
176
+ setLastTransform(x, y, z, rotation) {
177
+ this.lastX = x;
178
+ this.lastY = y;
179
+ this.lastZ = z;
180
+ this.lastRotation = rotation;
181
+ this.hasLastTransform = true;
182
+ }
183
+ getRotationDelta(current, previous) {
184
+ let delta = current - previous;
185
+ delta = (delta + 180) % 360 - 180;
186
+ return delta < -180 ? delta + 360 : delta;
187
+ }
188
+ }
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25QaHlzaWNzTW92ZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2tlbGV0b25QaHlzaWNzTW92ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBZ0QvRTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBb0IxQjtJQUNBO0lBcEJELDBCQUEwQixHQUFHLENBQUMsQ0FBQztJQUMvQiwwQkFBMEIsR0FBRyxDQUFDLENBQUM7SUFDL0IseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDVixZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ1IsZ0JBQWdCLEdBQXFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZGLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdkMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVyRDs7Ozs7T0FLRztJQUNILFlBQ1MsUUFBa0IsRUFDbEIsT0FBdUMsRUFDL0MsVUFBMEMsRUFBRTtRQUZwQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQWdDO1FBRy9DLElBQUksQ0FBQywwQkFBMEIsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDO1FBQ3BF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LDBCQUEwQixDQUN0RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFFLGVBQXVCO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUN0RCxJQUFJLGNBQWMsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFFTyxnQkFBZ0IsQ0FBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxRQUFnQjtRQUMxRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBRSxPQUFlLEVBQUUsUUFBZ0I7UUFDMUQsSUFBSSxLQUFLLEdBQUcsT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUMvQixLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNsQyxPQUFPLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlIG9yXG4gKiBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5cbi8qKiBBIGhvc3QgcnVudGltZSBvYmplY3QncyB3b3JsZCBwb3NpdGlvbiBhbmQgcm90YXRpb24gdXNlZCBmb3Igc2tlbGV0b24gcGh5c2ljcyBtb3ZlbWVudCBpbmhlcml0YW5jZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRUcmFuc2Zvcm0ge1xuXHQvKiogVGhlIGhvc3Qgb2JqZWN0J3MgWCBwb3NpdGlvbiBpbiB3b3JsZCBjb29yZGluYXRlcy4gKi9cblx0eDogbnVtYmVyO1xuXG5cdC8qKiBUaGUgaG9zdCBvYmplY3QncyBZIHBvc2l0aW9uIGluIHdvcmxkIGNvb3JkaW5hdGVzLiAqL1xuXHR5OiBudW1iZXI7XG5cblx0LyoqIFRoZSBob3N0IG9iamVjdCdzIFogcG9zaXRpb24gaW4gd29ybGQgY29vcmRpbmF0ZXMuIFNldCB0byBgMGAgaW4gMkQgcnVudGltZXMuICovXG5cdHo6IG51bWJlcjtcblxuXHQvKiogVGhlIGhvc3Qgb2JqZWN0J3Mgcm90YXRpb24gYXJvdW5kIHRoZSBza2VsZXRvbiBwbGFuZSBub3JtYWwsIGluIGRlZ3JlZXMgYW5kIGluIHRoZSBkaXJlY3Rpb24gZXhwZWN0ZWQgYnkgU3BpbmUgcGh5c2ljcy4gKi9cblx0cm90YXRpb246IG51bWJlcjtcbn1cblxuLyoqIEluaXRpYWwgbW92ZW1lbnQgaW5oZXJpdGFuY2UgdmFsdWVzIGZvciB7QGxpbmsgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudE9wdGlvbnMge1xuXHQvKiogSW5pdGlhbCBob3Jpem9udGFsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHBvc2l0aW9uSW5oZXJpdGFuY2VYPzogbnVtYmVyO1xuXG5cdC8qKiBJbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHBvc2l0aW9uSW5oZXJpdGFuY2VZPzogbnVtYmVyO1xuXG5cdC8qKiBJbml0aWFsIHJvdGF0aW9uIGluaGVyaXRhbmNlLiBEZWZhdWx0cyB0byBgMGAuICovXG5cdHJvdGF0aW9uSW5oZXJpdGFuY2U/OiBudW1iZXI7XG59XG5cbi8qKiBSdW50aW1lLXNwZWNpZmljIGhvb2tzIG5lZWRlZCBieSB7QGxpbmsgU2tlbGV0b25QaHlzaWNzTW92ZW1lbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudEFkYXB0ZXIge1xuXHQvKipcblx0ICogV3JpdGVzIHRoZSBjdXJyZW50IGhvc3Qgb2JqZWN0IHdvcmxkIHBvc2l0aW9uIHRvIGBvdXRgIGFuZCwgd2hlbiBgcmVhZFJvdGF0aW9uYCBpcyB0cnVlLCBpdHMgcm90YXRpb24uXG5cdCAqIEltcGxlbWVudGF0aW9ucyBtYXkgc2tpcCBjYWxjdWxhdGluZyBhbmQgd3JpdGluZyBgb3V0LnJvdGF0aW9uYCB3aGVuIGByZWFkUm90YXRpb25gIGlzIGZhbHNlLlxuXHQgKiBAcGFyYW0gb3V0IFJlY2VpdmVzIHRoZSBjdXJyZW50IGhvc3Qgb2JqZWN0IHRyYW5zZm9ybS5cblx0ICogQHBhcmFtIHJlYWRSb3RhdGlvbiBXaGV0aGVyIHRoZSBjdXJyZW50IHJvdGF0aW9uIGlzIG5lZWRlZC5cblx0ICovXG5cdHJlYWRUcmFuc2Zvcm0gKG91dDogU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRUcmFuc2Zvcm0sIHJlYWRSb3RhdGlvbjogYm9vbGVhbik6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGBwb2ludGAgaW4tcGxhY2UgZnJvbSBob3N0IHdvcmxkIGNvb3JkaW5hdGVzIHRvIHNrZWxldG9uIGNvb3JkaW5hdGVzLlxuXHQgKiBUaGUgY29udmVydGVkIHNrZWxldG9uIGNvb3JkaW5hdGVzIGFyZSByZXR1cm5lZCBpbiBgcG9pbnQueGAgYW5kIGBwb2ludC55YC5cblx0ICovXG5cdHdvcmxkVG9Ta2VsZXRvbiAocG9pbnQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUcmFja3MgbW92ZW1lbnQgb2YgYSBob3N0IHJ1bnRpbWUgb2JqZWN0IGFuZCBhcHBsaWVzIHRoYXQgbW92ZW1lbnQgdG8gc2tlbGV0b24gcGh5c2ljcyBjb25zdHJhaW50cy5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcnVudGltZXMgd2hlcmUgYSBTcGluZSBza2VsZXRvbiBpcyBkaXNwbGF5ZWQgYnkgYSBtb3ZhYmxlIG9iamVjdCBvciBjb250YWluZXIuXG4gKiBXaGVuIGVuYWJsZWQsIGNoYW5nZXMgaW4gdGhlIGhvc3Qgb2JqZWN0J3MgcG9zaXRpb24gYXJlIGNvbnZlcnRlZCB0byBza2VsZXRvbiBjb29yZGluYXRlcyBhbmQgcGFzc2VkIHRvXG4gKiB7QGxpbmsgU2tlbGV0b24ucGh5c2ljc1RyYW5zbGF0ZX0uIENoYW5nZXMgaW4gaXRzIHJvdGF0aW9uIGFyZSBwYXNzZWQgdG8ge0BsaW5rIFNrZWxldG9uLnBoeXNpY3NSb3RhdGV9LlxuICpcbiAqIE1vdmVtZW50IGluaGVyaXRhbmNlIGlzIG9wdC1pbi4gUG9zaXRpb24gYW5kIHJvdGF0aW9uIGluaGVyaXRhbmNlIGRlZmF1bHQgdG8gYDBgLCBzb1xuICoge0BsaW5rIGFwcGx5VHJhbnNmb3JtTW92ZW1lbnR9IHJldHVybnMgaW1tZWRpYXRlbHkgdW50aWwgb25lIG9mIHRoZSBpbmhlcml0YW5jZSB2YWx1ZXMgaXMgbm9uLXplcm8uXG4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudCB7XG5cdHByaXZhdGUgcG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclggPSAwO1xuXHRwcml2YXRlIHBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JZID0gMDtcblx0cHJpdmF0ZSByb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID0gMDtcblx0cHJpdmF0ZSBoYXNMYXN0VHJhbnNmb3JtID0gZmFsc2U7XG5cdHByaXZhdGUgbGFzdFggPSAwO1xuXHRwcml2YXRlIGxhc3RZID0gMDtcblx0cHJpdmF0ZSBsYXN0WiA9IDA7XG5cdHByaXZhdGUgbGFzdFJvdGF0aW9uID0gMDtcblx0cHJpdmF0ZSByZWFkb25seSBjdXJyZW50VHJhbnNmb3JtOiBTa2VsZXRvblBoeXNpY3NNb3ZlbWVudFRyYW5zZm9ybSA9IHsgeDogMCwgeTogMCwgejogMCwgcm90YXRpb246IDAgfTtcblx0cHJpdmF0ZSByZWFkb25seSBjdXJyZW50UG9zaXRpb24gPSB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcblx0cHJpdmF0ZSByZWFkb25seSBsYXN0UG9zaXRpb24gPSB7IHg6IDAsIHk6IDAsIHo6IDAgfTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG1vdmVtZW50IHRyYWNrZXIgZm9yIGEgc2tlbGV0b24gZGlzcGxheWVkIGJ5IGEgaG9zdCBydW50aW1lIG9iamVjdC5cblx0ICogQHBhcmFtIHNrZWxldG9uIFRoZSBza2VsZXRvbiB3aG9zZSBwaHlzaWNzIGNvbnN0cmFpbnRzIHJlY2VpdmUgaW5oZXJpdGVkIG1vdmVtZW50LlxuXHQgKiBAcGFyYW0gYWRhcHRlciBSdW50aW1lLXNwZWNpZmljIGhvb2tzIHVzZWQgdG8gcmVhZCBhbmQgY29udmVydCB0aGUgaG9zdCBvYmplY3QncyB0cmFuc2Zvcm0uXG5cdCAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWwgbW92ZW1lbnQgaW5oZXJpdGFuY2UgdmFsdWVzLlxuXHQgKi9cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgc2tlbGV0b246IFNrZWxldG9uLFxuXHRcdHByaXZhdGUgYWRhcHRlcjogU2tlbGV0b25QaHlzaWNzTW92ZW1lbnRBZGFwdGVyLFxuXHRcdG9wdGlvbnM6IFNrZWxldG9uUGh5c2ljc01vdmVtZW50T3B0aW9ucyA9IHt9LFxuXHQpIHtcblx0XHR0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JYID0gb3B0aW9ucy5wb3NpdGlvbkluaGVyaXRhbmNlWCA/PyAwO1xuXHRcdHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclkgPSBvcHRpb25zLnBvc2l0aW9uSW5oZXJpdGFuY2VZID8/IDA7XG5cdFx0dGhpcy5yb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID0gb3B0aW9ucy5yb3RhdGlvbkluaGVyaXRhbmNlID8/IDA7XG5cdH1cblxuXHQvKiogSG9yaXpvbnRhbCBwb3NpdGlvbiBpbmhlcml0YW5jZSBmYWN0b3IuIGAwYCBkaXNhYmxlcyBob3Jpem9udGFsIHBvc2l0aW9uIGluaGVyaXRhbmNlLiAqL1xuXHRnZXQgcG9zaXRpb25Jbmhlcml0YW5jZVggKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3Rvclg7XG5cdH1cblxuXHQvKiogVmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLiBgMGAgZGlzYWJsZXMgdmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UuICovXG5cdGdldCBwb3NpdGlvbkluaGVyaXRhbmNlWSAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGhvdyBtdWNoIGhvc3Qgb2JqZWN0IHRyYW5zbGF0aW9uIGlzIGluaGVyaXRlZCBieSBza2VsZXRvbiBwaHlzaWNzIGNvbnN0cmFpbnRzLlxuXHQgKiBVc2UgYCgxLCAxKWAgZm9yIG5vcm1hbCBpbmhlcml0YW5jZSwgb3IgYCgwLCAwKWAgdG8gZGlzYWJsZSBwb3NpdGlvbiBpbmhlcml0YW5jZS5cblx0ICogQHBhcmFtIHggVGhlIGhvcml6b250YWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLlxuXHQgKiBAcGFyYW0geSBUaGUgdmVydGljYWwgcG9zaXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLlxuXHQgKi9cblx0c2V0UG9zaXRpb25Jbmhlcml0YW5jZSAoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCB3YXNEaXNhYmxlZCA9IHRoaXMucG9zaXRpb25Jbmhlcml0YW5jZUZhY3RvclggPT09IDAgJiYgdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWSA9PT0gMDtcblx0XHRjb25zdCBpc0VuYWJsZWQgPSB4ICE9PSAwIHx8IHkgIT09IDA7XG5cdFx0dGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWCA9IHg7XG5cdFx0dGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWSA9IHk7XG5cdFx0aWYgKHdhc0Rpc2FibGVkICYmIGlzRW5hYmxlZCkgdGhpcy5yZXNldFBvc2l0aW9uKCk7XG5cdH1cblxuXHQvKiogUm90YXRpb24gaW5oZXJpdGFuY2UgZmFjdG9yLiBgMGAgZGlzYWJsZXMgcm90YXRpb24gaW5oZXJpdGFuY2UuICovXG5cdGdldCByb3RhdGlvbkluaGVyaXRhbmNlICgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLnJvdGF0aW9uSW5oZXJpdGFuY2VGYWN0b3I7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBob3cgbXVjaCBob3N0IG9iamVjdCByb3RhdGlvbiBpcyBpbmhlcml0ZWQgYnkgc2tlbGV0b24gcGh5c2ljcyBjb25zdHJhaW50cy5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSByb3RhdGlvbiBpbmhlcml0YW5jZSBmYWN0b3IuXG5cdCAqL1xuXHRzZXQgcm90YXRpb25Jbmhlcml0YW5jZSAodmFsdWU6IG51bWJlcikge1xuXHRcdGNvbnN0IHdhc0Rpc2FibGVkID0gdGhpcy5yb3RhdGlvbkluaGVyaXRhbmNlRmFjdG9yID09PSAwO1xuXHRcdHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciA9IHZhbHVlO1xuXHRcdGlmICh3YXNEaXNhYmxlZCAmJiB2YWx1ZSAhPT0gMCkgdGhpcy5yZXNldFJvdGF0aW9uKCk7XG5cdH1cblxuXHQvKiogUmVzZXRzIHRoZSBwcmV2aW91cyBwb3NpdGlvbiB1c2VkIHRvIGNhbGN1bGF0ZSBpbmhlcml0ZWQgdHJhbnNsYXRpb24uICovXG5cdHJlc2V0UG9zaXRpb24gKCk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMuY3VycmVudFRyYW5zZm9ybTtcblx0XHRjb25zdCByZWFkUm90YXRpb24gPSAhdGhpcy5oYXNMYXN0VHJhbnNmb3JtICYmIHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciAhPT0gMDtcblx0XHR0aGlzLmFkYXB0ZXIucmVhZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJlYWRSb3RhdGlvbik7XG5cdFx0dGhpcy5sYXN0WCA9IHRyYW5zZm9ybS54O1xuXHRcdHRoaXMubGFzdFkgPSB0cmFuc2Zvcm0ueTtcblx0XHR0aGlzLmxhc3RaID0gdHJhbnNmb3JtLno7XG5cdFx0aWYgKHJlYWRSb3RhdGlvbikgdGhpcy5sYXN0Um90YXRpb24gPSB0cmFuc2Zvcm0ucm90YXRpb247XG5cdFx0dGhpcy5oYXNMYXN0VHJhbnNmb3JtID0gdHJ1ZTtcblx0fVxuXG5cdC8qKiBSZXNldHMgdGhlIHByZXZpb3VzIHJvdGF0aW9uIHVzZWQgdG8gY2FsY3VsYXRlIGluaGVyaXRlZCByb3RhdGlvbi4gKi9cblx0cmVzZXRSb3RhdGlvbiAoKTogdm9pZCB7XG5cdFx0Y29uc3QgdHJhbnNmb3JtID0gdGhpcy5jdXJyZW50VHJhbnNmb3JtO1xuXHRcdHRoaXMuYWRhcHRlci5yZWFkVHJhbnNmb3JtKHRyYW5zZm9ybSwgdHJ1ZSk7XG5cdFx0dGhpcy5sYXN0Um90YXRpb24gPSB0cmFuc2Zvcm0ucm90YXRpb247XG5cdFx0aWYgKCF0aGlzLmhhc0xhc3RUcmFuc2Zvcm0pIHtcblx0XHRcdHRoaXMubGFzdFggPSB0cmFuc2Zvcm0ueDtcblx0XHRcdHRoaXMubGFzdFkgPSB0cmFuc2Zvcm0ueTtcblx0XHRcdHRoaXMubGFzdFogPSB0cmFuc2Zvcm0uejtcblx0XHR9XG5cdFx0dGhpcy5oYXNMYXN0VHJhbnNmb3JtID0gdHJ1ZTtcblx0fVxuXG5cdC8qKiBSZXNldHMgYm90aCBwcmV2aW91cyBwb3NpdGlvbiBhbmQgcHJldmlvdXMgcm90YXRpb24uICovXG5cdHJlc2V0VHJhbnNmb3JtICgpOiB2b2lkIHtcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07XG5cdFx0dGhpcy5hZGFwdGVyLnJlYWRUcmFuc2Zvcm0odHJhbnNmb3JtLCB0cnVlKTtcblx0XHR0aGlzLnNldExhc3RUcmFuc2Zvcm0odHJhbnNmb3JtLngsIHRyYW5zZm9ybS55LCB0cmFuc2Zvcm0ueiwgdHJhbnNmb3JtLnJvdGF0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBcHBsaWVzIGhvc3Qgb2JqZWN0IHRyYW5zZm9ybSBtb3ZlbWVudCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGUgc2tlbGV0b24ncyBwaHlzaWNzIGNvbnN0cmFpbnRzLlxuXHQgKlxuXHQgKiBUaGUgZmlyc3QgY2FsbCByZWNvcmRzIHRoZSBjdXJyZW50IHRyYW5zZm9ybSBhcyB0aGUgYmFzZWxpbmUgYW5kIGRvZXMgbm90IGFwcGx5IG1vdmVtZW50LlxuXHQgKi9cblx0YXBwbHlUcmFuc2Zvcm1Nb3ZlbWVudCAoKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5oZXJpdFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWCAhPT0gMCB8fCB0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JZICE9PSAwO1xuXHRcdGNvbnN0IGluaGVyaXRSb3RhdGlvbiA9IHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3RvciAhPT0gMDtcblx0XHRpZiAoIWluaGVyaXRQb3NpdGlvbiAmJiAhaW5oZXJpdFJvdGF0aW9uKSByZXR1cm47XG5cblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLmN1cnJlbnRUcmFuc2Zvcm07XG5cdFx0dGhpcy5hZGFwdGVyLnJlYWRUcmFuc2Zvcm0odHJhbnNmb3JtLCBpbmhlcml0Um90YXRpb24pO1xuXHRcdGNvbnN0IHsgeCwgeSwgeiB9ID0gdHJhbnNmb3JtO1xuXHRcdGNvbnN0IGN1cnJlbnRSb3RhdGlvbiA9IGluaGVyaXRSb3RhdGlvbiA/IHRyYW5zZm9ybS5yb3RhdGlvbiA6IHRoaXMubGFzdFJvdGF0aW9uO1xuXHRcdGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IHggIT09IHRoaXMubGFzdFggfHwgeSAhPT0gdGhpcy5sYXN0WSB8fCB6ICE9PSB0aGlzLmxhc3RaO1xuXG5cdFx0aWYgKHRoaXMuaGFzTGFzdFRyYW5zZm9ybSkge1xuXHRcdFx0aWYgKCFwb3NpdGlvbkNoYW5nZWQgJiYgY3VycmVudFJvdGF0aW9uID09PSB0aGlzLmxhc3RSb3RhdGlvbikgcmV0dXJuO1xuXHRcdFx0aWYgKGluaGVyaXRQb3NpdGlvbiAmJiBwb3NpdGlvbkNoYW5nZWQpIHRoaXMuYXBwbHlQb3NpdGlvbk1vdmVtZW50KHgsIHksIHopO1xuXHRcdFx0aWYgKGluaGVyaXRSb3RhdGlvbiAmJiBjdXJyZW50Um90YXRpb24gIT09IHRoaXMubGFzdFJvdGF0aW9uKSB0aGlzLmFwcGx5Um90YXRpb25Nb3ZlbWVudChjdXJyZW50Um90YXRpb24pO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0TGFzdFRyYW5zZm9ybSh4LCB5LCB6LCBjdXJyZW50Um90YXRpb24pO1xuXHR9XG5cblx0cHJpdmF0ZSBhcHBseVBvc2l0aW9uTW92ZW1lbnQgKGN1cnJlbnRYOiBudW1iZXIsIGN1cnJlbnRZOiBudW1iZXIsIGN1cnJlbnRaOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBjdXJyZW50UG9zaXRpb24gPSB0aGlzLmN1cnJlbnRQb3NpdGlvbjtcblx0XHRjdXJyZW50UG9zaXRpb24ueCA9IGN1cnJlbnRYO1xuXHRcdGN1cnJlbnRQb3NpdGlvbi55ID0gY3VycmVudFk7XG5cdFx0Y3VycmVudFBvc2l0aW9uLnogPSBjdXJyZW50Wjtcblx0XHR0aGlzLmFkYXB0ZXIud29ybGRUb1NrZWxldG9uKGN1cnJlbnRQb3NpdGlvbik7XG5cblx0XHRjb25zdCBsYXN0UG9zaXRpb24gPSB0aGlzLmxhc3RQb3NpdGlvbjtcblx0XHRsYXN0UG9zaXRpb24ueCA9IHRoaXMubGFzdFg7XG5cdFx0bGFzdFBvc2l0aW9uLnkgPSB0aGlzLmxhc3RZO1xuXHRcdGxhc3RQb3NpdGlvbi56ID0gdGhpcy5sYXN0Wjtcblx0XHR0aGlzLmFkYXB0ZXIud29ybGRUb1NrZWxldG9uKGxhc3RQb3NpdGlvbik7XG5cblx0XHR0aGlzLnNrZWxldG9uLnBoeXNpY3NUcmFuc2xhdGUoXG5cdFx0XHQoY3VycmVudFBvc2l0aW9uLnggLSBsYXN0UG9zaXRpb24ueCkgKiB0aGlzLnBvc2l0aW9uSW5oZXJpdGFuY2VGYWN0b3JYLFxuXHRcdFx0KGN1cnJlbnRQb3NpdGlvbi55IC0gbGFzdFBvc2l0aW9uLnkpICogdGhpcy5wb3NpdGlvbkluaGVyaXRhbmNlRmFjdG9yWVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFwcGx5Um90YXRpb25Nb3ZlbWVudCAoY3VycmVudFJvdGF0aW9uOiBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCByb3RhdGlvbkZhY3RvciA9IHRoaXMucm90YXRpb25Jbmhlcml0YW5jZUZhY3Rvcjtcblx0XHRpZiAocm90YXRpb25GYWN0b3IgPT09IDApIHJldHVybjtcblx0XHR0aGlzLnNrZWxldG9uLnBoeXNpY3NSb3RhdGUoMCwgMCwgdGhpcy5nZXRSb3RhdGlvbkRlbHRhKGN1cnJlbnRSb3RhdGlvbiwgdGhpcy5sYXN0Um90YXRpb24pICogcm90YXRpb25GYWN0b3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXRMYXN0VHJhbnNmb3JtICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCByb3RhdGlvbjogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5sYXN0WCA9IHg7XG5cdFx0dGhpcy5sYXN0WSA9IHk7XG5cdFx0dGhpcy5sYXN0WiA9IHo7XG5cdFx0dGhpcy5sYXN0Um90YXRpb24gPSByb3RhdGlvbjtcblx0XHR0aGlzLmhhc0xhc3RUcmFuc2Zvcm0gPSB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSb3RhdGlvbkRlbHRhIChjdXJyZW50OiBudW1iZXIsIHByZXZpb3VzOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdGxldCBkZWx0YSA9IGN1cnJlbnQgLSBwcmV2aW91cztcblx0XHRkZWx0YSA9IChkZWx0YSArIDE4MCkgJSAzNjAgLSAxODA7XG5cdFx0cmV0dXJuIGRlbHRhIDwgLTE4MCA/IGRlbHRhICsgMzYwIDogZGVsdGE7XG5cdH1cbn1cbiJdfQ==