From 347a258c99611443e5f5aa3c9e0092410a634e48 Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 3 Aug 2022 22:08:32 -0700 Subject: [PATCH] Fixed bug that caused indexed strip meshes to be changed to indexed triangle meshes when optimized. --- kraken/KRMesh.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/kraken/KRMesh.cpp b/kraken/KRMesh.cpp index 2a036ca..6dee780 100755 --- a/kraken/KRMesh.cpp +++ b/kraken/KRMesh.cpp @@ -358,7 +358,8 @@ void KRMesh::createDataBlocks(KRMeshManager::KRVBOData::vbo_type t) int32_t vertex_count = pHeader->vertex_count; int vbo_index=0; - if(getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES) { + if(getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES + || getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_STRIP) { int index_group = getSubmesh(iSubmesh)->index_group; int index_group_offset = getSubmesh(iSubmesh)->index_group_offset; @@ -1509,8 +1510,16 @@ void KRMesh::convertToIndexed() KRContext::Log(KRContext::LOG_LEVEL_INFORMATION, "Convert to indexed, before: %i after: %i (%.2f%% saving)", getHeader()->vertex_count, mi.vertices.size(), ((float)getHeader()->vertex_count - (float)mi.vertices.size()) / (float)getHeader()->vertex_count * 100.0f); - - mi.format = ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES; + switch (getModelFormat()) { + case ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES: + mi.format = ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES; + break; + case ModelFormat::KRENGINE_MODEL_FORMAT_STRIP: + mi.format = ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_STRIP; + break; + default: + assert(false); + } m_pData->unlock(); LoadData(mi, false, false); @@ -1520,9 +1529,11 @@ void KRMesh::optimize() { switch(getModelFormat()) { case ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES: + case ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_STRIP: optimizeIndexes(); break; - default: + case ModelFormat::KRENGINE_MODEL_FORMAT_STRIP: + case ModelFormat::KRENGINE_MODEL_FORMAT_TRIANGLES: convertToIndexed(); // HACK, FINDME, TODO - This may not be ideal in every case and should be exposed through the API independently break; } @@ -1571,6 +1582,7 @@ int KRMesh::getTriangleVertexIndex(int submesh, int index) const void KRMesh::optimizeIndexes() { m_pData->lock(); + // TODO - Implement optimization for indexed strips if(getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES) { __uint16_t *new_indices = (__uint16_t *)malloc(0x10000 * sizeof(__uint16_t));