X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fprogramdata.cpp;h=cd12c2ca47fbff99cdbfe2578d30ebbd0468d997;hp=b69d7b062dd61af65164f94b65fc6fc41cceb90b;hb=56beca9d8b4f7b4edac81411d31e24df88e84ac3;hpb=1b45b45f7d543ea677183bab5aaa9ff90b6576cf diff --git a/source/programdata.cpp b/source/programdata.cpp index b69d7b06..cd12c2ca 100644 --- a/source/programdata.cpp +++ b/source/programdata.cpp @@ -1,3 +1,4 @@ +#include #include #include "buffer.h" #include "color.h" @@ -104,6 +105,11 @@ void ProgramData::uniform(const string &name, Uniform *uni) } } +void ProgramData::uniform(const string &name, const Uniform &u) +{ + uniform(name, u.clone()); +} + void ProgramData::uniform(const string &name, int v) { uniform(name, new Uniform1i(v)); @@ -265,6 +271,16 @@ void ProgramData::uniform4_array(const string &name, unsigned n, const float *v) uniform(name, new UniformArray(n, v)); } +void ProgramData::uniform_matrix2_array(const string &name, unsigned n, const float *v) +{ + uniform(name, new UniformArray(n, v)); +} + +void ProgramData::uniform_matrix3_array(const string &name, unsigned n, const float *v) +{ + uniform(name, new UniformArray(n, v)); +} + void ProgramData::uniform_matrix4_array(const string &name, unsigned n, const float *v) { uniform(name, new UniformArray(n, v)); @@ -289,12 +305,27 @@ void ProgramData::remove_uniform(const string &name) } } +vector ProgramData::get_uniform_names() const +{ + vector names; + for(SlotMap::const_iterator i=uniform_slots.begin(); i!=uniform_slots.end(); ++i) + names.push_back(i->first); + return names; +} + +const Uniform &ProgramData::get_uniform(const string &name) const +{ + return *uniforms[get_item(uniform_slots, name)]; +} + unsigned ProgramData::compute_slot_mask(const Program::UniformBlockInfo &block) const { unsigned mask = 0; for(vector::const_iterator i=block.uniforms.begin(); i!=block.uniforms.end(); ++i) { SlotMap::const_iterator j = uniform_slots.find((*i)->name); + /* TODO issue a warning (or even error?) either here or in update_block + if all uniforms for a buffer-backed block are not found */ if(j!=uniform_slots.end() && j->secondsecond; } @@ -434,7 +465,7 @@ ProgramData::ProgramBlock::ProgramBlock(): ProgramData::ProgramBlock::ProgramBlock(int p, SharedBlock *b): bind_point(p), - block(b ? b->block : 0), + block((b && b->used) ? b->block : 0), shared(b) { }