diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llprimitive/lldaeloader.cpp | 13 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 159 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 1 | 
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();  | 
