GLuint GLODMesh::createObject( const LODSettings& lodsettings ) { // check if object is already created assert( ( _lodGroupName == 0 ) && "LOD object has already been created!" ); // make a local copy of lod settings object _p_lodSettings = new LODSettings( lodsettings ); // first create a group createGroupName(); _lodObjectName = s_lodObject; ++s_lodObject; glodNewObject( _lodGroupName, _lodObjectName, _p_lodSettings->getMode() ); // create one single vertex array out of exsiting triangles and triangle strips osg::Vec3Array* p_vertarray = new osg::Vec3Array(); osg::IndexArray* p_indexarray = new osg::UShortArray(); osg::IndexArray* p_indices = _p_geometry->getVertexIndices(); unsigned int numPrims = _p_geometry->getNumPrimitiveSets(); { for ( unsigned int primcnt = 0; primcnt < numPrims; ++primcnt ) { osg::PrimitiveSet* p_set = _p_geometry->getPrimitiveSet( primcnt ); switch( p_set->getMode() ) { case osg::PrimitiveSet::TRIANGLES: buildObjectTrianlge( p_set, p_indices ); break; default: { log_warning << "unsupported primitive for building LOD, only TRIANGLES supported" << std::endl; continue; } } } } return _lodObjectName; }
void create_glod_object_from_vertex_buffers(S32 object, S32 group, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) { glodNewGroup(group); stop_gloderror(); glodNewObject(object, group, GLOD_DISCRETE); stop_gloderror(); for (U32 i = 0; i < vertex_buffers.size(); ++i) { vertex_buffers[i]->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); U32 num_indices = vertex_buffers[i]->getNumIndices(); if (num_indices > 2) { glodInsertElements(object, i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, vertex_buffers[i]->getIndicesPointer(), 0, 0.f); } stop_gloderror(); } glodBuildObject(object); stop_gloderror(); }