From ebf9138b20a7abb5214ceccc6d1efb9edb018f62 Mon Sep 17 00:00:00 2001 From: miku-666 <74728189+NessieHax@users.noreply.github.com> Date: Tue, 20 Feb 2024 18:37:49 +0100 Subject: [PATCH] SkinRenderer - Add ouline color property --- .../Forms/Editor/CustomSkinEditor.Designer.cs | 26 +++++------ PCK-Studio/Forms/Editor/CustomSkinEditor.cs | 43 +++++++++---------- PCK-Studio/Forms/Editor/CustomSkinEditor.resx | 42 ++++++++---------- PCK-Studio/Rendering/SceneViewport.cs | 2 + PCK-Studio/Rendering/Shader/ShaderLibrary.cs | 2 + PCK-Studio/Rendering/SkinRenderer.cs | 25 ++++++++++- 6 files changed, 81 insertions(+), 59 deletions(-) diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs index e443f079..1293f6a2 100644 --- a/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.Designer.cs @@ -44,7 +44,7 @@ this.buttonIMPORT = new MetroFramework.Controls.MetroButton(); this.importCustomSkinButton = new MetroFramework.Controls.MetroButton(); this.buttonExportModel = new MetroFramework.Controls.MetroButton(); - this.OpenJSONButton = new MetroFramework.Controls.MetroButton(); + this.outlineColorButton = new MetroFramework.Controls.MetroButton(); this.generateTextureCheckBox = new MetroFramework.Controls.MetroCheckBox(); this.checkGuide = new MetroFramework.Controls.MetroCheckBox(); this.checkBoxArmor = new MetroFramework.Controls.MetroCheckBox(); @@ -190,14 +190,14 @@ this.buttonExportModel.UseSelectable = true; this.buttonExportModel.Click += new System.EventHandler(this.buttonExportModel_Click); // - // OpenJSONButton + // outlineColorButton // - resources.ApplyResources(this.OpenJSONButton, "OpenJSONButton"); - this.OpenJSONButton.ForeColor = System.Drawing.Color.White; - this.OpenJSONButton.Name = "OpenJSONButton"; - this.OpenJSONButton.Theme = MetroFramework.MetroThemeStyle.Dark; - this.OpenJSONButton.UseSelectable = true; - this.OpenJSONButton.Click += new System.EventHandler(this.OpenJSONButton_Click); + 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 // @@ -379,14 +379,16 @@ // // renderer3D1 // - resources.ApplyResources(this.renderer3D1, "renderer3D1"); this.renderer3D1.BackColor = System.Drawing.Color.DimGray; this.renderer3D1.ClampModel = false; + resources.ApplyResources(this.renderer3D1, "renderer3D1"); this.renderer3D1.Name = "renderer3D1"; + this.renderer3D1.OutlineColor = System.Drawing.Color.Empty; this.renderer3D1.RefreshRate = 50; + this.renderer3D1.ShowGuideLines = false; this.renderer3D1.Texture = null; this.renderer3D1.VSync = true; - this.renderer3D1.TextureChanging += new System.EventHandler(renderer3D1_TextureChanging); + this.renderer3D1.TextureChanging += new System.EventHandler(this.renderer3D1_TextureChanging); // // uvPictureBox // @@ -417,7 +419,7 @@ this.Controls.Add(this.checkBoxArmor); this.Controls.Add(this.checkGuide); this.Controls.Add(this.generateTextureCheckBox); - this.Controls.Add(this.OpenJSONButton); + this.Controls.Add(this.outlineColorButton); this.Controls.Add(this.buttonExportModel); this.Controls.Add(this.importCustomSkinButton); this.Controls.Add(this.buttonEXPORT); @@ -457,7 +459,7 @@ private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem changeColorToolStripMenuItem; private MetroFramework.Controls.MetroButton buttonDone; - private MetroFramework.Controls.MetroButton OpenJSONButton; + private MetroFramework.Controls.MetroButton outlineColorButton; private MetroFramework.Controls.MetroButton buttonExportModel; private MetroFramework.Controls.MetroButton importCustomSkinButton; private PckStudio.ToolboxItems.InterpolationPictureBox uvPictureBox; diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs index fd24efb6..950a2149 100644 --- a/PCK-Studio/Forms/Editor/CustomSkinEditor.cs +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.cs @@ -47,6 +47,7 @@ namespace PckStudio.Forms.Editor { base.OnLoad(e); renderer3D1.InitializeGL(); + renderer3D1.OutlineColor = Color.DarkSlateBlue; if (_file.Size > 0) { renderer3D1.Texture = _file.GetTexture(); @@ -116,7 +117,7 @@ namespace PckStudio.Forms.Editor openFileDialog.Filter = "PNG Image Files | *.png"; openFileDialog.Title = "Select Skin Texture"; - if (openFileDialog.ShowDialog() == DialogResult.OK) // skins can only be a 1:1 ratio (base 64x64) or a 2:1 ratio (base 64x32) + if (openFileDialog.ShowDialog() == DialogResult.OK) { using (var img = Image.FromFile(openFileDialog.FileName)) { @@ -162,8 +163,8 @@ namespace PckStudio.Forms.Editor private void importCustomSkinButton_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "Custom Skin Model File (*.csm,*.CSM)|*.csm;*.CSM|Custom Skin Model Binary File (*.csmb)|*.csmb"; - openFileDialog.Title = "Select File"; + openFileDialog.Filter = "Custom Skin Model File (*.csm,*.CSM)|*.csm;*.CSM|Custom Skin Model Binary File (*.csmb)|*.csmb|JSON Model File(*.json)|*.JSON;*.json"; + openFileDialog.Title = "Select Model File"; 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) { string fileExtension = Path.GetExtension(openFileDialog.FileName); @@ -214,18 +215,14 @@ namespace PckStudio.Forms.Editor } - // TODO: re-implement comletely - private void OpenJSONButton_Click(object sender, EventArgs e) + private void outlineColorButton_Click(object sender, EventArgs e) { - OpenFileDialog openFileDialog = new OpenFileDialog(); - openFileDialog.Filter = "JSON Model File | *.JSON"; - openFileDialog.Title = "Select JSON Model File"; - 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) + ColorDialog colorDialog = new ColorDialog(); + colorDialog.SolidColorOnly = true; + if (colorDialog.ShowDialog() == DialogResult.OK) { - + renderer3D1.OutlineColor = colorDialog.Color; + skinPartListBox_SelectedIndexChanged(sender, e); } } @@ -239,13 +236,14 @@ namespace PckStudio.Forms.Editor string PARENT = group.Name; foreach (int i in group.children) { - string name = jsonDe.Elements[i].Name; - float PosX = jsonDe.Elements[i].from[0] + group.origin[0]; - float PosY = jsonDe.Elements[i].from[1] + group.origin[1]; - float PosZ = jsonDe.Elements[i].from[2] + group.origin[2]; - float SizeX = jsonDe.Elements[i].to[0] - jsonDe.Elements[i].from[0]; - float SizeY = jsonDe.Elements[i].to[1] - jsonDe.Elements[i].from[1]; - float SizeZ = jsonDe.Elements[i].to[2] - jsonDe.Elements[i].from[2]; + CSMJObjectElement element = jsonDe.Elements[i]; + string name = element.Name; + float PosX = element.from[0] + group.origin[0]; + float PosY = element.from[1] + group.origin[1]; + float PosZ = element.from[2] + group.origin[2]; + float SizeX = element.to[0] - element.from[0]; + float SizeY = element.to[1] - element.from[1]; + float SizeZ = element.to[2] - element.from[2]; float U = 0; float V = 0; @@ -258,6 +256,7 @@ namespace PckStudio.Forms.Editor private void renderer3D1_TextureChanging(object sender, Rendering.TextureChangingEventArgs e) { var img = e.NewTexture; + // Skins can only be a 1:1 ratio (base 64x64) or a 2:1 ratio (base 64x32) if (img.Width != img.Height && img.Height != img.Width / 2) { e.Cancel = true; @@ -289,14 +288,14 @@ namespace PckStudio.Forms.Editor uvPictureBox.Image = new Bitmap(uvPictureBox.BackgroundImage.Width * scale, uvPictureBox.BackgroundImage.Height * scale); using (Graphics g = Graphics.FromImage(uvPictureBox.Image)) { - float penWidth = ((uvPictureBox.BackgroundImage.Width / renderer3D1.TextureSize.Width) + (uvPictureBox.BackgroundImage.Height / renderer3D1.TextureSize.Height)) / 2f; + float lineWidth = ((uvPictureBox.BackgroundImage.Width / renderer3D1.TextureSize.Width) + (uvPictureBox.BackgroundImage.Height / renderer3D1.TextureSize.Height)) / 2f; GraphicsPath graphicsPath = box.GetUVGraphicsPath( new System.Numerics.Vector2( scale * renderer3D1.TillingFactor.X * uvPictureBox.BackgroundImage.Width, scale * renderer3D1.TillingFactor.Y * uvPictureBox.BackgroundImage.Height ) ); - g.DrawPath(new Pen(Color.HotPink, penWidth), graphicsPath); + g.DrawPath(new Pen(renderer3D1.OutlineColor, lineWidth), graphicsPath); } uvPictureBox.Invalidate(); } diff --git a/PCK-Studio/Forms/Editor/CustomSkinEditor.resx b/PCK-Studio/Forms/Editor/CustomSkinEditor.resx index dc425ff4..a1f9eda6 100644 --- a/PCK-Studio/Forms/Editor/CustomSkinEditor.resx +++ b/PCK-Studio/Forms/Editor/CustomSkinEditor.resx @@ -436,10 +436,10 @@ False - 194, 558 + 190, 558 - 106, 21 + 105, 21 96 @@ -466,7 +466,7 @@ False - 418, 558 + 413, 558 89, 21 @@ -489,34 +489,31 @@ 19 - + Bottom, Left - - False + + 301, 558 - - 306, 558 - - + 106, 21 - + 145 - - Import json + + Set Outline Color - - OpenJSONButton + + outlineColorButton - + MetroFramework.Controls.MetroButton, MetroFramework, Version=1.4.0.0, Culture=neutral, PublicKeyToken=5f91a84759bf584a - + $this - + 18 @@ -877,7 +874,7 @@ Bottom, Left - 513, 558 + 508, 558 113, 21 @@ -1059,14 +1056,11 @@ 1 - - Top, Bottom, Left, Right - - 194, 63 + 190, 59 - 424, 484 + 431, 488 167 diff --git a/PCK-Studio/Rendering/SceneViewport.cs b/PCK-Studio/Rendering/SceneViewport.cs index e5fd189d..6c65fe28 100644 --- a/PCK-Studio/Rendering/SceneViewport.cs +++ b/PCK-Studio/Rendering/SceneViewport.cs @@ -73,6 +73,8 @@ namespace PckStudio.Rendering protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); + if (DesignMode) + return; MakeCurrent(); if (Camera is not null) { diff --git a/PCK-Studio/Rendering/Shader/ShaderLibrary.cs b/PCK-Studio/Rendering/Shader/ShaderLibrary.cs index 7b6a76ea..d52bdc7c 100644 --- a/PCK-Studio/Rendering/Shader/ShaderLibrary.cs +++ b/PCK-Studio/Rendering/Shader/ShaderLibrary.cs @@ -12,6 +12,8 @@ namespace PckStudio.Rendering.Shader 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]; diff --git a/PCK-Studio/Rendering/SkinRenderer.cs b/PCK-Studio/Rendering/SkinRenderer.cs index 7a4f18dd..70a60e1a 100644 --- a/PCK-Studio/Rendering/SkinRenderer.cs +++ b/PCK-Studio/Rendering/SkinRenderer.cs @@ -63,6 +63,26 @@ namespace PckStudio.Rendering } } + [Description("The Color used for outlines")] + [Category("Appearance")] + public Color OutlineColor + { + get => _outlineColor; + set + { + if (value == _outlineColor) + return; + _outlineColor = value; + if (initialized && _shaders.HasShader("LineShader")) + { + MakeCurrent(); + var shader = _shaders.GetShader("LineShader"); + shader.Bind(); + shader.SetUniform4("baseColor", _outlineColor); + } + } + } + public bool ClampModel { get; set; } = false; public bool ShowGuideLines { @@ -88,6 +108,7 @@ namespace PckStudio.Rendering } [Browsable(false)] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public SkinANIM ANIM { get => _anim; @@ -124,6 +145,8 @@ namespace PckStudio.Rendering } + private Color _outlineColor; + private enum GuidelineMode { None = -1, @@ -475,7 +498,7 @@ namespace PckStudio.Rendering lineShader.Validate(); _shaders.AddShader("LineShader", lineShader); - Color lineColor = Color.Aquamarine; + Color lineColor = Color.White; // Cubical draw context {