Hi,
I'm having a problem with my application crashing when I try to create a
while(!viewer->done()) loop. The run time error I am getting is:
Unhandled exception at 0x00361710 in elevator.exe: 0xC0000005: Access violation
reading location 0x00000415.
Could someone take a look and help me out?
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>
int main( int argc, char **argv )
{
initTracker();
// initialize the viewer.
osg::ArgumentParser arguments(&argc,argv);
viewer = new osgViewer::Viewer(arguments);
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* chamberNode = NULL;
//create transformers
osg::PositionAttitudeTransform* rootPATXform = new
osg::PositionAttitudeTransform();
osg::PositionAttitudeTransform* elevatorXform = new
osg::PositionAttitudeTransform();
osg::PositionAttitudeTransform* elevatorShaftXform = new
osg::PositionAttitudeTransform();
osg::PositionAttitudeTransform* chamberXform = new
osg::PositionAttitudeTransform();
//create textures
osg::Texture2D* elevatorTexture = new osg::Texture2D;
osg::Texture2D* elevatorShaftTexture = new
osg::Texture2D;
osg::Texture2D* chamberTexture = new osg::Texture2D;
elevatorTexture->setDataVariance(osg::Object::DYNAMIC);
elevatorShaftTexture->setDataVariance(osg::Object::DYNAMIC);
chamberTexture->setDataVariance(osg::Object::DYNAMIC);
//load models
elevatorNode =
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorModelsV2.obj");
elevatorShaftNode =
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorShaftsModelV2.obj");
chamberNode =
osgDB::readNodeFile("C:/3DVisualizer_Ped_Walk/VE_Model/Floor.obj");
//add transformers to root
elevatorRoot->addChild(elevatorXform);
elevatorRoot->addChild(elevatorShaftXform);
elevatorRoot->addChild(chamberXform);
//add models to graph
rootPATXform->addChild(elevatorRoot);
elevatorXform->addChild(elevatorNode);
elevatorShaftXform->addChild(elevatorShaftNode);
chamberXform->addChild(chamberNode);
//scale and position elements
float rotate = 3.1415926/2.0;
osg::Vec3d axis = osg::Vec3d(0,0,1);
osg::Vec3d position = osg::Vec3d(0.0,0.0,.000);
osg::Vec3d farPos = osg::Vec3d(5.30,0.0,.00);
//Scale and position the chamber
osg::Quat rootElevatorQuat = chamberXform->getAttitude();
rootElevatorQuat.makeRotate(rotate,axis);
chamberXform->setAttitude(rootElevatorQuat);
chamberXform->setPosition(position);
//Scale and position the elevator
rootElevatorQuat = elevatorXform->getAttitude();
rootElevatorQuat.makeRotate(rotate,axis);
elevatorXform->setAttitude(rootElevatorQuat);
elevatorXform->setPosition(position);
//Scale and position the elevator Shaft
rootElevatorQuat = elevatorShaftXform->getAttitude();
rootElevatorQuat.makeRotate(rotate,axis);
elevatorShaftXform->setAttitude(rootElevatorQuat);
elevatorShaftXform->setPosition(position);
//load Textures
osg::Image* elevatorTextureImage =
osgDB::readImageFile("C:/3DVisualizer_Ped_Walk/VE_Model/ElevatorTexture.jpg");
if (!elevatorTextureImage)
{
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/ElevatorShaftTextureV2.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);
}
viewer->setSceneData(elevatorRoot);
osgViewer::Viewer::Windows windows;
//create 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);
// 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;
//showFrame(false);
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);
viewer->addSlave(camera.get(),
osg::Matrixd::translate(-0.030,0.0,0.0), osg::Matrixd::rotate(.13962625,
osg::Vec3d(0,1,0))); //0.2268928
}
viewer->realize();
//here is where it is crashing
while( !viewer->done() )
{
camUpdate(viewer);
viewer->frame();
}
return 0;
}
Thank you!
Cheers,
Robert
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=39279#39279
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org