本文整理汇总了C++中osg::Drawable类的典型用法代码示例。如果您正苦于以下问题:C++ Drawable类的具体用法?C++ Drawable怎么用?C++ Drawable使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Drawable类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: handle
void SimpleDotVisitor::handle(osg::Drawable &drawable, int id)
{
std::stringstream label;
label << "<top> " << drawable.className();
if (!drawable.getName().empty())
{
label << "| " << drawable.getName();
}
drawNode(id, "record", "solid", label.str(), "blue", "white");
}
示例2: apply
void apply(osg::Drawable& geom)
{
if (_hardware) {
osgAnimation::RigGeometry* rig = dynamic_cast<osgAnimation::RigGeometry*>(&geom);
if (rig)
rig->setRigTransformImplementation(new MyRigTransformHardware);
}
#if 0
if (geom.getName() != std::string("BoundingBox")) // we disable compute of bounding box for all geometry except our bounding box
geom.setComputeBoundingBoxCallback(new osg::Drawable::ComputeBoundingBoxCallback);
// geom.setInitialBound(new osg::Drawable::ComputeBoundingBoxCallback);
#endif
}
示例3: apply
void GLObjectsVisitor::apply(osg::Drawable& drawable)
{
if (_drawablesAppliedSet.count(&drawable)!=0) return;
if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("start of Drawable::apply(osg::Drawable& drawable)");
_drawablesAppliedSet.insert(&drawable);
if (drawable.getStateSet())
{
apply(*(drawable.getStateSet()));
}
if (_mode&SWITCH_OFF_DISPLAY_LISTS)
{
drawable.setUseDisplayList(false);
}
if (_mode&SWITCH_ON_DISPLAY_LISTS)
{
drawable.setUseDisplayList(true);
}
if (_mode&SWITCH_ON_VERTEX_BUFFER_OBJECTS)
{
drawable.setUseVertexBufferObjects(true);
}
if (_mode&SWITCH_OFF_VERTEX_BUFFER_OBJECTS)
{
drawable.setUseVertexBufferObjects(false);
}
if (_mode&COMPILE_DISPLAY_LISTS && _renderInfo.getState() &&
(drawable.getUseDisplayList() || drawable.getUseVertexBufferObjects()))
{
drawable.compileGLObjects(_renderInfo);
if (_checkGLErrors==osg::State::ONCE_PER_ATTRIBUTE) _renderInfo.getState()->checkGLErrors("after drawable.compileGLObjects() call in Drawable::apply(osg::Drawable& drawable) ");
}
if (_mode&RELEASE_DISPLAY_LISTS)
{
drawable.releaseGLObjects(_renderInfo.getState());
}
}
示例4: switch
void
VertexCacheOptimizer::apply(osg::Drawable& drawable)
{
if (drawable.getDataVariance() == osg::Object::DYNAMIC)
return;
osg::Geometry* geom = drawable.asGeometry();
if ( geom )
{
if ( geom->getDataVariance() == osg::Object::DYNAMIC )
return;
// vertex cache optimizations currently only support surface geometries.
// all or nothing in the geode.
osg::Geometry::PrimitiveSetList& psets = geom->getPrimitiveSetList();
for( osg::Geometry::PrimitiveSetList::iterator i = psets.begin(); i != psets.end(); ++i )
{
switch( (*i)->getMode() )
{
case GL_TRIANGLES:
case GL_TRIANGLE_FAN:
case GL_TRIANGLE_STRIP:
case GL_QUADS:
case GL_QUAD_STRIP:
case GL_POLYGON:
break;
default:
return;
}
}
}
//OE_NOTICE << LC << "VC optimizing..." << std::endl;
// passed the test; run the optimizer.
osgUtil::VertexCacheVisitor vcv;
drawable.accept( vcv );
vcv.optimizeVertices();
osgUtil::VertexAccessOrderVisitor vaov;
drawable.accept( vaov );
vaov.optimizeOrder();
traverse( drawable );
}
示例5: printTriangles
// decompose Drawable primitives into triangles, print out these triangles and computed normals.
void printTriangles(const std::string& name, osg::Drawable& drawable)
{
std::cout<<name<<std::endl;
osg::TriangleFunctor<NormalPrint> tf;
drawable.accept(tf);
std::cout<<std::endl;
}
示例6: apply
void GLObjectsVisitor::apply(osg::Drawable& drawable)
{
if (_drawablesAppliedSet.count(&drawable)!=0) return;
_drawablesAppliedSet.insert(&drawable);
if (_mode&SWITCH_OFF_DISPLAY_LISTS)
{
drawable.setUseDisplayList(false);
}
if (_mode&SWITCH_ON_DISPLAY_LISTS)
{
drawable.setUseDisplayList(true);
}
if (_mode&SWITCH_ON_VERTEX_BUFFER_OBJECTS)
{
drawable.setUseVertexBufferObjects(true);
}
if (_mode&SWITCH_OFF_VERTEX_BUFFER_OBJECTS)
{
drawable.setUseVertexBufferObjects(false);
}
if (_mode&COMPILE_DISPLAY_LISTS && _renderInfo.getState() &&
(drawable.getUseDisplayList() || drawable.getUseVertexBufferObjects()))
{
drawable.compileGLObjects(_renderInfo);
}
if (_mode&RELEASE_DISPLAY_LISTS)
{
drawable.releaseGLObjects(_renderInfo.getState());
}
if (drawable.getStateSet())
{
apply(*(drawable.getStateSet()));
}
}
示例7: computeNearestPointInFrustum
CullVisitor::value_type CullVisitor::computeNearestPointInFrustum(const osg::Matrix& matrix, const osg::Polytope::PlaneList& planes,const osg::Drawable& drawable)
{
// OSG_WARN<<"CullVisitor::computeNearestPointInFrustum("<<getTraversalNumber()<<"\t"<<planes.size()<<std::endl;
osg::TriangleFunctor<ComputeNearestPointFunctor> cnpf;
cnpf.set(_computed_znear, matrix, &planes);
drawable.accept(cnpf);
return cnpf._znear;
}
示例8: apply
virtual void apply(osg::Drawable &drawable)
{
if (!mTriangleMesh)
mTriangleMesh.reset(new btTriangleMesh);
osg::Matrixf worldMat = osg::computeLocalToWorld(getNodePath());
osg::TriangleFunctor<GetTriangleFunctor> functor;
functor.setTriMesh(mTriangleMesh.get());
functor.setMatrix(worldMat);
drawable.accept(functor);
}
示例9: apply
void ShaderGenVisitor::apply(osg::Drawable &drawable)
{
osg::StateSet *stateSet = drawable.getStateSet();
if (stateSet)
_state->pushStateSet(stateSet);
update(&drawable);
if (stateSet)
_state->popStateSet();
}
示例10: apply
void StatsVisitor::apply(osg::Drawable& drawable)
{
if (drawable.getStateSet())
{
++_numInstancedStateSet;
_statesetSet.insert(drawable.getStateSet());
}
++_numInstancedDrawable;
drawable.accept(_instancedStats);
_drawableSet.insert(&drawable);
osg::Geometry* geometry = dynamic_cast<osg::Geometry*>(&drawable);
if (geometry)
{
++_numInstancedGeometry;
_geometrySet.insert(geometry);
}
}
示例11: apply
void
BuildTopologyVisitor::apply(osg::Drawable& drawable)
{
osg::Geometry* geom = drawable.asGeometry();
if (geom)
{
osg::Vec3Array* verts = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
if (verts)
{
apply(&drawable, verts);
}
}
}
示例12: apply
void ShaderVisitor::apply(osg::Drawable& drawable)
{
// non-Geometry drawable (e.g. particle system)
bool needPop = (drawable.getStateSet() != NULL);
if (drawable.getStateSet())
{
pushRequirements();
applyStateSet(drawable.getStateSet(), drawable);
}
if (!mRequirements.empty())
{
const ShaderRequirements& reqs = mRequirements.back();
// TODO: find a better place for the stateset
if (reqs.mShaderRequired || mForceShaders)
createProgram(reqs, drawable);
}
if (needPop)
popRequirements();
}
示例13: traverse
void
AllocateAndMergeBufferObjectsVisitor::apply(osg::Drawable& drawable)
{
osg::Geometry* geom = drawable.asGeometry();
if ( geom )
{
// We disable vbo's and then re-enable them to enable sharing of all the arrays.
geom->setUseDisplayList( false );
geom->setUseVertexBufferObjects( false );
geom->setUseVertexBufferObjects( true );
}
traverse(drawable);
}
示例14: apply
void StatsVisitor::apply(osg::Drawable& drawable)
{
if (drawable.getStateSet())
{
apply(*drawable.getStateSet());
}
++_numInstancedDrawable;
drawable.accept(_instancedStats);
_drawableSet.insert(&drawable);
osg::Geometry* geometry = drawable.asGeometry();
if (geometry)
{
++_numInstancedGeometry;
_geometrySet.insert(geometry);
++_numInstancedFastGeometry;
_fastGeometrySet.insert(geometry);
}
}
示例15: updateCalculatedNearFar
bool CullVisitor::updateCalculatedNearFar(const osg::Matrix& matrix,const osg::Drawable& drawable, bool isBillboard)
{
const osg::BoundingBox& bb = drawable.getBound();
value_type d_near, d_far;
if (isBillboard)
{
#ifdef TIME_BILLBOARD_NEAR_FAR_CALCULATION
static unsigned int lastFrameNumber = getTraversalNumber();
static unsigned int numBillboards = 0;
static double elapsed_time = 0.0;
if (lastFrameNumber != getTraversalNumber())
{
OSG_NOTICE<<"Took "<<elapsed_time<<"ms to test "<<numBillboards<<" billboards"<<std::endl;
numBillboards = 0;
elapsed_time = 0.0;
lastFrameNumber = getTraversalNumber();
}
osg::Timer_t start_t = osg::Timer::instance()->tick();
#endif
osg::Vec3 lookVector(-matrix(0,2),-matrix(1,2),-matrix(2,2));
unsigned int bbCornerFar = (lookVector.x()>=0?1:0) +
(lookVector.y()>=0?2:0) +
(lookVector.z()>=0?4:0);
unsigned int bbCornerNear = (~bbCornerFar)&7;
d_near = distance(bb.corner(bbCornerNear),matrix);
d_far = distance(bb.corner(bbCornerFar),matrix);
OSG_NOTICE.precision(15);
if (false)
{
OSG_NOTICE<<"TESTING Billboard near/far computation"<<std::endl;
// OSG_WARN<<"Checking corners of billboard "<<std::endl;
// deprecated brute force way, use all corners of the bounding box.
value_type nd_near, nd_far;
nd_near = nd_far = distance(bb.corner(0),matrix);
for(unsigned int i=0;i<8;++i)
{
value_type d = distance(bb.corner(i),matrix);
if (d<nd_near) nd_near = d;
if (d>nd_far) nd_far = d;
OSG_NOTICE<<"\ti="<<i<<"\td="<<d<<std::endl;
}
if (nd_near==d_near && nd_far==d_far)
{
OSG_NOTICE<<"\tBillboard near/far computation correct "<<std::endl;
}
else
{
OSG_NOTICE<<"\tBillboard near/far computation ERROR\n\t\t"<<d_near<<"\t"<<nd_near
<<"\n\t\t"<<d_far<<"\t"<<nd_far<<std::endl;
}
}
#ifdef TIME_BILLBOARD_NEAR_FAR_CALCULATION
osg::Timer_t end_t = osg::Timer::instance()->tick();
elapsed_time += osg::Timer::instance()->delta_m(start_t,end_t);
++numBillboards;
#endif
}
else
{
// efficient computation of near and far, only taking into account the nearest and furthest
// corners of the bounding box.
d_near = distance(bb.corner(_bbCornerNear),matrix);
d_far = distance(bb.corner(_bbCornerFar),matrix);
}
if (d_near>d_far)
{
std::swap(d_near,d_far);
if ( !EQUAL_F(d_near, d_far) )
{
OSG_WARN<<"Warning: CullVisitor::updateCalculatedNearFar(.) near>far in range calculation,"<< std::endl;
OSG_WARN<<" correcting by swapping values d_near="<<d_near<<" dfar="<<d_far<< std::endl;
}
}
if (d_far<0.0)
{
// whole object behind the eye point so discard
return false;
}
if (d_near<_computed_znear)
{
if (_computeNearFar==COMPUTE_NEAR_FAR_USING_PRIMITIVES)
{
//.........这里部分代码省略.........