Can anyone help me with this?

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
sarabulho
Posts: 7
Joined: Mon Aug 17, 2009 3:33 pm

Can anyone help me with this?

Post by sarabulho »

Hey everybody!

I'm making a game and i seem to have a problem, i used the irrlicht example number 11 - Per Pixel Lighting, and applyed the collision example to have both light shaders, and collisions. When i run the game my walls look like a disco, when i exchange between parallax mapping and bump mapping the all of the walls loose their textures and stay grey and then come back, does anyone know why does this happens?
FuzzYspo0N
Posts: 914
Joined: Fri Aug 03, 2007 12:43 pm
Location: South Africa
Contact:

Post by FuzzYspo0N »

You might need to show us exactly what you are trying as, you might have butchered the code and we cant tell ;)

Are there any screenshots , too?
sarabulho
Posts: 7
Joined: Mon Aug 17, 2009 3:33 pm

Post by sarabulho »

Code: Select all

#include <irrlicht.h>
#include <iostream>

using namespace irr;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif


class MyEventReceiver : public IEventReceiver
{
public:

	MyEventReceiver(scene::ISceneNode* room,
		gui::IGUIEnvironment* env, video::IVideoDriver* driver)
	{
		// store pointer to room so we can change its drawing mode
		Room = room;
		Driver = driver;

		// set a nicer font
		gui::IGUISkin* skin = env->getSkin();
		gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
		if (font)
			skin->setFont(font);

		// add window and listbox
		gui::IGUIWindow* window = env->addWindow(
			core::rect<s32>(460,375,630,470), false, L"Use 'E' + 'R' to change");

		ListBox = env->addListBox(
			core::rect<s32>(2,22,165,88), window);

		ListBox->addItem(L"Diffuse");
		ListBox->addItem(L"Bump mapping");
		ListBox->addItem(L"Parallax mapping");
		ListBox->setSelected(1);

		// create problem text
		ProblemText = env->addStaticText(
			L"Your hardware or this renderer is not able to use the "\
			L"needed shaders for this material. Using fall back materials.",
			core::rect<s32>(150,20,470,80));

		ProblemText->setOverrideColor(video::SColor(100,255,255,255));

		// set start material (prefer parallax mapping if available)
		video::IMaterialRenderer* renderer =
			Driver->getMaterialRenderer(video::EMT_PARALLAX_MAP_SOLID);
		if (renderer && renderer->getRenderCapability() == 0)
			ListBox->setSelected(2);

		// set the material which is selected in the listbox
		setMaterial();
	}

	bool OnEvent(const SEvent& event)
	{
		// check if user presses the key 'E' or 'R'
		if (event.EventType == irr::EET_KEY_INPUT_EVENT &&
			!event.KeyInput.PressedDown && Room && ListBox)
		{
			// change selected item in listbox

			int sel = ListBox->getSelected();
			if (event.KeyInput.Key == irr::KEY_KEY_R)
				++sel;
			else
			if (event.KeyInput.Key == irr::KEY_KEY_E)
				--sel;
			else
				return false;

			if (sel > 2) sel = 0;
			if (sel < 0) sel = 2;
			ListBox->setSelected(sel);

			// set the material which is selected in the listbox
			setMaterial();
		}

		return false;
	}

private:

	// sets the material of the room mesh the the one set in the
	// list box.
	void setMaterial()
	{
		video::E_MATERIAL_TYPE type = video::EMT_SOLID;

		// change material setting
		switch(ListBox->getSelected())
		{
		case 0: type = video::EMT_SOLID;
			break;
		case 1: type = video::EMT_NORMAL_MAP_SOLID;
			break;
		case 2: type = video::EMT_PARALLAX_MAP_SOLID;
			break;
		}

		Room->setMaterialType(type);

		
		video::IMaterialRenderer* renderer = Driver->getMaterialRenderer(type);

		// display some problem text when problem
		if (!renderer || renderer->getRenderCapability() != 0)
			ProblemText->setVisible(true);
		else
			ProblemText->setVisible(false);
	}

private:

	gui::IGUIStaticText* ProblemText;
	gui::IGUIListBox* ListBox;

	scene::ISceneNode* Room;
	video::IVideoDriver* Driver;
};



int main()
{
	// let user select driver type

	video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;

	printf("Escolhe o driver que queres usar:\n"\
		" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
		" (d) Software Renderer\n (e) Burning's 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_BURNINGSVIDEO;break;
		case 'f': driverType = video::EDT_NULL;     break;
		default: return 0;
	}

	// create device

	IrrlichtDevice* device = createDevice(driverType,
			core::dimension2d<s32>(1200, 1000));

	if (device == 0)
		return 1; // could not create selected driver.



	video::IVideoDriver* driver = device->getVideoDriver();
	scene::ISceneManager* smgr = device->getSceneManager();
	gui::IGUIEnvironment* env = device->getGUIEnvironment();

	driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);

	// add irrlicht logo
	env->addImage(driver->getTexture("../../media/master2.png"),
		core::position2d<s32>(10,10));

	// camera FREE MODE
	//scene::ICameraSceneNode* camera =
	//	smgr->addCameraSceneNodeFPS(0, 100.0f, .3f);
	//camera->setPosition(core::vector3df(-200,200,-200));


	// disable mouse cursor
	device->getCursorControl()->setVisible(false);


	driver->setFog(video::SColor(0,138,125,81), true, 250, 1000, 0, true);//FOG


	scene::IAnimatedMesh* roomMesh = smgr->getMesh("../../media/luzes/PAREDES12.obj");
	//scene::IAnimatedMesh* mesh = smgr->getMesh("../../media/NAVE/objectos.obj");
	//scene::IAnimatedMesh* meshChao = smgr->getMesh("../../media/luzes/chao4.obj");

	scene::ISceneNode* room = 0;
	scene::ISceneNode* node = 0;
	//room = smgr->addAnimatedMeshSceneNode(mesh);
//	room = smgr->addAnimatedMeshSceneNode(meshChao);
//	node = smgr->addAnimatedMeshSceneNode(meshChao);

	if (roomMesh){
	
		//room = smgr->addOctTreeSceneNode(roomMesh->getMesh(0));

		smgr->getMeshManipulator()->makePlanarTextureMapping(
				roomMesh->getMesh(0), 0.03f);

		 node = smgr->addOctTreeSceneNode(roomMesh->getMesh(0));
		 

	}
	scene::ITriangleSelector* selector = 0;
		 if (node)
	{
		//room->setPosition(core::vector3df(-1350,-130,-1400));
		node->setPosition(core::vector3df(0,0,0));
		selector = smgr->createOctTreeTriangleSelector(
				roomMesh->getMesh(0), node, 128);
		node->setTriangleSelector(selector);
	}

		 scene::ICameraSceneNode* camera =
		smgr->addCameraSceneNodeFPS(0, 100.0f, .1f, 0, 0, 0, true, 3.f);   //MOUSE CONTROL
	camera->setPosition(core::vector3df(35,-60,35));//-100,50,-150)//(35,-50,35)

	if (selector)
	{
		scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
			selector, camera, core::vector3df(10,30,10),
			core::vector3df(0,0,0),
			core::vector3df(0,30,0));
		camera->addAnimator(anim);
		anim->drop();
	}
		//

		video::ITexture* colorMap =
			driver->getTexture("../../media/futur.bmp");
		video::ITexture* normalMap =
			driver->getTexture("../../media/futur_bump.bmp");

		driver->makeNormalMapTexture(normalMap, 9.0f); //BUMP

		/*

		*/

		scene::IMesh* tangentMesh = smgr->getMeshManipulator()->createMeshWithTangents(
			roomMesh->getMesh(0));

		room = smgr->addMeshSceneNode(tangentMesh);
		room->setMaterialTexture(0, colorMap);
		room->setMaterialTexture(1, normalMap);

		room->getMaterial(0).SpecularColor.set(0,0,0,0);

		room->setMaterialFlag(video::EMF_FOG_ENABLE, true);
		room->setMaterialType(video::EMT_PARALLAX_MAP_SOLID);
		// adjust height for parallax effect
		room->getMaterial(0).MaterialTypeParam = 0.035f;

		// drop mesh because we created it with a create.. call.
		tangentMesh->drop();
	

	smgr->addLightSceneNode(0, core::vector3df(300,300,300),  // LUZ BRANCA
		video::SColorf(1.0f,1.0f,1.0f,1.0f),
		0.0f);



	// LUZ 1 PRE_DEFINIDA
	scene::ILightSceneNode* light1 =
		smgr->addLightSceneNode(0, core::vector3df(-500,0,0),
		video::SColorf(0.0f, 0.0f, 0.0f, 0.0f), 20.0f);


	

	// attach billboard to the light
	scene::ISceneNode* bill =
		smgr->addBillboardSceneNode(light1, core::dimension2d<f32>(1, 1));

	bill->setMaterialFlag(video::EMF_LIGHTING, false);
	bill->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false);
	bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
	bill->setMaterialTexture(0, driver->getTexture("../../media/particlered.bmp"));


	smgr->addLightSceneNode(0, core::vector3df(0,0,200),  // -200 vem da posicao inicial
		video::SColorf(1.0f,1.0f,1.0f,0.0f),
		150.0f);
	// SOL
	scene::ISceneNode* light2 =
		smgr->addLightSceneNode(0, core::vector3df(2000,2000,0),
		video::SColorf(1.0f, 0.8f, 0.8f, 0.0f), 900.0f);
	

	MyEventReceiver receiver(room, env, driver);
	device->setEventReceiver(&receiver);

	/*
	Finally, draw everything. That's it.


	*/


	////CEU E SKYBOX
	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);

	scene::ISceneNode* skybox=smgr->addSkyBoxSceneNode(
		driver->getTexture("../../media/irrlicht2_up.jpg"),
		driver->getTexture("../../media/irrlicht2_dn.jpg"),
		driver->getTexture("../../media/irrlicht2_lf.jpg"),
		driver->getTexture("../../media/irrlicht2_rt.jpg"),
		driver->getTexture("../../media/irrlicht2_ft.jpg"),
		driver->getTexture("../../media/irrlicht2_bk.jpg"));
//	scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture("../../media/skydome.jpg"),16,8,0.95f,2.0f);
//	scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture("../../media/mais6.jpg"),16,8,0.95f,2.0f);

	//vem do codigo 7
	scene::ISceneNode* selectedSceneNode = 0;
    scene::ISceneNode* lastSelectedSceneNode = 0;
	//

	int lastFPS = -1;

	while(device->run())
	if (device->isWindowActive())
	{
		driver->beginScene(true, true, 0);

		smgr->drawAll();
		env->drawAll();

//vem do 7
		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 == node || 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"Per pixel lighting example - Irrlicht Engine [";
			str += driver->getName();
			str += "] FPS:";
			str += fps;

			device->setWindowCaption(str.c_str());
			lastFPS = fps;
		}
	}
    selector->drop();
	device->drop();

	return 0;
}

/*
**/
[img]

http://img36.imageshack.us/gal.php?g=92559251.jpg
[/img]
hybrid
Admin
Posts: 14143
Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:

Post by hybrid »

Are you disabling lighting on the node that has parallax applied? Could be a problem.
sarabulho
Posts: 7
Joined: Mon Aug 17, 2009 3:33 pm

Post by sarabulho »

thanks but it didn't work
sarabulho
Posts: 7
Joined: Mon Aug 17, 2009 3:33 pm

Post by sarabulho »

Problem solved!!
Post Reply