X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbatch.cpp;h=89b8f48f4d44920d4b63a3829a44f81f9c2f44e8;hp=7100653ea17800cf9ebd6364e6d5fba41443948b;hb=e16855bccb78c721e2fe3f2ea8fc0310e041cb43;hpb=61ff840cd211f10d45dca8c4dad2cca5f68aaa42 diff --git a/source/batch.cpp b/source/batch.cpp index 7100653e..89b8f48f 100644 --- a/source/batch.cpp +++ b/source/batch.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include "batch.h" #include "bindable.h" @@ -58,11 +60,7 @@ Batch::Batch(PrimitiveType t): min_index(0), max_index(0), restart(false) -{ - /* XXX Should probably provide a fallback to glDrawElements since this class - is pretty much required to render anything. */ - static Require _req(EXT_draw_range_elements); -} +{ } Batch::~Batch() { @@ -105,10 +103,10 @@ Batch &Batch::append(unsigned i) return *this; } -void Batch::append(const vector &ind) +Batch &Batch::append(const vector &ind) { if(ind.empty()) - return; + return *this; data.reserve(data.size()+ind.size()*get_index_size()); for(vector::const_iterator i=ind.begin(); i!=ind.end(); ++i) @@ -116,31 +114,40 @@ void Batch::append(const vector &ind) update_offset(); dirty = true; + + return *this; } 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 if(prim_type==LINE_STRIP || prim_type==LINE_LOOP || prim_type==TRIANGLE_FAN) + return MSP_primitive_restart || NV_primitive_restart; else return true; } -void Batch::append(const Batch &other) +Batch &Batch::append(const Batch &other) { if(other.prim_type!=prim_type) throw invalid_argument("Batch::append"); - if(prim_type==LINE_STRIP || prim_type==LINE_LOOP || prim_type==TRIANGLE_FAN || prim_type==POLYGON) - static Require _req(NV_primitive_restart); + if(prim_type==LINE_STRIP || prim_type==LINE_LOOP || prim_type==TRIANGLE_FAN) + { + if(!MSP_primitive_restart) + { + static Require _req(NV_primitive_restart); + // Make sure we have glEnable/DisableClientState as well + static Require _req2(MSP_legacy_features); + } + } if(other.data.empty()) - return; + return *this; if(prim_type==POINTS || prim_type==LINES || prim_type==TRIANGLES || prim_type==QUADS) ; - else if(NV_primitive_restart) + else if(MSP_primitive_restart || NV_primitive_restart) { restart = true; if(data_type==UNSIGNED_SHORT) @@ -171,6 +178,8 @@ void Batch::append(const Batch &other) update_offset(); dirty = true; + + return *this; } void Batch::append_index(unsigned i) @@ -196,11 +205,6 @@ void Batch::append_index(unsigned i) data.push_back(i); } -void Batch::upload_data() const -{ - get_buffer()->sub_data(get_offset(), data.size(), &data[0]); -} - unsigned Batch::get_index_size() const { if(data_type==UNSIGNED_SHORT) @@ -233,30 +237,56 @@ void Batch::draw() const index = 0xFF; if(index!=restart_index) - { - if(!restart_index) - glEnableClientState(GL_PRIMITIVE_RESTART_NV); - glPrimitiveRestartIndexNV(index); - restart_index = index; - } + set_restart_index(index); } else if(restart_index && restart_index<=max_index) - { - glDisableClientState(GL_PRIMITIVE_RESTART_NV); - restart_index = 0; - } + set_restart_index(0); Buffer *ibuf = get_buffer(); + const void *data_ptr; BindRestore _bind_ibuf(ibuf, ELEMENT_ARRAY_BUFFER); if(ibuf) { if(dirty) update_buffer(); - glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, reinterpret_cast(get_offset())); + data_ptr = reinterpret_cast(get_offset()); } else - glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, &data[0]); + data_ptr = &data[0]; + + 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::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; }