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