Пример #1
0
        public int Deserialize()
        {
            // TODO: Handle dependencies
            // 2nd pass after this to resolve names etc?
            _ClassIndex = Data.ReadInt32();
            ClassName   = CurrentPCC.GetClassName(_ClassIndex);
            _SuperIndex = Data.ReadInt32();
            _OuterIndex = Data.ReadInt32();

            _ObjectNameRef = Data.ReadNameRef();
            ObjectName     = CurrentPCC.GetName(_ObjectNameRef);
            if (_ObjectNameRef.ModNumber > -1)
            {
                ObjectName += "_" + _ObjectNameRef.ModNumber; // TODO: correct?
            }
            _ArchetypeIndex = Data.ReadInt32();
            ObjectFlags     = (ObjectFlags)Data.ReadUInt64();

            Size        = Data.ReadUInt32();
            FileOffset  = Data.ReadUInt32();
            ExportFlags = (ExportFlags)Data.ReadUInt32();

            // TODO: save / figure these out!
            var netObjectCount = Data.ReadInt32(); // Skip netObjectCount

            Data.ReadRawData(netObjectCount * 4);  // Skip netObjects

            Data.ReadRawData(16);                  // Skip package GUID's
            Data.ReadRawData(4);                   // Skip package flags

            return((int)SizeInBytes + 4 * netObjectCount);
        }
Пример #2
0
 public MapExporter(MapLoader loader, string exportPath, ExportFlags flags)
 {
     this.loader     = loader;
     this.exportPath = exportPath;
     this.gameName   = Settings.s.mode.ToString();
     this.flags      = flags;
 }
Пример #3
0
        private void _WriteOneClassOrStruct(Type type, ExportFlags flags)
        {
            var classOrStruct = type.IsClass ? "class" : "struct";
            var sealedClass   = type.IsClass && EditorMetaCommon.IsFinalType(type) ? "sealed " : string.Empty;

            _writer.WriteLine("[Serializable]");
            _writer.WriteLine("{0}partial {1} {2} : {3}", sealedClass, classOrStruct, type.Name, typeof(ILoadable).Name);

            using (MacroScope.CreateEditorScope(_writer.BaseWriter))
            {
                _writer.WriteLine(", {0}", typeof(ISavable).Name);
            }

            using (CodeScope.CreateCSharpScope(_writer))
            {
                var nestedTypes = type.GetNestedTypes(BindingFlags.Instance | BindingFlags.Public);
                _WriteNestedTypes(nestedTypes, flags);

                var members = new List <MemberBase>();
                _CollectSerializableMembers(type, members);

                _WriteSaveMethod(type, members);
                _WriteLoadMethod(type, members);
                _WriteToStringMethod(type, members);
                _WriteGetMetadataTypeMethod(type);
            }
        }
Пример #4
0
        public void ExportAll(string dir, ExportFlags flags)
        {
            Console.WriteLine("Exporting to: " + dir);
            if (dir.Contains(" "))
            {
                Console.WriteLine("Warning, there are spaces in the path. This may affect material import.");
            }

            if (flags.HasFlag(ExportFlags.TexLow))
            {
                ExportTextures(Path.Combine(dir, "texLow"), Detail.Low);
            }
            if (flags.HasFlag(ExportFlags.MeshLow))
            {
                ExportMesh(dir, Detail.Low);
            }

            if (flags.HasFlag(ExportFlags.TexMed))
            {
                ExportTextures(Path.Combine(dir, "texMed"), Detail.Med);
            }
            if (flags.HasFlag(ExportFlags.MeshMed))
            {
                ExportMesh(dir, Detail.Med);
            }

            if (flags.HasFlag(ExportFlags.Models))
            {
                ExportModels(dir);
            }
            if (flags.HasFlag(ExportFlags.SkyBox))
            {
                ExportSkyBox(dir);
            }
        }
Пример #5
0
 // General SAV Properties
 public byte[] Write(ExportFlags flags = ExportFlags.None)
 {
     byte[] data = GetFinalData();
     if (Footer.Length > 0 && flags.HasFlagFast(ExportFlags.IncludeFooter))
     {
         return(data.Concat(Footer).ToArray());
     }
     if (Header.Length > 0 && flags.HasFlagFast(ExportFlags.IncludeHeader))
     {
         return(Header.Concat(data).ToArray());
     }
     return(data);
 }
Пример #6
0
        internal string GetCertComponentsAsPEMString(byte[] pfxData, string pwd, ExportFlags flags)
        {
            // See also https://www.digicert.com/ssl-support/pem-ssl-creation.htm

            var cert  = new X509Certificate2(pfxData, pwd);
            var chain = new X509Chain();

            chain.Build(cert);

            using (var writer = new StringWriter())
            {
                var certParser = new X509CertificateParser();
                var pemWriter  = new PemWriter(writer);

                //output in order of private key, primary cert, intermediates, root

                if (flags.HasFlag(ExportFlags.PrivateKey))
                {
                    var key = GetCertKeyPem(pfxData, pwd);
                    writer.Write(key);
                }

                var i = 0;
                foreach (var c in chain.ChainElements)
                {
                    if (i == 0 && flags.HasFlag(ExportFlags.EndEntityCertificate))
                    {
                        // first cert is end entity cert (primary certificate)
                        var o = c.Certificate.Export(X509ContentType.Cert);
                        pemWriter.WriteObject(certParser.ReadCertificate(o));
                    }
                    else if (i == chain.ChainElements.Count - 1 && flags.HasFlag(ExportFlags.RootCertificate))
                    {
                        // last cert is root ca public cert
                        var o = c.Certificate.Export(X509ContentType.Cert);
                        pemWriter.WriteObject(certParser.ReadCertificate(o));
                    }
                    else if (i != 0 && (i != chain.ChainElements.Count - 1) && flags.HasFlag(ExportFlags.IntermediateCertificates))
                    {
                        // intermediate cert(s), if any, not including end entity and root
                        var o = c.Certificate.Export(X509ContentType.Cert);
                        pemWriter.WriteObject(certParser.ReadCertificate(o));
                    }
                    i++;
                }

                writer.Flush();

                return(writer.ToString());
            }
        }
Пример #7
0
 public void ExportInfo(ExportFlags exportFlags, string exportPath)
 {
     if (exportFlags.IsActive(ExportFlags.CityList))
     {
         ExportCities(exportFlags, exportPath);
     }
     if (exportFlags.IsActive(ExportFlags.CountryList))
     {
         ExportCountries(exportFlags, exportPath);
     }
     if (exportFlags.IsActive(ExportFlags.OverlayList))
     {
         ExportOverlays(exportFlags, exportPath);
     }
 }
Пример #8
0
        /// <summary>
        /// Write the modified data to the savefile.
        /// </summary>
        /// <param name="path">Path where to save the savefile.</param>
        public void Save(string path)
        {
            string      ext   = Path.GetExtension(path).ToLower();
            ExportFlags flags = SAV.Metadata.GetSuggestedFlags(ext);

            try
            {
                File.WriteAllBytes(path, SAV.Write(flags));
                SAV.Metadata.SetExtraInfo(path);
                Console.WriteLine("Savefile was successfully written to " + path);
            }
            catch (Exception ex)
            {
                ShowError(ex.Message);
            }
        }
Пример #9
0
        private void _WriteNestedTypes(Type[] nestedTypes, ExportFlags flags)
        {
            if (nestedTypes.Length > 0)
            {
                //Array.Sort(nestedTypes, (a, b) => a.Name.CompareTo(b.Name));
                //foreach (var nestedType in nestedTypes)
                //{
                //    if (typeof(ILoadable).IsAssignableFrom(nestedType))
                //    {
                //        continue;
                //    }
                //
                //    _WriteOneClassOrStruct(nestedType, flags);
                //}

                Console.Error.WriteLine("Can not use nested type. nestedTypes = {0}", nestedTypes.ToString());
            }
        }
Пример #10
0
        /// <summary>
        /// Creates a json file with the positions and names (w/ localizations) of all countries
        /// </summary>
        public void ExportCountries(ExportFlags exportFlags, string path)
        {
            if (!Directory.Exists(path))
            {
                return;
            }
            var countriesJArr = new JArray();

            foreach (var country in _countriesLookup.Values)
            {
                var countryJObj = JObject.FromObject(country);
                if (exportFlags.IsActive(ExportFlags.CityLocalizedNames))
                {
                    countryJObj["LocalizedNames"] = JObject.FromObject(country.LocalizedNames);
                }
                countriesJArr.Add(countryJObj);
            }
            File.WriteAllText(Path.Combine(path, "Countries.json"), countriesJArr.ToString(Formatting.Indented));
        }
Пример #11
0
        private ExportFlags GetExportFlags()
        {
            ExportFlags exportFlags = 0;

            if (triStateTreeView1.GetCheckedByNodeName("GenTileMapInfo"))
            {
                exportFlags |= ExportFlags.TileMapInfo;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenCityList"))
            {
                exportFlags |= ExportFlags.CityList;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenCityDimensions"))
            {
                exportFlags |= ExportFlags.CityDimensions;                                                              // TODO: add
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenCityLocalizedNames"))
            {
                exportFlags |= ExportFlags.CityLocalizedNames;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenCountryList"))
            {
                exportFlags |= ExportFlags.CountryList;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenCountryLocalizedNames"))
            {
                exportFlags |= ExportFlags.CountryLocalizedNames;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenOverlayList"))
            {
                exportFlags |= ExportFlags.OverlayList;
            }
            if (triStateTreeView1.GetCheckedByNodeName("GenOverlayPNGs"))
            {
                exportFlags |= ExportFlags.OverlayPNGs;
            }

            return(exportFlags);
        }
Пример #12
0
        /// <summary>
        /// Creates a json file with the positions and names (w/ localizations) of all cities
        /// </summary>
        public void ExportCities(ExportFlags exportFlags, string path)
        {
            if (!Directory.Exists(path))
            {
                return;
            }
            var citiesJArr = new JArray();

            foreach (var city in Cities)
            {
                if (city.Hidden)
                {
                    continue;
                }
                var cityJObj = JObject.FromObject(city.City);
                cityJObj["X"] = city.X;
                cityJObj["Y"] = city.Z;
                if (_countriesLookup.ContainsKey(ScsHash.StringToToken(city.City.Country)))
                {
                    var country = _countriesLookup[ScsHash.StringToToken(city.City.Country)];
                    cityJObj["CountryId"] = country.CountryId;
                }
                else
                {
                    Log.Msg($"Could not find country for {city.City.Name}");
                }

                if (exportFlags.IsActive(ExportFlags.CityLocalizedNames))
                {
                    cityJObj["LocalizedNames"] = JObject.FromObject(city.City.LocalizedNames);
                }

                citiesJArr.Add(cityJObj);
            }
            File.WriteAllText(Path.Combine(path, "Cities.json"), citiesJArr.ToString(Formatting.Indented));
        }
Пример #13
0
        public void Export(string path, ExportFlags flags)
        {
            Console.WriteLine($"Exporting to: {path}");

            if (path.Contains(" "))
                Console.WriteLine("Warning, the selected path contains space in its name.\r\nThis may affect material import in certain applications.\r\n");

            if (flags.HasFlag(ExportFlags.MeshLow)) ExportMesh(path, Detail.Low);
            if (flags.HasFlag(ExportFlags.TexLow)) ExportTextures(path, Detail.Low);

            Console.WriteLine("Low mesh: done.");

            if (flags.HasFlag(ExportFlags.MeshMed)) ExportMesh(path, Detail.Med);
            if (flags.HasFlag(ExportFlags.TexMed)) ExportTextures(path, Detail.Med);

            Console.WriteLine("Mid mesh: done.");

            //not implemented, should return subdivided mesh. not sure if needed.
            //if (flags.HasFlag(ExportFlags.MeshHigh)) ExportMesh(path, Detail.High);
            if (flags.HasFlag(ExportFlags.TexHigh)) ExportTextures(path, Detail.High);

            Console.WriteLine("High mesh: done.");

            if (flags.HasFlag(ExportFlags.Models)) ExportModels(path);
            if (flags.HasFlag(ExportFlags.TexModels)) ExportTextures(path, Detail.Models);
            if (flags.HasFlag(ExportFlags.SkyBox)) ExportSkyBox(path);

            Console.WriteLine("Additional models: done.");

            /*
            foreach (QuadBlock qb in quads)
            {
                string x = ".\\textures\\" + qb.id.ToString("X8") + "\\";

                Helpers.CheckFolder(x);

                ctrvram.GetTexture(qb.texlow).Save(x + "low_" + qb.texlow.Tag() + ".png");

                foreach (CtrTex ct in qb.tex)
                {
                    foreach (TextureLayout tl in ct.midlods)
                    {
                        try
                        {
                            ctrvram.GetTexture(tl).Save(x + "med_" + tl.Tag() + ".png");
                        }
                        catch
                        {
                            File.WriteAllText(x + "error.txt", $"error med: quad - {qb.pos.ToString("X8")}, texlayout: {tl.Position.ToString("X8")}\r\n");
                        }
                    }

                    int i = 0;

                    foreach (TextureLayout tl in ct.hi)
                    {
                        try
                        {
                            ctrvram.GetTexture(tl).Save(x + "hi_" + i + "_" + tl.Tag() + ".png");
                        }
                        catch
                        {
                            File.WriteAllText(x + "error.txt", $"error med: quad - {qb.pos.ToString("X8")}, texlayout: {tl.Position.ToString("X8")}\r\n");
                        }

                        i++;
                    }
                }  
            }
            */
        }
Пример #14
0
        /// <summary>
        /// Saves all overlays as .png images.
        /// Creates a json file with all positions of said overlays
        /// </summary>
        /// <remarks>
        /// ZoomLevelVisibility flags: Multiple can be selected at the same time,
        /// eg. if value is 3 then 0 and 1 are both selected
        /// Selected = hidden (0-7 => numbers in game editor)
        /// 1 = (Nav map, 3D view, zoom 0) (0)
        /// 2 = (Nav map, 3D view, zoom 1) (1)
        /// 4 = (Nav map, 2D view, zoom 0) (2)
        /// 8 = (Nav map, 2D view, zoom 1) (3)
        /// 16 = (World map, zoom 0) (4)
        /// 32 = (World map, zoom 1) (5)
        /// 64 = (World map, zoom 2) (6)
        /// 128 = (World map, zoom 3) (7)
        /// </remarks>
        /// <param name="path"></param>
        public void ExportOverlays(ExportFlags exportFlags, string path)
        {
            if (!Directory.Exists(path))
            {
                return;
            }

            var saveAsPNG = exportFlags.IsActive(ExportFlags.OverlayPNGs);

            var overlayPath = Path.Combine(path, "Overlays");

            if (saveAsPNG)
            {
                Directory.CreateDirectory(overlayPath);
            }

            var overlaysJArr = new JArray();

            foreach (var overlay in MapOverlays)
            {
                if (overlay.Hidden)
                {
                    continue;
                }
                var overlayName = overlay.OverlayName;
                var b           = overlay.Overlay?.GetBitmap();
                if (b == null)
                {
                    continue;
                }
                var overlayJObj = new JObject
                {
                    ["X"] = overlay.X,
                    ["Y"] = overlay.Z,
                    ["ZoomLevelVisibility"] = overlay.ZoomLevelVisibility,
                    ["Name"]   = overlayName,
                    ["Type"]   = "Overlay",
                    ["Width"]  = b.Width,
                    ["Height"] = b.Height,
                };
                overlaysJArr.Add(overlayJObj);
                if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                {
                    b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                }
            }
            foreach (var company in Companies)
            {
                if (company.Hidden)
                {
                    continue;
                }
                var overlayName = ScsHash.TokenToString(company.OverlayToken);
                var point       = new PointF(company.X, company.Z);
                if (company.Nodes.Count > 0)
                {
                    var prefab = Prefabs.FirstOrDefault(x => x.Uid == company.Nodes[0]);
                    if (prefab != null)
                    {
                        var originNode = GetNodeByUid(prefab.Nodes[0]);
                        if (prefab.Prefab.PrefabNodes == null)
                        {
                            continue;
                        }
                        var mapPointOrigin = prefab.Prefab.PrefabNodes[prefab.Origin];

                        var rot = (float)(originNode.Rotation - Math.PI -
                                          Math.Atan2(mapPointOrigin.RotZ, mapPointOrigin.RotX) + Math.PI / 2);

                        var prefabstartX = originNode.X - mapPointOrigin.X;
                        var prefabStartZ = originNode.Z - mapPointOrigin.Z;
                        var companyPos   = prefab.Prefab.SpawnPoints.FirstOrDefault(x => x.Type == TsSpawnPointType.CompanyPos);
                        if (companyPos != null)
                        {
                            point = RenderHelper.RotatePoint(prefabstartX + companyPos.X, prefabStartZ + companyPos.Z,
                                                             rot,
                                                             originNode.X, originNode.Z);
                        }
                    }
                }
                var b = company.Overlay?.GetBitmap();
                if (b == null)
                {
                    continue;
                }
                var overlayJObj = new JObject
                {
                    ["X"]      = point.X,
                    ["Y"]      = point.Y,
                    ["Name"]   = overlayName,
                    ["Type"]   = "Company",
                    ["Width"]  = b.Width,
                    ["Height"] = b.Height,
                };
                overlaysJArr.Add(overlayJObj);
                if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                {
                    b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                }
            }
            foreach (var trigger in Triggers)
            {
                if (trigger.Hidden)
                {
                    continue;
                }
                var overlayName = trigger.OverlayName;
                var b           = trigger.Overlay?.GetBitmap();
                if (b == null)
                {
                    continue;
                }
                var overlayJObj = new JObject
                {
                    ["X"]      = trigger.X,
                    ["Y"]      = trigger.Z,
                    ["Name"]   = overlayName,
                    ["Type"]   = "Parking",
                    ["Width"]  = b.Width,
                    ["Height"] = b.Height,
                };
                overlaysJArr.Add(overlayJObj);
                if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                {
                    b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                }
            }
            foreach (var ferry in FerryConnections)
            {
                if (ferry.Hidden)
                {
                    continue;
                }
                var overlayName = ScsHash.TokenToString(ferry.OverlayToken);
                var b           = ferry.Overlay?.GetBitmap();
                if (b == null)
                {
                    continue;
                }
                var overlayJObj = new JObject
                {
                    ["X"]      = ferry.X,
                    ["Y"]      = ferry.Z,
                    ["Name"]   = overlayName,
                    ["Type"]   = (ferry.Train) ? "Train" : "Ferry",
                    ["Width"]  = b.Width,
                    ["Height"] = b.Height,
                };
                overlaysJArr.Add(overlayJObj);
                if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                {
                    b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                }
            }

            foreach (var prefab in Prefabs)
            {
                if (prefab.Hidden)
                {
                    continue;
                }
                var originNode = GetNodeByUid(prefab.Nodes[0]);
                if (prefab.Prefab.PrefabNodes == null)
                {
                    continue;
                }
                var mapPointOrigin = prefab.Prefab.PrefabNodes[prefab.Origin];

                var rot = (float)(originNode.Rotation - Math.PI -
                                  Math.Atan2(mapPointOrigin.RotZ, mapPointOrigin.RotX) + Math.PI / 2);

                var prefabStartX = originNode.X - mapPointOrigin.X;
                var prefabStartZ = originNode.Z - mapPointOrigin.Z;
                foreach (var spawnPoint in prefab.Prefab.SpawnPoints)
                {
                    var newPoint = RenderHelper.RotatePoint(prefabStartX + spawnPoint.X, prefabStartZ + spawnPoint.Z, rot,
                                                            originNode.X, originNode.Z);

                    var overlayJObj = new JObject
                    {
                        ["X"] = newPoint.X,
                        ["Y"] = newPoint.Y,
                    };

                    string overlayName;

                    switch (spawnPoint.Type)
                    {
                    case TsSpawnPointType.GasPos:
                    {
                        overlayName         = "gas_ico";
                        overlayJObj["Type"] = "Fuel";
                        break;
                    }

                    case TsSpawnPointType.ServicePos:
                    {
                        overlayName         = "service_ico";
                        overlayJObj["Type"] = "Service";
                        break;
                    }

                    case TsSpawnPointType.WeightStationPos:
                    {
                        overlayName         = "weigh_station_ico";
                        overlayJObj["Type"] = "WeightStation";
                        break;
                    }

                    case TsSpawnPointType.TruckDealerPos:
                    {
                        overlayName         = "dealer_ico";
                        overlayJObj["Type"] = "TruckDealer";
                        break;
                    }

                    case TsSpawnPointType.BuyPos:
                    {
                        overlayName         = "garage_large_ico";
                        overlayJObj["Type"] = "Garage";
                        break;
                    }

                    case TsSpawnPointType.RecruitmentPos:
                    {
                        overlayName         = "recruitment_ico";
                        overlayJObj["Type"] = "Recruitment";
                        break;
                    }

                    default:
                        continue;
                    }

                    overlayJObj["Name"] = overlayName;
                    var overlay = LookupOverlay(ScsHash.StringToToken(overlayName));
                    var b       = overlay.GetBitmap();
                    if (b == null)
                    {
                        continue;
                    }
                    overlayJObj["Width"]  = b.Width;
                    overlayJObj["Height"] = b.Height;
                    overlaysJArr.Add(overlayJObj);
                    if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                    {
                        b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                    }
                }

                var lastId = -1;
                foreach (var triggerPoint in prefab.Prefab.TriggerPoints)
                {
                    var newPoint = RenderHelper.RotatePoint(prefabStartX + triggerPoint.X, prefabStartZ + triggerPoint.Z, rot,
                                                            originNode.X, originNode.Z);

                    if (triggerPoint.TriggerId == lastId)
                    {
                        continue;
                    }
                    lastId = (int)triggerPoint.TriggerId;
                    var overlayJObj = new JObject
                    {
                        ["X"]    = newPoint.X,
                        ["Y"]    = newPoint.Y,
                        ["Name"] = "parking_ico",
                        ["Type"] = "Parking",
                    };

                    if (triggerPoint.TriggerActionToken != ScsHash.StringToToken("hud_parking"))
                    {
                        continue;
                    }

                    const string overlayName = "parking_ico";
                    var          overlay     = LookupOverlay(ScsHash.StringToToken(overlayName));
                    var          b           = overlay.GetBitmap();
                    if (b == null)
                    {
                        continue;
                    }
                    overlayJObj["Width"]  = b.Width;
                    overlayJObj["Height"] = b.Height;
                    overlaysJArr.Add(overlayJObj);
                    if (saveAsPNG && !File.Exists(Path.Combine(overlayPath, $"{overlayName}.png")))
                    {
                        b.Save(Path.Combine(overlayPath, $"{overlayName}.png"));
                    }
                }
            }
            File.WriteAllText(Path.Combine(path, "Overlays.json"), overlaysJArr.ToString(Formatting.Indented));
        }
Пример #15
0
 public ExportAttribute(ExportFlags flags)
 {
     _flags = flags;
 }
Пример #16
0
 public static bool IsActive(this ExportFlags self, ExportFlags value)
 {
     return((self & value) == value);
 }
Пример #17
0
        /// <summary>
        /// Get PEM encoded cert bytes (intermediates only or full chain) from PFX bytes
        /// </summary>
        /// <param name="pfxData"></param>
        /// <param name="pwd">private key password</param>
        /// <param name="flags">Flags for component types to export</param>
        /// <returns></returns>
        internal byte[] GetCertComponentsAsPEMBytes(byte[] pfxData, string pwd, ExportFlags flags)
        {
            var pem = GetCertComponentsAsPEMString(pfxData, pwd, flags);

            return(System.Text.Encoding.ASCII.GetBytes(pem));
        }
Пример #18
0
        public void Export(string path, ExportFlags flags)
        {
            Console.WriteLine($"Exporting to: {path}");

            if (path.Contains(" "))
            {
                Console.WriteLine("Warning, there are spaces in the path. This may affect material import.");
            }

            if (flags.HasFlag(ExportFlags.MeshLow))
            {
                ExportMesh(path, Detail.Low);
            }
            if (flags.HasFlag(ExportFlags.TexLow))
            {
                ExportTextures(Path.Combine(path, "texLow"), Detail.Low);
            }

            Console.WriteLine("Low mesh: done.");

            if (flags.HasFlag(ExportFlags.MeshMed))
            {
                ExportMesh(path, Detail.Med);
            }
            if (flags.HasFlag(ExportFlags.TexMed))
            {
                ExportTextures(Path.Combine(path, "texMed"), Detail.Med);
            }

            Console.WriteLine("Mid mesh: done.");

            //not implemented, should return subdivided mesh
            //if (flags.HasFlag(ExportFlags.MeshMed)) ExportMesh(dir, Detail.High);
            if (flags.HasFlag(ExportFlags.TexHigh))
            {
                ExportTextures(Path.Combine(path, "texHigh"), Detail.High);
            }

            Console.WriteLine("High mesh: done.");

            if (flags.HasFlag(ExportFlags.Models))
            {
                ExportModels(path);
            }
            if (flags.HasFlag(ExportFlags.SkyBox))
            {
                ExportSkyBox(path);
            }

            Console.WriteLine("Additional models: done.");

            /*
             * foreach (QuadBlock qb in quads)
             * {
             *  string x = ".\\textures\\" + qb.id.ToString("X8") + "\\";
             *
             *  Helpers.CheckFolder(x);
             *
             *  ctrvram.GetTexture(qb.texlow).Save(x + "low_" + qb.texlow.Tag() + ".png");
             *
             *  foreach (CtrTex ct in qb.tex)
             *  {
             *      foreach (TextureLayout tl in ct.midlods)
             *      {
             *          try
             *          {
             *              ctrvram.GetTexture(tl).Save(x + "med_" + tl.Tag() + ".png");
             *          }
             *          catch
             *          {
             *              File.WriteAllText(x + "error.txt", $"error med: quad - {qb.pos.ToString("X8")}, texlayout: {tl.Position.ToString("X8")}\r\n");
             *          }
             *      }
             *
             *      int i = 0;
             *
             *      foreach (TextureLayout tl in ct.hi)
             *      {
             *          try
             *          {
             *              ctrvram.GetTexture(tl).Save(x + "hi_" + i + "_" + tl.Tag() + ".png");
             *          }
             *          catch
             *          {
             *              File.WriteAllText(x + "error.txt", $"error med: quad - {qb.pos.ToString("X8")}, texlayout: {tl.Position.ToString("X8")}\r\n");
             *          }
             *
             *          i++;
             *      }
             *  }
             * }
             */
        }
Пример #19
0
        public int Deserialize()
        {
            // TODO: Handle dependencies
            // 2nd pass after this to resolve names etc?
            _ClassIndex = Data.ReadInt32();
            ClassName = CurrentPCC.GetClassName(_ClassIndex);
            _SuperIndex = Data.ReadInt32();
            _OuterIndex = Data.ReadInt32();

            _ObjectNameRef = Data.ReadNameRef();
            ObjectName = CurrentPCC.GetName(_ObjectNameRef);
            if (_ObjectNameRef.ModNumber > -1)
                ObjectName += "_" + _ObjectNameRef.ModNumber; // TODO: correct?
            _ArchetypeIndex = Data.ReadInt32();
            ObjectFlags = (ObjectFlags)Data.ReadUInt64();

            Size = Data.ReadUInt32();
            FileOffset = Data.ReadUInt32();
            ExportFlags = (ExportFlags)Data.ReadUInt32();

            // TODO: save / figure these out!
            var netObjectCount = Data.ReadInt32(); // Skip netObjectCount
            Data.ReadRawData(netObjectCount * 4); // Skip netObjects

            Data.ReadRawData(16); // Skip package GUID's
            Data.ReadRawData(4); // Skip package flags

            return (int)SizeInBytes + 4 * netObjectCount;
        }
Пример #20
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ExportDescription"/> struct.
 /// </summary>
 /// <param name="name">
 /// The name to be exported. If the name refers to a function that is overloaded, a modified version of the name (e.g. encoding function parameter information in name string) can be provided to disambiguate which overload to use. The modified name for a function can be retrieved using HLSL compiler reflection.
 /// If the ExportToRename field is non-null, Name refers to the new name to use for it when exported. In this case Name must be the unmodified name, whereas ExportToRename can be either a modified or unmodified name. A given internal name may be exported multiple times with different renames (and/or not renamed).
 /// </param>
 /// <param name="exportToRename">If non-null, this is the name of an export to use but then rename when exported.</param>
 /// <param name="flags">The flags to apply to the export.</param>
 public ExportDescription(string name, string?exportToRename = null, ExportFlags flags = ExportFlags.None)
 {
     Name           = name;
     ExportToRename = exportToRename;
     Flags          = flags;
 }
Пример #21
0
 // General SAV Properties
 public byte[] Write(ExportFlags flags = ExportFlags.None)
 {
     byte[] data = GetFinalData();
     return(Metadata.Finalize(data, flags));
 }
Пример #22
0
        public bool ExportImage(string wimFile, int imageIndex, string outputWIMFile, CompressionType compressionType = CompressionType.LZX, ExportFlags exportFlags = ExportFlags.DEFAULT, ProgressCallback progressCallback = null)
        {
            string title = $"Exporting {wimFile.Split('\\').Last()} - Index {imageIndex}";

            try
            {
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.WRITE_STREAMS:
                    {
                        ProgressInfo_WriteStreams m = (ProgressInfo_WriteStreams)info;
                        progressCallback?.Invoke(title, (int)Math.Round((double)m.CompletedBytes / m.TotalBytes * 100), false);
                    }
                    break;

                    case ProgressMsg.WRITE_METADATA_BEGIN:
                        break;

                    case ProgressMsg.WRITE_METADATA_END:
                        break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                using (Wim srcWim = Wim.OpenWim(wimFile, OpenFlags.DEFAULT))
                {
                    string imageName = srcWim.GetImageName(imageIndex);

                    using (Wim destWim = Wim.CreateNewWim((ManagedWimLib.CompressionType)compressionType))
                    {
                        destWim.RegisterCallback(ProgressCallback);
                        srcWim.ExportImage(imageIndex, destWim, imageName, null, (ManagedWimLib.ExportFlags)exportFlags);
                        destWim.Write(outputWIMFile, Wim.AllImages, WriteFlags.DEFAULT, Wim.DefaultThreads);
                    }
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }
Пример #23
0
        public void ExportImage(int srcImage, Wim destWim, string destName, string destDescription, ExportFlags exportFlags)
        {
            ErrorCode ret = NativeMethods.ExportImage(_ptr, srcImage, destWim._ptr, destName, destDescription, exportFlags);

            WimLibException.CheckWimLibError(ret);
        }
Пример #24
0
 public static bool HasFlagFast(this ExportFlags value, ExportFlags flag) => (value & flag) != 0;