From 8dfe9cf5b05642d03034fb4ac8219742d0e363d7 Mon Sep 17 00:00:00 2001 From: Miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Tue, 11 Nov 2025 21:53:32 +0100 Subject: [PATCH] 3d skin renderer (#50) * Add 'Validate Skin Dimension' setting * AddNewSkin - Fix cape box not showing after skin selection * Extended ResourceLocation for better atlas handling * ModelImporter - Add block bench export for models inside models.bin * ModelIporter - Rename 'GetPivot' to 'GetSkinBoxPivot' * ModelImporter - Fix ANIM2BOX to properly support slim skin models * ModelImporter - Update BedrockModel json class * ModelImporter - Update 'FixTexture' to be more generic * Update ModelContainer API inside OMI-Lib * Update skin vertex shader to not swap yz * Update CubeMesh class * SkinRenderer - Move framebuffer and error checking function to SceneViewport * SceneViewport - Change OnUpdate parameter * SkinRenderer - Fix Highlight part having wrong transform * SkinRenderer - Move call to 'SwapBuffers' into SceneViewport.OnUpdate * AppSettingsForm - Update API to be more flexible * SkinBOXExtensions - Update 'GetUVGraphicsPath' * SkinRenderer - Update 'OnUpdate' function * SkinRenderer - Add 'LockMousePosition' option * CustomSkinEditor - Update HighlightlingColor when selecting a part * CustomSkinEditor - Add render settings * CustomSkinEditor - Small non-technical changes * SkinRenderer - Small non-technical changes * CustomSkinEditor - Load render settings when 'OnLoad' is called * SkinRenderer - Fix centering leg0/1 * SkinRenderer - Update 'ReInitialzeSkinData' to upload new data to shader * Rename 'ModelImporter' -> 'SkinModelImporter' and add api interface to add custom import/export providers * CubeGroupMesh - Fix overlay parts not showing proerly * SkinRenderer - Fix part highlighting respecting inflate * Split up model and skin importer into seperate classes and improved api * IModelImportProvider - Add 'SupportImport' and 'SupportExport' property fields * ModelImporter - Rename 'SimpleSkinImportProvider' to 'InternalImportProvider' * modelTextureLocations.json - Add todo * SkinModelImporter - Move 'ModelTextureLocations' to GameModelImporter * CustomSkinEditor - Add SettingsManager for RenderSettings * ModelImporter::Import - Check if file exists * Rename 'modelTextureLocations' to 'modelMetaData' * GameModelImporter - Change blockbench name when exporting * SettingsManager - Add functionality to create internal settings object and add settings to it * GameModelImporter - Fully implemented game-model export to block bench * AppSettingsForm - Fix re-adding settings description to default settings * AppSettingsForm - Add settings description to 'ValidateImageDimension' * GameModelImporter - Add copyright notice and remove unnecessary using statements * ModelImporter - Add copyright notice and remove unnecessary using statements * BlockBenchModel - Fix Texture class json deserialization * SkinModelImporter - Add 'TryConvertToSkinBoxType' function * modelMetaData - Remove comments * SkinModelImporter - Fix 'GetSkinBoxPivot' function * SkinModelImporter - Add null check in 'FixTexture' function * SkinModelImporter - Add offset detection when importing skin model * CustomSkinEditor - Add 'export template' button * GameModelImporter - Rename 'ModelTextureLocations' -> 'ModelMetaData' * ModelImporter - Add summary to 'SupportedModelFileFormatsFilter' property * GameModelImporter - Change function signature of 'CreateElement' * GameModelImporter - Add options to create root outline * GameModelImporter - Update Debug message in 'TraverseChildren' * MainForm - Small code refactor * Rename class 'Meta' ->'BlockBenchFormatInfo' and update BlockBenchModel.Create function signature * MainForm - Update 'GetModelTextures' local function * GameModelImporter - Check model metadata before conversion * GameModelInfo - Mark class as sealed * SkinModelImporter - Check if blockbench model uses box uv * BlockBenchModel - Add export property to class 'Element' * CustomSkinEditor - Remove unused 'PreviewImage' property * CustomSkinEditor - Change highlight color on texture * SkinModelImporter - Fix Block Bench Model import * modelMetaData - Add meta data for 1.14 models * SkinModelImporter - Update 'TryConvertToSkinBoxType' function * SkinModelExporter - Fix model export for bbmodel and bedrock model * SkinRenderer - Fix order of applying anim animations to match the game * SkinModelImporter - Fix exception thrown in 'FixTexture' * CustomSkinEditor - Add Anim editor button and fix anim not being updated when exporting * SkinModelImporter - Fix offset detection when importing * SkinModelImporter - Swap box bottom texture when texture is available * GameModelImporter - Sort using statements * SkinModelImporter - Small code clean up inside 'ImportBedrockJson' * SkinModelImporter - Update 'AddBone' function inside 'ExportBedrockJson' * SkinModelImporter - Fix bottom texture swaping being done bofre parts where imported * SkinMoelImporter - Rename 'GetSkinBoxPivot' to 'GetSkinPartPivot' * SceneViewport - Rename 'Init' to 'Initialize' * SkinModelImporter - Add texture import in 'ImportBedrockJson' * SkinModelImporter - Fix becrock model import * Skin-/GameModelImporter - Rename 'fileName' parameter to 'filepath' * Add ModelEditor * modelMetaData - Add cavespider texture location * GameModelImporter - Update 'ExportBlockBenchModel' function * GameModelImporter - Mark 'ModelExportSettings' as sealed * ModelEditor -Add Save tool menu item & add TrySetTexture Delegate * ModelEditor - Add model node icons * Update CubeMesh & rename CubeGroupMesh to CubeMeshCollection * ModelEditor - Rename 'GetModelNodes' & 'GetModelPartNodeChildren' * Update GenericMesh & mesh rendering * Move Cube conversion into SkinBOXExtensions * GenericMesh - Made 'Transform' property abstract * SceneViewport - Add shaderLibrary and api to it * Rename 'skin...' shaders to 'texturedCube...' * Update modelMetaData part hierarchy structure * ShaderProgram - Add 'SetUniform2' overload for System.Drawing.Size * ModelEditor - Create factory methods for custom model treenodes * modelMetaData - Add 'slime.armor' texture location & pattern texture locations for 'tropicalfish_-a/-b' * Move Debug & Camera control into SceneViewport * Update BoundingBox * Add ModelRenderer * ShaderProgram - Update GetUniformLocation to retrive all active uniforms when linking program * ModelEditor - Add option to show bounding box of the model * SceneViewport - Add OnPaint override to clear color and depth buffer and enable depth testing * Update OMI submodule * Update Texture base class to accept slot when calling Bind * Plain color fragment shader - Update uniform names to be PascalCase * SceneViewport - Add 'ResetCamera' virtual function * CustomSkinEditor - Add missing render setting 'Show Armor' * ModelRenderer - Fix centering model after selecting * Move 'SceneViewport.GetBounds' to 'BoundingBox.GetEnclosingBoundingBox' * CubeMeshCollection - Implemented 'GetBounds' * SkinRenderer - Add option to show skins bounding box * ModelEditor - Update 'GetModelImageIndex' * SceneViewport - Disable blend when rendering debug graphics * ModelEditor - Remove 'Model' property in favor to 'LoadModel' function * JsonModelMetaData - Initialize 'RootParts' to empty array * BoundingBox - Fix exception when empty enumerable was passed * CubeMesh - Remove 'SetName' and add constructor with 'name' parameter * SkinBOX - Change class to record & make member properties getter only * BoundingBox - Move 'Abs' function into extension class * SceneViewport - Change 'Transform' to 'GetTransform' * BoundingBox - Make 'GetVertices' static & add GetTransform * SkinRenderer - Fix bounds calculation when offset is set & fix part highlighting * CubeMesh - Move translation & scaling into 'GetTransform' * CubeMeshCollection - Update 'Contains' overload function & 'SetVisible' * ModelRenderer - Fix pivot point rendering * ModelRenderer - Add part highlighting * modelMetaData - Add missing part to dolphin * modelMetaData - Add missing parts to dragon * CubeMesh - Fix 'GetTransform' function * ModelRenderer - Fix model rotation, pivot & translation issues * ModelRenderer - Add offset to render transform & camera * ModelRenderer - Tried fixing alpha rendering issues * modelMetaData - Add missing part to dragon & add comment * Add 'ITryGetSet.cs' and useful wrappers for it * ModelRenderer - Rename 'HighlightInfo.Pivot' to 'HighlightInfo.Translation' * ITryGetSet - mark classes and interfaces public * ModelEditor - Add material render support * ModelRenderer - Add 'TryGetModelMetaData' method * Fix rendering invisible vertecies * ModelRenderer - Simplefied populating 'metaData.RootParts' property * ModelRenderer - Add 'modelOffset' field * ModelRenderer - Update 'SetModelMaterial' * ModelRenderer - Add simple way of rendering a 2nd layer of a model(the bed model only for now) * ModelRenderer - Fix pivot points not working on horse model properly * ResourceLocation - Add 'Unknown' ResourceLocation instance & improved 'ResourceLocation.GetFromPath' * ResourceCategory - Add 'MobEntityTextures' & 'ItemEntityTextures' * Add default model handling (defaults unfinished) * Add Default Bed model * Add default chicken model * Add default cow model * AddSkinPrompt - Fix Custom skin editor not having anim flag properly set * SceneViewport - Fix Designer crashing when trying to call 'OnPaint' * Update OMI submodule * SceneViewport - Call 'base.OnMouseUp' before our own code * BlockBenchModel - Fix 'Texture.Name' being null * ItemSelectionPopUp - Fix 'okBtn_Click' condition * MainForm - Add export function for default models * MainForm - Fix model selector ignoring cancel button * MainForm - Remove unnecessary wrapper for 'entityMaterials.TryGetValue' * ModelEditor - Add remove model to context menu * ModelEditor - Add 'GetModelContainer' function * GameModelImporter - Add import functionality * MainForm - Add texture when exporting default models * Add default model for: redcow, pig, snowgolem & dragon head * Add SkinModel & SkinIdentifier class * Refactor Skin.cs - Move texture from 'SkinModel' to Skin.cs - Move 'Id' from SkinMetaData into it's own class(SkinIdentifier.cs) - Create SkinModelInfo class for keeping skin conversion simple * Skin.cs - Rename 'ANIM' property to 'Anim' * Move 'hasInvalidEntries' into 'MaterialExtensions.HasInvalidEntries' * Add ISaveContext * PckAssetExt - Rename parameter names for 'GetSkin' * Add Editor.cs * Update most editors to use new Editor class and save context * CustomSkinEditor - Use Editor as base class * SkinMetaData - Change to Immutable data type * PckAssetExtension - [SetSkin] Change adding loc key to setting loc key * ImageDeserializer - Add format check when deserializing * MainForm - [HandleSkinFile] Rename some varibale names * ModelEditor - Use Editor as base class * Move static variables from 'ModelPartSpecifics' to 'GameConstants' * Texture.cs - Add IDisposable interface * PckAssetExtensions - [SetSkin] Add null check for loc file * AnimationEditor - Fix auto save check * TextureAtlasEditor - Refactor animation access control * TextureAtlasEditor - Sort using directives * MainForm - [HandleTextureFile] Add Debug message when animation has no frames to save * AddSkinPrompt - Update save context for custom skin editor * Editor - Move autosave check in 'OnFormClosing' * ModelRenderer - Update designer specifics * Merge 'multi-pck-files-feature' into '3dSkinRenderer' * [WIP] Sub-pck in new tab with savecontext etc. * SceneViewport - Change base refresh rate to 60 fps * CustomSkinEditor - Move max offset value into a constant * ModelEditor - Add highlighting of sinfgle model boxes * MainForm - Add constant for max pck id value * CustomSkinEditor - Remove fps slider and re-ordered ui * EditorForm - Remove abstract from class declaration * EditorControl - Made virtual funtion throw `NotImplementedException` * CustomSkinEditor - Fix naming violations * CustomSkinEditor - Move initialization of render settings into a seperate funtion & remove `show armor` setting * Move Common functionality to Core project & rendering and Model support as well * Change namespace of EditorForm & EditorControl * Add Constant 'NDEBUG' to Core, Rendering & ModelSupport project * PckStudio.csproj - Remove `defaultModels.json` & `modelMetaData.json` - files were moved to PckStuido.ModelSupport * PckStudio.csproj - Remove unused `ApplicationBuildInfo.cs` * PckStudio.Core - Add NamedData.cs * PckStudio - Move some Resources to Core * Add Altas class & refactored Atlas editor * Update OMI Submodule * TextureAtlasEditor - Fix clear button not reseting color * Fix PackInfo.cs - OMI.Endianess -> OMI.ByteOrder * TextureAtlas - Impl extraction&import of large tiles * PckStudio.Core - Remove duplicated resources * LOCEditor - Added menu item for copying loc id * Core - Move 'MAX_PACK_ID' into GameConstants * TextureAtlasEditor - small refactor + TODOs * Update OMI submodule ref --- PCK-Studio/App.config | 3 + PCK-Studio/Classes/Models/BackgroundTypes.cs | 11 - PCK-Studio/Classes/Models/Backgrounds.cs | 14 - PCK-Studio/Classes/Models/Box.cs | 158 - .../Classes/Models/DefaultModels/ModelBase.cs | 59 - .../Models/DefaultModels/Steve64x32Model.cs | 88 - .../Models/DefaultModels/Steve64x64Model.cs | 122 - PCK-Studio/Classes/Models/Effects.cs | 12 - PCK-Studio/Classes/Models/Matrix3D.cs | 177 - .../Classes/Models/ModelView.Designer.cs | 71 - PCK-Studio/Classes/Models/ModelView.cs | 431 --- PCK-Studio/Classes/Models/Object3D.cs | 461 --- PCK-Studio/Classes/Models/Object3DGroup.cs | 65 - PCK-Studio/Classes/Models/Point3D.cs | 31 - PCK-Studio/Classes/Models/Positions.cs | 14 - PCK-Studio/Classes/Models/ProjectionTypes.cs | 10 - PCK-Studio/Classes/Models/RotationOrders.cs | 14 - PCK-Studio/Classes/Models/Texel.cs | 49 - PCK-Studio/Classes/Models/TexelComparer.cs | 17 - PCK-Studio/Classes/Models/TexturePlane.cs | 189 -- PCK-Studio/Controls/CustomTabControl.cs | 93 + PCK-Studio/Controls/EditorControl.cs | 46 + PCK-Studio/Controls/EditorForm.cs | 37 + PCK-Studio/Controls/PageClosingEventArgs.cs | 22 + PCK-Studio/Controls/PckEditor.Designer.cs | 824 +++++ PCK-Studio/Controls/PckEditor.cs | 2251 +++++++++++++ PCK-Studio/Controls/PckEditor.resx | 2097 ++++++++++++ PCK-Studio/Extensions/AnimationExtensions.cs | 25 - PCK-Studio/Extensions/ImageLayoutDirection.cs | 8 - PCK-Studio/Extensions/PckAssetExtensions.cs | 125 - PCK-Studio/External/API/Miles/Binka.cs | 2 +- PCK-Studio/FileFormats/CSMBFile.cs | 102 - .../AddSkinPrompt.Designer.cs | 9 +- .../Forms/Additional-Popups/AddSkinPrompt.cs | 170 +- .../Additional-Popups/AddSkinPrompt.resx | 18 - .../Additional-Popups/Animation/ChangeTile.cs | 14 +- .../Additional-Popups/EntityForms/AddEntry.cs | 3 +- .../Additional-Popups/ItemSelectionPopUp.cs | 5 +- .../NumericPrompt.Designer.cs | 24 +- .../Forms/Additional-Popups/NumericPrompt.cs | 61 +- .../Additional-Popups/NumericPrompt.resx | 82 +- PCK-Studio/Forms/AppSettingsForm.Designer.cs | 1 - PCK-Studio/Forms/AppSettingsForm.cs | 91 +- PCK-Studio/Forms/Editor/ANIMEditor.cs | 1 + .../Forms/Editor/AnimationEditor.Designer.cs | 2 +- PCK-Studio/Forms/Editor/AnimationEditor.cs | 113 +- PCK-Studio/Forms/Editor/AudioEditor.cs | 89 +- .../Forms/Editor/BehaviourEditor.Designer.cs | 1 - PCK-Studio/Forms/Editor/BehaviourEditor.cs | 160 +- PCK-Studio/Forms/Editor/BoxEditor.cs | 13 +- PCK-Studio/Forms/Editor/COLEditor.Designer.cs | 1 - PCK-Studio/Forms/Editor/COLEditor.cs | 171 +- .../Forms/Editor/CustomSkinEditor.Designer.cs | 446 +++ PCK-Studio/Forms/Editor/CustomSkinEditor.cs | 481 +++ .../CustomSkinEditor.ja.resx} | 0 .../CustomSkinEditor.resx} | 1727 ++++------ .../Editor/GameRuleFileEditor.Designer.cs | 1 - PCK-Studio/Forms/Editor/GameRuleFileEditor.cs | 70 +- PCK-Studio/Forms/Editor/LOCEditor.Designer.cs | 40 +- PCK-Studio/Forms/Editor/LOCEditor.cs | 48 +- PCK-Studio/Forms/Editor/LOCEditor.resx | 16 +- PCK-Studio/Forms/Editor/MaterialsEditor.cs | 147 +- .../Forms/Editor/ModelEditor.Designer.cs | 254 ++ PCK-Studio/Forms/Editor/ModelEditor.cs | 342 ++ PCK-Studio/Forms/Editor/ModelEditor.resx | 129 + .../Editor/TextureAtlasEditor.Designer.cs | 23 +- PCK-Studio/Forms/Editor/TextureAtlasEditor.cs | 416 +-- PCK-Studio/Forms/Features/CemuPanel.cs | 8 +- .../Skins-And-Textures/AdvancedOptions.cs | 12 +- .../SkinPreview.Designer.cs | 75 - .../Forms/Skins-And-Textures/SkinPreview.cs | 34 - .../generateModel.Designer.cs | 642 ---- .../Forms/Skins-And-Textures/generateModel.cs | 1304 ------- .../Internal/App/ApplicationBuildInfo.cs | 47 - PCK-Studio/Internal/App/Profiler.cs | 43 - PCK-Studio/Internal/AppResourceManager.cs | 45 + .../Internal/{App => }/ApplicationScope.cs | 51 +- PCK-Studio/Internal/{App => }/CommitInfo.cs | 0 PCK-Studio/Internal/{Json => }/Entities.cs | 5 +- PCK-Studio/Internal/GameConstants.cs | 35 - PCK-Studio/Internal/IO/CSMB/CSMBFileReader.cs | 66 - PCK-Studio/Internal/IO/CSMB/CSMBFileWriter.cs | 58 - PCK-Studio/Internal/PckNodeSorter.cs | 2 +- PCK-Studio/Internal/ResourceLocation.cs | 125 - .../Internal/{Misc => }/RichPresenceClient.cs | 5 +- PCK-Studio/Internal/SettingsManager.cs | 14 + PCK-Studio/Internal/SkinBOX.cs | 117 - PCK-Studio/MainForm.Designer.cs | 878 +---- PCK-Studio/MainForm.cs | 2446 ++------------ PCK-Studio/MainForm.resx | 3001 +++-------------- PCK-Studio/PckStudio.csproj | 202 +- PCK-Studio/Program.cs | 13 +- PCK-Studio/Properties/Resources.Designer.cs | 608 ++-- PCK-Studio/Properties/Resources.resx | 165 +- PCK-Studio/Properties/Settings.Designer.cs | 12 + PCK-Studio/Properties/Settings.settings | 3 + .../Rendering/ModelRenderer.Designer.cs | 42 + PCK-Studio/Rendering/ModelRenderer.cs | 334 ++ PCK-Studio/Rendering/ModelRenderer.resx | 120 + PCK-Studio/Rendering/SceneViewport.cs | 640 ++++ PCK-Studio/Rendering/SkinRenderer.Designer.cs | 42 + PCK-Studio/Rendering/SkinRenderer.cs | 1109 ++++++ PCK-Studio/Rendering/SkinRenderer.resx | 123 + PCK-Studio/Resources/armor.png | Bin 0 -> 2355 bytes .../Resources/entityBehavioursData.json | 489 +++ PCK-Studio/Resources/entityMaterialsData.json | 485 +++ PCK-Studio/Resources/entityModelsData.json | 485 +++ .../shader/framebufferFragmentShader.glsl | 13 + .../shader/framebufferVertexShader.glsl | 12 + .../shader/plainColorFragmentShader.glsl | 13 + .../shader/plainColorVertexShader.glsl | 15 + .../shader/skyboxFragmentShader.glsl | 13 + .../Resources/shader/skyboxVertexShader.glsl | 14 + .../shader/texturedCubeFragmentShader.glsl | 16 + .../shader/texturedCubeGeometryShader.glsl | 47 + .../shader/texturedCubeVertexShader.glsl | 18 + PCK-Studio/Resources/skybox_texture.png | Bin 0 -> 1206153 bytes .../ToolboxItems/AnimationPictureBox.cs | 10 +- PCK-Studio/ToolboxItems/BlendPictureBox.cs | 18 +- .../ToolboxItems/InterpolationPictureBox.cs | 9 + PCK_Studio.sln | 60 + .../Internal => PckStudio.Core}/Animation.cs | 15 +- .../App/SettingsManager.cs | 47 +- .../App/Updater.cs | 19 +- PckStudio.Core/Atlas.cs | 231 ++ PckStudio.Core/AtlasGroup.cs | 48 + PckStudio.Core/AtlasGroupAnimation.cs | 42 + PckStudio.Core/AtlasGroupLargeTile.cs | 43 + .../AtlasGroupLargeTileAnimation.cs | 79 + PckStudio.Core/AtlasTile.cs | 71 + PckStudio.Core/BoundingBox.cs | 37 + PckStudio.Core/DelegatedFileSaveContext.cs | 47 + PckStudio.Core/DelegatedSaveContext.cs | 19 + .../Deserializer/AnimationDeserializer.cs | 7 +- .../Deserializer/AtlasDeserializer.cs | 23 + .../Deserializer/ImageDeserializer.cs | 27 +- .../Extensions/AnimationExtensions.cs | 27 + .../Extensions/BlendMode.cs | 4 +- .../Extensions/BoundingBoxExtensions.cs | 16 + .../Extensions/ColorExtensions.cs | 27 +- PckStudio.Core/Extensions/CursorExtensions.cs | 51 + .../Extensions/EnumerableExtensions.cs | 4 +- .../Extensions/GraphicsExtensions.cs | 8 +- .../Extensions/ImageExtensions.cs | 96 +- .../Extensions/ImageLayoutDirection.cs | 8 + .../Extensions/ImageSection.cs | 2 +- .../Extensions/ListExtensions.cs | 4 +- .../Extensions/LocFileExtensions.cs | 4 +- .../Extensions/MaterialContainerExtensions.cs | 4 +- .../Extensions/MaterialExtensions.cs | 4 +- .../Extensions/MathExtensions.cs | 6 +- .../Extensions/ModelBoxExtension.cs | 20 + PckStudio.Core/Extensions/OpenTKExtensions.cs | 25 + .../Extensions/PckAssetExtensions.cs | 226 ++ .../Extensions/PictureBoxExtensions.cs | 4 +- .../Extensions/SkinBOXExtensions.cs | 81 + PckStudio.Core/Extensions/SkinExtensions.cs | 71 + PckStudio.Core/Extensions/System.Numerics.cs | 29 + .../Extensions/TreeNodeExtensions.cs | 12 +- .../Extensions/TreeViewExtensions.cs | 4 +- PckStudio.Core/FileDialogFilter.cs | 23 + .../FileFormats/PckAudioFile.cs | 4 +- PckStudio.Core/GameConstants.cs | 80 + .../IO/3DST/3DSTextureReader.cs | 6 +- .../IO/3DST/3DSTextureWriter.cs | 6 +- .../IO/3DST/TextureCodec.cs | 2 +- .../IO/PckAudio/PckAudioFileReader.cs | 12 +- .../IO/PckAudio/PckAudioFileWriter.cs | 12 +- .../IO/TGA/TGADataTypeCode.cs | 2 +- .../IO/TGA/TGADeserializer.cs | 2 +- .../IO/TGA/TGAException.cs | 2 +- .../IO/TGA/TGAExtentionData.cs | 2 +- .../IO/TGA/TGAFileData.cs | 2 +- .../IO/TGA/TGAFooter.cs | 2 +- .../IO/TGA/TGAHeader.cs | 2 +- .../IO/TGA/TGAReader.cs | 5 +- .../IO/TGA/TGASerializer.cs | 2 +- .../IO/TGA/TGAWriter.cs | 7 +- PckStudio.Core/Interfaces/IEditor.cs | 24 + .../Interfaces/IModelImportProvider.cs | 22 + .../Interfaces/IPckAssetDeserializer.cs | 2 +- .../Interfaces/IPckAssetSerializer.cs | 2 +- PckStudio.Core/Interfaces/ISaveContext.cs | 9 + PckStudio.Core/Interfaces/ITryGetSet.cs | 65 + PckStudio.Core/ItemSelectionPopUp.Designer.cs | 90 + PckStudio.Core/ItemSelectionPopUp.cs | 44 + .../ItemSelectionPopUp.resx | 128 + .../Json/ColorEntry.cs | 4 +- .../Json/EntityInfo.cs | 8 +- .../Json/TileInfo.cs | 10 +- .../Json/UpdateInformation.cs | 2 +- .../Misc/FileCacher.cs | 4 +- .../Misc/OpenFolderDialog.cs | 11 +- PckStudio.Core/NamedData.cs | 14 + PckStudio.Core/PackInfo.cs | 45 + PckStudio.Core/PckStudio.Core.csproj | 220 ++ .../Properties/Resources.Designer.cs | 470 +++ PckStudio.Core/Properties/Resources.resx | 184 + .../ResourceCategory.cs | 6 +- PckStudio.Core/ResourceLocation.cs | 208 ++ PckStudio.Core/Resources/Comparison.png | Bin 0 -> 101337 bytes PckStudio.Core/Resources/TexturePackIcon.png | Bin 0 -> 767 bytes .../Resources/additional_mapicons.png | Bin 0 -> 4599 bytes PckStudio.Core/Resources/bannerData.json | 1053 ++++++ PckStudio.Core/Resources/banners.png | Bin 0 -> 12880 bytes PckStudio.Core/Resources/blockData.json | 2922 ++++++++++++++++ .../Resources/entityBehavioursData.json | 489 +++ .../Resources/entityMaterialsData.json | 485 +++ .../Resources/entityModelsData.json | 485 +++ .../Resources/experienceOrbData.json | 124 + PckStudio.Core/Resources/experience_orbs.png | Bin 0 -> 583 bytes PckStudio.Core/Resources/explosion.png | Bin 0 -> 1614 bytes PckStudio.Core/Resources/explosionData.json | 197 ++ PckStudio.Core/Resources/itemData.json | 1361 ++++++++ PckStudio.Core/Resources/items.png | Bin 0 -> 155929 bytes PckStudio.Core/Resources/mapIconData.json | 135 + PckStudio.Core/Resources/map_icons.png | Bin 0 -> 6329 bytes PckStudio.Core/Resources/moonPhaseData.json | 37 + PckStudio.Core/Resources/moon_phases.png | Bin 0 -> 1569 bytes PckStudio.Core/Resources/paintingData.json | 1062 ++++++ PckStudio.Core/Resources/paintings.png | Bin 0 -> 92439 bytes PckStudio.Core/Resources/particleData.json | 2097 ++++++++++++ PckStudio.Core/Resources/particles.png | Bin 0 -> 23424 bytes PckStudio.Core/Resources/terrain.png | Bin 0 -> 227548 bytes .../Serializer/AnimationSerializer.cs | 11 +- PckStudio.Core/Serializer/AtlasSerializer.cs | 19 + .../Serializer/ImageSerializer.cs | 4 +- PckStudio.Core/Skin/Skin.cs | 53 + .../Skin}/SkinANIM.cs | 7 +- .../Skin}/SkinAnimFlag.cs | 2 +- .../Skin}/SkinAnimMask.cs | 6 +- PckStudio.Core/Skin/SkinBOX.cs | 180 + PckStudio.Core/Skin/SkinIdentifier.cs | 23 + PckStudio.Core/Skin/SkinMetaData.cs | 14 + PckStudio.Core/Skin/SkinModel.cs | 27 + PckStudio.Core/Skin/SkinPartOffset.cs | 81 + .../Internal/Json => PckStudio.Core}/Tiles.cs | 65 +- PckStudio.Rendering/BoundingBox.cs | 46 + PckStudio.Rendering/Camera/Camera.cs | 12 + .../Camera/PerspectiveCamera.cs | 208 ++ PckStudio.Rendering/ColorVertex.cs | 31 + PckStudio.Rendering/Cube.cs | 102 + PckStudio.Rendering/CubeMesh.cs | 137 + PckStudio.Rendering/CubeMeshCollection.cs | 236 ++ PckStudio.Rendering/DrawContext.cs | 23 + .../Extension/SkinBoxExtension.cs | 18 + PckStudio.Rendering/FrameBuffer.cs | 37 + PckStudio.Rendering/GenericMesh.cs | 54 + PckStudio.Rendering/IndexBuffer.cs | 68 + .../PckStudio.Rendering.csproj | 90 + .../Properties/AssemblyInfo.cs | 33 + PckStudio.Rendering/Renderer.cs | 50 + PckStudio.Rendering/Shader/ShaderLibrary.cs | 31 + PckStudio.Rendering/Shader/ShaderObject.cs | 81 + PckStudio.Rendering/Shader/ShaderProgram.cs | 176 + PckStudio.Rendering/Shader/ShaderSource.cs | 38 + PckStudio.Rendering/Spherical.cs | 51 + PckStudio.Rendering/Texture/CubeTexture.cs | 58 + PckStudio.Rendering/Texture/Texture.cs | 109 + PckStudio.Rendering/Texture/Texture2D.cs | 39 + .../TextureChangingEventArgs.cs | 32 + PckStudio.Rendering/TextureVertex.cs | 22 + PckStudio.Rendering/VertexArray.cs | 120 + PckStudio.Rendering/VertexBuffer.cs | 70 + PckStudio.Rendering/VertexBufferLayout.cs | 136 + .../Extension/SkinExtension.cs | 23 + .../Format/External/BedrockLegacyModel.cs | 13 + .../Format/External/BedrockModel.cs | 158 + .../Format/External/BlockBenchModel.cs | 362 ++ .../Format/Internal/PSM/PSMFile.cs | 86 + .../Format/Internal/PSM/PSMFileReader.cs | 156 + .../Format/Internal/PSM/PSMFileWriter.cs | 134 + PckStuido.ModelSupport/GameModelImporter.cs | 239 ++ PckStuido.ModelSupport/GameModelInfo.cs | 20 + .../Json/JsonDefaultModel.cs | 48 + .../Json/JsonModelMetaData.cs | 46 + PckStuido.ModelSupport/ModelImporter.cs | 178 + .../PckStuido.ModelSupport.csproj | 96 + .../Properties/AssemblyInfo.cs | 33 + .../Properties/Resources.Designer.cs | 120 + .../Properties/Resources.resx | 127 + .../Resources/defaultModels.json | 619 ++++ .../Resources/modelMetaData.json | 739 ++++ PckStuido.ModelSupport/SkinModelImporter.cs | 557 +++ PckStuido.ModelSupport/SkinModelInfo.cs | 24 + Vendor/OMI-Lib | 2 +- docs/PSM.md | 32 + 287 files changed, 33729 insertions(+), 13307 deletions(-) delete mode 100644 PCK-Studio/Classes/Models/BackgroundTypes.cs delete mode 100644 PCK-Studio/Classes/Models/Backgrounds.cs delete mode 100644 PCK-Studio/Classes/Models/Box.cs delete mode 100644 PCK-Studio/Classes/Models/DefaultModels/ModelBase.cs delete mode 100644 PCK-Studio/Classes/Models/DefaultModels/Steve64x32Model.cs delete mode 100644 PCK-Studio/Classes/Models/DefaultModels/Steve64x64Model.cs delete mode 100644 PCK-Studio/Classes/Models/Effects.cs delete mode 100644 PCK-Studio/Classes/Models/Matrix3D.cs delete mode 100644 PCK-Studio/Classes/Models/ModelView.Designer.cs delete mode 100644 PCK-Studio/Classes/Models/ModelView.cs delete mode 100644 PCK-Studio/Classes/Models/Object3D.cs delete mode 100644 PCK-Studio/Classes/Models/Object3DGroup.cs delete mode 100644 PCK-Studio/Classes/Models/Point3D.cs delete mode 100644 PCK-Studio/Classes/Models/Positions.cs delete mode 100644 PCK-Studio/Classes/Models/ProjectionTypes.cs delete mode 100644 PCK-Studio/Classes/Models/RotationOrders.cs delete mode 100644 PCK-Studio/Classes/Models/Texel.cs delete mode 100644 PCK-Studio/Classes/Models/TexelComparer.cs delete mode 100644 PCK-Studio/Classes/Models/TexturePlane.cs create mode 100644 PCK-Studio/Controls/CustomTabControl.cs create mode 100644 PCK-Studio/Controls/EditorControl.cs create mode 100644 PCK-Studio/Controls/EditorForm.cs create mode 100644 PCK-Studio/Controls/PageClosingEventArgs.cs create mode 100644 PCK-Studio/Controls/PckEditor.Designer.cs create mode 100644 PCK-Studio/Controls/PckEditor.cs create mode 100644 PCK-Studio/Controls/PckEditor.resx delete mode 100644 PCK-Studio/Extensions/AnimationExtensions.cs delete mode 100644 PCK-Studio/Extensions/ImageLayoutDirection.cs delete mode 100644 PCK-Studio/Extensions/PckAssetExtensions.cs delete mode 100644 PCK-Studio/FileFormats/CSMBFile.cs create mode 100644 PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs create mode 100644 PCK-Studio/Forms/Editor/CustomSkinEditor.cs rename PCK-Studio/Forms/{Skins-And-Textures/generateModel.ja.resx => Editor/CustomSkinEditor.ja.resx} (100%) rename PCK-Studio/Forms/{Skins-And-Textures/generateModel.resx => Editor/CustomSkinEditor.resx} (85%) create mode 100644 PCK-Studio/Forms/Editor/ModelEditor.Designer.cs create mode 100644 PCK-Studio/Forms/Editor/ModelEditor.cs create mode 100644 PCK-Studio/Forms/Editor/ModelEditor.resx delete mode 100644 PCK-Studio/Forms/Skins-And-Textures/SkinPreview.Designer.cs delete mode 100644 PCK-Studio/Forms/Skins-And-Textures/SkinPreview.cs delete mode 100644 PCK-Studio/Forms/Skins-And-Textures/generateModel.Designer.cs delete mode 100644 PCK-Studio/Forms/Skins-And-Textures/generateModel.cs delete mode 100644 PCK-Studio/Internal/App/ApplicationBuildInfo.cs delete mode 100644 PCK-Studio/Internal/App/Profiler.cs create mode 100644 PCK-Studio/Internal/AppResourceManager.cs rename PCK-Studio/Internal/{App => }/ApplicationScope.cs (51%) rename PCK-Studio/Internal/{App => }/CommitInfo.cs (100%) rename PCK-Studio/Internal/{Json => }/Entities.cs (92%) delete mode 100644 PCK-Studio/Internal/GameConstants.cs delete mode 100644 PCK-Studio/Internal/IO/CSMB/CSMBFileReader.cs delete mode 100644 PCK-Studio/Internal/IO/CSMB/CSMBFileWriter.cs delete mode 100644 PCK-Studio/Internal/ResourceLocation.cs rename PCK-Studio/Internal/{Misc => }/RichPresenceClient.cs (97%) create mode 100644 PCK-Studio/Internal/SettingsManager.cs delete mode 100644 PCK-Studio/Internal/SkinBOX.cs create mode 100644 PCK-Studio/Rendering/ModelRenderer.Designer.cs create mode 100644 PCK-Studio/Rendering/ModelRenderer.cs create mode 100644 PCK-Studio/Rendering/ModelRenderer.resx create mode 100644 PCK-Studio/Rendering/SceneViewport.cs create mode 100644 PCK-Studio/Rendering/SkinRenderer.Designer.cs create mode 100644 PCK-Studio/Rendering/SkinRenderer.cs create mode 100644 PCK-Studio/Rendering/SkinRenderer.resx create mode 100644 PCK-Studio/Resources/armor.png create mode 100644 PCK-Studio/Resources/entityBehavioursData.json create mode 100644 PCK-Studio/Resources/entityMaterialsData.json create mode 100644 PCK-Studio/Resources/entityModelsData.json create mode 100644 PCK-Studio/Resources/shader/framebufferFragmentShader.glsl create mode 100644 PCK-Studio/Resources/shader/framebufferVertexShader.glsl create mode 100644 PCK-Studio/Resources/shader/plainColorFragmentShader.glsl create mode 100644 PCK-Studio/Resources/shader/plainColorVertexShader.glsl create mode 100644 PCK-Studio/Resources/shader/skyboxFragmentShader.glsl create mode 100644 PCK-Studio/Resources/shader/skyboxVertexShader.glsl create mode 100644 PCK-Studio/Resources/shader/texturedCubeFragmentShader.glsl create mode 100644 PCK-Studio/Resources/shader/texturedCubeGeometryShader.glsl create mode 100644 PCK-Studio/Resources/shader/texturedCubeVertexShader.glsl create mode 100644 PCK-Studio/Resources/skybox_texture.png rename {PCK-Studio/Internal => PckStudio.Core}/Animation.cs (93%) rename {PCK-Studio/Internal => PckStudio.Core}/App/SettingsManager.cs (57%) rename {PCK-Studio/Internal => PckStudio.Core}/App/Updater.cs (76%) create mode 100644 PckStudio.Core/Atlas.cs create mode 100644 PckStudio.Core/AtlasGroup.cs create mode 100644 PckStudio.Core/AtlasGroupAnimation.cs create mode 100644 PckStudio.Core/AtlasGroupLargeTile.cs create mode 100644 PckStudio.Core/AtlasGroupLargeTileAnimation.cs create mode 100644 PckStudio.Core/AtlasTile.cs create mode 100644 PckStudio.Core/BoundingBox.cs create mode 100644 PckStudio.Core/DelegatedFileSaveContext.cs create mode 100644 PckStudio.Core/DelegatedSaveContext.cs rename {PCK-Studio/Internal => PckStudio.Core}/Deserializer/AnimationDeserializer.cs (96%) create mode 100644 PckStudio.Core/Deserializer/AtlasDeserializer.cs rename {PCK-Studio/Internal => PckStudio.Core}/Deserializer/ImageDeserializer.cs (52%) create mode 100644 PckStudio.Core/Extensions/AnimationExtensions.cs rename {PCK-Studio => PckStudio.Core}/Extensions/BlendMode.cs (70%) create mode 100644 PckStudio.Core/Extensions/BoundingBoxExtensions.cs rename {PCK-Studio => PckStudio.Core}/Extensions/ColorExtensions.cs (66%) create mode 100644 PckStudio.Core/Extensions/CursorExtensions.cs rename {PCK-Studio => PckStudio.Core}/Extensions/EnumerableExtensions.cs (91%) rename {PCK-Studio => PckStudio.Core}/Extensions/GraphicsExtensions.cs (86%) rename {PCK-Studio => PckStudio.Core}/Extensions/ImageExtensions.cs (77%) create mode 100644 PckStudio.Core/Extensions/ImageLayoutDirection.cs rename {PCK-Studio => PckStudio.Core}/Extensions/ImageSection.cs (96%) rename {PCK-Studio => PckStudio.Core}/Extensions/ListExtensions.cs (85%) rename {PCK-Studio => PckStudio.Core}/Extensions/LocFileExtensions.cs (87%) rename {PCK-Studio => PckStudio.Core}/Extensions/MaterialContainerExtensions.cs (96%) rename {PCK-Studio => PckStudio.Core}/Extensions/MaterialExtensions.cs (83%) rename {PCK-Studio => PckStudio.Core}/Extensions/MathExtensions.cs (59%) create mode 100644 PckStudio.Core/Extensions/ModelBoxExtension.cs create mode 100644 PckStudio.Core/Extensions/OpenTKExtensions.cs create mode 100644 PckStudio.Core/Extensions/PckAssetExtensions.cs rename {PCK-Studio => PckStudio.Core}/Extensions/PictureBoxExtensions.cs (89%) create mode 100644 PckStudio.Core/Extensions/SkinBOXExtensions.cs create mode 100644 PckStudio.Core/Extensions/SkinExtensions.cs create mode 100644 PckStudio.Core/Extensions/System.Numerics.cs rename {PCK-Studio => PckStudio.Core}/Extensions/TreeNodeExtensions.cs (70%) rename {PCK-Studio => PckStudio.Core}/Extensions/TreeViewExtensions.cs (90%) create mode 100644 PckStudio.Core/FileDialogFilter.cs rename {PCK-Studio => PckStudio.Core}/FileFormats/PckAudioFile.cs (98%) create mode 100644 PckStudio.Core/GameConstants.cs rename {PCK-Studio/Internal => PckStudio.Core}/IO/3DST/3DSTextureReader.cs (94%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/3DST/3DSTextureWriter.cs (88%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/3DST/TextureCodec.cs (99%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/PckAudio/PckAudioFileReader.cs (93%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/PckAudio/PckAudioFileWriter.cs (90%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGADataTypeCode.cs (98%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGADeserializer.cs (97%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAException.cs (93%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAExtentionData.cs (98%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAFileData.cs (97%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAFooter.cs (96%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAHeader.cs (97%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAReader.cs (98%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGASerializer.cs (97%) rename {PCK-Studio/Internal => PckStudio.Core}/IO/TGA/TGAWriter.cs (96%) create mode 100644 PckStudio.Core/Interfaces/IEditor.cs create mode 100644 PckStudio.Core/Interfaces/IModelImportProvider.cs rename {PCK-Studio => PckStudio.Core}/Interfaces/IPckAssetDeserializer.cs (70%) rename {PCK-Studio => PckStudio.Core}/Interfaces/IPckAssetSerializer.cs (74%) create mode 100644 PckStudio.Core/Interfaces/ISaveContext.cs create mode 100644 PckStudio.Core/Interfaces/ITryGetSet.cs create mode 100644 PckStudio.Core/ItemSelectionPopUp.Designer.cs create mode 100644 PckStudio.Core/ItemSelectionPopUp.cs rename PCK-Studio/Forms/Skins-And-Textures/SkinPreview.resx => PckStudio.Core/ItemSelectionPopUp.resx (97%) rename {PCK-Studio/Internal => PckStudio.Core}/Json/ColorEntry.cs (89%) rename {PCK-Studio/Internal => PckStudio.Core}/Json/EntityInfo.cs (70%) rename {PCK-Studio/Internal => PckStudio.Core}/Json/TileInfo.cs (79%) rename {PCK-Studio/Internal => PckStudio.Core}/Json/UpdateInformation.cs (93%) rename {PCK-Studio/Internal => PckStudio.Core}/Misc/FileCacher.cs (97%) rename {PCK-Studio/Internal => PckStudio.Core}/Misc/OpenFolderDialog.cs (95%) create mode 100644 PckStudio.Core/NamedData.cs create mode 100644 PckStudio.Core/PackInfo.cs create mode 100644 PckStudio.Core/PckStudio.Core.csproj create mode 100644 PckStudio.Core/Properties/Resources.Designer.cs create mode 100644 PckStudio.Core/Properties/Resources.resx rename {PCK-Studio/Internal => PckStudio.Core}/ResourceCategory.cs (91%) create mode 100644 PckStudio.Core/ResourceLocation.cs create mode 100644 PckStudio.Core/Resources/Comparison.png create mode 100644 PckStudio.Core/Resources/TexturePackIcon.png create mode 100644 PckStudio.Core/Resources/additional_mapicons.png create mode 100644 PckStudio.Core/Resources/bannerData.json create mode 100644 PckStudio.Core/Resources/banners.png create mode 100644 PckStudio.Core/Resources/blockData.json create mode 100644 PckStudio.Core/Resources/entityBehavioursData.json create mode 100644 PckStudio.Core/Resources/entityMaterialsData.json create mode 100644 PckStudio.Core/Resources/entityModelsData.json create mode 100644 PckStudio.Core/Resources/experienceOrbData.json create mode 100644 PckStudio.Core/Resources/experience_orbs.png create mode 100644 PckStudio.Core/Resources/explosion.png create mode 100644 PckStudio.Core/Resources/explosionData.json create mode 100644 PckStudio.Core/Resources/itemData.json create mode 100644 PckStudio.Core/Resources/items.png create mode 100644 PckStudio.Core/Resources/mapIconData.json create mode 100644 PckStudio.Core/Resources/map_icons.png create mode 100644 PckStudio.Core/Resources/moonPhaseData.json create mode 100644 PckStudio.Core/Resources/moon_phases.png create mode 100644 PckStudio.Core/Resources/paintingData.json create mode 100644 PckStudio.Core/Resources/paintings.png create mode 100644 PckStudio.Core/Resources/particleData.json create mode 100644 PckStudio.Core/Resources/particles.png create mode 100644 PckStudio.Core/Resources/terrain.png rename {PCK-Studio/Internal => PckStudio.Core}/Serializer/AnimationSerializer.cs (90%) create mode 100644 PckStudio.Core/Serializer/AtlasSerializer.cs rename {PCK-Studio/Internal => PckStudio.Core}/Serializer/ImageSerializer.cs (96%) create mode 100644 PckStudio.Core/Skin/Skin.cs rename {PCK-Studio/Internal => PckStudio.Core/Skin}/SkinANIM.cs (93%) rename {PCK-Studio/Internal => PckStudio.Core/Skin}/SkinAnimFlag.cs (98%) rename {PCK-Studio/Internal => PckStudio.Core/Skin}/SkinAnimMask.cs (95%) create mode 100644 PckStudio.Core/Skin/SkinBOX.cs create mode 100644 PckStudio.Core/Skin/SkinIdentifier.cs create mode 100644 PckStudio.Core/Skin/SkinMetaData.cs create mode 100644 PckStudio.Core/Skin/SkinModel.cs create mode 100644 PckStudio.Core/Skin/SkinPartOffset.cs rename {PCK-Studio/Internal/Json => PckStudio.Core}/Tiles.cs (60%) create mode 100644 PckStudio.Rendering/BoundingBox.cs create mode 100644 PckStudio.Rendering/Camera/Camera.cs create mode 100644 PckStudio.Rendering/Camera/PerspectiveCamera.cs create mode 100644 PckStudio.Rendering/ColorVertex.cs create mode 100644 PckStudio.Rendering/Cube.cs create mode 100644 PckStudio.Rendering/CubeMesh.cs create mode 100644 PckStudio.Rendering/CubeMeshCollection.cs create mode 100644 PckStudio.Rendering/DrawContext.cs create mode 100644 PckStudio.Rendering/Extension/SkinBoxExtension.cs create mode 100644 PckStudio.Rendering/FrameBuffer.cs create mode 100644 PckStudio.Rendering/GenericMesh.cs create mode 100644 PckStudio.Rendering/IndexBuffer.cs create mode 100644 PckStudio.Rendering/PckStudio.Rendering.csproj create mode 100644 PckStudio.Rendering/Properties/AssemblyInfo.cs create mode 100644 PckStudio.Rendering/Renderer.cs create mode 100644 PckStudio.Rendering/Shader/ShaderLibrary.cs create mode 100644 PckStudio.Rendering/Shader/ShaderObject.cs create mode 100644 PckStudio.Rendering/Shader/ShaderProgram.cs create mode 100644 PckStudio.Rendering/Shader/ShaderSource.cs create mode 100644 PckStudio.Rendering/Spherical.cs create mode 100644 PckStudio.Rendering/Texture/CubeTexture.cs create mode 100644 PckStudio.Rendering/Texture/Texture.cs create mode 100644 PckStudio.Rendering/Texture/Texture2D.cs create mode 100644 PckStudio.Rendering/TextureChangingEventArgs.cs create mode 100644 PckStudio.Rendering/TextureVertex.cs create mode 100644 PckStudio.Rendering/VertexArray.cs create mode 100644 PckStudio.Rendering/VertexBuffer.cs create mode 100644 PckStudio.Rendering/VertexBufferLayout.cs create mode 100644 PckStuido.ModelSupport/Extension/SkinExtension.cs create mode 100644 PckStuido.ModelSupport/Format/External/BedrockLegacyModel.cs create mode 100644 PckStuido.ModelSupport/Format/External/BedrockModel.cs create mode 100644 PckStuido.ModelSupport/Format/External/BlockBenchModel.cs create mode 100644 PckStuido.ModelSupport/Format/Internal/PSM/PSMFile.cs create mode 100644 PckStuido.ModelSupport/Format/Internal/PSM/PSMFileReader.cs create mode 100644 PckStuido.ModelSupport/Format/Internal/PSM/PSMFileWriter.cs create mode 100644 PckStuido.ModelSupport/GameModelImporter.cs create mode 100644 PckStuido.ModelSupport/GameModelInfo.cs create mode 100644 PckStuido.ModelSupport/Json/JsonDefaultModel.cs create mode 100644 PckStuido.ModelSupport/Json/JsonModelMetaData.cs create mode 100644 PckStuido.ModelSupport/ModelImporter.cs create mode 100644 PckStuido.ModelSupport/PckStuido.ModelSupport.csproj create mode 100644 PckStuido.ModelSupport/Properties/AssemblyInfo.cs create mode 100644 PckStuido.ModelSupport/Properties/Resources.Designer.cs create mode 100644 PckStuido.ModelSupport/Properties/Resources.resx create mode 100644 PckStuido.ModelSupport/Resources/defaultModels.json create mode 100644 PckStuido.ModelSupport/Resources/modelMetaData.json create mode 100644 PckStuido.ModelSupport/SkinModelImporter.cs create mode 100644 PckStuido.ModelSupport/SkinModelInfo.cs create mode 100644 docs/PSM.md diff --git a/PCK-Studio/App.config b/PCK-Studio/App.config index c3b1b2f6..732c8327 100644 --- a/PCK-Studio/App.config +++ b/PCK-Studio/App.config @@ -77,6 +77,9 @@ False + + True + diff --git a/PCK-Studio/Classes/Models/BackgroundTypes.cs b/PCK-Studio/Classes/Models/BackgroundTypes.cs deleted file mode 100644 index b460d046..00000000 --- a/PCK-Studio/Classes/Models/BackgroundTypes.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public enum BackgroundTypes - { - Color, - Gradient, - Texture - } -} diff --git a/PCK-Studio/Classes/Models/Backgrounds.cs b/PCK-Studio/Classes/Models/Backgrounds.cs deleted file mode 100644 index 692896bc..00000000 --- a/PCK-Studio/Classes/Models/Backgrounds.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public enum Backgrounds - { - LightStone, - DarkStone, - DaySky, - NightSky, - Sunset, - Transparent - } -} diff --git a/PCK-Studio/Classes/Models/Box.cs b/PCK-Studio/Classes/Models/Box.cs deleted file mode 100644 index 23d64a9d..00000000 --- a/PCK-Studio/Classes/Models/Box.cs +++ /dev/null @@ -1,158 +0,0 @@ -using System; -using System.Drawing; - -namespace PckStudio.Models -{ - public class Box : Object3D - { - public override Image Image - { - set - { - SetImage(value); - } - } - - internal override MinecraftModelView Viewport - { - set - { - base.Viewport = value; - top.Viewport = value; - bottom.Viewport = value; - front.Viewport = value; - back.Viewport = value; - left.Viewport = value; - right.Viewport = value; - Update(); - } - } - - internal override void Update() - { - Matrix3D a = globalTransformation * localTransformation; - top.LocalTransformation = a * topLocalTransformation; - bottom.LocalTransformation = a * bottomLocalTransformation; - front.LocalTransformation = a * frontLocalTransformation; - back.LocalTransformation = a * backLocalTransformation; - left.LocalTransformation = a * leftLocalTransformation; - right.LocalTransformation = a * rightLocalTransformation; - } - - public Box(Image image, Rectangle srcTopBottom, Rectangle srcSides, Point3D origin, Effects effects = Effects.None) - { - this.effects = effects; - Origin = origin; - SetImage(image, srcTopBottom, srcSides); - } - - private void SetImage(Image image, Rectangle srcTopBottom, Rectangle srcSides) - { - int num = srcTopBottom.Width / 2; - int height = srcSides.Height; - int height2 = srcTopBottom.Height; - srcTop = new Rectangle(srcTopBottom.Location, new Size(num, height2)); - srcBottom = new Rectangle(srcTopBottom.X + num, srcTopBottom.Y, num, height2); - srcFront = new Rectangle(srcSides.X + height2, srcSides.Y, num, height); - srcBack = new Rectangle(srcSides.X + height2 + num + height2, srcSides.Y, num, height); - srcLeft = new Rectangle(srcSides.Location, new Size(height2, height)); - srcRight = new Rectangle(srcSides.X + height2 + num, srcSides.Y, height2, height); - SetImage(image); - } - - private void SetImage(Image image) - { - bool flag = (byte)(effects & Effects.FlipHorizontally) == 1; - bool flag2 = (byte)(effects & Effects.FlipVertically) == 2; - int width = srcFront.Width; - int height = srcFront.Height; - int width2 = srcLeft.Width; - top = new TexturePlane(image, flag2 ? srcBottom : srcTop, new Point3D(width * 0.5f, width2 * 0.5f, (float)(-(float)height) * 0.5f), new Point3D(0f, 1f, 0f), effects & Effects.FlipHorizontally); - bottom = new TexturePlane(image, flag2 ? srcTop : srcBottom, new Point3D(width / 2f, width2 / 2f, height / 2f), new Point3D(0f, -1f, 0f), effects & Effects.FlipHorizontally); - front = new TexturePlane(image, srcFront, new Point3D(width * 0.5f, height * 0.5f, (float)(-(float)width2) * 0.5f), new Point3D(0f, 0f, 1f), effects); - back = new TexturePlane(image, srcBack, new Point3D(width * 0.5f, height * 0.5f, (float)(-(float)width2) * 0.5f), new Point3D(0f, 0f, -1f), effects); - left = new TexturePlane(image, flag ? srcRight : srcLeft, new Point3D(width2 * 0.5f, height * 0.5f, (float)(-(float)width) * 0.5f), new Point3D(-1f, 0f, 0f), effects); - right = new TexturePlane(image, flag ? srcLeft : srcRight, new Point3D(width2 * 0.5f, height * 0.5f, (float)(-(float)width) * 0.5f), new Point3D(1f, 0f, 0f), effects); - top.Viewport = viewport; - bottom.Viewport = viewport; - front.Viewport = viewport; - back.Viewport = viewport; - left.Viewport = viewport; - right.Viewport = viewport; - } - - public override float HitTest(PointF location) - { - float num = -1000f; - float num2 = top.HitTest(location); - if (num2 > num) - { - num = num2; - } - num2 = bottom.HitTest(location); - if (num2 > num) - { - num = num2; - } - num2 = front.HitTest(location); - if (num2 > num) - { - num = num2; - } - num2 = back.HitTest(location); - if (num2 > num) - { - num = num2; - } - num2 = left.HitTest(location); - if (num2 > num) - { - num = num2; - } - num2 = right.HitTest(location); - if (num2 > num) - { - num = num2; - } - return num; - } - - private TexturePlane top; - - private TexturePlane bottom; - - private TexturePlane front; - - private TexturePlane back; - - private TexturePlane left; - - private TexturePlane right; - - private Rectangle srcTop; - - private Rectangle srcBottom; - - private Rectangle srcFront; - - private Rectangle srcBack; - - private Rectangle srcLeft; - - private Rectangle srcRight; - - private Matrix3D topLocalTransformation = Matrix3D.CreateRotationX(-1.57079637f); - - private Matrix3D bottomLocalTransformation = Matrix3D.CreateRotationX(-1.57079637f); - - private Matrix3D frontLocalTransformation = Matrix3D.Identity; - - private Matrix3D backLocalTransformation = Matrix3D.CreateRotationY(3.14159274f); - - private Matrix3D leftLocalTransformation = Matrix3D.CreateRotationY(-1.57079637f); - - private Matrix3D rightLocalTransformation = Matrix3D.CreateRotationY(1.57079637f); - - private Effects effects; - } -} diff --git a/PCK-Studio/Classes/Models/DefaultModels/ModelBase.cs b/PCK-Studio/Classes/Models/DefaultModels/ModelBase.cs deleted file mode 100644 index 66a759c9..00000000 --- a/PCK-Studio/Classes/Models/DefaultModels/ModelBase.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using PckStudio.Models; -using System.Runtime.CompilerServices; -using System.Threading; -using System.Drawing; - -namespace PckStudio.Models -{ - public abstract class ModelBase - { - public ModelBase() - { } - - protected Image[] textures; - - public EventHandler OnUpdate; - protected const float OverlayScale = 1.16f; - - public Image[] Textures => textures; - - public event EventHandler Updatedx - { - add - { - EventHandler eventHandler = OnUpdate; - EventHandler eventHandler2; - do - { - eventHandler2 = eventHandler; - EventHandler value2 = (EventHandler)Delegate.Combine(eventHandler2, value); - eventHandler = Interlocked.CompareExchange(ref OnUpdate, value2, eventHandler2); - } - while (eventHandler != eventHandler2); - } - remove - { - EventHandler eventHandler = OnUpdate; - EventHandler eventHandler2; - do - { - eventHandler2 = eventHandler; - EventHandler value2 = (EventHandler)Delegate.Remove(eventHandler2, value); - eventHandler = Interlocked.CompareExchange(ref OnUpdate, value2, eventHandler2); - } - while (eventHandler != eventHandler2); - } - } - - protected void OnUpdated() - { - if (OnUpdate != null) - { - OnUpdate(this, EventArgs.Empty); - } - } - - public abstract void AddToModelView(MinecraftModelView modelView); - } -} diff --git a/PCK-Studio/Classes/Models/DefaultModels/Steve64x32Model.cs b/PCK-Studio/Classes/Models/DefaultModels/Steve64x32Model.cs deleted file mode 100644 index 0af00dfc..00000000 --- a/PCK-Studio/Classes/Models/DefaultModels/Steve64x32Model.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.IO; -using System.Drawing; -using PckStudio.Models; -using PckStudio.Properties; - -namespace PckStudio.Models -{ - internal class Steve64x32Model : ModelBase - { - public Steve64x32Model(Image texture) - { - textures = new Image[1] { texture }; - } - - public override void AddToModelView(MinecraftModelView modelView) - { - _ = Textures[0] ?? throw new NullReferenceException(nameof(Textures)); - Image source = Textures[0]; - Box head = new Box(source, new Rectangle( 8, 0, 16, 8), new Rectangle( 0, 8, 32, 8), new Point3D(0f, 0f, 0f)); - Box headOverlay = new Box(source, new Rectangle(40, 0, 16, 8), new Rectangle(32, 8, 32, 8), new Point3D(0f, 0f, 0f)); - headOverlay.Scale = OverlayScale; - - Box body = new Box(source, new Rectangle(20, 16, 16, 4), new Rectangle(16, 20, 24, 12), new Point3D(0f, 0f, 0f)); - - Box leftArm = new Box(source, new Rectangle(44, 16, 8, 4), new Rectangle(40, 20, 32, 12), new Point3D(0f, 4f, 0f)); - Box rightArm = new Box(source, new Rectangle(44, 16, 8, 4), new Rectangle(40, 20, 32, 12), new Point3D(0f, 4f, 0f)); - - Box leftLeg = new Box(source, new Rectangle(4, 16, 8, 4), new Rectangle(0, 20, 16, 12), new Point3D(0f, 6f, 0f)); - Box rightLeg = new Box(source, new Rectangle(4, 16, 8, 4), new Rectangle(0, 20, 16, 12), new Point3D(0f, 6f, 0f)); - - Object3DGroup headGroup = new Object3DGroup(); - - headGroup.RotationOrder = RotationOrders.XY; - headGroup.MinDegrees1 = -80f; - headGroup.MaxDegrees1 = 80f; - - headGroup.MinDegrees2 = -57f; - headGroup.MaxDegrees2 = 57f; - - headGroup.Add(head); - headGroup.Add(headOverlay); - - headGroup.Position = new Point3D(0f, 8f, 0f); - headGroup.Origin = new Point3D(0f, -4f, 0f); - headGroup.RotationOrder = RotationOrders.XY; - - body.Position = new Point3D(0f, 2f, 0f); - - leftArm.Position = new Point3D(6f, 6f, 0f); - leftArm.RotationOrder = RotationOrders.ZX; - leftArm.MinDegrees1 = 0f; - leftArm.MaxDegrees1 = 160f; - leftArm.MinDegrees2 = -170f; - leftArm.MaxDegrees2 = 60f; - - rightArm.Position = new Point3D(-6f, 6f, 0f); - rightArm.RotationOrder = RotationOrders.ZX; - rightArm.MinDegrees1 = -160f; - rightArm.MaxDegrees1 = 0f; - rightArm.MinDegrees2 = -170f; - rightArm.MaxDegrees2 = 60f; - - leftLeg.Position = new Point3D(2f, -4f, 0f); - leftLeg.RotationOrder = RotationOrders.ZX; - leftLeg.MinDegrees1 = 0f; - leftLeg.MaxDegrees1 = 70f; - leftLeg.MinDegrees2 = -110f; - leftLeg.MaxDegrees2 = 60f; - - rightLeg.Position = new Point3D(-2f, -4f, 0f); - rightLeg.RotationOrder = RotationOrders.ZX; - rightLeg.MinDegrees1 = -70f; - rightLeg.MaxDegrees1 = 0f; - rightLeg.MinDegrees2 = -110f; - rightLeg.MaxDegrees2 = 60f; - - modelView.AddDynamic(headGroup); - modelView.AddStatic(body); - modelView.AddDynamic(rightArm); - modelView.AddDynamic(leftArm); - modelView.AddDynamic(rightLeg); - modelView.AddDynamic(leftLeg); - } - - public override string ToString() => nameof(Steve64x32Model); - } -} diff --git a/PCK-Studio/Classes/Models/DefaultModels/Steve64x64Model.cs b/PCK-Studio/Classes/Models/DefaultModels/Steve64x64Model.cs deleted file mode 100644 index e7442333..00000000 --- a/PCK-Studio/Classes/Models/DefaultModels/Steve64x64Model.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Security.Policy; -using System.Text; -using System.Threading.Tasks; -using PckStudio.Internal; -using PckStudio.Models; - -namespace PckStudio.Classes.Models.DefaultModels -{ - internal class Steve64x64Model : ModelBase - { - SkinANIM _skinANIM; - public Steve64x64Model(Image texture, SkinANIM anim) - { - textures = new Image[1] { texture }; - _skinANIM = anim; - } - - public override void AddToModelView(MinecraftModelView modelView) - { - _ = Textures[0] ?? throw new NullReferenceException(nameof(Textures)); - Image source = Textures[0]; - - (int top, int side) armWidth = _skinANIM.GetFlag(SkinAnimFlag.SLIM_MODEL) ? (6, 14) : (8, 16); - - Box head = new Box(source, new Rectangle(8, 0, 16, 8), new Rectangle(0, 8, 32, 8), new Point3D(0f, 0f, 0f)); - Box headOverlay = new Box(source, new Rectangle(40, 0, 16, 8), new Rectangle(32, 8, 32, 8), new Point3D(0f, 0f, 0f)); - headOverlay.Scale = OverlayScale; - - Box body = new Box(source, new Rectangle(20, 16, 16, 4), new Rectangle(16, 20, 24, 12), new Point3D(0f, 0f, 0f)); - Box bodyOverlay = new Box(source, new Rectangle(20, 32, 16, 4), new Rectangle(16, 36, 24, 12), new Point3D(0f, 0f, 0f)); - bodyOverlay.Scale = OverlayScale; - - Box rightArm = new Box(source, new Rectangle(44, 16, armWidth.top, 4), new Rectangle(40, 20, armWidth.side, 12), new Point3D(0f, 4f, 0f)); - Box rightArmOverlay = new Box(source, new Rectangle(44, 32, armWidth.top, 4), new Rectangle(40, 36, armWidth.side, 12), new Point3D(0f, 4f, 0f)); - rightArmOverlay.Scale = OverlayScale; - - Box leftArm = new Box(source, new Rectangle(36, 48, armWidth.top, 4), new Rectangle(32, 52, armWidth.side, 12), new Point3D(0f, 4f, 0f)); - Box leftArmOverlay = new Box(source, new Rectangle(52, 48, armWidth.top, 4), new Rectangle(48, 52, armWidth.side, 12), new Point3D(0f, 4f, 0f)); - leftArmOverlay.Scale = OverlayScale; - - Box rightLeg = new Box(source, new Rectangle(4, 16, 8, 4), new Rectangle(0, 20, 16, 12), new Point3D(0f, 6f, 0f)); - Box rightLegOverlay = new Box(source, new Rectangle(4, 32, 8, 4), new Rectangle(0, 52, 16, 12), new Point3D(0f, 6f, 0f)); - rightLegOverlay.Scale = OverlayScale; - - Box leftLeg = new Box(source, new Rectangle(20, 48, 8, 4), new Rectangle(16, 52, 16, 12), new Point3D(0f, 6f, 0f)); - Box leftLegOverlay = new Box(source, new Rectangle( 4, 48, 8, 4), new Rectangle( 0, 52, 16, 12), new Point3D(0f, 6f, 0f)); - leftLegOverlay.Scale = OverlayScale; - - Object3DGroup headGroup = new Object3DGroup(); - Object3DGroup bodyGroup = new Object3DGroup(); - Object3DGroup leftArmGroup = new Object3DGroup(); - Object3DGroup rightArmGroup = new Object3DGroup(); - Object3DGroup leftLegGroup = new Object3DGroup(); - Object3DGroup rightLegGroup = new Object3DGroup(); - - headGroup.RotationOrder = RotationOrders.XY; - headGroup.MinDegrees1 = -80f; - headGroup.MaxDegrees1 = 80f; - - headGroup.MinDegrees2 = -57f; - headGroup.MaxDegrees2 = 57f; - - headGroup.Origin = new Point3D(0f, -4f, 0f); - headGroup.RotationOrder = RotationOrders.XY; - - headGroup.Position = new Point3D(0f, 8f, 0f); - headGroup.Add(head); - headGroup.Add(headOverlay); - - bodyGroup.Position = new Point3D(0f, 2f, 0f); - bodyGroup.Add(body); - bodyGroup.Add(bodyOverlay); - - leftArmGroup.Position = new Point3D(6f, 6f, 0f); - leftArmGroup.RotationOrder = RotationOrders.ZX; - leftArmGroup.MinDegrees1 = 0f; - leftArmGroup.MaxDegrees1 = 160f; - leftArmGroup.MinDegrees2 = -170f; - leftArmGroup.MaxDegrees2 = 60f; - leftArmGroup.Add(leftArm); - leftArmGroup.Add(leftArmOverlay); - - rightArmGroup.Position = new Point3D(-6f, 6f, 0f); - rightArmGroup.RotationOrder = RotationOrders.ZX; - rightArmGroup.MinDegrees1 = -160f; - rightArmGroup.MaxDegrees1 = 0f; - rightArmGroup.MinDegrees2 = -170f; - rightArmGroup.MaxDegrees2 = 60f; - rightArmGroup.Add(rightArm); - rightArmGroup.Add(rightArmOverlay); - - leftLegGroup.Position = new Point3D(2f, -4f, 0f); - leftLegGroup.RotationOrder = RotationOrders.ZX; - leftLegGroup.MinDegrees1 = 0f; - leftLegGroup.MaxDegrees1 = 70f; - leftLegGroup.MinDegrees2 = -110f; - leftLegGroup.MaxDegrees2 = 60f; - leftLegGroup.Add(leftLeg); - leftLegGroup.Add(leftLegOverlay); - - rightLegGroup.Position = new Point3D(-2f, -4f, 0f); - rightLegGroup.RotationOrder = RotationOrders.ZX; - rightLegGroup.MinDegrees1 = -70f; - rightLegGroup.MaxDegrees1 = 0f; - rightLegGroup.MinDegrees2 = -110f; - rightLegGroup.MaxDegrees2 = 60f; - rightLegGroup.Add(rightLeg); - rightLegGroup.Add(rightLegOverlay); - - modelView.AddDynamic(headGroup); - modelView.AddStatic(bodyGroup); - modelView.AddDynamic(rightArmGroup); - modelView.AddDynamic(leftArmGroup); - modelView.AddDynamic(rightLegGroup); - modelView.AddDynamic(leftLegGroup); - } - } -} diff --git a/PCK-Studio/Classes/Models/Effects.cs b/PCK-Studio/Classes/Models/Effects.cs deleted file mode 100644 index 418101b2..00000000 --- a/PCK-Studio/Classes/Models/Effects.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - [Flags] - public enum Effects : byte - { - None = 0, - FlipHorizontally = 1, - FlipVertically = 2 - } -} diff --git a/PCK-Studio/Classes/Models/Matrix3D.cs b/PCK-Studio/Classes/Models/Matrix3D.cs deleted file mode 100644 index 071528dd..00000000 --- a/PCK-Studio/Classes/Models/Matrix3D.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public struct Matrix3D - { - public Matrix3D(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44) - { - M11 = m11; - M12 = m12; - M13 = m13; - M14 = m14; - M21 = m21; - M22 = m22; - M23 = m23; - M24 = m24; - M31 = m31; - M32 = m32; - M33 = m33; - M34 = m34; - M41 = m41; - M42 = m42; - M43 = m43; - M44 = m44; - } - - public static Matrix3D CreateRotationX(float radians) - { - float num = (float)Math.Sin((double)radians); - float num2 = (float)Math.Cos((double)radians); - return new Matrix3D(1f, 0f, 0f, 0f, 0f, num2, -num, 0f, 0f, num, num2, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateRotationX(float sin, float cos) - { - return new Matrix3D(1f, 0f, 0f, 0f, 0f, cos, -sin, 0f, 0f, sin, cos, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateRotationY(float radians) - { - float num = (float)Math.Sin((double)radians); - float num2 = (float)Math.Cos((double)radians); - return new Matrix3D(num2, 0f, num, 0f, 0f, 1f, 0f, 0f, -num, 0f, num2, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateRotationY(float sin, float cos) - { - return new Matrix3D(cos, 0f, sin, 0f, 0f, 1f, 0f, 0f, -sin, 0f, cos, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateRotationZ(float radians) - { - float num = (float)Math.Sin((double)radians); - float num2 = (float)Math.Cos((double)radians); - return new Matrix3D(num2, -num, 0f, 0f, num, num2, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateRotationZ(float sin, float cos) - { - return new Matrix3D(cos, -sin, 0f, 0f, sin, cos, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateTranslation(float x, float y, float z) - { - return new Matrix3D(1f, 0f, 0f, x, 0f, 1f, 0f, y, 0f, 0f, 1f, z, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateTranslation(Point3D point) - { - return new Matrix3D(1f, 0f, 0f, point.X, 0f, 1f, 0f, point.Y, 0f, 0f, 1f, point.Z, 0f, 0f, 0f, 1f); - } - - public static Matrix3D CreateScale(float s) - { - return new Matrix3D(s, 0f, 0f, 0f, 0f, s, 0f, 0f, 0f, 0f, s, 0f, 0f, 0f, 0f, 1f); - } - - public float Determinant - { - get - { - return M11 * M22 * M33 * M44 + M21 * M32 * M43 * M14 + M31 * M42 * M13 * M24 + M41 * M12 * M23 * M34 - M14 * M23 * M32 * M41 - M24 * M33 * M42 * M11 - M34 * M43 * M12 * M21 - M44 * M13 * M22 * M31; - } - } - - public static Matrix3D Identity - { - get - { - return new Matrix3D(1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f); - } - } - - public static Matrix3D Transpose(Matrix3D m) - { - return new Matrix3D(m.M11, m.M21, m.M31, m.M41, m.M12, m.M22, m.M32, m.M42, m.M13, m.M23, m.M33, m.M43, m.M14, m.M24, m.M34, m.M44); - } - - public static Matrix3D Invert(Matrix3D m) - { - float determinant = m.Determinant; - return new Matrix3D((m.M22 * m.M33 * m.M44 + m.M32 * m.M43 * m.M24 + m.M42 * m.M23 * m.M34 - m.M24 * m.M33 * m.M42 - m.M34 * m.M43 * m.M22 - m.M44 * m.M23 * m.M32) / determinant, -(m.M12 * m.M33 * m.M44 + m.M32 * m.M43 * m.M14 + m.M42 * m.M13 * m.M34 - m.M14 * m.M33 * m.M42 - m.M34 * m.M43 * m.M12 - m.M44 * m.M13 * m.M32) / determinant, (m.M12 * m.M23 * m.M44 + m.M22 * m.M43 * m.M14 + m.M42 * m.M13 * m.M24 - m.M14 * m.M23 * m.M42 - m.M24 * m.M43 * m.M12 - m.M44 * m.M13 * m.M22) / determinant, -(m.M12 * m.M23 * m.M34 + m.M22 * m.M33 * m.M14 + m.M32 * m.M13 * m.M24 - m.M14 * m.M23 * m.M32 - m.M24 * m.M33 * m.M12 - m.M34 * m.M13 * m.M22) / determinant, -(m.M21 * m.M33 * m.M44 + m.M31 * m.M43 * m.M24 + m.M41 * m.M23 * m.M34 - m.M24 * m.M33 * m.M41 - m.M34 * m.M43 * m.M21 - m.M44 * m.M23 * m.M31) / determinant, (m.M11 * m.M33 * m.M44 + m.M31 * m.M43 * m.M14 + m.M41 * m.M13 * m.M34 - m.M14 * m.M33 * m.M41 - m.M34 * m.M43 * m.M11 - m.M44 * m.M13 * m.M31) / determinant, -(m.M11 * m.M23 * m.M44 + m.M21 * m.M43 * m.M14 + m.M41 * m.M13 * m.M24 - m.M14 * m.M23 * m.M41 - m.M24 * m.M43 * m.M11 - m.M44 * m.M13 * m.M21) / determinant, (m.M11 * m.M23 * m.M34 + m.M21 * m.M33 * m.M14 + m.M31 * m.M13 * m.M24 - m.M14 * m.M23 * m.M31 - m.M24 * m.M33 * m.M11 - m.M34 * m.M13 * m.M21) / determinant, (m.M21 * m.M32 * m.M44 + m.M31 * m.M42 * m.M24 + m.M41 * m.M22 * m.M34 - m.M24 * m.M32 * m.M41 - m.M34 * m.M42 * m.M21 - m.M44 * m.M22 * m.M31) / determinant, -(m.M11 * m.M32 * m.M44 + m.M31 * m.M42 * m.M14 + m.M41 * m.M12 * m.M34 - m.M14 * m.M32 * m.M41 - m.M34 * m.M42 * m.M11 - m.M44 * m.M12 * m.M31) / determinant, (m.M11 * m.M32 * m.M44 + m.M21 * m.M42 * m.M14 + m.M41 * m.M12 * m.M24 - m.M14 * m.M22 * m.M41 - m.M24 * m.M42 * m.M11 - m.M44 * m.M12 * m.M21) / determinant, -(m.M11 * m.M22 * m.M34 + m.M21 * m.M32 * m.M14 + m.M31 * m.M12 * m.M24 - m.M14 * m.M22 * m.M31 - m.M24 * m.M32 * m.M11 - m.M34 * m.M12 * m.M21) / determinant, -(m.M21 * m.M32 * m.M43 + m.M31 * m.M42 * m.M23 + m.M41 * m.M22 * m.M33 - m.M23 * m.M32 * m.M41 - m.M33 * m.M42 * m.M21 - m.M43 * m.M22 * m.M31) / determinant, (m.M11 * m.M32 * m.M43 + m.M31 * m.M42 * m.M13 + m.M41 * m.M12 * m.M33 - m.M13 * m.M32 * m.M41 - m.M33 * m.M42 * m.M11 - m.M43 * m.M12 * m.M31) / determinant, -(m.M11 * m.M22 * m.M43 + m.M21 * m.M42 * m.M13 + m.M41 * m.M12 * m.M23 - m.M13 * m.M22 * m.M41 - m.M23 * m.M42 * m.M11 - m.M43 * m.M12 * m.M21) / determinant, (m.M11 * m.M22 * m.M33 + m.M21 * m.M32 * m.M13 + m.M31 * m.M12 * m.M23 - m.M13 * m.M22 * m.M31 - m.M23 * m.M32 * m.M11 - m.M33 * m.M12 * m.M21) / determinant); - } - - public static Matrix3D operator +(Matrix3D a, Matrix3D b) - { - return new Matrix3D(a.M11 + b.M11, a.M12 + b.M12, a.M13 + b.M13, a.M14 + b.M14, a.M21 + b.M21, a.M22 + b.M22, a.M23 + b.M23, a.M24 + b.M24, a.M31 + b.M31, a.M32 + b.M32, a.M33 + b.M33, a.M34 + b.M34, a.M41 + b.M41, a.M42 + b.M42, a.M43 + b.M43, a.M44 + b.M44); - } - - public static Matrix3D operator -(Matrix3D a, Matrix3D b) - { - return new Matrix3D(a.M11 - b.M11, a.M12 - b.M12, a.M13 - b.M13, a.M14 - b.M14, a.M21 - b.M21, a.M22 - b.M22, a.M23 - b.M23, a.M24 - b.M24, a.M31 - b.M31, a.M32 - b.M32, a.M33 - b.M33, a.M34 - b.M34, a.M41 - b.M41, a.M42 - b.M42, a.M43 - b.M43, a.M44 - b.M44); - } - - public static Matrix3D operator *(Matrix3D a, Matrix3D b) - { - return new Matrix3D(a.M11 * b.M11 + a.M12 * b.M21 + a.M13 * b.M31 + a.M14 * b.M41, a.M11 * b.M12 + a.M12 * b.M22 + a.M13 * b.M32 + a.M14 * b.M42, a.M11 * b.M13 + a.M12 * b.M23 + a.M13 * b.M33 + a.M14 * b.M43, a.M11 * b.M14 + a.M12 * b.M24 + a.M13 * b.M34 + a.M14 * b.M44, a.M21 * b.M11 + a.M22 * b.M21 + a.M23 * b.M31 + a.M24 * b.M41, a.M21 * b.M12 + a.M22 * b.M22 + a.M23 * b.M32 + a.M24 * b.M42, a.M21 * b.M13 + a.M22 * b.M23 + a.M23 * b.M33 + a.M24 * b.M43, a.M21 * b.M14 + a.M22 * b.M24 + a.M23 * b.M34 + a.M24 * b.M44, a.M31 * b.M11 + a.M32 * b.M21 + a.M33 * b.M31 + a.M34 * b.M41, a.M31 * b.M12 + a.M32 * b.M22 + a.M33 * b.M32 + a.M34 * b.M42, a.M31 * b.M13 + a.M32 * b.M23 + a.M33 * b.M33 + a.M34 * b.M43, a.M31 * b.M14 + a.M32 * b.M24 + a.M33 * b.M34 + a.M34 * b.M44, a.M41 * b.M11 + a.M42 * b.M21 + a.M43 * b.M31 + a.M44 * b.M41, a.M41 * b.M12 + a.M42 * b.M22 + a.M43 * b.M32 + a.M44 * b.M42, a.M41 * b.M13 + a.M42 * b.M23 + a.M43 * b.M33 + a.M44 * b.M43, a.M41 * b.M14 + a.M42 * b.M24 + a.M43 * b.M34 + a.M44 * b.M44); - } - - public static Point3D operator *(Matrix3D m, Point3D p) - { - return new Point3D(p.X * m.M11 + p.Y * m.M12 + p.Z * m.M13 + m.M14, p.X * m.M21 + p.Y * m.M22 + p.Z * m.M23 + m.M24, p.X * m.M31 + p.Y * m.M32 + p.Z * m.M33 + m.M34); - } - - public static Matrix3D operator +(Matrix3D m, float n) - { - return new Matrix3D(m.M11 + n, m.M12 + n, m.M13 + n, m.M14 + n, m.M21 + n, m.M22 + n, m.M23 + n, m.M24 + n, m.M31 + n, m.M32 + n, m.M33 + n, m.M34 + n, m.M41 + n, m.M42 + n, m.M43 + n, m.M44 + n); - } - - public static Matrix3D operator -(Matrix3D m, float n) - { - return new Matrix3D(m.M11 - n, m.M12 - n, m.M13 - n, m.M14 - n, m.M21 - n, m.M22 - n, m.M23 - n, m.M24 - n, m.M31 - n, m.M32 - n, m.M33 - n, m.M34 - n, m.M41 - n, m.M42 - n, m.M43 - n, m.M44 - n); - } - - public static Matrix3D operator *(Matrix3D m, float n) - { - return new Matrix3D(m.M11 * n, m.M12 * n, m.M13 * n, m.M14 * n, m.M21 * n, m.M22 * n, m.M23 * n, m.M24 * n, m.M31 * n, m.M32 * n, m.M33 * n, m.M34 * n, m.M41 * n, m.M42 * n, m.M43 * n, m.M44 * n); - } - - public static Matrix3D operator /(Matrix3D m, float n) - { - return new Matrix3D(m.M11 / n, m.M12 / n, m.M13 / n, m.M14 / n, m.M21 / n, m.M22 / n, m.M23 / n, m.M24 / n, m.M31 / n, m.M32 / n, m.M33 / n, m.M34 / n, m.M41 / n, m.M42 / n, m.M43 / n, m.M44 / n); - } - - public float M11; - - public float M12; - - public float M13; - - public float M14; - - public float M21; - - public float M22; - - public float M23; - - public float M24; - - public float M31; - - public float M32; - - public float M33; - - public float M34; - - public float M41; - - public float M42; - - public float M43; - - public float M44; - } -} diff --git a/PCK-Studio/Classes/Models/ModelView.Designer.cs b/PCK-Studio/Classes/Models/ModelView.Designer.cs deleted file mode 100644 index bfedcec8..00000000 --- a/PCK-Studio/Classes/Models/ModelView.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ - -namespace PckStudio.Models -{ - partial class MinecraftModelView - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - - - - protected override void Dispose(bool disposing) - { - if (disposing && this.components != null) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - } - - - private PckStudio.Models.BackgroundTypes backgroundType; - - private System.Drawing.Brush backgroundBrush = new System.Drawing.SolidBrush(System.Drawing.Color.SkyBlue); - - private System.ComponentModel.BackgroundWorker downloader = new System.ComponentModel.BackgroundWorker(); - - private System.Drawing.Point mouseLastLocation; - - private PckStudio.Models.Object3D rotatingObject3D; - - private System.Drawing.Color backgroundColor = System.Drawing.Color.Transparent; - - private System.Drawing.Color backgroundGradientColor1 = System.Drawing.SystemColors.ControlDarkDark; - - private System.Drawing.Color backgroundGradientColor2 = System.Drawing.SystemColors.ControlLightLight; - - private static System.Drawing.Color textShadowColor = System.Drawing.Color.FromArgb(0x3F, 0x3F, 0x3F); - - private System.Drawing.Image backgroundTexture; - - internal PckStudio.Models.Matrix3D GlobalTransformation = PckStudio.Models.Matrix3D.Identity; - - private System.Collections.Generic.List texelList = new System.Collections.Generic.List(); - - private PckStudio.Models.TexelComparer texelComparer = new PckStudio.Models.TexelComparer(); - - private System.Collections.Generic.List object3DList = new System.Collections.Generic.List(); - - private System.Collections.Generic.List dynamicObject3DtList = new System.Collections.Generic.List(); - #endregion - } -} diff --git a/PCK-Studio/Classes/Models/ModelView.cs b/PCK-Studio/Classes/Models/ModelView.cs deleted file mode 100644 index 070e51ec..00000000 --- a/PCK-Studio/Classes/Models/ModelView.cs +++ /dev/null @@ -1,431 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Drawing.Text; -using System.IO; -using System.Net; -using System.Threading; -using System.Windows.Forms; - -namespace PckStudio.Models -{ - public partial class MinecraftModelView : Control - { - private const int IsometricFOV = 46; - - internal float cameraZ = 31.4285717f; - - private int Fov = 70; - - private float scale = 1f; - - internal float RotationX; - - internal float RotationY; - - private bool perspective = true; - - private float PiBy180 = 0.0174532924f; - - protected override void OnBackColorChanged(EventArgs e) - { - base.OnBackColorChanged(e); - backgroundColor = BackColor; - UpdateBackgroundBrush(); - Invalidate(); - } - - [Browsable(true)] - [Category("Appearance")] - public System.Drawing.Color BackGradientColor1 - { - get - { - return backgroundGradientColor1; - } - set - { - backgroundGradientColor1 = value; - UpdateBackgroundBrush(); - Invalidate(); - } - } - - [Browsable(true)] - [Category("Appearance")] - public System.Drawing.Color BackGradientColor2 - { - get - { - return backgroundGradientColor2; - } - set - { - backgroundGradientColor2 = value; - UpdateBackgroundBrush(); - Invalidate(); - } - } - - [Browsable(true)] - [Category("Appearance")] - public new System.Drawing.Image BackgroundImage - { - get - { - return backgroundTexture; - } - set - { - backgroundTexture = value; - UpdateBackgroundBrush(); - Invalidate(); - } - } - - [Browsable(true)] - [Category("Appearance")] - public BackgroundTypes BackgroundType - { - get - { - return backgroundType; - } - set - { - backgroundType = value; - UpdateBackgroundBrush(); - Invalidate(); - } - } - - [Browsable(true)] - [Category("View")] - public ProjectionTypes Projection - { - get - { - return perspective ? ProjectionTypes.Perspective : ProjectionTypes.Isometric; - } - set - { - perspective = value == ProjectionTypes.Perspective; - SetupProjection(); - foreach (Object3D object3D in object3DList) - { - object3D.Update(); - } - Invalidate(); - } - } - - [Browsable(true)] - [Category("View")] - public int FOV - { - get - { - return Fov; - } - set - { - Fov = value; - SetupProjection(); - foreach (Object3D object3D in object3DList) - { - object3D.Update(); - } - Invalidate(); - } - } - - [Browsable(true)] - [Category("View")] - public int DegreesX - { - get - { - return (int)RotationX; - } - set - { - RotationX = value; - Matrix3D globalTransformation = Matrix3D.CreateRotationX(RotationX * PiBy180) * Matrix3D.CreateRotationY(RotationY * PiBy180); - foreach (Object3D object3D in object3DList) - { - object3D.GlobalTransformation = globalTransformation; - } - Invalidate(); - } - } - - [Browsable(true)] - [Category("View")] - public int DegreesY - { - get - { - return (int)RotationY; - } - set - { - RotationY = value; - Matrix3D globalTransformation = Matrix3D.CreateRotationX(RotationX * PiBy180) * Matrix3D.CreateRotationY(RotationY * PiBy180); - foreach (Object3D object3D in object3DList) - { - object3D.GlobalTransformation = globalTransformation; - } - Invalidate(); - } - } - - public ModelBase Model - { - set - { - Clear(); - value.AddToModelView(this); - Matrix3D globalTransformation = Matrix3D.CreateRotationX(RotationX * 3.14159274f / 180f) * Matrix3D.CreateRotationY(RotationY * 3.14159274f / 180f); - foreach (Object3D object3D in object3DList) - { - object3D.GlobalTransformation = globalTransformation; - } - Invalidate(); - } - } - - private void Clear() - { - texelList.Clear(); - object3DList.Clear(); - dynamicObject3DtList.Clear(); - rotatingObject3D = null; - } - - protected override void OnPaintBackground(PaintEventArgs pevent) - { - base.OnPaintBackground(pevent); - System.Drawing.Graphics graphics = pevent.Graphics; - graphics.CompositingQuality = CompositingQuality.HighSpeed; - graphics.InterpolationMode = InterpolationMode.NearestNeighbor; - graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; - graphics.SmoothingMode = SmoothingMode.HighSpeed; - graphics.CompositingMode = CompositingMode.SourceCopy; - graphics.FillRectangle(backgroundBrush, ClientRectangle); - graphics.CompositingMode = CompositingMode.SourceOver; - } - - protected override void OnPaint(PaintEventArgs pe) - { - texelList.Sort(texelComparer); - System.Drawing.Graphics graphics = pe.Graphics; - graphics.TranslateTransform(Width / 2, Height / 2); - graphics.ScaleTransform(scale, -scale); - graphics.CompositingQuality = CompositingQuality.HighSpeed; - graphics.InterpolationMode = InterpolationMode.NearestNeighbor; - graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; - graphics.SmoothingMode = SmoothingMode.HighSpeed; - graphics.CompositingMode = CompositingMode.SourceCopy; - for (int i = 0; i < texelList.Count; i++) - { - texelList[i].Draw(graphics); - } - } - - public System.Drawing.Image RenderToImage(System.Drawing.Size size, System.Drawing.RectangleF crop) - { - if (size.Width / size.Height != crop.Width / crop.Height) - { - throw new ArgumentException("Aspect ratio is ambiguous"); - } - System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(size.Width, size.Height); - using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) - { - System.Drawing.Size size2 = new System.Drawing.Size((int)(size.Width / crop.Width), (int)(size.Height / crop.Height)); - texelList.Sort(texelComparer); - graphics.TranslateTransform(-crop.Left * size2.Width, -crop.Top * size2.Height); - graphics.TranslateTransform(size2.Width / 2, size2.Height / 2); - float num = Math.Min(size2.Width, size2.Height) * 0.01f / (float)Math.Tan((perspective ? Fov : IsometricFOV) * 3.1415926535897931 / 360.0); - graphics.ScaleTransform(num, -num); - graphics.CompositingQuality = CompositingQuality.HighSpeed; - graphics.InterpolationMode = InterpolationMode.NearestNeighbor; - graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; - graphics.SmoothingMode = SmoothingMode.HighSpeed; - graphics.Clear(System.Drawing.Color.Transparent); - for (int i = 0; i < texelList.Count; i++) - { - texelList[i].Draw(graphics); - } - } - return bitmap; - } - - private System.Drawing.Image RenderVersionText() - { - System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(0x154, 0x12); - Version version = new Version(Application.ProductVersion); - string s = string.Format("{0} {1}.{2}{3}", Application.ProductName, version.Major, version.Minor, (version.Build != 0) ? ("." + version.Build) : ""); - using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap)) - { - using (System.Drawing.Brush brush = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(0x7F, System.Drawing.Color.Gray))) - { - graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; - graphics.DrawString(s, Font, brush, 1f, 1f); - graphics.DrawString(s, Font, System.Drawing.Brushes.White, 0f, 0f); - } - } - return bitmap; - } - - private void UpdateBackgroundBrush() - { - backgroundBrush = ((backgroundType == BackgroundTypes.Texture) ? new System.Drawing.TextureBrush(backgroundTexture) : ((backgroundType == BackgroundTypes.Gradient) ? new System.Drawing.Drawing2D.LinearGradientBrush(new System.Drawing.Point(0, 0), new System.Drawing.Point(0, System.Math.Max(1, base.Height)), backgroundGradientColor1, backgroundGradientColor2) : new System.Drawing.SolidBrush(backgroundColor))); - } - - public System.Drawing.Brush GetBackgroundBrush(System.Drawing.Size size) - { - if (backgroundType == BackgroundTypes.Texture) - { - return new System.Drawing.TextureBrush(backgroundTexture); - } - if (backgroundType != BackgroundTypes.Gradient) - { - return new System.Drawing.SolidBrush(backgroundColor); - } - return new LinearGradientBrush(new System.Drawing.Point(0, 0), new System.Drawing.Point(0, Math.Max(1, size.Height)), backgroundGradientColor1, backgroundGradientColor2); - } - - private void SetupProjection() - { - cameraZ = 2400f / Fov; - scale = Math.Min(Width, Height) * 0.01f / (float)Math.Tan((perspective ? Fov : IsometricFOV) * Math.PI / 360.0); - } - - protected override void OnResize(EventArgs e) - { - SetupProjection(); - UpdateBackgroundBrush(); - base.OnResize(e); - } - - internal void RemoveTexelsOf(TexturePlane texturePlane) - { - for (int i = 0; i < texelList.Count; i++) - { - if (texelList[i].TexturePlane == texturePlane) - { - texelList.RemoveAt(i); - i--; - } - } - } - - internal void AddTexel(Texel texel) - { - texelList.Add(texel); - } - - protected override void OnMouseDown(MouseEventArgs e) - { - base.OnMouseDown(e); - System.Drawing.PointF location = new System.Drawing.PointF((e.X - Width * 0.5f) / scale, -(e.Y - Height * 0.5f) / scale); - rotatingObject3D = null; - Object3D item = null; - float num = -1000f; - foreach (Object3D object3D in object3DList) - { - float num2 = object3D.HitTest(location); - if (num2 > num) - { - num = num2; - item = object3D; - } - } - if (num > -1000f && dynamicObject3DtList.Contains(item)) - { - rotatingObject3D = item; - } - mouseLastLocation = e.Location; - Invalidate(); - } - - protected override void OnMouseUp(MouseEventArgs e) - { - base.OnMouseUp(e); - rotatingObject3D = null; - } - - protected override void OnMouseMove(MouseEventArgs e) - { - base.OnMouseMove(e); - if (e.Button != MouseButtons.Left) - { - return; - } - if (rotatingObject3D != null) - { - rotatingObject3D.RotateByMouse((e.X - mouseLastLocation.X) * 400f / Height, (e.Y - mouseLastLocation.Y) * 400f / Height); - mouseLastLocation = e.Location; - Invalidate(); - return; - } - RotationY += (e.X - mouseLastLocation.X) * 400f / Height; - RotationX += (e.Y - mouseLastLocation.Y) * 400f / Height; - mouseLastLocation = e.Location; - Matrix3D globalTransformation = Matrix3D.CreateRotationX(RotationX * 3.14159274f / 180f) * Matrix3D.CreateRotationY(RotationY * 3.14159274f / 180f); - foreach (Object3D object3D in object3DList) - { - object3D.GlobalTransformation = globalTransformation; - } - Invalidate(); - } - - public void AddStatic(Object3D object3D) - { - object3D.Viewport = this; - object3DList.Add(object3D); - foreach (Object3D object3D2 in object3DList) - { - object3D2.Update(); - } - } - - public void AddDynamic(Object3D object3D) - { - AddStatic(object3D); - dynamicObject3DtList.Add(object3D); - } - - internal System.Drawing.PointF Point3DTo2D(Point3D point3D) - { - if (perspective) - { - return new System.Drawing.PointF(point3D.X * (-50f / (point3D.Z - cameraZ)), point3D.Y * (-50f / (point3D.Z - cameraZ))); - } - return new System.Drawing.PointF(point3D.X, point3D.Y); - } - - internal float GetZOrder(Point3D point3D) - { - if (perspective) - { - return point3D.X * point3D.X + point3D.Y * point3D.Y + (cameraZ - point3D.Z) * (cameraZ - point3D.Z); - } - return -point3D.Z; - } - - public MinecraftModelView() - { - SetStyle(ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); - InitializeComponent(); - texelComparer = new TexelComparer(); - } - - public MinecraftModelView(IContainer container) : this() - { - container.Add(this); - } - } -} diff --git a/PCK-Studio/Classes/Models/Object3D.cs b/PCK-Studio/Classes/Models/Object3D.cs deleted file mode 100644 index f9aa9f6a..00000000 --- a/PCK-Studio/Classes/Models/Object3D.cs +++ /dev/null @@ -1,461 +0,0 @@ -using System; -using System.Drawing; - -namespace PckStudio.Models -{ - public abstract class Object3D - { - public abstract Image Image { set; } - - public float Angle1 - { - get - { - return angle1; - } - set - { - angle1 = value; - OnUpdateRotation(); - } - } - - public float Angle2 - { - get - { - return angle2; - } - set - { - angle2 = value; - OnUpdateRotation(); - } - } - - public float MinAngle1 - { - get - { - return minAngle1; - } - set - { - minAngle1 = value; - } - } - - public float MinAngle2 - { - get - { - return minAngle2; - } - set - { - minAngle2 = value; - } - } - - public float MaxAngle1 - { - get - { - return maxAngle1; - } - set - { - maxAngle1 = value; - } - } - - public float MaxAngle2 - { - get - { - return maxAngle2; - } - set - { - maxAngle2 = value; - } - } - - public float AngleRange1 - { - get - { - return maxAngle1 - minAngle1; - } - set - { - minAngle1 = angle1 - value / 2f; - maxAngle1 = angle1 + value / 2f; - } - } - - public float AngleRange2 - { - get - { - return maxAngle2 - minAngle2; - } - set - { - minAngle2 = angle2 - value / 2f; - maxAngle2 = angle2 + value / 2f; - } - } - - public float MinDegrees1 - { - get - { - return minAngle1 / PIby180; - } - set - { - minAngle1 = value * PIby180; - } - } - - public float MinDegrees2 - { - get - { - return minAngle2 / PIby180; - } - set - { - minAngle2 = value * PIby180; - } - } - - public float MaxDegrees1 - { - get - { - return maxAngle1 / PIby180; - } - set - { - maxAngle1 = value * PIby180; - } - } - - public float MaxDegrees2 - { - get - { - return maxAngle2 / PIby180; - } - set - { - maxAngle2 = value * PIby180; - } - } - - public float DegreesRange1 - { - get - { - return AngleRange1 / PIby180; - } - set - { - AngleRange1 = value * PIby180; - } - } - - public float DegreesRange2 - { - get - { - return AngleRange2 / PIby180; - } - set - { - AngleRange2 = value * PIby180; - } - } - - public float Scale - { - get - { - return scaleTransformation.M11; - } - set - { - scaleTransformation = Matrix3D.CreateScale(value); - UpdateRotation(); - } - } - - public RotationOrders RotationOrder - { - get - { - return order; - } - set - { - order = value; - switch (order) - { - case RotationOrders.XY: - Rotate = new RotateMethod(RotateXY); - OnUpdateRotation = UpdateRotationXY; - return; - case RotationOrders.YX: - Rotate = new RotateMethod(RotateYX); - OnUpdateRotation = UpdateRotationYX; - return; - case RotationOrders.XZ: - Rotate = new RotateMethod(RotateXZ); - OnUpdateRotation = UpdateRotationXZ; - return; - case RotationOrders.ZX: - Rotate = new RotateMethod(RotateZX); - OnUpdateRotation = UpdateRotationZX; - return; - case RotationOrders.YZ: - Rotate = new RotateMethod(RotateYZ); - OnUpdateRotation = UpdateRotationYZ; - return; - case RotationOrders.ZY: - Rotate = new RotateMethod(RotateZY); - OnUpdateRotation = UpdateRotationZY; - return; - default: - return; - } - } - } - - internal virtual MinecraftModelView Viewport - { - set - { - viewport = value; - } - } - - public Point3D Origin - { - get - { - return new Point3D(-originTranslation.M14, -originTranslation.M24, -originTranslation.M34); - } - set - { - originTranslation = Matrix3D.CreateTranslation(-value.X, -value.Y, -value.Z); - UpdateRotation(); - } - } - - public Point3D Position - { - get - { - return new Point3D(positionTranslation.M14, positionTranslation.M24, positionTranslation.M34); - } - set - { - positionTranslation = Matrix3D.CreateTranslation(value); - UpdateRotation(); - Update(); - } - } - - internal abstract void Update(); - - public Matrix3D GlobalTransformation - { - get - { - return globalTransformation; - } - set - { - globalTransformation = value; - Update(); - } - } - - public Matrix3D LocalTransformation - { - get - { - return localTransformation; - } - set - { - localTransformation = value; - Update(); - } - } - - public void SetRotation(float angle1, float angle2) - { - this.angle1 = angle1; - this.angle2 = angle2; - OnUpdateRotation(); - } - - public void RotateByMouse(float deltaX, float deltaY) - { - if (Rotate != null) - { - Rotate(deltaX, deltaY); - Update(); - } - } - - private void CorrectAngles() - { - if (angle1 > maxAngle1) - { - angle1 = maxAngle1; - } - else if (angle1 < minAngle1) - { - angle1 = minAngle1; - } - if (angle2 > maxAngle2) - { - angle2 = maxAngle2; - return; - } - if (angle2 < minAngle2) - { - angle2 = minAngle2; - } - } - - public abstract float HitTest(PointF location); - - private void RotateXY(float delta1, float delta2) - { - angle1 += delta1 * PIby180; - angle2 += delta2 * PIby180 * (float)Math.Cos((double)(viewport.RotationY * PIby180)); - UpdateRotationXY(); - } - - private void RotateYX(float delta1, float delta2) - { - angle1 += delta1 * PIby180; - angle2 += delta2 * PIby180 * (float)Math.Cos(viewport.RotationY * 3.1415926535897931 / 180.0); - UpdateRotationYX(); - } - - private void RotateXZ(float delta1, float delta2) - { - angle1 += delta1 * PIby180 * (float)Math.Cos((double)(viewport.RotationY * PIby180)) + delta2 * PIby180 * (float)Math.Sin((double)(viewport.RotationY * PIby180)); - angle2 += delta2 * PIby180 * (float)Math.Cos((double)(viewport.RotationY * PIby180)) - delta1 * PIby180 * (float)Math.Sin((double)(viewport.RotationY * PIby180)); - UpdateRotationXZ(); - } - - private void RotateZX(float delta1, float delta2) - { - angle1 += delta1 * PIby180 * (float)Math.Cos((double)(viewport.RotationY * PIby180)) + delta2 * PIby180 * (float)Math.Sin((double)(viewport.RotationY * PIby180)); - angle2 += delta2 * PIby180 * (float)Math.Cos((double)(viewport.RotationY * PIby180)) - delta1 * PIby180 * (float)Math.Sin((double)(viewport.RotationY * PIby180)); - UpdateRotationZX(); - } - - private void RotateZY(float delta1, float delta2) - { - angle1 -= delta2 * PIby180; - angle2 += delta1 * PIby180; - UpdateRotationZY(); - } - - private void RotateYZ(float delta1, float delta2) - { - angle1 += delta1 * PIby180; - angle2 += delta2 * PIby180 * (float)Math.Sin((double)(viewport.RotationY * PIby180)); - UpdateRotationYZ(); - } - - private void UpdateRotationXY() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationY(angle1) * Matrix3D.CreateRotationX(angle2); - UpdateRotation(); - } - - private void UpdateRotationYX() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationX(angle2) * Matrix3D.CreateRotationY(angle1); - UpdateRotation(); - } - - private void UpdateRotationXZ() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationZ(angle1) * Matrix3D.CreateRotationX(angle2); - UpdateRotation(); - } - - private void UpdateRotationZX() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationX(angle2) * Matrix3D.CreateRotationZ(angle1); - UpdateRotation(); - } - - private void UpdateRotationZY() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationY(angle2) * Matrix3D.CreateRotationZ(angle1); - UpdateRotation(); - } - - private void UpdateRotationYZ() - { - CorrectAngles(); - localRotation = Matrix3D.CreateRotationZ(angle2) * Matrix3D.CreateRotationY(angle1); - UpdateRotation(); - } - - private void UpdateRotation() - { - localTransformation = positionTranslation * localRotation * originTranslation * scaleTransformation; - } - - public const float PIby180 = 0.0174532924f; - - protected Matrix3D originTranslation = Matrix3D.Identity; - - protected Matrix3D positionTranslation = Matrix3D.Identity; - - protected Matrix3D scaleTransformation = Matrix3D.Identity; - - protected Matrix3D localRotation = Matrix3D.Identity; - - protected Matrix3D localTransformation = Matrix3D.Identity; - - protected Matrix3D globalTransformation = Matrix3D.Identity; - - private float angle1; - - private float angle2; - - private float maxAngle1 = (float)Math.PI; - private float minAngle1 = (float)-Math.PI; - - private float maxAngle2 = (float)Math.PI; - private float minAngle2 = (float)-Math.PI; - - private RotationOrders order; - - protected MinecraftModelView viewport; - - private RotateMethod Rotate; - - private Action OnUpdateRotation; - - private delegate void RotateMethod(float deltaX, float deltaY); - } -} diff --git a/PCK-Studio/Classes/Models/Object3DGroup.cs b/PCK-Studio/Classes/Models/Object3DGroup.cs deleted file mode 100644 index fc3cd524..00000000 --- a/PCK-Studio/Classes/Models/Object3DGroup.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PckStudio.Models -{ - public class Object3DGroup : Object3D - { - internal override MinecraftModelView Viewport - { - set - { - base.Viewport = value; - foreach (Object3D object3D in objects) - { - object3D.Viewport = value; - } - } - } - - public override System.Drawing.Image Image - { - set - { - foreach (Object3D object3D in objects) - { - object3D.Image = value; - } - } - } - - internal override void Update() - { - Matrix3D globalTransformation = this.globalTransformation * localTransformation; - for (int i = 0; i < objects.Count; i++) - { - objects[i].GlobalTransformation = globalTransformation; - } - } - - public override float HitTest(System.Drawing.PointF location) - { - float num = -1000f; - foreach (Object3D object3D in objects) - { - float num2 = object3D.HitTest(location); - if (num2 > num) - { - num = num2; - } - } - return num; - } - - public void Add(Object3D object3D) - { - if (object3D == this) - { - throw new ArgumentException("Cannot add Object3D into itself."); - } - objects.Add(object3D); - } - - private List objects = new List(); - } -} diff --git a/PCK-Studio/Classes/Models/Point3D.cs b/PCK-Studio/Classes/Models/Point3D.cs deleted file mode 100644 index e69ebf0b..00000000 --- a/PCK-Studio/Classes/Models/Point3D.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public struct Point3D - { - public float X; - public float Y; - public float Z; - - public Point3D(float x, float y, float z) - { - (X, Y, Z) = (x, y, z); - } - - public static Point3D Zero => default(Point3D); - - public override string ToString() - { - return string.Format("({0};{1};{2})", X, Y, Z); - } - - public static Point3D operator +(Point3D a, Point3D b) => new Point3D(a.X + b.X, a.Y + b.Y, a.Z + b.Z); - - public static Point3D operator -(Point3D a, Point3D b) => new Point3D(a.X - b.X, a.Y - b.Y, a.Z - b.Z); - - public static Point3D operator *(Point3D p, float s) => new Point3D(p.X * s, p.Y * s, p.Z * s); - - public static Point3D operator /(Point3D p, float s) => new Point3D(p.X / s, p.Y / s, p.Z / s); - } -} diff --git a/PCK-Studio/Classes/Models/Positions.cs b/PCK-Studio/Classes/Models/Positions.cs deleted file mode 100644 index 004ba901..00000000 --- a/PCK-Studio/Classes/Models/Positions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public enum Positions - { - Default, - Outstretched, - Walking, - Running, - Sitting, - Zombie - } -} diff --git a/PCK-Studio/Classes/Models/ProjectionTypes.cs b/PCK-Studio/Classes/Models/ProjectionTypes.cs deleted file mode 100644 index 04d81550..00000000 --- a/PCK-Studio/Classes/Models/ProjectionTypes.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public enum ProjectionTypes : byte - { - Perspective, - Isometric - } -} diff --git a/PCK-Studio/Classes/Models/RotationOrders.cs b/PCK-Studio/Classes/Models/RotationOrders.cs deleted file mode 100644 index 0ca2c041..00000000 --- a/PCK-Studio/Classes/Models/RotationOrders.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - public enum RotationOrders : byte - { - XY, - YX, - XZ, - ZX, - YZ, - ZY - } -} diff --git a/PCK-Studio/Classes/Models/Texel.cs b/PCK-Studio/Classes/Models/Texel.cs deleted file mode 100644 index 736bcb21..00000000 --- a/PCK-Studio/Classes/Models/Texel.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; - -namespace PckStudio.Models -{ - internal struct Texel - { - internal Texel(TexturePlane texturePlane, int x, int y, System.Drawing.Color color) - { - TexturePlane = texturePlane; - X = x; - Y = y; - this.color = color; - brush = new System.Drawing.SolidBrush(color); - pen = new System.Drawing.Pen(System.Drawing.Color.White, 0.01f); - } - - internal double Z - { - get - { - return TexturePlane.ZOrder[X + 1, Y + 1]; - } - } - - internal void Draw(System.Drawing.Graphics g) - { - System.Drawing.PointF[] points = new System.Drawing.PointF[] - { - TexturePlane.Points[X, Y], - TexturePlane.Points[X + 1, Y], - TexturePlane.Points[X + 1, Y + 1], - TexturePlane.Points[X, Y + 1] - }; - g.FillPolygon(brush, points); - } - - internal TexturePlane TexturePlane; - - internal int X; - - internal int Y; - - private System.Drawing.Color color; - - private System.Drawing.Brush brush; - - private System.Drawing.Pen pen; - } -} diff --git a/PCK-Studio/Classes/Models/TexelComparer.cs b/PCK-Studio/Classes/Models/TexelComparer.cs deleted file mode 100644 index d7187760..00000000 --- a/PCK-Studio/Classes/Models/TexelComparer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PckStudio.Models -{ - internal class TexelComparer : IComparer - { - public int Compare(Texel x, Texel y) - { - return -x.Z.CompareTo(y.Z); - } - - public TexelComparer() - { - } - } -} diff --git a/PCK-Studio/Classes/Models/TexturePlane.cs b/PCK-Studio/Classes/Models/TexturePlane.cs deleted file mode 100644 index 0b7b7edf..00000000 --- a/PCK-Studio/Classes/Models/TexturePlane.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Drawing; - -namespace PckStudio.Models -{ - public class TexturePlane : Object3D - { - public override Image Image - { - set - { - Bitmap = (Bitmap)value; - } - } - - internal override MinecraftModelView Viewport - { - set - { - base.Viewport = value; - if (bitmap != null && value != null) - { - UpdateBitmap(); - } - } - } - - internal override void Update() - { - if (Points == null || viewport == null) - { - return; - } - Matrix3D m = globalTransformation * localTransformation * originTranslation; - for (int i = 0; i <= width; i++) - { - for (int j = 0; j <= height; j++) - { - Point3D point3D = m * new Point3D(i, j, 0f); - Points[i, j] = viewport.Point3DTo2D(point3D); - double num = (double)viewport.GetZOrder(point3D); - ZOrder[i, j] += num; - ZOrder[i + 1, j] += num; - ZOrder[i, j + 1] += num; - ZOrder[i + 1, j + 1] = num; - } - } - } - - private Bitmap Bitmap - { - set - { - if (viewport == null) - { - bitmap = value; - return; - } - texelList.Clear(); - if (bitmap != null) - { - viewport.RemoveTexelsOf(this); - Points = null; - } - bitmap = value; - if (bitmap != null) - { - UpdateBitmap(); - Update(); - } - } - } - - private void UpdateBitmap() - { - width = bitmap.Width; - height = bitmap.Height; - visibility = new bool[width, height]; - for (int i = 0; i < width; i++) - { - for (int j = 0; j < height; j++) - { - Color pixel = bitmap.GetPixel(i, j); - int num = flipHorizontally ? (width - i - 1) : i; - int num2 = flipVertically ? j : (height - j - 1); - if (pixel.A == 0) - { - visibility[num, num2] = false; - } - else - { - visibility[num, num2] = true; - Texel texel = new Texel(this, num, num2, pixel); - viewport.AddTexel(texel); - texelList.Add(texel); - } - } - } - Points = new PointF[width + 1, height + 1]; - ZOrder = new double[width + 2, height + 2]; - } - - public TexturePlane(Image bitmap, Rectangle srcRect, Point3D origin, Point3D normal, Effects effects) - { - Origin = origin; - this.normal = normal; - if (bitmap == null) - { - Bitmap = null; - return; - } - Bitmap bitmap2 = new Bitmap(srcRect.Width, srcRect.Height); - using (Graphics graphics = Graphics.FromImage(bitmap2)) - { - graphics.DrawImage(bitmap, new Rectangle(0, 0, bitmap2.Width, bitmap2.Height), srcRect, GraphicsUnit.Pixel); - } - flipHorizontally = (byte)(effects & Effects.FlipHorizontally) == 1; - flipVertically = (byte)(effects & Effects.FlipVertically) == 2; - Bitmap = bitmap2; - } - - public override float HitTest(PointF location) - { - if (Points == null) - { - return -1000f; - } - GraphicsPath graphicsPath = new GraphicsPath(); - graphicsPath.AddPolygon(new PointF[] - { - Points[0, 0], - Points[Points.GetLength(0) - 1, 0], - Points[Points.GetLength(0) - 1, Points.GetLength(1) - 1], - Points[0, Points.GetLength(1) - 1] - }); - Region region = new Region(graphicsPath); - if (region.IsVisible(location)) - { - for (int i = 0; i < Points.GetLength(0) - 1; i++) - { - for (int j = 0; j < Points.GetLength(1) - 1; j++) - { - if (visibility[i, j]) - { - graphicsPath.Reset(); - graphicsPath.AddPolygon(new PointF[] - { - Points[i, j], - Points[i + 1, j], - Points[i + 1, j + 1], - Points[i, j + 1] - }); - if (graphicsPath.IsVisible(location)) - { - return (globalTransformation * localTransformation * originTranslation * new Point3D(i, j, 0f)).Z; - } - } - } - } - } - return -1000f; - } - - private List texelList = new List(); - - internal PointF[,] Points; - - internal double[,] ZOrder; - - internal bool IsVisible = true; - - private bool[,] visibility; - - private Bitmap bitmap; - - private bool flipHorizontally; - - private bool flipVertically; - - private int width; - - private int height; - - private Point3D normal; - } -} diff --git a/PCK-Studio/Controls/CustomTabControl.cs b/PCK-Studio/Controls/CustomTabControl.cs new file mode 100644 index 00000000..a9e09f03 --- /dev/null +++ b/PCK-Studio/Controls/CustomTabControl.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Windows.Forms; + +using MetroFramework.Controls; +using MetroFramework.Drawing; + + +namespace PckStudio.Controls +{ + internal class CustomTabControl : MetroTabControl + { + private const string CloseChar = "×"; + private Size CloseButtonSize = new Size(7, 7); + private const int StartIndex = 1; + + [Browsable(true)] + public event EventHandler PageClosing; + + public CustomTabControl() + : base() + { + } + + private Rectangle GetCloseButtonArea(Rectangle tabArea) + { + Size closeBtnSz = CloseButtonSize; + var closeBtnPt = new Point( + tabArea.Right - closeBtnSz.Width, + tabArea.Top + 2 + (tabArea.Height - closeBtnSz.Height) / 2); + return new Rectangle(closeBtnPt, closeBtnSz); + } + + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + if (SelectedIndex < StartIndex) + return; + Rectangle tabArea = GetTabRect(SelectedIndex); + Rectangle buttonArea = GetCloseButtonArea(tabArea); + if (buttonArea.Contains(e.Location)) + { + var eventArg = new PageClosingEventArgs(TabPages[SelectedIndex]); + PageClosing?.Invoke(this, eventArg); + if (!eventArg.Cancel) + { + SelectedIndex -= 1; + TabPages.RemoveAt(SelectedIndex + 1); + } + } + } + + protected override void OnCustomPaintForeground(MetroPaintEventArgs e) + { + base.OnCustomPaintForeground(e); + if (SelectedIndex < StartIndex) + return; + // Draw Close button + Rectangle tabArea = GetTabRect(SelectedIndex); + + Rectangle buttonArea = GetCloseButtonArea(tabArea); + + e.Graphics.FillRectangle(MetroPaint.GetStyleBrush(Style), buttonArea); + e.Graphics.DrawString( + CloseChar, + Font, + new SolidBrush(MetroPaint.ForeColor.Title(Theme)), + buttonArea.Right - buttonArea.Width - 2, buttonArea.Top - 4); + } + + //protected override void OnPaintForeground(PaintEventArgs e) + //{ + // base.OnPaintForeground(e); + // for (int i = StartIndex; i < TabPages.Count; i++) + // { + // // Draw Close button + // Rectangle tabArea = GetTabRect(i); + + // Rectangle buttonArea = GetCloseButtonArea(tabArea); + + // e.Graphics.FillRectangle(MetroPaint.GetStyleBrush(Style), buttonArea); + // e.Graphics.DrawString( + // CloseChar, + // Font, + // new SolidBrush(MetroPaint.ForeColor.Title(Theme)), + // buttonArea.Right - buttonArea.Width - 2, buttonArea.Top - 4); + // } + //} + } +} \ No newline at end of file diff --git a/PCK-Studio/Controls/EditorControl.cs b/PCK-Studio/Controls/EditorControl.cs new file mode 100644 index 00000000..6a7259fa --- /dev/null +++ b/PCK-Studio/Controls/EditorControl.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using PckStudio.Interfaces; + +namespace PckStudio.Controls +{ + internal class EditorControl : UserControl, IEditor where T : class + { + public T EditorValue { get; } + + public ISaveContext SaveContext { get; } + + public EditorControl() + { + } + + protected EditorControl(T value, ISaveContext saveContext) + { + _ = value ?? throw new ArgumentNullException(nameof(value)); + EditorValue = value; + SaveContext = saveContext; + } + + protected override void OnControlRemoved(ControlEventArgs e) + { + if (SaveContext.AutoSave) + Save(); + base.OnControlRemoved(e); + } + + public void Save() => SaveContext.Save(EditorValue); + + public virtual void SaveAs() => throw new NotImplementedException(); + + public virtual void Close() => throw new NotImplementedException(); + + public virtual void UpdateView() => throw new NotImplementedException(); + } +} diff --git a/PCK-Studio/Controls/EditorForm.cs b/PCK-Studio/Controls/EditorForm.cs new file mode 100644 index 00000000..e492f697 --- /dev/null +++ b/PCK-Studio/Controls/EditorForm.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using MetroFramework.Forms; +using PckStudio.Interfaces; + +namespace PckStudio.Controls +{ + public class EditorForm : MetroForm where T : class + { + protected T EditorValue; + private readonly ISaveContext SaveContext; + + private EditorForm() + { + } + + protected EditorForm(T value, ISaveContext saveContext) + { + _ = value ?? throw new ArgumentNullException(nameof(value)); + EditorValue = value; + SaveContext = saveContext; + } + + protected void Save() => SaveContext.Save(EditorValue); + + protected override void OnFormClosing(FormClosingEventArgs e) + { + if (SaveContext.AutoSave) + Save(); + base.OnFormClosing(e); + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Controls/PageClosingEventArgs.cs b/PCK-Studio/Controls/PageClosingEventArgs.cs new file mode 100644 index 00000000..ac8de3a4 --- /dev/null +++ b/PCK-Studio/Controls/PageClosingEventArgs.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PckStudio.Controls +{ + internal class PageClosingEventArgs : CancelEventArgs + { + private readonly TabPage page; + public TabPage Page => page; + + public PageClosingEventArgs(TabPage page) + : base() + { + this.page = page; + } + } +} diff --git a/PCK-Studio/Controls/PckEditor.Designer.cs b/PCK-Studio/Controls/PckEditor.Designer.cs new file mode 100644 index 00000000..a5351572 --- /dev/null +++ b/PCK-Studio/Controls/PckEditor.Designer.cs @@ -0,0 +1,824 @@ +using System.Windows.Forms; + +namespace PckStudio.Controls +{ + partial class PckEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.PictureBox logoPictureBox; + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PckEditor)); + this.pckFileLabel = new MetroFramework.Controls.MetroLabel(); + this.labelImageSize = new MetroFramework.Controls.MetroLabel(); + this.fileEntryCountLabel = new MetroFramework.Controls.MetroLabel(); + this.PropertiesTabControl = new MetroFramework.Controls.MetroTabControl(); + this.MetaTab = new MetroFramework.Controls.MetroTabPage(); + this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); + this.entryTypeTextBox = new MetroFramework.Controls.MetroTextBox(); + this.entryDataTextBox = new MetroFramework.Controls.MetroTextBox(); + this.buttonEdit = new MetroFramework.Controls.MetroButton(); + this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); + this.treeMeta = new System.Windows.Forms.TreeView(); + this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addBOXEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addANIMEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.addMultipleEntriesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editAllEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label11 = new MetroFramework.Controls.MetroLabel(); + this.treeViewMain = new System.Windows.Forms.TreeView(); + this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.skinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createAnimatedTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.audiopckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.colourscolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CreateSkinsPCKToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.behavioursbinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.entityMaterialsbinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importSkinsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importSkinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importExtractedSkinsFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.as3DSTextureFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setFileTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.skinToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.capeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.textureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.languagesFileLOCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gameRulesFileGRFToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.audioPCKFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.coloursCOLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gameRulesHeaderGRHToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.skinsPCKToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.modelsFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.behavioursFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.entityMaterialsFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.miscFunctionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateMipMapTextureToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.viewFileInfoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.correctSkinDecimalsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setSubPCKEndiannessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bigEndianXbox360PS3WiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.littleEndianPS4PSVitaSwitchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setModelContainerFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.version1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.version2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.version3114ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extractToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.cloneFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.renameFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imageList = new System.Windows.Forms.ImageList(this.components); + this.addMultipleEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); + this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); + logoPictureBox = new System.Windows.Forms.PictureBox(); + ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit(); + this.PropertiesTabControl.SuspendLayout(); + this.MetaTab.SuspendLayout(); + this.contextMenuMetaTree.SuspendLayout(); + this.contextMenuPCKEntries.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // logoPictureBox + // + resources.ApplyResources(logoPictureBox, "logoPictureBox"); + logoPictureBox.Name = "logoPictureBox"; + logoPictureBox.TabStop = false; + // + // pckFileLabel + // + this.pckFileLabel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + resources.ApplyResources(this.pckFileLabel, "pckFileLabel"); + this.pckFileLabel.Name = "pckFileLabel"; + this.pckFileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // labelImageSize + // + resources.ApplyResources(this.labelImageSize, "labelImageSize"); + this.labelImageSize.Name = "labelImageSize"; + this.labelImageSize.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // fileEntryCountLabel + // + resources.ApplyResources(this.fileEntryCountLabel, "fileEntryCountLabel"); + this.fileEntryCountLabel.Name = "fileEntryCountLabel"; + this.fileEntryCountLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // PropertiesTabControl + // + this.PropertiesTabControl.Controls.Add(this.MetaTab); + resources.ApplyResources(this.PropertiesTabControl, "PropertiesTabControl"); + this.PropertiesTabControl.Name = "PropertiesTabControl"; + this.PropertiesTabControl.SelectedIndex = 0; + this.PropertiesTabControl.Style = MetroFramework.MetroColorStyle.Silver; + this.PropertiesTabControl.Theme = MetroFramework.MetroThemeStyle.Dark; + this.PropertiesTabControl.UseSelectable = true; + // + // MetaTab + // + this.MetaTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); + this.MetaTab.Controls.Add(this.metroLabel2); + this.MetaTab.Controls.Add(this.entryTypeTextBox); + this.MetaTab.Controls.Add(this.entryDataTextBox); + this.MetaTab.Controls.Add(this.buttonEdit); + this.MetaTab.Controls.Add(this.metroLabel1); + this.MetaTab.Controls.Add(this.treeMeta); + this.MetaTab.HorizontalScrollbarBarColor = true; + this.MetaTab.HorizontalScrollbarHighlightOnWheel = false; + this.MetaTab.HorizontalScrollbarSize = 10; + resources.ApplyResources(this.MetaTab, "MetaTab"); + this.MetaTab.Name = "MetaTab"; + this.MetaTab.Theme = MetroFramework.MetroThemeStyle.Dark; + this.MetaTab.VerticalScrollbarBarColor = true; + this.MetaTab.VerticalScrollbarHighlightOnWheel = false; + this.MetaTab.VerticalScrollbarSize = 10; + // + // metroLabel2 + // + resources.ApplyResources(this.metroLabel2, "metroLabel2"); + this.metroLabel2.Name = "metroLabel2"; + this.metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // entryTypeTextBox + // + resources.ApplyResources(this.entryTypeTextBox, "entryTypeTextBox"); + // + // + // + this.entryTypeTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image"))); + this.entryTypeTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode"))); + this.entryTypeTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location"))); + this.entryTypeTextBox.CustomButton.Name = ""; + this.entryTypeTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size"))); + this.entryTypeTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.entryTypeTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex"))); + this.entryTypeTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.entryTypeTextBox.CustomButton.UseSelectable = true; + this.entryTypeTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible"))); + this.entryTypeTextBox.Lines = new string[0]; + this.entryTypeTextBox.MaxLength = 32767; + this.entryTypeTextBox.Name = "entryTypeTextBox"; + this.entryTypeTextBox.PasswordChar = '\0'; + this.entryTypeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.entryTypeTextBox.SelectedText = ""; + this.entryTypeTextBox.SelectionLength = 0; + this.entryTypeTextBox.SelectionStart = 0; + this.entryTypeTextBox.ShortcutsEnabled = true; + this.entryTypeTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.entryTypeTextBox.UseSelectable = true; + this.entryTypeTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.entryTypeTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // entryDataTextBox + // + resources.ApplyResources(this.entryDataTextBox, "entryDataTextBox"); + // + // + // + this.entryDataTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image1"))); + this.entryDataTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode1"))); + this.entryDataTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location1"))); + this.entryDataTextBox.CustomButton.Name = ""; + this.entryDataTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size1"))); + this.entryDataTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; + this.entryDataTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex1"))); + this.entryDataTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; + this.entryDataTextBox.CustomButton.UseSelectable = true; + this.entryDataTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible1"))); + this.entryDataTextBox.Lines = new string[0]; + this.entryDataTextBox.MaxLength = 32767; + this.entryDataTextBox.Name = "entryDataTextBox"; + this.entryDataTextBox.PasswordChar = '\0'; + this.entryDataTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; + this.entryDataTextBox.SelectedText = ""; + this.entryDataTextBox.SelectionLength = 0; + this.entryDataTextBox.SelectionStart = 0; + this.entryDataTextBox.ShortcutsEnabled = true; + this.entryDataTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.entryDataTextBox.UseSelectable = true; + this.entryDataTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); + this.entryDataTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); + // + // buttonEdit + // + resources.ApplyResources(this.buttonEdit, "buttonEdit"); + this.buttonEdit.Name = "buttonEdit"; + this.buttonEdit.Theme = MetroFramework.MetroThemeStyle.Dark; + this.buttonEdit.UseSelectable = true; + this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click); + // + // metroLabel1 + // + resources.ApplyResources(this.metroLabel1, "metroLabel1"); + this.metroLabel1.Name = "metroLabel1"; + this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // treeMeta + // + this.treeMeta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); + this.treeMeta.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeMeta.ContextMenuStrip = this.contextMenuMetaTree; + resources.ApplyResources(this.treeMeta, "treeMeta"); + this.treeMeta.ForeColor = System.Drawing.SystemColors.Window; + this.treeMeta.Name = "treeMeta"; + this.treeMeta.PathSeparator = "/"; + this.treeMeta.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMeta_AfterSelect); + this.treeMeta.DoubleClick += new System.EventHandler(this.treeMeta_DoubleClick); + this.treeMeta.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeMeta_KeyDown); + // + // contextMenuMetaTree + // + this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addEntryToolStripMenuItem, + this.addMultipleEntriesToolStripMenuItem1, + this.deleteEntryToolStripMenuItem, + this.editAllEntriesToolStripMenuItem}); + this.contextMenuMetaTree.Name = "contextMenuStrip1"; + resources.ApplyResources(this.contextMenuMetaTree, "contextMenuMetaTree"); + // + // addEntryToolStripMenuItem + // + this.addEntryToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addEntryToolStripMenuItem1, + this.addBOXEntryToolStripMenuItem1, + this.addANIMEntryToolStripMenuItem1}); + resources.ApplyResources(this.addEntryToolStripMenuItem, "addEntryToolStripMenuItem"); + this.addEntryToolStripMenuItem.Name = "addEntryToolStripMenuItem"; + // + // addEntryToolStripMenuItem1 + // + this.addEntryToolStripMenuItem1.Name = "addEntryToolStripMenuItem1"; + resources.ApplyResources(this.addEntryToolStripMenuItem1, "addEntryToolStripMenuItem1"); + this.addEntryToolStripMenuItem1.Click += new System.EventHandler(this.addEntryToolStripMenuItem_Click); + // + // addBOXEntryToolStripMenuItem1 + // + this.addBOXEntryToolStripMenuItem1.Name = "addBOXEntryToolStripMenuItem1"; + resources.ApplyResources(this.addBOXEntryToolStripMenuItem1, "addBOXEntryToolStripMenuItem1"); + this.addBOXEntryToolStripMenuItem1.Click += new System.EventHandler(this.addBOXEntryToolStripMenuItem1_Click); + // + // addANIMEntryToolStripMenuItem1 + // + this.addANIMEntryToolStripMenuItem1.Name = "addANIMEntryToolStripMenuItem1"; + resources.ApplyResources(this.addANIMEntryToolStripMenuItem1, "addANIMEntryToolStripMenuItem1"); + this.addANIMEntryToolStripMenuItem1.Click += new System.EventHandler(this.addANIMEntryToolStripMenuItem1_Click); + // + // addMultipleEntriesToolStripMenuItem1 + // + this.addMultipleEntriesToolStripMenuItem1.Name = "addMultipleEntriesToolStripMenuItem1"; + resources.ApplyResources(this.addMultipleEntriesToolStripMenuItem1, "addMultipleEntriesToolStripMenuItem1"); + this.addMultipleEntriesToolStripMenuItem1.Click += new System.EventHandler(this.addMultipleEntriesToolStripMenuItem1_Click); + // + // deleteEntryToolStripMenuItem + // + this.deleteEntryToolStripMenuItem.Image = global::PckStudio.Properties.Resources.file_delete; + this.deleteEntryToolStripMenuItem.Name = "deleteEntryToolStripMenuItem"; + resources.ApplyResources(this.deleteEntryToolStripMenuItem, "deleteEntryToolStripMenuItem"); + this.deleteEntryToolStripMenuItem.Click += new System.EventHandler(this.deleteEntryToolStripMenuItem_Click); + // + // editAllEntriesToolStripMenuItem + // + this.editAllEntriesToolStripMenuItem.Name = "editAllEntriesToolStripMenuItem"; + resources.ApplyResources(this.editAllEntriesToolStripMenuItem, "editAllEntriesToolStripMenuItem"); + this.editAllEntriesToolStripMenuItem.Click += new System.EventHandler(this.editAllEntriesToolStripMenuItem_Click); + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // treeViewMain + // + this.treeViewMain.AllowDrop = true; + this.treeViewMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(12)))), ((int)(((byte)(12))))); + this.treeViewMain.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeViewMain.ContextMenuStrip = this.contextMenuPCKEntries; + resources.ApplyResources(this.treeViewMain, "treeViewMain"); + this.treeViewMain.ForeColor = System.Drawing.Color.White; + this.treeViewMain.ImageList = this.imageList; + this.treeViewMain.LabelEdit = true; + this.treeViewMain.Name = "treeViewMain"; + this.treeViewMain.PathSeparator = "/"; + this.treeViewMain.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewMain_BeforeLabelEdit); + this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag); + this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewMain_AfterSelect); + this.treeViewMain.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewMain_NodeMouseClick); + this.treeViewMain.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragDrop); + this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter); + this.treeViewMain.DragOver += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragOver); + this.treeViewMain.DoubleClick += new System.EventHandler(this.treeViewMain_DoubleClick); + this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown); + // + // contextMenuPCKEntries + // + this.contextMenuPCKEntries.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem, + this.importSkinsToolStripMenuItem, + this.exportToolStripMenuItem, + this.setFileTypeToolStripMenuItem, + this.toolStripSeparator5, + this.miscFunctionsToolStripMenuItem, + this.extractToolStripMenuItem, + this.toolStripSeparator6, + this.cloneFileToolStripMenuItem, + this.renameFileToolStripMenuItem, + this.replaceToolStripMenuItem, + this.deleteFileToolStripMenuItem}); + this.contextMenuPCKEntries.Name = "contextMenuStrip1"; + resources.ApplyResources(this.contextMenuPCKEntries, "contextMenuPCKEntries"); + this.contextMenuPCKEntries.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuPCKEntries_Opening); + // + // createToolStripMenuItem + // + this.createToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.folderToolStripMenuItem, + this.skinToolStripMenuItem, + this.createAnimatedTextureToolStripMenuItem, + this.audiopckToolStripMenuItem, + this.colourscolToolStripMenuItem, + this.CreateSkinsPCKToolStripMenuItem1, + this.behavioursbinToolStripMenuItem, + this.entityMaterialsbinToolStripMenuItem}); + resources.ApplyResources(this.createToolStripMenuItem, "createToolStripMenuItem"); + this.createToolStripMenuItem.Name = "createToolStripMenuItem"; + // + // folderToolStripMenuItem + // + resources.ApplyResources(this.folderToolStripMenuItem, "folderToolStripMenuItem"); + this.folderToolStripMenuItem.Name = "folderToolStripMenuItem"; + this.folderToolStripMenuItem.Click += new System.EventHandler(this.folderToolStripMenuItem_Click); + // + // skinToolStripMenuItem + // + resources.ApplyResources(this.skinToolStripMenuItem, "skinToolStripMenuItem"); + this.skinToolStripMenuItem.Name = "skinToolStripMenuItem"; + this.skinToolStripMenuItem.Click += new System.EventHandler(this.createSkinToolStripMenuItem_Click); + // + // createAnimatedTextureToolStripMenuItem + // + resources.ApplyResources(this.createAnimatedTextureToolStripMenuItem, "createAnimatedTextureToolStripMenuItem"); + this.createAnimatedTextureToolStripMenuItem.Name = "createAnimatedTextureToolStripMenuItem"; + this.createAnimatedTextureToolStripMenuItem.Click += new System.EventHandler(this.createAnimatedTextureToolStripMenuItem_Click); + // + // audiopckToolStripMenuItem + // + this.audiopckToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BINKA_ICON; + this.audiopckToolStripMenuItem.Name = "audiopckToolStripMenuItem"; + resources.ApplyResources(this.audiopckToolStripMenuItem, "audiopckToolStripMenuItem"); + this.audiopckToolStripMenuItem.Click += new System.EventHandler(this.audiopckToolStripMenuItem_Click); + // + // colourscolToolStripMenuItem + // + this.colourscolToolStripMenuItem.Image = global::PckStudio.Properties.Resources.COL_ICON; + this.colourscolToolStripMenuItem.Name = "colourscolToolStripMenuItem"; + resources.ApplyResources(this.colourscolToolStripMenuItem, "colourscolToolStripMenuItem"); + this.colourscolToolStripMenuItem.Click += new System.EventHandler(this.colourscolToolStripMenuItem_Click); + // + // CreateSkinsPCKToolStripMenuItem1 + // + this.CreateSkinsPCKToolStripMenuItem1.Image = global::PckStudio.Properties.Resources.SKINS_ICON; + this.CreateSkinsPCKToolStripMenuItem1.Name = "CreateSkinsPCKToolStripMenuItem1"; + resources.ApplyResources(this.CreateSkinsPCKToolStripMenuItem1, "CreateSkinsPCKToolStripMenuItem1"); + this.CreateSkinsPCKToolStripMenuItem1.Click += new System.EventHandler(this.CreateSkinsPCKToolStripMenuItem1_Click); + // + // behavioursbinToolStripMenuItem + // + this.behavioursbinToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BEHAVIOURS_ICON; + this.behavioursbinToolStripMenuItem.Name = "behavioursbinToolStripMenuItem"; + resources.ApplyResources(this.behavioursbinToolStripMenuItem, "behavioursbinToolStripMenuItem"); + this.behavioursbinToolStripMenuItem.Click += new System.EventHandler(this.behavioursbinToolStripMenuItem_Click); + // + // entityMaterialsbinToolStripMenuItem + // + this.entityMaterialsbinToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ENTITY_MATERIALS_ICON; + this.entityMaterialsbinToolStripMenuItem.Name = "entityMaterialsbinToolStripMenuItem"; + resources.ApplyResources(this.entityMaterialsbinToolStripMenuItem, "entityMaterialsbinToolStripMenuItem"); + this.entityMaterialsbinToolStripMenuItem.Click += new System.EventHandler(this.entityMaterialsbinToolStripMenuItem_Click); + // + // importSkinsToolStripMenuItem + // + this.importSkinsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.importSkinToolStripMenuItem, + this.importExtractedSkinsFolderToolStripMenuItem, + this.addTextureToolStripMenuItem, + this.addFileToolStripMenuItem}); + resources.ApplyResources(this.importSkinsToolStripMenuItem, "importSkinsToolStripMenuItem"); + this.importSkinsToolStripMenuItem.Name = "importSkinsToolStripMenuItem"; + // + // importSkinToolStripMenuItem + // + resources.ApplyResources(this.importSkinToolStripMenuItem, "importSkinToolStripMenuItem"); + this.importSkinToolStripMenuItem.Name = "importSkinToolStripMenuItem"; + this.importSkinToolStripMenuItem.Click += new System.EventHandler(this.importSkinToolStripMenuItem_Click); + // + // importExtractedSkinsFolderToolStripMenuItem + // + resources.ApplyResources(this.importExtractedSkinsFolderToolStripMenuItem, "importExtractedSkinsFolderToolStripMenuItem"); + this.importExtractedSkinsFolderToolStripMenuItem.Name = "importExtractedSkinsFolderToolStripMenuItem"; + this.importExtractedSkinsFolderToolStripMenuItem.Click += new System.EventHandler(this.importExtractedSkinsFolder); + // + // addTextureToolStripMenuItem + // + this.addTextureToolStripMenuItem.Image = global::PckStudio.Properties.Resources.AddTexture; + this.addTextureToolStripMenuItem.Name = "addTextureToolStripMenuItem"; + resources.ApplyResources(this.addTextureToolStripMenuItem, "addTextureToolStripMenuItem"); + this.addTextureToolStripMenuItem.Click += new System.EventHandler(this.addTextureToolStripMenuItem_Click); + // + // addFileToolStripMenuItem + // + this.addFileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.blank; + this.addFileToolStripMenuItem.Name = "addFileToolStripMenuItem"; + resources.ApplyResources(this.addFileToolStripMenuItem, "addFileToolStripMenuItem"); + this.addFileToolStripMenuItem.Click += new System.EventHandler(this.addFileToolStripMenuItem_Click); + // + // exportToolStripMenuItem + // + this.exportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.as3DSTextureFileToolStripMenuItem}); + this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; + resources.ApplyResources(this.exportToolStripMenuItem, "exportToolStripMenuItem"); + // + // as3DSTextureFileToolStripMenuItem + // + this.as3DSTextureFileToolStripMenuItem.Name = "as3DSTextureFileToolStripMenuItem"; + resources.ApplyResources(this.as3DSTextureFileToolStripMenuItem, "as3DSTextureFileToolStripMenuItem"); + this.as3DSTextureFileToolStripMenuItem.Click += new System.EventHandler(this.as3DSTextureFileToolStripMenuItem_Click); + // + // setFileTypeToolStripMenuItem + // + this.setFileTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.skinToolStripMenuItem1, + this.capeToolStripMenuItem, + this.textureToolStripMenuItem, + this.languagesFileLOCToolStripMenuItem, + this.gameRulesFileGRFToolStripMenuItem, + this.audioPCKFileToolStripMenuItem, + this.coloursCOLFileToolStripMenuItem, + this.gameRulesHeaderGRHToolStripMenuItem, + this.skinsPCKToolStripMenuItem, + this.modelsFileBINToolStripMenuItem, + this.behavioursFileBINToolStripMenuItem, + this.entityMaterialsFileBINToolStripMenuItem}); + this.setFileTypeToolStripMenuItem.Name = "setFileTypeToolStripMenuItem"; + resources.ApplyResources(this.setFileTypeToolStripMenuItem, "setFileTypeToolStripMenuItem"); + // + // skinToolStripMenuItem1 + // + this.skinToolStripMenuItem1.Image = global::PckStudio.Properties.Resources.SKIN_ICON; + this.skinToolStripMenuItem1.Name = "skinToolStripMenuItem1"; + resources.ApplyResources(this.skinToolStripMenuItem1, "skinToolStripMenuItem1"); + // + // capeToolStripMenuItem + // + this.capeToolStripMenuItem.Image = global::PckStudio.Properties.Resources.CAPE_ICON; + this.capeToolStripMenuItem.Name = "capeToolStripMenuItem"; + resources.ApplyResources(this.capeToolStripMenuItem, "capeToolStripMenuItem"); + // + // textureToolStripMenuItem + // + this.textureToolStripMenuItem.Image = global::PckStudio.Properties.Resources.TEXTURE_ICON; + this.textureToolStripMenuItem.Name = "textureToolStripMenuItem"; + resources.ApplyResources(this.textureToolStripMenuItem, "textureToolStripMenuItem"); + // + // languagesFileLOCToolStripMenuItem + // + this.languagesFileLOCToolStripMenuItem.Image = global::PckStudio.Properties.Resources.LOC_ICON; + this.languagesFileLOCToolStripMenuItem.Name = "languagesFileLOCToolStripMenuItem"; + resources.ApplyResources(this.languagesFileLOCToolStripMenuItem, "languagesFileLOCToolStripMenuItem"); + // + // gameRulesFileGRFToolStripMenuItem + // + this.gameRulesFileGRFToolStripMenuItem.Image = global::PckStudio.Properties.Resources.GRF_ICON; + this.gameRulesFileGRFToolStripMenuItem.Name = "gameRulesFileGRFToolStripMenuItem"; + resources.ApplyResources(this.gameRulesFileGRFToolStripMenuItem, "gameRulesFileGRFToolStripMenuItem"); + // + // audioPCKFileToolStripMenuItem + // + this.audioPCKFileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BINKA_ICON; + this.audioPCKFileToolStripMenuItem.Name = "audioPCKFileToolStripMenuItem"; + resources.ApplyResources(this.audioPCKFileToolStripMenuItem, "audioPCKFileToolStripMenuItem"); + // + // coloursCOLFileToolStripMenuItem + // + this.coloursCOLFileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.COL_ICON; + this.coloursCOLFileToolStripMenuItem.Name = "coloursCOLFileToolStripMenuItem"; + resources.ApplyResources(this.coloursCOLFileToolStripMenuItem, "coloursCOLFileToolStripMenuItem"); + // + // gameRulesHeaderGRHToolStripMenuItem + // + this.gameRulesHeaderGRHToolStripMenuItem.Image = global::PckStudio.Properties.Resources.GRH_ICON; + this.gameRulesHeaderGRHToolStripMenuItem.Name = "gameRulesHeaderGRHToolStripMenuItem"; + resources.ApplyResources(this.gameRulesHeaderGRHToolStripMenuItem, "gameRulesHeaderGRHToolStripMenuItem"); + // + // skinsPCKToolStripMenuItem + // + this.skinsPCKToolStripMenuItem.Image = global::PckStudio.Properties.Resources.SKINS_ICON; + this.skinsPCKToolStripMenuItem.Name = "skinsPCKToolStripMenuItem"; + resources.ApplyResources(this.skinsPCKToolStripMenuItem, "skinsPCKToolStripMenuItem"); + // + // modelsFileBINToolStripMenuItem + // + this.modelsFileBINToolStripMenuItem.Image = global::PckStudio.Properties.Resources.MODELS_ICON; + this.modelsFileBINToolStripMenuItem.Name = "modelsFileBINToolStripMenuItem"; + resources.ApplyResources(this.modelsFileBINToolStripMenuItem, "modelsFileBINToolStripMenuItem"); + // + // behavioursFileBINToolStripMenuItem + // + this.behavioursFileBINToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BEHAVIOURS_ICON; + this.behavioursFileBINToolStripMenuItem.Name = "behavioursFileBINToolStripMenuItem"; + resources.ApplyResources(this.behavioursFileBINToolStripMenuItem, "behavioursFileBINToolStripMenuItem"); + // + // entityMaterialsFileBINToolStripMenuItem + // + this.entityMaterialsFileBINToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ENTITY_MATERIALS_ICON; + this.entityMaterialsFileBINToolStripMenuItem.Name = "entityMaterialsFileBINToolStripMenuItem"; + resources.ApplyResources(this.entityMaterialsFileBINToolStripMenuItem, "entityMaterialsFileBINToolStripMenuItem"); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + // + // miscFunctionsToolStripMenuItem + // + this.miscFunctionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.generateMipMapTextureToolStripMenuItem1, + this.viewFileInfoToolStripMenuItem, + this.correctSkinDecimalsToolStripMenuItem, + this.setSubPCKEndiannessToolStripMenuItem, + this.setModelContainerFormatToolStripMenuItem}); + this.miscFunctionsToolStripMenuItem.Name = "miscFunctionsToolStripMenuItem"; + resources.ApplyResources(this.miscFunctionsToolStripMenuItem, "miscFunctionsToolStripMenuItem"); + // + // generateMipMapTextureToolStripMenuItem1 + // + this.generateMipMapTextureToolStripMenuItem1.Name = "generateMipMapTextureToolStripMenuItem1"; + resources.ApplyResources(this.generateMipMapTextureToolStripMenuItem1, "generateMipMapTextureToolStripMenuItem1"); + this.generateMipMapTextureToolStripMenuItem1.Click += new System.EventHandler(this.generateMipMapTextureToolStripMenuItem_Click); + // + // viewFileInfoToolStripMenuItem + // + this.viewFileInfoToolStripMenuItem.Name = "viewFileInfoToolStripMenuItem"; + resources.ApplyResources(this.viewFileInfoToolStripMenuItem, "viewFileInfoToolStripMenuItem"); + this.viewFileInfoToolStripMenuItem.Click += new System.EventHandler(this.viewFileInfoToolStripMenuItem_Click); + // + // correctSkinDecimalsToolStripMenuItem + // + this.correctSkinDecimalsToolStripMenuItem.Name = "correctSkinDecimalsToolStripMenuItem"; + resources.ApplyResources(this.correctSkinDecimalsToolStripMenuItem, "correctSkinDecimalsToolStripMenuItem"); + this.correctSkinDecimalsToolStripMenuItem.Click += new System.EventHandler(this.correctSkinDecimalsToolStripMenuItem_Click); + // + // setSubPCKEndiannessToolStripMenuItem + // + this.setSubPCKEndiannessToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.bigEndianXbox360PS3WiiUToolStripMenuItem, + this.littleEndianPS4PSVitaSwitchToolStripMenuItem}); + this.setSubPCKEndiannessToolStripMenuItem.Name = "setSubPCKEndiannessToolStripMenuItem"; + resources.ApplyResources(this.setSubPCKEndiannessToolStripMenuItem, "setSubPCKEndiannessToolStripMenuItem"); + // + // bigEndianXbox360PS3WiiUToolStripMenuItem + // + this.bigEndianXbox360PS3WiiUToolStripMenuItem.Name = "bigEndianXbox360PS3WiiUToolStripMenuItem"; + resources.ApplyResources(this.bigEndianXbox360PS3WiiUToolStripMenuItem, "bigEndianXbox360PS3WiiUToolStripMenuItem"); + this.bigEndianXbox360PS3WiiUToolStripMenuItem.Click += new System.EventHandler(this.bigEndianToolStripMenuItem_Click); + // + // littleEndianPS4PSVitaSwitchToolStripMenuItem + // + this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Name = "littleEndianPS4PSVitaSwitchToolStripMenuItem"; + resources.ApplyResources(this.littleEndianPS4PSVitaSwitchToolStripMenuItem, "littleEndianPS4PSVitaSwitchToolStripMenuItem"); + this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Click += new System.EventHandler(this.littleEndianToolStripMenuItem_Click); + // + // setModelContainerFormatToolStripMenuItem + // + this.setModelContainerFormatToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.version1ToolStripMenuItem, + this.version2ToolStripMenuItem, + this.version3114ToolStripMenuItem}); + this.setModelContainerFormatToolStripMenuItem.Name = "setModelContainerFormatToolStripMenuItem"; + resources.ApplyResources(this.setModelContainerFormatToolStripMenuItem, "setModelContainerFormatToolStripMenuItem"); + // + // version1ToolStripMenuItem + // + this.version1ToolStripMenuItem.Name = "version1ToolStripMenuItem"; + resources.ApplyResources(this.version1ToolStripMenuItem, "version1ToolStripMenuItem"); + this.version1ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion1ToolStripMenuItem_Click); + // + // version2ToolStripMenuItem + // + this.version2ToolStripMenuItem.Name = "version2ToolStripMenuItem"; + resources.ApplyResources(this.version2ToolStripMenuItem, "version2ToolStripMenuItem"); + this.version2ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion2ToolStripMenuItem_Click); + // + // version3114ToolStripMenuItem + // + this.version3114ToolStripMenuItem.Name = "version3114ToolStripMenuItem"; + resources.ApplyResources(this.version3114ToolStripMenuItem, "version3114ToolStripMenuItem"); + this.version3114ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion3ToolStripMenuItem_Click); + // + // extractToolStripMenuItem + // + resources.ApplyResources(this.extractToolStripMenuItem, "extractToolStripMenuItem"); + this.extractToolStripMenuItem.Name = "extractToolStripMenuItem"; + this.extractToolStripMenuItem.Click += new System.EventHandler(this.extractToolStripMenuItem_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); + // + // cloneFileToolStripMenuItem + // + this.cloneFileToolStripMenuItem.Name = "cloneFileToolStripMenuItem"; + resources.ApplyResources(this.cloneFileToolStripMenuItem, "cloneFileToolStripMenuItem"); + this.cloneFileToolStripMenuItem.Click += new System.EventHandler(this.cloneFileToolStripMenuItem_Click); + // + // renameFileToolStripMenuItem + // + resources.ApplyResources(this.renameFileToolStripMenuItem, "renameFileToolStripMenuItem"); + this.renameFileToolStripMenuItem.Name = "renameFileToolStripMenuItem"; + this.renameFileToolStripMenuItem.Click += new System.EventHandler(this.renameFileToolStripMenuItem_Click); + // + // replaceToolStripMenuItem + // + resources.ApplyResources(this.replaceToolStripMenuItem, "replaceToolStripMenuItem"); + this.replaceToolStripMenuItem.Name = "replaceToolStripMenuItem"; + this.replaceToolStripMenuItem.Click += new System.EventHandler(this.replaceToolStripMenuItem_Click); + // + // deleteFileToolStripMenuItem + // + this.deleteFileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.file_delete; + this.deleteFileToolStripMenuItem.Name = "deleteFileToolStripMenuItem"; + resources.ApplyResources(this.deleteFileToolStripMenuItem, "deleteFileToolStripMenuItem"); + this.deleteFileToolStripMenuItem.Click += new System.EventHandler(this.deleteFileToolStripMenuItem_Click); + // + // imageList + // + this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + resources.ApplyResources(this.imageList, "imageList"); + this.imageList.TransparentColor = System.Drawing.Color.Transparent; + // + // addMultipleEntriesToolStripMenuItem + // + resources.ApplyResources(this.addMultipleEntriesToolStripMenuItem, "addMultipleEntriesToolStripMenuItem"); + this.addMultipleEntriesToolStripMenuItem.Name = "addMultipleEntriesToolStripMenuItem"; + // + // LittleEndianCheckBox + // + resources.ApplyResources(this.LittleEndianCheckBox, "LittleEndianCheckBox"); + this.LittleEndianCheckBox.BackColor = System.Drawing.Color.Transparent; + this.LittleEndianCheckBox.Name = "LittleEndianCheckBox"; + this.LittleEndianCheckBox.Style = MetroFramework.MetroColorStyle.White; + this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.LittleEndianCheckBox.UseSelectable = true; + // + // previewPictureBox + // + resources.ApplyResources(this.previewPictureBox, "previewPictureBox"); + this.previewPictureBox.BackColor = System.Drawing.Color.Transparent; + this.previewPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; + this.previewPictureBox.Image = global::PckStudio.Properties.Resources.NoImageFound; + this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.previewPictureBox.Name = "previewPictureBox"; + this.previewPictureBox.TabStop = false; + // + // PckEditor + // + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + resources.ApplyResources(this, "$this"); + this.Controls.Add(this.previewPictureBox); + this.Controls.Add(this.LittleEndianCheckBox); + this.Controls.Add(this.pckFileLabel); + this.Controls.Add(this.labelImageSize); + this.Controls.Add(this.fileEntryCountLabel); + this.Controls.Add(this.PropertiesTabControl); + this.Controls.Add(this.label11); + this.Controls.Add(this.treeViewMain); + this.Controls.Add(logoPictureBox); + this.ForeColor = System.Drawing.Color.Transparent; + this.Name = "PckEditor"; + this.Load += new System.EventHandler(this.PckEditor_Load); + ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).EndInit(); + this.PropertiesTabControl.ResumeLayout(false); + this.MetaTab.ResumeLayout(false); + this.MetaTab.PerformLayout(); + this.contextMenuMetaTree.ResumeLayout(false); + this.contextMenuPCKEntries.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MetroFramework.Controls.MetroLabel pckFileLabel; + private MetroFramework.Controls.MetroLabel labelImageSize; + private MetroFramework.Controls.MetroLabel fileEntryCountLabel; + private MetroFramework.Controls.MetroTabControl PropertiesTabControl; + private MetroFramework.Controls.MetroTabPage MetaTab; + private System.Windows.Forms.TreeView treeMeta; + private MetroFramework.Controls.MetroLabel label11; + private System.Windows.Forms.TreeView treeViewMain; + private PckStudio.ToolboxItems.InterpolationPictureBox previewPictureBox; + private System.Windows.Forms.ContextMenuStrip contextMenuMetaTree; + private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addBOXEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addANIMEntryToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem addMultipleEntriesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteEntryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editAllEntriesToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuPCKEntries; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem folderToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem skinToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createAnimatedTextureToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem audiopckToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem colourscolToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem CreateSkinsPCKToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem behavioursbinToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem entityMaterialsbinToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importSkinsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importSkinToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importExtractedSkinsFolderToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addTextureToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem as3DSTextureFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setFileTypeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem skinToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem capeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem textureToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem languagesFileLOCToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem gameRulesFileGRFToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem audioPCKFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem coloursCOLFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem gameRulesHeaderGRHToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem skinsPCKToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem modelsFileBINToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem behavioursFileBINToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem entityMaterialsFileBINToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem miscFunctionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem generateMipMapTextureToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem viewFileInfoToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem correctSkinDecimalsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem extractToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cloneFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem renameFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem replaceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteFileToolStripMenuItem; + private System.Windows.Forms.ImageList imageList; + private System.Windows.Forms.ToolStripMenuItem addMultipleEntriesToolStripMenuItem1; + private MetroFramework.Controls.MetroLabel metroLabel2; + private MetroFramework.Controls.MetroTextBox entryTypeTextBox; + private MetroFramework.Controls.MetroTextBox entryDataTextBox; + private MetroFramework.Controls.MetroButton buttonEdit; + private MetroFramework.Controls.MetroLabel metroLabel1; + private MetroFramework.Controls.MetroCheckBox LittleEndianCheckBox; + private System.Windows.Forms.ToolStripMenuItem setSubPCKEndiannessToolStripMenuItem; + private ToolStripMenuItem bigEndianXbox360PS3WiiUToolStripMenuItem; + private ToolStripMenuItem littleEndianPS4PSVitaSwitchToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem setModelContainerFormatToolStripMenuItem; + private ToolStripMenuItem version1ToolStripMenuItem; + private ToolStripMenuItem version2ToolStripMenuItem; + private ToolStripMenuItem version3114ToolStripMenuItem; + private ToolStripSeparator toolStripSeparator5; + private ToolStripSeparator toolStripSeparator6; + } +} diff --git a/PCK-Studio/Controls/PckEditor.cs b/PCK-Studio/Controls/PckEditor.cs new file mode 100644 index 00000000..dc461bac --- /dev/null +++ b/PCK-Studio/Controls/PckEditor.cs @@ -0,0 +1,2251 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using System.Drawing.Drawing2D; + +using MetroFramework.Forms; + +using OMI.Formats.Languages; +using OMI.Formats.Pck; +using OMI.Workers.Language; +using OMI.Workers.Pck; + +using OMI.Workers; +using OMI.Formats.Model; +using OMI.Workers.Model; +using OMI.Formats.GameRule; +using OMI.Workers.GameRule; +using OMI.Formats.Material; +using OMI.Workers.Material; +using OMI.Formats.Behaviour; +using OMI.Workers.Behaviour; +using OMI.Formats.Color; +using OMI.Workers.Color; + +using PckStudio.Core.Extensions; +using PckStudio.Forms.Editor; +using PckStudio.Forms.Additional_Popups; +using PckStudio.Forms.Additional_Popups.Animation; +using PckStudio.Interfaces; +using PckStudio.Internal; +using PckStudio.Popups; +using PckStudio.Properties; + +using PckStudio.Core.Deserializer; +using PckStudio.Core.Serializer; +using PckStudio.Core.Json; +using PckStudio.Core.FileFormats; +using PckStudio.Core.Skin; +using PckStudio.Rendering; +using PckStudio.Core; +using PckStudio.ModelSupport; +using PckStudio.Json; +using PckStudio.Core.IO.PckAudio; +using PckStudio.Core.IO._3DST; +using PckStudio.Core.Misc; + +namespace PckStudio.Controls +{ + internal partial class PckEditor : EditorControl + { + + private string _location = string.Empty; + + private readonly OMI.ByteOrder _originalEndianness; + private OMI.ByteOrder _currentEndianness; + private bool __modified = false; + private bool _wasModified + { + get => __modified; + set + { + if (__modified != value) + { + __modified = value; + _onModifiedChangeDelegate?.Invoke(value); + } + } + } + + private delegate void OnModifiedChangeDelegate(bool state); + private OnModifiedChangeDelegate _onModifiedChangeDelegate; + + private int _timesSaved = 0; + + private readonly Dictionary> _pckAssetTypeHandler; + + public PckEditor(PackInfo packInfo, ISaveContext saveContext) + : base(packInfo, saveContext) + { + InitializeComponent(); + _onModifiedChangeDelegate = OnModify; + _originalEndianness = packInfo.Endianness; + _currentEndianness = packInfo.Endianness; + + LittleEndianCheckBox.Visible = packInfo.AllowEndianSwap; + + treeViewMain.TreeViewNodeSorter = new PckNodeSorter(); + + skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckAssetType.SkinFile); + capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.CapeFile); + textureToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.TextureFile); + languagesFileLOCToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.LocalisationFile); + gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.GameRulesFile); + audioPCKFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.AudioFile); + coloursCOLFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.ColourTableFile); + gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.GameRulesHeader); + skinsPCKToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.SkinDataFile); + modelsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.ModelsFile); + behavioursFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.BehavioursFile); + entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.MaterialFile); + + imageList.Images.Add(Resources.ZZFolder); // Icon for folders + imageList.Images.Add(Resources.BINKA_ICON); // Icon for music cue file (audio.pck) + imageList.Images.Add(Resources.IMAGE_ICON); // Icon for images (unused for now) + imageList.Images.Add(Resources.LOC_ICON); // Icon for string localization files (languages.loc;localisation.loc) + imageList.Images.Add(Resources.PCK_ICON); // Icon for generic PCK files (*.pck) + imageList.Images.Add(Resources.ZUnknown); // Icon for Unknown formats + imageList.Images.Add(Resources.COL_ICON); // Icon for color palette files (colours.col) + imageList.Images.Add(Resources.SKINS_ICON); // Icon for Skin.pck archives (skins.pck) + imageList.Images.Add(Resources.MODELS_ICON); // Icon for Model files (models.bin) + imageList.Images.Add(Resources.GRF_ICON); // Icon for Game Rule files (*.grf) + imageList.Images.Add(Resources.GRH_ICON); // Icon for Game Rule Header files (*.grh) + imageList.Images.Add(Resources.INFO_ICON); // Icon for Info files (0) + imageList.Images.Add(Resources.SKIN_ICON); // Icon for Skin files (*.png) + imageList.Images.Add(Resources.CAPE_ICON); // Icon for Cape files (*.png) + imageList.Images.Add(Resources.TEXTURE_ICON); // Icon for Texture files (*.png;*.tga) + imageList.Images.Add(Resources.BEHAVIOURS_ICON); // Icon for Behaviour files (behaviours.bin) + imageList.Images.Add(Resources.ENTITY_MATERIALS_ICON); // Icon for Entity Material files (entityMaterials.bin) + + _pckAssetTypeHandler = new Dictionary>(15) + { + [PckAssetType.SkinFile] = HandleSkinFile, + [PckAssetType.CapeFile] = null, + [PckAssetType.TextureFile] = HandleTextureFile, + [PckAssetType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), + [PckAssetType.InfoFile] = null, + [PckAssetType.TexturePackInfoFile] = HandleInnerPckFile, + [PckAssetType.LocalisationFile] = HandleLocalisationFile, + [PckAssetType.GameRulesFile] = HandleGameRuleFile, + [PckAssetType.AudioFile] = HandleAudioFile, + [PckAssetType.ColourTableFile] = HandleColourFile, + [PckAssetType.GameRulesHeader] = HandleGameRuleFile, + [PckAssetType.SkinDataFile] = HandleInnerPckFile, + [PckAssetType.ModelsFile] = HandleModelsFile, + [PckAssetType.BehavioursFile] = HandleBehavioursFile, + [PckAssetType.MaterialFile] = HandleMaterialFile, + }; + } + + public new void Save() + { + base.Save(); + _timesSaved++; + _wasModified = false; + } + + public override void SaveAs() + { + using SaveFileDialog saveFileDialog = new SaveFileDialog + { + Filter = "PCK (Minecraft Console Package)|*.pck", + DefaultExt = ".pck", + }; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + SaveTo(saveFileDialog.FileName); + pckFileLabel.Text = "Current PCK File: " + Path.GetFileName(_location); + } + } + + public override void Close() + { + if (_wasModified && MessageBox.Show("Save PCK?", "Modified PCK", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + Save(); + } + + private void OnModify(bool state) + { + pckFileLabel.Text = state && !pckFileLabel.Text.StartsWith("*") ? "*" + pckFileLabel.Text : pckFileLabel.Text.Substring(1); + } + + public override void UpdateView() + { + BuildMainTreeView(); + } + + private void SaveTo(string filepath) + { + _location = filepath; + Save(); + } + + private void HandleInnerPckFile(PckAsset asset) + { + if (asset.Type != PckAssetType.SkinDataFile && asset.Type != PckAssetType.TexturePackInfoFile || asset.Size <= 0 || !Settings.Default.LoadSubPcks) + return; + + ISaveContext saveContext = new DelegatedSaveContext(false, (packInfo) => + { + if (packInfo.IsValid) + { + asset.SetData(new PckFileWriter(packInfo.File, _currentEndianness)); + _wasModified = true; + } + }); + + string caption = Path.GetFileName(asset.Filename); + string identifier = _location + Path.GetFileName(asset.Filename); + PckFile pckFile = asset.GetData(new PckFileReader(_originalEndianness)); + PackInfo packInfo = PackInfo.Create(pckFile, _originalEndianness, false); + + // TODO: may change to use a new tab page that will be closed when the main pck is closed + //Program.MainInstance.OpenNewPckTab(caption, identifier, packInfo, saveContext); + } + + private void HandleTextureFile(PckAsset asset) + { + _ = asset.IsMipmappedFile() && EditorValue.File.TryGetAsset(asset.GetNormalPath(), PckAssetType.TextureFile, out asset); + + if (asset.Size <= 0) + { + Trace.TraceInformation($"[{nameof(PckEditor)}:{nameof(HandleTextureFile)}] '{asset.Filename}' size is 0."); + return; + } + + ResourceLocation resourceLocation = ResourceLocation.GetFromPath(asset.Filename); + Debug.WriteLine("Handling Resource file: " + resourceLocation?.ToString()); + + switch (resourceLocation.Category) + { + case ResourceCategory.Unknown: + Debug.WriteLine($"Unknown Resource Category."); + break; + case ResourceCategory.MobEntityTextures: + case ResourceCategory.ItemEntityTextures: + { + string texturePath = asset.Filename.Substring(0, asset.Filename.Length - Path.GetExtension(asset.Filename).Length); + string[] modelNames = GameModelImporter.ModelMetaData.Where(kv => kv.Value.TextureLocations.Contains(texturePath)).Select(kv => kv.Key).ToArray(); + + if (modelNames.Length == 0) + { + MessageBox.Show("No Model info found"); + return; + } + + string modelName = modelNames[0]; + if (modelNames.Length > 1) + { + using ItemSelectionPopUp itemSelectionPopUp = new ItemSelectionPopUp(modelNames.ToArray()); + itemSelectionPopUp.ButtonText = "View"; + itemSelectionPopUp.LabelText = "Models:"; + if (itemSelectionPopUp.ShowDialog() != DialogResult.OK || !modelNames.IndexInRange(itemSelectionPopUp.SelectedIndex)) + { + return; + } + modelName = modelNames[itemSelectionPopUp.SelectedIndex]; + } + + Image texture = asset.GetTexture(); + string textureName = Path.GetFileName(texturePath); + + NamedData modelTexture = new NamedData(textureName, texture); + + bool hasCustomModel = false; + bool hasDefaultModel = TryGetDefaultEntityModel(modelName, out Model model); + if (EditorValue.File.TryGetAsset("models.bin", PckAssetType.ModelsFile, out PckAsset modelsAsset)) + { + ModelContainer models = modelsAsset.GetData(new ModelFileReader()); + hasCustomModel = models.ContainsModel(modelName); + if (hasCustomModel) + { + Debug.WriteLine($"Custom model for '{modelName}' found."); + model = models.GetModelByName(modelName); + } + } + if (!hasDefaultModel && !hasCustomModel) + { + MessageBox.Show(this, $"Not Model found for: {modelName}"); + return; + } + + ShowSimpleModelRender(model, modelTexture); + } + break; + + case ResourceCategory.ItemAnimation: + case ResourceCategory.BlockAnimation: + Animation animation = asset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); + string internalName = Path.GetFileNameWithoutExtension(asset.Filename); + IList textureInfos = resourceLocation.Category == ResourceCategory.ItemAnimation ? Tiles.ItemTileInfos : Tiles.BlockTileInfos; + string displayname = textureInfos.FirstOrDefault(p => p.InternalName == internalName)?.DisplayName ?? internalName; + + string[] specialTileNames = { "clock", "compass" }; + + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (animation) => + { + asset.SetSerializedData(animation, AnimationSerializer.DefaultSerializer); + }); + + using (AnimationEditor animationEditor = new AnimationEditor(animation, saveContext, displayname, !internalName.ToLower().EqualsAny(specialTileNames))) + { + if (animationEditor.ShowDialog(this) == DialogResult.OK) + { + _wasModified = true; + BuildMainTreeView(); + } + } + break; + case ResourceCategory.ParticleAtlas: + case ResourceCategory.MoonPhaseAtlas: + case ResourceCategory.ItemAtlas: + case ResourceCategory.BlockAtlas: + case ResourceCategory.BannerAtlas: + case ResourceCategory.PaintingAtlas: + case ResourceCategory.ExplosionAtlas: + case ResourceCategory.ExperienceOrbAtlas: + case ResourceCategory.MapIconAtlas: + case ResourceCategory.AdditionalMapIconsAtlas: + Atlas atlas = asset.GetDeserializedData(new AtlasDeserializer(resourceLocation)); + ColorContainer colorContainer = default; + if (EditorValue.File.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out PckAsset colAsset)) + colorContainer = colAsset.GetData(new COLFileReader()); + + ITryGet tryGetAnimation = TryGet.FromDelegate((string key, out Animation animation) => + { + bool found = EditorValue.File.TryGetAsset(key + ".png", PckAssetType.TextureFile, out PckAsset foundAsset) || + EditorValue.File.TryGetAsset(key + ".tga", PckAssetType.TextureFile, out foundAsset); + if (found) + { + animation = foundAsset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); + return true; + } + animation = default; + return false; + }); + + ITryGet> tryGetAnimationSaveContext = TryGet> + .FromDelegate((string key, out ISaveContext animationSaveContext) => + { + bool found = EditorValue.File.TryGetAsset(key + ".png", PckAssetType.TextureFile, out PckAsset foundAsset) || + EditorValue.File.TryGetAsset(key + ".tga", PckAssetType.TextureFile, out foundAsset); + + if (found) + { + animationSaveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (animation) => + foundAsset.SetSerializedData(animation, AnimationSerializer.DefaultSerializer)); + return true; + } + + // you could validate the key(animationAssetPath) for validity. -miku + animationSaveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (animation) => + { + if (animation.FrameCount == 0) + { + Debug.WriteLine("New animation has 0 frames. Aborting saving."); + return; + } + PckAsset newAnimationAsset = EditorValue.File.CreateNewAsset(key + ".png", PckAssetType.TextureFile); + newAnimationAsset.SetSerializedData(animation, AnimationSerializer.DefaultSerializer); + BuildMainTreeView(); + }); + return true; + }); + + ISaveContext textureAtlasSaveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, atlas => asset.SetTexture(atlas)); + + var viewer = new TextureAtlasEditor(atlas, textureAtlasSaveContext, resourceLocation, colorContainer, tryGetAnimation, tryGetAnimationSaveContext); + if (viewer.ShowDialog(this) == DialogResult.OK) + { + _wasModified = true; + BuildMainTreeView(); + } + break; + default: + Debug.WriteLine($"Unhandled Resource Category: {resourceLocation.Category}"); + break; + } + } + + private void HandleGameRuleFile(PckAsset asset) + { + const string cDEFLATE = "PS3"; + const string cXMEM = "Xbox 360"; + const string cZLIB = "Other Platforms"; + + ItemSelectionPopUp dialog = new ItemSelectionPopUp(cZLIB, cDEFLATE, cXMEM); + dialog.LabelText = "Type"; + dialog.ButtonText = "Ok"; + if (dialog.ShowDialog() != DialogResult.OK) + return; + + GameRuleFile.CompressionType compressiontype = dialog.SelectedItem switch + { + cDEFLATE => GameRuleFile.CompressionType.Deflate, + cXMEM => GameRuleFile.CompressionType.XMem, + cZLIB => GameRuleFile.CompressionType.Zlib, + _ => GameRuleFile.CompressionType.Unknown + }; + + GameRuleFile grf = asset.GetData(new GameRuleFileReader(compressiontype)); + + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (gameRuleFile) => + { + asset.SetData(new GameRuleFileWriter(gameRuleFile)); + }); + + using GameRuleFileEditor grfEditor = new GameRuleFileEditor(grf, saveContext); + if (grfEditor.ShowDialog(this) == DialogResult.OK) + { + _wasModified = true; + UpdateRichPresence(); + } + } + + private void HandleAudioFile(PckAsset asset) + { + try + { + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (audioFile) => + { + asset.SetData(new PckAudioFileWriter(audioFile, _currentEndianness)); + }); + PckAudioFile audioFile = asset.GetData(new PckAudioFileReader(_originalEndianness)); + using AudioEditor audioEditor = new AudioEditor(audioFile, saveContext); + _wasModified = audioEditor.ShowDialog(this) == DialogResult.OK; + } + catch (OverflowException) + { + MessageBox.Show(this, $"Failed to open {asset.Filename}\n" + + "Try converting the file by using the \"Misc. Functions/Set PCK Endianness\" tool and try again.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to open {asset.Filename}\n" + ex.Message, + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void HandleLocalisationFile(PckAsset asset) + { + LOCFile locFile = asset.GetData(new LOCFileReader()); + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (locFile) => + { + asset.SetData(new LOCFileWriter(locFile, 2)); + }); + using LOCEditor locedit = new LOCEditor(locFile, saveContext); + _wasModified = locedit.ShowDialog(this) == DialogResult.OK; + UpdateRichPresence(); + } + + private void HandleColourFile(PckAsset asset) + { + ColorContainer colorContainer = asset.GetData(new COLFileReader()); + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (colorContainer) => + { + asset.SetData(new COLFileWriter(colorContainer)); + }); + using COLEditor diag = new COLEditor(colorContainer, saveContext); + _wasModified = diag.ShowDialog(this) == DialogResult.OK; + } + + private void HandleSkinFile(PckAsset asset) + { + Skin skin = asset.GetSkin(); + if (asset.HasProperty("CAPEPATH")) + { + string capeAssetPath = asset.GetProperty("CAPEPATH"); + if (EditorValue.File.TryGetAsset(capeAssetPath, PckAssetType.CapeFile, out PckAsset capeAsset)) + { + skin.CapeTexture = capeAsset.GetTexture(); + } + } + + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (customSkin) => + { + if (!TryGetLocFile(out LOCFile locFile)) + Debug.WriteLine("Failed to aquire loc file."); + asset.SetSkin(customSkin, locFile); + }); + + using CustomSkinEditor skinEditor = new CustomSkinEditor(skin, saveContext, EditorValue.File.HasVerionString); + if (skinEditor.ShowDialog() == DialogResult.OK) + { + entryDataTextBox.Text = entryTypeTextBox.Text = string.Empty; + _wasModified = true; + ReloadMetaTreeView(); + } + } + + private void HandleModelsFile(PckAsset asset) + { + ModelContainer modelContainer = asset.GetData(new ModelFileReader()); + if (modelContainer.ModelCount == 0) + { + MessageBox.Show("No models found.", "Empty Model file", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + TryGetDelegate tryGetTexture = (string path, out Image img) => + { + bool found = EditorValue.File.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset asset) || + EditorValue.File.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out asset); + img = found ? asset.GetTexture() : default; + return found; + }; + + TrySetDelegate trySetTexture = (string path, Image img) => + { + bool found = EditorValue.File.TryGetAsset(path + ".png", PckAssetType.TextureFile, out PckAsset foundAsset) || + EditorValue.File.TryGetAsset(path + ".tga", PckAssetType.TextureFile, out foundAsset); + PckAsset asset = foundAsset ?? EditorValue.File.CreateNewAsset(path + ".png", PckAssetType.TextureFile); + asset.SetTexture(img); + return true; + }; + + bool hasMaterialAsset = EditorValue.File.TryGetAsset("entityMaterials.bin", PckAssetType.MaterialFile, out PckAsset entityMaterialAsset); + IReadOnlyDictionary entityMaterials = + hasMaterialAsset + ? entityMaterialAsset?.GetData(new MaterialFileReader()).ToDictionary(mat => mat.Name) + : new Dictionary(); + + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (modelContainer) => + { + asset.SetData(new ModelFileWriter(modelContainer, modelContainer.Version)); + }); + + var editor = new ModelEditor(modelContainer, saveContext, TryGetSet.FromDelegates(tryGetTexture, trySetTexture), TryGet.FromDelegate(entityMaterials.TryGetValue)); + if (editor.ShowDialog() == DialogResult.OK) + { + BuildMainTreeView(); + _wasModified = true; + return; + } + } + + private void HandleBehavioursFile(PckAsset asset) + { + BehaviourFile behaviourFile = asset.GetData(new BehavioursReader()); + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (behaviourFile) => + { + asset.SetData(new BehavioursWriter(behaviourFile)); + }); + using BehaviourEditor edit = new BehaviourEditor(behaviourFile, saveContext); + _wasModified = edit.ShowDialog(this) == DialogResult.OK; + } + + private void HandleMaterialFile(PckAsset asset) + { + MaterialContainer materials = asset.GetData(new MaterialFileReader()); + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (materials) => + { + asset.SetData(new MaterialFileWriter(materials)); + }); + using MaterialsEditor edit = new MaterialsEditor(materials, saveContext); + _wasModified = edit.ShowDialog(this) == DialogResult.OK; + } + + private void CheckForPasswordAndRemove() + { + if (EditorValue.File.TryGetAsset("0", PckAssetType.InfoFile, out PckAsset asset)) + { + asset.RemoveProperties("LOCK"); + } + } + + /// + /// wrapper that allows the use of in TreeNode.Nodes.Find(, ...) and TreeNode.Nodes.ContainsKey() + /// + /// + /// + /// new Created TreeNode + private static TreeNode CreateNode(string name, object tag = null) + { + TreeNode node = new TreeNode(name); + node.Name = name; + node.Tag = tag; + return node; + } + + private TreeNode BuildNodeTreeBySeperator(TreeNodeCollection root, string path, char seperator) + { + _ = root ?? throw new ArgumentNullException(nameof(root)); + if (!path.Contains(seperator)) + { + TreeNode finalNode = CreateNode(path); + root.Add(finalNode); + return finalNode; + } + string nodeText = path.Substring(0, path.IndexOf(seperator)); + string subPath = path.Substring(path.IndexOf(seperator) + 1); + + if (string.IsNullOrWhiteSpace(nodeText)) + { + return BuildNodeTreeBySeperator(root, subPath, seperator); + } + + bool alreadyExists = root.ContainsKey(nodeText); + TreeNode subNode = alreadyExists ? root[nodeText] : CreateNode(nodeText); + if (!alreadyExists) + root.Add(subNode); + return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator); + } + + private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile) + { + foreach (PckAsset asset in pckFile.GetAssets()) + { + TreeNode node = BuildNodeTreeBySeperator(root, asset.Filename, '/'); + node.Tag = asset; + int nodeIconId = GetNodeIconId(asset.Type); + node.ImageIndex = nodeIconId; + node.SelectedImageIndex = nodeIconId; + } + } + + private void BuildMainTreeView() + { + // In case the Rename function was just used and the selected node name no longer matches the file name + string selectedNodeText = treeViewMain.SelectedNode is TreeNode node ? node.FullPath : string.Empty; + previewPictureBox.Image = Resources.NoImageFound; + treeMeta.Nodes.Clear(); + treeViewMain.Nodes.Clear(); + BuildPckTreeView(treeViewMain.Nodes, EditorValue.File); + treeViewMain.Sort(); + + TreeNode[] selectedNodes = treeViewMain.FindPath(selectedNodeText); + if (selectedNodes.Length > 0) + { + treeViewMain.SelectedNode = selectedNodes[0]; + } + } + + private int GetNodeIconId(PckAssetType type) + { + return type switch + { + PckAssetType.AudioFile => 1, + PckAssetType.LocalisationFile => 3, + PckAssetType.TexturePackInfoFile => 4, + PckAssetType.ColourTableFile => 6, + PckAssetType.ModelsFile => 8, + PckAssetType.SkinDataFile => 7, + PckAssetType.GameRulesFile => 9, + PckAssetType.GameRulesHeader => 10, + PckAssetType.InfoFile => 11, + PckAssetType.SkinFile => 12, + PckAssetType.CapeFile => 13, + PckAssetType.TextureFile => 14, + PckAssetType.BehavioursFile => 15, + PckAssetType.MaterialFile => 16, + // unknown file format + _ => 5, + }; + } + + private List GetAllChildNodes(TreeNodeCollection root) + { + List childNodes = new List(); + foreach (TreeNode node in root) + { + childNodes.Add(node); + if (node.Nodes.Count > 0) + { + childNodes.AddRange(GetAllChildNodes(node.Nodes)); + } + } + return childNodes; + } + + private bool TryGetLocFile(out LOCFile locFile) + { + if (!EditorValue.File.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !EditorValue.File.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) + { + locFile = null; + return false; + } + + try + { + locFile = locAsset.GetData(new LOCFileReader()); + return true; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + } + locFile = null; + return false; + } + + private bool TrySetLocFile(in LOCFile locFile) + { + if (!EditorValue.File.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && + !EditorValue.File.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) + { + return false; + } + + try + { + locAsset.SetData(new LOCFileWriter(locFile, 2)); + return true; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + } + return false; + } + + private void ReloadMetaTreeView() + { + treeMeta.Nodes.Clear(); + if (treeViewMain.SelectedNode is TreeNode node && + node.Tag is PckAsset asset) + { + foreach (KeyValuePair property in asset.GetProperties()) + { + treeMeta.Nodes.Add(CreateNode(property.Key, property)); + } + } + } + + private void UpdateRichPresence() + { + if (EditorValue is not null && + TryGetLocFile(out LOCFile locfile) && + locfile.HasLocEntry("IDS_DISPLAY_NAME") && + locfile.Languages.Contains("en-EN")) + { + RPC.SetPresence("Editing a Pack:", $" > {locfile.GetLocEntry("IDS_DISPLAY_NAME", "en-EN")}"); + return; + } + // default + RPC.SetPresence("An Open Source .PCK File Editor"); + } + + private static PckAsset CreateNewAudioAsset(bool isLittle, PckAudioFile audioFile) + { + PckAsset newAsset = new PckAsset("audio.pck", PckAssetType.AudioFile); + newAsset.SetData(new PckAudioFileWriter(audioFile, isLittle ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + return newAsset; + } + + private static PckAudioFile CreateNewAudioFile() + { + PckAudioFile audioFile = new PckAudioFile(); + audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); + audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); + audioFile.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); + return audioFile; + } + + private void addFileToolStripMenuItem_Click(object sender, EventArgs e) + { + using var ofd = new OpenFileDialog(); + // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? + // So now it's formatted correctly and now displays the file type name in the dialog. + ofd.Filter = "All files (*.*)|*.*"; + ofd.Multiselect = false; + + if (ofd.ShowDialog(this) == DialogResult.OK) + { + using AddFilePrompt diag = new AddFilePrompt("res/" + Path.GetFileName(ofd.FileName)); + if (diag.ShowDialog(this) == DialogResult.OK) + { + if (EditorValue.File.Contains(diag.Filepath, diag.Filetype)) + { + MessageBox.Show(this, $"'{diag.Filepath}' of type {diag.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + PckAsset asset = EditorValue.File.CreateNewAsset(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); + + BuildMainTreeView(); + _wasModified = true; + } + } + return; + } + + private void addTextureToolStripMenuItem_Click(object sender, EventArgs e) + { + using OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Filter = "Texture File(*.png,*.tga)|*.png;*.tga"; + if (fileDialog.ShowDialog(this) == DialogResult.OK) + { + using TextPrompt renamePrompt = new TextPrompt(Path.GetFileName(fileDialog.FileName)); + renamePrompt.LabelText = "Path"; + if (renamePrompt.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(renamePrompt.NewText)) + { + if (EditorValue.File.Contains(renamePrompt.NewText, PckAssetType.TextureFile)) + { + MessageBox.Show(this, $"'{renamePrompt.NewText}' already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + PckAsset asset = EditorValue.File.CreateNewAsset(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); + BuildMainTreeView(); + _wasModified = true; + } + } + } + + [Obsolete("Refactor or remove this")] + private void importSkinToolStripMenuItem_Click(object sender, EventArgs e) + { + using (OpenFileDialog contents = new OpenFileDialog()) + { + contents.Title = "Select Extracted Skin File"; + contents.Filter = "Skin File (*.png)|*.png"; + + if (contents.ShowDialog() == DialogResult.OK) + { + string skinNameImport = Path.GetFileName(contents.FileName); + byte[] data = File.ReadAllBytes(contents.FileName); + PckAsset mfNew = EditorValue.File.CreateNewAsset(skinNameImport, PckAssetType.SkinFile); + mfNew.SetData(data); + string propertyFile = Path.GetFileNameWithoutExtension(contents.FileName) + ".txt"; + if (File.Exists(propertyFile)) + { + string[] txtProperties = File.ReadAllLines(propertyFile); + if ((txtProperties.Contains("DISPLAYNAMEID") && txtProperties.Contains("DISPLAYNAME")) || + txtProperties.Contains("THEMENAMEID") && txtProperties.Contains("THEMENAME") && + TryGetLocFile(out LOCFile locFile)) + { + // do stuff + //l.AddLocKey(locThemeId, locTheme); + //using (var stream = new MemoryStream()) + //{ + // LOCFileWriter.Write(stream, locFile); + // locdata.SetData(stream.ToArray()); + //} + } + + try + { + foreach (string prop in txtProperties) + { + string[] arg = prop.Split(':'); + if (arg.Length < 2) + continue; + string key = arg[0]; + string value = arg[1]; + if (key == "DISPLNAMEID" || key == "THEMENAMEID") + { + + } + mfNew.AddProperty(key, value); + } + _wasModified = true; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + } + } + } + } + + private void folderToolStripMenuItem_Click(object sender, EventArgs e) + { + TextPrompt folderNamePrompt = new TextPrompt(); + if (treeViewMain.SelectedNode is not null) + folderNamePrompt.contextLabel.Text = + $"New folder at the location of \"{( + !treeViewMain.SelectedNode.IsTagOfType() + ? "/" + treeViewMain.SelectedNode.FullPath + : treeViewMain.SelectedNode.Parent == null ? "/" : "/" + treeViewMain.SelectedNode.Parent.FullPath)}\""; + folderNamePrompt.OKButtonText = "Add"; + if (folderNamePrompt.ShowDialog(this) == DialogResult.OK) + { + TreeNode folerNode = CreateNode(folderNamePrompt.NewText); + folerNode.ImageIndex = 0; + folerNode.SelectedImageIndex = 0; + + TreeNodeCollection nodeCollection = treeViewMain.Nodes; + if (treeViewMain.SelectedNode is TreeNode node) + { + if (node.Tag is PckAsset asset && + asset.Type != PckAssetType.TexturePackInfoFile && + asset.Type != PckAssetType.SkinDataFile) + { + if (node.Parent is TreeNode parentNode) + { + nodeCollection = parentNode.Nodes; + } + } + else + nodeCollection = node.Nodes; + } + nodeCollection.Add(folerNode); + } + } + + private void SetFileType(PckAssetType type) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) + { + Debug.WriteLine($"Setting {asset.Type} to {type}"); + asset.Type = type; + int nodeIconId = GetNodeIconId(type); + treeViewMain.SelectedNode.ImageIndex = nodeIconId; + treeViewMain.SelectedNode.SelectedImageIndex = nodeIconId; + } + } + + private void treeViewMain_AfterSelect(object sender, TreeViewEventArgs e) + { + ReloadMetaTreeView(); + + entryTypeTextBox.Text = entryDataTextBox.Text = labelImageSize.Text = string.Empty; + buttonEdit.Visible = false; + + previewPictureBox.Image = Resources.NoImageFound; + viewFileInfoToolStripMenuItem.Visible = false; + + if (!e.Node.TryGetTagData(out PckAsset asset)) + { + return; + } + + viewFileInfoToolStripMenuItem.Visible = true; + if (asset.HasProperty("BOX")) + { + buttonEdit.Text = "EDIT BOXES"; + buttonEdit.Visible = true; + } + else if (asset.HasProperty("ANIM") && + asset.GetProperty("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL))) + { + buttonEdit.Text = "View Skin"; + buttonEdit.Visible = true; + } + + switch (asset.Type) + { + case PckAssetType.SkinFile: + case PckAssetType.CapeFile: + case PckAssetType.TextureFile: + { + Image img = asset.GetTexture(); + + previewPictureBox.Image = img; + labelImageSize.Text = $"{previewPictureBox.Image.Size.Width}x{previewPictureBox.Image.Size.Height}"; + + if (asset.Type != PckAssetType.TextureFile) + break; + + ResourceLocation resourceLocation = ResourceLocation.GetFromPath(asset.Filename); + if (resourceLocation is null || resourceLocation.Category == ResourceCategory.Unknown) + break; + + if (resourceLocation.Category == ResourceCategory.ItemAnimation || + resourceLocation.Category == ResourceCategory.BlockAnimation && + !asset.IsMipmappedFile()) + { + buttonEdit.Text = "EDIT TILE ANIMATION"; + buttonEdit.Visible = true; + break; + } + + buttonEdit.Text = "EDIT TEXTURE ATLAS"; + buttonEdit.Visible = true; + } + break; + + case PckAssetType.LocalisationFile: + buttonEdit.Text = "EDIT LOC"; + buttonEdit.Visible = true; + break; + + case PckAssetType.AudioFile: + buttonEdit.Text = "EDIT MUSIC CUES"; + buttonEdit.Visible = true; + break; + + case PckAssetType.ColourTableFile when asset.Filename == "colours.col": + buttonEdit.Text = "EDIT COLORS"; + buttonEdit.Visible = true; + break; + + case PckAssetType.BehavioursFile when asset.Filename == "behaviours.bin": + buttonEdit.Text = "EDIT BEHAVIOURS"; + buttonEdit.Visible = true; + break; + default: + buttonEdit.Visible = false; + break; + } + } + + private void treeViewMain_DoubleClick(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset asset) + { + if (asset.Size <= 0) + { + Trace.WriteLine($"'{asset.Filename}' has no data attached.", category: nameof(treeViewMain_DoubleClick)); + return; + } + _pckAssetTypeHandler[asset.Type]?.Invoke(asset); + } + } + + // Most of the code below is modified code from this link: + // https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0 + // - MattNL + + private void treeViewMain_ItemDrag(object sender, ItemDragEventArgs e) + { + if (e.Button != MouseButtons.Left || e.Item is not TreeNode node) + return; + + if ((node.TryGetTagData(out PckAsset asset) && EditorValue.File.Contains(asset.Filename, asset.Type)) || node.Parent is TreeNode) + { + // TODO: add (mouse) scrolling while dragging item(s) + treeViewMain.DoDragDrop(node, DragDropEffects.Scroll | DragDropEffects.Move); + } + } + + private void treeViewMain_DragOver(object sender, DragEventArgs e) + { + Point dragLocation = new Point(e.X, e.Y); + TreeNode node = treeViewMain.GetNodeAt(treeViewMain.PointToClient(dragLocation)); + treeViewMain.SelectedNode = node.IsTagOfType() ? null : node; + } + + private void treeViewMain_DragEnter(object sender, DragEventArgs e) + { + e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : e.AllowedEffect; + BringToFront(); + Focus(); + treeViewMain.Focus(); + } + + private void treeViewMain_DragDrop(object sender, DragEventArgs e) + { + // Retrieve the client coordinates of the drop location. + Point dragLocation = new Point(e.X, e.Y); + Point targetPoint = treeViewMain.PointToClient(dragLocation); + + if (!treeViewMain.ClientRectangle.Contains(targetPoint)) + return; + + // Retrieve the node at the drop location. + TreeNode targetNode = treeViewMain.GetNodeAt(targetPoint); + + if (e.Data.GetDataPresent(DataFormats.FileDrop) && e.Data.GetData(DataFormats.FileDrop) is string[] filesDropped) + { + IEnumerable files = filesDropped.Where(File.Exists); + IEnumerable directoryFiles = filesDropped + .Where(f => (File.GetAttributes(f) & FileAttributes.Directory) != 0) + .SelectMany(dir => Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)); + + string baseDirectory = Path.GetDirectoryName(filesDropped.First()); + + IEnumerable importPaths = files.Concat(directoryFiles); + + ImportFiles(baseDirectory, importPaths, string.IsNullOrWhiteSpace(targetNode?.FullPath) ? string.Empty : targetNode?.FullPath); + return; + } + + string dataFormat = typeof(TreeNode).FullName; + + if (targetNode is null) + return; + + if (!e.Data.GetDataPresent(dataFormat)) + return; + + bool isTargetPckFile = targetNode.IsTagOfType(); + TreeNode draggedNode = e.Data.GetData(dataFormat) as TreeNode; + if (draggedNode == null) + { + Debug.WriteLine("Dragged node is null."); + return; + } + + if (targetNode.Equals(draggedNode)) + { + Debug.WriteLine("Dragged node was not moved."); + return; + } + + if (targetNode.Equals(draggedNode.Parent)) + { + Debug.WriteLine("target node is parent of dragged node... nothing done."); + return; + } + + if (draggedNode.Equals(targetNode.Parent)) + { + Debug.WriteLine("dragged node is parent of target node... nothing done."); + return; + } + + if (targetNode.Parent == null && isTargetPckFile && draggedNode.Parent == null) + { + Debug.WriteLine("target node is file and is in the root... nothing done."); + return; + } + + if ((targetNode.Parent?.Equals(draggedNode.Parent) ?? false) && isTargetPckFile) + { + Debug.WriteLine("target node and dragged node have the same parent... nothing done."); + return; + } + + Debug.WriteLine($"Target drop location is {(isTargetPckFile ? "file" : "folder")}."); + + // Retrieve the node that was dragged. + if (draggedNode.TryGetTagData(out PckAsset draggedAsset) && + targetNode.FullPath != draggedAsset.Filename) + { + Debug.WriteLine(draggedAsset.Filename + " was droped onto " + targetNode.FullPath); + string newFilePath = Path.Combine(isTargetPckFile + ? Path.GetDirectoryName(targetNode.FullPath) + : targetNode.FullPath, Path.GetFileName(draggedAsset.Filename)); + Debug.WriteLine("New filepath: " + newFilePath); + draggedAsset.Filename = newFilePath; + _wasModified = true; + BuildMainTreeView(); + return; + } + else + { + IEnumerable pckFiles = GetAllChildNodes(draggedNode.Nodes).Where(t => t.IsTagOfType()).Select(t => t.Tag as PckAsset); + string oldPath = draggedNode.FullPath; + string newPath = Path.Combine(isTargetPckFile ? Path.GetDirectoryName(targetNode.FullPath) : targetNode.FullPath, draggedNode.Text).Replace('\\', '/'); + foreach (PckAsset pckFile in pckFiles) + { + pckFile.Filename = Path.Combine(newPath, pckFile.Filename.Substring(oldPath.Length + 1)).Replace('\\', '/'); + } + _wasModified = true; + BuildMainTreeView(); + } + } + + private void ImportFiles(string baseDirectory, IEnumerable files, string prefix) + { + int fileCount = files.Count(); + int addedCount = 0; + int skippedFiles = 0; + int skipAttempts = 3; + int typeDuplication = 0; + PckAssetType lastSelectedAssetType = PckAssetType.SkinFile; + bool askForAssetType = true; + foreach (var filepath in files) + { + string assetPath = Path.Combine(prefix + filepath.Substring(baseDirectory.Length)).TrimStart('/', '\\'); + PckAssetType assetType = lastSelectedAssetType; + + if (askForAssetType) + { + using AddFilePrompt addFile = new AddFilePrompt(assetPath); + if (addFile.ShowDialog(this) != DialogResult.OK) + { + skippedFiles++; + skipAttempts--; + if (skipAttempts > 0) + continue; + + int remainingFileCount = fileCount - addedCount - skippedFiles; + DialogResult abortFurtherImport = MessageBox.Show($"Do you wan't to abort further file imports?\n{remainingFileCount} file(s) left.", "Abort further import", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); + if (abortFurtherImport == DialogResult.Yes) + { + skippedFiles += remainingFileCount; + break; + } + skipAttempts = 3; + continue; + } + + assetType = addFile.Filetype; + assetPath = addFile.Filepath; + + if (lastSelectedAssetType == assetType) + typeDuplication++; + lastSelectedAssetType = addFile.Filetype; + if (typeDuplication > 1) + { + DialogResult useSameTypeForRest = MessageBox.Show($"Do you want to import all remaining files as {lastSelectedAssetType}?", "Import all as", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); + if (useSameTypeForRest == DialogResult.Yes) + { + askForAssetType = false; + } + } + } + + if (EditorValue.File.Contains(filepath, assetType)) + { + if (askForAssetType) + MessageBox.Show(this, $"'{assetPath}' of type {assetType} already exists.\nSkiping file.", "File already exists", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); + Debug.WriteLine($"'{assetPath}' of type {assetType} already exists.\nSkiping file."); + continue; + } + PckAsset importedAsset = EditorValue.File.CreateNewAsset(assetPath, assetType, () => File.ReadAllBytes(filepath)); + string propertyFile = filepath + ".txt"; + if (File.Exists(propertyFile)) + { + importedAsset.DeserializeProperties(File.ReadAllLines(propertyFile)); + } + addedCount++; + } + Trace.TraceInformation("[{0}] Imported {1} file(s).", nameof(ImportFiles), addedCount); + Trace.TraceInformation("[{0}] Skipped {1} file(s).", nameof(ImportFiles), skippedFiles); + if (addedCount > 0) + { + _wasModified = true; + BuildMainTreeView(); + } + } + + private IEnumerable GetEndingNodes(TreeNodeCollection collection) + { + List trailingNodes = new List(collection.Count); + foreach (TreeNode node in collection) + { + if (node.Nodes.Count > 0) + { + trailingNodes.AddRange(GetEndingNodes(node.Nodes)); + continue; + } + trailingNodes.Add(node); + } + return trailingNodes; + } + + private void ImportFiles(string[] files) + { + int addedCount = 0; + foreach (var file in files) + { + using AddFilePrompt addFile = new AddFilePrompt(Path.GetFileName(file)); + if (addFile.ShowDialog(this) != DialogResult.OK) + continue; + + if (EditorValue.File.Contains(addFile.Filepath, addFile.Filetype)) + { + MessageBox.Show(this, $"'{addFile.Filepath}' of type {addFile.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); + continue; + } + EditorValue.File.CreateNewAsset(addFile.Filepath, addFile.Filetype, () => File.ReadAllBytes(file)); + addedCount++; + + BuildMainTreeView(); + _wasModified = true; + } + Trace.TraceInformation("[{0}] Imported {1} file(s).", nameof(ImportFiles), addedCount); + } + + private void createSkinToolStripMenuItem_Click(object sender, EventArgs e) + { + using (AddSkinPrompt addNewSkinDialog = new AddSkinPrompt()) + if (addNewSkinDialog.ShowDialog() == DialogResult.OK) + { + TryGetLocFile(out LOCFile locFile); + PckAsset skinAsset = addNewSkinDialog.NewSkin.CreateFile(locFile); + EditorValue.File.AddAsset(skinAsset); + + bool hasSkinsFolder = treeViewMain.Nodes.ContainsKey("Skins"); + if (hasSkinsFolder) + skinAsset.Filename = skinAsset.Filename.Insert(0, "Skins/"); // Then Skins folder + EditorValue.File.AddAsset(skinAsset); + + if (addNewSkinDialog.NewSkin.HasCape) + { + PckAsset capeFile = addNewSkinDialog.NewSkin.CreateCapeFile(); + if (hasSkinsFolder) + capeFile.Filename = capeFile.Filename.Insert(0, "Skins/"); // Then Skins folder + EditorValue.File.AddAsset(capeFile); + } + + TrySetLocFile(locFile); + _wasModified = true; + BuildMainTreeView(); + } + } + + private void createAnimatedTextureToolStripMenuItem_Click(object sender, EventArgs e) + { + using ChangeTile diag = new ChangeTile(); + if (diag.ShowDialog(this) != DialogResult.OK) + return; + + string animationFilepath = $"{ResourceLocation.GetPathFromCategory(diag.Category)}/{diag.SelectedTile.InternalName}.png"; + + if (EditorValue.File.Contains(animationFilepath, PckAssetType.TextureFile)) + { + MessageBox.Show(this, $"{diag.SelectedTile.DisplayName} is already present.", "File already present"); + return; + } + + Animation newAnimation = default; + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (animation) => + { + newAnimation = animation; + }); + + using AnimationEditor animationEditor = new AnimationEditor(Animation.CreateEmpty(), saveContext, diag.SelectedTile.DisplayName, !diag.SelectedTile.InternalName.EqualsAny("clock", "compass")); + if (animationEditor.ShowDialog() == DialogResult.OK && newAnimation is not null) + { + _wasModified = true; + PckAsset asset = EditorValue.File.CreateNewAsset(animationFilepath, PckAssetType.TextureFile); + asset.SetSerializedData(newAnimation, AnimationSerializer.DefaultSerializer); + BuildMainTreeView(); + ReloadMetaTreeView(); + } + } + + private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) + { + if (EditorValue.File.Contains(PckAssetType.AudioFile)) + { + // the chance of this happening is really really slim but just in case + MessageBox.Show(this, "There is already an audio file in this PCK!", "Can't create audio.pck"); + return; + } + + if (string.IsNullOrEmpty(_location)) + { + MessageBox.Show(this, "You must save your pck before creating or opening a music cues PCK file", "Can't create audio.pck"); + return; + } + + PckAudioFile newAudioFile = CreateNewAudioFile(); + PckAsset newAudioAsset = CreateNewAudioAsset(LittleEndianCheckBox.Checked, newAudioFile); + + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (audioFile) => + { + newAudioAsset.SetData(new PckAudioFileWriter(audioFile, LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + }); + + AudioEditor diag = new AudioEditor(newAudioFile, saveContext); + if (diag.ShowDialog(this) == DialogResult.OK) + { + EditorValue.File.AddAsset(newAudioAsset); + } + diag.Dispose(); + BuildMainTreeView(); + } + + private void colourscolToolStripMenuItem_Click(object sender, EventArgs e) + { + if (EditorValue.File.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out _)) + { + MessageBox.Show(this, "A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); + return; + } + PckAsset newColorAsset = EditorValue.File.CreateNewAsset("colours.col", PckAssetType.ColourTableFile); + newColorAsset.SetData(Resources.tu69colours); + BuildMainTreeView(); + } + + private void CreateSkinsPCKToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (EditorValue.File.TryGetAsset("Skins.pck", PckAssetType.SkinDataFile, out _)) + { + MessageBox.Show(this, "A Skins.pck file already exists in this PCK and a new one cannot be created.", "Operation aborted"); + return; + } + + EditorValue.File.CreateNewAsset("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), + LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian)); + + BuildMainTreeView(); + } + + private void behavioursbinToolStripMenuItem_Click(object sender, EventArgs e) + { + if (EditorValue.File.TryGetAsset("behaviours.bin", PckAssetType.BehavioursFile, out _)) + { + MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); + return; + } + + EditorValue.File.CreateNewAsset("behaviours.bin", PckAssetType.BehavioursFile, new BehavioursWriter(new BehaviourFile())); + BuildMainTreeView(); + } + + private void entityMaterialsbinToolStripMenuItem_Click(object sender, EventArgs e) + { + if (EditorValue.File.TryGetAsset("entityMaterials.bin", PckAssetType.MaterialFile, out _)) + { + MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); + return; + } + var materialContainer = new MaterialContainer(); + materialContainer.InitializeDefault(); + EditorValue.File.CreateNewAsset("entityMaterials.bin", PckAssetType.MaterialFile, new MaterialFileWriter(materialContainer)); + BuildMainTreeView(); + } + + [Obsolete("Refactor or remove this")] + private void importExtractedSkinsFolder(object sender, EventArgs e) + { + OpenFolderDialog contents = new OpenFolderDialog(); + if (contents.ShowDialog(Handle) == true) + { + //checks to make sure selected path exist + if (!Directory.Exists(contents.ResultPath)) + { + MessageBox.Show("Directory Lost"); + return; + } + // creates variable to indicate wether current pck skin structure is mashup or regular skin + bool hasSkinsPck = EditorValue.File.HasAsset("Skins.pck", PckAssetType.SkinDataFile); + + foreach (var fullfilename in Directory.GetFiles(contents.ResultPath, "*.png")) + { + string filename = Path.GetFileNameWithoutExtension(fullfilename); + // sets file type based on wether its a cape or skin + PckAssetType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) + ? PckAssetType.CapeFile + : PckAssetType.SkinFile; + string pckfilepath = (hasSkinsPck ? "Skins/" : string.Empty) + filename + ".png"; + + + PckAsset newFile = new PckAsset(pckfilepath, pckfiletype); + byte[] filedata = File.ReadAllBytes(fullfilename); + newFile.SetData(filedata); + + if (File.Exists(fullfilename + ".txt")) + { + string[] properties = File.ReadAllText(fullfilename + ".txt").Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + foreach (string property in properties) + { + string[] param = property.Split(':'); + if (param.Length < 2) + continue; + newFile.AddProperty(param[0], param[1]); + //switch (param[0]) + //{ + // case "DISPLAYNAMEID": + // locNameId = param[1]; + // continue; + + // case "DISPLAYNAME": + // locName = param[1]; + // continue; + + // case "THEMENAMEID": + // locThemeId = param[1]; + // continue; + + // case "THEMENAME": + // locTheme = param[1]; + // continue; + //} + } + } + if (hasSkinsPck) + { + PckAsset skinsFileAsset = EditorValue.File.GetAsset("Skins.pck", PckAssetType.SkinDataFile); + using (var ms = new MemoryStream(skinsFileAsset.Data)) + { + //var reader = new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + //var skinspck = reader.FromStream(ms); + //skinspck.Files.Add(newFile); + //ms.Position = 0; + //var writer = new PckFileWriter(skinspck, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); + //writer.WriteToStream(ms); + //skinsfile.SetData(ms.ToArray()); + } + continue; + } + EditorValue.File.AddAsset(newFile); + } + BuildMainTreeView(); + _wasModified = true; + } + } + + private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && + asset.Type == PckAssetType.SkinFile) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Filter = "3DS Texture|*.3dst"; + saveFileDialog.DefaultExt = ".3dst"; + if (saveFileDialog.ShowDialog(this) == DialogResult.OK) + { + Image img = asset.GetTexture(); + var writer = new _3DSTextureWriter(img); + writer.WriteToFile(saveFileDialog.FileName); + } + } + } + + private void generateMipMapTextureToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type == PckAssetType.TextureFile) + { + string textureDirectory = Path.GetDirectoryName(asset.Filename); + string textureName = Path.GetFileNameWithoutExtension(asset.Filename); + + if (asset.IsMipmappedFile()) + return; + + string textureExtension = Path.GetExtension(asset.Filename); + + using NumericPrompt numericPrompt = new NumericPrompt(0); + numericPrompt.Minimum = 1; + numericPrompt.Maximum = 4; // 5 is the presumed max MipMap level + numericPrompt.ToolTipText = "You can enter the amount of MipMap levels that you would like to generate. " + + "For example: if you enter 2, MipMapLevel1.png and MipMapLevel2.png will be generated"; + numericPrompt.TextLabel.Text = "Levels"; + + if (numericPrompt.ShowDialog(this) == DialogResult.OK) + { + for (int i = 2; i < 2 + numericPrompt.SelectedValueAsInt; i++) + { + string mippedPath = $"{textureDirectory}/{textureName}MipMapLevel{i}{textureExtension}"; + Debug.WriteLine(mippedPath); + if (EditorValue.File.HasAsset(mippedPath, PckAssetType.TextureFile)) + EditorValue.File.RemoveAsset(EditorValue.File.GetAsset(mippedPath, PckAssetType.TextureFile)); + PckAsset mipMappedAsset = new PckAsset(mippedPath, PckAssetType.TextureFile); + + Image originalTexture = asset.GetTexture(); + int newWidth = Math.Max(originalTexture.Width / (int)Math.Pow(2, i - 1), 1); + int newHeight = Math.Max(originalTexture.Height / (int)Math.Pow(2, i - 1), 1); + + Rectangle tileArea = new Rectangle(0, 0, newWidth, newHeight); + Image mippedTexture = new Bitmap(newWidth, newHeight); + using (Graphics gfx = Graphics.FromImage(mippedTexture)) + { + gfx.SmoothingMode = SmoothingMode.None; + gfx.InterpolationMode = InterpolationMode.NearestNeighbor; + gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; + gfx.DrawImage(originalTexture, tileArea); + } + + mipMappedAsset.SetTexture(mippedTexture); + + EditorValue.File.InsertAsset(EditorValue.File.IndexOfAsset(asset) + i - 1, mipMappedAsset); + } + BuildMainTreeView(); + } + } + } + + private void viewFileInfoToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.Tag is PckAsset asset) + { + MessageBox.Show( + $"Asset path: {asset.Filename}" + + $"\nAsset type: {(int)asset.Type} ({asset.Type})" + + $"\nAsset size: {asset.Size}" + + $"\nProperties count: {asset.PropertyCount}" + , Path.GetFileName(asset.Filename) + " Asset info"); + } + } + + private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && + asset.Type == PckAssetType.SkinFile) + { + foreach (KeyValuePair p in asset.GetProperties().ToList()) + { + if (p.Key == "BOX" || p.Key == "OFFSET") + asset.SetProperty(asset.GetPropertyIndex(p), new KeyValuePair(p.Key, p.Value.Replace(',', '.'))); + } + ReloadMetaTreeView(); + _wasModified = true; + } + } + + private void extractToolStripMenuItem_Click(object sender, EventArgs e) + { + TreeNode node = treeViewMain.SelectedNode; + + if (node == null) + { + MessageBox.Show(this, "The selected node was null. Please select a node and try again.", "Node not extracted"); + + return; + } + + if (node.Tag == null) + { + OpenFolderDialog dialog = new OpenFolderDialog(); + dialog.Title = @"Select destination folder"; + + if (dialog.ShowDialog(Handle) == true) + extractFolder(dialog.ResultPath); + } + else if (node.TryGetTagData(out PckAsset asset)) + { + using SaveFileDialog exFile = new SaveFileDialog(); + exFile.FileName = Path.GetFileName(asset.Filename); + exFile.Filter = Path.GetExtension(asset.Filename).Replace(".", string.Empty) + " File|*" + Path.GetExtension(asset.Filename); + if (exFile.ShowDialog(this) != DialogResult.OK || + // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable + string.IsNullOrWhiteSpace(Path.GetDirectoryName(exFile.FileName))) + { + MessageBox.Show(this, "The chosen directory is invalid. Please choose a different one and try again.", "Node not extracted"); + + return; + } + + extractFile(exFile.FileName, asset); + } + + // Verification that file extraction path was successful + MessageBox.Show(this, $"\"{node.Text}\" successfully extracted"); + } + + private void extractFolder(string outPath) + { + TreeNode node = treeViewMain.SelectedNode; + + string selectedFolder = node.FullPath; + + foreach (PckAsset asset in EditorValue.File.GetAssets().Where(asset => asset.Filename.StartsWith(selectedFolder))) + { + extractFolderFile(outPath, asset); + } + } + + private void extractFolderFile(string outPath, PckAsset asset) + { + TreeNode node = treeViewMain.SelectedNode; + + // abb = "Abbreviated Path" + string abbPath = Path.GetDirectoryName(asset.Filename); + int startIndex = abbPath.IndexOf(node.Text); + abbPath = abbPath.Substring(startIndex, abbPath.Length - startIndex); + string finalPath = ($"{outPath}/{abbPath}/").Replace('\\', '/'); + + if (!Directory.Exists(finalPath)) + Directory.CreateDirectory(finalPath); + + extractFile(finalPath + "/" + Path.GetFileName(asset.Filename), asset); + } + + private void extractFile(string outFilePath, PckAsset asset) + { + File.WriteAllBytes(outFilePath, asset.Data); + if (asset.PropertyCount > 0) + { + File.WriteAllLines($"{outFilePath}.txt", asset.SerializeProperties()); + } + } + + private void cloneFileToolStripMenuItem_Click(object sender, EventArgs e) + { + TreeNode node = treeViewMain.SelectedNode; + if (node == null || !node.IsTagOfType()) + return; + string path = node.FullPath; + + using TextPrompt diag = new TextPrompt(node.Tag is null ? Path.GetFileName(node.FullPath) : node.FullPath); + diag.contextLabel.Text = $"Creating a clone of \"{path}\". Ensure that the path isn't yet."; + diag.OKButtonText = "Clone"; + + if (diag.ShowDialog(this) == DialogResult.OK) + { + if (node.Tag is PckAsset asset) + { + TreeNode newNode = new TreeNode(); + newNode.Text = Path.GetFileName(diag.NewText); + var newFile = new PckAsset(diag.NewText, asset.Type); + foreach (KeyValuePair property in asset.GetProperties()) + { + newFile.AddProperty(property); + } + newFile.SetData(asset.Data); + newFile.Filename = diag.NewText; + newNode.Tag = newFile; + newNode.ImageIndex = node.ImageIndex; + newNode.SelectedImageIndex = node.SelectedImageIndex; + + if (GetAllChildNodes(treeViewMain.Nodes).FirstOrDefault(n => n.FullPath == diag.NewText) is not null) + { + MessageBox.Show( + this, + $"A file with the path \"{diag.NewText}\" already exists. " + + $"Please try again with a different name.", + "Key already exists"); + return; + } + + TreeNodeCollection nodeCollection = node.Parent?.Nodes ?? treeViewMain.Nodes; + nodeCollection.Insert(node.Index + 1, newNode); + + EditorValue.File.InsertAsset(node.Index + 1, newFile); + BuildMainTreeView(); + _wasModified = true; + } + } + } + + private void renameFileToolStripMenuItem_Click(object sender, EventArgs e) + { + TreeNode node = treeViewMain.SelectedNode; + if (node == null) + return; + string path = node.FullPath; + + bool isFile = node.TryGetTagData(out PckAsset asset); + + using TextPrompt diag = new TextPrompt(isFile ? asset.Filename : Path.GetFileName(node.FullPath)); + + if (diag.ShowDialog(this) == DialogResult.OK) + { + if (isFile) + { + if (EditorValue.File.Contains(diag.NewText, asset.Type)) + { + MessageBox.Show(this, $"{diag.NewText} already exists", "File already exists"); + return; + } + asset.Filename = diag.NewText; + } + else // folders + { + node.Text = diag.NewText; + foreach (TreeNode childNode in GetAllChildNodes(node.Nodes)) + { + if (childNode.Tag is PckAsset folderAsset) + { + if (folderAsset.Filename == diag.NewText) + continue; + folderAsset.Filename = childNode.FullPath; + } + } + } + _wasModified = true; + BuildMainTreeView(); + } + } + + private void replaceToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.Tag is PckAsset asset) + { + using var ofd = new OpenFileDialog(); + // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? So now it's formatted correctly and now displays the file type name in the dialog. + + string extra_extensions = ""; + + switch (asset.Type) + { + case PckAssetType.TextureFile: + if (Path.GetExtension(asset.Filename) == ".png") + extra_extensions = ";*.tga"; + else if (Path.GetExtension(asset.Filename) == ".tga") + extra_extensions = ";*.png"; + break; + } + + string fileExt = Path.GetExtension(asset.Filename); + + ofd.Filter = $"{asset.Type} (*{fileExt}{extra_extensions})|*{fileExt}{extra_extensions}"; + if (ofd.ShowDialog(this) == DialogResult.OK) + { + string newFileExt = Path.GetExtension(ofd.FileName); + asset.SetData(File.ReadAllBytes(ofd.FileName)); + asset.Filename = asset.Filename.Replace(fileExt, newFileExt); + _wasModified = true; + BuildMainTreeView(); + } + return; + } + MessageBox.Show(this, "Can't replace a folder."); + } + + /// + /// Action to run before an asset will be deleted + /// + /// Asset to remove + /// True if the remove should be canceled, otherwise False + private bool BeforeFileRemove(PckAsset asset) + { + string itemPath = ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation); + + // warn the user about deleting compass.png and clock.png + if (asset.Type == PckAssetType.TextureFile && + (asset.Filename == itemPath + "/compass.png" || asset.Filename == itemPath + "/clock.png")) + { + if (MessageBox.Show(this, "Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", + MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) + return true; + } + + // remove loc key if its a skin/cape + if (asset.Type == PckAssetType.SkinFile || asset.Type == PckAssetType.CapeFile) + { + if (TryGetLocFile(out LOCFile locFile)) + { + if (asset.TryGetProperty("THEMENAMEID", out string value)) + locFile.RemoveLocKey(value); + if (asset.TryGetProperty("DISPLAYNAMEID", out value)) + locFile.RemoveLocKey(value); + TrySetLocFile(locFile); + } + } + return false; + } + + private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) + { + TreeNode node = treeViewMain.SelectedNode; + if (node == null) + return; + + string path = node.FullPath; + + if (node.TryGetTagData(out PckAsset asset)) + { + if (!BeforeFileRemove(asset) && EditorValue.File.RemoveAsset(asset)) + { + node.Remove(); + _wasModified = true; + } + } + else if (MessageBox.Show(this, "Are you sure want to delete this folder? All contents will be deleted", "Warning", + MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) + { + string pckFolderDir = node.FullPath; + EditorValue.File.RemoveAll(file => file.Filename.StartsWith(pckFolderDir) && !BeforeFileRemove(file)); + node.Remove(); + _wasModified = true; + } + } + + private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e) + { + if (e.Node is TreeNode t && t.Tag is KeyValuePair property) + { + entryTypeTextBox.Text = property.Key; + entryDataTextBox.Text = property.Value; + } + } + + private void treeViewMain_KeyDown(object sender, KeyEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Delete: + deleteFileToolStripMenuItem_Click(sender, e); + break; + case Keys.F2: + renameFileToolStripMenuItem_Click(sender, e); + break; + } + } + + private void treeViewMain_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) + { + // for now name edits are done through the 'rename' context menu item + // TODO: add folder renaming + //e.CancelEdit = e.Node.Tag is PckAsset; + e.CancelEdit = true; + } + + private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) + { + IEnumerable props = asset.SerializeProperties(seperater: " "); + using (var input = new MultiTextPrompt(props)) + { + if (input.ShowDialog(this) == DialogResult.OK) + { + asset.ClearProperties(); + asset.DeserializeProperties(input.TextOutput); + ReloadMetaTreeView(); + _wasModified = true; + } + } + } + } + + private void treeMeta_DoubleClick(object sender, EventArgs e) + { + if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair property && + treeViewMain.SelectedNode is TreeNode node && node.Tag is PckAsset asset) + { + if (asset.HasProperty(property.Key)) + { + switch (property.Key) + { + case "ANIM" when asset.Type == PckAssetType.SkinFile: + try + { + using ANIMEditor diag = new ANIMEditor(SkinANIM.FromString(property.Value)); + if (diag.ShowDialog(this) == DialogResult.OK) + { + asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); + ReloadMetaTreeView(); + _wasModified = true; + } + return; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid ANIM value: " + property.Value); + MessageBox.Show(this, "Failed to parse ANIM value, aborting to normal functionality. Please make sure the value only includes hexadecimal characters (0-9,A-F) and has no more than 8 characters."); + } + break; + + case "BOX" when asset.Type == PckAssetType.SkinFile: + try + { + using BoxEditor diag = new BoxEditor(property.Value, false); + if (diag.ShowDialog(this) == DialogResult.OK) + { + asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); + ReloadMetaTreeView(); + _wasModified = true; + } + return; + } + catch (Exception ex) + { + Debug.WriteLine(ex.Message); + Trace.WriteLine("Invalid BOX value: " + property.Value); + MessageBox.Show(this, "Failed to parse BOX value, aborting to normal functionality."); + } + break; + + default: + break; + + } + + using (AddPropertyPrompt addProperty = new AddPropertyPrompt(property)) + { + if (addProperty.ShowDialog(this) == DialogResult.OK) + { + asset.SetProperty(asset.GetPropertyIndex(property), addProperty.Property); + ReloadMetaTreeView(); + _wasModified = true; + } + } + } + } + } + + private void treeMeta_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyData == Keys.Delete) + deleteEntryToolStripMenuItem_Click(sender, e); + } + + private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) + { + using var input = new MultiTextPrompt(); + if (input.ShowDialog(this) == DialogResult.OK) + { + asset.DeserializeProperties(input.TextOutput); + ReloadMetaTreeView(); + _wasModified = true; + } + } + } + + private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset asset) + { + using BoxEditor diag = new BoxEditor(SkinBOX.DefaultHead, false); + if (diag.ShowDialog(this) == DialogResult.OK) + { + asset.AddProperty("BOX", diag.Result); + ReloadMetaTreeView(); + _wasModified = true; + } + return; + } + } + + private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) + { + using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); + if (diag.ShowDialog(this) == DialogResult.OK) + { + asset.AddProperty("ANIM", diag.ResultAnim); + ReloadMetaTreeView(); + _wasModified = true; + } + return; + } + } + + private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair property && + treeViewMain.SelectedNode is TreeNode main && main.Tag is PckAsset asset && + asset.RemoveProperty(property)) + { + treeMeta.SelectedNode.Remove(); + _wasModified = true; + } + } + + private void addEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + if (treeViewMain.SelectedNode is TreeNode t && + t.Tag is PckAsset asset) + { + using AddPropertyPrompt addProperty = new AddPropertyPrompt(); + if (addProperty.ShowDialog(this) == DialogResult.OK) + { + asset.AddProperty(addProperty.Property); + ReloadMetaTreeView(); + _wasModified = true; + } + } + } + + private static bool TryGetDefaultEntityModel(string modelName, out Model model) + { + if (!GameModelImporter.DefaultModels.TryGetValue(modelName, out DefaultModel defaultModel) || defaultModel is null) + { + model = default; + return false; + } + model = new Model(modelName, new Size((int)defaultModel.TextureSize.X, (int)defaultModel.TextureSize.Y)); + + foreach (DefaultPart defaultPart in defaultModel.Parts) + { + ModelPart modelPart = new ModelPart(defaultPart.Name, "", defaultPart.Translation, defaultPart.Rotation, System.Numerics.Vector3.Zero); + modelPart.AddBoxes(defaultPart.Boxes.Select(defaultBox => new ModelBox(defaultBox.Position, defaultBox.Size, defaultBox.Uv, defaultBox.Inflate, defaultBox.Mirror))); + model.AddPart(modelPart); + } + + return true; + } + + private void ShowSimpleModelRender(Model model, NamedData modelTexture) + { + MetroForm form = new MetroForm(); + form.Icon = Resources.ProjectLogo; + form.Theme = MetroFramework.MetroThemeStyle.Dark; + form.Style = MetroFramework.MetroColorStyle.Silver; + form.StartPosition = FormStartPosition.CenterParent; + form.Text = $"{model.Name} - {modelTexture.Name}"; + form.Size = new Size(600, 500); + form.MinimumSize = new Size(300, 300); + + void ExportToolStripItem_Click(object sender, EventArgs e) + { + GameModelImporter.Default.ExportSettings.CreateModelOutline = + MessageBox.Show( + $"Do you wish to have all model parts contained in a group called '{model.Name}'?", + "Group model parts", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes; + + using SaveFileDialog openFileDialog = new SaveFileDialog(); + openFileDialog.FileName = model.Name; + openFileDialog.Filter = GameModelImporter.Default.SupportedModelFileFormatsFilter; + + if (openFileDialog.ShowDialog(this) == DialogResult.OK) + { + var modelInfo = new GameModelInfo(model, new NamedData[1] { modelTexture }); + GameModelImporter.Default.Export(openFileDialog.FileName, modelInfo); + } + } + ToolStripItem exportToolStripItem = new ToolStripButton("Export"); + exportToolStripItem.Click += ExportToolStripItem_Click; + + MenuStrip menu = new MenuStrip(); + menu.BackColor = Color.FromArgb(35, 35, 35); + menu.ForeColor = Color.WhiteSmoke; + menu.Anchor = AnchorStyles.Top; + menu.Dock = DockStyle.Top; + menu.Items.Add(exportToolStripItem); + + ModelRenderer renderer = new ModelRenderer(); + form.Controls.Add(menu); + form.Controls.Add(renderer); + + renderer.VSync = true; + renderer.BackColor = Color.FromArgb(30, 30, 30); + renderer.Dock = DockStyle.Fill; + renderer.Texture = modelTexture.Value; + renderer.LoadModel(model); + renderer.ResetCamera(); + + form.ShowDialog(this); + + renderer.Dispose(); + form.Dispose(); + } + + private void PckEditor_Load(object sender, EventArgs e) + { + CheckForPasswordAndRemove(); + BuildMainTreeView(); + UpdateRichPresence(); + } + + private void SetEndianess(OMI.ByteOrder endianness) + { + LittleEndianCheckBox.Checked = endianness == OMI.ByteOrder.LittleEndian; + } + + private OMI.ByteOrder GetEndianess() + { + return LittleEndianCheckBox.Checked ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian; + } + + private void buttonEdit_Click(object sender, EventArgs e) + { + treeViewMain_DoubleClick(sender, e); + } + + private void SetPckEndianness(OMI.ByteOrder endianness) + { + try + { + if (treeViewMain.SelectedNode.Tag is PckAsset asset && (asset.Type is PckAssetType.AudioFile || asset.Type is PckAssetType.SkinDataFile || asset.Type is PckAssetType.TexturePackInfoFile)) + { + IDataFormatReader reader = asset.Type is PckAssetType.AudioFile + ? new PckAudioFileReader(endianness == OMI.ByteOrder.BigEndian ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian) + : new PckFileReader(endianness == OMI.ByteOrder.BigEndian ? OMI.ByteOrder.LittleEndian : OMI.ByteOrder.BigEndian); + object pck = reader.FromStream(new MemoryStream(asset.Data)); + + IDataFormatWriter writer = asset.Type is PckAssetType.AudioFile + ? new PckAudioFileWriter((PckAudioFile)pck, endianness) + : new PckFileWriter((PckFile)pck, endianness); + asset.SetData(writer); + _wasModified = true; + MessageBox.Show($"\"{asset.Filename}\" successfully converted to {(endianness == OMI.ByteOrder.LittleEndian ? "little" : "big")} endian.", "Converted PCK file"); + } + } + catch (OverflowException) + { + MessageBox.Show(this, $"File was not a valid {(endianness != OMI.ByteOrder.LittleEndian ? "little" : "big")} endian PCK File.", "Not a valid PCK file"); + return; + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Not a valid PCK file"); + return; + } + } + + private void littleEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.ByteOrder.LittleEndian); + + private void bigEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.ByteOrder.BigEndian); + + private void SetModelVersion(int version) + { + if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type is PckAssetType.ModelsFile) + { + try + { + ModelContainer container = asset.GetData(new ModelFileReader()); + + if (container.Version == version) + { + MessageBox.Show( + this, + $"This model container is already Version {version + 1}.", + "Can't convert", MessageBoxButtons.OK, MessageBoxIcon.Error + ); + return; + } + + if (version == 2 && + MessageBox.Show( + this, + "Conversion to 1.14 models.bin format does not yet support parent declaration and may not be 100% accurate.\n" + + "Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes + ) + { + return; + } + + if (container.Version > 1 && + MessageBox.Show( + this, + "Conversion from 1.14 models.bin format does not yet support parent parts and may not be 100% accurate.\n" + + "Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes + ) + { + return; + } + + asset.SetData(new ModelFileWriter(container, version)); + _wasModified = true; + MessageBox.Show( + this, + $"\"{asset.Filename}\" successfully converted to Version {version + 1} format.", + "Converted model container file" + ); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Not a valid model container file."); + return; + } + } + } + + private void setModelVersion1ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(0); + + private void setModelVersion2ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(1); + + private void setModelVersion3ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(2); + + private void treeViewMain_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (e.Node is not null) + treeViewMain.SelectedNode = e.Node; + } + + private void contextMenuPCKEntries_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + correctSkinDecimalsToolStripMenuItem.Visible = false; + generateMipMapTextureToolStripMenuItem1.Visible = false; + setModelContainerFormatToolStripMenuItem.Visible = false; + setSubPCKEndiannessToolStripMenuItem.Visible = false; + exportToolStripMenuItem.Visible = false; + toolStripSeparator5.Visible = false; + toolStripSeparator6.Visible = false; + if (treeViewMain?.SelectedNode.TryGetTagData(out PckAsset asset) ?? false) + { + replaceToolStripMenuItem.Visible = true; + cloneFileToolStripMenuItem.Visible = true; + setFileTypeToolStripMenuItem.Visible = true; + toolStripSeparator5.Visible = true; + toolStripSeparator6.Visible = true; + + if (asset.Type == PckAssetType.SkinFile) + { + correctSkinDecimalsToolStripMenuItem.Visible = true; + exportToolStripMenuItem.Visible = true; + } + if (asset.Type == PckAssetType.TextureFile) + generateMipMapTextureToolStripMenuItem1.Visible = true; + if (asset.Type == PckAssetType.ModelsFile) + setModelContainerFormatToolStripMenuItem.Visible = true; + if (asset.Type == PckAssetType.SkinDataFile || asset.Type == PckAssetType.TexturePackInfoFile || asset.Type == PckAssetType.AudioFile) + setSubPCKEndiannessToolStripMenuItem.Visible = true; + } + else + { + replaceToolStripMenuItem.Visible = false; + cloneFileToolStripMenuItem.Visible = false; + setFileTypeToolStripMenuItem.Visible = false; + } + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Controls/PckEditor.resx b/PCK-Studio/Controls/PckEditor.resx new file mode 100644 index 00000000..5e94f7c7 --- /dev/null +++ b/PCK-Studio/Controls/PckEditor.resx @@ -0,0 +1,2097 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAAbYAAAB7CAYAAAAYCKWuAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAJjWSURBVHhe7b0J + vF1VleDdGZkJEUHmiAOKAyAEcCpQRkGIoqICCo6FisHSmr+augvtqq62u6q6q0vqa7/qmrQUCCBJSAKZ + AxkgDAkkYQrzEGZQkJn3/f/7nHXvvuede9+9L+8F7d/dv9969wx7r73mtfY+5973H/qt3/qt3/qt3/qt + 3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt + 3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qt3/qtqzYwMDBmS0E55RZvdbT0CiWq + nlodnk5QDhtWq8M3FJRDX9NWR9dwoEQ37FaHc6ShnKqnVoenE5TDemp1eIaCcmhXrW78aEI57Yi1ujk6 + QTlsRFvdPL1Cier/rlYyNxYYB4wHJgATS9hqC0LM6fzSIT3SJfQsfMeUUOUt+KujoVeoo7dhMBnUybcO + XxXaySThLVlNLa6V96tzbfZ85TSb3cRVQk7ncGjtBrrmx2vlveHKbrjQlsYKbA5tr+UcVajir8M1WtCJ + xrY27r0S6ujvhod283b0K++XUJ23l7m7hSqNLXQKJVm/2q0kNgQmM1sD2wI7AJOAycDrgJ1HGZxDcL6d + AOeWhu2AbQCFLn29GIP9VIyKCr62B3YEnCN4Gy5/Ob3iFHeV1oCgw/t1NNThF2KOXB7yIi5xNgyuhJxn + 57K/c3WjS+8JIX/pVGY9yb5Tc2yJo51egs6gtRO93YDjc/k5l3O28FOCx14LP1B2W8IPcplXaVROVRsa + Dm29zDFc/r2fyzq3VXEGaE+9+sFIgPiDxlwW0tkxxnhcXgsdDMe36mTTaT6hnd6rcus0dzcQOMQXdDpH + xIDQo7S00Por2UoiJValyoAMvR7YHdgLmAK8CXgz8JZRBPEL+wJvBPYB9gTeACh46aoawyDheg2o8qSC + VNqugHztDciXcwVvw+Ev6M1pdR4Nz3mdX2PIHVmjkY49AMfJazv5es179pFmad8F0KCVhXjD0ARlomyU + Ua9zxXzt+JF+eamV+1DNMcBQegl7q+qlHb1DgePEI05xO4e2HbYU8pOnCCBe817uB8p+KNkNF6o07gYE + jXlAyQOb+tcOuqVtqDnkuTpHzn83caA6Ry7rCI6CuLWnXm1zJEDcQafzhZ2HPJSrtOa23s63QgfSP5QO + ctmEH4dscjt0njyhxXyhD+OgPhlzim9zY1hAjBeXOEOPzqWe9FP9NeylQW/p4r86TaIABRjOrLGpZBl7 + O3AAcAhwGPA+4P2jCOJ/L3A4cChwMOD8+wMKXCEr4EFBvWQn50eD0DhVhMagcjS8/YB3AQcBUwH5ck7n + Hg5/jpXW9wDiFb/OEnTqANIahqkxy4eG9A4g6JDnuvm95j11cCCgLDQ8+dHQxB9yqPKt02n8zvVOwLmk + NfitziXk/DjmrYA4xCX94naOhsy7afQPvRgsdIyQhUFFW3sbEHoJe5PvzdGN4DhxiVNb0qadz8CSy0+e + BI+95j1lrKyVubIXRzs9bQ4MRWNU94LHw6Gt3Rz6uj4vz5F4PB5OHOjEhz6oPwji1p568YORAnFrU85T + jTHSou+aOEImJhXtQv/y03N1ID/arnFJ+tXBUH7cTjbOlccz/cRPz72uzIwnykudO/bdgD46EjEsIMbL + Q9CqXvRL/VN65TligbYSyf9XK7lJEKDCJFIBK2gVLEMfAI4BPgp8HPgUcOoogvg/CXwC+BjgvMcBRwIK + W4Mw0Kpgg6IGpqGl5FZCHjw1iHBOjU9FfRA4GjgBmAacAjjncHlzrLSK7yhAA5NODdC5DULhzBqnjqMT + 6VRHAMcDJwPSUUeD17x3EnAsIP06owlUIxO/xi/P4XgmNecykZuclN2HgI8A8qx8q/PEXN6THulS7tKp + 7KzeNGhlrsONK01oyEbfPKlJa9iZMpI+nfM3AG1NOTq/9iYtm6MbwbHi0pbEr/wMCNpRLj/lJhjMDFra + mM6szUibslcH7fS0OTAUjdq6MhOiGFD/2oF9u6FNOcYc2r++rY/r65FADVZCFIK9xoEqHzFHFEf6Q6w2 + tKde/GCkQNzVGOPc+oe+K71RnGrv+pLFnDbvZyS1qn0YpzrpoE426lgZKw91G8lNP/EzT6D2M66YcJSX + Oj8RqMawzZFdjFc20qo+9EfplUf91CSn30pzHnt+tZIbxJgMFKIK1OisQHSYLwB/Avxn4L8B/wP4e+D8 + UQbn+F/A94BzgC8DZwAKWgFrfAZDg3YE2khuQiQ1hZ4HAIO0RvUZQN7OBuTv7wDn/AFQR89QIK3K5vvA + d4E/AjRwK7gwAOWqU0dS8/7vA/8R+C/AXwPSUUeD1/4n8N+BvwD+FPgdwApL3gxKsZKKwGzwUz5WdQax + PwTOA/4r8LeANFfnibmkQ3qkS/p+DzgTkG6dWbkq3/GlCQ3Z6KuNRVJzfAQFHeXDgPLI9fK7wJ8D0ipN + w9WNEPKTJ+X3Z4A2ZUBVfhFUlJu2FPTJr7b2VaAbPW0OBI25jpVH0BhJQZA2r6l/7cC+jnGsONrRpo1r + p/qyPq3t61f6hj6vHPQnwWMDqfd+E8jjgHO0iwNe934+xzcBg7+rDP1Bu3Q+A2QvfjCSIH594C+BbwFf + AT4HGNBNUMo2ilN9V//K7cO4ov0aj7RV6RdXN36cy+Y7gDJW1urWAlgf0b+cS11YAERx6nwm49OBLwFf + B7Rn9b85MSyHoFP/+wNAf/wi8FnARKe/6rfqU1s08f7qJbeSGIOiClOIKlTiW9qrr776mgLtYkBlqliT + lImjmtyEWHlqfBGcXKmoGI2pFv/mQqVp3NKoLHViE5q0agxWXAahllaHM4eaZlCy4nM1GqtXDUzeNTid + wSrLwNFodbhz6NA0ZnlxJaiTuzoc0ojtU/aNYkPaXAG65WHFqZP+fh0tIw2VZpVuwJWn2HqSPgsFE4eB + xEKo0epwjjRUmjQqd4Oo9iNIm8FQ/be0OnxVqGn6egRxfUbweNhxoKa5kxHVvroXt/rv2Q9GE2iXAyYL + E5w0R9I36RjAhdjR0nZMai2tDm8ONU0Z57HM5CZ4rG97zxWace8s4H/X4d0SQDPRaXf6hclfXVp06Tf6 + t37e0yOKUWsQYmIzIBqw3DLQoV3eplbH4GsJNFdFLpfdOtBBTMYR2AUDlBWnwUDnsSo0Ic6uwzfSkDVl + 6PwmGOUqPW5zSLdVUWp1ODpB1qykNC7xRrVnZakedTwTqLzPAGpxdYJKsxp168TE7FzKudvEpn25IyBt + 6kUc0q18vlKd95VXXmk5Hw0omysiiw+DbTxXkTeDiQWDlft0oBbHaEPZpFF70W6Um7rW5t1+/BqQWt34 + oSBr6kGfF7+8Cx5vdhzImkHZ4GxyM1nE6mPYfjCaQHOn4DRAGqU3kr72awLSZuTHlVpqdXg6QdaUscW3 + unUO/VdbNK6Z1Ex8bhN+tw7PaEOdP9K+AahTY4KLB+k2/riw+NVYtUGE23dW4FYiZmCd3dXNIIZykOEt + BTFfzE37EWByc0Uiza4CTG5WVAYnA7vbOFYW34xxAXW4e4UqzhzKZmXjNqCVnY7gtqAO7Z71PwK1Y7uB + sv0WYFUp3tgSEDQyk6kO4WqoFkc3kDW37gyw4tW5U2IrTahto0+s1qJwsvoNvXwr5inkWS/nzYGclyrQ + 3J6VDoOthYfJLZ776LDa14/qxgbUzdkr1OENoLkicPvHQsDkZlJTfj5f+TZQO65bKJu+HrsLrgYFj71m + cK8dG/BKzbUcyqYduvpUrhZ74pavIf2gTmYjDTFPPm/ZlI0+pjyMKSZ95aNPW/hY8LWM6wXKpoz1Lf1Y + /PqyyVNfM3ma1P41xlRp32Lg3PhoRvv/A6hDY5r+YzLueidn1BtEmNgMVAZEFajTuKfaYKItvJKfB9Pl + Z9xLn61Gk5yhcj2EVhVmHvCir0ALwboy0dhcEsuD1ZWVjtXW5/MxLbgDAn+FxiZ4r/W89f5gKJsrKldM + BiWrPp3BROyD3n8Dasd2A2VzW8Ak6erCgGziEHQK5zJoS0Mtjm4ga58HdPA8sQ35jI0+8fzWak79aF8t + ehmkjzoImlrsTSh14fWAlvvtgfZ/AIOGOrHwMHBpR7Fa684HhHLuVjvJzmvudQO0C4BYOVjVm9RcrWlX + Jubacd1C2eRTn9dGTeqCx93HgQ5QNgujeD4TLz5YOHTvB7luG8dN/Sf5Zn0Gy7vpt7ltvZodV2MAzefm + +qs+bOJxJautmJzlx2dqLWN6gbIpY+1Nn3XVZvGnDkwYror+JB+T014HqZ9yCMjGFiDP5XH6dEzwXY+z + CoGL5taotFt0WRi6W5ZWbWUIeO0aRJjYfHHEwKNTGyzPDuJ/VaBGqDYf+Bpw400mg5PB18rQt4T+Z3V8 + jmM0gebLGjqvzqyRGpik9dPAT+rG9AI0XxrQuVxxmMxdcZt0rJ50ROf+r3Vje4GymdjkQ9k6j5XZkMZr + H8C9d58XqBtlYKD4vrhznbxS64SjCzQd0yAbq2oTr7LzRaXfqhuzpYHmiw3q2arepKYN+Qzoz+r69wo0 + ix993gJRGQge+/xzROIALZ5bKWvpdz5XcZvtByMFrbbYEmci8SgTC2aTvsnZ+PJ3OY7hAE35W4TqGyZP + fcw5LGbObPRtQ9+WgnzumJ/2T4Bxxnhr/HXV5u6MOeW1XbVBgEtHn3+YcXVwq8FzGky9BgGnDtoI1rf8 + dHorKI1Ow7Cqddvji3Vj49poA81q1MQrLQYkQQfRoS+sGzMU5PTTfGvJAKzDmTTcwlCHOoZJyDcZZ8a4 + 4fJO+/8AadaZrVhdFZqsOiY27sc2pKs7E64B063ZswJ30DVc2oYDJtCYj+ZzKu1Hx7RAUJbS6DbyD4r+ + W5Y+IZ+P5lt7FkPakUnBF6F89nZeY0yP9OVFBM03j/V5A6uJXfC4JQ6039GohwoPPqt0dSztJjdxWywN + yw9GDUpd5zqnGbwtxrR/7cMiVT2og2QjPUOrbJS/KzPjgwnNxYX26LW/t09OU9D1WkAdHTQTs3HN+GsM + Mpf4huSvTGJzO0vn9mHm9MRMGQSCiZKRUW0xTx3UCPUywH1wg5EGp+G5f68hFquVGh7qYDitDk8AbRHg + Sys6sYnGittKVYeeYZ/YBq2Ma2n5vdS3ybsrQvk0CFktqT+3MVy9NlbdwXsd/7bqtSrQ3PI0KLmSMYH6 + HM/tho5vP3HfxOY2pNsT0hZF01+ItxNdOWxuy3G5PVXM2cBt0rDiNFAZTOLZz1dT/waNTRwBI9mquHO5 + 0P4GcGWpX5oYlKGJ93upf2nf+fi6FveqPNFMOuK2OIzE5nEjDjTHNOepa3GvZg7lbCLQLg2CylieCj+o + 4C7HjFrL56lCk/YWXpW3dGsjgsnZLeLzU58u6I/rDfxloUBT/vqxtmf80p9drZ0+aExljiqMVKvDHVCl + hfZDIApsd458Q3LI+DDqDQLaJrYqEyUjW6TFfDnk9ARNNL/75FJew7CqsrLVENNbkNX+dbA5LceTElVW + 2dLyLRiTr3S6kmpx6Jy2aovr1b40E5u4dQRXUhqVe/QamNXeuXXjcrBVr1X70vwekoHIxKSN+LxsyIqM + +z5f08B9qceEaGI0Qf5LPk8dXcJItSrefE6a3wHSVtx2Uz/ajjQm2UX/OM5hJFsd/ozGeYBVsXTpmwYR + bahtgVDX4l61P20UE1tjjq4SW/Qvx4x6i7lyyGkJemhRoEaMkYdGYqv2L8e0tLhe7UtT/vqxxa9y95mv + 9vilav8YU4XRanVzVWmh+RUJFxfSbYHtYwe/Pvbrn9ji3khCHd6cnqCJptNb8WhsJhCD+pfb9c9hJFoV + Zz4PrerQyrYnh47r1b60SGw6g2+GalRuQ7ql4dZVx5VRtPxa3jf603zwL+0GPF/O6eXFEbcs3Xc38RoU + 3Jq9om6eHEayVXHnc9KsNg1aytHAZdJQP81tvjbQrtX1DWjX6vrmQPMNWGXn6tIE53Ofv/RenRzrWtyr + 9qf9WiS2uD5SkLf8ek5L0EMzxmgbFj/uvLhydnt+pBKbz+vcNdB3TXDO9fVq/xiTQ7Tq9c2FaNXrdfTQ + 1KX0G398K93nbK/tCyQQ0FViy5hILRiNfvn5SEC0/FobetyjNpC7GrLS0fm/1q5/gC2O6+6PBND8FRId + wKCpM5h0XWH25NCxZZn3pUViize2fJPKbUgNzIr+wnxMjKvOk1+r9qf5SwSuaExKXT9fs9kH0MB92cTn + a26vpOee1XlyGmxxXHd/86FF1nMBg5ZBV1n66S9tDPsZaINet+HSVlxxvjm80PySvcnMyliw2Pgr7wXe + AneBv65V+xb9U9+eEls2blDr0PdXLrEJ0fJrOS1BD80Yo31YOJt45KPnxJb3i7405W/M0j/0Mz89/9N2 + YwKi5ddGAirPYCv3BtND8wUndzui+O3q5bJRbRDQc2ILJgPiXvVaN1Adl0O0OK8bSzsXcFtAugUdP313 + ra5/HQx1X8jxdNNfoPnTNDqAjmzStRIzQPWW2LJ+0ZcWic0qL16ccRvSBPqb7cYF2PLzur40f7LJatLt + Tp/fuX/uc7Mhtxnok3+NRPq6oiugcT9LRFWoJvwq1I3JoWxuF6sjV0J+el7bfyioo6GA5r26cUMB7R8A + g4f0WWj4M1/pGXLrPA29DWod+v5KJ7Y4z+/l17qB6rgYG8fVeapjaZF8pN3CcSQTm/FL3CZNV4POYaH+ + v9qNCfxxXFxv3suvDwXVMTGu7rpQN57mS1jKxMLaF0h8y77rn9wblQYBHRPbyy+/XGWihdHoVz3vFarj + 4zifr24MzW0and3tSBOHx+nLv3X966D2fhaMhoKWcSWU7SLApOuKzcQmjW59XWyfOhzVVu0XfWkmNpOO + e9vVt6naBqQAW35e15dmkHclLH7fuNROtJch33iiT/VrJPI/5Eo6oO5+8+WP3iHHLWTNFZs6isTW+Rc9 + OuDNr7eDTv3zewFZc5Wmbbsl6aqy5isTBY5o1ePoEz5d3u8qsdXFAVuXcwwrscVx9Kme9wrV8fl5fl2o + 0G/y0T5clbgdqS2ri2Eltja4I2laAFqcd/1GZPV6dUw3UB2fn+dQN47mL5FEnNDff/0SWwuUS9b8XvQd + DuQ44jiH6FcxDH+BQWd39SJ4/O3o//Ir7emPa9X7cd4OnD+XixBjA7JmNaYj6NQjndjE7faFX3FwtWbF + Z7XXcRsjWpzX9aW5Tee2qY7sVmJ8f60rg7UfoIGbEDV4k/s36ubK6Qio3sv710HoJIdqnxx/1kwYBpbY + ivQn21LL+1dx5dBNn4BOfeNeDllTFwY8A+qQia2KI+8bsinvDTux+RkQ59GnMseIJra8f69Qh0+I+aJf + hf6uE1s2pqV1gTtfDVpotXzdJCBw+xkQ1+N4uFCHrwrRt8JD/oJZowAuQ8Fr0ySgJKS3xGZSqyS26Ffb + vw3UjWk3NvpUhOovZPsKvasXwePvRP8q/flnp+NewbEBlabC3WbQcF1NDZ3Y/CyPq/2iL80ArEPE21Q+ + a3MO+f9xdUyMa8xBi/NB/QCav5dnIB3W2070C7uK70cqh8YW8SC9VLZSWu6Vx5sDOe5K82ertHkrTvXz + E6DR8nF1eAOGuh/QqV8+l1Bp2o2FjDpxK7JtYmsHRZ9m0vcabViJrR1En8oc3Se2MqZUIXDlfeNaO6j2 + zfvnxzkU/QbJaFiJLX1mx3F/CNzKqHabM8ZUoXm9tW9AtX8OdX0bn5V+ef8KD9U3p389ElvOREAwGMf5 + tTinXQj4fMAvUvuFYn801JWGP1Xzz8DaunHxWQWvV+mhDZnYOtHfCfL+3UCbZhXmK8ImIJXvM7ZBiS3m + 408TX/kZ9yt8m9hcnfmw2edsrtzEn35YOMYEBM6A/FpdX5rByK1dV4L+hp3fR/P5WldfvKRfble1iS3n + Jz4DgpZ2kPftFtq0/wQYUNSPsqxtdfjq6OoV6vC2af5nCmVocnOV2XjGFnJshy8g+uZyp3Wd2PJx7aDN + HF0nthhThbhe7UeLGBP/Nso447+F8ft//14dE+Piswper6F/yMQW/evw8id9dol7UGLrhDv6xGcOXqP9 + FFAW/msbY6//Dsx/neMPL1xVHVeHz+MAz2t4CBsyf/z6JbZgJI7rzvPrNA1OYzP5+CzDB+A+w/htQOP7 + YafxVfB6jVC7TmwxJo47QYl7LeAPteo0JmXfTvOZnorMwYrFfWYrad9INPhooK523CZUrj7/8lpPDi3E + /QrfytVgoUO4BWlQlv+WF2fyMXE9/4zjqoxo6kt68wfCXRurfYGeC6aAoKUK3qP5G4r+Tp9BzN9M1AYM + EFW95OCbbW7huaWn3AyuBhKDuInX7dL4LUaDr0ndAONKybG+SOP33izStOv05mQdjd1CyUte/PkzafqG + zza1k3jbV92qY+mNpPBfYv6q7hKU5/kbbtE3lztN2QwrsRX4OR96jhFJbHX9aBFjQm7qWH3pq38FXFw3 + Lj6r4PUa+jcrsQWMFu64Hn0CaD8DlIGyMEbp08YpbdkEl/4FTnWcUL2en9fwEDb065HYgoGqYOM4nWPU + +XnjesGwzhqJx+dLGrTPMgz+GmLtdkqMr4LXGzS98nK6RuuQ2IamPyDvI5S4/aFcE7C0mpTd+5Z+ZZSD + fMUr/RqnCU1Zxmv48ft7OnXLF7SrtNVB3E99Aa/RNEzpMVgY+HQIz9P/Nov+L2e48znya42+LxfHtJmA + gcfVpt+R6/m7KfRtb1eN+Qreg6YcgqagL4Dmv+Hxn1L6D1B1VIOAeq/qpArqR1m5Lezq1jc9faklvgMY + /1pIXZno3Np1FafOHO8WoCsl7c1A+g9NOpsyzGkN2TfOy/vx3Nfx4inxiVf8JgBpVaeu9P1FHekJmgyA + 8py+p+jc1XmDrrpz+waU8w+Z2Kr6quKsnjfnaPA4ZGKr4q5C3MvB67SIMfqVdmBBYqKwIPFXc/4pxufP + 22N8FVK/4LVJ/4gnNmXqNdqIJLaA6Ot1mj8HpgyUhXMoG2Wk7IeMv+3OmzwMsqH/exJbFaJvyXD8t2IN + 2WDiqsXK03MTxX8MfPkcMT6HuJ7T5HVa28SW923ibc6RQxh99C1xu1LTAHQaaTbQGRCVUw5R8bu6iWTm + 6/HKVDBoGkQNVr7c0n1ii8Ih48XrNBObDiBdBoz4jtwPA18Vd3zmx6lfpQCgWeUZiNSXtPvrIT39mgB9 + e7arBGX1H9eF6Od1mis1k5q8yrPJ10Bc1UkV1JE6MHCbzOQr/k2IL8bEj0j7TDB+xcUvnPpVBYsS7daE + k+wLqNkKbPLTer08r7exvPgTf7wMJJ3akXQKfo9QG5Nfk+x/dry4CnzNuaryy8+jv1DOP3Riy8bU4aye + 5/3LOXpKbILXc8jvRV+v0/IYo39aVJogLKRdwaUfKs7HBeT4o0/0C/A6bQQS28jgrsOf34u+Xqf5X8KV + gcW4uOORiLrtGH+rkM8T9AvlPL8+ic0HhzkDOZMJqtfKyrHRv2DYAKQTGhR0SoO+nwq3sbpoGVfiS4JM + 0EmoKQjXJjbH5X1jfI6net7St8Dt9qMGoNMY5KXfn4eKhJWDATH+dY4rHF+28HcV/VKz9x0r3xrtjHh1 + vUpHwetgo83pK1/ucCVpwrUKU2c6hyuYRXn/GB+Q44zjvK/XaDqbScMA67/B8flaTz9sSt+e7KqOLiFf + LZR8u/0on9LntqGBuJ1Ocsj1YxJTLyZseZNOwZ8L87t66k4dmuhMfCY6V3KumEw+BtI/a9BYw09X1wob + i8AsXvE7j/PldEqLPJhoDU5uUX5POxmEcwjI+5f+0zGxDRkHaqClf2FP7RNbWbhVcWsDaTsVGlvsIcNd + 0h8xRt+yeLEQ0W5dmesf38/nyOcJvNViqmUO7tHaJp9Ofix9nXCXsmmf2DrIRrk0jsvrDbzldZqFuTJQ + FsrEwltfjPj7e0PFyWqxJrT2T/P8GiW2CgMFE3WMDb4W12k+j7JycpVj9WkA8tNzq4jfaocvlJqO2xkG + 57T6xFbpG/3rcLTrS3NvWgPQEExMBkeDYQTCKvgcyi8l+1q8v9AheN0A6SrBatznNjPyeeNYyHkdgm// + yaGrFp/nybcrwcb39/K+LZDhzJ0y+pYO4XMKt1WH9XzNZn9A3jvaVZWW4rj4rOtH85maju/KxSAsfhNR + /AfxTpDrx61V9eNK1N+0DPDc6/axr2PUubo36VikGUh/r0pjTudQ1+K6eEp84hW/81gQ5XRKu8nNLVOT + nzonsY3I/J0TW5tx1et11+I6rW1iy8fFsdCD/0eMkebYVlaOFj0WAH9RN07I58jtr9qX1j6xVcbEeY5v + CPp7x9093b4wogyUhTJRNspIWdXG3xhbh69dX9r/pYmtslqL6+Ip8Yk3qmo/u5qnDqr9aJud2PKtuPw6 + ze/IaQAmYuk2wBn0lFkd+N2tAH9Syk8DU/xeotX2oMQWW1SdoIY2nzNZ6RsUBffRf69jYisTRg41eC8B + rPJM5jpBz8/XbPRXHl3Y1WCaAlr7NehT3+pZ51QnJrVOOsmhqp8Af9cyIK7lfcWv7t1e1hYMpL0FhfY+ + khd/4g8by+c32ebza5Pf7Wn+Nn1pv5KJrQ7a4M5jTGwvu43ss8kh5VQH1X60YSSfehgt3Dne6Evz2a0y + UBbKJP4D+PDifJu+4inxiffXL7EFIy3n2XHL9cEMb3Ziq+tH6zqxFWMq59lxy/UC92YpjL7+6xaDksFX + w3L/3xVgcuhqQvVaHeR9oh/NbQa35OTXRORe+t9X+zfx1B9X+9J8JdgqL3++1vO/oaB/13YVtFShrh/N + QJDrxJXaqDqR+IGufaRbKPkZ0sY4dxvYLVMDk0HKRHheu/mr1zv1o8X8XSe2GNvpPL9O65jY6sbUQV0/ + Wi6/amJrK6ccbw51/Wgdk0/dmDqo60cbTdz6cjWxKaMhbbh6vVM/8ZT42trwFm8SUBLSk9O+9NJLtdcD + ahj+lUhsAcOgv2eF0bdzYquZsw7q+tH8Loqv7rpS8zmgq8sr2/WvfgbkfcptSB0tf77W1b+pqTb6j1Zi + 2+JOJP5yntH2kVp+OO8psQX0OH9PiS2gyzn6iQ2o60cb7cSmDHpObAFbIk6OSpOAkpCunVZmA+ruCzUM + D5HYWnHl87ejpZyj58Q2TPp7Vhh9e0psMW/dcQ4lbX7pUqdw1eb3dv6gug1ZhbhX18drZWKL52vxH3F9 + 1tPz774xpie7yq936iOOEtewdDKcJv5yntH2kVp+OO85sXWc/6XiszJ/z4mt4xylP5dz9JTYYlzdcQ4l + 7lx+XSe2GF93nEM5R0/JJ8bVHRfQIpsRxt28TtusxNZJvy+Vn+U8W9wnh2wSUBJS67S1THHtxRdfbHvP + zxqGOya2Kq5c4PmxUJmjY2JrR+Mw6O9ZYfQdzcTmfw6Qd2l0tZZe3a3rO+i4sgUa92g/BpRfPF/z2WDP + z9dsjOnJrmrpLGEkdTKcJv5yntH2kVp+OB9WYutx/o6JrR2eLucY0cTWhn7lN2KJrTLHiCaf0cSdX6d1 + ndja6XBLxMlRaRJQEtLWaXPGErMvvVgwXGE671vDcE+JrRNU5hgyseW4PX7xxUJhflbvxXkN/T0rjL49 + J7ZuoKTN76j41qb8+yXMfxgBnP7yhU7mm3fqaVjP12yM6TkZtIOR1MlwmvjLebr3kWRfI2NjnA+Z2AbN + 37uPDpnYqniaPA45R8+JrRNUcOfy6ymxdYLKHD0nn04wmrgDStw9Jbagq3He0G/NvfK8nGeL++SQTQJK + Qjo6bQ5Vg65CG4aHTGwvlVsknaBmjq4SWw7DpL9nhdF3RBNbhTZ/seKPAV9/9/t26T9TV8cIMS7/jOOA + chsy53fYz9dsjOkpGbSDvN9I6GQ4TfzlPKPtI7X8cN4xsdXhH8b8XSW2HHqYY8QSWw3uXH4dE1uMGxKI + Q5U5Riz51NA/mkmz58SWQw/63eI+OWSTgJKQnpz2hRde6JXhLhJbc3x+rXoe18o5hpXYhkF/zwqjb3eJ + rZwzIKej7lpJ2w8Bf8DXL/j+ZfX5Wt6/7jMdl+eOKxObv3Wpg/l8zS8ID+v5mo1xXduV5y10Vc7jWsm3 + QTL/cebGPz8tQZkPgpKsYTXGbykfqbUxzoeV2Hqcf1iJrcs5ukts5ZiAHE9+XsGdy2/IxJbjq7sW53Gt + nKOr5JPjifP8WpzHtZHEXb1W4t7sxLYl4uSoNAkoCenotG5tpM+S2YBgOparQhuGu0psDTy5sMvjNnN0 + l9jKse3oj/tCG/p7Vhh9DapDJraYs/jM6WgeN681aPO/I/glbb+E+TfV52t14+Kzelzi+xdA2flFYb9E + 7/M1v081rH/xzrjukkEbp6lCRqc/4OrXEZSl3w301zmcRzkH5F+4NumZGKTH74TF99a6Tnj06ymxtfWR + 0oeEjJ8hbYzznhJbWxvPoGb+LhNbyUu7Oer9qKvEFmPSZ7lqShDzD+2jXSW2HEfjuJyvTYwZOvk06C0/ + c9zl8YvleVzrGnfEgeqneMrPHDLcPSe2oLG9DQ3Phrd4k4CSkLZOK1PBWDD8/PPPtzCc92nD8JCJLceR + ACPLjSHdLwWbzTFkYsvx+jlM+ntWGH27Tmyt0OSzCvYvV1e+6OGbkcK/dcbXhGofj0te/wjQweL5mr9+ + MaznazbG9WRXdec5ZHT671v8xRXf3BSvjurq0p+eUs4BPh8U5MOkIC2uQH0ZRp2YLCLRdUxw3N9SPlJr + Y5wPK7H1OP+QiS0f72cPc3Sd2HIofL/Alc7rcefy6ymxNSBLZm3mGDL5NHBlIP2D4tcI4e4EGe6eEltO + n5/DsKG2NrzFmwSUhNQ4bSGoYCZAZgOq9wqGX6pjuOfE1uncCqmco+vEFjAU/VZbNfT3rDD6DiuxtdCS + QfQvE9vFwP8L/G9gSc5vDoGnDp+Q4Yt/Fhi8Dvv5mo1x7e2qUR1nfFrElOct10sahVInrlLVi6s2f1Ta + LUl/7szVmzL2lxUCdGJ/rUOH9qeqTICuRE12/lSWK1JXdCa4tIoryW9pXG/LS3M3oZX2sK8X2thYxs+Q + NsZ514kt5nj++SIo+ZnPLbSZv+vEFtCcow2PTR8dXmLLcFXPM9y5/HpObB3naMax4SW2jrgb9I8I7hwy + 3MNKbAGh27Y2VK+DnuPkqDQJKAkZ7LSloHKGIos/99xz6TOyeUCMqWG4bWKrm6cTVOZom9jq8G4G/T0r + jL5DJraYLyCnpUqT/YUyEV0O/Aho/DNF78XbcNXxOZ42+PySt0HHwLZZz9dsjO3JrgR1EZBfD1pLnfgP + En17019aUZb+eLABwd/h9CfLlLHg7+P56ykGaZNf/Ai3CVAH9/c74zcZXZlKb+3qtLy3JXyk1sY47ymx + DXP+toktxx3Q4xxDJrboH5DjSpDZdfSp0K/8ekpsLfgrEH3KOXpOPoPwZYVb9Bkx3JX7jilxd5XYYlyO + c5g21NaGt3iTgJKQoZ32hYJhmQ3w/IUXm0x3YLjrxNYqxOK4wxxdJ7YX2tGfzVfBvVkKo29Pia1JZxbg + oTmnzTFlIloMXAbMyhNbjidw5eNzyBzAZKEzmRwM/Jv1fM3G2K7tKmj0M5woIOjOaL0C+B+AL86oe7+g + bpCUfn+HU/kK/n6mwdQfDNa5TYD+yrk68FfgfY4obW5hunozuaWVW8lCo3Gte16wU+keZGPd+UitjXE+ + dGLLAmft/KUsO8zfdWILfIPmaM9jT4ktcOTQBf3Kb8jEluOsgvEhjitz9JR8GjgzfB3oHx7uGsi/2lHi + HlZi29JxclSaBJSEdHRamYqgI6O//OUvGwznGb0Dwz0nNj/z47hfmaOrxOZ46Xyez2HS37PC6NtzYmvQ + WdIUELQ5rkxs1wKLgKtzXPYLyMcHjsAjZA7gL8ybAAxobt1t1vM1G2O7s6syEQjyrE4CPM9pDnpL/q8C + THKzgEsB/wGpcFEJ/mdq/9O2/xr/74H49zAGWIOHujCI6+yR3NyWHPTMjfMt5SO1Nsb5kIktyQn8zjH0 + /E1bosX8XSW2HFcPPA4rsYkr8MVnDe5cfj0nti7nGFby2VK4c7CPY0rcPSc2cY6GDW/xJgElIbVOmwQG + M8GYILMBcc37UbG1YbhjYkvzlIItIFNe41qrcZRzdExsCWcZPIekv6yw2tDfs8Lo23ViC76kQ0MKCNri + fhgt8CBwd6zWGrwmPpq8NnkbLD9xlUki53Ozvr8WjbFdJ4OAcKRcNzndQXPJf89Q8mrze38mcn9hxX/N + I8++aOKLJdLdU2JLfHRtY01eHC+eEl9bG+O8Y2ITXy7LjvO399GOia2Kv+McQGWOnhNb4EmQFT/ea0O/ + 8usqsQWeHmJMz8knx90yzwjgjp2zhK+MWYHbPo4pcXed2HK8Q+k35nRcOc9mxclRaRJQEtLeaUshythz + zxfB59lnn02fz2UMJ6bbM9x1Ygt8uTDjM/plcwyd2BgXODaD/p4VRt8hE1vMF3QmGp9rGlSisayY7OeY + MNxIaoXxa5gZn2WSiOQYPDqPkBn/EuBrgA5lkPefcbp62SzDdDwQduXWn8Hsm84pH1XdBL3qJSBoD7pj + XPX7TnXQ6FueO28OZTOguP3q/6rydzFN6K5UW7ZgOe/JR55/rggKYWOeBx85LyUdQ9oY520TW3V+QZvO + 59fmu5i/t8SW6SvN0ZnHrhOb42KuNE+JMz7jfg39yq9tYqviDuhyjo7JJ+EuV8E5/pHCHSvsNLaSfGKu + Nrh7SmyBR7yD4uRm2vAWbxJQEjKk08qcwUZmA1Lw4XoXDA+Z2AJHCDBXXgehdp3YVFYt/aOkMPp2ldgC + Eo0GDOh65plnEuQ0Bm0RrANyPu33y182eSyMsjVBBJ6SR5+vjeiLIzbHA8rLtxFNbD7jOifXS5Pm1sRW + x3uV9vy4G2h+Gb1ZFNDcovQ/Gfg/znR4tyRdtUl7Y9XGcQ+JrY2NdecjtTbGefeJrZTl4PmL4qjD/F0n + trZ+1J7HIRNb9M/nUe+h+/iswZ3Lb0QSm1CZY+jEVuLO8W8p3DneCu5hJTYLox71u1lxclSaBJSEdHRa + hShzz5VBMw88ielSyB0Y7imxNeYrcQf+mjm6SmyB75fAMOnvWWH07TqxBY0Gd2n7xS9+0YCGYVVoDIjx + ib8yOTguEkRdcst49N/f+OzJFyt8a9C3Bf3PzcN+ccTGeJODKz9XgO8BPgp8I/QSdFd5D90E317zXtAe + 3zmqyqAK1S/aVqHk3SbvBhR5d9Wmjlu2YTnuzUeA4CN010H+Q9oY510ltpDTMOfvKrENk8euEltAdR6P + A28H+pXfkIktcPQ4R1fJJx5ljAbuxkt0NbgDbw3unhNbjnsYNjSsODkqTQJKQrpy2mbgbRM0UW4bhjsn + tnKJHXPlAo7zuF8RasfE9kI7+oFa+kdQYfQdVmIzqD/99NMNyJNbLoM0Lnv+8MvnCt5+/vOfF2P5TAnu + 2YLPKo/OT/sJkK/YRjKxufIzWbjFaVA7O/iuvsUntOgn8dzUT053fFYh8AXE9TRf+ZlDqWO/C6iO/f9z + Or4/0dXy4gzHHX0kf76W8xAQPIT87e+4bm2M854SW3P+orjpcv6eElvM8Ys2c1TiwIgmNn26jfw2K7G5 + UmkzR5eJrbDROtw5/RXZbDbuwBt9MtzdJ7Yy/gbuIfXbow1v8SYBJSH1TlsKTIZkLjFMUvvFL4qgGddy + AbdhuGNiy+cJpRmoXWHFeZs5Oie2DG+DfhVmwC8V1iX9PSuMvh0Tm1/u1RDDYOXRBGZieuqppwaeePLJ + gSeeeCIdV5NbPi4fa7+nnn5q4Mknnxh48qknG4nxl8+2JgjBgFJuyfmMzaBjAjIRudLa3K1I3y40QZoo + XQ25IvyyfDuvMpaG+BRyHeUQuol+jqkD74U8Aqr9Y24/BdpMwKDr9978Ure6UmfdJ7Zyrpx+C6df/Hxk + bIzzrhObOnauYdh4x8QW43IeIw50MccQia1pAzFH4gNwh8hjYQj6lV9XiU08MUcV2szRdfIJ/OLKY9dI + 405QysZrgdu+Ge6uE1uOv6FfktqWiJOj0iSgJKQrp43gafD10/Oc4YpgfwtQsD7D8HtDvkrup+f+y/Lf + inlyowvFhTDjvI1Qe0psQ9FfwT26ia3k2+rHeeVRIzIZmdAee+yxBE+S4KQ3DCynVSh4K8baz/6Of/zx + x4uxBB/5zGXovAb2ks/41RGfhY2IYTLexObzKr8Tp879DcrPOV8klypIk/SF7n1e5TOjoDf6RVLK8RT2 + M9iGgt/ol4Pjy8RukD0KeCewG9DyP+g4HlEfCXq6tTHOe0psw5y/p8TW4xwdE1vwULdqEKq6rODerMTW + 5RxdJ5/4NZbRwV1Pd1y3j30z3MNObMO0oWHFyVFpElAS0tZpkzAzhmXW4OtnBNtccRnDfj/KL8oa1HzO + YuXuL0B4boD/veY8zZ9wCcU517O/LATawTCGTGyBN6c/IFdY4M9wb5HEFjxJh/J0hWZSevTRR1sTG7Tm + cnCs8PwLhczkRSOM8cITrNzUVTUpVhxAGVpo6ABvAuIX8zfndX9/okrefY3eVbrB0lfs/zVPSDmELIJG + +fIz57VuTIxrsZsSPPd6jiPwSEfJf/XlmZatWI678hEh5h9JG+O8Y2KrboU25n+6Mv9zHecfMrEl/EAr + j0UcGILHrhKbY2IeceWQ230Fd9eJLcef5qh5+7jNHD0nnxzvyONuJjYhrifcrVuEPSW2Ak/Th9SrjzNa + 9dvkI5vn1zixlQ5jgEzPb0owkMqwr6jbL4JGyXB8KVZD9rVqf2DXT88NJn8W8zgu5gmDc74QaCHUWsPo + KrHl9CeFZYnZ67nhZbi3WGJzbnlUniYyE5qJTTBBtcq6CNQBwZ/P0uTJ8Y4RR76VGWPtX9GTL5BYgMR2 + 3LD/wWg0xsq7ydGArOwsaHTabztnXXKTppBH8BU6CejUV/7Upbw29MtxVb8xVjwl/x23Yjnu2UdG0sY4 + 75zYsvn1w2HO311iGx6PPSU2cYQuBY+FwFvBPazE1uMcPSWfLY07l3kFd8+JTVziHaYNDStOjkqTgJKQ + rpw2gobBUvh59hwhXin2p10cD/xXcEXiUcAatJ9nAr/N/e/bL1dcrrR4QcXjqgIzofaW2Br0l4n5mcGB + b6QURt+uEpvzBu+DEluZnKQ15JzTGmMTf6xuQz+xFRmJTePM+XRevx9jgqFdAqgTv7D8DmDQdlyvjbHy + rm35Aon/Wka8FjUm0CTfanKTpgB5awd1/Qr9NoN62GfScU1yEzI9fwPwrU2Tb3yPb9iJLXTwdGljdck1 + m3tEE1vYkPN24r9m/p4Sm75ZzNGVH41IYhuCfuXXVWIr8Pc0x9DJp9xGdXyP9A+JO6e7E+7ol+EedmJT + n0m/Txc2tLk2vMWbBJSEDHLaMDYZUXhuhekkOowBsxFwMXLvp2ci9PfLiuX4f3j11Ve/Cz6Tj7/p5yrN + 6vi3uf49BPO/WwT7XFZ1I9ifM1c4ZVWoMQetbWKzT9BvJetbdk2nb75YIe5flivOCu4tntgMyia2WHE9 + /ljzOVmjgAg6De58Bo9JR1lgDx1FgKsbb3IpnzON2D8ZjcZ4n7P5m5P+RJdO5TM8g1t6tirUJTdpaweJ + 5xLimvyEwwf/ykyQd7fLqrwLUYDR8meMfu+uRc8el9dqfCQLCuBPttuwsdbE4ssEuezLuUc0seXFzaD5 + CebN+QcFpbaJLWTt2Pi6TLs5YufG/pl8u05sDT7Apc4EjwvcQ8pvyMQW+H2Zasg5GFPO0VXyaeBOsaYV + t99NzXFnstls3Oq8BXeT7q4SWx4n9RFxNvXbPk5aGJfz/JonNgSZB17BY695LxzHcQYshH0hQv6HV4uV + 258Dbk3+OYH0+1z/3/RbZj/7O07lhFDFGfDMMx0Nu31iq6Mf3DpjI+hxXtDeGvBHQmH07TqxBe8hXxNS + rLjCsKTRftIYdAaPgvfsE0Ypngaf4A0cOZ/Kv+S1+gKJv8KhbWzucza3I10BuWpTBgZN5/kj5xWkQVAe + vUDOf+j4WWwl17HQGnhrbajjyzMel9e68xGKkJG0Mc67Smwxv7y2zl9fFFXm7y6xNXjsyY+6SmyOy3/x + QnyCxx10N6zEFji7nKO35NMb/SOO2zEl7u4SG7TEHA39Ei9a9JvvzA3m4dcvseUCjYBpwM2f/8i4r/0q + 4Ph2usKNoNkOIpjVCdV5XAZHQA7lCRWhdkxsOf2BW2WZMPz0PBQWxjFSCqPvkImtyXszsSnPfLXlNe9J + Y/Du2By85j375HgClGfgafD5Qstzpv8HUH6+serbqyPxAon8+302ZWBg9vmVW5I+a3Xr74vAvzv/cCDs + J+m5fIFG/sNO1a8QiU0920eo2FBHPXtcXhvSR0bDxjjvmNj8Ye/ChjZr/o6JbTN5HDKxhR/kc6iz0FsH + /8/l11Ni62GOnpPPa4HbPvZ1TIm768RWxT9MG2prw1u8SUBJyJBOqyANkm6RPfzwwwObNm0aeOSRRxrJ + LRhvbEkyXlDQdeC9UJpLXBWkAItgXFQKEZQ6GMa3gc8BvtUntE1s4kkBD2UVq6Ei6I2WwujbQ2Jr5V9j + EnL+gzbHOd4tRCFwBb/2dUzC9WQzueXGab+KHP2HpdLm/zSTVmmW9mG/QGJzPGBg9pmdW5ImN/81jl+I + 9hV75eu8Jjm3q38b8EeKXeHrmAHfA/wno/8d+AF8/wuJbWEux6qeQ46Jd67leq7w3lHPHpfXuvIR5/Zt + 1HzFvTk2xnnbxBbzC+J3Hud7Ett2fj+7nL+nxJbmQLa5H8l7mzmGmdiKotZjwXsd6Fd+vSc2ViLxXTx3 + htrMMazko83FarkD/cPGHbKJ2Ggf+zqmxD2sxNa04dKGKm9W1/CwWXFyVJoElIS0Ou3LTYZlJoKuxuxK + 7aGHHhp48MEHG8mtnQMr6E5gP6EZjAuHiUqhzmEclylPp9EQVKBgkmtJbI4VQmEqK6CJv1gRNRQG/7TN + Uhh9Nyux1SWjMCbGreL4SuAK8Nya85vLUxwB7WTpyoe2APgCoHP5o8BuHW7WCyQ2xisDn7VFcnMl6Je2 + XRX69Q//CajJ1P+GbeAz6Pn7jR8HQqeCq0lfPDEBqpc/Jrn9DbSvkv4m7/Ur1vzL0sF7kmUXeva4vNbq + I1Ube3YIG+N+ix67tDHO6xNb5qPyJO5B8z/RYf5Xkt5j/vrEVo0D2RxP1PFY70c9JbZmLCgeRXjcZVCt + TWwvZ3oKPsTX1RwF/V0nnySjbukv/G7EcNsncL9c6LaLxNb0HXEI4myxoVy/FRtStuIp8bW14S3eJKAk + pOm0rw5MN1hUBep3Gkw4rtbuf+CBgfvuu2/g/vvvT0nuUZKbwVhh2zcXtHiqENdVdDJmqqUQaCS1CMYN + o3BMOU6FlwFZoZosIhhqFN9O9L9YNYgi2Kmo9GIGnxH0cprFn3AjB3ANW2H0HTKxhYyc25dzlJ80Jf7h + vSpPx5Rj5/N5IcH9AmhdnDtBkmfit5Dnk+CLlZvXAp/9gldXfrT4lX+/czgiv/JvA0ee3HyZRDkqE1dv + fm/OFZzJ1Nftfc7las6EF6BjukVqAvwI8GnA1d2fwPfP5D2cs8l7uZ0t70AEgeC7Rc9DOKbH5bWmjzCm + 3saKYmKQjWVy72VuG+e1ic3xVb7j2dcw5q9NbIlH+rby2KMf9ZDYGnOAS509TaEr7dXE0MDd6qP1iS2T + U8whPvGm72k9jW3UFD4Z/R2TTxV3IaPOiW1zcKeVYA3u6OeYEvcQie3VNvodeRve4k0CSkIaTkuQG8ww + wouks+mhTQP33XvvwN133w3ckxKcyU0h5AII5hV08VkYsOdxTUWHUzouBeJIaqWzOH8YROCMAE/7OmCg + 01kUrv9FuUhs9GvQr0FgCOKVTledQa/X6xSmHEqcw1IYfTsmttxonV8DDRoT/8giDFf+Q3aOBX4GHn+Z + /4fAv3ktT2zyEvIUV0OmnOdOVpGlAcjiwGSiExhMDarDfs4WTRyAyU178ztyrt6Up9uT/jqJqzgTnW8l + +v/RBGkIiF+tURcGAHV+LnT/RNpze8ptKWQZQWA4eva4vNbZR0bJxjjvPrENf/5BiW2keKR1TGwNHso5 + wg/Un+Bxl7rrLrGVK+u6OfIVSTZHd8mnfKu7R/p7SmydcCs/+zmmlHvHxDZS+q3ooOc4OSpNAkpCOjqt + ApU5s7dJ7B4S2saNGxPcffddAw+wgnvk4WJLMgQQzCtog2eA50LgD6esKq2hMO4Hrhyfiqf5BXCVp9P4 + r1FOg/7faqcwA7yKcvvUT89HS2H07SqxNYIx/FuhKmehTgaOKfn2x4v/Fvhr4Adek+bAGToThzyqF0G8 + dTgdS/svgAnjA4AOsNlf1M4beJSHz9xMcL5UYsCOJOevfbhCVMa+kSkYzANMgG6Pxm+Nqu8vo6N/rpUl + PMp7Q5Y1v5DRrZ49Lq919BFxj4aNcd5TYhvm/D0ltmKOR7udo7vEVvIQcSB053HY7BDyGzKx5fZRzFHY + yBBzdJV8hkn/iOG2j30dI27asBNbod8tEydHpUlASUjDaRFoC8MhUAUpkw8+8GBard1xxx0J7rrzrrQl + 6RalD5J9NTSYV8iR0OJ/YuUJLuZQKY5xHhXlZ64s+wVkipsHaAQaQzyj+cyrr77yrarCxGegM7hbhagw + Pz33uverClMO4Bu2wujbW2KD70hEgsdhTLnROpb2z8BfAH5P8PsYV6JZ2pMsS50FzxYkQhhoC78vNgx0 + Brh8+cYvars6ciXl1uFmPWera+BUNtVEJ2iPgsE8BxOgic+VnW9W+rNsZ0DzD4eSpXaby7JXPXtcXmvr + I6NpY5wPSmzwPThgP/Ps5sw/KLGNII89JbbQXQRvj7vU3aDEVisn8IhPvGmbfug5eko+PdI/TNyD7do+ + 9nWMuOUdPG0Tm7Kz3wjod7Pi5Kg0CSgJaTgtxDYZzgRqkJBJk9hdd901cPvttye4c+OdaTvy4U2bUvAM + AShocShoIRJaJDXB+yFY+yu0MIBQVPQJXI5X6TSDuorTIPxVC39B/tRXXnm5mdieayZm6fJhusra9HC8 + 0dlUmP3i6wqOVw7gG7bC6NtzYvO5WvpV/yebr/rH21r2dUzJu/9u5U+BPwJ8g3BJ8BxylCfHa5SPoReL + klw/IWPHKFMcATTpS/Q6mQFuRL6oPRINGkyAJjdXkTqnq8rPvPrKq/8wWJZFcaT8lGMktyTLxr/waT5f + HErPHpfX6n0EXE0be2qwjZUvcISN+V2tXmyM80GJDZ5bAnbo23l8qcN5H27Mjy3l89fb+KDE5j37JB5L + G23O8UQxx6aHizkqfpTzCK09J7biP1REgRd+UOqutNkK/cpvUGKrlVP503PaRMwR9uEjl+QXrTqqTT74 + S9vk40qwgTvoL21vVHCHbOjrGHHLO7jaJjb6NPTrNmauX+NEbkPqO9fvSMbJUWkSUBLScFqCXJPhTKAK + Uibvv/++gTvvvDMltbRiI8mlxJZWbMVWZC5o8SjsOvBeKE5Iii+PvR7jA4cBWNrK5huQOopBTmf09fFP + 0ufcOvo13scfL76q4HaqnyrQ6963n/0d53jlAL5hK4y+tYkNox3k0MornE0ZCh63GFMpC8eCw//+/AfA + 7wB+B+3fgmf7KcfcSE1qFiVpW0F+k6M1K0jlKt5XXnn1HHAZeGq/rPxaNWhQln6vzi1JtyP9LhxFzCuD + AkA3suxFzx6X14b0EecZbGPFM4rh2hjngxIbY1PAbui7fG5UzP/4cGx8UGLryONj3c/x8ksv1ya24fpB + B/kNSmz0aZVT5he1c/yido7a5DNCtjdiuPN4K255B1fbxNZRv1swTo5Kk4CSkOS0GNs0hDmIYQWqIH2O + ZhLbSGIzqfmM7Z577kmv/seS1b6RoELQncA+dZD3UcEIMAkSGiE1/YqJDmJS8zf+FKpvzX2CvrWJzcRs + YPcrCvFVhRTouV6nsBdffGG68ihx96ww+naV2MLZlJu0aESCx1Zk4RAhE8cC/xNcJjWDxu8MvDrwV3U4 + NXpxpW2FR4ttBc9zR7O/40oj9T8yxBe1R+SX/keiOX9JR2tie7k1AAwly3o9v9hRzx6X1zr6yPBsrPPc + Ns4HJTb01AjYIzR/S2IbYR5rE9srvfhBm6Bakd+gxJbLyTkcH34xaI729tFV8hkm/ZuNu+rLgVvewVWb + 2Ar9vjAy+n1haBve4k0CSkKS00LoNIQz3X+C6a85NAUaleCmgXvvvTet2ExqxWrt3gbzoUDHybyC9pcR + fE2/8W9IFL7/Z8v/XcS11CfAJe5zrX3SL2S86DM6ltfF90p8E9B/gWKi8LcNfeaiQ34AY/i49BcKa9Kv + 8k26BvaHHnpw4MEHHhh46MGHGsnYlwvsZ3/HJf6ff048w1YYfWsTGzTOyA3KOZVZSkLQohyFtIXUcAi3 + dotfHvEfM2K0vjjil9NdYX0Lw/rT1u8cFUaacKI3+bTyEjzWSNOXlnMjRb6M/wdoc7tUWqVZ2uVhRF4g + GW5j/kGJDZ5PhdbzW2T5TBtZPl7I0ue/PotS5tqlY0t7aatnj8trLT6S5sU+GzaGDTVt7KHCxvgMGzMo + NW2su7ltnLckNuznFPR0nvoKvgsfLYpP53swbDyfvwyAjfkZn83fktiCR/0g9yNfjW/wiP/4vP3BFh7r + /Oh57XNwYsMPCvyd/eCJJ4rVgvyF7sRdoX9QYgs5vVTKKf+dS/GJt2EfzOdORtJRbFc3dXSutgbOluTD + vVbbK1fNKdZgbw36G7aX06/809d92uJ+CT8P3PlvgLbIpsTtvUQ3fR2jXOVdGYBvUGJTZoXsnIMVITTV + 6feBB7Wh1kVLQ7/EmVK/Q9rwFm8SUBIyBQFPRRjTENB0/zV6cpjMEBTkQySwe+8pExvgSyT333d/2msv + nKdg3LEwnITcABNZgkoyq4Vs3EtuW/oc6EXITG8BmtR8eUAnNMi5skj/wBT6P0YSmG7//IePpb9IzA+n + Nzh9TujnoGV2Sbvj4UM8vj00YokNQzsNI5jx0gsadeHM+ffXHnu82DIUHkfeKQGVMrVvQVvaxv1r6LLa + +03gG+D9fZJdknFyBPo3HCHbNhJcdesc3vNNTB3SMcoavFeA4wsvv/yKTuY/3hyRL2pvbmP+QYkNOZ4K + vecrD+mXj+ScpSzluynL7Hc3s1+id2xhLy+21bPH5bWmj2Ab+oiBpPCR5lvDDRvDL+psrCgmfpkKNujo + OLeN85bEhp5PwUfOC74jWCddt9j4ffU2Xs4v/YWNvzgosQWP0ugcPud17CAe281hAKdIfang0WfeLYkN + fs9KflAE92TbjmnoDlz1unumKT/pb9VdS2JryKnkIfma9oE/6Vctc3AccxTbkcSBXxZxAPrPJcm0JB/8 + 7QzmPd8Xr1pwN+jP/DjHTR/lnxJQsr1nzyXBtcFd6pek1oq7SfdjDdkUMcL/cOEYeZZ3ZQDOlsQWNkyM + ML4VCb9X/ZaFtvMw75A2vMWbBJSETEEIUxHKNAQ4PYxNJlSIwlOQVoJuPUZi81jG0wNG+lixqTjHWwnA + cILngSJRkbQiYSGUF14szp9HwHGvASbB8pj2I+BLgF/E9kURV2p+1ym+//TWV15++bDnG/QXxhb0a8gm + ZleWJjVXnY0vlz9Wrtp0HPq72vEBLxXudOWhXAYGXh2RxAau04AZ8p+MNgtKIWONSAinSMaUfYFUuTD2 + vxEY/HcryuQr4Pw2sFC5i7PFETD+2FYQiiq+mTQTz+rsl8UqmbFf4/ME8PuF6RH7ovbmNOZvSWw40ftx + qlPh93x5Ngh1K8v8R4FfUM/YS1PPnRObfZo+UiTTVht7dJCN5Vs5Tz9d/BRSMffzjbkJbl0lNoLe4djO + KfB63nP4S9i4PKX50Wvd/P77o2L+sHHtqMk7um4kNo+Dx+K7Zcq1uX3X6kf3DJ7jF0XxkOYguYHnW9Dc + ktio9M8iLuAHxfOjQnfl1nnS3WMDDz8Sumt+SRhche6Qu7s9QT+JpyWxvYycsItCTokHC8iyyH26mRxq + 7SPmaMroXOg/FZtrJJ+XXnzpDPwQ24sCuml7Bf3tcJd+LP2FbAbhfvGlF8+At8Kua2LEY+B7pAa3fZp2 + neLAedB3yisvv9KS2LS1Vv3W2fBDg2xI22rYUOi3C/95TZoESAjGPAVBToXBaRA/PRnCLxAoiUqhKbxH + MDSTmF/KdhvS5HYPqzeD5SOPNJODilAh4LqRz+UY8ALwz8EpL0OBFwMzMrgoA39JI/2aBjT9I+A/wHSr + zZdErDx869FnP64kFKAJw2dAb2DMmzGQQ1voR8kaaYN+VirSajJ2pRnPBou3ujAO3zBKlY/bBc/Jz7m/ + +PnPP4byDsUYTKJ+t2piKbohG319k6+R2OD/N3Dk06BzxnPPF86Q06jhaKwakYblsUaW/gs2egjDVbZ8 + fh88Z4PzTOCsF1944Rz09y/lvWR4TUNlpU0yKyqwYhWxiRW2153Xfs+Uhuobc1z7Fjjg+4VDMdY3vvLK + q5OR78RXX3nlNXvOVsqy8VYkdH2A4PBpaP4HeY6KU1mGczZluSkFSfkNG7Vf0vNzz9p/unZDMHGLpm1i + G+QjjM31V/hIYWP3ljbmZ2FjUfEWc/+itLGYm0BUO7eN85TY0MG++NLh2M0p6Pe8mF++5Sm9DdnGxh8O + G4fOn5N41LfbT435X3jhfdjRAYLHDR6TH5GM8zjQmKP4kYZ8DmlozEH8cPyT2BMric/AX0pszHEyc5yV + /AAZPPPL4rcUk+4Yq54eZg59IOnOAK7uyt8sNIk/SxJMuDPdvfLqqymxIae3KSdwfoJ75/kzYIWcilf8 + U3Io53AHatNDxRwNX0v2EUki2ce5yPxUbO54cB8NHydiB2dgd+cn2zPxIKO0EoR+aW2xPXHj28n21L+F + VVoR/nLgqW5wq99kY6wyG7IJ3I8Usgm7pm/xZmeKv+dh45+gADxcmZSyeStFa8OGn3u2iBd1NnwPRcvg + OOnWJ/OUK8QWHXSw4S3eJABiJmFkUyB0KsxNowqYnphNhlC8EqshKEhfHLnrruLFkTs23pGYfuCBgumW + HxVGYBj6PyGE72NYf4TizsXw/DK135PyGU4d+FuAVnYuzf1BY7dI/Aklv1dlQnOVpvG6QjPA+Sq6sDOG + vO8g+lGWhpTTb2BXWSZlP++HH697337JKRnndgQG+R0M5pOcvx8DeyuK2xVj2/6pp5+eyNJ/IsY2kXsT + MaaJKDZgAoFAiO9kuY1n4n07NB4BntPBM8NnQQ0aS2fz5Q5pSc9HMCSPG0n3ySIBgT85BeP+ClxfAefp + AnR9lWt/boAXr/3kJeEtDVXdWYH5+YCGisM1gh10JNyMRw7f49qnkcH7qSrfAv7Xv/zSy1uzIh72c7Zn + fv7MGPAJY4FxwHhgglDKbSKr0kKeJSQZJ1k/PRH+tsJOdwT2gJ53wPuHcK4z4PWHOr//CFEedDp5Nsia + zOV7kCzL/zFlf2WlvWg3HE+l8JgCn4MSW/KR559v9RFsRBzi0naKoLOpLP6aNuZ5ETibFa/jniUYts79 + wqC5bZynxIYP7YscDmfsKeA4L9lBBNTSxp1nkI1HxV2xcQPgo48+cq7zI8P3I9cDBY+59jFoOzd4tOiL + OcRVO0cNj9JI4P0WieIz8OcuwHGsSE5mjrP0g6S7qh+oO/0gdEfiafpBidvkUOgu6LcIext+9iY+305C + ei/9Pgl8z37atuOexI/Eo30kXyvncL6Yw+SU5pD+cg6O3R04HtxHw8eJXD+DOc/P6Q/bE0+Ou9X2Sj+m + v9uq3eNu+rLyKHBboOZ0uwNTxohi9fs94JMUgO+lMH97KZu3KStllvSb8Ber2Dr93jWEDTsePC02rK9U + bXiLt5deenkClfkkiJpCEpiKgKYhuOk6S0oKCMuHrP4WpMI0MG68c2PjVf/ENEJIz23M5gbgsiJhVfA3 + GMkfIMivIlCTlRWbScoXE+rgg4BvOfrGm8tnl7bxcojPVdwW2xVw5WTCcGtqG3BPZo43IuyS/ocS/Rqa + 9D+WDKJ4oO9PgemMjTc6qUrkS6Ulw0NpbqdqeA88cP8fPrxp0+dY+h+NUR345BNP7vvoo4+9AQeeTKU0 + GYOa/Mijj05GsZMZO/nxJx7fiX6TnnziiR2efPKJ7aFpewLVTqx09njppRffQVA6EmM4nUpthhWec2gg + Gq1zS4NJ7f4H7k/gQ3mNTGPSqO2n4brVg3H9JcdfAudncIpPo7+zuPbbBvhfqDv6aYCBV8NUd+pLMLkp + D7c1xJ07M47xE3j6PLr8EMlmf6rtNzDHti+++MKwnrOhizHAOOxpPLAVsA24tyPIIKcnJzH/Tk88/kSS + obJEV0m20J1AeXN9Z/jfHfreAkxl/Alc+zK4/rlIaoUc/TV75ZWSGgWXfOqkRYBp8vsEdpHkCb9cn87c + 0yjipmK3U0hurM5eajgmQWECSa30kaemUtkXNqb+nPOp4tVr6GnYmAEhvVzF5333FrL2fpI1PvLzxtyb + yrmfnkqiYe4XJr2CT5ZTp4aNTyRYTEYH+6Kbw5HZKeA5T/v5+VPNoBfzq+ewcb9j6rn86wPag3ahbzue + /t9GJiaAI5999plDBY/B9UnvJR610dKWLL600ZY5Mh7xh+Rv+t1T0OZKAx6/xZyfwR9OgL/jnnv+uZPB + e9Yvnyv8oDEHfDiHNi+96i3pDj16LR4ZKD/7m9ykkeufpNj8APjfhYzezucB3D8CXJ8F/tJ++s2TTxe/ + wKOcBs2R7CPmUEbNX/bg+rnQfyr6P55C72jwnwj+M9DF+c9wP3SgXAv68eMH3cp7IMVGj8Xd8DX6teJ+ + osD9fCvunz9T/B5kJJ2Osslw+7zNcfKuDJSFMill8y7OPxD6bcSghJ84qX7BX9Wv5+o3zfNYqV93uAoe + Gjasj2jDFMKvbWIjqbG6eGYShj4F4qZC5DQENl3FugJza0FmIjjefc/dA7ffcfvAbbfdlpKbQVIBGzTc + C48vFitcBHQeOL+Okj5JJWhCM1G5jeiyOIf9MnBFFi+EuKx1dbYb4ArNhOZPL7kl5Wpo3KuvvDoRZe2E + UAfR779bqNJ/D/TeAd233nrrwO3wEN/B0zgee4zk7BtYKFlHICidd++993yNcafAyxHAQfc/8MDb6P8m + 5tiX6/tybV8Uvi/j92WOKY888vDeBOU9qITfwMpgl18+++wbrPRJQO9GDh/G8KzGZhSJtzRYCwccSsMx + oWlEQiS3qMjUR3JqxhG8/wJD/oKyRX+fgP/TcRwqp8JQxVs4cVmBwaO6MtBtBFJBklVhySnAbzHgKh1a + vvLoI48eB54DoHVPKsAdCHo9f1GbxDgG2xpHIpoAbMMc28PHZBLZLo89+tju6GYv+JsCHW9UhspSmSpb + ZXyfcN99Hr+Ze/vT7xDgKPp+mj7nQvu/J+e3iFGW8OL2jLzde9+9aUdB0EbBm2Tp1o0yf+IJghdjtJdN + D2+apv1oR/oDOms4JgGh9JGnanzEpFboT1k6b7IxAoI+4qfnIWv7pTfw9JNyboqnxtwkt5a5bVTaEwkW + k9H1vvB4ODycAt/nyXMRkJqrNedp8VE+k64Jsr7g1dA1gUk7QrZ/gFzPQA8fAfcRgsde815K3KUtped3 + rkiRpThvv73g0Tn8ib0Gj2nbrXipwXm4/i1wfoYkd8Izzz57HMnsZHCeFX4Qu0LauGMfKgN3ww9K3RXb + yQXe9Msb2HnQj0yOeeLJJw/Dpw7Gxt5LIX48178APf9df0i+Jg+lnHxjlLHpRbjmHIWvJR1ZpEs/Oob+ + c7l+KniOp4g6Gns7Efs9g/PzGwVVg35Wmya1zI8juYnb7U77iVseKJ7PhdaEG/0WuJ8ocQfdJe4i6TSf + fUm7PJjcXFiEbh0jz/KuDJSFMkmyQUbKKvSbbAg6kn4Zr35NyEm/mQ1V9av/pHiBfLRhfSJsWF/RZ0rz + fW3aL37xzASYmwRRUzD8qRA/DaamS7jClFkVgiCSEN2GvO3W2wZuueWWgVth2tXbvVGRWhE+WhieQZj+ + f0j18jmM41gC+8E4qD9k68sePnOqA5OX4AsCPjszkfnigsnMZ1Wu0FJCA3zmMubZXz47AWEW9D88NP1W + Hya19RvWD9yyYUNyzuT4pdJ03qQ0jIn7f0MS/P07N278Enyfcudddx7L+A9uvPPOw++8667DGXc4QfPw + ++6/73DGH4bzHcI8B6Hkdz788Ka3Mv++GOcbn3nmF/thtAdjWMfg4J/HOWZoTM6RDIo5dVpp0GClR0hO + wTXwpWrPNyaffLIwKHj6z8DnwfFx+DdQnAr9ZxMsFllcyIO8q5OH/NFqePdln9tux1DVW7lafeihkm/6 + Kq+nCPYGXfqfAz8nMcchOPE+0D6JeXo2VgLXWJMaNG8Dnh2Z4/XIYE/wvpl594e3A5DZwcx1KEXDYcyb + ZHoXsqXoOBx5Hw6twns5PwK5HM/9U/k8m3t/wvhLdWJlKQ/puYkVJ0ntrrvvSvq2eDG5GdyVpfaQ+E12 + +riynq7daD/IbQqBltXZLxq8ojt85KlkY4xv2hjBr87Gko8g41vxET8997r3G3MzzqKrOfemqZy7IpyE + fbTI+aWXXppIsJgMDfsiu8PBcwq0nqeenizn53pm43cx763JR/2MVZtycfvZ/imxEgCR658jm7Oh4VTG + nyR47DXvpeRdytaxJhhxifPWcg4/8Y1aHpXR3ffc862HNm36DLZ+Aro6jnlPht6zkOsME1/DD7LiwDnU + 2913Fc94cty+DPU4Yxwb9BOMT+H+sZse2vRh+DyeYHsqBcU3+fyBfOozFj36A6vttML0XQHnwNbSfAb0 + FvtIOoL+u+8+F9ynop/jwXU0uE4kkZwB3ecXtAP0K4rIzn7szpe41b34oTHh5rjA/eSTJxILmrjRkzaq + /zu+gRu5JPlQxBh/i+1a4i+4Q7fyXsrgVJLt8Uk2yIhE+4nQr4VRU7+l74CfeylOJhsi3rfTr3pr2jD+ + k2z4aWz4mdc2sT351FMTIGYSCpkCcVMhchpV5vRHSVA6i8wqUKsCDWwjFajMrl9PYuAzVaQGjYbiCMCM + 83VXVgbfue+++z8Fwx9A0G8ji7vyMlGZpKrgKizABCb4bMFE5vOqRjIrSU8NvIl+AkODfpQy/dHHi9dh + G3vpJf3Su4GEdtNNNw3cfNPNiQeVaJAveNDxWW6jtHXr1v345ptv/it4/QPGfB1Fn7nhlls+zecnSBCn + gOsUEvspGNgp4P4Yiico3H/8gw8+8KGHHnqQyvrhA1H8OwhW74bOwzReaDmTqmyGxppeR2ceDUUaNRwd + wWAseOw1V206vNs8abXBGALM9wAr7ZMNGHx+nPMv4gw/cqsgGSoVnuPiTVYrL4311ltuTQHXOcJY7Zdw + o3fpYu7fY8wnwPle7r0J/K9jnq2oUHt6gcTVGo6/Fcl7B3C8Hl73Bt/b4dci4IPgP4bq9kToMFlQPNx1 + Cvo45XZkC42nQO8pyF74JMef5doXgG9y/Mfo5a/R2TKDVuJXOT64aeBeKlqd/g6KlrRlnoqXu5LDMl8h + S/pqH49jJ9oLvE574MEHpnLPVdkkCo+GY5qYoR8fadqYPvK4+kg2VrwokGwMO7oDe9KuNlg86SMb70gv + kfidIPvpU47TRvGn6QSfaeJl5VbM/WRzbht+43NGt2rdGTicQOUOwnnqSVtNejagwltu49hvouE2ZKA8 + XEW4syLvEQDp99+R0e9hC79JnzMFj7n2+9z7awOX9ha25L+rEtftt92ecBdzbGjEgdga82WZJF8A+X4L + mj/DvCeA7zjwnUyfs/SDojjQpovfJTTpWJSoL/1y4x1+V7b59nUE8JQcMvrp++W77rzrs9B2KvSfzriz + sZM/4vif0z/MpH9KavAPLQ382oYx7S4SRW4f6rSg/3H7nXv/ffdbOB6PHRwNnhPpdwZ8nB/021f6XVGF + H0NP5sdFYZFsr9R/E/d9CTf4jgZHA7fJ0p/CC9zElJTETGramEW5PHguTw+lXbNCtyZbeUcGf6wslImy + AT6rrJSZskuygX5l6k8iaiOFfm8b2ECMX49+b9lgnPeHOJBPRb/JhsN/tOHwH3ymNN/XpkHcBAidBFFT + qGCmQuQ0gsZ0BakSZEKFkKAQoJXgbSmp3XTzzenTcwWhYDUK+29KYx8xiJ4Lvo8hkEMJYm/ECCY//9zz + Jixf3R4SShI7tpx+hNug3/mb9GvMVtIF/TfffNPAmjU3Dtx4440pudE/GUhh2GWCRmkaFcq/mPv/xLi/ + w3m/T7+/wEi+C67zMNjzMOLz4P08eP+POM0fM+fvMtY95y8RoD5DhXY4SfJQzj9IxXsidJ5Fopth8n/k + sUeSwWpQyk7ntTIySAgE+YZDp+RD8EoG9XD6vc7vce90HP1EcBwHzR/l2hleNwGKdxN9Hef4tD1FgEsB + d/2GgQ23bEirN1c16s6H58pLuRkASIZ/B6+nUW3/BuP3A88uzL0NfPT0AgkGPp5gsA30+LxsT+h8OziO + J8B9nuD0da5/h2t/CP4/ZZ4/V57oIclWGSPr86DjPOTxPeAvAQPZD9DHv6CXy8CVErJyUc8GleSY8HYL + PBp0TeQGSAOMVbn9fMlDfg0y4JpOgTJN+yH5sPLfNAn9NByz1UfubtpY0l2Z1JBz2u4lyGhjhY/c1PCR + IvgURYT9ky6ZXzziI7m5EpyCLbTMbWNlMxEbmsw4t2RdyZ6inB7GDiKpGvTuKxO689287uaBtTetTQVc + Sq4EwbAl+xfbbY/jB2v+keLtv0DnH0PL71K4/a7HFnTeK+TbXC2IQ9ukX8K91gLx5nVpzmRLxIl4ppTk + C33c+xZy+wy8n6Ctcv1kcJ1FsTdD3fkIINkr/fUDbRWZJJy3slrQbj1P/mlgRXfuclTo/0N0/S1gOvb9 + bRLuH0OftjLLJKjPKHttPb3VjT24mk1FHnOIX/ugME2FYNCvjqHjXGLfqcx9PHo7GjwWYhaV5xsnpD29 + rPRw4WvKyFWzchJ8znoPPHmvof/ATYxEZ+B+wKJX3CeA+/Qcd5JNKf94Iz3RbpGKjORF/MmPwf8ouOWZ + uWcjg79WFsokyQYZKStlFvpVloE/9KvN3Ixub1p7Uype1EWyYfSb89DwH21Y/8GGuTdJnynN97VpDz20 + aQLOPgmlToG4qQhr2rqb102XeAOAhiTDfl9FgcpwMui1a0qniaRwT6rmNEwNw/EIb7r4xCt+53G+cuoR + aQhxAvRNQqhTCIKHIOST169f981EP/AAYBUSL40Y6NbcuGbgutXXDaxevXrghhtuSIlOI/F+VG0p0JfB + R+WpRJXp9YBknCXolPazarIQeOCB+wiy9zDmoWNw7iPBcxTXT6Zyd1V1sXjTWOaQTg3GLRGNSkdzeyc5 + BYHKYJ1ool8yKAB5fhd6P4sx+zzkKGRwPNc+jSP/llWt9NjXcffeX1TAGqeB9iaSuQldWRS6K7ZKksyg + f9Mjm9ximItMvgANRxOw3gkNuxP0t6NP1y+QvPjCi2NYTU0gUW4Pn7tC15uh5xD361MATNVfkbAfflR5 + FIlC2ESQUMYhc3mSNhNSVLxWp0VgL95+vB8+rJJvYzWxbp184pjAOnhWv8ry3kyWJiM/kck3SfInaz+s + uKZQ3LgD0LDTOh8hmCcfEYfFkNuc4SMGy+Qja9am4HBLWTjdU8rZ+cNH1uEjBLfkIyS3KQ/cf/8kVi0t + PkICmIitTGbsvtBwGDo5hc/zkq6S/YSPFltIJp21a9cO3HhDWbxRhMq/99yCc37tQxlybQV8z8V/LmX8 + hYLHXmOO1RY52qljXHX46EFc+oy4b7zxBnhdm+JCzqNb3PJXyvdb3PsMtnoC58eB62Tm8GWnGak4KH0h + FQckfws6V5kbWClor9qpyS22dKXF/tLG9atK+i+G9p8A/87xBej6UgL+/MdSYih9jMDPvUSn9K5bvy4F + bR9L6BvgafrCA8jWAkj6160/F5mfiu8ez72jwXMi+M+AhvOjQEq+xjjp086aflw8Zw0/NkZKi8nfT+YH + 9+1u/QbuE+h7urjVUYo19HvAwgXdSaO0Wpyuo3iBtqbs4U0e7a9cH3vkMZPefPR4qTJRNsqI44uVGbDS + rdEk+6Rf8LvFDN3Gh0K/NyZbdtXWIp/SfoXkP8Rd7h8Cbnc1JhGjXtvERpU3AcYnIZgpMDQVQU8jk0/3 + FX6VYAAyKdx9Z1HxGySS08CwyY0kUhgdwUqmFayMC+IRH44wFQFPIeNPAt+IMkywHU8wmoRQ94GOQzZs + WH8SijjHystg44NbFQaPycA05Buuv2HgmmuuGVi5ciWfqwauv/76QnnJQIrK1jHyoMIL4Bhlps/yWlIs + hqdhFFVb4aDJEO8j0NydjGAa58cJyOZjVG9feuLxJy52y0zj0JmdR9lpnBqtdFgweJwbbKNwAOD3u9z/ + DDI9Dpkeyar4aPq6ZfeNRDd47Re4NcoiIN2sXgCCLsHJOXS6pLsSf6KfY/qeDb4TkOtBjN8LGe4ILV3r + 7+WXXk6JjUS0Azh3J5G9HT4+yArk+/EWnc6rE0Z1muSnM1tUlby6xSY9iS+vMc6x9kl2mgWsZKPoWPu8 + 4YbrAe30pkYS1w7uo+gIfPKM7r/J/ZNvv+P2Q5DFPuieAuzBBp/3YbN1PuLYhINgrPysaJ3fYNP0kbUp + OHvd4kJf0qcSL9hn+AjJzZWgK8JBPoJsJtJ/Mvf2xYYPu2XDho+jjz8P/UpH2Hian/lMOBZugnSod3Vt + 4LKvY1ORpPyBKITqril/k5o25EpBXA381xX4lbn+JQ3KwtWjtOmDyPdc5v40905AV8cxv0HwTIqnGfpB + 6NP+99zrNlu5YmAe5advKlN5k4ZUnKB3C7xkP0HvQ00eTPh+ijfJKbORSMxrblybitzC94vt1LRlTSGo + TSX6iSOsWs5ljFucPt89Gj5OpO8Z4D5fGyzssPiOaDFHkXwKPy6es6a4gn0ox/g1DwH+zsX2Tr1z48bj + wHsU9qe/nQbuH5hck70H7jKGiVOapV1fVk5pV8JYYdEYq84WeRTwcCoOm/pVhg9QhBT6LeIPC5uk09UU + /9ddd93AjczhtqQrQ/WbYiP0JPsv9Fv4D/G34T8PNv3nNWlURxMQ1iQUNwXjnErAmwYz05NxwoCfClSh + WYEkoyZYmAz8TELl+p0l02kcQev+e+5VKNPFJ17xOw8V9YgyjJGMZ0WxI1XP3htu2XAw9Hz0xjU3fsPq + WToEaTJ4+1xAg1ZZK1asGLjq6qsHrl5+9cCqVZHcXMWEAxXbgPfiaMqhASjUz2T4ERxIaLFlkAwGQ9d4 + kzzuuedUjOBE4ATk6HO5Lz322GMXaxA6p3g0Kvs6r0ZrYBI89lpKPPRxf92tNLe8wPNd+pzK5zF33XX3 + B+lzJFXuSTevW/cV+RVvKkroG88TxOcqwlWqYGFiwG/MUY4reLxX4z4Xo/0Y8xyKwb+RuSaDZyKy6fo5 + G0l8AqutHXHiPaHlXcj0w8joO9L1wKb8eVeR3JL8krMpGxwOOUpLkr1yL3kSpPdudGQlD22Jv7SSwC6v + vfbaVLysvrYMvDir23Hy6arC53AJD3ZCcPjGzetuPgkbPZgAtA+6kN7GG6CMwUc21vtIJLW0RXRHUe2m + wI+PkFj99JzERWC4M+nZOeXJt9rEs3bNmlYfYb5y6tSQxwTkthOyfyN9DmWV93H6/Sdx3H9v8Yactipv + Jh6DnjsS2vXKlauSLNS3ycfAZXK4j7nVdQqcBn6ClKuItPok0BXXCxsSv2Nuvf3WRtFwLXLNC8PYjrSf + tJjAQ08mb1YYp0L/R+D/WOg8CZs7Ez+YkYrPFLjR9T3NxwWuuA3aYas+OtAnXI2nOeDd4rGV/uz4/jLp + w2OhH5OCq8Di+bo4TczXlYk56Sij3zH3Gz+QE/fPhe9Tofl47h9NgD8RPZwB/vOVT2MeaNLXwo/TM6rM + j33M4JahuJP9gvv66687l7lPZe7jkM9R6PUj0PhZcP59KsBKO7VvKpygUVlL82rimIWFvMiTvMmjtpje + mGRskoUyQR51sgr5yHex01Hqd/W1yX6atnNz4kEakmxKPzTO6j/4V/If6C/85/6m/7wmDWInkBAmERCn + 4LBTcbRpBITpbouZ0O6+y+c+hbJiX12H1XH89FzFxQPqu1CcgtWQxCM+8cL4FJazk5yvnHpEGqu18Rvv + 3LgDDr3XuvXrDqICOuG66687W1o00BT4MDYV5/aeBqxTXk1SW7JkycDixUsGli1bNrBy1crkoFaIOhVK + wkiKh7PukcuPRtswepSqYRiEU1IjMPvp/n96JknAe/LJJ/8VOk5jzEnAidDgyxBfIoBfHE5vcBJnYVi3 + JeOURsFjaU4/XaY+nBvZ+hAXPN+9ae3aT/H5Yeh8H/AB+h8P/WeScH+SgjfgGGVhFSw+g4V8mtzDIVLQ + hU95THOU47CJ8zDyU+nzfgz+Lcy1M/rbmsTW9XM2eJ1AAt8RXvcE/wHweSy0fkH8SX5uLabElq3YSGo6 + X9ARdCW70sYAq0tp1pGVkdtK6k7eTGjqd/ny5SmwEzzgMwu82LQvcySc2Cty+Nram9aeSBB6z22337Y3 + fXbE4RuOefvtd0zYgO0mH1nb9BGd3ApZ+qSp8JEicF5//Q1JxkXBVKwIvG+/xE/FRygyWAnejI9sGOQj + 0DIBmnbCxlNiNRGC8/cdfy/0+8KKtnnHnSRWfFE5GJAs3pTDihXLOb+GgHXDwHqCorat7JJ/313Yifac + iohUSBiwisJMsK9j1q0vEvY1Je7lVyvfFcSC1aUdFVtiib8UB9Af/F5/3fXfxJ4/BV/Hs2I8Bv2fhC2e + ic5nJB8oi0/14aogFWDwgB8nutWnSUjbVc/FM7FidZjoN4g3/El8TdsP+ouXXUI316egvSol5muZRx2t + bcjF2Jdww4PHzD2dVduniF/HwcNR2NEJ6OF05jpfP7snyaukP/Pjm0gGyY/X48cJd1FYRRxxDng7d82N + N35q/bp1x+KHH6bfcYxx2/Z/2Ue8gVvbtXDKebC4SIX5dRSq8OC88trUQ4mDOJPL6F6KiEI/mX5Nasg4 + bEdYpf9cd/3AOvwn2W9Z8Ae4k6f/IJ/Cf267vfCf+5r+85q09RvWT0CQkzCaKTjYVAQ9DYZ8mJ4EKch4 + UlZZRemwMu8nTtbYo7ZfMaZYIYhHfOIVv/OsX79hRBMbxjeOoL09AWUPqvV343jHYYhf0ck1ogCTlMrz + pRedxKC3aPGigfnz5w8sXLhoYOnSpUmR8hXBqHgjSKMsHmDHW0jyaGC02jGJpVXbw8UD3saWCkbF518x + 7+kkxpOBE+64/faPr1+3/osE8BkG6SIg4UClcd1CYLAac27B4/RG0m3FlyQN6oLHGNF5GNSnkOmH4Osw + 4HAC71E33HjjZzHu/+pbXikJlEld+uWn0N/1qSLz88Yb3U5Gf9xX53ffXSRxZYZD/BhZfQ6cHyLQ7I/h + vwHc2yKHrp+zPfrIo+Mx8h3Atyc8HgAdx0Hrl6VLB3uQVVsUBz7b8zg9qyDYKUMDhW9kqT9BPrQ1deIz + GAOdsrqh3BrT0a+66ioKlsWpYFGn2ql6V/8meCtn5zfoKnfGfZVV/vHI8kD6SOcOeWLTZps+cn3TRzYW + shXEI13KUp+wmg4fobDj+oYWH9kIDW5Z1fkIgbDFR9DHBPjGd9bvgx4ORu8nEfDPcXzYtz53O0k+koJz + a+PKQFi+/GpWr9eymvWZMsHWRAs9IQ/HFzbjW7kFX8o7+T0+4Ji0ShAvibLAe1WSr3InsKW5HeNYcRU4 + kO+1q78OTZ/Alo+Fj6PB+VFs6czkByZmA6Q2Jw/oV51ql9eS0MRvAl2xnHnK1be06JfSFvNJc9i7eLRl + 5xaferdYVS/Xow8TgTZy9dVXJXtZjS9oQ036W/WKfr7BvJ+A5mORxYfRwwnwczpJ7Xxlf/c9RbHisePF + I40mS/G62vGatKizJB/ou+uujQMr0T/y+xT4jgH/kc6BHXyK/v/pLuyroV90lHATI8QpzWHrgjwVtlYk + f3l2PmVwJzxYnCdaS1yhG18gC3pDvyuwm0I+Fi7IB7zet6C4444Sj/yiNwsR/Yd5W/3ntU5sa2+6aQJO + PQmhTEGBUzGkaRjt9NvuKN9GQpg6TMM4rIp1WgTrJxVsyvRJkPRL/Rl3G8FYPOITr/gx1kk4wIgnNubd + juS6GxXLO6jOj7rm2mvOVGE6rYaZjJyk5Mqk2Iq8PinPFdvChQuL5LZo4cCSpUuS016z6prEm87lw3+V + asDSwcNgVK6VkEnMZJZeGimTmtWuhoNcfpv+p5HQPopRfoTjj2GUXyB4zwhDS0arkYEzBWpkqeEWDrEu + BaBwYPmQH4+h6TyC1ycxqCPod8i69esPQTe/gZF9AmP89kbw+TwljaG/iaB4Plqs2AxGOoKBLiU2g65z + GCzLcVZ+K1et+grzHEcwPYC59rzpppt3oH/XRkvwGkfg2h6692COd6OnY29ed/OXpC3e5EorN1ZpSY4P + Fm82uqJRLm6PKHOdb72QHpqvSzrxrUNsN/GBjaUgaIFiUhOWLluaHNP79k8FSiZHQfyM/SL8HYPM30VS + 2R1n3Q49NpJ34SNrMh9ZWfoIuG4v5KtNSKe06SPN4oHiL/lIuQtAv2SXfOpjVR+hep8EHS0+ghzGM3ZH + bHcvgs9B6O4EVhtna+MGreDFwksbYiWf5jaxKQ/tfGmZ5L1uANO+3CpTrmFfOXjNIGrRal/HmCxXriiC + qXj9dDXoik0/8TlPWi0wXjuST8/h7atrblzjlvbR8EFi2HAiMvm8fqCOi6RaJBHnVYb6nsF6OStOk+hV + V7nyXNlCv/Ycz6L170H0w1tKyuWLEOpCnK5iE/0kNnHqC9JfJHuTT8hUv7ndld3ZxIOPM+fR0PYhPj+C + vZxOcD/ffilRJPqLAtI55UEaE50cu2IPOSd72VgUaFddtWw6NH0SfEfrv8BRHJ+CzM4xnt5JIkm0pBiG + jcGv9pQSEPpcdtWyxIs8uQKVR3nV3qVDHebzmogK+eBTmX4pXpMc1O/VFCx5YjNeyEOR2MABLepNfsWN + XeA/Nxb+s2HD7iTM7R64v+k/r0mj0p0AQ5MQ5BQENRUBTcMRpofB6/hWdgo0CYHKDMHDbLH37Xmx1KYi + Kfs7zi0R8Vy17CqrW6vcKc7DmBFNbPfdf+9YDGAbqpRd1qxds991163+4KprVn2W4PhvKs8Eq7FpsBF4 + 3JLRwHUYnX4RKzYDoYktVXE6kFsUGIk8WgWZEK28NBb509isNA3CJrPiAf79aSWnozofzjwdA/s0Y0xq + xzL3yeA6iwA+o2EgOkbpECl446zrMEpXax4nPZik6a/zGrzkAyM6b9XKVZ+Axg9i6O/h/CCM833I+WQC + 2jkb1AeOkcAgCs06rg7sCxUaq7yZGBpGm5w5gqT03GZwPAfjZoVw7cHMtQ9OM2ltD8UJK7ZxJO9tmX83 + +HkHdH4YGZz58MMPXyL/Vn5JhuXzABOd28cGCmkP55NGnVVwy8UELf3qSF3pgD4vTTpFjw1nR8/28/V3 + 5SZfSZbJuW9zC3Q+fc4Az5HQ9XZo3BX+t31o06bGdivyynxkZeYjRVAtfERab03JwpdVnNOXlPw00ajL + 9IVtdFmMKRKHeMTXyUegdTzjt0fPe0Dnu+l3LP2/FKsWQVlJh/aijCzMkkzKxCCYhPANZLYa2yyCX7Ix + 8Cgb6Rc81la8l4qHG1yBrk5jUzAt8bkKXLVqZcEjyaOIGciitJ/bSQrqbuXKVV+gz4nMdyQ4j+TzI9jR + 58MP8uQsL7G6MpEWq86rBpYtXTZwNXOvooAxkZr4DMgF/cVLGsaoxAfHyW64J4/6r9uabjuuWOmzdYN2 + sVVtMtAX7Oe4tIrVz0q53rL+Fnn+Eno5CTwmtSP4dFfoNOz6fHc6CnsiYZjIk9+EH69LkGiUPmgzOTlG + 3BEjoeMTrMA/jIw+ABwB3yeju6/eusH+hW71TcepK2m1cFK/rmbVRVFklFur3JNn+zm3sTnmD1BmIR+3 + H4tnskVxWCQ1Cgnlc+01yVZ8eScSm3wWMro9+Q/2eMb1111/JHaP/2xI/rPpoab/vCYNIU7AsSfB0JSr + li2biqCnLVq0aPqGdRg7wpCZSApWHQZ3g4qCs3JQcSG05LT018DWMV484iO5uRKc4jzOV049Iu3+B+4b + g+K3gq7XrVlz474Y3GErV638GIHwz9dtcCWJ80uTFQp0WuWRAFNA9LlaVJ9LliwtnEeDR7mu2lzu288A + ZRUkv8lYcFYdWEc0MKd99thOISDfkRxivRXQ2cjp48jIbYajcIqPgu9MVigzfA04rR5Kh46EFU7RcAZk + mYJxSmo6BH24Bz3n6RAY1Qc4PpB53gXuQzH24zH0r8YKIQU9xsl/Kk7WF9uRBgY/03et4Cc5dAs9BKVb + 1vuCze84D3gPZ643rV593euYb6sNt9zS7fcMx4Jva/h5PfLbD8f9IHL5LPj/Vr3ceecdaXskyVBAhrGC + NTiZ0IpEtjbR65tgFibu+6sbdaRDpiBOoFWf4ehe02EdWzh4saJIAQuwIENv/0S/T2GX74OvtzDfzlS1 + W7PSbDjmNZmPLLvqqqaPYF9FIsDulTHHJgR9Iuj1M21FEUgKH7FfEdQcHz6C3bX1EWgeB13bEmDegOze + TkFzJCuZM1yJrDcpmWClI1XhRfHm3OBxqyutegziPg+LxGYykrZkz9iKL0252kuArNzO8p597KusV11b + PNMRV4GvWO2krVZwaK/qNAVt6YA/5PuvBNzPMt6K/gPQZiF2POef0w+SfSa7M2AWiU1abqI4MECbeFw5 + pECrX0o/c+b0a+vq16Iz6HfbPejXd6XfoO8zI/Ek+vl0e1NZKTMLlfAZ5ahslTF9P4csjwPPB+hr8jkW + XzgNOz3f9w60qcQDyS35GmOrfqwtF4W28lFPxWpS/S9btvQUZHkkc7yXldj7sYHjmfPMdSRu7SbJtCyI + xKV9WZBeixzkJZK0+riGRCSv8tyiX+lgPkG791pVv/CUcIhT2ehXJn37rCeeF7q1UC70K/0Uoz+G3k/i + Z+/DDt4Mvzvr77n/vCaNCmYCldckgsEUHGwqgp62YMECVxqFMFBAERhLZhDKzRoNQrcK1gitCFKgDueG + YQOmeMQnXvEjfILDyhFNbA88eP+YOzbePoHgsSPK3uva1dceiAMfxxL9ywbE9eutxPxCcmFIKtTq0qV3 + vDmmUWgcBPGmgeBABgYdV6Wr/Iax6ATKBSUbhIvtxOJ5jUrXIVD4ZeD+AmM/ypgjcWpXBB8BZ3JoabFv + JBM/k9ErP2kFUsAs5VqAq65bk9yh5zxkasJ5PzS+i/P9wX0QRnkUifrMe++99xKTWNrKNJCCV3xWoK4+ + rXYFg4K06DjS4TMtt0nUp04Jr/+DeT579fLlv4Hu9sPYd2G+beCpK8NlxTaGYL7V2ptuet1111//JpLE + 4dD8Cej8HfFLl7wXW1LI0tUu5zG/AU4nTm/iogMdzYf96kTdqCOLEAOgDumzmOSY6NX76k1+I8CYUFJw + kDd0Cb4/QOcn4dSHkCynEMh2gp6Jjz/xRCNxr1i5cgL8D/KR4gvYRWKJhBn2r40U8kUHaUejSD7KuUhq + zI8dduMj4B5LMNsa+9sZft+M/N6LvfqzSP+UfigBHabgKV70rX0oN2Xl1t3Ka1YmmzaoN3YismItfa+R + MdKagMCZJ4VG4CNo6i8JV/lChzoxFihP+U7yJRiLR/4Z94fw9DH6us12GNfeC85j4eOMVj8oH2Mgx6Qf + xju3c6Q5U6Bdib5dsRUvrjXoh1ZpDvoL2Qf9axr0F7YSL1yU9COjpCfGK7tY/RVx4iZt8++VNfZxJHgO + Aw5n3NHg+Cz3zk8LAPSaktvt+H/Dj/XVQhbNhIYv069hI2WMXLx48ceZ4zew4anQZ3H6Ic5PfXjTwzNT + YjLGsnqLZCh/8pb0C0/KpeBJ+dToFxyD9et3kQv9xotOvhSUfAkZqWtfurKQXIcstWHnl3bjvefKmPG/ + y4r8RGRyMH33AT/+s3HiE483/ec1aSSACQTCSUsWL94HBzsYQZ80/8orz0mv1yKEUIzVoIrRIZNgYKrY + mkPoSWmF44ZRu7wVj/jEi+Pu4zxUvCOa2Gwb79o4ngpzOwLgG3Dkt5GsPwhfn6ZqmLN27Y3FqgTHE/JK + VOfQuAvjWJXAVVxSLI7rw2vvCypeQ/IlhQhYVnUmHANzkdSVT6Fw7v8tDn0auI9B+e/PKr3TcegLHR8B + MY1PW0lFYFSGVp4pGHpNp9Eh6K+8/bUHaPlPyPTjzPFecL6D6o2ks+pdOMQHFy9e8hlo/Nub1hQBR6dI + IG6DBtc09hQUOfZaJFkfDqfgS1/1TIKexTyfX7psmc62P0njDcyz7XXXX9f1Hjq4JiCDSTjOPiSJg8Fz + ErbwjRvRQTG/ciwq9yRHeE7VMvTpeDcgd2WvDgxqSWel3gzU6irpz8+kt6IgccwaZCUeeXYuV0nKXh3e + cN0NbgWdCT1H4ZzvYswea9fetANy8PdHG46pzWq7i7Hh8JErr5x/jjae7EBdJR8pA1r4iPNyPyW2pMfC + T4qdj+I50pWZj6A3fGQZCbTVR1hNjwHfROxnJ3jdGx0cRBI8Hpp+0wDmc263rhOPBOS0q5JktybZuCu0 + a1iZXLO62IVwW9GtOb/np3z1db8GknZiwOWnvIXsr7uheK3csSFz5ev4tcxR+IMyXjew/mbnLwLvDcxB + 0D5r+dXLSWSrD8MHDirfvD4KfZ2mHxikkx+UyS2taDmXD2m6nrmdUx0LDd2ymovgneiHZrcvi09Xy8WX + i6XRvunVeMZdcw12E/SjfwN30J9khwwL+k2I1w8sXrT4y1ctu+oj0Hs4dB8EHAIdH8LvfP3/ByYIfT7F + P99LqPoxvpX8GLtIcdTiUh9kDleKV86/8pyFCxdOW7p0yfvBaWF6IJ+Ho9sTmee3jTfK0v43U6SnGIau + 3d52fOIN3ZrwQzeuaE1KIZ8biYHiSLIJ+XDNgjEVi+5+6FcJTyEbfc2xaW7mS6t4+Cz8p3y7lLHI5gwT + Mfp9B/13xw7xn40Tfv70z1/bxLZkyeLxixcv2nHRwoV742AHzZ9/5Qnz5s37zdUYtFWfAlURCVLALZaw + MuZn2o6J+6XDem81RiGe+fPnnyBeHHdvjHxHAsmIvy1z1913jWV1sjWKmoxippDY3oPjfwRn/E4y4FJB + JjhpMzG4HaniNACV6lcAqg6UoFR0KDsFSwxKPFbriW8MV+Ndz2ropnXF96iY/zvAKTjEEYw71GoPHB/G + CE7FoX+SDAZjUaa3J6MXmjI2sOe4k7PTX0cCl3T8CfI8iTms8PaD5jfx+TbOD0PWHwO+dcP1N1KAFEap + 8xVQOK70N3UY2wzZqjtVZFTc8AuuMwnqrgTfSZDfHcfbnhVtL4ltPDLYgeSxB0nk3eA5Btq/aLBZu6YI + /ik5MK88F0mtqCgNLvkKLUGpq6QbHdpAhc58oG7Cs6869cUYHbngsyjGDAg6tn3g92+XLF7ycWT2XlZJ + bwHfLtzblpVrC2/wjo8s3nEhNlz4yPzkI1a6vvkm/bdCf/hBJOVcvvJX3A8fYdW9+oYWH1m4MHxkaYuP + UNSMIehOQO/bU1HvhvzfjgwpYBafumnTpp/JizbZ5BUeoctrBsYkD+VXyiW22LVlg5My1qa0Wz9ziKCn + XJPsy6To9SLwlXMCfpoYndcx2Ov3sZ1T0Pn7ka1vLBv8DgTPEfoBRdNP1MW60o+KwF+Az5kT/cjYLwqH + vgudQwO0SEOV3hxihR9JTZAutzivX+1YkyL0Q/PNawt9JfpJdjfQ77777vsJ9H8K+/gN/PgAxr+DuQ+A + 9g9QfJyCr/zPNWtugNZytVrSXthx09+auvdeof+byxV1qf8TmeewZfgXsnr7VcuWHUicPJJrp11nooLe + RGcp4wadjV2MUr/IRR8I/V6H7ApZFAV5VT5Cw7ccW8pHuiIp3oR+nE87TjYN3dKi7Ln+Z8jhpJUrVh6K + Xt5EIfV6eNtm48Y7X9sXR2yLFi0cv3Dhgh0WLJi/J0nt3VfMm3fM3Llzz3IrLqoFK4VUkakQq8HymcdN + N5UvVaT7Vmvl8h+BGWjEIz4U924cd08qkx1Q1ogntvvuv2/MhlvWT6BK24EV224kNgL80veTsE+5Y+Md + f2eisnK9/kYVXFZyqZot9t6TYlGqS3GDZPrMIDlz2S8pHf6SoRksk1zKZIHSb7jeZxvXDCxYsPBLGOdH + qMAOJyhY6b0HXB/k/GMktn8Vj7JKq+Iy8TSqMWSa5Mq9xvODlNSKFcw10MP436cYOZ453kOgc3tqn+XL + V7yJgGeAPA6Zf0naTW5rCXQmuFhFRNIodFgYbZoD50tAseJ1ZeXD4wULF34OvX2YQPpO8O+Bo5OkVnSt + R6rwcQSnbeF9V1Z+bwPPB7EF/+3MJelFBmVJQZDsq6RR2pLzUVWH7IUUoFw9mNzKFcRqqvDVWRESfdXv + jQQeA5UVfNI9crffiuUr3QY6nYrchP1uZLgXSWMn+m5158Y7W7ZZSWjjtV1tWFueN++K0keuSTRKqzQX + PgD9KYEWMtZH0lZZ6T83EQSDt1WsoMQjviszH1m4cPEg2VJojGPMNgTY10HrFPWMTo5jzJnLVxZbdMpK + +1hzQ/H8VH6dJwWvFPyK4FXYcymnMigaPENug6GUuWOvZ5yJrfSDG/Ep5/K5Z9ou5p4rQ3Tt28anw89R + 2MuByPyt0PNmxrwDub13OX7wAH4gbT6jS7LDBgOU0RpwOk+RjLNiRjrUc0pSQMlDSsI53Q3egISj+PTc + viaFJC9sIyUJeHE+/b+k//PI+Fjofw9y3w+bezO0v517hyH/k1jZ/zdxWSSnHSySWOHH+Br6NjYUO1ue + N0HejEfaj/pn1X4senwPfvFWktu+wH5LFi8+BNlZ8HzFXST5bcpcmovE5LVcRg3ZhH5zyOWRHUfBY7EQ + uvV7ccVc+k9RADiv+rp21bXu5PzUwooVm0WKCX8PfGdH4tVWG+9s9Z/XpJHQxqPA7RHublQP+yPoI+bM + mfNpKofitXcYlqG1GXM33JAbtkG+SBZCMmySom/riGce+Ehu+88Hv/OgqBFPbA9tenDMrbfdMo7qcWuq + lckktr0xxnch+COZz1+0/kcNFePEMXSIa+ELR7kOR9EQyqDow2WNLQe3tvwMpwrHcovGt8UKmZRKx0Ds + v+xqnWLBp5n/CILQQTjK/ox556prVh3Kub/t+EOfexgskmwNflZiOnMpY0HjdXvFa4LOaDAHh7L/1sIF + C0w2bj/6RuseXN+bRLc/DvEbyPpUH7q7nXodwUhd6bwp6KEzz+VBXRqQfJMv0QBYRXtfXlcUzx2/hByP + wMn3Z77dceodli+/ums9EgDGIoOtofN10LcviXcq8vkoAewvcIo0T2FLBd8euxoKJ81lLz/XXOtWcbFd + 3AqZjoDrBB1XHNfwiT07n7aNvX9xwfwFH4GnQ6DpTVzbhXvbIYsJJLaWbZT52GydjyzTR5hXX0h6TDor + fQQZGwT8TM8IG3otrjtuWekj4iO57X/llfPxkQXbz5+/cJBsWVGPZYUxcdXKVTug1zcsXbL0rdB+GHr5 + KPR/TZ60b/GG3ORdG0/nyqUsBApotWmDeUBx3ryfroWPeJxw8gk05Os95l6BfH1x54orrvjilfOv/Ai2 + eAi+6Gp4L/S6F0H0LdB58NXLl/v/0n7oG8iOVzbKzhVgkiE2YJDVXxs0JR2XUF4bCmr7WQhZGKVYAP3X + GtSRm/SvWjFw1fKrB0gsZ6PzE6H/MOh/KzTvzdi9+Hwzsj4ImR/Dyv4/r1xOTIF+V0XSXewIRFxQ7wVf + Jm+3BL3matE4cfXVywr9z5t7BLJ6F3P5DHcP/MuV+9s4fx8254tK5+jz2u41q4tn/yaha0q5x25TwZt6 + K/q06Cw7z3XvvRYZlTYSKzhpjaJGufuDBxTmFy9csPCzSxYvOZrEdiB0+TbvzvC5LYltPInttd2GtF1x + xbxxwLbz5s3dBQd7C4I+7PLLL//owsULBq7GQFekV0gVRBhv8TA3oLhXCoVMvooEomGzmhiYA5654BMv + AWEXlLQtMCrL1Ntuu3UsK8kJKGE7EtvrWbG9cfGSxQcuWLjgw/OumOdbb3/MEn/g6hUG6pXptV8fpmss + 0rzy6pXpAfXK5SsGlnPP+ybDxmcJK1diYOk5nA4G/6sKhV+z0ip1ZfpeCQ77rzjFRzDOqRjk2wkSb2J+ + HHrlATjFEZs2bfpfVGUDy6FFGTaCj8aTZCzuIjjHNeXrvMuXLR9YtGSRDvLVBfPnvxej3w/H2wPadmGu + 3QzSGN0h86+cb+D4V+6lFyosUtTPaujVgX3DLekwJYniFWqDlJX7apzceybGxYsX+n298+DnfSTS/Zjv + DTj99lddtayHxLZxDA4xEYedxPg9CcbvxA6OhNYzfRvVtxl1GN/YS8lJ+phf3QhJ7iF/P+FnJTpcjryV + eQFcRzcrKCoKPTXHCldxfRl2STD6P9j4GVfMu+IEEtthJNn9cNDdkdOOyG8rHHqQfc674opxAD4yr9VH + sHFfHV+1IvcDA46ybvqI8k73DBrwt2JV8QXYhQsWD4hHfOKdC34SHPMM9hGTLQXUOOS0NXTuhCz3QJZv + Q5bvRZYnguPzd99994/Ea5Lz1X759qWawsZXlbaMTPzUB5RTCUlOpa03zkvwXJ9IfuE1gn/CqXw59ruf + +pW2T2H01/B0BsH6I9iMifet2ifBfxcS26587sNYt7STH8BHKtSUkzJqBGtfYsAeQodNOgv69dMGjYmu + wn+jr/yZNItPrxV4CgjbQj/lNek33lGE/SOy/By6PhHaD1fG0L+nL02h410ZZ9FsgfcBCuY/wYbTW6fS + WiQDE712UCZgIRUB3JM/rqfkid0swLcun4P+5845jPneOn/BfHX6enC+Hvx7YV/7I8P3Yxsno+Ov3nff + fZeq36ugNfGZeCjiV8GXPGZ8hr7iszxO8ql8puMSxBexsRhbvFynfIg734OWT0Pb0dB5MInNRyC7Eqd2 + ILFNvOnmm1/71ZoNAxw7d+6crUlAk1Ho3hjluy6fPduK1Jc/BhaR4HwN/ipfhSdILsV4DRAEtmTIBk4r + 16Vc00hRDKuVKwfmMT7hAZ94mWMyq7etUeCoML7xzo1jWPqPo8rbCkHvAG27InhWBwsPoBr6DYznpFmz + Z5+xZOmS38cgZxDM0vedFqfX/AuQfr/Uq7EuXrJsYMky+gjpnl+EBLi/dOlVBd/Kwy8z8ukYv+R9xfx5 + Phf7NtX3+xYtXrQ/lalf6t0Tg94bunTyQx599NHvX3HFlW6FDSxlnPK8elnxqvpSqjjluSx9+tq683AP + GqR54fyFA8jR7YzTSF4HkMSmUL2b1CZjfDvTZw/wvt35b73l1m/Pn39F+hL6YvgoaIZ2cEqz5xhmOr6K + OV1la8Bex7EIvPDDXLNnznSF8x6cbF9w70LRsp3PZkvRd9VwuPGLFy/ZbsGChRQ489+EHRw8Z87cYwnk + AwuvhL4liwv5A/Iqjco5HZfXFyP/Zeor9KLs+FSGSxmvnaojP9Vt8X22xb5yPpOk/ZezZs36Avb9CQLF + 0fAzFV72QzZ7LF602ESxDbIZTwEwqNqcO3cePjJv6zlz55Y+Mudd4MFH5g2QHJPNS1/yB/VW+kWSa3mc + rvNpP/tfuWC+1frA7NmXH6HPiRd5THYe5yunbmlU/WOxoQkUHNtSEEwGj1uXb0Mvh+LHxxAkPwmPXyS5 + /A+C4NxF8J7koJxKuYQsi8+Cnhb7FxY3+xX2LhR94zzJFryLmePue+6eSdF13syZM78w+/LZp8DL0eiX + Vfn8/ZDxHtj3ZALfjhRNkynSdlu+YsWbl5Z+MPfKKwYWLFqQ8Gmb6Ttmyku5JRso50/zVukt6Szlugy6 + iz4B5dg4z3AU9Bdf5qdwm03A/m/KrrSPY7CPQ6H9bYsWLfS58Ovw4R2BnSiqdmX8vsj+PYz7jr6o/S4F + TyqcU2wkCeCziY8E+nbhV9KQYiT6N0YiryPQ27uIT/tQgL+eOXeEJuF16HYvZLg/snwvfY6fNXvWp5Ht + 19HvDxZh7xaF6jbpl3glbw3ZlHpKPrGs8A2K/eK80a+QhfeLzxgjXo7FDV8UTJdid39GPP88spkGTT7/ + Owj5udPxBu6h2+u2Xrtm7XgS22u/WrPNmXv52DlzLp8I7IBSd7388tn7zp49+wCUfMSsmTM/etlll336 + Zz/72VmXXHLJb1588cXnzJgxY/pFF10EXJg+Z8y4aLrXvW+/mfR33GzGiwec+5LcdkUhO5A8JyKYUcvo + t9566xiW/uOp/rYmoOyA8e6CAvbROJj30NmXX/7hmbNmfvRnl/3sVGj+PPR/+YILLjz7pz/96Td+8pOf + nPPv//7v3/zRj388/Uc/+tFg4Dr3p9NvOv2nX3DBBfL/zRkzLv76JZdc+hXk9Dlk9kn4PZ7AZBX9DudW + 8dDzepxiF6qhPTGc/TBanf5oaPo4/U9n3JcY/zVkeA50IdMZCTz2GnI9m/tfoN9nkenJyPJDGPtBzPFm + HIEV1JJJzLM9SWoHcO/Mtb2dXzqkR7qk71LoBOfXwf3NQocFxFzcP0c60N+XmOc0xn6MuY6CzqnMtx84 + 94DunVi5bbN48aKeVt4ktnEktq2hbRJ4doc2Vz4HM8+HZ86cNY15T4PXLyLPs6HpHOWrnJW3chd+XKeX + En78o6Sfb9L/m+rzwgsu+Bp45Pcs5PcZgu405jqGOd8HLwdQFCC7hbsTPCaT2LbFSSfg8LW2ScLBR+bi + I3PwkTn4yOWlj8w+Ato7+EiLfBs+Yn/tUB8TD3a5Lzh3vRz8xTz1PnLjmjVjSApj0fVEgtm22Ndk6N8d + nbgjciDF4/vBdyy4P4aNf1belcGFF174tdLGv6mMQp5Jpj9GdkB+TfgR11oB+f6kKd8LLrxAPSHfGWde + euklyPeyaQTeY+DjfdjLAQTpN0PX7vMXLNgJercj8G0DbI8fTKYIc7ttv0WZHyCD06H7S8jna8pKudXZ + QFPfhc67hWL8T5r0X3Bhbh+fxT4+puzQ8fuTfcyf/+aFCxfsTrFqwbgddPt8czuKv52Q/e6LFi56C7Z8 + MH0/zBht6zRwfPEyfLXOj+Up6f8y9D+z1P/s0P/sfUlcu5LcdnT3jGS6NbrdDt2+Djr2ZI63Msd76PtB + 5vgI9H4CfGdA/xeR0W/Cz9fhK8Uv+Sx4LmVUo9t28JPSfy5I/nPh2TOIj5cQJ7VXbPUk4vhR0OIq/J3E + mTeSqHdFlyb8rdfcuMYfERi12N5zu3zO7DEks/HANghuEvAGktK+MPIuhHgYTB2BII9BKScgzJNQ1DSS + 2bSLAD8997r37Wd/xzlePOIj00/C4LdBMOPnXD5nVDP6mrVrx2KA46n2tlq6dMn2rJoI9PP3QCFvwnje + yartEOh7P7R+GLqPwzhOwPE/ioGchIGcjGKntYWf/nQafabRdxpjpl100YyTwfFRcB1/2WUzPwzP74fP + gwnabyN4741x7oJT7AQ9OwKTMIKdceg9SQpvxWAPwqHfR/8PMe445HYiMhTftBkXI2PAY66dBP4TuH/s + rJnJEQ5Hju+mUnzTFfOuMKjthJFtxzw+wyLhLPYlh9c7/zzokB7pmgl90nnJxZd89OIZM06ecRFzXIT+ + +OR8GgY8jfsnSwfyOY4xH0Jv72OugyhI9oNWHWxn8G6/YP78iazaejJiEtvYRYsWT5g/f8G2rNJYmczd + nSTxZvg5gPkOZ94jKRCOhecTsKmTlK9yxsmSzH9ap48MvK/+GHOy+lSv6heejgL/B2fPmn0osjiAed+q + bKBjVwLHpIULF21DYptAYhtHlVprm9CJj8zBRy7HRy5PPkJSa+8j6i/3kUKXtT4inuRz4gV/MU97H8GG + xqBnaF0yEV2b3OBhwa7z51+5D/rZjwB4APgOk2d5VwbQETZ+sjIaSpa18NOQ70+R7wVJvvB13CWXXnIU + gfqD8ELhOPvdBOe3zps3d+8r51+5C6uSSSS2bUjGE2+48cYJ111//Varrlm1/dXLl79uCX6Ab771ytIP + 4P1DBPvjCPwnXnzJxScru7CBpH+glq4WsE976Ggfs2cfiq0fwMrXAm4ffGhXkppb59suX7F84rWrV09Y + tXLVVhSP21FIWlDsgR+8BR87kHHvxb6OBM+xJDb9+CRwJ/9tANeQ1QnwdwzyOgJeC/3PLmIkstuJ+LQt + 808E9wR0O9G5oWMn6HkDMpqC/b2dMQdhP+9ljiMpAo+Bj48k3f60iF/D0i2Q+Y++91FiQ8jnwxS6HyAW + HDJ3ztx3zaeYxvf3xF92Xn711TuwWtuagmX8hvUbfnWSmm325bPGzJ49axwwEdgWwU2aNWvmrihpb6qw + tyDE/WHu3QjyIILfwTA7lcDTAM8xxIO9bz/7M/YtCGNvcO1KcpsEbIvyJiKcccCoL1VXr752LAFgHMmN + ynbxtgYwjOP1GMceGMcU6HordL4Dmt998YyLD0KJB1904UWHoNBDUOxU4acViOsXXHjhVPpNxaDg/+JD + wPEe+D4Qnt9JkNoP/G+cO2/eHsy3M467A068Lc5stbctNO1AQHodBrs7999IhU3/2YybdQD0vAfDPyTJ + MwPwHwL+93D/AGS6Pw70FubYByN7A061E4a23eJFi7Yi2E0ArORdFe3g/AQ6+X0j8t9P+nC6A6UXvIeQ + zAr9lTok4U1lnkOkg74HQtM70Vnih2C5B8ltZ5LpDlfMm7c1c45ftHBBT4Z89dXLxyxcsHAcdLFqn7cd + OHcCNwli1j7ai3ZzyaWXvvviiy95D3QdonyVs9CQ/RCg/i4C1Cc8HQSvyvUdzCEf+6L/vZifJDB/MrRs + jx62JrFNIOGObZfUbCQdfORyfGQ2PjIbH5mNj8zCR2bhIwXtDR/BF5RnrY9c2vSRyxjH2L1nggdckyi4 + tgUmzmIeoKOPUByNIfCNBQyAVve+lDWZ5LYrgXEvZGuwTDpnvgOUBXQcjExbbLwBP60Brg+2/QsOufAi + ZDzjooNJagfBD/L9GfKduZ+rjjlzLqf4mbsrMt6JpLb9goULtvLFm5WrVo6j4BxnAOR462VXXbX9Yvxg + YekHJEPHv5Ngf8DP9ANsXrn1ZAN1PASkPuC54EL4vwjbmpHs49JLLk32oaxITg37oBCeTFKzKFa2E1as + XDFu9erV41auWDl+2dJlW1EIbYf9TGbVv1uZcN6Kj70DeR9w2c8ue8+l0J90ngE8Ffq/LNP/LGPkzF1J + buifGHk5MXLO5eNYsY1dtoxCa+kSbHPR1shyB1bAr5szd+5u0IrNzHzzz3522dvB+S7kdCByeo96lb9B + cukBKFha/Ac+3j2zkI8rxjcaT7CzXbA5f6zAt5wnslobv2bNml+tpBYN4Y4BxgETUc42wA4wNBkF7EIw + 3A3n2BMh7g3sA8NTBAw7fSbguvftx5jdHMcKYbJ4CMbbABNZbYxD+aOe1KKtWLF8DIlk7LKlS/2e3lYo + xIf/O6CgyRji66FpN4xwD+jeCx72xkD2wUCmYCDtgfv2Eegv7yXfl+0Fr7sT8NymMqFMohLdDgPYimpv + wjXXXuNPMpl4tuJaSrRXXDFvZ2jZFaPZHUPdC5kpv30IgJlcL56izLm+N/f3LOaYtSvFwesYuwNOtS2J + xspuPNXTOHgexyp1PBX8VgTv7aQDh92ZZGihsjs49sKZ9yaJFXqc0ZyLeaY4PzLZB93thXz2QF+sJGa/ + Hp52As92JLetSW4TmHPcwvnze9YlCW0sqxESxOUTkdU28LIDdL1Oe2Hu3Vix7Qlte0PPPsoXByvkfaFQ + o48MvF/qRd60VWW6B3PsdvmcOb708TqC1o4LFi7cbhHJgOQwgQA7DgcdQ/ExJC/Qi4/Mwkdm4SOzCh+Z + ObPwEWxe2ydwZT6ifQQoX2yF+/YjuCUfIbglHwHAB17wA13JlUo52TfBZZxFjQUNdrCdq6QiCM7ZBd3t + RnG6J3O22HjIcyiZtsBFFfleqnx/tge2uxvF2S7M9zrm3ZH5tyMpbL14yeIJBOZxyHrM2ptuGrPhllvG + sGIbu2LlyvFLl5EcyoKTMS1+QGJryFAbSPQmqKGpAfrt0EBCa9CPHzTsg/l3wVfc9tsRmraDtq1JLP4i + 07irrlo2ds3aNWPWrl07hsQ2lpUKRR3xZP6CbSnwdsQnXnf57Mst4HfHb/bEf8S9D3ac9J4A35Knpv6J + kTPV/2WT4XkHYBuAombmOBYaFixjrr322jEUAWMpzpXhRFe+8664Ynto3QlZ7YztvAFcu4N3TwrsvWdc + lHS7j7qtk1HouyNk+iWpNeVz+eW74Pck8iv9vvO2S5cs2cq3oolpY6+95totFtOH1XCAMcA4mBkPTAS2 + xnC3RXjbAzsgwB2BSQTbSTDeBM+57n372R/lbluMv2wiCXI8MA54TQSA448hiI01+M+fv2ACwW0rgpzb + rtsRUKQ18SYvKHXSRQkuqoG4NyP1w5jgX74v3RE+DU7bU3FvR8WFAc6jUp2PYy8et3LlirHXsoLUCNxC + ctuLam8rHMltp+2gY3vGimNHVixJloVMG3KdhEyLOS5jjpmztiNRua07EaeagMGNw9HGriA4ryLYEajH + EljG4aQTpIMquskrOMSV9JjpECeMeSZRyEySFuayKNkew96W+bYmmbriHs+8Y5l32LqcOXM2dkYAv2wm + djYz2RmFQbIzaGjoIvSR4KKAi9pA2Q9wXMgL2rdHH9uh820obLYyQJDMXDWMJcj2zAN0j4HuFtqBpo9c + 2t5HSGzKeMdLL70k+QjJreEjgD43jmDVM00bNmwYQ8U8huJpLEXUeJLJRPRvYbMNQTDsq9A7eqaYKeQ1 + hEwJck0ofYBituAFPokNyHfm9iS17eZdMXcb7H0r5p1gYQUdY6FnEC/XXX/dmOX4wxJWI6yGJriim6sf + oCN8Z3uC+44EffygsE/na9hAsoOcRs/rgQQ2CNK90mcL+8C+Z802UST7IKFttWTJ4okUiOOvwVdvvPGG + QfSvWL5izJLFS8a688BqzQJvqzmXz9nm8lmzt8Mvt9dniCc7ktgKnwoo/Vi5aSfovtD/TPQ/E/3PRP/E + XmNwOVWjaafKkxXuOIqyCcQNVnVzttYv4aERm5O8koyCV2RUC+3vXcy9S8BDUiv8B//H57cjxmxDUtuK + gpkCarFF9Fhk1LOtvmYNIY0pYayAE44DxsPoeIQnTMBBJ2DcGVySAKWNL+DS8YwdFziAMQTLXwkhuB1G + ZTsGIx5LcnPlgDHNMqgkuuUHZyrB4/aAIRV8Ixd4TDhwzHGzZs8aRzIZO3fenDE4bgvfS5cuG0MSGkO1 + 51t241gJsQKYPZ7AMx6HloaGPBtyBRJ+wCJhFoF1NokBgxs7Z/blY+bWPI+5cv4VY+bOmzsGpx0rPdKl + 8+BMiU9xSj9GDDCHwDUcMkHMV8I4YKwwEz0K5TTDbjg/NnbZmEsvwcYuuVQYpxwTXCyU8g2YMaMA9NIJ + QlbKc/bsWePhf9yV868cRwU+9urlV49ddc3mO2PQDmDbQrL1wvZLH2n1jwL0m3S/9BN9i3ENH0E3I+Ij + 165ePWaFyYNijmQzbk6y88LG0GHSNcktA2RXAwTAVlDG8CCv2hKBdbzbZhRPJilXFq4wuuJh8dIlYxYs + Xjhm/sL5Y+fMgz7wYKfjL5ulHyRZNmWXbKCcX4CWVvpbgeTVFkhq0j+BAmI8iTTZBwWAzyt9dNH16gP/ + HXPlvCvGzJs7Tx9M/ohfjp/5M3zskkuJl5c2/SoAuyjtI8ULoND/ZfgWuhdK9G0bxdkYVm1j0OlYdErs + wq+Zk/kS3sJXSkjy8rMGok+SZSlXQL8z3hvLkn6JT+7OLKZwXrZ0KSvWFSNio/3Wb/3Wb/3Wb/3Wb/3W + b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3W + b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3W + b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb1uy/Yf/8P8D4rKD + rca4/zIAAAAASUVORK5CYII= + + + + + NoControl + + + 413, 0 + + + 190, 50 + + + Zoom + + + + 14 + + + logoPictureBox + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 10 + + + 8, 27 + + + 241, 23 + + + 2 + + + pckFileLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 4 + + + Top, Right + + + True + + + 1369, 252 + + + 30, 19 + + + 19 + + + aaa + + + labelImageSize + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 5 + + + Top, Right + + + True + + + 1347, 53 + + + 0, 0 + + + 17 + + + fileEntryCountLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 6 + + + Bottom, Right + + + True + + + 204, 144 + + + 0, 0 + + + 15 + + + metroLabel2 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 2 + + + Bottom, Right + + + + + + NoControl + + + 128, 2 + + + 15, 15 + + + 1 + + + False + + + False + + + 215, 114 + + + 146, 20 + + + 21 + + + entryTypeTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 3 + + + Bottom, Right + + + + + + NoControl + + + 128, 2 + + + 15, 15 + + + 1 + + + False + + + False + + + 215, 146 + + + 146, 20 + + + 16 + + + entryDataTextBox + + + MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 4 + + + Bottom, Right + + + 215, 172 + + + 146, 33 + + + 20 + + + buttonEdit + + + False + + + buttonEdit + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 5 + + + Bottom, Right + + + True + + + 266, 37 + + + 0, 0 + + + 13 + + + metroLabel1 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + MetaTab + + + 6 + + + 301, 19 + + + 160, 22 + + + Add Entry + + + 160, 22 + + + Add BOX Entry + + + 160, 22 + + + Add ANIM Entry + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 181, 22 + + + Add Entry + + + 181, 22 + + + Add Multiple Entries + + + 181, 22 + + + Delete Entry + + + 181, 22 + + + Edit All Entries + + + 182, 92 + + + contextMenuMetaTree + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Left + + + 5, 5 + + + 204, 229 + + + 0 + + + treeMeta + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MetaTab + + + 7 + + + 4, 38 + + + 5, 5, 5, 5 + + + 724, 239 + + + 0 + + + Properties + + + MetaTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + PropertiesTabControl + + + 0 + + + Bottom + + + 279, 270 + + + 732, 281 + + + 11 + + + PropertiesTabControl + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 7 + + + True + + + True + + + 433, 71 + + + 0, 0 + + + 3 + + + label11 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 8 + + + 22, 20 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABVSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jywDRIGxA8JQPlQ7PQyAaUTDUO30MACG + YZqhfKh24gGGzYMAMDAAAPvHncAZVkkSAAAAAElFTkSuQmCC + + + + 172, 22 + + + Folder + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf + T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy + /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 + sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ + gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr + BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK + Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P + aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV + A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx + WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp + e+98+xbVEAAAAABJRU5ErkJggg== + + + + 172, 22 + + + Skin + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAI/SURBVDhPjZHt + b9JQFMbvv6IRCiYmU+cGpQXH5oACMkZvgQILG2Su7e2mE3l1cTMricaXEQtscVN0UYIaB8MZmW/ZFxP/ + KrzNpCHxi0+eL/ec53fuSQ7IHLqyXW+uwwj7lLBvQweu9N6Y/M65/h3iOmpNLL2hxaYj1bAEnxhXPkyB + TNe9/H76YS96rzOz0Z3lSQI1banX1uTLMfVkYetnMt/2LTRGMq1rwlv7SssJHnyLcbRp77csvLLdaF1l + HabVg+mElVg9cq//gOpJ+tmvVNRmiKsXUi8sPGUGPEWIshihiShlvN1meNoQoQ1R2jDfuBimCfHjJOsg + SrNXWIcRJwuQBFXJneXoOvL0NiGkzDtLrgJnKUIySp6L0MYYeVYWhUKYrAq+MG3WgGJolCfP1BGzI0zc + gfYcpNrlNHZ/SE9Ff4Ejn4vOjjIHDu7HI7RpjRsvsiOPN+7iRmVxqpkLakEANPf7ypyjnJzEQzEDegon + eS/t3grs3gw+Ki5iIAfJCgoMA7i4hWZU6TpmwCdlHr+7SvpoM1YR/VpO1wDQhRlQkzzZ0OVsmKwhby5k + 1cqnuX+tA1WZ4e3mUtiK/X/AcgBv9bUcx9YAXYOcrlPAm+fIIhyvIh/e6lhJYHiNHdX6AwAHPpcTPSWm + AVnWCh2mbeQpQEtN9tclpip78nBot37/i5KoIUY7rhIDOdaiIl+es5U4MkIZ8S15O4E/0YCB8HNbcuOh + mAGqxOQ5S4Q6f1yOF6CVp0w6gxfQ/ZdBnj/Cc21Sm8M0egAAAABJRU5ErkJggg== + + + + 172, 22 + + + Animated Texture + + + 172, 22 + + + Audio.pck + + + 172, 22 + + + Colours.col + + + 172, 22 + + + Skins.pck + + + 172, 22 + + + Behaviours.bin + + + 172, 22 + + + EntityMaterials.bin + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ + /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF + TkSuQmCC + + + + 157, 22 + + + Create + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf + T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy + /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 + sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ + gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr + BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK + Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P + aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV + A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx + WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp + e+98+xbVEAAAAABJRU5ErkJggg== + + + + 228, 22 + + + Import Skin + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAEnSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADkCS05Xjh2FhFEIydtIT+22uJAsX4wBimFqod04Bt + nTn/9/YV/T82rQGM93YXAfkl/1eVRYPl8RqwuTnn/5aW3P8r69L+r67P+7+mIf//rIKo/7s7i/7PyfT9 + PzvTC78BW6AGrKpN+7+2IReM5xTF/N/VWQA0wAdogA8BA4Ca//7799/VauH/TdUZ/7dVp//fA7Td3XLV + //+iwNgBYXwGbCiP+7+5Oun/9qai/5n2+v+zHAzAeG9HDnEGTIl3/D8tzuG/owLP/w5f2/9dPrYIjWgY + qh3VgAJnrf+5Lhr/HRV5/jvLcoExNs0gDNWOagBeDNMM5UO1Ew8wbB4EgIEBABiEccKRdcoAAAAAAElF + TkSuQmCC + + + + 228, 22 + + + Import Extracted Skins Folder + + + 228, 22 + + + Add Texture + + + 228, 22 + + + Add File + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB + DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW + mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF + TkSuQmCC + + + + 157, 22 + + + Import + + + 186, 22 + + + Export as 3DS Texture + + + 157, 22 + + + Export + + + 222, 22 + + + Skin (.PNG) + + + 222, 22 + + + Cape (.PNG) + + + 222, 22 + + + Texture (.PNG) + + + 222, 22 + + + Languages File (.LOC) + + + 222, 22 + + + Game Rules File (.GRF) + + + 222, 22 + + + Music Cues File (audio.PCK) + + + 222, 22 + + + Colour Table File (.COL) + + + 222, 22 + + + Game Rules Header (.GRH) + + + 222, 22 + + + Skins PCK (.PCK) + + + 222, 22 + + + Models File (.BIN) + + + 222, 22 + + + Behaviours File (.BIN) + + + 222, 22 + + + Entity Materials File (.BIN) + + + 157, 22 + + + Set File Type + + + 154, 6 + + + 223, 22 + + + Generate MipMap Texture + + + 223, 22 + + + View File Info + + + 223, 22 + + + Correct Skin Decimals + + + 100, 22 + + + Big + + + 100, 22 + + + Little + + + 223, 22 + + + Set Endianness + + + 80, 22 + + + 1 + + + 80, 22 + + + 2 + + + 80, 22 + + + 3 + + + 223, 22 + + + Set Model Container version + + + 157, 22 + + + Misc. Functions + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAACYSURBVDhPpZBZ + CsQwDEOd5QK5/2E9qCBGXtopzMcDxxKyY3P3izmnm9kt0OlVvsVVVgOAtvduQ4KJdYbaGKOEFFOHamut + ENKaMlk75zi2QX1rUqDpkbEF/cGktb47ygb5ODA8hVArgsK1cx+EAE7LaB8+hb3QzDx942eAXrqjBOgR + MRkBfHeUADbe8ncANw4NhLwF33R3+wA6sV5/E8GOLwAAAABJRU5ErkJggg== + + + + 157, 22 + + + Extract + + + 154, 6 + + + 157, 22 + + + Clone + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAACVJREFUOE9jwAL+E8AkAbI0IYNRA0YNAIFRA8g0AKYJF0YCDAwAzhor1TRE/JoA + AAAASUVORK5CYII= + + + + 157, 22 + + + Rename + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAC/SURBVDhPlVHB + DQMhDEOIfwfoOuzFoPxhAd5c6/SMAgq0tRQFmdgXfA5IKUkBMcbHPxyJCxVCkK7rm+EwaK1dQO9dClzO + WfpOTM7hy1oMGNvY4pucxNY2p6cAWzFw2oZuMmiJweGeHM634UdLg50YwD05vQ2fYoaoDTEMrJyIfw3R + 4qYQWUZgg6OwlDJyMH8LcwF2T8FZ5kYQb4Lde/9Et8S6Dy1z0LUGi7VpWGvl3Lw2V98ZrtwIUYktwwPn + 3AtE5NqX8pp0ZQAAAABJRU5ErkJggg== + + + + 157, 22 + + + Replace + + + 157, 22 + + + Delete + + + 158, 236 + + + contextMenuPCKEntries + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Left + + + 0 + + + 204, 20 + + + 32, 32 + + + 5, 50 + + + 0 + + + 274, 501 + + + 20 + + + treeViewMain + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 9 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x + DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 + jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + + + + 181, 22 + + + Add Multiple Entries + + + Top, Right + + + True + + + 831, 0 + + + 173, 15 + + + 22 + + + Save as Switch/Vita/PS4 PCK + + + LittleEndianCheckBox + + + MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 3 + + + Top, Bottom, Left, Right + + + None + + + NoControl + + + 285, 50 + + + 218, 218 + + + Zoom + + + 18 + + + previewPictureBox + + + PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null + + + $this + + + 2 + + + True + + + None + + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + addEntryToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addBOXEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addANIMEntryToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addMultipleEntriesToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + deleteEntryToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + editAllEntriesToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + createToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + folderToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + skinToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + createAnimatedTextureToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + audiopckToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + colourscolToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + CreateSkinsPCKToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + behavioursbinToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + entityMaterialsbinToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + importSkinsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + importSkinToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + importExtractedSkinsFolderToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addTextureToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + exportToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + as3DSTextureFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + setFileTypeToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + skinToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + capeToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + textureToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + languagesFileLOCToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gameRulesFileGRFToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + audioPCKFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + coloursCOLFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + gameRulesHeaderGRHToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + skinsPCKToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + modelsFileBINToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + behavioursFileBINToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + entityMaterialsFileBINToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + miscFunctionsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + generateMipMapTextureToolStripMenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + viewFileInfoToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + correctSkinDecimalsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + setSubPCKEndiannessToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bigEndianXbox360PS3WiiUToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + littleEndianPS4PSVitaSwitchToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + setModelContainerFormatToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + version1ToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + version2ToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + version3114ToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + extractToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator6 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + cloneFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + renameFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + replaceToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + deleteFileToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + imageList + + + System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + addMultipleEntriesToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + PckEditor + + + PckStudio.Internal.EditorControl`1[[PckStudio.Internal.PackInfo, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null]], PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/PCK-Studio/Extensions/AnimationExtensions.cs b/PCK-Studio/Extensions/AnimationExtensions.cs deleted file mode 100644 index 81af938a..00000000 --- a/PCK-Studio/Extensions/AnimationExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Drawing; -using AnimatedGif; -using PckStudio.Internal; - -namespace PckStudio.Extensions -{ - internal static class AnimationExtensions - { - internal static Image CreateAnimationImage(this Animation animation) - { - if (animation.FrameCount == 0) - { - return null; - } - var ms = new System.IO.MemoryStream(); - var generateor = new AnimatedGifCreator(ms, GameConstants.GameTickInMilliseconds, 0); - foreach (Animation.Frame frame in animation.GetInterpolatedFrames()) - { - generateor.AddFrame(frame.Texture, frame.Ticks * GameConstants.GameTickInMilliseconds, GifQuality.Bit8); - } - ms.Position = 0; - return Image.FromStream(ms); - } - } -} diff --git a/PCK-Studio/Extensions/ImageLayoutDirection.cs b/PCK-Studio/Extensions/ImageLayoutDirection.cs deleted file mode 100644 index 7cfc23eb..00000000 --- a/PCK-Studio/Extensions/ImageLayoutDirection.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace PckStudio.Extensions -{ - internal enum ImageLayoutDirection - { - Horizontal, - Vertical - } -} diff --git a/PCK-Studio/Extensions/PckAssetExtensions.cs b/PCK-Studio/Extensions/PckAssetExtensions.cs deleted file mode 100644 index 08c3f96e..00000000 --- a/PCK-Studio/Extensions/PckAssetExtensions.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; -using System.Drawing; -using System.Collections.Generic; - -using OMI.Formats.Pck; -using OMI.Workers; - -using PckStudio.Interfaces; -using PckStudio.Internal.Deserializer; -using PckStudio.Internal.Serializer; - -namespace PckStudio.Extensions -{ - internal static class PckAssetExtensions - { - private const string MipMap = "MipMapLevel"; - - internal static PckAsset CreateNewAssetIf(this PckFile pck, bool condition, string filename, PckAssetType filetype, IDataFormatWriter writer) - { - if (condition) - { - return pck.CreateNewAsset(filename, filetype, writer); - } - return default; - } - - internal static PckAsset CreateNewAsset(this PckFile pck, string filename, PckAssetType filetype, IDataFormatWriter writer) - { - PckAsset asset = pck.CreateNewAsset(filename, filetype); - asset.SetData(writer); - return asset; - } - - internal static Image GetTexture(this PckAsset asset) - { - if (asset.Type != PckAssetType.SkinFile && - asset.Type != PckAssetType.CapeFile && - asset.Type != PckAssetType.TextureFile) - { - throw new Exception("Asset is not suitable to contain image data."); - } - return asset.GetDeserializedData(ImageDeserializer.DefaultDeserializer); - } - - internal static T GetDeserializedData(this PckAsset asset, IPckAssetDeserializer deserializer) - { - return deserializer.Deserialize(asset); - } - - internal static T GetData(this PckAsset asset, IDataFormatReader formatReader) where T : class - { - using var ms = new MemoryStream(asset.Data); - return formatReader.FromStream(ms); - } - - internal static void SetSerializedData(this PckAsset asset, T obj, IPckAssetSerializer serializer) - { - serializer.Serialize(obj, ref asset); - } - - internal static void SetData(this PckAsset asset, IDataFormatWriter formatWriter) - { - using (var stream = new MemoryStream()) - { - formatWriter.WriteToStream(stream); - asset.SetData(stream.ToArray()); - } - } - - internal static void SetTexture(this PckAsset asset, Image image) - { - if (asset.Type != PckAssetType.SkinFile && - asset.Type != PckAssetType.CapeFile && - asset.Type != PckAssetType.TextureFile) - { - throw new Exception("Asset is not suitable to contain image data."); - } - asset.SetSerializedData(image, ImageSerializer.DefaultSerializer); - } - - internal static bool IsMipmappedFile(this PckAsset asset) - { - // We only want to test the file name itself. ex: "terrainMipMapLevel2" - string name = Path.GetFileNameWithoutExtension(asset.Filename); - - // check if last character is a digit (0-9). If not return false - if (!char.IsDigit(name[name.Length - 1])) - return false; - - // If string does not end with MipMapLevel, then it's not MipMapped - if (!name.Remove(name.Length - 1, 1).EndsWith(MipMap)) - return false; - return true; - } - - internal static string GetNormalPath(this PckAsset asset) - { - if (!asset.IsMipmappedFile()) - return asset.Filename; - string ext = Path.GetExtension(asset.Filename); - return asset.Filename.Remove(asset.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; - } - - internal static void DeserializeProperties(this PckAsset asset, IEnumerable serializedData) - { - IEnumerable> lines = serializedData - .Select(line => line.Split([' '], 2)) - .Where (keyValue => keyValue.Length == 2) - .Select(keyValue => new KeyValuePair(keyValue[0].Replace(":", ""), keyValue[1])); - foreach (KeyValuePair kv in lines) - { - asset.AddProperty(kv); - } - } - - internal static IEnumerable SerializeProperties(this PckAsset asset, string seperater = ":") - { - IReadOnlyList> properties = asset.GetProperties(); - return properties.Select(property => property.Key + seperater + property.Value); - } - } -} diff --git a/PCK-Studio/External/API/Miles/Binka.cs b/PCK-Studio/External/API/Miles/Binka.cs index 16e6ee96..47000ef8 100644 --- a/PCK-Studio/External/API/Miles/Binka.cs +++ b/PCK-Studio/External/API/Miles/Binka.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using PckStudio.Internal; using PckStudio.Internal.App; using SharpMSS; diff --git a/PCK-Studio/FileFormats/CSMBFile.cs b/PCK-Studio/FileFormats/CSMBFile.cs deleted file mode 100644 index b07d8f80..00000000 --- a/PCK-Studio/FileFormats/CSMBFile.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Drawing; -using System.IO; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PckStudio.FileFormats -{ - #region File Structure - /* - Version - 4 bytes[int32] - NumberOfParts - 4 bytes[int32] - { - Part name length - 2 bytes[int16] - part name - x bytes - part parent - 4 bytes[int32] (HEAD=1, BODY=2, LEG0=3, LEG1=4, ARM0=5, ARM1=6) - Position-X - 4 bytes[float] - Position-Y - 4 bytes[float] - Position-Z - 4 bytes[float] - Size-X - 4 bytes[float] - Size-Y - 4 bytes[float] - Size-Z - 4 bytes[float] - UV-Y - 4 bytes[int32] - UV-X - 4 bytes[int32] - mirror texture - 1 byte[bool] - Hide with armour - 1 byte[bool] - inflation/scale value - 4 bytes[float] - } - NumberOfOffsets - 4 bytes[int32] - { - offset part - 4 bytes[int32] - vertical offset - 4 bytes[float] - } - */ - #endregion - class CSMBFile - { - public List Parts = new List(); - public List Offsets = new List(); - } - - public class CSMBPart - { - public string Name = "Partname"; - public CSMBParentPart Parent = 0; - public float posX, posY, posZ = 0.0f; - public float sizeX, sizeY, sizeZ = 0.0f; - public int uvX, uvY = 0; - public bool HideWArmour, MirrorTexture = false; - public float Inflation = 0.0f; - } - public class CSMBOffset - { - public CSMBOffsetPart offsetPart = 0; - public float VerticalOffset = 0.0f; - } - - public enum CSMBOffsetPart - { - HEAD = 0, - BODY = 1, - ARM0 = 2, - ARM1 = 3, - LEG0 = 4, - LEG1 = 5, - HEADWEAR = 6, - JACKET = 7, - SLEEVE0 = 8, - SLEEVE1 = 9, - PANTS0 = 10, - PANTS1 = 11, - WAIST = 12, - LEGGING0 = 13, - LEGGING1 = 14, - SOCK0 = 15, - SOCK1 = 16, - BOOT0 = 17, - BOOT1 = 18, - ARMARMOR1 = 19, - ARMARMOR0 = 20, - BODYARMOR = 21, - BELT = 22, - TOOL0 = 23, - TOOL1 = 24, - HELMET = 25, - SHOULDER0 = 26, - SHOULDER1 = 27, - CHEST = 28 - } - - public enum CSMBParentPart - { - HEAD = 0, - BODY = 1, - ARM0 = 2, - ARM1 = 3, - LEG0 = 4, - LEG1 = 5, - } -} diff --git a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.Designer.cs b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.Designer.cs index bd3df23c..52426b93 100644 --- a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.Designer.cs @@ -33,7 +33,6 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddSkinPrompt)); System.Windows.Forms.Label label2; System.Windows.Forms.Label label1; - this.textTheme = new System.Windows.Forms.TextBox(); this.contextMenuSkin = new System.Windows.Forms.ContextMenuStrip(this.components); this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuCape = new System.Windows.Forms.ContextMenuStrip(this.components); @@ -81,11 +80,6 @@ label1.ForeColor = System.Drawing.Color.White; label1.Name = "label1"; // - // textTheme - // - resources.ApplyResources(this.textTheme, "textTheme"); - this.textTheme.Name = "textTheme"; - // // contextMenuSkin // this.contextMenuSkin.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -289,6 +283,7 @@ // capePictureBox // resources.ApplyResources(this.capePictureBox, "capePictureBox"); + this.capePictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; this.capePictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.capePictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; this.capePictureBox.Name = "capePictureBox"; @@ -298,6 +293,7 @@ // skinPictureBox // resources.ApplyResources(this.skinPictureBox, "skinPictureBox"); + this.skinPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; this.skinPictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.skinPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; this.skinPictureBox.Name = "skinPictureBox"; @@ -343,7 +339,6 @@ } #endregion - private System.Windows.Forms.TextBox textTheme; private System.Windows.Forms.ContextMenuStrip contextMenuSkin; private System.Windows.Forms.ToolStripMenuItem replaceToolStripMenuItem; private System.Windows.Forms.ContextMenuStrip contextMenuCape; diff --git a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.cs b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.cs index 0fa628c5..a2f83a5c 100644 --- a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.cs +++ b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.cs @@ -8,127 +8,90 @@ using OMI.Formats.Languages; using OMI.Formats.Pck; using PckStudio.Internal; using PckStudio.Forms.Editor; -using PckStudio.Internal.IO._3DST; +using PckStudio.Core.IO._3DST; using PckStudio.Properties; using PckStudio.Forms; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; +using System.Linq; +using System.Diagnostics; +using PckStudio.Core.Skin; +using PckStudio.Interfaces; +using PckStudio.Core; namespace PckStudio.Forms.Additional_Popups { public partial class AddSkinPrompt : MetroFramework.Forms.MetroForm { - public PckAsset SkinAsset => _skin; - public PckAsset CapeAsset => _cape; - public bool HasCape => _cape is not null; + public Skin NewSkin => newSkin; - private LOCFile currentLoc; - private PckAsset _skin = new PckAsset("dlcskinXYXYXYXY", PckAssetType.SkinFile); - private PckAsset _cape; - private SkinANIM _anim = SkinANIM.Empty; + private Skin newSkin; private Random rng = new Random(); - private eSkinType skinType; - - private enum eSkinType - { - Invalid = -1, - _64x64, - _64x32, - _64x64HD, - _64x32HD, - Custom, - } - - public AddSkinPrompt(LOCFile loc) + public AddSkinPrompt() { InitializeComponent(); - currentLoc = loc; + newSkin = new Skin("", new SkinANIM(SkinAnimMask.RESOLUTION_64x64), Resources.classic_template, Enumerable.Empty(), Enumerable.Empty()); } - private void CheckImage(Image img) + private void SetNewTexture(Image img) { - switch (img.Height) + Debug.Assert(img is not null, "Image is null."); + + if (img.Width != img.Height && img.Height != img.Width / 2) { - case 64: - _anim = _anim.SetFlag(SkinAnimFlag.RESOLUTION_64x64, true); - MessageBox.Show(this, "64x64 Skin Detected"); - skinType = eSkinType._64x64; - break; - case 32: - _anim = _anim.SetFlag(SkinAnimFlag.RESOLUTION_64x64 | SkinAnimFlag.SLIM_MODEL, false); - MessageBox.Show(this, "64x32 Skin Detected"); - skinType = eSkinType._64x32; - break; - default: - if (img.Width == img.Height) - { - _anim = _anim.SetFlag(SkinAnimFlag.RESOLUTION_64x64, true); - MessageBox.Show(this, "64x64 HD Skin Detected"); - skinType = eSkinType._64x64HD; - break; - } - - if (img.Height == img.Width / 2) - { - _anim = _anim.SetFlag(SkinAnimFlag.RESOLUTION_64x64 | SkinAnimFlag.SLIM_MODEL, false); - MessageBox.Show(this, "64x32 HD Skin Detected"); - skinType = eSkinType._64x32HD; - break; - } - - MessageBox.Show(this, "Not a Valid Skin File"); - skinType = eSkinType.Invalid; - return; + MessageBox.Show("The selected image does not suit a skin texture.", "Invalid image dimensions.", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + newSkin.Anim.SetFlag(SkinAnimFlag.RESOLUTION_64x64, img.Width == img.Height); - skinPictureBox.Image = img; + skinPictureBox.Image = newSkin.Texture = img; + labelSelectTexture.Visible = false; capePictureBox.Visible = true; buttonCape.Visible = true; capeLabel.Visible = true; buttonDone.Enabled = true; buttonAnimGen.Enabled = true; - labelSelectTexture.Visible = false; } private void DrawModel() { - bool isSlim = _anim.GetFlag(SkinAnimFlag.SLIM_MODEL); + bool isSlim = newSkin.Anim.GetFlag(SkinAnimFlag.SLIM_MODEL); Pen outlineColor = Pens.LightGray; Brush fillColor = Brushes.Gray; Image previewTexture = new Bitmap(displayBox.Width, displayBox.Height); using (Graphics g = Graphics.FromImage(previewTexture)) { - if(!_anim.GetFlag(SkinAnimFlag.HEAD_DISABLED)) + if(!newSkin.Anim.GetFlag(SkinAnimFlag.HEAD_DISABLED)) { //Head g.DrawRectangle(outlineColor, 70, 15, 40, 40); g.FillRectangle(fillColor, 71, 16, 39, 39); } - if (!_anim.GetFlag(SkinAnimFlag.BODY_DISABLED)) + if (!newSkin.Anim.GetFlag(SkinAnimFlag.BODY_DISABLED)) { //Body g.DrawRectangle(outlineColor, 70, 55, 40, 60); g.FillRectangle(fillColor, 71, 56, 39, 59); } - if (!_anim.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED)) + if (!newSkin.Anim.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED)) { //Arm0 g.DrawRectangle(outlineColor, isSlim ? 55 : 50, 55, isSlim ? 15 : 20, 60); g.FillRectangle(fillColor , isSlim ? 56 : 51, 56, isSlim ? 14 : 19, 59); } - if (!_anim.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED)) + if (!newSkin.Anim.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED)) { //Arm1 g.DrawRectangle(outlineColor, 110, 55, isSlim ? 15 : 20, 60); g.FillRectangle(fillColor, 111, 56, isSlim ? 14 : 19, 59); } - if (!_anim.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED)) + if (!newSkin.Anim.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED)) { //Leg0 g.DrawRectangle(outlineColor, 70, 115, 20, 60); g.FillRectangle(fillColor, 71, 116, 19, 59); } - if (!_anim.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED)) + if (!newSkin.Anim.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED)) { //Leg1 g.DrawRectangle(outlineColor, 90, 115, 20, 60); @@ -158,7 +121,7 @@ namespace PckStudio.Forms.Additional_Popups OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { - CheckImage(Image.FromFile(ofd.FileName)); + SetNewTexture(Image.FromFile(ofd.FileName).ReleaseFromFile()); } } @@ -188,12 +151,14 @@ namespace PckStudio.Forms.Additional_Popups using (FileStream fs = File.OpenRead(ofd.FileName)) { var reader = new _3DSTextureReader(); - CheckImage(reader.FromStream(fs)); + SetNewTexture(reader.FromStream(fs)); } textSkinName.Text = Path.GetFileNameWithoutExtension(ofd.FileName); return; } - CheckImage(Image.FromFile(ofd.FileName)); + + Image img = Image.FromFile(ofd.FileName).ReleaseFromFile(); + SetNewTexture(img); } } } @@ -219,15 +184,13 @@ namespace PckStudio.Forms.Additional_Popups ofd.Title = "Select a PNG File"; if (ofd.ShowDialog() == DialogResult.OK) { - var img = Image.FromFile(ofd.FileName); + Image img = Image.FromFile(ofd.FileName).ReleaseFromFile(); if (img.RawFormat != ImageFormat.Png && img.Width != img.Height * 2) { MessageBox.Show(this, "Not a Valid Cape File"); return; } - capePictureBox.Image = Image.FromFile(ofd.FileName); - _cape ??= new PckAsset("dlccapeXYXYXYXY", PckAssetType.CapeFile); - _cape.SetData(File.ReadAllBytes(ofd.FileName)); + newSkin.CapeTexture = capePictureBox.Image = img; contextMenuCape.Items[0].Text = "Replace"; capeLabel.Visible = false; contextMenuCape.Visible = true; @@ -237,43 +200,17 @@ namespace PckStudio.Forms.Additional_Popups private void CreateButton_Click(object sender, EventArgs e) { - if (!int.TryParse(textSkinID.Text, out int skinId)) + if (radioButtonManual.Checked) { - MessageBox.Show(this, "The Skin ID Must be a Unique 8 Digit Number Thats Not Already in Use", "Invalid Skin ID", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - string skinIdStr = skinId.ToString("d08"); - _skin.Filename = $"dlcskin{skinIdStr}.png"; - _skin.AddProperty("DISPLAYNAME", textSkinName.Text); - - if (currentLoc is not null) - { - string skinDisplayNameLocKey = $"IDS_dlcskin{skinIdStr}_DISPLAYNAME"; - _skin.AddProperty("DISPLAYNAMEID", skinDisplayNameLocKey); - currentLoc.AddLocKey(skinDisplayNameLocKey, textSkinName.Text); - } - - if (!string.IsNullOrEmpty(textThemeName.Text)) - { - _skin.AddProperty("THEMENAME", textThemeName.Text); - if (currentLoc is not null) + if (!int.TryParse(textSkinID.Text, out int skinId)) { - _skin.AddProperty("THEMENAMEID", $"IDS_dlcskin{skinIdStr}_THEMENAME"); - currentLoc.AddLocKey($"IDS_dlcskin{skinIdStr}_THEMENAME", textThemeName.Text); + MessageBox.Show("The Skin Id must be a unique 8 digit number that is not already in use", "Invalid Skin Id", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; } + newSkin.Identifier = new SkinIdentifier(skinId); } - _skin.AddProperty("ANIM", _anim); - _skin.AddProperty("GAME_FLAGS", "0x18"); - _skin.AddProperty("FREE", "1"); - - if (HasCape) - { - _cape.Filename = $"dlccape{skinIdStr}.png"; - _skin.AddProperty("CAPEPATH", _cape.Filename); - } - _skin.SetTexture(skinPictureBox.Image); + newSkin.MetaData = new SkinMetaData(textSkinName.Text, textThemeName.Text); DialogResult = DialogResult.OK; - Close(); } private void textSkinID_TextChanged(object sender, EventArgs e) @@ -284,24 +221,21 @@ namespace PckStudio.Forms.Additional_Popups private void CreateCustomModel_Click(object sender, EventArgs e) { - //Prompt for skin model generator - if (MessageBox.Show(this, "Create your own custom skin model?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) != DialogResult.Yes) + if (MessageBox.Show("Create your own custom skin model?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) != DialogResult.Yes) return; - _skin.SetTexture(Resources.classic_template); + newSkin.MetaData = new SkinMetaData(textSkinName.Text, textThemeName.Text); - using generateModel generate = new generateModel(_skin); + ISaveContext saveContext = new DelegatedSaveContext(Settings.Default.AutoSaveChanges, (customSkin) => newSkin = customSkin); - if (generate.ShowDialog() == DialogResult.OK) + using CustomSkinEditor customSkinEditor = new CustomSkinEditor(newSkin, saveContext); + + if (customSkinEditor.ShowDialog() == DialogResult.OK) { - displayBox.Image = generate.PreviewImage; + skinPictureBox.Image = newSkin.Texture; buttonDone.Enabled = true; labelSelectTexture.Visible = false; - if (skinType != eSkinType._64x64 && skinType != eSkinType._64x64HD) - { - buttonSkin.Location = new Point(buttonSkin.Location.X - skinPictureBox.Width, buttonSkin.Location.Y); - skinType = eSkinType._64x64; - } + DrawModel(); } } @@ -309,8 +243,8 @@ namespace PckStudio.Forms.Additional_Popups { if (radioButtonAuto.Checked) { - int num = rng.Next(100000, 99999999); - textSkinID.Text = num.ToString(); + newSkin.Identifier = new(rng.Next(100000, 99999999)); + textSkinID.Text = newSkin.Identifier.ToString(); textSkinID.Enabled = false; } } @@ -322,10 +256,10 @@ namespace PckStudio.Forms.Additional_Popups private void buttonAnimGen_Click(object sender, EventArgs e) { - using ANIMEditor diag = new ANIMEditor(_anim); + using ANIMEditor diag = new ANIMEditor(newSkin.Anim); if (diag.ShowDialog(this) == DialogResult.OK) { - _anim = diag.ResultAnim; + newSkin.Anim = diag.ResultAnim; DrawModel(); } } diff --git a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.resx b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.resx index 6e87bf23..4255bf1a 100644 --- a/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.resx +++ b/PCK-Studio/Forms/Additional-Popups/AddSkinPrompt.resx @@ -219,21 +219,6 @@ 19 - - 102, 78 - - - 239, 20 - - - 32 - - - textTheme - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 17, 17 @@ -654,9 +639,6 @@ 4 - - False - 108, 259 diff --git a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs index 58fdc3aa..de2fa054 100644 --- a/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs +++ b/PCK-Studio/Forms/Additional-Popups/Animation/ChangeTile.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Windows.Forms; -using MetroFramework.Controls; -using System.Xml.Linq; -using MetroFramework.Forms; -using PckStudio.Extensions; -using PckStudio.Internal; -using PckStudio.Internal.App; -using PckStudio.Internal.Json; +using PckStudio.Core; +using PckStudio.Core.Json; +using PckStudio.Json; +using PckStudio.Core.Extensions; namespace PckStudio.Forms.Additional_Popups.Animation { @@ -32,10 +28,8 @@ namespace PckStudio.Forms.Additional_Popups.Animation private void InitializeTreeviews() { - Profiler.Start(); GetTileDataToView(ResourceCategory.BlockAnimation); GetTileDataToView(ResourceCategory.ItemAnimation); - Profiler.Stop(); } public DialogResult ShowDialog(IWin32Window owner) diff --git a/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs b/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs index 1057ab70..9b76ad87 100644 --- a/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs +++ b/PCK-Studio/Forms/Additional-Popups/EntityForms/AddEntry.cs @@ -2,7 +2,8 @@ using System.Collections.Generic; using System.Windows.Forms; using PckStudio.Forms.Additional_Popups.Animation; -using PckStudio.Internal.Json; +using PckStudio.Core.Json; +using PckStudio.Json; namespace PckStudio.Forms.Additional_Popups.EntityForms diff --git a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs index f84b95a5..c872cfdd 100644 --- a/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs +++ b/PCK-Studio/Forms/Additional-Popups/ItemSelectionPopUp.cs @@ -27,8 +27,11 @@ namespace PckStudio.Forms.Additional_Popups private void okBtn_Click(object sender, EventArgs e) { - if(ComboBox.SelectedIndex > -1) + if(ComboBox.SelectedIndex <= -1) + { cancelButton_Click(sender, e); + return; + } DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.Designer.cs b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.Designer.cs index 7bead21f..7c104732 100644 --- a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.Designer.cs +++ b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.Designer.cs @@ -31,8 +31,8 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NumericPrompt)); this.TextLabel = new System.Windows.Forms.Label(); this.OKButton = new System.Windows.Forms.Button(); - this.ContextLabel = new MetroFramework.Controls.MetroLabel(); this.ValueUpDown = new System.Windows.Forms.NumericUpDown(); + this.toolTipLabel = new MetroFramework.Controls.MetroLabel(); ((System.ComponentModel.ISupportInitialize)(this.ValueUpDown)).BeginInit(); this.SuspendLayout(); // @@ -50,26 +50,28 @@ this.OKButton.UseVisualStyleBackColor = true; this.OKButton.Click += new System.EventHandler(this.OKBtn_Click); // - // ContextLabel - // - resources.ApplyResources(this.ContextLabel, "ContextLabel"); - this.ContextLabel.FontSize = MetroFramework.MetroLabelSize.Small; - this.ContextLabel.Name = "ContextLabel"; - this.ContextLabel.Theme = MetroFramework.MetroThemeStyle.Dark; - this.ContextLabel.WrapToLine = true; - // // ValueUpDown // resources.ApplyResources(this.ValueUpDown, "ValueUpDown"); + this.ValueUpDown.BackColor = System.Drawing.SystemColors.WindowText; + this.ValueUpDown.ForeColor = System.Drawing.SystemColors.Window; this.ValueUpDown.Name = "ValueUpDown"; // + // toolTipLabel + // + resources.ApplyResources(this.toolTipLabel, "toolTipLabel"); + this.toolTipLabel.FontSize = MetroFramework.MetroLabelSize.Small; + this.toolTipLabel.Name = "toolTipLabel"; + this.toolTipLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + this.toolTipLabel.WrapToLine = true; + // // NumericPrompt // this.AcceptButton = this.OKButton; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.ValueUpDown); - this.Controls.Add(this.ContextLabel); + this.Controls.Add(this.toolTipLabel); this.Controls.Add(this.OKButton); this.Controls.Add(this.TextLabel); this.MaximizeBox = false; @@ -89,7 +91,7 @@ #endregion public System.Windows.Forms.Button OKButton; public System.Windows.Forms.Label TextLabel; - public MetroFramework.Controls.MetroLabel ContextLabel; private System.Windows.Forms.NumericUpDown ValueUpDown; + private MetroFramework.Controls.MetroLabel toolTipLabel; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.cs b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.cs index 5ebf4bbf..5fad9a9b 100644 --- a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.cs +++ b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.cs @@ -6,23 +6,66 @@ namespace PckStudio { public partial class NumericPrompt : MetroForm { - public int SelectedValue => (int)ValueUpDown.Value; + public decimal SelectedValue => ValueUpDown.Value; + + public int SelectedValueAsInt => (int)SelectedValue; - public int Minimum { set => ValueUpDown.Minimum = value; } - public int Maximum { set => ValueUpDown.Maximum = value; } + public string ToolTipText + { + get => toolTipLabel.Text; + set => toolTipLabel.Text = value; + } + + public decimal ValueStep + { + get => ValueUpDown.Increment; + set => ValueUpDown.Increment = value; + } + + public int DecimalPlaces + { + get => ValueUpDown.DecimalPlaces; + set => ValueUpDown.DecimalPlaces = value; + } + + public decimal Minimum + { + get => ValueUpDown.Minimum; + set => ValueUpDown.Minimum = value; + } + + public decimal Maximum + { + get => ValueUpDown.Maximum; + set => ValueUpDown.Maximum = value; + } + + private NumericPrompt() + { + InitializeComponent(); + } public NumericPrompt(int initialValue) : this(initialValue, int.MinValue, int.MaxValue) { + } + public NumericPrompt(decimal initialValue, decimal minimum, decimal maximum) + : this() + { + Minimum = minimum; + Maximum = maximum; + ValueUpDown.Value = initialValue; } public NumericPrompt(int initialValue, int minimum, int maximum) + : this((decimal)initialValue, minimum, maximum) + { + } + + public NumericPrompt(float initialValue, float minimum, float maximum) + : this((decimal)initialValue, (decimal)minimum, (decimal)maximum) { - InitializeComponent(); - ValueUpDown.Value = initialValue; - Minimum = minimum; - Maximum = maximum; } private void OKBtn_Click(object sender, EventArgs e) @@ -32,9 +75,9 @@ namespace PckStudio private void RenamePrompt_Load(object sender, EventArgs e) { - if(string.IsNullOrEmpty(ContextLabel.Text)) + if (string.IsNullOrEmpty(toolTipLabel.Text)) { - ContextLabel.Visible = false; + toolTipLabel.Visible = false; Size = new System.Drawing.Size(264, 85); } } diff --git a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.resx b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.resx index 97fc650e..fd242b82 100644 --- a/PCK-Studio/Forms/Additional-Popups/NumericPrompt.resx +++ b/PCK-Studio/Forms/Additional-Popups/NumericPrompt.resx @@ -119,15 +119,18 @@ - Bottom + Bottom, Left True + + NoControl + - 19, 90 + 19, 38 34, 13 @@ -163,7 +166,7 @@ NoControl - 95, 118 + 83, 66 75, 23 @@ -186,38 +189,14 @@ 2 - - Top - - - 28, 27 - - - 208, 58 - - - 6 - - - TopCenter - - - ContextLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 1 + + Bottom, Left, Right - 71, 88 + 71, 36 - 164, 20 + 141, 20 7 @@ -234,14 +213,47 @@ 0 + + False + + + 3, 11 + + + 235, 22 + + + 235, 22 + + + 6 + + + TopCenter + + + toolTipLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 1 + True 6, 13 + + GrowAndShrink + - 264, 150 + 241, 98 @@ -2749,6 +2761,12 @@ AP//AAA= + + 4, 2, 4, 2 + + + 0, 60, 0, 0 + CenterParent diff --git a/PCK-Studio/Forms/AppSettingsForm.Designer.cs b/PCK-Studio/Forms/AppSettingsForm.Designer.cs index 00ed901a..4fc1d0f8 100644 --- a/PCK-Studio/Forms/AppSettingsForm.Designer.cs +++ b/PCK-Studio/Forms/AppSettingsForm.Designer.cs @@ -63,7 +63,6 @@ this.Resizable = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Style = MetroFramework.MetroColorStyle.Black; - this.Text = "Application Settings"; this.Theme = MetroFramework.MetroThemeStyle.Dark; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AppBehaviorSettingsForm_FormClosing); this.ResumeLayout(false); diff --git a/PCK-Studio/Forms/AppSettingsForm.cs b/PCK-Studio/Forms/AppSettingsForm.cs index f9aa41d5..3bbd5509 100644 --- a/PCK-Studio/Forms/AppSettingsForm.cs +++ b/PCK-Studio/Forms/AppSettingsForm.cs @@ -5,6 +5,8 @@ using System.Diagnostics; using System.Windows.Forms; using MetroFramework.Controls; using MetroFramework.Forms; +using PckStudio.Core.App; +using PckStudio.Internal.App; using PckStudio.Properties; namespace PckStudio.Forms @@ -12,57 +14,84 @@ namespace PckStudio.Forms public partial class AppSettingsForm : MetroForm { private ApplicationSettingsBase _applicationSettings; + internal const string keyToStringContextKey = "keyToString"; public AppSettingsForm() - : this(Settings.Default) + : this("Application Settings", Settings.Default, new Dictionary() + { + ["ShowRichPresence"] = "Show Rich Presence", + ["AutoSaveChanges"] = "Auto Save", + ["UseLittleEndianAsDefault"] = "Open as Little Endian", + ["AutoUpdate"] = "Auto Update", + ["LoadSubPcks"] = "Load Sub Pcks", + ["UsePrerelease"] = "Use Prerelease", + ["ValidateImageDimension"] = "Validate skin dimension", + }) { } - public AppSettingsForm(ApplicationSettingsBase applicationSettings) + public AppSettingsForm(string title, ApplicationSettingsBase applicationSettings, Dictionary keyToStringMap = null) { InitializeComponent(); + Text = title; _applicationSettings = applicationSettings; + if (keyToStringMap is not null && !_applicationSettings.Context.ContainsKey(SettingsManager.KeyToStringContextKeyConst)) + _applicationSettings.Context.Add(SettingsManager.KeyToStringContextKeyConst, keyToStringMap); LoadSettings(); } - private static Dictionary CheckBoxText = new Dictionary() + static bool ContextTryGetKeyToString(SettingsContext context, string key, out string value) { - ["ShowRichPresence"] = "Show Rich Presence", - ["AutoSaveChanges"] = "Auto Save", - ["UseLittleEndianAsDefault"] = "Open as Little Endian", - ["AutoUpdate"] = "Auto Update", - ["LoadSubPcks"] = "Load Sub Pcks", - ["UsePrerelease"] = "Use Prerelease", - }; - - private void CheckBox_CheckedChanged(object sender, EventArgs e) - { - if (sender is CheckBox checkBox && checkBox.Tag is string settingsKey && _applicationSettings[settingsKey] is bool) - { - _applicationSettings[settingsKey] = checkBox.Checked; - } + value = default; + return + context.ContainsKey(SettingsManager.KeyToStringContextKeyConst) && + context[SettingsManager.KeyToStringContextKeyConst] is Dictionary keyToString && + keyToString.TryGetValue(key, out value); } + static Control CreateCheckBox(SettingsPropertyValue propertyValue, SettingsBase settings) + { + var control = new MetroCheckBox + { + Name = propertyValue.Name, + Tag = propertyValue.Name, + Text = ContextTryGetKeyToString(settings.Context, propertyValue.Name, out string name) ? name : propertyValue.Name, + Checked = (bool)propertyValue.PropertyValue, + + AutoSize = true, + Theme = MetroFramework.MetroThemeStyle.Dark, + Style = MetroFramework.MetroColorStyle.White, + }; + + void CheckBox_CheckedChanged(object sender, EventArgs e) + { + if (sender is CheckBox checkBox && checkBox.Tag is string settingsKey && settings[settingsKey] is bool) + { + settings[settingsKey] = checkBox.Checked; + } + } + + control.CheckedChanged += CheckBox_CheckedChanged; + return control; + } + + delegate Control ControlCreateDelegate(SettingsPropertyValue propertyValue, SettingsBase settings); + + Dictionary _typeToControl = new Dictionary() + { + [typeof(bool)] = CreateCheckBox, + }; + private void LoadSettings() { foreach (SettingsPropertyValue item in _applicationSettings.PropertyValues) { Debug.WriteLine($"{item.Property.Name}: {item.Property.PropertyType}"); - if (!item.Property.Attributes.ContainsKey(typeof(UserScopedSettingAttribute)) || item.Property.PropertyType != typeof(bool)) + bool isUserScoped = item.Property.Attributes?.ContainsKey(typeof(UserScopedSettingAttribute)) ?? true; + if (!isUserScoped || !_typeToControl.ContainsKey(item.Property.PropertyType) || item.Property.IsReadOnly) continue; - var checkBox = new MetroCheckBox - { - Name = item.Name, - Tag = item.Name, - Text = CheckBoxText.ContainsKey(item.Name) ? CheckBoxText[item.Name] : item.Name, - Checked = (bool)item.PropertyValue, - - AutoSize = true, - Theme = MetroFramework.MetroThemeStyle.Dark, - Style = MetroFramework.MetroColorStyle.White, - }; - checkBox.CheckedChanged += CheckBox_CheckedChanged; - flowLayoutPanel.Controls.Add(checkBox); + Control control = _typeToControl[item.Property.PropertyType](item, _applicationSettings); + flowLayoutPanel.Controls.Add(control); } } diff --git a/PCK-Studio/Forms/Editor/ANIMEditor.cs b/PCK-Studio/Forms/Editor/ANIMEditor.cs index c379d7d2..27ef70d7 100644 --- a/PCK-Studio/Forms/Editor/ANIMEditor.cs +++ b/PCK-Studio/Forms/Editor/ANIMEditor.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using PckStudio.Internal; using PckStudio.Forms.Additional_Popups; using PckStudio.Properties; +using PckStudio.Core.Skin; namespace PckStudio.Forms.Editor { diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs index 4fed8d2a..7a891d6a 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.Designer.cs @@ -319,7 +319,7 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.animationPictureBox.BlendColor = System.Drawing.Color.White; - this.animationPictureBox.BlendMode = PckStudio.Extensions.BlendMode.Multiply; + this.animationPictureBox.BlendMode = PckStudio.Core.Extensions.BlendMode.Multiply; this.animationPictureBox.Image = null; this.animationPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; this.animationPictureBox.Location = new System.Drawing.Point(157, 88); diff --git a/PCK-Studio/Forms/Editor/AnimationEditor.cs b/PCK-Studio/Forms/Editor/AnimationEditor.cs index e5ba5639..a0f6cd02 100644 --- a/PCK-Studio/Forms/Editor/AnimationEditor.cs +++ b/PCK-Studio/Forms/Editor/AnimationEditor.cs @@ -29,39 +29,32 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PckStudio.Forms.Additional_Popups.Animation; -using PckStudio.Extensions; -using PckStudio.Properties; -using PckStudio.Internal; -using PckStudio.Internal.Deserializer; -using PckStudio.Internal.Serializer; +using PckStudio.Core.Extensions; +using PckStudio.Core.Deserializer; +using PckStudio.Core.Serializer; +using PckStudio.Core; +using PckStudio.Interfaces; +using PckStudio.Controls; namespace PckStudio.Forms.Editor { - public partial class AnimationEditor : MetroForm + public partial class AnimationEditor : EditorForm { - public Animation Result => _animation; + private bool _editable; - private Animation _animation; - private bool _isSpecialTile; - - private AnimationEditor() + internal AnimationEditor(Animation animation, ISaveContext saveContext, string displayName, bool editable = true) + : base(animation, saveContext) { InitializeComponent(); - toolStripSeparator1.Visible = saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - } - - internal AnimationEditor(Animation animation, string displayName, bool isSpecialTile = false) - : this() - { - _ = animation ?? throw new ArgumentNullException(nameof(animation)); - _animation = animation; + saveToolStripMenuItem1.Available = !saveContext.AutoSave; + toolStripSeparator1.Available = !saveContext.AutoSave; tileLabel.Text = displayName; - _isSpecialTile = isSpecialTile; + _editable = editable; animationPictureBox.Image = animation.CreateAnimationImage(); } - internal AnimationEditor(Animation animation, string displayName, Color blendColor) - : this(animation, displayName) + internal AnimationEditor(Animation animation, ISaveContext saveContext, string displayName, Color blendColor) + : this(animation, saveContext, displayName) { animationPictureBox.UseBlendColor = true; animationPictureBox.BlendColor = blendColor; @@ -69,10 +62,9 @@ namespace PckStudio.Forms.Editor private void ValidateToolStrip() { - bulkAnimationSpeedToolStripMenuItem.Enabled = - importToolStripMenuItem.Enabled = - exportAsToolStripMenuItem.Enabled = - InterpolationCheckbox.Visible = !_isSpecialTile; + editToolStripMenuItem.Visible = + importToolStripMenuItem.Visible = + InterpolationCheckbox.Visible = _editable; } private void AnimationEditor_Load(object sender, EventArgs e) @@ -83,20 +75,20 @@ namespace PckStudio.Forms.Editor private void LoadAnimationTreeView() { - if (_animation is null) + if (EditorValue is null) { - AnimationStartStopBtn.Enabled = false; + AnimationStartStopBtn.Visible = false; return; } - AnimationStartStopBtn.Enabled = true; - InterpolationCheckbox.Checked = _animation.Interpolate; + AnimationStartStopBtn.Visible = true; + InterpolationCheckbox.Checked = EditorValue.Interpolate; TextureIcons.Images.Clear(); - TextureIcons.Images.AddRange(_animation.GetTextures().ToArray()); + TextureIcons.Images.AddRange(EditorValue.GetTextures().ToArray()); UpdateTreeView(); - animationPictureBox.Image ??= _animation.CreateAnimationImage(); + animationPictureBox.Image ??= EditorValue.CreateAnimationImage(); - if (_animation.FrameCount > 0) + if (EditorValue.FrameCount > 0) { animationPictureBox.Image.SelectActiveFrame(FrameDimension.Page, 0); } @@ -106,11 +98,11 @@ namespace PckStudio.Forms.Editor { frameTreeView.Nodes.Clear(); frameTreeView.Nodes.AddRange( - _animation.GetFrames() + EditorValue.GetFrames() .Select(frame => { - var imageIndex = _animation.GetTextureIndex(frame.Texture); - return new TreeNode($"for {frame.Ticks} ticks", imageIndex, imageIndex); + var imageIndex = EditorValue.GetTextureIndex(frame.Texture); + return new TreeNode($"for {frame.Ticks} tick(s)", imageIndex, imageIndex); }) .ToArray() ); @@ -122,7 +114,7 @@ namespace PckStudio.Forms.Editor { StopAnimation(); } - animationPictureBox.Image = _animation.GetFrame(frameTreeView.SelectedNode.Index).Texture; + animationPictureBox.Image = EditorValue.GetFrame(frameTreeView.SelectedNode.Index).Texture; } private void StopAnimation() @@ -139,9 +131,9 @@ namespace PckStudio.Forms.Editor return; } - if (_animation.FrameCount > 1) + if (EditorValue.FrameCount > 1) { - animationPictureBox.Image = _animation.CreateAnimationImage(); + animationPictureBox.Image = EditorValue.CreateAnimationImage(); animationPictureBox.Start(); AnimationStartStopBtn.Text = "Stop Animation"; } @@ -166,8 +158,9 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - if (!_isSpecialTile && _animation is not null && _animation.FrameCount > 0) + if (_editable && EditorValue is not null && EditorValue.FrameCount > 0) { + Save(); DialogResult = DialogResult.OK; return; } @@ -231,7 +224,7 @@ namespace PckStudio.Forms.Editor { int draggedIndex = draggedNode.Index; int targetIndex = targetNode.Index; - _animation.SwapFrames(draggedIndex, targetIndex); + EditorValue.SwapFrames(draggedIndex, targetIndex); UpdateTreeView(); } } @@ -255,8 +248,8 @@ namespace PckStudio.Forms.Editor private void treeView1_doubleClick(object sender, EventArgs e) { - Animation.Frame frame = _animation.GetFrame(frameTreeView.SelectedNode.Index); - using FrameEditor diag = new FrameEditor(frame.Ticks, _animation.GetTextureIndex(frame.Texture), TextureIcons); + Animation.Frame frame = EditorValue.GetFrame(frameTreeView.SelectedNode.Index); + using FrameEditor diag = new FrameEditor(frame.Ticks, EditorValue.GetTextureIndex(frame.Texture), TextureIcons); if (diag.ShowDialog(this) == DialogResult.OK) { /* Found a bug here. When passing the frame variable, @@ -266,7 +259,7 @@ namespace PckStudio.Forms.Editor * - Matt */ - _animation.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); + EditorValue.SetFrame(frameTreeView.SelectedNode.Index, diag.FrameTextureIndex, diag.FrameTime); UpdateTreeView(); } } @@ -277,14 +270,14 @@ namespace PckStudio.Forms.Editor diag.SaveBtn.Text = "Add"; if (diag.ShowDialog(this) == DialogResult.OK) { - _animation.AddFrame(diag.FrameTextureIndex, _isSpecialTile ? Animation.MinimumFrameTime : diag.FrameTime); + EditorValue.AddFrame(diag.FrameTextureIndex, _editable ? diag.FrameTime : Animation.MinimumFrameTime); UpdateTreeView(); } } private void removeFrameToolStripMenuItem_Click(object sender, EventArgs e) { - if (frameTreeView.SelectedNode is TreeNode t && _animation.RemoveFrame(t.Index)) + if (frameTreeView.SelectedNode is TreeNode t && EditorValue.RemoveFrame(t.Index)) { frameTreeView.SelectedNode.Remove(); } @@ -297,7 +290,7 @@ namespace PckStudio.Forms.Editor { if (animationPictureBox.IsPlaying) animationPictureBox.Stop(); - _animation.SetFrameTicks(diag.Ticks); + EditorValue.SetFrameTicks(diag.Ticks); UpdateTreeView(); } diag.Dispose(); @@ -334,10 +327,10 @@ namespace PckStudio.Forms.Editor } try { - var img = Image.FromFile(textureFile); + Image img = Image.FromFile(textureFile).ReleaseFromFile(); JObject mcmeta = JObject.Parse(File.ReadAllText(fileDialog.FileName)); Animation javaAnimation = AnimationDeserializer.DefaultDeserializer.DeserializeJavaAnimation(mcmeta, img); - _animation = javaAnimation; + EditorValue = javaAnimation; LoadAnimationTreeView(); } catch (JsonException j_ex) @@ -354,11 +347,11 @@ namespace PckStudio.Forms.Editor fileDialog.Filter = "Animation Scripts (*.mcmeta)|*.png.mcmeta"; if (fileDialog.ShowDialog(this) == DialogResult.OK) { - JObject mcmeta = AnimationSerializer.SerializeJavaAnimation(_animation); + JObject mcmeta = AnimationSerializer.SerializeJavaAnimation(EditorValue); string jsondata = JsonConvert.SerializeObject(mcmeta, Formatting.Indented); string filename = fileDialog.FileName; File.WriteAllText(filename, jsondata); - Image finalTexture = AnimationSerializer.SerializeTexture(_animation); + Image finalTexture = AnimationSerializer.SerializeTexture(EditorValue); // removes ".mcmeta" from filename string texturePath = Path.Combine(Path.GetDirectoryName(filename), Path.GetFileNameWithoutExtension(filename)); finalTexture.Save(texturePath); @@ -390,8 +383,8 @@ namespace PckStudio.Forms.Editor private void InterpolationCheckbox_CheckedChanged(object sender, EventArgs e) { - if (_animation is not null) - _animation.Interpolate = InterpolationCheckbox.Checked; + if (EditorValue is not null) + EditorValue.Interpolate = InterpolationCheckbox.Checked; } private void AnimationEditor_FormClosing(object sender, FormClosingEventArgs e) @@ -400,7 +393,7 @@ namespace PckStudio.Forms.Editor { animationPictureBox.Stop(); } - if (Settings.Default.AutoSaveChanges) + if (!saveToolStripMenuItem1.Available) { saveToolStripMenuItem1_Click(sender, EventArgs.Empty); } @@ -415,14 +408,14 @@ namespace PckStudio.Forms.Editor if (fileDialog.ShowDialog(this) != DialogResult.OK) return; - var gif = Image.FromFile(fileDialog.FileName); + Image gif = Image.FromFile(fileDialog.FileName).ReleaseFromFile(); if (!gif.RawFormat.Equals(ImageFormat.Gif)) { MessageBox.Show(this, "Selected file is not a gif", "Invalid file", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - var oldResolution = _animation.GetFrame(0).Texture.Width; + var oldResolution = EditorValue.GetFrame(0).Texture.Width; FrameDimension dimension = new FrameDimension(gif.FrameDimensionsList[0]); int frameCount = gif.GetFrameCount(dimension); @@ -436,8 +429,8 @@ namespace PckStudio.Forms.Editor textures.Add(new Bitmap(gif, oldResolution, oldResolution)); } - _animation = new Animation(textures, initFramesFromTextures: true); - _animation.Interpolate = InterpolationCheckbox.Checked; + EditorValue = new Animation(textures, initFramesFromTextures: true); + EditorValue.Interpolate = InterpolationCheckbox.Checked; LoadAnimationTreeView(); } @@ -452,7 +445,7 @@ namespace PckStudio.Forms.Editor return; using Image img = Image.FromFile(ofd.FileName); IEnumerable textures = img.Split(ImageLayoutDirection.Vertical); - _animation = new Animation(textures, initFramesFromTextures: true); + EditorValue = new Animation(textures, initFramesFromTextures: true); LoadAnimationTreeView(); } @@ -465,7 +458,7 @@ namespace PckStudio.Forms.Editor }; if (fileDialog.ShowDialog(this) != DialogResult.OK) return; - _animation.CreateAnimationImage().Save(fileDialog.FileName); + EditorValue.CreateAnimationImage().Save(fileDialog.FileName); } private void frameTimeandTicksToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/PCK-Studio/Forms/Editor/AudioEditor.cs b/PCK-Studio/Forms/Editor/AudioEditor.cs index cc37747c..05acd345 100644 --- a/PCK-Studio/Forms/Editor/AudioEditor.cs +++ b/PCK-Studio/Forms/Editor/AudioEditor.cs @@ -7,30 +7,23 @@ using System.Windows.Forms; using System.Security.Cryptography; using System.Text.RegularExpressions; using System.Diagnostics; - -using MetroFramework.Forms; using NAudio.Wave; - -using OMI.Formats.Pck; - -using PckStudio.FileFormats; -using PckStudio.Internal.IO.PckAudio; using PckStudio.Forms.Additional_Popups; using PckStudio.Properties; using PckStudio.External.API.Miles; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using PckStudio.Internal.App; +using PckStudio.Controls; +using PckStudio.Interfaces; +using PckStudio.Core.FileFormats; // Audio Editor by MattNL and Miku-666 namespace PckStudio.Forms.Editor { - public partial class AudioEditor : MetroForm + public partial class AudioEditor : EditorForm { public string defaultType = "yes"; - PckAudioFile _audioFile = null; - PckAsset _audioAsset; - bool _isLittleEndian = false; MainForm parent = null; private static readonly List Categories = new List @@ -52,7 +45,15 @@ namespace PckStudio.Forms.Editor */ }; - private string GetCategoryFromId(PckAudioFile.AudioCategory.EAudioType categoryId) + public AudioEditor(PckAudioFile audioFile, ISaveContext saveContext) + : base(audioFile, saveContext) + { + InitializeComponent(); + saveToolStripMenuItem1.Visible = !saveContext.AutoSave; + SetUpTree(); + } + + private string GetCategoryFromId(PckAudioFile.AudioCategory.EAudioType categoryId) => categoryId >= PckAudioFile.AudioCategory.EAudioType.Overworld && categoryId <= PckAudioFile.AudioCategory.EAudioType.BuildOff ? Categories[(int)categoryId] @@ -63,26 +64,12 @@ namespace PckStudio.Forms.Editor return (PckAudioFile.AudioCategory.EAudioType)Categories.IndexOf(category); } - public AudioEditor(PckAsset asset, bool isLittleEndian) - { - InitializeComponent(); - - saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - - _isLittleEndian = isLittleEndian; - - _audioAsset = asset; - _audioFile = _audioAsset.GetData(new PckAudioFileReader(isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - - SetUpTree(); - } - public void SetUpTree() { treeView1.BeginUpdate(); treeView1.Nodes.Clear(); - foreach (PckAudioFile.AudioCategory category in _audioFile.Categories) + foreach (PckAudioFile.AudioCategory category in EditorValue.Categories) { // fix songs with directories using backslash instead of forward slash // Songs with a backslash instead of a forward slash would not play in RPCS3 @@ -92,7 +79,7 @@ namespace PckStudio.Forms.Editor if (category.AudioType == PckAudioFile.AudioCategory.EAudioType.Creative) { if (category.Name == "include_overworld" && - _audioFile.TryGetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld, out PckAudioFile.AudioCategory overworldCategory)) + EditorValue.TryGetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld, out PckAudioFile.AudioCategory overworldCategory)) { foreach (var name in category.SongNames.ToList()) { @@ -108,7 +95,7 @@ namespace PckStudio.Forms.Editor treeNode.Tag = category; treeView1.Nodes.Add(treeNode); } - playOverworldInCreative.Enabled = _audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Creative); + playOverworldInCreative.Enabled = EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Creative); treeView1.EndUpdate(); } @@ -120,9 +107,9 @@ namespace PckStudio.Forms.Editor if (!parent.CreateDataFolder()) return; - string FileName = Path.Combine(parent.GetDataPath(), entry.Text + ".binka"); + string fileName = Path.Combine(parent.GetDataPath(), entry.Text + ".binka"); - if (File.Exists(FileName)) + if (File.Exists(fileName)) MessageBox.Show(this, $"\"{entry.Text}.binka\" exists in the \"Data\" folder", "File found"); else MessageBox.Show(this, $"\"{entry.Text}.binka\" does not exist in the \"Data\" folder. The game will crash when attempting to load this track.", "File missing"); @@ -144,7 +131,7 @@ namespace PckStudio.Forms.Editor private void addCategoryStripMenuItem_Click(object sender, EventArgs e) { - string[] available = Categories.FindAll(str => !_audioFile.HasCategory(GetCategoryId(str))).ToArray(); + string[] available = Categories.FindAll(str => !EditorValue.HasCategory(GetCategoryId(str))).ToArray(); if (available.Length == 0) { MessageBox.Show(this, "There are no more categories that could be added", "All possible categories are used"); @@ -154,8 +141,8 @@ namespace PckStudio.Forms.Editor if (add.ShowDialog(this) != DialogResult.OK) return; - _audioFile.AddCategory(GetCategoryId(add.SelectedItem)); - PckAudioFile.AudioCategory category = _audioFile.GetCategory(GetCategoryId(add.SelectedItem)); + EditorValue.AddCategory(GetCategoryId(add.SelectedItem)); + PckAudioFile.AudioCategory category = EditorValue.GetCategory(GetCategoryId(add.SelectedItem)); if (GetCategoryId(add.SelectedItem) == PckAudioFile.AudioCategory.EAudioType.Creative) { @@ -194,7 +181,7 @@ namespace PckStudio.Forms.Editor private void removeCategoryStripMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode is TreeNode main && - _audioFile.RemoveCategory(GetCategoryId(treeView1.SelectedNode.Text))) + EditorValue.RemoveCategory(GetCategoryId(treeView1.SelectedNode.Text))) { if(GetCategoryId(treeView1.SelectedNode.Text) == PckAudioFile.AudioCategory.EAudioType.Creative) { @@ -370,18 +357,18 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - if (!_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Overworld) || - !_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.Nether) || - !_audioFile.HasCategory(PckAudioFile.AudioCategory.EAudioType.End)) + if (!EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Overworld) || + !EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.Nether) || + !EditorValue.HasCategory(PckAudioFile.AudioCategory.EAudioType.End)) { MessageBox.Show(this, "Your changes were not saved. The game will crash when loading your pack if the Overworld, Nether and End categories don't all exist with at least one valid song.", "Mandatory Categories Missing"); return; } - PckAudioFile.AudioCategory overworldCategory = _audioFile.GetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); + PckAudioFile.AudioCategory overworldCategory = EditorValue.GetCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); bool songs_missing = false; - foreach (PckAudioFile.AudioCategory category in _audioFile.Categories) + foreach (PckAudioFile.AudioCategory category in EditorValue.Categories) { if (category.SongNames.Count < 1) { @@ -391,8 +378,8 @@ namespace PckStudio.Forms.Editor foreach(var song in category.SongNames) { - string FileName = Path.Combine(parent.GetDataPath(), song + ".binka"); - if (!File.Exists(FileName)) + string fileName = Path.Combine(parent.GetDataPath(), song + ".binka"); + if (!File.Exists(fileName)) { songs_missing = true; MessageBox.Show(this, "\"" + song + ".binka\" does not exist in the \"Data\" folder. The game will crash when attempting to load this track.", "File missing"); @@ -420,7 +407,7 @@ namespace PckStudio.Forms.Editor return; } - _audioAsset.SetData(new PckAudioFileWriter(_audioFile, _isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + Save(); DialogResult = DialogResult.OK; } @@ -444,7 +431,7 @@ namespace PckStudio.Forms.Editor if (dr != DialogResult.Yes) return; var totalSongList = new List(); - foreach (string song in _audioFile.Categories.SelectMany(cat => cat.SongNames)) + foreach (string song in EditorValue.Categories.SelectMany(cat => cat.SongNames)) { Console.WriteLine(song); totalSongList.Add(song); @@ -544,7 +531,7 @@ namespace PckStudio.Forms.Editor return; var totalSongList = new List(); - foreach (string song in _audioFile.Categories.SelectMany(cat => cat.SongNames)) + foreach (string song in EditorValue.Categories.SelectMany(cat => cat.SongNames)) { totalSongList.Add(song); } @@ -596,7 +583,7 @@ namespace PckStudio.Forms.Editor if (!(treeView1.SelectedNode is TreeNode t && t.Tag is PckAudioFile.AudioCategory category)) return; - string[] available = Categories.FindAll(str => !_audioFile.HasCategory(GetCategoryId(str))).ToArray(); + string[] available = Categories.FindAll(str => !EditorValue.HasCategory(GetCategoryId(str))).ToArray(); if (available.Length > 0) { using ItemSelectionPopUp add = new ItemSelectionPopUp(available); @@ -604,11 +591,11 @@ namespace PckStudio.Forms.Editor if (add.ShowDialog(this) != DialogResult.OK) return; - _audioFile.RemoveCategory(category.AudioType); + EditorValue.RemoveCategory(category.AudioType); - _audioFile.AddCategory(category.parameterType, GetCategoryId(add.SelectedItem), category.AudioType == PckAudioFile.AudioCategory.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : ""); + EditorValue.AddCategory(category.parameterType, GetCategoryId(add.SelectedItem), category.AudioType == PckAudioFile.AudioCategory.EAudioType.Overworld && playOverworldInCreative.Checked ? "include_overworld" : ""); - PckAudioFile.AudioCategory newCategory = _audioFile.GetCategory(GetCategoryId(add.SelectedItem)); + PckAudioFile.AudioCategory newCategory = EditorValue.GetCategory(GetCategoryId(add.SelectedItem)); category.SongNames.ForEach(c => newCategory.SongNames.Add(c)); @@ -628,7 +615,7 @@ namespace PckStudio.Forms.Editor return; string musicdir = Path.Combine(parent.GetDataPath(), "Music"); Directory.CreateDirectory(musicdir); - foreach (PckAudioFile.AudioCategory category in _audioFile.Categories) + foreach (PckAudioFile.AudioCategory category in EditorValue.Categories) { for (var i = 0; i < category.SongNames.Count; i++) // using standard for loop so the list can be modified { diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.Designer.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.Designer.cs index ed133825..48a4202d 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.Designer.cs @@ -299,7 +299,6 @@ this.Style = MetroFramework.MetroColorStyle.Silver; this.Text = "Behaviour Editor"; this.Theme = MetroFramework.MetroThemeStyle.Dark; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.BehaviourEditor_FormClosing); this.metroContextMenu1.ResumeLayout(false); this.menuStrip.ResumeLayout(false); this.menuStrip.PerformLayout(); diff --git a/PCK-Studio/Forms/Editor/BehaviourEditor.cs b/PCK-Studio/Forms/Editor/BehaviourEditor.cs index c47957ee..e4cd6a63 100644 --- a/PCK-Studio/Forms/Editor/BehaviourEditor.cs +++ b/PCK-Studio/Forms/Editor/BehaviourEditor.cs @@ -1,75 +1,64 @@ using System; -using System.Collections.Generic; -using System.Drawing; -using System.Diagnostics; -using System.IO; using System.Linq; using System.Windows.Forms; -using MetroFramework.Forms; -using PckStudio.Forms.Additional_Popups.EntityForms; -using Newtonsoft.Json.Linq; +using System.Collections.Generic; using OMI.Formats.Behaviour; -using OMI.Workers.Behaviour; -using OMI.Formats.Pck; -using PckStudio.Properties; -using PckStudio.Internal; -using PckStudio.Extensions; -using PckStudio.Internal.Json; +using PckStudio.Controls; using PckStudio.Internal.App; +using PckStudio.Interfaces; +using PckStudio.Forms.Additional_Popups.EntityForms; +using PckStudio.Json; +using PckStudio.Core.Json; namespace PckStudio.Forms.Editor { - public partial class BehaviourEditor : MetroForm + // Behaviours File Format research by Miku and MattNL + public partial class BehaviourEditor : EditorForm { - // Behaviours File Format research by Miku and MattNL - private readonly PckAsset _asset; - BehaviourFile _behaviourFile; + private const string BehaviourEntryDataType = "behaviours"; + private readonly List BehaviourData = Entities.BehaviourInfos; - private readonly List BehaviourData = Entities.BehaviourInfos; + public BehaviourEditor(BehaviourFile behaviourFile, ISaveContext saveContext) + : base(behaviourFile, saveContext) + { + InitializeComponent(); - void SetUpTree() + saveToolStripMenuItem1.Visible = !saveContext.AutoSave; + + treeView1.ImageList = new ImageList(); + treeView1.ImageList.Images.AddRange(ApplicationScope.EntityImages); + treeView1.ImageList.ColorDepth = ColorDepth.Depth32Bit; + SetUpTree(); + } + + void SetUpTree() { treeView1.BeginUpdate(); treeView1.Nodes.Clear(); - foreach (var entry in _behaviourFile.entries) + foreach (BehaviourFile.RiderPositionOverride entry in EditorValue.entries) { - TreeNode EntryNode = new TreeNode(entry.name); + TreeNode entryNode = new TreeNode(entry.name); - var behaviour = BehaviourData.Find(b => b.InternalName == entry.name); - EntryNode.Text = behaviour.DisplayName; - EntryNode.ImageIndex = BehaviourData.IndexOf(behaviour); - EntryNode.SelectedImageIndex = EntryNode.ImageIndex; - EntryNode.Tag = entry; + EntityInfo behaviour = BehaviourData.Find(b => b.InternalName == entry.name); + entryNode.Text = behaviour.DisplayName; + entryNode.ImageIndex = BehaviourData.IndexOf(behaviour); + entryNode.SelectedImageIndex = entryNode.ImageIndex; + entryNode.Tag = entry; - foreach (var posOverride in entry.overrides) + foreach (BehaviourFile.RiderPositionOverride.PositionOverride posOverride in entry.overrides) { - TreeNode OverrideNode = new TreeNode("Position Override"); - OverrideNode.Tag = posOverride; - EntryNode.Nodes.Add(OverrideNode); - OverrideNode.ImageIndex = 103; - OverrideNode.SelectedImageIndex = OverrideNode.ImageIndex; + TreeNode overrideNode = new TreeNode("Position Override"); + overrideNode.Tag = posOverride; + entryNode.Nodes.Add(overrideNode); + overrideNode.ImageIndex = 103; + overrideNode.SelectedImageIndex = overrideNode.ImageIndex; } - treeView1.Nodes.Add(EntryNode); + treeView1.Nodes.Add(entryNode); } treeView1.EndUpdate(); } - public BehaviourEditor(PckAsset asset) - { - InitializeComponent(); - - saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - - _asset = asset; - _behaviourFile = asset.GetData(new BehavioursReader()); - - treeView1.ImageList = new ImageList(); - treeView1.ImageList.Images.AddRange(ApplicationScope.EntityImages); - treeView1.ImageList.ColorDepth = ColorDepth.Depth32Bit; - SetUpTree(); - } - private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (treeView1.SelectedNode is null) @@ -149,13 +138,13 @@ namespace PckStudio.Forms.Editor if (!(treeView1.SelectedNode.Tag is BehaviourFile.RiderPositionOverride entry)) return; - var diag = new AddEntry("behaviours", ApplicationScope.EntityImages); + var diag = new AddEntry(BehaviourEntryDataType, ApplicationScope.EntityImages); if (diag.ShowDialog(this) == DialogResult.OK) { if (string.IsNullOrEmpty(diag.SelectedEntity)) return; - if (_behaviourFile.entries.FindAll(behaviour => behaviour.name == diag.SelectedEntity).Count() > 0) + if (EditorValue.entries.FindAll(behaviour => behaviour.name == diag.SelectedEntity).Count() > 0) { MessageBox.Show(this, "You cannot have two entries for one entity. Please use the \"Add New Position Override\" tool to add multiple overrides for entities", "Error", MessageBoxButtons.OK); return; @@ -186,41 +175,46 @@ namespace PckStudio.Forms.Editor if (treeView1.SelectedNode.Tag is BehaviourFile.RiderPositionOverride.PositionOverride) treeView1.SelectedNode = treeView1.SelectedNode.Parent; - if (treeView1.SelectedNode.Tag is BehaviourFile.RiderPositionOverride) + if (treeView1.SelectedNode.Tag is BehaviourFile.RiderPositionOverride positionOverride) { - TreeNode OverrideNode = new TreeNode("Position Override"); - OverrideNode.Tag = new BehaviourFile.RiderPositionOverride.PositionOverride(); - OverrideNode.ImageIndex = 103; - OverrideNode.SelectedImageIndex = 103; - treeView1.SelectedNode.Nodes.Add(OverrideNode); - } + BehaviourFile.RiderPositionOverride.PositionOverride newPositionOverride = new BehaviourFile.RiderPositionOverride.PositionOverride(); + TreeNode overrideNode = new TreeNode("Position Override"); + overrideNode.Tag = newPositionOverride; + overrideNode.ImageIndex = 103; + overrideNode.SelectedImageIndex = 103; + treeView1.SelectedNode.Nodes.Add(overrideNode); + positionOverride.overrides.Add(newPositionOverride); + } } private void addNewEntryToolStripMenuItem_Click(object sender, EventArgs e) { - var diag = new AddEntry("behaviours", ApplicationScope.EntityImages); + var diag = new AddEntry(BehaviourEntryDataType, ApplicationScope.EntityImages); if(diag.ShowDialog(this) == DialogResult.OK) { if (string.IsNullOrEmpty(diag.SelectedEntity)) return; - if (_behaviourFile.entries.FindAll(behaviour => behaviour.name == diag.SelectedEntity).Count() > 0) + if (EditorValue.entries.FindAll(behaviour => behaviour.name == diag.SelectedEntity).Count() > 0) { MessageBox.Show(this, "You cannot have two entries for one entity. Please use the \"Add New Position Override\" tool to add multiple overrides for entities", "Error", MessageBoxButtons.OK); return; } - BehaviourFile.RiderPositionOverride NewOverride = new BehaviourFile.RiderPositionOverride(diag.SelectedEntity); + BehaviourFile.RiderPositionOverride newOverride = new BehaviourFile.RiderPositionOverride(diag.SelectedEntity); + EditorValue.entries.Add(newOverride); - TreeNode NewOverrideNode = new TreeNode(NewOverride.name); - NewOverrideNode.Tag = NewOverride; + TreeNode newOverrideNode = new TreeNode(newOverride.name); + newOverrideNode.Tag = newOverride; - EntityInfo behaviour = BehaviourData.Find(b => b.InternalName == NewOverride.name); - NewOverrideNode.Text = behaviour.DisplayName; - NewOverrideNode.ImageIndex = BehaviourData.IndexOf(behaviour); - NewOverrideNode.SelectedImageIndex = NewOverrideNode.ImageIndex; + // potentially null de-reference + EntityInfo behaviour = BehaviourData.Find(b => b.InternalName == newOverride.name); - treeView1.Nodes.Add(NewOverrideNode); - treeView1.SelectedNode = NewOverrideNode; + newOverrideNode.Text = behaviour.DisplayName; + newOverrideNode.ImageIndex = BehaviourData.IndexOf(behaviour); + newOverrideNode.SelectedImageIndex = newOverrideNode.ImageIndex; + + treeView1.Nodes.Add(newOverrideNode); + treeView1.SelectedNode = newOverrideNode; addNewPositionOverrideToolStripMenuItem_Click(sender, e); // adds a Position Override to the new Override } @@ -239,36 +233,8 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - _behaviourFile = new BehaviourFile(); - foreach (TreeNode node in treeView1.Nodes) - { - if(node.Tag is BehaviourFile.RiderPositionOverride entry) - { - entry.overrides.Clear(); - Console.WriteLine(); - foreach (TreeNode overrideNode in node.Nodes) - { - if(overrideNode.Tag is BehaviourFile.RiderPositionOverride.PositionOverride overrideEntry) - { - entry.overrides.Add(overrideEntry); - } - } - - _behaviourFile.entries.Add(entry); - } - } - - _asset.SetData(new BehavioursWriter(_behaviourFile)); - + Save(); DialogResult = DialogResult.OK; } - - private void BehaviourEditor_FormClosing(object sender, FormClosingEventArgs e) - { - if (Settings.Default.AutoSaveChanges) - { - saveToolStripMenuItem1_Click(sender, EventArgs.Empty); - } - } } } diff --git a/PCK-Studio/Forms/Editor/BoxEditor.cs b/PCK-Studio/Forms/Editor/BoxEditor.cs index 8af249bf..89443617 100644 --- a/PCK-Studio/Forms/Editor/BoxEditor.cs +++ b/PCK-Studio/Forms/Editor/BoxEditor.cs @@ -1,16 +1,17 @@ using System; using System.Windows.Forms; -using PckStudio.Internal; +using PckStudio.Core.Skin; using PckStudio.Properties; namespace PckStudio.Forms.Editor { public partial class BoxEditor : MetroFramework.Forms.MetroForm { - public string Result; + private SkinBOX result; + public SkinBOX Result => result; - public BoxEditor(string box, bool hasInflation) - : this(SkinBOX.FromString(box), hasInflation) + public BoxEditor(string formattedBoxString, bool hasInflation) + : this(SkinBOX.FromString(formattedBoxString), hasInflation) { } @@ -43,14 +44,14 @@ namespace PckStudio.Forms.Editor private void saveButton_Click(object sender, EventArgs e) { - Result = + result = SkinBOX.FromString( $"{parentComboBox.SelectedItem} " + $"{PosXUpDown.Value} {PosYUpDown.Value} {PosZUpDown.Value} " + $"{SizeXUpDown.Value} {SizeYUpDown.Value} {SizeZUpDown.Value} " + $"{uvXUpDown.Value} {uvYUpDown.Value} " + $"{Convert.ToInt32(armorCheckBox.Checked)} " + $"{Convert.ToInt32(mirrorCheckBox.Checked)} " + - $"{inflationUpDown.Value}"; + $"{inflationUpDown.Value}"); DialogResult = DialogResult.OK; } diff --git a/PCK-Studio/Forms/Editor/COLEditor.Designer.cs b/PCK-Studio/Forms/Editor/COLEditor.Designer.cs index 30338f00..ef808db5 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.Designer.cs @@ -547,7 +547,6 @@ namespace PckStudio.Forms.Editor this.Name = "COLEditor"; this.Style = MetroFramework.MetroColorStyle.Silver; this.Theme = MetroFramework.MetroThemeStyle.Dark; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.COLEditor_FormClosing); this.metroPanel1.ResumeLayout(false); this.metroPanel1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.blueUpDown)).EndInit(); diff --git a/PCK-Studio/Forms/Editor/COLEditor.cs b/PCK-Studio/Forms/Editor/COLEditor.cs index 73966b8a..b36c01a7 100644 --- a/PCK-Studio/Forms/Editor/COLEditor.cs +++ b/PCK-Studio/Forms/Editor/COLEditor.cs @@ -8,32 +8,39 @@ using MetroFramework.Forms; using OMI.Formats.Color; using OMI.Formats.Pck; using OMI.Workers.Color; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using PckStudio.Properties; +using PckStudio.Controls; +using PckStudio.Interfaces; +using System.Collections.ObjectModel; namespace PckStudio.Forms.Editor { - public partial class COLEditor : MetroForm + public partial class COLEditor : EditorForm { ColorContainer _defaultColourfile; - ColorContainer _colourfile; string _clipboard_color = "#FFFFFF"; - private readonly PckAsset _asset; - List colorCache = new List(); List waterCache = new List(); List underwaterCache = new List(); List fogCache = new List(); - public COLEditor(PckAsset asset) + private static readonly ICollection PS4Biomes = new List + { + "bamboo_jungle", + "bamboo_jungle_hills", + "mesa_mutated", + "mega_spruce_taiga_mutated", + "mega_taiga_mutated" + }; + + public COLEditor(ColorContainer colorContainer, ISaveContext saveContext) + : base(colorContainer, saveContext) { InitializeComponent(); - saveToolStripMenuItem1.Visible = !Settings.Default.AutoSaveChanges; - - _asset = asset; - _colourfile = asset.GetData(new COLFileReader()); + saveToolStripMenuItem1.Visible = !saveContext.AutoSave; TU12ToolStripMenuItem.Click += (sender, e) => SetUpDefaultFile(sender, e, 0); TU13ToolStripMenuItem.Click += (sender, e) => SetUpDefaultFile(sender, e, 1); @@ -111,9 +118,9 @@ namespace PckStudio.Forms.Editor underwaterTreeView.Nodes.Clear(); fogTreeView.Nodes.Clear(); - ColorContainer temp = targetVersion ? _defaultColourfile : _colourfile; + ColorContainer temp = targetVersion ? _defaultColourfile : EditorValue; - List CurrentEntries = new List(); + List currentEntries = new List(); colorCache.Clear(); fogCache.Clear(); @@ -123,33 +130,33 @@ namespace PckStudio.Forms.Editor // fixes the duplicate entry bug if (targetVersion) { - foreach(ColorContainer.Color col in _colourfile.Colors) + foreach(ColorContainer.Color col in EditorValue.Colors) { if (_defaultColourfile.Colors.Find(c => c.Name == col.Name) == null) continue; - CurrentEntries.Add(col.Name); + currentEntries.Add(col.Name); AddEntry(colorTreeView, colorCache, col.Name, col); } } foreach (ColorContainer.Color col in temp.Colors) { - ColorContainer.Color entry = _colourfile.Colors.Find(color => color.Name == col.Name); - if (CurrentEntries.Contains(col.Name)) + ColorContainer.Color entry = EditorValue.Colors.Find(color => color.Name == col.Name); + if (currentEntries.Contains(col.Name)) continue; ColorContainer.Color color = entry ?? col; AddEntry(colorTreeView, colorCache, color.Name, color); } - CurrentEntries.Clear(); + currentEntries.Clear(); // fixes the duplicate entry bug if (targetVersion) { - foreach (ColorContainer.WaterColor col in _colourfile.WaterColors) + foreach (ColorContainer.WaterColor col in EditorValue.WaterColors) { if (_defaultColourfile.WaterColors.Find(c => c.Name == col.Name) == null) continue; - ColorContainer.WaterColor entry = _colourfile.WaterColors.Find(color => color.Name == col.Name); + ColorContainer.WaterColor entry = EditorValue.WaterColors.Find(color => color.Name == col.Name); ColorContainer.WaterColor color = entry ?? col; AddEntry(waterTreeView, waterCache, color.Name, color); AddEntry(underwaterTreeView, underwaterCache, color.Name, color); @@ -159,8 +166,8 @@ namespace PckStudio.Forms.Editor foreach (ColorContainer.WaterColor col in temp.WaterColors) { - ColorContainer.WaterColor entry = _colourfile.WaterColors.Find(color => color.Name == col.Name); - if (CurrentEntries.Contains(col.Name)) + ColorContainer.WaterColor entry = EditorValue.WaterColors.Find(color => color.Name == col.Name); + if (currentEntries.Contains(col.Name)) continue; ColorContainer.WaterColor color = entry ?? col; AddEntry(waterTreeView, waterCache, color.Name, color); @@ -201,14 +208,14 @@ namespace PckStudio.Forms.Editor fogTreeView.SelectedNode = null; var colorEntry = (ColorContainer.Color)colorTreeView.SelectedNode.Tag; - var color = colorEntry.ColorPallette.ToArgb(); + Color color = colorEntry.ColorPallette; SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; - redUpDown.Value = color >> 16 & 0xff; - greenUpDown.Value = color >> 8 & 0xff; - blueUpDown.Value = color & 0xff; - pictureBox1.BackColor = Color.FromArgb(0xff << 24 | color); + redUpDown.Value = color.R; + greenUpDown.Value = color.G; + blueUpDown.Value = color.B; + pictureBox1.BackColor = Color.FromArgb(0xff, color); colorTextbox.Text = ColorTranslator.ToHtml(colorEntry.ColorPallette).TrimStart('#'); SetUpValueChanged(true); } @@ -226,15 +233,17 @@ namespace PckStudio.Forms.Editor fogTreeView.SelectedNode = null; var colorEntry = (ColorContainer.WaterColor)waterTreeView.SelectedNode.Tag; - int color = colorEntry.SurfaceColor.ToArgb(); + Color color = colorEntry.SurfaceColor; SetUpValueChanged(false); + + alphaUpDown.Value = color.A; + redUpDown.Value = color.R; + greenUpDown.Value = color.G; + blueUpDown.Value = color.B; + alphaUpDown.Enabled = true; alphaUpDown.Visible = true; alphaLabel.Visible = true; - alphaUpDown.Value = color >> 24 & 0xff; - redUpDown.Value = color >> 16 & 0xff; - greenUpDown.Value = color >> 8 & 0xff; - blueUpDown.Value = color & 0xff; pictureBox1.BackColor = colorEntry.SurfaceColor; colorTextbox.Text = ColorTranslator.ToHtml(colorEntry.SurfaceColor).TrimStart('#'); SetUpValueChanged(true); @@ -253,14 +262,14 @@ namespace PckStudio.Forms.Editor fogTreeView.SelectedNode = null; var colorEntry = (ColorContainer.WaterColor)underwaterTreeView.SelectedNode.Tag; - int color = colorEntry.UnderwaterColor.ToArgb(); + Color color = colorEntry.UnderwaterColor; SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; - redUpDown.Value = color >> 16 & 0xff; - greenUpDown.Value = color >> 8 & 0xff; - blueUpDown.Value = color & 0xff; - pictureBox1.BackColor = Color.FromArgb(255, Color.FromArgb(0xff << 24 | color)); + redUpDown.Value = color.R; + greenUpDown.Value = color.G; + blueUpDown.Value = color.B; + pictureBox1.BackColor = Color.FromArgb(0xff, color); colorTextbox.Text = ColorTranslator.ToHtml(colorEntry.UnderwaterColor).TrimStart('#'); SetUpValueChanged(true); } @@ -278,22 +287,21 @@ namespace PckStudio.Forms.Editor underwaterTreeView.SelectedNode = null; var colorEntry = (ColorContainer.WaterColor)fogTreeView.SelectedNode.Tag; - int color = colorEntry.FogColor.ToArgb(); + Color color = colorEntry.FogColor; SetUpValueChanged(false); alphaUpDown.Visible = false; alphaLabel.Visible = false; - redUpDown.Value = color >> 16 & 0xff; - greenUpDown.Value = color >> 8 & 0xff; - blueUpDown.Value = color & 0xff; - pictureBox1.BackColor = Color.FromArgb(255, Color.FromArgb(0xff << 24 | color)); + redUpDown.Value = color.R; + greenUpDown.Value = color.G; + blueUpDown.Value = color.B; + pictureBox1.BackColor = Color.FromArgb(0xff, color); colorTextbox.Text = ColorTranslator.ToHtml(colorEntry.FogColor).TrimStart('#'); SetUpValueChanged(true); } private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - _asset.SetData(new COLFileWriter(_colourfile)); - + Save(); DialogResult = DialogResult.OK; } @@ -485,14 +493,14 @@ namespace PckStudio.Forms.Editor } else { - ColorContainer.WaterColor WaterEntry = _defaultColourfile.WaterColors.Find(color => color.Name == node.Text); + ColorContainer.WaterColor waterEntry = _defaultColourfile.WaterColors.Find(color => color.Name == node.Text); - if (WaterEntry == null) + if (waterEntry == null) return; color = - tab == waterTab ? WaterEntry.SurfaceColor : - tab == underwaterTab ? WaterEntry.UnderwaterColor : WaterEntry.FogColor; + tab == waterTab ? waterEntry.SurfaceColor : + tab == underwaterTab ? waterEntry.UnderwaterColor : waterEntry.FogColor; if (tab == waterTab) { @@ -523,52 +531,52 @@ namespace PckStudio.Forms.Editor fogTreeView.Nodes.Clear(); if (!string.IsNullOrEmpty(metroTextBox1.Text)) { - foreach (TreeNode _node in colorCache) + foreach (TreeNode node in colorCache) { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + if (node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) { - colorTreeView.Nodes.Add((TreeNode)_node.Clone()); + colorTreeView.Nodes.Add((TreeNode)node.Clone()); } } - foreach (TreeNode _node in waterCache) + foreach (TreeNode node in waterCache) { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + if (node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) { - waterTreeView.Nodes.Add((TreeNode)_node.Clone()); + waterTreeView.Nodes.Add((TreeNode)node.Clone()); } } - foreach (TreeNode _node in underwaterCache) + foreach (TreeNode node in underwaterCache) { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + if (node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) { - underwaterTreeView.Nodes.Add((TreeNode)_node.Clone()); + underwaterTreeView.Nodes.Add((TreeNode)node.Clone()); } } - foreach (TreeNode _node in fogCache) + foreach (TreeNode node in fogCache) { - if (_node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) + if (node.Text.ToLower().Contains(metroTextBox1.Text.ToLower())) { - fogTreeView.Nodes.Add((TreeNode)_node.Clone()); + fogTreeView.Nodes.Add((TreeNode)node.Clone()); } } } else { - foreach (TreeNode _node in colorCache) + foreach (TreeNode node in colorCache) { - colorTreeView.Nodes.Add((TreeNode)_node.Clone()); + colorTreeView.Nodes.Add((TreeNode)node.Clone()); } - foreach (TreeNode _node in waterCache) + foreach (TreeNode node in waterCache) { - waterTreeView.Nodes.Add((TreeNode)_node.Clone()); + waterTreeView.Nodes.Add((TreeNode)node.Clone()); } - foreach (TreeNode _node in underwaterCache) + foreach (TreeNode node in underwaterCache) { - underwaterTreeView.Nodes.Add((TreeNode)_node.Clone()); + underwaterTreeView.Nodes.Add((TreeNode)node.Clone()); } - foreach (TreeNode _node in fogCache) + foreach (TreeNode node in fogCache) { - fogTreeView.Nodes.Add((TreeNode)_node.Clone()); + fogTreeView.Nodes.Add((TreeNode)node.Clone()); } } //enables redrawing tree after all objects have been added @@ -588,14 +596,6 @@ namespace PckStudio.Forms.Editor colorTextbox.Text = _clipboard_color; } - private void COLEditor_FormClosing(object sender, FormClosingEventArgs e) - { - if (Settings.Default.AutoSaveChanges) - { - saveToolStripMenuItem1_Click(sender, EventArgs.Empty); - } - } - private void colorTextbox_KeyPress(object sender, KeyPressEventArgs e) { string hexCheck = "0123456789abcdefABCDEF\b"; @@ -605,21 +605,12 @@ namespace PckStudio.Forms.Editor private void stripPS4BiomesToolStripMenuItem_Click(object sender, EventArgs e) { - if(_colourfile.WaterColors.Count > 0) + if(EditorValue.WaterColors.Count > 0) { - List PS4Biomes = new List - { - "bamboo_jungle", - "bamboo_jungle_hills", - "mesa_mutated", - "mega_spruce_taiga_mutated", - "mega_taiga_mutated" - }; - - foreach (ColorContainer.WaterColor col in _colourfile.WaterColors.ToList()) + foreach (ColorContainer.WaterColor col in EditorValue.WaterColors.ToList()) { if (PS4Biomes.Contains(col.Name)) - _colourfile.WaterColors.Remove(col); + EditorValue.WaterColors.Remove(col); } SetUpTable(false); @@ -640,12 +631,12 @@ namespace PckStudio.Forms.Editor entry.Name = prompt.NewText; entry.ColorPallette = Color.FromArgb(0xFFFFFF); - if(_colourfile.Colors.Find(c => c.Name == entry.Name) != null) + if(EditorValue.Colors.Find(c => c.Name == entry.Name) != null) { MessageBox.Show(this, $"\"{entry.Name}\" already exists in this color table", "Color not added"); } - _colourfile.Colors.Add(entry); + EditorValue.Colors.Add(entry); AddEntry(colorTreeView, colorCache, entry.Name, entry); } } @@ -659,7 +650,7 @@ namespace PckStudio.Forms.Editor && entry != null && entry.Tag is ColorContainer.Color color) { - _colourfile.Colors.Remove(color); + EditorValue.Colors.Remove(color); RemoveEntry(entry, colorCache); } } diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs new file mode 100644 index 00000000..6f4df1c4 --- /dev/null +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs @@ -0,0 +1,446 @@ +namespace PckStudio.Forms.Editor +{ + partial class CustomSkinEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.GroupBox groupBox1; + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomSkinEditor)); + this.sizeLabel = new System.Windows.Forms.Label(); + this.positionLabel = new System.Windows.Forms.Label(); + this.uvLabel = new System.Windows.Forms.Label(); + this.importTextureButton = new MetroFramework.Controls.MetroButton(); + this.exportTextureButton = new MetroFramework.Controls.MetroButton(); + this.skinPartTabContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cloneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.generateUvTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.buttonDone = new MetroFramework.Controls.MetroButton(); + this.importSkinButton = new MetroFramework.Controls.MetroButton(); + this.exportSkinButton = new MetroFramework.Controls.MetroButton(); + this.outlineColorButton = new MetroFramework.Controls.MetroButton(); + this.generateTextureCheckBox = new MetroFramework.Controls.MetroCheckBox(); + this.showArmorCheckbox = new MetroFramework.Controls.MetroCheckBox(); + this.skinPartListBox = new System.Windows.Forms.ListBox(); + this.captureScreenshotButton = new MetroFramework.Controls.MetroButton(); + this.showToolsCheckBox = new MetroFramework.Controls.MetroCheckBox(); + this.skinNameLabel = new MetroFramework.Controls.MetroLabel(); + this.metroTabControl1 = new MetroFramework.Controls.MetroTabControl(); + this.skinPartsTabPage = new System.Windows.Forms.TabPage(); + this.skinOffsetsTabPage = new System.Windows.Forms.TabPage(); + this.offsetListBox = new System.Windows.Forms.ListBox(); + this.offsetTabContextMenu = new MetroFramework.Controls.MetroContextMenu(this.components); + this.addOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.renderer3D1 = new PckStudio.Rendering.SkinRenderer(); + this.uvPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); + this.centerSelectionCheckbox = new MetroFramework.Controls.MetroCheckBox(); + this.textureSizeLabel = new System.Windows.Forms.Label(); + this.renderSettingsButton = new MetroFramework.Controls.MetroButton(); + this.exportTemplateButton = new MetroFramework.Controls.MetroButton(); + this.animEditorButton = new MetroFramework.Controls.MetroButton(); + groupBox1 = new System.Windows.Forms.GroupBox(); + groupBox1.SuspendLayout(); + this.skinPartTabContextMenu.SuspendLayout(); + this.metroTabControl1.SuspendLayout(); + this.skinPartsTabPage.SuspendLayout(); + this.skinOffsetsTabPage.SuspendLayout(); + this.offsetTabContextMenu.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.uvPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // groupBox1 + // + resources.ApplyResources(groupBox1, "groupBox1"); + groupBox1.Controls.Add(this.sizeLabel); + groupBox1.Controls.Add(this.positionLabel); + groupBox1.Controls.Add(this.uvLabel); + groupBox1.ForeColor = System.Drawing.SystemColors.Control; + groupBox1.Name = "groupBox1"; + groupBox1.TabStop = false; + // + // sizeLabel + // + resources.ApplyResources(this.sizeLabel, "sizeLabel"); + this.sizeLabel.ForeColor = System.Drawing.Color.White; + this.sizeLabel.Name = "sizeLabel"; + // + // positionLabel + // + resources.ApplyResources(this.positionLabel, "positionLabel"); + this.positionLabel.ForeColor = System.Drawing.Color.White; + this.positionLabel.Name = "positionLabel"; + // + // uvLabel + // + resources.ApplyResources(this.uvLabel, "uvLabel"); + this.uvLabel.ForeColor = System.Drawing.Color.White; + this.uvLabel.Name = "uvLabel"; + // + // importTextureButton + // + resources.ApplyResources(this.importTextureButton, "importTextureButton"); + this.importTextureButton.ForeColor = System.Drawing.Color.White; + this.importTextureButton.Name = "importTextureButton"; + this.importTextureButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.importTextureButton.UseSelectable = true; + this.importTextureButton.Click += new System.EventHandler(this.importTextureButton_Click); + // + // exportTextureButton + // + resources.ApplyResources(this.exportTextureButton, "exportTextureButton"); + this.exportTextureButton.ForeColor = System.Drawing.Color.White; + this.exportTextureButton.Name = "exportTextureButton"; + this.exportTextureButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.exportTextureButton.UseSelectable = true; + this.exportTextureButton.Click += new System.EventHandler(this.exportTextureButton_Click); + // + // skinPartTabContextMenu + // + this.skinPartTabContextMenu.ImageScalingSize = new System.Drawing.Size(20, 20); + this.skinPartTabContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createToolStripMenuItem, + this.cloneToolStripMenuItem, + this.deleteToolStripMenuItem, + this.generateUvTextureToolStripMenuItem}); + this.skinPartTabContextMenu.Name = "contextMenuStrip1"; + resources.ApplyResources(this.skinPartTabContextMenu, "skinPartTabContextMenu"); + // + // createToolStripMenuItem + // + resources.ApplyResources(this.createToolStripMenuItem, "createToolStripMenuItem"); + this.createToolStripMenuItem.Name = "createToolStripMenuItem"; + this.createToolStripMenuItem.Click += new System.EventHandler(this.createToolStripMenuItem_Click); + // + // cloneToolStripMenuItem + // + resources.ApplyResources(this.cloneToolStripMenuItem, "cloneToolStripMenuItem"); + this.cloneToolStripMenuItem.Name = "cloneToolStripMenuItem"; + this.cloneToolStripMenuItem.Click += new System.EventHandler(this.cloneToolStripMenuItem_Click); + // + // deleteToolStripMenuItem + // + resources.ApplyResources(this.deleteToolStripMenuItem, "deleteToolStripMenuItem"); + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // generateUvTextureToolStripMenuItem + // + resources.ApplyResources(this.generateUvTextureToolStripMenuItem, "generateUvTextureToolStripMenuItem"); + this.generateUvTextureToolStripMenuItem.Name = "generateUvTextureToolStripMenuItem"; + this.generateUvTextureToolStripMenuItem.Click += new System.EventHandler(this.generateUvTextureToolStripMenuItem_Click); + // + // buttonDone + // + resources.ApplyResources(this.buttonDone, "buttonDone"); + this.buttonDone.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonDone.ForeColor = System.Drawing.Color.White; + this.buttonDone.Name = "buttonDone"; + this.buttonDone.Theme = MetroFramework.MetroThemeStyle.Dark; + this.buttonDone.UseSelectable = true; + this.buttonDone.Click += new System.EventHandler(this.buttonDone_Click); + // + // importSkinButton + // + resources.ApplyResources(this.importSkinButton, "importSkinButton"); + this.importSkinButton.ForeColor = System.Drawing.Color.White; + this.importSkinButton.Name = "importSkinButton"; + this.importSkinButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.importSkinButton.UseSelectable = true; + this.importSkinButton.Click += new System.EventHandler(this.importSkinButton_Click); + // + // exportSkinButton + // + resources.ApplyResources(this.exportSkinButton, "exportSkinButton"); + this.exportSkinButton.ForeColor = System.Drawing.Color.White; + this.exportSkinButton.Name = "exportSkinButton"; + this.exportSkinButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.exportSkinButton.UseSelectable = true; + this.exportSkinButton.Click += new System.EventHandler(this.exportSkinButton_Click); + // + // outlineColorButton + // + resources.ApplyResources(this.outlineColorButton, "outlineColorButton"); + this.outlineColorButton.ForeColor = System.Drawing.Color.White; + this.outlineColorButton.Name = "outlineColorButton"; + this.outlineColorButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.outlineColorButton.UseSelectable = true; + this.outlineColorButton.Click += new System.EventHandler(this.outlineColorButton_Click); + // + // generateTextureCheckBox + // + resources.ApplyResources(this.generateTextureCheckBox, "generateTextureCheckBox"); + this.generateTextureCheckBox.Name = "generateTextureCheckBox"; + this.generateTextureCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.generateTextureCheckBox.UseSelectable = true; + // + // showArmorCheckbox + // + resources.ApplyResources(this.showArmorCheckbox, "showArmorCheckbox"); + this.showArmorCheckbox.Name = "showArmorCheckbox"; + this.showArmorCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.showArmorCheckbox.UseSelectable = true; + this.showArmorCheckbox.CheckedChanged += new System.EventHandler(this.showArmorCheckbox_CheckedChanged); + // + // skinPartListBox + // + this.skinPartListBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.skinPartListBox.ContextMenuStrip = this.skinPartTabContextMenu; + resources.ApplyResources(this.skinPartListBox, "skinPartListBox"); + this.skinPartListBox.FormattingEnabled = true; + this.skinPartListBox.Name = "skinPartListBox"; + this.skinPartListBox.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.skinPartListBox.Tag = ""; + this.skinPartListBox.MouseClick += new System.Windows.Forms.MouseEventHandler(this.skinPartListBox_MouseClick); + this.skinPartListBox.SelectedIndexChanged += new System.EventHandler(this.skinPartListBox_SelectedIndexChanged); + this.skinPartListBox.DoubleClick += new System.EventHandler(this.skinPartListBox_DoubleClick); + this.skinPartListBox.KeyUp += new System.Windows.Forms.KeyEventHandler(this.skinPartListBox_KeyUp); + // + // captureScreenshotButton + // + resources.ApplyResources(this.captureScreenshotButton, "captureScreenshotButton"); + this.captureScreenshotButton.ForeColor = System.Drawing.Color.White; + this.captureScreenshotButton.Name = "captureScreenshotButton"; + this.captureScreenshotButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.captureScreenshotButton.UseSelectable = true; + this.captureScreenshotButton.Click += new System.EventHandler(this.captureScreenshotButton_Click); + // + // showToolsCheckBox + // + resources.ApplyResources(this.showToolsCheckBox, "showToolsCheckBox"); + this.showToolsCheckBox.Name = "showToolsCheckBox"; + this.showToolsCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.showToolsCheckBox.UseSelectable = true; + // + // skinNameLabel + // + resources.ApplyResources(this.skinNameLabel, "skinNameLabel"); + this.skinNameLabel.Name = "skinNameLabel"; + this.skinNameLabel.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // metroTabControl1 + // + resources.ApplyResources(this.metroTabControl1, "metroTabControl1"); + this.metroTabControl1.Controls.Add(this.skinPartsTabPage); + this.metroTabControl1.Controls.Add(this.skinOffsetsTabPage); + this.metroTabControl1.Multiline = true; + this.metroTabControl1.Name = "metroTabControl1"; + this.metroTabControl1.SelectedIndex = 0; + this.metroTabControl1.Style = MetroFramework.MetroColorStyle.Pink; + this.metroTabControl1.Theme = MetroFramework.MetroThemeStyle.Dark; + this.metroTabControl1.UseSelectable = true; + // + // skinPartsTabPage + // + this.skinPartsTabPage.Controls.Add(this.skinPartListBox); + resources.ApplyResources(this.skinPartsTabPage, "skinPartsTabPage"); + this.skinPartsTabPage.Name = "skinPartsTabPage"; + // + // skinOffsetsTabPage + // + this.skinOffsetsTabPage.Controls.Add(this.offsetListBox); + resources.ApplyResources(this.skinOffsetsTabPage, "skinOffsetsTabPage"); + this.skinOffsetsTabPage.Name = "skinOffsetsTabPage"; + // + // offsetListBox + // + this.offsetListBox.ContextMenuStrip = this.offsetTabContextMenu; + resources.ApplyResources(this.offsetListBox, "offsetListBox"); + this.offsetListBox.FormattingEnabled = true; + this.offsetListBox.Name = "offsetListBox"; + this.offsetListBox.DoubleClick += new System.EventHandler(this.offsetListBox_DoubleClick); + // + // offsetTabContextMenu + // + this.offsetTabContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addOffsetToolStripMenuItem, + this.removeOffsetToolStripMenuItem}); + this.offsetTabContextMenu.Name = "offsetTabContextMenu"; + resources.ApplyResources(this.offsetTabContextMenu, "offsetTabContextMenu"); + this.offsetTabContextMenu.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // addOffsetToolStripMenuItem + // + this.addOffsetToolStripMenuItem.Name = "addOffsetToolStripMenuItem"; + resources.ApplyResources(this.addOffsetToolStripMenuItem, "addOffsetToolStripMenuItem"); + this.addOffsetToolStripMenuItem.Click += new System.EventHandler(this.addOffsetToolStripMenuItem_Click); + // + // removeOffsetToolStripMenuItem + // + this.removeOffsetToolStripMenuItem.Name = "removeOffsetToolStripMenuItem"; + resources.ApplyResources(this.removeOffsetToolStripMenuItem, "removeOffsetToolStripMenuItem"); + this.removeOffsetToolStripMenuItem.Click += new System.EventHandler(this.removeOffsetToolStripMenuItem_Click); + // + // renderer3D1 + // + resources.ApplyResources(this.renderer3D1, "renderer3D1"); + this.renderer3D1.Animate = true; + this.renderer3D1.BackColor = System.Drawing.Color.DimGray; + this.renderer3D1.CapeTexture = null; + this.renderer3D1.CenterOnSelect = false; + this.renderer3D1.GuideLineColor = System.Drawing.Color.Empty; + this.renderer3D1.HighlightlingColor = System.Drawing.Color.Aqua; + this.renderer3D1.MouseSensetivity = 0.01F; + this.renderer3D1.Name = "renderer3D1"; + this.renderer3D1.RefreshRate = 60; + this.renderer3D1.SelectedIndex = -1; + this.renderer3D1.SelectedIndices = new int[] { + -1}; + this.renderer3D1.ShowArmor = false; + this.renderer3D1.ShowBoundingBox = false; + this.renderer3D1.ShowGuideLines = false; + this.renderer3D1.Texture = null; + this.renderer3D1.VSync = true; + this.renderer3D1.TextureChanging += new System.EventHandler(this.renderer3D1_TextureChanging); + // + // uvPictureBox + // + resources.ApplyResources(this.uvPictureBox, "uvPictureBox"); + this.uvPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.uvPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; + this.uvPictureBox.Name = "uvPictureBox"; + this.uvPictureBox.TabStop = false; + // + // centerSelectionCheckbox + // + resources.ApplyResources(this.centerSelectionCheckbox, "centerSelectionCheckbox"); + this.centerSelectionCheckbox.Name = "centerSelectionCheckbox"; + this.centerSelectionCheckbox.Theme = MetroFramework.MetroThemeStyle.Dark; + this.centerSelectionCheckbox.UseSelectable = true; + this.centerSelectionCheckbox.CheckedChanged += new System.EventHandler(this.centerSelectionCheckbox_CheckedChanged); + // + // textureSizeLabel + // + resources.ApplyResources(this.textureSizeLabel, "textureSizeLabel"); + this.textureSizeLabel.ForeColor = System.Drawing.Color.White; + this.textureSizeLabel.Name = "textureSizeLabel"; + // + // renderSettingsButton + // + resources.ApplyResources(this.renderSettingsButton, "renderSettingsButton"); + this.renderSettingsButton.Name = "renderSettingsButton"; + this.renderSettingsButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.renderSettingsButton.UseSelectable = true; + this.renderSettingsButton.Click += new System.EventHandler(this.renderSettingsButton_Click); + // + // exportTemplateButton + // + resources.ApplyResources(this.exportTemplateButton, "exportTemplateButton"); + this.exportTemplateButton.ForeColor = System.Drawing.Color.White; + this.exportTemplateButton.Name = "exportTemplateButton"; + this.exportTemplateButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.exportTemplateButton.UseSelectable = true; + this.exportTemplateButton.Click += new System.EventHandler(this.exportTemplateButton_Click); + // + // animEditorButton + // + resources.ApplyResources(this.animEditorButton, "animEditorButton"); + this.animEditorButton.Name = "animEditorButton"; + this.animEditorButton.Theme = MetroFramework.MetroThemeStyle.Dark; + this.animEditorButton.UseSelectable = true; + this.animEditorButton.Click += new System.EventHandler(this.animEditorButton_Click); + // + // CustomSkinEditor + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.exportTextureButton); + this.Controls.Add(this.importTextureButton); + this.Controls.Add(this.textureSizeLabel); + this.Controls.Add(groupBox1); + this.Controls.Add(this.showToolsCheckBox); + this.Controls.Add(this.centerSelectionCheckbox); + this.Controls.Add(this.showArmorCheckbox); + this.Controls.Add(this.generateTextureCheckBox); + this.Controls.Add(this.outlineColorButton); + this.Controls.Add(this.uvPictureBox); + this.Controls.Add(this.animEditorButton); + this.Controls.Add(this.exportTemplateButton); + this.Controls.Add(this.renderSettingsButton); + this.Controls.Add(this.metroTabControl1); + this.Controls.Add(this.skinNameLabel); + this.Controls.Add(this.captureScreenshotButton); + this.Controls.Add(this.renderer3D1); + this.Controls.Add(this.exportSkinButton); + this.Controls.Add(this.importSkinButton); + this.Controls.Add(this.buttonDone); + this.Name = "CustomSkinEditor"; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.CustomSkinEditor_FormClosing); + groupBox1.ResumeLayout(false); + groupBox1.PerformLayout(); + this.skinPartTabContextMenu.ResumeLayout(false); + this.metroTabControl1.ResumeLayout(false); + this.skinPartsTabPage.ResumeLayout(false); + this.skinOffsetsTabPage.ResumeLayout(false); + this.offsetTabContextMenu.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.uvPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.ContextMenuStrip skinPartTabContextMenu; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cloneToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem generateUvTextureToolStripMenuItem; + private MetroFramework.Controls.MetroButton buttonDone; + private MetroFramework.Controls.MetroButton outlineColorButton; + private MetroFramework.Controls.MetroButton exportSkinButton; + private MetroFramework.Controls.MetroButton importSkinButton; + private PckStudio.ToolboxItems.InterpolationPictureBox uvPictureBox; + private MetroFramework.Controls.MetroButton importTextureButton; + private MetroFramework.Controls.MetroButton exportTextureButton; + private MetroFramework.Controls.MetroCheckBox generateTextureCheckBox; + private MetroFramework.Controls.MetroCheckBox showArmorCheckbox; + private Rendering.SkinRenderer renderer3D1; + private System.Windows.Forms.ListBox skinPartListBox; + private MetroFramework.Controls.MetroButton captureScreenshotButton; + private MetroFramework.Controls.MetroCheckBox showToolsCheckBox; + private MetroFramework.Controls.MetroLabel skinNameLabel; + private MetroFramework.Controls.MetroTabControl metroTabControl1; + private System.Windows.Forms.TabPage skinPartsTabPage; + private System.Windows.Forms.TabPage skinOffsetsTabPage; + private System.Windows.Forms.ListBox offsetListBox; + private MetroFramework.Controls.MetroContextMenu offsetTabContextMenu; + private System.Windows.Forms.ToolStripMenuItem addOffsetToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeOffsetToolStripMenuItem; + private MetroFramework.Controls.MetroCheckBox centerSelectionCheckbox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label sizeLabel; + private System.Windows.Forms.Label uvLabel; + private System.Windows.Forms.Label textureSizeLabel; + private MetroFramework.Controls.MetroButton renderSettingsButton; + private MetroFramework.Controls.MetroButton exportTemplateButton; + private MetroFramework.Controls.MetroButton animEditorButton; + } +} \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs new file mode 100644 index 00000000..8b39c40d --- /dev/null +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs @@ -0,0 +1,481 @@ +using System; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Drawing.Imaging; +using System.Drawing.Drawing2D; +using System.Collections.Generic; + +using PckStudio.Controls; +using PckStudio.Properties; +using PckStudio.Forms.Additional_Popups; + +using PckStudio.Core.Skin; +using PckStudio.Core.Extensions; +using PckStudio.Interfaces; +using PckStudio.ModelSupport; +using PckStuido.ModelSupport.Extension; + +namespace PckStudio.Forms.Editor +{ + public partial class CustomSkinEditor : EditorForm + { + private const float cOffsetMaximum = 100_000f; + private Random _rng; + private bool _inflateOverlayParts; + private bool _allowInflate; + + private BindingSource _skinPartListBindingSource; + private BindingSource _skinOffsetListBindingSource; + + private Core.App.SettingsManager _settingsManager; + + private static GraphicsConfig _graphicsConfig = new GraphicsConfig() + { + InterpolationMode = InterpolationMode.NearestNeighbor, + PixelOffsetMode = PixelOffsetMode.HighQuality, + }; + + private CustomSkinEditor() : this(null, null) + { } + + public CustomSkinEditor(Skin skin, ISaveContext saveContext, bool inflateOverlayParts = false, bool allowInflate = false) + : base(skin, saveContext) + { + InitializeComponent(); + InitializeRenderSettings(); + _rng = new Random(); + _skinPartListBindingSource = new BindingSource(renderer3D1.ModelData, null); + skinPartListBox.DataSource = _skinPartListBindingSource; + skinPartListBox.DisplayMember = "Type"; + _allowInflate = allowInflate; + _inflateOverlayParts = inflateOverlayParts; + } + + private void InitializeRenderSettings() + { + _settingsManager = Core.App.SettingsManager.CreateSettings(); + _settingsManager.AddSetting("shouldAnimate" , true , "Animate skin" , state => renderer3D1.Animate = state); + _settingsManager.AddSetting("lockMouse" , true , "Lock mouse when paning/rotating", state => renderer3D1.LockMousePosition = state); + _settingsManager.AddSetting("showGuidelines" , false, "Show guidelines" , state => renderer3D1.ShowGuideLines = state); + _settingsManager.AddSetting("showBoundingBox", false, "Show Bounding Box" , state => renderer3D1.ShowBoundingBox = state); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + renderer3D1.Initialize(_inflateOverlayParts); + renderer3D1.GuideLineColor = Color.LightCoral; + skinNameLabel.Text = EditorValue.MetaData.Name; + if (EditorValue.HasCape) + renderer3D1.CapeTexture = EditorValue.CapeTexture; + LoadModelData(); + } + + protected override bool ProcessDialogKey(Keys keyData) + { + if (keyData == Keys.A) + { + using var animeditor = new ANIMEditor(EditorValue.Anim); + if (animeditor.ShowDialog() == DialogResult.OK) + { + renderer3D1.ANIM = EditorValue.Anim = animeditor.ResultAnim; + skinPartListBox_SelectedIndexChanged(this, EventArgs.Empty); + } + return true; + } + return base.ProcessDialogKey(keyData); + } + + private void LoadModelData() + { + SkinModel modelInfo = EditorValue.Model; + + List boxProperties = modelInfo.AdditionalBoxes; + List offsetProperties = modelInfo.PartOffsets; + + renderer3D1.ANIM = EditorValue.Anim; + + renderer3D1.ModelData.Clear(); + foreach (SkinBOX box in boxProperties) + { + renderer3D1.ModelData.Add(box); + } + renderer3D1.ResetOffsets(); + foreach (SkinPartOffset offset in offsetProperties) + { + renderer3D1.SetPartOffset(offset); + } + + if (EditorValue.Texture is not null) + { + renderer3D1.Texture = EditorValue.Texture; + } + + if (EditorValue.Texture is null && renderer3D1.Texture is not null) + { + EditorValue.Texture = renderer3D1.Texture; + } + + _skinOffsetListBindingSource = new BindingSource(renderer3D1.GetOffsets().ToArray(), null); + offsetListBox.DataSource = _skinOffsetListBindingSource; + offsetListBox.DisplayMember = "Type"; + offsetListBox.ValueMember = "Value"; + + _skinPartListBindingSource.ResetBindings(false); + _skinOffsetListBindingSource.ResetBindings(false); + } + + private void GenerateUVTextureMap(SkinBOX skinBox) + { + if (EditorValue?.Texture is null) + { + Trace.TraceWarning($"[{nameof(CustomSkinEditor)}@{nameof(GenerateUVTextureMap)}] Failed to generate uv for {skinBox}. Reason: Model.Texture was null"); + return; + } + using (Graphics graphics = Graphics.FromImage(EditorValue.Texture)) + { + graphics.ApplyConfig(_graphicsConfig); + int argb = _rng.Next(unchecked((int)0xFF000000), -1); + var color = Color.FromArgb(argb); + Brush brush = new SolidBrush(color); + graphics.FillPath(brush, skinBox.GetUVGraphicsPath()); + } + renderer3D1.Texture = EditorValue.Texture; + } + + private void createToolStripMenuItem_Click(object sender, EventArgs e) + { + var boxEditor = new BoxEditor(SkinBOX.DefaultHead, _allowInflate); + if (boxEditor.ShowDialog() == DialogResult.OK) + { + SkinBOX newBox = boxEditor.Result; + renderer3D1.ModelData.Add(newBox); + EditorValue.Model.AdditionalBoxes.Add(newBox); + _skinPartListBindingSource.ResetBindings(false); + if (generateTextureCheckBox.Checked) + GenerateUVTextureMap(newBox); + } + } + + private void exportTextureButton_Click(object sender, EventArgs e) + { + if (EditorValue?.Texture is null) + { + Trace.TraceWarning($"[{nameof(CustomSkinEditor)}@{nameof(exportTextureButton_Click)}] Failed to export texture. Reason: skin.Model.Texture was null"); + return; + } + using SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Filter = "PNG Image Files | *.png"; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + EditorValue.Texture.Save(saveFileDialog.FileName, ImageFormat.Png); + } + } + + private void importTextureButton_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Filter = "PNG Image Files | *.png"; + openFileDialog.Title = "Select Skin Texture"; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + generateTextureCheckBox.Checked = false; + renderer3D1.Texture = Image.FromFile(openFileDialog.FileName).ReleaseFromFile(); + } + } + + private void buttonDone_Click(object sender, EventArgs e) + { + EditorValue.Model.AdditionalBoxes.Clear(); + EditorValue.Model.AdditionalBoxes.AddRange(renderer3D1.ModelData); + EditorValue.Model.PartOffsets.Clear(); + EditorValue.Model.PartOffsets.AddRange(renderer3D1.GetOffsets()); + // just in case they're not the same instance + EditorValue.Anim = renderer3D1.ANIM; + DialogResult = DialogResult.OK; + } + + private void exportSkinButton_Click(object sender, EventArgs e) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Title = "Save Model File"; + saveFileDialog.Filter = SkinModelImporter.Default.SupportedModelFileFormatsFilter; + saveFileDialog.FileName = EditorValue.MetaData.Name.TrimEnd(new char[] { '\n', '\r' }).Replace(' ', '_'); + if (saveFileDialog.ShowDialog() == DialogResult.OK) + SkinModelImporter.Default.Export(saveFileDialog.FileName, EditorValue.GetModelInfo()); + } + + private void importSkinButton_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Title = "Select Model File"; + openFileDialog.Filter = SkinModelImporter.Default.SupportedModelFileFormatsFilter; + if (MessageBox.Show("Import custom model project file? Your current work will be lost!", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) == DialogResult.Yes && openFileDialog.ShowDialog() == DialogResult.OK) + { + SkinModelInfo modelInfo = SkinModelImporter.Default.Import(openFileDialog.FileName); + if (modelInfo is not null) + { + EditorValue.SetModelInfo(modelInfo); + LoadModelData(); + } + } + } + + private void cloneToolStripMenuItem_Click(object sender, EventArgs e) + { + if (skinPartListBox.SelectedItem is SkinBOX box) + { + SkinBOX clone = box; + renderer3D1.ModelData.Add(clone); + EditorValue.Model.AdditionalBoxes.Add(clone); + _skinPartListBindingSource.ResetBindings(false); + } + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + if (skinPartListBox.SelectedItem is SkinBOX box) + { + renderer3D1.ModelData.Remove(box); + EditorValue.Model.AdditionalBoxes.Remove(box); + _skinPartListBindingSource.ResetBindings(false); + } + } + + private void CustomSkinEditor_FormClosing(object sender, FormClosingEventArgs e) + { + renderer3D1.Dispose(); + } + + private void outlineColorButton_Click(object sender, EventArgs e) + { + ColorDialog colorDialog = new ColorDialog(); + colorDialog.SolidColorOnly = true; + if (colorDialog.ShowDialog() == DialogResult.OK) + { + renderer3D1.GuideLineColor = colorDialog.Color; + skinPartListBox_SelectedIndexChanged(sender, e); + } + } + + private void renderer3D1_TextureChanging(object sender, Rendering.TextureChangingEventArgs e) + { + Image texture = e.NewTexture; + // Skins can only be a 1:1 ratio (base 64x64) or a 2:1 ratio (base 64x32) + if (Settings.Default.ValidateImageDimension && texture.Width != texture.Height && texture.Height != texture.Width / 2) + { + e.Cancel = true; + MessageBox.Show("The selected image does not suit a skin texture.", "Invalid image dimensions.", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + uvPictureBox.Image = EditorValue.Texture = texture; + textureSizeLabel.Text = $"{texture.Width}x{texture.Height}"; + } + + private void skinPartListBox_DoubleClick(object sender, EventArgs e) + { + if (skinPartListBox.SelectedItem is SkinBOX box) + { + var boxEditor = new BoxEditor(box, _allowInflate); + if (boxEditor.ShowDialog() == DialogResult.OK) + { + renderer3D1.ModelData[skinPartListBox.SelectedIndex] = boxEditor.Result; + _skinPartListBindingSource.ResetItem(skinPartListBox.SelectedIndex); + } + } + } + + // TODO: fixed outline rendering + private void skinPartListBox_SelectedIndexChanged(object sender, EventArgs e) + { + int scale = 1; + renderer3D1.SelectedIndices = skinPartListBox.SelectedIndices.Cast().ToArray(); + StringBuilder uv_sb = new StringBuilder(); + StringBuilder size_sb = new StringBuilder(); + StringBuilder pos_sb = new StringBuilder(); + foreach (SkinBOX b in skinPartListBox.SelectedItems.Cast()) + { + uv_sb.Append(b.UV); + uv_sb.Append(", "); + size_sb.Append(b.Size); + size_sb.Append(", "); + pos_sb.Append(b.Pos); + pos_sb.Append(", "); + } + + uvLabel.Text = $"UV: {uv_sb}"; + sizeLabel.Text = $"Size: {size_sb}"; + positionLabel.Text = $"Position: {pos_sb}"; + + // TODO: highlight all selected boxes + if (skinPartListBox.SelectedItem is SkinBOX box) + { + + Image uvArea = EditorValue.Texture.GetArea(Rectangle.Truncate(new RectangleF(box.UV.X, box.UV.Y, box.Size.X * 2 + box.Size.Z * 2, box.Size.Z + box.Size.Y))); + + Bitmap refImg = new Bitmap(1, 1); + + using (var g = Graphics.FromImage(refImg)) + { + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.DrawImage(uvArea, new Rectangle(0, 0, 1, 1)); + } + + Color avgColor = refImg.GetPixel(0, 0); + renderer3D1.HighlightlingColor = avgColor.Inversed(); + + Size scaleSize = new Size(EditorValue.Texture.Width * scale, EditorValue.Texture.Height * scale); + uvPictureBox.Image = new Bitmap(scaleSize.Width, scaleSize.Height); + using (Graphics g = Graphics.FromImage(uvPictureBox.Image)) + { + GraphicsPath graphicsPath = box.GetUVGraphicsPath(new System.Numerics.Vector2(scaleSize.Width * renderer3D1.TillingFactor.X, scaleSize.Height * renderer3D1.TillingFactor.Y)); + var brush = new SolidBrush(Color.FromArgb(127, avgColor.GreyScaled())); + g.ApplyConfig(_graphicsConfig); + g.DrawImage(EditorValue.Texture, new Rectangle(Point.Empty, scaleSize), new Rectangle(Point.Empty, EditorValue.Texture.Size), GraphicsUnit.Pixel); + g.FillPath(brush, graphicsPath); + } + uvPictureBox.Invalidate(); + } + } + + private void captureScreenshotButton_Click(object sender, EventArgs e) + { + using SaveFileDialog saveFileDialog = new SaveFileDialog() + { + Filter = "PNG|*.png" + }; + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + renderer3D1.GetThumbnail().Save(saveFileDialog.FileName, ImageFormat.Png); + } + } + + private void showArmorCheckbox_CheckedChanged(object sender, EventArgs e) + { + renderer3D1.ShowArmor = showArmorCheckbox.Checked; + } + + private void skinPartListBox_KeyUp(object sender, KeyEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Delete: + deleteToolStripMenuItem_Click(sender, e); + break; + case Keys.Escape: + ClearSelection(); + break; + default: + break; + } + } + + private void ReloadOffsetList() + { + _skinOffsetListBindingSource = new BindingSource(renderer3D1.GetOffsets().ToArray(), null); + offsetListBox.DataSource = _skinOffsetListBindingSource; + _skinOffsetListBindingSource.ResetBindings(false); + } + + private void addOffsetToolStripMenuItem_Click(object sender, EventArgs e) + { + var offsets = renderer3D1.GetOffsets().Select(offset => offset.Type).ToList(); + string[] available = SkinPartOffset.ValidModelOffsetTypes.Where(s => !offsets.Contains(s)).ToArray(); + using ItemSelectionPopUp typeSelection = new ItemSelectionPopUp(available); + using NumericPrompt valuePrompt = new NumericPrompt(0f, -cOffsetMaximum, cOffsetMaximum); + valuePrompt.DecimalPlaces = 1; + valuePrompt.ValueStep = (decimal)0.1f; + if (typeSelection.ShowDialog() == DialogResult.OK && valuePrompt.ShowDialog() == DialogResult.OK) + { + renderer3D1.SetPartOffset(typeSelection.SelectedItem, (float)valuePrompt.SelectedValue); + ReloadOffsetList(); + } + } + + private void removeOffsetToolStripMenuItem_Click(object sender, EventArgs e) + { + if (offsetListBox.SelectedItem is not SkinPartOffset offset) + return; + renderer3D1.SetPartOffset(offset.Type, 0f); + ReloadOffsetList(); + } + + private void offsetListBox_DoubleClick(object sender, EventArgs e) + { + if (offsetListBox.SelectedItem is not SkinPartOffset offset) + return; + + using NumericPrompt valuePrompt = new NumericPrompt(offset.Value, -cOffsetMaximum, cOffsetMaximum); + valuePrompt.ToolTipText = "Set new Value for " + offset.Type; + valuePrompt.DecimalPlaces = 1; + valuePrompt.ValueStep = (decimal)0.1f; + if (valuePrompt.ShowDialog() == DialogResult.OK) + { + renderer3D1.SetPartOffset(offset.Type, (float)valuePrompt.SelectedValue); + ReloadOffsetList(); + } + } + + private void skinPartListBox_MouseClick(object sender, MouseEventArgs e) + { + if (skinPartListBox.IndexFromPoint(e.X, e.Y) == -1) + ClearSelection(); + } + + private void ClearSelection() + { + skinPartListBox.ClearSelected(); + uvPictureBox.Image = EditorValue.Texture; + } + + + private void centerSelectionCheckbox_CheckedChanged(object sender, EventArgs e) + { + renderer3D1.CenterOnSelect = centerSelectionCheckbox.Checked; + } + + private void generateUvTextureToolStripMenuItem_Click(object sender, EventArgs e) + { + if (skinPartListBox.SelectedItem is SkinBOX skinBox) + { + GenerateUVTextureMap(skinBox); + } + } + + private void renderSettingsButton_Click(object sender, EventArgs e) + { + using AppSettingsForm settingsForm = new AppSettingsForm("Render Settings", _settingsManager.GetSettings()); + settingsForm.ShowDialog(); + } + + private string SanitizeModelFilename(in string modelFilename) + { + return string.IsNullOrWhiteSpace(modelFilename) ? "template" : modelFilename.TrimEnd(new char[] { '\n', '\r' }).Replace(' ', '_'); + } + + private void exportTemplateButton_Click(object sender, EventArgs e) + { + Image templateTexture = Resources.classic_template; + SkinAnimMask templateAnimMask = SkinAnimMask.RESOLUTION_64x64; + + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Title = "Save Template Model"; + saveFileDialog.Filter = SkinModelImporter.Default.SupportedModelFileFormatsFilter; + saveFileDialog.FileName = SanitizeModelFilename(EditorValue.MetaData.Name); + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + SkinModelInfo modelInfo = new SkinModelInfo(templateTexture, templateAnimMask, new SkinModel()); + SkinModelImporter.Default.Export(saveFileDialog.FileName, modelInfo); + } + } + + private void animEditorButton_Click(object sender, EventArgs e) + { + ProcessDialogKey(Keys.A); + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.ja.resx b/PCK-Studio/Forms/Editor/CustomSkinEditor.ja.resx similarity index 100% rename from PCK-Studio/Forms/Skins-And-Textures/generateModel.ja.resx rename to PCK-Studio/Forms/Editor/CustomSkinEditor.ja.resx diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx b/PCK-Studio/Forms/Editor/CustomSkinEditor.resx similarity index 85% rename from PCK-Studio/Forms/Skins-And-Textures/generateModel.resx rename to PCK-Studio/Forms/Editor/CustomSkinEditor.resx index da2157ab..e76b2020 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.resx +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.resx @@ -117,175 +117,205 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + False + + + Left + + + Top, Right + - + True - - + NoControl - - 23, 459 + + 6, 47 - - 38, 13 + + 3, 3, 3, 3 - - 137 + + 33, 19 - - Parent - - - label6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 19 - - - False - - - True - - - NoControl - - - 691, 357 - - - 44, 13 - - - 127 - - - Position - - - label5 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 28 - - - False - - - True - - - NoControl - - - 691, 259 - - - 27, 13 - - + 142 - + Size - - label3 + + sizeLabel - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + groupBox1 - - 27 + + 0 - - False - - + + Top, Right + + True - + NoControl - - 654, 236 + + 6, 76 - - 22, 13 + + 3, 3, 3, 3 - + + 50, 19 + + + 127 + + + Position + + + positionLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + Top, Right + + + True + + + NoControl + + + 6, 21 + + + 3, 3, 3, 3 + + + 28, 19 + + 131 - + UV - - label7 + + uvLabel - + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + groupBox1 + + + 2 + + + 19, 276 + + + 3, 3, 3, 0 + + + 161, 117 + + + 170 + + + Porperties + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 22 + + 5 - - False - - - True + + Left - - NoControl + + 23, 249 - - 655, 56 + + 61, 21 - - 128, 13 + + 128 - - 113 + + Import - - Texture Mapping Preview + + importTextureButton - - labelTextureMappingPreview + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + $this - - 16 + + 3 - + + Left + + + 90, 249 + + + 61, 21 + + + 114 + + + Export + + + exportTextureButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 2 + + 17, 17 @@ -297,10 +327,10 @@ - 151, 26 + 201, 26 - Create + Add Cube @@ -318,7 +348,7 @@ - 151, 26 + 201, 26 Clone @@ -333,12 +363,12 @@ - 151, 26 + 201, 26 Delete - + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAFhSURBVFhH7ZY/ @@ -351,32 +381,29 @@ rkJggg== - - 151, 26 + + 201, 26 - - Change Color + + Re-generate UV Texture - - 152, 108 + + 202, 108 - - contextMenuStrip1 + + skinPartTabContextMenu - + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Flat - - - NoControl + + Bottom, Right - 654, 676 + 627, 553 - 130, 22 + 250, 21 111 @@ -388,661 +415,106 @@ buttonDone - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a $this - 26 - - - True - - - NoControl - - - 289, 647 - - - 33, 13 - - - 102 - - - View: - - - labelView - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 25 - - - Flat - - - NoControl - - - 554, 642 - - - 89, 23 - - - 100 - - - Rotate Right - - - rotateRightBtn - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 24 - - - Flat - - - NoControl - - - 194, 643 - - - 89, 23 - - - 101 - - - Rotate Left - - - rotateLeftBtn - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 23 - - - 4, 22 - - - 3, 3, 3, 3 - - - 116, 132 - - - 1 - - - Armor - - - tabArmor - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabBody - - - 0 - - - 2 - - - Left - - - 58, 99 - - - 43, 20 - - - 85 - - - 0 - - - offsetArms - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 0 - - - Left - - - True - - - NoControl - - - 3, 103 - - - 38, 13 - - - 90 - - - ARMS - - - label14 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 1 - - - Left - - - 58, 36 - - - 43, 20 - - - 83 - - - 0 - - - offsetBody - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 2 - - - Left - - - 58, 67 - - - 43, 20 - - - 84 - - - 0 - - - offsetLegs - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 3 - - - Left - - - True - - - NoControl - - - 3, 9 - - - 37, 13 - - - 87 - - - HEAD - - - label10 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 4 - - - Left - - - True - - - NoControl - - - 3, 71 - - - 35, 13 - - - 89 - - - LEGS - - - label13 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 5 - - - Left - - - 58, 5 - - - 43, 20 - - - 86 - - - 0 - - - offsetHead - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 6 - - - Left - - - True - - - NoControl - - - 3, 40 - - - 37, 13 - - - 88 - - - BODY - - - label12 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - myTablePanel2 - - - 7 - - - Fill - - - 3, 3 - - - 4 - - - 110, 126 - - - 146 - - - myTablePanel2 - - - System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabPage1 - - - 0 - - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="offsetArms" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label14" Row="3" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="offsetBody" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="offsetLegs" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label10" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="label13" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="offsetHead" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="label12" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,50,Percent,50" /><Rows Styles="Percent,25,Percent,25,Percent,25,Percent,25" /></TableLayoutSettings> - - - 4, 22 - - - 3, 3, 3, 3 - - - 116, 132 - - - 0 - - - Body - - - tabPage1 - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tabBody - - - 1 - - - Fill - - - 3, 16 - - - 124, 158 - - - 144 - - - tabBody - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - groupBox1 - - - 0 - - - 654, 459 - - - 130, 177 - - - 139 - - - OFFSETS - - - groupBox1 - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - 21 - - HEAD + + Bottom, Left - - BODY + + 27, 553 - - ARM0 + + 75, 21 - - ARM1 + + 96 - - LEG0 + + Import Skin - - LEG1 + + importSkinButton - - 23, 484 - - - 114, 21 - - - 134 - - - comboParent - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 18 - - - Flat - - - NoControl - - - 722, 206 - - - 61, 21 - - - 114 - - - EXPORT - - - buttonEXPORT - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 15 - - - Flat - - - NoControl - - - 655, 206 - - - 61, 21 - - - 128 - - - IMPORT - - - buttonIMPORT - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 20 - - - NoControl - - - 655, 72 - - - 128, 128 - - - Zoom - - - 112 - - - uvPictureBox - - - PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null - - - $this - - - 17 - - - NoControl - - - 194, 56 - - - 449, 580 - - - StretchImage - - - 98 - - - displayBox - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 13 - - - 23, 511 - - - 114, 21 - - - 146 - - - Load Template - - - buttonTemplate - - + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - + $this - - 12 + + 20 + + + Bottom, Left + + + 105, 553 + + + 75, 21 + + + 97 + + + Export skin + + + exportSkinButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 19 + + + Left + + + 19, 429 + + + 161, 21 + + + 145 + + + Set Outline Color + + + False + + + outlineColorButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 10 + + + Left True - 23, 556 + 22, 399 140, 15 @@ -1063,338 +535,470 @@ $this - 11 - - - True - - - 23, 577 - - - 84, 15 - - - 148 - - - Guide Lines - - - checkGuide - - - MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 10 - - - True - - - 23, 598 - - - 129, 15 - - - 149 - - - Show Armor Offsets - - - checkBoxArmor - - - MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - 9 - - 658, 275 + + Left - - 119, 20 + + True - - 150 + + 23, 532 - - Center + + 89, 15 - - SizeXUpDown + + 149 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Show Armor - + + showArmorCheckbox + + + MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + $this - + 8 - - 658, 301 + + Fill - - 119, 20 + + 0, 0 - - 151 + + 242, 446 - - Center + + 0 - - SizeYUpDown + + skinPartListBox - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + skinPartsTabPage + + + 0 + + + Bottom, Right + + + 510, 553 + + + 111, 21 + + + 163 + + + Capture Screenshot + + + captureScreenshotButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + $this - - 7 + + 17 - - 658, 327 + + Left - - 119, 20 + + True - - 152 + + 23, 511 - - Center + + 82, 15 - - SizeZUpDown + + 164 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Show Tools - + + showToolsCheckBox + + + MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + $this - + 6 - - 682, 233 + + Top, Left, Right - - 43, 20 + + True - - 156 + + 364, 36 - - TextureXUpDown + + 73, 19 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 165 - + + nameLabel + + + skinNameLabel + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + $this - - 5 + + 16 - - 731, 234 + + Top, Right - - 43, 20 + + 4, 38 - - 157 + + 242, 446 - - TextureYUpDown + + 0 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Parts - - $this + + skinPartsTabPage - - 4 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 657, 425 + + metroTabControl1 - - 120, 20 + + 0 - - 160 + + 204, 17 + + + 152, 22 - - Center + + Add Offset - - PosZUpDown + + 152, 22 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Remove Offset - - $this + + 153, 48 - + + offsetTabContextMenu + + + MetroFramework.Controls.MetroContextMenu, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + Fill + + + 0, 0 + + + 242, 446 + + + 0 + + + offsetListBox + + + System.Windows.Forms.ListBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + skinOffsetsTabPage + + + 0 + + + 4, 38 + + + 242, 446 + + 1 - - 658, 399 + + Offset - - 119, 20 + + skinOffsetsTabPage - - 159 + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Center + + metroTabControl1 - - PosYUpDown + + 1 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 627, 59 - + + 250, 488 + + + 1 + + + metroTabControl1 + + + MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + $this - - 2 + + 15 - - 658, 373 + + Top, Bottom, Left, Right - - 119, 20 + + 190, 59 - - 158 + + 431, 484 - - Center + + 167 - - PosXUpDown + + renderer3D1 - - System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + PckStudio.Rendering.SkinRenderer, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null - + $this - - 3 + + 18 - - Part + + Left - - 40 + + Zoom - - X + + NoControl - - Center + + 23, 63 - - 30 + + 160, 160 - - Y + + Zoom - - Center + + 112 - - 30 + + uvPictureBox - - Z + + PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null - - Center - - - 30 - - - Width - - - Center - - - Height - - - Center - - - Length - - - Center - - - U - - - Center - - - 25 - - - V - - - Center - - - 25 - - - 23, 59 - - - 165, 378 - - - 132 - - - listViewBoxes - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + $this - + + 11 + + + Left + + + True + + + 22, 465 + + + 108, 15 + + + 162 + + + Center on select + + + centerSelectionCheckbox + + + MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 7 + + + Left + + + True + + + NoControl + + + 129, 226 + + + 51, 13 + + + 171 + + + (TexSize) + + + textureSizeLabel + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Bottom, Right + + + 290, 553 + + + 94, 21 + + + 175 + + + Render settings + + + renderSettingsButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + 14 + + Bottom, Left + + + 190, 553 + + + 94, 21 + + + 176 + + + Export template + + + exportTemplateButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 13 + + + Bottom, Right + + + 390, 553 + + + 114, 21 + + + 177 + + + Open anim editor + + + animEditorButton + + + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 12 + True @@ -1405,7 +1009,7 @@ 6, 13 - 806, 721 + 900, 600 @@ -3913,17 +3517,14 @@ AP//AAA= - - 1114, 1000 - - 753, 707 + 900, 600 CenterParent - Model Generator + Custom Skin Editor createToolStripMenuItem @@ -3943,70 +3544,28 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - changeColorToolStripMenuItem + + generateUvTextureToolStripMenuItem - + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Part + + addOffsetToolStripMenuItem - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - X + + removeOffsetToolStripMenuItem - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Y - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Z - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _Width - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _Height - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Length - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - U - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - V - - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - generateModel + CustomSkinEditor - MetroFramework.Forms.MetroForm, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + PckStudio.Internal.EditorForm`1[[PckStudio.Internal.Skin.Skin, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null]], PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.Designer.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.Designer.cs index d7e8c3de..aad86e7f 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.Designer.cs @@ -327,7 +327,6 @@ this.Style = MetroFramework.MetroColorStyle.Silver; this.Text = "GRF Editor"; this.Theme = MetroFramework.MetroThemeStyle.Dark; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.GameRuleFileEditor_FormClosing); this.Load += new System.EventHandler(this.OnLoad); this.MessageContextMenu.ResumeLayout(false); this.DetailContextMenu.ResumeLayout(false); diff --git a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs index 0abbcf56..46afaa18 100644 --- a/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs +++ b/PCK-Studio/Forms/Editor/GameRuleFileEditor.cs @@ -20,28 +20,21 @@ using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using PckStudio.Forms.Additional_Popups.Grf; -using PckStudio.Internal.Misc; using OMI.Formats.GameRule; -using PckStudio.Properties; using PckStudio.ToolboxItems; +using PckStudio.Controls; +using PckStudio.Interfaces; +using PckStudio.Internal; namespace PckStudio.Forms.Editor { - public partial class GameRuleFileEditor : MetroFramework.Forms.MetroForm + public partial class GameRuleFileEditor : EditorForm { - private GameRuleFile _file; - - public GameRuleFile Result => _file; - - private GameRuleFileEditor() + public GameRuleFileEditor(GameRuleFile gameRuleFile, ISaveContext saveContext) + : base(gameRuleFile, saveContext) { InitializeComponent(); - saveToolStripMenuItem.Visible = !Settings.Default.AutoSaveChanges; - } - - public GameRuleFileEditor(GameRuleFile gameRuleFile) : this() - { - _file = gameRuleFile; + saveToolStripMenuItem.Visible = !saveContext.AutoSave; } private void OnLoad(object sender, EventArgs e) @@ -52,7 +45,7 @@ namespace PckStudio.Forms.Editor private void LoadGameRuleTree(TreeNodeCollection root, GameRuleFile.GameRule parentRule) { - foreach (GameRuleFile.GameRule rule in parentRule.ChildRules) + foreach (GameRuleFile.GameRule rule in parentRule.GetRules()) { TreeNode node = new TreeNode(rule.Name); node.Tag = rule; @@ -64,16 +57,16 @@ namespace PckStudio.Forms.Editor private void ReloadGameRuleTree() { GrfTreeView.Nodes.Clear(); - if (_file is not null) + if (EditorValue is not null) { SetCompressionLevel(); - LoadGameRuleTree(GrfTreeView.Nodes, _file.Root); + LoadGameRuleTree(GrfTreeView.Nodes, EditorValue.Root); } } private void SetCompressionLevel() { - switch (_file.Header.CompressionLevel) + switch (EditorValue.Header.CompressionLevel) { case GameRuleFile.CompressionLevel.None: noneToolStripMenuItem.Checked = true; @@ -100,7 +93,7 @@ namespace PckStudio.Forms.Editor { GrfParametersTreeView.Nodes.Clear(); if (GrfTreeView.SelectedNode is TreeNode t && t.Tag is GameRuleFile.GameRule rule) - foreach (KeyValuePair param in rule.Parameters) + foreach (KeyValuePair param in rule.GetParameters()) { GrfParametersTreeView.Nodes.Add(new TreeNode($"{param.Key}: {param.Value}") { Tag = param}); } @@ -114,12 +107,12 @@ namespace PckStudio.Forms.Editor AddParameter prompt = new AddParameter(); if (prompt.ShowDialog(this) == DialogResult.OK) { - if (grfTag.Parameters.ContainsKey(prompt.ParameterName)) + if (grfTag.ContainsParameter(prompt.ParameterName)) { MessageBox.Show(this, "Can't add detail that already exists.", "Error"); return; } - grfTag.Parameters.Add(prompt.ParameterName, prompt.ParameterValue); + grfTag.AddParameter(prompt.ParameterName, prompt.ParameterValue); ReloadParameterTreeView(); } } @@ -128,7 +121,7 @@ namespace PckStudio.Forms.Editor { if (GrfTreeView.SelectedNode is TreeNode t && t.Tag is GameRuleFile.GameRule rule && GrfParametersTreeView.SelectedNode is TreeNode paramNode && paramNode.Tag is KeyValuePair pair && - rule.Parameters.ContainsKey(pair.Key) && rule.Parameters.Remove(pair.Key)) + rule.ContainsParameter(pair.Key) && rule.RemoveParameter(pair.Key)) { ReloadParameterTreeView(); return; @@ -150,7 +143,7 @@ namespace PckStudio.Forms.Editor AddParameter prompt = new AddParameter(param.Key, param.Value, false); if (prompt.ShowDialog(this) == DialogResult.OK) { - rule.Parameters[prompt.ParameterName] = prompt.ParameterValue; + rule.SetParameter(prompt.ParameterName, prompt.ParameterValue); ReloadParameterTreeView(); } } @@ -161,7 +154,7 @@ namespace PckStudio.Forms.Editor bool isValidNode = GrfTreeView.SelectedNode is TreeNode t && t.Tag is GameRuleFile.GameRule; GameRuleFile.GameRule parentRule = isValidNode ? GrfTreeView.SelectedNode.Tag as GameRuleFile.GameRule - : _file.Root; + : EditorValue.Root; TreeNodeCollection root = isValidNode ? GrfTreeView.SelectedNode.Nodes @@ -192,9 +185,9 @@ namespace PckStudio.Forms.Editor private bool RemoveTag(GameRuleFile.GameRule rule) { _ = rule.Parent ?? throw new ArgumentNullException(nameof(rule.Parent)); - foreach (GameRuleFile.GameRule subTag in rule.ChildRules.ToList()) + foreach (GameRuleFile.GameRule subTag in rule.GetRules().ToList()) return RemoveTag(subTag); - return rule.Parent.ChildRules.Remove(rule); + return rule.Parent.RemoveRule(rule); } private void GrfTreeView_KeyDown(object sender, KeyEventArgs e) @@ -205,11 +198,12 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - if (_file.Header.unknownData[3] != 0) + if (EditorValue.Header.unknownData[3] != 0) { MessageBox.Show(this, "World grf saving is currently unsupported"); return; } + Save(); DialogResult = DialogResult.OK; MessageBox.Show("Saved!"); } @@ -222,51 +216,43 @@ namespace PckStudio.Forms.Editor private void noneToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionLevel = GameRuleFile.CompressionLevel.None; + EditorValue.Header.CompressionLevel = GameRuleFile.CompressionLevel.None; } private void compressedToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionLevel = GameRuleFile.CompressionLevel.Compressed; + EditorValue.Header.CompressionLevel = GameRuleFile.CompressionLevel.Compressed; } private void compressedRLEToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionLevel = GameRuleFile.CompressionLevel.CompressedRle; + EditorValue.Header.CompressionLevel = GameRuleFile.CompressionLevel.CompressedRle; } private void compressedRLECRCToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionLevel = GameRuleFile.CompressionLevel.CompressedRleCrc; + EditorValue.Header.CompressionLevel = GameRuleFile.CompressionLevel.CompressedRleCrc; } private void wiiUPSVitaToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionType = GameRuleFile.CompressionType.Zlib; + EditorValue.Header.CompressionType = GameRuleFile.CompressionType.Zlib; } private void pS3ToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionType = GameRuleFile.CompressionType.Deflate; + EditorValue.Header.CompressionType = GameRuleFile.CompressionType.Deflate; } private void xbox360ToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (sender is ToolStripRadioButtonMenuItem radioButton && radioButton.Checked) - _file.Header.CompressionType = GameRuleFile.CompressionType.XMem; - } - - private void GameRuleFileEditor_FormClosing(object sender, FormClosingEventArgs e) - { - if (Settings.Default.AutoSaveChanges) - { - saveToolStripMenuItem_Click(sender, EventArgs.Empty); - } + EditorValue.Header.CompressionType = GameRuleFile.CompressionType.XMem; } } } diff --git a/PCK-Studio/Forms/Editor/LOCEditor.Designer.cs b/PCK-Studio/Forms/Editor/LOCEditor.Designer.cs index 999fb412..e3fd7b1e 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.Designer.cs @@ -34,6 +34,7 @@ this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.addDisplayIDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deleteDisplayIDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyIDToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.GridContextMenu = new MetroFramework.Controls.MetroContextMenu(this.components); this.addLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.removeLanguageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -43,10 +44,10 @@ this.locSort = new System.Windows.Forms.TableLayoutPanel(); this.buttonReplaceAll = new System.Windows.Forms.Button(); this.dataGridViewLocEntryData = new System.Windows.Forms.DataGridView(); - this.textBoxReplaceAll = new System.Windows.Forms.TextBox(); - this.treeViewLocKeys = new System.Windows.Forms.TreeView(); this.Language = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.DisplayName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.textBoxReplaceAll = new System.Windows.Forms.TextBox(); + this.treeViewLocKeys = new System.Windows.Forms.TreeView(); this.contextMenuStrip1.SuspendLayout(); this.GridContextMenu.SuspendLayout(); this.menuStrip.SuspendLayout(); @@ -58,7 +59,8 @@ // this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.addDisplayIDToolStripMenuItem, - this.deleteDisplayIDToolStripMenuItem}); + this.deleteDisplayIDToolStripMenuItem, + this.copyIDToolStripMenuItem}); this.contextMenuStrip1.Name = "contextMenuStrip1"; resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1"); // @@ -74,6 +76,12 @@ resources.ApplyResources(this.deleteDisplayIDToolStripMenuItem, "deleteDisplayIDToolStripMenuItem"); this.deleteDisplayIDToolStripMenuItem.Click += new System.EventHandler(this.deleteDisplayIDToolStripMenuItem_Click); // + // copyIDToolStripMenuItem + // + this.copyIDToolStripMenuItem.Name = "copyIDToolStripMenuItem"; + resources.ApplyResources(this.copyIDToolStripMenuItem, "copyIDToolStripMenuItem"); + this.copyIDToolStripMenuItem.Click += new System.EventHandler(this.copyIDToolStripMenuItem_Click); + // // GridContextMenu // this.GridContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -162,6 +170,18 @@ this.dataGridViewLocEntryData.RowHeadersVisible = false; this.dataGridViewLocEntryData.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit); // + // Language + // + this.Language.FillWeight = 15F; + resources.ApplyResources(this.Language, "Language"); + this.Language.Name = "Language"; + this.Language.ReadOnly = true; + // + // DisplayName + // + resources.ApplyResources(this.DisplayName, "DisplayName"); + this.DisplayName.Name = "DisplayName"; + // // textBoxReplaceAll // resources.ApplyResources(this.textBoxReplaceAll, "textBoxReplaceAll"); @@ -180,18 +200,6 @@ this.treeViewLocKeys.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewLocKeys_AfterSelect); this.treeViewLocKeys.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeView1_KeyDown); // - // Language - // - this.Language.FillWeight = 15F; - resources.ApplyResources(this.Language, "Language"); - this.Language.Name = "Language"; - this.Language.ReadOnly = true; - // - // DisplayName - // - resources.ApplyResources(this.DisplayName, "DisplayName"); - this.DisplayName.Name = "DisplayName"; - // // LOCEditor // resources.ApplyResources(this, "$this"); @@ -200,7 +208,6 @@ this.Name = "LOCEditor"; this.Style = MetroFramework.MetroColorStyle.Silver; this.Theme = MetroFramework.MetroThemeStyle.Dark; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LOCEditor_FormClosing); this.Load += new System.EventHandler(this.LOCEditor_Load); this.contextMenuStrip1.ResumeLayout(false); this.GridContextMenu.ResumeLayout(false); @@ -231,5 +238,6 @@ private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; private System.Windows.Forms.DataGridViewTextBoxColumn Language; private System.Windows.Forms.DataGridViewTextBoxColumn DisplayName; + private System.Windows.Forms.ToolStripMenuItem copyIDToolStripMenuItem; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/LOCEditor.cs b/PCK-Studio/Forms/Editor/LOCEditor.cs index 28a13436..0937cedc 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.cs +++ b/PCK-Studio/Forms/Editor/LOCEditor.cs @@ -4,34 +4,27 @@ using System.Data; using System.Linq; using System.Collections.Generic; using System.Windows.Forms; -using MetroFramework.Forms; -using PckStudio.Internal.Misc; +using PckStudio.Internal; using PckStudio.Forms.Additional_Popups.Loc; using OMI.Formats.Languages; -using OMI.Workers.Language; -using OMI.Formats.Pck; -using PckStudio.Properties; -using PckStudio.Extensions; +using PckStudio.Interfaces; +using PckStudio.Controls; namespace PckStudio.Forms.Editor { - public partial class LOCEditor : MetroForm + public partial class LOCEditor : EditorForm { - LOCFile _currentLoc; - PckAsset _asset; - - public LOCEditor(PckAsset asset) + public LOCEditor(LOCFile locFile, ISaveContext context) + : base(locFile, context) { InitializeComponent(); - _asset = asset; - _currentLoc = asset.GetData(new LOCFileReader()); - saveToolStripMenuItem.Visible = !Settings.Default.AutoSaveChanges; + saveToolStripMenuItem.Visible = !context.AutoSave; } private void LOCEditor_Load(object sender, EventArgs e) { RPC.SetPresence("LOC Editor", "Editing localization File."); - foreach(string locKey in _currentLoc.LocKeys.Keys) + foreach(string locKey in EditorValue.LocKeys.Keys) treeViewLocKeys.Nodes.Add(locKey); } @@ -39,7 +32,7 @@ namespace PckStudio.Forms.Editor { TreeNode node = e.Node; if (node == null || - !_currentLoc.LocKeys.ContainsKey(node.Text)) + !EditorValue.LocKeys.ContainsKey(node.Text)) { MessageBox.Show(this, "Selected Node does not seem to be in the loc file"); return; @@ -53,7 +46,7 @@ namespace PckStudio.Forms.Editor { prompt.OKButtonText = "Add"; if (prompt.ShowDialog(this) == DialogResult.OK && - _currentLoc.AddLocKey(prompt.NewText, "")) + EditorValue.AddLocKey(prompt.NewText, "")) { treeViewLocKeys.Nodes.Add(prompt.NewText); } @@ -62,7 +55,7 @@ namespace PckStudio.Forms.Editor private void deleteDisplayIDToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewLocKeys.SelectedNode is TreeNode t && _currentLoc.RemoveLocKey(t.Text)) + if (treeViewLocKeys.SelectedNode is TreeNode t && EditorValue.RemoveLocKey(t.Text)) { treeViewLocKeys.SelectedNode.Remove(); ReloadTranslationTable(); @@ -81,7 +74,7 @@ namespace PckStudio.Forms.Editor string locKey = treeViewLocKeys.SelectedNode.Text; string language = row.Cells[0].Value.ToString(); string value = row.Cells[1].Value.ToString(); - _currentLoc.SetLocEntry(locKey, language, value); + EditorValue.SetLocEntry(locKey, language, value); } private void treeView1_KeyDown(object sender, KeyEventArgs e) @@ -97,7 +90,7 @@ namespace PckStudio.Forms.Editor dataGridViewLocEntryData.Rows[i].Cells[1].Value = textBoxReplaceAll.Text; } - _currentLoc.SetLocEntry(treeViewLocKeys.SelectedNode.Text, textBoxReplaceAll.Text); + EditorValue.SetLocEntry(treeViewLocKeys.SelectedNode.Text, textBoxReplaceAll.Text); } private void ReloadTranslationTable() @@ -105,7 +98,7 @@ namespace PckStudio.Forms.Editor dataGridViewLocEntryData.Rows.Clear(); if (treeViewLocKeys.SelectedNode is null) return; - foreach (KeyValuePair locEntry in _currentLoc.GetLocEntries(treeViewLocKeys.SelectedNode.Text)) + foreach (KeyValuePair locEntry in EditorValue.GetLocEntries(treeViewLocKeys.SelectedNode.Text)) dataGridViewLocEntryData.Rows.Add(locEntry.Key, locEntry.Value); } @@ -113,7 +106,7 @@ namespace PckStudio.Forms.Editor { foreach (var lang in LOCFile.ValidLanguages) { - if (_currentLoc.Languages.Contains(lang)) + if (EditorValue.Languages.Contains(lang)) continue; yield return lang; } @@ -126,23 +119,20 @@ namespace PckStudio.Forms.Editor using (var dialog = new AddLanguage(avalibleLang)) if (dialog.ShowDialog(this) == DialogResult.OK) { - _currentLoc.AddLanguage(dialog.SelectedLanguage); + EditorValue.AddLanguage(dialog.SelectedLanguage); ReloadTranslationTable(); } } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - _asset.SetData(new LOCFileWriter(_currentLoc, 2)); + Save(); DialogResult = DialogResult.OK; } - private void LOCEditor_FormClosing(object sender, FormClosingEventArgs e) + private void copyIDToolStripMenuItem_Click(object sender, EventArgs e) { - if (Settings.Default.AutoSaveChanges) - { - saveToolStripMenuItem_Click(sender, EventArgs.Empty); - } + Clipboard.SetText(treeViewLocKeys.SelectedNode.Text); } } } diff --git a/PCK-Studio/Forms/Editor/LOCEditor.resx b/PCK-Studio/Forms/Editor/LOCEditor.resx index 73b694cc..63d454b7 100644 --- a/PCK-Studio/Forms/Editor/LOCEditor.resx +++ b/PCK-Studio/Forms/Editor/LOCEditor.resx @@ -133,8 +133,14 @@ Delete Display ID + + 162, 22 + + + Copy ID + - 163, 48 + 163, 70 contextMenuStrip1 @@ -2890,6 +2896,12 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + copyIDToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + addLanguageToolStripMenuItem @@ -2930,6 +2942,6 @@ LOCEditor - MetroFramework.Forms.MetroForm, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + PckStudio.Controls.EditorForm`1[[OMI.Formats.Languages.LOCFile, OMI Filetypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/MaterialsEditor.cs b/PCK-Studio/Forms/Editor/MaterialsEditor.cs index befbcb69..b1d17523 100644 --- a/PCK-Studio/Forms/Editor/MaterialsEditor.cs +++ b/PCK-Studio/Forms/Editor/MaterialsEditor.cs @@ -1,94 +1,72 @@ using System; using System.Collections.Generic; -using System.Drawing; -using System.Diagnostics; -using System.IO; using System.Linq; using System.Windows.Forms; -using MetroFramework.Forms; -using Newtonsoft.Json.Linq; -using OMI.Formats.Pck; using OMI.Formats.Material; -using OMI.Workers.Material; -using PckStudio.Internal; -using PckStudio.Extensions; -using PckStudio.Internal.Json; +using PckStudio.Controls; +using PckStudio.Core.Extensions; +using PckStudio.Core.Json; using PckStudio.Internal.App; +using PckStudio.Interfaces; +using PckStudio.Json; namespace PckStudio.Forms.Editor { - public partial class MaterialsEditor : MetroForm + // Materials File Format research by PhoenixARC + public partial class MaterialsEditor : EditorForm { - // Materials File Format research by PhoenixARC - private readonly PckAsset _asset; - MaterialContainer _materialFile; - private readonly List MaterialData = Entities.BehaviourInfos; - private bool showInvalidEntries; + private bool ShowInvalidEntries; - //Holds invalid entries so they can be added back to the material file on save should the user decide to hide them - List hiddenInvalidEntries = new List(); + public MaterialsEditor(MaterialContainer materials, ISaveContext saveContext) + : base(materials, saveContext) + { + InitializeComponent(); + if (EditorValue.HasInvalidEntries()) + { + DialogResult dr = MessageBox.Show(this, "Unsupported entities were found in this file. Would you like to display them?", "Invalid data found", MessageBoxButtons.YesNo); - void SetUpTree() + ShowInvalidEntries = dr == DialogResult.Yes; + } + + treeView1.ImageList = new ImageList(); + ApplicationScope.EntityImages.ToList().ForEach(treeView1.ImageList.Images.Add); + treeView1.ImageList.ColorDepth = ColorDepth.Depth32Bit; + UpdateTreeview(); + } + + void UpdateTreeview() { treeView1.BeginUpdate(); treeView1.Nodes.Clear(); - foreach (MaterialContainer.Material entry in _materialFile) + foreach (MaterialContainer.Material entry in EditorValue) { - TreeNode EntryNode = new TreeNode(entry.Name); + TreeNode entryNode = new TreeNode(entry.Name); + // index for invalid entry + entryNode.ImageIndex = 127; + entryNode.SelectedImageIndex = 127; + entryNode.Tag = entry; EntityInfo material = MaterialData.Find(m => m.InternalName == entry.Name); - if(material != null) - { - EntryNode.Text = material.DisplayName; - EntryNode.ImageIndex = MaterialData.IndexOf(material); - EntryNode.Tag = entry; - } + // check for invalid material entry - else + if (material is null) { - EntryNode.ImageIndex = 127; // icon for invalid entry - EntryNode.Text += " (Invalid)"; - - if (!showInvalidEntries) - { - hiddenInvalidEntries.Add(entry); + entryNode.Text += " (Invalid)"; + if (!ShowInvalidEntries) continue; - } - } - - EntryNode.SelectedImageIndex = EntryNode.ImageIndex; - - treeView1.Nodes.Add(EntryNode); + } + else + { + entryNode.Text = material.DisplayName; + entryNode.SelectedImageIndex = entryNode.ImageIndex = MaterialData.IndexOf(material); + } + treeView1.Nodes.Add(entryNode); } treeView1.EndUpdate(); } - public MaterialsEditor(PckAsset asset) - { - InitializeComponent(); - _asset = asset; - - using (var stream = new MemoryStream(asset.Data)) - { - var reader = new MaterialFileReader(); - _materialFile = reader.FromStream(stream); - - if (_materialFile.HasInvalidEntries()) - { - DialogResult dr = MessageBox.Show(this, "Unsupported entities were found in this file. Would you like to display them?", "Invalid data found", MessageBoxButtons.YesNo); - - showInvalidEntries = dr == DialogResult.Yes; - } - - treeView1.ImageList = new ImageList(); - ApplicationScope.EntityImages.ToList().ForEach(treeView1.ImageList.Images.Add); - treeView1.ImageList.ColorDepth = ColorDepth.Depth32Bit; - SetUpTree(); - } - } - private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node == null) @@ -106,10 +84,11 @@ namespace PckStudio.Forms.Editor } private void removeToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeView1.SelectedNode == null) - return; - - treeView1.SelectedNode.Remove(); + if (treeView1?.SelectedNode?.Tag is MaterialContainer.Material material) + { + EditorValue.Remove(material); + UpdateTreeview(); + } } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) @@ -125,23 +104,7 @@ namespace PckStudio.Forms.Editor private void saveToolStripMenuItem1_Click(object sender, EventArgs e) { - _materialFile = new MaterialContainer(); - - foreach (TreeNode node in treeView1.Nodes) - { - if(node.Tag is MaterialContainer.Material entry) - { - _materialFile.Add(entry); - } - } - - foreach (MaterialContainer.Material mat in hiddenInvalidEntries) - { - _materialFile.Add(mat); - } - - _asset.SetData(new MaterialFileWriter(_materialFile)); - + Save(); DialogResult = DialogResult.OK; } @@ -153,21 +116,15 @@ namespace PckStudio.Forms.Editor { if (string.IsNullOrEmpty(diag.SelectedEntity)) return; - if (_materialFile.FindAll(mat => mat.Name == diag.SelectedEntity).Count() > 0) + if (EditorValue.FindAll(mat => mat.Name == diag.SelectedEntity).Count() > 0) { - MessageBox.Show(this, "You cannot have two entries for one entity. Please use the \"Add New Position Override\" tool to add multiple overrides for entities", "Error", MessageBoxButtons.OK); + MessageBox.Show(this, "You cannot have two entries for one entity.", "Error", MessageBoxButtons.OK); return; } var newEntry = new MaterialContainer.Material(diag.SelectedEntity, "entity_alphatest"); - TreeNode newEntryNode = new TreeNode(newEntry.Name); - newEntryNode.Tag = newEntry; - - EntityInfo material = MaterialData.Find(m => m.InternalName == newEntry.Name); - newEntryNode.Text = material.DisplayName; - newEntryNode.ImageIndex = MaterialData.IndexOf(material); - newEntryNode.SelectedImageIndex = newEntryNode.ImageIndex; - treeView1.Nodes.Add(newEntryNode); + EditorValue.Add(newEntry); + UpdateTreeview(); } } diff --git a/PCK-Studio/Forms/Editor/ModelEditor.Designer.cs b/PCK-Studio/Forms/Editor/ModelEditor.Designer.cs new file mode 100644 index 00000000..1f4b62a3 --- /dev/null +++ b/PCK-Studio/Forms/Editor/ModelEditor.Designer.cs @@ -0,0 +1,254 @@ +namespace PckStudio.Forms.Editor +{ + partial class ModelEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.modelTreeView = new System.Windows.Forms.TreeView(); + this.modelContextMenu = new MetroFramework.Controls.MetroContextMenu(this.components); + this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.importToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showModelBoundsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.modelViewport = new PckStudio.Rendering.ModelRenderer(); + this.namedTexturesTreeView = new System.Windows.Forms.TreeView(); + this.textureImageList = new System.Windows.Forms.ImageList(this.components); + this.modelContextMenu.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // modelTreeView + // + this.modelTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.modelTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.modelTreeView.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.modelTreeView.ContextMenuStrip = this.modelContextMenu; + this.modelTreeView.ForeColor = System.Drawing.SystemColors.Window; + this.modelTreeView.HideSelection = false; + this.modelTreeView.Location = new System.Drawing.Point(3, 3); + this.modelTreeView.Name = "modelTreeView"; + this.modelTreeView.PathSeparator = "."; + this.tableLayoutPanel1.SetRowSpan(this.modelTreeView, 2); + this.modelTreeView.Size = new System.Drawing.Size(287, 440); + this.modelTreeView.TabIndex = 0; + this.modelTreeView.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.modelTreeView_BeforeSelect); + // + // modelContextMenu + // + this.modelContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportToolStripMenuItem, + this.editToolStripMenuItem, + this.removeToolStripMenuItem}); + this.modelContextMenu.Name = "modelContextMenu"; + this.modelContextMenu.Size = new System.Drawing.Size(118, 70); + // + // exportToolStripMenuItem + // + this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; + this.exportToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.exportToolStripMenuItem.Text = "Export"; + this.exportToolStripMenuItem.Click += new System.EventHandler(this.exportToolStripMenuItem_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.editToolStripMenuItem.Text = "Edit"; + this.editToolStripMenuItem.Visible = false; + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.removeToolStripMenuItem.Text = "Remove"; + this.removeToolStripMenuItem.Visible = false; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); + // + // menuStrip1 + // + this.menuStrip1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.menuStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.viewToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(20, 60); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(660, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.BackColor = System.Drawing.Color.Transparent; + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.importToolStripMenuItem1, + this.saveToolStripMenuItem}); + this.fileToolStripMenuItem.ForeColor = System.Drawing.SystemColors.Control; + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "File"; + // + // importToolStripMenuItem1 + // + this.importToolStripMenuItem1.Name = "importToolStripMenuItem1"; + this.importToolStripMenuItem1.Size = new System.Drawing.Size(110, 22); + this.importToolStripMenuItem1.Text = "Import"; + this.importToolStripMenuItem1.Click += new System.EventHandler(this.importToolStripMenuItem1_Click); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(110, 22); + this.saveToolStripMenuItem.Text = "Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.showModelBoundsToolStripMenuItem}); + this.viewToolStripMenuItem.ForeColor = System.Drawing.SystemColors.Control; + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // showModelBoundsToolStripMenuItem + // + this.showModelBoundsToolStripMenuItem.CheckOnClick = true; + this.showModelBoundsToolStripMenuItem.Name = "showModelBoundsToolStripMenuItem"; + this.showModelBoundsToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.showModelBoundsToolStripMenuItem.Text = "Show Model Bounds"; + this.showModelBoundsToolStripMenuItem.CheckedChanged += new System.EventHandler(this.showModelBoundsToolStripMenuItem_CheckedChanged); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.modelViewport, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.namedTexturesTreeView, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.modelTreeView, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(20, 84); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(660, 446); + this.tableLayoutPanel1.TabIndex = 2; + // + // modelViewport + // + this.modelViewport.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(30)))), ((int)(((byte)(30))))); + this.modelViewport.Dock = System.Windows.Forms.DockStyle.Fill; + this.modelViewport.Location = new System.Drawing.Point(296, 3); + this.modelViewport.MouseSensetivity = 0.01F; + this.modelViewport.Name = "modelViewport"; + this.modelViewport.RefreshRate = 120; + this.modelViewport.RenderModelBounds = false; + this.modelViewport.Size = new System.Drawing.Size(361, 261); + this.modelViewport.TabIndex = 1; + this.modelViewport.VSync = true; + // + // namedTexturesTreeView + // + this.namedTexturesTreeView.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20))))); + this.namedTexturesTreeView.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.namedTexturesTreeView.Dock = System.Windows.Forms.DockStyle.Fill; + this.namedTexturesTreeView.ForeColor = System.Drawing.SystemColors.Window; + this.namedTexturesTreeView.FullRowSelect = true; + this.namedTexturesTreeView.HideSelection = false; + this.namedTexturesTreeView.ImageIndex = 0; + this.namedTexturesTreeView.ImageList = this.textureImageList; + this.namedTexturesTreeView.Location = new System.Drawing.Point(296, 270); + this.namedTexturesTreeView.Name = "namedTexturesTreeView"; + this.namedTexturesTreeView.SelectedImageIndex = 0; + this.namedTexturesTreeView.ShowLines = false; + this.namedTexturesTreeView.ShowPlusMinus = false; + this.namedTexturesTreeView.ShowRootLines = false; + this.namedTexturesTreeView.Size = new System.Drawing.Size(361, 173); + this.namedTexturesTreeView.TabIndex = 2; + this.namedTexturesTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.namedTexturesTreeView_AfterSelect); + // + // textureImageList + // + this.textureImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; + this.textureImageList.ImageSize = new System.Drawing.Size(36, 36); + this.textureImageList.TransparentColor = System.Drawing.Color.Transparent; + // + // ModelEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(700, 550); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(700, 550); + this.Name = "ModelEditor"; + this.Style = MetroFramework.MetroColorStyle.Silver; + this.Text = "Model Editor"; + this.Theme = MetroFramework.MetroThemeStyle.Dark; + this.modelContextMenu.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TreeView modelTreeView; + private MetroFramework.Controls.MetroContextMenu modelContextMenu; + private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem importToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private Rendering.ModelRenderer modelViewport; + private System.Windows.Forms.TreeView namedTexturesTreeView; + private System.Windows.Forms.ImageList textureImageList; + private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showModelBoundsToolStripMenuItem; + } +} \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/ModelEditor.cs b/PCK-Studio/Forms/Editor/ModelEditor.cs new file mode 100644 index 00000000..124fa073 --- /dev/null +++ b/PCK-Studio/Forms/Editor/ModelEditor.cs @@ -0,0 +1,342 @@ +using System; +using System.IO; +using System.Data; +using System.Linq; +using System.Drawing; +using System.Diagnostics; +using System.Windows.Forms; +using System.Collections.Generic; + +using OMI.Formats.Model; +using MetroFramework.Forms; + +using PckStudio.Controls; +using PckStudio.Interfaces; +using OMI.Formats.Material; +using PckStudio.ModelSupport; +using PckStudio.Core.Json; +using PckStudio.Core.Extensions; +using PckStudio.Internal.App; +using PckStudio.Core; + +namespace PckStudio.Forms.Editor +{ + public partial class ModelEditor : EditorForm + { + private readonly ITryGetSet _textures; + private readonly ITryGet _tryGetEntityMaterial; + + public ModelEditor(ModelContainer models, ISaveContext saveContext, ITryGetSet tryGetSetTextures, ITryGet tryGetEntityMaterial) + : base(models, saveContext) + { + InitializeComponent(); + _textures = tryGetSetTextures; + _tryGetEntityMaterial = tryGetEntityMaterial; + modelTreeView.ImageList = new ImageList + { + ColorDepth = ColorDepth.Depth32Bit, + ImageSize = new Size(32, 32) + }; + modelTreeView.ImageList.Images.AddRange(ApplicationScope.EntityImages); + } + + private const int InvalidImageIndex = 127; + // TODO: move to json file. -miku + private static Dictionary ModelImageIndex = new Dictionary() + { + ["bat"] = 3, + ["blaze"] = 4, + ["boat"] = 5, + ["cat"] = 6, + ["spider"] = 107, + ["chicken"] = 9, + ["cod"] = 10, + ["cow"] = 12, + ["creeper"] = 13, + ["creeper_head"] = 13, + ["dolphin"] = 14, + ["horse.v2"] = 110, + ["guardian"] = 109, + ["bed"] = 108, + ["dragon"] = 21, + ["dragon_head"] = 21, + ["enderman"] = 23, + ["ghast"] = 34, + ["irongolem"] = 40, + ["lavaslime"] = 46, + ["llama"] = 44, + ["llamaspit"] = 45, + ["minecart"] = 47, + ["ocelot"] = 50, + ["parrot"] = 53, + ["phantom"] = 54, + ["pig"] = 55, + ["pigzombie"] = 94, + ["polarbear"] = 57, + ["rabbit"] = 60, + ["sheep"] = 63, + ["sheep.sheared"] = 113, + ["shulker"] = 64, + ["silverfish"] = 66, + ["skeleton"] = 67, + ["skeleton_head"] = 67, + ["skeleton.stray"] = 77, + ["skeleton.wither"] = 89, + ["skeleton_wither_head"] = 89, + ["slime"] = 115, + ["slime.armor"] = 116, + + ["snowgolem"] = 71, + ["squid"] = 76, + ["trident"] = 80, + ["turtle"] = 82, + ["villager"] = 84, + ["villager.witch"] = 87, + + ["vex"] = 83, + ["evoker"] = 25, + ["vindicator"] = 25, + ["witherBoss"] = 88, + ["wolf"] = 91, + ["zombie"] = 92, + ["zombie_head"] = 92, + ["zombie.husk"] = 39, + ["zombie.villager"] = 95, + ["zombie.drowned"] = 17, + ["endermite"] = 24, + ["pufferfish.small"] = 111, + ["pufferfish.mid"] = 112, + ["pufferfish.large"] = 59, + ["salmon"] = 62, + ["stray.armor"] = 118, + ["stray_armor"] = 118, + ["tropicalfish_a"] = 81, + ["tropicalfish_b"] = 81, + ["mooshroom"] = 48, + ["witherBoss.armor"] = 90, + + // 1.14 models + ["panda"] = 52, + ["ravager"] = 61, + ["pillager"] = 56, + ["villager_v2"] = 101, + ["zombie.villager_v2"] = 102, + }; + + private static int GetModelImageIndex(string name) => ModelImageIndex.TryGetValue(name, out int index) ? index : InvalidImageIndex; + + private class ModelNode : TreeNode + { + private Model _model; + public Model Model => _model; + + private ModelNode(Model model) + : base(model.Name) + { + _model = model; + ImageIndex = GetModelImageIndex(model.Name); + SelectedImageIndex = GetModelImageIndex(model.Name); + Nodes.AddRange(GetModelPartNodes(_model.GetParts()).ToArray()); + } + private static IEnumerable GetModelPartNodes(IEnumerable parts) => parts.Select(ModelPartNode.Create); + + internal static ModelNode Create(Model model) => new ModelNode(model); + } + + private class ModelPartNode : TreeNode + { + private ModelPart _part; + + public ModelPart Part => _part; + + private ModelPartNode(ModelPart part) + : base($"{part.Name} Pivot:{part.Translation * -1} Rot:{part.Rotation + part.AdditionalRotation} ") + { + _part = part; + ImageIndex = 126; + SelectedImageIndex = 126; + Nodes.AddRange(GetModelBoxNodes(part.GetBoxes()).ToArray()); + } + private static IEnumerable GetModelBoxNodes(IEnumerable boxes) => boxes.Select(ModelBoxNode.Create); + + internal static ModelPartNode Create(ModelPart part) => new ModelPartNode(part); + } + + private class ModelBoxNode : TreeNode + { + private ModelBox _modelBox; + public ModelBox Box => _modelBox; + private ModelBoxNode(ModelBox modelBox) + : base($"Box: pos:{modelBox.Position} size:{modelBox.Size}") + { + ImageIndex = 126; + SelectedImageIndex = 126; + _modelBox = modelBox; + } + + internal static ModelBoxNode Create(ModelBox modelBox) => new ModelBoxNode(modelBox); + } + + private class NamedTextureTreeNode : TreeNode + { + private readonly NamedData _namedTexture; + + public NamedTextureTreeNode(NamedData namedTexture) + : base(namedTexture.Name) + { + Tag = namedTexture; + _namedTexture = namedTexture; + } + + public Image GetTexture() => _namedTexture.Value; + } + + private void LoadModels() + { + modelTreeView.Nodes.Clear(); + modelTreeView.Nodes.AddRange(EditorValue.Select(ModelNode.Create).ToArray()); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + LoadModels(); + } + + private void exportToolStripMenuItem_Click(object sender, EventArgs e) + { + if (modelTreeView.SelectedNode is ModelNode modelNode) + { + Model model = modelNode.Model; + Debug.Write(model.Name + "; "); + Debug.WriteLine(model.TextureSize); + + GameModelImporter.Default.ExportSettings.CreateModelOutline = + MessageBox.Show( + $"Do you wish to have all model parts contained in a group called '{model.Name}'?", + "Group model parts", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes; + + using SaveFileDialog openFileDialog = new SaveFileDialog(); + openFileDialog.FileName = model.Name; + openFileDialog.Filter = GameModelImporter.Default.SupportedModelFileFormatsFilter; + + if (openFileDialog.ShowDialog(this) == DialogResult.OK) + { + IEnumerable> textures = GetModelTextures(model.Name); + var modelInfo = new GameModelInfo(model, textures); + GameModelImporter.Default.Export(openFileDialog.FileName, modelInfo); + } + } + } + + private void modelTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e) + { + exportToolStripMenuItem.Visible = e.Node is ModelNode; + removeToolStripMenuItem.Visible = e.Node is ModelNode; + editToolStripMenuItem.Visible = e.Node is ModelBoxNode; + //removeToolStripMenuItem.Visible = e.Node is ModelPartNode || e.Node is ModelBoxNode; + if (e.Node is ModelNode modelNode && modelNode.Model.Name != modelViewport.CurrentModelName) + { + NamedData[] textures = GetModelTextures(modelNode.Model.Name).ToArray(); + + textureImageList.Images.Clear(); + namedTexturesTreeView.Nodes.Clear(); + + foreach ((int i, NamedData item) in textures.enumerate()) + { + textureImageList.Images.Add(item.Value); + namedTexturesTreeView.Nodes.Add(new NamedTextureTreeNode(item) { ImageIndex = i, SelectedImageIndex = i }); + } + if (textures.Length != 0) + modelViewport.Texture = textures[0].Value; + + modelViewport.LoadModel(modelNode.Model); + if (GameModelImporter.ModelMetaData.TryGetValue(modelNode.Model.Name, out JsonModelMetaData modelMetaData) && !string.IsNullOrEmpty(modelMetaData.MaterialName) && + _tryGetEntityMaterial.TryGet(modelMetaData.MaterialName, out MaterialContainer.Material entityMaterial) || + _tryGetEntityMaterial.TryGet(modelNode.Model.Name, out entityMaterial)) + { + modelViewport.SetModelMaterial(entityMaterial); + } + modelViewport.ResetCamera(); + } + if (e.Node is ModelPartNode modelPartNode && modelPartNode.Parent is ModelNode parentNode && modelViewport.CurrentModelName == parentNode.Model.Name) + { + modelViewport.Highlight(modelPartNode.Part); + } + + if (e.Node is ModelBoxNode modelBoxNode && modelBoxNode.Parent is ModelPartNode parentPartNode && parentPartNode.Parent is ModelNode parentNode1 && + modelViewport.CurrentModelName == parentNode1.Model.Name) + { + modelViewport.Highlight(modelBoxNode.Box, parentPartNode.Part); + } + } + + private IEnumerable> GetModelTextures(string modelName) + { + if (!GameModelImporter.ModelMetaData.ContainsKey(modelName) || GameModelImporter.ModelMetaData[modelName]?.TextureLocations?.Length <= 0) + yield break; + foreach (var textureLocation in GameModelImporter.ModelMetaData[modelName].TextureLocations) + { + if (_textures.TryGet(textureLocation, out Image img)) + yield return new NamedData(Path.GetFileName(textureLocation), img); + } + yield break; + } + + private void importToolStripMenuItem1_Click(object sender, EventArgs e) + { + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Filter = GameModelImporter.Default.SupportedModelFileFormatsFilter; + fileDialog.Title = "Select model"; + if (fileDialog.ShowDialog() == DialogResult.OK) + { + GameModelInfo modelInfo = GameModelImporter.Default.Import(fileDialog.FileName); + if (modelInfo is null) + { + MessageBox.Show("Import failed.", ProductName); + return; + } + + //if (models.Version < modelInfo.ModelVersion) + //{ + // MessageBox.Show("Model container version does not match with the model version.", ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); + // return; + //} + + EditorValue.SetModel(modelInfo.Model); + + foreach (NamedData texture in modelInfo.Textures) + { + _textures.TrySet(texture.Name, texture.Value); + } + + LoadModels(); + } + } + + private void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + Save(); + DialogResult = DialogResult.OK; + } + + private void namedTexturesTreeView_AfterSelect(object sender, TreeViewEventArgs e) + { + if (namedTexturesTreeView.SelectedNode is NamedTextureTreeNode namedTextureNode) + modelViewport.Texture = namedTextureNode.GetTexture(); + } + + private void showModelBoundsToolStripMenuItem_CheckedChanged(object sender, EventArgs e) + { + modelViewport.RenderModelBounds = showModelBoundsToolStripMenuItem.Checked; + } + + private void removeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (modelTreeView?.SelectedNode is ModelNode modelNode && EditorValue.Remove(modelNode.Model)) + { + modelNode.Remove(); + } + } + } +} diff --git a/PCK-Studio/Forms/Editor/ModelEditor.resx b/PCK-Studio/Forms/Editor/ModelEditor.resx new file mode 100644 index 00000000..3a001628 --- /dev/null +++ b/PCK-Studio/Forms/Editor/ModelEditor.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 178, 17 + + + 293, 17 + + \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.Designer.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.Designer.cs index a9e55d22..4d888daa 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.Designer.cs @@ -36,6 +36,7 @@ this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.applyColorMaskToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.playAnimationsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.allowGroupsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.originalPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); this.selectTilePictureBox = new PckStudio.ToolboxItems.AnimationPictureBox(); @@ -102,7 +103,8 @@ // this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.applyColorMaskToolStripMenuItem, - this.playAnimationsToolStripMenuItem}); + this.playAnimationsToolStripMenuItem, + this.allowGroupsToolStripMenuItem}); this.viewToolStripMenuItem.ForeColor = System.Drawing.SystemColors.Control; this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); @@ -114,7 +116,7 @@ this.applyColorMaskToolStripMenuItem.CheckOnClick = true; this.applyColorMaskToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.applyColorMaskToolStripMenuItem.Name = "applyColorMaskToolStripMenuItem"; - this.applyColorMaskToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.applyColorMaskToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.applyColorMaskToolStripMenuItem.Text = "Apply Color Mask"; this.applyColorMaskToolStripMenuItem.CheckedChanged += new System.EventHandler(this.applyColorMaskToolStripMenuItem_CheckedChanged); // @@ -124,10 +126,20 @@ this.playAnimationsToolStripMenuItem.CheckOnClick = true; this.playAnimationsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.playAnimationsToolStripMenuItem.Name = "playAnimationsToolStripMenuItem"; - this.playAnimationsToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.playAnimationsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.playAnimationsToolStripMenuItem.Text = "Play Animations"; this.playAnimationsToolStripMenuItem.CheckedChanged += new System.EventHandler(this.playAnimationsToolStripMenuItem_CheckedChanged); // + // allowGroupsToolStripMenuItem + // + this.allowGroupsToolStripMenuItem.Checked = true; + this.allowGroupsToolStripMenuItem.CheckOnClick = true; + this.allowGroupsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.allowGroupsToolStripMenuItem.Name = "allowGroupsToolStripMenuItem"; + this.allowGroupsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.allowGroupsToolStripMenuItem.Text = "Allow Groups"; + this.allowGroupsToolStripMenuItem.CheckedChanged += new System.EventHandler(this.allowGroupsToolStripMenuItem_CheckedChanged); + // // tableLayoutPanel1 // this.tableLayoutPanel1.AutoSize = true; @@ -171,6 +183,7 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.originalPictureBox.BackColor = System.Drawing.Color.Transparent; + this.originalPictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; this.originalPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; this.originalPictureBox.Location = new System.Drawing.Point(217, 3); this.originalPictureBox.Name = "originalPictureBox"; @@ -187,8 +200,9 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.selectTilePictureBox.BackColor = System.Drawing.Color.Transparent; + this.selectTilePictureBox.BackgroundInterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Default; this.selectTilePictureBox.BlendColor = System.Drawing.Color.White; - this.selectTilePictureBox.BlendMode = PckStudio.Extensions.BlendMode.Multiply; + this.selectTilePictureBox.BlendMode = PckStudio.Core.Extensions.BlendMode.Multiply; this.tableLayoutPanel1.SetColumnSpan(this.selectTilePictureBox, 2); this.selectTilePictureBox.Image = null; this.selectTilePictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; @@ -384,5 +398,6 @@ private MetroFramework.Controls.MetroTrackBar colorSlider; private MetroFramework.Controls.MetroLabel colorSliderLabel; private MetroFramework.Controls.MetroButton extractButton; + private System.Windows.Forms.ToolStripMenuItem allowGroupsToolStripMenuItem; } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs index 58865e18..e10c37b1 100644 --- a/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs +++ b/PCK-Studio/Forms/Editor/TextureAtlasEditor.cs @@ -21,53 +21,61 @@ using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; -using System.IO; using System.Linq; using System.Windows.Forms; -using MetroFramework.Forms; - using OMI.Formats.Color; -using OMI.Formats.Pck; using OMI.Workers.Color; - -using PckStudio.Extensions; +using PckStudio.Controls; +using PckStudio.Core; +using PckStudio.Core.Extensions; +using PckStudio.Core.Json; +using PckStudio.Interfaces; using PckStudio.Internal; -using PckStudio.Internal.Deserializer; -using PckStudio.Internal.Json; -using PckStudio.Internal.Serializer; +using PckStudio.Properties; namespace PckStudio.Forms.Editor { - internal partial class TextureAtlasEditor : MetroForm + internal partial class TextureAtlasEditor : EditorForm { - private Image _atlasTexture; - public Image FinalTexture => DialogResult == DialogResult.OK ? _atlasTexture : null; - - private readonly PckFile _pckFile; - private ColorContainer _colourTable; - private readonly Size _tileAreaSize; - private readonly int _rowCount; - private readonly int _columnCount; - private readonly ResourceLocation _resourceLocation; - private readonly List _tiles; + private readonly ITryGet _tryGetAnimation; + private readonly ITryGet> _tryGetAnimationSaveContext; + private readonly ColorContainer _colourTable; + private readonly ResourceCategory _resourceLocationCategory; + private readonly Atlas _atlas; private AtlasTile _selectedTile; - // the "parent" tile for tiles that share name; i.e. parts of water_flow - private AtlasTile dataTile; - private sealed class AtlasTile + public TextureAtlasEditor(Atlas atlas, ISaveContext saveContext, ResourceLocation resourceLocation, ColorContainer colorContainer, + ITryGet tryGetAnimation, ITryGet> tryGetAnimationSaveContext) + : base(atlas, saveContext) { - internal readonly int Index; - internal readonly Rectangle Area; - internal readonly JsonTileInfo Tile; - internal readonly Image Texture; + InitializeComponent(); - public AtlasTile(int index, Rectangle area, JsonTileInfo tile, Image texture) + _ = atlas ?? throw new ArgumentNullException(nameof(atlas)); + _ = resourceLocation ?? throw new ArgumentNullException(nameof(resourceLocation)); + _atlas = atlas; + Text = _atlas.Name; + originalPictureBox.Image = atlas; + + _colourTable = colorContainer ?? AppResourceManager.Default.GetData(Resources.tu69colours, new COLFileReader()); + _tryGetAnimation = tryGetAnimation; + _tryGetAnimationSaveContext = tryGetAnimationSaveContext; + _resourceLocationCategory = resourceLocation.Category; + + SelectedIndex = 0; + + animationButton.Enabled = + _resourceLocationCategory == ResourceCategory.BlockAtlas || + _resourceLocationCategory == ResourceCategory.ItemAtlas; + + // this is directly based on Java's source code for handling enchanted hits + // the particle is assigned a random grayscale color between roughly 154 and 230 + // since critical hit is the only particle with this distinction, we just need to check the atlas type + if (_resourceLocationCategory == ResourceCategory.ParticleAtlas) { - Index = index; - Area = area; - Tile = tile; - Texture = texture; + colorSlider.Minimum = 154; + colorSlider.Maximum = 230; + colorSlider.Value = colorSlider.Maximum; } } @@ -76,11 +84,11 @@ namespace PckStudio.Forms.Editor set { if (value < 0) { - value += _tiles.Count; + value += _atlas.TileCount; } - else if (value >= _tiles.Count) + else if (value >= _atlas.TileCount) { - value -= _tiles.Count; + value -= _atlas.TileCount; } SetImageDisplayed(value); } @@ -94,104 +102,18 @@ namespace PckStudio.Forms.Editor PixelOffsetMode = PixelOffsetMode.HighQuality }; - public TextureAtlasEditor(PckFile pckFile, ResourceLocation resourceLocation, Image atlas) - { - InitializeComponent(); - - if (!AcquireColorTable(pckFile)) - { - MessageBox.Show("Failed to acquire color information", "Acquire failure", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); - return; - } - - _atlasTexture = atlas; - _tileAreaSize = resourceLocation.GetTileArea(atlas.Size); - _pckFile = pckFile; - _rowCount = atlas.Width / _tileAreaSize.Width; - _columnCount = atlas.Height / _tileAreaSize.Height; - _resourceLocation = resourceLocation; - List tileInfos = resourceLocation.Category switch - { - ResourceCategory.BlockAtlas => Tiles.BlockTileInfos, - ResourceCategory.ItemAtlas => Tiles.ItemTileInfos, - ResourceCategory.ParticleAtlas => Tiles.ParticleTileInfos, - ResourceCategory.MapIconAtlas => Tiles.MapIconTileInfos, - ResourceCategory.AdditionalMapIconsAtlas => Tiles.AdditionalMapIconTileInfos, - ResourceCategory.MoonPhaseAtlas => Tiles.MoonPhaseTileInfos, - ResourceCategory.ExperienceOrbAtlas => Tiles.ExperienceOrbTileInfos, - ResourceCategory.ExplosionAtlas => Tiles.ExplosionTileInfos, - ResourceCategory.PaintingAtlas => Tiles.PaintingTileInfos, - ResourceCategory.BannerAtlas => Tiles.BannerTileInfos, - _ => null, - }; - - originalPictureBox.Image = new Bitmap(atlas); - - IEnumerable images = atlas.Split(_tileAreaSize, _imageLayout); - - AtlasTile MakeTile((int index, Image value) p) - { - int i = p.index; - JsonTileInfo tileInfo = tileInfos.IndexInRange(i) ? tileInfos[i] : null; - - Rectangle atlasArea = GetAtlasArea(i, tileInfo?.TileWidth ?? 1, tileInfo?.TileHeight ?? 1, _rowCount, _columnCount, _tileAreaSize, _imageLayout); - - // get texture for tiles that are not 1x1 tiles - Point selectedPoint = GetSelectedPoint(i, _rowCount, _columnCount, _imageLayout); - - var textureLocation = new Point(selectedPoint.X * _tileAreaSize.Width, selectedPoint.Y * _tileAreaSize.Height); - var textureSize = new Size(tileInfos[i].TileWidth * _tileAreaSize.Width, tileInfos[i].TileHeight * _tileAreaSize.Height); - var textureArea = new Rectangle(textureLocation, textureSize); - - Image texture = tileInfos.IndexInRange(i) ? atlas.GetArea(textureArea) : p.value; - return new AtlasTile(i, atlasArea, tileInfo, texture); - } - - _tiles = new List(images.enumerate().Select(MakeTile)); - - SelectedIndex = 0; - - animationButton.Enabled = - _resourceLocation.Category == ResourceCategory.BlockAtlas || - _resourceLocation.Category == ResourceCategory.ItemAtlas; - - // this is directly based on Java's source code for handling enchanted hits - // the particle is assigned a random grayscale color between roughly 154 and 230 - // since critical hit is the only particle with this distinction, we just need to check the atlas type - if (_resourceLocation.Category == ResourceCategory.ParticleAtlas) - { - colorSlider.Minimum = 154; - colorSlider.Maximum = 230; - colorSlider.Value = colorSlider.Maximum; - } - } - - private bool AcquireColorTable(PckFile pckFile) - { - if (pckFile.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out PckAsset colAsset) && - colAsset.Size > 0) - { - using var ms = new MemoryStream(colAsset.Data); - var reader = new COLFileReader(); - _colourTable = reader.FromStream(ms); - return true; - } - _colourTable = null; - return false; - } - private void UpdateAtlasDisplay() { using (var g = Graphics.FromImage(originalPictureBox.Image)) { g.ApplyConfig(_graphicsConfig); g.Clear(Color.Transparent); - g.DrawImage(_atlasTexture, 0, 0, _atlasTexture.Width, _atlasTexture.Height); + Image image = EditorValue; + g.DrawImage(image, 0, 0, image.Width, image.Height); SolidBrush brush = new SolidBrush(Color.FromArgb(127, Color.White)); - g.FillRectangle(brush, _selectedTile.Area); + g.FillRectangle(brush, allowGroupsToolStripMenuItem.Checked ? _atlas.GetTileArea(_selectedTile) : _selectedTile.GetArea(_atlas.TileSize)); } - originalPictureBox.Invalidate(); } @@ -213,51 +135,42 @@ namespace PckStudio.Forms.Editor selectTilePictureBox.Stop(); selectTilePictureBox.UseBlendColor = false; selectTilePictureBox.Image = null; + _selectedTile = _atlas[index]; - if (_tiles is null || !_tiles.IndexInRange(index) || (_selectedTile = _tiles[index]) is null) + if (_selectedTile is null) return; UpdateAtlasDisplay(); - dataTile = _selectedTile; - if (string.IsNullOrEmpty(dataTile.Tile.DisplayName) && !string.IsNullOrEmpty(dataTile.Tile.InternalName)) - { - dataTile = _tiles.Find(t => t.Tile.InternalName == _selectedTile.Tile.InternalName); - } - - selectTilePictureBox.Image = dataTile.Texture; + selectTilePictureBox.Image = _selectedTile.Texture; selectTilePictureBox.BlendColor = GetBlendColor(); selectTilePictureBox.UseBlendColor = applyColorMaskToolStripMenuItem.Checked; - tileNameLabel.Text = $"{dataTile.Tile.DisplayName}"; - internalTileNameLabel.Text = $"{dataTile.Tile.InternalName}"; + JsonTileInfo tileInfo = _selectedTile.GetUserDataOfType(); - if (animationButton.Enabled) + tileNameLabel.Text = $"{tileInfo?.DisplayName}"; + internalTileNameLabel.Text = $"{tileInfo?.InternalName}"; + if (animationButton.Enabled && (_resourceLocationCategory == ResourceCategory.ItemAtlas || _resourceLocationCategory == ResourceCategory.BlockAtlas)) { - PckAsset animationAsset; - ResourceCategory animationResourceCategory = _resourceLocation.Category == ResourceCategory.ItemAtlas ? ResourceCategory.ItemAnimation : ResourceCategory.BlockAnimation; + ResourceCategory animationResourceCategory = _resourceLocationCategory == ResourceCategory.ItemAtlas ? ResourceCategory.ItemAnimation : ResourceCategory.BlockAnimation; - string animationAssetPath = $"{ResourceLocation.GetPathFromCategory(animationResourceCategory)}/{dataTile.Tile.InternalName}"; - bool hasAnimation = - _pckFile.TryGetValue($"{animationAssetPath}.png", PckAssetType.TextureFile, out animationAsset) || - _pckFile.TryGetValue($"{animationAssetPath}.tga", PckAssetType.TextureFile, out animationAsset); + string animationAssetPath = $"{ResourceLocation.GetPathFromCategory(animationResourceCategory)}/{tileInfo.InternalName}"; + bool hasAnimation = _tryGetAnimation.TryGet(animationAssetPath, out Animation animation); animationButton.Text = hasAnimation ? "Edit Animation" : "Create Animation"; - // asset size check dont have to be done here the deserializer handles it. -Miku if (playAnimationsToolStripMenuItem.Checked && hasAnimation) { - Animation animation = animationAsset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); - selectTilePictureBox.Image = animation.CreateAnimationImage(); + selectTilePictureBox.Image = animation.CreateAnimationImage(selectTilePictureBox.BlendColor); selectTilePictureBox.Start(); } } - setColorButton.Enabled = dataTile.Tile.AllowCustomColour; + setColorButton.Enabled = tileInfo.AllowCustomColour; - variantComboBox.Enabled = variantComboBox.Visible = dataTile.Tile.HasColourEntry && dataTile.Tile.ColourEntry?.Variants?.Length > 1; + variantComboBox.Enabled = variantComboBox.Visible = tileInfo.HasColourEntry && tileInfo.ColourEntry?.Variants?.Length > 1; if (variantComboBox.Enabled) { - if (dataTile.Tile.ColourEntry.IsWaterColour) + if (tileInfo.ColourEntry.IsWaterColour) { foreach (ColorContainer.WaterColor col in _colourTable.WaterColors) { @@ -267,11 +180,34 @@ namespace PckStudio.Forms.Editor } // TODO: only add variants that are available in the color table - variantComboBox.Items.AddRange(dataTile.Tile.ColourEntry.Variants); + variantComboBox.Items.AddRange(tileInfo.ColourEntry.Variants.Where(colorName => _colourTable.Colors.Any(c => c.Name == colorName) || _colourTable.WaterColors.Any(c => c.Name == colorName)).ToArray()); if (variantComboBox.Items.Count > 0) variantComboBox.SelectedIndex = 0; } + + if (_selectedTile.IsPartOfGroup && allowGroupsToolStripMenuItem.Checked) + { + AtlasGroup group = _selectedTile.GetGroup(); + tileNameLabel.Text = $"{group.Name}"; + internalTileNameLabel.Text = string.Empty; + if (group.IsAnimation()) + { + animationButton.Enabled = true; + animationButton.Text = "Edit as Animation"; + if (playAnimationsToolStripMenuItem.Checked) + { + selectTilePictureBox.UseBlendColor = false; + selectTilePictureBox.Image = _atlas.GetAnimationFromGroup(group).CreateAnimationImage(selectTilePictureBox.BlendColor); + selectTilePictureBox.Start(); + return; + } + } + if (group.IsLargeTile()) + { + selectTilePictureBox.Image = _atlas.GetTileTexture(_selectedTile); + } + } } private static int GetSelectedImageIndex( @@ -344,6 +280,7 @@ namespace PckStudio.Forms.Editor default: break; } + Debug.WriteLine(result); return GetSelectedIndex(result.X, result.Y, rowCount, columnCount, imageLayout); } @@ -357,47 +294,31 @@ namespace PckStudio.Forms.Editor }; } - private static Rectangle GetAtlasArea(int index, int tileWidth, int tileHeight, int rowCount, int columnCount, Size size, ImageLayoutDirection imageLayout) - { - Point p = GetSelectedPoint(index, rowCount, columnCount, imageLayout); - var ap = new Point(p.X * size.Width, p.Y * size.Height); - return new Rectangle(ap, new Size(size.Width * tileWidth, size.Height * tileHeight)); - } - - private static Point GetSelectedPoint(int index, int rowCount, int columnCount, ImageLayoutDirection imageLayout) - { - int y = Math.DivRem(index, rowCount, out int x); - if (imageLayout == ImageLayoutDirection.Vertical) - x = Math.DivRem(index, columnCount, out y); - return new Point(x, y); - } - private void SetTile(Image texture) { - if (texture.Size != _tileAreaSize) - texture = texture.Resize(_tileAreaSize, _graphicsConfig); - - using (var g = Graphics.FromImage(_atlasTexture)) + if (_selectedTile.IsPartOfGroup) { - g.ApplyConfig(_graphicsConfig); - g.Fill(dataTile.Area, Color.Transparent); - g.DrawImage(texture, dataTile.Area); + AtlasGroup group = _selectedTile.GetGroup(); + _atlas.SetGroup(group, texture); + selectTilePictureBox.Image = _atlas.GetTileTexture(_selectedTile); + UpdateAtlasDisplay(); + return; } - AtlasTile tile = _selectedTile != dataTile ? dataTile : _selectedTile; - _tiles[tile.Index] = new AtlasTile(tile.Index, tile.Area, tile.Tile, texture); + if (texture.Size != _atlas.TileSize) + texture = texture.Resize(_atlas.TileSize, _graphicsConfig); + + _selectedTile.Texture = texture; selectTilePictureBox.Image = texture; UpdateAtlasDisplay(); } private Color GetBlendColor() { - if (dataTile.Tile.HasColourEntry && dataTile.Tile.ColourEntry is not null) + if (_selectedTile.TryGetUserDataOfType(out JsonTileInfo tileInfo) && tileInfo.HasColourEntry) { - Color col = FindBlendColorByKey(dataTile.Tile.ColourEntry.DefaultName); - return col; + return FindBlendColorByKey(tileInfo.ColourEntry.DefaultName); } - return Color.White; } @@ -413,7 +334,7 @@ namespace PckStudio.Forms.Editor var final_color = Color.FromArgb(colorSlider.Value, colorSlider.Value, colorSlider.Value); // Enchanted hits are modified critical hit particles - if (dataTile.Tile.InternalName == "enchanted_hit") + if (_selectedTile.TryGetUserDataOfType(out JsonTileInfo tileInfo) && tileInfo.InternalName == "enchanted_hit") { // This is directly based on Java's source code for handling enchanted hits // it just multiplies the red by 0.3 and green by .8 of the color assigned to the critical hit particle @@ -428,28 +349,36 @@ namespace PckStudio.Forms.Editor if (colorKey == "experience_orb" || colorKey == "critical_hit") return GetSpecificBlendColor(colorKey); - if (dataTile.Tile.HasColourEntry && dataTile.Tile.ColourEntry is not null) + if (!_selectedTile.TryGetUserDataOfType(out JsonTileInfo tileInfo) || !tileInfo.HasColourEntry) { - // basic way to check for classic water colors - if(!dataTile.Tile.ColourEntry.IsWaterColour || colorKey.StartsWith("Water_")) + Debug.WriteLine("Could not find: " + colorKey); + return Color.White; + } + + // basic way to check for classic water colors + if (!tileInfo.ColourEntry.IsWaterColour || colorKey.StartsWith("Water_")) + { + if (_colourTable.Colors.FirstOrDefault(entry => entry.Name == colorKey) is ColorContainer.Color color) { - if (_colourTable.Colors.FirstOrDefault(entry => entry.Name == colorKey) is ColorContainer.Color color) - { - return color.ColorPallette; - } - } - else if (_colourTable.WaterColors.FirstOrDefault(entry => entry.Name == colorKey) is ColorContainer.WaterColor waterColor) - { - return waterColor.SurfaceColor; + return color.ColorPallette; } } + else if (_colourTable.WaterColors.FirstOrDefault(entry => entry.Name == colorKey) is ColorContainer.WaterColor waterColor) + { + return waterColor.SurfaceColor; + } Debug.WriteLine("Could not find: " + colorKey); return Color.White; } + // TODO(null): check for large tile and get skip length protected override bool ProcessDialogKey(Keys keyData) { + int up = -_atlas.Rows; + int down = _atlas.Rows; + int left = -1; + int right = 1; switch (keyData) { case Keys.R: @@ -457,16 +386,16 @@ namespace PckStudio.Forms.Editor SelectedIndex = _selectedTile.Index; return true; case Keys.Left: - SelectedIndex = _selectedTile.Index - 1; + SelectedIndex = _selectedTile.Index + left; return true; case Keys.Right: - SelectedIndex = _selectedTile.Index + 1; + SelectedIndex = _selectedTile.Index + right; return true; case Keys.Up: - SelectedIndex = _selectedTile.Index - _rowCount; + SelectedIndex = _selectedTile.Index + up; return true; case Keys.Down: - SelectedIndex = _selectedTile.Index + _rowCount; + SelectedIndex = _selectedTile.Index + down; return true; } @@ -482,8 +411,8 @@ namespace PckStudio.Forms.Editor int index = GetSelectedImageIndex( originalPictureBox.Size, - _atlasTexture.Size, - _tileAreaSize, + ((Image)_atlas).Size, + _atlas.TileSize, e.Location, originalPictureBox.SizeMode, _imageLayout); @@ -504,28 +433,43 @@ namespace PckStudio.Forms.Editor if (fileDialog.ShowDialog(this) == DialogResult.OK) { - var img = Image.FromFile(fileDialog.FileName); + Image img = Image.FromFile(fileDialog.FileName).ReleaseFromFile(); SetTile(img); } } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { + Save(); DialogResult = DialogResult.OK; } private void animationButton_Click(object sender, EventArgs e) { - ResourceCategory animationResourceCategory = _resourceLocation.Category == ResourceCategory.ItemAtlas ? ResourceCategory.ItemAnimation : ResourceCategory.BlockAnimation; - string animationAssetPath = $"{ResourceLocation.GetPathFromCategory(animationResourceCategory)}/{_selectedTile.Tile.InternalName}.png"; - PckAsset asset = _pckFile.GetOrCreate(animationAssetPath, PckAssetType.TextureFile); + if (_selectedTile.IsPartOfGroup) + { + AtlasGroup group = _selectedTile.GetGroup(); + Animation anim = _atlas.GetAnimationFromGroup(group); + ISaveContext saveContext = new DelegatedSaveContext(false, (animation) => + { + //! TODO(null): Test for functionallity + _atlas.SetGroupTilesFromAnimation(group, animation); + }); + var aEditor = new AnimationEditor(anim, saveContext, group.Name, false); + aEditor.ShowDialog(this); + return; + } + JsonTileInfo tileInfo = _selectedTile.GetUserDataOfType(); + ResourceCategory animationResourceCategory = _resourceLocationCategory == ResourceCategory.ItemAtlas ? ResourceCategory.ItemAnimation : ResourceCategory.BlockAnimation; + string animationAssetPath = $"{ResourceLocation.GetPathFromCategory(animationResourceCategory)}/{tileInfo.InternalName}"; + bool hasAnimation = _tryGetAnimation.TryGet(animationAssetPath, out Animation animation); + bool isValidAnimationSaveContext = _tryGetAnimationSaveContext.TryGet(animationAssetPath, out ISaveContext animationSaveContext); - Animation animation = asset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); + Debug.Assert(isValidAnimationSaveContext, "Couldn't get valid animation save context."); - var animationEditor = new AnimationEditor(animation, _selectedTile.Tile.DisplayName); + var animationEditor = new AnimationEditor(hasAnimation ? animation : Animation.CreateEmpty(), animationSaveContext, tileInfo.DisplayName); if (animationEditor.ShowDialog(this) == DialogResult.OK) { - asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); // so animations can automatically update upon saving SelectedIndex = _selectedTile.Index; } @@ -533,25 +477,44 @@ namespace PckStudio.Forms.Editor private void extractTileToolStripMenuItem_Click(object sender, EventArgs e) { + string filename = GetSanitizedFilename(); SaveFileDialog saveFileDialog = new SaveFileDialog() { Filter = "Tile Texture|*.png", - FileName = _selectedTile.Tile.InternalName + FileName = filename }; if (saveFileDialog.ShowDialog(this) == DialogResult.OK) { - dataTile.Texture.Save(saveFileDialog.FileName, ImageFormat.Png); + _atlas.GetTileTexture(_selectedTile).Save(saveFileDialog.FileName, ImageFormat.Png); + //Process.Start("explorer.exe", $"{saveFileDialog.FileName}"); } } + private string GetSanitizedFilename() + { + if (_selectedTile.IsPartOfGroup) + { + AtlasGroup group = _selectedTile.GetGroup(); + return group.Name.Replace(' ', '_').Trim().ToLower(); + } + if (_selectedTile.TryGetUserDataOfType(out JsonTileInfo tileInfo) && !string.IsNullOrWhiteSpace(tileInfo.InternalName)) + return tileInfo.InternalName; + return "tile"; + } + private void variantComboBox_SelectedIndexChanged(object sender, EventArgs e) { - if (dataTile.Tile.ColourEntry is not null && variantComboBox.SelectedItem is not null) + if (_selectedTile.TryGetUserDataOfType(out JsonTileInfo tileInfo) && variantComboBox.SelectedItem is not null) { string colorKey = variantComboBox.SelectedItem.ToString(); - - selectTilePictureBox.BlendColor = FindBlendColorByKey(colorKey); - selectTilePictureBox.Image = dataTile.Texture; + Color blendColor = FindBlendColorByKey(colorKey); + if (_selectedTile.IsPartOfGroup && _selectedTile.GetGroup().IsAnimation()) + { + selectTilePictureBox.Image = _atlas.GetAnimationFromGroup(_selectedTile.GetGroup()).CreateAnimationImage(blendColor); + selectTilePictureBox.Start(); + return; + } + selectTilePictureBox.BlendColor = blendColor; } } @@ -573,35 +536,18 @@ namespace PckStudio.Forms.Editor private void setColorButton_Click(object sender, EventArgs e) { - ColorDialog colorPick = new ColorDialog(); - colorPick.AllowFullOpen = true; - colorPick.AnyColor = true; - colorPick.SolidColorOnly = true; + ColorDialog colorPick = new ColorDialog + { + AllowFullOpen = true, + AnyColor = true, + SolidColorOnly = true, + CustomColors = GameConstants.DyeColors.Select(ColorExtensions.ToBGR).ToArray() + }; - //Debug.Assert(Color.FromArgb(0xf9fffe).ToBGR() == 0xfefff9); // White - //Debug.Assert(Color.FromArgb(0xf9801d).ToBGR() == 0x1d80f9); // Orange - //Debug.Assert(Color.FromArgb(0xc74ebd).ToBGR() == 0xbd4ec7); // Magenta - //Debug.Assert(Color.FromArgb(0x3ab3da).ToBGR() == 0xdab33a); // Light Blue - //Debug.Assert(Color.FromArgb(0xfed83d).ToBGR() == 0x3dd8fe); // Yellow - //Debug.Assert(Color.FromArgb(0x80c71f).ToBGR() == 0x1fc780); // Lime - //Debug.Assert(Color.FromArgb(0xf38baa).ToBGR() == 0xaa8bf3); // Pink - //Debug.Assert(Color.FromArgb(0x474f52).ToBGR() == 0x524f47); // Gray - //Debug.Assert(Color.FromArgb(0x9d9d97).ToBGR() == 0x979d9d); // Light Gray - //Debug.Assert(Color.FromArgb(0x169c9c).ToBGR() == 0x9c9c16); // Cyan - //Debug.Assert(Color.FromArgb(0x8932b8).ToBGR() == 0xb83289); // Purple - //Debug.Assert(Color.FromArgb(0x3c44aa).ToBGR() == 0xaa443c); // Blue - //Debug.Assert(Color.FromArgb(0x835432).ToBGR() == 0x325483); // Brown - //Debug.Assert(Color.FromArgb(0x5e7c16).ToBGR() == 0x167c5e); // Green - //Debug.Assert(Color.FromArgb(0xb02e26).ToBGR() == 0x262eb0); // Red - //Debug.Assert(Color.FromArgb(0x1d1d21).ToBGR() == 0x211d1d); // Black - - colorPick.CustomColors = GameConstants.DyeColors.Select(c => c.ToBGR()).ToArray(); - if (colorPick.ShowDialog(this) != DialogResult.OK) return; selectTilePictureBox.BlendColor = colorPick.Color; - selectTilePictureBox.Image = dataTile.Texture; variantComboBox.Enabled = false; clearColorButton.Enabled = true; } @@ -610,7 +556,7 @@ namespace PckStudio.Forms.Editor { variantComboBox.Enabled = true; - variantComboBox_SelectedIndexChanged(sender, e); + selectTilePictureBox.BlendColor = Color.White; clearColorButton.Enabled = false; } @@ -618,7 +564,11 @@ namespace PckStudio.Forms.Editor private void colorSlider_ValueChanged(object sender, EventArgs e) { selectTilePictureBox.BlendColor = GetBlendColor(); - selectTilePictureBox.Image = dataTile.Texture; + } + + private void allowGroupsToolStripMenuItem_CheckedChanged(object sender, EventArgs e) + { + SelectedIndex = _selectedTile.Index; } } } \ No newline at end of file diff --git a/PCK-Studio/Forms/Features/CemuPanel.cs b/PCK-Studio/Forms/Features/CemuPanel.cs index b89fa199..de85ef9b 100644 --- a/PCK-Studio/Forms/Features/CemuPanel.cs +++ b/PCK-Studio/Forms/Features/CemuPanel.cs @@ -16,14 +16,14 @@ * 3. This notice may not be removed or altered from any source distribution. **/ using System; -using System.Xml; using System.IO; +using System.Xml; using System.Linq; -using System.Windows.Forms; -using PckStudio.Extensions; -using PckStudio.Internal.Misc; using System.Diagnostics; +using System.Windows.Forms; +using PckStudio.Core.Misc; using PckStudio.Properties; +using PckStudio.Core.Extensions; namespace PckStudio.Forms.Features { diff --git a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs index 863353b7..9d56174b 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs +++ b/PCK-Studio/Forms/Skins-And-Textures/AdvancedOptions.cs @@ -2,13 +2,11 @@ using OMI; using OMI.Formats.Pck; using OMI.Workers.Pck; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; -using System.Drawing; -using System.IO; using System.Linq; using System.Windows.Forms; @@ -20,11 +18,11 @@ namespace PckStudio.Popups { set { - _endianness = value ? Endianness.LittleEndian : Endianness.BigEndian; + _endianness = value ? ByteOrder.LittleEndian : ByteOrder.BigEndian; } } private readonly PckFile _pckFile; - private Endianness _endianness; + private ByteOrder _endianness; public AdvancedOptions(PckFile pckFile) { @@ -54,9 +52,7 @@ namespace PckStudio.Popups { try { - var reader = new PckFileReader(_endianness); - using var ms = new MemoryStream(asset.Data); - PckFile subPCK = reader.FromStream(ms); + PckFile subPCK = asset.GetData(new PckFileReader(_endianness)); applyBulkProperties(subPCK.GetAssets(), index); asset.SetData(new PckFileWriter(subPCK, _endianness)); } diff --git a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.Designer.cs b/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.Designer.cs deleted file mode 100644 index b7b3f5ef..00000000 --- a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.Designer.cs +++ /dev/null @@ -1,75 +0,0 @@ - -namespace PckStudio.Forms -{ - partial class SkinPreview - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SkinPreview)); - this.ModelView = new PckStudio.Models.MinecraftModelView(this.components); - this.SuspendLayout(); - // - // ModelView - // - this.ModelView.BackColor = System.Drawing.Color.DarkGray; - this.ModelView.BackGradientColor1 = System.Drawing.SystemColors.ActiveCaptionText; - this.ModelView.BackGradientColor2 = System.Drawing.SystemColors.ActiveCaptionText; - this.ModelView.BackgroundType = PckStudio.Models.BackgroundTypes.Color; - this.ModelView.DegreesX = 0; - this.ModelView.DegreesY = 0; - this.ModelView.Dock = System.Windows.Forms.DockStyle.Fill; - this.ModelView.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ModelView.ForeColor = System.Drawing.Color.Black; - this.ModelView.FOV = 90; - this.ModelView.Location = new System.Drawing.Point(0, 0); - this.ModelView.Name = "ModelView"; - this.ModelView.Projection = PckStudio.Models.ProjectionTypes.Perspective; - this.ModelView.Size = new System.Drawing.Size(418, 568); - this.ModelView.TabIndex = 1; - this.ModelView.Text = "PCK Model View"; - // - // SkinPreview - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(418, 568); - this.Controls.Add(this.ModelView); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.Name = "SkinPreview"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "SkinPreview"; - this.Load += new System.EventHandler(this.SkinPreview_Load); - this.ResumeLayout(false); - - } - - #endregion - - private PckStudio.Models.MinecraftModelView ModelView; - } -} \ No newline at end of file diff --git a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.cs b/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.cs deleted file mode 100644 index 1be7abce..00000000 --- a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using PckStudio.Classes.Models.DefaultModels; -using PckStudio.Internal; -using PckStudio.Models; - -namespace PckStudio.Forms -{ - public partial class SkinPreview : Form - { - Image _texture; - ModelBase _model; - - public SkinPreview(Image img, SkinANIM anim, ModelBase model = null) - { - InitializeComponent(); - _texture = img; - - _model = model ?? new Steve64x32Model(_texture); - if (img.Width == 64 && img.Height == 64) - { - _model = model ?? new Steve64x64Model(_texture, anim); - } - } - - private void SkinPreview_Load(object sender, EventArgs e) => RenderModel(_texture); - - public void RenderModel(Image source) - { - _model.AddToModelView(ModelView); - } - } -} diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.Designer.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.Designer.cs deleted file mode 100644 index 3639d52c..00000000 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.Designer.cs +++ /dev/null @@ -1,642 +0,0 @@ -namespace PckStudio.Forms -{ - partial class generateModel - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.Windows.Forms.Label label6; - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(generateModel)); - System.Windows.Forms.Label label5; - System.Windows.Forms.Label label3; - System.Windows.Forms.Label label7; - System.Windows.Forms.Label labelTextureMappingPreview; - this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); - this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cloneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.changeColorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.buttonDone = new System.Windows.Forms.Button(); - this.labelView = new System.Windows.Forms.Label(); - this.rotateRightBtn = new System.Windows.Forms.Button(); - this.rotateLeftBtn = new System.Windows.Forms.Button(); - this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.tabBody = new System.Windows.Forms.TabControl(); - this.tabArmor = new System.Windows.Forms.TabPage(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.myTablePanel2 = new System.Windows.Forms.TableLayoutPanel(); - this.offsetArms = new System.Windows.Forms.TextBox(); - this.label14 = new System.Windows.Forms.Label(); - this.offsetBody = new System.Windows.Forms.TextBox(); - this.offsetLegs = new System.Windows.Forms.TextBox(); - this.label10 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.offsetHead = new System.Windows.Forms.TextBox(); - this.label12 = new System.Windows.Forms.Label(); - this.comboParent = new System.Windows.Forms.ComboBox(); - this.buttonEXPORT = new System.Windows.Forms.Button(); - this.buttonIMPORT = new System.Windows.Forms.Button(); - this.uvPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); - this.displayBox = new System.Windows.Forms.PictureBox(); - this.buttonTemplate = new MetroFramework.Controls.MetroButton(); - this.generateTextureCheckBox = new MetroFramework.Controls.MetroCheckBox(); - this.checkGuide = new MetroFramework.Controls.MetroCheckBox(); - this.checkBoxArmor = new MetroFramework.Controls.MetroCheckBox(); - this.SizeXUpDown = new System.Windows.Forms.NumericUpDown(); - this.SizeYUpDown = new System.Windows.Forms.NumericUpDown(); - this.SizeZUpDown = new System.Windows.Forms.NumericUpDown(); - this.TextureXUpDown = new System.Windows.Forms.NumericUpDown(); - this.TextureYUpDown = new System.Windows.Forms.NumericUpDown(); - this.PosZUpDown = new System.Windows.Forms.NumericUpDown(); - this.PosYUpDown = new System.Windows.Forms.NumericUpDown(); - this.PosXUpDown = new System.Windows.Forms.NumericUpDown(); - this.Part = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.X = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.Y = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.Z = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this._Width = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this._Height = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.Length = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.U = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.V = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.listViewBoxes = new System.Windows.Forms.ListView(); - label6 = new System.Windows.Forms.Label(); - label5 = new System.Windows.Forms.Label(); - label3 = new System.Windows.Forms.Label(); - label7 = new System.Windows.Forms.Label(); - labelTextureMappingPreview = new System.Windows.Forms.Label(); - this.contextMenuStrip1.SuspendLayout(); - this.groupBox1.SuspendLayout(); - this.tabBody.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.myTablePanel2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.uvPictureBox)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.displayBox)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeXUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeYUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeZUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.TextureXUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.TextureYUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosZUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosYUpDown)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosXUpDown)).BeginInit(); - this.SuspendLayout(); - // - // label6 - // - resources.ApplyResources(label6, "label6"); - label6.ForeColor = System.Drawing.Color.White; - label6.Name = "label6"; - // - // label5 - // - resources.ApplyResources(label5, "label5"); - label5.ForeColor = System.Drawing.Color.White; - label5.Name = "label5"; - // - // label3 - // - resources.ApplyResources(label3, "label3"); - label3.ForeColor = System.Drawing.Color.White; - label3.Name = "label3"; - // - // label7 - // - resources.ApplyResources(label7, "label7"); - label7.ForeColor = System.Drawing.Color.White; - label7.Name = "label7"; - // - // labelTextureMappingPreview - // - resources.ApplyResources(labelTextureMappingPreview, "labelTextureMappingPreview"); - labelTextureMappingPreview.ForeColor = System.Drawing.Color.White; - labelTextureMappingPreview.Name = "labelTextureMappingPreview"; - // - // contextMenuStrip1 - // - this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); - this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.createToolStripMenuItem, - this.cloneToolStripMenuItem, - this.deleteToolStripMenuItem, - this.changeColorToolStripMenuItem}); - this.contextMenuStrip1.Name = "contextMenuStrip1"; - resources.ApplyResources(this.contextMenuStrip1, "contextMenuStrip1"); - // - // createToolStripMenuItem - // - resources.ApplyResources(this.createToolStripMenuItem, "createToolStripMenuItem"); - this.createToolStripMenuItem.Name = "createToolStripMenuItem"; - this.createToolStripMenuItem.Click += new System.EventHandler(this.createToolStripMenuItem_Click); - // - // cloneToolStripMenuItem - // - resources.ApplyResources(this.cloneToolStripMenuItem, "cloneToolStripMenuItem"); - this.cloneToolStripMenuItem.Name = "cloneToolStripMenuItem"; - this.cloneToolStripMenuItem.Click += new System.EventHandler(this.cloneToolStripMenuItem_Click); - // - // deleteToolStripMenuItem - // - resources.ApplyResources(this.deleteToolStripMenuItem, "deleteToolStripMenuItem"); - this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); - // - // changeColorToolStripMenuItem - // - resources.ApplyResources(this.changeColorToolStripMenuItem, "changeColorToolStripMenuItem"); - this.changeColorToolStripMenuItem.Name = "changeColorToolStripMenuItem"; - this.changeColorToolStripMenuItem.Click += new System.EventHandler(this.changeColorToolStripMenuItem_Click); - // - // buttonDone - // - this.buttonDone.DialogResult = System.Windows.Forms.DialogResult.OK; - resources.ApplyResources(this.buttonDone, "buttonDone"); - this.buttonDone.ForeColor = System.Drawing.Color.White; - this.buttonDone.Name = "buttonDone"; - this.buttonDone.UseVisualStyleBackColor = true; - this.buttonDone.Click += new System.EventHandler(this.buttonDone_Click); - // - // labelView - // - resources.ApplyResources(this.labelView, "labelView"); - this.labelView.ForeColor = System.Drawing.Color.White; - this.labelView.Name = "labelView"; - // - // rotateRightBtn - // - resources.ApplyResources(this.rotateRightBtn, "rotateRightBtn"); - this.rotateRightBtn.ForeColor = System.Drawing.Color.White; - this.rotateRightBtn.Name = "rotateRightBtn"; - this.rotateRightBtn.UseVisualStyleBackColor = true; - this.rotateRightBtn.Click += new System.EventHandler(this.rotateRightBtn_Click); - // - // rotateLeftBtn - // - resources.ApplyResources(this.rotateLeftBtn, "rotateLeftBtn"); - this.rotateLeftBtn.ForeColor = System.Drawing.Color.White; - this.rotateLeftBtn.Name = "rotateLeftBtn"; - this.rotateLeftBtn.UseVisualStyleBackColor = true; - this.rotateLeftBtn.Click += new System.EventHandler(this.rotateLeftBtn_Click); - // - // groupBox1 - // - this.groupBox1.Controls.Add(this.tabBody); - this.groupBox1.ForeColor = System.Drawing.Color.White; - resources.ApplyResources(this.groupBox1, "groupBox1"); - this.groupBox1.Name = "groupBox1"; - this.groupBox1.TabStop = false; - // - // tabBody - // - this.tabBody.Controls.Add(this.tabArmor); - this.tabBody.Controls.Add(this.tabPage1); - resources.ApplyResources(this.tabBody, "tabBody"); - this.tabBody.Name = "tabBody"; - this.tabBody.SelectedIndex = 0; - // - // tabArmor - // - this.tabArmor.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - resources.ApplyResources(this.tabArmor, "tabArmor"); - this.tabArmor.Name = "tabArmor"; - // - // tabPage1 - // - this.tabPage1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.tabPage1.Controls.Add(this.myTablePanel2); - resources.ApplyResources(this.tabPage1, "tabPage1"); - this.tabPage1.Name = "tabPage1"; - // - // myTablePanel2 - // - resources.ApplyResources(this.myTablePanel2, "myTablePanel2"); - this.myTablePanel2.Controls.Add(this.offsetArms, 1, 3); - this.myTablePanel2.Controls.Add(this.label14, 0, 3); - this.myTablePanel2.Controls.Add(this.offsetBody, 1, 1); - this.myTablePanel2.Controls.Add(this.offsetLegs, 1, 2); - this.myTablePanel2.Controls.Add(this.label10, 0, 0); - this.myTablePanel2.Controls.Add(this.label13, 0, 2); - this.myTablePanel2.Controls.Add(this.offsetHead, 1, 0); - this.myTablePanel2.Controls.Add(this.label12, 0, 1); - this.myTablePanel2.Name = "myTablePanel2"; - // - // offsetArms - // - resources.ApplyResources(this.offsetArms, "offsetArms"); - this.offsetArms.Name = "offsetArms"; - this.offsetArms.TextChanged += new System.EventHandler(this.offsetHead_TextChanged); - // - // label14 - // - resources.ApplyResources(this.label14, "label14"); - this.label14.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192))))); - this.label14.Name = "label14"; - // - // offsetBody - // - resources.ApplyResources(this.offsetBody, "offsetBody"); - this.offsetBody.Name = "offsetBody"; - this.offsetBody.TextChanged += new System.EventHandler(this.offsetHead_TextChanged); - // - // offsetLegs - // - resources.ApplyResources(this.offsetLegs, "offsetLegs"); - this.offsetLegs.Name = "offsetLegs"; - this.offsetLegs.TextChanged += new System.EventHandler(this.offsetHead_TextChanged); - // - // label10 - // - resources.ApplyResources(this.label10, "label10"); - this.label10.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))); - this.label10.Name = "label10"; - // - // label13 - // - resources.ApplyResources(this.label13, "label13"); - this.label13.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(0)))), ((int)(((byte)(64))))); - this.label13.Name = "label13"; - // - // offsetHead - // - resources.ApplyResources(this.offsetHead, "offsetHead"); - this.offsetHead.Name = "offsetHead"; - this.offsetHead.TextChanged += new System.EventHandler(this.offsetHead_TextChanged); - // - // label12 - // - resources.ApplyResources(this.label12, "label12"); - this.label12.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(64)))), ((int)(((byte)(0))))); - this.label12.Name = "label12"; - // - // comboParent - // - this.comboParent.FormattingEnabled = true; - this.comboParent.Items.AddRange(new object[] { - resources.GetString("comboParent.Items"), - resources.GetString("comboParent.Items1"), - resources.GetString("comboParent.Items2"), - resources.GetString("comboParent.Items3"), - resources.GetString("comboParent.Items4"), - resources.GetString("comboParent.Items5")}); - resources.ApplyResources(this.comboParent, "comboParent"); - this.comboParent.Name = "comboParent"; - this.comboParent.SelectedValueChanged += new System.EventHandler(this.comboParent_SelectedIndexChanged); - // - // buttonEXPORT - // - resources.ApplyResources(this.buttonEXPORT, "buttonEXPORT"); - this.buttonEXPORT.ForeColor = System.Drawing.Color.White; - this.buttonEXPORT.Name = "buttonEXPORT"; - this.buttonEXPORT.UseVisualStyleBackColor = true; - this.buttonEXPORT.Click += new System.EventHandler(this.buttonEXPORT_Click); - // - // buttonIMPORT - // - resources.ApplyResources(this.buttonIMPORT, "buttonIMPORT"); - this.buttonIMPORT.ForeColor = System.Drawing.Color.White; - this.buttonIMPORT.Name = "buttonIMPORT"; - this.buttonIMPORT.UseVisualStyleBackColor = true; - this.buttonIMPORT.Click += new System.EventHandler(this.buttonIMPORT_Click); - // - // uvPictureBox - // - this.uvPictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - resources.ApplyResources(this.uvPictureBox, "uvPictureBox"); - this.uvPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - this.uvPictureBox.Name = "uvPictureBox"; - this.uvPictureBox.TabStop = false; - // - // displayBox - // - this.displayBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); - this.displayBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - resources.ApplyResources(this.displayBox, "displayBox"); - this.displayBox.Name = "displayBox"; - this.displayBox.TabStop = false; - // - // buttonTemplate - // - resources.ApplyResources(this.buttonTemplate, "buttonTemplate"); - this.buttonTemplate.Name = "buttonTemplate"; - this.buttonTemplate.Theme = MetroFramework.MetroThemeStyle.Dark; - this.buttonTemplate.UseSelectable = true; - this.buttonTemplate.Click += new System.EventHandler(this.buttonTemplate_Click); - // - // generateTextureCheckBox - // - resources.ApplyResources(this.generateTextureCheckBox, "generateTextureCheckBox"); - this.generateTextureCheckBox.Name = "generateTextureCheckBox"; - this.generateTextureCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.generateTextureCheckBox.UseSelectable = true; - // - // checkGuide - // - resources.ApplyResources(this.checkGuide, "checkGuide"); - this.checkGuide.Name = "checkGuide"; - this.checkGuide.Theme = MetroFramework.MetroThemeStyle.Dark; - this.checkGuide.UseSelectable = true; - this.checkGuide.CheckedChanged += new System.EventHandler(this.Render); - // - // checkBoxArmor - // - resources.ApplyResources(this.checkBoxArmor, "checkBoxArmor"); - this.checkBoxArmor.Name = "checkBoxArmor"; - this.checkBoxArmor.Theme = MetroFramework.MetroThemeStyle.Dark; - this.checkBoxArmor.UseSelectable = true; - this.checkBoxArmor.CheckedChanged += new System.EventHandler(this.Render); - // - // SizeXUpDown - // - this.SizeXUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.SizeXUpDown.DecimalPlaces = 1; - this.SizeXUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.SizeXUpDown, "SizeXUpDown"); - this.SizeXUpDown.Name = "SizeXUpDown"; - this.SizeXUpDown.ValueChanged += new System.EventHandler(this.SizeXUpDown_ValueChanged); - // - // SizeYUpDown - // - this.SizeYUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.SizeYUpDown.DecimalPlaces = 1; - this.SizeYUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.SizeYUpDown, "SizeYUpDown"); - this.SizeYUpDown.Name = "SizeYUpDown"; - this.SizeYUpDown.ValueChanged += new System.EventHandler(this.SizeYUpDown_ValueChanged); - // - // SizeZUpDown - // - this.SizeZUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.SizeZUpDown.DecimalPlaces = 1; - this.SizeZUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.SizeZUpDown, "SizeZUpDown"); - this.SizeZUpDown.Name = "SizeZUpDown"; - this.SizeZUpDown.ValueChanged += new System.EventHandler(this.SizeZUpDown_ValueChanged); - // - // TextureXUpDown - // - this.TextureXUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.TextureXUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.TextureXUpDown, "TextureXUpDown"); - this.TextureXUpDown.Maximum = new decimal(new int[] { - 64, - 0, - 0, - 0}); - this.TextureXUpDown.Name = "TextureXUpDown"; - this.TextureXUpDown.ValueChanged += new System.EventHandler(this.TextureXUpDown_ValueChanged); - // - // TextureYUpDown - // - this.TextureYUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.TextureYUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.TextureYUpDown, "TextureYUpDown"); - this.TextureYUpDown.Maximum = new decimal(new int[] { - 64, - 0, - 0, - 0}); - this.TextureYUpDown.Name = "TextureYUpDown"; - this.TextureYUpDown.ValueChanged += new System.EventHandler(this.TextureYUpDown_ValueChanged); - // - // PosZUpDown - // - this.PosZUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.PosZUpDown.DecimalPlaces = 1; - this.PosZUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.PosZUpDown, "PosZUpDown"); - this.PosZUpDown.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.PosZUpDown.Name = "PosZUpDown"; - this.PosZUpDown.ValueChanged += new System.EventHandler(this.PosZUpDown_ValueChanged); - // - // PosYUpDown - // - this.PosYUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.PosYUpDown.DecimalPlaces = 1; - this.PosYUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.PosYUpDown, "PosYUpDown"); - this.PosYUpDown.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.PosYUpDown.Name = "PosYUpDown"; - this.PosYUpDown.ValueChanged += new System.EventHandler(this.PosYUpDown_ValueChanged); - // - // PosXUpDown - // - this.PosXUpDown.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(17)))), ((int)(((byte)(17)))), ((int)(((byte)(17))))); - this.PosXUpDown.DecimalPlaces = 1; - this.PosXUpDown.ForeColor = System.Drawing.SystemColors.Menu; - resources.ApplyResources(this.PosXUpDown, "PosXUpDown"); - this.PosXUpDown.Minimum = new decimal(new int[] { - 100, - 0, - 0, - -2147483648}); - this.PosXUpDown.Name = "PosXUpDown"; - this.PosXUpDown.ValueChanged += new System.EventHandler(this.PosXUpDown_ValueChanged); - // - // Part - // - resources.ApplyResources(this.Part, "Part"); - // - // X - // - resources.ApplyResources(this.X, "X"); - // - // Y - // - resources.ApplyResources(this.Y, "Y"); - // - // Z - // - resources.ApplyResources(this.Z, "Z"); - // - // _Width - // - resources.ApplyResources(this._Width, "_Width"); - // - // _Height - // - resources.ApplyResources(this._Height, "_Height"); - // - // Length - // - resources.ApplyResources(this.Length, "Length"); - // - // U - // - resources.ApplyResources(this.U, "U"); - // - // V - // - resources.ApplyResources(this.V, "V"); - // - // listViewBoxes - // - this.listViewBoxes.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.listViewBoxes.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.Part, - this.X, - this.Y, - this.Z, - this._Width, - this._Height, - this.Length, - this.U, - this.V}); - this.listViewBoxes.ContextMenuStrip = this.contextMenuStrip1; - this.listViewBoxes.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.listViewBoxes.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; - this.listViewBoxes.HideSelection = false; - this.listViewBoxes.LabelEdit = true; - resources.ApplyResources(this.listViewBoxes, "listViewBoxes"); - this.listViewBoxes.MultiSelect = false; - this.listViewBoxes.Name = "listViewBoxes"; - this.listViewBoxes.UseCompatibleStateImageBehavior = false; - this.listViewBoxes.View = System.Windows.Forms.View.Details; - this.listViewBoxes.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); - this.listViewBoxes.Click += new System.EventHandler(this.listView1_Click); - this.listViewBoxes.DoubleClick += new System.EventHandler(this.listView1_DoubleClick); - this.listViewBoxes.KeyDown += new System.Windows.Forms.KeyEventHandler(this.delStuffUsingDelKey); - // - // generateModel - // - resources.ApplyResources(this, "$this"); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.PosZUpDown); - this.Controls.Add(this.PosYUpDown); - this.Controls.Add(this.PosXUpDown); - this.Controls.Add(this.TextureYUpDown); - this.Controls.Add(this.TextureXUpDown); - this.Controls.Add(this.SizeZUpDown); - this.Controls.Add(this.SizeYUpDown); - this.Controls.Add(this.SizeXUpDown); - this.Controls.Add(this.checkBoxArmor); - this.Controls.Add(this.checkGuide); - this.Controls.Add(this.generateTextureCheckBox); - this.Controls.Add(this.buttonTemplate); - this.Controls.Add(this.displayBox); - this.Controls.Add(this.listViewBoxes); - this.Controls.Add(this.buttonEXPORT); - this.Controls.Add(labelTextureMappingPreview); - this.Controls.Add(this.uvPictureBox); - this.Controls.Add(this.comboParent); - this.Controls.Add(label6); - this.Controls.Add(this.buttonIMPORT); - this.Controls.Add(this.groupBox1); - this.Controls.Add(label7); - this.Controls.Add(this.rotateLeftBtn); - this.Controls.Add(this.rotateRightBtn); - this.Controls.Add(this.labelView); - this.Controls.Add(this.buttonDone); - this.Controls.Add(label3); - this.Controls.Add(label5); - this.MaximizeBox = false; - this.Name = "generateModel"; - this.Style = MetroFramework.MetroColorStyle.Silver; - this.Theme = MetroFramework.MetroThemeStyle.Dark; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.generateModel_FormClosing); - this.Load += new System.EventHandler(this.generateModel_Load); - this.SizeChanged += new System.EventHandler(this.generateModel_SizeChanged); - this.contextMenuStrip1.ResumeLayout(false); - this.groupBox1.ResumeLayout(false); - this.tabBody.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.myTablePanel2.ResumeLayout(false); - this.myTablePanel2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.uvPictureBox)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.displayBox)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeXUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeYUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.SizeZUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.TextureXUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.TextureYUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosZUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosYUpDown)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.PosXUpDown)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; - private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cloneToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem changeColorToolStripMenuItem; - private System.Windows.Forms.Button buttonDone; - private System.Windows.Forms.PictureBox displayBox; - private PckStudio.ToolboxItems.InterpolationPictureBox uvPictureBox; - private System.Windows.Forms.Button buttonIMPORT; - private System.Windows.Forms.Button buttonEXPORT; - private System.Windows.Forms.ComboBox comboParent; - private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TabControl tabBody; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TableLayoutPanel myTablePanel2; - private System.Windows.Forms.TextBox offsetArms; - private System.Windows.Forms.Label label14; - private System.Windows.Forms.TextBox offsetBody; - private System.Windows.Forms.TextBox offsetLegs; - private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label13; - private System.Windows.Forms.TextBox offsetHead; - private System.Windows.Forms.Label label12; - private System.Windows.Forms.TabPage tabArmor; - private System.Windows.Forms.Button rotateLeftBtn; - private System.Windows.Forms.Button rotateRightBtn; - private System.Windows.Forms.Label labelView; - private MetroFramework.Controls.MetroButton buttonTemplate; - private MetroFramework.Controls.MetroCheckBox generateTextureCheckBox; - private MetroFramework.Controls.MetroCheckBox checkGuide; - private MetroFramework.Controls.MetroCheckBox checkBoxArmor; - private System.Windows.Forms.NumericUpDown SizeXUpDown; - private System.Windows.Forms.NumericUpDown SizeYUpDown; - private System.Windows.Forms.NumericUpDown SizeZUpDown; - private System.Windows.Forms.NumericUpDown TextureXUpDown; - private System.Windows.Forms.NumericUpDown TextureYUpDown; - private System.Windows.Forms.NumericUpDown PosZUpDown; - private System.Windows.Forms.NumericUpDown PosYUpDown; - private System.Windows.Forms.NumericUpDown PosXUpDown; - private System.Windows.Forms.ColumnHeader Part; - private System.Windows.Forms.ColumnHeader X; - private System.Windows.Forms.ColumnHeader Y; - private System.Windows.Forms.ColumnHeader Z; - private System.Windows.Forms.ColumnHeader _Width; - private System.Windows.Forms.ColumnHeader _Height; - private System.Windows.Forms.ColumnHeader Length; - private System.Windows.Forms.ColumnHeader U; - private System.Windows.Forms.ColumnHeader V; - private System.Windows.Forms.ListView listViewBoxes; - } -} \ No newline at end of file diff --git a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs b/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs deleted file mode 100644 index 6f125949..00000000 --- a/PCK-Studio/Forms/Skins-And-Textures/generateModel.cs +++ /dev/null @@ -1,1304 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Imaging; -using System.Linq; -using System.Windows.Forms; -using System.Collections; -using System.IO; -using System.Text.RegularExpressions; - -using Newtonsoft.Json; -using MetroFramework.Forms; -using OMI.Formats.Pck; -using PckStudio.Internal; -using PckStudio.Extensions; -using System.Runtime.CompilerServices; -using System.Diagnostics; -using System.Text; - -namespace PckStudio.Forms -{ - public partial class generateModel : MetroForm - { - private Image _previewImage; - public Image PreviewImage => _previewImage; - - private ViewDirection direction = ViewDirection.front; - - private enum ViewDirection - { - front, - right, - back, - left, - } - - private PckAsset _asset; - private SkinANIM _ANIM; - - private static Color _backgroundColor = Color.FromArgb(0xff, 0x50, 0x50, 0x50); - private static GraphicsConfig _graphicsConfig = new GraphicsConfig() - { - InterpolationMode = InterpolationMode.NearestNeighbor, - PixelOffsetMode = PixelOffsetMode.HighQuality, - }; - - private static readonly string[] ValidModelBoxTypes = new string[] - { - // Base 64x32 Parts - "HEAD", - "BODY", - "ARM0", - "ARM1", - "LEG0", - "LEG1", - - // 64x64 Overlay Parts - "HEADWEAR", - "JACKET", - "SLEEVE0", - "SLEEVE1", - "WAIST", - "PANTS0", - "PANTS1", - - // Armor Parts - "BODYARMOR", - "ARMARMOR0", - "ARMARMOR1", - "BELT", - "LEGGING0", - "LEGGING1", - "SOCK0", - "SOCK1", - "BOOT0", - "BOOT1" - }; - - private static readonly string[] ValidModelOffsetTypes = new string[] - { - // Body Offsets - "HEAD", - "BODY", - "ARM0", - "ARM1", - "LEG0", - "LEG1", - - // Armor Offsets - "HELMET", - "CHEST", "BODYARMOR", - "SHOULDER0", "ARMARMOR0", - "SHOULDER1", "ARMARMOR0", - "BELT", - "LEGGING0", - "LEGGING1", - "SOCK0", "BOOT0", - "SOCK1", "BOOT1", - - "TOOL0", - "TOOL1", - }; - - List modelBoxes = new List(); - List modelOffsets = new List(); - - private class ModelOffset - { - public string Name; - public float YOffset; - - public ModelOffset(string name, float yOffset) - { - Name = name; - YOffset = yOffset; - } - public (string, string) ToProperty() - { - string value = $"{Name} Y {YOffset}"; - return ("OFFSET", value.Replace(',','.')); - } - } - - public generateModel(PckAsset asset) - { - MessageBox.Show(this, "This feature is now considered deprecated and will no longer recieve updates. A better alternative is currently under development. Use at your own risk.", "Deprecated Feature", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - InitializeComponent(); - - _asset = asset; - if (asset.Size > 0) - { - using (var ms = new MemoryStream(asset.Data)) - { - uvPictureBox.Image = Image.FromStream(ms); - } - } - comboParent.Items.Clear(); - comboParent.Items.AddRange(ValidModelBoxTypes); - LoadData(asset); - } - private static readonly Regex sWhitespace = new Regex(@"\s+"); - public static string ReplaceWhitespace(string input, string replacement) - { - return sWhitespace.Replace(input, replacement); - } - - private void LoadData(PckAsset asset) - { - comboParent.Enabled = asset.GetMultipleProperties("BOX").All(kv => { - var box = SkinBOX.FromString(kv.Value); - if (ValidModelBoxTypes.Contains(box.Type)) - { - modelBoxes.Add(box); - return true; - } - return false; - }); - asset.GetMultipleProperties("OFFSET").All(kv => { - string[] offset = ReplaceWhitespace(kv.Value, ",").TrimEnd('\n', '\r', ' ').Split(','); - if (offset.Length < 3) - return false; - string name = offset[0]; - if (offset[1] != "Y") - return false; - float value = float.Parse(offset[2]); - if (ValidModelOffsetTypes.Contains(name)) - { - modelOffsets.Add(new ModelOffset(name, value)); - return true; - } - return false; - }); - - _ANIM = asset.GetProperty("ANIM", SkinANIM.FromString); - UpdateListView(); - Rerender(); - } - - //Rename model part/item - private void listView1_DoubleClick_1(object sender, EventArgs e) - { - listViewBoxes.SelectedItems[0].BeginEdit(); - } - - private void Rerender([CallerMemberName] string caller = default!) - { - Debug.WriteLine($"Call from {caller}", category: nameof(Rerender)); - Render(this, EventArgs.Empty); - if (generateTextureCheckBox.Checked) - GenerateUVTextureMap(); - } - - // Graphic Rendering - // Builds an image based on the view - private void Render(object sender, EventArgs e) - { - buttonTemplate.Enabled = listViewBoxes.Items.Count == 0; - OrganizesZLayer(); - Bitmap bitmapModelPreview = new Bitmap(displayBox.Width, displayBox.Height); // Creates Model Display layer - using (Graphics graphics = Graphics.FromImage(bitmapModelPreview)) - { - graphics.ApplyConfig(_graphicsConfig); - graphics.Clear(_backgroundColor); - - float headbodyY = (displayBox.Height / 2) + 25; // 25 - float armY = (displayBox.Height / 2) + 35; // -60; - float legY = (displayBox.Height / 2) + 85; // -80; - float groundLevel = (displayBox.Height / 2) + 145; - graphics.DrawLine(Pens.White, 0, groundLevel, displayBox.Width, groundLevel); - float renderScale = uvPictureBox.Image.Width / 64; // used for displaying larger graphics properly; 64 is the base skin width for all models - - // Chooses Render settings based on current direction - foreach (ListViewItem listViewItem in listViewBoxes.Items) - { - if (!(listViewItem.Tag is SkinBOX part)) - continue; - float x = displayBox.Width / 2; - float y = 0; - - switch (direction) - { - case ViewDirection.front: - { - //Sets X & Y based on model part class - // listViewItem.Text -> part.Type - // listViewItem.SubItems[1] -> part.Pos.X - // listViewItem.SubItems[2] -> part.Pos.Y - // listViewItem.SubItems[3] -> part.Pos.Z - // listViewItem.SubItems[4] -> part.Size.X - // listViewItem.SubItems[5] -> part.Size.Y - // listViewItem.SubItems[6] -> part.Size.Z - // listViewItem.SubItems[7] -> part.U - // listViewItem.SubItems[8] -> part.V - switch (part.Type) - { - case "HEAD": - case "HEADWEAR": - case "HELMET": - y = headbodyY + int.Parse(offsetHead.Text) * 5; - break; - case "BODY": - case "JACKET": - case "CHEST": - case "BODYARMOR": - case "BELT": - case "WAIST": - y = headbodyY + int.Parse(offsetBody.Text) * 5; - break; - - case "ARM0": - case "ARMARMOR0": - case "SLEEVE0": - case "SHOULDER0": - x -= 25; - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "ARM1": - case "ARMARMOR1": - case "SLEEVE1": - case "SHOULDER1": - x += 25; - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "LEG0": - case "PANTS0": - case "SOCK0": - case "LEGGING0": - case "BOOT0": - x -= 10; - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - - case "LEG1": - case "PANTS1": - case "SOCK1": - case "LEGGING1": - case "BOOT1": - x += 10; - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - } - - // Maps imported Texture if texture generation is disabled - if (!generateTextureCheckBox.Checked) - { - RectangleF destRect = new RectangleF( - x + part.Pos.X * 5, - y + part.Pos.Y * 5, - part.Size.X * 5, - part.Size.Y * 5); - RectangleF srcRect = new RectangleF( - (part.UV.X + part.Size.Z) * renderScale, - (part.UV.Y + part.Size.Z) * renderScale, - part.Size.X * renderScale, - part.Size.Y * renderScale); - graphics.DrawImage(uvPictureBox.Image, destRect, srcRect, GraphicsUnit.Pixel); - } - else - { - graphics.FillRectangle(new SolidBrush(listViewItem.ForeColor), x + part.Pos.X * 5, y + part.Pos.Y * 5, part.Size.X * 5, part.Size.Y * 5); - } - - break; - } - - case ViewDirection.left: - { - //Sets X & Y based on model part class - switch (part.Type) - { - case "HEAD": - case "HEADWEAR": - case "HELMET": - y = headbodyY + int.Parse(offsetHead.Text) * 5; - break; - case "BODY": - case "JACKET": - case "CHEST": - case "BODYARMOR": - case "BELT": - case "WAIST": - y = headbodyY + int.Parse(offsetBody.Text) * 5; - break; - - case "ARM0": - case "ARMARMOR0": - case "SLEEVE0": - case "SHOULDER0": - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "ARM1": - case "ARMARMOR1": - case "SLEEVE1": - case "SHOULDER1": - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "LEG0": - case "PANTS0": - case "SOCK0": - case "LEGGING0": - case "BOOT0": - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - - case "LEG1": - case "PANTS1": - case "SOCK1": - case "LEGGING1": - case "BOOT1": - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - } - - // Maps imported Texture if auto texture is disabled - if (!generateTextureCheckBox.Checked) - { - RectangleF destRect = new RectangleF( - x + part.Pos.Z * 5, - y + part.Pos.Y * 5, - part.Size.Z * 5, - part.Size.Y * 5); - RectangleF srcRect = new RectangleF( - (part.UV.X + part.Size.Z + part.Size.X) * renderScale, - (part.UV.Y + part.Size.Z) * renderScale, - part.Size.Z * renderScale, - part.Size.Y * renderScale); - graphics.DrawImage(uvPictureBox.Image, destRect, srcRect, GraphicsUnit.Pixel); - } - else - { - //Draws Part - graphics.FillRectangle(new SolidBrush(listViewItem.ForeColor), x + part.Pos.Z * 5, y + part.Pos.Y * 5, part.Size.Z * 5, part.Size.Y * 5); - } - bitmapModelPreview.RotateFlip(RotateFlipType.RotateNoneFlipX); - break; - } - - case ViewDirection.back: - { - //Sets X & Y based on model part class - switch (part.Type) - { - case "HEAD": - case "HEADWEAR": - case "HELMET": - y = headbodyY + int.Parse(offsetHead.Text) * 5; - break; - case "BODY": - case "JACKET": - case "CHEST": - case "BODYARMOR": - case "BELT": - case "WAIST": - y = headbodyY + int.Parse(offsetBody.Text) * 5; - break; - - case "ARM0": - case "ARMARMOR0": - case "SLEEVE0": - case "SHOULDER0": - x -= 25; - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "ARM1": - case "ARMARMOR1": - case "SLEEVE1": - case "SHOULDER1": - x += 25; - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "LEG0": - case "PANTS0": - case "SOCK0": - case "LEGGING0": - case "BOOT0": - x -= 10; - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - - case "LEG1": - case "PANTS1": - case "SOCK1": - case "LEGGING1": - case "BOOT1": - x += 10; - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - } - - //Maps imported Texture if auto texture is disabled - if (!generateTextureCheckBox.Checked) - { - RectangleF destRect = new RectangleF( - x + part.Pos.X * 5, - y + part.Pos.Y * 5, - part.Size.X * 5, - part.Size.Y * 5); - RectangleF srcRect = new RectangleF( - (part.UV.X + part.Size.Z * 2 + part.Size.X) * renderScale, - (part.UV.Y + part.Size.Z) * renderScale, - part.Size.X * renderScale, - part.Size.Y * renderScale); - graphics.DrawImage(uvPictureBox.Image, destRect, srcRect, GraphicsUnit.Pixel); - } - else - { - //Draws Part - graphics.FillRectangle(new SolidBrush(listViewItem.ForeColor), x + part.Pos.X * 5, y + part.Pos.Y * 5, part.Size.X * 5, part.Size.Y * 5); - } - bitmapModelPreview.RotateFlip(RotateFlipType.RotateNoneFlipX); - break; - } - - case ViewDirection.right: - //Sets X & Y based on model part class - switch (part.Type) - { - case "HEAD": - case "HEADWEAR": - case "HELMET": - y = headbodyY + int.Parse(offsetHead.Text) * 5; - break; - case "BODY": - case "JACKET": - case "CHEST": - case "BODYARMOR": - case "BELT": - case "WAIST": - y = headbodyY + int.Parse(offsetBody.Text) * 5; - break; - - case "ARM0": - case "ARMARMOR0": - case "SLEEVE0": - case "SHOULDER0": - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "ARM1": - case "ARMARMOR1": - case "SLEEVE1": - case "SHOULDER1": - y = armY + int.Parse(offsetArms.Text) * 5; - break; - - case "LEG0": - case "PANTS0": - case "SOCK0": - case "LEGGING0": - case "BOOT0": - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - - case "LEG1": - case "PANTS1": - case "SOCK1": - case "LEGGING1": - case "BOOT1": - y = legY + int.Parse(offsetLegs.Text) * 5; - break; - } - //Maps imported Texture if auto texture is disabled - if (!generateTextureCheckBox.Checked) - { - RectangleF destRect = new RectangleF( - x + part.Pos.Z * 5, - y + part.Pos.Y * 5, - part.Size.Z * 5, - part.Size.Y * 5); - RectangleF srcRect = new RectangleF( - (part.UV.X + part.Size.Z + part.Size.X) * renderScale, - (part.UV.Y + part.Size.Z) * renderScale, - part.Size.Z * renderScale, - part.Size.Y * renderScale); - graphics.DrawImage(uvPictureBox.Image, destRect, srcRect, GraphicsUnit.Pixel); - } - else - { - //Draws Part - graphics.FillRectangle(new SolidBrush(listViewItem.ForeColor), x + part.Pos.Z * 5, y + part.Pos.Y * 5, part.Size.Z * 5, part.Size.Y * 5); - } - break; - } - } - - if (checkBoxArmor.Checked) - DrawArmorOffsets(graphics); - // draw last to be on top - if (checkGuide.Checked) - DrawGuideLines(graphics); - } - displayBox.Image = bitmapModelPreview; - } - - private void GenerateUVTextureMap() - { - Random rng = new Random(); - using (Graphics graphics = Graphics.FromImage(uvPictureBox.Image)) - { - graphics.ApplyConfig(_graphicsConfig); - foreach (SkinBOX part in modelBoxes) - { - float width = part.Size.X * 2; - float height = part.Size.Y * 2; - float length = part.Size.Z * 2; - float u = part.UV.X * 2; - float v = part.UV.Y * 2; - int argb = rng.Next(-16777216, -1); // 0xFF000000 - 0xFFFFFFFF - var color = Color.FromArgb(argb); - Brush brush = new SolidBrush(color); - graphics.FillRectangle(brush, u + length, v, width, length); - graphics.FillRectangle(brush, u + length + width, v, width, length); - graphics.FillRectangle(brush, u, length + v, length, height); - graphics.FillRectangle(brush, u + length, v + length, width, height); - graphics.FillRectangle(brush, u + length + width, v + length, width, height); - graphics.FillRectangle(brush, u + length + width * 2, v + length, length, height); - } - } - uvPictureBox.Invalidate(); - } - - // Checks and sets Z layering - private void OrganizesZLayer() - { - foreach (ListViewItem listViewItem in listViewBoxes.Items) - listViewItem.SubItems.Add("unchecked"); - - float surfaceCenter = displayBox.Width / 2; - - switch (direction) - { - case ViewDirection.front: - { - foreach (ListViewItem listViewItemCurrent in listViewBoxes.Items) - { - if (listViewItemCurrent.SubItems[9].Text == "unchecked") - { - float x = 0; - if (listViewItemCurrent.Text == "HEAD") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "BODY") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "ARM0") - x = 178; - else if (listViewItemCurrent.Text == "ARM1") - x = 228; - else if (listViewItemCurrent.Text == "LEG0") - x = 193; - else if (listViewItemCurrent.Text == "LEG1") - x = 213; - - bool flag = false; - int index = listViewItemCurrent.Index; - foreach (ListViewItem listViewItemComparing in listViewBoxes.Items) - { - var val1 = double.Parse(listViewItemCurrent.SubItems[3].Text) + double.Parse(listViewItemCurrent.SubItems[6].Text); - var val2 = double.Parse(listViewItemComparing.SubItems[3].Text) + double.Parse(listViewItemComparing.SubItems[6].Text); - if (listViewItemComparing.SubItems[9].Text == "unchecked" && - val1 < val2) - { - if (listViewItemComparing.Index < listViewBoxes.Items.Count + 1) - { - index = listViewItemComparing.Index + 1; - flag = true; - } - } - } - listViewItemCurrent.SubItems[9].Text = "checked"; - if (flag) - { - ListViewItem listViewItem2 = (ListViewItem)listViewItemCurrent.Clone(); - listViewBoxes.Items.Insert(index, listViewItem2); - listViewItemCurrent.Remove(); - } - } - } - } - break; - case ViewDirection.right: - { - int checkedItems = 0; - do - { - foreach (ListViewItem listViewItemCurrent in listViewBoxes.Items) - { - if (listViewItemCurrent.SubItems[listViewItemCurrent.SubItems.Count - 1].Text == "unchecked") - { - float x = 0; - if (listViewItemCurrent.Text == "HEAD") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "BODY") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "ARM0") - x = 178; - else if (listViewItemCurrent.Text == "ARM1") - x = 228; - else if (listViewItemCurrent.Text == "LEG0") - x = 193; - else if (listViewItemCurrent.Text == "LEG1") - x = 213; - bool flag = false; - int index = listViewItemCurrent.Index; - foreach (ListViewItem listViewItem2 in listViewBoxes.Items) - { - if (listViewItem2.SubItems[9].Text == "unchecked") - { - int y = 0; - if (listViewItem2.Text == "HEAD") - y = (int)surfaceCenter; - else if (listViewItem2.Text == "BODY") - y = (int)surfaceCenter; - else if (listViewItem2.Text == "ARM0") - y = 178; - else if (listViewItem2.Text == "ARM1") - y = 228; - else if (listViewItem2.Text == "LEG0") - y = 193; - else if (listViewItem2.Text == "LEG1") - y = 213; - if ((int)double.Parse(listViewItemCurrent.SubItems[1].Text) + (int)double.Parse(listViewItemCurrent.SubItems[4].Text) - x > (int)double.Parse(listViewItem2.SubItems[1].Text) + (int)double.Parse(listViewItem2.SubItems[4].Text) + y && listViewItem2.Index + 1 < this.listViewBoxes.Items.Count + 1) - { - index = listViewItem2.Index + 1; - flag = true; - } - } - } - listViewItemCurrent.SubItems[9].Text = "checked"; - checkedItems += 1; - if (flag) - { - ListViewItem listViewItem2 = (ListViewItem)listViewItemCurrent.Clone(); - listViewBoxes.Items.Insert(index, listViewItem2); - if (listViewBoxes.SelectedItems.Count != 0) - { - //if (selected.Index == listViewItem1.Index) - //{ - // selected = listViewItem2; - //} - } - listViewItemCurrent.Remove(); - } - } - else - { - checkedItems += 1; - } - } - } while (checkedItems < listViewBoxes.Items.Count); - } - break; - case ViewDirection.back: - { - int checkedItems = 0; - do - { - foreach (ListViewItem listViewItemCurrent in listViewBoxes.Items) - { - if (listViewItemCurrent.SubItems[listViewItemCurrent.SubItems.Count - 1].Text == "unchecked") - { - bool flag = false; - int index = listViewItemCurrent.Index; - foreach (ListViewItem listViewItemComparing in listViewBoxes.Items) - { - if (listViewItemComparing.SubItems[9].Text == "unchecked" && (int)double.Parse(listViewItemCurrent.SubItems[3].Text) + (int)double.Parse(listViewItemCurrent.SubItems[6].Text) > (int)double.Parse(listViewItemComparing.SubItems[3].Text) + (int)double.Parse(listViewItemComparing.SubItems[6].Text)) - { - if (listViewItemComparing.Index < listViewBoxes.Items.Count + 1) - { - index = listViewItemComparing.Index + 1; - flag = true; - } - } - } - listViewItemCurrent.SubItems[9].Text = "checked"; - checkedItems += 1; - if (flag) - { - ListViewItem listViewItem2 = (ListViewItem)listViewItemCurrent.Clone(); - listViewBoxes.Items.Insert(index, listViewItem2); - if (listViewBoxes.SelectedItems.Count != 0) - { - //if (selected.Index == listViewItemCurrent.Index) - //{ - // selected = listViewItem2; - //} - } - listViewItemCurrent.Remove(); - } - } - else - { - checkedItems += 1; - } - } - } while (checkedItems < listViewBoxes.Items.Count); - } - break; - case ViewDirection.left: - { - int checkedItems = 0; - do - { - foreach (ListViewItem listViewItemCurrent in listViewBoxes.Items) - { - if (listViewItemCurrent.SubItems[listViewItemCurrent.SubItems.Count - 1].Text == "unchecked") - { - float x = 0; - if (listViewItemCurrent.Text == "HEAD") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "BODY") - x = surfaceCenter; - else if (listViewItemCurrent.Text == "ARM0") - x = 178; - else if (listViewItemCurrent.Text == "ARM1") - x = 228; - else if (listViewItemCurrent.Text == "LEG0") - x = 193; - else if (listViewItemCurrent.Text == "LEG1") - x = 213; - bool flag = false; - int index = listViewItemCurrent.Index; - foreach (ListViewItem listViewItem2 in listViewBoxes.Items) - { - if (listViewItem2.SubItems[9].Text == "unchecked") - { - int y = 0; - if (listViewItem2.Text == "HEAD") - y = (int)surfaceCenter; - else if (listViewItem2.Text == "BODY") - y = (int)surfaceCenter; - else if (listViewItem2.Text == "ARM0") - y = 178; - else if (listViewItem2.Text == "ARM1") - y = 228; - else if (listViewItem2.Text == "LEG0") - y = 193; - else if (listViewItem2.Text == "LEG1") - y = 213; - if ((int)double.Parse(listViewItemCurrent.SubItems[1].Text) + (int)double.Parse(listViewItemCurrent.SubItems[4].Text) + x < (int)double.Parse(listViewItem2.SubItems[1].Text) + (int)double.Parse(listViewItem2.SubItems[4].Text) + y && listViewItem2.Index + 1 < this.listViewBoxes.Items.Count + 1) - { - index = listViewItem2.Index + 1; - flag = true; - } - } - } - listViewItemCurrent.SubItems[9].Text = "checked"; - checkedItems += 1; - if (flag == true) - { - ListViewItem listViewItem2 = (ListViewItem)listViewItemCurrent.Clone(); - listViewBoxes.Items.Insert(index, listViewItem2); - if (listViewBoxes.SelectedItems.Count != 0) - { - //if (selected.Index == listViewItem1.Index) - //{ - // selected = listViewItem2; - //} - } - listViewItemCurrent.Remove(); - } - } - else - { - checkedItems += 1; - } - } - } while (checkedItems < listViewBoxes.Items.Count); - } - break; - default: - break; - } - } - - private void DrawGuideLines(Graphics g) - { - Point center = new Point(displayBox.Height / 2, displayBox.Width / 2); - int headbodyY = center.Y + 25; //25 - int legY = center.Y + 85; // - 80; - bool isSide = direction == ViewDirection.left || direction == ViewDirection.right; - if (!isSide) - { - g.DrawLine(Pens.Red, 0, headbodyY + float.Parse(offsetHead.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetHead.Text) * 5); - g.DrawLine(Pens.Green, 0, headbodyY + float.Parse(offsetBody.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetBody.Text) * 5); - g.DrawLine(Pens.Blue, 0, headbodyY + float.Parse(offsetArms.Text) * 5, displayBox.Width, headbodyY + float.Parse(offsetArms.Text) * 5); - g.DrawLine(Pens.Purple, 0, legY + float.Parse(offsetLegs.Text) * 5, displayBox.Width, legY + float.Parse(offsetLegs.Text) * 5); - } - g.DrawLine(Pens.Red, center.X, 0, center.X, displayBox.Height); - g.DrawLine(Pens.Blue, center.X + 30, 0, center.X + 30, displayBox.Height); - g.DrawLine(Pens.Blue, center.X - 30, 0, center.X - 30, displayBox.Height); - g.DrawLine(Pens.Purple, center.X - 10, 0, center.X - 10, displayBox.Height); - g.DrawLine(Pens.Purple, center.X + 10, 0, center .X + 10, displayBox.Height); - } - - private void DrawArmorOffsets(Graphics g) - { - int centerPointHeight = displayBox.Height / 2; - int centerPointWidth = displayBox.Width / 2; - int headbodyY = centerPointHeight + 25; //25 - int armY = centerPointHeight + 35; // - 60; - int legY = centerPointHeight + 85; // - 80; - SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(80, 50, 50, 75)); - g.FillRectangle(semiTransBrush, centerPointWidth, (float)(headbodyY - 40 /*+ offsetHelmet.Value * 5*/), 40, 40); // Helmet - bool isSide = direction == ViewDirection.left || direction == ViewDirection.right; - if (isSide) - { - g.FillRectangle(semiTransBrush, centerPointWidth - 10, headbodyY, 20, 60); // Chest - g.FillRectangle(semiTransBrush, centerPointWidth - 10, (float)(legY + 40 /*+ offsetBoots.Value * 5*/), 20, 20); // Boots - g.FillRectangle(semiTransBrush, centerPointWidth - 10, (float)(legY /*+ offsetPants.Value * 5*/), 20, 40); // Pants - g.FillRectangle(semiTransBrush, centerPointWidth - 5, (float)(armY + 45 /*+ offsetTool.Value * 5*/), 10, 10); // Tools - } - else - { - g.FillRectangle(semiTransBrush, centerPointWidth - 20, headbodyY, 40, 60); // Chest - g.FillRectangle(semiTransBrush, centerPointWidth - 35, (float)(armY + 45 /*+ offsetTool.Value * 5*/), 10, 10); // Tool0 - g.FillRectangle(semiTransBrush, centerPointWidth + 25, (float)(armY + 45 /*+ offsetTool.Value * 5*/), 10, 10); // Tool1 - g.FillRectangle(semiTransBrush, centerPointWidth - 20, (float)(legY /*+ offsetPants.Value * 5*/), 20, 40); // Pants0 - g.FillRectangle(semiTransBrush, centerPointWidth, (float)(legY /*+ offsetPants.Value * 5*/), 20, 40); // Pants1 - g.FillRectangle(semiTransBrush, centerPointWidth - 20, (float)(legY + 40 /*+ offsetBoots.Value * 5*/), 20, 20); // Boot0 - g.FillRectangle(semiTransBrush, centerPointWidth, (float)(legY + 40 /*+ offsetBoots.Value * 5*/), 20, 20); // Boot1 - } - - } - - private void generateModel_Load(object sender, EventArgs e) - { - if (Screen.PrimaryScreen.Bounds.Height >= 780 && Screen.PrimaryScreen.Bounds.Width >= 1080) - return; - - Rerender(); - } - - private void createToolStripMenuItem_Click(object sender, EventArgs e) - { - modelBoxes.Add(SkinBOX.Empty); - UpdateListView(); - Rerender(); - } - - private void listView1_SelectedIndexChanged(object sender, EventArgs e) - { - changeColorToolStripMenuItem.Visible = false; - if (listViewBoxes.SelectedItems.Count != 0 && listViewBoxes.SelectedItems[0].Tag is SkinBOX) - { - changeColorToolStripMenuItem.Visible = true; - var part = listViewBoxes.SelectedItems[0].Tag as SkinBOX; - //graphics.DrawRectangle(Pens.Yellow, x + (float)double.Parse(this.selected.SubItems[3].Text) * 5 - 1, y + (float)double.Parse(this.selected.SubItems[2].Text) * 5 - 1, (float)double.Parse(this.selected.SubItems[6].Text) * 5 + 2, (float)double.Parse(this.selected.SubItems[5].Text) * 5 + 2); - //graphics.DrawRectangle(Pens.Black, x + (float)double.Parse(this.selected.SubItems[3].Text) * 5, y + (float)double.Parse(this.selected.SubItems[2].Text) * 5, (float)double.Parse(this.selected.SubItems[6].Text) * 5, (float)double.Parse(this.selected.SubItems[5].Text) * 5); - comboParent.Text = part.Type; - PosXUpDown.Value = (decimal)part.Pos.X; - PosYUpDown.Value = (decimal)part.Pos.Y; - PosZUpDown.Value = (decimal)part.Pos.Z; - SizeXUpDown.Value = (decimal)part.Size.X; - SizeYUpDown.Value = (decimal)part.Size.Y; - SizeZUpDown.Value = (decimal)part.Size.Z; - TextureXUpDown.Value = (decimal)part.UV.X; - TextureYUpDown.Value = (decimal)part.UV.Y; - Rerender(); - } - } - - - //Changes Item Model Class - private void comboParent_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Type = comboParent.Text; - buttonIMPORT.Enabled = true; - buttonEXPORT.Enabled = true; - SizeXUpDown.Enabled = true; - SizeYUpDown.Enabled = true; - SizeZUpDown.Enabled = true; - PosXUpDown.Enabled = true; - PosYUpDown.Enabled = true; - PosZUpDown.Enabled = true; - TextureXUpDown.Enabled = true; - TextureYUpDown.Enabled = true; - } - Rerender(); - } - - private void SizeXUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Size.X = (float)SizeXUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - private void SizeYUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Size.Y = (float)SizeYUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - private void SizeZUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Size.Z = (float)SizeZUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - private void PosXUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Pos.X = (float)PosXUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - - private void PosYUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Pos.Y = (float)PosYUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - - private void PosZUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.Pos.Z = (float)PosZUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - private void rotateRightBtn_Click(object sender, EventArgs e) - { - if (direction == ViewDirection.front) - direction = ViewDirection.left; - else - --direction; - labelView.Text = $"View: {direction}"; - Rerender(); - } - - private void rotateLeftBtn_Click(object sender, EventArgs e) - { - if (direction == ViewDirection.left) - direction = ViewDirection.front; - else - ++direction; - labelView.Text = $"View: {direction}"; - Rerender(); - } - - - //Sets Texture X-Offset - private void TextureXUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.UV.X = (int)TextureXUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - - //Sets texture Y-Offset - private void TextureYUpDown_ValueChanged(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - part.UV.Y = (int)TextureYUpDown.Value; - } - UpdateListView(); - Rerender(); - } - - - //Export Current Skin Texture - private void buttonEXPORT_Click(object sender, EventArgs e) - { - Bitmap bitmap = new Bitmap(uvPictureBox.Image, 64, 64); - using SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "PNG Image Files | *.png"; - if (saveFileDialog.ShowDialog(this) == DialogResult.OK) - { - bitmap.Save(saveFileDialog.FileName, ImageFormat.Png); - } - } - - - //Imports Skin Texture - private void buttonIMPORT_Click(object sender, EventArgs e) - { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "PNG Image Files | *.png"; - openFileDialog.Title = "Select Skin Texture"; - - if (openFileDialog.ShowDialog(this) == DialogResult.OK) // skins can only be a 1:1 ratio (base 64x64) or a 2:1 ratio (base 64x32) - { - using (var img = Image.FromFile(openFileDialog.FileName)) - { - if ((img.Width == img.Height || img.Height == img.Width / 2)) - { - generateTextureCheckBox.Checked = false; - using (Graphics graphics = Graphics.FromImage(uvPictureBox.Image)) - { - graphics.ApplyConfig(_graphicsConfig); - graphics.DrawImage(img, 0, 0, img.Width, img.Height); - } - uvPictureBox.Invalidate(); - Rerender(); - } - else - { - MessageBox.Show(this, "Not a valid skin file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - } - } - - // Creates Model Data and Finalizes - private void buttonDone_Click(object sender, EventArgs e) - { - foreach (SkinBOX part in modelBoxes) - { - _asset.AddProperty("BOX", part); - } - - //Bitmap bitmap2 = new Bitmap(64, 64); - //using (Graphics graphics = Graphics.FromImage(bitmap2)) - //{ - // graphics.ApplyConfig(_graphicsConfig); - // graphics.DrawImage(uvPictureBox.Image, 0, 0, 64, 64); - //} - _previewImage = new Bitmap(displayBox.Width, displayBox.Height); - Close(); - } - - // Renders model after texture change - private void texturePreview_BackgroundImageChanged(object sender, EventArgs e) - { - Rerender(); - } - - // Trigger Dialog to select model part/item color - private void listView1_DoubleClick(object sender, EventArgs e) - { - ColorDialog colorDialog = new ColorDialog(); - if (colorDialog.ShowDialog(this) == DialogResult.OK) - listViewBoxes.SelectedItems[0].ForeColor = colorDialog.Color; - Rerender(); - } - - - //Re-renders head with updated x-offset - private void offsetHead_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - - //Re-renders body with updated x-offset - private void offsetBody_TextAlignChanged(object sender, EventArgs e) - { - Rerender(); - } - - - //Loads in model template(Steve) - private void buttonTemplate_Click(object sender, EventArgs e) - { - modelBoxes.Add(SkinBOX.FromString("HEAD -4 -8 -4 8 8 8 0 0 0 0 0")); - modelBoxes.Add(SkinBOX.FromString("BODY -4 0 -2 8 12 4 16 16 0 0 0")); - modelBoxes.Add(SkinBOX.FromString("ARM0 -3 -2 -2 4 12 4 40 16 0 0 0")); - modelBoxes.Add(SkinBOX.FromString("ARM1 -1 -2 -2 4 12 4 40 16 0 1 0")); - modelBoxes.Add(SkinBOX.FromString("LEG0 -2 0 -2 4 12 4 0 16 0 0 0")); - modelBoxes.Add(SkinBOX.FromString("LEG1 -2 0 -2 4 12 4 0 16 0 1 0")); - comboParent.Enabled = true; - UpdateListView(); - Rerender(); - } - - private void UpdateListView() - { - listViewBoxes.Items.Clear(); - foreach (SkinBOX part in modelBoxes) - { - ListViewItem listViewItem = new ListViewItem(part.Type); - listViewItem.Tag = part; - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Pos.X.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Pos.Y.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Pos.Z.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Size.X.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Size.Y.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.Size.Z.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.UV.X.ToString())); - listViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(listViewItem, part.UV.Y.ToString())); - listViewBoxes.Items.Add(listViewItem); - } - } - - private void cloneToolStripMenuItem_Click(object sender, EventArgs e) - { - try - { - ListViewItem listViewItem = new ListViewItem(); - ListViewItem selected = listViewBoxes.SelectedItems[0]; - listViewItem.Text = selected.Text; - listViewItem.Tag = selected.Tag; - int num = 0; - foreach (ListViewItem.ListViewSubItem subItem in selected.SubItems) - { - if (num > 0) - listViewItem.SubItems.Add(subItem.Text); - ++num; - } - listViewBoxes.Items.Add(listViewItem); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - MessageBox.Show(this, "Please Select a Part"); - } - } - - private void deleteToolStripMenuItem_Click(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems[0] == null) - return; - listViewBoxes.SelectedItems[0].Remove(); - Rerender(); - } - - private void changeColorToolStripMenuItem_Click(object sender, EventArgs e) - { - ColorDialog colorDialog = new ColorDialog(); - if (colorDialog.ShowDialog(this) == DialogResult.OK) - listViewBoxes.SelectedItems[0].ForeColor = colorDialog.Color; - Rerender(); - } - - //Re-renders tool with updated x-offset - private void offsetTool_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - //Re-renders helmet with updated x-offset - private void offsetHelmet_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - //Re-renders pants with updated x-offset - private void offsetPants_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - //Re-renders leggings with updated x-offset - private void offsetLeggings_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - //Re-renders boots with updated x-offset - private void offsetBoots_TextChanged(object sender, EventArgs e) - { - Rerender(); - } - - //Item Selection - private void listView1_Click(object sender, EventArgs e) - { - if (listViewBoxes.SelectedItems.Count != 0 && listViewBoxes.SelectedItems[0] != null && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - comboParent.Text = part.Type; - PosXUpDown.Value = (decimal)part.Pos.X; - PosYUpDown.Value = (decimal)part.Pos.Y; - PosZUpDown.Value = (decimal)part.Pos.Z; - SizeXUpDown.Value = (decimal)part.Size.X; - SizeYUpDown.Value = (decimal)part.Size.Y; - SizeZUpDown.Value = (decimal)part.Size.Z; - TextureXUpDown.Value = (decimal)part.UV.X; - TextureYUpDown.Value = (decimal)part.UV.Y; - SizeXUpDown.Enabled = true; - SizeYUpDown.Enabled = true; - SizeZUpDown.Enabled = true; - PosXUpDown.Enabled = true; - PosYUpDown.Enabled = true; - PosZUpDown.Enabled = true; - TextureXUpDown.Enabled = true; - TextureYUpDown.Enabled = true; - comboParent.Enabled = true; - return; - } - SizeXUpDown.Enabled = false; - SizeYUpDown.Enabled = false; - SizeZUpDown.Enabled = false; - PosXUpDown.Enabled = false; - PosYUpDown.Enabled = false; - PosZUpDown.Enabled = false; - TextureXUpDown.Enabled = false; - TextureYUpDown.Enabled = false; - comboParent.Enabled = false; - Rerender(); - } - - //currently scrapped - private void generateModel_FormClosing(object sender, FormClosingEventArgs e) - {/* - if (MessageBox.Show("You done here?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) - { - e.Cancel = true; - return; - } - e.Cancel = false;*/ - } - - private void delStuffUsingDelKey(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Delete && listViewBoxes.SelectedItems.Count != 0 && - listViewBoxes.SelectedItems[0].Tag is SkinBOX part) - { - if (modelBoxes.Remove(part)) - listViewBoxes.SelectedItems[0].Remove(); - Rerender(); - } - } - - private void generateModel_SizeChanged(object sender, EventArgs e) - { - Rerender(); - } - } -} \ No newline at end of file diff --git a/PCK-Studio/Internal/App/ApplicationBuildInfo.cs b/PCK-Studio/Internal/App/ApplicationBuildInfo.cs deleted file mode 100644 index f7a0007f..00000000 --- a/PCK-Studio/Internal/App/ApplicationBuildInfo.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2023-present miku-666, MattNL - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. -**/ -using System; -using System.IO; -using System.Reflection; - -namespace PckStudio.Internal.App -{ - static internal class ApplicationBuildInfo - { - // this is to specify which build release this is. This is manually updated for now - // TODO: add different chars for different configurations - private const string BuildType = "c"; - private static System.Globalization.Calendar _buildCalendar; - private static DateTime date = new FileInfo(Assembly.GetExecutingAssembly().Location).LastWriteTime; - private static string _betaBuildVersion; - - public static string BetaBuildVersion - { - get - { - // adopted Minecraft Java Edition Snapshot format (YYwWWn) - // to keep track of work in progress features and builds - _buildCalendar ??= new System.Globalization.CultureInfo("en-US").Calendar; - return _betaBuildVersion ??= string.Format("#{0}w{1}{2}", - date.ToString("yy"), - _buildCalendar.GetWeekOfYear(date, System.Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday), - BuildType); - } - } - } -} diff --git a/PCK-Studio/Internal/App/Profiler.cs b/PCK-Studio/Internal/App/Profiler.cs deleted file mode 100644 index 1de57454..00000000 --- a/PCK-Studio/Internal/App/Profiler.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2023-present miku-666 - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1.The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. -**/ -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace PckStudio.Internal.App -{ - internal static class Profiler - { - private static Stopwatch _stopwatch = new Stopwatch(); - - [Conditional("DEBUG")] - internal static void Start([CallerMemberName] string caller = default!, [CallerFilePath] string source = default!, [CallerLineNumber] int line = default!) - { - Debug.WriteLine($"Stopwatch starts", category: nameof(Profiler)); - Debug.WriteLine($"{source}@{caller}:{line}", category: nameof(Profiler)); - _stopwatch.Restart(); - } - - [Conditional("DEBUG")] - internal static void Stop([CallerMemberName] string caller = default!, [CallerFilePath] string source = default!, [CallerLineNumber] int line = default!) - { - _stopwatch.Stop(); - Debug.WriteLine($"{caller} took {_stopwatch.ElapsedMilliseconds}ms", category: nameof(Profiler)); - } - - } -} diff --git a/PCK-Studio/Internal/AppResourceManager.cs b/PCK-Studio/Internal/AppResourceManager.cs new file mode 100644 index 00000000..2f1d2fe9 --- /dev/null +++ b/PCK-Studio/Internal/AppResourceManager.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Resources; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Linq; +using OMI.Workers; +using PckStudio.Properties; + +namespace PckStudio.Internal +{ + internal sealed class AppResourceManager + { + public static readonly AppResourceManager Default = new AppResourceManager(Resources.ResourceManager, Resources.Culture); + private ResourceManager _resourceManager; + private readonly CultureInfo _culture; + + public AppResourceManager(ResourceManager resourceManager, CultureInfo culture) + { + _resourceManager = resourceManager ?? throw new ArgumentNullException(nameof(resourceManager)); + _culture = culture; + } + + public T GetData(byte[] rawData, IDataFormatReader dataFormatReader) where T : class + { + _ = rawData ?? throw new ArgumentNullException(nameof(rawData)); + _ = dataFormatReader ?? throw new ArgumentNullException(nameof(dataFormatReader)); + + T result = default; + using (Stream resourceStream = new MemoryStream(rawData)) + { + result = dataFormatReader.FromStream(resourceStream); + } + return result; + } + + public T GetDataFromResource(string name, IDataFormatReader dataFormatReader) where T : class + { + return GetData((byte[])_resourceManager.GetObject(name, _culture), dataFormatReader); + } + } +} diff --git a/PCK-Studio/Internal/App/ApplicationScope.cs b/PCK-Studio/Internal/ApplicationScope.cs similarity index 51% rename from PCK-Studio/Internal/App/ApplicationScope.cs rename to PCK-Studio/Internal/ApplicationScope.cs index c6b9762f..8f3c9e9c 100644 --- a/PCK-Studio/Internal/App/ApplicationScope.cs +++ b/PCK-Studio/Internal/ApplicationScope.cs @@ -3,12 +3,13 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using PckStudio.Properties; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using System.Globalization; -using PckStudio.Internal.Json; -using PckStudio.Internal.Misc; +using PckStudio.Core.Json; +using PckStudio.Core.Misc; using System.Threading.Tasks; using System.Windows.Forms; +using PckStudio.Json; namespace PckStudio.Internal.App { @@ -25,30 +26,26 @@ namespace PckStudio.Internal.App internal static void Initialize() { - Profiler.Start(); - { - _entityImages ??= Resources.entities_atlas.SplitHorizontal(32).ToArray(); - DataCacher ??= new FileCacher(Program.AppDataCache); - _ = Tiles.JsonBlockData; - _ = Tiles.JsonItemData; - _ = Tiles.JsonParticleData; - _ = Tiles.JsonMoonPhaseData; - _ = Tiles.JsonExplosionData; - _ = Tiles.JsonMapIconData; - _ = Tiles.JsonExperienceOrbData; - _ = Tiles.JsonPaintingData; - _ = Tiles.BlockImageList; - _ = Tiles.ItemImageList; - _ = Tiles.ParticleImageList; - _ = Tiles.ExplosionImageList; - _ = Tiles.MapIconImageList; - _ = Tiles.ExperienceOrbImageList; - _ = Tiles.MoonPhaseImageList; - _ = Tiles.PaintingImageList; - CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; - Task.Run(GetContributors); - } - Profiler.Stop(); + _entityImages ??= Resources.entities_atlas.SplitHorizontal(32).ToArray(); + DataCacher ??= new FileCacher(Program.AppDataCache); + _ = Tiles.JsonBlockData; + _ = Tiles.JsonItemData; + _ = Tiles.JsonParticleData; + _ = Tiles.JsonMoonPhaseData; + _ = Tiles.JsonExplosionData; + _ = Tiles.JsonMapIconData; + _ = Tiles.JsonExperienceOrbData; + _ = Tiles.JsonPaintingData; + _ = Tiles.BlockImageList; + _ = Tiles.ItemImageList; + _ = Tiles.ParticleImageList; + _ = Tiles.ExplosionImageList; + _ = Tiles.MapIconImageList; + _ = Tiles.ExperienceOrbImageList; + _ = Tiles.MoonPhaseImageList; + _ = Tiles.PaintingImageList; + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + Task.Run(GetContributors); } internal static void GetContributors() diff --git a/PCK-Studio/Internal/App/CommitInfo.cs b/PCK-Studio/Internal/CommitInfo.cs similarity index 100% rename from PCK-Studio/Internal/App/CommitInfo.cs rename to PCK-Studio/Internal/CommitInfo.cs diff --git a/PCK-Studio/Internal/Json/Entities.cs b/PCK-Studio/Internal/Entities.cs similarity index 92% rename from PCK-Studio/Internal/Json/Entities.cs rename to PCK-Studio/Internal/Entities.cs index a0729112..3ade10d4 100644 --- a/PCK-Studio/Internal/Json/Entities.cs +++ b/PCK-Studio/Internal/Entities.cs @@ -4,12 +4,11 @@ using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; -using System.Windows.Forms; using Newtonsoft.Json; -using PckStudio.Extensions; using PckStudio.Properties; +using PckStudio.Core.Json; -namespace PckStudio.Internal.Json +namespace PckStudio.Json { internal class JsonEntities { diff --git a/PCK-Studio/Internal/GameConstants.cs b/PCK-Studio/Internal/GameConstants.cs deleted file mode 100644 index 72abeb67..00000000 --- a/PCK-Studio/Internal/GameConstants.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PckStudio.Internal -{ - internal static class GameConstants - { - - public const int GameTickInMilliseconds = 50; - - // See: https://minecraft.fandom.com/wiki/Dye#Color_values for more information. - public static readonly Color[] DyeColors = [ - Color.FromArgb(0xf9fffe), // White - Color.FromArgb(0xf9801d), // Orange - Color.FromArgb(0xc74ebd), // Magenta - Color.FromArgb(0x3ab3da), // Light Blue - Color.FromArgb(0xfed83d), // Yellow - Color.FromArgb(0x80c71f), // Lime - Color.FromArgb(0xf38baa), // Pink - Color.FromArgb(0x474f52), // Gray - Color.FromArgb(0x9d9d97), // Light Gray - Color.FromArgb(0x169c9c), // Cyan - Color.FromArgb(0x8932b8), // Purple - Color.FromArgb(0x3c44aa), // Blue - Color.FromArgb(0x835432), // Brown - Color.FromArgb(0x5e7c16), // Green - Color.FromArgb(0xb02e26), // Red - Color.FromArgb(0x1d1d21), // Black - ]; - } -} diff --git a/PCK-Studio/Internal/IO/CSMB/CSMBFileReader.cs b/PCK-Studio/Internal/IO/CSMB/CSMBFileReader.cs deleted file mode 100644 index c8c41aaa..00000000 --- a/PCK-Studio/Internal/IO/CSMB/CSMBFileReader.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.IO; -using System.Text; -using OMI; -using OMI.Workers; -using PckStudio.FileFormats; - -namespace PckStudio.Internal.IO.CSMB -{ - internal class CSMBFileReader : IDataFormatReader, IDataFormatReader - { - private CSMBFileReader() - { } - - public CSMBFile FromFile(string filename) - { - throw new System.NotImplementedException(); - } - - public CSMBFile FromStream(Stream stream) - { - CSMBFile csmbFile = new CSMBFile(); - using (var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian)) - { - reader.ReadInt32(); - int numOfParts = reader.ReadInt32(); - for (int i = 0; i < numOfParts; i++) - { - CSMBPart part = new CSMBPart(); - part.Name = ReadString(reader); - part.Parent = (CSMBParentPart)reader.ReadInt32(); - part.posX = reader.ReadSingle(); - part.posY = reader.ReadSingle(); - part.posZ = reader.ReadSingle(); - part.sizeX = reader.ReadSingle(); - part.sizeY = reader.ReadSingle(); - part.sizeZ = reader.ReadSingle(); - part.uvX = reader.ReadInt32(); - part.uvY = reader.ReadInt32(); - part.MirrorTexture = reader.ReadBoolean(); - part.HideWArmour = reader.ReadBoolean(); - part.Inflation = reader.ReadSingle(); - csmbFile.Parts.Add(part); - } - int numOfOffsets = reader.ReadInt32(); - for (int i = 0; i < numOfOffsets; i++) - { - CSMBOffset offset = new CSMBOffset(); - offset.offsetPart = (CSMBOffsetPart)reader.ReadInt32(); - offset.VerticalOffset = reader.ReadSingle(); - csmbFile.Offsets.Add(offset); - } - } - return csmbFile; - } - - private string ReadString(EndiannessAwareBinaryReader reader) - { - ushort strlen = reader.ReadUInt16(); - return reader.ReadString(strlen); - } - - object IDataFormatReader.FromStream(Stream stream) => FromStream(stream); - - object IDataFormatReader.FromFile(string filename) => FromFile(filename); - } -} diff --git a/PCK-Studio/Internal/IO/CSMB/CSMBFileWriter.cs b/PCK-Studio/Internal/IO/CSMB/CSMBFileWriter.cs deleted file mode 100644 index b572b092..00000000 --- a/PCK-Studio/Internal/IO/CSMB/CSMBFileWriter.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.IO; -using System.Text; -using PckStudio.FileFormats; -using OMI.Workers; -using OMI; - -namespace PckStudio.Internal.IO.CSMB -{ - internal class CSMBFileWriter : IDataFormatWriter - { - CSMBFile _CSMB; - - public CSMBFileWriter(CSMBFile csmb) - { - _CSMB = csmb; - } - - public void WriteToFile(string filename) - { - using (FileStream fs = File.OpenWrite(filename)) - { - WriteToStream(fs); - } - } - - public void WriteToStream(Stream stream) - { - using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian)) - { - writer.Write(0); - writer.Write(_CSMB.Parts.Count); - foreach (CSMBPart part in _CSMB.Parts) - { - writer.Write((short)part.Name.Length); - writer.WriteString(part.Name); - writer.Write((int)part.Parent); - writer.Write(part.posX); - writer.Write(part.posY); - writer.Write(part.posZ); - writer.Write(part.sizeX); - writer.Write(part.sizeY); - writer.Write(part.sizeZ); - writer.Write(part.uvX); - writer.Write(part.uvY); - writer.Write(part.MirrorTexture); - writer.Write(part.HideWArmour); - writer.Write(part.Inflation); - } - writer.Write(_CSMB.Offsets.Count); - foreach (CSMBOffset offset in _CSMB.Offsets) - { - writer.Write((int)offset.offsetPart); - writer.Write(offset.VerticalOffset); - } - } - } - } -} diff --git a/PCK-Studio/Internal/PckNodeSorter.cs b/PCK-Studio/Internal/PckNodeSorter.cs index 934bc1be..174cd4f2 100644 --- a/PCK-Studio/Internal/PckNodeSorter.cs +++ b/PCK-Studio/Internal/PckNodeSorter.cs @@ -4,7 +4,7 @@ using System.Diagnostics; using System.Windows.Forms; using OMI.Formats.Pck; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; namespace PckStudio.Internal { diff --git a/PCK-Studio/Internal/ResourceLocation.cs b/PCK-Studio/Internal/ResourceLocation.cs deleted file mode 100644 index 89b9601b..00000000 --- a/PCK-Studio/Internal/ResourceLocation.cs +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (c) 2024-present miku-666 - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1.The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. -**/ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; - -namespace PckStudio.Internal -{ - internal sealed class ResourceLocation - { - private static List ResourceGroups = new List(); - private static readonly ResourceLocation Unknown = new ResourceLocation(string.Empty, ResourceCategory.Unknown, 1); - - private static readonly Dictionary _categoryLookUp = new Dictionary() - { - ["textures/items"] = new ResourceLocation("textures/items", ResourceCategory.ItemAnimation, 16, isGroup: true), - ["textures/blocks"] = new ResourceLocation("textures/blocks", ResourceCategory.BlockAnimation, 16, isGroup: true), - ["terrain.png"] = new ResourceLocation("terrain.png", ResourceCategory.BlockAtlas, 16), - ["items.png"] = new ResourceLocation("items.png", ResourceCategory.ItemAtlas, 16), - ["particles.png"] = new ResourceLocation("particles.png", ResourceCategory.ParticleAtlas, 16), - ["item/banner/Banner_Atlas.png"] = new ResourceLocation("item/banner/Banner_Atlas.png", ResourceCategory.BannerAtlas, new Size(6, 7), TillingMode.WidthAndHeight), - ["art/kz.png"] = new ResourceLocation("art/kz.png", ResourceCategory.PaintingAtlas, 16), - ["misc/explosion.png"] = new ResourceLocation("misc/explosion.png", ResourceCategory.ExplosionAtlas, 4), - ["item/xporb.png"] = new ResourceLocation("item/xporb.png", ResourceCategory.ExperienceOrbAtlas, 4), - ["terrain/moon_phases.png"] = new ResourceLocation("terrain/moon_phases.png", ResourceCategory.MoonPhaseAtlas, 4), - ["misc/mapicons.png"] = new ResourceLocation("misc/mapicons.png", ResourceCategory.MapIconAtlas, 4), - ["misc/additionalmapicons.png"] = new ResourceLocation("misc/additionalmapicons.png", ResourceCategory.AdditionalMapIconsAtlas, 4), - }; - - public static string GetPathFromCategory(ResourceCategory category) - { - return category switch - { - ResourceCategory.ItemAnimation => _categoryLookUp["textures/items"].ToString(), - ResourceCategory.BlockAnimation => _categoryLookUp["textures/blocks"].ToString(), - ResourceCategory.BlockAtlas => _categoryLookUp["terrain.png"].ToString(), - ResourceCategory.ItemAtlas => _categoryLookUp["items.png"].ToString(), - ResourceCategory.ParticleAtlas => _categoryLookUp["particles.png"].ToString(), - ResourceCategory.BannerAtlas => _categoryLookUp["item/banner/Banner_Atlas.png"].ToString(), - ResourceCategory.PaintingAtlas => _categoryLookUp["art/kz.png"].ToString(), - ResourceCategory.ExplosionAtlas => _categoryLookUp["misc/explosion.png"].ToString(), - ResourceCategory.ExperienceOrbAtlas => _categoryLookUp["item/xporb.png"].ToString(), - ResourceCategory.MoonPhaseAtlas => _categoryLookUp["terrain/moon_phases.png"].ToString(), - ResourceCategory.MapIconAtlas => _categoryLookUp["misc/mapicons.png"].ToString(), - ResourceCategory.AdditionalMapIconsAtlas => _categoryLookUp["misc/additionalmapicons.png"].ToString(), - _ => string.Empty - }; - } - - public static ResourceCategory GetCategoryFromPath(string path) => GetFromPath(path).Category; - - public static ResourceLocation GetFromPath(string path) - { - if (string.IsNullOrWhiteSpace(path) || !path.StartsWith("res/")) - return Unknown; - string categoryPath = path.Substring("res/".Length); - if (_categoryLookUp.ContainsKey(categoryPath)) - return _categoryLookUp[categoryPath]; - return ResourceGroups.Where(group => categoryPath.StartsWith(group.Path)).FirstOrDefault() ?? Unknown; - } - - public enum TillingMode - { - Width, - Height, - WidthAndHeight - } - - public readonly string Path; - public readonly ResourceCategory Category; - public readonly Size TillingFactor; - public readonly TillingMode Tilling; - public readonly bool IsGroup; - - public Size GetTileArea(Size imgSize) - { - int tileFactorWidth = Math.Max(1, TillingFactor.Width); - int tileFactorHeight = Math.Max(1, TillingFactor.Height); - return Tilling switch - { - TillingMode.Width => new Size(imgSize.Width / tileFactorWidth, imgSize.Width / tileFactorHeight), - TillingMode.Height => new Size(imgSize.Height / tileFactorWidth, imgSize.Height / tileFactorHeight), - TillingMode.WidthAndHeight => new Size(imgSize.Width / tileFactorWidth, imgSize.Height / tileFactorHeight), - _ => Size.Empty, - }; - } - - private ResourceLocation(string path, ResourceCategory category, int tillingFactor, TillingMode tilling = TillingMode.Width, bool isGroup = false) - : this(path, category, new Size(tillingFactor, tillingFactor), tilling, isGroup) - { - } - - private ResourceLocation(string path, ResourceCategory category, Size tillingFactor, TillingMode tilling = TillingMode.Width, bool isGroup = false) - { - Path = path; - Category = category; - TillingFactor = tillingFactor; - Tilling = tilling; - IsGroup = isGroup; - if (isGroup) - ResourceGroups.Add(this); - } - - public override string ToString() - { - return "res/" + Path; - } - } -} diff --git a/PCK-Studio/Internal/Misc/RichPresenceClient.cs b/PCK-Studio/Internal/RichPresenceClient.cs similarity index 97% rename from PCK-Studio/Internal/Misc/RichPresenceClient.cs rename to PCK-Studio/Internal/RichPresenceClient.cs index a9590095..533fbe82 100644 --- a/PCK-Studio/Internal/Misc/RichPresenceClient.cs +++ b/PCK-Studio/Internal/RichPresenceClient.cs @@ -2,11 +2,10 @@ using System.Diagnostics; using DiscordRPC; using PckStudio.Internal; -using PckStudio.Properties; using DiscordRPC.Logging; -using PckStudio.Internal.App; +using PckStudio.Properties; -namespace PckStudio.Internal.Misc +namespace PckStudio.Internal { // https://github.com/BullyWiiPlaza/Minecraft-Wii-U-Mod-Injector/blob/main/Minecraft%20Wii%20U%20Mod%20Injector/Helpers/DiscordRpc.cs static class RPC diff --git a/PCK-Studio/Internal/SettingsManager.cs b/PCK-Studio/Internal/SettingsManager.cs new file mode 100644 index 00000000..c08f452a --- /dev/null +++ b/PCK-Studio/Internal/SettingsManager.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Properties; + +namespace PckStudio.Internal +{ + internal static class SettingsManager + { + internal static Core.App.SettingsManager Default { get; } = new Core.App.SettingsManager(Settings.Default, isReadOnly: true); + } +} diff --git a/PCK-Studio/Internal/SkinBOX.cs b/PCK-Studio/Internal/SkinBOX.cs deleted file mode 100644 index c324b6ec..00000000 --- a/PCK-Studio/Internal/SkinBOX.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2023-present miku-666, MattNL - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1.The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. -**/ -using System; -using System.Numerics; - -namespace PckStudio.Internal -{ - public class SkinBOX : ICloneable, IEquatable - { - public static readonly SkinBOX Empty = new SkinBOX("HEAD", new Vector3(-4, -8, -4), new Vector3(8), Vector2.Zero); - - public string Type; - public Vector3 Pos; - public Vector3 Size; - public Vector2 UV; - public bool HideWithArmor; - public bool Mirror; - public float Scale; - - public SkinBOX(string type, Vector3 pos, Vector3 size, Vector2 uv, - bool hideWithArmor = false, bool mirror = false, float scale = 0.0f) - { - Type = type; - Pos = pos; - Size = size; - UV = uv; - HideWithArmor = hideWithArmor; - Mirror = mirror; - Scale = scale; - } - - public static SkinBOX FromString(string value) - { - var arguments = value.Split(' '); - if (arguments.Length < 9) - { - throw new ArgumentException("Arguments must have at least a length of 9"); - } - string type = arguments[0]; - Vector3 pos = TryGetVector3(arguments, 1); - Vector3 size = TryGetVector3(arguments, 4); - Vector2 uv = TryGetVector2(arguments, 7); - var skinBox = new SkinBOX(type, pos, size, uv); - if (arguments.Length >= 10) - skinBox.HideWithArmor = arguments[9] == "1"; - if (arguments.Length >= 11) - skinBox.Mirror = arguments[10] == "1"; - if (arguments.Length >= 12) - float.TryParse(arguments[11], out skinBox.Scale); - return skinBox; - } - - public ValueTuple ToProperty() - { - return new ValueTuple("BOX", ToString()); - } - - public override string ToString() - { - return - $"{Type} {Pos.X} {Pos.Y} {Pos.Z} {Size.X} {Size.Y} {Size.Z} {UV.X} {UV.Y} {Convert.ToInt32(HideWithArmor)} {Convert.ToInt32(Mirror)} {Scale}" - .Replace(',', '.'); - } - - private static Vector2 TryGetVector2(string[] arguments, int startIndex) - { - float.TryParse(arguments[startIndex], out float x); - float.TryParse(arguments[startIndex + 1], out float y); - return new Vector2(x, y); - } - - private static Vector3 TryGetVector3(string[] arguments, int startIndex) - { - Vector2 xy = TryGetVector2(arguments, startIndex); - float.TryParse(arguments[startIndex + 2], out float z); - return new Vector3(xy, z); - } - - public override int GetHashCode() - { - return Type.GetHashCode() % Pos.GetHashCode() * UV.GetHashCode() % Size.GetHashCode(); - } - - public override bool Equals(object obj) - { - return obj is SkinBOX box && Equals(box); - } - - public bool Equals(SkinBOX other) - { - return Type.Equals(other.Type) && - Pos.Equals(other.Pos) && - Size.Equals(other.Size) && - UV.Equals(other.UV); - } - - public object Clone() - { - return new SkinBOX((string)Type.Clone(), Pos, Size, UV, HideWithArmor, Mirror, Scale); - } - } -} diff --git a/PCK-Studio/MainForm.Designer.cs b/PCK-Studio/MainForm.Designer.cs index 8c9e1cd4..c9bcfaff 100644 --- a/PCK-Studio/MainForm.Designer.cs +++ b/PCK-Studio/MainForm.Designer.cs @@ -28,60 +28,11 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.Windows.Forms.PictureBox logoPictureBox; - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.Windows.Forms.ToolStripSeparator toolStripSeparator2; System.Windows.Forms.ToolStripSeparator toolStripSeparator4; this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.contextMenuPCKEntries = new System.Windows.Forms.ContextMenuStrip(this.components); - this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.folderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.skinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.createAnimatedTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.audiopckToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.colourscolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CreateSkinsPCKToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.behavioursbinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.entityMaterialsbinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.importSkinsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.importSkinToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.importExtractedSkinsFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addTextureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.as3DSTextureFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setFileTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.skinToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.capeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.textureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.languagesFileLOCToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gameRulesFileGRFToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.audioPCKFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.coloursCOLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gameRulesHeaderGRHToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.skinsPCKToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.modelsFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.behavioursFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.entityMaterialsFileBINToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.generateMipMapTextureToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.viewFileInfoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.correctSkinDecimalsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setSubPCKEndiannessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.bigEndianXbox360PS3WiiUToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.littleEndianPS4PSVitaSwitchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setModelContainerFormatToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.version1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.version2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.version3114ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.extractToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cloneFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.renameFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.replaceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -92,9 +43,10 @@ this.recentlyOpenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.packSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.fullBoxSupportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.quickChangeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -121,60 +73,24 @@ this.joinDevelopmentDiscordToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.trelloBoardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.contextMenuMetaTree = new System.Windows.Forms.ContextMenuStrip(this.components); - this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.addEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.addBOXEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.addANIMEntryToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.addMultipleEntriesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.deleteEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.editAllEntriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.tabControl = new MetroFramework.Controls.MetroTabControl(); - this.openTab = new MetroFramework.Controls.MetroTabPage(); - this.pckOpen = new System.Windows.Forms.PictureBox(); - this.label5 = new MetroFramework.Controls.MetroLabel(); + this.tabControl = new PckStudio.Controls.CustomTabControl(); + this.StartPage = new MetroFramework.Controls.MetroTabPage(); this.labelVersion = new MetroFramework.Controls.MetroLabel(); + this.label5 = new MetroFramework.Controls.MetroLabel(); this.ChangelogRichTextBox = new System.Windows.Forms.RichTextBox(); + this.pckOpen = new System.Windows.Forms.PictureBox(); this.editorTab = new MetroFramework.Controls.MetroTabPage(); - this.pckFileLabel = new MetroFramework.Controls.MetroLabel(); - this.labelImageSize = new MetroFramework.Controls.MetroLabel(); - this.fileEntryCountLabel = new MetroFramework.Controls.MetroLabel(); - this.PropertiesTabControl = new MetroFramework.Controls.MetroTabControl(); - this.MetaTab = new MetroFramework.Controls.MetroTabPage(); - this.metroLabel2 = new MetroFramework.Controls.MetroLabel(); - this.treeMeta = new System.Windows.Forms.TreeView(); - this.entryTypeTextBox = new MetroFramework.Controls.MetroTextBox(); - this.entryDataTextBox = new MetroFramework.Controls.MetroTextBox(); - this.buttonEdit = new MetroFramework.Controls.MetroButton(); - this.metroLabel1 = new MetroFramework.Controls.MetroLabel(); this.label11 = new MetroFramework.Controls.MetroLabel(); - this.treeViewMain = new System.Windows.Forms.TreeView(); - this.imageList = new System.Windows.Forms.ImageList(this.components); - this.previewPictureBox = new PckStudio.ToolboxItems.InterpolationPictureBox(); - this.LittleEndianCheckBox = new MetroFramework.Controls.MetroCheckBox(); - logoPictureBox = new System.Windows.Forms.PictureBox(); toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).BeginInit(); - this.contextMenuPCKEntries.SuspendLayout(); this.menuStrip.SuspendLayout(); - this.contextMenuMetaTree.SuspendLayout(); this.tabControl.SuspendLayout(); - this.openTab.SuspendLayout(); + this.StartPage.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pckOpen)).BeginInit(); this.editorTab.SuspendLayout(); - this.PropertiesTabControl.SuspendLayout(); - this.MetaTab.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).BeginInit(); this.SuspendLayout(); // - // logoPictureBox - // - resources.ApplyResources(logoPictureBox, "logoPictureBox"); - logoPictureBox.Name = "logoPictureBox"; - logoPictureBox.TabStop = false; - // // toolStripSeparator1 // toolStripSeparator1.Name = "toolStripSeparator1"; @@ -195,332 +111,10 @@ this.toolStripSeparator3.Name = "toolStripSeparator3"; resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); // - // contextMenuPCKEntries - // - this.contextMenuPCKEntries.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.createToolStripMenuItem, - this.importSkinsToolStripMenuItem, - this.exportToolStripMenuItem, - this.setFileTypeToolStripMenuItem, - this.toolStripSeparator5, - this.generateMipMapTextureToolStripMenuItem1, - this.viewFileInfoToolStripMenuItem, - this.correctSkinDecimalsToolStripMenuItem, - this.setSubPCKEndiannessToolStripMenuItem, - this.setModelContainerFormatToolStripMenuItem, - this.toolStripSeparator6, - this.extractToolStripMenuItem, - this.cloneFileToolStripMenuItem, - this.renameFileToolStripMenuItem, - this.replaceToolStripMenuItem, - this.deleteFileToolStripMenuItem}); - this.contextMenuPCKEntries.Name = "contextMenuStrip1"; - resources.ApplyResources(this.contextMenuPCKEntries, "contextMenuPCKEntries"); - this.contextMenuPCKEntries.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuPCKEntries_Opening); - // - // createToolStripMenuItem - // - this.createToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.folderToolStripMenuItem, - this.skinToolStripMenuItem, - this.createAnimatedTextureToolStripMenuItem, - this.audiopckToolStripMenuItem, - this.colourscolToolStripMenuItem, - this.CreateSkinsPCKToolStripMenuItem1, - this.behavioursbinToolStripMenuItem, - this.entityMaterialsbinToolStripMenuItem}); - resources.ApplyResources(this.createToolStripMenuItem, "createToolStripMenuItem"); - this.createToolStripMenuItem.Name = "createToolStripMenuItem"; - // - // folderToolStripMenuItem - // - resources.ApplyResources(this.folderToolStripMenuItem, "folderToolStripMenuItem"); - this.folderToolStripMenuItem.Name = "folderToolStripMenuItem"; - this.folderToolStripMenuItem.Click += new System.EventHandler(this.folderToolStripMenuItem_Click); - // - // skinToolStripMenuItem - // - resources.ApplyResources(this.skinToolStripMenuItem, "skinToolStripMenuItem"); - this.skinToolStripMenuItem.Name = "skinToolStripMenuItem"; - this.skinToolStripMenuItem.Click += new System.EventHandler(this.createSkinToolStripMenuItem_Click); - // - // createAnimatedTextureToolStripMenuItem - // - resources.ApplyResources(this.createAnimatedTextureToolStripMenuItem, "createAnimatedTextureToolStripMenuItem"); - this.createAnimatedTextureToolStripMenuItem.Name = "createAnimatedTextureToolStripMenuItem"; - this.createAnimatedTextureToolStripMenuItem.Click += new System.EventHandler(this.createAnimatedTextureToolStripMenuItem_Click); - // - // audiopckToolStripMenuItem - // - this.audiopckToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BINKA_ICON; - this.audiopckToolStripMenuItem.Name = "audiopckToolStripMenuItem"; - resources.ApplyResources(this.audiopckToolStripMenuItem, "audiopckToolStripMenuItem"); - this.audiopckToolStripMenuItem.Click += new System.EventHandler(this.audiopckToolStripMenuItem_Click); - // - // colourscolToolStripMenuItem - // - this.colourscolToolStripMenuItem.Image = global::PckStudio.Properties.Resources.COL_ICON; - this.colourscolToolStripMenuItem.Name = "colourscolToolStripMenuItem"; - resources.ApplyResources(this.colourscolToolStripMenuItem, "colourscolToolStripMenuItem"); - this.colourscolToolStripMenuItem.Click += new System.EventHandler(this.colourscolToolStripMenuItem_Click); - // - // CreateSkinsPCKToolStripMenuItem1 - // - this.CreateSkinsPCKToolStripMenuItem1.Image = global::PckStudio.Properties.Resources.SKINS_ICON; - this.CreateSkinsPCKToolStripMenuItem1.Name = "CreateSkinsPCKToolStripMenuItem1"; - resources.ApplyResources(this.CreateSkinsPCKToolStripMenuItem1, "CreateSkinsPCKToolStripMenuItem1"); - this.CreateSkinsPCKToolStripMenuItem1.Click += new System.EventHandler(this.CreateSkinsPCKToolStripMenuItem1_Click); - // - // behavioursbinToolStripMenuItem - // - this.behavioursbinToolStripMenuItem.Image = global::PckStudio.Properties.Resources.BEHAVIOURS_ICON; - this.behavioursbinToolStripMenuItem.Name = "behavioursbinToolStripMenuItem"; - resources.ApplyResources(this.behavioursbinToolStripMenuItem, "behavioursbinToolStripMenuItem"); - this.behavioursbinToolStripMenuItem.Click += new System.EventHandler(this.behavioursbinToolStripMenuItem_Click); - // - // entityMaterialsbinToolStripMenuItem - // - this.entityMaterialsbinToolStripMenuItem.Image = global::PckStudio.Properties.Resources.ENTITY_MATERIALS_ICON; - this.entityMaterialsbinToolStripMenuItem.Name = "entityMaterialsbinToolStripMenuItem"; - resources.ApplyResources(this.entityMaterialsbinToolStripMenuItem, "entityMaterialsbinToolStripMenuItem"); - this.entityMaterialsbinToolStripMenuItem.Click += new System.EventHandler(this.entityMaterialsbinToolStripMenuItem_Click); - // - // importSkinsToolStripMenuItem - // - this.importSkinsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.importSkinToolStripMenuItem, - this.importExtractedSkinsFolderToolStripMenuItem, - this.addTextureToolStripMenuItem, - this.addFileToolStripMenuItem}); - resources.ApplyResources(this.importSkinsToolStripMenuItem, "importSkinsToolStripMenuItem"); - this.importSkinsToolStripMenuItem.Name = "importSkinsToolStripMenuItem"; - // - // importSkinToolStripMenuItem - // - resources.ApplyResources(this.importSkinToolStripMenuItem, "importSkinToolStripMenuItem"); - this.importSkinToolStripMenuItem.Name = "importSkinToolStripMenuItem"; - this.importSkinToolStripMenuItem.Click += new System.EventHandler(this.importSkinToolStripMenuItem_Click); - // - // importExtractedSkinsFolderToolStripMenuItem - // - resources.ApplyResources(this.importExtractedSkinsFolderToolStripMenuItem, "importExtractedSkinsFolderToolStripMenuItem"); - this.importExtractedSkinsFolderToolStripMenuItem.Name = "importExtractedSkinsFolderToolStripMenuItem"; - this.importExtractedSkinsFolderToolStripMenuItem.Click += new System.EventHandler(this.importExtractedSkinsFolder); - // - // addTextureToolStripMenuItem - // - this.addTextureToolStripMenuItem.Image = global::PckStudio.Properties.Resources.AddTexture; - this.addTextureToolStripMenuItem.Name = "addTextureToolStripMenuItem"; - resources.ApplyResources(this.addTextureToolStripMenuItem, "addTextureToolStripMenuItem"); - this.addTextureToolStripMenuItem.Click += new System.EventHandler(this.addTextureToolStripMenuItem_Click); - // - // addFileToolStripMenuItem - // - this.addFileToolStripMenuItem.Image = global::PckStudio.Properties.Resources.blank; - this.addFileToolStripMenuItem.Name = "addFileToolStripMenuItem"; - resources.ApplyResources(this.addFileToolStripMenuItem, "addFileToolStripMenuItem"); - this.addFileToolStripMenuItem.Click += new System.EventHandler(this.addFileToolStripMenuItem_Click); - // - // exportToolStripMenuItem - // - this.exportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.as3DSTextureFileToolStripMenuItem}); - this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; - resources.ApplyResources(this.exportToolStripMenuItem, "exportToolStripMenuItem"); - // - // as3DSTextureFileToolStripMenuItem - // - this.as3DSTextureFileToolStripMenuItem.Name = "as3DSTextureFileToolStripMenuItem"; - resources.ApplyResources(this.as3DSTextureFileToolStripMenuItem, "as3DSTextureFileToolStripMenuItem"); - this.as3DSTextureFileToolStripMenuItem.Click += new System.EventHandler(this.as3DSTextureFileToolStripMenuItem_Click); - // - // setFileTypeToolStripMenuItem - // - this.setFileTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.skinToolStripMenuItem1, - this.capeToolStripMenuItem, - this.textureToolStripMenuItem, - this.languagesFileLOCToolStripMenuItem, - this.gameRulesFileGRFToolStripMenuItem, - this.audioPCKFileToolStripMenuItem, - this.coloursCOLFileToolStripMenuItem, - this.gameRulesHeaderGRHToolStripMenuItem, - this.skinsPCKToolStripMenuItem, - this.modelsFileBINToolStripMenuItem, - this.behavioursFileBINToolStripMenuItem, - this.entityMaterialsFileBINToolStripMenuItem}); - this.setFileTypeToolStripMenuItem.Name = "setFileTypeToolStripMenuItem"; - resources.ApplyResources(this.setFileTypeToolStripMenuItem, "setFileTypeToolStripMenuItem"); - // - // skinToolStripMenuItem1 - // - this.skinToolStripMenuItem1.Name = "skinToolStripMenuItem1"; - resources.ApplyResources(this.skinToolStripMenuItem1, "skinToolStripMenuItem1"); - // - // capeToolStripMenuItem - // - this.capeToolStripMenuItem.Name = "capeToolStripMenuItem"; - resources.ApplyResources(this.capeToolStripMenuItem, "capeToolStripMenuItem"); - // - // textureToolStripMenuItem - // - this.textureToolStripMenuItem.Name = "textureToolStripMenuItem"; - resources.ApplyResources(this.textureToolStripMenuItem, "textureToolStripMenuItem"); - // - // languagesFileLOCToolStripMenuItem - // - this.languagesFileLOCToolStripMenuItem.Name = "languagesFileLOCToolStripMenuItem"; - resources.ApplyResources(this.languagesFileLOCToolStripMenuItem, "languagesFileLOCToolStripMenuItem"); - // - // gameRulesFileGRFToolStripMenuItem - // - this.gameRulesFileGRFToolStripMenuItem.Name = "gameRulesFileGRFToolStripMenuItem"; - resources.ApplyResources(this.gameRulesFileGRFToolStripMenuItem, "gameRulesFileGRFToolStripMenuItem"); - // - // audioPCKFileToolStripMenuItem - // - this.audioPCKFileToolStripMenuItem.Name = "audioPCKFileToolStripMenuItem"; - resources.ApplyResources(this.audioPCKFileToolStripMenuItem, "audioPCKFileToolStripMenuItem"); - // - // coloursCOLFileToolStripMenuItem - // - this.coloursCOLFileToolStripMenuItem.Name = "coloursCOLFileToolStripMenuItem"; - resources.ApplyResources(this.coloursCOLFileToolStripMenuItem, "coloursCOLFileToolStripMenuItem"); - // - // gameRulesHeaderGRHToolStripMenuItem - // - this.gameRulesHeaderGRHToolStripMenuItem.Name = "gameRulesHeaderGRHToolStripMenuItem"; - resources.ApplyResources(this.gameRulesHeaderGRHToolStripMenuItem, "gameRulesHeaderGRHToolStripMenuItem"); - // - // skinsPCKToolStripMenuItem - // - this.skinsPCKToolStripMenuItem.Name = "skinsPCKToolStripMenuItem"; - resources.ApplyResources(this.skinsPCKToolStripMenuItem, "skinsPCKToolStripMenuItem"); - // - // modelsFileBINToolStripMenuItem - // - this.modelsFileBINToolStripMenuItem.Name = "modelsFileBINToolStripMenuItem"; - resources.ApplyResources(this.modelsFileBINToolStripMenuItem, "modelsFileBINToolStripMenuItem"); - // - // behavioursFileBINToolStripMenuItem - // - this.behavioursFileBINToolStripMenuItem.Name = "behavioursFileBINToolStripMenuItem"; - resources.ApplyResources(this.behavioursFileBINToolStripMenuItem, "behavioursFileBINToolStripMenuItem"); - // - // entityMaterialsFileBINToolStripMenuItem - // - this.entityMaterialsFileBINToolStripMenuItem.Name = "entityMaterialsFileBINToolStripMenuItem"; - resources.ApplyResources(this.entityMaterialsFileBINToolStripMenuItem, "entityMaterialsFileBINToolStripMenuItem"); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); - // - // generateMipMapTextureToolStripMenuItem1 - // - this.generateMipMapTextureToolStripMenuItem1.Name = "generateMipMapTextureToolStripMenuItem1"; - resources.ApplyResources(this.generateMipMapTextureToolStripMenuItem1, "generateMipMapTextureToolStripMenuItem1"); - this.generateMipMapTextureToolStripMenuItem1.Click += new System.EventHandler(this.generateMipMapTextureToolStripMenuItem_Click); - // - // viewFileInfoToolStripMenuItem - // - this.viewFileInfoToolStripMenuItem.Name = "viewFileInfoToolStripMenuItem"; - resources.ApplyResources(this.viewFileInfoToolStripMenuItem, "viewFileInfoToolStripMenuItem"); - this.viewFileInfoToolStripMenuItem.Click += new System.EventHandler(this.viewFileInfoToolStripMenuItem_Click); - // - // correctSkinDecimalsToolStripMenuItem - // - this.correctSkinDecimalsToolStripMenuItem.Name = "correctSkinDecimalsToolStripMenuItem"; - resources.ApplyResources(this.correctSkinDecimalsToolStripMenuItem, "correctSkinDecimalsToolStripMenuItem"); - this.correctSkinDecimalsToolStripMenuItem.Click += new System.EventHandler(this.correctSkinDecimalsToolStripMenuItem_Click); - // - // setSubPCKEndiannessToolStripMenuItem - // - this.setSubPCKEndiannessToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.bigEndianXbox360PS3WiiUToolStripMenuItem, - this.littleEndianPS4PSVitaSwitchToolStripMenuItem}); - this.setSubPCKEndiannessToolStripMenuItem.Name = "setSubPCKEndiannessToolStripMenuItem"; - resources.ApplyResources(this.setSubPCKEndiannessToolStripMenuItem, "setSubPCKEndiannessToolStripMenuItem"); - // - // bigEndianXbox360PS3WiiUToolStripMenuItem - // - this.bigEndianXbox360PS3WiiUToolStripMenuItem.Name = "bigEndianXbox360PS3WiiUToolStripMenuItem"; - resources.ApplyResources(this.bigEndianXbox360PS3WiiUToolStripMenuItem, "bigEndianXbox360PS3WiiUToolStripMenuItem"); - this.bigEndianXbox360PS3WiiUToolStripMenuItem.Click += new System.EventHandler(this.bigEndianToolStripMenuItem_Click); - // - // littleEndianPS4PSVitaSwitchToolStripMenuItem - // - this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Name = "littleEndianPS4PSVitaSwitchToolStripMenuItem"; - resources.ApplyResources(this.littleEndianPS4PSVitaSwitchToolStripMenuItem, "littleEndianPS4PSVitaSwitchToolStripMenuItem"); - this.littleEndianPS4PSVitaSwitchToolStripMenuItem.Click += new System.EventHandler(this.littleEndianToolStripMenuItem_Click); - // - // setModelContainerFormatToolStripMenuItem - // - this.setModelContainerFormatToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.version1ToolStripMenuItem, - this.version2ToolStripMenuItem, - this.version3114ToolStripMenuItem}); - this.setModelContainerFormatToolStripMenuItem.Name = "setModelContainerFormatToolStripMenuItem"; - resources.ApplyResources(this.setModelContainerFormatToolStripMenuItem, "setModelContainerFormatToolStripMenuItem"); - // - // version1ToolStripMenuItem - // - this.version1ToolStripMenuItem.Name = "version1ToolStripMenuItem"; - resources.ApplyResources(this.version1ToolStripMenuItem, "version1ToolStripMenuItem"); - this.version1ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion1ToolStripMenuItem_Click); - // - // version2ToolStripMenuItem - // - this.version2ToolStripMenuItem.Name = "version2ToolStripMenuItem"; - resources.ApplyResources(this.version2ToolStripMenuItem, "version2ToolStripMenuItem"); - this.version2ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion2ToolStripMenuItem_Click); - // - // version3114ToolStripMenuItem - // - this.version3114ToolStripMenuItem.Name = "version3114ToolStripMenuItem"; - resources.ApplyResources(this.version3114ToolStripMenuItem, "version3114ToolStripMenuItem"); - this.version3114ToolStripMenuItem.Click += new System.EventHandler(this.setModelVersion3ToolStripMenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); - // - // extractToolStripMenuItem - // - resources.ApplyResources(this.extractToolStripMenuItem, "extractToolStripMenuItem"); - this.extractToolStripMenuItem.Name = "extractToolStripMenuItem"; - this.extractToolStripMenuItem.Click += new System.EventHandler(this.extractToolStripMenuItem_Click); - // - // cloneFileToolStripMenuItem - // - this.cloneFileToolStripMenuItem.Name = "cloneFileToolStripMenuItem"; - resources.ApplyResources(this.cloneFileToolStripMenuItem, "cloneFileToolStripMenuItem"); - this.cloneFileToolStripMenuItem.Click += new System.EventHandler(this.cloneFileToolStripMenuItem_Click); - // - // renameFileToolStripMenuItem - // - resources.ApplyResources(this.renameFileToolStripMenuItem, "renameFileToolStripMenuItem"); - this.renameFileToolStripMenuItem.Name = "renameFileToolStripMenuItem"; - this.renameFileToolStripMenuItem.Click += new System.EventHandler(this.renameFileToolStripMenuItem_Click); - // - // replaceToolStripMenuItem - // - resources.ApplyResources(this.replaceToolStripMenuItem, "replaceToolStripMenuItem"); - this.replaceToolStripMenuItem.Name = "replaceToolStripMenuItem"; - this.replaceToolStripMenuItem.Click += new System.EventHandler(this.replaceToolStripMenuItem_Click); - // - // deleteFileToolStripMenuItem - // - resources.ApplyResources(this.deleteFileToolStripMenuItem, "deleteFileToolStripMenuItem"); - this.deleteFileToolStripMenuItem.Name = "deleteFileToolStripMenuItem"; - this.deleteFileToolStripMenuItem.Click += new System.EventHandler(this.deleteFileToolStripMenuItem_Click); - // // menuStrip // resources.ApplyResources(this.menuStrip, "menuStrip"); - this.menuStrip.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); + this.menuStrip.BackColor = System.Drawing.Color.Transparent; this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem, this.editToolStripMenuItem, @@ -537,10 +131,11 @@ toolStripSeparator2, this.recentlyOpenToolStripMenuItem, toolStripSeparator4, - this.closeToolStripMenuItem, this.packSettingsToolStripMenuItem, - this.saveToolStripMenuItem1, this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.closeToolStripMenuItem, + this.closeAllToolStripMenuItem, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.ForeColor = System.Drawing.Color.Silver; this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; @@ -599,17 +194,18 @@ resources.ApplyResources(this.fullBoxSupportToolStripMenuItem, "fullBoxSupportToolStripMenuItem"); this.fullBoxSupportToolStripMenuItem.CheckedChanged += new System.EventHandler(this.fullBoxSupportToolStripMenuItem_CheckedChanged); // - // saveToolStripMenuItem1 - // - resources.ApplyResources(this.saveToolStripMenuItem1, "saveToolStripMenuItem1"); - this.saveToolStripMenuItem1.Name = "saveToolStripMenuItem1"; - this.saveToolStripMenuItem1.Click += new System.EventHandler(this.savePCK); - // // saveToolStripMenuItem // resources.ApplyResources(this.saveToolStripMenuItem, "saveToolStripMenuItem"); this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; - this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveAsPCK); + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Image = global::PckStudio.Properties.Resources.Save; + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + resources.ApplyResources(this.saveAsToolStripMenuItem, "saveAsToolStripMenuItem"); + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); // // closeToolStripMenuItem // @@ -617,6 +213,11 @@ this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click); // + // closeAllToolStripMenuItem + // + this.closeAllToolStripMenuItem.Name = "closeAllToolStripMenuItem"; + resources.ApplyResources(this.closeAllToolStripMenuItem, "closeAllToolStripMenuItem"); + // // exitToolStripMenuItem // resources.ApplyResources(this.exitToolStripMenuItem, "exitToolStripMenuItem"); @@ -809,93 +410,63 @@ this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); // - // contextMenuMetaTree - // - this.contextMenuMetaTree.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addEntryToolStripMenuItem, - this.addMultipleEntriesToolStripMenuItem1, - this.deleteEntryToolStripMenuItem, - this.editAllEntriesToolStripMenuItem}); - this.contextMenuMetaTree.Name = "contextMenuStrip1"; - resources.ApplyResources(this.contextMenuMetaTree, "contextMenuMetaTree"); - // - // addEntryToolStripMenuItem - // - this.addEntryToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.addEntryToolStripMenuItem1, - this.addBOXEntryToolStripMenuItem1, - this.addANIMEntryToolStripMenuItem1}); - resources.ApplyResources(this.addEntryToolStripMenuItem, "addEntryToolStripMenuItem"); - this.addEntryToolStripMenuItem.Name = "addEntryToolStripMenuItem"; - // - // addEntryToolStripMenuItem1 - // - this.addEntryToolStripMenuItem1.Name = "addEntryToolStripMenuItem1"; - resources.ApplyResources(this.addEntryToolStripMenuItem1, "addEntryToolStripMenuItem1"); - this.addEntryToolStripMenuItem1.Click += new System.EventHandler(this.addEntryToolStripMenuItem_Click_1); - // - // addBOXEntryToolStripMenuItem1 - // - this.addBOXEntryToolStripMenuItem1.Name = "addBOXEntryToolStripMenuItem1"; - resources.ApplyResources(this.addBOXEntryToolStripMenuItem1, "addBOXEntryToolStripMenuItem1"); - this.addBOXEntryToolStripMenuItem1.Click += new System.EventHandler(this.addBOXEntryToolStripMenuItem1_Click); - // - // addANIMEntryToolStripMenuItem1 - // - this.addANIMEntryToolStripMenuItem1.Name = "addANIMEntryToolStripMenuItem1"; - resources.ApplyResources(this.addANIMEntryToolStripMenuItem1, "addANIMEntryToolStripMenuItem1"); - this.addANIMEntryToolStripMenuItem1.Click += new System.EventHandler(this.addANIMEntryToolStripMenuItem1_Click); - // - // addMultipleEntriesToolStripMenuItem1 - // - resources.ApplyResources(this.addMultipleEntriesToolStripMenuItem1, "addMultipleEntriesToolStripMenuItem1"); - this.addMultipleEntriesToolStripMenuItem1.Name = "addMultipleEntriesToolStripMenuItem1"; - this.addMultipleEntriesToolStripMenuItem1.Click += new System.EventHandler(this.addMultipleEntriesToolStripMenuItem1_Click); - // - // deleteEntryToolStripMenuItem - // - resources.ApplyResources(this.deleteEntryToolStripMenuItem, "deleteEntryToolStripMenuItem"); - this.deleteEntryToolStripMenuItem.Name = "deleteEntryToolStripMenuItem"; - this.deleteEntryToolStripMenuItem.Click += new System.EventHandler(this.deleteEntryToolStripMenuItem_Click); - // - // editAllEntriesToolStripMenuItem - // - this.editAllEntriesToolStripMenuItem.Name = "editAllEntriesToolStripMenuItem"; - resources.ApplyResources(this.editAllEntriesToolStripMenuItem, "editAllEntriesToolStripMenuItem"); - this.editAllEntriesToolStripMenuItem.Click += new System.EventHandler(this.editAllEntriesToolStripMenuItem_Click); - // // tabControl // - this.tabControl.Controls.Add(this.openTab); - this.tabControl.Controls.Add(this.editorTab); + this.tabControl.Controls.Add(this.StartPage); resources.ApplyResources(this.tabControl, "tabControl"); + this.tabControl.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; this.tabControl.Name = "tabControl"; this.tabControl.SelectedIndex = 0; this.tabControl.Style = MetroFramework.MetroColorStyle.Silver; this.tabControl.TabStop = false; this.tabControl.Theme = MetroFramework.MetroThemeStyle.Dark; this.tabControl.UseSelectable = true; - this.tabControl.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl_Selecting); + this.tabControl.PageClosing += new System.EventHandler(this.tabControl_PageClosing); + this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged); // - // openTab + // StartPage // - this.openTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); - this.openTab.Controls.Add(this.pckOpen); - this.openTab.Controls.Add(this.label5); - this.openTab.Controls.Add(this.labelVersion); - this.openTab.Controls.Add(this.ChangelogRichTextBox); - this.openTab.ForeColor = System.Drawing.Color.Transparent; - this.openTab.HorizontalScrollbarBarColor = true; - this.openTab.HorizontalScrollbarHighlightOnWheel = false; - this.openTab.HorizontalScrollbarSize = 10; - resources.ApplyResources(this.openTab, "openTab"); - this.openTab.Name = "openTab"; - this.openTab.Style = MetroFramework.MetroColorStyle.Black; - this.openTab.Theme = MetroFramework.MetroThemeStyle.Dark; - this.openTab.UseStyleColors = true; - this.openTab.VerticalScrollbarBarColor = false; - this.openTab.VerticalScrollbarHighlightOnWheel = false; - this.openTab.VerticalScrollbarSize = 10; + this.StartPage.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); + this.StartPage.Controls.Add(this.labelVersion); + this.StartPage.Controls.Add(this.label5); + this.StartPage.Controls.Add(this.ChangelogRichTextBox); + this.StartPage.Controls.Add(this.pckOpen); + this.StartPage.ForeColor = System.Drawing.Color.Transparent; + this.StartPage.HorizontalScrollbarBarColor = true; + this.StartPage.HorizontalScrollbarHighlightOnWheel = false; + this.StartPage.HorizontalScrollbarSize = 10; + resources.ApplyResources(this.StartPage, "StartPage"); + this.StartPage.Name = "StartPage"; + this.StartPage.Style = MetroFramework.MetroColorStyle.Black; + this.StartPage.Theme = MetroFramework.MetroThemeStyle.Dark; + this.StartPage.UseStyleColors = true; + this.StartPage.VerticalScrollbarBarColor = false; + this.StartPage.VerticalScrollbarHighlightOnWheel = false; + this.StartPage.VerticalScrollbarSize = 10; + // + // labelVersion + // + resources.ApplyResources(this.labelVersion, "labelVersion"); + this.labelVersion.ForeColor = System.Drawing.Color.White; + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.BackColor = System.Drawing.Color.Transparent; + this.label5.ForeColor = System.Drawing.Color.White; + this.label5.Name = "label5"; + this.label5.Theme = MetroFramework.MetroThemeStyle.Dark; + // + // ChangelogRichTextBox + // + this.ChangelogRichTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); + this.ChangelogRichTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + resources.ApplyResources(this.ChangelogRichTextBox, "ChangelogRichTextBox"); + this.ChangelogRichTextBox.ForeColor = System.Drawing.Color.White; + this.ChangelogRichTextBox.Name = "ChangelogRichTextBox"; + this.ChangelogRichTextBox.ReadOnly = true; // // pckOpen // @@ -910,42 +481,11 @@ this.pckOpen.MouseEnter += new System.EventHandler(this.OpenPck_MouseEnter); this.pckOpen.MouseLeave += new System.EventHandler(this.OpenPck_MouseLeave); // - // label5 - // - resources.ApplyResources(this.label5, "label5"); - this.label5.BackColor = System.Drawing.Color.Transparent; - this.label5.ForeColor = System.Drawing.Color.White; - this.label5.Name = "label5"; - this.label5.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // labelVersion - // - resources.ApplyResources(this.labelVersion, "labelVersion"); - this.labelVersion.ForeColor = System.Drawing.Color.White; - this.labelVersion.Name = "labelVersion"; - this.labelVersion.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // ChangelogRichTextBox - // - this.ChangelogRichTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); - this.ChangelogRichTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - resources.ApplyResources(this.ChangelogRichTextBox, "ChangelogRichTextBox"); - this.ChangelogRichTextBox.ForeColor = System.Drawing.Color.White; - this.ChangelogRichTextBox.Name = "ChangelogRichTextBox"; - this.ChangelogRichTextBox.ReadOnly = true; - // // editorTab // this.editorTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(18)))), ((int)(((byte)(18)))), ((int)(((byte)(18))))); resources.ApplyResources(this.editorTab, "editorTab"); - this.editorTab.Controls.Add(this.pckFileLabel); - this.editorTab.Controls.Add(this.labelImageSize); - this.editorTab.Controls.Add(this.fileEntryCountLabel); - this.editorTab.Controls.Add(this.PropertiesTabControl); this.editorTab.Controls.Add(this.label11); - this.editorTab.Controls.Add(this.treeViewMain); - this.editorTab.Controls.Add(logoPictureBox); - this.editorTab.Controls.Add(this.previewPictureBox); this.editorTab.ForeColor = System.Drawing.Color.Transparent; this.editorTab.HorizontalScrollbarBarColor = true; this.editorTab.HorizontalScrollbarHighlightOnWheel = false; @@ -957,202 +497,16 @@ this.editorTab.VerticalScrollbarHighlightOnWheel = false; this.editorTab.VerticalScrollbarSize = 0; // - // pckFileLabel - // - resources.ApplyResources(this.pckFileLabel, "pckFileLabel"); - this.pckFileLabel.Name = "pckFileLabel"; - this.pckFileLabel.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // labelImageSize - // - resources.ApplyResources(this.labelImageSize, "labelImageSize"); - this.labelImageSize.Name = "labelImageSize"; - this.labelImageSize.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // fileEntryCountLabel - // - resources.ApplyResources(this.fileEntryCountLabel, "fileEntryCountLabel"); - this.fileEntryCountLabel.Name = "fileEntryCountLabel"; - this.fileEntryCountLabel.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // PropertiesTabControl - // - resources.ApplyResources(this.PropertiesTabControl, "PropertiesTabControl"); - this.PropertiesTabControl.Controls.Add(this.MetaTab); - this.PropertiesTabControl.Name = "PropertiesTabControl"; - this.PropertiesTabControl.SelectedIndex = 0; - this.PropertiesTabControl.Style = MetroFramework.MetroColorStyle.Silver; - this.PropertiesTabControl.Theme = MetroFramework.MetroThemeStyle.Dark; - this.PropertiesTabControl.UseSelectable = true; - // - // MetaTab - // - this.MetaTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); - this.MetaTab.Controls.Add(this.metroLabel2); - this.MetaTab.Controls.Add(this.treeMeta); - this.MetaTab.Controls.Add(this.entryTypeTextBox); - this.MetaTab.Controls.Add(this.entryDataTextBox); - this.MetaTab.Controls.Add(this.buttonEdit); - this.MetaTab.Controls.Add(this.metroLabel1); - this.MetaTab.HorizontalScrollbarBarColor = true; - this.MetaTab.HorizontalScrollbarHighlightOnWheel = false; - this.MetaTab.HorizontalScrollbarSize = 10; - resources.ApplyResources(this.MetaTab, "MetaTab"); - this.MetaTab.Name = "MetaTab"; - this.MetaTab.Theme = MetroFramework.MetroThemeStyle.Dark; - this.MetaTab.VerticalScrollbarBarColor = true; - this.MetaTab.VerticalScrollbarHighlightOnWheel = false; - this.MetaTab.VerticalScrollbarSize = 10; - // - // metroLabel2 - // - resources.ApplyResources(this.metroLabel2, "metroLabel2"); - this.metroLabel2.Name = "metroLabel2"; - this.metroLabel2.Theme = MetroFramework.MetroThemeStyle.Dark; - // - // treeMeta - // - this.treeMeta.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(13)))), ((int)(((byte)(13)))), ((int)(((byte)(13))))); - this.treeMeta.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.treeMeta.ContextMenuStrip = this.contextMenuMetaTree; - resources.ApplyResources(this.treeMeta, "treeMeta"); - this.treeMeta.ForeColor = System.Drawing.SystemColors.Window; - this.treeMeta.Name = "treeMeta"; - this.treeMeta.PathSeparator = "/"; - this.treeMeta.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeMeta_AfterSelect); - this.treeMeta.DoubleClick += new System.EventHandler(this.treeMeta_DoubleClick); - this.treeMeta.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeMeta_KeyDown); - // - // entryTypeTextBox - // - resources.ApplyResources(this.entryTypeTextBox, "entryTypeTextBox"); - // - // - // - this.entryTypeTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image"))); - this.entryTypeTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode"))); - this.entryTypeTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location"))); - this.entryTypeTextBox.CustomButton.Name = ""; - this.entryTypeTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size"))); - this.entryTypeTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; - this.entryTypeTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex"))); - this.entryTypeTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; - this.entryTypeTextBox.CustomButton.UseSelectable = true; - this.entryTypeTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible"))); - this.entryTypeTextBox.Lines = new string[0]; - this.entryTypeTextBox.MaxLength = 32767; - this.entryTypeTextBox.Name = "entryTypeTextBox"; - this.entryTypeTextBox.PasswordChar = '\0'; - this.entryTypeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; - this.entryTypeTextBox.SelectedText = ""; - this.entryTypeTextBox.SelectionLength = 0; - this.entryTypeTextBox.SelectionStart = 0; - this.entryTypeTextBox.ShortcutsEnabled = true; - this.entryTypeTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.entryTypeTextBox.UseSelectable = true; - this.entryTypeTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); - this.entryTypeTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); - // - // entryDataTextBox - // - resources.ApplyResources(this.entryDataTextBox, "entryDataTextBox"); - // - // - // - this.entryDataTextBox.CustomButton.Image = ((System.Drawing.Image)(resources.GetObject("resource.Image1"))); - this.entryDataTextBox.CustomButton.ImeMode = ((System.Windows.Forms.ImeMode)(resources.GetObject("resource.ImeMode1"))); - this.entryDataTextBox.CustomButton.Location = ((System.Drawing.Point)(resources.GetObject("resource.Location1"))); - this.entryDataTextBox.CustomButton.Name = ""; - this.entryDataTextBox.CustomButton.Size = ((System.Drawing.Size)(resources.GetObject("resource.Size1"))); - this.entryDataTextBox.CustomButton.Style = MetroFramework.MetroColorStyle.Blue; - this.entryDataTextBox.CustomButton.TabIndex = ((int)(resources.GetObject("resource.TabIndex1"))); - this.entryDataTextBox.CustomButton.Theme = MetroFramework.MetroThemeStyle.Light; - this.entryDataTextBox.CustomButton.UseSelectable = true; - this.entryDataTextBox.CustomButton.Visible = ((bool)(resources.GetObject("resource.Visible1"))); - this.entryDataTextBox.Lines = new string[0]; - this.entryDataTextBox.MaxLength = 32767; - this.entryDataTextBox.Name = "entryDataTextBox"; - this.entryDataTextBox.PasswordChar = '\0'; - this.entryDataTextBox.ScrollBars = System.Windows.Forms.ScrollBars.None; - this.entryDataTextBox.SelectedText = ""; - this.entryDataTextBox.SelectionLength = 0; - this.entryDataTextBox.SelectionStart = 0; - this.entryDataTextBox.ShortcutsEnabled = true; - this.entryDataTextBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.entryDataTextBox.UseSelectable = true; - this.entryDataTextBox.WaterMarkColor = System.Drawing.Color.FromArgb(((int)(((byte)(109)))), ((int)(((byte)(109)))), ((int)(((byte)(109))))); - this.entryDataTextBox.WaterMarkFont = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Pixel); - // - // buttonEdit - // - resources.ApplyResources(this.buttonEdit, "buttonEdit"); - this.buttonEdit.Name = "buttonEdit"; - this.buttonEdit.Theme = MetroFramework.MetroThemeStyle.Dark; - this.buttonEdit.UseSelectable = true; - this.buttonEdit.Click += new System.EventHandler(this.treeViewMain_DoubleClick); - // - // metroLabel1 - // - resources.ApplyResources(this.metroLabel1, "metroLabel1"); - this.metroLabel1.Name = "metroLabel1"; - this.metroLabel1.Theme = MetroFramework.MetroThemeStyle.Dark; - // // label11 // resources.ApplyResources(this.label11, "label11"); this.label11.Name = "label11"; // - // treeViewMain - // - this.treeViewMain.AllowDrop = true; - resources.ApplyResources(this.treeViewMain, "treeViewMain"); - this.treeViewMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(12)))), ((int)(((byte)(12))))); - this.treeViewMain.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.treeViewMain.ContextMenuStrip = this.contextMenuPCKEntries; - this.treeViewMain.ForeColor = System.Drawing.Color.White; - this.treeViewMain.ImageList = this.imageList; - this.treeViewMain.LabelEdit = true; - this.treeViewMain.Name = "treeViewMain"; - this.treeViewMain.PathSeparator = "/"; - this.treeViewMain.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeViewMain_BeforeLabelEdit); - this.treeViewMain.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeViewMain_ItemDrag); - this.treeViewMain.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewMain_AfterSelect); - this.treeViewMain.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragDrop); - this.treeViewMain.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragEnter); - this.treeViewMain.DragOver += new System.Windows.Forms.DragEventHandler(this.treeViewMain_DragOver); - this.treeViewMain.DoubleClick += new System.EventHandler(this.treeViewMain_DoubleClick); - this.treeViewMain.KeyDown += new System.Windows.Forms.KeyEventHandler(this.treeViewMain_KeyDown); - this.treeViewMain.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewMain_NodeMouseClick); - // - // imageList - // - this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit; - resources.ApplyResources(this.imageList, "imageList"); - this.imageList.TransparentColor = System.Drawing.Color.Transparent; - // - // previewPictureBox - // - resources.ApplyResources(this.previewPictureBox, "previewPictureBox"); - this.previewPictureBox.BackColor = System.Drawing.Color.Transparent; - this.previewPictureBox.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; - this.previewPictureBox.Name = "previewPictureBox"; - this.previewPictureBox.TabStop = false; - // - // LittleEndianCheckBox - // - resources.ApplyResources(this.LittleEndianCheckBox, "LittleEndianCheckBox"); - this.LittleEndianCheckBox.BackColor = System.Drawing.Color.Transparent; - this.LittleEndianCheckBox.Name = "LittleEndianCheckBox"; - this.LittleEndianCheckBox.Style = MetroFramework.MetroColorStyle.White; - this.LittleEndianCheckBox.Theme = MetroFramework.MetroThemeStyle.Dark; - this.LittleEndianCheckBox.UseSelectable = true; - // // MainForm // this.ApplyImageInvert = true; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.LittleEndianCheckBox); this.Controls.Add(this.menuStrip); this.Controls.Add(this.tabControl); this.DisplayHeader = false; @@ -1164,21 +518,14 @@ this.Theme = MetroFramework.MetroThemeStyle.Dark; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); - ((System.ComponentModel.ISupportInitialize)(logoPictureBox)).EndInit(); - this.contextMenuPCKEntries.ResumeLayout(false); this.menuStrip.ResumeLayout(false); this.menuStrip.PerformLayout(); - this.contextMenuMetaTree.ResumeLayout(false); this.tabControl.ResumeLayout(false); - this.openTab.ResumeLayout(false); - this.openTab.PerformLayout(); + this.StartPage.ResumeLayout(false); + this.StartPage.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pckOpen)).EndInit(); this.editorTab.ResumeLayout(false); this.editorTab.PerformLayout(); - this.PropertiesTabControl.ResumeLayout(false); - this.MetaTab.ResumeLayout(false); - this.MetaTab.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.previewPictureBox)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -1188,88 +535,31 @@ private System.Windows.Forms.MenuStrip menuStrip; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuPCKEntries; - private System.Windows.Forms.ToolStripMenuItem extractToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem renameFileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem replaceToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem deleteFileToolStripMenuItem; - private System.Windows.Forms.ContextMenuStrip contextMenuMetaTree; - private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem deleteEntryToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addMultipleEntriesToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem quickChangeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem importSkinsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem importSkinToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem importExtractedSkinsFolderToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem folderToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem skinToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem createAnimatedTextureToolStripMenuItem; - private MetroFramework.Controls.MetroTabControl tabControl; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private PckStudio.Controls.CustomTabControl tabControl; private MetroFramework.Controls.MetroTabPage editorTab; - private MetroFramework.Controls.MetroCheckBox LittleEndianCheckBox; private MetroFramework.Controls.MetroLabel label11; - private System.Windows.Forms.ToolStripMenuItem audiopckToolStripMenuItem; - private System.Windows.Forms.TreeView treeViewMain; - private MetroFramework.Controls.MetroTabControl PropertiesTabControl; - private System.Windows.Forms.TreeView treeMeta; - private MetroFramework.Controls.MetroLabel metroLabel1; - private MetroFramework.Controls.MetroLabel metroLabel2; - private MetroFramework.Controls.MetroTextBox entryDataTextBox; - private MetroFramework.Controls.MetroLabel fileEntryCountLabel; - private PckStudio.ToolboxItems.InterpolationPictureBox previewPictureBox; - private MetroFramework.Controls.MetroLabel labelImageSize; - private MetroFramework.Controls.MetroButton buttonEdit; private System.Windows.Forms.ToolStripMenuItem skinPackToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem texturePackToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem mashUpPackToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem; - private System.Windows.Forms.ImageList imageList; - private MetroFramework.Controls.MetroTextBox entryTypeTextBox; - private MetroFramework.Controls.MetroTabPage MetaTab; - private System.Windows.Forms.ToolStripMenuItem cloneFileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem setFileTypeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem skinToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem capeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem textureToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem languagesFileLOCToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem gameRulesFileGRFToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem audioPCKFileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem coloursCOLFileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem gameRulesHeaderGRHToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem skinsPCKToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem modelsFileBINToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem behavioursFileBINToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem entityMaterialsFileBINToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addTextureToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem as3DSTextureFileToolStripMenuItem; - private MetroFramework.Controls.MetroTabPage openTab; + private System.Windows.Forms.ToolStripMenuItem closeAllToolStripMenuItem; + private MetroFramework.Controls.MetroTabPage StartPage; private System.Windows.Forms.PictureBox pckOpen; private MetroFramework.Controls.MetroLabel label5; private MetroFramework.Controls.MetroLabel labelVersion; private System.Windows.Forms.RichTextBox ChangelogRichTextBox; - private System.Windows.Forms.ToolStripMenuItem colourscolToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem miscToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem CreateSkinsPCKToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem editAllEntriesToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addFileToolStripMenuItem; - private MetroFramework.Controls.MetroLabel pckFileLabel; - private System.Windows.Forms.ToolStripMenuItem behavioursbinToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem entityMaterialsbinToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem convertMusicFilesToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem wavBinkaToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem binkaWavToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openPckManagerToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem packSettingsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem fullBoxSupportToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem addBOXEntryToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem addANIMEntryToolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem videosToolStripMenuItem; @@ -1291,18 +581,6 @@ private System.Windows.Forms.ToolStripMenuItem trelloBoardToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem recentlyOpenToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; - private System.Windows.Forms.ToolStripMenuItem generateMipMapTextureToolStripMenuItem1; - private System.Windows.Forms.ToolStripMenuItem viewFileInfoToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem correctSkinDecimalsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem setSubPCKEndiannessToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem bigEndianXbox360PS3WiiUToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem littleEndianPS4PSVitaSwitchToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem setModelContainerFormatToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem version1ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem version2ToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem version3114ToolStripMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; } } diff --git a/PCK-Studio/MainForm.cs b/PCK-Studio/MainForm.cs index 687dd1d8..300609d0 100644 --- a/PCK-Studio/MainForm.cs +++ b/PCK-Studio/MainForm.cs @@ -1,74 +1,40 @@ using System; -using System.Collections.Generic; -using System.Drawing; using System.IO; using System.Linq; -using System.Windows.Forms; -using System.Drawing.Drawing2D; using System.Diagnostics; -using System.Drawing.Imaging; +using System.Windows.Forms; +using System.Collections.Generic; using System.Text.RegularExpressions; using OMI.Formats.Pck; -using OMI.Formats.Model; using OMI.Formats.GameRule; -using OMI.Formats.Material; -using OMI.Formats.Behaviour; using OMI.Formats.Languages; -using OMI.Workers; using OMI.Workers.Pck; using OMI.Workers.GameRule; using OMI.Workers.Language; -using OMI.Workers.Model; -using OMI.Workers.Behaviour; -using OMI.Workers.Material; using PckStudio.Properties; -using PckStudio.FileFormats; using PckStudio.Forms; -using PckStudio.Forms.Editor; -using PckStudio.Forms.Additional_Popups.Animation; using PckStudio.Forms.Additional_Popups; -using PckStudio.Internal.Misc; -using PckStudio.Internal.IO.PckAudio; -using PckStudio.Internal.IO._3DST; -using PckStudio.Internal; +using PckStudio.Core.Misc; using PckStudio.Forms.Features; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using PckStudio.Popups; using PckStudio.External.API.Miles; -using PckStudio.Internal.Json; -using PckStudio.Internal.Deserializer; -using PckStudio.Internal.Serializer; using PckStudio.Internal.App; +using PckStudio.Interfaces; +using PckStudio.Controls; +using PckStudio.Internal; +using PckStudio.Core; +using PckStudio.Core.App; namespace PckStudio { public partial class MainForm : MetroFramework.Forms.MetroForm { private PckManager PckManager = null; - string saveLocation; - PckFile currentPCK = null; + private Dictionary openTabPages = new Dictionary(); - bool __modified = false; - bool wasModified - { - get => __modified; - set - { - if (__modified == value) - return; - __modified = value; - pckFileLabel.Text = !pckFileLabel.Text.StartsWith("*") && __modified ? "*" + pckFileLabel.Text : pckFileLabel.Text.Substring(1); - } - } - - bool isTemplateFile = false; - - bool isSelectingTab = false; - - readonly Dictionary> pckFileTypeHandler; - - public MainForm() + public MainForm() { InitializeComponent(); @@ -79,133 +45,186 @@ namespace PckStudio ChangelogRichTextBox.Text = Resources.CHANGELOG; pckOpen.AllowDrop = true; - - treeViewMain.TreeViewNodeSorter = new PckNodeSorter(); - - skinToolStripMenuItem1.Click += (sender, e) => SetFileType(PckAssetType.SkinFile); - capeToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.CapeFile); - textureToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.TextureFile); - languagesFileLOCToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.LocalisationFile); - gameRulesFileGRFToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.GameRulesFile); - audioPCKFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.AudioFile); - coloursCOLFileToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.ColourTableFile); - gameRulesHeaderGRHToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.GameRulesHeader); - skinsPCKToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.SkinDataFile); - modelsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.ModelsFile); - behavioursFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.BehavioursFile); - entityMaterialsFileBINToolStripMenuItem.Click += (sender, e) => SetFileType(PckAssetType.MaterialFile); - - - pckFileTypeHandler = new Dictionary>(15) - { - [PckAssetType.SkinFile] = HandleSkinFile, - [PckAssetType.CapeFile] = null, - [PckAssetType.TextureFile] = HandleTextureFile, - [PckAssetType.UIDataFile] = _ => throw new NotSupportedException("unused in-game"), - [PckAssetType.InfoFile] = null, - [PckAssetType.TexturePackInfoFile] = null, // HandleInnerPckFile, - [PckAssetType.LocalisationFile] = HandleLocalisationFile, - [PckAssetType.GameRulesFile] = HandleGameRuleFile, - [PckAssetType.AudioFile] = HandleAudioFile, - [PckAssetType.ColourTableFile] = HandleColourFile, - [PckAssetType.GameRulesHeader] = HandleGameRuleFile, - [PckAssetType.SkinDataFile] = null, // HandleInnerPckFile, - [PckAssetType.ModelsFile] = null, //HandleModelsFile, // Note: Uncomment when implemented - [PckAssetType.BehavioursFile] = HandleBehavioursFile, - [PckAssetType.MaterialFile] = HandleMaterialFile, - }; } - // TODO: decide on how to handle embedded pck files - private void HandleInnerPckFile(PckAsset asset) + public void LoadPckFromFile(IEnumerable filepaths) { - if (Settings.Default.LoadSubPcks && - (asset.Type == PckAssetType.SkinDataFile || asset.Type == PckAssetType.TexturePackInfoFile) && - asset.Size > 0 && treeViewMain.SelectedNode.Nodes.Count == 0) - { - try - { - PckFile subPCKfile = asset.GetData(new PckFileReader(LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - BuildPckTreeView(treeViewMain.SelectedNode.Nodes, subPCKfile); - treeViewMain.SelectedNode.ExpandAll(); - } - catch (OverflowException ex) - { - MessageBox.Show(this, "Failed to open pck\n" + - "Try checking the 'Open/Save as Switch/Vita/PS4/Xbox One pck' checkbox in the upper right corner.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - Debug.WriteLine(ex.Message); - } - return; - } - treeViewMain.SelectedNode.Nodes.Clear(); - treeViewMain.SelectedNode.Collapse(); + foreach (string filepath in filepaths) + { + LoadPckFromFile(filepath); + } } - public void InitPckFromFile(string filepath) + public void LoadPckFromFile(string filepath) + { + AddEditorPage(filepath); + } + + internal void OpenNewPckTab(string caption, string identifier, PackInfo packInfo, ISaveContext saveContext) { - saveLocation = filepath; - } + if (openTabPages.ContainsKey(identifier)) + { + tabControl.SelectTab(openTabPages[identifier]); + return; + } + var editor = new PckEditor(packInfo, saveContext); + AddPage(caption, identifier, editor); + } - public void LoadPckFromFile(string filepath) + private void AddEditorPage(string caption, string identifier, PackInfo packInfo, ISaveContext saveContext = null) + { + saveContext ??= GetDefaultSaveContext("./new.pck", "PCK (Minecraft Console Package)"); + var editor = new PckEditor(packInfo, saveContext); + AddPage(caption, identifier, editor); + } + + private PckFile ReadPck(string filePath, OMI.ByteOrder byteOrder) + { + var pckReader = new PckFileReader(byteOrder); + return pckReader.FromFile(filePath); + } + + private bool TryOpenPck(string filepath, out PackInfo packInfo) + { + if (!File.Exists(filepath) || !filepath.EndsWith(".pck")) + { + packInfo = PackInfo.Empty; + return false; + } + try + { + OMI.ByteOrder byteOrder = OMI.ByteOrder.BigEndian; + PckFile pckFile = ReadPck(filepath, byteOrder); + packInfo = PackInfo.Create(pckFile, byteOrder, true); + return packInfo.IsValid; + } + catch (OverflowException) + { + try + { + // if failed, attempt again in the reverse. THEN throw an error if failed + OMI.ByteOrder byteOrder = OMI.ByteOrder.LittleEndian; + PckFile pckFile = ReadPck(filepath, byteOrder); + packInfo = PackInfo.Create(pckFile, byteOrder, true); + return packInfo.IsValid; + } + catch (OverflowException ex) + { + MessageBox.Show(this, "Failed to open pck", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + Debug.WriteLine(ex.Message); + } + } + catch + { + MessageBox.Show(this, "Failed to open pck. There's two common reasons for this:\n" + + "1. The file is audio/music cues PCK file. Please use the specialized editor while inside of a pck file.\n" + + "2. We're aware of an issue where a pck file might fail to load because it contains multiple entries with the same path.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + packInfo = PackInfo.Empty; + return false; + } + + private void AddEditorPage(string filepath) + { + if (!File.Exists(filepath) && !filepath.EndsWith(".pck")) + { + Trace.TraceError($"[{nameof(AddEditorPage)}] Invalid filepath({filepath})"); + return; + } + + if (openTabPages.ContainsKey(filepath)) + { + tabControl.SelectTab(openTabPages[filepath]); + return; + } + SaveToRecentFiles(filepath); + + if (TryOpenPck(filepath, out PackInfo packInfo)) + { + ISaveContext saveContext = GetDefaultSaveContext(filepath, "PCK (Minecraft Console Package)"); + var editor = new PckEditor(packInfo, saveContext); + TabPage page = AddPage(Path.GetFileName(filepath), filepath, editor); + return; + } + MessageBox.Show(string.Format("Failed to load {0}", Path.GetFileName(filepath)), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private static ISaveContext GetDefaultSaveContext(string filepath, string description) + { + return new DelegatedFileSaveContext(filepath, false, new FileDialogFilter(description, "*"+Path.GetExtension(filepath)),(packInfo, stream) => new PckFileWriter(packInfo.File, packInfo.Endianness).WriteToStream(stream)); + } + + private TabPage AddPage(string caption, string identifier, Control control) + { + identifier ??= caption; + if (openTabPages.ContainsKey(identifier)) + return openTabPages[identifier]; + control.Dock = DockStyle.Fill; + var page = new TabPage(caption); + page.Name = identifier; + page.Controls.Add(control); + tabControl.TabPages.Add(page); + tabControl.SelectTab(page); + return page; + } + + private bool TryGetEditor(TabPage page, out IEditor editor) + { + if (page.Controls[0] is IEditor outEditor) + { + editor = outEditor; + return true; + } + editor = default; + return false; + } + + private bool TryGetCurrentEditor(out IEditor editor) => TryGetEditor(tabControl.SelectedTab, out editor); + + private void MainForm_Load(object sender, EventArgs e) { - CheckSaveState(); - treeViewMain.Nodes.Clear(); - currentPCK = OpenPck(filepath); - if (currentPCK == null) - { - MessageBox.Show(this, string.Format("Failed to load {0}", Path.GetFileName(filepath)), "Error"); - return; - } - - CheckForPasswordAndRemove(); - LoadEditorTab(); - } - - private void MainForm_Load(object sender, EventArgs e) - { - SettingsManager.Default.RegisterPropertyChangedCallback(nameof(Settings.Default.UseLittleEndianAsDefault), state => - { - LittleEndianCheckBox.Checked = state; - }); - SettingsManager.Default.RegisterPropertyChangedCallback(nameof(Settings.Default.LoadSubPcks), () => - { - if (currentPCK is not null) - { - BuildMainTreeView(); - } - }); - - imageList.Images.Add(Resources.ZZFolder); // Icon for folders - imageList.Images.Add(Resources.BINKA_ICON); // Icon for music cue file (audio.pck) - imageList.Images.Add(Resources.IMAGE_ICON); // Icon for images (unused for now) - imageList.Images.Add(Resources.LOC_ICON); // Icon for string localization files (languages.loc;localisation.loc) - imageList.Images.Add(Resources.PCK_ICON); // Icon for generic PCK files (*.pck) - imageList.Images.Add(Resources.ZUnknown); // Icon for Unknown formats - imageList.Images.Add(Resources.COL_ICON); // Icon for color palette files (colours.col) - imageList.Images.Add(Resources.SKINS_ICON); // Icon for Skin.pck archives (skins.pck) - imageList.Images.Add(Resources.MODELS_ICON); // Icon for Model files (models.bin) - imageList.Images.Add(Resources.GRF_ICON); // Icon for Game Rule files (*.grf) - imageList.Images.Add(Resources.GRH_ICON); // Icon for Game Rule Header files (*.grh) - imageList.Images.Add(Resources.INFO_ICON); // Icon for Info files (0) - imageList.Images.Add(Resources.SKIN_ICON); // Icon for Skin files (*.png) - imageList.Images.Add(Resources.CAPE_ICON); // Icon for Cape files (*.png) - imageList.Images.Add(Resources.TEXTURE_ICON); // Icon for Texture files (*.png;*.tga) - imageList.Images.Add(Resources.BEHAVIOURS_ICON); // Icon for Behaviour files (behaviours.bin) - imageList.Images.Add(Resources.ENTITY_MATERIALS_ICON); // Icon for Entity Material files (entityMaterials.bin) - LoadRecentFileList(); - - isSelectingTab = true; - tabControl.SelectTab(0); - isSelectingTab = false; - - UpdateRichPresence(); - - if (!string.IsNullOrWhiteSpace(saveLocation)) - LoadPckFromFile(saveLocation); } + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + PckManager?.Close(); + closeAllToolStripMenuItem_Click(sender, e); + } + + private void closeAllToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (TabPage tab in tabControl.TabPages) + { + CloseTab(tabControl.TabPages, tab); + } + closeAllToolStripMenuItem.Visible = false; + } + + private void CloseTab(TabControl.TabPageCollection collection, TabPage page) + { + if (TryGetEditor(page, out IEditor editor)) + { + editor.Close(); + RemoveOpenFile(page); + collection.Remove(page); + } + } + + private void RemoveOpenFile() + { + RemoveOpenFile(tabControl.SelectedTab); + } + + private void RemoveOpenFile(TabPage page) + { + if (openTabPages.ContainsKey(page.Name)) + { + openTabPages.Remove(page.Name); + } + } + private void LoadRecentFileList() { Settings.Default.RecentFiles ??= new System.Collections.Specialized.StringCollection(); @@ -226,7 +245,7 @@ namespace PckStudio { Settings.Default.RecentFiles.Clear(); LoadRecentFileList(); - } + } recentlyOpenToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator()); recentlyOpenToolStripMenuItem.DropDownItems.Add("Clear", null, clearRecentFileList); } @@ -261,12 +280,6 @@ namespace PckStudio LoadRecentFileList(); } - private void MainForm_FormClosing(object sender, FormClosingEventArgs e) - { - PckManager?.Close(); - CheckSaveState(); - } - private void openPckManagerToolStripMenuItem_Click(object sender, EventArgs e) { PckManager ??= new PckManager(); @@ -291,1202 +304,29 @@ namespace PckStudio } } - private PckFile ReadPck(string filePath, bool isLittleEndian) - { - var pckReader = new PckFileReader(isLittleEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - return pckReader.FromFile(filePath); - } - - private PckFile OpenPck(string filePath) - { - isTemplateFile = false; - saveLocation = filePath; - SaveToRecentFiles(filePath); - PckFile pck; - try - { - pck = ReadPck(filePath, LittleEndianCheckBox.Checked); - return pck; - } - catch (OverflowException c) - { - try - { - // if failed, attempt again in the reverse. THEN throw an error if failed - pck = ReadPck(filePath, !LittleEndianCheckBox.Checked); - LittleEndianCheckBox.Checked = !LittleEndianCheckBox.Checked; - return pck; - } - catch (OverflowException ex) - { - MessageBox.Show(this, "Failed to open pck\n" + - $"Try {(LittleEndianCheckBox.Checked ? "unchecking" : "checking")} the 'Open/Save as Switch/Vita/PS4/Xbox One pck' check box in the upper right corner.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - Debug.WriteLine(ex.Message); - } - } - catch - { - MessageBox.Show(this, "Failed to open pck. There's two common reasons for this:\n" + - "1. The file is audio/music cues PCK file. Please use the specialized editor while inside of a pck file.\n" + - "2. We're aware of an issue where a pck file might fail to load because it contains multiple entries with the same path.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - return null; - } - - private void CheckForPasswordAndRemove() - { - if (currentPCK.TryGetAsset("0", PckAssetType.InfoFile, out PckAsset asset)) - { - asset.RemoveProperties("LOCK"); - } - } - - private void LoadEditorTab() - { - fileEntryCountLabel.Text = "Files:" + currentPCK.AssetCount; - if (isTemplateFile) - pckFileLabel.Text = "Unsaved File!"; - else - pckFileLabel.Text = Path.GetFileName(saveLocation); - treeViewMain.Enabled = treeMeta.Enabled = true; - closeToolStripMenuItem.Visible = true; - fullBoxSupportToolStripMenuItem.Checked = currentPCK.HasVerionString; - packSettingsToolStripMenuItem.Visible = true; - - saveToolStripMenuItem.Enabled = true; - saveToolStripMenuItem1.Enabled = true; - quickChangeToolStripMenuItem.Enabled = true; - BuildMainTreeView(); - isSelectingTab = true; - tabControl.SelectTab(1); - isSelectingTab = false; - UpdateRichPresence(); - } - - private void CloseEditorTab() - { - isSelectingTab = true; - tabControl.SelectTab(0); - isSelectingTab = false; - currentPCK = null; - wasModified = false; - isTemplateFile = false; - saveLocation = string.Empty; - previewPictureBox.Image = Resources.NoImageFound; - treeViewMain.Nodes.Clear(); - treeMeta.Nodes.Clear(); - treeViewMain.Enabled = false; - treeMeta.Enabled = false; - saveToolStripMenuItem.Enabled = false; - saveToolStripMenuItem1.Enabled = false; - quickChangeToolStripMenuItem.Enabled = false; - closeToolStripMenuItem.Visible = false; - packSettingsToolStripMenuItem.Visible = false; - fileEntryCountLabel.Text = string.Empty; - pckFileLabel.Text = string.Empty; - UpdateRichPresence(); - } - - private void UpdateRichPresence() - { - if (currentPCK is not null && - TryGetLocFile(out LOCFile locfile) && - locfile.HasLocEntry("IDS_DISPLAY_NAME") && - locfile.Languages.Contains("en-EN")) - { - RPC.SetPresence($"Editing a Pack: {locfile.GetLocEntry("IDS_DISPLAY_NAME", "en-EN")}"); - return; - } - // default - RPC.SetPresence("An Open Source .PCK File Editor"); - } - - /// - /// wrapper that allows the use of in TreeNode.Nodes.Find(, ...) and TreeNode.Nodes.ContainsKey() - /// - /// - /// - /// new Created TreeNode - public static TreeNode CreateNode(string name, object tag = null) - { - TreeNode node = new TreeNode(name); - node.Name = name; - node.Tag = tag; - return node; - } - - private TreeNode BuildNodeTreeBySeperator(TreeNodeCollection root, string path, char seperator) - { - _ = root ?? throw new ArgumentNullException(nameof(root)); - if (!path.Contains(seperator)) - { - TreeNode finalNode = CreateNode(path); - root.Add(finalNode); - return finalNode; - } - string nodeText = path.Substring(0, path.IndexOf(seperator)); - string subPath = path.Substring(path.IndexOf(seperator) + 1); - - if (string.IsNullOrWhiteSpace(nodeText)) - { - return BuildNodeTreeBySeperator(root, subPath, seperator); - } - - bool alreadyExists = root.ContainsKey(nodeText); - TreeNode subNode = alreadyExists ? root[nodeText] : CreateNode(nodeText); - if (!alreadyExists) - root.Add(subNode); - return BuildNodeTreeBySeperator(subNode.Nodes, subPath, seperator); - } - - private void BuildPckTreeView(TreeNodeCollection root, PckFile pckFile) - { - foreach (PckAsset asset in pckFile.GetAssets()) - { - // fix any file paths that may be incorrect - //if (file.Filename.StartsWith(parentPath)) - // file.Filename = file.Filename.Remove(0, parentPath.Length); - TreeNode node = BuildNodeTreeBySeperator(root, asset.Filename, '/'); - node.Tag = asset; - SetNodeIcon(node, asset.Type); - } - } - - private void BuildMainTreeView() - { - // In case the Rename function was just used and the selected node name no longer matches the file name - string selectedNodeText = treeViewMain.SelectedNode is TreeNode node ? node.FullPath : string.Empty; - previewPictureBox.Image = Resources.NoImageFound; - treeMeta.Nodes.Clear(); - treeViewMain.Nodes.Clear(); - BuildPckTreeView(treeViewMain.Nodes, currentPCK); - - //if (isTemplateFile && currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) - //{ - // TreeNode skinsNode = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); - // TreeNode folderNode = CreateNode("Skins"); - // folderNode.ImageIndex = 0; - // folderNode.SelectedImageIndex = 0; - // if (!skinsNode.Nodes.ContainsKey("Skins")) - // skinsNode.Nodes.Add(folderNode); - //} - treeViewMain.Sort(); - - TreeNode[] selectedNodes = treeViewMain.FindPath(selectedNodeText); - if (selectedNodes.Length > 0) - { - treeViewMain.SelectedNode = selectedNodes[0]; - } - } - - private void HandleTextureFile(PckAsset asset) - { - _ = asset.IsMipmappedFile() && currentPCK.TryGetValue(asset.GetNormalPath(), PckAssetType.TextureFile, out asset); - - if (asset.Size <= 0) - { - Debug.WriteLine($"'{asset.Filename}' size is 0.", category: nameof(HandleTextureFile)); - return; - } - - ResourceLocation resourceLocation = ResourceLocation.GetFromPath(asset.Filename); - Debug.WriteLine("Handling Resource file: " + resourceLocation?.ToString()); - - switch (resourceLocation.Category) - { - case ResourceCategory.Unknown: - Debug.WriteLine($"Unknown Resource Category."); - break; - case ResourceCategory.ItemAnimation: - case ResourceCategory.BlockAnimation: - Animation animation = asset.GetDeserializedData(AnimationDeserializer.DefaultDeserializer); - string internalName = Path.GetFileNameWithoutExtension(asset.Filename); - IList textureInfos = resourceLocation.Category == ResourceCategory.ItemAnimation ? Tiles.ItemTileInfos : Tiles.BlockTileInfos; - string displayname = textureInfos.FirstOrDefault(p => p.InternalName == internalName)?.DisplayName ?? internalName; - - string[] specialTileNames = { "clock", "compass" }; - using (AnimationEditor animationEditor = new AnimationEditor(animation, displayname, internalName.ToLower().EqualsAny(specialTileNames))) - { - if (animationEditor.ShowDialog(this) == DialogResult.OK) - { - wasModified = true; - asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); - BuildMainTreeView(); - } - } - break; - case ResourceCategory.ItemAtlas: - case ResourceCategory.BlockAtlas: - case ResourceCategory.ParticleAtlas: - case ResourceCategory.BannerAtlas: - case ResourceCategory.PaintingAtlas: - case ResourceCategory.ExplosionAtlas: - case ResourceCategory.ExperienceOrbAtlas: - case ResourceCategory.MoonPhaseAtlas: - case ResourceCategory.MapIconAtlas: - case ResourceCategory.AdditionalMapIconsAtlas: - Image img = asset.GetTexture(); - var viewer = new TextureAtlasEditor(currentPCK, resourceLocation, img); - if (viewer.ShowDialog(this) == DialogResult.OK) - { - Image texture = viewer.FinalTexture; - asset.SetTexture(texture); - wasModified = true; - BuildMainTreeView(); - } - break; - default: - Debug.WriteLine($"Unhandled Resource Category: {resourceLocation.Category}"); - break; - } - } - - private void HandleGameRuleFile(PckAsset asset) - { - const string use_deflate = "PS3"; - const string use_xmem = "Xbox 360"; - const string use_zlib = "Other Platforms"; - - ItemSelectionPopUp dialog = new ItemSelectionPopUp(use_zlib, use_deflate, use_xmem); - dialog.LabelText = "Type"; - dialog.ButtonText = "Ok"; - if (dialog.ShowDialog() != DialogResult.OK) - return; - - GameRuleFile.CompressionType compressiontype = dialog.SelectedItem switch - { - use_deflate => GameRuleFile.CompressionType.Deflate, - use_xmem => GameRuleFile.CompressionType.XMem, - use_zlib => GameRuleFile.CompressionType.Zlib, - _ => GameRuleFile.CompressionType.Unknown - }; - - GameRuleFile grf = asset.GetData(new GameRuleFileReader(compressiontype)); - - using GameRuleFileEditor grfEditor = new GameRuleFileEditor(grf); - if (grfEditor.ShowDialog(this) == DialogResult.OK) - { - asset.SetData(new GameRuleFileWriter(grfEditor.Result)); - wasModified = true; - UpdateRichPresence(); - } - } - - private void HandleAudioFile(PckAsset asset) - { - try - { - using AudioEditor audioEditor = new AudioEditor(asset, LittleEndianCheckBox.Checked); - wasModified = audioEditor.ShowDialog(this) == DialogResult.OK; - } - catch (OverflowException) - { - MessageBox.Show(this, $"Failed to open {asset.Filename}\n" + - "Try converting the file by using the \"Misc. Functions/Set PCK Endianness\" tool and try again.", - "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - catch (Exception ex) - { - MessageBox.Show($"Failed to open {asset.Filename}\n" + ex.Message, - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } - - private void HandleLocalisationFile(PckAsset asset) - { - using LOCEditor locedit = new LOCEditor(asset); - wasModified = locedit.ShowDialog(this) == DialogResult.OK; - UpdateRichPresence(); - } - - private void HandleColourFile(PckAsset asset) - { - using COLEditor diag = new COLEditor(asset); - wasModified = diag.ShowDialog(this) == DialogResult.OK; - } - - public void HandleSkinFile(PckAsset asset) - { - if (asset.HasProperty("BOX")) - { - using generateModel generate = new generateModel(asset); - if (generate.ShowDialog(this) == DialogResult.OK) - { - entryDataTextBox.Text = entryTypeTextBox.Text = string.Empty; - wasModified = true; - ReloadMetaTreeView(); - } - return; - } - - Image img = asset.GetTexture(); - using var skinViewer = new SkinPreview(img, asset.GetProperty("ANIM", SkinANIM.FromString)); - skinViewer.ShowDialog(this); - } - - public void HandleModelsFile(PckAsset asset) - { - MessageBox.Show(this, "Models.bin support has not been implemented. You can use the Spark Editor for the time being to edit these files.", "Not implemented yet."); - } - - public void HandleBehavioursFile(PckAsset asset) - { - using BehaviourEditor edit = new BehaviourEditor(asset); - wasModified = edit.ShowDialog(this) == DialogResult.OK; - } - - public void HandleMaterialFile(PckAsset asset) - { - using MaterialsEditor edit = new MaterialsEditor(asset); - wasModified = edit.ShowDialog(this) == DialogResult.OK; - } - - private void treeViewMain_AfterSelect(object sender, TreeViewEventArgs e) - { - ReloadMetaTreeView(); - - entryTypeTextBox.Text = entryDataTextBox.Text = labelImageSize.Text = string.Empty; - buttonEdit.Visible = false; - - previewPictureBox.Image = Resources.NoImageFound; - viewFileInfoToolStripMenuItem.Visible = false; - - if (e.Node.TryGetTagData(out PckAsset asset)) - { - viewFileInfoToolStripMenuItem.Visible = true; - if (asset.HasProperty("BOX")) - { - buttonEdit.Text = "EDIT BOXES"; - buttonEdit.Visible = true; - } - else if (asset.HasProperty("ANIM") && - asset.GetProperty("ANIM", s => SkinANIM.FromString(s) == (SkinAnimMask.RESOLUTION_64x64 | SkinAnimMask.SLIM_MODEL))) - { - buttonEdit.Text = "View Skin"; - buttonEdit.Visible = true; - } - - switch (asset.Type) - { - case PckAssetType.SkinFile: - case PckAssetType.CapeFile: - case PckAssetType.TextureFile: - { - Image img = asset.GetTexture(); - - if (img.RawFormat != ImageFormat.Jpeg || img.RawFormat != ImageFormat.Png) - { - img = new Bitmap(img); - } - - try - { - previewPictureBox.Image = img; - labelImageSize.Text = $"{previewPictureBox.Image.Size.Width}x{previewPictureBox.Image.Size.Height}"; - } - catch (Exception ex) - { - labelImageSize.Text = ""; - previewPictureBox.Image = Resources.NoImageFound; - Debug.WriteLine("Not a supported image format. Setting back to default"); - Debug.WriteLine(string.Format("An error occured of type: {0} with message: {1}", ex.GetType(), ex.Message), "Exception"); - } - - if (asset.Type != PckAssetType.TextureFile) - break; - - ResourceLocation resourceLocation = ResourceLocation.GetFromPath(asset.Filename); - if (resourceLocation is null || resourceLocation.Category == ResourceCategory.Unknown) - break; - - if (resourceLocation.Category == ResourceCategory.ItemAnimation || - resourceLocation.Category == ResourceCategory.BlockAnimation && - !asset.IsMipmappedFile()) - { - buttonEdit.Text = "EDIT TILE ANIMATION"; - buttonEdit.Visible = true; - break; - } - - buttonEdit.Text = "EDIT TEXTURE ATLAS"; - buttonEdit.Visible = true; - } - break; - - case PckAssetType.LocalisationFile: - buttonEdit.Text = "EDIT LOC"; - buttonEdit.Visible = true; - break; - - case PckAssetType.AudioFile: - buttonEdit.Text = "EDIT MUSIC CUES"; - buttonEdit.Visible = true; - break; - - case PckAssetType.ColourTableFile when asset.Filename == "colours.col": - buttonEdit.Text = "EDIT COLORS"; - buttonEdit.Visible = true; - break; - - case PckAssetType.BehavioursFile when asset.Filename == "behaviours.bin": - buttonEdit.Text = "EDIT BEHAVIOURS"; - buttonEdit.Visible = true; - break; - default: - buttonEdit.Visible = false; - break; - } - } - } - - private void extractFile(string outFilePath, PckAsset asset) + private void tabControl_PageClosing(object sender, PageClosingEventArgs e) { - File.WriteAllBytes(outFilePath, asset.Data); - if (asset.PropertyCount > 0) - { - File.WriteAllLines($"{outFilePath}.txt", asset.SerializeProperties()); - } - } + if (TryGetEditor(e.Page, out IEditor editor)) + { + editor.Close(); + RemoveOpenFile(); + } + } - private void extractFolderFile(string outPath, PckAsset asset) + private void tabControl_SelectedIndexChanged(object sender, EventArgs e) { - TreeNode node = treeViewMain.SelectedNode; + closeToolStripMenuItem.Visible = tabControl.SelectedIndex > 0; + closeAllToolStripMenuItem.Visible = tabControl.SelectedIndex == 0 && tabControl.TabCount > 1; + saveToolStripMenuItem.Visible = tabControl.SelectedIndex > 0; + saveAsToolStripMenuItem.Visible = tabControl.SelectedIndex > 0; - // abb = "Abbreviated Path" - string abbPath = Path.GetDirectoryName(asset.Filename); - int startIndex = abbPath.IndexOf(node.Text); - abbPath = abbPath.Substring(startIndex, abbPath.Length - startIndex); - string finalPath = ($"{outPath}/{abbPath}/").Replace('\\', '/'); - - if (!Directory.Exists(finalPath)) - Directory.CreateDirectory(finalPath); - - extractFile(finalPath + "/" + Path.GetFileName(asset.Filename), asset); - } - - private void extractFolder(string outPath) - { - TreeNode node = treeViewMain.SelectedNode; - - string selectedFolder = node.FullPath; - - foreach (PckAsset asset in currentPCK.GetAssets().Where(asset => asset.Filename.StartsWith(selectedFolder))) + if (tabControl.SelectedIndex == 0) { - extractFolderFile(outPath, asset); - } - } - - private void extractToolStripMenuItem_Click(object sender, EventArgs e) - { - TreeNode node = treeViewMain.SelectedNode; - - if (node == null) - { - MessageBox.Show(this, "The selected node was null. Please select a node and try again.", "Node not extracted"); - - return; - } - - if (node.Tag == null) - { - OpenFolderDialog dialog = new OpenFolderDialog(); - dialog.Title = @"Select destination folder"; - - if (dialog.ShowDialog(Handle) == true) - extractFolder(dialog.ResultPath); - } - else if (node.TryGetTagData(out PckAsset asset)) - { - using SaveFileDialog exFile = new SaveFileDialog(); - exFile.FileName = Path.GetFileName(asset.Filename); - exFile.Filter = Path.GetExtension(asset.Filename).Replace(".", string.Empty) + " File|*" + Path.GetExtension(asset.Filename); - if (exFile.ShowDialog(this) != DialogResult.OK || - // Makes sure chosen directory isn't null or whitespace AKA makes sure its usable - string.IsNullOrWhiteSpace(Path.GetDirectoryName(exFile.FileName))) - { - MessageBox.Show(this, "The chosen directory is invalid. Please choose a different one and try again.", "Node not extracted"); - - return; - } - - extractFile(exFile.FileName, asset); - } - - // Verification that file extraction path was successful - MessageBox.Show(this, $"\"{node.Text}\" successfully extracted"); - } - - private void SaveTemplate() - { - using SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "PCK (Minecraft Console Package)|*.pck"; - saveFileDialog.DefaultExt = ".pck"; - if (saveFileDialog.ShowDialog(this) == DialogResult.OK) - { - Save(saveFileDialog.FileName); - saveLocation = saveFileDialog.FileName; - SaveToRecentFiles(saveFileDialog.FileName); - pckFileLabel.Text = Path.GetFileName(saveLocation); - isTemplateFile = false; - } - } - - private void Save(string filePath) - { - var writer = new PckFileWriter(currentPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - writer.WriteToFile(filePath); - wasModified = false; - MessageBox.Show(this, "Saved Pck file", "File Saved"); - } - - private void replaceToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.Tag is PckAsset asset) - { - using var ofd = new OpenFileDialog(); - // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? So now it's formatted correctly and now displays the file type name in the dialog. - - string extra_extensions = ""; - - switch (asset.Type) - { - case PckAssetType.TextureFile: - if (Path.GetExtension(asset.Filename) == ".png") - extra_extensions = ";*.tga"; - else if (Path.GetExtension(asset.Filename) == ".tga") - extra_extensions = ";*.png"; - break; - } - - string fileExt = Path.GetExtension(asset.Filename); - - ofd.Filter = $"{asset.Type} (*{fileExt}{extra_extensions})|*{fileExt}{extra_extensions}"; - if (ofd.ShowDialog(this) == DialogResult.OK) - { - string newFileExt = Path.GetExtension(ofd.FileName); - asset.SetData(File.ReadAllBytes(ofd.FileName)); - asset.Filename = asset.Filename.Replace(fileExt, newFileExt); - wasModified = true; - BuildMainTreeView(); - } - return; - } - MessageBox.Show(this, "Can't replace a folder."); - } - - /// - /// Action to run before an asset will be deleted - /// - /// Asset to remove - /// True if the remove should be canceled, otherwise False - private bool BeforeFileRemove(PckAsset asset) - { - string itemPath = ResourceLocation.GetPathFromCategory(ResourceCategory.ItemAnimation); - - // warn the user about deleting compass.png and clock.png - if (asset.Type == PckAssetType.TextureFile && - (asset.Filename == itemPath + "/compass.png" || asset.Filename == itemPath + "/clock.png")) - { - if (MessageBox.Show(this, "Are you sure want to delete this file? If \"compass.png\" or \"clock.png\" are missing, your game will crash upon loading this pack.", "Warning", - MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) - return true; - } - - // remove loc key if its a skin/cape - if (asset.Type == PckAssetType.SkinFile || asset.Type == PckAssetType.CapeFile) - { - if (TryGetLocFile(out LOCFile locFile)) - { - if (asset.TryGetProperty("THEMENAMEID", out string value)) - locFile.RemoveLocKey(value); - if (asset.TryGetProperty("DISPLAYNAMEID", out value)) - locFile.RemoveLocKey(value); - TrySetLocFile(locFile); - } - } - return false; - } - - private void deleteFileToolStripMenuItem_Click(object sender, EventArgs e) - { - TreeNode node = treeViewMain.SelectedNode; - if (node == null) - return; - - string path = node.FullPath; - - if (node.TryGetTagData(out PckAsset asset)) - { - if (!BeforeFileRemove(asset) && currentPCK.RemoveAsset(asset)) - { - node.Remove(); - wasModified = true; - } - } - else if (MessageBox.Show(this, "Are you sure want to delete this folder? All contents will be deleted", "Warning", - MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) - { - string pckFolderDir = node.FullPath; - currentPCK.RemoveAll(file => file.Filename.StartsWith(pckFolderDir) && !BeforeFileRemove(file)); - node.Remove(); - wasModified = true; - } - } - - private void renameFileToolStripMenuItem_Click(object sender, EventArgs e) - { - TreeNode node = treeViewMain.SelectedNode; - if (node == null) - return; - string path = node.FullPath; - - bool isFile = node.TryGetTagData(out PckAsset asset); - - using TextPrompt diag = new TextPrompt(isFile ? asset.Filename : Path.GetFileName(node.FullPath)); - - if (diag.ShowDialog(this) == DialogResult.OK) - { - if (isFile) - { - if (currentPCK.Contains(diag.NewText, asset.Type)) - { - MessageBox.Show(this, $"{diag.NewText} already exists", "File already exists"); - return; - } - asset.Filename = diag.NewText; - } - else // folders - { - node.Text = diag.NewText; - foreach (TreeNode childNode in GetAllChildNodes(node.Nodes)) - { - if (childNode.Tag is PckAsset folderAsset) - { - if (folderAsset.Filename == diag.NewText) - continue; - folderAsset.Filename = childNode.FullPath; - } - } - } - wasModified = true; - BuildMainTreeView(); - } - } - - private void createSkinToolStripMenuItem_Click(object sender, EventArgs e) - { - LOCFile locFile = null; - TryGetLocFile(out locFile); - using AddSkinPrompt add = new AddSkinPrompt(locFile); - if (add.ShowDialog(this) == DialogResult.OK) - { - //if (currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck - //{ - // TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); - // if (subPCK.Nodes.ContainsKey("Skins")) add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); - // add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins.pck/"); - // TreeNode newNode = new TreeNode(Path.GetFileName(add.SkinAsset.Filename)); - // newNode.Tag = add.SkinAsset; - // SetNodeIcon(newNode, PckAssetType.SkinFile); - // subPCK.Nodes.Add(newNode); - // RebuildSubPCK(newNode.FullPath); - //} - //else - { - if (treeViewMain.Nodes.ContainsKey("Skins")) - add.SkinAsset.Filename = add.SkinAsset.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddAsset(add.SkinAsset); - } - if (add.HasCape) - { - //if (currentPCK.HasAsset("Skins.pck", PckAssetType.SkinDataFile)) // Prioritize Skins.pck - //{ - // TreeNode subPCK = treeViewMain.Nodes.Find("Skins.pck", false).FirstOrDefault(); - // if (subPCK.Nodes.ContainsKey("Skins")) add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); - // add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins.pck/"); - // TreeNode newNode = new TreeNode(Path.GetFileName(add.CapeAsset.Filename)); - // newNode.Tag = add.CapeAsset; - // SetNodeIcon(newNode, PckAssetType.SkinFile); - // subPCK.Nodes.Add(newNode); - // RebuildSubPCK(newNode.FullPath); - //} - //else - { - if (treeViewMain.Nodes.ContainsKey("Skins")) - add.CapeAsset.Filename = add.CapeAsset.Filename.Insert(0, "Skins/"); // Then Skins folder - currentPCK.AddAsset(add.CapeAsset); - } - } - - TrySetLocFile(locFile); - wasModified = true; - BuildMainTreeView(); - } - } - - private static PckAsset CreateNewAudioFile(bool isLittle) - { - PckAudioFile audioPck = new PckAudioFile(); - audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Overworld); - audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.Nether); - audioPck.AddCategory(PckAudioFile.AudioCategory.EAudioType.End); - PckAsset newAsset = new PckAsset("audio.pck", PckAssetType.AudioFile); - newAsset.SetData(new PckAudioFileWriter(audioPck, isLittle ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - return newAsset; - } - - private void audiopckToolStripMenuItem_Click(object sender, EventArgs e) - { - if (currentPCK.Contains(PckAssetType.AudioFile)) - { - // the chance of this happening is really really slim but just in case - MessageBox.Show(this, "There is already an audio file in this PCK!", "Can't create audio.pck"); - return; - } - if (string.IsNullOrEmpty(saveLocation)) - { - MessageBox.Show(this, "You must save your pck before creating or opening a music cues PCK file", "Can't create audio.pck"); - return; - } - - PckAsset asset = CreateNewAudioFile(LittleEndianCheckBox.Checked); - AudioEditor diag = new AudioEditor(asset, LittleEndianCheckBox.Checked); - if (diag.ShowDialog(this) == DialogResult.OK) - { - currentPCK.AddAsset(asset); - } - diag.Dispose(); - BuildMainTreeView(); - } - - private void createAnimatedTextureToolStripMenuItem_Click(object sender, EventArgs e) - { - using ChangeTile diag = new ChangeTile(); - if (diag.ShowDialog(this) != DialogResult.OK) - return; - - string animationFilepath = $"{ResourceLocation.GetPathFromCategory(diag.Category)}/{diag.SelectedTile.InternalName}.png"; - - if (currentPCK.Contains(animationFilepath, PckAssetType.TextureFile)) - { - MessageBox.Show(this, $"{diag.SelectedTile.DisplayName} is already present.", "File already present"); - return; - } - - using AnimationEditor animationEditor = new AnimationEditor(Animation.CreateEmpty(), diag.SelectedTile.DisplayName, diag.SelectedTile.InternalName.EqualsAny("clock", "compass")); - if (animationEditor.ShowDialog() == DialogResult.OK) - { - wasModified = true; - PckAsset asset = currentPCK.CreateNewAsset(animationFilepath, PckAssetType.TextureFile); - asset.SetSerializedData(animationEditor.Result, AnimationSerializer.DefaultSerializer); - BuildMainTreeView(); - ReloadMetaTreeView(); - } - } - - private void treeViewMain_DoubleClick(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - if (asset.Size <= 0) - { - Trace.WriteLine($"'{asset.Filename}' has no data attached.", category: nameof(treeViewMain_DoubleClick)); - return; - } - pckFileTypeHandler[asset.Type]?.Invoke(asset); - } - } - - private void treeMeta_AfterSelect(object sender, TreeViewEventArgs e) - { - if (e.Node is TreeNode t && t.Tag is KeyValuePair property) - { - entryTypeTextBox.Text = property.Key; - entryDataTextBox.Text = property.Value; - } - } - - private void treeMeta_DoubleClick(object sender, EventArgs e) - { - if (treeMeta.SelectedNode is TreeNode subnode && subnode.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode node && node.Tag is PckAsset asset) - { - if (asset.HasProperty(property.Key)) - { - switch (property.Key) - { - case "ANIM" when asset.Type == PckAssetType.SkinFile: - try - { - using ANIMEditor diag = new ANIMEditor(SkinANIM.FromString(property.Value)); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("ANIM", diag.ResultAnim.ToString())); - ReloadMetaTreeView(); - wasModified = true; - } - return; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Trace.WriteLine("Invalid ANIM value: " + property.Value); - MessageBox.Show(this, "Failed to parse ANIM value, aborting to normal functionality. Please make sure the value only includes hexadecimal characters (0-9,A-F) and has no more than 8 characters."); - } - break; - - case "BOX" when asset.Type == PckAssetType.SkinFile: - try - { - using BoxEditor diag = new BoxEditor(property.Value, false); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), new KeyValuePair("BOX", diag.Result.ToString())); - ReloadMetaTreeView(); - wasModified = true; - } - return; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - Trace.WriteLine("Invalid BOX value: " + property.Value); - MessageBox.Show(this, "Failed to parse BOX value, aborting to normal functionality."); - } - break; - - default: - break; - - } - - using (AddPropertyPrompt addProperty = new AddPropertyPrompt(property)) - { - if (addProperty.ShowDialog(this) == DialogResult.OK) - { - asset.SetProperty(asset.GetPropertyIndex(property), addProperty.Property); - ReloadMetaTreeView(); - wasModified = true; - } - } - } - } - } - - private void cloneFileToolStripMenuItem_Click(object sender, EventArgs e) - { - TreeNode node = treeViewMain.SelectedNode; - if (node == null || !node.IsTagOfType()) - return; - string path = node.FullPath; - - using TextPrompt diag = new TextPrompt(node.Tag is null ? Path.GetFileName(node.FullPath) : node.FullPath); - diag.contextLabel.Text = $"Creating a clone of \"{path}\". Ensure that the path isn't yet."; - diag.OKButtonText = "Clone"; - - if (diag.ShowDialog(this) == DialogResult.OK) - { - if (node.Tag is PckAsset asset) - { - TreeNode newNode = new TreeNode(); - newNode.Text = Path.GetFileName(diag.NewText); - var newFile = new PckAsset(diag.NewText, asset.Type); - foreach (KeyValuePair property in asset.GetProperties()) - { - newFile.AddProperty(property); - } - newFile.SetData(asset.Data); - newFile.Filename = diag.NewText; - newNode.Tag = newFile; - newNode.ImageIndex = node.ImageIndex; - newNode.SelectedImageIndex = node.SelectedImageIndex; - - if (GetAllChildNodes(treeViewMain.Nodes).FirstOrDefault(n => n.FullPath == diag.NewText) is not null) - { - MessageBox.Show( - this, - $"A file with the path \"{diag.NewText}\" already exists. " + - $"Please try again with a different name.", - "Key already exists"); - return; - } - - TreeNodeCollection nodeCollection = node.Parent?.Nodes ?? treeViewMain.Nodes; - nodeCollection.Insert(node.Index + 1, newNode); - - currentPCK.InsertAsset(node.Index + 1, newFile); - BuildMainTreeView(); - wasModified = true; - } - } - } - - private void deleteEntryToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeMeta.SelectedNode is TreeNode t && t.Tag is KeyValuePair property && - treeViewMain.SelectedNode is TreeNode main && main.Tag is PckAsset asset && - asset.RemoveProperty(property)) - { - treeMeta.SelectedNode.Remove(); - wasModified = true; - } - } - - private void ReloadMetaTreeView() - { - treeMeta.Nodes.Clear(); - if (treeViewMain.SelectedNode is TreeNode node && - node.Tag is PckAsset asset) - { - foreach (KeyValuePair property in asset.GetProperties()) - { - treeMeta.Nodes.Add(CreateNode(property.Key, property)); - } - } - } - - private void addEntryToolStripMenuItem_Click_1(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode is TreeNode t && - t.Tag is PckAsset asset) - { - using AddPropertyPrompt addProperty = new AddPropertyPrompt(); - if (addProperty.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty(addProperty.Property); - ReloadMetaTreeView(); - wasModified = true; - } - } - } - - #region drag and drop for main tree node - - // Most of the code below is modified code from this link: - // https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.treeview.itemdrag?view=windowsdesktop-6.0 - // - MattNL - - private void treeViewMain_ItemDrag(object sender, ItemDragEventArgs e) - { - if (e.Button != MouseButtons.Left || e.Item is not TreeNode node) - return; - - if ((node.TryGetTagData(out PckAsset asset) && currentPCK.Contains(asset.Filename, asset.Type)) || node.Parent is TreeNode) - { - // TODO: add (mouse) scrolling while dragging item(s) - treeViewMain.DoDragDrop(node, DragDropEffects.Scroll | DragDropEffects.Move); + RPC.SetPresence("An Open Source .PCK File Editor"); } } - private void treeViewMain_DragOver(object sender, DragEventArgs e) - { - Point dragLocation = new Point(e.X, e.Y); - TreeNode node = treeViewMain.GetNodeAt(treeViewMain.PointToClient(dragLocation)); - treeViewMain.SelectedNode = node.IsTagOfType() ? null : node; - } - - private void treeViewMain_DragEnter(object sender, DragEventArgs e) - { - e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : e.AllowedEffect; - BringToFront(); - FocusMe(); - treeViewMain.Focus(); - } - - private void treeViewMain_DragDrop(object sender, DragEventArgs e) - { - // Retrieve the client coordinates of the drop location. - Point dragLocation = new Point(e.X, e.Y); - Point targetPoint = treeViewMain.PointToClient(dragLocation); - - if (!treeViewMain.ClientRectangle.Contains(targetPoint)) - return; - - // Retrieve the node at the drop location. - TreeNode targetNode = treeViewMain.GetNodeAt(targetPoint); - - if (e.Data.GetDataPresent(DataFormats.FileDrop) && e.Data.GetData(DataFormats.FileDrop) is string[] filesDropped) - { - IEnumerable files = filesDropped.Where(File.Exists); - IEnumerable directoryFiles = filesDropped - .Where(f => (File.GetAttributes(f) & FileAttributes.Directory) != 0) - .SelectMany(dir => Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)); - - string baseDirectory = Path.GetDirectoryName(filesDropped.First()); - - IEnumerable importPaths = files.Concat(directoryFiles); - - ImportFiles(baseDirectory, importPaths, string.IsNullOrWhiteSpace(targetNode?.FullPath) ? string.Empty : targetNode?.FullPath); - return; - } - - string dataFormat = typeof(TreeNode).FullName; - - if (targetNode is null) - return; - - if (!e.Data.GetDataPresent(dataFormat)) - return; - - bool isTargetPckFile = targetNode.IsTagOfType(); - TreeNode draggedNode = e.Data.GetData(dataFormat) as TreeNode; - if (draggedNode == null) - { - Debug.WriteLine("Dragged node is null."); - return; - } - - if (targetNode.Equals(draggedNode)) - { - Debug.WriteLine("Dragged node was not moved."); - return; - } - - if (targetNode.Equals(draggedNode.Parent)) - { - Debug.WriteLine("target node is parent of dragged node... nothing done."); - return; - } - - if (draggedNode.Equals(targetNode.Parent)) - { - Debug.WriteLine("dragged node is parent of target node... nothing done."); - return; - } - - if (targetNode.Parent == null && isTargetPckFile && draggedNode.Parent == null) - { - Debug.WriteLine("target node is file and is in the root... nothing done."); - return; - } - - if ((targetNode.Parent?.Equals(draggedNode.Parent) ?? false) && isTargetPckFile) - { - Debug.WriteLine("target node and dragged node have the same parent... nothing done."); - return; - } - - Debug.WriteLine($"Target drop location is {(isTargetPckFile ? "file" : "folder")}."); - - // Retrieve the node that was dragged. - if (draggedNode.TryGetTagData(out PckAsset draggedAsset) && - targetNode.FullPath != draggedAsset.Filename) - { - Debug.WriteLine(draggedAsset.Filename + " was droped onto " + targetNode.FullPath); - string newFilePath = Path.Combine(isTargetPckFile - ? Path.GetDirectoryName(targetNode.FullPath) - : targetNode.FullPath, Path.GetFileName(draggedAsset.Filename)); - Debug.WriteLine("New filepath: " + newFilePath); - draggedAsset.Filename = newFilePath; - wasModified = true; - BuildMainTreeView(); - return; - } - else - { - IEnumerable pckFiles = GetAllChildNodes(draggedNode.Nodes).Where(t => t.IsTagOfType()).Select(t => t.Tag as PckAsset); - string oldPath = draggedNode.FullPath; - string newPath = Path.Combine(isTargetPckFile ? Path.GetDirectoryName(targetNode.FullPath) : targetNode.FullPath, draggedNode.Text).Replace('\\', '/'); - foreach (PckAsset pckFile in pckFiles) - { - pckFile.Filename = Path.Combine(newPath, pckFile.Filename.Substring(oldPath.Length + 1)).Replace('\\', '/'); - } - wasModified = true; - BuildMainTreeView(); - } - } - - IEnumerable GetAllChildNodes(TreeNodeCollection root) - { - List childNodes = new List(root.Count); - foreach (TreeNode childNode in root) - { - childNodes.Add(childNode); - childNodes.AddRange(GetAllChildNodes(childNode.Nodes)); - } - return childNodes; - } - - private void ImportFiles(string baseDirectory, IEnumerable files, string prefix) - { - int fileCount = files.Count(); - int addedCount = 0; - int skippedFiles = 0; - int skipAttempts = 3; - int typeDuplication = 0; - PckAssetType lastSelectedAssetType = PckAssetType.SkinFile; - bool askForAssetType = true; - foreach (var filepath in files) - { - string assetPath = Path.Combine(prefix + filepath.Substring(baseDirectory.Length)).TrimStart('/', '\\'); - PckAssetType assetType = lastSelectedAssetType; - - if (askForAssetType) - { - using AddFilePrompt addFile = new AddFilePrompt(assetPath); - if (addFile.ShowDialog(this) != DialogResult.OK) - { - skippedFiles++; - skipAttempts--; - if (skipAttempts > 0) - continue; - - int remainingFileCount = fileCount - addedCount - skippedFiles; - DialogResult abortFurtherImport = MessageBox.Show($"Do you wan't to abort further file imports?\n{remainingFileCount} file(s) left.", "Abort further import", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); - if (abortFurtherImport == DialogResult.Yes) - { - skippedFiles += remainingFileCount; - break; - } - skipAttempts = 3; - continue; - } - - assetType = addFile.Filetype; - assetPath = addFile.Filepath; - - if (lastSelectedAssetType == assetType) - typeDuplication++; - lastSelectedAssetType = addFile.Filetype; - if (typeDuplication > 1) - { - DialogResult useSameTypeForRest = MessageBox.Show($"Do you want to import all remaining files as {lastSelectedAssetType}?", "Import all as", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); - if (useSameTypeForRest == DialogResult.Yes) - { - askForAssetType = false; - } - } - } - - if (currentPCK.Contains(filepath, assetType)) - { - if (askForAssetType) - MessageBox.Show(this, $"'{assetPath}' of type {assetType} already exists.\nSkiping file.", "File already exists", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); - Debug.WriteLine($"'{assetPath}' of type {assetType} already exists.\nSkiping file."); - continue; - } - PckAsset importedAsset = currentPCK.CreateNewAsset(assetPath, assetType, () => File.ReadAllBytes(filepath)); - string propertyFile = filepath + ".txt"; - if (File.Exists(propertyFile)) - { - importedAsset.DeserializeProperties(File.ReadAllLines(propertyFile)); - } - addedCount++; - } - Trace.TraceInformation("[{0}] Imported {1} file(s).", nameof(ImportFiles), addedCount); - Trace.TraceInformation("[{0}] Skipped {1} file(s).", nameof(ImportFiles), skippedFiles); - if (addedCount > 0) - { - wasModified = true; - BuildMainTreeView(); - } - } - - #endregion - - private PckFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) + private static PckFile InitializePack(int packId, int packVersion, string packName, bool createSkinsPCK) { var pack = new PckFile(3); @@ -1498,38 +338,35 @@ namespace PckStudio locFile.InitializeDefault(packName); pack.CreateNewAsset("localisation.loc", PckAssetType.LocalisationFile, new LOCFileWriter(locFile, 2)); - pack.CreateNewAssetIf(createSkinsPCK, "Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), - LittleEndianCheckBox.Checked - ? OMI.Endianness.LittleEndian - : OMI.Endianness.BigEndian)); + pack.CreateNewAssetIf(createSkinsPCK, "Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), OMI.ByteOrder.BigEndian)); return pack; } - private PckFile InitializeTexturePack(int packId, int packVersion, string packName, string res, bool createSkinsPCK) + private static PckFile InitializeTexturePack(int packId, int packVersion, string packName, string res, bool createSkinsPCK) { PckFile pack = InitializePack(packId, packVersion, packName, createSkinsPCK); PckFile infoPCK = new PckFile(3); - pack.GetAsset("localisation.loc", PckAssetType.LocalisationFile).Filename = "languages.loc"; + pack.GetAsset("localisation.loc", PckAssetType.LocalisationFile).Filename = "languages.loc"; PckAsset iconAsset = infoPCK.CreateNewAsset("icon.png", PckAssetType.TextureFile); - iconAsset.SetTexture(Resources.TexturePackIcon); + iconAsset.SetTexture(Core.Properties.Resources.TexturePackIcon); PckAsset comparisonAsset = infoPCK.CreateNewAsset("comparison.png", PckAssetType.TextureFile); - comparisonAsset.SetTexture(Resources.Comparison); + comparisonAsset.SetTexture(Core.Properties.Resources.Comparison); PckAsset texturepackInfoAsset = pack.CreateNewAsset($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile); texturepackInfoAsset.AddProperty("PACKID", "0"); texturepackInfoAsset.AddProperty("DATAPATH", $"{res}Data.pck"); - texturepackInfoAsset.SetData(new PckFileWriter(infoPCK, LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); + texturepackInfoAsset.SetData(new PckFileWriter(infoPCK, OMI.ByteOrder.BigEndian)); return pack; } - private PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) + private static PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res) { PckFile pack = InitializeTexturePack(packId, packVersion, packName, res, true); PckAsset gameRuleAsset = pack.CreateNewAsset("GameRules.grf", PckAssetType.GameRulesFile); @@ -1554,66 +391,57 @@ namespace PckStudio return pack; } - private void skinPackToolStripMenuItem_Click(object sender, EventArgs e) - { - CheckSaveState(); - TextPrompt namePrompt = new TextPrompt(); - namePrompt.OKButtonText = "Ok"; - if (namePrompt.ShowDialog(this) == DialogResult.OK) - { - currentPCK = InitializePack(new Random().Next(8000, 16777215), 0, namePrompt.NewText, false); // 16777215 being the uint24 max value - MarkTemplateFile(); - LoadEditorTab(); - } - } - - private void texturePackToolStripMenuItem_Click(object sender, EventArgs e) - { - CheckSaveState(); - CreateTexturePackPrompt packPrompt = new CreateTexturePackPrompt(); - if (packPrompt.ShowDialog(this) == DialogResult.OK) + private void skinPackToolStripMenuItem_Click(object sender, EventArgs e) + { + TextPrompt namePrompt = new TextPrompt(); + namePrompt.OKButtonText = "Ok"; + if (namePrompt.ShowDialog(this) == DialogResult.OK) { - currentPCK = InitializeTexturePack(new Random().Next(8000, 16777215), 0, packPrompt.PackName, packPrompt.PackRes, packPrompt.CreateSkinsPck); // 16777215 being the uint24 max value - MarkTemplateFile(); - LoadEditorTab(); + PckFile skinPck = InitializePack(new Random().Next(8000, GameConstants.MAX_PACK_ID), 0, namePrompt.NewText, true); + PackInfo packInfo = PackInfo.Create(skinPck, OMI.ByteOrder.BigEndian, true); + AddEditorPage("Unsaved skin pack", "Unsaved skin pack", packInfo); + } + } + + private void texturePackToolStripMenuItem_Click(object sender, EventArgs e) + { + var packPrompt = new CreateTexturePackPrompt(); + if (packPrompt.ShowDialog() == DialogResult.OK) + { + PckFile texturePackPck = InitializeTexturePack(new Random().Next(8000, GameConstants.MAX_PACK_ID), 0, packPrompt.PackName, packPrompt.PackRes, packPrompt.CreateSkinsPck); + PackInfo packInfo = PackInfo.Create(texturePackPck, OMI.ByteOrder.BigEndian, true); + AddEditorPage("Unsaved texture pack", "Unsaved texture pack", packInfo); } } private void mashUpPackToolStripMenuItem_Click(object sender, EventArgs e) - { - CheckSaveState(); - CreateTexturePackPrompt packPrompt = new CreateTexturePackPrompt(); - if (packPrompt.ShowDialog(this) == DialogResult.OK) - { - currentPCK = InitializeMashUpPack(new Random().Next(8000, 16777215), 0, packPrompt.PackName, packPrompt.PackRes); // 16777215 being the uint24 max value - MarkTemplateFile(); - LoadEditorTab(); - } - } - - private void MarkTemplateFile() { - isTemplateFile = true; - wasModified = true; - saveLocation = string.Empty; + var packPrompt = new CreateTexturePackPrompt(); + if (packPrompt.ShowDialog() == DialogResult.OK) + { + PckFile mashUpPck = InitializeMashUpPack(new Random().Next(8000, GameConstants.MAX_PACK_ID), 0, packPrompt.PackName, packPrompt.PackRes); + PackInfo packInfo = PackInfo.Create(mashUpPck, OMI.ByteOrder.BigEndian, true); + AddEditorPage("Unsaved mash-up pack", "Unsaved mash-up pack", packInfo); + } } private void quickChangeToolStripMenuItem_Click(object sender, EventArgs e) { - using AdvancedOptions advanced = new AdvancedOptions(currentPCK); - advanced.IsLittleEndian = LittleEndianCheckBox.Checked; - if (advanced.ShowDialog(this) == DialogResult.OK) - { - wasModified = true; - BuildMainTreeView(); - } - } + if (TryGetCurrentEditor(out IEditor editor)) + { + using AdvancedOptions advanced = new AdvancedOptions(editor.EditorValue.File); + advanced.IsLittleEndian = editor.EditorValue.Endianness == OMI.ByteOrder.LittleEndian; + if (advanced.ShowDialog() == DialogResult.OK) + { + editor.UpdateView(); + } + } + } private void closeToolStripMenuItem_Click(object sender, EventArgs e) { - CheckSaveState(); - CloseEditorTab(); - } + CloseTab(tabControl.TabPages, tabControl.SelectedTab); + } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { @@ -1621,31 +449,10 @@ namespace PckStudio info.ShowDialog(this); } - private void treeViewMain_KeyDown(object sender, KeyEventArgs e) - { - switch (e.KeyCode) - { - case Keys.Delete: - deleteFileToolStripMenuItem_Click(sender, e); - break; - case Keys.F2: - renameFileToolStripMenuItem_Click(sender, e); - break; - } - } - - private void treeViewMain_BeforeLabelEdit(object sender, NodeLabelEditEventArgs e) - { - // for now name edits are done through the 'rename' context menu item - // TODO: add folder renaming - //e.CancelEdit = e.Node.Tag is PckFile.FileData; - e.CancelEdit = true; - } - - [Obsolete("Move this")] + [Obsolete("ReMove this")] public string GetDataPath() { - return Path.Combine(Path.GetDirectoryName(saveLocation), "Data"); + return ""; } [Obsolete("Move this")] @@ -1668,228 +475,31 @@ namespace PckStudio return true; } - private void treeMeta_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyData == Keys.Delete) - deleteEntryToolStripMenuItem_Click(sender, e); - } - - private bool TryGetLocFile(out LOCFile locFile) - { - if (!currentPCK.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && - !currentPCK.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) - { - locFile = null; - return false; - } + private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk"); - try - { - locFile = locAsset.GetData(new LOCFileReader()); - return true; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - } - locFile = null; - return false; - } + private void howToMakeACustomSkinModelToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=pEC_ug55lag"); - private bool TrySetLocFile(in LOCFile locFile) - { - if (!currentPCK.TryGetAsset("localisation.loc", PckAssetType.LocalisationFile, out PckAsset locAsset) && - !currentPCK.TryGetAsset("languages.loc", PckAssetType.LocalisationFile, out locAsset)) - { - return false; - } + private void howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=6z8NTogw5x4"); - try - { - locAsset.SetData(new LOCFileWriter(locFile, 2)); - return true; - } - catch (Exception ex) - { - Debug.WriteLine(ex.Message); - } - return false; - } + private void howToMakeCustomMusicToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI"); - [Obsolete("Refactor or remove this")] - private void importExtractedSkinsFolder(object sender, EventArgs e) - { - OpenFolderDialog contents = new OpenFolderDialog(); - if (contents.ShowDialog(Handle) == true && Directory.Exists(contents.ResultPath)) - { - string filepath = treeViewMain.SelectedNode?.FullPath ?? ""; - if (treeViewMain.SelectedNode is not null && treeViewMain.SelectedNode.IsTagOfType()) - filepath = treeViewMain.SelectedNode.Parent?.FullPath ?? ""; + private void howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=hRQagnEplec"); - foreach (var fullfilename in Directory.GetFiles(contents.ResultPath, "dlc*.png")) - { - string filename = Path.GetFileName(fullfilename); - // only accept skin or cape named files - if (!filename.StartsWith("dlcskin") && !filename.StartsWith("dlccape")) - continue; - // sets file type based on wether its a cape or skin - PckAssetType pckfiletype = filename.StartsWith("dlccape", StringComparison.OrdinalIgnoreCase) - ? PckAssetType.CapeFile - : PckAssetType.SkinFile; - string pckfilepath = Path.Combine(filepath, filename); + private void pckCenterReleaseToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=E_6bXSh6yqw"); - if (currentPCK.Contains(pckfilepath, pckfiletype)) - { - Trace.TraceInformation("[{0}] {1} already exists.", nameof(importExtractedSkinsFolder), pckfilepath); - continue; - } + private void howPCKsWorkToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=hTlImrRrCKQ"); - PckAsset newAsset = currentPCK.CreateNewAsset(pckfilepath, pckfiletype); - byte[] filedata = File.ReadAllBytes(fullfilename); - newAsset.SetData(filedata); + private void toPhoenixARCDeveloperToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://cash.app/$PhoenixARC"); - if (File.Exists(fullfilename + ".txt")) - { - string[] propertiesFileContent = File.ReadAllLines(fullfilename + ".txt"); - newAsset.DeserializeProperties(propertiesFileContent); - } - } - BuildMainTreeView(); - wasModified = true; - } - } + private void toNobledezJackToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.paypal.me/realnobledez"); - [Obsolete("Refactor or remove this")] - private void importSkinToolStripMenuItem_Click(object sender, EventArgs e) - { - using (OpenFileDialog contents = new OpenFileDialog()) - { - contents.Title = "Select Extracted Skin File"; - contents.Filter = "Skin File (*.png)|*.png"; + private void forMattNLContributorToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://ko-fi.com/mattnl"); - if (contents.ShowDialog(this) == DialogResult.OK) - { - string skinNameImport = Path.GetFileName(contents.FileName); - byte[] data = File.ReadAllBytes(contents.FileName); + private void joinDevelopmentDiscordToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://discord.gg/aJtZNFVQTv"); - if (currentPCK.Contains(skinNameImport, PckAssetType.SkinFile)) - { - Trace.TraceInformation("[{0}] {1} already exists.", nameof(importExtractedSkinsFolder), skinNameImport); - return; - } + private void trelloBoardToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://trello.com/b/0XLNOEbe/pck-studio"); - PckAsset importSkinAsset = currentPCK.CreateNewAsset(skinNameImport, PckAssetType.SkinFile); - importSkinAsset.SetData(data); - string propertyFile = contents.FileName + ".txt"; - if (File.Exists(propertyFile)) - { - string[] txtProperties = File.ReadAllLines(propertyFile); - importSkinAsset.DeserializeProperties(txtProperties); - - // Because extracting/exporting an assest doesn't export - // the actual loc value we just get an undefined loc key. - // That's why why remove them after deserializing. - // - Miku - importSkinAsset.RemoveProperty("DISPLAYNAMEID"); - importSkinAsset.RemoveProperty("THEMENAMEID"); - BuildMainTreeView(); - wasModified = true; - } - } - } - } - - private void folderToolStripMenuItem_Click(object sender, EventArgs e) - { - TextPrompt folderNamePrompt = new TextPrompt(); - if (treeViewMain.SelectedNode is not null) - folderNamePrompt.contextLabel.Text = - $"New folder at the location of \"{( - !treeViewMain.SelectedNode.IsTagOfType() - ? "/" + treeViewMain.SelectedNode.FullPath - : treeViewMain.SelectedNode.Parent == null ? "/" : "/" + treeViewMain.SelectedNode.Parent.FullPath)}\""; - folderNamePrompt.OKButtonText = "Add"; - if (folderNamePrompt.ShowDialog(this) == DialogResult.OK) - { - TreeNode folerNode = CreateNode(folderNamePrompt.NewText); - folerNode.ImageIndex = 0; - folerNode.SelectedImageIndex = 0; - - TreeNodeCollection nodeCollection = treeViewMain.Nodes; - if (treeViewMain.SelectedNode is TreeNode node) - { - if (node.Tag is PckAsset asset && - asset.Type != PckAssetType.TexturePackInfoFile && - asset.Type != PckAssetType.SkinDataFile) - { - if (node.Parent is TreeNode parentNode) - { - nodeCollection = parentNode.Nodes; - } - } - else - nodeCollection = node.Nodes; - } - nodeCollection.Add(folerNode); - } - } - - private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk"); - } - - private void howToMakeACustomSkinModelToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=pEC_ug55lag"); - } - - private void howToMakeCustomSkinModelsbedrockToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=6z8NTogw5x4"); - } - - private void howToMakeCustomMusicToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=v6EYr4zc7rI"); - } - - private void howToInstallPcksDirectlyToWiiUToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=hRQagnEplec"); - } - - private void pckCenterReleaseToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=E_6bXSh6yqw"); - } - - private void howPCKsWorkToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.youtube.com/watch?v=hTlImrRrCKQ"); - } - - private void toPhoenixARCDeveloperToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://cash.app/$PhoenixARC"); - } - - private void toNobledezJackToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://www.paypal.me/realnobledez"); - } - - private void forMattNLContributorToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://ko-fi.com/mattnl"); - } - - private void joinDevelopmentDiscordToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://discord.gg/aJtZNFVQTv"); - } - - private void OpenPck_MouseEnter(object sender, EventArgs e) + private void OpenPck_MouseEnter(object sender, EventArgs e) { pckOpen.Image = Resources.pckOpen; } @@ -1899,21 +509,6 @@ namespace PckStudio pckOpen.Image = Resources.pckClosed; } - private void CheckSaveState() - { - if (currentPCK is not null && - wasModified && - MessageBox.Show(this, "Save PCK?", "Unsaved PCK", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1) == DialogResult.Yes) - { - if (isTemplateFile || string.IsNullOrEmpty(saveLocation)) - { - SaveTemplate(); - return; - } - Save(saveLocation); - } - } - private void OpenPck_DragEnter(object sender, DragEventArgs e) { pckOpen.Image = Resources.pckDrop; @@ -1925,10 +520,8 @@ namespace PckStudio private void OpenPck_DragDrop(object sender, DragEventArgs e) { - string[] filepaths = (string[])e.Data.GetData(DataFormats.FileDrop, false); - if (filepaths.Length > 1) - MessageBox.Show(this, "Only one pck file at a time is currently supported"); - LoadPckFromFile(filepaths[0]); + if (e.Data.GetData(DataFormats.FileDrop, false) is string[] filepaths) + LoadPckFromFile(filepaths); } private void OpenPck_DragLeave(object sender, EventArgs e) @@ -1941,337 +534,21 @@ namespace PckStudio openToolStripMenuItem_Click(sender, e); } - private void savePCK(object sender, EventArgs e) + private void saveToolStripMenuItem_Click(object sender, EventArgs e) { - if (!string.IsNullOrEmpty(saveLocation)) - Save(saveLocation); - if (string.IsNullOrWhiteSpace(saveLocation) || isTemplateFile) - SaveTemplate(); - } - - private void saveAsPCK(object sender, EventArgs e) - { - SaveTemplate(); - } - - private void SetNodeIcon(TreeNode node, PckAssetType type) - { - switch (type) - { - case PckAssetType.AudioFile: - node.ImageIndex = 1; - node.SelectedImageIndex = 1; - break; - case PckAssetType.LocalisationFile: - node.ImageIndex = 3; - node.SelectedImageIndex = 3; - break; - case PckAssetType.TexturePackInfoFile: - goto default; - //node.ImageIndex = 4; - //node.SelectedImageIndex = 4; - //break; - case PckAssetType.ColourTableFile: - node.ImageIndex = 6; - node.SelectedImageIndex = 6; - break; - case PckAssetType.ModelsFile: - goto default; - //node.ImageIndex = 8; - //node.SelectedImageIndex = 8; - //break; - case PckAssetType.SkinDataFile: - goto default; - //node.ImageIndex = 7; - //node.SelectedImageIndex = 7; - //break; - case PckAssetType.GameRulesFile: - node.ImageIndex = 9; - node.SelectedImageIndex = 9; - break; - case PckAssetType.GameRulesHeader: - node.ImageIndex = 10; - node.SelectedImageIndex = 10; - break; - case PckAssetType.InfoFile: - node.ImageIndex = 11; - node.SelectedImageIndex = 11; - break; - case PckAssetType.SkinFile: - node.ImageIndex = 12; - node.SelectedImageIndex = 12; - break; - case PckAssetType.CapeFile: - node.ImageIndex = 13; - node.SelectedImageIndex = 13; - break; - case PckAssetType.TextureFile: - node.ImageIndex = 14; - node.SelectedImageIndex = 14; - break; - case PckAssetType.BehavioursFile: - node.ImageIndex = 15; - node.SelectedImageIndex = 15; - break; - case PckAssetType.MaterialFile: - node.ImageIndex = 16; - node.SelectedImageIndex = 16; - break; - default: // unknown file format - node.ImageIndex = 5; - node.SelectedImageIndex = 5; - break; - } - } - - private void SetFileType(PckAssetType type) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - Debug.WriteLine($"Setting {asset.Type} to {type}"); - asset.Type = type; - SetNodeIcon(treeViewMain.SelectedNode, type); - } - } - - private void addTextureToolStripMenuItem_Click(object sender, EventArgs e) - { - using OpenFileDialog fileDialog = new OpenFileDialog(); - fileDialog.Filter = "Texture File(*.png,*.tga)|*.png;*.tga"; - if (fileDialog.ShowDialog(this) == DialogResult.OK) - { - using TextPrompt renamePrompt = new TextPrompt(Path.GetFileName(fileDialog.FileName)); - renamePrompt.LabelText = "Path"; - if (renamePrompt.ShowDialog(this) == DialogResult.OK && !string.IsNullOrEmpty(renamePrompt.NewText)) - { - if (currentPCK.Contains(renamePrompt.NewText, PckAssetType.TextureFile)) - { - MessageBox.Show(this, $"'{renamePrompt.NewText}' already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } - PckAsset asset = currentPCK.CreateNewAsset(renamePrompt.NewText, PckAssetType.TextureFile, () => File.ReadAllBytes(fileDialog.FileName)); - BuildMainTreeView(); - wasModified = true; - } - } - } - - private void viewFileInfoToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.Tag is PckAsset asset) - { - MessageBox.Show(this, - "File path: " + asset.Filename + - "\nAssigned File type: " + (int)asset.Type + " (" + asset.Type + ")" + - "\nFile size: " + asset.Size + - "\nProperties count: " + asset.PropertyCount - , Path.GetFileName(asset.Filename) + " file info"); - } - } - - private void generateMipMapTextureToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type == PckAssetType.TextureFile) - { - string textureDirectory = Path.GetDirectoryName(asset.Filename); - string textureName = Path.GetFileNameWithoutExtension(asset.Filename); - - if (asset.IsMipmappedFile()) - return; - - string textureExtension = Path.GetExtension(asset.Filename); - - using NumericPrompt numericPrompt = new NumericPrompt(0); - numericPrompt.Minimum = 1; - numericPrompt.Maximum = 4; // 5 is the presumed max MipMap level - numericPrompt.ContextLabel.Text = "You can enter the amount of MipMap levels that you would like to generate. " + - "For example: if you enter 2, MipMapLevel1.png and MipMapLevel2.png will be generated"; - numericPrompt.TextLabel.Text = "Levels"; - - if (numericPrompt.ShowDialog(this) == DialogResult.OK) - { - for (int i = 2; i < 2 + numericPrompt.SelectedValue; i++) - { - string mippedPath = $"{textureDirectory}/{textureName}MipMapLevel{i}{textureExtension}"; - Debug.WriteLine(mippedPath); - if (currentPCK.HasAsset(mippedPath, PckAssetType.TextureFile)) - currentPCK.RemoveAsset(currentPCK.GetAsset(mippedPath, PckAssetType.TextureFile)); - PckAsset mipMappedAsset = new PckAsset(mippedPath, PckAssetType.TextureFile); - - Image originalTexture = asset.GetTexture(); - int newWidth = Math.Max(originalTexture.Width / (int)Math.Pow(2, i - 1), 1); - int newHeight = Math.Max(originalTexture.Height / (int)Math.Pow(2, i - 1), 1); - - Rectangle tileArea = new Rectangle(0, 0, newWidth, newHeight); - Image mippedTexture = new Bitmap(newWidth, newHeight); - using (Graphics gfx = Graphics.FromImage(mippedTexture)) - { - gfx.SmoothingMode = SmoothingMode.None; - gfx.InterpolationMode = InterpolationMode.NearestNeighbor; - gfx.PixelOffsetMode = PixelOffsetMode.HighQuality; - gfx.DrawImage(originalTexture, tileArea); - } - - mipMappedAsset.SetTexture(mippedTexture); - - currentPCK.InsertAsset(currentPCK.IndexOfAsset(asset) + i - 1, mipMappedAsset); - } - BuildMainTreeView(); - } - } - } - - private void colourscolToolStripMenuItem_Click(object sender, EventArgs e) - { - if (currentPCK.TryGetAsset("colours.col", PckAssetType.ColourTableFile, out _)) - { - MessageBox.Show(this, "A color table file already exists in this PCK and a new one cannot be created.", "Operation aborted"); - return; - } - PckAsset newColorAsset = currentPCK.CreateNewAsset("colours.col", PckAssetType.ColourTableFile); - newColorAsset.SetData(Resources.tu69colours); - BuildMainTreeView(); - } - - private void tabControl_Selecting(object sender, TabControlCancelEventArgs e) - { - e.Cancel = !isSelectingTab; - } - - private void as3DSTextureFileToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && - asset.Type == PckAssetType.SkinFile) - { - SaveFileDialog saveFileDialog = new SaveFileDialog(); - saveFileDialog.Filter = "3DS Texture|*.3dst"; - saveFileDialog.DefaultExt = ".3dst"; - if (saveFileDialog.ShowDialog(this) == DialogResult.OK) - { - Image img = asset.GetTexture(); - var writer = new _3DSTextureWriter(img); - writer.WriteToFile(saveFileDialog.FileName); - } - } - } - - private void addMultipleEntriesToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - using var input = new MultiTextPrompt(); - if (input.ShowDialog(this) == DialogResult.OK) - { - asset.DeserializeProperties(input.TextOutput); - ReloadMetaTreeView(); - wasModified = true; - } + if (TryGetCurrentEditor(out IEditor editor)) + { + editor.Save(); } - } + } - private void correctSkinDecimalsToolStripMenuItem_Click(object sender, EventArgs e) + private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset) && - asset.Type == PckAssetType.SkinFile) - { - foreach (KeyValuePair p in asset.GetProperties().ToList()) - { - if (p.Key == "BOX" || p.Key == "OFFSET") - asset.SetProperty(asset.GetPropertyIndex(p), new KeyValuePair(p.Key, p.Value.Replace(',', '.'))); - } - ReloadMetaTreeView(); - wasModified = true; - } - } - - private void CreateSkinsPCKToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (currentPCK.TryGetAsset("Skins.pck", PckAssetType.SkinDataFile, out _)) - { - MessageBox.Show(this, "A Skins.pck file already exists in this PCK and a new one cannot be created.", "Operation aborted"); - return; - } - - currentPCK.CreateNewAsset("Skins.pck", PckAssetType.SkinDataFile, new PckFileWriter(new PckFile(3, true), - LittleEndianCheckBox.Checked ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian)); - - BuildMainTreeView(); - } - - private void editAllEntriesToolStripMenuItem_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - IEnumerable props = asset.SerializeProperties(seperater:" "); - using (var input = new MultiTextPrompt(props)) - { - if (input.ShowDialog(this) == DialogResult.OK) - { - asset.ClearProperties(); - asset.DeserializeProperties(input.TextOutput); - ReloadMetaTreeView(); - wasModified = true; - } - } - } - } - - private void addFileToolStripMenuItem_Click(object sender, EventArgs e) - { - using var ofd = new OpenFileDialog(); - // Suddenly, and randomly, this started throwing an exception because it wasn't formatted correctly? - // So now it's formatted correctly and now displays the file type name in the dialog. - ofd.Filter = "All files (*.*)|*.*"; - ofd.Multiselect = false; - - if (ofd.ShowDialog(this) == DialogResult.OK) - { - using AddFilePrompt diag = new AddFilePrompt("res/" + Path.GetFileName(ofd.FileName)); - if (diag.ShowDialog(this) == DialogResult.OK) - { - if (currentPCK.Contains(diag.Filepath, diag.Filetype)) - { - MessageBox.Show(this, $"'{diag.Filepath}' of type {diag.Filetype} already exists.", "Import failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } - PckAsset asset = currentPCK.CreateNewAsset(diag.Filepath, diag.Filetype, () => File.ReadAllBytes(ofd.FileName)); - - BuildMainTreeView(); - wasModified = true; - } - } - return; - } - - private void behavioursbinToolStripMenuItem_Click(object sender, EventArgs e) - { - if (currentPCK.TryGetAsset("behaviours.bin", PckAssetType.BehavioursFile, out _)) - { - MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); - return; - } - - currentPCK.CreateNewAsset("behaviours.bin", PckAssetType.BehavioursFile, new BehavioursWriter(new BehaviourFile())); - BuildMainTreeView(); - } - - private void entityMaterialsbinToolStripMenuItem_Click(object sender, EventArgs e) - { - if (currentPCK.TryGetAsset("entityMaterials.bin", PckAssetType.MaterialFile, out _)) - { - MessageBox.Show(this, "A behaviours file already exists in this PCK and a new one cannot be created.", "Operation aborted"); - return; - } - var materialContainer = new MaterialContainer(); - materialContainer.InitializeDefault(); - currentPCK.CreateNewAsset("entityMaterials.bin", PckAssetType.MaterialFile, new MaterialFileWriter(materialContainer)); - BuildMainTreeView(); - } - - private void trelloBoardToolStripMenuItem_Click(object sender, EventArgs e) - { - Process.Start("https://trello.com/b/0XLNOEbe/pck-studio"); - } + if (TryGetCurrentEditor(out IEditor editor)) + { + editor.SaveAs(); + } + } private void wavBinkaToolStripMenuItem_Click(object sender, EventArgs e) { @@ -2291,7 +568,7 @@ namespace PckStudio ButtonText = "OK" }; - if(dialog.ShowDialog(this) == DialogResult.OK) + if (dialog.ShowDialog(this) == DialogResult.OK) { BinkaConverter.ToBinka( fileDialog.FileNames, @@ -2318,8 +595,11 @@ namespace PckStudio private void fullBoxSupportToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { - currentPCK.SetVersion(fullBoxSupportToolStripMenuItem.Checked); - } + if (TryGetCurrentEditor(out IEditor editor)) + { + editor.EditorValue.File.SetVersion(fullBoxSupportToolStripMenuItem.Checked); + } + } private void settingsToolStripMenuItem_Click(object sender, EventArgs e) { @@ -2327,36 +607,6 @@ namespace PckStudio appSettings.ShowDialog(this); } - private void addBOXEntryToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode is TreeNode t && t.Tag is PckAsset asset) - { - using BoxEditor diag = new BoxEditor(SkinBOX.Empty, false); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty("BOX", diag.Result); - ReloadMetaTreeView(); - wasModified = true; - } - return; - } - } - - private void addANIMEntryToolStripMenuItem1_Click(object sender, EventArgs e) - { - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - using ANIMEditor diag = new ANIMEditor(SkinANIM.Empty); - if (diag.ShowDialog(this) == DialogResult.OK) - { - asset.AddProperty("ANIM", diag.ResultAnim); - ReloadMetaTreeView(); - wasModified = true; - } - return; - } - } - private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e) { Updater.UpdateToLatest(); @@ -2367,149 +617,5 @@ namespace PckStudio PckManager?.Close(); Application.Exit(); } - - private void SetPckEndianness(OMI.Endianness endianness) - { - try - { - if (treeViewMain.SelectedNode.Tag is PckAsset asset && (asset.Type is PckAssetType.AudioFile || asset.Type is PckAssetType.SkinDataFile || asset.Type is PckAssetType.TexturePackInfoFile)) - { - IDataFormatReader reader = asset.Type is PckAssetType.AudioFile - ? new PckAudioFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian) - : new PckFileReader(endianness == OMI.Endianness.BigEndian ? OMI.Endianness.LittleEndian : OMI.Endianness.BigEndian); - object pck = reader.FromStream(new MemoryStream(asset.Data)); - - IDataFormatWriter writer = asset.Type is PckAssetType.AudioFile - ? new PckAudioFileWriter((PckAudioFile)pck, endianness) - : new PckFileWriter((PckFile)pck, endianness); - asset.SetData(writer); - wasModified = true; - MessageBox.Show($"\"{asset.Filename}\" successfully converted to {(endianness == OMI.Endianness.LittleEndian ? "little" : "big")} endian.", "Converted PCK file"); - } - } - catch (OverflowException) - { - MessageBox.Show(this, $"File was not a valid {(endianness != OMI.Endianness.LittleEndian ? "little" : "big")} endian PCK File.", "Not a valid PCK file"); - return; - } - catch (Exception ex) - { - MessageBox.Show(this, ex.Message, "Not a valid PCK file"); - return; - } - } - - private void littleEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.Endianness.LittleEndian); - - private void bigEndianToolStripMenuItem_Click(object sender, EventArgs e) => SetPckEndianness(OMI.Endianness.BigEndian); - - private void SetModelVersion(int version) - { - if (treeViewMain.SelectedNode.Tag is PckAsset asset && asset.Type is PckAssetType.ModelsFile) - { - try - { - ModelContainer container = asset.GetData(new ModelFileReader()); - - if (container.Version == version) - { - MessageBox.Show( - this, - $"This model container is already Version {version + 1}.", - "Can't convert", MessageBoxButtons.OK, MessageBoxIcon.Error - ); - return; - } - - if (version == 2 && - MessageBox.Show( - this, - "Conversion to 1.14 models.bin format does not yet support parent declaration and may not be 100% accurate.\n" + - "Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes - ) - { - return; - } - - if (container.Version > 1 && - MessageBox.Show( - this, - "Conversion from 1.14 models.bin format does not yet support parent parts and may not be 100% accurate.\n" + - "Would you like to continue?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes - ) - { - return; - } - - asset.SetData(new ModelFileWriter(container, version)); - wasModified = true; - MessageBox.Show( - this, - $"\"{asset.Filename}\" successfully converted to Version {version + 1} format.", - "Converted model container file" - ); - } - catch (Exception ex) - { - MessageBox.Show(this, ex.Message, "Not a valid model container file."); - return; - } - } - } - - private void setModelVersion1ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(0); - - private void setModelVersion2ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(1); - - private void setModelVersion3ToolStripMenuItem_Click(object sender, EventArgs e) => SetModelVersion(2); - - private void contextMenuPCKEntries_Opening(object sender, System.ComponentModel.CancelEventArgs e) - { - if (treeViewMain?.SelectedNode == null) - { - e.Cancel = true; - return; - } - - correctSkinDecimalsToolStripMenuItem.Visible = false; - generateMipMapTextureToolStripMenuItem1.Visible = false; - setModelContainerFormatToolStripMenuItem.Visible = false; - setSubPCKEndiannessToolStripMenuItem.Visible = false; - exportToolStripMenuItem.Visible = false; - toolStripSeparator5.Visible = false; - toolStripSeparator6.Visible = false; - if (treeViewMain.SelectedNode.TryGetTagData(out PckAsset asset)) - { - replaceToolStripMenuItem.Visible = true; - cloneFileToolStripMenuItem.Visible = true; - setFileTypeToolStripMenuItem.Visible = true; - toolStripSeparator5.Visible = true; - toolStripSeparator6.Visible = true; - - if (asset.Type == PckAssetType.SkinFile) - { - correctSkinDecimalsToolStripMenuItem.Visible = true; - exportToolStripMenuItem.Visible = true; - } - if (asset.Type == PckAssetType.TextureFile) - generateMipMapTextureToolStripMenuItem1.Visible = true; - if (asset.Type == PckAssetType.ModelsFile) - setModelContainerFormatToolStripMenuItem.Visible = true; - if (asset.Type == PckAssetType.SkinDataFile || asset.Type == PckAssetType.TexturePackInfoFile || asset.Type == PckAssetType.AudioFile) - setSubPCKEndiannessToolStripMenuItem.Visible = true; - } - else - { - replaceToolStripMenuItem.Visible = false; - cloneFileToolStripMenuItem.Visible = false; - setFileTypeToolStripMenuItem.Visible = false; - } - } - - private void treeViewMain_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) - { - if (e.Node is not null) - treeViewMain.SelectedNode = e.Node; - } - } + } } \ No newline at end of file diff --git a/PCK-Studio/MainForm.resx b/PCK-Studio/MainForm.resx index 53da4286..b1bb4ce0 100644 --- a/PCK-Studio/MainForm.resx +++ b/PCK-Studio/MainForm.resx @@ -117,701 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - - - - - 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 - 8+BMiU9xSj9GDDCHwDUcMkHMV8I4YKwwEz0K5TTDbjg/NnbZmEsvwcYuuVQYpxwTXCyU8g2YMaMA9NIJ - QlbKc/bsWePhf9yV868cRwU+9urlV49ddc3mO2PQDmDbQrL1wvZLH2n1jwL0m3S/9BN9i3ENH0E3I+Ij - 165ePWaFyYNijmQzbk6y88LG0GHSNcktA2RXAwTAVlDG8CCv2hKBdbzbZhRPJilXFq4wuuJh8dIlYxYs - Xjhm/sL5Y+fMgz7wYKfjL5ulHyRZNmWXbKCcX4CWVvpbgeTVFkhq0j+BAmI8iTTZBwWAzyt9dNH16gP/ - HXPlvCvGzJs7Tx9M/ohfjp/5M3zskkuJl5c2/SoAuyjtI8ULoND/ZfgWuhdK9G0bxdkYVm1j0OlYdErs - wq+Zk/kS3sJXSkjy8rMGok+SZSlXQL8z3hvLkn6JT+7OLKZwXrZ0KSvWFSNio/3Wb/3Wb/3Wb/3Wb/3W - b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3W - b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3W - b/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb/3Wb1uy/Yf/8P8D4rKD - rca4/zIAAAAASUVORK5CYII= - - - - - NoControl - - - 413, 0 - - - 190, 50 - - - Zoom - - - - 14 - - - logoPictureBox - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editorTab - - - 8 - False + 202, 6 @@ -819,671 +128,27 @@ False - 183, 6 + 167, 6 False - 183, 6 + 167, 6 202, 6 - - 116, 17 - - - 224, 324 - - - contextMenuPCKEntries - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAA3SURBVDhPY/j/ - /z9FGKsgGIsCKWSMTQ0QYxUE45FmALpiYvFwMgAbxqIYG8YqCMajBhCJ/zMAAPGwpV/Xje8RAAAAAElF - TkSuQmCC - - - - 223, 22 - - - Create - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABVSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jywDRIGxA8JQPlQ7PQyAaUTDUO30MACG - YZqhfKh24gGGzYMAMDAAAPvHncAZVkkSAAAAAElFTkSuQmCC - - - - 172, 22 - - - Folder - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf - T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy - /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 - sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ - gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr - BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK - Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P - aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV - A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx - WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp - e+98+xbVEAAAAABJRU5ErkJggg== - - - - 172, 22 - - - Skin - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAI/SURBVDhPjZHt - b9JQFMbvv6IRCiYmU+cGpQXH5oACMkZvgQILG2Su7e2mE3l1cTMricaXEQtscVN0UYIaB8MZmW/ZFxP/ - KrzNpCHxi0+eL/ec53fuSQ7IHLqyXW+uwwj7lLBvQweu9N6Y/M65/h3iOmpNLL2hxaYj1bAEnxhXPkyB - TNe9/H76YS96rzOz0Z3lSQI1banX1uTLMfVkYetnMt/2LTRGMq1rwlv7SssJHnyLcbRp77csvLLdaF1l - HabVg+mElVg9cq//gOpJ+tmvVNRmiKsXUi8sPGUGPEWIshihiShlvN1meNoQoQ1R2jDfuBimCfHjJOsg - SrNXWIcRJwuQBFXJneXoOvL0NiGkzDtLrgJnKUIySp6L0MYYeVYWhUKYrAq+MG3WgGJolCfP1BGzI0zc - gfYcpNrlNHZ/SE9Ff4Ejn4vOjjIHDu7HI7RpjRsvsiOPN+7iRmVxqpkLakEANPf7ypyjnJzEQzEDegon - eS/t3grs3gw+Ki5iIAfJCgoMA7i4hWZU6TpmwCdlHr+7SvpoM1YR/VpO1wDQhRlQkzzZ0OVsmKwhby5k - 1cqnuX+tA1WZ4e3mUtiK/X/AcgBv9bUcx9YAXYOcrlPAm+fIIhyvIh/e6lhJYHiNHdX6AwAHPpcTPSWm - AVnWCh2mbeQpQEtN9tclpip78nBot37/i5KoIUY7rhIDOdaiIl+es5U4MkIZ8S15O4E/0YCB8HNbcuOh - mAGqxOQ5S4Q6f1yOF6CVp0w6gxfQ/ZdBnj/Cc21Sm8M0egAAAABJRU5ErkJggg== - - - - 172, 22 - - - Animated Texture - - - 172, 22 - - - Audio.pck - - - 172, 22 - - - Colours.col - - - 172, 22 - - - Skins.pck - - - 172, 22 - - - Behaviours.bin - - - 172, 22 - - - EntityMaterials.bin - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAABzSURBVDhPpYzB - DQAhCARp4hr3Txu254WTjYRb9cEmk/BgRjBVHTv85Twmgt77PcJEYIFrhIkAgWOEiSAGthEmgtbaD9fW - mBgpB4xywCgFxiMf5YDdrq3l5wjEjKtzTARMNlydY2IGot2ureVnRjkQmZbICyCi7XU5cfqKAAAAAElF - TkSuQmCC - - - - 223, 22 - - - Import - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAIkSURBVDhPpdLf - T1JxGMfxc1n8qtzcyglCWhFS1PLGHAgisDmktZZtabRSEYhDZ8xpiSWVpaSxLpoXyWquLvzV+oGZq+iy - /6Stm7qsm+DT830YMJw3rbO9Djs7z/P+wob03xcAyWbUwqLXotWgha1pDzPr1axl/y52uEHFrAY1z4l5 - sVsK0IK1UVMbaKQAOXhgN2tuKLHQTKtBh6M0XwmIxe1OtexjXZa9pA6dlnomlgXx7WoCo/1eTF3pwfRQ - gM3HLmD+Wh8yIwE8CgcwFznLJs67cLPPgeMmXW1gKRXCZjqGfCbBvi6kWH6OnoXMKFsd68fa2CW0Haqr - BpYnh5G7F8PGtIyV2yG2NhXHeuo6nioD5CI+pRMsG+nFYqSHVQKrt0LYKAcmhyCeX6Vklk0MsI9phQIK - Bfy07OfPSkAs/v7xDcViEd6OZ/C2LyOXHMb75Agtlk72nF6hdy/FEgrFP3yI2OVA7r6MXz+/04siPB3P - aXgJ75JhbFIgP5PAZwr42lcp8IJnioUCBcLVQHbQizfjQTr1Kj7cTbBIpw1R54mK/GwMXwjqaYWkzrVV - A4uDPry+QYGJIN7eUVjMcQyyvWrrQRxbM/GdA4+Dbjy57MJC0AmnUQ2XUYPZXjse+qvKi9vRHZLisUJx - WyB3m0sBkwZuvYr56A8j7LQs0B2S7LMg2n0EUY8ZdpMaDgo4mlSsq1lXo7w4fuZk6Sf861U5mS9J+gsp - e+98+xbVEAAAAABJRU5ErkJggg== - - - - 228, 22 - - - Import Skin - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xOdTWsmQAAAEnSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADkCS05Xjh2FhFEIydtIT+22uJAsX4wBimFqod04Bt - nTn/9/YV/T82rQGM93YXAfkl/1eVRYPl8RqwuTnn/5aW3P8r69L+r67P+7+mIf//rIKo/7s7i/7PyfT9 - PzvTC78BW6AGrKpN+7+2IReM5xTF/N/VWQA0wAdogA8BA4Ca//7799/VauH/TdUZ/7dVp//fA7Td3XLV - //+iwNgBYXwGbCiP+7+5Oun/9qai/5n2+v+zHAzAeG9HDnEGTIl3/D8tzuG/owLP/w5f2/9dPrYIjWgY - qh3VgAJnrf+5Lhr/HRV5/jvLcoExNs0gDNWOagBeDNMM5UO1Ew8wbB4EgIEBABiEccKRdcoAAAAAAElF - TkSuQmCC - - - - 228, 22 - - - Import Extracted Skins Folder - - - 228, 22 - - - Add Texture - - - 228, 22 - - - Add File - - - 223, 22 - - - Export - - - 186, 22 - - - Export as 3DS Texture - - - 223, 22 - - - Set File Type - - - 222, 22 - - - Skin (.PNG) - - - 222, 22 - - - Cape (.PNG) - - - 222, 22 - - - Texture (.PNG) - - - 222, 22 - - - Languages File (.LOC) - - - 222, 22 - - - Game Rules File (.GRF) - - - 222, 22 - - - Music Cues File (audio.PCK) - - - 222, 22 - - - Colour Table File (.COL) - - - 222, 22 - - - Game Rules Header (.GRH) - - - 222, 22 - - - Skins PCK (.PCK) - - - 222, 22 - - - Models File (.BIN) - - - 222, 22 - - - Behaviours File (.BIN) - - - 222, 22 - - - Entity Materials File (.BIN) - - - 220, 6 - - - 223, 22 - - - Generate MipMap Texture - - - 223, 22 - - - View File Info - - - 223, 22 - - - Correct Skin Decimals - - - 223, 22 - - - Set SubPCK Endianness - - - 250, 22 - - - Big Endian (Xbox 360/PS3/Wii U) - - - 250, 22 - - - Little Endian (PS4/PS Vita/Switch) - - - 223, 22 - - - Set Model Container Format - - - 216, 22 - - - Version 1 (Pre 1.13) - - - 216, 22 - - - Version 2 (1.13) - - - 216, 22 - - - Version 3 (1.14 [PS4 ONLY]) - - - 220, 6 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAACYSURBVDhPpZBZ - CsQwDEOd5QK5/2E9qCBGXtopzMcDxxKyY3P3izmnm9kt0OlVvsVVVgOAtvduQ4KJdYbaGKOEFFOHamut - ENKaMlk75zi2QX1rUqDpkbEF/cGktb47ygb5ODA8hVArgsK1cx+EAE7LaB8+hb3QzDx942eAXrqjBOgR - MRkBfHeUADbe8ncANw4NhLwF33R3+wA6sV5/E8GOLwAAAABJRU5ErkJggg== - - - - 223, 22 - - - Extract - - - 223, 22 - - - Clone - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAACVJREFUOE9jwAL+E8AkAbI0IYNRA0YNAIFRA8g0AKYJF0YCDAwAzhor1TRE/JoA - AAAASUVORK5CYII= - - - - 223, 22 - - - Rename - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAAC/SURBVDhPlVHB - DQMhDEOIfwfoOuzFoPxhAd5c6/SMAgq0tRQFmdgXfA5IKUkBMcbHPxyJCxVCkK7rm+EwaK1dQO9dClzO - WfpOTM7hy1oMGNvY4pucxNY2p6cAWzFw2oZuMmiJweGeHM634UdLg50YwD05vQ2fYoaoDTEMrJyIfw3R - 4qYQWUZgg6OwlDJyMH8LcwF2T8FZ5kYQb4Lde/9Et8S6Dy1z0LUGi7VpWGvl3Lw2V98ZrtwIUYktwwPn - 3AtE5NqX8pp0ZQAAAABJRU5ErkJggg== - - - - 223, 22 - - - Replace - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAACESURBVDhPlY0B - DoAgDAP3Dj7r09WTkqGUgJfUxtrOmHFEnL0U76FBqW8PZXmk/9uONEsIb3gsNRzoL/+R5hWC759mGsbQ - DnzdZbhmiSvhLsM1S1wJdxmuWeJKuMtwzRJXwl2Ga5a4Eu4yXLPElXCX4Zol/WCl6YGdI62n2Zv2cSXV - byIunLh7mD2ySLcAAAAASUVORK5CYII= - - - - 223, 22 - - - Delete - 17, 17 + Top, Left, Right - - False - None - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB - CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl - XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v - AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD - tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA - AElFTkSuQmCC - - - - 186, 22 - - - New - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc - 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG - AOrUrx4HdAXuAAAAAElFTkSuQmCC - - - - Control+O - - - 186, 22 - - - Open - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAT - rAAAE6wBzl+vrgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHkSURBVFhH1ZfN - KwVRGIevBRslZUtZsPG1kEhZ21hYKfkTpMTCwoqF4l+QNbKysraU8rW1ZEEUpcg3v2fMYXLn471zz+12 - n3q6c8685z3vzJy65xRqhT45LidyytheWTKD8lR+efJEDkgTTP4kGXgj9+ROThlLDnI9SlMR7sm3ZCMd - ZUKObUnOYzrS6JHuyX1M7iDXrSR3Nx1JsGgI4tX5hpzkZo5EWLkE8f18Q05yM0cipRYwG2qhIgW8h1qo - SAHEooXYAliR93I5aBUXMCy5Pxe0ivFSwKv8lGMyWkCLvAjbizKOsguABcmNOzkdXhO8G14fyAYZB/fR - QmIBddJNdh7+noW/FNUukyAGLSQWANHXjR/SfZY0XHxb0EontQAYkm/SJV2TWRxKYi9l1t9uZgGwLgm6 - lvV0ZNAs9yVjHuSoTMJUAOthRrYGLRss0E1J8hc5JeMwFZAXCl+VTMDaWZL/qWgBjnnJAmaiFToimD/B - iGwKWvmYlM/yKmj9YSqARUTQRtDKT4fs/Ln8xVQANwki2De1UUDVt2RuU8oGslKb0i460uAQQSBbaR9F - kMNty4/oyILDA4cI9yZ4dXy/PDLWPTk5+6UJiuAQwUAf8uTmyaOwY2LRsHLzyNjUg0iVKBS+AWAi5w3z - cKwSAAAAAElFTkSuQmCC - - - - 186, 22 - - - Recently open - - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAAJ10AACddAWJ4eeMAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwa - AAADaElEQVR4Xu2bO49NURiGx/1OhCiERhQKFZ2CBAlxvyv8BtHTKTUKkaCViFuCiEQoFESiICiUKgoR - BZGgcHmfYpKTPe+aOWfvb629JftJnmbOmf2t7519XXvNWE9PT09PGZbKE/K8vCZv1vCK3C7/K+bIs/K7 - /BvgH3lc/hcsk0+la6SJbLPzsMu/lK6BpqYC2CLfyG/ytlwuW2GxfCHd4JvKIXBMVtktf8rB73LeKM5C - +UwODmTQT/K+rJ7ghpGT4DZZxTWPX2VR5ssnsjqQca9LAook1Ty+ksWYKx9JNxC8IWfISCZrnp9vlkWY - Ldmt3UDwjpwlI9kpf0hX75fcJ4tAYzToBoIPJAFFMtlfHk/KIrBLs2u7QSCHBIdGJFM1j0dldqbLq9IN - ALkSRJ/wJtvtB80ewDR5Sbri+FwukpEM2zxmDYDmL0pXGLn0cBcYySjNY9YATktXFHM0P9Wlzv08WwAb - 5W/pir6VPPxEMlXzfO4+yxbAPekKvpMrZCTDNA/u8ywBcFLjBqNa7L1cKSMZtnlw38kSwCbpiu2QkYzS - PLjvHZHhHJCu2DwZxajNc0Vy380SABt1xRhEBHXu7VMBHJbh5Ayg7oMNd6Pud7IEwEZdsaYB1G0eUgEc - kuGkAmAQdWnSPPAw5n43SwBs1BWrG0DT5qETAdSZ5YloHlIBHJThRAUQ1TzMlG47WQJgo67YKAFENg+p - ALhnCScVAIMYhujmgek4t70sAaTuBIcJIEfz0IkApprtzdU8pALYL8OpE0DO5oHZZrftLAHwSqpaiOZS - 9wGjPtjUoWgAS+RnOVjornSUaB6KBgDMCfDKm5eOvH52s0ClmgcWX7g6TQ+t2uQ+5qukAtgri1O6eeCt - k6tXPIA2modOBNBW85AKYI8sQpvNA/ORrnaRANpuHloLoAvNA0ty3BgiL7UT6ErzUDyALjUPqQB2yXC6 - 1jwskG484QF0sXkoEgDLT1P39uhWbZZilXRj2irDYO2tKzIuCyba4ox0Y1orw2DhsSsy6Gv5WPKEWF3e - Gi01qEVNN5aPssnLmgnckq5QVz0nQ2HJOakzB8DhQMKucBf8IKPXKE1gvfwi3QDalNmqDbIIq+VD6QbS - hqxIXSOLs06ekhfkZVn3n6FGkRrUoia1GUNPT09Pz+iMjf0D9wsBsNeAg5QAAAAASUVORK5CYII= - - - - 186, 22 - - - Close - - - False - - - 186, 22 - - - Pack Settings - - - False - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - QLt++3yTGbf/Fm599P/Nh49wfPXxq/+rTt37f+Dak/8gOSBgAGEMANIMxGBFyAasPf/0v8GE8//z1t8C - y4HU4DIALIluwLpLL+HiMANAGKoNAWASCavv/n/57gPcgOvP3oENOXj7NViOoAFGU6791+k4ghWD5Aga - QCyGakMAkODcU89R/I8Ng9TgNADk14dPn/8/c+kqVgySgwUqVBsCwAx49urN/zsPHmPFIDmaGvAXJInN - 38gYasBfqDYE0K7dOn/Wvut/sfkdGYPUgJI9VNuAAwYGAGn6yvdevWgPAAAAAElFTkSuQmCC - - - - Control+S - - - 186, 22 - - - Save - - - False - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 - IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA - ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED - iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 - GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC - - - - Control+Shift+S - - - 186, 22 - - - Save As - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wQAADsEBuJFr7QAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEkSURBVFhH7ZfN - asJAFEbzEoo/b6QU36a6LhR8IzdKlVJoQTd24WuUtpuu9Dsjs5FI594ZCEQPHHBg7s2XxISb6k4CE7mW - v/KYKHtf5IPMYi7rDmDxWbrgzGnwJx/lQKbC3qmklh5jaYbLTjGNvFBLj1VYGfmRFPfDykdP0uM7rIxQ - iLm4+7QmAI8jmikVwE0rAizkVnbDykiJABycHp/SHKJEgI7cS/ocpOmd8l+AjYx7Un2XycSia3gCfMhk - YlEOl7eAV3MyJQLsJD0a+xNyyRt9DLNoTYA3+Xr+aaNUAHefxgPEkcwyjF4ylPT4CisjDBEU5wylM0mP - ZVgZ4aOCYkZrQuSM5SPpgo8KGuT4JLPgo4K5ntG67gB1spfL7j7zW6GqTtAaslLCb2cpAAAAAElFTkSu - QmCC - - - - 186, 22 - - - Exit - - - 37, 20 - - - File - - - 39, 20 - - - Edit - - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAA6pJREFUeF7tms9vDVEYhouqpFZVRFpdd+cPkFphQeKPqIUfSVl0Y9OQWNpXE/ak - SEhYkEjZUFZERCxtCaKKWKDe787jpNftmTlzz4x0rvMkb3Lzzfu9c8690zkz0+lLJBKJRCKRqIOVlZUx - 6Yb0WSqL9dyUxolrFhq4Tf6DFMtHaYzY5qBB2y9fFdeIbQ4adDeHvY8lYpsDA3dQDoY2B+XmwLgdlIOh - zUG5OTBuB+VgaHNQbg6M20E5GNoclP8N2l/M+r3eKHc9IWNV6/d6I+x6QqYq1+/1RvH1hEy9cNj7KL6e - wNizME0/+HoWpukHX8/CNP3gK8NeWq13IivVStT+aPUjz6R0S/pmDUXQ5qBcG+zGQbmIr5LNaZK2YmQe - lA5K56V70hvpu9QGdgfl2mA3DsqrsTHaWO9KNvYD0iD2RKIIHS7T0h5pA6XGY3NhTtOU/Mj0h7fSFem4 - ZGfbXdIWbOsWGyNjtTGfkK5KNpcW2PzgC4Y2B+XaYDcOysHQ5gdfMLQ5KNcGu3FQDoY2P/jKMEGr9e7L - SrUStT9a/eDrWZimH3x18Ez6kX3M5af0PPtYPUzTD74qeS0dJnumVclnBu9+6UWrUiGWnQu+KrBHUGek - AaIte6N0X/LxUNqE3fz90jHpnVQJRPvBF8ttaZjINlQfkeyXfSktSA+kV5IdKSPY2lB9WLojRUOkH3yx - XCCuMiwzi46DOD/4YrHDfyuR0SjL7kzfW3AsRPrBVwUniYzGsrLIeIj0g68KFoiMRll2nqgEIv3gi+WX - dITIaJR1iMxoiPSDL5aLxFWGZWbRcRDnB18M9ixxB3EdaJvdrp6WnkhfkH0+JXlvt7Vtu2TP9qIgzg++ - GOaI6kDbRqW8y1y7XB7F3oG2zbZcERDlB18ZHkmXpLOSPVEeIqoN1e2XD7nGty9hzSNB9SHpqHROuiw9 - lkpBlB98ZeinNRf57LAPZYq2XOTbnNnDodUPvmBoK0TWp1lHEIu0FYI/GNr84AuGtkJkXc46glimrRD8 - wdDmB18wtBUia5kvIPi1OPzB0OYHXzC0FSJrY/4Eyr4gEXoStHU+lLpOgp9o9SOTvVBUBluKbEmypcmW - qLxl0Ja4IszjHqKsRvVtUswyOE+UH5nGJbud7ZZZojrQNrsQyvsSii6E5lqu7rDb6d1E5SOjvSl2Xerm - fSG7XF3zaZChbQPSlLQo2YnRZL+k1db85Q1t2ykF/cv+L5akeSls8olEIpFIJP4T+vp+A8lMcFIN42ej - AAAAAElFTkSuQmCC - - - - 62, 20 - - - Tools - - - - iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - DAAACwwBP0AiyAAAAeRJREFUeF7tzjGOIzEMAEH//9N3SaEzwzLH2plAFTZEUq/jOI7jOI5f+beZM8/l - n9s481z+uY0zz+Wf2zjzHP4VeRtnIt/HPyJv40zk+/hH5G2ciXwf/4i8jTOR/467kW/jG5H3cSfybXwj - 8j7uRL6Nb0Tex53It/GNyL9jb+RlxsasWWYs8pw9kZcZG7NmmbHIc/ZEXmZszJplxiLP2RN5mbExa5YZ - izxnT+RlxiK/5VnkZcYiz9kTeZmxyG95FnmZschz9kReZizyW55FXmYs8pw9kZcZi/yWZ5GXGYs8Z0/k - bZyJvMxY5Dl7Im/jTORlxiLP2RN5G2ciLzMWec6eyNs4E3mZschz9kS+zLqPPF9mLPKcPZEvs+4jz5cZ - izxnT+TLrPvI82XGIs/ZE/ky6z7yfJmxyHP2RL7MusiXWRd5zp7Il1kX+TLrIs/ZE/mxfDPynD2RH8s3 - I8/ZE/mxfDPynD2RH8s3I8/ZE/ky6yJfZl3kOXsiX2Zd5Musi/w79kb+mvHIXzMeeR93In/NeOSvGY+8 - jzuRb+MbkfdxJ/JtfCPy33E38jbORL6Pf0TexpnI9/GPyNs4E/k+/hF5G2ciP4d/bePMc/nnNs48l39u - 48xz+ec2zhzHcRzHcVz0ev0HFtq118xXwn0AAAAASUVORK5CYII= - - - - 60, 20 - - - Help - - - 24, 44 - - - 1016, 24 - - - 2 - - - MainMenuStrip - - - menuStrip - - - System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - 151, 22 @@ -1502,12 +167,165 @@ Mash-Up Pack + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADuSURBVFhH7ZbB + CsMgEERDbv5A/v83e2jNTmCKGdegJk0heHgUn7vrKBQyxRj/iivJPM9WMTWjc45wJeAwhAghVJEG1nkl + XNkziLCvtteXphFCfQ08nOi+4kvTeFL1NfBQ/BLuefjS9NkAADOwPnpNX14UADBEaV4mNnkygN34Y/1v + AgeWZXll9So2eTLAEVm9ik2a7g1Qgn9t9bvFV/4gAOZdHgB1RPeUEeAZAeBr0d4R4JIACuqI7ikjwDMD + tDACNAfo/Sou0fQ9wGKvoQfO8i61W6SkTXi+XtLLgOwcFSna3It3c+LKO3HlfcRpBa3JBjU5E8DiAAAA + AElFTkSuQmCC + + + + 170, 22 + + + New + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAABGSURBVDhPYxgc + 4P8Chv8YeKWUIFSaMPi/W+r//1MapOGTOixQ7UADsCkgAkO1jxoAAtgkicFQ7cPCAGLB////wXgwAQYG + AOrUrx4HdAXuAAAAAElFTkSuQmCC + + + + Ctrl+O + + + 170, 22 + + + Open + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAT + qwAAE6sBnBsJ0QAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHkSURBVFhH1ZfN + KwVRGIevBRslZUtZsPG1kEhZ21hYKfkTpMTCwoqF4l+QNbKysraU8rW1ZEEUpcg3v2fMYXLn471zz+12 + n3q6c8685z3vzJy65xRqhT45LidyytheWTKD8lR+efJEDkgTTP4kGXgj9+ROThlLDnI9SlMR7sm3ZCMd + ZUKObUnOYzrS6JHuyX1M7iDXrSR3Nx1JsGgI4tX5hpzkZo5EWLkE8f18Q05yM0cipRYwG2qhIgW8h1qo + SAHEooXYAliR93I5aBUXMCy5Pxe0ivFSwKv8lGMyWkCLvAjbizKOsguABcmNOzkdXhO8G14fyAYZB/fR + QmIBddJNdh7+noW/FNUukyAGLSQWANHXjR/SfZY0XHxb0EontQAYkm/SJV2TWRxKYi9l1t9uZgGwLgm6 + lvV0ZNAs9yVjHuSoTMJUAOthRrYGLRss0E1J8hc5JeMwFZAXCl+VTMDaWZL/qWgBjnnJAmaiFToimD/B + iGwKWvmYlM/yKmj9YSqARUTQRtDKT4fs/Ln8xVQANwki2De1UUDVt2RuU8oGslKb0i460uAQQSBbaR9F + kMNty4/oyILDA4cI9yZ4dXy/PDLWPTk5+6UJiuAQwUAf8uTmyaOwY2LRsHLzyNjUg0iVKBS+AWAi5w3z + cKwSAAAAAElFTkSuQmCC + + + + 170, 22 + + + Recently open + 160, 22 Full box support + + 170, 22 + + + Pack Settings + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4yMfEgaZUAAADfSURBVDhPYxg8 + IEt7+/x6k9t/lxQ++v/2zUc4vnv11f+Dq+79v3DgyX+QHBAwgDAGAGkGYrAiZAOOrX36v9zg/P95ebfA + ciA1uAwAS6IbcGLdS7g4zAAQhmpDAJjEjIS7/1+//AA34MH1d2BDLh98DZYjaECN0bX/BTpHsGKQHEED + iMVQbQgAEtw39zmK/7FhkBqcBoD8+vjh8//nz1zFikFysECFakMAmAEvnr35f//OY6wYJEdTA/6CJLH5 + GxlDDfgL1YYAWdpb52+bdf0vNr8jY5AaULKHahtwwMAAAPeIxBbbnvcfAAAAAElFTkSuQmCC + + + + Ctrl+Shift+S + + + 170, 22 + + + Save + + + + False + + + 170, 22 + + + Save As + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAn + WwAAJ1sB4ns9eAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANoSURBVHhe7Zs7 + j01RGIbH/U6EKIRGFAoVnYIECXG/K/wG0dMpNQqRoJWIW4KIRCgURKIgKJQqChEFkaBweZ9ikpM975o5 + Z+9vrb0l+0meZs6Z/a3vnX1de81YT09PT08ZlsoT8ry8Jm/W8IrcLv8r5siz8rv8G+AfeVz+FyyTT6Vr + pIlss/Owy7+UroGmpgLYIt/Ib/K2XC5bYbF8Id3gm8ohcExW2S1/ysHvct4ozkL5TA4OZNBP8r6snuCG + kZPgNlnFNY9fZVHmyyeyOpBxr0sCiiTVPL6SxZgrH0k3ELwhZ8hIJmuen2+WRZgt2a3dQPCOnCUj2Sl/ + SFfvl9wni0BjNOgGgg8kAUUy2V8eT8oisEuza7tBIIcEh0YkUzWPR2V2psur0g0AuRJEn/Am2+0HzR7A + NHlJuuL4XC6SkQzbPGYNgOYvSlcYufRwFxjJKM1j1gBOS1cUczQ/1aXO/TxbABvlb+mKvpU8/EQyVfN8 + 7j7LFsA96Qq+kytkJMM0D+7zLAFwUuMGo1rsvVwpIxm2eXDfyRLAJumK7ZCRjNI8uO8dkeEckK7YPBnF + qM1zRXLfzRIAG3XFGEQEde7tUwEcluHkDKDugw13o+53sgTARl2xpgHUbR5SARyS4aQCYBB1adI88DDm + fjdLAGzUFasbQNPmoRMB1JnliWgeUgEclOFEBRDVPMyUbjtZAmCjrtgoAUQ2D6kAuGcJJxUAgxiG6OaB + 6Ti3vSwBpO4EhwkgR/PQiQCmmu3N1TykAtgvw6kTQM7mgdlmt+0sAfBKqlqI5lL3AaM+2NShaABL5Gc5 + WOiudJRoHooGAMwJ8Mqbl468fnazQKWaBxZfuDpND63a5D7mq6QC2CuLU7p54K2Tq1c8gDaah04E0Fbz + kApgjyxCm80D85GudpEA2m4eWgugC80DS3LcGCIvtRPoSvNQPIAuNQ+pAHbJcLrWPCyQbjzhAXSxeSgS + AMtPU/f26FZtlmKVdGPaKsNg7a0rMi4LJtrijHRjWivDYOGxKzLoa/lY8oRYXd4aLTWoRU03lo+yycua + CdySrlBXPSdDYck5qTMHwOFAwq5wF/wgo9coTWC9/CLdANqU2aoNsgir5UPpBtKGrEhdI4uzTp6SF+Rl + WfefoUaRGtSiJrUZQ09PT0/P6IyN/QP3CwGw14CDlAAAAABJRU5ErkJggg== + + + + 170, 22 + + + Close + + + False + + + 170, 22 + + + Close all + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEkSURBVFhH7ZfN + asJAFEbzEoo/b6QU36a6LhR8IzdKlVJoQTd24WuUtpuu9Dsjs5FI594ZCEQPHHBg7s2XxISb6k4CE7mW + v/KYKHtf5IPMYi7rDmDxWbrgzGnwJx/lQKbC3qmklh5jaYbLTjGNvFBLj1VYGfmRFPfDykdP0uM7rIxQ + iLm4+7QmAI8jmikVwE0rAizkVnbDykiJABycHp/SHKJEgI7cS/ocpOmd8l+AjYx7Un2XycSia3gCfMhk + YlEOl7eAV3MyJQLsJD0a+xNyyRt9DLNoTYA3+Xr+aaNUAHefxgPEkcwyjF4ylPT4CisjDBEU5wylM0mP + ZVgZ4aOCYkZrQuSM5SPpgo8KGuT4JLPgo4K5ntG67gB1spfL7j7zW6GqTtAaslLCb2cpAAAAAElFTkSu + QmCC + + + + 170, 22 + + + Exit + + + 37, 20 + + + File + False @@ -1657,7 +475,7 @@ - Control+Q + Ctrl+Q 192, 22 @@ -1665,10 +483,16 @@ Quick Change + + 39, 20 + + + Edit + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA - rgAAAK4B+ff3XQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHrSURBVFhH7dZB + qAAAAKgBefSzxgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHrSURBVFhH7dZB KCVxAMfxhyinTbQHXOyFLW1JbW1tkshBIuHi4LxtOWhbm/ZkLw6iOEgpJyUHJScUUqK4bBSrlCthV3bb k13f3zP/Z+b5z/PGvMfl/epTM/znP795b95/JpJJEilHD/p8tCMfaUkF/uL/A5aQlujKdYJ52K5eDqAx DUh5PkGTq4hfOqEx6ygIIAvWvMUYJrAJTb7h7MswqmGSjT1oXBDnaIYnRbiC7QA3jSmGSSV0HxwFcI1D @@ -1686,12 +510,6 @@ Pck Manager - - 161, 22 - - - Audio Converter - 145, 22 @@ -1704,6 +522,40 @@ Binka -> Wav + + 161, 22 + + + Audio Converter + + + + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + DAAACwwBP0AiyAAAA6pJREFUeF7tms9vDVEYhouqpFZVRFpdd+cPkFphQeKPqIUfSVl0Y9OQWNpXE/ak + SEhYkEjZUFZERCxtCaKKWKDe787jpNftmTlzz4x0rvMkb3Lzzfu9c8690zkz0+lLJBKJRCKRqIOVlZUx + 6Yb0WSqL9dyUxolrFhq4Tf6DFMtHaYzY5qBB2y9fFdeIbQ4adDeHvY8lYpsDA3dQDoY2B+XmwLgdlIOh + zUG5OTBuB+VgaHNQbg6M20E5GNoclP8N2l/M+r3eKHc9IWNV6/d6I+x6QqYq1+/1RvH1hEy9cNj7KL6e + wNizME0/+HoWpukHX8/CNP3gK8NeWq13IivVStT+aPUjz6R0S/pmDUXQ5qBcG+zGQbmIr5LNaZK2YmQe + lA5K56V70hvpu9QGdgfl2mA3DsqrsTHaWO9KNvYD0iD2RKIIHS7T0h5pA6XGY3NhTtOU/Mj0h7fSFem4 + ZGfbXdIWbOsWGyNjtTGfkK5KNpcW2PzgC4Y2B+XaYDcOysHQ5gdfMLQ5KNcGu3FQDoY2P/jKMEGr9e7L + SrUStT9a/eDrWZimH3x18Ez6kX3M5af0PPtYPUzTD74qeS0dJnumVclnBu9+6UWrUiGWnQu+KrBHUGek + AaIte6N0X/LxUNqE3fz90jHpnVQJRPvBF8ttaZjINlQfkeyXfSktSA+kV5IdKSPY2lB9WLojRUOkH3yx + XCCuMiwzi46DOD/4YrHDfyuR0SjL7kzfW3AsRPrBVwUniYzGsrLIeIj0g68KFoiMRll2nqgEIv3gi+WX + dITIaJR1iMxoiPSDL5aLxFWGZWbRcRDnB18M9ixxB3EdaJvdrp6WnkhfkH0+JXlvt7Vtu2TP9qIgzg++ + GOaI6kDbRqW8y1y7XB7F3oG2zbZcERDlB18ZHkmXpLOSPVEeIqoN1e2XD7nGty9hzSNB9SHpqHROuiw9 + lkpBlB98ZeinNRf57LAPZYq2XOTbnNnDodUPvmBoK0TWp1lHEIu0FYI/GNr84AuGtkJkXc46glimrRD8 + wdDmB18wtBUia5kvIPi1OPzB0OYHXzC0FSJrY/4Eyr4gEXoStHU+lLpOgp9o9SOTvVBUBluKbEmypcmW + qLxl0Ja4IszjHqKsRvVtUswyOE+UH5nGJbud7ZZZojrQNrsQyvsSii6E5lqu7rDb6d1E5SOjvSl2Xerm + fSG7XF3zaZChbQPSlLQo2YnRZL+k1db85Q1t2ykF/cv+L5akeSls8olEIpFIJP4T+vp+A8lMcFIN42ej + AAAAAElFTkSuQmCC + + + + 62, 20 + + + Tools + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -2217,20 +1069,6 @@ About - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 - jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq - myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp - JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC - - - - 205, 22 - - - Tutorials - 312, 22 @@ -2273,6 +1111,38 @@ How PCKs work + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAKdJREFUOE+1 + jzEKwzAQBNUEXKQIBOwifcgTUvkDbt2p9qP0Ev1E31FYkVXOx2FLRRYWi7NnTnZ/z/MxZPY7aguhbZlq + myQafL+ubRINshCwnO0kFqi3HkpwWOf7DkC1RBfvx9slV4ElscqbxBiz9/4nwOBIQjCEUL7FswhwDYAp + JVMiN0oYs/ILiCXRIGHOwVQBoiXsKSgjJdzaBMpQ0g3KEOoG++PcBx9PFJGNjU4vAAAAAElFTkSuQmCC + + + + 205, 22 + + + Tutorials + + + 233, 22 + + + Nobledez (Original Developer) + + + 233, 22 + + + PhoenixARC (Developer) + + + 233, 22 + + + MattNL (Other Developer) + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIBCAYAAAA/JAdfAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAN @@ -2571,24 +1441,6 @@ Support a Developer - - 233, 22 - - - Nobledez (Original Developer) - - - 233, 22 - - - PhoenixARC (Developer) - - - 233, 22 - - - MattNL (Other Developer) - iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -3045,159 +1897,67 @@ Settings - - 298, 17 - - - 182, 92 - - - contextMenuMetaTree - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL + DAAACwwBP0AiyAAAAeRJREFUeF7tzjGOIzEMAEH//9N3SaEzwzLH2plAFTZEUq/jOI7jOI5f+beZM8/l + n9s481z+uY0zz+Wf2zjzHP4VeRtnIt/HPyJv40zk+/hH5G2ciXwf/4i8jTOR/467kW/jG5H3cSfybXwj + 8j7uRL6Nb0Tex53It/GNyL9jb+RlxsasWWYs8pw9kZcZG7NmmbHIc/ZEXmZszJplxiLP2RN5mbExa5YZ + izxnT+RlxiK/5VnkZcYiz9kTeZmxyG95FnmZschz9kReZizyW55FXmYs8pw9kZcZi/yWZ5GXGYs8Z0/k + bZyJvMxY5Dl7Im/jTORlxiLP2RN5G2ciLzMWec6eyNs4E3mZschz9kS+zLqPPF9mLPKcPZEvs+4jz5cZ + izxnT+TLrPvI82XGIs/ZE/ky6z7yfJmxyHP2RL7MusiXWRd5zp7Il1kX+TLrIs/ZE/mxfDPynD2RH8s3 + I8/ZE/mxfDPynD2RH8s3I8/ZE/ky6yJfZl3kOXsiX2Zd5Musi/w79kb+mvHIXzMeeR93In/NeOSvGY+8 + jzuRb+MbkfdxJ/JtfCPy33E38jbORL6Pf0TexpnI9/GPyNs4E/k+/hF5G2ciP4d/bePMc/nnNs48l39u + 48xz+ec2zhzHcRzHcVz0ev0HFtq118xXwn0AAAAASUVORK5CYII= - - 181, 22 + + 60, 20 - - Add Entry + + Help - - 160, 22 + + 14, 3 - - Add Entry + + 0, 6, 60, 0 - - 160, 22 + + 326, 24 - - Add BOX Entry - - - 160, 22 - - - Add ANIM Entry - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAABSSURBVDhP5c0x - DsAgDENRxt7/wmkNSpRGf0CCCZAegxNMM7MlGMp3dIU6dxhKf/QMNxRogeQC8ivw5Vn7C0heJlFA+kL5 - jWAohxRkde4wnGftBS90axNmphIGAAAAAElFTkSuQmCC - - - - 181, 22 - - - Add Multiple Entries - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xMkMEa+wAAACESURBVDhPlY0B - DoAgDAP3Dj7r09WTkqGUgJfUxtrOmHFEnL0U76FBqW8PZXmk/9uONEsIb3gsNRzoL/+R5hWC759mGsbQ - DnzdZbhmiSvhLsM1S1wJdxmuWeJKuMtwzRJXwl2Ga5a4Eu4yXLPElXCX4Zol/WCl6YGdI62n2Zv2cSXV - byIunLh7mD2ySLcAAAAASUVORK5CYII= - - - - 181, 22 - - - Delete Entry - - - 181, 22 - - - Edit All Entries - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 - - - editorTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 1 - - - Fill - - - 20, 30 - - - 0, 0, 0, 0 - - - 1024, 600 - - - 0 - - - tabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - - 4 - - - pckOpen - - - System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - + 2 - - label5 + + MainMenuStrip - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + menuStrip - - openTab + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3 + + $this + + + 0 + + + True + + + 18, 11 + + + 116, 19 + + + 11 + + + PCK Studio: 1.3.3.7 labelVersion @@ -3206,10 +1966,64 @@ MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - openTab + StartPage - 4 + 2 + + + Top, Right + + + True + + + 572, 11 + + + 81, 19 + + + 23 + + + Whats New? + + + MiddleCenter + + + label5 + + + MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + StartPage + + + 3 + + + Right + + + Segoe UI, 8.25pt + + + 593, 0 + + + 0, 0, 30, 30 + + + 423, 558 + + + 22 + + + ChangelogRichTextBox @@ -3218,34 +2032,10 @@ System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - openTab + StartPage - 5 - - - 4, 38 - - - 18, 30, 20, 5 - - - 1016, 558 - - - 1 - - - openTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - tabControl - - - 0 + 4 None @@ -4238,13 +3028,13 @@ NoControl - 18, 30 + 0, 0 20, 20, 20, 20 - 534, 523 + 534, 558 Zoom @@ -4259,628 +3049,64 @@ System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - openTab + StartPage - 2 - - - Top, Right - - - True - - - 572, 11 - - - 81, 19 - - - 23 - - - Whats New? - - - MiddleCenter - - - label5 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 3 - - - True - - - 18, 11 - - - 116, 19 - - - 11 - - - PCK Studio: 1.3.3.7 - - - labelVersion - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - openTab - - - 4 - - - Right - - - Segoe UI, 8.25pt - - - 573, 30 - - - 0, 0, 30, 30 - - - 423, 523 - - - 22 - - - - - - ChangelogRichTextBox - - - System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - openTab - - 5 - - True - - - None - - - pckFileLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 2 - - - labelImageSize - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 3 - - - fileEntryCountLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 4 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - - - label11 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 6 - - - treeViewMain - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editorTab - - - 7 - - - previewPictureBox - - - PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null - - - editorTab - - - 9 - - + 4, 38 - - 5, 50, 5, 7 - - + 1016, 558 - + 0 - - editorTab + + Start Page - + + StartPage + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - + tabControl - + + 0 + + + Fill + + + 20, 30 + + + 0, 0, 0, 0 + + + 1024, 600 + + + 0 + + + tabControl + + + PckStudio.Controls.CustomTabControl, PCK-Studio, Version=7.0.0.2, Culture=neutral, PublicKeyToken=null + + + $this + + 1 - - 3, 17 - - - 332, 23 - - - 2 - - - pckFileLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 2 - - - Top, Right - - - True - - - 935, 252 - - - 0, 0 - - - 19 - - - labelImageSize - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 3 - - - Top, Right - - - True - - - 913, 53 - - - 0, 0 - - - 17 - - - fileEntryCountLabel - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 4 - - - Top, Bottom, Right - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - 338, 277 - - - 671, 282 - - - 11 - - - PropertiesTabControl - - - MetroFramework.Controls.MetroTabControl, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - editorTab - - - 5 - - - metroLabel2 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 2 - - - treeMeta - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MetaTab - - - 3 - - - entryTypeTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 4 - - - entryDataTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 5 - - - buttonEdit - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 6 - - - metroLabel1 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 7 - - - 4, 38 - - - 3, 3, 3, 3 - - - 663, 240 - - - 0 - - - Properties - - - MetaTab - - - MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - PropertiesTabControl - - - 0 - - - Top, Right - - - True - - - 288, 119 - - - 0, 0 - - - 15 - - - metroLabel2 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 2 - - - Left - - - False - - - 3, 3 - - - 204, 234 - - - 0 - - - treeMeta - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - MetaTab - - - 3 - - - Top, Right - - - - - - NoControl - - - 199, 1 - - - 21, 21 - - - 1 - - - False - - - False - - - 283, 119 - - - 186, 23 - - - 21 - - - entryTypeTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 4 - - - Top, Right - - - - - - NoControl - - - 199, 1 - - - 21, 21 - - - 1 - - - False - - - False - - - 283, 151 - - - 186, 23 - - - 16 - - - entryDataTextBox - - - MetroFramework.Controls.MetroTextBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 5 - - - Bottom, Right - - - 283, 180 - - - 186, 60 - - - 20 - - - buttonEdit - - - False - - - buttonEdit - - - MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 6 - - - Top, Right - - - True - - - 288, 68 - - - 0, 0 - - - 13 - - - metroLabel1 - - - MetroFramework.Controls.MetroLabel, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - MetaTab - - - 7 + + None True @@ -4907,113 +3133,26 @@ editorTab - 6 - - - Top, Bottom, Left, Right - - - False - - - 0 - - - 467, 14 - - - 32, 32 - - - 5, 50 - - - 0, 0, 0, 0 - - - 0 - - - 330, 501 - - - 10 - - - treeViewMain - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editorTab - - - 7 - - - Top, Right - - - None - - - NoControl - - - 345, 50 - - - 231, 218 - - - Zoom - - - 18 - - - previewPictureBox - - - PckStudio.ToolboxItems.InterpolationPictureBox, PCK-Studio, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null - - - editorTab - - - 9 - - - Top, Right - - - True - - - 826, 49 - - - 207, 15 - - - 21 - - - Open/Save as Switch/Vita/PS4/Xbox One PCK - - - LittleEndianCheckBox - - - MetroFramework.Controls.MetroCheckBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - - - $this - - 2 + + 4, 38 + + + 5, 50, 5, 7 + + + 1016, 558 + + + 0 + + + editorTab + + + MetroFramework.Controls.MetroTabPage, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + True @@ -7568,282 +5707,6 @@ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - createToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - folderToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - skinToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - createAnimatedTextureToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - audiopckToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - colourscolToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - CreateSkinsPCKToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - behavioursbinToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - entityMaterialsbinToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - importSkinsToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - importSkinToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - importExtractedSkinsFolderToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addTextureToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - exportToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - as3DSTextureFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - setFileTypeToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - skinToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - capeToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - textureToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - languagesFileLOCToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gameRulesFileGRFToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - audioPCKFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - coloursCOLFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - gameRulesHeaderGRHToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - skinsPCKToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - modelsFileBINToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - behavioursFileBINToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - entityMaterialsFileBINToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator5 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - generateMipMapTextureToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - viewFileInfoToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - correctSkinDecimalsToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - setSubPCKEndiannessToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - bigEndianXbox360PS3WiiUToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - littleEndianPS4PSVitaSwitchToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - setModelContainerFormatToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - version1ToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - version2ToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - version3114ToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator6 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - extractToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - cloneFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - renameFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - replaceToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - deleteFileToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - fileToolStripMenuItem @@ -7898,24 +5761,30 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - saveToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - saveToolStripMenuItem System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + saveAsToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + closeToolStripMenuItem System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + closeAllToolStripMenuItem + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + exitToolStripMenuItem @@ -8072,58 +5941,10 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - addEntryToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addBOXEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addANIMEntryToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - addMultipleEntriesToolStripMenuItem1 - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - deleteEntryToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - editAllEntriesToolStripMenuItem - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - imageList - - - System.Windows.Forms.ImageList, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - MainForm MetroFramework.Forms.MetroForm, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - + \ No newline at end of file diff --git a/PCK-Studio/PckStudio.csproj b/PCK-Studio/PckStudio.csproj index 30f83256..a19172de 100644 --- a/PCK-Studio/PckStudio.csproj +++ b/PCK-Studio/PckStudio.csproj @@ -108,6 +108,7 @@ Properties\app.manifest + @@ -135,10 +136,22 @@ - - - - + + Component + + + UserControl + + + Form + + + + UserControl + + + PckEditor.cs + Form @@ -151,32 +164,39 @@ ContributorsForm.cs - - - - - - - - - - - - - - - - - - - - - + + Form + + + ModelEditor.cs + + + + + + + + True True Resources.resx + + UserControl + + + ModelRenderer.cs + + + UserControl + + + UserControl + + + SkinRenderer.cs + Component @@ -193,11 +213,6 @@ Component - - - - - Form @@ -210,75 +225,19 @@ AppSettingsForm.cs - Form TextureAtlasEditor.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Component - - - ModelView.cs - - - - - - - - - - - UserControl CemuPanel.cs - - - - - - - - Form @@ -310,7 +269,6 @@ MultiTextPrompt.cs - Component @@ -411,17 +369,11 @@ MainForm.cs - + Form - - generateModel.cs - - - Form - - - SkinPreview.cs + + CustomSkinEditor.cs Form @@ -441,16 +393,20 @@ AudioEditor.cs - - + + PckEditor.cs + FilterPrompt.cs ContributorsForm.cs + + ModelEditor.cs + CemuPanel.cs @@ -554,14 +510,12 @@ MainForm.cs Designer - - generateModel.cs + + CustomSkinEditor.cs - - generateModel.cs - - - SkinPreview.cs + + CustomSkinEditor.cs + Designer AnimationEditor.cs @@ -578,6 +532,12 @@ Designer Resources.Designer.cs + + ModelRenderer.cs + + + SkinRenderer.cs + GithubUserPanel.cs @@ -609,6 +569,18 @@ + + + + + + + + + + + + @@ -665,6 +637,8 @@ + + @@ -684,17 +658,11 @@ 1.0.5 - - 1.9.2 - 5.8.0-alpha0098 compile; runtime; build; native; contentfiles; analyzers; buildtransitive all - - 1.2.1.24 - 1.2.0.3 @@ -733,6 +701,18 @@ + + {345eabed-f0d1-4d04-b409-babdef747352} + PckStudio.Core + + + {b1e19d0f-6dd5-4d91-9b45-9818759ca8ef} + PckStudio.Rendering + + + {43bcacd7-5405-4499-9b45-e1435ac03c26} + PckStuido.ModelSupport + {693AEBC1-293D-4DF0-BCAE-26A1099FE7BB} OMI Filetype Library diff --git a/PCK-Studio/Program.cs b/PCK-Studio/Program.cs index 64c19d7e..5d11a7d5 100644 --- a/PCK-Studio/Program.cs +++ b/PCK-Studio/Program.cs @@ -2,8 +2,11 @@ using System.Diagnostics; using System.IO; using System.Windows.Forms; -using PckStudio.Internal.Misc; using PckStudio.Internal.App; +using System.Linq; +using PckStudio.Internal; +using PckStudio.Core.App; +using PckStudio.Properties; namespace PckStudio @@ -26,15 +29,17 @@ namespace PckStudio [STAThread] static void Main(string[] args) { - Updater.Initialize(RawProjectUrl); + Updater.Initialize(RawProjectUrl, Settings.Default.AutoUpdate); ApplicationScope.Initialize(); Trace.TraceInformation("Startup"); RPC.Initialize(); MainInstance = new MainForm(); Updater.SetOwner(MainInstance); - if (args.Length > 0 && File.Exists(args[0]) && args[0].EndsWith(".pck")) - MainInstance.InitPckFromFile(args[0]); + if (args.Length > 0) + { + MainInstance.LoadPckFromFile(args.Where(arg => File.Exists(arg) && arg.EndsWith(".pck"))); + } Application.ApplicationExit += (sender, e) => { RPC.Deinitialize(); }; MainInstance.FocusMe(); Application.Run(MainInstance); diff --git a/PCK-Studio/Properties/Resources.Designer.cs b/PCK-Studio/Properties/Resources.Designer.cs index 27cbbf9d..58faab03 100644 --- a/PCK-Studio/Properties/Resources.Designer.cs +++ b/PCK-Studio/Properties/Resources.Designer.cs @@ -70,16 +70,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap additional_map_icons_atlas { - get { - object obj = ResourceManager.GetObject("additional_map_icons_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -93,51 +83,19 @@ namespace PckStudio.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap ARROW { + public static System.Drawing.Bitmap armor { get { - object obj = ResourceManager.GetObject("ARROW", resourceCulture); + object obj = ResourceManager.GetObject("armor", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "base", - /// "displayName": "Base", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "Banner_White", - /// "variants": [ - /// "Banner_Black", - /// "Banner_Blue", - /// "Banner_Brown", - /// "Banner_Cyan", - /// "Banner_Gray", - /// "Banner_Green", - /// "Banner_Light_Blue", - /// "Banner_Lime", - /// "Banner_Magenta", - /// "Banner_Orange", - /// "Banner_Pink", - /// "Banner_Purple", - /// "Banner_Red", - /// "Ban [rest of string was truncated]";. - /// - public static string bannerData { - get { - return ResourceManager.GetString("bannerData", resourceCulture); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap banners_atlas { + public static System.Drawing.Bitmap ARROW { get { - object obj = ResourceManager.GetObject("banners_atlas", resourceCulture); + object obj = ResourceManager.GetObject("ARROW", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -192,38 +150,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "Tile data research by MattNL", - /// "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", - /// "entries": [ - /// { - /// "internalName": "grass_top", - /// "displayName": "Grass Block (Top)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "Grass_Common", - /// "variants": [ - /// "Grass_Common", - /// "Grass_Mesa", - /// "Grass_Swamp1", - /// "Grass_Swamp2" - /// ] - /// } - /// }, - /// { - /// "internalName": "stone", - /// "displayName": "Stone" - /// }, - /// { - /// "internalName": [rest of string was truncated]";. - /// - public static string blockData { - get { - return ResourceManager.GetString("blockData", resourceCulture); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -235,9 +161,8 @@ namespace PckStudio.Properties { } /// - /// Looks up a localized string similar to 7.0 (IN DEVELOPMENT) + /// Looks up a localized string similar to 7.0.0.0 ///==================== - ///Some features may be completely missing or incomplete at this point in time! /// ///-Added .3dst (3DS Texture) support ///-Semi-added Sub-Pck editing @@ -248,7 +173,8 @@ namespace PckStudio.Properties { ///-Massive codebase overhaul and optimization lead by miku-666 (aka NessieHax)!!! ///-Some UI redesigned by yaboiFoxx ///-Improved the changelog! - ///-New icons for each o [rest of string was truncated]";. + ///-New icons for each of the file types, with unique image icons for skin, texture, and cape files + ///-Added the abili [rest of string was truncated]";. /// public static string CHANGELOG { get { @@ -299,9 +225,9 @@ namespace PckStudio.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap Comparison { + public static System.Drawing.Bitmap DefaultSkyTexture { get { - object obj = ResourceManager.GetObject("Comparison", resourceCulture); + object obj = ResourceManager.GetObject("DefaultSkyTexture", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -446,88 +372,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap experience_orbs_atlas { - get { - object obj = ResourceManager.GetObject("experience_orbs_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "experience_orb_0", - /// "displayName": "Experience Orb (Size 1)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "experience_orb", - /// "variants": ["experience_orb"] - /// } - /// }, - /// { - /// "internalName": "experience_orb_1", - /// "displayName": "Experience Orb (Size 2)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "experience_orb", - /// "variants": ["experience_orb"] - /// } - /// }, - /// { - /// " [rest of string was truncated]";. - /// - public static string experienceOrbData { - get { - return ResourceManager.GetString("experienceOrbData", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "explosion_0", - /// "displayName": "Explosion (Stage 1)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "Particle_Explode", - /// "variants": [ - /// "Particle_Explode", - /// "Particle_HugeExplosion" - /// ] - /// } - /// }, - /// { - /// "internalName": "explosion_1", - /// "displayName": "Explosion (Stage 2)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "Particle_Explode", - /// "variants": [ - /// [rest of string was truncated]";. - /// - public static string explosionData { - get { - return ResourceManager.GetString("explosionData", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap explosions_atlas { - get { - object obj = ResourceManager.GetObject("explosions_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -608,6 +452,47 @@ namespace PckStudio.Properties { } } + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) out vec4 color; + /// + ///uniform sampler2D screenTexture; + /// + ///in vec2 texCoords; + /// + ///void main() + ///{ + /// vec3 texColor = texture(screenTexture, texCoords).rgb; + /// color = vec4(texColor, 1.0); + ///}. + /// + public static string framebufferFragmentShader { + get { + return ResourceManager.GetString("framebufferFragmentShader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) in vec4 a_PosAndTexCoord; + /// + ///out vec2 texCoords; + /// + ///void main() + ///{ + /// vec2 pos = a_PosAndTexCoord.xy; + /// texCoords = a_PosAndTexCoord.zw; + /// gl_Position = vec4(pos, 0.0, 1.0); + ///};. + /// + public static string framebufferVertexShader { + get { + return ResourceManager.GetString("framebufferVertexShader", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -658,44 +543,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "Tile data research by MattNL", - /// "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", - /// "entries": [ - /// { - /// "internalName": "helmetCloth", - /// "displayName": "Leather Cap", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "hasCustomColour": true, - /// "defaultName": "Armour_Default_Leather_Colour", - /// "variants": [ "Armour_Default_Leather_Colour" ] - /// } - /// }, - /// { - /// "internalName": "helmetChain", - /// "displayName": "Chain Helmet" - /// }, - /// { - /// "internalName": " [rest of string was truncated]";. - /// - public static string itemData { - get { - return ResourceManager.GetString("itemData", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap items_atlas { - get { - object obj = ResourceManager.GetObject("items_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -706,53 +553,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap map_icons_atlas { - get { - object obj = ResourceManager.GetObject("map_icons_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "player_1", - /// "displayName": "Player 1" - /// }, - /// { - /// "internalName": "player_2", - /// "displayName": "Player 2" - /// }, - /// { - /// "internalName": "player_3", - /// "displayName": "Player 3" - /// }, - /// { - /// "internalName": "player_4", - /// "displayName": "Player 4" - /// }, - /// { - /// "internalName": "target_x", - /// "displayName": "Unused" - /// }, - /// { - /// "internalName": "target_point", - /// "displayName": "Target Point (Unused)" - /// }, - /// { - /// [rest of string was truncated]";. - /// - public static string mapIconData { - get { - return ResourceManager.GetString("mapIconData", resourceCulture); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -763,50 +563,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap moon_phases_atlas { - get { - object obj = ResourceManager.GetObject("moon_phases_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "moon_phase_0", - /// "displayName": "Full Moon" - /// }, - /// { - /// "internalName": "moon_phase_1", - /// "displayName": "Waning Gibbous" - /// }, - /// { - /// "internalName": "moon_phase_2", - /// "displayName": "Last Quarter" - /// }, - /// { - /// "internalName": "moon_phase_3", - /// "displayName": "Waning Crescent" - /// }, - /// { - /// "internalName": "moon_phase_4", - /// "displayName": "New Moon" - /// }, - /// { - /// "internalName": "moon_phase_5", - /// "displayName": [rest of string was truncated]";. - /// - public static string moonPhaseData { - get { - return ResourceManager.GetString("moonPhaseData", resourceCulture); - } - } - /// /// Looks up a localized resource of type System.Byte[]. /// @@ -847,88 +603,6 @@ namespace PckStudio.Properties { } } - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "Kebab", - /// "displayName": "\"Kebab med tre pepperoni\" by Kristoffer Zetterstrand" - /// }, - /// { - /// "internalName": "Aztec", - /// "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" - /// }, - /// { - /// "internalName": "Alban", - /// "displayName": "\"Albanian\" by Kristoffer Zetterstrand" - /// }, - /// { - /// "internalName": "Aztec2", - /// "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" - /// }, - /// { - /// "internalName": "Bomb", - /// "disp [rest of string was truncated]";. - /// - public static string paintingData { - get { - return ResourceManager.GetString("paintingData", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap paintings_atlas { - get { - object obj = ResourceManager.GetObject("paintings_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to { - /// "COMMENT_1": "JSON by MattNL", - /// "entries": [ - /// { - /// "internalName": "generic_0", - /// "displayName": "Generic (Stage 1)", - /// "hasColourEntry": true, - /// "colourEntry": { - /// "defaultName": "None", - /// "variants": [ - /// "None", - /// "Particle_Smoke", - /// "Particle_NetherPortal", - /// "Particle_EnderPortal", - /// "Particle_Ender", - /// "Particle_DragonBreathMin", - /// "Particle_DragonBreathMax" - /// ] - /// } - /// }, - /// { - /// "internalName": "generic_1", - /// "displayName": "Generic (Stage 2)", - /// [rest of string was truncated]";. - /// - public static string particleData { - get { - return ResourceManager.GetString("particleData", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap particles_atlas { - get { - object obj = ResourceManager.GetObject("particles_atlas", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -969,6 +643,50 @@ namespace PckStudio.Properties { } } + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) out vec4 FragColor; + /// + ///uniform vec4 BlendColor; + ///uniform float Intensity; + /// + ///in vec4 color; + /// + ///void main() + ///{ + /// FragColor = vec4((color * BlendColor).rgb, Intensity); + ///}. + /// + public static string plainColorFragmentShader { + get { + return ResourceManager.GetString("plainColorFragmentShader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) in vec4 a_Pos; + ///layout(location = 1) in vec4 a_Color; + /// + ///uniform mat4 ViewProjection; + ///uniform mat4 Transform; + /// + ///out vec4 color; + /// + ///void main() + ///{ + /// color = a_Color; + /// gl_Position = ViewProjection * Transform * vec4(a_Pos.xyz, 1.0); + ///};. + /// + public static string plainColorVertexShader { + get { + return ResourceManager.GetString("plainColorVertexShader", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// @@ -1009,6 +727,16 @@ namespace PckStudio.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Save { + get { + object obj = ResourceManager.GetObject("Save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -1030,21 +758,54 @@ namespace PckStudio.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) out vec4 color; + /// + ///uniform samplerCube skybox; + ///uniform float brightness; + /// + ///in vec3 texCoords; + /// + ///void main() + ///{ + /// color = vec4(texture(skybox, texCoords).rgb * clamp(brightness, 0.0, 1.0), 1.0); + ///}. /// - public static System.Drawing.Bitmap slim_template { + public static string skyboxFragmentShader { get { - object obj = ResourceManager.GetObject("slim_template", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("skyboxFragmentShader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) in vec4 a_Pos; + /// + ///uniform mat4 ViewProjection; + /// + ///out vec3 texCoords; + /// + ///void main() + ///{ + /// vec4 pos = ViewProjection * a_Pos; + /// gl_Position = vec4(pos.x, pos.y, pos.ww); + /// texCoords = vec3(a_Pos.xy, -a_Pos.z); + ///};. + /// + public static string skyboxVertexShader { + get { + return ResourceManager.GetString("skyboxVertexShader", resourceCulture); } } /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - public static System.Drawing.Bitmap terrain_atlas { + public static System.Drawing.Bitmap slim_template { get { - object obj = ResourceManager.GetObject("terrain_atlas", resourceCulture); + object obj = ResourceManager.GetObject("slim_template", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -1060,12 +821,87 @@ namespace PckStudio.Properties { } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) out vec4 color; + /// + ///uniform sampler2D Texture; + /// + ///in vec2 o_TillingFactor; + ///in vec2 o_TexCoord; + /// + ///void main() + ///{ + /// vec4 result = texture(Texture, o_TexCoord * o_TillingFactor); + /// if (result.a <= 0.0) + /// discard; + /// color = result; + ///};. /// - public static System.Drawing.Bitmap TexturePackIcon { + public static string texturedCubeFragmentShader { get { - object obj = ResourceManager.GetObject("TexturePackIcon", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("texturedCubeFragmentShader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout (triangles) in; + ///layout (triangle_strip, max_vertices=3) out; + /// + ///uniform vec2 TexSize; + /// + ///out vec2 o_TexCoord; + ///out vec2 o_TillingFactor; + /// + ///in geometryData + ///{ + /// vec2 TexCoord; + ///} dataIn[]; + /// + ///void FixUV() + ///{ + /// bool isXBad = + /// dataIn[0].TexCoord.x >= TexSize.x && + /// dataIn[1].TexCoord.x >= TexSize.x && + /// dataIn[2].TexCoord.x >= TexSize.x; + /// + /// gl_Position = gl_in[0].gl_Position; + /// o_TexCoord = dataIn[0].TexCoord; + /// if (isXBad) + /// o_TexCoord.x = mod(o_TexCoord.x, TexSize.x); + /// Em [rest of string was truncated]";. + /// + public static string texturedCubeGeometryShader { + get { + return ResourceManager.GetString("texturedCubeGeometryShader", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to #version 330 core + /// + ///layout(location = 0) in vec3 vertexPosition; + ///layout(location = 1) in vec2 texCoord; + /// + ///uniform mat4 ViewProjection; + ///uniform mat4 Transform; + /// + ///out geometryData + ///{ + /// vec2 TexCoord; + ///} dataOut; + /// + ///void main() + ///{ + /// dataOut.TexCoord = texCoord; + /// gl_Position = ViewProjection * Transform * vec4(vertexPosition, 1.0); + ///};. + /// + public static string texturedCubeVertexShader { + get { + return ResourceManager.GetString("texturedCubeVertexShader", resourceCulture); } } diff --git a/PCK-Studio/Properties/Resources.resx b/PCK-Studio/Properties/Resources.resx index bc72525c..0028ccd6 100644 --- a/PCK-Studio/Properties/Resources.resx +++ b/PCK-Studio/Properties/Resources.resx @@ -130,6 +130,12 @@ ..\Resources\NoImageFound.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\shader\skyboxVertexShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\..\ProjectLogo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\HamburgerMenuIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -139,12 +145,6 @@ ..\Resources\fileTemplates\tu51colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\atlases\banners.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\icons\file_copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\iconImageList\ZZFolder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -154,11 +154,8 @@ ..\Resources\iconImageList\TEXTURE ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\fileTemplates\tu32colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\atlases\moonPhaseData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\icons\file_copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\iconImageList\PCK ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -166,8 +163,11 @@ ..\Resources\changeTile.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\fileTemplates\tu46colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\shader\framebufferVertexShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\fileTemplates\tu32colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\iconImageList\BEHAVIOURS ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -178,9 +178,6 @@ ..\Resources\iconImageList\ARROW.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\items.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\fileTemplates\tu31colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -190,33 +187,33 @@ ..\Resources\external\Discord.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\moon_phases.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\fileTemplates\tu13colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\icons\file_paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\atlases\mapIconData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - ..\Resources\atlases\blockData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - ..\Resources\fileTemplates\tu19colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\iconImageList\SKIN ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\pckClosed.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\shader\texturedCubeVertexShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + ..\Resources\icons\file_export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\fileTemplates\tu53colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\shader\skyboxFragmentShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\shader\plainColorVertexShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\anim_editor\slim_template.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\iconImageList\COL ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -235,42 +232,30 @@ ..\Resources\icons\file_import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\paintingData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + ..\Resources\iconImageList\ENTITY MATERIALS ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\entityMaterialsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\icons\Replace.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\iconImageList\IMAGE ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\map_icons.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\iconImageList\BINKA ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\shader\plainColorFragmentShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + ..\Resources\external\trello.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\terrain.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\atlases\bannerData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\iconImageList\LOC ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\iconImageList\GRF ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\experience_orbs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\atlases\entityBehavioursData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\binka\mss32.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -280,29 +265,20 @@ ..\Resources\icons\ranch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\explosion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\external\WiiU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\iconImageList\ENTITY MATERIALS ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\iconImageList\CAPE ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\external\PS3.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\experienceOrbData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\icons\file_empty.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\pckOpen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\fileTemplates\tu19colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\fileTemplates\1.91_colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -313,17 +289,14 @@ ..\Resources\iconImageList\INFO ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\explosionData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\icons\file_paste.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\particleData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + ..\Resources\armor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\particles.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\binka\binkawin.asi;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\shader\texturedCubeGeometryShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 ..\Resources\icons\file_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -331,14 +304,11 @@ ..\Resources\icons\clock.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\atlases\additional_mapicons.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\shader\texturedCubeFragmentShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 - - ..\Resources\TexturePackIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\..\ProjectLogo.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\binka\binkawin.asi;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\pack.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -346,14 +316,11 @@ ..\Resources\fileTemplates\tu43colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\atlases\paintings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\..\CHANGELOG.md;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - ..\Resources\iconImageList\SKIN ICON.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\fileTemplates\tu46colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\binka\binka_encode.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -361,31 +328,37 @@ ..\Resources\fileTemplates\tu12colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\atlases\itemData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\fileTemplates\tu14colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\atlases\entityModelsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - ..\Resources\fileTemplates\tu69colours.col;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ..\Resources\external\Youtube.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icons\Replace.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\anim_editor\slim_template.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Comparison.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\icons\file_restore.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\skybox_texture.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\shader\framebufferFragmentShader.glsl;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\pckOpen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icons\Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\entityBehavioursData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\entityMaterialsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\entityModelsData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + \ No newline at end of file diff --git a/PCK-Studio/Properties/Settings.Designer.cs b/PCK-Studio/Properties/Settings.Designer.cs index 0f286e3c..4d098b08 100644 --- a/PCK-Studio/Properties/Settings.Designer.cs +++ b/PCK-Studio/Properties/Settings.Designer.cs @@ -114,5 +114,17 @@ namespace PckStudio.Properties { this["RecentFiles"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ValidateImageDimension { + get { + return ((bool)(this["ValidateImageDimension"])); + } + set { + this["ValidateImageDimension"] = value; + } + } } } diff --git a/PCK-Studio/Properties/Settings.settings b/PCK-Studio/Properties/Settings.settings index a32cf0c7..3753a5f9 100644 --- a/PCK-Studio/Properties/Settings.settings +++ b/PCK-Studio/Properties/Settings.settings @@ -26,5 +26,8 @@ + + True + \ No newline at end of file diff --git a/PCK-Studio/Rendering/ModelRenderer.Designer.cs b/PCK-Studio/Rendering/ModelRenderer.Designer.cs new file mode 100644 index 00000000..0e2be60d --- /dev/null +++ b/PCK-Studio/Rendering/ModelRenderer.Designer.cs @@ -0,0 +1,42 @@ +using System.Diagnostics; + +namespace PckStudio.Rendering +{ + internal partial class ModelRenderer + { + [DebuggerNonUserCode()] + protected override void Dispose(bool disposing) + { + try + { + if (disposing && components is not null) + { + components.Dispose(); + } + } + finally + { + base.Dispose(disposing); + } + } + + // Required by the Windows Form Designer + private System.ComponentModel.IContainer components; + + // NOTE: The following procedure is required by the Windows Form Designer + // It can be modified using the Windows Form Designer. + // Do not modify it using the code editor. + [DebuggerStepThrough()] + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + // + // ModelRenderer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.Name = "ModelRenderer"; + this.ResumeLayout(false); + this.PerformLayout(); + } + } +} diff --git a/PCK-Studio/Rendering/ModelRenderer.cs b/PCK-Studio/Rendering/ModelRenderer.cs new file mode 100644 index 00000000..8bfdc817 --- /dev/null +++ b/PCK-Studio/Rendering/ModelRenderer.cs @@ -0,0 +1,334 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using OMI.Formats.Material; +using OMI.Formats.Model; +using OpenTK; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core.Extensions; +using PckStudio.Interfaces; +using PckStudio.Core.Json; +using PckStudio.Properties; +using PckStudio.Rendering.Shader; +using PckStudio.Rendering.Texture; +using PckStudio.Core; +using PckStudio.ModelSupport; + +namespace PckStudio.Rendering +{ + internal partial class ModelRenderer : SceneViewport + { + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public Image Texture + { + get => _modelTexture; + set + { + var args = new TextureChangingEventArgs(value); + Events[nameof(ModelTextureChanging)]?.DynamicInvoke(this, args); + OnModelTextureChanging(this, args); + if (!args.Cancel) + { + _modelTexture = value; + } + } + } + + [Description("Event that gets fired when the skin texture is changing")] + [Category("Property Chnaged")] + [Browsable(true)] + public event EventHandler ModelTextureChanging + { + add => Events.AddHandler(nameof(ModelTextureChanging), value); + remove => Events.RemoveHandler(nameof(ModelTextureChanging), value); + } + + public bool RenderModelBounds { get; set; } + public string CurrentModelName => _currentModelName; + + private BoundingBox _maxBounds; + private string _currentModelName; + private Image _modelTexture; + private Texture2D _modelRenderTexture; + private List> _rootCollection; + private struct HighlightInfo + { + public static readonly HighlightInfo Empty = new HighlightInfo(Vector3.Zero, Vector3.Zero, BoundingBox.Empty); + public bool IsEmpty => BoundingBox.Volume.LengthSquared <= 0f; + public BoundingBox BoundingBox { get; } + public Vector3 Translation { get; } + public Vector3 Rotation { get; } + + public HighlightInfo(System.Numerics.Vector3 translation, System.Numerics.Vector3 rotation, BoundingBox boundingBox) + : this(translation.ToOpenTKVector(), rotation.ToOpenTKVector(), boundingBox) + { + } + + public HighlightInfo(Vector3 translation, Vector3 rotation, BoundingBox boundingBox) + { + Translation = translation; + Rotation = rotation; + BoundingBox = boundingBox; + } + } + private HighlightInfo _highlightingInfo; + + private readonly Vector3 modelOffset = Vector3.UnitY * 24f; + + public ModelRenderer() : base(fov: 60f) + { + InitializeComponent(); + _rootCollection = new List>(5); + if (!DesignMode) + { + InitializeShaders(); + } + } + + private void InitializeShaders() + { + Debug.Assert(Context.IsCurrent); + + // render texture + { + _modelRenderTexture = new Texture2D(); + _modelRenderTexture.PixelFormat = PixelFormat.Bgra; + _modelRenderTexture.InternalPixelFormat = PixelInternalFormat.Rgba8; + _modelRenderTexture.MinFilter = TextureMinFilter.Nearest; + _modelRenderTexture.MagFilter = TextureMagFilter.Nearest; + _modelRenderTexture.WrapS = TextureWrapMode.Repeat; + _modelRenderTexture.WrapT = TextureWrapMode.Repeat; + } + + // cubeShader + { + var cubeShader = ShaderProgram.Create( + new ShaderSource(ShaderType.VertexShader, Resources.texturedCubeVertexShader), + new ShaderSource(ShaderType.FragmentShader, Resources.texturedCubeFragmentShader), + new ShaderSource(ShaderType.GeometryShader, Resources.texturedCubeGeometryShader) + ); + cubeShader.Bind(); + cubeShader.SetUniform1("Texture", 0); + cubeShader.Validate(); + AddShader("CubeShader", cubeShader); + } + } + + public void LoadModel(Model model) + { + ResetHighlight(); + _rootCollection?.Clear(); + + _maxBounds = model.GetParts() + .SelectMany(p => p.GetBoxes().Select(b => new BoundingBox(b.Position + p.Translation, b.Position + p.Translation + b.Size))) + .GetEnclosingBoundingBox(); + + if (!TryGetModelMetaData(model, out JsonModelMetaData modelMetaData)) + { + Trace.TraceError($"[{nameof(ModelRenderer)}@{nameof(LoadModel)}] Failed to get meta data for model: '{model.Name}'"); + return; + } + + for (int i = -1; i < modelMetaData.UvOffsets.Length; i++) + { + bool tryGetPart(string name, out ModelPart modelPart) + { + if (!model.TryGetPart(name, out ModelPart originalModelPart)) + { + modelPart = default; + return false; + } + if (i == -1 || !modelMetaData.UvOffsets.IndexInRange(i)) + { + modelPart = originalModelPart; + return true; + } + System.Numerics.Vector2 uvoffset = modelMetaData.UvOffsets[i]; + modelPart = new ModelPart(originalModelPart.Name, originalModelPart.ParentName, originalModelPart.Translation, originalModelPart.Rotation, originalModelPart.AdditionalRotation); + modelPart.AddBoxes(originalModelPart.GetBoxes().Select(box => new ModelBox(box.Position, box.Size, box.Uv + uvoffset, box.Inflate, box.Mirror))); + return true; + } + _rootCollection.AddRange(BuildModelMesh(modelMetaData.RootParts, + Vector3.Zero, Vector3.Zero, Vector3.Zero, + TryGet.FromDelegate(tryGetPart))); + } + + + if (Context.IsCurrent) + { + ShaderProgram shader = GetShader("CubeShader"); + shader.Bind(); + shader.SetUniform2("TexSize", model.TextureSize); + + // Reset "Material" + GL.Disable(EnableCap.AlphaTest); + GL.Disable(EnableCap.Blend); + GL.BlendFunc(BlendingFactor.One, BlendingFactor.Zero); + } + _currentModelName = model.Name; + } + + private bool TryGetModelMetaData(Model model, out JsonModelMetaData modelMetaData) + { + if (!GameModelImporter.ModelMetaData.TryGetValue(model.Name, out modelMetaData)) + { + Trace.TraceError($"[{nameof(ModelRenderer)}@{nameof(TryGetModelMetaData)}] Couldn't get meta data for model: '{model.Name}'"); + return false; + } + + if (modelMetaData.RootParts.Length == 0) + { + modelMetaData.RootParts = model.GetParts().Select(p => new ModelMetaDataPart(p.Name)).ToArray(); + } + return true; + } + + public override void ResetCamera(Vector3 offset) + { + Vector3 center = (_maxBounds.Start + _maxBounds.End) / 2f; + Camera.FocalPoint = Vector3.TransformPosition(center - modelOffset + offset, Matrix4.CreateScale(-1f, 1f, 1f)); + Camera.Distance = _maxBounds.Volume.Length; + Camera.Yaw = 45f; + Camera.Pitch = 25f; + } + + private List> BuildModelMesh(ModelMetaDataPart[] metaDataParts, Vector3 parentTranslation, Vector3 parentRotation, Vector3 parentPivot, ITryGet model) + { + List> meshes = new List>(); + foreach (ModelMetaDataPart metaDataPart in metaDataParts) + { + if (!model.TryGet(metaDataPart.Name, out ModelPart modelPart)) + { + Trace.TraceError($"[{nameof(ModelRenderer)}@{nameof(BuildModelMesh)}] : Failed to find part: '{metaDataPart.Name}'"); + continue; + } + Vector3 translation = modelPart.Translation.ToOpenTKVector(); + Vector3 pivot = translation * -1; + Vector3 rotation = (modelPart.Rotation.ToOpenTKVector() + modelPart.AdditionalRotation.ToOpenTKVector()); + CubeMeshCollection cubeCollection = new CubeMeshCollection(modelPart.Name, translation - parentTranslation, pivot - parentPivot, rotation - parentRotation); + cubeCollection.FlipZMapping = true; + foreach (ModelBox boxes in modelPart.GetBoxes()) + { + cubeCollection.AddNamed(modelPart.Name, boxes.Position.ToOpenTKVector(), boxes.Size.ToOpenTKVector(), boxes.Uv.ToOpenTKVector(), boxes.Inflate, boxes.Mirror); + } + meshes.Add(cubeCollection); + BuildModelMesh(metaDataPart.Children, translation, rotation, pivot, model).ForEach(cubeCollection.Add); + } + return meshes; + } + + protected virtual void OnModelTextureChanging(object sender, TextureChangingEventArgs e) + { + if (e.NewTexture is null) + e.Cancel = true; + + if (e.Cancel) + return; + + if (Context.IsCurrent) + { + _modelRenderTexture.SetTexture(e.NewTexture); + GLErrorCheck(); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (DesignMode) + return; + if (!Context.IsCurrent) + return; + + GL.Enable(EnableCap.Texture2D); // Enable textures + + GL.DepthFunc(DepthFunction.Lequal); + + ShaderProgram shader = GetShader("CubeShader"); + + _modelRenderTexture.Bind(slot: 0); + + Vector3 scaleVector = new Vector3(1f, -1f, -1f); + Matrix4 renderTransform = Matrix4.CreateScale(scaleVector) * Matrix4.CreateTranslation(modelOffset); + + foreach (GenericMesh item in _rootCollection) + { + DrawMesh(item, shader, item.GetTransform() * renderTransform); + } + _modelRenderTexture.Unbind(); + + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + + if (!_highlightingInfo.IsEmpty) + { + Matrix4 highlightMatrix = Matrix4.Identity; + highlightMatrix *= Matrix4.CreateRotationX(MathHelper.DegreesToRadians(_highlightingInfo.Rotation.X)); + highlightMatrix *= Matrix4.CreateRotationY(MathHelper.DegreesToRadians(_highlightingInfo.Rotation.Y)); + highlightMatrix *= Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(_highlightingInfo.Rotation.Z)); + highlightMatrix = Matrix4.CreateTranslation(_highlightingInfo.Translation) * highlightMatrix.Pivoted(_highlightingInfo.Translation * -1); + + highlightMatrix *= renderTransform; + DrawBoundingBox(highlightMatrix, _highlightingInfo.BoundingBox, Color.HotPink); + } + + if (RenderModelBounds) + { + DrawBoundingBox(renderTransform, _maxBounds, Color.Red); + } + } + + internal void Highlight(ModelPart part) + { + BoundingBox bb = part.GetBoxes().Select(b => b.GetBoundingBox()).GetEnclosingBoundingBox(); + _highlightingInfo = new HighlightInfo(part.Translation, part.Rotation + part.AdditionalRotation, bb); + } + + internal void Highlight(ModelBox box, ModelPart parent) + { + BoundingBox bb = box.GetBoundingBox(); + _highlightingInfo = new HighlightInfo(parent.Translation, parent.Rotation + parent.AdditionalRotation, bb); + } + + internal void ResetHighlight() + { + _highlightingInfo = HighlightInfo.Empty; + } + + internal void SetModelMaterial(MaterialContainer.Material entityMaterial) + { + _ = entityMaterial ?? throw new ArgumentNullException(nameof(entityMaterial)); + switch (entityMaterial.Type) + { + // todo + //case "entity": + // break; + //case "entity_change_color": + // break; + case "entity_alphatest": + GL.Enable(EnableCap.AlphaTest); + break; + case "entity_alphatest_change_color": + GL.Enable(EnableCap.AlphaTest); + goto default; + case "entity_emissive_alpha": + GL.Enable(EnableCap.Blend); + GL.BlendFunc(BlendingFactor.One, BlendingFactor.Zero); + break; + case "entity_emissive_alpha_only": + GL.Enable(EnableCap.Blend); + GL.BlendFuncSeparate(BlendingFactorSrc.One, BlendingFactorDest.One, BlendingFactorSrc.One, BlendingFactorDest.Zero); + break; + default: + Debug.WriteLine($"[{nameof(ModelRenderer)}@{nameof(SetModelMaterial)}]: Unhandled entity material(type: {entityMaterial.Type})"); + break; + } + } + } +} diff --git a/PCK-Studio/Rendering/ModelRenderer.resx b/PCK-Studio/Rendering/ModelRenderer.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/PCK-Studio/Rendering/ModelRenderer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/PCK-Studio/Rendering/SceneViewport.cs b/PCK-Studio/Rendering/SceneViewport.cs new file mode 100644 index 00000000..195866f3 --- /dev/null +++ b/PCK-Studio/Rendering/SceneViewport.cs @@ -0,0 +1,640 @@ +/* + * + *The MIT License (MIT) + +Copyright (c) 2016 Kareem Morsy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +https://github.com/KareemMAX/Minecraft-Skiner +https://github.com/KareemMAX/Minecraft-Skiner/blob/master/src/Minecraft%20skiner/UserControls/Renderer3D.vb + */ +//#define USE_FRAMEBUFFER +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using OpenTK; +using OpenTK.Graphics; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core.Extensions; +using PckStudio.Properties; +using PckStudio.Rendering; +using PckStudio.Rendering.Camera; +using PckStudio.Rendering.Shader; + +namespace PckStudio.Rendering +{ + internal class SceneViewport : GLControl + { + /// + /// Refresh rate at which the frame is updated. Default is 60(Hz) + /// + public int RefreshRate + { + get => _refreshRate; + set + { + _refreshRate = Math.Max(value, 1); + _timer.Interval = TimeSpan.FromSeconds(1d / _refreshRate).Milliseconds; + } + } + + public new Color BackColor + { + get => base.BackColor; + set + { + base.BackColor = value; + if (!DesignMode) + { + Renderer.SetClearColor(value); + } + } + } + + protected new bool DesignMode => base.DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime; + + protected PerspectiveCamera Camera { get; } + + protected virtual void OnUpdate(object sender, TimeSpan timestep) { } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool LockMousePosition { get; set; } = false; + + public float MouseSensetivity { get; set; } = 0.01f; + private Point PreviousMouseLocation; + private Point CurrentMouseLocation; + + private int _refreshRate = 60; + private Timer _timer; + private bool _initialized; + private ShaderLibrary _shaderLibrary; + + private DrawContext _boundingBoxDrawContext; + + private long _lastTick = 0L; + + private IndexBuffer _meshIndexBuffer; + private Dictionary _meshTypeVertexArray; + + private bool IsMouseHidden + { + get => !Cursor.IsVisible(); + set + { + if (value) + { + Cursor.Hide(); + return; + } + Cursor.Show(); + } + } + +#if USE_FRAMEBUFFER + private FrameBuffer _framebuffer; + private Texture2D _framebufferTexture; + private VertexArray _framebufferVAO; + private int _framebufferRenderBuffer; + private bool _framebufferStarted = false; + + private static Vector4[] _rectVertices = new Vector4[] + { + new Vector4( 1.0f, -1.0f, 1.0f, 0.0f), + new Vector4(-1.0f, -1.0f, 0.0f, 0.0f), + new Vector4(-1.0f, 1.0f, 0.0f, 1.0f), + new Vector4( 1.0f, 1.0f, 1.0f, 1.0f), + new Vector4( 1.0f, -1.0f, 1.0f, 0.0f), + new Vector4(-1.0f, 1.0f, 0.0f, 1.0f), + }; +#endif + + private SceneViewport() + { + + } + + public SceneViewport(float fov, Vector3 camareaPosition = default) +#if DEBUG + : base(GraphicsMode.Default, 4, 6, GraphicsContextFlags.Debug) +#else + : base() +#endif + { + VSync = true; + _timer = new Timer(); + _timer.Tick += TimerTick; + + RefreshRate = _refreshRate; + Camera = new PerspectiveCamera(fov, camareaPosition); + _shaderLibrary = new ShaderLibrary(); + + if (!DesignMode) + { + _timer.Start(); + InitializeInternal(); + } + _initialized = false; + } + + private void InitializeInternal() + { + if (_initialized) + { + Debug.Fail("Already Initialized."); + return; + } + MakeCurrent(); + Trace.TraceInformation(GL.GetString(StringName.Version)); + GL.DebugMessageCallback(DebugProc, this.Handle); + AddShader("Internal_colorShader", Resources.plainColorVertexShader, Resources.plainColorFragmentShader); + var vao = new VertexArray(); + VertexBufferLayout layout = new VertexBufferLayout(); + layout.Add(ShaderDataType.Float3); + layout.Add(ShaderDataType.Float4); + int id = vao.AddNewBuffer(layout); + vao.GetBuffer(id).SetData(Addon.BoundingBox.GetVertices()); + var ibo = IndexBuffer.Create(Addon.BoundingBox.GetIndecies()); + _boundingBoxDrawContext = new DrawContext(vao, ibo, PrimitiveType.Lines); + + _meshTypeVertexArray = new Dictionary(); + _meshIndexBuffer = new IndexBuffer(); + +#if USE_FRAMEBUFFER + InitializeFramebuffer(); + // Framebuffer shader + { + var framebufferShader = ShaderProgram.Create(Resources.framebufferVertexShader, Resources.framebufferFragmentShader); + framebufferShader.Bind(); + framebufferShader.SetUniform1("screenTexture", 0); + framebufferShader.Validate(); + AddShader("Internal_framebufferShader", framebufferShader); + + GLErrorCheck(); + } +#endif + InitializeDebugComponents(); + InitializeDebugShaders(); + _initialized = true; + } + + public void ResetCamera() => ResetCamera(Vector3.Zero); + public virtual void ResetCamera(Vector3 defaultPosition) + { + Camera.FocalPoint = defaultPosition; + Camera.Yaw = 0f; + Camera.Pitch = 0f; + } + + protected override bool ProcessDialogKey(Keys keyData) + { + switch (keyData) + { +#if DEBUG + case Keys.Escape: + ReleaseMouse(); + debugContextMenuStrip1.Show(this, Point.Empty); + return true; +#endif + } + return base.ProcessDialogKey(keyData); + } + + protected override void Dispose(bool disposing) + { + if (DesignMode) + return; + if (disposing) + { + _timer.Stop(); + _timer.Dispose(); + foreach (VertexArray va in _meshTypeVertexArray.Values) + { + va.Dispose(); + } + _meshIndexBuffer.Dispose(); + _boundingBoxDrawContext.IndexBuffer.Dispose(); + _boundingBoxDrawContext.VertexArray.Dispose(); + _shaderLibrary.Dispose(); + } + _initialized = false; + base.Dispose(disposing); + } + + protected void AddShader(string shaderName, ShaderProgram shader) => _shaderLibrary.AddShader(shaderName, shader); + + protected void AddShader(string shaderName, string vertexSource, string fragmentSource) => AddShader(shaderName, ShaderProgram.Create(vertexSource, fragmentSource)); + + protected ShaderProgram GetShader(string shaderName) => _shaderLibrary.GetShader(shaderName); + + protected void DrawMesh(GenericMesh mesh, ShaderProgram shader, Matrix4 transform) where T : struct + { + Matrix4 viewProjection = Camera.GetViewProjection(); + shader.Bind(); + shader.SetUniformMat4("ViewProjection", ref viewProjection); + shader.SetUniformMat4("Transform", ref transform); + if (!_meshTypeVertexArray.ContainsKey(typeof(T))) + { + VertexArray vertexArray = new VertexArray(); + vertexArray.AddNewBuffer(mesh.VertexLayout); + _meshTypeVertexArray.Add(typeof(T), vertexArray); + } + T[] vertices = mesh.GetVertices().ToArray(); + _meshTypeVertexArray[typeof(T)].GetBuffer(0).SetData(vertices); + int[] indices = mesh.GetIndices().ToArray(); + _meshIndexBuffer.SetIndicies(indices); + var drawContext = new DrawContext(_meshTypeVertexArray[typeof(T)], _meshIndexBuffer, mesh.DrawType); + Renderer.Draw(shader, drawContext); + } + + protected void DrawBoundingBox(Matrix4 transform, Core.BoundingBox boundingBox, Color color) + { + ShaderProgram colorShader = _shaderLibrary.GetShader("Internal_colorShader"); + colorShader.Bind(); + Matrix4 viewProjection = Camera.GetViewProjection(); + colorShader.SetUniformMat4("ViewProjection", ref viewProjection); + transform = boundingBox.GetTransform() * transform; + colorShader.SetUniformMat4("Transform", ref transform); + colorShader.SetUniform4("BlendColor", color); + colorShader.SetUniform1("Intensity", 0.6f); + + GL.Enable(EnableCap.LineSmooth); + + GL.DepthFunc(DepthFunction.Always); + + Renderer.SetLineWidth(2f); + Renderer.Draw(colorShader, _boundingBoxDrawContext); + + GL.DepthFunc(DepthFunction.Less); + Renderer.SetLineWidth(1f); + } + + static void DebugProc(DebugSource source, DebugType type, int id, DebugSeverity severity, int length, IntPtr message, IntPtr instanceHandle) + { + string dbgMessage = Marshal.PtrToStringAnsi(message, length); + Debug.WriteLine($"{source}:{id} {type} {severity}: {dbgMessage}"); + } + + [Conditional("DEBUG")] + protected void GLErrorCheck() + { + ErrorCode error = GL.GetError(); + Debug.Assert(error == ErrorCode.NoError, error.ToString()); + } + + [Conditional("USE_FRAMEBUFFER")] + private void InitializeFramebuffer() + { +#if USE_FRAMEBUFFER + _framebuffer = new FrameBuffer(); + _framebuffer.Bind(); + _framebufferTexture = new Texture2D(); + _framebufferTexture.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Rgb; + _framebufferTexture.InternalPixelFormat = PixelInternalFormat.Rgb; + _framebufferTexture.SetSize(Size); + _framebufferTexture.WrapS = TextureWrapMode.ClampToEdge; + _framebufferTexture.WrapT = TextureWrapMode.ClampToEdge; + _framebufferTexture.MinFilter = TextureMinFilter.Nearest; + _framebufferTexture.MagFilter = TextureMagFilter.Nearest; + + _framebufferTexture.AttachToFramebuffer(_framebuffer, FramebufferAttachment.ColorAttachment0); + + _framebufferRenderBuffer = GL.GenRenderbuffer(); + GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, _framebufferRenderBuffer); + GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.Depth24Stencil8, Size.Width, Size.Height); + GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthStencilAttachment, RenderbufferTarget.Renderbuffer, _framebufferRenderBuffer); + + _framebufferVAO = new VertexArray(); + VertexBuffer vertexBuffer = new VertexBuffer(); + vertexBuffer.SetData(_rectVertices); + VertexBufferLayout layout = new VertexBufferLayout(); + layout.Add(ShaderDataType.Float4); + _framebufferVAO.AddBuffer(vertexBuffer, layout); + _framebuffer.CheckStatus(); + + if (_framebuffer.Status != FramebufferErrorCode.FramebufferComplete) + { + Debug.Fail($"Framebuffer status: '{_framebuffer.Status}'"); + } + + _framebuffer.Unbind(); +#endif + } + + [Conditional("USE_FRAMEBUFFER")] + protected void FramebufferBegin() + { +#if USE_FRAMEBUFFER + if (_framebufferStarted) + Debug.Fail("FramebufferBegin: already begun."); + _framebufferStarted = true; + _framebuffer.Bind(); +#endif + } + + [Conditional("USE_FRAMEBUFFER")] + protected void FramebufferEnd() + { +#if USE_FRAMEBUFFER + if (!_framebufferStarted) + Debug.Fail("FramebufferEnd: framebuffer didn't start yet."); + _framebuffer.Unbind(); + GL.Disable(EnableCap.DepthTest); + ShaderProgram framebufferShader = GetShader("Internal_framebufferShader"); + framebufferShader.Bind(); + _framebufferVAO.Bind(); + _framebufferTexture.Bind(slot: 0); + + GL.DrawArrays(PrimitiveType.Triangles, 0, 6); + + _framebufferTexture.Unbind(); + _framebufferStarted = false; +#endif + } + +#if USE_FRAMEBUFFER + [Conditional("USE_FRAMEBUFFER")] + private void SetFramebufferSize(Size size) + { + if (_framebuffer is not null) + { + _framebuffer.Bind(); + + _framebufferTexture.Bind(); + _framebufferTexture.SetSize(size); + + GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, _framebufferRenderBuffer); + GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.Depth24Stencil8, size.Width, size.Height); + GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthStencilAttachment, RenderbufferTarget.Renderbuffer, _framebufferRenderBuffer); + + FramebufferErrorCode status = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); + if (status != FramebufferErrorCode.FramebufferComplete) + { + Debug.Fail($"Framebuffer status: '{_framebuffer.Status}'"); + } + _framebuffer.Unbind(); + } + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + if (!IsHandleCreated || DesignMode) + return; + SetFramebufferSize(Size); + } +#endif + + private void TimerTick(object sender, EventArgs e) + { + long tick = DateTime.UtcNow.Ticks - _lastTick; + _lastTick = DateTime.UtcNow.Ticks; + OnUpdate(sender, TimeSpan.FromTicks(tick)); + Refresh(); + RenderDebug(); + if (IsHandleCreated && !IsDisposed) + SwapBuffers(); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (DesignMode) + return; + GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); + GL.Enable(EnableCap.DepthTest); // Enable correct Z Drawings + } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + if (DesignMode) + return; + if (Camera is not null) + { + Camera.ViewportSize = ClientSize; + } + Renderer.SetViewportSize(Camera.ViewportSize); + } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + float mouseSensetivity = LockMousePosition ? MouseSensetivity : 64f * 3 * (1f / 56f) * MouseSensetivity; + + float deltaX = (Cursor.Position.X - CurrentMouseLocation.X) * mouseSensetivity; + float deltaY = (Cursor.Position.Y - CurrentMouseLocation.Y) * mouseSensetivity; + + switch (e.Button) + { + case MouseButtons.None: + case MouseButtons.Middle: + case MouseButtons.XButton1: + case MouseButtons.XButton2: + break; + case MouseButtons.Left: + Camera.Rotate(deltaX, deltaY); + goto default; + case MouseButtons.Right: + Camera.Pan(deltaX, deltaY); + goto default; + default: + if (LockMousePosition) + Cursor.Position = PointToScreen(new Point((int)Math.Round(Bounds.Width / 2d), (int)Math.Round(Bounds.Height / 2d))); + CurrentMouseLocation = Cursor.Position; + break; + } + } + + protected override void OnMouseWheel(MouseEventArgs e) + { + Camera.Distance -= e.Delta / System.Windows.Input.Mouse.MouseWheelDeltaForOneLine; + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + ReleaseMouse(); + } + + protected void ReleaseMouse() + { + if (LockMousePosition) + { + Cursor.Position = PreviousMouseLocation; + if (IsMouseHidden) + IsMouseHidden = false; + } + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left) + { + CurrentMouseLocation = PreviousMouseLocation = Cursor.Position; + IsMouseHidden = LockMousePosition; + } + } + + [Conditional("DEBUG")] + private void InitializeDebugShaders() + { +#if DEBUG + var plainColorVertexBufferLayout = new VertexBufferLayout(); + plainColorVertexBufferLayout.Add(ShaderDataType.Float3); + plainColorVertexBufferLayout.Add(ShaderDataType.Float4); + // Debug point render + { + ColorVertex[] vertices = [ + new ColorVertex(Vector3.Zero, Color.White), + ]; + VertexArray vao = new VertexArray(); + var debugVBO = new VertexBuffer(); + debugVBO.SetData(vertices); + vao.AddBuffer(debugVBO, plainColorVertexBufferLayout); + d_debugPointDrawContext = new DrawContext(vao, debugVBO.GenIndexBuffer(), PrimitiveType.Points); + } + // Debug line render + { + ColorVertex[] vertices = [ + new ColorVertex(Vector3.Zero, Color.Red) , new ColorVertex(Vector3.UnitX, Color.Red), + new ColorVertex(Vector3.Zero, Color.Green), new ColorVertex(Vector3.UnitY, Color.Green), + new ColorVertex(Vector3.Zero, Color.Blue) , new ColorVertex(Vector3.UnitZ, Color.Blue), + ]; + VertexArray vao = new VertexArray(); + var debugVBO = new VertexBuffer(); + debugVBO.SetData(vertices); + vao.AddBuffer(debugVBO, plainColorVertexBufferLayout); + d_debugLineDrawContext = new DrawContext(vao, debugVBO.GenIndexBuffer(), PrimitiveType.Lines); + } +#endif + } + + [Conditional("DEBUG")] + private void RenderDebug() + { +#if DEBUG + d_debugLabel.Text = Camera.ToString(); + GL.Disable(EnableCap.Blend); + GL.DepthMask(false); + GL.DepthFunc(DepthFunction.Always); + GL.Enable(EnableCap.PointSmooth); + GL.Enable(EnableCap.LineSmooth); + ShaderProgram colorShader = GetShader("Internal_colorShader"); + colorShader.Bind(); + Matrix4 viewProjection = Camera.GetViewProjection(); + colorShader.SetUniformMat4("ViewProjection", ref viewProjection); + if (d_showFocalPoint) + { + Matrix4 transform = Matrix4.CreateTranslation(Camera.FocalPoint).Inverted(); + colorShader.SetUniformMat4("Transform", ref transform); + colorShader.SetUniform1("Intensity", 0.75f); + colorShader.SetUniform4("BlendColor", Color.DeepPink); + GL.PointSize(5f); + Renderer.Draw(colorShader, d_debugPointDrawContext); + GL.PointSize(1f); + } + if (d_showDirectionArrows) + { + Matrix4 transform = Matrix4.CreateScale(1, -1, -1); + transform *= Matrix4.CreateTranslation(Vector3.Zero); + transform *= Matrix4.CreateScale(Camera.Distance / 4f).Inverted(); + transform.Invert(); + colorShader.SetUniformMat4("Transform", ref transform); + colorShader.SetUniform1("Intensity", 0.75f); + colorShader.SetUniform4("BlendColor", Color.White); + + Renderer.SetLineWidth(2f); + + Renderer.Draw(colorShader, d_debugLineDrawContext); + + Renderer.SetLineWidth(1f); + + } + GL.DepthMask(true); + GL.DepthFunc(DepthFunction.Less); + GL.Enable(EnableCap.Blend); +#endif + } + + [Conditional("DEBUG")] + private void InitializeDebugComponents() + { +#if DEBUG + debugContextMenuStrip1 = new ContextMenuStrip(); + debugContextMenuStrip1.SuspendLayout(); + SuspendLayout(); + // + // contextMenuStrip1 + // + debugContextMenuStrip1.Items.AddRange(new ToolStripItem[] {}); + debugContextMenuStrip1.Name = "contextMenuStrip1"; + debugContextMenuStrip1.Size = new Size(159, 48); + // + // debugLabel + // + d_debugLabel = new Label(); + d_debugLabel.AutoSize = true; + d_debugLabel.Visible = false; + d_debugLabel.BackColor = Color.Transparent; + d_debugLabel.ForeColor = SystemColors.ControlLight; + d_debugLabel.Location = new Point(3, 4); + d_debugLabel.Name = "debugLabel"; + d_debugLabel.Size = new Size(37, 13); + d_debugLabel.TabIndex = 2; + d_debugLabel.Text = "debug"; + var debugCameraToolStripMenuItem = new ToolStripMenuItem("Show Camera debug information"); + debugCameraToolStripMenuItem.CheckOnClick = true; + debugCameraToolStripMenuItem.Click += (s, e) => d_debugLabel.Visible = debugCameraToolStripMenuItem.Checked; + debugContextMenuStrip1.Items.Add(debugCameraToolStripMenuItem); + + var debugShowFocalPointToolStripMenuItem = new ToolStripMenuItem("Show Camera Focal point"); + debugShowFocalPointToolStripMenuItem.CheckOnClick = true; + debugShowFocalPointToolStripMenuItem.Click += (s, e) => d_showFocalPoint = debugShowFocalPointToolStripMenuItem.Checked; + debugContextMenuStrip1.Items.Add(debugShowFocalPointToolStripMenuItem); + + var debugShowDirectionArrows = new ToolStripMenuItem("Show Direction Arrows"); + debugShowDirectionArrows.CheckOnClick = true; + debugShowDirectionArrows.Click += (s, e) => d_showDirectionArrows = debugShowDirectionArrows.Checked; + debugContextMenuStrip1.Items.Add(debugShowDirectionArrows); + + Controls.Add(d_debugLabel); + + this.debugContextMenuStrip1.ResumeLayout(false); +#endif + } + +#if DEBUG + private bool d_showFocalPoint; + private bool d_showDirectionArrows; + private DrawContext d_debugPointDrawContext; + private DrawContext d_debugLineDrawContext; + private Label d_debugLabel; + private ContextMenuStrip debugContextMenuStrip1; +#endif + + } +} diff --git a/PCK-Studio/Rendering/SkinRenderer.Designer.cs b/PCK-Studio/Rendering/SkinRenderer.Designer.cs new file mode 100644 index 00000000..3403024a --- /dev/null +++ b/PCK-Studio/Rendering/SkinRenderer.Designer.cs @@ -0,0 +1,42 @@ +using System.Diagnostics; + +namespace PckStudio.Rendering +{ + internal partial class SkinRenderer + { + [DebuggerNonUserCode()] + protected override void Dispose(bool disposing) + { + try + { + if (disposing && components is not null) + { + components.Dispose(); + } + } + finally + { + base.Dispose(disposing); + } + } + + // Required by the Windows Form Designer + private System.ComponentModel.IContainer components; + + // NOTE: The following procedure is required by the Windows Form Designer + // It can be modified using the Windows Form Designer. + // Do not modify it using the code editor. + [DebuggerStepThrough()] + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + // + // SkinRenderer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.Name = "SkinRenderer"; + this.ResumeLayout(false); + this.PerformLayout(); + } + } +} diff --git a/PCK-Studio/Rendering/SkinRenderer.cs b/PCK-Studio/Rendering/SkinRenderer.cs new file mode 100644 index 00000000..390ed0b6 --- /dev/null +++ b/PCK-Studio/Rendering/SkinRenderer.cs @@ -0,0 +1,1109 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using OpenTK; +using PckStudio.Internal; +using PckStudio.Core.Extensions; +using OpenTK.Graphics.OpenGL; +using System.Windows.Forms; +using System.ComponentModel; +using System.Drawing; +using PckStudio.Properties; +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Drawing.Imaging; +using System.IO; +using PckStudio.Rendering.Extension; +using PckStudio.Rendering.Texture; +using PckStudio.Rendering.Shader; +using System.Linq; +using PckStudio.Core.Skin; +using PckStudio.Core; + +namespace PckStudio.Rendering +{ + internal partial class SkinRenderer : SceneViewport + { + /// + /// The visible Texture on the renderer + /// + /// The visible Texture + [Description("The current skin texture")] + [Category("Appearance")] + public Image Texture + { + get => _skinImage; + set + { + var args = new TextureChangingEventArgs(value); + Events[nameof(TextureChanging)]?.DynamicInvoke(this, args); + OnTextureChanging(this, args); + if (!args.Cancel) + { + _skinImage = value; + } + } + } + + [Description("The current cape texture")] + [Category("Appearance")] + public Image CapeTexture + { + get => _capeImage; + set + { + var args = new TextureChangingEventArgs(value); + Events[nameof(CapeTextureChanging)]?.DynamicInvoke(this, args); + OnCapeTextureChanging(this, args); + if (!args.Cancel) + { + _capeImage = value; + } + } + } + + [Description("The Color used for outlines")] + [Category("Appearance")] + public Color GuideLineColor { get; set; } + + [Description("The Color used for highlighting selected cube")] + [Category("Appearance")] + public Color HighlightlingColor { get; set; } = Color.Aqua; + + public int SelectedIndex + { + get => selectedIndices.Length > 0 ? selectedIndices[0] : -1; + set + { + if (selectedIndices.Length <= 0) + selectedIndices = new int[1]; + selectedIndices[0] = value; + if (CenterOnSelect) + CenterSelectedObject(); + } + } + + public int[] SelectedIndices + { + get => selectedIndices; + set + { + selectedIndices = value; + if (CenterOnSelect) + CenterSelectedObject(); + } + } + + public bool CenterOnSelect { get; set; } = false; + public bool ShowBoundingBox { get; set; } + public bool ShowArmor { get; set; } = false; + public bool Animate { get; set; } = true; + public bool ShowGuideLines + { + get => guidelineMode != GuidelineMode.None; + set + { + if (value) + { + guidelineMode = GuidelineMode.Cubical; + return; + } + guidelineMode = GuidelineMode.None; + } + } + + [Description("Event that gets fired when the skin texture is changing")] + [Category("Property Chnaged")] + [Browsable(true)] + public event EventHandler TextureChanging + { + add => Events.AddHandler(nameof(TextureChanging), value); + remove => Events.RemoveHandler(nameof(TextureChanging), value); + } + + [Description("Event that gets fired when the cape texture is changing")] + [Category("Property Chnaged")] + [Browsable(true)] + public event EventHandler CapeTextureChanging + { + add => Events.AddHandler(nameof(CapeTextureChanging), value); + remove => Events.RemoveHandler(nameof(CapeTextureChanging), value); + } + + [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public SkinANIM ANIM + { + get => _anim; + set + { + _anim = value; + OnANIMUpdate(); + } + } + + public ObservableCollection ModelData { get; } + + /// + /// Captures the currently displayed frame + /// + /// Image of the cameras current view + // TODO: add thumbnail size argument + public Image GetThumbnail() + { + Bitmap bmp = new Bitmap(Width, Height); + BitmapData data = bmp.LockBits(ClientRectangle, ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + GL.Finish(); + GL.ReadPixels(0, 0, Width, Height, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); + bmp.UnlockBits(data); + bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); + return bmp; + } + + private enum GuidelineMode + { + None = -1, + Cubical, + Skeleton + }; + + private GuidelineMode guidelineMode { get; set; } = GuidelineMode.None; + private int[] selectedIndices = Array.Empty(); + private BoundingBox _skinBounds; + + public Size TextureSize { get; private set; } = new Size(64, 64); + public Vector2 TillingFactor => new Vector2(1f / TextureSize.Width, 1f / TextureSize.Height); + private const float OverlayScale = 0.25f; + + private VertexBufferLayout plainColorVertexBufferLayout; + + private SkinANIM _anim; + private Image _skinImage; + private Image _capeImage; + private Texture2D skinTexture; + private Texture2D capeTexture; + private Texture2D armorTexture; + + private DrawContext _cubicalDrawContext; + private DrawContext _skeletonDrawContext; + private DrawContext _groundDrawContext; + + private DrawContext _skyboxRenderBuffer; + private CubeTexture _skyboxTexture; + + private Dictionary meshStorage; + private Dictionary offsetSpecificMeshStorage; + + private CubeMesh cape; + + private CubeMeshCollection head; + private CubeMeshCollection body; + private CubeMeshCollection rightArm; + private CubeMeshCollection leftArm; + private CubeMeshCollection rightLeg; + private CubeMeshCollection leftLeg; + + private float animationCurrentRotationAngle; + private float animationRotationSpeed = 16f; + private float animationMaxAngleInDegrees = 5f; + + private bool showWireFrame = false; + private bool autoInflateOverlayParts; + + private const float defaultArmRotation = 5f; + + private Matrix4 RightArmMatrix => Matrix4.CreateFromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(defaultArmRotation)); + private Matrix4 LeftArmMatrix => Matrix4.CreateFromAxisAngle(Vector3.UnitZ, MathHelper.DegreesToRadians(-defaultArmRotation)); + + private static Vector3[] cubeVertices = new Vector3[] + { + // front + new Vector3(-1.0f, -1.0f, 1.0f), + new Vector3( 1.0f, -1.0f, 1.0f), + new Vector3( 1.0f, 1.0f, 1.0f), + new Vector3(-1.0f, 1.0f, 1.0f), + // back + new Vector3(-1.0f, -1.0f, -1.0f), + new Vector3( 1.0f, -1.0f, -1.0f), + new Vector3( 1.0f, 1.0f, -1.0f), + new Vector3(-1.0f, 1.0f, -1.0f) + }; + + private bool initialized = false; + + public SkinRenderer() : base(fov: 60f) + { + InitializeSkinData(); + InitializeCapeData(); + meshStorage = new Dictionary() + { + { "HEAD", head }, + { "BODY", body }, + { "ARM0", rightArm }, + { "ARM1", leftArm }, + { "LEG0", rightLeg }, + { "LEG1", leftLeg }, + + { "HEADWEAR", head }, + { "JACKET" , body }, + { "SLEEVE0" , rightArm }, + { "SLEEVE1" , leftArm }, + { "PANTS0" , rightLeg }, + { "PANTS1" , leftLeg }, + }; + CalculateSkinBounds(); + InitializeArmorData(); + InitializeCamera(); + InitializeComponent(); + + ANIM ??= new SkinANIM(SkinAnimMask.RESOLUTION_64x64); + ModelData = new ObservableCollection(); + ModelData.CollectionChanged += ModelData_CollectionChanged; + } + + public void Initialize(bool inflateOverlayParts) + { + if (initialized) + Debug.Fail("Already Initialized!"); + autoInflateOverlayParts = inflateOverlayParts; + InitializeShaders(); + Renderer.SetClearColor(BackColor); + GLErrorCheck(); + initialized = true; + } + + private const float DefaultCameraDistance = 64f; + private void InitializeCamera() + { + Camera.Distance = DefaultCameraDistance; + Camera.FocalPoint = head.GetCenter(0); + } + + private void InitializeSkinData() + { + head ??= new CubeMeshCollection("Head", GameConstants.SkinHeadTranslation.ToOpenTKVector(), GameConstants.SkinHeadPivot.ToOpenTKVector()) + { + FlipZMapping = true + }; + head.AddNamed("DefaultHead", new(-4, -8, -4), new(8, 8, 8), new(0, 0)); + head.AddNamed("DefaultHeadOverlay", new(-4, -8, -4), new(8, 8, 8), new(32, 0), OverlayScale * 2); + + body ??= new CubeMeshCollection("Body", GameConstants.SkinBodyTranslation.ToOpenTKVector(), GameConstants.SkinBodyPivot.ToOpenTKVector()); + body.AddNamed("DefaultBody",new(-4, 0, -2), new(8, 12, 4), new(16, 16)); + body.AddNamed("DefaultBodyOverlay", new(-4, 0, -2), new(8, 12, 4), new(16, 32), OverlayScale); + + rightArm ??= new CubeMeshCollection("Right Arm", GameConstants.SkinRightArmTranslation.ToOpenTKVector(), GameConstants.SkinRightArmPivot.ToOpenTKVector()); + rightArm.AddNamed("DefaultRightArm",new(-3, -2, -2), new(4, 12, 4), new(40, 16)); + rightArm.AddNamed("DefaultRightArmOverlay", new(-3, -2, -2), new(4, 12, 4), new(40, 32), OverlayScale); + + leftArm ??= new CubeMeshCollection("Left Arm", GameConstants.SkinLeftArmTranslation.ToOpenTKVector(), GameConstants.SkinLeftArmPivot.ToOpenTKVector()); + leftArm.AddNamed("DefaultLeftArm",new(-1, -2, -2), new(4, 12, 4), new(32, 48)); + leftArm.AddNamed("DefaultLeftArmOverlay", new(-1, -2, -2), new(4, 12, 4), new(48, 48), inflate: OverlayScale); + + rightLeg ??= new CubeMeshCollection("Right Leg", GameConstants.SkinRightLegTranslation.ToOpenTKVector(), GameConstants.SkinRightLegPivot.ToOpenTKVector()); + rightLeg.AddNamed("DefaultRightLeg",new(-2, 0, -2), new(4, 12, 4), new(0, 16)); + rightLeg.AddNamed("DefaultRightLegOverlay", new(-2, 0, -2), new(4, 12, 4), new(0, 32), OverlayScale); + + leftLeg ??= new CubeMeshCollection("Left Leg", GameConstants.SkinLeftLegTranslation.ToOpenTKVector(), GameConstants.SkinLeftLegPivot.ToOpenTKVector()); + leftLeg.AddNamed("DefaultLeftLeg",new(-2, 0, -2), new(4, 12, 4), new(16, 48)); + leftLeg.AddNamed("DefaultLeftLegOverlay", new(-2, 0, -2), new(4, 12, 4), new(0, 48), OverlayScale); + } + + private void InitializeCapeData() + { + cape ??= new CubeMesh(new Cube(new(-5, 0, -3), new(10, 16, 1), new(0, 0), 0f, false, false)); + } + + private void InitializeArmorData() + { + const float armorInflation = 0.75f; + + var helmet = new CubeMeshCollection("HELMET"); + helmet.Add(new(-4, -8, -4), new(8, 8, 8), new(0, 0), inflate: armorInflation); + + var chest = new CubeMeshCollection("CHEST"); + chest.Add(new(-4, 0, -2), new(8, 12, 4), new(16, 16), inflate: armorInflation + 0.01f); + + var shoulder0 = new CubeMeshCollection("SHOULDER0", rightArm.Translation, rightArm.Pivot); + shoulder0.Add(new(-3, -2, -2), new(4, 12, 4), new(40, 16), inflate: armorInflation); + + var shoulder1 = new CubeMeshCollection("SHOULDER1", leftArm.Translation, leftArm.Pivot); + shoulder1.Add(new(-1, -2, -2), new(4, 12, 4), new(40, 16), inflate: armorInflation, mirrorTexture: true); + + var waist = new CubeMeshCollection("WAIST"); + waist.Add(new(-4, 0, -2), new(8, 12, 4), new(16, 48), inflate: armorInflation); + + var pants0 = new CubeMeshCollection("PANTS0", rightLeg.Translation, rightLeg.Pivot); + pants0.Add(new(-2, 0, -2), new(4, 12, 4), new(0, 48), inflate: armorInflation); + + var pants1 = new CubeMeshCollection("PANTS1", leftLeg.Translation, leftLeg.Pivot); + pants1.Add(new(-2, 0, -2), new(4, 12, 4), new(0, 48), inflate: armorInflation, mirrorTexture: true); + + var boot0 = new CubeMeshCollection("BOOT0", rightLeg.Translation, rightLeg.Pivot); + boot0.Add(new(-2, 0, -2), new(4, 12, 4), new(0, 16), inflate: armorInflation + 0.25f); + + var boot1 = new CubeMeshCollection("BOOT1", leftLeg.Translation, leftLeg.Pivot); + boot1.Add(new(-2, 0, -2), new(4, 12, 4), new(0, 16), inflate: armorInflation + 0.25f, mirrorTexture: true); + + offsetSpecificMeshStorage = new Dictionary + { + { helmet.Name, helmet }, + { chest.Name, chest }, + { shoulder0.Name, shoulder0 }, + { shoulder1.Name, shoulder1 }, + { waist.Name, waist }, + { pants0.Name, pants0 }, + { pants1.Name, pants1 }, + { boot0.Name, boot0 }, + { boot1.Name, boot1 } + }; + + //// TODO + //{ "TOOL0" , new CubeGroupMesh("TOOL0") }, + //{ "TOOL1" , new CubeGroupMesh("TOOL1") }, + } + + private void InitializeShaders() + { + plainColorVertexBufferLayout = new VertexBufferLayout(); + plainColorVertexBufferLayout.Add(ShaderDataType.Float3); + plainColorVertexBufferLayout.Add(ShaderDataType.Float4); + + // Skin shader + { + var cubeShader = ShaderProgram.Create( + new ShaderSource(ShaderType.VertexShader, Resources.texturedCubeVertexShader), + new ShaderSource(ShaderType.FragmentShader, Resources.texturedCubeFragmentShader), + new ShaderSource(ShaderType.GeometryShader, Resources.texturedCubeGeometryShader) + ); + cubeShader.Bind(); + cubeShader.SetUniform1("Texture", 0); + cubeShader.Validate(); + AddShader("CubeShader", cubeShader); + GLErrorCheck(); + + armorTexture = new Texture2D(); + armorTexture.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; + armorTexture.InternalPixelFormat = PixelInternalFormat.Rgba8; + armorTexture.MinFilter = TextureMinFilter.Nearest; + armorTexture.MagFilter = TextureMagFilter.Nearest; + armorTexture.WrapS = TextureWrapMode.Repeat; + armorTexture.WrapT = TextureWrapMode.Repeat; + armorTexture.SetTexture(Resources.armor); + GLErrorCheck(); + + capeTexture = new Texture2D(); + capeTexture.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; + capeTexture.InternalPixelFormat = PixelInternalFormat.Rgba8; + capeTexture.MinFilter = TextureMinFilter.Nearest; + capeTexture.MagFilter = TextureMagFilter.Nearest; + capeTexture.WrapS = TextureWrapMode.Repeat; + capeTexture.WrapT = TextureWrapMode.Repeat; + GLErrorCheck(); + + skinTexture = new Texture2D(); + skinTexture.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; + skinTexture.InternalPixelFormat = PixelInternalFormat.Rgba8; + skinTexture.MinFilter = TextureMinFilter.Nearest; + skinTexture.MagFilter = TextureMagFilter.Nearest; + skinTexture.WrapS = TextureWrapMode.Repeat; + skinTexture.WrapT = TextureWrapMode.Repeat; + + GLErrorCheck(); + } + + // Skybox shader + { + var skyboxVAO = new VertexArray(); + var skyboxVBO = new VertexBuffer(); + skyboxVBO.SetData(cubeVertices); + var vboLayout = new VertexBufferLayout(); + vboLayout.Add(ShaderDataType.Float3); + skyboxVAO.AddBuffer(skyboxVBO, vboLayout); + var skybocIBO = IndexBuffer.Create( + // front + 0, 1, 2, + 2, 3, 0, + // right + 1, 5, 6, + 6, 2, 1, + // back + 7, 6, 5, + 5, 4, 7, + // left + 4, 0, 3, + 3, 7, 4, + // bottom + 4, 5, 1, + 1, 0, 4, + // top + 3, 2, 6, + 6, 7, 3); + + _skyboxRenderBuffer = new DrawContext(skyboxVAO, skybocIBO, PrimitiveType.Triangles); + + var skyboxShader = ShaderProgram.Create(Resources.skyboxVertexShader, Resources.skyboxFragmentShader); + skyboxShader.Bind(); + skyboxShader.SetUniform1("skybox", 0); + skyboxShader.SetUniform1("brightness", 0.8f); + skyboxShader.Validate(); + AddShader("SkyboxShader", skyboxShader); + + _skyboxTexture = new CubeTexture(); + _skyboxTexture.InternalPixelFormat = PixelInternalFormat.Rgb8; + _skyboxTexture.PixelFormat = OpenTK.Graphics.OpenGL.PixelFormat.Bgra; + _skyboxTexture.MinFilter = TextureMinFilter.Linear; + _skyboxTexture.MagFilter = TextureMagFilter.Linear; + + _skyboxTexture.WrapS = TextureWrapMode.ClampToEdge; + _skyboxTexture.WrapT = TextureWrapMode.ClampToEdge; + _skyboxTexture.WrapR = TextureWrapMode.ClampToEdge; + + string customSkyboxFilepath = Path.Combine(Program.AppData, "skybox.png"); + using Image skyboxImage = File.Exists(customSkyboxFilepath) + ? Image.FromFile(customSkyboxFilepath) + : Resources.DefaultSkyTexture; + _skyboxTexture.SetTexture(skyboxImage); + GLErrorCheck(); + } + + // Plain color shader + { + var lineShader = ShaderProgram.Create(Resources.plainColorVertexShader, Resources.plainColorFragmentShader); + lineShader.Bind(); + lineShader.SetUniform4("BlendColor", Color.WhiteSmoke); + lineShader.SetUniform1("Intensity", 0.5f); + lineShader.Validate(); + AddShader("PlainColorShader", lineShader); + + // Cubical draw context + { + VertexArray lineVAO = new VertexArray(); + + void AddOutline(BoundingBox boundingBox, ref List vertices, ref List indices) + { + int offset = vertices.Count; + vertices.AddRange(Addon.BoundingBox.GetVertices().Select(vert => new ColorVertex(Vector3.TransformPosition(vert.Position, boundingBox.GetTransform()), vert.Color))); + indices.AddRange(Addon.BoundingBox.GetIndecies().Select(i => i + offset)); + } + + List vertices = new List(8 * 6); + List indices = new List(24 * 6); + AddOutline(head.GetCubeBoundingBox(0), ref vertices, ref indices); + AddOutline(body.GetCubeBoundingBox(0), ref vertices, ref indices); + AddOutline(rightArm.GetCubeBoundingBox(0), ref vertices, ref indices); + AddOutline(leftArm.GetCubeBoundingBox(0), ref vertices, ref indices); + AddOutline(rightLeg.GetCubeBoundingBox(0), ref vertices, ref indices); + AddOutline(leftLeg.GetCubeBoundingBox(0), ref vertices, ref indices); + VertexBuffer buffer = new VertexBuffer(); + buffer.SetData(vertices.ToArray()); + lineVAO.AddBuffer(buffer, plainColorVertexBufferLayout); + lineVAO.Bind(); + + _cubicalDrawContext = new DrawContext(lineVAO, IndexBuffer.Create(indices.ToArray()), PrimitiveType.Lines); + } + + GLErrorCheck(); + + // Skeleton draw context + { + VertexArray lineVAO = new VertexArray(); + Vector3 bodyCenterTop = body.GetFaceCenter(0, Cube.Face.Top); + Vector3 bodyCenterBottom = body.GetFaceCenter(0, Cube.Face.Bottom); + ColorVertex[] data = [ + new ColorVertex(head.GetFaceCenter(0, Cube.Face.Top)), + new ColorVertex(bodyCenterBottom), + + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Bottom)), + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Top)), + new ColorVertex(rightArm.GetFaceCenter(0, Cube.Face.Top)), + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Top)), + + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Bottom)), + new ColorVertex(leftArm.GetFaceCenter(0, Cube.Face.Top)), + + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Bottom)), + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Top)), + new ColorVertex(rightLeg.GetFaceCenter(0, Cube.Face.Top)), + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Top)), + + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Bottom)), + new ColorVertex(leftLeg.GetFaceCenter(0, Cube.Face.Top)), + ]; + VertexBuffer buffer = new VertexBuffer(); + buffer.SetData(data); + lineVAO.AddBuffer(buffer, plainColorVertexBufferLayout); + lineVAO.Bind(); + + _skeletonDrawContext = new DrawContext(lineVAO, buffer.GenIndexBuffer(), PrimitiveType.Lines); + } + + // Ground plane draw context + { + Vector3 center = Vector3.Zero; + Color planeColor = Color.CadetBlue; + + ColorVertex[] vertices = [ + new ColorVertex(new Vector3(center.X + 1f, 0f, center.Z + 1f), planeColor), + new ColorVertex(new Vector3(center.X - 1f, 0f, center.Z + 1f), planeColor), + new ColorVertex(new Vector3(center.X - 1f, 0f, center.Z - 1f), planeColor), + new ColorVertex(new Vector3(center.X + 1f, 0f, center.Z - 1f), planeColor), + ]; + var planeVAO = new VertexArray(); + VertexBuffer buffer = new VertexBuffer(); + buffer.SetData(vertices); + planeVAO.AddBuffer(buffer, plainColorVertexBufferLayout); + + _groundDrawContext = new DrawContext(planeVAO, buffer.GenIndexBuffer(), PrimitiveType.Quads); + } + + GLErrorCheck(); + } + } + + private DrawContext GetGuidelineDrawContext() + { + return guidelineMode == GuidelineMode.Skeleton ? _skeletonDrawContext : _cubicalDrawContext; + } + + protected virtual void OnTextureChanging(object sender, TextureChangingEventArgs e) + { + if (e.NewTexture is null) + e.Cancel = true; + + if (e.Cancel) + return; + skinTexture.SetTexture(e.NewTexture); + GLErrorCheck(); + } + + protected virtual void OnCapeTextureChanging(object sender, TextureChangingEventArgs e) + { + if (e.NewTexture is null) + e.Cancel = true; + + if (e.Cancel) + return; + capeTexture.SetTexture(e.NewTexture); + GLErrorCheck(); + } + + public void SetPartOffset(SkinPartOffset offset) + { + SetPartOffset(offset.Type, offset.Value); + } + + public void SetPartOffset(string name, float value) + { + if (!SkinPartOffset.ValidModelOffsetTypes.Contains(name)) + { + Trace.TraceWarning($"{name} is not a valid offset."); + return; + } + bool offsetSpecific = offsetSpecificMeshStorage.ContainsKey(name); + if (!meshStorage.ContainsKey(name) && !offsetSpecific) + { + Trace.TraceError($"[{nameof(SetPartOffset)}]: '{name}' is not inside {nameof(meshStorage)} or {nameof(offsetSpecificMeshStorage)}"); + return; + } + if (offsetSpecific) + { + offsetSpecificMeshStorage[name].Offset = Vector3.UnitY * value; + return; + } + meshStorage[name].Offset = Vector3.UnitY * value; + CalculateSkinBounds(); + } + + internal void ResetOffsets() + { + foreach (var key in meshStorage.Keys.ToArray()) + { + meshStorage[key].Offset = Vector3.Zero; + } + foreach (var key in offsetSpecificMeshStorage.Keys.ToArray()) + { + offsetSpecificMeshStorage[key].Offset = Vector3.Zero; + } + CalculateSkinBounds(); + } + + internal IEnumerable GetOffsets() + { + foreach (KeyValuePair mesh in meshStorage) + { + if (SkinPartOffset.ValidModelOffsetTypes.Contains(mesh.Key) && mesh.Value.Offset.Y != 0f) + yield return new SkinPartOffset(mesh.Key, mesh.Value.Offset.Y); + } + foreach (KeyValuePair offsetmesh in offsetSpecificMeshStorage) + { + if (offsetmesh.Value.Offset.Y != 0f) + yield return new SkinPartOffset(offsetmesh.Key, offsetmesh.Value.Offset.Y); + } + yield break; + } + + private void ModelData_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + // TODO: dont re-initialize everytime.. + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + if (e.NewItems[0] is SkinBOX addedBox) + { + AddCustomModelPart(addedBox); + } + break; + case NotifyCollectionChangedAction.Reset: + case NotifyCollectionChangedAction.Remove: + case NotifyCollectionChangedAction.Replace: + ReInitialzeSkinData(); + goto default; + case NotifyCollectionChangedAction.Move: + break; + default: + break; + } + CalculateSkinBounds(); + } + + private void CalculateSkinBounds() + { + _skinBounds = meshStorage.Values.Select(item => item.GetBounds(Matrix4.Identity)).GetEnclosingBoundingBox(); + } + + private void AddCustomModelPart(SkinBOX skinBox) + { + if (!meshStorage.ContainsKey(skinBox.Type)) + { + Trace.TraceWarning("[{0}@{1}] Invalid BOX Type: '{2}'", nameof(SkinRenderer), nameof(AddCustomModelPart), skinBox.Type); + return; + } + + CubeMeshCollection cubeMesh = meshStorage[skinBox.Type]; + cubeMesh.AddSkinBox(skinBox, autoInflateOverlayParts && skinBox.IsOverlayPart() ? skinBox.Type == "HEADWEAR" ? OverlayScale * 2 : OverlayScale : 0f); + } + + private void OnANIMUpdate() + { + head.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.HEAD_DISABLED)); + head.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.HEAD_OVERLAY_DISABLED)); + + body.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.BODY_DISABLED)); + rightArm.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED)); + leftArm.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED)); + rightLeg.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED)); + leftLeg.SetVisible(0, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED)); + + bool slim = ANIM.GetFlag(SkinAnimFlag.SLIM_MODEL); + + head.FlipZMapping = true; + if (slim || ANIM.GetFlag(SkinAnimFlag.RESOLUTION_64x64)) + { + TextureSize = new Size(64, 64); + body.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.BODY_OVERLAY_DISABLED)); + rightArm.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED)); + leftArm.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED)); + rightLeg.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED)); + leftLeg.SetVisible(1, !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED)); + + int slimValue = slim ? 3 : 4; + rightArm.ReplaceCube(0, new(slim ? -2 : -3, -2, -2), new(slimValue, 12, 4), new(40, 16)); + rightArm.ReplaceCube(1, new(slim ? -2 : -3, -2, -2), new(slimValue, 12, 4), new(40, 32), inflate: OverlayScale); + + leftArm.ReplaceCube(0, new(-1, -2, -2), new(slimValue, 12, 4), new(32, 48)); + leftArm.ReplaceCube(1, new(-1, -2, -2), new(slimValue, 12, 4), new(48, 48), inflate: OverlayScale); + + rightLeg.ReplaceCube(0, new(-2, 0, -2), new(4, 12, 4), new(0, 16)); + leftLeg.ReplaceCube(0, new(-2, 0, -2), new(4, 12, 4), new(16, 48)); + return; + } + + TextureSize = new Size(64, 32); + + body.SetVisible(1, false); + head.FlipZMapping = false; + + rightArm.ReplaceCube(0, new(-3, -2, -2), new(4, 12, 4), new(40, 16)); + rightArm.SetVisible(1, false); + + leftArm.ReplaceCube(0, new(-1, -2, -2), new(4, 12, 4), new(40, 16), mirrorTexture: true); + leftArm.SetVisible(1, false); + + rightLeg.ReplaceCube(0, new(-2, 0, -2), new(4, 12, 4), new(0, 16)); + rightLeg.SetVisible(1, false); + leftLeg.ReplaceCube (0, new(-2, 0, -2), new(4, 12, 4), new(0, 16), mirrorTexture: true); + leftLeg.SetVisible(1, false); + } + + protected override bool ProcessDialogKey(Keys keyData) + { + switch (keyData) + { + case Keys.F3: + showWireFrame = !showWireFrame; + return true; + case Keys.R: + ResetCamera(head.GetCenter(0)); + return true; + case Keys.C: + CenterSelectedObject(); + break; + } + return base.ProcessDialogKey(keyData); + } + + public override void ResetCamera(Vector3 defaultPosition) + { + base.ResetCamera(defaultPosition); + Camera.Distance = DefaultCameraDistance; + } + + internal void CenterSelectedObject() + { + if (ModelData.IndexInRange(SelectedIndex)) + { + SkinBOX skinBox = ModelData[SelectedIndex]; + if (!meshStorage.ContainsKey(skinBox.Type)) + { + Trace.TraceWarning("[{0}@{1}] Invalid BOX Type: '{2}'", nameof(SkinRenderer), nameof(CenterSelectedObject), skinBox.Type); + return; + } + + CubeMeshCollection cubeMesh = meshStorage[skinBox.Type]; + Vector3 center = skinBox.ToCube().Center; + Matrix4 camMat = (Matrix4.CreateTranslation(cubeMesh.Translation) * Matrix4.CreateTranslation(center + cubeMesh.Offset) * Matrix4.CreateScale(-1, 1, 1)); + Vector3 camPos = camMat.ExtractTranslation(); + Camera.FocalPoint = camPos; + Camera.Distance = skinBox.Size.Length() * 2; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (DesignMode) + { + return; + } + + FramebufferBegin(); + + GL.Enable(EnableCap.LineSmooth); + Matrix4 viewProjection = Camera.GetViewProjection(); + + // Render Skybox + { + GL.DepthFunc(DepthFunction.Lequal); + GL.DepthMask(false); + ShaderProgram skyboxShader = GetShader("SkyboxShader"); + skyboxShader.Bind(); + _skyboxTexture.Bind(); + + Matrix4 view = new Matrix4(new Matrix3(Matrix4.LookAt(Camera.WorldPosition, Camera.WorldPosition + Camera.Orientation, Camera.Up))) + * Matrix4.CreateRotationY(MathHelper.DegreesToRadians(Camera.Yaw)) + * Matrix4.CreateRotationX(MathHelper.DegreesToRadians(Camera.Pitch)); + Matrix4 viewproj = view * Camera.GetProjection(); + skyboxShader.SetUniformMat4("ViewProjection", ref viewproj); + Renderer.Draw(skyboxShader, _skyboxRenderBuffer); + GL.DepthMask(true); + GL.DepthFunc(DepthFunction.Less); + } + + ShaderProgram lineShader = GetShader("PlainColorShader"); + + // Render (custom) skin + { + GL.Enable(EnableCap.Texture2D); // Enable textures + + GL.Enable(EnableCap.Blend); + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + + GL.Enable(EnableCap.AlphaTest); // Enable transparent + GL.AlphaFunc(AlphaFunction.Greater, 0.0f); + GL.DepthFunc(DepthFunction.Lequal); + + if (showWireFrame) + GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); + + Matrix4 renderTransform = Matrix4.CreateScale(1f, -1f, -1f); + + ShaderProgram cubeShader = GetShader("CubeShader"); + cubeShader.Bind(); + cubeShader.SetUniformMat4("ViewProjection", ref viewProjection); + cubeShader.SetUniform2("TexSize", TextureSize); + + skinTexture.Bind(); + + Matrix4 legRightMatrix = Matrix4.Identity; + Matrix4 legLeftMatrix = Matrix4.Identity; + Matrix4 armRightMatrix = Matrix4.Identity; + Matrix4 armLeftMatrix = Matrix4.Identity; + if (Animate) + { + if (ANIM.GetFlag(SkinAnimFlag.DINNERBONE)) + { + renderTransform *= Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(-180f)); + renderTransform = Matrix4.CreateTranslation(head.GetFaceCenter(0, Cube.Face.Top)) * renderTransform.Pivoted(Vector3.UnitY * 12f); + } + + if (!ANIM.GetFlag(SkinAnimFlag.STATIC_ARMS)) + { + armRightMatrix = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(animationCurrentRotationAngle)); + armLeftMatrix = Matrix4.CreateRotationX(MathHelper.DegreesToRadians((ANIM.GetFlag(SkinAnimFlag.SYNCED_ARMS) ? 1f : -1f) * animationCurrentRotationAngle)); + if (ANIM.GetFlag(SkinAnimFlag.STATUE_OF_LIBERTY)) + { + armRightMatrix = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(-180f)); + armLeftMatrix = Matrix4.CreateRotationX(0f); + } + if (ANIM.GetFlag(SkinAnimFlag.ZOMBIE_ARMS)) + { + var rotation = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(-90f)); + armRightMatrix = rotation; + armLeftMatrix = rotation; + } + } + + if (!ANIM.GetFlag(SkinAnimFlag.STATIC_LEGS)) + { + legRightMatrix = Matrix4.CreateRotationX(MathHelper.DegreesToRadians((ANIM.GetFlag(SkinAnimFlag.SYNCED_LEGS) ? 1f : -1f) * animationCurrentRotationAngle)); + legLeftMatrix = Matrix4.CreateRotationX(MathHelper.DegreesToRadians(animationCurrentRotationAngle)); + } + armRightMatrix = RightArmMatrix * armRightMatrix; + armLeftMatrix = LeftArmMatrix * armLeftMatrix; + } + + RenderBodyPart(cubeShader, Matrix4.Identity, renderTransform, "HEAD", "HEADWEAR", "BODY", "JACKET"); + RenderBodyPart(cubeShader, armRightMatrix, renderTransform, "ARM0", "SLEEVE0"); + RenderBodyPart(cubeShader, armLeftMatrix, renderTransform, "ARM1", "SLEEVE1"); + RenderBodyPart(cubeShader, legRightMatrix, renderTransform, "LEG0", "PANTS0"); + RenderBodyPart(cubeShader, legLeftMatrix, renderTransform, "LEG1", "PANTS1"); + + if (_capeImage is not null) + { + cubeShader.SetUniform2("TexSize", new Vector2(64, 32)); + capeTexture.Bind(); + // Defines minimum Angle(in Degrees) of the cape + float capeMinimumRotationAngle = 7.5f; + // Controls how much of an angle is applied + float capeRotationFactor = 0.4f; + // Low value = slow movement + float capeRotationSpeed = 0.02f; + float capeRotation = ((float)MathHelper.RadiansToDegrees(Math.Sin(Math.Abs(animationCurrentRotationAngle) * capeRotationSpeed) * capeRotationFactor)) + capeMinimumRotationAngle; + Matrix4 partMatrix = + Matrix4.CreateRotationY(MathHelper.DegreesToRadians(180f)) * + Matrix4.CreateRotationX(MathHelper.DegreesToRadians(capeRotation)); + RenderPart(cubeShader, cape, partMatrix, renderTransform); + } + + // Armor rendering + if (ShowArmor && !ANIM.GetFlag(SkinAnimFlag.ALL_ARMOR_DISABLED)) + { + armorTexture.Bind(); + cubeShader.SetUniform2("TexSize", new Vector2(64, 64)); + if (!ANIM.GetFlag(SkinAnimFlag.HEAD_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_HEAD_ARMOR)) + RenderPart(cubeShader, offsetSpecificMeshStorage["HELMET"], Matrix4.Identity, renderTransform); + + if (!ANIM.GetFlag(SkinAnimFlag.BODY_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_BODY_ARMOR)) + RenderPart(cubeShader, offsetSpecificMeshStorage["CHEST"], Matrix4.Identity, renderTransform); + + if (!ANIM.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_RIGHT_ARM_ARMOR)) + RenderPart(cubeShader, offsetSpecificMeshStorage["SHOULDER0"], armRightMatrix, renderTransform); + + if (!ANIM.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_LEFT_ARM_ARMOR)) + RenderPart(cubeShader, offsetSpecificMeshStorage["SHOULDER1"], armLeftMatrix, renderTransform); + + bool showRightLegArmor = !ANIM.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_RIGHT_LEG_ARMOR); + if (showRightLegArmor) + { + RenderPart(cubeShader, offsetSpecificMeshStorage["PANTS0"], legRightMatrix, renderTransform); + RenderPart(cubeShader, offsetSpecificMeshStorage["BOOT0"], legRightMatrix, renderTransform); + } + + bool showLeftLegArmor = !ANIM.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED) || ANIM.GetFlag(SkinAnimFlag.FORCE_LEFT_LEG_ARMOR); + if (showLeftLegArmor) + { + RenderPart(cubeShader, offsetSpecificMeshStorage["PANTS1"], legLeftMatrix, renderTransform); + RenderPart(cubeShader, offsetSpecificMeshStorage["BOOT1"], legLeftMatrix, renderTransform); + } + + if (showRightLegArmor && showLeftLegArmor) + RenderPart(cubeShader, offsetSpecificMeshStorage["WAIST"], Matrix4.Identity, renderTransform); + } + + if (showWireFrame) + GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); + + if (ShowGuideLines) + { + GL.DepthFunc(DepthFunction.Always); + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + lineShader.Bind(); + lineShader.SetUniformMat4("ViewProjection", ref viewProjection); + lineShader.SetUniformMat4("Transform", ref renderTransform); + lineShader.SetUniform1("Intensity", 1f); + lineShader.SetUniform4("BlendColor", GuideLineColor); + Renderer.SetLineWidth(2.5f); + Renderer.Draw(lineShader, GetGuidelineDrawContext()); + Renderer.SetLineWidth(1f); + GL.DepthFunc(DepthFunction.Less); + } + + BoundingBox boundingBox = GetSelectedBoundingArea(); + + Matrix4 boundingBoxRenderTransform = renderTransform; + + if (SelectedIndices.Length == 1 && ModelData.IndexInRange(SelectedIndices[0])) + { + SkinBOX box = ModelData[SelectedIndices[0]]; + + if (meshStorage.ContainsKey(box.Type)) + { + CubeMeshCollection cubeMesh = meshStorage[box.Type]; + + Matrix4 GetGroupTransform(string type) + { + switch (type) + { + case "ARM0": + case "SLEEVE0": + return armRightMatrix; + case "ARM1": + case "SLEEVE1": + return armLeftMatrix; + case "LEG0": + case "PANTS0": + return legRightMatrix; + case "LEG1": + case "PANTS1": + return legLeftMatrix; + default: + return Matrix4.Identity; + } + } + boundingBoxRenderTransform = GetGroupTransform(box.Type) * renderTransform; + } + } + + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.SrcColor); + DrawBoundingBox(boundingBoxRenderTransform, boundingBox, HighlightlingColor); + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + + // Show skin bounds + if (ShowBoundingBox) + { + GL.BlendFunc(BlendingFactor.SrcColor, BlendingFactor.SrcAlpha); + DrawBoundingBox(renderTransform, _skinBounds, Color.BurlyWood); + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + } + } + + // Ground plane + { + GL.Enable(EnableCap.DepthTest); + GL.Enable(EnableCap.AlphaTest); // Enable transparent + GL.AlphaFunc(AlphaFunction.Always, 0.0f); + GL.BlendFunc(BlendingFactor.DstAlpha, BlendingFactor.OneMinusSrcAlpha); + lineShader.Bind(); + lineShader.SetUniformMat4("ViewProjection", ref viewProjection); + lineShader.SetUniform1("Intensity", 0.5f); + lineShader.SetUniform4("BlendColor", Color.AntiqueWhite); + Matrix4 transform = Matrix4.CreateScale(25f) * Matrix4.CreateTranslation(new Vector3(0f, -24.1f, 0f)); + lineShader.SetUniformMat4("Transform", ref transform); + Renderer.Draw(lineShader, _groundDrawContext); + GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); + } + + FramebufferEnd(); + } + + private BoundingBox GetSelectedBoundingArea() + { + IEnumerable GetBoundingBoxesFromSelectedIndices(IEnumerable selectedIndices) + { + foreach (var selectedIndex in selectedIndices) + { + if (!ModelData.IndexInRange(selectedIndex)) + continue; + + SkinBOX box = ModelData[selectedIndex]; + + if (!meshStorage.ContainsKey(box.Type)) + continue; + + float inflate = autoInflateOverlayParts && box.IsOverlayPart() ? box.Type == "HEADWEAR" ? OverlayScale * 2 : OverlayScale : 0f; + Cube cube = box.ToCube(inflate); + CubeMeshCollection cubeMesh = meshStorage[box.Type]; + yield return cube.GetBoundingBox(cubeMesh.GetTransform()); + } + yield break; + } + return GetBoundingBoxesFromSelectedIndices(SelectedIndices).GetEnclosingBoundingBox(); + } + + private void RenderBodyPart(ShaderProgram shader, Matrix4 partsMatrix, Matrix4 globalMatrix, params string[] partNames) + { + foreach (var partName in partNames) + { + RenderPart(shader, meshStorage[partName], partsMatrix, globalMatrix); + } + } + + private void RenderPart(ShaderProgram shader, GenericMesh mesh, Matrix4 partMatrix, Matrix4 globalMatrix) where T : struct + { + Matrix4 transform = partMatrix * mesh.GetTransform() * globalMatrix; + DrawMesh(mesh, shader, transform); + } + + protected override void OnUpdate(object sender, TimeSpan timestep) + { + base.OnUpdate(sender, timestep); + double delta = timestep.TotalSeconds; + if (!Animate) + return; + + animationCurrentRotationAngle += (float)delta * animationRotationSpeed; + animationCurrentRotationAngle = MathHelper.Clamp(animationCurrentRotationAngle, -animationMaxAngleInDegrees, animationMaxAngleInDegrees); + if (animationCurrentRotationAngle >= animationMaxAngleInDegrees || animationCurrentRotationAngle <= -animationMaxAngleInDegrees) + animationRotationSpeed = -animationRotationSpeed; + } + + private void ReInitialzeSkinData() + { + foreach (CubeMeshCollection mesh in meshStorage.Values) + { + mesh.Clear(); + } + + InitializeSkinData(); + UpdateModelData(); + OnANIMUpdate(); + } + + private void UpdateModelData() + { + foreach (SkinBOX item in ModelData) + { + AddCustomModelPart(item); + } + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Rendering/SkinRenderer.resx b/PCK-Studio/Rendering/SkinRenderer.resx new file mode 100644 index 00000000..b6091f39 --- /dev/null +++ b/PCK-Studio/Rendering/SkinRenderer.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 16, 20 + + \ No newline at end of file diff --git a/PCK-Studio/Resources/armor.png b/PCK-Studio/Resources/armor.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b1cfdb387a8561cceb4d9528233090196edc44 GIT binary patch literal 2355 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 Z%pb2+9VQ*82Ic?&002ovPDHLkV1j--MbQ8N literal 0 HcmV?d00001 diff --git a/PCK-Studio/Resources/entityBehavioursData.json b/PCK-Studio/Resources/entityBehavioursData.json new file mode 100644 index 00000000..921fe41f --- /dev/null +++ b/PCK-Studio/Resources/entityBehavioursData.json @@ -0,0 +1,489 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "area_effect_cloud", + "displayName": "Area Effect Cloud / Particle" + }, + { + "internalName": "armor_stand", + "displayName": "Armor Stand" + }, + { + "internalName": "arrow", + "displayName": "Arrow" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze", + "displayName": "Blaze" + }, + { + "internalName": "boat", + "displayName": "Boat" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "cave_spider", + "displayName": "Cave Spider" + }, + { + "internalName": "chest_minecart", + "displayName": "Chest Minecart" + }, + { + "internalName": "chicken", + "displayName": "Chicken" + }, + { + "internalName": "cod", + "displayName": "Cod" + }, + { + "internalName": "commandblock_minecart", + "displayName": "Command Block Minecart" + }, + { + "internalName": "cow", + "displayName": "Cow" + }, + { + "internalName": "creeper", + "displayName": "Creeper" + }, + { + "internalName": "dolphin", + "displayName": "Dolphin" + }, + { + "internalName": "donkey", + "displayName": "Donkey" + }, + { + "internalName": "dragon_fireball", + "displayName": "Dragon Fireball" + }, + { + "internalName": "drowned", + "displayName": "Drowned" + }, + { + "internalName": "egg", + "displayName": "Thrown Egg" + }, + { + "internalName": "elder_guardian", + "displayName": "Elder Guardian" + }, + { + "internalName": "ender_crystal", + "displayName": "End Crystal" + }, + { + "internalName": "ender_dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "ender_pearl", + "displayName": "Thrown Ender Pearl" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "endermite", + "displayName": "Endermite" + }, + { + "internalName": "evocation_illager", + "displayName": "Evoker" + }, + { + "internalName": "evocation_fangs", + "displayName": "Evoker Fangs" + }, + { + "internalName": "xp_bottle", + "displayName": "Thrown Bottle O' Enchanting" + }, + { + "internalName": "xp_orb", + "displayName": "Experience Orb" + }, + { + "internalName": "eye_of_ender_signal", + "displayName": "Thrown Eye of Ender" + }, + { + "internalName": "falling_block", + "displayName": "Falling Block" + }, + { + "internalName": "fireball", + "displayName": "Fireball" + }, + { + "internalName": "fireworks_rocket", + "displayName": "Firework Rocket" + }, + { + "internalName": "furnace_minecart", + "displayName": "Furnace Minecart" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "giant", + "displayName": "Giant" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "hopper_minecart", + "displayName": "Hopper Minecart" + }, + { + "internalName": "horse", + "displayName": "Horse" + }, + { + "internalName": "husk", + "displayName": "Husk" + }, + { + "internalName": "villager_golem", + "displayName": "Iron Golem" + }, + { + "internalName": "item", + "displayName": "Dropped Item" + }, + { + "internalName": "item_frame", + "displayName": "Item Frame" + }, + { + "internalName": "leash_knot", + "displayName": "Lead Knot" + }, + { + "internalName": "llama", + "displayName": "Llama" + }, + { + "internalName": "llama_spit", + "displayName": "Llama Spit" + }, + { + "internalName": "magma_cube", + "displayName": "Magma Cube" + }, + { + "internalName": "minecart", + "displayName": "Minecart" + }, + { + "internalName": "mooshroom", + "displayName": "Mooshroom" + }, + { + "internalName": "mule", + "displayName": "Mule" + }, + { + "internalName": "ocelot", + "displayName": "Ocelot" + }, + { + "internalName": "painting", + "displayName": "Painting" + }, + { + "internalName": "panda", + "displayName": "Panda [PS4 EXCLUSIVE]" + }, + { + "internalName": "parrot", + "displayName": "Parrot" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "pig", + "displayName": "Pig" + }, + { + "internalName": "pillager", + "displayName": "Pillager [PS4 EXCLUSIVE]" + }, + { + "internalName": "polar_bear", + "displayName": "Polar Bear" + }, + { + "internalName": "potion", + "displayName": "Thrown Potion" + }, + { + "internalName": "pufferfish", + "displayName": "Pufferfish" + }, + { + "internalName": "rabbit", + "displayName": "Rabbit" + }, + { + "internalName": "ravager", + "displayName": "Ravager [PS4 EXCLUSIVE]" + }, + { + "internalName": "salmon", + "displayName": "Salmon" + }, + { + "internalName": "sheep", + "displayName": "Sheep" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "shulker_bullet", + "displayName": "Shulker Bullet" + }, + { + "internalName": "silverfish", + "displayName": "Silverfish" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "skeleton_horse", + "displayName": "Skeleton Horse" + }, + { + "internalName": "slime", + "displayName": "Slime" + }, + { + "internalName": "small_fireball", + "displayName": "Small Fireball" + }, + { + "internalName": "snowman", + "displayName": "Snow Golem" + }, + { + "internalName": "snowball", + "displayName": "Thrown Snowball" + }, + { + "internalName": "spawner_minecart", + "displayName": "Spawner Minecart" + }, + { + "internalName": "spectral_arrow", + "displayName": "Spectral Arrow" + }, + { + "internalName": "spider", + "displayName": "Spider" + }, + { + "internalName": "squid", + "displayName": "Squid" + }, + { + "internalName": "stray", + "displayName": "Stray" + }, + { + "internalName": "tnt", + "displayName": "Primed TNT" + }, + { + "internalName": "tnt_minecart", + "displayName": "TNT Minecart" + }, + { + "internalName": "trident", + "displayName": "Thrown Trident" + }, + { + "internalName": "tropical_fish", + "displayName": "Tropical Fish" + }, + { + "internalName": "turtle", + "displayName": "Turtle" + }, + { + "internalName": "vex", + "displayName": "Vex" + }, + { + "internalName": "villager", + "displayName": "Villager" + }, + { + "internalName": "vindication_illager", + "displayName": "Vindicator" + }, + { + "internalName": "wandering_trader", + "displayName": "Wandering Trader [PS4 EXCLUSIVE]" + }, + { + "internalName": "witch", + "displayName": "Witch" + }, + { + "internalName": "wither", + "displayName": "Wither" + }, + { + "internalName": "wither_skeleton", + "displayName": "Wither Skeleton" + }, + { + "internalName": "wither_skull", + "displayName": "Wither Skull" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "zombie", + "displayName": "Zombie" + }, + { + "internalName": "zombie_horse", + "displayName": "Zombie Horse" + }, + { + "internalName": "zombie_pigman", + "displayName": "Zombie Pigman" + }, + { + "internalName": "zombie_villager", + "displayName": "Zombie Villager" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "illusion_illager", + "displayName": "Illusioner" + } + ] +} diff --git a/PCK-Studio/Resources/entityMaterialsData.json b/PCK-Studio/Resources/entityMaterialsData.json new file mode 100644 index 00000000..259a077b --- /dev/null +++ b/PCK-Studio/Resources/entityMaterialsData.json @@ -0,0 +1,485 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze_head", + "displayName": "Blaze" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "drowned", + "displayName": "Drowned" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ender_dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "iron_golem", + "displayName": "Iron Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "magma_cube", + "displayName": "Magma Cube" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "sheep", + "displayName": "Sheep" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "stray", + "displayName": "Stray" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "wither_boss", + "displayName": "Wither" + }, + { + "internalName": "wither_skeleton", + "displayName": "Wither Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie_pigman", + "displayName": "Zombie Pigman" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "villager", + "displayName": "Villager [PS4 EXCLUSIVE]" + }, + { + "internalName": "zombie_villager", + "displayName": "Zombie Villager [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "phantom_invisible", + "displayName": "Phantom (Overlay)" + }, + { + "internalName": "enderman_invisible", + "displayName": "Enderman (Overlay)" + }, + { + "internalName": "spider_invisible", + "displayName": "Spiders (Overlay)" + }, + { + "internalName": "spider", + "displayName": "Spiders" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + } + ] +} diff --git a/PCK-Studio/Resources/entityModelsData.json b/PCK-Studio/Resources/entityModelsData.json new file mode 100644 index 00000000..647be99b --- /dev/null +++ b/PCK-Studio/Resources/entityModelsData.json @@ -0,0 +1,485 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze", + "displayName": "Blaze" + }, + { + "internalName": "boat", + "displayName": "Boat" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "chicken", + "displayName": "Chicken" + }, + { + "internalName": "cod", + "displayName": "Cod" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "cow", + "displayName": "Cow" + }, + { + "internalName": "creeper", + "displayName": "Creeper" + }, + { + "internalName": "dolphin", + "displayName": "Dolphin" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie.drowned", + "displayName": "Drowned" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "endermite", + "displayName": "Endermite" + }, + { + "internalName": "evoker", + "displayName": "Evoker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie.husk", + "displayName": "Husk" + }, + { + "internalName": "irongolem", + "displayName": "Iron Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "llama", + "displayName": "Llama" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "lavaslime", + "displayName": "Magma Cube" + }, + { + "internalName": "minecart", + "displayName": "Minecart" + }, + { + "internalName": "mooshroom", + "displayName": "Mooshroom" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ocelot", + "displayName": "Ocelot" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "panda", + "displayName": "Panda [PS4 EXCLUSIVE]" + }, + { + "internalName": "parrot", + "displayName": "Parrot" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "pig", + "displayName": "Pig" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "polarbear", + "displayName": "Polar Bear" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "pufferfish.large", + "displayName": "Pufferfish (Large)" + }, + { + "internalName": "rabbit", + "displayName": "Rabbit" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "salmon", + "displayName": "Salmon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "silverfish", + "displayName": "Silverfish" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "snowgolem", + "displayName": "Snow Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "squid", + "displayName": "Squid" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "trident", + "displayName": "Thrown Trident" + }, + { + "internalName": "tropicalfish_a", + "displayName": "Tropical Fish (Small)" + }, + { + "internalName": "turtle", + "displayName": "Turtle" + }, + { + "internalName": "vex", + "displayName": "Vex" + }, + { + "internalName": "villager", + "displayName": "Villager" + }, + { + "internalName": "vindicator", + "displayName": "Vindicator/Illusioner" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "witch", + "displayName": "Witch" + }, + { + "internalName": "witherboss", + "displayName": "Wither" + }, + { + "internalName": "skeleton.wither", + "displayName": "Wither Skeleton" + }, + { + "internalName": "witherboss.armor", + "displayName": "Wither (Armor)" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "zombie", + "displayName": "Zombie" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "pigzombie", + "displayName": "Zombie Pigman" + }, + { + "internalName": "zombie.villager", + "displayName": "Zombie Villager" + }, + { + "internalName": "skeleton_head", + "displayName": "Skeleton Skull" + }, + { + "internalName": "skeleton_wither_head", + "displayName": "Wither Skeleton Skull" + }, + { + "internalName": "zombie_head", + "displayName": "Zombie Head" + }, + { + "internalName": "creeper_head", + "displayName": "Creeper Head" + }, + { + "internalName": "dragon_head", + "displayName": "Ender Dragon Head" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "spider", + "displayName": "Spider" + }, + { + "internalName": "bed", + "displayName": "Bed" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "horse.v2", + "displayName": "Horse/Donkey/Mule" + }, + { + "internalName": "pufferfish.small", + "displayName": "Pufferfish (Small)" + }, + { + "internalName": "pufferfish.mid", + "displayName": "Pufferfish (Medium)" + }, + { + "internalName": "sheep.sheared", + "displayName": "Sheep (Without Fur)" + }, + { + "internalName": "sheep", + "displayName": "Sheep (Fur Only)" + }, + { + "internalName": "slime", + "displayName": "Slime (Inner)" + }, + { + "internalName": "slime.armor", + "displayName": "Slime (Outer)" + }, + { + "internalName": "skeleton.stray", + "displayName": "Stray" + }, + { + "internalName": "stray.armor", + "displayName": "Stray (Overlay)" + }, + { + "internalName": "tropicalfish_b", + "displayName": "Tropical Fish (Large)" + } + ] +} diff --git a/PCK-Studio/Resources/shader/framebufferFragmentShader.glsl b/PCK-Studio/Resources/shader/framebufferFragmentShader.glsl new file mode 100644 index 00000000..b4d3a552 --- /dev/null +++ b/PCK-Studio/Resources/shader/framebufferFragmentShader.glsl @@ -0,0 +1,13 @@ +#version 330 core + +layout(location = 0) out vec4 color; + +uniform sampler2D screenTexture; + +in vec2 texCoords; + +void main() +{ + vec3 texColor = texture(screenTexture, texCoords).rgb; + color = vec4(texColor, 1.0); +} \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/framebufferVertexShader.glsl b/PCK-Studio/Resources/shader/framebufferVertexShader.glsl new file mode 100644 index 00000000..33a9e748 --- /dev/null +++ b/PCK-Studio/Resources/shader/framebufferVertexShader.glsl @@ -0,0 +1,12 @@ +#version 330 core + +layout(location = 0) in vec4 a_PosAndTexCoord; + +out vec2 texCoords; + +void main() +{ + vec2 pos = a_PosAndTexCoord.xy; + texCoords = a_PosAndTexCoord.zw; + gl_Position = vec4(pos, 0.0, 1.0); +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/plainColorFragmentShader.glsl b/PCK-Studio/Resources/shader/plainColorFragmentShader.glsl new file mode 100644 index 00000000..31725db1 --- /dev/null +++ b/PCK-Studio/Resources/shader/plainColorFragmentShader.glsl @@ -0,0 +1,13 @@ +#version 330 core + +layout(location = 0) out vec4 FragColor; + +uniform vec4 BlendColor; +uniform float Intensity; + +in vec4 color; + +void main() +{ + FragColor = vec4((color * BlendColor).rgb, Intensity); +} \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/plainColorVertexShader.glsl b/PCK-Studio/Resources/shader/plainColorVertexShader.glsl new file mode 100644 index 00000000..c7d0b886 --- /dev/null +++ b/PCK-Studio/Resources/shader/plainColorVertexShader.glsl @@ -0,0 +1,15 @@ +#version 330 core + +layout(location = 0) in vec4 a_Pos; +layout(location = 1) in vec4 a_Color; + +uniform mat4 ViewProjection; +uniform mat4 Transform; + +out vec4 color; + +void main() +{ + color = a_Color; + gl_Position = ViewProjection * Transform * vec4(a_Pos.xyz, 1.0); +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/skyboxFragmentShader.glsl b/PCK-Studio/Resources/shader/skyboxFragmentShader.glsl new file mode 100644 index 00000000..5fd1a921 --- /dev/null +++ b/PCK-Studio/Resources/shader/skyboxFragmentShader.glsl @@ -0,0 +1,13 @@ +#version 330 core + +layout(location = 0) out vec4 color; + +uniform samplerCube skybox; +uniform float brightness; + +in vec3 texCoords; + +void main() +{ + color = vec4(texture(skybox, texCoords).rgb * clamp(brightness, 0.0, 1.0), 1.0); +} \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/skyboxVertexShader.glsl b/PCK-Studio/Resources/shader/skyboxVertexShader.glsl new file mode 100644 index 00000000..729f6678 --- /dev/null +++ b/PCK-Studio/Resources/shader/skyboxVertexShader.glsl @@ -0,0 +1,14 @@ +#version 330 core + +layout(location = 0) in vec4 a_Pos; + +uniform mat4 ViewProjection; + +out vec3 texCoords; + +void main() +{ + vec4 pos = ViewProjection * a_Pos; + gl_Position = vec4(pos.x, pos.y, pos.ww); + texCoords = vec3(a_Pos.xy, -a_Pos.z); +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/texturedCubeFragmentShader.glsl b/PCK-Studio/Resources/shader/texturedCubeFragmentShader.glsl new file mode 100644 index 00000000..0bbfdba9 --- /dev/null +++ b/PCK-Studio/Resources/shader/texturedCubeFragmentShader.glsl @@ -0,0 +1,16 @@ +#version 330 core + +layout(location = 0) out vec4 color; + +uniform sampler2D Texture; + +in vec2 o_TillingFactor; +in vec2 o_TexCoord; + +void main() +{ + vec4 result = texture(Texture, o_TexCoord * o_TillingFactor); + if (result.a <= 0.0) + discard; + color = result; +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/texturedCubeGeometryShader.glsl b/PCK-Studio/Resources/shader/texturedCubeGeometryShader.glsl new file mode 100644 index 00000000..a84094f9 --- /dev/null +++ b/PCK-Studio/Resources/shader/texturedCubeGeometryShader.glsl @@ -0,0 +1,47 @@ +#version 330 core + +layout (triangles) in; +layout (triangle_strip, max_vertices=3) out; + +uniform vec2 TexSize; + +out vec2 o_TexCoord; +out vec2 o_TillingFactor; + +in geometryData +{ + vec2 TexCoord; +} dataIn[]; + +void FixUV() +{ + bool isXBad = + dataIn[0].TexCoord.x >= TexSize.x && + dataIn[1].TexCoord.x >= TexSize.x && + dataIn[2].TexCoord.x >= TexSize.x; + + gl_Position = gl_in[0].gl_Position; + o_TexCoord = dataIn[0].TexCoord; + if (isXBad) + o_TexCoord.x = mod(o_TexCoord.x, TexSize.x); + EmitVertex(); + + gl_Position = gl_in[1].gl_Position; + o_TexCoord = dataIn[1].TexCoord; + if (isXBad) + o_TexCoord.x = mod(o_TexCoord.x, TexSize.x); + EmitVertex(); + + gl_Position = gl_in[2].gl_Position; + o_TexCoord = dataIn[2].TexCoord; + if (isXBad) + o_TexCoord.x = mod(o_TexCoord.x, TexSize.x); + EmitVertex(); +} + +void main() +{ + o_TillingFactor = 1.0 / TexSize; + FixUV(); + EndPrimitive(); +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/shader/texturedCubeVertexShader.glsl b/PCK-Studio/Resources/shader/texturedCubeVertexShader.glsl new file mode 100644 index 00000000..1e8c9114 --- /dev/null +++ b/PCK-Studio/Resources/shader/texturedCubeVertexShader.glsl @@ -0,0 +1,18 @@ +#version 330 core + +layout(location = 0) in vec3 vertexPosition; +layout(location = 1) in vec2 texCoord; + +uniform mat4 ViewProjection; +uniform mat4 Transform; + +out geometryData +{ + vec2 TexCoord; +} dataOut; + +void main() +{ + dataOut.TexCoord = texCoord; + gl_Position = ViewProjection * Transform * vec4(vertexPosition, 1.0); +}; \ No newline at end of file diff --git a/PCK-Studio/Resources/skybox_texture.png b/PCK-Studio/Resources/skybox_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..6a285591b26ce6b7c9cf841e5142194c449dafad GIT binary patch literal 1206153 zcmY&fWmKDM*2Uc^?q1y8U5ZO_cXyZIQrsO{XmJnjF2$j^OVQvE9KO!|=FZGrSy@S* z{M_rDXWJX2sw|6&M2G|d0f8znC#4Pnf$--m90UT~pO4+FGRJ@YGW#Se1@Zo`*VnGn z)ITSPE^@l=5D>`N|9V402v-MRWpD87HU}H1dT}l&%+BQPso9f38-8gR- z?}w)F6B8zEoMKx)vMF9f#lj52Jy1<#n*9kTw(*``*M|0fgR!kT05M6g!ml01qURCC zU0%1R5cp3K+V3xWw%|v$4wluC;@2QRj-krx$b4Mp%4<>Jrhc&qSz~P7X^}81aD0^; zk+@Mm+>TpPr4Gj z3!L+;K{Q+E5DdJMqs|rFHi`R^H~_$iu%<9eR>$NCeU$!!8ktp1D>Hi1ly}(fuN<8+ z`jMZ>l8pC)@K^4?tYq;L`ma$eaS9VW&R!n`unPMf>k&u#)HZJMkQvIDwaazC}p(zSX|pbiH9}e*A#+|L7q_^gAaMM}GYSBvQl$B1Z#dsz=_%Gct9RE!+qo zKP#*7OiGr{E3Nm||7>*zu+k_=R+_fJeeT<|Wk}t-LP^u_RQleTZw0@KioT;hH4l2^ z5)?qZ?;KXDe;vVoc26vh#d;F%rACqqJbcMDoDth2_kXH`iVxtR@sD%V)Uxfp+Z>*f z$9xq<)@+G|HXd`4{7_=w`pgI9zsmr)(8{j2_>fls>u zg{Sa~AeVFNQownF%DRFK7UIi~q+nWeR`YRT0I84t=(g(O^PCMedz7@+q)sfyy}%&` z8nIf)-ZPA=L#fZuZQW1vDCz`LW9+znQGv%o0?)Wo_qGus@nwG%QE2T+h>S;r)lZx= zup*Atl;;9ELXiDoy96Pd&uy$I-Qci(SW^wQKy_btcuL~&+;;kX$}u{^Up=_{ctvcQL%6tXg>m{xR@IsNP<(|@cx6K z#J5Xkmr9DiFx}}0H6kI^fri1#b@=W}b(2?4q_v@NE*H|Aji^H8+>;WyCP`iUG<>&ABw=6WA!hbK*}+?4HG|UDtKDDa$}EF#-u{+dib97-=z@Q=UWffu zNce|(V5{sc-L0Jtl5HD?tNMYmM`p12`YFb(SBKVM!Zu;xYG$VfIM@^;uYz}*QY0(< zbXbR6^YHX8hRi4@1(vGVDLW&N2&|8ffyBcvzFZmDvJ$0Rmom1jt(0sAMjawOI#E3) zOQ48_Lq>r9sCA}mXx@&y2nWX-r!?fJxNu!3lH2*nvQ1xm_KTgkn21X^0=< z!Ho5&AaTu*8+%>r!TJX6QL?9$oCjy6+7yA|R~CiS)9nxj3M|`5VW1H(7FiR9eUNER z^%g#ra_}Ty>mGvI66T4XqgE|5=CAGfH;7wMzajpb!G3QTrD(WvBT{GOqOLA4c^r#M zG_o|c3U%prXTa%hx1Y~jIJP6+5<;+R?NHD<;4Wy=Yd*o~7(i-u!MnU>3%;pNrWwIx zuGl-&7c9Ul-3zvb?5NAHJ}LC-H%GMEYAQU~x7zNJiQr5Nw*V#8Jp)TfoLr};T(Hj9 zdr`YSodou));O?9AeQUc4VaBN;=!p_HOu}!^9hV=sEKD%R>kEn6T_ER(nY?Rk_dgi zKw!brgZGc1uykWc@<+PD&!GXpceur_hRFMwu{x|ELUvbF7}rb=9TJ5KYS$f}hKBX~ zpy%dx*5T-6@Eh~$W^(XcL@78rF!Wmrg}F-~Q7wvdV3NMTqgvJ3$bQr-B^DWACr86; zq3(II8boxzj~ym@CM~An5V<%MLT}inTOnH4+!q?#!+)x>wqKJqNj%2iBH7Z(}tilj)-Uc z@=`62(RUnt3?pmcZ*K6Ei5m3)-Rv4p|KElAXWTl9U?Be5p8=9H6E0F5hdIpycK6P> zqc4!Hmi2musS+w52_%7)`e5r*KWUaSgVn$>&orNhfI_7o#dFl6TRHgKBe^SyM4(qV z|DNowp1!H#jprnu%P%Xx_9CZQKC}+X@ASU)0kL>9qxG8;@cLt-c{am*inYJ+o;o4< z=3^fiEGW1FU=aZbX6?Y?nSm5mpq7)-(?YazISuR@;0M@PC0|ydg5N?h9Q8C^{avvl8sLSRdL!hdwT{-1>@DGg#-WD#en0w<&?qb=jm1WkCvT5qilfYgP=PaEQ zaYlIVy+AzM8}z95%gCv*?mYXxauD>_(f>?xz|s@wK>quJ``4VkfXfhq|DUc z{yMDyP{6HElQz!ZM%$-c%+Xh9tFgiZ-q?v%JfPwfV)Fm=TV*$Qo)mHbCYlG7HC^yc z1ahhO_EE(5=YdM64`=OK zz8{1cAmKF#kvgbZf%kZ1KTvpzN>dd&l?!be3yLSHJ=#&`Cqh=HoqJ-3bv2#O+6_i>;dP1jdQ1XbV_Qb|$Wj#S2N>?^-(r{grH#|(o(VHH z$+c5@5KQIuC`Cgs2JszhDf8XCMJe{*L6zXiw*l^N^ClbFz2ILwH&0@#EteYfnrq|r z2lZ$Oht>}T6UeGO+$C&NydT}d#dNX-L}v44ZZI?S z_)ngR_^mLo5Kb!>6gGP2tQ6m!9f4*-WQtyT08gl)>3+>(D&Sj+c_GcwYh+qZM9N4d zp6x*zrK5{H&w`cxD;cUPa*MtFXW4}wwC?i4u8bIa9f{JNC`<^AbQS?M9{uJ-DhPJQ zFJVrm^?}w6A{WIo?yI(}w8K)PYz)q*6nMh=Z}9!Eu_t$Dg{-af5!#b4dDXR*hQeO* zh-+RR*R1?_;Wkh}e%@?%OR@lmLv{g2u?S)JNh&W(0p3Tt?jt4eZY_<&|3DwhVUZz7{V?It9al=o+B5%e^CD!tA`@IN7 zNN@8Zv)|&}Q%GzeNMuuijfIneiR3Nn-Lmq+-}Vu=m!gnbsSU)y7t58@UHQwO$RYT* z75@L$`uAPd-y$Xr@zSP18FIS(hr5pYF8Nr?XI5VKvohpmRU%793 zX2cI9P`E7hqHN!eLN~g0Ptq8f5GPIk8IQn^4s00!oq?L)DWmcvAUXX7*S2nYBu_oM z$O8BqQfioa;BJ6%KT7mWYwW_t7W!g-vP*AwcjkGdx|JyS;#)0r0H{lXYFD<+IE6)W zSNT_`KQO4QJ=UHQp5ktE^zDz5v?#&(d0^pBe?@geS((`QRcvI)z;#AM-$03O&+_#* z-pj^^1d9>yrPx?oX2AI)Pk8OZ6q}v=$5Y$5z=PPEoP1#QGm7h(g>fQZHA2Lh0P6{p zs04XZ(V^sw(Bkir504lJknaICvtA32>%-KFKMkk3CMhA7gy0RY=H!%Fw&dT{UP-X_ zG{QrXT^G~4_4Q08LRUkLhoSIkroN)zdfe(nD(aI=lVJCR)&my!q4tBWnFKz$R8i4- z$106v%ZQa)%j+$F=$&>&ixb$>t$ST(ur#rQ(E713ME7kM5QmCC^|dYYwl2%qONWYw zsfIf-cL$zSMk#6#JKwL)yXs9<8M@HOm(X0I&%@og6j_bpul} zjjZzqJI4Yi^UAE>1K)%ho;7~F+l;-yqkIqLy&Yfq1=w~4QJ$^9A|B4Zb>zoCyzilc zYYS}vTN7wAPLweCMNrCz!Lu?=pQ2I|R?dSyopEOrhTW3AX5$=FWC<^8Cr+c6LQYnB zi=Y4*e50w2)Wtc;a{KxNWd8iqAIc4|aJ}iJvKpE$Ndz<0pLiW3+Y5?(kwR3Cf~lRG z% zAxwmrt~muXA7oQJ9Vv9DdoyFoWy2zLK73D&AN14=$3})Gr{I*;jdgqxcW)=LlN!QTsaRlu>Y!nL1`(XnlkRmA{yiM+xa2 z1tMKF1A}OhQR=xfS5@zSC#3gVeQIcn(ddgN&PreI)82#{AEptJpo?JVkyzZmURO1& z!dcA#-K9s6nQs7`GODs2FCL{S2fTDLSnN`d5YIal+{v7o3iZ{O+YX!Xs9>EM7U>-< zexiQ`Em>L^)onEbD)5I_b);lGTvgccl8^8wd^5bJE3P}GvPrFp#=XA_Q`1A3V8OZo zi9MD2BpQd@GD@PRemczKhc2&N=`zJ{TbYydo9NJO)u*g0{$iUmrG!qT2lcn(!@Hsy z1GVu;k6-@jPy0chVRXX!v_w*bAL;}UHZK*Y7P_V!FuGFLiVjM{?lM5 z@Aoh7i{=o+_J_7!%Hx1l*Q{3``$9qVz62I5yTouh@?k)8M5 z)#UaG>4LFqBl{*AvEH$Fkz^2MxZ1M7FC2W|wbRtKKpEJ|-(R+ryOsJ;H@62HIJ8fH zx^u9fa(zCr_5)OX+Nb>_(%vq~ruF5bXx|t&b{@0}N?nOGLG1aQE~)cLuVDJ2dxdsW zV(q(ym)+G#LU$_j$J}hj0*z8hk|A5vL)cZDq4!qA@=?UV(>`mka zk~wG1LOPZVKOeBqAv_+orNZmD2?cflkW%B6frWh<`|vZI2xL6{X*A;OGiua5jdQppv?)+Dg0e+MprNE7Doc{`c_-F!*EpFhaHT4h{x1ltqRxZa+kbDbP2h|J^|qs5@R zXxO)ed=3qAbbm5D15z9xN2{&gv>h~#Q>>529PpV~fk9>=&~ z!}lwjr7)|J1x{c@rrqAGktq77Dh|M`#)4I97jQ+je%hc_Sg<{EE5p1!6r| zh7QDM#rt_FcO}QVCIf|PD?kSQ;fWBZfxJa`J%GK|NwJ1Z{__E@<2vuUcaVY4%%8=w zQBEKBxhP6M(sU~0F=nO!rU%(pLfY%HVk>;XxoGEG&^3@sSs-CV>F}Nc3o=6|aTGPt zz^5wX#Lih{kA!V$Ly;m=G0bXVYB>w!UMD4Qa~_zNW+~i9*X&ukwl_|2MFZJhj(b?? z2}5C_g&gvF<`B2Y$R5`YQ6^HnHtz2PYi11m5NVt6R1_h@VZsN9LwaAH2eIt1pe!Td z$~40BX5UF>vBgVeO_9a&gVnl{!IdTWx7NGqJ)(P`Ii###wo|6FSjDyZ!>MDpkwPvf zn}nIlLfiOnb=;*6W9zhZk{`NZ|4lXfc?Y-C(AG3% zXuR|*)G|AAdFEmX@n(P@*a z@Chh>oh$roU0a;`WK&DV<}Wn4x#jS=N2FFpf&?D4M0aSPm<-SCyH~6c)yib!dI~#r zqPt5*Ymwrm*tVCGE zgW_U{#|%lbKfq4Qo7(iy$bxwKNQ{F2cSw@szMn@G{xnw6R^x@0sm4hwMZ6Y<^7ij# zNo`7IX*F`UC)Z-?kWk~WG}E31R8@w))K3aJ1k0>AV&3+x<;dA3+u@_hAc8ooV> z@+!un^RtrZNux8<+>-evV~?`p(Y19{OK13!&XWznW7*wPvgi`fIWl`HUB z{6Xy>damOu<-he@WN`Kd8gQ>S#WY?C)bjbDa^UWU&m)@0#8!tZ6}RYFUHOv-e^3;h4C?NC^Wp8d zJAL=zeJ&K8e7oDEgnYZhKD)6d(ntkQ7#zl)2gGA0n`m%}pEFnU3;&3SR$6#DnvS7e z6YRLuF(e%2)eyLrt`RacFp-!&Sy0HjkcROWJQ3$<7web)P)j`Crv&%1y3pqI@q61B zvaD!*68Y}V-@}aL{QfGRuJSR%a1%cLsEdgW)&HWgSdXqyMjF*BA+{8$iSj9+AB*7Y zKII;vlX)f-HCG|=E|*CGh3Lgc0Lk`V-VqknjIBRcFw27{FTqven7o6>+osp1R zddsFgu*40U*FNHyu#l|eD$!qio^%FX2+Rs)8cV)-07r6@EBYT!n!k9HKnf^ zJbNTqoyy5aA%W{y20cwqOhJ2*Hs08UzwL26@3B3%`oDn-d-OzQKS234_I@=g$bapr!uCz| z(1bGb<6(@LWV9W5PMtvQ12tzfb`(C8ncRKZa4latHpiG+dET6;{w0{*LE{k9c(?Sp@$cw9h)sszIx4`3X(dIGA%jm#+nXj1h8r`yQZ9ZCAm zLR_Wc)WRGynl}Z{N%D!`K|D2mX0w9EF%U+!W=4?51szLD%ty@07iudK3d7Ij;nvc8 z)`P>{{er_Vt&FmTc%w)p;p`jC=0+`#SP-`>K|xafu&-JAtCG)jIMM%El9bQOcf~a|S#?v|z2T>Y#TlG(%lQ$uEFK*h` z7dOj(JdxEKa`}0R7I*YjJy_e{E>vDRTLZRCym)4N4+lWupKp1gYz+K6R_V~P0!3`# zZJc?RbF(+dHsZH~g$o)J;m`OPzaD?SoTs2r^>CkHV{T8DGmXu-Fty6}y&ZL-GnbEn zM1Uzz88NSGa`3IzH2kt=ioC}!FK(!c&jbE8v`5wVhuKPh^fi^qy+7JY&?HA4u5wdA zZTuX`)}l|K5q3ETImWrETBBhal(ws$1M1*q9@pK^1bShe^g_ z>Xdyu@jfLFWA4UQG1Ig){_}D+^jyPz7D@}lVs(lXN~}w=!l32q*(was_lpso*gwG% zA)T$c)$p^h*xb&(S0trliJtG-OHCaSE|s)JA@e!DzO%n4`c-R!Yl)P;FGY5XKE&EG zD)Z-TFfq-|8j*V6Sd)bbyy_H?K^JxkP6Y@@Y(bHX&$sjN>98FF>6qwkVPIiOF1UD1A zFEkLvrcBw=g1$W57hlcycS8gdx>lXbwcgoeprPsN#F{v7c#z)*8Oe}w+=sJMbmzpF!q4PuSZIYY~pYbZtlZW^Zja7&=tnRD{XwANvJ zJ)P}GPq4?G5^mll>=}XLS~(UTOgn#^5mQzH1zcYo)U%oQMgK5&uNU|4dN{!nmqG5v zJPJQrSK(AH_0aW+VYh@a5fwE^l%e-%-tX44oJrfPVw{5edF#dYV^jW#vhd$1d&3aXPmgm((reum zW4$-XjgrWv_msEawdZi(nmRQBB;*0Pg`|VX;XTCPdt9F4OYf~ZVuLS#iB(xf`uOg} zij$k8J)Jpdy)u+U0srm-XwxaN%q48j+ywu*o=2Y+%S;q}zI1WOp>&7+h= z2X`$}E=^o4Nw_?za3F2RhWW2c-zVsxu_eY^s2sK5{bqD!=4weS{Yl01v+{~1P*iOS zC7AWO&gVm~1iffoC#C=lxT&iO6WN&I@tyvYXd}XnoNh*g`*lDvO#RK#a+AM9OVBwj zG9Wo`0z1~sHQ3iFOFElq;F0~%bMO*^y|WnQ|7p>`$eUN*H zXB>h~j!ZSho=2|S*YA9PW~x~0JDDst;(7vZ?xoLa)!X}{%yVbU^xIYO0&C9};qUvN zcco`zK(E~LNSK$Q6&d<6H`22p0X$9Eh)oQ)fcxuXWu{n3Nlc|8U1Xmt0 zCDZ;F&flJgdPXD$w9pUY6Hy-_hsTyT7(ZNdPSpTDgaDQ*!SmhIcr82l-?TP4r-|Ls zFe;LmsqN;A(A%uWIJHNk-VU3_8?)7yA_fb=kDnj`jf38MP!z1TxkjT{4Xkl69P)(Y z3&NrzyiE7>TT6=^PdiBUC>sWqRD@z9%jTSQW9+5^#txjwt~~gQtI-x&f{-1Wcl(#Y zc^@$hMLASRqqom=hMGvKFn`&awwLfhqO8UHR_WYV1eJKUK3S?FK9{@ATWxwCynd>dYA*LZ0C#ClbuTWUAf%}zi0l*)UL&1S!E>ydU54eikfuwPwQOu}v zPKBjrXI64a<~742QoW&aXm1U+{HHhWE&d-5K^5;i0qdpMjWf@2A#8YloKL zduyWUkwRvUos|eYt3c2sD2L0W#xRpXjUqX%7?9Q*DNY{JIdKeX&r|;En}kMJk3MJl{uK+n&>pMSR-^&nkyX6 z{5;CWqLnTD7K~cYFK>kH9ZDc-LSY{s$btYgAagXJM$y3k#y#C#L!)P|SKOiHXVl)e zxv3~;mY4z&Xpx?{k^JQA>t6i%std~<+U)k{i6uM3d1h8xz?&u9b3>YGk{MjdjA@)` zYH?U0`=0n7hybc~S>=0c0zU!A9fCUObs|Tom&v@1lI1PG3KRKW;%lVvV&z{@P6u$wrAl3un7FgrT=nh4ZMm z`JfO?mA=;U=9XbJv~B#AGB}Nw)m;WBU^z(|!IhOV&W8+Vhbhge z(flx|+=fGT6S^&Ojf948N%W)Eivk3Ee{POR9cZ2(@9XsuYaVQCqxFer(gqx#A=h&C zBXjAmL}BU2syyv+9!U=sm+D?ZNsK(cqXd+58?4`~v1R5HK5lk1KfVAEMEjhaMmS4b zrBt>*QpJQ)JM3bs_xAb}R@z6#cjXdO806h(bxQq3xBk{dTZl9ef9>rZqFpoUcJwR~ zI?$Da#a-(GF-{uW04mt0A^F|`=X5|^^uy1eUGzBp-&bIlDHaO&C@I*Zvn0>Mh&`R0 z_6rc>?AKvNLf?&z($j5UEm zxi@{l4q^i?K{Bfz8}ME=yRxX06(A@lFo37N*R!dwW9JaWb9Ue#|CM}X*o;#G`nO_fCaL7(`glLv(y0= zg+Tw4XRHonoOzBzpD;^EOrr2Ec7lcB6 zk@Y=^;nGn)KG;E{r8u#Z z!%DgH3%LY!FrO#PH$?nAG#1yeXi_Yy1gYWA(Ex`cJWVDkiUIj>NKFpF7wjwp%!z}y zwVTalnaII5V-kpKNZbUyGdfKl40FU~cnnGrD6T5gc$=)bnz{tGHN=6)?fapS>vz`w z8S0(2um4d?`$&&!mhVBQIA>gf%W|201jL6vwU`)mMX#LLO95Z8PwX%qJx<@G!pkdr zY0@8r#mU`9Z}TUnD|lgIv^l#dCi`Wf7?4S{%A) z;t&45F>{6o{i%t#*2O><)Fo!{n~bD-0cL8Dy)MGUY34uvvivA~hjy$JMKJcgDS#3_~Cqcs0AZhpZ9hNd2Qb_5aIveJkjarsD z%+8PpE`E9+MvB_=SFNAwpFt9+-%l(@Tcx31wa)5ueC;g-GZEe01n)QGo$CQD4k2WW z@p~0>uv{?IoKa>@kyh}9XwmF&y+I_o(d@sbNYo2n?c%eoy6u^Jw583z1hS1S+ZgYd zM-ktWW}pqk#ewZ^WfXu2xzt2{y*#^63wk!(-9umAeoP6iK}81&{c0Pa4i7a~RxH8~ zFjNtbeS}2$*ui8^fEB`S$O8A+6GSUXg3$k1JBvL|fH4F)ii>PJ`EY1CEnVH`mN9v# zXpPq9cu{IkgJ1nb<3@u7`9!F22z$+5YKV4DiEtRew>JW;c;97+gaq>bBRZXd6Hx1XXiwuC&{Yu`KaLy<;SJ5R}D@hdKoNraj5 zi~TkjpEvcyCWdZC@jsZT}T&t%@5Yg@A$xf-52{uI4}B2QeWNl{q| zqY?W{Sc0Lgd|_K|Ve$jsqtphc0EyzYo8|>}i3quYJGsTwU6pE7_?3V)&0Xi-iz=PP zp}QyF+_FxEh^&pwx@6-v1cs4$4x$+m7beV0%C%BLTq!#TM32p*95 z*U+h`5?th0ue^C|_{5T}kGNM4Uzm2-XDs33wrFPwf_FN1YzVH+l6lVErJD&O)*Z7P zy{gYdv+gS%p>|w!Am-ZemM)eT@m~i^>M3{eYZ(4s&3_4}AV3<#*T1lKjyA0Y2t;`V8O2=O15MDd&L3(#HAts9r6Z1@(J7S5ov z9r#+GFvarmh0Tr}I;M=u4gO|n6P~-Y6J%M0DFyx>}b9wJJeRRIs;iw4LDD%k{^?S;{-ydZI2EY=)CYq#zfUoq>&2ma@$l%rLRHT zRY?iB;IJv2HFq|Pd24v&_)jyBCDAIo5*tj%RZTl~lq!LNz|x{r5$@#v#oL7a8pv5M zoeyi|w4&5eaLD!;bsx#qGBZp&dJwn2o|CjbSncIs_jWvfGG55(vDdHOGEJF= z2NmC0sai!m21GqA($~9u8!0AXFlIc=QS6D@aAJIk1EX^NqrE;SBlsxn1$soNBmbdF z44vo6FBk7K%nDuro7Z58bJ}e12T(WNO#m z#-F9utJCK;O^tVoUbW$oN$D=1z0iX6z11`^%n6?eH7Z~8*uU+SPZ4AMPS_IW2g%O4 z|CA1&S-KOpwjnj*u-E0n%#d+I$-2L~_r8L!8*T4ku`m~RR;&A71S5weF0z*({Q;vG z8W$K<7vnG;#)%eI3H>WW?77|h`-~~<=e4Ig?BhK?6_!Ch6vrC_WO2|;goI{d5Xc?Z z$^z=JcVOFJ;s$2!E;^eI2x*+PRdq;ha1^$&KFSW`$_OFVisMFURv@lZDJO!sT-eTp z`TvRBzbADI>OUMx0?|81e*u_!8+O7EQ7`KZe!$~rTu09mW?7!M!J8z_Bn;razKm4% zQ~6|G+sq3Ti$hr21X#E1l)!Fk){vqXS8M2|Ar|G!yx$nhSTzC!J=)m?#Z-Nkbw}778|% z!4wTs?!@0$iQ0QgX8J1YDehzHN$H6s6c#AVqUGGY`1`Y>XgW#E5Lua1?`Sz9vW1-+ z3If*+b?UL&E6b#;^W-yOOgHx&Kl)*L+9uIvpW|d6+bjVsq(wV~I4^F=<)XiRAmn71 zmYF+P2`5Lx!pf1yX9I_Du?zzrgid@NcX!!fAe#}KiXOr#+h^yuL_^XiroXoZl~eZz zfZbx0W&+2{gzG?Wrlu?e2LnaHwgF3b2q|kj zZ{MFGzo~BT8+?!7hVgk{8i+<|&9^#?Npi0x-v3I%vf8M&r4^0V@TOM;+JMtz=U4W` z3KrG4z%+yV?)~!>MNOi+a2Pf3^?t|5<@>Y>R^13mR`y1r)gN_JD|oiF0opSKQ=d_u zoxwc^{L64AD{MUc6HEAq_m4V~YBdCie}fPDpbq<`nhId@T|MG-JGNI*h~{$W#!=Gk zK*oaXPK4?wPGr@+yx+XxPW64dopyrMRXJ+&+GMJMLp?mbO8rOl{gyKrl(BOYS}X*A ze@^Q)PFyG{S2I!NrLyDT0|hZ!kgIw;K*l z5D;px^9z~Tqe^XEsZ}78Jx7I4S^C|<5)ASkJ+<7v@Jj`olfsOXmtul5#GXA&X}$>e zv>_$6*V;nL%7Dkj*H$kdpV!zfhi_jB35zA3%{JVocF1$@I&lGE9uLFN=G}?7%vLT-N>EH+DEH+;y0Y-P zMN0TZiC<|;)@x#o5wea|smmejreZ|Gn%!kgUZKnW7gy(CtiStx^-?_8K!xj~C675c z3Kf4Nt7-crgZS-&mFuqdccBTVS7W@WgP~Gu&fjK?x*nv-I%H>ciW4gJ;_qZ;P3PoA zzih<-3~KpffUXhO!NSq~ck-~KqVU6oinkH_X=E=z@7vSYKVWvQ+Jn?!?n_tlnHjcS zze#^!qg&+N35i&Ln&`}3u6KspvNm`VeNFpvWy{~wF@Wq2K{M$+?GoyQElXZVDD{{E zQ2H^EUL!@9nx2OD762^iJxXEYT;WZI^fzPGDy`HCBI|YC61TG}5r~|8!@m&MW6WK< zP_iQq@udN@Jd%ZCb{4S51RjNZP6hFLbIjbg!q7`0yWL)uTBSLgLDVII)RRSHe8US* z`7{o+7NF+9s-a4=xa4$nKJSqq!(u=sT}Mqd#Vff4ZS1uM#28Wz6n3S{xRWS4)0Lel zW48#%0vO&xGhOu1;x%4xj)ClF>RStq64c4ky(7 zgEXcwvhp>s;!zNo4k)HdI#h9c<9sTF&QSW({l^%b!&nS8y9bxw6KtH#5@hiGeGrDI z+r@|tqhB_z7QDs(sbDexvwh8$@6ZKKg4L5St{ao#rYp7T(Vw3ZWq~j60eoY^4$IK| z=!$FC&;{wF3`UcjHHlK!jJASu89HOE`$f{2;$LCs17*11eWlDqU#Jjg$H=3h)C2nJ zz&)abSMR6upbPZXkub1NPS?i7xytI{Jg7Z~sCUoSD|_YDl$r6ZNcga>*ClJmMc^pd z(QeHg-0EIr-*w;m5yO%Qi%dfG+)f6%FyXHEpjVSq}XEOE%IRe^c8nF zbtgL{so?dnD#*KGp|FUW9;g`!;yEk7xwPBco@99?B%7UhxQrtJh|vchG@6i+A}aPF zSg{$1WM`Z3x^9|8YwKXb!1W6WuEa{c*9>~#XNytF+79W|jwYbLiiHSBE2@1#7WPAI z-Esgfc77CU$Bb*cHb?Kv3mWv9pio4)Y%U5)dh-wuxv3#_#RS(?e8V5fWAN!~-}hQ$ zFy>$!^_+Tq!ri2GCwl)X>C&8!i=IMJrZ$^NCXFJ<+3qYhh<=%cBvX%{nj3?ePj21A z!*2*e6Uax8FT>wuXa1Sk(c4l-Xk@~UrQ6QuO*1=uICPgWNYAsBVko72mXU+w_yiSkXN1FvhR zr3m$p;JfIHT>0tKy89b%C{~D)tYvuM&IaU{5MK zW)mUYDo5Fh#5WeBJBv=^f!c5X#g3BAeWj%r@km@T^;)fZKa<0JN>-I21X~^uvmcDH z=6!*l%15CC)~EB6RC6`Mt9R#;d%H1fn?A4j2?ZDh78=VsE?OBSFxP-so^EmBV7AIm_z3vqPJs=Qg(dii&ErTx>y<(#k zVxn94G_4g(r4Lw%WAMnDh2Mi){}`K5p9TzdOQIB^8&pbCb4ePKbu-5qD;tNJ1cH)R zLq0gM%Q;;n=>JmXE!IW4HHn5XRhPe9kofT0+iiRmKr+Q7u-3sDwF7zmH6Iw$)*Hm;`r}2pWmwm-dwq%c1|RM2W$$% zg;`g9vtA!(8CE7cC0<_-q&^(O2>&p-=K#*drbXNmr7>1LJN|IBR{8_<9_iRN|x9sYzp5F1n zw?s8uevo57spGC47TKp=wjGn1Cm5^C)UHK^td#aMhP2`;F=q}r@E2#Vp~EjNdh=Po zKrpOtNW9WCUNTIK)ejMc0K)dw@SQ-Cc@_c;Z+K*!qpQ{1lBz%$`cUK;48*gx&fymt zMrcEDB)xhFv-BIs1;W6(KE{aLBC@UP`5Sg-Fa=5xm-fNrNCh(G%QmVJz9Z_Bx?0K# z&*@gK)XIB3lqft(D|T?(XzAMOb6)jfSfR9d2IKSZfLvwxwdgo%@?-Suy@-Gs+<&xx4b`Cj{YVSN+p9RViRcz#j5FNc z%2Aj;-5X%T*4dh>uyDid#Wh=4kp5~ZYUME1s~<))As}nmkv@ zO@CX0eFlZU*ZLDNejTC<*qr0xat0Mn`_UxL21A&AVeZKfp@xA+!F-j8WasS5ZSj_X|0~CYDPazJIO| z=-M{70YyKedZtvHvlUJ&c5}`wz+UF&6~@aRz#Z)`?)N!|=kS zp+&Gb#UEH<5YQD_dWd|S#Dq_(&;H(a?tBJKS&m%(qC5*WUG@%Zw+qI)5?w@}(=`*B z8Q?eh0_}i6B=nQY9b{p##C~9WuY-Y5ZXOP!QZ{Eo@QWP~B=W!`^N@fL3bBHI(=9w) zBJI~p1u1pew~#aF$s1#iPA4beU%tg2?P&Joh|sNB3bQ7aeCs;2+us0s`)B^k|9Ae& zJ6K58xOS`swz3l4n%Goc1_0*XUZkI|;GR#5XJG-I*@nZ)`}0A<6K~zT*Y7<+{6Aa( z{ck?SUHS14qSMMXiAU$8kS1f8!Hes#X#;arm$v036#jJH za8)=V#>|7A_VekwBb@DA)_jwn=zMioV7_Ka^v9y;5VwROFRPB{C1#*!SgEMD z>*a@CzIN)PPkH@cvKiSbc0=&YkJGyCC2Vr3VQuZNeZR_aadpsmd#7BQ54ny-%{K7| zq8?fQUIrqhDm-@U0qxUV4#(A8HqZxjF}mdYZL@A*2O|cROu^?Yv86~^#O(h&)*oM{ z{+j^5zgAjqyq}h?^lavm2Zz7PuWl7KlJNrHU$^4!E3C*Ub%40bpS-p>vWru%sPZ&ytn(wL=qjIV97B}YCA2D5 z=ENrwiqt?UQaO&t4;+e_;Ue1IAMx?6nahSTv~FQ}4@Q}b9F?R|GXeRZix zQJUM+ULLy<`JI5csS@iaQ~aQf>Og1tCKcG=H?Z1HAfc>3iHewTr6TWl z3MSZ&;nF#sw!}A%RE-+1#2%#4!$0p5KL7LM_x!^=VDtI9o^jm!)$dxoRJSs1Y}IH~ z18pjA_nu*&S#ydrxx1eJxvVku($N@wvodXlD4u7P#+MHTwF%@yL`@c^BhTybk?|@@@%{&u^{q zK9Y0#ijU{!VACCZJqOQcrlmYrTis6f(Z5G+t{UBKM_1!?F`T|wEt5|wZ>Kdb9|`LA zV2hv8tRZju-1pW_xxY4CNb+Z$^>Z@|k9>i`z%Q#t;s%}6K zby0L5#4a=a+3GNv3sLqQ61TOu+1JeR?QPbC<2#9MgsY%6oT1zxz5S4_^TaS|)pc0F z`)}(wQV88~`iMqxfZz~CaqF5#ResW;9zuJ)LC)=iM-H{SRZu3p<`w9l^n4xhZ+5=* zQm_5_#Xc39;AjaFv6XPF9{hu{NMxJmRo5u6_)K)-!WX}chg!b zkmJd9keYeg{i>m8<2tQgqB-t~Rr7=h_WtvColG=tWu)vvIqVShV6;)OB-Xyx^g#98 zy^)6+`4wOFWeu(%5KC-U^8ELajDlj-8UVV+5dU*xu6ian-sJ;SMANx+X*gWrlB#$g4I$dUp(sV)+El72oWW%yqmMmr_C&t`G z<+OLc9c0nk*S@a8d{@MTs|bG+94uHweoAF(MLcPWhog{=>4K%(f!=3K-CTxlisYU{ zPn~#LZNgL=RWJ*L~DOXbqJLFCw23KC;ywd zO^s1%)D7a@v}NW%2YZhfikI>_$6j9S^8@z~TaDwgUyf34j@BY)jT1&+I%X>=O(a;R zKHJI(pFpNhuaBnfPpe+mg#hO{fUeN72E`|s za(+AL_<3Fp7jyAde}r9zD2ZT=)zrK^y}S3n_Ir$ZErs~_DleE1?XbNcx%L*v5tK+! zi6D+Y@EkbG}>2zzxbUB@T_;O98gnDe9kDr{oYRmHW^s<4^jUCp zWk;|_b=GOcc!=kYN?C0BJxCII>vmdEk=GO{6Il&C{s6Rw7pbA(#aJslZ;6%`1X!4A zz&arl`_DkojfBI+gHO}cT`VKJ0rkzLa?v>3fN&-zy{yGm9(3zDz3*x?9m0JY@Ap%- z5x45kG&xNk6=USmBpWyO2U<>`*RA{(X*+p#|_AD@E))&XKY4c{r7BK5nCD5y?EUVS`-88xUlk*i=+*T41E_FseZqYLm1FDId@YfzWXrE$U zu0NdZEv+I^PI^LjMH5-f-~al2crV@gO>voc^u=+mmV%Of&dynua$Y{Fd$JR#xVDJAyD z-k5-1|4Kc6-rEb+x>nhTz%}k9VB)(_$1{a0C95|^J$?Ve2qdIS@r7oJbgo%y{onz( z2yW9Cwiqv1iIYozkrO7HF_^rA`7naMfZ%;3y(;-l&yAqHPkPJ-#~z9FJ7umkZZE5H zh|yBE{mq?OZnY8V@osN2;@0;ZpPzPlnwVH9^XO_#OP;4C{=tMB@_$AE2E%|3&y-21SlfWQioZ z)*P!>mbS4UzSX7toJ5ch_j(%SE&(^>`nG4+{Y}QXn`>y(dosA@933$)R~(fskIema94X}tHc=u| z>i za6QV$(zNo7@q(45xIlo%y{Sj^3atDh9CihgDmgVFEJ4Ey-t3Sm04rbEBv)<7k!c%U zZI6A{>qK>UasO>me_**6+y1&!ybJX%4yh~#ej{mHi^e}+;jnd*zn)l}NUq;k;G(@;JARaTy{jD(}qQ03~9tJ8<-3_?ix@7BJ+m!(2`EK@Yu z93OwqPM47f#S_Wy#^PbyojJ||mmF5~((@ub%AgDgO*tpmz_a?8`aMfek!f0hu#zA- ztUN2M0LCy zZVm95WMmaup}k|DCW6c2$^X|KeEauQ{0935PMvVNQ1h9TB z2YE~!7`M@x1IFwG?cQ5Zr5B+EYSE#c@Vt>xc;qxd>-!1KaQ%>$83Pvz`jphX!+QygGa|ySISP18t7}MtUP#Arync zUmm2HrB83=o0=V1ey1%zyj6^)cExUtyBN-q2{7t)&=?j*SChoY4*hmB4mZ@i_vwcQ z+S1k6`SDtd$R9nzjWNOjv2%A0!W%AV=VH>mM{2C60Q7nZ3#39+e_^&OQEz+h<44%~ z#UBy(hYfdM4xs^cN&_-9bi_H7ZS3o3Jld0Ak|lpWmp&U%khf(32o7icX+r1SGH6xg zF~^SlI?1f2pB;0`^^016#d@To6aOBf^dbEATpU4In{PXITOK~CjzX#kr(vHiO&3j~ z2n1U3MNhK*4hZq{-`_1D=bGQ03lj6dO=L#%3i!@X?0;NCzF7f!Df%ZP{(heI{VzkF z4wJ78qe3u+pv^Ra1h?21=Yx+P9OS)wy$(=`*Hl>|$nV?IpWe(jFy$h!y7;iVP8ssC zZxU(11#JGTm*akCg{%988dT7d)CP6QghxJD$+9Pq==dqt;>yy)b6ciJ7sNK_?uZw- zl#fd%EoC?UOAzc%S{{N2`tlbY_Tnk28iff5Mw zor{_UPS-@EcwJ&QoeQr$s4&J8d73>}6QiQORj>7Z#8@x_eVPas*`=ge52W8giymzl z48sIro2FiDX6{3@#A zCDYB;`HdUx|=AER#>*KKGrscj`hDca|y<@Wz>bV zfXrkGye(8BEx2_5eY*nxx?S~qNN%KvONk}R9&WWST#MC%4cc2IbcDn!bE{oFQ#+Q#&X~-A>h59Qmq@wl;jPL3nJuX`zz} zWp|yo`=KkazMWAeW|!J=p{-+4m%|tB)tAL~yz^t8C!_3VLM*~NKGf|8_U}1|Pf0E_ zizxO7wBX3`8n53ghs&^x_YaV%7qsP~G*Z%V#>XM^J~xLs|-=Rj%T z^GM<_RN&jLMVYy(^ltBF+H z4yD}JWzycvigDf=;>)6&$|TnnHihd#u-5JP$xX0@VGLz{17I`gqs)iRJFP1F@LZJq ztI2PZI@A2hsmyneXwWc-L#bI@eEj48e-Z>6vFiZym$LB%`V@bc;)Pf@>h19&?2Y`T z=jor@<747^4=>f>XMJKK7fxk$+~{D6z)ug^l^1!+O}`ZOED-nK>=g3^gYo4Hc ze2luwk>FBNmv-wR8EM3krE;_t2NOs#hFZI{z0X&XvuBE!yG~0g^Qt@H?-{X7H<=iD zl4@hro0elgGNKy zFKCpoM#QMAULIWZ3p$7ljYrYK<>~G)p3~;S%(UC?O0M&@!ufq#CvL|CbQt+T3e}FnT{^86U_$Gn z?fiOfPBqD@DuI!{-mTf`tH^{ANW@*tq3L^Yt7ou^6VzW3M61ui0uxw8c4E|sN~aK? zMp{9`MI#)lGNAuBO^)di7>5Z&MW4gzBliyz^Y^!R?f+4ZxJg7&Wod)(*j{8V>>1_h z4BHK>Qt#}cQ^ct+pa9*HMW=X}bh?Gj$`M2SDMe`e8HgstgkxCtSZJ*(YDo)L_~F|; zw5}rOT*CAQg7I2DCH+zN7X8vQCUw#(YUi%BqY+Q-4VEjDC$T2;P`>ev03egvpEADTK(vK& zQp&vvHry$Z-FML=DGt8Jj9&B4Zop&0_82v8fls7}`EGPiH3J@F3|{>19_&LkKz92X zFF$0I&%jmwCiQAzC4?1Uc@J8=%H z&!?h2Z*C*OOR6_wtT@cIjFKL*iGnaR^#U=Uiv-~o#j_f2taCGZqY!8$g1HX>GNQ%K zx&95*kPnoB=U`NH~;R@nfoSaJ#!;9b}*@Y2gl*s?a^xv%HWW- zz)i#?vQ(ZiTyU8uR!Oz^ElXcHPoWih68f5^$Jy}YH+w)@Jc%^NFJJ@oIiu-GuWl z?=cuGZ-hWbPI5^tBIA#?^%C}d5XGMLxY)H9k)P9LEl_~sS?JiDQd<@BdSEWxtNOUR&Q&);kwhn89zD5XfOpZBR##e;G*79T)cw|(%8!Jq zsmR%{8PN;B?`?92I#--Jm4$dg0h%RSn3~yaDP4j?Zttda;QezXKJ5k>dZLFcRJ~tZ zwCG>B(<$;V`;;LLpqb)Gu=2=)ps4H36#>p0x)pkuedFuA&US1{l$(aAbnl>-i<68!|{!@7bszPsd%qb>-g*>?u`nMXy`W=_N23eM^wI8fItY^+H zu9yI#(j4*mM;a8>#CcbyzRs^7F&B0^jd$ZfF5)|r9Z#G(L@@MRAMOHo+^Zcp^WB1` zk5SRS_&+t(JDh@)!+mm17R@k#NSV6aCv$VbhX7N`G80*<8{{QQ1mRj+5`IT*Hpv@B zcVA+Q>qFyj6%@W+1pKPg2wUHdo+L46l?F$fNVSQAj!iTcPkEEsx|b|N5z_!y^k+s3 zbuolnMkqY|o)&rV5)t`WosC~ibOkP+zL#T-f7-yehjCdy%f|ifPoIYub3Q669z4MO zHSq1@X6q-VnvK|&e^-7!{vDK8G1(50SOP1ymB_Wlp@J%+9SwGfx&)$H5W3$Kf|vHF)+kLA^!i)CBX$aLigB z0jZYN=3!Ab0vy}T9tw>{OP?M{icsALqy|c=e_(&jEx_<;@GMs%+6(+RcWf4tk>}_L zPs!ryV1CQisai|y3>($|^I`g;FK?-=@{pTr=ev2y*m&yW;$p#`^{(voTe$>F1>{TL zQw^)j+)7nRsRyd>K}=P~A`KPH~(PijUT^ zvWZ!$ux-i8B~w3ie7$PD%a^E@_qQk~Aj<7;TBs#Bb;vy=>FILA>sc%Ll~OT#f(>?rtxF!i0QtT_EZE^f@HM$a+rsT4 z#1xwH5hZ&iCCk~7G>USZE9V!wd3ws(gjSzO7|sl4?%5pX+p;DUc%rmuydYk#Y( z1fg0rsQ%ahE_RCoLbX%Cb{U@CqT+j?>5)He0NRi{5*>^|R zXO>lqczt@kc6=Vd0L=&k_Wbfmjx40 zp)0nYxfM>01a(uw-R3ls7!5v}t;hCw(itvzkP`cPYj;nglVqon6=N2!Aydb2%}4@ULlHkL#@H6PkJa z>bja%vyS6)K<%HU=7l!P76+!3ccxB^>#U#njoY!lr->W_!u@9Nu(5E5N}$9ljfBH2 znSUZBFYTf6`c-;a?&Q?!3X7BoapJtMxd4h)$M3of28Uo~s{# zA1;y0KTNo3wWIw&X5BeDsSOKO)7FrKOKBWF|?bo~peRRTGI8x(2RFLhih6?bs zO6UP!Pcc*A=otvkvo!;(z6?BzAQ41_b+Yz#(tTOSq>g3Pj(&pzT=}yj(#X?e!sx`q zqgPoxQ@{{=IwUgqWDjy#vt|YneNARoH?0q=p_?yC6;9nVcm92&aqeM^_gQR6i(C6K zn9HV%HHMr&kj?YPoJrn=Z3`bIs@X6)3%Ss^`M!C3cTRaV|AxjWq=~R88gtig?9i!? zKFGqd>c`X6PtPTpj~9W@y0UIJ{w!U`^X$2@d5xlsU(>2wP%A=$gnw99y+=gi*gz<= zsD2;Hr}TCspMn+ACI0<5o<#o2cX%rpwLx=Lp0T^;7)_q+Vcdt#opzvq$fM=YZZ%il zUtR!Qc2DU2sm0by+BIwV^CGLiWD(agA!lUf?_)aOPgHW!L+RrjM1`K_j&SH`{#4Cm zCFGWV*0EecWekZ0mf@^0)NnK+)SMN!)UoetLUVg9a$#Fy5|-AY{wJFAzZRDsr-;Aa z#+({m%&MD>0A?M#2ls>dd@?Iw!VR!x?)iC|?W`gRss@-sfew$p^7%a)8`+qv7h z%_RS6C=cW|PY2YVa+4Mi&qXONh-eT33IgZJz)Z1wi@t{MtisogG5Ps>Nl>uzfW2>ltxRGpO6R#@I_@mnfde(C$Yayi|=y-$~m02V9KGy%h z&yBT9>F7+IwW{?_uccHKd+SDiH-iDQvLDej0V#|ohGoYLY`=p$jDhK9?$(0+LK>mw z7EuMTr$0y$!~~03+oKM+`3x+EdgM7g6!@91VX~(OR;(8vK5Uu2@lu^K_e4&BYbIg0pMy){%Q(!GnVoufA8DVYz8 z@nue&;=9Q*bB5GT8DIk!4ipW`UbRyk4O9v^690xs4(!!i#g-+UvLq2zzRO?q= z74xltqJK1_VhuEL{rNGuti?jnfx8`2|H1lc$e(6FWCu;b!<)#Q>42b*LcWxESDLet zWhIp`L6&qTbH)VuLs9v_z1|`P+YC=_JtCRDOR2W?li`A=5mfQfMB6AUEP1crCzmp$ zT6gIzi(Px|C0H*A(vKbY$o`=_C;PQn7-=ue=0|04IH#OpQvr{L$I;Z7*QP}l_%rbr zDrsFEH6ONSpx+N1t~Na&`X|h|oT>KT4{$EUU8Gnhq|IDE=fv_TWjG78fhsa}YOtX+ zYpNTLrG={qp(gkHNaxU+TSt*(3#H`r$P5LoxvMeP8sb10D0D>;4nasH?Q{a&i|0>o zb4f|=_S|FkcQ|)ztI*cwrRLADt}!?_1{|a5O}M*)C++>BlZsVmKY`~rXVVW8?3E_k zKKu73(vB;;XsQ~;_?D8*3=SSc8p*j16jQRCrmYuJZ?n<6Lv8y*D9y6yA{`)uWMKHs zIb`;yu3E>f;(u3;&izdtX_1;$R(^GuKMh&IdAgU5SoTaJE0`mF8~h`|v2kSSZPW#N zwvixHhc290_%~tRg7ONn!Kt=lBcLm?tmJ1Kkdc?$!8($`yyDZs$;EVxl+X_pbeG=k z<2-BrG8iK---f-^HS6Pe5Ou;pQ~mV+v$qSEwIAmnQtvf2L-}ndqo3DyOnaJS^0(zmOhz4lx$p0g`;^K7>}bxY9XlD* zZz{D_B{d19OFAmHgHD8on>%qUD3kG2X|GDxVf$9R$s+Gq3R8DFuv9*yh>IURoFm^} zRJTXcS9vWF3Ky@k7|yhqDgC=x1k?LB_J3ob^Jf#D<*XQ$x8QJ|-K7^g!9}>@-;pwK zM0$hIbI|9;yl@CifH=nB=M5L$!Q1{_nhvLMz>eQ@7vAzWk?eB`fI*}0Py&2YHny1(S0 zwR79M_vC__$W776*n)rh=km_dqO=Fhqtm*YtJ*bt>DapHSS11u zML}_HtJ2!xdKX~VQxD8t0-DSgAjM0=81G)~uk?K>D$h5p4pc5o?y72?Av<0OiEwuz z)!pSk)D}e;9~s!FbEGzlW}25yyF~=@k8&?m=`H-O?O$KubN{2G-&lMUIwLQE9qv!! zb8cfo7^zf*jC5??da3`TA^$JCJg4~2C7f+h^Jgz4k%monYGoHydE|{*Coc@CBkju# zq91wJXVL&)Y+$wgGM?asO{G{ecGs8k?;7s9AK_m@%X zn{3&6H*yQDA1v)L6YzQ_gqG-j=WBQ_XrGB8svwJssb_sRTwb;Ow8fov1=Cvuc^oH& zcl+&od@zCY{C)^W?T-s%|agoDBjycl1I6w|jSCv|-1DrXuMwxl-Q;ogrpTzz;! zEAM+2Rx>K->=`p03N=Cn?{Jhjs<4h7K+me&CNzF2p8|XA%+%P1dWq+=*;Kwu(27;~ z+dt7Yy;Z2oC<-ZuOxCaW_zW=QN?_>dI{4JcE>3)pxxloQEOhMkipLxEm+Bw7^Xymgz>hW%-@y!j!lsLhdxP_zQ)WpH}+F+wndujcvd%T*cP^DTG_dV-WI_Okxq zCT{%v%j!-vYGEz_1b%jVTsQW5{N^(0RZ?yhokW;C!m698HlWCS!KV!D4wD#q^P|g* zF3?XK2$ONS^x3IJGFV?5bvuKBGjRITWGZ*#IiR76a7u1$ydWW=Mz-Yi82nL&dg0fL zYDRtRf|~fftltBt1wU`yP@foJ;jLKLTiA`Aj`BF!LbtsDs~OnH)-~C4t|$;m{Y}O$ z$?4DA#T=FaL831A8}rs88c0q*!B@%!Rq&xMFDEE-swyI_!^wJgUZ_p&l#SkK=Nf}` z-Z$kqB=Ih(9Ndsy=YMS5`VB+EDQ@~wVp3IkMEdf1mdH18NmW5~fey(=I82S`@zSFQ z{k*gugHCHt^Q^CBx=N}zX|TX~gO@at zmy@%ud#ZTGa~I|M`)S&T?g_(t0_5S+!lxso4)%@vPe~7ZOX6trL(d6y?N&`aSPdW` zLM1ljY-bc~ERYK-g3(nW;KUwWGI&~Oy1_>K_Wab5^>*V3t|M0sVTuJcQ_;jAMX$!6 zk%lW!+{w`1ggIc1J1Zv&7%%8i5s)b9a&oUt#LcO+cM;!=j$}IOF|7-=XU|K0U1L&= z(rtH^g2i9xA5U)Wm+jya+|s`{>B*rgQ6R^7v-E-6j$v{;rDq)&K|q0piK!gC>h@As^0&SNR7$ugj~8V{m0((lyg z?O3A=(bJLbHuN!z;543pCI*BV=>DO6FRH0<+GK%KL1AFyT?iSCkdyG>rYisAO1^d z0|xRBx;)$$=~k?Feaq+3BneWSvPw^>es0(Shv~}xZdTvRdS@bhpUTf z_G3^R2H~n;hx{35TpY}F$u(<+OIDPcVA|!|zKtL`shn(^SJ=1bXg{-E#U7Zkk{gIm zYm~Y>+K(4A6@u?`VzM$RF*kaou}7Kn&SIf~3#v(X7vpGjyl7F`j`yQe;;am@O|&--P}u_%BHRVy0)oe|>AV?>orBDYu|M*FmZqMYq{Vtt8n? zJ!+eR%blIM;e$#~-f(%(EqOro%N%5@^7;p^JficKz`UxLdxV#pSvy!t#&c61Rq_Q4 zQS~$T7eUexSM>ZpNXPpKP@KFf9BA+J8C=+k-eK3aJzS{WZ+PNBBLU~zpD-|Wm|Z^4 zfrv&b;6Ab&JU*_csml2fW=Cz$H?c~MVUhxGSpBRConXwt}N4fiwID`?$*XV#58i}JC zM#MrsML#P?v!gGS5XLpUCxwev0-%qpo5X*Q9eP!SHN)p_kFJ@cPxDb9&7HZ{m}A{v z5e-KhWFQVOX-Yt>29q!%(+WItpV5vSf^+gWNu#nGsqUk)3hCK(anWMiEiYK76|x@^ z=(D7)cyXUE`rgj~locAG)NaySgpwm=;EWq`J z8{6Ye++%5~^$;lWG}pq9Z3(|Oq%xyFXd=%4%7+m+Rf(!sd7|i#5_>e$FL|Ns1{=g6 zCL4qw^Zfs*@v(Cj{`E&8$OUaey1Z~a9C^S20ZVXc{XRD3WW9>WSq$cJA3-D#!uixj zI{k8Cv-32klofL7-ciwfk(ahfbpf&T?m#!@*w}*%oB_x0p>2A&T`u*$KK|Fd!66&S z=fs72ows|IcY;Fqtoh)yk7X21rxP+Yc#k&fFGq8IfC8Vueb8A5?+n5h@0PPuAL}aN zrUP=(O9Md?3fdy`{o72~oZ)sg%oZ=I$Pis?0lfn;2H*1%<$9N!A^jI}%f;SnT2|;N ze{a&v_PFO6*x($4w$;neSHpjI`6;dj(vBe_Ks(NNYVcZ5r``kip{Y*yz0dNj+sqqc zRup*YKQP;TY}H3gEaV)LD^WsC$=48DCcEXr9%*%;ThFWo*1Pwp=?3G{nR>znp0ibt zKgJo&N8lFRVN{4v+*k;xer=szc5e@Z_@!u6#CJo%Xtis%@rz0`q@RCQ|Ttpc>Dkaf7ceo0n_PW z-JY>28kO+A(zXj?DF}Gl-+`8)!6|N3Nnq?rkw_>3HO`#efA;z*J;n5z#B`| z0CK`&y0F5ze*AWmm}fEjN<$WC{;kp;QxXe`C%b3NIPD7{>okMfNRa@W>%hcvWPC>L zkDGQF0RyIwcj_2-qgZ=aKk{l3tp!)kK^^?jH^)AL%%V-6R^>R>5u6*Ex_^Qz)K0p; z(G>z;tuDyS4&62WL8m8Kh~snHkY3@7b1wvG${d2=wbf9%znzBS(JAV@;_ z`hk&L@6I0PJG-gqSI+papsR6&$A|Q5xz*{FbXYK5OP4lJPI|HtuY~ zd4Yn`#2ov2doX{ig=slHK2LuLNuI!F zH~rHMZ2#EJQxTl(DY){n^iB5A1st$g_{?qNXssEpOKXD|)UiO-SW8=(NP1jk! zjC`umP^at-r=3|~24&YfHY$pliAtq%LE6t03{yRQvc2tL0XIT1-CQkEXn6VtjZ(v)0>IM)5bY} zGA=fmy%YZlzdP>wM4a-AX8GdmuI#k%*6zNJJHmo4+G#ZI|wfxxrr}$yw8t zp~vm+l*D&!ZrPD}J;(gDNghmRwI=P4C}ZL)-pKT5iQ8XCC~a$(Wvxl9jT6bbkYIa0 zy6WtO86A|{9eWmqT*lqSe*$4RGSY;>w&Y^opioI@_qZ6*R+J=Jphl>s{{h>O`{)*L z$u^uHua8RB9d+ub&%n?2bewg20h=G#pSJpdIRCXUEEIXvcV6}_tdNN8X0J0lRcZ8= z+4nHkFYGV-G)2{?g%<|)Zzxdmh-iG0ij(IMjUtqGV4yXfcf?+i3I>W9|U7%WfPzF1{ zWkELCIR)29>3Fg>kQk!e?673QkaebFLc@Iet+z(jFY}DLhN&P*v#GGpM!3I&6qnz9 z!W)_+ky!oHfQn4I&RPSFz1X`KlOgAfa+3MBm`<H_m6KmfdRX8vdHfSu~ z|8*dG@h}K{>n;9&RyU6Pt<+){jQ; zk!1Y%5&)lod@%>U8Y~k!laN4%-iO@zk-V$`yN(z-a*+b=#D3ics3vdkBRnZo!EzFJ z7^#t;ySRJ3%7r%z&^@f)y}6;9$=UNs5R61#*FqgV;*%3p_UYn)Zj>&fTT)g>u z0l0GxvE0Z8!>jRfM!r0H&Vcl@rjR`kh8r+G7EEtJxN#>zy@qqr=NPU^;Fo&!!#5;i zkxJZ&;ClRysyHm(%^8Qa6@4+K>RWE^@JQJ<4q2MZ!PT4Ivfg>=weBYV1-s}J8?Isnk|*s*{7RW>Y;q88@uN1)Jc|S9nja%3ZqtP` zGaw{^{XC*zNQT*fD0Weu#K&YAv*6}!Qq@!x2B904@NWtQ@GRVlC@A~@Vj@6`xH!q1uSvzCBC>5n^Bn>_JG`b|iGyUP9 zXfDCj-eziVL9Emkr$E~>Qkc~rX^ZmLTjXk#d_|4wN7AUqA7&V6bN^>=mcxIF{OTZL z){N7iVFuLnsLJ_$H?l77Ez37kYW@!bB5mr!81 zRfT+hZ?hG&fJi=wUNtcHiitE4Ckpz{jrl*pEDwS_ZeI#gIQN!VP>hJqueqljpE~zo zlLfIh2Fv80Bsh9IUq*x0#m$bN2I24Sd+>=@8zFLo*jmKSK(-~5$Tz24_KnGgZ|=p1 z-eFx&Ow3GUQLG)g2RKWNiiGL*hOTFzNbdUVB z)0#YxmZS|LK9(oGP~LnSCDQ^)rCgyXU?RgINuO}&$PV2nl4I%z1OfIc+gVlyd7nD^?ENo9Fe%IK{o*s_ zFcM#6Xdl}%saKy3-taVt{|?d}>#Fv?viTMAv5mo!?LIQ(6vAx*My?zj^hDWnmg+RAAa zi82-puo9J^ccB8h`rl8kgqkIaS7kubSDmZBvCD?&^H@(<`d08bo=LfWkh_I)!&W$v@q|lGiJ7 zQqbjkxg8rfdJuu|;FwTsz^M-{D`4^*MG2cG#|?>>-HDeK(i*6-1o~v!CJ1_lOleIE zRmkje=mJ5}F3vzFr!%i;BHP;c%zuThIU&n?hCvC^LK7v&GE62?&q%_AxgnW+L?`Kc ztQIo)-l9Gl0h<6w$|Ekpabuyei*a7!fgU`1d2&psft?wepknuCYN=U=`~?&fVzkK3 zPPv>-;;7Dm#Mlzc%=Vk@j_1v-kSx+y1oF|Ls?L~WSI(VQJfpmX&37IeS@Tk%qmJ1# zu^!l&u^V$Z=v%O8q4n4e?xq^fId8_oh;=_90e)PuJ*k5yUYFOH?fwuqi4Wq0s&``! zHhh(HZUL{Oz-lexyl2!D>+<#Q+S;~4z1tA2+7V)%p!Xn%`-zQ%@)padcel@k)X*D4 zvSWDTlg2Lu?yAFqyd9`jI}IBJm684=Cr7hDschmI`7CM3U94%Gu4R4q?1Gw^C@2Sjc`4#$<6 z^eH$vPh;b#Fqygr9|1xsA9cwcsWq}Lv!&nYkARW-Hrc*pw}j7a<_-I!b;Foq?mo}t z{Jx-%?LjcvUR|GlJS_YQ17ZJC<4(kt3`!ix4#uC5M07bu1D|fcQ6U5j1HVTYVTGw# z0uv6;ee?^DXGN>_lE`8fS8n;>y6L@4Qwn>bw z;j~Ru+v^Tz3R^51*A={9zQJ-!y@@V_J~mR(@zH{LuLYx&81J$3<6CXHgHe;Hm{}U+ zznQedIwF`14MtOIrN3^*3ilgo{^#gMdUN4FYZh(TeWABhLh3C{R2F??DQ|Q&!3PL4 zROPAkT-4Yr^behExKv1`MEjj0SX&LHx#?2-Q_aV`pYvifbpSO@L zf!0sfFyT)_y1;mB3#%1C~`E6@9^IoDis;yk5C0J=*()AxF}i8E#} zKw8>D?L;0Oz9U$WF5($->IJjw(4l7zyAI`pk|-#9fQ^WCJ3>$Q=fHOV=eVP2pjGGT zx74NNWsLZ#HT(|$)$PD1?0!I^#78EnDt8jsp(+qyraNc7U_X>DR!w-s54fQK zObf>!A!S8MzljAWltDA`o4kFa!_QPvVfjWMP#rEQ|2SCa?2HK2f060NZfpq|^ZHAO zdFTG`dtSbWiem=}hIC8?({`2OfHsw7)S0#ck;?j40MThABC-2=5JVH{?PG+e z*G`=x_msAMLd^pZ(A~U~}i=TnrF)gv0bqgH;iq9F&5?*c?d3G2QXZ zr3iW^yBl%rn%aQ!ucXDUh{WgQOro^4LcI-QpZtiNudJGF_$Su`SC(sDV~sxR&Vk*S zr=U`+z+QrsHwBuw9(LD|1+8gMRg`e!I-VNxpO#&%T{UJjJIiUxyxC_;=2!E8R;t;t zC<8bzo$8bTe5KzsWffDK#nM0YdlHEIw?IT3Go-&l$}fH^#_Hwl^O+LwY*)tx{B|#j z>F^q{hfOxQngzTaDnq*l-_FK6XruyW+(MbjH_O|R3ybLmbe3@>g*6GUIRZ4Pt7*;I zqxk86sWF@~aO8Afhn5A1lK97%XPY(kUJLqdL?xzdtk|25EH5+@?%uFkNO*!L@R43GK>ONFlaIqI~i>`kg zo6EMnV-5f0kK-Bto0o7L2h7&v%uRjX68v-E{B;)kv-Q!jOIENO=IIXh#NhKQm0u;i*WU``I6KZ>EvetRibA%Vr!C z?&q9rx;5|<$X}y|Atb3YPLVcMuyJlycz;yz5${3Ge`C^;t`enCcQ6}Z7HW{SB2RT+ zU@CzF`+!ZB%eT`tmPA9CH?W#JXFet*p&*^lmEeb+4w<^RF!6&ZH-9?w;>(@5$ao(< znJ$J(hGyffk{DZ&exzfz!gV41IB~tf`KJx#HN&epax}&}A2v1^h9WnBDCeG_S%#bmaos)hWD$>D6-OCk=2#zw?bp39H*~C9u zckCBe(|#6#nf)gv=A6l_iq%o&3~_$^j|BfuR6p-iAzL?k{@)Q+K zMv&XY^iv>SAgMq@X{ zkqY1e9!%-ZI`GZcLYM^sy*`2tL)r#&TKy}LNo<e9wfK*Lq+K}KI^3|4;7z17(y5?ZC&$y0Bo&sx zACBz?><{9u+_l%aYX`k#L7mTb;fuKxrw02|gI^yds{rTwoK%N#1vrUKDj1gz1pOmn z+#==f4z~;)4n1p{I4@^`trru4Kskz-pA101_Sa##KS?F(U5n2T0Qy8L2o2HS9pj=~ zqK(z0c5u^@A^%vomlbUaVa9|D?qB|CJEAY(+lwJG@7?b!BdGJJuua5ocdAs0twRh z=X5x$hcU@%TqAzB`yL5gUKAta7xvwdaQwMCWiXZ#CVMk3iFBoW#Nw{-CB#Ij-&J8> z7`$T7N3jLBEnMgWtEQ%-tswvL7eqO_4zCs!v3Y`T12k!l)K47wRo+BtQX1R3O#xVQ zO8K|Mll9+DoWiO^%VE1uHl-&h8Li>+mV}@woc!czWKYqOdcyi>)&V|(lJzpUPYrPUX)j*QSNcb?+Y1L+ax`amPViK4=KF&={I z&FV7&Qjm7w1oY`RR!lS#c~g?4>Db0AE4Hi6d53o!(a9idca@U=O!}b3S5JR`^emM2 zEf`LaL86j}m&HWmD8Vv2KE1MFToqHw%USseLGbPy3WG$Mn*+ zI@%HLAMJ|c!e-+;j0J8<_tJkm;tK`52non2n+T>$19iEp(3WJJip5?=;+pT@F>xS(P0LXRzpMYJ0(0`53fgyi4MoOyn!-R z$N{v^2*u*}S~_Fz_*eWz<8ChFldB2N=YGOfjt`zAlJD=jWSOZrSg*{M7%>t*4`|c8 zLMtyrJ_ooQ?ba9f23o)=-@<f zo*^kEX?3#<&UXwYG14i zsVD9~TqDWy{mYlL3I40_sh=?RaNpS7kU>vYS^m3?KL7cjurVpO0zp+cC*J8D-pv+0 z;r90BGfdv59ruDc*v0Rhgxqjkjr?5uWmn57lH0pkWBzBC{x2<9YJs<2AtgkH1Q#oj zTh!(B7*eeef&iD&G|Sj%2(h*|zm{k}%2Leh>SqFNTRAidSz zsU=b-T-bXw_!2v(X3TAh(1KKFsTjS9?47)&<>@T?$aBbqc#_LLr*_r3V6mA?yG9Td z^{O^(Ukyd{911J#P2tY$l-My0Gxm%1F01D6ASFOnIk|L=!oHs$JstcS9i;s#J$r5P z4-E=j8M<-8NP1x5$%Kl)P;=L0&D3TMO4%rvRhKE#<=c8{JOV=<5a>DwS>&(~2nL zPZ;-ary)K`$Ef%WZL~G=M`3SpQ{1BL9p&0=WBYSKSY_BDo79wl2m|SEu8-8&aenXs z3HFtfO&;8{JVZX5=%ohUU3vF=rO68)hOmYRCi^IQJ#|nO2ZAeydfV9^nX~N8Cyf2qujaQ<;dATe#B$Gr0L3*vK1c%49s5jQ_yf6fmI?eYdL z%$eS;U6AaoE2yfT9OcT;?c!U}&=m_myhEbf<`|XyY#ZnfU7BFq6b3N_!$k}fwEGJF zLE`ZAh3#@G%d~kkM&Imq|2WL(HqEQB7nb^Kj2bn! zWrf~2PqjK5`|4Co&6U|29X|Ke!+S+8WLWSxI#+8()>TCNQSZ7;MzX)5-5fe?>s`uj zva^z3Js7-Jl#4)i(HF$)C+;!fOaUXTWpQWQ36<>-idf#=0_tdE0^N8N4%G>7s|9DX{oJfv&<+=fwBJmwO>-+P6vrEU#CgkT zeK9b_YRz}acFmYpYZ{prNM^)&ZKA2K}%VHJjg639fGA7)w7ox69$4Q zERbQ+Fr4gmmS=V6eGl@Un(Nw3f>ZNH^2ty zGh><+3+W)fPcyywf~+Ao zt7C~xW49|+xH=o*R-ZG0vD!=7%fe4P$Fu?2-^Q>tuw(Ru@LG3(LZ9|@hcOA zzPt87j(G(a*L;8d1=)T7D3S!$q5d#U4fA{&xOnE0<>HiNrY7 ztZa`y=&NMu(kvOs>!jp>NhCw-A(8ud&N%Dqk>pmYgf{dbBr3-Lxo7i74lHqa)nysl zcE%UgcvJ1IJ}<;LB3-!2>^~(Xl!H0d_xC9paN8RUpo$%eyvhu&6yW69DI z0c1^uFdhmms+6=vXE;#T>@rH|M{U|}!#?Vm*h^&FHQvq(XDfP*o=PiX$EMOui0xgw z_)W!#Fj!55qyK(O%xQP!;kHeMz+vH!UyPyexH~&6TH4}{4)L#mh;&p(^L*u-P_dCp z2(9k?SR+!^k#DJOypE>mm4WgH!o#jlKNP$3WrSybd(jb1GnzWX?+_73d7M$PD{vB8 z<&Sa0>wP8FER?{})x?!|LPq#Al@bR)(T$p8{R^IUApB>j)VBm>63<>Ur-1~2L~_c> zDunJxWXaK7zfOx^Hw~A!4ulae+<^>w_5e)dNy^iP>@YI12IVkh35Rr-ny%BZb%?}l z+7|nBd5%6{lRt})uUH2FZPDAg3ns z!(jozmJ9^8MA?+SQ$L?wgOIs@o2gk<#V5*QnaiDWHFNA*2r34w!*3ambrqcHGUJFn zW*coJMq~KpNUI^*@zER>6hx5P5a*u8R*nTZ_pTFPhlqYfCUG7ho0w3lIW(ZHE37}p zMR56c)Gn*+_ukYOB|KFiC7Z>SLO{QT9ifID)?0Xc{!6?=UZOEwIm_Al2U24jjVD|z zvVI2|Hs7V&#G>_J;1NYHlMSb4QRpz&RaX2Ek@H6B+u>`I)r1X>TQO!a9F5$2$ zGjuj4i2)@Sv%xg-B*SAXqesK-;?CgO{fP3B1=%OJnfp|KB_(RK8Rx+=hQA6JVDT^J z9N2Pz%Ee#ryCKQBfRLO?dv^dYceJA9z5CwvyFobo#;1XySA0Dz7=1g|P}Jw`&=U&} zvnH`nxH=pjTVMV)7_qf{)c|3~&HXwC0DyeWVe5^rkqrf6@oq>L|MCHlK)a4{C<^~l ztZq3mM@#=~k9I#M6+`Vf@s3{AQ~s-eF)2ftt*YX_pIx-$yw5EIc3oE>wI2I6w@w52D;XVFNDNyGLKw z;RL1jf)V9gkXFj&P?ijT# z2}`_jOlmDYpi8biUGB9hdbc`TEL(Z{4vww*_dh zclLz=GkNeXa#CE0|2$iOoFn*#Sgu6nCy#aWS{p;~Cw-;#NDj!3=Bt*HVHdN8ZoktFO6SlGl$N1?)ZzXz zqOUVV5@gWpOz4Co=14`t7k9`)A1QU_jF?gINq>cq1FFAPbHt&Y56bIYBl64;5{f06 zCYoN#K?Q;Zg&G?DiuV|_?E(y+i|Re(B()S?Hra1jZ}873o_;6ld}Ck_#M%2+>c2g8 zar7Gc_M{AapOT$ih)%vp=Og~G^=midbfMY4zbF&i$H&oJ-#7@qThD1eGH?C7wf6}A z);EwVGSjv{mn{)}YP3AJP8SDpd>PS(R_$0t;o**1N&opkuW5`^zkGqS@>@-+Hd(W~$9-7~-Bq<1 zUoQK3_K&A0g&QQwz34}!XO|O&q-hIzPig+ATv-X;rxkYoxSsdFA3uG_lUbIMaMOa` zYyOu)>($Ye?jJ|f3w|H&4*mc=?p9aA0S*lqVadlGT2YGEJ~hzqRe;&}IVky#pX6RF zsy11&K9PS?^b+t3&TGyjnmdu{c@SMh-%(HzO9O9aPr8P+DkN?V&w;GHmkRYAj1q zqnp0GlwJVN01ySn-8ec>4b?DAF7L-vybG` zMZMfALv1l;{zi3Ds#$yzdw6HW)TN#Dn%_4UHa@l;5c*!tB-1$)^6YiGW)ZvSR>BlM z)K~OUc`VxhJ(Fu~B+*2Db!H*KrnyZE=ESm_Q{Q@!R9*~SRe=F=qGmOtarB{LgP=o_%;H~Kj4X$)t( z4Mvt5#@16kKO+1cya)FWx)6Fn>O%1oC8iR4@z1gKdAQq<*p!lnvx>il3hS|S?MPRl zu#+A@e0iJ1yxWMZ{?P)!WF3USUftGyK>gnO#aX_~cRL~IHqMGpv8ZO*Xu`lx>|?%K zAeYd$+bRwYD^=IpB1GH6$Q(bqJ|5-R!1)||h9YK>_OVq5PtH~WLHH`RhNT&sa=+AN z*QT%^tni8OQO6>apy2N#HJcC2t#O}GpCPj~k{vd^@Zc{eABBjJ-W z@^K{5!ouq&&;7jymoYLArt|4=m(w9$)a?SrN1Qk1(L5QNf_ep-ED=lPJChA&>{Nq# z#ELYRNWo*@4lF*-l>#Z}+^vg{EUrhxV!6xdFY6C~##<$;a$|Y>75n2ir58QK+%FM} zU`xMsNi18aZf@cU{}qCnOZCnOfk?_r@_~G3kHka^FUBpUEyAolB3$L}<`IF>B3!>u zv<2-RA|yL54fn;rgAG&d0%GSl+g)gJBJ$jfCG*Q0Y#zv+H*|A?T^!CaBL9Gi> zSvZwfWv5@ci*O^z_lY63YHN>nA*80M{n8saP{03F85VSQNx}sC)0D~?1 zpM?dLJclQ&V@zHKvA#U{!x9g^nqa#`D1{ZxvlxYn&Z~aS0Xm?NWz`CC22e0a5&9^> zvy-l=dz0GX!5ns~uAY?@&AY+&HP++yS3#+6^F-hR6^%L9;-ShcV>5IeW`C$ersoH+ z6lX{3-lZ=p6w-AsVTTIJj~&8V>`k!`GOA8%Sm(>gUz9+_$1^`NIHNgNpVG;WHgF`~ zz2^uAr(pTEHoH?^o<8ZG_c?^z<4{o;@;F*CsF=9@)~gIm7&+@kAxw=ff_SL;3`&O1 ztz}jvCc~I}_6FP;T)lYg70ie*5I=d#3OelvMbNPZim`BuU;;y^m@5L~#Rjnm=0VfU zjS9O$EJfH?{x)Tg*^n-ZeBke4Id{-6nvF5#yEFb!ddZNQdBE}R!{a-Y6?@~$=U!nW z;=EkybDpFPNn(_lkXS~XcRoXs<>?$dN|qnQL~hICKrJJn6h z)T9MkxqNB4k(&|Z1>wUV`l?P zA?Lf{3`BZ(RPA}Kq}#wL5oF5Jv)!FHQbeXJ8{E~s*-LxW<-h7piKY};`wo@USxGQ_ zSonKFT#$H2jO~}A$80Z?r%$#p-{C9$RF6(AqhblR71Gwesm3%B>z^sF%{e-Fjw84- zfc0s6wOgg;)_!sB1$$G3r2(C*fddqSbyzd@5OH2_vB|+XAXW~cV?5My)-(#-OVh_9 zaK#cU(738czrvN>>A6|b*Pb5Dp1OqGY2>yT{+(?O;ig|VPQH6ZL%ljsYPPZsq>*6H zb+hUL+|Nk3?gyvY7mLd8`+nqb@~o5Zcc=)jejkV>Eh?zV+pE>S;ZIfIo|_pBq*oy4 zZ9Or2-EP_k=3#o^VfsuSP!TW$#e9y%(yvO&T2wK1jdT^zBa$I-CATZ9)**eK?&`cuc+&1CFb{z@@1U7nC5P)ka#2J?`*rUs&6` zO2>h(u&_lI0vDeHpMZeG!r0aFnqY9Cr2Qz-Gk_wD0c{Iav1Tt=^F)~6k*ERnt!GXX z+#cPnY&H^?$b&}69qq!dq7aQ}dixNf7v0^mM3pWz zv}0i$y!{*wgVWimf>oWKdq%5=&8w5;irAQRbWbq;l{^t0G-^oNB)D`c(l1R~Lf>?9lK+#Gpq7=rMB(s|O1Kb@69ltBmp2j9D^SF0%zq;` zzCN}JI-kG+k2)Ek!7mP=Bp_iBvL1r~6C_63&@9LwidoqMjwYU9sO3f9PUKLrR_6V~(Kk~iJb*w%uD^mjj8~SbGHCri2pDVgT>>(S(;*#=p{CQC{4^2Xqh*Ij!|x zel{Pn@AW1mXZYQYWY`p})^oo_9em8GkGSedql7`M3hTMwjsX{kx#>+5U z{=Sq_%)@!D9f_4ug;*Hy9m<^my(pP91>iJVVteD3oH+gBT+bz0nsc5ozCh<#zx=dw z$)mAMEk>7%+k7i)y2pDyxGp>4YL_M zM8Mp;@bJ{@#9U0p7t%fAb#WhP#GSloNxQUbk zX{b|oVd+%mGI29Pge)Y{L!_CF&Q2(g=m;56>>WB$qw9SpDs8PY?MqKCHFp2|W!z}? zUfyfu>?o_k`s_5k?(A6}M&Gx{4$9JaWmO_p?m7_e8r=FbvFuAO9QN)%3T5PieCqf` zjO?}>elY{_$;l~FKwv2)V~+hNxyiu`ue~s?8LjVA8$)jE@Ep>95tJd+O}7+Ryp5!h z>HrQyspLAl^3beP-~`in-G_U$cqcG_0h8(d$? zb47eG)ITe}-H$jdjr13NaR6P>?}*wvxKIEJ;eI~aForrqp_ds5f>3m)c zp-2hu-$s;4x=+>*hy z2MqtJj6cb_m)mw^QG$cXGr?)qgH2n-K(>o55)8p~k zw5NAXToLDQ?PhZJ6HdkKrz{n}-k)WhOJXC#lI-)<{j|pnjB~D8q#oN9bRd|y!2YAG zAWy|+rR;H(SNy&#fGpWOSb9600Vp|_Pax!)no{wS{ml7^_7DeMp-x_rVXOCDq0>k9 z!b`3Xlun({Juhl{N###d`X?NN>WU1)e9fo2yC$xQM;(i!9K9?eLz=^e3f~B?=JK(Q zxxR^44s%0YpMP(07=$}VT`tl+ELNGl3iwss9!ih*zH^YlA|v|f(yV7YR~=mw&Hz$qxPk7rUvc!1AN0cRv{RFZ+SqVN@PDtR8yY>QH-5THe@K zdSVB@VKEm?$6&(AOL$|t8!_)bu{FGKUw8Lp{^LL=V!|r^CgAvsUsR7h8*DVA@pMC; zB)rOxG<8Ck`Pj2Bl)UQB#Ho*lN7&MKk}pfaTK~o7NN#CM{pZ*cVg$6pkoWFPVFPkr zm3M%6Rtzxft1Khyw4oPZ$F*lG?$raEzIkhdQ zEeD}>nr##YeJ)RNBN<CsJRN^>sk`!sPG?dma*~7ZfWu97BE)%Gx zj7YOVPP$fw+h$Oz58TXB`2hpWW#&c?n>_2vl{^#cXje-{aKOK>A|bgy;Tb3v?VeXS zSA0XO)*u*tI0f0Fd({W|IY2$ZoxSjy1fkJ@6s_pC`LGYXbl4xXI8NsjB|UFDN0D~y zyjX)|g5~!{!)fAHjJew6ZFw(?JTrXp;KOh@5Hu3hMZRiNCgKxL`xxfmxqfYrVMrsN z4=1ED2}rgUPe(zQ*g$P`zQksZNoL}C2& zqlIAAPE;I$^UspMt!r)n6$g-B5ke0k40=34OKwi0@KQl=O=~E{g#A$AQKNS-3;#j$X)^<%g{t}%uRlUlg(ka!h^P^@!7!3XRaTD zK8h4(W?r07wTj7B?8~M631=VBV)LA>~L+Q@s=2F>K4H22{XKHc#AED8QQq zCMu)gAxma=1=?=QeX1^uW@Hu{cWRDY2$KgnK~BaI>qH$)MA%R5#af#M;Oz}+)tS57 zjAYcNWtd2Ddi0TCwNVFQLES(2y^F1^mg`(s`BkMv^bS5y=EMI916EQanPwK6;Nv6A zzkx%Id}D&WVDK?Ae)xHqZYA1u7ItOHw;R4ID^(L^h%F`sT+6u-LB z$Ej>jTA}m2u7=v3#B6ItP6mQ1P+h8-fBMy7cgrc1FP{{2i>KaY*H@N*39kMj1><($O`pD$3C-Em#| z$L7Sv%t}cZSr)5vHNpQs97^y{AxT0c?{HYw?hguk>`%{B@qq-BL(lTUnu4iI1&^5S zq#oGY{36Q~)>ULYut*?n1{PJX2?57VKj8jU)XRRfwKt4P%p_#)yp1@~jkN2zJLRhA zG&^2IXQOP6)V{JxYrL*i#HL2b0JS2LB&W44SpPUH|N8*NuPsq&k|vgvtF^j|v9l+$ zWHWAy@JJ!-d=-Inaq(exU5IQ@G<|6pA@B2ib{4(IHcEd&VBPgRmL%NM%kz|E_#HcQ zywy~W4-O{}I5^gEAg!5LLew)ojO==_-c*qBNHX)T1N@mVbq=Up$|Mx^Cd)Jj!%U^t z_$!$ggSQKt5^rbnCPdsLFVRp70mjD`f8gWm1{1`a+%0NR2HP_pSexYMgSZn zPk;U+p%Nm1@dJmwP2mKYr}o-|9uv*{w*O=R&OCfH#BHLLseX-igY*dY)=mTu++#tKEc4|%xR-W~fKay*SKA?QkWr>?nfM)hf47{FlT>S*Wq|;plw&zp;l{J_PR6o-d`}wI zzblYF+&M!&QN-K*IcOCAS=<*-u^tshihhQG`PpLKea8K}T*m8=ir1pgK8Sl26=XK?=h12VPZx z1AVy6pA=5mud_3_$cih#$sZjnoZ8>Kn-*QiD6jD3^0Q>{!Wv{kP{3;+{27@boY3M7 zh^;wTBOavGB+O;Q+&-_B3YJznW|N(GjxpkM2b!4~HSrX;*X1=ciDp`%6X%loSM5xF zTjhx^EQp(81Xon8KbSR3uVDWGqX<%G}I4MyRq-zJke zoVz_#tB9p@XZU%*Xf(j1IYLIe5n-TdL6-fkkDmx)O;FJ#in?oTQ{mW`Fa8%MaEmR@zqjhH9NEb?L;|&(}9;M&cc|+B!spUSCwmZ=((VBi17d}(@>!k2@WQ^$ef+krofoU7l_VQ>8TS!-`qx;}^WRER1}A^@a^A92 z<=yXSCB=K}I=+a5z81rlCjJ(L!lscRi6rcvk?zf{dmjKASC|N8ZfnlVreuE_x)HC)MG%K#*KF*Fb*EbF`pZv7 zW~UH4urZ6=GfjkSBvY)Yb2CeOJCSJuXt<9J)7;X>=MJeuc5B8$R=54_}G6TfdD)P|DN)EjOk*1}C`1@~cbZIoI z1tnI9a-5d|5fucGClpY--fU?Ml2YSS(ajbAP7;b79Fx5>v^_2nFcOe{tdwRG`o%x# zoU(fO-7w*8b4!*x(%3splP;d+^%%!67*Y2alDBU}+{VUsVF+yBlOCI?#E*OI-DY}# zl?GaMDF&X(cO+(;*C(c{iwjfCz{7{s1S`7do*dMU+vl#>;;JMdJ1(hufBkSYw9ZJp zLIHFu1=V2jRf4jJ(B6DnC+FDy(m?{eTLueNghA@U(vHQ|N8F4)#h`Q2C_FS8GRiMZ zrDV*fAnB`u&v9=#e&7cEH~;tVQn=?6W>8(?=}f}XkPjEbjtxy^XCgCOecDTC5^!>D zG1N9~K~Q)vH*qfROG?&{|!^KEWrpMIJ6 ziA0~!lOU*OPl+@78DANnyvzc<1N1;%uG(BkpsE4Lm?ROUgrni(O!<>$c^&w2=uKp0 zk^Y)I3@)S(v*A{?@<2vUbKGB-Y1fsYs(*E(+u@r}#t}aZicGl4?nvgpJ-_3!p`s&< z$%y-UZk+B?KNlflW9m*%vSo@}Ji)#C&H^Ruir7%pmWzFy^cXg@tx6ct&pqzYhRJ2y^r$ec+ zMngeEW8(byUR?jekqJxsJZ$aQMKCB~mS(7DFJl2FGCqdZX_6q?9CV=Do%U9Oxk@4c z62Ph%fJ1|GGr@~MZTUw)u(7dNt57SD;-#QSa ze-u5hOJe3iL8{gKi~;+FjZIU&u_e>-vA5t z{4lFX=ib;8J?GA^Sd$S8O@-SjtLw~)CZp4^>r%!q=Tufqb=w(s0o_joeS+Y8r--)x zE~6y0BROuVIcLy8CoYj9G%_C=X1(nwE=wVb11dv4CMYr zfEV@_%jcJsWWR?Gk-{H|U6!zSZLS9LomAB6y&@ozGB(k~{Nzd=0mH;_4(}HGGwV*WYb2`{mW~-O``oAc%bX%qn2XRqj6Tc2D?K)*sB5~VekzNoP=QZ zq&F|~7v*)tuoGpbta;x?cZHUW_>Z;m8mi2dU)t(Z4pw^XYwYme#l-q(35G6YB%maX?S-U_#IL zKdWXh_>%ToM9f4Tvp>DS{LigQn_~&~MR@gc6853{Wd>#`ID5E7I)7wv-ssv000ssU z=dhjGc7`*P+PtboOImwq)ChJ;el?8v9*Z=w7}RypBpPrj>Z2Whg}|;ulqs;Ll9dch zq0POHYFj}ZZ_#703s`UQaz8#aV3}Pocz>JEMqqGI)Ih$t&$-)-XX|Cyum&_=}+d-JWE-qda&R}z^mYY{pc6Oin zlB0MWaU6+J}K;oWMp|o)Zu>drL*5**V+Ud*tZwNl~@eRUBFnek5Z<69rtjs{9 z;#5Wi|kw>mXFr z)gEgX>jMgYSrL!)s<0ENfLAYu)>tu$h=t!DU>DXZ@0XYmL`6U01tqaq1+H17x5;>Z zklJnm#io18^3G`N^5>(bpb|xInq%%3D(nj~^Lw$(RU)mFD#$oCQ)m54sAqnqB`9c;ZWzUMrYq5m zz+SZH9G1jOS?3%s!7LW(9VI?Qssa+xu^HIC2H7GQ8qG}oar`vP2+;U$)jS^eR4>>F zi)&Z((TTtBT}b`crosGV0jV4UiW^bSIOhzU%fmsA-okK3a&`p+alem<9!o{=l2iRd6Gyf4O2P@KB_$fnax>w)IBH`yl9%DKSfk*9xn zu5o>If;-KGz~vZ)ICJXT(OW3zI~t-vfBe^vy^{W&L@q zq6&hA9Tmg}J8_wyF&Kko8DU%iby5oEX>EKymJIPVsxST_0z^-`I9)Gf48eR=XGIaY zvA8_i?GX9Z_>W=pSN!N zba)H|O_Cr}<3Z~|YCMf6$A#yGR646I|wqk*(ukEXS0p_@!C3KM=SW>?Amj7 zNNi*!!anZTDHQcv>x{Phm=mIAv!VngH}G3xc%fnp6JkueIU1KWBVuhACVafRZ6Sz$ z@V2C!y9};nka`VH8_fSD=Dw@58MS^Z*U8sW$U`oJAIeTZ;RPIWVjX%e;6OM*43aIFvgRg^{ojuc z_!gM&|NE8g%fRj#qR_c`uMD$AV6RI5#+%)!s`vLz<992 z10EI7Q|g!dn)%ZT+{Jwx_X=gbeD4a) z_8VD!EXR1{fYviE6zs9o+}-JV2aiARo0%NuS2O2c+%SPf&^hmglG7|;w68o391olD=j5)mCLfNl-8oE`M4qbFPiT|<-P;P^n-BeDUMM(M z#{~2jhC@0F%7;pg)X(Uf-l#uES}avLr_!zCOPrvU7CKpLb&W#FkLlKc(&nuEwg~i~ zPVi-OKt2A~>KD|qN4qzJ6IS|zI!tCOm(3_F#%y0~epfcM&b5ydtbJY^oU-sHPZYv7 z+&UtzMmET}mXH0k$b2>OGW;prp6o6Jl_>kiOM|7l%lqNQraiKIefP?0*{mMJ39J0m zlgG}%Yn_b>40@LVO^*?q$GmZdqJCo)(|W}8awCSlOU2uiZy#3VFIP{@bqx&OY7su8O%Kmb3rrE*Cjp-sP!1H*>F-gRGx$ z3ARUq0a629tT+B#0G<0x=>6hCJgE@OvQ^=@)`#IvIZFlbs?}hT8Q$iSf10>Uu zc6nB0bzgP{K6Tp+M=Lu(*j4n{dkGa9aFeE%#KS|}Pssl9Y~e!|MxB}5^|O&otNuZ> z?oAGD0u~koArDi2#%aaxc%c7IW2z(hI`h>zAgaG6AjTACqBO$>m*<>};`>BGbWi@c z(N86M3v~4ww%UbDCa|Q8Lr4-aZq*dxz?%eRS6w_hJI2=khpx8_YD4SVhOweWixhWv zcPTE#-Q67ug(AV-p@rh^?heJB77K2{9fDh4p8K3z&NuVTWG2b)HEZq5_S$138d*%5 zAUxXGuG2yRNy#OYCU){>Zl(F|xpY5tN;fiK%uyUv4hm&y^mqu?uKt>yl`oMY`|Y$3 zZlD`@{sHP{ff{{k!auhuoj zj?l+JCx1tVJo@WtsHG)VdC@COK9eo19fFC=$oBnd+!9LSMYJ01*9t8Zd4DS#x7Xs# zoA=f5&RS#xgLHc36#`1WyzK13i=VKe9k!3yv>sSdd4}Acb_2oU2Kv<;Up3pN7OC(t zliWo~;FPK#Et6VxcdB<5DLut?RmJE)?r~Zda6`moXACw>lRBh#-&uX;+q;c>b$}mnY9@&2lK!tZ5Rxto@?Gl zq-|fhIE_Z`@!dCvPF^>B!y2j|n{NC(#mIgT592vENEG zslzJ<0QOwz83mB1$82LX@eDQf^ho(`H-ix zCcig^WbS}sSjDihs;$<8qvx#)V!)eQ-3Cf`5A@}rIE6tatJEHyfOahm1;Zl)|$f1&2Z zZ0EAa&Un%+*$y+g@v~v`-fA(4+NFy_){1U;wekzN6M?G|;ZzIgApNwYlCtVS;wjn1 zqJ>&vV;BLrC#m0i7i;?4DzU7d6tD3bO3VlS*jlClZcv}eb7v8V$av(*4g4351NHqczo7I{-~8D!~>EfX~d=ICAt~3 zfA%HyfBUi@X+t(kM)gJ}V%NP6N>+U1uyFXW1MK0$O5b)oW-n3`kwY2-c|iaT%M5_q zM~+~_FuB>u>u(P1=S`+byCabUO%eBZ1hOMeROt?m{yqEHbWs6FAt@^ zH`h&@zGT&N|8QR)Vy?|l?IKo$lv}W<66lfOQUh>J5t+V5;TT^opZI6NA$CJK}P7k9>CHz`p4Q{ z)ZkjL9UT)%f4VHj0?CzKmqg0pAzJ{)&+uyGF?$U{znZNvr1GwNku+Gwh1iLsPm9(CK#?Kf%{BI8x) z%Tp@41AQW&xOyVb$p&iWpFt0C%jQSNOdtF2Q-Hvctt>b=eXG?xW!*0mjZ9J*7Ypq;5c`;8-R&_rN z&c(76A4)RPek3Y(v?f0lZdl>!x{aYtGPJp5=g|`MoOkc1#9><_w!r!fYh=fDYso+7 z+f=kc7|g>PT69&db-L~(*0e@Sm^C8_`sV7Ts?&p-%+>O!)q=c;;Z4>un`C58eVZ>; z<@zuj$#;A3&bE`^F@Bz_H;Ez-uA!OLL|;Y|sLYFHs6d^C7w8Zxz7^$v=FZ0NlAW+UawL|WJuGIENL2A60 z5-FZB$)db@Y@V2`52>~67UH!IfL!_ydPqGVQ*ML6S`g8kukO9|eKO_U-;Z^Wm-884 zedAgKTPacY2!)ns1rG_oC`m=`$@NB>@HV?#mqYfml>nP1Db_4?a2E!*?6mKv8*<8b z?F>ctMZ3zg%6aQMTR&oN0XntFv<0vFVVzjTJ7l+T7hn*Qx5|RB()SAzHl@b%1K6) zcpQ!}*Y2YSZba`HRF=y=7o9u4KXk*wJgOG|0XDSL7=>)v<ru7N;u{`dInhWT&(hAAP{ zzP;uyr18VGIzx(BlkvdSV{hn9nxkU*2h0XXx%>B;cG0Ez$EOC3s!r!|6k}N=4c)~!k^Tsc0<5;4Z*fS{)a=lf@ zM49uaiC#Rx#aKTR8FbU6yvfN98*->J)-_Kr4OO$g&CN{o3LJIr6~|QDId&YE7O}JC zggbbuxW#E;@s+7$JUOzP4A9H>56C$RqO^t4h?ReK?3MU_hoJ!YSs_=y?ute*z4@iI z{63qrdB z%EKrb8gj~MOrrVU%zAGPPLxQP+#B0`WnrUrJ7eLH8_RO| zas}-W94?*TRiIJ>Xo`&$_J#FSEuJb4b^0ONKLJ!Xr9$+fehka@n89BT38In`=ZR)3mE?{#82R4O}&{~6zw zN(igz1J#W=Pvu17T*7_A^wOI6DUcTgjf*u;y=6Md&LmlLDo2~vQt8uRz}ke5KgtH4 z)257JRa*+aKnvQU61P&U*BbJ2oGju|TWpv_Ua-3wiY9x8Rv9WiHsIOyRo1*A_wgrs zTcP^6Z*?A+z|8j}vPj6pr(gC9^@z5wc+y&1O6>R+V=F}{jI$@W2LUJx7u z_1gf+&oRT4ND#4s6^VRUX;81kgXD?p0C+kX#uY0RIC$SlAyV_k9$q-NL8GnJE7g!U z_P=t${LKgh<(3U*Vnj(nuOy)+v0PPplw28?Xi&>URW@0c5WSHaek7T3_-G8shXq-| z+4IH9OIdJm2*3&m(dmu<2xXRFZ&xA0*z07`tcXR^{aY~gyV|+X^5YiDp9_!c!$s|da?|l;a zA-OIANuT^D5TkFu=_zxKt1KA1sRNGgX4_ivV_Wqf2J1&-HPV@?LLQ|^3Hb5XjV|=f z5dYTM&(hG6KV?U*y1CgD`>k{@$(LZt?O{RC%Nu`)cYwS1eM6wFkitdoih?d0U0Cd^!8F@E|5c9llt0NM z7J9Yrx;63WsP&lKo>|#>RdDK)jsScKm8%Bbx!&U&m88YVuKiv%*=M@8^Gwf8Gi4+2 z2yF0YbInuv;K5&G8`q}`7)cw_-nf$pxh3Dj+3Qq1+^ZY#J|&IbX(vb?`1+$*emt^1 z4wN12i65jS($WZITKwThQXLVFXZ91um2+`!o4f`EQ>kp*?w9d>_u7y!6--|HthLg^ zBNb<|KR~vNFSCm^67&0~!5`z$&bVpE&Ln@2ZK&7Dss=|CiSW;E5G6m?@G6+UDoFta~g=DZoXYL6zJE2`=fmm4> zM}Gnx0hous-5@MuoO0I#<$;d{f`BZmSq!eq0a{O<`d_Os&BnaWU+n%Z#r+@4zZ}me zhWZ!XzmI~T_fo>3<8oIGuT0wn3{w)qlPN->^W`*jqeNu2M3yn*J$kP}IzGA@VvIpqfjUr0GlqdC$)Ej{*_Q$HJPu)orBb zRIP;v*RP1IwnR0nRU6uOb7P~1>#%=&0dRA{) z>c_QAvT}j8sWmxMwD$7#RalN+b0g_s72DcA8()rOghy$8AGLJ5#$I713SvF9;jGqM@QHtLN21Aj(P-b6 z=lb9oyehDq%OSK<@qffrg4mis&%awS8Ya+7Xm7(Hk{~f?He511LtSjOrbqZ}TDYe3 zw*Hw0^ld%IU+ClXzT!3H4!s&a$lmuZM-=~@v}Fds1MMqBDH1N&>wue92n6+=zFj8X z5NrdCxoCgJl0sB)C_6AsT9T{JUDQ>#1+bh$^(am4s%hh`d`UUEdlo_NNTJ$1Q<(+(ORpqRhNlu1se8JCSW${KpieHEjuU?2PBvE z@B3xpWQUvCeKp~fRH5#6`;|iWRkjgs2#-G_G02lf^$25F{Bjm)C18^s>!{fbmxkpI z$f-y;tdpsDq98vKZv*2sU(KyN2q2GkawkdSJD`*YwUoyrNX)|OFnDxQ; zeNArqXCWL2dSp@#3-t7{)-^z+sVv~~O$PPq(R?{4#S|4irwIVWSV3`Y4-YHeLXL$E zp{hSUD|2%X26aRodtc}6RTJcRZwc3)0(A{p-EV>fYUj>V` z9?i;D%O=H~t($bOU*VG=&UUZ|3_?tko=5f@xWjjcfj>odiwI>}F#$U6O}Yi)39ZS4 zdK89w#5+W)JHzrT=DPOoxaH;k1?e3nhF^JT5Cd@qpa$dKZxshS?LQuLe}MF#u#U(h^{12@~g4}COio6=I27Jqt$OL}iSiEDDEVBwB_ z?5|q~#V-5hXXk@nM1hUwr7QV5tWd`iP*A{i11R;CuOU|~theX|un-mPXvjib=x!TkhqW9cR< zci_&S)_huXq1Nra?OYT5Qdfj2@j!p7O#d&ATVJZ8Mo39qT}bDzdC>fnRQySX%L6h5 zW&hEC#vlGGtQA6$EI#ZGQ)WOh92!HaU-W+D&YPm=BkRQ-%86u|5tzLOH8jRCZ3oNu>|IWfm5<7)*73!t8 z#1_%tX8;t4v_+{NFpsl5bWQ~aV&xBGwzm5w){0ZrtlpX3OtZOV>xTp?52@BwP;P5A zR~xZPXzPFJEYErzLDcQ{;{Rb7Mk@WAq~~i?iAp#WkzFUYcb(1D3ek&$K-a!J_bj6zZ4js0Z-0n<$`<(9VS65lwM*yvqDL z3s6vBJS!(5ll@fw=w&k`-1QSWU(vYSqbDv~d)cNpxCv551ok7zq-m6c)_46g<=_Z& zAzsu5xJO@#N(mT1O6iYtnMOprOVN%`v2O-8pel~~XTg>^#xxKdcROCtvG_6_`aD5lh1Le*12A?xf=Q_>qhnB9beOyN16JoBKSuik~hzt(jcDcG#4 zy9T^-7wRzQuUBIlK0sUr%NUWPC%b`wY`5$usHJ0ZS8d=6;yH%kyyFRXQ&x0?D-zQm z6eCl)K0HR03%0L=r+ItdO6?=~X;X-ZI)>>j$N`jG(w0y3zYE`&;zdDl15&ztoC;Lu zA*Nr4$Ag^zfm9Uo2>*>#=o zmwYJtqs^a&#HJR&OvV<5nzD;8f+*Co(aXzKU5pQSj4> zmv6wkzJn|k+Pv?y$~)hd)U>BgrwDfzqxy?tusR&7=2M{Ep1C6_MdG*?(zonSy~3Ym zx_O`O)MJF7JhW*qu+;K}tu`!Nl8bD50|wx%oBxm1Epgz6zOiX_l_+%bd_Y0q3Zh;O1se9)4uC4jP)B@5}3Dg1AqKf3&7J&+XLH`5!p;d1|=B~H3|B8vkZxQ1dk zx|qM^{e$hXM*pY5ww2{t0%PCSY?D!DYY%v=vHFQP*NeD7US24-Up`!Vv-`iP(U;)n z+n(wOTFUI{jDUyMA$xL*-wrUj2`d?0KJ74kz%(jhW=>zMUMXnD5RuP1$8N3>?Zo1* z_GkBj2D+IaaoUPBplEC*Wf6IoytK=Ocb%? zObf@fZb0{q?^6P*hdL}UP(^4%wb0Qjzwcq*=Q|~Lq^kJrt3^AvwOMu2ya4U@0sL|EpzPtM#^nMaSmq3Zap zyrj;aWX3esHZd3FKu1bsKTh`|Oao7U4wGCYTeU}}fd(Bcbk&*vKyixamJWNM`qr5? z#Rl6B*C~anS|dR(p?_1Inoe9?U?uo+lzA`0P^E@BNKHNgM{ce-BJn|-n_vZKZFhvLVfhEIgP(EQqU|3Q&HUG^rJ7`OhY|LqjP#ezTM1-Jx)rEz2>dJBoO@j!Az$(W)W zl&|-{?tM9`KP5cx`V8Fh4h%-bTMtafKQ#b7J`l|ALA-Z2SlzAtKk4YS)+d>Oj0Y%y zlLVQZ5(2Cet!)tB`}u$Xoe=k=VyCUW$CLKzvq)d(@Qy{o7>h7l3Yhmgr(v3^! z5FsD@X=RUeq~;!8O<^FI?&oWZI;K3+Fyzadta}Ybq8DyP2=EX2G7)lAh2zZWop* z7>T<0i1*8P(kOf`LRz}i9ZH)@s;a8(*C?MwSxOOuR488ux#Z8jLzjAObF3{U!dV-T z+`T<`C_P%JQub?>PKS1u<{0(_f4BfCQ5^bHb$cz*#D^1K{X`@I{Y5{tYp^7L`R-8u zY7TARf;*?Z?DWV?rfPv|v0hISMEVLyL;eU?Gz&BIa{Qj69#z5yFa@2@{MUH=TSB|1 zutE4MdC^Vw7SZ8_COQnvAJaIyq4>We?Q-fK%f~Xz{X49@N5S=cO!l2u- zyHd*=PCQ|Z{r$lnKw*f0Ardut*A)}j(RE8;y*ncgES->$Jaoy$94tIq7XFcoW!FH$ zGYj}`GM#S1-T`ESQHLVE9VC0cxnw=O;~T6$UM;=oo|^71qM8a|qlF_l9#zcyeA=tx z>E;St1mSUk%n}0an<156z+#!PeROYdqg@by8tsxowQ?&uLz2C1F_v(Q#LDEDg=|%U zLJ@`1Tn7IW39`-^uVH^kWY)gbF9Gd-6Z14v!FOdvT?eLCzfalt;UJ)*4eM-DAv*O@=>yr|4cXM&<>dc` zCH}gN|2Eq(QkPTlT+e+S$J652Ud0@@Hbk8(-ZBG^wI-(1Ct;GP!GgI|D^^o zAi_(8(rec;D`aP6Is3f-OHy>384|S0d?zL~wvpC|GTjpTc+zmAmk1pV{Z0><*OCJz z@(?!GEM6pn+N?pbXO!16pQB*)OYSkVb+rzj63!n10dC%ptom6*b6u(-j|^a%-IqU_ zV&ot3dK7^h>fMAHhPU^#Y5Trf&M1)@R?1f!=}1J!1%o(78=~0#+0bHVQD2d4ey2+} z9ReR!r9Bd3KaTm`U#AGnw-+Tes`lV1tuy{C)7`%Plp>({6trC{rp~V3e2|A3yl#{4 z1Ut`8zAYl^;2)D}P z8+k-15|P%(C*GJuYEP;r>`_*hrcAnou3K@f!OUU)+6$`Vhqh5iS6;Iy`sjUt+g4)S zE?v+0R3*UNlT(Yb#Rr5XZ#-}B-X+bY)*jY*o* zvJL5ZHF@4AjmbHWVWjYX?v#sd8TR{=L)vl#0fA|RNn*St20oNkFR*`(cKVH!Zo7i2 zez0L|Fy@z>*FVv#JYa^@YP_?nW`o6AxWQ$)SN~mfCj)PNbtvrO*}={|_sK7HLrYmrJi+l+g z+d9r06~yO}z_vqR({cCno>iZQqIdpLT6X*#EX4L669PJ)&sL;GB2`>`d*| z8WccNnRCu`L_94B^u`6eSDqnv|7W3dh=h+p%m$voKkfiN6Ca@lz-AZaV>Zwg<9xXM zKJm0js=K`B=V;q*7;d?Am6S=pImi84CqBKm4KV21Fw<5@CtNF5r=(@g;kCeo z5hTg-KhQqf_xc{_X*)HXVM|=DyqG(SMTREA5?H^O9>`KW{#ako#OcVp5oK++$sXZr zZmz-95l9+Y_Kb5ps>wWb@?q)(1vM*a@IHKu#pNIg`lff{1ABYQ&fR5?c@uAdwpmKx20Vb_rcvZB7VvvVT&I1V&`&+>x7}4!K z14p^}?U^h6&rbl+QZSQb1LS{O(ii^=+}{Z%3_SelXoV~Q`!+c0=5D`nPy5RFRcT%8 z6%!KxQ5b-{kVb6u(B}2GM!xQU_&>RNe|RDjcj3SlqY<~`nJRXGfW&U4a?GPCUd9!) z@x4SN=ST`>kfI|qw?)-y`zqlfauI15PZ)}KbTD6lm+&&LEvtDmmpYx%6uWc^k=(&Z zwUHyIuzf0daH>b>U~e%td8o-B7uRspb8j?m*N@)fy837uKFRdikZ8(&m0Q7;+LT01 zp&o7v{nw%)8Be`BqMK9lz)MXpvTMR9S2em8%7j(yjZl4eLTEZWoWg5#X0R=z$jO=Q z?K7YJpNiRlc{QrU?u8HTq~*fihGb<(KZX#!Jlyo3g@eS6GkDHCh>e|4Dg+~W6VL(; zt+V+r4kw`MqJj6pO9}l33S&$C0ut_3?dKKx1rplWjbni>*VLV8VBSC@aYp%9RvC0ppD(51+Yl?*D`LWt>@J1w{{%-8O z+qvkB7ZkP+yo2>#Sq8%}Dsc(-whN>w2^^U9S3K$8x>%~1;D7QFAmQy7?+Wk+X^R`= z&KYxK-Kl!>6!UVWMgJW?e^}WGZCg6r>y1Az=9{O`1NK_Yd3kOX^)Va;8w74j;RUfq zy!%F72bB42?(i^W_d(d{>-~h+yJ{>RX&VW8dkh87Zm0 z3s3BlOX|N`MM&miJ|jQUA>Jp@j^*k#qc>ho$ayt1M$l&QdTo%VYt_6TDN6YZl6||ict+p<_aPcO?UAwckw`@t&fzL2fH||NJ?XbD(norQ@_xmvtGEqPM zj@l^*z|Zf}BC+ohpXMP^j>&fyZe;w~2iBPNk7I_spnakSFH+OH06 zz{9`B<4;ooFLz`I%Ai1=;XeT>!NK2A;BK;4AYe_h*SLEl_HA8O$NXcC@(|?ySW&7I zz|q~aMRS9)^#TQYOYqk8NEt}_`j|hzu<|xsyk*b!DYu{W2YlG>KdbS0@xsTTAbC@G zZx*|RCsvMnXa+G)!1ygE(8`hM8*qhw8LvF1vYe0ytXl2ke)rmLRf4IO&GOgd8NXTM=EE)51sp z2=?u6Q${bA}HM8^mr&}{2SBFQW-W=|P2`Z4pKTr#lAGbL@!{MVg#_dcwCao1jy zL`B+CS{;KgPlgVW*c79k)wfYgW5xF&f`*wHE zGCQGP!kkg9O*d_16ca@MBGUM}r`tu4RBwxPu>t4dxwT~@tCT&?{YydXtBfxCPxklL zk?McchlBwL%TWIxL-5~(A7vZzG>o%BiU~Of)6l#=>JNa$pI`1W-kw_77JdEp0SSlz zI%VF59*`RHSi6PHsy#ywZ2)AR?<4-t6nq1=r!6aw5M=oEGa6VUOzp`?R;pC@9GA;4 zb@m&Mqs-j;&h_<6pH6;lD99-m7@VEY)>q%vaJny}drn99vQ9x+(UJkV{5-cJOVsp` zrc$F`@|M6A0!J9UyVwl$q)2=6B{bIe(VVULh|%e}s5uoRuIzcW+9GJ6r5 zG-myA@cn~y6FcA!elEpV?dO$w17hLz@EZgR2^32)?016SuRn0CANLcAIqf4(K86_@ zXHn>Mt>j_iaLyaZ{Fk!ngKgM!0~y+R%+CulPG*+cr}usNyNjYk zFt&mWCSX5~1(of3o-d?>HUB4l@bq2+RaC>4Ee|dc5rGv&5Zx=#-6_hqAc8k;u}@qq z0|A09Oar%^jS(7oM^IaUSM<}4hil7ML^Tuk2sgeTqssQvDv`<&Fui%`H3(HN3z5!| zd#O1OmDoKNF}7<2R`1R_Wg}r1o9wRHy!aa3TV>1__fa?Boo<+g?@nUzWj`(8?=t=^ zaf2#y|1G%%-9KPnKD<#4=i}G63}MT#BKI?xb{p_|O7kR|6VvlTa+!J_L5tthHRuMH zcHQ675@GVD3=9FDxwlz2NH60_d2KI&Z$BO^p1}wp_tht}A=nTCQf)Qe+^J=0`B-)g zP0Qn$nMR-Navf@K7>U5i;M8UmUxdT9m2k#iq?n=K`6a(h4~0Y|r+%90wjei;&f-+A zhOrmd{s42Z`l=zu+5+d3#@B&cn#EhUHjm^@M8GW{{I2$llzPfENhfB8E}${B=Zp8X z(Ps}fltUy+d*1%YtEDSn@gL4n;D^y&0q9Xu<8e#@TMaW8{qDIq+Q{-agt1QZQ|M@9 zw(N%5b+z*}a8o|DO}U+Xg70nYj$UV_BjsNI$=E1=juec)3uUcd230FhFOY?VaF8AgRyQx8;T!iKyZ-Htsi z7DtSUJ?P^TLS9oM%R5Yx`aU(h;}_R)9A^qN3_ZK86`LC*$DVh)8+3-K`pH8!ul4Sj zj~&n(Pj=&?g#5Ui#@p6A24$%5;54ePU*i?har5k|4eS=2Ed0zY^;sro=0q8GZl{7U z|G&*^d>%uK{}!@&-EEPPlzayMtJ31Wudr{`#RNRZw2s{OyoTMcIJb-ehNgN%ohcw- zGhY$P?0(|Sx48^?W_*KJ5$Eyu<6nn{lP@)YaFT&y|Z9MbrctL9GzX!uHjdox`Y1)bIT zS--$)4Wo20mP`QNxV;5?r-K%5$4s-Chfzgjvyr?SimuG#>O`fRpMPD@S9sM3`6G&N zrQhBXKSNJe&L(m2?c_Ed<(}``bZ4e|7SoS8oq=c#9yyp~DRePaT5W^{+NJ_q=T8~k z3w8XlzX|jTTP-W}d?uHj^;2aXRnoad7JSS1gm2CLaRkX(l6|n3fa_6hv0swtz zu!B56d*JRIbAtpEG7WgkjdpBn@j)l zU1pA@tCHzziS3UHUO_Zz`L-?kJ5R znRdC#iOZt)a4IsoOXs;J18(=tJZ7|Ofn2)Gn#@b8N2+hV`qm7B_+^i*)5n7OTBRqW z$qfD?1t(2AZEZ_i;X3QnR=8=zu#Pp@ch{U;V=&83WOh&NM~pi7ff5=;U@)7 z_)tru22G2z$Im_!P!lu8S_>ndrP{uo-<(*X%Nc`}-J#g3?iXe;AZP8=F;ZZ)Asw(y zXij8%wfJKJmxImqSd=UsZ6d0Z-cy0z6<7*Y?(Wypm?byEd^MutV%l_PK5YJNxy4R! zSI?mB+;gg5&(s|^-N4>>HqNkB+CTX!%YXPPBK&rgejqwo^}Zsx?{nwqTcT?Fbo3r% zJplUE8gW02KD6O4TP)`$F_p0_hneK ze(7Q7IIvFE!_vDdJ?sN~9`4pMc5Vn{LgX$DzLGECOPz}pplY9OSCGw+!OS3ILC1_S zu<{gNpZ)vg?`kMNt4H`%$=@r+N}R?i7p`POllhWn)WygK!!$q`Q&r>^MSp)MDdUh< zX{ha#K*K*qBLMaJm0l1APOV_I#i^^5vQ7q+bpO1A*T-qpmHojmqeW}4nO>f(JZl;b ze^?7$WvAf+LaBp1@>q!@tDr9lfhP|h6r-Gv-oe6p`COkJT;J`oZRcT|qKCW$kN+~| z>5S!168h-aD%Ko&nuzzmw3W+W_rD4Mwl>ai1EN$aTk8AAx)vqo_|S>K4J<19LSTqO%eDtMikU#1|UXoNL)EviJt!!l%()$G1Hi|?Dn zy@DjHnyj7-VJ9m+uXvCjS<}vZzpiA&KceYP-tCKgjz48k*F>)y-^k#if`Q?jChDf6 zD6GCFZri29-va1PGiovB+k36 z+q7&GkB&=zfx?T=VheTmiig19OJ&GQ{}IR2?Eomb1ff5D0^ zQz8H23M@zt55wfde3cCCOvNu?kb>IS#v|F@wxhEtIB7uJis$pscmTnF;{k8yVc0~p zwWI;?TDKeW60t(Q$w|>2e3|@4Y2Q4`w-1~D6Uk**#v;UbXica$;%*{1; z@=Q7~?V%Zb6@uk#z2cW%ZZJ6t<}6vg?GqZTo~nTpX@PbKyY09FtQ#Zbx9xdXcodZ_ ze!(KrcW5=18ZvYGbI<#MP7%dr=^#Hd3YCYhd2ewInt}Q=?y(d3&)6g^H+Onav>kqV ziZ;7zWLvfT^0)Yx!OC8)-FUNTF=JOR7NP#pu_soYu|p2IqJxU!obEI1M>PG-R&EoO zC1d%$r^m0|J#MQlsJ;0ZtRdHxfwnTv4Bp72F*wt8OTe1A_z}On7`l=tnYw=9^NrN2 z*&sTV^|6EKPe~rr&5p=_X9188+eMgt9h(=3&`BO%^K_{XK*{+NUHv#cuA<$^V@oN& z3ZR65Ar(JMhrX6#Y!olB(0B+F2JCd}l3>pZDS+bl7wqj`+*oVnvO&9^(uYgX!hjUM zmb2{oqSU~sIOfwQk5?fQ=~Uzubd@2Q)k(tfPf~>ZHu}r5o-b>^y3=qMF|Qj|NBl?x zrkd&CVguUF5uQ6@(*HSlDgHBfkp_kbrJR`RL3+-^+-a!@7&#W3_?PboJlNMsFoA;G z-f!Q$e=c6V1raZz?pyoPVi}zUjTu6;H6_CnCyKuiBde=Ru<+$I${v^ALgXY_ioW5` z@%#2d!sy`U0u!uq*=7wu@^12SCYtc!^!u97J+dC^3)&tn%x!)x)d-zAn^IrlQzv_3 zD+H)MuehA)E`ryMVU!Zn?aK^q}ArW9JgPw7zPeEKoNM&A=Ui_2gS>e?%cA7WoKNdWit z3aiaU_i5h1xbnHg{gY<$hhhs+r_Q4TDAF6f|9>)yck1dFg9WB!}|$%YFS5$>9n#m>oo+a?(8Zy zr}HfqEc=30aM-n9F6V}i`gf6bBI3r$=_C&_kLm~Jghiaok&N$;2=8AP8vkWokB7T>UkQ&D-oZi)j&eIDyaB4sl=lnqpM9<$8pR96 z7TG!cU|Z!Z4N*HIOfHHf0_oSy@iJHktBvsGvGDY7Y^#LnkL*CK6T8LY#ui2BbCnO4 z-t*bZhTDdrhNqir9K>?<(uyh5mnzFdPJ?!Ot*k4MtE{FOvroBb?@NmjsLMVPB8C0- z#X+5D?$HBu;Iu7FX}Fi@I=wOu6S?6~QpBCOi zMVrWU*9i3yP`c=q+OyaTX((NE4AvNJ=WZHUmc)Q@f3Zb{Gv`UQ^XK{Typ-2~FErPP zqHYGnj?Ri<4lRazaf`vAd|ATgH0La@2=pM5O;!}fv)A$yb}8yMI_eqjw8a*SHEWBX zb^rYC@a9*a3ap0=InZ7Ytj&vC*Z>vSg)Ub@y0X3FZ8{!;^PvunL;WGT0~+0sbeoGZ z+7zUB${f%^972kIpPVD@;gEKQ@$G)ZyjPyMm%pgWqq-)r=AU@;wEzM434Naj!E*kvsLlsmRqrqB4;4zP2GPiNr33#OD?Xy(|nnrdRQo` zJu5>w*nwz}9t#gt=NR0c&Jqy)(x{=d8xI={S@emKvLYmBYCCgZT_Wsl8Xghy(U}9i zcQq4R{tdioE`?c9HkeKaYL{Jmc~m(r?QcB=-5~z4-jCEPY5O|Su_MQANYc4$ojBs| z&(kL$gyG-HURj!??IRpD{;QPNrb-;x0B2&tqyOplaiZON`3$%=r5e5bh1;t4~1w+@o7 z&e(&XA$225CAk7&@mxt5uFcHrWxV zIs|UdfMHQ}*Wx((EJhtT@QAPU73OU0Rc@$O@B4WS-T*&T`J?9R5^SA1eQbZ)Znuk( zRyqRBPs5XK;65!r_kme*_&Pvbr?atfsu(UMEVhV-W^ky(t3(^Ost~Sqz#EeGa5>(i zUC~EX3^kfo5~IHOGT2X1M(2u?Hk}6Uu*RKB=NC~=DcaGZm)0oXZA(fhe=b50aR@2> z(NcC2daG%s*48D#C~-D=xg>QI?~$X(E3lwJ9&Vk;7^sZMp6$b?aNq5@NFq2qR<e-Ta2Sdir$sNAohbhacw4Ukd7kGN^?Pr z%Dspx_e(cPiZr5dGmYzHJFk*8@RO4AoTcDragi@mEYlkb+lB^EN>l(7R)RQtNN)&mLJ> zQ1853DqS64#cZ_2iVlvS4qS1=v}=Qup> zE%uhDi*cgO0vNXDh5HDd7a|V6!X;0Xe7@8Ofql{u-pP6*GI8c1yPsO&pq{@|D0-GEH34QH4o6mgFSk|v~8-5aWP&5 zNQ0ERPWgA=dHu<#N*9iVx*P%Utyjeb7%9J1u1m)Z9lAFdma}TA4EAO%)H1sj{j-@i z+<4L&YN`6<(a>Oi4tdoa=UFJNh-UT>0Cv^3N%!A!XvW3HNfL%J2C7bRm}6|_m^);v z?ayL5%#0pdyFJq-1AY4_wDUddwn@RC&2r32L^C)ioJ4-$1<;Q(7Z~p0&07VQ{r>v> zA`prR4XNxt)fJ|0$rJRvx+keBYmWoNs^mRHeA12O>B^1U@{Qa$o8`D;<|IK8jZgm= z<#1vqvY^R13L^Jg3CsHdE=4_9Nrh7BjQsuX%H`2-{3fI_;;Kvhj?Hq%8ei%i+9knh z*h*n8miMCtC4!$rD%;flEK}u&HxYk`!6Q~wPprujXX_&@YOTFGu%3*gsXnAJb;QHC z0eCqL2-MD(y~D-ncR|3vs4W?=gQoY7kg6szc0Sk#Cc>K4LlcZI&hRp&IW{szrZ zH-`EI%Q-4H$c9f!L6MMeZx~o-zFjxq3H&FH;$suZAb}!2q zUq(@tFs6YtS-_vR6zhVdWtG6sth1g5BZTicgda$;8SfU|Gc~)6BJGLVPEPS9q*L8n z$Ip^&_9<>?0(l}gCJ0z>*OTX@T@!{$DonJNF8i9ky=XS%yT4|QRQ|Y_Rm(PmnsRt= zf?eTZ4I(dOE}nm}2*eEkM#qAZix0Mr`zGt;8A3hjJOy@gR?7RyjhAJ@kOH*MlO|Z| z#e8^gP>tZ@s6iRiK9%9qHbw72V6sEuC{=g)ol(t%|3mI)6kKvN`s}qG1BC2YbiMGD zPam52>6jnxP|b#3w!&W2WLBH)PBx_DdU#?#hw`ZTbr~>nt-rX?=WbRh{l%DR1g$~!A zK^cD6z}s7~QGcbgh&QcgSGo$|d99?)Q~ZB)eN%L$>$YuJv29xwR&3k0ZQC|0cEz@B zYsOB+wsY(3z1KQxpVscv-{$j}Umty-_YuDYb7;2oJGf@%$x+(uq~~2`8Xq2P|Y+RsZxDy zCQJ$xTmgjsGyz|Uz|~VE_pF4Qz``v7YhOp*Xl5a&EBtn-qga^^n3JuD?JyuyaQeAd zOSlc$rcWg`#gVFMVG`O#>kRCy`N?2aqzeZyjUF6^5f${k;92m)%nO zQe=mn_3ERfbGc(S#GcCN_M~IUGIk@InKJ}gDF0O*!nb+rAeYBzzLbRQ)1z5Uv0<<9 zvjKcM#NS=^VF;XzU+FFJPB4&4gG#}WfE#0X9zccJuRt7l%`kuW(2t116jZUBNPGf|n2 zq-&*ebb=h$unoc>#vjj9i1_}CjFpa%$2H2r_T>hfL|@Zm%zoRt{cJxHF;kQm0r|0f z8et{eS!bmZ+Ze!wNqcMFl$5)@FbZT=y^H?1)Td8%*JhGor~2E9o=sEZ^qa*;b-^d7 zgp@T=H8Oht7&}nV}vw z0{O1&`MM`xd$y5uF&e4^ao9gf=wRsWG)xl8|wuC?g=A2P95I-2s}` z;#9WVmIsNVe@Pqi7rRg5#HqXewU)Y4;KyQdTFzDBsk|fPLoY9a?DLcB8DKt!bVm*k(DDJic-@2 z9092lAWI>Gaj z589LX5s1h9Ef8+`p&~Uz%1gb#wx>j`pDL7!2T&Xi=1hID7DvOMOq(dux1w#X*5W!3G$X?~02?;g65C}^#F&oOfM--$>LnlwJx)(%g};D_kA z#452(l*NR%~G7dv+S}b`6hIvD0mI~}paM&J&3>H?Zqd64sl8!B> z6FQL8AoPE%?i>lSU4~oo_OEdRxv^QK{7~aqBSXhM`pQa8atg!o4G&6KfGfwI zRYw19>yLgi2g0)1w~BST?O<0EDI>)v1C9}{q$H7GAG83|WWDP-YzMfhNWJH1R?tLsJdRy2R`2x!q83k_qEHk6@6Q2j2t{LXK_siaI0L0 zNF6ArsoswmW&ilwgSJn1M}lRTcA~-buwPjMh7f_b+JMD^qnIoqmI~i8lk&}XSIG1S zLC+t_(e8|J*ZM*8EI|W?c-SnZ(}cZjK3S1Z555=jn1w7IUidTnB4$xV-U%~zumSBP zqY}M725mN~cqn(gtg%LyB7-;HqvX&$arGSHBYGe@Y)A3&JRF&ei%`KX6JwEw3=12~ zWNtzAqVcU@G9|lsXn`1Ag6mLPY>jP)i{0ohQ$UtsThJ4u%#mwl%l}o*Vu<~v-7{fy zuEkL($`xNa|1iCI`-S)hv1=2obzEa-JNZW;J^Y~Sh1n;|;#hj3VVx&JtZ~sulg9Qn zAxP+uoAlxlIX+LR5mlQbttE>*b<2C?e5)}5f?GqnB$$C;*-a$4)+G8c@s5H=sZc*e z(H3lS)1$mtIR+@^jW;$t)Zs#kRuc1%u1hpCME`CZkoR6@=}?{tk_4tZ$X#2Jb0!$p zqHbS47W2Z}NM?T+el?9`aWwPMc4l2)=^z~2vvSKkh3iTZ+=gZ2b>NbkgFO!>U(eT^ zEzBo#kCk0oa}=v5j>j9gLVTs>%k8*TdV^RVyL|OWsrxKseNft+%JEPcHf1m^#WmyW zifbscC{U=mAY=#&z^-i#Tfxt(QF8H?ck$Gx>>EfFz2_b|ndP_k!f?cIV0XE$eR6Vt z$(ktU&p|3yFuc538V}J7-}?fIBP(r6=iyuB&Q~C}&DVQEP)$;srLb>nOSYTLXe0r7 zgVPn6tgO>u`1v(UkCBcv!LQF3BZdq2F;e#5z!v=%u)!EXOZ_l%r7lzUJ_ykXNVu$P zh$XINqlSc_0cx*iOLauH$ep@>@2*J_y?Z7ODS7CH+kYs4MlPoEJ#3oV_+n|8n+c(d zx}I55pA8Oou$R5mrEdLzAr>2Ap0*!{ufRF;XCiJ0*MK})+-O*eh+G5t44r_^^PWHd zF4z#h_DFPBL=Z!>OfXkUMPXmP93Sh(ajVsSZv`c|PE-@ZOelUkA=i&sI_d+HMWJV* zehN;uVPz}SkOP({=qX%|vFfHIV1U1}8o$bpJJQJa60!XrDMR?AuRq8Q zA!r0*i-D}{s4i}U@AHWegBM0+z`^r-P=)HXZiX7CvM9my0!4C`hfU?ZSq=UuxhO8n z_t$M!OERYL$HVnDr}YtE>h`DaFaw$Ig>4cq%Nq;A(j&FXV1cuHt6epC5p(5ma^BMa zUC8`v%N-e0bq+P;!nlgiSlI+?lRjIErMEF1|7zmLk|#&xoj(;0)qzi5eCa+PB6iuz z421(|3km~i6Se&h9M8DM88L#H84?d3-e&bnV_(&2x1vjDl_H0T$(tkLC}>Y!cBov3CsrOf zhZb%>$u3H|@bX=7I$~b2l|2ad%=5emV-@a3CS4o!^t_uxxz5vJl%QnEvuSZynU9Wg znm)SYXrGV;hfauMk&3&9ECXmv32B7_HkMT~k-_|_qO;O~b!jC$`h6zi_V93}^ zv^4SMjwFRMwZ4dQ@fAruQ`gx^2LkG45AgL3=`_PYp2V>~(}87HBnp)xvB8OYWH@_n zarzv(JH^|vtb%7p(>qj)>&|z)1$WpDKWqYUvAMJOwwMPLm)hbqzy8a4WtsmkXcGZW zFf0*FDrhtpZqI|xSfY5GNrAECI%p{4LCjdErGhh7 zRY_|&Q~FB`TzMWqTVFVumrt7)jgZW3JqD^aVM}CNT7IF#4QwG5+|FXUsgpqf7%~n0 zG5$K{#83kAf-OwO5DQTe+ZxA_eQXhj2(il@W$4NiR6nyw5%jy=si^@nU(JZ%S6nwO z_n;lm#avxkLS1D2d|6|a5yRa0S>;Atcm?G_iYxu)72rJ{9$6E=%{93#tcob+T$F72 ziB7MYAnY(uh?M{3ay3HmR8G|Kq}8fuv=vb7`yeVl@)&YLsvm<@ZXH%%SttYK+pGRZ zn-?Ilx2uNFRXH-esl50=By(*c3w$zOM;FL}SvnSp1LUp*lV$<&aZ#_=q`#OR1pHDq zOR--*M2Qx)f-#HT51;yiTf{jumjA2Ro@-?%^MZ`>fV)L7lr@W}(kAG)T#QeETz4*x zS2Fwr?`~9#!OVvp>gQSX|FLQ){CgXV5FvCrN`8O{bc3vm=I-awyP>J^`^#rke3Z+K zH^UgEn*G8kUbv2{D``>LokS(v8_ou?7jG_iiJ#e&vhU(xMaTwL>INx*+u9U7Xa!g) zzuU2R_h|wq>#p#KFWQwE{f7S$bokVv!OZMu21a_^r4Qr^g+|qG70IBL=swY6@w(HY z1+{TQ{hu?96e@J5zQIdFqHA0er;^TfS<7Y|E=`14y*V-jYftfHB2KC7t9QBQcS}`4 z6L=tXYQdL47@*tb9%D*+u^`D*!fc}AcQSL?>ut5CK78ihw)rksXMJ};#<8!;dm~Z! zAeP49oohd*a82tN%z)IeQdUcrt3{lxA)@22iUv`Fvn^;O1Tv%4<*>y!!#y(v+ohuY zB_`_Lo+eb;zF1?Vg<6##B5fJx>`QQd22*L>}d-YqSq=}sj!lDZyb ze?_r4$DMU)PglHp?B1?E86ix-YRKci ztrz~mOFAj=x9Elc6>v(>ch2ATnIyKl$sD zQW?=7jg=t9ScT{v&-ZM1#^*6kC1$H?Awa=ZHna+XVJsN%K>Q~a#`05HSJ??KQ}@nX zR?0=Kzi0uUXS{;nQDkpb6C-pLkXD!~G)h~h{IhIz^h~-kJ-o&Mx?pv~RMHdA1IY7V zMq5A*Kbi2F+HLMqYPAocEYqjevKeXLrZbT*ebPMkKy864$YEK3t|Ue*Ziq3-F#xv=fL{O)4r9Zg ze9pkw;^5w5qQx$3pTI32`K+p@-vRvJiG%Q8I0jw^X+bEBA|V$Kuse7Yx$u5g522tf zyyjjS#LaA1uIZxPhiNk^f7^$g-miO_BH!L7_n2fzQ-Di(=ePq(POmbqqnwb?{N?)D zlxXpG&rbpw4OcNU)|eu?HXL@CMw7xhra<{Z4G)XD@6(>(rnyG2c)F1Za)}RVUB0bJ z%n^C=jS=p%D>XagK)^G1+3{zKCWotg_du|$l$cen(jM;yf!X7c;(pWy1 z=xns$dujS1@2Fv|t(6!NA_Iz%*&V!3`|nfs5`Rdw@^{ZpcG*&N5;Do&H-b>EerIq0 z_)k$w(le?X10WI%N74%7I?StAugC?`eNlv*eNQL%cL_s$AUPZsQ zTzF4s;#jGeF~^trGA)|n84%Y3*3vC6Mn>_Qkrh0DPQ)xblD?IHAPcwo9&}||1cNWs zxLs^JVdckFKGBoiFV3Leb)fGR66=PJJgr)R=X~HuUP{^#A&5OWS!|3Y{yK6Q?Q8$h zMg6A($`J53H3OkJ(t+w@r-Yt}vX^DWAK3eA7ryY8>1%jp&bHl#D0V-8)ST zXOhHkCL#5w5ppHwW}$M^FfFFJ8rXc1aqS+ z%^!+M0uNOkQ2N!4+qZjZzdSOeOgDz|2?WyTks+?8P*W(oh%ZJf*_sCXqHz zw^;I3FA(SX(nupTgJV-hd{jIQ`{`C1Y#SB+ET@o2xLUze!697I1o-$Uz6fjO}mDqdKY~}`qkFbhZEJDhO!0sl@O83( zzW$|1{Ld`*A11QFiAO3j)8*)Dtkh9mU(az#^Rm?#semgzsUSQ~yw3Gzfo>dZx%fbP4wHOrT4G_gA{!Cb& zmo^Vh-}_hY&_1)6zPXCUGMXZ1{2-Z$nmZSXn_p>%rKJDHnR`t@yiU53gn54BPFZj& z2y$Y$@^r(IH;`!!xQgLS@IU)=P&Z_P$A4rHhAV&B4)@U%N2|4vjy$AFrSX)U$OafVpBzC1nZr-=Vo@ag_{3(gs zX9-=>Nq|kBw(7nT=`LTA?5~(|LDNhJjo7qY}e;nEu{oP6x`j2 zEigm6c#yFPzAt}Bv5bNL2vULqqc5XU>s0z5d#%4z+0cJCLJ6NK0@h7U{BC*qZk|=b zBNpB$>wrS$G7}#Q;U1qusrhAwvmCw+#dDC~uw-I;;~V<+XF!~%hs*S3V;#bx@&CE( zP3`#v=w+TP%nAl zp5JcmC|$Ul>M<-0n8+ykIIxOL=ub!X^}7+qJ8iG&z_dMryCeiCD@4&sidYOrxMHTr z<>aZV0H2(tP%l0f<1|pRIH(4Nm2v*Gk1Ilew#iio%@O>|E^6!YC80;{Drubv@NtUA z-g(pNHxr3;d^}g}_BwA{Mw^VeZ&2#@kpoZn8eG-rRJELSMzS@MHLUy_0`5sGYblK~ zbS=4sIy`6+#XcD5kVxMAVm7tFVPNoy!))nGF*VPd8k(qgDo_}vlCW3 z&G{yuPD7!R0Dbf888NCOC#fRgm`g?%M3Mem&imdyH)MrflwDd^OFI4}k0=x{ z;*TWn;d&R-u7wU9^Z+jFOV)89wm-{R-#I<3A~~QNrYwZpF{u+|>fB1eOGp*8$L`zX zuJ=0AOo?i97`{`0^DtMs@Uy`JG^A@R%_mb@Vp=ucso2gsvh3i<&c1q_z4J}^!Ehlw+B5xY#n(;mZ%qrLDC24K$V!T4>au$ zgum5*l3^u8Zm{A}cW0yDFqxTh^guG>Uq;<*bU-vFs+ey1MArS9VVrJ*C<{#^betg4 zgZ5}gRw0`#2p6$nAw0Iy##fJMw`!17L-N$6uvrvwMNm0mHiAEI7NNH`_Azx__r?Pl zkl0Kd7#VFheX|5k^~4+!t|Od@OObf8F_J--m?gGS&xr~!K%h6YS%gXbg>*8Xr$M;5 z0Vz6G(V7WPn*dy3nf49VCNiIsC=bkfP}KKp6<^oO8R;b16v9nsWshC*DY7lXoFpmM zwlY6MYKOgXZzDfWj4D^+SSd(Gx2|=S4oFe>1)t2YW#9LZ(fb-~+9?{_zJJ*a&Cy3A z`Nm47h$`|9HengSy5tZ@L-q|=BG!j&tPGbKt!5G49ER2b(vBW$v=}%;f>VaHELv@7KYi@M-iz`KzG|in$;BF z;_WKh?-Tf1)`O2rv$yON9@ zqE5UdAqD{P7nYKeRxo`R+*WXR+F|Ih@DOKSz9|*;&-c!=)0N)C9h-55mctTRyGKOI z1Up8sZqe#m`qWpVDJYgh*NuUOLAwt7InF4j5EJ)hfnc({qqWpaq>7lBkD0Ezb3jQF zs1;8ujIjI_S;Du&aDg@oWiSS>KvTP#2dlf<>LKgz`r>!MOz1>KSddsK{IMBkDt2*J zIvrL(eViU=8SEO(PFI#=UHv}fUpmbGj;q|pkkOtXwOT_2ju4aw_oT;Do;jsMO|0Sx zw2Uw#<>Sim=_+ooVVR3kB@2!UJLZ+tO;(@u$Z`UIF6CL14CYdK?tj?#``+IPh*tZi9raQ^YCoH0lM>8DHcV@nArY!tJtuV| zN&8azxUPm{>#-L^#GL_4(x zRZ*L+W83E`z~q)4TXN zphZgf7$^0+Aa+e{aqSRRs^bEx7rGe2k;l}2X-^*+u}}^(e8#?Wb&a!=497U!*{;h& zqDIIdC8v4kV)?Tdm*y!i=E!w^0IEh!Y}#9KVw)np)ZV1e3 zAJfAy{PyXixJ&DBkGh+X3+rkNgY16oE4-DZI#=R~j^fX+j!hu*-*8Q#jO$*wen<0p zhH*Usi1+9c4caDoI1HJV#`*G&jDWK4h??wq=pB$6KH>jh)4@xzaQ zM(0`a@8D1>3df|F@t}1pt#*t5RP$CFv?a004fs%tsbmepsZ{Q)D25?xP@ce~_Q3Qx zj&wz5t&4s6s&zAwiY4WUeg5*3JrCND@OOSVcZyIyD=U|lK-x_Mz+!X{b@(|{aDkT_ z=RHMqoOx>#wMTuJV41cmvFAdp(QO?jb0WB>!fF3-%+Y733#jVlHeRpQ0G&P7qVxucZO15Bz)z#nIUvy>4?t1h^p}aYNi2K;?D_Mn66GhSx=W+ovo5zNR^MHaiUOe!d=gZ2l&g zNN%ku+-O*UNY;4NR&w)!?lWWl8|=BAz#F$8fa8q*O2xP~!DZ=~jF9xauOVpc}rrvuY|=pPg2UR6lT-KT>(!aK9Ccelnr~ zLXR3UtW&4`*XJ3k5=j4FKM2H-PpbwvG@uwM_$2aXw0eZ$myf8c!twVRrWZ&b21R@# z*hmr+AIjyF#jZO;eYXmSd9XEBR`suC?4u;}{-^+MQDAO<^%!pCEK=ULdN&?ka8M;5 z`|*nbvZZPS6w?fB&6vA)Qrl>8M6mSi z-7|D2HD=-VN7T#!#9KC-%~*m zkUPntdw!`xbg)r}j|7l_BRaSAUO7NShxs~&T3)=egL?f0?a@mU4mZMRlzu0TqM%bJ ziSgJxW#_vpdGyc|qplaj?;^#kf7ShCWyZX^hhEgzm;KZ##pQ8b*7fOnZp zx(mIV*iYaFYCo1(mPMf~We1A>wMUJ_AFUb3S#v7pXzOP9;i5D9SW#ko9Zq{nak>Rz z(L}9FiZa)ud4EK*>CcPd`$_-N^UuiC{2dumTLd>_7RKncI;IyU)9$RMZ0V&-`)K1M zbMn#M5j8g!dNdbtWv7Rrm}%6JGZJiVn<;DZN7MUQ*%b4chimdf5Aj>H)D(w9n#+cCEGrG7gq5(5MQc0NbVC9327-?GpQ+}^^ zlxbByYMb%Ns^iUmB4!`W_g9T29Qj#!4^x93P9$A>CowIyF&Jcg`~c865*Sh+6^(a7 zLd(o8!(98LMLTBMHKU9SwU2g1*BS9>FRh($l)U8@Qu?iZ11k;dI>S*`ZZY|(7NN6sGqtK~RnCVMZN{U4a7PWx%_7pmn7C%mTpY9DMyT0y4D;q&!bLqbN(Ub+2c^U)#N zj*&vlc40(7G47RXELWgKOe3n%F_^DC)q)RdKF>Va87-8!A4!If1iV#GFDJ~Iu=QFY zG$Jg)_Cm=*Y(6E^doLIK&Y16lac~)HBVyLkU@oMW1|h!JJcfIA5Zp3O`2r8tUNDLs0_Bh89xpE+ zxPMH_B(NXy&9cWN#?hPRF;Fr6-LFJKK!}Htt~UU*RU(@|?MP^Xchbs1dgO*>qWtBa z(aiF)>2Tv7o018yehpkTMnWC3XUQ= zrA@m`{NJ?m=TUues{;KS_T&m6HMPy^>$dtg3cxjNfa_EgI=?VZQ z!S~I}W>Ia@Jec6UjU%i479JZ(;$xqw@UM6mpCkBtVbEq&h*9j`mCI{q6u|jb2EwL- z1_97!gS6^P`&W~u5Y*!`x@Y>SN>-q3<@$>k7({`8Z9RC!8>PamPLM}vxhTXHTgqb- z;hF5lTV57M9Z;wJj7(8Xsw`A1MUoDxdvtI|(^5HJ01p~^RHU>XRC%EU4G;@?cF)iR! zouNBeLUk-oddGixzpkK*FPHVUkEWW3`*FhsB~7>C*Etb6rVy>hoe{L>J)e>DOju&L z;N+fWLs`J_#Ru|-F4BcT!_l-h23oZ9r~3!U@Ma-j9`bq~lKzt>qUntLO&E~C*VM9m zOO{*7!NY)6U$I-pCAC}NGvZ<@I}zR$cA=kNq^zRT22F}IH~7&cqz{%!C|Akv2-{@8 z3hSruk!VfX4}loxV4ozYjs>Ic2>JK1?m(qik8to)tDw-!JC z2rBb1Hg4Nh-bU>+GFASgnZ5cbW0+9eIlv!Nti>UtjjNr)88n(yPNR{ew&vjzPt|N+ zBZ2J#Fv_woJ*=IP6dc$n{YtM_N1P;=dV}kY1R$)uIQWC(OAbsl1MMn zVrCIE$;3Y+_5Q?C;b6x)v8cit7l>2E!h~WKD@4J?{^5d=crzve;rG>#V3FlF62WGN zwtkYYO)Jv)OJ}i!yj*9{nhAXd7Cs5EeBP6d!8BBrr9=v)PVH@a?%gwZlL(LWAX$uH z{V4|(H{UJ4MtqMka{i_2(zDEb97ri z2eN`PAQ{N-iqxI+{38$-XN)1}rFOL1b8(TKs-XWx5ZB{pmpMh4 zP9({lT?`66FHwTL!c>|?oP0%ejf(tq_3_X5?Rai1Mvse`R2@8K!U$aYa`y06;TSEZ z&C4yvH^km&9J3>9FB1v(pVBnX-sVpCulwIQ(@&Btk{}cxE5|4KNm)<5O-bNY*EoUe~bv4NkG}GX;LHv z2IDW)SaH^DE(>H@XQ&n?)BlksEkWLHWEHi@P_Kiu2gWAR-$0Q($G@aR^J5hrmM+VJ z9(yJjgS})ODB5}QZ_`rO?~veRPd#iOK39APBMNpVnHw2SbZD9WM$sTeNQm^AbztXk z`19!{x_dD zySkap%RWRJtM=<_=AZc1WF&VRq#8cQbkqx z*(s~lwuP$#L$%uL1SN_m)TJ2Zn)fnvn#5(i+Up=f_CtK+u1cXbn7ko3uNuywJ8WcF z>&YGao&u@ZcP>kSY?QFbAq_}8_vvUm%^lT^6({@G$GV`fg|;UK>B^KUwws4z{=Nwc z8yK9#E3qb7@bpSo)?_2ED+aLmRu?p~?o3~_g7Py{$my`$(?wY$q|zv6aaJO- zGBU);OkoNr=WwGBbuPJ5g_AADGS2|A#PLsGsLN5t*9Ej7MP2*aJ~z0B%=QRyYpVkK zH#bEfY7Njo$5jyV2jh-HAwIdlbR?do;?p|x9xFa6H105q3CNsV>8-WMN{u1H*E=Tn zu9890Fcx1DS+N?&>{19gg;Rg$2fU@oUK>XnSc!O8@jb?hgRzWwR!3J>9CfVovM?5^ zFa<-(7Yr3$3mjoA@WtH8;DK${m?IuH$*6g zWKqB_F4ioX)Kd<+qjE=7gyKoyzg8|rz~Ss}I2&O9!=_t4F<-zG%5Z>D58=w-h=emUjOKX#_vfO#|uVQ z4HTTCPEVSFi1}h9Mjb$)iHg0hbn_DCw@Xkn=Xw;zc7K|T8fW^VpGv4qvT`%xzBZbz zO(1N19C<&cK>qmiKU^uj_iBVDj3A${;o-8a8}k{DWFQll?ETW+WoS?_}@v zdVTLki9uJ`Vou9Px_wR@s`jhVy_u04(y58gX)QWKfiH^{NDoO6%H}xlR7jy*|1NT- zS~L3a#zi^@BaY|KKC`*4Z9KbUUAeEhxo42@oNRj>x!-;1Z00m2M%5qj``W)&o+-z!S`T1>PY9KZE0%zYf zSE+IyGwTffFpjNd zpA-0Ds4w=|H;yDK%hEvrz`g&%JHDt$Pc}y?{8)#Nj(F0o z7<}34O|TQ$^X+2`%nSVdn};-@0;b$BOz&30B=!?@@j7LYn&2SMp2YJLHr6LA-dQ5% z>{Bq?&45;V*6;kIRevrC6CEM^upHiPp>b9Cc65J;xfcmac;NKofp4W)z*b~G#r>^o z7w_0Q;RSnu9t3>rEb@-q<_!6VgVB5mjoKAY0Y$)wk+pfs4f0zR8hXri5WK46e2O6O zCK&bz!IqQmK3dG&5F%yg;hpGk9Iuo<1ZxE+ z+e{0TOX$pw*l4$OB7vEPyTf@c`R>X3lUr4W%T`9N;&8+883QfXG;46wa_ig-Fn+tx zKvIVKxp0LgB`@pJ29r*r@diPkMvhZBtgNL!Rm&PfVu3r<-JPxZ(*iZSpJMn0HyhH9 zYeu}smxub-f10rvd~7xTe13K{=W1Twp?thXklo`DH+wNC{#UnV_u#>{~7@f7v!1H zI6D;jsHB>QH8i`#Z-s7^1tFb4gd{uEs7~icxs4<&c1TzI2*(fjS!F-|0d4BEzTf^T zcrXMUke_USW0d)QLF`s^8O7Z9Qgji#jB>b^uc(rYHt+hM63 zHXZq1cVE0t^V+q8PR&aa>zr8dX%@?2j=6@1Agn!Mrir7q<63d4oS^a(B3oohGKPgM zCW@k72rKjV8TwOoac0Laph|pxtM&VqXXJ&OHHU!*A9u^1jjz@6EUioZg!kn#><1&6 zGupXI&r<%P5oPBau+`Qs&FY9y%GcU;i$)(H|5C zp7pV47(vgE4@)Ymrj6+j22l_skS_umycowsWBYpWS^3&@l4H-{7OuW4O_XTqx}Z}| zj3LFG9R!0#Q=T0V17Qpy7K$E8R}T2OefD3W`PBI6W@G zyi?7zM5ro)<0cRuMSp|4pQa8@MjgGTU_#u0dNpL_jKP?b9^xEgz099Nd&9u_CRl4V zh~elu)hC2icR8Jcus>n`n9s?*uB~2%A>EW1BJ&QCx@9XRF&b84Rv}}JK|1O_$hnsl zTT*MdfGa@52706(L(CRZT2Af}^~#Ilp%vR9U0+l#oy9QQp67ijv?1+>^BrN77?Sl< z^Idvq@{JFvzg6H>Ezi|p0mF{6t5)}a@vZINI8Iu^-GjEe)pia`@7YMM^r?#NMi8Bc z1w;csaDh}&gA}KL9Adpxg8!4R8Q#no{#B0>6K*ND@3Ry>H+172_LFtibUkTnrM1_Q z(FJn);g4C~n?H7vp}N?i`Z>+69Tk+YS;?_R_vB+;XpsqO{^Iis6hu6vXc*!;(^?%Z z#H!n&1O06e=f&pd#ldAIT&2^O)y1L^!1p1IUVFw3h%Hno8{8TA84DPery-%WW+&z6 zkGQrvr@KWVDccy9t{}O8=$hn_Xh-Rq5=zmf_}ETIkx9-2U=#Wg^bRCW5l<<^eH868 z#RkwB`f-lEMDNCf8}X?jzw#ZnAdS4&tLvdU)bL65VW6Pxm{pUCmeqar3cDyLv^{=rk3N_Oz}%_m?YpC6^1@f;_xavbtK z%)DP#;2naG-U*%nL#oKaE91Vde0ecI)aX=YDxi(w`8SsU;A-X0CMyCB_@DXZ2Iemw z&;uC>`ufi03GL4`{YulK)-uxthNo5M$$oQ5Fc0~I0*9y|7{Iix{Sz5!YOBJ>?``Ul zV2sIiZRmE1PE*J50jjG#2EoRfyw1$HW6+<^uI6on%qBoXVAc|D)J)BLYFh?~{})M- z0!IcH0drzI$}v9+u}ndw4W0e>)f4`>+3G-V-vSs|QLA=Rfmz~{{dD9!zlxWJKiZA7 zjy8XTWyuIoswHgRozq0O+u9hIB2kipy6&1KtNa`KS_5~2XBUNrkx3zOYb=!4jFS|E z-_L0_Zph%D6tGd`|TOknl9$x5&(xwT_?F zjPOWulxZA~J0@o0!MipQqx&Z{drtd1;iHO{HWfUnO}6)pKrQ08!8gP1O-D4-+l8Af zn>$PN_I&JQ>q8KH%!?0nC#^8(l1WqxVUu%^k;YR(Wl0MuDVW!ECC(u+-}&9jh&1$N zcfXusM-$sz`D}55i?&ptTYwworMSL!Ze!`mcwV!=dSR{c;MBe4t?+@RlOpD+u@UZ9 zc^E#Flr_l}tkl*7acR8U5A~lzl?@qOGCu z1gj70ifuo2yLvmSU%|~|ExwsCMO<1(>(E=VYaaN0%!(I2CsR0?Ny+^!r@@4tt6mu%Lk%4r*91%n8?%f_5frD^7?Kt|sI*DzSfd1#>h znvq+XLKXnTB3@mgpUm$*%V{nCln7rAqh{kecCHYYS^_p3ub5ss#Zc?R? z@V2@@&kDYkh!})huxU!tCP^b`-uR^>hPrGM7sFS*x#JK%Fxo7oIB!aN@-i#+EQp=} zdLj0L;4-q76i=ZcNc`^7^#i2p(tsS{J{SULngRZ^BRJ{Z2G#;YVI$|>`3s*sDF#fs zKY{K6gnBsMtgw=kXj(};!2AKi+5$7qK-iTjz)Ta*TNgdvz41{_T(9dSdVX`E!{JVkpnGuK-d$3 z?a#Tcb>sb%&bNS}d>?Rx6f{89yc^Zl zCji<`GwV-ybP|$}z-x#5*RU100~aA%Krh z5ZE{$vT$3j1i<3{IC0_9QFa0N-kfw>8nHKRqIau(oV?y-oDD#=K6{#iu6NhcxO}_p zDu3W53v}Nmfa%xA&rG+TfTwMeSrd4tQfyg#O3v3WJ4ScDHm5todfP7=5fG6_xQYoDZxXImtHv`QJ+d}jKkGH|{5L<7_?w>%avi_ER}STEW0V&zaMouUJ^pt8MJfh*Av9#7C5%dE z*?!E-dx^14-M$%Kkq?GWaap{i{4ENbELOotevnU#w7oXn+FEJmqbFhUwheznFS;73 zfFo2lkO#Clp?bryyC6kk8LUo3>M8gn!&Usr-D_8e?)m}v0$z^(ZK=xscv#EnnvDKa zSF+8B7r?wS#*t0U24Tx+S+puGrF&_CCOLab zvjX}2n$KC@qjTUu$UTkFoB_V=`~SH52KPGDqyJNSpZQDlE z?AW$%F~q^q)`Y-~_Yw2E~+GYbl=T z*qcYSm5=dENJy)&j-2SvPJaVG%eB4%N>egS%X~{+QV}uG;e|}ALOmu;hRuD4zgOOz zMp8YsEnz82-G^lsQ5usBG&*b|{!r_4Z>OAPqa{c>;+5b1Wo^l3M@@7d_#u z;G#&&g1be)lLCQKeHXXhsqjgfQ#idxYC+qJ7wrHc#S}7hKO9ZxP9DGUUHXK-!#FkB zDIjjB8pcKo^aydtr}_$I$N-}sXMuj)x=cj&14-j}3koisabwd3taXkmm&^AFCwJ|j zwAHuuh)S8tjWnf>hEO|t?dxH~`<97>kgzldcYWOaklkluB}yw&_w~mK1Fy!q8Xosi zS{rAWr>-XUTQv0roujB@i#2{8s3P~;u;EJ{#ON^C`vJY!FimyINk%i^1_MN~@~AEh z2}-vsX=(N7sjO}K9gMJXEtb$$o3O4k!T=0&r_Y-@ZEim7Ab($84BC=ri|d_0e=>o0C>VAy zfoCS+imcyZj+5N)ILqYNmhP-ae#t+-Dr^ey!#`k@_a5I`@iVGnHYdkhn@S{IOS^PK z1%H=1oXG6?EKo%iD-9*3pB zuiDTjWUjoq(5Kx2j&1Qiw{AVsv{XhC0?<;vc_SVLPcu<#F$)QkRNXbFt0M~G>nwvr zJxm_!7KW|djlb_k+vu*dFaWJmfW=xdZ1TBnr5L;#(c({**BVM3#;LS+yOFRH$Djy2 zZ6We9!k7AoZc}yvYj~X>Ar1=Ixbw15m{+VoWSj^!IS314C>s``i3R_)HFl`YNxg-Q ze7X3QLhSB0GFY;8dZ3j3uCV9DNKcfneHhVY-TV#Kt{9dF%MVhj_ubVJAmjC&Wq;;# zkJmaS;X`2!oqo-xE^8m*HAHCx(%uqq^Nt@JjR~95rP2Ls@A)KqKae>7iNmXTzO6_d zlbW!?ZO!*3c>q&kj+p9WXUy=JLI!^DW+PVZiJjdhH2 z$L(#HgtG?NVm}oKv3Acj+`^+CMQc|bcg#LdT7(n}d{ph^S1BWgvK?&Lb7`o`Q=Vzl zU)39|TId^u6pLjOSlOIy^NDTIK()m8#p9NsyzZ{L8$KK^sL6_%@(1w|zeY-EcDU)z zO4?SK!Zz1f&jVikhEp2oMVC&o<$|Xfn77`|&m+>7M0Ej5_Itym9G1&ehZm zkn*6;_hOoSI3SRqUMkE1Dd?xAv*E-aoA0GhbtHB}TAWu*v{J3b@$*j9${Fa;NZnP{R`V1;EQLf@3?Oeu=45S}5vmv6ubODm++OH`OKf zS{)Rd)&iZH8mhVq(LA2;sBhkcr6P;wo5l2W(86qmg!NC}tn~u(7mz9Cf92Z8r@ai1 zzITOqCuXdMfIp4oLD1%z-)d2kN>MsJPc z8$!fP`amHJOkZE*kQX!^m9x1z(oB(agpit4m+6gqn8vbM>00(XacMC!ex8tL7|3s~ zFzM7T`tIvrB{39O^Kl@yeG+S2VdkkWMQ3$?KuK|QyZ4`VKF_g-F%9>%%)tqO744UF z*5wApVL0z;+90%o3l$HBkje5%>tFtxqz}4g%eSgpaf1Q+91V_D4j{iQMVU!VrrLK}P zUmA?~X#Y}klJIZW4f9_;gdW@=%hRz0Usl~TqNMsqMXuhktfRK(W(%{#BXYy!tc3t8 z2D)L@T7D3)f#HKRl!)e0+@5|quKcioQ({91ZVGiY0t=CbLCYmG=1t0eoZVCt4w$DH zZ7umFXnjU*s+y=B)B0Jp%?2iPn63m(@YpQ6Z7*b*~uBGhXg zbKK|<+atfMNC~-G9;9RB&}ORHNb)q#i(% zA-`-aP{ z^Iv3uc<{Ba!8lU_2q*FkMX$O(C;J|yKP`kBD!Lfc5RzC}E%j>gp8;Prw9QP*c$iDn z>gJemyD7@1TV0(TzH^p=F&h;BTi%b@mLP+j}A0;-Rp88D8+?(~S%XU#F zb>Y%%(((93-kIKW3Jb86JO~lK%PyPZdCR+dO1Z+4xuq~p&!^8RHjYUtxE%}sgbcDc z;#uY~5oqz_Gx(CN2iPykfnL*V@f?9zs-jA&yf6oq4y$ODl5$3T>R%hwkLc^((or7d zX7{g6x=AgtK!jH1zpNh=>o}QTjoQxd5`$`XlWaP#g#?NWM+uj8L&e+Sk9sKGr*Csl(S9g?I5K*C8rZ@D`lH{4vdiknM0} z7Q);NqU$?II@!Juk|xO0)|*Zaks8f|_|py-`&RWA6=+DYs!m!3;Jq+M1<- zagz_3dMwn`FGU(YVQ@sSJLz^e`_8#&*#CAV`0bS2;mgwnFBm*ZjmajRy`45XRjz-= zZd&@p6dJbpAP{?rucaz^FjI=ORXiHnRPX>l3w#g17lc;o&Ml!L1np7#Rtqd;F3FKnC$*76G?SSv7wfVCjOk(KW*kEOMUe9zbIU!9u`}28 z`U|HmhN?a@yy`HFw|~~5{Be`3S&X!)@k(e?DdqWL4Q#3%+8kRkDC46Xq+|_B1saZ@ z+P#H+GRLD7p?s&*zp+(E_Kx{ju36H-r;{PRvZz(0%mawwrPd%N3yzYCT#?yr>b!ht zSQzk)^X~K-#=Jf==*zo$*3X)CLFYS<)dOnwLPlv?0A~U2z+W|%RYz>~Sjnb84 z8T!5zn@(kC9XxqJY0jXecL=X9dd{U_(9pK#V{lmbWgEV}keOBG$M{A7f|-$OsS+(< zeDGM-CD0X!bHkJRVYo~RmfHF+2P$${_>#`fk)4G{{jOvy<2jIJw;*ma`_@A2x~mZw zhRAM?${rmCJ@N9EJUJ-zVXcxGg0LED2S5Iav~}_PRN`I(<_}ZP!I)-n(xUkAHAJRs z_ysQ2jlRK*=JILCWU$-g;h%4R-2>j=n;9HJbQCSXP0J!72Mvj!H}4>^Y+hrio77DR zQlI;CCQ}xXoTP~>Wlw8IwxHeX+@X5tbiiSlTw#=r0NPy&RV#+F=apUbp|CEDM_j)7 zFr{lhrWcSC?F-TU`R~cncY{fxVSe9ldpR0qRU7snjccp3cQN@$oxNPyLZvD^f<$>p z-?%f!$qO$cTw9i${k@nosaKItm-!ZeI#VgfPh%F|3g=(x$;=N(jwcU(#vNZ5)A5{X z+J`7Xic6ia8#Lc;$STF8_r%&Kdv5vDDN%JFE(42wEI*5^A;HNq=1Pq>#0LG;HH7hO zb(DdD`{s)?Yl$QKidOy@G4%od&q)G-?Hq??eFSf%;Il+aB+{3BY-lNSnZLXMZRgq! z`mo;#;B-WKv58rPKd0c%K`*S5E`K2V_}UFmxrH&qZKfs*;Y@eIEOO;&snkL zQu1D;nlq<3yi#u}qZFW-Cp$=&&-;F~-oJuMdT~mK|!xziVAgi(WQ-ux-TiIasgqk~_i}!V4c&*yW zZS!EC6zsWMbG+A0=)U~CEb21EPD1=U(5-ee&IL~}Ca~%aj30sIF1)VxX?ez-8n-R^ z!)|G~R18i9D5mkkm@u2qYb(dj!3=gu7d@Fp2-eCMDwMOyqLre(_q;Z8WjL z*kbRE>_>uz`08hK;Q%X2gM5@%-sMp_w!sFwbk}f;WQZ@Wj33B%)ofm<^hoC+tT2a0WhrRAxh>)aajsH5=Rb z3(r-TdW#OSBNv0lqX(~}QJ2Z90=QV2v(Ax)Qv(n6h@7O$hQr~rkP$bM$;u>PdxC=> z*!_E8H;O5!q_#97o5qMm8@r|mMT}Rhy96wh(5%Ch z5=#|#>z^A7PfrMeK5>5oGx}<4@#4J)sIUq8K)I`}wI|9)F%Wzl;y+)RKN8yCmQD)q zH21-y!fuH+XF*D_4FpPR{Yl2@)y^;t-m4um_^#?FB5EN}3Cie;K|v)*mIPIid3N_O z$~4lP95-DTpM$oc;DMd|;=%Ff2JrRgumHkH+W6b`@j;Z~9f~*GFDs1e_|!jt4wPyR zI?-@aV`mL^8pD1IRptg?M|a!%mc6gN1&@U1&Nu%O=nt?vjZ2U z69^3$8u%D7X+(V|Kv{gJ4y-XTj)bK;cuX9ZoO<%q#|j7f_%&2B zg=|$or`hH`R+fy`Syr+x>zA?H8L$W>Li9&0m67wB$S5dalvE5yZ>HWT);DeExGYq_ ztjHC%ztH30c*n`jHfi}ixYRMpooF!vQFAIf%uCCExIQ5revtwSZ^e`eM{(OAPxJvR zBen>1?{iTU3R{Up!EJf~3k9oS$fN-Cwq>&s*J;SSF^rfrU>(B_|N2S*)@#nY-|gm;OZ;0H%g+uz-q0G?jr5*Ssi zp#yhFGtV|l(b;^au~3TZIkZ5ijK13U?mr3^9lajJD-le5=*M^e1!}Vqg+|b~%DaHS z?$`dWc?|piVrG)LZ9>cWTclJAU_vkRo%(hli<48t#||Dc)70U}fH&1xX}W>LiyMGf z%m5Zebm$p7(-uz z(wBmhPk3V5)_ym;vgQZEJv(6(>NYvZfGI&z_{&y~*Wz|VPu@IS@5(sidf)>BeSgYU zOUw`;5g}1X#L#%R2{UdEZghF}o@>?b?k3zYQRv|)t+W6%Pte~i6{aIyrR`BAUcJLf z&2Cl@whlf=P9=kWW$kF9+{nIO5`MG9mnEf`3~E2Ha0nWsxbRoqhB8kSvDVf){UrUK z+0>N?(ePEQN2jo;uY)?*-sfo9U>KmW)UhzB2KNdJw z@_#AO!ib*NoH~D0&)esc)aOTM4LR%2V@O4`iN+w}spH6K-z;{UOyV8uYv1^yb(t4( z%cX}jV2{gp`cczkYXiegE|AorqeSL3xJR$c&zu`NZ~&|n z!9y)9)cgbsOVi3JE%RJ6wyos?X8ZeuDkg^@9c?3T49p*ES1|y}R=3bot%lOCz1aAw z50_-A9V$F~Di=HN1&^^zP86H)5hUo;H=R=yBOkg`$@AbCh&}It9n$Zp-LQguo>`xy zDBrB06)>rCjoRP%8 zV&Y3OMjnA6tXcHBLRP$5q_26+O=(l%Z&KT~7m8FU>8@y@n^Pav6xcl!Rws;;kGT<6 zq2zqrQ9`vkjYd3EAVD*^OJr(7W8 z)-BY)^p?WFQWQ#@sUtBHwxEWBAdwU_emC@5%cI#OIjS)ZKgk2Ld8*?jS2SadRudg)|aEr!Iut0w;Zhg0bRhr^)-VksM*LKNr*Y zx5}dKI~HTj_&UrxP~clPzVEsb;$Lo7d$kq_5KrEk23bm7;j;Cs6a?1g+!1=YX9*6a zKDQjB^cP{+HlZ2G!cM`KDcmUcNm7d{FJwNoKc+^_46kvba>v@lgciz)$m1LVMq?)6 zwT&LRA4AjO`$y^`{Np7zc{Gf~ipj=++EpqlR!C1*Sz?SQUCqxkAJ9Ywm23$plbuYl z6MK8)Iet+CmCE#t9OvS4H@hVcAb6$4PCqQcNa)aC zzj#}hLH?7jeR^~ITUvwF!E*zRO&0DY%uPBE+$8wLT+DbF|D16Upo{2h|IT9+mHH=v z7PosYr1F$tP2spl!o7Ca?6;By&AB_;l>{gbq<@DZ6mj3K8T~ws6m-^&Ca|{iQ9Nvx z6a>2}wnP3l%NZj*$7MSwxX`^2Cl$h&hP2H%ME%Y=+{K-fllHv^^1Q643{E_w&w25H zPuwKA$T7&b$Z+c8%F4bF{q+dL==0Y^y_P79?|`Q2H?Oo)7hsm-JQ3x3?*$c)MLeI0 z)M1M&lH+jW4V&iUr^2opgYWLYvh9^yWaTTun-8OJCpk$e#(Pb&CFHN<&}vitF+J(F zefbZ3B&B1SI>A}Dp5C&|mp|bmQ%4Tflhl@IEyJ7Qp%VPPMPcbv4<7`{XqRK0P=T58 z)*tpKr%RsY^^h&7{FDmm&+)tXV74v3(UY9eDkzwy!7Q{-4~kU6P5^Sx-fi+Ur2|q3 z%wYSfV5g&@AMFb-=*z0FqTdZ_*(5t3zL+NXs~$P9MFS7NQNPL*Y=8V+eepc2 zibkfNvd#Ryt2X~&LA_O8_%?55>l!y=J;Fcpu^$d9>tkDJI#yz`tDVdU-|y9Q3A`za z<@W+9BN*bTrSVG1R<`%XVw;H73)1kDV|z3kfeV1$8c_@l7<)$q{0y&)=M@glxQP7T zelP$(p1JKgtuUl>Tw>6 zv21Sq6SMHW)3d!~it3Q+G4_Qv}C6p0kY~` z$xz%mQ6R!IQ9-~$cN5g8j_(&&+9P>WM^KaA>uVFf3De<=>==ZNaDG|Nu+SW*dt3u% z-ZzrBoy$J5NpOTBkD4VECK($epRs@@f2I1zFqV021Z?{t{cqFU$GnG3KgBiH*V(Vt zEkQt^z;zl<3y3(-RV{1KzqXvhf8TcOZiPg*1xzU4p&Pi33C2FFSm?7PdwRp^Kt8WV zYzXF@!%o%>G%RD{*X_;klh6jguEk+~PDZezHa7wnfkRt*Hiva6OIQd{&KqzoSZyhe z=4TFJsnCt+Ltd!2JHp>bEh<#9Ly#4@UGA29oS_Ff(TQ15w!fn$vsMgE6MO5AF>1I9 zo#DlM2jSMN<9=59z)cm|omju@3MDO)i*ia`PJXp#yMr^fe2Aa+1Uu_=QN3A7j1X}F zQh5XZ#$Z0%dT)M>)xSg7myvte-Z-!k1NpZXR*VOs(LNvZgH#}75;eetptP&X0)&oX zZc#K-p`>7Gt?@AMK+9REMvqex!-M1IW|us9ie!d9Bnfw7%Y;zwUy~VPPwo(URJftm_8fY;wTIPlk{! z;iu2dd|TIfwHY)06LZ+-fH z(7zCShZo>$3rv0|s=FzGh1xHyDuwNkHdPf*D6$RP$##W!)}M(q)%DYa>6g}Q|7>j; z`%PfD*XrnWr#KwLwBygb4ok>)2W0AH3zLxPd!Hd%$a4!Sqysd}=Wv!qeN1LERT{ z1T}+fn1ER$+5et39sag!GB6WNAx3HB+r?fzLs65FRsR|euIJSj9Mg)-mR7r-fPe^_ zQ?X|*Y;WsYj^4zW`S_6qB02dk);t_5*cmfwDL|W1xAFC`=)*O-kYWlI#q4^8xCsaO zTAQKDQ?zt&GcuGd^Y?wj_Ld@pZ_U~k?ZM_Gj$gP&eEp*;6aij**^H0m#4{c{%V+c8 zmCNYw85i;Ma3f5oV{l@@Uk{oQ1+MM0{jlXun%|thhJ?oaV#Ll$mAC}I*+)n%!lDC3 zFZWz{AW?fHtyiE8^8=-NfdxbFZebid8;c@dGvW_c!32#^vCe)2w&(A47o-FB9!oxK zdx6`pdZnH+do)c~w)^bah?k%MUA@=+s0Mbj5%M=z!)D!BEK4%&<4YO8?l`)4;+vyW zZG`sC>Tr7CfW;w{pCQ*azPBsOSw=|&0Hl<|fL z2+FN7t}`uBS?K1c6U-TAIQ2KjszoKnjA>WY_<_62p%caCDiw>m9Vh(DjFZzun=FWH zk12g(xNURTh~Hk%YqgG6#bdG06q;%ICeDbvi`_l>LO_1Eiz{6=!GS}%q+$lP9VuTl zxla{1>Fz(`ByB9rv+mrN!-cPIstye~`H~1!Mr)(%ThZAnW3t37t+jE95K(;Jm~w0fX}vsE z{^DSUXXv(A)Chq}6Jq+26Znfq)8>&64`Ma5KY8)v6IQK{2&{sm`>*GxV)LJKUY0e; zDurt|3Soqb*1D=Mo8k-apTeJ>syc?1mkn}qbY%hdYY0c`uW7O)wr!#8*wOt9JU z?DxF&Bm*_#vMiXG8G1?{z7F*eyYF{;|7K*Ue=&eRW_0WJx`*@y@rx=-4ZFNsla z{nzIgZXTcCC9$;}f%3|SUwymsE*CB9y=d?zK0tNF-jU@F<*!zbj=Dp=dAVpZkgIHt z{mQa1acQAt3V3syMJ5xA*qVL$!=^~Q1eKN~ppx>agqk4w7TK*6htqso z`$Mz|wj~7m7uCa3m19XuX~;*2DtQ+t?sX1L=;SKd(ToXNj5p2LHQb~yS7d?|`QDV^ zeC@uHo*jB8KlpN84VUsJP-4!V!~uG##_R;`jNk`LX^(u68*<6=2UX*5hP=tNcEYk5 z;w_GA@7Z5M>sBMBMaM0OLlJ6M)N{def7G33)^=O8Ok?I{hbKX+F#eZB9Sm~gs((HC z?|gr+HT&E1X=U^G^h<(-LjkS%@UQpeTb_vgw@&%zspXbJWjaO+Y;LOlnQ z^AV`B{IxXZ|iAFRP-C}XZsU7-Za8h!uv7M83CW3I>cHKC) zA9OAFg$HYxYx~_i zdMvpR9B&HQ#E<>S5vZNv6o3`6&z?axgg&1q2_?R;gkPyLygYmpit~O@4O3fiiWC2= zX)4dJb8VsjDKBKOIC-WR(sb=zVP8bu?p7yW73 zAus(#Wi0l)Sc)vNtCcZpq^qJutQ2r=FR$n7pNvQ9}CxcbdjS?$>^36+(*2m_7x zg~J#(o+Ip;;31qKR}4G0HDKNKCjusVA}RA$+v(ygBpoXC>to}J*sxOePfA~-Sj_nW z1+}Wc!q~MwI6uRMM@bv_J|5b~^!{chiK+PkCEHi-grDca-mbzU%#|F_!zs2%v8Gs& z_%ZpWttPOeX}|g7=*X2kmQDP*CCMCTXfCPg2lJoZx|(n7e5JSD^iD;3;o-xz!$pV} z01(XPn&G}E3orjlv;qF@J)`TMUQPKEJ4!4(i2uM!+Mks%rzCaPC?8jcS-xLDQhgBp zt=kIvx=yK~9Dny)dj=2VT*S) zqk+;L)CZSE{AaTovZD4yU{XUU%-PMa!+N3~j0P{)tDxb8RrVRe1yHzJO9$WjEK@Ai zASTA5@ZnCh!=MeGX|0UsQ-JNP`3`(HFg@XD3gO#|@0^I{%#fgtxgqrSp=@+|AlC;h zCl-DUw75uuv1QhhwwxHS9_9H}sE0X?RI~}Q91}Z`VLiQd!JhJaf)65vlniapiMoz@ z2#M~Lqyiq-1bf?@Nt=mt#}CH>+=l`pu>v!x_I?xn?88NKf~xybz}c@IzQ+Mbny6Bk0>LQz;2XZji_zro{^bHQ1@ zUIg0go3E15eIq_$UuKUk_1G9#TW?l2jyFpJT=A~I+{KpbtyG5q8*h(5zKl7BRj&_#Rg$W;7cwetz|)9gOa+4@*#s7 zhE&J8g=R43s%b~c=ncKR$lNj7O4H`1OXXwWuW4^Lv1}w~^G)`(>eVW6v^G4}Q-jrV z3B5Uq1)PPO6v^^KT!_W;`#&r4KdVMc9?Y^^!7pI3gH}i5et>Qq7uus3xkPzX=1355 z7^{3e`Qj|A`23||lXBU(MWvA~7sf$rPWV_I62~Jz3nw>~!eEAzCg7_$=U8zkO=sJN zYPpIDJcrW#q571CX8)m)JOB&S51}*H;(KwRWId7ZC| zQ_&u+Wmq}94EdjSk5!buNmx-9WSOF2OCR+x$-Td2u&uA|QKbNL&P4Gs4NuV?o{Snx zktNpAUpL-|e^$Re+#;R&fOxWBvlRn!_gP&NN%X}p^arCq3&cWR)+_T`cP;ZF2NzYu4O{&5S1`+t85rKGQJy-6VtLZ;tgKnl2l)ok0z#+(R+~gP{&1hDy1d5U&)m2Gk_4F=X zzdXD7T1)maDz2bbCVEcIV&9g7{Ua;_eBySw$;BuG_{b&H(Uh}`4lP@(1AX34IGC#7 zs2B(Z_kAT|q-oc*2lFPI+?v2V{>KS9#H*mCllBk4lTk<~i58SWr=8!T5S5j{thaCg zHoO67!Nl#H)7$R!kCN!!C)dl#qqpy81DAES1&-T@}Yf}G^sR69?hi} ztBe&5!)$09SPVyj$2aVbDn>9O0ockyx!prp2yrs)CoCzCq@a+=;e4Z|J7mHf1)(W} z>ob3d%!+Lzpkr(z3n=S+5NMM97gP3!_`4w6h2?YlcwV<*-<$&M+rqo_bPV9BDd+{q zaCX-bbq=FaVPXdr&w z>gQ!+69%x1tt=4Lq~JM!*zQ7HHe)fnNO_RdL=PPS9$q`>N{om_NSK_{uVyP|AWSxxqo>9s(q>2bh%*-8xL>D zi7y#yx0XgMKlQ|XFr+LlL+(zC^p&O#lOSp#CpJcEwMUW{cE&KVHW9)y6YvH0{z9b^ zh2Wf=l9kdd9P*id=(;b5di~jVle--)(0UAGI-lJL31MyrYf4;#0c#`+L$kJw^l#G{ z;a}B(XA>NJl23xuLib3}?$74_m|hz}M76@a|Of%o6+dM5P=(d#tj!DVr)^UR3efF~5Gk+HmbNoL#=) z%*g=`6!LL|N4*vzI5q1iRLD##xjD84%UDWsfPXY+`gWXmY@h8*8A*))rmt)ldfk%j zocD02i6trbru~LyeJEyomMc2vZT2sOKF05EGk6jnQp^89(c@tqr2; z7sFGDLIMvfwR>{LPbMqMfYvzUMmAq^HP` z!{rB@uij->eJ3R%ioy5 zY+9nkT5vM&{p&cfyQVJmVEg;6p2xlM)lV2!gq1C_#7w~y+CTw3L(21LEKmLGow5=c zw8RcuH@E_DpxEG|=Se|l`QjmJej?;q8)Loitp{>ixnZKZPZy@x6rgqYaAT(-M1)?Hyg-|udebu$ z^-mVa=Gl93sNBcI>5vDzxP|r}=KIr2i}u%NhU**1>`IbEs=&mJBhmhh%Be(x2N_5N zesQe`WWTNu3XbqKB|-RgqMfRnKGn@1A;9Aw0EsnT`ew~VrDH>?@8ZVGfb79Hs7(~P zy+byM$J><>O_+kZ$66c=pbHXyNkz(NOF8bncnk8M=)+kcT>c;}cvm6w!yPenY!dI< zrjV?s%=p*?S}OFq&{!C*ceX@D>GV((O?U7)t+vfA?sIUnxS+ zR5H4+&+R{{8tyyKU*s7*crz8kyS6!D+tW3Z)U@;A*ExD~xo7k#e-?CyQX{^(+!xLX zLXri*S#$&{W*24X?uwY~!AkugSeF zUvLdEPhY!lyG$jY3+U=JYrtJCKqhVmPFV(>5gvB4AiM74y)A76Bn^Mv1mk95A!1{ zs_4s@ae0@Z;Qcg=00EAY%y@7n*(1BTeyG%?MLHDKDakvD8!g=;9Iy;NP5e z+Kt1j%0F{2mqXM)E46gO$$@Cf^YTZ{yN8@?=+R+ZLW?NtI{|+3qi28Px_#S6Bj@pr_tb{Qx|4=HBwG5IqY% z)OW>+UWF!Rm(eNr4p9CMHHi-5hWq9Vt{2cVO}S*AcXKt7aAn97QS@nuuP!wuFsa=D zh(Rw>8^kWp<=1M|u(mT%(mAAxv(oyKrR5<|;>ou;@&$+=jmrX@Ciy1&!4@hl+uac~ zOD`S~;$U-25MfBfEo(7>{~&x%D;0^H%Ld9UP<1)EL)`yv4}!=RqpE;CN?HQcWT6Wj zCTCM)Oe2W$lJ;jF`JP#sX^X18x7XEZhCz}$(yNmj@a6`mTWI_EObTQ#l}k?@oW$?i zN(i{38UT2T4T?6!+h+HLB=NubUB}zvJv_-nk(`Ts5FL}rvg(h1c4=&whR?&2f!JiU zym+e{SAaQK^!=?QYp~*zOPeT@$K#{-!XHV4i$?pHXpCN5@LAb-jq++(t7F_Np{oh*?Ib+jzEwVgq3ceFmRn^Qk-+S*;-|-q( zHud*a4|)miE|9QrLPoS}lT*Y_yfFv=8gpuTb>l42|%%8IOnCu=f z@e+jp7*;#EhC)7(rgGtH_k;0w>rNE&$6OlD52Ah%YtP-T!zIc=e?EWB@B5BXbkLSh zYI5e*WPHYCelDpXL|XQNMe$<@fjyv4!5;#EFAeVbi1Y|hR}wIOVyRQ22aq1)XjBBc zP5`Rt2rYh(=$z)!oP^hiS15k3Bp|E5&)YyzIv;iW3=F_o^jw#((D%xmcaJrb9N@(P z`aUE?@Wl}I#I$UjHh3&a&x*fPpiz7$EL+4Cxcy4QA-6sqVx*)Z+AXt#;%Z`^BC?lV zM$YV|8^b<$9OrtYlt4%wW;{t{2?+y|Nc}f*ar}i`#;xyJqUxV_v6A2TJ;kdDtxe89yRSC3wwd5PYRD8oV!ZCL1dIhEL$9#Tz!#fUjrioh# z7azqoCd3u1YhTcgJ?$nTqUAFEn7V7EBrnjxOow)wt;5PQg27!)%_>6-6MDOQ&Kz*w zrK^w&rVCEF(YD3J76>gwhwo0F()5E0t*N$m{u#Ix-DPe%MKLanUS<4)YRHL^aI0nZ z@Ra;kWg1Fm`Nu29>VCWg@Rj(z!%z?Q%NBkEP9LS8BEhV1i(pTc66VE z#rB$7^3emIysjK1D4;e`Sk* zy5X@7Kbp#@!>G2SGK6LHi>tAKL>j^6p3Z)=Q#1MFTbE+(jbMBP{beY62hG7)vIkR+ z0}f@|2G9$rJKzW_xij3Nu1}H1hR7xs?RPtby@8zcq9I59kR!Uev?vfUzBB~yK+Y=D^N zL3}%fPI|E3H2}Kcbqe-93Ycd>BkG=$AVGMrqC*K35{i-h^kmWd_Q@VK4$O~=N3eG@ zU?{JWw`PjSwb(MRf7JThGcco3B$n{*!}wCRjQI;2D_6k8_Yue zE&sC>CsrIkbPo$L@q&M>*gZ3Ejg2~e&CLTQPY{M+bTQs2U(FNJ{a5)|K~uS)>}}JG zVrf#8FkdMedDmrJJ%qjtE(mQK3LQkj67O>v`G6@L%LgOO4W*Edh4dmGkou9`i4*HAI`u!t(T7f z73V^+heL6QsU_Rg$ZSb}=(5^D=(<1}#>@XBb)*;HV;M{YtHfsJ-MnyB(CeLR2oL;P zfY172x^X<$m*ypK>0wI%fXFSwI577Fu{ zv|WSc$OZc<#R^6z1oP*|&6GBSVfh8nxB1qL#jGEy)3C^rs`)Z@GscUYT|Engov|W` zg2^{68gLml2fc>UP4fn$1i6E^{AHpJvEqy(Y*IdiP=_MoojYEJ`x-UsG$v(;a89GQ zmBp!tRA1)4o@V*w$J{crMNFdV@C{ca_QFtU{tWJJ;!v>wL{i3#^JalUm^YJ{a;GK|I7kp-cW&9CZvb-I%m!T z#@!%(tE`QMN?)J;oIR{U%8vy={QIxe=TS9%rLXo9F@nK-?N+gO@WN>|67DI|5Q$K| zhd*|3j;kcxg&M4plj9rUqcqsauI>(c-8Jujg*%Wxf^QOYyFzL9-nRYbcJ4I}yQCI3 zbxD)+;+HHB&Zy=rAle#{YZJ-E*8A+kMi{GgPp5yNqK|$=o|gWRRm%S$VB#{;!_e;c z=3vUZ&+CU;k4&5&VVM6kpiijU|0jzWroUj_Zt6kn)G_BCP&23K?6X4!9#c$3z7qDv z$G;FSnR7tEjCRlPP5x>LgkFW4Y=llt%3#WeA}k6JjwP9>k#a!AC9`5zGYQip-SvdX zd7cJ^2{9d+I-&bWPkiw6m+h*}j5Y|w@aAw?_`PVMO$vXeEENg$A}%t_h$lLybH83d zs)X|);Yk|FOiev#A{rx+WPp_PXC3)sav91RsHV9G5Z^!P7!69O_Bawm7Qna9V3y-|@2>o->_JZ;kTR`6-vWm9?7rZ~UT2sprp2uWUpuNY%*mu>9NjW;T z`YgA%C-M0eMzN3OTh@>it-g}tIK0+6;{|w(8Ig0dfdA+Y z6i$b5*D&xxL&%jt0vyN~=jOMt=Hg{T>^POwn|nE*6jr!4hj2$IEU!GjW5C`I?T5ku z*6(9F|BtM<3~NJOx`u-kx8N=bS}0Nq#a)V9i@RH~;O+#sA}vlSQrumOTPW^Ow73<5 z^YNU0_I~%dzF(2Q>zaGknprb*$)CAL-N9so7^P+Bhg?1`25TQB>K?U=7{?4vaTp@d zK}z7du(klC5Sg&B-Zl~Ap7RMVdTY7KwOmEs-v6``9VXuQ*KHD8lU?CiGgVZle1A(# zhC2evD+j-`08o3p`+&U8;4hdXr*qQ&*xhUYGn?q99Z@ew1385Xs6)1yHo=3HxFF_$ zdOtb%@4jc>Mo#bFjt+5Gd?S7l+R;rad$nKZ{6sX$k!soFMxJ(7 zC+Gov@oPD`=SLZKGk3*CTob@Oy4YXE^>f)Rfb#`}_}xL)2wAIR+|Oujuf86?f9l`P zozoa_t4NFd)ZbjKH?LRJB%?>6BV%=9=(cc^o>ZW^hiG6AQnnT#GHeucE(TLSp1LL( zA&Q(RKsR3>oC8_c(yEeEWa!~0f;pc{NR7X1upzg>r++xcoYPt#NQDtsr9aA2dbP~@ zQD9m5;ASO+>6+J}d3fK3I(!snS{JOX2$MAY0X{RM~+g z;^5(Dh*awe*46J^V>TZ!sA<}sTf6p?NA4&Lq%3N@nPiD2$s4f8LZlS1f8B+0##CS%Y>Ha{U&UwlioGH z!QhuP=b&p7{D%7>aza-LLn6i1tXbPOXk2;}nSh3L-jeCJ3FGeNT3|^`{aB0F-l5A%4ZPhm~?;r7G(Etp|m5>Fr9UnSYXGca=roNtvsUUN+eO?Cj z>~<=hmbtH)YlDMc7+$`joen(}0Vt&{MO*`o(t)*ZFjgO=J*?dO6F*VC2w}4-(;d$_ zuKcKHmy2i}URw70dYrle;iCB1j=^QKt1O$ukQhcX;|Nl^M@9A81hK0Oh4%;Et;?Cr zXo}XXUfuGKxw0&Zz;KvR082EbQjPME9U3M~6;-e@T?YE=3w#jf(;py8`PA&2q2PyR z9hyAqH?XL>uitrgYY&l-bF8`)^XLmu+|L=hPNvGcd%%YqpqL>GcVKc&KVaK_M_y5? ze1(Wh*Q;QJXb_QKLEEm;D}~1hN_dEOk4$6?Iy<3W0T5_jLNt{nMm_Nazy9{2qz*N~ z#L>JFCy4qzbaq4O+bdvYG=+AhX8@GhteqL-G~58m0TMznzVK~TAQ630>_wFL{VbS08adW^6=wsccGTMP@W7tIwpWZl2 z93~aWyeX;0m(~vJ=lBIHa6jTUzilCu`d-*djn|$ zwI!dWbzF(XMO!{s)t7#ExjwN1cU_;{U?g0J-S0M8d&!PY?!H>uhnfjQ%5y)AE_pxi#xXlAIGvJlSC0I4-j@88i_LH^GmO616i;G?oE)1;r$Bo0YAZC4p5p0t9dF4R(zLCURWs^iO~cs$u- z;6O9XnjE{Xmr^bw*RS0P+PM=meo|hR-3>R(_LZ;x-+c zsRld>Q8`ubB&&bBRT0xpgp|+Oo#2%-wg_c7HAM3z^0@xorF~9s zN&;3hP)e6TJiFqnJnaVNuo0z7jpnkuP??4Qs z7bLfq4DUXhJN5Qe*@k;D@HstHO!Q7WIG@ag2Y5djtG&*V^a)~M7ZX7~8kZf-d6;CI zy*Nhf#GlGEU$91`p{EUXrLhMSUtwBu3Cs2LjK_M#zi!pH&zn2;9kw5DUP&yo6px<} z(X^3?+wV~+C3}!|&&&9EN8gy7IkMMOc8MOZ8Xrsc!}Lua|C&R($hFC4&S(1Ng58+z zt#Fpue1ejNok_1Flg)GX)TTgFn3|>olzkQ&o(X|)%`=$x8lL29KAN-&@#=B{8BYRgWUQx}cND>}H?kwKtz)p{9V#o|@etG=!8rfOY z#2K#{#FTq!0uRS@Eb#B|NY^~q&Z170O+<1pNdtY?X`SaF!!gOHN)00m6)J4{5vJ%Z zx)@ZyFL*znJA+CBeo~K?{=hvY(%(A-2Nq=vbs+cf(2L}-t*N=MUZ;`l;bQU|sqLd` zB5CKiP-NwAaQM2ozajtEX~b&`YlOd`G9n6?7}pyTl41}F8zkLglg%miP=P>Z{*+f- zP1+u`ktMiB&h{HItrXldEhiVAS&KWx%fE&p`$zkKl z@JtFgZ*G0_6b;YH?c0Ut9vP4a#TX3(^cB78`Gg@+#j%z^V>Y~+QIlN&Aa+DiA#Oy5 zY#FKIEAdWY%7aki=Z>aKJdeC!iN9KF*HM=p3)^-X-2BpJu)-Q7P4YYhaP_)zjaKMw z6baF=P^}dF^VOC1AFF)4>3pR@zNi?sE*C?wP|jnQE<53Rg2&8&`LQuSqn5289$OPP z-&}su-<0Ein$!HoEi?dq0~GBBd;5H~rYL{cL$hdaF_~{JE9i8lOolpOG{sT8wzBPC z2G4GOJM3?@lC+U-skQG7-tRmHMwxyO8Svi8;12SOt9g2uQn*Fek|i2MPpLrWG$Hld zI8+R_5Hx-ilEzesto#lryCterYKq2Sc6bpwP|($^waXyu4%6+e#j$7 z&i~!3{2QVUWL?0-|NZJG=^a*>`U0wDx-limBzC zAzxzuv0+IIlR9uBZqN`INybxo8E{M5^^l=Z=W8Fnh1`+AvByPQ(1^mPqT;t#Sy_pmebzYr!7MEDCN0s zVy<%_3&ZMHer+rYURDcCQT@R?gsLLL*g~Ed*hW1mPetH7)5MFv5A+K(9wUgua zht)>0)~ZO_-&(UJamF^jV`=w18tZcXuq*yX_ZZ-(nf_HW3W?FV+@qB01|gbd!BMp- z5QSwm&+SiuMEoo?)VuWjJ)v4Wri^@av%#S&M)frY*=~h9K0)2=KNROSik8&`3IX9 z3KYBcgYk7HjlZ24(L?NkB14R49O0bFibVmA@tK*-yjiVR@e;WMyaWDxD17{pHq~Rp z9WeoM%8I7$;(Cu44jsQ!w`XE~nZnW`c}Q07L3V}>8Lzr@gJ%6E{~Z2#>Ah(2Wtgv?hlYUy8H=X$`7B?vXsBFiFf*uIpsZ_g3PLBL# zr_j#It6ADaeQ%}f{j8xVJs|~0uque6ZZb8-Zg0^@W7y^q2SPclzmrufxYDv^rhx22 z`9hi}aD#{=SyUPUQ@G_%K1aiEx97Hb9=)IyPCMzJ3@V}BM~3R-=)s4q%RRG2m#GiG z!SJ_wo&*@!iRjzSH3na*KX>SkxHuA4zZ)N)`DkP>Xp9*2%vryDr+dRT6%~-la+AJS zl^@3}Z_Vm6qHREN-xks*I_lQw`#f67m5E48jcYOqB_x=Ju$Z5C`Ek@TRFE=rD9VLa z9a);I$3gpoa@nQ$Z$I=(MzPs``M3oq?&CM%i;cOPCin12g~Ud8L+wz@aBP)^3)GYg z)R>m}Rk1E9cDU847{gDI4?M=-F4~F zJht}g#UZ<_?srC}XJqMfni4+lo<=KQN|@2=!A?b17FJ>ujiR_#@BqJgagltfo`Ygk z@sq9j4lRR9(V@ItH(gj~(1OxQR;v?HP`@_!$M#*qJ9*f>P0L!#o13q$^R}z4ml;tP zfI^G=S$}_*KZ_E6=&b9r$V|=+`gCE>tszapOf!EMtvdg9jo$#H0gwmZu1d?5LPghx zSmnm&Ge`A{H~M@8T#+~YISehvB~%ViCEwCZe=uM6Du^ZfMCez1;@vlU8o%kQ!$%bn zrPw*|d5bvmUIkxh2C$vqRCWTP*W_*eP|=BO(Y7p;j#nl;pSEs($k9X)l<5cDe@|<+ z5aTS;U5wq-Dlgo5D*7`&mVrwos#ijaV^palij+N(xau&xIaTxG-CE*LH)?$Bp7*q8 z_%{G%yKNr5OYwTPRB%huzM0~?>M_F-NYapLE)FE|y{}uvo&^us2;SfWJzjD^18!b8cYY(y1ta_qg&?;^4g3qY*N8R&~t&lx05m2QH5PKw1=M_ad7^tW8@~&jF_2D!%Gcu5Yx+;=hJ=~zQQ|~K*Swt}+ z13myajW(Gqwt5Zy91i3<4Q0IW!nOH)y>rxXYnOPmj}yVee9*%**q5EjZ<(+}0z)}< z2{UA7FA`T%k>O0edr7v`750`>-7k$V6Un&yC73MLte~W{nGTfffCNNuTZ4}RX9Gz! z%Pw-5cy2?hRGT%gnr88t58VCY9B@>0Mp$0v z+AH_WhD3)%v_$nPV^;gwlI(6ds;MY~zEem-tz}+d%IR0G+}xuk!=kaZOrmp^`U+^y zN1t!#C?N@zCYX~Av!_Z}nvuh*%)PqC)0(boFp`D5X$?pwUl~8hzngm@nx5z5EFit* zA?BcQ$>eO6K9#j||A5f@0QGE^U3OsF3lIhQx5?aJ6Q6NBf4d<*^Nw#?!-G?7T*i6& z*>L=Y)_*bVKwLz~{SW2fz_8;S=&02$KW1$$-y)NLcN^Yqj9T?s{Tk-?UPhS0>yr^aPyx5mpN1shK(R5)Z1V-9*_M> z1+-)!q`JD06i@r~)i(qw(eS?wwYP7{*eg8mXP@(KG5kTeYMv%sVoDncjPyl5Y?$#p zB2SY^RbAW?Z}OD9S?5hmZBNPb;V|tD` zLmZSip|61c&L?lob3zo~)*NL3s;!XZzZfEUtf=7MJVXnbH}h)dp~qpfCMMeHm2%e3?RV)uNelyegJrhjReQ@Ql7~lJ11S#JiHG`UakJybU492z zN!es1KnXi^;J%%~(Oq(%(#F!}KGUwyK*J@L5o3re*p1lkSbDyyEW-owE^|jRmkO~K1O2mh4i|4fmd}v#J-w2bJH??8HP2}7#nG* zM+yX(i{^*ho0M8jm{BIWg*9P{Yyj_}B>T0Iz9C+-BG8j|w^k!BXcfXGONfB08Y-sk zv438?NxE^)lS;&ggJM1%VTbct#u9^oSjH$-9Ar$pIbE&v5EVt3stxdeN$j*uTKl^< zWh=byPp5S61NE7&OxrSW&2U`!{^-ToZI5R&RgqZWb5ypPBt1dAbP@hT>HnMi`qRWP z0sjfb>)`oqKyprEVPEjdU{tA{`f8M1xFl48;i3Y!#@&^}Z$yI7g`v0qqzRUa19@Jn z9=7wgl+So)qVzYd5F{f%6JX=|&25-N3bVk>U>S`#`Zyi8hbP5{opxVxxIGOmST1f? zs47$|URjHsZXJZrOi)&htU$n;8PnL@@IlsnQjZ-jt!(M@AfWQ+b9LLz4Vm@O%|i+q zrlo!;+Iwp^TAv8^^gKR+d6|%eAG~57Efe-PHXYqqrcMLF(3qx)m2Vk=%IordC2V30 z2y~%EEvn{9W(Pf0=8f@jZkAWg(da$d;zz$BBb&EGsgRMO$C{@IXqXqu7%ZPp*m@ff zhLu*GQcm`+hf1P%cR1HKd`HBj0_B3YiX2rFj78Nev1JNYH^m@&jbX8A8XT}5$2sy+ zTC1ch0f`X=A1!_jH0{>DNOGhpof?v9fy83&pd}q((XCyqe$C!kPeRmKG3l`tRh%X| zkZa4n{M=|76$Y~UOcHjOZ)6B-74=NI{xP<(P3+uC1zAQVt@P-J&w)GIrIsCmjhjt_ z{{2UI8&70sqf33YPZvf1Poj~>as&|r{t|4Q1IH$kIrOyh{nhT@Qsaivp7%T&40*qx z%Pi;6hh|Cqv4yiJ@OCY%k8qM#;O%dEVKB88)?>@2 z3W3eAD}rKhhuSLh&}8Ig?eVA5;bs!;vkwyKJRz2jm~?FP7st0=uS~2X>CY?QiWtPI@-V!< z>~l9Ft`>-G{ehyW*kd6%up#oRf^=iFTWP1C(tN(-wTn={NIc7Imqg}wr0#w?fPDX5 zc(tWlSr0>fSCN+Z=(1ZRliY|uKS5Rad#QJvvO35;RL^@q=WuQkgbOan(m`Q#E)xfA zOy9~jQ$wji*hFNC_^We_2_kq~^7pXsfzty*0g7r2Og=3squ^Jwg9&w0b1AJIg5TZq zrhQt3tj9|9B@KW*7y)Sbfa+<^Ga1c^{O_b|VO{4BT3}GpeCLiIR3d!m*P_w>``qLk z7f!=t+2uIs03-$u-Mtis1kRm<42^)DzR}m)OE(>N($}aU!xL(XA7D^88tpj!UzGE2 zLKEO$2ly)+_7@^8L?)PED@*7DYH9<9UdtZI?=r0vWryPorS2A_nnto!B1JSHk8tn{ z-mT2)?Y#^4u-WfqR_suV8QzS3Xn;3FEclxh>7pHc?d)fP3{{O^{^G+U>8|kQwSzm+ z;n-Z1lQaT3>}&CDKlv~0DrT;geSo6nF2-@B9&Z#o&7?;XjAGLb`RV6}kY_2~&~4(? zL3GT}3YyGMr)qrF@;#3jSjJr2Na0@u(2rb+Q87N`O_Ywi?Cw5mOTyqRhj8jCe81-@ zo@$XzF#QHto`(^EGVDdAX<(A5(Fe?DM-M**qfI92=p~zrIur?^RMNXRTO57uaPaMG z@?$nGD`g^qnbLyuZqPib8UW(3o_$LED)8lV^B`pg!w8>VGa89iyx;(%$4n5ktIYIi z0}Y@@QyH+9(Ol_Ntntp7DBa+w6b-X`TNNxnHhq%meXa5~f-p)Px48!H=7=jEN}e-n z70j2&_7bznS;-eaEq9}M(34^%d@5E<#J7{n&`6o$Dd2%&<4kDdq5JyA+5KdV-FbTC zfzVkf+ls#HL2Mbf{{S=Qk0{J?JSRu-oaQGG@NenoOY{$vk>V3$$0xUrdFQfL@G7x1 zoUtuW87nJn(SCYY;Hp=q&Zb@G-EVi^VgCc7tQg{gZ6kD-T3=#?eL{gylrSTz+{IYx zS&K;dE?FBPrZJI>L0pR`?$Kc3$fZdW-v^`(KHAvd{74i_@Yh-2^oS3vrlbAw>ZWuu z&PTOhpvt?cX}xOw#44v~f>adS8hg`%(*#FL8+V;W17zUSJ-cg+&5McCJut2Kndrt> zJPRSnWBF@e>HmlvqpbHizWxj%FV2yB=_e(+wOqV}5SkvlFh-M696sY4Z0Y8Bl0EkO z_Rw~WW)G0dGXNq;#JO4VUkf#(zY!GNG@Dh3B^-3{U1((P#<2JZ^D;>g&OTtjv&+8q`R=hh2~6{5MsT&gbW0} zB<}j|b-g9XGJ6uFz--=u^F=UtLr|jz>peRXkjW<2Tdh~Km~$VZEFv`z6fwGpDdeNm zKM{+LoOkadvfM!P`ya&x=v; zfM<`-)rP;}`){WF=bb&1=0b}tN*uOx_l34UB_-Ntoz|BJxJn8(>j(<8LkyCKF5+%* zZ;5P0d{>3ah*pI*YY%3Jl!q`X#{p#@#~iGbuWRk5E!C}-+R4h5w9VQ zb8AQ*SxKbEVX1lg#Y_b`9?Gz-PdTo%MZmmpxc9Q!Wrn*7oZo~;|2E?%m|PI=B_|Yr z%ES&wC6qRrFIV$Z)4RdIKJ&E$z@!d453hlo)W_T{?)5~Rgk*Vmra*er4_Pk`J~K>B zNd(1n?}`~x;xfhMGvkCODQ9XZp$sRi+0`IuP@VpH(q^xt)Xct|w(0gvHdYOt?zf$k z(t?NCktx?eF~iO?{Wl7)%Izfru;Y9B#9zBx31vgq{AJoi$=ajdi7R z2R^y`v{p~&PsNCXH%_gYNDhq$hgMIGD*tAxMhH|$^M4gH`?mrHB|IF8t4i$*#vU&p z{=6l|=P;U!8`=O+%i%vCkqb+eZa1RS{QBp^9V++&X}@#Z3s_xH#u_9*TJv3dqO%0@ zDQkXy0M^BXI0NF;m7iUGbQCa{Mrd26#df6TgcWl6CTU zWYr6ULvv1I-~;@XaJ^pm9P}g&smqzd=)>*_Zk9o065mD?PSa%o{O=<4|E0z=q6x(R zYJA$ZkVoGa+I$_uQgV#mJDFdRS0x42=-dawWCix<(hcrMW3-A8$Rc=EV8?f8OfLr< z(dAg@R6VoME#do@1I-&M%&hM*;Y7A9Mx!fpgTV`jqs61#)ij-n_7d|?CWY?P_D(12 z5iwyScV760vl3V%)5QMgpkF1mZIKMjv%5~IFp-E@;X7rl#1Y5R;>$yNs=^O^qB>r! zXn*)2W>uDAqmiLP-!35vMO9WKS{`A{QXcqo4AByrCQ0LcL=vrmrN--9Y;?zjXe+?x z-KNGJ+&R3iXufb`l$Xmv6*LuhBM@Wl^0a#9dR{YBZGFl94v7MAAO_bP-fmYEwu7o> z(b@8TTfLJ)=Hn<+XOv?OM-)6Zzx^_w-Yl|xq7O0o5E?aHOnWNcq_PSL4u%c2qZd7t zW;^ek(TOt2wSI;lJ3m{C+O`CHA*yUY^M!tF^S-X6yGsJ)>ok07yyYn2nhZ6UcI*-^vs-Gij0+ zf0t8sL)AY`KQD{$M4kl~usVGJZ!9VFR<1qMPDx*%NY6Xt`^!$!r<*12RgsD!nJ7qh z%(ds12$jZ}Zz>NTD9(((@L!nyw7!@7`FFfA6SrPVJW4JeaoN|t9UrvIaYDoFDJ4j} z2-w&^|E78bUYhSk3k2@yjldUwQhg=hA$tHi0xV3c@z<-AbxD{!>4n=yT<3mq1e% zK8K~NzEwjoNBE|gu@RghiFSDP+!}$uK#@-joXi#aB3Y=gS%7nv`=k9G3oEIQ2AcpD_*7@*lBI_>kvF9n00527ABdo^h{lR;+2=Kbjh)X1r?OpAojNl9 zFcXz-+FY&!c{CIle&SkCd>r{s?SW?W)C^P6Bh- zy3fKchCD^UBGgPbPlSmp&Y4+{TNTQ%HJ*RNcKy66>c12eWXkir4%~A{VKs@4JDL1S zSL)qd)v5xEn9b+jo(Vy#mN$vs0}USKg$iP!y61Bh2T3xb!nw7Q9#=SEbWLrx9(Vbj zTt+hei$S_Lbkh`J1|sw6gpfXbLq<7&*wncmc+}>+hA&;%q@hpDy*4Za6O= zkuoJQ)=we}#x<*?C<7qY!{6440uI$gx*wDIlR9(|fU+D8-DFP5oI9nLE71T_y(2-_ zSHYfM;>Se_`p&If9i5rg2#u2~xSVkZi{uCsIRC2=u>U5R99Z@N+DG4m4j&5>CBF(L z1|+0lpQKXLCt1GZZY@?h)^z!qyjf$pAuj+qOHpyDa#@pOvwS{5TG+5)>9Zyz?$ag^ zAwtMd*z6VW>ZtOXv-N_cM>!uU>Fu_^^V`s548eS%U%uSt!aJ>+#4+a0vrIg+@Butt zPP zn?s)MviH~F*JtEsN89u_0|oIXoW0r8om8h60nQ~h|HDJ9`rC{C(&v@YubeSGr>fn{ z2`oe67V5`JlUKM?y%H&N1u*sHrl*fbqM^@oi=P6&m}wssB=_`Brr4OD^H^I)JYAMT zivJ8c0nzC{Jdbyd6YyxQ2uMZn@WjxLVI4YE*e9uC#cEs8)r~QB2vsI^L8ku*d9%M? zq`idy+8tRoEeCg9(#haE&brG$M$DbSyiS<@L~_0K;1r?4y1Wxx)3=s27&I8$wy)MD zjwYjn(-`h(Pq|v_ejP-@;1(E&>CR{kGz#!HBaiiHk#&MvT7K!B%~sDGJ_B;-Hk5(8 zAlO3Y<~UHlo9FN%EMR9oIVbG3{szv$VZUVs-+0pX`vj?>kQ|TDI6w2UoJwGII~jO` zRthVWPvQ<%>4OD)p^C#1Sw{QG!%zxq)0#?4xC%(Ay2^%JM{dq$wX5FcvNdkAdw$&( ziXYmq96Ipfcef=s{#1hztl##VC^on1J&}6Ax*2d6A&M42E*S(O>&C-078a`Z_7XE( zyCvnc%96s^ExbeQQ(|&F_1Ago6eSfE1sTSHJ33|VIi6g4;ouE8{GtaH50#XovFAs&i@8?-Sdhx&YKy1I3nBZTPvomP~x}~;64d}M`GPd2Z>d1q*lL3b{;9R;Xvw6B| z^q5)d=qAahEJXgL-)u8AW{B;=$&XuuR{KQzLIO9%5qk<;Q42-)t$1bWq`iaPb8*$z z$C5R5WD0hCDIx==B30VzbHxA~yNatVRi9hA?%e{4-M09e_?qG+lF52nIh%tH3%XCw z4{!Z?5g~^chU#>cKVI6!6uw!v(qYimD~`m|KRn!~Ztj}6AcD^q{^(}Rnuj~o)vVjY z5r$iw9tOXD+)7+i@mGXJ^Nhq_wkvdWm-?;2{N59}H&Yma}AOSSI&amEMHR_6V2OW(Wg5DN@6c=NrV3O0=&dQ?OIlt`OYxle?(Jpj5hp(1Us%A zMP6vc)q^&QJ-niSk-BFenE>-fwBjox()WyN7*Wt%4P!JjEv%ObyebM>T?OL4c98Ae z?DiBPd)DazH{qUsCT*)u{m7IeZm1xK0Vp2d)3O8CSA;M3j{l0wO}o7RCO%(r?V7jW zkOWMJl9_s=Xu?c+wHygw{|3EfZoko@_@)~bUoln-Nt=>b$Y1$f02662#Qg(#ALuU%}^x&C%RfD z9_V6fhBu4(Cn{n0z`0WxcujkJ_bzjC%Yk?dPNB6j=&OLO{c*Gz^I*2HNn=!Voqwi2 z*%vBp9uxZND{lHKG(I*neD4;p0QoK%xrj$Sp5bjJn173}9V}(i6OoHR5#VIpD8d$b zvIpf9C@XKJe52xi90jW3UecVh=P(6g7lXTEKna)RumT5^ytHI;CSLKw$&GBgW1f6A zr?E)5)wcnBRjGGBoXus=<8SFnqVLYsrVj0A6G1wY$>Pyv{W&o`G@vhPaQ-Ee%^^Pt z63e}U(u{~J_}nYtvvWz?PyA{#c1(B#g>INSfuliMsag;BOVlt3nLb-g8lP8=ytYQZ zTB3jtBo^$8n@!>+qB8m9u8;h9w7(TUg|L3PT?3D2uBO*&d`dh9boqDwTNwQOe{989 z+IX!QyIP<6=WMR(-E@Uhx<-5Ak}Ez6W-?>y&)3;Jn>qvOp&u9un_T%UJ-niDX=CW* zBN&VNn#h!smGPEx73PHR`Q?)@3e1zSLR^a?^e;dY?4}DhrKLXZvu38xy>CPQne_D!bWrN@?%gWE2Zyi2w)59zE(c}2) zXAl~=Sf07rPo$8mhS(ZzTtRq#ZCR+Q|7McGeA8OYO<+C^ zDso_zPv1qws{W~KIYA>UWJALE3*|_Cyo+VXt$xBa_9a>ndQ|Q%9e)__hb`5(%-8XE z(hSQqA*O!udpljXq`Nv$p`xgZ&O>KWJ$HzmPc~b89)8+cmW-eFt5uy^}p;$(*ZAl9)hU!IVZym}So;%_!R+yIw{2othdNQ;hH8ZvLr# z%A%Q^ghwI1j4=~CglNXGxPb`|5|kwwh;?9hXX*%#5qa4+J?H~0QpLzc?iT}tDKJp+ zy`X%@eF@8iyKUo&awD3XKXm3w^yQq^;Jm@cy+nQuUK1N+U%wIkBM5Q?8Iz6R@$0F0 z2dHJDk-%p#Q3}YlC0@aO6suBo^&Cr)^$;I%5IrouH;oM7H~qb=fLrenA-d>9%n`g; zPIIj1((ib;3jQIDrcSl9VZxM|$pG%o(}uDM5JlQlfr;y2nR1vfXV)zkomY}I ziW5LsBq5wtcnj|blD1nVVO~VMk=N+jEr%aZT#CxOcScjtkYckFH#;k^-LS>H;_P1S zttt82PZ@mp<0HQdC9hQ<=e&kfxL-y=;c#f@Bgy8|E$imf{Q>vm$#cn?ohgv%8CHQ$ zLO(h=9uCv^!s7n&z5X}vZ7TfpPP&nL)Zn^U8C#aAEM5O}wpm>@ZKVupQe^0+?cz;=un_f2@;7cb4IRMa0A_jiALe!V;{awe>}c) zHBgfc^36sg!BgtVIzBgXdkb4IbpzGE9(>gCb2-t;U{I&``@>C*;%z-x3p~&f=_nG5 zMLSbcCQ{6msvOO$yqi!b?tNuq8`^sldS_P7H-8Ne-Xn-oz+qQIPANg%c$VnTdCtdb zIS!I7O8s0O<6pH>{bXi5e zsYZ^}+gPuxl`M%eTukQ^_4YyHWGpn9G>>f#dEYj;{FLDP?KRc6fi@ZAO5{8-y_G;f zJ*MkHuCN^2MX_k@cu5@kD%IiF)baJ&nYXGmtcPDEl4dS)lwza6_i6h` zUHOQEuh_l6F?%PMJ*aW=GJM*NX1MAaKePQ+ZJimF5%E37KKu2svA@P(#18rSh12aV z+U1`O`d>D2ly&x)>7;;d18&CkMe|SGfiH>4>a9U<;cu!#u_E8AHLS_*jtg8+6%2@s zUc$7$;AWozU?cFSt{YV5HMN6+&uHKFp8oqR{^#RgwoGXT-;`51WhXO7kr#+xTFb~r zY%lehQL7_zR(jp^okkp~)+dql4QUIeJ}rinZ;`MoxE@W7R(RXL2Dop!M*DcRG3Nv7 z)n@)P7pA=+mj&CXkbyQ)=xe$q)6&)%|Fs1skDHE44mI(vC_J<2BXGTxADwK z4j+5#&rLT)a^e8XZvG@1;b$4OqrI4SFR|jq6QF2W1V?EyblwJ?CSwDVZLekXcpoQn z!{&9@D;rL#cj8FSB2ShRn2}3LT6B8J0jI28WtV-IK@7+SXkPVs97=1vB)SmeILE?r zNk(14xjfjXU~u>xW(4VAR9(7n@;RSzTmmGu%bcVyfq~08SxQ)PdD;pFzwUn$!$M%8?(N5S#@;$Bod& zxBVw4KpI&3%2T`*at=_1UqAl&MQRO9`ZrqSMu5L316cDp5f}Nb=`laien3=9hlRyj z4Ph9y^>b`E)!)xC?uETeE}UF+qXtiTcR(c=aa;X9{pyJ{H_Hpn{6(Xf-G&9l3qGJE z$T%3EHMf)suB$e4FP2vn>uSvv-8&84a)m6`TWM7_z$i+v30q$r-Ng6h<++UAmf`P- z1PIRNzY&(zef;XmYgfUW`k`1owHARSLwE3}*-NktaSMK~&0Rcf(9`kC=(aTI4=St* zwKk4ZEpRcGB(BvZ7422mII&;kbEzRsN9I2vvRg9VQGi`0SFLM z?-~zQmGFS_Y_+oqstnzzoNq)p{g5I}RmlB(PR1{Wd0_lf$JY7zBo7KGVYjH^_=oVF zP3rS7L7)=PW-@qS8t;*Ov^3`zVcp>zC_7mDG{dZ)xkPP*+b}ev3Ev=kh3uV%1{+gJ z=996#z452zSw7$s{?~r?Ky{}2ia!*R2C~d|HW$K#2lM^6RL@p1>E*bK*=MT*9C}h& z$odYbpZ*j$J-fH=^ndO#PHG_r2K!0l}RcfHH{e(0aJ0O&XI zL;|C-VJ}@uRl7jCigHt(e#QsCGgBJPO%fBNy}|y`nqB$tFX^=XwfOT61+=Oq{QJww z!m16&ikc(&ociZ3rb!4O6a;L4yd)`+X6X!b)JTE^YMm6WzSxQE7VSu4+VI}c?ul8} z|I}(1Z^{VVhLsApDrShAo zLoAFuZxpX$6{r!l(yl-lxp?;>=6yX5C!d9mR;{FZe-Ym%+rQGy)RCQQqqM-qML?gf zHk(EHL9y?ZMRTx9P#N~D9H_-ygasu*ZH^Qp`K1bdLODBa4w-oC++RSrRC}Kg*lwpLYJhz!b~AOy?;L-IY ziop}|ig?~5c#!mRk9LQQ3vZD_Ojympvp*pkJ;CqwPGrWEWSGMG#vzwogqpt6@IoK- zPIx0HK>WTjK;r(uDDL`EfbJjKbiubbsQkx<*s-lM0`Gplv<{npFs8RtoHM?xF#Uljq;m+wZ zTt-!%dg3D!?gF@ zKgMqFZtsV*Ol44{n9rDa_vL4A3kuhR@ETvt_`Oe&oMkUZTH@~bKv~tIVI3n;j{tYe zUbvcDjN`#N5l$U<))^5u-Oz;{2pfN?gH=1UoWLGrz?=wbqQxJYx925oU#o9%>Nq(6H_62@RIN)-ORcP7B^CK2fph9SLU4!_FV#Zz< zqHTwojKUml&ICrc?Wuh-u2{)&1Na4{-u3%p1jd~v#1i@+#`(MX=VdarR?Eo*i*&IC zkA9~$1IL|NlwO3KKTmL999$G{PMB$SvXbsonZdL40818;W6MIMXWp4xPY>ZuG(gcc zU?au<^~>9Hh@94ak8%R|InK|XL)IXeg4W;vxnB-GMny#3+;$%w@)i-!|HW73&mmK` zrjSty|DWeIK>45gCX}IQiNEZ8N82=eB{@@zgssorV94Mbea)01_QGY-CZu5M4Cr7n z+80HkJjklRkw%lcwtEMQ0EH6pxOWIJ#dh=Wa`S;6`;kQl{1fw6%jUy6(Mbfg|82p+wHAE zqfEf%v5Gzw=7SIFLIKM-Ig>X+WxJSi(FVN{(^DWs<4EFbAu{mMwAwd(YRsyM##TiH zLT-3i8L>?eejTLk94{0NMYYl8(>fxir%I0>8h%tQfbQzTU-Q_0F-;PgT`d2|hF?5d z-F6&jME3`LS9j!;+y3iru>1H$6w-tcLb(Ayt4T2NeEXkjrBGFT@cs?!47$~dN-$(t|aHDuMspswwXq6_$Q*iCvMN}HV0f*95%HA(k z$|e9+WZL|mJxkELAWtE%e?UP0iQ{g{nkXp;$L_0DnrGKw=XNCdfs5ZQ)y)48QdsBNkC-tc3b8OWUs6I$%Lqlr^oNPKdR_c7Zm!v+)cqbcc1 z29Rkm+?%1Rt;z}fW!!4z*UaF^(P#`U68e2rl-5J+bg@|YpltAQGm&z0V8&t*bD;Kntr*DhX9(gNlD~0L;IN!mqx;QfR8s|aXM6&Ww!XLsL29#I zC>mh}#8n_g%FS|c%+ONzn9DZ$>=Af2*U9ZLAU7*Y4LphGle@E1rdH{_lkL6RBzt;1 z05WHH zLj4PSQci~HPL}SD%$CfET?9=*Gs!Js1{^I?vMTPm`@jk@e3YYkO5GCM;aZBWJ@8gq zE4;;dr?qFw0poc?%RfA+CUn#ZJNU^qR+~(cCKl-aBYo?#t&a(aKGg*HK>N#UNw4+T zPQB>e#!JNfx?iBkd1)uS?eiax?R5mTWqX8Tqk7-&f)*@Y zV(#TgI-A#J^#KEAsjiWA9%~CnBZ#2y=stwAf@~f6>^g)l*^jM1u|+CXC3lKcdk(5a zZsk1Z7WrN+4uoj5o_=+YpW8qupeE(`xGPtJ1m)XN|E`E=WPktwKV1L~Eb@CuJ#0_C zzT{B64fpgyLsHTyr7Kili_dN0nN~`%>ctcI?U^t{_-McG`ZKWcVHbz>PHF~?c6PJM z5=U_W3cGgg51JZ(g1_yDr%hEnZAN+~o%wQ7L!Vt}hUWu~R-AYP&$pf~bAX-g($Art zeFo0~@+tQ`EwOG~QadAs%z6A6p*nLBtaM&?#U+)U2;yEeSx~NCQ2#f?ZyxLZk(79? zzQ)^JBqByn?IzjIi3F^W4J}oLEBnGqbHcaq^tU;ociFC2nyyDz4HfrL{+(Yk2~wG8 zl!d234oo!FlRs0p4FyMPYYm1PV_tPpE;Y^73GB)<7b*#VR3i0Zb>E)bVZ#odXwu1B zh{U4G^^h%XMG!5igkEprJSd#z8eHYA>@yo~X|Etxl_GtNAj0%xXW2BpgZ1GW>)q|! zbNcHHeTa1|hHPzw5o#A$2ZEA9b;yX%{KpL@?eXa4ifWG0hO z`LJiLz1Gim9OTELY#v?}8qQsFvUS$;dL%^$3LRs>aXeX^=eesNN2A094=on6DjRRC z=f;R=-%`AO%rGuX_r7Uf7>o2bF2O-3z+gvck9TR+w2^+Ix@<+aG#4&aKH1Kae{ot+ z1`2NEMV@GiC{K&@dklxToS)YiQNwjS1s^_}b(aO@eh%V=lRPwuAn9k3R*|ummNj%( zH58~)olhG*)Y6gJkSwLjT79W{PekzS4P|j-i(|cJ_m>|9I;dhTo*?V7?q?(*h~?|6 zW7ie}CB%mcz-lB&75s+6;pM*=y;|7>3Q*0z9j!@3W;I z_}pvkegueku%h$U*T@>(vZ5=Mi2W5E}`< zlm7A!#1mm6kAlK#}-`>4Bn-{VLK4-mNQkS%ta>eQWh-n35JY4G~>(asJ4y?J$%L$IUGTCr!4 z|4H7{@_VBFd%L;oWe&dHFxFaJ`$QWxjp^m0rIPubW(AtY<#*M-b@2AJKg!*4YN69= zd4Ru#+H#7OYLZe-pAb%gRC)BC)Rj_o3vQ79{#|7wSa9h3`l(N)1t}cI;q`twg>3M= z^%XbOLPMI}h|s;)SdTYIhW<+t%0g2#_YnO4E?<+A9tbKHnuQ-)H8D@;n0s(yek%7K zRqxqF5^ttyU+!$4|4n1L`GN3ZIhD)G99>%cXfedil| zAY=}R{DC?7Q?Rlj(Cxm=3gyV8HkNwvQc68=luP=C!CIVnS;AZ=64iIN9Q*a&D2%>y zwaO%F9E4Y11aK9J`(njv%&fWBP6pNquLi<>x`{_@4{KxEd#>V%nr;yD8?B{jnIfnd zL>(<~67XvlFnVg)aK+jEA=$8FF;e^5UqWr~E7!s^EcDxvZDfc|0YqoXU{yxNcDN;kr4+$7LQ-grM-nGEbbod zpqJ~vWNSl-=a(W|V2_B+l)6G;dcSF1&C|V+;K*LC7rs2_YC1EZY+nkG z^zor6IREbN;st%dtK-h~H~Rb7l1mRR%xN~-Xzfdgz$8Axgq1qGd^^R!P>J^PX;iKqpv#Yw(s6L9 zDM4^6Z3fQfRRpS=xfFlB_wBqt7al-7r4ncYWs4gDQQ3{WEm~WI! zqnKoWsez+#-_>D|w1$;-n+W%9z*3J`#S=$F%*|vnD2oLN{H3JxQN8!NwQtaAUEY~} z0{t4mhV)$fO^*3obCq=tBhpy?%+maQQh81ljUMMB1m|5!Ke{kzxV6P3JSJb)gdg6}f$M{7_I!FJ7Uv8@aAr0;0L?_XYn4tE z+DiRm@7%NcABKX?Z=kq%-!BMYQ|bdopK+hRGy29g#rgI=%-M~hx3KA}UhoSJ?31_H zDy*-Ukl5upRLe#!8Va-F@$yfx24v_ju?F(E7S`Uc=bs2 zb7@&LUx?Ag$>P+ta?Q{h{Vb2qILjdHZVgO_xpqRa<-N?RL!8M{zH+9TzQ;jamh6TENIy0h1zo`m1l8qI6U;KWx69ob8QS(4{ICTO^z=loQ* zkxu2(Pd^%bR3rXM5M(dw@GaPLPuDACLa+~CzHmoWZBs2mqY@_V=d<=gjV$7JJrO05 ztrV=Kjrr=&0Y1uF9aD~$KOM6?%7C6D)-I%=t!;7Z3DR`UZwL~LLN40P&|r%n%FKsV z7o??v*2+84tIrE`iw(*`-+_)V7ZI9qJ~=;Nh-g0{7cEheaTFP%9sGbR)jU{J6!MDn zhdy~P?8WKUb@_TdYB?*c&=}RZ)<*wdEkKl2N{yEC!WK4HKlLLEgteY#rO367Oe-rV?A7IQ!H?XHR$Kc|9HBFN}fv} zmw71x#4&!NRF0Ba`j{H|l;7YT^TQdtY@kW_pfXHbj<1A+*a*vG`kaKcScg6RG^NGF zhy8xCa1~}hDLErx>LFibM!Cp0K^N;M&(0#Dq;3*wrf`7B{s~x(cD@{i5RHFCf#Hh= z4D2!?bK@D#<6Q!>LHW?JTsSNzncr?_*&|oQ`g;=e#=ac_7a!s>Syqc)0k`>d7?;F6 z&GXUZee584U5LmR2-^L|5j*JN7Z#4EXvXn#mbag8e6e)I`y<0}8uRqk{qo`kG?>mV zw-lV<6^&iy!aO ztSOqE$@7nb1E}@9+OgKGisnKI=C)g(mtKO?{6ZKCii93XhAR8N-LYF z;<**?hpL932^`4(<+X@C<%l}v0M4gg`gC>itgV4S(GHaJj_Wa;%dbP1&P;cYp#R@K zOfnk<)n`3is#x*}ZM|dsE6kT;}i!FBP;XULdVW&D$`)H^rM-IvDOp3OL#`SEc zc1g?FhYv(27|AI$hUxuFL%K6KDHb`oijtnK^l>4RW=nHAe7)YLpj3$YD(!0B*NfF! z;>s9f-~tU#O`n$y1MZIxB>g{i>UtG(n=&dMSN2F_ej1MlG+!JMU0$t1gB|PCQY*3Z z;+G+(@e|11(-g-wkdmVv`KSrh4?14>>+WeMh-E*dfs@~(IYbW0g4~x$NkZ7sKa59J zrMxQS6zDSFY`YWSk27PLrrZnq4h!x(8@t3YPvMs+6C1CeT6`6R!w5r&23j25x-N!0 zt$kkwfL*#yoj-@iJ&syL#qBa?gzQ8~H-Di~dGB^q62TCRJTWTD#v5Kc$NPXN*=;rd zv><2o8#a{~Rfz^^Mpb6Q@?n0s-Y70OQZcWA(k$tE5;?P$onwz!na1!r2aHRX_nEt2 zzP!s%T9^`O#{uYqdbcl*Y0plfCQ@2`+jjv$$NP>sRO0O`IR6Igp&)NFMKKCE*Eeh1 zPkF>68kq#D4Tl|UBI=Kwubc66eStckIhugW6|c+xuqsyh|A&tTzlEzY$Cs1dbV^y@ z!QK?ZaE-V3@+%qeta^Ee{_Vp%f3b;s7X6z=+Hah4cJ5DZOS;sRtsbSePUPH`L9)#8bTT zDAT+t^#KgYsB;&qaqy3P#n;YM4PsA z`wn7&(*%FMOa>mZLdXT)GJ&5RI+5S>i)SyF_bda>k7Mp`NYBCluIa;30RK25yMy@2 zB~Ju3qHNWz8iKv=dm2hZC~b4QuKlw9x0(0vE@DlTp=$Tt64#w1Z~JQV&tX~+tqHqxwQv^t}o};m{rZq~v9X-*z#PHVE z73vwhf-yAm`Y2r!icddKmi_oL7I)*|a!vKaAHTR{=XUsfkg4oDk8p~HuNpb(cTJzP zA~5Y{)gR>43S@x=;SF=83;g?K)i!gPz zF`3b?v_naZF~nH{vyxjBrY}SK(^nAx7#T4qM6?AatW2i=w7IP*9&AYi%Ltm6h|5`x zPkd97i10H=GLhVccw_qFvkhU*AeujwBSzq+8zr*www21b_)Ka;?NQCE#2^dXM|dE7 z6vXLhwN;j71J2RLf!Y^p2=^3Qd{|~HIy)wTTn9!ivu*h%N$7jsHt*sAn^$W-#{TUj zp^goR%KfTzb!ObSs{n34KdpvGoa{39Sy%4s@y|Cd{TT4#Nih zSmwt0zO7Z80+m24#TOUNArEWr`uO&;cTSG)n|6}7lhOnr_w=$jf9BaJ*9OyhFgp^p zZR`3+ogk$r<@Q_xV#lowW!}}Dq!tuyPeCegPjPLn`g;!XXD?f1L^NZBu&fMgcJ6+fAd8unGBj2G8?K{ND9t3d;UIb3EeR| zyT?Do#NqXTOD#dD8+3|oT@M{nET0#W*J!#7W7|k$KZJiDhGqb&F+w`ez((x`(c1&y z_kyck15|pufB|U=QJ0I&lwJ%9X3e%qHYZLjTbV2fC`1uy>7D$aCpAQc2xLN0O{WJv z`MwdgK@@aBszC%7)(~3efMbf`bmek6)ckmO-aOMNj$d0WkQnW7=XnHyQx=H#s+jQ^ zP5=;Ec#lHh=f2y1C;Ddp+-By&-tGB+^ z6{s(8#=XhZ6F%1SQa&mwyt%wG__08o#DKNmc94ahB~5ja<%PPT&v!!I74|KIhu$nA zN;zgJgClj61laV~{&Vlxk$rW)VA9d)k>Hmpd28dh^_O#8x->smbEw-clZKs%9 z%OIycfxR{M`N9W1(+*Y&3Dg&rVMBb?-YBa0k-RZ5|En{P2YMn%>T2&_CXex{@=x|1?Rkf zvE0;edcGNM#)XgXGuhQ zEwuQGGtkf$ibvQEY6YmE+&Z)P<7MRQZJ4cTBBE|aJqwQ}<=yNhWFz|Sg&SIs9cDu6 zc$|+di=Nt8J=7l`&k(}3kX5C{8ydV(+&AtoSSzs$Y`>}oo{}EwSN+a(c+$7(r#VWK zS~L~FnPZ6cyfhr#>B0XXI=>I{2a)S)ekk^ zq}l;rAz~y{*!_pk?YGbwwdi+1iS%iYvnL)TFoE4L* zE2P0$_4)fpKo|ZFu+M@qRIFvi{{04lZ0$ zMcbuWB|w+l*Wzfdqgdw=)}-o&A!ge(ipt`P@2hT6R%km{X<=#$+Ehc_68eHl=bIoI*2&dOIVp z-x{LDQ)mfp*Zxx6@owP2pRCM%Gb@@t&`dHCvqO+&?8M!@?rONTNVAH_0?x^p_)^*q zk*_o`?vE2zl=C2YZlwx4S$`mTC0Vm5f9tIV1^~Fh^ChsFFMNK^T#Ilzmm>s26V>{= zH^QxpkkCVR)~;#re)`c0XYp<$wKDo|dcx0KP119Lf9hPMIC21~!$CjZ;BYUx=Az?$ z(YaOZ5BQVQ;hKtf=o_-DDP0p5i#Z|`slJW+eY|q^iK*gGaAKKN@zaS&sym$%d%{^Z z@><$q4Wosd7olAmrSxq@MMX2^Y+ejbDzKHRKy$_pm)m=XJ-+YvXxX@k;%%#2;XLU? z&@akD%~iz8B~^!T!LLzw39RnT)M&Jc0kdmaLao2@;*R8!`2Dr1HsQhn$APse9)h2P zQ30wUcpuI+39i&>WVBO~kkRZQnv@W-$AmQQY+d(Sq9syx(B`6Fw@I{3{tp zGwbgC_WramyV5&$$qG(I`Hhsf_NM$Crbf7u7+q`B0~K}cI2A_Vh>^;Sr@TSzsJBXO z-{jfkC=zuoTt%=yXPFmg-(nwLd?fScCwkF(f5R(U@QTh7t|=6qO1Q}EeX~cr%6_6i zTFWY0$sBkz$?*m7d*5z|x^YPgnMVHwe~`@uH|O-ETsPr7?x(Bacw2X+E8$~MRG~P- zF|vHBOU^bp8I}^D;?dbkRqG*)h+1HE>-~OpFoidt z`ORT!>o-}uQHVB}d}S7h5P4^546FD;`1tzALSJdfs0gAsf5zCd64r&&vDHXT@l?-S z@^XBr2oSVTa*TW{Ac9h#2>!CuBctvV*VB$b%AU;m6@~QJ0QeNQK8y|a*<$5Fm8L=T z0Q98sy_$)Bjf}Xb>knrvyykO1VervNK4opX=aP@Z0X8q6wCn7=u+RzAq0M0-II)_f;_f=Scr8e(oHA zkc)=MoA)kxj}Yf@|6`jJL1N>SSnNSeKotkDYbD10;%HAS254|%A@{;V{C?wTTCRU+ zXrJ`VJ4af~nG%|l6LfCae|Rh$IdbWVjHBY=zrGHdiUPujB%aQ{kj=ej|6c&@e^f<- z^Z!e$vX}H2_sgOG;8L}lP=35xlwe2+NR%Npr8g(^1U`4-nS|6`7aa*!-W3+Cy-=ns z(#?pP+dkddI0oVLzNwuN3y$3`D%Gu<4&mZ7&J`d~M zIsv%G%3W;*yIPt!zbbrm>TgN6R|Hf;szOhh2i}@!_2bpP?3^=`HCEQR>eV&7rSbcZ zCS{uzpdjv2%A^Se5_zQ2`40tjH=qpMP()t(dk+S`x$3k?(S*y^4$tsEAaD+U1L97OM~R`S@__Uw;fjQwvdCM~Q5Op7 z{Wac4ck2SwSw1qdT3%D@0;~5!zM>#!rcWM-z4Dt}gBd35^V%6DkQupJ+kW665R>ap^$vW@>~Y=onqA>y(JKXFeo)?@NR$n-deKJF5y*igzTm5b(rRx|=9 z;aA74p7FWvF{Y;0<)hg4KMi6`iaD3Xvz!p&Z3}amm^5Jey#C&!7_G}_r$bRrV|+d` z<8?Q2zqLMvqwCK1$zbxDtZW)Cz#H%Gol0s5yA%Q!a|HfuKbD_;$rd}9P6z4O{;Mr)16MZ_ zcc67*zsF{C~o}ae@?TlDyafhbbc7 zxZ6SBT39a`zP@Z1q&l116%n3#RBxNAja_Puus5Zzi_KO`bUF4a?zYE3o^;0ltlGl- znH8bpY@22Pdpmb~cKS?Y=`KmbWF=zRICJ#E-A`7lH=%@*R|o*2G~r1i(HYw*jmORz z(z?|`$TCP^nch^4YC6@(lvj_6OgaL`oUnV@D5wh?GHLL?qP5%_*Ht@(6T4n*q2)C` ze(mqBWoHJ3{b?|Mcc9%a>$7pLtZ$5`Fivy4RIu%LN`YMYpl0Ffq#gHM6E_)!PZveH zETg3>aAjIktx}t;(Hy5^b6j{Metj0fagoT~RCi>$%G0&h)~PWZG};6ALt&F$#01ER z74D8h6x(NvOby9;BW8F){U@n2H2ZE5pDZNNjy#rS(&Ot6W+WWrEn>t$FNWX|5w}8k zUo~-*nW{_0rv!@7%OTHpc93nAQ)Qb$?k;)&2%mBjd#FW}#-i*9_+1{SCb|HXT9n=3 z`Sqm<*!6saaRKyuyapO{TeCE-zxav=H|}$T`(NwM6RwqhCr^TjAFX+chJwKW8%|UDWX;OG@rQ zG+EPVUN#=dPnv;c+Xf0~p0coe=q4x$u%5;%o))a)yzHIOrJ+EPR-dcp<-uoy`6~myeHwa(jxw*8fLnYg3mO{f z!}_1|ZHlW$7n5Zc{7kBDfbe8;4z{~o*VBkMhJ&9!4c`h>?Y}hubJOBYD6;o^wn-@K z&B8hHAEA)}0R)RifQ!9kscvD@2&90`;v6UPtpj_XzF$u7tz57n}#n2)y&2p2o2E*ok86ov5TGY^aC`H9;A4FCjgI zHBsewn4O-rT$_I;ME=hvP2k{yKL0X4&3UAEQKzWKleFKZHg8!&LbVDi`4LzKPnL<{ zG}?IsbM*0jwew;s`}qUOZI0}2u-d-#L~iNopHcp1`}#TTGIFC}2d%{((V||q);}*o zel%EUH2AN)ehS9lvDzH;RqGCTNMX4HmMWkaoh+{9e275XiP>?odGV8*O37jZ-dclrxA)k-axIa?;OFWdBR^C46JPk*TOx6U_-hS8ai7blp3daf(Gc`=0aZXM+wyI`xeJv zZ+h;Yv(Lq#u1&B`Kh*8AZUBu=vX7tY0S-FEfBZXvzzOg&WAP z2V25I0D1xaGw2`gzru%9gwF`oG`|yTab1IZNj~~2j5H4Wsi72)Dtpz4Th#bqUF&v+ z(l*}9>V8G`Z+B_k!TzotZbw(taM`9S9X=X;T9@&Sho7ylW&hXsU2sVTs#n@~Ge2MF z`)&_8TfuM(y1UM{Cj0vV(XMtqwkx+^aCoqL2$p=F4)2CuDj3%cU3t)-^@lG|j+=9= zBy!mw>`ikFRWV#L#;#$w=Dl#1GUh8ApB1g8(~%Wj#AW%EreJkV#iz^pr<19J&!jCM z2)EQ2{hg5N;B)LBUzWC_raeSX>_{#P*gx$?OQn5c-Q;EOTv%b+&oRk?L!g`QcQlWeqlgR&9=x09oM%#%{-0{q0NFwtRqYg7|k{%2Cj%R^Eh4{Zu{ zoR_kf)EZ0d8$K#qhGA=_;UcQXT=b=nLtx7m4Po08Kxd1g-~e7$BrIYyoZQ`_u$h_wt+#S!7}P5gxxig%}j6UR#wNZjy3vN z$6mp`&j>FMqXFx_jhVU~RqN}RujeWor|TR~Lw3ideovC^9mKvbGxj5>aEQF4W<@$Wc9kOECN;^FJ};qlNtYOB7xK=HI`1nfl9{ z*VVtpMvSW(S(UDcZjV_=Y96<${hTGnrTDKF;0YfQp%Fyu(c(Y^talnqHlQRxw@6Jp z|CFAE+noKOQQQ;>YgOrkGYu?T{FeaJNHD}SQ%CA8ETj2xjU=iE4N-91 zo0vXQvMC})0A6<5u?CcmpD8<26Ed{?!(glm;WZs(vT}kqLG=6dmHsDkzlRifug7_B?cF2F{M#CcfcgV{n!?%&~UPDelb|3{D9cBQ-bAVH}-r?%k@)o4%epm zy2*^|mrJ=e#NNGR=o<fj^>#nr=PuTY-AgkM@LrE6jMn|3LSM4M}do%$_`Wj(GB z0N(u2ESuql>ye@>Uj}gQWGW58-n4|NcilP-r#+Z!9-Xi)Z1QB2Xph924onX@6^AYW z$pd$~Y?TEvN^BoUkK=|K#dve^ZQPY6W|-HEd~v>bJ$u-3XCtcy^L{~@(JBIvDMkJU zF|u!!uhOmz2lZ+mXu0>;i)6aIuKU{fwB~lN`*xgp^Yy+Q1i9)}WOuzZ+b7&zMBiPY zdHc}lpV-t>5!vg7-daRHHdoFqsgAw2FNv&Eb&po8Cx#XXNqhSsPP}Z=kp5N1|ElJ* zM_E*uf0y-L@TXdks3R=Ohoks~29<+&F8B9s*}o z8|0r3uV+^|hwY3m;9-??zNi4X#0e2urD~;BgC*U_Zcg7&sj`Ha_9t#Gj+J+zXctkm z19^xiip%dd@Oh0Qkh}|fQ#MY@cknx~0%xDM5U_^D<8l z6x~L5j&`muLz{susXBP5Pv@A;QO)H7=)_B2M~ArxYbQIf|Le_YA-xvje;w%t^{?tO zPhI{!qzaUerUky{`Mx3b4@q-Vbh59{uPNZb*WRNiLCmNBisBux_OB6dn z5}My2j}cIhmaFxo=Tn?=xdVdb1kdJ4;|bx&YjwpwE%K;EWUPJpAVj<4qh%pW^bze3 zR*lJsXYq~VWtsupIC(xgf@e|*afaVA3_BKAdsVlKG61r8$?89;!ztM0aJ%}W#Xfi5 z5xFRkkK{~v0DN!^YHhOF5nl}>%H=Ra5&fN-y@*3#MmUuWfb)b-`YRR!K;c1|yAO=| zbTd;_5F;PlH-$VnW>4M?LOv6Fv2^!)@BJw0?FS>a7La<`Yj-+6`1&mWbpFSly#Lr5 zB#7EhX;V%GVnpH}*1Gqj>~=_c_WOG$&P8Q_`FGiFs`bjdXRryJk|tIX^oW-)VVb55 zeAh=$S;3hmep#{IocQ!iI*XXE_uXPbPoqI*8gwzhH7ESV{jmA!u>DP&T0nOA`%-Zv z$*KK%1A`yG+eCbrZJWr2{26$>CIWEdiW-l*D`VbE6Ge4mUVNHH$YQ4dp(>2qSFX{8 zQZJR~HCBh>IJ#+4@JxJ2U3t zRT44~w#0e2!;^48I=+%QvUd&Bnqpv_`OweZ3XY}|>&>D{<@HsEr93&GpqE^(Jn~m1 z&q@tX-J}iUrV&NN_4kB{EDdLt2Ee<8(=0c`8t`Czp)lR*&*lHYfBil4WsKBW{oOz-BUvhwY}G#9C_IM(NFAorP+{Q#UI(eAn_G) zeomtE_m;bP8;%R}?@8*6#b^eR`fC_Gige3o8wK<9rH_hy&50Ge9$N*iUF)M`j6Oe1 zuW)HaD~jnx$bB)&b07^vzb8~n*@9cWrBNq7joUKPSEv`j7r3qEWU0n(B#8{*oHuZl zq%|HW1B$Ah0N=+HjN)~~-|XmZz|!=XgnKb7%+bt7yuSRV<`{SMXu1EU_0B1mt&nX- z;nY>r%E%{1*W;N}ZLk?BIqdDnxmoRo_9-2uB7XB97M=#o>RNsJ&o*nSb(|*!wES#; z^lDyPMT0c`BPnTX2T2cWJZYOXydr+#(E3!ux?mA61LBz{j1iiqn|@Z%n8Bw!SY_Kc zv816YWB9}f-&1#(A2r_7s;32pX?Wvd2j0xX0z`Mld$zye+{nFTVTTs^-nDFie}Hdj zLUBsVG>2V!#`H#YhbA@(0TVK#+nu?fc=E3r5r|WO_j9)?D`fBMS-dCR4qc;ezxTIAVcN5fSK1yH zI>a(L{W;rL!~O2*&Zl3|Ut0Z6{pwYti|f_qsg3y=0jHuczxjI$@_ZgnAqy{1gkq27@CD;_B-frHd=R5rhg>^)J-Y)!FxJRki=xYwu|O(vsx zz#g}G-G82F%NJhX_9L*pwy1OXZ{VTX*07=-h zapag@-*)was_T?^G`)B1~h>)4b0ny&;nPCZL zYRTI}xSo@5$=|E8HOkF`H0a#7x*-(>4mjQ{KhR$PXIkBppmTf}o(hFYWqg`=?3Wvo z<3u*9w>}SSQOq`>tjsd46&wqkxKKHm>h2zYoLWV#0Exj76QdGi(Zr}aV zzjhZlts=a>@P64JJ;|btCvlh>5*TqFydFvm`iLY953uc7r1xIxACa6OyWU^m-!w5w zybR!^LuVbNRf<;36`OhE7y2v+h6#la`#F;2(sEqIYQ#Fx2qB zFsE^KMxT@OE+isC=48B1tV`GL_z%7z8ue4>Tl3uJe{*>U8wH12q=kW%ZE_Ld*qP)$TDimT|NcC_rgcNH72VL)+J#KhZn5Vhujto%lU?W{ z_|BBxW^Ss@Uvd>ombYEIHjF2P>)5Ae;I#xU#}|`ft$!8QQ>j0Jf@6#5K%cSp^5sUD zFcN`4tNE<2e{IWu! zrD=-{LwR?O^>jHzY|+DEF;=JEjrXGndoz9YY;;F1V!2^{qRkyR_ zJmyZcn#qt68iCT}e(}>huFd?R!r-DfA&L*7|Io#*`qtz%`nqWQ)%0!=k?0uI)A+h- zBRL0qT+r*0i_B0<0&>}vitzpHi4ox1EsLjSk-eE~3+FlK2#%^|t-)ces}y*6siP;J zDM494o+thKHu`+coOO2Au+?MIguE9w8{AFpNQ>d;P8Sn2BeDtUBY-Z%S#qXUv=yAJT@gqg~E{|UH8dTo@*5NbWE&xZK?M|WxBLVlHSu9BLyzZ!PD?$hWCH& zg9~MK4L;B~1iuT{ybLi>qz~RPUXg!Sc4t^qo6C;CrQf^mBspdI0m*Yx(%T>L$FkC| zBuhmz=gN$t1t7=3GGT6MFjeXO79lQ4Z$`HCPV4Er=PfB%WkS~y|32XaqX~H;!;;J( zmbW7FaPJ9TTV!>z=vhHsw&~QlD33n4FWXVIc_|;sWZY@0I2_1o$$8%zRq90y8%jAt zE^SY&F3)L$Hl)7xSFY>OUq|+Ilo)u^+xS)=h|ERSGz4tBOFDSnvI)YliG5uM~W@9 zqElvWxHMiTM>#Up1I4>xz6vE(v{HD{C6J8#Fm0ovs5D7wPyCT_FY-&?$%9=mXtYGD zTT-4)43P_tI{0XCT5v+?l||dqP6k%$8)v0P@6l(}kdQz}#a-ma67~mzK^Kb20nC{> zzqqO?bc5O@lYn+*l4*v>x7~&dtZfw3vVg(~P5ZR>deJWmw98x^vC_?K_dD8pYhpsE zvwKv^MJ1v8vm0X}$uY&4#4}9}ZN6@KoT^uwI&L4h%(&o^__Dvw@*^}~giu+* z)=R9k8+AwF`o{z?e9d>{sWd>MWXV4ymIoG`U`_+!kPV$$kaC z1T1sph<3F~V_K>knzJ*dS|#Q+7>(bV99FzLSE6_;NJ-s_Vs zKZuc=8Tp@}FY;fYZ}5DXPE3j2Y3#3K30BJn?hqga;cWg7ZJycW>Y~{wwELWq261cI zgn3D=7B+9Ejh@t5eMASr4G_4EvBVyCkd^a-0b1 z$#^M)Z{iObgWFqqf)nhPhj=vWNAwA&f$VXgZg5a1vk}?TBflw54XF)FOmHcbIib8w zI#=R5$tTw8htYcN&Nh=J7I;!2{!U*EJCdrR47d5k*h75#oN&o6?(Tf6v#Pp8<_8%{ zfs0Q)9}2-ksNQ$~id)R**#Yp+Yb7m4DQPo3ASY6o(iEjmQ|PwfRBpa8Fm1-z)=I_Y zJ7=u&q5uZ<#dI4F7mDX}EAWuPjqyYc34&y(_;M&ZV=4FDt1Gov(T* z$mGbS%c2Vp*@1n#Z4tl2|INpX&ikdN=i2eGZa={s@^FTeq&Q>ztsgOg{wxcI^*zOL zmrCqpPEBb?iBl+Q*Z`w4xy*%NL=0Q3G^^T*mh1}uELz{;uLtg*S2=rfc2+zb3Pxqc({IbKQW-?~pSyCpjhpi?!WyE3z&2jAa`ml+h z$saVmmgu)}gxz+{uVd6k$(-+5_uj-!tf0>UwkYdDojJnuKl^A`+PG_UeTq5DdgH+pE^vTw9@Uq(Oaq${bw7 zkJM219FM&3OUt>N~onJRa8@c*OhE!gT>mu+3#-Q6WP1b2cv3GS}J-QC^YB@o=* z9fA{lAOnZs3|tTU%sJPd>)hx5hU#DSs@C4Bg7HVu8Dl9E@An4apXZZUCaO;ICDCEP zl~4qW3Abm$QZKY)DX_@dA`sw(M~P}P)aNs;wN7Z(q6aN}RzYxXg_W#y4|)}rbTjRh z2>~BcHswi1g2l|%NjyQvd9-!)Es!wQ(zjTFOR1hljmO1^{yG?>=a0qH{?NZLX;QXse8eBf+oq+Y>8SS|_vRx`=%|pWe^2Af|c9Lm*S` zwxCm}78ZFsE>e6$dvCA_0;7$5SPr;i;xLv<0>CpC0AUx_-%{_idQ%^cFvtR+PCzKpF}? z#ZfHJ-D2}_ZMC6fU7o6>!hnfl()QP2z%-I`xw_&Vq{@3q zL60=xLT{K4p!@N;l((q_=j1bDG=Q7r2aSdPF9)F08e<$L)YWZs;?2DdZq0v5fU^!_{XDg{3I zga0M}W%hFl6J;5l*V06L%5klh$Ef(h$*gNjRM?odl!RmQwsg@?6-1+pdgJMsO+0%S zZAMC!KQ?8YDOBg3`AhT<$Ud2=1pIKy0kpZ{OVk&ne+`vELrHRBH%XFYR{Pai0i0@! za_!v$P?Xbx2oa6wplHqc)2r-l#w@*tJ*MSYM^bFFO-rlFrL)6d9-1)>t|xwbAngV{ z4rv`%{n(3`gP3HuKM&|zC)a^jiW;M8PRq>MTA6?py+;4S)41`z%}Azx966JlG^Wzf zXSQ=dVzpP_A4|tbFW6D-dvKUZ4EFP!>=k5%s?^`FPGwXsHLeF%X=ssjt&&q{44#~T znv92)sZzs+w8z}jwnyJy8 z%j)jvA%OIeObvSPqu%Mvuddp`bXf&R`<{b62(G&DiXBb6NwM_A-<|V(NmzidbI%Ut zzs3IDWQK0>|5N-}ggSj9_3jCmU4xnFY;BHVZ%E;w4T7{uVnd>eONwTQ9?l&h(<-^J zSxUDFq|${`e^w?w;dVMXPJjoSjGFy|mz}1pW5;kmw<9|rf0E23Q1VCEMM`rs9E-HkbeKd$)JMaQl_e^$|&=9uD3d(f`DzgLE zfmw^^j<1j2F;=AiumF#JT6(=J@?&^I&BU!SM#98T$XHNPF$M+|9GW{OEsxlf{HUH; z!Y@7YB%~8q<<_BXX-N6eq^Q7F*h?RXcncR#*33^qZ6o)mbJBi#9VVL}Y7c0&>Q%~n z`t5O_p}{}}9qcbi;V)Lf2PFlp;QzkA8MtU+?Vs^!+)dy0USd|yQd0|J7g{tDSXO^E z(u0EOUqluqFB~V-Cn_mlpRVg-QD3kmx)Lfhr>NmTt6|ibLNRj=Fa-&%bW*;op_!+j zCw9@~GIiLxF|G)UVslumM;=ad6I6_za62z`XBDh4$>_ts2F5EkC=o;tod0kwqjD!v z4C8HD5g{jsw<`i``tB2xKguaT5I;U6gmbbJyx&1?^$4E1RimAYp^Vh`(~tC?SJ{8^ znJtHQ{w^SzS)DeT&ZWToCnfru?Mzv?pBs@yi~RjEG+&9x*c+^v*p)ug|MhD$c_&6wB5epv5rn?oP3o-DvW^smcEU_ov;hm^ppqKFbwo>C1R(L%8i7Z z+5=VUPYiIUX@jD}A$0c=cW4;%9<)7$Zs{R~8Vu?o~p z-#WhC9D7aIp?rFONqx9ms^Rfw>_Y=1Iz<7Sxr1FQ0wbAuTF(FPKcU@!1a>OF8uZ#Z zAy1!?k}OYUy5ctf4i@$yEAQBv(2Dyn>RFz*4Q5KlqFe zMmDgN_E$jSb+9OrS8scw^jYQ-;avC_=?nHvS%KCEom?`$!`;StjNwFhn-TrX0b+I5`apRPu;r zE@}lanaDQ(x#uMef<7@OQ(?GUg~JYHjCZ32Mpq z!06)GJ1Od5>oVl%T$UGq;B(~g6wr+$JmApG<7R7$9`dgj`FD_K0{-#CwAdn5;Od)k zY^}H5$xiVram0qtnl$2@s^EDo$yxQQOHzmGHD6`?X;stx`d)cQf8o0tT9*6*y3{gq z9hp)|Sh9}0@L26q)nkg9$L#W)PESFAW3SJ;7eSYFoysg3VJsy}licSsrjk2#>Cae; zK2V>#HwvM_-P3IbC~-N%yBkOarz{^nuiQ3M*0LdY=~bU16dk^&;%cm*hQmtXNkPr3(F4S7aT(}^ ziJ5Ckk?C41Z`99uHRE&^YqvgjQU%zO^SV z%)Z&r+Bd|nU9DPc7bg?TYH<&<#~W0oP}l*;>Clb`aH5=9r*iQ_U@m{uWDVyP9~G%C z4c_eb!|CNFNGFcwFiz)tg zSDI$K>_>hb2Bt7|7o(Jl1;E&`19&ULdjOHv*geR?_L^h~O-$xo40xU1cj|Slo1`II z;6MRFEhqj!5JwJd-ymP&#{pHh3D=8S4BG>@T|U;=QIR*;bQj4)sOBKO>W*+%pI?@S zEqig;^U1m`k`cV^)N$ZmV!L@S2*TENEuQ(q1cFdfd*7EIU+%K33{;}8U+A=?Wz}A& zrkPmGE|e|>xifL=VNvUWTxSdTPG|dUB#5MHkmM>|$xX7F>>cQ{>Xj~Iy5BzcEKgIX zL;lJ-!JQ9zp$&!>NdF?)6q3(|LlaXL`6@85dHeXyX-k=_1M}?!(ly!PEgjzV_&b-N zt3O+8Vr}(`Qiq4kkbwN*s*OMH?;+2`E5+ZRM?Fsk^@O!7>-BkNa`6QUY9MzfbM|_h zc-qo6D=fL=sadJ4pKfC~)Rez4+;4DF!SQg!iHg&GFu-8brY`%R0~ARfWNQXH?V0?H|@>Ac$%jAKviO+kaKGGlBo8w<twoZyy^`d?W31 zqM>W zLUGBTS2^XSLDW0pYKEe(M)o;<^K5vUIuF()vsI{Wm)ypVV~S+(3Uok zqXYf1tcxZpm<(kkpkK|}0h1J4AntSC^7cM8`8F9d5}}aTygtnM*&x}H6I~ZB(slx& z4D-G*KX`~F5t-t!VDj`Q5EXH-_%q&T>JdLc*2>J=_f%dnj}FxgIT=oF$ioxP$K`Bk zvibHVBCuVi#-kGQ0jgNq!V2fla}!i+z$|(+BKiSq86+@UgX>q|fpN2jj3+Tc^5-`K zW-`^p_$V;RY*DA+A3c$SQJS#wkg?mpW)JD5^mON|A^XgFB#TnTuQL)@3h4Siug+lM zrr{I!O?igUWxAQ2wOOOldAQg(plVlwP_hQ=tX0> zzdJn1_4pq~Ei5@0&ngb=&?r}=J^@*XUMg24&R4l8)<{*aj@ZT z%0TSqfK=-~`D>X)t2b}Y%AaiY-ifvoK{u1silKB%1h+uZy1P3BLq6ZFd$V5DV^Q3C zcGSfwDH2jY4N`=D{2q!-uN_U$uBn1_UrB zcoBZV$&s>*5fD3KwR;Fka9L6f#F($xEX_^I<*+MqvcOM&hFUI`RA(=PGl{@Jva;8? zd2nzN%yo6L0|hrSWZP@vasO(czKQL4>`C$)q6IW4euCY)>|=v`yGeccz5MZxgyPfj zNi-TCN!#X&3E3eIQtuZbf(K$w9E<{zZ4`Rd4rMTh*9xjZ6W<3fU`QWlObKR z{o?Y)5jmo&dN{`G%;nN4-CAt8dz4~!T`!=at*iTdymlIf*CdbdK8jIc7Bzzj<+^ad zKkmB|53sZ&JNma|m88bJ2Ex8rwm?O}?PWj*bBqvIE9R43GU0dZ=aFejPL2#%LxVn& zan}Q}zFI~Jm+H$VCaWQzbheEgGA|FS{c z7I^0$sarH`F!FA9NRZ7OnX7jKYUI`|<`P^fn9(J3WG8jeva{c>RULoHXGvH%ipK_} zY0HIrJH_CUpJ=;QX0Fsj@S_0K!Rr)V-vf=hMXRPQ68)o+GZy>C-vCyVDHk=1PchDe z$nR07DfzMyCVAZgl!?>7p$p zP2m!cFwf8-YZr_FhX3vt*?~-o7R58&&jVeVIWj5JMj<`7WHU!N2R$mvyw2O)1H)K% zgck%uuQIfKke_ITSw|$)7tqf39FbAr-caX-K7Avl6^p^BtCAqMQ1iHiOuWUUkY<$o z))r}vKUMc5$v;L*lO%oS@C$lx743n|x(fsz4x`G$j~!e@+Pw2C9vPv{mZ7gJ;m^Z2 zoeq-9NAAHD3=RCUaMfBpL8uV--qB@`*AQJfL+@|Pm|L6Lkj!nBQ+TbM-DKRZ1jJZA3wzd-x{Z&cyG6n=k3jNr_*#%V~>+g{V9BihO+NmMUX$v3@P zd$h6MLmT$;EAJ9_BeV3MR&)}qm8{5tbx1mMrToYcN-)~ypTTs~R}Alc+@?}yu3&Rs z==j-qp0L6f8yi*J+KxS)q2kE~~pCTT(0JCcEy;$Gh$W9A#O> zQmA-*%k-hx*#$MqOvJuIte8@UEN4{jbLUT_7-Z)YDSd1xlN(HfW{5CGAcR1?`|)dP zGdWtmVewfzT=QTw=Fu{aTri?22_Lc#84{`1^qe~sRDOl5Rmk-LoX5BbiD>@Rhe%L*BkED(-0j}Y>9hz&cB=+%D+7Y=z> zdr_y*Y%?#~Ef_D*e8?;lM=87rCM^tj>HD}&eiK8a2;6Ul@kjDIO}fX(;PrDtm+t;K zhZJ~f`V?q)K46r+IPDVfEk}(J3HrCkAIdgy;iJqF2*!gkEVpk`4utqqEp2X$Ek3HJ z`BKj1?fJ1o@B4^XUX+{qfq+#Z7ydvN_i5>Do%9P~7Sd87A9fTVSx04TDCfsY^ZyPg z?U(bo=OMF`F+`T1mTNTQZb{XQU z>7JY`-ze5$8)BEzQxML?cIxSO-*|;ZK8{MgrPZo14JA(_uksTA2A8s$FYuWfa}fs{ z>=q5MxnIjFKX!25CrB^{m+@8 zk(e=WtYDXPpfBWC3Ftt2?PSbkn=Psg=cXNQb4l8w$}^M{zF{K>Dgdz(QJr(|02r?B zAYLA1y1LQcPYfat8x!AzN&8y46~7R!_9Txi54~(AJwyj9s5%lcNs3T{+0i-(M^-+( z|CfXT{f~S|JEXh;PhKS2Y4z2w43Fy`pRQeNKNez|_R*G&5T z@&jmTh`_I(esT8dN|~cgD32@2@t%!K=Hk#PXJa4WjC{663|K+YLNjjP)cJ`hInHA= zW-(liadDKki{&_K{wq*$c!G}p*p%O-wTmV3nBA(_JRw_0WU`FD{BZGho(A0wN;z?E zz_-S4HwQA=FXRE4dWoG=0e$rnax}P!;pg*8lFSpAHrcUmStSPe`r;b#-lJ(%ZpYV`&*Prcnjp zRhSEB-hm%rkywJ+?4k3|+0sGLC;@oq($^;uLylg|>z<8_^^7*xb;Usy3e1n1bTs*c z8a&B;c#?g28oazc>&x%O==GuA%nxH>ISVt;*M5)Vf4Vrk`1UyC!htlfg*J&Xz2TS8R|{CcixrnR*X4oUui=s zlT>-ljc6evH16_EyI?_C3|os4K50Mi5cFmYN!f{p!IKTeTWplz5oZspZS&kSxE@z2 zb=U`yTdpwiqWje~d}+T-wNOCWY><^ity3wANT2_>%fg~XbRPINCP@2M{B@vh+7?J= zG3?eG?6fb|#rocIOp<`Bz$F;}M1(j1ttWNvav_@gg-A#DYmZ+CoOv6Cyl(_k=qsuA zR;NesiZtR2k_eI9IZmK@xBcc!tqKb32DsQM8n3&V8uHvc)HlPxp=1+JRu{x)>%;_g zmM0mqczC-(7g@VJ}Ct*?U>{j>lEa*^2ej3{n`rnb@ zk(}c_QpC61H99@u8pXM24o~nP5f7)4Y=L%HRP_+|;}l-44sO<=!U4;KeZdc25U61O zK9D5wkOl_XkW-|+L>~HK{_hikt+>E_8~3Ndbn`R+G2S95;aPDs>$(HLD_NB=6`%(`AWc6(kYV1R?@H&r|0*R?`OSvXK%?LzIX>J zb}3v518qMt?O<~SX#!i?_ea%w{v)f2#l5t(;$k{C(6Xg9#g!`A+!#0Je8k)|!8f!5 zI7#pUFv3jZq2nQ!D9NwSPPym2%-ZBcen*SbG%PHNkKGu2ZgdzYEsZ7@DHN}~b8Eer z0Ygq8U{ZXl&ku~GG{#*fwPcg(gz4`PaSg{MjN1)gw+8~J-@=Z-O(+O*;ZV{*^Sq@% zINH2MS4f|$=pTYEzpnZE!c^m-A6C@dT1Q=+1T@^Y)Q}fIbD>X8ppf&Xw z{Ue}EnAY55nVkfZOY@p~1!@q(8l^{iP!MZ=$-o%*hq+H^x+h!K%38T0W}Vi@;IRaL z@o9&A-)DiHhJ4sfZ*$ws?`zfZ22RMVPtzcQbq%~rM+(TJz<1y@tXOscz&v;Z0dw^4 zXO`$-rkK5YBh-KX>m?6dVE)HjH%^!>oF~X73ajS2X=lY!USu(AZbEiOsx9DBFy}&C z1f@4r%tao^?^s|>EbF>($ z4gn%)@e*O@2QCRT$iZ5vSNxdJBRjs@byqK_U(YB*b9Rmmoc$I<6T?9mGv1I@H2&mc zF@a~>&7|GZ`5Zjo+7d4XJZQc_bS`??` zSJ$I@q;?`dB%Ab1B6BTu#W(}pr@d=o6_!b(nT!>G5~U)%B3tNhJ#um^!Gnt69NZZ| zBh1!&c3%bi%|zidbkKpKe@D;wp}IsGe5rx5h)^nE4CQ5BU>N2M?F4C!uJ+=7IvJsq zrdTDZg^IiK;zI?=JJV)m*jtb%D>QVrL&Q8Jx^T_S2$BMhVFSz%$*t4}$brWBT$^-U zW;wf1ZxaR)EG!?Y)maabKN$hOF#TJ+i6HLIW8ZO>ICfAz4303)~r(RJz2t}@5sv;{y;J>|ppTVP@e@U3#>x$^@A6~UC6 zyaj5BRDe}WlPjC7z%)K~p;5d0Gu{m^XmmO)%%Z&VCO_51`(GB-HOM7w0wzA%g8~wp?A|jo6RDU zDJ(juCj*`?cde!T8dj+8_Ru`Ho^?36nw8vM1spXJat;Bu^bT75Lr3&WhInz8W_yNO7V0E@Ouo!iekJZ&_}Un>0>bnc$V?; zExdtk+bRk;-bW$F=Fr64yc8V{V zE7B}+$K(=$$v~vXE6MFo&k4o1>qT<(D4I zMceqf9*T>G`wDiP2*mZfw!Q9GaZyx^;U@u~ZI7oSoh@b=(K5NJftaX56@kYmgG@Vv zl)kn5aPU^z9yDBPZy&cg55c}1^~sd@P0}eZ>AJz!X{ptmqslCOUY3o3g2O({2uhJw zrk!{cD6`U)%tl+o;GTWh0AP84kA@7^csj{LRLT{_5_CSA#+mrWh&(lgXYd0}3En;O6L&ZR*dO;Ao#r zzezY3NI)S?yc34O75Kg-ynZ*=>6dcLg*(8p64X!c+JrsY-!uk?11{(P4SD}>AN-%T zX_j%9`n(O3_U@ay1F&$RQnS*gyNDQ(w+bpf^m#;*O6mSFQ}K;B7|vFF{?!KRy>aUh z>hdVx8$IcjXO{kL2GYEm@9y^Kteqh9eRox+tQZl-OX4#0?&CD=WJGKF0a$=L@KB=c zrQ}K5szgg>TKtYmbo6k{ShM+s*h;Ptei$)Fl>Xp~#16nH<^y0L&S)o^>9#-?N+LF(-2z|#x|c7#Lyk(4$nqRIsWziIcoe<7Y4 zi6%@}F>zS9H9)>-CO9O*sW}Z5_ z*)fWcP*bH2LZ)fqr%Xvn=+w^Gm{DYR#F2VJYZwf46EqE2-0H6c=pjrd_Ool5Ojk5~ zlD~&c8?A!G#szM-6WN_MHMe>b8p%)L2S{{{JW(!T|vAkKt7h zUp60aeuv(6;He)?p#mM^cl&=>09?EJ&O)$_ku9Id+%R&*}8#gAoV* zmzWom_P;c&zX6&{x~~v_F{wi2q7pT0%_fnJZWAsMI`96HH{*i5wjWiFAG}T2XVKuC zlq3am|4_|d0(j@Ubjh0Q2#>>$62NWzxj3=YqBf#?D*&{_m`NHh*{8e2z(aaACro-- zaeoz4tn);e9o#qftTN)5~k=~&Q(nzYBgt~Ctl%fh@A~{4<~19h2G9x>N{p= zZIkvE?q7G+F0vF7i4Zs{g5?L|NOFr{gE1CJPsbVMSXD40@WglwQ=V!&#KiP-a+1& z0luDADo_3|&yfbbkngV-xNo}}gYQqb8SHmXyI33vjD-^bNCO+Pjd5r&0nf;$#6BgpNV=r~88gPUvqBMXn_unmR z`B1r!#WhW}v!*{+JX@@*C~f}?zOV>5)~?%q7X z!olzPFTL!c9?yQLS-pAK*MqkPKTILfeyqyix;`)17FfH5a@1qu6CuX5;|5-hnQb1Z zo&TmK?r+J8SwA-hXSsl$Ziu%p>CdRpqz>xiv29L;I%s;~&Qxh_M}@MSh5s2ve!2UN zllANY6I3=3*B1q#mmg2PjK+SFt(y7KIs~1e(-q&`*~Vq*%?k|~jJEIyS`^BG=u-BI zgg~pjXLHf%^sD(TeAuvM5>swQp$f6nzS+<$jQ$2Vq+JH{)ob;3z%+`8*+PJCQ`H`Y zcX1EvSsqtt3Z?GQJv$7?8!3twtGiGtykYwzc51FIZY8 zO4iekAm?U>{OV}oE@srhX{Pl|gc%8ta=;#kRdxa!!y#dNGFsIq=@uz@J>SCZ*CXTQ zg|bKgT*1zK7(${J$wEWZxGP? zc0AhDkgHA(QViFUlj9R7K%z9kGl9}cuC^Juje4O>~ERv`-r3k2o?++r9@3bBpCDk86<Fr%uBA z^)&{Bc3;~;bi@ZtbJl~Rvq}){3eqiG=Q7!O?fIq6yEhEqpA(SA-FiQ0S4%!QNTndg zJcQOt#*_MB`)2V5>u5_}mF@Cz$?;6n+>Ue|o9%lroH4}2Zua!aT-`UL>8|(090D8* zq*d_-TEI+8Om7Fz-oTTCx|w^lKnukiUOg?20K-mu8U)wQ$%thx%V#w9i&n|-y%M+r z^c%2C4+#Iq!NBy7iM_tw4?4gsEI6m+$q{UZ_G2dR0)_(P{>cIr%;7h(X z=YFn~N`0WpDXVUB9as)hc-{+D*`R~hB|~xEIR}z$1umzXPx#0zo>&U4Rz1a^<2aB^ z{dxrGL_@Z1rluiFh#+d=fcSz@QQHg@~v_3h>}X#+p* zeNvB5hje*?>L(Tqn*!s1v=Cue2d^V7T_5azw_CK!(h`Pi`I={Ee3gqcKojm)-qac^ zCgO1DM&mH;Z>eLvBZ<=)`UBFG8zR{?NYk~-5i;%9d^jYuhE8Z`Nxs&OcDOL(>~MT; z;lS#_q?7r|;rG{)eZx}#O;{JZe@FO_e4YF!v_TRmfwWiUYP9D zaIO(=@ZI4&o*?tdl=0$g1}Z!4T`JYq)v0t*qJ!lzksbZM`&n9KzPI-;FGkg(QRtYl zJd0a|s>97rhcNl&<8}ce(t|Zj?%+_*WxXV~Rz^|xUk^ZU@$?w+z@dBPk2%m(#X+NB zW-!Dn8k}y$QZyUB5g#7n6P_Q9u9H_kOM8j?dfzahjX&0moK*Xgu1{}&{;lnZ*$S~< z$0HMClnvF>L_TtAnDpFwj>HN`J9oD9!+0kYuhfN}$+JJ-B zkuJ|N8C=HR>4WZRfh&cZf@5n!V$Jpi4Mi}QyMDM$|NO?mvopH} zUmSvl0_N0q7rpu-{nsTiSIFBE8`YvU?3)JV`PAqa?Gw>(HmOLCvbr0^_s$@S(OA<; ze?;utgCYX){-F%mvcg6+*Z@fKEb<7r0g8|&_b@q|bzI5h5pR=ThmN8)Imu4t>UX^^ zqoTPawzPV}B1Tdj_p=OQR#J`KID^BH%r8EOBex5#JNjD$|_- zP9Eil6s9M5x|s^~ncQf!`MZf9QCKGde1XORX)MsA9h1ev+g_8cx3{&2NUCzdzx#to z`&a-?d3(VP^lOpd|KO9fD8Fs$2OLVY&IxJrpVJ2Dbk5WYBeC2=!e$u)1+pkV1YqKa zJM)JNf5-({07D=-6?*~ORwm2ZbvKr=Ul##=Z?~xSEf#xH|Ibq)^%L+CQA5O?_^U7s z|Neo^ft@Vj;#09_^qobWN5*}~5gwFn z2;$EmBjUv^6;m`Zj7cgL5mk)BaVIBZ_!8K1MMnXq~|YDoMC*j!={e zCVwP_(C$6nbsvFKjhR<9pb=geBuB8*6SmIJx~1xmaKF;Ycz`s0l=20PHM93e2X1-S8<5U~x8IR5Y+l;{8K9&#(zo$3C4|GJF zo))oGHwed{W6kE8i%von4Zmx~-}P@kUh?zi>OHx3V6JBxp+hv|f#C{GI_^abmiyn+ z{hK*qFM#?RPmukJD9;~KaBQPZMud%%vxZw~uj0ltw=#IJDzA@knqp?~DA|<*>xJF8 zeVQ*kbN2*5EaP;hbU?a@mt6179ZFAM3aVu}MS&PPTcQ`Wmpb%S+VO1fzV4TN=>3@U zTajZQmn?XBL>&UHUKh?_KD>bj9Em*q@!qaBo~^KgY&A%1g$QY|fwCyDDC2HacBZ7+ z1%nJFw)K1$cdPCA3#r?tExrl6%sxKfr%QME@Nq0}K~0ky6tf(i{A*{=UeQ$6H6j}9 zk+Y*fZL+GH?Fp9TkQ83@nx)Eeg>eU$hAA9yST#ddA-22d_UiTv3H#XIkcZ`Ko8A}Y5+Fd_!KG@GU8;JSS)7ll{|j+mumcp z>A6@JOtG(!ilUFc?jRExo-=D3-K5&bslW1>KVEf?e>ASJxV+P>NNh7v-IXr=qxhkd z`e-n3E8sH|!MuyMo(X>Raf*1?fNfo610S4U>ikB6$h^O7eLlayg~M6r1(>&?iBB$Rj~C-)jqM zmTIlb`>4s}q2EaM?mH9Kja&ZhoYydxsjuni+z`D!R@2}!h#sA-QE!0Nvln|kB!{~U zuoi1ljoM3rHRmws8`+_U0D-(Szr&AdI3Hi?2)QWWuwj=*?Tk>FEQrlGQvgxCK|*wv zYkzH!*=NOY^fdIUGAY2}Dp0dBJLUec>*A|k?SW`w}o7$J`?4-|UZIp-@0ijQHU9l%xifPWHt7)AKT zS~XE+?bv#z4W8R@9Z}la>ST{uyfH5sE{+Dy5h0K}J?aivHq*u39s^QbVXOFk2rogs zp~C7DF?qyJWX!;5=f?X|>KuHg9*Y4yjxlsno!ymGV{qciK^&1FtsCC_763J@+zjLHtj&8-v)m1<^DEZLVcUMGQ0fy7@h^uba{h zFEvYZWVZS}P@WDq*|TPf)l7w0fMAX!XWjPpHmlR=+X9i#)rprrka-%NTdy`l?_?lA z_emr6N*i z7bX(*(OWyDtOUYF7Z? z-BXitvESEv8$_z|#`Q)xMH0paa0cFT@Aa+K%Ny7`v|cWcc1}6kH;cQ=&nT)ucw5s>^wm?l32kQoO>2z&C3|{sBYkNyF_e@FTlKTmUxM%C= zxr_SrcZJKOI#WTVM?Lr%HLl&q+_Tii$_scE_jI9s>=e+y5X^tvJk67VDBC7;(2K?6 z4|(WCrVYfW1L}Qlq@(d@_Z;3c>x)cHW`}g(Wb3yV{`fWoPyAm7yJR`gM{{c6;CQcO z#l82fQIuwtT}O_fo##D!NU?~r?x%ngtp0LZXLixd<_9B&Y<7`T#!={FY%u10&vd_a zM62l@52rP>$yya;>>82T%n?0XvLW24OleoJV7VTW=N=RP9~HgzfKZ(ln<6FE4PiF*0TBVLl4c!YK}G@C@lY-F|z9ot~(2qfE7;q}|;78H1c!dcTGC=!Cpa zZkv|8et!f625&TEo@w3dRGxo0q-Qs!q@!aFb~A!}N**`Dd|>9)pKn$pQwe!1>2%my zp$8tw30ukw*+qWnm((+cCvXz|LtI4|1&z)R}&d*Ct!;a)_kS-_hcMQSakm;|Pbub!BBl*HO z&p%S2dkvB)#);{ymtiJy*hy!nhfJJMFGRr~5+waGL7LFa=GMyA<|e%p91CE{pQ%vfCp12eg+iq*%z*xMau{ zGq5Y*{bBL)ZoXG%Wu5Qfg_P9C0wz8AR=~n(J)&%dc_8?hC??rPCYm$ijSNAW;lh*C z2<&Mle&W&tLzt8#_TT^Sk1Z{+|IF!RUVWQoMXUH}A<)d{DaONql(c|x#u*W7`GkUG zEN0s!6K(sS|`lB_OcEU;*a#_AL_}{KPIhi*f4%NeKp1akMYY3 zPkwJBSOhg`N(lIQ3)vzdubtq$DTW6~L^X@+2q)2l z4jb^iDNhOIXtV5~NLP9NRDgpVcSv?{+EX=$CvNN&h9$NAK$s#oh(A57OLZ};G2dmZ z^)~dE&{4}N13}C6Msd5+y((l$_+-^{FfBarUKTV-ded@5=hfN>uf> zJiU0IcC6J{6!j)rn-CU0Hi+QsK%Y~jX*B>2mm zPKK0Ja5^Z;p0y{aI~WDOzzIzPMHJbq%LE|gmz4&*67gq8wHHw6CxI;_`bz=7oRg@1 zvi7jNA%4b;Afq|0x?vrKxczuUItMSUK`l~Vp(@xrKh|<^FzpdrXJ+I>kWPcdH>03q zB#&`4trv3$ykPKQM9_}Iq4?NgupD7_#u$ff{AEDXRhS6Fa4K|vW-EeJIPgMvj{fP{ z)xP#Drgtmg{V5&NywCn3Y!vbVL>eLNYir!dR^tZl)-f?*x!13{t)$03lzJ_Oasc9W zV-_#e#3~f&39sAQY!@SX-i*g@$}NBy;K>F;)I`(G_L&uUTo`R{g5 zw3tC=kCk8(T;!QPT@NnrYf-l?S5I(6F>d;si?VG$T0a3K1B1v9r97l#D*#}t$%j~I z-{c5YfY&72?1u}E!-i% zuHp??1W3-j5OPm(wlpWaq$D2r`izipgIE}FF|3b5L3Rd8<;F`HcD77Ec7&Gwb*Ax^ zLM(qav^1%f@bR=sK*0uDdfDl@upYT%4u8R<mTX>j!TnT$a;P4Y7{TkkSI#DTng#>-?)+UO;uZ$@*8C52^RFmsRV1{r)iO{;_2C!@&T( zoFHD=`|~;wolX89y52G<&UJ|vh5>>lxVr@c!QCx51Sb$QKoSB37<6zaxP=6F5AN>n z4ug9bbOwSm3|#I$XP>)wef9mAdaI`D{nhW&&+4^ScR!xf;;c@RP&pql*4EEd%Vm6M0uWmR;vuIhWhAk^RvY?vIfXe@mfQj((ud!A2-y6Ab(*-70Rx0_FhmZ63T~&QM-CUP++^{2%M1rgElJt5o0a%`Aa8X2 zy&3c`1+_&C%g}Q{y(iE*+B@uSWjO^42MQC=_q17?v_$yquv&E*tz|MteTMk&7Porq zA2@2h3xSkUziZzV%f7li)Poq?+n;Q-Jy{;iRWK85;L{3)&G9y0!^JUn{mjJY+OA~w zW(HrCA$T%-|5$`czUmIDhE9?OwtULLScnhuJ<0CzSMtUmI+${gIxFzaD3z|$VUx6oTYhXy zT-%A)e(?FzQT=T{_|w2kA4YY+6E)(7lBu!j3;3&s>Kdhc9K2!zipi^+-(?J6(M~v< z?9Mu8XqT@GjTdm65iWYWwekt}Jx)CjDSz!qP{kZYHtTD`iS=(&4P4>xUJ^{lDx;!V z%)NNm%45~+@bSbU_s5q@sf>oigu^Aq!-A^B9qnwF;{KJD)!L8ZZRJA0WLX%N=F-Ic zI;USVSnXZ%NLq1FNN2xaY-;h>t2NU5+Y5lyRZFOk9{h#;>Xhlp7da>|o~1vT8dE=< zydzRp`eJF*+y4+FJ81+pnK!6;xznubUHp|uk=2({k=~}v!zu2pEVcslloG@TcC-46 z_YR?Wp2NA`->ZglQSD1(=KC#D9=G0BjRu;f@iVeERizu3&2s3;JxU$7t5({*cVoVY zZeCc2r^Ca-qI3&qty}Nu-lp*4>SLC;D=CB=WZTe*`UlIU`N>5xzYulVM|#1e5=K&z zsOl0IatydH9t#_5iglh?x5c5blbrd8Xui^SS^N__E7o9DaQ@ z0_b$RpND=YShfn$8H6@iOX-3#eCcDEP<~%Jr@za&Xlr%c%lKyUQ)bmRMmqtBjYDLn6L1*w{n{XVU<9lHgl?bJb$eMz$4OdSuFXnIhAz(hjF z{Au{>wX-!}5_wk92}cvuq=Zdx-kw6io`NZ!*ZtlOX)F(77MAX$D8+X;H`&%?sHz&| z21$E(^O?*aK5kgoqxu_;n;YtBZVpe9nU7yxulZTY_>e(*Y1iC6ag?ck31IROU|*0O zb)Qs^wkn3e+D6e?=;54>m7&A{L=fBl(Z1jukDB z2nlqzdZ6;{>J}6^y$HHMUWP8##P);%0v*~pd<64iico$PUngzsqD2mTyuWmmh(s+F z?8+S#9OUjWX=JE`H#6+(lspR~u)CouSC4U_`502^3e>^IQuL&eV!iE&9|lf>EptXi(}Ljg5&TtdK<|1!KED;{Q6WkVCBWl0asbX z?^-ZgQtc)@3)?i~Q^fEWwgq{h;obqPk!55-pKzIMdc*JCwIuVgz*sO>P4*~w=Zt9G znSTszTp4szs{Lo&f>fBzQ5z}lAHnX6l*U5(EA;O1`+a^we@4nm7Rdc19#qwbcY24F zd>-<9HRlGc8Vx??G@U#=j4D@=bnhf=BNY30#xo5f;>nEWWq|Jl26tk(9HyVfSn~{t z!`mce77>L7W0su#Lq5n=>aEbT+XO1Tjk=TM&&;jG zhwIMrjOeMu4wpM)F8D9efVwEx-WnFJqG53OZ7oZ9LF;*h)*f4qRNLTIf|4|&BkQjH zM)i4u@O3amhFBKl7<##tiNip;$6^U;pW3Q7D|Qb6U^4`VpHNS;by%77#UFRbF%&!Y z$YI17%p4Gq2GiWRKaJ(M$%_wN`?CfPQr`*#HnuCN3ge<(hpz3M8(O>zK|RBZ{9<9M zNcuAj)q+AXVXZ>u+q`)Gi?Qb~IwV#7>8^}_V0?6qzx1Ancy-uap&huhD`46%_4oyQ zi&DDH{?KZwIfh7`lTYlx`m0y+7Uisn?sXzj-jcK7W15@YJivIayv_MSboOEuoCdc(?Pt zk;8D%7-Q0$^j!QLQ9>~pWCNOu#F4v_4bLP2uK2GcV)_5?P(Ph*Q^0?N--nHQO$h>& z)M41#mC5S;RynDlo!}a>b-zPf5sdY+ zo4m$&EaAi76uGc1xopxQ=kBQuo7R>0|Af3?Q3-=imjfaVu%scn5n-1qm2PhfmN=7g z4UEcV9@7tQbZ5|y$t15^MRSFkKJYmBC*uM$GJN zl1<|q?=Ll+^HWv^&&~S`2;W3P$g`l`%iZK1OSlu0z0Y9($wEVnpE9lJcg6L#EH&$o zwk+m~A*j=JK~v8H-Ga9fUaR6mh-i}b4bCvH8Tr1}jwe1e=fb$K3bi{#0^@?jq|zH# zqq4DbZ}WUV0~Wnc>@*Ps;lfah5v=xI5A_8~5$mY&$*xSJF$M9l1OyxXQV-)B)VGA8 zhKt<^U`ntsEeos219RY_j9aQX`ADE!4t&6mKD-z(q%4w*DRJDn3{7!Shc_trJ+Pb5 zu_?pXpMZGI%1bRJDyHOz`h!LwbzQ};l{dI@+%8;Zm0de}r|sat#_K?R((X^ht7ad^ z0xo;v<--)3~-(<(P=l1s6pvbeeb7ix(W~-m#~UP zEL7~5HswkUyIW?X9RZ)l3K5~W$+)#=X<+NqVs3Dn9?IA&*W+hJgiT(5z7Lx|t{x{p zd1CkT^$+W4ef=OeV1+x;z-ENcYOADVxVjyzhISNLu^c9w#RFe5@d+M!h#rFvy9nUQ z>ZDla3wvj9T1t`Zw%}MEe3M8YIhIHYD*2|qui8X&Jf!`iuj;DfYHR%piyTvE97s3H z6l8+ihCz%Gw;Y=CCh4wn3OLCym6%bNWYzL2ms_q~Km9wz6-$*LO1f3GLZ1A4|9N{%=OxeDM?JX6b3Jr51`8PuD&h9@^>H9`JBoGxYYUf+~ggd?y19^%Xh z+R!og0^)C4ZM;hCpZPe3T-js>@p+$`to$l}yE!hcQM`1kG2FwOW#`Fq|VV}{IAJ^mZTubKmA zrWaw{EdkOjZi;KNR#U=<7wsabBJOMs4e;-7wogaeyATCCO`= zGtIH*lSXW2=~`&02n!P)e`_00f+)UmyOAmJXSr-5G!;i%tXOM}{pl+;G`^lz6MmkG zza61$z<0ivz7R_Kwy$|2j>Gs^e=Bpr_{$3tRo-ixb2`?=)ji#9W~P^gP(toq)L zuat@a-XzI+pr!yr(vj##&N5RiI^zu4NEs~I`Y@=JO8<-WCNT%I#(-=tBp9R))->su z#Kl+IrP#~wm=f&r!_5UM9j}?v^+>!jNn5FKC1n?3=3R9wDzpTjeL=Nd6+~kvaJqpX z5rh=Xh@8SDws^ws$Tel9(dUq-xojq^7uaxKfYex$M+0fFR^=Y@L;Ne|1aW}>q4uDK3=hu}56sX?j!CI146qv?@D= zk$J4Il+UV*vF1t=HaCdCPdgAMac$*6}l|)BTi43PypB1m$K9{0bZD>Sp z){$AeHUdCaGOSNIt1B(CecziP9Zcgm$>~i!F)5RN#X|`79;9!cE3_AlJZMTVr$pO} zc6VLEjiLDrzTcdm_pom_dM{Bv@)M?3)lvcci5HJUDnRQsOph^fEnS3w@XhW&-5Y;N`1#`JaL|HqAON}kCAX6tsB~e6@BnP>^@*t z#P>c%|BuVu>m>fB^YtVVC7?YV6RgQaPX+37eeOf$5ob++ekN(WVETjJ323=33^iMm zB$_9;TXTHz#(n+Un|3j?`+m@j$AZ9+674~S?eD{oMCK~hzBq_bCIg_Hv#6*2!}p8j zD`4kNiP=<_R)6S+urF?`bm%=Kezp;Q>OZgQo3sM1YU4iAX@O^{AJMDHw+#5$%?saO zXf*3NKV)eHK7sdqpeb6>C+Kf69=uEq>3ogj`F=`Zl!CjAB2HG$z$|KQ0mtZI#q^u@84frIA* zErj+~5t>fxcoGxE&|r`ph5t3}EIn4pnUBpsl!ehrfz;c}i@3YRKqX+^pCuXF5A9SF zVw=QZP=YXiT~%>HA+J@MO+-WLN1wsZ8LergFScQ%m;UbPdxd`8zF+rXk&Q)AiF;FE z?aoTi6-YtuVUfXuVZd~L~ z3>6Ia1yVQ?+@kp>Ky;(wS?FtHP59U$sfe+MG%#QkszrhsCB~4P#j?b)N(kJYc&Say zFr{!G@hqt>=KHrGgMfYUYoXN0K``qwo~LX-t!iwT3+U^e*ltN=9n=}q-hnpCuL}3c z?tYvYu4(tCl1%tRrpfPC#;ALZSqzepXpdr?YybirlK9K&SrxxIM$eFSmL*BgZE9Np(s=@Yti=bx4U@ z85U(^{aC3uM+7CR9`PuHLF9JcH%EfY-6TBBrL}$INxFnrpBa2L73q0b;(P5a#62Jw zH@;N9c<~qcxa7eZqCK4n@sjaftzbqgv2Y=3S0ujA#)^&Yk6)Y^XOrK8Mar$$h!ZuE z+9!NL9rhm3%PHkDDG=?eVaza>4Xrx@=E3;*9?bone(@OgOn*;VoxmdlkFM~q)PIol zU_g*X!21_nFed>(#|s*acBm$`EQbEu$$a0kJctGeLU6pWoOi_&qL6EE=P$>eXP6zo zSy9*xf1t#duw`OeN4NZ{#4B6!EShhWONK7-pk_qfxZpx^>7~bW+4O!!M|IY<4`Zom z`$H3vU?vP|#T!%IL+k8Y3Eqy;EvGC!>@tikVzzS%YaP@G4Vw4ZK#{arKm2Ujv#se4 zM(AWBlg`R@x3<6ho;dN@tfqU`-5kjJi$ThUgLw|4{m2#+48b;YD;E{6c(I==5%O~P zt83x!GHkWJ+E3`x|HN@z$gD_zm2cZ<+jSR<`y{SwmerB2&p_%_7WrOJW6|ZtKXsCu z&#VRKs;M6jKhXSK6N7nm3jXN%Efz4pZbUJ7UWe?U>OA_!an10hjMup9IS+!NoF;o& zfFlwgfiO<8&|O@fa1Emjn=2jHGog?v-c_UZqgbisFD!nyS+{&dQ_*F}?t6FDksFAy zYfV^mj{@^`4Hnv?lT<8Irpu9~zi~JIQj-fZ%kAf%YR^DR=lOG07Qy1j@*-SD6xX?u zaTO33+kvKec7 z?QDkyQ0`HMKZ8HmHE#%h5IKP`ucs*j{0%g6 zS~{Cw((u1Bx?7$O@<}L4>Lub2`&iciFI{t}|AzRL@l|82dd|P>Kau`#__truq5U__ z>+)}Vl1r>AxN!8}1QqZndDVk$?9SlP`DIw_RbYEWvYdLboRxcne%P3G(d=uazM&gK z|IuHY52&jROD#U28T@Ng%Sms6+y=p|o_9Qwd12Z7V871OOn|0}6grlGzADN7)YPpw zDxlv6Nkwb!g?mfNxl?HbZfu0Sf9Z($J793+D{8STM-70^Qad#v)cT9!Tj?;%tc>Yu ztS;Y_jO}wC^MP>cCM359kiH$a$q>a&AxgyYgtcn|oeP@gv6!kQjZl?yLR+H)yETOlaH z;cwRtwOFVvwd`||53?cP72Q@|c&hZZJjCB`iubB7$Ob(J|X$;^+^|*bip$2wU9e zUg?K+Bjh_5O`6()l+qDgjRM^^XjHs^Owy~2BpszUUrXb?rXLXP zIeW2Kp@^F7h+w+$$I0nGofeC17}W+AF`J)LRA1!yS!f?Toaf~ss_Lb27gW47SVc?U zu8Pjm1CUsxF)G2P*7y(=MEll9q#S5h^w=tC?03oSRD5g83h!9wL;nfNf#?L!Eq@~; zt*GoDPIwC~00+)MeGv1A=VS5B7Aaa$|MnyN8msj{_3RAZL(3JK)NIQwEV&Z27XM7g zK;?|X*js83cy;dF9{Q~^XN?wdSziE{%K>ZYXMO(%DJQqx8u|CtP9OtaS;jDRmN}%` zjGor{nil`!*zluzxo=<}*{_*HWeuo}5c=5#?Amdg&ukDzM6* z7BP<{qBE$81sRs}?;N=&-_P}-S>1u-Nx5F4X2mw4r@0rA zX$z-0=Zq}mO^gI@HkwH>H0LCzFcz22CDEAqc%&_T1A+C(S*3UCp6Xt}9bce59&9eA z&@OdFn05r0Zj~~Ini(uHNt_%vNALcD6sQzk14oCaRTWWSs(9{osQ9W_++W--)Lrih77?4+re- zslE%h34b!JqaodUu3^nvnW=cXSvEk&^6lwT4`c8vqKuZD2(1Wx*x9cv;kMagR(mV0|JReoL)8ulNv)DDiCoN zZ-sSid@X7tJtF2@EV@s;8*Bi*?()N8@+NzeD7tm>6&>WmeA5Mse7|{R&%{8P1|sk! zyQTMjTnyfE{D=`+!`m|#lqa0O@sz^BuzG48&3w?j<@0Y?Iu04fFP_I)K8vlv;N z$-*w$JLKOn;p>0YDX?0B)G4g3mMUqw>IYesOIcdS+}C;3t80gn#m$i{32c@xmBl6C z&5ARG=C9)i5>oQ%Y@GQqMtU($1tpz63=U=z1V>6|K`vJ>V-39M4-Ii_Jws?{RHbo1-KHP9v=H}vw9>d?=WZFEc$G13w2{#9edp+Yh8Gn2XO-mfXK##y zgJja{DbCM-;F3TqHFL7hp#k0&Dv~^(e(!hSy%;=-H0<@C(Ur|uY;mTUV<*XBA;oj$`17c|ONO+i{9WmUj zQ+DG@5_-exH^H5FZK6W>MvwLhA}EmhNcykO9Vn~p-Xs4@X;GE_o0gN!(R0+3X&1PL zEKpx6M3C}aw|AxANO-zy&YwUIf}`WlC1ToYg=XU=7-k~%aCMQenPnI`kfkHyDGmKq z{p`d#%Wa&`M#D~MaV%0G2E+ywn5%j50S9=OyO9ik+Q!DOcjmEH1^X|biHoz+R7Qlp zK85CO_vUSHVY;_akk9v{ALTaL@wTQ;qnq=}&0?H*4R%*ww?+X)O~dG8Kdwg|X8M}C zE+LLDGnjI4I=NpMNF`kvXz=gHd<8kVP?zC`{X}j}27Q`InUD@FH%^I8=UADM<9q|0 zHklAVE;m}Oz2Vj226D%JjDA|%Y^Bv_o-d>*CY~_Rj!Rnf`-NFbmkfcWNwCZh1Mv+^ zbAp4Robk*JK6vkr62`r57**78cm0@-p4lz;GuujxsvoFQlE)&rK3d~jdLb`++XJqwPJpDiy5oGW-j{JGx~>vl zRUIvuVUfsyqoXumQoanS#kK}+qW zDbq`5hp3w3hwB+Re53g_kS(j5-8JM&YSqXlz$a@_!268C9jp+yGQw__*y?R*r z%*v0e53eZE`z83FOX0t&O&^H-f8|~e27+Xy!lHfJAM~dI;;_P$S#C*D9G$Khy9lee z3X*irZQK-QI_t|J$|e+##K`~RJcPBNAZec_0;|VF<78nTJn1U<5V!UT7{*NV>SI1f zLHKiS%p9jV6zStnehvjpfw3Bi*{5euT?I75-nKsn4wnZ1_5z@);+I8JCE!oKMc0WT z$Dp2BJDJQpQCgQLNbc5qZf@!y*GA)g7sRc92z6sanK*H9#m^b&8e)&J1QpfKKC5bw zv9uBm{7H2l!bxv7>`}HFQC=G%UFa?yKat?mltE(_3Wr_w#*c{KGK5s#W5T1^Q zMqu@~U^P&JSc)r4yNq}A0$OV~AK2ZWS_dTAP8WP(7CZ;C$fA#v2YIH`C-jOaE=WC!L_EVm=trRL1jJu+Cu?Y++z*v`3GdJ1@ zf=zZ=3v4ZFr)~y7Z_ky1?Z_K`*lm8g#_EBvPBfZK|4C>-<%SXOxDr|Xe=+0#;|2f6 z3EOk@`YqTCHFf~f-1Ix}KT{GFE8KJSW4K#O>AS=zRP+4mTkA)!_@o8n|M^msost|^ z##-yK(dGcPXkO{}Cmuyctg5b-tZ4$|oUlE;qm605P;Q_fxGVqvMH>*-D+ed-CWR{({1=<4D9xxKGEvFvE zu$g|yJ>Sk-CJyaMCtH}lu2Zq(GoylHOU89sky1VBz(h!AeSRy7tJIFVy?B1O%g-Jc zqfSAW^b~^H)dww|i*p?<7^WuvZ;2huh|Bt8T-sSDY`X^)`+N1ybcvqkaANL*c?S&r z8$nmA3%W#=oO^p4Y^N@KTHOda~EJ%(uX6pk5^0?<96Qsgtm;4kovx zHiVQsv{?h7&3f`_YzuX;-yCL)&rVA1cKZFp{t@qvsf7F=)`<&0n&?mYa&*@`x#AeJ zA~7NQ^BzSj<4)P?FV6Ke@=cRw=)d&)65`z`A{fvL)Mga0`Wb}4Rv`!55*CPJKGy zv_HW?Dm8Lfi_qmwx3Fh)SV^`=Lc@@ zy8TOZZ!uBD#q0W9$qJdwUvKgJY{IsXLv2H>bkmKu6RHuMhl~VQ1d^`{iKgz=6*4g# z*HoF@ATxO|G+mhgT33_{dP+UgEGCz_3lr}yhTP-maRICzuU!!3TvCK$<3=@JGU@K? zBV0*_%oY34euhU;<|XfBvJTg#0X%t;&Yosd?Zk4iiu7%hm^~BjE5yVGYgf&arm`8D z^^`8$l7&EMjcFEy-PT&^3(U_KiS$l9p`30}p)CEbw!_@=n#+BDx65p3PYbb6uW)X* z?YcwJ`|Z+r9;$21O+FffXWyQ=*P|jgGMk4Z%ll87V)~va-~0xdgr`ZYQWD!*nhmtC7si8Q6RE`w%1oCuc=$T zR>hdga(gfw`YB~n4OEX>*+ae1ht78Lgp`+!?!&2*oN4n;ft-oGket;a> z^@-GO@V0hFU&NzeNqUZ;=sr_!^D-^G=@RKq!;{&kYQ=l=3fm{{mT^HQG{JO-H6}Hz zi|sH#$)9R72F4UB$YCW`NTc^m4dSMyN~H-U``{LBv3=VohRMYc3aJ^T!Xv>R>r9cl z-kFp+_g?laa|>fgL*ezMfxhCU)mqsEKgJKdk!;SG64xs3C^<5@#!g~MHlFZ;E`u$F zT}R{8)lyenspPoYld`0fudizNSK+)6U7X`{ipm`7(k>`iyRN`J?tZZO8j|+2?SWu& zSr6A;K3bel>pbGkM`<%NHs562g;1Jf;Wui%0@yB~E5zn}Gm_?<4d+egT}y7s<@`p2 z!eV8FzLgg&O{^Q@fEufzQ25%va-Fq;^7L*Zn8-x@>i0_EsPZYL85Wd_*Z3h;f5pM? zth!*a*z8dixx<~KmxmVY#IgXEuOjI`X`r2I1d)t$S$N&v&MAZ7G>b3Z!R=*{)yuyt zta#|9rs|U}ajdE6Y{Md(T{-3VKw2lm*bSjsFb<#WBBp;*Tk$tg#=l8T;LwoLJ6bMw z1!LEU+MaDF_>)_Imf@}stF*N&lFOiPMxT7$cekGQ1(LxHR7~xtRW>MUv~cw#bVA+v zyz&#loxcRG0h@HJ9%ny|5bvO5Wh)=D#^+d0E2jcbpnP9NxL4Z~C=c7LOU#LCTtal-gH8 zv+tI&KEsat+z)wlKEVwPiGr7vTlHULk+>Fs)+nb;8}7Q0wx;*kKVM9sPJjVLm)Yh? zGT&&e(W$c3dt$U!xOJ8@!eq>IbBY1vS;R;9uQbf|nF%v&m5uHnin$y;C{EWHEMJV+ zXNWgWFh)-hV;{RpjpPC=Usfv~*!pbDBY~;85Dpt&u%1VGyda4D4Gn?W5x5ik$S8B(4I;WF8`M zBfOj*OYc;YAK(ab_qKY})Wp+2cMJxk-M@TjbBfwAViE{?sv<95`JH89tAYK#P-+=2 zM|MTde(_tJ1FK%_5Z4C>7|q`+{>#(Ch4eQ#ei^hq=~dqlX7RG8vu^*^nMd{uN8qQY z0$7t`r%5l8#+0Og&}LVI_-VB@lNsZ6!J_k8HKt3WpYsN9`0DEYCww9v0zZ@1Q8RiD z@@yjKP^>~#7n9Gcek`^v>p3idi^=_u@UTz%8b6*VeTK8QFP#Yq1j3a4XE9%;;eV#3 zAvUVSD!xix8E2@dpE%o>D+woA{_r(=$lB7v@#^&H)wM()Chyaeh%9@jgN8Gj&tETn zc6QF!a?hkfOZ**IWz>H$s{ce~4$}Yl`ZfMsx*ttFM(}4OmSTwnIE9P8RjWu zG(Jx=?2@T{HFn)Dn+|wW`08ba#+q5|cWp}yIXq|TFr`GqcgpIALrmX;9wZtJHT(oZ zC;n&iY-+h=NV6v6Js4XT&m3bs3LpyO%GS9#_`fSEMr1t3aR)oq|74IvQ)X2Qgmtn6 z25pqn5^z$3iTh06n7j>I1M_pn6+d^pB=+BQ)44x4L(1ypY!X{?_x5$LNEu9fS$BUk zY617E4yx>DLpg5ko;ZCF2S;K6MN+soy&OIsAKXjK44=UxUk-;M(b6C{vsDN^o!nX9 z(#(rkyyVfxQK3NG*oLAk((d0(!j)SRopLoD-xq#W0a@AxI9v@M5X~!s3HAo1OpBy- z7XoekJQLQ#|9@t|(RX@+wMYo2YZ(!g^YWhCtr z;f&p4EcSi56pQyOT+67)ym@U&pRkZss+~o+&W#fpgyR$ZzCSFmtPMXFkcl+MVEMC( zzT$Z39CA5aHc-)kvXnvG?;d`jF4b*ofGW)K{{=u*bxnvROAmgA-^$^SEUvW_iKA?fw?n=aST$@-Tk z5-Q!Ni1Tnm5~q+>*I%up^ZP2eIIv%CQ%k=j^U%Aj_(-IrErQfdRn0PWsB+Z0CR4-I z89*ckc-k-0rQfvK(Ks7J`8+UMRu?!0O@G*0ckie&e*-qv>F3IV;|r*ElWOkVO&7HsIlDS}vO z92u~A8WB%OxinH9`lNlwLnk@9KXt1GPaham5;xVu?N}uw%?4g_MaJJ8F|;1-%OYDt z?~mR(in!v3`8?bP#}k}W8F)K^YIvS%GMY-^GTfUv$2pBNmj_z%Kh0+hhgmLJud4LC z+P=d(SxBTk*VM#J-~HQG!SFvz4YxvHE1;lm;_ylGiyg62bbary8aZ2uw6IY5oNTGa z&VnfzU@(;n-J+UFMEbBhO!u3o6iFri%qtcq#i203@hJkSgsskyLIxC&`OZ1c4fLq3 zhN_9m^l|^IfLN+!RRe6XryuIbUZYS2MivU4qUEbVyAHMJLNvCS1 z#21|Lv?GP<>eG_*w&dXXMNFLI?T*;Bv-rML;upqwP)kJ6r^Mz%bv0hfL!}!99$!@r z#M9Ond~*Pp`!Pz#=PF<9&sWj}&ilAXCc> zEk*KKBIeU;0+aceQ)@J)0t-*;A(@Ojslt$?6*cSU*la}=SUgr=%xEYzX~!AMe(wLg-_criV6E)VcX}!)*MdlZdb=V}aG>4;=h}$1Khr zFojS)Tk;{dMp4|kHSX#__0h1FJ@HFRR+}G4Me}l^qlsFQ>-!&Z+7!-kPTj<|9XO(QMdW5ps^bq(n~ zM~gv@Fh{~iNshflsmi@%DPl&RvdYEP#{xBrAnK?B{&Jc4Ehy4Zt=9%4FEiBS z{I%hCeE*f9qn_~QaI*fo8uvijYMk1`d#qfXi3 z`x?`NL;j0Oa#rbLwJ!mj*569W+)QB07SPjy?3b>jQ!2+Je-wpY8Ze+zBm#Pgx+6(I zkF0F8=wpf|!^D&R81V%R3q8xtQvRyyV$}Qc0=B)3Z}F&FEs{%IN6GZb$xK!|*quk) z_>p3sY^SZApl^nKS6GRG3DD<{M8ba2g3aZ8z)GqcgpV!Bj*;4o@Pu|-cT7%TM z=Xk4GA>R$|C2~F0GC|1iNgXd?DZQ0?;FIkhi6*jS5` z)jumLC<08Cqli~({!_GLILnazpHRF1@mKSSE72>`Vg}(kGUwUld%@lrE~3w!WDaX0?sm0R#=@@p z+LgygC$@s($$oQ|`*hz%_^lXN(jc^dx&VoH}DCG#s6?*;JOj zUcEFcxx~*tjTK3ViN#?TrxQb=a-1|W`VtN!@<(R7FhcfVd{G=pVgEZg_S-LX z>qngF)-Yyg)82Q)ewTXvH5lvbjh8y8Fv(XX3-pGs0QZ}bXqtr2rKhfRTVu|Z2iDu{ zy2>Yt;d#Ko9X4#Kmuh9S@pp)Z;|@JppTP4qb(~&Zg95`2MMcoVw zG6L&}zK@*eD|XyXbxsd^?n75SCf;LhFO(0hQ$WS|xj}JFF=IpMz z*242LWQ&7uPwQCah#JRjG%D)#n%KK$-#$x0Soys_`%T$>B(?%BRR?4aD)eikj$C7{ zuSS{yHe{Vz&8K!y{ZCyF2zi!|Y%T|nG5JiD>Kw!l8kHm#y@=7_-~j)e*l_+NKjII_ zK+0{T{-0L~-yaYE>CxVnr~kX`m1d82FNzLxA%zgDZwLaSJy`gJB zaREDjK#xbY3*J#-ahE8FX9SWI=exTymnZ@e4s{zrQ2*HJ|*ZgJ()yw<_b` zvHMX*P0~m})pFqpE9JX9OgrJ+f-zkUX6mDA1mS7As|gU-p-gP6t=Jm@3zR3hT=^s8 z<{jFU1Rc+4rktvTT~4Qh-q}NS>%Nh8q~Z4{L7pWc+LaDNqC2Fvj@QMAJE8t%8R+yN2xMW0z3RT!6|gGI^}Ua^O4XAb); zu3a+h^^qdmr{Ms6bs~5DT=AdeK5GG9)ei@N0wk+s>^h*Xl;ZCFvsJwo02J3kY>4%soR7Ff&krKikM6Fw_6Nv|509uPxQe zXNAZJji&M{vxdLB$L1FnWS#&&vm)YX9u=@WQ2h??cB3%N1l)J$6xZ3q3Rv}GF_9W( z!Fj6>#1~Yell>@6Jw990LEumBp(v=$>J{q(wn}fMcr!`a?0Mta`2#lrm!F^uixi)> z1}DiKz+nGYbhe7RYI=Ey_D5Yd{j8S7i~^n(RI+1(zm{5<*u z)s5YpYdf=nwBpyR>c8EiM>kC=EZ0V}Za+!^+TFC}^O|Ml!~lNP)?MA09`G&M8^;?uMI z(n@c%6BR6o7q+!Ndx&;*_pzE7v*Qc2&=K21G{-+M^pZCVG+5v>E{nx8Ztui{0biq= zg(IIxkCmjo8>^oDAGhb(UakZyXgPzoCigs7Tjv8^SV((jFNCuYL-oI8xj&XN6Lu6KhU{3FLP&7Jk zc7pq#DQ>fsQ!0L+B@3H+KG_zWQRR=Dr{eAAWp!MHm&NIiLWK0fuaRz6HqKO8-7 zb)zyP>?j7-L#Z}___s!!>G7RH($5~79}Wr+j*JkQyaZU^q!knq!4k~wEdufLf$@nJ zUY&Yq>FNrmX-KN4NbpV&7& z@H?HHW=qJ^(2>CijD|!(psfH_q=9EtaRbaO1*VGjZ;LSCZ(0mZw*OBAu@0(#ZcyPWWfYkx zN7pjzw8F%XGja|B(~pWxa=4Bj1IWYqJoBQlnGUGh?FqVwW!qLxy$>b zCe;>Vym z&$S62Q6wvSigYOV=9kM@fqvV!?F{mAXDp8c*pmm?X;x#W{(>RFPRqk zZrfUf0n)P0z1=kX;3|EETmG07ZJrLDbbqu8d|6OWiF*XvWb5wB=ZRF_vB6i*jJP;Xn4wba+Q8W8kyJ!m zQ+?&R7s^jI^t%%sRKs@Zq6OW5GZ+M#P8k2`?F}g2qe#zBSKld1)$y_AH`eQJKn9oN z&qt@PHPG~b?R$gIc&JhO;XSHqwUk2J)0a+OeNSy$4H3QVB-+UN3jbqC_O};6u2bY8 zN#VxK@cG5^5jq8aKh!VgtkN^tUSiWCNrV^)7zLDSR3|9^#QcBgdJDHG+pg_<=PkVd+@M7m>O2x%B{h=G}Jp6z>|>%Omd+upz7JkH}-YhS;8 zUsM_4+Mj3I+sevmn}iOT$qk<$KXPIDa5xQMDSqCGt>Jd&wn})&SX&)Xd3iZarx?&0 z9ktryT0HL|I~whP^a_(ba)npfiA4L57Chw*S0@*j{t7mRsKL_t z)d$%GQncJUGCgG48{c?JH!j{Jv&X(D`dhyisc(t44Aq7HWa!EiZ72D{r0QKGHbDyv zGPJh?by`abZGM&qlIdTG59||~2{^OGE$U?hpDK8PUN)O{j6V>gpQmoa(LUaHk(QejKcq& z>;de!5(0D+M|=bj1p{}FzrLGOK8Cc-e#=kY(dxc~x?v2_$nM{4-Lye?=*VW@R2-`I zf7A&pJVo1>ddb%MKh2rm;`$!V_~<>IKb94}?h{b(g8;iS>ZktQoE)V7A0n|!Zb4~E z-OiK6!*=Pq=-%J4mk5Z>G}l9dD~$yR6wBRv!*S3#c->;?DKlgK@~86W$jl~ z2jO)utC1n`rJ34hNGi*uuu$&V`y6dQFRanneQ$4%Q;v&pHR*cSB3G(LGns0m@&Hb(v9-3>n_&$SEj4 zZG3usmNC6&peHTk%u>`MZR1tCFVq8FV(01ipV`*+>VgWNR`KAVJN>R6_}>^O4I#IX z4QVkiaW7~1o72TRMg(B!8UuY9g+zu7OaK_i?VyH<3~ZI0CSv`RINF;_>Le9=4WJ$;pga-` zUQ%897GNH|QZ$I^J*^jKkdT_OFUL!IsmY8)hlNC`;Dj}0!tR@_l0T<_LbFh7x^JgD zU9+~r7p_aD*_x#{gW2Hq*?9-8VsQxR*`$iP!5E1mebZ{p%g!T{&hKXq@T&Az5z#?X z0`BEvgj9{|xd%RX_DuKGLV-gdgB9n36=K)e3b|(8W&?_qeVo^Z)P3G=y93YSQV z0ERNv>9&y7*9ewBKSeEw==M%4mMtK81ni#qzZWsDdqbe2IKfvmI5Ht@_g9VK(3k(i z==DAn(qDKw47pZ4-8+JC4BH#I%=NB-4T%1D}OT zG~S43g`A&AB`@&Gxu=@dgbL7Kh*CiY2&aO5*IpoEZ}vaBIEVN(T|V?9BAm<&2h?lg zCb;j9yLTp^1&!$k#Xbaahb~#^m@LM#H8~}polGhp2H{kl@0SD}kW+^wT^)?#6VOy5 zd+Hk%pLf3h9=`=JT)XrBe|yoijVvEsHALr%##r|%somOMgxer#aCq!eAn{cZ-InFB z=zbsGwi>xeW(C~Dg|6yvU}Z25E^j1J(3G6z+1I;N*}nx`d_+RMnqc!xk2j;f7REOY zr!jcGv}e(?&p*&VT+2dstch-CxM{K=^gmeS28d+#Gx7rJ4gCiYoiN#l%|9G3v6jc@ z(UJ2^9;WPos^SoE+RGr<%v7;VLS8fETz0643!s*%Yc#wno|tj8Q{%H7xItfA89Q0S zH-8pa&EZSp#WQ#3VT7i+`0*2H!_TiFG*X!4g{Q0bqqI(e)1f>Teko1CNUnjqWwYA1 z#-pb5STYg5j>bYOdJJjXLd+|eSS%Lp>Si))@OHp2`iKQ`VqVwmuD4O3&g?i)H%;LN zv{Mk}Fh(ZTf`S1A?|k1JX&r4^fh?c+MI>zMN5$#qY)1AYE{wdd^3#6eVTns%*kgF_ zbt^fiICQHA88$E5GbjuFh6g_eS0i%1KMuknnuQmgy?RQIeHBnpBnl^Ywc4I648!iJ zF2sLWlpwD6q4Ip>Yb=z>`>TG#Npqpc%VkTB!vM8Wb<-R*YD>XULVV6x6xJIOT2@Cu zX=yMQqL2f1O;KmpAQyI%Zxn_pVlN>Okxcb8Xtvv=1EK2SOJ)FS17_-7bS6zNvI#U2 zW)DVTf2ixymtX&y>&0oxx!hyF0sc>@41!AQS^tMCB0ShM+}d~|^mwD^+SQtRo9zV= z%@zu%)0`}#Hq8u870nko{tjck5zNWlhEc4FzmNKuX7{nLXTtZpW9u?5Qus;7^6Mt| zGyi03_UjX0eq|n?b!#FE2jHL9#Dp>V(c|X{JJ30bOT1Z~PV*F5;ipc4Hf^`OY@%Z!3u@h6oSrU!cphWUF!}48efr zJXUqP4$qf&XtIw5Sh=uGP4XvT$Pqo5L8XFJWBrJGK>+~YX2`!3m94vHfG2YVc71vK zeH#?uttV9fsoXrgLzpe}Ek^D@L6Cna3nclY-oWM`E2`b=tqq)>yOAD;7KwBR1ZQXt zl}DiRT@n-gicc)G&~{9?U+}hcQCw~t13hbh;QGO`mTVui+Blq5Cuhr4hD>=dcTKu9 zW?nBYsF3}?Ulj!N@$P^9%JrqX7OH^xzn?=8^bYZG2c`zXx86Vs>OwAGG^qwYZzZ>6 zQ62P>)9v}g^B~*1!ewnA0$8Rd)Twh80h40( z$B>)X-K z0w+8|v?DU%bZ@xkcwT&;Y)5L@1ZszmF$Q2)_B}hY|{G!#4$RlS@sCeUa^&dT`%*hq1M-P5)7q?mgNa=C}QUA5#Uc~6K7Bn$!m!`XnC{v$6~P>Azhk>eFv)j3JG;&&3l@zE= zQMVOKue>u(%AA2*9sk^(_l^*OQ@*Q4Ga#n|2X$b{Na;F$+c9!_0j1J3o7B)i&z1S~ z3$mj$6eqzP*rhj=U&Ub}O|)wDP#O=9!KAp$!@tr|y75WYbcv`9dvqH5^~sg-t%qi# zZ|TH)=54hqxd&G9-!Q;{JVr;!g|{r#lS3YqzIBU-zGBSSx6+!pc30vkZ6OwI$lUhA z0X&S}_!elMBas?v4mhUWm>Y*#WK$R+cI3t!x7Bryy%B)>%7)~S8Ng%x2W}!6gu~ws8AEB(LL-Wg22z#Sh_?zBPGdiD5MaQNGhjjnk)PxBG%%T_BCi; zze0I z`wi><_-SI^tv@7NT}ZeOTl11r1eCtxxOi@ah>0=4G&KGj1-k?)|1&%z9JM%(f$}qR zD*hSY+UPo&i*=|%F^Jd7XiiPcPdSck_h~!!R6pKR>KruB>7wBf8-Lv1=kF=(9;-&D zgjY~0I7pTY<)?MunXFIimQysR3mPx70ZRft^$8RbowPmtn*y<`Q!M#H@JV6E_}ra9Nkcn7}Z z>0LR6Q12v1QC;_INe_Y44bvh^)IFK25Hszu)gLcB#IcVF;!;${j#=kvBf883B=OA# z>sylNOW)vG_Md{5)CS-QSQ7DnK`BPXYbwQ2m#wy_u@BytAuMOx= z9KVAI14A@2!H+nIDLtudK>2jXeFzm%U#h^d;VdC=0NeZw>9n^Fa<_BYv2j+8k=y{1 zJCvcSdRMSDEpuz|e;K6y$){5ADXUXVnBh;)BVsO*q|za$`i@KTY%Hv7SJoDIE_#k1 z00!i{KCfXU(-e;zkpWJ)o> zMu2PY1|DAJw@Wt{c|^wpG+SjTlnNHP&pSH56|6GMvY-d2ZIwtccX5n!J6n+LsPY#h za+pV4yXsihUM2hu>>2%{$(>;`R1$WGV+eJuJD~KoEgg+G9y3HDY5YYY&xlJWK9j4y z)$ScMKj3`o{c`r>qa8tD1@oZ;Vvw-D;zO*d+$AwuaiZb@YC>5ejnNwFjbm{YPI*#` zMdj|v&gVI^JGh@+K|8`~);K-CL}Y&mEAGK|O{-0e7#nv`Ua+RsQzz4xl7RR8b@{3- zJUZ*HkkN_*WBSg|CX4*$$|J{7?7 ztGNsnux@KT-$Hfi8S#-T{KOXCS5dzQAY*31*ggtaNmdD5?0(sanQ#%ybsz_dF=j>@ zi%mQq$WL9#7xQ3S1#Q|uKKZCElV+IGYAG<{XmJ;zaVEBH+Q%QF7k$gu=YmKextak? z5zeZi5ohA`aO8Nh75i7BFZ2KGJ$~0vJV4`)MsnSdp!2%-j_z!)!BA7ZIKS(LZ@x4- z=Ixd{Dc9TC4N&OnC<Gd@duGL3ukCJTjgNgc(KfQZpM zLp(8Y#kyp^YY}S8&dF{#qPXgiMa}`p+5h|%r^mTGaV{w-?TPo}%Z12v_a z+zf6CT)QA+mXQ)%|1lj^07X*-!jAk)(FJ;|ff- zfT$RXwwu|LSf0*$qW;;*swSA<6@Sinp)sPYQW@g7q(-r?Ee34e>`j z#&W{6LIsvho~E|VLv*u)7Cgo;eQx>iLI(pX+%Yf$BteSeRR6DOM_9$;2E0<~1C1YR zjRSp!)(c+P*3PfQPlx&QjLLyTao#_6?}DAQhnMI&D{CYe32DxXMB4AzkpB zSy5=ezsB7BJOt!%D2yy2J4Cf(qo*-Lkof&(f!DmTX_*@`w8q$_i_S&QG`fa2ixc~6M3~p_)cG|M0@P)i ziw6hLF3SaLU+*&p;%nCVc5uUPrg?%Nuj8U=f?9l=qt09C*IsVVGuh%IZx~Tu@4pcb zOp9Oh83j@ybnSJKd5TS0U!B0q4us6Uj}Upwj4HAiY1m5Qw{ZG8Nprz|H0mZLz*=wqX6w|&0eG5t34`nT`Z zs>)vFjfC)(Oq%>6ypcex0CHJMbQy>ZtF?ppmyEDCBgCe8Z@0ppLE?x9T zG4IuD1v`#Th?mq~+~0Mj&B|{CmI)Rq>H{{LF%Mq?H!kEe-ppJF^WCcm#r!2yb90q) z8{XAWA1oYg#_T9mAy1Bxq<2WGGch5i4 z;U+vqtU_Eu^U9AVFL3HBL4i75A@!`82#XO=_2MqX`~nVBzX*XZeyQ8c<#eoi-6r_O z+4;K+O1S<-@MTq1b@01q;>ECCIHDjN{Z_^!Wp>upiZGwPzC?76J=e=qyUjGl zzV1EeF7JFqgK6yOf$+H@chf)Q#ta_{fyBW!m=Gf-U1Gx{55Ir8<^Mama_H6;|8|YJ zO0;h!b{I2(Ic|>9mt|Ox`51{sBEWS@*FgUm?q^n$p&+0Ui$sR_dsQ=9PRmoc5T z;Dn`vA-?=i`0xMV=;`M1^`$U zZw0(pk`6y7wuIb$cviRxxudRHXk4qOUd6yya(=@Fj0L6c&RSmZq!z>wEtv z9f2aora|RU<0i@4l_-z=q>zGg7O&yc~->o`}L3ueH3ON;}LY2lDH~zYMt5^;3hq`P*dIasG$jT@(4e?1RSHC(1w;0uzm^+tPnp zyF+y`dhTy6t_OWVHPZ`=SRrgEsh%=d@G?4+sXGTkPEF`q?JdSIDgiwl+wA zru8EEstZm3KQ!I{DIv|!|LGPY+lj~&hqwW#oQXw0b+yS^nk%tqVtoOkXGef^xdu;w zWbLc$plx*DxSex_t#DNnUBKIfdt058z7_mG(_5xA{$SxzNHlfmjEDJWlY2%254Vnd4i$fJWb;AH}Nv5O(Xi*qxi2N|c(qE;c$%CF4TA zo0L-}<6}r5!HuyqI#MIF`K_atwnj_&N30r2Q}{u?B{-W#znjIDcRRm_i;!p7J0;rZhx$R z<*JpivQPPKF!(DGt=xzpBKg9z*71mp!@w}_us=_7%!$@|fPjI^LQ_&PJjC;f@vMk; zkoT(ZEn193yk=RvN(?1@k3i%}G^7jrNCvUf<;V8Vz`NNXq!?M__hq=*oNmVTG3h%c z+Dm9F1S2Ps1IrzECVCG~0fnU1Z-+ZbpBDL}EGS;54}Y1tSh!P^KLGCT{rLD?qx;zL z6|+*U>Mar-SBruu`@Ldp# z+`$S=DhGWv)SfU679X(^DvwylJ9%==e+QX#DwAc8m=DFeBcGMGkoE6M++b;M=6u<5 z0Dt;7x%UqbE=S5{Sc~Da^RDXMTb8-VjVedoefi(6M~t(LQx5` z|78Ir*zdL3@Mp0Xmewl7#C(9VYLkj3i9ExYD58u7_511R{WZvc z8cQA?SeIM5oiP;XhSu2AmB-Pl)~(T$j^LhkOntV+tqqb|bHU9XW=L*|#;fC$g z?RE@`8+y78an4|SoQ^o~&cW98Bcqi^^aK~o+ej$ouUz5Py1n|nQWw3KH zYY*fs7^n8>>Yh*WF;GC5f;zsNOQA?HFYvz`U6nxSe+H@cHnfY5gDmM<#X~WApQyJ3 zKQuhmy*Ti?ifv%fkzNxMD-)@WHq^qgF&Z-j>Q||gxt9^|{+i?R`RX@Tt<0f0^4ow# z-98i6yy0jUYwpmb1+h*#z_04X_ty=X?cJ_)NCb&ugxc%Erv!`Keb{~P`VhmuJbgRA z$y)b?Y+b0m7xnzH-;OXrTmq9XAyrB?QWJfk0QBoLYEClU;n|>}ac7(dWD{v)NqLM& z`BN91_LE_x0m|p>UAh^SzYv4avDjmS3#qbi^2xid_kQ1E*_%o^3IdkU#fc@<8NS%> z>0!}6KiDM!NS1&>3LbYz94kd6>F-1(WUE=JA0-mXJVS7mvR|7ll=Ywc*}-WOe8jYV zO>&h4nBG^!OdXFlIPf&lDNPB7*OMwqW1esa(4*W(An=;aWQwO7QEZuj_iI-_n`YK18NiE1e6q=G=_E!QY-VfOPwRuc% z^tC}BW6j751T6~J9ZUr3m&0?h1WV?h* z-mF7ORLlW3pW{mwH_haVbVK?PuOnq>J*=w-0Ke+(8U#PpgE~;)yYQP({$6syY1#Xu za9z>Yg|jlmORWk3rKu|thtiI+r4k}^Wm1@&bC69DJu`B>)e@R-m%A%f+q%NV?RnU@ zzSxCD&@I~i6wl8A_zn-KDw@93VpagmFuP%921E&gBWCp{0cdv=?Z?3aGC_m)s}u>N zrbDD#&`3FjHu}D2^bGm7EzG-bVgOp*rM?zq0{xL5lmIl?nfZsnJIP3fAdR;50!?Rq z{+^=7&WU@A)nh{wsnBB5R@j608=00cLNo>$`mmAoADYQ0@QdOh8Z853!8|6#f0f07 z>;Jh$C=-k%{q%x@yLEx&fbSYeFId@AS8(|C-c5f5nirFg562KS*zYSk#j3`#5@Kh_ z&Av52fB71VFwKMD({QDcpr)8zH^s7#0*@`+6e_2kUv`~g?RJLNAKG{gX4OIL27e>7 z#S@-?ryX^l*5we3ZXitXRkL_?VP7?fx`R;eY~8B4#%80_8dAK{-jJO5YGKJw@BJh% zw;UUDw{lp%t@6@!?9AUI(_2kU?UWh6VCThUrAeZb=5~_FJxt!8dBR`wjlKgy31j*! znLMlf3iPskLXeXfAilV`$T72%JMz-E1bY@;=o2vw>FSZ96`z!nb zqP005*jjn$5Fk*SFCNpkVC1)NEq-y+&qZ`=>*~+K9l%O7W3gkg)nlyaP0i z*^uiM79sV0yi#_UY$PRReKf{(RiJ7cIoOYv{14y1bvA9vjg4te)|V%f`O_HHF9@1nsR zQ#~o+0r4TqysQ0(SN2*QsLUJ~u4m)sR&<>Z>nyKx1u_x44Yi{H8;Q=WvmS$KwjB>? zsRxG+oO|tD8zR&lpYuooy~_Y1b;=&X&i+B0JhEP3)uyQ7C>4{M1y`-8qqQ}z=S3>T zUV#!xu>$!LCbWKFXYHf6$hqn4uC>skIhk0Kj;nKc*cR+{f8p~p*}7U-WN$Aa>=Im8 zk$F&y>FkVu?#9u$`}Gj}+BcT!^*d7Vx};G`ye4KiN*pu5-J^?l0rJBA z^GU_sgX4FUCrQcKiSo}tHWrPyd+($TeM%aB8fW?-XATI{jJrJS>osV;N|8&Ia=9(> zmI~lDRkfks0kD5YFRygLWk)S8lKgd2ke3O)B|?o^dJJ3edN@-^O>l9jfpWjv29%%$ zQ#wJ^+aPf!G?9!&MJdYt`K0=3OC;A!mEkL@g1(e`GRC+YuGc@vKZC|h@LOGf*mV&&7lJgnEidj$P?a#2g6T z-x9&2t|9QOc`Ds9zLi!^7oPQ3Vw)$1dhun`4-MCao@`%+uU@8h5OA>m*94SdRD zK8M^Q!ly7vG3)q(YQDZ5FNApxmq71Bo*YK_xOowO?K(3Q-a-{N?Hiyi;YltQHJ zIpn`*bpM?{ZP8%DZevNnR>Ff42v8cKQ(vLGY?l>U8qhiVsXi(%#~Z0bMS!vUE3VA5 z20$^Mri4_a2M@?xQqv{^bSTQCt~k`an0k<{%VtNB|mDD#1L?2LGOs6m(X)Mpa z4mY|9m*FTI6I7ZaNT$mR8v*&w%JQHURi*-7c*CLn1~}HedhoK7myn!>MN0cw_94L~FxUtsM|1~`@@B|Q zbeCyEvV5uDsneRs-Sknb{NF7P%|HHm#w3)A!?3wYw#`cKFtbPpRGD~1?gVH1yVccUkH*Ypk4*ChUw}@4Cwl2IB^^d-rJ|49=vUqAvBc4y zM=AfBDBI>PTXT9aRnNH;h<9VVa^+iYkM1-|w+`?*Qp@Y~P$+ytdo)+T3s|Zuy57w^ zMIk@iNg?A~h?JCB!`sqtI1W9&VE=S+v`(9k-oB8l#*8K6Y ze8lVLor6MjF7@@kF%p=+v&Yh*JlPcyo=8uBWcb(SkYbuumK!AJZ1iIE(e9B11#G0u zFLo##&ugfT`Zdm zsS#yo)!a1jD6~2D^`LYb)tdN#e*J#8F4J0pJW&aC$V>{n?E~3g3ibU;Q9%AM(uo0b zv-9&gBQDh8x!5moZ6)Hvxp>yZHUkoo4}4%G-=xcl|6JgZ4zF4{Y6V)voEF&?hr}~ADYD9B#4d(=)0L>xgSyq1I7kx%2Jwglc(e{awYf#JGwd6+V8*p)W5sU6 zm7{Qkt@>Y z<_%^vnX2*!IX`Q(mxJk05beT~x)wB+A^3CVTz6bg;qY#FYR?R7Pmk`t}_xQQpXY% ze%@ENek67^Z*kxMWrqne0-wk7_olQ6nB@cR$g^YI*mn5O{p1IyeRfIAA%Gs`wi z{$8Q#g23s(nZ?8`-bS`DW+3>IZ1;?3Km>O3ep!WUhtxtF>()N?#jh*|AF2u`HX@`7 zoQZ%eA8jTg4gr*{AgE<&K*Z%RFp#bwvt_a8n0fE#b8gZdJ=3e5JnI6}wyOPgYI zBi{bYrWEVK|Ic|C(w5vF$&3vADPRBky3^QJ0%vuO$1+M?tTIqPBTN>5phXay$h)~a zMC{v%>%pq^xuQv=tCjoZ_a;~iil^b7Z+p>nR#RJf`cQne;$%(vHakU zQz|JrMBeo_`rBE5x5XbaAE#VUsYBG)sGdol_S@I}Us&`cp}Lm4po7Oqks(^l*~^!9 zrwl+w$DS2l)PpEZvp*KQC8K1>!FSPYD^RGNM*^0(mo)Xuy#53UsRPnz=isl2`8Ag` z6m8XgyBfeUq(Q4wVnXVNx)NmWNPn~?MM#z6U9T5g*Ai!FGobDqbGa%7_Lk@_3#N`- z2gWSyB}<(ugbVLZ)Y;_MDsGB?FX3b_qEEO>maAb-dVCCP(El7DI~3L@*|5M3t}h{C z0Mk>gV?T|Ygo8um?UsrDgxCS&voBXA6>Iad_R~A!8pTcmWn8^2i;nm&8AHxFUtxXa zI^P|x-U~7Mw{z*^f8LG?LsT5`Kw3avzI2W}yBLw`UkfDi$@iiq&3fo$7IvX^@>;5Y zt5fh1j|f4sJfW$G<@9mD&o8~b2ALd|rc~MQ-1DO{ifxk_F#n_`Lxy(($x(-Blv%Ex z#by$GcbTw}x+Mx3{pJTm@9ftVv7Uc-|I!;Go?FoYtSt&6$uFFdRVY4mSvfyTSE1s~ z-UM4T=}0JGiP`>CMUhffO)@~$kUm_!aXxqB^EeNWD*o`5<(Y;c$@EmZ{H34h6qiq0 zPx`SMW~adIRB3wEMoTo~2sNQ{NR-@C;_le2VJKyVHy|9=diGPN<}1U&S3h5rn{A)x zD|hjrw2OthJaiE9epQ8$%J$H}8zZU~lCJidd#muz&767jyrP z@~_K+|399_l8#V|9}Q`=d=%e|^n|&_^CF)gJ_at|H^g<6j2L~8BNw% zi%XIx_fzA5)@nYX(#EYA$)3wQ8(GUyy}05Kyd-)hM&YWd1U?l&t9lMrKHS0oVcEr* zR?|NKe6cSH-H37T#teX>X*y~upm8jRjtz_K1n6-|CMj~<=~fG%Ted1<>%J4CLQV`v zQpR=2Y?Gxw#-9Nq6V@K_oac5D4&pFUqLP;N?QeDYE2W6&K!jT#~< zYU768={qm`w+Yo^Ts*9Yn+KaN28FsxSDt1QmVd>zD8}ZFL?+5V!zd+nD|y%x7QX6r zua1-btpCUKM_#^F!KP=y?d_4l<4X1o>k@n5AudC#N%}iLXjees9 z*SonHzh#?)EY#+gWI^WBlR_0-BW;dQyRW!5Kb%3Nf}}WX z$qmU43NbciIFuC|bJ_D<=k*w7AY@NwxD83)(uI6a#Piv(D2t}#-^b{Kuu3%}Lm&jA2;fugo^lWT z(3N>#c7C=$$gMp}x|KXp`5i8RS2p&tP2cTM`{d9ge{dWdLOj%n&YuBo`K?JC{ zZnn(RJw$c}6^%WGlN!hj&6A?}hTWI+dy=kiChOA94r`zwVk9ZBwU< zm zauk=3Xby>Q_+%x|XA98yK2#hjBl6~ce#`WNAh^SV3&^zl^Xja=92Xg}Y6+DHP55IL z`jro}f4gI!(a%^UdotvwH$f855iU%$x~CB3FS#6d%L%A8R&huj@!C# zidmQ2@E+(K+^UMLXE#1czt_cr<{A!(evVfz{tAUuaJPubQysu-m4zj5M*`h+7?1#7`Uh!CHe^IP_rdn4sz_B!?B$KCBWq)NgTNpd_ z#6`eXyLp_`W!q2YYHY*(j&?ioi6c%yFaYNgQk)8R2b(}I8Yc8avQ4et9*V7wL6v8u-$d)w_mj|x1DvDw`> zYLau^M~MY$%`NSCP7CAjwe9LCW%sZ5DDGuoPvds4>4s2diQdgkcawJo5CmQ}V@@ep z%$3qVwoPa*MB$%K$Xw;Ll;>rO z;uze?#$*Aug$eg!8Xwi0i>ERmZw$62wIS8@nZa_;emLcQ!podK2k8CX$|+%csr>D;3R=xyGL>J*R@zCw4$Cn-sxj#+Vb7k1wSIX@F4N%s z^r9pHCfRcjYi@o;Xsjkrxo)4N`0K-JW3~iUNm?g>3dh_InM9{#gEYek$huWl3FCs~ zw9tcqQOQ$&#w~6jR;J+0?wcZsw`+#+4Pryrg0?U6o4*~2lmi*AH(owgDto(FpamX{ zeakz$k}ujfA9rv(q(ZTMLj|VyCYHj&7!&yj_Niw()B@K6x`0d672F08@AV~A9%+*p3?!P1-|}4%U#HO9}p!{X!1gh=;J0P z?Ao`$>G7y5Rx>$Ya9mMz)QRmBV^_?TcpB9zdcI>Os0UEy?M@ZM<1k8(+l5kdu=c+! zK*%1uRH#SHhuIv+(VYyoyxbZBqCm7M{Ba635Jf<k$hY1b4w3%1QHZtY`9D6w z&BxxCJqQ6O37L=*=Zhha#~)oiZY#qfSg+WxcG3a)gbDPGI$|V%z*5u#RVYf`=j`wO zvpt3qFa7^Yl|*^k_|V@usx&g$Rx3!8i3kyzfohP?fmkJII`@3`0Ak`l7URj9$rcMMCj7 zSy3lj3>0N8b=e0nMM>~7J{DqKe{e`9{A4XOjM$*EMahYtKhCk^9D6#1q$mBG58A!n z>@iVfOJ4G;<4e$&=H4vb<|XP}Xeshr%NJ4gwF%L8`H?3;uqT&n|6^-1<>auXUM%$i zT`_6P`)=B`Pg}&zaZj^Zy^=^;t(lM)>}Y7OMrWP3& z7L${p(#ZW=RjY(eab6HXw1OL-mct^(@WW~HQKrkxn@RN09XF=_o~=$Fg2R*5Ne@aN zy{oJ*5u+Wux!YpG6cNtl)4+yMF;u36QqG{V?U+q`(4qg1-sKjpDEr9|0#k-!LaW&! z@|a!C|BtS>3Tv}#yLN-SdvPfgEfk7Fa45yy-AZvv1BIf&y%Z~Mh2m1&U0NIp6xX1^ z36^BBzV*M)_dfq|tgU1tdw1r%=Nw~P=b&aGQTr(`FarReb}>J_11u&f&$i`#{z|m% zwynFDN=JU*ZMQ)r402$49x z%bKP@;b49$DAyj)rm;_s$^hPK_dY0Ztiz9cD&F>91G)my5jz|hz{g4}^WZ$B&I+dV zXL(1tAP;wbdbOxb8gt&R(RPYU0gOE;i2~%;#GZc};m{pzp;y4yK^?WN{kx9{Q_DCA9yjk8DngV04a4nkh zHZ&KNx{RDCiXS|PavGq>kz#_ew?Z>Hei3#<&Yke^JB1#7;~)f7NMcMiqa z^G!r_hiq(HD6Z2#pBiLkuVs1`)gcSmgeFu;G3203bwi{<hv2?uEn_`n!uMyciuf!52`4V^rAwtpKA!lcm;v9c=JF(iHHc5^1Ju;E3P^|t<^n+;95Ov zQodLtIN6VDq2d`!8`LXUiQ#P+F;C1WS6_U#PJPq;{g%>{|B;taUn}_^)c{$a`D8i0 z>u-Bn;Ml z+-#TW)ou$6S^T0$>H>|Hre+lC%L`_TsC{Vex{bnMz&@N#EzmE7r7k^?mVa;6FMtWJ zs)@hHIyE8Y`nHs^Bpk~6?i7sf;T7)n41eG@iVuUytMO*eF*5^m6FuB#8Da}{nW95- zj^RD#4Ef@fP01>%q&T`uHb)aF4M#ayp@<`aE z3zl@rh(e?I)z9T0j4S>|Z+Ga3PV0MlQw9Bu@y-Le-{JlNc6;p~6S#dmr<25?<6J%7 zF_)H%Upi)f-ZhL0&TU`(bgDAdMn|LMC7ymG$c$_4R1BrHPvrNaizv}AT)sQb<@#7@ z>Oq*_6=SljR%f$rnIgL4K5KnzgyQABu-D(H=qV%aK4G1`9B_Y5#KuB|H>25@7N|)! zaX_xHv4EW{hT{=y2-q4()zYq6co%t=xl@8jWI(PwCF5|Rr@?svLA~(sTEm-Bv`s8` zbN6o3@b2!2^|yXDoR%?BIcX(^%bJ+mqmz!5mzu2$SdplfBpPz%-Ce{`gT4xhKDbg# z<*Pp>D&g>^C}QyAwj!jJ9D;%Ks@o#6BDV6^rDI zgILYx*dG8R$p@90HxDRg)7<>&a%JJmFn|YL&k%s>$4K{Aw^_}zfkaZ@l~I)&^a_sK z7hjZv&k`tXg3M$@zxG=GtnVhyDUUFn2m1U9XsE>$_dJc3(kz}kyw@F!-Y6rd!%>K0 zqUS*mxO=e$_*m>a{a{Lk%57?3>{g~V>Fz+)>IOR&^BBf&CIoQ+zYi<_k zBu+chITyb7LU5Jzd)q|G4qBVAcJ_j{hZ_budRfIwD7& z9w~!Q#Jq=i{L^A^E+MOSg^ev(x;@kzE)y|K@@ZlSn3Q8%)|O^YmbkmUgMAd(AF@Kf zfSXwN?87&sLhsSnM37oM!u?5s=EJ~K29n&P(Z}2(W-|%(&LX@tVnsUi$5Ho}w^Yc% z2;@Tz*Hap@4R6%XK;v1K_*dIuM|U%``^0Lwr!bMK%coCSge+i4a9%SUc8wYDFuiG0 zC#Ow9Zf#2QR+|HWnZRn%i$}8`p)78C{nTJY)dEH*1~Qv3zjRvYrRFY z6^kXC_E!5UbK4>i=%sbHO;~ck;OFM>Ox?==84MH_z5Uo};K)}m_%Hjn1MtsP9lrvX zj`wGDuq(-@LMO%hr~jxWHv^GQdjRu1Zt!~woBbnhYh&v7Bz;G1f@z9dsDw}d`X_AL zOWIn|y@=Eo6l;ykh*>M<^^vK=`$~$3)NnmiG=1*xvAMdHEPt1GY^Bg)w;0+9>6sYXhZbm=!m=AZCUTIC7$R0mkp1hFg%kiu6r zE$(GBjzAjyNYG8M3S=2ZNNtmOCs` zD+CIyUqBolRToS0fj8RmaVGmhGxCqf!jP6~Sgc%#zSor@z5E)FmSgmfSMo+J5yb8>2UY zSd@b{kxNZod>5O&<}!fJp|)2|so$_SghC}_G`CjBVP+2{7x61dpvP8K844omXoe}R zM<}6CdCT`9$ZuhD0qXJJh)RVmWZpk_G*YGS?TKa%&Gs`?UvQC)W#*rmD*-n}DZ2}* zszZ33Ml>&IH;=e&xn;D|gXJg^xi{SuZOukTPMpC6&23jRlE-3;n(1=mdzN7Am2x^w z^xSO#uSQQSea6FePn`4J@jf^uS&`D(ilRFAr#M%UK}(>@a^w?Fo8-*H-i&C-lbBLP zp;reyK<@8B!oyS2&P~iF2f#P`l{robJ<3RWGr^fpkL@_4ne)|gk4$!f4y6)z1syGc z-f=+S{rrss{Y2+Y_aOeFXBcs>=LDK8k+Oz2$E^uv6Y0D>RD9~q&>1?qNLZa(25QI~ zKK6V=O>b|pv(Zc5j-EkI58GMOGTEAM?zUrY)om{$qv*5ugImIdGHgRRAf^wZK)gRM zPnR|(`QgoSLreh0g0ns00Xh_gu-!&3zd2SbSjnr}(`5qfs~fBw$a8e)J@-HAf| z6dQS4k++vI%`iOZ%ZuNBzz7GXVDICInqXx9YDXZb`Nk;4H1e~q|HnP|D`BTey5yv@ zWjQX3LxOY`ZQQpg3?H2@TayO5kFh-TNFaJQ{_c5FxO|NLmnVC}T^12VTotqgD9bsf z3uFXDWQE*V+0yTbU8h9o`V&Jz%f5TBl`qy~MKj>fl0Nq)0%gHuG8f4IzM*%J|FigU zPBYcQXj&H`R5r)XcioIV58TD7o!E*Ers38YTH>R>(9L4?9t<0)HgY^bB!&P3IsYG8 zESA;U8x^)yGfUb%s+9F#F0f!`P9WvZt#;3$Rk_@!W-Wiy+fQB}(y>wUcFk9@|3ds5 zRfC+}P?aezx($LWk}NEx0Ez8GXu);WUog5DS5$Z$UTCW zd9}T?#r)G`Ez0FUt~nH@+2i``Vn~pTdbdDl9or=V0q8oERNxk(iWxEcQeV46C$JGJ zK0>lz)ERVYQEav?0ROZ@^@?}^@3$jbKt1jGG%ESq%+^7ftGnl#hZ3dH3@0Q<4>T;o zg>RznrapLNx1_dMJl@YkZiAj&x<@EcEE(TGJN@WVU>3QGC;pLR9GVes;~|oW8I-aXo-?QKIxG!6Kwm0!Odm zo!wzETtP}+3`tV!6E%MkI(AiQa^51b=c&rrp|4g-P z7eSBzt<0aZBq4#p|C9Bwcv1PPoupc|kg~DFF->Rc6ZKPHwb~*Pb0pZQ{z!7 z>KSt?)Zcy%&FJY=fd>`YxDNN|PBwU<^k=usDH%;q^o!@5>rWaer1!*hgwq*9JXo&D zDpC=Ha|~*LI6MFo`a&?3+m0iXY?Tg|rRM%N^eLV(p}8!yR65!5i9H+_$sITLwzzof12jFEgLk2C^ib*B2vH~}xFt53Ia=CsKK4zM$iMXFFer966QGHM{NN1m z>$ldFuPMhqFJEU+MSIglT8B~7%Tz{-)C8|Ts?n*tEC!t?oOi>sI>kPr;{_$u5p6%_ z-spTgtw9(E{Rs@nZ6wMSykXUApIxD_zj-=ay1cZ=mMPm`Yva2p#dpm#2c~u@!;X9) zc&4!z*jJsUv1Z59NwDcAQfL$3ckFEqnW~j+>%PV5lk;ay$=yCb=~KG>Buazkbj{uf z9iNBiQiK0HyFjrW|n!j}8I23ZY zom~J}x`ygX)!gkQY6arw(M=cS#r0v`#-brmmGCuM38bi5?VV)@J?qqNZor%K;uDKE ze38)vEe5J0Bw*aSy%t_ylzhMt#V{u9Io zSMm5~T8Gl$uX*LLlm5)RZbE({kpp^6y7ANr)k+C$ZbG*m;#+8Y*bJ8(7JZ zxW*X>M8iJ159mtmK1T^W**a+4{hsI-m~FWp+=|iy0nH4(_{tKa!9tyj?d49ftQ?RX zh5e3tSMO+p^AptDp^Af5)M zRBzWz`#5S!PD-BC)o<}ZoM2gvhAdmNTdy*8=HaGiV(3iz=1 zP_2fujPgzRKAxog8Y-9zxxGk0ZzP=?XHxGcIzv-gY%v;Mld+&JSf7)q&9}b90G3rSuyv4x?%x-rS zfB59z`97u(;1#Rwa^1Rg3FDiNMu(g$4Ow6=qm}lZ#V!m0qykX*imW`0@*Aj8KV)gS z&8mj^hY#VN8T(Fot-UjYwF&33Sm4}l(Qh|*8JYyvrrqp#p(F@Bx(JWd7tf51p=XIzIxy2s`0*kgd&TNRF z&mZFZ!yB3%m1pW%L$9+x5kHh%*h6| zMHI))@VU1R(?ta0%#(O05w_p~n$EQ_Ts>9p949a}Q?UHGrY&3E$LUq6p*Ou?PTi;b zU5fg)8}Zna2k*q_hQmXH?lgrv+F0ZIjo5AXM}r)O>WQ0X-kiIpo-%@#bek|Zmi@lZ zs^+l#rUkZsM!WT`|K`D7=qMMzK94n3a+@R#yA%mfK1|^6qTHS0;mVHZ)G$Zl}i~E(s`pgYa($@ z>w;XWd=wxSiz{zJA~KSNxY&w;GDcC_c-FegXzW(H5U@Qn&$ot7UKUkf@0Wb|3uvNT z+rMD1UdBhbQp|Q)wit)2(godMuG}cHf}#s~n>_1m2Ss(MQ|cs_k9Wd7{*cJH-=TMB>DSuC(R8KV4;?fBj?5N2v|IO>UU)z)e#ucw_HaVPg4yZhX_t z`{qiX24RnJ!!cGN^&<$nentl*)68I4xwW!c2Kw{Hb?YXIL?0DtM!DA{fUj$T-`2u> zwyU|&mzwx)S-!2iXZf#U-Z)2-a#_(R0Dg-q()XOe!|xl+Y04t8=f-MGI439bCUq^( zQJOJ0 zPFu0oiVdhzq4G=S9!7#&Oi9~#JjTa6({YHSG(|kOl{d)STYvcD6{QW2;>hVXlbP_) zHK0jRfy|%6^!#O)!`#?ntKo_cw=Cqxt(A%5VHY*;>1MQpa)v-5MaM79C$MUI8Adm3I%F7STqb!95#m=3-2GWYsqD@?-)qYY{H=IDek$`+w00oGK=>|UKBEZmjO z=}s7C^4i2cvO8meMXD|JY)BACf6z(CycPShmnA~sETD_Oxs;$1b z)I|^Q1e)RIxQ%vm4|PRA(zf#0+X{%fh21rV*dj3Gf&2l&F#u`wp-6L#$N7`ajGccw zWLW>v%}e_0oUs6UbuAXS+g4vffzh>DcO|6nJ^ zXe;H*@v7SjS92DPA1f$Fs{0RfBHypBE%AZ3M~;fd#f9_tzvX7;oedB#KFE62Fp8coGN%KD`9dhBVnfYalp8ePj#oEfo~t;GgggdT zxs5vC{IgMs)UrV+88~#IT7AZqiIk^9Thp}xpNb~hI_U>IT{bvk{X3E6J zus!gG3vU#rA$knlV}LCSFL?g;K@IKC*l}(faRn3$6vZ&kpR}qm$2tkq-GimHBrvH& z4d1baH>?JlNqmF`GKt2X>9)e4cffL!iImQcfFqIzrDcv1DGDxyxcb;8#Xix;F5mD_21(*(F4u@aXwk5N7l!e zUXqbe!dqWG=|Q`yV0D}n9}G$x7w*kK!BF$Abpz&}mv2iMao^30=&}yQYrELxB*Ut~ z-kgrFq@w^URbOXtI9|S}MZGB^Y@OU00FWIyGqs`e$8O8gmn$yqDmVP&*@aw*AP<$EpKD_T~TbGVT8yPoZYHlwHY=OF{aufn+l^?`DMtsjiu}ed$L1ONs znO-behtnfNUzw+&7 zoz^hkgbmk3{`l-b`@8vJSR^m*jsdlKeZGL6Oc(oZj zn~HA=>{xZb+jLWTAb9w8&5!wYBO5VEM?J@KSz@)UGv#K9h_kN^=tQBP6l+-+Q7D6kfin{b}G0rd@p<|6PVcLO|rvFCDZ1w-dHa%m53a4^qWei8Zn zp@enzuILbA3Y&{qY;VE-$iXvrtO=F`7YBiom8{E8pr-`f&o6yQdQ#AY+-Mr^XqqKs zV1eAvm=sXXPVR~}>2<}r8lJ|R*}sfX|9_gs|IxKA&{YX#|7UT&Brj?d1(fYxPk?hm zDhvu~dppTl-%zKA*HJcV^4YAL>7m!AX?*v!nZRaeNlpon<7Mnk=M zSKk2Ggm)j9DUeS|cmKxAANF~$@*6+d!`pXny+k5WKtYl%Xv72x9^T&|(uw5zup9rp zO>d~b<9E*6gJrSf1Idf|#g&uoR@z5@xs1=T zJBYp=iwQBPluF;}+x1bfZ%Dx4BY_0c1Qwj&pvMPp3(IV{L>??|+OKEeIf(Xi5${b= z@A}UWj&FOV5)u_kj=Ae(m;69P0Nl@f;wVM=G{|*28#SOJz*g-oO4*fTz6i$_4@=v5 zXuCk=eYJnf*m}Twi|lgexDwHEdiHaitB{3L7xRSArGj@vFz{To#CX+i>VF+@6}FaR z|5HnkDmzqtd*Oju-Y^=};*7z8jfVoGt)&!rFZ`vXjI2kMM<4kY(RTHI)ZWPT#`sMD zGh!*qr);+&u$!Fuj3$}Nr)K=+2F~@h3ZtGRvm?s^HF=a-6fxyR|?6`vJj0=KA5ln9(!+mb1v z7?_UjZcUdux(+}8Rnt1?9p{g;a+}~rvl}6RLNtlD{jN{^@q$hVNn8K3nNMDGY5ww( z?~FAUo3G4h)X_$Vj_XElJ$r$p=s5t9FrP9&xEW|`u>DVt_? zxX+*RBZym04FXOpV~b_vQ95UD3*L(%%(?`SnSlQ`82;7cLzUchi?cIHobbIFQpQ_sM1gB^Y(GD9KNYS0B=tS5EW0Z zR+eMIT9GOu)097V=77IuVKT9<&_!vDd+?N8g1jOlY#bL^K>gJu&9zx}vD&U&mlwFA zD5~Wn$t8GW-gUWmE3B#aQ%aL-IeG1Q@QQKB-Ol-rG{Q}C`I|>%gMM0`OKp)vaC0J6 zVT&O&Hb=bC`LmacAX#(yXG=VdwfcN+0JyMp(VD?&r==(Ecvm_Xy07&{BOr_q)O^%k zLQN#&R_Ro`C9*rH{%WG(G4}*wWKAED8~RR;*o*l3dMcZ&j8X9U4^4ZdJo51x?&wWv zK)|$bhH>(J4z?tRt1&ECYq$Y~cf>Sy5JqvRp9&8#B7A$h@Bd%YEAdk{r~gxDazVAf zN|iT9M5brIH}*Wy;MlA#NoPJ@XuvX=y24f- zjTK+<1}&WR8)Fc|Y)etCskNkW`^|*7ViCR^Kq)}jJz8c6Mn#PA!gnj1V*x)0GCH)7 za4y%P_U{zHuGK#r*xo3KB6~EkrHdH}*|y+XKDjib#_!3D;lW1~Ej;)wV@Q+ste!%( zz>0b-2_1!z>!O(0;H8wvu{X~bVk%%&T<5W+norcKwHKJ9&54mKlD9~$TFmF(Kob|PEMdV6(dOYI< zusRbX#|6$MLEj>9moo{(e|zPzbf2nrk52Yl(aW5O?_{IwcVKshp%Aa2NoKxy?8bMZ zqQWv9&7*B$wn~U~QY&N3IYXlXCT(hwpiGYW ze|F5lLS{VIwDoVaOgtE(249~tek(YYmg;R3p}d1#mwE3m5PwRO4EvVfS0k7>Ty&~A zBnW~7$P{u@B z`E<#>7oRakA7zq-MmO1MJ~a&p^wg6wzz}r0$&eZB!+xJ*7*bRaaHLrbUfP#W9ugJ3(DNgzBUuV~D!GA13 zV&)%k1#+V$_S$mw?(^7+FCyV!-?fS)x4bTP7w*@&9yM~gUuU?9-*kWF3YekuWJZk_ zvVj&a$Jzam)O$*8twn$G0gBl~rUpMJoso<~1EI#fcQ?fLdmsH5gy@j#X>4;g9AT_o zNnKKTX+`&qyOZ%%TBH~OKUQf7T3pGMrwJiI(dFmKkfk|xBkFLU6{R-Hat4_P9qH?y zTK_HKlARHK25(dca9#5!#y1dRX4z?B28V5R`BuIoOQBX@5YZVE$kW{?NE}E!W!{4d z(7RO|NMRip;LrVI7(^q&$Nt3S3*(R56uoM~#E>D^++QV&bc*0VuKr}{h{gW?{8AxI zlpU9GMQT-sJoc*MR(c@ts_R~WCSn$cqoqdK|9ei!FdO>ToFi+xYw}1g3l{PTA7GEi z&9ZiTtp2Xb_tnE!&}p?rRBe@jZ7$H+{j;;0K)c6cV4iqh7s}-%TC#eW)y`FABAkgs zW<%QH#*cHZ@~-Y%#T$@e?GexO8%N{dUve)>+WCzb$4S@+G|nUu_TtPQJ3tuRhn%4? z#&2Nkj#eFE!cW$$Rs)iM&|P&G(vI_mYy4ln9^F5_UX;?xhlLxN-cQZjiWSo}k^FeE zU#^3bgr4#nAVP{eZjuBp)Zk>WBc@GNb&_x%?=&rR}Ube+iPT}^J*dB z=clfG<0D#unL#v@`5>db-O$v}fs#UFG6U$!7=%!^dCx1=53$dEYX$;1iwkiq&sS-( z%58#msIkzNOrn((A9RzIt0c7c&{Ox^uR3I*8beDzE&!o3cv1V)U?}z~> zp7Ee=w(~S?_UtHOv|ZxAp43C19oC{A&!QNZsLMZkIl+u^%t9KP6w!y>>`%iz4$p4B z#gtAIw)WujAmAS^a6-S_FVGZb=+96yz)J687~$2gcS2vd(hSn_Xnx0olOu?q8)Lx~ zA9=O|JhQ$K`t){yESH-lquNNOLbjJ%e+?N~gkMN7&Im4A zs@>`3QLn_y3<-SWt6wv#&&P=M`x;(PUe@JFDI?b452GwxYS|uM$J8}p%eI0!RG;oI zm%N4H0foDq#iv}QU(O&%@d4KV_H5Y@(0|Z&3UL%G3i9@4Nkz)3hX=!|i!lbY1{)p< zhZXABzmJ&hZcRQ7eqXxJqRyA;_8!hRzA;t$aOLhGqp_p$m-fIYQ=5o+T*}ocZBECU z2WXgJ*OU!nx8#ByUYFYyMPqV-3VN8cC3@r*4I3{-V!a)d>|REAGKSInsINIv2EcILxqQY4CVBBaT1b)Fh%Ms$v!8bgQPdAnP|I= zx=d$bq#F(x&_4#OiCN)+95()n<&}c9t+H2R_hih8ZoQfXb5giiV4)oc5lwO_W*+6- zEWZv=cD_}or4V7iTlo=@FH?@OIiL`J6P*hS8|%-YZI!A$^lm>_0Y7YhOYT+(U@6P| zV8I`)lVNtCm#R5F-#y7KA=W#REAEf|O1rmZ#G^W2WEdCM`eX*>f~T=M)jnCOlw>%A ztWuEWXBp(7NwU*t;*1>jD-QB-JsUrSMIXldi#YY7;QK)|V%1l1R=e$9SV#!K+})FC5A-cqQNmcx~`+n*D1-b_f15IfoISdqT(?W-L|sUcdgK>;;}Rvs>n6YDgsg zlS!_PW1rgbPy$HT=c^|V1>HF~{#vQfYV71H_V7$CmZ~s4E+$a=Zb`%nY%f7+clO>Z z=rcZz$6A0D-AowoA~#inws{h{f}HJ-BT27U-pw5`r#(9O1%+D>#f7Vwp$S#zd(~|G ztc2+R^nOIW<_MPCLhpI@Qfr<=nzU9L&G_93t?oL=)b-+EcPhS1tFg1nI0<# zJjLUmMD}1M3XF+nUxsDJr#M*lkee6X>V6NCTg%d>WiLz$+m)RK?dbbw>4fcfoLbEl zmf5w@03OAg_9mKXfn_huuC*2%!}PG917IFzma=J!2U-w@-D3!V=?#Srj(6 z6A*W)p3S6`jcYF_Oj=v4Y*>Mr66ceu$3}H8Bwnqj{8j2h)AA3f;^M7LEhc;W5W*v% zEgPbzWcs|D10JuiWcnOv3#5LKl~MvoVQ#eHNi-T!bm&`4JgsKtI}|13G67q>Xbj=7 zy6PVLaJ|y@z(Qi&hDCd_S{`RVLJ~{EeC1sc3n7H34 zOi`Flx#p9ao%Io-Xbi4r94XtN-on1}S2U51k=v2G#m0<8z_DD6f6NX_>!beC0hu&r=BD9$tPWX zP(O}KUUolo-Kyo$-A!SzKp|Ow$q-6`TnN)P=IVmUV|Vyy%b8U?64@J9Ud)kV9)Bb< z3alr+Z8SvmM-;0ncIzK8rar&eV3LH=4J)pawv?xYuGto7IMmlfNrM43ze%HIRxtxj zgB6$fCz+x8He?K-I~uluAmguc=3n=<-}>_v^I-?nlW{;U#~T2y$`fL1Vo7csa$}b* z6EwZ*LhOoNRjVG>-SrW868u#7H1aOz zSO~NAX<6Abxav`*(Q-b#*f2S{Xn{LrUBy%NVq@27wHFug}ss+9p zWOAE7r5#}2G3=glD0!es$)_ec1G7LG4BHZS3kG2P+l=vFB2nmPVNaDIVL1(IK9j!s zkZ=E5#4pkQk@0P8Ks?24Ci+duoESSJXg_}PqVu3jni+G$X#7*VYp_D9dyZm>iSXi6 zlXi~NvVOE9)C*#kReTKC-vI}pfk1GSh)p}7r_d%$PBiY!5HCanmwB<|p$w&Zg$1K$ z6_IBQMmO6PY!yCh0hK;!QA^0!`3|tLpulYs*R~GWk7p_>gc1wD6Z_LNM(@&4bVlc) z_Q;1T_A-Q6a?T8pVPBm#W@G@6C?d5UvWI}F03JPUCe=!8UxF(_BfbgbW51?0bvvh|T_Z2_#*{!&h4 z+HXGm1N07J`DWxm$4dzN%}1N7j1f^m?@;KLEG_B($2#Th&t;CGv)giAbk-667ZU=q z+?~rVgL$YpZ{=I0hCCr5E@_&HW4;}vfmeRLK2#z}krk4W>DR63Qr5hhhQ>(MG^Eh_ z`@D7zWZTWn>;icZ!{|Oy@+=raL`V?!?m@ZWb}{ipYS`DRgUXTTRV5Xoto14xYw~1R z*H-d9QcQQ`!$)%L1^waBzjU|Myk<7IT=(ZOe$>@;e(QhECw}&TJ>{ zX9MG?W82AFoD;QpdV99v$PVuc%w5N)GVB_+otrmz_svs(VR_|Vy1y%Vy1I!ks*>!LE*)o zjm#>>hUkZY@)jyRmE~nrJ@(`Fy#_Sj6%^5Lfu?r&(F*vUdaVmZfD%$?ZBJSIIl279 zr#R&ezX5!P3}tJlXu&b^ouY3PhKB~~$&4B#!}pnn)uH|sHCH6B93U*W*KKU@vs~ zEvx21NqIKfX(een6e&7Wv15Z#=p)h2h60S#py@luEmie3R9drTQ7e|Y-IB63$9c;v zX+{I0`ut~Ah>XDPaSnr!62l|*G4C{VQWT1;`0bNRc-|mDfq@^dB{V21F{U>3e#$4V zJA%2W^lxh;#}e!BfcFqN*v`hm=cWgG1ptInnjb@w3PrN{B1m{m`Y%8z5w&*mkZq4W zJMUlGp=tbov_rW~!EeKd781ek*&{ozjzP?5NXDDBD&;gbF|vo>tPO`(_KSiQtvsAD zTNe3P(mYHmQ!l3)5FJ-9u#G&PJ1O$D?p$4o>C-^JV+neTT%L`Ti?7a(AJn@GNb0A0 zo}ZmX9S?$*$3)lGf+4iqM=!Alw;)->>jNu_00e$zlcM*P;ae`p_;q)=U_*yFF2eN< z1jijw*5BYJfhM`dOwZLavhDbAtCz=xg~lo9Lc77^cQufetf*(s7`eIjX3d{}=OvCZ zun`cUmPWU)JF$8{o@$u&5PK@v_W9U8zru+(Cc_<4w+7ITUX%1D_lTDs-gLM;yZg;m zW|jYG%L2kfT`g9BuRzL4PlwQ@dyFA&Xk-V?_9)^Z)lWT zvF-6th`9_>cx)iOnru%(`p@Ulo*l3cb9235a+(QdC>3b8B_u%;IMWMnY0eC26L2od zRXdZJc{h>dNvsbq*EF|?3K+xGBf5ZavpM@}^*6QKj zpoZpqv#CNX zcvSZTFCc2TjX;j%kDnJ7Q_KNs$PR2F@<&(iJlTLAYF7UbK7jNao5kkt0G`{0Zm!#I z0(%-~2l~JHP)|qfe-*&5Qi$|pK2jr?P?+Sdi@pO)O zoZblhzC$woa}Yzqzjp!0#Q*F9gaR*`&#An*35%{rfDAh$QKNkPVa?u}s4oq0GnC1r zlK;X|}+sFU4Tif(5*!lakkPoXN(XvVG!v`4QehO6y6Z6wwJ1Y z^Su62NF+onIt5B`e7XEFw`FX!ruW7{M=mv(23Tl*+Wj0*&vu@!W}G=YGr^#8HTBB~;+i z&d|i=jwiwk-75^?V=u@}==rFj-a$=|+ zQdwnX_KJHuk7ni z;S?G!jrsti?A!P4e4(yae zI&b-3hb|!SpS2r1>PiS0WJjgw27bc{eyjb8E^fGjn8y@_fv=|@(~Pfwv^&e+ z;te6Ih>5qrvHs+65o&%pS@&x)4*m>dGBmqKe=?NN#0$4?ca~R+1pU!}tq6nU?BT5f zZu*nPA z7aHag+ZFk?; zGk=lIV=;mLFB^A_;6EZrJDBycfbcxJ#~h0GVXIa)>ZVF1?#73VC6K$Pgt(gOV9!AX z3~$o*xC7OS9`k-=1T<+l#D+Dz_S|j8JXWX6qU_WpzQ|QsLA=tTK$$8dFC!)i)+aG? z@p7G;w50V|hId!W0Y=T;FkV!*(Giq6y-?i2C;`waRMt{3|E&0;$&TJ4(4)Rr2*^ot z`|Xt4vr?NSDl@4Y`=!z!jbyV4Pg{ec#X`-9NiMweRc`Jy8NNyXe#h zp*OpqdnyZ)x?h*#$mvKN#e>sL%oE-W%LfT(!c`tuJ$wkD)r&?E*EwNPA*H2R{dJBg zq4CjSG9%r%9Ya0U-Xp#pzZf?|7@xFbzoUepphtd<4;&y-LP0*o3qi#AX_G}VNgBzZ zJykgYpfYXs&i|}**c9iW`DW6;4;e=uw7IZ36Z5}Dh96}9Qwf%C zb)rpWP@KOI#HgAh<^E2AOPywM0o6?8pm{yYqceYamZ~wf3G*w9o|0>Vjst07cf9X* zsdI5S@maIE***S{1+6pf&aHjQXJJ6Q_~C>7i>#T-mz{9}?%{eK{3FQD_&nNQt)?j& zp0+>Yl$Y|&XQ@4Ra;Ki7jty;;?{v2b)9$zz)8m@qNKhB!;5KR}`X@-iWUTwT1glMx z$Ix<$x5IHGgB&7^fLoB42|#Wj{pwh0e;-wBW8 zJ$)@*M2pv!9V6!em3SjXek)uULVt4|TEnUidhFVN`aeg|bm|0mJY{mW=G@m)QM+ud znzAR~UeExko4PV5zSjnGbsq>%cER#vW@980Lc6%Tj+_=%$ zi}>v+9rbeP9?hu`XwzQ zB!*A2sI=5lNE1efxkCQE2?zbN2}jB5d3)H-;JKtj2xEpg$prXlH|t3l_=>9o0CnGK z^;yrK*ZU@|l6wDMZEQKccu-$GR;Xt@5^(m>a9Ax(Vk1?V4_1O-?tf_d3DEp9H)J5N zrc3NBpNMo<&%ST|^Hr3l*q%Ax4^oDXj$KzwGApM*kuQ`VBPtt3@1?7`c>Or2&+?&b z&BIbh?1Uuor|h;Q}^rLVUBMyQc{5l{(#ah{?%%mS3CZF+m*m2Vc$>w;rEZ=EEwKX7*** z!R%jPQ~H7n@a6^9z@SA|OLd;R*Tqm=C#h<3H;n1Sca1|42d(6{ZDwHpRuj~awv1+$ zWf-*wDwl4eK{Y|YUrl*%rz0m8gCHAgZGtDa%q;#3XzyCsPEJMgM>3`UOY7FW52FTf46~yF-;_T%r;2+&opp0SEs18>d zZ52E|WbZYmik}H8kGc6E_oY|v8mSy@48Qju7LI8U8-V^nqJliL>2oIGmj})p6x$9j z8k`1gh^Ot?vHjuCOkUU7jL;6S{+`VurvAtY1^%QRKpm2q1d+2UWM4Mt`VdUjf4O0Izyo$*-%c zV_G?_-jqfVb4CBkn08-DCa`WikJU+Z9c)q?R|p<-pvGi=B&@>_Ky1FMYbNtBNe@0V z7XD5&8%2|=SFX$vgBPHTiAyf#@J@)WF1Evc@k;BCt_J0G{F5sVyZT}S5Jc;V1PGE*;jK!VW}>{}AO2rt2%JPKd;`8S#^vTy0-V!tQLeNl0PzgAt!f zMP(4aSj=9f8!A*M+PQ--qFs7XWv%`hT00`*S3?btLPC8cdbe*#IJ)9Xd{rMps3`n|dzTfT z$UXl48k+^ddwuUXUi&J5KI;AX07i~P_SFlb(S@^Ha`B_n&-^WqpD>Pn@O6|bS`gz- zY~)6L3nG9tv^3`WY(i}}zU6Gm|Bk+${wN_k}hH5a!zcArrzti0q4|x!F}Rpvq;DP#uDZXz!3@mx_7;agF+w z)K)%p>1|3bu-zC(fxS}+JZD2V+KsU(r0Dw%&w}e7+9;~58)_fS*K!#0Hf5i|RYN3~ z#Hn@ge1?q)$V`co6y!91mB$1xTi#uec#%`EeZ{A?_Il%-)d`?=!upHa z)y$h?S9zWn0XP16{<2RVr!9V9ibLjrXxs5ubGUD7blVSjh<1x^(?yh26^38COeq+!&Wr+}NBaXSnP}P6_QY8dn@s zj;kWgv(l;&adLKo$o&WjR037I@&zhcR%Y`(>d-Q;(7R?aZ}|-}sUUu=3ZD*dO$EmLXlP$&~Pg z3Z32LjW_1&t-mtN5nha{oQ-62y)Q9hSePCGgT7)@TiYIK zCE#0idhn$SR@$uO^?0-PK>EcmQmeMyFU^UIS7Vk73DNdOz#{(AhumKd z7Hk(Hf?NiV&^&dZc|DbL(QPZWZTCwWrNUtB`222$-&{i}V0q7V1I}g< zE1aI{7Vs7AR$WA{oz-Ev@&KF%Nxt#Bq zzme|b%PVX?CY1rGp0fXV*-q;qVq3v+zSeIc6vl=ry&SL~D%;$B23b)Os?PFV`GKGe ziIP3y$2-wx>GriDIn-9Tbkaql6h{@4Kn$E1E{b0x`eE29z3a!7u_rBp*&mz2dSgm9 z{q2?dRh|M3C2MKXz)9^KyU;moA4MmM88wcC>i~P#bI{=X8ia*@Z>&&$W)!$biAe+x zWEy+Ea<>@W@H6mPqO1amMA^P!9G3b^K%l4MTE#&ldSiq)qT`VGnnn@mC(`G8@}+%I zFzMk^dm@?#@m(Lx!h9#5MxT_-`1%&gzF2hP@zURIV)EbuV#xPPm*gB8-v2&siZYlE zoijE9p#Ns92aPo2!zSvr3XfQTyppVE@91`PMBf)KOwTFi?k#y28gh1;m*^UN zo&M|)k&R28pQK!RiyC z)~s*-@`nCI(O=McE3*pd<&)P;8ctnLKHsQ%9DQMj2d{SeVI>w#q?xy~TOO-?uQnod zMn#`qY$OyeoINK4f4u9QUm!Bv_$LEVVcmrLuT9b?l-PIa`(5X@nuZUH&Ogvf|ny}(v}VJ1nbeW-5ut{;bQ(g(qRYwpg+q6#HR*@muB9aaD_lU z?o(w4(RLmhJ?wPkvhEi`dlXij!A2;=h$wZKNiW1u$pT_DxZ3+4>^u(p%_5b{cTRU` z)Pt*s!M8_rd#{{hJH7{UxjXprJvR{BFwj7;YHTm}cY|Cba5kd4G_50I0%V$F^WgHm zy1UkN>gQII9NmSeB}r4>OT1>xZ>NtTVtIF*|5h&OD}XyNtH_Apt?mJzkTbrrE>Ri@V#E@gFgO4i9=aq-Sg=nd)^znh``M z)262mn^06+4Hxy2RpnKV^gsJ=%inVm5_bi@gcH=!c$pI=5TmdcGy{FJaTe<|gBd_q zI}DaHcZ}I*<2ftNh(wR!V0WLwn;S88SB|UZFZ0e_T{Gi>c5b9p+lQ2c>+RkATuEK3 zKWO;ttZz&T9vdn)9{Zv>#8&Hnr#4lg1q6?!v!FLd?h!g+D*tJ>5eQVeAewkpQ7z!{ zF65+&@d|48B?_1FU>;e-2}=K2B@&PxAEJjPP0A%g&e8vIm?np%GZ0UmHCV(F$%Aae z_N{13`r%C=y$78p=V^|~^`bA{%M_^GL6> z`oYZb;&w51@7s2v3A9<_-v=aswBi`R(UHdy`cL()D#&FNfLetD^t{aE*keORtFJb` z&@b-7DvHn#anyiIV1gmbKC}~9`HcS|3%v7{;#f}fH|%%pVmRcW2ts$j(5`g*@V062*3E&ckTN()n3PupZu@UNyi4yhBrQb)L@TA)wt3;Ius zr^S{XRcIRzS2v!;GM-oFuNO6lYX<=iC_g#%KVIn<9Cd3iK z-{xcHdnY@?w8R+LPUP8SVZ1!7ykYL*I=O%0H!0jgbL3ohup*~L5p;>9r}21+voj*h zZery}7#SCTNMm!Hw2%6_hc1rq#14FZJu@!>n#gA)Z{Z!)h=x&;7Xp3TA1T56~?C zs>^&~OUy(MbBdpl&9n=3((Od$v)pVb>R<|~21Jg_WQnwKo~)#eJwA3Lh2Pj?wfT?) zZQ5AHs{cN*7Wz}65G5k7{o^nzlXEah$~e?;xn2b`J$f>NE~m{dC?K(g!PS6arn4hf zJr}cX`1EI&`v|wxXyMJXM}5#2K=~I;_27*fVqDcd*>bX^EqMb8rB$d~m-!UPS^&0c z?L`%C&*Nmp6%EBgF8$mn$I=RXe*>;oX=)z85*D>UAh8 zJ_L0RG2FU(B|D*>E7B%mHFKr@X;0&L0U^DNdd3vc(6X#OfQr1@?y(rV((kox(_7~2 zZ=kpJx7$q-8DD{=@!7>u15(zkL#*HFqD9HthX5JH{NC)f_FCVKf3Vm+VJ@fRD zp}hsyct63Q2Bt>a;Q>-L<6cBfff5qA2v*Hn`($k8q7b@~U0Ekf?9Oe_p9HBEI#wUq z?_)Pv+#nMCfw%>tdL?Ptp|7EG_@=py zBxmzCd%O@ra;9mUk6npnpJpa!+ebKcFScH?j1jJK~| zCw5u2qxhFkYIPQOYkoIpo-JzUQLNFp2KALH0B#4nLw27;pVaTa@jEP^0Pk$VE#+kG zN<^2f8WH4vCR4)8aH+RFk$LlE$aVt>MpeMZoPe{jtNG&7jxa-#;q|3Y|2nwC{}$`S z5u;6rrG1imGx7Q*sD!yXa@RDmLQ`eCD8`u4nMGvj_r1f(m0?I>qps=3n!@tbl{SXw zY@xVJKj9qmXZ3IF=N`izaz%;YdHe(2h!i;Oit_BADcRd3$BmD9yQ9 zIk`R3LM~u}s}Zlz2cQrzw;6eE3<&wH@ccRUx3Xy|4D*=tbP)wPW-%FsQEd37hJ-*|GNnJ0$#Js)BZ(3YZ#o12qcMAkuH_6imn=wBe(AFB-xi2qBH#SJ) zXqd(LBOjtsFfgzF5W7T0@f76t`QI(JUro``@&#hmhL>T-gPs zC|7>cqa0nLDh3o$9>tlrKIDcWLV~(2>=wE!Zk!RqH#t|C*RUJ9(%Kk~7(&dgNG3YA z$0K@d2)B_@u+kC zIoga~T=zVZ0QP$TMeI2Gkvo>NlA(@k1eNdCZ~geKi3RHA6qV+fryuhs&RgP|jduma zlcNPq_w{&JCv|9}&DfY9EEm%Y(O$j(#AMN`kcb!Asc=WLNLlzDl#!VBc+?oiOaNpi z?|2Cq${Hn0CKdOMmC$^)Puj6CnrGK2Cf=O<3jU)p4VfPlneW;_>@=M`&8CWruV?0% z&}xYNwPq0u^TKF?@-l%uFj7?H&zII`ExZ&9??wBh4r4|#U$RH$u?X|3__`#XWA6g| zy~TvpHI!xC+UV;8B#M~t_*L9GHHw&DDbvvOTnN3XL!-_4I)>%od?h^xOPxPuI0?Tr z8-UIssM4#Bz7OPXwzcZo8N9bTdocDm}W-kw!edMtfDZqK@zRYk}q{tHvN2 zcISEL<)Wtw;8%Rl{mat3uVqo|{$u^h8p7Xe=+`0n>msTaHdpTaB;O{7@;hSmRHCpNUd8gnzcCPweU{o)s` zEzEKq$s-5U$32}dU^D031?R|s)|aNwxkz!N_YG+hvECd=LJzcsEvw5>AeE*IDJBcXOY*?c$R%~8kD9%q5b&n2ofL-;bMv>{TGcozHS zMB~wj0`*bCXVPHpieGIA+wQYZ*~HfaHy1(*06|aZ55`qheoX8XEk+g*yp&wnq-0==>r zHRM%m6z{ZL2rGS^84pNvvK4^MhoRLf3wppC+$RMiaAE^Azpy?yr6|PSsi(^Xh^shf zwOXf#x%O5>2zw|;a7JN*eP*cqRufqoxCQ7ohp6whb1xJzq6*Q)h?#}ayqORHW_>3#Q&}X-bxNh^+B~U1^5)A=Bm96y3()@ zo#1+$EWWo&q8goQ!Ru(;#{ACg#j)hLrxF{>zP`PFKGkY#Uq>%@*84nl-QiIC4cB@E z9+DQ0psmbAVb4Dz@8)}4Te_9#S6ceMdY(FQnhrBS6|*8#sx4R8YF zNPhUwWeKsiF7x#6oOUs`0 zX%6->nDI9(HIIEu-8@ok5&p&EQ{BVtQAjsA8qVi{q7aXI{F&&_8rIzBd?)ni;cIc% z6p+-&V$WqVt4{yqg7ODzg3CU~!2QsZoA{VPnYmYWlL381OfHk6W#IP6YAY^xg)y)#KRZakNV=oE-p<}y#K*+ z8onV)bdFPccQm)RRO)lA0J!if8C!MMLMt*?ve`cn_%bx!NcDZW4 zOoPR~j6}88BR_~3^1MqHRwe!fhd@t^Pm^BVr*&BH#R0sYlkn8q@4zW*fu^~|e&I-s z{fbxI`Tp0fUKXP=N5*(72ExjsYM;)Z`$-vvE9;p zcWDoLKjK_TMy&2!Sf;iCJW*nXXXmr&@!J>4FOR|I+BBuyJ1N9l(m1f*Qi;zD&ncU( zLTrEVJgzLrz>IGfbWUh9i4!ZSQGc!TZVOl|@Nw0YB1KqctMcM1Ahk!{;Pm49|!-={_iJbjyOq9t_U6-k4P1o__oAXzb=Yh~90>$L{DTHq_nhfWM{ z%}dEQXE2QVIG+r@Qc^eOaemd1rTd(L<^2Nd(_9&J^c0-05%Sq@R1iV3L8Ll}C&e&8 zHQ~(q>2%5vzm~MpQasgfd4)eY7Wi>DL_6r*+CexMCkHV>c>>4X#(BiQd9?gFW8Z_h z_M4`&j6coJsCU(h8#w9~?0qS2CbGJisYQ43-DHm`0mO}Xsi!j_{H^duo9=t~r#IO$ ziHI+`%uM6RG0c^Uhg@ik?kau)kFqbt!=HP}kgfl`34l+WayG4un0LXYQCtB4+GOFy zYdqqebn8`+kp#Pmrj^fw0xCe@K-7dG(6K z!>(-G_534#SGxXPsWThsGH-Eq^9j#lNagyujdSd20iTIEr67|t?Snm4`v>FO1BOS9 zlLN$iPj_zm?sJxs6#<=$?>ZpJP|Aiqvn%%T?mhpqZo&&GbT*IODN@Xz`|V97Kss_U z^xUBFSLjO7)$IRtRKEPr?LhhX$>K=d7y>;ksprCn5i}VgEi7HBM-w$6^=3MffcY*u zft=b_K}yxm)1Kg~3jU?8El`b^IKW8Op5%#fQ$w+N<#VjsS0s`UoGTNR`W0;JZYeJY zV-Z_}jz;u!w!wV3MC4$>CQKTR@e3Xb>exE$Ax&E>7gGFH`?Arln>04+!4l2-{qq+u zUk?sTw053!U$--WFVs%(+DXA2gF&3gm-$TlC3M^>bL3g!#6^zX$y%f+_ijA$e2`M*m zt-M}PU$`a9Rs9O9q?vt_6}@zwAdrWu-@WU;tw%>|JEh&|n-FbtC5nHlC_6>;1puok z*<#HLTiMnNzgfY3gp8fgT0J1H#M)XMmi2&p!q&e4LSqS2aQWCxG%qB4VoT%ng4_4*F)p7Dwo_)gd7 zK!hBJEcVhNfDHqi(V!F?=fkrk^TtzKQjhHl{<~K!Z7Yi>iblh)#;~+|N`RhgxbU@Z z$KNM}%BzAj+A*?g_~MHa5?FzBkW*ZObac?ME(L`C-XDui_Wky5zRs=!54Nto50>!ay@@p^U@uKt?d``}&*;Nu zM~XK;({%OtnUy6*5|vn>pOl0K^kQ?O9DP&BZhqL62tcNX<;ghjTYA&^eFSa00dmG< zw0Kr)2CP7-+xh_+;d3_rWlz)CP47C!VrU>NnBUndy!hygOgr~}o1j85xDjDOww z%crVV+Sb%2%IiuZL5*CtHTLWG zE5f9-x$zj{ucE*6##Y&K*PO%j=?eSXqEB-&A}9ttrGK6r6H*v4*!` zwd^^xCK3~bLtP{0CGIZVtO1f8v7EG7an5Jv#(}@jxGiT#<}81@dISi5D9}>l7ksQz zLZO1r;Pb3gt-|YxgS1ugvE2YcFr34<%IDE_nV6PjwP2`@3V;D&#p_)r$1fB3duvTP z%4dW*LV>HV>Er342Xh~|SJX$L(>ML`g9SN%dBHYkT!P*-@B$m0=hQ->W2os_u zlXZohHRv9VG!{%&^*_18VtZ=XBv36AnhJ6<5TjE1`RoN69TyE9L* zA@UsCxN7w9Hgej7BQSPU^t6AON6vlMWS2*Me+jr8@x7Ts+um{u*WXcB5ML2PyffBj z>lSg(v|pB&?Du|fNa)bn@593l7**wbot;79TD*dxbf1h%Ir0*{MJC`t+$c+ZBhh2R zbftVz5uGiQnPg375@R`iN%;#UDZWfQ;?{>v=YP{F{tuq=r2o5Gi67}N6D-qE@5lDr zk)%LG6*`shx#aRGSiQ?{8o>d>?qglp;IEq*t_kABKitQu72mq066tp;(jIWgfsAnr zo<%aXlQF-X(YGA$I{8mOnBxxg@c%%4DdYN?A7#hzG0APDiNZ8iiwJ$BnzV(i zA8o8`k*=SzurK2{m`U8cQG$RD)S!jfR1!&naOuR4Nj82muySN)iBOv_%WcLAxo;z3=V>(7>KYR#1rbH(hT@3Z z95(d6Gzfa%|5H!#+v!a_jJGYf4f<`e5oKU_(LR~8yzjUB9{#;g`jsJf+!h9g-`&Z; zhBL4GYDh$J4X|D$S|5-%tJLnnPu0`^;o(@_I} ziV-GHpgb7~c5jLQ(6T5z+y(lh2SW^~QU&s32gDfX5+$Ux=C$^4NI`9lgR_s(^f{We z*UeUNz1^TXAfL*qfs}d5l=BrXCXiu3ta3Tb80YKjhML=0Sh@fo$9ySaodD+x(n#z4 zNJ~b{XWcYj(Y7XU+MZgPn$cMqr_z4^U;(9%r6A|Sm}t86dAE=xGNyLsx4(}6xdelC z9}n2fhDDj&V-&$4*r6Cf;N8ALBhT(_2>bMmJ_OL4OBFc!uEN*=A^u7?xCN)O5#y>2fNmYowJ0C^#&H8lZi*8nUEPbiHA%$QR4MUq4+nd2I^L01Z_S^@IPKybd`Rbk+5%onWrP;^}zN^ z1{{V_iH%=aZ<>894TW9S@`m140ThOw^u0EPS|L^R0CV=tEY9lqT zqnF#z!VJ!DQ1sP9%J=&Dc~|0&rJCXidNT@XT!&I~dWHuk+=S%Qebc%LgH~&4S0O~y z#{+4@w|sgOY#4u=RDKmEl%r`hzjVIh0y32TyM%fFE@6^`^j$0SS|uxq`U1OadP22N zCL*Q_Dg$QDTfzYSuVNo``@S_HGj6D4IF$uLt-<1{v9gM0$P96Bbt*SZL7UCiLg0ac zlxbl^;zP1aD{)0e1lG@moS#toh3&=j?%8^fP%L659#^oW=Cj54^&<@4C2WQ&YgSxX zY?Zx$p0+qO(3OFNR^2=4efzvnkr?{AYBJE1&A7mCL50QniuAGS%ZJQ4a6$Eypwr~1 zu;4?z%!LEYNgd+O(2|w_UC&Nmm1k9ly|0T8yw(%n!uW%7#IhlD10-y{Kd{y?d4op0 z686|GSJz1>`^hE8$jl+UA3Sore~Zy0-a!i3pA=V|e_52Mh>9$Plkcj9p9N-XR7HHi z($qQ};DX>07TMr8Bo%c$d}6ikT0!lo{>xLSZk2wvinr!8ha3~>i^goZkbR6sDSkSh z5F(;FH|V75IqWubd`SczZ-{m*cMG#g?~uc;Vu9Isf3B(^5@j8|I(O}0clG})y4J%h zR4E}&ce;G%lL7!G)jx0MFQm%bVMKlS;y%o>_GeEd0q@4UpQI9Z6sD679Iu_yIkZ`eF;Ka?s^uSDXv0|7jhA}!PJ3j2U(EW+*A*xUVC&NO%~c5 zvSj3Hpg-^Q9X*nt+za1<3c^RsANUXhALNlgF^x zURa{@-_vh0wTTT88+OXLF^;C7Ign(kd$T-x=<}~=omz^zCO3<%o!bZO#TM4x7tKZB zyB^+n*%xmTAGWwc%5&}LjTl=xIY5!>Jl_$+vk?%luX)O#PS8Y(Mz7!TOBXx|hbTUVQ6>86 znShO@+*l3{>5iX_I17Ikeg@^E$GO>Rwsn|X-4L&T$d|T*@_wFPzip|M)BfbcuPc#( zmnC$;#P^zjp!|m-<${Pw$A*IKz2Muf;mE*iE71?pEex^5rCL;aoYLlq5NP)k(ixKY6ddpQ%eUDr#m0?YEb#l zuxATT=V;*Mzmtc9Uq2Pt?&apcG3ci8DT!a!Xa3;_zot2*#dcVUjO_?@?<-a}-mx%p z?ei$(D^-&>{JPCS>((;9p145g@cPPq?A!ufI<^Ie6xXdfkW`s+z`sm}^3)u9vf0>u zz`pZY5C;tAS%E9KiJ3AO5G!?>ryU9i-1#>)E_z+lYD0a1IDEm%3O7SXZJwQckn{*vz>2@lu_Lr0FCikL?H+cy zjwGP3fNk`6jJkrQW}SuESv*@lNU2bbuI#UbI`&y8wIlp2o(h zIZ_c^Y~|pO2{$jxJdxbZy8UtHC0$A&`la&f_B0bcZvYSZ!F||jqXGN=O4R)AQGO{$ z+M03Rdc5rl^YYS)fp0q&qYQOE&(%;S%J@68+z(@`P95)#Ph4Z7DgQs>F&?X%%^6JR z8#;Jfaq%>Sh@$r#M8=Bp;}+pRUfhf*XMBa1_SR#Pa$^uygaX-u!l+p+O_S?@jHh9| znN;7r1LgzZB|iXhVAgG|K@qw*Pw?7_Y!bQ*?1##bRGRY=wn&osOwnd5$#UxOeV6J; zE&0C9XFp!W5^PCT?LoEkEBAvZoYnplHFO6}OI}ClKr6*AJn}F2I{oEeN{H{-aeQm=2H+a-K$K&@%mQnHktt|*ZZ3$ zei9GG7SwCP`v#YaVl$w0U7=g6h>T|fM=wLKergJ!|%&?$yaHQx-B zz5L8OYk1g1{SV}yObcYlU(!e(Vxy_;e!`v&!i6xc7RRMf-kaaTaThH_>-nY$!ynbm zR?Wx(cz=@43>g@2ML;}{^H$Qa9~{@{!TJ79~`h+E)z)T zmumRU<{fL@=-z&6KkN>EoqA*gvR{{BkHL1Y{aq7}=g89<2*>x95+q{FFxjwv$kbWH9IiAy@8YQFTy;&SDr6DZ z=1WFA)@Mch-SGU29scdQdgoVIIhIe{^&#HL_Q%tw1O$m&rZqO@1y_SIFd2RHV?__`z+>X?}6yq!GpY`4+#BtY^P9S+7)P9qVYAp6Hy!Cg(WoUY#aO4JC9 zQvY4s6*;t*X#bxtY-$9)FZ&*c(j|p^BZb)*+k$@!zqH|!ajf$~s5KThP^K{=NM(@{ zIB`b7Y?rPs^!^bD`s6t%*l8&si>e${4)P%tC=$pMCaf6m1?V$gy-@^i5AvwZIw;cI z&1io7`G`ur{3WZ?T*%L*CmU-5H1kR-4x!G?u@%=!{3Y}Gr_Iz;{lAp5z!!BNJyIt4 zkDvm(@gD%v@cKvF`mD>Zy2s;Kp6U#Jp_u5OAnuf1|H6iBVWGv}OU*Pj_1rpVzks`Q zKX6Wc|4^D#0Yow5PbMN8d2Y(7zZ{8WIp>e+U-SuXr50pu)GW1k&WFjYUSdj0^YXUIt~}mF{r1}p z4a_PO99tXtxx!v^&%kBSv!5e+CjqP|Jk{G_z^`%*V+lNtS@cR7gF|a+x2gJ|UOO&Y zaL+=Fm^8l||Jw7#&-qxmoH$EMl{q5HgKxb9X85jFGE{x%B_(@3lY6}JsaKZGvH`t~-vwNqAL;GsZAB2%jTHdTxIKI@Yt(h#7I|cLXk&GNC(xY)Xeq627AhvY z$gf^rA1Wr+9i1Q;0i-Ko39(5cUP7uwh%vx6+z^ErnE3I|&rh#_(bOv{-IxIfZ}9?* zdN5+E6RoCWe92y*lOGX}WKCHSa|eWNw6FvCp5WN~A$H2_5$SL(IQLN+g`Ja18+^l_ zWj?IP-`0-<*%f^bk+XS3 z%#vCb%Ni2;HeyS<(j0Fln4FN8nb9?$JFCtGz6j(Bjwx)pDp5thmEH?_XI+6}S9wT|T@MFPDLc6*pRi$x zw}=@FIi`fE(IFeOr7K9cFWaAgqKQl=r^lhG>(Hdq;r&!s<2YFbS1{hr*eGLoV7#sF5-KEgGIMm~a1wAwVX|F-P>95hwQb%WIlxKug+9@!TxA% zLN1R2?vDY_h+gy(O5@ZDuX<@Z~Y@uJqan}r9-_$lG=W9!Bcu}}yuVrr4 zH`Iuiv4q649Pz{B4o-vOWym+e=`fv&!g-UDLqc#j+w2_muHPqV{#p;2LIi44x>=znnm_DQff&SEnt z!_b^Xjpq1wO}D@%TLnIfL8OvyFNF#T@r83Zi_k(&8KT~;a^YTke^u-aRtkNc1sEoO zWd5DNN(im}HtAJ@U^c|X6<^#qjGkQdvt=id3atSYLiIvZ7%H&Pvj?6XH~YEgJQ^TD^{| zZ!TQj<0B$rp3ac%Gr-%v@;91Mt{d9ZK$xKjxNki3F@qj?j7iBt(FwyX725>!fjzdJ z#?*g(TmSYA;pvc;_Zw#%?aErATu@v;i~ZzN@gTUuai=qOlyb2$3euSwp@|*Ny2Qde zaglZ76jsrwYowH-k_!}>&bxqqZ*I3NAdo8=Q)(oOnY~|%`(^s@#f9}*t?F4KigBNl zhPzs7TkdnH7@^Reh$rf*jrjzHF&|@xJ`H<=vn$g{mo<0Lr`@s|XwK~)aSTt5>2`Aq z>?+3Dq1|elT{hg3yCEi0zUy``&0YJ(mFvI4!Nz_z>7xYv!^nnQVO`fbv;+h*nB9-36<)SUC(OU+cI@TU+b ztkmK$zdj0<3NAZA$qoeg$KENU4ob#?h+H?cu!tp`3OE9)bTp&L<^zf|royK%ef7Uy zcj*J2l96(G-=#aB2KH{W)`YxG4V&-1hjRacp8q`miSDsrT)Y3rWRdEIG3j0_3f5wj zVZIKpi;rx{(cjqf5O0@ytr@Pp^sQxRxKYA=`EZmM2easLz+kY2WAt9=R?9oBuj6EZ zMinRx4(h7e30ve9V8-_u%yXGarhEqh{q6PGM(odh%e3s}f(M5s+P{?pf5mdFOLbza zGt0@JT$^H0V?S)JmeDPxUuqV#!j)V)O=VQ5M7MWxO`5!)u3y$W<>*B}uU~rKRc{`u z5e2I_Ym&{pCwdE1;R4m?+W^&W5xV`!#aSmdSPmje_93kU7j|z@ia1Vk6eKF3fF|MZ z&5*tTzcO)K4YvbVk0l&RY3C+oSq&h>%Xj9)ZW?r8xZ-g$d_!q7zs#{eH>hF64K88v zrtou{sgyfjD*GG{cUsS2ZpNkQi8-wH zy}jdxC0e$6SsV4?*yy+qJLrbH?xTNo;rp|{+%uOMtq08rU)7mQ;PR&@t)>#pdN4|Q zxNh)%e>`eOmvz`JGwDj^u|0fg$1YIy?Y@7NK(2;g)jObfoLWpCJvVk17;RLcxqgf6 z%`GYXOk!NlfA55r?Xh}=`Jjy)?|o@mMgHz%#5aj}yy5X11FA8aropn1gsXx%j4f(? z$%yT>qT)2q)!lV1VVz8?^y@mY-t|7|n{Rj6e#mS-b8&M7f6e?ZxKug>Jf-?^4>`z% zjv1`EtP4?mxc{Nh0<|Z>b1!aoMy|wCIt_2_&hh+gPQbE5`wP0f0p*Bgeorp%ozr&< zVuygm*27MqawX|gt=$T}igzpy5p6-m%MThHHQr1R2a|5JjsjLJ=$JwnU7h9;{RBTBUIJ4IvpME)I0H(pOKVp=}m_93;g zRtvPY&ToDKkMZE5t!&bj7;i$N(5-&rXhj?t`OqxnaalY=of>kFc@}nDdIu&i{JdX1 zxIeuXJLW}yzc+r9T_`e+cKSl4MgwQH(fF>Kj}?RthiD{hlVGI#q5$jbD+{9Gz9Is9 z%Ne2yb$XU7gD_)D{2!6I@d>#9wte{zCpF~S+po^o!#KV?Ezq9yWgxZrLcjt~_0l6* z-)>VL>tQQK_x0#8uz*}0x$e1Rw-tZMs(t)iARP0BctwBWz0msRbg+cst#C>U*hGO9 zq^G*<%5wcqU;DnP3&`AdZ%SW;QL4nq3aN4=8>RgAepIj5)aMOEBkn9G3CmNOY52`~ z@K3rQK&S5)1qQHZ79riffLu8#U50P$ogC|aRB{;1!&uEKMumK}b@F_2r^D-)2nKU8 zm)ycg@`F^Iq7!W~uu<9SPPf0Zp`~oQ!$tD9?+k$KQayXo&Z!6u*Qe$Z zy>0q*74Vnq8R3sA^ZDE%F6h^{(pmE?#^jcx?0pgvGf^Awjp=PA2{xKePiJQ*0FUIN zB`A(xJ_TwK{!rt9u^5Oi+M$fyunZ;DWNCVI&Lb01_Hl6JdX$7aK(dGMIs0)zfT=&0 zYa_)J4zv`&_wKEI{k>wEGI%X^DW`;!20dwzh8%Q|;=`$|dH*k*$>Z-eRf|7!EgOXU zbO?}XoBh-vtx7Py--(pa&1EdBfb{2H$q@<^8otn|QDJpc{r#rhO~l%YQ(44?`ctuJ zQG0XH3o(xy@r zTCnHeB)aVgJJ(sbeJ27t-#Dr2bhlUPW2XmnWR7+rGJj;)?f*pPgZ!ps}8HE;4HAMZ}_Y?yClo|9t76!}AqK{MAYo@WynO?&4 ze5>?XRUXR~)h1Th>g+^VTg80aDRREbvi8_i4^7}*$9!+6$OXbBRwEv)9%J}_guP`{ zn_;sB8r+JzQ{0NXySG3gxJ#i>thgq)6pEEXaWC#}f#U8?fg;6S0tCqAtn=A9=dOGI zJuCS+@67Dkvu6e+R3|e~w_f2U8OEL6$?Hsf=Rvq-jtsc;W>&If@DIy$o`_iSF;ORF zCfcKCQ3q~jS52jR@+K>#*JG)YRS?NmCC(}Sjy66_kCe*d9SBmeB`l`Q-6kh-pa|=7 zH-TA41md6Z-<)2nFos_&3r65li)(Pf+fl%fb9Ky;1x<7mq*ITNptIwr*U!m&J*)7$>N)5&bNhbI zjwp#7oBpkcbF6?Y<<=8r#?mzf;(pPM8ota&l8X}%+WS4k4ZYbJ;mX|K`j~15+veYH zXBm(V81-pG5N6_sJoUW{fq1icI88e_o!b3v>@Y(GDy>`R~@xKw(8UBL!yW~AcGX9o<3*KJ9EDlUIcFHvd4a$vzwjcc6@(_PJ z>u3%+xHt#M!o!OEX+*+{Am=4=JCx0%w95DXX=O7vSyORHrU-oxe)?dot2TF$e9YV* zIo*tEA|#4mUcPKK^dnfWkSi~(SkCk+MO38x#}G<~@t&w<2Ky^a^!YES#h-!*U-=}l zjXkz>;6c|_-3Ehmep&7CE}-e{r8Ckga3x6DxC}}gh9CzFb*RgM-N%hR!^iry*b*4# ztmULc(VF!;_gm#c;2M_Jx`_K}L+^=)6#13{ZQ!r8KB<8jF7=mpHisRket03`R4}yO zzfKQln(e&0L37^-ZSPt>3u*?~ z+~DuJe;>5Yer`h9f#LB3;P%HzIl=RPp9Eq zKwi`9-hh}gXkYI`gV&`t^>Ni|yZCGB zqrRVs%X87IQ=$_EQJrp#WwG67s>fNpd7F>lCck~q_WHn|+LhfYi}6j#RDy1g(bMrk z4SDS3in^lqMj>?V%za_1{pbgI9JwxfC41gvZ_zs`8V~`}((6BKIaxg16Th)rxV%#P zB{v+yu%hrUB%A$Xe3Th)MJQ(E(|e=f%!{OO&4o7$UXFzaR7nU8lL>^dyyjE8DQsufcIGG?o064AUwAuGj)tQScOzM7lKXu%qEwKX*IS zkkaA@s}O(X&?e7rtoI+&AD#T(rG)`kQC&IFeBJ!+_nUH#P#!n*=)v`(^(Pt3OJM@Y zW?!%ZB-MOY^i;7Wcf)X@28VzF?~oI7U)^+rt&p+$e&}e|cPT5IAg67KlwA-?_e5Am z%ns)XGv)u3QqT_l17odo45bJWmdpF#Rk-f3dB-Hm)9{lM?xEi^L3omXahmRDhg|<2 z4e#^(lv$!k3my9Kd)OpCj$!#w5h-r2bQmD~o=?#_CjGY zflS@(Q$0Tyl2@k@&kK&SNd`B~v}L{~*xBN=@AoF!TTc#Ou1ylb-?dE)@V1IWKk~9L zybgW{lu%-e4IEJV%=Eu!sQ9o33`pGY_GYJe< z)JFaq0{E@D_-8x(d|Y3iN~X(j%L%Lsm{1;_jaj`{F=`h)%iE~DTQ5UK9IqTs{ES^xkpJ&PzES(G1gHK zRoP1Tt4(J$x&=#6h@>}H(1!BP;L|{Rx*$rpTLqi%#nIkGU~SH-1WA`P8h7^Wp4!<3j3Ib2P@J!6du@Xv?_-L_y#8D4K_rKiv+YiN z=XQ;?6QMAa#$rUe|Iyw1*G3^O*;&oRF6+f)u1sppZ>4qtf@R(n1HDm{3yPNY-jFqX4@;im+aE$j6b zmOr7+c~@}e%S|qis1TylqwpX8*W!dP)oje1*;o=v5(Pf@N=+f|kI&?bdVRm)xwTY^ zilUA9wCW|jy0|N zyXHYYY>)<_nVmK_JAG#ZJapA#lD>X2)X}ghkmYe-T7*xUJ2D>ZWe4w;|Dg*wUlbVC z{tH_aS+91DW#f(55BGPZuRQ&gDh)j&uBe8scU(O_y9<)%rH5}4INKBG#(E?SNI){D zD8A4sDPsAj#Cw%<(-EQ!C7V-j>j5PSezlrHt!+^LC&7X650y=yc%MC!*LfJkQw~XT zFR)l9u%YdE0r#X)7TvLQAu~+=gksl8_#X!t)X`#Cp_%2 zcODz`)!S@Z^bs}0r8FfPCBHjA;!n+~YMp+yCkaLzD#D4?X=2`SnO^3`t80;I+aBJK z9&{#9)%DXvNc;2{UdX@l8yL2#YJD2Z;1W9vJ9vL#eHpqDG4$Jp2LCQBZA6;z(fN?A zAzkO?;PzC3g@qm`9nI>%-?KOEYAA2(z+V)g9GiG{XW?(UcC!8oR`XZSBWFh!zq@Ny z^2!lB#hk+Zi1;M>9swinATCeArt%56u;0{PZ7aYE3F)^66B(>`umYYx}{-#SNE#qm?k0+#@1Hgj>b z$g6Kk%B@dp%ZAE=)FVHq<0c18zsz2!bZHTKgUT_YUGtS z87&~Rlzh{0JdsIJ1Z6d=YHTRV)msFBrZKPUNl{7hiPGa*rYMiQL`%&5J#DU#E&$Sr zw2@uul3|59H3U%p2yp~vF6awno1f57=|j-CBe!0M#LHshJvK}0KVIrlwB~Z45&_;L zOG9ci1DkQCkjd23-+N5!9%MhJ)c^fd_gZ)(gPh^~o?XPH&>ig*!J{(~eN%Kw#_sL5 zAYf%A3@@zq2guG4^v4lDo!?g0tcB7my1^AKSMyCZ;S)9)s3g z86+dE)_U+OwYb;u(mx+}aPLou-T(dD1(Fi#B>(vaApf=)!ALbp6-_;e(C6Lf1EiYo zjoeN8=W0mxqb7)A=P_IJCu+o%sC3j%cA_2u=AIHB5w_xK#t&yH;EjVjYV8WGZ_iGX zF$hXVo}H?2dE`c8tXDEd9VcaAIzv4Jd&U?vpeC*pbmgntO^mj7lS9;rC& zUvH(}HMj(yMFyFiMbBWjlP6l137pruOBIV-BXJ}7Lq_kkPYfO511`QQ;MN;Is~xsa z`_wiEYc9;7*9yoCiMMm=+D6qQ@Cz_g@X)4aCqoF|y9_|j*4MfB5v35hUls081#z~p zpRWpUrgDFfeeFZ#jP|)?!wI20H+6(Jl#S*XWn!XfZ1j!Z`a_M}7O ztg;6Fpc(Z1^hLmwGX*uwrB;Mjy+%ry2LHzxUc{X@4yQnl0$&W>tRaa>7SFA_{|}Uq z@#$C3nsi+gzoX`@nUmxD+$cAu(Y8E2@o4cMA#;^xh!}ZoH$BUmZF)N0Q_Ke&E?Ot< zXz){mC-H- zEP|bFl8?-6xq7{Rm-DRVNF%IKG4T`hbh8!V;~IHFs>*Gr%XSn2qCDX7TVZUebz3=? zmKX_OFpIs4n3ydv18A!vxVXXzSh-OH_#yt3>F4Nw>zv)A-$TcU9{kgY*r-Td7E4Rq zG7l*zCj3C8^tH;za;en&rY52`XzkZPD)UYhMz-S(weS33$#IYI)x#?E7&+$@!v7FL}O*yRS)1sE?Oj7LJb9yaMzyOli!F5aP#R%9#`|$ z$&2CAM9WBJRVV8bOi5#tI3Iu2;5LzLb4HeWx4G@GKolNGONZ3mp(MzcYQE}wLHw{( z)%n}O>1w2z<$Se$>t=cgK{35k>0mn#-IZ$k=y%!g$x#H;wVOeBe5ft7ep8-CV&kTA zuyaicHouq-wvTf+Vm{DSI5)ESKAl=vk~BFyk++a>W#YM~c}hsD`J-c&IlNdXZ*8Mt zyq*HrcEeb3;(*?kaHjt(1%n86#fE(-jF~*(H=j03 zzg}vhlCtpM0TZqt&#r#o9)75r{9YAouHZ(5Sa)SrY=L-R1PQu!=M4elBNm2!nVBw* zbr}W>U?`jdbkFTh3C7>vo9hhw%YSz8y#EYlZ&B=RM*IEvvZtP17RDP6fXIHwYe50e zv_khu5cK-Fwu7t;5Qi}Hta&;JdBSc+uimCy^TPJ?fxTZif!yin=m(WaI5ylyjpF)1 z+<8RmlTTf@O33F6F+^nCE;zfl+HXQ_9<1A0Q9V8qAE8F5i&eESfuGifxB}kAXfzC4 zvmhS(W`20DqLg=qt%+XZ$w0i{pVO>%d|9d7`36XYv@lF&!ffP zxsp1%QvFVckFo%)orxt%XdReZbl4iY1TJ@!)PSvo?7cYWej%&L9EN zstQJDFz|o|=wXrh3HdlXT3ts|H(t?FiesGPw=04(ezzsZRCOr6&V2vd0ZssqS<0GS z!J^nuK>*2iPSHrXjNhrrtAWM z#$aJ^!a7)A*I$18B+pc^ha(NYUAO~!W!NVMVx=`VQDjuv;NT*D{8JgYvnSj$X+E{{ z$g~pC(KQ6HFa|b+ZYf&rKGeMrLQtvy^yvL_i1JjCxnAWoGKUJhdd*KDL&7=yv$o5u zv&jCf9(5^Uzyh=UuWYXF2VW;bYPF9bZi_E~H6wwF3FWAgj1-tMPptGLD%(O=W2&0am8Y1mo9eO|$0t%&i@5|S0q2t6tx+!OBDICcNL9OK z*?glpKn{|U?Uca_Zm^)N+4sM_t?1wZSVgCFx7J94EDr035oP98Q(T~MS{e~E?Df9vnma6E2-rUtcknXv z)x`sS*({PYp(#z??A9e)vPqf->fBh2l+20O7NO-AYz=~15x>dbN>vLf=d2V%XWh5zaH6_kPCMgMg5 zCfL+w1hls1XMhH?a{Tp>?_MP`^C1d|SqE@4Hm{bwxqz9VUkYk~uw-stK|y@&8%yY8 zIT+hkyd<1;eNSh#ndaE~N5&yP5NvGN7}9GL!43=vVGe%vR;3pKJK`r5pFvfhK;0yW zD^94fL@!-q;)qUjASIh@=9tx{ZZD2kzX)oId4{r_yXo1ZtXEfg0my~W z^x+ay-w=+|if3x5|CxUO1;A(-n*I&5BTH~JR*HUI_}&X8s34h`9oy#N;Iw&wDoW;F z13#I+p}xZc7Bxh9NKk|(=ex1>Kg;yQO6%wX3MtgZKABrV?}46U;yf45!t|10Ks-)+X#3p)lv^3zv7(E!z^bG`RB-O zo<>6F;K3U|<7ryyZd0{7@$eeqwzZrbe3sL~rTHEORp1r+{OOh&cHZGiC9esp#K-RX z^aw_x>>ca~YB^`*c0ku+)?;3vg*}~o1EDVON^t1kdHISQz6;`dq0hLtC-+b!CY1m_RF!S_`IK#rm6-lw@;9E^c8v`3e{k#=eIq^Uhi21`t%EIs79pHiaDJtLTwQ6`1fZW&?s z@qhaSkVAx@w7$qRh*$`MCqI0@R|vGJ4f>e(Z!Af+dE}34G9Wx?DbXyBg#fRM(Ll zaxyMNdH_t6$;Uv-+SWjxm&?G_HLD!}!ue{w>Cn}GAw>}|wAwQO-fYLvYr0bLK@AdA zk5%$PzMya|?_bIIpN~hnS`5HHqIf*n*4HiOYVIft330Hn%pg8Kb;{t*Yv}`nWU|)2 z4bNyR-(8STt=3JWU;pQm+~b7YD(W3HI%1K{lpIW%>XcLuG1KqjMQ#F}!nK;8+NG-`Ms`^0(kz1$5-5$||>BBcKTt5PV+$sfnLv zEjgoXVtF!~{lxC$6XS2^!9sRpRod6yNSyv=HY|OVv}HeR;~LcJ-1Q;KPOr4@tMMgK zMP>J$E7M351?iKVKLGyluVl1UBq4^T)dkajDaB?dAVRd7RXMy{)7o**05wG`V2K5$pPf~6;$42_+sAGw|7M4h6dc09rrZF&N8pMZKi2nxO`qx!Aw<#&HqmHnBYcO4bymA?8ecxA@dPs;yh{!=0L4UL%? ze|n>6pyvOS%BxXt0spXdP`7<<93u~qv?OwP9?63D@6NPT@U|Q}MwlhldkP-h8}tXw z=Ox_}=MNJ%W(QSyvZ(Je06q+X;Eq*AyOI?Z+A^H}VcoVPVHI>;ZwsE+x28^j zZY`l9uj2y82%*OB7iFGOk8_1c`?Fdo(!cqu1{Mw10|1G7d76i$d<{q>J0Z~;@*o>W zl-E`oL=r5^uaceye|2|_-ct^pZni6Y9{MF`DOVFd#1{J<=Pk?wNFREc-$NijGX(8T zLG0*k`2;s4j^Fa4Qw)yRx%iB3hJ##(3Y9JY{(PI~BeBxLjp9QUVntWmr*^(J=u+N| z0;M(TxNc`((T^N>QiEwORpTmkJ`P&5qb=Rt**2W>UD_c^4ct}S`*abz1f#Z{^_Rw zB13TTGXVdv_#^mr-b`xdKxvq$O62Mbtf)Xf2bNGst3S1W1)%w6Bb6ey>2t)0rEwmY z#+uEqCo=Z{Br1}c^bj4ufc4LcPf&0>Iu#bs_@xubY3KwYx2jCPLAhhqjx{R-*rLcW zwfd@hz1kL5z6qOj%!B~L?Xb`u%y!k>BK_odI~5qUTRIbTX*!NLc^AOye=%>gcBSCt zbn^%(J=a)C!8!Rzi&*aNP2^1YS;>6Puec zn!vSJmV&69Ix_m;DcuX@Lc4$~P58~??Q+h#SQ_T$4Z=72p)E}20;z{=uBbQVmNBLN zWA1(C_-$>poJ4tPL;4aL2n-6-Yrg!6w(Z~Mk<;D)G^)DLUGs*=8JaC|8H`hcT-5UR zF!KXInNSAp-Y8+S*JruU_2sQ5Pl#%0kMT3lf=5v+;_BpHWWvHOuQl<8G}>D3(@(5c zF0xZ|T!7?dBnv_dph5St@;M^>4s)@xJCMH~I@nx#O{jZ7=7cdPUv82p%npqI-9vV2 z<)1{?zk>A1AoIT~r+(3<=0^PfsxE!Dr-S5{g_Zry}T{+nYHF;8GK5g-d9GzY!Q=@ z)Jp8Ub3RClow;bEO98_*Rk2(doi>lD5~O4VhA)B$4@uu~s%$jbd(sF5+NUzt!Xb}) zq$b37?dC+FXQK;lkamDSB7Ald=bF|FXO5-nunF)1*GeIGF!&t_5ABWFn|JO5gBTqW zE21Qce@LZ)Ue#%gU!-pQ&ESsthUtZ*E%8vo>Zl}`lgdPaf&$u7hZxCBi$U;Z`J~zW zFkyV}hGX58941HcfL13gKPm|&oYtLyVTw80Wf1w%U#bfAd=>T;Q394)0-V7*?=Y#| znel=Ld%dgMuZw00?VqFi%feapr|ijR9wA6PC;byfX4Jy-vzt(oI>PzQGCG2J&f6!M zc@^KeA^MUwu?@vZqD${3M)1FY*MC2@BmXmY4*?fYV=1+cbNR%1xh3Wm3HQ|s5&i5c zTs6tU*wCW%8~Dsj{89E4>u!6?#qMY1*BHcTP2d0U)sw_~DojdcI#FdeOWkdFD$;eR zjIwQHS71c9{}x8!pm=G57FuJnKzVc!SBMaOvm$3UHAab7)NXxw^9_-); zXUOntD2gLqdcq|JspP>zkw|ju3RQlC$)h;rAMasM9ZT3|1`r`4c+gm0u!}^|vY~R@e zGTs`eo0~xY)^c~qU39$qy7fc<)JLWi&iDJd8U{R5kH=6VM2X4U=DpoMa6O{(M`*K3 zeH;&75T24BrS1j!6)S-%U@l;Lck&ohAl`HHFbs)-yWuL84$6Jb9;6B#|Af<(9r77q z4sp=0bIpa^U^ASg{fZ*&{HCdwcAnxS{~vtzf4e#8=-)^Tm#nsm)FSQxA%s1cx=>ou zX86Q~rggA{orFsEN$2M41zDR%ONJ}H>;F-)cg?h4aST~l+_;NuHJb*K@?$< zMSHYA$buHb5(}l%cjB*fsqy$Z@UICo-=N^FXoh~1j_^ZNe^CA$`3eIRSBY=8G%U-a1$+qdWX!jE0wSe zK#*UEV&!i+B5MnM{v$5nWkUYc2qk{&K@rV}6M=z^Jol{jho4wqoJ-6?`~9BAa{3+p zTTdC7`(fF**VeY~oD|fo(;W44y1@-3*Q|RKA>e6Y;IH}me5TXBZ@(DTJ9Yx%w%L_o zx$S1znXAc982`ubmH+McUUaZTG&z83BouNTk2gk{h8R_%$78Iy`@L6LQq98Ama!!; zCv>uqnXXrnj+F}cE?vgqM?4h@c7o&nPm*ZjE1nrJgf%(SGsKLbyRrD%?%J6;}nx`N*Cs#}oU>_SxYjb^1IVCLnq4ty#jj;u8 zD5m^rh!sdIMu=7MmNDy8D`%gMqU0Be0=-se`^-{geg`TPQQt6OjV-+Fx>eJGaj8WR ztOfcevXe9toc!uo+y?wC=Y%~}II#JE&ObaL#)iEg zAZnuFqSgUWBl@SRXh!8Z6s}-wsN8n6Pqq z*#Q0~6mnI+t#WZ68=3vLG#B1^ZD#9k$0nuXP&Bz=h)~#6B3RBVFl7egRzlsEBlZdO zQ7&1Lxh+?RBfYJ)WTm`bR71OspV6gUajg6di9!X#w?DCX-$HBYWhyHnx(2kC1mR?Z z>;}rQqIXwp3}3B-Obgy3OsU{|y<1%VdK2`*Jnp8ubzRjf1GQr|kCYv&H`aM8oE!vK z(XiQ>h{}&1V2>1`zr)+gFBn8%7{3It!4PW)C-er`T0z3u; zT(vGD-_~hJ=7bkJ+!TzO7{9KcyFL-)__jKXx_TS-scsGun4551m*>q%OntH`@9RUa zC$cQZI0EzEZ62;vZkg{g7QiPcDYcu+3M_y%V~jp3{{~o+!*Mu2epgIDmy0{Rm}bfU z@>qE$K`7=Y9>u98WTPf4J%IT*$@pc>R_7;0Cc4suvNGW2(4Lp)IiKSY6`y|q^ipii z3B1=d^!r9>!EKO47NRICtwi>vPb}?0+LHDiCsGUD zN8hP4UMf5Xh}w0Ori>22ZTZ!D;bF=f%pql(zvPw3W|){9_(Ww>W=3RF(POE2J=Unp zK<3sP4{cpf?4)gTbvMEkFdlm|5!o4`Apr~Ba8fR)AjV^A@XT6|_xvnD>*7qMNenOm zyj9DEZv{jw29~v$b*x&JAvD-xAu4cyr`?a&1h!^h88A1-x>Ky%lI;1t@cTNFKioeM zJ;)E~`67PC=K13iSq;}O;-gw@_R!tN;Bw4 zeERdH_ebpHq?<$T%pS8Re;Z6|28PJ`n+7!D>1=}8kn9sK?cU3pW~#HH&b1TBv&~cz zS`qu7&`FdbU9Uu&={w~PcnWX?s-(D`>I;4Zv2dr22jipP1+gyc z-JJymIlviGqOF=xvykbqy9jIx-{aCnLNa#szTIPV+>z@p8cyf`^RJ3Mf%@1#_#QD!&qv-R6u;tkBLUC)Dp`h1v@8jjRItwe9c=g8GT^M9_5O zimXpE@OS9T4NlR0wPQuwRxn29qD=ZZ<|Iy48KdmW3RU?l&s^0pOt5T@LE~(|M}&^6F`tOx*;w-X9a-NCIfyl9_*Wmj zCID&u&?Wu8nA4ucCgcHd_3Xe1`}RYmuEH!8$9^PVSpBd*>4D#$II8c^RW;5&WnSP^ z@J5l@wL_X1eh(5+YV;P}n&t4U=058h3=tq}zyU@l! z{8iGv%QYM8Liv4F`pQ@D1MllarI4Od(!c$FO|o>Q>-N0t#>|265g-t)q)-a?c)PF= z!c~ilIz`NqUMbfFVtxXd{T|K!8@E#akOMILiW+fL&(Tb@xm<~eSz)!_#lntkLK^mT&;I0PeV`DXX8(R3r( zdNiI$}S|;Rc+(?=e-PL!V^0a+;8luu9m&>dnm}i zZ8|x#{)|#8oQ@?QxGyJUl&d}`@YW{Z>_D1Ra7rkd=!SB6V8zuvV|T>WVVFYbg!9Zx z`e+t+;IKwJ74@t>o(GpYZve?Wj8E`nA7(-|30>4B2oVH?_8q3OMYs3p;TC6i7baJH z@6kUjAkb362-O;7=|cPCVJjAc_c}^)pUFU2MMll3qEiAH(t+{SV?TFHR*g2L%1DP& zT1^K4;OVONu;{vN0-0f}1QBiS;su0m-Pm7VowSI3LS@Xto$9eDx{`;T4tmca+PDRl z8?afNSDFV|08=J%etxZak27WC*u9}M>yNr=?wL>#>+>4XvAkUQmCn=9BrK!s;~IpzZt!9Pie~` z3mv0gW35MQ3x=SWGK;BBj3QF2E8Za(;@;d{k1}>X849*Cs3AYFQ^%a(>OEiMY`H2z zazcQ~)dmO^hU>#5Gr<<+WAiDbArsP`HpakT5R->dJ!}V3h&^3mlm=G8De5Lih8qI` z6<7gh|0#5cprCZ0dA~+T#S0mtKP#CvGY1`Wm)Lgyv0Y2%t)*|Cu+E(+EH6NbLVq$4 zU)|Qklpyg{FwUDH+Qurlk5&oj;UKNr9N$Q%P!xPtebUwycs+8#wQH6{D(OF$5fd(0 zn&@A#MeDk`v|b%}e6+iL>?W}MP|$#RGKi1hUmfM*9veInVA?1oj`U6QujUg6i|Hv% z+dh9c^6`r{Uw+A?z)U+Q-qH!)K_R8T9)%mJe8MW zt`!c*{n{`#vJ9*}xGx0t)bTS_DdMKXnP`l;&dZ(b#c$}Ww-@gawVF9ZGYZjnE?oF0 z|C)QuOJ8@D!WsoS`ZSkpNu+qzxfJOQbM}WeUXA^n++(cv}Vt)o*6|`m) z(|ibGV~Yvgkay=GV;8I>3X{66E-TQ)nTZ^}(ea;~+iPeW0SK^D&rPh7kDj2?;7vpq+7h9uP99&949f09|6L$gNd>@tpVb zlT6q=Oa#H`(U07)uQp#P@dy8Z%5!{VW(zuUO*CA~*9VqKr8yiU2ZE|*(2>h6S$O~# zO3p-MXb~}Anc#gEwd3W8naF)^a1up%Uw<^xqa;CC%D5lhND@bIa{X>6K9LorpJK7` zYZVZ6-hKXM4`4u%4t2mWc}%G0y|Vvd{!Ke3pbg%U6`!>ODC8M&DA)d67 z^^YutbX*Y@&vF{*=ZskA}( z_1WGcO2}T(T`B|s{}X@G5sygKI6S;c>3FhexVoW#BHV(|$Dy6&M4=U|4)(j>*r-O; zYd%|eN7GH$yVO!zCTq2RI&HfX2I0HDB@KY|R<3u^iH&;^zo}9K2cZtlOP)A7?Y!!a zCT%oko_jaI8;Q+|kG|5#CwRxX zzbCx2*GebiCT$=n+pj`_D)nob=paCs2z0+9vjs9I*7uxr*CqdaNN*ZMU11>eWVm_t z>Teap@I#Nx$xF5*5P{v&--!fsa|6mY%8OYyEgFG(8Ai|B8;FnQtPz|)hx+YURuLbX zgYr$L0iV+uU`LI0ESBQpHs!|gdvjIT3ufMb`o8jUGVvI6bIaG+FfCaRrvFej-1K!Q6^({*i=Qe?2tW z`u`d4LkIATX^96>+1FBv{fKMJOY57(gI~_Sl|#np`bTypvO{k%&-JvHgA>$(2Ex9f zoQs5(?pyGi?_yeng>r9m5X=Z6^mv>kRm#}3la9gb7WhA z$tWYNvM-k&)$0+v&szu2OK^9W&(-|IlU9dVOi@hn5Ic60=D}XAw}yXd(}w9699z}M zJSGJ;?A=BY&%`LAPz+yf7H;O#F$w;2{lEz7CrYVLo z*KiqWHAqf)9`ZIT#%Z6P{);m|nk)~_C{o8Ja-yrIGHc{6m;K?3U)RKg-!O8bglG>q z_7&WO$3s+VZfexL@juQV510Nb8;FPaIgdYG!Fsx-HS>~>A#Gc#E!C67%_HJ4wO|qfH|+ObRM>QF2%FYpy2u${G+b+76M>T|c$I6B0F+R%g zF}W@Dc$tl>gci)+=b0Q{Rr!HZDOF^3WOTvZEY>8qcKvz?|C@ga3R^<{2MM>W9DBOq zOz?z>u{);M-wCesZxmD#yh(7!5j&_y1k0ZGX0$>mx{tKjDKHR5j2>Ojd_8#jCcSQa zBjXeo9>dPLT3v+oYA1~_Ue1i+SC9;7%BPgQ+Cs!2dbR&yi7eN@#GDMA0IYJ95>`Np ze1#c3<85qPc7s9;4L*ZxB=L)BF?C9Z3294*Fgl`^6PXjf6>G7bzZ&{ZqD=lfxWr{v^y|QuiiV;9YFo3?wJM4WhVKe^GnG(8vH*j-`CL2 z+jEanP<%gj!&4V=xb9Q;zrOySMQ=WG`+CZX#SX z`*Z42AMWO-y_o%p?xo(9-92qSL%Yz{Ciig#A>OPA*VEse$fp4JYK#cZ1!bp>(w}t3 z%tFh0Q+T|Z5=vqaH1w11t2sv@`5vVkvt{dD%SQ4ijQ%;DT#9UOExS*DYf}u(qhP|VE%x))^%O@w)qxxi_`LSQYjSQ>q4wAH+Yw^VKo8mj?Zzyo_-)N? z@9)C6i=6UiKdM>eYA#?Q)*-^wiR8{;Rs}w=mTHH-jPR7BigGzpZdoh4IE^(nGlPND zd9X3D?_lKf?Gu%OHl2#) zl_7y^b=@hg&MH$xa1_^rWahaHboR8GF&nw$C=?yVkutWGWi)UyTP$>~L$mAZ>`ZLo zDU6_N$Cv&22%@LLrq!SZQ~tPUqK2fdPOI?VB)wB5*`M2WD?0UPdS=faRy&b;QY<$0P=V zuw|x0W7{CgFZw5Zw;CjM{?kQICw}Z~Nomjy;J$vADx#jDdDxJ_+T>`!Tdzzy9R9zv z?{pbBzy*YP5d^M<83HL0#kcZz;xH8&Vrt!FXh47O9vuBMH7(L|+s_gA0ANQ02p zbKYoQG!(uw9WJdqvm^nZU^uD$aBvm&23PAxyqYu<`aoldF| z*D;~3hR>hE?@y3kX61nw8_(}AohE0$T(&mXv??IM?Mf<<$v_nbESe-vyStAAx$)~RK4N%q)ZJOO|nzWS( zM|Vyp&3uL~m#kr%s+vLxM`k8^GRTLy46KQN{t`?_J1<<J)lDml9hqHSFrg|}p4dY3!Jh~v9jNz&)p1rYQsO3j1wL|$FTS213mQ-NNH>N47!*_I zpWMCSYc$-)IfQE5@Qb|5zip^QG6*#)5P=_Nw76&zEX-4L#N`*ib9|C6M}oHM^HyRfGG7R!uE+h7VMS-hEl=D|sk^@?Kh5aW zpH1)K#77^RTgO+1;OS^i72N`)$T<{jU(X{mXio_e<}q^cm#_(yyqj%%HY550adBh0 z5yt|zLj#-qM&)O!Q`UPO5fIF9Hh=2(NI!LMj(*u3^S%mU%Q%$2OaV(hh;90rf&htJxQOgme*?hW}!U#W*}f( z^;O4vU}S)F^@(9?4aB<*?DS_*0%b z7yWEz#qBE}p_r6Y@-uDuGl}0{K1XkeczCSHliDr{ANAfs- zc6cd*P3@Z1S{yP+$8fsmuv&Das!MoYJ_u0LSx|OmPMMlMs(qXpO2UdRe;OX?hr-?B zo*XxN$GS4<cs=tlxHh;s z_4Y@-SnZG$bk=y)oP2rDw{b0Ic{&Qf9ehcbaIw(LBbP_D3zt_({s6vSKoJWTV)-!f1xk}zBZ)7jx2@O7H zdscRux4eBbSBp+HGQ{j|HWD zq}-(Y^%IWjC;p2GWEuG^EL15afn9e;)RfG=OUCDim@abi>3OJ=Qe(=KC-umXQ@>HH z#0?bjscK+4-ul_K&L`w_8Rz_SLBriSaXM5^ko+P!`Fz#cQdxN1xtL!nfHrDnE9mE1z1qol$XQr^sHh~t*Bwp3g`yS&&Y=DFs_e;x=C z|ItyfqIfr{5ho5WsUfS1yWP2LWm9Br-s z`etv&= z-d7&W0c|J3S+p@YN!GDHNXF)=#?7g16!P=eetdbf?|Hpi;^Vag-XCXAbgSYj*{@fE z4B~1+W^iVJ7B^2!jcKcK0~>*%SA)=k?o!}-wkjey{K0saK&;i1_Pn;fs*?;rotB@M zs-Do`v((x;uYI?j<5k<{zxEAfC11&se2M3&Q2RY;8{4;s;5;iHhi~q$3OpWydbLkp zMR5QfB;;G7_p3#fktnwbNY{Uk-7CCoR?=Acr=KMEf0rj}TCmb^Kht1YBsg|4RUX5GHX0mY+OVoLG$(&TI3-r8|q9|cugg7&-=Pspf_ zyeqi|RrYw)k z&m~K~Xe1!eqS6x~R&||x?#F(O2ndN0z>oRWgWfjz{QNWEk%8yn4@}jXwqUisq+w&n z-tWBUYb`OBvXuM?`y<+<>VlX9CIPGvQDISVYG-kU0AUIFC9?$UEs4ZMtlsd!c(KQv zhFr~!#X^l&u|nf%UZ1zIJ$$^SftY}xs6YD$sGU#u6M3J4n251Nh@-hicfQORyf$*=<5T2f{ItPjy-g zj09lXV#-LkrAMADI0p+(W7=c+5}kGxGjEZ|Z4v?H{LH^4yDa*CelBw}+v_h!``^de z0YDKP9ZdS|*(BHtfY*nN>T-Lgm6Gz)XXI%jFk0Jr^`d+?S zzw_dq#J|W*5>g}Z=oS55jecHn&vka2g-d<^an@FaUTbUX_oo9>+JSDquUCy%QnM#L z^_e;d1egHfLi?MsW=+p-U5@cZpYI?zDsV#kebfftX>3o$I^z_;SIorLN~8&v{~x51 z+Eo;2yj(+Fp<5$Baa|7li!|`>kfxUKe)jpilOt;1JDrv70@}UO>R`GKbsSk|6?nmJ z_fs(Dd=PnW1>rNmGHf|Ck!AyND<g?RxfhfhZ1JD~sYRz;(8~z-70u z(tIou*5}3Mf#TLLm+hm8U~GAbHZ~ezMEYK(0+8zOtJ;!7<;bAPCuAK-1cCH->nBAb zIVUT9@aqHE?F6c`Hnk%L@U0zAQ?+=u`SR*y0IiK=@%m`%`Kw0N3+r#X0!_h$k4``o zUZcfxubupI)kdQD^3v|tuit==+U~i{=ii<>l53Vsd;e$!CD$eRttwtSi{a(bj(GKZ z^Ss*oYV}@M`+izfa8?~;vEyia8HM6FT>a$zsblW@cC>3g&4_wzVfuEdB$MM&wUDo%A}93EGuSW*t))f7`RFTY-@aHY#0R%TK%9~`({v}F6Eu0R z57Dttm9*yzAe}5qK!o!(bEC;^9!LnxBS@?7Cxwt8rFAMpqQV{!nQNaRl*-+s*qfKe<0 znCHWw=%*TUa|W(i{&VbWDF+qudDaJ3g&mnhKme%OEE4VzOS4!7(Md}a1x4tJbDL>w zRWGVpDHTSN$VyRAvz_3aYMAf>tW!y`V1;cvbtVJcQDr29l8N*%&P8KeVH94>oHNd& zMl7g5KSZbd8&6789$q}}DBd&k(qXnR^*o{moFymt=sBLFM9jg{GCGm6bsXFBrYn|3 zdbV=uv&IF9grUcZt8)fx#!UE`Cu@S;w1t<&8q>*hv0vV+mgap`f^Ej4lOIu*6I~Xs zRy1kHPKa)V?zUbP5j;A1`|)V&>(@sr-tNaOL`um7h?=-gt1b}M>N@A1YMl#XGZtsL zY)L>GXa0Tf=zT8tHOq6F#cZveXpc}W$CK9QiLc5Hgzg2|H&42f*-Z)7qgVaBJ%Epg z;87Iy(UK`Ikd|DjZE(1krG}((yAx?a7b*!;o&RSgG+Kghl3~D89T3 z{`5;rR(+8!VX593OFvlAmRLASBSv^dop2rK#N_R+mcHR2V#!E6Fz}=j00iWP#x1vv z*{x0{$QwuPH^UZY<~h9baYh3AZdu3arK7aU1KW@ygY9u25txILHpCeek5#sw@XHC# zys6V0=IBsouyz1dEoWw9Vm#%Y*-D8cC-dc&Ko*~90uD&$Tkx@^5)B=`c4sy`)(^0E2H*pw}4sS-C@Vx@_eq!AifNe^E0GMqb2)vF_~KafhM3Js^(m8=X#;CQ zG$-bSR#J&=-JGl9qVt~CE6S01is;T4E4yx~kV^O+PF zpFc5y7?a|6dB?mNLsAAvyY-o9g}A|!6)7KWt)pc{QqM#<2@K3KhIF`1t&t4#w}=jOtM#BdXu`-6g#U`gR;>x}97n|2;td!>{FwBM%$1ASg-{hjla zUtZgD=e)Yo%mtK7aenx7lKMgdp2fk@PT59EgAl7W9F9Sm6qcx7+33fx8FK-51HNkQ@642-MNro5kE z?bWcCYACE?TLrs*tCD@zF6rMv&yQ0&04lhkIQlssrM;)B_BEM|^H5bfFS1@)*3w8| ziU$6&L^3>ozECnZF4p5>OOtg&evZVd6RKjPBx4zU-#>F+4ZJNPr~(|dt(VVJQM*zH zN_(xf5h;U}Za=|(81x*m?-liZ{Mc{zO8T~U#aO4>Uh3+5{l_80rX*KS2$B2q-bT}- zimU%M5yY1WJOSQEA<$pq+^v)#s(l<=AC}(nFCzBaTrg}wG!`xJ&N2d5M4+jz%AhIn zWW=OW1V6vE&;Qz=D@GJL`UN)Y5lV!Dh&LBItcLVyN_k2;W-+h~>%&_(iIC(vDp+$A&H!q;`Q&=f*B)di1hNEI8Vjv6 zh4Tq2p=d^-pUWal>QAh+vQhxmG}k6PjEHqH542JRNcn$td#(vEPQ`MIP8f4LvZ#u- zf(@O?atl$!u;xsU-MF5R8SH1Qa8~WnC6U3KRM*%;CI^Zxp6|Liafzxbo++AUM@3v` zhLj+Ywvh4`A`7-(C?rW9bxa%~1sEs&==A86)mY;)XHs-gI%j{r5k|IHK1^#B%K0fP z+%9YfMHhL|gkt+SCB{@pxmw=sUc$-qp)_}-JU-(v>=2vPuvHwuw@29H0X&YbIyY3@ z8}{+#rJd|gFYOD5+M}fGcCvP5ML5Ai*eDkytqN^!I3$5UNPwVHa?pzuBo&lMDuN)g zKvETcNMgQ<%!#V1F-d>b&a9?QXb~OkW)ulY7faUIri~wxr2t=E1mDhz$3s!ic5}1< zA6L5>wF3HR>}m60Y#S4=B-g2?K@+){7GKMjj{Un{oY8&0eR339Id&cr6AVyP&< zCYbcAHQ2_y*AWlYlG;?imfy;y}_y zD{(bhu4ZCoV5-*1B9(a|YAY>KB7P9?Ir?b^@ktk8$pvYO$s>6w z!keJCM_c39PAYqOG%}=eMQd07`gkgS`65AD{!!Md=9yo%5(=rDqfK&J75567W;bx3 zu3lBn&g;87x#bnnI!G}iO7UBJ82E2hu?FfJ*l%E&kq;Z-?@9rewsAew!>T8?586PZ z&T3|Z-EQ*a)xp0omPodn$1q#K6#_OhjywHJ^8cZ&l!y$ef@SP^5?-N{(5mq3u=Wcw zg&p{3(vy)TE_G>id&~1O`#NoE7cx|z*8l(@07*naR06!8{(LsM^V+5UhjLuMFSfR- z23n_T$~^I>ox78!7i*-?p7U7D(Q87RhPBx|cOj7PJRi!>0g}7aMrix?>^4kO-?U0gutI+`9W~1zt?GtX0iFzbRfG{g|B~e-PL+Y{t4hfc8R@+ASwX z6;RJVoP7*hLB^L?88(!UBG8@)tY<%G5xk!cY!qn<1*Hg%PUI;K}U3$qKz#U3(au=pLkG_T^-C}FA!oV4iC zJ{R)#!T+pOy~%ShuQy_~vaZ%Rw{~jyyb38(EywykR=5t(DkVz8K4mIO&xi^ZKs@KB z!V0og`_p2xB;{T`-?dU}&Oo?CH5ir2uW}Ib)yWZ7 zoR*bYr@NtU?;2#&5%f z+H%dr$kTiAm{Jln+c{@B{-rwoqPQXE0}?Ai7T2k({+5V#Y17YC3|EGUc&04W2~_!X zIKR6<<`+s9>CQ*80rlrWq*A3~nyhcH(-=}FccfL67tFPJQex%i!U81aP6B>H`#H+n z&x*2sjK$J!PM|9j__Af)Oe5sN)6Da*dp4~Z7vw$r_Dgjrw2J^Q-Ny0lrC}bXat?8; zG0SV*6&kL%KA=2D$dN7nHmLz%ZND+Lk0Cdd3f#tb)4VKRByX6eYAnPE2`vR4{*3Re z=A8UaOoj?40a)^+(y7avc;c)uPkQ6W$~(LMH3(zOCO)Me9J+q8{b^Vn{0eC=Lx zF##jX{l(a%*9d%;z5u9wb6n6W0E*1EJ2sNM&E$?qJ=l0J2k`To;6MHe_&@(#QKaCk zE_+u?yZ;X<5Yd)^Jfxiuq7Uv_u5va!*s?COriD5Y4is@? z806`4C74Z4E59d+Qi`8fjIrF6Ogey^Oq&?YHfCieHz@myjSN9z6Ar23q|TNKf-?Cw zRR1fY%+pNm!m@5o?%^q5cI(kk*4r9Oj;BOCw_VLFb$_14~gnqIN6eF-w$2vUo#))2it*#T^--XWHQ1dr*S2-YkEO3(g4xYX&~ zq9-g>BPDtJ(UX!iwoF^7mEypHn-na2xB`ge6OG6h)@&N8Ah2S<$6K(5kUx74rV5jM zYghZ!u;E=W7G<^0fX)eUXe1@96eBS!uH>!b;{aY>8wm6E(*5Ua1Fs+5kL}xg0|KkY zDwjLy{0!#jW*s&_Xzo`kdh>#=#^hbazeXa!^VC6}=KV<3CgWd( zl*lN_^E}(X?;TjZdSzfry?i4^u-wjV4_LS6dxw|-|8*7a}+?6{p`z{}_8L5!*MTK(f}HDTGBdUFpy3(ZGNK7&mQlwWp46%@_5t^STP!AjDtq(LJ zfVO!Ov+rHi)^E-WgM9UJI1t|~0ooi~6{uHxzP-M5iT}|zT25%p@qPY&bmPrIf}{Oi zy&BoT?n_w`a_2cL6t8^8A!LkO)v)IbTLV%8xQx_LyDw@_0-H)j041mpB7^!N->|qK z`2-qV$`emY;8fKftdscs5)l%dSY81jDVLx~WQG~-5R&!|xv*vB1Cq=%uf=YZwkTn# z0hiH5E@?#>;5`Yi?{ev^Cg3mf#z*BJD`VwK@szO8)$=8(--&#lJGf2G%S`N+JGQh$ zQUK4ZTqz&zZ`R1$YG>1iSeVtF{ zLJC!uZKo=G+o$TR`i4OM)3raE=)G^6_{h0cy!xzbFG@eM6`LE%TQ&2n03d8lAWjwu z=8-}c%b~3#6$xm<3}l`24Z`_I`L0#cUPhh;K~FM5p8}1-6p2w0GVL-W9x}17buy=z z_)i+=sW^o=^*~epnZeqrd&nnq%PNPebBVg9y+nAl$b>V;-2NcRU9`KiY0?P$~WK0Ug^qZLUWr4@dRtcI=>rW5&^NZDAB2g+jHXXV$G z{UjH(s!EzSqg~Xo|dUE7HK#=C)@5M3|0@M+T|yiv90}TDyU<1U|33L z+ZPA2P1^4D(UVt~;O#~5+lS)I1Ne5*IJlae{_|`b{!80N(pg#(WL$G)p^iz9q$Gl@ zv5txq#(-M&OdoWe#SQhu-0|o{2x3d0)JC>hDuO1}Ce~*Do^nIJ9a5mS8Ps-zr6+j! z@ny-jVHdn)L&%zeHuh`+=_|dT-vobn3jU%%sm&hX`qGoPT3Tl+Eur;1TO0Z2GWwY* z=^IN*Ud0vvLJ}uc_GaN}&rOGH81)5RY(r;;lmtd1Zyfc;_l<}Hx>zvK!%H(LAXznx zCGuti#l0sI87-bN%O5rfEI*{>^OCoaFis|!&2Sx+2GX+ z!kt((Tc!KP3q+_o(%9`RoeNh8kq-VBo)_8E#Rp01cbz3Yn0AzKOk@?V zP!HfNT7t9`!ONp7032;`e{>?iQOtu<5DCs2JZYE^#)(aPe;u2M%;Jm-{s}C_3|MAn z+^19-O-YEwTqn%(oyNI@g{?E*o#bOxYf(a;d?`o5Lql~KZ-_*aGC-23*HjWd6hsmM z%B36A94K-_JzUA_P1&kQoLR8XRpLT%v^iD6g=eiMQa~b1xR0a6=d~`D%GpD7sTh;0 z(=;Y*?!4_Js?GcT4vWgTCH3B)z#qO8Jc?OXIoY5TuZYgc;^Es4uL^Rqa_r(v!mC3~MSR1IS)n6WxSO{z zZma?XpIZmqDSNNTIaw-P4eW&bPBXxLRp9+p_o5#}Y{9ek^*5vws5`(`T}fc52S{AI z>CA~*>_sHB*LkJu)mUwx<<9Lst!&V&vdpe&HD~ho)v?EEO#h%5kVpa{ZA#~{n6DFpo+8VsMfX|$MaGg{i0tE!AG}R5c5{=U-WTe9RK|UUJp73$^M(?d_`0J z3f1{*dswfc#{4K!jid@w0T|=5!*B1#z3eQtVpVr!BIZH1#C<tGqv}v@zEk?W~skYHNo<)RTs?vK{$T`()<=I;;Fm9CUr_~r{#u)@hXQY% zjoFmg{0S(<><-*k((DheuEK)ao`;V^#ySXU%K8Dt@4A6VN*ruj6( zml~eCUD=`b`=$;U`ZJ&rNj|TDCHd|IrfM|j4C|0-Yfi-qxF-jG3XCQIKdi4;nAxy+(5O@q?u&$ijg==lNP<~O z@y-`I4rI>cjcl8f6Z)LHPBv*eXEAgoIY+<%x2NTN*p}qWOM4EM?kRg-GNgsyUIgDh z+Sq?|V%%|HsOVgkY6?2>JIeAKrq{@$kE0Ryt{P#oqbsb4D1Lcut@3^`sOi=MOemSw zG8wfU3Ta9?WF=9CsFtcX`z{IX$?A-HhXXDPm6)Uz!B<)A4;C`n$%>YVpWekJ6?86arm>%&QgnI%$e!VL;fB$pWO;o5BHJ&V`}Oc~3+# z-R-V-t?r?BiT+e9GC7l_0zge<1XZ1EZ^AM_l2Y1&IEEzwk@Ji$2_m%blr(26GTtFU z@^V^7NKEz(#WW(KsjjSu78LsQT|O@;6%t7-VAhGAIg`yWV<)p+0I6h)tTR(&OO8Y` zmR0I_r4}I(M=A_;S3i%I{^)jay@2uPxJc>5=)%R2lRu0ub3By_vSp>@eS_hy@=f{c zndq%Z^IMpCGsR@KNF4=PybGuM22nihGX>Faz&7SAWw0UyuHayZ@%IzqE*F*7-|E}OXYnKiM{^1WzrQxb=^Y>82qZIrrN#7lTMByNh zj)hqEnTkqR%(Bz!E1xLiCX=_ju^-v%Oj$Y_nRN}!qCJU4J>+*~W{74vE%J;Xz@jY_ zReVs(d|ZC)$n=}u1LmKA2={c;d6Su!DFFE8&7=mI#;Qz8Nj+$=n6=Mw3+6Hq<>TpD zY+#7ZjgLd|a%6f~CrQPz0eoFO zG;ig1BH?W!0xYNo6Uk>RxfyKaHFYA|2v+^cAF^pJl@?8zs)9%&pscy175D65B?~5} z&IkOf& zpD8=w@{F!Fqqov*3!`pHYpf(KJqZxVCsKcD6Ddh`63P}Fajg}sJ{SzvNVqcFnX&rO zJiltBy-@`WxRM|deU|J4PSmO-=Dmh0Q`O96rR0DxWOO5yMvEL_asVX~{1L&7-o;aQ zDkaO$#Hjou%lQE0^NHx$ma{*Zah^7+lgQ*^-7!D+b^Sya{hUmYKecdcP+=0H-WIw{ z`BAbbxO(Fi(eA;m!;kwN;~@EcC1;pm)2MypC(%>8uk(gDO`q4Q0xz_Q zHZtw1TJk}%aq=0HeX*S4>US)F{#@mc!~k#BVZI-*>VJFdRTbyetNsb#lL3bHD%ZZ| zD8;XJvb4;erAGEkYp~3Ztb>8%E1zof>xx%PUsw`Rz^;+yXY(9bH44PkWci}xS*g_% zkW1cMZ>x*QI%apIAqk>mqtA0)?f+g?$A0wV*)+cV|;^fh|vl|5ItQ#yLJ+0SplZyy@Ln+jYa zEw5xGDgplcuMIG3b8&4}2z?HE2Ov-2moM$SA4eP~HqIDOf1a(4-X1Ln^`#e*jG_;X z_I8ps>)C=ANqJ0Z!!*E?pfVHpd3Nlot$?ShlbfDr`}xbO;^)_P(DUl#jZfAEZU;rm zb|W$AHcpz!;8U%FMxS7|oK;XRh^SM`Lb&W3K0`cQ-R}UM&X@-msN{1OUjHRoZlv53 zmoI9vL(BUt?x-RYO;?F5p$rnIicweW(ZxPIdYKIG=LBrZ$_e1cfLPfkF5eBAQ!ycP zCEUh3s~ZO_MB^!?O}uZvX%`j9{`wsmYOa<>lyIUVfR*U+v|j@gn~`+jvOKv?BKNDk zYxuSj^I(s|$GD(b(!M=_pWc9f{;A;q`mN`53-I+F`02Hs!_Tkn8T$3v0Qx_FZD0D^ zM^m%aK3|{e#RO*Yq}tvi0(?0HdMJMTaPo<*!43fLPr>U?w$8$=*G-=3(iiBajyUDY zCMou~TN;Ve{6dw92l+~&A0P!@#FF(a;VO$W zB4Eh!^+AC$$dSrzoTXC*3aYc2+j;Ju_xiUz`-=U#Snz&t^1WlG#Xzk;bRma> zg*S$h38gL*S3;ZF0GQQwUKK!nwnb7URRCjo3t9!k`xAJ5D1Lhv{QTCEp^xH;f#GEb zOkQM4ewCI0Eh3YzcqD+uuVA~>&>kofY_k_?vA{r1r| zhQGcyW@qVyh~O{U?^Q7g-JXS={q0?5d?X}C(m|4(Z%WK-0;@Gn`nmwp^+p=#RzgU! zf69Uzm4O|2g3rCq3782s0T>Hj2A02@bWf`V$(}UK7AN9GT5c>@tNO`Ch!*1+`%2CU zcidK8txI^4mpf}bjcZX-_K2JRStuxYI*TqAoeBIO9&j4`X_(n={~m=a6)gGd3stQq zx$ommyHsf){}pCcr9Yn#fJsA|V* zz=RBWA5KzXQt+4s>#}F5=uNKrjuIjZDeZ-))kN}0W!3{AR1iZyCPw0RJTg&PT3Uj) zU`!kYFK@x_@4S7ReH*M+3x;wEC2 zw2T=$mbp@@vW^w-zIljb5C)gyqg`_)PuO^3xhY`((78HWCXz*{JZ5lSKgU@`?s)~# zZXn568rYo@^D|E48+M!H)eT9PNr}Kf7}WtXW&1SsTh%0mx-^953I(d5AVQx8X~DUY zX_c%9);6R%07~qD5~#MBi&Y~`G?l53%#3lw42&!?m@2`i5Q($vYDn=Jl{Xuc-sSHk z&IM|rP(ny_vO3jZI)NL>$(Wb`=4zP?D3(sHZL-da^K9>aUS5Iv`eFbU{?0);3?VXftO}KhY$6kW$+2B>KYb4fxuDun`vyle?;NxoVe}9_S zJcgusr5%k)`Wv}ktFQId+N>-R0PxC|0Wt{_on#@FoqQTYNe>YLQm5Cntaakln*1n& zKv0gTBki(2CBnJHd+7^(MUzvP(%P5T=>qA}{MxJho66pGHFdh$t3AGc)sf)2x+;cM zU0+qkcK_|sKCeW6Ii%$mjsm=E^NW0ev?}nb-Daen^UI^P>rq<2d=vvcbb7uB6nZ(3 zH`hG9!a@H-qj2Zh8)2j4F|m$c!YNPIEH=N3Vmp zW)ldp6aJ59NsdS-UD^*&fG$=H>c^4o?S>&}vN4NO^ZI)_Ce3pB^T)%SxVx>5XNLWF z&|dF_Xlup~ebidY&6x+ep6k7{OU*;CY*Fs%O4AR&ABS+c{)IUV_p80?WJ$=#wL0N> z(Ej`!0J z{_Bry&lC2#7wowGo_~Dgey_B;U#(l5^v#vH-Re63axWr=^BkrXPlD0KM}wm_35KP~ z?m88~Cqg#-qMwhZ)CQZ(x@vs0kZd`nwQ@11iK~XejoL(*9tvWNYMQR8$WDU^4I-p% z_#_sC)FPQt1yJJ9?O5x7Sg1)5b4b7=#&WIu zlFgO41BhCsx632VDG6e>``AURCFblN+5+Q=CLK<7cLRo8+^iuHf#%mgUk4G=FgftJ z36`9`(7It$g@H!F|0He$a*Z(wbXGvd5QT6x^~Tgs74X0`uh+K6Ps5Uf%FNorGfX z0(?p`ASvnYY-En}N@ylXjA}wxUCm{%wx$p2BbFB8#k7D~xxhiLu&92fh)B07*naREX5u277eibl&hmS=&c1!a6s4&T7i``CgGEmhy}&B$ z?+Vh5#V(7h*Q5ie-OO+I0?3?a=_CBpm#Ug)K^?XPd%c;xKXVsusNg_v_vUIuf^%rK z4VPUxS8rP9{`37oRK-p|1P#DTyF8%)JUIj9^g{>Z)mGQFd6yD`42Yr4dAuKU5ykAv zv7iJDc2IQ?`-9U^!ZCuBYpG4iyQUS$V)FZDv#(SEJS;%2Y~E4fMx|D z(;(WC!7|K}IMDa{^IMnlZ7bJtllRvgL}s*;7!Jthl45xu&l(GQWUGH)-+zm2&aF2x z%$iuVujx?1#b9%}_tOzTD-jwZ`D!t)-v)>gVlk;vV>A~DrTyarL!eWeiVkwA!c>6U zM~Bttd<7!dBHo|2+;|BO0I%hfn26yRH8{sDVxAA%YDk1R&-a-?#5g8HHHqbcFsh}T zPO-ZPC3BcuBA_ZFOJ>HTWzQjTA*l7orPD!@VeOoIE~9hyGP&w14K02X!+;21p$dru zZV8h!wjd$_qh}I2ad81|EmXG*v6$+z3f}&yDqvzxwG)=1pEbnoak?AU(bi6Y2L`Xv z+Og`)s*C!ao*2aSV6nC!AeULzD-p!xckHFA3c2cfDxYbH+9 zz9u&psW}IIuEf`fKb_~76v%OY9;C9|q*vrWqYyv|>rmy=$RJk}Bz^X!JATA2HzF?y zP?;H?Av7|{dPF%)O<|l83APljulZ#+S0J~&ej^uYvxtq09Y-(Qkw+)CI{Te2D z8mXTd;zLap{Cd8HJ9m&5z{|p+5I=`&W7#+x(ddA%SsEmtwgTEQW$40C*TJ=RR;&FG z#erQD7HUs>Uqj9k+nCj%Td;wTqBbk4zZ#AS@)t$w_e7zA3>00b$!@UIftc-ZK%0e zavpU6q~D%;GNatDx83acF=|JSnsCw9(3e~Jh7nosgrIMg&`P-xTsX~QhiPpXJQxW=~f8hTU!tEi+NPjrEtM(tiFl#=iE;E;R-;|v$1q@ zhia|sF6ux&sNhb|2vfIoun(;g{pe|y+0!3m4#l0hs2EkDy-zPtT(Ml|*IP}?srTxR zl4kPnzb1Rx&3=6wiIBJ5>@PcN0)W}S{nApV%%NeIe^K!+cL4olp81+}-19VZxjm9TVM_C`;(IaC5Pm z7GiR0$5t?6=i$x5la~g;)j#n8K{^=Bf9t(6YR`r+G4dpnaWm9tbfJcb^X3Z|S$0mz zlWy<9s7uuv;FlJ7(jrbfcH*f1nJxb8Wx*4pnvC#Y+n!vsA59_Tv zRzQHhq8e5b<5y^55)6N^!$2PW!)Gp^O8fdmv#0rPuB2#^CL;As-T$?EauQoc(+r5d4OxK{wvyjx)Ne3abB${j7?^tZ~VGs+$ zB^E0F^*NbBWWWuTxUyV|_=5WRE<_1PV^iqQk|bXgC!cg;L(%KeJ*sY9cc7~W#geGf zL{#j~5Tru#r&Jt5W-a1oyceMTSwZr8=s4RNb(ZV!td6z@>YK##(n^eIQ@=K10=5{G zwCY77oN+;T+9IK4NyIEVA-#t9;wS;Hq@*bQEP_Wq9>Q12Xw}3g$O9%1b0Dj`QhTw2 zsbbo7Nn#9?z+%C($tAH8!{YO1MK21_7;j!BkIc`m>m6!q-4qXU@uQp2M&ez2Z+sur zv_ow?hl68=<)nb(oOCfw+u{W2Bx(dT-MtYlAzb{7S=D~&B)9;@GDnS1?696&AI1>k z;t->LDv-Hc(m;@V1wm+oFj#WYb}Pq|reRE&)fA2b_Q-xZ^d6 zdO4)7t6MB2hH$b11h*4xlJO(PkH)RYv@XH#SCb%$Lrun1Emp`RofocZ0BDzyOiIL1YIQKl|lafGINpZBQw3Vtod$$h+^iMKqw4afKfyE-wZ9Sl^I)X8!)18_` z(ww__JnK#v(B?#O54C+IVF2^x9;{++mI(4})$w127;T1aF4%-2%FWpeuyUP&7*Ii0 zbw1VE!8KIF;Pm-i_vgE1qk-;T?)>S}S9ueg_LDiK~zjODGM7 zTsniZ!H##@+fD9q4u}7d%iQv;u0g0nLle{pH6Bk zK$hm$)wT5FSumFOC++QC*6iD6_Fvy=zkWgOjD{1vKaQ62I2`|tz}`};av0BHuJwtm zWOr`Pl!V?R-6{!EeLl`3_jQa}k^k!R+-BWv3b1rigvls9^&+RQsmanjzOR+4)tm|tBUj&opd&qHE!7u#bT+*Y#} zEsFkap2??fK(70bFBdzT-GcP)K3kAth*7)2n(J!Mg7nP`R)zEx;}K%bhS?-UYhnoh zlYN5cNKrG37JI;x({a^cywpwz3g^tks%JR53st~|Ir-;P?jf9^ypf-4ss~*5TKfbm zbwqMy4_gqkK3Yy=r`yVkE1|LoIhuez3V9~-UxqZ8ChC}Xy=vmwbg!5bKi?Ai+T6|z zTNQo%fB#pqzkGqc-OJnk^$j(i-|SDXMF8-px3WIH-b#w?KaKYFwY=ubZnkZ(fB&_J zn)a>KyO@ zK>K*s6tOB2YX-V6ce8IVsOvH84=5gq;2kv)ki&gegHX3#58=~wxxiB7X=jLuH{Ws1 zD0+!&HoQYtZ>88oK#L|TpTsl;KTERHa5eiu(uZtF-#G$tA1XQ88)snnJmlk@js3h1 z1kRhmjHi`^voIgFaC8Gsq=g{NaH(V*TPasT!O#%+l>qY2 zo5AYQS=H_ZLuyta>8PEo}FczAyT~7~ku6G8KY@$wpR$jQpn>L~> z$NHkvjI|f8^cKR-vmBDnR-1rOL%tXcRvb)>zAy{#Q7iL84@6&l5zK5DYLjiF-Dx#G zyntid4fcMNZ@-3`m8Q*( zJ$LrN+KnQ$5#iOxvg)Fo)d|hd^k*LMhZhOxp?(Z99BMu}M8I|QQ2MWxF!aBt>mf2* zREdnkLp=OYT*&TzkC(T;hVp@~GZ}suhiR<0g#nJ!78HpdfAm^Jn&h|+B@pVPfos&qGr z01wSA+0r)hSwOPpKxqz}EW(@PZ0kIiZa~o|g-`~#gZ9e(H>v*u_+TrgXncW?FBJQ} z`!giNM688~H?ltabHzC?*5S3{YIOejK}S2;R|<#j_Es?j7QoAe#bQcfuxv zICA?C=hg$pX9Ji89cHewz>hLswd@r74*ptn+|?hlHHN813TLp24LLg|Ci$fYVdgGm zgi4ONf8CMI-cK-9LAX1h9%ysB1#%$1f+0OsC44r2IDo6QkYl8(&c&rfVY(**+-5bi zt04#g+f+^F^J${7$e*>~_dy>&i1-e?3=m2j!AFnACjj$)7j7Zf0%_uGVAxSRFa%Az zFsCkGWf!>ptXn-f(tuQ5Er27zDUT9U`6FjcHgxB?)Dnsd57Gt8MV*h0ukX$U`e(~^ zs0uls0Q*sU(qHeew;SxXqk|y#9i13X67zmG_dez@k36bdE9vATZ_iv_C#R7thEZ zmbl>!wN|hSWdK+{su>`2+^=Vu#f`8ZnfAl7z3e01uRLF6{?4Sm80?=%O{RM{`}MUD zy6vFsgoR-3K`v_leXHgJjD(AqTNO4nG5@8+Q>d4?-jAtI;cQUh_ zBr(B?nE8a+*5-`*S*C1u)adF{y3w<^Dp_kta$PG;>dV?ppX)P>RQA$lY#?dRCk@+3 z9z5DbOzr*}WQ9iGnvmkoU1w&0e3XR8x4YS`uI(Ssa$TQi{hs>NcJhB8NecT`#3?z` z4ufqd7idqO<7w$BIV9UCj%Ev>TtzBfNYkF-T20XE-%bwER|B+DtFAM45tL8jGGC_& zZ?FL7`3jYh2R`m;`;3hKRqN%(seBsRiRhE5_XlPa2X<-Npo>!v{lK40 z+Yl#eOvoDK)!KXQlMm>fni7%h$rle`I3m^6lfunjBcYT*da>?crv(>gP(`|0QpS49 zdhR0Ze)BKA!R*%>_y6q`_T^sIoU@*Njj+c{as9_@{(3JJ0cXRn>WBTzMHu!`#bdX< zIr|F{!&JWZdD1>kvzN{6%RSlG7udehzP*-pW#7!cf6%_Yl!V`Z{3x&S{>Zj%1^55u zE!ltkGut1Jl1%gdD0}QLuV!yAuz!5dwkNZPnQa?ot;3=lc~qoQ7HgF)8g=vLjfr3bAH*W?fcOy{1;CXFGoJh(4Ax=Y5)>|TG_d^7v=X7f|J=ejz#>ux1@v0QG>Kus!1wudb6!(MC=~xDLx0tEz3A zJZzkMU?7{UFL?|3Ft{RyR)Pw~V`nFS{P5$qA4+~4rH5LFdq(hLI#sQspg=FFYCo^_ znw}gTHGaKYITxgBy$M|E;;^Uc>JLg}pge0SVE{n2clpE+P2~zIo)tvT20PDk@NN;R z<^5Kr8&O> zRq4>YAkcc1h!6?p;w<&rg>_BOC}Hhss?{bW?D1U;5s7a786dOY4{SuKR}lcGIJx!7 z&w+dDLXt`&0(MIU>@^n0qk|eHnyDYq+wYL4CrLWjLf)nXuR20q(6&zWxWhiez=pMm zC&mo8uCO`1VY+9WNDf|zLf>&a-n-UvsEC0x`KGXe+|ZQBepT5w@eaj#)9YhAd=!3m z=og(@W-(1oF8(h<8<=rJA~-c%9g@3cB5#o>;q=}Mf{XE7zS zTkRd)>b<;g=v4q+U5!HAZ$u}PR1lMt#O64Qwl6z{6;~#`)9>8T&wMj=PRgxWdVA&) zgPpAqqa+9MU)5UKSe?LSD9c8zt?WI8ZrBUiGMeV*dnf5ghHEv-s>d{ZrWaV7T~yS- zRltOwwy^#z6aL{&0fuQk#M1e&cI8xpzn)>AM*;ZvWc{-?R%d-ipRvY&f{5WN5eu`8 zH0I(Qe4Znju02y{Hv0$7e*d8T=}TFUZkyS8)JlSciNx!!{~DA3`#bHH%GcZyEbaCB zW_7x-KL>69->eCLhB&1?Kj&d~+sgW|CrAyWj|V@_LC80tKGO@FQZn0EfwH|2*w2&p z@hJE8ACEG}e}6ao@-nul1lXUywe^hE03f0*wD&Va-^rRVN!Ea*;+r~sRuNcA6eo~5 zXIf&Z3t%2+`_l%9z1a{9JWtqdSAsH^bV7rj56V6>IyJM9{7qQOTE)x_y{q`I|g*9Ov z&go{+Y_;SiMcgU^F{4XEUC-TN_6|m!*tRts-7)nqI*Q@2;4!99$T5lIcR7MSp>CS@ zobYx|2UWpIKQja@Zl0DCoFi;X^ zikRT-p#6`(!2bR_?YH-2ueTyh`?qh&ZdE1s`@7lepGvyQ*VklU?y&bqviqLx<4M~# zv*TzL4IIK*1gSUIk3J>IELQaDd2X2m?l5kDu8P(N!+bvV#Gn^u10pQC&>wN(`1Q+z z_IcsuA^49 z#0t!Qy(*5Bwt_P?@;@b(Dzao%$nDiCKoqXbq6iB?3ZGWc$p7`IW26DB>zzR%=M-kf!5aUJR1@wBD6W&vzhHEWPA*7ZJ-fZ2C}V2 zS2sm->GCTB*jWVwZ+EkFm_3gIHnodT`ZVh>iQyvIDrjSdk|3aciYt;SD&ABfCK2E; z%BIY*nJA22yO7QnEvensRfWCPJU1QS&OBU9R|gfn;0+*KrBo=ql*0O#rWjNS)Maxs zuyzra!FJz@Qy5kNfD%1n_WZ5(iUVDsAKfQamjw}H(cv0ePo(gX z+r|M`Xry86gNt1><_=_KZA=vq+l0t(?qC@Dy0dR1QAHzP*n4$pOk>@$>MSX7k1&lw zQ*wbFR`RI*gvmyrpc%QnX%#;6|UT5VzqYxZHWeQIyN72EwmQn$tM&iO& znrdJw5;yJW@MQgxZj1g&2c1A<1&j`i*tG_yzJyk~#6$uWHMzq(0ueIa*BFlJOdp)GD)l2{-LJdd%3NIm_z)f~A(C3K4h7-os z-f)Hej&m4QWv=xAkr<*m$2`sE_@s#e<{U+~!q>v^Hl;hr??}=`Dh`)Obl@){3nyXu z3e*kzlr2Pcleae9B=E@-F2ZfqofP7r;6w_zVATbhZF^Qdt2e^GRn<%!0Xo-WOLIyk zd0JGl&bmp+Z3;M*YZ5?;wZLJ?Uq$QMXCkV_AecLm??oJX-%vyfkl&@vN#uxqemt8n zZ;+WMuir!Fl`CfaK0N(LRs>RIzuS|})I~f^8}ZKU#y0kWkwJv3w^0&ZrivcUJVcD` zHFJ$0$W(Rv0FIdFlV*$Fr;3QT^VzHGvc{ zQ>&F+G(Z3VAOJ~3K~$~ji%KK%ie#F>l(UNbpX78Vq3i8lK(kHAk;*kZX_ijZs;v@z z-iT6E@dvDsBzr3H$E@ij&u2Y<=i>g~>wS@HnntESE5giYAzmN=)jt6OyE zV}e%w?4_x+!NB$}aHGAwH{uW8cn@1koufcX*?V7uzzfpQVv4Y0GVtyjUAwJ6`+|bQ zKe7EfDR!dg%{FHvn7;z1%b2=|t2uQs&xVRa#puR*-e&%Gwp(;GOhB9pX1VyAfAO#` z3oljzr-0l0^^*(nn7K|y6)yo?0D%^S0$eO_K@oD9reiZM!&of~XIt^r3jr&kEigkk zQOTN)4VDcAi5V6Vb@LQC)ndZEN4uy~o<(&GCMU0AnCqY?j1O{W5sQz+pQ)}iepA0s zLi$VbUYDX^U1~ojjCyDgeeN+g`8RL^9H!9K&QHP zQX2OldR0n&4xyU^yCdP~l_F&mD}A8Vy=+#=e@}N(z*P$2Fg8RhUxmlSan zzfX~UlaPc?s6pDK24$4%UAapxIwNQC!1(-=*(5~hX&dTNp+tCti)VHm*vXLQpw$>| zCM5s-nAAhjWz}Mg!d62ze=>L2obCqbL>dpf`b_!=d5y$_l2p@rr{uIGxJYNK zURxF9_?^exKHg%IrvrMBpnCT^9l6*68#jDJ><~WM7(sBKilc&Nb^>I&k;T99H zp!lSodHey@MY(m%fkJ3u-6OgJ7U@|{inU|VB9cZlDbgXSE?lbI)}kCPdI({w&};`C z;Aeff4BnH49bTThX(h$1%EzMfR^|?inN!fb;A&g3;i}B)(yu~hjp-#vjDI8FGYg1HE96_d zrbp|i&O$VV$_gh~P?>?$H)ZF_@ii>*LF~e#?1#}-51>SRA1bB72hw9I_1NWHk(+>F z#QdF&XtZz>7<<%oSDABEp2hTyvD}1YmerzQ&RE3GM~(e&m2};i zq(=@cpdhRps+YGRJb1H`^sE4x)$7bo{WY8zPwhVy3g~-*7nL}7)W7lr5h6+T46vwZ zLzvxiW=|fZt7(E0hjs7^KFN(mjc-SDiMRBJT+i@nBnTXpXn%gs_VsmO1aJ2;kfqVTkc3d+CTcV7>{N*M2H2>oM+qrl8s5q}`zr z_!NaIL-N<$0{SyOT@*F{q=^(>pILaSOSk^TBo&Te!)q{U@a zX0}|D)SBR_7+BB+BW(9N$Fr1k*|Qq%()Ko1aYw4A7~SSe9fXRAF=|p;RCgM)N?XS? zE#k<%zvcad6F%%D!VU+S6O5u#doHW%SJ>`et|T#49ZUX>Zc zRkWH7F$&Eo5CrlVw=U|$;oGhUcDc)`-G!~r%}9ylS&JmL2ww3R_2 zyw9mZz@2bu%h>eG@mVll3cCWI(21q*Anc!F-gE{#x0YY+Q}LgNp{pk-KKA-MU{76uCf54r zhdvN?s!3pI__lC<>@I)$Cro*1eo<;KisxhYGuCTq0dKo7DN z!$Q06Ee5rH7O4*UTm9NC9GJ0);?k}@Ro|G|+;0JYfIZGaRIq}UTXjTyc_}yLU%t`) z{(DuKpZeKque3&Rj(D@aqym=u!Lt!vklqeY{z1t6u3&T$ZB=sN8p(~BDxnr&x;o44d^h!mR@01^lgx4rW3Dp8|DoQ(5dvc8+qJ6^gt%9=3>K@Pa~(kvaIk1iq~OU<^6S)7E$uw^ovUF#h%tzS!#@&!{dI}Thl+*EE6T&POK zVov2yXW&(fIsr#U4&j?uQO>^$W&yZ#xjC|axd8g`_sJ|Bx#Q+`k1=89fsZ0~9912t z@ja{#jTZm9Z&f51&tMi~GkrA+7ozkC13D1aLfjSRLBseNIb^P~M>_?3q&~behV-gs z?UzUN&||FFlfs)i_=Lg5LRCW;Wuxb#cYDSmmzZ)6dvq7*Y7b`P4*DK5bSEP@!HLWQ z@Eq$h2u$cKpz2{;?V#eQo5wubT!0C)g(PtdNnVJkqNov}`aI44{u?bb+n>L{etApw zcBkDd(Xut6TX=4Bj$)%qkV}0}cf1OCn=^xR%6F=I0q<})DyX?{_WA$l#OJq+8JyWY9F#i)O2(_5*(Y@Xr z&&OG=-*F5<#>r8~P~La!B=vH=S$Mh-(8RO*k}u<^OIzeFf-4chEOW+EjJMcX;lY_t z^pdXLCmLuXcs;+w%o-Ii`Sbn7iyR=ygBXGUmlQQz+a6ECq8FVariDFo!7g0aYZWm4 zcoeeXtAYah=s^S4={k^axKki0)0;{F!WHj5LLnzdd3?(e@>QB$UUdxL%d zC_n4Rqmkc5#MDd(U7$$}f=OqqdX6gw4iN`t7*nl-s0(iwC|Cd)VZE!mn;XLYm+9$^ zf>kupc6HCEvA!M0z`PonNY<(}7Tl)IY(Hvs%j>OxkdNnZI~{cf`>*fizWwVj?1m85 zREbnSpT|kN?-ggOj{KCy*(0^{L1q_kkNbpSml$a?Dh@rX0IhvSO+?Y|KNYgH&$3hy zX#cr);jhq!NnB|Qjek#up>)!6Hdi<@+9z)LsC7EhBZ7Sl`vobWtAOakanb!)%`08O#qp}`WYv&(o4eS_5KyVC|Y{(qP zaIKtUBjC&kM3c@F(Ohp=0T?#V?2C|GpHR-LDEGMurIYGZ^AjxkudV=VL<3jHBkFbU zE@XB7Vm4zrqLY%!B6E)`qaQ+Nv-N9oRYwIZ@Zq%@!=)(-{wrDmU!^AwjhB;v$Ln;1{;&OpKMm%ts&ERneMl%DP7{{3=!BAtv zux^^~*8|)c$e%}o@r16JdSF7T;{ZIT(bwcDI^C5 z2{U#NGuxL_I%Y8z7xsnrk6pp;oB(A=*8@aC*^FB^kyQo8O#S$>;6kDm1^B)-01aJr z&SduG4*Pm9L+9(A_S<^{($xWS|+ zuyhR8n?9$~-)0?2ZHGftaAGY1mjtZt{%N~DA9Drb^2Hm(SezztX*W@ke$*P>@#R72lo)Z+AuguwLJ71i;($~St=m>Q*i$_epK<`o z7Hf3`bf47AGs!w)hsTHB-AaJ~hiN3U|2kFVdEX!gX<_CFE;E0K;ewEGWDvAlUZSGn zrpB-(;gWhXU!f3*qPVWmR^jdp?6s>NXuVIu_z^5!!&S7@J}kg@J5geh+e4jWE{2M6 zL_}a!WT4J^*ZERGrC=?W?wAo9)Z9VcsYi4m{x~a0pSAD0#0GO!+qEnq;-oUuJ%phz zZ-$lWH{XyT>3K1@J}|_CS7_&%&Sw2g35k;Ths8o>_`@CHgS=(}e&Nt-0vmdANDo-^ z0d}Fq#ZoHquhnaD9`H0+gI5V@DpUxe8>>Optuo>)Uq{r;`o>7IYb27!_9Yn%yXn8W z``8j!a!fRdf}nszVx%-ol`NbON)3?FLpz;X-j+YR5o%48vn3RO`&n_vz$h* zxe6^^MaWuMqaJrRQVW>N3zyOytuas^xKkVi6d0}qh9nUMGStQ7q5&!In0{Y(%6)oC zrP*4P!}J=R56jnEml_+SgaupT8#iaxY!Z zJJHD&B_A5W4~dyha>Mt&_nM;AE3+_E*5m?@m*=7lgu9J17=A+j>)xB2a87QMqy`Kj zPukZ%kCMz|sH7cf&)fz|%InU=-yHO)z?vT@`}gOu2WLvkki5|0Y605Ud2rV8(Di!e zxR2FM_B3?i@^B@?xpo38_8doZ$(8$(J&B>k zf1~%9_h;}zFo%WU&AS)Jo-#zkK5`XNti#~Gf=|-AqSRfy&!Qs0IT&p+2TkXJIB&Sq zb0C8BtVXW$mMns?45F}@$`xlJUEk`PRJZslZI0rmnN%w_P}@e3=HBr-K&m3j8T-x` z5rW#YxDU@N+l6`#;X|b^rW9dmg1K;dz?9Kg&#f zRx*M0Y?dTSzKOy&lxMRT9$E?m>hnM9B64@k`1K6t!DQVpGgyE}E9;!%R87#{$zM>? z&PHT?6Gvkkl|QK(PR@GWHx$z8{U}(>m)Beq7)mVn?N-mXxulB#wEz4Kw(qb%f2}xA z#aYfON_w8O*Bk7$#e6rUs$oER)I=O-sa;^*Pt!t##!x45)_X5kjIO1`<%(OKS<}K$ z?I}c+x&`I)pmnf=ed7J&E5OA&a!-75jVmn7Zh{)a9082BbnS9@fz z9cHgPEq#Ig_HOpe+xVJqF9l!!axeSK+r7@Vo7pp$DCQ>kX#%rnt&?q-`AEDR`-}=& zTq1A#9aw($$6@yMrF`xCv*5`;o@TGLp62xqdpycDdOXq1cUw&gK8~_yfL=tca}om4 zsC7or?{x-=mH&J=ueH*nr4b|GsVmYQS6I(tW?AY9rr!3EvOy6~(PG>+MMxhpFY{-% zNSewzK3Qd8A>GA7YO6orAyl+d60FH}szMaLMmhZAfNwD=AmrFOeAqYUNmUKK@F_N& zK!iRKJ92jry_KO?7_Udw#TtzOZ_&l6jq{V@7Bb@_2;I0qbTx&?%?+WqY4LlzyFwCD z)%3N#9|8^)gkE1zv=Py+BrXy7*_Ot_o=r-1T^Y$N2OM)0VqPaCU%42 z;xSe+4+BTUXg0Ee(IuPX{-YKr@*iDX#>Jd2>s`pFS{9b9sDgwGf!J7roUmtK_Y%xX z^GOvH)&O^-2=SAxMA+M)RLxip2m3bGfn=T#>@Eq&#@UEN6!l?==PR4{%RV;IOtWWI zIDS0pfRyhsYWR2)iC2j-H5=v|z=$$v6>_%7b-?u@uwPEwj8bJj4 z`7*W$ap&q>x6qHVxH%}wcO6>b9EfA6kM#|NPY_7*ciGB8vki_%u6<6`CG)pm>VNwv z%FHbB&%=2un+%4cxLJ=#Bjc~-s zQ%DU5ZtDR<s>bCY){!{Y)b_q=4N8kN z?PnOabd3T0w*jW#TDbs{%XH}w9S;HY6>tX_QXIscC+>+6?J0nM?CXXn#?%?%5-9=| z>qvgr%o}>pM94A-u@RT%Qf#RA?5x!FVwW&L0b$smlV~(z9h02%=Y0R%qM?16QY{e- zjmzk`MS^)e;7np_iQ=41{kSAo2}u#52U|uhM>`l6abSxjgavRVn2r#ANejjIxUa@J zz;#J0faiwydJn>uz#Gi-+!3>?N``sD?;2YnQ^1#V^nG-x%NjTIFj`GwPQSBxMaC=Q9 z;k1Tn1vE(d$9&y=<_V4c_kY$uKdRIJ@oZx1QCV@e#Dvh@!m00g7M42l!Oai|&DU5& z{#rPrV>;^oRG=bfk9bO6&5Pb)cx@6}q%u!Gg9}}lt__Yg)O{g1EFdoYNG35@P$;Qj zjX=$A>-o%O26fnA!o2l27F)w3(nKlN6%J?E6Pplk$umv`Eg(Ax1t)dpuz0 z3H#&G)|Bxio;_lk-5}DE)Rot--wJu1I~24xM)I-}R;nC<5V zw?D>E1jPV2)+@?d4kuVDwM|*$WPPa@01yzRi;~*yC9Q3h4I%-0L>{tkq|pt{$dc zx`;*1&T(}-yA>cFP-9G)(UH5uiOogNx`N?YM^1MKs;0k*pg(lHPK5uWZVt)2{GxD` z?z}eehcZ8KR)dFnMb~L8!oGNRo<^%SYhxt_U4ZtssE0GBjh!Q=r{C6pd`=F%*jJ{c z2u#NpSF_sZgr1T^Nj>nX0aJWw{6V;Kwqd2=lPzmiX@^O!+|M@D_hcQ%)}H5>lmT1! zEbDy$Gu!t<{=eQz6>B*&!}e5S|ILc~kyfe!Zq)+6B|p<)!3C^bpt=v;b}@ieLDK6D zT^#hX7uzvw|a=eke;33S45bL#81^?SObWs*r_NUkT zNFXL@DVKHfzLzzbNtv2)iqyTx;&QN>`IY$y-xt%P{LQJ=!@*?@TUQR6eG&&bKVQxq zv=Fue2=zIQfAP-%-7`7cv*zQvh+%Dzsk(_dR3J#=V;s~bnXM%mlv(Mz5L^mTO87%6Y-( z`~-VF3w%-q>BTT|mZ7n8tqFxs-jmsFD`MgViTkg@vXso#sRE&HXi=opV=({#AOJ~3 zK~xd$T>U|WHJzszgzuO!b*Q1vEhY%ZDqn-E#5@g7+)G<;JzUgksyJ!y>IM4yC30>( z(lOpU^ltPi<%>mOT-3;_=s>Ry*iuntZy4YmFh@S7MAuWhCF?QqZ!fUNLEB%f@0|%|iRX#$W&o6`(B!pSIAa0iNEgGvdBg zK}L<20?hu~pOXEr|IBvg5swnSZb?&)rf=&I1N`f(nvFCVv7XIGgIOW+wYy|BZ)An za%4;7!q+E@d5q9=v1>|#NP!wA<+G5=2-iY3nV~RehzjP2$Wu}vBIqmTFl_nV5o*`b z;0^#Mmk~&i$SI9r^_2tC?Jf7@d^q<5A~eD{w~fBOPL@LsN0c-*rmqfjNmOpr#tL2g zF!zKuz2Vg)@Z+h2*7$5slWtqiTr6$=Z<8oY$ug`H#^RtK`(PUx%^-xDv~LXY zcusXm-}@@*9quq+52tX5CMN=GxQH-0^SmmU-mTzbh!^LtDS`mYR2_@Gj{#`M;!qgp zAxB|qg2g8-=qrV1#7fAO5I_W0fsG!3(kiYzf>m(u(31=D8N_J!T=!OqYU;hS)c3(@ zFfe^S1$<)wxkl&sx_wQRAznl|*3js9Z85xOE-_ZN72u|vQOZ7;vz0&1?4HoUmhX@9 z5NES>Bt&q_OirKGk}61FYzZ5>CAjmSf2;-6fD+5gW2z@sr9lGbVB0+ zDrr(r6d8K;zIP-!$AgWEAIJ~VNH@wg`29WGZBO?0VzyU7a3SL*4!Ly}H?eH}{XS0i zuH{IE^lTXBs={ zrhI4@;a#A2mp^}sX&Y-*4h|R!L0SY()uAiB(Am}k1bvMy#>UGz@+3u=(cH6;_|B_e z%3QQBSN%86!OB_aBzJ2Qb|1MCT(vIZ{V1>b{;Xe{M*>35vL>iAWWkv@h(PPSx(f)d z0&QAV5zqyvTk@6#ES26N1%NVxU)1u!lu7tc#5eD5*xw(pbeZv_Br@d49W_y&LWA20JrsPb}2{^dSLtBI;*u)r-~Oz)&I6t3iqjsFC)Cpq9W@O3gzBx>?m6nKq@Ik=~)^;z31J z(5^W$d$L!5IRRwbK9^b*jdN>zvjRExzh^b1G(rqDS!7EiQL-hZWR2iI%}$h>1_SNm zS;@K^?BiMP*LEh{P{pF+Dr+;`S)=*2(gHTB7ZarhLemqf0q1lHDiXO{#S|)#9USK6=SlPcQxXgcG&|y5+H~1 zs#mGGb=`t+pHpygp9?!K$XUa#Q3pX))!eYLGNM=1eO~A6?+NqspGLAyi9Z%+AO!qL zQG@cAdop{w!+v=y|Niv_T~vO*703H)tp?a@wOotg2WCN_-WMqd_hW)cN%Dnl;^1t8 z)|^MJ*A_@6lf>XNx0IY%bqFIu&u3FTV z!F-cQGb9y5;8%xzPv5%&4Z?qF7zx%b2M9=uH&BgPT5C5T)tt_*BmLWmB z_^uuh#D0(1in1V2!5Ls#mjuXp9~u>J6J9aS5WY$n?p*IWVPsw8EIX!(rgR^r``q1i zkQA(b&edy9Iw6|{QyYZz0~NoNJv2lvINZ|W&FTdV{+?QQg@Mud!l`>*#ci56t9$o4 z5%#kIh<)Yi!v}Z`76;>in)8VH830xyhahppQj@;` z9G6GA>7QH*CVVo4%K6dnuYv~^GfCwXEAgNDT!Vqn(DTcH=LOAil)*A4_=wI)5gS>+ z6_OHwOAM(CMEm|LJd-p2n0r2)wlQF`kZRXREAHb#q*K(n89;}?yl4xM&o_l00zEV^ z7dLnZcx`|#&HdWq(TxoZ#H0X971ZBqJbiPo+_o}IZX4~j{!Xv=LVzK`(m5WCQYC;s zoSzwXh4?91q$)B5Deaax+%olNKtRtel>s)%L#8!m;|8h2Zaa|HSiFYXVVk>(u>~+r z>J^mWUy=ID2;l%C=zd9>?HJ_YmSDD*&*O0x<)vBag?hagh543PqvOm@aZ+-no6*xW1A&#dXgb+?VltV;0n2q7K0no|yy{kDL9_T^ql`O7mB^D9V3Yriksn}TK zZ|Xsnxy6c(pO4r-H|=C$=n4QQT>SY^F+#h;5xVAFTnFbE=&2_!MD7Fz06;_4m?C`t8MR+sfH- zOJ+|c8H5-w{lg`u^R|~5_q4V8o#Ng(Pj;6RD|x|9p6u+`q9oTY;hNzj=dVta>ZcL1c6 zG_SVKp(YFs0xg8{dtE#^Dt&C+zg{EI&ddJXs7FVQ;wx2aHBQ~kKAyB6&jwPL@6zO> zMlk2g)DjU}cVgeC&UB(08W)XO2SLri3|AI^-oJh8G{y;%}fE< zQ~r{R!)Qs@snvBA2@@`}2$J)d+j^&a5cp(@gTEl?r-kyaZB+hdXQGnlrXhFc|vun&Ihv!TjnZ>p} z%pc!~<7E9u3#nxbO8Z#T0CXy*-PciR01 zd)bSr>`!l{D&XILh5he;(0<$oR@?+#S@_sRo`>1t*0rX2A$nXOh4PL=v@gM7l6=+HPHoX?N(W zPzsY9qpxtGSCVyqZQKGv%8IWAMmXi$loUDNXIwbR=*kwHc+E7C$cr4P&SeLigj8C2 z|6X)pQwf6?2B+6$&vZJ2G9O3{x4v`6#m>(~mi($4}nH(;*sgYI` z;^2wJvmGmx)G&uAR1T@vSlB$lX?6ulwbqw=;YM!z5OpCH(VH_p>o-ek0;FEhVIZ85 z>by8Jc{A~c8i0sltJVB9v^y{g<*NI=v`Mixa!y5KGLRN_9{2Um#p5-+-MCGK%ImM*v)@^O*$=V+AXZWrUSUvA|v``ZupL+3N2lPLOLOyVN@ z{b!4s1dhl$q`F~c>oLIt6>A4BO&l0ehpAr35;w_UUczvM_vd89V&!mJ93A7FZJAT< z8fWrSZXjsh5c~k`0I}T@kGjp=cK^nO%2GG)0y2VRBWd(@if!>A-vc13TT)68_DayEAZ^a%n z2~nP=MB9)?q-b8K(ahYsah&XH>7In}S7XCM05Z56Ip_!68h#EJu|^=-Ljmn@XZhQT z#)ya56!!&xJ29xLm4q1N3g&~iDoO)qXetH*Y@#uN&jda zOuWM@{&*1&%nJh7w5DMZZ3L|UjLjXPK+Z8=2;iT;aK1lQffFnunRO-6 zC_cCj>hW3#VkHC?j4GPsRF*K$n$}{)MWn?Mxz>b2AK8q1c`vUC1!zD6cqP@Ko-y8T zu=l#B9Qt@%0$TxZToDK&=71x(!YQ*4`o7;yg&OKrq4|0iIQLfUpFoJ6@L&b0|6S5* zEOzE8qh=ETI63PB5TTK?T_J7$j2I(Qjq}>z{*)RV2Ew1$G8?I+i4F~QfWgHO&Vi(} zP{NA`f`l1xf=V};Ipvm*c#ZMv5zQkD3GzHjg!Y+f3CUh>CB98n?rqO`f0pxbLKU^0 zw2#B=mp9m6&-wd})_}{=cFX^I!qQsWhi_b8X0x*y})StV9OtghLQJGYFh| z1nD4jwSU~CYg;d_0<=C+7vl^UW{+_`2?sS1c(MwUkgccT{dmB>+}TNuR4mqZtNrn* zzTZ^EP+MX@t3T@ud)Au7_FSDb+W>p8khZJd<|aHQea~*vUQgN-ny&XqLcwB&h)6(T zVme>6b!+qusCX8>_tc_TG#W2N#9x1xl$C5A&o8stxp;j?`RSebX_#9xxX_KOb*;)H2_;v-)0Rr~ z^?8h*)op8$sD%_f>z?@Wg#Gx)mQRdogSM9BCU7xdhqX+;@-9m+a9oRhW|&e1pc2Il zNoi0gzg8T%nBg#cF*ubB9*qBq&Z-k{geSB_%)WBWt>!2u8g_*F$nTPV7{^$dpHQ8`pRZY@P&A6)Kjfy|Ml(%NpYHM3VgbR6VF53 zrPJ(z*_-0_WKO4Q*YvEh&-iSei(tzja2NIBcm0D3SlS9ro96X5ZgSBGlKHVm@mLKW8rI zi?j{g{&h3^{lgmr)(?%=K+);adm1S}>3J7(+eE!P_x&)U`4Kpf)Y4x*o_j34S&_cx zBuS9xK}Akntm?A1H8Gk-Nz6hYa|X6?ezVD1>x@Ho)g!)Ig)ot2SZXop6IbG>EXh8e zx%4MfjIaHXt+pSc)^I%2BsyTXs%47k8HO%pCu+k%iiq^8uVgH)>g;IT^TJ*(JRDneHz z+P;RX7n% zSRAR7oH4WP=b7`P*7a=lul5!NnWbYhx{}>eT1j5#_|F66(MW2y^`!QunrqqvpScbk z&DD=IoNX-;fO;^HH@6b-_fCkDw%6)_v=#E-wz5#1R&E?podgRMT|w3Qsb?#W+|p5V6t>l9GQ0CAtC@)a1f$Uk)vfEuH4@3muugcmDkLDeVE;zNh9!P1Bf?2 z29exU^QB4_3nBrOD2X!{wP|L#Hn)v-+lngn<0#kSe1IaP;l^>FyiX3FGx zqP!~U8Hssa5EohOpT*BaRXtXlD(64J3$bX(h>G2NFq?CxJt3<Zpu+7X4&Vxp7=_+BfX`oO4yDXcI)@aCZ((Z4?$(-uHjVh{ic7<0# zr7EBCnmF|bu$Z?ngg9Y+qL(xe7k_ZJP6SvuD0N|p4)QfF+Co1q(1FFJUw}5ns3A)5 z6pxX(Z{ic;e{p_ZRIpEahiQbPcd)E_WtYx_a3CgrE(E|rP`>c@tlfADEz%RAsxwa2 z6;ectA+4c_Y9bgE1|Ajt5L|#)8Yj#-i9x{t*hnI%=Za*-9oC#ySpe_$D4!XIla_a@ z$pENiBK!HM{d%`#cGP&o;~1hEs2D^(qh#xPjvy2c)g$mi6W6r~r=V8FzJ+ZM44)h4 zVa2Y5H1u)4+QrIMtB8sV;H6(&0?>3r;S_&JalXd^n%Yp}o--+m|n z(0py&!yG^OD<_A85<(2NbG>l^DAR*3DvIiBywnaXNzM@&b7ZrRqd1mG^darGjgR4Z zR0m}qz#;%U&ul*)rDycRa{mOf!EW_ToU_?+!p^1%x5h7W2#Bh{uSJkH;XxBc zx2urzh^sq9g_jrNsFKFR5r-d!!kEf4YJ!3=f#y1Z&DJrBegBT4?jT^u`4gari&k0@ z{A3$_p6%Jp@=Gy?&16a);}m1=NI?3U6^1C`PC(XwejerfjubGxp+ve-RKicjBvCWY_Z^Mk0~sMpNj^5!qY6B zxwzmkJ}c&mGo-Fx-O0+I$PwUOl~5HsgcNjOU^wT4PW=u6er%<`w&+$FAgXr5hMLea z1DV@3@;Z!F!XG$QDs9~QC>A>r$kdshrCftJx9HY+9r3%l|wji>Qbra_J6HeEjzJ7*k z*z#3~OA$i5#_(qc2l)rlLzy`+&u2th450LA)y$6}EHqA}&4qw8*3I-P2KoJ^!Yy%B z+a$nlwR(I{#f-df#dML-s+DyQL})r0RecQ0bBy%2D8S?tdg@FaS69_l%E||jh_#@@ z=_m%ztb2Jfe@2T5ItcgMPEizQ=?`CbP=s=$Y%aveuth)R+k+!gWh!`2E|TVE_1@ z?aZ+AMtd9uFqtFh%tg>NAwW~_M+Z||K)2igKnf{3#@CkWuqD{z81AfG@4F-i!~7`k zEu#uV>SvRh;xAQDARNzHw2F(Go??dlR!bQ^AVQSuLm(E4LRbtxa?#eHU1{|gHb**A zAq-m1IlwiVDd3VGZ05s*I6q@0fjBiMxq9fLVu+Tf>--#~W7|9|jrC5Ip1FPosdt0g z9O);di6@RBXUQSO_kt{|&qD1pt3wY`>2++1$dWQ4YjYlPZ=x4$5BJGz)I807J|s0!|_u z^Ys?dRquM_AzBM5PEaz8J_W^RR>y(QLb?E#&k>}fPQd{`cp(P#MTy@hqB^e;M{p^R z&sO(%NGG|+1h51SJhI6Ir1 zh7h$2x%6@V{$cj@PJ7feuzeds_j-S1dwVIp+bO|$F3K62_Bd(` zH-;#OHU2%b{LBrb2Ce=6M|F}jS?{4P`zeKd2?}q{>t;*zI!?N;U)NZ2)EG(i5glNB ziT6lqPuMeLXw&trEi;IFPamoYzbpH&?vYjCt}cSihw1<+JPWRUDXXO*5Rp| zH0Tpn3%jpfS?Ga(wm(EXV%9{M{p=Xvj{IuFrU`^D>&K_z>aWX7;oe<6h4@*^@m9F6pww&{xN}k~&HZ-FNH#^Oofqhb9WL zCgv@KOTD^loRJ$TLieyxk`;Vh`ji$FfO$^x&(P7S;u^XW#}JGvS-cVjUsec3!M&IX zLKk#PHOZ-BUJ||1*5{PV@0d>;4()p1ZmGJNQdxuBnJ)^z8baUsTPX$_6GfxHL)L)V!}5ewtSJU?o>BZ38&Q*}V-JM5zU2nBIAyIv0Q;Y^HJ1+l0= zv|uu#$K6~C#L@oHv));jtJH37j$6*}mlXKDmY z57V<3h4*^KbzkH&M4WjDba)sooShbloe`5aNn3Q{S=dEA zAr|N4nFt%RyEo%9Ttn+;V|}l5H>+6wItBzpk+P1f!yr1L8xm4x*sm~Cg|l*-?2m2Yf3B5;N5({amJ7TQ>i#zjzu zJ{LYQotIZilf@d(x+{TN|s9SPyo-_d^wO zErp@QCZP`h5EtO8Vj9 zoW4KH!FI1s=Pxfq#PPBx`>*dsCBJWG|NKEiuF+U3QZ>R)T77&Vz{qYJqP@;;3 z)RMAKMqS|qAjF_;hB!=4+oJEiR`7<-nbsqpEI!9vgQ^0WPMzP{4`qI{06b;5(B1l) zg78mq>P1i{=hi`$r2F{)XY9?EBT14ZL18s>2M`%~_4G_1wEMFE|6fZ~-80*rM+D&R zrm_!uu^i@zBr3|R2*3|BHB}K7J}Qjj8c`3Fw#90gu^cfVR)Oyh|E)K3V}C2X$=kM; zcU(wWBBSX+G6NQC0a_erT*y+ereHISLLR9M+^!jq=LSH**EFYjo{q@F|D8@k{Jkf3 z@Ladvy3l=7ur)Cv;RPP_h`@uejWg%hgL2|?^npN731GvMN6GW9&ERc3+o^I7pg|^Q zw8r}qR<|pL)T_F~V?pcz###l&ipgZpB_7GF$YB=`bl|LVhN*fzk{H&$x@Oiy1h^=f zph8psj0^{j<`%SXL!I1+VMhmeAHEUn4M!zchS~@F!*2Ye4+Ab8w7qQI^7ZI$LVZK1 zViFQ!!I(^L;6VU$=EKeLa=tGE_6BYxs~uh^hVr6H!({(?$u>>dLUpl}85Ce^eD&;T ziu9T1ThCCp>K<2FI}({u>Kf-2>-b?UyvDgk!>^eyNJNyR<}!9(CjXW}#PuHBd`(rk zhdQ9HDL-+3Wt&syy5qX`S!=EQcdKSArPn!qAo94YyhG&mQsmwTx-S>nx4V*i>uyU0 zJ>Kh~UG3OibB^9H-dhhaK*P)4pQFhW?KOLC_1Yn^mYwTBRqhX&S@)dxrhfRJR2DjI zf;Ba|7+~eg1@iYt8`y|?uDH-J#*qgk5(jEkHk~rKVP$qY-Q;5csdd#F;}ch6joW8r z4cbQ)%ypr|P8;4agcW{v z=xae4HNz?;P6Pk9K%DJ7gF~=@dIrGb>CF5zJ5UmnQ_mPsRWn=*XeP%XeA36Ce%906 z0!`2E=*gArr|@TvBLl#PoJu5YB}8fgl3YnYNm^O1#ir6)%W>t11nOI=$O9tZZp~`= zQAJ+&B6z60UE1^3EdJXjwUuuFsPx=oy!X0rL)q_4cpg9VAVD~OlXIbSU^PDD>>`w?cw%mV zCj&qsCzDlovOT}In~n}wuymZ|_yU;7D5K)1z1S;lp>{f=KGIZ@GZ2YGg>ix4_)ErU zqU#{Xgc*^Wvrsp#lZg;+KEJ_!n{AFwc7qg-S=2QU*h{mj|Lvzn0{{AoHRx9slszBz z|L8wPY`_>)kAYRfe?uKTYVfTM*M-PT19RHwhGwcsB;swxtwb8}ed|ibK}x{ZTy#pe zIfxH7~*<`|A}u&mMxBa(5PoGk|dQH@~JxUhZC-)iezz$R849WaZxWMx^c1~5(vfk zupm4M-+7S@xJ*}-G@M4VXqzO&9gH(it9aXI+jt@8S?VJWsHT~?p^4)%D~m*+o~)%V z;z}LfAS6)oF}W81GNMK0s2)pnvW^di-r!gvF2X=<1Q3Fqq!8XACmV%I=5iQaX2sN@ zOtujkI&+54A}!#=DnCC~`TDND!a-SKHV5%2fSNfu)_M+j4Lg znO-#}T371Zc-g3~Swj`)To<0yU;r4_I$T{d-QLBOBb5U1h=w!s(Z2F_h97Nv_k=M(}gcP}pO3@Bd zjpk`E@Rjp#b#1n4^J=D5cWIyPQKb##cC1o(s{WU98EO~OP%c7R@lk67_zztbWa)r$ zW4WyBSNdyji@M#e$%smKGymPgnj&kOsV8$yVyY0I{(_V$bVc>V zgp3oe4hRRwkvz#4lgQdsaRRDO<_Ed`lq-C_qSae}%1{Bo$QS0Ys@wmK990;n5jV6S zmx8S1jD4O5cD!sx>>!re&!sdcn2`s(l~#Y$sw*>GR^IGb$s1ZByKj)2w5;HVvU0f> zznA{}Yzw$Qsv|C#hF;SH9#j*sxT?AvX0z=5o(I<$!71cC-)BmK3_Z#Z=yR2<8|52i zr-kgnZX{T$TpmJ1B9FwufJzDy+Q-|)eaOnVoN+1sj2eUm5TMLik?hT>F1ARisRxk& zm6UgsVV5aC)OjH=u@BUv^I@_ED(uX|@iN5X9xD4@E7nf7{dQCN>%9?KUau-!DYEz6 zVs9I_^?}#kGqR7m&eay7v&fK_t&=IM$oHd@N{h-4Oc%1DUe#merSiU9)iqR}`+TB) z&dAdvr*3TIuNS+-2Ep%9WuC!?HLlJ@mg{k2S*L^=md=B6oy&%Kf3GN{ZXYVZ7HkHdbjA|1;0KIn9;Yc%_2E^psvVcHo zbN{cu+fb_j^8RQ8t>e*fq2`c+o|UST6Hy>?$cn_VHGi*d)s0O!VJ*v2_i9qC*uVM4 z@YAd;LhnqX1PKL_s&h?(QKfV2pt}9e40NDDX(`6K89@MHs0Y19gT{!Z9~sgD@%%PK zwUZY@_6rH48)_|)HSp8jfgo-g&V4nx+?@|3;=o4L4#X57g=hjir|yo6L>n`qeejjD z{3e?J#J;1Ov%@clT%zoHVXsG?Z%lPYmeQ$=A-Dhi_GMZBzwDTGYrz_(mtxmUiDiG- z*?u6=FU;Bs+MvCAcJ`SvLcmrQ4p7NnycCg(h&=lGX@mva zhY0=tOKGdD5c)}#8a}2F< zBhVyYQ%=q$r_yl_U+QUXjvN^%h@j6*Bx~hG&wCFG0m!Y5F#??;hZyys-nLup0N+$( z?8u^%r$Ryvr`E<2K>0m(^&Dydrx4$&ZVH>ZH724I6RD%@0tQ-lAmO3d2s*$KN%MQ| z*S&g7SY*b$8u3yx=#8^=grk*rE9MIGPLa zF~62=_NI^PXY8I14no$IT`9#`i`PnrA-tD0xE=XvV{l)JwPM&d5!~AQJ}N{umD-!KaVTuk6oh56 z5=m_x$fTG9dhK9F?U|+pWXV(pQ@dxLicaMXgAdL27fU5Y3t@A1P95GY5R@ zEO8$E@n$lIg-?jW+1dc*9&5K0ydNT8Ut3;Mi$_rT`$OcqL2k#2Ot|drcaOe?E<0wP z)!VfJeY%VM+wVpG`Dw3q;;tmQn##y4mX zW+t^ACac0(Uwa1YQbWu}Os&1M*{;0RlPWQu$tu-#{i>|)RZE3~3pxmns@9`=G}S)y za~3+(bgi6M(BrHob2sE!iBr48NzeHJGZ|E8Y(HL?mNH2(^6>+VZiokOY!IN@MquF4@31y7A<@@I7e60z**TEkP88v51|pQ8R#{1 z+7KchVH4fG0l;s>I5+a*t?fy4cu(=?&jIsj+91nN4S(Q8)`N+lI1J zgmb7cBo!4&V@cff*6bB(Novz6gz~MCpt+=|T0qnqpqh(38eYzGlV#1ucGd_WicA%P zQ0BWQDUEZK35eoUZ{7`8`??lU`M9@h{?kiSE*7$OYpN!l1Ajp0GqCqKuTi@n3Mt*@ z_yUo?KeRt5XwMf`e_@rF3pC8)3&ai1vcbRqnKoe4$yk584x;bsm9~Cvzg^o|u8*b` z^(7#?BPlDHcv({)rdDu7Jric!2s6p=j}-@Z*_UIRB|PZt$wU{4xpu-a*WmLBbv81i z`L1fo1hvgw}(!G@ckiE_1Zq)+J`d(8bc7`40!?u)dO^y z1vNd-;H-3skvvFflx!iHE+m(77NiG7;$B9iTvm4sR}@VRCCQev?-Ap<=RM=B?9rs= zRhJzdXQVc^$(-3-4;dLdQW{~%J0x||9P;T|smDPSONqu=po{#OZ43!8NI=b@5LA_K z?;@8=ivoGQwDtUYg_NVm-*6N4a>wrQIGIfv+ zYK;71LMTRfJk3=Pi5xl9UZb$RwdojfJ{kxU4mEC7A%99OaBU;4RQxn@64|H$LpYMj z4Z~w#ut*!6m2JAJpi;Ir6dXNg+ovRn*F#q^p*h-I8a{E<<>)d5fDilZ7)3(J-%?n?=ZoUi11+$Y~^f9;A(K+Q?8S&S#GeK^v}D& zq+xQht-BGTb${S9!_}ag*xbe`SZrx*Ci7BtVk%l)gG3}y$S3sbyvPVCC&&l?>0hfj zNYgmLK&h$@WT!Z6Nn*ce@1#U(Mi6fx49PgkRK>oxaZMa=9F-Pf1f$Ll1&MRPB8AX( z(M2#ioj{AsJl=VNxL;9q&bCN!glNdsdR8oD`^%-(roX&FzP>`fytJrQ#@dk$$#GJr zIwiQbrp70D14ChBz+deg&(z9;bjvZo1EU407(b_p#M@Ci=^dRUh0@NoA|ka=vE&x$=rMao9ioROFBEjXYIVOoE_PKFf}ow6C%FiT5T$R4&V{(!--j)`?itDse5XB@ocx?`9(<`x>xaqM?3| zfi)(8GXT~?Kw9`Pj)8EmjeStaZD9QPu~=2d`PqZZ-e^?5Imntc53KZ4H>b|({u7obH`1z&h4Zqvd(ptfMY4Fg ztb6vdx9@%3MgIP1e|Fs)QDg4|jz?W!;p?RlH~xID4J3SYB8S^*hT4LGyAic;-HTkd zMo2gy@(Rd9dtQjN!Rzg@^4EX+smTA4Du+Uj3V9jp>(V|?L6L1cTJ~&h*LtYc3PcXr zn1U>42Xd142FJiQHx71aAdVhpS|_rccD6@+uyb36VL`=BD{=rdW@kHw7acS~O-^gj z#u+$vl_nOS=3tAN&Nz#=Fom@`8_<-WM$ZLYq=Qp;sU^>uS34)`n}QKC6uwP8Qu?WI zXdBXLZ*H#L8DLm{7tW%VrS3Djx9%Q*uIL%fS5-L~?@7p3oqwy&ZvlxaH`$?>qyZB; zO2rqlY#}Zdk`0MfeWq;F*|2MvYLhLoR{}_k35Z?W0xmOK(|7@F7Ni$57!U+MF#J#A z6AS=0075yjO%!IJM*?UXV|faws~twb14Hh%ohb~2t>=+(kt4`L4FI2C+6%~W28}GG zYVdqD(H3(!>S(&kU&J*chT<;E!tc;la22EO=7D#2`zY-k+&hC+WEHb0D)mEJv{6~$ z|7C}~-bErs)*jfwlB+ zjW#Tp#*qXbaMY7r)FdurfU^*d&H~1*#o7i#tn@*Z;}mitNnrU9nggdO@G%v(fp#ot zSZiGaM8O*GEzpq>bRG)QH`EoQG@m_PjlOaYp|eAr?*oe}o-@(caHhF)sr=`kBESDc z#FpBIU!y)Bzkk^wS8XbtHb`GP_;AH}zqd7A0J-fgO5n1K%cbrEu_SsdRZD0>41mpA z;CA5}Y6(^tD<_`0_tVb!P})4IUKIuy!P0?5~A=kwo6juK-(+K8B4 zJ5ixROq`R_|Hl6EsI6~#=(-36A`gWOSM#k$bn)I()w%(VdvLIAD@5)``<>g-Tp<9J z`_b;PT#cxI#{;aO?~~Bckgq0y5QwkBU<}vOXgiiJsgGQ=h6E zut!3wJR#qT<3&ZH1S?t@Q$b$O`4Oy}lvS_2 zu!I3bCAbR-O)e)1_KXuJtg&gfHvuM&);jmO;kd5YHx)}zSpTV!Z3OGIk^=MaQ7XeTwH|*ybuIY8xz}{aMDG;80&b-ryq_G zK&m~8AKOP*5kMBi3&GLH;Z^QFDkAX^&e8yB|Eh8ID%H%!=@#CfkBDOE%KkQY-V0`= zcPUM@&F)*l3B$RcP@sL9tg=C={5A;Di-N{;I+W+$=wiU7j(`8F~rGe01U~Is* z0j$F=f(c00p;&Axe)Rlcj936HM*`5`(3{|bK)j+hgJ~>u#IwK_9BPX@oMb z>#kh4cE5l70{MPlMcEkWj|2R&iG19fa^YoLM2~IcTYV9EzqQ=E|L1=d`Ntp4-fpW+ zDa41*xHg3V&3$Vi%F9LMx)lLbzI}-3Ch}U^XL-N1d-Zw|`Q=O7Y~Ef({{5xMU*A>! z<4={x(T1@9^b^_|R+SyC=$tMTg|f%PG&+_503ZNKL_t)C)kuG!3^)Q;RcZ2Pes@MVcAwz9zH|9QqAxqYDL9&cqaHjA{z@TlEQ z#gTXhI_E94LZL@0XappRQP;qOn*_}qDqKGDd<>%QdVGcf$}gKU zTXh&{$;WY+PQTwv9%7kvU^me9Q+EObCwWUUwMh2af_Nl2o&Qi{pV&QSqye0QL-zCg zN^Yt6J_DDWog$LV#K9#*j!xi&++e_A`qIqS);Y+-1OZm#*4J`X1O6J;aM;T%DT+1c zN~*v)%u4pgH4wF+=DzhoUlsYd=~VWQefu)vZ)8R0psc8$eS_=}xm<@ew#wh{3&04q>$5Dx0TuMx_|Qen77_Wli#hX`n@aDUhU-@8uY0V| zxs|5gFGb|&iv5|L_h{?nqZ1$6z<<22PSQc``|O=8ur-iaY`hcOFZ$S#Sx*R3ryGBm z!qw^K@iYpZv#dnP(nEsn;8XRT#-VsxjQd|GrURM#59G``Dl4)iqaK5gX`?V&q<7Q1sw8SX4b;S zQAy=EMENpB)Xo4n%HTx zD-WLbcF}&>5Od(2w~+LogD|SWn$}(m5P>yYV{k)=*h8DBAK-+<0dp@QYal$%G!27w zhr1nu9}!vEOcg&k{12vjpWzIj z30Gu^$RrUBfStD>@$-wtvGr``EV;|vSbk*=R45L>%{2C|{vZF|dgN{;JZ_vjua`!y z8WAmx&{gH_74pY-mB+Up3(zs=y+H1=oXzY~^)(h~fa&%Q<4mPCg=6B7Tpz!r}0i??0#jj zWKWubB?7qfS?Pf_@I7+jpg+6S#2Q4hjV+a#WE7*ayvWQFju3HZ@y<-PSDm5;Rny-M zL2Fi$p_8DuB68h}?A!XgeOvB|p~Y~kZPtWYImRitbbYGk{&VWcUR6IK;ragGy8&}N zySt~Q*mK+;?x6X&B65-VzxV7UF9no+x7fA=#OAE`H5eY2V;Tm=44U#uJ#7Ausx!y_ z(Lt^I(G;&-I4BL83mq!sbuw6EFb>yY54k@U31DPymZNPTTen`QwGZTb!|*u7#b!}H zqIAo(u8b;JgRqv{w=#{m5E=GP11KD>2Z2$!t-??`urD$!QHNsBS|9>>`8OKm5j!x{ zK~)?>1xq1-lPo4={T=VEXakGuPDMW&iQ&4pETsWlZl&F$TKgdW+Sb{&wR<+KKwDG* zWP5GOp90ALwL>09m5+M^7T@n{t&R-!0i+yVG4Zmu|LvP}QijUy(QFvMTp+)^LH_vG zETX=?wu1Zh+K2!J?X&*lkJh-qT$*L=WrO_ZpKTMnJ(l|b3OYN#gD;vD1R4fjN!RIs zr7ZvE1YL}w!SXD`^VH%z9aiAURtHCe<)fA@{nQlwCIn#aXin7-3NkTy#VOlf&l#xx zz&KNuXj(TR;bIoBcoRh`=Bo+9qMyE{5mT0hw4VFPvY`LM{w4_32)=q`FYme4|_p`Pc$w06d z!@4ZN&Q}&vECONLuj$YLwj80QaZMHcL2_QB*k=41I6dHZgUOLy+F1{BNctzd#3Afy#XuIvLVeH&gdB4O>6aT zl~tGBYwg+OW60-XEA5}bx>~5K5i}u<$jSU9oeHT*77MK6wI&D%R1Jzf2_}AA+i0{M zHAE)Z%s%x*sg}q--x$Rk&ip%+fC%#P38A5SgdJ4J|1oD@B4D~7;zr=K5T}z+V0RcP$dTi3+ml|gnUFK4xsx`^VrWc%-3_Ez_f_@7A%?yr4l``OmlXke`K zkYLpLkD=f{mhyL~Ne5|~&pg$pz#s7djrFdRkPOl3k|j{NLgeGoQ?D2C>k<(~$uGZa>(se^DZ4kFkWH;~gNh_H4c_mR<8BhN zxgrXQSXh8?c=A~;>F9UX+%7jymBlVR6pNe5BY;5aS*iK|@9YFeLmZ_F>}j=y(m*@YRep$%-9;WD_4qO$O(hQaV+9eSpQFcTSAP zv4HpbNyO#a+mjYPk5x8g1sBUSW4H_-4e=aPBBLS_3HU_fQ&mkALv*i$S8+pr_%?f+{PkxK&|tJVo+7Hw{JI)QvQ6zs2e)HVpNs!}`Ke&s~8?=w{Qz6ct` zhs&;$B%s91-(XdYZIG=KfFEQHV*_Q1DYmIyN{FeNa@i4u7IMv)Ba+OJU6D|FK476i z#`U6;WjVgz*B;GK=71iu?ZgzN^`?XLu<0D|?gd@xsPeDBLH_rjBHwOZMfMo63(F#F zE3Jq|XWPGC*Y%YO`TEwb%h%VoLH_hoEAD z%Wp;AZzBKsXYJQ>3?y}`%26p#ml_vkFwQ(=2!|yz%hZ8VU;y{Wp>1Qy7Q9SDt{I#v z$Y^3s7Lv8|w`}ocF|;yqjk)H`@3Y0M&qN1YJcmebIQ{h0lsqy{AQk4W~$2BNioEZkO zN*3Q?_DVkpK*p$6$IiA5@&K)&>V5{MxXG|OR^Y+0uvIe8c4uh|WuN=k8?i$cP@OZbcZ@L`HoGcX z7I-_@t0?Q9Z)ou{ANK~j-|x#BaW8A&UeHwv6>~7Hy`K5{1}PsR^;P8Cht3$H(l>)~ zuJeKJ^EJ^)KHJt_|FSipxO6-6qprH^IF@DknHt2~N=|H7*O_;oQ77l1Gn~T+Z2o3! zh2a;xB_$+Hthk2KlHjfLgC~`Zy=OIX%N|jQMW#S5+#)i8$sl$lPK!%WMxh3X+BS4S znhCe}SoVFgqe__8nW3pC_px0isrYmO5`oOCB7eQtK8$K>|KrgdwhCHgR~1Ypyl{?v zw}`Jj4(Hpg4X*)}fBU^OJI`c5C0S0Y=KHw;v#p+t5ZR&f{f3rpt?lRQqgnUeYMssv5S2$~Dzy96T)v8Q0)w`Dj^Hh9 zmH&e1M8`SQAX`t9`6$-a%qVfjzNLsDw;NWb98;&RT3hi#d9pcrFandPrU$$VIvMV$ zXH z&4_BmqKs>E>w75gx6+@lTHCk#INJU{;yu*aTIT`-!Zb#%a^?iYpeBR#tnNC`zDS2> zAjdWTelv^J$8kg!OG=EfsxE}tsTD`K4!pm%3YucScDw%mQ@e;rk9pcUDWi78@6fgf zUiYR{QgFZ&xxKLBNYz#DN|~o(1~X&X9=hr}9>SG@g3|BGg$H zH>vm4)hvGa8eUX=Z+$+n86>GdvY<$uR3+bUm^$Ye6A5U@182?h!VSh}w?ia2S;8B-#56w*j{LFP&h!mr<)@3ItWj zo}k+6RXS-)wYl`%50NihBT8L1$p8MU;m{}|FPA0?d+q0U4d=?qcQJdgQWUTT0*d`z zHH4N)Z0R@8_m5{RyNPcoXLzpx>X{!$mdEad&c@kY+)M-M864ON)>@w9^Vo+OaC21w3rKO#(Zc@3;pdt^O*wPj?(P}0 zL_A9+1|o^U8xkp=n`Aqo(I5j-te}Z)5 z1_a&mr;3Um5ZP4pp{;Q{x}r%`E)^>mwX?uS7Vxy&?Hf|X%Bkk-rE`$IY^KJLI~0O` z!%OJ*47QGIQS~J6Tt6X#Yqb3tjGf~cO{mV#I9~6vw*zFj8kBxNl)f7`PNl!_quaW^ zT}9sSkhiPI|N0g3AAi)At6Ey|H9o_2@38~|dD$CSdfl2b^SXG(b#H5D zSZ)u(ly)#riH)X?tW!JTs>OYDbx~c)url{god<)amsZUf3_c&oWhJR2jj+vsir!I1 zYEGR{M^Le>TexR}?XAF(1gy~U3cfRzZBi^u<+&;9gvNeY( zcTRLUJ|rD#n@XqPL&61sVN4R>L-xAnetGoi#5QTtmuOE&9>e6i#{4a|eID1VN+-=! zFG^YiCuP!rvlZo<#)fn_6J^RtSF$@_nNm8l$xCTbIP1Msw$lDy_cn~vT4e87M3DwO z3<3b85#I`yy?5M@b?N5bZN!4?(Md=cZo)b6*y4 z;7s~Veum{T!#OH2xo)x0HE~}++;a?=;@3az#L7efyYreh+nsxhJul8u9L6$FG1TWG zf4z&`?p5}^fuO_r>hF(6zFfnsP7bJOidSv_uH6M--&?J=6+0{rS(J%t$pg5i*>o29 z4CYnM!QV-^Bf`L;i&&sZ&gszy@PEILXprvgLoQ+p+gm-3;YQHZr!CicISRD>r+<$A zZlgZFJ-Ta^wtVPARqhW=68BM69u-nL(PCWlD$Q=XxfDPi-6y==ix!*ps6)++Y4d+{ z0%Ps{s2;0+Fv=mQ%RbF5PQ5$t0#c&8&6>$-3bnF1Ys3j{@ri`LnB@UZqK~VIkPVsL z7-^|5)IIc;ycB#JZIX#4`>?B1AQ-44IC;X{8K@XlCgzn8dzdpPAaVKaM(JhpMdNdv z0=v3YGOQ$6Wmd$ zbdL&wxI>(wObF`FzabmZv!W{U{nnoE+tGV&QcDJZv?4R>-c(B7cG;Vk(dT4>!2*Yo z<_UWOi+!*(iUs+Y*NmJ7=M;e4HrPA%O?4kkZs{5>U=EA#6>`7RV5!^iZ@`RUR27j! zq*Bd#d+1d8Hlh{`)}m0+WA%}PC?!Qq4(f<_8~3R8NSqm)HOS(n5y{oWX9zhNS+dIl zc-I9~uA_lK#Eb)Sr-nnK#7tW;7A7QCQHUUwIyI;j^)1qX0aaaHg^ZycI768V%cX;0P!zFc}V2 z=Z+%L(JLe5!*a3Y%mWZ1ijpugz`JG#=pvB*5S`K>4YPi`irkJCJqi)|_uq?b5c&1B zIgtMP)|CHa2$EyI5(p38_TLimP8vd835QGssN`xZC(wzeOz^P$W1amYb1r&D;E!n^ zLxbf4fKEU~p|~rxc=)J=_wI(J?DR`m-Xsw8fz(egBLDY4iTu|$k)K~1hWtN&hTI;9 ze7|`THXCF;mVFrW6wcke+NfC_rbg)YDn=lv5PKN&(Gecqfr#ysV5n7 z`~hN&i?!5e5f9?o>mJPI0O8#Zqi-I-!&i%kNN~=HElL*4GR_xqE_;FmDt>a7@Mp6N zmiSaTaRWHn50MnaDjJ5pK!&=WiR{+(2@Ypq zvUp~W!`K!PNui6hVjKrz2vi;ey7tQ=kgektg^GK)^9D(@3`c8uVGUoRu0=Pq5OKuH z(R&q%dN=)KFzf|U_tsXDNA*xRi=e5-+(I34S@eCV(lAB2VD!= z;8*XBVgKlPYPUxRAP?H$XfrP3d(Z+@Y8;N*{{Qx9L(ILD$?iJpV&m8T9kxwp4qNF3 z@znQP>S?2_%LG=&PvU0U!+W~r*2qm;OnyIsu}z#Jno>^`?bOgH+>Tc0)* z*!(B9gh#P?RoBw3L#xW$rLpA;ME>V5MUGnKaV)n0?L(8x-bexaF7oBlTo>A4rVaT8 zGVT1)ZTt%wXuOxThAx}P?_VJwk9O~VdKo!>GNS;rf3H8^tK1)LAwIT+muu+_eFxL4 za7GUg{M?XZSOb|ukF3mu6{^va%Va1j1OH;w{K~^EX0X93uprJ=nFnA7FlEri=_?d# zEzY4?UlV1iWW;a_oniy-&*)HJd1}NOfXqs>=dfaExbrve?vRJvtjAf3)d|_4QI!&;ZX^ z_aTzX*s@k(*O4wTP|3#Em7tT23bm_*6{ldw4Fg13uHd+4q7DG?fIzkw)Q`8%`M6J6 zow{zouw~;+b4~NTpL0W(QqM-ROvX1X02|fuaDWjEkZ-+|MS|=xXfM=Rb=u-5*vBVN z9b6_WoZ|ARaW`1Ev>2YmQMKexo57a{Xc)^>Y8K$xsz%Wpa|YwIjf_~;HrYze>I6=eEa{2lW+-$D z$#QKi_uz?j?AQx5O!H_j)1Z#`Y~a~gYi#D!FsGe;np$UsWqYbKCTU(*lVxX{f8KXt zknuPmTx*LJRc!G~dv1u%X|FY7Z=?(mJjbX2?$0F!cGZz8C1la6AG-5E zUo}@gIhBhayd{WhLLzkWJkGI4=|N`ed*Nqv?9Zm|R~t(J3yyhdCtUs=D{O|#g8}#x zMN)fC+Viz-B9FVsbrbpT?;>v(m5)Q@?XsSQO3oqM*50Q;XWWON^|w-0YC*hDj*wJ! zy=Ei#xczM?C8gCQLgce*LL|&FbW*>D?XO0oUHqM2**5bX2=wpyCm*d5zFd*;jiIZd}CC9iKy$N)c)S3bg zCxL?y^jhuNY%+LBkq_$YR*kOC0nXau&OUrNB7yRFm1+^sQsUk$$)28z!Xv@rhurpg zSK1?Hy*Pm4=-6tTdF1rj1@^LlyTUq+c)A7?%9->6lW7kV zeULffd19_7w{2bM@p^6lf!UXI001BWNkl7@Wj%ux!jGK|@{0w`4pOf;;|^fr74^Ip zv^AL9+PuyH(KSXHEE4CgX^3tR6>pF(Cx@?Jm+VMGh$D%S7&B*l)z+1k>;@MnXCfTv z!L`o5On4(#7ZDQSsKMSubMgu|3)%KFggtg(ua10`xILMuMe8~PeI8@%V{jtz4fD^< znxr~lM#=iF5WXL>b4J^?=!p{Cxx#v~YHEHJ4-j=2l*LM6b5&U!XM`k{U17wj)GLmt zWd);Yo`$4$AAqG0!Qjk+1=XRBSYXX81>Ae@7j@;uu@Nk{YrIzLXmwoQR|xp(Q)Bd4`k`-D_g#%YymZAB^1t{Y!~!$1GK> z-9`iFG*}d9l9d2sLo*ItHLRNP=M}B#J+uw$rK}8Vk0?LJp-qGS0!s{-goUn_Ie@9i z6KxsqQrGX50@?cmu!)KuDz%7g?!e$-8`McFROF+I>>{G~rY!$YAJbNVh3az;0w%W5-t$==by_g$ZJ>azg@>5W^82RXCVLhZ#4rNUBwsVh|2MT4|0I`YHytvDpmOOCBhms~I zqc0pr*1e(Vsa1Kcd^pY*T%epMxI{}=wK=mAtzI=_KPP86;j{v2>t(F=>l`JSqIHd?o*+qYKxTuMI;=J3CLnSH}Nb3{~LuT3d-^hS9)1Hl!t zr4s`RsT@S)RUjWl`0SF=VX2I0qCE7V{b?5 zGgxFdDnT5bm|xcuEPS-eQ0DoDMLpu}NFDIk&+pZcc;<>#{;%g0wA8HSh(uyz}a{f1_9u@EpQUub>q-MaA|g&FBh4OqgRd~AHN1J)7VRny6W38-1o;^?WYZs z1FFVttX2!Isw_gm7z(v4X!}0s@gJhi8GxDHGcp0q-Kxr}bGQDvTJM9FO{wBKD)PALjMuyF=x!)uu+btn zE*mB=c6gVc$+?(z#-5COVZMAD{ zJeju3H^-E)uDr!tN3ZMM3O zBr*-xhQaYdlYNVO<`oN!fXKNqCY10ZkH;~wYt4?%L;$`&@<*s2lCe96W{d%iIPe)= zB+GO+L@>|*-Zdg>a)tb}g>Vi8gw25AFyvJDA$q`@VXv#$siPVUUQOgd7O8=ijg&Yj zB4@0TNC;;P9<{=baQ=yRE%PKW4Y|I7V1_fQHWAHcEuev9C$2^0s7Bk%xH&_RyW*u@RB!5Jt0O^-fssIUgO!@`lRfXBsZjOW}6 zoZoY>nF|e9kGj}uI;|q(!CR+tIZaw{s=3*G+%Sm)FB_z6Jxc^4*K2=`O=RCNUmt*6dIl>4-ldaY-mdF=wS3ye&i(q@ zVhOgt*F*j-%HH!eLH;(ZQ*9@_?6R+)MYcCj)M)emF=$qJozmR>H`BFh*#1gRc;%`lh3R=X;P5^ zNRG)l>seFaE!sS>+V^CMLWw?mO{JqdSnm*R7Ea@NQ+qY2#U&98#$=^YKnra8bcm3& zj41CwqUl~aiL)oR=_dHVWEQH~YdI!lDYpDc=>rntUYof|i+Bb4=P9O|5R%UJd~uf3 z1MJky?J^;d*_?5;r2Ifw;0OoTDTKH(&Ju-*qT;(#`*TrBBj-RMf8Ru2HkJD!^7XCA z{nmv9+UkhM(R$Td$1pKcY0nm&XU|8V!#7o+|)g!V#G{Y?P} zf{zC|Tv8m2T3Vg3qgEgS2FAXtJ)E1EAEIW5cBuCg-AodZP>D?XdL2XK7Ag9ryNO=5 zKKu_v=I8s{8S0Wj@=P3k7892d2twX6VYL+}`?&i&8CS^E)XyR#L~zqmqKi<~oN%X45;Ic~h}bqX#Q99D zQ`5n{Bw-0Y>Q2~o@5%F`(;dJPG7uaTk-KapPaWJ8(K>6|FSE$Z*4_df7vY`13}JE! z^%U{EGj5K8fQe7XfGGmPBBseA9dbY9A6T3sJr=AcG(TsvXa?KnOdwrKh2;%rzz!T-jQ_pM} zu(7-OoXXAzxq=xVB^%zR}!AL(AvwbVeriTmcN(*%?s9H#U zKZof}SyO5Q$OI}lFf)I2DrONI8miK3!^q@O8)N@|s9d)8Ifjyb8#bL~D0W9v=7)wz ziC1Z+mDzOcAWYS=RkM7FxseuIvIiELJa@2;7Sikgl!$BFvjC3SsjCQPMhkjAG7d;B zBEOUcfd2la-Lrjbs))$y* zrw*Ll+rheRA|Ll6-ybTsdykAD%dGMKD%#aoNkbBtadrp+acm3EbjHazn;Ya4R{@-c zcj*(Jx!BxQEXE_}CwdlI)ks!>X+6`j!Q1eEWOoi0aP50xA(iO@Cl(oLI;G4(eQ%NxQd^DP zQI?l%EP!a*x0Dm0`o~*GaiOCTWSLf1PMP2XlpKqf2{90#*~IIEtfysef)1u?)RUGb!l7$ss|1FKVbhK?#Mq>&N-EPw zd~fBdBov~nS#|Em27u8YP%N;;8V>`qfrzF^UBBXG5ejE68dq0ly<&n2gAi7V$Oe^{ zmv;Xe!K_;VcGX;!2JRO$hnlLxHcRI@RA2#?0!skgyFcM}X|>o^Ab);W`SQ});&+jw zA2f%`v^eBV%tX%6Ix9uwr9jY$ZXdUX`j5RxJ(v%x;9b_L)@D95-I9L)rtSa)eZeKfhg+d6sF#;R9o^~2Vir=yA-waQj7hyM54NfoLg?nio439=0y z&wb?{QLPbg+e2x{AYzt0wf+iQdoE2uq-u0Z9> zE9CgD(_w}0*Q2&xqw3m29-@NU?Br`d7Yn3k(f9rX=e2WojCjKI*%8A;@#$_xgZPXv z0teb>q4Q(?!w+b5IZ1hXw4P?d$+VZ9ZbH2G@!2o{%Yn7^gHAhxV5;_Ih*UZ@f`uK_ z?%*)Q3ff&An3SVL?upqS&ObG|_-hc$PJPLcp1>*wVEO#jWb)&CH46-TfYgz@5&J(g z+z4v{VHjz^cmle`kDBQWvC(LsEpV?OV4|!B5PD&-j&Ki6aT+zJi6u!aTW_ZpR_C0< zLJ@YlAf=;He4i({W$bRlHPHpo`|M$O+(|4WJQApE!vMvP+yL`C`W)2^!VzcOmqwj^ zmeRNN=iuuV^7EU>FK>|Ff5H?y;mICou!$dx1AK;IRE>jJqq@h*pd@i-8PNclfG?W~ zAR&95IsQmOI^e$;+Zab*PQ%>MKli`n9A&R_VEl)NH2&gk<9EA5*-_WL;+HQXcyDL& zUmyK5Rmh=L>d|Hy_Mw8oO00|TT3j|3N6Gbx#C~jd?TVmL%cxfx53!aFfT2i&NYsZf z%A5#5xrWfhF-jy6T-l#dx0kQ;7&(TZQPyFwbcztOihcV`Dad`9Fz2-gjkAGqH;PEK z9lvP4f~kJ}1guVMGm*eo6H8M+i1$J{OZWrhCX&zk5ZqiW_Wztr5vPHM;KGwDBldt1 zS4iUS2+f$I_IwsN6396nC8R7pQ-G^}ZWMI30sBG!tf@wSh@2LYVytkzp-_zk3I15f z@`{o4n2u1OVhQ3yJOXG!h0~-j@(y2cad}Dvihe#*T~I`1-`h-WFUuuo&hGeE|H zIX_dYCnZ(;%QGUKUdIpUk+}xJ=t2$ICaWpL!Y!7NOlOjxr;op@=C*?To>X>aMnDI6 z*v4uB&d~;9*ohy#NNnh19>{9Mr z4Dg^dcsRGx0kiLEU_Dt{RM3~~JV}Vwn#_}*WtRD-+jAwV+FWyfopSQRbNErLL-kNf zUH3);sb~fC`@In_j@ojWj;^r$@&dU%dJbwCgB8sC&I6Sa*r%RRwdjZg?6~YA+Wx*|5z0oY70^Hif*AR%_uBI(dxo>;4A z2cG47`|M3B9Rgqub6=}#Fu*EsQJBIj1u)Z1(f0(UeH$-RA* zZK4zVnf^WZ{xP<#4G7uFdn@a{HXyz=3TrL2=3qIuXh2QJK2v+%h*n!QDQ$#6rbw{b z2*c@_Q4nj$1rKWQ^`rrr$wO7P+Ot`pzQ8mj>B&;1LR4)$1kzLqHKYM`Lpafs7?rd9 zIwzdThWtQ=jgVCm6~=%+#bYAz9HO!kf~~w%9jOJ55bB?Mjh42^z7L}UG(hozT7KX! z){+X!IcMq`pOnaN&LLHKZr5$jH5f8SHq=#9AJ_&YlHJrc=46{Z)XGiq-}biarS$CF zHu%48Z4kP30KE>Ye;rEaaqg&b9AI~xG3?sP+SH`lza{ z*6o)1Rcm_&yAr>4kd6B!J6dc`A@`$M_5<(C9oI1D^pG4lEiuHI#Mmx=ioCBhUCALQwq)fgPF+b zpCyX8%NSrtnqwfjRrEK60-0#6>?w;IF&HA)B33AY}=~c7S&67pqltJvn z?cE|M7D3^x#MKU6?cSxynY@NB<1-y~z2 zZ4Y-iLOheoH3@@b5`6;no5wnmt85FaCUV7C8ms*~MHG-2;%_!cP87-Bi3j2=VUchn z)z%Mqiu~JHiFx%1FjKYndwR}QY zQ^JHM)=W9Y3OA&R-5aYI?dP!|IpDhtb%511F1YUN3E5 z{+D0c@c*B_LVkK_VkMC${F|&t^7w6r+aaEvs^`zZvwzgRpH@5A_e6c)miWI1l1yZr zcPfyWfXKagJsI|Ramd!^1l!gLwq@13kf1k7Ary5t{_WC)V3(~CbYFfJ`M5)V{UY*T zf44Z7zuvoWaSoC&ZJODUF1_*)8%ss?sX5#F2P2Ah(^Lj$$ zFtxJk4@5g!0YZ#@N9glFU%=pmU^On)+XYL|aW+q#ugmIr%LG38pfW^Cs-2MEcdc@}p z=Vgq~x<(@*R7Z0Y@6w~4umwY4FFZ$K@%Gj*)~&4BYAF^cEd_yCrrGdcZC`mxU0~aO zSpp1h5&WDkMlf084Ng9vXcS+oCKVOUQ(64r&!qV?8n` zP48A9FBg%&I`eW6L`o64UfRHYsQWoHgx|g}E6!QNs8Pr-@N+Ben!R4yp*B@noyhX` zBJx}J_rE<_4&aWK|Mk&b0!rV!+A{;2cT7#x8a#MwHpjq&CBQJa#Uq7wEv-sL#C`8m zwxu1!ngOY}f?r1-my(rs+dGCz?_Ssbuq^D^{v76oLq@U7sXFf{&g7&x9Yn$nowAo* z=OkH7QA3ZO-+kGe13;mCx2DV?%NF%~S&M9y{(Hl7O$Sk6I1rSj7FujECrc;WJ#{IX z9v4%unoT{wJm_kz?br2GEAdV2Zbt#6iUm4z0WPjthV@%C1**ap%i$)w!rgxlM9W2J zK1_soW~$A@)v#`uh$lv|$3zl!K}BjR4t8PCVD}rTziW`Gt{TPDA>ksqC=mA?K5<<{ z4riL3k)E@n+t>JpeDQ=45VlRfrrgW5h?`Par(3Jr?-DOH? z!~aqsrK*&zt8)Q4jy9MRg=|}U-=Sbw#GsW4+>{3^W?(!*TN&{qX>twBJ2?z13>BPFy2WTyx1;t7BK4;K;tMHF@)p)FejHg=fwy zJ`8A^5F33a>yMB~BAAB=mV(&lYSr$u=~ug>m`qb$_TvbQa222UZB0>Z%udG0H#(A# zw+j30i>!TC^Jbb&Jm7|D(<0D6*oNV~h7r@En+XR*414q(WWOE?EY4Mj^|>~(<=dsj zL4AGgj!#?6ZRI*gNioC(TLuy<4f?eY!qfrJV>mZ!d>MBBs|Psx8GV1OI&&I<_1CyR zRNn7Y<986QMFNQ2jwY+EI@}RP-ZZJXDWtU&OX{oDGCAteBbkQXX?L`$q`cHb^*y7{ z=$@-fjADc=001BWNkl84`Be(;p%YmN*YihjJE6~}7JOH4aFS?o< zc5et)HM9rT0k~wXRQA#cgD;m+ zZ|LHK)xEPy&nUrxJdJxTqxKI~DbF#Z+b4onH zE*##(ihq#m96_L=fkHa_Wut&z)~|wCm)C=aB1H@#WvFfI)~&1Qe6DqzNwAR*>dxHY zLu=1$6-%%d(wN6=^~@zjiEIl)0$8Gf_4i?*It8*w2|-*#;FE&xgd!QTUqk)p*Blbe z?D@#_M3bsiCTT)p(-4vknm|v&LqB`{v1+aBiO>a()#c~Zoq)){KY~4%B(R3@>3T<27ue|b27k5@J*IhM?JGR0)ne=B@#>}!$VdJY0m>$wOE15mzNe5`t=R+ z@4vU7zHW}_hI3lvXQF?coyIsJxJtbJPu0AJM4(2UJKU=HXv-YmAm`Z8+4hXHJ(|w? z;@k>YVL68WBYw3AIRS_zj(G=NoN*7wo?F+?mC_0H^qC(AdYlfVZVjJ%yF$KwRH*{_ zxRW#GbexM|oWWL@9At7wS5%uF-1w>a`97w!fLD#9rutW3ZxT+2lz128Eqzo#R+5S% z*7|eCKeI|_uzGUQS@{b2#GSzP0H)uino=V%2(Ff890HtKuS`@Ha-4)4O1kZb;y$23rv;j5=xGegN_@ z*Ai#$RXh-fp6-#R&R1@25T9=%K18P!Cld2Rd%D((Y^~OnGG=rpoAY?4)y+}YHO@qx zu%037+z!NgB@tDBg|a>Zi-QXtB3qxC>_z2TN{jF&A^^|rmY6F3Q-$VaaF+h;7^9IG z0CJb9f!t#E3e!UK@2QPPm*fl{x2S4LrCfu3iFniEWLYAOQk_&)WH+0Sh{@5)qP&8M z3E4D^hLPSe3q?aAvVE00E!I4(yjZx-@DzSid;68uWusv18opf))43Z zXdh_b8W{8FInEEmI$NNSnEXO@U8@=cU%UM#EG=SmsjFDP_Br0d#TRVTCeACdi4E5O zV>li3aEN6Zl%fxim4cjGf=95^P@|eS>hAqCn&mx;xqLH4vO2GnR zoDUztNEPTAvrNq%kj1BaQ;KPM?1hoZfMC=`D0Xl%?I&pvg>8`)%eMA#P(Ia&01y!= zm-gD1P6F5qvpFHxtt zsR4qqovymBx;Qf>8%T}=7`Fc7-$OM&zR7Xu>}6{2DgOG8&flz$!6a@8W7dtz97%C9s(iE_D0dQ0@M2K zl!BZzGinD*W8c$WKbJNj(<;W=f2z1O$$po_0o;wVg1J^KH3&3>N!9ejdsR==hJ)E4 zC-5uTXU9xzCLG{odO1g{WOd9v1B0V0R!dX(-J3u_*D%Qwj)J9<+nX109p3#yEX`9RWPUIC(Ij?s$XC_5H*qHuNH1KEzHxaO6OZ&R}5%FT5ToX07{r zF6+^D)}pQf&DhUtO-LyO6(|u6)$g0sPq=aPs^fTHBzH0xzkoOZTI2%jT&Bne1(HTW z_+bIL8Dy<4;&l%L8g=ajS=1Vzk7Q|-Y{v{%=9q4)npwm?9ZhH;*EnlPiU>F>+afAt z_gwcK=YKE9A3LPcd}=a3W2S^hNQf}R6jKaKV0wd@3(uTZK-R}k2GK}Cp5*$OmKv7q z9GaQ+&k%GJG&eS_BLDhZk?SV%&p%@hG311V_*wb&BwjrXN(+)QD^U$*j$PqayR&Sp zi^_c-PJTzDsfy&c;l~}dGaG*z@MH>Dc2+FpFI{)e|~SD@7qn}Qi{AkR9<$GkGnMTFX1*Tw#xWAE+;5P{B>1gYgv-p5!?hk zYj!ERZ^dm`3q3np)a2Z^!+jtBA!M(gl}LeaoP=e?o0$a+*nVDJt>~@ZSIMEy4>da5 zAX|STAx}PYI|J44%CTP@=io6AAi#QX(G(m7;p3xKV2F9c-O1FVDSYWaGfmdHuh0~p zBSF9k`A62QA=rEX6hm`3G?u6 zp=ex73KM~sWm^s+7Tg_!cY;W5j2Pc{_k7+pBmj;KmJ!X^M3A7iU%Q&S z36LO{U1bxz?@^T)cq6YG(W47(Shf}0G|XHd2M7!o1M@!`{0boV+Ft3??vRkHFe*kq74LkbGAvMtmkWw1zpW;Qsrs@TA65ee4m z`lK-9t5E&$yQ|*qP|rTF!Me>7gWcwu*xd-(x%L81(PJG319eBwD(*wa0x9kR8DIee z#OY@?OhnfibQ|XpA5e7_JTJZYsb-fNkIUHRw(dmSD5geCTXAEqw#8 zDmyV_YE`3L;_p8kHfko1atbeFqc6nl_KNhtrl97CY;2Jh3ZC3yspzKg;Jj?gBa2p= z7U)%Xv<;=4o)(|yO|xhm8VH^=r<`?Y7?cG1AS+ir@UNCQU}7Xv^DR23#hpp6nSolD zkkuYo*0&ql!-p4*=L;ZpKfNc%KV*Z73F@dB0NW^$3<*#(giyy8^UY%^-AbIIhz1$$ zU}okvDWcORZZt||G*@NWOdY-UsG|lcya!>rR~)se@COO4xQH9+*?_!_@1#-idB{<{fEnlsZ73wSO9b2vr&wxOzoZ&KpV>&w(_O6oG|1>r>ZQ+oV8AoN}CX zJ|rcJW_1Nyy)i+Lt=j?^=`hlzq)!NU|378#+T}))WCz;y2mqNRtE;AZX0@}D&T9Yv z4_lp)R^46AM`i-ycR!dv%*-vo63^*ok<3H_5#jD;c3%`nNO0F9vfK%mwI*5KIinWz z%xXNL5M`*B9vk;n}41f=Ll!~vrDTnkx?XKEGuJ~)+_@Sw7{EY1nH%TzA2DZ>dFG2~iD z;zw%#Zi$#;6yT9W5y&g?ox8mlSo+}(?v@Tr_rX<#A-T@j51hqNv>)>R&=2ze{!O!q zH;BAk(e^Hl6#Mqk91mNhM#0+KTTqXITo<)vcAvgin(Av~I@TXR_k5nB>_ZPGZi zfhW#>W^V($Qp(VbW84!AcqA6&$FyPh#HmRl!YS;R0Wa(Q;fdudEpU7?$jagbmQ30( z7ntN_Lm+fca^B8*^o9{+m7m38(Sukrv%e$g1QZEIrrHk16gUw@O?|^?u?BX z{&G=A*WW+um;Be?^|Su*joV!EhYp1qU?`OeTx(40e`sA;7o?(iPcB5yOa0$V~XyB-LZS$XT 9=fMlEVR?qr=_>Cf4Akm_!-@rP7 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�%GwXYVgSZbr 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

Xu`W@2dGU79tKLW7<*N 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

NX<-4R?T4pz|1(?>3~k?mPy;IPi2<71^3<(4=A! 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 z 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

i&vj$54_z56}hpbm3^aPZ)ZBp4!^ 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%0A%v9>PS{0rRm%UL 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

uQ9($0pK>O~eFEH< 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 z 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�o2Kn+HN6Q&$0f?OpWl;vU^N;=5l-(UH$a^HgPEAXSFi#c zhj)R)ttx2hL=g^pOjlijA&i24^ZOkk++8;isrmtw9olr73*^LLNqm)^qWX09A= z!?DdxbiR0$xNE^pk+@ciBD_$e6|MU4+8S|b9nQ}CU170v+ZJZKELF-`LDFOucYt%g z`isNos$&w!)M~`+e;yF9W-eJat)-u6S|hK;#DedSiDG?DMxZl(=73q2%OZ4T$CPF# z0CU}II*-uOQ;<7;;V)biM6aaQ=$a=%=#3%G1ZMf3u(J&EU+Fn}^9#2*!4nE4{GwIQB{_qMgfGoUEq0(g06lNO4A1)x~G? ziYIM$=^%#rOp8}S@Ay@jP856`Q@!j_yt6~ke0PAP0;%~L!2_{8C)e~Gd3gUl%B|X~ z#*xV7>}=y!X3%|K)~%QwW|f$Z^2zb;M9L9qf*IRT@o^t2!8kSDL=%6^_rJEAy6VLCg=o)k(< z`UrNOS-%K~h#pa3qp}f^gh5{A7l;j##Z7p--0spktg!!$o4Cr@iFX{e9ALr&4vnnj zh{6@u0IT&AE~T8N=Xf#%AeIy&QY0QFDMYDi-z4M$d52$J{* z!~lJ$nGFQBZ0|=<^(wFhyn~wwYQIw|`ug*HoKic2 zZPln^JhcKWeO7Z>um|r%-U}sFawcB~*H1nFvdjO=ugg zFImeolX+=zK$mn3S2;_6=d#IAx{l*>e>x}aCgqx~7%eKRf>Npj?EDJWQPT%r&>9TK z4W!EE^pc|qV{q;jC~3hjQg1ftR=%H1&0XEa8wYtw>DH%dU19=mU^$>!#HOf1zC?K$ zDk3&ue)~EtCVIaQ^6o&zXM2^wHV$w!ss@&6PN&V;j{r#i*!o}EjwIuQ}aS`R6j&T?ObO{v33Yc9lq ze=AsXe8Y_(@q^pnQo5dBkzN8*_fa5xJy>G1H-QV1 zc7zshnkpEL0F~N?UzGzEDY!w*s#{n<%(>7A2Co}Vac)qMIWr0HOA|fB4{&=~Y%G8| zI9pIa#-8TA0NVrG-NhY6|E7Gw;)KT>Hk`QzB(^AVY$bnF9MkHy?Kpyw%Rz}U1PIh; z6Yp%QDj9Ix-B`t+vj6WWo#}~w=mO150I4b{!2vQ6hSQ7f;Gzd}{UNsD=RU(0g)XoX zDPDz;3BUWICRl3vUEmokLcM3cblL`2SrtqD#py+690%yL%go(@A3GM8fZ?Q-)s(<# zKEWdXMwIrw%t4{d~I zP3deM>t#WBzTZ+Oh9a8G$`$YZzWfxKPk$llT!_clXkck0BHlk|H5cjI2(t!_^GyzP z5rm46fvs(*wLl~9YpX2O?=g3+(aw6Qe4Wy({p|9XLg*Etbly?+GfU+Sb6??!JDyUV zRAyC8W#fgpgMiT{^M^l69=|T-qHh9nkmNCsA=51 zt?H$ASZ6{?F)fUI4$r^;Gl4x}BE_}OpB_NS!R_QFj1aakb!x@6V3(l(KJ=P0TD{N2 z?}~-BPl%LQD{ob7y()c>#hL%OkK#} zt>N%HXl_QgV&90_FO!QfF1mMp1hx|`|8wNI>O*-N89epQ=Oy0{OAcab0GTPN7(~@W zVUlBQTMxrr$Ytg*e7W8E+=?!gf#<2K8?F7+RPFezx^w~Ycj~RLjfn9l4)TdfdI@((tB6K5Tg4N@d1X>B`S#+WUWTvZYzCu$5a&Tc zuwoE(#=gmV2+>j-mj{oQ=)E09

NohTBTMYy7%&u{^|W(MFhdWz_`zRSFVXj|m)t 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

&8w4o7)B#IF6b|&~) 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

C|wm`*F|_? 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 inw#kOT@@(0y5e`{%=9w+VU4&-du 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

eco=}Lt_O9p%QO+kb@x9OE?k^e2s>@=8& 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

!d+2AcIBLmr3=u>@+DaJU51DCMulc9kHo) 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 base.Image; set { - base.Image = value; - this.Animate(false); if (value is null) return; + this.Animate(false); + base.Image = value; value.SelectActiveFrame(new FrameDimension(value.FrameDimensionsList[0]), 0); } } diff --git a/PCK-Studio/ToolboxItems/BlendPictureBox.cs b/PCK-Studio/ToolboxItems/BlendPictureBox.cs index cd0307d6..585c9684 100644 --- a/PCK-Studio/ToolboxItems/BlendPictureBox.cs +++ b/PCK-Studio/ToolboxItems/BlendPictureBox.cs @@ -1,11 +1,7 @@ using System; -using System.Collections.Generic; using System.ComponentModel; using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; namespace PckStudio.ToolboxItems { @@ -24,8 +20,13 @@ namespace PckStudio.ToolboxItems public Color BlendColor { get => _blendColor; - set => _blendColor = value; + set + { + _blendColor = value; + Image = _image; + } } + [DefaultValue(typeof(BlendMode), "BlendMode.Add")] [Category("Blending")] @@ -37,6 +38,7 @@ namespace PckStudio.ToolboxItems private bool _useBlendColor = false; private Color _blendColor = Color.White; + private Image _image; private BlendMode _blendMode = BlendMode.Add; public new Image Image @@ -45,7 +47,9 @@ namespace PckStudio.ToolboxItems set { if (value is null) return; - base.Image = UseBlendColor && BlendColor != Color.White ? value.Blend(BlendColor, BlendMode) : value; + _image = value; + base.Image = UseBlendColor && BlendColor != Color.White ? _image.Blend(BlendColor, BlendMode) : _image; + Invalidate(); } } } diff --git a/PCK-Studio/ToolboxItems/InterpolationPictureBox.cs b/PCK-Studio/ToolboxItems/InterpolationPictureBox.cs index 3da28235..ad80b8d3 100644 --- a/PCK-Studio/ToolboxItems/InterpolationPictureBox.cs +++ b/PCK-Studio/ToolboxItems/InterpolationPictureBox.cs @@ -9,6 +9,15 @@ namespace PckStudio.ToolboxItems public class InterpolationPictureBox : PictureBox { public InterpolationMode InterpolationMode { get; set; } + + public InterpolationMode BackgroundInterpolationMode { get; set; } + + protected override void OnPaintBackground(PaintEventArgs paintEventArgs) + { + paintEventArgs.Graphics.InterpolationMode = BackgroundInterpolationMode; + paintEventArgs.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + base.OnPaintBackground(paintEventArgs); + } protected override void OnPaint(PaintEventArgs paintEventArgs) { diff --git a/PCK_Studio.sln b/PCK_Studio.sln index 8062268c..79c1d8d3 100644 --- a/PCK_Studio.sln +++ b/PCK_Studio.sln @@ -11,6 +11,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OMI Filetype Library", "Ven EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpMss32", "Vendor\SharpMss32\SharpMss32\SharpMss32.csproj", "{E8D0B671-3AB1-48B6-A767-58DF67BD5D11}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PckStudio.Rendering", "PckStudio.Rendering\PckStudio.Rendering.csproj", "{B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PckStudio.Core", "PckStudio.Core\PckStudio.Core.csproj", "{345EABED-F0D1-4D04-B409-BABDEF747352}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PckStuido.ModelSupport", "PckStuido.ModelSupport\PckStuido.ModelSupport.csproj", "{43BCACD7-5405-4499-9B45-E1435AC03C26}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Beta|Any CPU = Beta|Any CPU @@ -78,6 +84,60 @@ Global {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x64.Build.0 = Release|Any CPU {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x86.ActiveCfg = Release|Any CPU {E8D0B671-3AB1-48B6-A767-58DF67BD5D11}.Release|x86.Build.0 = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|Any CPU.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|Any CPU.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|x64.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|x64.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|x86.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Beta|x86.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|x64.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Debug|x86.Build.0 = Debug|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|Any CPU.Build.0 = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|x64.ActiveCfg = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|x64.Build.0 = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|x86.ActiveCfg = Release|Any CPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF}.Release|x86.Build.0 = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|Any CPU.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|Any CPU.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|x64.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|x64.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|x86.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Beta|x86.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|Any CPU.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|x64.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|x64.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|x86.ActiveCfg = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Debug|x86.Build.0 = Debug|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|Any CPU.ActiveCfg = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|Any CPU.Build.0 = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|x64.ActiveCfg = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|x64.Build.0 = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|x86.ActiveCfg = Release|Any CPU + {345EABED-F0D1-4D04-B409-BABDEF747352}.Release|x86.Build.0 = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|Any CPU.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|Any CPU.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|x64.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|x64.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|x86.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Beta|x86.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|x64.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|x64.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|x86.ActiveCfg = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Debug|x86.Build.0 = Debug|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|Any CPU.Build.0 = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|x64.ActiveCfg = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|x64.Build.0 = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|x86.ActiveCfg = Release|Any CPU + {43BCACD7-5405-4499-9B45-E1435AC03C26}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PCK-Studio/Internal/Animation.cs b/PckStudio.Core/Animation.cs similarity index 93% rename from PCK-Studio/Internal/Animation.cs rename to PckStudio.Core/Animation.cs index 8b1c9966..f5917486 100644 --- a/PCK-Studio/Internal/Animation.cs +++ b/PckStudio.Core/Animation.cs @@ -18,13 +18,12 @@ using System; using System.Collections.Generic; using System.Drawing; -using PckStudio.Extensions; +using PckStudio.Core.Extensions; using System.Text; using System.Collections.ObjectModel; using System.Linq; -using System.Diagnostics; -namespace PckStudio.Internal +namespace PckStudio.Core { public sealed class Animation { @@ -42,11 +41,11 @@ namespace PckStudio.Internal private object _syncLock = new object(); - public Animation(IEnumerable textures, bool initFramesFromTextures = false) + public Animation(IEnumerable textures, bool initFramesFromTextures = false, int frameTime = MinimumFrameTime) { _textures = new List(textures); if (initFramesFromTextures) - AddTexturesAsFrames(MinimumFrameTime); + AddTexturesAsFrames(frameTime); } public class Frame @@ -167,7 +166,7 @@ namespace PckStudio.Internal SetFrame(frameIndex, new Frame(_textures[textureIndex], frameTime)); } - internal void SetFrameTicks(int ticks) + public void SetFrameTicks(int ticks) { lock(_syncLock) { @@ -178,7 +177,7 @@ namespace PckStudio.Internal } } - internal void SwapFrames(int sourceIndex, int destinationIndex) + public void SwapFrames(int sourceIndex, int destinationIndex) { lock(_syncLock) { @@ -186,7 +185,7 @@ namespace PckStudio.Internal } } - internal static Animation CreateEmpty() + public static Animation CreateEmpty() { return new Animation(Array.Empty()); } diff --git a/PCK-Studio/Internal/App/SettingsManager.cs b/PckStudio.Core/App/SettingsManager.cs similarity index 57% rename from PCK-Studio/Internal/App/SettingsManager.cs rename to PckStudio.Core/App/SettingsManager.cs index 9cc7e1b2..3559138d 100644 --- a/PCK-Studio/Internal/App/SettingsManager.cs +++ b/PckStudio.Core/App/SettingsManager.cs @@ -19,27 +19,40 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; -using PckStudio.Properties; -namespace PckStudio.Internal.App +namespace PckStudio.Core.App { - internal sealed class SettingsManager + public sealed class SettingsManager { - public static SettingsManager Default { get; } = new SettingsManager(Settings.Default); + public bool IsReadOnly => _isReadOnly; + + public const string KeyToStringContextKeyConst = "keyToString"; private Dictionary> _registery = new Dictionary>(); private object _newValue = null; - private SettingsBase _settings = null; + private ApplicationSettingsBase _settings = null; + private bool _isReadOnly; - internal SettingsManager(ApplicationSettingsBase settings) + private class InternalSettings : ApplicationSettingsBase + { } + + public SettingsManager(ApplicationSettingsBase settings, bool isReadOnly = false) { _settings = settings; + _isReadOnly = isReadOnly; settings.PropertyChanged += PropertyChangedHandler; settings.SettingChanging += SettingChangingHandler; } - internal bool RegisterPropertyChangedCallback(string propertyName, Action callback) + public ApplicationSettingsBase GetSettings() => _settings; + + public static SettingsManager CreateSettings() + { + return new SettingsManager(new InternalSettings()); + } + + public bool RegisterPropertyChangedCallback(string propertyName, Action callback) { Type propertyType = _settings[propertyName].GetType(); if (!propertyType.Equals(typeof(TSettingsType))) @@ -49,7 +62,7 @@ namespace PckStudio.Internal.App return RegisterPropertyChangedCallback(propertyName, delegate (object obj) { callback((TSettingsType)obj); }); } - internal bool RegisterPropertyChangedCallback(string propertyName, Action callback) + public bool RegisterPropertyChangedCallback(string propertyName, Action callback) { return RegisterPropertyChangedCallback(propertyName, delegate (object _) { callback(); }); } @@ -78,5 +91,23 @@ namespace PckStudio.Internal.App _newValue = e.NewValue; } } + + public bool AddSetting(string name, T initialValue, string description, Action callback) + { + if (_isReadOnly) + throw new SettingsPropertyIsReadOnlyException("Can't add setting. Underlying SettingsBase is readonly."); + + if (!_settings.Context.ContainsKey(KeyToStringContextKeyConst)) + _settings.Context.Add(KeyToStringContextKeyConst, new Dictionary()); + + var settingsProperty = new SettingsProperty( + name, typeof(T), null, false, default(T), SettingsSerializeAs.String, null, false, false); + _settings.Properties.Add(settingsProperty); + _settings.PropertyValues.Add(new SettingsPropertyValue(settingsProperty) { PropertyValue = initialValue }); + if (_settings.Context[KeyToStringContextKeyConst] is Dictionary dict) + dict.Add(name, description); + callback(initialValue); + return RegisterPropertyChangedCallback(name, callback); + } } } diff --git a/PCK-Studio/Internal/App/Updater.cs b/PckStudio.Core/App/Updater.cs similarity index 76% rename from PCK-Studio/Internal/App/Updater.cs rename to PckStudio.Core/App/Updater.cs index 13ab8a6b..c3fb3a9b 100644 --- a/PCK-Studio/Internal/App/Updater.cs +++ b/PckStudio.Core/App/Updater.cs @@ -3,18 +3,19 @@ using System.IO; using System.Windows.Forms; using AutoUpdaterDotNET; using Newtonsoft.Json; -using PckStudio.Internal.Json; -using PckStudio.Properties; +using PckStudio.Core.Json; -namespace PckStudio.Internal.App +namespace PckStudio.Core.App { - internal static class Updater + public static class Updater { private static Uri _appCast; + private static bool _autoUpdate; - internal static void Initialize(Uri appCast) + public static void Initialize(Uri appCast, bool autoUpdate = false) { _appCast = appCast; + _autoUpdate = autoUpdate; //AutoUpdater.ClearAppDirectory = true; #if DEBUG AutoUpdater.ReportErrors = true; @@ -26,17 +27,17 @@ namespace PckStudio.Internal.App string jsonPath = Path.Combine(Environment.CurrentDirectory, "updates.json"); AutoUpdater.PersistenceProvider = new JsonFilePersistenceProvider(jsonPath); AutoUpdater.ParseUpdateInfoEvent += AutoUpdaterOnParseUpdateInfoEvent; - AutoUpdater.Icon = Resources.ProjectLogo.ToBitmap(); + //AutoUpdater.Icon = Resources.ProjectLogo.ToBitmap(); - if (Settings.Default.AutoUpdate) + if (_autoUpdate) { UpdateToLatest(); } } - internal static void SetOwner(Form owner) => AutoUpdater.SetOwner(owner); + public static void SetOwner(Form owner) => AutoUpdater.SetOwner(owner); - internal static void UpdateToLatest() + public static void UpdateToLatest() { #if NDEBUG string url = $"{_appCast}/main/Version.json"; diff --git a/PckStudio.Core/Atlas.cs b/PckStudio.Core/Atlas.cs new file mode 100644 index 00000000..d30f19b0 --- /dev/null +++ b/PckStudio.Core/Atlas.cs @@ -0,0 +1,231 @@ +/* Copyright (c) 2025-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using PckStudio.Core.Extensions; + +namespace PckStudio.Core +{ + public sealed class Atlas + { + public string Name { get; set; } + public int Rows { get; } + public int Columns { get; } + + public Size TileSize { get; } + public int TileCount => _tiles.Length; + + private readonly AtlasTile[] _tiles; + private readonly ImageLayoutDirection _layoutDirection; + private readonly List _groups; + + public static implicit operator Image(Atlas atlas) => atlas.BuildFinalImage(); + + private Atlas(string name, int rows, int columns) + { + Name = name; + Rows = rows; + Columns = columns; + _tiles = new AtlasTile[rows * columns]; + _groups = new List(); + } + + private Atlas(string name, int rows, int columns, IEnumerable tiles, Size tileSize, ImageLayoutDirection layoutDirection) + : this(name, rows, columns) + { + _tiles = tiles.Take(rows * columns).ToArray(); + TileSize = tileSize; + _layoutDirection = layoutDirection; + } + + public static Atlas FromResourceLocation(Image source, ResourceLocation resourceLocation, ImageLayoutDirection imageLayout = default) + { + Json.JsonTileInfo[] tilesInfo = resourceLocation.TilesInfo.ToArray(); + Size tileArea = resourceLocation.GetTileArea(source.Size); + int rows = source.Width / tileArea.Width; + int columns = source.Height / tileArea.Height; + IEnumerable tiles = source.Split(tileArea, imageLayout).enumerate().Select(((int index, Image img) data) => new AtlasTile(data.img, GetSelectedPoint(data.index, out int col, rows, columns, imageLayout), col, index: data.index, userData: tilesInfo.IndexInRange(data.index) ? tilesInfo[data.index] : default)); + var atlas = new Atlas(resourceLocation.Path, rows, columns, tiles, tileArea, imageLayout); + atlas.AddGroups(resourceLocation.AtlasGroups); + return atlas; + } + + private static int GetSelectedPoint(int index, out int col, int rows, int columns, ImageLayoutDirection layoutDirection) + { + int y = Math.DivRem(index, rows, out int x); + if (layoutDirection == ImageLayoutDirection.Vertical) + x = Math.DivRem(index, columns, out y); + col = y; + return x; + } + + public void AddGroups(IEnumerable groups) + { + foreach (AtlasGroup group in groups) + { + AddGroup(group); + } + } + + public AtlasTile this[int row, int col] + { + get => this[(col * Rows) + row]; + set => this[(col * Rows) + row] = value; + } + + public AtlasTile this[int index] + { + get => _tiles.IndexInRange(index) ? _tiles[index] : throw new IndexOutOfRangeException(index.ToString()); + set + { + if (_tiles.IndexInRange(index)) + _tiles[index] = value; + } + } + + public IEnumerable GetRange(int row, int col, int count, ImageLayoutDirection direction) + { + return GetRange(row, col, direction == ImageLayoutDirection.Horizontal ? count : 1, direction == ImageLayoutDirection.Vertical ? count : 1); + } + + public IEnumerable GetRange(int row, int col, int rowCount, int columnCount) + { + for (int j = 0; j < columnCount; j++) + { + for (int i = 0; i < rowCount; i++) + { + if ((row + i) < Rows && (col + j) < Columns) + { + yield return this[row + i, col + j]; + } + } + } + yield break; + } + + private void SetRange(int row, int col, int count, ImageLayoutDirection direction, IEnumerable tiles) + => SetRange(row, col, direction == ImageLayoutDirection.Horizontal ? count : 1, direction == ImageLayoutDirection.Vertical ? count : 1, tiles); + private void SetRange(int row, int col, int rowCount, int columnCount, IEnumerable tiles) + { + Image[] atlasTiles = tiles.ToArray(); + for (int j = 0; j < columnCount; j++) + { + for (int i = 0; i < rowCount; i++) + { + if ((row + i) < Rows && (col + j) < Columns) + { + this[row + i, col + j].Texture = atlasTiles[(j * rowCount) + i]; + } + } + } + } + + private int AddGroup(AtlasGroup group) + { + IEnumerable tiles = InternalGetTilesFromGroup(group, out int _, out _); + foreach (AtlasTile tile in tiles) + { + tile.SetGroup(group); + } + int groupId = _groups.Count; + _groups.Add(group); + return groupId; + } + + + public Animation GetAnimationFromGroup(AtlasGroup group) + { + if (!group.IsAnimation()) + return Animation.CreateEmpty(); + if (group is AtlasGroupLargeTileAnimation largeTileAnimation) + return GetLargeAnimation(largeTileAnimation); + return GetAnimation(group as AtlasGroupAnimation); + } + + private Animation GetLargeAnimation(AtlasGroupLargeTileAnimation group) + { + return new Animation(GetLargeAnimationTiles(group).Select(largeTileParts => largeTileParts.Select(t => t.Texture).Combine(group.RowSpan, group.ColumnSpan, _layoutDirection)), true, group.FrameTime); + } + + private IEnumerable> GetLargeAnimationTiles(AtlasGroupLargeTileAnimation group) => group.GetLargeTiles().Select(GetLargeTile); + + private Animation GetAnimation(AtlasGroupAnimation groupAnimation) => new Animation(GetRange(groupAnimation.Row, groupAnimation.Column, groupAnimation.Direction == ImageLayoutDirection.Horizontal ? groupAnimation.Count : 1, groupAnimation.Direction == ImageLayoutDirection.Vertical ? groupAnimation.Count : 1).Select(t => t.Texture), true, groupAnimation.FrameTime); + + private Image BuildFinalImage() => _tiles.Select(t => t.Texture).Combine(Rows, Columns, _layoutDirection); + + public IReadOnlyCollection GetTiles() => _tiles; + + public void SetGroupTilesFromAnimation(AtlasGroup group, Animation animation) + { + SetRange(group.Row, group.Column, group.Count, group.Direction, animation.GetFrames().Select(f => f.Texture)); + } + + private IEnumerable GetLargeTile(AtlasGroupLargeTile group) => GetRange(group.Row, group.Column, group.RowSpan, group.ColumnSpan); + + public Image GetTileTexture(AtlasTile tile) + { + if (!tile.IsPartOfGroup) + return tile; + AtlasGroup atlasGroup = tile.GetGroup(); + + if (!atlasGroup.IsLargeTile()) + return tile; + + AtlasGroupLargeTile largeTile = atlasGroup is AtlasGroupLargeTileAnimation largeTileAnimation ? largeTileAnimation.GetTile(tile.Row, tile.Column) : atlasGroup as AtlasGroupLargeTile; + return GetLargeTile(largeTile).Select(t => t.Texture).Combine(largeTile.RowSpan, largeTile.ColumnSpan, _layoutDirection); + } + + private IEnumerable InternalGetTilesFromGroup(AtlasGroup atlasGroup, out int rowSpan, out int columnSpan) + { + if (atlasGroup is AtlasGroupLargeTileAnimation largeTileAnimation) + { + rowSpan = largeTileAnimation.RowSpan; + columnSpan = largeTileAnimation.ColumnSpan; + return largeTileAnimation.GetLargeTiles().SelectMany(GetLargeTile); + } + if (atlasGroup is AtlasGroupLargeTile largeTile) + { + rowSpan = largeTile.RowSpan; + columnSpan = largeTile.ColumnSpan; + return GetLargeTile(largeTile); + } + rowSpan = 1; + columnSpan = 1; + return GetRange(atlasGroup.Row, atlasGroup.Column, atlasGroup.Count, atlasGroup.Direction); + } + + public Rectangle GetTileArea(AtlasTile tile) + { + if (!tile.IsPartOfGroup) + return tile.GetArea(TileSize); + AtlasGroup group = tile.GetGroup(); + return new Rectangle(new Point(group.Row * TileSize.Width, group.Column * TileSize.Height), group.GetSize(TileSize)); + } + + public void SetGroup(AtlasGroup group, Image texture) + { + IEnumerable images = texture.Split(TileSize, group.Direction); + if (!images.All(img => img.Size == TileSize)) + return; + Size s = group.GetSize(new Size(1, 1)); + SetRange(group.Row, group.Column, s.Width, s.Height, images); + } + } +} \ No newline at end of file diff --git a/PckStudio.Core/AtlasGroup.cs b/PckStudio.Core/AtlasGroup.cs new file mode 100644 index 00000000..3b2a53f0 --- /dev/null +++ b/PckStudio.Core/AtlasGroup.cs @@ -0,0 +1,48 @@ +/* Copyright (c) 2025-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Drawing; + +namespace PckStudio.Core +{ + public abstract class AtlasGroup + { + public string Name { get; set; } + public int Row { get; } + public int Column { get; } + + public virtual int Count => 1; + + protected abstract bool isAnimation { get; } + protected abstract bool isLargeTile { get; } + public virtual ImageLayoutDirection Direction => Column > Row ? ImageLayoutDirection.Vertical : ImageLayoutDirection.Horizontal; + + public AtlasGroup(string name, int row, int column) + { + Name = name; + Row = Math.Max(0, row); + Column = Math.Max(0, column); + } + + public bool IsAnimation() => isAnimation; + public bool IsLargeTile() => isLargeTile; + + public abstract Size GetSize(Size tileSize); + + } +} \ No newline at end of file diff --git a/PckStudio.Core/AtlasGroupAnimation.cs b/PckStudio.Core/AtlasGroupAnimation.cs new file mode 100644 index 00000000..aa3e6883 --- /dev/null +++ b/PckStudio.Core/AtlasGroupAnimation.cs @@ -0,0 +1,42 @@ +/* Copyright (c) 2025-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System.Drawing; + +namespace PckStudio.Core +{ + internal sealed class AtlasGroupAnimation : AtlasGroup + { + public int FrameTime { get; } + public override int Count { get; } + public override ImageLayoutDirection Direction { get; } + + protected override bool isAnimation => true; + + protected override bool isLargeTile => false; + + public override Size GetSize(Size tileSize) => new Size(tileSize.Width * (Direction == ImageLayoutDirection.Horizontal ? Count : 1), tileSize.Height * (Direction == ImageLayoutDirection.Vertical ? Count : 1)); + + public AtlasGroupAnimation(string name, int row, int column, int frameCount, ImageLayoutDirection direction, int frameTime = Animation.MinimumFrameTime) + : base(name, row, column) + { + Count = frameCount; + Direction = direction; + FrameTime = frameTime; + } + } +} \ No newline at end of file diff --git a/PckStudio.Core/AtlasGroupLargeTile.cs b/PckStudio.Core/AtlasGroupLargeTile.cs new file mode 100644 index 00000000..7475cf4f --- /dev/null +++ b/PckStudio.Core/AtlasGroupLargeTile.cs @@ -0,0 +1,43 @@ +/* Copyright (c) 2025-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Drawing; + +namespace PckStudio.Core +{ + internal sealed class AtlasGroupLargeTile : AtlasGroup + { + public int RowSpan { get; } + public int ColumnSpan { get; } + + public override int Count => RowSpan * ColumnSpan; + + protected override bool isAnimation => false; + + protected override bool isLargeTile => true; + + public override Size GetSize(Size tileSize) => new Size(RowSpan * tileSize.Width, ColumnSpan * tileSize.Height); + + public AtlasGroupLargeTile(string name, int row, int column, int rowSpan, int columnSpan) + : base(name, row, column) + { + RowSpan = Math.Max(1, rowSpan); + ColumnSpan = Math.Max(1, columnSpan); + } + } +} \ No newline at end of file diff --git a/PckStudio.Core/AtlasGroupLargeTileAnimation.cs b/PckStudio.Core/AtlasGroupLargeTileAnimation.cs new file mode 100644 index 00000000..4efdb43e --- /dev/null +++ b/PckStudio.Core/AtlasGroupLargeTileAnimation.cs @@ -0,0 +1,79 @@ +/* Copyright (c) 2025-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace PckStudio.Core +{ + internal sealed class AtlasGroupLargeTileAnimation : AtlasGroup + { + private AtlasGroupLargeTile[] _largeTiles; + private int _frameCount; + + public int RowSpan { get; } + public int ColumnSpan { get; } + public int FrameTime { get; } + + public override int Count => RowSpan * ColumnSpan * _frameCount; + + public override ImageLayoutDirection Direction { get; } + + protected override bool isAnimation => true; + + protected override bool isLargeTile => true; + + public override Size GetSize(Size tileSize) => new Size(RowSpan * tileSize.Width * (Direction == ImageLayoutDirection.Horizontal ? _frameCount : 1), ColumnSpan * tileSize.Height * (Direction == ImageLayoutDirection.Vertical ? _frameCount : 1)); + + public AtlasGroupLargeTileAnimation(string name, int row, int column, int rowSpan, int columnSpan, int frameCount, ImageLayoutDirection direction, int frameTime = Animation.MinimumFrameTime) + : base(name, row, column) + { + _frameCount = Math.Abs(frameCount); + RowSpan = Math.Max(1, rowSpan); + ColumnSpan = Math.Max(1, columnSpan); + Direction = direction; + FrameTime = frameTime; + _largeTiles = InternalGetLargeTiles().ToArray(); + } + + private IEnumerable InternalGetLargeTiles() + { + for (int i = 0; i < _frameCount; i++) + { + yield return new AtlasGroupLargeTile($"{Name}_{i}", Row + (Direction == ImageLayoutDirection.Horizontal ? i * RowSpan : 0), Column + (Direction == ImageLayoutDirection.Vertical ? i * ColumnSpan : 0), RowSpan, ColumnSpan); + } + yield break; + } + + internal AtlasGroupLargeTile GetTile(int row, int col) + { + if (!IsInRange(row, col)) + return default; + int i = (Direction == ImageLayoutDirection.Horizontal) ? Math.DivRem((row - Row), RowSpan, out _) : Math.DivRem((col - Column), ColumnSpan, out _); + return (i >= 0 && i < _frameCount) ? _largeTiles[i] : _largeTiles[0]; + } + + private bool IsInRange(int row, int col) + { + return Row <= row && row < (Row + (RowSpan * (Direction == ImageLayoutDirection.Horizontal ? _frameCount : 1))) && Column <= col && col < (Column + (ColumnSpan * (Direction == ImageLayoutDirection.Horizontal ? _frameCount : 1))); + } + + internal IEnumerable GetLargeTiles() => _largeTiles; + } +} \ No newline at end of file diff --git a/PckStudio.Core/AtlasTile.cs b/PckStudio.Core/AtlasTile.cs new file mode 100644 index 00000000..093978c8 --- /dev/null +++ b/PckStudio.Core/AtlasTile.cs @@ -0,0 +1,71 @@ +/* Copyright (c) 2025-present miku-666, MattNL + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Drawing; + +namespace PckStudio.Core +{ + public sealed class AtlasTile + { + public int Index { get; } + public int Row { get; } + public int Column { get; } + public object UserData; + private Image texture; + public bool IsPartOfGroup => _group != null; + + public Image Texture { get => texture; set => texture = value; } + + private AtlasGroup _group; + + public AtlasTile(Image texture, int row, int column, int index, object userData) + { + Texture = texture; + Row = row; + Column = column; + Index = index; + UserData = userData; + } + + internal void SetGroup(AtlasGroup group) + { + _group = group; + } + + public AtlasGroup GetGroup() => _group; + + public Rectangle GetArea(Size tileSize) => new Rectangle(new Point(Row * tileSize.Width, Column * tileSize.Height), tileSize); + + public static implicit operator Image(AtlasTile tile) => tile.Texture; + + public bool IsUserDataOfType() where T : class => UserData is T _; + + public T GetUserDataOfType() where T : class => UserData as T; + + public bool TryGetUserDataOfType(out T value) where T : class + { + if (UserData is T val) + { + value = val; + return true; + } + value = default; + return false; + } + } +} \ No newline at end of file diff --git a/PckStudio.Core/BoundingBox.cs b/PckStudio.Core/BoundingBox.cs new file mode 100644 index 00000000..26fc1658 --- /dev/null +++ b/PckStudio.Core/BoundingBox.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using PckStudio.Core.Extensions; + +namespace PckStudio.Core +{ + public struct BoundingBox + { + public static BoundingBox Empty = new BoundingBox(OpenTK.Vector3.Zero, OpenTK.Vector3.Zero); + + public readonly OpenTK.Vector3 Start; + public readonly OpenTK.Vector3 End; + public readonly OpenTK.Vector3 Center; + public readonly OpenTK.Vector3 Volume; + + public BoundingBox(OpenTK.Vector3 start, OpenTK.Vector3 end) + { + Start = start; + End = end; + OpenTK.Vector3 size = End - Start; + Volume = OpenTKExtensions.Abs(size); + Center = start + Volume / 2; + } + + public BoundingBox(System.Numerics.Vector3 start, System.Numerics.Vector3 end) + : this(start.ToOpenTKVector(), end.ToOpenTKVector()) + { + } + + public OpenTK.Matrix4 GetTransform() + { + return OpenTK.Matrix4.CreateScale(Volume) * OpenTK.Matrix4.CreateTranslation(Start); + } + } +} diff --git a/PckStudio.Core/DelegatedFileSaveContext.cs b/PckStudio.Core/DelegatedFileSaveContext.cs new file mode 100644 index 00000000..98f78cd6 --- /dev/null +++ b/PckStudio.Core/DelegatedFileSaveContext.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Newtonsoft.Json.Linq; +using PckStudio.Interfaces; +using PckStudio.Core; + +namespace PckStudio.Core +{ + public sealed class DelegatedFileSaveContext : ISaveContext + { + public delegate void SerializeDataToStreamDelegate(T value, Stream stream); + + public bool AutoSave { get; } + public string Filepath { get; private set; } + private SerializeDataToStreamDelegate _serializeDataDelegate; + private FileDialogFilter _dialogFilter; + + public DelegatedFileSaveContext(string filepath, bool autoSave, FileDialogFilter dialogFilter, SerializeDataToStreamDelegate serializeDataDelegate) + { + AutoSave = autoSave; + Filepath = filepath; + _serializeDataDelegate = serializeDataDelegate; + _dialogFilter = dialogFilter; + } + + public void Save(T value) + { + if (!File.Exists(Filepath)) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + saveFileDialog.Filter = _dialogFilter.ToString(); + if (saveFileDialog.ShowDialog() != DialogResult.OK) + return; + Filepath = saveFileDialog.FileName; + } + using (Stream stream = File.OpenWrite(Filepath)) + { + _serializeDataDelegate(value, stream); + } + } + } +} diff --git a/PckStudio.Core/DelegatedSaveContext.cs b/PckStudio.Core/DelegatedSaveContext.cs new file mode 100644 index 00000000..ee49b877 --- /dev/null +++ b/PckStudio.Core/DelegatedSaveContext.cs @@ -0,0 +1,19 @@ +using System; +using PckStudio.Interfaces; + +namespace PckStudio.Core +{ + public class DelegatedSaveContext : ISaveContext + { + private readonly Action _saveAction; + public bool AutoSave { get; } + + public void Save(T value) => _saveAction(value); + + public DelegatedSaveContext(bool autoSave, Action saveAction) + { + AutoSave = autoSave; + _saveAction = saveAction; + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs b/PckStudio.Core/Deserializer/AnimationDeserializer.cs similarity index 96% rename from PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs rename to PckStudio.Core/Deserializer/AnimationDeserializer.cs index 9a0bc124..3d112032 100644 --- a/PCK-Studio/Internal/Deserializer/AnimationDeserializer.cs +++ b/PckStudio.Core/Deserializer/AnimationDeserializer.cs @@ -7,12 +7,13 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json.Linq; using OMI.Formats.Pck; -using PckStudio.Extensions; +using PckStudio.Core; +using PckStudio.Core.Extensions; using PckStudio.Interfaces; -namespace PckStudio.Internal.Deserializer +namespace PckStudio.Core.Deserializer { - internal sealed class AnimationDeserializer : IPckAssetDeserializer + public sealed class AnimationDeserializer : IPckAssetDeserializer { public static readonly AnimationDeserializer DefaultDeserializer = new AnimationDeserializer(); diff --git a/PckStudio.Core/Deserializer/AtlasDeserializer.cs b/PckStudio.Core/Deserializer/AtlasDeserializer.cs new file mode 100644 index 00000000..52394d69 --- /dev/null +++ b/PckStudio.Core/Deserializer/AtlasDeserializer.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; +using PckStudio.Core.Extensions; +using PckStudio.Interfaces; + +namespace PckStudio.Core.Deserializer +{ + public sealed class AtlasDeserializer : IPckAssetDeserializer + { + private readonly ResourceLocation _resourceLocation; + + public AtlasDeserializer(ResourceLocation resourceLocation) + { + _resourceLocation = resourceLocation; + } + + public Atlas Deserialize(PckAsset asset) => Atlas.FromResourceLocation(asset.GetTexture(), _resourceLocation); + } +} diff --git a/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs b/PckStudio.Core/Deserializer/ImageDeserializer.cs similarity index 52% rename from PCK-Studio/Internal/Deserializer/ImageDeserializer.cs rename to PckStudio.Core/Deserializer/ImageDeserializer.cs index 09d27721..bc365d7c 100644 --- a/PCK-Studio/Internal/Deserializer/ImageDeserializer.cs +++ b/PckStudio.Core/Deserializer/ImageDeserializer.cs @@ -1,17 +1,12 @@ using System; -using System.Collections.Generic; -using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using OMI.Formats.Pck; using PckStudio.Interfaces; -using PckStudio.Internal.IO.TGA; +using PckStudio.Core.IO.TGA; -namespace PckStudio.Internal.Deserializer +namespace PckStudio.Core.Deserializer { internal sealed class ImageDeserializer : IPckAssetDeserializer { @@ -26,19 +21,11 @@ namespace PckStudio.Internal.Deserializer return EmptyImage; using var stream = new MemoryStream(asset.Data); - try - { - if (Path.GetExtension(asset.Filename) == ".tga") - return TGADeserializer.DeserializeFromStream(stream); - else - return Image.FromStream(stream); - } - catch (Exception ex) - { - Trace.TraceError($"Failed to read image from pck file data({asset.Filename})."); - Debug.WriteLine(ex.Message); - return EmptyImage; - } + + Image img = Path.GetExtension(asset.Filename) == ".tga" + ? TGADeserializer.DeserializeFromStream(stream) + : Image.FromStream(stream); + return img.RawFormat != ImageFormat.Jpeg || img.RawFormat != ImageFormat.Png ? new Bitmap(img) : img; } } } diff --git a/PckStudio.Core/Extensions/AnimationExtensions.cs b/PckStudio.Core/Extensions/AnimationExtensions.cs new file mode 100644 index 00000000..fc80a08c --- /dev/null +++ b/PckStudio.Core/Extensions/AnimationExtensions.cs @@ -0,0 +1,27 @@ +using System.Drawing; +using AnimatedGif; + +namespace PckStudio.Core.Extensions +{ + public static class AnimationExtensions + { + public static Image CreateAnimationImage(this Animation animation) => animation.CreateAnimationImage(Color.Black); + + public static Image CreateAnimationImage(this Animation animation, Color blendColor) + { + if (animation.FrameCount == 0) + { + return null; + } + var ms = new System.IO.MemoryStream(); + var generateor = new AnimatedGifCreator(ms, GameConstants.GameTickInMilliseconds, 0); + foreach (Animation.Frame frame in animation.GetInterpolatedFrames()) + { + Image texture = (blendColor == Color.Black || blendColor == Color.White) ? frame.Texture : frame.Texture.Blend(blendColor, BlendMode.Multiply); + generateor.AddFrame(texture, frame.Ticks * GameConstants.GameTickInMilliseconds, GifQuality.Bit8); + } + ms.Position = 0; + return Image.FromStream(ms); + } + } +} diff --git a/PCK-Studio/Extensions/BlendMode.cs b/PckStudio.Core/Extensions/BlendMode.cs similarity index 70% rename from PCK-Studio/Extensions/BlendMode.cs rename to PckStudio.Core/Extensions/BlendMode.cs index 76709d50..05f77f27 100644 --- a/PCK-Studio/Extensions/BlendMode.cs +++ b/PckStudio.Core/Extensions/BlendMode.cs @@ -1,6 +1,6 @@ -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal enum BlendMode + public enum BlendMode { Add, Subtract, diff --git a/PckStudio.Core/Extensions/BoundingBoxExtensions.cs b/PckStudio.Core/Extensions/BoundingBoxExtensions.cs new file mode 100644 index 00000000..ccb873d3 --- /dev/null +++ b/PckStudio.Core/Extensions/BoundingBoxExtensions.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Core.Extensions +{ + public static class BoundingBoxExtensions + { + public static BoundingBox GetEnclosingBoundingBox(this IEnumerable boundingBoxes) + { + return boundingBoxes.DefaultIfEmpty().Aggregate((a, b) => new BoundingBox(OpenTK.Vector3.ComponentMin(a.Start, b.Start), OpenTK.Vector3.ComponentMax(a.End, b.End))); + } + } +} diff --git a/PCK-Studio/Extensions/ColorExtensions.cs b/PckStudio.Core/Extensions/ColorExtensions.cs similarity index 66% rename from PCK-Studio/Extensions/ColorExtensions.cs rename to PckStudio.Core/Extensions/ColorExtensions.cs index b11c0d5e..4a64fa9e 100644 --- a/PCK-Studio/Extensions/ColorExtensions.cs +++ b/PckStudio.Core/Extensions/ColorExtensions.cs @@ -1,30 +1,41 @@ using System.Drawing; using System.Numerics; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class ColorExtensions + public static class ColorExtensions { /// /// Normalizes the Color between 0.0 - 1.0 /// /// - internal static Vector4 Normalize(this Color color) + public static Vector4 Normalize(this Color color) { return new Vector4(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f); } - internal static int ToBGR(this Color color) + public static Color Inversed(this Color color) + { + return Color.FromArgb(color.A, 255 - color.R, 255 - color.G, 255 - color.B); + } + + public static Color GreyScaled(this Color color) + { + int greyScaleValue = (color.R + color.G + color.B) / 3; + return Color.FromArgb(color.A, greyScaleValue, greyScaleValue, greyScaleValue); + } + + public static int ToBGR(this Color color) { return color.B << 16 | color.G << 8 | color.R; } - internal static byte BlendValues(byte source, byte overlay, BlendMode blendType) + public static byte BlendValues(byte source, byte overlay, BlendMode blendType) { return (byte)MathExtensions.Clamp(BlendValues(source / 255f, overlay / 255f, blendType) * 255, 0, 255); } - internal static float BlendValues(float source, float overlay, BlendMode blendType) + public static float BlendValues(float source, float overlay, BlendMode blendType) { source = MathExtensions.Clamp(source, 0.0f, 1.0f); overlay = MathExtensions.Clamp(overlay, 0.0f, 1.0f); @@ -43,13 +54,13 @@ namespace PckStudio.Extensions return MathExtensions.Clamp(resultValue, 0.0f, 1.0f); } - internal static byte Mix(double ratio, byte val1, byte val2) + public static byte Mix(double ratio, byte val1, byte val2) { ratio = MathExtensions.Clamp(ratio, 0.0, 1.0); return (byte)(ratio * val1 + (1.0 - ratio) * val2); } - internal static Color Mix(this Color c1, Color c2, double ratio) + public static Color Mix(this Color c1, Color c2, double ratio) { ratio = MathExtensions.Clamp(ratio, 0.0, 1.0); return Color.FromArgb(c1.A, diff --git a/PckStudio.Core/Extensions/CursorExtensions.cs b/PckStudio.Core/Extensions/CursorExtensions.cs new file mode 100644 index 00000000..dc897ac2 --- /dev/null +++ b/PckStudio.Core/Extensions/CursorExtensions.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace PckStudio.Core.Extensions +{ + public static class CursorExtensions + { + + [StructLayout(LayoutKind.Sequential)] + struct PointStruct + { + public Int32 x; + public Int32 y; + } + + [StructLayout(LayoutKind.Sequential)] + struct CursorInfoStruct + { + /// The structure size in bytes that must be set via calling Marshal.SizeOf(typeof(CursorInfoStruct)). + public Int32 cbSize; + /// The cursor state: 0 == hidden, 1 == showing, 2 == suppressed (is supposed to be when finger touch is used, but in practice finger touch results in 0, not 2) + public Int32 flags; + /// A handle to the cursor. + public IntPtr hCursor; + /// The cursor screen coordinates. + public PointStruct pt; + } + + /// Must initialize cbSize + [DllImport("user32.dll")] + static extern bool GetCursorInfo(ref CursorInfoStruct pci); + + public static bool IsVisible(this Cursor _) + { + CursorInfoStruct pci = new CursorInfoStruct(); + pci.cbSize = Marshal.SizeOf(typeof(CursorInfoStruct)); + GetCursorInfo(ref pci); + // const Int32 hidden = 0x00; + const Int32 showing = 0x01; + // const Int32 suppressed = 0x02; + bool isVisible = ((pci.flags & showing) != 0); + return isVisible; + } + + } +} diff --git a/PCK-Studio/Extensions/EnumerableExtensions.cs b/PckStudio.Core/Extensions/EnumerableExtensions.cs similarity index 91% rename from PCK-Studio/Extensions/EnumerableExtensions.cs rename to PckStudio.Core/Extensions/EnumerableExtensions.cs index 9ad08c8f..266c5317 100644 --- a/PCK-Studio/Extensions/EnumerableExtensions.cs +++ b/PckStudio.Core/Extensions/EnumerableExtensions.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.Linq; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class EnumerableExtensions + public static class EnumerableExtensions { public static IEnumerable<(int index, T value)>enumerate(this IEnumerable array) { diff --git a/PCK-Studio/Extensions/GraphicsExtensions.cs b/PckStudio.Core/Extensions/GraphicsExtensions.cs similarity index 86% rename from PCK-Studio/Extensions/GraphicsExtensions.cs rename to PckStudio.Core/Extensions/GraphicsExtensions.cs index 2cc33088..48dd3fea 100644 --- a/PCK-Studio/Extensions/GraphicsExtensions.cs +++ b/PckStudio.Core/Extensions/GraphicsExtensions.cs @@ -1,9 +1,9 @@ using System.Drawing; using System.Drawing.Drawing2D; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal struct GraphicsConfig + public struct GraphicsConfig { public GraphicsConfig() { @@ -21,7 +21,7 @@ namespace PckStudio.Extensions public PixelOffsetMode PixelOffsetMode { get; set; } } - internal static class GraphicsExtensions + public static class GraphicsExtensions { public static void ApplyConfig(this Graphics graphics, GraphicsConfig config) { @@ -32,7 +32,7 @@ namespace PckStudio.Extensions graphics.PixelOffsetMode = config.PixelOffsetMode; } - internal static Graphics Fill(this Graphics graphics, Rectangle area, Color color) + public static Graphics Fill(this Graphics graphics, Rectangle area, Color color) { Region clip = graphics.Clip; graphics.SetClip(area, CombineMode.Replace); diff --git a/PCK-Studio/Extensions/ImageExtensions.cs b/PckStudio.Core/Extensions/ImageExtensions.cs similarity index 77% rename from PCK-Studio/Extensions/ImageExtensions.cs rename to PckStudio.Core/Extensions/ImageExtensions.cs index dd9ca899..a958c1e0 100644 --- a/PCK-Studio/Extensions/ImageExtensions.cs +++ b/PckStudio.Core/Extensions/ImageExtensions.cs @@ -16,22 +16,29 @@ * 3. This notice may not be removed or altered from any source distribution. **/ using System; -using System.Drawing; -using System.Diagnostics; -using System.Drawing.Imaging; -using System.Drawing.Drawing2D; using System.Collections.Generic; -using System.Runtime.InteropServices; +using System.Data.Common; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; using System.Linq; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading.Tasks; -using PckStudio.Internal.App; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class ImageExtensions + public static class ImageExtensions { - internal static Image GetArea(this Image source, Rectangle area) + public static Image ReleaseFromFile(this Image image) + { + Image img = new Bitmap(image); + image.Dispose(); + return img; + } + + public static Image GetArea(this Image source, Rectangle area) { Image tileImage = new Bitmap(area.Width, area.Height); using (Graphics gfx = Graphics.FromImage(tileImage)) @@ -50,33 +57,34 @@ namespace PckStudio.Extensions /// this image /// Indecates width and height of image sub section /// of type - internal static IEnumerable SplitHorizontal(this Image source, int scalar) + public static IEnumerable SplitHorizontal(this Image source, int scalar) { return source.Split(scalar, ImageLayoutDirection.Horizontal); } - internal static IEnumerable Split(this Image source, int scalar, ImageLayoutDirection layoutDirection) + public static IEnumerable Split(this Image source, int scalar, ImageLayoutDirection layoutDirection) { return Split(source, new Size(scalar, scalar), layoutDirection); } - internal static IEnumerable Split(this Image source, Size size, ImageLayoutDirection imageLayout) + public static IEnumerable Split(this Image source, Size size, ImageLayoutDirection imageLayout) { int rowCount = source.Width / size.Width; int columnCount = source.Height / size.Height; Debug.WriteLine($"Image size: {source.Size}, Area size: {size}, col num: {columnCount}, row num: {rowCount}"); + bool vertical = imageLayout == ImageLayoutDirection.Vertical; for (int i = 0; i < columnCount * rowCount; i++) { - int row = Math.DivRem(i, rowCount, out int column); - if (imageLayout == ImageLayoutDirection.Vertical) - column = Math.DivRem(i, columnCount, out row); - Rectangle tileArea = new Rectangle(new Point(column * size.Width, row * size.Height), size); + int column = Math.DivRem(i, rowCount, out int row); + if (vertical) + row = Math.DivRem(i, columnCount, out column); + Rectangle tileArea = new Rectangle(new Point(row * size.Width, column * size.Height), size); yield return source.GetArea(tileArea); } yield break; } - internal static IEnumerable Split(this Image source, ImageLayoutDirection layoutDirection) + public static IEnumerable Split(this Image source, ImageLayoutDirection layoutDirection) { for (int i = 0; i < source.Height / source.Width; i++) { @@ -86,49 +94,59 @@ namespace PckStudio.Extensions yield break; } - internal static Image Combine(this IEnumerable sources, ImageLayoutDirection layoutDirection) + public static Image Combine(this IEnumerable sources, ImageLayoutDirection layoutDirection) { - Size imageSize = CalculateImageSize(sources, layoutDirection); + bool horizontal = layoutDirection == ImageLayoutDirection.Horizontal; + int imgCount = sources.Count(); + int rows = horizontal ? imgCount : 1; + int columns = horizontal ? 1 : imgCount; + return sources.Combine(rows, columns, layoutDirection); + } + + public static Image Combine(this IEnumerable sources, int rows, int columns, ImageLayoutDirection layoutDirection) + { + Size imageSize = CalculateImageSize(sources, rows, columns); var image = new Bitmap(imageSize.Width, imageSize.Height); + bool horizontal = layoutDirection == ImageLayoutDirection.Horizontal; using (var graphic = Graphics.FromImage(image)) { foreach ((int i, Image texture) in sources.enumerate()) { - var info = new ImageSection(texture.Size, i, layoutDirection); - graphic.DrawImage(texture, info.Point); + int x = Math.DivRem(i, columns, out int y); + if (horizontal) + y = Math.DivRem(i, rows, out x); + graphic.DrawImage(texture, new Point(x * texture.Width, y * texture.Height)); } } return image; } - private static Size CalculateImageSize(IEnumerable sources, ImageLayoutDirection layoutDirection) + private static Size CalculateImageSize(IEnumerable sources, int rows, int columns) { - Size size = sources.First().Size; - int count = sources.Count(); + if (sources == null) + return Size.Empty; + Image[] imgs = sources.ToArray(); - if (count < 2) - return count < 1 ? Size.Empty : size; + if (imgs.Length < rows * columns) + throw new ArgumentOutOfRangeException("Insufficent soure images provided."); - var horizontal = layoutDirection == ImageLayoutDirection.Horizontal; + Size size = imgs[0].Size; - if (!sources.All(img => img.Size == size)) + if (!imgs.All(img => img.Size == size)) throw new InvalidOperationException("Images must have the same width and height."); - if (horizontal) - size.Width *= count; - else - size.Height *= count; - + size.Width *= rows; + size.Height *= columns; return size; } - internal static Image Resize(this Image image, Size size, GraphicsConfig graphicsConfig) + public static Image Resize(this Image image, Size size, GraphicsConfig graphicsConfig) { return image.Resize(size.Width, size.Height, graphicsConfig); } - internal static Image Resize(this Image image, int width, int height, GraphicsConfig graphicsConfig) + public static Image Resize(this Image image, int width, int height, GraphicsConfig graphicsConfig) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); @@ -147,7 +165,7 @@ namespace PckStudio.Extensions return destImage; } - internal static Image Blend(this Image image, Color overlayColor, BlendMode mode) + public static Image Blend(this Image image, Color overlayColor, BlendMode mode) { if (image is not Bitmap baseImage) return image; @@ -159,7 +177,6 @@ namespace PckStudio.Extensions BitmapData resultImageData = bitmapResult.LockBits(new Rectangle(Point.Empty, bitmapResult.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - Profiler.Start(); Parallel.For(0, baseImageData.Stride * baseImageData.Height / 4, (i) => { int k = i * 4; @@ -179,14 +196,13 @@ namespace PckStudio.Extensions Unsafe.Write((resultImageData.Scan0 + k).ToPointer(), blendedValue); } }); - Profiler.Stop(); bitmapResult.UnlockBits(resultImageData); baseImage.UnlockBits(baseImageData); return bitmapResult; } - internal static Image Blend(this Image image, Image overlay, BlendMode mode) + public static Image Blend(this Image image, Image overlay, BlendMode mode) { if (image is not Bitmap baseImage || overlay is not Bitmap overlayImage || image.Width != overlay.Width || image.Height != overlay.Height) @@ -223,7 +239,7 @@ namespace PckStudio.Extensions return bitmapResult; } - internal static Image Interpolate(this Image image1, Image image2, double delta) + public static Image Interpolate(this Image image1, Image image2, double delta) { delta = MathExtensions.Clamp(delta, 0.0, 1.0); if (image1 is not Bitmap baseImage || image2 is not Bitmap overlayImage || diff --git a/PckStudio.Core/Extensions/ImageLayoutDirection.cs b/PckStudio.Core/Extensions/ImageLayoutDirection.cs new file mode 100644 index 00000000..92ccdc8b --- /dev/null +++ b/PckStudio.Core/Extensions/ImageLayoutDirection.cs @@ -0,0 +1,8 @@ +namespace PckStudio.Core +{ + public enum ImageLayoutDirection + { + Horizontal, + Vertical + } +} diff --git a/PCK-Studio/Extensions/ImageSection.cs b/PckStudio.Core/Extensions/ImageSection.cs similarity index 96% rename from PCK-Studio/Extensions/ImageSection.cs rename to PckStudio.Core/Extensions/ImageSection.cs index 8e7b36ec..588e9417 100644 --- a/PCK-Studio/Extensions/ImageSection.cs +++ b/PckStudio.Core/Extensions/ImageSection.cs @@ -1,6 +1,6 @@ using System.Drawing; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { internal struct ImageSection { diff --git a/PCK-Studio/Extensions/ListExtensions.cs b/PckStudio.Core/Extensions/ListExtensions.cs similarity index 85% rename from PCK-Studio/Extensions/ListExtensions.cs rename to PckStudio.Core/Extensions/ListExtensions.cs index 182239fa..6c4481b7 100644 --- a/PCK-Studio/Extensions/ListExtensions.cs +++ b/PckStudio.Core/Extensions/ListExtensions.cs @@ -1,8 +1,8 @@ using System.Collections.Generic; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class ListExtensions + public static class ListExtensions { public static IList Swap(this IList list, int index1, int index2) { diff --git a/PCK-Studio/Extensions/LocFileExtensions.cs b/PckStudio.Core/Extensions/LocFileExtensions.cs similarity index 87% rename from PCK-Studio/Extensions/LocFileExtensions.cs rename to PckStudio.Core/Extensions/LocFileExtensions.cs index 7ce2ecde..709a827c 100644 --- a/PCK-Studio/Extensions/LocFileExtensions.cs +++ b/PckStudio.Core/Extensions/LocFileExtensions.cs @@ -1,8 +1,8 @@ using OMI.Formats.Languages; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class LocFileExtensions + public static class LocFileExtensions { public static void InitializeDefault(this LOCFile locFile, string packName) => locFile.Initialize("en-EN", ("IDS_DISPLAY_NAME", packName)); diff --git a/PCK-Studio/Extensions/MaterialContainerExtensions.cs b/PckStudio.Core/Extensions/MaterialContainerExtensions.cs similarity index 96% rename from PCK-Studio/Extensions/MaterialContainerExtensions.cs rename to PckStudio.Core/Extensions/MaterialContainerExtensions.cs index a4a83581..32df0727 100644 --- a/PCK-Studio/Extensions/MaterialContainerExtensions.cs +++ b/PckStudio.Core/Extensions/MaterialContainerExtensions.cs @@ -1,8 +1,8 @@ using OMI.Formats.Material; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class MaterialContainerExtensions + public static class MaterialContainerExtensions { private static readonly MaterialContainer.Material[] defaultMaterials = [ new MaterialContainer.Material("bat", "entity_alphatest"), diff --git a/PCK-Studio/Extensions/MaterialExtensions.cs b/PckStudio.Core/Extensions/MaterialExtensions.cs similarity index 83% rename from PCK-Studio/Extensions/MaterialExtensions.cs rename to PckStudio.Core/Extensions/MaterialExtensions.cs index 38d2a45d..fe82480d 100644 --- a/PCK-Studio/Extensions/MaterialExtensions.cs +++ b/PckStudio.Core/Extensions/MaterialExtensions.cs @@ -5,9 +5,9 @@ using System.Text; using System.Threading.Tasks; using OMI.Formats.Material; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class MaterialExtensions + public static class MaterialExtensions { public static bool HasInvalidEntries(this MaterialContainer materials) { diff --git a/PCK-Studio/Extensions/MathExtensions.cs b/PckStudio.Core/Extensions/MathExtensions.cs similarity index 59% rename from PCK-Studio/Extensions/MathExtensions.cs rename to PckStudio.Core/Extensions/MathExtensions.cs index 5a162631..38fb5b2b 100644 --- a/PCK-Studio/Extensions/MathExtensions.cs +++ b/PckStudio.Core/Extensions/MathExtensions.cs @@ -1,10 +1,10 @@ using System; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal class MathExtensions + public class MathExtensions { - internal static T Clamp(T value, T min, T max) where T : IComparable + public static T Clamp(T value, T min, T max) where T : IComparable { if (value.CompareTo(min) < 0) return min; diff --git a/PckStudio.Core/Extensions/ModelBoxExtension.cs b/PckStudio.Core/Extensions/ModelBoxExtension.cs new file mode 100644 index 00000000..a380879e --- /dev/null +++ b/PckStudio.Core/Extensions/ModelBoxExtension.cs @@ -0,0 +1,20 @@ +using System; +using OMI.Formats.Model; +using System.Numerics; + +namespace PckStudio.Core.Extensions +{ + public static class ModelBoxExtension + { + public static BoundingBox GetBoundingBox(this ModelBox modelBox) + { + Vector3 halfSize = modelBox.Size / 2f; + Vector3 halfSizeInflated = new Vector3(modelBox.Inflate) + halfSize; + Vector3 transformedCenter = modelBox.Position + halfSize; + Vector3 start = transformedCenter - halfSizeInflated; + Vector3 end = transformedCenter + halfSizeInflated; + return new BoundingBox(start, end); + } + + } +} diff --git a/PckStudio.Core/Extensions/OpenTKExtensions.cs b/PckStudio.Core/Extensions/OpenTKExtensions.cs new file mode 100644 index 00000000..69fb7243 --- /dev/null +++ b/PckStudio.Core/Extensions/OpenTKExtensions.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK; + +namespace PckStudio.Core.Extensions +{ + public static class OpenTKExtensions + { + public static Matrix4 Pivoted(this Matrix4 rotation, Vector3 pivot) + { + var model = Matrix4.CreateTranslation(pivot); + model *= rotation; + model *= Matrix4.CreateTranslation(pivot).Inverted(); + return model; + } + + public static Vector3 Abs(Vector3 value) + { + return new Vector3(Math.Abs(value.X), Math.Abs(value.Y), Math.Abs(value.Z)); + } + } +} diff --git a/PckStudio.Core/Extensions/PckAssetExtensions.cs b/PckStudio.Core/Extensions/PckAssetExtensions.cs new file mode 100644 index 00000000..bbf72698 --- /dev/null +++ b/PckStudio.Core/Extensions/PckAssetExtensions.cs @@ -0,0 +1,226 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Drawing; +using System.Diagnostics; +using System.Collections.Generic; + +using OMI.Formats.Languages; +using OMI.Formats.Pck; +using OMI.Workers; + +using PckStudio.Interfaces; +using PckStudio.Core.Deserializer; +using PckStudio.Core.Serializer; +using PckStudio.Core.Skin; + +namespace PckStudio.Core.Extensions +{ + public static class PckAssetExtensions + { + private const string MipMap = "MipMapLevel"; + + public static PckAsset CreateNewAssetIf(this PckFile pck, bool condition, string filename, PckAssetType filetype, IDataFormatWriter writer) + { + if (condition) + { + return pck.CreateNewAsset(filename, filetype, writer); + } + return default; + } + + public static PckAsset CreateNewAsset(this PckFile pck, string filename, PckAssetType filetype, IDataFormatWriter writer) + { + PckAsset asset = pck.CreateNewAsset(filename, filetype); + asset.SetData(writer); + return asset; + } + + public static Image GetTexture(this PckAsset asset) + { + if (asset.Type != PckAssetType.SkinFile && + asset.Type != PckAssetType.CapeFile && + asset.Type != PckAssetType.TextureFile) + { + throw new Exception("Asset is not suitable to contain image data."); + } + return asset.GetDeserializedData(ImageDeserializer.DefaultDeserializer); + } + + /// + /// Tries to get the skin id of the skin + /// + /// + /// Non-zero base number on success, otherwise 0 + /// + public static int GetSkinId(this PckAsset asset) + { + if (asset.Type != PckAssetType.SkinFile) + throw new InvalidOperationException("Asset is not a skin."); + + const string skinAssetnamePrefix = "dlcskin"; + + string assetPath = Path.GetFileNameWithoutExtension(asset.Filename); + if (!assetPath.StartsWith(skinAssetnamePrefix)) + { + Trace.TraceWarning($"[{nameof(GetSkinId)}] Asset name does not start with '{skinAssetnamePrefix}'"); + return 0; + } + + int skinId = 0; + if (!int.TryParse(assetPath.Substring(skinAssetnamePrefix.Length), out skinId)) + { + Trace.TraceWarning($"[{nameof(GetSkinId)}] Failed to parse Skin Id"); + } + return skinId; + } + + public static Skin.Skin GetSkin(this PckAsset asset) + { + if (asset.Type != PckAssetType.SkinFile) + throw new InvalidOperationException("Asset is not a skin."); + + int skinId = asset.GetSkinId(); + + string name = asset.GetProperty("DISPLAYNAME"); + Image texture = asset.GetTexture(); + SkinANIM anim = asset.GetProperty("ANIM", SkinANIM.FromString); + IEnumerable boxes = asset.GetMultipleProperties("BOX").Select(kv => SkinBOX.FromString(kv.Value)); + IEnumerable offsets = asset.GetMultipleProperties("OFFSET").Select(kv => SkinPartOffset.FromString(kv.Value)); + return new Skin.Skin(name, skinId, texture, anim, boxes, offsets); + } + + public static void SetSkin(this PckAsset asset, Skin.Skin skin, LOCFile localizationFile) + { + if (asset.Type != PckAssetType.SkinFile) + throw new InvalidOperationException("Asset is not a skin file"); + + asset.SetTexture(skin.Texture); + + string skinId = skin.Identifier.ToString("d08"); + + // TODO: keep filepath + asset.Filename = $"dlcskin{skinId}.png"; + + asset.SetProperty("DISPLAYNAME", skin.MetaData.Name); + + if (localizationFile is not null) + { + string skinLocKey = $"IDS_dlcskin{skinId}_DISPLAYNAME"; + asset.SetProperty("DISPLAYNAMEID", skinLocKey); + localizationFile.SetLocEntry(skinLocKey, skin.MetaData.Name); + } + + if (!string.IsNullOrEmpty(skin.MetaData.Theme)) + { + asset.SetProperty("THEMENAME", skin.MetaData.Theme); + + if (localizationFile is not null) + { + string skinThemeLocKey = $"IDS_dlcskin{skinId}_THEMENAME"; + asset.SetProperty("THEMENAMEID", skinThemeLocKey); + localizationFile.SetLocEntry(skinThemeLocKey, skin.MetaData.Theme); + } + } + + if (skin.HasCape) + { + asset.SetProperty("CAPEPATH", $"dlccape{skinId}.png"); + } + + asset.SetProperty("ANIM", skin.Anim.ToString()); + asset.SetProperty("GAME_FLAGS", "0x18"); + asset.SetProperty("FREE", "1"); + + asset.RemoveProperties("BOX"); + asset.RemoveProperties("OFFSET"); + + foreach (SkinBOX box in skin.Model.AdditionalBoxes) + { + asset.AddProperty(box.ToProperty()); + } + foreach (SkinPartOffset offset in skin.Model.PartOffsets) + { + asset.AddProperty(offset.ToProperty()); + } + } + + public static T GetDeserializedData(this PckAsset asset, IPckAssetDeserializer deserializer) + { + return deserializer.Deserialize(asset); + } + + public static T GetData(this PckAsset asset, IDataFormatReader formatReader) where T : class + { + using var ms = new MemoryStream(asset.Data); + return formatReader.FromStream(ms); + } + + public static void SetSerializedData(this PckAsset asset, T obj, IPckAssetSerializer serializer) + { + serializer.Serialize(obj, ref asset); + } + + public static void SetData(this PckAsset asset, IDataFormatWriter formatWriter) + { + using (var stream = new MemoryStream()) + { + formatWriter.WriteToStream(stream); + asset.SetData(stream.ToArray()); + } + } + + public static void SetTexture(this PckAsset asset, Image image) + { + if (asset.Type != PckAssetType.SkinFile && + asset.Type != PckAssetType.CapeFile && + asset.Type != PckAssetType.TextureFile) + { + throw new Exception("Asset is not suitable to contain image data."); + } + asset.SetSerializedData(image, ImageSerializer.DefaultSerializer); + } + + public static bool IsMipmappedFile(this PckAsset asset) + { + // We only want to test the file name itself. ex: "terrainMipMapLevel2" + string name = Path.GetFileNameWithoutExtension(asset.Filename); + + // check if last character is a digit (0-9). If not return false + if (!char.IsDigit(name[name.Length - 1])) + return false; + + // If string does not end with MipMapLevel, then it's not MipMapped + if (!name.Remove(name.Length - 1, 1).EndsWith(MipMap)) + return false; + return true; + } + + public static string GetNormalPath(this PckAsset asset) + { + if (!asset.IsMipmappedFile()) + return asset.Filename; + string ext = Path.GetExtension(asset.Filename); + return asset.Filename.Remove(asset.Filename.Length - (MipMap.Length + 1) - ext.Length) + ext; + } + + public static void DeserializeProperties(this PckAsset asset, IEnumerable serializedData) + { + IEnumerable> lines = serializedData + .Select(line => line.Split([' '], 2)) + .Where (keyValue => keyValue.Length == 2) + .Select(keyValue => new KeyValuePair(keyValue[0].Replace(":", ""), keyValue[1])); + foreach (KeyValuePair kv in lines) + { + asset.AddProperty(kv); + } + } + + public static IEnumerable SerializeProperties(this PckAsset asset, string seperater = ":") + { + IReadOnlyList> properties = asset.GetProperties(); + return properties.Select(property => property.Key + seperater + property.Value); + } + } +} diff --git a/PCK-Studio/Extensions/PictureBoxExtensions.cs b/PckStudio.Core/Extensions/PictureBoxExtensions.cs similarity index 89% rename from PCK-Studio/Extensions/PictureBoxExtensions.cs rename to PckStudio.Core/Extensions/PictureBoxExtensions.cs index 75ee7c6c..b3a51d46 100644 --- a/PCK-Studio/Extensions/PictureBoxExtensions.cs +++ b/PckStudio.Core/Extensions/PictureBoxExtensions.cs @@ -2,9 +2,9 @@ using System.Reflection; using System.Windows.Forms; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class PictureBoxExtensions + public static class PictureBoxExtensions { public static bool IsAnimating(this PictureBox pictureBox) { diff --git a/PckStudio.Core/Extensions/SkinBOXExtensions.cs b/PckStudio.Core/Extensions/SkinBOXExtensions.cs new file mode 100644 index 00000000..2c95b2ba --- /dev/null +++ b/PckStudio.Core/Extensions/SkinBOXExtensions.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Core.Skin; + +namespace PckStudio.Core.Extensions +{ + public static class SkinBOXExtensions + { + public static GraphicsPath GetUVGraphicsPath(this SkinBOX skinBOX, Vector2 tillingFactor) + { + var types = new byte[9]; + var points = new PointF[9]; + + var path = new GraphicsPath(FillMode.Winding); + + Vector2 uv = skinBOX.UV; + Vector3 size = skinBOX.Size; + + path.AddRectangle(new RectangleF(new PointF((uv.X ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.Z * tillingFactor.X, size.Y * tillingFactor.Y))); + path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Y * tillingFactor.Y))); + path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z + size.X ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.Z * tillingFactor.X, size.Y * tillingFactor.Y))); + path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z * 2 + size.X) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Y * tillingFactor.Y))); + + path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z ) * tillingFactor.X, (uv.Y ) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Z * tillingFactor.Y))); + path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z + size.X ) * tillingFactor.X, (uv.Y ) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Z * tillingFactor.Y))); + + return path; + } + + public static GraphicsPath GetUVGraphicsPath(this SkinBOX skinBox) + { + return skinBox.GetUVGraphicsPath(Vector2.One); + } + + public static string GetOverlayType(this SkinBOX skinBox) + { + if (!skinBox.IsValidType()) + return ""; + if (skinBox.IsOverlayPart()) + return skinBox.Type; + int index = Array.IndexOf(SkinBOX.BaseTypes, skinBox.Type); + return SkinBOX.OverlayTypes.IndexInRange(index) ? SkinBOX.OverlayTypes[index] : ""; + } + + public static string GetOverlayType(string type) + { + if (!SkinBOX.IsValidType(type)) + return ""; + if (SkinBOX.IsOverlayPart(type)) + return type; + int index = Array.IndexOf(SkinBOX.BaseTypes, type); + return SkinBOX.OverlayTypes.IndexInRange(index) ? SkinBOX.OverlayTypes[index] : ""; + } + + public static string GetBaseType(this SkinBOX skinBox) + { + if (!skinBox.IsValidType()) + return ""; + if (skinBox.IsBasePart()) + return skinBox.Type; + int index = Array.IndexOf(SkinBOX.OverlayTypes, skinBox.Type); + return SkinBOX.BaseTypes.IndexInRange(index) ? SkinBOX.BaseTypes[index] : ""; + } + + public static string GetBaseType(string type) + { + if (!SkinBOX.IsValidType(type)) + return ""; + if (SkinBOX.IsBasePart(type)) + return type; + int index = Array.IndexOf(SkinBOX.OverlayTypes, type); + return SkinBOX.BaseTypes.IndexInRange(index) ? SkinBOX.BaseTypes[index] : ""; + } + } +} diff --git a/PckStudio.Core/Extensions/SkinExtensions.cs b/PckStudio.Core/Extensions/SkinExtensions.cs new file mode 100644 index 00000000..d1518fd4 --- /dev/null +++ b/PckStudio.Core/Extensions/SkinExtensions.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Languages; +using OMI.Formats.Pck; +using PckStudio.Core.Skin; + +namespace PckStudio.Core.Extensions +{ + public static class SkinExtensions + { + public static PckAsset CreateFile(this Skin.Skin skin, LOCFile localizationFile) + { + string skinId = skin.Identifier.ToString("d08"); + PckAsset skinFile = new PckAsset($"dlcskin{skinId}.png", PckAssetType.SkinFile); + + skinFile.AddProperty("DISPLAYNAME", skin.MetaData.Name); + if (localizationFile is not null) + { + string skinLocKey = $"IDS_dlcskin{skinId}_DISPLAYNAME"; + skinFile.AddProperty("DISPLAYNAMEID", skinLocKey); + localizationFile.AddLocKey(skinLocKey, skin.MetaData.Name); + } + + if (!string.IsNullOrEmpty(skin.MetaData.Theme)) + { + skinFile.AddProperty("THEMENAME", skin.MetaData.Theme); + if (localizationFile is not null) + { + skinFile.AddProperty("THEMENAMEID", $"IDS_dlcskin{skinId}_THEMENAME"); + localizationFile.AddLocKey($"IDS_dlcskin{skinId}_THEMENAME", skin.MetaData.Theme); + } + } + + if (skin.HasCape) + { + skinFile.AddProperty("CAPEPATH", $"dlccape{skinId}.png"); + } + + skinFile.AddProperty("ANIM", skin.Anim); + skinFile.AddProperty("GAME_FLAGS", "0x18"); + skinFile.AddProperty("FREE", "1"); + + foreach (SkinBOX box in skin.Model.AdditionalBoxes) + { + skinFile.AddProperty(box.ToProperty()); + } + foreach (SkinPartOffset offset in skin.Model.PartOffsets) + { + skinFile.AddProperty(offset.ToProperty()); + } + + skinFile.SetTexture(skin.Texture); + + return skinFile; + } + + public static PckAsset CreateCapeFile(this Skin.Skin skin) + { + if (!skin.HasCape) + throw new InvalidOperationException("Skin does not contain a cape."); + string skinId = skin.Identifier.ToString("d08"); + PckAsset capeFile = new PckAsset($"dlccape{skinId}.png", PckAssetType.CapeFile); + capeFile.SetTexture(skin.CapeTexture); + return capeFile; + } + } +} diff --git a/PckStudio.Core/Extensions/System.Numerics.cs b/PckStudio.Core/Extensions/System.Numerics.cs new file mode 100644 index 00000000..52ecb717 --- /dev/null +++ b/PckStudio.Core/Extensions/System.Numerics.cs @@ -0,0 +1,29 @@ +namespace PckStudio.Core.Extensions +{ + public static class NumericsExtensions + { + //internal static Cube ToCube(this SkinBOX skinBOX) => skinBOX.ToCube(0f); + + //internal static Cube ToCube(this SkinBOX skinBOX, float inflate, bool flipZMapping = false) + // => new Cube(skinBOX.Pos.ToOpenTKVector(), skinBOX.Size.ToOpenTKVector(), skinBOX.UV.ToOpenTKVector(), skinBOX.Scale + inflate, skinBOX.Mirror, flipZMapping); + public static OpenTK.Vector3 ToOpenTKVector(this System.Numerics.Vector3 vector3) + { + return new OpenTK.Vector3(vector3.X, vector3.Y, vector3.Z); + } + + public static OpenTK.Vector2 ToOpenTKVector(this System.Numerics.Vector2 vector2) + { + return new OpenTK.Vector2(vector2.X, vector2.Y); + } + + public static System.Numerics.Vector3 ToNumericsVector(this OpenTK.Vector3 vector3) + { + return new System.Numerics.Vector3(vector3.X, vector3.Y, vector3.Z); + } + + public static System.Numerics.Vector2 ToNumericsVector(this OpenTK.Vector2 vector2) + { + return new System.Numerics.Vector2(vector2.X, vector2.Y); + } + } +} diff --git a/PCK-Studio/Extensions/TreeNodeExtensions.cs b/PckStudio.Core/Extensions/TreeNodeExtensions.cs similarity index 70% rename from PCK-Studio/Extensions/TreeNodeExtensions.cs rename to PckStudio.Core/Extensions/TreeNodeExtensions.cs index 90cad0be..b29ee031 100644 --- a/PCK-Studio/Extensions/TreeNodeExtensions.cs +++ b/PckStudio.Core/Extensions/TreeNodeExtensions.cs @@ -1,16 +1,16 @@ using System.Collections.Generic; using System.Windows.Forms; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class TreeNodeExtensions + public static class TreeNodeExtensions { - internal static bool IsTagOfType(this TreeNode node) where T : class + public static bool IsTagOfType(this TreeNode node) where T : class { return node?.Tag is T; } - internal static bool TryGetTagData(this TreeNode node, out TOut tagData) where TOut : class + public static bool TryGetTagData(this TreeNode node, out TOut tagData) where TOut : class { if (node?.Tag is TOut data) { @@ -21,7 +21,7 @@ namespace PckStudio.Extensions return false; } - internal static bool Contains(this TreeNode thisNode, TreeNode childNode) + public static bool Contains(this TreeNode thisNode, TreeNode childNode) { if (childNode.Parent == null) return false; @@ -32,7 +32,7 @@ namespace PckStudio.Extensions return thisNode.Contains(childNode.Parent); } - internal static List GetChildNodes(this TreeNode thisNode) + public static List GetChildNodes(this TreeNode thisNode) { List nodes = new List(thisNode.Nodes.Count); foreach (TreeNode node in thisNode.Nodes) diff --git a/PCK-Studio/Extensions/TreeViewExtensions.cs b/PckStudio.Core/Extensions/TreeViewExtensions.cs similarity index 90% rename from PCK-Studio/Extensions/TreeViewExtensions.cs rename to PckStudio.Core/Extensions/TreeViewExtensions.cs index 79f36ddb..ec17789e 100644 --- a/PCK-Studio/Extensions/TreeViewExtensions.cs +++ b/PckStudio.Core/Extensions/TreeViewExtensions.cs @@ -2,9 +2,9 @@ using System.Linq; using System.Windows.Forms; -namespace PckStudio.Extensions +namespace PckStudio.Core.Extensions { - internal static class TreeViewExtensions + public static class TreeViewExtensions { public static TreeNode[] FindPath(this TreeView treeView, string path) { diff --git a/PckStudio.Core/FileDialogFilter.cs b/PckStudio.Core/FileDialogFilter.cs new file mode 100644 index 00000000..e35c00df --- /dev/null +++ b/PckStudio.Core/FileDialogFilter.cs @@ -0,0 +1,23 @@ +using System.IO; + +namespace PckStudio.Core +{ + public readonly struct FileDialogFilter + { + public readonly string Description; + public readonly string Pattern; + + public string Extension => Path.GetExtension(Pattern); + + public FileDialogFilter(string description, string pattern) + { + Description = description; + Pattern = pattern; + } + + public override string ToString() + { + return $"{Description}|{Pattern}"; + } + } +} \ No newline at end of file diff --git a/PCK-Studio/FileFormats/PckAudioFile.cs b/PckStudio.Core/FileFormats/PckAudioFile.cs similarity index 98% rename from PCK-Studio/FileFormats/PckAudioFile.cs rename to PckStudio.Core/FileFormats/PckAudioFile.cs index 40e77bfd..848d69b6 100644 --- a/PCK-Studio/FileFormats/PckAudioFile.cs +++ b/PckStudio.Core/FileFormats/PckAudioFile.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using OMI.Formats.Languages; -namespace PckStudio.FileFormats +namespace PckStudio.Core.FileFormats { public class PckAudioFile { diff --git a/PckStudio.Core/GameConstants.cs b/PckStudio.Core/GameConstants.cs new file mode 100644 index 00000000..a8b4b05e --- /dev/null +++ b/PckStudio.Core/GameConstants.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Core.Extensions; +using PckStudio.Core.Skin; + +namespace PckStudio.Core +{ + public static class GameConstants + { + // 16777215 being the uint24 max value + public const int MAX_PACK_ID = 0xffffff; + + public static readonly Vector3 SkinHeadTranslation = Vector3.Zero; + public static readonly Vector3 SkinHeadPivot = Vector3.Zero; + + public static readonly Vector3 SkinBodyTranslation = Vector3.Zero; + public static readonly Vector3 SkinBodyPivot = Vector3.Zero; + + public static readonly Vector3 SkinRightArmTranslation = new(-5f, 2f, 0f); + public static readonly Vector3 SkinRightArmPivot = new(-6f, 2f, 0f); + + public static readonly Vector3 SkinLeftArmTranslation = new(5f, 2f, 0f); + public static readonly Vector3 SkinLeftArmPivot = new(6f, 2f, 0f); + + public static readonly Vector3 SkinRightLegTranslation = new(-2f, 12f, 0f); + public static readonly Vector3 SkinRightLegPivot = new(-2f, 12f, 0f); + + public static readonly Vector3 SkinLeftLegTranslation = new(2f, 12f, 0f); + public static readonly Vector3 SkinLeftLegPivot = new(2f, 12f, 0f); + + private static Dictionary _posisioningInfos = new Dictionary() + { + ["HEAD"] = new PositioningInfo(SkinHeadTranslation, SkinHeadPivot), + ["BODY"] = new PositioningInfo(SkinBodyTranslation, SkinBodyPivot), + ["ARM0"] = new PositioningInfo(SkinRightArmTranslation, SkinRightArmPivot), + ["ARM1"] = new PositioningInfo(SkinLeftArmTranslation, SkinLeftArmPivot), + ["LEG0"] = new PositioningInfo(SkinRightLegTranslation, SkinRightLegPivot), + ["LEG1"] = new PositioningInfo(SkinLeftLegTranslation, SkinLeftLegPivot), + }; + public record struct PositioningInfo(Vector3 Translation, Vector3 Pivot); + + public static PositioningInfo GetPositioningInfo(string partName) + { + if (SkinBOX.IsOverlayPart(partName)) + partName = SkinBOXExtensions.GetBaseType(partName); + return _posisioningInfos.ContainsKey(partName) ? _posisioningInfos[partName] : default; + } + + public static Vector3 GetSkinPartPivot(string partName) => GetPositioningInfo(partName).Pivot; + + public static Vector3 GetSkinPartTranslation(string partName) => GetPositioningInfo(partName).Translation; + + public const int GameTickInMilliseconds = 50; + + // See: https://minecraft.fandom.com/wiki/Dye#Color_values for more information. + public static readonly Color[] DyeColors = [ + Color.FromArgb(0xf9fffe), // White + Color.FromArgb(0xf9801d), // Orange + Color.FromArgb(0xc74ebd), // Magenta + Color.FromArgb(0x3ab3da), // Light Blue + Color.FromArgb(0xfed83d), // Yellow + Color.FromArgb(0x80c71f), // Lime + Color.FromArgb(0xf38baa), // Pink + Color.FromArgb(0x474f52), // Gray + Color.FromArgb(0x9d9d97), // Light Gray + Color.FromArgb(0x169c9c), // Cyan + Color.FromArgb(0x8932b8), // Purple + Color.FromArgb(0x3c44aa), // Blue + Color.FromArgb(0x835432), // Brown + Color.FromArgb(0x5e7c16), // Green + Color.FromArgb(0xb02e26), // Red + Color.FromArgb(0x1d1d21), // Black + ]; + } +} diff --git a/PCK-Studio/Internal/IO/3DST/3DSTextureReader.cs b/PckStudio.Core/IO/3DST/3DSTextureReader.cs similarity index 94% rename from PCK-Studio/Internal/IO/3DST/3DSTextureReader.cs rename to PckStudio.Core/IO/3DST/3DSTextureReader.cs index 0def6f89..cc6930b0 100644 --- a/PCK-Studio/Internal/IO/3DST/3DSTextureReader.cs +++ b/PckStudio.Core/IO/3DST/3DSTextureReader.cs @@ -8,9 +8,9 @@ using System.Threading.Tasks; using OMI.Workers; using OMI; -namespace PckStudio.Internal.IO._3DST +namespace PckStudio.Core.IO._3DST { - internal class _3DSTextureReader : IDataFormatReader, IDataFormatReader + public class _3DSTextureReader : IDataFormatReader, IDataFormatReader { public Image FromFile(string filename) { @@ -29,7 +29,7 @@ namespace PckStudio.Internal.IO._3DST public Image FromStream(Stream stream) { Image img = null; - using (var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian)) + using (var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian)) { if (reader.ReadString(4) == "3DST") { diff --git a/PCK-Studio/Internal/IO/3DST/3DSTextureWriter.cs b/PckStudio.Core/IO/3DST/3DSTextureWriter.cs similarity index 88% rename from PCK-Studio/Internal/IO/3DST/3DSTextureWriter.cs rename to PckStudio.Core/IO/3DST/3DSTextureWriter.cs index 6ffbb76d..9a5ec6dc 100644 --- a/PCK-Studio/Internal/IO/3DST/3DSTextureWriter.cs +++ b/PckStudio.Core/IO/3DST/3DSTextureWriter.cs @@ -5,9 +5,9 @@ using System.Text; using OMI; using OMI.Workers; -namespace PckStudio.Internal.IO._3DST +namespace PckStudio.Core.IO._3DST { - internal class _3DSTextureWriter : IDataFormatWriter + public class _3DSTextureWriter : IDataFormatWriter { private Image _image; private _3DSTextureFormat _format; @@ -27,7 +27,7 @@ namespace PckStudio.Internal.IO._3DST public void WriteToStream(Stream stream) { - using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian)) + using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian)) { writer.WriteString("3DST"); // 0 writer.Write(2); // 4 unknown diff --git a/PCK-Studio/Internal/IO/3DST/TextureCodec.cs b/PckStudio.Core/IO/3DST/TextureCodec.cs similarity index 99% rename from PCK-Studio/Internal/IO/3DST/TextureCodec.cs rename to PckStudio.Core/IO/3DST/TextureCodec.cs index e2aaead1..6e53b373 100644 --- a/PCK-Studio/Internal/IO/3DST/TextureCodec.cs +++ b/PckStudio.Core/IO/3DST/TextureCodec.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; -namespace PckStudio.Internal.IO._3DST +namespace PckStudio.Core.IO._3DST { /// /// Format of the texture used on the PICA200. diff --git a/PCK-Studio/Internal/IO/PckAudio/PckAudioFileReader.cs b/PckStudio.Core/IO/PckAudio/PckAudioFileReader.cs similarity index 93% rename from PCK-Studio/Internal/IO/PckAudio/PckAudioFileReader.cs rename to PckStudio.Core/IO/PckAudio/PckAudioFileReader.cs index e0c641f5..d1b8165a 100644 --- a/PCK-Studio/Internal/IO/PckAudio/PckAudioFileReader.cs +++ b/PckStudio.Core/IO/PckAudio/PckAudioFileReader.cs @@ -1,13 +1,13 @@ using OMI; using OMI.Workers; -using PckStudio.FileFormats; +using PckStudio.Core.FileFormats; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; -namespace PckStudio.Internal.IO.PckAudio +namespace PckStudio.Core.IO.PckAudio { public class InvalidAudioPckException : Exception @@ -16,14 +16,14 @@ namespace PckStudio.Internal.IO.PckAudio { } } - internal class PckAudioFileReader : IDataFormatReader, IDataFormatReader + public class PckAudioFileReader : IDataFormatReader, IDataFormatReader { private PckAudioFile _file; - private Endianness _endianness; + private ByteOrder _endianness; private List LUT = new List(); private List _OriginalAudioTypeOrder = new List(); - public PckAudioFileReader(Endianness endianness) + public PckAudioFileReader(ByteOrder endianness) { _endianness = endianness; } @@ -45,7 +45,7 @@ namespace PckStudio.Internal.IO.PckAudio public PckAudioFile FromStream(Stream stream) { using (var reader = new EndiannessAwareBinaryReader(stream, - _endianness == Endianness.BigEndian + _endianness == ByteOrder.BigEndian ? Encoding.BigEndianUnicode : Encoding.Unicode, leaveOpen: true, _endianness)) diff --git a/PCK-Studio/Internal/IO/PckAudio/PckAudioFileWriter.cs b/PckStudio.Core/IO/PckAudio/PckAudioFileWriter.cs similarity index 90% rename from PCK-Studio/Internal/IO/PckAudio/PckAudioFileWriter.cs rename to PckStudio.Core/IO/PckAudio/PckAudioFileWriter.cs index 2538e885..73c343bb 100644 --- a/PCK-Studio/Internal/IO/PckAudio/PckAudioFileWriter.cs +++ b/PckStudio.Core/IO/PckAudio/PckAudioFileWriter.cs @@ -1,17 +1,17 @@ using OMI; using OMI.Workers; -using PckStudio.FileFormats; +using PckStudio.Core.FileFormats; using System.Collections.Generic; using System.IO; using System.Text; -namespace PckStudio.Internal.IO.PckAudio +namespace PckStudio.Core.IO.PckAudio { - internal class PckAudioFileWriter : IDataFormatWriter + public class PckAudioFileWriter : IDataFormatWriter { private PckAudioFile _file; - private Endianness _endianness; + private ByteOrder _endianness; private static readonly List LUT = new List { "CUENAME", @@ -19,7 +19,7 @@ namespace PckStudio.Internal.IO.PckAudio "CREDITID" }; - public PckAudioFileWriter(PckAudioFile file, Endianness endianness) + public PckAudioFileWriter(PckAudioFile file, ByteOrder endianness) { _file = file; _endianness = endianness; @@ -36,7 +36,7 @@ namespace PckStudio.Internal.IO.PckAudio public void WriteToStream(Stream stream) { using (var writer = new EndiannessAwareBinaryWriter(stream, - _endianness == Endianness.BigEndian + _endianness == ByteOrder.BigEndian ? Encoding.BigEndianUnicode : Encoding.Unicode, leaveOpen: true, _endianness)) diff --git a/PCK-Studio/Internal/IO/TGA/TGADataTypeCode.cs b/PckStudio.Core/IO/TGA/TGADataTypeCode.cs similarity index 98% rename from PCK-Studio/Internal/IO/TGA/TGADataTypeCode.cs rename to PckStudio.Core/IO/TGA/TGADataTypeCode.cs index aa092c3a..75d10fdf 100644 --- a/PCK-Studio/Internal/IO/TGA/TGADataTypeCode.cs +++ b/PckStudio.Core/IO/TGA/TGADataTypeCode.cs @@ -16,7 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal enum TGADataTypeCode : byte { diff --git a/PCK-Studio/Internal/IO/TGA/TGADeserializer.cs b/PckStudio.Core/IO/TGA/TGADeserializer.cs similarity index 97% rename from PCK-Studio/Internal/IO/TGA/TGADeserializer.cs rename to PckStudio.Core/IO/TGA/TGADeserializer.cs index 23e43625..b95bbc1c 100644 --- a/PCK-Studio/Internal/IO/TGA/TGADeserializer.cs +++ b/PckStudio.Core/IO/TGA/TGADeserializer.cs @@ -18,7 +18,7 @@ using System.IO; using System.Drawing; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal static class TGADeserializer { diff --git a/PCK-Studio/Internal/IO/TGA/TGAException.cs b/PckStudio.Core/IO/TGA/TGAException.cs similarity index 93% rename from PCK-Studio/Internal/IO/TGA/TGAException.cs rename to PckStudio.Core/IO/TGA/TGAException.cs index 7e6461c1..3af64252 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAException.cs +++ b/PckStudio.Core/IO/TGA/TGAException.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.Serialization; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { [Serializable] internal class TGAException : Exception diff --git a/PCK-Studio/Internal/IO/TGA/TGAExtentionData.cs b/PckStudio.Core/IO/TGA/TGAExtentionData.cs similarity index 98% rename from PCK-Studio/Internal/IO/TGA/TGAExtentionData.cs rename to PckStudio.Core/IO/TGA/TGAExtentionData.cs index c22aec78..169979ab 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAExtentionData.cs +++ b/PckStudio.Core/IO/TGA/TGAExtentionData.cs @@ -18,7 +18,7 @@ using System; using System.Windows.Forms; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal struct TGAExtentionData { diff --git a/PCK-Studio/Internal/IO/TGA/TGAFileData.cs b/PckStudio.Core/IO/TGA/TGAFileData.cs similarity index 97% rename from PCK-Studio/Internal/IO/TGA/TGAFileData.cs rename to PckStudio.Core/IO/TGA/TGAFileData.cs index 92936e17..317ddc42 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAFileData.cs +++ b/PckStudio.Core/IO/TGA/TGAFileData.cs @@ -18,7 +18,7 @@ using System.IO; using System.Drawing; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal class TGAFileData { diff --git a/PCK-Studio/Internal/IO/TGA/TGAFooter.cs b/PckStudio.Core/IO/TGA/TGAFooter.cs similarity index 96% rename from PCK-Studio/Internal/IO/TGA/TGAFooter.cs rename to PckStudio.Core/IO/TGA/TGAFooter.cs index 6859de2f..06b8d47b 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAFooter.cs +++ b/PckStudio.Core/IO/TGA/TGAFooter.cs @@ -16,7 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal struct TGAFooter { diff --git a/PCK-Studio/Internal/IO/TGA/TGAHeader.cs b/PckStudio.Core/IO/TGA/TGAHeader.cs similarity index 97% rename from PCK-Studio/Internal/IO/TGA/TGAHeader.cs rename to PckStudio.Core/IO/TGA/TGAHeader.cs index a1bed5f1..4e40358d 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAHeader.cs +++ b/PckStudio.Core/IO/TGA/TGAHeader.cs @@ -16,7 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { /// /// Resources: diff --git a/PCK-Studio/Internal/IO/TGA/TGAReader.cs b/PckStudio.Core/IO/TGA/TGAReader.cs similarity index 98% rename from PCK-Studio/Internal/IO/TGA/TGAReader.cs rename to PckStudio.Core/IO/TGA/TGAReader.cs index fae9d530..ac4489fe 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAReader.cs +++ b/PckStudio.Core/IO/TGA/TGAReader.cs @@ -22,11 +22,10 @@ using System.Drawing; using System.Diagnostics; using System.Drawing.Imaging; using System.Runtime.InteropServices; -using System.Collections.Generic; using OMI.Workers; using OMI; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal class TGAReader : IDataFormatReader, IDataFormatReader { @@ -48,7 +47,7 @@ namespace PckStudio.Internal.IO.TGA public TGAFileData FromStream(Stream stream) { - using var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian); + using var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian); TGAHeader header = LoadHeader(reader); Image image = LoadImage(reader, header); TGAFooter footer = LoadFooter(reader); diff --git a/PCK-Studio/Internal/IO/TGA/TGASerializer.cs b/PckStudio.Core/IO/TGA/TGASerializer.cs similarity index 97% rename from PCK-Studio/Internal/IO/TGA/TGASerializer.cs rename to PckStudio.Core/IO/TGA/TGASerializer.cs index a467174a..14d3e491 100644 --- a/PCK-Studio/Internal/IO/TGA/TGASerializer.cs +++ b/PckStudio.Core/IO/TGA/TGASerializer.cs @@ -18,7 +18,7 @@ using System.IO; using System.Drawing; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal static class TGASerializer { diff --git a/PCK-Studio/Internal/IO/TGA/TGAWriter.cs b/PckStudio.Core/IO/TGA/TGAWriter.cs similarity index 96% rename from PCK-Studio/Internal/IO/TGA/TGAWriter.cs rename to PckStudio.Core/IO/TGA/TGAWriter.cs index ad749d00..fbce4d85 100644 --- a/PCK-Studio/Internal/IO/TGA/TGAWriter.cs +++ b/PckStudio.Core/IO/TGA/TGAWriter.cs @@ -18,15 +18,12 @@ using System; using System.IO; using System.Drawing; -using System.Diagnostics; using System.Drawing.Imaging; using System.Runtime.InteropServices; using System.Text; using OMI; -using System.Windows.Forms; -using DiscordRPC; -namespace PckStudio.Internal.IO.TGA +namespace PckStudio.Core.IO.TGA { internal class TGAWriter { @@ -123,7 +120,7 @@ namespace PckStudio.Internal.IO.TGA public void WriteToStream(Stream stream, Image image) { _bitmap = new Bitmap(image); - using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian)) + using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian)) { WriteHeader(writer); WriteImage(writer); diff --git a/PckStudio.Core/Interfaces/IEditor.cs b/PckStudio.Core/Interfaces/IEditor.cs new file mode 100644 index 00000000..dd19944d --- /dev/null +++ b/PckStudio.Core/Interfaces/IEditor.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; + +namespace PckStudio.Interfaces +{ + public interface IEditor where T : class + { + T EditorValue { get; } + + ISaveContext SaveContext { get; } + + void Save(); + + void SaveAs(); + + void Close(); + + void UpdateView(); + } +} \ No newline at end of file diff --git a/PckStudio.Core/Interfaces/IModelImportProvider.cs b/PckStudio.Core/Interfaces/IModelImportProvider.cs new file mode 100644 index 00000000..a7303926 --- /dev/null +++ b/PckStudio.Core/Interfaces/IModelImportProvider.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using PckStudio.Core; + +namespace PckStudio.Interfaces +{ + public interface IModelImportProvider where T : class + { + public string Name { get; } + + public FileDialogFilter DialogFilter { get; } + + public bool SupportImport { get; } + public bool SupportExport { get; } + + public T Import(string filename); + public T Import(Stream stream); + + public void Export(string filename, T model); + public void Export(ref Stream stream, T model); + } +} diff --git a/PCK-Studio/Interfaces/IPckAssetDeserializer.cs b/PckStudio.Core/Interfaces/IPckAssetDeserializer.cs similarity index 70% rename from PCK-Studio/Interfaces/IPckAssetDeserializer.cs rename to PckStudio.Core/Interfaces/IPckAssetDeserializer.cs index 3416c6d5..fbb55d1e 100644 --- a/PCK-Studio/Interfaces/IPckAssetDeserializer.cs +++ b/PckStudio.Core/Interfaces/IPckAssetDeserializer.cs @@ -2,7 +2,7 @@ namespace PckStudio.Interfaces { - internal interface IPckAssetDeserializer + public interface IPckAssetDeserializer { public T Deserialize(PckAsset asset); } diff --git a/PCK-Studio/Interfaces/IPckAssetSerializer.cs b/PckStudio.Core/Interfaces/IPckAssetSerializer.cs similarity index 74% rename from PCK-Studio/Interfaces/IPckAssetSerializer.cs rename to PckStudio.Core/Interfaces/IPckAssetSerializer.cs index dbaa903b..17f46a91 100644 --- a/PCK-Studio/Interfaces/IPckAssetSerializer.cs +++ b/PckStudio.Core/Interfaces/IPckAssetSerializer.cs @@ -2,7 +2,7 @@ namespace PckStudio.Interfaces { - internal interface IPckAssetSerializer + public interface IPckAssetSerializer { public void Serialize(T obj, ref PckAsset asset); } diff --git a/PckStudio.Core/Interfaces/ISaveContext.cs b/PckStudio.Core/Interfaces/ISaveContext.cs new file mode 100644 index 00000000..1b11d4f4 --- /dev/null +++ b/PckStudio.Core/Interfaces/ISaveContext.cs @@ -0,0 +1,9 @@ +namespace PckStudio.Interfaces +{ + public interface ISaveContext + { + public bool AutoSave { get; } + + public void Save(T value); + } +} \ No newline at end of file diff --git a/PckStudio.Core/Interfaces/ITryGetSet.cs b/PckStudio.Core/Interfaces/ITryGetSet.cs new file mode 100644 index 00000000..058a672c --- /dev/null +++ b/PckStudio.Core/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); + + public 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; + } + } + + public 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; + } + } + + public 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; + } + } + + public interface ITryGet + { + bool TryGet(TKey key, out TValue value); + } + + public interface ITrySet + { + bool TrySet(TKey key, TValue value); + } + + public interface ITryGetSet : ITryGet, ITrySet + { + } +} diff --git a/PckStudio.Core/ItemSelectionPopUp.Designer.cs b/PckStudio.Core/ItemSelectionPopUp.Designer.cs new file mode 100644 index 00000000..42d80301 --- /dev/null +++ b/PckStudio.Core/ItemSelectionPopUp.Designer.cs @@ -0,0 +1,90 @@ +namespace PckStudio.Core.Additional_Popups +{ + partial class ItemSelectionPopUp + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ItemSelectionPopUp)); + this.label2 = new System.Windows.Forms.Label(); + this.okBtn = new System.Windows.Forms.Button(); + this.cancelButton = new System.Windows.Forms.Button(); + this.ComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Name = "label2"; + // + // okBtn + // + resources.ApplyResources(this.okBtn, "okBtn"); + this.okBtn.ForeColor = System.Drawing.Color.White; + this.okBtn.Name = "okBtn"; + this.okBtn.UseVisualStyleBackColor = true; + this.okBtn.Click += new System.EventHandler(this.okBtn_Click); + // + // cancelButton + // + resources.ApplyResources(this.cancelButton, "cancelButton"); + this.cancelButton.ForeColor = System.Drawing.Color.White; + this.cancelButton.Name = "cancelButton"; + this.cancelButton.UseVisualStyleBackColor = true; + this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click); + // + // ComboBox + // + this.ComboBox.FormattingEnabled = true; + resources.ApplyResources(this.ComboBox, "ComboBox"); + this.ComboBox.Name = "ComboBox"; + // + // ItemSelectionPopUp + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ControlBox = false; + this.Controls.Add(this.ComboBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okBtn); + this.Controls.Add(this.label2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ItemSelectionPopUp"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.ComboBox ComboBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button okBtn; + } +} \ No newline at end of file diff --git a/PckStudio.Core/ItemSelectionPopUp.cs b/PckStudio.Core/ItemSelectionPopUp.cs new file mode 100644 index 00000000..b753810c --- /dev/null +++ b/PckStudio.Core/ItemSelectionPopUp.cs @@ -0,0 +1,44 @@ +using System; +using System.Windows.Forms; + +namespace PckStudio.Core.Additional_Popups +{ + public partial class ItemSelectionPopUp : Form + { + public string SelectedItem => DialogResult == DialogResult.OK ? ComboBox.Text : string.Empty; + public int SelectedIndex => DialogResult == DialogResult.OK ? ComboBox.SelectedIndex : -1; + + public string LabelText + { + get => label2.Text; + set => label2.Text = value; + } + public string ButtonText + { + get => okBtn.Text; + set => okBtn.Text = value; + } + + public ItemSelectionPopUp(params string[] items) + { + InitializeComponent(); + ComboBox.Items.AddRange(items); + } + + private void okBtn_Click(object sender, EventArgs e) + { + if(ComboBox.SelectedIndex <= -1) + { + cancelButton_Click(sender, e); + return; + } + DialogResult = DialogResult.OK; + } + + private void cancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.resx b/PckStudio.Core/ItemSelectionPopUp.resx similarity index 97% rename from PCK-Studio/Forms/Skins-And-Textures/SkinPreview.resx rename to PckStudio.Core/ItemSelectionPopUp.resx index 72d29f17..c818e94a 100644 --- a/PCK-Studio/Forms/Skins-And-Textures/SkinPreview.resx +++ b/PckStudio.Core/ItemSelectionPopUp.resx @@ -117,7 +117,126 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 15, 41 + + + 35, 13 + + + 3 + + + Items: + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + + Flat + + + 54, 76 + + + 75, 23 + + + 4 + + + Add + + + okBtn + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Flat + + + NoControl + + + 135, 76 + + + 75, 23 + + + 6 + + + Cancel + + + cancelButton + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + 23 + + + 60, 34 + + + 192, 29 + + + 7 + + + ComboBox + + + MetroFramework.Controls.MetroComboBox, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + + + $this + + + 0 + + + True + + + 6, 13 + + + 264, 105 + AAABAA0AAAAAAAEAIAD7NAAA1gAAAICAAAABACAAKAgBANE1AACAgAAAAQAIAChMAAD5PQEAQEAAAAEA @@ -2624,4 +2743,13 @@ AP//AAA= + + CenterParent + + + ItemSelectionPopUp + + + MetroFramework.Forms.MetroForm, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a + \ No newline at end of file diff --git a/PCK-Studio/Internal/Json/ColorEntry.cs b/PckStudio.Core/Json/ColorEntry.cs similarity index 89% rename from PCK-Studio/Internal/Json/ColorEntry.cs rename to PckStudio.Core/Json/ColorEntry.cs index 8523a311..283c3761 100644 --- a/PCK-Studio/Internal/Json/ColorEntry.cs +++ b/PckStudio.Core/Json/ColorEntry.cs @@ -5,9 +5,9 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -namespace PckStudio.Internal.Json +namespace PckStudio.Core.Json { - internal class JsonColorEntry + public class JsonColorEntry { [JsonProperty("defaultName", Required = Required.Always)] public string DefaultName { get; set; } diff --git a/PCK-Studio/Internal/Json/EntityInfo.cs b/PckStudio.Core/Json/EntityInfo.cs similarity index 70% rename from PCK-Studio/Internal/Json/EntityInfo.cs rename to PckStudio.Core/Json/EntityInfo.cs index 9c72c388..ddbd0d7b 100644 --- a/PCK-Studio/Internal/Json/EntityInfo.cs +++ b/PckStudio.Core/Json/EntityInfo.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Newtonsoft.Json; -namespace PckStudio.Internal.Json +namespace PckStudio.Core.Json { - internal class EntityInfo + public class EntityInfo { [JsonProperty("displayName")] public string DisplayName { get; set; } diff --git a/PCK-Studio/Internal/Json/TileInfo.cs b/PckStudio.Core/Json/TileInfo.cs similarity index 79% rename from PCK-Studio/Internal/Json/TileInfo.cs rename to PckStudio.Core/Json/TileInfo.cs index b5fb0510..db8628a5 100644 --- a/PCK-Studio/Internal/Json/TileInfo.cs +++ b/PckStudio.Core/Json/TileInfo.cs @@ -5,9 +5,9 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -namespace PckStudio.Internal.Json +namespace PckStudio.Core.Json { - internal class JsonTileInfo + public sealed class JsonTileInfo { [JsonProperty("displayName")] public string DisplayName { get; set; } @@ -21,10 +21,10 @@ namespace PckStudio.Internal.Json [JsonProperty("height")] public int TileHeight { get; set; } = 1; - [JsonProperty("hasColourEntry", DefaultValueHandling = DefaultValueHandling.Populate)] - public bool HasColourEntry { get; set; } + [JsonIgnore] + public bool HasColourEntry => ColourEntry != null; - [JsonProperty("colourEntry", DefaultValueHandling = DefaultValueHandling.Populate)] + [JsonProperty("colourEntry", DefaultValueHandling = DefaultValueHandling.Ignore)] public JsonColorEntry ColourEntry { get; set; } [JsonProperty("allowCustomColour", DefaultValueHandling = DefaultValueHandling.Populate)] diff --git a/PCK-Studio/Internal/Json/UpdateInformation.cs b/PckStudio.Core/Json/UpdateInformation.cs similarity index 93% rename from PCK-Studio/Internal/Json/UpdateInformation.cs rename to PckStudio.Core/Json/UpdateInformation.cs index c6d1fd30..ef4836bf 100644 --- a/PCK-Studio/Internal/Json/UpdateInformation.cs +++ b/PckStudio.Core/Json/UpdateInformation.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; -namespace PckStudio.Internal.Json +namespace PckStudio.Core.Json { internal class UpdateInformation { diff --git a/PCK-Studio/Internal/Misc/FileCacher.cs b/PckStudio.Core/Misc/FileCacher.cs similarity index 97% rename from PCK-Studio/Internal/Misc/FileCacher.cs rename to PckStudio.Core/Misc/FileCacher.cs index 3a810d10..c91fa8ad 100644 --- a/PCK-Studio/Internal/Misc/FileCacher.cs +++ b/PckStudio.Core/Misc/FileCacher.cs @@ -18,9 +18,9 @@ using System; using System.IO; -namespace PckStudio.Internal.Misc +namespace PckStudio.Core.Misc { - internal class FileCacher + public class FileCacher { private string _cacheDirectory; diff --git a/PCK-Studio/Internal/Misc/OpenFolderDialog.cs b/PckStudio.Core/Misc/OpenFolderDialog.cs similarity index 95% rename from PCK-Studio/Internal/Misc/OpenFolderDialog.cs rename to PckStudio.Core/Misc/OpenFolderDialog.cs index 02ac4eca..90a18310 100644 --- a/PCK-Studio/Internal/Misc/OpenFolderDialog.cs +++ b/PckStudio.Core/Misc/OpenFolderDialog.cs @@ -6,10 +6,8 @@ using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; -using System.Windows; // for WPF support -using System.Windows.Interop; // for WPF support -namespace PckStudio.Internal.Misc +namespace PckStudio.Core.Misc { public class OpenFolderDialog { @@ -30,13 +28,6 @@ namespace PckStudio.Internal.Misc return options; } - // for WPF support - public bool? ShowDialog(Window owner = null, bool throwOnError = false) - { - owner ??= Application.Current.MainWindow; - return ShowDialog(owner != null ? new WindowInteropHelper(owner).Handle : IntPtr.Zero, throwOnError); - } - // for all .NET public virtual bool? ShowDialog(IntPtr owner, bool throwOnError = false) { diff --git a/PckStudio.Core/NamedData.cs b/PckStudio.Core/NamedData.cs new file mode 100644 index 00000000..717db6f6 --- /dev/null +++ b/PckStudio.Core/NamedData.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Core +{ + public readonly struct NamedData(string name, T value) + { + public readonly string Name = name; + public readonly T Value = value; + } +} diff --git a/PckStudio.Core/PackInfo.cs b/PckStudio.Core/PackInfo.cs new file mode 100644 index 00000000..df451b8c --- /dev/null +++ b/PckStudio.Core/PackInfo.cs @@ -0,0 +1,45 @@ +using System; +using OMI.Formats.Pck; + +namespace PckStudio.Core +{ + public sealed class PackInfo + { + public static readonly PackInfo Empty = new PackInfo(default, default, default); + public bool IsValid { get; } + public PckFile File { get; } + public OMI.ByteOrder Endianness { get; } + + + //public enum PackType + //{ + // Unknown = -1, + // SkinPack, + // TexturePack, + // MashUpPack + //} + + //public PackType Type { get; } + + public bool AllowEndianSwap { get; } + + public static PackInfo Create(PckFile file, OMI.ByteOrder endianness, bool allowEndianSwap) + { + return new PackInfo(file, endianness, allowEndianSwap); + } + + private PackInfo(PckFile file, OMI.ByteOrder endianness, bool allowEndianSwap) + { + File = file; + Endianness = endianness; + AllowEndianSwap = allowEndianSwap; + //Type = GetPackType(); + IsValid = file is not null && Enum.IsDefined(typeof(OMI.ByteOrder), endianness); // && Type != PackType.Unknown; + } + + //private PackType GetPackType() + //{ + // return PackType.SkinPack; + //} + } +} \ No newline at end of file diff --git a/PckStudio.Core/PckStudio.Core.csproj b/PckStudio.Core/PckStudio.Core.csproj new file mode 100644 index 00000000..19f40da6 --- /dev/null +++ b/PckStudio.Core/PckStudio.Core.csproj @@ -0,0 +1,220 @@ + + + + + Debug + AnyCPU + {345EABED-F0D1-4D04-B409-BABDEF747352} + Library + NDEBUG + Properties + PckStudio.Core + PckStudio.Core + true + v4.8 + 12 + 512 + true + true + True + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + + 13.0.3 + + + 1.9.2 + + + + + + {693aebc1-293d-4df0-bcae-26a1099fe7bb} + OMI Filetype Library + + + + + PublicResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PckStudio.Core/Properties/Resources.Designer.cs b/PckStudio.Core/Properties/Resources.Designer.cs new file mode 100644 index 00000000..af12b5e9 --- /dev/null +++ b/PckStudio.Core/Properties/Resources.Designer.cs @@ -0,0 +1,470 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PckStudio.Core.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PckStudio.Core.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap additional_map_icons_atlas { + get { + object obj = ResourceManager.GetObject("additional_map_icons_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "base", + /// "displayName": "Base", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "Banner_White", + /// "variants": [ + /// "Banner_Black", + /// "Banner_Blue", + /// "Banner_Brown", + /// "Banner_Cyan", + /// "Banner_Gray", + /// "Banner_Green", + /// "Banner_Light_Blue", + /// "Banner_Lime", + /// "Banner_Magenta", + /// "Banner_Orange", + /// "Banner_Pink", + /// "Banner_Purple", + /// "Banner_Red", + /// "Ban [rest of string was truncated]";. + /// + public static string bannerData { + get { + return ResourceManager.GetString("bannerData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap banners_atlas { + get { + object obj = ResourceManager.GetObject("banners_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "Tile data research by MattNL", + /// "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", + /// "entries": [ + /// { + /// "internalName": "grass_top", + /// "displayName": "Grass Block (Top)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "Grass_Common", + /// "variants": [ + /// "Grass_Common", + /// "Grass_Mesa", + /// "Grass_Swamp1", + /// "Grass_Swamp2" + /// ] + /// } + /// }, + /// { + /// "internalName": "stone", + /// "displayName": "Stone" + /// }, + /// { + /// "internalName": [rest of string was truncated]";. + /// + public static string blockData { + get { + return ResourceManager.GetString("blockData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Comparison { + get { + object obj = ResourceManager.GetObject("Comparison", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap experience_orbs_atlas { + get { + object obj = ResourceManager.GetObject("experience_orbs_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "experience_orb_0", + /// "displayName": "Experience Orb (Size 1)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "experience_orb", + /// "variants": ["experience_orb"] + /// } + /// }, + /// { + /// "internalName": "experience_orb_1", + /// "displayName": "Experience Orb (Size 2)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "experience_orb", + /// "variants": ["experience_orb"] + /// } + /// }, + /// { + /// " [rest of string was truncated]";. + /// + public static string experienceOrbData { + get { + return ResourceManager.GetString("experienceOrbData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "explosion_0", + /// "displayName": "Explosion (Stage 1)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "Particle_Explode", + /// "variants": [ + /// "Particle_Explode", + /// "Particle_HugeExplosion" + /// ] + /// } + /// }, + /// { + /// "internalName": "explosion_1", + /// "displayName": "Explosion (Stage 2)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "Particle_Explode", + /// "variants": [ + /// [rest of string was truncated]";. + /// + public static string explosionData { + get { + return ResourceManager.GetString("explosionData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap explosions_atlas { + get { + object obj = ResourceManager.GetObject("explosions_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "Tile data research by MattNL", + /// "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", + /// "entries": [ + /// { + /// "internalName": "helmetCloth", + /// "displayName": "Leather Cap", + /// "allowCustomColour": true, + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "Armour_Default_Leather_Colour", + /// "variants": [ "Armour_Default_Leather_Colour" ] + /// } + /// }, + /// { + /// "internalName": "helmetChain", + /// "displayName": "Chain Helmet" + /// }, + /// { + /// "internalName": [rest of string was truncated]";. + /// + public static string itemData { + get { + return ResourceManager.GetString("itemData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap items_atlas { + get { + object obj = ResourceManager.GetObject("items_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap map_icons_atlas { + get { + object obj = ResourceManager.GetObject("map_icons_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "player_1", + /// "displayName": "Player 1" + /// }, + /// { + /// "internalName": "player_2", + /// "displayName": "Player 2" + /// }, + /// { + /// "internalName": "player_3", + /// "displayName": "Player 3" + /// }, + /// { + /// "internalName": "player_4", + /// "displayName": "Player 4" + /// }, + /// { + /// "internalName": "target_x", + /// "displayName": "Unused" + /// }, + /// { + /// "internalName": "target_point", + /// "displayName": "Target Point (Unused)" + /// }, + /// { + /// [rest of string was truncated]";. + /// + public static string mapIconData { + get { + return ResourceManager.GetString("mapIconData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap moon_phases_atlas { + get { + object obj = ResourceManager.GetObject("moon_phases_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "moon_phase_0", + /// "displayName": "Full Moon" + /// }, + /// { + /// "internalName": "moon_phase_1", + /// "displayName": "Waning Gibbous" + /// }, + /// { + /// "internalName": "moon_phase_2", + /// "displayName": "Last Quarter" + /// }, + /// { + /// "internalName": "moon_phase_3", + /// "displayName": "Waning Crescent" + /// }, + /// { + /// "internalName": "moon_phase_4", + /// "displayName": "New Moon" + /// }, + /// { + /// "internalName": "moon_phase_5", + /// "displayName": [rest of string was truncated]";. + /// + public static string moonPhaseData { + get { + return ResourceManager.GetString("moonPhaseData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "Kebab", + /// "displayName": "\"Kebab med tre pepperoni\" by Kristoffer Zetterstrand" + /// }, + /// { + /// "internalName": "Aztec", + /// "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" + /// }, + /// { + /// "internalName": "Alban", + /// "displayName": "\"Albanian\" by Kristoffer Zetterstrand" + /// }, + /// { + /// "internalName": "Aztec2", + /// "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" + /// }, + /// { + /// "internalName": "Bomb", + /// "disp [rest of string was truncated]";. + /// + public static string paintingData { + get { + return ResourceManager.GetString("paintingData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap paintings_atlas { + get { + object obj = ResourceManager.GetObject("paintings_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to { + /// "COMMENT_1": "JSON by MattNL", + /// "entries": [ + /// { + /// "internalName": "generic_0", + /// "displayName": "Generic (Stage 1)", + /// "hasColourEntry": true, + /// "colourEntry": { + /// "defaultName": "None", + /// "variants": [ + /// "None", + /// "Particle_Smoke", + /// "Particle_NetherPortal", + /// "Particle_EnderPortal", + /// "Particle_Ender", + /// "Particle_DragonBreathMin", + /// "Particle_DragonBreathMax" + /// ] + /// } + /// }, + /// { + /// "internalName": "generic_1", + /// "displayName": "Generic (Stage 2)", + /// [rest of string was truncated]";. + /// + public static string particleData { + get { + return ResourceManager.GetString("particleData", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap particles_atlas { + get { + object obj = ResourceManager.GetObject("particles_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap terrain_atlas { + get { + object obj = ResourceManager.GetObject("terrain_atlas", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap TexturePackIcon { + get { + object obj = ResourceManager.GetObject("TexturePackIcon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/PckStudio.Core/Properties/Resources.resx b/PckStudio.Core/Properties/Resources.resx new file mode 100644 index 00000000..b1f785a9 --- /dev/null +++ b/PckStudio.Core/Properties/Resources.resx @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\additional_mapicons.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bannerData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\banners.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\blockData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\Comparison.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\experienceOrbData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\experience_orbs.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\explosionData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\explosion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\itemData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\items.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\mapIconData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\map_icons.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\moonPhaseData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\moon_phases.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\paintingData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\Resources\paintings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\particleData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + + ..\Resources\particles.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\terrain.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\TexturePackIcon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/PCK-Studio/Internal/ResourceCategory.cs b/PckStudio.Core/ResourceCategory.cs similarity index 91% rename from PCK-Studio/Internal/ResourceCategory.cs rename to PckStudio.Core/ResourceCategory.cs index 8b8c1243..1512c8b7 100644 --- a/PCK-Studio/Internal/ResourceCategory.cs +++ b/PckStudio.Core/ResourceCategory.cs @@ -16,13 +16,15 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -namespace PckStudio.Internal +namespace PckStudio.Core { - internal enum ResourceCategory + public enum ResourceCategory { Unknown = -1, ItemAnimation, BlockAnimation, + MobEntityTextures, + ItemEntityTextures, ItemAtlas, BlockAtlas, ParticleAtlas, diff --git a/PckStudio.Core/ResourceLocation.cs b/PckStudio.Core/ResourceLocation.cs new file mode 100644 index 00000000..d633b8a6 --- /dev/null +++ b/PckStudio.Core/ResourceLocation.cs @@ -0,0 +1,208 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using PckStudio.Core.Json; +using PckStudio.Json; + +namespace PckStudio.Core +{ + public sealed class ResourceLocation + { + private static List ResourceGroups = new List(); + private static readonly ResourceLocation Unknown = new ResourceLocation(string.Empty, ResourceCategory.Unknown, -1); + + private static AtlasGroup[] _particaleAtlasGroups = + { + new AtlasGroupAnimation("generic" , row: 0, column: 0, frameCount: 8, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("splash" , row: 3, column: 1, frameCount: 4, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("drip" , row: 0, column: 7, frameCount: 3, ImageLayoutDirection.Horizontal, 4), + new AtlasGroupAnimation("effect" , row: 0, column: 8, frameCount: 8, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("splash_effect" , row: 0, column: 9, frameCount: 8, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("firework_spark" , row: 0, column: 10, frameCount: 8, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("glitter" , row: 0, column: 11, frameCount: 8, ImageLayoutDirection.Horizontal, 2), + new AtlasGroupAnimation("BE_explosion" , row: 0, column: 12, frameCount: 16, ImageLayoutDirection.Horizontal), + new AtlasGroupLargeTile("flash" , row: 4, column: 2, rowSpan: 4, columnSpan: 4), + new AtlasGroupLargeTileAnimation("bubble_pop", row: 6, column: 6, rowSpan: 2, columnSpan: 2, frameCount: 5, ImageLayoutDirection.Horizontal, 2), + }; + + private static AtlasGroup[] _terrainAtlasGroups = + { + new AtlasGroupLargeTile("Oak Door" , row: 1, column: 5, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Iron Door" , row: 2, column: 5, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Acacia Door" , row: 0, column: 23, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Birch Door" , row: 1, column: 23, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Dark Oak Door", row: 2, column: 23, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Jungle Door" , row: 3, column: 23, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Spruce Door" , row: 4, column: 23, rowSpan: 1, columnSpan: 2), + + new AtlasGroupLargeTile("Large Fern" , row: 0, column: 20, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Double Tall Grass", row: 1, column: 20, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Poeny" , row: 2, column: 20, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Rose Bush" , row: 3, column: 20, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Lilac" , row: 4, column: 20, rowSpan: 1, columnSpan: 2), + + new AtlasGroupAnimation("Wheat" , row: 8, column: 5, frameCount: 8, ImageLayoutDirection.Horizontal, 5), + new AtlasGroupAnimation("Potatoes" , row: 9, column: 16, frameCount: 4, ImageLayoutDirection.Horizontal, 5), + new AtlasGroupAnimation("Carrots" , row: 8, column: 12, frameCount: 4, ImageLayoutDirection.Horizontal, 5), + new AtlasGroupAnimation("Beetroots" , row: 0, column: 25, frameCount: 4, ImageLayoutDirection.Horizontal, 5), + new AtlasGroupAnimation("Nether Wart", row: 2, column: 14, frameCount: 3, ImageLayoutDirection.Horizontal, 5), + new AtlasGroupAnimation("Destroy" , row: 0, column: 15, frameCount: 10, ImageLayoutDirection.Horizontal, 3), + }; + + private static AtlasGroup[] _itemsAtlasGroups = + { + new AtlasGroupAnimation("Bow Pulling", row: 5, column: 6, frameCount: 3, ImageLayoutDirection.Vertical, 6), + }; + + private static AtlasGroup[] _paintingAtlasGroups = + { + new AtlasGroupLargeTile("The Pool" , row: 0, column: 2, rowSpan: 2, columnSpan: 1), + new AtlasGroupLargeTile("Bonjour Monsiuer Courbet", row: 2, column: 2, rowSpan: 2, columnSpan: 1), + new AtlasGroupLargeTile("Seaside" , row: 4, column: 2, rowSpan: 2, columnSpan: 1), + new AtlasGroupLargeTile("sunset_dense" , row: 6, column: 2, rowSpan: 2, columnSpan: 1), + new AtlasGroupLargeTile("Creebet" , row: 8, column: 2, rowSpan: 2, columnSpan: 1), + + new AtlasGroupLargeTile("Wanderer" , row: 0, column: 4, rowSpan: 1, columnSpan: 2), + new AtlasGroupLargeTile("Graham" , row: 1, column: 4, rowSpan: 1, columnSpan: 2), + + new AtlasGroupLargeTile("Fighters" , row: 0, column: 6, rowSpan: 4, columnSpan: 2), + + new AtlasGroupLargeTile("Match" , row: 0, column: 8, rowSpan: 2, columnSpan: 2), + new AtlasGroupLargeTile("Bust" , row: 2, column: 8, rowSpan: 2, columnSpan: 2), + new AtlasGroupLargeTile("The stage is set" , row: 4, column: 8, rowSpan: 2, columnSpan: 2), + new AtlasGroupLargeTile("The Void" , row: 6, column: 8, rowSpan: 2, columnSpan: 2), + new AtlasGroupLargeTile("Skull and Roses" , row: 8, column: 8, rowSpan: 2, columnSpan: 2), + new AtlasGroupLargeTile("Wither" , row: 10, column: 8, rowSpan: 2, columnSpan: 2), + + new AtlasGroupLargeTile("Mortal Coil" , row: 12, column: 4, rowSpan: 4, columnSpan: 3), + new AtlasGroupLargeTile("Kong" , row: 12, column: 7, rowSpan: 4, columnSpan: 3), + + new AtlasGroupLargeTile("Back Texture" , row: 12, column: 0, rowSpan: 4, columnSpan: 4), + new AtlasGroupLargeTile("Pointer" , row: 0, column: 12, rowSpan: 4, columnSpan: 4), + new AtlasGroupLargeTile("Pigscene" , row: 4, column: 12, rowSpan: 4, columnSpan: 4), + new AtlasGroupLargeTile("Skull On Fire" , row: 8, column: 12, rowSpan: 4, columnSpan: 4), + }; + + private static readonly Dictionary _categoryLookUp = new Dictionary() + { + ["textures/items"] = new ResourceLocation("textures/items", ResourceCategory.ItemAnimation, 16, isGroup: true), + ["textures/blocks"] = new ResourceLocation("textures/blocks", ResourceCategory.BlockAnimation, 16, isGroup: true), + ["mob"] = new ResourceLocation("mob", ResourceCategory.MobEntityTextures, 1, isGroup: true), + ["item"] = new ResourceLocation("item", ResourceCategory.ItemEntityTextures, 1, isGroup: true), + ["terrain.png"] = new ResourceLocation("terrain.png", ResourceCategory.BlockAtlas, 16, tilesInfo: Tiles.BlockTileInfos, atlasGroups: _terrainAtlasGroups), + ["items.png"] = new ResourceLocation("items.png", ResourceCategory.ItemAtlas, 16, tilesInfo: Tiles.ItemTileInfos, atlasGroups: _itemsAtlasGroups), + ["particles.png"] = new ResourceLocation("particles.png", ResourceCategory.ParticleAtlas, 16, tilesInfo: Tiles.ParticleTileInfos, atlasGroups: _particaleAtlasGroups), + //============ TODO ============// + ["item/banner/Banner_Atlas.png"] = new ResourceLocation("item/banner/Banner_Atlas.png", ResourceCategory.BannerAtlas, new Size(6, 7), TillingMode.WidthAndHeight, tilesInfo: Tiles.BannerTileInfos), + //==============================// + ["art/kz.png"] = new ResourceLocation("art/kz.png", ResourceCategory.PaintingAtlas, 16, tilesInfo: Tiles.PaintingTileInfos, atlasGroups: _paintingAtlasGroups), + ["misc/explosion.png"] = new ResourceLocation("misc/explosion.png", ResourceCategory.ExplosionAtlas, 16, tilesInfo: Tiles.ExplosionTileInfos), + ["item/xporb.png"] = new ResourceLocation("item/xporb.png", ResourceCategory.ExperienceOrbAtlas, 4, tilesInfo: Tiles.ExperienceOrbTileInfos), + ["terrain/moon_phases.png"] = new ResourceLocation("terrain/moon_phases.png", ResourceCategory.MoonPhaseAtlas, 4, tilesInfo: Tiles.MoonPhaseTileInfos), + ["misc/mapicons.png"] = new ResourceLocation("misc/mapicons.png", ResourceCategory.MapIconAtlas, 4, tilesInfo: Tiles.MapIconTileInfos), + ["misc/additionalmapicons.png"] = new ResourceLocation("misc/additionalmapicons.png", ResourceCategory.AdditionalMapIconsAtlas, 4, tilesInfo: Tiles.AdditionalMapIconTileInfos), + }; + + public static string GetPathFromCategory(ResourceCategory category) + { + return category switch + { + ResourceCategory.ItemAnimation => _categoryLookUp["textures/items"].ToString(), + ResourceCategory.BlockAnimation => _categoryLookUp["textures/blocks"].ToString(), + ResourceCategory.MobEntityTextures => _categoryLookUp["mob"].ToString(), + ResourceCategory.ItemEntityTextures => _categoryLookUp["item"].ToString(), + ResourceCategory.BlockAtlas => _categoryLookUp["terrain.png"].ToString(), + ResourceCategory.ItemAtlas => _categoryLookUp["items.png"].ToString(), + ResourceCategory.ParticleAtlas => _categoryLookUp["particles.png"].ToString(), + ResourceCategory.BannerAtlas => _categoryLookUp["item/banner/Banner_Atlas.png"].ToString(), + ResourceCategory.PaintingAtlas => _categoryLookUp["art/kz.png"].ToString(), + ResourceCategory.ExplosionAtlas => _categoryLookUp["misc/explosion.png"].ToString(), + ResourceCategory.ExperienceOrbAtlas => _categoryLookUp["item/xporb.png"].ToString(), + ResourceCategory.MoonPhaseAtlas => _categoryLookUp["terrain/moon_phases.png"].ToString(), + ResourceCategory.MapIconAtlas => _categoryLookUp["misc/mapicons.png"].ToString(), + ResourceCategory.AdditionalMapIconsAtlas => _categoryLookUp["misc/additionalmapicons.png"].ToString(), + _ => string.Empty + }; + } + + public static ResourceCategory GetCategoryFromPath(string path) => GetFromPath(path).Category; + + public static ResourceLocation GetFromPath(string path) + { + if (string.IsNullOrWhiteSpace(path) || !path.StartsWith("res/")) + return Unknown; + string categoryPath = path.Substring("res/".Length); + if (_categoryLookUp.ContainsKey(categoryPath)) + return _categoryLookUp[categoryPath]; + return ResourceGroups.Where(group => categoryPath.StartsWith(group.Path)).FirstOrDefault() ?? Unknown; + } + + public enum TillingMode + { + Width, + Height, + WidthAndHeight + } + + public string Path { get; } + public ResourceCategory Category { get; } + public Size TillingFactor { get; } + public TillingMode Tilling { get; } + public bool IsGroup { get; } + public IEnumerable TilesInfo { get; } + public IEnumerable AtlasGroups { get; } + + public Size GetTileArea(Size imgSize) + { + return Tilling switch + { + TillingMode.Width => new Size(imgSize.Width / TillingFactor.Width, imgSize.Width / TillingFactor.Height), + TillingMode.Height => new Size(imgSize.Height / TillingFactor.Width, imgSize.Height / TillingFactor.Height), + TillingMode.WidthAndHeight => new Size(imgSize.Width / TillingFactor.Width, imgSize.Height / TillingFactor.Height), + _ => Size.Empty, + }; + } + + private ResourceLocation(string path, ResourceCategory category, int tillingFactor, TillingMode tilling = TillingMode.Width, bool isGroup = false, IEnumerable tilesInfo = default, IEnumerable atlasGroups = default) + : this(path, category, new Size(tillingFactor, tillingFactor), tilling, isGroup, tilesInfo, atlasGroups) + { + } + + + private ResourceLocation(string path, ResourceCategory category, Size tillingFactor, TillingMode tilling = TillingMode.Width, bool isGroup = false, IEnumerable tilesInfo = default, IEnumerable atlasGroups = default) + { + Path = path; + Category = category; + TillingFactor = new Size(Math.Max(1, tillingFactor.Width), Math.Max(1, tillingFactor.Height)); + Tilling = tilling; + IsGroup = isGroup; + TilesInfo = tilesInfo ?? Enumerable.Empty(); + AtlasGroups = atlasGroups ?? Enumerable.Empty(); + if (isGroup) + ResourceGroups.Add(this); + } + + public override string ToString() + { + return "res/" + Path; + } + } +} diff --git a/PckStudio.Core/Resources/Comparison.png b/PckStudio.Core/Resources/Comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..144a16a30711fdbdc735f8e2402adc0826bef6fd GIT binary patch literal 101337 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 literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/TexturePackIcon.png b/PckStudio.Core/Resources/TexturePackIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee747945c6dc5b413e1656e43bd866f09790137 GIT binary patch literal 767 zcmV3wJW%FTVRAMbbWIp?O9-dx=c#v+|gkIP^< z9D?rkdVwqQ`8?=uw+lK9L(s)y5%gd%0NwBRo$tf%%fIh*I-o0+3jRJwc*uaH8?Y~x zO2HqZC;~klmO)P($T=CTE!RL#-aX>npL5EE*|W%eehPG>-vr%mw?P*Q1<=`S7W8N| z(ib2DWWZPsDDTH}c%1R_#ViNssIXaezVGV#H{}2!AOjq|05i%=GE*DB+D@k8GH&iibxBC;`Tybl zE-jqW7a#*#sh4Dg!=STi+W z=6w5oU&iD13PL~zBs~XM3#^%%Z$HnqJ?D(uSI#^4=X(gNSKxU?gXR@NKn5f{%)3Dj ztJdecL+c!_1(+k|g1T3oz`ccaH_7XTfDA}_4tRL|;%*$K;^u_C4y$ev0y03oK;XqZ zN4>QJIx~#C>Imzc=H7sN0jpQBdIcdM1CpKt;xftSx;6K=_Os>-R*tfI4}AeLKnA$$ x01jr9&sB>tp2^M7Om465|1}Q~0y4lE{{WccF7p}yaMJ()002ovPDHLkV1f{_aJc{g literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/additional_mapicons.png b/PckStudio.Core/Resources/additional_mapicons.png new file mode 100644 index 0000000000000000000000000000000000000000..11b7256ad3a96ddec53dd26fc17e0421d18e28a6 GIT binary patch literal 4599 zcmbVQ2UJtpx(=Zjic~3rN(_h~h7dwa=n!cVL^?r{kOC1>NCF9p6sZD=f=V5AhOrPq z5L6IDv49c~45)~7l&GUfQvngV!M5h!b>DsO-Luv?d!PM(e=qB-bHvNjWvz^+3;+OF z>*k8~7OnQHH%LnK3Orp+r%cD2@%}n_QG=zj_RVfWJXlkv0&ARfXU{j2GC6#vp>t zjLe~UxTy))0%-&{H%6M6ZU>tf!!2OO7BDyhY79pio1+j&@Q({3(#9Z=P~K?gAG$LRK&ecfpAyhSCZ0j2v&b|m zcvT`Uj26SPfru>q?gEAWODvW7BTS-z!8kZN3~pq+>e4qL0sjj}k6}c8Q%=Cch*3le zk;-CDCG+NZpM0x!*8SLb=nixy4egK(Dps|?-f8!yd zaV(+@WR(szwuG8k_`*e5GesF&7_Mf}_&XFsBalgP{{ls>LQPFjrig!nimHZyW8wZ+ zFaeJu(HIn*$Y(MI7fyuHso@atuSlYtXi+qVNU_K|#NW@|oSeKEG!i*VL|}TmID*}F zIGMwd=H^fnBltISF&LB^mC3?U@kBSY4MY?lBQlwQB83snEG-dXPz%d2OQ^ZAsTmXr zClR1{gc;lni6g;rW`v*oXc|6dwF-Xn6aJt4yBK6q7viG+YdNdExmrFbS29zS*tj3v z<3o)8v5O*uzf}whhhOak8wh^21c)LJz8{nS>j-@3XGai4LjOZue1|bJ$j@5<_-?S58LJ@TPg~-l5pKff%kQiLMlvz}++X7c{q8apO~g!K?NMIhi@l zIUaDt4LudKM5i$V{bypuwTaSYi%{UDW()uhcp&AUAnVn3FUeyim>(|r_zUI@scg!T z{PxkC7P8YiG<lm)(H*qfdQ3IpWe?r31|j@fsbP_Uc~37oyF-f zirmbsJa~B2->KO)Pt&ecSJvJ%7Y66fb7^EdBG! z-4+G-N1<&?XKg;FePJ^pTsZbYhVB6Pt!`i66$rt(Xy3?8)JKnw$uiyO--Bm9sXq$1 zaqu)My=wq=mvJjIj8qcY@=(zjjzy3P4e!zbYN>lnZezfY&Nr5n+g}a{qoo-nD=}hAe(7x`xo@JnrH3iiU7i;nb8%ku9$*^mz811>wi@*TlaBZCpIDEf~`I zfag0FqgOWxG>a&5o&On$k({2>sy|0Ssr=Yj;K(cW`W z(q9M%v(G+NwL8zL3NRLWuXk*6zMymn_L{djgL<~xQ!?0&M%6y zXl%G!`-q%kWec@-EjQR+(eLf%kPJRE`*Pe-e`P>lSvqv@TF3O_r2T2>nttJX9y9`U zTA&-_XSTwp=iH!mz6ypsmH@7v|Z-llpRsR7xwFEM#gbO%zu(%!MgTRXU zxB_o>Xg-YDmPaQlrBIFfVZ z_;6#+;OTZ|GpQzYAjK+J?eGUNVzOXZxTg1b+KtxX?DB)sDQ4n2Q{piOJJv1_DWH@2 z=agYAf6gCD(a<;kO*%1AGChd;dgm80Z-cI$!Bpf*{f6HFhnn`qjMI?tz=uZb#~n2&D;j*vVWx@0>Jk`e|qy)O}y;WoYM?mv6g9woegW3%ij-N3(GXPSfdCK_6gXr*!)jY6BWR^?EE&XN&j<)IWvqOee4Stqt2*6(&c&l zX)L-6i{HvYpV`^wctO=k=ViZD&jX;}>-=TO@`$8L>C#<&qxZY6AxOXP;^?ATK=Oe& zKkQp~U1wcqv^#P1@|)nVOxu*tUBr68yT@##&NPp*XnVc%WoJiG^cfsG9Ew`9@{)AD znR-tSBW`eec=+I;!m|J_f9awespzq3;Qpd_L&4d0{R2CE+aKn9ivQ~sFl0Qo-ELuA z8(_&>UXsmpxi|u#uXHp^fwMBX>KLtngZEd0rxF)}vsJWh=H{21=h$BCuFWkK>j!&M z61UBZ%NM*~v*FZ|SYpuoH4;ksNm8313iqO4X0KTRwM^bkk^ItIMiX0@{kktMg?qfV zq(!qfSh{l2Q*k&^%SH+@?{vtsMy!c^q`XAVi#OT2Bu1Q2h_!86*W7Jz`i`II+vZ>- zNMkZUZMuW6{bhJ*P@&$^zHZiP&Do0948sk%Y~H>%@rTj?E9!z|!x4pgh-As7_X-*E zd&Uy%n{9@UXW1?f-AiUk6vhoRCF?nM=Qv9-lZSJ>dv`a7U*3wPPL+k02g3>2q1%|^4Ue|PWO3IVmyYD(HKAvCEdNJ~0=bmMo+gP2Y{JqCUY@4lB z^7Z?3z%qGoWy+_Qq{KDHc0CP0+|R#o5nX-bBa4%`51GIdCfKJ1e(DrVBQgi|u5kFq$=Za*ENdSpQ5QJ##;Onygxe@O>jYy{gjb4=N8ox|wMcqj@IVhc;#bRVYr zB)@mQUVC)DEPIh7>DB?L&Hp&BbuBBk!P(Isy;uCJ-Q6d5M^~a3z)5fQMjOUb09Q(q s-li)6>#4viTDG9k2I+e0eI25P2ySo(E;?Uymu7~@fhkiV-{J(eicS$yr z%w#OtWcDIItH`1v5h6iAK%mOYNvVJ2FAxxrWC+k7CG}bTiH{7@Rb5sBqGpo#_~QY_ zN?chS0-`<+`Nb6W1J?OjNmH7Nit6Ct;Qjp_5)u*<6B7pq2OS;#qcIj1*6HbKM@I)e zJv|K#O>1i_6ciK@5m8f9)6vn<%gf8;i+(IPfyS8?(Y2j z{M*~x!^6X$KY#A-?w+5Y6B83_YHBVnF2G>$;^N}W%uHcnVS9V~+S(c-B4TG}CnY82 z#KgqV&`@u0Z%IkX?CdNuGV@$>V`$;nAeON)(-EiEl&XJ-!x2;ku0 zNJ&Wv3k$2NstOGa{q^e?BO@ad6H|0_bW~K-_4PG3H#aXY@7dW|e0+RlWTdyZx0{=r zr>Cc+q@gM+QDtqlzgRaI4A9>MP~ zF8~05pP&E7j~~p;%&e@eK0ZErU#)+Hgn8vP2F4^S1!Sn`n{je-MyF)z8=I6azIRpe7iM*7!rl--lU!?KcV2fyU8UXDRhEZ<|3KS3)g=hKG z4h9d=aA?ZI@x9&yBxV*JYQ_))V@>$lh!GbE$i*$BiZy}RJ_E;=jSA`u`)hBL*Bymo12?I$cJTL zt~WR9Lq27znCd9U3R3SNN+b>xh^z7N6{9^2i;H6Z458`oZY#7-($vDSU?{Ita9J1p zMd!_s{so6R7-T10R3c)8LKk3-(nGZ&BO3kni3K+^0dV!B|fUL7{cqgpk}@9Hq9#LiSaMr znpZ#N)GU01{A$cEwwJGVvul}hPCrm0YXQ0`lu*PucY@(O1TinKpKq`rWGN+$ukb_a7g}jG8$kqrT5MUxstB^Tc6Q7qe z&Sbt>v_CFkIflT@L_8n!%@WY4vKx6wvs2eVEA{?Ss4&Njkp6DFqts3iDT~}e8PUAMU=}wSVTN)0(^BMUmAXtAM&gg#I`|6HkCuo8 zjJtP#sm|DPWDBk+ZACg0Ah)Fd&gB%MLGG_L^ytupoay&ND5BG+#6uB(kMzZ>D3vWk z1SrbAVYKd5F?2^zOAI@tjd}&bZ(an60~+wFgG!_#z7#eUVh2?eFapcqPyX(^c+r`d zkM6sq<9#H9!$H<9Ml7sDLeC$7yus9VT2*IS41Lz0?v9UAKW8#1o>d?yDNEFkF|wEv zyel*bJ#1UC^?u&f56(aWAB=p?$Y6jBt@r<2ZOOXyPic(F;r1n&x8WM=xnD zwZVRL*AVcRpKHPxllNeVpTl*Nc+3(P^BzXSkYL$1)gFFk!H|GTpR~%CqqOxW@gOZ< zn3UX+4STK2kzvgp#_~l8u|sA?7r_6Dj+(`+CilxcI3b(~S=|Y9wmH`dKV&Benv=-l zhb!Dl_*U@(-YJ^b<9xx1iX2`=?5+47FKIQV#L3xSUMO=^N+0TAPPxQb@Bv#R6_xI` zeUCf%y+CSV{)1{4R9s9DRG0Gy<8x*kVPwu-=|4td($BR~AN<)5x zZa0Yai#z4Nfn@K9Aqu&~Cezy^lahXP-4Kjdsp z{Sv|qR5e_#`ckF+{N2OD<7un*OO-xy^5o{PFI7Gn?RPmjckL)fCYHpE(VazIud?yl z$<~+xO{G>tIMQ=;ZHK7Kv3G{*I2QeK^gk1C=#U-}B-)2en}zCP2m4No#d{AhsM3Fs z2(g9sVIdr5tabKfQPiGFhSi*=Dg14#p)Jy!aTk{2He5pPrZmixBceB4YAr7@V`(>+Fl$^fHVgnwBBn#&xBA z$Un3Tm)j+y9|{{BjWaZNe2em{Z0@*0O<$?(<}Ja^ zyV(5s=D8$OxcAhZxJ6ZjuNGTe+dTj`CY8FRNw7138)b+X55<+^P7|j zQKTm&oE>aC8Fk^*BEq6(Obn6@8Yp#|;?h_>vf+@`!6w9foL2`0n?o(1t3^hRw7aw> zK5l3r;oMV*G-lj!C~eoxN3c5w)xmLSkMhl0h_rTQ*~7O(rL|Q$?-!;4#U7%R4ppsI zI-BF&%CuyRwT1G_X!hx5&;)7NW{Z8pfio%1Y^q4_88H zW#0;^Jh7qtD5q3b9yM|YDVhhT`1r)8^H#N1%8PKI6=`_71Rdd~_R8=gs1@w<>1*kD zA0dIC$^4JneIDL6vTpmrA4Jy+pUF1guQ<8_KB}H?7dM{Cz8uT`Qw8Yq(!O0G>}&Jy zJ-H_k{+d9xFlGLXaSGItB_L`T|# z;xXJ?&eiTbA`?u*S{@eezZa_7^dRPxNMpu><5r-Y&e7%$O=2tla`s_E>=N_x9a~0Z z52Tod#X-}WWBEcDY9>uew=4XbZdKu=`f^{!0@CnVWwb(51GI;UF3%m$jmwZ1e!a?1 zeQ~$7rSxXpCG5s=ZnVoLKcP_|EfHh8xkI}afNupd zYQ)2^HsllQ(HtmcK?5ZKNg;y%Q*RPG#}vthLd1T`556ND0d}MXMZ}XjUoFQ=J${yC z5t^VXMpU_&5p77MZ}&faOCE5VWjI&JQ0>MEJ0xXeAsF|GOMWyU+n`wt&|THTVit8w zbVan`OshBA!z^-U&6*R)VVheUrsl%YfS+RH)VD0eoGvWGSG3fOX%Nv9T=GL zA1QYDNubg_lt1Op;~$4D2yc|U9NSlw?nJ1Cv6qX{xW= z3&|h1DSBH6W)e`F2f7#MM&v-YN;ta`{I)A7x%K%0Tu`@%z1-2wkk>b0U>A{UBQ58H zvM=yWnB5+glVs9Zy-XxEw?6J82iQW=OR*qSwX^HyHU8$OmnQua80kJ0}M>!Q32 zOF&FW==jJ$m$Q*#5fiw`i=)U~Gzo2*7&jAkpnapsB@uOgXR>2F7# zW{J;_vD+22jkZt_&a$MRA>LmT%RR~`bfak5J|FE*sf?XzO0@@rG7H1w0V19QrYH@L zBlKKYsFC`d&&q^m1jT%9P89jZQ1{Gp!li<`e8WR+K%@zqX=rZ_l>~H|IO2iTKz6HP zz(GwNXRbScs<^k{W;&(-TLY;%Fpf00+?T{RV!xK^jwu)og52irb2g!H3^j9V9;)#y zjrO;?deetOc`GqIb7NIkli!fx-Wt9tln%T4$t5*jbM!Ms(the4t5?$U_pur>$I|?B z*cw$NSTLiVi_2Av%W}A`Ym#;>fq362y{ro}5x7r3UG20*hiC~FJYY~$;o?=nBgrFu zrAP5<2Of|VAke3(wXl@I(+;wA6=-}%`8@iso~G%87a2)x9rffDe2^|43daB{Cp9|* zuNO9a`N$^{Wwct+lkux;aP$&b*@>PpYCXXsp+8QHWR|4SGG`9JjTWNcUP5f_XqLPv z2JghxWhc`tD%^B}jFG5+oq})bRvjK638>dSH`eKf(e)Z;mq|w*$>=I7VgKZjy*HcG z{UlVCd{cz2Ao!UWj;~~z$g%IDx+$J=HJs}gJ)*ZFCw6MR>f&gVid=>YNdmLt>-=Pg zkVk}V5y};%E%>J#&=#!gN>Po$ivmb|DeRgqVsPy z&tho2(eE@-+b^~;X06mw^ShnTU$3ReiVGky?4ilgTZL%mk6v7R3f-0pB+y1B<4Kz5 zDgjM8BW8Q4IaJXKwnRK6qot>|n~9IkPy`g7Nalg{Gt;fx*p0@Dt7lcL>9En%n6&+f zfkxJFYDjzNXx4?X^p!V9HzMA3&A5f#KPwaM6=Vx|dqiYEUh9(ja-dV|tk-op93_b%VW;ZOc#Cj?Z7JNNZZ%u`ieQ?nmcX)Yh!5HVkrPgO>aSTiA{W z74IkP3j`Lf&BhqH!S3;+#d&dL>G;} zyoK-_90yyKRh7R)UiygMTyocH9 zEedWLs)z-4eRQ1#N1kKCR=td%YQB*tVmo3~gfiH6EJJq>K(&k^gG!icrIr5h3cZ!? zl-QvO6;`AjT0&8@h?LEBHy%atK~{{ErJtIF#1mEQ6yvI2M`F_AG9|7S-RoE-37Vgg z19a9^25b`f&3IvECxq;8Ow|Zyc&%c|A$`u00!vgl!2TnWv_x#!$2QLEC_+khpb8^C zF%DxNBP1LN&^=lWKWw{dnB^;N<@iP8OekY9bS9g!%q%}}MLs5U3E&vU}2ZecH;alJ}Eq)jQ1Dl#N6l72aFOuoux?m0)Op$r3>!32;PGfH0@ zQLafi9~d^QO}QX1hgl^LHAw#crmeZ1lS(`qwo9Mrrs={s$-|Y#(^PFw=kCMCQkn?* zrl3|-<^%zEj#c^lujb6CdI2i;!T~{U%T^Ou{um;QcROC1=5L(lNd?|y zZ#FFeOUBeP8v+MTHV0Rk)~wb35^UkAHZ5+@lEO90Tj40KCCPZ(UGYOV-qtgIlklXr zvwTj`Pr2K(SE00iY-DbTwuLMH{tg|bYcd}m3diav4BvKxqMY4!l0Va;0!OrRgiuWfJm+%x47dXZfqDpu= z`*L=9YwLvU=-fdYI+MG?dfx0i`3hd5Z`&#+Oo|-D&f?{}LRf*EXCZX}$#fg?Jje=w zwP6RvI)xk7c2)pW?2Y%Lsmo72{qN<_x7Cf=2Y;mE0vjY!aVH2XB&iX$Q3U6Ir4!Rm z@Ik1X4r*a9->|NVqn8szUe{+#?0wI2o##39DqtKkpj;nZ;PKk2o*d37`Q#M1LUPFS zCR@>1HjP@EYU*RMq2tbY@%>Rs>S(Y5=~inqX5o>Y%dBNxE_Y&;#yr2k$WC}%!Yg${ z5>A`eA(ThLIyhz)uKE+IX7v=qAS&x;J#I$*SY4xwKz1(O!O}+TMB7jB9C;RBDWSao zHsFl#0-C{@IS40}QUd~`4%n9stYf6J8IJy(nHB|o>b>R*BPeBK2;Qgp zRlok_6M+)Q=ggMNX9P3I3pFfIlcnwJpmZqA2X_1_zTLe~`IJj14Y*=9-2gHt$pakY zE_oy6zXu*Jv76t^x2JCJCa(H8+8c}MDZ(3I*d)*lcmII-!a8**o3_7?z^|L=4O_$0 zcoiBFe$q?YYAYos)kFO~sG|J+(Lm4}PkyBYUCNu3Vtdtz$iDo(ZNTEOl-@uKc>@Q| zP*%tg7Y@HGr^ia7^ANjn8l&dLt?@ed?-XHP_Zuy@&6ewO$!swi`U9FiTh5{~tfv7E zoF6H#yEHHLpUtpbiNGwZ-EW`U%A}3jK;M2{=R$d%9uLTlpq}Om|ISsS*&+M>J8Z4E z##s$ZdZf69Ru}B_=i&?{&K_cLnQ+EgVo}wsFf0g)#?CMz zm-|mibF*SvFFT|PhJk=tM>8TuZ%^yg;oZ~IlW*G%)JN7SQag2ddV1sSXT)mv+-WDF ztY6nZgB4UZnUI$&k}D$8&E{wN^w=M|hkPW|?G$bN_x9sNn@i65D|LNJig<`u9R~u@ z!Jk_y(OUj$r>2nY3RmF7C7~$7WA~5={LuFHq1bXqV`F>!$ALSVzEhyBtCN+L-^Yzj z4;R94hwu-i0au^0onTn_o*}clY5#}PO^UCGXzo;8+>IY!UTt&{GAuc~w#fSk zt!kb>XoNOT$omQL!ZaK$-WNqMzVF9N=fQs^9S4b2H?r?iZ@_{Vu|JKf|A?E;m-f6n zW@RkmbAJ|PHP!u?_{!-UDcXxawVlYCH!@|5#z@Qz@H`;~i;)uzTS7zEp~JvIt=REI zanM)^I+^!8omAE42HY*&usYLjE4KK&Ex5*u2E3*G4^`H*F+Th{1EVl@q4lCj<)epQr)5y1Cfk&KVLjwc0U{W8@cN2SR?jn91gP* zGdY=a)S>R&n*bW)>s5cW&xVruzg<1w3+IyhV4AnLI#4#cn_B#Ra_W$o`M^^HzrK z?94ejhyuHmXc`k%Bzff~P;+08%klymt_G$=Ujxxto^|=28~=yVS_durvrFx&XML@E z_+I9o-Lxrx@P68q)AK27&)XhWyJSmgN(|9@x(xPC-uKr}B7 zg>yp7;gmRi2M5535!F23r{g5mJRvU-{h4y$)ku=6=+n3exZ-~(_xL>gBa?RqyNm8P z2e-|xpA@I#&zC*#+kL^|=%oDzeZlzXWc_IG#zLNb8&^Kp+kKKBg!`11o1y=a)7Gx1 z*J;VQXB=6lFBprbb<@Y|bbo9t&Df~h7rcLWnuh7*1m1UNvEZO-^IhlRu$M&eKO8ph z@drPB0N-!RP7#FKUdm3>X8J71+x%aJWA!gLe&1~}A9!9$x^+El{?cz<4(lrSfD8*> z4aRtxObEEX`WqF_N-E-eebqOB&pQ1Ig=YEyrOuuk^8RpX#C`p?@L+%FchN6A`m3Wg zgt(z)nje(se|wx1m+N~wBU|SO!UXE5<_i6g#L1|kRTatUoN|#|--{(dpvX1V`|gOy zZ*E`U3M`m^!u`qc$9Ne{fu%*#r0@O|PZHOE!Ou;rwdMZfuGI2}nf%tg5<-SQ46sGc zp?trY3IMP4s|J9=V>Y@rVq&^ty1F*H zx-@ip5+oP#1Z3Z)0?AemY6GN)jNiZgw0pUm3P20RlPCxd4Tff03UG4zJj5)Ak0t?M z0R0k*h9^IXu!BNg`k84yP*PPVVHygM@|`!PSg9jU~XZB8Mr>F#!ZRbL&6 z|F`&D{}c_yIln({?oD0#y*;|#cZ5^41ibLOnY$({+*}Q<2Svye(ExbE|7{Q24hHQW z=Y(%tZ64>V%|v!_4rmuDecP}O81!?9Xgm#&D)Il{5-tteT@NR7)*d@th+-YK;1EZZ z+2v}a_)UCI&2|3IURKig3{+JER8^-8-VFlKQKWY<1;iGi1B9>7OG+L+gt}oY?RFqy zTL^a76rK5kUTvyZ{>^p|S`<`uZEd6Yq5ESW!tK*K8WTRm-gMm$je)NpS63YY5s~Hd zrl}&w;+Vm8eLbAv>%qUdHqzu5+Yi!Gqqf8iV63|0jp6%P5Od*jU=Ls>;69u7Y7EWc z$HuZMk?H^6DE+#%6yrt?PY1}LKl$vz*PRLq2F!vbI7ys zK2Z;bf~f7>sJg01`|AI5!qijL0w{qOH7rmZOFY5vjL=X&7wX_ab_B3{iq)2JL>fXm)Th4cr~z|$+Xfq3`GO4Cxpz~{B<`G}()UIwBcj&+Eh6{k z*n~U?kjfq@<9K#3P5K!G$ksMfVUZZ<6T7sCqm^^Sy;SP62aM8YC{g#oh=ygLXZ+o) z34`aY5S{$Z=#(2KYTPYOfO0bK?C=IcI*G*Nt6}n;)7Rh;PV5`_ufI!wp$69X&c}E0 zeapB|^VXWNxJHwF+ zjSmP*|1wTc`I>r6y4D6ClWu7^pZQo~J!OPS7VuhMqL8 z!OnrSWvk$dQ`^H^j-%q_RAbvQ$s|O?_j^)=jUR5;6U%$W6N&l*GzhQodO1J7YeSOK>OdTp$J5Ko7V+I-Zjy6a0Ps z%xVCB`6z3LDQkRo%o9=?xX4 zKks>nZr)6i2XNOKTD_p3IHX%}W!lJbh?XZk=`A5rtI-(q#fgTEkfTkp>7MU4IL zb~8o7fRQcpQ?^i9ubhOIA0eVn`*v%VDQ&lLT`l1soz`s|3x5QAYWT8gpF}zalnuv> zO@MR2i0>TmvBSdz0M!Wdu9Y8snf9T7c-Akz?HaO`sjq*csefxHCYVIfKG>zYxUt8! zz02hkdwb6*<`8fiq3LlTIC18_o

z+^-v*nrEUaA0yA#m1g(i^kbLD#ujE_ z-JUc};K}Hj?7`WJbo>q74`!%n2TA$mo`%Ixb$o~Xw?rg_hx~|N{yQql(}X6!P_l52!#y5@D~l zK0uwp|6$oj(QRvncO~52&HKGxh(`+Sw>_|+!kdV zHf;gbNuRR<4V;1W+6*_&oHOQ7g9zQdWTKN%%|N-}7EGX>u^vUsZ*(K#r$6xYSJdE3 zfK~TsnTE{@Kzhz>c^PWtp_85{Kw~jB|Zk0)ddLK@mNstl)cwQ@?@MD$UMg-olF3UJLfR?D%uJB zN!$U8(X#9{VIcPA0B|L;JQd{A{eoGzobr9OKcERkOvu`gZ@bk<9FgdKaB9y?yT-Tr z4@hB23Ioqn0*6Td%}&de6V$EBV&039&94!YQzu4JT1q}60uqdl)0Fx?2OJer=T2nC zE3GJ)$_`dume~v#{_Y0(jM_8*JtOaKf%zGMzw4$+l_2ruT90av9xsO0z$HQjByyMY zB|^3C8nK8TmLVs$NFEEPpriySk1SdQ>5a7$PYfDb#(RiC2%2o@d+x_upY(Jh-Vq9WfWP2OFs{7?oSy(=|947g?G503 zsFnWzlwkclOwWE@MX9`7k<>o27fybw2mj*OvO&Y26b_C%!o#b9Z>#zrOr$XzP$@Qr@fOj$pR{@TE zYqyyA3(FojBn&5v0ey(@!NxQy37%>4C`hlIlOq3a~%7GV_7CMTR}FoFMc@2#doV>zVle=;$Q zgHj9t58??Px*s3q8tbr?wZz^bxQ9aZ2z${Jo zBL+C`ziug=cm-?u@2?g5;QuWYfXVItKkf;*Df9ThHF2W_{?qXL637UVxtO1uyI5}Z ziHdK%uMFs)1m;Phzj!Py-ratYnqb6aB!<*n?^1@@p^>e>XM)csrKaF$RwWcr4s#2? zaf=SN!9>11AHpndHFvRwI-pNZOj?=#p%9bjLKxv?xD(DX47nI~eHDVVIQPIb!w*rX zzs_01Y*yOpuSpqqZ7{VV$8KFV$iDkw8`<1{I9L6eANGAmxF~M(?uH4|~_$Dk< z3ozj6>2M@urM>R#<$t;^+Nnk?){$HFXQVhUGu(03FFzdHoa0T&tYXYmt`$qdWSfQm z4bFa~!>!ovE6(&2zr2T*wF}~xQj6Rz+_TYJEZ)VIJvI(?haM+#(n*G<91y5a5x9oM z4D=1za8lQYO;Q&A^jW}6eZ!HqBHgn6kaB?AvtylwKO6C!4)7u62$yYYs}U>pyF0QA zSnFoDbN6@=4GFf}8a}qn$G6HS+(!tw-xJ{CU?10W0t`k?-KGt|sTi{cVCs4Ab~pcm zHWQr^7xP{uAya?e_~=msff#WcHpFnzc`Yyo$Rd*(as3-Bqx}PeN=7P;-el@*!Yn~| zYWG_|>q4Xg*bpjZyFj$+eKLVFloK7P>P3xNT+~!S-{8fBz1jSG3FOCXv&Egj?9d2i z0Z8321T^clJ@{<^x^>+9sYst304bF83e$HO){BPQVubL2IAUmi`M5aToYHxb6KcsVS1gr5a7uBmt`Elrs(f?hl!pwG1pW<3VNKb)` z*lO%SNV$3lXl&U};j8$bf}VV%UDFjk1lofFzI@ZiW~Qh=EO3-t=sH5^FY3mUlz$E0 zbA@GFGlbGfqx1e%^xWTr|7(3J>0lI{q^w}inp`Kc<%_6@n+ z+MyfY&QGi0l9mojChbhu@MnXssAGmW*RjsTPn0_by&GyGT=SazE=D#>KTM{YTR1IT zNczSHNSD-fX=FTq7loydIpeX+`y#{M>p7?GqF~oO>6>Cet;tz-;sjbVHGR6!WweUE zYJCxU)d+Ls;^yAzzWbN@pYQ#W7pgunL;%}S&xFe2&NI6&O0roo$l(Oo{Wf>@#)jPu zHVQ*Pm4h&Bts9G%lT3&8TMF+yenDznYyCW$g89v=cVXZ28fmD2Qr_LTw(Zn z=F_zZ%{q57E3BU54eyUS=_L4h*f+}c;V*)tzgOFo`!)F7erP1Rh1B`j-L9^&d49_| zV&4DTd7Vgk+_ z;}R`Yem{Ej$i+hSUMLh1+jxRF-RSo|s%bq$d4!&SnfMd1mMe084!r%DsNK(vsI_d@ z-y$BcX>f=^qZh(ZCO55NcT!p^Y@t08&s0{fp|&*M;5rKm|CZ5j_R%#hP@b3Ct-fUB zBhH)xD-^8B{eRw3YpCp$CEmY|is~qCTjY*0)R&li8rFS5p&YrQQ#w7Q{N}+)KfiU7 z%Xy)zC!Xx!xr1k*r8+5CpUSi7cbw<hn_El0o;Y?o?JMU9s)Fw229>_0tRBr(p$R!gLZY&dUJxA=UAe}U?Ug`o0^)45x`R@rE_QRT9ZraZN#Ur%>j~|ZEhg% z04pP7a*3bTjD)-Zckta#q2tj(Thce^dxV0)Ap>r|Z!ei=d-Ehqty0IGxucrW^V=no z9Dg-CHnwLs@9D`S3trYql?_BodJ}TWJRR9ffiA#}4?T4!=m4jti^-PrGJzg@k zyvWAseBG&Xl#Lz?K85I&M}Y{T0XdEU7;=DHRE)%rD=8v$hu=nK>s(C1z#w(t&1}^e z84=2-?|7I}y2V=VKjb z*~;rQQKss6)$S*D1jLyOB|(BNJ)n03NxP`0+l}}O;#s6GA}8zvRz5{-MLaxUigoPo zh2}@qt143XCz>5}a5o&#OEKiJs9=zZm``6{VY`Nnv}!q)2!p}K)U;eb4~oz$-^3Sf z`%ng)A?k;!;jQ`z9#!DIg_mn1719A5htwOLx*-HZAD>W?2{ z95V^Eh!+X=oHla{ZAc68PknD*x!Du%p9 z{tJMAx%m;$ojRG*w_88VGP_n(RCHL2{8bzJ>bS>ld3t5#ixEb|dMD&07>4GWhzi4o z-6kx#vp%^$tbCPpTg3@)!c~^zia>RZG1(ca35)amTu)N&qiJaC(9aOG<|JA%FKMc@ zPD#K;WTa^X6_`Bp(d#KwHZ%Je7;T|`uZ!vh@vGZD&G(p9RrY!ML|t{^lv6wkQo;_1 z;gb)RBGgJ4f4eyTe(|mt+-dIkAniWzD*?ru92_%35X5|Iu{-2D*56iWl=?c5mKn(#AthkFQr#N#a$WQO6mj z)6$LPwpt9V-pB1^$FRHU1Sm9HWJ6cK;t)y(7jInQYT0MuK)u?p8*wCXsF7ivN5Ki1 zAs$7g&k(8XNis=l&VA<)hd^~pmsV@c45%3{7aD@{xwzjpIlB7TonFSY;tLH$h_b1;ViSClv3AUk_ zbrE7G9~Qndy{4HQ+*^D}gU*p~+g@2iw^ZA}t-H~ewN-Urm~xZ4JyjL$lXkb1W(+N! zyIB~ILchJwenL8Cuk${=Iri{b-e;vRB(Crqxf@$1EnW1_=z`)l1VvQDLo>rQKn+*% zV`Zl10wRm6(%oSf1Jjx2#s0Z3_aR2%ERF}{_{(l9xla>m~U!(z%)ku)*hGh z-vcVt`g&d4OY2{RrTHzh=Q_0^R(_EbOw_$z&*HV8+OfPNo|nfu0uqWEOW9C!;Y7m74JP|xq8udhz}ub zXj%FPL?!RsO+O@FkBGs1zWnz5)wtdLj&c-{kg9tV{S&Tc8C`sSDq==Zzz{bu%^|1; zrSrS=i>TQ6UjX<(2fv*q_zpnGWRzgM1LF}1xbkG};!4!d4b3PZE)aGB%2XmoAJd;e zDPQ0v-DD(^Oj(XVym3T}AL8hKj^sRl1o(0r{+NC5*Y!Xty{P5H0e)p(wL#3L7UwHr}!P7bjypD zE6$y+e-df|(eaeH&_FVSnQ%7gPQs6MT2hBhfI$+2Qcs0+@ z<_LW0_cvspy`jOX=S`ot+A&ust1q^Hoj(|6ao$}1!LE>k<^e=tsOXW4Md5ygM7EP+>-)-3i z`cC+62xJB{&9V%js;Wv&0BQg|Jw2)ckWectE9ECY`H9rk)k$-6vz_`>pxR$iQE`f0 z&uJBE3snD^4;g`hT%jsSr-aRFzMI*xAbgmv2gfF*!T)uPYt8$=q zuY6?x+hnWv#~Pm)$Y!aU0K=yb|AQSf4J7W0?6*!W;97u>9$cDr2$D(A7r@`MX$*Ao zk;rEwaGC-HGKsS}0>^?Ql1^G#_l?l{74cL!H2yCEB>t(9j1+9i6L+~o93^Qf*l1}5 zXVLuO$e(Lxk8JZZ9aoGHw1ATbbC5I7KUc5n;x2(YPqc9aFBt4ao{?VW$aE(S2 zAn2qdGD-2dJTelBN;E}g?3AvaQ7I|#K)rW~1H?-eJ^|)ll<$L?06C8Gb@31h8qW-I zhoLFt;pNZ_;Mp3mvH_N+z~9sk_@1&rVyB(YdCn)EctUpU*dYT01M0OW6QHUzbB16x zpt?^jA{RKgXbKQ!n*n(8N4p$tMNi4kV*05ua6T}M#{ZB{Z26+zd#WuIY6Iq-lz-;~iL-;cZoDM;n0dx+Y&n!SP9?eSp%^xez zB! zJsC8Kn}k4LKu2ef)YsLD&mU0YXUKDVRAVSDE>xcZReh@XKdfNZbeeQEJBxV9v@^QuAJKpgQ zO~ba0jEu;-=BHg z+umlqRRGh><}73!naNC8`MirVwD*(a7$hZD`1EyOhT51>yZ=2+pH)qO#7~o8`72v8 z#Iez{u=igk)$vCHC*gAu5Elb+Er0bAcwN!5 zG&|i#KLDST0MaS0QcEZ!=v*I)8#0)ZE|%aW!vKh*w*?QiD& zjg5b%bph%pumgPrx88cI=EbGJT;<2#zy0lR9kBbgR%{EW@(5%E^x&HXLqGb_k1__I zOM$t{kHB%xg+YW|d@=&!n*~Fh795F&WH2056(<&nh#NNhvbrW|X;>`P75Nf?i7+re zDPwV%ucHI7;hi#xKCP>)(L5)EF_rRbmX^uTSQy0blOawWgQ>!tmx(wC9fUuLwl-H6 z>9k)*Pal}4Q-()l;s-HvIWVXC7|4Q2^!!OjAUlNWKfV7xs19Tp!T6Mf6Dd8gry5=iuC!ykePaQxU&SzcQs<)szmlrn(#ok%C8 z(4Q~M8W({PR7!YqQj(FdRFxK^e_&PtKMl3LwyX#mR8l5FNm*2zPZdM^m}>s$L_{Wn z(9A%z84&f+j!_UXv>#{+?D{fj50<)52F|{ zC6p}7_yp|73P*l(z(KX1On`w>pL727_#5J<2|(f};WKTn8Su}|%Q7VBp=3;6H@aN5 z{GdSXem;Bn*^^oGz%YcFTET2UCeYo(FDg$1iQmiw@Oq|o0kruEMRm|XM!M%j{Dj_P zR^1B9^JRQ!{^#PK50JpyyU-q}`DPlB^ZeZSLz94Be-2181LOH$y0}TMyZUmu|G`J~ zo25JDDnpUvw{NB;&b{aE)z~5B;jmod4 zf$;$V*AOHmes=4uvEvPxMLh)C`#=Br&olJ)zxvg$cFYGKX0px}P-93&W3qPDDqRX3 zO~jyLJ7s(_Du-ITWFiumL7D>LQSsy#iPIZUN}ZS-*G*OI%@CM~AAK?f=6k4PLZUSL z+|b@)30cutF2!EA6mwA!+8+QTbi=|8an^vu4=sRe2q@;s1S|~zLI+t;;*%Lr-FHAE z^MZ++Ky3wzgfamq)$*E}8lC5S_q*S%PC!b3N`0>SBjHm0XZ)AH{AKQ<(n4~98iTR# z2_*8FcD|WGAVWA4kf^;SPWkt~_oxP7JpOe28R9p-fLy3_`=kb{6R%_f2FL^kz6S#s zK(k=O$BHu440wM&D+DR|%`5Bu?-W29629>fn80}2?F4QD zBB6q)GZa=3I@$MAUS2L-BR~em6@k=VIA%FrXz(eth`(XO1{HSS{qA=)o(UDbo^1PAdm2&^Hm!|oRgBDQr|3XGLcJi_Xy0K1)y3_32)z?1~duiA7D7wiohSg zawdSyBj2xdN?cK+Z5 zchp7H2XL}?Li)yG`{z8T-T%r3qm0jUzA@e|Ts}M!LG?k*yEn$&~!`_rH-x9(-6@pE@Kx z$J(UtM3+Q{$K>#%yQHbAMvgtTPX z-0ep%s=4RtKhCAHW6hO|h4^eH(79(MJ#Bq+B^U-klR+bLz-;*?ahtjR74I+1blevc zPo-1p`qR=5eh}N6bX31Okkt$f7`vXTeXexpYCtXsGBW{o^j`#SxZUcDNB`^eS&u&z zENd*wloeWD{aTnDdyWlAZAGC}7JKDD+oA<;W9vI0JjE<*7_t&GN#nyzQqQr!nf zLQ+*;pug!$7#y9}oJ>5^)KnHJqhWcJMrAHKq^7<7gnV1wPaz%m)tmd7K)hGn{;8++ zJb=5l{z_udqB5D3z(QSU;=4%3?}FtEX;@GPD=sAc>7oo>c3C?P}}LfXCnroA(cb>A;FW_snY9j0QiS+ z-#?)U+JP>)&&UpN_xtT@E~7Fw=hJ^H>QuSDtwVOZ@efh3cK=@GCBWnhQ;fFdj-+8UbL%qAIy^!xFt}XsVH`FJ7Wy%euwV z(rCr=esyz|T(qP{mep5az+3nva9^HF#zINGlJH5~Bz^*aGnjZ@4HyUA({&zz$DKwV zBa#PGXao#|YbtsMM2erjtO({z zb$&p4!7MnHHy*W^B3JQ|_+ubuI`N7?KO zQy_ydS^%#ulxyJWJ`Z4WbX>}-Dycp)dxR?tQFgx9DU&p#%L=5rFd$tM zA?Zh7r=29`l#HXlLrD-jLOcy^1k8YQ{}E^w<0xk&62-fo(j~&ZVC21%QEM6yMDL&q z&jk^b@Z9}J+nN{Et@66JO@4M^xD=udz8(^<+i9Faivf94_}LN0@#CXhQ7XuSGH zRCj^Gn|SahVERl4A17gfy&o>meb8 zTt^{+gl!0#jNq&P{9}ii3N%xIU)ulStd?-L82|&p13}HtT;~Ek$E{O$a$zouf#w2r zP|1U~v?1jC+$!A(meOf~Y5@6eiG$EfV2^TT8Pid{r{jqqaVhq@r8M6ol|_ENmKXRi zXkAhqu;NQJ&ZAO`e1*)TeJHG92=+gT-2~eI41{i&6HL=J63wP(9Mc(iy3PZb92%G7 zdk#x~Yo`>!v>j+YDdB+uNkzsaAIvn0G-ItD(s%HX#N$y(gAhl12Bq`BaS2V@1dq-j zaW)ngY6!+-V17;sfNA7=$?%}IZ(OhMA)R#`KT0plPahL%VvKL+)l5RAoj{-0(+2sGC_8I*?N0vSTO1T+9B z7bp{20n$5Z&r_|ZYD1!@7Qh(*#?djzDMCtg`Uu$QGZC*@2f#dX83gYQYWKCb~1xS&-96BWuERXbd)(|Xdo?I5cKU^ zEzX`h4M?Ik^ZT6YGd4a~0UG31tGjE)=eK)A9^WfhWJ;eqQC1;LS8* zWWpj)E-ca?Gk|J-alSRPLIS0oAI88Sfg2OR5W8*@MjVNrgb;zs8OH!6kjM>C&8He4 z1<_OOr^?T(Il3yHp%c(bOPiiRX>Qd1TpORiO+1O-m=84>4Ez1@npnRnlGc16Vf+0EKU&ZB!p2S&nKhfAzh?H2-^K< zR_D_J$WT`lkRrER8AaDb5T=%8<8v7=eF9uQ%*{j0g$!5$CI?LjFBrGA@yCkid;yX| zgWw(km~UacM=*d4iJQ}N4D0}Q1{uQRk3X)SfPp&>|Gjv;d6GthKlRjmv#S7eoq=51``PdcG5h}s{ZA$2 z_MP?e*6~Jp-J`Yg)(2|kc#(y2bxFl(D*;K|WCHJ8`)PFq62c>~>{eg{x#q&zpyd@U z4iZ1FcGR4~Yp(>H3-MFpbNMj)%K%sMks-{c3DChrq8|%d2Y_&dnCZTO(Xdn$S&mpg zq*B)~Y)F`d1TuzP8=ixVnOj$=r!XaoQU8h}ud4qBh-c1vpb22?dn3(h-{;!+hS+Hi zFy5p$fm3}PpHJ6$07ISaU;+Wvpb8q7ff>C;;zr9|Ub9){!|8kMrja&aW$&}2h8 z1z1{FuM(anK!GPuMqzr8AyDnl2lJo`PvFvCz5;IdEdkT32JurHXeiE?5ipgyLfH8M zAL4zosH9M8VfT+AFHRXQDJw)=f%*f6zy!DtAOcO!JX2OnPDIZ>Re!4ZRR75psR7U- zNRG!V%>gn5vurpQDBTIUi-NeQBKH%=W`PiA31)(k{8asE`xDHSj3IY6AQwK-e!{V~ z+}cF2GJkq-lK8pq-w^)xmxiQZx%(790CDvOU?VnVsPt(9S0ncO#aJ>Mx z0zc!^OEsS*>#XwtXiChN3Cstm0T6PTfZ10t6G+^a?55Cnse~ut_d_}p`bNT*bo0B^ z0Z6GIvn37J1JI7=;PgR52=Tyq8)i0^jDZJPn%}hNxt8A8`}75vz-P4i%`>Y0#`ZU9 z7*F58(|sO5<%$-mTU0OgjSbSWtV!xxmdc8CYh=Uq*Gffcv6L=qmX#N;m*y2qrK||| z^^H;t6Jg`^SLnHaK`=-z_#r|2xM~u_TML3tLK9 zi_3~-6ikLHe+2J^-hSp)SLjp5z@yeC!BAKZcK|j*BO`+_%ZBxheC9Ks(dEEY05t%13Yi193@dgH&_QUX_Hw8AW_te(gKm#Of5;%#S%z(sf>iA9X`}DBT z^YQ+V_DxDzZIOL94dcO6kJLV2$Tf$~2PPp!xr>rO;y2&~QSsTV0F|6X&Sk#ClL=YV zTq?s8P)$oLje&$p32sz=t`p$B0csKS2N%<<<261VXM z@IKcJ$i*Q%-RA*>!5l^>!@4xLyKhjOZiftwj7oo3H#FyA2@MTP>(O=@f<52eHzY%# zt>MuL=||d8n8)lpFK|3Ci)q(eM|MLfCsV31QS~qKd132&K31`4tzuS)C3rE%>XV1CQ)yDAvj;Z zCAEK5)*%nw8k9d?IxeA;DP0Ie=0HawR||5JP%g}L1k%pm`p@mz6@cgK1dPOZpr%D= ziII$K`Dj&!*SP?91Jaf^Cj#+af1C$!2{F$Rpt|oQ@geXx&4SsM7gOCI55}@iKXv$l zAy5kP_uyDW%AsnS!$25F986mj$kQ1FE?nVYq(6b+#DE(MC$eG0KFEUyTM`UAU|zK2 zjgyao_XI=q28D%7NSyC zQzcam_2P%E?=LKpnk7v#3KL;+d_wzdBplOay6i)qlmwbZ53!xr(O!(F+TL7RC}oiR z1XiAlgeJfMxK_Xf9tz??-*A&rI+IcclLA9#cX`3YsMHRJBPb&y1Hte#1E7jeuO=lu zr9RgKY~H+CiJs4>wwsQc4d??fgl`;tl=w3@1(|2L3x((dU@%O8VAOwtSrBB*fL!7? zK(Bt^*Tat98mmd|<&bK~DiO~}(a~g9GvLA?!px<>1mg&#wEw?5tUU;3AWn? z@EhW$q%*dEeO2)(&q?egd|nw(MlcKpL8(qKUT8W1^SzwIJ~a@?Bj|{t8o)eh$J6#V z^Zv%hKhwGZrZs`_PxpBMeTR=q&%who+S?;j@dVyIUOwn34O>4SV>mW8D!m7eN#F5f z5*&jt>g$*OW37^c20;iy<50r(d%*lK#%(4_^_^=2=e;PoS>5^eG28z0+u;ZIy z<1^5i7)eg)f-EuyhA7ffOBjLuUt1K=FBDZF-J;?mSpxGR%K)g>ljtew8R+;U*QYOl z#LpQ5#-Hh6(1#v+NQs&bK{5>zJ`V{o&OxpRpxQ)}AlDSg1;YeL@Uww21MJ(=VC}{3 zQ|iVACl0XFk({H#N;X@JWws;12xJ13_FwqW_w-a?#*z4Q&jdIdkkEMsAPJu^SLsin z({HfbnxiI642S0I2qeM({y#DbEvoD_}keKNNBtaV@Cs6IDAAm$o>5pNpOt-SNv5M_*L4|>ray*fmg%h zzqk^xzQ`{tDvG2L41s~f-&|S@+rI#eff_-cngnDtTw9Q(44wx_Nza2pxi)|dfsN#g zhArd(K|8o?n8ZC3$Vo}uxnQ&bqXkgaV%%)Uh2?^o-pe%sW~%&Wg8h4vj>-Gtj=F2T zY6?W78A%Sp4yr{SA=dxfftA zQ-JdU61Y+G`I{;!=lT5@e0=xx`jhDC3^c$Qf_2NPWbbjyOHQEOKMZqXjO)^)klI=G zKPuyB1D{RO2E`zx27qD|jGa$Sz<@CW2>eae->CdF3ycqdxbxZ1|ED|;ULPDUzH=5;H9_d_M8 zbm!rqyBqPU%~bC!xcZ^XPnGV(@f_;kkeWPhY@%q<=2Z2jI;y zh5j5sCeN^_xC z5TX!3WC|gu_SCF68$jY$2OjQ6B5`OC5y=NLAOq+7<9Y)A?uQo90LdSLIl@IjJRF2| z?--@Fk(Qwd%r`CN3_ul!gX3Iaw)UFoK{L`ksarj{JFr*K=T1If%!^*0~5oMKl^5>4Qj2%HEfmB8uz z<5pjuInMzq5dy3Yd;*!`j55oz7M z7f+xm9XlZ>pL|LN+d5Q32@VWPVscWt4X!Gb>!pS03;|z4yx)w1rYIV4fk^2MvL{1sjX3-IIoSsZg+bUeWNB{KZCD~-|J@Vv%!`-E zqX#>s5jN%TpEw~mU$RVg9_^72zU*rG*&_$!MOR-WU-{*Ouv_Vja!UI^N*331HJeCV zKkQA2wzMN7>uN0r;N^?l^1IH2Oq7IVv@IY7i1t9>2fScFoJnYmNT>rUIYwnBi9g_d zu^s3kV)6;q$zkgO`ZlApM=I28-pOmtHe-k9WRXtAs&2>LN*HkR% zJOKT50siKp}2K)9jc-B`o&HC)Yz1Gam);%X-pIhqp?i0OIdC|4<$Wv`f{A37A z>MV8j_0QfYWEjD4T)uP9lXAnRB|^=$veY3Bm7EnwLt98=09uoMoZ~(^Y-y2q9f(0? zU=Gu9p0!s2+*sOyU`c|8*OE@O-P{*n#y-QRyl4s`8O#=DUH{0lx0KwB~kY<+(+bI+TT8D8zEKM6E^;n1Hnzq3J< zUckRWc2Gavoh;yKlQ{O9A2OP{$^83FHeuMA^@p=?|(khuTw_;Fd@P$37~2c@B^ zM6btp+#}63r7{$Z$!C7_2#C>=!oS>hP#y-;_`91n>GMYpwn{~T3xo~r7SetkJcNb7 z+|<)?D7_bhF&v&uNm;QI0~OB)1LCTNNdcU)fI|+9P_k#_sg6!)06grH>);*Y!RYJ^ zfmbg^HZSx@(Q0EhSQk!#jnCQo*skcXc-B)47vB6LJTb|2X- zb*0{)*f*fpnLue?v*8A11SN&s zlp>OXjoARn-vk1$EcVNWWwojaG**`=qbMi{C?3HDD(ss`$@8zgS_$8Y!B}1Bl;(y- zvbfwS`IW1MUKgcO040AC!|BHAEwZ}CC8H4@V(E~kA{T7@wB#i+vbHKuc$9+=OknR| zN~XX7Ccz+5?S6?K4Tx`+o_M;>1BgqZ{AT-;GSE3J*Isg+bcaLGdZy%tm34B}iUujG zs*)JArMA{%(%0K6SFE{G!civ}#6CIn)Ja)V%BjHV{rvTX0o~8Ps5n2npMP;lzAP&* zIBh>aH(f0h|1<_biC=LMxNV8ZlIMyX`w46daOy`tb#^AOdTT1P>gQG(UU{z%Y`FUK zfs8afE{XQEbl<+(jE6r9a7wb!zgLd$U7=UA)pIT|o^i?E%gQp7!TEjPpLHPd&zv4T z6Oh0s#uHNB8WG3d=~)yq1wQjUVa4%xE@L1VDNo`bdYMJ=tp^6A?a+`0Y6pDAFjEVl zqpEN31M(!){;SqD$=2N`7B?(5g5RYO&)QB_}_eqU-rPh=Y-rSRQ{n@1`;i!E9Bx+4#|UA0O2P8^>|cPR9I7k zPv?06Tedt$o_F2NQnqM`9PI3rqX(ao39j3Ryl?M)Qij@}l(CUs*|KW6T(jj;`R${R z$fD&JOUzj*#Vyt>!UQBY&2p;o3|(VE^xcG<91TkML{M5sL&Ej`40;{_TFR+D0|uYx z0Wc(zDTzY$XI?xHU^tT0vjAqE2S7ND0fa#-hrTOPeTf|bC|ivJ57{?ofXV$wCD=Xv z(U1&mK?5ZI;UyDF_=jI;J`nZi0ZMx=KI-rIN4@8jo1EsV1teil@i=T==K~~s6V3-H z@vG|s67adDtjMi|9|%}#H;F%SiM4oYpf@64|F}I*YJ*Y#w=Yl1u|2&?e$;+c%NYpt!YoI-roMr$V?_?4O#gaP}+Cr&XNCjXZ{51_oL zS`H2m$#7?nbaow=%@?hb7hHd{{OZX)a^h&4l$FHf`IoJia3UxjV}s)Lc%`VILRPNW zEP)JE>`Yn)Ls8-JUR8+Anx_AR{dEn$ay;jJ9=XV$x%$BDUlTqb z*tc(AX5G4VbHXR#7aa;q7+jlEUzrWX;y*Yk(KXW>jAk-`T$m~0DfLPG+nT3j*}7^q z1$cep4r^&JX90{OkZ?RxCrdKjx&Y<+i>+@e(m_~WQXp%ZD&?MC$7E$wl@fj&1NGUP zmSr7@grbellgZr}JOD%Be4hK8rUdbMy?^IEozLcYxCPBIM>g$CR_$g9{^YPz2X(G&~|bwI~TO^ z_X}V6!VEus#<_B;^u*_eAI|j?pZ);)0EqvoPko9gdL97x#t@b-U#_1{BmU^7#d6st z*UG`ePsyeg%cWytMCaXyy1Kx~ol@#e$#B90bAcukRBmTJm~FK*HZPa`2Y1N3_k3S^ zV2gA80~v6c->XFKN7*EN9_7W;mMWpj^Dt23<>xtq{YbYQs(o~d4pB>@li*4C+=WeL zB?kMSWX`hy2;2ljN1+=Jxh42C4S>*ejoU#@;AhXiS&5&1fU^N@daC^-{72pwagg|F z@AKKwWJD$ZT!?>i^1m|OgOi!Mir*;{u%pi#DDi{Q4brj!S_!V_dscyg7k3t>)w0)L{p~CC-oOjKyXKtv&z5k`@`YLfrM@Bl(yD?i6EN`8hpjd5Bv4B9Md@xSgZ;?eXmtKjwQqxj z4@TqiFtmYupC?Pa%j(Lq#7}&N;+{wJ8G+A;PYr=r<2Nw)1Ud^z{KbAw1!|N88X_`q z!Y^xz!4WXt^FawEK9QYmQ#z|q;B(5wb=H7>y3Yexz49_SbY#Eel?3F0#~zgM$ieaWk#1QI6QHKFK!zr!>rd0*rw<=Ijo3-t21xk4r%!>9 z`;7SJp2Xiek`eCe4!{gZ_Cfu|SY`RHI6rf3b$waBLl?ksffo%kIu4)i^8gwv%4Dps zSH`-!<@wj$AS*9fCzTBia_wc;LW*;y!Xq^Wl^}4MbEr7 z^`C2i2GXc;JmiD%=L7r@r~!T%h(O{W?VUK~*_nX8fPlRL#FY!#Cz$AdL{fRXagkH zXF=V+7Q{?RKLBRH*#X9r2^eB0khpnI+n>OA^UP=pd`3K;A<{aYk)@SRaigEB@}1I% z-~{0x>cv9{`irXbWO12Gp55Y=B)Vp_G$c=rrQ~=p^|YS{u;=JO%SKP6<*B}tu-h{d z50A@<-eb}=HXu(N+Aj}2{)9xq+@1oX_~X`xWGa%76GJ_cjE&2&5q@1bB14g=4C5W} zO6l%}?N5gz%>vRZkM*dqO@B6@|TI4*wwGGnjkASs6ft zUo%+%tZ)ZZ{Xbu?|77f?D)|X-{rVQ|&rBdA;P?LL0{kZ6 z#t#=|YRfH$81cigpzQv%^=Yzm0Udpm{@htNd0)S317r;L6_nLwdmiT;h>{fhklBS+?B25|c>zwR@i@A7Ybf45_zCnC)&7fIA6 z{K?_C#_P>_0LyJ!(WqB4g5b#Ps{5J1Ncx1mo9k?nekguas5G z%B8HRK#p|xNoQzC9y<8AxKmvG6P5KXt29sQ&HM-`Kb}H$pX>bfD6j%c^Q$O;89{rW zl0BK!v=gzI1fU@h92p+#o>6=PXAns2)CveGy8QvfXJ9PT^;`5gN20s73ZbyE=Eq-ra)(0>b;Q4){W0sA{S%5P^5(DR{*8VIZ9|HrX z)9=OCT%;fP7(290>$T zY?H`TRH{oV>6#U2W1eu|{}hOsK#x3E@Ugbw(!#oU7+S378TyK?czW0B=Kw_u;Z=8X1#W%pIz$gaP z*M1$Fa|S-2S1QW+_1@FZC!7hK*8BCNM`U<1B7>n6>|hWEhqCLGS=^07sLZZIWl)R|Ls|$&0N}Rfia6bF_|CHwegoj4u`8VAxySq-v;5Y=w zRG#$oj>~ViJ&Ae;Z3_gS2BN+U%GJuYLi#sj^Xa>v` zXbKo&r~Oaj*9UWih3?0n@Av%;82n$n?%=%YPv%Vx;2&P(pI1eOA+^s1BvNZb!jT97 z0RQw!L_t)azC)$HI~~`Zeps|;@3?KV>^jl~iN9EV2Am$`6d;3<{D#QgsfhkI z_(syxBrvl9#yl|as&ziuQ0tOFLsT;5VJU>-IR=fk28^?!7+r_4`oI(I;z>EA5b6gB zf52X7_SbM8z%TE;N2&@6<jX4fz}@dU z?D+Qc9-VU@Mhkf4qdoH~pK3qNH);Sedm3ymkg*qxoDUNqEUB+hiCk4yAQv@PsgsWC z`Y6nYP}K5aj88_@^UuI3Kx5AnNaRN96VKoqNlzeC;B&(?h|g7kzd9V3lY?oAcL!vo z(+~UCCCkcb#|j22)LMI#^7`G~mP%Y*>eP)yPxpBMYc^dhF4*JuKK2NnMCI^Mr`)^i zF&Tnp5JA5sk`8HTZkA(v_sdP2w#YMJCQMBwPwbkZN4v@ z5)vLCR#sYuc3KXZm6xrQcsMRDpGyXg49M8zn5^2oN(%jjlJ=%0G#1jOp>xH*;;Jj; zsRK{_N$_9r_cgM5-DR4-z4f5xv2+<7RP@4IQX@JwA${GQQrEZy?}936S`O}cOcEGK zS6%;s8E<87@WanPC*$^)LOq?5?zVmjhT@QjmQ6k-uy-p8WDpFbu)I)-5QedYF!qWI z{W38gl@I*i2NqQRk9TrpSzuIf<-CA2)Z~nc^MyM;W6efTJ7GNt>?i(a zoB_6t!Ng^+_q^w}jB}!2Hx5ihld2Y!_^kEFlh7|}3cWga$YY&y=McH2@YqmTUjFYN zhML~39mMU8ba15cGI=GTPbESq80v;QAo183)F;a>&hr$=qg!{$@9*9t;R)JKX)S|` z8TercGJ$c}z>M>{d4^nu?_PM$xdEOM`>l_^R|b1KrEjoTYOCtxms=l~o3B_aqZ6Zg zfA7wxPoyqut^-x>JThh~>pTFvk#x zGbzq|hZMU!`X!-!zgvdJqEcDv*RjR-*o$$qc73_DAD@)2!3q6*HvM5RZ<`w_EoYUti(oCTkJn$51GsYmVO!xDLKPqt$_p;@yrJ4(9=Eg)4M^v3znnaN9PLTT$j^T!@siE*(wDs)0;)j1^e+D4 zIPdsQ`Q*QUOIIzjE(UT5e z?)`1n01gB^GCUEI9fy154^JGH5U6?E{*#jXZF{DVgBT2uutyNwXp?~?)T5ceGz6w6 zli(M3I8gGY@{|x4En6f-rA1P=xK3XC_SZ@&RN&6`PN{CFmRoPTRj$~4h2;73WMXnc zM#e^`HuT{$kE4-T7w3-e=2-R3lcvG znxVX*QoK%!NoP_Sjq~LDq_nmS^4OYs3X~K`5(1;3tWdfKgSz|dQ0J(moEfQW$d}*z zvR(2D@$T&L(cDs`#7no=vUN+Prm8}E2Ka#sm(j#_ecQ3 zD8Hl><7-@O-#Od)ZH~nYyejN8BH1{erz=3g-L#vecdHpH0C6pn~>2pRh>*FT<)<$N5%C-mg-9 zL5t=$?@j6ye|{OXceAUx+tl{vbN$nb(&T$&2$CMJo^^)_<2Mg9&63SzNfdsUmwcKx zpiO|@oT7K`sz#3ak3ADJALzdY)#fsUUsG`h6gaGUuS*9j>iUp*9G_mq*Gl8gj+Ntn z_VUO%Z1TtZO08him1&&P^4~zu!x`d$%ie!qw>Z;Hm^l(WcluT=C%v(dz9Klgg7Is* znRid-&qBR4saorqsK$|aO~<-VA`h}IBm%d~@SM~!0<1%^qA?g*zXemc`M}uyAIN-) z*_&n-pOBYFca@&4KcOf)8Pfa2+r5$V+f*m#yJY2sM|#LcR^e@pU2{ZZ2}WVd;tYmL zW1rg7evG;@9g-ffCv#=YoHx_%RfupeO4FVcdwX)OET^3%#n&FD^S*KIPLXSI(k+sB zzS_CxVc>X-Ro>D~CMckgr>r#GkM8r{Gs+J5)v3fZt=iWm`!3g^pZ5c?;8x4uzy5sW zvN1SPuZ0jn3R{;*Hi*9G*xlFj4Xb=o>}p>NCH`rlD_YNN{LMXA5iUr{`Y63HC5m%|_vhgX2D9?U&@9XXmj(?@}-t4R@Q*9niVT)%epe zt(SIQdt3bWd*^S}Mrl_{h*&zmYjwp5Ry5$bDX^Zxw|3AM^4KFyvxp9Q;K9OqQ(>)4u2p(~h6sXv$D<&EE zf*y>y#l0R2L-N~ud&dx)9|osn?GMF!c(8|t6%r~g7v>5nIDz_c)yY35bWO`|$#!g9 zA2DG@I!-(p?rg6fY4})Hv|X7-kxx+|vrJUwoo?Cg7KOj^^0;F*FcT}2DTQ$gl>H<^ zWVKA+IuxV`iekSOxnQuaIH2gDs(UqfKJZYNpPiHpXDZoPT_b=VBp+o-;bs~e(B-_9 z`A%{<>R6qkclFVM+svPr!`wbSZbfL$jEWI`M{)8~D=E>0 zZ@C+fCO~t4-auWWta>#i_Qe=<=Ej|Rl9+|%p##rYVB6=Mlj4hSZt0}!qZ4;Gjn|benE?0$nV1z>=w-=KZL$6s4ON* z1n#axcEaDOP$$3i2KHP1i$X|v z1U=u?Z2zfoidI~F$;*V=or({+N!9MEYCAWoEh>X~rY~jCQ;Yaj_r)pl$4ncG4Oe@@ z$Q$=E|HhMFil`fl;7fm#cGcvDse#?qKg7JbyV-9ZRdc6)22OyPKWlPl{ZrP&641WR zQ2;(-UnBTwF!RQah�P$K;CK+UfSww1`X@`|XJLg;jGI6ho_;V=L9 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 O0000 + public sealed class AnimationSerializer : IPckAssetSerializer { public static readonly AnimationSerializer DefaultSerializer = new AnimationSerializer(); @@ -48,7 +49,7 @@ namespace PckStudio.Internal.Serializer return stringBuilder.ToString(0, stringBuilder.Length - 1); } - internal static Image SerializeTexture(Animation animation) + public static Image SerializeTexture(Animation animation) { IReadOnlyCollection textures = animation.GetTextures(); Size size = textures.First().Size; @@ -58,7 +59,7 @@ namespace PckStudio.Internal.Serializer return textures.Combine(ImageLayoutDirection.Vertical); } - internal static JObject SerializeJavaAnimation(Animation animation) + public static JObject SerializeJavaAnimation(Animation animation) { JObject janimation = new JObject(); JObject mcmeta = new JObject(); diff --git a/PckStudio.Core/Serializer/AtlasSerializer.cs b/PckStudio.Core/Serializer/AtlasSerializer.cs new file mode 100644 index 00000000..9eaa4b6c --- /dev/null +++ b/PckStudio.Core/Serializer/AtlasSerializer.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Pck; +using PckStudio.Core.Extensions; +using PckStudio.Interfaces; + +namespace PckStudio.Core.Serializer +{ + internal sealed class AtlasSerializer : IPckAssetSerializer + { + public void Serialize(Atlas atlas, ref PckAsset asset) + { + asset.SetTexture(atlas); + } + } +} diff --git a/PCK-Studio/Internal/Serializer/ImageSerializer.cs b/PckStudio.Core/Serializer/ImageSerializer.cs similarity index 96% rename from PCK-Studio/Internal/Serializer/ImageSerializer.cs rename to PckStudio.Core/Serializer/ImageSerializer.cs index dfd4c3f1..07f86568 100644 --- a/PCK-Studio/Internal/Serializer/ImageSerializer.cs +++ b/PckStudio.Core/Serializer/ImageSerializer.cs @@ -21,10 +21,10 @@ using System.Drawing; using System.Drawing.Imaging; using System.IO; using OMI.Formats.Pck; +using PckStudio.Core.IO.TGA; using PckStudio.Interfaces; -using PckStudio.Internal.IO.TGA; -namespace PckStudio.Internal.Serializer +namespace PckStudio.Core.Serializer { internal sealed class ImageSerializer : IPckAssetSerializer { diff --git a/PckStudio.Core/Skin/Skin.cs b/PckStudio.Core/Skin/Skin.cs new file mode 100644 index 00000000..95c14b7b --- /dev/null +++ b/PckStudio.Core/Skin/Skin.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Core.Skin +{ + public sealed class Skin + { + public SkinMetaData MetaData { get; set; } + + public SkinIdentifier Identifier { get; set; } + + public SkinANIM Anim { get; set; } + + public SkinModel Model { get; set; } + + public Image Texture { get; set; } + + public Image CapeTexture { get; set; } + + public bool HasCape => CapeTexture is not null; + + public Skin(string name, Image texture) + { + MetaData = new SkinMetaData(name, string.Empty); + Texture = texture; + Model = new SkinModel(); + } + + public Skin(string name, Image texture, Image capeTexture) + : this(name, texture) + { + CapeTexture = capeTexture; + } + + public Skin(string name, SkinANIM anim, Image texture, IEnumerable additionalBoxes, IEnumerable partOffsets) + : this(name, texture) + { + Model.AdditionalBoxes.AddRange(additionalBoxes); + Model.PartOffsets.AddRange(partOffsets); + Anim = anim; + } + + public Skin(string name, int id, Image texture, SkinANIM anim, IEnumerable additionalBoxes, IEnumerable partOffsets) + : this(name, anim, texture, additionalBoxes, partOffsets) + { + Identifier = new(id); + } + } +} diff --git a/PCK-Studio/Internal/SkinANIM.cs b/PckStudio.Core/Skin/SkinANIM.cs similarity index 93% rename from PCK-Studio/Internal/SkinANIM.cs rename to PckStudio.Core/Skin/SkinANIM.cs index ef3136cd..16468bd8 100644 --- a/PCK-Studio/Internal/SkinANIM.cs +++ b/PckStudio.Core/Skin/SkinANIM.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Specialized; using System.Text.RegularExpressions; -namespace PckStudio.Internal +namespace PckStudio.Core.Skin { ///

/// Represents a Skin Anim value where flags can be set @@ -56,6 +56,11 @@ namespace PckStudio.Internal public static SkinANIM operator |(SkinANIM @this, SkinANIM other) => new SkinANIM(@this._flags.Data | other._flags.Data); public static SkinANIM operator |(SkinANIM @this, SkinAnimMask mask) => new SkinANIM(@this._flags.Data | (int)mask); + public static SkinANIM operator &(SkinANIM @this, SkinAnimMask mask) => new SkinANIM(@this._flags.Data & (int)mask); + + public static SkinANIM FromValue(int value) => new SkinANIM(value); + + public int ToValue() => _flags.Data; public static implicit operator SkinANIM(SkinAnimMask mask) => new SkinANIM(mask); diff --git a/PCK-Studio/Internal/SkinAnimFlag.cs b/PckStudio.Core/Skin/SkinAnimFlag.cs similarity index 98% rename from PCK-Studio/Internal/SkinAnimFlag.cs rename to PckStudio.Core/Skin/SkinAnimFlag.cs index f4f8af0e..a0475ab0 100644 --- a/PCK-Studio/Internal/SkinAnimFlag.cs +++ b/PckStudio.Core/Skin/SkinAnimFlag.cs @@ -16,7 +16,7 @@ * 3. This notice may not be removed or altered from any source distribution. **/ -namespace PckStudio.Internal +namespace PckStudio.Core.Skin { /// /// For usage see diff --git a/PCK-Studio/Internal/SkinAnimMask.cs b/PckStudio.Core/Skin/SkinAnimMask.cs similarity index 95% rename from PCK-Studio/Internal/SkinAnimMask.cs rename to PckStudio.Core/Skin/SkinAnimMask.cs index fc7e7b47..5daffe91 100644 --- a/PCK-Studio/Internal/SkinAnimMask.cs +++ b/PckStudio.Core/Skin/SkinAnimMask.cs @@ -1,6 +1,10 @@ using System; using System.Collections.Generic; -namespace PckStudio.Internal +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Core.Skin { [Flags] public enum SkinAnimMask : int diff --git a/PckStudio.Core/Skin/SkinBOX.cs b/PckStudio.Core/Skin/SkinBOX.cs new file mode 100644 index 00000000..aa0efab8 --- /dev/null +++ b/PckStudio.Core/Skin/SkinBOX.cs @@ -0,0 +1,180 @@ +/* Copyright (c) 2023-present miku-666, MattNL + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Numerics; +using PckStudio.Core.Extensions; + +namespace PckStudio.Core.Skin +{ + public record SkinBOX : IEquatable + { + public static readonly SkinBOX DefaultHead = new SkinBOX("HEAD", new Vector3(-4, -8, -4), new Vector3(8), Vector2.Zero); + + public static readonly string[] BaseTypes = new string[] + { + "HEAD", + "BODY", + "ARM0", + "ARM1", + "LEG0", + "LEG1", + }; + + public static readonly string[] OverlayTypes = new string[] + { + "HEADWEAR", + "JACKET", + "SLEEVE0", + "SLEEVE1", + "PANTS0", + "PANTS1", + }; + + public static Dictionary KnownHashes = new Dictionary() + { + [unchecked((int)0x9560320c)] = SkinAnimFlag.HEAD_DISABLED, // HEAD -4 -8 -4 8 8 8 0 0 0 0 0 + + [unchecked((int)0x1f13e4a3)] = SkinAnimFlag.BODY_DISABLED, // BODY -4 0 -2 8 12 4 16 16 0 0 0 + + [unchecked((int)0x407c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -3 -2 -2 4 12 4 40 16 0 0 0 // standard (64x64) + [unchecked((int)0x867c9b27)] = SkinAnimFlag.RIGHT_ARM_DISABLED, // ARM0 -2 -2 -2 3 12 4 40 16 0 0 0 // slim + + [unchecked((int)0xca3cf050)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 40 16 0 1 0 // classic (64x32) + [unchecked((int)0x879b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 4 12 4 32 48 0 0 0 // standard (64x64) + [unchecked((int)0xe8c79b27)] = SkinAnimFlag.LEFT_ARM_DISABLED, // ARM1 -1 -2 -2 3 12 4 32 48 0 0 0 // slim + + [unchecked((int)0x1910e24a)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -2 0 -2 4 12 4 16 48 0 0 0 // 64x64 + [unchecked((int)0xce263773)] = SkinAnimFlag.LEFT_LEG_DISABLED, // LEG1 -2 0 -2 4 12 4 0 16 0 1 0 // 64x32 + + [unchecked((int)0x5da5e24a)] = SkinAnimFlag.RIGHT_LEG_DISABLED, // LEG0 -2 0 -2 4 12 4 0 16 0 0 0 + + [unchecked((int)0x4bfe0142)] = SkinAnimFlag.HEAD_OVERLAY_DISABLED, // HEADWEAR -4 -8 -4 8 8 8 32 0 0 0 0 + + // ------------------------------------------------------------------------------------------------------------------------------------ + + [unchecked((int)0xe693e4a3)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // BODY -4 0 -2 8 12 4 16 32 0 0 0 + [unchecked((int)0x8e322609)] = SkinAnimFlag.BODY_OVERLAY_DISABLED, // JACKET -4 0 -2 8 12 4 16 32 0 0 0 + + [unchecked((int)0x860c4433)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // SLEEVE0 -3 -2 -2 4 12 4 40 32 0 0 0 // classic + [unchecked((int)0xcc0c4433)] = SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED, // SLEEVE0 -2 -2 -2 3 12 4 40 32 0 0 0 // slim + + [unchecked((int)0x91407908)] = SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED, // SLEEVE1 -1 -2 -2 4 12 4 48 48 0 0 0 // classic + [unchecked((int)0x79807908)] = SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED, // SLEEVE1 -1 -2 -2 3 12 4 48 48 0 0 0 // slim + + [unchecked((int)0x4de0238a)] = SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED, // PANTS0 -2 0 -2 4 12 4 0 32 0 0 0 + + [unchecked((int)0x176f238a)] = SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED, // PANTS1 -2 0 -2 4 12 4 0 48 0 0 0 + }; + + public static readonly string[] ValidBoxTypes = BaseTypes.Concat(OverlayTypes).ToArray(); + + public string Type { get; } + public Vector3 Pos { get; } + public Vector3 Size { get; } + public Vector2 UV { get; } + public bool HideWithArmor { get; } + public bool Mirror { get; } + public float Scale { get; } + + public SkinBOX(string type, Vector3 pos, Vector3 size, Vector2 uv, + bool hideWithArmor = false, bool mirror = false, float scale = 0.0f) + { + Type = type; + Pos = pos; + Size = size; + UV = uv; + HideWithArmor = hideWithArmor; + Mirror = mirror; + Scale = scale; + } + + public static SkinBOX FromString(string value) + { + var arguments = value.TrimEnd('\n', '\r', ' ').Split(' '); + if (arguments.Length < 9) + { + throw new ArgumentException("Arguments must have at least a length of 9"); + } + var type = arguments[0]; + Vector3 pos = TryGetVector3(arguments, 1); + Vector3 size = TryGetVector3(arguments, 4); + Vector2 uv = TryGetVector2(arguments, 7); + + bool hideWithArmor = arguments.IndexInRange(9) && arguments[9] == "1"; + bool mirror = arguments.IndexInRange(10) && arguments[10] == "1"; + float scale = default; + if (arguments.IndexInRange(11)) + float.TryParse(arguments[11], out scale); + return new SkinBOX(type, pos, size, uv, hideWithArmor, mirror, scale); + } + + public bool IsValidType() => IsValidType(Type); + + public static bool IsValidType(string type) => ValidBoxTypes.Contains(type); + + public bool IsBasePart() => IsBasePart(Type); + + public static bool IsBasePart(string type) => BaseTypes.Contains(type); + + public bool IsOverlayPart() => IsOverlayPart(Type); + + public static bool IsOverlayPart(string type) => OverlayTypes.Contains(type); + + public KeyValuePair ToProperty() + { + return new KeyValuePair("BOX", ToString()); + } + + public override string ToString() + { + return + $"{Type} {Pos.X} {Pos.Y} {Pos.Z} {Size.X} {Size.Y} {Size.Z} {UV.X} {UV.Y} {Convert.ToInt32(HideWithArmor)} {Convert.ToInt32(Mirror)} {Scale}" + .Replace(',', '.'); + } + + private static Vector2 TryGetVector2(string[] arguments, int startIndex) + { + float.TryParse(arguments[startIndex], out float x); + float.TryParse(arguments[startIndex + 1], out float y); + return new Vector2(x, y); + } + + private static Vector3 TryGetVector3(string[] arguments, int startIndex) + { + Vector2 xy = TryGetVector2(arguments, startIndex); + float.TryParse(arguments[startIndex + 2], out float z); + return new Vector3(xy, z); + } + + public override int GetHashCode() + { + int hashCode = -1311939065; + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Type); + hashCode = hashCode * -1521134295 + Pos.GetHashCode(); + hashCode = hashCode * -1521134295 + Size.GetHashCode(); + hashCode = hashCode * -1521134295 + UV.GetHashCode(); + hashCode = hashCode * -1521134295 + HideWithArmor.GetHashCode(); + hashCode = hashCode * -1521134295 + Mirror.GetHashCode(); + hashCode = hashCode * -1521134295 + Scale.GetHashCode(); + return hashCode; + } + } +} diff --git a/PckStudio.Core/Skin/SkinIdentifier.cs b/PckStudio.Core/Skin/SkinIdentifier.cs new file mode 100644 index 00000000..cec8e9aa --- /dev/null +++ b/PckStudio.Core/Skin/SkinIdentifier.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; + +namespace PckStudio.Core.Skin +{ + public sealed class SkinIdentifier : IFormattable + { + public int Id { get; } + + public SkinIdentifier(int id) + { + Id = id; + } + + public static implicit operator int(SkinIdentifier _this) => _this.Id; + + public string ToString(string format, IFormatProvider formatProvider) => Id.ToString(format, formatProvider); + + public string ToString(string format) => Id.ToString(format, NumberFormatInfo.CurrentInfo); + + public override string ToString() => Id.ToString(NumberFormatInfo.CurrentInfo); + } +} diff --git a/PckStudio.Core/Skin/SkinMetaData.cs b/PckStudio.Core/Skin/SkinMetaData.cs new file mode 100644 index 00000000..0077bdc5 --- /dev/null +++ b/PckStudio.Core/Skin/SkinMetaData.cs @@ -0,0 +1,14 @@ +namespace PckStudio.Core.Skin +{ + public sealed class SkinMetaData + { + public string Name { get; } + public string Theme { get; } + + public SkinMetaData(string name, string theme) + { + Name = name; + Theme = theme; + } + } +} diff --git a/PckStudio.Core/Skin/SkinModel.cs b/PckStudio.Core/Skin/SkinModel.cs new file mode 100644 index 00000000..63f5b519 --- /dev/null +++ b/PckStudio.Core/Skin/SkinModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using OMI.Formats.Pck; + +namespace PckStudio.Core.Skin +{ + public sealed class SkinModel + { + public readonly List AdditionalBoxes; + public readonly List PartOffsets; + + public SkinModel() + { + AdditionalBoxes = new List(); + PartOffsets = new List(5); + } + + public SkinModel(IEnumerable additionalBoxes, IEnumerable partOffsets) + { + AdditionalBoxes = new List(additionalBoxes); + PartOffsets = new List(partOffsets); + } + } +} diff --git a/PckStudio.Core/Skin/SkinPartOffset.cs b/PckStudio.Core/Skin/SkinPartOffset.cs new file mode 100644 index 00000000..ccdc3eab --- /dev/null +++ b/PckStudio.Core/Skin/SkinPartOffset.cs @@ -0,0 +1,81 @@ +using System; +using System.Linq; +using System.IO; +using PckStudio.Core.Extensions; +using System.Diagnostics; +using System.Text.RegularExpressions; +using System.Collections.Generic; + +namespace PckStudio.Core.Skin +{ + public readonly struct SkinPartOffset + { + private static readonly Regex sWhitespace = new Regex(@"\s+"); + public static string ReplaceWhitespace(string input, string replacement) + { + return sWhitespace.Replace(input, replacement); + } + + public static readonly string[] ValidModelOffsetTypes = new string[] + { + //! See: 0x02af8a20 - 0x02af8ed8 (Wii U Editon) + "HEAD", + "BODY", + "ARM0", + "ARM1", + "LEG0", + "LEG1", + + "TOOL0", + "TOOL1", + + "HELMET", + "SHOULDER0", + "SHOULDER1", + "CHEST", + "WAIST", + "PANTS0", + "PANTS1", + "BOOT0", + "BOOT1", + }; + + public string Type { get; } + public float Value { get; } + + public SkinPartOffset(string type, float value) + { + Type = type; + Value = value; + } + + public static SkinPartOffset FromString(string offsetFormatString) + { + string[] offset = ReplaceWhitespace(offsetFormatString.TrimEnd('\n', '\r', ' '), ",").Split(','); + if (offset.Length < 3) + throw new InvalidDataException("Format string does not contain enough data."); + + string type = offset[0]; + + if (!ValidModelOffsetTypes.Contains(type)) + { + Debug.WriteLine($"'{type}' is an invalid offset type.", category: nameof(SkinPartOffset)); + } + + // Ignore => Y assumed + //if (offset[1] != "Y") + + if (!float.TryParse(offset[2], out float value)) + { + Debug.WriteLine($"Failed to parse y offset for: '{type}'", category: nameof(SkinPartOffset)); + } + return new SkinPartOffset(type, value); + } + + public KeyValuePair ToProperty() + { + string value = $"{Type} Y {Value}"; + return new KeyValuePair("OFFSET", value.Replace(',', '.')); + } + } +} \ No newline at end of file diff --git a/PCK-Studio/Internal/Json/Tiles.cs b/PckStudio.Core/Tiles.cs similarity index 60% rename from PCK-Studio/Internal/Json/Tiles.cs rename to PckStudio.Core/Tiles.cs index 921407a2..223fe78d 100644 --- a/PCK-Studio/Internal/Json/Tiles.cs +++ b/PckStudio.Core/Tiles.cs @@ -2,16 +2,15 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json; -using PckStudio.Extensions; -using PckStudio.Properties; +using PckStudio.Core.Extensions; +using PckStudio.Core.Json; +using PckStudio.Core.Properties; -namespace PckStudio.Internal.Json +namespace PckStudio.Json { - internal class JsonTiles + public class JsonTiles { [JsonProperty("entries")] public List Entries { get; set; } @@ -20,33 +19,33 @@ namespace PckStudio.Internal.Json public List AdditionalEntries { get; set; } } - internal static class Tiles + public static class Tiles { - private static JsonTiles - _jsonBlockData, _jsonItemData, + private static JsonTiles + _jsonBlockData, _jsonItemData, _jsonParticleData, _jsonMoonPhaseData, - _jsonMapIconData, _jsonExplosionData, + _jsonMapIconData, _jsonExplosionData, _jsonExperienceOrbData, _jsonPaintingData, _jsonBannerData; - internal static JsonTiles JsonBlockData => _jsonBlockData ??= JsonConvert.DeserializeObject(Resources.blockData); - internal static JsonTiles JsonItemData => _jsonItemData ??= JsonConvert.DeserializeObject(Resources.itemData); - internal static JsonTiles JsonParticleData => _jsonParticleData ??= JsonConvert.DeserializeObject(Resources.particleData); - internal static JsonTiles JsonMoonPhaseData => _jsonMoonPhaseData ??= JsonConvert.DeserializeObject(Resources.moonPhaseData); - internal static JsonTiles JsonMapIconData => _jsonMapIconData ??= JsonConvert.DeserializeObject(Resources.mapIconData); - internal static JsonTiles JsonExplosionData => _jsonExplosionData ??= JsonConvert.DeserializeObject(Resources.explosionData); - internal static JsonTiles JsonExperienceOrbData => _jsonExperienceOrbData ??= JsonConvert.DeserializeObject(Resources.experienceOrbData); - internal static JsonTiles JsonPaintingData => _jsonPaintingData ??= JsonConvert.DeserializeObject(Resources.paintingData); - internal static JsonTiles JsonBannerData => _jsonBannerData ??= JsonConvert.DeserializeObject(Resources.bannerData); + public static JsonTiles JsonBlockData => _jsonBlockData ??= JsonConvert.DeserializeObject(Resources.blockData); + public static JsonTiles JsonItemData => _jsonItemData ??= JsonConvert.DeserializeObject(Resources.itemData); + public static JsonTiles JsonParticleData => _jsonParticleData ??= JsonConvert.DeserializeObject(Resources.particleData); + public static JsonTiles JsonMoonPhaseData => _jsonMoonPhaseData ??= JsonConvert.DeserializeObject(Resources.moonPhaseData); + public static JsonTiles JsonMapIconData => _jsonMapIconData ??= JsonConvert.DeserializeObject(Resources.mapIconData); + public static JsonTiles JsonExplosionData => _jsonExplosionData ??= JsonConvert.DeserializeObject(Resources.explosionData); + public static JsonTiles JsonExperienceOrbData => _jsonExperienceOrbData ??= JsonConvert.DeserializeObject(Resources.experienceOrbData); + public static JsonTiles JsonPaintingData => _jsonPaintingData ??= JsonConvert.DeserializeObject(Resources.paintingData); + public static JsonTiles JsonBannerData => _jsonBannerData ??= JsonConvert.DeserializeObject(Resources.bannerData); - internal static List ItemTileInfos => JsonItemData.Entries; - internal static List BlockTileInfos => JsonBlockData.Entries; - internal static List ParticleTileInfos => JsonParticleData.Entries; - internal static List MoonPhaseTileInfos => JsonMoonPhaseData.Entries; - internal static List MapIconTileInfos => JsonMapIconData.Entries; - internal static List AdditionalMapIconTileInfos => JsonMapIconData.AdditionalEntries; - internal static List ExperienceOrbTileInfos => JsonExperienceOrbData.Entries; - internal static List ExplosionTileInfos => JsonExplosionData.Entries; - internal static List PaintingTileInfos => JsonPaintingData.Entries; - internal static List BannerTileInfos => JsonBannerData.Entries; + public static List ItemTileInfos => JsonItemData.Entries; + public static List BlockTileInfos => JsonBlockData.Entries; + public static List ParticleTileInfos => JsonParticleData.Entries; + public static List MoonPhaseTileInfos => JsonMoonPhaseData.Entries; + public static List MapIconTileInfos => JsonMapIconData.Entries; + public static List AdditionalMapIconTileInfos => JsonMapIconData.AdditionalEntries; + public static List ExperienceOrbTileInfos => JsonExperienceOrbData.Entries; + public static List ExplosionTileInfos => JsonExplosionData.Entries; + public static List PaintingTileInfos => JsonPaintingData.Entries; + public static List BannerTileInfos => JsonBannerData.Entries; private static Image[] _itemImages; public static Image[] ItemImages => _itemImages ??= Resources.items_atlas.SplitHorizontal(16).ToArray(); @@ -80,11 +79,11 @@ namespace PckStudio.Internal.Json private static ImageList GetImageList(Image[] images) { - ImageList _imageList = new ImageList(); - _imageList.ColorDepth = ColorDepth.Depth32Bit; - _imageList.Images.AddRange(images); + ImageList imageList = new ImageList(); + imageList.ColorDepth = ColorDepth.Depth32Bit; + imageList.Images.AddRange(images); - return _imageList; + return imageList; } private static ImageList _blockImageList = GetImageList(BlockImages); diff --git a/PckStudio.Rendering/BoundingBox.cs b/PckStudio.Rendering/BoundingBox.cs new file mode 100644 index 00000000..ac692c8a --- /dev/null +++ b/PckStudio.Rendering/BoundingBox.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Rendering.Addon +{ + public struct BoundingBox + { + private static readonly ColorVertex[] _vertices = [ + new ColorVertex(new OpenTK.Vector3(0f, 1f, 1f)), + new ColorVertex(new OpenTK.Vector3(1f, 1f, 1f)), + new ColorVertex(new OpenTK.Vector3(1f, 0f, 1f)), + new ColorVertex(new OpenTK.Vector3(0f, 0f, 1f)), + new ColorVertex(new OpenTK.Vector3(0f, 1f, 0f)), + new ColorVertex(new OpenTK.Vector3(1f, 1f, 0f)), + new ColorVertex(new OpenTK.Vector3(1f, 0f, 0f)), + new ColorVertex(new OpenTK.Vector3(0f, 0f, 0f)), + ]; + + private static readonly int[] _indecies = [ + 0, 1, + 1, 2, + 2, 3, + 3, 0, + + 4, 5, + 5, 6, + 6, 7, + 7, 4, + + 0, 4, + 1, 5, + 2, 6, + 3, 7 + ]; + + public static ColorVertex[] GetVertices() + { + return _vertices; + } + + public static int[] GetIndecies() => _indecies; + } +} diff --git a/PckStudio.Rendering/Camera/Camera.cs b/PckStudio.Rendering/Camera/Camera.cs new file mode 100644 index 00000000..7ff811a2 --- /dev/null +++ b/PckStudio.Rendering/Camera/Camera.cs @@ -0,0 +1,12 @@ +using System; +using OpenTK; + +namespace PckStudio.Rendering.Camera +{ + public abstract class Camera + { + protected Matrix4 projectionMatrix; + + public abstract Matrix4 GetViewProjection(); + } +} diff --git a/PckStudio.Rendering/Camera/PerspectiveCamera.cs b/PckStudio.Rendering/Camera/PerspectiveCamera.cs new file mode 100644 index 00000000..31e21120 --- /dev/null +++ b/PckStudio.Rendering/Camera/PerspectiveCamera.cs @@ -0,0 +1,208 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +// movement code taken from: +// https://github.com/TheCherno/Hazel/blob/master/Hazel/src/Hazel/Renderer/EditorCamera.cpp +using System; +using System.Drawing; +using OpenTK; + +namespace PckStudio.Rendering.Camera +{ + public class PerspectiveCamera : Camera + { + public float NearClip + { + get => _nearClip; + set + { + _nearClip = value; + UpdateProjection(); + } + } + + public float FarClip + { + get => _farClip; + set + { + _farClip = value; + UpdateProjection(); + } + } + + public float Distance + { + get => _spherical.Radius; + set + { + _spherical.Radius = Math.Max(value, 2f); + UpdateViewMatrix(); + } + } + + public float RotationSpeed { get; set; } = 5f; + + public Size ViewportSize + { + get => _viewportSize; + set + { + _viewportSize = value; + UpdateProjection(); + } + } + + public Vector3 WorldPosition => _position; + + public Vector3 FocalPoint + { + get => _focalPoint; + set + { + _focalPoint = value; + UpdateViewMatrix(); + } + } + + public float Pitch + { + get => _spherical.Theta; + set + { + _spherical.Theta = MathHelper.Clamp(value, -90f, 90f); + UpdateViewMatrix(); + } + } + + public float Yaw + { + get => _spherical.Phi; + set + { + _spherical.Phi = value % 360f; + UpdateViewMatrix(); + } + } + + public Vector3 Orientation => -Vector3.UnitZ; + + public Vector3 Up => Vector3.UnitY; + + public float MinimumFov { get; } = 30f; + public float MaximumFov { get; } = 180f; + + public float Fov + { + get => _fov; + set + { + _fov = MathHelper.Clamp(value, MinimumFov, MaximumFov); + UpdateProjection(); + } + } + + public PerspectiveCamera(float fov, Vector3 target) + { + _fov = fov; + _focalPoint = target; + _nearClip = 1f; + _farClip = 1000f; + UpdateProjection(); + } + + private Matrix4 viewMatrix; + private float _fov; + + private float _nearClip; + private float _farClip; + private Spherical _spherical; + private Size _viewportSize; + private Vector3 _position; + private Vector3 _focalPoint; + + public override Matrix4 GetViewProjection() + { + return viewMatrix * projectionMatrix; + } + + public Matrix4 GetProjection() + { + return projectionMatrix; + } + + private void UpdateViewMatrix() + { + Matrix4 rotation = Matrix4.CreateRotationY(MathHelper.DegreesToRadians(Yaw)) * Matrix4.CreateRotationX(MathHelper.DegreesToRadians(Pitch)); + + viewMatrix = Matrix4.CreateTranslation(FocalPoint) * rotation * Matrix4.CreateTranslation(0, 0, -Distance); + // Position in Right-handed coordinates + _position = viewMatrix.Inverted().ExtractTranslation(); + } + + private void UpdateProjection() + { + float aspect = (float)ViewportSize.Width / (float)ViewportSize.Height; + projectionMatrix = Matrix4.CreatePerspectiveFieldOfView((float)MathHelper.DegreesToRadians(Fov), aspect, NearClip, FarClip); + } + + private Vector2 GetPanSpeed() + { + float x = Math.Min(ViewportSize.Width / 100.0f, 1.4f); // max = 2.4f + float xFactor = 0.0366f * (x * x) - 0.1778f * x + 0.3021f; + + float y = Math.Min(ViewportSize.Height / 100.0f, 1.4f); // max = 2.4f + float yFactor = 0.0366f * (y * y) - 0.1778f * y + 0.3021f; + + return new Vector2(xFactor, yFactor); + } + + public void Pan(Vector2 delta) + { + Pan(delta.X, delta.Y); + } + + public void Pan(float deltaX, float deltaY) + { + Vector2 panSpeed = GetPanSpeed(); + + // Taken from: blockbench + // https://github.com/JannisX11/blockbench/blob/a56fe01a517ace8d013f67bbd3d02442c44d3141/js/preview/OrbitControls.js#L271-L322 + Vector3 left = viewMatrix.Column0.Xyz * -Distance; + Vector3 up = viewMatrix.Column1.Xyz * Distance; + _focalPoint -= left * deltaX * panSpeed.X; + _focalPoint -= up * deltaY * panSpeed.Y; + UpdateViewMatrix(); + } + + public void Rotate(Vector2 delta) + { + Rotate(delta.X, delta.Y); + } + + public void Rotate(float deltaX,float deltaY) + { + Yaw += deltaX * RotationSpeed; + Pitch += deltaY * RotationSpeed; + } + + public override string ToString() + { + return $"FOV: {Fov}\nPosition: {WorldPosition}\nRotation: {_spherical}"; + } + } +} diff --git a/PckStudio.Rendering/ColorVertex.cs b/PckStudio.Rendering/ColorVertex.cs new file mode 100644 index 00000000..54634b4c --- /dev/null +++ b/PckStudio.Rendering/ColorVertex.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using OpenTK; +using OpenTK.Graphics; + +namespace PckStudio.Rendering +{ + [StructLayout(LayoutKind.Sequential, Size = 28)] + public struct ColorVertex + { + public ColorVertex(Vector3 position, Color4 color) + { + Position = position; + Color = color; + } + + public ColorVertex(Vector3 position) + : this(position, System.Drawing.Color.White) + { + } + + public static implicit operator ColorVertex(Vector3 vector3) => new ColorVertex(vector3); + + public Vector3 Position { get; set; } + public Color4 Color { get; set; } + } +} diff --git a/PckStudio.Rendering/Cube.cs b/PckStudio.Rendering/Cube.cs new file mode 100644 index 00000000..de675454 --- /dev/null +++ b/PckStudio.Rendering/Cube.cs @@ -0,0 +1,102 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using OpenTK; +using PckStudio.Core; + +namespace PckStudio.Rendering +{ + public sealed class Cube + { + public Vector3 Position { get; } + + public Vector3 Size { get; } + + public Vector3 Rotation { get; } + + public Vector2 Uv { get; } + + public float Inflate { get; } + + public bool MirrorTexture { get; } + + public bool FlipZMapping { get; } + + public Vector3 Center => Position + Size / 2f; + + public enum Face + { + Back, + Front, + Top, + Bottom, + Left, + Right + } + + public Cube(Vector3 position, Vector3 size, Vector2 uv, float inflate, bool mirrorTexture, bool flipZMapping) + { + Position = position; + Size = size; + Uv = uv; + Inflate = inflate; + MirrorTexture = mirrorTexture; + FlipZMapping = flipZMapping; + } + + public Vector3 GetFaceCenter(Face face) + { + Vector3 result = Center; + switch (face) + { + case Face.Top: + result.Y -= Size.Y / 2f; + return result; + case Face.Bottom: + result.Y += Size.Y / 2f; + return result; + case Face.Back: + result.Z -= Size.Z / 2f; + return result; + case Face.Front: + result.Z += Size.Z / 2f; + return result; + case Face.Left: + result.X -= Size.X / 2f; + return result; + case Face.Right: + result.X += Size.X / 2f; + return result; + default: + return result; + } + } + + public BoundingBox GetBoundingBox() => GetBoundingBox(Matrix4.Identity); + + public BoundingBox GetBoundingBox(Matrix4 transform) + { + Vector3 halfSize = Size / 2f; + Vector3 halfSizeInflated = halfSize + new Vector3(Inflate); + Vector3 transformedCenter = Vector3.TransformPosition(Center, transform); + Vector3 start = transformedCenter - halfSizeInflated; + Vector3 end = transformedCenter + halfSizeInflated; + return new BoundingBox(start, end); + } + } +} diff --git a/PckStudio.Rendering/CubeMesh.cs b/PckStudio.Rendering/CubeMesh.cs new file mode 100644 index 00000000..f3812440 --- /dev/null +++ b/PckStudio.Rendering/CubeMesh.cs @@ -0,0 +1,137 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using OpenTK; +using PckStudio.Core; +using PckStudio.Core.Extensions; + +namespace PckStudio.Rendering +{ + public class CubeMesh : GenericMesh + { + private Cube _cube; + + public Vector3 Center => _cube.Center; + + internal static int[] IndicesData { get; } = [ + // Face 1 (Back) + 0, 1, 2, + 2, 3, 0, + // Face 2 (Front) + 4, 5, 6, + 6, 7, 4, + // Face 3 (Top) + 8, 9, 10, + 10, 11, 8, + // Face 4 (Bottom) + 12, 13, 14, + 14, 15, 12, + // Face 5 (Left) + 16, 17, 18, + 18, 19, 16, + // Face 6 (Right) + 20, 21, 22, + 22, 23, 20 + ]; + + internal static VertexBufferLayout VertexBufferLayout { get; } = new VertexBufferLayout().Add(ShaderDataType.Float3).Add(ShaderDataType.Float2); + + public CubeMesh(Cube cube) : this(nameof(CubeMesh), cube) + { + } + + public CubeMesh(string name, Cube cube) : this(name, cube, true) + { + } + + private CubeMesh(string name, Cube cube, bool visible) + : base(name, visible, OpenTK.Graphics.OpenGL.PrimitiveType.Triangles, VertexBufferLayout) + { + _cube = cube; + } + + public CubeMesh SetCube(Cube cube) + { + _ = cube ?? throw new ArgumentNullException(nameof(cube)); + return new CubeMesh(Name, cube, Visible); + } + + public override GenericMesh SetVisible(bool visible) => new CubeMesh(Name, _cube, visible); + + public Cube GetCube() => _cube; + + public override Matrix4 GetTransform() => _cube.GetBoundingBox().GetTransform(); + + public override BoundingBox GetBounds(Matrix4 transform) + { + return _cube.GetBoundingBox(transform); + } + + public override IEnumerable GetVertices() + { + int mirror = Convert.ToInt32(_cube.MirrorTexture); + + Vector2 uv = _cube.Uv; + + Vector3 size = _cube.Size; + + // Back + yield return new TextureVertex(new Vector3(0f, 1f, 1f), new Vector2(uv.X + size.Z * 2 + size.X + size.X * (1 - mirror), uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(1f, 1f, 1f), new Vector2(uv.X + size.Z * 2 + size.X + size.X * mirror, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(1f, 0f, 1f), new Vector2(uv.X + size.Z * 2 + size.X + size.X * mirror, uv.Y + size.Z)); + yield return new TextureVertex(new Vector3(0f, 0f, 1f), new Vector2(uv.X + size.Z * 2 + size.X + size.X * (1 - mirror), uv.Y + size.Z)); + + // Front + yield return new TextureVertex(new Vector3(0f, 1f, 0f), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(1f, 1f, 0f), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(1f, 0f, 0f), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z)); + yield return new TextureVertex(new Vector3(0f, 0f, 0f), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z)); + + // Top + yield return new TextureVertex(new Vector3(0f, 0f, 0f), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y + size.Z)); + yield return new TextureVertex(new Vector3(0f, 0f, 1f), new Vector2(uv.X + size.Z + size.X * mirror, uv.Y)); + yield return new TextureVertex(new Vector3(1f, 0f, 1f), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y)); + yield return new TextureVertex(new Vector3(1f, 0f, 0f), new Vector2(uv.X + size.Z + size.X * (1 - mirror), uv.Y + size.Z)); + + // Bottom + yield return new TextureVertex(new Vector3(1f, 1f, 0f), new Vector2(uv.X + size.Z + size.X + size.X * (1 - mirror), uv.Y + (_cube.FlipZMapping ? size.Z : 0))); + yield return new TextureVertex(new Vector3(1f, 1f, 1f), new Vector2(uv.X + size.Z + size.X + size.X * (1 - mirror), uv.Y + (!_cube.FlipZMapping ? size.Z : 0))); + yield return new TextureVertex(new Vector3(0f, 1f, 1f), new Vector2(uv.X + size.Z + size.X + size.X * mirror, uv.Y + (!_cube.FlipZMapping ? size.Z : 0))); + yield return new TextureVertex(new Vector3(0f, 1f, 0f), new Vector2(uv.X + size.Z + size.X + size.X * mirror, uv.Y + (_cube.FlipZMapping ? size.Z : 0))); + + // Left + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 0f : 1f, 0f, 0f), new Vector2(uv.X + size.X + size.Z, uv.Y + size.Z)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 0f : 1f, 1f, 0f), new Vector2(uv.X + size.X + size.Z, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 0f : 1f, 1f, 1f), new Vector2(uv.X + size.X + size.Z * 2, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 0f : 1f, 0f, 1f), new Vector2(uv.X + size.X + size.Z * 2, uv.Y + size.Z)); + + // Right + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 1f : 0f, 0f, 0f), new Vector2(uv.X + size.Z, uv.Y + size.Z)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 1f : 0f, 1f, 0f), new Vector2(uv.X + size.Z, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 1f : 0f, 1f, 1f), new Vector2(uv.X, uv.Y + size.Z + size.Y)); + yield return new TextureVertex(new Vector3(_cube.MirrorTexture ? 1f : 0f, 0f, 1f), new Vector2(uv.X, uv.Y + size.Z)); + yield break; + } + + public override IEnumerable GetIndices() => IndicesData; + } +} \ No newline at end of file diff --git a/PckStudio.Rendering/CubeMeshCollection.cs b/PckStudio.Rendering/CubeMeshCollection.cs new file mode 100644 index 00000000..9114acc4 --- /dev/null +++ b/PckStudio.Rendering/CubeMeshCollection.cs @@ -0,0 +1,236 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using OpenTK; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core.Extensions; +using PckStudio.Core; +using PckStudio.Core.Skin; +using PckStudio.Rendering.Extension; + +namespace PckStudio.Rendering +{ + public static class CubeMeshCollectionExtensions + { + public static void AddSkinBox(this CubeMeshCollection cubeMeshes, SkinBOX skinBox, float inflate = 0f) + { + var cube = skinBox.ToCube(inflate, cubeMeshes.FlipZMapping); + cubeMeshes.Add(new CubeMesh(skinBox.Type, cube)); + } + } + + public class CubeMeshCollection : GenericMesh, ICollection> + { + private List> cubes; + private Dictionary subCollection; + + public bool FlipZMapping + { + get => _flipZMapping; + set => _flipZMapping = value; + } + + public Vector3 Translation { get; set; } + public Vector3 Rotation { get; } + public Vector3 Pivot { get; } + private Vector3 _offset { get; set; } = Vector3.Zero; + public Vector3 Offset + { + get => _offset; + set => _offset = value; + } + + public override Matrix4 GetTransform() + { + Matrix4 rotations = ( + Matrix4.CreateRotationX(MathHelper.DegreesToRadians(Rotation.X)) * + Matrix4.CreateRotationY(MathHelper.DegreesToRadians(Rotation.Y)) * + Matrix4.CreateRotationZ(MathHelper.DegreesToRadians(Rotation.Z)) + ); + Matrix4 translation = Matrix4.CreateTranslation(Translation + Offset); + return translation * rotations.Pivoted(Pivot - Offset); + } + + public int Count => cubes.Count; + + public bool IsReadOnly => false; + + private bool _flipZMapping = false; + + public CubeMeshCollection(string name, bool visible = true) : base(name, visible, PrimitiveType.Triangles, CubeMesh.VertexBufferLayout) + { + cubes = new List>(5); + subCollection = new Dictionary(); + } + + public CubeMeshCollection(string name, Vector3 translation, Vector3 pivot, Vector3 rotation = default) + : this(name) + { + Translation = translation; + Pivot = pivot; + Rotation = rotation; + } + + public override GenericMesh SetVisible(bool visible) + { + if (Visible == visible) + return this; + + var mesh = new CubeMeshCollection(Name, visible); + mesh.cubes = this.cubes; + return mesh; + } + + public override IEnumerable GetVertices() + => cubes.Where(c => c.Visible).SelectMany(c => + c.GetVertices().Select(vertex => new TextureVertex(Vector3.TransformPosition(vertex.Position, c.GetTransform()), vertex.TexPosition)) + ); + + public override IEnumerable GetIndices() + { + int offset = 0; + IEnumerable selector(GenericMesh c) + { + IEnumerable result = c.GetIndices().Select(i => i + offset).ToArray(); + int vertexCount = c.GetVertices().Count(); + offset += vertexCount; + return result; + } + return cubes.Where(c => c.Visible).SelectMany(selector); + } + + public void Add(Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false) + { + var cube = new Cube(position, size, uv, inflate, mirrorTexture, FlipZMapping); + Add(new CubeMesh(cube)); + } + + public void AddNamed(string name, Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false) + { + var cube = new Cube(position, size, uv, inflate, mirrorTexture, FlipZMapping); + Add(new CubeMesh(name, cube)); + } + + internal void AddSubCollection(string name, Vector3 translation, Vector3 pivot, Vector3 rotation = default) + { + var item = new CubeMeshCollection(name, translation, pivot, rotation); + Add(item); + subCollection.Add(name, item); + } + + public CubeMeshCollection GetCollection(string collectionName) + { + _ = collectionName ?? throw new ArgumentNullException(nameof(collectionName)); + return ContainsCollection(collectionName) ? subCollection[collectionName] : null; + } + + public void Remove(int index) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + cubes.RemoveAt(index); + } + + public void ReplaceCube(int index, Vector3 position, Vector3 size, Vector2 uv, float inflate = 0f, bool mirrorTexture = false) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + + if (cubes[index] is CubeMesh cubeMesh) + cubes[index] = cubeMesh.SetCube(new Cube(position, size, uv, inflate, mirrorTexture, FlipZMapping)); + } + + public Vector3 GetCenter(int index) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + return cubes[index].GetBounds(GetTransform()).Center; + } + + public BoundingBox GetCubeBoundingBox(int index) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + return cubes[index].GetBounds(GetTransform()); + } + + public override BoundingBox GetBounds(Matrix4 transform) + { + return cubes + .Where(c => c.Visible) + .Select(c => c.GetBounds(GetTransform() * transform)) + .GetEnclosingBoundingBox(); + } + + public Vector3 GetFaceCenter(int index, Cube.Face face) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + + Vector3 faceCenter = cubes[index] is CubeMesh c ? c.GetCube().GetFaceCenter(face) : Vector3.Zero; + return Vector3.TransformPosition(faceCenter, GetTransform()); + } + + public void SetVisible(int index, bool visible) + { + if (!cubes.IndexInRange(index)) + throw new IndexOutOfRangeException(); + if (cubes[index].Visible == visible) + return; + cubes[index] = cubes[index].SetVisible(visible); + } + + public void Add(GenericMesh item) => cubes.Add(item); + + public void Clear() + { + subCollection.Clear(); + cubes.Clear(); + } + + public bool Contains(GenericMesh item) + { + return cubes.Any(c => c.Name == item.Name); + } + + public bool ContainsCollection(string collectionName) => subCollection.ContainsKey(key: collectionName); + + public bool Contains(GenericMesh item, bool searchSubCollections) + { + return Contains(item) || (searchSubCollections && subCollection.Values.Any(collection => collection.Contains(item, searchSubCollections))); + } + + public void CopyTo(GenericMesh[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove(GenericMesh item) => cubes.Remove(item); + + public IEnumerator> GetEnumerator() => cubes.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } +} diff --git a/PckStudio.Rendering/DrawContext.cs b/PckStudio.Rendering/DrawContext.cs new file mode 100644 index 00000000..5795e8e0 --- /dev/null +++ b/PckStudio.Rendering/DrawContext.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering +{ + public sealed class DrawContext + { + public readonly VertexArray VertexArray; + public readonly IndexBuffer IndexBuffer; + public readonly PrimitiveType PrimitiveType; + + public DrawContext(VertexArray vertexArray, IndexBuffer indexBuffer, PrimitiveType primitiveType) + { + VertexArray = vertexArray; + IndexBuffer = indexBuffer; + PrimitiveType = primitiveType; + } + } +} diff --git a/PckStudio.Rendering/Extension/SkinBoxExtension.cs b/PckStudio.Rendering/Extension/SkinBoxExtension.cs new file mode 100644 index 00000000..6a8675bf --- /dev/null +++ b/PckStudio.Rendering/Extension/SkinBoxExtension.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Core.Extensions; +using PckStudio.Core.Skin; + +namespace PckStudio.Rendering.Extension +{ + public static class SkinBoxExtension + { + public static Cube ToCube(this SkinBOX skinBOX) => skinBOX.ToCube(0f); + + public static Cube ToCube(this SkinBOX skinBOX, float inflate, bool flipZMapping = false) + => new Cube(skinBOX.Pos.ToOpenTKVector(), skinBOX.Size.ToOpenTKVector(), skinBOX.UV.ToOpenTKVector(), skinBOX.Scale + inflate, skinBOX.Mirror, flipZMapping); + } +} diff --git a/PckStudio.Rendering/FrameBuffer.cs b/PckStudio.Rendering/FrameBuffer.cs new file mode 100644 index 00000000..bae0343f --- /dev/null +++ b/PckStudio.Rendering/FrameBuffer.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering +{ + public class FrameBuffer + { + private int _id; + private FramebufferErrorCode status; + + public FramebufferErrorCode Status => status; + public FrameBuffer() + { + _id = GL.GenFramebuffer(); + } + + public void Bind() + { + GL.BindFramebuffer(FramebufferTarget.Framebuffer, _id); + } + + public void Unbind() + { + GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); + } + + internal void CheckStatus() + { + status = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer); + } + } +} diff --git a/PckStudio.Rendering/GenericMesh.cs b/PckStudio.Rendering/GenericMesh.cs new file mode 100644 index 00000000..d9df190d --- /dev/null +++ b/PckStudio.Rendering/GenericMesh.cs @@ -0,0 +1,54 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using OpenTK; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core; + +namespace PckStudio.Rendering +{ + public abstract class GenericMesh where T : struct + { + public string Name { get; } + public PrimitiveType DrawType { get; } + public VertexBufferLayout VertexLayout { get; } + public bool Visible { get; } + + + protected GenericMesh(string name, bool visible, PrimitiveType type, VertexBufferLayout vertexLayout) + { + Name = name; + DrawType = type; + Visible = visible; + VertexLayout = vertexLayout; + } + + public abstract GenericMesh SetVisible(bool visible); + public abstract BoundingBox GetBounds(Matrix4 transform); + public abstract Matrix4 GetTransform(); + + public abstract IEnumerable GetVertices(); + public abstract IEnumerable GetIndices(); + + public override string ToString() + { + return $"Name: {Name} T={typeof(T)} Visible={Visible}"; + } + } +} \ No newline at end of file diff --git a/PckStudio.Rendering/IndexBuffer.cs b/PckStudio.Rendering/IndexBuffer.cs new file mode 100644 index 00000000..9d8fcb9e --- /dev/null +++ b/PckStudio.Rendering/IndexBuffer.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering +{ + public class IndexBuffer : IDisposable + { + private int _id; + private int _size; + private int[] _indicies; + + public IndexBuffer() + { + _id = GL.GenBuffer(); + _size = 0; + } + + /// + /// Creates and attaches created index buffer + /// + /// + /// + public static IndexBuffer Create(params int[] indicies) + { + var ib = new IndexBuffer(); + ib.SetIndicies(indicies); + return ib; + } + + public void SetIndicies(int[] indicies) + { + Bind(); + int size = indicies.Length * sizeof(int); + _indicies = indicies; + if (_size < size) + { + GL.BufferData(BufferTarget.ElementArrayBuffer, size, indicies, BufferUsageHint.StaticDraw); + _size = size; + return; + } + GL.BufferSubData(BufferTarget.ElementArrayBuffer, IntPtr.Zero, size, indicies); + } + + public int GetCount() => _indicies.Length; + + public void Bind() + { + GL.BindBuffer(BufferTarget.ElementArrayBuffer, _id); + } + + [Conditional("DEBUG")] + public void Unbind() + { + GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0); + } + + public void Dispose() + { + Unbind(); + GL.DeleteBuffer(_id); + } + } +} diff --git a/PckStudio.Rendering/PckStudio.Rendering.csproj b/PckStudio.Rendering/PckStudio.Rendering.csproj new file mode 100644 index 00000000..3e83c5d7 --- /dev/null +++ b/PckStudio.Rendering/PckStudio.Rendering.csproj @@ -0,0 +1,90 @@ + + + + + Debug + AnyCPU + {B1E19D0F-6DD5-4D91-9B45-9818759CA8EF} + Library + NDEBUG + Properties + PckStudio.Rendering + PckStudio.Rendering + v4.8 + 12 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.3.3 + + + 3.3.3 + + + + + {345eabed-f0d1-4d04-b409-babdef747352} + PckStudio.Core + + + + \ No newline at end of file diff --git a/PckStudio.Rendering/Properties/AssemblyInfo.cs b/PckStudio.Rendering/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..88352485 --- /dev/null +++ b/PckStudio.Rendering/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PckStudio.Rendering")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PckStudio.Rendering")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b1e19d0f-6dd5-4d91-9b45-9818759ca8ef")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PckStudio.Rendering/Renderer.cs b/PckStudio.Rendering/Renderer.cs new file mode 100644 index 00000000..8ba22c2a --- /dev/null +++ b/PckStudio.Rendering/Renderer.cs @@ -0,0 +1,50 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Drawing; +using OpenTK.Graphics.OpenGL; +using PckStudio.Rendering.Shader; + +namespace PckStudio.Rendering +{ + public static class Renderer + { + public static void Draw(ShaderProgram shader, DrawContext context) + { + shader.Bind(); + context.VertexArray.Bind(); + context.IndexBuffer.Bind(); + GL.DrawElements(context.PrimitiveType, context.IndexBuffer.GetCount(), DrawElementsType.UnsignedInt, 0); + } + + public static void SetViewportSize(Size size) + { + GL.Viewport(size); + } + + public static void SetClearColor(Color color) + { + GL.ClearColor(color); + } + + public static void SetLineWidth(float width) + { + GL.LineWidth(width); + } + } +} diff --git a/PckStudio.Rendering/Shader/ShaderLibrary.cs b/PckStudio.Rendering/Shader/ShaderLibrary.cs new file mode 100644 index 00000000..3917f7a8 --- /dev/null +++ b/PckStudio.Rendering/Shader/ShaderLibrary.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PckStudio.Rendering.Shader +{ + public sealed class ShaderLibrary : IDisposable + { + private readonly Dictionary _shaderStorage = new Dictionary(); + + public void AddShader(string name, ShaderProgram shader) => _shaderStorage.Add(name, shader); + + public bool HasShader(string name) => _shaderStorage.TryGetValue(name, out _); + + public bool HasShader(string name, out ShaderProgram shader) => _shaderStorage.TryGetValue(name, out shader); + + public ShaderProgram GetShader(string name) => _shaderStorage[name]; + + public void RemoveShader(string name) => _shaderStorage.Remove(name); + + public void Dispose() + { + foreach (ShaderProgram shader in _shaderStorage.Values) + { + shader.Dispose(); + } + } + } +} diff --git a/PckStudio.Rendering/Shader/ShaderObject.cs b/PckStudio.Rendering/Shader/ShaderObject.cs new file mode 100644 index 00000000..3b0d54ed --- /dev/null +++ b/PckStudio.Rendering/Shader/ShaderObject.cs @@ -0,0 +1,81 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering.Shader +{ + internal class ShaderObject + { + private int _shaderId; + private ShaderSource _source; + private int _compileStatus; + + internal bool CompileStatusOK => _compileStatus != 0; + + private ShaderObject(ShaderSource source) + { + _shaderId = GL.CreateShader(source.Type); + _source = source; + _compileStatus = 0; + } + + internal static ShaderObject Create(ShaderSource shaderSource) + { + var shaderObject = new ShaderObject(shaderSource); + if (!shaderObject.Compile()) + { + string infoLog = shaderObject.GetShaderInfoLog(); + Debug.Fail(infoLog); + shaderObject.Delete(); + return null; + } + return shaderObject; + } + + private string GetShaderInfoLog() + { + return GL.GetShaderInfoLog(_shaderId); + } + + internal void Delete() + { + GL.DeleteShader(_shaderId); + } + + private bool Compile() + { + GL.ShaderSource(_shaderId, _source.Source); + GL.CompileShader(_shaderId); + + GL.GetShader(_shaderId, ShaderParameter.CompileStatus, out _compileStatus); + + return CompileStatusOK; + } + + internal void AttachToProgram(int programId) + { + GL.AttachShader(programId, _shaderId); + } + } +} diff --git a/PckStudio.Rendering/Shader/ShaderProgram.cs b/PckStudio.Rendering/Shader/ShaderProgram.cs new file mode 100644 index 00000000..97b69ee3 --- /dev/null +++ b/PckStudio.Rendering/Shader/ShaderProgram.cs @@ -0,0 +1,176 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering.Shader +{ + public sealed class ShaderProgram : IDisposable + { + private int _programId; + private Dictionary locationCache = new Dictionary(); + + private ShaderProgram(int programId) + { + _programId = programId; + } + + public void Bind() + { + GL.UseProgram(_programId); + } + + public void Unbind() + { + GL.UseProgram(0); + } + + public void Dispose() + { + Unbind(); + GL.DeleteProgram(_programId); + } + + public void SetUniform1(string name, int value) + { + int location = GetUniformLocation(name); + GL.Uniform1(location, value); + } + + public void SetUniform1(string name, float value) + { + int location = GetUniformLocation(name); + GL.Uniform1(location, value); + } + + public void SetUniform2(string name, Size value) => SetUniform2(name, new Vector2(value.Width, value.Height)); + + public void SetUniform2(string name, Vector2 value) + { + int location = GetUniformLocation(name); + GL.Uniform2(location, value); + } + + public void SetUniform4(string name, Vector4 value) + { + int location = GetUniformLocation(name); + GL.Uniform4(location, value); + } + + public void SetUniform4(string name, Color color) + { + int location = GetUniformLocation(name); + GL.Uniform4(location, color); + } + + public void SetUniformMat4(string name, ref Matrix4 matrix) + { + int location = GetUniformLocation(name); + GL.UniformMatrix4(location, false, ref matrix); + } + + private int GetUniformLocation(string name) + { + if (locationCache.ContainsKey(name)) + return locationCache[name]; + Debug.Assert(false, $"Uniform location '{name}' not found"); + return -1; + } + + private bool Link() + { + GL.LinkProgram(_programId); + GL.GetProgram(_programId, GetProgramParameterName.LinkStatus, out int status); + bool success = status != 0; + if (!success) + Debug.WriteLine(GL.GetProgramInfoLog(_programId), category: nameof(ShaderProgram)); + GetActiveUniformLocations(); + return success; + } + + private void GetActiveUniformLocations() + { + GL.GetProgram(_programId, GetProgramParameterName.ActiveUniforms, out int count); + Debug.WriteLine("Active Uniforms: {0}", count); + for (int i = 0; i < count; i++) + { + GL.GetActiveUniform(_programId, i, 256, out int length, out int size, out ActiveUniformType type, out string name); + int id = GL.GetUniformLocation(_programId, name); + Debug.Assert(id != -1); + RegisterUniform(name, id, type); + Debug.WriteLine("Uniform {0}(id:{1}) Type: {2} Name: {3}", i, id, type, name); + } + } + + private void RegisterUniform(string name, int id, ActiveUniformType type) => locationCache.Add(name, id); + + public bool Validate() + { +#if DEBUG + GL.ValidateProgram(_programId); + GL.GetProgram(_programId, GetProgramParameterName.ValidateStatus, out int status); + bool success = status != 0; + if (!success) + Debug.WriteLine(GL.GetProgramInfoLog(_programId), category: nameof(ShaderProgram)); + return success; +#else + return true; +#endif + } + + public static ShaderProgram Create(string vertexSource, string fragmentSource) + { + return Create( + new ShaderSource(ShaderType.VertexShader, vertexSource), + new ShaderSource(ShaderType.FragmentShader, fragmentSource) + ); + } + + public static ShaderProgram Create(params ShaderSource[] shaderSources) + { + int programId = GL.CreateProgram(); + + var shaderObjects = new List(shaderSources.Length); + + foreach (ShaderSource shaderSource in shaderSources) + { + ShaderObject shaderObject = ShaderObject.Create(shaderSource); + shaderObject.AttachToProgram(programId); + shaderObjects.Add(shaderObject); + } + + var shader = new ShaderProgram(programId); + bool success = shader.Link(); + Debug.Assert(success, "Shader Program linking failed."); + + foreach (ShaderObject shaderObject in shaderObjects) + { + shaderObject.Delete(); + } + return shader; + } + + } +} diff --git a/PckStudio.Rendering/Shader/ShaderSource.cs b/PckStudio.Rendering/Shader/ShaderSource.cs new file mode 100644 index 00000000..eb4df595 --- /dev/null +++ b/PckStudio.Rendering/Shader/ShaderSource.cs @@ -0,0 +1,38 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering.Shader +{ + public readonly struct ShaderSource + { + public readonly ShaderType Type; + public readonly string Source; + + public ShaderSource(ShaderType type, string source) + { + Type = type; + Source = source; + } + } +} diff --git a/PckStudio.Rendering/Spherical.cs b/PckStudio.Rendering/Spherical.cs new file mode 100644 index 00000000..5e1498cd --- /dev/null +++ b/PckStudio.Rendering/Spherical.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK; + +namespace PckStudio.Rendering +{ + internal struct Spherical + { + private Vector3 vector; + + public Spherical() + { + vector = new Vector3(); + } + + /// + /// Radial distance + /// + public float Radius + { + get => vector.X; + set => vector.X = value; + } + + /// + /// Polar angle + /// + public float Theta + { + get => vector.Y; + set => vector.Y = value; + } + + /// + /// Azimuthal angle + /// + public float Phi + { + get => vector.Z; + set => vector.Z = value; + } + + public override string ToString() + { + return $"Radius: {Radius}; Theta: {Theta}; Phi: {Phi};"; + } + } +} diff --git a/PckStudio.Rendering/Texture/CubeTexture.cs b/PckStudio.Rendering/Texture/CubeTexture.cs new file mode 100644 index 00000000..970d1a60 --- /dev/null +++ b/PckStudio.Rendering/Texture/CubeTexture.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core.Extensions; + +namespace PckStudio.Rendering.Texture +{ + public class CubeTexture : Texture + { + public CubeTexture() : base(TextureTarget.TextureCubeMap) + { + } + + public override void SetTexture(Image image) + { + Bind(); + + int heightPerFace = image.Height / 3; + int widthPerFace = image.Width / 4; + + Size faceSize = new Size(widthPerFace, heightPerFace); + + Image[] faces = new Image[6]; + + Point rightFace = new Point(widthPerFace * 2, heightPerFace * 1); + faces[0] = image.GetArea(new Rectangle(rightFace, faceSize)); + + Point lefttFace = new Point(widthPerFace * 0, heightPerFace * 1); + faces[1] = image.GetArea(new Rectangle(lefttFace, faceSize)); + + Point topFace = new Point(widthPerFace * 1, heightPerFace * 0); + faces[2] = image.GetArea(new Rectangle(topFace, faceSize)); + + Point bottomFace = new Point(widthPerFace * 1, heightPerFace * 2); + faces[3] = image.GetArea(new Rectangle(bottomFace, faceSize)); + + Point frontFace = new Point(widthPerFace * 1, heightPerFace * 1); + faces[4] = image.GetArea(new Rectangle(frontFace, faceSize)); + + Point backFace = new Point(widthPerFace * 3, heightPerFace * 1); + faces[5] = image.GetArea(new Rectangle(backFace, faceSize)); + + for (int i = 0; i < 6; i++) + { + var texture = new Bitmap(faces[i]); + BitmapData data = texture.LockBits(new Rectangle(Point.Empty, texture.Size), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX + i, 0, InternalPixelFormat, widthPerFace, heightPerFace, 0, PixelFormat, PixelType.UnsignedByte, data.Scan0); + } + Unbind(); + } + + } +} diff --git a/PckStudio.Rendering/Texture/Texture.cs b/PckStudio.Rendering/Texture/Texture.cs new file mode 100644 index 00000000..ac80c258 --- /dev/null +++ b/PckStudio.Rendering/Texture/Texture.cs @@ -0,0 +1,109 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using OpenTK; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering.Texture +{ + public abstract class Texture : IDisposable + { + protected readonly int _GL_Id; + + protected readonly TextureTarget Target; + + public PixelFormat PixelFormat { get; set; } + public PixelInternalFormat InternalPixelFormat { get; set; } + + public TextureMinFilter MinFilter + { + get => minFilter; + set + { + minFilter = value; + SetTexParameter(TextureParameterName.TextureMinFilter, (int)value); + } + } + + public TextureMagFilter MagFilter + { + get => magFilter; + set + { + magFilter = value; + SetTexParameter(TextureParameterName.TextureMagFilter, (int)value); + } + } + + public TextureWrapMode WrapS + { + get => wrapS; + set + { + wrapS = value; + SetTexParameter(TextureParameterName.TextureWrapS, (int)value); + } + } + + public TextureWrapMode WrapT + { + get => wrapT; + set + { + wrapT = value; + SetTexParameter(TextureParameterName.TextureWrapT, (int)value); + } + } + + public TextureWrapMode WrapR + { + get => wrapR; + set + { + wrapR = value; + SetTexParameter(TextureParameterName.TextureWrapR, (int)value); + } + } + + private TextureMinFilter minFilter; + private TextureMagFilter magFilter; + private TextureWrapMode wrapS; + private TextureWrapMode wrapT; + private TextureWrapMode wrapR; + + protected Texture(TextureTarget target) + { + _GL_Id = GL.GenTexture(); + Target = target; + } + + public virtual void SetTexture(Image image) + { + throw new NotImplementedException(); + } + + public void Bind(int slot = 0) + { + GL.ActiveTexture(TextureUnit.Texture0 + slot); + GL.BindTexture(Target, _GL_Id); + } + + public void Unbind() + { + GL.BindTexture(Target, 0); + } + + private void SetTexParameter(TextureParameterName parameterName, int value) + { + Bind(); + GL.TexParameter(Target, parameterName, value); + Debug.WriteLineIf(GL.GetError() != ErrorCode.NoError, $"{Target}: {parameterName} = {value}"); + } + + public void Dispose() + { + Unbind(); + GL.DeleteTexture(_GL_Id); + } + } +} diff --git a/PckStudio.Rendering/Texture/Texture2D.cs b/PckStudio.Rendering/Texture/Texture2D.cs new file mode 100644 index 00000000..eda7b47f --- /dev/null +++ b/PckStudio.Rendering/Texture/Texture2D.cs @@ -0,0 +1,39 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using OpenTK; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering.Texture +{ + public class Texture2D : Texture + { + public Texture2D() : base(TextureTarget.Texture2D) + { + } + + public void SetSize(Size size) + { + Bind(); + GL.TexImage2D(TextureTarget.Texture2D, 0, InternalPixelFormat, size.Width, size.Height, 0, PixelFormat, PixelType.UnsignedByte, IntPtr.Zero); + Unbind(); + } + + public override void SetTexture(Image image) + { + Bind(); + var bitmap = new Bitmap(image); + BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + GL.TexImage2D(TextureTarget.Texture2D, 0, InternalPixelFormat, bitmap.Width, bitmap.Height, 0, PixelFormat, PixelType.UnsignedByte, data.Scan0); + bitmap.UnlockBits(data); + Unbind(); + } + + public void AttachToFramebuffer(FrameBuffer frameBuffer, FramebufferAttachment attachment) + { + frameBuffer.Bind(); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, attachment, Target, _GL_Id, 0); + } + } +} diff --git a/PckStudio.Rendering/TextureChangingEventArgs.cs b/PckStudio.Rendering/TextureChangingEventArgs.cs new file mode 100644 index 00000000..6174e509 --- /dev/null +++ b/PckStudio.Rendering/TextureChangingEventArgs.cs @@ -0,0 +1,32 @@ +/* Copyright (c) 2023-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System.ComponentModel; +using System.Drawing; + +namespace PckStudio.Rendering +{ + public class TextureChangingEventArgs : CancelEventArgs + { + public Image NewTexture { get; } + + public TextureChangingEventArgs(Image newTexture) : base() + { + NewTexture = newTexture; + } + } +} \ No newline at end of file diff --git a/PckStudio.Rendering/TextureVertex.cs b/PckStudio.Rendering/TextureVertex.cs new file mode 100644 index 00000000..70dfd602 --- /dev/null +++ b/PckStudio.Rendering/TextureVertex.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using OpenTK; + +namespace PckStudio.Rendering +{ + [StructLayout(LayoutKind.Sequential, Pack = 4, Size = 20)] + public struct TextureVertex + { + public Vector3 Position { get; set; } + public Vector2 TexPosition { get; set; } + + public TextureVertex(Vector3 position, Vector2 texPosition) + { + Position = position; + TexPosition = texPosition; + } + } +} diff --git a/PckStudio.Rendering/VertexArray.cs b/PckStudio.Rendering/VertexArray.cs new file mode 100644 index 00000000..a160df17 --- /dev/null +++ b/PckStudio.Rendering/VertexArray.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OpenTK.Graphics.OpenGL; +using PckStudio.Core.Extensions; + +namespace PckStudio.Rendering +{ + public class VertexArray : IDisposable + { + private int _id; + private List _vertexBuffers; + + public VertexArray() + { + _id = GL.GenVertexArray(); + _vertexBuffers = new List(); + } + + public int AddNewBuffer(VertexBufferLayout layout) => AddBuffer(new VertexBuffer(), layout); + + public int AddBuffer(VertexBuffer buffer, VertexBufferLayout layout) + { + Bind(); + buffer.Bind(); + System.Collections.ObjectModel.ReadOnlyCollection elements = layout.GetElements(); + int offset = 0; + int vertexBufferIndex = 0; + foreach (LayoutElement element in elements) + { + Debug.Assert(element.Size > 0); + switch (element.Type) + { + case ShaderDataType.Float: + case ShaderDataType.Float2: + case ShaderDataType.Float3: + case ShaderDataType.Float4: + GL.EnableVertexAttribArray(vertexBufferIndex); + GL.VertexAttribPointer(vertexBufferIndex, element.ComponentCount, VertexAttribPointerType.Float, element.Normalize, layout.GetStride(), offset); + vertexBufferIndex += 1; + break; + case ShaderDataType.Int: + case ShaderDataType.Int2: + case ShaderDataType.Int3: + case ShaderDataType.Int4: + GL.EnableVertexAttribArray(vertexBufferIndex); + GL.VertexAttribIPointer(vertexBufferIndex, element.ComponentCount, VertexAttribIntegerType.Int, layout.GetStride(), new IntPtr(offset)); + vertexBufferIndex += 1; + break; + case ShaderDataType.Mat2: + case ShaderDataType.Mat3: + case ShaderDataType.Mat4: + { + int count = element.ComponentCount; + for (int i = 0; i < count; i++) + { + GL.EnableVertexAttribArray(vertexBufferIndex); + + GL.VertexAttribPointer(vertexBufferIndex, count, VertexAttribPointerType.Float, element.Normalize, layout.GetStride(), offset + count * i); + + GL.VertexAttribDivisor(vertexBufferIndex, 1); + vertexBufferIndex += 1; + } + } + break; + default: + break; + } + offset += element.Size; + } + int index = _vertexBuffers.Count; + _vertexBuffers.Add(buffer); + return index; + } + + public void Bind() + { + GL.BindVertexArray(_id); + } + + public void Unbind() + { + GL.BindVertexArray(0); + } + + public void Dispose() + { + Unbind(); + Clear(); + GL.DeleteVertexArray(_id); + } + + public void Clear() + { + foreach (VertexBuffer vao in _vertexBuffers) + { + vao.Dispose(); + } + _vertexBuffers.Clear(); + } + + public void SelectBuffer(int index) + { + if (!_vertexBuffers.IndexInRange(index)) + throw new IndexOutOfRangeException(index.ToString()); + Bind(); + GetBuffer(index).Bind(); + } + + public VertexBuffer GetBuffer(int index) + { + if (_vertexBuffers.IndexInRange(index)) + return _vertexBuffers[index]; + throw new IndexOutOfRangeException(index.ToString()); + } + } +} diff --git a/PckStudio.Rendering/VertexBuffer.cs b/PckStudio.Rendering/VertexBuffer.cs new file mode 100644 index 00000000..5870cc05 --- /dev/null +++ b/PckStudio.Rendering/VertexBuffer.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Markup; +using OpenTK; +using OpenTK.Graphics.OpenGL; + +namespace PckStudio.Rendering +{ + public struct VertexBuffer : IDisposable + { + private int _id; + private int _count; + private int _size; + + public VertexBuffer() + { + _id = GL.GenBuffer(); + _size = 0; + } + + public VertexBuffer(int size) : this() + { + _size = size; + Bind(); + GL.BufferData(BufferTarget.ArrayBuffer, size, IntPtr.Zero, BufferUsageHint.StaticDraw); + Unbind(); + } + + public void SetData(T[] data) where T : struct + { + int sizeofT = Marshal.SizeOf(); + _count = data.Length; + Bind(); + int size = sizeofT * _count; + if (_size < size) + { + GL.BufferData(BufferTarget.ArrayBuffer, size, data, BufferUsageHint.StaticDraw); + _size = size; + return; + } + GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, size, data); + } + + public void Bind() + { + GL.BindBuffer(BufferTarget.ArrayBuffer, _id); + } + + public void Unbind() + { + GL.BindBuffer(BufferTarget.ArrayBuffer, 0); + } + + public void Dispose() + { + Unbind(); + GL.DeleteBuffer(_id); + } + + public IndexBuffer GenIndexBuffer() + { + return IndexBuffer.Create(Enumerable.Range(0, _count).ToArray()); + } + } +} diff --git a/PckStudio.Rendering/VertexBufferLayout.cs b/PckStudio.Rendering/VertexBufferLayout.cs new file mode 100644 index 00000000..fb2bfec0 --- /dev/null +++ b/PckStudio.Rendering/VertexBufferLayout.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace PckStudio.Rendering +{ + public enum ShaderDataType + { + Float, + Float2, + Float3, + Float4, + + Int, + Int2, + Int3, + Int4, + + Mat2, + Mat3, + Mat4, + } + + public struct LayoutElement + { + public readonly ShaderDataType Type; + public readonly bool Normalize; + + public int Size => GetSize(Type); + + public int ComponentCount => GetComponentCount(Type); + + private static int GetSize(ShaderDataType type) + { + return type switch + { + ShaderDataType.Int => 1 * 4, + ShaderDataType.Int2 => 2 * 4, + ShaderDataType.Int3 => 3 * 4, + ShaderDataType.Int4 => 4 * 4, + + ShaderDataType.Float => 1 * 4, + ShaderDataType.Float2 => 2 * 4, + ShaderDataType.Float3 => 3 * 4, + ShaderDataType.Float4 => 4 * 4, + + ShaderDataType.Mat2 => 2 * 2 * 4, + ShaderDataType.Mat3 => 3 * 3 * 4, + ShaderDataType.Mat4 => 4 * 4 * 4, + _ => 0 + }; + } + + private static int GetComponentSize(ShaderDataType type) + { + return type switch + { + ShaderDataType.Int => 4, + ShaderDataType.Int2 => 4, + ShaderDataType.Int3 => 4, + ShaderDataType.Int4 => 4, + + ShaderDataType.Float => 4, + ShaderDataType.Float2 => 4, + ShaderDataType.Float3 => 4, + ShaderDataType.Float4 => 4, + + ShaderDataType.Mat2 => 2 * 4, + ShaderDataType.Mat3 => 3 * 4, + ShaderDataType.Mat4 => 4 * 4, + _ => 0 + }; + } + + private static int GetComponentCount(ShaderDataType type) + { + return type switch + { + ShaderDataType.Int => 1, + ShaderDataType.Int2 => 2, + ShaderDataType.Int3 => 3, + ShaderDataType.Int4 => 4, + + ShaderDataType.Float => 1, + ShaderDataType.Float2 => 2, + ShaderDataType.Float3 => 3, + ShaderDataType.Float4 => 4, + + ShaderDataType.Mat2 => 2 * 2, + ShaderDataType.Mat3 => 3 * 3, + ShaderDataType.Mat4 => 4 * 4, + _ => 0 + }; + } + + public LayoutElement(ShaderDataType type) : this(type, false) { } + + public LayoutElement(ShaderDataType type, bool normalize) + { + Type = type; + Normalize = normalize; + } + + public static implicit operator LayoutElement(ShaderDataType type) => new LayoutElement(type); + } + + public struct VertexBufferLayout + { + private List elements; + private int stride; + + public VertexBufferLayout() + { + elements = new List(); + stride = 0; + } + + public readonly ReadOnlyCollection GetElements() + { + return elements.AsReadOnly(); + } + + public VertexBufferLayout Add(ShaderDataType type) + { + var element = new LayoutElement(type); + elements.Add(element); + stride += element.Size; + return this; + } + + internal readonly int GetStride() + { + return stride; + } + } +} diff --git a/PckStuido.ModelSupport/Extension/SkinExtension.cs b/PckStuido.ModelSupport/Extension/SkinExtension.cs new file mode 100644 index 00000000..3dcf6492 --- /dev/null +++ b/PckStuido.ModelSupport/Extension/SkinExtension.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using OMI.Formats.Model; +using PckStudio.Core.Skin; +using PckStudio.ModelSupport; + +namespace PckStuido.ModelSupport.Extension +{ + public static class SkinExtension + { + public static SkinModelInfo GetModelInfo(this Skin skin) => new SkinModelInfo(skin.Texture, skin.Anim, skin.Model); + + public static void SetModelInfo(this Skin skin, SkinModelInfo modelInfo) + { + skin.Texture = modelInfo.Texture; + skin.Anim = modelInfo.Anim; + skin.Model = modelInfo.Model; + } + } +} diff --git a/PckStuido.ModelSupport/Format/External/BedrockLegacyModel.cs b/PckStuido.ModelSupport/Format/External/BedrockLegacyModel.cs new file mode 100644 index 00000000..1f96f7d4 --- /dev/null +++ b/PckStuido.ModelSupport/Format/External/BedrockLegacyModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace PckStudio.ModelSupport.Format.External +{ + internal class BedrockLegacyModel : Dictionary + { + } +} diff --git a/PckStuido.ModelSupport/Format/External/BedrockModel.cs b/PckStuido.ModelSupport/Format/External/BedrockModel.cs new file mode 100644 index 00000000..7f8f4766 --- /dev/null +++ b/PckStuido.ModelSupport/Format/External/BedrockModel.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace PckStudio.ModelSupport.Format.External +{ + internal class BedrockModel + { + [JsonProperty("format_version")] + public string FormatVersion { get; set; } + + [JsonProperty("minecraft:geometry")] + public List Models { get; } = new List(); + } + + internal class Geometry + { + [JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)] + public GeometryDescription Description { get; set; } + + [JsonProperty("bones")] + public List Bones { get; } = new List(); + } + + internal class GeometryDescription + { + [JsonProperty("identifier")] + public string Identifier { get; set; } + + [JsonProperty("texture_width")] + private int TextureWidth; + + [JsonProperty("texture_height")] + private int TextureHeight; + + [JsonIgnore] + public Size TextureSize + { + get => new Size(TextureWidth, TextureHeight); + set + { + TextureWidth = value.Width; + TextureHeight = value.Height; + } + } + } + + internal class Bone + { + [JsonProperty("name")] + public string Name { get; set; } + + public Bone(string name) + { + Name = name; + Cubes = new List(); + } + + + [JsonProperty("parent", NullValueHandling = NullValueHandling.Ignore)] + public string Parent { get; set; } = ""; + + [JsonIgnore] + public Vector3 Pivot + { + get => pivot.Length < 3 ? Vector3.Zero : new Vector3(pivot[0], pivot[1], pivot[2]); + set + { + if (pivot.Length < 3) + pivot = new float[3]; + pivot[0] = value.X; + pivot[1] = value.Y; + pivot[2] = value.Z; + } + } + + [JsonProperty("cubes")] + public List Cubes; + + [JsonProperty("pivot")] + private float[] pivot { get; set; } = new float[3]; + } + + internal class Cube + { + [JsonProperty("origin")] + private float[] origin { get; set; } = new float[3]; + [JsonIgnore] + public Vector3 Origin + { + get => origin.Length < 3 ? Vector3.Zero : new Vector3(origin[0], origin[1], origin[2]); + set + { + if (origin.Length < 3) + origin = new float[3]; + origin[0] = value.X; + origin[1] = value.Y; + origin[2] = value.Z; + } + } + + [JsonProperty("rotation")] + private float[] rotation { get; set; } = new float[3]; + [JsonIgnore] + public Vector3 Rotation + { + get => rotation.Length < 3 ? Vector3.Zero : new Vector3(rotation[0], rotation[1], rotation[2]); + set + { + rotation[0] = value.X; + rotation[1] = value.Y; + rotation[2] = value.Z; + } + } + + [JsonProperty("size")] + private float[] size { get; set; } = new float[3]; + [JsonIgnore] + public Vector3 Size + { + get => size.Length < 3 ? Vector3.Zero : new Vector3(size[0], size[1], size[2]); + set + { + if (size.Length < 3) + size = new float[3]; + size[0] = value.X; + size[1] = value.Y; + size[2] = value.Z; + } + } + + [JsonProperty("uv")] + private float[] uv { get; set; } = new float[2]; + [JsonIgnore] + public Vector2 Uv + { + get => uv.Length < 2 ? Vector2.Zero : new Vector2(uv[0], uv[1]); + set + { + if (uv.Length < 2) + uv = new float[2]; + uv[0] = value.X; + uv[1] = value.Y; + } + } + + [JsonProperty("inflate")] + public float Inflate { get; set; } = 0f; + + [JsonProperty("mirror", NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)] + public bool Mirror { get; set; } = false; + } +} diff --git a/PckStuido.ModelSupport/Format/External/BlockBenchModel.cs b/PckStuido.ModelSupport/Format/External/BlockBenchModel.cs new file mode 100644 index 00000000..1c3f5e3e --- /dev/null +++ b/PckStuido.ModelSupport/Format/External/BlockBenchModel.cs @@ -0,0 +1,362 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NamedTexture = PckStudio.Core.NamedData; + +namespace PckStudio.ModelSupport.Format.External +{ + internal static class BlockBenchFormatInfos + { + internal static readonly string FormatVersion = "4.5"; + + internal static BlockBenchFormatInfo Free { get; } = new BlockBenchFormatInfo(FormatVersion, "free", true); + internal static BlockBenchFormatInfo BedrockEntity { get; } = new BlockBenchFormatInfo(FormatVersion, "bedrock", true); + } + + internal sealed class BlockBenchFormatInfo + { + [JsonProperty("format_version")] + internal string FormatVersion { get; } + + [JsonProperty("model_format")] + internal string ModelFormat { get; } + + [JsonProperty("box_uv")] + internal bool UseBoxUv { get; set; } + + [JsonConstructor] + private BlockBenchFormatInfo() { } + + internal BlockBenchFormatInfo(string formatVersion, string modelFormat, bool useBoxUv) + { + FormatVersion = formatVersion; + ModelFormat = modelFormat; + UseBoxUv = useBoxUv; + } + } + + internal class Element + { + [JsonProperty("name")] + internal string Name; + + [JsonProperty("box_uv")] + internal bool UseBoxUv; + + [JsonProperty("visibility", DefaultValueHandling = DefaultValueHandling.Ignore)] + internal bool IsVisibile { get; set; } = true; + + [JsonProperty("rescale")] + internal bool Rescale; + + [JsonProperty("mirror_uv")] + internal bool MirrorUv; + + [JsonProperty("locked")] + internal bool Locked; + + [DefaultValue(true)] + [JsonProperty("export", DefaultValueHandling = DefaultValueHandling.Ignore)] + internal bool Export { get; } = true; + + [JsonProperty("inflate")] + internal float Inflate; + + [JsonProperty("origin", NullValueHandling = NullValueHandling.Ignore)] + private float[] origin; + + [JsonProperty("from")] + private float[] from; + + [JsonProperty("to")] + private float[] to; + + [JsonProperty("uv_offset")] + private int[] uv_offset; + + [JsonProperty("rotation", NullValueHandling = NullValueHandling.Ignore)] + private float[] rotation; + + [JsonIgnore()] + internal Vector3 Origin + { + get + { + return new Vector3(origin?[0] ?? 0, origin?[1] ?? 0, origin?[2] ?? 0); + } + set + { + if (origin is null || origin.Length < 3) + origin = new float[3]; + origin[0] = value.X; + origin[1] = value.Y; + origin[2] = value.Z; + } + } + + [JsonIgnore()] + internal Vector3 From + { + get + { + return new Vector3(from?[0] ?? 0, from?[1] ?? 0, from?[2] ?? 0); + } + set + { + if (from is null || from.Length < 3) + from = new float[3]; + from[0] = value.X; + from[1] = value.Y; + from[2] = value.Z; + } + } + + [JsonIgnore()] + internal Vector3 To + { + get + { + return new Vector3(to?[0] ?? 0, to?[1] ?? 0, to?[2] ?? 0); + } + set + { + if (to is null || to.Length < 3) + to = new float[3]; + to[0] = value.X; + to[1] = value.Y; + to[2] = value.Z; + } + } + + [JsonIgnore()] + internal Vector2 UvOffset + { + get + { + return new Vector2(uv_offset?[0] ?? 0, uv_offset?[1] ?? 0); + } + set + { + if (uv_offset is null || uv_offset.Length < 2) + uv_offset = new int[2]; + uv_offset[0] = (int)value.X; + uv_offset[1] = (int)value.Y; + } + } + + [JsonIgnore()] + internal Vector3 Rotation + { + get + { + return new Vector3(rotation?[0] ?? 0, rotation?[1] ?? 0, rotation?[2] ?? 0); + } + set + { + if (rotation is null || rotation.Length < 3) + rotation = new float[3]; + rotation[0] = value.X; + rotation[1] = value.Y; + rotation[2] = value.Z; + } + } + + [JsonProperty("type")] + internal string Type; + + [JsonProperty("uuid")] + internal Guid Uuid; + + internal static Element CreateCube(string name, Vector2 uvOffset, Vector3 pos, Vector3 size, float inflate, bool mirror) + { + return new Element + { + Name = name, + UseBoxUv = true, + Locked = false, + Rescale = false, + Type = "cube", + Uuid = Guid.NewGuid(), + UvOffset = uvOffset, + MirrorUv = mirror, + Inflate = inflate, + From = pos, + To = pos + size + }; + } + + } + + internal class Texture + { + public static implicit operator Image(Texture texture) => texture.GetImage(); + public static implicit operator Texture(Image image) => new Texture(image); + public static implicit operator Texture(NamedTexture namedTexture) => new Texture(namedTexture.Name, namedTexture.Value); + + private const string _TEXTUREDATAHEAD = "data:image/png;base64,"; + + [JsonConstructor] + private Texture() + { + } + + internal Texture(string name, Image image) + : this(image) + { + Name = name; + } + + internal Texture(Image image) + { + if (image is not null) + { + SetImage(image); + return; + } + Debug.WriteLine($"param: {nameof(image)} is null"); + } + + [JsonProperty("name")] + internal string Name { get; set; } + + [JsonProperty("source")] + internal string TextureSource { get; private set; } + + private Image GetImage() + { + string data = TextureSource; + if (data.StartsWith(_TEXTUREDATAHEAD)) + { + byte[] encodedData = Convert.FromBase64String(data.Substring(_TEXTUREDATAHEAD.Length)); + using var ms = new MemoryStream(encodedData); + return Image.FromStream(ms); + } + return null; + } + + private void SetImage(Image image) + { + var ms = new MemoryStream(); + image.Save(ms, ImageFormat.Png); + TextureSource = _TEXTUREDATAHEAD + Convert.ToBase64String(ms.ToArray()); + } + } + + internal class Outline + { + [JsonProperty("name")] + internal string Name; + + [JsonProperty("origin")] + private float[] origin; + + [JsonIgnore] + public Vector3 Origin + { + get => new Vector3(origin?[0] ?? 0, origin?[1] ?? 0, origin?[2] ?? 0); + set + { + if (origin is null || origin.Length < 3) + origin = new float[3]; + origin[0] = value.X; + origin[1] = value.Y; + origin[2] = value.Z; + } + } + + [JsonProperty("rotation")] + private float[] rotation; + + [JsonIgnore] + public Vector3 Rotation + { + get => new Vector3(rotation?[0] ?? 0, rotation?[1] ?? 0, rotation?[2] ?? 0); + set + { + if (rotation is null || rotation.Length < 3) + rotation = new float[3]; + rotation[0] = value.X; + rotation[1] = value.Y; + rotation[2] = value.Z; + } + } + + [JsonProperty("uuid")] + internal Guid Uuid; + + [JsonProperty("children")] + internal JArray Children; + + public Outline(string name) + { + Name = name; + origin = new float[3]; + Uuid = Guid.NewGuid(); + Children = new JArray(); + } + } + + internal class TextureRes + { + [JsonProperty("width")] + internal int Width { get; set; } + + [JsonProperty("height")] + internal int Height { get; set; } + + public TextureRes(int width, int height) + { + Width = width; + Height = height; + } + + public static implicit operator Size(TextureRes res) => new Size(res.Width, res.Height); + public static implicit operator TextureRes(Size size) => new TextureRes(size.Width, size.Height); + } + + internal class BlockBenchModel + { + [JsonProperty("name")] + internal string Name; + + [JsonProperty("meta")] + internal BlockBenchFormatInfo Format; + + [JsonProperty("model_identifier")] + internal string ModelIdentifier { get; set; } = ""; + + [JsonProperty("resolution")] + internal TextureRes TextureResolution; + + [JsonProperty("elements")] + internal Element[] Elements; + + [JsonProperty("outliner")] + internal JArray Outliner; + + [JsonProperty("textures")] + internal Texture[] Textures; + + internal static BlockBenchModel Create(BlockBenchFormatInfo formatInfo, string name, Size textureResolution, IEnumerable textures) + { + return new BlockBenchModel() + { + Name = name, + Textures = textures.ToArray(), + TextureResolution = textureResolution, + ModelIdentifier = "", + Format = formatInfo, + }; + } + } +} diff --git a/PckStuido.ModelSupport/Format/Internal/PSM/PSMFile.cs b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFile.cs new file mode 100644 index 00000000..1aebcecc --- /dev/null +++ b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFile.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using PckStudio.Core.Skin; + +namespace PckStudio.ModelSupport.Internal.Format +{ +/* + Magic - 3 bytes("psm") + Version - 1 byte [u8] + Anim - 4 bytes[int32] + NumberOfParts - 4 bytes[int32] + { + part parent - 1 byte (HEAD=0, BODY=1, LEG0=2, LEG1=3, ARM0=4, ARM1=5) + Position-X - 4 bytes (float32) + Position-Y - 4 bytes (float32) + Position-Z - 4 bytes (float32) + Size-X - 4 bytes (float32) + Size-Y - 4 bytes (float32) + Size-Z - 4 bytes (float32) + MirrorAndUvX - 1 bit flag 7 bits uv.x value(0-64) (s8) + HideWithArmorAndUvY - 1 bit flag 7 bits uv.y value(0-64) (s8) + inflation/scale value - 4 bytes (float32) + } + NumberOfOffsets - 4 bytes[int32] + { + offset part - 1 byte + vertical offset - 4 bytes[float] + } +*/ + public sealed class PSMFile + { + internal static readonly string HEADER_MAGIC = "psm"; + internal const byte CurrentVersion = 1; + + public readonly byte Version; + + internal PSMFile(byte version) + { + Version = version; + } + + internal PSMFile(byte version, SkinANIM skinANIM) + : this(version) + { + SkinANIM = skinANIM; + } + + public SkinANIM SkinANIM { get; private set; } + + public readonly List Parts = new List(); + public readonly List Offsets = new List(); + } + + public enum PSMOffsetType : byte + { + HEAD = 0, + BODY = 1, + ARM0 = 2, + ARM1 = 3, + LEG0 = 4, + LEG1 = 5, + + TOOL0 = 6, + TOOL1 = 7, + + HELMET = 8, + SHOULDER0 = 9, + SHOULDER1 = 10, + CHEST = 11, + WAIST = 12, + PANTS0 = 13, + PANTS1 = 14, + BOOT0 = 15, + BOOT1 = 16, + } + + public enum PSMParentType : byte + { + HEAD = 0, + BODY = 1, + ARM0 = 2, + ARM1 = 3, + LEG0 = 4, + LEG1 = 5, + } +} diff --git a/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileReader.cs b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileReader.cs new file mode 100644 index 00000000..40579ea3 --- /dev/null +++ b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileReader.cs @@ -0,0 +1,156 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using OMI; +using OMI.Workers; +using PckStudio.Core.FileFormats; +using PckStudio.Core; +using PckStudio.Core.Skin; + +namespace PckStudio.ModelSupport.Internal.Format +{ + internal class PSMFileReader : IDataFormatReader, IDataFormatReader + { + public PSMFile FromFile(string filename) + { + if (File.Exists(filename)) + { + using (var fs = File.OpenRead(filename)) + { + return FromStream(fs); + } + } + throw new FileNotFoundException(filename); + } + + public PSMFile FromStream(Stream stream) + { + using var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian); + + var magic = reader.ReadString(3); + if (magic != PSMFile.HEADER_MAGIC) + { + Trace.TraceError("PSMFileReader.FromStream - Failed to load csmb.\n\tReason: Header magic mismatch."); + return new PSMFile(byte.MaxValue); + } + + byte version = reader.ReadByte(); + if (version < 1 || version > 1) + { + Trace.TraceError("PSMFileReader.FromStream - Failed to load csmb.\n\tReason: Unsupported version."); + return new PSMFile(byte.MaxValue); + } + + var skinANIM = SkinANIM.FromValue(reader.ReadInt32()); + PSMFile csmbFile = new PSMFile(version, skinANIM); + int numOfParts = reader.ReadInt32(); + for (int i = 0; i < numOfParts; i++) + { + SkinBOX part = ReadPart(reader); + csmbFile.Parts.Add(part); + } + int numOfOffsets = reader.ReadInt32(); + for (int i = 0; i < numOfOffsets; i++) + { + SkinPartOffset offset = ReadOffset(reader); + csmbFile.Offsets.Add(offset); + } + + return csmbFile; + } + + private SkinBOX ReadPart(EndiannessAwareBinaryReader reader) + { + string type = GetParentType((PSMParentType)reader.ReadByte()); + float posX = reader.ReadSingle(); + float posY = reader.ReadSingle(); + float posZ = reader.ReadSingle(); + float sizeX = reader.ReadSingle(); + float sizeY = reader.ReadSingle(); + float sizeZ = reader.ReadSingle(); + byte mirrorAndUvX = reader.ReadByte(); + byte hideWithArmorAndUvY = reader.ReadByte(); + int uvX = mirrorAndUvX & 0x7f; + int uvY = hideWithArmorAndUvY & 0x7f; + bool mirror = (mirrorAndUvX & 0x80) != 0; + bool hideWithArmor = (hideWithArmorAndUvY & 0x80) != 0; + float scale = reader.ReadSingle(); + return new SkinBOX(type, new System.Numerics.Vector3(posX, posY, posZ), new System.Numerics.Vector3(sizeX, sizeY, sizeZ), new System.Numerics.Vector2(uvX, uvY), hideWithArmor, mirror, scale); + } + + private SkinPartOffset ReadOffset(EndiannessAwareBinaryReader reader) + { + PSMOffsetType type = (PSMOffsetType)reader.ReadByte(); + float value = reader.ReadSingle(); + return new SkinPartOffset(GetOffsetType(type), value); + } + + private static string GetParentType(PSMParentType type) + { + switch (type) + { + case PSMParentType.HEAD: + return "HEAD"; + case PSMParentType.BODY: + return "BODY"; + case PSMParentType.ARM0: + return "ARM0"; + case PSMParentType.ARM1: + return "ARM1"; + case PSMParentType.LEG0: + return "LEG0"; + case PSMParentType.LEG1: + return "LEG1"; + default: + throw new InvalidDataException(type.ToString()); + } + } + + private static string GetOffsetType(PSMOffsetType type) + { + switch (type) + { + case PSMOffsetType.HEAD: + return "HEAD"; + case PSMOffsetType.BODY: + return "BODY"; + case PSMOffsetType.ARM0: + return "ARM0"; + case PSMOffsetType.ARM1: + return "ARM1"; + case PSMOffsetType.LEG0: + return "LEG0"; + case PSMOffsetType.LEG1: + return "LEG1"; + case PSMOffsetType.TOOL0: + return "TOOL0"; + case PSMOffsetType.TOOL1: + return "TOOL1"; + case PSMOffsetType.HELMET: + return "HELMET"; + case PSMOffsetType.SHOULDER0: + return "SHOULDER0"; + case PSMOffsetType.SHOULDER1: + return "SHOULDER1"; + case PSMOffsetType.CHEST: + return "CHEST"; + case PSMOffsetType.WAIST: + return "WAIST"; + case PSMOffsetType.PANTS0: + return "PANTS0"; + case PSMOffsetType.PANTS1: + return "PANTS1"; + case PSMOffsetType.BOOT0: + return "BOOT0"; + case PSMOffsetType.BOOT1: + return "BOOT1"; + default: + throw new InvalidDataException(type.ToString()); + } + } + + object IDataFormatReader.FromStream(Stream stream) => FromStream(stream); + + object IDataFormatReader.FromFile(string filename) => FromFile(filename); + } +} diff --git a/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileWriter.cs b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileWriter.cs new file mode 100644 index 00000000..aebb3144 --- /dev/null +++ b/PckStuido.ModelSupport/Format/Internal/PSM/PSMFileWriter.cs @@ -0,0 +1,134 @@ +using System.IO; +using System.Text; +using PckStudio.Core.FileFormats; +using OMI.Workers; +using OMI; +using System; +using OpenTK; +using PckStudio.Core.Skin; + +namespace PckStudio.ModelSupport.Internal.Format +{ + internal class PSMFileWriter : IDataFormatWriter + { + PSMFile _PSM; + + public PSMFileWriter(PSMFile csmb) + { + _PSM = csmb; + } + + public void WriteToFile(string filename) + { + using(var fs = File.OpenWrite(filename)) + { + WriteToStream(fs); + } + } + + public void WriteToStream(Stream stream) + { + using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, ByteOrder.LittleEndian)) + { + writer.WriteString(PSMFile.HEADER_MAGIC); + writer.Write(_PSM.Version); + writer.Write(_PSM.SkinANIM.ToValue()); + writer.Write(_PSM.Parts.Count); + foreach (SkinBOX part in _PSM.Parts) + { + WritePart(writer, part); + } + writer.Write(_PSM.Offsets.Count); + foreach (SkinPartOffset offset in _PSM.Offsets) + { + writer.Write((byte)GetOffsetPart(offset.Type)); + writer.Write(offset.Value); + } + } + } + + private void WritePart(EndiannessAwareBinaryWriter writer, SkinBOX part) + { + writer.Write((byte)GetParentPart(part.Type)); + writer.Write(part.Pos.X); + writer.Write(part.Pos.Y); + writer.Write(part.Pos.Z); + writer.Write(part.Size.X); + writer.Write(part.Size.Y); + writer.Write(part.Size.Z); + + byte uvX = (byte)MathHelper.Clamp((int)part.UV.X, 0, 64); + byte uvY = (byte)MathHelper.Clamp((int)part.UV.Y, 0, 64); + byte mirrorAndUvX = (byte)(Convert.ToByte(part.Mirror) << 7 | uvX); + byte hideWithArmorAndUvY = (byte)(Convert.ToByte(part.HideWithArmor) << 7 | uvY); + + writer.Write(mirrorAndUvX); + writer.Write(hideWithArmorAndUvY); + writer.Write(part.Scale); + } + + private static PSMParentType GetParentPart(string type) + { + switch (type) + { + case "HEAD": + return PSMParentType.HEAD; + case "BODY": + return PSMParentType.BODY; + case "ARM0": + return PSMParentType.ARM0; + case "ARM1": + return PSMParentType.ARM1; + case "LEG0": + return PSMParentType.LEG0; + case "LEG1": + return PSMParentType.LEG1; + default: + throw new InvalidDataException(type); + } + } + + private static PSMOffsetType GetOffsetPart(string type) + { + switch (type) + { + case "HEAD": + return PSMOffsetType.HEAD; + case "BODY": + return PSMOffsetType.BODY; + case "ARM0": + return PSMOffsetType.ARM0; + case "ARM1": + return PSMOffsetType.ARM1; + case "LEG0": + return PSMOffsetType.LEG0; + case "LEG1": + return PSMOffsetType.LEG1; + case "TOOL0": + return PSMOffsetType.TOOL0; + case "TOOL1": + return PSMOffsetType.TOOL1; + case "HELMET": + return PSMOffsetType.HELMET; + case "SHOULDER0": + return PSMOffsetType.SHOULDER0; + case "SHOULDER1": + return PSMOffsetType.SHOULDER1; + case "CHEST": + return PSMOffsetType.CHEST; + case "WAIST": + return PSMOffsetType.WAIST; + case "PANTS0": + return PSMOffsetType.PANTS0; + case "PANTS1": + return PSMOffsetType.PANTS1; + case "BOOT0": + return PSMOffsetType.BOOT0; + case "BOOT1": + return PSMOffsetType.BOOT1; + default: + throw new InvalidDataException(type); + } + } + } +} diff --git a/PckStuido.ModelSupport/GameModelImporter.cs b/PckStuido.ModelSupport/GameModelImporter.cs new file mode 100644 index 00000000..5730d551 --- /dev/null +++ b/PckStuido.ModelSupport/GameModelImporter.cs @@ -0,0 +1,239 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.IO; +using System.Linq; +using System.Drawing; +using System.Numerics; +using System.Diagnostics; +using System.Collections.Generic; +using System.Collections.ObjectModel; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using OMI.Formats.Model; + +using PckStudio.Core.Json; +using PckStudio.Core.Extensions; +using PckStudio.Core; +using PckStudio.ModelSupport.Format.External; +using PckStuido.ModelSupport.Properties; +using NamedTexture = PckStudio.Core.NamedData; + +namespace PckStudio.ModelSupport +{ + public sealed class GameModelImporter : ModelImporter + { + public static GameModelImporter Default { get; } = new GameModelImporter(); + + public sealed class ModelExportSettings + { + public bool CreateModelOutline { get; set; } = true; + } + + public ModelExportSettings ExportSettings { get; } = new ModelExportSettings(); + + public sealed class ModelImportSettings + { + public int ModelVersion { get; set; } = 1; + } + + public ModelImportSettings ImportSettings { get; } = new ModelImportSettings(); + + public static ReadOnlyDictionary ModelMetaData { get; } = JsonConvert.DeserializeObject>(Resources.modelMetaData); + public static ReadOnlyDictionary DefaultModels { get; } = JsonConvert.DeserializeObject>(Resources.defaultModels); + + private GameModelImporter() + { + // TODO: add import functionality -miku + InternalAddProvider(new FileDialogFilter("Block bench model(*.bbmodel)", "*.bbmodel"), ImportBlockBenchModel, ExportBlockBenchModel); + } + + private readonly Vector3 bbModelTransformAxis = new Vector3(1, 1, 0); + // maybe get this value from the json. -miku + private readonly Vector3 _heightOffset = Vector3.UnitY * 24f; + + private void ExportBlockBenchModel(string filepath, GameModelInfo modelInfo) + { + BlockBenchModel blockBenchModel = BlockBenchModel.Create(BlockBenchFormatInfos.BedrockEntity, modelInfo.Model.Name, modelInfo.Model.TextureSize, modelInfo.Textures.Select(nt => (Texture)nt)); + blockBenchModel.ModelIdentifier = modelInfo.Model.Name; + + List elements = new List(modelInfo.Model.PartCount); + + if (!ModelMetaData.TryGetValue(modelInfo.Model.Name, out JsonModelMetaData modelMetaData)) + { + Trace.TraceError($"[{nameof(GameModelImporter)}:{nameof(ExportBlockBenchModel)}] Failed to get model meta data for '{modelInfo.Model.Name}'."); + return; + } + + IEnumerable outlines = ConvertToOutlines(modelInfo.Model, Vector3.Zero, modelMetaData.RootParts, elements.AddRange); + + blockBenchModel.Elements = elements.ToArray(); + if (ExportSettings.CreateModelOutline) + outlines = new Outline[1] + { + new Outline(modelInfo.Model.Name) { Children = JArray.FromObject(outlines) } + }; + + blockBenchModel.Outliner = JArray.FromObject(outlines); + + string content = JsonConvert.SerializeObject(blockBenchModel, Formatting.Indented); + File.WriteAllText(filepath, content); + } + + private Element ToElement(string partName, ModelBox modelBox, Vector3 partTranslation) + { + Element element = CreateElement(partName, modelBox, partTranslation, bbModelTransformAxis, _heightOffset); + //element.Rotation = rotation * TransformSpace(Vector3.One, Vector3.Zero, bbModelTransformAxis); + //element.Origin = outline.Origin; + return element; + } + + private Outline[] ConvertToOutlines(Model model, Vector3 parentRotation, IReadOnlyCollection keyValues, Action addElements, int depth = 0) + { + Outline CreateOutline(ModelPart modelPart) + { + Outline outline = new Outline(modelPart.Name); + + Vector3 partTranslation = modelPart.Translation; + outline.Origin = TransformSpace(partTranslation, Vector3.Zero, bbModelTransformAxis); + outline.Origin += _heightOffset; + + Vector3 rotation = modelPart.Rotation; + outline.Rotation = rotation * TransformSpace(Vector3.One, Vector3.Zero, bbModelTransformAxis); + outline.Rotation += parentRotation; + + Element[] elements1 = modelPart.GetBoxes().Select(box => ToElement(modelPart.Name, box, partTranslation)).ToArray(); + addElements(elements1); + + outline.Children.Add(elements1.Select(element => element.Uuid).ToArray()); + return outline; + } + + if (depth == 0 && keyValues.Count == 0) + { + return model.GetParts().Select(CreateOutline).ToArray(); + } + + List outlines = new List(); + foreach (ModelMetaDataPart item in keyValues) + { + if (!model.TryGetPart(item.Name, out ModelPart modelPart)) + { + Debug.WriteLine($"{nameof(item.Name)}: '{item.Name}' not in {nameof(model)}."); + continue; + } + Outline partentOutline = CreateOutline(modelPart); + JToken[] s = ConvertToOutlines(model, modelPart.Rotation, item.Children, addElements, depth + 1).Select(JToken.FromObject).ToArray(); + partentOutline.Children.Add(s); + outlines.Add(partentOutline); + } + return outlines.ToArray(); + } + + + private static Element CreateElement(string name, ModelBox box, Vector3 origin, Vector3 translationUnit, Vector3 offset) + { + Vector3 pos = box.Position; + Vector3 size = box.Size; + Vector3 transformPos = TransformSpace(pos + origin, size, translationUnit) + offset; + return Element.CreateCube(name, box.Uv, transformPos, size, box.Inflate, box.Mirror); + } + + private GameModelInfo ImportBlockBenchModel(string filepath) + { + BlockBenchModel blockBenchModel = JsonConvert.DeserializeObject(File.ReadAllText(filepath)); + if (!blockBenchModel.Format.UseBoxUv) + { + Trace.TraceError($"[{nameof(GameModelImporter)}:{nameof(ImportBlockBenchModel)}] Failed to import model '{blockBenchModel.ModelIdentifier}': Model does not use box uv."); + return null; + } + + if (!ModelMetaData.TryGetValue(blockBenchModel.ModelIdentifier, out JsonModelMetaData modelMetaData)) + { + Trace.TraceError($"[{nameof(GameModelImporter)}:{nameof(ImportBlockBenchModel)}] Failed to import model '{blockBenchModel.ModelIdentifier}': No model meta data found."); + return null; + } + + IEnumerable textures = blockBenchModel.Textures + .Where(t => modelMetaData.TextureLocations.Any(texName => !string.IsNullOrEmpty(t.Name) && texName.EndsWith(Path.GetFileNameWithoutExtension(t.Name)))) + .Select(t => new NamedTexture(modelMetaData.TextureLocations.First(texName => texName.EndsWith(Path.GetFileNameWithoutExtension(t.Name))), (Image)t)); + + Model model = new Model(blockBenchModel.ModelIdentifier, blockBenchModel.TextureResolution); + + JArray rootOutline = blockBenchModel.Outliner + .FirstOrDefault(token => token.Type == JTokenType.Object && token.ToObject().Name == blockBenchModel.ModelIdentifier) + ?.ToObject().Children ?? blockBenchModel.Outliner; + + foreach (Outline outline in rootOutline.Where(token => token.Type == JTokenType.Object).Select(token => token.ToObject())) + { + foreach (ModelPart part in ConvertOutlineToModelPart(outline, blockBenchModel.Elements)) + { + model.AddPart(part); + } + } + + return new GameModelInfo(model, textures); + } + + private IEnumerable ConvertOutlineToModelPart(Outline root, IReadOnlyCollection elements) + { + List parts = new List( + root.Children + .Where(token => token.Type == JTokenType.Object) + .SelectMany(token => ConvertOutlineToModelPart(token.ToObject(), elements)) + ); + + IEnumerable modelBoxElements = root.Children + .Where(token => token.Type == JTokenType.String && Guid.TryParse(token.ToString(), out Guid _)) + .Select(token => elements.First(e => e.Uuid == Guid.Parse(token.ToString()))) + .Where(element => element.Type == "cube" && element.UseBoxUv && element.Export); + + Vector3 additionalRotation = new Vector3(); + Element first = modelBoxElements.FirstOrDefault() ?? new Element() { Rotation = Vector3.Zero }; + if (first.Rotation != Vector3.Zero) + { + if (!modelBoxElements.All(e => e.Rotation == first.Rotation)) + { + Trace.TraceError($"[{nameof(GameModelImporter)}:{nameof(ImportBlockBenchModel)}] Rotation can't be applied for single elements."); + return Enumerable.Empty(); + } + additionalRotation = first.Rotation; + } + Vector3 translation = TransformSpace(root.Origin - _heightOffset, Vector3.Zero, bbModelTransformAxis); + Vector3 rotation = TransformSpace(root.Rotation, Vector3.Zero, bbModelTransformAxis); + ModelPart part = new ModelPart(root.Name, string.Empty, translation, rotation, additionalRotation); + part.AddBoxes(modelBoxElements.Select(box => ConvertElementToModelBox(box, part.Translation))); + parts.Add(part); + return parts; + } + + private ModelBox ConvertElementToModelBox(Element element, Vector3 translation) + { + BoundingBox boundingBox = new BoundingBox(element.From, element.To); + + Vector3 pos = boundingBox.Start.ToNumericsVector(); + Vector3 size = boundingBox.Volume.ToNumericsVector(); + + Vector3 transformedPos = TransformSpace(pos, size, bbModelTransformAxis) - translation + _heightOffset; + + return new ModelBox(transformedPos, size, element.UvOffset, element.Inflate, element.MirrorUv); + } + } +} diff --git a/PckStuido.ModelSupport/GameModelInfo.cs b/PckStuido.ModelSupport/GameModelInfo.cs new file mode 100644 index 00000000..dd53eb5a --- /dev/null +++ b/PckStuido.ModelSupport/GameModelInfo.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using OMI.Formats.Model; +using NamedTexture = PckStudio.Core.NamedData; + +namespace PckStudio.ModelSupport +{ + public sealed class GameModelInfo + { + public Model Model { get; } + + public IEnumerable Textures { get; } + + public GameModelInfo(Model model, IEnumerable textures) + { + Model = model; + Textures = textures; + } + + } +} diff --git a/PckStuido.ModelSupport/Json/JsonDefaultModel.cs b/PckStuido.ModelSupport/Json/JsonDefaultModel.cs new file mode 100644 index 00000000..2fb3aadc --- /dev/null +++ b/PckStuido.ModelSupport/Json/JsonDefaultModel.cs @@ -0,0 +1,48 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; + +namespace PckStudio.Core.Json +{ + public class DefaultModel + { + [JsonProperty("textureSize", Required = Required.Always)] + public Vector2 TextureSize { get; set; } + + [JsonProperty("parts", Required = Required.Always)] + public DefaultPart[] Parts { get; set; } = Array.Empty(); + } + + public class DefaultPart + { + [JsonProperty("name", Required = Required.Always)] + public string Name { get; set; } + + [JsonProperty("translation")] + public Vector3 Translation { get; set; } = Vector3.Zero; + + [JsonProperty("rotation")] + public Vector3 Rotation { get; set; } = Vector3.Zero; + + [JsonProperty("boxes")] + public ModelDefaultBox[] Boxes { get; set; } + } + + public class ModelDefaultBox + { + [JsonProperty("pos")] + public Vector3 Position { get; set; } + + [JsonProperty("size")] + public Vector3 Size { get; set; } + + [JsonProperty("uv")] + public Vector2 Uv { get; set; } + + [JsonProperty("mirror")] + public bool Mirror { get; set; } = false; + + [JsonProperty("inflate")] + public float Inflate { get; set; } = 0f; + } +} diff --git a/PckStuido.ModelSupport/Json/JsonModelMetaData.cs b/PckStuido.ModelSupport/Json/JsonModelMetaData.cs new file mode 100644 index 00000000..d274cfb3 --- /dev/null +++ b/PckStuido.ModelSupport/Json/JsonModelMetaData.cs @@ -0,0 +1,46 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; + +namespace PckStudio.Core.Json +{ + public class ModelMetaDataPart + { + [JsonProperty("name", Required = Required.Always)] + public string Name { get; set; } + + [JsonProperty("children", NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)] + public ModelMetaDataPart[] Children { get; set; } = Array.Empty(); + + [JsonConstructor] + public ModelMetaDataPart() + { + } + + public ModelMetaDataPart(string name) + : this(name, Array.Empty()) + { + } + + public ModelMetaDataPart(string name, params ModelMetaDataPart[] children) + { + Name = name; + Children = children; + } + } + + public class JsonModelMetaData + { + [JsonProperty("textureLocations", Required = Required.Always)] + public string[] TextureLocations { get; set; } + + [JsonProperty("materialName", NullValueHandling = NullValueHandling.Ignore)] + public string MaterialName { get; set; } = string.Empty; + + [JsonProperty("uv_offsets", NullValueHandling = NullValueHandling.Ignore)] + public Vector2[] UvOffsets { get; set; } = Array.Empty(); + + [JsonProperty("parts", NullValueHandling = NullValueHandling.Ignore)] + public ModelMetaDataPart[] RootParts { get; set; } = Array.Empty(); + } +} diff --git a/PckStuido.ModelSupport/ModelImporter.cs b/PckStuido.ModelSupport/ModelImporter.cs new file mode 100644 index 00000000..ee32a94a --- /dev/null +++ b/PckStuido.ModelSupport/ModelImporter.cs @@ -0,0 +1,178 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Numerics; +using PckStudio.Core; +using PckStudio.Interfaces; + +namespace PckStudio.ModelSupport +{ + public abstract class ModelImporter where T : class + { + private Dictionary> _importProviders = new Dictionary>(); + + private sealed class InternalImportProvider : IModelImportProvider + { + public string Name => nameof(InternalImportProvider); + + public FileDialogFilter DialogFilter => _dialogFilter; + + public bool SupportImport => _import != null; + + public bool SupportExport => _export != null; + + private FileDialogFilter _dialogFilter; + private Func _import; + private Action _export; + + public InternalImportProvider(FileDialogFilter dialogFilter, Func import, Action export) + { + _dialogFilter = dialogFilter; + _import = import; + _export = export; + } + + public void Export(string filename, T model) + { + _ = _export ?? throw new NotImplementedException(); + _export(filename, model); + } + + public T Import(string filename) + { + _ = _import ?? throw new NotImplementedException(); + return _import(filename); + } + + public void Export(ref Stream stream, T model) + { + throw new NotImplementedException(); + } + + public T Import(Stream stream) + { + throw new NotImplementedException(); + } + } + + /// + /// Filter that can be used for or + /// + public string SupportedModelFileFormatsFilter => string.Join("|", _importProviders.Values.Select(p => p.DialogFilter)); + + public T Import(string filename) + { + if (!File.Exists(filename)) + { + Trace.TraceWarning($"[{nameof(ModelImporter)}:Import] Failed to import '{filename}'. File does not exist."); + return default; + } + + if (!HasProvider(filename)) + { + Trace.TraceWarning($"[{nameof(ModelImporter)}:Import] No provider found for '{Path.GetExtension(filename)}'."); + return default; + } + + IModelImportProvider provider = GetProvider(filename); + if (!provider.SupportImport) + { + throw new NotSupportedException($"Provider '{provider.Name}' does not support importing."); + } + + return provider.Import(filename); + } + + public void Export(string filename, T model) + { + if (model is null) + { + Trace.TraceError($"[{nameof(ModelImporter)}:Export] Model is null."); + return; + } + + if (!HasProvider(filename)) + { + Trace.TraceWarning($"[{nameof(ModelImporter)}:Export] No provider found for '{Path.GetExtension(filename)}'."); + return; + } + + IModelImportProvider provider = GetProvider(filename); + if (!provider.SupportExport) + { + throw new NotSupportedException($"Provider '{provider.Name}' does not support exporting."); + } + provider.Export(filename, model); + } + + internal bool AddProvider(IModelImportProvider provider) + { + if (_importProviders.ContainsKey(provider.DialogFilter.Extension)) + return false; + + _importProviders.Add(provider.DialogFilter.Extension, provider); + return true; + } + + protected bool InternalAddProvider(FileDialogFilter dialogFilter, Func import, Action export) + { + return AddProvider(new InternalImportProvider(dialogFilter, import, export)); + } + + /// + /// Translates coordinate unit system into our coordinate system + /// + /// Position/Origin of the Object(Cube). + /// The Size of the Object(Cube). + /// Describes what axises need translation. + /// The translated position + protected static Vector3 TransformSpace(Vector3 origin, Vector3 size, Vector3 translationUnit) + { + // The translation unit describes what axises need to be swapped + // Example: + // translation unit = (1, 0, 0) => This translation unit will ONLY swap the X axis + translationUnit = Vector3.Clamp(translationUnit, Vector3.Zero, Vector3.One); + // To better understand see: + // https://sharplab.io/#v2:C4LgTgrgdgNAJiA1AHwAICYCMBYAUKgBgAJVMA6AOQgFsBTMASwGMBnAbj1QGYT0iBhIgG88RMb3SjxI3OLlEAbgEMwRBlAAOEYEQC8RKLQDuRAGq0mwAPZguACkwwijogQCUHWfLHLVtAB4aFsC0cHoGxmbBNvYAtC7xTpgeUt6+RGC0LOEAKmBKUCwAYjbU/FY2cOpKISx26lrAKV7epACcdpkszd5i7Z1ZevoBQZahPeIAvqlEM9wkmABsUZYxRHkFxaXlldW1duartmqa2m4zMr2KKhmD+ofWtmT8ADZK1Br1p8BODzFkAC16FZftEngB5QwTbxdIgAKn06E8V1hsXuYK4ZEhtGRvVQAHYiLEurixNNcJMgA + Vector3 transformUnit = -((translationUnit * 2) - Vector3.One); + + Vector3 pos = origin; + // The next line essentialy does uses the fomular below just on all axis. + // x = -(pos.x + size.x) + pos *= transformUnit; + pos -= size * translationUnit; + return pos; + } + + private bool HasProvider(string filename) + { + string fileExtension = Path.GetExtension(filename); + return _importProviders.ContainsKey(fileExtension) && _importProviders[fileExtension] is not null; + } + + private IModelImportProvider GetProvider(string filename) + { + string fileExtension = Path.GetExtension(filename); + return _importProviders.ContainsKey(fileExtension) ? _importProviders[fileExtension] : null; + } + } +} diff --git a/PckStuido.ModelSupport/PckStuido.ModelSupport.csproj b/PckStuido.ModelSupport/PckStuido.ModelSupport.csproj new file mode 100644 index 00000000..d7697c87 --- /dev/null +++ b/PckStuido.ModelSupport/PckStuido.ModelSupport.csproj @@ -0,0 +1,96 @@ + + + + + Debug + AnyCPU + {43BCACD7-5405-4499-9B45-E1435AC03C26} + Library + NDEBUG + Properties + PckStuido.ModelSupport + PckStuido.ModelSupport + v4.8 + 12 + 512 + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + 13.0.3 + + + + + {345eabed-f0d1-4d04-b409-babdef747352} + PckStudio.Core + + + {693aebc1-293d-4df0-bcae-26a1099fe7bb} + OMI Filetype Library + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + + + + \ No newline at end of file diff --git a/PckStuido.ModelSupport/Properties/AssemblyInfo.cs b/PckStuido.ModelSupport/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..4e98a15b --- /dev/null +++ b/PckStuido.ModelSupport/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PckStuido.ModelSupport")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PckStuido.ModelSupport")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("43bcacd7-5405-4499-9b45-e1435ac03c26")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PckStuido.ModelSupport/Properties/Resources.Designer.cs b/PckStuido.ModelSupport/Properties/Resources.Designer.cs new file mode 100644 index 00000000..b98cf665 --- /dev/null +++ b/PckStuido.ModelSupport/Properties/Resources.Designer.cs @@ -0,0 +1,120 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PckStuido.ModelSupport.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PckStuido.ModelSupport.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to { + /// "bat": { + /// "textureSize": { "X": 64, "Y": 64 }, + /// "parts": [ + /// { + /// "name": "head", + /// "boxes": [ + /// { "pos": { "X": -3, "Y": -3, "Z": -3 }, "size": { "X": 6, "Y": 6, "Z": 6 }, "uv": { "X": 0, "Y": 0 } } + /// ] + /// }, + /// { + /// "name": "body", + /// "boxes": [ + /// { "pos": { "X": -3, "Y": 4, "Z": -3 }, "size": { "X": 6, "Y": 12, "Z": 6 }, "uv": { "X": 0, "Y": 16 } }, + /// { "pos": { "X": -5, "Y": 16, "Z": 0 }, "size": { "X": 10, "Y": 6, "Z": [rest of string was truncated]";. + /// + internal static string defaultModels { + get { + return ResourceManager.GetString("defaultModels", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to { + /// "bat": { + /// "textureLocations": [ + /// "res/mob/bat" + /// ], + /// "materialName": "bat", + /// "parts": [ + /// { + /// "name": "head", + /// "children": [ + /// { "name": "rightEar" }, + /// { "name": "leftEar" } + /// ] + /// }, + /// { + /// "name": "body", + /// "children": [ + /// { + /// "name": "rightWing", + /// "children": [ + /// { "name": "rightWingTip" } + /// ] + /// }, + /// { + /// "name": "leftWing", + /// [rest of string was truncated]";. + /// + internal static string modelMetaData { + get { + return ResourceManager.GetString("modelMetaData", resourceCulture); + } + } + } +} diff --git a/PckStuido.ModelSupport/Properties/Resources.resx b/PckStuido.ModelSupport/Properties/Resources.resx new file mode 100644 index 00000000..b1909c61 --- /dev/null +++ b/PckStuido.ModelSupport/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\defaultModels.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\modelMetaData.json;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;iso-8859-1 + + \ No newline at end of file diff --git a/PckStuido.ModelSupport/Resources/defaultModels.json b/PckStuido.ModelSupport/Resources/defaultModels.json new file mode 100644 index 00000000..c77963e9 --- /dev/null +++ b/PckStuido.ModelSupport/Resources/defaultModels.json @@ -0,0 +1,619 @@ +{ + "bat": { + "textureSize": { "X": 64, "Y": 64 }, + "parts": [ + { + "name": "head", + "boxes": [ + { "pos": { "X": -3, "Y": -3, "Z": -3 }, "size": { "X": 6, "Y": 6, "Z": 6 }, "uv": { "X": 0, "Y": 0 } } + ] + }, + { + "name": "body", + "boxes": [ + { "pos": { "X": -3, "Y": 4, "Z": -3 }, "size": { "X": 6, "Y": 12, "Z": 6 }, "uv": { "X": 0, "Y": 16 } }, + { "pos": { "X": -5, "Y": 16, "Z": 0 }, "size": { "X": 10, "Y": 6, "Z": 1 }, "uv": { "X": 0, "Y": 34 } } + ] + }, + { + "name": "rightEar", + "boxes": [ + { "pos": { "X": -4, "Y": -6, "Z": -2 }, "size": { "X": 3, "Y": 4, "Z": 1 }, "uv": { "X": 24, "Y": 0 } } + ] + }, + { + "name": "leftEar", + "boxes": [ + { "pos": { "X": 1, "Y": -6, "Z": -2 }, "size": { "X": 3, "Y": 4, "Z": 1 }, "uv": { "X": 24, "Y": 0 }, "mirror": true } + ] + }, + { + "name": "rightWing", + "boxes": [ + { "pos": { "X": -12, "Y": 1, "Z": 1.5 }, "size": { "X": 10, "Y": 16, "Z": 1 }, "uv": { "X": 42, "Y": 0 } } + ] + }, + { + "name": "rightWingTip", + "translation": { "X": -12, "Y": 1, "Z": 1.5 }, + "boxes": [ + { "pos": { "X": -8, "Y": 1, "Z": 0 }, "size": { "X": 8, "Y": 12, "Z": 1 }, "uv": { "X": 24, "Y": 16 } } + ] + }, + { + "name": "leftWing", + "boxes": [ + { "pos": { "X": 2, "Y": 1, "Z": 1.5 }, "size": { "X": 10, "Y": 16, "Z": 1 }, "uv": { "X": 42, "Y": 0 }, "mirror": true } + ] + }, + { + "name": "leftWingTip", + "translation": { "X": 12, "Y": 1, "Z": 1.5 }, + "boxes": [ + { "pos": { "X": 0, "Y": 1, "Z": 0 }, "size": { "X": 8, "Y": 12, "Z": 1 }, "uv": { "X": 24, "Y": 16 }, "mirror": true } + ] + } + ] + }, + "trident": { + "textureSize": { "X": 32, "Y": 32 }, + "parts": [ + { + "name": "pole", + "boxes": [ + { "pos": { "X": -0.5, "Y": -4, "Z": -0.5 }, "size": { "X": 1, "Y": 31, "Z": 1 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -1.5, "Y": 0, "Z": -0.5 }, "size": { "X": 3, "Y": 2, "Z": 1 }, "uv": { "X": 4, "Y": 0 } }, + { "pos": { "X": -2.5, "Y": -3, "Z": -0.5 }, "size": { "X": 1, "Y": 4, "Z": 1 }, "uv": { "X": 4, "Y": 3 } }, + { "pos": { "X": 1.5, "Y": -3, "Z": -0.5 }, "size": { "X": 1, "Y": 4, "Z": 1 }, "uv": { "X": 4, "Y": 3 }, "mirror": true } + ] + } + ] + }, + "irongolem": { + "textureSize": { "X": 128, "Y": 128 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 0, "Z": -2 }, + "boxes": [ + { "pos": { "X": -4, "Y": -12, "Z": -5.5 }, "size": { "X": 8, "Y": 10, "Z": 8 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -1, "Y": -5, "Z": -7.5 }, "size": { "X": 2, "Y": 4, "Z": 2 }, "uv": { "X": 24, "Y": 0 } } + ] + }, + { + "name": "body", + "boxes": [ + { "pos": { "X": -9, "Y": -2, "Z": -6 }, "size": { "X": 18, "Y": 12, "Z": 11 }, "uv": { "X": 0, "Y": 40 } }, + { "pos": { "X": -4.5, "Y": 10, "Z": -3 }, "size": { "X": 9, "Y": 5, "Z": 6 }, "uv": { "X": 0, "Y": 70 }, "inflate": 0.5 } + ] + }, + { + "name": "arm0", + "translation": { "X": 0, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -13, "Y": -2.5, "Z": -3 }, "size": { "X": 4, "Y": 30, "Z": 6 }, "uv": { "X": 60, "Y": 58 } } + ] + }, + { + "name": "arm1", + "translation": { "X": 0, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": 9, "Y": -2.5, "Z": -3 }, "size": { "X": 4, "Y": 30, "Z": 6 }, "uv": { "X": 60, "Y": 21 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -4, "Y": 18, "Z": 0 }, + "boxes": [ + { "pos": { "X": -3.5, "Y": -3, "Z": -3 }, "size": { "X": 6, "Y": 16, "Z": 5 }, "uv": { "X": 37, "Y": 0 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 5, "Y": 18, "Z": 0 }, + "boxes": [ + { "pos": { "X": -3.5, "Y": -3, "Z": -3 }, "size": { "X": 6, "Y": 16, "Z": 5 }, "uv": { "X": 60, "Y": 0 }, "mirror": true } + ] + } + ] + }, + "dolphin": { + "textureSize": { "X": 64, "Y": 64 }, + "parts": [ + { + "name": "head", + "boxes": [ + { "pos": { "X": -4, "Y": -7, "Z": -6 }, "size": { "X": 8, "Y": 7, "Z": 6 }, "uv": { "X": 0, "Y": 0 } } + ] + }, + { + "name": "nose", + "translation": { "X": 0, "Y": 0, "Z": -10 }, + "boxes": [ + { "pos": { "X": -1, "Y": -2, "Z": 0 }, "size": { "X": 2, "Y": 2, "Z": 4 }, "uv": { "X": 0, "Y": 13 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 0, "Z": 0 }, + "rotation": { "X": 0, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -4, "Y": -7, "Z": 0 }, "size": { "X": 8, "Y": 7, "Z": 13 }, "uv": { "X": 0, "Y": 13 } } + ] + }, + { + "name": "back_fin", + "translation": { "X": 0, "Y": -7, "Z": 7 }, + "boxes": [ + { "pos": { "X": -0.5, "Y": -5, "Z": -1 }, "size": { "X": 1, "Y": 5, "Z": 4 }, "uv": { "X": 29, "Y": 0 } } + ] + }, + { + "name": "left_fin", + "translation": { "X": 3, "Y": -1, "Z": 2 }, + "boxes": [ + { "pos": { "X": 0, "Y": -1, "Z": -1 }, "size": { "X": 8, "Y": 1, "Z": 4 }, "uv": { "X": 40, "Y": 0 } } + ] + }, + { + "name": "right_fin", + "translation": { "X": -3, "Y": -1, "Z": 2 }, + "boxes": [ + { "pos": { "X": -8, "Y": -1, "Z": -1 }, "size": { "X": 8, "Y": 1, "Z": 4 }, "uv": { "X": 40, "Y": 6 } } + ] + }, + { + "name": "tail", + "translation": { "X": 0, "Y": -2.5, "Z": 14 }, + "boxes": [ + { "pos": { "X": -2, "Y": -2.5, "Z": -1 }, "size": { "X": 4, "Y": 5, "Z": 11 }, "uv": { "X": 0, "Y": 33 } } + ] + }, + { + "name": "tail_fin", + "translation": { "X": 0, "Y": 0, "Z": 24 }, + "boxes": [ + { "pos": { "X": -5, "Y": -2.5, "Z": -1 }, "size": { "X": 10, "Y": 1, "Z": 6 }, "uv": { "X": 0, "Y": 49 } } + ] + } + ] + }, + "creeper_head": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "boxes": [ + { "pos": { "X": -4, "Y": -8, "Z": -4 }, "size": { "X": 8, "Y": 8, "Z": 8 }, "uv": { "X": 0, "Y": 0 } } + ] + } + ] + }, + "creeper": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 6, "Z": 0 }, + "boxes": [ + { "pos": { "X": -4, "Y": -8, "Z": -4 }, "size": { "X": 8, "Y": 8, "Z": 8 }, "uv": { "X": 0, "Y": 0 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 6, "Z": 0 }, + "boxes": [ + { "pos": { "X": -4, "Y": 0, "Z": -2 }, "size": { "X": 8, "Y": 12, "Z": 4 }, "uv": { "X": 16, "Y": 16 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -2, "Y": 18, "Z": 4 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 2, "Y": 18, "Z": 4 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg2", + "translation": { "X": -2, "Y": 18, "Z": -4 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg3", + "translation": { "X": 2, "Y": 18, "Z": -4 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + } + ] + }, + "boat": { + "textureSize": { "X": 128, "Y": 64 }, + "parts": [ + { + "name": "bottom", + "translation": { "X": 0, "Y": 3, "Z": 1 }, + "rotation": { "X": 90, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -14, "Y": -9, "Z": -3 }, "size": { "X": 28, "Y": 16, "Z": 3 }, "uv": { "X": 0, "Y": 0 } } + ] + }, + { + "name": "front", + "translation": { "X": 15, "Y": 4, "Z": 0 }, + "rotation": { "X": 0, "Y": 90, "Z": 0 }, + "boxes": [ + { "pos": { "X": -8, "Y": -7, "Z": -1 }, "size": { "X": 16, "Y": 6, "Z": 2 }, "uv": { "X": 0, "Y": 27 } } + ] + }, + { + "name": "back", + "translation": { "X": -15, "Y": 4, "Z": 4 }, + "rotation": { "X": 0, "Y": 270, "Z": 0 }, + "boxes": [ + { "pos": { "X": -13, "Y": -7, "Z": -1 }, "size": { "X": 18, "Y": 6, "Z": 2 }, "uv": { "X": 0, "Y": 19 } } + ] + }, + { + "name": "left", + "translation": { "X": 0, "Y": 4, "Z": 9 }, + "boxes": [ + { "pos": { "X": -14, "Y": -7, "Z": -1 }, "size": { "X": 28, "Y": 6, "Z": 2 }, "uv": { "X": 0, "Y": 43 } } + ] + }, + { + "name": "right", + "translation": { "X": 0, "Y": 4, "Z": -9 }, + "rotation": { "X": 0, "Y": 180, "Z": 0 }, + "boxes": [ + { "pos": { "X": -14, "Y": -7, "Z": -1 }, "size": { "X": 28, "Y": 6, "Z": 2 }, "uv": { "X": 0, "Y": 35 } } + ] + }, + { + "name": "paddle_left", + "translation": { "X": 3, "Y": -5, "Z": 9 }, + "rotation": { "X": 0, "Y": 0, "Z": 11.25 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -5 }, "size": { "X": 2, "Y": 2, "Z": 18 }, "uv": { "X": 62, "Y": 0 } }, + { "pos": { "X": -1.001, "Y": -3, "Z": 8 }, "size": { "X": 1, "Y": 6, "Z": 7 }, "uv": { "X": 62, "Y": 0 } } + ] + }, + { + "name": "paddle_right", + "translation": { "X": 3, "Y": -5, "Z": -9 }, + "rotation": { "X": 0, "Y": 180, "Z": 11.25 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -5 }, "size": { "X": 2, "Y": 2, "Z": 18 }, "uv": { "X": 62, "Y": 20 } }, + { "pos": { "X": 0.001, "Y": -3, "Z": 8 }, "size": { "X": 1, "Y": 6, "Z": 7 }, "uv": { "X": 62, "Y": 20 } } + ] + } + ] + }, + "bed":{ + "textureSize": { "X": 64, "Y": 128 }, + "parts": [ + { + "name": "bed", + "boxes": [ + { "pos": { "X": 0, "Y": 0, "Z": 0 }, "size": { "X": 16, "Y": 32, "Z": 6 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": 3, "Y": 31, "Z": 6 }, "size": { "X": 10, "Y": 1, "Z": 3 }, "uv": { "X": 38, "Y": 2 } }, + { "pos": { "X": 3, "Y": 0, "Z": 6 }, "size": { "X": 10, "Y": 1, "Z": 3 }, "uv": { "X": 38, "Y": 38 } }, + { "pos": { "X": 15, "Y": 3, "Z": 6 }, "size": { "X": 1, "Y": 26, "Z": 3 }, "uv": { "X": 52, "Y": 6 } }, + { "pos": { "X": 0, "Y": 3, "Z": 6 }, "size": { "X": 1, "Y": 26, "Z": 3 }, "uv": { "X": 44, "Y": 6 } } + ] + }, + { + "name": "leg0", + "boxes": [ + { "pos": { "X": 0, "Y": 29, "Z": 6 }, "size": { "X": 3, "Y": 3, "Z": 3 }, "uv": { "X": 0, "Y": 44 } } + ] + }, + { + "name": "leg1", + "boxes": [ + { "pos": { "X": 13, "Y": 29, "Z": 6 }, "size": { "X": 3, "Y": 3, "Z": 3 }, "uv": { "X": 12, "Y": 44 } } + ] + }, + { + "name": "leg2", + "boxes": [ + { "pos": { "X": 0, "Y": 0, "Z": 6 }, "size": { "X": 3, "Y": 3, "Z": 3 }, "uv": { "X": 0, "Y": 38 } } + ] + }, + { + "name": "leg3", + "boxes": [ + { "pos": { "X": 13, "Y": 0, "Z": 6 }, "size": { "X": 3, "Y": 3, "Z": 3 }, "uv": { "X": 12, "Y": 38 } } + ] + } + ] + }, + "chicken": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 15, "Z": -4 }, + "boxes": [ + { "pos": { "X": -2, "Y": -6, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 3 }, "uv": { "X": 0, "Y": 0 } } + ] + }, + { + "name": "beak", + "translation": { "X": 0, "Y": 15, "Z": -4 }, + "boxes": [ + { "pos": { "X": -2, "Y": -4, "Z": -4 }, "size": { "X": 4, "Y": 2, "Z": 2 }, "uv": { "X": 14, "Y": 0 } } + ] + }, + { + "name": "comb", + "translation": { "X": 0, "Y": 15, "Z": -4 }, + "boxes": [ + { "pos": { "X": -1, "Y": -2, "Z": -3 }, "size": { "X": 2, "Y": 2, "Z": 2 }, "uv": { "X": 14, "Y": 4 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 16, "Z": 0 }, + "boxes": [ + { "pos": { "X": -3, "Y": -4, "Z": -3 }, "size": { "X": 6, "Y": 8, "Z": 6 }, "uv": { "X": 0, "Y": 9 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -2, "Y": 19, "Z": 1 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -3 }, "size": { "X": 3, "Y": 5, "Z": 3 }, "uv": { "X": 26, "Y": 0 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 1, "Y": 19, "Z": 1 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -3 }, "size": { "X": 3, "Y": 5, "Z": 3 }, "uv": { "X": 26, "Y": 0 } } + ] + }, + { + "name": "wing0", + "translation": { "X": -4, "Y": 13, "Z": 0 }, + "boxes": [ + { "pos": { "X": 0, "Y": 0, "Z": -3 }, "size": { "X": 1, "Y": 4, "Z": 6 }, "uv": { "X": 24, "Y": 13 } } + ] + }, + { + "name": "wing1", + "translation": { "X": 4, "Y": 13, "Z": 0 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -3 }, "size": { "X": 1, "Y": 4, "Z": 6 }, "uv": { "X": 24, "Y": 13 } } + ] + } + ] + }, + "cow": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 4, "Z": -8 }, + "boxes": [ + { "pos": { "X": -4, "Y": -4, "Z": -6 }, "size": { "X": 8, "Y": 8, "Z": 6 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -5, "Y": -5, "Z": -4 }, "size": { "X": 1, "Y": 3, "Z": 1 }, "uv": { "X": 22, "Y": 0 } }, + { "pos": { "X": 4, "Y": -5, "Z": -4 }, "size": { "X": 1, "Y": 3, "Z": 1 }, "uv": { "X": 22, "Y": 0 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 5, "Z": 2 }, + "rotation": { "X": 90, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -6, "Y": -10, "Z": -7 }, "size": { "X": 12, "Y": 18, "Z": 10 }, "uv": { "X": 18, "Y": 4 } }, + { "pos": { "X": -2, "Y": 2, "Z": -8 }, "size": { "X": 4, "Y": 6, "Z": 1 }, "uv": { "X": 52, "Y": 0 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -4, "Y": 12, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 4, "Y": 12, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg2", + "translation": { "X": -4, "Y": 12, "Z": -6 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg3", + "translation": { "X": 4, "Y": 12, "Z": -6 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + } + ] + }, + "mooshroom": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 4, "Z": -8 }, + "boxes": [ + { "pos": { "X": -4, "Y": -4, "Z": -6 }, "size": { "X": 8, "Y": 8, "Z": 6 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -5, "Y": -5, "Z": -4 }, "size": { "X": 1, "Y": 3, "Z": 1 }, "uv": { "X": 22, "Y": 0 } }, + { "pos": { "X": 4, "Y": -5, "Z": -4 }, "size": { "X": 1, "Y": 3, "Z": 1 }, "uv": { "X": 22, "Y": 0 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 5, "Z": 2 }, + "rotation": { "X": 90, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -6, "Y": -10, "Z": -7 }, "size": { "X": 12, "Y": 18, "Z": 10 }, "uv": { "X": 18, "Y": 4 } }, + { "pos": { "X": -2, "Y": 2, "Z": -8 }, "size": { "X": 4, "Y": 6, "Z": 1 }, "uv": { "X": 52, "Y": 0 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -4, "Y": 12, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 4, "Y": 12, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg2", + "translation": { "X": -4, "Y": 12, "Z": -6 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg3", + "translation": { "X": 4, "Y": 12, "Z": -6 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 12, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + } + ] + }, + "dragon_head": { + "textureSize": { "X": 256, "Y": 256 }, + "parts": [ + { + "name": "head", + "boxes": [ + // upperlip + { "pos": { "X": -6, "Y": -1, "Z": -24 }, "size": { "X": 12, "Y": 5, "Z": 16 }, "uv": { "X": 176, "Y": 44 } }, + // upperhead + { "pos": { "X": -8, "Y": -8, "Z": -10 }, "size": { "X": 16, "Y": 16, "Z": 16 }, "uv": { "X": 112, "Y": 30 } }, + // scale + { "pos": { "X": 3, "Y": -12, "Z": -4 }, "size": { "X": 2, "Y": 4, "Z": 6 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -5, "Y": -12, "Z": -4 }, "size": { "X": 2, "Y": 4, "Z": 6 }, "uv": { "X": 0, "Y": 0 }, "mirror": true }, + // nostril + { "pos": { "X": 3, "Y": -3, "Z": -22 }, "size": { "X": 2, "Y": 2, "Z": 4 }, "uv": { "X": 112, "Y": 0 } }, + { "pos": { "X": -5, "Y": -3, "Z": -22 }, "size": { "X": 2, "Y": 2, "Z": 4 }, "uv": { "X": 112, "Y": 0 }, "mirror": true }, + ] + }, + { + "name": "jaw", + "translation": { "X": 0, "Y": 4, "Z": -8 }, + "boxes": [ + { "pos": { "X": -6, "Y": 0, "Z": -16 }, "size": { "X": 12, "Y": 4, "Z": 16 }, "uv": { "X": 176, "Y": 65 } } + ] + } + ] + }, + "pig": { + "textureSize": { "X": 64, "Y": 32 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 12, "Z": -6 }, + "boxes": [ + { "pos": { "X": -4, "Y": -4, "Z": -8 }, "size": { "X": 8, "Y": 8, "Z": 8 }, "uv": { "X": 0, "Y": 0 } }, + { "pos": { "X": -2, "Y": 0, "Z": -9 }, "size": { "X": 4, "Y": 3, "Z": 1 }, "uv": { "X": 16, "Y": 16 } } + ] + }, + { + "name": "body", + "translation": { "X": 0, "Y": 11, "Z": 2 }, + "rotation": { "X": 90, "Y": 0, "Z": 0 }, + "boxes": [ + { "pos": { "X": -5, "Y": -10, "Z": -7 }, "size": { "X": 10, "Y": 16, "Z": 8 }, "uv": { "X": 28, "Y": 8 } } + ] + }, + { + "name": "leg0", + "translation": { "X": -3, "Y": 18, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg1", + "translation": { "X": 3, "Y": 18, "Z": 7 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg2", + "translation": { "X": -3, "Y": 18, "Z": -5 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + }, + { + "name": "leg3", + "translation": { "X": 3, "Y": 18, "Z": -5 }, + "boxes": [ + { "pos": { "X": -2, "Y": 0, "Z": -2 }, "size": { "X": 4, "Y": 6, "Z": 4 }, "uv": { "X": 0, "Y": 16 } } + ] + } + ] + }, + "snowgolem": { + "textureSize": { "X": 64, "Y": 64 }, + "parts": [ + { + "name": "head", + "translation": { "X": 0, "Y": 4, "Z": 0 }, + "boxes": [ + { "pos": { "X": -4, "Y": -8, "Z": -4 }, "size": { "X": 8, "Y": 8, "Z": 8 }, "uv": { "X": 0, "Y": 0 }, "inflate": -0.5 } + ] + }, + { + "name": "arm1", + "translation": { "X": 0, "Y": 6, "Z": 0 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -1 }, "size": { "X": 12, "Y": 2, "Z": 2 }, "uv": { "X": 32, "Y": 0 }, "inflate": -0.5 } + ] + }, + { + "name": "arm2", + "translation": { "X": 0, "Y": 6, "Z": 0 }, + "boxes": [ + { "pos": { "X": -1, "Y": 0, "Z": -1 }, "size": { "X": 12, "Y": 2, "Z": 2 }, "uv": { "X": 32, "Y": 0 }, "inflate": -0.5 } + ] + }, + { + "name": "piece1", + "translation": { "X": 0, "Y": 13, "Z": 0 }, + "boxes": [ + { "pos": { "X": -5, "Y": -10, "Z": -5 }, "size": { "X": 10, "Y": 10, "Z": 10 }, "uv": { "X": 0, "Y": 16 }, "inflate": -0.5 } + ] + }, + { + "name": "piece2", + "translation": { "X": 0, "Y": 24, "Z": 0 }, + "boxes": [ + { "pos": { "X": -6, "Y": -12, "Z": -6 }, "size": { "X": 12, "Y": 12, "Z": 12 }, "uv": { "X": 0, "Y": 36 }, "inflate": -0.5 } + ] + } + ] + } +} \ No newline at end of file diff --git a/PckStuido.ModelSupport/Resources/modelMetaData.json b/PckStuido.ModelSupport/Resources/modelMetaData.json new file mode 100644 index 00000000..9be05f36 --- /dev/null +++ b/PckStuido.ModelSupport/Resources/modelMetaData.json @@ -0,0 +1,739 @@ +{ + "bat": { + "textureLocations": [ + "res/mob/bat" + ], + "materialName": "bat", + "parts": [ + { + "name": "head", + "children": [ + { "name": "rightEar" }, + { "name": "leftEar" } + ] + }, + { + "name": "body", + "children": [ + { + "name": "rightWing", + "children": [ + { "name": "rightWingTip" } + ] + }, + { + "name": "leftWing", + "children": [ + { "name": "leftWingTip" } + ] + } + ] + } + ] + }, + "bed": { + "textureLocations": [ + "res/item/bed" + ], + "uv_offsets": [ {"X": 0, "Y": 64} ] + }, + "blaze": { + "textureLocations": [ + "res/mob/fire" + ], + "materialName": "blaze_head" + }, + "boat": { + "textureLocations": [ + "res/item/boat/boat_acacia", + "res/item/boat/boat_birch", + "res/item/boat/boat_darkoak", + "res/item/boat/boat_jungle", + "res/item/boat/boat_oak", + "res/item/boat/boat_spruce" + ] + }, + "chicken": { + "textureLocations": [ + "res/mob/chicken" + ] + }, + "cow": { + "textureLocations": [ + "res/mob/cow" + ] + }, + "creeper": { + "textureLocations": [ + "res/mob/creeper" + ] + }, + "creeper_head": { + "textureLocations": [ + "res/mob/creeper" + ] + }, + "dolphin": { + "textureLocations": [ + "res/mob/dolphin" + ], + "parts": [ + { + "name": "body", + "children": [ + { + "name": "head", + "children": [ { "name": "nose" } ] + }, + { + "name": "tail", + "children": [ { "name": "tail_fin" } ] + }, + { "name": "right_fin" }, + { "name": "left_fin" }, + { "name": "back_fin" } + ] + } + ] + }, + "dragon": { + "textureLocations": [ + "res/mob/enderdragon/ender" + ], + "materialName": "ender_dragon", + "parts": [ + { "name": "body" }, + // only needs to be inside when neck 1-5 aren't present + { "name": "neck" }, + + // neck 1-5 & tail 1-12 are not required to be inside the model + { "name": "neck1" }, + { "name": "neck2" }, + { "name": "neck3" }, + { "name": "neck4" }, + { "name": "neck5" }, + + { "name": "tail1" }, + { "name": "tail2" }, + { "name": "tail3" }, + { "name": "tail4" }, + { "name": "tail5" }, + { "name": "tail6" }, + { "name": "tail7" }, + { "name": "tail8" }, + { "name": "tail9" }, + { "name": "tail10" }, + { "name": "tail11" }, + { "name": "tail12" }, + + { + "name": "head", + "children": [ { "name": "jaw" } ] + }, + { + "name": "wing", + "children": [ { "name": "wingtip" } ] + }, + { + "name": "wing1", + "children": [ { "name": "wingtip1" } ] + }, + { + "name": "rearleg", + "children": [ + { + "name": "rearlegtip", + "children": [ { "name": "rearfoot" } ] + } + ] + }, + { + "name": "rearleg1", + "children": [ + { + "name": "rearlegtip1", + "children": [ { "name": "rearfoot1" } ] + } + ] + }, + { + "name": "frontleg", + "children": [ + { + "name": "frontlegtip", + "children": [ { "name": "frontfoot" } ] + } + ] + }, + { + "name": "frontleg1", + "children": [ + { + "name": "frontlegtip1", + "children": [ { "name": "frontfoot1" } ] + } + ] + } + ] + }, + "dragon_head": { + "textureLocations": [ + "res/mob/enderdragon/ender" + ], + "parts": [ + { + "name": "head", + "children": [ { "name": "jaw" } ] + } + ] + }, + "enderman": { + "textureLocations": [ + "res/mob/enderman" + ], + "materialName": "enderman" // "enderman_invisible" also valid + }, + "ghast": { + "textureLocations": [ + "res/mob/ghast", + "res/mob/ghast_fire" + ], + "materialName": "ghast" + }, + "guardian": { + "textureLocations": [ + "res/mob/guardian", + "res/mob/guardian_elder" + ], + "materialName": "guardian", + "parts": [ + { + "name": "head", + "children": [ + { "name": "eye" }, + { + "name": "tailpart0", + "children": [ + { + "name": "tailpart1", + "children": [ { "name": "tailpart2" } ] + } + ] + } + ] + } + ] + }, + "irongolem": { + "textureLocations": [ + "res/mob/villager_golem" + ], + "materialName": "iron_golem" + }, + "lavaslime": { + "textureLocations": [ + "res/mob/lava" + ], + "materialName": "magma_cube" + }, + "llama": { + "textureLocations": [ + "res/mob/llama/llama", + "res/mob/llama/llama_brown", + "res/mob/llama/llama_creamy", + "res/mob/llama/llama_gray", + "res/mob/llama/llama_white" + ] + }, + "llamaspit": { + "textureLocations": [ + "res/mob/llama/spit" + ] + }, + "minecart": { + "textureLocations": [ + "res/item/cart" + ] + }, + // the ocelot model is weird.. -miku + "ocelot": { + "textureLocations": [ + "res/mob/ozelot" + ] + }, + "parrot": { + "textureLocations": [ + "res/mob/parrot/parrot_blue", + "res/mob/parrot/parrot_green", + "res/mob/parrot/parrot_grey", + "res/mob/parrot/parrot_red_blue", + "res/mob/parrot/parrot_yellow_blue" + ], + "parts": [ + { + "name": "head", + "children": [ + { "name": "head2" }, + { "name": "beak1" }, + { "name": "beak2" }, + { "name": "feather" } + ] + }, + { "name": "body" }, + { "name": "tail" }, + { "name": "wing0" }, + { "name": "wing1" }, + { "name": "leg0" }, + { "name": "leg1" } + ] + }, + "phantom": { + "textureLocations": [ + "res/mob/phantom" + ], + "materialName": "phantom", // phantom_invisible is also valid + "parts": [ + { + "name": "body", + "children": [ + { "name": "head" }, + { + "name": "wing0", + "children": [ { "name": "wingtip0" } ] + }, + { + "name": "wing1", + "children": [ { "name": "wingtip1" } ] + }, + { + "name": "tail", + "children": [ { "name": "tailtip" } ] + } + ] + } + ] + }, + "pig": { + "textureLocations": [ + "res/mob/pig", + "res/mob/saddle" + ] + }, + "pigzombie": { + "textureLocations": [ + "res/mob/pigzombie" + ], + "materialName": "zombie_pigman" + }, + "polarbear": { + "textureLocations": [ + "res/mob/bear/polarbear" + ] + }, + "rabbit": { + "textureLocations": [ + "res/mob/rabbit/black", + "res/mob/rabbit/brown", + "res/mob/rabbit/caerbannog", + "res/mob/rabbit/gold", + "res/mob/rabbit/salt", + "res/mob/rabbit/toast", + "res/mob/rabbit/white", + "res/mob/rabbit/white_splotched" + ] + }, + "sheep": { + "textureLocations": [ + "res/mob/sheep", + "res/mob/sheep_fur" + ], + "materialName": "sheep" + }, + "sheep.sheared": { + "textureLocations": [ + "res/mob/sheep" + ], + "materialName": "sheep" + }, + "shulker": { + "textureLocations": [ + "res/mob/shulker/endergolem", + "res/mob/shulker/spark" + ], + "materialName": "shulker" + }, + "silverfish": { + "textureLocations": [ + "res/mob/silverfish" + ] + }, + "skeleton": { + "textureLocations": [ + "res/mob/skeleton" + ], + "materialName": "skeleton" + }, + "skeleton.stray": { + "textureLocations": [ + "res/mob/skeleton/stray" + ], + "materialName": "stray" + }, + "skeleton.wither": { + "textureLocations": [ + "res/mob/skeleton_wither" + ], + "materialName": "wither_skeleton" + }, + "slime": { + "textureLocations": [ + "res/mob/slime" + ] + }, + "slime.armor": { + "textureLocations": [ + "res/mob/slime" + ] + }, + "snowgolem": { + "textureLocations": [ + "res/mob/snowman" + ] + }, + "spider": { + "textureLocations": [ + "res/mob/spider", + "res/mob/cavespider" + ], + "materialName": "spider" // "spider_invisible" also valid + }, + "squid": { + "textureLocations": [ + "res/mob/squid" + ] + }, + "trident": { + "textureLocations": [ + "res/item/trident" + ] + }, + "turtle": { + "textureLocations": [ + "res/mob/sea_turtle" + ] + }, + "villager": { + "textureLocations": [ + "res/mob/villager/villager", + "res/mob/villager/butcher", + "res/mob/villager/farmer", + "res/mob/villager/librarian", + "res/mob/villager/priest", + "res/mob/villager/smith" + ] + }, + "villager.witch": { + "textureLocations": [ + "res/mob/witch" + ] + }, + "vex": { + "textureLocations": [ + "res/mob/illager/vex", + "res/mob/illager/vex_charging" + ] + }, + "evoker": { + "textureLocations": [ + "res/mob/illager/evoker" + ] + }, + "vindicator": { + "textureLocations": [ + "res/mob/illager/vindicator" + ] + }, + "witherBoss": { + "textureLocations": [ + "res/mob/wither/wither", + "res/mob/wither/wither_invulnerable" + ], + "materialName": "wither_boss" + }, + "wolf": { + "textureLocations": [ + "res/mob/wolf", + "res/mob/wolf_angry", + "res/mob/wolf_tame" + ], + "materialName": "wolf" + }, + "zombie": { + "textureLocations": [ + "res/mob/zombie" + ] + }, + "zombie.husk": { + "textureLocations": [ + "res/mob/zombie/husk" + ] + }, + "zombie.villager": { + "textureLocations": [ + "res/mob/zombie_villager/zombie_villager", + "res/mob/zombie_villager/zombie_butcher", + "res/mob/zombie_villager/zombie_farmer", + "res/mob/zombie_villager/zombie_librarian", + "res/mob/zombie_villager/zombie_priest", + "res/mob/zombie_villager/zombie_smith" + ] + }, + "horse.v2": { + // markings and armor not included + "textureLocations": [ + "res/mob/horse/donkey", + "res/mob/horse/horse_black", + "res/mob/horse/horse_brown", + "res/mob/horse/horse_chestnut", + "res/mob/horse/horse_creamy", + "res/mob/horse/horse_darkbrown", + "res/mob/horse/horse_gray", + "res/mob/horse/horse_skeleton", + "res/mob/horse/horse_white", + "res/mob/horse/horse_zombie", + "res/mob/horse/mule" + ], + "parts": [ + { + "name": "Neck", + "children": [ + { + "name": "Head", + "children": [ + { "name": "HeadSaddle" }, + { "name": "UMouth" }, + { "name": "Ear1" }, + { "name": "Ear2" }, + { "name": "MuleEarL" }, + { "name": "MuleEarR" }, + { "name": "SaddleMouthL" }, + { "name": "SaddleMouthR" } + ] + } + ] + }, + { + "name": "Body", + "children": [ + { "name": "TailA" }, + { "name": "Saddle" } + ] + }, + { "name": "Mane" }, + { "name": "Leg1A" }, + { "name": "Leg2A" }, + { "name": "Leg3A" }, + { "name": "Leg4A" }, + { "name": "Bag1" }, + { "name": "Bag2" }, + { "name": "SaddleMouthLine" }, + { "name": "SaddleMouthLineR" } + ] + }, + "cat": { + "textureLocations": [ + "res/mob/cat_black", + "res/mob/cat_red", + "res/mob/cat_siamese" + ] + }, + "zombie.drowned": { + "textureLocations": [ + "res/mob/zombie/drowned" + ], + "materialName": "drowned" + }, + "endermite": { + "textureLocations": [ + "res/mob/endermite" + ] + }, + "cod": { + "textureLocations": [ + "res/mob/fish/cod" + ] + }, + "pufferfish.small": { + "textureLocations": [ + "res/mob/fish/pufferfish" + ] + }, + "pufferfish.mid": { + "textureLocations": [ + "res/mob/fish/pufferfish" + ] + }, + "pufferfish.large": { + "textureLocations": [ + "res/mob/fish/pufferfish" + ] + }, + "salmon": { + "textureLocations": [ + "res/mob/fish/salmon" + ] + }, + "skeleton_head": { + "textureLocations": [ + "res/mob/skeleton" + ] + }, + "skeleton_wither_head": { + "textureLocations": [ + "res/mob/skeleton_wither" + ] + }, + "stray.armor": { + "textureLocations": [ + "res/mob/skeleton/stray_overlay" + ] + }, + "stray_armor": { + "textureLocations": [ + "res/mob/skeleton/stray_overlay" + ] + }, + "tropicalfish_a": { + "textureLocations": [ + "res/mob/fish/tropical_a", + "res/mob/fish/tropical_a_pattern_1", + "res/mob/fish/tropical_a_pattern_2", + "res/mob/fish/tropical_a_pattern_3", + "res/mob/fish/tropical_a_pattern_4", + "res/mob/fish/tropical_a_pattern_5", + "res/mob/fish/tropical_a_pattern_6" + ] + }, + "tropicalfish_b": { + "textureLocations": [ + "res/mob/fish/tropical_b", + "res/mob/fish/tropical_b_pattern_1", + "res/mob/fish/tropical_b_pattern_2", + "res/mob/fish/tropical_b_pattern_3", + "res/mob/fish/tropical_b_pattern_4", + "res/mob/fish/tropical_b_pattern_5", + "res/mob/fish/tropical_b_pattern_6" + ] + }, + "zombie_head": { + "textureLocations": [ + "res/mob/zombie" + ] + }, + "mooshroom": { + "textureLocations": [ + "res/mob/redcow" + ] + }, + "witherBoss.armor": { + "textureLocations": [ + "res/mob/wither/wither_armor" + ] + }, + + "villager_v2": { + "textureLocations": [ + "res/mob/villager/villagerBase1", + "res/mob/villager/villagerBase2", + "res/mob/villager/villagerBase3", + "res/mob/villager/villagerBase4", + "res/mob/villager/villagerBase5", + "res/mob/villager/villagerBase6", + + "res/mob/wandering_trader", + + "res/mob/villager/professions/armorer", + "res/mob/villager/professions/butcher", + "res/mob/villager/professions/cartographer", + "res/mob/villager/professions/cleric", + "res/mob/villager/professions/farmer", + "res/mob/villager/professions/fisherman", + "res/mob/villager/professions/fletcher", + "res/mob/villager/professions/leatherworker", + "res/mob/villager/professions/librarian", + "res/mob/villager/professions/nitwit", + "res/mob/villager/professions/shepherd", + "res/mob/villager/professions/stonemason", + "res/mob/villager/professions/toolsmith", + "res/mob/villager/professions/unskilled", + "res/mob/villager/professions/weaponsmith", + + "res/mob/villager/biomes/biome_desert", + "res/mob/villager/biomes/biome_jungle", + "res/mob/villager/biomes/biome_plains", + "res/mob/villager/biomes/biome_savanna", + "res/mob/villager/biomes/biome_snow", + "res/mob/villager/biomes/biome_swamp", + "res/mob/villager/biomes/biome_taiga", + + "res/mob/villager/levels/level_diamond", + "res/mob/villager/levels/level_gold", + "res/mob/villager/levels/level_iron" + ] + }, + "zombie.villager_v2": { + "textureLocations": [ + "res/mob/zombie_villager/zombie_villager", + "res/mob/zombie_villager/zombie_butcher", + "res/mob/zombie_villager/zombie_farmer", + "res/mob/zombie_villager/zombie_librarian", + "res/mob/zombie_villager/zombie_priest", + "res/mob/zombie_villager/zombie_smith", + + "res/mob/zombie_villager/biomes/biome-desert-zombie", + "res/mob/zombie_villager/biomes/biome-jungle-zombie", + "res/mob/zombie_villager/biomes/biome-plains-zombie", + "res/mob/zombie_villager/biomes/biome-savanna-zombie", + "res/mob/zombie_villager/biomes/biome-snow-zombie", + "res/mob/zombie_villager/biomes/biome-swamp-zombie", + "res/mob/zombie_villager/biomes/biome-taiga-zombie", + + "res/mob/zombie_villager/professions/armorer", + "res/mob/zombie_villager/professions/butcher", + "res/mob/zombie_villager/professions/cartographer", + "res/mob/zombie_villager/professions/cleric", + "res/mob/zombie_villager/professions/farmer", + "res/mob/zombie_villager/professions/fisherman", + "res/mob/zombie_villager/professions/fletcher", + "res/mob/zombie_villager/professions/leatherworker", + "res/mob/zombie_villager/professions/librarian", + "res/mob/zombie_villager/professions/nitwit", + "res/mob/zombie_villager/professions/shepherd", + "res/mob/zombie_villager/professions/stonemason", + "res/mob/zombie_villager/professions/toolsmith", + "res/mob/zombie_villager/professions/weaponsmith" + ] + }, + "pillager": { + "textureLocations": [ + "res/mob/pillager" + ] + }, + "ravager": { + "textureLocations": [ + "res/mob/illager/ravager" + ] + }, + + "panda": { + "textureLocations": [ + "res/mob/panda/panda", + "res/mob/panda/panda_aggressive", + "res/mob/panda/panda_brown", + "res/mob/panda/panda_lazy", + "res/mob/panda/panda_playful", + "res/mob/panda/panda_sneezy", + "res/mob/panda/panda_worried" + ] + } +} diff --git a/PckStuido.ModelSupport/SkinModelImporter.cs b/PckStuido.ModelSupport/SkinModelImporter.cs new file mode 100644 index 00000000..2cc7c2a8 --- /dev/null +++ b/PckStuido.ModelSupport/SkinModelImporter.cs @@ -0,0 +1,557 @@ +/* Copyright (c) 2024-present miku-666 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1.The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. +**/ +using System; +using System.IO; +using System.Linq; +using System.Drawing; +using System.Numerics; +using System.Diagnostics; +using System.Windows.Forms; +using System.Drawing.Imaging; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using PckStudio.Core; +using PckStudio.Core.Skin; +using PckStudio.Core.Extensions; +using PckStudio.Core.FileFormats; +using PckStudio.ModelSupport.Format.External; +using PckStudio.Core.Additional_Popups; +using PckStudio.ModelSupport.Internal.Format; + +namespace PckStudio.ModelSupport +{ + public sealed class SkinModelImporter : ModelImporter + { + public static SkinModelImporter Default { get; } = new SkinModelImporter(); + + private SkinModelImporter() + { + InternalAddProvider(new("Pck skin model(*.psm)", "*.psm"), ImportPsm, ExportPsm); + InternalAddProvider(new("Block bench model(*.bbmodel)", "*.bbmodel"), ImportBlockBenchModel, ExportBlockBenchModel); + InternalAddProvider(new("Bedrock (Legacy) Model(*.geo.json;*.json)", "*.geo.json;*.json"), ImportBedrockJson, ExportBedrockJson); + } + + internal static SkinModelInfo ImportPsm(string filepath) + { + var reader = new PSMFileReader(); + PSMFile csmbFile = reader.FromFile(filepath); + return new SkinModelInfo(null, csmbFile.SkinANIM, new(csmbFile.Parts, csmbFile.Offsets)); + } + + internal static void ExportPsm(string filepath, SkinModelInfo modelInfo) + { + PSMFile psmFile = new PSMFile(PSMFile.CurrentVersion, modelInfo.Anim); + psmFile.Parts.AddRange(modelInfo.Model.AdditionalBoxes); + psmFile.Offsets.AddRange(modelInfo.Model.PartOffsets); + var writer = new PSMFileWriter(psmFile); + writer.WriteToFile(filepath); + } + + internal static SkinModelInfo ImportBlockBenchModel(string filepath) + { + BlockBenchModel blockBenchModel = JsonConvert.DeserializeObject(File.ReadAllText(filepath)); + if (!blockBenchModel.Format.UseBoxUv) + { + Trace.TraceError($"[{nameof(SkinModelImporter)}:{nameof(ImportBlockBenchModel)}] Failed to import skin '{blockBenchModel.Name}': Skin does not use box uv."); + return null; + } + + IEnumerable partOffsets = blockBenchModel.Outliner + .Where(token => token.Type == JTokenType.Object && SkinBOX.IsValidType(TryConvertToSkinBoxType(token.ToObject().Name))) + .Select(token => token.ToObject()) + .Select(outline => new SkinPartOffset(TryConvertToSkinBoxType(outline.Name), -GetOffsetFromOrigin(TryConvertToSkinBoxType(outline.Name), outline.Origin).Y)) + .Where(offset => offset.Value != 0f); + + IEnumerable boxes = ReadOutliner(null, blockBenchModel.Outliner, blockBenchModel.Elements); + + Image texture = null; + if (blockBenchModel.Textures.IndexInRange(0)) + { + texture = blockBenchModel.Textures[0]; + texture = SwapBoxBottomTexture(texture, boxes); + } + + return CreateSkinModelInfo(texture, boxes, partOffsets); + } + + private static SkinModelInfo CreateSkinModelInfo(Image texture, IEnumerable boxes, IEnumerable partOffsets) + { + SkinANIM skinANIM = ( + SkinAnimMask.HEAD_DISABLED | + SkinAnimMask.HEAD_OVERLAY_DISABLED | + SkinAnimMask.BODY_DISABLED | + SkinAnimMask.BODY_OVERLAY_DISABLED | + SkinAnimMask.RIGHT_ARM_DISABLED | + SkinAnimMask.RIGHT_ARM_OVERLAY_DISABLED | + SkinAnimMask.LEFT_ARM_DISABLED | + SkinAnimMask.LEFT_ARM_OVERLAY_DISABLED | + SkinAnimMask.RIGHT_LEG_DISABLED | + SkinAnimMask.RIGHT_LEG_OVERLAY_DISABLED | + SkinAnimMask.LEFT_LEG_DISABLED | + SkinAnimMask.LEFT_LEG_OVERLAY_DISABLED); + + skinANIM = skinANIM.SetFlag(SkinAnimFlag.RESOLUTION_64x64, texture.Size.Width == texture.Size.Height); + + SkinModel skinModel = new SkinModel(); + + skinModel.PartOffsets.AddRange(partOffsets); + + SkinBOX ApplyOffset(SkinBOX box) + { + SkinPartOffset offset = skinModel.PartOffsets.FirstOrDefault(offset => offset.Type == (box.IsOverlayPart() ? box.GetBaseType() : box.Type)); + return string.IsNullOrEmpty(offset.Type) ? box : new SkinBOX(box.Type, box.Pos - (Vector3.UnitY * offset.Value), box.Size, box.UV, box.HideWithArmor, box.Mirror, box.Scale); + } + + IEnumerable convertedBoxes = boxes.Select(ApplyOffset); + + IEnumerable customBoxes = convertedBoxes.Where(box => !SkinBOX.KnownHashes.ContainsKey(box.GetHashCode())); + + skinModel.AdditionalBoxes.AddRange(customBoxes); + + // check for know boxes and filter them out + SkinAnimMask mask = (SkinAnimMask)convertedBoxes + .Where(box => SkinBOX.KnownHashes.ContainsKey(box.GetHashCode()) && Enum.IsDefined(typeof(SkinAnimMask), (1 >> (int)SkinBOX.KnownHashes[box.GetHashCode()]))) + .Select(box => SkinBOX.KnownHashes[box.GetHashCode()]) + .Select(i => 1 << (int)i) + .DefaultIfEmpty() + .Aggregate((a, b) => a | b); + + if (mask != SkinAnimMask.NONE) + skinANIM &= ~mask; + + return new SkinModelInfo(texture, skinANIM, skinModel); + } + + private static IEnumerable ReadOutliner(string parentName, JArray oulineChildren, IReadOnlyCollection elements) + { + IEnumerable boxes = oulineChildren + .Where(token => token.Type == JTokenType.String && Guid.TryParse(token.ToString(), out Guid elementUuid) && elements.Any(e => e.Uuid == elementUuid)) + .Select(token => elements.First(e => Guid.Parse(token.ToString()) == e.Uuid)) + .Where(element => element.Type == "cube" && element.UseBoxUv && element.Export && SkinBOX.IsValidType(TryConvertToSkinBoxType(parentName ?? element.Name))) + .Select(element => LoadElement(element, TryConvertToSkinBoxType(parentName ?? element.Name))); + + IEnumerable childOutlines = oulineChildren + .Where(token => token.Type == JTokenType.Object) + .Select(token => token.ToObject()); + + foreach (Outline childOutline in childOutlines) + { + boxes = boxes.Concat(ReadOutliner(parentName ?? childOutline.Name, childOutline.Children, elements)); + } + return boxes; + } + + private static SkinBOX LoadElement(Element element, string outlineName) + { + var boundingBox = new BoundingBox(element.From, element.To); + Vector3 pos = boundingBox.Start.ToNumericsVector(); + Vector3 size = boundingBox.Volume.ToNumericsVector(); + Vector2 uv = element.UvOffset; + + pos = TranslateToInternalPosition(outlineName, pos, size, new Vector3(1, 1, 0)); + + var box = new SkinBOX(outlineName, pos, size, uv, mirror: element.MirrorUv); + if (SkinBOX.IsBasePart(outlineName) && ((outlineName == "HEAD" && element.Inflate == 0.5f) || (element.Inflate >= 0.25f && element.Inflate <= 0.5f))) + box = new SkinBOX(SkinBOXExtensions.GetOverlayType(outlineName), pos, size, uv, mirror: element.MirrorUv); + return box; + } + + internal static void ExportBlockBenchModel(string filepath, SkinModelInfo modelInfo) + { + Image exportTexture = SwapBoxBottomTexture(modelInfo); + BlockBenchModel blockBenchModel = BlockBenchModel.Create(BlockBenchFormatInfos.BedrockEntity, Path.GetFileNameWithoutExtension(filepath), new Size(64, exportTexture.Width == exportTexture.Height ? 64 : 32), [exportTexture]); + + Dictionary outliners = new Dictionary(5); + List elements = new List(modelInfo.Model.AdditionalBoxes.Count); + + Dictionary offsetLookUp = new Dictionary(5); + + void AddElement(SkinBOX box) + { + string offsetType = box.IsOverlayPart() ? box.GetBaseType() : box.Type; + + Vector3 offset = GetOffsetForPart(offsetType, ref offsetLookUp, modelInfo.Model.PartOffsets); + if (!outliners.ContainsKey(offsetType)) + { + outliners.Add(offsetType, new Outline(offsetType) + { + Origin = GetSkinPartPivot(offsetType, new Vector3(1, 1, 0)) + offset + }); + } + + Element element = CreateElement(box); + + element.From += offset; + element.To += offset; + + elements.Add(element); + outliners[offsetType].Children.Add(element.Uuid); + } + + ANIM2BOX(modelInfo.Anim, AddElement); + + foreach (SkinBOX box in modelInfo.Model.AdditionalBoxes) + { + AddElement(box); + } + blockBenchModel.Elements = elements.ToArray(); + blockBenchModel.Outliner = JArray.FromObject(outliners.Values); + + string content = JsonConvert.SerializeObject(blockBenchModel); + File.WriteAllText(filepath, content); + } + + private static Element CreateElement(SkinBOX box) + { + Vector3 transformPos = TranslateFromInternalPosistion(box, new Vector3(1, 1, 0)); + Element element = CreateElement(box.UV, transformPos, box.Size, box.Scale, box.Mirror); + if (box.IsOverlayPart()) + element.Inflate = box.Type == "HEADWEAR" ? 0.5f : 0.25f; + return element; + } + + private static Element CreateElement(Vector2 uvOffset, Vector3 pos, Vector3 size, float inflate, bool mirror) + { + return Element.CreateCube("cube", uvOffset, pos, size, inflate, mirror); + } + + private static Geometry GetGeometry(string filepath) + { + // Bedrock Entity (Model) + if (filepath.EndsWith(".geo.json")) + { + BedrockModel bedrockModel = JsonConvert.DeserializeObject(File.ReadAllText(filepath)); + var availableModels = bedrockModel.Models.Select(m => m.Description.Identifier).ToArray(); + if (availableModels.Length < 2) + return availableModels.Length == 1 ? bedrockModel.Models[0] : null; + + using ItemSelectionPopUp itemSelectionPopUp = new ItemSelectionPopUp(availableModels); + if (itemSelectionPopUp.ShowDialog() == DialogResult.OK && bedrockModel.Models.IndexInRange(itemSelectionPopUp.SelectedIndex)) + { + return bedrockModel.Models[itemSelectionPopUp.SelectedIndex]; + } + } + + // Bedrock Legacy Model + else if (filepath.EndsWith(".json")) + { + BedrockLegacyModel bedrockModel = JsonConvert.DeserializeObject(File.ReadAllText(filepath)); + var availableModels = bedrockModel.Select(m => m.Key).ToArray(); + if (availableModels.Length < 2) + return availableModels.Length == 1 ? bedrockModel[availableModels[0]] : null; + using ItemSelectionPopUp itemSelectionPopUp = new ItemSelectionPopUp(availableModels); + if (itemSelectionPopUp.ShowDialog() == DialogResult.OK && bedrockModel.ContainsKey(itemSelectionPopUp.SelectedItem)) + { + return bedrockModel[itemSelectionPopUp.SelectedItem]; + } + } + + return null; + } + + private static SkinModelInfo ImportBedrockJson(string filepath) + { + Geometry geometry = GetGeometry(filepath); + if (geometry is null) + return null; + + (IEnumerable boxes, IEnumerable partOffsets) = LoadGeometry(geometry); + + Image texture = null; + string texturePath = Path.Combine(Path.GetDirectoryName(filepath), Path.GetFileNameWithoutExtension(filepath)) + ".png"; + if (File.Exists(texturePath)) + { + texture = Image.FromFile(texturePath).ReleaseFromFile(); + texture = SwapBoxBottomTexture(texture, boxes); + } + + return CreateSkinModelInfo(texture, boxes, partOffsets); + } + + private static (IEnumerable boxes, IEnumerable partOffsets) LoadGeometry(Geometry geometry) + { + List skinPartOffsets = new List(); + List boxes = new List(); + + foreach (Bone bone in geometry.Bones) + { + string boxType = TryConvertToSkinBoxType(bone.Name); + if (!SkinBOX.IsValidType(boxType)) + continue; + + string offsetType = SkinBOX.IsOverlayPart(boxType) ? SkinBOXExtensions.GetBaseType(boxType) : boxType; + Vector3 offset = GetOffsetFromOrigin(offsetType, bone.Pivot * new Vector3(-1, 1, 1)); + if (offset.Y != 0f) + skinPartOffsets.Add(new SkinPartOffset(offsetType, -offset.Y)); + + foreach (Cube cube in bone.Cubes) + { + Vector3 pos = TranslateToInternalPosition(boxType, cube.Origin, cube.Size, Vector3.UnitY); + var skinBox = new SkinBOX(boxType, pos, cube.Size, cube.Uv, hideWithArmor: bone.Name == "helmet", mirror: cube.Mirror); + if (SkinBOX.IsBasePart(boxType) && ((boxType == "HEAD" && cube.Inflate == 0.5f) || (cube.Inflate >= 0.25f && cube.Inflate <= 0.5f))) + skinBox = new SkinBOX(SkinBOXExtensions.GetOverlayType(boxType), pos, cube.Size, cube.Uv, hideWithArmor: bone.Name == "helmet", mirror: cube.Mirror); + boxes.Add(skinBox); + } + } + return (boxes, skinPartOffsets); + } + + internal static void ExportBedrockJson(string filepath, SkinModelInfo modelInfo) + { + if (string.IsNullOrEmpty(filepath) || !filepath.EndsWith(".json")) + return; + + Dictionary bones = new Dictionary(5); + Dictionary offsetLookUp = new Dictionary(5); + + void AddBone(SkinBOX box) + { + string offsetType = box.IsOverlayPart() ? box.GetBaseType() : box.Type; + + Vector3 offset = GetOffsetForPart(offsetType, ref offsetLookUp, modelInfo.Model.PartOffsets); + + if (!bones.ContainsKey(offsetType)) + { + Bone bone = new Bone(offsetType) + { + Pivot = GetSkinPartPivot(offsetType, new Vector3(0, 1, 0)) + offset + }; + bones.Add(offsetType, bone); + } + Vector3 pivot = bones.ContainsKey(offsetType) ? bones[offsetType].Pivot : Vector3.Zero; + Vector3 pos = TranslateFromInternalPosistion(box, new Vector3(1, 1, 0)); + pos = TransformSpace(pos, box.Size, new Vector3(1, 0, 0)); + + bones[offsetType].Cubes.Add(new Cube() + { + Origin = pos + offset, + Size = box.Size, + Uv = box.UV, + Inflate = box.Scale + (box.IsOverlayPart() ? box.Type == "HEAD" ? 0.5f : 0.25f : 0f), + Mirror = box.Mirror, + }); + } + + ANIM2BOX(modelInfo.Anim, AddBone); + + foreach (SkinBOX box in modelInfo.Model.AdditionalBoxes) + { + AddBone(box); + } + + Geometry selectedGeometry = new Geometry(); + selectedGeometry.Bones.AddRange(bones.Values); + object bedrockModel = null; + // Bedrock Entity (Model) + if (filepath.EndsWith(".geo.json")) + { + selectedGeometry.Description = new GeometryDescription() + { + Identifier = $"geometry.{Application.ProductName}.{Path.GetFileNameWithoutExtension(filepath)}", + TextureSize = modelInfo.Texture.Size, + }; + bedrockModel = new BedrockModel + { + FormatVersion = "1.12.0", + Models = { selectedGeometry } + }; + } + // Bedrock Legacy Model + else if (filepath.EndsWith(".json") && modelInfo.Texture.Height == modelInfo.Texture.Width) + { + bedrockModel = new BedrockLegacyModel + { + { $"geometry.{Application.ProductName}.{Path.GetFileNameWithoutExtension(filepath)}", selectedGeometry } + }; + } + else + { + MessageBox.Show("Can't export to Bedrock Legacy Model.", "Invalid Texture Dimensions", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (bedrockModel is not null) + { + string content = JsonConvert.SerializeObject(bedrockModel); + File.WriteAllText(filepath, content); + string texturePath = Path.Combine(Path.GetDirectoryName(filepath), Path.GetFileNameWithoutExtension(filepath)) + ".png"; + SwapBoxBottomTexture(modelInfo).Save(texturePath, ImageFormat.Png); + } + } + + private static void ANIM2BOX(SkinANIM anim, Action converter) + { + bool isSlim = anim.GetFlag(SkinAnimFlag.SLIM_MODEL); + bool is32x64 = !(anim.GetFlag(SkinAnimFlag.RESOLUTION_64x64) || isSlim); + if (!anim.GetFlag(SkinAnimFlag.HEAD_DISABLED)) + converter(new SkinBOX("HEAD", new Vector3(-4, -8, -4), new Vector3(8), Vector2.Zero)); + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.HEAD_OVERLAY_DISABLED)) + converter(new SkinBOX("HEADWEAR", new Vector3(-4, -8, -4), new Vector3(8), new Vector2(32, 0))); + + if (!anim.GetFlag(SkinAnimFlag.BODY_DISABLED)) + converter(new SkinBOX("BODY", new(-4, 0, -2), new(8, 12, 4), new(16, 16))); + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.BODY_OVERLAY_DISABLED)) + converter(new SkinBOX("JACKET", new(-4, 0, -2), new(8, 12, 4), new(16, 32))); + + if (!anim.GetFlag(SkinAnimFlag.RIGHT_ARM_DISABLED)) + converter(new SkinBOX("ARM0", new(isSlim ? -2 : - 3, -2, -2), new(isSlim ? 3 : 4, 12, 4), new(40, 16))); + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.RIGHT_ARM_OVERLAY_DISABLED)) + converter(new SkinBOX("SLEEVE0", new(isSlim ? -2 : - 3, -2, -2), new(isSlim ? 3 : 4, 12, 4), new(40, 32))); + + if (!anim.GetFlag(SkinAnimFlag.LEFT_ARM_DISABLED)) + converter(new SkinBOX("ARM1", new(-1, -2, -2), new(isSlim ? 3 : 4, 12, 4), is32x64 ? new(40, 16) : new(32, 48), mirror: is32x64)); + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.LEFT_ARM_OVERLAY_DISABLED)) + converter(new SkinBOX("SLEEVE1", new(-1, -2, -2), new(isSlim ? 3 : 4, 12, 4), new(48, 48))); + + if (!anim.GetFlag(SkinAnimFlag.RIGHT_LEG_DISABLED)) + converter(new SkinBOX("LEG0", new(-2, 0, -2), new(4, 12, 4), new(0, 16))); + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.RIGHT_LEG_OVERLAY_DISABLED)) + converter(new SkinBOX("PANTS0", new(-2, 0, -2), new(4, 12, 4), new(0, 32))); + + if (!anim.GetFlag(SkinAnimFlag.LEFT_LEG_DISABLED)) + { + converter(new SkinBOX("LEG1", new(-2, 0, -2), new(4, 12, 4), is32x64 ? new(0, 16) : new(16, 48), mirror: is32x64)); + } + + if (!is32x64 && !anim.GetFlag(SkinAnimFlag.LEFT_LEG_OVERLAY_DISABLED)) + { + converter(new SkinBOX("PANTS1", new(-2, 0, -2), new(4, 12, 4), new(0, 48))); + } + } + + private static string TryConvertToSkinBoxType(string name) + { + if (!SkinBOX.IsValidType(name) && SkinBOX.IsValidType(name.ToUpper())) + { + return name.ToUpper(); + } + return name.ToLower() switch + { + "helmet" => "HEAD", + "rightarm" => "ARM0", + "leftarm" => "ARM1", + "rightleg" => "LEG0", + "leftleg" => "LEG1", + "hat" => "HEADWEAR", + "bodyarmor" => "BODY", + "rightsleeve" => "SLEEVE0", + "leftsleeve" => "SLEEVE1", + "rightpants" => "PANTS0", + "leftpants" => "PANTS1", + _ => name, + }; + } + + private static Vector3 GetOffsetFromOrigin(string boxType, Vector3 origin) + { + Vector3 partTranslation = GameConstants.GetSkinPartPivot(boxType); + Vector3 offset = partTranslation - ((Vector3.UnitY * 24f) - origin); + if (offset.X != 0f || offset.Z != 0f) + Trace.TraceWarning($"[{nameof(SkinModelImporter)}:{nameof(GetOffsetFromOrigin)}] Warning: skin part({boxType}) offsets only support horizontal offsets."); + return offset * Vector3.UnitY; + } + + private static Vector3 GetSkinPartPivot(string partName, Vector3 translationUnit) + { + return TransformSpace(GameConstants.GetSkinPartPivot(partName), Vector3.Zero, translationUnit) + (24f * Vector3.UnitY); + } + + private static Vector3 GetOffsetForPart(string offsetType, ref Dictionary offsetLookUp, IEnumerable partOffsets) + { + if (offsetLookUp.ContainsKey(offsetType)) + { + return -offsetLookUp[offsetType].Value * Vector3.UnitY; + } + if (partOffsets.Any(o => o.Type == offsetType)) + { + SkinPartOffset partOffset = partOffsets.First(o => o.Type == offsetType); + offsetLookUp.Add(offsetType, partOffset); + return -partOffset.Value * Vector3.UnitY; + } + return Vector3.Zero; + } + + private static Image SwapBoxBottomTexture(SkinModelInfo modelInfo) + { + return SwapBoxBottomTexture(modelInfo.Texture, modelInfo.Model.AdditionalBoxes); + } + + private static Image SwapBoxBottomTexture(Image texture, IEnumerable boxes) + { + return SwapTextureAreas(texture, boxes.Where(box => !(box.Size == Vector3.One || box.Size == Vector3.Zero)).Select(box => + { + var imgPos = Point.Truncate(new PointF(box.UV.X + box.Size.X + box.Size.Z, box.UV.Y)); + var area = new RectangleF(imgPos, Size.Truncate(new SizeF(box.Size.X, box.Size.Z))); + return Rectangle.Truncate(area); + }), RotateFlipType.RotateNoneFlipY); + } + + private static Image SwapTextureAreas(Image texture, IEnumerable areasToFix, RotateFlipType type) + { + if (texture == null) + { + Trace.TraceError($"[{nameof(SkinModelImporter)}:{nameof(SwapBoxBottomTexture)}] Failed to fix texture: texture is null."); + return null; + } + areasToFix = areasToFix.Where(rect => rect.Size.Width > 0 && rect.Size.Height > 0); + Image result = new Bitmap(texture); + using var g = Graphics.FromImage(result); + g.ApplyConfig(new GraphicsConfig() + { + InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor, + PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality + }); + foreach (Rectangle area in areasToFix) + { + Image targetAreaImage = texture.GetArea(area); + targetAreaImage.RotateFlip(type); + Region clip = g.Clip; + g.SetClip(area); + g.Clear(Color.Transparent); + g.DrawImage(targetAreaImage, area.Location); + g.Clip = clip; + } + return result; + } + + private static Vector3 TranslateToInternalPosition(string boxType, Vector3 origin, Vector3 size, Vector3 translationUnit) + { + Vector3 pos = TransformSpace(origin, size, translationUnit); + // Skin Renderer (and Game) specific offset value. + pos.Y += 24f; + + // This will cancel out the part specific translation. + Vector3 translation = GameConstants.GetSkinPartTranslation(boxType); + pos -= translation; + + return pos; + } + + private static Vector3 TranslateFromInternalPosistion(SkinBOX skinBox, Vector3 translationUnit) + { + return TranslateToInternalPosition(skinBox.Type, skinBox.Pos, skinBox.Size, translationUnit); + } + } +} diff --git a/PckStuido.ModelSupport/SkinModelInfo.cs b/PckStuido.ModelSupport/SkinModelInfo.cs new file mode 100644 index 00000000..a7a1b2f9 --- /dev/null +++ b/PckStuido.ModelSupport/SkinModelInfo.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PckStudio.Core.Skin; + +namespace PckStudio.ModelSupport +{ + public sealed class SkinModelInfo + { + public SkinModel Model { get; } + public SkinANIM Anim { get; } + public Image Texture { get; } + + public SkinModelInfo(Image texture, SkinANIM anim, SkinModel model) + { + Texture = texture; + Anim = anim; + Model = model; + } + } +} diff --git a/Vendor/OMI-Lib b/Vendor/OMI-Lib index e90b0ed8..87fcc157 160000 --- a/Vendor/OMI-Lib +++ b/Vendor/OMI-Lib @@ -1 +1 @@ -Subproject commit e90b0ed8b50679456c82817e2682b0fdf0cceec9 +Subproject commit 87fcc15776c0829a06430f82eac9b343d7989b10 diff --git a/docs/PSM.md b/docs/PSM.md new file mode 100644 index 00000000..52ccdaf1 --- /dev/null +++ b/docs/PSM.md @@ -0,0 +1,32 @@ +# Pck Skin Model / PSM - v1 + +

A technical documentation about the custom format PCK-Studio uses to save custom skin data.

+ +| Name | Size
(in bytes) | Description | +|:-:|:-:|:-:| +| Version | 1 | Describes the version of the file format. | +| Anim | 4 | Animation flags for the custom skin. | +| Box Count | 4 | The amount of [box data](#box-data) that has to be read. | +| [Box Data](#box-data)[] | Box Count | | +| Offset Count | 4 | The amount of [offset data](#offset-data) that has to be read. | +| [Offset Data](#offset-data)[] | Offset Count | | + + +### Box data +| Name | Size
(in bytes) | Description | +|:-:|:--:|:-:| +| Type | 1 | Type of model part ([see PSMParentType](../PCK-Studio/Internal/FileFormats/PSMFile.cs#L83)). | +| Postion | 24 | Position in 3D space (3 Floats). | +| Size | 24 | Size in 3D space (3 Floats). | +| Mirror | 1 (bit) | Specifies if the texture should be mirrored. | +| U | 7 (bits) | U texture coordinate. | +| Hide with armor | 1 (bit) | Specifies if the box should hide when wearing armor. | +| V | 7 (bits) | V texture coordinate. | +| Inflate | 4 | Defines box scale without changing the UV. | + + +### Offset data +| Name | Size
(in bytes) | Description | +|:-:|:--:|:-:| +| Type | 1 | Type of offset ([see PSMOffsetType](../PCK-Studio/Internal/FileFormats/PSMFile.cs#L60)). | +| Value | 4 | The Vertical Offset. | \ No newline at end of file

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 L6{#8tlc4_xQ+)%F literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/blockData.json b/PckStudio.Core/Resources/blockData.json new file mode 100644 index 00000000..d4622c10 --- /dev/null +++ b/PckStudio.Core/Resources/blockData.json @@ -0,0 +1,2922 @@ +{ + "COMMENT_1": "Tile data research by MattNL", + "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", + "entries": [ + { + "internalName": "grass_top", + "displayName": "Grass Block (Top)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "stone", + "displayName": "Stone" + }, + { + "internalName": "dirt", + "displayName": "Dirt" + }, + { + "internalName": "grass_side", + "displayName": "Grass Block (Side)" + }, + { + "internalName": "planks_oak", + "displayName": "Oak Planks" + }, + { + "internalName": "stoneslab_side", + "displayName": "Stone Slab (Side)" + }, + { + "internalName": "stoneslab_top", + "displayName": "Stone Slab (Top)" + }, + { + "internalName": "brick", + "displayName": "Bricks" + }, + { + "internalName": "tnt_side", + "displayName": "TNT (Side)" + }, + { + "internalName": "tnt_top", + "displayName": "TNT (Top)" + }, + { + "internalName": "tnt_bottom", + "displayName": "TNT (Bottom)" + }, + { + "internalName": "web", + "displayName": "Cobweb" + }, + { + "internalName": "flower_rose", + "displayName": "Poppy" + }, + { + "internalName": "flower_dandelion", + "displayName": "Dandelion" + }, + { + "internalName": "portal", + "displayName": "Nether Portal" + }, + { + "internalName": "sapling", + "displayName": "Oak Sapling" + }, + { + "internalName": "cobblestone", + "displayName": "Cobblestone" + }, + { + "internalName": "bedrock", + "displayName": "Bedrock" + }, + { + "internalName": "sand", + "displayName": "Sand" + }, + { + "internalName": "gravel", + "displayName": "Gravel" + }, + { + "internalName": "log_oak", + "displayName": "Oak Wood (Side)" + }, + { + "internalName": "log_oak_top", + "displayName": "Oak Wood (Top)" + }, + { + "internalName": "iron_block", + "displayName": "Block of Iron" + }, + { + "internalName": "gold_block", + "displayName": "Block of Gold" + }, + { + "internalName": "diamond_block", + "displayName": "Block of Diamond" + }, + { + "internalName": "emerald_block", + "displayName": "Block of Emerald" + }, + { + "internalName": "redstone_block", + "displayName": "Block of Redstone" + }, + { + "internalName": "dropper_front_horizontal", + "displayName": "Dropper (Front)" + }, + { + "internalName": "mushroom_red", + "displayName": "Mushroom (Red)" + }, + { + "internalName": "mushroom_brown", + "displayName": "Mushroom (Brown)" + }, + { + "internalName": "sapling_jungle", + "displayName": "Jungle Tree Sapling" + }, + { + "internalName": "fire_0", + "displayName": "Fire (Layer 1)" + }, + { + "internalName": "gold_ore", + "displayName": "Gold Ore" + }, + { + "internalName": "iron_ore", + "displayName": "Iron Ore" + }, + { + "internalName": "coal_ore", + "displayName": "Coal Ore" + }, + { + "internalName": "bookshelf", + "displayName": "Bookshelf" + }, + { + "internalName": "cobblestone_mossy", + "displayName": "Moss Stone" + }, + { + "internalName": "obsidian", + "displayName": "Obsidian" + }, + { + "internalName": "grass_side_overlay", + "displayName": "Grass Side (Overlay)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "tallgrass", + "displayName": "Tall Grass", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "dispenser_front_vertical", + "displayName": "Dispenser (Vertical) (Front)" + }, + { + "internalName": "beacon", + "displayName": "Beacon" + }, + { + "internalName": "dropper_front_vertical", + "displayName": "Dropper (Vertical) (Front)" + }, + { + "internalName": "workbench_top", + "displayName": "Crafting Table (Top)" + }, + { + "internalName": "furnace_front", + "displayName": "Furnace (Front)" + }, + { + "internalName": "furnace_side", + "displayName": "Furnace/Dispenser/Dropper (Side)" + }, + { + "internalName": "dispenser_front", + "displayName": "Dispenser (Front)" + }, + { + "internalName": "fire_1", + "displayName": "Fire (Layer 2)" + }, + { + "internalName": "sponge", + "displayName": "Sponge" + }, + { + "internalName": "glass", + "displayName": "Glass" + }, + { + "internalName": "diamond_ore", + "displayName": "Diamond Ore" + }, + { + "internalName": "redstone_ore", + "displayName": "Redstone Ore" + }, + { + "internalName": "leaves", + "displayName": "Oak Leaves", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_opaque", + "displayName": "Oak Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "stonebrick", + "displayName": "Stone Bricks" + }, + { + "internalName": "deadbush", + "displayName": "Dead Bush/Shrub" + }, + { + "internalName": "fern", + "displayName": "Fern", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "daylight_detector_top", + "displayName": "Daylight Sensor (Top)" + }, + { + "internalName": "daylight_detector_side", + "displayName": "Daylight Sensor (Side)" + }, + { + "internalName": "workbench_side", + "displayName": "Crafting Table (Side)" + }, + { + "internalName": "workbench_front", + "displayName": "Crafting Table (Front)" + }, + { + "internalName": "furnace_front_lit", + "displayName": "Furnace (Lit) (Front)" + }, + { + "internalName": "furnace_top", + "displayName": "Furnace/Dispenser/Dropper (Top)" + }, + { + "internalName": "sapling_spruce", + "displayName": "Spruce Sapling" + }, + { + "internalName": "wool_colored_white", + "displayName": "White Wool" + }, + { + "internalName": "mob_spawner", + "displayName": "Monster Spawner" + }, + { + "internalName": "snow", + "displayName": "Snow" + }, + { + "internalName": "ice", + "displayName": "Ice" + }, + { + "internalName": "snow_side", + "displayName": "Grass Block (Snowy) (Side)" + }, + { + "internalName": "cactus_top", + "displayName": "Cactus (Top)" + }, + { + "internalName": "cactus_side", + "displayName": "Cactus (Side)" + }, + { + "internalName": "cactus_bottom", + "displayName": "Cactus (Bottom)" + }, + { + "internalName": "clay", + "displayName": "Clay" + }, + { + "internalName": "reeds", + "displayName": "Sugar Canes" + }, + { + "internalName": "jukebox_side", + "displayName": "Jukebox (Side)" + }, + { + "internalName": "jukebox_top", + "displayName": "Jukebox (Top)" + }, + { + "internalName": "waterlily", + "displayName": "Lily Pad", + + "colourEntry": { + "defaultName": "Tile_WaterLily", + "variants": [ "Tile_WaterLily" ] + } + }, + { + "internalName": "mycel_side", + "displayName": "Mycelium (Side)" + }, + { + "internalName": "mycel_top", + "displayName": "Mycelium (Top)" + }, + { + "internalName": "sapling_birch", + "displayName": "Birch Sapling" + }, + { + "internalName": "torch_on", + "displayName": "Torch" + }, + { + "internalName": "door_wood_upper", + "displayName": "Oak Door (Top)" + }, + { + "internalName": "door_iron_upper", + "displayName": "Iron Door (Top)" + }, + { + "internalName": "ladder", + "displayName": "Ladder" + }, + { + "internalName": "trapdoor", + "displayName": "Oak Trapdoor" + }, + { + "internalName": "iron_bars", + "displayName": "Iron Bars" + }, + { + "internalName": "farmland_wet", + "displayName": "Farmland (Wet)" + }, + { + "internalName": "farmland_dry", + "displayName": "Farmland" + }, + { + "internalName": "crops_0", + "displayName": "Wheat (Stage 1)" + }, + { + "internalName": "crops_1", + "displayName": "Wheat (Stage 2)" + }, + { + "internalName": "crops_2", + "displayName": "Wheat (Stage 3)" + }, + { + "internalName": "crops_3", + "displayName": "Wheat (Stage 4)" + }, + { + "internalName": "crops_4", + "displayName": "Wheat (Stage 5)" + }, + { + "internalName": "crops_5", + "displayName": "Wheat (Stage 6)" + }, + { + "internalName": "crops_6", + "displayName": "Wheat (Stage 7)" + }, + { + "internalName": "crops_7", + "displayName": "Wheat (Stage 8)" + }, + { + "internalName": "lever", + "displayName": "Lever" + }, + { + "internalName": "door_wood_lower", + "displayName": "Oak Door (Bottom)" + }, + { + "internalName": "door_iron_lower", + "displayName": "Iron Door (Bottom)" + }, + { + "internalName": "redstone_torch_on", + "displayName": "Redstone Torch" + }, + { + "internalName": "stonebrick_mossy", + "displayName": "Mossy Stone Bricks" + }, + { + "internalName": "stonebrick_cracked", + "displayName": "Cracked Stone Bricks" + }, + { + "internalName": "pumpkin_top", + "displayName": "Pumpkin (Top)" + }, + { + "internalName": "netherrack", + "displayName": "Netherrack" + }, + { + "internalName": "soul_sand", + "displayName": "Soul Sand" + }, + { + "internalName": "glowstone", + "displayName": "Glowstone" + }, + { + "internalName": "piston_top_sticky", + "displayName": "Sticky Piston (Top)" + }, + { + "internalName": "piston_top", + "displayName": "Piston (Top)" + }, + { + "internalName": "piston_side", + "displayName": "Piston (Side)" + }, + { + "internalName": "piston_bottom", + "displayName": "Piston (Bottom)" + }, + { + "internalName": "piston_inner_top", + "displayName": "Piston (Inside)" + }, + { + "internalName": "stem_straight", + "displayName": "Stem", + + "colourEntry": { + "defaultName": "Tile_StemMin", + "variants": [ + "Tile_StemMin", + "Tile_StemMax" + ] + } + }, + { + "internalName": "rail_normal_turned", + "displayName": "Rail (Turned)" + }, + { + "internalName": "wool_colored_black", + "displayName": "Black Wool" + }, + { + "internalName": "wool_colored_gray", + "displayName": "Gray Wool" + }, + { + "internalName": "redstone_torch_off", + "displayName": "Redstone Torch (Off)" + }, + { + "internalName": "log_spruce", + "displayName": "Spruce Wood (Side)" + }, + { + "internalName": "log_birch", + "displayName": "Birch Wood (Side)" + }, + { + "internalName": "pumpkin_side", + "displayName": "Pumpkin (Side)" + }, + { + "internalName": "pumpkin_face_off", + "displayName": "Carved Pumpkin" + }, + { + "internalName": "pumpkin_face_on", + "displayName": "Jack-O-Lantern" + }, + { + "internalName": "cake_top", + "displayName": "Cake (Top)" + }, + { + "internalName": "cake_side", + "displayName": "Cake (Side)" + }, + { + "internalName": "cake_inner", + "displayName": "Cake (Inside)" + }, + { + "internalName": "cake_bottom", + "displayName": "Cake (Bottom)" + }, + { + "internalName": "mushroom_block_skin_red", + "displayName": "Mushroom (Red Block)" + }, + { + "internalName": "mushroom_block_skin_brown", + "displayName": "Mushroom (Brown Block)" + }, + { + "internalName": "stem_bent", + "displayName": "Stem (Attached)", + + "colourEntry": { + "defaultName": "Tile_StemMin", + "variants": [ + "Tile_StemMin", + "Tile_StemMax" + ] + } + }, + { + "internalName": "rail_normal", + "displayName": "Rail" + }, + { + "internalName": "wool_colored_red", + "displayName": "Red Wool" + }, + { + "internalName": "wool_colored_pink", + "displayName": "Pink Wool" + }, + { + "internalName": "repeater_off", + "displayName": "Repeater" + }, + { + "internalName": "leaves_spruce", + "displayName": "Spruce Leaves", + + "colourEntry": { + "defaultName": "Foliage_Evergreen", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_spruce_opaque", + "displayName": "Spruce Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Evergreen", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "conduit_top", + "displayName": "Conduit (Break Particles)" + }, + { + "internalName": "turtle_egg_hatch_0", + "displayName": "Sea Turtle Egg (Stage 1)" + }, + { + "internalName": "melon_side", + "displayName": "Melon (Side)" + }, + { + "internalName": "melon_top", + "displayName": "Melon (Top)" + }, + { + "internalName": "cauldron_top", + "displayName": "Cauldron (Top)" + }, + { + "internalName": "cauldron_inner", + "displayName": "Cauldron (Inside)" + }, + { + "internalName": "sponge_wet", + "displayName": "Wet Sponge" + }, + { + "internalName": "mushroom_block_skin_stem", + "displayName": "Mushroom (Stem Block)" + }, + { + "internalName": "mushroom_block_inside", + "displayName": "Mushroom (Inside Block)" + }, + { + "internalName": "vine", + "displayName": "Vines", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "lapis_block", + "displayName": "Lapis Lazuli Block" + }, + { + "internalName": "wool_colored_green", + "displayName": "Green Wool" + }, + { + "internalName": "wool_colored_lime", + "displayName": "Lime Wool" + }, + { + "internalName": "repeater_on", + "displayName": "Redstone Repeater (On)" + }, + { + "internalName": "glass_pane_top", + "displayName": "Glass Pane (Top)" + }, + { + "internalName": "chest_top", + "displayName": "Chest (Break Particles)" + }, + { + "internalName": "ender_chest_top", + "displayName": "Ender Chest (Break Particles)" + }, + { + "internalName": "turtle_egg_hatch_1", + "displayName": "Sea Turtle Egg (Stage 2)" + }, + { + "internalName": "turtle_egg_hatch_2", + "displayName": "Sea Turtle Egg (Stage 3)" + }, + { + "internalName": "log_jungle", + "displayName": "Jungle Wood (Side)" + }, + { + "internalName": "cauldron_side", + "displayName": "Cauldron (Side)" + }, + { + "internalName": "cauldron_bottom", + "displayName": "Cauldron (Bottom)" + }, + { + "internalName": "brewing_stand_base", + "displayName": "Brewing Stand (Base)" + }, + { + "internalName": "brewing_stand", + "displayName": "Brewing Stand" + }, + { + "internalName": "endframe_top", + "displayName": "End Portal Frame (Top)" + }, + { + "internalName": "endframe_side", + "displayName": "End Portal Frame (Side)" + }, + { + "internalName": "lapis_ore", + "displayName": "Lapis Lazuli Ore" + }, + { + "internalName": "wool_colored_brown", + "displayName": "Brown Wool" + }, + { + "internalName": "wool_colored_yellow", + "displayName": "Yellow Wool" + }, + { + "internalName": "rail_golden", + "displayName": "Powered Rail" + }, + { + "internalName": "redstone_dust_cross", + "displayName": "Redstone Dust (Cross)", + + "colourEntry": { + "defaultName": "Tile_RedstoneDust", + "variants": [ + "Tile_RedstoneDust", + "Tile_RedstoneDustUnlit", + "Tile_RedstoneDustLitMin", + "Tile_RedstoneDustLitMax" + ] + } + }, + { + "internalName": "redstone_dust_line", + "displayName": "Redstone Dust (Line)", + + "colourEntry": { + "defaultName": "Tile_RedstoneDust", + "variants": [ + "Tile_RedstoneDust", + "Tile_RedstoneDustUnlit", + "Tile_RedstoneDustLitMin", + "Tile_RedstoneDustLitMax" + ] + } + }, + { + "internalName": "enchantment_top", + "displayName": "Enchantment Table (Top)" + }, + { + "internalName": "dragon_egg", + "displayName": "Dragon Egg" + }, + { + "internalName": "cocoa_2", + "displayName": "Cocoa (Stage 3)" + }, + { + "internalName": "cocoa_1", + "displayName": "Cocoa (Stage 2)" + }, + { + "internalName": "cocoa_0", + "displayName": "Cocoa (Stage 1)" + }, + { + "internalName": "emerald_ore", + "displayName": "Emerald Ore" + }, + { + "internalName": "trip_wire_source", + "displayName": "Tripwire Hook" + }, + { + "internalName": "trip_wire", + "displayName": "Tripwire" + }, + { + "internalName": "endframe_eye", + "displayName": "End Portal Frame (Eye)" + }, + { + "internalName": "end_stone", + "displayName": "End Stone" + }, + { + "internalName": "sandstone_top", + "displayName": "Sandstone (Top)" + }, + { + "internalName": "wool_colored_blue", + "displayName": "Blue Wool" + }, + { + "internalName": "wool_colored_light_blue", + "displayName": "Light Blue Wool" + }, + { + "internalName": "rail_golden_powered", + "displayName": "Powered Rail (On)" + }, + { + "internalName": "redstone_dust_cross_overlay", + "displayName": "Redstone Dust (Cross) (Overlay)" + }, + { + "internalName": "redstone_dust_line_overlay", + "displayName": "Redstone Dust (Line) (Overlay)" + }, + { + "internalName": "enchantment_side", + "displayName": "Enchantment Table (Side)" + }, + { + "internalName": "enchantment_bottom", + "displayName": "Enchantment Table (Bottom)" + }, + { + "internalName": "diamondRing", + "displayName": "Diamond Score Ring" + }, + { + "internalName": "itemframe_back", + "displayName": "Item Frame" + }, + { + "internalName": "flower_pot", + "displayName": "Flower Pot" + }, + { + "internalName": "comparator_off", + "displayName": "Redstone Comparator" + }, + { + "internalName": "comparator_on", + "displayName": "Redstone Comparator (On)" + }, + { + "internalName": "rail_activator", + "displayName": "Activator Rail" + }, + { + "internalName": "rail_activator_powered", + "displayName": "Activator Rail (On)" + }, + { + "internalName": "quartz_ore", + "displayName": "Nether Quartz Ore" + }, + { + "internalName": "sandstone_side", + "displayName": "Sandstone (Side)" + }, + { + "internalName": "wool_colored_purple", + "displayName": "Purple Wool" + }, + { + "internalName": "wool_colored_magenta", + "displayName": "Magenta Wool" + }, + { + "internalName": "detectorRail", + "displayName": "Detector Rail" + }, + { + "internalName": "leaves_jungle", + "displayName": "Jungle Leaves", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_jungle_opaque", + "displayName": "Jungle Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "planks_spruce", + "displayName": "Spruce Planks" + }, + { + "internalName": "planks_jungle", + "displayName": "Jungle Planks" + }, + { + "internalName": "carrots_stage_0", + "displayName": "Carrots (Stage 1)" + }, + { + "internalName": "carrots_stage_1", + "displayName": "Carrots (Stage 2)" + }, + { + "internalName": "carrots_stage_2", + "displayName": "Carrots (Stage 3)" + }, + { + "internalName": "carrots_stage_3", + "displayName": "Carrots (Stage 4)" + }, + { + "internalName": "slime", + "displayName": "Slime Block" + }, + { + "internalName": "water", + "displayName": "Water", + + "colourEntry": { + "isWaterColour": true, + "defaultName": "Water_Plains", + "variants": [ + "Water_Ocean", + "Water_Plains", + "Water_Desert", + "Water_ExtremeHills", + "Water_Forest", + "Water_Taiga", + "Water_Swampland", + "Water_River", + "Water_Hell", + "Water_Sky", + "Water_FrozenOcean", + "Water_FrozenRiver", + "Water_IcePlains", + "Water_IceMountains", + "Water_MushroomIsland", + "Water_MushroomIslandShore", + "Water_Beach", + "Water_DesertHills", + "Water_ForestHills", + "Water_TaigaHills", + "Water_ExtremeHillsEdge", + "Water_Jungle", + "Water_JungleHills", + "Water_JungleEdge", + "Water_DeepOcean", + "Water_StoneBeach", + "Water_ColdBeach", + "Water_BirchForest", + "Water_BirchForestHills", + "Water_RoofedForest", + "Water_ColdTaiga", + "Water_ColdTaigaHills", + "Water_MegaTaiga", + "Water_MegaTaigaHills", + "Water_ExtremeHillsPlus", + "Water_Savanna", + "Water_SavannaPlateau", + "Water_Mesa", + "Water_MesaPlateauF", + "Water_MesaPlateau" + ] + } + }, + { + "internalName": "water_flow", + "displayName": "Flowing Water", + + "width": 2, + "height": 2, + "colourEntry": { + "isWaterColour": true, + "defaultName": "Water_Plains", + "variants": [ + "Water_Ocean", + "Water_Plains", + "Water_Desert", + "Water_ExtremeHills", + "Water_Forest", + "Water_Taiga", + "Water_Swampland", + "Water_River", + "Water_Hell", + "Water_Sky", + "Water_FrozenOcean", + "Water_FrozenRiver", + "Water_IcePlains", + "Water_IceMountains", + "Water_MushroomIsland", + "Water_MushroomIslandShore", + "Water_Beach", + "Water_DesertHills", + "Water_ForestHills", + "Water_TaigaHills", + "Water_ExtremeHillsEdge", + "Water_Jungle", + "Water_JungleHills", + "Water_JungleEdge", + "Water_DeepOcean", + "Water_StoneBeach", + "Water_ColdBeach", + "Water_BirchForest", + "Water_BirchForestHills", + "Water_RoofedForest", + "Water_ColdTaiga", + "Water_ColdTaigaHills", + "Water_MegaTaiga", + "Water_MegaTaigaHills", + "Water_ExtremeHillsPlus", + "Water_Savanna", + "Water_SavannaPlateau", + "Water_Mesa", + "Water_MesaPlateauF", + "Water_MesaPlateau" + ] + } + }, + { + "internalName": "water_flow", + "displayName": "" + }, + { + "internalName": "sandstone_bottom", + "displayName": "Sandstone (Bottom)" + }, + { + "internalName": "wool_colored_cyan", + "displayName": "Cyan Wool" + }, + { + "internalName": "wool_colored_orange", + "displayName": "Orange Wool" + }, + { + "internalName": "redstoneLight", + "displayName": "Redstone Lamp" + }, + { + "internalName": "redstoneLight_lit", + "displayName": "Redstone Lamp (On)" + }, + { + "internalName": "stonebrick_carved", + "displayName": "Chiseled Stone Bricks" + }, + { + "internalName": "planks_birch", + "displayName": "Birch Planks" + }, + { + "internalName": "anvil_base", + "displayName": "Anvil (Base)" + }, + { + "internalName": "anvil_top_damaged_1", + "displayName": "Anvil (Slightly Damaged) (Top)" + }, + { + "internalName": "quartz_block_chiseled_top", + "displayName": "Chiseled Quartz Block (Top)" + }, + { + "internalName": "quartz_block_lines_top", + "displayName": "Pillar Quartz Block (Top)" + }, + { + "internalName": "quartz_block_top", + "displayName": "Block of Quartz (Top)" + }, + { + "internalName": "hopper_outside", + "displayName": "Hopper (Side)" + }, + { + "internalName": "detectorRail_on", + "displayName": "Detector Rail (On)" + }, + { + "internalName": "water_flow", + "displayName": "" + }, + { + "internalName": "water_flow", + "displayName": "" + }, + { + "internalName": "nether_brick", + "displayName": "Nether Brick" + }, + { + "internalName": "wool_colored_silver", + "displayName": "Light Gray Wool" + }, + { + "internalName": "nether_wart_stage_0", + "displayName": "Nether Wart (Stage 1)" + }, + { + "internalName": "nether_wart_stage_1", + "displayName": "Nether Wart (Stage 2)" + }, + { + "internalName": "nether_wart_stage_2", + "displayName": "Nether Wart (Stage 3)" + }, + { + "internalName": "sandstone_carved", + "displayName": "Chiseled Sandstone" + }, + { + "internalName": "sandstone_smooth", + "displayName": "Smooth Sandstone" + }, + { + "internalName": "anvil_top", + "displayName": "Anvil (Top)" + }, + { + "internalName": "anvil_top_damaged_2", + "displayName": "Anvil (Very Damaged) (Top)" + }, + { + "internalName": "quartz_block_chiseled", + "displayName": "Chiseled Quartz Block (Side)" + }, + { + "internalName": "quartz_block_lines", + "displayName": "Pillar Quartz Block (Side)" + }, + { + "internalName": "quartz_block_side", + "displayName": "Block of Quartz (Side)" + }, + { + "internalName": "hopper_inside", + "displayName": "Hopper (Inside)" + }, + { + "internalName": "lava", + "displayName": "Lava" + }, + { + "internalName": "lava_flow", + "displayName": "Flowing Lava", + "width": 2, + "height": 2 + }, + { + "internalName": "lava_flow", + "displayName": "", + }, + { + "internalName": "destroy_0", + "displayName": "Destroy (Stage 1)" + }, + { + "internalName": "destroy_1", + "displayName": "Destroy (Stage 2)" + }, + { + "internalName": "destroy_2", + "displayName": "Destroy (Stage 3)" + }, + { + "internalName": "destroy_3", + "displayName": "Destroy (Stage 4)" + }, + { + "internalName": "destroy_4", + "displayName": "Destroy (Stage 5)" + }, + { + "internalName": "destroy_5", + "displayName": "Destroy (Stage 6)" + }, + { + "internalName": "destroy_6", + "displayName": "Destroy (Stage 7)" + }, + { + "internalName": "destroy_7", + "displayName": "Destroy (Stage 8)" + }, + { + "internalName": "destroy_8", + "displayName": "Destroy (Stage 9)" + }, + { + "internalName": "destroy_9", + "displayName": "Destroy (Stage 10)" + }, + { + "internalName": "hay_block_side", + "displayName": "Hay Bale (Side)" + }, + { + "internalName": "quartz_block_bottom", + "displayName": "Quartz Block (Bottom)" + }, + { + "internalName": "hopper_top", + "displayName": "Hopper (Top)" + }, + { + "internalName": "hay_block_top", + "displayName": "Hay Bale (Top)" + }, + { + "internalName": "lava_flow", + "displayName": "", + }, + { + "internalName": "lava_flow", + "displayName": "", + }, + { + "internalName": "coal_block", + "displayName": "Block of Coal" + }, + { + "internalName": "hardened_clay", + "displayName": "Terracotta" + }, + { + "internalName": "noteblock", + "displayName": "Note Block" + }, + { + "internalName": "stone_andesite", + "displayName": "Andesite" + }, + { + "internalName": "stone_andesite_smooth", + "displayName": "Polished Andesite" + }, + { + "internalName": "stone_diorite", + "displayName": "Diorite" + }, + { + "internalName": "stone_diorite_smooth", + "displayName": "Polished Diorite" + }, + { + "internalName": "stone_granite", + "displayName": "Granite" + }, + { + "internalName": "stone_granite_smooth", + "displayName": "Polished Granite" + }, + { + "internalName": "potatoes_stage_0", + "displayName": "Potatoes (Stage 1)" + }, + { + "internalName": "potatoes_stage_1", + "displayName": "Potatoes (Stage 2)" + }, + { + "internalName": "potatoes_stage_2", + "displayName": "Potatoes (Stage 3)" + }, + { + "internalName": "potatoes_stage_3", + "displayName": "Potatoes (Stage 4)" + }, + { + "internalName": "log_spruce_top", + "displayName": "Spruce Wood (Top)" + }, + { + "internalName": "log_jungle_top", + "displayName": "Jungle Wood (Top)" + }, + { + "internalName": "log_birch_top", + "displayName": "Birch Wood (Top)" + }, + { + "internalName": "hardened_clay_stained_black", + "displayName": "Black Terracotta" + }, + { + "internalName": "hardened_clay_stained_blue", + "displayName": "Blue Terracotta" + }, + { + "internalName": "hardened_clay_stained_brown", + "displayName": "Brown Terracotta" + }, + { + "internalName": "hardened_clay_stained_cyan", + "displayName": "Cyan Terracotta" + }, + { + "internalName": "hardened_clay_stained_gray", + "displayName": "Gray Terracotta" + }, + { + "internalName": "hardened_clay_stained_green", + "displayName": "Green Terracotta" + }, + { + "internalName": "hardened_clay_stained_light_blue", + "displayName": "Light Blue Terracotta" + }, + { + "internalName": "hardened_clay_stained_lime", + "displayName": "Lime Terracotta" + }, + { + "internalName": "hardened_clay_stained_magenta", + "displayName": "Magenta Terracotta" + }, + { + "internalName": "hardened_clay_stained_orange", + "displayName": "Orange Terracotta" + }, + { + "internalName": "hardened_clay_stained_pink", + "displayName": "Pink Terracotta" + }, + { + "internalName": "hardened_clay_stained_purple", + "displayName": "Purple Terracotta" + }, + { + "internalName": "hardened_clay_stained_red", + "displayName": "Red Terracotta" + }, + { + "internalName": "hardened_clay_stained_silver", + "displayName": "Light Gray Terracotta" + }, + { + "internalName": "hardened_clay_stained_white", + "displayName": "White Terracotta" + }, + { + "internalName": "hardened_clay_stained_yellow", + "displayName": "Yellow Terracotta" + }, + { + "internalName": "glass_black", + "displayName": "Black Stained Glass" + }, + { + "internalName": "glass_blue", + "displayName": "Blue Stained Glass" + }, + { + "internalName": "glass_brown", + "displayName": "Brown Stained Glass" + }, + { + "internalName": "glass_cyan", + "displayName": "Cyan Stained Glass" + }, + { + "internalName": "glass_gray", + "displayName": "Gray Stained Glass" + }, + { + "internalName": "glass_green", + "displayName": "Green Stained Glass" + }, + { + "internalName": "glass_light_blue", + "displayName": "Light Blue Stained Glass" + }, + { + "internalName": "glass_lime", + "displayName": "Lime Stained Glass" + }, + { + "internalName": "glass_magenta", + "displayName": "Magenta Stained Glass" + }, + { + "internalName": "glass_orange", + "displayName": "Orange Stained Glass" + }, + { + "internalName": "glass_pink", + "displayName": "Pink Stained Glass" + }, + { + "internalName": "glass_purple", + "displayName": "Purple Stained Glass" + }, + { + "internalName": "glass_red", + "displayName": "Red Stained Glass" + }, + { + "internalName": "glass_silver", + "displayName": "Light Gray Stained Glass" + }, + { + "internalName": "glass_white", + "displayName": "White Stained Glass" + }, + { + "internalName": "glass_yellow", + "displayName": "Yellow Stained Glass" + }, + { + "internalName": "glass_pane_top_black", + "displayName": "Black Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_blue", + "displayName": "Blue Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_brown", + "displayName": "Brown Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_cyan", + "displayName": "Cyan Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_gray", + "displayName": "Gray Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_green", + "displayName": "Green Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_light_blue", + "displayName": "Light Blue Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_lime", + "displayName": "Lime Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_magenta", + "displayName": "Magenta Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_orange", + "displayName": "Orange Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_pink", + "displayName": "Pink Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_purple", + "displayName": "Purple Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_red", + "displayName": "Red Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_silver", + "displayName": "Light Gray Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_white", + "displayName": "White Stained Glass Pane (Top)" + }, + { + "internalName": "glass_pane_top_yellow", + "displayName": "Yellow Stained Glass Pane (Top)" + }, + { + "internalName": "double_plant_fern_top", + "displayName": "Large Fern (Top)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "double_plant_grass_top", + "displayName": "Double Tall Grass (Top)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "double_plant_paeonia_top", + "displayName": "Peony (Top)" + }, + { + "internalName": "double_plant_rose_top", + "displayName": "Rose Bush (Top)" + }, + { + "internalName": "double_plant_syringa_top", + "displayName": "Lilac (Top)" + }, + { + "internalName": "flower_tulip_orange", + "displayName": "Orange Tulip" + }, + { + "internalName": "double_plant_sunflower_top", + "displayName": "Sunflower (Top)" + }, + { + "internalName": "double_plant_sunflower_front", + "displayName": "Sunflower (Front)" + }, + { + "internalName": "log_acacia", + "displayName": "Acacia Wood (Side)" + }, + { + "internalName": "log_acacia_top", + "displayName": "Acacia Wood (Top)" + }, + { + "internalName": "planks_acacia", + "displayName": "Acacia Planks" + }, + { + "internalName": "leaves_acacia", + "displayName": "Acacia Leaves", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_acacia_fast", + "displayName": "Acacia Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "prismarine_bricks", + "displayName": "Prismarine Bricks" + }, + { + "internalName": "red_sand", + "displayName": "Red Sand" + }, + { + "internalName": "red_sandstone_top", + "displayName": "Red Sandstone (Top)" + }, + { + "internalName": "double_plant_fern_bottom", + "displayName": "Large Fern (Bottom)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "double_plant_grass_bottom", + "displayName": "Double Tall Grass (Bottom)", + + "colourEntry": { + "defaultName": "Grass_Common", + "variants": [ + "Grass_Common", + "Grass_Mesa", + "Grass_Swamp1", + "Grass_Swamp2" + ] + } + }, + { + "internalName": "double_plant_paeonia_bottom", + "displayName": "Peony (Bottom)" + }, + { + "internalName": "double_plant_rose_bottom", + "displayName": "Rose Bush (Bottom)" + }, + { + "internalName": "double_plant_syringa_bottom", + "displayName": "Lilac (Bottom)" + }, + { + "internalName": "flower_tulip_pink", + "displayName": "Pink Tulip" + }, + { + "internalName": "double_plant_sunflower_bottom", + "displayName": "Sunflower (Bottom)" + }, + { + "internalName": "double_plant_sunflower_back", + "displayName": "Sunflower (Back)" + }, + { + "internalName": "log_big_oak", + "displayName": "Dark Oak Wood (Side)" + }, + { + "internalName": "log_big_oak_top", + "displayName": "Dark Oak Wood (Top)" + }, + { + "internalName": "planks_big_oak", + "displayName": "Dark Oak Planks" + }, + { + "internalName": "leaves_big_oak", + "displayName": "Dark Oak Leaves", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_big_oak_fast", + "displayName": "Dark Oak Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Default", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "prismarine_dark", + "displayName": "Dark Prismarine" + }, + { + "internalName": "red_sandstone_bottom", + "displayName": "Red Sandstone (Bottom)" + }, + { + "internalName": "red_sandstone_normal", + "displayName": "Red Sandstone (Side)" + }, + { + "internalName": "flower_alium", + "displayName": "Allium" + }, + { + "internalName": "flower_blue_orchid", + "displayName": "Blue Orchid" + }, + { + "internalName": "flower_houstonia", + "displayName": "Azure Bluet" + }, + { + "internalName": "flower_oxeye_daisy", + "displayName": "Oxeye Daisy" + }, + { + "internalName": "flower_tulip_red", + "displayName": "Red Tulip" + }, + { + "internalName": "flower_tulip_white", + "displayName": "White Tulip" + }, + { + "internalName": "sapling_acacia", + "displayName": "Acacia Sapling" + }, + { + "internalName": "sapling_roofed_oak", + "displayName": "Dark Oak Sapling" + }, + { + "internalName": "coarse_dirt", + "displayName": "Coarse Dirt" + }, + { + "internalName": "dirt_podzol_side", + "displayName": "Podzol (Side)" + }, + { + "internalName": "dirt_podzol_top", + "displayName": "Podzol (Top)" + }, + { + "internalName": "leaves_birch", + "displayName": "Birch Leaves", + + "colourEntry": { + "defaultName": "Foliage_Birch", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "leaves_birch_fast", + "displayName": "Birch Leaves (Opaque)", + + "colourEntry": { + "defaultName": "Foliage_Birch", + "variants": [ + "Foliage_Default", + "Foliage_Evergreen", + "Foliage_Birch", + "Foliage_Mesa", + "Foliage_Swampland" + ] + } + }, + { + "internalName": "prismarine_rough", + "displayName": "Prismarine" + }, + { + "internalName": "red_sandstone_carved", + "displayName": "Chiseled Red Sandstone" + }, + { + "internalName": "red_sandstone_smooth", + "displayName": "Smooth Red Standstone" + }, + { + "internalName": "door_acacia_upper", + "displayName": "Acacia Door (Top)" + }, + { + "internalName": "door_birch_upper", + "displayName": "Birch Door (Top)" + }, + { + "internalName": "door_dark_oak_upper", + "displayName": "Dark Oak Door (Top)" + }, + { + "internalName": "door_jungle_upper", + "displayName": "Jungle Door (Top)" + }, + { + "internalName": "door_spruce_upper", + "displayName": "Spruce Door (Top)" + }, + { + "internalName": "chorus_flower", + "displayName": "Chorus Flower" + }, + { + "internalName": "chorus_flower_dead", + "displayName": "Chorus Flower (Dead)" + }, + { + "internalName": "chorus_flower_plant", + "displayName": "Chorus Plant" + }, + { + "internalName": "end_bricks", + "displayName": "End Stone Bricks" + }, + { + "internalName": "grass_path_side", + "displayName": "Grass Path (Side)" + }, + { + "internalName": "grass_path_top", + "displayName": "Grass Path (Top)" + }, + { + "internalName": "barrier", + "displayName": "Barrier" + }, + { + "internalName": "ice_packed", + "displayName": "Packed Ice" + }, + { + "internalName": "sea_lantern", + "displayName": "Sea Lantern" + }, + { + "internalName": "daylight_detector_inverted_top", + "displayName": "Daylight Sensor (Inverted) (Top)" + }, + { + "internalName": "iron_trapdoor", + "displayName": "Iron Trapdoor" + }, + { + "internalName": "door_acacia_lower", + "displayName": "Acacia Door (Bottom)" + }, + { + "internalName": "door_birch_lower", + "displayName": "Birch Door (Bottom)" + }, + { + "internalName": "door_dark_oak_lower", + "displayName": "Dark Oak Door (Bottom)" + }, + { + "internalName": "door_jungle_lower", + "displayName": "Jungle Door (Bottom)" + }, + { + "internalName": "door_spruce_lower", + "displayName": "Spruce Door (Bottom)" + }, + { + "internalName": "purpur_block", + "displayName": "Purpur Block" + }, + { + "internalName": "purpur_pillar", + "displayName": "Purpur Pillar (Side)" + }, + { + "internalName": "purpur_pillar_top", + "displayName": "Purpur Pillar (Top)" + }, + { + "internalName": "end_rod", + "displayName": "End Rod" + }, + { + "internalName": "magma", + "displayName": "Magma Block" + }, + { + "internalName": "nether_wart_block", + "displayName": "Nether Wart Block" + }, + { + "internalName": "red_nether_brick", + "displayName": "Red Nether Brick" + }, + { + "internalName": "frosted_ice_0", + "displayName": "Frosted Ice (Stage 1)" + }, + { + "internalName": "frosted_ice_1", + "displayName": "Frosted Ice (Stage 2)" + }, + { + "internalName": "frosted_ice_2", + "displayName": "Frosted Ice (Stage 3)" + }, + { + "internalName": "frosted_ice_3", + "displayName": "Frosted Ice (Stage 4)" + }, + { + "internalName": "beetroots_stage_0", + "displayName": "Beetroots (Stage 1)" + }, + { + "internalName": "beetroots_stage_1", + "displayName": "Beetroots (Stage 2)" + }, + { + "internalName": "beetroots_stage_2", + "displayName": "Beetroots (Stage 3)" + }, + { + "internalName": "beetroots_stage_3", + "displayName": "Beetroots (Stage 4)" + }, + { + "internalName": "chain_command_block_back", + "displayName": "Chain Command Block (Back)" + }, + { + "internalName": "chain_command_block_conditional", + "displayName": "Chain Command Block (Conditional) (Side)" + }, + { + "internalName": "chain_command_block_front", + "displayName": "Chain Command Block (Front)" + }, + { + "internalName": "chain_command_block_side", + "displayName": "Chain Command Block (Side)" + }, + { + "internalName": "command_block_back", + "displayName": "Command Block (Back)" + }, + { + "internalName": "command_block_conditional", + "displayName": "Command Block (Conditional) (Side)" + }, + { + "internalName": "command_block_front", + "displayName": "Command Block (Front)" + }, + { + "internalName": "command_block_side", + "displayName": "Command Block (Side)" + }, + { + "internalName": "repeating_command_block_back", + "displayName": "Repeating Command Block (Back)" + }, + { + "internalName": "repeating_command_block_conditional", + "displayName": "Repeating Command Block (Conditional) (Side)" + }, + { + "internalName": "repeating_command_block_front", + "displayName": "Repeating Command Block (Front)" + }, + { + "internalName": "repeating_command_block_side", + "displayName": "Repeating Command Block (Side)" + }, + { + "internalName": "bone_block_side", + "displayName": "Bone Block (Side)" + }, + { + "internalName": "bone_block_top", + "displayName": "Bone Block (Top)" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "observer_front", + "displayName": "Observer (Front)" + }, + { + "internalName": "observer_side", + "displayName": "Observer (Side)" + }, + { + "internalName": "observer_back", + "displayName": "Observer (Back)" + }, + { + "internalName": "observer_back_lit", + "displayName": "Observer (On) (Back)" + }, + { + "internalName": "observer_top", + "displayName": "Observer (Top and Bottom)" + }, + { + "internalName": "goldRing", + "displayName": "Gold Score Ring" + }, + { + "internalName": "emeraldRing", + "displayName": "Emerald Score Ring" + }, + { + "internalName": "structure_block", + "displayName": "Structure Block" + }, + { + "internalName": "structure_block_corner", + "displayName": "Structure Block (Corner)" + }, + { + "internalName": "structure_block_data", + "displayName": "Structure Block (Data)" + }, + { + "internalName": "structure_block_load", + "displayName": "Structure Block (Load)" + }, + { + "internalName": "structure_block_save", + "displayName": "Structure Block (Save)" + }, + { + "internalName": "concrete_black", + "displayName": "Black Concrete" + }, + { + "internalName": "concrete_blue", + "displayName": "Blue Concrete" + }, + { + "internalName": "concrete_brown", + "displayName": "Brown Concrete" + }, + { + "internalName": "concrete_cyan", + "displayName": "Cyan Concrete" + }, + { + "internalName": "concrete_gray", + "displayName": "Gray Concrete" + }, + { + "internalName": "concrete_green", + "displayName": "Green Concrete" + }, + { + "internalName": "concrete_light_blue", + "displayName": "Light Blue Concrete" + }, + { + "internalName": "concrete_lime", + "displayName": "Lime Concrete" + }, + { + "internalName": "concrete_magenta", + "displayName": "Magenta Concrete" + }, + { + "internalName": "concrete_orange", + "displayName": "Orange Concrete" + }, + { + "internalName": "concrete_pink", + "displayName": "Pink Concrete" + }, + { + "internalName": "concrete_purple", + "displayName": "Purple Concrete" + }, + { + "internalName": "concrete_red", + "displayName": "Red Concrete" + }, + { + "internalName": "concrete_silver", + "displayName": "Light Gray Concrete" + }, + { + "internalName": "concrete_white", + "displayName": "White Concrete" + }, + { + "internalName": "concrete_yellow", + "displayName": "Yellow Concrete" + }, + { + "internalName": "concrete_powder_black", + "displayName": "Black Concrete Powder" + }, + { + "internalName": "concrete_powder_blue", + "displayName": "Blue Concrete Powder" + }, + { + "internalName": "concrete_powder_brown", + "displayName": "Brown Concrete Powder" + }, + { + "internalName": "concrete_powder_cyan", + "displayName": "Cyan Concrete Powder" + }, + { + "internalName": "concrete_powder_gray", + "displayName": "Gray Concrete Powder" + }, + { + "internalName": "concrete_powder_green", + "displayName": "Green Concrete Powder" + }, + { + "internalName": "concrete_powder_light_blue", + "displayName": "Light Blue Concrete Powder" + }, + { + "internalName": "concrete_powder_lime", + "displayName": "Lime Concrete Powder" + }, + { + "internalName": "concrete_powder_magenta", + "displayName": "Magenta Concrete Powder" + }, + { + "internalName": "concrete_powder_orange", + "displayName": "Orange Concrete Powder" + }, + { + "internalName": "concrete_powder_pink", + "displayName": "Pink Concrete Powder" + }, + { + "internalName": "concrete_powder_purple", + "displayName": "Purple Concrete Powder" + }, + { + "internalName": "concrete_powder_red", + "displayName": "Red Concrete Powder" + }, + { + "internalName": "concrete_powder_silver", + "displayName": "Light Gray Concrete Powder" + }, + { + "internalName": "concrete_powder_white", + "displayName": "White Concrete Powder" + }, + { + "internalName": "concrete_powder_yellow", + "displayName": "Yellow Concrete Powder" + }, + { + "internalName": "glazed_terracotta_black", + "displayName": "Black Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_blue", + "displayName": "Blue Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_brown", + "displayName": "Brown Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_cyan", + "displayName": "Cyan Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_gray", + "displayName": "Gray Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_green", + "displayName": "Green Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_light_blue", + "displayName": "Light Blue Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_lime", + "displayName": "Lime Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_magenta", + "displayName": "Magenta Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_orange", + "displayName": "Orange Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_pink", + "displayName": "Pink Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_purple", + "displayName": "Purple Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_red", + "displayName": "Red Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_silver", + "displayName": "Light Gray Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_white", + "displayName": "White Glazed Terracotta" + }, + { + "internalName": "glazed_terracotta_yellow", + "displayName": "Yellow Glazed Terracotta" + }, + { + "internalName": "shulker_top", + "displayName": "Shulker Box (Break Particles)", + + "colourEntry": { + "defaultName": "Shulker_Box_Purple", + "variants": [ + "Shulker_Box_Black", + "Shulker_Box_Blue", + "Shulker_Box_Brown", + "Shulker_Box_Cyan", + "Shulker_Box_Grey", + "Shulker_Box_Green", + "Shulker_Box_Light_Blue", + "Shulker_Box_Light_Green", + "Shulker_Box_Magenta", + "Shulker_Box_Orange", + "Shulker_Box_Pink", + "Shulker_Box_Purple", + "Shulker_Box_Red", + "Shulker_Box_Silver", + "Shulker_Box_White", + "Shulker_Box_Yellow" + ] + } + }, + { + "internalName": "shulker_top_overlay", + "displayName": "Shulker Box (Break Particles) (Overlay) (Unused)" + }, + { + "internalName": "cauldron_water", + "displayName": "Cauldron Water", + "allowCustomColour": true, + + "colourEntry": { + "defaultName": "Cauldron_Water", + "variants": [ + "Cauldron_Water", + "Effect_MovementSpeed", + "Effect_MovementSlowDown", + "Effect_DigSpeed", + "Effect_DigSlowdown", + "Effect_DamageBoost", + "Effect_Heal", + "Effect_Harm", + "Effect_Jump", + "Effect_Confusion", + "Effect_Regeneration", + "Effect_DamageResistance", + "Effect_FireResistance", + "Effect_WaterBreathing", + "Effect_Invisibility", + "Effect_Blindness", + "Effect_NightVision", + "Effect_Hunger", + "Effect_Weakness", + "Effect_Poison", + "Effect_Wither", + "Effect_HealthBoost", + "Effect_Absorption", + "Effect_Saturation", + "Effect_Levitation", + "Effect_Luck", + "Effect_BadLuck", + "Effect_TurtleMaster", + "Effect_SlowFall" + ] + } + }, + { + "internalName": "seagrass_doubletall_top", + "displayName": "Double Tall Seagrass (Top)" + }, + { + "internalName": "coral_blue", + "displayName": "Tube Coral Block" + }, + { + "internalName": "coral_purple", + "displayName": "Bubble Coral Block" + }, + { + "internalName": "coral_pink", + "displayName": "Brain Coral Block" + }, + { + "internalName": "coral_red", + "displayName": "Fire Coral Block" + }, + { + "internalName": "coral_yellow", + "displayName": "Horn Coral Block" + }, + { + "internalName": "coral_plant_blue", + "displayName": "Tube Coral" + }, + { + "internalName": "coral_plant_purple", + "displayName": "Bubble Coral" + }, + { + "internalName": "coral_plant_pink", + "displayName": "Brain Coral" + }, + { + "internalName": "coral_plant_red", + "displayName": "Fire Coral" + }, + { + "internalName": "coral_plant_yellow", + "displayName": "Horn Coral" + }, + { + "internalName": "sea_pickle", + "displayName": "Sea Pickle" + }, + { + "internalName": "blue_ice", + "displayName": "Blue Ice" + }, + { + "internalName": "dried_kelp_top", + "displayName": "Dried Kelp Block (Top)" + }, + { + "internalName": "dried_kelp_side", + "displayName": "Dried Kelp Block (Side)" + }, + { + "internalName": "seagrass_carried", + "displayName": "Seagrass (Item)" + }, + { + "internalName": "seagrass_doubletall_bottom", + "displayName": "Double Tall Seagrass (Bottom)" + }, + { + "internalName": "coral_blue_dead", + "displayName": "Dead Tube Coral Block" + }, + { + "internalName": "coral_purple_dead", + "displayName": "Dead Bubble Coral Block" + }, + { + "internalName": "coral_pink_dead", + "displayName": "Dead Brain Coral Block" + }, + { + "internalName": "coral_red_dead", + "displayName": "Dead Fire Coral Block" + }, + { + "internalName": "coral_yellow_dead", + "displayName": "Dead Horn Coral Block" + }, + { + "internalName": "coral_fan_blue", + "displayName": "Tube Coral Fan" + }, + { + "internalName": "coral_fan_purple", + "displayName": "Bubble Coral Fan" + }, + { + "internalName": "coral_fan_pink", + "displayName": "Brain Coral Fan" + }, + { + "internalName": "coral_fan_red", + "displayName": "Fire Coral Fan" + }, + { + "internalName": "coral_fan_yellow", + "displayName": "Horn Coral Fan" + }, + { + "internalName": "bamboo_stem", + "displayName": "Bamboo (Stem) [PS4 ONLY]" + }, + { + "internalName": "bamboo_leaf_small", + "displayName": "Bamboo (Small Leaves) [PS4 ONLY]" + }, + { + "internalName": "kelp_a", + "displayName": "Kelp (Bottom)" + }, + { + "internalName": "kelp_a", + "displayName": "" + }, + { + "internalName": "kelp_a", + "displayName": "" + }, + { + "internalName": "kelp_a", + "displayName": "" + }, + { + "internalName": "kelp_top_a", + "displayName": "Kelp (Top)" + }, + { + "internalName": "kelp_top_a", + "displayName": "" + }, + { + "internalName": "kelp_top_a", + "displayName": "" + }, + { + "internalName": "kelp_top_a", + "displayName": "" + }, + { + "internalName": "seagrass", + "displayName": "Seagrass" + }, + { + "internalName": "coral_fan_blue_dead", + "displayName": "Dead Tube Coral Fan" + }, + { + "internalName": "coral_fan_purple_dead", + "displayName": "Dead Bubble Coral Fan" + }, + { + "internalName": "coral_fan_pink_dead", + "displayName": "Dead Brain Coral Fan" + }, + { + "internalName": "coral_fan_red_dead", + "displayName": "Dead Fire Coral Fan" + }, + { + "internalName": "coral_fan_yellow_dead", + "displayName": "Dead Horn Coral Fan" + }, + { + "internalName": "bamboo_leaf", + "displayName": "Bamboo (Leaves) [PS4 ONLY]" + }, + { + "internalName": "spruce_trapdoor", + "displayName": "Spruce Trapdoor" + }, + { + "internalName": "stripped_log_oak", + "displayName": "Stripped Oak Log (Side)" + }, + { + "internalName": "stripped_log_oak_top", + "displayName": "Stripped Oak Log (Top)" + }, + { + "internalName": "stripped_log_acacia", + "displayName": "Stripped Acacia Log (Side)" + }, + { + "internalName": "stripped_log_acacia_top", + "displayName": "Stripped Acacia Log (Top)" + }, + { + "internalName": "stripped_log_birch", + "displayName": "Stripped Birch Log (Side)" + }, + { + "internalName": "stripped_log_birch_top", + "displayName": "Stripped Birch Log (Top)" + }, + { + "internalName": "stripped_log_dark_oak", + "displayName": "Stripped Dark Oak Log (Side)" + }, + { + "internalName": "stripped_log_dark_oak_top", + "displayName": "Stripped Dark Oak Log (Top)" + }, + { + "internalName": "stripped_log_jungle", + "displayName": "Stripped Jungle Log (Side)" + }, + { + "internalName": "stripped_log_jungle_top", + "displayName": "Stripped Birch Log (Top)" + }, + { + "internalName": "stripped_log_spruce", + "displayName": "Stripped Spruce Log (Side)" + }, + { + "internalName": "stripped_log_spruce_top", + "displayName": "Stripped Spruce Log (Top)" + }, + { + "internalName": "acacia_trapdoor", + "displayName": "Acacia Trapdoor" + }, + { + "internalName": "birch_trapdoor", + "displayName": "Birch Trapdoor" + }, + { + "internalName": "dark_oak_trapdoor", + "displayName": "Dark Oak Trapdoor" + }, + { + "internalName": "jungle_trapdoor", + "displayName": "Jungle Trapdoor" + }, + { + "internalName": "bamboo_sapling", + "displayName": "Bamboo Sapling [PS4 ONLY]" + }, + { + "internalName": "bamboo_singleleaf", + "displayName": "Bamboo (Single Leaf) [PS4 ONLY]" + }, + { + "internalName": "flower_lily_of_the_valley", + "displayName": "Lily of the Valley [PS4 ONLY]" + }, + { + "internalName": "flower_cornflower", + "displayName": "Cornflower [PS4 ONLY]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "berry_bush_sapling", + "displayName": "Sweet Berry Bush (Stage 1) [PS4 ONLY]" + }, + { + "internalName": "berry_bush_no_berries", + "displayName": "Sweet Berry Bush (Stage 2) [PS4 ONLY]" + }, + { + "internalName": "berry_bush_some_berries", + "displayName": "Sweet Berry Bush (Stage 3) [PS4 ONLY]" + }, + { + "internalName": "berry_bush_full_berries", + "displayName": "Sweet Berry Bush (Stage 4) [PS4 ONLY]" + }, + { + "internalName": "campfire_log", + "displayName": "Campfire (Log) [PS4 ONLY]" + }, + { + "internalName": "campfire_log_lit", + "displayName": "Campfire (Log) (Lit) [PS4 ONLY]" + }, + { + "internalName": "campfire_smoke", + "displayName": "Campfire (Smoke) [PS4 ONLY]" + }, + { + "internalName": "campfire", + "displayName": "Campfire (Flame) [PS4 ONLY]" + }, + { + "internalName": "scaffolding_side", + "displayName": "Scaffolding (Side) [PS4 ONLY]" + }, + { + "internalName": "scaffolding_bottom", + "displayName": "Scaffolding (Bottom) [PS4 ONLY]" + }, + { + "internalName": "scaffolding_top", + "displayName": "Scaffolding (Top) [PS4 ONLY]" + }, + { + "internalName": "barrel_side", + "displayName": "Barrel (Side) [PS4 ONLY]" + }, + { + "internalName": "barrel_top", + "displayName": "Barrel (Top) [PS4 ONLY]" + }, + { + "internalName": "barrel_bottom", + "displayName": "Barrel (Bottom) [PS4 ONLY]" + }, + { + "internalName": "bell_side", + "displayName": "Bell (Side) [PS4 ONLY]" + }, + { + "internalName": "bell_top", + "displayName": "Bell (Top) [PS4 ONLY]" + }, + { + "internalName": "bell_bottom", + "displayName": "Bell (Bottom) [PS4 ONLY]" + }, + { + "internalName": "lantern", + "displayName": "Lantern [PS4 ONLY]" + }, + { + "internalName": "jigsaw_side", + "displayName": "Jigsaw (Side) [PS4 ONLY]" + }, + { + "internalName": "jigsaw_top", + "displayName": "Jigsaw (Top) [PS4 ONLY]" + }, + { + "internalName": "blast_furnace_front", + "displayName": "Blast Furnace (Front) [PS4 ONLY]" + }, + { + "internalName": "blast_furnace_front_on", + "displayName": "Blast Furnace (Front) (Lit) [PS4 ONLY]" + }, + { + "internalName": "blast_furnace_side", + "displayName": "Blast Furnace (Side) [PS4 ONLY]" + }, + { + "internalName": "blast_furnace_top", + "displayName": "Blast Furnace (Top) [PS4 ONLY]" + }, + { + "internalName": "grindstone_side", + "displayName": "Grindstone (Side) [PS4 ONLY]" + }, + { + "internalName": "grindstone_round", + "displayName": "Grindstone (Round) [PS4 ONLY]" + }, + { + "internalName": "grindstone_pivot", + "displayName": "Grindstone (Pivot) [PS4 ONLY]" + }, + { + "internalName": "cartography_table_side1", + "displayName": "Cartography Table (Back) [PS4 ONLY]" + }, + { + "internalName": "cartography_table_side2", + "displayName": "Cartography Table (Right Side) [PS4 ONLY]" + }, + { + "internalName": "cartography_table_side3", + "displayName": "Cartography Table (Front and Left Side) [PS4 ONLY]" + }, + { + "internalName": "cartography_table_top", + "displayName": "Cartography Table (Top) [PS4 ONLY]" + }, + { + "internalName": "lectern_sides", + "displayName": "Lectern (Side) [PS4 ONLY]" + }, + { + "internalName": "lectern_front", + "displayName": "Lectern (Front) [PS4 ONLY]" + }, + { + "internalName": "lectern_base", + "displayName": "Lectern (Base) [PS4 ONLY]" + }, + { + "internalName": "lectern_top", + "displayName": "Lectern (Top) [PS4 ONLY]" + }, + { + "internalName": "loom_side", + "displayName": "Loom (Side) [PS4 ONLY]" + }, + { + "internalName": "loom_front", + "displayName": "Loom (Front) [PS4 ONLY]" + }, + { + "internalName": "loom_top", + "displayName": "Loom (Top) [PS4 ONLY]" + }, + { + "internalName": "loom_bottom", + "displayName": "Loom (Bottom) [PS4 ONLY]" + }, + { + "internalName": "smithing_table_side", + "displayName": "Smithing Table (Side) [PS4 ONLY]" + }, + { + "internalName": "smithing_table_front", + "displayName": "Smithing Table (Front) [PS4 ONLY]" + }, + { + "internalName": "smithing_table_top", + "displayName": "Smithing Table (Top) [PS4 ONLY]" + }, + { + "internalName": "composter_top", + "displayName": "Composter (Top) [PS4 ONLY]" + }, + { + "internalName": "fletcher_table_side2", + "displayName": "Fletching Table (Front and Back) [PS4 ONLY]" + }, + { + "internalName": "fletcher_table_side1", + "displayName": "Fletching Table (Side) [PS4 ONLY]" + }, + { + "internalName": "fletcher_table_top", + "displayName": "Fletching Table (Top) [PS4 ONLY]" + }, + { + "internalName": "stonecutter2_saw", + "displayName": "Stonecutter (Saw) [PS4 ONLY]" + }, + { + "internalName": "stonecutter2_side", + "displayName": "Stonecutter (Side) [PS4 ONLY]" + }, + { + "internalName": "stonecutter2_top", + "displayName": "Stonecutter (Top) [PS4 ONLY]" + }, + { + "internalName": "stonecutter2_bottom", + "displayName": "Stonecutter (Bottom) [PS4 ONLY]" + }, + { + "internalName": "smoker_side", + "displayName": "Smoker (Side) [PS4 ONLY]" + }, + { + "internalName": "smoker_front", + "displayName": "Smoker (Front) [PS4 ONLY]" + }, + { + "internalName": "smoker_front_on", + "displayName": "Smoker (Front) (Lit) [PS4 ONLY]" + }, + { + "internalName": "smoker_top", + "displayName": "Smoker (Top) [PS4 ONLY]" + }, + { + "internalName": "smoker_bottom", + "displayName": "Smoker (Bottom) [PS4 ONLY]" + }, + { + "internalName": "compost", + "displayName": "Compost [PS4 ONLY]" + }, + { + "internalName": "compost_ready", + "displayName": "Compost (Ready) [PS4 ONLY]" + }, + { + "internalName": "composter_bottom", + "displayName": "Composter (Bottom) [PS4 ONLY]" + }, + { + "internalName": "composter_side", + "displayName": "Composter (Side) [PS4 ONLY]" + }, + { + "internalName": "barrel_top_open", + "displayName": "Barrel (Top) (Open) [PS4 ONLY]" + }, + { + "internalName": "smithing_table_bottom", + "displayName": "Smithing Table (Bottom) [PS4 ONLY]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + } + ] +} diff --git a/PckStudio.Core/Resources/entityBehavioursData.json b/PckStudio.Core/Resources/entityBehavioursData.json new file mode 100644 index 00000000..921fe41f --- /dev/null +++ b/PckStudio.Core/Resources/entityBehavioursData.json @@ -0,0 +1,489 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "area_effect_cloud", + "displayName": "Area Effect Cloud / Particle" + }, + { + "internalName": "armor_stand", + "displayName": "Armor Stand" + }, + { + "internalName": "arrow", + "displayName": "Arrow" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze", + "displayName": "Blaze" + }, + { + "internalName": "boat", + "displayName": "Boat" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "cave_spider", + "displayName": "Cave Spider" + }, + { + "internalName": "chest_minecart", + "displayName": "Chest Minecart" + }, + { + "internalName": "chicken", + "displayName": "Chicken" + }, + { + "internalName": "cod", + "displayName": "Cod" + }, + { + "internalName": "commandblock_minecart", + "displayName": "Command Block Minecart" + }, + { + "internalName": "cow", + "displayName": "Cow" + }, + { + "internalName": "creeper", + "displayName": "Creeper" + }, + { + "internalName": "dolphin", + "displayName": "Dolphin" + }, + { + "internalName": "donkey", + "displayName": "Donkey" + }, + { + "internalName": "dragon_fireball", + "displayName": "Dragon Fireball" + }, + { + "internalName": "drowned", + "displayName": "Drowned" + }, + { + "internalName": "egg", + "displayName": "Thrown Egg" + }, + { + "internalName": "elder_guardian", + "displayName": "Elder Guardian" + }, + { + "internalName": "ender_crystal", + "displayName": "End Crystal" + }, + { + "internalName": "ender_dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "ender_pearl", + "displayName": "Thrown Ender Pearl" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "endermite", + "displayName": "Endermite" + }, + { + "internalName": "evocation_illager", + "displayName": "Evoker" + }, + { + "internalName": "evocation_fangs", + "displayName": "Evoker Fangs" + }, + { + "internalName": "xp_bottle", + "displayName": "Thrown Bottle O' Enchanting" + }, + { + "internalName": "xp_orb", + "displayName": "Experience Orb" + }, + { + "internalName": "eye_of_ender_signal", + "displayName": "Thrown Eye of Ender" + }, + { + "internalName": "falling_block", + "displayName": "Falling Block" + }, + { + "internalName": "fireball", + "displayName": "Fireball" + }, + { + "internalName": "fireworks_rocket", + "displayName": "Firework Rocket" + }, + { + "internalName": "furnace_minecart", + "displayName": "Furnace Minecart" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "giant", + "displayName": "Giant" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "hopper_minecart", + "displayName": "Hopper Minecart" + }, + { + "internalName": "horse", + "displayName": "Horse" + }, + { + "internalName": "husk", + "displayName": "Husk" + }, + { + "internalName": "villager_golem", + "displayName": "Iron Golem" + }, + { + "internalName": "item", + "displayName": "Dropped Item" + }, + { + "internalName": "item_frame", + "displayName": "Item Frame" + }, + { + "internalName": "leash_knot", + "displayName": "Lead Knot" + }, + { + "internalName": "llama", + "displayName": "Llama" + }, + { + "internalName": "llama_spit", + "displayName": "Llama Spit" + }, + { + "internalName": "magma_cube", + "displayName": "Magma Cube" + }, + { + "internalName": "minecart", + "displayName": "Minecart" + }, + { + "internalName": "mooshroom", + "displayName": "Mooshroom" + }, + { + "internalName": "mule", + "displayName": "Mule" + }, + { + "internalName": "ocelot", + "displayName": "Ocelot" + }, + { + "internalName": "painting", + "displayName": "Painting" + }, + { + "internalName": "panda", + "displayName": "Panda [PS4 EXCLUSIVE]" + }, + { + "internalName": "parrot", + "displayName": "Parrot" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "pig", + "displayName": "Pig" + }, + { + "internalName": "pillager", + "displayName": "Pillager [PS4 EXCLUSIVE]" + }, + { + "internalName": "polar_bear", + "displayName": "Polar Bear" + }, + { + "internalName": "potion", + "displayName": "Thrown Potion" + }, + { + "internalName": "pufferfish", + "displayName": "Pufferfish" + }, + { + "internalName": "rabbit", + "displayName": "Rabbit" + }, + { + "internalName": "ravager", + "displayName": "Ravager [PS4 EXCLUSIVE]" + }, + { + "internalName": "salmon", + "displayName": "Salmon" + }, + { + "internalName": "sheep", + "displayName": "Sheep" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "shulker_bullet", + "displayName": "Shulker Bullet" + }, + { + "internalName": "silverfish", + "displayName": "Silverfish" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "skeleton_horse", + "displayName": "Skeleton Horse" + }, + { + "internalName": "slime", + "displayName": "Slime" + }, + { + "internalName": "small_fireball", + "displayName": "Small Fireball" + }, + { + "internalName": "snowman", + "displayName": "Snow Golem" + }, + { + "internalName": "snowball", + "displayName": "Thrown Snowball" + }, + { + "internalName": "spawner_minecart", + "displayName": "Spawner Minecart" + }, + { + "internalName": "spectral_arrow", + "displayName": "Spectral Arrow" + }, + { + "internalName": "spider", + "displayName": "Spider" + }, + { + "internalName": "squid", + "displayName": "Squid" + }, + { + "internalName": "stray", + "displayName": "Stray" + }, + { + "internalName": "tnt", + "displayName": "Primed TNT" + }, + { + "internalName": "tnt_minecart", + "displayName": "TNT Minecart" + }, + { + "internalName": "trident", + "displayName": "Thrown Trident" + }, + { + "internalName": "tropical_fish", + "displayName": "Tropical Fish" + }, + { + "internalName": "turtle", + "displayName": "Turtle" + }, + { + "internalName": "vex", + "displayName": "Vex" + }, + { + "internalName": "villager", + "displayName": "Villager" + }, + { + "internalName": "vindication_illager", + "displayName": "Vindicator" + }, + { + "internalName": "wandering_trader", + "displayName": "Wandering Trader [PS4 EXCLUSIVE]" + }, + { + "internalName": "witch", + "displayName": "Witch" + }, + { + "internalName": "wither", + "displayName": "Wither" + }, + { + "internalName": "wither_skeleton", + "displayName": "Wither Skeleton" + }, + { + "internalName": "wither_skull", + "displayName": "Wither Skull" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "zombie", + "displayName": "Zombie" + }, + { + "internalName": "zombie_horse", + "displayName": "Zombie Horse" + }, + { + "internalName": "zombie_pigman", + "displayName": "Zombie Pigman" + }, + { + "internalName": "zombie_villager", + "displayName": "Zombie Villager" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "illusion_illager", + "displayName": "Illusioner" + } + ] +} diff --git a/PckStudio.Core/Resources/entityMaterialsData.json b/PckStudio.Core/Resources/entityMaterialsData.json new file mode 100644 index 00000000..259a077b --- /dev/null +++ b/PckStudio.Core/Resources/entityMaterialsData.json @@ -0,0 +1,485 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze_head", + "displayName": "Blaze" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "drowned", + "displayName": "Drowned" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ender_dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "iron_golem", + "displayName": "Iron Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "magma_cube", + "displayName": "Magma Cube" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "sheep", + "displayName": "Sheep" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "stray", + "displayName": "Stray" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "wither_boss", + "displayName": "Wither" + }, + { + "internalName": "wither_skeleton", + "displayName": "Wither Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie_pigman", + "displayName": "Zombie Pigman" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "villager", + "displayName": "Villager [PS4 EXCLUSIVE]" + }, + { + "internalName": "zombie_villager", + "displayName": "Zombie Villager [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "phantom_invisible", + "displayName": "Phantom (Overlay)" + }, + { + "internalName": "enderman_invisible", + "displayName": "Enderman (Overlay)" + }, + { + "internalName": "spider_invisible", + "displayName": "Spiders (Overlay)" + }, + { + "internalName": "spider", + "displayName": "Spiders" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + } + ] +} diff --git a/PckStudio.Core/Resources/entityModelsData.json b/PckStudio.Core/Resources/entityModelsData.json new file mode 100644 index 00000000..647be99b --- /dev/null +++ b/PckStudio.Core/Resources/entityModelsData.json @@ -0,0 +1,485 @@ +{ + "COMMENT": "Entity data research by NessieHax (Miku-666) and MattNL", + "entries": [ + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "bat", + "displayName": "Bat" + }, + { + "internalName": "blaze", + "displayName": "Blaze" + }, + { + "internalName": "boat", + "displayName": "Boat" + }, + { + "internalName": "cat", + "displayName": "Cat [PS4 EXCLUSIVE]" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "chicken", + "displayName": "Chicken" + }, + { + "internalName": "cod", + "displayName": "Cod" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "cow", + "displayName": "Cow" + }, + { + "internalName": "creeper", + "displayName": "Creeper" + }, + { + "internalName": "dolphin", + "displayName": "Dolphin" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie.drowned", + "displayName": "Drowned" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "dragon", + "displayName": "Ender Dragon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "enderman", + "displayName": "Enderman" + }, + { + "internalName": "endermite", + "displayName": "Endermite" + }, + { + "internalName": "evoker", + "displayName": "Evoker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ghast", + "displayName": "Ghast" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "zombie.husk", + "displayName": "Husk" + }, + { + "internalName": "irongolem", + "displayName": "Iron Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "llama", + "displayName": "Llama" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "lavaslime", + "displayName": "Magma Cube" + }, + { + "internalName": "minecart", + "displayName": "Minecart" + }, + { + "internalName": "mooshroom", + "displayName": "Mooshroom" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "ocelot", + "displayName": "Ocelot" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "panda", + "displayName": "Panda [PS4 EXCLUSIVE]" + }, + { + "internalName": "parrot", + "displayName": "Parrot" + }, + { + "internalName": "phantom", + "displayName": "Phantom" + }, + { + "internalName": "pig", + "displayName": "Pig" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "polarbear", + "displayName": "Polar Bear" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "pufferfish.large", + "displayName": "Pufferfish (Large)" + }, + { + "internalName": "rabbit", + "displayName": "Rabbit" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "salmon", + "displayName": "Salmon" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "shulker", + "displayName": "Shulker" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "silverfish", + "displayName": "Silverfish" + }, + { + "internalName": "skeleton", + "displayName": "Skeleton" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "snowgolem", + "displayName": "Snow Golem" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "squid", + "displayName": "Squid" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "trident", + "displayName": "Thrown Trident" + }, + { + "internalName": "tropicalfish_a", + "displayName": "Tropical Fish (Small)" + }, + { + "internalName": "turtle", + "displayName": "Turtle" + }, + { + "internalName": "vex", + "displayName": "Vex" + }, + { + "internalName": "villager", + "displayName": "Villager" + }, + { + "internalName": "vindicator", + "displayName": "Vindicator/Illusioner" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "witch", + "displayName": "Witch" + }, + { + "internalName": "witherboss", + "displayName": "Wither" + }, + { + "internalName": "skeleton.wither", + "displayName": "Wither Skeleton" + }, + { + "internalName": "witherboss.armor", + "displayName": "Wither (Armor)" + }, + { + "internalName": "wolf", + "displayName": "Wolf" + }, + { + "internalName": "zombie", + "displayName": "Zombie" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "pigzombie", + "displayName": "Zombie Pigman" + }, + { + "internalName": "zombie.villager", + "displayName": "Zombie Villager" + }, + { + "internalName": "skeleton_head", + "displayName": "Skeleton Skull" + }, + { + "internalName": "skeleton_wither_head", + "displayName": "Wither Skeleton Skull" + }, + { + "internalName": "zombie_head", + "displayName": "Zombie Head" + }, + { + "internalName": "creeper_head", + "displayName": "Creeper Head" + }, + { + "internalName": "dragon_head", + "displayName": "Ender Dragon Head" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "spider", + "displayName": "Spider" + }, + { + "internalName": "bed", + "displayName": "Bed" + }, + { + "internalName": "guardian", + "displayName": "Guardian" + }, + { + "internalName": "horse.v2", + "displayName": "Horse/Donkey/Mule" + }, + { + "internalName": "pufferfish.small", + "displayName": "Pufferfish (Small)" + }, + { + "internalName": "pufferfish.mid", + "displayName": "Pufferfish (Medium)" + }, + { + "internalName": "sheep.sheared", + "displayName": "Sheep (Without Fur)" + }, + { + "internalName": "sheep", + "displayName": "Sheep (Fur Only)" + }, + { + "internalName": "slime", + "displayName": "Slime (Inner)" + }, + { + "internalName": "slime.armor", + "displayName": "Slime (Outer)" + }, + { + "internalName": "skeleton.stray", + "displayName": "Stray" + }, + { + "internalName": "stray.armor", + "displayName": "Stray (Overlay)" + }, + { + "internalName": "tropicalfish_b", + "displayName": "Tropical Fish (Large)" + } + ] +} diff --git a/PckStudio.Core/Resources/experienceOrbData.json b/PckStudio.Core/Resources/experienceOrbData.json new file mode 100644 index 00000000..f83a7ab3 --- /dev/null +++ b/PckStudio.Core/Resources/experienceOrbData.json @@ -0,0 +1,124 @@ +{ + "COMMENT_1": "JSON by MattNL", + "entries": [ + { + "internalName": "experience_orb_0", + "displayName": "Experience Orb (Size 1)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_1", + "displayName": "Experience Orb (Size 2)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_2", + "displayName": "Experience Orb (Size 3)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_3", + "displayName": "Experience Orb (Size 4)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_4", + "displayName": "Experience Orb (Size 5)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_5", + "displayName": "Experience Orb (Size 6)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_6", + "displayName": "Experience Orb (Size 7)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_7", + "displayName": "Experience Orb (Size 8)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_8", + "displayName": "Experience Orb (Size 9)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_9", + "displayName": "Experience Orb (Size 10)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "experience_orb_10", + "displayName": "Experience Orb (Size 11)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "experience_orb", + "variants": ["experience_orb"] + } + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + } + ] +} \ No newline at end of file diff --git a/PckStudio.Core/Resources/experience_orbs.png b/PckStudio.Core/Resources/experience_orbs.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2d58a36c8a49b5c5c86ae387325467fb74e82a GIT binary patch literal 583 zcmV-N0=WH&P)Px#1ZP1_K>z@;j|==^1poj57*I@9MR0I%prD|^!NLFk|Np?i|B#UXY-|7k0D?BJ z)c^nh2y{|TQ~&?}|NsC00N#VWSpWb432;bRa{vGi!vFvd!vV){sAK>D0i;PpK~z{r z-Ia@O!ypVrNhs|9|9J8f0}hP2lcri~rQ_H)30#Nt6^t|{PUB|+3BzSyU}#7eh9)et z%(5X}H-;oSCKc>Zg>+$sC`i310Oy=DF{iFpFBN*nz5y99XDa{=RzR;m3A|o!7Kpw= zbP>bbIK^7fG14vu!M&9a;=c+k-g#vH?+ct&w?^ZAG`lc4u``nAgJyO7jougboTuf@ z%6&rnMM3)2yLcIf2^%mY2^PR%YvYDoiZb>i=bHptK@+eIch05O0*|2OwQ|E-1j4Tn zUBvJ*F2Dtv{z@SD3c*E;Ze!R;o^?lFTiG9;kr%_Hg6;B-ZMeykc$2{R zga=G(V7BFy;jc5sDNoisl?#9LK+#h56N_`LSxuk2__YgcRB)zm=9B3oBZF9*MH8h4`A29W&${I!WE7 zT}({Q`E|y6*cl;O`B5yYm9Z6%bdl5jea}75Jf4(RBdueN+Gynk5 z_VIQP*mUrV)Kxd9@DN43X|PzrQ33!o7HY0hwruY3Wbe=v0MP0AA_&sb7u*a{RF4p9 zU{VbABIQCfK%{(oj%wrY5oAK&XX9YA*VcCV!c73!((mI=2x5dUR7#nXCR*8w^@vn* zOG23+#IN^(|H!&^_luHb?}>$Zzf4mT=zrh=Upu&tEdAKZ=W97V8GKZ{cvjN0PrD%= zhwFM!iB&=8&u9I9M*1V%$|0or8%`4VOF3dZhS<_chNo*$%CD$Wx4P<9d+@~Zhun_m-n;?tRnHTeb zk#J7~^xE3=JX{cS5ZwQr2H3aI>!1sXs}PBn;)sA@Pj(}Em2f*^lwofP5NsGTYNaH= zMd_;6SxiA|--aqf04q_GY&@Hzb2G85rvrZ&K~kof-mix?I04>YvmB=I z7kSHgtwb}D44>fDk?Hg{cD`Q5v|{)VwvvHPOgXbI{}YU^SgJt$VV(8nTMor5Y@OOK63^RiOgt5 zq#rR5ZJs1Or@C`+>J;E$3>iZ8b8t4D{g-A|PT?WSsoy_G1RelhsV=$rhQ0=xWYU>j zPGV@(8^iH~fgfBHJm+GlZObQe(wxhY*TGI3e(fo#))+~B&45 z+Ev4L9SCh)FT+4Qb&>b!#bZ>=eB&wDfew$ow^Rhbh<^&dZ=K3MZ_Sw1v7gI9&E%j< z-?J9?>8-H}K)z>RPO9DLiw?Kp9M6i4u|FjRwz#`=d(C?nrB8N)46IO^;P%=8TQZX@ z-YBTV-VxVsYhV(CTd3dvQ>t`F$gV?&CLOV0>~Ke?(jQtbM5acf`j2N22khH5|OK=)G5i4!em<3jj`XHe;~mH@9^b`ZuHAT zo>gr%zUtH+<@}M%Mrieh#?=e9zIN=hNhD3roOgY-`diU(u}rLX~DJ zK29sCuFpOh1*)dgK-k-0DDmCStEc;F=b{y++rbZB0*z_nAJ7Inxa-mh$=QXwdoWXr ziBU*p{6=p+7wH_(zR_tAjZ?)T9o9Ko1mx0?_5M-t{V|i{Y9+-Vi!q1&hl7&{td-!% zE9e0^LcDrhitOe-%DG#K<2-BFVMFgTsrmWl#BCMc#JHrxHbN3a?XXB*(S?s>#j#K+ zwbwJl?V%+`LVWaAKdz3aQ2vzsQ|3t*jj~Q!2pBuh$MBb{Z+NBP=T~~W6Q}n)K%E)P zO@An1Un%TqqM9ZYptGymWo<_J&GDW)jA_olNL5cZ46Fi)n7|N<`fj^&^Y#qC3HF;V Z$m;k?%+b7l&&}Tt_;~oc*Sno&{tX%$*XaNN literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/explosionData.json b/PckStudio.Core/Resources/explosionData.json new file mode 100644 index 00000000..f9845f7e --- /dev/null +++ b/PckStudio.Core/Resources/explosionData.json @@ -0,0 +1,197 @@ +{ + "COMMENT_1": "JSON by MattNL", + "entries": [ + { + "internalName": "explosion_0", + "displayName": "Explosion (Stage 1)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_1", + "displayName": "Explosion (Stage 2)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_2", + "displayName": "Explosion (Stage 3)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_3", + "displayName": "Explosion (Stage 4)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_4", + "displayName": "Explosion (Stage 5)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_5", + "displayName": "Explosion (Stage 6)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_6", + "displayName": "Explosion (Stage 7)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_7", + "displayName": "Explosion (Stage 8)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_8", + "displayName": "Explosion (Stage 9)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_9", + "displayName": "Explosion (Stage 10)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_10", + "displayName": "Explosion (Stage 11)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_11", + "displayName": "Explosion (Stage 12)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_12", + "displayName": "Explosion (Stage 13)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_13", + "displayName": "Explosion (Stage 14)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_14", + "displayName": "Explosion (Stage 15)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + }, + { + "internalName": "explosion_15", + "displayName": "Explosion (Stage 16)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Particle_Explode", + "variants": [ + "Particle_Explode", + "Particle_HugeExplosion" + ] + } + } + ] +} \ No newline at end of file diff --git a/PckStudio.Core/Resources/itemData.json b/PckStudio.Core/Resources/itemData.json new file mode 100644 index 00000000..51c380b7 --- /dev/null +++ b/PckStudio.Core/Resources/itemData.json @@ -0,0 +1,1361 @@ +{ + "COMMENT_1": "Tile data research by MattNL", + "COMMENT_2": "JSON by PhoenixARC, MattNL, and NessieHax (Miku-666)", + "entries": [ + { + "internalName": "helmetCloth", + "displayName": "Leather Cap", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Armour_Default_Leather_Colour", + "variants": [ "Armour_Default_Leather_Colour" ] + } + }, + { + "internalName": "helmetChain", + "displayName": "Chain Helmet" + }, + { + "internalName": "helmetIron", + "displayName": "Iron Helmet" + }, + { + "internalName": "helmetDiamond", + "displayName": "Diamond Helmet" + }, + { + "internalName": "helmetGold", + "displayName": "Golden Helmet" + }, + { + "internalName": "flintAndSteel", + "displayName": "Flint and Steel" + }, + { + "internalName": "flint", + "displayName": "Flint" + }, + { + "internalName": "coal", + "displayName": "Coal" + }, + { + "internalName": "string", + "displayName": "String" + }, + { + "internalName": "seeds", + "displayName": "Seeds" + }, + { + "internalName": "apple", + "displayName": "Apple" + }, + { + "internalName": "appleGold", + "displayName": "Golden Apple" + }, + { + "internalName": "egg", + "displayName": "Egg" + }, + { + "internalName": "sugar", + "displayName": "Sugar" + }, + { + "internalName": "snowball", + "displayName": "Snowball" + }, + { + "internalName": "elytra", + "displayName": "Elytra" + }, + { + "internalName": "chestplateCloth", + "displayName": "Leather Tunic", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Armour_Default_Leather_Colour", + "variants": [ "Armour_Default_Leather_Colour" ] + } + }, + { + "internalName": "chestplateChain", + "displayName": "Chain Chestplate" + }, + { + "internalName": "chestplateIron", + "displayName": "Iron Chestplate" + }, + { + "internalName": "chestplateDiamond", + "displayName": "Diamond Chestplate" + }, + { + "internalName": "chestplateGold", + "displayName": "Golden Chestplate" + }, + { + "internalName": "bow", + "displayName": "Bow" + }, + { + "internalName": "brick", + "displayName": "Brick" + }, + { + "internalName": "ingotIron", + "displayName": "Iron Ingot" + }, + { + "internalName": "feather", + "displayName": "Feather" + }, + { + "internalName": "wheat", + "displayName": "Wheat" + }, + { + "internalName": "painting", + "displayName": "Painting" + }, + { + "internalName": "reeds", + "displayName": "Sugar Canes" + }, + { + "internalName": "bone", + "displayName": "Bone" + }, + { + "internalName": "cake", + "displayName": "Cake" + }, + { + "internalName": "slimeball", + "displayName": "Slimeball" + }, + { + "internalName": "broken_elytra", + "displayName": "Elytra (Broken)" + }, + { + "internalName": "leggingsCloth", + "displayName": "Leather Pants", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Armour_Default_Leather_Colour", + "variants": [ "Armour_Default_Leather_Colour" ] + } + }, + { + "internalName": "leggingsChain", + "displayName": "Chain Leggings" + }, + { + "internalName": "leggingsIron", + "displayName": "Iron Leggings" + }, + { + "internalName": "leggingsDiamond", + "displayName": "Diamond Leggings" + }, + { + "internalName": "leggingsGold", + "displayName": "Golden Leggings" + }, + { + "internalName": "arrow", + "displayName": "Arrow" + }, + { + "internalName": "end_crystal", + "displayName": "End Crystal" + }, + { + "internalName": "ingotGold", + "displayName": "Gold Ingot" + }, + { + "internalName": "sulphur", + "displayName": "Gunpowder" + }, + { + "internalName": "bread", + "displayName": "Bread" + }, + { + "internalName": "sign", + "displayName": "Oak Sign" + }, + { + "internalName": "doorWood", + "displayName": "Oak Door" + }, + { + "internalName": "doorIron", + "displayName": "Iron Door" + }, + { + "internalName": "bed", + "displayName": "Bed" + }, + { + "internalName": "fireball", + "displayName": "Fire Charge" + }, + { + "internalName": "chorus_fruit", + "displayName": "Chorus Fruit" + }, + { + "internalName": "bootsCloth", + "displayName": "Leather Boots", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Armour_Default_Leather_Colour", + "variants": [ "Armour_Default_Leather_Colour" ] + } + }, + { + "internalName": "bootsChain", + "displayName": "Chain Boots" + }, + { + "internalName": "bootsIron", + "displayName": "Iron Boots" + }, + { + "internalName": "bootsDiamond", + "displayName": "Diamond Boots" + }, + { + "internalName": "bootsGold", + "displayName": "Golden Boots" + }, + { + "internalName": "stick", + "displayName": "Stick" + }, + { + "internalName": "compass", + "displayName": "Compass" + }, + { + "internalName": "diamond", + "displayName": "Diamond" + }, + { + "internalName": "redstone", + "displayName": "Redstone" + }, + { + "internalName": "clay", + "displayName": "Clay" + }, + { + "internalName": "paper", + "displayName": "Paper" + }, + { + "internalName": "book", + "displayName": "Book" + }, + { + "internalName": "map", + "displayName": "Map" + }, + { + "internalName": "seeds_pumpkin", + "displayName": "Pumpkin Seeds" + }, + { + "internalName": "seeds_melon", + "displayName": "Melon Seeds" + }, + { + "internalName": "chorus_fruit_popped", + "displayName": "Popped Chorus Fruit" + }, + { + "internalName": "swordWood", + "displayName": "Wooden Sword" + }, + { + "internalName": "swordStone", + "displayName": "Stone Sword" + }, + { + "internalName": "swordIron", + "displayName": "Iron Sword" + }, + { + "internalName": "swordDiamond", + "displayName": "Diamond Sword" + }, + { + "internalName": "swordGold", + "displayName": "Golden Sword" + }, + { + "internalName": "fishingRod_uncast", + "displayName": "Fishing Rod" + }, + { + "internalName": "clock", + "displayName": "Clock" + }, + { + "internalName": "bowl", + "displayName": "Bowl" + }, + { + "internalName": "mushroomStew", + "displayName": "Mushroom Stew" + }, + { + "internalName": "yellowDust", + "displayName": "Glowstone Dust" + }, + { + "internalName": "bucket", + "displayName": "Bucket" + }, + { + "internalName": "bucketWater", + "displayName": "Water Bucket" + }, + { + "internalName": "bucketLava", + "displayName": "Lava Bucket" + }, + { + "internalName": "milk", + "displayName": "Milk Bucket" + }, + { + "internalName": "dyePowder_black", + "displayName": "Ink Sac" + }, + { + "internalName": "dyePowder_gray", + "displayName": "Gray Dye" + }, + { + "internalName": "shovelWood", + "displayName": "Wooden Shovel" + }, + { + "internalName": "shovelStone", + "displayName": "Stone Shovel" + }, + { + "internalName": "shovelIron", + "displayName": "Iron Shovel" + }, + { + "internalName": "shovelDiamond", + "displayName": "Diamond Shovel" + }, + { + "internalName": "shovelGold", + "displayName": "Golden Shovel" + }, + { + "internalName": "fishingRod_cast", + "displayName": "Fishing Rod (Cast)" + }, + { + "internalName": "diode", + "displayName": "Redstone Repeater" + }, + { + "internalName": "porkchopRaw", + "displayName": "Raw Porkchop" + }, + { + "internalName": "porkchopCooked", + "displayName": "Cooked Porkchop" + }, + { + "internalName": "fishRaw", + "displayName": "Raw Cod" + }, + { + "internalName": "fishCooked", + "displayName": "Cooked Cod" + }, + { + "internalName": "rottenFlesh", + "displayName": "Rotten Flesh" + }, + { + "internalName": "cookie", + "displayName": "Cookie" + }, + { + "internalName": "shears", + "displayName": "Shears" + }, + { + "internalName": "dyePowder_red", + "displayName": "Rose Red" + }, + { + "internalName": "dyePowder_pink", + "displayName": "Pink Dye" + }, + { + "internalName": "pickaxeWood", + "displayName": "Wooden Pickaxe" + }, + { + "internalName": "pickaxeStone", + "displayName": "Stone Pickaxe" + }, + { + "internalName": "pickaxeIron", + "displayName": "Iron Pickaxe" + }, + { + "internalName": "pickaxeDiamond", + "displayName": "Diamond Pickaxe" + }, + { + "internalName": "pickaxeGold", + "displayName": "Golden Pickaxe" + }, + { + "internalName": "bow_pull_0", + "displayName": "Bow (Pulling Stage 1)" + }, + { + "internalName": "carrotOnAStick", + "displayName": "Carrot on a Stick" + }, + { + "internalName": "leather", + "displayName": "Leather" + }, + { + "internalName": "saddle", + "displayName": "Saddle" + }, + { + "internalName": "beefRaw", + "displayName": "Raw Beef" + }, + { + "internalName": "beefCooked", + "displayName": "Steak" + }, + { + "internalName": "enderPearl", + "displayName": "Ender Pearl" + }, + { + "internalName": "blazeRod", + "displayName": "Blaze Rod" + }, + { + "internalName": "melon", + "displayName": "Melon Slice" + }, + { + "internalName": "dyePowder_green", + "displayName": "Cactus Green" + }, + { + "internalName": "dyePowder_lime", + "displayName": "Lime Dye" + }, + { + "internalName": "hatchetWood", + "displayName": "Wooden Axe" + }, + { + "internalName": "hatchetStone", + "displayName": "Stone Axe" + }, + { + "internalName": "hatchetIron", + "displayName": "Iron Axe" + }, + { + "internalName": "hatchetDiamond", + "displayName": "Diamond Axe" + }, + { + "internalName": "hatchetGold", + "displayName": "Golden Axe" + }, + { + "internalName": "bow_pull_1", + "displayName": "Bow (Pulling Stage 2)" + }, + { + "internalName": "potatoBaked", + "displayName": "Baked Potato" + }, + { + "internalName": "potato", + "displayName": "Potato" + }, + { + "internalName": "carrots", + "displayName": "Carrot" + }, + { + "internalName": "chickenRaw", + "displayName": "Raw Chicken" + }, + { + "internalName": "chickenCooked", + "displayName": "Cooked Chicken" + }, + { + "internalName": "ghastTear", + "displayName": "Ghast Tear" + }, + { + "internalName": "goldNugget", + "displayName": "Gold Nugget" + }, + { + "internalName": "netherStalkSeeds", + "displayName": "Nether Wart" + }, + { + "internalName": "dyePowder_brown", + "displayName": "Cocoa Beans" + }, + { + "internalName": "dyePowder_yellow", + "displayName": "Dandelion Yellow" + }, + { + "internalName": "hoeWood", + "displayName": "Wooden Hoe" + }, + { + "internalName": "hoeStone", + "displayName": "Stone Hoe" + }, + { + "internalName": "hoeIron", + "displayName": "Iron Hoe" + }, + { + "internalName": "hoeDiamond", + "displayName": "Diamond Hoe" + }, + { + "internalName": "hoeGold", + "displayName": "Golden Hoe" + }, + { + "internalName": "bow_pull_2", + "displayName": "Bow (Pulling Stage 3)" + }, + { + "internalName": "potatoPoisonous", + "displayName": "Poisonous Potato" + }, + { + "internalName": "minecart", + "displayName": "Minecart" + }, + { + "internalName": "boat", + "displayName": "Oak Boat" + }, + { + "internalName": "speckledMelon", + "displayName": "Glistering Melon" + }, + { + "internalName": "fermentedSpiderEye", + "displayName": "Fermented Spider Eye" + }, + { + "internalName": "spiderEye", + "displayName": "Spider Eye" + }, + { + "internalName": "glassBottle", + "displayName": "Glass Bottle" + }, + { + "internalName": "potion_contents", + "displayName": "Potion (Overlay)", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Potion_BaseColour", + "variants": [ + "Potion_BaseColour", + "Effect_MovementSpeed", + "Effect_MovementSlowDown", + "Effect_DigSpeed", + "Effect_DigSlowdown", + "Effect_DamageBoost", + "Effect_Heal", + "Effect_Harm", + "Effect_Jump", + "Effect_Confusion", + "Effect_Regeneration", + "Effect_DamageResistance", + "Effect_FireResistance", + "Effect_WaterBreathing", + "Effect_Invisibility", + "Effect_Blindness", + "Effect_NightVision", + "Effect_Hunger", + "Effect_Weakness", + "Effect_Poison", + "Effect_Wither", + "Effect_HealthBoost", + "Effect_Absorption", + "Effect_Saturation", + "Effect_Levitation", + "Effect_Luck", + "Effect_BadLuck", + "Effect_TurtleMaster", + "Effect_SlowFall" + ] + } + }, + { + "internalName": "dyePowder_blue", + "displayName": "Lapis Lazuli" + }, + { + "internalName": "dyePowder_light_blue", + "displayName": "Light Blue Dye" + }, + { + "internalName": "helmetCloth_overlay", + "displayName": "Leather Cap (Overlay)" + }, + { + "internalName": "spectral_arrow", + "displayName": "Spectral Arrow" + }, + { + "internalName": "iron_horse_armor", + "displayName": "Iron Horse Armor" + }, + { + "internalName": "diamond_horse_armor", + "displayName": "Diamond Horse Armor" + }, + { + "internalName": "gold_horse_armor", + "displayName": "Gold Horse Armor" + }, + { + "internalName": "comparator", + "displayName": "Redstone Comparator" + }, + { + "internalName": "carrotGolden", + "displayName": "Golden Carrot" + }, + { + "internalName": "minecart_chest", + "displayName": "Minecart with Chest" + }, + { + "internalName": "pumpkinPie", + "displayName": "Pumpkin Pie" + }, + { + "internalName": "monsterPlacer", + "displayName": "Spawn Egg", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Mob_Creeper_Colour1", + "variants": [ + "Mob_Creeper_Colour1", + "Mob_Skeleton_Colour1", + "Mob_Spider_Colour1", + "Mob_Zombie_Colour1", + "Mob_Slime_Colour1", + "Mob_Ghast_Colour1", + "Mob_PigZombie_Colour1", + "Mob_Enderman_Colour1", + "Mob_CaveSpider_Colour1", + "Mob_Silverfish_Colour1", + "Mob_Blaze_Colour1", + "Mob_LavaSlime_Colour1", + "Mob_Pig_Colour1", + "Mob_Sheep_Colour1", + "Mob_Cow_Colour1", + "Mob_Chicken_Colour1", + "Mob_Squid_Colour1", + "Mob_Wolf_Colour1", + "Mob_MushroomCow_Colour1", + "Mob_Ocelot_Colour1", + "Mob_Villager_Colour1", + "Mob_Bat_Colour1", + "Mob_Witch_Colour1", + "Mob_Horse_Colour1", + "Mob_Endermite_Color1", + "Mob_Guardian_Color1", + "Mob_Rabbit_Colour1", + "Mob_PolarBear_Colour1", + "Mob_Shulker_Colour1", + "Mob_Elder_Guardian_Colour1", + "Mob_Evocation_Illager_Colour1", + "Mob_Llama_Colour1", + "Mob_Donkey_Colour1", + "Mob_Skeleton_Horse_Colour1", + "Mob_Zombie_Horse_Colour1", + "Mob_Mule_Colour1", + "Mob_Stray_Colour1", + "Mob_Husk_Colour1", + "Mob_Vex_Colour1", + "Mob_Vindication_Illager_Colour1", + "Mob_Zombie_Villager_Colour1", + "Mob_Parrot_Colour1", + "Mob_Wither_Skeleton_Colour1", + "Mob_Turtle_Colour1", + "Mob_Tropical_Colour1", + "Mob_Cod_Colour1", + "Mob_Pufferfish_Colour1", + "Mob_Salmon_Colour1", + "Mob_Drowned_Colour1", + "Mob_Dolphin_Colour1", + "Mob_Phantom_Colour1" + ] + } + }, + { + "internalName": "potion_splash", + "displayName": "Splash Potion" + }, + { + "internalName": "eyeOfEnder", + "displayName": "Eye of Ender" + }, + { + "internalName": "cauldron", + "displayName": "Cauldron" + }, + { + "internalName": "blazePowder", + "displayName": "Blaze Powder" + }, + { + "internalName": "dyePowder_purple", + "displayName": "Purple Dye" + }, + { + "internalName": "dyePowder_magenta", + "displayName": "Magenta Dye" + }, + { + "internalName": "chestplateCloth_overlay", + "displayName": "Leather Tunic (Overlay)" + }, + { + "internalName": "tipped_arrow_base", + "displayName": "Tipped Arrow" + }, + { + "internalName": "dragon_breath", + "displayName": "Dragon's Breath" + }, + { + "internalName": "name_tag", + "displayName": "Name Tag" + }, + { + "internalName": "lead", + "displayName": "Lead" + }, + { + "internalName": "netherbrick", + "displayName": "Nether Brick" + }, + { + "internalName": "fish_clownfish_raw", + "displayName": "Tropical Fish" + }, + { + "internalName": "minecart_furnace", + "displayName": "Minecart with Furnace" + }, + { + "internalName": "charcoal", + "displayName": "Charcoal" + }, + { + "internalName": "monsterPlacer_overlay", + "displayName": "Spawn Egg (Overlay)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Mob_Creeper_Colour2", + "variants": [ + "Mob_Creeper_Colour2", + "Mob_Skeleton_Colour2", + "Mob_Spider_Colour2", + "Mob_Zombie_Colour2", + "Mob_Slime_Colour2", + "Mob_Ghast_Colour2", + "Mob_PigZombie_Colour2", + "Mob_Enderman_Colour2", + "Mob_CaveSpider_Colour2", + "Mob_Silverfish_Colour2", + "Mob_Blaze_Colour2", + "Mob_LavaSlime_Colour2", + "Mob_Pig_Colour2", + "Mob_Sheep_Colour2", + "Mob_Cow_Colour2", + "Mob_Chicken_Colour2", + "Mob_Squid_Colour2", + "Mob_Wolf_Colour2", + "Mob_MushroomCow_Colour2", + "Mob_Ocelot_Colour2", + "Mob_Villager_Colour2", + "Mob_Bat_Colour2", + "Mob_Witch_Colour2", + "Mob_Horse_Colour2", + "Mob_Endermite_Color2", + "Mob_Guardian_Color2", + "Mob_Rabbit_Colour2", + "Mob_PolarBear_Colour2", + "Mob_Shulker_Colour2", + "Mob_Elder_Guardian_Colour2", + "Mob_Evocation_Illager_Colour2", + "Mob_Llama_Colour2", + "Mob_Donkey_Colour2", + "Mob_Skeleton_Horse_Colour2", + "Mob_Zombie_Horse_Colour2", + "Mob_Mule_Colour2", + "Mob_Stray_Colour2", + "Mob_Husk_Colour2", + "Mob_Vex_Colour2", + "Mob_Vindication_Illager_Colour2", + "Mob_Zombie_Villager_Colour2", + "Mob_Parrot_Colour2", + "Mob_Wither_Skeleton_Colour2", + "Mob_Turtle_Colour2", + "Mob_Tropical_Colour2", + "Mob_Cod_Colour2", + "Mob_Pufferfish_Colour2", + "Mob_Salmon_Colour2", + "Mob_Drowned_Colour2", + "Mob_Dolphin_Colour2", + "Mob_Phantom_Colour2" + ] + } + }, + { + "internalName": "bed_overlay", + "displayName": "Bed (Overlay)", + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Bed_White", + "variants": [ + "Bed_Black", + "Bed_Blue", + "Bed_Brown", + "Bed_Cyan", + "Bed_Grey", + "Bed_Green", + "Bed_Light_Blue", + "Bed_Lime", + "Bed_Magenta", + "Bed_Orange", + "Bed_Pink", + "Bed_Purple", + "Bed_Red", + "Bed_Silver", + "Bed_White", + "Bed_Yellow" + ] + } + }, + { + "internalName": "expBottle", + "displayName": "Bottle o'Enchanting" + }, + { + "internalName": "brewingStand", + "displayName": "Brewing Stand" + }, + { + "internalName": "magmaCream", + "displayName": "Magma Cream" + }, + { + "internalName": "dyePowder_cyan", + "displayName": "Cyan Dye" + }, + { + "internalName": "dyePowder_orange", + "displayName": "Orange Dye" + }, + { + "internalName": "leggingsCloth_overlay", + "displayName": "Leather Pants (Overlay)" + }, + { + "internalName": "tipped_arrow_head", + "displayName": "Tipped Arrow (Overlay)" + }, + { + "internalName": "potion_bottle_lingering", + "displayName": "Lingering Potion" + }, + { + "internalName": "barrier", + "displayName": "debug_fourj_item" + }, + { + "internalName": "mutton_raw", + "displayName": "Raw Mutton" + }, + { + "internalName": "rabbit_raw", + "displayName": "Raw Rabbit" + }, + { + "internalName": "fish_pufferfish_raw", + "displayName": "Pufferfish" + }, + { + "internalName": "minecart_hopper", + "displayName": "Minecart with Hopper" + }, + { + "internalName": "hopper", + "displayName": "Hopper" + }, + { + "internalName": "nether_star", + "displayName": "Nether Star" + }, + { + "internalName": "emerald", + "displayName": "Emerald" + }, + { + "internalName": "writingBook", + "displayName": "Book and Quill" + }, + { + "internalName": "writtenBook", + "displayName": "Written Book" + }, + { + "internalName": "flowerPot", + "displayName": "Flower Pot" + }, + { + "internalName": "dyePowder_silver", + "displayName": "Light Gray Dye" + }, + { + "internalName": "dyePowder_white", + "displayName": "Bone Meal" + }, + { + "internalName": "bootsCloth_overlay", + "displayName": "Leather Boots (Overlay)" + }, + { + "internalName": "beetroot", + "displayName": "Beetroot" + }, + { + "internalName": "beetroot_seeds", + "displayName": "Beetroot Seeds" + }, + { + "internalName": "beetroot_soup", + "displayName": "Beetroot Soup" + }, + { + "internalName": "mutton_cooked", + "displayName": "Cooked Mutton" + }, + { + "internalName": "rabbit_cooked", + "displayName": "Cooked Rabbit" + }, + { + "internalName": "fish_salmon_raw", + "displayName": "Raw Salmon" + }, + { + "internalName": "minecart_tnt", + "displayName": "Minecart with TNT" + }, + { + "internalName": "wooden_armorstand", + "displayName": "Armor Stand" + }, + { + "internalName": "fireworks", + "displayName": "Firework Rocket" + }, + { + "internalName": "fireworks_charge", + "displayName": "Firework Star" + }, + { + "internalName": "fireworks_charge_overlay", + "displayName": "Firework Star (Overlay)", + "allowCustomColour": true + }, + { + "internalName": "netherquartz", + "displayName": "Nether Quartz" + }, + { + "internalName": "map_empty", + "displayName": "Empty Map" + }, + { + "internalName": "frame", + "displayName": "Item Frame" + }, + { + "internalName": "enchantedBook", + "displayName": "Enchanted Book" + }, + { + "internalName": "door_acacia", + "displayName": "Acacia Door" + }, + { + "internalName": "door_birch", + "displayName": "Birch Door" + }, + { + "internalName": "door_dark_oak", + "displayName": "Dark Oak Door" + }, + { + "internalName": "door_jungle", + "displayName": "Jungle Door" + }, + { + "internalName": "door_spruce", + "displayName": "Spruce Door" + }, + { + "internalName": "rabbit_stew", + "displayName": "Rabbit Stew" + }, + { + "internalName": "fish_salmon_cooked", + "displayName": "Cooked Salmon" + }, + { + "internalName": "minecart_command_block", + "displayName": "Minecart with Command Block" + }, + { + "internalName": "acacia_boat", + "displayName": "Acacia Boat" + }, + { + "internalName": "birch_boat", + "displayName": "Birch Boat" + }, + { + "internalName": "dark_oak_boat", + "displayName": "Dark Oak Boat" + }, + { + "internalName": "jungle_boat", + "displayName": "Jungle Boat" + }, + { + "internalName": "spruce_boat", + "displayName": "Spruce Boat" + }, + { + "internalName": "prismarine_shard", + "displayName": "Prismarine Shard" + }, + { + "internalName": "prismarine_crystals", + "displayName": "Prismarine Crystals" + }, + { + "internalName": "leather_horse_armor_base", + "displayName": "Leather Horse Armor", + "allowCustomColour": true, + "hasColourEntry": true, + "colourEntry": { + "defaultName": "Armour_Default_Leather_Colour", + "variants": [ "Armour_Default_Leather_Colour" ] + } + }, + { + "internalName": "structure_void", + "displayName": "Structure Void" + }, + { + "internalName": "map_filled_markings", + "displayName": "Filled Map (Overlay)" + }, + { + "internalName": "totem", + "displayName": "Totem of Undying" + }, + { + "internalName": "shulker_shell", + "displayName": "Shulker Shell" + }, + { + "internalName": "iron_nugget", + "displayName": "Iron Nugget" + }, + { + "internalName": "rabbit_foot", + "displayName": "Rabbit's Foot" + }, + { + "internalName": "rabbit_hide", + "displayName": "Rabbit Hide" + }, + { + "internalName": "compass", + "displayName": "" + }, + { + "internalName": "compass", + "displayName": "" + }, + { + "internalName": "compass", + "displayName": "" + }, + { + "internalName": "compass", + "displayName": "" + }, + { + "internalName": "clock", + "displayName": "" + }, + { + "internalName": "clock", + "displayName": "" + }, + { + "internalName": "clock", + "displayName": "" + }, + { + "internalName": "clock", + "displayName": "" + }, + { + "internalName": "dragonFireball", + "displayName": "Dragon Fireball" + }, + { + "internalName": "record_13", + "displayName": "Music Disc (C418 - 13)" + }, + { + "internalName": "record_cat", + "displayName": "Music Disc (C418 - cat)" + }, + { + "internalName": "record_blocks", + "displayName": "Music Disc (C418 - blocks)" + }, + { + "internalName": "record_chirp", + "displayName": "Music Disc (C418 - chirp)" + }, + { + "internalName": "record_far", + "displayName": "Music Disc (C418 - far)" + }, + { + "internalName": "record_mall", + "displayName": "Music Disc (C418 - mall)" + }, + { + "internalName": "record_mellohi", + "displayName": "Music Disc (C418 - mellohi)" + }, + { + "internalName": "record_stal", + "displayName": "Music Disc (C418 - stal)" + }, + { + "internalName": "record_strad", + "displayName": "Music Disc (C418 - strad)" + }, + { + "internalName": "record_ward", + "displayName": "Music Disc (C418 - ward)" + }, + { + "internalName": "record_11", + "displayName": "Music Disc (C418 - 11)" + }, + { + "internalName": "record_where are we now", + "displayName": "Music Disc (C418 - wait)" + }, + { + "internalName": "bucketFish", + "displayName": "Bucket of Cod" + }, + { + "internalName": "bucketSalmon", + "displayName": "Bucket of Salmon" + }, + { + "internalName": "bucketPuffer", + "displayName": "Bucket of Pufferfish" + }, + { + "internalName": "bucketTropical", + "displayName": "Bucket of Tropical Fish" + }, + { + "internalName": "leather_horse_armor_detail", + "displayName": "Leather Horse Armor (Overlay)" + }, + { + "internalName": "dyePowder_black1", + "displayName": "Black Dye [PS4 ONLY]" + }, + { + "internalName": "dyePowder_blue1", + "displayName": "Blue Dye [PS4 ONLY]" + }, + { + "internalName": "dyePowder_brown1", + "displayName": "Brown Dye [PS4 ONLY]" + }, + { + "internalName": "dyePowder_white1", + "displayName": "White Dye [PS4 ONLY]" + }, + { + "internalName": "bamboo", + "displayName": "Bamboo [PS4 ONLY]" + }, + { + "internalName": "lantern_carried", + "displayName": "Lantern [PS4 ONLY]" + }, + { + "internalName": "kelp", + "displayName": "Kelp" + }, + { + "internalName": "dried_kelp", + "displayName": "Dried Kelp" + }, + { + "internalName": "sea_pickle", + "displayName": "Sea Pickle" + }, + { + "internalName": "nautilus", + "displayName": "Nautilus Shell" + }, + { + "internalName": "nautilus_core", + "displayName": "Heart of the Sea" + }, + { + "internalName": "turtle_helmet", + "displayName": "Turtle Shell" + }, + { + "internalName": "turtle_shell_piece", + "displayName": "Scute" + }, + { + "internalName": "trident", + "displayName": "Trident" + }, + { + "internalName": "phantom_membrane", + "displayName": "Phantom Membrane" + }, + { + "internalName": "acacia_sign", + "displayName": "Acacia Sign [PS4 ONLY]" + }, + { + "internalName": "birch_sign", + "displayName": "Birch Sign [PS4 ONLY]" + }, + { + "internalName": "dark_oak_sign", + "displayName": "Dark Oak Sign [PS4 ONLY]" + }, + { + "internalName": "jungle_sign", + "displayName": "Jungle Sign [PS4 ONLY]" + }, + { + "internalName": "spruce_sign", + "displayName": "Spruce Sign [PS4 ONLY]" + }, + { + "internalName": "crossbow", + "displayName": "Crossbow [PS4 ONLY]" + }, + { + "internalName": "crossbow_pull_0", + "displayName": "Crossbow (Pulling Stage 1) [PS4 ONLY]" + }, + { + "internalName": "crossbow_pull_1", + "displayName": "Crossbow (Pulling Stage 2) [PS4 ONLY]" + }, + { + "internalName": "crossbow_pull_2", + "displayName": "Crossbow (Pulling Stage 3) [PS4 ONLY]" + }, + { + "internalName": "crossbow_arrow", + "displayName": "Crossbow (Loaded) [PS4 ONLY]" + }, + { + "internalName": "crossbow_firework", + "displayName": "Crossbow (Loaded) (Firework) [PS4 ONLY]" + }, + { + "internalName": "sweet_berries", + "displayName": "Sweet Berries [PS4 ONLY]" + }, + { + "internalName": "banner_pattern", + "displayName": "Banner Pattern [PS4 ONLY]" + }, + { + "internalName": "bell", + "displayName": "Bell [PS4 ONLY]" + }, + { + "internalName": "campfire_carried", + "displayName": "Campfire [PS4 ONLY]" + }, + { + "internalName": "", + "displayName": "" + } + ] +} diff --git a/PckStudio.Core/Resources/items.png b/PckStudio.Core/Resources/items.png new file mode 100644 index 0000000000000000000000000000000000000000..6d316ad919143d49060595a238f8fffced4ba15c GIT binary patch literal 155929 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 literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/mapIconData.json b/PckStudio.Core/Resources/mapIconData.json new file mode 100644 index 00000000..8e1273f2 --- /dev/null +++ b/PckStudio.Core/Resources/mapIconData.json @@ -0,0 +1,135 @@ +{ + "COMMENT_1": "JSON by MattNL", + "entries": [ + { + "internalName": "player_1", + "displayName": "Player 1" + }, + { + "internalName": "player_2", + "displayName": "Player 2" + }, + { + "internalName": "player_3", + "displayName": "Player 3" + }, + { + "internalName": "player_4", + "displayName": "Player 4" + }, + { + "internalName": "target_x", + "displayName": "Unused" + }, + { + "internalName": "target_point", + "displayName": "Target Point (Unused)" + }, + { + "internalName": "player_off_map", + "displayName": "Player (Off Map) (Unused)" + }, + { + "internalName": "frame", + "displayName": "Item Frame" + }, + { + "internalName": "player_5", + "displayName": "Player 5" + }, + { + "internalName": "player_6", + "displayName": "Player 6" + }, + { + "internalName": "player_7", + "displayName": "Player 7" + }, + { + "internalName": "player_8", + "displayName": "Player 8" + }, + { + "internalName": "structure", + "displayName": "Structure (Explorer Map)" + }, + { + "internalName": "player_off_limits", + "displayName": "Player (Off Limits) (Unused)" + }, + { + "internalName": "mansion", + "displayName": "Woodland Mansion (Explorer Map)" + }, + { + "internalName": "monument", + "displayName": "Ocean Monument (Explorer Map)" + } + ], + "additional_entries": [ + { + "internalName": "player_1_off_map", + "displayName": "Player 1 (Off Map)" + }, + { + "internalName": "player_2_off_map", + "displayName": "Player 2 (Off Map)" + }, + { + "internalName": "player_3_off_map", + "displayName": "Player 3 (Off Map)" + }, + { + "internalName": "player_4_off_map", + "displayName": "Player 4 (Off Map)" + }, + { + "internalName": "treasure", + "displayName": "Buried Treasure" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "player_5_off_map", + "displayName": "Player 5 (Off Map)" + }, + { + "internalName": "player_6_off_map", + "displayName": "Player 6 (Off Map)" + }, + { + "internalName": "player_7_off_map", + "displayName": "Player 7 (Off Map)" + }, + { + "internalName": "player_8_off_map", + "displayName": "Player 8 (Off Map)" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + } + ] +} diff --git a/PckStudio.Core/Resources/map_icons.png b/PckStudio.Core/Resources/map_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..7b6ecd1333d1d1d3868dbb7461aefe94f28ae316 GIT binary patch literal 6329 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 literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/moonPhaseData.json b/PckStudio.Core/Resources/moonPhaseData.json new file mode 100644 index 00000000..506e7f6f --- /dev/null +++ b/PckStudio.Core/Resources/moonPhaseData.json @@ -0,0 +1,37 @@ +{ + "COMMENT_1": "JSON by MattNL", + "entries": [ + { + "internalName": "moon_phase_0", + "displayName": "Full Moon" + }, + { + "internalName": "moon_phase_1", + "displayName": "Waning Gibbous" + }, + { + "internalName": "moon_phase_2", + "displayName": "Last Quarter" + }, + { + "internalName": "moon_phase_3", + "displayName": "Waning Crescent" + }, + { + "internalName": "moon_phase_4", + "displayName": "New Moon" + }, + { + "internalName": "moon_phase_5", + "displayName": "Waxing Crescent" + }, + { + "internalName": "moon_phase_6", + "displayName": "First Quarter" + }, + { + "internalName": "moon_phase_7", + "displayName": "Waxing Gibbous" + } + ] +} diff --git a/PckStudio.Core/Resources/moon_phases.png b/PckStudio.Core/Resources/moon_phases.png new file mode 100644 index 0000000000000000000000000000000000000000..ce239ea7b40a685b1d74de6d8feca11ad580cd68 GIT binary patch literal 1569 zcmV++2HyFJP)N2bPDNB8 zb~7$DE-^4L^m3s900o^%L_t(|UhP~2Nz&P z6?dSD1t(z5mP2p>_S^&BbZbUqjU z=0}G=(T7;>A+&Akd&7A@Iah6Tp&D)DOC^bsp)=sF01!vyQ~<#*;YTMQWOD?vW`7KR znfk$aF&Hn0lS|X^5nmb^I=!*#3MwN(1B}>41I|KeaufU#euy9rPb3qHeZ_u1IYYcN z^~vmdG`~q^s?o+ZzQiu-5N9};HJ~BE?gW_tf?v*0qe-(#L~f7r{>Wl~HJn_5^zqrF z@%iJ)#S=7a;3K}ouEBU^X)wZ{QzD{HpfX!3fZ$V%7W1PLG!c}BKhnC&JSz5A$@IZ! z{t%2$7q`>J-E{d>HEb+y@g;WQ0MJE7iiePN65e$P(N7WPg0R-Bv>1YDZdGR2|wuwndTo3e+;mc_irfn?|%RJ zYucA@-?9DX?fZ8hKCuRri!dH6SY(rhvbm6&{(IpA^X048D#cL?ix2Rc@EJJ=?tT51 z07xJv{4vZT(IeF$*ugk>|MByek%7-g{ot0ygKMi3Bs>hb0{GzD|3+ARm!nYlKt@E` zp~C^>hpz>oJFip#L^P&4tRWJPEda~#@$**_;9e&p)d@HY0fgp4c>z4}xo`156BfTn zfH2qZ#=aK72j3N7biw%t6CMn?NcvzLyrY?Z0GiOS3kTpZ&O#W9y#%Plw*?4`@5X5; z{KD{u27dS+0&w0p{QydEH2Ix?@4|44r+b(qfQ`@6at{cLU!MSFJ;3k!{ZbJ30B&`p zAOl`g3Nk@sXX;QXE=&r-$XPZ>BI7eJ+{{P6K_=}1{`iKYI`G#82s4QYGYIo-aN#u6 zP;bi+a2jgk*D(z}7=CUdY%&v=wMQan0PLf&6*cVjgAfKcW^zA#4|8t0 z06zYA#~q!V=jsn~0vHWKnP+VQ*xSk+1;ppr=duZQl6&KO*wf1d@UvfUwx<^g5U~Eh z6##~Kw1C%dGAFyox4}PF0Rq+^8tK6jb5g zKl~ufvmn1gY;*mAn}T>84vTLz;Gx+2`j2uN%Aw>pjoV_HYscx);O}@Nb~^t3bRmr` z3(fuck@|qhOD#x!K(^pZoQHAgdOot8OuXfGU0}2drl`CLd#Vn=kn-|#2_cTlIjd)mpeck^3eewSR{HIP) Tt|iYb00000NkvXXu0mjfYU}K5 literal 0 HcmV?d00001 diff --git a/PckStudio.Core/Resources/paintingData.json b/PckStudio.Core/Resources/paintingData.json new file mode 100644 index 00000000..5b5b0ef9 --- /dev/null +++ b/PckStudio.Core/Resources/paintingData.json @@ -0,0 +1,1062 @@ +{ + "COMMENT_1": "JSON by MattNL", + "entries": [ + { + "internalName": "Kebab", + "displayName": "\"Kebab med tre pepperoni\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Aztec", + "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Alban", + "displayName": "\"Albanian\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Aztec2", + "displayName": "\"de_aztec\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Bomb", + "displayName": "\"Target Successfully Bombed\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Plant", + "displayName": "\"Paradisträd\" by Kristoffer Zetterstrand" + }, + { + "internalName": "Wasteland", + "displayName": "\"Wasteland\" by Kristoffer Zetterstrand" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "Back Texture", + "width": 4, + "height": 4 + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "1x1E1", + "displayName": "Extra Painting 1" + }, + { + "internalName": "1x1E2", + "displayName": "Extra Painting 2" + }, + { + "internalName": "1x1E3", + "displayName": "Extra Painting 3" + }, + { + "internalName": "1x1E4", + "displayName": "Extra Painting 4" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Pool", + "displayName": "\"The Pool\" by Kristoffer Zetterstrand", + "width": 2 + }, + { + "internalName": "Pool", + "displayName": "" + }, + { + "internalName": "Courbet", + "displayName": "\"Bonjour Monsieur Courbet\" by Kristoffer Zetterstrand", + "width": 2 + }, + { + "internalName": "Courbet", + "displayName": "" + }, + { + "internalName": "Sea", + "displayName": "\"Seaside\" by Kristoffer Zetterstrand", + "width": 2 + }, + { + "internalName": "Sea", + "displayName": "" + }, + { + "internalName": "Sunset", + "displayName": "\"sunset_dense\" by Kristoffer Zetterstrand", + "width": 2 + }, + { + "internalName": "Sunset", + "displayName": "" + }, + { + "internalName": "Creebet", + "displayName": "\"Creebet\" by Kristoffer Zetterstrand", + "width": 2 + }, + { + "internalName": "Creebet", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "" + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Back", + "displayName": "", + }, + { + "internalName": "Wanderer", + "displayName": "\"Wanderer\" by Kristoffer Zetterstrand", + "height": 2 + }, + { + "internalName": "Graham", + "displayName": "\"Graham\" by Kristoffer Zetterstrand", + "height": 2 + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "\"Mortal Coil\" by Kristoffer Zetterstrand", + "width": 4, + "height": 3 + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Wanderer", + "displayName": "" + }, + { + "internalName": "Graham", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Skeleton", + "displayName": "", + }, + { + "internalName": "Fighters", + "displayName": "\"Fighters\" by Kristoffer Zetterstrand", + "width": 4, + "height": 2 + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "" + }, + { + "internalName": "Skeleton", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "Fighters", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "\"Kong\" by Kristoffer Zetterstrand", + "width": 4, + "height": 3 + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "Match", + "displayName": "\"Match\" by Kristoffer Zetterstrand", + "width": 2, + "height": 2 + }, + { + "internalName": "Match", + "displayName": "" + }, + { + "internalName": "Bust", + "displayName": "\"Bust\" by Kristoffer Zetterstrand", + "width": 2, + "height": 2 + }, + { + "internalName": "Bust", + "displayName": "" + }, + { + "internalName": "Stage", + "displayName": "\"The stage is set\" by Kristoffer Zetterstrand", + "width": 2, + "height": 2 + }, + { + "internalName": "Stage", + "displayName": "" + }, + { + "internalName": "Void", + "displayName": "\"The Void\" by Kristoffer Zetterstrand", + "width": 2, + "height": 2 + }, + { + "internalName": "Void", + "displayName": "" + }, + { + "internalName": "SkullAndRoses", + "displayName": "\"Skull and Roses\" by Kristoffer Zetterstrand", + "width": 2, + "height": 2 + }, + { + "internalName": "SkullAndRoses", + "displayName": "" + }, + { + "internalName": "Wither", + "displayName": "\"Wither\" by Jens Bergensten", + "width": 2, + "height": 2 + }, + { + "internalName": "Wither", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "" + }, + { + "internalName": "Match", + "displayName": "" + }, + { + "internalName": "Match", + "displayName": "" + }, + { + "internalName": "Bust", + "displayName": "" + }, + { + "internalName": "Bust", + "displayName": "" + }, + { + "internalName": "Stage", + "displayName": "" + }, + { + "internalName": "Stage", + "displayName": "" + }, + { + "internalName": "Void", + "displayName": "" + }, + { + "internalName": "Void", + "displayName": "" + }, + { + "internalName": "SkullAndRoses", + "displayName": "" + }, + { + "internalName": "SkullAndRoses", + "displayName": "" + }, + { + "internalName": "Wither", + "displayName": "" + }, + { + "internalName": "Wither", + "displayName": "" + }, + { + "internalName": "DonkeyKong", + "displayName": "", + }, + { + "internalName": "DonkeyKong", + "displayName": "", + }, + { + "internalName": "DonkeyKong", + "displayName": "", + }, + { + "internalName": "DonkeyKong", + "displayName": "", + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "\"Pointer\" by Kristoffer Zetterstrand", + "width": 4, + "height": 4 + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "\"Pigscene\" by Kristoffer Zetterstrand", + "width": 4, + "height": 4 + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "\"Skull On Fire\" by Kristoffer Zetterstrand", + "width": 4, + "height": 4 + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "Pointer", + "displayName": "", + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "", + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "", + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "Pointer", + "displayName": "", + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pointer", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "", + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "Pigscene", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "", + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "BurningSkull", + "displayName": "" + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + }, + { + "internalName": "", + "displayName": "", + } + ] +} diff --git a/PckStudio.Core/Resources/paintings.png b/PckStudio.Core/Resources/paintings.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bc84fec490e432028cf67dfefb271bd22c980b GIT binary patch literal 92439 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 z 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