summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llmeshoptimizer/llmeshoptimizer.cpp23
-rw-r--r--indra/llmeshoptimizer/llmeshoptimizer.h7
-rw-r--r--indra/newview/llmodelpreview.cpp16
3 files changed, 39 insertions, 7 deletions
diff --git a/indra/llmeshoptimizer/llmeshoptimizer.cpp b/indra/llmeshoptimizer/llmeshoptimizer.cpp
index 2f3d2491c2..0ddaa82c3d 100644
--- a/indra/llmeshoptimizer/llmeshoptimizer.cpp
+++ b/indra/llmeshoptimizer/llmeshoptimizer.cpp
@@ -40,6 +40,26 @@ LLMeshOptimizer::~LLMeshOptimizer()
}
//static
+void LLMeshOptimizer::generateShadowIndexBuffer(U16 *destination,
+ const U16 *indices,
+ U64 index_count,
+ const LLVector4a *vertex_positions,
+ U64 vertex_count
+)
+{
+ const size_t vertex_stride = 4; // should be either 0 or 4
+
+ meshopt_generateShadowIndexBuffer<unsigned short>(destination,
+ indices,
+ index_count,
+ (const float*)vertex_positions, // verify that it is correct to convert to float
+ vertex_count,
+ sizeof(LLVector4a),
+ vertex_stride
+ );
+}
+
+//static
U64 LLMeshOptimizer::simplify(U16 *destination,
const U16 *indices,
U64 index_count,
@@ -52,9 +72,6 @@ U64 LLMeshOptimizer::simplify(U16 *destination,
{
const size_t vertex_stride = 4; // should be either 0 or 4
- // Consider running meshopt_generateShadowIndexBuffer<unsigned short> first.
- // meshopt_generateShadowIndexBuffer is only needed if models don't use some of the vertices,
- // but since we call optimize() in a lot of cases, it likely isn't needed
return meshopt_simplify<unsigned short>(destination,
indices,
index_count,
diff --git a/indra/llmeshoptimizer/llmeshoptimizer.h b/indra/llmeshoptimizer/llmeshoptimizer.h
index c4250c537d..744856361c 100644
--- a/indra/llmeshoptimizer/llmeshoptimizer.h
+++ b/indra/llmeshoptimizer/llmeshoptimizer.h
@@ -36,6 +36,13 @@ public:
LLMeshOptimizer();
~LLMeshOptimizer();
+ static void LLMeshOptimizer::generateShadowIndexBuffer(
+ U16 *destination,
+ const U16 *indices,
+ U64 index_count,
+ const LLVector4a *vertex_positions,
+ U64 vertex_count);
+
// returns amount of indices in destiantion
// result_error returns how far from original the model is in % if not NULL
static U64 simplify(
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index c33b48c16e..471b29d850 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -1847,10 +1847,18 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, U32 decimation, bool en
S32 num_indices = face.mNumIndices;
std::vector<U16> output(num_indices); //todo: do not allocate per each face, add one large buffer somewhere
- // todo: run generateShadowIndexBuffer, at some stage, potentially inside simplify
+ /*
+ generateShadowIndexBuffer appears to deform model
+ LLMeshOptimizer::generateShadowIndexBuffer(
+ &shadow[0],
+ face.mIndices,
+ num_indices,
+ &face.mPositions[0],
+ face.mNumVertices);
+ */
S32 target_indices = llmax(3, llfloor(num_indices * indices_ratio)); // leave at least one triangle
- F32 result_code = 0; // how far from original the model is
+ F32 result_code = 0; // how far from original the model is, 1 == 100%
S32 new_indices = 0;
if (sloppy)
@@ -1859,7 +1867,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, U32 decimation, bool en
&output[0],
face.mIndices,
num_indices,
- &face.mPositions[0],
+ face.mPositions,
face.mNumVertices,
target_indices,
lod_error_threshold,
@@ -1872,7 +1880,7 @@ void LLModelPreview::genMeshOptimizerLODs(S32 which_lod, U32 decimation, bool en
&output[0],
face.mIndices,
num_indices,
- &face.mPositions[0],
+ face.mPositions,
face.mNumVertices,
target_indices,
lod_error_threshold,