// Just override the mandatory create scene method public override void CreateScene() { // Set ambient light sceneMgr.AmbientLight = new ColourValue(0.2f, 0.2f, 0.2f); // Skybox sceneMgr.SetSkyBox(true, "Examples/MorningSkyBox"); // Create a light Light l = sceneMgr.CreateLight("MainLight"); l.Type = Light.LightTypes.LT_DIRECTIONAL; Vector3 dir = new Vector3(0.5f, -1, 0); dir.Normalise(); l.Direction = dir; l.DiffuseColour = new ColourValue(1.0f, 1.0f, 0.8f); l.SpecularColour = new ColourValue(1.0f, 1.0f, 1.0f); // Create a prefab plane mPlane = new MovablePlane(Vector3.UNIT_Y, 0); MeshManager.Singleton.CreatePlane("ReflectionPlane", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, mPlane._getDerivedPlane(), 2000, 2000, 1, 1, true, 1, 1, 1, Vector3.UNIT_Z); mPlaneEnt = sceneMgr.CreateEntity("Plane", "ReflectionPlane"); // Create an entity from a model (will be loaded automatically) Entity knotEnt = sceneMgr.CreateEntity("Knot", "knot.mesh"); // Create an entity from a model (will be loaded automatically) Entity ogreHead = sceneMgr.CreateEntity("Head", "ogrehead.mesh"); knotEnt.SetMaterialName("Examples/TextureEffect2"); // Attach the rtt entity to the root of the scene SceneNode rootNode = sceneMgr.RootSceneNode; mPlaneNode = rootNode.CreateChildSceneNode(); // Attach both the plane entity, and the plane definition mPlaneNode.AttachObject(mPlaneEnt); mPlaneNode.AttachObject(mPlane); mPlaneNode.Translate(0, -10, 0); // Tilt it a little to make it interesting mPlaneNode.Roll(new Degree(5)); rootNode.CreateChildSceneNode("Head").AttachObject(ogreHead); TexturePtr texture = TextureManager.Singleton.CreateManual("RttTex", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, TextureType.TEX_TYPE_2D, 512, 512, 0, PixelFormat.PF_R8G8B8, (int)TextureUsage.TU_RENDERTARGET); RenderTarget rttTex = texture.GetBuffer().GetRenderTarget(); mReflectCam = sceneMgr.CreateCamera("ReflectCam"); mReflectCam.NearClipDistance = camera.NearClipDistance; mReflectCam.FarClipDistance = camera.FarClipDistance; mReflectCam.AspectRatio = (float)window.GetViewport(0).ActualWidth / (float)window.GetViewport(0).ActualHeight; mReflectCam.FOVy = camera.FOVy; Viewport v = rttTex.AddViewport(mReflectCam); v.SetClearEveryFrame(true); v.BackgroundColour = ColourValue.Black; MaterialPtr mat = MaterialManager.Singleton.Create("RttMat", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME); TextureUnitState t = mat.GetTechnique(0).GetPass(0).CreateTextureUnitState("RustedMetal.jpg"); t = mat.GetTechnique(0).GetPass(0).CreateTextureUnitState("RttTex"); // Blend with base texture t.SetColourOperationEx(LayerBlendOperationEx.LBX_BLEND_MANUAL, LayerBlendSource.LBS_TEXTURE, LayerBlendSource.LBS_CURRENT, ColourValue.White, ColourValue.White, 0.25f); t.SetTextureAddressingMode(TextureUnitState.TextureAddressingMode.TAM_CLAMP); t.SetProjectiveTexturing(true, mReflectCam); rttTex.PostRenderTargetUpdate += postRenderTargetUpdate; rttTex.PreRenderTargetUpdate += preRenderTargetUpdate; // set up linked reflection mReflectCam.EnableReflection(mPlane); // Also clip mReflectCam.EnableCustomNearClipPlane(mPlane); // Give the plane a texture mPlaneEnt.SetMaterialName("RttMat"); // Add a whole bunch of extra transparent entities Entity cloneEnt; for (int n = 0; n < 10; ++n) { // Create a new node under the root SceneNode node = sceneMgr.CreateSceneNode(); // Random translate Vector3 nodePos; nodePos.x = Mogre.Math.SymmetricRandom() * 750.0f; nodePos.y = Mogre.Math.SymmetricRandom() * 100.0f + 25; nodePos.z = Mogre.Math.SymmetricRandom() * 750.0f; node.Position = nodePos; rootNode.AddChild(node); // Clone knot string cloneName = "Knot" + n; cloneEnt = knotEnt.Clone(cloneName); // Attach to new node node.AttachObject(cloneEnt); } camera.Position = new Vector3(-50, 100, 500); camera.LookAt(0, 0, 0); }
protected override void CreateScene() { // set ambient light scene.AmbientLight = new ColorEx(0.2f, 0.2f, 0.2f); scene.SetSkyBox(true, "Skybox/Morning", 5000); // create a default point light Light light = scene.CreateLight("MainLight"); light.Type = LightType.Directional; Vector3 dir = new Vector3(0.5f, -1, 0); dir.Normalize(); light.Direction = dir; light.Diffuse = new ColorEx(1.0f, 1.0f, 0.8f); light.Specular = ColorEx.White; // create a plane plane = new MovablePlane("ReflectPlane"); plane.D = 0; plane.Normal = Vector3.UnitY; // create another plane to create the mesh. Ogre's MovablePlane uses multiple inheritance, bah! Plane tmpPlane = new Plane(); tmpPlane.D = 0; tmpPlane.Normal = Vector3.UnitY; MeshManager.Instance.CreatePlane("ReflectionPlane", tmpPlane, 2000, 2000, 1, 1, true, 1, 1, 1, Vector3.UnitZ); planeEntity = scene.CreateEntity("Plane", "ReflectionPlane"); // create an entity from a model Entity knot = scene.CreateEntity("Knot", "knot.mesh"); knot.MaterialName = "TextureFX/Knot"; // create an entity from a model Entity head = scene.CreateEntity("Head", "ogrehead.mesh"); // attach the render to texture entity to the root of the scene SceneNode rootNode = scene.RootSceneNode; planeNode = rootNode.CreateChildSceneNode(); planeNode.AttachObject(planeEntity); planeNode.AttachObject(plane); planeNode.Translate(new Vector3(0, -10, 0)); // tilt it a little to make it interesting planeNode.Roll(5); rootNode.CreateChildSceneNode("Head").AttachObject(head); // create a render texture RenderTexture rttTex = Root.Instance.RenderSystem.CreateRenderTexture("RttTex", 512, 512); reflectCam = scene.CreateCamera("ReflectCam"); reflectCam.Near = camera.Near; reflectCam.Far = camera.Far; reflectCam.AspectRatio = (float)window.GetViewport(0).ActualWidth / (float)window.GetViewport(0).ActualHeight; Viewport viewport = rttTex.AddViewport(reflectCam); viewport.ClearEveryFrame = true; viewport.OverlaysEnabled = false; viewport.BackgroundColor = ColorEx.Black; Material mat = scene.CreateMaterial("RttMat"); TextureUnitState t = mat.GetTechnique(0).GetPass(0).CreateTextureUnitState("RustedMetal.jpg"); t = mat.GetTechnique(0).GetPass(0).CreateTextureUnitState("RttTex"); // blend with base texture t.SetColorOperationEx(LayerBlendOperationEx.BlendManual, LayerBlendSource.Texture, LayerBlendSource.Current, ColorEx.White, ColorEx.White, 0.25f); t.SetProjectiveTexturing(true, reflectCam); // register events for viewport before/after update rttTex.AfterUpdate += new RenderTargetUpdateEventHandler(rttTex_AfterUpdate); rttTex.BeforeUpdate += new RenderTargetUpdateEventHandler(rttTex_BeforeUpdate); // set up linked reflection reflectCam.EnableReflection(plane); // also clip reflectCam.EnableCustomNearClipPlane(plane); planeEntity.MaterialName = "RttMat"; Entity clone = null; for (int i = 0; i < 10; i++) { // create a new node under the root SceneNode node = scene.CreateSceneNode(); // calculate a random position Vector3 nodePosition = new Vector3(); nodePosition.x = MathUtil.SymmetricRandom() * 750.0f; nodePosition.y = MathUtil.SymmetricRandom() * 100.0f + 25; nodePosition.z = MathUtil.SymmetricRandom() * 750.0f; // set the new position node.Position = nodePosition; // attach this node to the root node rootNode.AddChild(node); // clone the knot string cloneName = string.Format("Knot{0}", i); clone = knot.Clone(cloneName); // add the cloned knot to the scene node.AttachObject(clone); } camera.Position = new Vector3(-50, 100, 500); camera.LookAt(new Vector3(0, 0, 0)); }