Fixed bug that caused indexed strip meshes to be changed to indexed triangle meshes when optimized.

This commit is contained in:
2022-08-03 22:08:32 -07:00
parent 5f32d4dede
commit 347a258c99

View File

@@ -358,7 +358,8 @@ void KRMesh::createDataBlocks(KRMeshManager::KRVBOData::vbo_type t)
int32_t vertex_count = pHeader->vertex_count; int32_t vertex_count = pHeader->vertex_count;
int vbo_index=0; 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 = getSubmesh(iSubmesh)->index_group;
int index_group_offset = getSubmesh(iSubmesh)->index_group_offset; 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); 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);
switch (getModelFormat()) {
mi.format = ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES; 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(); m_pData->unlock();
LoadData(mi, false, false); LoadData(mi, false, false);
@@ -1520,9 +1529,11 @@ void KRMesh::optimize()
{ {
switch(getModelFormat()) { switch(getModelFormat()) {
case ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES: case ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES:
case ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_STRIP:
optimizeIndexes(); optimizeIndexes();
break; 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 convertToIndexed(); // HACK, FINDME, TODO - This may not be ideal in every case and should be exposed through the API independently
break; break;
} }
@@ -1571,6 +1582,7 @@ int KRMesh::getTriangleVertexIndex(int submesh, int index) const
void KRMesh::optimizeIndexes() void KRMesh::optimizeIndexes()
{ {
m_pData->lock(); m_pData->lock();
// TODO - Implement optimization for indexed strips
if(getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES) { if(getModelFormat() == ModelFormat::KRENGINE_MODEL_FORMAT_INDEXED_TRIANGLES) {
__uint16_t *new_indices = (__uint16_t *)malloc(0x10000 * sizeof(__uint16_t)); __uint16_t *new_indices = (__uint16_t *)malloc(0x10000 * sizeof(__uint16_t));