public static unsafe void Draw() { GLRenderTexture.Reset(); OnOpenGL?.Invoke(); SetContext(); //ImGui.Render(); IGRender(); }
private unsafe static void IGUpdate(float dt) { SetContext(); GLRenderTexture.Reset(); var ioptr = ImGuiNative.igGetIO(); ioptr->DeltaTime = dt; ioptr->DisplaySize = new System.Numerics.Vector2( Viewport.Width / ImGuiScale.X, Viewport.Height / ImGuiScale.Y ); ioptr->DisplayFramebufferScale = ImGuiScale; }
private static void IGRender2(ImDrawDataPtr dd) { SetContext(); GLRenderTexture.Reset(); GL.Viewport(0, 0, Engine.Width, Engine.Height); if (dd.CmdListsCount == 0) { return; } for (int i = 0; i < dd.CmdListsCount; i++) { ImDrawListPtr cmd_list = dd.CmdListsRange[i]; int vertexSize = cmd_list.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>(); if (vertexSize > VtxBufSize) { int newSize = (int)Math.Max(VtxBufSize * 1.5f, vertexSize); GL.NamedBufferData(VertexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw); VtxBufSize = newSize; } int indexSize = cmd_list.IdxBuffer.Size * sizeof(ushort); if (indexSize > IdxBufSize) { int newSize = (int)Math.Max(IdxBufSize * 1.5f, indexSize); GL.NamedBufferData(IndexBuffer, newSize, IntPtr.Zero, BufferUsageHint.DynamicDraw); IdxBufSize = newSize; } } var io = ImGui.GetIO(); var MVP = Matrix4.CreateOrthographicOffCenter(0.0f, Viewport.Width, Viewport.Height, 0.0f, -1.0f, 1.0f); ImGuiProgram.Use(); ImGuiProgram.UniformMatrix4("Projection", ref MVP); GL.Uniform1(ImGuiProgram.UniformLocation("Texture"), 0); IG_VAO.Bind(); dd.ScaleClipRects(io.DisplayFramebufferScale); GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.ScissorTest); GL.BlendEquation(BlendEquationMode.FuncAdd); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); GL.Disable(EnableCap.CullFace); GL.Disable(EnableCap.DepthTest); for (int n = 0; n < dd.CmdListsCount; n++) { ImDrawListPtr cmdList = dd.CmdListsRange[n]; GL.NamedBufferSubData(VertexBuffer, IntPtr.Zero, cmdList.VtxBuffer.Size * Unsafe.SizeOf <ImDrawVert>(), cmdList.VtxBuffer.Data); GL.NamedBufferSubData(IndexBuffer, IntPtr.Zero, cmdList.IdxBuffer.Size * sizeof(ushort), cmdList.IdxBuffer.Data); int vOffset = 0; int iOffset = 0; for (int i = 0; i < cmdList.CmdBuffer.Size; i++) { ImDrawCmdPtr pcmd = cmdList.CmdBuffer[i]; if (pcmd.UserCallback != IntPtr.Zero) { throw new NotImplementedException(); } else { GLTexture.Active(TextureUnit.Texture0); GL.BindTexture(TextureTarget.Texture2D, (int)pcmd.TextureId); var clip = pcmd.ClipRect; GL.Scissor((int)clip.X, Viewport.Height - (int)clip.W, (int)(clip.Z - clip.X), (int)(clip.W - clip.Y)); if ((io.BackendFlags & ImGuiBackendFlags.RendererHasVtxOffset) != 0) { GL.DrawElementsBaseVertex(PrimitiveType.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (IntPtr)(iOffset * sizeof(ushort)), vOffset); } else { GL.DrawElements(BeginMode.Triangles, (int)pcmd.ElemCount, DrawElementsType.UnsignedShort, (int)pcmd.IdxOffset * sizeof(ushort)); } } iOffset += (int)pcmd.ElemCount; } vOffset += cmdList.VtxBuffer.Size; } GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.ScissorTest); }