X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanimatedobject.cpp;h=8b030978eecda6a6a10af0cb5dab83f121e1334f;hb=8dbd6316d277d2f9cbf85e7e61f2541421e01292;hp=086666339800ec022484d33660fd6292da3c5f1b;hpb=9846a5c6e73b3a146084894a11550dbbf184a22a;p=libs%2Fgl.git diff --git a/source/animatedobject.cpp b/source/animatedobject.cpp index 08666633..8b030978 100644 --- a/source/animatedobject.cpp +++ b/source/animatedobject.cpp @@ -1,3 +1,4 @@ +#include #include #include "animatedobject.h" #include "object.h" @@ -5,6 +6,8 @@ #include "renderer.h" #include "technique.h" +using namespace std; + namespace Msp { namespace GL { @@ -17,6 +20,11 @@ AnimatedObject::AnimatedObject(const Object &o): shdata = new ProgramData; } +AnimatedObject::~AnimatedObject() +{ + delete shdata; +} + void AnimatedObject::set_matrix(const Matrix &m) { matrix = m; @@ -25,14 +33,49 @@ void AnimatedObject::set_matrix(const Matrix &m) void AnimatedObject::set_pose_matrix(unsigned link, const Matrix &m) { if(shdata) - shdata->uniform_matrix4(format("pose[%d]", link), m); + { + if(link*16>=pose_data.size()) + pose_data.resize((link+1)*16); + copy(m.data(), m.data()+16, &pose_data[link*16]); + shdata->uniform_matrix4_array("pose", pose_data.size()/16, &pose_data[0]); + } } void AnimatedObject::setup_render(Renderer &renderer, const Tag &) const { - renderer.matrix_stack() *= matrix; + renderer.transform(matrix); if(shdata) - renderer.add_shader_data(shdata); + renderer.add_shader_data(*shdata); +} + + +AnimatedObject::Loader::Loader(AnimatedObject &o): + DataFile::ObjectLoader(o) +{ + add("position", &Loader::position); + add("rotation", &Loader::rotation); + add("scale", &Loader::scale); + add("scale", &Loader::scale_uniform); +} + +void AnimatedObject::Loader::position(float x, float y, float z) +{ + obj.matrix.translate(x, y, z); +} + +void AnimatedObject::Loader::rotation(float a, float x, float y, float z) +{ + obj.matrix.rotate_deg(a, x, y, z); +} + +void AnimatedObject::Loader::scale(float x, float y, float z) +{ + obj.matrix.scale(x, y, z); +} + +void AnimatedObject::Loader::scale_uniform(float s) +{ + obj.matrix.scale(s); } } // namespace GL