@vyr/engine 0.0.1

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 (95) hide show
  1. package/package.json +19 -0
  2. package/src/ArrayUtils.ts +65 -0
  3. package/src/AsyncTask.ts +72 -0
  4. package/src/Category.ts +119 -0
  5. package/src/Color.ts +111 -0
  6. package/src/Engine.ts +101 -0
  7. package/src/Generate.ts +40 -0
  8. package/src/InputSystem.ts +108 -0
  9. package/src/Listener.ts +59 -0
  10. package/src/ObjectPool.ts +84 -0
  11. package/src/ObjectUtils.ts +49 -0
  12. package/src/Scriptable.ts +27 -0
  13. package/src/Serialization.ts +49 -0
  14. package/src/Traverser.ts +39 -0
  15. package/src/actor/Actor.ts +28 -0
  16. package/src/actor/AnimationUnitActor.ts +289 -0
  17. package/src/actor/DivActor.ts +70 -0
  18. package/src/actor/FragmentActor.ts +56 -0
  19. package/src/actor/HTMActor.ts +166 -0
  20. package/src/actor/HTMServiceActor.ts +57 -0
  21. package/src/actor/HTMTransformControllerActor.ts +404 -0
  22. package/src/actor/StyleActor.ts +96 -0
  23. package/src/actor/index.ts +8 -0
  24. package/src/asset/Asset.ts +271 -0
  25. package/src/asset/AssetGraph.ts +246 -0
  26. package/src/asset/index.ts +2 -0
  27. package/src/descriptor/AnimationUnitDescriptor.ts +65 -0
  28. package/src/descriptor/CameraDescriptor.ts +12 -0
  29. package/src/descriptor/ControllerDescriptor.ts +16 -0
  30. package/src/descriptor/DatasetDescriptor.ts +92 -0
  31. package/src/descriptor/Descriptor.ts +415 -0
  32. package/src/descriptor/DivDescriptor.ts +18 -0
  33. package/src/descriptor/DynamicDescriptor.ts +27 -0
  34. package/src/descriptor/HTMLDescriptor.ts +87 -0
  35. package/src/descriptor/HTMLServiceDescriptor.ts +19 -0
  36. package/src/descriptor/HTMLTransformControllerDescriptor.ts +34 -0
  37. package/src/descriptor/NodeDescriptor.ts +32 -0
  38. package/src/descriptor/PrefabDescriptor.ts +53 -0
  39. package/src/descriptor/PrefabInstanceDescriptor.ts +32 -0
  40. package/src/descriptor/RoutineDescriptor.ts +54 -0
  41. package/src/descriptor/ServiceDescriptor.ts +32 -0
  42. package/src/descriptor/ServiceSchedulerDescriptor.ts +32 -0
  43. package/src/descriptor/StyleDescriptor.ts +213 -0
  44. package/src/descriptor/index.ts +17 -0
  45. package/src/graphics/Collection.ts +25 -0
  46. package/src/graphics/Compilation.ts +82 -0
  47. package/src/graphics/Graphics.ts +475 -0
  48. package/src/graphics/Observer.ts +36 -0
  49. package/src/graphics/Unit.ts +83 -0
  50. package/src/graphics/VariableProxy.ts +92 -0
  51. package/src/graphics/index.ts +5 -0
  52. package/src/index.ts +26 -0
  53. package/src/interpreter/AnimationUnitInterpreter.ts +53 -0
  54. package/src/interpreter/DatasetInterpreter.ts +11 -0
  55. package/src/interpreter/DivInterpreter.ts +44 -0
  56. package/src/interpreter/DynamicInterpreter.ts +207 -0
  57. package/src/interpreter/FragmentInterpreter.ts +34 -0
  58. package/src/interpreter/HTMLServiceInterpreter.ts +47 -0
  59. package/src/interpreter/HTMLTransformControllerInterpreter.ts +40 -0
  60. package/src/interpreter/Interpreter.ts +69 -0
  61. package/src/interpreter/PrefaInterpreter.ts +11 -0
  62. package/src/interpreter/PrefabInstanceInterpreter.ts +12 -0
  63. package/src/interpreter/RoutineInterpreter.ts +88 -0
  64. package/src/interpreter/ServiceInterpreter.ts +24 -0
  65. package/src/interpreter/ServiceSchedulerInterpreter.ts +42 -0
  66. package/src/interpreter/StyleInterpreter.ts +66 -0
  67. package/src/interpreter/index.ts +14 -0
  68. package/src/locale/Language.ts +10 -0
  69. package/src/locale/LanguageProvider.ts +48 -0
  70. package/src/locale/index.ts +2 -0
  71. package/src/math/Euler.ts +303 -0
  72. package/src/math/Matrix4.ts +1123 -0
  73. package/src/math/Quaternion.ts +737 -0
  74. package/src/math/Vector2.ts +680 -0
  75. package/src/math/Vector3.ts +1062 -0
  76. package/src/math/index.ts +5 -0
  77. package/src/math/utils.ts +17 -0
  78. package/src/preset/execute/dataset/index.ts +1 -0
  79. package/src/preset/execute/dataset/update.ts +52 -0
  80. package/src/preset/execute/graphics/index.ts +1 -0
  81. package/src/preset/execute/graphics/invoke.ts +49 -0
  82. package/src/preset/execute/index.ts +4 -0
  83. package/src/preset/execute/net/index.ts +1 -0
  84. package/src/preset/execute/net/request.ts +103 -0
  85. package/src/preset/execute/scheduler/index.ts +1 -0
  86. package/src/preset/execute/scheduler/switch.ts +46 -0
  87. package/src/preset/index.ts +7 -0
  88. package/src/preset/routine/graphics/index.ts +1 -0
  89. package/src/preset/routine/graphics/invoke.ts +27 -0
  90. package/src/preset/routine/index.ts +2 -0
  91. package/src/preset/routine/scheduler/index.ts +1 -0
  92. package/src/preset/routine/scheduler/switch.ts +27 -0
  93. package/src/setup/index.ts +17 -0
  94. package/src/utils/AssetProvider.ts +72 -0
  95. package/src/utils/index.ts +1 -0
@@ -0,0 +1,42 @@
1
+ import { Descriptor, ServiceSchedulerDescriptor, UpdateArgs } from "../descriptor"
2
+ import { DivActor } from "../actor"
3
+ import { Interpreter } from "./Interpreter"
4
+
5
+ class ServiceSchedulerInterpreter extends Interpreter {
6
+ static type = ServiceSchedulerDescriptor.type
7
+
8
+ protected createActor(descriptor: Descriptor, args: UpdateArgs) {
9
+ const actor = new DivActor(descriptor.uuid)
10
+ return actor
11
+ }
12
+
13
+ private resize = () => { }
14
+ private unresize = () => { }
15
+
16
+ install(descriptor: ServiceSchedulerDescriptor, args: UpdateArgs) {
17
+ const actor = this.getActor<DivActor>(descriptor, args)
18
+ const wrapper = actor.getWrapper()
19
+
20
+ this.graphics.engine.DOM.appendChild(wrapper)
21
+
22
+ this.resize = () => {
23
+ wrapper.style.width = this.graphics.engine.DOM.clientWidth + 'px'
24
+ wrapper.style.height = this.graphics.engine.DOM.clientHeight + 'px'
25
+ actor.DOM.style.width = '100%'
26
+ actor.DOM.style.height = '100%'
27
+ }
28
+ const uuid = this.graphics.engine.inputSystem.listen('resize', this.resize, { target: window })
29
+ this.unresize = () => this.graphics.engine.inputSystem.unlisten(uuid)
30
+ this.resize()
31
+ }
32
+
33
+ uninstall(descriptor: ServiceSchedulerDescriptor, args: UpdateArgs) {
34
+ this.unresize()
35
+ const actor = this.getActor<DivActor>(descriptor, args)
36
+ const wrapper = actor.getWrapper()
37
+ wrapper.remove()
38
+ }
39
+ }
40
+ Interpreter.register(ServiceSchedulerInterpreter)
41
+
42
+ export { ServiceSchedulerInterpreter }
@@ -0,0 +1,66 @@
1
+ import { Descriptor, StyleDescriptor, UpdateArgs } from "../descriptor";
2
+ import { StyleActor } from "../actor";
3
+ import { Graphics, Unit } from "../graphics";
4
+ import { Interpreter } from "./Interpreter";
5
+
6
+ let _sheet: CSSStyleSheet | null = null
7
+
8
+ class StyleInterpreter extends Interpreter {
9
+ static type = StyleDescriptor.type
10
+ static get sheet() {
11
+ if (_sheet === null) {
12
+ const style = document.createElement('style')
13
+ style.setAttribute('type', 'text/css')
14
+ document.head.appendChild(style)
15
+ _sheet = style.sheet as CSSStyleSheet
16
+ }
17
+ return _sheet as CSSStyleSheet
18
+ }
19
+ static insertRule(styles: string[]) {
20
+ for (const style of styles) this.sheet.insertRule(style, StyleInterpreter.sheet.cssRules.length)
21
+ }
22
+
23
+ readonly className
24
+
25
+ constructor(unit: Unit, graphics: Graphics) {
26
+ super(unit, graphics)
27
+ this.className = `vyr_${unit.uuid}`
28
+ }
29
+
30
+ protected createActor(descriptor: StyleDescriptor, args: UpdateArgs) {
31
+ return new StyleActor()
32
+ }
33
+
34
+ update(descriptor: StyleDescriptor, args: UpdateArgs) {
35
+ super.update(descriptor, args)
36
+
37
+ const actor = this.getActor<StyleActor>(descriptor, args)
38
+ actor.update(descriptor, this.className)
39
+
40
+ if (actor.updateRule(StyleInterpreter.sheet) === true) return
41
+
42
+ const styleValues = actor.getStyleValue()
43
+ StyleInterpreter.insertRule(styleValues)
44
+ }
45
+
46
+ free(descriptor: Descriptor, args: UpdateArgs) {
47
+ const selectorTexts = [`.${this.className}`, `.${this.className}:hover`]
48
+ for (let i = StyleInterpreter.sheet.cssRules.length - 1; i >= 0; i--) {
49
+ const rule = StyleInterpreter.sheet.cssRules[i]
50
+ if (rule instanceof CSSStyleRule) {
51
+ const i = selectorTexts.indexOf(rule.selectorText)
52
+ if (i > -1) {
53
+ StyleInterpreter.sheet.deleteRule(i)
54
+ selectorTexts.splice(i, 1)
55
+ if (selectorTexts.length === 0) return
56
+ }
57
+ }
58
+ }
59
+ super.free(descriptor, args)
60
+ }
61
+ }
62
+ Interpreter.register(StyleInterpreter)
63
+
64
+ export {
65
+ StyleInterpreter
66
+ }
@@ -0,0 +1,14 @@
1
+ export { Interpreter } from './Interpreter'
2
+ export * from './DatasetInterpreter'
3
+ export * from './StyleInterpreter'
4
+ export * from './AnimationUnitInterpreter'
5
+ export * from './FragmentInterpreter'
6
+ export * from './DynamicInterpreter'
7
+ export * from './RoutineInterpreter'
8
+ export * from './PrefaInterpreter'
9
+ export * from './PrefabInstanceInterpreter'
10
+ export * from "./DivInterpreter";
11
+ export * from "./HTMLTransformControllerInterpreter";
12
+ export * from './ServiceInterpreter'
13
+ export * from "./HTMLServiceInterpreter";
14
+ export * from './ServiceSchedulerInterpreter'
@@ -0,0 +1,10 @@
1
+ import { Locale } from "@vyr/locale";
2
+ import { zhCnLanguageProvider, ZhCNLanguageProvider } from "./LanguageProvider";
3
+
4
+ Locale.register(zhCnLanguageProvider)
5
+
6
+ const language = Locale.getLanguage<ZhCNLanguageProvider>(zhCnLanguageProvider.name)
7
+
8
+ export {
9
+ language
10
+ }
@@ -0,0 +1,48 @@
1
+ import { LanguageProvider } from '@vyr/locale'
2
+
3
+ interface ZhCNLanguageProvider extends LanguageProvider {
4
+ 'asyncTask.task.was.cancelled': string
5
+ 'asset.load.fail': string
6
+ 'asset.already.exists': string
7
+ 'asset.provider.notFound': string
8
+ 'descriptor.notRegister': string
9
+ 'descriptor.insert.uuid.notFound': string
10
+ 'descriptor.insert.target.notFound': string
11
+ 'descriptor.syncWith.fail': string
12
+ 'interpreter.new.fail': string
13
+ 'graphics.interpreter.notRegister': string
14
+ 'graphics.unit.notFound': string
15
+ 'engine.run.container.notFound': string
16
+
17
+ '/virtual:/preset/net/request.ts': string
18
+ '/virtual:/preset/dataset/update.ts': string
19
+ '/virtual:/preset/scheduler/switch.ts': string
20
+ '/virtual:/preset/graphics/invoke.ts': string
21
+ }
22
+
23
+ const zhCnLanguageProvider: ZhCNLanguageProvider = {
24
+ id: 'zh_CN',
25
+ name: '@vyr/engine',
26
+ 'asyncTask.task.was.cancelled': '任务已取消',
27
+ 'asset.load.fail': '资产加载失败:未注册 {{category}} 类别的工厂方法',
28
+ 'asset.already.exists': '已存在同名资产,覆盖可能导致异常',
29
+ 'asset.provider.notFound': '未找到资源提供方:{{url}}',
30
+ 'descriptor.notRegister': '未注册描述器:{{type}}',
31
+ 'descriptor.insert.uuid.notFound': '节点不存在:${uuid}',
32
+ 'descriptor.insert.target.notFound': '目标节点不存在:${target}',
33
+ 'descriptor.syncWith.fail': '只能从同类型实例同步属性',
34
+ 'interpreter.new.fail': '请使用静态 create 方法创建实例',
35
+ 'graphics.interpreter.notRegister': '未注册解释器:{{type}}',
36
+ 'graphics.unit.notFound': '单元不存在:{{uuid}}',
37
+ 'engine.run.container.notFound': '挂载节点不存在',
38
+
39
+ '/virtual:/preset/net/request.ts': '网络请求',
40
+ '/virtual:/preset/dataset/update.ts': '更新数据集',
41
+ '/virtual:/preset/scheduler/switch.ts': '切换场景',
42
+ '/virtual:/preset/graphics/invoke.ts': '调用交互',
43
+ }
44
+
45
+ export {
46
+ ZhCNLanguageProvider,
47
+ zhCnLanguageProvider,
48
+ }
@@ -0,0 +1,2 @@
1
+ export * from './LanguageProvider'
2
+ export * from './Language'
@@ -0,0 +1,303 @@
1
+ import { DeserializationObject } from "../Serialization"
2
+ import { clamp } from './utils';
3
+ import { Quaternion } from './Quaternion';
4
+ import { Matrix4 } from './Matrix4';
5
+ import { Vector3 } from './Vector3'
6
+
7
+ const _matrix = /*@__PURE__*/ new Matrix4();
8
+ const _quaternion = /*@__PURE__*/ new Quaternion();
9
+
10
+ type EulerOrder = 'XYZ' | 'YXZ' | 'ZXY' | 'ZYX' | 'YZX' | 'XZY';
11
+
12
+ /**
13
+ * A class representing Euler angles.
14
+ *
15
+ * Euler angles describe a rotational transformation by rotating an object on
16
+ * its various axes in specified amounts per axis, and a specified axis
17
+ * order.
18
+ *
19
+ * Iterating through an instance will yield its components (x, y, z,
20
+ * order) in the corresponding order.
21
+ *
22
+ * ```js
23
+ * const a = new Euler( 0, 1, 1.57, 'XYZ' );
24
+ * const b = new Vector3( 1, 0, 1 );
25
+ * b.applyEuler(a);
26
+ * ```
27
+ */
28
+ class Euler {
29
+ static create(euler?: number | DeserializationObject<Euler>, y?: number, z?: number, order?: EulerOrder) {
30
+ if (euler === undefined) return new Euler()
31
+
32
+ if (typeof euler === 'number') {
33
+ return new Euler(euler as number, y, z, order)
34
+ } else {
35
+ return new Euler(euler.x, euler.y, euler.z, euler.order)
36
+ }
37
+ }
38
+
39
+ /**
40
+ * The default Euler angle order.
41
+ *
42
+ * @static
43
+ * @default 'XYZ'
44
+ */
45
+ static readonly DEFAULT_ORDER: EulerOrder = 'XYZ';
46
+
47
+ x: number;
48
+ y: number;
49
+ z: number;
50
+ order: EulerOrder;
51
+
52
+ /**
53
+ * Constructs a new euler instance.
54
+ *
55
+ * @param x - The angle of the x axis in radians.
56
+ * @param y - The angle of the y axis in radians.
57
+ * @param z - The angle of the z axis in radians.
58
+ * @param order - A string representing the order that the rotations are applied.
59
+ */
60
+ constructor(x: number = 0, y: number = 0, z: number = 0, order: EulerOrder = Euler.DEFAULT_ORDER) {
61
+ this.x = x;
62
+ this.y = y;
63
+ this.z = z;
64
+ this.order = order;
65
+ }
66
+
67
+ /**
68
+ * Sets the Euler components.
69
+ *
70
+ * @param x - The angle of the x axis in radians.
71
+ * @param y - The angle of the y axis in radians.
72
+ * @param z - The angle of the z axis in radians.
73
+ * @param order - A string representing the order that the rotations are applied.
74
+ * @return A reference to this Euler instance.
75
+ */
76
+ set(x: number, y: number, z: number, order: EulerOrder = this.order): Euler {
77
+ this.x = x;
78
+ this.y = y;
79
+ this.z = z;
80
+ this.order = order;
81
+
82
+
83
+ return this;
84
+ }
85
+
86
+ /**
87
+ * Returns a new Euler instance with copied values from this instance.
88
+ *
89
+ * @return A clone of this instance.
90
+ */
91
+ clone(): Euler {
92
+ return new (this.constructor as typeof Euler)(this.x, this.y, this.z, this.order);
93
+ }
94
+
95
+ /**
96
+ * Copies the values of the given Euler instance to this instance.
97
+ *
98
+ * @param euler - The Euler instance to copy.
99
+ * @return A reference to this Euler instance.
100
+ */
101
+ copy(euler: Euler): Euler {
102
+ this.x = euler.x;
103
+ this.y = euler.y;
104
+ this.z = euler.z;
105
+ this.order = euler.order;
106
+
107
+
108
+ return this;
109
+ }
110
+
111
+ /**
112
+ * Sets the angles of this Euler instance from a pure rotation matrix.
113
+ *
114
+ * @param m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).
115
+ * @param order - A string representing the order that the rotations are applied.
116
+ * @return A reference to this Euler instance.
117
+ */
118
+ setFromRotationMatrix(m: Matrix4, order: EulerOrder = this.order): Euler {
119
+ const te = m.elements;
120
+ const m11 = te[0],
121
+ m12 = te[4],
122
+ m13 = te[8];
123
+ const m21 = te[1],
124
+ m22 = te[5],
125
+ m23 = te[9];
126
+ const m31 = te[2],
127
+ m32 = te[6],
128
+ m33 = te[10];
129
+
130
+ switch (order) {
131
+ case 'XYZ':
132
+ this.y = Math.asin(clamp(m13, -1, 1));
133
+
134
+ if (Math.abs(m13) < 0.9999999) {
135
+ this.x = Math.atan2(-m23, m33);
136
+ this.z = Math.atan2(-m12, m11);
137
+ } else {
138
+ this.x = Math.atan2(m32, m22);
139
+ this.z = 0;
140
+ }
141
+ break;
142
+
143
+ case 'YXZ':
144
+ this.x = Math.asin(-clamp(m23, -1, 1));
145
+
146
+ if (Math.abs(m23) < 0.9999999) {
147
+ this.y = Math.atan2(m13, m33);
148
+ this.z = Math.atan2(m21, m22);
149
+ } else {
150
+ this.y = Math.atan2(-m31, m11);
151
+ this.z = 0;
152
+ }
153
+ break;
154
+
155
+ case 'ZXY':
156
+ this.x = Math.asin(clamp(m32, -1, 1));
157
+
158
+ if (Math.abs(m32) < 0.9999999) {
159
+ this.y = Math.atan2(-m31, m33);
160
+ this.z = Math.atan2(-m12, m22);
161
+ } else {
162
+ this.y = 0;
163
+ this.z = Math.atan2(m21, m11);
164
+ }
165
+ break;
166
+
167
+ case 'ZYX':
168
+ this.y = Math.asin(-clamp(m31, -1, 1));
169
+
170
+ if (Math.abs(m31) < 0.9999999) {
171
+ this.x = Math.atan2(m32, m33);
172
+ this.z = Math.atan2(m21, m11);
173
+ } else {
174
+ this.x = 0;
175
+ this.z = Math.atan2(-m12, m22);
176
+ }
177
+ break;
178
+
179
+ case 'YZX':
180
+ this.z = Math.asin(clamp(m21, -1, 1));
181
+
182
+ if (Math.abs(m21) < 0.9999999) {
183
+ this.x = Math.atan2(-m23, m22);
184
+ this.y = Math.atan2(-m31, m11);
185
+ } else {
186
+ this.x = 0;
187
+ this.y = Math.atan2(m13, m33);
188
+ }
189
+ break;
190
+
191
+ case 'XZY':
192
+ this.z = Math.asin(-clamp(m12, -1, 1));
193
+
194
+ if (Math.abs(m12) < 0.9999999) {
195
+ this.x = Math.atan2(m32, m22);
196
+ this.y = Math.atan2(m13, m11);
197
+ } else {
198
+ this.x = Math.atan2(-m23, m33);
199
+ this.y = 0;
200
+ }
201
+ break;
202
+
203
+ default:
204
+ console.warn('Euler: .setFromRotationMatrix() encountered an unknown order: ' + order);
205
+ }
206
+
207
+ this.order = order;
208
+
209
+ return this;
210
+ }
211
+
212
+ /**
213
+ * Sets the angles of this Euler instance from a normalized quaternion.
214
+ *
215
+ * @param q - A normalized Quaternion.
216
+ * @param order - A string representing the order that the rotations are applied.
217
+ * @return A reference to this Euler instance.
218
+ */
219
+ setFromQuaternion(q: Quaternion, order?: EulerOrder): Euler {
220
+ _matrix.makeRotationFromQuaternion(q);
221
+ return this.setFromRotationMatrix(_matrix, order);
222
+ }
223
+
224
+ /**
225
+ * Sets the angles of this Euler instance from the given vector.
226
+ *
227
+ * @param v - The vector.
228
+ * @param order - A string representing the order that the rotations are applied.
229
+ * @return A reference to this Euler instance.
230
+ */
231
+ setFromVector3(v: Vector3, order: EulerOrder = this.order): Euler {
232
+ return this.set(v.x, v.y, v.z, order);
233
+ }
234
+
235
+ /**
236
+ * Resets the euler angle with a new order by creating a quaternion from this
237
+ * euler angle and then setting this euler angle with the quaternion and the
238
+ * new order.
239
+ *
240
+ * Warning: This discards revolution information.
241
+ *
242
+ * @param newOrder - A string representing the new order that the rotations are applied.
243
+ * @return A reference to this Euler instance.
244
+ */
245
+ reorder(newOrder: EulerOrder): Euler {
246
+ _quaternion.setFromEuler(this);
247
+ return this.setFromQuaternion(_quaternion, newOrder);
248
+ }
249
+
250
+ /**
251
+ * Returns `true` if this Euler instance is equal with the given one.
252
+ *
253
+ * @param euler - The Euler instance to test for equality.
254
+ * @return Whether this Euler instance is equal with the given one.
255
+ */
256
+ equals(euler: Euler): boolean {
257
+ return euler.x === this.x && euler.y === this.y && euler.z === this.z && euler.order === this.order;
258
+ }
259
+
260
+ /**
261
+ * Sets this Euler instance's components to values from the given array. The first three
262
+ * entries of the array are assign to the x,y and z components. An optional fourth entry
263
+ * defines the Euler order.
264
+ *
265
+ * @param array - An array holding the Euler component values.
266
+ * @return A reference to this Euler instance.
267
+ */
268
+ fromArray(array: [number, number, number, EulerOrder?] | number[]): Euler {
269
+ this.x = array[0];
270
+ this.y = array[1];
271
+ this.z = array[2];
272
+ if (array[3] !== undefined) this.order = array[3] as EulerOrder;
273
+
274
+
275
+ return this;
276
+ }
277
+
278
+ /**
279
+ * Writes the components of this Euler instance to the given array. If no array is provided,
280
+ * the method returns a new instance.
281
+ *
282
+ * @param array - The target array holding the Euler components.
283
+ * @param offset - Index of the first element in the array.
284
+ * @return The Euler components.
285
+ */
286
+ toArray(array: (number | EulerOrder)[] = [], offset: number = 0): (number | EulerOrder)[] {
287
+ array[offset] = this.x;
288
+ array[offset + 1] = this.y;
289
+ array[offset + 2] = this.z;
290
+ array[offset + 3] = this.order;
291
+
292
+ return array;
293
+ }
294
+
295
+ *[Symbol.iterator](): Generator<number | EulerOrder> {
296
+ yield this.x;
297
+ yield this.y;
298
+ yield this.z;
299
+ yield this.order;
300
+ }
301
+ }
302
+
303
+ export { Euler };