Salut,
Voici une petite fenêtre avec plein de paramètres pour modifier et tester des paramètres affectant l'atmosphère.
Ca peut permettre de comprendre comment ils interagisent entre eux.
Pour tester, créez un répertoire dans le dossier examples, et copiez-y
main.cpp dont le code ci-dessous (commentaires en anglais dsl),
le makefile
heightmap
texture
Ca donne ça (avec des ombres très marquées et, ... Sous linux):
// main.cpp #include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace gui; // Contains all environnment settings typedef struct { scene::ISceneNode* LIGHTENV; vector3df Pos; f32 Radius; video::SColorf Ambient; video::SColor Diffuse; video::SColor Fog; f32 FogStart; f32 FogEnd; // fog not activated if 0 f32 FogStrength; } ENV; ENV *env; // Main window dimensions u32 WIDTH = 600; u32 HEIGHT = 500; IrrlichtDevice *device; scene::ITerrainSceneNode* terrain; /*------------------------------------------------------------------------------ Apply Env settings. 1) Obtain values from gui controls, store them in the structure 2) Apply these values onto irrlicht objects. ------------------------------------------------------------------------------*/ void apply_env_settings() { f32 r,g,b; u32 ur,ug,ub; stringc s; IGUIEnvironment* guienv = device->getGUIEnvironment(); IGUIElement* root = guienv->getRootGUIElement(); // Pos.X s = root->getElementFromId(111, true)->getText(); env->Pos.X = (f32)atof(s.c_str()); // Pos.Y s = root->getElementFromId(121, true)->getText(); env->Pos.Y = (f32)atof(s.c_str()); // Pos.Z s = root->getElementFromId(131, true)->getText(); env->Pos.Z = (f32)atof(s.c_str()); // Radius s = root->getElementFromId(141, true)->getText(); env->Radius = (f32)atof(s.c_str()); // Ambient.R s = root->getElementFromId(162, true)->getText(); r = (f32)atof(s.c_str()); // Ambient.G s = root->getElementFromId(163, true)->getText(); g = (f32)atof(s.c_str()); // Ambient.B s = root->getElementFromId(164, true)->getText(); b = (f32)atof(s.c_str()); env->Ambient = video::SColorf(10, r,g,b); // Diffuse.R s = root->getElementFromId(172, true)->getText(); ur = (u32)atoi(s.c_str()); // Diffuse.G s = root->getElementFromId(173, true)->getText(); ug = (u32)atoi(s.c_str()); // Diffuse.B s = root->getElementFromId(174, true)->getText(); ub = (u32)atoi(s.c_str()); env->Diffuse = video::SColor(0, ur,ug,ub); // Fog Start s = root->getElementFromId(211, true)->getText(); env->FogStart = (f32)atof(s.c_str()); // Fog End s = root->getElementFromId(216, true)->getText(); env->FogEnd = (f32)atof(s.c_str()); // Fog.R s = root->getElementFromId(222, true)->getText(); ur = (u32)atoi(s.c_str()); // Fog.G s = root->getElementFromId(232, true)->getText(); ug = (u32)atoi(s.c_str()); // Fog.B s = root->getElementFromId(242, true)->getText(); ub = (u32)atoi(s.c_str()); env->Fog = video::SColor(1, ur,ug,ub); // Fog Strength s = root->getElementFromId(219, true)->getText(); env->FogStrength = (f32)atof(s.c_str()); // now apply values scene::ISceneManager* smgr = device->getSceneManager(); // Light environment if (env->LIGHTENV) env->LIGHTENV->remove(); env->LIGHTENV = smgr->addLightSceneNode(0, env->Pos, env->Ambient, env->Radius); // terrain video::SMaterial *mat= &terrain->getMaterial(0); mat->FogEnable=(env->FogEnd > 0); mat->Lighting=true; mat->EmissiveColor= env->Diffuse; // fog video::IVideoDriver* driver = device->getVideoDriver(); driver->setFog(env->Fog, true, env->FogStart, env->FogEnd, env->FogStrength, false, true); } /*------------------------------------------------------------------------------ Handle Events ------------------------------------------------------------------------------*/ class MyEventReceiver : public IEventReceiver { public: virtual bool OnEvent(SEvent event) { if (event.EventType == EET_GUI_EVENT) { if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) { apply_env_settings(); return true; } } return false; } }; /*------------------------------------------------------------------------------ Create Tool Window. Takes screen size as parameter. Here are set hard-coded default values for env settings. ------------------------------------------------------------------------------*/ void createToolsWindow(IrrlichtDevice *device, u32 HEIGHT, u32 WIDTH) { IGUIEnvironment* guienv = device->getGUIEnvironment(); // create window IGUIWindow* wnd = guienv->addWindow(rect<s32>(100,HEIGHT-200, 400,HEIGHT-10), false, L"Env Settings", 0, 5000); // add tab control IGUITabControl* tabs = guienv->addTabControl( rect<s32>(2,20,297,186), wnd, true, true); IGUIElement* root = guienv->getRootGUIElement(); /* Tab1: LIGHT +---------------+ -------------- | Light | Fog | --------------------------------------------------------- | X: 95584.222 Y: 6523.2 Z: 232.2 | | Radius: 2000 | | R G B | | Ambient: 200 210 10 | | Diffuse 10 10 230 APPLY | | | --------------------------------------------------------- */ IGUITab* t1 = tabs->addTab(L"Light"); // X: 0000.000 guienv->addStaticText (L"X:",rect<s32>(10,10,30,30),false,true,t1,110,false); guienv->addEditBox (L"0000.0",rect<s32>(30,10,90,30),true,t1,111); // Y: 0000.000 guienv->addStaticText (L"Y:",rect<s32>(100,10,130,30),false,true,t1,120,false); guienv->addEditBox (L"1000.0",rect<s32>(130,10,190,30),true,t1,121); // Z: 0000.000 guienv->addStaticText (L"Z:",rect<s32>(200,10,230,30),false,true,t1,130,false); guienv->addEditBox (L"0000.0",rect<s32>(220,10,280,30),true,t1,131); // Radius: 0000.000 guienv->addStaticText (L"Radius",rect<s32>(10,40,70,60),false,true,t1,140,false); guienv->addEditBox (L"1000", rect<s32>(70,40,140,60),true,t1,141); // R,G,B guienv->addStaticText (L"R",rect<s32>(70 ,70,100,86),true,true,t1,151,false); guienv->addStaticText (L"G",rect<s32>(100,70,130,86),true,true,t1,152,false); guienv->addStaticText (L"B",rect<s32>(130,70,160,86),true,true,t1,153,false); //Ambient guienv->addStaticText (L"Ambient",rect<s32>(10,86,70,102),true,true,t1,161,false); guienv->addEditBox (L"255",rect<s32>(70 ,86,100,102),true,t1,162); guienv->addEditBox (L"10" ,rect<s32>(100,86,130,102),true,t1,163); guienv->addEditBox (L"1" ,rect<s32>(130,86,160,102),true,t1,164); //Diffuse guienv->addStaticText (L"Diffuse",rect<s32>(10,102,70,118),true,true,t1,171,false); guienv->addEditBox (L"100",rect<s32>(70 ,102,100,118),true,t1,172); guienv->addEditBox (L"200",rect<s32>(100,102,130,118),true,t1,173); guienv->addEditBox (L"100",rect<s32>(130,102,160,118),true,t1,174); //Apply Button guienv->addButton(rect<s32>(190,80,280,118),t1,1101,L"Apply"); /* Tab2: FOG -------------- +---------------+ | Light | Fog | --------------------------------------------------------- | Start: 1000 End: 6000 | | Strength: 2000 | | | | R G B | | 10 211 255 | | | --------------------------------------------------------- */ IGUITab* t2 = tabs->addTab(L"Fog"); // Fog Start guienv->addStaticText (L"Start:",rect<s32>(10,10,70,30),false,true,t2,210,false); guienv->addEditBox (L"1000",rect<s32>(70,10,140,30),true,t2,211); // Fog End guienv->addStaticText (L"End:",rect<s32>(150,10,210,60),false,true,t2,215,false); guienv->addEditBox (L"3000",rect<s32>(200,10,270,30),true,t2,216); // Fog Strength guienv->addStaticText (L"Strength:",rect<s32>(10,40,70,60),false,true,t2,218,false); guienv->addEditBox (L"0.001",rect<s32>(70,40,140,60),true,t2,219); // Fog R guienv->addStaticText (L"R",rect<s32>(70,70,140,90),true,true,t2,221,false); guienv->addEditBox (L"255",rect<s32>(70,90,140,110),true,t2,222); // Fog G guienv->addStaticText (L"G",rect<s32>(140,70,200,90),true,true,t2,231,false); guienv->addEditBox (L"222",rect<s32>(140,90,200,110),true,t2,232); // Fog B guienv->addStaticText (L"B",rect<s32>(200,70,270,90),true,true,t2,241,false); guienv->addEditBox (L"166",rect<s32>(200,90,270,110),true,t2,242); } /*------------------------------------------------------------------------------ Create env window with tabs ------------------------------------------------------------------------------*/ void create_env_window() { video::IVideoDriver* driver = device->getVideoDriver(); // create window for Env settings createToolsWindow (device, HEIGHT, WIDTH); // set a nicer font IGUIEnvironment* guienv = device->getGUIEnvironment(); IGUISkin* skin = guienv->getSkin(); IGUIFont* font = guienv->getFont("../../media/fonthaettenschweiler.bmp"); if (font) skin->setFont(font); } /*------------------------------------------------------------------------------ Load Terrain ------------------------------------------------------------------------------*/ video::ITexture* load_scene() { // [Load heightmap] video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); terrain = smgr->addTerrainSceneNode("0003.png"); terrain->setScale(vector3df(256, 12, 256)); terrain->setMaterialTexture(0, driver->getTexture("texture.png")); terrain->scaleTexture(64, 64); // [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")); // [Cam] scene::ICameraSceneNode* camera; camera = smgr->addCameraSceneNodeMaya(); camera->setPosition(vector3df(1000,1500,1000)); camera->setTarget (vector3df(2000,1000,2000)); // [Irrlicht logo] video::ITexture* irrLogo = driver->getTexture("../../media/irrlichtlogoaligned.jpg"); return irrLogo; } /*------------------------------------------------------------------------------ Entry point ------------------------------------------------------------------------------*/ int main() { // create irrlicht device MyEventReceiver receiver; device = createDevice(video::EDT_OPENGL, dimension2d<s32>(WIDTH, HEIGHT), 16, false, false, false, &receiver); if (!device) return 1; video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment(); device->setResizeAble(true); driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true); // Init stuff device->setWindowCaption(L"Irrlicht Engine - Loading..."); // Create gui tool window, tabs and controls, fill controls with // hard-coded default values for env settings create_env_window(); // Load terrain video::ITexture* irrLogo = load_scene(); if (!irrLogo) return 1; // now that terrain is created, get env values from controls to pass them // into the structure, to apply them env = new ENV; apply_env_settings(); device->setWindowCaption(L"ENV settings"); // Main loop while(device->run()) { if (device->isWindowActive()) { driver->beginScene(true, true,0); smgr->drawAll(); guienv->drawAll(); driver->draw2DImage(irrLogo, position2d<s32>(10, 10),rect<s32>(0,0,88,31)); driver->endScene(); } } device->drop(); delete env; return 0; }
merci, j'y jetterrai un oueil interressé dans quelques temps
Hors ligne
Chez moi je compile. Je lance ca charge la skybox et dessuite apres ca quitte. Ca n'affiche meme pas l'interrieur de la fenetre. Je vois juste les bordure puis ca quitte....
Hors ligne
Quel est le dernier message de la console, "can't find heightmap" ?
Hors ligne
je ne sais pas ca va trop vite...
Hors ligne
lance ton prog a la main, :
demarrer / executer / "cmd" /
navigue avec cd .. et cd Nom_dossier jusqu'au répertoire de ton exe, et de la lance le avec "nom_prog.exe"
la console persitera, puisqu'elle n'aura pas été lancée spécifiquement pour une execution
(n'empeche que linux c'est mieux )
Hors ligne
C'est une propriété de compilation ça, je pense ;-) (mode appli console)
Hors ligne
Bon effectivement je viens de tester avec Irrlicht 1.3 ça produit une erreur de segmentation.
Faut dire que j'ai posté ce code moins d'une semaine avant la sortie de la 1.3.
Il va falloir se plonger dans le changelog je pressent que le bug provient du gui qui a été amplement modifié entre la 1.2 et la 1.3.
Hors ligne
Pages: 1