diff --git a/PCK-Studio/Forms/Editor/ModelEditor.cs b/PCK-Studio/Forms/Editor/ModelEditor.cs index 3bbe0844..5a95d5c1 100644 --- a/PCK-Studio/Forms/Editor/ModelEditor.cs +++ b/PCK-Studio/Forms/Editor/ModelEditor.cs @@ -11,6 +11,7 @@ using OMI.Formats.Model; using MetroFramework.Forms; using PckStudio.Internal; +using PckStudio.Interfaces; using PckStudio.Internal.Json; using PckStudio.Internal.App; using PckStudio.Extensions; @@ -20,19 +21,13 @@ namespace PckStudio.Forms.Editor public partial class ModelEditor : MetroForm { private readonly ModelContainer _models; - private readonly TryGetTextureDelegate _tryGetTexture; - private readonly TrySetTextureDelegate _trySetTexture; + private readonly ITryGetSet _textures; - - public delegate bool TryGetTextureDelegate(string path, out Image img); - public delegate bool TrySetTextureDelegate(string path, Image img); - - public ModelEditor(ModelContainer models, TryGetTextureDelegate tryGetTexture, TrySetTextureDelegate trySetTexture) + public ModelEditor(ModelContainer models, TryGetDelegate tryGetTexture, TrySetDelegate trySetTexture) { InitializeComponent(); _models = models; - _tryGetTexture = tryGetTexture; - _trySetTexture = trySetTexture; + _textures = TryGetSet.FromDelegates(tryGetTexture, trySetTexture); modelTreeView.ImageList = new ImageList { @@ -117,6 +112,7 @@ namespace PckStudio.Forms.Editor ["mooshroom"] = 48, ["witherBoss.armor"] = 90, + // 1.14 models ["panda"] = 52, ["ravager"] = 61, ["pillager"] = 56, @@ -151,7 +147,7 @@ namespace PckStudio.Forms.Editor public ModelPart Part => _part; private ModelPartNode(ModelPart part) - : base(part.Name) + : base($"{part.Name} Pivot:{part.Translation * -1} Rot:{part.Rotation + part.AdditionalRotation} ") { _part = part; ImageIndex = 126; @@ -262,7 +258,7 @@ namespace PckStudio.Forms.Editor yield break; foreach (var textureLocation in GameModelImporter.ModelMetaData[modelName].TextureLocations) { - if (_tryGetTexture(textureLocation, out Image img)) + if (_textures.TryGet(textureLocation, out Image img)) yield return new NamedTexture(Path.GetFileName(textureLocation), img); } yield break; @@ -298,7 +294,7 @@ namespace PckStudio.Forms.Editor foreach (NamedTexture texture in modelInfo.Textures) { - _trySetTexture(texture.Name, texture.Texture); + _textures.TrySet(texture.Name, texture.Texture); } } } diff --git a/PCK-Studio/Interfaces/ITryGetSet.cs b/PCK-Studio/Interfaces/ITryGetSet.cs new file mode 100644 index 00000000..0b2598a7 --- /dev/null +++ b/PCK-Studio/Interfaces/ITryGetSet.cs @@ -0,0 +1,65 @@ +namespace PckStudio.Interfaces +{ + public delegate bool TryGetDelegate(TKey key, out TValue value); + public delegate bool TrySetDelegate(TKey key, TValue value); + + internal sealed class TryGet : ITryGet + { + private TryGetDelegate _tryGetDelegate; + + public static ITryGet FromDelegate(TryGetDelegate tryGetDelegate) => new TryGet(tryGetDelegate); + + bool ITryGet.TryGet(TKey key, out TValue value) => _tryGetDelegate(key, out value); + + private TryGet(TryGetDelegate tryGetDelegate) + { + _tryGetDelegate = tryGetDelegate; + } + } + + internal sealed class TrySet : ITrySet + { + private TrySetDelegate _trySetDelegate; + + public static ITrySet FromDelegate(TrySetDelegate trySetDelegate) => new TrySet(trySetDelegate); + + bool ITrySet.TrySet(TKey key, TValue value) => _trySetDelegate(key, value); + + private TrySet(TrySetDelegate trySetDelegate) + { + _trySetDelegate = trySetDelegate; + } + } + + internal sealed class TryGetSet : ITryGetSet + { + public static ITryGetSet FromDelegates(TryGetDelegate tryGetDelegate, TrySetDelegate trySetDelegate) => new TryGetSet(tryGetDelegate, trySetDelegate); + + public bool TryGet(TKey key, out TValue value) => _tryGetDelegate(key, out value); + + public bool TrySet(TKey key, TValue value) => _trySetDelegate(key, value); + + private TryGetDelegate _tryGetDelegate; + private TrySetDelegate _trySetDelegate; + + private TryGetSet(TryGetDelegate tryGetDelegate, TrySetDelegate trySetDelegate) + { + _tryGetDelegate = tryGetDelegate; + _trySetDelegate = trySetDelegate; + } + } + + interface ITryGet + { + bool TryGet(TKey key, out TValue value); + } + + interface ITrySet + { + bool TrySet(TKey key, TValue value); + } + + interface ITryGetSet : ITryGet, ITrySet + { + } +} diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 42bf4b57..2fbe6edf 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -40,6 +40,7 @@ using PckStudio.Internal.Deserializer; using PckStudio.Internal.Serializer; using PckStudio.Internal.App; using PckStudio.Internal.Skin; +using PckStudio.Interfaces; namespace PckStudio { @@ -603,18 +604,18 @@ namespace PckStudio return; } - ModelEditor.TryGetTextureDelegate tryGetTexture = (string path, out Image img) => + TryGetDelegate tryGetTexture = (string path, out Image img) => { - bool found = currentPCK.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset asset) || - currentPCK.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out asset); - img = found ? asset.GetTexture() : default; - return found; - }; - - ModelEditor.TrySetTextureDelegate trySetTexture = (string path, Image img) => + bool found = currentPCK.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset asset) || + currentPCK.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out asset); + img = found ? asset.GetTexture() : default; + return found; + }; + + TrySetDelegate trySetTexture = (string path, Image img) => { bool found = currentPCK.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset foundAsset) || - currentPCK.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out foundAsset); + currentPCK.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out foundAsset); PckAsset asset = foundAsset ?? currentPCK.CreateNewAsset(path + ".png", PckAssetType.TextureFile); asset.SetTexture(img); return true; @@ -622,10 +623,10 @@ namespace PckStudio var editor = new ModelEditor(modelContainer, tryGetTexture, trySetTexture); if (editor.ShowDialog() == DialogResult.OK) - { + { return; - } - } + } + } public void HandleBehavioursFile(PckAsset asset) { diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 5060c46c..641fbafa 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -153,6 +153,7 @@ ContributorsForm.cs + Form diff --git a/PCK-Studio/Rendering/ModelRenderer.cs b/PCK-Studio/Rendering/ModelRenderer.cs index 4f7ea195..016c8d90 100644 --- a/PCK-Studio/Rendering/ModelRenderer.cs +++ b/PCK-Studio/Rendering/ModelRenderer.cs @@ -11,6 +11,7 @@ using OMI.Formats.Model; using OpenTK; using OpenTK.Graphics.OpenGL; using PckStudio.Extensions; +using PckStudio.Interfaces; using PckStudio.Internal; using PckStudio.Internal.Json; using PckStudio.Properties; @@ -139,7 +140,7 @@ namespace PckStudio.Rendering }; } - _rootCollection.AddRange(RetriveChildMeshes(modelMetaData.RootParts, Vector3.Zero, Vector3.Zero, Vector3.Zero, ref model)); + _rootCollection.AddRange(BuildModelMesh(modelMetaData.RootParts, Vector3.Zero, Vector3.Zero, Vector3.Zero, TryGet.FromDelegate(model.TryGetPart))); if (Context.IsCurrent) { @@ -159,17 +160,18 @@ namespace PckStudio.Rendering Camera.Pitch = 25f; } - private List> RetriveChildMeshes(ModelMetaDataPart[] metaDataParts, Vector3 parentTranslation, Vector3 parentRotation, Vector3 parentPivot, ref Model model) + private List> BuildModelMesh(ModelMetaDataPart[] metaDataParts, Vector3 parentTranslation, Vector3 parentRotation, Vector3 parentPivot, ITryGet model) { List> meshes = new List>(); foreach (ModelMetaDataPart metaDataPart in metaDataParts) { - if (!model.TryGetPart(metaDataPart.Name, out ModelPart modelPart)) + if (!model.TryGet(metaDataPart.Name, out ModelPart modelPart)) { - Trace.TraceError($"[{nameof(ModelRenderer)}@{nameof(RetriveChildMeshes)}] : Failed to find part: '{metaDataPart.Name}'"); + Trace.TraceError($"[{nameof(ModelRenderer)}@{nameof(BuildModelMesh)}] : Failed to find part: '{metaDataPart.Name}'"); + continue; } Vector3 translation = modelPart.Translation.ToOpenTKVector(); - Vector3 pivot = parentPivot == Vector3.Zero ? translation * -1 : parentPivot; + Vector3 pivot = translation * -1 - parentPivot; Vector3 rotation = (modelPart.Rotation.ToOpenTKVector() + modelPart.AdditionalRotation.ToOpenTKVector()); CubeMeshCollection cubeCollection = new CubeMeshCollection(modelPart.Name, translation - parentTranslation, pivot, rotation - parentRotation); cubeCollection.FlipZMapping = true; @@ -178,7 +180,7 @@ namespace PckStudio.Rendering cubeCollection.AddNamed(modelPart.Name, boxes.Position.ToOpenTKVector(), boxes.Size.ToOpenTKVector(), boxes.Uv.ToOpenTKVector(), boxes.Inflate, boxes.Mirror); } meshes.Add(cubeCollection); - RetriveChildMeshes(metaDataPart.Children, translation, rotation, pivot, ref model).ForEach(cubeCollection.Add); + BuildModelMesh(metaDataPart.Children, translation, rotation, pivot, model).ForEach(cubeCollection.Add); } return meshes; }