Пример #1
0
        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();
        }
Пример #2
0
        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;
                }
            }
        }