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?
Can anyone help me with this?
-
- Posts: 914
- Joined: Fri Aug 03, 2007 12:43 pm
- Location: South Africa
- Contact:
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;
}
/*
**/
http://img36.imageshack.us/gal.php?g=92559251.jpg
[/img]