예제 #1
0
파일: example10.cs 프로젝트: h3zjp/krkr2
        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();
        }
예제 #2
0
        /*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);
        }
예제 #3
0
파일: example12.cs 프로젝트: h3zjp/krkr2
        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();
        }
예제 #4
0
        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();
        }