示例#1
0
        private static void Render()
        {
            // Guardo la transformacion
            Matrix old       = Moneda.Transform;
            Device d3dDevice = GuiController.Instance.D3dDevice;

            // Adaptar la altura de la moneda a la marea + offset para que quede flotando
            float  Altura           = Oceano.AplicarCPUShader(Moneda.Position).Y + 50f;
            Matrix MatrizTraslacion = Matrix.Translation(Moneda.Position.X, Altura, Moneda.Position.Z);

            // Acumular rotacion actual, sin pasarnos de una vuelta entera
            rotacionY = (rotacionY + Geometry.DegreeToRadian(1)) % (float)(2 * Math.PI);
            Matrix MatrizRotacion = Matrix.RotationYawPitchRoll(rotacionY, 0, 0);

            // Aplicar transformaciones
            Moneda.Transform = MatrizRotacion * MatrizTraslacion;
            Moneda.BoundingBox.transform(Moneda.Transform);

            // Render verdadero de la moneda
            Moneda.render();

            if (ParametrosDeConfiguracion.RenderBoundingBoxes)
            {
                Moneda.BoundingBox.setRenderColor(Color.Red);
                Moneda.BoundingBox.render();
            }

            // Restaurar la transformacion
            Moneda.Transform = old;

            ContadorMonedas.Render();
        }
示例#2
0
        public static void Cargar()
        {
            // Cargar terreno y textura
            terrain = new TgcSimpleTerrain();
            string  heightmap    = GuiController.Instance.ExamplesMediaDir + "Heighmaps\\" + "HeightmapHawaii.jpg";
            string  textura      = Utiles.TexturasDir("IslaTextura.png");
            Vector3 PosicionIsla = new Vector3(0, 0, 0);

            PosicionIsla.Y           = -Oceano.AplicarCPUShader(PosicionIsla).Y - 100;
            terrain.AlphaBlendEnable = false;
            terrain.loadHeightmap(heightmap, 100, 5f, PosicionIsla);
            terrain.loadTexture(textura);
        }
示例#3
0
        /// <summary>
        /// Método que se llama cuando termina la ejecución del ejemplo.
        /// Hacer dispose() de todos los objetos creados.
        /// </summary>
        public override void close()
        {
            // Liberar recursos del SkyBox
            SkyDome.Dispose();

            // Liberar recursos del Oceano
            Oceano.Dispose();

            // Liberar recursos del Barco
            Barco.Dispose();

            // Libera recursos del Juego (Moendas)
            Juego.Dispose();

            // Libera recursos de Isla y Faro
            Isla.Dispose();
            Faro.Dispose();

            GuiController.Instance.UserVars.clearVars();
        }
示例#4
0
        /*******************************************************
        *  ============================
        *  Funcionalidades obligatorias:
        *  ============================
        *       o El bote se tiene que poder desplazar por el agua, con los siguientes movimientos:
        *  [x]         • Aceleración
        *  [x]         • Desaceleración
        *  [x]         • Virar
        *  [x]     o El agua debe tener manera, con olas grandes que suben y bajas en tiempo real.
        *  [x]     o El bote debe adaptarse en tiempo real a la marea. Deberá inclinarse correctamente para adaptarse a la superficie del agua en donde se encuentra.
        *       o La velocidad de desplazamiento del bote deberá variar según qué tan inclinado se encuentre en el agua:
        *  [x]         • Cuesta arriba debe avanzar más lento.
        *  [x]         • Cuesta abajo debe avanzar más rápido.
        *       o Hacer principal hincapié en lograr realismo en la calidad del agua:
        *  [x]         • Utilizar iluminación dinámica para el sol.
        *  [x]         • Aplicar Enviroment Map
        *  [~]     o Debe haber un efecto de lluvia simulando una tormenta fuerte.
        *
        *  ============================
        *  Funcionalidades opcionales:
        *  ============================
        *  [x]     o Agregar efecto de truenos que ponen en blanco la pantalla momentáneamente.
        *  []     o Agregar otro bote con Inteligencia Artificial que te persigue.
        *  [~]     o Agregar una isla a la que hay que bajar, y que el agua del mar golpea contra la orilla de la misma.
        *  [x]     o Agregar efecto para poder ver desde abajo del agua
        *******************************************************/
        #endregion

        #region ::TGC INIT::
        /// <summary>
        /// Método que se llama una sola vez,  al principio cuando se ejecuta el ejemplo.
        /// Escribir aquí todo el código de inicialización: cargar modelos, texturas, modifiers, uservars, etc.
        /// Borrar todo lo que no haga falta
        /// </summary>
        public override void init()
        {
            GuiController.Instance.CustomRenderEnabled = true;

            // Modifiers personalizados
            ParametrosDeConfiguracion.Modifier = new DropdownModifier("Challenge Accepted Modifiers", this);
            GuiController.Instance.Modifiers.add(ParametrosDeConfiguracion.Modifier);

            //Carga de sonidos (música de fondo y efectos de sonido)
            Sonidos.Cargar();

            //Carga de SkyDome
            SkyDome.Cargar();

            // Carga de Oceano
            Oceano.Cargar();

            // Carga el Barco
            Barco.Cargar();

            // Carga la lógica de juego
            Juego.Cargar();

            // Carga valores para el postprocesado
            Postprocesador.Cargar();

            // Configurar posicion y hacia donde se mira
            GuiController.Instance.FpsCamera.setCamera(Barco.mesh.Position + new Vector3(500, 300, 0), Barco.mesh.Position);
            GuiController.Instance.ThirdPersonCamera.setCamera(Barco.mesh.Position, 500, -500);

            // Carga isla sobre la que se pone el faro
            Isla.Cargar(); Faro.Cargar();

            // Cara los emisores de particulas de la lluvia
            Lluvia.Cargar();
        }
示例#5
0
        public static void Cargar()
        {
            TgcSceneLoader loader = new TgcSceneLoader();

            //Cargar mesh
            TgcScene scene = loader.loadSceneFromFile(Utiles.MeshesDir("Faro\\Faro-TgcScene.xml"));

            MeshFaro          = scene.Meshes[0];
            MeshFaro.Position = Isla.PosicionCima;

            PosicionLuz    = Isla.PosicionCima;
            PosicionLuz.Y += MeshFaro.BoundingBox.calculateSize().Y;


            DireccionLuz     = Oceano.AplicarCPUShader(new Vector3(1000, 0, 500)) - PosicionLuz;
            Luz              = new Light();
            Luz.Direction    = DireccionLuz;
            Luz.AmbientColor = new ColorValue(1f, 0f, 0f, 1f);;
            Luz.Diffuse      = Color.FromArgb(new ColorValue(2f, 2f, 2f, 1f).ToArgb());
            Luz.Ambient      = Color.FromArgb(new ColorValue(1f, 1f, 1f, 1f).ToArgb());
            Luz.Specular     = Color.FromArgb(new ColorValue(1f, 1f, 1f, 1f).ToArgb());
            Luz.Attenuation0 = 0.01f;
            Luz.Type         = LightType.Point;
        }
示例#6
0
        /// <summary>
        /// Método que 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>
        /// <param name="elapsedTime">Tiempo en segundos transcurridos desde el último frame</param>
        public override void render(float elapsedTime)
        {
            GuiController.Instance.FpsCounterEnable = true;

            if (Utiles.CamaraSumergida)
            {
                Postprocesador.CambiarRenderState();
            }

            //Device de DirectX para renderizar
            Device d3dDevice = GuiController.Instance.D3dDevice;

            // Procesa los sonidos
            Sonidos.Procesar();

            // las camaras solo se modifican cuando no esta activo el frustum culling
            // asi podemos usar la fps para culling y la 3rd person para mostrarlo
            if (!ParametrosDeConfiguracion.VerFrustumCulling)
            {
                GuiController.Instance.FpsCamera.Enable         = ParametrosDeConfiguracion.CamaraLibre;
                GuiController.Instance.ThirdPersonCamera.Enable = !ParametrosDeConfiguracion.CamaraLibre;
            }

            // Procea Dispositivos de entrada (teclado y mouse)
            DispositivosDeEntrada.Procesar();

            //Renderizar el Rayo
            //Rayo.Render();

            Oceano.RenderRefraccion();

            Oceano.RenderReflexion();

            d3dDevice.Clear(ClearFlags.ZBuffer | ClearFlags.Target, ParametrosDeConfiguracion.Agua.Color.ToArgb(), 1.0f, 0);

            // pongo los rendering states
            d3dDevice.RenderState.ZBufferEnable      = true;
            d3dDevice.RenderState.ZBufferWriteEnable = true;
            d3dDevice.RenderState.ZBufferFunction    = Compare.LessEqual;
            //d3dDevice.RenderState.AlphaBlendEnable = false;

            // Renderizar SkyDome
            SkyDome.Render();

            // Renderiza el efecto niebla
            if (ParametrosDeConfiguracion.Niebla)
            {
                Niebla.Render();
            }

            // Renderizar Oceano
            Oceano.Render();

            // Renderizo Barco
            Barco.Render(EstadoRender.NORMAL);

            // Render isla y faro
            Isla.Render();
            Faro.Render();

            // Seteo el sol como fuente de luz
            Sol.Render(EstadoRender.NORMAL);

            Lluvia.Render();

            if (ParametrosDeConfiguracion.RenderQuadTree)
            {
                QuadTree.Render();
            }

            if (Postprocesador.Trabajando)
            {
                Postprocesador.RenderPostProcesado();
            }

            // Proceso logica de juego y dibujo monedas
            Juego.Procesar();

            // Volver a dibujar FPS
            GuiController.Instance.Text3d.drawText("FPS: " + HighResolutionTimer.Instance.FramesPerSecond, 0, 0, Color.Yellow);
            GuiController.Instance.AxisLines.render();
        }
示例#7
0
        public static void CalcularFisica()
        {
            float elapsedTime = GuiController.Instance.ElapsedTime;

            //Si el barco esta inclinado modifico su velocidad
            //(si la pendiente es negativa por ser una resta en verdad suma, mientras que si la pendiente es positiva solo resta).
            float modificador = 1;

            if (Vel.Y < -0.1f)
            {
                modificador = 1.5f;
            }
            if (Vel.Y > 0.1f)
            {
                modificador = (1f / 2f);
            }

            //La multiplicacion por aceleraFrena es porque si esta andando en reversa el sentido es opuesto
            //var pendiente = Vel.Y * 2f * AceleraFrena;
            //modificador = modificador - pendiente;
            if (DerechaIzquierda != 0)
            {
                angulo = angulo + (float)(DerechaIzquierda * Math.PI / 256);
            }

            vDireccion.Y = 0;
            vDireccion.Z = (float)Math.Cos(angulo);
            vDireccion.X = (float)Math.Sin(angulo);
            vDireccion.Normalize();

            velocidad_desplazamiento = velocidad_desplazamiento + AceleraFrena;
            if (velocidad_desplazamiento > MAX_VELOCIDAD_DESPLAZAMIENTO)
            {
                velocidad_desplazamiento = MAX_VELOCIDAD_DESPLAZAMIENTO;
            }
            if (velocidad_desplazamiento < 0)
            {
                velocidad_desplazamiento = 0;
            }

            //Multiplicar la velocidad por el tiempo transcurrido, para no acoplarse al CPU
            Vector3 vDesplazamiento = vDireccion * velocidad_desplazamiento * modificador * elapsedTime;

            // Cargo la nueva posicion del bote en el centro
            var nuevaPosicion = vDesplazamiento + mesh.Position;

            nuevaPosicion = new Vector3(nuevaPosicion.X, Oceano.AplicarCPUShader(nuevaPosicion).Y, nuevaPosicion.Z);
            mesh.Position = nuevaPosicion;

            //Busco la nueva posicion del frente del bote
            var barcoFrente = mesh.Position;

            barcoFrente   = mesh.Position + vDireccion * (LargoBote / 2);
            barcoFrente.Y = Oceano.AplicarCPUShader(barcoFrente).Y;

            Vel = barcoFrente - mesh.Position;
            Vel.Normalize();

            mesh.Transform = CalcularMatriz(mesh.Position, mesh.Scale, Vel);
            mesh.BoundingBox.transform(mesh.Transform);
        }