Improvements to collision viewer

This commit is contained in:
tom-overton
2022-10-13 02:26:28 -07:00
parent bebeadea95
commit da588cb20f
8 changed files with 185 additions and 36 deletions
@@ -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);
}
}
}
+22
View File
@@ -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);
+40 -3
View File
@@ -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;
}
}
+43 -30
View File
@@ -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)
+15 -3
View File
@@ -57,11 +57,23 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="$this.TrayHeight" type="System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e">
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>133, 17</value>
</metadata>
<metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>288, 17</value>
</metadata>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>424, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>40</value>
</metadata>
<assembly alias="System.Drawing.Common" name="System.Drawing.Common, Version=4.0.2.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing.Common" mimetype="application/x-microsoft.net.object.bytearray.base64">
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
IACoJQAA7h4AAGBgAAABACAAqJQAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAAAAAAAAAAAAAAA
+10
View File
@@ -0,0 +1,10 @@
#version 330 core
in vec4 v_VtxColor;
out vec4 FragColor;
void main()
{
FragColor = v_VtxColor;
}
+16
View File
@@ -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;
}
+6
View File
@@ -42,6 +42,12 @@
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Update="Shaders\collisionVtx.frag">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Shaders\collisionVtx.vert">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Shaders\coloredVtx.frag">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>