public static void Cargar() { Device d3dDevice = GuiController.Instance.D3dDevice; // Cargo el shader que tiene los efectos de postprocesado Shader = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosMediaDir + "RenderGroup\\shaders\\postProcess.fx"); // Creo el quad que va a ocupar toda la pantalla CustomVertex.PositionTextured[] screenQuadVertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured(-1, 1, 1, 0, 0), new CustomVertex.PositionTextured( 1, 1, 1, 1, 0), new CustomVertex.PositionTextured(-1,-1, 1, 0, 1), new CustomVertex.PositionTextured( 1,-1, 1, 1, 1) }; ScreenQuad = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, GuiController.Instance.D3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); ScreenQuad.SetData(screenQuadVertices, 0, LockFlags.None); // Creamos un render targer sobre el cual se va a dibujar la pantalla RenderTargetPostprocesado = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); #region VALORES DE INTERPOLACION intVaivenOscurecer = new InterpoladorVaiven(); intVaivenOscurecer.Min = 1; intVaivenOscurecer.Max = 15; intVaivenOscurecer.Speed = 40f; intVaivenOscurecer.reset(); #endregion }
public PostProcesadoManager(EjemploAlumno ejemAlumno) { ejemploAlumno = ejemAlumno; GuiController.Instance.CustomRenderEnabled = true; Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; //Se crean 2 triangulos (o Quad) con las dimensiones de la pantalla con sus posiciones ya transformadas // x = -1 es el extremo izquiedo de la pantalla, x = 1 es el extremo derecho // Lo mismo para la Y con arriba y abajo // la Z en 1 simpre CustomVertex.PositionTextured[] screenQuadVertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured( -1, 1, 1, 0,0), new CustomVertex.PositionTextured(1, 1, 1, 1,0), new CustomVertex.PositionTextured(-1, -1, 1, 0,1), new CustomVertex.PositionTextured(1,-1, 1, 1,1) }; //vertex buffer de los triangulos screenQuadVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); screenQuadVB.SetData(screenQuadVertices, 0, LockFlags.None); // stencil g_pDepthStencil = d3dDevice.CreateDepthStencilSurface(d3dDevice.PresentationParameters.BackBufferWidth, d3dDevice.PresentationParameters.BackBufferHeight, DepthFormat.D24S8, MultiSampleType.None, 0, true); //Creamos un Render Targer sobre el cual se va a dibujar la pantalla renderTarget2D = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); effect = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosDir + "SRC\\Renderman\\Efectos\\PostProcesado\\PocaVidaRestante.fx"); //Cargar textura que se va a dibujar arriba de la escena del Render Target alarmTexture = TgcTexture.createTexture(GuiController.Instance.D3dDevice, GuiController.Instance.AlumnoEjemplosMediaDir + "\\RenderMan\\texturas\\efecto_alarma.png"); //Interpolador para efecto de variar la intensidad de la textura de alarma intVaivenAlarm = new InterpoladorVaiven(); intVaivenAlarm.Min = 0; intVaivenAlarm.Max = 1; intVaivenAlarm.Speed = 5; intVaivenAlarm.reset(); }
public override void init() { //GuiController.Instance: acceso principal a todas las herramientas del Framework enemigos = new List<Barco>(); terminoJuego = false; //Device de DirectX para crear primitivas Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; g_pCubeMapAgua = TextureLoader.FromCubeFile(d3dDevice, GuiController.Instance.ExamplesMediaDir + "Shaders\\CubeMap.dds"); //sol = TgcBox.fromSize(new Vector3(50, 50, 50), Color.LightYellow); //Cargo la escena completa que tendria que ser la del escenario con el cielo / la del agua //PROXIMAMENTE, ahora cargo otro escenario //Pruebo postprocess lluvia CustomVertex.PositionTextured[] screenQuadVertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured( -1, 1, 1, 0,0), new CustomVertex.PositionTextured(1, 1, 1, 1,0), new CustomVertex.PositionTextured(-1, -1, 1, 0,1), new CustomVertex.PositionTextured(1,-1, 1, 1,1) }; //vertex buffer de los triangulos screenQuadVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); screenQuadVB.SetData(screenQuadVertices, 0, LockFlags.None); //Creamos un Render Targer sobre el cual se va a dibujar la pantalla renderTarget2D = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Cargar shader con efectos de Post-Procesado effectlluvia = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\PostProcess.fx"); //Configurar Technique dentro del shader effectlluvia.Technique = "AlarmaTechnique"; //Cargar textura que se va a dibujar arriba de la escena del Render Target alarmTexture = TgcTexture.createTexture(d3dDevice, GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\rain.png"); //Interpolador para efecto de variar la intensidad de la textura de alarma intVaivenAlarm = new InterpoladorVaiven(); intVaivenAlarm.Min = 0; intVaivenAlarm.Max = 2; intVaivenAlarm.Speed = 10; intVaivenAlarm.reset(); //Modifier para activar/desactivar efecto de alarma GuiController.Instance.Modifiers.addBoolean("activar_efecto", "Activar efecto", true); //termina post process //inicio// spriteFondo = new TgcSprite(); spriteFondo.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\MenuPrincipal.jpg"); Size screenSize = GuiController.Instance.Panel3d.Size; Size textureSize = spriteFondo.Texture.Size; spriteFondo.Scaling = new Vector2(1f, 0.8f); spriteFondo.Position = new Vector2(FastMath.Max(screenSize.Width / 2 - textureSize.Width / 2, 0), FastMath.Max(screenSize.Height / 2 - textureSize.Height / 2, 0)); spriteLetras = new TgcSprite(); spriteLetras.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\Texto.png"); spriteInicio = new TgcSprite(); spriteInicio.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\inicio.png"); spriteLetras.Scaling = new Vector2(0.4f*1.65f, 0.3f*1.65f); Size textureSize2 = spriteLetras.Texture.Size; spriteInicio.Scaling = new Vector2(0.4f, 0.3f); Size textureSize3 = spriteInicio.Texture.Size; spriteTermino = new TgcSprite(); spriteTermino.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\termino.png"); //spriteTermino.Scaling = new Vector2(0.5f,0.5f); spriteTermino.Position = new Vector2(screenSize.Width / 4, screenSize.Height / 2); spriteLetras.Position = new Vector2(FastMath.Max(screenSize.Width / 2 - textureSize2.Width / 2, 0), FastMath.Max(screenSize.Height / 2 - textureSize2.Height / 2, 0)); spriteLetras.Position = new Vector2(spriteLetras.Position.X + 110, spriteLetras.Position.Y); spriteInicio.Position = new Vector2(FastMath.Max(screenSize.Width / 2 - textureSize3.Width / 2, 0), FastMath.Max(screenSize.Height / 2 - textureSize3.Height / 2, 0)); spriteInicio.Position = new Vector2(spriteInicio.Position.X + 210, spriteLetras.Position.Y+95); spriteMinimapa = new TgcSprite(); spriteMinimapa.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\minimapa.png"); spriteMinimapa.Scaling = new Vector2(0.2f, 0.2f); Size minimapSize = spriteMinimapa.Texture.Size; spriteMinimapa.Position = new Vector2(FastMath.Max(screenSize.Width - 210, 0), FastMath.Max(screenSize.Height - minimapSize.Height , 0)); spriteBarcoPrincipal = new TgcSprite(); spriteBarcoPrincipal.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\pointgreen.png"); spriteBarcoPrincipal.Scaling = new Vector2(0.5f,0.5f); //inicio// //ui sprBarraVida = new TgcSprite(); sprBarraVida.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\BarraVacia.png"); Size textureSize4 = sprBarraVida.Texture.Size; sprBarraVida.Scaling = new Vector2(1f, 1f); sprBarraVida.Position = new Vector2(1, 1); sprVidaLLena = new TgcSprite(); sprVidaLLena.Texture = TgcTexture.createTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\vidallena.png"); Size textureSize5 = sprVidaLLena.Texture.Size; sprVidaLLena.Scaling = new Vector2(1f, 1f); sprVidaLLena.Position = new Vector2(1, 15); //ui Bitmap b = (Bitmap)Bitmap.FromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\wallhaven-276951.jpg"); //"water_water_0056_01_preview.jpg"); b.RotateFlip(RotateFlipType.Rotate90FlipX); textura = Texture.FromBitmap(d3dDevice, b, Usage.None, Pool.Managed); b = (Bitmap)Bitmap.FromFile(GuiController.Instance.ExamplesMediaDir + "Shaders\\BumpMapping_DiffuseMap.jpg"); diffuseMapTexture = Texture.FromBitmap(d3dDevice, b, Usage.None, Pool.Managed); oceano = new SmartTerrain(); //oceano.loadHeightmap(GuiController.Instance.ExamplesMediaDir + "Heighmaps\\" + "TerrainTexture1-256x256.jpg", 30.00f, 1.0f, new Vector3(0, 0, 0)); oceano.loadPlainHeightmap(256, 256, 0, 50.0f, 1.0f, new Vector3(0, 0, 0)); oceano.loadTexture(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\water_water_0056_01_preview.jpg"); TgcSceneLoader loader = new TgcSceneLoader(); //escena = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Isla\\Isla-TgcScene.xml"); //Textura del skybox string texturesPath = GuiController.Instance.ExamplesMediaDir + "Texturas\\Quake\\SkyBox LostAtSeaDay\\"; //Crear SkyBox skyBox = new TgcSkyBox(); skyBox.Center = new Vector3(0, 0, 0); skyBox.Size = new Vector3(10000, 10000, 10000); //Configurar color //skyBox.Color = Color.OrangeRed; //Configurar las texturas para cada una de las 6 caras skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Up, texturesPath + "lostatseaday_up.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Down, texturesPath + "lostatseaday_dn.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Left, texturesPath + "lostatseaday_lf.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Right, texturesPath + "lostatseaday_rt.jpg"); //Hay veces es necesario invertir las texturas Front y Back si se pasa de un sistema RightHanded a uno LeftHanded skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Front, texturesPath + "lostatseaday_bk.jpg"); skyBox.setFaceTexture(TgcSkyBox.SkyFaces.Back, texturesPath + "lostatseaday_ft.jpg"); //Actualizar todos los valores para crear el SkyBox skyBox.updateValues(); //Cargo el mesh del/los barco/s -> porque se carga como escena y no cargo el mesh directamente? TgcScene scene2 = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\Boteconcañon\\BoteConCanion-TgcScene.xml"); mainMesh = scene2.Meshes[0]; mainMesh.Position = new Vector3(-200f,0f, 200f); mainMesh.Scale = new Vector3(2f,2f,2f); TgcScene scene4 = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\Boteconcañon\\BoteConCanion-TgcScene.xml"); meshBot = scene4.Meshes[0]; meshBot.Position = new Vector3(-200f,0f,200f); meshBot.Scale = new Vector3(1.8f, 1.8f, 1.8f); TgcScene scene3 = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\Hacha\\Bala-TgcScene.xml"); balaMesh1 = scene3.Meshes[0]; TgcScene scene5 = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\Hacha\\Hacha-TgcScene.xml"); balaMesh2 = scene5.Meshes[0]; barcoPrincipal = new BarcoPlayer(150, 50, VELOCIDAD_MOVIMIENTO, ACELERACION, VELOCIDAD_ROTACION, mainMesh, 0.06, loader,balaMesh2); //pongo enemigos int rows = 12; float offset = 3000; for (int i = 0; i < rows; i++) { //Crear instancia de modelo TgcMesh instance = meshBot.createMeshInstance(meshBot.Name + i + "_" ); //Desplazarlo instance.move(offset * (FastMath.Cos((float)i * 0.523599f)),0,offset * FastMath.Sin((float)i * 0.523599f)); instance.Scale = new Vector3(1.5f, 1.5f, 1.5f); var barcoenem = new BarcoBot(100, 10, 100, ACELERACION, 18, instance, 0.05, barcoPrincipal, loader,balaMesh1); barcoenem.Mesh.Effect = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\shader_bote.fx"); //efectosAguaIluminacion; barcoenem.Mesh.Technique = GuiController.Instance.Shaders.getTgcMeshTechnique(barcoenem.Mesh.RenderType);//"EnvironmentMapTechnique"; barcoenem.BarcosEnemigos = new List<Barco>(); barcoenem.BarcosEnemigos.Add(barcoPrincipal); enemigos.Add(barcoenem); } //TgcScene scene3 = loader.loadSceneFromFile(GuiController.Instance.ExamplesDir + "Shaders\\WorkshopShaders\\Media\\Piso\\Agua-TgcScene.xml"); //agua = scene3.Meshes[0]; //agua.Scale = new Vector3(25f, 1f, 25f); //agua.Position = new Vector3(0f, 0f, 0f); efectosAguaIluminacion = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\shader_agua.fx"); oceano.Effect = efectosAguaIluminacion; oceano.Technique = "RenderAgua";//"EnvironmentMapTechnique"; //"RenderAgua"; oceano.AlphaBlendEnable = true; //barcoEnemigo = new BarcoBot(100, 35,100, ACELERACION, 18, meshBot, 0.05,barcoPrincipal,loader); barcoPrincipal.BarcosEnemigos = enemigos; // iluminacion en los barcos barcoPrincipal.Mesh.Effect = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosMediaDir + "quicksort\\shader_bote.fx");//GuiController.Instance.Shaders.TgcMeshPointLightShader;// efectosAguaIluminacion; //GuiController.Instance.Shaders.TgcMeshPointLightShader;// efectosAguaIluminacion; barcoPrincipal.Mesh.Technique = GuiController.Instance.Shaders.getTgcMeshTechnique(barcoPrincipal.Mesh.RenderType); //"EnvironmentMapTechnique"; //barcoEnemigo.Mesh.Effect = GuiController.Instance.Shaders.TgcMeshPointLightShader; //efectosAguaIluminacion; //barcoEnemigo.Mesh.Technique = GuiController.Instance.Shaders.getTgcMeshTechnique(barcoEnemigo.Mesh.RenderType);//"EnvironmentMapTechnique"; //Camara en tercera persona focuseada en el barco (canoa) //PARA DESARROLLO DEL ESCENARIO ES MEJOR MOVERSE CON ESTA CAMARA GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.Velocity = new Vector3(0.0f,0.0f,0.0f); GuiController.Instance.FpsCamera.JumpSpeed = 0f; GuiController.Instance.FpsCamera.setCamera(new Vector3(0f,700f,-2300f), new Vector3(900f, 100f, -300f)); GuiController.Instance.ThirdPersonCamera.rotateY(Geometry.DegreeToRadian(180)); ////GuiController.Instance.Fog.Enabled = true; //GuiController.Instance.Modifiers.addFloat("reflection", 0, 1, 0.35f); //GuiController.Instance.Modifiers.addVertex3f("lightPos", new Vector3(-3000, 0, -3000), new Vector3(3000, 3000, 3000), new Vector3(-300, 1500, 3000)); GuiController.Instance.Modifiers.addColor("lightColor", Color.LightYellow); //GuiController.Instance.Modifiers.addFloat("bumpiness", 0, 1, 1f); GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 500, 150); GuiController.Instance.Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.1f); GuiController.Instance.Modifiers.addFloat("specularEx", 0, 100, 20f); GuiController.Instance.Modifiers.addColor("mEmissive", Color.Black); GuiController.Instance.Modifiers.addColor("mAmbient", Color.White); GuiController.Instance.Modifiers.addColor("mDiffuse", Color.White); GuiController.Instance.Modifiers.addColor("mSpecular", Color.White); //Carpeta de archivos Media del alumno //string alumnoMediaFolder = GuiController.Instance.AlumnoEjemplosMediaDir; Mapa.oceano_mesh = oceano; }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Activamos el renderizado customizado. De esta forma el framework nos delega control total sobre como dibujar en pantalla //La responsabilidad cae toda de nuestro lado GuiController.Instance.CustomRenderEnabled = true; //Se crean 2 triangulos (o Quad) con las dimensiones de la pantalla con sus posiciones ya transformadas // x = -1 es el extremo izquiedo de la pantalla, x = 1 es el extremo derecho // Lo mismo para la Y con arriba y abajo // la Z en 1 simpre CustomVertex.PositionTextured[] screenQuadVertices = new CustomVertex.PositionTextured[] { new CustomVertex.PositionTextured( -1, 1, 1, 0,0), new CustomVertex.PositionTextured(1, 1, 1, 1,0), new CustomVertex.PositionTextured(-1, -1, 1, 0,1), new CustomVertex.PositionTextured(1,-1, 1, 1,1) }; //vertex buffer de los triangulos screenQuadVB = new VertexBuffer(typeof(CustomVertex.PositionTextured), 4, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default); screenQuadVB.SetData(screenQuadVertices, 0, LockFlags.None); //Creamos un Render Targer sobre el cual se va a dibujar la pantalla renderTarget2D = new Texture(d3dDevice, d3dDevice.PresentationParameters.BackBufferWidth , d3dDevice.PresentationParameters.BackBufferHeight, 1, Usage.RenderTarget, Format.X8R8G8B8, Pool.Default); //Cargar shader con efectos de Post-Procesado effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesMediaDir + "Shaders\\PostProcess.fx"); //Configurar Technique dentro del shader effect.Technique = "OscurecerTechnique"; //Interpolador para efecto de variar la intensidad de la textura de alarma intVaivenOscurecer = new InterpoladorVaiven(); intVaivenOscurecer.Min = 0; intVaivenOscurecer.Max = 1; intVaivenOscurecer.Speed = 0.4f; intVaivenOscurecer.reset(); //Cargamos un escenario TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); meshes = scene.Meshes; //Camara en primera personas GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.setCamera(new Vector3(-182.3816f, 82.3252f, -811.9061f), new Vector3(-182.0957f, 82.3147f, -810.9479f)); //Modifier para activar/desactivar efecto de oscurecer GuiController.Instance.Modifiers.addBoolean("activar_efecto", "Activar efecto", true); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Cargar escenario TgcSceneLoader loader = new TgcSceneLoader(); scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Deposito\\Deposito-TgcScene.xml"); //Camara en 1ra persona GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.MovementSpeed = 400f; GuiController.Instance.FpsCamera.JumpSpeed = 300f; GuiController.Instance.FpsCamera.setCamera(new Vector3(-210.0958f, 114.911f, -109.2159f), new Vector3(-209.559f, 114.8029f, -108.3791f)); //Cargar Shader personalizado de MultiDiffuseLights /* * Cargar Shader personalizado de MultiDiffuseLights * Este Shader solo soporta TgcMesh con RenderType DIFFUSE_MAP (que son las unicas utilizadas en este ejemplo) * El shader toma 4 luces a la vez para iluminar un mesh. * Pero como hacer 4 veces los calculos en el shader es costoso, de cada luz solo calcula el componente Diffuse. */ effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesMediaDir + "Shaders\\MultiDiffuseLights.fx"); //Crear 4 mesh para representar las 4 para la luces. Las ubicamos en distintas posiciones del escenario, cada una con un color distinto. lightMeshes = new TgcBox[4]; origLightPos = new Vector3[lightMeshes.Length]; Color[] c = new Color[4] { Color.Red, Color.Blue, Color.Green, Color.Yellow }; for (int i = 0; i < lightMeshes.Length; i++) { Color co = c[i % c.Length]; lightMeshes[i] = TgcBox.fromSize(new Vector3(10, 10, 10), co); origLightPos[i] = new Vector3(-40, 20 + i * 20, 400); } //Modifiers GuiController.Instance.Modifiers.addBoolean("lightEnable", "lightEnable", true); GuiController.Instance.Modifiers.addBoolean("lightMove", "lightMove", true); GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 150, 38); GuiController.Instance.Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.15f); GuiController.Instance.Modifiers.addColor("mEmissive", Color.Black); GuiController.Instance.Modifiers.addColor("mDiffuse", Color.White); //Interpolador para mover las luces de un lado para el otro interp = new InterpoladorVaiven(); interp.Min = -200f; interp.Max = 200f; interp.Speed = 100f; interp.Current = 0f; }
/// <summary> /// Metodo que carga los valores necesarios para inicializar el Oceano. /// </summary> public static void Cargar() { Device d3dDevice = GuiController.Instance.D3dDevice; // Creo la textura de reflexion surf_reflection = new Texture(d3dDevice, GuiController.Instance.Panel3d.Width, GuiController.Instance.Panel3d.Height, 1, Usage.RenderTarget, Format.A32B32G32R32F, Pool.Default); // Creo la textura de refraccion surf_refraction = new Texture(d3dDevice, GuiController.Instance.Panel3d.Width, GuiController.Instance.Panel3d.Height, 1, Usage.RenderTarget, Format.A32B32G32R32F, Pool.Default); // Cargo la textura de fresnel (relación entre los campos eléctricos transmitido y reflejado) "fresnel_water_sRGB.bmp" surf_fresnel = TextureLoader.FromFile(d3dDevice, GuiController.Instance.AlumnoEjemplosMediaDir + "Texturas\\fresnel_water_sRGB.bmp"); // Carga el shader del movimiento del oceano //PerlinShader = Utiles.CargarShaderConTechnique("perlin.fx"); Effect PerlinShader = TgcShaders.loadEffect(GuiController.Instance.ExamplesDir + "Shaders\\WorkshopShaders\\Shaders\\shader_agua.fx"); //Effect shader = ShaderUtils.loadEffect(Utiles.ShadersDir(Nombre)); PerlinShader.Technique = "RenderAgua"; // Cargar informacion de vertices: (X,Y,Z) + coord textura _vertices = new CustomVertex.PositionNormalTextured[CANTIDAD_DE_VERTICES]; int i = 0; for (int x = -RADIO; x <= RADIO; x++) { for (int z = -RADIO; z <= RADIO; z++) { _vertices[i++] = new CustomVertex.PositionNormalTextured( new Vector3(x * DISTANCIA_ENTRE_VERTICES,400, z * DISTANCIA_ENTRE_VERTICES), _normal, ((float)(x + RADIO) / ((float)LARGO - 1)), ((float)(z + RADIO) / ((float)LARGO - 1)) ); } }; // Creamos el VertexBuffer _vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured), CANTIDAD_DE_VERTICES, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default); // Almacenar información en VertexBuffer _vertexBuffer.SetData(_vertices, 0, LockFlags.None); //Creo el quadTree para este terreno QuadTree.Cargar(_pos.X, _pos.Z, TAMAÑO, GuiController.Instance.D3dDevice); // creo los indices para el IndexBuffer usando un array de int // Son por 3 vertices por triangulo y son 2 triangulos for (int z = 0; z < LARGO - 1; z++) for (int x = 0; x < LARGO - 1; x++) { var lista = new List<int>(); //Primer Triangulo lista.Add(x + z * LARGO); lista.Add(x + 1 + z * LARGO); lista.Add(x + LARGO + 1 + z * LARGO); //Segundo Triangulo lista.Add(x + LARGO + 1 + z * LARGO); lista.Add(x + LARGO + z * LARGO); lista.Add(x + z * LARGO); //Cargo los indices en los nodos del QuadTree QuadTree.AgregarIndices(lista); }; //LOD I for (int z = 0; z < LARGO - 1; z = z + 2) for (int x = 0; x < LARGO - 1; x = x + 2) { var lista = new List<int>(); //Primer Triangulo lista.Add(x + z * LARGO); lista.Add(x + 2 + z * LARGO); lista.Add(x + 2 * LARGO + 2 + z * LARGO); //Segundo Triangulo lista.Add(x + 2 * LARGO + 2 + z * LARGO); lista.Add(x + 2 * LARGO + z * LARGO); lista.Add(x + z * LARGO); //Cargo los indices en los nodos del QuadTree QuadTree.AgregarLODI(lista); }; //LOD II for (int z = 0; z < LARGO - 1; z = z + 4) for (int x = 0; x < LARGO - 1; x = x + 4) { var lista = new List<int>(); //Primer Triangulo lista.Add(x + z * LARGO); lista.Add(x + 4 + z * LARGO); lista.Add(x + 4 * LARGO + 4 + z * LARGO); //Segundo Triangulo lista.Add(x + 4 * LARGO + 4 + z * LARGO); lista.Add(x + 4 * LARGO + z * LARGO); lista.Add(x + z * LARGO); //Cargo los indices en los nodos del QuadTree QuadTree.AgregarLODII(lista); }; // Genera los heightmaps entre los que interpola la superficie, se generan para 2,4 y 8 octavas para poder usar // las diferentes configuraciones cambiando los Modifiers. // 2 ocatavas (ruido fuerte). // perlin 1 textPerlinNoise1_2Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 2, out PerlinNoise1_2Octavas); textPerlinNoise2_2Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 2, out PerlinNoise2_2Octavas); // 4 ocatavas (ruido normal). textPerlinNoise1_4Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 4, out PerlinNoise1_4Octavas); textPerlinNoise2_4Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 4, out PerlinNoise2_4Octavas); // 8 octavas (ruido suave). textPerlinNoise1_8Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 8, out PerlinNoise1_8Octavas); textPerlinNoise2_8Octavas = PerlinNoise.GetNuevoHeightmap(Oceano.LARGO, Oceano.LARGO, 8, out PerlinNoise2_8Octavas); // Carga los valores iniciales de la Matriz de Perlin Noise. PerlinNoise1 = PerlinNoise1_8Octavas; PerlinNoise2 = PerlinNoise2_8Octavas; // Carga los valores iniciales de la textura que se usara como Heightmap y Normalmap para la superficie del oceano. textPerlinNoise1 = textPerlinNoise1_8Octavas; textPerlinNoise2 = textPerlinNoise2_8Octavas; // Peso (alpha) para interpolar, usa el InterpoladorVaiven para ir alterandolo. interpoladorPerlinNoiseHeightmaps = new InterpoladorVaiven(); interpoladorPerlinNoiseHeightmaps.Min = 0; interpoladorPerlinNoiseHeightmaps.Max = 1; interpoladorPerlinNoiseHeightmaps.Speed = 0.5f; //guardar el stencil inicial //g_depthstencil = d3dDevice.DepthStencilSurface; }