summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreyL ProductEngine <alihatskiy@productengine.com>2017-01-03 17:31:57 +0200
committerAndreyL ProductEngine <alihatskiy@productengine.com>2017-01-03 17:31:57 +0200
commit892d3207d6f6d4506a6675a917b374651fa7f9c4 (patch)
treec01f3e8d557327dcecb995b173216ee7dc04b16d
parentaf3aad098d97171b0873f6486d7b5513d2a409f8 (diff)
parent4fc012fbfae8975c2240c70c2c3311263ceee5ac (diff)
Merged in lindenlab/viewer-lynx
-rw-r--r--indra/llprimitive/lldaeloader.cpp13
-rw-r--r--indra/llprimitive/llmodel.cpp159
-rw-r--r--indra/llprimitive/llmodel.h1
3 files changed, 8 insertions, 165 deletions
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index 4f500adefc..76d3a405d8 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -1003,11 +1003,6 @@ bool LLDAELoader::OpenFile(const std::string& filename)
std::sort(mModelList.begin(), mModelList.end(), ModelSort());
- if (!mNoNormalize)
- {
- LLModel::normalizeModels(mModelList);
- }
-
model_list::iterator model_iter = mModelList.begin();
while (model_iter != mModelList.end())
{
@@ -2436,6 +2431,8 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
//
ret->sortVolumeFacesByMaterialName();
+ bool normalized = false;
+
int submodelID = 0;
// remove all faces that definitely won't fit into one model and submodel limit
@@ -2450,6 +2447,12 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
{
// Insure we do this once with the whole gang and not per-model
//
+ if (!normalized && !mNoNormalize)
+ {
+ normalized = true;
+ ret->normalizeVolumeFaces();
+ }
+
ret->trimVolumeFacesToSize(LL_SCULPT_MESH_MAX_FACES, &remainder);
if (!mNoOptimize)
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index 0c313e460e..db6d00bc2c 100644
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -178,165 +178,6 @@ void LLModel::trimVolumeFacesToSize(U32 new_count, LLVolume::face_list_t* remain
}
}
-// Shrink group of models to fit
-// on a 1x1x1 cube centered at the origin.
-void LLModel::normalizeModels(std::vector<LLPointer<LLModel > > model_list)
-{
- std::vector<LLPointer<LLModel > >::iterator iter = model_list.begin();
-
- LLVector4a min, max;
- while (iter != model_list.end() && (*iter)->mVolumeFaces.empty())
- {
- iter++;
- }
- if (iter == model_list.end())
- {
- // no models with faces
- return;
- }
-
- min = (*iter)->mVolumeFaces[0].mExtents[0];
- max = (*iter)->mVolumeFaces[0].mExtents[1];
-
- // Treat models as a group - each model out of 1x1x1 cube
- // needs scaling and will affect whole group scale
- while (iter != model_list.end())
- {
- LLPointer<LLModel> model = *iter++;
-
- if (model.notNull() && !model->mVolumeFaces.empty())
- {
- // For all of the volume faces
- // in the model, loop over
- // them and see what the extents
- // of the volume along each axis.
-
- for (U32 i = 0; i < model->mVolumeFaces.size(); ++i)
- {
- LLVolumeFace& face = model->mVolumeFaces[i];
-
- update_min_max(min, max, face.mExtents[0]);
- update_min_max(min, max, face.mExtents[1]);
-
- if (face.mTexCoords)
- {
- LLVector2& min_tc = face.mTexCoordExtents[0];
- LLVector2& max_tc = face.mTexCoordExtents[1];
-
- min_tc = face.mTexCoords[0];
- max_tc = face.mTexCoords[0];
-
- for (U32 j = 1; j < face.mNumVertices; ++j)
- {
- update_min_max(min_tc, max_tc, face.mTexCoords[j]);
- }
- }
- else
- {
- face.mTexCoordExtents[0].set(0, 0);
- face.mTexCoordExtents[1].set(1, 1);
- }
- }
- }
- }
-
- // Now that we have the extents of the model
- // we can compute the offset needed to center
- // the model at the origin.
-
- // Compute center of the model
- // and make it negative to get translation
- // needed to center at origin.
- LLVector4a trans;
- trans.setAdd(min, max);
- trans.mul(-0.5f);
-
- // Compute the total size along all
- // axes of the model.
- LLVector4a size;
- size.setSub(max, min);
-
- // Prevent division by zero.
- F32 x = size[0];
- F32 y = size[1];
- F32 z = size[2];
- F32 w = size[3];
- if (fabs(x) < F_APPROXIMATELY_ZERO)
- {
- x = 1.0;
- }
- if (fabs(y) < F_APPROXIMATELY_ZERO)
- {
- y = 1.0;
- }
- if (fabs(z) < F_APPROXIMATELY_ZERO)
- {
- z = 1.0;
- }
- size.set(x, y, z, w);
-
- // Compute scale as reciprocal of size
- LLVector4a scale;
- scale.splat(1.f);
- scale.div(size);
-
- LLVector4a inv_scale(1.f);
- inv_scale.div(scale);
-
- iter = model_list.begin();
- // apply fixed scale and trans to all models as a single group
- while (iter != model_list.end())
- {
- LLPointer<LLModel> model = *iter++;
-
- if (model.isNull() || model->mVolumeFaces.empty())
- {
- continue;
- }
-
- for (U32 i = 0; i < model->mVolumeFaces.size(); ++i)
- {
- LLVolumeFace& face = model->mVolumeFaces[i];
-
- // We shrink the extents so
- // that they fall within
- // the unit cube.
- face.mExtents[0].add(trans);
- face.mExtents[0].mul(scale);
-
- face.mExtents[1].add(trans);
- face.mExtents[1].mul(scale);
-
- // For all the positions, we scale
- // the positions to fit within the unit cube.
- LLVector4a* pos = (LLVector4a*)face.mPositions;
- LLVector4a* norm = (LLVector4a*)face.mNormals;
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- pos[j].add(trans);
- pos[j].mul(scale);
- if (norm && !norm[j].equals3(LLVector4a::getZero()))
- {
- norm[j].mul(inv_scale);
- norm[j].normalize3();
- }
- }
- }
-
- // mNormalizedScale is the scale at which
- // we would need to multiply the model
- // by to get the original size of the
- // model instead of the normalized size.
- LLVector4a normalized_scale;
- normalized_scale.splat(1.f);
- normalized_scale.div(scale);
- model->mNormalizedScale.set(normalized_scale.getF32ptr());
- model->mNormalizedTranslation.set(trans.getF32ptr());
- model->mNormalizedTranslation *= -1.f;
- }
-}
-
// Shrink the model to fit
// on a 1x1x1 cube centered at the origin.
// The positions and extents
diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h
index 755fac9c87..097558ef67 100644
--- a/indra/llprimitive/llmodel.h
+++ b/indra/llprimitive/llmodel.h
@@ -176,7 +176,6 @@ public:
void addFace(const LLVolumeFace& face);
void sortVolumeFacesByMaterialName();
- static void normalizeModels(std::vector<LLPointer<LLModel > > model_list);
void normalizeVolumeFaces();
void trimVolumeFacesToSize(U32 new_count = LL_SCULPT_MESH_MAX_FACES, LLVolume::face_list_t* remainder = NULL);
void optimizeVolumeFaces();