Skip to content

Commit 41c5834

Browse files
Move Quaternion class to MaterialXRender
This changelist moves the Quaternion class from MaterialXCore to MaterialXRender, clarifying its role as a camera/render helper class rather than a core MaterialX data type.
1 parent 3055109 commit 41c5834

File tree

6 files changed

+79
-79
lines changed

6 files changed

+79
-79
lines changed

source/JsMaterialX/JsMaterialXCore/JsTypes.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,6 @@ EMSCRIPTEN_BINDINGS(types)
7878
.constructor<float, float, float, float>()
7979
BIND_VECTOR_SUBCLASS(mx::Vector4);
8080

81-
ems::class_<mx::Quaternion, ems::base<mx::VectorBase>>("Quaternion")
82-
.constructor<>()
83-
.constructor<float, float, float, float>()
84-
BIND_VECTOR_SUBCLASS(mx::Vector4)
85-
.function("multiplyQuaternion", ems::optional_override([](const mx::Quaternion &self, const mx::Quaternion &q) { return self * q; }))
86-
.function("getNormalized", ems::optional_override([](mx::Quaternion &self) { return self.getNormalized(); }))
87-
.class_function("createFromAxisAngle", &mx::Quaternion::createFromAxisAngle)
88-
.class_property("IDENTITY", &mx::Quaternion::IDENTITY);
89-
9081
ems::class_<mx::Color3, ems::base<mx::VectorBase>>("Color3")
9182
.constructor<>()
9283
.constructor<float, float, float>()
@@ -123,7 +114,6 @@ EMSCRIPTEN_BINDINGS(types)
123114
.class_function("createRotationX", &mx::Matrix44::createRotationX)
124115
.class_function("createRotationY", &mx::Matrix44::createRotationY)
125116
.class_function("createRotationZ", &mx::Matrix44::createRotationZ)
126-
.class_function("createRotation", &mx::Matrix44::createRotation)
127117
.class_property("IDENTITY", &mx::Matrix44::IDENTITY);
128118

129119
ems::constant("DEFAULT_TYPE_STRING", mx::DEFAULT_TYPE_STRING);

source/MaterialXCore/Types.cpp

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ const Matrix44 Matrix44::IDENTITY(1, 0, 0, 0,
3636
0, 0, 1, 0,
3737
0, 0, 0, 1);
3838

39-
const Quaternion Quaternion::IDENTITY(0, 0, 0, 1);
40-
4139
//
4240
// Matrix33 methods
4341
//
@@ -270,22 +268,4 @@ Matrix44 Matrix44::createRotationZ(float angle)
270268
0.0f, 0.0f, 0.0f, 1.0f);
271269
}
272270

273-
Matrix44 Matrix44::createRotation(const Quaternion& q)
274-
{
275-
Vector3 xaxis(1 - 2 * (q[1] * q[1] + q[2] * q[2]),
276-
2 * (q[0] * q[1] + q[2] * q[3]),
277-
2 * (q[2] * q[0] - q[1] * q[3]));
278-
Vector3 yaxis(2 * (q[0] * q[1] - q[2] * q[3]),
279-
1 - 2 * (q[2] * q[2] + q[0] * q[0]),
280-
2 * (q[1] * q[2] + q[0] * q[3]));
281-
Vector3 zaxis(2 * (q[2] * q[0] + q[1] * q[3]),
282-
2 * (q[1] * q[2] - q[0] * q[3]),
283-
1 - 2 * (q[1] * q[1] + q[0] * q[0]));
284-
285-
return Matrix44(xaxis[0], xaxis[1], xaxis[2], 0.0f,
286-
yaxis[0], yaxis[1], yaxis[2], 0.0f,
287-
zaxis[0], zaxis[1], zaxis[2], 0.0f,
288-
0.0f, 0.0f, 0.0f, 1.0f);
289-
}
290-
291271
MATERIALX_NAMESPACE_END

source/MaterialXCore/Types.h

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -333,45 +333,6 @@ class MX_CORE_API Vector4 : public VectorN<Vector4, float, 4>
333333
}
334334
};
335335

336-
/// @class Quaternion
337-
/// A quaternion vector
338-
class MX_CORE_API Quaternion : public VectorN<Vector4, float, 4>
339-
{
340-
public:
341-
using VectorN<Vector4, float, 4>::VectorN;
342-
Quaternion() = default;
343-
Quaternion(float x, float y, float z, float w) :
344-
VectorN(Uninit{})
345-
{
346-
_arr = { x, y, z, w };
347-
}
348-
349-
Quaternion operator*(const Quaternion& q) const
350-
{
351-
return {
352-
_arr[0] * q._arr[3] + _arr[3] * q._arr[0] + _arr[1] * q._arr[2] - _arr[2] * q._arr[1],
353-
_arr[1] * q._arr[3] + _arr[3] * q._arr[1] + _arr[2] * q._arr[0] - _arr[0] * q._arr[2],
354-
_arr[2] * q._arr[3] + _arr[3] * q._arr[2] + _arr[0] * q._arr[1] - _arr[1] * q._arr[0],
355-
_arr[3] * q._arr[3] - _arr[0] * q._arr[0] - _arr[1] * q._arr[1] - _arr[2] * q._arr[2]
356-
};
357-
}
358-
359-
Quaternion getNormalized() const
360-
{
361-
float l = 1.f / getMagnitude() * (_arr[3] < 0 ? -1.f : 1.f); // after normalization, real part will be non-negative
362-
return { _arr[0] * l, _arr[1] * l, _arr[2] * l, _arr[3] * l };
363-
}
364-
365-
static Quaternion createFromAxisAngle(const Vector3& v, float a)
366-
{
367-
float s = std::sin(a * 0.5f);
368-
return Quaternion(v[0] * s, v[1] * s, v[2] * s, std::cos(a * 0.5f));
369-
}
370-
371-
public:
372-
static const Quaternion IDENTITY;
373-
};
374-
375336
/// @class Color3
376337
/// A three-component color value
377338
class MX_CORE_API Color3 : public VectorN<Color3, float, 3>
@@ -726,11 +687,6 @@ class MX_CORE_API Matrix44 : public MatrixN<Matrix44, float, 4>
726687
/// @param angle Angle in radians
727688
static Matrix44 createRotationZ(float angle);
728689

729-
/// Create a rotation matrix using a quaternion whose imaginary component is in the
730-
/// the supplied vectors xyz, and whose real component is in the fourth component, w.
731-
/// @param quaternion
732-
static Matrix44 createRotation(const Quaternion& quaternion);
733-
734690
/// @}
735691

736692
public:

source/MaterialXRender/Camera.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
#ifndef MATERIALX_CAMERA_H
77
#define MATERIALX_CAMERA_H
88

9-
#include <MaterialXRender/Export.h>
10-
11-
#include <MaterialXCore/Types.h>
9+
#include <MaterialXRender/Types.h>
1210

1311
MATERIALX_NAMESPACE_BEGIN
1412

@@ -144,7 +142,7 @@ class MX_RENDER_API Camera
144142
/// Return the arcball matrix.
145143
Matrix44 arcballMatrix() const
146144
{
147-
return Matrix44::createRotation(_arcballDelta * _arcballQuat);
145+
return (_arcballDelta * _arcballQuat).toMatrix();
148146
}
149147

150148
/// @}

source/MaterialXRender/Types.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// TM & (c) 2022 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd.
3+
// All rights reserved. See LICENSE.txt for license.
4+
//
5+
6+
#include <MaterialXRender/Types.h>
7+
8+
MATERIALX_NAMESPACE_BEGIN
9+
10+
const Quaternion Quaternion::IDENTITY(0, 0, 0, 1);
11+
12+
//
13+
// Quaternion methods
14+
//
15+
16+
Matrix44 Quaternion::toMatrix() const
17+
{
18+
Vector3 x(1.0f - 2.0f * (_arr[1] * _arr[1] + _arr[2] * _arr[2]),
19+
2.0f * (_arr[0] * _arr[1] + _arr[2] * _arr[3]),
20+
2.0f * (_arr[2] * _arr[0] - _arr[1] * _arr[3]));
21+
Vector3 y(2.0f * (_arr[0] * _arr[1] - _arr[2] * _arr[3]),
22+
1.0f - 2.0f * (_arr[2] * _arr[2] + _arr[0] * _arr[0]),
23+
2.0f * (_arr[1] * _arr[2] + _arr[0] * _arr[3]));
24+
Vector3 z(2.0f * (_arr[2] * _arr[0] + _arr[1] * _arr[3]),
25+
2.0f * (_arr[1] * _arr[2] - _arr[0] * _arr[3]),
26+
1.0f - 2.0f * (_arr[1] * _arr[1] + _arr[0] * _arr[0]));
27+
28+
return Matrix44(x[0], x[1], x[2], 0.0f,
29+
y[0], y[1], y[2], 0.0f,
30+
z[0], z[1], z[2], 0.0f,
31+
0.0f, 0.0f, 0.0f, 1.0f);
32+
}
33+
34+
MATERIALX_NAMESPACE_END

source/MaterialXRender/Types.h

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,53 @@
99
/// @file
1010
/// Data types for rendering functionality
1111

12-
#include <MaterialXCore/Types.h>
1312
#include <MaterialXRender/Export.h>
1413

14+
#include <MaterialXCore/Types.h>
15+
1516
MATERIALX_NAMESPACE_BEGIN
1617

18+
/// @class Quaternion
19+
/// A quaternion vector
20+
class MX_RENDER_API Quaternion : public VectorN<Vector4, float, 4>
21+
{
22+
public:
23+
using VectorN<Vector4, float, 4>::VectorN;
24+
Quaternion() = default;
25+
Quaternion(float x, float y, float z, float w) :
26+
VectorN(Uninit{})
27+
{
28+
_arr = { x, y, z, w };
29+
}
30+
31+
Quaternion operator*(const Quaternion& q) const
32+
{
33+
return {
34+
_arr[0] * q._arr[3] + _arr[3] * q._arr[0] + _arr[1] * q._arr[2] - _arr[2] * q._arr[1],
35+
_arr[1] * q._arr[3] + _arr[3] * q._arr[1] + _arr[2] * q._arr[0] - _arr[0] * q._arr[2],
36+
_arr[2] * q._arr[3] + _arr[3] * q._arr[2] + _arr[0] * q._arr[1] - _arr[1] * q._arr[0],
37+
_arr[3] * q._arr[3] - _arr[0] * q._arr[0] - _arr[1] * q._arr[1] - _arr[2] * q._arr[2]
38+
};
39+
}
40+
41+
Quaternion getNormalized() const
42+
{
43+
float l = 1.f / getMagnitude() * (_arr[3] < 0 ? -1.f : 1.f); // after normalization, real part will be non-negative
44+
return { _arr[0] * l, _arr[1] * l, _arr[2] * l, _arr[3] * l };
45+
}
46+
47+
static Quaternion createFromAxisAngle(const Vector3& v, float a)
48+
{
49+
float s = std::sin(a * 0.5f);
50+
return Quaternion(v[0] * s, v[1] * s, v[2] * s, std::cos(a * 0.5f));
51+
}
52+
53+
Matrix44 toMatrix() const;
54+
55+
public:
56+
static const Quaternion IDENTITY;
57+
};
58+
1759
/// @class Vector3d
1860
/// A vector of three floating-point values (double-precision)
1961
class MX_RENDER_API Vector3d : public VectorN<Vector3d, double, 3>

0 commit comments

Comments
 (0)