]> git.tdb.fi Git - libs/gl.git/blobdiff - source/keyframe.cpp
Bind textures in the modern way when shaders are used
[libs/gl.git] / source / keyframe.cpp
index 7310c239757c0a3deea63c3c692b596acb578c90..dd4adf16611efb7c2c05312d0428d949de7c6df5 100644 (file)
@@ -1,15 +1,75 @@
+#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_matrix(const Matrix &m)
+{
+       matrix = m;
+}
+
+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("position", &Loader::position);
        add("rotation", &Loader::rotation);
        add("scaling", &Loader::scaling_uniform);
        add("scaling", &Loader::scaling);
+       add("uniforms", &Loader::uniforms);
+}
+
+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)
@@ -32,5 +92,41 @@ void KeyFrame::Loader::scaling(float x, float y, float z)
        obj.matrix.scale(x, y, z);
 }
 
+void KeyFrame::Loader::uniforms()
+{
+       UniformsLoader ldr(obj);
+       load_sub_with(ldr);
+}
+
+
+KeyFrame::UniformsLoader::UniformsLoader(KeyFrame &k):
+       DataFile::ObjectLoader<KeyFrame>(k)
+{
+       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
 } // namespace Msp