// extract the GLOD data into vertex buffers void create_vertex_buffers_from_glod_object(S32 object, S32 group, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) { vertex_buffers.clear(); GLint patch_count = 0; glodGetObjectParameteriv(object, GLOD_NUM_PATCHES, &patch_count); stop_gloderror(); GLint* sizes = new GLint[patch_count*2]; glodGetObjectParameteriv(object, GLOD_PATCH_SIZES, sizes); stop_gloderror(); GLint* names = new GLint[patch_count]; glodGetObjectParameteriv(object, GLOD_PATCH_NAMES, names); stop_gloderror(); for (S32 i = 0; i < patch_count; i++) { LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0, 0); if (sizes[i*2+1] > 0 && sizes[i*2] > 0) { buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true); buff->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); glodFillElements(object, names[i], GL_UNSIGNED_SHORT, buff->getIndicesPointer()); stop_gloderror(); } else { // this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0) buff->allocateBuffer(1, 3, true); } vertex_buffers.push_back(buff); } glodDeleteObject(object); stop_gloderror(); glodDeleteGroup(group); stop_gloderror(); delete [] sizes; delete [] names; }
GLODMesh::~GLODMesh() { if ( _lodObjectName ) glodDeleteObject( _lodObjectName ); if ( _lodGroupName ) glodDeleteGroup( _lodGroupName ); --s_glodNumObjects; if ( s_glodNumObjects == 0 ) { // shutdown GLOD glodShutdown(); // reset group and object id counters s_lodGroup = 1; s_lodObject = 1; } }