math 0.0.3 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/API.md +1605 -0
  2. package/LICENSE +21 -0
  3. package/README.md +197 -0
  4. package/dist/color/color.js +136 -0
  5. package/dist/color/color.js.map +1 -0
  6. package/dist/color/colorspace.js +43 -0
  7. package/dist/color/colorspace.js.map +1 -0
  8. package/dist/color/hsl.js +123 -0
  9. package/dist/color/hsl.js.map +1 -0
  10. package/dist/color/index.js +7 -0
  11. package/dist/color/index.js.map +1 -0
  12. package/dist/color/parse.js +276 -0
  13. package/dist/color/parse.js.map +1 -0
  14. package/dist/core/angle.js +43 -0
  15. package/dist/core/angle.js.map +1 -0
  16. package/dist/core/euler.js +212 -0
  17. package/dist/core/euler.js.map +1 -0
  18. package/dist/core/mat2.js +385 -0
  19. package/dist/core/mat2.js.map +1 -0
  20. package/dist/core/mat2d.js +422 -0
  21. package/dist/core/mat2d.js.map +1 -0
  22. package/dist/core/mat3.js +749 -0
  23. package/dist/core/mat3.js.map +1 -0
  24. package/dist/core/mat4.js +2197 -0
  25. package/dist/core/mat4.js.map +1 -0
  26. package/dist/core/polar.js +200 -0
  27. package/dist/core/polar.js.map +1 -0
  28. package/dist/core/quat.js +730 -0
  29. package/dist/core/quat.js.map +1 -0
  30. package/dist/core/quat2.js +883 -0
  31. package/dist/core/quat2.js.map +1 -0
  32. package/dist/core/scalar.js +112 -0
  33. package/dist/core/scalar.js.map +1 -0
  34. package/dist/core/spherical.js +248 -0
  35. package/dist/core/spherical.js.map +1 -0
  36. package/dist/core/vec2.js +597 -0
  37. package/dist/core/vec2.js.map +1 -0
  38. package/dist/core/vec3.js +916 -0
  39. package/dist/core/vec3.js.map +1 -0
  40. package/dist/core/vec4.js +573 -0
  41. package/dist/core/vec4.js.map +1 -0
  42. package/dist/geometry/circumcircle.js +39 -0
  43. package/dist/geometry/circumcircle.js.map +1 -0
  44. package/dist/geometry/index.js +6 -0
  45. package/dist/geometry/index.js.map +1 -0
  46. package/dist/geometry/polygon2-decompose.js +411 -0
  47. package/dist/geometry/polygon2-decompose.js.map +1 -0
  48. package/dist/geometry/polygon2-triangulate.js +222 -0
  49. package/dist/geometry/polygon2-triangulate.js.map +1 -0
  50. package/dist/geometry/quickhull2.js +123 -0
  51. package/dist/geometry/quickhull2.js.map +1 -0
  52. package/dist/geometry/quickhull3.js +605 -0
  53. package/dist/geometry/quickhull3.js.map +1 -0
  54. package/dist/ik/fabrik2.js +675 -0
  55. package/dist/ik/fabrik2.js.map +1 -0
  56. package/dist/ik/fabrik3.js +912 -0
  57. package/dist/ik/fabrik3.js.map +1 -0
  58. package/dist/ik/index.js +5 -0
  59. package/dist/ik/index.js.map +1 -0
  60. package/dist/index.js +27 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/noise/fractal.js +185 -0
  63. package/dist/noise/fractal.js.map +1 -0
  64. package/dist/noise/index.js +16 -0
  65. package/dist/noise/index.js.map +1 -0
  66. package/dist/noise/perlin2d.js +50 -0
  67. package/dist/noise/perlin2d.js.map +1 -0
  68. package/dist/noise/perlin3d.js +72 -0
  69. package/dist/noise/perlin3d.js.map +1 -0
  70. package/dist/noise/permutation.js +120 -0
  71. package/dist/noise/permutation.js.map +1 -0
  72. package/dist/noise/simplex2d.js +84 -0
  73. package/dist/noise/simplex2d.js.map +1 -0
  74. package/dist/noise/simplex3d.js +147 -0
  75. package/dist/noise/simplex3d.js.map +1 -0
  76. package/dist/noise/simplex4d.js +149 -0
  77. package/dist/noise/simplex4d.js.map +1 -0
  78. package/dist/noise/worley2d.js +50 -0
  79. package/dist/noise/worley2d.js.map +1 -0
  80. package/dist/noise/worley3d.js +61 -0
  81. package/dist/noise/worley3d.js.map +1 -0
  82. package/dist/random/index.js +9 -0
  83. package/dist/random/index.js.map +1 -0
  84. package/dist/random/isaac32.js +164 -0
  85. package/dist/random/isaac32.js.map +1 -0
  86. package/dist/random/isaac64.js +215 -0
  87. package/dist/random/isaac64.js.map +1 -0
  88. package/dist/random/mulberry32.js +48 -0
  89. package/dist/random/mulberry32.js.map +1 -0
  90. package/dist/random/random.js +120 -0
  91. package/dist/random/random.js.map +1 -0
  92. package/dist/shapes/box2.js +300 -0
  93. package/dist/shapes/box2.js.map +1 -0
  94. package/dist/shapes/box3.js +550 -0
  95. package/dist/shapes/box3.js.map +1 -0
  96. package/dist/shapes/circle.js +6 -0
  97. package/dist/shapes/circle.js.map +1 -0
  98. package/dist/shapes/frustum.js +662 -0
  99. package/dist/shapes/frustum.js.map +1 -0
  100. package/dist/shapes/index.js +25 -0
  101. package/dist/shapes/index.js.map +1 -0
  102. package/dist/shapes/obb3.js +557 -0
  103. package/dist/shapes/obb3.js.map +1 -0
  104. package/dist/shapes/plane3.js +267 -0
  105. package/dist/shapes/plane3.js.map +1 -0
  106. package/dist/shapes/polygon2.js +451 -0
  107. package/dist/shapes/polygon2.js.map +1 -0
  108. package/dist/shapes/raycast3.js +164 -0
  109. package/dist/shapes/raycast3.js.map +1 -0
  110. package/dist/shapes/segment2.js +82 -0
  111. package/dist/shapes/segment2.js.map +1 -0
  112. package/dist/shapes/sphere.js +23 -0
  113. package/dist/shapes/sphere.js.map +1 -0
  114. package/dist/shapes/triangle2.js +79 -0
  115. package/dist/shapes/triangle2.js.map +1 -0
  116. package/dist/shapes/triangle3.js +60 -0
  117. package/dist/shapes/triangle3.js.map +1 -0
  118. package/dist/src/color/color.d.ts +50 -0
  119. package/dist/src/color/colorspace.d.ts +15 -0
  120. package/dist/src/color/hsl.d.ts +28 -0
  121. package/dist/src/color/index.d.ts +5 -0
  122. package/dist/src/color/parse.d.ts +15 -0
  123. package/dist/src/core/angle.d.ts +29 -0
  124. package/dist/src/core/arrays.d.ts +4 -0
  125. package/dist/src/core/euler.d.ts +78 -0
  126. package/dist/src/core/index.d.ts +27 -0
  127. package/dist/src/core/mat2.d.ts +217 -0
  128. package/dist/src/core/mat2d.d.ts +218 -0
  129. package/dist/src/core/mat3.d.ts +295 -0
  130. package/dist/src/core/mat4.d.ts +667 -0
  131. package/dist/src/core/polar.d.ts +151 -0
  132. package/dist/src/core/quat.d.ts +370 -0
  133. package/dist/src/core/quat2.d.ts +344 -0
  134. package/dist/src/core/scalar.d.ts +75 -0
  135. package/dist/src/core/spherical.d.ts +165 -0
  136. package/dist/src/core/vec2.d.ts +403 -0
  137. package/dist/src/core/vec3.d.ts +493 -0
  138. package/dist/src/core/vec4.d.ts +336 -0
  139. package/dist/src/geometry/circumcircle.d.ts +9 -0
  140. package/dist/src/geometry/index.d.ts +5 -0
  141. package/dist/src/geometry/polygon2-decompose.d.ts +25 -0
  142. package/dist/src/geometry/polygon2-triangulate.d.ts +15 -0
  143. package/dist/src/geometry/quickhull2.d.ts +10 -0
  144. package/dist/src/geometry/quickhull3.d.ts +27 -0
  145. package/dist/src/ik/fabrik2.d.ts +314 -0
  146. package/dist/src/ik/fabrik3.d.ts +371 -0
  147. package/dist/src/ik/index.d.ts +2 -0
  148. package/dist/src/index.d.ts +1 -0
  149. package/dist/src/noise/fractal.d.ts +95 -0
  150. package/dist/src/noise/index.d.ts +9 -0
  151. package/dist/src/noise/perlin2d.d.ts +19 -0
  152. package/dist/src/noise/perlin3d.d.ts +20 -0
  153. package/dist/src/noise/permutation.d.ts +22 -0
  154. package/dist/src/noise/simplex2d.d.ts +19 -0
  155. package/dist/src/noise/simplex3d.d.ts +20 -0
  156. package/dist/src/noise/simplex4d.d.ts +24 -0
  157. package/dist/src/noise/worley2d.d.ts +22 -0
  158. package/dist/src/noise/worley3d.d.ts +23 -0
  159. package/dist/src/random/index.d.ts +8 -0
  160. package/dist/src/random/isaac32.d.ts +62 -0
  161. package/dist/src/random/isaac64.d.ts +75 -0
  162. package/dist/src/random/mulberry32.d.ts +43 -0
  163. package/dist/src/random/random.d.ts +67 -0
  164. package/dist/src/shapes/box2.d.ts +174 -0
  165. package/dist/src/shapes/box3.d.ts +213 -0
  166. package/dist/src/shapes/circle.d.ts +7 -0
  167. package/dist/src/shapes/frustum.d.ts +147 -0
  168. package/dist/src/shapes/index.d.ts +20 -0
  169. package/dist/src/shapes/obb3.d.ts +105 -0
  170. package/dist/src/shapes/plane3.d.ts +130 -0
  171. package/dist/src/shapes/polygon2.d.ts +155 -0
  172. package/dist/src/shapes/raycast3.d.ts +42 -0
  173. package/dist/src/shapes/segment2.d.ts +34 -0
  174. package/dist/src/shapes/sphere.d.ts +19 -0
  175. package/dist/src/shapes/triangle2.d.ts +53 -0
  176. package/dist/src/shapes/triangle3.d.ts +29 -0
  177. package/dist/src/time/easing.d.ts +21 -0
  178. package/dist/src/time/index.d.ts +6 -0
  179. package/dist/src/time/spring-core.d.ts +15 -0
  180. package/dist/src/time/spring.d.ts +36 -0
  181. package/dist/src/time/spring2.d.ts +11 -0
  182. package/dist/src/time/spring3.d.ts +11 -0
  183. package/dist/src/time/spring4.d.ts +11 -0
  184. package/dist/time/easing.js +24 -0
  185. package/dist/time/easing.js.map +1 -0
  186. package/dist/time/index.js +11 -0
  187. package/dist/time/index.js.map +1 -0
  188. package/dist/time/spring-core.js +48 -0
  189. package/dist/time/spring-core.js.map +1 -0
  190. package/dist/time/spring.js +62 -0
  191. package/dist/time/spring.js.map +1 -0
  192. package/dist/time/spring2.js +31 -0
  193. package/dist/time/spring2.js.map +1 -0
  194. package/dist/time/spring3.js +32 -0
  195. package/dist/time/spring3.js.map +1 -0
  196. package/dist/time/spring4.js +32 -0
  197. package/dist/time/spring4.js.map +1 -0
  198. package/package.json +90 -16
  199. package/skills/math/SKILL.md +140 -0
  200. package/AUTHORS +0 -1
  201. package/Cakefile +0 -28
  202. package/math.coffee +0 -112
  203. package/math.js +0 -141
@@ -0,0 +1,276 @@
1
+ import { srgbToLinear } from './colorspace.js';
2
+
3
+ const CSS_COLORS = {
4
+ aliceblue: 0xf0f8ff,
5
+ antiquewhite: 0xfaebd7,
6
+ aqua: 0x00ffff,
7
+ aquamarine: 0x7fffd4,
8
+ azure: 0xf0ffff,
9
+ beige: 0xf5f5dc,
10
+ bisque: 0xffe4c4,
11
+ black: 0x000000,
12
+ blanchedalmond: 0xffebcd,
13
+ blue: 0x0000ff,
14
+ blueviolet: 0x8a2be2,
15
+ brown: 0xa52a2a,
16
+ burlywood: 0xdeb887,
17
+ cadetblue: 0x5f9ea0,
18
+ chartreuse: 0x7fff00,
19
+ chocolate: 0xd2691e,
20
+ coral: 0xff7f50,
21
+ cornflowerblue: 0x6495ed,
22
+ cornsilk: 0xfff8dc,
23
+ crimson: 0xdc143c,
24
+ cyan: 0x00ffff,
25
+ darkblue: 0x00008b,
26
+ darkcyan: 0x008b8b,
27
+ darkgoldenrod: 0xb8860b,
28
+ darkgray: 0xa9a9a9,
29
+ darkgreen: 0x006400,
30
+ darkgrey: 0xa9a9a9,
31
+ darkkhaki: 0xbdb76b,
32
+ darkmagenta: 0x8b008b,
33
+ darkolivegreen: 0x556b2f,
34
+ darkorange: 0xff8c00,
35
+ darkorchid: 0x9932cc,
36
+ darkred: 0x8b0000,
37
+ darksalmon: 0xe9967a,
38
+ darkseagreen: 0x8fbc8f,
39
+ darkslateblue: 0x483d8b,
40
+ darkslategray: 0x2f4f4f,
41
+ darkslategrey: 0x2f4f4f,
42
+ darkturquoise: 0x00ced1,
43
+ darkviolet: 0x9400d3,
44
+ deeppink: 0xff1493,
45
+ deepskyblue: 0x00bfff,
46
+ dimgray: 0x696969,
47
+ dimgrey: 0x696969,
48
+ dodgerblue: 0x1e90ff,
49
+ firebrick: 0xb22222,
50
+ floralwhite: 0xfffaf0,
51
+ forestgreen: 0x228b22,
52
+ fuchsia: 0xff00ff,
53
+ gainsboro: 0xdcdcdc,
54
+ ghostwhite: 0xf8f8ff,
55
+ gold: 0xffd700,
56
+ goldenrod: 0xdaa520,
57
+ gray: 0x808080,
58
+ green: 0x008000,
59
+ greenyellow: 0xadff2f,
60
+ grey: 0x808080,
61
+ honeydew: 0xf0fff0,
62
+ hotpink: 0xff69b4,
63
+ indianred: 0xcd5c5c,
64
+ indigo: 0x4b0082,
65
+ ivory: 0xfffff0,
66
+ khaki: 0xf0e68c,
67
+ lavender: 0xe6e6fa,
68
+ lavenderblush: 0xfff0f5,
69
+ lawngreen: 0x7cfc00,
70
+ lemonchiffon: 0xfffacd,
71
+ lightblue: 0xadd8e6,
72
+ lightcoral: 0xf08080,
73
+ lightcyan: 0xe0ffff,
74
+ lightgoldenrodyellow: 0xfafad2,
75
+ lightgray: 0xd3d3d3,
76
+ lightgreen: 0x90ee90,
77
+ lightgrey: 0xd3d3d3,
78
+ lightpink: 0xffb6c1,
79
+ lightsalmon: 0xffa07a,
80
+ lightseagreen: 0x20b2aa,
81
+ lightskyblue: 0x87cefa,
82
+ lightslategray: 0x778899,
83
+ lightslategrey: 0x778899,
84
+ lightsteelblue: 0xb0c4de,
85
+ lightyellow: 0xffffe0,
86
+ lime: 0x00ff00,
87
+ limegreen: 0x32cd32,
88
+ linen: 0xfaf0e6,
89
+ magenta: 0xff00ff,
90
+ maroon: 0x800000,
91
+ mediumaquamarine: 0x66cdaa,
92
+ mediumblue: 0x0000cd,
93
+ mediumorchid: 0xba55d3,
94
+ mediumpurple: 0x9370db,
95
+ mediumseagreen: 0x3cb371,
96
+ mediumslateblue: 0x7b68ee,
97
+ mediumspringgreen: 0x00fa9a,
98
+ mediumturquoise: 0x48d1cc,
99
+ mediumvioletred: 0xc71585,
100
+ midnightblue: 0x191970,
101
+ mintcream: 0xf5fffa,
102
+ mistyrose: 0xffe4e1,
103
+ moccasin: 0xffe4b5,
104
+ navajowhite: 0xffdead,
105
+ navy: 0x000080,
106
+ oldlace: 0xfdf5e6,
107
+ olive: 0x808000,
108
+ olivedrab: 0x6b8e23,
109
+ orange: 0xffa500,
110
+ orangered: 0xff4500,
111
+ orchid: 0xda70d6,
112
+ palegoldenrod: 0xeee8aa,
113
+ palegreen: 0x98fb98,
114
+ paleturquoise: 0xafeeee,
115
+ palevioletred: 0xdb7093,
116
+ papayawhip: 0xffefd5,
117
+ peachpuff: 0xffdab9,
118
+ peru: 0xcd853f,
119
+ pink: 0xffc0cb,
120
+ plum: 0xdda0dd,
121
+ powderblue: 0xb0e0e6,
122
+ purple: 0x800080,
123
+ rebeccapurple: 0x663399,
124
+ red: 0xff0000,
125
+ rosybrown: 0xbc8f8f,
126
+ royalblue: 0x4169e1,
127
+ saddlebrown: 0x8b4513,
128
+ salmon: 0xfa8072,
129
+ sandybrown: 0xf4a460,
130
+ seagreen: 0x2e8b57,
131
+ seashell: 0xfff5ee,
132
+ sienna: 0xa0522d,
133
+ silver: 0xc0c0c0,
134
+ skyblue: 0x87ceeb,
135
+ slateblue: 0x6a5acd,
136
+ slategray: 0x737373,
137
+ slategrey: 0x737373,
138
+ snow: 0xfffafa,
139
+ springgreen: 0x00ff7f,
140
+ steelblue: 0x4682b4,
141
+ tan: 0xd2b48c,
142
+ teal: 0x008080,
143
+ thistle: 0xd8bfd8,
144
+ tomato: 0xff6347,
145
+ turquoise: 0x40e0d0,
146
+ violet: 0xee82ee,
147
+ wheat: 0xf5deb3,
148
+ white: 0xffffff,
149
+ whitesmoke: 0xf5f5f5,
150
+ yellow: 0xffff00,
151
+ yellowgreen: 0x9acd32,
152
+ };
153
+ /**
154
+ * Parse any supported color input and write the result into `out`. Returns `out`.
155
+ *
156
+ * Supported inputs:
157
+ * - CSS hex strings: '#f00', '#ff0000'
158
+ * - CSS rgb(): 'rgb(255, 0, 0)', 'rgb(100%, 0%, 0%)'
159
+ * - CSS hsl(): 'hsl(0, 100%, 50%)'
160
+ * - 0xRRGGBB integers: 0xff0000 (sRGB gamma)
161
+ * - Named CSS colors: 'red', 'lime', 'deepskyblue', ...
162
+ * - [r, g, b] array: treated as already-linear [0, 1]
163
+ */
164
+ function setFromColorInput(out, input) {
165
+ const parsed = parse(input);
166
+ if (parsed === null)
167
+ return out;
168
+ out[0] = parsed[0];
169
+ out[1] = parsed[1];
170
+ out[2] = parsed[2];
171
+ return out;
172
+ }
173
+ /** Parse any supported color input into a new Color, or null if unrecognised. */
174
+ function fromColorInput(input) {
175
+ return parse(input);
176
+ }
177
+ function parse(input) {
178
+ // [r, g, b] array, treated as already-linear
179
+ if (Array.isArray(input)) {
180
+ return [input[0] ?? 0, input[1] ?? 0, input[2] ?? 0];
181
+ }
182
+ // integer 0xRRGGBB (sRGB gamma)
183
+ if (typeof input === 'number') {
184
+ const r = ((input >> 16) & 0xff) / 255;
185
+ const g = ((input >> 8) & 0xff) / 255;
186
+ const b = (input & 0xff) / 255;
187
+ return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];
188
+ }
189
+ // string forms
190
+ const s = input.trim().toLowerCase();
191
+ if (/^#[0-9a-f]{3}$/i.test(s))
192
+ return parseHex3(s);
193
+ if (/^#[0-9a-f]{6}$/i.test(s))
194
+ return parseHex6(s);
195
+ if (s.startsWith('rgb(')) {
196
+ const result = parseRgbString(s);
197
+ if (result)
198
+ return result;
199
+ }
200
+ if (s.startsWith('hsl(')) {
201
+ const result = parseHslString(s);
202
+ if (result)
203
+ return result;
204
+ }
205
+ const hex = CSS_COLORS[s];
206
+ if (hex !== undefined) {
207
+ return parseHex6(`#${hex.toString(16).padStart(6, '0')}`);
208
+ }
209
+ console.warn(`[math] color: unrecognised color input: "${input}"`);
210
+ return null;
211
+ }
212
+ function parseHex3(hex) {
213
+ const r = parseInt(hex[1] + hex[1], 16) / 255;
214
+ const g = parseInt(hex[2] + hex[2], 16) / 255;
215
+ const b = parseInt(hex[3] + hex[3], 16) / 255;
216
+ return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];
217
+ }
218
+ function parseHex6(hex) {
219
+ const r = parseInt(hex.slice(1, 3), 16) / 255;
220
+ const g = parseInt(hex.slice(3, 5), 16) / 255;
221
+ const b = parseInt(hex.slice(5, 7), 16) / 255;
222
+ return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];
223
+ }
224
+ function parseRgbString(str) {
225
+ const m = str.match(/^rgb\(\s*([^,]+),\s*([^,]+),\s*([^)]+)\)$/i);
226
+ if (!m)
227
+ return null;
228
+ const parseChannel = (s) => {
229
+ s = s.trim();
230
+ if (s.endsWith('%'))
231
+ return parseFloat(s) / 100;
232
+ return parseFloat(s) / 255;
233
+ };
234
+ return [srgbToLinear(parseChannel(m[1])), srgbToLinear(parseChannel(m[2])), srgbToLinear(parseChannel(m[3]))];
235
+ }
236
+ function parseHslString(str) {
237
+ const m = str.match(/^hsl\(\s*([^,]+),\s*([^,]+),\s*([^)]+)\)$/i);
238
+ if (!m)
239
+ return null;
240
+ const h = parseFloat(m[1]) / 360;
241
+ const s = parseFloat(m[2]) / 100;
242
+ const l = parseFloat(m[3]) / 100;
243
+ return hslToLinear(h, s, l);
244
+ }
245
+ function hslToLinear(h, s, l) {
246
+ let r;
247
+ let g;
248
+ let b;
249
+ if (s === 0) {
250
+ r = g = b = l;
251
+ }
252
+ else {
253
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
254
+ const p = 2 * l - q;
255
+ r = hue2rgb(p, q, h + 1 / 3);
256
+ g = hue2rgb(p, q, h);
257
+ b = hue2rgb(p, q, h - 1 / 3);
258
+ }
259
+ return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];
260
+ }
261
+ function hue2rgb(p, q, t) {
262
+ if (t < 0)
263
+ t += 1;
264
+ if (t > 1)
265
+ t -= 1;
266
+ if (t < 1 / 6)
267
+ return p + (q - p) * 6 * t;
268
+ if (t < 1 / 2)
269
+ return q;
270
+ if (t < 2 / 3)
271
+ return p + (q - p) * (2 / 3 - t) * 6;
272
+ return p;
273
+ }
274
+
275
+ export { fromColorInput, setFromColorInput };
276
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sources":["../../src/color/parse.ts"],"sourcesContent":["import type { Color, ColorInput } from './color';\nimport { srgbToLinear } from './colorspace';\n\nconst CSS_COLORS: Record<string, number> = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x737373,\n slategrey: 0x737373,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32,\n};\n\n/**\n * Parse any supported color input and write the result into `out`. Returns `out`.\n *\n * Supported inputs:\n * - CSS hex strings: '#f00', '#ff0000'\n * - CSS rgb(): 'rgb(255, 0, 0)', 'rgb(100%, 0%, 0%)'\n * - CSS hsl(): 'hsl(0, 100%, 50%)'\n * - 0xRRGGBB integers: 0xff0000 (sRGB gamma)\n * - Named CSS colors: 'red', 'lime', 'deepskyblue', ...\n * - [r, g, b] array: treated as already-linear [0, 1]\n */\nexport function setFromColorInput(out: Color, input: ColorInput): Color {\n const parsed = parse(input);\n if (parsed === null) return out;\n out[0] = parsed[0];\n out[1] = parsed[1];\n out[2] = parsed[2];\n return out;\n}\n\n/** Parse any supported color input into a new Color, or null if unrecognised. */\nexport function fromColorInput(input: ColorInput): Color | null {\n return parse(input);\n}\n\nfunction parse(input: ColorInput): Color | null {\n // [r, g, b] array, treated as already-linear\n if (Array.isArray(input)) {\n return [input[0] ?? 0, input[1] ?? 0, input[2] ?? 0];\n }\n\n // integer 0xRRGGBB (sRGB gamma)\n if (typeof input === 'number') {\n const r = ((input >> 16) & 0xff) / 255;\n const g = ((input >> 8) & 0xff) / 255;\n const b = (input & 0xff) / 255;\n return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];\n }\n\n // string forms\n const s = input.trim().toLowerCase();\n\n if (/^#[0-9a-f]{3}$/i.test(s)) return parseHex3(s);\n if (/^#[0-9a-f]{6}$/i.test(s)) return parseHex6(s);\n\n if (s.startsWith('rgb(')) {\n const result = parseRgbString(s);\n if (result) return result;\n }\n\n if (s.startsWith('hsl(')) {\n const result = parseHslString(s);\n if (result) return result;\n }\n\n const hex = CSS_COLORS[s];\n if (hex !== undefined) {\n return parseHex6(`#${hex.toString(16).padStart(6, '0')}`);\n }\n\n console.warn(`[math] color: unrecognised color input: \"${input}\"`);\n return null;\n}\n\nfunction parseHex3(hex: string): Color {\n const r = parseInt(hex[1] + hex[1], 16) / 255;\n const g = parseInt(hex[2] + hex[2], 16) / 255;\n const b = parseInt(hex[3] + hex[3], 16) / 255;\n return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];\n}\n\nfunction parseHex6(hex: string): Color {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];\n}\n\nfunction parseRgbString(str: string): Color | null {\n const m = str.match(/^rgb\\(\\s*([^,]+),\\s*([^,]+),\\s*([^)]+)\\)$/i);\n if (!m) return null;\n const parseChannel = (s: string): number => {\n s = s.trim();\n if (s.endsWith('%')) return parseFloat(s) / 100;\n return parseFloat(s) / 255;\n };\n return [srgbToLinear(parseChannel(m[1])), srgbToLinear(parseChannel(m[2])), srgbToLinear(parseChannel(m[3]))];\n}\n\nfunction parseHslString(str: string): Color | null {\n const m = str.match(/^hsl\\(\\s*([^,]+),\\s*([^,]+),\\s*([^)]+)\\)$/i);\n if (!m) return null;\n const h = parseFloat(m[1]) / 360;\n const s = parseFloat(m[2]) / 100;\n const l = parseFloat(m[3]) / 100;\n return hslToLinear(h, s, l);\n}\n\nfunction hslToLinear(h: number, s: number, l: number): Color {\n let r: number;\n let g: number;\n let b: number;\n if (s === 0) {\n r = g = b = l;\n } else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [srgbToLinear(r), srgbToLinear(g), srgbToLinear(b)];\n}\n\nfunction hue2rgb(p: number, q: number, t: number): number {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,UAAU,GAA2B;AACvC,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,oBAAoB,EAAE,QAAQ;AAC9B,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,gBAAgB,EAAE,QAAQ;AAC1B,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,cAAc,EAAE,QAAQ;AACxB,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,iBAAiB,EAAE,QAAQ;AAC3B,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,eAAe,EAAE,QAAQ;AACzB,IAAA,YAAY,EAAE,QAAQ;AACtB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,aAAa,EAAE,QAAQ;AACvB,IAAA,GAAG,EAAE,QAAQ;AACb,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,GAAG,EAAE,QAAQ;AACb,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,SAAS,EAAE,QAAQ;AACnB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,UAAU,EAAE,QAAQ;AACpB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,WAAW,EAAE,QAAQ;CACxB;AAED;;;;;;;;;;AAUG;AACG,SAAU,iBAAiB,CAAC,GAAU,EAAE,KAAiB,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;IAC3B,IAAI,MAAM,KAAK,IAAI;AAAE,QAAA,OAAO,GAAG;IAC/B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAClB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAClB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAClB,IAAA,OAAO,GAAG;AACd;AAEA;AACM,SAAU,cAAc,CAAC,KAAiB,EAAA;AAC5C,IAAA,OAAO,KAAK,CAAC,KAAK,CAAC;AACvB;AAEA,SAAS,KAAK,CAAC,KAAiB,EAAA;;AAE5B,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD;;AAGA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC3B,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG;AACtC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG;QACrC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,GAAG;AAC9B,QAAA,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9D;;IAGA,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAEpC,IAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC,CAAC,CAAC;AAClD,IAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS,CAAC,CAAC,CAAC;AAElD,IAAA,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAM;IAC7B;AAEA,IAAA,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAM;IAC7B;AAEA,IAAA,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC;AACzB,IAAA,IAAI,GAAG,KAAK,SAAS,EAAE;AACnB,QAAA,OAAO,SAAS,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,CAAE,CAAC;IAC7D;AAEA,IAAA,OAAO,CAAC,IAAI,CAAC,4CAA4C,KAAK,CAAA,CAAA,CAAG,CAAC;AAClE,IAAA,OAAO,IAAI;AACf;AAEA,SAAS,SAAS,CAAC,GAAW,EAAA;AAC1B,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,SAAS,CAAC,GAAW,EAAA;AAC1B,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;AAC7C,IAAA,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,cAAc,CAAC,GAAW,EAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC;AACjE,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;AACnB,IAAA,MAAM,YAAY,GAAG,CAAC,CAAS,KAAY;AACvC,QAAA,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AACZ,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG;AAC/C,QAAA,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG;AAC9B,IAAA,CAAC;AACD,IAAA,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjH;AAEA,SAAS,cAAc,CAAC,GAAW,EAAA;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC;AACjE,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;IACnB,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;IAChC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;IAChC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;IAChC,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC/B;AAEA,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AAChD,IAAA,IAAI,CAAS;AACb,IAAA,IAAI,CAAS;AACb,IAAA,IAAI,CAAS;AACb,IAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACT,QAAA,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IACjB;SAAO;QACH,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACnB,QAAA,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACpB,QAAA,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC;AACA,IAAA,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAC9D;AAEA,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;IAC5C,IAAI,CAAC,GAAG,CAAC;QAAE,CAAC,IAAI,CAAC;IACjB,IAAI,CAAC,GAAG,CAAC;QAAE,CAAC,IAAI,CAAC;AACjB,IAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AACzC,IAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,CAAC;AACvB,IAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AACnD,IAAA,OAAO,CAAC;AACZ;;;;"}
@@ -0,0 +1,43 @@
1
+ const TAU = Math.PI * 2;
2
+ const DEGREES_TO_RADIANS = Math.PI / 180;
3
+ const RADIANS_TO_DEGREES = 180 / Math.PI;
4
+ /**
5
+ * Converts Degrees To Radians
6
+ *
7
+ * @param a Angle in Degrees
8
+ */
9
+ function degreesToRadians(degrees) {
10
+ return degrees * DEGREES_TO_RADIANS;
11
+ }
12
+ /**
13
+ * Converts Radians To Degrees
14
+ *
15
+ * @param a Angle in Radians
16
+ */
17
+ function radiansToDegrees(radians) {
18
+ return radians * RADIANS_TO_DEGREES;
19
+ }
20
+ /**
21
+ * Wraps an angle (in radians) into the range (-π, π].
22
+ *
23
+ * @param a the angle to wrap
24
+ * @returns the angle wrapped into (-π, π]
25
+ */
26
+ function wrapAngle(a) {
27
+ return a - TAU * Math.floor((a + Math.PI) / TAU);
28
+ }
29
+ /**
30
+ * Calculates the shortest signed difference between two angles (in radians).
31
+ *
32
+ * @param current the current angle
33
+ * @param target the target angle
34
+ * @returns the shortest signed difference in (-π, π]
35
+ */
36
+ function deltaAngle(current, target) {
37
+ const diff = target - current;
38
+ const delta = diff - TAU * Math.floor(diff / TAU);
39
+ return delta > Math.PI ? delta - TAU : delta;
40
+ }
41
+
42
+ export { DEGREES_TO_RADIANS, RADIANS_TO_DEGREES, degreesToRadians, deltaAngle, radiansToDegrees, wrapAngle };
43
+ //# sourceMappingURL=angle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angle.js","sources":["../../src/core/angle.ts"],"sourcesContent":["const TAU = Math.PI * 2;\n\nexport const DEGREES_TO_RADIANS = Math.PI / 180;\n\nexport const RADIANS_TO_DEGREES = 180 / Math.PI;\n\n/**\n * Converts Degrees To Radians\n *\n * @param a Angle in Degrees\n */\nexport function degreesToRadians(degrees: number): number {\n return degrees * DEGREES_TO_RADIANS;\n}\n\n/**\n * Converts Radians To Degrees\n *\n * @param a Angle in Radians\n */\nexport function radiansToDegrees(radians: number): number {\n return radians * RADIANS_TO_DEGREES;\n}\n\n/**\n * Wraps an angle (in radians) into the range (-π, π].\n *\n * @param a the angle to wrap\n * @returns the angle wrapped into (-π, π]\n */\nexport function wrapAngle(a: number): number {\n return a - TAU * Math.floor((a + Math.PI) / TAU);\n}\n\n/**\n * Calculates the shortest signed difference between two angles (in radians).\n *\n * @param current the current angle\n * @param target the target angle\n * @returns the shortest signed difference in (-π, π]\n */\nexport function deltaAngle(current: number, target: number): number {\n const diff = target - current;\n const delta = diff - TAU * Math.floor(diff / TAU);\n return delta > Math.PI ? delta - TAU : delta;\n}\n"],"names":[],"mappings":"AAAA,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;MAEV,kBAAkB,GAAG,IAAI,CAAC,EAAE,GAAG;MAE/B,kBAAkB,GAAG,GAAG,GAAG,IAAI,CAAC;AAE7C;;;;AAIG;AACG,SAAU,gBAAgB,CAAC,OAAe,EAAA;IAC5C,OAAO,OAAO,GAAG,kBAAkB;AACvC;AAEA;;;;AAIG;AACG,SAAU,gBAAgB,CAAC,OAAe,EAAA;IAC5C,OAAO,OAAO,GAAG,kBAAkB;AACvC;AAEA;;;;;AAKG;AACG,SAAU,SAAS,CAAC,CAAS,EAAA;AAC/B,IAAA,OAAO,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC;AACpD;AAEA;;;;;;AAMG;AACG,SAAU,UAAU,CAAC,OAAe,EAAE,MAAc,EAAA;AACtD,IAAA,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO;AAC7B,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC;AACjD,IAAA,OAAO,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK;AAChD;;;;"}
@@ -0,0 +1,212 @@
1
+ import { fromEuler, create as create$1 } from './quat.js';
2
+ import { EPSILON, clamp } from './scalar.js';
3
+
4
+ const DEG2RAD = Math.PI / 180;
5
+ /**
6
+ * Creates a new Euler with default values (0, 0, 0, 'xyz').
7
+ */
8
+ function create() {
9
+ return [0, 0, 0, 'xyz'];
10
+ }
11
+ /**
12
+ * Creates a new Euler from the given values.
13
+ * @param x The x rotation in radians.
14
+ * @param y The y rotation in radians.
15
+ * @param z The z rotation in radians.
16
+ * @param order The order of rotation.
17
+ * @returns A new Euler.
18
+ */
19
+ function fromValues(x, y, z, order) {
20
+ return [x, y, z, order];
21
+ }
22
+ /**
23
+ * Sets a given Euler from the given values.
24
+ * @param x The x rotation in radians.
25
+ * @param y The y rotation in radians.
26
+ * @param z The z rotation in radians.
27
+ * @param order The order of rotation.
28
+ * @returns The output Euler.
29
+ */
30
+ function set(out, x, y, z, order) {
31
+ out[0] = x;
32
+ out[1] = y;
33
+ out[2] = z;
34
+ out[3] = order;
35
+ return out;
36
+ }
37
+ /**
38
+ * Sets Euler angle radians from given degrees
39
+ * @param out The output Euler.
40
+ * @param x The x rotation in degrees.
41
+ * @param y The y rotation in degrees.
42
+ * @param z The z rotation in degrees.
43
+ * @param order The order of rotation.
44
+ * @returns The output Euler.
45
+ */
46
+ function fromDegrees(out, x, y, z, order) {
47
+ out[0] = x * DEG2RAD;
48
+ out[1] = y * DEG2RAD;
49
+ out[2] = z * DEG2RAD;
50
+ out[3] = order;
51
+ return out;
52
+ }
53
+ /**
54
+ * Sets the Euler angles from a rotation matrix.
55
+ * @param out The output Euler.
56
+ * @param rotationMatrix The input rotation matrix.
57
+ * @param order The order of the Euler angles.
58
+ * @returns The output Euler.
59
+ */
60
+ function fromRotationMat4(out, rotationMatrix, order = out[3] || 'xyz') {
61
+ return fromRotationMatrixValues(out, rotationMatrix[0], rotationMatrix[4], rotationMatrix[8], rotationMatrix[1], rotationMatrix[5], rotationMatrix[9], rotationMatrix[2], rotationMatrix[6], rotationMatrix[10], order);
62
+ }
63
+ /**
64
+ * Sets the Euler angles from the elements of a rotation matrix (column-major, so `mNM` is row N, column M).
65
+ * Shared by {@link fromRotationMat4} and {@link fromQuat} so neither has to allocate or read back a scratch matrix.
66
+ */
67
+ function fromRotationMatrixValues(out, m11, m12, m13, m21, m22, m23, m31, m32, m33, order) {
68
+ switch (order) {
69
+ case 'xyz':
70
+ out[1] = Math.asin(clamp(m13, -1, 1));
71
+ if (Math.abs(m13) < 0.9999999) {
72
+ out[0] = Math.atan2(-m23, m33);
73
+ out[2] = Math.atan2(-m12, m11);
74
+ }
75
+ else {
76
+ out[0] = Math.atan2(m32, m22);
77
+ out[2] = 0;
78
+ }
79
+ break;
80
+ case 'yxz':
81
+ out[0] = Math.asin(-clamp(m23, -1, 1));
82
+ if (Math.abs(m23) < 0.9999999) {
83
+ out[1] = Math.atan2(m13, m33);
84
+ out[2] = Math.atan2(m21, m22);
85
+ }
86
+ else {
87
+ out[1] = Math.atan2(-m31, m11);
88
+ out[2] = 0;
89
+ }
90
+ break;
91
+ case 'zxy':
92
+ out[0] = Math.asin(clamp(m32, -1, 1));
93
+ if (Math.abs(m32) < 0.9999999) {
94
+ out[1] = Math.atan2(-m31, m33);
95
+ out[2] = Math.atan2(-m12, m22);
96
+ }
97
+ else {
98
+ out[1] = 0;
99
+ out[2] = Math.atan2(m21, m11);
100
+ }
101
+ break;
102
+ case 'zyx':
103
+ out[1] = Math.asin(-clamp(m31, -1, 1));
104
+ if (Math.abs(m31) < 0.9999999) {
105
+ out[0] = Math.atan2(m32, m33);
106
+ out[2] = Math.atan2(m21, m11);
107
+ }
108
+ else {
109
+ out[0] = 0;
110
+ out[2] = Math.atan2(-m12, m22);
111
+ }
112
+ break;
113
+ case 'yzx':
114
+ out[2] = Math.asin(clamp(m21, -1, 1));
115
+ if (Math.abs(m21) < 0.9999999) {
116
+ out[0] = Math.atan2(-m23, m22);
117
+ out[1] = Math.atan2(-m31, m11);
118
+ }
119
+ else {
120
+ out[0] = 0;
121
+ out[1] = Math.atan2(m13, m33);
122
+ }
123
+ break;
124
+ case 'xzy':
125
+ out[2] = Math.asin(-clamp(m12, -1, 1));
126
+ if (Math.abs(m12) < 0.9999999) {
127
+ out[0] = Math.atan2(m32, m22);
128
+ out[1] = Math.atan2(m13, m11);
129
+ }
130
+ else {
131
+ out[0] = Math.atan2(-m23, m33);
132
+ out[1] = 0;
133
+ }
134
+ break;
135
+ default:
136
+ console.warn(`encountered an unknown order: ${order}`);
137
+ }
138
+ out[3] = order;
139
+ return out;
140
+ }
141
+ /**
142
+ * Returns whether or not the euler angles have exactly the same elements in the same position (when compared with ===)
143
+ *
144
+ * @param a The first euler.
145
+ * @param b The second euler.
146
+ * @returns True if the euler angles are equal, false otherwise.
147
+ */
148
+ function exactEquals(a, b) {
149
+ return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
150
+ }
151
+ /**
152
+ * Returns whether or not the euler angles have approximately the same elements in the same position.
153
+ *
154
+ * @param a The first euler.
155
+ * @param b The second euler.
156
+ * @returns True if the euler angles are equal, false otherwise.
157
+ */
158
+ function equals(a, b) {
159
+ const a0 = a[0];
160
+ const a1 = a[1];
161
+ const a2 = a[2];
162
+ const b0 = b[0];
163
+ const b1 = b[1];
164
+ const b2 = b[2];
165
+ return (Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&
166
+ Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&
167
+ Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&
168
+ a[3] === b[3]);
169
+ }
170
+ /**
171
+ * Sets the Euler angles from a quaternion.
172
+ * @param out The output Euler.
173
+ * @param q The input quaternion. Assumed to be normalized (unit length).
174
+ * @param order The order of the Euler.
175
+ * @returns The output Euler
176
+ */
177
+ function fromQuat(out, q, order) {
178
+ // compute the rotation matrix elements directly from the quaternion
179
+ const x = q[0];
180
+ const y = q[1];
181
+ const z = q[2];
182
+ const w = q[3];
183
+ const x2 = x + x;
184
+ const y2 = y + y;
185
+ const z2 = z + z;
186
+ const xx = x * x2;
187
+ const yx = y * x2;
188
+ const yy = y * y2;
189
+ const zx = z * x2;
190
+ const zy = z * y2;
191
+ const zz = z * z2;
192
+ const wx = w * x2;
193
+ const wy = w * y2;
194
+ const wz = w * z2;
195
+ return fromRotationMatrixValues(out, 1 - yy - zz, yx - wz, zx + wy, yx + wz, 1 - xx - zz, zy - wx, zx - wy, zy + wx, 1 - xx - yy, order);
196
+ }
197
+ const _reorderQuaternion = /*@__PURE__*/ create$1();
198
+ /**
199
+ * Reorders the Euler based on the specified order.
200
+ * @param out The output Euler.
201
+ * @param a The input Euler.
202
+ * @param order The order of the Euler.
203
+ * @returns The output Euler.
204
+ */
205
+ function reorder(out, a, order) {
206
+ fromEuler(_reorderQuaternion, a);
207
+ fromQuat(out, _reorderQuaternion, order);
208
+ return out;
209
+ }
210
+
211
+ export { create, equals, exactEquals, fromDegrees, fromQuat, fromRotationMat4, fromValues, reorder, set };
212
+ //# sourceMappingURL=euler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"euler.js","sources":["../../src/core/euler.ts"],"sourcesContent":["import type { Mat4 } from './mat4';\nimport type { Quat } from './quat';\nimport * as quat from './quat';\nimport { clamp, EPSILON } from './scalar';\n\nconst DEG2RAD = Math.PI / 180;\n\n/** Euler orders */\nexport type EulerOrder = 'xyz' | 'xzy' | 'yxz' | 'yzx' | 'zxy' | 'zyx';\n\n/** A Euler in 3D space, with an optional order (default is 'xyz') */\nexport type Euler = [x: number, y: number, z: number, order?: EulerOrder];\n\n/**\n * Creates a new Euler with default values (0, 0, 0, 'xyz').\n */\nexport function create(): Euler {\n return [0, 0, 0, 'xyz'];\n}\n\n/**\n * Creates a new Euler from the given values.\n * @param x The x rotation in radians.\n * @param y The y rotation in radians.\n * @param z The z rotation in radians.\n * @param order The order of rotation.\n * @returns A new Euler.\n */\nexport function fromValues(x: number, y: number, z: number, order: EulerOrder): Euler {\n return [x, y, z, order];\n}\n\n/**\n * Sets a given Euler from the given values.\n * @param x The x rotation in radians.\n * @param y The y rotation in radians.\n * @param z The z rotation in radians.\n * @param order The order of rotation.\n * @returns The output Euler.\n */\nexport function set(out: Euler, x: number, y: number, z: number, order: EulerOrder): Euler {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = order;\n return out;\n}\n\n/**\n * Sets Euler angle radians from given degrees\n * @param out The output Euler.\n * @param x The x rotation in degrees.\n * @param y The y rotation in degrees.\n * @param z The z rotation in degrees.\n * @param order The order of rotation.\n * @returns The output Euler.\n */\nexport function fromDegrees(out: Euler, x: number, y: number, z: number, order: EulerOrder): Euler {\n out[0] = x * DEG2RAD;\n out[1] = y * DEG2RAD;\n out[2] = z * DEG2RAD;\n out[3] = order;\n\n return out;\n}\n\n/**\n * Sets the Euler angles from a rotation matrix.\n * @param out The output Euler.\n * @param rotationMatrix The input rotation matrix.\n * @param order The order of the Euler angles.\n * @returns The output Euler.\n */\nexport function fromRotationMat4(out: Euler, rotationMatrix: Mat4, order: EulerOrder = out[3] || 'xyz'): Euler {\n return fromRotationMatrixValues(\n out,\n rotationMatrix[0],\n rotationMatrix[4],\n rotationMatrix[8],\n rotationMatrix[1],\n rotationMatrix[5],\n rotationMatrix[9],\n rotationMatrix[2],\n rotationMatrix[6],\n rotationMatrix[10],\n order,\n );\n}\n\n/**\n * Sets the Euler angles from the elements of a rotation matrix (column-major, so `mNM` is row N, column M).\n * Shared by {@link fromRotationMat4} and {@link fromQuat} so neither has to allocate or read back a scratch matrix.\n */\nfunction fromRotationMatrixValues(\n out: Euler,\n m11: number,\n m12: number,\n m13: number,\n m21: number,\n m22: number,\n m23: number,\n m31: number,\n m32: number,\n m33: number,\n order: EulerOrder,\n): Euler {\n switch (order) {\n case 'xyz':\n out[1] = Math.asin(clamp(m13, -1, 1));\n\n if (Math.abs(m13) < 0.9999999) {\n out[0] = Math.atan2(-m23, m33);\n out[2] = Math.atan2(-m12, m11);\n } else {\n out[0] = Math.atan2(m32, m22);\n out[2] = 0;\n }\n\n break;\n\n case 'yxz':\n out[0] = Math.asin(-clamp(m23, -1, 1));\n\n if (Math.abs(m23) < 0.9999999) {\n out[1] = Math.atan2(m13, m33);\n out[2] = Math.atan2(m21, m22);\n } else {\n out[1] = Math.atan2(-m31, m11);\n out[2] = 0;\n }\n\n break;\n\n case 'zxy':\n out[0] = Math.asin(clamp(m32, -1, 1));\n\n if (Math.abs(m32) < 0.9999999) {\n out[1] = Math.atan2(-m31, m33);\n out[2] = Math.atan2(-m12, m22);\n } else {\n out[1] = 0;\n out[2] = Math.atan2(m21, m11);\n }\n\n break;\n\n case 'zyx':\n out[1] = Math.asin(-clamp(m31, -1, 1));\n\n if (Math.abs(m31) < 0.9999999) {\n out[0] = Math.atan2(m32, m33);\n out[2] = Math.atan2(m21, m11);\n } else {\n out[0] = 0;\n out[2] = Math.atan2(-m12, m22);\n }\n\n break;\n\n case 'yzx':\n out[2] = Math.asin(clamp(m21, -1, 1));\n\n if (Math.abs(m21) < 0.9999999) {\n out[0] = Math.atan2(-m23, m22);\n out[1] = Math.atan2(-m31, m11);\n } else {\n out[0] = 0;\n out[1] = Math.atan2(m13, m33);\n }\n\n break;\n\n case 'xzy':\n out[2] = Math.asin(-clamp(m12, -1, 1));\n\n if (Math.abs(m12) < 0.9999999) {\n out[0] = Math.atan2(m32, m22);\n out[1] = Math.atan2(m13, m11);\n } else {\n out[0] = Math.atan2(-m23, m33);\n out[1] = 0;\n }\n\n break;\n\n default:\n console.warn(`encountered an unknown order: ${order}`);\n }\n\n out[3] = order;\n\n return out;\n}\n\n/**\n * Returns whether or not the euler angles have exactly the same elements in the same position (when compared with ===)\n *\n * @param a The first euler.\n * @param b The second euler.\n * @returns True if the euler angles are equal, false otherwise.\n */\nexport function exactEquals(a: Euler, b: Euler): boolean {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n\n/**\n * Returns whether or not the euler angles have approximately the same elements in the same position.\n *\n * @param a The first euler.\n * @param b The second euler.\n * @returns True if the euler angles are equal, false otherwise.\n */\nexport function equals(a: Euler, b: Euler): boolean {\n const a0 = a[0];\n const a1 = a[1];\n const a2 = a[2];\n const b0 = b[0];\n const b1 = b[1];\n const b2 = b[2];\n return (\n Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n a[3] === b[3]\n );\n}\n\n/**\n * Sets the Euler angles from a quaternion.\n * @param out The output Euler.\n * @param q The input quaternion. Assumed to be normalized (unit length).\n * @param order The order of the Euler.\n * @returns The output Euler\n */\nexport function fromQuat(out: Euler, q: Quat, order: EulerOrder): Euler {\n // compute the rotation matrix elements directly from the quaternion\n const x = q[0];\n const y = q[1];\n const z = q[2];\n const w = q[3];\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n\n const xx = x * x2;\n const yx = y * x2;\n const yy = y * y2;\n const zx = z * x2;\n const zy = z * y2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n return fromRotationMatrixValues(\n out,\n 1 - yy - zz,\n yx - wz,\n zx + wy,\n yx + wz,\n 1 - xx - zz,\n zy - wx,\n zx - wy,\n zy + wx,\n 1 - xx - yy,\n order,\n );\n}\n\nconst _reorderQuaternion = /*@__PURE__*/ quat.create();\n\n/**\n * Reorders the Euler based on the specified order.\n * @param out The output Euler.\n * @param a The input Euler.\n * @param order The order of the Euler.\n * @returns The output Euler.\n */\nexport function reorder(out: Euler, a: Euler, order: EulerOrder): Euler {\n quat.fromEuler(_reorderQuaternion, a);\n fromQuat(out, _reorderQuaternion, order);\n return out;\n}\n"],"names":["quat.create","quat.fromEuler"],"mappings":"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"}