addTriangleSelector() crashes the program

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
reiskaG
Posts: 4
Joined: Thu Dec 21, 2006 4:25 pm

addTriangleSelector() crashes the program

Post by reiskaG »

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:

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;
}
No comments for rest of the code, please. It's not complite yet

And the Problem:

Image

I hope that you undestand my english and my problem.
JP
Posts: 4526
Joined: Tue Sep 13, 2005 2:56 pm
Location: UK
Contact:

Post by JP »

Would be a good idea to actually initialise the metaSelector ;)

metaSelector = smgr->createMetaTriangleSelector();
Image Image Image
Post Reply