From 8d846c8563a2a7e51f12aa6db9f2fc6c1197e47c Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Tue, 14 Dec 2021 16:35:53 +0100 Subject: [PATCH 1/9] Fixed all compiler errors --- .../ComputeFractal/Core/ComputeFractal.cs | 2 +- src/Engine/Common/AttributeLocations.cs | 22 +- src/Engine/Common/IRenderContextImp.cs | 10 +- src/Engine/Common/IStorageBuffer.cs | 2 +- src/Engine/Core/Effects/StorageBuffer.cs | 4 +- src/Engine/Core/RenderContext.cs | 11 +- .../Imp/Graphics/Android/BufferHandle.cs | 28 + .../Graphics/{Shared => Android}/MeshImp.cs | 14 - .../Imp/Graphics/Android/RenderContextImp.cs | 22 +- .../{Shared => Android}/ShaderHandleImp.cs | 4 - .../{Shared => Android}/TextureHandle.cs | 6 +- .../Imp/Graphics/Blazor/RenderContextImp.cs | 2 +- .../Imp/Graphics/Blazor/ShaderHandleImp.cs | 13 + src/Engine/Imp/Graphics/Blazor/ShaderParam.cs | 9 - .../Imp/Graphics/Desktop/AttributeImp.cs | 13 + .../{Shared => Desktop}/BufferHandle.cs | 11 +- .../Fusee.Engine.Imp.Graphics.Desktop.csproj | 2 +- src/Engine/Imp/Graphics/Desktop/MeshImp.cs | 220 ++++ .../Imp/Graphics/Desktop/RenderCanvasImp.cs | 7 +- .../Imp/Graphics/Desktop/RenderContextImp.cs | 945 ++++++++++-------- .../Imp/Graphics/Desktop/ShaderHandleImp.cs | 13 + .../Imp/Graphics/Desktop/TextureHandle.cs | 14 + .../Imp/Graphics/Desktop/TexturePixelInfo.cs | 2 +- ...Fusee.Engine.Imp.Graphics.Shared.projitems | 4 - 24 files changed, 869 insertions(+), 511 deletions(-) create mode 100644 src/Engine/Imp/Graphics/Android/BufferHandle.cs rename src/Engine/Imp/Graphics/{Shared => Android}/MeshImp.cs (95%) rename src/Engine/Imp/Graphics/{Shared => Android}/ShaderHandleImp.cs (75%) rename src/Engine/Imp/Graphics/{Shared => Android}/TextureHandle.cs (66%) create mode 100644 src/Engine/Imp/Graphics/Blazor/ShaderHandleImp.cs create mode 100644 src/Engine/Imp/Graphics/Desktop/AttributeImp.cs rename src/Engine/Imp/Graphics/{Shared => Desktop}/BufferHandle.cs (70%) create mode 100644 src/Engine/Imp/Graphics/Desktop/MeshImp.cs create mode 100644 src/Engine/Imp/Graphics/Desktop/ShaderHandleImp.cs create mode 100644 src/Engine/Imp/Graphics/Desktop/TextureHandle.cs diff --git a/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs b/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs index 06e9236ab..9d288ca0a 100644 --- a/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs +++ b/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs @@ -125,7 +125,7 @@ public override void RenderAFrame() MoveFractal(); RWTexture.AsImage = true; RC.SetEffect(_computeShader); - RC.DispatchCompute(-1, RWTexture.Width / 16, RWTexture.Width / 16, 1); + RC.DispatchCompute(-1, (uint)(RWTexture.Width / 16), (uint)(RWTexture.Width / 16), 1); RC.MemoryBarrier(); RWTexture.AsImage = false; diff --git a/src/Engine/Common/AttributeLocations.cs b/src/Engine/Common/AttributeLocations.cs index 8ae9bdd22..77ec729a6 100644 --- a/src/Engine/Common/AttributeLocations.cs +++ b/src/Engine/Common/AttributeLocations.cs @@ -8,56 +8,56 @@ public static class AttributeLocations /// /// The vertex attribute location index. /// - public static readonly int VertexAttribLocation = 0; + public static readonly uint VertexAttribLocation = 0; /// /// The color attribute location index. /// - public static readonly int ColorAttribLocation = 1; + public static readonly uint ColorAttribLocation = 1; /// /// The color attribute location index. /// - public static readonly int Color1AttribLocation = 2; + public static readonly uint Color1AttribLocation = 2; /// /// The color attribute location index. /// - public static readonly int Color2AttribLocation = 3; + public static readonly uint Color2AttribLocation = 3; /// /// The normal attribute location index. /// - public static readonly int NormalAttribLocation = 4; + public static readonly uint NormalAttribLocation = 4; /// /// The uv attribute location index. /// - public static readonly int UvAttribLocation = 5; + public static readonly uint UvAttribLocation = 5; /// /// The tangent attribute location index. /// - public static readonly int TangentAttribLocation = 6; + public static readonly uint TangentAttribLocation = 6; /// /// The bitangent attribute location index. /// - public static readonly int BitangentAttribLocation = 7; + public static readonly uint BitangentAttribLocation = 7; /// /// The bone weight attribute location index. /// - public static readonly int BoneWeightAttribLocation = 8; + public static readonly uint BoneWeightAttribLocation = 8; /// /// The bone index attribute location index. /// - public static readonly int BoneIndexAttribLocation = 9; + public static readonly uint BoneIndexAttribLocation = 9; /// /// The Fusee platform id attribute location index. /// - public static readonly int FuseePlatformIdLocation = 10; + public static readonly uint FuseePlatformIdLocation = 10; } } \ No newline at end of file diff --git a/src/Engine/Common/IRenderContextImp.cs b/src/Engine/Common/IRenderContextImp.cs index 90c29b5f9..cd447152b 100644 --- a/src/Engine/Common/IRenderContextImp.cs +++ b/src/Engine/Common/IRenderContextImp.cs @@ -647,7 +647,7 @@ public interface IRenderContextImp /// The number of work groups to be launched in the X dimension. /// The number of work groups to be launched in the Y dimension. /// he number of work groups to be launched in the Z dimension. - void DispatchCompute(int kernelIndex, int threadGroupsX, int threadGroupsY, int threadGroupsZ); + void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGroupsY, uint threadGroupsZ); /// /// Defines a barrier ordering memory transactions. At the moment it will insert all supported barriers. @@ -655,14 +655,6 @@ public interface IRenderContextImp /// void MemoryBarrier(); - /// - /// Draws a Debug Line in 3D Space by using a start and end point (float3). - /// - /// The start point of the DebugLine. - /// The endpoint of the DebugLine. - /// The color of the DebugLine. - void DebugLine(float3 start, float3 end, float4 color); - /// /// Gets the content of the buffer. /// diff --git a/src/Engine/Common/IStorageBuffer.cs b/src/Engine/Common/IStorageBuffer.cs index 8a04d6fd7..e2316202a 100644 --- a/src/Engine/Common/IStorageBuffer.cs +++ b/src/Engine/Common/IStorageBuffer.cs @@ -26,6 +26,6 @@ public interface IStorageBuffer : IDisposable /// The binding index point the SSBO will be bound to. /// Caution: the binding point should not be hard coded in the shader code! /// - int BindingIndex { get; set; } + uint BindingIndex { get; set; } } } \ No newline at end of file diff --git a/src/Engine/Core/Effects/StorageBuffer.cs b/src/Engine/Core/Effects/StorageBuffer.cs index 23d39b192..929b0d4e8 100644 --- a/src/Engine/Core/Effects/StorageBuffer.cs +++ b/src/Engine/Core/Effects/StorageBuffer.cs @@ -13,7 +13,7 @@ public class StorageBuffer : IStorageBuffer where T : struct /// The binding index point the SSBO will be bound to. /// Caution: the binding point should not be hard coded in the shader code! /// - public int BindingIndex { get; set; } + public uint BindingIndex { get; set; } /// /// Return the number of buffer elements. @@ -56,7 +56,7 @@ public IBufferHandle BufferHandle /// The (fixed) count of buffer elements. /// The size (byte) of one buffer element. /// Int that needs to be unique throughout the shader. - public StorageBuffer(RenderCanvas rc, int count, int tSize, int blockBindingIndex) + public StorageBuffer(RenderCanvas rc, int count, int tSize, uint blockBindingIndex) { _count = count; _tSize = tSize; diff --git a/src/Engine/Core/RenderContext.cs b/src/Engine/Core/RenderContext.cs index d68744b29..8a2515c5f 100644 --- a/src/Engine/Core/RenderContext.cs +++ b/src/Engine/Core/RenderContext.cs @@ -1657,7 +1657,7 @@ public void MemoryBarrier() /// The number of work groups to be launched in the X dimension. /// The number of work groups to be launched in the Y dimension. /// he number of work groups to be launched in the Z dimension. - public void DispatchCompute(int kernelIndex, int threadGroupsX, int threadGroupsY, int threadGroupsZ) + public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGroupsY, uint threadGroupsZ) { if (_currentEffect == null) throw new NullReferenceException("No Compute Shader bound."); if (_currentEffect.GetType() != typeof(ComputeShader)) throw new NullReferenceException("Bound Effect isn't a Compute Shader."); @@ -1723,8 +1723,7 @@ public void Render(Mesh m, bool renderForward = true) var compiledEffect = _allCompiledEffects[_currentEffect]; - try - { + CompiledEffect cFx; if (renderForward) { @@ -1776,11 +1775,7 @@ public void Render(Mesh m, bool renderForward = true) // After rendering all passes cleanup shader effect _effectManager.Cleanup(); - } - catch (Exception ex) - { - throw new Exception("Error while rendering pass ", ex); - } + } private float2 CalculateClippingPlanesFromProjection() diff --git a/src/Engine/Imp/Graphics/Android/BufferHandle.cs b/src/Engine/Imp/Graphics/Android/BufferHandle.cs new file mode 100644 index 000000000..da9a5f5e6 --- /dev/null +++ b/src/Engine/Imp/Graphics/Android/BufferHandle.cs @@ -0,0 +1,28 @@ +using Fusee.Engine.Common; + +namespace Fusee.Engine.Imp.Graphics.Android +{ + /// + /// RenderBuffer for OpenGL, an integer value is used as a handle + /// + internal class RenderBufferHandle : IBufferHandle + { + internal int Handle = -1; + } + + /// + /// FrameBuffer for OpenGL, an integer value is used as a handle + /// + internal class FrameBufferHandle : IBufferHandle + { + internal int Handle = -1; + } + + /// + /// StorageBuffer for OpenGL, an integer value is used as a handle + /// + class StorageBufferHandle : IBufferHandle + { + internal int Handle = -1; + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Shared/MeshImp.cs b/src/Engine/Imp/Graphics/Android/MeshImp.cs similarity index 95% rename from src/Engine/Imp/Graphics/Shared/MeshImp.cs rename to src/Engine/Imp/Graphics/Android/MeshImp.cs index b449da5a1..4b6fe325b 100644 --- a/src/Engine/Imp/Graphics/Shared/MeshImp.cs +++ b/src/Engine/Imp/Graphics/Android/MeshImp.cs @@ -1,21 +1,7 @@ using Fusee.Engine.Common; -#if PLATFORM_DESKTOP - -namespace Fusee.Engine.Imp.Graphics.Desktop -#elif PLATFORM_ANDROID - namespace Fusee.Engine.Imp.Graphics.Android -#endif { - /// - /// Contains a handle for any type of attribute buffer stored on GPU memory such as vertices, normals, uvs etc. - /// - public class AttributeImp : IAttribImp - { - internal int AttributeBufferObject; - } - /// /// This is the implementation of the interface. /// It is used to check the status of the informations of a mesh and flush informations if required. diff --git a/src/Engine/Imp/Graphics/Android/RenderContextImp.cs b/src/Engine/Imp/Graphics/Android/RenderContextImp.cs index f0407f732..1f7af7552 100644 --- a/src/Engine/Imp/Graphics/Android/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Android/RenderContextImp.cs @@ -613,16 +613,16 @@ public IShaderHandle CreateShaderProgram(string vs, string ps, string gs = null) GL.AttachShader(program, vertexObject); // enable GLSL (ES) shaders to use fuVertex, fuColor and fuNormal attributes - GL.BindAttribLocation(program, AttributeLocations.VertexAttribLocation, UniformNameDeclarations.Vertex); - GL.BindAttribLocation(program, AttributeLocations.ColorAttribLocation, UniformNameDeclarations.VertexColor); - GL.BindAttribLocation(program, AttributeLocations.Color1AttribLocation, UniformNameDeclarations.VertexColor1); - GL.BindAttribLocation(program, AttributeLocations.Color2AttribLocation, UniformNameDeclarations.VertexColor2); - GL.BindAttribLocation(program, AttributeLocations.UvAttribLocation, UniformNameDeclarations.TextureCoordinates); - GL.BindAttribLocation(program, AttributeLocations.NormalAttribLocation, UniformNameDeclarations.Normal); - GL.BindAttribLocation(program, AttributeLocations.TangentAttribLocation, UniformNameDeclarations.Tangent); - GL.BindAttribLocation(program, AttributeLocations.BoneIndexAttribLocation, UniformNameDeclarations.BoneIndex); - GL.BindAttribLocation(program, AttributeLocations.BoneWeightAttribLocation, UniformNameDeclarations.BoneWeight); - GL.BindAttribLocation(program, AttributeLocations.BitangentAttribLocation, UniformNameDeclarations.Bitangent); + GL.BindAttribLocation(program, (int)AttributeLocations.VertexAttribLocation, UniformNameDeclarations.Vertex); + GL.BindAttribLocation(program, (int)AttributeLocations.ColorAttribLocation, UniformNameDeclarations.VertexColor); + GL.BindAttribLocation(program, (int)AttributeLocations.Color1AttribLocation, UniformNameDeclarations.VertexColor1); + GL.BindAttribLocation(program, (int)AttributeLocations.Color2AttribLocation, UniformNameDeclarations.VertexColor2); + GL.BindAttribLocation(program, (int)AttributeLocations.UvAttribLocation, UniformNameDeclarations.TextureCoordinates); + GL.BindAttribLocation(program, (int)AttributeLocations.NormalAttribLocation, UniformNameDeclarations.Normal); + GL.BindAttribLocation(program, (int)AttributeLocations.TangentAttribLocation, UniformNameDeclarations.Tangent); + GL.BindAttribLocation(program, (int)AttributeLocations.BoneIndexAttribLocation, UniformNameDeclarations.BoneIndex); + GL.BindAttribLocation(program, (int)AttributeLocations.BoneWeightAttribLocation, UniformNameDeclarations.BoneWeight); + GL.BindAttribLocation(program, (int)AttributeLocations.BitangentAttribLocation, UniformNameDeclarations.Bitangent); GL.LinkProgram(program); return new ShaderHandleImp { Handle = program }; @@ -1618,7 +1618,7 @@ public void MemoryBarrier() /// The number of work groups to be launched in the X dimension. /// The number of work groups to be launched in the Y dimension. /// he number of work groups to be launched in the Z dimension. - public void DispatchCompute(int kernelIndex, int threadGroupsX, int threadGroupsY, int threadGroupsZ) + public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGroupsY, uint threadGroupsZ) { GL.DispatchCompute(threadGroupsX, threadGroupsY, threadGroupsZ); } diff --git a/src/Engine/Imp/Graphics/Shared/ShaderHandleImp.cs b/src/Engine/Imp/Graphics/Android/ShaderHandleImp.cs similarity index 75% rename from src/Engine/Imp/Graphics/Shared/ShaderHandleImp.cs rename to src/Engine/Imp/Graphics/Android/ShaderHandleImp.cs index da2a64344..3f3b11220 100644 --- a/src/Engine/Imp/Graphics/Shared/ShaderHandleImp.cs +++ b/src/Engine/Imp/Graphics/Android/ShaderHandleImp.cs @@ -1,10 +1,6 @@ using Fusee.Engine.Common; -#if PLATFORM_DESKTOP -namespace Fusee.Engine.Imp.Graphics.Desktop -#elif PLATFORM_ANDROID namespace Fusee.Engine.Imp.Graphics.Android -#endif { /// /// Implementation of for usage with OpenTK framework. diff --git a/src/Engine/Imp/Graphics/Shared/TextureHandle.cs b/src/Engine/Imp/Graphics/Android/TextureHandle.cs similarity index 66% rename from src/Engine/Imp/Graphics/Shared/TextureHandle.cs rename to src/Engine/Imp/Graphics/Android/TextureHandle.cs index 0c29976f0..2a3365aa4 100644 --- a/src/Engine/Imp/Graphics/Shared/TextureHandle.cs +++ b/src/Engine/Imp/Graphics/Android/TextureHandle.cs @@ -1,13 +1,9 @@ using Fusee.Engine.Common; -#if PLATFORM_DESKTOP -namespace Fusee.Engine.Imp.Graphics.Desktop -#elif PLATFORM_ANDROID namespace Fusee.Engine.Imp.Graphics.Android -#endif { /// - /// Texture Implementation for OpenTK, an integer value is used as a handle + /// Texture Implementation for OpenGL, an integer value is used as a handle /// class TextureHandle : ITextureHandle { diff --git a/src/Engine/Imp/Graphics/Blazor/RenderContextImp.cs b/src/Engine/Imp/Graphics/Blazor/RenderContextImp.cs index f69aea5d2..e79d68ba8 100644 --- a/src/Engine/Imp/Graphics/Blazor/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Blazor/RenderContextImp.cs @@ -2516,7 +2516,7 @@ public void ConnectBufferToShaderStorage(IShaderHandle currentProgram, IStorageB /// /// /// - public void DispatchCompute(int kernelIndex, int threadGroupsX, int threadGroupsY, int threadGroupsZ) + public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGroupsY, uint threadGroupsZ) { throw new NotImplementedException(); } diff --git a/src/Engine/Imp/Graphics/Blazor/ShaderHandleImp.cs b/src/Engine/Imp/Graphics/Blazor/ShaderHandleImp.cs new file mode 100644 index 000000000..232a42e5d --- /dev/null +++ b/src/Engine/Imp/Graphics/Blazor/ShaderHandleImp.cs @@ -0,0 +1,13 @@ +using Fusee.Engine.Common; + +namespace Fusee.Engine.Imp.Graphics.Blazor +{ + /// + /// Implementation of the + /// This object is passed to WebGL and represents a shader program + /// + public class ShaderHandleImp : IShaderHandle + { + internal WebGLProgram Handle; + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Blazor/ShaderParam.cs b/src/Engine/Imp/Graphics/Blazor/ShaderParam.cs index b7e6b8edf..0869290d2 100644 --- a/src/Engine/Imp/Graphics/Blazor/ShaderParam.cs +++ b/src/Engine/Imp/Graphics/Blazor/ShaderParam.cs @@ -10,13 +10,4 @@ public class ShaderParam : IShaderParam { internal WebGLUniformLocation handle; } - - /// - /// Implementation of the - /// This object is passed to WebGL and represents a shader program - /// - public class ShaderHandleImp : IShaderHandle - { - internal WebGLProgram Handle; - } } \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/AttributeImp.cs b/src/Engine/Imp/Graphics/Desktop/AttributeImp.cs new file mode 100644 index 000000000..3a1c3d4d7 --- /dev/null +++ b/src/Engine/Imp/Graphics/Desktop/AttributeImp.cs @@ -0,0 +1,13 @@ +using Fusee.Engine.Common; +using OpenTK.Graphics; + +namespace Fusee.Engine.Imp.Graphics.Desktop +{ + /// + /// Contains a handle for any type of attribute buffer stored on GPU memory such as vertices, normals, uvs etc. + /// + public class AttributeImp : IAttribImp + { + internal BufferHandle AttributeBufferObject; + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Shared/BufferHandle.cs b/src/Engine/Imp/Graphics/Desktop/BufferHandle.cs similarity index 70% rename from src/Engine/Imp/Graphics/Shared/BufferHandle.cs rename to src/Engine/Imp/Graphics/Desktop/BufferHandle.cs index 9e54e63ed..4bcd3deb0 100644 --- a/src/Engine/Imp/Graphics/Shared/BufferHandle.cs +++ b/src/Engine/Imp/Graphics/Desktop/BufferHandle.cs @@ -1,17 +1,14 @@ using Fusee.Engine.Common; +using OpenTK.Graphics; -#if PLATFORM_DESKTOP namespace Fusee.Engine.Imp.Graphics.Desktop -#elif PLATFORM_ANDROID -namespace Fusee.Engine.Imp.Graphics.Android -#endif { /// /// RenderBuffer for OpenTK, an integer value is used as a handle /// public class RenderBufferHandle : IBufferHandle { - internal int Handle = -1; + internal RenderbufferHandle Handle = new(-1); } /// @@ -19,11 +16,11 @@ public class RenderBufferHandle : IBufferHandle /// class FrameBufferHandle : IBufferHandle { - internal int Handle = -1; + internal FramebufferHandle Handle = new(-1); } class StorageBufferHandle : IBufferHandle { - internal int Handle = -1; + internal BufferHandle Handle = new(-1); } } \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index abaaf16dc..43b8ecb7d 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -28,7 +28,7 @@ analyzers - + diff --git a/src/Engine/Imp/Graphics/Desktop/MeshImp.cs b/src/Engine/Imp/Graphics/Desktop/MeshImp.cs new file mode 100644 index 000000000..40dd1c95d --- /dev/null +++ b/src/Engine/Imp/Graphics/Desktop/MeshImp.cs @@ -0,0 +1,220 @@ +using Fusee.Engine.Common; +using OpenTK.Graphics; + +namespace Fusee.Engine.Imp.Graphics.Desktop +{ + /// + /// This is the implementation of the interface. + /// It is used to check the status of the informations of a mesh and flush informations if required. + /// + public class MeshImp : IMeshImp + { + #region Internal Fields + + internal VertexArrayHandle VertexArrayObject; + internal BufferHandle VertexBufferObject; + internal BufferHandle NormalBufferObject; + internal BufferHandle ColorBufferObject; + internal BufferHandle ColorBufferObject1; + internal BufferHandle ColorBufferObject2; + internal BufferHandle UVBufferObject; + internal BufferHandle BoneIndexBufferObject; + internal BufferHandle BoneWeightBufferObject; + internal BufferHandle ElementBufferObject; + internal BufferHandle TangentBufferObject; + internal BufferHandle BitangentBufferObject; + internal int NElements; + + #endregion Internal Fields + + #region Public Fields & Members pairs + + /// + /// Invalidates the VertexArrayObject. + /// + public void InvalidateVertexArrayObject() + { + VertexArrayObject.Handle = 0; + } + + /// + /// Gets a value indicating whether [VertexArrayObject set]. + /// + /// + /// true if [VertexArrayObject set]; otherwise, false. + /// + public bool VertexArrayObjectSet { get { return VertexArrayObject.Handle != 0; } } + + /// + /// Invalidates the vertices. + /// + public void InvalidateVertices() + { + VertexBufferObject.Handle = 0; + } + /// + /// Gets a value indicating whether [vertices set]. + /// + /// + /// true if [vertices set]; otherwise, false. + /// + public bool VerticesSet { get { return VertexBufferObject.Handle != 0; } } + + /// + /// Invalidates the normals. + /// + public void InvalidateNormals() + { + NormalBufferObject.Handle = 0; + } + /// + /// Gets a value indicating whether [normals set]. + /// + /// + /// true if [normals set]; otherwise, false. + /// + public bool NormalsSet { get { return NormalBufferObject.Handle != 0; } } + + /// + /// Invalidates the colors, e.g. reset the ColorBufferObject of this instance by setting it to 0. + /// + public void InvalidateColors() + { + ColorBufferObject.Handle = 0; + } + + /// + /// Invalidates the colors, e.g. reset the ColorBufferObject of this instance by setting it to 0. + /// + public void InvalidateColors1() + { + ColorBufferObject1.Handle = 0; + } + + /// + /// Invalidates the colors, e.g. reset the ColorBufferObject of this instance by setting it to 0. + /// + public void InvalidateColors2() + { + ColorBufferObject2.Handle = 0; + } + + /// + /// Gets a value indicating whether [colors set]. + /// + /// + /// true if [colors set]; otherwise, false. + /// + public bool ColorsSet { get { return ColorBufferObject.Handle != 0; } } + + /// + /// Gets a value indicating whether [colors set]. + /// + /// + /// true if [colors set]; otherwise, false. + /// + public bool ColorsSet1 { get { return ColorBufferObject1.Handle != 0; } } + + /// + /// Gets a value indicating whether [colors set]. + /// + /// + /// true if [colors set]; otherwise, false. + /// + public bool ColorsSet2 { get { return ColorBufferObject2.Handle != 0; } } + + /// + /// Gets a value indicating whether [u vs set]. + /// + /// + /// true if [u vs set]; otherwise, false. + /// + public bool UVsSet { get { return UVBufferObject.Handle != 0; } } + + /// + /// Invalidates the UV's. + /// + public void InvalidateUVs() + { + UVBufferObject.Handle = 0; + } + + /// + /// Gets a value indicating whether [boneindices set]. + /// + /// + /// true if [boneindices set]; otherwise, false. + /// + public bool BoneIndicesSet { get { return BoneIndexBufferObject.Handle != 0; } } + /// + /// Returns wether the tangents have been set. + /// + public bool TangentsSet { get; } + /// + /// Returns wether be bitangents have been set. + /// + public bool BiTangentsSet { get; } + + /// + /// Invalidates the BoneIndices. + /// + public void InvalidateBoneIndices() + { + BoneIndexBufferObject.Handle = 0; + } + + /// + /// Invalidates the Tangents. + /// + public void InvalidateTangents() + { + TangentBufferObject.Handle = 0; + } + + /// + /// Invalidates the BiTangents. + /// + public void InvalidateBiTangents() + { + BitangentBufferObject.Handle = 0; + } + + /// + /// Gets a value indicating whether [boneweights set]. + /// + /// + /// true if [boneweights set]; otherwise, false. + /// + public bool BoneWeightsSet { get { return BoneWeightBufferObject.Handle != 0; } } + + /// + /// Invalidates the BoneWeight's. + /// + public void InvalidateBoneWeights() + { + BoneWeightBufferObject.Handle = 0; + } + /// + /// Invalidates the triangles. + /// + public void InvalidateTriangles() + { + ElementBufferObject.Handle = 0; + NElements = 0; + } + /// + /// Gets a value indicating whether [triangles set]. + /// + /// + /// true if [triangles set]; otherwise, false. + /// + public bool TrianglesSet { get { return ElementBufferObject.Handle != 0; } } + + /// + /// Type of data of this mesh (e.g. Triangles, Points, Lines, etc.) + /// + public OpenGLPrimitiveType MeshType { get; set; } + + #endregion Public Fields & Members pairs + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index ed63b76ba..2f49d0062 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -1,5 +1,6 @@ using Fusee.Engine.Common; using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; using OpenTK.Windowing.Desktop; using OpenTK.Windowing.GraphicsLibraryFramework; using System; @@ -421,7 +422,7 @@ public Bitmap ShootCurrentFrame(int width, int height) var bmp = new Bitmap(this.Width, this.Height, SDPixelFormat.Format32bppArgb); var mem = bmp.LockBits(new System.Drawing.Rectangle(0, 0, Width, Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, SDPixelFormat.Format32bppArgb); - GL.PixelStore(PixelStoreParameter.PackRowLength, mem.Stride / 4); + GL.PixelStorei(PixelStoreParameter.PackRowLength, mem.Stride / 4); GL.ReadPixels(0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, mem.Scan0); bmp.UnlockBits(mem); bmp.RotateFlip(RotateFlipType.RotateNoneFlipY); @@ -563,7 +564,7 @@ internal class RenderCanvasGameWindow : GameWindow /// public bool Blending { - get => GL.IsEnabled(EnableCap.Blend); + get => Convert.ToBoolean(GL.IsEnabled(EnableCap.Blend)); set { if (value) @@ -614,7 +615,7 @@ protected override void OnLoad() throw new InvalidOperationException("You need at least OpenGL 2.0 to run this example. GLSL not supported."); } - GL.ClearColor(Color.MidnightBlue); + GL.ClearColor(new Color4(Color.MidnightBlue.R, Color.MidnightBlue.G, Color.MidnightBlue.B, Color.MidnightBlue.A)); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 626fe3181..06e3cb165 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -4,12 +4,12 @@ using Fusee.Engine.Core.ShaderShards; using Fusee.Engine.Imp.Shared; using Fusee.Math.Core; +using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; -using System.Runtime.InteropServices; namespace Fusee.Engine.Imp.Graphics.Desktop { @@ -26,19 +26,19 @@ public class RenderContextImp : IRenderContextImp private int _textureCountPerShader; private readonly Dictionary _shaderParam2TexUnit; - private BlendEquationMode _blendEquationAlpha; - private BlendEquationMode _blendEquationRgb; - private BlendingFactorSrc _blendSrcRgb; - private BlendingFactorDest _blendDstRgb; - private BlendingFactorSrc _blendSrcAlpha; - private BlendingFactorDest _blendDstAlpha; + private BlendEquationModeEXT _blendEquationAlpha; + private BlendEquationModeEXT _blendEquationRgb; + private BlendingFactor _blendSrcRgb; + private BlendingFactor _blendDstRgb; + private BlendingFactor _blendSrcAlpha; + private BlendingFactor _blendDstAlpha; private bool _isCullEnabled; private bool _isPtRenderingEnabled; private bool _isLineSmoothEnabled; #if DEBUG - private static DebugProc _openGlDebugDelegate; + private static GLDebugProc _openGlDebugDelegate; #endif /// @@ -54,10 +54,14 @@ public RenderContextImp(IRenderCanvasImp renderCanvas) GL.Enable(EnableCap.DebugOutput); GL.Enable(EnableCap.DebugOutputSynchronous); - _openGlDebugDelegate = new DebugProc(OpenGLDebugCallback); + _openGlDebugDelegate = new GLDebugProc(OpenGLDebugCallback); GL.DebugMessageCallback(_openGlDebugDelegate, IntPtr.Zero); - GL.DebugMessageControl(DebugSourceControl.DontCare, DebugTypeControl.DontCare, DebugSeverityControl.DebugSeverityNotification, 0, Array.Empty(), false); + + unsafe + { + GL.DebugMessageControl(DebugSource.DontCare, DebugType.DontCare, DebugSeverity.DebugSeverityNotification, 0, (uint*)IntPtr.Zero, Convert.ToByte(false)); + } #endif // Due to the right-handed nature of OpenGL and the left-handed design of FUSEE @@ -68,36 +72,47 @@ public RenderContextImp(IRenderCanvasImp renderCanvas) //Needed for rendering more than one viewport. GL.Enable(EnableCap.ScissorTest); - GL.GetInteger(GetPName.BlendSrcAlpha, out int blendSrcAlpha); - GL.GetInteger(GetPName.BlendDstAlpha, out int blendDstAlpha); - GL.GetInteger(GetPName.BlendDstRgb, out int blendDstRgb); - GL.GetInteger(GetPName.BlendSrcRgb, out int blendSrcRgb); - GL.GetInteger(GetPName.BlendEquationAlpha, out int blendEqA); - GL.GetInteger(GetPName.BlendEquationRgb, out int blendEqRgb); - - _blendDstRgb = (BlendingFactorDest)blendDstRgb; - _blendSrcRgb = (BlendingFactorSrc)blendSrcRgb; - _blendSrcAlpha = (BlendingFactorSrc)blendSrcAlpha; - _blendDstAlpha = (BlendingFactorDest)blendDstAlpha; - _blendEquationAlpha = (BlendEquationMode)blendEqA; - _blendEquationRgb = (BlendEquationMode)blendEqRgb; + int blendSrcAlpha = 0; + int blendDstAlpha = 0; + int blendDstRgb = 0; + int blendSrcRgb = 0; + int blendEqA = 0; + int blendEqRgb = 0; + + GL.GetInteger(GetPName.BlendSrcAlpha, ref blendSrcAlpha); + GL.GetInteger(GetPName.BlendDstAlpha, ref blendDstAlpha); + GL.GetInteger(GetPName.BlendDstRgb, ref blendDstRgb); + GL.GetInteger(GetPName.BlendSrcRgb, ref blendSrcRgb); + GL.GetInteger(GetPName.BlendEquationAlpha, ref blendEqA); + GL.GetInteger(GetPName.BlendEquationRgb, ref blendEqRgb); + + _blendDstRgb = (BlendingFactor)blendDstRgb; + _blendSrcRgb = (BlendingFactor)blendSrcRgb; + _blendSrcAlpha = (BlendingFactor)blendSrcAlpha; + _blendDstAlpha = (BlendingFactor)blendDstAlpha; + _blendEquationAlpha = (BlendEquationModeEXT)blendEqA; + _blendEquationRgb = (BlendEquationModeEXT)blendEqRgb; Diagnostics.Debug(GL.GetString(StringName.Vendor) + " - " + GL.GetString(StringName.Renderer) + " - " + GL.GetString(StringName.Version)); #if DEBUG - var numExtensions = GL.GetInteger(GetPName.NumExtensions); - var extensions = new string[numExtensions]; + int numExtensions = 0; + GL.GetInteger(GetPName.NumExtensions, ref numExtensions); - for (int i = 0; i < numExtensions; i++) - { - extensions[i] = GL.GetString(StringNameIndexed.Extensions, i); - } + // OpenTK 4.x + //var extensions = new string[numExtensions]; + //for (int i = 0; i < numExtensions; i++) + //{ + // extensions[i] = GL.GetString(StringName.Extensions, i); + //} + + var extensions = GL.GetString(StringName.Extensions); Diagnostics.Verbose(string.Join(';', extensions)); #endif } #if DEBUG - private static void OpenGLDebugCallback(DebugSource source, DebugType type, int id, DebugSeverity severity, int length, IntPtr message, IntPtr userParam) + private static void OpenGLDebugCallback(DebugSource source, DebugType type, uint id, DebugSeverity severity, int length, IntPtr message, IntPtr userParam) { Diagnostics.Debug($"{System.Runtime.InteropServices.Marshal.PtrToStringAnsi(message, length)}\n\tid:{id} severity:{severity} type:{type} source:{source}\n"); } @@ -179,87 +194,87 @@ private OpenTK.Graphics.OpenGL.TextureWrapMode GetWrapMode(Common.TextureWrapMod }; } - private SizedInternalFormat GetSizedInteralFormat(ImagePixelFormat format) + private InternalFormat GetInteralFormat(ImagePixelFormat format) { return format.ColorFormat switch { - ColorFormat.RGBA => SizedInternalFormat.Rgba8, - ColorFormat.fRGBA16 => SizedInternalFormat.Rgba16f, - ColorFormat.fRGBA32 => SizedInternalFormat.Rgba32f, - ColorFormat.iRGBA32 => SizedInternalFormat.Rgba32i, + ColorFormat.RGBA => InternalFormat.Rgba, + ColorFormat.fRGBA16 => InternalFormat.Rgba16f, + ColorFormat.fRGBA32 => InternalFormat.Rgba32f, + ColorFormat.iRGBA32 => InternalFormat.Rgba32i, _ => throw new ArgumentOutOfRangeException("SizedInternalFormat not supported. Try to use a format with r,g,b and a components."), }; } private TexturePixelInfo GetTexturePixelInfo(ITextureBase tex) { - PixelInternalFormat internalFormat; + InternalFormat internalFormat; PixelFormat format; PixelType pxType; switch (tex.PixelFormat.ColorFormat) { case ColorFormat.RGBA: - internalFormat = PixelInternalFormat.Rgba; + internalFormat = InternalFormat.Rgba; format = PixelFormat.Bgra; pxType = PixelType.UnsignedByte; break; case ColorFormat.RGB: - internalFormat = PixelInternalFormat.Rgb; + internalFormat = InternalFormat.Rgb; format = PixelFormat.Bgr; pxType = PixelType.UnsignedByte; break; // TODO: Handle Alpha-only / Intensity-only and AlphaIntensity correctly. case ColorFormat.Intensity: - internalFormat = PixelInternalFormat.R8; + internalFormat = InternalFormat.R8; format = PixelFormat.Red; pxType = PixelType.UnsignedByte; break; case ColorFormat.Depth24: - internalFormat = PixelInternalFormat.DepthComponent24; + internalFormat = InternalFormat.DepthComponent24; format = PixelFormat.DepthComponent; pxType = PixelType.Float; break; case ColorFormat.Depth16: - internalFormat = PixelInternalFormat.DepthComponent16; + internalFormat = InternalFormat.DepthComponent16; format = PixelFormat.DepthComponent; pxType = PixelType.Float; break; case ColorFormat.uiRgb8: - internalFormat = PixelInternalFormat.Rgba8ui; + internalFormat = InternalFormat.Rgba8ui; format = PixelFormat.RgbaInteger; pxType = PixelType.UnsignedByte; break; case ColorFormat.fRGB32: - internalFormat = PixelInternalFormat.Rgb32f; + internalFormat = InternalFormat.Rgb32f; format = PixelFormat.Rgb; pxType = PixelType.Float; break; case ColorFormat.fRGB16: - internalFormat = PixelInternalFormat.Rgb16f; + internalFormat = InternalFormat.Rgb16f; format = PixelFormat.Rgb; pxType = PixelType.Float; break; case ColorFormat.fRGBA16: - internalFormat = PixelInternalFormat.Rgba16f; + internalFormat = InternalFormat.Rgba16f; format = PixelFormat.Rgba; pxType = PixelType.Float; break; case ColorFormat.fRGBA32: - internalFormat = PixelInternalFormat.Rgba32f; + internalFormat = InternalFormat.Rgba32f; format = PixelFormat.Rgba; pxType = PixelType.Float; break; case ColorFormat.iRGBA32: - internalFormat = PixelInternalFormat.Rgba32i; + internalFormat = InternalFormat.Rgba32i; format = PixelFormat.RgbaInteger; pxType = PixelType.Int; break; @@ -283,8 +298,8 @@ private TexturePixelInfo GetTexturePixelInfo(ITextureBase tex) /// An ITextureHandle that can be used for texturing in the shader. In this implementation, the handle is an integer-value which is necessary for OpenTK. public ITextureHandle CreateTexture(IWritableArrayTexture img) { - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2DArray, id); + OpenTK.Graphics.TextureHandle handle = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2dArray, handle); var glMinMagFilter = GetMinMagFilter(img.FilterMode); var minFilter = glMinMagFilter.Item1; @@ -292,19 +307,19 @@ public ITextureHandle CreateTexture(IWritableArrayTexture img) var glWrapMode = GetWrapMode(img.WrapMode); var pxInfo = GetTexturePixelInfo(img); - GL.TexImage3D(TextureTarget.Texture2DArray, 0, pxInfo.InternalFormat, img.Width, img.Height, img.Layers, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); + GL.TexImage3D(TextureTarget.Texture2dArray, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, img.Layers, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); if (img.DoGenerateMipMaps) - GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + GL.GenerateMipmap(TextureTarget.Texture2d); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureMinFilter, (int)minFilter); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureMagFilter, (int)magFilter); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureWrapS, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureWrapT, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureMinFilter, (int)minFilter); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureMagFilter, (int)magFilter); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureWrapS, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2dArray, TextureParameterName.TextureWrapT, (int)glWrapMode); - ITextureHandle texID = new TextureHandle { TexHandle = id }; + ITextureHandle texID = new TextureHandle { TexHandle = handle }; return texID; } @@ -316,8 +331,8 @@ public ITextureHandle CreateTexture(IWritableArrayTexture img) /// An ITextureHandle that can be used for texturing in the shader. In this implementation, the handle is an integer-value which is necessary for OpenTK. public ITextureHandle CreateTexture(IWritableCubeMap img) { - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.TextureCubeMap, id); + OpenTK.Graphics.TextureHandle handle = GL.GenTexture(); + GL.BindTexture(TextureTarget.TextureCubeMap, handle); var glMinMagFilter = GetMinMagFilter(img.FilterMode); var minFilter = glMinMagFilter.Item1; @@ -326,18 +341,18 @@ public ITextureHandle CreateTexture(IWritableCubeMap img) var glWrapMode = GetWrapMode(img.WrapMode); var pxInfo = GetTexturePixelInfo(img); - for (int i = 0; i < 6; i++) - GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX + i, 0, pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); + for (uint i = 0; i < 6; i++) + GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX + i, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)magFilter); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)minFilter); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)glWrapMode); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)glWrapMode); - GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (int)glWrapMode); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (int)magFilter); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (int)minFilter); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (int)glWrapMode); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (int)glWrapMode); + GL.TexParameteri(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (int)glWrapMode); - ITextureHandle texID = new TextureHandle { TexHandle = id }; + ITextureHandle texID = new TextureHandle { TexHandle = handle }; return texID; } @@ -349,8 +364,8 @@ public ITextureHandle CreateTexture(IWritableCubeMap img) /// An ITextureHandle that can be used for texturing in the shader. In this implementation, the handle is an integer-value which is necessary for OpenTK. public ITextureHandle CreateTexture(ITexture img) { - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); + OpenTK.Graphics.TextureHandle handle = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2d, handle); var glMinMagFilter = GetMinMagFilter(img.FilterMode); var minFilter = glMinMagFilter.Item1; @@ -359,19 +374,22 @@ public ITextureHandle CreateTexture(ITexture img) var glWrapMode = GetWrapMode(img.WrapMode); var pxInfo = GetTexturePixelInfo(img); - - GL.TexImage2D(TextureTarget.Texture2D, 0, pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, img.PixelData); + unsafe + { + using var pxDataMem = img.PixelData.AsMemory().Pin(); + GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, pxDataMem.Pointer); + } if (img.DoGenerateMipMaps) - GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + GL.GenerateMipmap(TextureTarget.Texture2d); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)minFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)magFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapR, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)minFilter); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)magFilter); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapS, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapT, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapR, (int)glWrapMode); - ITextureHandle texID = new TextureHandle { TexHandle = id }; + ITextureHandle texID = new TextureHandle { TexHandle = handle }; return texID; } @@ -383,8 +401,8 @@ public ITextureHandle CreateTexture(ITexture img) /// An ITextureHandle that can be used for texturing in the shader. In this implementation, the handle is an integer-value which is necessary for OpenTK. public ITextureHandle CreateTexture(IWritableTexture img) { - int id = GL.GenTexture(); - GL.BindTexture(TextureTarget.Texture2D, id); + OpenTK.Graphics.TextureHandle handle = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2d, handle); var glMinMagFilter = GetMinMagFilter(img.FilterMode); var minFilter = glMinMagFilter.Item1; @@ -392,19 +410,19 @@ public ITextureHandle CreateTexture(IWritableTexture img) var glWrapMode = GetWrapMode(img.WrapMode); var pxInfo = GetTexturePixelInfo(img); - GL.TexImage2D(TextureTarget.Texture2D, 0, pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); + GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); if (img.DoGenerateMipMaps) - GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + GL.GenerateMipmap(TextureTarget.Texture2d); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)minFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)magFilter); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)minFilter); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)magFilter); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapS, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapT, (int)glWrapMode); - ITextureHandle texID = new TextureHandle { TexHandle = id }; + ITextureHandle texID = new TextureHandle { TexHandle = handle }; return texID; } @@ -439,13 +457,16 @@ public void UpdateTextureRegion(ITextureHandle tex, ITexture img, int startX, in } while (scanlines.MoveNext()); - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)tex).TexHandle); - GL.TexSubImage2D(TextureTarget.Texture2D, 0, startX, startY, width, height, format, PixelType.UnsignedByte, bytes); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)tex).TexHandle); - //GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); + unsafe + { + using var byteMem = bytes.AsMemory().Pin(); + GL.TexSubImage2D(TextureTarget.Texture2d, 0, startX, startY, width, height, format, PixelType.UnsignedByte, byteMem.Pointer); + } - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); } /// @@ -455,10 +476,10 @@ public void UpdateTextureRegion(ITextureHandle tex, ITexture img, int startX, in /// The new filter mode. public void SetTextureFilterMode(ITextureHandle tex, TextureFilterMode filterMode) { - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)tex).TexHandle); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)tex).TexHandle); var glMinMagFilter = GetMinMagFilter(filterMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)glMinMagFilter.Item1); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)glMinMagFilter.Item2); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)glMinMagFilter.Item1); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)glMinMagFilter.Item2); } /// @@ -468,11 +489,11 @@ public void SetTextureFilterMode(ITextureHandle tex, TextureFilterMode filterMod ///The new wrap mode. public void SetTextureWrapMode(ITextureHandle tex, Common.TextureWrapMode wrapMode) { - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)tex).TexHandle); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)tex).TexHandle); var glWrapMode = GetWrapMode(wrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)glWrapMode); - GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapR, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapS, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapT, (int)glWrapMode); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapR, (int)glWrapMode); } /// @@ -485,12 +506,12 @@ public void DeleteFrameBuffer(IBufferHandle bh) } /// - /// Free all allocated gpu memory that belong to a render-buffer object. + /// Free all allocated gpu memory that belong to a render buffer object. /// /// The platform dependent abstraction of the gpu buffer handle. public void DeleteRenderBuffer(IBufferHandle bh) { - GL.DeleteFramebuffer(((RenderBufferHandle)bh).Handle); + GL.DeleteRenderbuffer(((RenderBufferHandle)bh).Handle); } /// @@ -501,17 +522,17 @@ public void RemoveTextureHandle(ITextureHandle textureHandle) { TextureHandle texHandle = (TextureHandle)textureHandle; - if (texHandle.FrameBufferHandle != -1) + if (texHandle.FrameBufferHandle.Handle != -1) { GL.DeleteFramebuffer(texHandle.FrameBufferHandle); } - if (texHandle.DepthRenderBufferHandle != -1) + if (texHandle.DepthRenderBufferHandle.Handle != -1) { GL.DeleteRenderbuffer(texHandle.DepthRenderBufferHandle); } - if (texHandle.TexHandle != -1) + if (texHandle.TexHandle.Handle != -1) { GL.DeleteTexture(texHandle.TexHandle); _textureCountPerShader--; @@ -532,7 +553,7 @@ public IShaderHandle CreateShaderProgramCompute(string cs) int statusCode = -1; // Compile compute shader - int computeObject = -1; + ShaderHandle computeObject = new(-1); if (!string.IsNullOrEmpty(cs)) { computeObject = GL.CreateShader(ShaderType.ComputeShader); @@ -540,13 +561,13 @@ public IShaderHandle CreateShaderProgramCompute(string cs) GL.ShaderSource(computeObject, cs); GL.CompileShader(computeObject); GL.GetShaderInfoLog(computeObject, out info); - GL.GetShader(computeObject, ShaderParameter.CompileStatus, out statusCode); + GL.GetShaderi(computeObject, ShaderParameterName.CompileStatus, ref statusCode); } if (statusCode != 1) throw new ApplicationException(info); - int program = GL.CreateProgram(); + ProgramHandle program = GL.CreateProgram(); GL.AttachShader(program, computeObject); GL.LinkProgram(program); //Must be called AFTER BindAttribLocation @@ -568,20 +589,21 @@ public IShaderHandle CreateShaderProgramCompute(string cs) /// public IShaderHandle CreateShaderProgram(string vs, string ps, string gs = null) { - int vertexObject = GL.CreateShader(ShaderType.VertexShader); - int fragmentObject = GL.CreateShader(ShaderType.FragmentShader); + ShaderHandle vertexObject = GL.CreateShader(ShaderType.VertexShader); + ShaderHandle fragmentObject = GL.CreateShader(ShaderType.FragmentShader); + int statusCode = -1; // Compile vertex shader GL.ShaderSource(vertexObject, vs); GL.CompileShader(vertexObject); GL.GetShaderInfoLog(vertexObject, out string info); - GL.GetShader(vertexObject, ShaderParameter.CompileStatus, out int statusCode); + GL.GetShaderi(vertexObject, ShaderParameterName.CompileStatus, ref statusCode); if (statusCode != 1) throw new ApplicationException(info); // Compile geometry shader - int geometryObject = -1; + ShaderHandle geometryObject = new(-1); if (!string.IsNullOrEmpty(gs)) { geometryObject = GL.CreateShader(ShaderType.GeometryShader); @@ -589,7 +611,7 @@ public IShaderHandle CreateShaderProgram(string vs, string ps, string gs = null) GL.ShaderSource(geometryObject, gs); GL.CompileShader(geometryObject); GL.GetShaderInfoLog(geometryObject, out info); - GL.GetShader(geometryObject, ShaderParameter.CompileStatus, out statusCode); + GL.GetShaderi(geometryObject, ShaderParameterName.CompileStatus, ref statusCode); } if (statusCode != 1) @@ -599,12 +621,12 @@ public IShaderHandle CreateShaderProgram(string vs, string ps, string gs = null) GL.ShaderSource(fragmentObject, ps); GL.CompileShader(fragmentObject); GL.GetShaderInfoLog(fragmentObject, out info); - GL.GetShader(fragmentObject, ShaderParameter.CompileStatus, out statusCode); + GL.GetShaderi(fragmentObject, ShaderParameterName.CompileStatus, ref statusCode); if (statusCode != 1) throw new ApplicationException(info); - int program = GL.CreateProgram(); + ProgramHandle program = GL.CreateProgram(); GL.AttachShader(program, fragmentObject); if (!string.IsNullOrEmpty(gs)) @@ -642,13 +664,11 @@ public IShaderHandle CreateShaderProgram(string vs, string ps, string gs = null) /// public void RemoveShader(IShaderHandle sp) { - var program = ((ShaderHandleImp)sp).Handle; - // wait for all threads to be finished GL.Finish(); GL.Flush(); - GL.DeleteProgram(program); + GL.DeleteProgram(((ShaderHandleImp)sp).Handle); } @@ -687,7 +707,8 @@ public IShaderParam GetShaderUniformParam(IShaderHandle shaderProgram, string pa /// A float number (default is 0). public float GetParamValue(IShaderHandle program, IShaderParam param) { - GL.GetUniform(((ShaderHandleImp)program).Handle, ((ShaderParam)param).handle, out float f); + float f = 0; + GL.GetUniformf(((ShaderHandleImp)program).Handle, (int)((ShaderParam)param).handle, ref f); return f; } @@ -699,17 +720,21 @@ public IList GetShaderStorageBufferList(IShaderHandle shaderPro { var paramList = new List(); var sProg = (ShaderHandleImp)shaderProgram; - GL.GetProgramInterface(sProg.Handle, ProgramInterface.ShaderStorageBlock, ProgramInterfaceParameter.MaxNameLength, out int ssboMaxLen); - GL.GetProgramInterface(sProg.Handle, ProgramInterface.ShaderStorageBlock, ProgramInterfaceParameter.ActiveResources, out int nParams); + int ssboMaxLen = 0; + int nParams = 0; - for (var i = 0; i < nParams; i++) + GL.GetProgramInterfacei(sProg.Handle, ProgramInterface.ShaderStorageBlock, ProgramInterfacePName.MaxNameLength, ref ssboMaxLen); + GL.GetProgramInterfacei(sProg.Handle, ProgramInterface.ShaderStorageBlock, ProgramInterfacePName.ActiveResources, ref nParams); + + for (uint i = 0; i < nParams; i++) { var paramInfo = new ShaderParamInfo(); - GL.GetProgramResourceName(sProg.Handle, ProgramInterface.ShaderStorageBlock, i, ssboMaxLen, out _, out string name); + int length = 0; + GL.GetProgramResourceName(sProg.Handle, ProgramInterface.ShaderStorageBlock, i, ssboMaxLen, ref length, out string name); paramInfo.Name = name; - int h = GL.GetProgramResourceIndex(sProg.Handle, ProgramInterface.ShaderStorageBlock, name); - paramInfo.Handle = (h == -1) ? null : new ShaderParam { handle = h }; + uint h = GL.GetProgramResourceIndex(sProg.Handle, ProgramInterface.ShaderStorageBlock, name); + paramInfo.Handle = (h == -1) ? null : new ShaderParam { handle = (int)h }; paramList.Add(paramInfo); } @@ -727,30 +752,36 @@ public IList GetActiveUniformsList(IShaderHandle shaderProgram) var sProg = (ShaderHandleImp)shaderProgram; var paramList = new List(); - GL.GetProgram(sProg.Handle, GetProgramParameterName.ActiveUniforms, out int nParams); + int nParams = 0; + GL.GetProgrami(sProg.Handle, ProgramPropertyARB.ActiveUniforms, ref nParams); for (var i = 0; i < nParams; i++) { var paramInfo = new ShaderParamInfo(); - paramInfo.Name = GL.GetActiveUniform(sProg.Handle, i, out paramInfo.Size, out ActiveUniformType uType); + UniformType uType = UniformType.Bool; + + int length = 0; + int size = 0; + //TODO: (int)ProgramInterfacePName.MaxNameLength may not be the correct value here + GL.GetActiveUniform(sProg.Handle, (uint)i, (int)ProgramInterfacePName.MaxNameLength, ref length, ref size, ref uType, out var name); + + paramInfo.Name = name; paramInfo.Handle = GetShaderUniformParam(sProg, paramInfo.Name); - //Diagnostics.Log($"Active Uniforms: {paramInfo.Name}"); - paramInfo.Type = uType switch { - ActiveUniformType.Int => typeof(int), - ActiveUniformType.Bool => typeof(bool), - ActiveUniformType.Float => typeof(float), - ActiveUniformType.Double => typeof(double), - ActiveUniformType.FloatVec2 => typeof(float2), - ActiveUniformType.FloatVec3 => typeof(float3), - ActiveUniformType.FloatVec4 => typeof(float4), - ActiveUniformType.FloatMat4 => typeof(float4x4), - ActiveUniformType.Sampler2D or ActiveUniformType.UnsignedIntSampler2D or ActiveUniformType.IntSampler2D or ActiveUniformType.Sampler2DShadow or ActiveUniformType.Image2D => typeof(ITextureBase), - ActiveUniformType.SamplerCube or ActiveUniformType.SamplerCubeShadow => typeof(IWritableCubeMap), - ActiveUniformType.Sampler2DArray or ActiveUniformType.Sampler2DArrayShadow => typeof(IWritableArrayTexture), - _ => throw new ArgumentOutOfRangeException($"ActiveUniformType {uType} unknown."), + UniformType.Int => typeof(int), + UniformType.Bool => typeof(bool), + UniformType.Float => typeof(float), + UniformType.Double => typeof(double), + UniformType.FloatVec2 => typeof(float2), + UniformType.FloatVec3 => typeof(float3), + UniformType.FloatVec4 => typeof(float4), + UniformType.FloatMat4 => typeof(float4x4), + UniformType.Sampler2d or UniformType.UnsignedIntSampler2d or UniformType.IntSampler2d or UniformType.Sampler2dShadow /*or UniformType.Image2d*/ => typeof(ITextureBase), + UniformType.SamplerCube or UniformType.SamplerCubeShadow => typeof(IWritableCubeMap), + UniformType.Sampler2dArray or UniformType.Sampler2dArrayShadow => typeof(IWritableArrayTexture), + _ => throw new ArgumentOutOfRangeException($"UniformType {uType} unknown."), }; paramList.Add(paramInfo); } @@ -773,7 +804,7 @@ public void SetLineWidth(float width) /// The value. public void SetShaderParam(IShaderParam param, float val) { - GL.Uniform1(((ShaderParam)param).handle, val); + GL.Uniform1f((int)((ShaderParam)param).handle, val); } /// @@ -783,7 +814,7 @@ public void SetShaderParam(IShaderParam param, float val) /// The value. public void SetShaderParam(IShaderParam param, double val) { - GL.Uniform1(((ShaderParam)param).handle, val); + GL.Uniform1d((int)((ShaderParam)param).handle, val); } /// @@ -793,7 +824,7 @@ public void SetShaderParam(IShaderParam param, double val) /// The value. public void SetShaderParam(IShaderParam param, float2 val) { - GL.Uniform2(((ShaderParam)param).handle, val.x, val.y); + GL.Uniform2f((int)((ShaderParam)param).handle, val.x, val.y); } /// @@ -803,8 +834,10 @@ public void SetShaderParam(IShaderParam param, float2 val) /// The value. public unsafe void SetShaderParam(IShaderParam param, float2[] val) { - fixed (float2* pFlt = &val[0]) - GL.Uniform2(((ShaderParam)param).handle, val.Length, (float*)pFlt); + foreach (var vec in val) + { + GL.Uniform2f((int)((ShaderParam)param).handle, vec.x, vec.y); + } } /// @@ -814,18 +847,20 @@ public unsafe void SetShaderParam(IShaderParam param, float2[] val) /// The value. public void SetShaderParam(IShaderParam param, float3 val) { - GL.Uniform3(((ShaderParam)param).handle, val.x, val.y, val.z); + GL.Uniform3f(((ShaderParam)param).handle, val.x, val.y, val.z); } /// - /// Sets a array shader parameter. + /// Sets a array shader parameter. /// /// The parameter. /// The value. public unsafe void SetShaderParam(IShaderParam param, float3[] val) { - fixed (float3* pFlt = &val[0]) - GL.Uniform3(((ShaderParam)param).handle, val.Length, (float*)pFlt); + foreach (var vec in val) + { + GL.Uniform3f((int)((ShaderParam)param).handle, vec.x, vec.y, vec.z); + } } /// @@ -835,7 +870,7 @@ public unsafe void SetShaderParam(IShaderParam param, float3[] val) /// The value. public void SetShaderParam(IShaderParam param, float4 val) { - GL.Uniform4(((ShaderParam)param).handle, val.x, val.y, val.z, val.w); + GL.Uniform4f(((ShaderParam)param).handle, val.x, val.y, val.z, val.w); } /// @@ -845,15 +880,7 @@ public void SetShaderParam(IShaderParam param, float4 val) /// The value. public void SetShaderParam(IShaderParam param, float4x4 val) { - unsafe - { - var mF = (float*)(&val); - // Row order notation - // GL.UniformMatrix4(((ShaderParam) param).handle, 1, false, mF); - - // Column order notation - GL.UniformMatrix4(((ShaderParam)param).handle, 1, true, mF); - } + GL.UniformMatrix4f(((ShaderParam)param).handle, 1, true, val.ToArray()); } /// @@ -863,8 +890,10 @@ public void SetShaderParam(IShaderParam param, float4x4 val) /// The value. public unsafe void SetShaderParam(IShaderParam param, float4[] val) { - fixed (float4* pFlt = &val[0]) - GL.Uniform4(((ShaderParam)param).handle, val.Length, (float*)pFlt); + foreach (var vec in val) + { + GL.Uniform4f(((ShaderParam)param).handle, vec.x, vec.y, vec.z, vec.w); + } } /// @@ -874,18 +903,25 @@ public unsafe void SetShaderParam(IShaderParam param, float4[] val) /// The value. public unsafe void SetShaderParam(IShaderParam param, float4x4[] val) { - var tmpArray = new float4[val.Length * 4]; - + var tmpArray = new float[val.Length * 4 * 4]; for (var i = 0; i < val.Length; i++) { - tmpArray[i * 4] = val[i].Column1; - tmpArray[i * 4 + 1] = val[i].Column2; - tmpArray[i * 4 + 2] = val[i].Column3; - tmpArray[i * 4 + 3] = val[i].Column4; + val[i].ToArray().CopyTo(tmpArray, i * 16); } + GL.UniformMatrix4f(((ShaderParam)param).handle, val.Length, true, tmpArray); + + //var tmpArray = new float4[val.Length * 4]; - fixed (float4* pMtx = &tmpArray[0]) - GL.UniformMatrix4(((ShaderParam)param).handle, val.Length, false, (float*)pMtx); + //for (var i = 0; i < val.Length; i++) + //{ + // tmpArray[i * 4] = val[i].Column1; + // tmpArray[i * 4 + 1] = val[i].Column2; + // tmpArray[i * 4 + 2] = val[i].Column3; + // tmpArray[i * 4 + 3] = val[i].Column4; + //} + + //fixed (float4* pMtx = &tmpArray[0]) + // GL.UniformMatrix4f((int)((ShaderParam)param).handle, val.Length, false, (float*)pMtx); } /// @@ -895,10 +931,10 @@ public unsafe void SetShaderParam(IShaderParam param, float4x4[] val) /// The value. public void SetShaderParam(IShaderParam param, int val) { - GL.Uniform1(((ShaderParam)param).handle, val); + GL.Uniform1i(((ShaderParam)param).handle, val); } - private void BindImage(TextureType texTarget, ITextureHandle texId, int texUint, TextureAccess access, SizedInternalFormat format) + private void BindImage(TextureType texTarget, ITextureHandle texId, uint texUint, BufferAccessARB access, InternalFormat format) { switch (texTarget) { @@ -915,19 +951,19 @@ private void BindTextureByTarget(ITextureHandle texId, TextureType texTarget) switch (texTarget) { case TextureType.Texture1D: - GL.BindTexture(TextureTarget.Texture1D, ((TextureHandle)texId).TexHandle); + GL.BindTexture(TextureTarget.Texture1d, ((TextureHandle)texId).TexHandle); break; case TextureType.Texture2D: - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)texId).TexHandle); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)texId).TexHandle); break; case TextureType.Texture3D: - GL.BindTexture(TextureTarget.Texture3D, ((TextureHandle)texId).TexHandle); + GL.BindTexture(TextureTarget.Texture3d, ((TextureHandle)texId).TexHandle); break; case TextureType.TextureCubeMap: GL.BindTexture(TextureTarget.TextureCubeMap, ((TextureHandle)texId).TexHandle); break; case TextureType.ArrayTexture: - GL.BindTexture(TextureTarget.Texture2DArray, ((TextureHandle)texId).TexHandle); + GL.BindTexture(TextureTarget.Texture2dArray, ((TextureHandle)texId).TexHandle); break; case TextureType.Image2D: default: @@ -952,24 +988,22 @@ public void SetActiveAndBindTexture(IShaderParam param, ITextureHandle texId, Te _shaderParam2TexUnit[iParam] = texUnit; } - GL.ActiveTexture(TextureUnit.Texture0 + texUnit); + GL.ActiveTexture(TextureUnit.Texture0 + (uint)texUnit); BindTextureByTarget(texId, texTarget); } - private void SetActiveAndBindImage(IShaderParam param, ITextureHandle texId, TextureType texTarget, ImagePixelFormat format, TextureAccess access, out int texUnit) + private void SetActiveAndBindImage(IShaderParam param, ITextureHandle texId, TextureType texTarget, ImagePixelFormat format, BufferAccessARB access, out int texUnit) { int iParam = ((ShaderParam)param).handle; if (!_shaderParam2TexUnit.TryGetValue(iParam, out texUnit)) { _textureCountPerShader++; - texUnit = _textureCountPerShader; + texUnit = (int)_textureCountPerShader; _shaderParam2TexUnit[iParam] = texUnit; } - var sizedIntFormat = GetSizedInteralFormat(format); - - GL.ActiveTexture(TextureUnit.Texture0 + texUnit); - BindImage(texTarget, texId, texUnit, access, sizedIntFormat); + GL.ActiveTexture(TextureUnit.Texture0 + (uint)texUnit); + BindImage(texTarget, texId, (uint)texUnit, access, GetInteralFormat(format)); } /// @@ -989,7 +1023,7 @@ public void SetActiveAndBindTexture(IShaderParam param, ITextureHandle texId, Te _shaderParam2TexUnit[iParam] = texUnit; } - GL.ActiveTexture(TextureUnit.Texture0 + texUnit); + GL.ActiveTexture(TextureUnit.Texture0 + (uint)texUnit); BindTextureByTarget(texId, texTarget); } @@ -1016,7 +1050,7 @@ public void SetActiveAndBindTextureArray(IShaderParam param, ITextureHandle[] te { texUnitArray[i] = firstTexUnit + i; - GL.ActiveTexture(TextureUnit.Texture0 + firstTexUnit + i); + GL.ActiveTexture(TextureUnit.Texture0 + (uint)firstTexUnit + (uint)i); BindTextureByTarget(texIds[i], texTarget); } } @@ -1045,7 +1079,7 @@ public void SetActiveAndBindTextureArray(IShaderParam param, ITextureHandle[] te { texUnitArray[i] = firstTexUnit + i; - GL.ActiveTexture(TextureUnit.Texture0 + firstTexUnit + i); + GL.ActiveTexture(TextureUnit.Texture0 + (uint)firstTexUnit + (uint)i); BindTextureByTarget(texIds[i], texTarget); } } @@ -1059,8 +1093,8 @@ public void SetActiveAndBindTextureArray(IShaderParam param, ITextureHandle[] te /// The internal sized format of the texture. public void SetShaderParamImage(IShaderParam param, ITextureHandle texId, TextureType texTarget, ImagePixelFormat format) { - SetActiveAndBindImage(param, texId, texTarget, format, TextureAccess.ReadWrite, out int texUnit); - GL.Uniform1(((ShaderParam)param).handle, texUnit); + SetActiveAndBindImage(param, texId, texTarget, format, BufferAccessARB.ReadWrite, out int texUnit); + GL.Uniform1i(((ShaderParam)param).handle, texUnit); } /// @@ -1072,7 +1106,7 @@ public void SetShaderParamImage(IShaderParam param, ITextureHandle texId, Textur public void SetShaderParamTexture(IShaderParam param, ITextureHandle texId, TextureType texTarget) { SetActiveAndBindTexture(param, texId, texTarget, out int texUnit); - GL.Uniform1(((ShaderParam)param).handle, texUnit); + GL.Uniform1i(((ShaderParam)param).handle, texUnit); } /// @@ -1084,11 +1118,8 @@ public void SetShaderParamTexture(IShaderParam param, ITextureHandle texId, Text public unsafe void SetShaderParamTextureArray(IShaderParam param, ITextureHandle[] texIds, TextureType texTarget) { SetActiveAndBindTextureArray(param, texIds, texTarget, out int[] texUnitArray); - - fixed (int* pFlt = &texUnitArray[0]) - GL.Uniform1(((ShaderParam)param).handle, texUnitArray.Length, pFlt); + GL.Uniform1i(((ShaderParam)param).handle, texUnitArray.Length, new Span(texUnitArray)); } - #endregion #region Clear @@ -1112,8 +1143,16 @@ public float4 ClearColor { get { - GL.GetFloat(GetPName.ColorClearValue, out OpenTK.Mathematics.Vector4 ret); - return new float4(ret.X, ret.Y, ret.Z, ret.W); + float r = 0; + float g = 0; + float b = 0; + float a = 0; + + GL.GetFloat(GetPName.ColorClearValue, 0, ref r); + GL.GetFloat(GetPName.ColorClearValue, 1, ref g); + GL.GetFloat(GetPName.ColorClearValue, 2, ref b); + GL.GetFloat(GetPName.ColorClearValue, 3, ref a); + return new float4(r, g, b, a); } set => GL.ClearColor(value.x, value.y, value.z, value.w); } @@ -1128,7 +1167,8 @@ public float ClearDepth { get { - GL.GetFloat(GetPName.DepthClearValue, out float ret); + float ret = 0; + GL.GetFloat(GetPName.DepthClearValue, ref ret); return ret; } set => GL.ClearDepth(value); @@ -1188,12 +1228,16 @@ public IAttribImp CreateAttributeBuffer(float3[] attributes, string attributeNam } int vertsBytes = attributes.Length * 3 * sizeof(float); - GL.GenBuffers(1, out int handle); + var handle = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, handle); + unsafe + { + using var data = attributes.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, vertsBytes, data.Pointer, BufferUsageARB.StaticDraw); + } - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertsBytes), attributes, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != vertsBytes) throw new ApplicationException(string.Format( "Problem uploading attribute buffer to VBO ('{2}'). Tried to upload {0} bytes, uploaded {1}.", @@ -1211,11 +1255,11 @@ public void DeleteAttributeBuffer(IAttribImp attribHandle) { if (attribHandle != null) { - int handle = ((AttributeImp)attribHandle).AttributeBufferObject; - if (handle != 0) + var handle = ((AttributeImp)attribHandle).AttributeBufferObject; + if (handle.Handle != 0) { - GL.DeleteBuffer(handle); - ((AttributeImp)attribHandle).AttributeBufferObject = 0; + GL.DeleteBuffer(in handle); + ((AttributeImp)attribHandle).AttributeBufferObject.Handle = 0; } } } @@ -1226,7 +1270,7 @@ public void DeleteAttributeBuffer(IAttribImp attribHandle) /// The instance. public void SetVertexArrayObject(IMeshImp mr) { - if (((MeshImp)mr).VertexArrayObject == 0) + if (((MeshImp)mr).VertexArrayObject.Handle == 0) ((MeshImp)mr).VertexArrayObject = GL.GenVertexArray(); GL.BindVertexArray(((MeshImp)mr).VertexArrayObject); @@ -1247,12 +1291,17 @@ public void SetVertices(IMeshImp mr, float3[] vertices) } int vertsBytes = vertices.Length * 3 * sizeof(float); - if (((MeshImp)mr).VertexBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).VertexBufferObject); + if (((MeshImp)mr).VertexBufferObject.Handle == 0) + ((MeshImp)mr).VertexBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).VertexBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertsBytes), vertices, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).VertexBufferObject); + unsafe + { + using var dataMemHandle = vertices.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, vertsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != vertsBytes) throw new ApplicationException(string.Format("Problem uploading vertex buffer to VBO (vertices). Tried to upload {0} bytes, uploaded {1}.", vertsBytes, vboBytes)); } @@ -1272,12 +1321,17 @@ public void SetTangents(IMeshImp mr, float4[] tangents) } int tangentBytes = tangents.Length * 4 * sizeof(float); - if (((MeshImp)mr).TangentBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).TangentBufferObject); + if (((MeshImp)mr).TangentBufferObject.Handle == 0) + ((MeshImp)mr).TangentBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).TangentBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(tangentBytes), tangents, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).TangentBufferObject); + unsafe + { + using var dataMemHandle = tangents.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, tangentBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != tangentBytes) throw new ApplicationException(string.Format("Problem uploading vertex buffer to VBO (tangents). Tried to upload {0} bytes, uploaded {1}.", tangentBytes, vboBytes)); } @@ -1297,12 +1351,17 @@ public void SetBiTangents(IMeshImp mr, float3[] bitangents) } int bitangentBytes = bitangents.Length * 3 * sizeof(float); - if (((MeshImp)mr).BitangentBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).BitangentBufferObject); + if (((MeshImp)mr).BitangentBufferObject.Handle == 0) + ((MeshImp)mr).BitangentBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BitangentBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(bitangentBytes), bitangents, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BitangentBufferObject); + unsafe + { + using var dataMemHandle = bitangents.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, bitangentBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != bitangentBytes) throw new ApplicationException(string.Format("Problem uploading vertex buffer to VBO (bitangents). Tried to upload {0} bytes, uploaded {1}.", bitangentBytes, vboBytes)); } @@ -1322,12 +1381,17 @@ public void SetNormals(IMeshImp mr, float3[] normals) } int normsBytes = normals.Length * 3 * sizeof(float); - if (((MeshImp)mr).NormalBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).NormalBufferObject); + if (((MeshImp)mr).NormalBufferObject.Handle == 0) + ((MeshImp)mr).NormalBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).NormalBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(normsBytes), normals, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).NormalBufferObject); + unsafe + { + using var dataMemHandle = normals.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, normsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != normsBytes) throw new ApplicationException(string.Format("Problem uploading normal buffer to VBO (normals). Tried to upload {0} bytes, uploaded {1}.", normsBytes, vboBytes)); } @@ -1347,12 +1411,17 @@ public void SetBoneIndices(IMeshImp mr, float4[] boneIndices) } int indicesBytes = boneIndices.Length * 4 * sizeof(float); - if (((MeshImp)mr).BoneIndexBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).BoneIndexBufferObject); + if (((MeshImp)mr).BoneIndexBufferObject.Handle == 0) + ((MeshImp)mr).BoneIndexBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BoneIndexBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(indicesBytes), boneIndices, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BoneIndexBufferObject); + unsafe + { + using var dataMemHandle = boneIndices.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, indicesBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != indicesBytes) throw new ApplicationException(string.Format("Problem uploading bone indices buffer to VBO (bone indices). Tried to upload {0} bytes, uploaded {1}.", indicesBytes, vboBytes)); } @@ -1372,12 +1441,17 @@ public void SetBoneWeights(IMeshImp mr, float4[] boneWeights) } int weightsBytes = boneWeights.Length * 4 * sizeof(float); - if (((MeshImp)mr).BoneWeightBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).BoneWeightBufferObject); + if (((MeshImp)mr).BoneWeightBufferObject.Handle == 0) + ((MeshImp)mr).BoneWeightBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BoneWeightBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(weightsBytes), boneWeights, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BoneWeightBufferObject); + unsafe + { + using var dataMemHandle = boneWeights.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, weightsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != weightsBytes) throw new ApplicationException(string.Format("Problem uploading bone weights buffer to VBO (bone weights). Tried to upload {0} bytes, uploaded {1}.", weightsBytes, vboBytes)); } @@ -1397,12 +1471,17 @@ public void SetUVs(IMeshImp mr, float2[] uvs) } int uvsBytes = uvs.Length * 2 * sizeof(float); - if (((MeshImp)mr).UVBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).UVBufferObject); + if (((MeshImp)mr).UVBufferObject.Handle == 0) + ((MeshImp)mr).UVBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).UVBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(uvsBytes), uvs, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).UVBufferObject); + unsafe + { + using var dataMemHandle = uvs.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, uvsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != uvsBytes) throw new ApplicationException(string.Format("Problem uploading uv buffer to VBO (uvs). Tried to upload {0} bytes, uploaded {1}.", uvsBytes, vboBytes)); } @@ -1422,12 +1501,17 @@ public void SetColors(IMeshImp mr, uint[] colors) } int colsBytes = colors.Length * sizeof(uint); - if (((MeshImp)mr).ColorBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).ColorBufferObject); + if (((MeshImp)mr).ColorBufferObject.Handle == 0) + ((MeshImp)mr).ColorBufferObject = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(colsBytes), colors, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject); + unsafe + { + using var dataMemHandle = colors.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, colsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != colsBytes) throw new ApplicationException(string.Format("Problem uploading color buffer to VBO (colors). Tried to upload {0} bytes, uploaded {1}.", colsBytes, vboBytes)); } @@ -1447,12 +1531,17 @@ public void SetColors1(IMeshImp mr, uint[] colors) } int colsBytes = colors.Length * sizeof(uint); - if (((MeshImp)mr).ColorBufferObject1 == 0) - GL.GenBuffers(1, out ((MeshImp)mr).ColorBufferObject1); + if (((MeshImp)mr).ColorBufferObject1.Handle == 0) + ((MeshImp)mr).ColorBufferObject1 = GL.GenBuffer(); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject1); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(colsBytes), colors, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject1); + unsafe + { + using var dataMemHandle = colors.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, colsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != colsBytes) throw new ApplicationException(string.Format("Problem uploading color buffer to VBO (colors). Tried to upload {0} bytes, uploaded {1}.", colsBytes, vboBytes)); } @@ -1472,12 +1561,19 @@ public void SetColors2(IMeshImp mr, uint[] colors) } int colsBytes = colors.Length * sizeof(uint); - if (((MeshImp)mr).ColorBufferObject2 == 0) - GL.GenBuffers(1, out ((MeshImp)mr).ColorBufferObject2); + if (((MeshImp)mr).ColorBufferObject2.Handle == 0) + ((MeshImp)mr).ColorBufferObject2 = GL.GenBuffer(); + + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject2); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject2); - GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(colsBytes), colors, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + unsafe + { + using var dataMemHandle = colors.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ArrayBuffer, colsBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != colsBytes) throw new ApplicationException(string.Format("Problem uploading color buffer to VBO (colors). Tried to upload {0} bytes, uploaded {1}.", colsBytes, vboBytes)); } @@ -1498,12 +1594,18 @@ public void SetTriangles(IMeshImp mr, ushort[] triangleIndices) ((MeshImp)mr).NElements = triangleIndices.Length; int trisBytes = triangleIndices.Length * sizeof(short); - if (((MeshImp)mr).ElementBufferObject == 0) - GL.GenBuffers(1, out ((MeshImp)mr).ElementBufferObject); + if (((MeshImp)mr).ElementBufferObject.Handle == 0) + ((MeshImp)mr).ElementBufferObject = GL.GenBuffer(); // Upload the index buffer (elements inside the vertex buffer, not color indices as per the IndexPointer function!) - GL.BindBuffer(BufferTarget.ElementArrayBuffer, ((MeshImp)mr).ElementBufferObject); - GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(trisBytes), triangleIndices, BufferUsageHint.StaticDraw); - GL.GetBufferParameter(BufferTarget.ElementArrayBuffer, BufferParameterName.BufferSize, out int vboBytes); + GL.BindBuffer(BufferTargetARB.ElementArrayBuffer, ((MeshImp)mr).ElementBufferObject); + unsafe + { + using var dataMemHandle = triangleIndices.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ElementArrayBuffer, trisBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } + + int vboBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ElementArrayBuffer, BufferPNameARB.BufferSize, ref vboBytes); if (vboBytes != trisBytes) throw new ApplicationException(string.Format("Problem uploading vertex buffer to VBO (offsets). Tried to upload {0} bytes, uploaded {1}.", trisBytes, vboBytes)); } @@ -1545,7 +1647,7 @@ public void RemoveColors(IMeshImp mr) /// The mesh which buffer respectively GPU memory should be deleted. public void RemoveColors1(IMeshImp mr) { - GL.DeleteBuffers(1, ref ((MeshImp)mr).ColorBufferObject1); + GL.DeleteBuffer(((MeshImp)mr).ColorBufferObject1); ((MeshImp)mr).InvalidateColors1(); } @@ -1555,7 +1657,7 @@ public void RemoveColors1(IMeshImp mr) /// The mesh which buffer respectively GPU memory should be deleted. public void RemoveColors2(IMeshImp mr) { - GL.DeleteBuffers(1, ref ((MeshImp)mr).ColorBufferObject2); + GL.DeleteBuffer(((MeshImp)mr).ColorBufferObject2); ((MeshImp)mr).InvalidateColors2(); } @@ -1624,7 +1726,7 @@ public void RemoveBiTangents(IMeshImp mr) /// public void MemoryBarrier() { - GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits); + GL.MemoryBarrier(MemoryBarrierMask.AllBarrierBits); } /// @@ -1634,7 +1736,7 @@ public void MemoryBarrier() /// The number of work groups to be launched in the X dimension. /// The number of work groups to be launched in the Y dimension. /// he number of work groups to be launched in the Z dimension. - public void DispatchCompute(int kernelIndex, int threadGroupsX, int threadGroupsY, int threadGroupsZ) + public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGroupsY, uint threadGroupsZ) { GL.DispatchCompute(threadGroupsX, threadGroupsY, threadGroupsZ); } @@ -1647,69 +1749,69 @@ public void Render(IMeshImp mr) { GL.BindVertexArray(((MeshImp)mr).VertexArrayObject); - if (((MeshImp)mr).VertexBufferObject != 0) + if (((MeshImp)mr).VertexBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.VertexAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).VertexBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).VertexBufferObject); GL.VertexAttribPointer(AttributeLocations.VertexAttribLocation, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).ColorBufferObject != 0) + if (((MeshImp)mr).ColorBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.ColorAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject); GL.VertexAttribPointer(AttributeLocations.ColorAttribLocation, 4, VertexAttribPointerType.UnsignedByte, true, 0, IntPtr.Zero); } - if (((MeshImp)mr).ColorBufferObject1 != 0) + if (((MeshImp)mr).ColorBufferObject1.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.Color1AttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject1); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject1); GL.VertexAttribPointer(AttributeLocations.Color1AttribLocation, 4, VertexAttribPointerType.UnsignedByte, true, 0, IntPtr.Zero); } - if (((MeshImp)mr).ColorBufferObject2 != 0) + if (((MeshImp)mr).ColorBufferObject2.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.Color2AttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).ColorBufferObject2); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).ColorBufferObject2); GL.VertexAttribPointer(AttributeLocations.Color2AttribLocation, 4, VertexAttribPointerType.UnsignedByte, true, 0, IntPtr.Zero); } - if (((MeshImp)mr).UVBufferObject != 0) + if (((MeshImp)mr).UVBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.UvAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).UVBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).UVBufferObject); GL.VertexAttribPointer(AttributeLocations.UvAttribLocation, 2, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).NormalBufferObject != 0) + if (((MeshImp)mr).NormalBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.NormalAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).NormalBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).NormalBufferObject); GL.VertexAttribPointer(AttributeLocations.NormalAttribLocation, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).TangentBufferObject != 0) + if (((MeshImp)mr).TangentBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.TangentAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).TangentBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).TangentBufferObject); GL.VertexAttribPointer(AttributeLocations.TangentAttribLocation, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).BitangentBufferObject != 0) + if (((MeshImp)mr).BitangentBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.BitangentAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BitangentBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BitangentBufferObject); GL.VertexAttribPointer(AttributeLocations.BitangentAttribLocation, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).BoneIndexBufferObject != 0) + if (((MeshImp)mr).BoneIndexBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.BoneIndexAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BoneIndexBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BoneIndexBufferObject); GL.VertexAttribPointer(AttributeLocations.BoneIndexAttribLocation, 4, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).BoneWeightBufferObject != 0) + if (((MeshImp)mr).BoneWeightBufferObject.Handle != 0) { GL.EnableVertexAttribArray(AttributeLocations.BoneWeightAttribLocation); - GL.BindBuffer(BufferTarget.ArrayBuffer, ((MeshImp)mr).BoneWeightBufferObject); + GL.BindBuffer(BufferTargetARB.ArrayBuffer, ((MeshImp)mr).BoneWeightBufferObject); GL.VertexAttribPointer(AttributeLocations.BoneWeightAttribLocation, 4, VertexAttribPointerType.Float, false, 0, IntPtr.Zero); } - if (((MeshImp)mr).ElementBufferObject != 0) + if (((MeshImp)mr).ElementBufferObject.Handle != 0) { - GL.BindBuffer(BufferTarget.ElementArrayBuffer, ((MeshImp)mr).ElementBufferObject); + GL.BindBuffer(BufferTargetARB.ElementArrayBuffer, ((MeshImp)mr).ElementBufferObject); switch (((MeshImp)mr).MeshType) { @@ -1724,7 +1826,7 @@ public void Render(IMeshImp mr) _isPtRenderingEnabled = true; GL.Enable(EnableCap.ProgramPointSize); //GL.Enable(EnableCap.PointSprite); - GL.Enable(EnableCap.VertexProgramPointSize); + //GL.Enable(EnableCap.VertexProgramPointSize); } GL.DrawElements(PrimitiveType.Points, ((MeshImp)mr).NElements, DrawElementsType.UnsignedShort, IntPtr.Zero); break; @@ -1767,20 +1869,20 @@ public void Render(IMeshImp mr) } } - if (((MeshImp)mr).VertexBufferObject != 0) + if (((MeshImp)mr).VertexBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.VertexAttribLocation); - if (((MeshImp)mr).ColorBufferObject != 0) + if (((MeshImp)mr).ColorBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.ColorAttribLocation); - if (((MeshImp)mr).NormalBufferObject != 0) + if (((MeshImp)mr).NormalBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.NormalAttribLocation); - if (((MeshImp)mr).UVBufferObject != 0) + if (((MeshImp)mr).UVBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.UvAttribLocation); - if (((MeshImp)mr).TangentBufferObject != 0) + if (((MeshImp)mr).TangentBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.TangentAttribLocation); - if (((MeshImp)mr).BitangentBufferObject != 0) + if (((MeshImp)mr).BitangentBufferObject.Handle != 0) GL.DisableVertexAttribArray(AttributeLocations.TangentAttribLocation); - GL.BindVertexArray(0); + GL.BindVertexArray(new VertexArrayHandle(0)); } /// @@ -1790,8 +1892,8 @@ public void Render(IMeshImp mr) /// The texture identifier. public void GetBufferContent(Common.Rectangle quad, ITextureHandle texId) { - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)texId).TexHandle); - GL.CopyTexImage2D(TextureTarget.Texture2D, 0, InternalFormat.Rgba, quad.Left, quad.Top, quad.Width, quad.Height, 0); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)texId).TexHandle); + GL.CopyTexImage2D(TextureTarget.Texture2d, 0, InternalFormat.Rgba, quad.Left, quad.Top, quad.Width, quad.Height, 0); } /// @@ -1803,28 +1905,28 @@ public IMeshImp CreateMeshImp() return new MeshImp(); } - internal static BlendEquationMode BlendOperationToOgl(BlendOperation bo) + internal static BlendEquationModeEXT BlendOperationToOgl(BlendOperation bo) { return bo switch { - BlendOperation.Add => BlendEquationMode.FuncAdd, - BlendOperation.Subtract => BlendEquationMode.FuncSubtract, - BlendOperation.ReverseSubtract => BlendEquationMode.FuncReverseSubtract, - BlendOperation.Minimum => BlendEquationMode.Min, - BlendOperation.Maximum => BlendEquationMode.Max, + BlendOperation.Add => BlendEquationModeEXT.FuncAdd, + BlendOperation.Subtract => BlendEquationModeEXT.FuncSubtract, + BlendOperation.ReverseSubtract => BlendEquationModeEXT.FuncReverseSubtract, + BlendOperation.Minimum => BlendEquationModeEXT.Min, + BlendOperation.Maximum => BlendEquationModeEXT.Max, _ => throw new ArgumentOutOfRangeException($"Invalid argument: {bo}"), }; } - internal static BlendOperation BlendOperationFromOgl(BlendEquationMode bom) + internal static BlendOperation BlendOperationFromOgl(BlendEquationModeEXT bom) { return bom switch { - BlendEquationMode.FuncAdd => BlendOperation.Add, - BlendEquationMode.Min => BlendOperation.Minimum, - BlendEquationMode.Max => BlendOperation.Maximum, - BlendEquationMode.FuncSubtract => BlendOperation.Subtract, - BlendEquationMode.FuncReverseSubtract => BlendOperation.ReverseSubtract, + BlendEquationModeEXT.FuncAdd => BlendOperation.Add, + BlendEquationModeEXT.Min => BlendOperation.Minimum, + BlendEquationModeEXT.Max => BlendOperation.Maximum, + BlendEquationModeEXT.FuncSubtract => BlendOperation.Subtract, + BlendEquationModeEXT.FuncReverseSubtract => BlendOperation.ReverseSubtract, _ => throw new ArgumentOutOfRangeException($"Invalid argument: {bom}"), }; } @@ -1833,18 +1935,18 @@ internal static int BlendToOgl(Blend blend, bool isForBlendFactorAlpha = false) { return blend switch { - Blend.Zero => (int)BlendingFactorSrc.Zero, - Blend.One => (int)BlendingFactorSrc.One, - Blend.SourceColor => (int)BlendingFactorDest.SrcColor, - Blend.InverseSourceColor => (int)BlendingFactorDest.OneMinusSrcColor, - Blend.SourceAlpha => (int)BlendingFactorSrc.SrcAlpha, - Blend.InverseSourceAlpha => (int)BlendingFactorSrc.OneMinusSrcAlpha, - Blend.DestinationAlpha => (int)BlendingFactorSrc.DstAlpha, - Blend.InverseDestinationAlpha => (int)BlendingFactorSrc.OneMinusDstAlpha, - Blend.DestinationColor => (int)BlendingFactorSrc.DstColor, - Blend.InverseDestinationColor => (int)BlendingFactorSrc.OneMinusDstColor, - Blend.BlendFactor => (int)((isForBlendFactorAlpha) ? BlendingFactorSrc.ConstantAlpha : BlendingFactorSrc.ConstantColor), - Blend.InverseBlendFactor => (int)((isForBlendFactorAlpha) ? BlendingFactorSrc.OneMinusConstantAlpha : BlendingFactorSrc.OneMinusConstantColor), + Blend.Zero => (int)BlendingFactor.Zero, + Blend.One => (int)BlendingFactor.One, + Blend.SourceColor => (int)BlendingFactor.SrcColor, + Blend.InverseSourceColor => (int)BlendingFactor.OneMinusSrcColor, + Blend.SourceAlpha => (int)BlendingFactor.SrcAlpha, + Blend.InverseSourceAlpha => (int)BlendingFactor.OneMinusSrcAlpha, + Blend.DestinationAlpha => (int)BlendingFactor.DstAlpha, + Blend.InverseDestinationAlpha => (int)BlendingFactor.OneMinusDstAlpha, + Blend.DestinationColor => (int)BlendingFactor.DstColor, + Blend.InverseDestinationColor => (int)BlendingFactor.OneMinusDstColor, + Blend.BlendFactor => (int)((isForBlendFactorAlpha) ? BlendingFactor.ConstantAlpha : BlendingFactor.ConstantColor), + Blend.InverseBlendFactor => (int)((isForBlendFactorAlpha) ? BlendingFactor.OneMinusConstantAlpha : BlendingFactor.OneMinusConstantColor), // Ignored... // case Blend.SourceAlphaSaturated: // break; @@ -1864,18 +1966,18 @@ internal static Blend BlendFromOgl(int bf) { return bf switch { - (int)BlendingFactorSrc.Zero => Blend.Zero, - (int)BlendingFactorSrc.One => Blend.One, - (int)BlendingFactorDest.SrcColor => Blend.SourceColor, - (int)BlendingFactorDest.OneMinusSrcColor => Blend.InverseSourceColor, - (int)BlendingFactorSrc.SrcAlpha => Blend.SourceAlpha, - (int)BlendingFactorSrc.OneMinusSrcAlpha => Blend.InverseSourceAlpha, - (int)BlendingFactorSrc.DstAlpha => Blend.DestinationAlpha, - (int)BlendingFactorSrc.OneMinusDstAlpha => Blend.InverseDestinationAlpha, - (int)BlendingFactorSrc.DstColor => Blend.DestinationColor, - (int)BlendingFactorSrc.OneMinusDstColor => Blend.InverseDestinationColor, - (int)BlendingFactorSrc.ConstantAlpha or (int)BlendingFactorSrc.ConstantColor => Blend.BlendFactor, - (int)BlendingFactorSrc.OneMinusConstantAlpha or (int)BlendingFactorSrc.OneMinusConstantColor => Blend.InverseBlendFactor, + (int)BlendingFactor.Zero => Blend.Zero, + (int)BlendingFactor.One => Blend.One, + (int)BlendingFactor.SrcColor => Blend.SourceColor, + (int)BlendingFactor.OneMinusSrcColor => Blend.InverseSourceColor, + (int)BlendingFactor.SrcAlpha => Blend.SourceAlpha, + (int)BlendingFactor.OneMinusSrcAlpha => Blend.InverseSourceAlpha, + (int)BlendingFactor.DstAlpha => Blend.DestinationAlpha, + (int)BlendingFactor.OneMinusDstAlpha => Blend.InverseDestinationAlpha, + (int)BlendingFactor.DstColor => Blend.DestinationColor, + (int)BlendingFactor.OneMinusDstColor => Blend.InverseDestinationColor, + (int)BlendingFactor.ConstantAlpha or (int)BlendingFactor.ConstantColor => Blend.BlendFactor, + (int)BlendingFactor.OneMinusConstantAlpha or (int)BlendingFactor.OneMinusConstantColor => Blend.InverseBlendFactor, _ => throw new ArgumentOutOfRangeException("blend"), }; } @@ -1982,30 +2084,31 @@ public void SetRenderState(RenderState renderState, uint value) break; case RenderState.SourceBlend: { - _blendSrcRgb = (BlendingFactorSrc)BlendToOgl((Blend)value); + _blendSrcRgb = (BlendingFactor)BlendToOgl((Blend)value); GL.BlendFuncSeparate(_blendSrcRgb, _blendDstRgb, _blendSrcAlpha, _blendDstAlpha); } break; case RenderState.DestinationBlend: { - _blendDstRgb = (BlendingFactorDest)BlendToOgl((Blend)value); + _blendDstRgb = (BlendingFactor)BlendToOgl((Blend)value); GL.BlendFuncSeparate(_blendSrcRgb, _blendDstRgb, _blendSrcAlpha, _blendDstAlpha); } break; case RenderState.SourceBlendAlpha: { - _blendSrcAlpha = (BlendingFactorSrc)BlendToOgl((Blend)value); + _blendSrcAlpha = (BlendingFactor)BlendToOgl((Blend)value); GL.BlendFuncSeparate(_blendSrcRgb, _blendDstRgb, _blendSrcAlpha, _blendDstAlpha); } break; case RenderState.DestinationBlendAlpha: { - _blendDstAlpha = (BlendingFactorDest)BlendToOgl((Blend)value); + _blendDstAlpha = (BlendingFactor)BlendToOgl((Blend)value); GL.BlendFuncSeparate(_blendSrcRgb, _blendDstRgb, _blendSrcAlpha, _blendDstAlpha); } break; case RenderState.BlendFactor: - GL.BlendColor(Color.FromArgb((int)value)); + var col = Color.FromArgb((int)value); + GL.BlendColor(col.R, col.G, col.B, col.A); break; default: throw new ArgumentOutOfRangeException(nameof(renderState)); @@ -2030,7 +2133,8 @@ public uint GetRenderState(RenderState renderState) { case RenderState.FillMode: { - GL.GetInteger(GetPName.PolygonMode, out int pm); + int pm = 0; + GL.GetInteger(GetPName.PolygonMode, ref pm); var ret = (PolygonMode)pm switch { PolygonMode.Point => FillMode.Point, @@ -2042,10 +2146,12 @@ public uint GetRenderState(RenderState renderState) } case RenderState.CullMode: { - GL.GetInteger(GetPName.CullFace, out int cullFace); + int cullFace = 0; + int frontFace = 0; + GL.GetInteger(GetPName.CullFace, ref cullFace); if (cullFace == 0) return (uint)Cull.None; - GL.GetInteger(GetPName.FrontFace, out int frontFace); + GL.GetInteger(GetPName.FrontFace, ref frontFace); if (frontFace == (int)FrontFaceDirection.Cw) return (uint)Cull.Clockwise; return (uint)Cull.Counterclockwise; @@ -2055,7 +2161,8 @@ public uint GetRenderState(RenderState renderState) return 1; // == true case RenderState.ZFunc: { - GL.GetInteger(GetPName.DepthFunc, out int depFunc); + int depFunc = 0; + GL.GetInteger(GetPName.DepthFunc, ref depFunc); var ret = (DepthFunction)depFunc switch { DepthFunction.Never => Compare.Never, @@ -2072,52 +2179,61 @@ public uint GetRenderState(RenderState renderState) } case RenderState.ZEnable: { - GL.GetInteger(GetPName.DepthTest, out int depTest); + int depTest = 0; + GL.GetInteger(GetPName.DepthTest, ref depTest); return (uint)(depTest); } case RenderState.ZWriteEnable: { - GL.GetInteger(GetPName.DepthWritemask, out int depWriteMask); + int depWriteMask = 0; + GL.GetInteger(GetPName.DepthWritemask, ref depWriteMask); return (uint)(depWriteMask); } case RenderState.AlphaBlendEnable: { - GL.GetInteger(GetPName.Blend, out int blendEnable); + int blendEnable = 0; + GL.GetInteger(GetPName.Blend, ref blendEnable); return (uint)(blendEnable); } case RenderState.BlendOperation: { - GL.GetInteger(GetPName.BlendEquationRgb, out int rgbMode); - return (uint)BlendOperationFromOgl((BlendEquationMode)rgbMode); + int rgbMode = 0; + GL.GetInteger(GetPName.BlendEquationRgb, ref rgbMode); + return (uint)BlendOperationFromOgl((BlendEquationModeEXT)rgbMode); } case RenderState.BlendOperationAlpha: { - GL.GetInteger(GetPName.BlendEquationAlpha, out int alphaMode); - return (uint)BlendOperationFromOgl((BlendEquationMode)alphaMode); + int alphaMode = 0; + GL.GetInteger(GetPName.BlendEquationAlpha, ref alphaMode); + return (uint)BlendOperationFromOgl((BlendEquationModeEXT)alphaMode); } case RenderState.SourceBlend: { - GL.GetInteger(GetPName.BlendSrcRgb, out int rgbSrc); + int rgbSrc = 0; + GL.GetInteger(GetPName.BlendSrcRgb, ref rgbSrc); return (uint)BlendFromOgl(rgbSrc); } case RenderState.DestinationBlend: { - GL.GetInteger(GetPName.BlendSrcRgb, out int rgbDst); + int rgbDst = 0; + GL.GetInteger(GetPName.BlendSrcRgb, ref rgbDst); return (uint)BlendFromOgl(rgbDst); } case RenderState.SourceBlendAlpha: { - GL.GetInteger(GetPName.BlendSrcAlpha, out int alphaSrc); + int alphaSrc = 0; + GL.GetInteger(GetPName.BlendSrcAlpha, ref alphaSrc); return (uint)BlendFromOgl(alphaSrc); } case RenderState.DestinationBlendAlpha: { - GL.GetInteger(GetPName.BlendDstAlpha, out int alphaDst); + int alphaDst = 0; + GL.GetInteger(GetPName.BlendDstAlpha, ref alphaDst); return (uint)BlendFromOgl(alphaDst); } case RenderState.BlendFactor: - int col; - GL.GetInteger(GetPName.BlendColorExt, out col); + int col = 0; + GL.GetInteger(GetPName.BlendColorExt, ref col); return (uint)col; default: throw new ArgumentOutOfRangeException(nameof(renderState)); @@ -2131,13 +2247,13 @@ public uint GetRenderState(RenderState renderState) /// The texture handle, associated with the given texture. Should be created by the TextureManager in the RenderContext. public void SetRenderTarget(IWritableTexture tex, ITextureHandle texHandle) { - if (((TextureHandle)texHandle).FrameBufferHandle == -1) + if (((TextureHandle)texHandle).FrameBufferHandle.Handle == -1) { var fBuffer = GL.GenFramebuffer(); ((TextureHandle)texHandle).FrameBufferHandle = fBuffer; GL.BindFramebuffer(FramebufferTarget.Framebuffer, fBuffer); - GL.BindTexture(TextureTarget.Texture2D, ((TextureHandle)texHandle).TexHandle); + GL.BindTexture(TextureTarget.Texture2d, ((TextureHandle)texHandle).TexHandle); if (tex.TextureType != RenderTargetTextureTypes.Depth) { @@ -2155,7 +2271,7 @@ public void SetRenderTarget(IWritableTexture tex, ITextureHandle texHandle) else GL.BindFramebuffer(FramebufferTarget.Framebuffer, ((TextureHandle)texHandle).FrameBufferHandle); - if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) + if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferStatus.FramebufferComplete) throw new Exception($"Error creating RenderTarget: {GL.GetError()}, {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}"); GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit); @@ -2168,7 +2284,7 @@ public void SetRenderTarget(IWritableTexture tex, ITextureHandle texHandle) /// The texture handle, associated with the given cube map. Should be created by the TextureManager in the RenderContext. public void SetRenderTarget(IWritableCubeMap tex, ITextureHandle texHandle) { - if (((TextureHandle)texHandle).FrameBufferHandle == -1) + if (((TextureHandle)texHandle).FrameBufferHandle.Handle == -1) { var fBuffer = GL.GenFramebuffer(); ((TextureHandle)texHandle).FrameBufferHandle = fBuffer; @@ -2192,7 +2308,7 @@ public void SetRenderTarget(IWritableCubeMap tex, ITextureHandle texHandle) else GL.BindFramebuffer(FramebufferTarget.Framebuffer, ((TextureHandle)texHandle).FrameBufferHandle); - if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) + if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferStatus.FramebufferComplete) throw new Exception($"Error creating RenderTarget: {GL.GetError()}, {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}"); @@ -2207,13 +2323,13 @@ public void SetRenderTarget(IWritableCubeMap tex, ITextureHandle texHandle) /// The texture handle, associated with the given texture. Should be created by the TextureManager in the RenderContext. public void SetRenderTarget(IWritableArrayTexture tex, int layer, ITextureHandle texHandle) { - if (((TextureHandle)texHandle).FrameBufferHandle == -1) + if (((TextureHandle)texHandle).FrameBufferHandle.Handle == -1) { var fBuffer = GL.GenFramebuffer(); ((TextureHandle)texHandle).FrameBufferHandle = fBuffer; GL.BindFramebuffer(FramebufferTarget.Framebuffer, fBuffer); - GL.BindTexture(TextureTarget.Texture2DArray, ((TextureHandle)texHandle).TexHandle); + GL.BindTexture(TextureTarget.Texture2dArray, ((TextureHandle)texHandle).TexHandle); if (tex.TextureType != RenderTargetTextureTypes.Depth) { @@ -2231,11 +2347,11 @@ public void SetRenderTarget(IWritableArrayTexture tex, int layer, ITextureHandle else { GL.BindFramebuffer(FramebufferTarget.Framebuffer, ((TextureHandle)texHandle).FrameBufferHandle); - GL.BindTexture(TextureTarget.Texture2DArray, ((TextureHandle)texHandle).TexHandle); + GL.BindTexture(TextureTarget.Texture2dArray, ((TextureHandle)texHandle).TexHandle); GL.FramebufferTextureLayer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, ((TextureHandle)texHandle).TexHandle, 0, layer); } - if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) + if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferStatus.FramebufferComplete) throw new Exception($"Error creating RenderTarget: {GL.GetError()}, {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}"); GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit); @@ -2250,11 +2366,11 @@ public void SetRenderTarget(IRenderTarget renderTarget, ITextureHandle[] texHand { if (renderTarget == null || (renderTarget.RenderTextures.All(x => x == null))) { - GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); + GL.BindFramebuffer(FramebufferTarget.Framebuffer, new FramebufferHandle(0)); return; } - int gBuffer; + FramebufferHandle gBuffer; if (renderTarget.GBufferHandle == null) { @@ -2270,7 +2386,7 @@ public void SetRenderTarget(IRenderTarget renderTarget, ITextureHandle[] texHand if (renderTarget.RenderTextures[(int)RenderTargetTextureTypes.Depth] == null && !renderTarget.IsDepthOnly) { - int gDepthRenderbufferHandle; + RenderbufferHandle gDepthRenderbufferHandle; if (renderTarget.DepthBufferHandle == null) { renderTarget.DepthBufferHandle = new RenderBufferHandle(); @@ -2285,7 +2401,7 @@ public void SetRenderTarget(IRenderTarget renderTarget, ITextureHandle[] texHand } } - if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) + if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferStatus.FramebufferComplete) { throw new Exception($"Error creating RenderTarget: {GL.GetError()}, {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}"); } @@ -2293,19 +2409,19 @@ public void SetRenderTarget(IRenderTarget renderTarget, ITextureHandle[] texHand GL.Clear(ClearBufferMask.DepthBufferBit | ClearBufferMask.ColorBufferBit); } - private int CreateDepthRenderBuffer(int width, int height) + private RenderbufferHandle CreateDepthRenderBuffer(int width, int height) { GL.Enable(EnableCap.DepthTest); - GL.GenRenderbuffers(1, out int gDepthRenderbufferHandle); + var gDepthRenderbufferHandle = GL.GenRenderbuffer(); //((FrameBufferHandle)renderTarget.DepthBufferHandle).Handle = gDepthRenderbufferHandle; GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, gDepthRenderbufferHandle); - GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, width, height); + GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, InternalFormat.DepthComponent24, width, height); GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, RenderbufferTarget.Renderbuffer, gDepthRenderbufferHandle); return gDepthRenderbufferHandle; } - private int CreateFrameBuffer(IRenderTarget renderTarget, ITextureHandle[] texHandles) + private FramebufferHandle CreateFrameBuffer(IRenderTarget renderTarget, ITextureHandle[] texHandles) { var gBuffer = GL.GenFramebuffer(); GL.BindFramebuffer(FramebufferTarget.Framebuffer, gBuffer); @@ -2316,32 +2432,32 @@ private int CreateFrameBuffer(IRenderTarget renderTarget, ITextureHandle[] texHa if (!renderTarget.IsDepthOnly) { - var attachments = new List(); + var attachments = new List(); //Textures - for (int i = 0; i < texHandles.Length; i++) + for (uint i = 0; i < texHandles.Length; i++) { - attachments.Add(DrawBuffersEnum.ColorAttachment0 + i); + attachments.Add(DrawBufferMode.ColorAttachment0 + i); var texHandle = texHandles[i]; if (texHandle == null) continue; if (i == depthTexPos) { - GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment + (depthCnt), TextureTarget.Texture2D, ((TextureHandle)texHandle).TexHandle, 0); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment + (uint)(depthCnt), TextureTarget.Texture2d, ((TextureHandle)texHandle).TexHandle, 0); depthCnt++; } else - GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0 + (i - depthCnt), TextureTarget.Texture2D, ((TextureHandle)texHandle).TexHandle, 0); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0 + (uint)(i - depthCnt), TextureTarget.Texture2d, ((TextureHandle)texHandle).TexHandle, 0); } - GL.DrawBuffers(attachments.Count, attachments.ToArray()); + GL.DrawBuffers(attachments.ToArray()); } else //If a frame-buffer only has a depth texture we don't need draw buffers { var texHandle = texHandles[depthTexPos]; if (texHandle != null) - GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2D, ((TextureHandle)texHandle).TexHandle, 0); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2d, ((TextureHandle)texHandle).TexHandle, 0); else throw new NullReferenceException("Texture handle is null!"); @@ -2360,7 +2476,7 @@ private int CreateFrameBuffer(IRenderTarget renderTarget, ITextureHandle[] texHa /// Determines if the texture is a depth texture. In this case the texture currently associated with will be detached. public void DetachTextureFromFbo(IRenderTarget renderTarget, bool isDepthTex, int attachment = 0) { - ChangeFramebufferTexture2D(renderTarget, attachment, 0, isDepthTex); + ChangeFramebufferTexture2d(renderTarget, attachment, new OpenTK.Graphics.TextureHandle(0), isDepthTex); } @@ -2373,32 +2489,33 @@ public void DetachTextureFromFbo(IRenderTarget renderTarget, bool isDepthTex, in /// The gpu handle of the texture. public void AttacheTextureToFbo(IRenderTarget renderTarget, bool isDepthTex, ITextureHandle texHandle, int attachment = 0) { - ChangeFramebufferTexture2D(renderTarget, attachment, ((TextureHandle)texHandle).TexHandle, isDepthTex); + ChangeFramebufferTexture2d(renderTarget, attachment, ((TextureHandle)texHandle).TexHandle, isDepthTex); } - private void ChangeFramebufferTexture2D(IRenderTarget renderTarget, int attachment, int handle, bool isDepth) + private void ChangeFramebufferTexture2d(IRenderTarget renderTarget, int attachment, OpenTK.Graphics.TextureHandle handle, bool isDepth) { - var boundFbo = GL.GetInteger(GetPName.FramebufferBinding); + int boundFbo = 0; + GL.GetInteger(GetPName.DrawFramebufferBinding, ref boundFbo); var rtFbo = ((FrameBufferHandle)renderTarget.GBufferHandle).Handle; var isCurrentFbo = true; - if (boundFbo != rtFbo) + if (boundFbo != rtFbo.Handle) { isCurrentFbo = false; GL.BindFramebuffer(FramebufferTarget.Framebuffer, rtFbo); } if (!isDepth) - GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0 + attachment, TextureTarget.Texture2D, handle, 0); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.ColorAttachment0 + (uint)attachment, TextureTarget.Texture2d, handle, 0); else - GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2D, handle, 0); + GL.FramebufferTexture2D(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, TextureTarget.Texture2d, handle, 0); - if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete) + if (GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferStatus.FramebufferComplete) throw new Exception($"Error creating RenderTarget: {GL.GetError()}, {GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer)}"); if (!isCurrentFbo) - GL.BindFramebuffer(FramebufferTarget.Framebuffer, boundFbo); + GL.BindFramebuffer(FramebufferTarget.Framebuffer, new FramebufferHandle(boundFbo)); } @@ -2464,23 +2581,6 @@ public string GetHardwareDescription() { return "Vendor: " + GL.GetString(StringName.Vendor) + "\nRenderer: " + GL.GetString(StringName.Renderer) + "\nVersion: " + GL.GetString(StringName.Version) + "\nExtensions: " + GL.GetString(StringName.Extensions); } - - /// - /// Draws a Debug Line in 3D Space by using a start and end point (float3). - /// - /// The starting point of the DebugLine. - /// The endpoint of the DebugLine. - /// The color of the DebugLine. - public void DebugLine(float3 start, float3 end, float4 color) - { - GL.Begin(PrimitiveType.Lines); - GL.Color4(color.x, color.y, color.z, color.w); - GL.Vertex3(start.x, start.y, start.z); - GL.Color4(color.x, color.y, color.z, color.w); - GL.Vertex3(end.x, end.y, end.z); - GL.End(); - } - #endregion #region Shader Storage Buffer @@ -2496,7 +2596,7 @@ public void ConnectBufferToShaderStorage(IShaderHandle currentProgram, IStorageB var shaderProgram = ((ShaderHandleImp)currentProgram).Handle; var resInx = GL.GetProgramResourceIndex(shaderProgram, ProgramInterface.ShaderStorageBlock, ssboName); GL.ShaderStorageBlockBinding(shaderProgram, resInx, buffer.BindingIndex); - GL.BindBufferBase(BufferRangeTarget.ShaderStorageBuffer, buffer.BindingIndex, ((StorageBufferHandle)buffer.BufferHandle).Handle); + GL.BindBufferBase(BufferTargetARB.ShaderStorageBuffer, buffer.BindingIndex, ((StorageBufferHandle)buffer.BufferHandle).Handle); } /// @@ -2513,9 +2613,9 @@ public void StorageBufferSetData(IStorageBuffer storageBuffer, T[] data) wher int dataBytes = storageBuffer.Count * storageBuffer.Size; //1. Generate Buffer and or set the data - if (bufferHandle.Handle == -1) + if (bufferHandle.Handle.Handle == -1) { - GL.GenBuffers(1, out bufferHandle.Handle); + bufferHandle.Handle = GL.GenBuffer(); } if (data == null || data.Length == 0) @@ -2523,14 +2623,20 @@ public void StorageBufferSetData(IStorageBuffer storageBuffer, T[] data) wher throw new ArgumentException("Data must not be null or empty"); } - GL.BindBuffer(BufferTarget.ShaderStorageBuffer, bufferHandle.Handle); - GL.BufferData(BufferTarget.ShaderStorageBuffer, dataBytes, data, BufferUsageHint.DynamicCopy); + GL.BindBuffer(BufferTargetARB.ShaderStorageBuffer, bufferHandle.Handle); + + unsafe + { + using var dataMemHandle = data.AsMemory().Pin(); + GL.BufferData(BufferTargetARB.ShaderStorageBuffer, dataBytes, dataMemHandle.Pointer, BufferUsageARB.StaticDraw); + } - GL.GetBufferParameter(BufferTarget.ShaderStorageBuffer, BufferParameterName.BufferSize, out int bufferBytes); + int bufferBytes = 0; + GL.GetBufferParameteri(BufferTargetARB.ShaderStorageBuffer, BufferPNameARB.BufferSize, ref bufferBytes); if (bufferBytes != dataBytes) throw new ApplicationException(string.Format("Problem uploading bone indices buffer to SSBO. Tried to upload {0} bytes, uploaded {1}.", bufferBytes, dataBytes)); - GL.BindBuffer(BufferTarget.ShaderStorageBuffer, 0); + GL.BindBuffer(BufferTargetARB.ShaderStorageBuffer, new BufferHandle(0)); } /// @@ -2557,7 +2663,11 @@ public void DeleteStorageBuffer(IBufferHandle storageBufferHandle) public IImageData GetPixelColor(int x, int y, int w = 1, int h = 1) { ImageData image = ImageData.CreateImage(w, h, ColorUint.Black); - GL.ReadPixels(x, y, w, h, PixelFormat.Bgr /* yuk, yuk ??? */, PixelType.UnsignedByte, image.PixelData); + unsafe + { + using var data = image.PixelData.AsMemory().Pin(); + GL.ReadPixels(x, y, w, h, PixelFormat.Bgr, PixelType.UnsignedByte, data.Pointer); + } return image; } @@ -2574,9 +2684,6 @@ public float GetPixelDepth(int x, int y) return depth; } - - - #endregion } } \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/ShaderHandleImp.cs b/src/Engine/Imp/Graphics/Desktop/ShaderHandleImp.cs new file mode 100644 index 000000000..50aede537 --- /dev/null +++ b/src/Engine/Imp/Graphics/Desktop/ShaderHandleImp.cs @@ -0,0 +1,13 @@ +using Fusee.Engine.Common; +using OpenTK.Graphics; + +namespace Fusee.Engine.Imp.Graphics.Desktop +{ + /// + /// Implementation of for usage with OpenTK framework. + /// + public class ShaderHandleImp : IShaderHandle + { + internal ProgramHandle Handle; + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/TextureHandle.cs b/src/Engine/Imp/Graphics/Desktop/TextureHandle.cs new file mode 100644 index 000000000..f50ef907d --- /dev/null +++ b/src/Engine/Imp/Graphics/Desktop/TextureHandle.cs @@ -0,0 +1,14 @@ +using Fusee.Engine.Common; + +namespace Fusee.Engine.Imp.Graphics.Desktop +{ + /// + /// Texture Implementation for OpenTK, an integer value is used as a handle + /// + class TextureHandle : ITextureHandle + { + internal OpenTK.Graphics.TextureHandle TexHandle = new(-1); + internal OpenTK.Graphics.FramebufferHandle FrameBufferHandle = new(-1); + internal OpenTK.Graphics.RenderbufferHandle DepthRenderBufferHandle = new(-1); + } +} \ No newline at end of file diff --git a/src/Engine/Imp/Graphics/Desktop/TexturePixelInfo.cs b/src/Engine/Imp/Graphics/Desktop/TexturePixelInfo.cs index 4ba340cf8..162725227 100644 --- a/src/Engine/Imp/Graphics/Desktop/TexturePixelInfo.cs +++ b/src/Engine/Imp/Graphics/Desktop/TexturePixelInfo.cs @@ -6,7 +6,7 @@ namespace Fusee.Engine.Imp.Graphics.Desktop /// Type that sums up infos about the pixels OpenGl needs to create textures on the gpu. internal struct TexturePixelInfo : ITexturePixelInfo { - public PixelInternalFormat InternalFormat; + public InternalFormat InternalFormat; public PixelFormat Format; public PixelType PxType; } diff --git a/src/Engine/Imp/Graphics/Shared/Fusee.Engine.Imp.Graphics.Shared.projitems b/src/Engine/Imp/Graphics/Shared/Fusee.Engine.Imp.Graphics.Shared.projitems index 98fe78419..fff5b89cf 100644 --- a/src/Engine/Imp/Graphics/Shared/Fusee.Engine.Imp.Graphics.Shared.projitems +++ b/src/Engine/Imp/Graphics/Shared/Fusee.Engine.Imp.Graphics.Shared.projitems @@ -9,12 +9,8 @@ Shared - - - - \ No newline at end of file From 40075aa94c0c1cd22890975ace0bdeb7e0a38887 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Tue, 14 Dec 2021 17:45:30 +0100 Subject: [PATCH 2/9] Temporary solution to bypass missing UniformType.Image2d --- .../Imp/Graphics/Desktop/RenderContextImp.cs | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 853df2a39..cf078a71c 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -768,20 +768,21 @@ public IList GetActiveUniformsList(IShaderHandle shaderProgram) paramInfo.Name = name; paramInfo.Handle = GetShaderUniformParam(sProg, paramInfo.Name); - paramInfo.Type = uType switch + //TODO: remove cast to uint when UniformType.Image2d = 36941 is available + paramInfo.Type = (uint)uType switch { - UniformType.Int => typeof(int), - UniformType.Bool => typeof(bool), - UniformType.Float => typeof(float), - UniformType.Double => typeof(double), - UniformType.IntVec2 => typeof(float2), - UniformType.FloatVec2 => typeof(float2), - UniformType.FloatVec3 => typeof(float3), - UniformType.FloatVec4 => typeof(float4), - UniformType.FloatMat4 => typeof(float4x4), - UniformType.Sampler2d or UniformType.UnsignedIntSampler2d or UniformType.IntSampler2d or UniformType.Sampler2dShadow /*or UniformType.Image2d*/ => typeof(ITextureBase), - UniformType.SamplerCube or UniformType.SamplerCubeShadow => typeof(IWritableCubeMap), - UniformType.Sampler2dArray or UniformType.Sampler2dArrayShadow => typeof(IWritableArrayTexture), + (uint)UniformType.Int => typeof(int), + (uint)UniformType.Bool => typeof(bool), + (uint)UniformType.Float => typeof(float), + (uint)UniformType.Double => typeof(double), + (uint)UniformType.IntVec2 => typeof(float2), + (uint)UniformType.FloatVec2 => typeof(float2), + (uint)UniformType.FloatVec3 => typeof(float3), + (uint)UniformType.FloatVec4 => typeof(float4), + (uint)UniformType.FloatMat4 => typeof(float4x4), + (uint)UniformType.Sampler2d or (uint)UniformType.UnsignedIntSampler2d or (uint)UniformType.IntSampler2d or (uint)UniformType.Sampler2dShadow /*or UniformType.Image2d*/or 36941 => typeof(ITextureBase), + (uint)UniformType.SamplerCube or (uint)UniformType.SamplerCubeShadow => typeof(IWritableCubeMap), + (uint)UniformType.Sampler2dArray or (uint)UniformType.Sampler2dArrayShadow => typeof(IWritableArrayTexture), _ => throw new ArgumentOutOfRangeException($"UniformType {uType} unknown."), }; paramList.Add(paramInfo); From 0f0ed17d7046304b8198faf0f2fd53418de71116 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Tue, 14 Dec 2021 17:52:24 +0100 Subject: [PATCH 3/9] Removed try catch from Render() --- src/Engine/Core/RenderContext.cs | 81 ++++++++++++++++---------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/Engine/Core/RenderContext.cs b/src/Engine/Core/RenderContext.cs index 8a2515c5f..62ee0acfd 100644 --- a/src/Engine/Core/RenderContext.cs +++ b/src/Engine/Core/RenderContext.cs @@ -1723,59 +1723,58 @@ public void Render(Mesh m, bool renderForward = true) var compiledEffect = _allCompiledEffects[_currentEffect]; - - CompiledEffect cFx; - if (renderForward) + CompiledEffect cFx; + if (renderForward) + { + if (compiledEffect.ForwardFx == null) { - if (compiledEffect.ForwardFx == null) - { - CreateShaderProgram(_currentEffect, renderForward); - compiledEffect = _allCompiledEffects[_currentEffect]; - } - - cFx = compiledEffect.ForwardFx; + CreateShaderProgram(_currentEffect, renderForward); + compiledEffect = _allCompiledEffects[_currentEffect]; } - else + + cFx = compiledEffect.ForwardFx; + } + else + { + if (compiledEffect.DeferredFx == null) { - if (compiledEffect.DeferredFx == null) - { - CreateShaderProgram(_currentEffect, renderForward); - compiledEffect = _allCompiledEffects[_currentEffect]; - } - cFx = compiledEffect.DeferredFx; + CreateShaderProgram(_currentEffect, renderForward); + compiledEffect = _allCompiledEffects[_currentEffect]; } + cFx = compiledEffect.DeferredFx; + } - SetShaderProgram(cFx.GpuHandle); - SetRenderStateSet(_currentEffect.RendererStates); + SetShaderProgram(cFx.GpuHandle); + SetRenderStateSet(_currentEffect.RendererStates); - foreach (var key in GlobalFXParams.Keys) - { - var globalFxParam = GlobalFXParams[key]; - - if (cFx.ActiveUniforms.TryGetValue(key, out var activeParam)) - { - if (globalFxParam.HasValueChanged || globalFxParam.Value != activeParam.Value) - _currentEffect.SetFxParam(key, globalFxParam.Value); - } - } + foreach (var key in GlobalFXParams.Keys) + { + var globalFxParam = GlobalFXParams[key]; - foreach (var fxParam in cFx.ActiveUniforms.Values) + if (cFx.ActiveUniforms.TryGetValue(key, out var activeParam)) { - SetShaderParamT(fxParam); - fxParam.HasValueChanged = false; + if (globalFxParam.HasValueChanged || globalFxParam.Value != activeParam.Value) + _currentEffect.SetFxParam(key, globalFxParam.Value); } + } + + foreach (var fxParam in cFx.ActiveUniforms.Values) + { + SetShaderParamT(fxParam); + fxParam.HasValueChanged = false; + } - // TODO: split up RenderContext.Render into a preparation and a draw call so that we can prepare a mesh once and draw it for each pass. - var meshImp = _meshManager.GetMeshImpFromMesh(m); - _rci.Render(meshImp); + // TODO: split up RenderContext.Render into a preparation and a draw call so that we can prepare a mesh once and draw it for each pass. + var meshImp = _meshManager.GetMeshImpFromMesh(m); + _rci.Render(meshImp); - // After rendering always cleanup pending meshes - _meshManager.Cleanup(); - _textureManager.Cleanup(); + // After rendering always cleanup pending meshes + _meshManager.Cleanup(); + _textureManager.Cleanup(); + + // After rendering all passes cleanup shader effect + _effectManager.Cleanup(); - // After rendering all passes cleanup shader effect - _effectManager.Cleanup(); - } private float2 CalculateClippingPlanesFromProjection() From 5360d1a7e4521330da1058ff21c26899b3a3afcd Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Wed, 15 Dec 2021 09:25:17 +0100 Subject: [PATCH 4/9] Fixed clear color --- Examples/Complete/Deferred/Core/Deferred.cs | 2 - .../Imp/Graphics/Desktop/RenderContextImp.cs | 88 ++++++++----------- 2 files changed, 39 insertions(+), 51 deletions(-) diff --git a/Examples/Complete/Deferred/Core/Deferred.cs b/Examples/Complete/Deferred/Core/Deferred.cs index 92a6fc680..e09e66891 100644 --- a/Examples/Complete/Deferred/Core/Deferred.cs +++ b/Examples/Complete/Deferred/Core/Deferred.cs @@ -150,8 +150,6 @@ public override void Init() // Wrap a SceneRenderer around the scene. _sceneRendererDeferred = new SceneRendererDeferred(_sponzaScene); _sceneRendererForward = new SceneRendererForward(_sponzaScene); - - // Wrap a SceneRenderer around the GUI. } private bool _renderDeferred = true; diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index cf078a71c..c6a59806c 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -6,6 +6,7 @@ using Fusee.Math.Core; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; +using OpenTK.Mathematics; using System; using System.Collections.Generic; using System.Drawing; @@ -66,7 +67,6 @@ public RenderContextImp(IRenderCanvasImp renderCanvas) // Due to the right-handed nature of OpenGL and the left-handed design of FUSEE // the meaning of what's Front and Back of a face simply flips. - // TODO - implement this in render states!!! GL.CullFace(CullFaceMode.Back); //Needed for rendering more than one viewport. @@ -98,15 +98,11 @@ public RenderContextImp(IRenderCanvasImp renderCanvas) int numExtensions = 0; GL.GetInteger(GetPName.NumExtensions, ref numExtensions); - // OpenTK 4.x - //var extensions = new string[numExtensions]; - //for (int i = 0; i < numExtensions; i++) - //{ - // extensions[i] = GL.GetString(StringName.Extensions, i); - //} - - var extensions = GL.GetString(StringName.Extensions); - + var extensions = new string[numExtensions]; + for (uint i = 0; i < numExtensions; i++) + { + extensions[i] = GL.GetStringi(StringName.Extensions, i); + } Diagnostics.Verbose(string.Join(';', extensions)); #endif } @@ -708,7 +704,7 @@ public IShaderParam GetShaderUniformParam(IShaderHandle shaderProgram, string pa public float GetParamValue(IShaderHandle program, IShaderParam param) { float f = 0; - GL.GetUniformf(((ShaderHandleImp)program).Handle, (int)((ShaderParam)param).handle, ref f); + GL.GetUniformf(((ShaderHandleImp)program).Handle, ((ShaderParam)param).handle, ref f); return f; } @@ -734,7 +730,7 @@ public IList GetShaderStorageBufferList(IShaderHandle shaderPro paramInfo.Name = name; uint h = GL.GetProgramResourceIndex(sProg.Handle, ProgramInterface.ShaderStorageBlock, name); - paramInfo.Handle = (h == -1) ? null : new ShaderParam { handle = (int)h }; + paramInfo.Handle = (h == default(uint)) ? null : new ShaderParam { handle = (int)h }; paramList.Add(paramInfo); } @@ -759,14 +755,15 @@ public IList GetActiveUniformsList(IShaderHandle shaderProgram) { var paramInfo = new ShaderParamInfo(); UniformType uType = UniformType.Bool; - + int length = 0; int size = 0; //TODO: (int)ProgramInterfacePName.MaxNameLength may not be the correct value here GL.GetActiveUniform(sProg.Handle, (uint)i, (int)ProgramInterfacePName.MaxNameLength, ref length, ref size, ref uType, out var name); - + paramInfo.Name = name; paramInfo.Handle = GetShaderUniformParam(sProg, paramInfo.Name); + paramInfo.Size = size; //TODO: remove cast to uint when UniformType.Image2d = 36941 is available paramInfo.Type = (uint)uType switch @@ -834,12 +831,15 @@ public void SetShaderParam(IShaderParam param, float2 val) /// /// The parameter. /// The value. - public unsafe void SetShaderParam(IShaderParam param, float2[] val) + public void SetShaderParam(IShaderParam param, float2[] val) { - foreach (var vec in val) + Vector2[] vecArray = new Vector2[val.Length]; + for (int i = 0; i < val.Length; i++) { - GL.Uniform2f((int)((ShaderParam)param).handle, vec.x, vec.y); + var vec = val[i]; + vecArray[i] = new Vector2(vec.x, vec.y); } + GL.Uniform2f(((ShaderParam)param).handle, val.Length, vecArray); } /// @@ -857,12 +857,15 @@ public void SetShaderParam(IShaderParam param, float3 val) /// /// The parameter. /// The value. - public unsafe void SetShaderParam(IShaderParam param, float3[] val) + public void SetShaderParam(IShaderParam param, float3[] val) { - foreach (var vec in val) + Vector3[] vecArray = new Vector3[val.Length]; + for (int i = 0; i < val.Length; i++) { - GL.Uniform3f((int)((ShaderParam)param).handle, vec.x, vec.y, vec.z); + var vec = val[i]; + vecArray[i] = new Vector3(vec.x, vec.y, vec.z); } + GL.Uniform3f(((ShaderParam)param).handle, val.Length, vecArray); } /// @@ -890,12 +893,15 @@ public void SetShaderParam(IShaderParam param, float4x4 val) /// /// The parameter. /// The value. - public unsafe void SetShaderParam(IShaderParam param, float4[] val) + public void SetShaderParam(IShaderParam param, float4[] val) { - foreach (var vec in val) + Vector4[] vecArray = new Vector4[val.Length]; + for (int i = 0; i < val.Length; i++) { - GL.Uniform4f(((ShaderParam)param).handle, vec.x, vec.y, vec.z, vec.w); + var vec = val[i]; + vecArray[i] = new Vector4(vec.x, vec.y, vec.z, vec.w); } + GL.Uniform4f(((ShaderParam)param).handle, val.Length, vecArray); } /// @@ -903,27 +909,14 @@ public unsafe void SetShaderParam(IShaderParam param, float4[] val) /// /// The parameter. /// The value. - public unsafe void SetShaderParam(IShaderParam param, float4x4[] val) + public void SetShaderParam(IShaderParam param, float4x4[] val) { var tmpArray = new float[val.Length * 4 * 4]; for (var i = 0; i < val.Length; i++) { - val[i].ToArray().CopyTo(tmpArray, i * 16); + val[i].ToArray().CopyTo(tmpArray, i * 16); } GL.UniformMatrix4f(((ShaderParam)param).handle, val.Length, true, tmpArray); - - //var tmpArray = new float4[val.Length * 4]; - - //for (var i = 0; i < val.Length; i++) - //{ - // tmpArray[i * 4] = val[i].Column1; - // tmpArray[i * 4 + 1] = val[i].Column2; - // tmpArray[i * 4 + 2] = val[i].Column3; - // tmpArray[i * 4 + 3] = val[i].Column4; - //} - - //fixed (float4* pMtx = &tmpArray[0]) - // GL.UniformMatrix4f((int)((ShaderParam)param).handle, val.Length, false, (float*)pMtx); } /// @@ -1117,7 +1110,7 @@ public void SetShaderParamTexture(IShaderParam param, ITextureHandle texId, Text /// Shader Parameter used for texture binding /// An array of ITextureHandles probably returned from CreateTexture method /// The texture type, describing to which texture target the texture gets bound to. - public unsafe void SetShaderParamTextureArray(IShaderParam param, ITextureHandle[] texIds, TextureType texTarget) + public void SetShaderParamTextureArray(IShaderParam param, ITextureHandle[] texIds, TextureType texTarget) { SetActiveAndBindTextureArray(param, texIds, texTarget, out int[] texUnitArray); GL.Uniform1i(((ShaderParam)param).handle, texUnitArray.Length, new Span(texUnitArray)); @@ -1145,16 +1138,13 @@ public float4 ClearColor { get { - float r = 0; - float g = 0; - float b = 0; - float a = 0; - - GL.GetFloat(GetPName.ColorClearValue, 0, ref r); - GL.GetFloat(GetPName.ColorClearValue, 1, ref g); - GL.GetFloat(GetPName.ColorClearValue, 2, ref b); - GL.GetFloat(GetPName.ColorClearValue, 3, ref a); - return new float4(r, g, b, a); + float[] col = new float[4]; + unsafe + { + fixed (float* pFlt = &col[0]) + GL.GetFloatv(GetPName.ColorClearValue, pFlt); + } + return new float4(col[0], col[1], col[2], col[3]); } set => GL.ClearColor(value.x, value.y, value.z, value.w); } From 049f344b0bb735e5db0fb3b3cd12b144da778fc6 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Wed, 15 Dec 2021 11:46:18 +0100 Subject: [PATCH 5/9] SetShaderParam: using Spans where possible --- .../Imp/Graphics/Desktop/RenderContextImp.cs | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index c6a59806c..24bd41f9a 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -823,7 +823,7 @@ public void SetShaderParam(IShaderParam param, double val) /// The value. public void SetShaderParam(IShaderParam param, float2 val) { - GL.Uniform2f((int)((ShaderParam)param).handle, val.x, val.y); + GL.Uniform2f(((ShaderParam)param).handle, val.x, val.y); } /// @@ -831,15 +831,12 @@ public void SetShaderParam(IShaderParam param, float2 val) /// /// The parameter. /// The value. - public void SetShaderParam(IShaderParam param, float2[] val) + public unsafe void SetShaderParam(IShaderParam param, float2[] val) { - Vector2[] vecArray = new Vector2[val.Length]; - for (int i = 0; i < val.Length; i++) - { - var vec = val[i]; - vecArray[i] = new Vector2(vec.x, vec.y); - } - GL.Uniform2f(((ShaderParam)param).handle, val.Length, vecArray); + using var float2Mem = val.AsMemory().Pin(); + var vec2Span = new Span(float2Mem.Pointer, val.Length); + + GL.Uniform2f(((ShaderParam)param).handle, val.Length, vec2Span); } /// @@ -857,15 +854,11 @@ public void SetShaderParam(IShaderParam param, float3 val) /// /// The parameter. /// The value. - public void SetShaderParam(IShaderParam param, float3[] val) + public unsafe void SetShaderParam(IShaderParam param, float3[] val) { - Vector3[] vecArray = new Vector3[val.Length]; - for (int i = 0; i < val.Length; i++) - { - var vec = val[i]; - vecArray[i] = new Vector3(vec.x, vec.y, vec.z); - } - GL.Uniform3f(((ShaderParam)param).handle, val.Length, vecArray); + using var float3Mem = val.AsMemory().Pin(); + var vec3Span = new Span(float3Mem.Pointer, val.Length); + GL.Uniform3f(((ShaderParam)param).handle, val.Length, vec3Span); } /// @@ -893,15 +886,11 @@ public void SetShaderParam(IShaderParam param, float4x4 val) /// /// The parameter. /// The value. - public void SetShaderParam(IShaderParam param, float4[] val) + public unsafe void SetShaderParam(IShaderParam param, float4[] val) { - Vector4[] vecArray = new Vector4[val.Length]; - for (int i = 0; i < val.Length; i++) - { - var vec = val[i]; - vecArray[i] = new Vector4(vec.x, vec.y, vec.z, vec.w); - } - GL.Uniform4f(((ShaderParam)param).handle, val.Length, vecArray); + using var float4Mem = val.AsMemory().Pin(); + var vec4Span = new Span(float4Mem.Pointer, val.Length); + GL.Uniform4f(((ShaderParam)param).handle, val.Length, vec4Span); } /// From 7924efc4185f1269366e5f0c5cb99709cc171b72 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Fri, 25 Feb 2022 08:19:36 +0100 Subject: [PATCH 6/9] OpenTk version set back to 5.0.0-pre.6 --- .../Complete/ComputeFractal/Core/ComputeFractal.cs | 2 +- .../Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj | 3 +-- src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs | 11 ++++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs b/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs index eb52c9fd1..0e97fd1c2 100644 --- a/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs +++ b/Examples/Complete/ComputeFractal/Core/ComputeFractal.cs @@ -39,7 +39,7 @@ public override void Init() { _gui = FuseeGuiHelper.CreateDefaultGui(this, CanvasRenderMode.Screen, "Fractal Magnification Factor: " + _depthFactor); _guiRenderer = new SceneRendererForward(_gui); - _depthFactorText = _gui.Children[0].Children[0].Children[1].Children[0].GetComponent(); + _depthFactorText = _gui.Children[1].Children[1].Children[0].GetComponent(); // Set the clear color for the backbuffer to white (100% intensity in all color channels R, G, B, A). RC.ClearColor = new float4(1, 1, 1, 1); diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index 5f0f2752a..d2564f9c8 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -28,9 +28,8 @@ analyzers - - + diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 458a24663..7ca3f1b67 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -2,6 +2,7 @@ using Fusee.Engine.Common; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; +using OpenTK.Windowing.Common.Input; using OpenTK.Windowing.Desktop; using OpenTK.Windowing.GraphicsLibraryFramework; using SixLabors.ImageSharp; @@ -212,7 +213,7 @@ public RenderCanvasImp() : this(null, false) public RenderCanvasImp(ImageData icon = null, bool isMultithreaded = false) { //TODO: Select correct monitor - MonitorInfo mon = Monitors.GetMonitors()[0]; + Monitors.TryGetMonitorInfo(0, out var mon); int width = 1280; int height = 720; @@ -310,7 +311,7 @@ private void ResizeWindow() else { //TODO: Select correct monitor - MonitorInfo mon = Monitors.GetMonitors()[0]; + Monitors.TryGetMonitorInfo(0, out var mon); var oneScreenWidth = mon.HorizontalResolution; var oneScreenHeight = mon.VerticalResolution; @@ -352,7 +353,7 @@ public void VideoWall(int monitorsHor = 1, int monitorsVert = 1, bool activate = /// Show the window border or not. public void SetWindowSize(int width, int height, int posx = -1, int posy = -1, bool borderHidden = false) { - MonitorInfo mon = Monitors.GetMonitors()[0]; + Monitors.TryGetMonitorInfo(0, out var mon); BaseWidth = width; BaseHeight = height; @@ -446,7 +447,7 @@ public SixLabors.ImageSharp.Image ShootCurrentFrame(int width, int height) var bmp = new Image(Width, Height); bmp.TryGetSinglePixelSpan(out var mem); - GL.PixelStore(PixelStoreParameter.PackRowLength, 1); + GL.PixelStorei(PixelStoreParameter.PackRowLength, 1); GL.ReadPixels(0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, ref mem[0]); bmp.Mutate(x => x.AutoOrient()); @@ -641,7 +642,7 @@ protected override void OnLoad() throw new InvalidOperationException("You need at least OpenGL 2.0 to run this example. GLSL not supported."); } - GL.ClearColor(new Color4(Color.MidnightBlue.R, Color.MidnightBlue.G, Color.MidnightBlue.B, Color.MidnightBlue.A)); + GL.ClearColor(new Color4(0.1f, 0.1f, 0.47f, 1)); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); From f1f7db2e22a80313f0c9842ddc4012a4b182a47e Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Mon, 14 Mar 2022 09:03:27 +0100 Subject: [PATCH 7/9] Fixed merge errors --- src/Engine/Core/RenderContext.cs | 107 +++++++----------- .../Fusee.Engine.Imp.Graphics.Desktop.csproj | 1 - src/Engine/Imp/Graphics/Desktop/MeshImp.cs | 2 +- 3 files changed, 43 insertions(+), 67 deletions(-) diff --git a/src/Engine/Core/RenderContext.cs b/src/Engine/Core/RenderContext.cs index 53ccbd488..638cb059e 100644 --- a/src/Engine/Core/RenderContext.cs +++ b/src/Engine/Core/RenderContext.cs @@ -1718,25 +1718,19 @@ public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGrou if (_currentEffect == null) throw new NullReferenceException("No Compute Shader bound."); if (_currentEffect.GetType() != typeof(ComputeShader)) throw new NullReferenceException("Bound Effect isn't a Compute Shader."); - try - { - var cFx = GetCompiledFxForRenderMethod(true); - SetCompiledFx(cFx.GpuHandle); - SetRenderStateSet(_currentEffect.RendererStates); - SetGlobalParamsInCurrentFx(cFx); - UpdateAllActiveFxParams(cFx); - - _rci.DispatchCompute(kernelIndex, threadGroupsX, threadGroupsY, threadGroupsZ); - - // After rendering always cleanup pending meshes, textures and shader effects - _meshManager.Cleanup(); - _textureManager.Cleanup(); - _effectManager.Cleanup(); - } - catch (Exception ex) - { - throw new Exception("Error while rendering pass ", ex); - } + + var cFx = GetCompiledFxForRenderMethod(true); + SetCompiledFx(cFx.GpuHandle); + SetRenderStateSet(_currentEffect.RendererStates); + SetGlobalParamsInCurrentFx(cFx); + UpdateAllActiveFxParams(cFx); + + _rci.DispatchCompute(kernelIndex, threadGroupsX, threadGroupsY, threadGroupsZ); + + // After rendering always cleanup pending meshes, textures and shader effects + _meshManager.Cleanup(); + _textureManager.Cleanup(); + _effectManager.Cleanup(); } /// @@ -1750,62 +1744,45 @@ public void DispatchCompute(int kernelIndex, uint threadGroupsX, uint threadGrou /// public void Render(Mesh mesh, bool doRenderForward = true) { - if (_currentEffect == null) return; - - var compiledEffect = _allCompiledEffects[_currentEffect]; - - CompiledEffect cFx; - if (renderForward) - { - if (compiledEffect.ForwardFx == null) - { - CreateShaderProgram(_currentEffect, renderForward); - compiledEffect = _allCompiledEffects[_currentEffect]; - } - - cFx = compiledEffect.ForwardFx; - } - else - { - if (compiledEffect.DeferredFx == null) - { - CreateShaderProgram(_currentEffect, renderForward); - compiledEffect = _allCompiledEffects[_currentEffect]; - } - cFx = compiledEffect.DeferredFx; - } - - SetShaderProgram(cFx.GpuHandle); + var cFx = GetCompiledFxForRenderMethod(doRenderForward); + SetCompiledFx(cFx.GpuHandle); SetRenderStateSet(_currentEffect.RendererStates); + SetGlobalParamsInCurrentFx(cFx); + UpdateAllActiveFxParams(cFx); - foreach (var key in GlobalFXParams.Keys) - { - var globalFxParam = GlobalFXParams[key]; + var meshImp = _meshManager.GetMeshImpFromMesh(mesh); + _rci.Render(meshImp); - if (cFx.ActiveUniforms.TryGetValue(key, out var activeParam)) - { - if (globalFxParam.HasValueChanged || globalFxParam.Value != activeParam.Value) - _currentEffect.SetFxParam(key, globalFxParam.Value); - } - } + // After rendering always cleanup pending meshes, textures and shader effects + _meshManager.Cleanup(); + _textureManager.Cleanup(); + _effectManager.Cleanup(); + } - foreach (var fxParam in cFx.ActiveUniforms.Values) - { - SetShaderParamT(fxParam); - fxParam.HasValueChanged = false; - } + /// + /// Renders the specified mesh. + /// + /// The mesh that should be rendered. + /// Is a forward or deferred renderer used? Will fetch the proper shader for the render method. + /// + /// Passes geometry to be pushed through the rendering pipeline. for a description how geometry is made up. + /// The geometry is transformed and rendered by the currently active shader program. + /// + public void Render(GpuMesh mesh, bool doRenderForward = true) + { + var cFx = GetCompiledFxForRenderMethod(doRenderForward); + SetCompiledFx(cFx.GpuHandle); + SetRenderStateSet(_currentEffect.RendererStates); + SetGlobalParamsInCurrentFx(cFx); + UpdateAllActiveFxParams(cFx); - // TODO: split up RenderContext.Render into a preparation and a draw call so that we can prepare a mesh once and draw it for each pass. - var meshImp = _meshManager.GetMeshImpFromMesh(m); + var meshImp = _meshManager.GetMeshImpFromMesh(mesh); _rci.Render(meshImp); - // After rendering always cleanup pending meshes + // After rendering always cleanup pending meshes, textures and shader effects _meshManager.Cleanup(); _textureManager.Cleanup(); - - // After rendering all passes cleanup shader effect _effectManager.Cleanup(); - } private float2 CalculateClippingPlanesFromProjection() diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index bf5d078aa..6bd86df2c 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -30,7 +30,6 @@ - diff --git a/src/Engine/Imp/Graphics/Desktop/MeshImp.cs b/src/Engine/Imp/Graphics/Desktop/MeshImp.cs index 40dd1c95d..437c5d9aa 100644 --- a/src/Engine/Imp/Graphics/Desktop/MeshImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/MeshImp.cs @@ -213,7 +213,7 @@ public void InvalidateTriangles() /// /// Type of data of this mesh (e.g. Triangles, Points, Lines, etc.) /// - public OpenGLPrimitiveType MeshType { get; set; } + public PrimitiveType MeshType { get; set; } #endregion Public Fields & Members pairs } From 916637efc02fd50dab912662f63c4fcaa73944d1 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Mon, 9 May 2022 10:58:42 +0200 Subject: [PATCH 8/9] Fixed merge errors --- .../Fusee.Engine.Imp.Graphics.Desktop.csproj | 1 - .../Imp/Graphics/Desktop/RenderCanvasImp.cs | 12 ++++++++--- .../Imp/Graphics/Desktop/RenderContextImp.cs | 20 +++++++++---------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index e9dd903d7..6bd86df2c 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -30,7 +30,6 @@ - diff --git a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs index 682a33092..7dcc6c40e 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderCanvasImp.cs @@ -307,7 +307,7 @@ private void ResizeWindow() else { //TODO: Select correct monitor - Monitors.TryGetMonitorInfo(0, out var mon); + Monitors.TryGetMonitorInfo(0, out var mon); var oneScreenWidth = mon.HorizontalResolution; var oneScreenHeight = mon.VerticalResolution; @@ -442,8 +442,14 @@ public SixLabors.ImageSharp.Image ShootCurrentFrame(int width, int height) DoResize(width, height); var mem = new byte[width * height * 4]; - GL.PixelStore(PixelStoreParameter.PackRowLength, 1); - GL.ReadPixels(0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, mem); + + GL.PixelStorei(PixelStoreParameter.PackRowLength, 1); + + unsafe + { + using var dataMemHandle = mem.AsMemory().Pin(); + GL.ReadPixels(0, 0, Width, Height, PixelFormat.Bgra, PixelType.UnsignedByte, dataMemHandle.Pointer); + } var img = SixLabors.ImageSharp.Image.LoadPixelData(mem, Width, Height); diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 5b28700fe..48deb6a6c 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -216,13 +216,13 @@ private TexturePixelInfo GetTexturePixelInfo(ImagePixelFormat pixelFormat) { case ColorFormat.RGBA: internalFormat = InternalFormat.Rgba; - format = PixelFormat.Bgra; + format = PixelFormat.Rgba; pxType = PixelType.UnsignedByte; break; case ColorFormat.RGB: internalFormat = InternalFormat.Rgb; - format = PixelFormat.Bgr; + format = PixelFormat.Rgb; pxType = PixelType.UnsignedByte; rowAlignment = 1; break; @@ -379,11 +379,11 @@ public ITextureHandle CreateTexture(ITexture img) var glWrapMode = GetWrapMode(img.WrapMode); - var pxInfo = GetTexturePixelInfo(img); + var pxInfo = GetTexturePixelInfo(img.ImageData.PixelFormat); unsafe { - using var pxDataMem = img.PixelData.AsMemory().Pin(); - GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, pxDataMem.Pointer); + using var pxDataMem = img.ImageData.PixelData.AsMemory().Pin(); + GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, img.ImageData.Width, img.ImageData.Height, 0, pxInfo.Format, pxInfo.PxType, pxDataMem.Pointer); } if (img.DoGenerateMipMaps) @@ -416,13 +416,13 @@ public ITextureHandle CreateTexture(IWritableTexture tex) var glWrapMode = GetWrapMode(tex.WrapMode); var pxInfo = GetTexturePixelInfo(tex.PixelFormat); - GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, img.Width, img.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); + GL.TexImage2D(TextureTarget.Texture2d, 0, (int)pxInfo.InternalFormat, tex.Width, tex.Height, 0, pxInfo.Format, pxInfo.PxType, IntPtr.Zero); - if (img.DoGenerateMipMaps) + if (tex.DoGenerateMipMaps) GL.GenerateMipmap(TextureTarget.Texture2d); - GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(img.CompareMode)); - GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(img.CompareFunc)); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareMode, (int)GetTexComapreMode(tex.CompareMode)); + GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureCompareFunc, (int)GetDepthCompareFunc(tex.CompareFunc)); GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMinFilter, (int)minFilter); GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureMagFilter, (int)magFilter); GL.TexParameteri(TextureTarget.Texture2d, TextureParameterName.TextureWrapS, (int)glWrapMode); @@ -2099,7 +2099,7 @@ public void SetRenderState(RenderState renderState, uint value) } break; case RenderState.BlendFactor: - var col = Color.FromArgb((int)value); + var col = System.Drawing.Color.FromArgb((int)value); GL.BlendColor(col.R, col.G, col.B, col.A); break; default: From 378214d48225f5583483a569cce983dde66660c3 Mon Sep 17 00:00:00 2001 From: Sarah Busert Date: Mon, 30 May 2022 15:31:30 +0200 Subject: [PATCH 9/9] OpenTk to v5.0.0-pre.7 --- .../Fusee.Engine.Imp.Graphics.Desktop.csproj | 2 +- .../Imp/Graphics/Desktop/RenderContextImp.cs | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj index 6bd86df2c..7c94b98a0 100644 --- a/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj +++ b/src/Engine/Imp/Graphics/Desktop/Fusee.Engine.Imp.Graphics.Desktop.csproj @@ -29,7 +29,7 @@ - + diff --git a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs index 48deb6a6c..374f6b358 100644 --- a/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs +++ b/src/Engine/Imp/Graphics/Desktop/RenderContextImp.cs @@ -887,9 +887,12 @@ public void SetShaderParam(IShaderParam param, float4 val) /// /// The parameter. /// The value. - public void SetShaderParam(IShaderParam param, float4x4 val) + public unsafe void SetShaderParam(IShaderParam param, float4x4 val) { - GL.UniformMatrix4f(((ShaderParam)param).handle, 1, true, val.ToArray()); + using var float4x4Mem = val.ToArray().AsMemory().Pin(); + var mat4Span = new Span(float4x4Mem.Pointer, 16); + + GL.UniformMatrix4f(((ShaderParam)param).handle, 1, true, mat4Span); } /// @@ -909,14 +912,12 @@ public unsafe void SetShaderParam(IShaderParam param, float4[] val) /// /// The parameter. /// The value. - public void SetShaderParam(IShaderParam param, float4x4[] val) + public unsafe void SetShaderParam(IShaderParam param, float4x4[] val) { - var tmpArray = new float[val.Length * 4 * 4]; - for (var i = 0; i < val.Length; i++) - { - val[i].ToArray().CopyTo(tmpArray, i * 16); - } - GL.UniformMatrix4f(((ShaderParam)param).handle, val.Length, true, tmpArray); + using var mem = val.AsMemory().Pin(); + var matArraySpan = new Span(mem.Pointer, val.Length); + + GL.UniformMatrix4f(((ShaderParam)param).handle, val.Length, true, matArraySpan); } ///