示例#1
0
//-----------------------------------------------------------------------------
// LLPolyMesh()
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
{
    LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);

    llassert(shared_data);

    mSharedData = shared_data;
    mReferenceMesh = reference_mesh;
    mAvatarp = NULL;
    mVertexData = NULL;

    mCurVertexCount = 0;
    mFaceIndexCount = 0;
    mFaceIndexOffset = 0;
    mFaceVertexCount = 0;
    mFaceVertexOffset = 0;

    if (shared_data->isLOD() && reference_mesh)
    {
        mCoords = reference_mesh->mCoords;
        mNormals = reference_mesh->mNormals;
        mScaledNormals = reference_mesh->mScaledNormals;
        mBinormals = reference_mesh->mBinormals;
        mScaledBinormals = reference_mesh->mScaledBinormals;
        mTexCoords = reference_mesh->mTexCoords;
        mClothingWeights = reference_mesh->mClothingWeights;
    }
    else
    {
        // Allocate memory without initializing every vector
        // NOTE: This makes asusmptions about the size of LLVector[234]
        int nverts = mSharedData->mNumVertices;
        int nfloats = nverts * (2*4 + 3*3 + 2 + 4);
        //use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
        mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
        int offset = 0;
        mCoords				= 	(LLVector4*)(mVertexData + offset);
        offset += 4*nverts;
        mNormals			=	(LLVector4*)(mVertexData + offset);
        offset += 4*nverts;
        mClothingWeights	= 	(LLVector4*)(mVertexData + offset);
        offset += 4*nverts;
        mTexCoords			= 	(LLVector2*)(mVertexData + offset);
        offset += 2*nverts;

        // these members don't need to be 16-byte aligned, but the first one might be
        // read during an aligned memcpy of mTexCoords
        mScaledNormals =                (LLVector3*)(mVertexData + offset);
        offset += 3*nverts;
        mBinormals =                    (LLVector3*)(mVertexData + offset);
        offset += 3*nverts;
        mScaledBinormals =              (LLVector3*)(mVertexData + offset);
        offset += 3*nverts;
        initializeForMorph();
    }
}
示例#2
0
//-----------------------------------------------------------------------------
// LLPolyMesh()
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
{       
	llassert(shared_data);

	mSharedData = shared_data;
	mReferenceMesh = reference_mesh;
	mAvatarp = NULL;
	mVertexData = NULL;

	mCurVertexCount = 0;
	mFaceIndexCount = 0;
	mFaceIndexOffset = 0;
	mFaceVertexCount = 0;
	mFaceVertexOffset = 0;

	if (shared_data->isLOD() && reference_mesh)
	{
		mCoords = reference_mesh->mCoords;
		mNormals = reference_mesh->mNormals;
		mScaledNormals = reference_mesh->mScaledNormals;
		mBinormals = reference_mesh->mBinormals;
		mScaledBinormals = reference_mesh->mScaledBinormals;
		mTexCoords = reference_mesh->mTexCoords;
		mClothingWeights = reference_mesh->mClothingWeights;
	}
	else
	{
		// Allocate memory without initializing every vector
		// NOTE: This makes asusmptions about the size of LLVector[234]
		S32 nverts = mSharedData->mNumVertices;
		//make sure it's an even number of verts for alignment
		nverts += nverts%2;
		S32 nfloats = nverts * (
					4 + //coords
					4 + //normals
					4 + //weights
					2 + //coords
					4 + //scaled normals
					4 + //binormals
					4); //scaled binormals

		//use 16 byte aligned vertex data to make LLPolyMesh SSE friendly
		mVertexData = (F32*) ll_aligned_malloc_16(nfloats*4);
		S32 offset = 0;
		mCoords				= 	(LLVector4a*)(mVertexData + offset); offset += 4*nverts;
		mNormals			=	(LLVector4a*)(mVertexData + offset); offset += 4*nverts;
		mClothingWeights	= 	(LLVector4a*)(mVertexData + offset); offset += 4*nverts;
		mTexCoords			= 	(LLVector2*)(mVertexData + offset);  offset += 2*nverts;
		mScaledNormals		=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
		mBinormals			=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts;
		mScaledBinormals	=   (LLVector4a*)(mVertexData + offset); offset += 4*nverts; 
		initializeForMorph();
	}
}