+#include <msp/datafile/collection.h>
#include "keyframe.h"
+#include "pose.h"
+
+using namespace std;
namespace Msp {
namespace GL {
+// Avoid synthesizing RefPtr c'tor and d'tor in files including keyframe.h
+KeyFrame::KeyFrame()
+{ }
+
+KeyFrame::~KeyFrame()
+{ }
+
+void KeyFrame::set_transform(const Transform &t)
+{
+ transform = t;
+}
+
+void KeyFrame::set_matrix(const Matrix &m)
+{
+ transform = Transform::from_matrix(m);
+}
+
+void KeyFrame::set_uniform(const string &n, const AnimatedUniform &u)
+{
+ uniforms.erase(n);
+ uniforms.insert(UniformMap::value_type(n, u));
+}
+
+void KeyFrame::set_pose(const Pose &p)
+{
+ pose = &p;
+ pose.keep();
+}
+
+
+KeyFrame::AnimatedUniform::AnimatedUniform(unsigned s, float v0, float v1, float v2, float v3):
+ size(s)
+{
+ values[0] = v0;
+ values[1] = v1;
+ values[2] = v2;
+ values[3] = v3;
+}
+
+
KeyFrame::Loader::Loader(KeyFrame &k):
- DataFile::ObjectLoader<KeyFrame>(k)
+ DataFile::CollectionObjectLoader<KeyFrame>(k, 0)
+{
+ init();
+}
+
+KeyFrame::Loader::Loader(KeyFrame &k, Collection &c):
+ DataFile::CollectionObjectLoader<KeyFrame>(k, &c)
{
+ init();
+}
+
+void KeyFrame::Loader::init()
+{
+ add("pose", &Loader::pose);
+ add("pose", &Loader::pose_inline);
+ add("transform", &Loader::transform);
+ add("uniforms", &Loader::uniforms);
+
+ // Deprecated; use the transform statement instead
add("position", &Loader::position);
add("rotation", &Loader::rotation);
add("scaling", &Loader::scaling_uniform);
add("scaling", &Loader::scaling);
}
+void KeyFrame::Loader::pose(const string &n)
+{
+ obj.pose = &get_collection().get<Pose>(n);
+ obj.pose.keep();
+}
+
+void KeyFrame::Loader::pose_inline()
+{
+ RefPtr<Pose> p = new Pose;
+ load_sub(*p, get_collection());
+ obj.pose = p;
+}
+
void KeyFrame::Loader::position(float x, float y, float z)
{
- obj.matrix.translate(x, y, z);
+ obj.transform.set_position(Vector3(x, y, z));
}
void KeyFrame::Loader::rotation(float a, float x, float y, float z)
{
- obj.matrix.rotate_deg(a, x, y, z);
+ obj.transform.set_rotation(Transform::Angle::from_degrees(a), Vector3(x, y, z));
}
void KeyFrame::Loader::scaling_uniform(float s)
{
- obj.matrix.scale(s);
+ obj.transform.set_scale(s);
}
void KeyFrame::Loader::scaling(float x, float y, float z)
{
- obj.matrix.scale(x, y, z);
+ obj.transform.set_scale(Vector3(x, y, z));
+}
+
+void KeyFrame::Loader::transform()
+{
+ load_sub(obj.transform);
+}
+
+void KeyFrame::Loader::uniforms()
+{
+ UniformsLoader ldr(obj);
+ load_sub_with(ldr);
+}
+
+
+KeyFrame::UniformsLoader::UniformsLoader(KeyFrame &k):
+ DataFile::ObjectLoader<KeyFrame>(k)
+{
+ add("uniform", &UniformsLoader::uniform1f);
+ add("uniform", &UniformsLoader::uniform2f);
+ add("uniform", &UniformsLoader::uniform3f);
+ add("uniform", &UniformsLoader::uniform4f);
+
+ // Deprecated
+ add("uniform1f", &UniformsLoader::uniform1f);
+ add("uniform2f", &UniformsLoader::uniform2f);
+ add("uniform3f", &UniformsLoader::uniform3f);
+ add("uniform4f", &UniformsLoader::uniform4f);
+}
+
+void KeyFrame::UniformsLoader::uniform1f(const string &n, float v)
+{
+ obj.uniforms.insert(UniformMap::value_type(n, AnimatedUniform(1, v)));
+}
+
+void KeyFrame::UniformsLoader::uniform2f(const string &n, float v0, float v1)
+{
+ obj.uniforms.insert(UniformMap::value_type(n, AnimatedUniform(2, v0, v1)));
+}
+
+void KeyFrame::UniformsLoader::uniform3f(const string &n, float v0, float v1, float v2)
+{
+ obj.uniforms.insert(UniformMap::value_type(n, AnimatedUniform(3, v0, v1, v2)));
+}
+
+void KeyFrame::UniformsLoader::uniform4f(const string &n, float v0, float v1, float v2, float v3)
+{
+ obj.uniforms.insert(UniformMap::value_type(n, AnimatedUniform(4, v0, v1, v2, v3)));
}
} // namespace GL