Hi,

Here is a simplified version of the code with all of the motion tracking and 
camera movement taken out. As the code is right now, my program crashes when 
calling viewer >done() the first time. If I comment out viewer->realize(), the 
program crashes on the first call to viewer->frame(). If I comment out 
viewer->realize() and viewer->frame() the the program runs indefinitely.


Code:

#include <osg/Geode>
#include <osg/Group>
#include <osg/MatrixTransform>
#include <osg/NodeVisitor>
#include <osg/Notify>
#include <osg/PositionAttitudeTransform>
#include <osg/Quat>
#include <osg/TexGen>

#include <osgDB/DatabasePager>
#include <osgDB/ReadFile>
#include <osgDB/Registry>

#include <osgUtil/IntersectVisitor>
#include <osgUtil/Optimizer>

#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>

#include <gl/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <stdlib.h>
#include <iostream>



using namespace std;
using namespace osg;

#define PI 3.1415926535


float SCREEN_HEIGHT = .03409;//.03409;//7.75;   //unit: feet - because near 
plane was converted from 1.0 to 0.01
float SCREEN_WIDTH = SCREEN_HEIGHT*1.25;        //unit: feet
float CENTER_HEIGHT = SCREEN_HEIGHT / 2.0;      //unit: feet

float eye_height = 0.0;                         //eye height will read from a 
network shared file at the beginning.             
float METERS2FEET = 3.28084;    //ratio of 1 metre and 1 feet
int exptCondition = 0;

osgViewer::Viewer *viewer;


int main( int argc, char **argv )
{

        initTracker();

        // initialize the viewer.
        osg::ArgumentParser arguments(&argc,argv);

        viewer = new osgViewer::Viewer();

        /***************************************
        ELEVATORS
        Start of Elevator Scene Graph Code
        ***************************************/
        
        osg::Group* elevatorRoot = new osg::Group();
        
        //create nodes: later for full tower, consider arrays of nodes
        osg::Node* elevatorNode                 = NULL;
        osg::Node* elevatorShaftNode    = NULL;
        osg::Node* floorNode                    = NULL;
        osg::Node* glassNode                    = NULL;
        osg::Node* pillarNode                   = NULL;


        //create transformers                                                   
                = new osg::Group();
        osg::PositionAttitudeTransform* rootPATXform            = new 
osg::PositionAttitudeTransform();
        osg::PositionAttitudeTransform* elevatorXform           = new 
osg::PositionAttitudeTransform();
        osg::PositionAttitudeTransform* elevatorShaftXform      = new 
osg::PositionAttitudeTransform();
        osg::PositionAttitudeTransform* floorXform                      = new 
osg::PositionAttitudeTransform();
        osg::PositionAttitudeTransform* glassXform                      = new 
osg::PositionAttitudeTransform();
        osg::PositionAttitudeTransform* pillarXform                     = new 
osg::PositionAttitudeTransform();

        //create textures
        osg::Texture2D* elevatorTexture         = new osg::Texture2D;
        osg::Texture2D* elevatorShaftTexture            = new osg::Texture2D;
        osg::Texture2D* floorTexture                    = new osg::Texture2D;
        osg::Texture2D* glassTexture                    = new osg::Texture2D;
        osg::Texture2D* pillarTexture                   = new osg::Texture2D;

        elevatorTexture->setDataVariance(osg::Object::DYNAMIC);
        elevatorShaftTexture->setDataVariance(osg::Object::DYNAMIC);
        floorTexture->setDataVariance(osg::Object::DYNAMIC);
        glassTexture->setDataVariance(osg::Object::DYNAMIC);
        pillarTexture->setDataVariance(osg::Object::DYNAMIC);


        //load models
        elevatorNode            = 
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Elevators.obj");
        elevatorShaftNode       = 
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorShafts.obj");
        floorNode                       = 
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Floor.obj");
        glassNode                       = 
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Glass.obj");
        pillarNode                      = 
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Pillars.obj");

        
        

        //add transformers to root
        //rootnode->addChild(rootPAT);
        elevatorRoot->addChild(elevatorXform);
        elevatorRoot->addChild(elevatorShaftXform);
        elevatorRoot->addChild(floorXform);
        elevatorRoot->addChild(glassXform);
        elevatorRoot->addChild(pillarXform);

        //add models to graph
        rootPATXform->addChild(elevatorRoot);
        elevatorXform->addChild(elevatorNode);
        elevatorShaftXform->addChild(elevatorShaftNode);
        floorXform->addChild(floorNode);
        glassXform->addChild(glassNode);
        pillarXform->addChild(pillarNode);


        //scale and position elements
        float rotate    = 3.1415926/2.0;
        Vec3d axis              = Vec3d(0,0,1);
        Vec3d position  = Vec3d(-2.0,-1.4,-11.00);
        Vec3d farPos    = Vec3d(5.30,0.0,.00);

        //Scale and position the floor
        osg::Quat rootElevatorQuat = floorXform->getAttitude();
        rootElevatorQuat.makeRotate(rotate,axis);
        floorXform->setAttitude(rootElevatorQuat);
        floorXform->setPosition(position);

        //Scale and position the elevators
        rootElevatorQuat = elevatorXform->getAttitude();
        rootElevatorQuat.makeRotate(rotate,axis);
        elevatorXform->setAttitude(rootElevatorQuat);
        elevatorXform->setPosition(position);

        //Scale and position the elevator Shafts
        rootElevatorQuat = elevatorShaftXform->getAttitude();
        rootElevatorQuat.makeRotate(rotate,axis);
        elevatorShaftXform->setAttitude(rootElevatorQuat);
        elevatorShaftXform->setPosition(position);

        //Scale and position the glass
        rootElevatorQuat = glassXform->getAttitude();
        rootElevatorQuat.makeRotate(rotate,axis);
        glassXform->setAttitude(rootElevatorQuat);
        glassXform->setPosition(position);

        //scale and position the pillars
        rootElevatorQuat = pillarXform->getAttitude();
        rootElevatorQuat.makeRotate(rotate,axis);
        pillarXform->setAttitude(rootElevatorQuat);
        pillarXform->setPosition(position);


        //load Textures
        
        osg::Image* elevatorTextureImage = 
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorTexture.jpg");
        if (!elevatorTextureImage)
        {
                std::cout << " couldn't find elevator texture." << std::endl;
        }
        else{
                elevatorTexture->setImage(elevatorTextureImage);
                
elevatorNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, 
elevatorTexture, osg::StateAttribute::ON);
        }

        
        osg::Image* elevatorShaftTextureImage = 
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorShaftTexture.jpg");
        if (!elevatorShaftTextureImage)
        {
                std::cout << " couldn't find elevator shaft texture." << 
std::endl;
        }
        else{
                elevatorShaftTexture->setImage(elevatorShaftTextureImage);
                
elevatorShaftNode->getOrCreateStateSet()->setTextureAttributeAndModes( 0, 
elevatorShaftTexture, osg::StateAttribute::ON);
        }

        osg::Image* floorTextureImage   = 
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/FloorTexture.jpg");
        if (!floorTextureImage)
        {
                std::cout << " couldn't find chamber texture." << std::endl;
        }
        else{
                floorTexture->setImage(floorTextureImage);
                floorNode->getOrCreateStateSet()->setTextureAttributeAndModes( 
0, floorTexture, osg::StateAttribute::ON);
        }

        osg::Image* glassTextureImage = 
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/GlassTexture.jpg");
        if (!glassTextureImage)
        {
                std::cout << " couldn't find glass texture." << std::endl;
        }
        else{
                glassTexture->setImage(glassTextureImage);
                glassNode->getOrCreateStateSet()->setTextureAttributeAndModes( 
0, glassTexture, osg::StateAttribute::ON);
        }

        osg::Image* pillarTextureImage = 
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/PillarTexture.jpg");
        if (!pillarTextureImage)
        {
                std::cout << " couldn't find pillar texture." << std::endl;
        }
        else{
                pillarTexture->setImage(pillarTextureImage);
                pillarNode->getOrCreateStateSet()->setTextureAttributeAndModes( 
0, pillarTexture, osg::StateAttribute::ON);
        }

        

        
        /***************************************
        ELEVATORS
        End of Elevator Scene Graph Code
        ***************************************/

        viewer->setSceneData(elevatorRoot);


    osgViewer::Viewer::Windows windows;

    printf("Reached after user cursor null\n");

        osg::ref_ptr<osg::Camera> pcamera = viewer->getCamera();
        osg::Matrixd viewMatrix;

        /**********************************************************************
        Create two slave cameras
        ***********************************************************************/
        
    int xoffset = 0;
    int yoffset = 0;

    // left window + left slave camera
    {
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
        traits->x = xoffset + 0;
        traits->y = yoffset + 0;
        traits->width = 1280;
        traits->height = 1040;
        traits->windowDecoration = false;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;
        osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());

        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
        camera->setGraphicsContext(gc.get());
        camera->setViewport(new osg::Viewport(0,0, traits->width, 
traits->height));
        GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
        camera->setDrawBuffer(buffer);
        camera->setReadBuffer(buffer);

                
        camera->setNearFarRatio(.00000001);
        // add this slave camera to the viewer, with a shift left of the 
projection matrix
        viewer->addSlave(camera.get(), osg::Matrixd::translate(-0.030,0.0,0.0), 
osg::Matrixd::rotate(-.13962625, osg::Vec3d(0,1,0))); //0.2268928
                
    }



        // right window + right slave camera
    {
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new 
osg::GraphicsContext::Traits;
        traits->x = xoffset + 1280;
        traits->y = yoffset + 0;
        traits->width = 1280;
        traits->height = 1040;
        traits->windowDecoration = false;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;
        

        osg::ref_ptr<osg::GraphicsContext> gc = 
osg::GraphicsContext::createGraphicsContext(traits.get());

        osg::ref_ptr<osg::Camera> camera = new osg::Camera;
        camera->setGraphicsContext(gc.get());
        camera->setViewport(new osg::Viewport(0,0, traits->width, 
traits->height));
        GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
        camera->setDrawBuffer(buffer);
        camera->setReadBuffer(buffer);

        
        camera->setNearFarRatio(.00000001);

        // add this slave camera to the viewer, with a shift right of the 
projection matrix
                
        viewer->addSlave(camera.get(), osg::Matrixd::translate(-0.030,0.0,0.0), 
osg::Matrixd::rotate(.13962625, osg::Vec3d(0,1,0))); //0.2268928
                
    }
        

/*******************************************************************
ERRORS- Here is where the trouble happens. As the code is right now,
my program crashes when calling viewer->done() the first time.
If I comment out viewer->realize(), the program crashes on the first
call to viewer->frame(). If I comment out viewer->realize() and viewer->frame()
the the program runs indefinitely.
*******************************************************************/



     viewer->realize();

     int iter = 0;

    while( !viewer->done() )
    {
        cout<<"iter: "<<iter<<endl;
        iter++;
        viewer->frame();        
    }


    return 0;
}




Thank you!

Cheers,
Robert[/code]

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=39415#39415





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to