X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Frenderpass.cpp;h=4aa41dba2d0136a1f164a843003fcd31f8a62463;hb=b617c5d7b5283ad260a77f01e42e6170cabbc03d;hp=d2fe668839816688fbab3d60414d2d092d15a7a8;hpb=97015ec7bddd26aa746f5227e4109b7d32438cca;p=libs%2Fgl.git diff --git a/source/renderpass.cpp b/source/renderpass.cpp index d2fe6688..4aa41dba 100644 --- a/source/renderpass.cpp +++ b/source/renderpass.cpp @@ -19,7 +19,7 @@ using namespace std; namespace Msp { namespace GL { -const RenderPass *RenderPass::current=0; +const RenderPass *RenderPass::current = 0; RenderPass::RenderPass(): shprog(0), @@ -36,19 +36,6 @@ RenderPass::RenderPass(const RenderPass &other): textures(other.textures) { } -/*RenderPass &RenderPass::operator=(const RenderPass &other) -{ - shprog=other.shprog; - delete shdata; - shdata=(other.shdata ? new ProgramData(*other.shdata) : 0); - material=other.material; - use_material=other.use_material; - textures=other.textures; - use_textures=other.use_textures; - - return *this; -}*/ - RenderPass::~RenderPass() { delete shdata; @@ -58,7 +45,7 @@ RenderPass::~RenderPass() void RenderPass::set_material(const Material *mat) { - material=mat; + material = mat; } unsigned RenderPass::get_texture_index(const string &slot) const @@ -72,7 +59,7 @@ unsigned RenderPass::get_texture_index(const string &slot) const void RenderPass::set_texture(const string &slot, const Texture *tex) { - textures[get_texture_index(slot)]=tex; + textures[get_texture_index(slot)] = tex; } void RenderPass::bind() const @@ -80,8 +67,8 @@ void RenderPass::bind() const if(this==current) return; - const RenderPass *old=current; - current=this; + const RenderPass *old = current; + current = this; if(shprog) { @@ -119,14 +106,27 @@ void RenderPass::unbind() for(unsigned i=current->textures.size(); i--; ) GL::Texture::unbind_from(i); - current=0; + current = 0; } } +RenderPass::Loader::Loader(RenderPass &p): + DataFile::CollectionObjectLoader(p, 0) +{ + init(); +} + RenderPass::Loader::Loader(RenderPass &p, Collection &c): DataFile::CollectionObjectLoader(p, &c) { + init(); +} + +void RenderPass::Loader::init() +{ + allow_pointer_reload = false; + add("shader", &RenderPass::shprog); add("material", &Loader::material); add("material", &RenderPass::material); @@ -139,11 +139,11 @@ void RenderPass::Loader::finish() if(obj.shprog) { if(!obj.shdata) - obj.shdata=new ProgramData; + obj.shdata = new ProgramData; for(unsigned i=0; iget_uniform_location(obj.textures[i].name); + unsigned loc = obj.shprog->get_uniform_location(obj.textures[i].name); obj.shdata->uniform(loc, static_cast(i)); } } @@ -151,18 +151,20 @@ void RenderPass::Loader::finish() void RenderPass::Loader::material() { - // XXX Potential memory management trouble with multiple material statements - RefPtr mat=new Material; + if(obj.material) + throw InvalidState("A material is already loaded"); + + RefPtr mat = new Material; load_sub(*mat); - obj.material=mat.release(); - obj.own_material=true; + obj.material = mat.release(); + obj.own_material = true; } void RenderPass::Loader::texture(const string &n) { - const Texture *tex=(n.empty() ? 0 : get_collection().get(n)); + const Texture *tex = (n.empty() ? 0 : get_collection().get(n)); TextureSlot slot(tex); - slot.name=(obj.textures.empty() ? "texture" : format("texture%d", obj.textures.size())); + slot.name = (obj.textures.empty() ? "texture" : format("texture%d", obj.textures.size())); load_sub(slot); obj.textures.push_back(slot); } @@ -172,7 +174,7 @@ void RenderPass::Loader::uniforms() if(!obj.shprog) throw InvalidState("Can't load uniforms without a shader program"); if(!obj.shdata) - obj.shdata=new ProgramData; + obj.shdata = new ProgramData; load_sub(*obj.shdata, *obj.shprog); }