LLPointer<LLModel> LLMeshReduction::reduce(LLModel* in_model, F32 limit, S32 mode) { LLVertexBuffer::unbind(); // create vertex buffers from model std::vector<LLPointer<LLVertexBuffer> > in_vertex_buffers; create_vertex_buffers_from_model(in_model, in_vertex_buffers); // create glod object from vertex buffers stop_gloderror(); S32 glod_group = mCounter++; S32 glod_object = mCounter++; create_glod_object_from_vertex_buffers(glod_object, glod_group, in_vertex_buffers); // set reduction parameters stop_gloderror(); if (mode == TRIANGLE_BUDGET) { // triangle budget mode glodGroupParameteri(glod_group, GLOD_ADAPT_MODE, GLOD_TRIANGLE_BUDGET); stop_gloderror(); glodGroupParameteri(glod_group, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); stop_gloderror(); S32 triangle_count = (S32)limit; glodGroupParameteri(glod_group, GLOD_MAX_TRIANGLES, triangle_count); stop_gloderror(); } else if (mode == ERROR_THRESHOLD) { // error threshold mode glodGroupParameteri(glod_group, GLOD_ADAPT_MODE, GLOD_ERROR_THRESHOLD); glodGroupParameteri(glod_group, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); F32 error_threshold = limit; glodGroupParameterf(glod_group, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, error_threshold); stop_gloderror(); } else { // not a legal mode return NULL; } // do the reduction glodAdaptGroup(glod_group); stop_gloderror(); // convert glod object into vertex buffers std::vector<LLPointer<LLVertexBuffer> > out_vertex_buffers; create_vertex_buffers_from_glod_object(glod_object, glod_group, out_vertex_buffers); // convert vertex buffers into a model LLPointer<LLModel> out_model = create_model_from_vertex_buffers(out_vertex_buffers); return out_model; }
void LODDrawCallback::drawImplementation( osg::State& state, const osg::Drawable* p_drawable ) const { assert( _p_lodMesh && "lod mesh data not available!" ); const GLuint groupname = _p_lodMesh->getGroupName(); const GLuint objectname = _p_lodMesh->getObjectName(); const GLuint numpatches = _p_lodMesh->getNumPatches(); // need for LOD adaptation? if ( _p_lodMesh->adaptLOD() ) { glodBindObjectXform( objectname, GL_PROJECTION_MATRIX | GL_MODELVIEW_MATRIX ); glodAdaptGroup( groupname ); // reset the adaptation flag after every adaptation // the adaptation is triggered by update callback _p_lodMesh->setAdaptLOD( false ); } // apply drawable's state state.apply( p_drawable->getStateSet() ); // draw the object patches for( GLuint patch = 0; patch < numpatches; ++patch ) glodDrawPatch( objectname, patch ); }