X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftransform.cpp;fp=source%2Ftransform.cpp;h=9660c2c43fd15a1ea0af01ba953462e36fc6cc67;hp=0000000000000000000000000000000000000000;hb=9e384cddaf641f25ce6714327e1b4fadfea4632d;hpb=8ed377139d48a6fc39eeed9f3494bbe41aed4107 diff --git a/source/transform.cpp b/source/transform.cpp new file mode 100644 index 00000000..9660c2c4 --- /dev/null +++ b/source/transform.cpp @@ -0,0 +1,80 @@ +#include "transform.h" + +namespace Msp { +namespace GL { + +Transform::Transform(): + position(0.0f, 0.0f, 0.0f), + euler(Angle::zero(), Angle::zero(), Angle::zero()), + scale(1.0f, 1.0f, 1.0f) +{ } + +void Transform::set_position(const Vector3 &p) +{ + position = p; +} + +void Transform::set_euler(const AngleVector3 &e) +{ + euler = e; +} + +void Transform::set_scale(const Vector3 &s) +{ + scale = s; +} + +Matrix Transform::to_matrix() const +{ + Matrix result; + result.translate(position); + result.rotate(euler.z, Vector3(0.0f, 0.0f, 1.0f)); + result.rotate(euler.y, Vector3(0.0f, 1.0f, 0.0f)); + result.rotate(euler.x, Vector3(1.0f, 0.0f, 0.0f)); + result.scale(scale); + return result; +} + + +Transform::Loader::Loader(Transform &t): + DataFile::ObjectLoader(t) +{ + add("position", &Loader::position); + add("euler", &Loader::euler); + add("rotation", &Loader::rotation); + add("scale_uniform", &Loader::scale_uniform); + add("scale", &Loader::scale); +} + +void Transform::Loader::position(float x, float y, float z) +{ + obj.position = Vector3(x, y, 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)); +} + +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(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(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(matrix(2, 1), matrix(1, 1)); +} + +void Transform::Loader::scale_uniform(float s) +{ + obj.scale = Vector3(s, s, s); +} + +void Transform::Loader::scale(float x, float y, float z) +{ + obj.scale = Vector3(x, y, z); +} + +} // namespace GL +} // namespace Msp