@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.
- package/package.json +19 -0
- package/src/ArrayUtils.ts +65 -0
- package/src/AsyncTask.ts +72 -0
- package/src/Category.ts +119 -0
- package/src/Color.ts +111 -0
- package/src/Engine.ts +101 -0
- package/src/Generate.ts +40 -0
- package/src/InputSystem.ts +108 -0
- package/src/Listener.ts +59 -0
- package/src/ObjectPool.ts +84 -0
- package/src/ObjectUtils.ts +49 -0
- package/src/Scriptable.ts +27 -0
- package/src/Serialization.ts +49 -0
- package/src/Traverser.ts +39 -0
- package/src/actor/Actor.ts +28 -0
- package/src/actor/AnimationUnitActor.ts +289 -0
- package/src/actor/DivActor.ts +70 -0
- package/src/actor/FragmentActor.ts +56 -0
- package/src/actor/HTMActor.ts +166 -0
- package/src/actor/HTMServiceActor.ts +57 -0
- package/src/actor/HTMTransformControllerActor.ts +404 -0
- package/src/actor/StyleActor.ts +96 -0
- package/src/actor/index.ts +8 -0
- package/src/asset/Asset.ts +271 -0
- package/src/asset/AssetGraph.ts +246 -0
- package/src/asset/index.ts +2 -0
- package/src/descriptor/AnimationUnitDescriptor.ts +65 -0
- package/src/descriptor/CameraDescriptor.ts +12 -0
- package/src/descriptor/ControllerDescriptor.ts +16 -0
- package/src/descriptor/DatasetDescriptor.ts +92 -0
- package/src/descriptor/Descriptor.ts +415 -0
- package/src/descriptor/DivDescriptor.ts +18 -0
- package/src/descriptor/DynamicDescriptor.ts +27 -0
- package/src/descriptor/HTMLDescriptor.ts +87 -0
- package/src/descriptor/HTMLServiceDescriptor.ts +19 -0
- package/src/descriptor/HTMLTransformControllerDescriptor.ts +34 -0
- package/src/descriptor/NodeDescriptor.ts +32 -0
- package/src/descriptor/PrefabDescriptor.ts +53 -0
- package/src/descriptor/PrefabInstanceDescriptor.ts +32 -0
- package/src/descriptor/RoutineDescriptor.ts +54 -0
- package/src/descriptor/ServiceDescriptor.ts +32 -0
- package/src/descriptor/ServiceSchedulerDescriptor.ts +32 -0
- package/src/descriptor/StyleDescriptor.ts +213 -0
- package/src/descriptor/index.ts +17 -0
- package/src/graphics/Collection.ts +25 -0
- package/src/graphics/Compilation.ts +82 -0
- package/src/graphics/Graphics.ts +475 -0
- package/src/graphics/Observer.ts +36 -0
- package/src/graphics/Unit.ts +83 -0
- package/src/graphics/VariableProxy.ts +92 -0
- package/src/graphics/index.ts +5 -0
- package/src/index.ts +26 -0
- package/src/interpreter/AnimationUnitInterpreter.ts +53 -0
- package/src/interpreter/DatasetInterpreter.ts +11 -0
- package/src/interpreter/DivInterpreter.ts +44 -0
- package/src/interpreter/DynamicInterpreter.ts +207 -0
- package/src/interpreter/FragmentInterpreter.ts +34 -0
- package/src/interpreter/HTMLServiceInterpreter.ts +47 -0
- package/src/interpreter/HTMLTransformControllerInterpreter.ts +40 -0
- package/src/interpreter/Interpreter.ts +69 -0
- package/src/interpreter/PrefaInterpreter.ts +11 -0
- package/src/interpreter/PrefabInstanceInterpreter.ts +12 -0
- package/src/interpreter/RoutineInterpreter.ts +88 -0
- package/src/interpreter/ServiceInterpreter.ts +24 -0
- package/src/interpreter/ServiceSchedulerInterpreter.ts +42 -0
- package/src/interpreter/StyleInterpreter.ts +66 -0
- package/src/interpreter/index.ts +14 -0
- package/src/locale/Language.ts +10 -0
- package/src/locale/LanguageProvider.ts +48 -0
- package/src/locale/index.ts +2 -0
- package/src/math/Euler.ts +303 -0
- package/src/math/Matrix4.ts +1123 -0
- package/src/math/Quaternion.ts +737 -0
- package/src/math/Vector2.ts +680 -0
- package/src/math/Vector3.ts +1062 -0
- package/src/math/index.ts +5 -0
- package/src/math/utils.ts +17 -0
- package/src/preset/execute/dataset/index.ts +1 -0
- package/src/preset/execute/dataset/update.ts +52 -0
- package/src/preset/execute/graphics/index.ts +1 -0
- package/src/preset/execute/graphics/invoke.ts +49 -0
- package/src/preset/execute/index.ts +4 -0
- package/src/preset/execute/net/index.ts +1 -0
- package/src/preset/execute/net/request.ts +103 -0
- package/src/preset/execute/scheduler/index.ts +1 -0
- package/src/preset/execute/scheduler/switch.ts +46 -0
- package/src/preset/index.ts +7 -0
- package/src/preset/routine/graphics/index.ts +1 -0
- package/src/preset/routine/graphics/invoke.ts +27 -0
- package/src/preset/routine/index.ts +2 -0
- package/src/preset/routine/scheduler/index.ts +1 -0
- package/src/preset/routine/scheduler/switch.ts +27 -0
- package/src/setup/index.ts +17 -0
- package/src/utils/AssetProvider.ts +72 -0
- 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,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 };
|