private void initScene() { SceneManager smgr = device.SceneManager; AnimatedMesh m = smgr.AddHillPlaneMesh("plane", new Dimension2Df(16), new Dimension2Di(16), null, 8); sceneNodePainter = smgr.AddAnimatedMeshSceneNode(m); sceneNodePainter.Scale = new Vector3Df(0.4f); sceneNodePainter.SetMaterialTexture(0, texture); sceneNodePainter.SetMaterialFlag(MaterialFlag.Lighting, false); SceneNodeAnimator a = smgr.CreateRotationAnimator(new Vector3Df(0, 0.1f, 0)); sceneNodePainter.AddAnimator(a); a.Drop(); sceneNodeRTT = smgr.AddWaterSurfaceSceneNode(m.GetMesh(0), 2, 100, 20); sceneNodeRTT.SetMaterialFlag(MaterialFlag.Lighting, false); sceneNodeRTT.SetMaterialType(MaterialType.Solid); sceneNodeRTT.Scale = new Vector3Df(0.2f); sceneNodeRTT.Position = new Vector3Df(60, 10, 40); sceneNodeRTT.Rotation = new Vector3Df(-30, 20, 0); textureRTT = smgr.VideoDriver.AddRenderTargetTexture(new Dimension2Di(512)); sceneNodeRTT.SetMaterialTexture(0, textureRTT); smgr.AddCameraSceneNode(null, new Vector3Df(0, 40, -60), new Vector3Df(0, -15, 0)); }
public WaterSceneNode(SceneNode parent, SceneManager mgr, Dimension2Df tileSize, Dimension2D tileCount, Dimension2D precision, int id) : base(parent, mgr, id) { _scene = mgr; _driver = mgr.VideoDriver; AnimatedMesh wmesh = _scene.AddHillPlaneMesh("watermesh" + _current, tileSize, tileCount, 0, new Dimension2Df(0, 0), new Dimension2Df(1, 1)); _current++; int dmat; if (_driver.DriverType == DriverType.OpenGL) dmat = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( WATER_VERTEX_GLSL, "main", VertexShaderType._1_1, WATER_FRAGMENT_GLSL, "main", PixelShaderType._1_1, OnShaderSet, MaterialType.TransparentAlphaChannel, 0); else dmat = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( WATER_HLSL, "vertexMain", VertexShaderType._2_0, WATER_HLSL, "pixelMain", PixelShaderType._2_0, OnShaderSet, MaterialType.TransparentAlphaChannel, 2); if (_driver.DriverType == DriverType.OpenGL) ClampShader = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( CLAMP_VERTEX_GLSL, "main", VertexShaderType._1_1, CLAMP_FRAGMENT_GLSL, "main", PixelShaderType._1_1, OnShaderSet, MaterialType.TransparentAlphaChannel, 1); else ClampShader = _driver.GPUProgrammingServices.AddHighLevelShaderMaterial( CLAMP_HLSL, "vertexMain", VertexShaderType._2_0, CLAMP_HLSL, "pixelMain", PixelShaderType._2_0, OnShaderSet, MaterialType.TransparentAlphaChannel, 3); _waternode = _scene.AddMeshSceneNode(wmesh.GetMesh(0), this, -1); _waternode.SetMaterialType(dmat); _waternode.SetMaterialFlag(MaterialFlag.BackFaceCulling, false); _waternode.SetMaterialFlag(MaterialFlag.Lighting, false); _waternode.SetMaterialFlag(MaterialFlag.FogEnable, false); _rt = _driver.CreateRenderTargetTexture(precision); _waternode.SetMaterialTexture(0, _rt); CameraSceneNode oldcam = _scene.ActiveCamera; _fixedcam = _scene.AddCameraSceneNode(null); if (oldcam != null) _scene.ActiveCamera = oldcam; }
static void Main() { DriverType?driverType = AskForDriver(); if (!driverType.HasValue) { return; } IrrlichtDevice device = IrrlichtDevice.CreateDevice(driverType.Value, new Dimension2Di(640, 480)); if (device == null) { return; } device.OnEvent += new IrrlichtDevice.EventHandler(device_OnEvent); VideoDriver driver = device.VideoDriver; SceneManager scene = device.SceneManager; scene.GUIEnvironment.AddStaticText("Press Space to hide occluder.", new Recti(10, 10, 200, 50)); // Create the node to be occluded. We create a sphere node with high poly count. MeshSceneNode node = scene.AddSphereSceneNode(10, 64); if (node != null) { node.Position = new Vector3Df(0, 0, 60); node.SetMaterialTexture(0, driver.GetTexture("../../media/wall.bmp")); node.SetMaterialFlag(MaterialFlag.Lighting, false); } // Now we create another node, the occluder. It's a simple plane. SceneNode plane = scene.AddMeshSceneNode( scene.AddHillPlaneMesh("plane", new Dimension2Df(10), new Dimension2Di(2)), // mesh null, // parent -1, // id new Vector3Df(0, 0, 20), // position new Vector3Df(270, 0, 0)); // rotation if (plane != null) { plane.SetMaterialTexture(0, driver.GetTexture("../../media/t351sml.jpg")); plane.SetMaterialFlag(MaterialFlag.Lighting, false); plane.SetMaterialFlag(MaterialFlag.BackFaceCulling, true); } // Here we create the occlusion query. Because we don't have a plain mesh scene node // (SceneNodeType.Mesh or SceneNodeType.AnimatedMesh), we pass the base geometry as well. Instead, // we could also pass a simpler mesh or the bounding box. But we will use a time // based method, where the occlusion query renders to the frame buffer and in case // of success (occlusion), the mesh is not drawn for several frames. driver.AddOcclusionQuery(node, node.Mesh); // We have done everything, just a camera and draw it. We also write the // current frames per second and the name of the driver to the caption of the // window to examine the render speedup. // We also store the time for measuring the time since the last occlusion query ran // and store whether the node should be visible in the next frames. scene.AddCameraSceneNode(); uint timeNow = device.Timer.Time; bool nodeVisible = true; while (device.Run()) { plane.Visible = !IsKeyDown(KeyCode.Space); driver.BeginScene(ClearBufferFlag.All, new Color(113, 113, 133)); // First, we draw the scene, possibly without the occluded element. This is necessary // because we need the occluder to be drawn first. You can also use several scene // managers to collect a number of possible occluders in a separately rendered scene. node.Visible = nodeVisible; scene.DrawAll(); scene.GUIEnvironment.DrawAll(); // Once in a while, here every 100 ms, we check the visibility. We run the queries, // update the pixel value, and query the result. Since we already rendered the node // we render the query invisible. The update is made blocking, as we need the result // immediately. If you don't need the result immediately, e.g. because oyu have other // things to render, you can call the update non-blocking. This gives the GPU more // time to pass back the results without flushing the render pipeline. // If the update was called non-blocking, the result from getOcclusionQueryResult is // either the previous value, or 0xffffffff if no value has been generated at all, yet. // The result is taken immediately as visibility flag for the node. if (device.Timer.Time - timeNow > 100) { driver.RunAllOcclusionQueries(false); driver.UpdateAllOcclusionQueries(); nodeVisible = driver.GetOcclusionQueryResult(node) > 0; timeNow = device.Timer.Time; } driver.EndScene(); device.SetWindowCaption(String.Format( "Occlusion Query Example - Irrlicht Engine [{0}] fps: {1} (primitives: {2})", driver.Name, driver.FPS, driver.PrimitiveCountDrawn)); } device.Drop(); }
static void Main() { bool shadows = AskForRealtimeShadows(); DriverType?driverType = AskForDriver(); if (!driverType.HasValue) { return; } IrrlichtDevice device = IrrlichtDevice.CreateDevice(driverType.Value, new Dimension2Di(640, 480), 16, false, shadows); if (device == null) { return; } VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; AnimatedMesh mesh = smgr.GetMesh("../../media/room.3ds"); smgr.MeshManipulator.MakePlanarTextureMapping(mesh.GetMesh(0), 0.004f); SceneNode node = smgr.AddAnimatedMeshSceneNode(mesh); node.SetMaterialTexture(0, driver.GetTexture("../../media/wall.jpg")); node.GetMaterial(0).SpecularColor = new Color(0); mesh = smgr.AddHillPlaneMesh("myHill", new Dimension2Df(20, 20), new Dimension2Di(40, 40), null, 0, new Dimension2Df(0), new Dimension2Df(10, 10)); node = smgr.AddWaterSurfaceSceneNode(mesh.GetMesh(0), 3.0f, 300.0f, 30.0f); node.Position = new Vector3Df(0, 7, 0); node.SetMaterialTexture(0, driver.GetTexture("../../media/stones.jpg")); node.SetMaterialTexture(1, driver.GetTexture("../../media/water.jpg")); node.SetMaterialType(MaterialType.Reflection2Layer); // create light node = smgr.AddLightSceneNode(null, new Vector3Df(0), new Colorf(1.0f, 0.6f, 0.7f, 1.0f), 800); SceneNodeAnimator anim = smgr.CreateFlyCircleAnimator(new Vector3Df(0, 150, 0), 250); node.AddAnimator(anim); anim.Drop(); // attach billboard to light node = smgr.AddBillboardSceneNode(node, new Dimension2Df(50, 50)); node.SetMaterialFlag(MaterialFlag.Lighting, false); node.SetMaterialType(MaterialType.TransparentAddColor); node.SetMaterialTexture(0, driver.GetTexture("../../media/particlewhite.bmp")); // create a particle system ParticleSystemSceneNode ps = smgr.AddParticleSystemSceneNode(false); if (ps != null) { ParticleEmitter em = ps.CreateBoxEmitter( new AABBox(-7, 0, -7, 7, 1, 7), // emitter size new Vector3Df(0.0f, 0.06f, 0.0f), // initial direction 80, 100, // emit rate new Color(255, 255, 255, 0), // darkest color new Color(255, 255, 255, 0), // brightest color 800, 2000, 0, // min and max age, angle new Dimension2Df(10.0f), // min size new Dimension2Df(20.0f)); // max size ps.Emitter = em; // this grabs the emitter em.Drop(); // so we can drop it here without deleting it ParticleAffector paf = ps.CreateFadeOutParticleAffector(); ps.AddAffector(paf); // same goes for the affector paf.Drop(); ps.Position = new Vector3Df(-70, 60, 40); ps.Scale = new Vector3Df(2); ps.SetMaterialFlag(MaterialFlag.Lighting, false); ps.SetMaterialFlag(MaterialFlag.ZWrite, false); ps.SetMaterialTexture(0, driver.GetTexture("../../media/fire.bmp")); ps.SetMaterialType(MaterialType.TransparentAddColor); } VolumeLightSceneNode n = smgr.AddVolumeLightSceneNode(null, -1, 32, // Subdivisions on U axis 32, // Subdivisions on V axis new Color(255, 255, 255, 0), // foot color new Color(0, 0, 0, 0)); // tail color if (n != null) { n.Scale = new Vector3Df(56); n.Position = new Vector3Df(-120, 50, 40); // load textures for animation List <Texture> textures = new List <Texture>(); for (int i = 7; i > 0; i--) { string s = string.Format("../../media/portal{0}.bmp", i); textures.Add(driver.GetTexture(s)); } // create texture animator SceneNodeAnimator glow = smgr.CreateTextureAnimator(textures, 0.150f); // add the animator n.AddAnimator(glow); // drop the animator because it was created with a create() function glow.Drop(); } // add animated character mesh = smgr.GetMesh("../../media/dwarf.x"); AnimatedMeshSceneNode anode = smgr.AddAnimatedMeshSceneNode(mesh); anode.Position = new Vector3Df(-50, 20, -60); anode.AnimationSpeed = 15; // add shadow anode.AddShadowVolumeSceneNode(); smgr.ShadowColor = new Color(0, 0, 0, 150); // make the model a little bit bigger and normalize its normals // because of the scaling, for correct lighting anode.Scale = new Vector3Df(2); anode.SetMaterialFlag(MaterialFlag.NormalizeNormals, true); CameraSceneNode camera = smgr.AddCameraSceneNodeFPS(); camera.Position = new Vector3Df(-50, 50, -150); // disable mouse cursor device.CursorControl.Visible = false; int lastFPS = -1; while (device.Run()) { if (device.WindowActive) { driver.BeginScene(ClearBufferFlag.All, new Color(0)); smgr.DrawAll(); driver.EndScene(); int fps = driver.FPS; if (lastFPS != fps) { device.SetWindowCaption(String.Format( "SpecialFX example - Irrlicht Engine [{0}] fps: {1}", driver.Name, fps)); lastFPS = fps; } } } device.Drop(); }