X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbatch.cpp;h=af1d243e6cba1551e6be65255a55e69a4e7029cf;hp=b61da0bac79aee1507ac536efa46815c6a5c127a;hb=HEAD;hpb=a40fc85277dba5c34402a0e703d038efd30cc57b diff --git a/source/batch.cpp b/source/batch.cpp deleted file mode 100644 index b61da0ba..00000000 --- a/source/batch.cpp +++ /dev/null @@ -1,289 +0,0 @@ -#include -#include -#include -#include "batch.h" -#include "bindable.h" -#include "buffer.h" -#include "error.h" -#include "mesh.h" -#include "vertexarray.h" - -using namespace std; - -namespace { - -template -void append(vector &data, T i) -{ - data.insert(data.end(), sizeof(T), 0); - *(T *)(&data[data.size()-sizeof(T)]) = i; -} - -template -U convert(T n) -{ - if(!static_cast(~n)) - return ~0; - else - return n; -} - -template -void expand(vector &data) -{ - unsigned count = data.size()/sizeof(T); - data.resize(count*sizeof(U)); - for(unsigned i=count; i--;) - *(U *)(&data[i*sizeof(U)]) = convert(*(T *)(&data[i*sizeof(T)])); -} - -template -void shrink(vector &data) -{ - unsigned count = data.size()/sizeof(T); - for(unsigned i=0; i(*(T *)(&data[i*sizeof(T)])); - data.resize(count*sizeof(U)); -} - -} - -namespace Msp { -namespace GL { - -unsigned Batch::restart_index = 0; - -Batch::Batch(PrimitiveType t): - prim_type(t), - data_type(UNSIGNED_BYTE), - min_index(0), - max_index(0), - restart(false) -{ } - -Batch::~Batch() -{ -} - -void Batch::set_data_type(DataType t) -{ - if(t!=UNSIGNED_BYTE && t!=UNSIGNED_SHORT && t!=UNSIGNED_INT) - throw invalid_argument("Batch::set_data_type"); - if(t==UNSIGNED_BYTE && max_index>0xFE) - throw invalid_operation("Batch::set_data_type"); - else if(t==UNSIGNED_SHORT && max_index>0xFFFE) - throw invalid_operation("Batch::set_data_type"); - - if(data_type==UNSIGNED_BYTE && t==UNSIGNED_SHORT) - expand(data); - else if(data_type==UNSIGNED_BYTE && t==UNSIGNED_INT) - expand(data); - else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_INT) - expand(data); - else if(data_type==UNSIGNED_INT && t==UNSIGNED_BYTE) - shrink(data); - else if(data_type==UNSIGNED_INT && t==UNSIGNED_SHORT) - shrink(data); - else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_BYTE) - shrink(data); - - data_type = t; - update_offset(); - dirty = true; -} - -Batch &Batch::append(unsigned i) -{ - append_index(i); - - update_offset(); - dirty = true; - - return *this; -} - -Batch &Batch::append(const vector &ind) -{ - if(ind.empty()) - return *this; - - data.reserve(data.size()+ind.size()*get_index_size()); - for(vector::const_iterator i=ind.begin(); i!=ind.end(); ++i) - append_index(*i); - - 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) - return MSP_primitive_restart; - else - return true; -} - -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) - static Require _req(MSP_primitive_restart); - - if(other.data.empty()) - return *this; - - if(prim_type==POINTS || prim_type==LINES || prim_type==TRIANGLES) - ; - else if(MSP_primitive_restart) - { - restart = true; - if(data_type==UNSIGNED_SHORT) - ::append(data, 0xFFFF); - else if(data_type==UNSIGNED_INT) - ::append(data, 0xFFFFFFFF); - else - data.push_back(0xFF); - } - else if(prim_type==TRIANGLE_STRIP) - { - append(get_index(size()-1)); - append(other.get_index(0)); - if(size()&1) - append(other.get_index(0)); - } - - unsigned count = other.size(); - for(unsigned i=0; i0xFFFE) - set_data_type(UNSIGNED_INT); - else if(data_type==UNSIGNED_BYTE && max_index>0xFE) - set_data_type(UNSIGNED_SHORT); - - if(data_type==UNSIGNED_SHORT) - ::append(data, i); - else if(data_type==UNSIGNED_INT) - ::append(data, i); - else - data.push_back(i); -} - -unsigned Batch::get_index_size() const -{ - if(data_type==UNSIGNED_SHORT) - return sizeof(unsigned short); - else if(data_type==UNSIGNED_INT) - return sizeof(unsigned); - return sizeof(unsigned char); -} - -unsigned Batch::get_index(unsigned i) const -{ - if(data_type==UNSIGNED_SHORT) - return *(unsigned short *)&data[i*sizeof(unsigned short)]; - else if(data_type==UNSIGNED_INT) - return *(unsigned *)&data[i*sizeof(unsigned )]; - else - return data[i]; -} - -void Batch::draw() const -{ - 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(get_offset()); - } - else - return &data[0]; -} - -void Batch::set_restart_index(unsigned index) -{ - if(index>0) - { - if(!restart_index) - glEnable(GL_PRIMITIVE_RESTART); - glPrimitiveRestartIndex(index); - } - else - glDisable(GL_PRIMITIVE_RESTART); - - restart_index = index; -} - - -Batch::Loader::Loader(Batch &b): - DataFile::ObjectLoader(b) -{ - add("indices", &Loader::indices); -} - -void Batch::Loader::indices(const vector &ind) -{ - obj.append(ind); -} - -} // namespace GL -} // namespace Msp