addTriangleSelector() crashes the program
Posted: Thu Dec 21, 2006 4:39 pm
My first language is Finnish...
My problem is collision with MetaTriangleSelector. I'm adding triangleselector to the metatriangleselector and I compile the program. I run the program and then it stop for few seconds and then it crashes . If i take the addtriangleselector() away it works nicely.
The code:
No comments for rest of the code, please. It's not complite yet
And the Problem:
I hope that you undestand my english and my problem.
My problem is collision with MetaTriangleSelector. I'm adding triangleselector to the metatriangleselector and I compile the program. I run the program and then it stop for few seconds and then it crashes . If i take the addtriangleselector() away it works nicely.
The code:
Code: Select all
#include <irrlicht.h>
#include <iostream>
#include <windows.h>
using namespace irr;
int main()
{
// let user select driver type
video::E_DRIVER_TYPE driverType;
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");
char i;
std::cin >> i;
switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_SOFTWARE2;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}
// create device
IrrlichtDevice *device =
createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false);
if (device == 0)
return 1; // could not create selected driver.
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
scene::IMetaTriangleSelector* meettori = 0;
scene::IAnimatedMesh* q3levelmesh = smgr->getMesh("koo.bsp");
scene::ISceneNode* q3node = 0;
scene::IAnimatedMesh* maalimesh = smgr->getMesh("dwarf.x");
scene::ISceneNode* maali = 0;
if (q3levelmesh)
q3node = smgr->addOctTreeSceneNode(q3levelmesh->getMesh(0));
scene::ITriangleSelector* selector = 0;
//LOOK THIS
if (q3node)
{
q3node->setPosition(core::vector3df(-6.719374, 26.503641, 9.631497));
selector = smgr->createOctTreeTriangleSelector(q3levelmesh->getMesh(0), q3node, 128);
q3node->setTriangleSelector(selector);
meettori->addTriangleSelector(selector);
selector->drop();
}
//....
if (maalimesh)
maali = smgr->addOctTreeSceneNode(maalimesh->getMesh(0));
scene::ITriangleSelector* selector2 = 0;
if (maali)
{
maali->setPosition(core::vector3df(2350,200,45));
selector2 = smgr->createOctTreeTriangleSelector(maalimesh->getMesh(0), maali, 128);
maali->setTriangleSelector(selector2);
selector2->drop();
}
scene::ICameraSceneNode* camera =
smgr->addCameraSceneNodeFPS(0, 10.0f, 300.0f, -1, 0, 0, true);
camera->setPosition(core::vector3df(2350,200,45));
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(30,50,30),
core::vector3df(0,-3,0),
core::vector3df(0,50,0));
camera->addAnimator(anim);
anim->drop();
scene::ISceneNodeAnimator* anim2 = smgr->createCollisionResponseAnimator(
selector2, camera, core::vector3df(30,50,30),
core::vector3df(0,-3,0),
core::vector3df(0,50,0));
maali->addAnimator(anim2);
anim2->drop();
// disable mouse cursor
device->getCursorControl()->setVisible(false);
// add billboard
scene::IBillboardSceneNode * bill = smgr->addBillboardSceneNode();
bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );
bill->setMaterialFlag(video::EMF_LIGHTING, false);
bill->setMaterialFlag(video::EMF_ZBUFFER, false);
bill->setSize(core::dimension2d<f32>(20.0f, 20.0f));
// add 3 animated faeries.
video::SMaterial material;
material.Texture1 = driver->getTexture("../../media/faerie2.bmp");
material.Lighting = true;
material.Texture1 = 0;
material.Lighting = false;
// Add a light
smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
video::SColorf(1.0f,1.0f,1.0f,1.0f),
600.0f);
scene::ISceneNode* selectedSceneNode = 0;
scene::ISceneNode* lastSelectedSceneNode = 0;
int lastFPS = -1;
while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, 0);
smgr->drawAll();
if ( GetAsyncKeyState(27)) break;
core::line3d<f32> line;
line.start = camera->getPosition();
line.end = line.start + (camera->getTarget() - line.start).normalize() * 1000.0f;
core::vector3df intersection;
core::triangle3df tri;
selectedSceneNode = smgr->getSceneCollisionManager()->getSceneNodeFromCameraBB(camera);
if (lastSelectedSceneNode)
lastSelectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true);
if (selectedSceneNode == q3node || selectedSceneNode == bill)
selectedSceneNode = 0;
if (selectedSceneNode)
selectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
lastSelectedSceneNode = selectedSceneNode;
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"Collision detection example - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}
And the Problem:
I hope that you undestand my english and my problem.