osgEarth 2.1.1
|
Public Member Functions | |
AMRGeometry () | |
AMRGeometry (const AMRGeometry &rhs, const osg::CopyOp &op=osg::CopyOp::DEEP_COPY_ALL) | |
META_Object (osgEarth, AMRGeometry) | |
virtual osg::BoundingBox | computeBound () const |
void | clearDrawList () |
void | setDrawList (const AMRDrawableList &drawList) |
Public Attributes | |
osg::ref_ptr< osg::Program > | _program |
Protected Member Functions | |
virtual void | drawImplementation (osg::RenderInfo &renderInfo) const |
Private Types | |
typedef std::vector < osg::ref_ptr < osg::DrawElements > > | Pattern |
Private Member Functions | |
void | initShaders () |
void | initPatterns () |
Private Attributes | |
AMRDrawableList | _drawList |
Pattern | _pattern |
int | _numPatternVerts |
int | _numPatternElements |
int | _numPatternStrips |
int | _numPatternTriangles |
osg::ref_ptr< osg::Vec3Array > | _verts |
osg::ref_ptr< osg::Vec2Array > | _texCoords |
osg::ref_ptr < osg::VertexBufferObject > | _patternVBO |
osg::ref_ptr < osg::ElementBufferObject > | _patternEBO |
Adaptive Mesh Refining Geometry.
This class extends OSG's geometry object to perform adaptive mesh refinement using a virtual vertex manifold and a globally shared VBO that contains the refinement patches.
Definition at line 78 of file AMRGeometry.
typedef std::vector< osg::ref_ptr<osg::DrawElements> > AMRGeometry::Pattern [private] |
Definition at line 104 of file AMRGeometry.
AMRGeometry::AMRGeometry | ( | ) |
Definition at line 92 of file AMRGeometry.cpp.
{ initShaders(); initPatterns(); //this->setBound( osg::BoundingBox(-1e10, -1e10, -1e10, 1e10, 1e10, 1e10) ); }
AMRGeometry::AMRGeometry | ( | const AMRGeometry & | rhs, |
const osg::CopyOp & | op = osg::CopyOp::DEEP_COPY_ALL |
||
) |
Definition at line 100 of file AMRGeometry.cpp.
: osg::Drawable( rhs, op ) //osg::Geometry( rhs, op ) { //todo setInitialBound( osg::BoundingBox(-1e10, -1e10, -1e10, 1e10, 1e10, 1e10) ); }
void AMRGeometry::clearDrawList | ( | ) |
Empties the draw list of manifold triangles.
Definition at line 123 of file AMRGeometry.cpp.
osg::BoundingBox AMRGeometry::computeBound | ( | ) | const [virtual] |
Definition at line 108 of file AMRGeometry.cpp.
{ osg::BoundingBox box; for( AMRDrawableList::const_iterator i = _drawList.begin(); i != _drawList.end(); ++i ) { const AMRTriangleList& prims = i->get()->_triangles; for( AMRTriangleList::const_iterator j = prims.begin(); j != prims.end(); ++j ) { j->get()->expand( box ); } } return box; }
void AMRGeometry::drawImplementation | ( | osg::RenderInfo & | renderInfo | ) | const [protected, virtual] |
renders the draw list.
Definition at line 277 of file AMRGeometry.cpp.
{ osg::State& state = *renderInfo.getState(); // bind the VBO: state.setVertexPointer( _verts.get() ); // bind the texture coordinate arrrays: state.setTexCoordPointer( 0, _texCoords.get() ); // this will enable the amr geometry's stateset (and activate the Program) state.pushStateSet( this->getStateSet() ); //state.pushStateSet(0L); //_program->apply( state ); int numTemplates = 0; for( AMRDrawableList::const_iterator i = _drawList.begin(); i != _drawList.end(); ++i ) { const AMRDrawable* drawable = i->get(); // apply the drawable's state changes: state.pushStateSet( drawable->_stateSet.get() ); for( AMRTriangleList::const_iterator j = drawable->_triangles.begin(); j != drawable->_triangles.end(); ++j ) { const AMRTriangle* dtemplate = j->get(); // apply the primitive's state changes: state.apply( dtemplate->_stateSet.get() ); // render the pattern (a collection of primitive sets) for( Pattern::const_iterator p = _pattern.begin(); p != _pattern.end(); ++p ) { p->get()->draw( state, true ); } numTemplates++; } state.popStateSet(); } if ( s_numTemplates != numTemplates ) { s_numTemplates = numTemplates; OE_INFO << LC << std::dec << "templates=" << numTemplates << ", verts=" << numTemplates*_numPatternVerts << ", strips=" << numTemplates*_numPatternStrips << ", tris=" << numTemplates*_numPatternTriangles << ", elements=" << numTemplates*_numPatternElements << std::endl; } // unbind the buffer objects. state.unbindVertexBufferObject(); state.unbindElementBufferObject(); // undo the program. state.popStateSet(); }
void AMRGeometry::initPatterns | ( | ) | [private] |
Definition at line 202 of file AMRGeometry.cpp.
{ _numPatternVerts = 0; _numPatternElements = 0; _numPatternStrips = 0; _numPatternTriangles = 0; this->setUseVertexBufferObjects( true ); this->setUseDisplayList( false ); _patternVBO = new osg::VertexBufferObject(); _verts = new osg::Vec3Array(); _verts->setVertexBufferObject( _patternVBO.get() ); _texCoords = new osg::Vec2Array(); _texCoords->setVertexBufferObject( _patternVBO.get() ); // build a right-triangle pattern. (0,0) is the lower-left (90d), // (0,1) is the lower right (45d) and (1,0) is the upper-left (45d) osg::Vec3f p1(0,0,0), p2(0,1,0), p3(1,0,0); for( int r=AMR_PATCH_ROWS-1; r >=0; --r ) { int cols = AMR_PATCH_ROWS-r; //OE_INFO << "ROW " << r << std::endl; for( int c=0; c<cols; ++c ) { osg::Vec3 point( (float)c/(float)(AMR_PATCH_ROWS-1), (float)r/(float)(AMR_PATCH_ROWS-1), 0 ); osg::Vec3 baryVert; osg::Vec2 baryTex; toBarycentric( p1, p2, p3, point, baryVert, baryTex ); _verts->push_back( baryVert ); _texCoords->push_back( baryTex ); } } _numPatternVerts = _verts->size(); unsigned short off = 0; unsigned short rowptr = off; _patternEBO = new osg::ElementBufferObject(); for( int r=1; r<AMR_PATCH_ROWS; ++r ) { rowptr += r; osg::DrawElementsUShort* e = new osg::DrawElementsUShort( GL_TRIANGLE_STRIP ); e->setElementBufferObject( _patternEBO.get() ); for( int c=0; c<=r; ++c ) { e->push_back( rowptr + c ); if ( c < r ) e->push_back( rowptr + c - r ); } OE_INFO << std::endl; _pattern.push_back( e ); _numPatternStrips++; _numPatternElements += e->size(); _numPatternTriangles += (e->size()-1)/2; } OE_INFO << LC << "Pattern: " << std::dec << "verts=" << _numPatternVerts << ", strips=" << _numPatternStrips << ", tris=" << _numPatternTriangles << ", elements=" << _numPatternElements << std::endl; }
void AMRGeometry::initShaders | ( | ) | [private] |
Definition at line 140 of file AMRGeometry.cpp.
{ // initialize the shader program. _program = new osg::Program(); _program->setName( "AMRGeometry" ); osg::Shader* vertexShader = new osg::Shader( osg::Shader::VERTEX, //std::string( source_vertShaderMain_flatMethod ) std::string( source_vertShaderMain_geocentricMethod ) + std::string( source_geodeticToXYZ ) + std::string( source_rotVecToGeodetic ) //std::string( source_vertShaderMain_latLonMethod ) //std::string( source_vertShaderMain_slerpMethod ) ); vertexShader->setName( "AMR Vert Shader" ); _program->addShader( vertexShader ); osg::Shader* fragmentShader = new osg::Shader( osg::Shader::FRAGMENT, std::string( source_fragShaderMain ) ); fragmentShader->setName( "AMR Frag Shader" ); _program->addShader( fragmentShader ); // the shader program: this->getOrCreateStateSet()->setAttribute( _program.get(), osg::StateAttribute::ON ); }
AMRGeometry::META_Object | ( | osgEarth | , |
AMRGeometry | |||
) |
void AMRGeometry::setDrawList | ( | const AMRDrawableList & | drawList | ) |
Sets an entire new triangle list.
Definition at line 133 of file AMRGeometry.cpp.
{ _drawList = drawList; dirtyBound(); }
AMRDrawableList AMRGeometry::_drawList [private] |
Definition at line 100 of file AMRGeometry.
int AMRGeometry::_numPatternElements [private] |
Definition at line 107 of file AMRGeometry.
int AMRGeometry::_numPatternStrips [private] |
Definition at line 108 of file AMRGeometry.
int AMRGeometry::_numPatternTriangles [private] |
Definition at line 109 of file AMRGeometry.
int AMRGeometry::_numPatternVerts [private] |
Definition at line 106 of file AMRGeometry.
Pattern AMRGeometry::_pattern [private] |
Definition at line 105 of file AMRGeometry.
osg::ref_ptr<osg::ElementBufferObject> AMRGeometry::_patternEBO [private] |
Definition at line 114 of file AMRGeometry.
osg::ref_ptr<osg::VertexBufferObject> AMRGeometry::_patternVBO [private] |
Definition at line 113 of file AMRGeometry.
osg::ref_ptr<osg::Program> AMRGeometry::_program |
Definition at line 118 of file AMRGeometry.
osg::ref_ptr<osg::Vec2Array> AMRGeometry::_texCoords [private] |
Definition at line 112 of file AMRGeometry.
osg::ref_ptr<osg::Vec3Array> AMRGeometry::_verts [private] |
Definition at line 111 of file AMRGeometry.