]> git.tdb.fi Git - libs/gl.git/blobdiff - source/transform.cpp
Move transform loading to ObjectInstance
[libs/gl.git] / source / transform.cpp
index 78c3fb0f6bbbe92e16eeda3d0a7379de90d0cd09..9660c2c43fd15a1ea0af01ba953462e36fc6cc67 100644 (file)
@@ -1,34 +1,79 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <GL/gl.h>
 #include "transform.h"
 
 namespace Msp {
 namespace GL {
 
-void translate(float x, float y, float z)
+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<Transform>(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)
 {
-       glTranslatef(x, y, z);
+       obj.euler = AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z));
 }
 
-void rotate(float a, float x, float y, float z)
+void Transform::Loader::rotation(float a, float x, float y, float z)
 {
-       glRotatef(a, x, y, 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));
 }
 
-void scale(float x, float y, float z)
+void Transform::Loader::scale_uniform(float s)
 {
-       glScalef(x, y, z);
+       obj.scale = Vector3(s, s, s);
 }
 
-void scale_uniform(float s)
+void Transform::Loader::scale(float x, float y, float z)
 {
-       scale(s, s, s);
+       obj.scale = Vector3(x, y, z);
 }
 
 } // namespace GL