Hi, I'm expanding an application so that instead of one level of elevators, 
there can be several. However, when I am building my scene, one of my for loops 
causes the program to crash. I have a loop that assigns the models to their 
respective PositionAttitudeTransform pointers. However, after the very first 
call of elevatorShaftXforms[i]->addChild(elevatorShaftNodes[i]) the value of i 
jumps from 0 to 30934149 and numFloors changes from 7 to 5 and on the following 
line, I get the error:

Unhandled exception at 0x01d80485 in fltviewer.exe: 0xC0000096: Privileged 
instruction.



Code:
        int numFloors = 7;

        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;

        //node arrays
        osg::Node** elevatorShaftNodes  = new osg::Node *[numFloors];
        osg::Node** floorNodes                  = new osg::Node *[numFloors];
        osg::Node** glassNodes                  = new osg::Node *[numFloors];
        osg::Node** pillarNodes                 = new osg::Node *[numFloors];


        //create transformers
        //osg::Group* rootPAT                                                   
                = 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();

        //transformer arrays
        osg::PositionAttitudeTransform** elevatorShaftXforms    =       new 
osg::PositionAttitudeTransform *[numFloors];
        osg::PositionAttitudeTransform** floorXforms                    =       
new osg::PositionAttitudeTransform *[numFloors];
        osg::PositionAttitudeTransform** glassXforms                    =       
new osg::PositionAttitudeTransform *[numFloors];
        osg::PositionAttitudeTransform** pillarXforms                   =       
new osg::PositionAttitudeTransform *[numFloors];

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

        //assign models to nodes
        
        for(int i=0; i<numFloors; i++){
                elevatorShaftNodes[i]   = elevatorShaftNode;
                floorNodes[i]                   = floorNode;
                glassNodes[i]                   = glassNode;
                pillarNodes[i]                  = pillarNode;
        }
        
        

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

        for(int i=0; i<numFloors; i++){
                elevatorRoot->addChild(elevatorShaftXforms[i]);
                elevatorRoot->addChild(floorXforms[i]);
                elevatorRoot->addChild(glassXforms[i]);
                elevatorRoot->addChild(pillarXforms[i]);
        }

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


        for(int i=0; i<numFloors; i++){
                elevatorShaftXforms[i]->addChild(elevatorShaftNodes[i]);
//Here is where I am getting the error
                floorXforms[i]->addChild(floorNodes[i]);
                glassXforms[i]->addChild(glassNodes[i]);
                pillarXforms[i]->addChild(pillarNodes[i]);
                countChecker++;
        }
        

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

        for(int i=0; i<numFloors; i++){
                rootElevatorQuat = floorXforms[i]->getAttitude();
                rootElevatorQuat.makeRotate(rotate,axis);
                //floorXform->setAttitude(rootElevatorQuat);
                //floorXform->setPosition(position);
                floorXforms[i]->setAttitude(rootElevatorQuat);
                floorXforms[i]->setPosition(position + Vec3d(0,0,10 * (i-3)));
        }

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

        //Scale and position the elevator Shafts
        for(int i=0; i<numFloors; i++){
                rootElevatorQuat = elevatorShaftXforms[i]->getAttitude();
                rootElevatorQuat.makeRotate(rotate,axis);
                //elevatorShaftXform->setAttitude(rootElevatorQuat);
                //elevatorShaftXform->setPosition(position);
                elevatorShaftXforms[i]->setAttitude(rootElevatorQuat);
                elevatorShaftXforms[i]->setPosition(position + Vec3d(0,0,10 * 
(i-3)));
        }

        //Scale and position the glass
        for(int i=0; i<numFloors; i++){
                rootElevatorQuat = glassXforms[i]->getAttitude();
                rootElevatorQuat.makeRotate(rotate,axis);
                glassXforms[i]->setAttitude(rootElevatorQuat);
                glassXforms[i]->setPosition(position + Vec3d(0,0,10 * (i-3)));
        }

        //scale and position the pillars
        for(int i=0; i<numFloors; i++){
                rootElevatorQuat = pillarXforms[i]->getAttitude();
                rootElevatorQuat.makeRotate(rotate,axis);
                pillarXforms[i]->setAttitude(rootElevatorQuat);
                pillarXforms[i]->setPosition(position + Vec3d(0,0,10 * (i-3)));
        }


        rootnode->addChild(elevatorRoot);



        //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);
                for(int i=0; i<numFloors; i++){
                        
elevatorShaftNodes[i]->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);
                for(int i=0; i<numFloors; i++){
                        
floorNodes[i]->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);
                for(int i=0; i<numFloors; i++){
                        
glassNodes[i]->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);
                for(int i=0; i<numFloors; i++){
                        
pillarNodes[i]->getOrCreateStateSet()->setTextureAttributeAndModes( 0, 
pillarTexture, osg::StateAttribute::ON);
                }
        }

         



Thank you!

Cheers,
Robert

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





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to