//----------------------------------------------------------------------------- // 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(); } }
//----------------------------------------------------------------------------- // 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(); } }