]> git.tdb.fi Git - libs/gl.git/blobdiff - source/batch.cpp
Present Mesh's index buffer as current while the Mesh is bound
[libs/gl.git] / source / batch.cpp
index d6924a80e0cc56378d7f20b892b04ee0bb251453..7f9adff7aad42ca8a9cb8e3bd4758ff2048acb75 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)
@@ -229,20 +240,19 @@ void Batch::draw() const
                        restart_index = index;
                }
        }
-       else if(restart_index && restart_index<max_index)
+       else if(restart_index && restart_index<=max_index)
        {
                glDisableClientState(GL_PRIMITIVE_RESTART_NV);
                restart_index = 0;
        }
 
-       if(get_buffer())
+       if(Buffer *ibuf = get_buffer())
        {
+               BindRestore _bind_ibuf(ibuf, 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()));
        }
        else