From a257f4fbdeab84bd667c0f65cae95142c7974a47 Mon Sep 17 00:00:00 2001 From: AsvalGTA Date: Wed, 17 Apr 2019 18:59:28 +0200 Subject: [PATCH] added universal challenges watermark + crash fix --- FModel/FModel.csproj | 3 +- FModel/MainWindow.cs | 42 ++- FModel/Parser/Meshes/MeshesParser.cs | 541 +++++++++++++++++++++++++++ 3 files changed, 569 insertions(+), 17 deletions(-) create mode 100644 FModel/Parser/Meshes/MeshesParser.cs diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index c9c2d4ef..f88bbc7e 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -5,7 +5,7 @@ Debug AnyCPU {8FABCD3A-9D55-4B54-B237-B259D815DEB8} - WinExe + Exe FModel FModel v4.7.1 @@ -91,6 +91,7 @@ + diff --git a/FModel/MainWindow.cs b/FModel/MainWindow.cs index 25e885c9..525c2c4f 100644 --- a/FModel/MainWindow.cs +++ b/FModel/MainWindow.cs @@ -75,6 +75,7 @@ namespace FModel { InitializeComponent(); + treeView1.Sort(); //REMOVE SPACE CAUSED BY SIZING GRIP statusStrip1.Padding = new Padding(statusStrip1.Padding.Left, statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom); @@ -1215,22 +1216,29 @@ namespace FModel updateConsole("Parsing " + currentUsedItem + "...", Color.FromArgb(255, 244, 132, 66), "Waiting"); for (int i = 0; i < ItemID.Length; i++) { - if (Properties.Settings.Default.createIconForCosmetics == true && (ItemID[i].ExportType.Contains("Athena") && ItemID[i].ExportType.Contains("Item") && ItemID[i].ExportType.Contains("Definition"))) - createItemIcon(ItemID[i], true); - else if (Properties.Settings.Default.createIconForConsumablesWeapons == true && (ItemID[i].ExportType.Contains("FortWeaponRangedItemDefinition") || ItemID[i].ExportType.Contains("FortWeaponMeleeItemDefinition"))) - createItemIcon(ItemID[i], false, true); - else if(Properties.Settings.Default.createIconForTraps == true && (ItemID[i].ExportType.Contains("FortTrapItemDefinition") || ItemID[i].ExportType.Contains("FortContextTrapItemDefinition"))) - createItemIcon(ItemID[i]); - else if(Properties.Settings.Default.createIconForVariants == true && (ItemID[i].ExportType == "FortVariantTokenType")) - createItemIcon(ItemID[i], false, false, true); - else if(ItemID[i].ExportType == "FortChallengeBundleItemDefinition") - createChallengesIcon(ItemID[i], theParsedJSON, questJSON); - else if(ItemID[i].ExportType == "Texture2D") - convertTexture2D(); - else if(ItemID[i].ExportType == "SoundWave") - convertSoundWave(); - else - updateConsole(currentUsedItem + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); + try + { + if (Properties.Settings.Default.createIconForCosmetics == true && (ItemID[i].ExportType.Contains("Athena") && ItemID[i].ExportType.Contains("Item") && ItemID[i].ExportType.Contains("Definition"))) + createItemIcon(ItemID[i], true); + else if (Properties.Settings.Default.createIconForConsumablesWeapons == true && (ItemID[i].ExportType.Contains("FortWeaponRangedItemDefinition") || ItemID[i].ExportType.Contains("FortWeaponMeleeItemDefinition"))) + createItemIcon(ItemID[i], false, true); + else if (Properties.Settings.Default.createIconForTraps == true && (ItemID[i].ExportType.Contains("FortTrapItemDefinition") || ItemID[i].ExportType.Contains("FortContextTrapItemDefinition"))) + createItemIcon(ItemID[i]); + else if (Properties.Settings.Default.createIconForVariants == true && (ItemID[i].ExportType == "FortVariantTokenType")) + createItemIcon(ItemID[i], false, false, true); + else if (ItemID[i].ExportType == "FortChallengeBundleItemDefinition") + createChallengesIcon(ItemID[i], theParsedJSON, questJSON); + else if (ItemID[i].ExportType == "Texture2D") + convertTexture2D(); + else if (ItemID[i].ExportType == "SoundWave") + convertSoundWave(); + else + updateConsole(currentUsedItem + " successfully extracted", Color.FromArgb(255, 66, 244, 66), "Success"); + } + catch(Exception ex) + { + Console.WriteLine(ex.Message); + } } } private void createItemIcon(Parser.Items.ItemsIDParser theItem, bool athIteDef = false, bool consAndWeap = false, bool variant = false) @@ -2067,6 +2075,8 @@ namespace FModel AppendText("DisplayName ", Color.SteelBlue); AppendText("found", Color.Black, true); } //NAME + g.FillRectangle(new SolidBrush(Color.FromArgb(100, 0, 0, 0)), new Rectangle(0, iamY + 240, bmp.Width, 40)); + g.DrawString(theItem.DisplayName + " Generated using FModel & JohnWickParser - " + DateTime.Now, new Font(pfc.Families[0], 20), new SolidBrush(Color.FromArgb(150, 255, 255, 255)), new Point(bmp.Width / 2, iamY + 250), centeredString); using (Bitmap bmp2 = bmp) { var newImg = bmp2.Clone( diff --git a/FModel/Parser/Meshes/MeshesParser.cs b/FModel/Parser/Meshes/MeshesParser.cs new file mode 100644 index 00000000..867b4294 --- /dev/null +++ b/FModel/Parser/Meshes/MeshesParser.cs @@ -0,0 +1,541 @@ +// +// +// To parse this JSON data, add NuGet 'Newtonsoft.Json' then do: +// +// using FModel.Parser.Meshes; +// +// var meshesParser = MeshesParser.FromJson(jsonString); + +namespace FModel.Parser.Meshes +{ + using System; + using System.Collections.Generic; + + using System.Globalization; + using Newtonsoft.Json; + using Newtonsoft.Json.Converters; + + public partial class MeshesParser + { + [JsonProperty("super_object")] + public SuperObject SuperObject { get; set; } + + [JsonProperty("imported_bounds")] + public ImportedBounds ImportedBounds { get; set; } + + [JsonProperty("materials")] + public Material[] Materials { get; set; } + + [JsonProperty("ref_skeleton")] + public RefSkeleton RefSkeleton { get; set; } + + [JsonProperty("lod_models")] + public LodModel[] LodModels { get; set; } + } + + public partial class ImportedBounds + { + [JsonProperty("origin")] + public BoxExtend Origin { get; set; } + + [JsonProperty("box_extend")] + public BoxExtend BoxExtend { get; set; } + + [JsonProperty("sphere_radius")] + public double SphereRadius { get; set; } + } + + public partial class BoxExtend + { + [JsonProperty("x")] + public double X { get; set; } + + [JsonProperty("y")] + public double Y { get; set; } + + [JsonProperty("z")] + public double Z { get; set; } + + [JsonProperty("w", NullValueHandling = NullValueHandling.Ignore)] + public double? W { get; set; } + } + + public partial class LodModel + { + [JsonProperty("sections")] + public Section[] Sections { get; set; } + + [JsonProperty("indices")] + public Indices Indices { get; set; } + + [JsonProperty("active_bone_indices")] + public long[] ActiveBoneIndices { get; set; } + + [JsonProperty("required_bones")] + public long[] RequiredBones { get; set; } + + [JsonProperty("position_vertex_buffer")] + public PositionVertexBuffer PositionVertexBuffer { get; set; } + + [JsonProperty("static_mesh_vertex_buffer")] + public StaticMeshVertexBuffer StaticMeshVertexBuffer { get; set; } + + [JsonProperty("skin_weight_vertex_buffer")] + public SkinWeightVertexBuffer SkinWeightVertexBuffer { get; set; } + + [JsonProperty("colour_vertex_buffer")] + public object ColourVertexBuffer { get; set; } + } + + public partial class Indices + { + [JsonProperty("Indices16")] + public long[] Indices16 { get; set; } + } + + public partial class PositionVertexBuffer + { + [JsonProperty("verts")] + public BoxExtend[] Verts { get; set; } + + [JsonProperty("stride")] + public long Stride { get; set; } + + [JsonProperty("num_verts")] + public long NumVerts { get; set; } + } + + public partial class Section + { + [JsonProperty("material_index")] + public long MaterialIndex { get; set; } + + [JsonProperty("base_index")] + public long BaseIndex { get; set; } + + [JsonProperty("num_triangles")] + public long NumTriangles { get; set; } + + [JsonProperty("base_vertex_index")] + public long BaseVertexIndex { get; set; } + + [JsonProperty("cloth_mapping_data")] + public object[] ClothMappingData { get; set; } + + [JsonProperty("bone_map")] + public long[] BoneMap { get; set; } + + [JsonProperty("num_vertices")] + public long NumVertices { get; set; } + + [JsonProperty("max_bone_influences")] + public long MaxBoneInfluences { get; set; } + + [JsonProperty("clothing_data")] + public ClothingData ClothingData { get; set; } + + [JsonProperty("disabled")] + public bool Disabled { get; set; } + } + + public partial class ClothingData + { + [JsonProperty("asset_guid")] + public string AssetGuid { get; set; } + + [JsonProperty("asset_lod_index")] + public long AssetLodIndex { get; set; } + } + + public partial class SkinWeightVertexBuffer + { + [JsonProperty("weights")] + public Weight[] Weights { get; set; } + + [JsonProperty("num_vertices")] + public long NumVertices { get; set; } + } + + public partial class Weight + { + [JsonProperty("bone_index")] + public long[] BoneIndex { get; set; } + + [JsonProperty("bone_weight")] + public long[] BoneWeight { get; set; } + } + + public partial class StaticMeshVertexBuffer + { + [JsonProperty("num_tex_coords")] + public long NumTexCoords { get; set; } + + [JsonProperty("num_vertices")] + public long NumVertices { get; set; } + + [JsonProperty("tangents")] + public Tangents Tangents { get; set; } + + [JsonProperty("uvs")] + public Uvs Uvs { get; set; } + } + + public partial class Tangents + { + [JsonProperty("Low")] + public TangentsLow[] Low { get; set; } + } + + public partial class TangentsLow + { + [JsonProperty("normal")] + public BoxExtend Normal { get; set; } + + [JsonProperty("tangent")] + public BoxExtend Tangent { get; set; } + } + + public partial class Uvs + { + [JsonProperty("Low")] + public UvsLow[] Low { get; set; } + } + + public partial class UvsLow + { + [JsonProperty("value")] + public Value Value { get; set; } + } + + public partial class Value + { + [JsonProperty("x")] + public long X { get; set; } + + [JsonProperty("y")] + public long Y { get; set; } + } + + public partial class Material + { + [JsonProperty("material_interface")] + public string MaterialInterface { get; set; } + + [JsonProperty("material_slot_name")] + public string MaterialSlotName { get; set; } + + [JsonProperty("uv_channel_data")] + public UvChannelData UvChannelData { get; set; } + } + + public partial class UvChannelData + { + [JsonProperty("initialised")] + public bool Initialised { get; set; } + + [JsonProperty("override_densities")] + public bool OverrideDensities { get; set; } + + [JsonProperty("local_uv_densities")] + public double[] LocalUvDensities { get; set; } + } + + public partial class RefSkeleton + { + [JsonProperty("ref_bone_info")] + public RefBoneInfo[] RefBoneInfo { get; set; } + + [JsonProperty("ref_bone_pose")] + public RefBonePose[] RefBonePose { get; set; } + + [JsonProperty("name_to_index")] + public NameToIndex[][] NameToIndex { get; set; } + } + + public partial class RefBoneInfo + { + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("parent_index")] + public long ParentIndex { get; set; } + } + + public partial class RefBonePose + { + [JsonProperty("rotation")] + public BoxExtend Rotation { get; set; } + + [JsonProperty("translation")] + public BoxExtend Translation { get; set; } + + [JsonProperty("scale_3d")] + public BoxExtend Scale3D { get; set; } + } + + public partial class SuperObject + { + [JsonProperty("export_type")] + public string ExportType { get; set; } + + [JsonProperty("Skeleton")] + public string Skeleton { get; set; } + + [JsonProperty("LODInfo")] + public LodInfo[] LodInfo { get; set; } + + [JsonProperty("MinLod")] + public MinLod MinLod { get; set; } + + [JsonProperty("bHasBeenSimplified")] + public bool BHasBeenSimplified { get; set; } + + [JsonProperty("SamplingInfo")] + public SamplingInfo SamplingInfo { get; set; } + } + + public partial class LodInfo + { + [JsonProperty("ScreenSize")] + public MinLod ScreenSize { get; set; } + + [JsonProperty("LODHysteresis")] + public double LodHysteresis { get; set; } + + [JsonProperty("LODMaterialMap")] + public object[] LodMaterialMap { get; set; } + + [JsonProperty("ReductionSettings")] + public ReductionSettings ReductionSettings { get; set; } + + [JsonProperty("BonesToRemove")] + public object[] BonesToRemove { get; set; } + + [JsonProperty("BonesToPrioritize")] + public object[] BonesToPrioritize { get; set; } + + [JsonProperty("WeightOfPrioritization")] + public long WeightOfPrioritization { get; set; } + + [JsonProperty("BakePose")] + [JsonConverter(typeof(ParseStringConverter))] + public long BakePose { get; set; } + + [JsonProperty("BakePoseOverride")] + [JsonConverter(typeof(ParseStringConverter))] + public long BakePoseOverride { get; set; } + + [JsonProperty("SourceImportFilename")] + public string SourceImportFilename { get; set; } + + [JsonProperty("bHasBeenSimplified")] + public bool BHasBeenSimplified { get; set; } + + [JsonProperty("bHasPerLODVertexColors")] + public bool BHasPerLodVertexColors { get; set; } + + [JsonProperty("bAllowCPUAccess")] + public bool BAllowCpuAccess { get; set; } + + [JsonProperty("bSupportUniformlyDistributedSampling")] + public bool BSupportUniformlyDistributedSampling { get; set; } + } + + public partial class ReductionSettings + { + [JsonProperty("TerminationCriterion")] + public string TerminationCriterion { get; set; } + + [JsonProperty("NumOfTrianglesPercentage")] + public double NumOfTrianglesPercentage { get; set; } + + [JsonProperty("NumOfVertPercentage")] + public double NumOfVertPercentage { get; set; } + + [JsonProperty("MaxNumOfTriangles")] + public long MaxNumOfTriangles { get; set; } + + [JsonProperty("MaxNumOfVerts")] + public long MaxNumOfVerts { get; set; } + + [JsonProperty("MaxDeviationPercentage")] + public double MaxDeviationPercentage { get; set; } + + [JsonProperty("ReductionMethod")] + public string ReductionMethod { get; set; } + + [JsonProperty("SilhouetteImportance")] + public string SilhouetteImportance { get; set; } + + [JsonProperty("TextureImportance")] + public string TextureImportance { get; set; } + + [JsonProperty("ShadingImportance")] + public string ShadingImportance { get; set; } + + [JsonProperty("SkinningImportance")] + public string SkinningImportance { get; set; } + + [JsonProperty("bRemapMorphTargets")] + public bool BRemapMorphTargets { get; set; } + + [JsonProperty("bRecalcNormals")] + public bool BRecalcNormals { get; set; } + + [JsonProperty("WeldingThreshold")] + public double WeldingThreshold { get; set; } + + [JsonProperty("NormalsThreshold")] + public long NormalsThreshold { get; set; } + + [JsonProperty("MaxBonesPerVertex")] + public long MaxBonesPerVertex { get; set; } + + [JsonProperty("bEnforceBoneBoundaries")] + public bool BEnforceBoneBoundaries { get; set; } + + [JsonProperty("VolumeImportance")] + public long VolumeImportance { get; set; } + + [JsonProperty("bLockEdges")] + public bool BLockEdges { get; set; } + + [JsonProperty("BaseLOD")] + public long BaseLod { get; set; } + } + + public partial class MinLod + { + [JsonProperty("cooked")] + public bool Cooked { get; set; } + + [JsonProperty("value")] + public double Value { get; set; } + } + + public partial class SamplingInfo + { + [JsonProperty("BuiltData")] + public BuiltData BuiltData { get; set; } + } + + public partial class BuiltData + { + [JsonProperty("WholeMeshBuiltData")] + public WholeMeshBuiltDatum[] WholeMeshBuiltData { get; set; } + } + + public partial class WholeMeshBuiltDatum + { + [JsonProperty("prob")] + public object[] Prob { get; set; } + + [JsonProperty("alias")] + public object[] Alias { get; set; } + + [JsonProperty("total_weight")] + public long TotalWeight { get; set; } + } + + public partial struct NameToIndex + { + public long? Integer; + public string String; + + public static implicit operator NameToIndex(long Integer) => new NameToIndex { Integer = Integer }; + public static implicit operator NameToIndex(string String) => new NameToIndex { String = String }; + } + + public partial class MeshesParser + { + public static MeshesParser[] FromJson(string json) => JsonConvert.DeserializeObject(json, FModel.Parser.Meshes.Converter.Settings); + } + + public static class Serialize + { + public static string ToJson(this MeshesParser[] self) => JsonConvert.SerializeObject(self, FModel.Parser.Meshes.Converter.Settings); + } + + internal static class Converter + { + public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings + { + MetadataPropertyHandling = MetadataPropertyHandling.Ignore, + DateParseHandling = DateParseHandling.None, + Converters = + { + NameToIndexConverter.Singleton, + new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal } + }, + }; + } + + internal class NameToIndexConverter : JsonConverter + { + public override bool CanConvert(Type t) => t == typeof(NameToIndex) || t == typeof(NameToIndex?); + + public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer) + { + switch (reader.TokenType) + { + case JsonToken.Integer: + var integerValue = serializer.Deserialize(reader); + return new NameToIndex { Integer = integerValue }; + case JsonToken.String: + case JsonToken.Date: + var stringValue = serializer.Deserialize(reader); + return new NameToIndex { String = stringValue }; + } + throw new Exception("Cannot unmarshal type NameToIndex"); + } + + public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer) + { + var value = (NameToIndex)untypedValue; + if (value.Integer != null) + { + serializer.Serialize(writer, value.Integer.Value); + return; + } + if (value.String != null) + { + serializer.Serialize(writer, value.String); + return; + } + throw new Exception("Cannot marshal type NameToIndex"); + } + + public static readonly NameToIndexConverter Singleton = new NameToIndexConverter(); + } + + internal class ParseStringConverter : JsonConverter + { + public override bool CanConvert(Type t) => t == typeof(long) || t == typeof(long?); + + public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) return null; + var value = serializer.Deserialize(reader); + long l; + if (Int64.TryParse(value, out l)) + { + return l; + } + throw new Exception("Cannot unmarshal type long"); + } + + public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer) + { + if (untypedValue == null) + { + serializer.Serialize(writer, null); + return; + } + var value = (long)untypedValue; + serializer.Serialize(writer, value.ToString()); + return; + } + + public static readonly ParseStringConverter Singleton = new ParseStringConverter(); + } +}