mirror of
https://github.com/zeldaret/Z64Utils.git
synced 2026-10-06 17:10:34 -04:00
Improvements to collision viewer
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#version 330 core
|
||||
|
||||
in vec4 v_VtxColor;
|
||||
|
||||
out vec4 FragColor;
|
||||
|
||||
void main()
|
||||
{
|
||||
FragColor = v_VtxColor;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user