From: Mikko Rasa Date: Thu, 30 Aug 2012 19:35:55 +0000 (+0300) Subject: Move Batch members around X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=50175b88e2f189e80881d292dcc32523c5b272fc Move Batch members around The helper functions for changing data type don't really need to be members, so put them in a private namespace. Other functions rearranged in a more sensible way. --- diff --git a/source/batch.cpp b/source/batch.cpp index afb9787b..1d9b1d4c 100644 --- a/source/batch.cpp +++ b/source/batch.cpp @@ -8,6 +8,44 @@ 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 { @@ -45,17 +83,17 @@ void Batch::set_data_type(DataType t) throw invalid_operation("Batch::set_data_type"); if(data_type==UNSIGNED_BYTE && t==UNSIGNED_SHORT) - expand_data(); + expand(data); else if(data_type==UNSIGNED_BYTE && t==UNSIGNED_INT) - expand_data(); + expand(data); else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_INT) - expand_data(); + expand(data); else if(data_type==UNSIGNED_INT && t==UNSIGNED_BYTE) - shrink_data(); + shrink(data); else if(data_type==UNSIGNED_INT && t==UNSIGNED_SHORT) - shrink_data(); + shrink(data); else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_BYTE) - shrink_data(); + shrink(data); data_type = t; update_ibuf_offsets(); @@ -87,6 +125,28 @@ void Batch::use_index_buffer(Buffer *buf, Batch *prev) dirty = true; } +void Batch::unlink_from_ibuf() +{ + if(next_in_ibuf) + next_in_ibuf->prev_in_ibuf = prev_in_ibuf; + if(prev_in_ibuf) + { + prev_in_ibuf->next_in_ibuf = next_in_ibuf; + prev_in_ibuf->update_ibuf_offsets(); + } + else if(next_in_ibuf) + { + next_in_ibuf->ibuf_offset = 0; + next_in_ibuf->update_ibuf_offsets(); + } +} + +void Batch::update_ibuf_offsets() +{ + for(Batch *b=this; b->next_in_ibuf; b=b->next_in_ibuf) + b->next_in_ibuf->ibuf_offset = b->ibuf_offset+b->data.size(); +} + Batch &Batch::append(unsigned i) { if(data.empty()) @@ -103,9 +163,9 @@ Batch &Batch::append(unsigned i) set_data_type(UNSIGNED_SHORT); if(data_type==UNSIGNED_SHORT) - append_index(i); + ::append(data, i); else if(data_type==UNSIGNED_INT) - append_index(i); + ::append(data, i); else data.push_back(i); @@ -173,9 +233,9 @@ void Batch::append(const Batch &other) { restart = true; if(data_type==UNSIGNED_SHORT) - append_index(0xFFFF); + ::append(data, 0xFFFF); else if(data_type==UNSIGNED_INT) - append_index(0xFFFFFFFF); + ::append(data, 0xFFFFFFFF); else data.push_back(0xFF); } @@ -199,6 +259,25 @@ void Batch::append(const Batch &other) append(other.get_index(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 { if(restart) @@ -254,81 +333,6 @@ void Batch::draw() const glDrawRangeElements(prim_type, min_index, max_index, size(), data_type, &data[0]); } -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); -} - -template -void Batch::append_index(T i) -{ - data.insert(data.end(), sizeof(T), 0); - *(T *)(&data[data.size()-sizeof(T)]) = i; -} - -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]; -} - -template -void Batch::expand_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 Batch::shrink_data() -{ - unsigned count = data.size()/sizeof(T); - for(unsigned i=0; i(*(T *)(&data[i*sizeof(T)])); - data.resize(count*sizeof(U)); -} - -template -U Batch::convert(T i) const -{ - if(!static_cast(~i)) - return ~0; - else - return i; -} - -void Batch::unlink_from_ibuf() -{ - if(next_in_ibuf) - next_in_ibuf->prev_in_ibuf = prev_in_ibuf; - if(prev_in_ibuf) - { - prev_in_ibuf->next_in_ibuf = next_in_ibuf; - prev_in_ibuf->update_ibuf_offsets(); - } - else if(next_in_ibuf) - { - next_in_ibuf->ibuf_offset = 0; - next_in_ibuf->update_ibuf_offsets(); - } -} - -void Batch::update_ibuf_offsets() -{ - for(Batch *b=this; b->next_in_ibuf; b=b->next_in_ibuf) - b->next_in_ibuf->ibuf_offset = b->ibuf_offset+b->data.size(); -} - Batch::Loader::Loader(Batch &b): DataFile::ObjectLoader(b) diff --git a/source/batch.h b/source/batch.h index 4d2520a1..dcc2168b 100644 --- a/source/batch.h +++ b/source/batch.h @@ -53,30 +53,22 @@ public: void set_data_type(DataType); DataType get_data_type() const { return data_type; } void use_index_buffer(Buffer *, Batch * = 0); +private: + void unlink_from_ibuf(); + void update_ibuf_offsets(); + +public: Batch &append(unsigned); void append(const std::vector &); void append(const Batch &); - unsigned size() const { return data.size()/get_index_size(); } - unsigned get_index(unsigned) const; - void draw() const; - private: unsigned get_index_size() const; +public: + unsigned size() const { return data.size()/get_index_size(); } - template - void append_index(T); - - template - void expand_data(); - - template - void shrink_data(); - - template - U convert(T) const; + unsigned get_index(unsigned) const; - void unlink_from_ibuf(); - void update_ibuf_offsets(); + void draw() const; }; } // namespace GL