From: Mikko Rasa Date: Sat, 23 Jan 2021 17:27:32 +0000 (+0200) Subject: Remove support for UInt8 indices from Batch X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=c897f76c44c2baaa90c0f85e0bcbee152a99272a Remove support for UInt8 indices from Batch Vulkan does not support them --- diff --git a/source/batch.cpp b/source/batch.cpp index 0f6418b5..f2614c41 100644 --- a/source/batch.cpp +++ b/source/batch.cpp @@ -12,7 +12,7 @@ using namespace std; namespace { template -void append(vector &data, T i) +void append(vector &data, T i) { data.insert(data.end(), sizeof(T), 0); *(T *)(&data[data.size()-sizeof(T)]) = i; @@ -28,7 +28,7 @@ U convert(T n) } template -void expand(vector &data) +void expand(vector &data) { unsigned count = data.size()/sizeof(T); data.resize(count*sizeof(U)); @@ -37,7 +37,7 @@ void expand(vector &data) } template -void shrink(vector &data) +void shrink(vector &data) { unsigned count = data.size()/sizeof(T); for(unsigned i=0; i0xFE) - throw invalid_operation("Batch::set_data_type"); - else if(t==UNSIGNED_SHORT && max_index>0xFFFE) + 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); + if(data_type==UNSIGNED_SHORT && t==UNSIGNED_INT) + expand(data); else if(data_type==UNSIGNED_INT && t==UNSIGNED_SHORT) - shrink(data); - else if(data_type==UNSIGNED_SHORT && t==UNSIGNED_BYTE) - shrink(data); + shrink(data); data_type = t; update_offset(); @@ -135,17 +125,17 @@ Batch &Batch::append(const Batch &other) if(other.data.empty()) return *this; + // TODO allow appending triangles to a triangle strip + 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); + if(data_type==UNSIGNED_INT) + ::append(data, 0xFFFFFFFF); else - data.push_back(0xFF); + ::append(data, 0xFFFF); } else if(prim_type==TRIANGLE_STRIP) { @@ -172,36 +162,26 @@ void Batch::append_index(unsigned i) else max_index = max(max_index, i); - if((data_type==UNSIGNED_BYTE || data_type==UNSIGNED_SHORT) && max_index>0xFFFE) + if(data_type==UNSIGNED_SHORT && max_index>0xFFFE) 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); + if(data_type==UNSIGNED_INT) + ::append(data, i); else - data.push_back(i); + ::append(data, 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); + return (data_type==UNSIGNED_INT ? sizeof(UInt32) : sizeof(UInt16)); } 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 )]; + if(data_type==UNSIGNED_INT) + return *(UInt32 *)&data[i*sizeof(UInt32)]; else - return data[i]; + return *(UInt16 *)&data[i*sizeof(UInt16)]; } void Batch::draw() const @@ -226,13 +206,7 @@ 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; + unsigned index = (data_type==UNSIGNED_INT ? 0xFFFFFFFF : 0xFFFF); if(index!=restart_index) set_restart_index(index); diff --git a/source/batch.h b/source/batch.h index 82d8fbca..d42a8629 100644 --- a/source/batch.h +++ b/source/batch.h @@ -34,7 +34,7 @@ public: private: PrimitiveType prim_type; DataType data_type; - std::vector data; + std::vector data; unsigned min_index; unsigned max_index; bool restart;