Пример #1
0
        public void Render()
        {
            ImGui.NewFrame();
            ImGui.ShowDemoWindow();
            UI.UIImGui.Render();
            ImGui.Render();
            var             data            = ImGui.GetDrawData();
            GraphicsContext graphicsContext = context.graphicsContext;
            float           L = data.DisplayPos.X;
            float           R = data.DisplayPos.X + data.DisplaySize.X;
            float           T = data.DisplayPos.Y;
            float           B = data.DisplayPos.Y + data.DisplaySize.Y;

            float[] mvp =
            {
                2.0f / (R - L),                 0.0f, 0.0f, 0.0f,
                0.0f,                 2.0f / (T - B), 0.0f, 0.0f,
                0.0f,                           0.0f, 0.5f, 0.0f,
                (R + L) / (L - R), (T + B) / (B - T), 0.5f, 1.0f,
            };
            int index1 = context.uploadBuffer.Upload <float>(mvp);

            graphicsContext.SetRootSignature(Pipeline12Util.FromString(context, "Cssss"));
            graphicsContext.SetPipelineState(context.pipelineStateObjects["ImGui"], psoDesc);
            context.uploadBuffer.SetCBV(graphicsContext, index1, 0);
            graphicsContext.commandList.IASetPrimitiveTopology(Vortice.Direct3D.PrimitiveTopology.TriangleList);

            Vector2 clip_off = data.DisplayPos;

            for (int i = 0; i < data.CmdListsCount; i++)
            {
                var cmdList    = data.CmdListsRange[i];
                var vertBytes  = cmdList.VtxBuffer.Size * sizeof(ImDrawVert);
                var indexBytes = cmdList.IdxBuffer.Size * sizeof(ImDrawIdx);

                context.uploadBuffer.UploadMesh(graphicsContext, imguiMesh, new Span <byte>(cmdList.VtxBuffer.Data.ToPointer(), vertBytes), new Span <byte>(cmdList.IdxBuffer.Data.ToPointer(), indexBytes), sizeof(ImDrawVert), Format.R16_UInt);
                graphicsContext.SetMesh(imguiMesh);

                for (int j = 0; j < cmdList.CmdBuffer.Size; j++)
                {
                    var cmd = cmdList.CmdBuffer[j];
                    if (cmd.UserCallback != IntPtr.Zero)
                    {
                        throw new NotImplementedException("user callbacks not implemented");
                    }
                    else
                    {
                        graphicsContext.SetSRV(context.GetTexByStrId(cmd.TextureId), 0);
                        var rect = new Vortice.RawRect((int)(cmd.ClipRect.X - clip_off.X), (int)(cmd.ClipRect.Y - clip_off.Y), (int)(cmd.ClipRect.Z - clip_off.X), (int)(cmd.ClipRect.W - clip_off.Y));
                        graphicsContext.commandList.RSSetScissorRects(new[] { rect });

                        graphicsContext.DrawIndexedInstanced((int)cmd.ElemCount, 1, (int)(cmd.IdxOffset), (int)(cmd.VtxOffset), 0);
                    }
                }
            }
        }