void Viewer::updateTraversal()
{//主相機
if (_camera.valid() && _camera->getUpdateCallback()) _camera->accept(*_updateVisitor);
//從相機
for(unsigned int i=0; i<getNumSlaves(); ++i)
{ osg::Camera* camera = getSlave(i)._camera.get();
if (camera && camera->getUpdateCallback()) camera->accept(*_updateVisitor);
}
//主相機
if (_cameraManipulator.valid())
{ ……
_camera->setViewMatrix(_cameraManipulator->getInverseMatrix());
}
//從相機
updateSlaves();
}
void RenderStage::draw(osg::RenderInfo& renderInfo,RenderLeaf*& previous)
{
drawPreRenderStages(renderInfo,previous);
if (_camera && _camera->getPreDrawCallback())
{
// if we have a camera with a pre draw callback invoke it.
(*(_camera->getPreDrawCallback()))(renderInfo);
}
glFlush();
if (_camera && _camera->getPostDrawCallback())
{
// if we have a camera with a post draw callback invoke it.
(*(_camera->getPostDrawCallback()))(renderInfo);
}
drawPostRenderStages(renderInfo,previous);
if (_camera && _camera->getFinalDrawCallback())
{
// if we have a camera with a final callback invoke it.
(*(_camera->getFinalDrawCallback()))(renderInfo);
}
}
====================
Void RenderStage::drawImplementation(osg::RenderInfo&
renderInfo,RenderLeaf*& previous)
{
if (_clearMask & GL_DEPTH_BUFFER_BIT)
{
glClearDepth( _clearDepth);
glDepthMask ( GL_TRUE );
state.haveAppliedAttribute( osg::StateAttribute::DEPTH );
}
if (_clearMask & GL_STENCIL_BUFFER_BIT)
{
glClearStencil( _clearStencil);
glStencilMask ( ~0u );
state.haveAppliedAttribute( osg::StateAttribute::STENCIL );
}
if (_clearMask & GL_ACCUM_BUFFER_BIT)
{
glClearAccum( _clearAccum[0], _clearAccum[1], _clearAccum[2], _clearAccum[3]);
}
glClear( _clearMask );
}
====================
class Teapot : public osg::Drawable
{
virtual void drawImplementation(osg::RenderInfo&) const
{ teapot(14,GL_FILL);
}
}
下面這個是真正的繪製(使用Opengl函數):
static void teapot(GLint grid, GLenum type)
{
glMap2f();
glMapGrid2f();
glEvalMesh2();
}
====================
繪製文字:
Text::drawImplementation()
{ ……
glBegin(GL_LINES);
glDrawArrays();
}
畫長方體:
void DrawShapeVisitor::apply(const Box& box)
{
glTranslatef(box.getCenter().x(),box.getCenter().y(),box.getCenter().z());
glBegin(GL_QUADS);
if (createBody) {
// -ve y plane
glNormal3f(0.0f,-1.0f,0.0f);
glTexCoord2f(0.0f,1.0f);
glVertex3f(-dx,-dy,dz);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-dx,-dy,-dz);
glTexCoord2f(1.0f,0.0f);
glVertex3f(dx,-dy,-dz);
glTexCoord2f(1.0f,1.0f);
glVertex3f(dx,-dy,dz);
}
}
void ShapeDrawable::drawImplementation(RenderInfo& renderInfo) const
{
osg::State& state = *renderInfo.getState();
if (_shape.valid())
{
glColor4fv(_color.ptr());
DrawShapeVisitor dsv(state,_tessellationHints.get());
_shape->accept(dsv);
}
}
void Box::accept(osg::ShapeVisitor& sv) { sv.apply(*this); }
====================
void View::assignSceneDataToCameras()
{
if (_camera.valid())
{
_camera->removeChildren(0,_camera->getNumChildren());
if (sceneData) _camera->addChild(sceneData);
Renderer* renderer = dynamic_cast<Renderer*>(_camera->getRenderer());
if (renderer) renderer->setCompileOnNextDraw(true);
}
for(unsigned i=0; i<getNumSlaves(); ++i)
{
Slave& slave = getSlave(i);
if (slave._camera.valid() && slave._useMastersSceneData)
{
slave._camera->removeChildren(0,slave._camera->getNumChildren());
if (sceneData) slave._camera->addChild(sceneData);
Renderer* renderer = dynamic_cast<Renderer*>(slave._camera->getRenderer());
if (renderer) renderer->setCompileOnNextDraw(true);
}
}
}