예제 #1
0
        /// <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();
        }
예제 #2
0
        /// <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();
        }