X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimation%2Ftransform.cpp;fp=source%2Fanimation%2Ftransform.cpp;h=b703a5b12e345863c03c533f782adcfa4e5b33be;hp=0000000000000000000000000000000000000000;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e diff --git a/source/animation/transform.cpp b/source/animation/transform.cpp new file mode 100644 index 00000000..b703a5b1 --- /dev/null +++ b/source/animation/transform.cpp @@ -0,0 +1,171 @@ +#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), + mask(NONE) +{ } + +Transform Transform::from_matrix(const Matrix &matrix) +{ + Transform trn; + trn.position = matrix.column(3).slice<3>(0); + + trn.euler.z = Geometry::atan2(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(-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(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 +{ + 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_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_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.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.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) +{ + 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.set_scale(s); +} + +void Transform::Loader::scale(float x, float y, float z) +{ + obj.set_scale(Vector3(x, y, z)); +} + +} // namespace GL +} // namespace Msp