+ last_free = index;
+}
+
+void InstanceArrayBase::update_instance_matrix(size_t index, const Matrix &matrix)
+{
+ float *d = reinterpret_cast<float *>(instance_data.modify(slots[index].array_index)+matrix_offset);
+ for(unsigned i=0; i<12; ++i)
+ d[i] = matrix(i/4, i%4);
+}
+
+void InstanceArrayBase::render(Renderer &renderer, Tag tag) const
+{
+ if(!instance_count)
+ return;
+
+ const Technique *tech = object.get_technique();
+ if(!tech)
+ throw logic_error("no technique");
+ const RenderMethod *method = tech->find_method(tag);
+ if(!method)
+ return;
+
+ const Mesh *mesh = object.get_mesh();
+ if(instance_buffer->get_size()==0)
+ instance_buffer->storage(instance_data.get_required_buffer_size(), STREAMING);
+
+ Renderer::Push push(renderer);
+ renderer.set_pipeline_key(this, tag.id);
+ method->apply(renderer);
+ mesh->draw_instanced(renderer, vtx_setup, instance_count);