]> git.tdb.fi Git - libs/gl.git/blobdiff - source/instancearray.cpp
Remove the deprecated ProgramBuilder class
[libs/gl.git] / source / instancearray.cpp
index 29b59f09d9648e8f2474397852f6643910bef1c1..abd9fcd0bd870d14def0192392490b09c702fa2d 100644 (file)
@@ -62,6 +62,8 @@ InstanceArray::InstanceArray(const Object &o):
 
 InstanceArray::~InstanceArray()
 {
+       for(std::vector<ObjectInstance *>::iterator i=instances.begin(); i!=instances.end(); ++i)
+               delete *i;
        delete vtx_setup;
        delete instance_data;
        delete instance_buffer;
@@ -73,7 +75,16 @@ void InstanceArray::append(ObjectInstance *inst)
        if(instance_data)
        {
                if(instance_data->size()<instances.size())
+               {
                        instance_data->append();
+                       unsigned req_size = instance_data->get_required_buffer_size();
+                       if(instance_buffer->get_size()>0 && instance_buffer->get_size()<req_size)
+                       {
+                               delete instance_buffer;
+                               instance_buffer = new Buffer(ARRAY_BUFFER);
+                               instance_data->use_buffer(instance_buffer);
+                       }
+               }
                update_instance_matrix(instances.size()-1);
        }
 }
@@ -111,16 +122,18 @@ void InstanceArray::render(Renderer &renderer, const Tag &tag) const
                const Technique *tech = object.get_technique();
                if(!tech)
                        throw logic_error("no technique");
-               if(!tech->has_pass(tag))
+               const RenderPass *pass = tech->find_pass(tag);
+               if(!pass)
                        return;
-               const RenderPass &pass = tech->get_pass(tag);
 
                const Mesh *mesh = object.get_mesh();
                mesh->get_vertices().refresh();
+               if(instance_buffer->get_size()==0)
+                       instance_buffer->storage(instance_data->get_required_buffer_size());
                instance_data->refresh();
 
                Renderer::Push push(renderer);
-               pass.apply(renderer);
+               pass->apply(renderer);
                mesh->draw_instanced(renderer, *vtx_setup, instances.size());
        }
        else