Hi GuiYe,
All the cull settings that you've being doing with SceneView in 1.2
can now be done directly with osg::Camera as it subclasses from
osg::CullSettings. For the most part you just need to rewrite the
code to do stuff like:
viewer.getCamera()->setComputeNearFarMode(..);
Robert.
2008/1/16 GuiYe <[EMAIL PROTECTED]>:
>
>
>
>
> Hello,robert!
>
> I use the code to load the nodes from the commandline arguments. Just like
> these(a example of osgWater today I receive):
>
> #include "WaterPlane.h"
> #include <osgDB/ReadFile>
> #include <osgUtil/Optimizer>
> #include <osgProducer/Viewer>
> #include <osg/CoordinateSystemNode>
> #include <osg/Group>
> #include <osg/Node>
> #include <osg/CameraNode>
> #include <osg/Texture>
> #include <osg/TexGenNode>
> #include <osg/ShapeDrawable>
> #include <osg/State>
> #include <osg/StateSet>
> #include <osg/Material>
> #include <osgUtil/SceneView>
> #include <osg/Texture2D>
> #include <osg/CameraNode>
> #include <osg/Shader>
> #include <osg/Uniform>
> #include <osg/Program>
>
> class Ocean : public osg::Drawable {
> public:
> Ocean(osgUtil::SceneView* );
> /** Copy constructor using CopyOp to manage deep vs shallow copy.*/
> Ocean(const Ocean& teapot,const osg::CopyOp&
> copyop=osg::CopyOp::SHALLOW_COPY):
> osg::Drawable(teapot,copyop) {}
> META_Object(myOcean,Ocean)
> /** Compute the bounding box around Drawables's geometry.*/
> virtual osg::BoundingBox computeBound() const;
> /** Deprecated. */
> virtual void drawImplementation(osg::State&) const;
>
> class OceanNodeUpdateCallback : public osg::NodeCallback {
> public:
> OceanNodeUpdateCallback(Ocean* ocean){
> m_Ocean = ocean;
> }
> virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
> // first update subgraph to make sure objects are all moved into
> position
> traverse(node,nv);
> // update scene
> osg::Vec3 eye,center,up;
>
> m_Ocean->m_SceneView->getCamera()->getViewMatrixAsLookAt(eye,center,up);
> m_Ocean->m_camObserving.position(eye, center);
> //aim the projecting camera
> m_Ocean->m_WaterPlane->aimProjector(&(m_Ocean->m_camProjecting),
> &(m_Ocean->m_camObserving));
> m_Ocean->m_camProjecting.saveFrustum(m_Ocean->m_SceneView);
> m_Ocean->m_camObserving.position(eye, center);
> m_Ocean->m_camObserving.saveFrustum(m_Ocean->m_SceneView);
> double time = .1;
> //update and render water plane
> m_Ocean->m_WaterPlane->update(m_Ocean->m_SceneView,time,
> &(m_Ocean->m_camProjecting), &(m_Ocean->m_camObserving));
> //m_Ocean->dirtyBound();
> //osg::BoundingBox bb;
> //osg::Vec3d minBB,maxBB;
> //m_Ocean->m_WaterPlane->getBoundBox(minBB,maxBB);
> //bb.set(minBB,maxBB);
> //m_Ocean->setBound(bb);
> }
> Ocean* m_Ocean;
> };
>
>
> void updateBoundingBox(osg::BoundingBox);
> WaterPlane* m_WaterPlane;
> Ocean() {};
> virtual ~Ocean() {
> delete m_WaterPlane;
> }
> osgUtil::SceneView* m_SceneView;
> Camera m_camProjecting; //the "extra camera" used to project the
> water, based on m_camObserving but modified if necessary
> Camera m_camObserving; //the camera in the scene
> osg::BoundingBox m_boundingBox;
> osg::CameraNode* createReflectionsMap(osg::Group* waterScene, osg::Node*
> reflectedScene, unsigned int textureID);
> osg::Texture2D* m_textureReflections;
> osg::CameraNode* m_cameraNodeReflections;
> osg::TexGenNode* m_texgenNodeReflections;
> osg::CameraNode* createRefractionsMap(osg::Group* waterScene, osg::Node*
> refractionsScene, unsigned int textureID);
> osg::Texture2D* m_textureRefractions;
> osg::CameraNode* m_cameraNodeRefractions;
> osg::TexGenNode* m_texgenNodeRefractions;
> };
> osg::CameraNode* Ocean::createReflectionsMap(osg::Group* waterScene,
> osg::Node* reflectedScene, unsigned int textureID){
> m_textureReflections = new osg::Texture2D;
> m_textureReflections->setTextureSize(1024, 1024);
> m_textureReflections->setInternalFormat(GL_RGBA);
>
> m_textureReflections->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
>
> m_textureReflections->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
>
> m_textureReflections->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER);
>
> m_textureReflections->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER);
> m_textureReflections->setBorderColor(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
> // create the camera
> m_cameraNodeReflections = new osg::CameraNode;
> m_cameraNodeReflections->setClearColor(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
> m_cameraNodeReflections->setViewport(0,0,512,512);
> m_cameraNodeReflections->setRenderOrder(osg::CameraNode::PRE_RENDER);
> m_cameraNodeReflections->attach(osg::CameraNode::COLOR_BUFFER ,
> m_textureReflections);
> m_cameraNodeReflections->addChild(reflectedScene);
>
> // create the texgen node to project the tex coords onto the subgraph
> m_texgenNodeReflections = new osg::TexGenNode;
> m_texgenNodeReflections->setTextureUnit(textureID);
> waterScene->addChild(m_texgenNodeReflections);
>
> m_WaterPlane->setTexGenNodeReflections(m_texgenNodeReflections);
> osg::StateSet* waterSceneStateSet = waterScene->getOrCreateStateSet();
>
> waterSceneStateSet->setTextureAttributeAndModes(textureID,m_textureReflections,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_S,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_T,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_R,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON);
> return m_cameraNodeReflections;
> }
>
> osg::CameraNode* Ocean::createRefractionsMap(osg::Group* waterScene,
> osg::Node* refractionsScene, unsigned int textureID){
> m_textureRefractions = new osg::Texture2D;
> m_textureRefractions->setTextureSize(1024, 1024);
> m_textureRefractions->setInternalFormat(GL_RGBA);
>
> m_textureRefractions->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
>
> m_textureRefractions->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
>
> m_textureRefractions->setWrap(osg::Texture2D::WRAP_S,osg::Texture2D::CLAMP_TO_BORDER);
>
> m_textureRefractions->setWrap(osg::Texture2D::WRAP_T,osg::Texture2D::CLAMP_TO_BORDER);
> m_textureRefractions->setBorderColor(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
> // create the camera
> m_cameraNodeRefractions = new osg::CameraNode;
> m_cameraNodeRefractions->setClearColor(osg::Vec4(0.1f, 0.4f, 0.6f, 0.0f));
> m_cameraNodeRefractions->setViewport(0,0,512,512);
> m_cameraNodeRefractions->setRenderOrder(osg::CameraNode::PRE_RENDER);
> m_cameraNodeRefractions->attach(osg::CameraNode::COLOR_BUFFER,
> m_textureRefractions);
> m_cameraNodeRefractions->addChild(refractionsScene);
>
> // create the texgen node to project the tex coords onto the subgraph
> m_texgenNodeRefractions = new osg::TexGenNode;
> m_texgenNodeRefractions->setTextureUnit(textureID);
> waterScene->addChild(m_texgenNodeRefractions);
> m_WaterPlane->setTexGenNodeRefractions(m_texgenNodeRefractions);
> osg::StateSet* waterSceneStateSet = waterScene->getOrCreateStateSet();
>
> waterSceneStateSet->setTextureAttributeAndModes(textureID,m_textureRefractions,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_S,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_T,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_R,osg::StateAttribute::ON);
>
> waterSceneStateSet->setTextureMode(textureID,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON);
>
> return m_cameraNodeRefractions;
> }
>
> Ocean::Ocean(osgUtil::SceneView* sv){
> m_SceneView = sv;
> m_WaterPlane = new WaterPlane;
> m_WaterPlane->init();
> m_WaterPlane->setPreset(10, 0.0075, 180.0f, 200.0f, true);
> m_WaterPlane->setWaterColor(0.1f, 0.4f, 0.6f, 0.0f);
> dirtyDisplayList();
> setUseDisplayList(false);
> setUseVertexBufferObjects(false);
> }
> osg::BoundingBox Ocean::computeBound() const {
> return m_boundingBox;
> }
> void Ocean::updateBoundingBox(osg::BoundingBox bb){
> m_boundingBox = bb;
> setBound(bb);
> }
>
> void Ocean::drawImplementation(osg::State& state) const {
>
>
> // render it
> m_WaterPlane->render(&m_camObserving);//, &m_skybox[m_currentSkybox],
> m_modelList);
>
>
> }
>
> int main( int argc, char **argv )
> {
> // use an ArgumentParser object to manage the program arguments.
> osg::ArgumentParser arguments(&argc,argv);
>
> // construct the viewer.
> osgProducer::Viewer viewer(arguments);
> // set up the value with sensible default event handlers.
> viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
> // get details on keyboard and mouse bindings used by the viewer.
> viewer.getUsage(*arguments.getApplicationUsage());
>
> osg::Timer_t start_tick = osg::Timer::instance()->tick();
>
> // read the scene from the list of file specified command line args.
> osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
>
>
>
> osg::Timer_t end_tick = osg::Timer::instance()->tick();
> std::cout << "Time to load =
> "<<osg::Timer::instance()->delta_s(start_tick,end_tick)<<std::endl;
>
>
> // create the windows and run the threads.
> viewer.realize();
>
> // load the nodes from the commandline arguments.
>
> osgProducer::Viewer::SceneHandlerList::iterator sh_it =
> viewer.getSceneHandlerList().begin();
> osgProducer::OsgSceneHandler* sh =sh_it->get();
>
>
> // not used for fix, beacause is a very bad solution
> m_sceneView->getCullVisitor()->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR);
> osg::Group* waterGroup = new osg::Group;
> osg::Geode* waterRoot = new osg::Geode();
> Ocean* ocean = new Ocean(sh->getSceneView());
> osg::StateSet* oceanSS = ocean->getOrCreateStateSet();
> osg::Material* waterMaterial = new osg::Material;
> waterMaterial->setAlpha(osg::Material::Face::FRONT_AND_BACK,0.5f);
> waterMaterial->setShininess(osg::Material::Face::FRONT_AND_BACK,10);
>
> waterMaterial->setAmbient(osg::Material::Face::FRONT_AND_BACK,osg::Vec4(0.1f,
> 0.4f, 0.6f, 0.0f));
>
> waterMaterial->setDiffuse(osg::Material::Face::FRONT_AND_BACK,osg::Vec4(0.1f,
> 0.4f, 0.6f, 0.0f));
>
> waterMaterial->setEmission(osg::Material::Face::FRONT_AND_BACK,osg::Vec4(0.1f,
> 0.4f, 0.6f, 0.0f));
> waterMaterial->setTransparency(osg::Material::Face::FRONT_AND_BACK,0.5f);
> oceanSS->setAttributeAndModes(waterMaterial);
> oceanSS->setMode(GL_BLEND, osg::StateAttribute::ON);
> oceanSS->setRenderingHint( osg::StateSet::TRANSPARENT_BIN );
> waterRoot->addDrawable( ocean );
> osg::Group* waterSurfaceGroup = new osg::Group;
> waterSurfaceGroup->addChild(waterRoot);
>
> osg::CameraNode* relectionsCam =
> ocean->createReflectionsMap(waterSurfaceGroup,loadedModel.get(),0);
> osg::CameraNode* refractionsCam =
> ocean->createRefractionsMap(waterSurfaceGroup,loadedModel.get(),1);
> ocean->m_WaterPlane->setCameraNodes(relectionsCam,refractionsCam);
>
> waterGroup->addChild(waterSurfaceGroup);
> waterGroup->addChild(relectionsCam);
> waterGroup->addChild(refractionsCam);
>
>
>
>
> //Shader
> osg::ref_ptr<osg::Program> program = new osg::Program;
> osg::ref_ptr<osg::Shader> vertShader = new
> osg::Shader(osg::Shader::VERTEX);
> osg::ref_ptr<osg::Shader> fragShader= new
> osg::Shader(osg::Shader::FRAGMENT);
> vertShader->loadShaderSourceFromFile("envmap.vert");
> fragShader->loadShaderSourceFromFile("envmap.frag");
> program->addShader( vertShader.get() );
> program->addShader( fragShader.get() );
>
> waterSurfaceGroup->getOrCreateStateSet()->setAttributeAndModes(program.get(),
> osg::StateAttribute::ON);
> waterSurfaceGroup->getOrCreateStateSet()->addUniform(new
> osg::Uniform("Reflection", 0));
> waterSurfaceGroup->getOrCreateStateSet()->addUniform(new
> osg::Uniform("Refraction", 1));
> ocean->m_WaterPlane->addUniforms(waterSurfaceGroup);
>
> ocean->dirtyBound();
> osg::BoundingBox bb;
> osg::Vec3d minBB,maxBB;
> minBB = loadedModel.get()->getBound().center() -
> osg::Vec3d(1.,1.,0)*loadedModel.get()->getBound().radius();
> maxBB = loadedModel.get()->getBound().center() +
> osg::Vec3d(1.,1.,0)*loadedModel.get()->getBound().radius();
> bb.set(minBB,maxBB);
> ocean->updateBoundingBox(bb);
>
> waterGroup->setUpdateCallback(new Ocean::OceanNodeUpdateCallback(ocean));
>
> osg::Group* root = new osg::Group;
> root->addChild(waterGroup);
> // model
> root->addChild(loadedModel.get());
>
>
> {
> osg::Geode* geode = new osg::Geode;
> osg::Geometry* geom =
> osg::createTexturedQuadGeometry(osg::Vec3(0,0,0),osg::Vec3(256.0,0.0,0.0),osg::Vec3(0.0,256.0,0.0));
>
> geom->getOrCreateStateSet()->setTextureAttributeAndModes(0,ocean->m_textureReflections,osg::StateAttribute::ON);
> geode->addDrawable(geom);
> osg::CameraNode* camera = new osg::CameraNode;
> camera->setProjectionMatrix(osg::Matrix::ortho2D(0,512,0,512));
> camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
> camera->setViewMatrix(osg::Matrix::identity());
> camera->setViewport(50,600-1*102,512,512);
> camera->setClearMask(GL_DEPTH_BUFFER_BIT);
> camera->setRenderOrder(osg::CameraNode::POST_RENDER);
> camera->addChild(geode);
> root->addChild(camera);
> }
> {
> osg::Geode* geode = new osg::Geode;
> osg::Geometry* geom =
> osg::createTexturedQuadGeometry(osg::Vec3(0,0,0),osg::Vec3(256.0,0.0,0.0),osg::Vec3(0.0,256.0,0.0));
>
> geom->getOrCreateStateSet()->setTextureAttributeAndModes(0,ocean->m_textureRefractions,osg::StateAttribute::ON);
> geode->addDrawable(geom);
> osg::CameraNode* camera = new osg::CameraNode;
> camera->setProjectionMatrix(osg::Matrix::ortho2D(0,512,0,512));
> camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
> camera->setViewMatrix(osg::Matrix::identity());
> camera->setViewport(50,600-2*260,512,512);
> camera->setClearMask(GL_DEPTH_BUFFER_BIT);
> camera->setRenderOrder(osg::CameraNode::POST_RENDER);
> camera->addChild(geode);
> root->addChild(camera);
> }
> // pass the loaded scene graph to the viewer.
> viewer.setSceneData(root);
> //double ne,fa;
> //ne = 1.0;
> //fa = 15000.0;
>
> //sh->getSceneView()->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR);
> //sh->getSceneView()->setProjectionMatrixAsPerspective(45,1.0,ne,fa);
>
> while( !viewer.done() )
> {
> // wait for all cull and draw threads to complete.
> viewer.sync();
>
> // update the scene by traversing it with the the update visitor
> which will
> // call all node update callbacks and animations.
> viewer.update();
>
> // fire off the cull and draw traversals of the scene.
> viewer.frame();
>
>
> }
>
> // wait for all cull and draw threads to complete.
> viewer.sync();
> // run a clean up frame to delete all OpenGL objects.
> viewer.cleanup_frame();
> // wait for all the clean up frame to complete.
> viewer.sync();
>
> return 0;
> }
>
>
> osgProducer::Viewer::SceneHandlerList::iterator sh_it =
> viewer.getSceneHandlerList().begin();
> osgProducer::OsgSceneHandler* sh =sh_it->get();
>
> 在2008-01-16,GuiYe <[EMAIL PROTECTED]> 写道:
>
>
>
>
>
> Hello,robert!
> I want to use the code:
>
> > osgProducer::Viewer::SceneHandlerList::iterator sh_it =
> > viewer.getSceneHandlerList().begin();
> > osgProducer::OsgSceneHandler* sh =sh_it->get();
>
>
> to load the nodes from the commandline arguments.
>
> What should I do ?
>
> Thank you~~~
>
>
> >Hi GuiYei,
>
> >The osgViewer doesn't have an OsgSceneHandler and their isn't an
> equivalent.
>
> >Perhaps you could provide a bit of information about what you were
> >doing with the OsgSceneHandler then we might be able to suggest how to
> >replace this code.
>
> >Robert.
>
>
> >2008/1/16 GuiYe <[EMAIL PROTECTED]>:
> >
> >
> >
> > Hello~~
> >
> > I once wrote some in OpenSceneGraph1.2.Now I use OpenSceneGraph2.2,I
> want
> > to rewrite it.But I can't find some functions to replace some code:
> >
> > osgProducer::Viewer::SceneHandlerList::iterator sh_it =
> > viewer.getSceneHandlerList().begin();
> > osgProducer::OsgSceneHandler* sh =sh_it->get();
> >
> >
> > Who can give me some code to replace all above code in
> > OpenSceneGraph2.2??
> >
> > Thank you~~~~~~
> >
> >
> > ________________________________
> >
> > 又过年了,千万别忘了把你的爱带回家
> > 为爱珍选,唯有金典
> > _______________________________________________
> > osg-users mailing list
> > [email protected]
>
> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >
> >
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>
> ________________________________
>
> 又过年了,千万别忘了把你的爱带回家
> 为爱珍选,唯有金典
>
> ________________________________
>
> 又过年了,千万别忘了把你的爱带回家
> 为爱珍选,唯有金典
>
>
>
> ________________________________
>
> 又过年了,千万别忘了把你的爱带回家
> 为爱珍选,唯有金典
>
> ________________________________
>
> 又过年了,千万别忘了把你的爱带回家
> 为爱珍选,唯有金典
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org