From da588cb20feb5f69722a8bd1252bf29874285efd Mon Sep 17 00:00:00 2001 From: tom-overton Date: Thu, 13 Oct 2022 02:26:28 -0700 Subject: [PATCH] Improvements to collision viewer --- .../F3DZEX/Render/CollisionVertexDrawer.cs | 33 +++++++++ Z64Utils/F3DZEX/Render/Renderer.cs | 22 ++++++ .../Forms/CollisionViewerForm.Designer.cs | 43 ++++++++++- Z64Utils/Forms/CollisionViewerForm.cs | 73 +++++++++++-------- Z64Utils/Forms/CollisionViewerForm.resx | 18 ++++- Z64Utils/Shaders/collisionVtx.frag | 10 +++ Z64Utils/Shaders/collisionVtx.vert | 16 ++++ Z64Utils/Z64Utils.csproj | 6 ++ 8 files changed, 185 insertions(+), 36 deletions(-) create mode 100644 Z64Utils/F3DZEX/Render/CollisionVertexDrawer.cs create mode 100644 Z64Utils/Shaders/collisionVtx.frag create mode 100644 Z64Utils/Shaders/collisionVtx.vert diff --git a/Z64Utils/F3DZEX/Render/CollisionVertexDrawer.cs b/Z64Utils/F3DZEX/Render/CollisionVertexDrawer.cs new file mode 100644 index 0000000..9d5eb71 --- /dev/null +++ b/Z64Utils/F3DZEX/Render/CollisionVertexDrawer.cs @@ -0,0 +1,33 @@ +using OpenTK; +using OpenTK.Graphics.OpenGL; +using System.Drawing; +using System.IO; + +namespace F3DZEX.Render +{ + public class CollisionVertexDrawer : VertexDrawer + { + public CollisionVertexDrawer() + { + _shader = new ShaderHandler(File.ReadAllText("Shaders/collisionVtx.vert"), File.ReadAllText("Shaders/collisionVtx.frag")); + _attrs = new VertexAttribs(); + + _attrs.LayoutAddFloat(3, VertexAttribPointerType.Float, false); + byte[] fakeData = new byte[] { 0, 0, 0 }; + SetVertexData(fakeData, fakeData.Length, BufferUsageHint.StaticDraw); + } + + public void SendProjViewMatrices(ref Matrix4 proj, ref Matrix4 view) + { + _shader.Send("u_Projection", proj); + _shader.Send("u_View", view); + } + + public void SendModelMatrix(Matrix4 model) => _shader.Send("u_Model", model); + + public void SendColor(Color color) + { + _shader.Send("u_Color", color); + } + } +} diff --git a/Z64Utils/F3DZEX/Render/Renderer.cs b/Z64Utils/F3DZEX/Render/Renderer.cs index 0adb437..9377970 100644 --- a/Z64Utils/F3DZEX/Render/Renderer.cs +++ b/Z64Utils/F3DZEX/Render/Renderer.cs @@ -271,6 +271,7 @@ namespace F3DZEX.Render RdpVertexDrawer _rdpVtxDrawer; SimpleVertexDrawer _gridDrawer; ColoredVertexDrawer _axisDrawer; + CollisionVertexDrawer _collisionDrawer; TextDrawer _textDrawer; TextureHandler _tex0; TextureHandler _tex1; @@ -334,6 +335,7 @@ namespace F3DZEX.Render _rdpVtxDrawer = new RdpVertexDrawer(); _gridDrawer = new SimpleVertexDrawer(); _axisDrawer = new ColoredVertexDrawer(); + _collisionDrawer = new CollisionVertexDrawer(); _textDrawer = new TextDrawer(); float[] vertices = RenderHelper.GenerateGridVertices(CurrentConfig.GridScale, 6, false); @@ -383,6 +385,7 @@ namespace F3DZEX.Render _gridDrawer.SendProjViewMatrices(ref proj, ref view); _axisDrawer.SendProjViewMatrices(ref proj, ref view); + _collisionDrawer.SendProjViewMatrices(ref proj, ref view); _rdpVtxDrawer.SendProjViewMatrices(ref proj, ref view); _rdpVtxDrawer.SendInitialColors(CurrentConfig); CheckGLErros(); @@ -392,6 +395,7 @@ namespace F3DZEX.Render _rdpVtxDrawer.SendModelMatrix(ModelMtxStack.Top()); _gridDrawer.SendModelMatrix(Matrix4.Identity); _axisDrawer.SendModelMatrix(Matrix4.Identity); + _collisionDrawer.SendModelMatrix(Matrix4.Identity); CheckGLErros(); _rdpVtxDrawer.SendHighlightColor(CurrentConfig.HighlightColor); @@ -431,6 +435,24 @@ namespace F3DZEX.Render CheckGLErros(); } + // This whole thing is a pretty silly hack to prevent the collision viewer from reusing + // _axisDrawer's shader while drawing collision polygons. + public void PrepareForCollisionRender() + { + if (CurrentConfig.RenderMode == RdpVertexDrawer.ModelRenderMode.Wireframe) + { + GL.PolygonMode(MaterialFace.Front, PolygonMode.Line); + _collisionDrawer.SendColor(CurrentConfig.WireframeColor); + } + else + { + GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill); + _collisionDrawer.SendColor(CurrentConfig.HighlightColor); + } + + _collisionDrawer.Draw(PrimitiveType.Lines); + } + public Dlist GetDlist(uint vaddr) { return new Dlist(Memory, vaddr); diff --git a/Z64Utils/Forms/CollisionViewerForm.Designer.cs b/Z64Utils/Forms/CollisionViewerForm.Designer.cs index 53b8aa3..22890fe 100644 --- a/Z64Utils/Forms/CollisionViewerForm.Designer.cs +++ b/Z64Utils/Forms/CollisionViewerForm.Designer.cs @@ -37,8 +37,12 @@ this.copyToClipboardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.modelViewer = new Z64.Forms.ModelViewerControl(); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripRenderCfgBtn = new System.Windows.Forms.ToolStripButton(); + this.cullingCfgBtn = new System.Windows.Forms.ToolStripButton(); this.statusStrip1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout(); + this.toolStrip1.SuspendLayout(); this.SuspendLayout(); // // statusStrip1 @@ -82,8 +86,8 @@ // // modelViewer // - this.modelViewer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) + this.modelViewer.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.modelViewer.BackColor = System.Drawing.Color.DodgerBlue; this.modelViewer.Location = new System.Drawing.Point(0, 3); @@ -92,14 +96,42 @@ this.modelViewer.RenderCallback = null; this.modelViewer.Size = new System.Drawing.Size(871, 610); this.modelViewer.TabIndex = 4; - this.modelViewer.VSync = false; + this.modelViewer.VSync = true; this.modelViewer.MouseClick += new System.Windows.Forms.MouseEventHandler(this.modelViewer_MouseClick); // + // toolStrip1 + // + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripRenderCfgBtn, + this.cullingCfgBtn}); + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(883, 25); + this.toolStrip1.TabIndex = 10; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripRenderCfgBtn + // + this.toolStripRenderCfgBtn.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripRenderCfgBtn.Name = "toolStripRenderCfgBtn"; + this.toolStripRenderCfgBtn.Size = new System.Drawing.Size(93, 22); + this.toolStripRenderCfgBtn.Text = "Render Settings"; + this.toolStripRenderCfgBtn.Click += new System.EventHandler(this.toolStripRenderCfgBtn_Click); + // + // cullingCfgBtn + // + this.cullingCfgBtn.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cullingCfgBtn.Name = "cullingCfgBtn"; + this.cullingCfgBtn.Size = new System.Drawing.Size(140, 22); + this.cullingCfgBtn.Text = "Disable Backface Culling"; + this.cullingCfgBtn.Click += new System.EventHandler(this.cullingCfgBtn_Click); + // // CollisionViewerForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(883, 638); + this.Controls.Add(this.toolStrip1); this.Controls.Add(this.statusStrip1); this.Controls.Add(this.modelViewer); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); @@ -110,6 +142,8 @@ this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); this.contextMenuStrip1.ResumeLayout(false); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -123,5 +157,8 @@ private System.Windows.Forms.ToolStripMenuItem saveScreenToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem copyToClipboardToolStripMenuItem; private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripButton toolStripRenderCfgBtn; + private System.Windows.Forms.ToolStripButton cullingCfgBtn; } } \ No newline at end of file diff --git a/Z64Utils/Forms/CollisionViewerForm.cs b/Z64Utils/Forms/CollisionViewerForm.cs index 1009d13..1c3c70d 100644 --- a/Z64Utils/Forms/CollisionViewerForm.cs +++ b/Z64Utils/Forms/CollisionViewerForm.cs @@ -32,25 +32,23 @@ namespace Z64.Forms Z64Game _game; F3DZEX.Render.Renderer _renderer; F3DZEX.Render.Renderer.Config _rendererCfg; + SettingsForm _settingsForm; Z64Object.ColHeaderHolder _colHeader; RenderColPoly[] _polygons; - bool _wireframe; - bool _shaded; bool _cullBack; private CollisionViewerForm(Z64Game game) { _game = game; _rendererCfg = new F3DZEX.Render.Renderer.Config(); + _rendererCfg.HighlightColor = Color.Gray; _renderer = new F3DZEX.Render.Renderer(game, _rendererCfg); _colHeader = null; _polygons = null; - _wireframe = true; - _shaded = true; _cullBack = true; InitializeComponent(); @@ -86,6 +84,7 @@ namespace Z64.Forms return; _renderer.RenderStart(proj, view); + _renderer.PrepareForCollisionRender(); if (_cullBack) { @@ -97,34 +96,15 @@ namespace Z64.Forms GL.Disable(EnableCap.CullFace); } - if (_wireframe) + GL.Begin(PrimitiveType.Triangles); + foreach (var poly in _polygons) { - GL.PolygonMode(MaterialFace.Front, PolygonMode.Line); - GL.Color3(Color.Black); - GL.Begin(PrimitiveType.Triangles); - foreach (var poly in _polygons) - { - GL.Normal3(poly.Normal.X, poly.Normal.Y, poly.Normal.Z); - GL.Vertex3(poly.Points[0]); - GL.Vertex3(poly.Points[1]); - GL.Vertex3(poly.Points[2]); - } - GL.End(); - } - if (_shaded) - { - GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill); - GL.Color3(Color.Gray); - GL.Begin(PrimitiveType.Triangles); - foreach (var poly in _polygons) - { - GL.Normal3(poly.Normal.X, poly.Normal.Y, poly.Normal.Z); - GL.Vertex3(poly.Points[0]); - GL.Vertex3(poly.Points[1]); - GL.Vertex3(poly.Points[2]); - } - GL.End(); + GL.Normal3(poly.Normal.X, poly.Normal.Y, poly.Normal.Z); + GL.Vertex3(poly.Points[0]); + GL.Vertex3(poly.Points[1]); + GL.Vertex3(poly.Points[2]); } + GL.End(); } private void NewRender() @@ -166,6 +146,39 @@ namespace Z64.Forms private void ColViewerForm_FormClosed(object sender, FormClosedEventArgs e) { Instance = null; + _settingsForm?.Close(); + } + + private void toolStripRenderCfgBtn_Click(object sender, EventArgs e) + { + if (_settingsForm != null) + { + _settingsForm.Activate(); + } + else + { + _settingsForm = new SettingsForm(_rendererCfg); + _settingsForm.FormClosed += (sender, e) => _settingsForm = null; + _settingsForm.SettingsChanged += (sender, e) => { modelViewer.Render(); }; + _settingsForm.Show(); + } + } + + private void cullingCfgBtn_Click(object sender, EventArgs e) + { + if (_cullBack) + { + _cullBack = false; + cullingCfgBtn.Text = "Enable Backface Culling"; + cullingCfgBtn.ToolTipText = "Enable Backface Culling"; + } + else + { + _cullBack = true; + cullingCfgBtn.Text = "Disable Backface Culling"; + cullingCfgBtn.ToolTipText = "Disable Backface Culling"; + } + modelViewer.Render(); } private void saveScreenToolStripMenuItem_Click(object sender, EventArgs e) diff --git a/Z64Utils/Forms/CollisionViewerForm.resx b/Z64Utils/Forms/CollisionViewerForm.resx index 64fd36a..4ad61d1 100644 --- a/Z64Utils/Forms/CollisionViewerForm.resx +++ b/Z64Utils/Forms/CollisionViewerForm.resx @@ -57,11 +57,23 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + 17, 17 + + + 133, 17 + + + 288, 17 + + + 424, 17 + + 40 - - + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA IACoJQAA7h4AAGBgAAABACAAqJQAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAA diff --git a/Z64Utils/Shaders/collisionVtx.frag b/Z64Utils/Shaders/collisionVtx.frag new file mode 100644 index 0000000..366f431 --- /dev/null +++ b/Z64Utils/Shaders/collisionVtx.frag @@ -0,0 +1,10 @@ +#version 330 core + +in vec4 v_VtxColor; + +out vec4 FragColor; + +void main() +{ + FragColor = v_VtxColor; +} \ No newline at end of file diff --git a/Z64Utils/Shaders/collisionVtx.vert b/Z64Utils/Shaders/collisionVtx.vert new file mode 100644 index 0000000..1bf76a0 --- /dev/null +++ b/Z64Utils/Shaders/collisionVtx.vert @@ -0,0 +1,16 @@ +#version 330 core + +layout (location = 0) in vec3 pos; + +uniform vec4 u_Color; +uniform mat4 u_Projection; +uniform mat4 u_View; +uniform mat4 u_Model; + +out vec4 v_VtxColor; + +void main() +{ + gl_Position = u_Projection * u_View * u_Model * vec4(pos, 1); + v_VtxColor = u_Color; +} \ No newline at end of file diff --git a/Z64Utils/Z64Utils.csproj b/Z64Utils/Z64Utils.csproj index abfdb95..efeafb0 100644 --- a/Z64Utils/Z64Utils.csproj +++ b/Z64Utils/Z64Utils.csproj @@ -42,6 +42,12 @@ SettingsSingleFileGenerator Settings.Designer.cs + + PreserveNewest + + + PreserveNewest + PreserveNewest