Transform::Transform():
position(0.0f, 0.0f, 0.0f),
euler(Angle::zero(), Angle::zero(), Angle::zero()),
- scale(1.0f, 1.0f, 1.0f)
+ scale(1.0f, 1.0f, 1.0f),
+ mask(NONE)
{ }
+Transform Transform::from_matrix(const Matrix &matrix)
+{
+ Transform trn;
+ trn.position = matrix.column(3).slice<3>(0);
+
+ trn.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
+ Matrix m = Matrix::rotation(-trn.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
+ trn.euler.y = Geometry::atan2<float>(m(2, 0), m(0, 0));
+ m = Matrix::rotation(-trn.euler.y, Vector3(0.0f, 1.0f, 0.0f))*m;
+ trn.euler.x = Geometry::atan2<float>(m(2, 1), m(1, 1));
+ m = Matrix::rotation(-trn.euler.x, Vector3(1.0f, 0.0f, 0.0f))*m;
+
+ trn.scale = Vector3(m(0, 0), m(1, 1), m(2, 2));
+
+ trn.mask = POSITION|EULER|SCALE;
+ return trn;
+}
+
void Transform::set_position(const Vector3 &p)
{
position = p;
+ mask = mask|POSITION;
}
void Transform::set_euler(const AngleVector3 &e)
{
euler = e;
+ mask = mask|EULER;
+}
+
+void Transform::set_rotation(const Angle &angle, const Vector3 &axis)
+{
+ euler = from_matrix(Matrix::rotation(angle, axis)).euler;
+ mask = mask|EULER;
+}
+
+void Transform::set_scale(float s)
+{
+ set_scale(Vector3(s, s, s));
}
void Transform::set_scale(const Vector3 &s)
{
scale = s;
+ mask = mask|SCALE;
}
Matrix Transform::to_matrix() const
Transform::Loader::Loader(Transform &t):
DataFile::ObjectLoader<Transform>(t)
{
+ add("position_x", &Loader::position_x);
+ add("position_y", &Loader::position_y);
+ add("position_z", &Loader::position_z);
add("position", &Loader::position);
+ add("euler_x", &Loader::euler_x);
+ add("euler_y", &Loader::euler_y);
+ add("euler_z", &Loader::euler_z);
add("euler", &Loader::euler);
add("rotation", &Loader::rotation);
- add("scale_uniform", &Loader::scale_uniform);
+ add("scale_x", &Loader::scale_x);
+ add("scale_y", &Loader::scale_y);
+ add("scale_z", &Loader::scale_z);
+ add("scale", &Loader::scale_uniform);
add("scale", &Loader::scale);
}
+void Transform::Loader::position_x(float x)
+{
+ obj.position.x = x;
+ obj.mask = obj.mask|POSITION_X;
+}
+
+void Transform::Loader::position_y(float y)
+{
+ obj.position.y = y;
+ obj.mask = obj.mask|POSITION_Y;
+}
+
+void Transform::Loader::position_z(float z)
+{
+ obj.position.z = z;
+ obj.mask = obj.mask|POSITION_Z;
+}
+
void Transform::Loader::position(float x, float y, float z)
{
- obj.position = Vector3(x, y, z);
+ obj.set_position(Vector3(x, y, z));
+}
+
+void Transform::Loader::euler_x(float x)
+{
+ obj.euler.x = Angle::from_degrees(x);
+ obj.mask = obj.mask|EULER_X;
+}
+
+void Transform::Loader::euler_y(float y)
+{
+ obj.euler.y = Angle::from_degrees(y);
+ obj.mask = obj.mask|EULER_Y;
+}
+
+void Transform::Loader::euler_z(float z)
+{
+ obj.euler.z = Angle::from_degrees(z);
+ obj.mask = obj.mask|EULER_Z;
}
void Transform::Loader::euler(float x, float y, float z)
{
- obj.euler = AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z));
+ obj.set_euler(AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z)));
}
void Transform::Loader::rotation(float a, float x, float y, float z)
{
- Matrix matrix = Matrix::rotation(Angle::from_degrees(a), Vector3(x, y, z));
- obj.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
- matrix = Matrix::rotation(-obj.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
- obj.euler.y = Geometry::atan2<float>(matrix(2, 0), matrix(0, 0));
- matrix = Matrix::rotation(-obj.euler.y, Vector3(0.0f, 1.0f, 0.0f))*matrix;
- obj.euler.x = Geometry::atan2<float>(matrix(2, 1), matrix(1, 1));
+ obj.set_rotation(Angle::from_degrees(a), Vector3(x, y, z));
+}
+
+void Transform::Loader::scale_x(float x)
+{
+ obj.scale.x = x;
+ obj.mask = obj.mask|SCALE_X;
+}
+
+void Transform::Loader::scale_y(float y)
+{
+ obj.scale.y = y;
+ obj.mask = obj.mask|SCALE_Y;
+}
+
+void Transform::Loader::scale_z(float z)
+{
+ obj.scale.z = z;
+ obj.mask = obj.mask|SCALE_Z;
}
void Transform::Loader::scale_uniform(float s)
{
- obj.scale = Vector3(s, s, s);
+ obj.set_scale(s);
}
void Transform::Loader::scale(float x, float y, float z)
{
- obj.scale = Vector3(x, y, z);
+ obj.set_scale(Vector3(x, y, z));
}
} // namespace GL