X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimatedobject.cpp;h=390b90b869ce6acc9eb5a5a93a6fbe701776429e;hp=df0217aeb022bb2def2d733450e054cec91a623f;hb=81e0e39fefd8f50ae2367fe821d58af6273bcea2;hpb=4c5ba8f7d3bc755d6256cb6bf75907a1b10fc290 diff --git a/source/animatedobject.cpp b/source/animatedobject.cpp index df0217ae..390b90b8 100644 --- a/source/animatedobject.cpp +++ b/source/animatedobject.cpp @@ -1,21 +1,109 @@ +#include +#include #include "animatedobject.h" +#include "error.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_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", pose_data.size()/16, &pose_data[0]); + } +} + +ProgramData &AnimatedObject::get_shader_data() +{ + if(!shdata) + throw invalid_operation("AnimatedObject::get_shader_data"); + return *shdata; +} -void AnimatedObject::set_matrix(const Matrix &m) +const ProgramData &AnimatedObject::get_shader_data() const { - matrix = m; + if(!shdata) + throw invalid_operation("AnimatedObject::get_shader_data"); + return *shdata; +} + +void AnimatedObject::set_uniform(const string &name, const KeyFrame::AnimatedUniform &uni) +{ + if(!shdata) + throw invalid_operation("AnimatedObject::set_uniform"); + + if(uni.size==1) + shdata->uniform(name, uni.values[0]); + else if(uni.size==2) + shdata->uniform2(name, uni.values); + else if(uni.size==3) + shdata->uniform3(name, uni.values); + else if(uni.size==4) + shdata->uniform4(name, uni.values); + else + throw invalid_argument("AnimatedObject::set_uniform"); } void AnimatedObject::setup_render(Renderer &renderer, const Tag &) const { - renderer.matrix_stack() *= matrix; + renderer.transform(matrix); + if(shdata) + renderer.add_shader_data(*shdata); +} + + +AnimatedObject::Loader::Loader(AnimatedObject &o): + DataFile::DerivedObjectLoader(o) +{ + // Deprecated; Use the transform statement defined in ObjectInstance instead + 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