public void run() { /* The next few lines start up the engine. Just like in most other tutorials * before. But in addition, we ask the user if he wants this example to use * high level shaders if he selected a driver which is capable of doing so. */ // ask user for driver DriverType driverType; // Ask user to select driver: StringBuilder sb = new StringBuilder(); sb.Append("Please select the driver you want for this example:\n"); sb.Append("\n(a) Direct3D 9.0c\n(b) Direct3D 8.1\n(c) OpenGL 1.5"); sb.Append("\n(d) Software Renderer\n(e) Apfelbaum Software Renderer"); sb.Append("\n(f) Null Device\n(otherKey) exit\n\n"); // Get the user's input: TextReader tIn = Console.In; TextWriter tOut = Console.Out; tOut.Write(sb.ToString()); string input = tIn.ReadLine(); // Select device based on user's input: switch (input) { case "a": driverType = DriverType.DIRECT3D9; break; case "b": driverType = DriverType.DIRECT3D8; break; case "c": driverType = DriverType.OPENGL; break; case "d": driverType = DriverType.SOFTWARE; break; case "e": driverType = DriverType.SOFTWARE2; break; case "f": driverType = DriverType.NULL_DRIVER; break; default: return; } // ask the user if we should use high level shaders for this example if (driverType == DriverType.DIRECT3D9 || driverType == DriverType.OPENGL) { tOut.Write("Please press 'y' if you want to use high level shaders.\n"); input = tIn.ReadLine(); if (input.ToLower() == "y") { UseHighLevelShaders = true; } } // create device device = new IrrlichtDevice(driverType, new Dimension2D(1024, 768), 32, false, true, true); if (device == null) { tOut.Write("Device creation failed."); return; } ISceneManager smgr = device.SceneManager; IVideoDriver driver = device.VideoDriver; IGUIEnvironment gui = device.GUIEnvironment; /*Now for the more interesting parts. If we are using Direct3D, we want to * load vertex and pixel shader programs, if we have OpenGL, we want to use ARB * fragment and vertex programs. I wrote the corresponding programs down into the * files d3d8.ps, d3d8.vs, d3d9.ps, d3d9.vs, opengl.ps and opengl.vs. We only * need the right filenames now. This is done in the following switch. Note, * that it is not necessary to write the shaders into text files, like in this * example. You can even write the shaders directly as strings into the cpp source * file, and use later addShaderMaterial() instead of addShaderMaterialFromFiles().*/ string vsFileName = ""; string psFileName = ""; switch (driverType) { case DriverType.DIRECT3D8: psFileName = path + "d3d8.psh"; vsFileName = path + "d3d8.vsh"; break; case DriverType.DIRECT3D9: if (UseHighLevelShaders) { psFileName = path + "d3d9.hlsl"; vsFileName = psFileName; // both shaders are in the same file } else { psFileName = path + "d3d9.psh"; vsFileName = path + "d3d9.vsh"; } break; case DriverType.OPENGL: if (UseHighLevelShaders) { psFileName = path + "opengl.frag"; vsFileName = path + "opengl.vert"; } else { psFileName = path + "opengl.psh"; vsFileName = path + "opengl.vsh"; } break; } /*In addition, we check if the hardware and the selected renderer is capable * of executing the shaders we want. If not, we simply set the filename string * to 0. This is not necessary, but useful in this example: For example, if the * hardware is able to execute vertex shaders but not pixel shaders, we create a * new material which only uses the vertex shader, and no pixel shader. Otherwise, * if we would tell the engine to create this material and the engine sees that * the hardware wouldn't be able to fullfill the request completely, it would not * create any new material at all. So in this example you would see at least the * vertex shader in action, without the pixel shader.*/ if (!driver.QueryFeature(VideoDriverFeature.PIXEL_SHADER_1_1) && !driver.QueryFeature(VideoDriverFeature.ARB_FRAGMENT_PROGRAM_1)) { // still unimplemented //device.Logger.log("WARNING: Pixel shaders disabled \n"+ // "because of missing driver/hardware support."); psFileName = null; } if (!driver.QueryFeature(VideoDriverFeature.VERTEX_SHADER_1_1) && !driver.QueryFeature(VideoDriverFeature.ARB_FRAGMENT_PROGRAM_1)) { // still unimplemented //device.Logger.log("WARNING: Vertex shaders disabled \n"+ // "because of missing driver/hardware support."); vsFileName = null; } /*Now lets create the new materials. As you maybe know from previous examples, * a material type in the Irrlicht engine is set by simply changing the * MaterialType value in the SMaterial struct. And this value is just a simple * 32 bit value, like video::EMT_SOLID. So we only need the engine to create a * new value for us which we can set there. To do this, we get a pointer to the * IGPUProgrammingServices and call addShaderMaterialFromFiles(), which returns * such a new 32 bit value. That's all. The parameters to this method are the * following: First, the names of the files containing the code of the vertex * and the pixel shader. If you would use addShaderMaterial() instead, you would * not need file names, then you could write the code of the shader directly as * string. The following parameter is a pointer to the IShaderConstantSetCallBack * class we wrote at the beginning of this tutorial. If you don't want to set * constants, set this to 0. The last paramter tells the engine which material * it should use as base material. To demonstrate this, we create two materials * with a different base material, one with EMT_SOLID and one with * EMT_TRANSPARENT_ADD_COLOR.*/ // create materials IGPUProgrammingServices gpu = driver.GPUProgrammingServices; int newMaterialType1 = 0; int newMaterialType2 = 0; if (gpu != null) { IShaderConstantSetCallBack callBack = this; // create the shaders depending on if the user wanted high level // or low level shaders: if (UseHighLevelShaders) { // create material from high level shaders (hlsl or glsl) newMaterialType1 = gpu.AddHighLevelShaderMaterialFromFiles( vsFileName, "vertexMain", VertexShaderType.VST_VS_1_1, psFileName, "pixelMain", PixelShaderType.PST_PS_1_1, callBack, MaterialType.SOLID); newMaterialType2 = gpu.AddHighLevelShaderMaterialFromFiles( vsFileName, "vertexMain", VertexShaderType.VST_VS_1_1, psFileName, "pixelMain", PixelShaderType.PST_PS_1_1, callBack, MaterialType.TRANSPARENT_ADD_COLOR); } else { newMaterialType1 = gpu.AddShaderMaterialFromFiles(vsFileName, psFileName, callBack, MaterialType.SOLID); newMaterialType2 = gpu.AddShaderMaterialFromFiles(vsFileName, psFileName, callBack, MaterialType.TRANSPARENT_ADD_COLOR); } } /*Now its time for testing out the materials. We create a test cube and set the * material we created. In addition, we add a text scene node to the cube and a * rotatation animator, to make it look more interesting and important.*/ // create test scene node 1, with the new created material type 1 ISceneNode node = smgr.AddTestSceneNode(50, null, 0, new Vector3D(0, 0, 0)); node.SetMaterialTexture(0, driver.GetTexture(path + "wall.bmp")); node.SetMaterialType((MaterialType)newMaterialType1); smgr.AddTextSceneNode(gui.BuiltInFont, "PS & VS & EMT_SOLID", new Color(255, 255, 255, 255), node, new Vector3D(), 0); ISceneNodeAnimator anim = smgr.CreateRotationAnimator( new Vector3D(0, 0.3f, 0)); node.AddAnimator(anim); //Same for the second cube, but with the second material we created. node = smgr.AddTestSceneNode(50, null, 0, new Vector3D(0, -10, 50)); node.SetMaterialTexture(0, driver.GetTexture(path + "wall.bmp")); node.SetMaterialType((MaterialType)newMaterialType2); smgr.AddTextSceneNode(gui.BuiltInFont, "PS & VS & EMT_TRANSPARENT", new Color(255, 255, 255, 255), node, new Vector3D(), 0); anim = smgr.CreateRotationAnimator( new Vector3D(0, 0.3f, 0)); node.AddAnimator(anim); // Then we add a third cube without a shader on it, to be able to compare the cubes. node = smgr.AddTestSceneNode(50, null, 0, new Vector3D(0, 50, 25)); node.SetMaterialTexture(0, driver.GetTexture(path + "wall.bmp")); smgr.AddTextSceneNode(gui.BuiltInFont, "NO SHADER", new Color(255, 255, 255, 255), node, new Vector3D(), 0); //And last, we add a skybox and a user controlled camera to the scene. For the //skybox textures, we disable mipmap generation, because we don't need mipmaps on it. // add a nice skybox driver.SetTextureCreationFlag(TextureCreationFlag.CREATE_MIP_MAPS, false); smgr.AddSkyBoxSceneNode( driver.GetTexture(path + "irrlicht2_up.jpg"), driver.GetTexture(path + "irrlicht2_dn.jpg"), driver.GetTexture(path + "irrlicht2_lf.jpg"), driver.GetTexture(path + "irrlicht2_rt.jpg"), driver.GetTexture(path + "irrlicht2_ft.jpg"), driver.GetTexture(path + "irrlicht2_bk.jpg"), null, 0); driver.SetTextureCreationFlag(TextureCreationFlag.CREATE_MIP_MAPS, true); // add a camera and disable the mouse cursor ICameraSceneNode cam = smgr.AddCameraSceneNodeFPS(null, 100, 100, 0); cam.Position = new Vector3D(-100, 50, 100); cam.Target = new Vector3D(); device.CursorControl.Visible = false; /*Finally we simply have to draw everything, that's all.*/ int lastFPS = -1; while (device.Run()) { if (device.WindowActive) { device.VideoDriver.BeginScene(true, true, new Color(0, 200, 200, 200)); device.SceneManager.DrawAll(); device.VideoDriver.EndScene(); int fps = device.VideoDriver.FPS; if (lastFPS != fps) { device.WindowCaption = "Irrlicht Engine - Quake 3 Map example [" + device.VideoDriver.Name + "] FPS:" + fps.ToString(); lastFPS = fps; } } } /* * In the end, delete the Irrlicht device. */ // Instead of device->drop, we'll use: GC.Collect(); }
/*The Event Receiver is not only capable of getting keyboard and mouse input events, * but also events of the graphical user interface (gui). There are events for almost * everything: Button click, Listbox selection change, events that say that a element * was hovered and so on. To be able to react to some of these events, we create an * event receiver. We only react to gui events, and if it's such an event, we get the * id of the caller (the gui element which caused the event) and get the pointer to the * gui environment.*/ public bool OnEvent(Event p_e) { if (p_e.Type == EventType.GUIEvent) { int id = p_e.GUIEventCaller.ID; IGUIEnvironment env = device.GUIEnvironment; switch (p_e.GUIEventType) { case (GUIEvent.SCROLL_BAR_CHANGED): if (id == 104) { // I think this is still not implemented //int pos=p_e.GUIEventCaller.Position; } break; /*If a button was clicked, it could be one of 'our' three buttons. * If it is the first, we shut down the engine. If it is the second, * we create a little window with some text on it. We also add a string * to the list box to log what happened. And if it is the third button, * we create a file open dialog, and add also this as string to the list * box. That's all for the event receiver.*/ case (GUIEvent.BUTTON_CLICKED): if (id == 101) { device.CloseDevice(); return(true); } if (id == 102) { listbox.AddItem("Window Created"); cnt += 30; if (cnt > 200) { cnt = 0; } IGUIElement window = env.AddWindow( new Rect(100 + cnt, 100 + cnt, 300 + cnt, 200 + cnt), false, //modal? "Test Window", null, //parent 0); // id env.AddStaticText("Please close me", new Rect(35, 35, 140, 50), true, //border false, //wordwrap window, //parent 0); //id return(true); } if (id == 103) { listbox.AddItem("File open"); env.AddFileOpenDialog("Please choose a file", false, null, 0); return(true); } break; } } return(false); }
public void run() { /* The start of the main function starts like in most other example. * We ask the user for the desired renderer and start it up. */ // ask user for driver DriverType driverType; // Ask user to select driver: StringBuilder sb = new StringBuilder(); sb.Append("Please select the driver you want for this example:\n"); sb.Append("\n(a) Direct3D 9.0c\n(b) Direct3D 8.1\n(c) OpenGL 1.5"); sb.Append("\n(d) Software Renderer\n(e)Apfelbaum Software Renderer"); sb.Append("\n(f) Null Device\n(otherKey) exit\n\n"); // Get the user's input: TextReader tIn = Console.In; TextWriter tOut = Console.Out; tOut.Write(sb.ToString()); string input = tIn.ReadLine(); // Select device based on user's input: switch (input) { case "a": driverType = DriverType.DIRECT3D9; break; case "b": driverType = DriverType.DIRECT3D8; break; case "c": driverType = DriverType.OPENGL; break; case "d": driverType = DriverType.SOFTWARE; break; case "e": driverType = DriverType.SOFTWARE2; break; case "f": driverType = DriverType.NULL_DRIVER; break; default: return; } // Create device and exit if creation fails: IrrlichtDevice device = new IrrlichtDevice( driverType, new Dimension2D(640, 480), 32, false, true, true); if (device == null) { tOut.Write("Device creation failed."); return; } /* set this as event receiver*/ device.EventReceiver = this; /*************************************************/ /* First, we add standard stuff to the scene: A nice irrlicht engine logo, * a small help text, a user controlled camera, and we disable the mouse * cursor.*/ ISceneManager smgr = device.SceneManager; IVideoDriver driver = device.VideoDriver; IGUIEnvironment env = device.GUIEnvironment; driver.SetTextureCreationFlag(TextureCreationFlag.ALWAYS_32_BIT, true); // add irrlicht logo env.AddImage(driver.GetTexture(path + "irrlichtlogoalpha.tga"), new Position2D(10, 10), true, null, 0, ""); // add some help text IGUIStaticText text = env.AddStaticText( "Press 'W' to change wireframe mode\nPress 'D' to toggle detail map", new Rect(10, 453, 200, 475), true, true, null, -1); // add camera ICameraSceneNode camera = smgr.AddCameraSceneNodeFPS(null, 100.0f, 1200.0f, -1); camera.Position = new Vector3D(1900 * 2, 255 * 2, 3700 * 2); camera.Target = new Vector3D(2397 * 2, 343 * 2, 2700 * 2); camera.FarValue = 12000.0f; // disable mouse cursor device.CursorControl.Visible = false; /* Here comes the terrain renderer scene node: We add it just like any other scene * node to the scene using ISceneManager::addTerrainSceneNode(). The only parameter * we use is a file name to the heightmap we use. A heightmap is simply a gray * scale texture. The terrain renderer loads it and creates the 3D terrain * from it. * To make the terrain look more big, we change the scale factor of it to * (40, 4.4, 40). Because we don't have any dynamic lights in the scene, we * switch off the lighting, and we set the file terrain-texture.jpg as texture * for the terrain and detailmap3.jpg as second texture, called detail map. * At last, we set the scale values for the texture: The first texture will be * repeated only one time over the whole terrain, and the second one (detail map) * 20 times. */ // add terrain scene node terrain = smgr.AddTerrainSceneNode( path + "terrain-heightmap.bmp", null, -1, new Vector3D(), new Vector3D(40, 4.4f, 40), new Color(255, 255, 255, 255)); terrain.SetMaterialFlag(MaterialFlag.LIGHTING, false); terrain.SetMaterialType(MaterialType.DETAIL_MAP); terrain.SetMaterialTexture(0, driver.GetTexture(path + "terrain-texture.jpg")); terrain.SetMaterialTexture(1, driver.GetTexture(path + "detailmap3.jpg")); terrain.ScaleTexture(1.0f, 20.0f); /* To be able to do collision with the terrain, we create a triangle selector. * If you want to know what triangle selectors do, just take a look into the * collision tutorial. The terrain triangle selector works together with the * terrain. To demonstrate this, we create a collision response animator and * attach it to the camera, so that the camera will not be able to fly through * the terrain.*/ // create triangle selector for the terrain ITriangleSelector selector = smgr.CreateTerrainTriangleSelector(terrain, 0); // create collision response animator and attach it to the camera ISceneNodeAnimator anim = smgr.CreateCollisionResponseAnimator( selector, camera, new Vector3D(60, 100, 60), new Vector3D(0, 0, 0), new Vector3D(0, 50, 0), 0.0005f); camera.AddAnimator(anim); //we add the skybox which we already used in lots of Irrlicht examples. driver.SetTextureCreationFlag(TextureCreationFlag.CREATE_MIP_MAPS, false); smgr.AddSkyBoxSceneNode( driver.GetTexture(path + "irrlicht2_up.jpg"), driver.GetTexture(path + "irrlicht2_dn.jpg"), driver.GetTexture(path + "irrlicht2_lf.jpg"), driver.GetTexture(path + "irrlicht2_rt.jpg"), driver.GetTexture(path + "irrlicht2_ft.jpg"), driver.GetTexture(path + "irrlicht2_bk.jpg"), null, 0); driver.SetTextureCreationFlag(TextureCreationFlag.CREATE_MIP_MAPS, true); /* That's it, draw everything. Now you know how to use terrain * in Irrlicht. */ int lastFPS = -1; while (device.Run()) { if (device.WindowActive) { device.VideoDriver.BeginScene(true, true, new Color(0, 200, 200, 200)); device.SceneManager.DrawAll(); device.VideoDriver.EndScene(); int fps = device.VideoDriver.FPS; if (lastFPS != fps) { device.WindowCaption = "Irrlicht Engine - Terrain example [" + device.VideoDriver.Name + "] FPS:" + fps.ToString(); lastFPS = fps; } } } /* * In the end, delete the Irrlicht device. */ // Instead of device.drop, we'll use: GC.Collect(); }
public void run() { // ask user for driver DriverType driverType; // Ask user to select driver: StringBuilder sb = new StringBuilder(); sb.Append("Please select the driver you want for this example:\n"); sb.Append("\n(a) Direct3D 9.0c\n(b) Direct3D 8.1\n(c) OpenGL 1.5"); sb.Append("\n(d) Software Renderer\n(e) Apfelbaum Software Renderer"); sb.Append("\n(f) Null Device\n(otherKey) exit\n\n"); // Get the user's input: TextReader tIn = Console.In; TextWriter tOut = Console.Out; tOut.Write(sb.ToString()); string input = tIn.ReadLine(); // Select device based on user's input: switch (input) { case "a": driverType = DriverType.DIRECT3D9; break; case "b": driverType = DriverType.DIRECT3D8; break; case "c": driverType = DriverType.OPENGL; break; case "d": driverType = DriverType.SOFTWARE; break; case "e": driverType = DriverType.SOFTWARE2; break; case "f": driverType = DriverType.NULL_DRIVER; break; default: return; } // Create device and exit if creation fails: device = new IrrlichtDevice(driverType, new Dimension2D(1024, 768), 32, false, true, true); if (device == null) { tOut.Write("Device creation failed."); return; } /* set this as event receiver*/ device.EventReceiver = this; /* * Get a pointer to the video driver and the SceneManager so that * we do not always have to write device.VideoDriver and * device.SceneManager and device.GUIEnvironment. */ ISceneManager smgr = device.SceneManager; IVideoDriver driver = device.VideoDriver; IGUIEnvironment env = device.GUIEnvironment; /*We add three buttons. The first one closes the engine. The second creates * a window and the third opens a file open dialog. The third parameter is * the id of the button, with which we can easily identify the button in the * event receiver.*/ env.AddButton(new Rect(10, 210, 100, 240), null, 101, "Quit"); env.AddButton(new Rect(10, 250, 100, 290), null, 102, "New Window"); env.AddButton(new Rect(10, 300, 100, 340), null, 103, "File Open"); /*Now, we add a static text and a scrollbar, which modifies the transparency * of all gui elements. We set the maximum value of the scrollbar to 255, * because that's the maximal value for a color value. Then we create an other * static text and a list box.*/ env.AddStaticText("Transparent Control:", new Rect(150, 20, 350, 40), true, false, null, 0); IGUIElement scrollbar = env.AddScrollBar(true, new Rect(150, 45, 350, 60), null, 104); //nopt implemented yet //scrollbar.Max=255; env.AddStaticText("Logging Listbox:", new Rect(50, 80, 250, 100), true, false, null, 0); listbox = env.AddListBox(new Rect(50, 110, 250, 180), null, 0, true); /*To make the font a little bit nicer, we load an external font and set it as * new font in the skin. An at last, we create a nice Irrlicht Engine logo in the * top left corner. */ IGUISkin skin = env.Skin; IGUIFont font = env.GetFont(path + "fonthaettenschweiler.bmp"); if (font != null) { skin.Font = font; } IGUIElement img = env.AddImage(driver.GetTexture(path + "irrlichtlogoalpha.tga"), new Position2D(10, 10), false, //UseAlphaChannel null, //Parent 0, //ID ""); //Text /* * We have done everything, so lets draw it. */ while (device.Run()) { if (device.WindowActive) { device.VideoDriver.BeginScene(true, true, new Color(0, 122, 65, 171)); device.SceneManager.DrawAll(); device.GUIEnvironment.DrawAll(); device.VideoDriver.EndScene(); } } /* * In the end, delete the Irrlicht device. */ // Instead of device->drop, we'll use: GC.Collect(); }