]> git.tdb.fi Git - libs/gl.git/blobdiff - source/batch.cpp
Add vertex array object support to Mesh
[libs/gl.git] / source / batch.cpp
index 3f7bffee901da3bfab572e197a44da13ff912741..bca33484ce976cc585d8da88187c8ba568baed23 100644 (file)
@@ -1,9 +1,10 @@
+#include <msp/gl/extensions/ext_draw_range_elements.h>
+#include <msp/gl/extensions/nv_primitive_restart.h>
 #include "batch.h"
 #include "bindable.h"
 #include "buffer.h"
 #include "error.h"
-#include "ext_draw_range_elements.h"
-#include "nv_primitive_restart.h"
+#include "mesh.h"
 #include "vertexarray.h"
 
 using namespace std;
@@ -97,7 +98,7 @@ void Batch::set_data_type(DataType t)
 Batch &Batch::append(unsigned i)
 {
        append_index(i);
-       
+
        update_offset();
        dirty = true;
 
@@ -117,6 +118,16 @@ void Batch::append(const vector<unsigned> &ind)
        dirty = true;
 }
 
+bool Batch::can_append(PrimitiveType other_type)
+{
+       if(other_type!=prim_type)
+               return false;
+       else if(prim_type==LINE_STRIP || prim_type==LINE_LOOP || prim_type==TRIANGLE_FAN || prim_type==POLYGON)
+               return NV_primitive_restart;
+       else
+               return true;
+}
+
 void Batch::append(const Batch &other)
 {
        if(other.prim_type!=prim_type)
@@ -235,15 +246,27 @@ void Batch::draw() const
                restart_index = 0;
        }
 
-       if(get_buffer())
+       if(Buffer *ibuf = get_buffer())
        {
+               bool have_vao = Mesh::current();
+               const Buffer *old_ibuf = 0;
+               if(!have_vao)
+               {
+                       old_ibuf = Buffer::current(ELEMENT_ARRAY_BUFFER);
+                       ibuf->bind_to(ELEMENT_ARRAY_BUFFER);
+               }
+
                if(dirty)
                        update_buffer();
 
-               BufferAlias<ELEMENT_ARRAY_BUFFER> alias(*get_buffer());
-               Bind bind_ibuf(alias, true);
-
                glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, reinterpret_cast<void *>(get_offset()));
+               if(!have_vao)
+               {
+                       if(old_ibuf)
+                               old_ibuf->bind_to(ELEMENT_ARRAY_BUFFER);
+                       else
+                               Buffer::unbind_from(ELEMENT_ARRAY_BUFFER);
+               }
        }
        else
                glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, &data[0]);