OSG繪製的部分流程(待修改完善)????????????

 主相機,從相機:

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);

        }

    }   

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章