Page 1 of 1

Can anyone help me with this?

Posted: Thu Aug 20, 2009 5:33 pm
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?

Posted: Thu Aug 20, 2009 6:14 pm
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?

Posted: Thu Aug 20, 2009 6:29 pm
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]

Posted: Thu Aug 20, 2009 6:36 pm
by hybrid
Are you disabling lighting on the node that has parallax applied? Could be a problem.

Posted: Thu Aug 20, 2009 9:49 pm
by sarabulho
thanks but it didn't work

Posted: Mon Aug 24, 2009 7:40 pm
by sarabulho
Problem solved!!