X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanimatedobject.cpp;h=eec54aa74f38d24ddb40e57d7e1bf922e951d76c;hb=237bf34e27585f4083a9c8cea5a7df95f4c081e7;hp=df0217aeb022bb2def2d733450e054cec91a623f;hpb=4c5ba8f7d3bc755d6256cb6bf75907a1b10fc290;p=libs%2Fgl.git diff --git a/source/animatedobject.cpp b/source/animatedobject.cpp index df0217ae..eec54aa7 100644 --- a/source/animatedobject.cpp +++ b/source/animatedobject.cpp @@ -1,21 +1,51 @@ +#include +#include #include "animatedobject.h" +#include "object.h" +#include "programdata.h" #include "renderer.h" +#include "technique.h" + +using namespace std; namespace Msp { namespace GL { AnimatedObject::AnimatedObject(const Object &o): - ObjectInstance(o) -{ } + ObjectInstance(o), + shdata(0) +{ + if(const Technique *tech = object.get_technique()) + if(tech->has_shaders()) + shdata = new ProgramData; +} + +AnimatedObject::~AnimatedObject() +{ + delete shdata; +} void AnimatedObject::set_matrix(const Matrix &m) { matrix = m; } +void AnimatedObject::set_pose_matrix(unsigned link, const Matrix &m) +{ + if(shdata) + { + 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[0]", pose_data.size()/16, &pose_data[0]); + } +} + void AnimatedObject::setup_render(Renderer &renderer, const Tag &) const { renderer.matrix_stack() *= matrix; + if(shdata) + renderer.add_shader_data(shdata); } } // namespace GL