X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fanimatedobject.cpp;h=63a25112a769428374e37dd0634251b4f2c2c8b7;hb=ae9abd6be3e556d0a202cc5ab05668da715382c9;hp=0cc367861e905faa3023aa2d8a79dd266ef4f0cc;hpb=57fc4142e0b19a21f61c60b00f8310d5d2c27871;p=libs%2Fgl.git diff --git a/source/animatedobject.cpp b/source/animatedobject.cpp index 0cc36786..63a25112 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 { @@ -13,12 +16,13 @@ AnimatedObject::AnimatedObject(const Object &o): shdata(0) { if(const Technique *tech = object.get_technique()) - { - // XXX Should create separate ProgramData for each pass - const RenderPass &pass = tech->get_pass(Tag()); - if(const Program *shprog = pass.get_shader_program()) - shdata = new ProgramData(*shprog); - } + if(tech->has_shaders()) + shdata = new ProgramData; +} + +AnimatedObject::~AnimatedObject() +{ + delete shdata; } void AnimatedObject::set_matrix(const Matrix &m) @@ -29,14 +33,19 @@ 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[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); + renderer.add_shader_data(*shdata); } } // namespace GL