Example #1
0
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;
}
Example #2
0
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 );
}