public void initTerrainAndClouds() { Microsoft.DirectX.Direct3D.Device d3dDevice = GuiController.Instance.D3dDevice; //Path de Heightmap high quality del terreno currentHeightmap_hq = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "Heightmap_hq.jpg"; //Path de Heightmap medium quality del terreno currentHeightmap_mq = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "Heightmap_mq.jpg"; //Path de Heightmap low quality del terreno currentHeightmap_lq = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "Heightmap_lq.jpg"; //Escala del mapa ScaleXZ_hq = 300f; ScaleXZ_mq = (ScaleXZ_hq * 2) + 0.7f; ScaleXZ_lq = (ScaleXZ_mq * 2) + 70f; currentScaleY = 5f; //Path de Textura default del terreno y Modifier para cambiarla // currentTexture = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "TerrainTexture.jpg"; current_sea_texture = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "sea.jpg"; current_sea_to_sand_texture = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "sea_to_sand.jpg"; current_sand_texture = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "sand.jpg"; current_sand_to_terrain_texture= GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "sand_to_terrain.jpg"; current_terrain_texture = GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "terrain.jpg"; //Cargo las texturas en una lista para poder inicializar los terrenos de forma mas sencilla texturas.Add(current_sea_texture); texturas.Add(current_sea_to_sand_texture); texturas.Add(current_sand_texture); texturas.Add(current_sand_to_terrain_texture); texturas.Add(current_terrain_texture); if (!terreno_inicializado) { GuiController.Instance.Modifiers.addTexture("texture", current_terrain_texture); } //Carga terrenos de alta,media y baja definicion: cargar heightmap y textura de color Bitmap bitmap_hq = (Bitmap)Bitmap.FromFile(currentHeightmap_hq); Bitmap bitmap_mq = (Bitmap)Bitmap.FromFile(currentHeightmap_mq); Bitmap bitmap_lq = (Bitmap)Bitmap.FromFile(currentHeightmap_lq); //Este es el ancho de referencia gral width = ((bitmap_hq.Size.Width * ScaleXZ_hq) - 650); //No se van a renderizar mas de 5 terrenos"hacia adelante". Se utiliza para hallar intersecciones con el plano //valor_grande = 5 * width; agregar_terrenos_en_lista_de_calidad(hq_terrains,currentHeightmap_hq,ScaleXZ_hq,currentScaleY); agregar_terrenos_en_lista_de_calidad(mq_terrains, currentHeightmap_mq, ScaleXZ_mq, currentScaleY); agregar_terrenos_en_lista_de_calidad(lq_terrains, currentHeightmap_lq, ScaleXZ_lq, currentScaleY); //Hay que llamar primero a initPlane para que esto funcione correctamente pos_original = cam.getPosition(); pos_original.Y = 0; //Seteo el primer valor random que se va a considerar como contador general.. avance_random = Convert.ToInt32(generador.Next(5)) + 10; //Generar lista de posiciones de centros de terreno inicial Vector3 nuevo_punto; float inner_width = width; posiciones_centros = new List<tipo_posicion_con_index_heightmap>(); posiciones_centros_iniciales = new List<tipo_posicion_con_index_heightmap>(); posiciones_centros_nubes = new List<Vector3>(); pos_original.X = pos_original.X - (width * 10); for (int i = 0; i < 20; i++) { nuevo_punto = new Vector3(); nuevo_punto = pos_original; tipo_posicion_con_index_heightmap nuevo_centro = new tipo_posicion_con_index_heightmap(); nuevo_centro.posicion_centro = nuevo_punto; nuevo_centro.cargar_index(width); posiciones_centros.Add(nuevo_centro); posiciones_centros_iniciales.Add(nuevo_centro); analisis_agregado_a_centros_nube(nuevo_punto); for (int j = 0; j < 20; j++) { nuevo_punto = new Vector3(); nuevo_punto = pos_original; nuevo_punto.Z = pos_original.Z + inner_width; nuevo_centro = new tipo_posicion_con_index_heightmap(); nuevo_centro.posicion_centro = nuevo_punto; nuevo_centro.cargar_index(width); posiciones_centros.Add(nuevo_centro); posiciones_centros_iniciales.Add(nuevo_centro); analisis_agregado_a_centros_nube(nuevo_punto); nuevo_punto = new Vector3(); nuevo_punto = pos_original; nuevo_punto.Z = pos_original.Z - inner_width; nuevo_centro = new tipo_posicion_con_index_heightmap(); nuevo_centro.posicion_centro = nuevo_punto; nuevo_centro.cargar_index(width); posiciones_centros.Add(nuevo_centro); posiciones_centros_iniciales.Add(nuevo_centro); analisis_agregado_a_centros_nube(nuevo_punto); inner_width = inner_width + width; } inner_width = width; pos_original.X = pos_original.X + width; } //foreach(tipo_posicion_con_index_heightmap posicion in posiciones_centros){ // posiciones_centros_iniciales.Add(posicion); //} terreno_inicializado = true; //Generar lista de posiciones de centros de nubes inicial posiciones_centros_nubes = new List<Vector3>(); for (int x = 0; x < posiciones_centros.Count; x = x + avance_random) { nuevo_punto = new Vector3(); nuevo_punto.X = posiciones_centros[x].posicion_centro.X; nuevo_punto.Y = posiciones_centros[x].posicion_centro.Y + generador.Next(45000) + 6000; nuevo_punto.Z = posiciones_centros[x].posicion_centro.Z; posiciones_centros_nubes.Add(nuevo_punto); avance_random = Convert.ToInt32(generador.Next(5)) + 70;//ERA 10--------------- } //Carga de la nube //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; //Cargar shader de zbuffer //effect = TgcShaders.loadEffect(GuiController.Instance.ExamplesMediaDir + "Shaders\\EjemploGetZBuffer.fx"); //Genero una instancia de loader TgcSceneLoader loader = new TgcSceneLoader(); //cargo la mesh de la nube nube = loader.loadSceneFromFile(GuiController.Instance.AlumnoEjemplosMediaDir + "Jet_Pilot\\" + "Heightmaps\\" + "nube-TgcScene.xml").Meshes[0]; ////Seteo efecto zbuffer a la nube //nube.Effect = effect; //Posicionamiento de la nube nube.Position = new Vector3(0, 0, 0); nube.Scale = new Vector3(7, 7, 7); //Seteo configuracion de la niebla GuiController.Instance.Fog.StartDistance = 1; GuiController.Instance.Fog.EndDistance = 1000; GuiController.Instance.Fog.Density = 1; GuiController.Instance.Fog.Color = Color.Gray; GuiController.Instance.Fog.updateValues(); }
private void generar_puntos_alrededor(Vector3 posicion) { //Se utilizaran las variables //posiciones_centros //width //posicion //Las posicioes se numeran teniendo en cuenta que la posicion enviada por parametro seria "la posicion 5", es decir la central, en una grilla de 3x3 //Tras generar nuevos puntos, se analiza si se deben agregar a la lista de centros de nubes a partir de un "randomizado".. List<Vector3> posiciones_a_analizar = new List<Vector3>(); Vector3 _1_, _2_, _3_, _4_, _6_, _7_, _8_, _9_; _1_ = new Vector3(); _2_ = new Vector3(); _3_ = new Vector3(); _4_ = new Vector3(); _6_ = new Vector3(); _7_ = new Vector3(); _8_ = new Vector3(); _9_ = new Vector3(); _1_.Z = posicion.Z - width; _1_.X = posicion.X + width; _1_.Y = posicion.Y; _2_.Z = posicion.Z; _2_.X = posicion.X + width; _2_.Y = posicion.Y; _3_.Z = posicion.Z + width; _3_.X = posicion.X + width; _3_.Y = posicion.Y; _4_.Z = posicion.Z - width; _4_.X = posicion.X; _4_.Y = posicion.Y; _6_.Z = posicion.Z + width; _6_.X = posicion.X; _6_.Y = posicion.Y; _7_.Z = posicion.Z - width; _7_.X = posicion.X - width; _7_.Y = posicion.Y; _8_.Z = posicion.Z; _8_.X = posicion.X - width; _8_.Y = posicion.Y; _9_.Z = posicion.Z + width; _9_.X = posicion.X - width; _9_.Y = posicion.Y; posiciones_a_analizar.Add(_1_); posiciones_a_analizar.Add(_2_); posiciones_a_analizar.Add(_3_); posiciones_a_analizar.Add(_4_); posiciones_a_analizar.Add(_6_); posiciones_a_analizar.Add(_7_); posiciones_a_analizar.Add(_8_); posiciones_a_analizar.Add(_9_); Boolean ya_existe_el_centro=false; foreach (Vector3 nueva_pos in posiciones_a_analizar) { foreach ( tipo_posicion_con_index_heightmap pos_centro in posiciones_centros) { if (pos_centro.posicion_centro == nueva_pos) { ya_existe_el_centro = true; break; } } if (!ya_existe_el_centro) { tipo_posicion_con_index_heightmap nuevo_centro = new tipo_posicion_con_index_heightmap(); nuevo_centro.posicion_centro = nueva_pos; nuevo_centro.cargar_index(width); posiciones_centros.Add(nuevo_centro); analisis_agregado_a_centros_nube(nueva_pos); } else { ya_existe_el_centro = false; } } }