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(); }
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); }
/// <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(); }
/******************************************************* * ============================ * 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(); }
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; }
/// <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(); }
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); }