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 LODSettings::apply( GLODMesh* p_lodmesh ) { const LODSettings* p_ls = p_lodmesh->getLODSettings(); assert( p_ls && "invalid lod object" ); GLuint objectname = p_lodmesh->getObjectName(); //! TODO: should we replace the hardcoded params here by user-defined ones? glodObjectParameteri( objectname, GLOD_BUILD_OPERATOR, GLOD_OPERATOR_EDGE_COLLAPSE ); glodObjectParameteri( objectname, GLOD_BUILD_ERROR_METRIC, GLOD_METRIC_SPHERES ); glodObjectParameteri( objectname, GLOD_BUILD_BORDER_MODE, GLOD_BORDER_LOCK ); glodObjectParameteri( objectname, GLOD_BUILD_QUEUE_MODE, GLOD_QUEUE_GREEDY ); glodGroupParameteri( objectname, GLOD_ADAPT_MODE, p_ls->getAdaptationMode() ); glodGroupParameteri( objectname, GLOD_ERROR_MODE, p_ls->getErrorMode() ); if ( p_ls->getAdaptationMode() == GLOD_ERROR_THRESHOLD ) glodGroupParameterf( objectname, p_ls->getErrorMode(), p_ls->getErrorThreshold() ); else // GLOD_TRIANGLE_BUDGET glodGroupParameterf( objectname, p_ls->getErrorMode(), p_ls->getMaxTriangles() ); }