From 776bb9fcb3ffe2eb2e45ffc11e9a4264a4ee85cc Mon Sep 17 00:00:00 2001 From: bird_egop Date: Sat, 6 Jun 2026 01:24:09 +0300 Subject: [PATCH] almost nail down the rendering --- NResUI/Rendering.zip | Bin 0 -> 18195 bytes .../Viewport/Meshes/PrimitiveMeshes.cs | 216 +++++++++++------- .../Viewport/Msh/MshViewportLoader.cs | 2 +- NResUI/Rendering/Viewport/ViewportRenderer.cs | 9 +- 4 files changed, 141 insertions(+), 86 deletions(-) create mode 100644 NResUI/Rendering.zip diff --git a/NResUI/Rendering.zip b/NResUI/Rendering.zip new file mode 100644 index 0000000000000000000000000000000000000000..00430b11a6cd47235020317ab204b2cdd7951066 GIT binary patch literal 18195 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 + var indices = new List(); - // back - -1, -1, -1, 1, 0, 1, - 1, -1, -1, 0, 1, 1, - 1, 1, -1, 1, 1, 1, - -1, 1, -1, 0.5f, 0.5f, 0.5f, - }; + AddCubeFace( + vertices, indices, + new Vector3(-1, -1, 1), + new Vector3( 1, -1, 1), + new Vector3( 1, 1, 1), + new Vector3(-1, 1, 1), + new Vector3(0, 0, 1), + new Vector3(1, 0, 0)); - uint[] indices = - { - // front - 0, 1, 2, - 2, 3, 0, + AddCubeFace( + vertices, indices, + new Vector3( 1, -1, -1), + new Vector3(-1, -1, -1), + new Vector3(-1, 1, -1), + new Vector3( 1, 1, -1), + new Vector3(0, 0, -1), + new Vector3(0, 1, 0)); - // right - 1, 5, 6, - 6, 2, 1, + AddCubeFace( + vertices, indices, + new Vector3(-1, -1, -1), + new Vector3(-1, -1, 1), + new Vector3(-1, 1, 1), + new Vector3(-1, 1, -1), + new Vector3(-1, 0, 0), + new Vector3(0, 0, 1)); - // back - 5, 4, 7, - 7, 6, 5, + AddCubeFace( + vertices, indices, + new Vector3(1, -1, 1), + new Vector3(1, -1, -1), + new Vector3(1, 1, -1), + new Vector3(1, 1, 1), + new Vector3(1, 0, 0), + new Vector3(1, 1, 0)); - // left - 4, 0, 3, - 3, 7, 4, + AddCubeFace( + vertices, indices, + new Vector3(-1, 1, 1), + new Vector3( 1, 1, 1), + new Vector3( 1, 1, -1), + new Vector3(-1, 1, -1), + new Vector3(0, 1, 0), + new Vector3(1, 0, 1)); - // top - 3, 2, 6, - 6, 7, 3, + AddCubeFace( + vertices, indices, + new Vector3(-1, -1, -1), + new Vector3( 1, -1, -1), + new Vector3( 1, -1, 1), + new Vector3(-1, -1, 1), + new Vector3(0, -1, 0), + new Vector3(0, 1, 1)); - // bottom - 4, 5, 1, - 1, 0, 4, - }; - - return CreateIndexedMesh(gl, vertices, indices, PrimitiveType.Triangles); + return CreateColoredIndexedMesh(gl, vertices, indices, PrimitiveType.Triangles); } public static GpuMesh CreateWorldGrid( @@ -72,25 +85,15 @@ public static unsafe class PrimitiveMeshes var vertices = new List(); var indices = new List(); - void AddVertex(float x, float y, float z, float r, float g, float b) - { - vertices.Add(x); - vertices.Add(y); - vertices.Add(z); - vertices.Add(r); - vertices.Add(g); - vertices.Add(b); - } - void AddLine( float x0, float y0, float z0, float x1, float y1, float z1, float r, float g, float b) { - var startIndex = (uint)(vertices.Count / 6); + var startIndex = (uint)(vertices.Count / 9); - AddVertex(x0, y0, z0, r, g, b); - AddVertex(x1, y1, z1, r, g, b); + AddVertex(vertices, x0, y0, z0, r, g, b, 0, 1, 0); + AddVertex(vertices, x1, y1, z1, r, g, b, 0, 1, 0); indices.Add(startIndex); indices.Add(startIndex + 1); @@ -132,30 +135,88 @@ public static unsafe class PrimitiveMeshes return CreateIndexedMesh(gl, vertices.ToArray(), indices.ToArray(), PrimitiveType.Lines); } + private static void AddCubeFace( + List vertices, + List indices, + Vector3 a, + Vector3 b, + Vector3 c, + Vector3 d, + Vector3 normal, + Vector3 color) + { + var start = (uint)(vertices.Count / 9); + + AddVertex(vertices, a.X, a.Y, a.Z, color.X, color.Y, color.Z, normal.X, normal.Y, normal.Z); + AddVertex(vertices, b.X, b.Y, b.Z, color.X, color.Y, color.Z, normal.X, normal.Y, normal.Z); + AddVertex(vertices, c.X, c.Y, c.Z, color.X, color.Y, color.Z, normal.X, normal.Y, normal.Z); + AddVertex(vertices, d.X, d.Y, d.Z, color.X, color.Y, color.Z, normal.X, normal.Y, normal.Z); + + indices.Add(start + 0); + indices.Add(start + 1); + indices.Add(start + 2); + + indices.Add(start + 2); + indices.Add(start + 3); + indices.Add(start + 0); + } public static GpuMesh CreateUnitWireBox(GL gl) { - float[] vertices = + var vertices = new List(); + var indices = new List(); + + var color = new Vector3(1.0f, 0.82f, 0.15f); + + Vector3[] corners = { - -1, -1, -1, 1.0f, 0.82f, 0.15f, - 1, -1, -1, 1.0f, 0.82f, 0.15f, - 1, 1, -1, 1.0f, 0.82f, 0.15f, - -1, 1, -1, 1.0f, 0.82f, 0.15f, - -1, -1, 1, 1.0f, 0.82f, 0.15f, - 1, -1, 1, 1.0f, 0.82f, 0.15f, - 1, 1, 1, 1.0f, 0.82f, 0.15f, - -1, 1, 1, 1.0f, 0.82f, 0.15f, + new(-1, -1, -1), + new( 1, -1, -1), + new( 1, 1, -1), + new(-1, 1, -1), + new(-1, -1, 1), + new( 1, -1, 1), + new( 1, 1, 1), + new(-1, 1, 1), }; - uint[] indices = + foreach (var corner in corners) + { + AddVertex(vertices, corner.X, corner.Y, corner.Z, color.X, color.Y, color.Z); + } + + uint[] lineIndices = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7, }; - return CreateIndexedMesh(gl, vertices, indices, PrimitiveType.Lines); + indices.AddRange(lineIndices); + + return CreateIndexedMesh(gl, vertices.ToArray(), indices.ToArray(), PrimitiveType.Lines); + } + + private static void AddVertex( + List vertices, + float x, float y, float z, + float r, float g, float b, + float nx = 0.0f, + float ny = 1.0f, + float nz = 0.0f) + { + vertices.Add(x); + vertices.Add(y); + vertices.Add(z); + + vertices.Add(r); + vertices.Add(g); + vertices.Add(b); + + vertices.Add(nx); + vertices.Add(ny); + vertices.Add(nz); } public static GpuMesh CreateAxes(GL gl, float length = 1.0f) @@ -163,26 +224,25 @@ public static unsafe class PrimitiveMeshes if (length <= 0.0f) throw new ArgumentOutOfRangeException(nameof(length)); - float[] vertices = + var vertices = new List(); + var indices = new List(); + + void AddLine(Vector3 a, Vector3 b, Vector3 color) { - 0, 0, 0, 1.0f, 0.25f, 0.25f, - length, 0, 0, 1.0f, 0.25f, 0.25f, + var start = (uint)(vertices.Count / 9); - 0, 0, 0, 0.25f, 1.0f, 0.25f, - 0, length, 0, 0.25f, 1.0f, 0.25f, + AddVertex(vertices, a.X, a.Y, a.Z, color.X, color.Y, color.Z); + AddVertex(vertices, b.X, b.Y, b.Z, color.X, color.Y, color.Z); - 0, 0, 0, 0.25f, 0.45f, 1.0f, - 0, 0, length, 0.25f, 0.45f, 1.0f, - }; + indices.Add(start); + indices.Add(start + 1); + } - uint[] indices = - { - 0, 1, - 2, 3, - 4, 5, - }; + AddLine(Vector3.Zero, new Vector3(length, 0, 0), new Vector3(1.0f, 0.25f, 0.25f)); + AddLine(Vector3.Zero, new Vector3(0, length, 0), new Vector3(0.25f, 1.0f, 0.25f)); + AddLine(Vector3.Zero, new Vector3(0, 0, length), new Vector3(0.25f, 0.45f, 1.0f)); - return CreateIndexedMesh(gl, vertices, indices, PrimitiveType.Lines); + return CreateIndexedMesh(gl, vertices.ToArray(), indices.ToArray(), PrimitiveType.Lines); } public static GpuMesh CreateColoredIndexedMesh( diff --git a/NResUI/Rendering/Viewport/Msh/MshViewportLoader.cs b/NResUI/Rendering/Viewport/Msh/MshViewportLoader.cs index 1776a68..332bd1d 100644 --- a/NResUI/Rendering/Viewport/Msh/MshViewportLoader.cs +++ b/NResUI/Rendering/Viewport/Msh/MshViewportLoader.cs @@ -178,7 +178,7 @@ public static class MshViewportLoader ref Vector3 boundsMax ) { - var vertexIndex = (uint)(vertices.Count / 6); + var vertexIndex = (uint)(vertices.Count / 9); vertices.Add(position.X); vertices.Add(position.Y); diff --git a/NResUI/Rendering/Viewport/ViewportRenderer.cs b/NResUI/Rendering/Viewport/ViewportRenderer.cs index b1bdc11..facd1a6 100644 --- a/NResUI/Rendering/Viewport/ViewportRenderer.cs +++ b/NResUI/Rendering/Viewport/ViewportRenderer.cs @@ -93,16 +93,11 @@ public sealed class ViewportRenderer if (grid == null || !grid.IsVisible) return; - var model = grid.LocalTransform * sceneRotation; - var mvp = model * view * projection; - _gl.Disable(EnableCap.StencilTest); _gl.PolygonMode(TriangleFace.FrontAndBack, PolygonMode.Fill); - _meshShader.Use(); - _meshShader.SetMatrix4(_mvpLocation, mvp); - grid.Mesh.Draw(); - + var model = grid.LocalTransform * sceneRotation; + DrawMesh(grid.Mesh, model, view, projection); } private void DrawScene(