Example #1
0
        private static void Main(string[] args)
        {
            var platform = "x64";

            if (IntPtr.Size == 4)
            {
                platform = "x86";
            }
            NativeMethods.LoadLibrary($"{platform}/SDL2.dll");
            Bgfx.InitializeLibrary();
            ushort resolutionWidth  = 800;
            ushort resolutionHeight = 600;
            var    windowhandle     = SDL.SDL_CreateWindow("hello", 10, 10, resolutionWidth, resolutionHeight,
                                                           SDL.SDL_WindowFlags.SDL_WINDOW_ALLOW_HIGHDPI);
            var wm = new SDL.SDL_SysWMinfo();

            SDL.SDL_GetWindowWMInfo(windowhandle, ref wm);
            Bgfx.SetPlatformData(wm.info.win.window);
            var init = Bgfx.Initialize(resolutionWidth, resolutionHeight, Bgfx.RendererType.DIRECT_3D11);

            ImGui.SetCurrentContext(ImGui.CreateContext());
            var IO = ImGui.GetIO();

            IO.ImeWindowHandle = wm.info.win.window;
            //IO.BackendFlags |= ImGuiBackendFlags.HasMouseCursors; // We can honor GetMouseCursor() values (optional)
            //IO.BackendFlags |= ImGuiBackendFlags.HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
            //IO.BackendPlatformName = new NullTerminatedString("imgui_impl_win32".ToCharArray());
            IO.KeyMap[(int)ImGuiKey.Tab]         = (int)SDL.SDL_Scancode.SDL_SCANCODE_TAB;
            IO.KeyMap[(int)ImGuiKey.LeftArrow]   = (int)SDL.SDL_Scancode.SDL_SCANCODE_LEFT;
            IO.KeyMap[(int)ImGuiKey.RightArrow]  = (int)SDL.SDL_Scancode.SDL_SCANCODE_RIGHT;
            IO.KeyMap[(int)ImGuiKey.UpArrow]     = (int)SDL.SDL_Scancode.SDL_SCANCODE_UP;
            IO.KeyMap[(int)ImGuiKey.DownArrow]   = (int)SDL.SDL_Scancode.SDL_SCANCODE_DOWN;
            IO.KeyMap[(int)ImGuiKey.PageUp]      = (int)SDL.SDL_Scancode.SDL_SCANCODE_PAGEUP;
            IO.KeyMap[(int)ImGuiKey.PageDown]    = (int)SDL.SDL_Scancode.SDL_SCANCODE_PAGEDOWN;
            IO.KeyMap[(int)ImGuiKey.Home]        = (int)SDL.SDL_Scancode.SDL_SCANCODE_HOME;
            IO.KeyMap[(int)ImGuiKey.End]         = (int)SDL.SDL_Scancode.SDL_SCANCODE_END;
            IO.KeyMap[(int)ImGuiKey.Insert]      = (int)SDL.SDL_Scancode.SDL_SCANCODE_INSERT;
            IO.KeyMap[(int)ImGuiKey.Delete]      = (int)SDL.SDL_Scancode.SDL_SCANCODE_DELETE;
            IO.KeyMap[(int)ImGuiKey.Backspace]   = (int)SDL.SDL_Scancode.SDL_SCANCODE_BACKSPACE;
            IO.KeyMap[(int)ImGuiKey.Space]       = (int)SDL.SDL_Scancode.SDL_SCANCODE_SPACE;
            IO.KeyMap[(int)ImGuiKey.Enter]       = (int)SDL.SDL_Scancode.SDL_SCANCODE_KP_ENTER;
            IO.KeyMap[(int)ImGuiKey.Escape]      = (int)SDL.SDL_Scancode.SDL_SCANCODE_ESCAPE;
            IO.KeyMap[(int)ImGuiKey.KeyPadEnter] = (int)SDL.SDL_Scancode.SDL_SCANCODE_RETURN;
            IO.KeyMap[(int)ImGuiKey.A]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_A;
            IO.KeyMap[(int)ImGuiKey.C]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_C;
            IO.KeyMap[(int)ImGuiKey.V]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_V;
            IO.KeyMap[(int)ImGuiKey.X]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_X;
            IO.KeyMap[(int)ImGuiKey.Y]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_Y;
            IO.KeyMap[(int)ImGuiKey.Z]           = (int)SDL.SDL_Scancode.SDL_SCANCODE_Z;
            IO.Fonts.AddFontDefault();
            IO.Fonts.GetTexDataAsRGBA32(out IntPtr pixels, out var fwidth, out var fheight);
            IO.Fonts.SetTexID(new IntPtr(Bgfx.CreateTexture2D((ushort)fwidth, (ushort)fheight, false, 1,
                                                              (Bgfx.TextureFormat)Bgfx.TextureFormat.RGBA8,
                                                              (Bgfx.SamplerFlags.U_CLAMP | Bgfx.SamplerFlags.V_CLAMP | Bgfx.SamplerFlags.MIN_POINT |
                                                               Bgfx.SamplerFlags.MAG_POINT | Bgfx.SamplerFlags.MIP_POINT),
                                                              Bgfx.MakeRef(pixels, (uint)(4 * fwidth * fheight))).Idx));
            Bgfx.SetViewClear(0, (ushort)(Bgfx.ClearFlags.COLOR | Bgfx.ClearFlags.DEPTH), 0x6495edff, 0, 0);
            Bgfx.SetViewMode(0, Bgfx.ViewMode.SEQUENTIAL);
            Bgfx.SetViewMode(255, Bgfx.ViewMode.SEQUENTIAL);
            Bgfx.SetDebug(Bgfx.DebugFlags.NONE);
            Bgfx.Reset(resolutionWidth, resolutionHeight, Bgfx.ResetFlags.VSYNC | Bgfx.ResetFlags.MSAA_X4, init.format);
            var running  = true;
            var bgfxcaps = Bgfx.GetCaps();

            mtxOrtho(out var ortho, 0, resolutionWidth, resolutionHeight, 0, 0, 1000.0f, 0, bgfxcaps.Homogenousdepth);
            var ImguiVertexLayout = new Bgfx.VertexLayout();

            ImguiVertexLayout.Begin(Bgfx.RendererType.NOOP);
            ImguiVertexLayout.Add(Bgfx.Attrib.POSITION, Bgfx.AttribType.FLOAT, 2, false, false);
            ImguiVertexLayout.Add(Bgfx.Attrib.TEX_COORD0, Bgfx.AttribType.FLOAT, 2, false, false);
            ImguiVertexLayout.Add(Bgfx.Attrib.COLOR0, Bgfx.AttribType.UINT8, 4, true, false);
            ImguiVertexLayout.End();
            var WhitePixelTexture = Bgfx.CreateTexture2D(1, 1, false, 1, Bgfx.TextureFormat.RGBA8, Bgfx.SamplerFlags.V_CLAMP | Bgfx.SamplerFlags.U_CLAMP | Bgfx.SamplerFlags.MIN_POINT | Bgfx.SamplerFlags.MAG_POINT | Bgfx.SamplerFlags.MIP_POINT, new uint[] { 0x0000ffff });
            var TextureUniform    = Bgfx.CreateUniform("s_texture", Bgfx.UniformType.SAMPLER, 1);

            var ImGuiShader = LoadEffect("vs_imgui.bin", "fs_imgui.bin");

            while (running)
            {
                SDL.SDL_PollEvent(out var Event);
                if (Event.window.type == SDL.SDL_EventType.SDL_QUIT)
                {
                    running = false;
                }
                var mouseState = SDL.SDL_GetMouseState(out var mouseX, out var mouseY);
                IO.MouseDown[0] = (mouseState & SDL.SDL_BUTTON(SDL.SDL_BUTTON_LEFT)) != 0;
                IO.MouseDown[1] = (mouseState & SDL.SDL_BUTTON(SDL.SDL_BUTTON_RIGHT)) != 0;
                IO.MouseDown[2] = (mouseState & SDL.SDL_BUTTON(SDL.SDL_BUTTON_MIDDLE)) != 0;
                SDL.SDL_GetWindowPosition(windowhandle, out var wx, out var wy);
                SDL.SDL_GetGlobalMouseState(out mouseX, out mouseY);
                mouseX         -= wx;
                mouseY         -= wy;
                IO.MousePosPrev = IO.MousePos;
                IO.MousePos     = new Vector2(mouseX, mouseY);
                ImGui.NewFrame();
                //ImGui.SetNextWindowSize(new Vector2(200);
                if (ImGui.Begin("test"))
                {
                    if (ImGui.Button("click OS popup"))
                    {
                        SDL.SDL_ShowSimpleMessageBox(SDL.SDL_MessageBoxFlags.SDL_MESSAGEBOX_INFORMATION, "Cliked Button", "Click Message", windowhandle);
                    }

                    if (ImGui.Button("modal popup"))
                    {
                        ImGui.OpenPopup("modal popup");
                    }
                    ImGui.Text("Hello");
                    if (ImGui.BeginPopupModal("modal popup"))
                    {
                        if (ImGui.Button("clicked"))
                        {
                            ImGui.CloseCurrentPopup();
                        }
                        ImGui.EndPopup();
                    }
                }

                ImGui.End();
                ImGui.EndFrame();
                ImGui.Render();
                Bgfx.SetViewRect(0, 0, 0, resolutionWidth, resolutionHeight);
                Bgfx.SetViewRect(255, 0, 0, resolutionWidth, resolutionHeight);
                IO.DisplaySize             = new Vector2(resolutionWidth, resolutionHeight);
                IO.DisplayFramebufferScale = new Vector2(1);
                Bgfx.Touch(0);
                {
                    var    drawdata = ImGui.GetDrawData();
                    ushort viewID   = 0;
                    Bgfx.SetViewTransform(viewID, null, ortho);

                    {
                        // Render command lists
                        for (int ii = 0, num = drawdata.CmdListsCount; ii < num; ++ii)
                        {
                            var drawList    = drawdata.CmdListsRange[ii];
                            var numVertices = drawList.VtxBuffer.Size;
                            var numIndices  = drawList.IdxBuffer.Size;
                            var tib         = Bgfx.AllocateTransientIndexBuffer((uint)numIndices);
                            var tvb         = Bgfx.AllocateTransientVertexBuffer((uint)numVertices, ImguiVertexLayout);
                            tvb.CopyIntoBuffer(drawList.VtxBuffer.Data,
                                               (uint)numVertices * (uint)Unsafe.SizeOf <ImDrawVert>());
                            tib.CopyIntoBuffer(drawList.IdxBuffer.Data,
                                               (uint)numIndices * (uint)Unsafe.SizeOf <ushort>());
                            uint offset = 0;
                            for (int i = 0; i < drawList.CmdBuffer.Size; i++)
                            {
                                var cmd = drawList.CmdBuffer[i];
                                if (cmd.UserCallback != IntPtr.Zero)
                                {
                                    // cmd->UserCallback(drawList, cmd);
                                }
                                else if (cmd.ElemCount > 0)
                                {
                                    var state = Bgfx.StateFlags.WRITE_RGB
                                                | Bgfx.StateFlags.WRITE_A
                                                | Bgfx.StateFlags.MSAA
                                    ;

                                    var texHandle = new Bgfx.TextureHandle();

                                    if (cmd.TextureId.ToInt32() != 0)
                                    {
                                        texHandle.Idx = (ushort)cmd.TextureId.ToInt32();
                                    }
                                    else
                                    {
                                        texHandle.Idx = WhitePixelTexture.Idx;
                                    }

                                    state |= Bgfx.STATE_BLEND_FUNC(Bgfx.StateFlags.BLEND_SRC_ALPHA, Bgfx.StateFlags.BLEND_INV_SRC_ALPHA);
                                    ushort xx = (ushort)((cmd.ClipRect.X > 0.0f ? cmd.ClipRect.X : 0.0f));
                                    ushort yy = (ushort)((cmd.ClipRect.Y > 0.0f ? cmd.ClipRect.Y : 0.0f));
                                    ushort zz = (ushort)((cmd.ClipRect.Z > 65535.0f ? 65535.0f : cmd.ClipRect.Z) - xx);
                                    ushort ww = (ushort)((cmd.ClipRect.W > 65535.0f ? 65535.0f : cmd.ClipRect.W) - yy);
                                    Bgfx.SetScissor(xx, yy, zz, ww);
                                    Bgfx.SetState(state, 0);
                                    Bgfx.SetTexture(0, TextureUniform, texHandle);
                                    Bgfx.SetTransientVertexBuffer(0, tvb, 0, (uint)numVertices);
                                    Bgfx.SetTransientIndexBuffer(tib, offset, cmd.ElemCount);
                                    Bgfx.Submit(viewID, ImGuiShader.program, 0, false);
                                }
                                offset += cmd.ElemCount;
                            }
                        }
                    }
                }

                Bgfx.Frame(false);
            }
        }