From 3593afea3b3df07700803d4b2c67cf9e5f9d7cd2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 4 Jun 2015 11:37:02 -0700 Subject: [PATCH] optimize part offset calculation --- libraries/render-utils/src/Model.cpp | 29 ++++++++++++++-------------- libraries/render-utils/src/Model.h | 3 +++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index ab597051cc..cb8217d465 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -680,6 +680,7 @@ void Model::recalculateMeshBoxes(bool pickAgainstTriangles) { _calculatedMeshTriangles.clear(); _calculatedMeshTriangles.resize(numberOfMeshes); _calculatedMeshPartBoxes.clear(); + _calculatedMeshPartOffet.clear(); for (int i = 0; i < numberOfMeshes; i++) { const FBXMesh& mesh = geometry.meshes.at(i); Extents scaledMeshExtents = calculateScaledOffsetExtents(mesh.meshExtents); @@ -688,9 +689,10 @@ void Model::recalculateMeshBoxes(bool pickAgainstTriangles) { if (pickAgainstTriangles) { QVector thisMeshTriangles; + qint64 partOffset = 0; for (int j = 0; j < mesh.parts.size(); j++) { const FBXMeshPart& part = mesh.parts.at(j); - + bool atLeastOnePointInBounds = false; AABox thisPartBounds; @@ -773,6 +775,11 @@ void Model::recalculateMeshBoxes(bool pickAgainstTriangles) { } } _calculatedMeshPartBoxes[QPair(i, j)] = thisPartBounds; + _calculatedMeshPartOffet[QPair(i, j)] = partOffset; + + partOffset += part.quadIndices.size() * sizeof(int); + partOffset += part.triangleIndices.size() * sizeof(int); + } _calculatedMeshTriangles[i] = thisMeshTriangles; _calculatedMeshPartBoxesValid = true; @@ -2026,6 +2033,12 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran if (!_readyWhenAdded) { return; // bail asap } + + // we always need these properly calculated before we can render, this will likely already have been done + // since the engine will call our getPartBounds() before rendering us. + if (!_calculatedMeshPartBoxesValid) { + recalculateMeshBoxes(true); + } auto textureCache = DependencyManager::get(); gpu::Batch& batch = *(args->_batch); @@ -2211,19 +2224,7 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, bool tran meshPartsRendered++; - // FIX ME This is very unefficient - qint64 offset = 0; - for (int j = 0; j < partIndex; j++) { - const NetworkMeshPart& networkPart = networkMesh.parts.at(j); - const FBXMeshPart& part = mesh.parts.at(j); - if ((networkPart.isTranslucent() || part.opacity != 1.0f) != translucent) { - offset += (part.quadIndices.size() + part.triangleIndices.size()) * sizeof(int); - continue; - } - - offset += part.quadIndices.size() * sizeof(int); - offset += part.triangleIndices.size() * sizeof(int); - } + qint64 offset = _calculatedMeshPartOffet[QPair(meshIndex, partIndex)]; if (part.quadIndices.size() > 0) { batch.drawIndexed(gpu::QUADS, part.quadIndices.size(), offset); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 3795dc8731..85d0022cbc 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -367,6 +367,9 @@ private: }; QHash, AABox> _calculatedMeshPartBoxes; // world coordinate AABoxes for all sub mesh part boxes + QHash, qint64> _calculatedMeshPartOffet; + + bool _calculatedMeshPartBoxesValid; QVector _calculatedMeshBoxes; // world coordinate AABoxes for all sub mesh boxes bool _calculatedMeshBoxesValid;