/// <summary> /// Se llama cuando termina la ejecución del ejemplo. /// Hacer Dispose() de todos los objetos creados. /// Es muy importante liberar los recursos, sobretodo los gráficos ya que quedan bloqueados en el device de video. /// </summary> public override void Dispose() { disposing = true; shark.Dispose(); efectoDesaparecer.Dispose(); sonidoUnderwater.dispose(); Player.Dispose(); oceano.Dispose(); heightmap.Dispose(); foreach (var pez in peces) { pez.Dispose(); } foreach (var coral in corales) { coral.Dispose(); } foreach (var metal in metales) { metal.Dispose(); } foreach (var piedra in piedras) { piedra.Dispose(); } nave.Dispose(); interiorNave.Dispose(); mesaNave.Dispose(); sogaInterior.Dispose(); lamparaNave.Dispose(); sillaInterior.Dispose(); timonInterior.Dispose(); Particulas.Dispose(); Oceano.Dispose(); Hud.Dispose(); maskTexture.dispose(); perlinTexture.dispose(); arma.Dispose(); effect.Dispose(); renderTarget.Dispose(); fullScreenQuad.Dispose(); depthStencil.Dispose(); coralesBrillantes.Dispose(); FBVerticalBloom.Dispose(); FBHorizontalBool.Dispose(); }
/// <summary> /// Se llama cada vez que hay que refrescar la pantalla. /// Escribir aquí todo el código referido al renderizado. /// Borrar todo lo que no haga falta. /// </summary> public override void Render() { if (disposing) { return; } //ClearTextures(); var device = D3DDevice.Instance.Device; // Capturamos las texturas de pantalla Surface screenRenderTarget = device.GetRenderTarget(0); Surface screenDepthSurface = device.DepthStencilSurface; // Especificamos que vamos a dibujar en una textura device.SetRenderTarget(0, renderTarget.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; // Captura de escena en render target device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); bool flagFuera = true; if (estaEnAlgunMenu) { oceano.Render(); heightmap.Render(); foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("RenderScene"); pez.Render(); } } if (IsInFrustum(shark.GetMesh())) { shark.Technique("RenderScene"); shark.Render(); } foreach (var coral in corales) { if (IsInFrustum(coral.GetMesh())) { coral.Technique("RenderScene"); coral.Render(); } } Particulas.Render(ElapsedTime); foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Render(); } } //Efecto metalico effect.SetValue("shininess", 30f); effect.SetValue("KSpecular", 1.0f); effect.SetValue("KAmbient", 1.0f); effect.SetValue("KDiffuse", 0.5f); if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("RenderSceneLight"); nave.Render(); } effect.SetValue("shininess", 10f); effect.SetValue("KSpecular", 1.1f); effect.SetValue("KAmbient", 1.2f); effect.SetValue("KDiffuse", 0.25f); foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("RenderSceneLight"); metal.Render(); } } Oceano.Render(); Player.Render(); } if (!estaEnAlgunMenu) { if (estaEnNave) { efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.1f); efectoInterior.SetValue("KAmbient", 3.0f); efectoInterior.SetValue("KDiffuse", 0f); interiorNave.Render(); // constantes de iluminacion de la mesa efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.2f); efectoInterior.SetValue("KAmbient", 3.0f); efectoInterior.SetValue("KDiffuse", 0.1f); mesaNave.Render(); // es el mismo material (madera) mantengo las mismas constantes sillaInterior.Render(); timonInterior.Render(); // constantes de iluminacion de la soga efectoInterior.SetValue("shininess", 1f); efectoInterior.SetValue("KSpecular", 0.15f); efectoInterior.SetValue("KAmbient", 2.0f); efectoInterior.SetValue("KDiffuse", 0f); sogaInterior.Render(); efectoInterior.SetValue("shininess", 5.0f); efectoInterior.SetValue("KSpecular", 2.5f); efectoInterior.SetValue("KAmbient", 5.0f); efectoInterior.SetValue("KDiffuse", 0f); lamparaNave.Render(); if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("RenderScene"); arma.Render(); } } else { flagFuera = false; oceano.Render(); heightmap.Render(); foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("RenderScene"); pez.Render(); } } foreach (var coral in corales) { if (IsInFrustum(coral.GetMesh())) { coral.Technique("RenderScene"); coral.Render(); } } foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Technique("RenderScene"); piedra.Render(); } } if (IsInFrustum(shark.GetMesh())) { shark.Technique("RenderScene"); shark.Render(); } Particulas.Render(ElapsedTime); //Efecto metalico effect.SetValue("shininess", 30f); effect.SetValue("KSpecular", 1.0f); effect.SetValue("KAmbient", 1.0f); effect.SetValue("KDiffuse", 0.5f); if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("RenderSceneLight"); nave.Render(); } effect.SetValue("shininess", 10f); effect.SetValue("KSpecular", 1.1f); effect.SetValue("KAmbient", 1.2f); effect.SetValue("KDiffuse", 0.25f); foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("RenderSceneLight"); metal.Render(); } } if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("RenderScene"); arma.Render(); } Oceano.Render(); } Player.Render(); } device.EndScene(); if (!flagFuera || estaEnAlgunMenu) { device.SetRenderTarget(0, coralesBrillantes.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); // dibujo 15 corales con luz int j = 0; //todo: poner 10 while (j < 25) { if (IsInFrustum(corales[j].GetMesh())) { corales[j].Technique("Bloom"); corales[j].Render(); } j++; } foreach (var pez in peces) { if (IsInFrustum(pez.GetMesh())) { pez.Technique("BloomMask"); pez.Render(); } } if (shark.estoyVivo() && IsInFrustum(shark.GetMesh())) { shark.Technique("BloomMask"); shark.Render(); } if (IsInFrustum(nave.obtenerMeshes())) { nave.Technique("BloomMask"); nave.Render(); } foreach (var metal in metales) { if (IsInFrustum(metal.GetMesh())) { metal.Technique("BloomMask"); metal.Render(); } } foreach (var piedra in piedras) { if (IsInFrustum(piedra.GetMesh())) { piedra.Technique("BloomMask"); piedra.Render(); } } if (Player.Instance().puedoEnfrentarTiburon()) { // renderizo arma arma.Effect(effect); arma.Technique("BloomMask"); arma.Render(); } device.EndScene(); // aplico pasada de blur horizontal y vertical al FB de los corales q brillan var bufferPasada = coralesBrillantes; for (int index = 0; index < 4; index++) { device.SetRenderTarget(0, FBHorizontalBool.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.Technique = "BlurHorizontal"; device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("fBCoralesBrillantes", bufferPasada); effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); device.EndScene(); device.SetRenderTarget(0, FBVerticalBloom.GetSurfaceLevel(0)); device.DepthStencilSurface = depthStencil; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); effect.Technique = "BlurVertical"; device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("fBCoralesBrillantes", FBHorizontalBool); effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); device.EndScene(); bufferPasada = FBVerticalBloom; } } // Especificamos que vamos a dibujar en pantalla device.SetRenderTarget(0, screenRenderTarget); device.DepthStencilSurface = screenDepthSurface; device.BeginScene(); device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); if (estaEnAlgunMenu) { effect.Technique = "PostProcessMenu"; } else if (flagFuera) { effect.Technique = "PostProcess"; } else { effect.Technique = "PostProcessMar"; } device.VertexFormat = CustomVertex.PositionTextured.Format; device.SetStreamSource(0, fullScreenQuad, 0); effect.SetValue("sceneFrameBuffer", renderTarget); effect.SetValue("verticalBlurFrameBuffer", FBVerticalBloom); // Dibujamos el full screen quad effect.Begin(FX.None); effect.BeginPass(0); device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2); effect.EndPass(); effect.End(); Hud.Render(); RenderFPS(); RenderAxis(); device.EndScene(); device.Present(); }