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