+ BindRestore _bind_ibuf(get_buffer(), ELEMENT_ARRAY_BUFFER);
+ const void *data_ptr = setup_draw();
+
+ if(EXT_draw_range_elements)
+ glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, data_ptr);
+ else
+ glDrawElements(prim_type, size(), data_type, data_ptr);
+}
+
+void Batch::draw_instanced(unsigned count) const
+{
+ static Require req(ARB_draw_instanced);
+
+ BindRestore _bind_ibuf(get_buffer(), ELEMENT_ARRAY_BUFFER);
+ const void *data_ptr = setup_draw();
+
+ glDrawElementsInstanced(prim_type, size(), data_type, data_ptr, count);
+}
+
+const void *Batch::setup_draw() const
+{
+ if(restart)
+ {
+ unsigned index;
+ if(data_type==UNSIGNED_SHORT)
+ index = 0xFFFF;
+ else if(data_type==UNSIGNED_INT)
+ index = 0xFFFFFFFF;
+ else
+ index = 0xFF;
+
+ if(index!=restart_index)
+ set_restart_index(index);
+ }
+ else if(restart_index && restart_index<=max_index)
+ set_restart_index(0);
+
+ if(get_buffer())
+ {
+ if(dirty)
+ update_buffer();
+
+ return reinterpret_cast<const void *>(get_offset());
+ }
+ else
+ return &data[0];
+}
+
+void Batch::set_restart_index(unsigned index)
+{
+ if(MSP_primitive_restart)
+ {
+ if(index>0)
+ {
+ if(!restart_index)
+ glEnable(GL_PRIMITIVE_RESTART);
+ glPrimitiveRestartIndex(index);
+ }
+ else
+ glDisable(GL_PRIMITIVE_RESTART);
+ }
+ else
+ {
+ if(index>0)
+ {
+ if(!restart_index)
+ glEnableClientState(GL_PRIMITIVE_RESTART_NV);
+ glPrimitiveRestartIndexNV(index);
+ }
+ else
+ glDisableClientState(GL_PRIMITIVE_RESTART_NV);
+ }
+
+ restart_index = index;