Nebula
Loading...
Searching...
No Matches
transform.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
10#include "core/types.h"
11#include "math/vec3.h"
12#include "math/quat.h"
13
14//------------------------------------------------------------------------------
15namespace Math
16{
18{
19public:
21 transform();
23 transform(const Math::vec3& pos, const Math::quat& rot = Math::quat(), const Math::vec3& scale = Math::_plus1);
25 void Set(const Math::vec3& pos, const Math::quat& rot, const Math::vec3& scale);
27 transform GetRelative(const transform& child);
28
29 static transform FromMat4(const Math::mat4& mat);
30
34};
35
36//------------------------------------------------------------------------------
39inline transform::transform() : position(0.0f), scale(1.0f)
40{
41 // empty
42}
43
44//------------------------------------------------------------------------------
47inline transform::transform(const Math::vec3& pos, const Math::quat& rot, const Math::vec3& inScale) :
48 position(pos),
49 rotation(rot),
50 scale(inScale)
51{
52 // empty
53}
54
55//------------------------------------------------------------------------------
58inline void
59transform::Set(const Math::vec3& pos, const Math::quat& rot, const Math::vec3& inScale)
60{
61 this->rotation = rot;
62 this->position = pos;
63 this->scale = inScale;
64}
65
66
67//------------------------------------------------------------------------------
70inline transform
72{
73 // this has many weird edge cases with scale, esp. negative
74 n_assert2(greater_all(child.scale, _zero) && greater_all(scale, _zero), "transform currently does not support negative scale");
75 transform result;
76 const vec3 invChildScale = reciprocal(child.scale);
77 result.scale = multiply(scale, invChildScale);
78 quat invChildRot = inverse(child.rotation);
79 result.rotation = invChildRot * rotation;
80 result.position = multiply(rotate(invChildRot, (position - child.position)), invChildScale);
81 return result;
82}
83
84//------------------------------------------------------------------------------
87inline transform
88operator*(const transform& a, const transform& b)
89{
90 // this has many weird edge cases with scale, esp. negative
91 n_assert2(greater_all(a.scale, _zero) && greater_all(b.scale, _zero), "transform currently does not support negative scale");
92 transform result;
93 // (a * b) applies b first and then a, the same order as mat4's operator*
94 result.rotation = a.rotation * b.rotation;
95 result.scale = multiply(a.scale, b.scale);
96 result.position = rotate(a.rotation, multiply(a.scale, b.position)) + a.position;
97 return result;
98}
99
100//------------------------------------------------------------------------------
103inline transform
104lerp(const transform& a, const transform& b, float t)
105{
106 return transform(lerp(a.position, b.position, t), normalize(slerp(a.rotation, b.rotation, t)), lerp(a.scale, b.scale, t));
107}
108
109//------------------------------------------------------------------------------
113inline point
114operator*(const transform& a, const point& b)
115{
116 return rotate(a.rotation, multiply(a.scale, b.vec)) + a.position;
117}
118
119//------------------------------------------------------------------------------
123inline vector
124operator*(const transform& a, const vector& b)
125{
126 return rotate(a.rotation, multiply(a.scale, b.vec));
127}
128
129
130//------------------------------------------------------------------------------
134inline transform
136{
137 transform trans;
138 Math::decompose(mat, trans.scale, trans.rotation, trans.position);
139 return trans;
140}
141
142}
Simple transform using position, quaternion, and scale.
Definition transform.h:18
Math::vec3 position
Definition transform.h:31
transform GetRelative(const transform &child)
get the relative transform from this to child, expressed as matrix result = inv(child) * this
Definition transform.h:71
Math::vec3 scale
Definition transform.h:33
Math::quat rotation
Definition transform.h:32
transform()
default constructor
Definition transform.h:39
void Set(const Math::vec3 &pos, const Math::quat &rot, const Math::vec3 &scale)
set content
Definition transform.h:59
static transform FromMat4(const Math::mat4 &mat)
Constructs from mat4.
Definition transform.h:135
#define n_assert2(exp, msg)
Definition debug.h:59
Different curves.
Definition angularpfeedbackloop.h:17
static const f32x4 _plus1
Definition vec3.h:31
__forceinline vec3 multiply(const vec3 &v0, const vec3 &v1)
Definition vec3.h:387
quat slerp(const quat &q1, const quat &q2, scalar t)
quat slerp TODO: rewrite using sse/avx
Definition quat.h:466
__forceinline vec3 reciprocal(const vec3 &v)
Definition vec3.h:369
void decompose(const mat4 &mat, vec3 &outScale, quat &outRotation, vec3 &outTranslation)
Definition mat4.cc:50
__forceinline plane normalize(const plane &p)
Definition plane.h:261
__forceinline float lerp(float x, float y, float l)
Linearly interpolate between 2 values: ret = x + l * (y - x).
Definition scalar.h:616
half operator*(half one, half two)
Definition half.h:123
__forceinline bool greater_all(const point &v0, const point &v1)
Definition point.h:441
vec3 rotate(quat const &q, vec3 const &v)
Rotate a vector by a quaternion.
Definition quat.h:550
__forceinline mat4 inverse(const mat4 &m)
Definition mat4.h:477
A 4x4 single point precision float matrix.
Definition mat4.h:49
Represents a 3D point in space.
Definition point.h:22
A quaternion is usually used to represent an orientation in 3D space.
Definition quat.h:30
A 3D vector.
Definition vec3.h:37
A vector is a 3D direction in space.
Definition vector.h:22