From da56929f731d94f48a8281670fd3c9c04e0b39b3 Mon Sep 17 00:00:00 2001 From: LarsBrubaker Date: Sat, 27 Jun 2020 08:31:28 -0700 Subject: [PATCH] made alternate rendering for no glGenBuffers --- .../GCodeRenderer/GCodeRenderer.cs | 1 + .../GCodeRenderer/GCodeVertexBuffer.cs | 67 ++++++++++++++++++- Submodules/agg-sharp | 2 +- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs index 48798644b..a8ebb5920 100644 --- a/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs +++ b/MatterControl.OpenGL/GCodeRenderer/GCodeRenderer.cs @@ -382,6 +382,7 @@ namespace MatterHackers.GCodeVisualizer { endFeature = Math.Min(startFeature + 1, featuresOnLayer); } + if (startFeature >= endFeature) { // This can only happen if the start and end are set to the last feature diff --git a/MatterControl.OpenGL/GCodeRenderer/GCodeVertexBuffer.cs b/MatterControl.OpenGL/GCodeRenderer/GCodeVertexBuffer.cs index 76d2877c1..b3b66626c 100644 --- a/MatterControl.OpenGL/GCodeRenderer/GCodeVertexBuffer.cs +++ b/MatterControl.OpenGL/GCodeRenderer/GCodeVertexBuffer.cs @@ -28,7 +28,10 @@ either expressed or implied, of the FreeBSD Project. */ using System; +using System.Collections.Generic; +using MatterHackers.Agg; using MatterHackers.Agg.UI; +using MatterHackers.RenderOpenGl; using MatterHackers.RenderOpenGl.OpenGl; namespace MatterHackers.GCodeVisualizer @@ -42,6 +45,10 @@ namespace MatterHackers.GCodeVisualizer private int vertexID; private int vertexLength; + private List subMeshs; + + private int[] indexData; + private ColorVertexData[] colorData; public GCodeVertexBuffer(int[] indexData, ColorVertexData[] colorData) { @@ -49,12 +56,61 @@ namespace MatterHackers.GCodeVisualizer { GL.GenBuffers(1, out vertexID); GL.GenBuffers(1, out indexID); + SetBufferData(ref indexData, ref colorData); } catch { - return; + this.indexData = indexData; + this.colorData = colorData; + } + } + + private void RenderTriangles(int offset, int count) + { + GL.EnableClientState(ArrayCap.ColorArray); + GL.EnableClientState(ArrayCap.NormalArray); + GL.EnableClientState(ArrayCap.VertexArray); + GL.EnableClientState(ArrayCap.IndexArray); + GL.DisableClientState(ArrayCap.TextureCoordArray); + GL.Disable(EnableCap.Texture2D); + + unsafe + { + fixed (int* pIndexData = indexData) + { + GL.IndexPointer(IndexPointerType.Int, 0, new IntPtr(pIndexData)); + fixed (ColorVertexData* pFixedColorData = colorData) + { + byte* pColorData = (byte*)pFixedColorData; + GL.ColorPointer(4, ColorPointerType.UnsignedByte, ColorVertexData.Stride, new IntPtr(pColorData)); + byte* pNormalData = pColorData + 4; + GL.NormalPointer(NormalPointerType.Float, ColorVertexData.Stride, new IntPtr(pNormalData)); + byte* pPosition = pNormalData + 12; + GL.VertexPointer(3, VertexPointerType.Float, ColorVertexData.Stride, new IntPtr(pPosition)); + // GL.DrawArrays(BeginMode.Triangles, ColorVertexData.Stride, Math.Min(colorData.Length, count)); + GL.DrawRangeElements(BeginMode.Triangles, + 0, + indexData.Length, + count, + DrawElementsType.UnsignedInt, + new IntPtr(pIndexData + offset)); + } + } } + GL.DisableClientState(ArrayCap.IndexArray); + GL.DisableClientState(ArrayCap.NormalArray); + GL.DisableClientState(ArrayCap.VertexArray); + GL.DisableClientState(ArrayCap.ColorArray); + + GL.IndexPointer(IndexPointerType.Int, 0, new IntPtr(0)); + GL.ColorPointer(4, ColorPointerType.UnsignedByte, 0, new IntPtr(0)); + GL.NormalPointer(NormalPointerType.Float, 0, new IntPtr(0)); + GL.VertexPointer(3, VertexPointerType.Float, 0, new IntPtr(0)); + } + + private void SetBufferData(ref int[] indexData, ref ColorVertexData[] colorData) + { // Set vertex data vertexLength = colorData.Length; if (vertexLength > 0) @@ -89,9 +145,16 @@ namespace MatterHackers.GCodeVisualizer if (vertexID == 0) { // not allocated don't render - return; + RenderTriangles(offset, count); } + else + { + RenderBufferData(offset, count); + } + } + private void RenderBufferData(int offset, int count) + { GL.EnableClientState(ArrayCap.ColorArray); GL.EnableClientState(ArrayCap.NormalArray); GL.EnableClientState(ArrayCap.VertexArray); diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 668706e8a..1e567e43d 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 668706e8a6f45ddacbe634bee6335136f0a7214d +Subproject commit 1e567e43d2c94fc5723a8e28f56dd43d3f9728cf