示例#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;
}
示例#2
0
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() );
}