Exemplo n.º 1
0
        public static void RemoveFromList(Ytyp[] ytypfiles, Ymap[] ymapfiles)
        {
            List <string> removelist = new List <string>();

            Console.WriteLine("Insert the file to load names from: (ex. list.txt)");
            string filename = Console.ReadLine();

            using (StreamReader reader = new StreamReader(filename))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    removelist.Add(line.Trim().ToLower());
                }
            }

            if (ytypfiles != null && ytypfiles.Length != 0)
            {
                for (int i = 0; i < ytypfiles.Length; i++)
                {
                    List <CBaseArchetypeDef> removed_archetypes = ytypfiles[i].RemoveArchetypesByNames(removelist);
                    ytypfiles[i].WriteXML().Save(ytypfiles[i].filename);
                    Console.WriteLine("Updated " + (ytypfiles[i].filename));

                    Ytyp removedytyp = ytypfiles[i];
                    removedytyp.CMapTypes.archetypes = removed_archetypes;

                    removedytyp.WriteXML().Save(ytypfiles[i].filename.Split('.')[0] + "_removed.ytyp.xml");
                    Console.WriteLine("Exported {0}_removed.ytyp.xml", ytypfiles[i].filename.Split('.')[0]);
                }
            }

            if (ymapfiles != null && ymapfiles.Length != 0)
            {
                for (int i = 0; i < ymapfiles.Length; i++)
                {
                    List <CEntityDef> removed_entities = ymapfiles[i].RemoveEntitiesByNames(removelist);
                    ymapfiles[i].WriteXML().Save(ymapfiles[i].filename);
                    Console.WriteLine("Updated " + (ymapfiles[i].filename));

                    Ymap removedymap = ymapfiles[i];
                    removedymap.CMapData.entities = removed_entities;

                    removedymap.WriteXML().Save(ymapfiles[i].filename.Split('.')[0] + "_removed.ymap.xml");
                    Console.WriteLine("Exported {0}_removed.ymap.xml", ymapfiles[i].filename.Split('.')[0]);
                }
            }
        }
Exemplo n.º 2
0
        //TEMP
        public static void GenerateMLO(string ytyppath, string ymappath)
        {
            Console.WriteLine("Insert the name for the MLO:");
            string mloname = Console.ReadLine();

            Ytyp theytyp = new Ytyp(XDocument.Load(ytyppath), mloname);
            Ymap theymap = new Ymap(XDocument.Load(ymappath), mloname);

            if (theytyp != null && theymap != null)
            {
                CMloInstanceDef  mloent = new CMloInstanceDef(mloname);
                CMloArchetypeDef mloarc = new CMloArchetypeDef(mloname);

                //COPY VALUES
                mloarc.entities      = theymap.CMapData.entities;
                mloarc.lodDist       = theytyp.CMapTypes.archetypes.Max(arc => arc.lodDist);
                mloarc.hdTextureDist = theytyp.CMapTypes.archetypes.Max(arc => arc.hdTextureDist);
                mloent.lodDist       = theymap.CMapData.entities.Max(ent => ent.lodDist);

                //GET CENTROID OF ENTITIES AND USE IT AS MLO POSITION
                foreach (CEntityDef ent in theymap.CMapData.entities)
                {
                    mloent.position += ent.position;
                }
                mloent.position = mloent.position / theymap.CMapData.entities.Count;

                //CHANGE COORDSYSTEM TO PARENT'S ONE
                foreach (CEntityDef ent in mloarc.entities)
                {
                    ent.position = ent.position - mloent.position;
                }

                //WEIRD WAY OF SAVING BECAUSE I'M ACTUALLY TOO BORED TO FIX ALL THE CODE TO SUPPORT MLO :DDDDDDDDDDD
                theytyp.CMapTypes.name = mloname;
                XDocument doc = theytyp.WriteXML();
                doc.Element("CMapTypes").Element("archetypes").Add(mloarc.WriteXML());
                doc.Save(mloname + ".ytyp.xml");
                Console.WriteLine(mloname + ".ytyp.xml");

                theymap.CMapData.name     = mloname;
                theymap.CMapData.entities = new List <CEntityDef>();
                doc = theymap.WriteXML();
                doc.Element("CMapData").Element("entities").Add(mloent.WriteXML());
                doc.Save(mloname + ".ymap.xml");
                Console.WriteLine(mloname + ".ymap.xml");
            }
        }
Exemplo n.º 3
0
        public static void BatchesFromParticles()
        {
            List <float[]> particlesInfo = new List <float[]>();

            Console.WriteLine("Insert the name of the file to load");
            string filepath = Console.ReadLine();

            float posXmax = float.MinValue;
            float posXmin = float.MaxValue;
            float posYmax = float.MinValue;
            float posYmin = float.MaxValue;
            float posZmax = float.MinValue;
            float posZmin = float.MaxValue;

            BinaryReader reader = new BinaryReader(File.OpenRead(filepath));

            while (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                float posx = reader.ReadSingle();
                float posy = reader.ReadSingle();
                float posz = reader.ReadSingle();
                float dirx = reader.ReadSingle();
                float diry = reader.ReadSingle();

                float[] pInfo = new float[5] {
                    posx, posy, posz, dirx, diry
                };

                //Console.WriteLine("POS: {0},{1},{2} DIR:{3},{4}", posx, posy, posz, dirx, diry);
                particlesInfo.Add(pInfo);

                posXmax = Math.Max(posXmax, posx);
                posXmin = Math.Min(posXmin, posx);
                posYmax = Math.Max(posYmax, posy);
                posYmin = Math.Min(posYmin, posy);
                posZmax = Math.Max(posZmax, posz);
                posZmin = Math.Min(posZmin, posz);
            }
            reader.Close();

            if (particlesInfo == null || !particlesInfo.Any())
            {
                return;
            }
            Random rnd = new Random();

            List <string> archetypes = new List <string>()
            {
                "proc_brittlebush_01", "proc_desert_sage_01", "proc_drygrasses01", "proc_drygrasses01b", "proc_drygrassfronds01", "proc_dryplantsgrass_01", "proc_dryplantsgrass_02", "proc_dry_plants_01", "proc_forest_grass01", "proc_forest_ivy_01", "proc_grassdandelion01", "proc_grasses01", "proc_grasses01b", "proc_grassfronds01", "proc_grassplantmix_01", "proc_grassplantmix_02", "proc_indian_pbrush_01", "proc_leafybush_01", "proc_leafyplant_01", "proc_lizardtail_01", "proc_lupins_01", "proc_meadowmix_01", "proc_meadowpoppy_01", "proc_sage_01", "proc_scrub_bush01", "proc_sml_reeds_01", "proc_sml_reeds_01b", "proc_sml_reeds_01c", "proc_stones_01", "proc_stones_02", "proc_stones_03", "proc_stones_04", "proc_stones_05", "proc_stones_06", "proc_wildquinine", "prop_dandy_b", "prop_dryweed_001_a", "prop_dryweed_002_a", "prop_fernba", "prop_fernbb", "prop_flowerweed_005_a", "prop_grass_001_a", "prop_grass_ca", "prop_grass_da", "prop_log_aa", "prop_log_ab", "prop_log_ac", "prop_log_ad", "prop_log_ae", "prop_log_af", "prop_saplin_001_b", "prop_saplin_001_c", "prop_saplin_002_b", "prop_saplin_002_c", "prop_small_bushyba", "prop_tall_drygrass_aa", "prop_tall_grass_ba", "prop_thindesertfiller_aa", "prop_weed_001_aa", "prop_weed_002_ba", "urbandryfrnds_01", "urbandrygrass_01", "urbangrnfrnds_01", "urbangrngrass_01", "urbanweeds01", "urbanweeds01_l1", "urbanweeds02", "urbanweeds02_l1"
            };
            string archetype = archetypes[rnd.Next(0, archetypes.Count() - 1)];

            Vector3 batchSize = new Vector3(100, 100, 75);
            Vector3 bbmax     = new Vector3(posXmax, posYmax, posZmax);
            Vector3 bbmin     = new Vector3(posXmin, posYmin, posZmin);

            Vector3 numblocks = (bbmax - bbmin) / batchSize;
            //Console.WriteLine("{0},{1},{2}",numblocks.X,numblocks.Y,numblocks.Z);
            int blockX = (int)(numblocks.X + 1);
            int blockY = (int)(numblocks.Y + 1);
            int blockZ = (int)(numblocks.Z + 1);

            Ymap map = new Ymap("instancedData");

            map.CMapData.contentFlags = 1088;
            map.CMapData.physicsDictionaries.Add("v_proc1");

            for (int x = -blockX; x <= blockX; x++)
            {
                for (int y = -blockY; y <= blockY; y++)
                {
                    for (int z = -blockZ; z <= blockZ; z++)
                    {
                        IEnumerable <float[]> currentBatch = Enumerable.Empty <float[]>();

                        float maxX = (x + 1) * batchSize.X;
                        float minX = x * batchSize.X;
                        float maxY = (y + 1) * batchSize.Y;
                        float minY = y * batchSize.Y;
                        float maxZ = (z + 1) * batchSize.Z;
                        float minZ = z * batchSize.Z;

                        ///Console.WriteLine("maxX:{0},minX{1},maxY{2},minY{3},maxZ{4},minZ{5}",maxX,minX,maxY,minY,maxZ,minZ);

                        currentBatch = particlesInfo.Where(a => a[0] < maxX && a[0] >= minX && a[1] < maxY && a[1] >= minY && a[2] < maxZ && a[2] >= minZ).ToList();
                        // Console.WriteLine(currentBatch.Count());

                        if (currentBatch?.Any() ?? false)
                        {
                            BatchAABB     aabb       = new BatchAABB(new Vector4(minX, minY, minZ, 0), new Vector4(maxX, maxY, maxZ, 0));
                            GrassInstance grassBatch = new GrassInstance(archetype);
                            grassBatch.BatchAABB = aabb;

                            foreach (float[] inst in currentBatch)
                            {
                                Vector4 worldPos = new Vector4(inst[0], inst[1], inst[2], 0);
                                Vector4 batchPos = (worldPos - aabb.min) / (aabb.max - aabb.min) * 65535;
                                byte    NormalX  = (byte)((inst[3] + 1) * 0.5 * 255);
                                byte    NormalY  = (byte)((inst[4] + 1) * 0.5 * 255);
                                byte[]  color    = new byte[3] {
                                    150, 150, 150
                                };
                                byte scale = (byte)rnd.Next(0, 255);;

                                Instance i = new Instance(new ushort[] { (ushort)batchPos.X, (ushort)batchPos.Y, (ushort)batchPos.Z }, NormalX, NormalY, color, scale);
                                grassBatch.InstanceList.Add(i);
                            }
                            map.CMapData.instancedData.GrassInstanceList.Add(grassBatch);
                        }
                    }
                }
            }
            map.UpdateExtents(new List <CBaseArchetypeDef>());
            Console.WriteLine("Total batches: {0}", map.CMapData.instancedData.GrassInstanceList.Count);
            Console.WriteLine("Total instances: {0}", particlesInfo.Count);
            map.WriteXML().Save("grass.ymap.xml");
            Console.WriteLine("Exported grass.ymap.xml");
        }