+ Mesh updating

This commit is contained in:
Michel Fedde 2021-03-24 14:54:49 +01:00
parent 9fa1ac6ad9
commit 58c5bafa1b
4 changed files with 70 additions and 18 deletions

View file

@ -103,6 +103,29 @@ namespace SM.OGL.Mesh
GL.BindVertexArray(0); GL.BindVertexArray(0);
} }
/// <summary>
/// This updates the parts of the mesh, that needs updating.
/// </summary>
public void Update()
{
if (!WasCompiled)
{
Compile();
return;
}
GL.BindVertexArray(_id);
UpdateBoundingBox();
foreach(var attrib in Attributes)
{
if (attrib.ConnectedVBO == null || !attrib.ConnectedVBO.Active || !attrib.ConnectedVBO.CanBeUpdated) continue;
attrib.ConnectedVBO.Update();
}
}
/// <inheritdoc /> /// <inheritdoc />
public override void Dispose() public override void Dispose()
{ {

View file

@ -1,5 +1,6 @@
#region usings #region usings
using System;
using System.Collections.Generic; using System.Collections.Generic;
using OpenTK; using OpenTK;
using OpenTK.Graphics; using OpenTK.Graphics;
@ -14,6 +15,11 @@ namespace SM.OGL.Mesh
/// </summary> /// </summary>
public class VBO : List<float> public class VBO : List<float>
{ {
/// <summary>
/// The ID for the buffer.
/// </summary>
public int BufferID { get; private set; }
/// <summary> /// <summary>
/// Specifies the expected usage pattern of the data store. /// Specifies the expected usage pattern of the data store.
/// </summary> /// </summary>
@ -51,6 +57,11 @@ namespace SM.OGL.Mesh
/// </summary> /// </summary>
public VertexAttribPointerType PointerType; public VertexAttribPointerType PointerType;
/// <summary>
/// If true it can be updated, otherwise it will get ignored, when the mesh gets updated.
/// </summary>
public bool CanBeUpdated = false;
/// <summary> /// <summary>
/// Generates a VBO for inserting mesh data. /// Generates a VBO for inserting mesh data.
/// </summary> /// </summary>
@ -91,12 +102,18 @@ namespace SM.OGL.Mesh
Normalised = normalised; Normalised = normalised;
} }
public void Add(float x)
{
CanBeUpdated = true;
}
/// <summary> /// <summary>
/// Adds two values to the VBO. /// Adds two values to the VBO.
/// </summary> /// </summary>
public void Add(float x, float y) public void Add(float x, float y)
{ {
AddRange(new[] {x, y}); AddRange(new[] {x, y});
CanBeUpdated = true;
} }
/// <summary> /// <summary>
@ -105,6 +122,7 @@ namespace SM.OGL.Mesh
public void Add(float x, float y, float z) public void Add(float x, float y, float z)
{ {
AddRange(new[] {x, y, z}); AddRange(new[] {x, y, z});
CanBeUpdated = true;
} }
/// <summary> /// <summary>
@ -113,6 +131,7 @@ namespace SM.OGL.Mesh
public void Add(float x, float y, float z, float w) public void Add(float x, float y, float z, float w)
{ {
AddRange(new[] {x, y, z, w}); AddRange(new[] {x, y, z, w});
CanBeUpdated = true;
} }
/// <summary> /// <summary>
@ -205,13 +224,23 @@ namespace SM.OGL.Mesh
var data = ToArray(); var data = ToArray();
var buffer = GL.GenBuffer(); BufferID = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, buffer); GL.BindBuffer(BufferTarget.ArrayBuffer, BufferID);
GL.BufferData(BufferTarget.ArrayBuffer, data.Length * sizeof(float), data, BufferUsageHint); GL.BufferData(BufferTarget.ArrayBuffer, data.Length * sizeof(float), data, BufferUsageHint);
GL.VertexAttribPointer(attribID, PointerSize, PointerType, Normalised, PointerStride, PointerOffset); GL.VertexAttribPointer(attribID, PointerSize, PointerType, Normalised, PointerStride, PointerOffset);
GL.EnableVertexAttribArray(attribID); GL.EnableVertexAttribArray(attribID);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
CanBeUpdated = false;
}
internal void Update()
{
var data = ToArray();
GL.BindBuffer(BufferTarget.ArrayBuffer, BufferID);
GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, data.Length * sizeof(float), data);
} }
} }
} }

View file

@ -4,9 +4,12 @@ using OpenTK;
using OpenTK.Graphics; using OpenTK.Graphics;
using OpenTK.Input; using OpenTK.Input;
using SM.Base; using SM.Base;
using SM.Base.Time;
using SM.Base.Window; using SM.Base.Window;
using SM2D; using SM2D;
using SM2D.Controls;
using SM2D.Drawing; using SM2D.Drawing;
using SM2D.Object;
using SM2D.Pipelines; using SM2D.Pipelines;
using SM2D.Scene; using SM2D.Scene;
using Font = SM.Base.Drawing.Text.Font; using Font = SM.Base.Drawing.Text.Font;
@ -19,6 +22,7 @@ namespace SM_TEST
static Scene scene; static Scene scene;
private static Font font; private static Font font;
private static GLWindow window; private static GLWindow window;
private static PolyLine line;
static void Main(string[] args) static void Main(string[] args)
{ {
window = new GLWindow(); window = new GLWindow();
@ -26,15 +30,14 @@ namespace SM_TEST
window.SetRenderPipeline(new TestRenderPipeline()); window.SetRenderPipeline(new TestRenderPipeline());
window.SetScene(scene = new Scene()); window.SetScene(scene = new Scene());
scene.Objects.Add(new DrawObject2D());
scene.Objects.Add(new DrawObject2D() line = new PolyLine(new Vector2[] { Vector2.Zero, Vector2.One }, PolyLineType.Connected);
var display = new DrawObject2D()
{ {
Transform = Mesh = line
{ };
Position = new SM.Base.Types.CVector2(20,20), display.Transform.Size.Set(1);
ZIndex = new SM.Base.Types.CVector1(1) scene.Objects.Add(display);
}
});
window.UpdateFrame += WindowOnUpdateFrame; window.UpdateFrame += WindowOnUpdateFrame;
window.Run(); window.Run();
@ -44,13 +47,10 @@ namespace SM_TEST
private static void WindowOnUpdateFrame(object sender, FrameEventArgs e) private static void WindowOnUpdateFrame(object sender, FrameEventArgs e)
{ {
if (SM.Base.Controls.Keyboard.IsDown(Key.F, true))
{ line.Vertex.RemoveRange(3, 3);
window.WindowFlags = WindowFlags.ExclusiveFullscreen; line.Vertex.Add(Mouse2D.InWorld(window.ViewportCamera as Camera), 0);
window.ChangeFullscreenResolution(DisplayDevice.Default.SelectResolution(1280,720, DisplayDevice.Default.BitsPerPixel, DisplayDevice.Default.RefreshRate)); line.Update();
}
if (SM.Base.Controls.Keyboard.IsDown(Key.W, true)) window.WindowFlags = WindowFlags.Window;
if (SM.Base.Controls.Keyboard.IsDown(Key.B, true)) window.WindowFlags = WindowFlags.BorderlessWindow;
} }

View file

@ -20,7 +20,7 @@ namespace SM_TEST
Framebuffers.Add(_postBuffer); Framebuffers.Add(_postBuffer);
_bloom = new BloomEffect(_postBuffer, hdr: true, .5f) _bloom = new BloomEffect(_postBuffer, hdr: true, .5f)
{ {
Threshold = .8f, Threshold = .5f,
}; };