//----------------------------------------------------------------------------- // freeData() //----------------------------------------------------------------------------- void LLPolyMorphData::freeData() { if (mCoords != NULL) { ll_aligned_free_16(mCoords); mCoords = NULL; } if (mNormals != NULL) { ll_aligned_free_16(mNormals); mNormals = NULL; } if (mBinormals != NULL) { ll_aligned_free_16(mBinormals); mBinormals = NULL; } if (mTexCoords != NULL) { delete [] mTexCoords; mTexCoords = NULL; } if (mVertexIndices != NULL) { delete [] mVertexIndices; mVertexIndices = NULL; } }
//---------------------------------------------------------------------------- void LLVertexBuffer::freeClientBuffer() { if(useVBOs() && sDisableVBOMapping && (mMappedData || mMappedIndexData)) { ll_aligned_free_16((void*)mMappedData) ; ll_aligned_free_16((void*)mMappedIndexData) ; mMappedData = NULL ; mMappedIndexData = NULL ; } }
void LLVertexBuffer::destroyGLIndices() { LLMemType mt(LLMemType::MTYPE_VERTEX_DATA); if (mGLIndices) { if (useVBOs()) { freeClientBuffer() ; if (mMappedData || mMappedIndexData) { llerrs << "Vertex buffer destroyed while mapped." << llendl; } releaseIndices(); } else { ll_aligned_free_16((void*)mMappedIndexData); mMappedIndexData = NULL; mEmpty = TRUE; } sAllocatedBytes -= getIndicesSize(); } mGLIndices = 0; //unbind(); }
//----------------------------------------------------------------------------- // ~LLPolyMesh() //----------------------------------------------------------------------------- LLPolyMesh::~LLPolyMesh() { S32 i; for (i = 0; i < mJointRenderData.count(); i++) { delete mJointRenderData[i]; mJointRenderData[i] = NULL; } ll_aligned_free_16(mVertexData); }
//----------------------------------------------------------------------------- // LLPolyMeshSharedData::freeMeshData() //----------------------------------------------------------------------------- void LLPolyMeshSharedData::freeMeshData() { if (!mReferenceData) { mNumVertices = 0; ll_aligned_free_16(mBaseCoords); mBaseCoords = NULL; ll_aligned_free_16(mBaseNormals); mBaseNormals = NULL; ll_aligned_free_16(mBaseBinormals); mBaseBinormals = NULL; ll_aligned_free_16(mTexCoords); mTexCoords = NULL; ll_aligned_free_16(mDetailTexCoords); mDetailTexCoords = NULL; ll_aligned_free_16(mWeights); mWeights = NULL; } mNumFaces = 0; delete [] mFaces; mFaces = NULL; mNumJointNames = 0; delete [] mJointNames; mJointNames = NULL; delete [] mTriangleIndices; mTriangleIndices = NULL; // mVertFaceMap.deleteAllData(); }
//----------------------------------------------------------------------------- // ~LLPolyMesh() //----------------------------------------------------------------------------- LLPolyMesh::~LLPolyMesh() { delete_and_clear(mJointRenderData); ll_aligned_free_16(mVertexData); }
void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices) { llassert(newnverts >= 0); llassert(newnindices >= 0); mRequestedNumVerts = newnverts; mRequestedNumIndices = newnindices; LLMemType mt(LLMemType::MTYPE_VERTEX_DATA); mDynamicSize = TRUE; if (mUsage == GL_STATIC_DRAW_ARB) { //always delete/allocate static buffers on resize destroyGLBuffer(); destroyGLIndices(); allocateBuffer(newnverts, newnindices, TRUE); mFinal = FALSE; } else if (newnverts > mNumVerts || newnindices > mNumIndices || newnverts < mNumVerts/2 || newnindices < mNumIndices/2) { sAllocatedBytes -= getSize() + getIndicesSize(); S32 oldsize = getSize(); S32 old_index_size = getIndicesSize(); updateNumVerts(newnverts); updateNumIndices(newnindices); S32 newsize = getSize(); S32 new_index_size = getIndicesSize(); sAllocatedBytes += newsize + new_index_size; if (newsize) { if (!mGLBuffer) { //no buffer exists, create a new one createGLBuffer(); } else { //delete old buffer, keep GL buffer for now if (!useVBOs()) { volatile U8* old = mMappedData; mMappedData = (U8*) ll_aligned_malloc_16(newsize); if (old) { memcpy((void*)mMappedData, (void*)old, llmin(newsize, oldsize)); if ((newsize > oldsize) && !sOmitBlank) { memset((void*)(mMappedData+oldsize), 0, newsize-oldsize); } ll_aligned_free_16((void*)old); } else { if (!sOmitBlank) memset((void*)mMappedData, 0, newsize); mEmpty = TRUE; } } mResized = TRUE; } } else if (mGLBuffer) { destroyGLBuffer(); } if (new_index_size) { if (!mGLIndices) { createGLIndices(); } else { if (!useVBOs()) { //delete old buffer, keep GL buffer for now volatile U8* old = mMappedIndexData; mMappedIndexData = (U8*) ll_aligned_malloc_16(new_index_size); if (old) { memcpy((void*)mMappedIndexData, (void*)old, llmin(new_index_size, old_index_size)); if ((new_index_size > old_index_size) && !sOmitBlank) { memset((void*)(mMappedIndexData+old_index_size), 0, new_index_size - old_index_size); } ll_aligned_free_16((void*)old); } else { if (!sOmitBlank) memset((void*)mMappedIndexData, 0, new_index_size); mEmpty = TRUE; } } mResized = TRUE; } } else if (mGLIndices) { destroyGLIndices(); } } if (mResized && useVBOs()) { freeClientBuffer() ; setBuffer(0); } }