@jscad/x3d-deserializer 2.1.3 → 2.2.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.
- package/CHANGELOG.md +27 -0
- package/README.md +1 -1
- package/package.json +4 -4
- package/src/createTransform.js +0 -1
- package/src/index.js +1 -0
- package/tests/createTransform.test.js +61 -55
- package/tests/helpers/Matrix4.js +0 -371
- package/tests/helpers/Quaternion.js +0 -23
- package/tests/helpers/Rotation4.js +0 -93
- package/tests/helpers/Vector3.js +0 -28
- package/tests/helpers/Vector4.js +0 -13
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [2.2.0](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/x3d-deserializer@2.1.5...@jscad/x3d-deserializer@2.2.0) (2022-06-12)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **x3d-serializer:** enhanced to convert 2D geometry and path to X3D Polyline2D ([#1091](https://github.com/jscad/OpenJSCAD.org/issues/1091)) ([4f763a8](https://github.com/jscad/OpenJSCAD.org/commit/4f763a8def39f3b0454f2079f3c1fd7da52dd880))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [2.1.5](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/x3d-deserializer@2.1.4...@jscad/x3d-deserializer@2.1.5) (2022-04-24)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @jscad/x3d-deserializer
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
## [2.1.4](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/x3d-deserializer@2.1.3...@jscad/x3d-deserializer@2.1.4) (2022-04-03)
|
|
26
|
+
|
|
27
|
+
**Note:** Version bump only for package @jscad/x3d-deserializer
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
6
33
|
## [2.1.3](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/x3d-deserializer@2.1.2...@jscad/x3d-deserializer@2.1.3) (2022-03-06)
|
|
7
34
|
|
|
8
35
|
**Note:** Version bump only for package @jscad/x3d-deserializer
|
package/README.md
CHANGED
|
@@ -97,7 +97,7 @@ We welcome and encourage anyone to pitch in but please take a moment to read the
|
|
|
97
97
|
|
|
98
98
|
* If you want to submit a bug report please make sure to follow the [Reporting Issues](https://github.com/jscad/OpenJSCAD.org/wiki/Reporting-Issues) guide. Bug reports are accepted as [Issues](https://github.com/jscad/OpenJSCAD.org/issues/) via GitHub.
|
|
99
99
|
|
|
100
|
-
* If you want to submit a change or a patch, please read the [Contributing Guide](../../CONTRIBUTING.md)
|
|
100
|
+
* If you want to submit a change or a patch, please read the [Contributing Guide](../../CONTRIBUTING.md). New contributions are accepted as [Pull Requests](https://github.com/jscad/OpenJSCAD.org/pulls/) via GitHub.
|
|
101
101
|
|
|
102
102
|
* We only accept bug reports and pull requests on **GitHub**.
|
|
103
103
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jscad/x3d-deserializer",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "X3D Deserializer for JSCAD",
|
|
5
5
|
"repository": "https://github.com/jscad/OpenJSCAD.org/",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@jscad/array-utils": "2.1.
|
|
30
|
-
"@jscad/modeling": "2.
|
|
29
|
+
"@jscad/array-utils": "2.1.4",
|
|
30
|
+
"@jscad/modeling": "2.9.5",
|
|
31
31
|
"saxes": "5.0.1"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"ava": "3.15.0",
|
|
35
35
|
"nyc": "15.1.0"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "225b034db0d94f748992da72b269833954a2e212"
|
|
38
38
|
}
|
package/src/createTransform.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const { maths } = require('@jscad/modeling')
|
|
2
2
|
|
|
3
3
|
const createTransform = (center, rotation, scale, scaleOrientation, translation) => {
|
|
4
|
-
// console.log('createTransform',center,rotation,scale,scaleOrientation,translation)
|
|
5
4
|
const matrix = maths.mat4.create()
|
|
6
5
|
const temp = maths.mat4.create()
|
|
7
6
|
maths.mat4.multiply(matrix, matrix, maths.mat4.fromTranslation(temp, translation))
|
package/src/index.js
CHANGED
|
@@ -15,6 +15,7 @@ All code released under MIT license
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Deserializer of X3D source data (XML) to JSCAD geometries.
|
|
18
|
+
* @see {@link https://github.com/jscad/OpenJSCAD.org/blob/master/packages/io/x3d-deserializer/README.md|README} for supported conversion of X3D entities.
|
|
18
19
|
* @module io/x3d-deserializer
|
|
19
20
|
* @example
|
|
20
21
|
* const { deserializer, extension } = require('@jscad/x3d-deserializer')
|
|
@@ -2,36 +2,7 @@ const test = require('ava')
|
|
|
2
2
|
|
|
3
3
|
const createTransform = require('../src/createTransform')
|
|
4
4
|
|
|
5
|
-
const Matrix4 = require('./helpers/Matrix4')
|
|
6
|
-
|
|
7
|
-
const compareMat4ToMatrix4 = (mat4, matrix4) => {
|
|
8
|
-
// console.log('compareMat4ToMatrix4',mat4,matrix4.toString())
|
|
9
|
-
const EPS = 0.0000000000001
|
|
10
|
-
|
|
11
|
-
if (Math.abs(mat4[0] - matrix4[0]) > EPS) return false
|
|
12
|
-
if (Math.abs(mat4[1] - matrix4[1]) > EPS) return false
|
|
13
|
-
if (Math.abs(mat4[2] - matrix4[2]) > EPS) return false
|
|
14
|
-
if (Math.abs(mat4[3] - matrix4[3]) > EPS) return false
|
|
15
|
-
|
|
16
|
-
if (Math.abs(mat4[4] - matrix4[4]) > EPS) return false
|
|
17
|
-
if (Math.abs(mat4[5] - matrix4[5]) > EPS) return false
|
|
18
|
-
if (Math.abs(mat4[6] - matrix4[6]) > EPS) return false
|
|
19
|
-
if (Math.abs(mat4[7] - matrix4[7]) > EPS) return false
|
|
20
|
-
|
|
21
|
-
if (Math.abs(mat4[8] - matrix4[8]) > EPS) return false
|
|
22
|
-
if (Math.abs(mat4[9] - matrix4[9]) > EPS) return false
|
|
23
|
-
if (Math.abs(mat4[10] - matrix4[10]) > EPS) return false
|
|
24
|
-
if (Math.abs(mat4[11] - matrix4[11]) > EPS) return false
|
|
25
|
-
|
|
26
|
-
if (Math.abs(mat4[12] - matrix4[12]) > EPS) return false
|
|
27
|
-
if (Math.abs(mat4[13] - matrix4[13]) > EPS) return false
|
|
28
|
-
if (Math.abs(mat4[14] - matrix4[14]) > EPS) return false
|
|
29
|
-
if (Math.abs(mat4[15] - matrix4[15]) > EPS) return false
|
|
30
|
-
return true
|
|
31
|
-
}
|
|
32
|
-
|
|
33
5
|
test('createTransform returns expected transform matrix', (t) => {
|
|
34
|
-
const matrix4 = new Matrix4()
|
|
35
6
|
// X3D defaults
|
|
36
7
|
let center = [0, 0, 0]
|
|
37
8
|
let rotation = [0, 0, 1, 0]
|
|
@@ -40,77 +11,107 @@ test('createTransform returns expected transform matrix', (t) => {
|
|
|
40
11
|
let translation = [0, 0, 0]
|
|
41
12
|
|
|
42
13
|
let obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
43
|
-
let exp =
|
|
44
|
-
t.
|
|
14
|
+
let exp = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
|
|
15
|
+
t.deepEqual(obs, exp)
|
|
45
16
|
|
|
46
17
|
center = [5, 5, 5]
|
|
47
18
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
48
|
-
exp =
|
|
49
|
-
t.
|
|
19
|
+
exp = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
|
|
20
|
+
t.deepEqual(obs, exp)
|
|
50
21
|
center = [0, 0, 0]
|
|
51
22
|
|
|
52
23
|
scale = [5, 5, 5]
|
|
53
24
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
54
|
-
exp =
|
|
55
|
-
t.
|
|
25
|
+
exp = [5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1]
|
|
26
|
+
t.deepEqual(obs, exp)
|
|
56
27
|
scale = [1, 1, 1]
|
|
57
28
|
|
|
58
29
|
translation = [5, 5, 5]
|
|
59
30
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
60
|
-
exp =
|
|
61
|
-
t.
|
|
31
|
+
exp = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5, 5, 5, 1]
|
|
32
|
+
t.deepEqual(obs, exp)
|
|
62
33
|
translation = [0, 0, 0]
|
|
63
34
|
|
|
64
35
|
rotation = [1, 0, 0, -0.707]
|
|
65
36
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
66
|
-
exp =
|
|
67
|
-
|
|
37
|
+
exp = [
|
|
38
|
+
1, 0, 0, 0,
|
|
39
|
+
0, 0.7603139617444397, -0.6495557555564224, 0,
|
|
40
|
+
0, 0.6495557555564224, 0.7603139617444397, 0,
|
|
41
|
+
0, 0, 0, 1
|
|
42
|
+
]
|
|
43
|
+
t.deepEqual(obs, exp)
|
|
68
44
|
rotation = [0, 0, 1, 0]
|
|
69
45
|
|
|
70
46
|
rotation = [0.577, 0.577, 0.577, 1]
|
|
71
47
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
72
|
-
exp =
|
|
73
|
-
|
|
48
|
+
exp = [
|
|
49
|
+
0.6935348705787598, 0.6390560643047187, -0.33259093488347846, 0,
|
|
50
|
+
-0.33259093488347846, 0.6935348705787598, 0.6390560643047187, 0,
|
|
51
|
+
0.6390560643047187, -0.33259093488347846, 0.6935348705787598, 0,
|
|
52
|
+
0, 0, 0, 1
|
|
53
|
+
]
|
|
54
|
+
t.deepEqual(obs, exp)
|
|
74
55
|
rotation = [0, 0, 1, 0]
|
|
75
56
|
|
|
76
57
|
rotation = [0, 0, -1, 0.523599]
|
|
77
58
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
78
|
-
exp =
|
|
79
|
-
|
|
59
|
+
exp = [
|
|
60
|
+
0.8660252915835662, -0.5000001943375613, 0, 0,
|
|
61
|
+
0.5000001943375613, 0.8660252915835662, 0, 0,
|
|
62
|
+
0, 0, 1, 0,
|
|
63
|
+
0, 0, 0, 1
|
|
64
|
+
]
|
|
65
|
+
t.deepEqual(obs, exp)
|
|
80
66
|
rotation = [0, 0, 1, 0]
|
|
81
67
|
|
|
82
68
|
rotation = [1, 0, 0, 5.27]
|
|
83
69
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
84
|
-
exp =
|
|
85
|
-
|
|
70
|
+
exp = [
|
|
71
|
+
1, 0, 0, 0,
|
|
72
|
+
0, 0.5291606082056949, -0.8485216854762045, 0,
|
|
73
|
+
0, 0.8485216854762045, 0.5291606082056949, 0,
|
|
74
|
+
0, 0, 0, 1
|
|
75
|
+
]
|
|
76
|
+
t.deepEqual(obs, exp)
|
|
86
77
|
rotation = [0, 0, 1, 0]
|
|
87
78
|
|
|
88
79
|
rotation = [0.0, 0.707, 0.707, 0.9]
|
|
89
80
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
90
|
-
exp =
|
|
91
|
-
|
|
81
|
+
exp = [
|
|
82
|
+
0.6216099682706644, 0.5538957696834953, -0.5538957696834953, 0,
|
|
83
|
+
-0.5538957696834953, 0.8108049841353322, 0.18919501586466775, 0,
|
|
84
|
+
0.5538957696834953, 0.18919501586466775, 0.8108049841353322, 0,
|
|
85
|
+
0, 0, 0, 1
|
|
86
|
+
]
|
|
87
|
+
t.deepEqual(obs, exp)
|
|
92
88
|
rotation = [0, 0, 1, 0]
|
|
93
89
|
|
|
94
90
|
rotation = [0.0, 0.0, 0.0, 1.57]
|
|
95
91
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
96
|
-
exp =
|
|
97
|
-
t.
|
|
92
|
+
exp = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
|
|
93
|
+
t.deepEqual(obs, exp)
|
|
98
94
|
rotation = [0, 0, 1, 0]
|
|
99
95
|
|
|
100
96
|
// COMBINATIONS
|
|
101
97
|
scale = [0.91, 0.6, 0.3]
|
|
102
98
|
translation = [0.8, -0.65, 0.5]
|
|
103
99
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
104
|
-
exp =
|
|
105
|
-
t.
|
|
100
|
+
exp = [0.91, 0, 0, 0, 0, 0.6, 0, 0, 0, 0, 0.3, 0, 0.8, -0.65, 0.5, 1]
|
|
101
|
+
t.deepEqual(obs, exp)
|
|
106
102
|
scale = [1, 1, 1]
|
|
107
103
|
translation = [0, 0, 0]
|
|
108
104
|
|
|
109
105
|
rotation = [0.0, 0.0, -1.0, 0.523599]
|
|
110
106
|
translation = [-0.25, 0.75, 0.0]
|
|
111
107
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
112
|
-
exp =
|
|
113
|
-
|
|
108
|
+
exp = [
|
|
109
|
+
0.8660252915835662, -0.5000001943375613, 0, 0,
|
|
110
|
+
0.5000001943375613, 0.8660252915835662, 0, 0,
|
|
111
|
+
0, 0, 1, 0,
|
|
112
|
+
-0.25, 0.75, 0, 1
|
|
113
|
+
]
|
|
114
|
+
t.deepEqual(obs, exp)
|
|
114
115
|
rotation = [0, 0, 1, 0]
|
|
115
116
|
translation = [0, 0, 0]
|
|
116
117
|
|
|
@@ -118,8 +119,13 @@ test('createTransform returns expected transform matrix', (t) => {
|
|
|
118
119
|
rotation = [0, 1, 0, 1.57079]
|
|
119
120
|
translation = [0.00303999, -0.898843, 0.049247]
|
|
120
121
|
obs = createTransform(center, rotation, scale, scaleOrientation, translation)
|
|
121
|
-
exp =
|
|
122
|
-
|
|
122
|
+
exp = [
|
|
123
|
+
0.000006326794896668469, 0, -0.9999999999799858, 0,
|
|
124
|
+
0, 1, 0, 0,
|
|
125
|
+
0.9999999999799858, 0, 0.000006326794896668469, 0,
|
|
126
|
+
0.09181701923155557, -0.898843, -0.04560940909261213, 1
|
|
127
|
+
]
|
|
128
|
+
t.deepEqual(obs, exp)
|
|
123
129
|
center = [0, 0, 0]
|
|
124
130
|
rotation = [0, 0, 1, 0]
|
|
125
131
|
translation = [0, 0, 0]
|
package/tests/helpers/Matrix4.js
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
const Vector3 = require('./Vector3')
|
|
2
|
-
const Rotation4 = require('./Rotation4')
|
|
3
|
-
|
|
4
|
-
function Matrix4 () {
|
|
5
|
-
if (arguments.length) {
|
|
6
|
-
this[0] = arguments[0]
|
|
7
|
-
this[1] = arguments[1]
|
|
8
|
-
this[2] = arguments[2]
|
|
9
|
-
this[3] = arguments[3]
|
|
10
|
-
this[4] = arguments[4]
|
|
11
|
-
this[5] = arguments[5]
|
|
12
|
-
this[6] = arguments[6]
|
|
13
|
-
this[7] = arguments[7]
|
|
14
|
-
this[8] = arguments[8]
|
|
15
|
-
this[9] = arguments[9]
|
|
16
|
-
this[10] = arguments[10]
|
|
17
|
-
this[11] = arguments[11]
|
|
18
|
-
this[12] = arguments[12]
|
|
19
|
-
this[13] = arguments[13]
|
|
20
|
-
this[14] = arguments[14]
|
|
21
|
-
this[15] = arguments[15]
|
|
22
|
-
} else {
|
|
23
|
-
this.identity()
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
Matrix4.prototype = {
|
|
28
|
-
constructor: Matrix4,
|
|
29
|
-
order: 4,
|
|
30
|
-
length: 16,
|
|
31
|
-
equals: function (matrix) {
|
|
32
|
-
return this[0] === matrix[0] &&
|
|
33
|
-
this[1] === matrix[1] &&
|
|
34
|
-
this[2] === matrix[2] &&
|
|
35
|
-
this[3] === matrix[3] &&
|
|
36
|
-
this[4] === matrix[4] &&
|
|
37
|
-
this[5] === matrix[5] &&
|
|
38
|
-
this[6] === matrix[6] &&
|
|
39
|
-
this[7] === matrix[7] &&
|
|
40
|
-
this[8] === matrix[8] &&
|
|
41
|
-
this[9] === matrix[9] &&
|
|
42
|
-
this[10] === matrix[10] &&
|
|
43
|
-
this[11] === matrix[11] &&
|
|
44
|
-
this[12] === matrix[12] &&
|
|
45
|
-
this[13] === matrix[13] &&
|
|
46
|
-
this[14] === matrix[14] &&
|
|
47
|
-
this[15] === matrix[15]
|
|
48
|
-
},
|
|
49
|
-
set: function (translation, rotation, scale, scaleOrientation, center) {
|
|
50
|
-
translation = new Vector3(translation[0], translation[1], translation[2])
|
|
51
|
-
rotation = new Rotation4(rotation[0], rotation[1], rotation[2], rotation[3])
|
|
52
|
-
scale = new Vector3(scale[0], scale[1], scale[2])
|
|
53
|
-
scaleOrientation = new Rotation4(scaleOrientation[0], scaleOrientation[1], scaleOrientation[2], scaleOrientation[3])
|
|
54
|
-
center = new Vector3(center[0], center[1], center[2])
|
|
55
|
-
|
|
56
|
-
switch (arguments.length) {
|
|
57
|
-
case 0: {
|
|
58
|
-
this.identity()
|
|
59
|
-
break
|
|
60
|
-
}
|
|
61
|
-
case 1: {
|
|
62
|
-
if (translation === null) translation = Vector3.Zero
|
|
63
|
-
|
|
64
|
-
this.identity()
|
|
65
|
-
this.translate(translation)
|
|
66
|
-
break
|
|
67
|
-
}
|
|
68
|
-
case 2: {
|
|
69
|
-
if (translation === null) translation = Vector3.Zero
|
|
70
|
-
if (rotation === null) rotation = Rotation4.Identity
|
|
71
|
-
|
|
72
|
-
this.identity()
|
|
73
|
-
this.translate(translation)
|
|
74
|
-
|
|
75
|
-
if (!rotation.equals(Rotation4.Identity)) this.rotate(rotation)
|
|
76
|
-
|
|
77
|
-
break
|
|
78
|
-
}
|
|
79
|
-
case 3: {
|
|
80
|
-
if (translation === null) translation = Vector3.Zero
|
|
81
|
-
if (rotation === null) rotation = Rotation4.Identity
|
|
82
|
-
if (scale === null) scale = Vector3.One
|
|
83
|
-
|
|
84
|
-
this.identity()
|
|
85
|
-
this.translate(translation)
|
|
86
|
-
|
|
87
|
-
if (!rotation.equals(Rotation4.Identity)) this.rotate(rotation)
|
|
88
|
-
|
|
89
|
-
if (!scale.equals(Vector3.One)) this.scale(scale)
|
|
90
|
-
|
|
91
|
-
break
|
|
92
|
-
}
|
|
93
|
-
case 4: {
|
|
94
|
-
if (translation === null) translation = Vector3.Zero
|
|
95
|
-
if (rotation === null) rotation = Rotation4.Identity
|
|
96
|
-
if (scale === null) scale = Vector3.One
|
|
97
|
-
if (scaleOrientation === null) scaleOrientation = Rotation4.Identity
|
|
98
|
-
|
|
99
|
-
this.identity()
|
|
100
|
-
this.translate(translation)
|
|
101
|
-
|
|
102
|
-
if (!rotation.equals(Rotation4.Identity)) this.rotate(rotation)
|
|
103
|
-
|
|
104
|
-
if (!scale.equals(Vector3.One)) {
|
|
105
|
-
const hasScaleOrientation = !scaleOrientation.equals(Rotation4.Identity)
|
|
106
|
-
|
|
107
|
-
if (hasScaleOrientation) {
|
|
108
|
-
this.rotate(scaleOrientation)
|
|
109
|
-
this.scale(scale)
|
|
110
|
-
this.rotate(Rotation4.inverse(scaleOrientation))
|
|
111
|
-
} else {
|
|
112
|
-
this.scale(scale)
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
break
|
|
116
|
-
}
|
|
117
|
-
case 5: {
|
|
118
|
-
if (translation === null) translation = Vector3.Zero
|
|
119
|
-
if (rotation === null) rotation = Rotation4.Identity
|
|
120
|
-
if (scale === null) scale = Vector3.One
|
|
121
|
-
if (scaleOrientation === null) scaleOrientation = Rotation4.Identity
|
|
122
|
-
if (center === null) center = Vector3.Zero
|
|
123
|
-
|
|
124
|
-
// P' = T * C * R * SR * S * -SR * -C * P
|
|
125
|
-
this.identity()
|
|
126
|
-
this.translate(translation)
|
|
127
|
-
|
|
128
|
-
const hasCenter = !center.equals(Vector3.Zero)
|
|
129
|
-
|
|
130
|
-
if (hasCenter) this.translate(center)
|
|
131
|
-
|
|
132
|
-
if (!rotation.equals(Rotation4.Identity)) this.rotate(rotation)
|
|
133
|
-
|
|
134
|
-
if (!scale.equals(Vector3.One)) {
|
|
135
|
-
if (!scaleOrientation.equals(Rotation4.Identity)) {
|
|
136
|
-
this.rotate(scaleOrientation)
|
|
137
|
-
this.scale(scale)
|
|
138
|
-
this.rotate(Rotation4.inverse(scaleOrientation))
|
|
139
|
-
} else {
|
|
140
|
-
this.scale(scale)
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (hasCenter) this.translate(Vector3.negate(center))
|
|
145
|
-
|
|
146
|
-
break
|
|
147
|
-
}
|
|
148
|
-
case 16: {
|
|
149
|
-
this[0] = arguments[0]
|
|
150
|
-
this[1] = arguments[1]
|
|
151
|
-
this[2] = arguments[2]
|
|
152
|
-
this[3] = arguments[3]
|
|
153
|
-
this[4] = arguments[4]
|
|
154
|
-
this[5] = arguments[5]
|
|
155
|
-
this[6] = arguments[6]
|
|
156
|
-
this[7] = arguments[7]
|
|
157
|
-
this[8] = arguments[8]
|
|
158
|
-
this[9] = arguments[9]
|
|
159
|
-
this[10] = arguments[10]
|
|
160
|
-
this[11] = arguments[11]
|
|
161
|
-
this[12] = arguments[12]
|
|
162
|
-
this[13] = arguments[13]
|
|
163
|
-
this[14] = arguments[14]
|
|
164
|
-
this[15] = arguments[15]
|
|
165
|
-
break
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return this
|
|
170
|
-
},
|
|
171
|
-
setRotation: function (rotation) {
|
|
172
|
-
return this.setQuaternion(rotation.value)
|
|
173
|
-
},
|
|
174
|
-
setQuaternion: function (quaternion) {
|
|
175
|
-
const x = quaternion.x
|
|
176
|
-
const y = quaternion.y
|
|
177
|
-
const z = quaternion.z
|
|
178
|
-
const w = quaternion.w
|
|
179
|
-
const A = y * y
|
|
180
|
-
const B = z * z
|
|
181
|
-
const C = x * y
|
|
182
|
-
const D = z * w
|
|
183
|
-
const E = z * x
|
|
184
|
-
const F = y * w
|
|
185
|
-
const G = x * x
|
|
186
|
-
const H = y * z
|
|
187
|
-
const I = x * w
|
|
188
|
-
|
|
189
|
-
this[0] = 1 - 2 * (A + B)
|
|
190
|
-
this[1] = 2 * (C + D)
|
|
191
|
-
this[2] = 2 * (E - F)
|
|
192
|
-
this[3] = 0
|
|
193
|
-
this[4] = 2 * (C - D)
|
|
194
|
-
this[5] = 1 - 2 * (B + G)
|
|
195
|
-
this[6] = 2 * (H + I)
|
|
196
|
-
this[7] = 0
|
|
197
|
-
this[8] = 2 * (E + F)
|
|
198
|
-
this[9] = 2 * (H - I)
|
|
199
|
-
this[10] = 1 - 2 * (A + G)
|
|
200
|
-
this[11] = 0
|
|
201
|
-
this[12] = 0
|
|
202
|
-
this[13] = 0
|
|
203
|
-
this[14] = 0
|
|
204
|
-
this[15] = 1
|
|
205
|
-
|
|
206
|
-
return this
|
|
207
|
-
},
|
|
208
|
-
multLeft: function (matrix) {
|
|
209
|
-
const a00 = this[0]
|
|
210
|
-
const a01 = this[1]
|
|
211
|
-
const a02 = this[2]
|
|
212
|
-
const a03 = this[3]
|
|
213
|
-
const a04 = this[4]
|
|
214
|
-
const a05 = this[5]
|
|
215
|
-
const a06 = this[6]
|
|
216
|
-
const a07 = this[7]
|
|
217
|
-
const a08 = this[8]
|
|
218
|
-
const a09 = this[9]
|
|
219
|
-
const a10 = this[10]
|
|
220
|
-
const a11 = this[11]
|
|
221
|
-
const a12 = this[12]
|
|
222
|
-
const a13 = this[13]
|
|
223
|
-
const a14 = this[14]
|
|
224
|
-
const a15 = this[15]
|
|
225
|
-
const b00 = matrix[0]
|
|
226
|
-
const b01 = matrix[1]
|
|
227
|
-
const b02 = matrix[2]
|
|
228
|
-
const b03 = matrix[3]
|
|
229
|
-
const b04 = matrix[4]
|
|
230
|
-
const b05 = matrix[5]
|
|
231
|
-
const b06 = matrix[6]
|
|
232
|
-
const b07 = matrix[7]
|
|
233
|
-
const b08 = matrix[8]
|
|
234
|
-
const b09 = matrix[9]
|
|
235
|
-
const b10 = matrix[10]
|
|
236
|
-
const b11 = matrix[11]
|
|
237
|
-
const b12 = matrix[12]
|
|
238
|
-
const b13 = matrix[13]
|
|
239
|
-
const b14 = matrix[14]
|
|
240
|
-
const b15 = matrix[15]
|
|
241
|
-
|
|
242
|
-
this[0] = a00 * b00 + a04 * b01 + a08 * b02 + a12 * b03
|
|
243
|
-
this[1] = a01 * b00 + a05 * b01 + a09 * b02 + a13 * b03
|
|
244
|
-
this[2] = a02 * b00 + a06 * b01 + a10 * b02 + a14 * b03
|
|
245
|
-
this[3] = a03 * b00 + a07 * b01 + a11 * b02 + a15 * b03
|
|
246
|
-
this[4] = a00 * b04 + a04 * b05 + a08 * b06 + a12 * b07
|
|
247
|
-
this[5] = a01 * b04 + a05 * b05 + a09 * b06 + a13 * b07
|
|
248
|
-
this[6] = a02 * b04 + a06 * b05 + a10 * b06 + a14 * b07
|
|
249
|
-
this[7] = a03 * b04 + a07 * b05 + a11 * b06 + a15 * b07
|
|
250
|
-
this[8] = a00 * b08 + a04 * b09 + a08 * b10 + a12 * b11
|
|
251
|
-
this[9] = a01 * b08 + a05 * b09 + a09 * b10 + a13 * b11
|
|
252
|
-
this[10] = a02 * b08 + a06 * b09 + a10 * b10 + a14 * b11
|
|
253
|
-
this[11] = a03 * b08 + a07 * b09 + a11 * b10 + a15 * b11
|
|
254
|
-
this[12] = a00 * b12 + a04 * b13 + a08 * b14 + a12 * b15
|
|
255
|
-
this[13] = a01 * b12 + a05 * b13 + a09 * b14 + a13 * b15
|
|
256
|
-
this[14] = a02 * b12 + a06 * b13 + a10 * b14 + a14 * b15
|
|
257
|
-
this[15] = a03 * b12 + a07 * b13 + a11 * b14 + a15 * b15
|
|
258
|
-
|
|
259
|
-
return this
|
|
260
|
-
},
|
|
261
|
-
multRight: function (matrix) {
|
|
262
|
-
const a00 = this[0]
|
|
263
|
-
const a01 = this[1]
|
|
264
|
-
const a02 = this[2]
|
|
265
|
-
const a03 = this[3]
|
|
266
|
-
const a04 = this[4]
|
|
267
|
-
const a05 = this[5]
|
|
268
|
-
const a06 = this[6]
|
|
269
|
-
const a07 = this[7]
|
|
270
|
-
const a08 = this[8]
|
|
271
|
-
const a09 = this[9]
|
|
272
|
-
const a10 = this[10]
|
|
273
|
-
const a11 = this[11]
|
|
274
|
-
const a12 = this[12]
|
|
275
|
-
const a13 = this[13]
|
|
276
|
-
const a14 = this[14]
|
|
277
|
-
const a15 = this[15]
|
|
278
|
-
const b00 = matrix[0]
|
|
279
|
-
const b01 = matrix[1]
|
|
280
|
-
const b02 = matrix[2]
|
|
281
|
-
const b03 = matrix[3]
|
|
282
|
-
const b04 = matrix[4]
|
|
283
|
-
const b05 = matrix[5]
|
|
284
|
-
const b06 = matrix[6]
|
|
285
|
-
const b07 = matrix[7]
|
|
286
|
-
const b08 = matrix[8]
|
|
287
|
-
const b09 = matrix[9]
|
|
288
|
-
const b10 = matrix[10]
|
|
289
|
-
const b11 = matrix[11]
|
|
290
|
-
const b12 = matrix[12]
|
|
291
|
-
const b13 = matrix[13]
|
|
292
|
-
const b14 = matrix[14]
|
|
293
|
-
const b15 = matrix[15]
|
|
294
|
-
|
|
295
|
-
this[0] = a00 * b00 + a01 * b04 + a02 * b08 + a03 * b12
|
|
296
|
-
this[1] = a00 * b01 + a01 * b05 + a02 * b09 + a03 * b13
|
|
297
|
-
this[2] = a00 * b02 + a01 * b06 + a02 * b10 + a03 * b14
|
|
298
|
-
this[3] = a00 * b03 + a01 * b07 + a02 * b11 + a03 * b15
|
|
299
|
-
this[4] = a04 * b00 + a05 * b04 + a06 * b08 + a07 * b12
|
|
300
|
-
this[5] = a04 * b01 + a05 * b05 + a06 * b09 + a07 * b13
|
|
301
|
-
this[6] = a04 * b02 + a05 * b06 + a06 * b10 + a07 * b14
|
|
302
|
-
this[7] = a04 * b03 + a05 * b07 + a06 * b11 + a07 * b15
|
|
303
|
-
this[8] = a08 * b00 + a09 * b04 + a10 * b08 + a11 * b12
|
|
304
|
-
this[9] = a08 * b01 + a09 * b05 + a10 * b09 + a11 * b13
|
|
305
|
-
this[10] = a08 * b02 + a09 * b06 + a10 * b10 + a11 * b14
|
|
306
|
-
this[11] = a08 * b03 + a09 * b07 + a10 * b11 + a11 * b15
|
|
307
|
-
this[12] = a12 * b00 + a13 * b04 + a14 * b08 + a15 * b12
|
|
308
|
-
this[13] = a12 * b01 + a13 * b05 + a14 * b09 + a15 * b13
|
|
309
|
-
this[14] = a12 * b02 + a13 * b06 + a14 * b10 + a15 * b14
|
|
310
|
-
this[15] = a12 * b03 + a13 * b07 + a14 * b11 + a15 * b15
|
|
311
|
-
|
|
312
|
-
return this
|
|
313
|
-
},
|
|
314
|
-
identity: function () {
|
|
315
|
-
this[0] = 1
|
|
316
|
-
this[1] = 0
|
|
317
|
-
this[2] = 0
|
|
318
|
-
this[3] = 0
|
|
319
|
-
this[4] = 0
|
|
320
|
-
this[5] = 1
|
|
321
|
-
this[6] = 0
|
|
322
|
-
this[7] = 0
|
|
323
|
-
this[8] = 0
|
|
324
|
-
this[9] = 0
|
|
325
|
-
this[10] = 1
|
|
326
|
-
this[11] = 0
|
|
327
|
-
this[12] = 0
|
|
328
|
-
this[13] = 0
|
|
329
|
-
this[14] = 0
|
|
330
|
-
this[15] = 1
|
|
331
|
-
},
|
|
332
|
-
translate: function (translation) {
|
|
333
|
-
const x = translation.x
|
|
334
|
-
const y = translation.y
|
|
335
|
-
const z = translation.z
|
|
336
|
-
|
|
337
|
-
this[12] += this[0] * x + this[4] * y + this[8] * z
|
|
338
|
-
this[13] += this[1] * x + this[5] * y + this[9] * z
|
|
339
|
-
this[14] += this[2] * x + this[6] * y + this[10] * z
|
|
340
|
-
|
|
341
|
-
return this
|
|
342
|
-
},
|
|
343
|
-
rotate: function (rotation) {
|
|
344
|
-
this.multLeft(rotateMatrix.setQuaternion(rotation.value))
|
|
345
|
-
|
|
346
|
-
return this
|
|
347
|
-
},
|
|
348
|
-
scale: function (scale) {
|
|
349
|
-
const x = scale.x
|
|
350
|
-
const y = scale.y
|
|
351
|
-
const z = scale.z
|
|
352
|
-
|
|
353
|
-
this[0] *= x
|
|
354
|
-
this[4] *= y
|
|
355
|
-
this[8] *= z
|
|
356
|
-
|
|
357
|
-
this[1] *= x
|
|
358
|
-
this[5] *= y
|
|
359
|
-
this[9] *= z
|
|
360
|
-
|
|
361
|
-
this[2] *= x
|
|
362
|
-
this[6] *= y
|
|
363
|
-
this[10] *= z
|
|
364
|
-
|
|
365
|
-
return this
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
const rotateMatrix = new Matrix4()
|
|
370
|
-
|
|
371
|
-
module.exports = Matrix4
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
function Quaternion (x, y, z, w) {
|
|
2
|
-
this.x = x
|
|
3
|
-
this.y = y
|
|
4
|
-
this.z = z
|
|
5
|
-
this.w = w
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
Quaternion.prototype = {
|
|
9
|
-
constructor: Quaternion,
|
|
10
|
-
length: 4,
|
|
11
|
-
set: function (x, y, z, w) {
|
|
12
|
-
this.x = x
|
|
13
|
-
this.y = y
|
|
14
|
-
this.z = z
|
|
15
|
-
this.w = w
|
|
16
|
-
return this
|
|
17
|
-
},
|
|
18
|
-
equals: function (quat) {
|
|
19
|
-
return this.x === quat.x && this.y === quat.y && this.z === quat.z && this.w === quat.w
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
module.exports = Quaternion
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
const Vector3 = require('./Vector3')
|
|
2
|
-
const Quaternion = require('./Quaternion')
|
|
3
|
-
|
|
4
|
-
const interval = (value, low, high) => {
|
|
5
|
-
if (value >= high) return ((value - low) % (high - low)) + low
|
|
6
|
-
|
|
7
|
-
if (value < low) return ((value - high) % (high - low)) + high
|
|
8
|
-
|
|
9
|
-
return value
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function Rotation4 (x, y, z, angle) {
|
|
13
|
-
this.x_ = 0
|
|
14
|
-
this.y_ = 0
|
|
15
|
-
this.z_ = 1
|
|
16
|
-
this.angle_ = 0
|
|
17
|
-
|
|
18
|
-
switch (arguments.length) {
|
|
19
|
-
case 0: {
|
|
20
|
-
this.value = new Quaternion(0, 0, 0, 1)
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
case 1: {
|
|
24
|
-
this.value = arguments[0]
|
|
25
|
-
this.update()
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
case 2: {
|
|
29
|
-
const arg0 = arguments[0]
|
|
30
|
-
const arg1 = arguments[1]
|
|
31
|
-
|
|
32
|
-
this.value = new Quaternion(0, 0, 0, 1)
|
|
33
|
-
|
|
34
|
-
if (arg1 instanceof Vector3) return this.setFromToVec(arg0, arg1)
|
|
35
|
-
|
|
36
|
-
this.set(arg0.x, arg0.y, arg0.z, arg1)
|
|
37
|
-
|
|
38
|
-
return
|
|
39
|
-
}
|
|
40
|
-
case 4: {
|
|
41
|
-
this.value = new Quaternion(0, 0, 0, 1)
|
|
42
|
-
this.set(x, y, z, angle)
|
|
43
|
-
break
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
Rotation4.prototype = {
|
|
49
|
-
constructor: Rotation4,
|
|
50
|
-
length: 4,
|
|
51
|
-
update: function () {
|
|
52
|
-
const rotation = this.get()
|
|
53
|
-
|
|
54
|
-
this.x_ = rotation.x
|
|
55
|
-
this.y_ = rotation.y
|
|
56
|
-
this.z_ = rotation.z
|
|
57
|
-
this.angle_ = rotation.w
|
|
58
|
-
|
|
59
|
-
return this
|
|
60
|
-
},
|
|
61
|
-
set: function (x, y, z, angle) {
|
|
62
|
-
this.x_ = x
|
|
63
|
-
this.y_ = y
|
|
64
|
-
this.z_ = z
|
|
65
|
-
this.angle_ = angle
|
|
66
|
-
|
|
67
|
-
let scale = Math.hypot(x, y, z)
|
|
68
|
-
|
|
69
|
-
if (scale === 0) {
|
|
70
|
-
this.value.set(0, 0, 0, 1)
|
|
71
|
-
return this
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Calculate quaternion
|
|
75
|
-
|
|
76
|
-
const halfTheta = interval(angle / 2, 0, Math.PI)
|
|
77
|
-
scale = Math.sin(halfTheta) / scale
|
|
78
|
-
|
|
79
|
-
this.value.set(x * scale, y * scale, z * scale, Math.cos(halfTheta))
|
|
80
|
-
return this
|
|
81
|
-
},
|
|
82
|
-
equals: function (rot) {
|
|
83
|
-
return this.value.equals(rot.value)
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
Object.assign(Rotation4,
|
|
88
|
-
{
|
|
89
|
-
Identity: new Rotation4()
|
|
90
|
-
}
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
module.exports = Rotation4
|
package/tests/helpers/Vector3.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
function Vector3 (x, y, z) {
|
|
2
|
-
this.x = x
|
|
3
|
-
this.y = y
|
|
4
|
-
this.z = z
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
Vector3.prototype = {
|
|
8
|
-
constructor: Vector3,
|
|
9
|
-
length: 3,
|
|
10
|
-
equals: function (vector) {
|
|
11
|
-
return this.x === vector.x && this.y === vector.y && this.z === vector.z
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
Object.assign(Vector3, {
|
|
16
|
-
Zero: new Vector3(0, 0, 0),
|
|
17
|
-
One: new Vector3(1, 1, 1),
|
|
18
|
-
negate: (vector) => {
|
|
19
|
-
const copy = Object.create(Vector3.prototype)
|
|
20
|
-
copy.x = -vector.x
|
|
21
|
-
copy.y = -vector.y
|
|
22
|
-
copy.z = -vector.z
|
|
23
|
-
return copy
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
module.exports = Vector3
|