From: Mikko Rasa Date: Sun, 5 Sep 2021 11:10:32 +0000 (+0300) Subject: Use the same index type for all of a Mesh's batches X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=6955c16bb123f3b795186c99442dc4d92be0ebc9;ds=sidebyside Use the same index type for all of a Mesh's batches In Vulkan the index type goes in the pipeline state object. --- diff --git a/source/core/batch.cpp b/source/core/batch.cpp index 51746b37..ebd7b049 100644 --- a/source/core/batch.cpp +++ b/source/core/batch.cpp @@ -65,6 +65,8 @@ Batch::~Batch() void Batch::set_index_type(DataType t) { + if(t==index_type) + return; if(t!=UNSIGNED_SHORT && t!=UNSIGNED_INT) throw invalid_argument("Batch::set_data_type"); if(t==UNSIGNED_SHORT && max_index>0xFFFE) diff --git a/source/core/mesh.cpp b/source/core/mesh.cpp index 4414a90e..38642d4e 100644 --- a/source/core/mesh.cpp +++ b/source/core/mesh.cpp @@ -146,6 +146,19 @@ void Mesh::add_batch(const Batch &b) batches.back().use_buffer(ibuf, prev); } + DataType existing_type = batches.front().get_index_type(); + DataType added_type = batches.back().get_index_type(); + if(existing_type!=added_type) + { + if(get_type_size(existing_type)>get_type_size(added_type)) + batches.back().set_index_type(existing_type); + else + { + for(vector::iterator i=batches.begin(); i!=batches.end(); ++i) + i->set_index_type(added_type); + } + } + check_buffers(INDEX_BUFFER); }