summaryrefslogtreecommitdiff
path: root/3rdparty/imgui/backend
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-06-27 18:27:13 -0700
committerrtk0c <[email protected]>2022-06-27 18:27:13 -0700
commit8f0dda5eab181b0f14f2652b4e984aaaae3f258c (patch)
tree4b825dc642cb6eb9a060e54bf8d69288fbee4904 /3rdparty/imgui/backend
parentfad6a88a13ab1f888ab25ad0aae19c1d63aa0623 (diff)
Start from a clean slate
Diffstat (limited to '3rdparty/imgui/backend')
-rw-r--r--3rdparty/imgui/backend/imgui_impl_dx11.cpp594
-rw-r--r--3rdparty/imgui/backend/imgui_impl_dx11.h26
-rw-r--r--3rdparty/imgui/backend/imgui_impl_dx12.cpp746
-rw-r--r--3rdparty/imgui/backend/imgui_impl_dx12.h38
-rw-r--r--3rdparty/imgui/backend/imgui_impl_glfw.cpp643
-rw-r--r--3rdparty/imgui/backend/imgui_impl_glfw.h46
-rw-r--r--3rdparty/imgui/backend/imgui_impl_metal.h67
-rw-r--r--3rdparty/imgui/backend/imgui_impl_metal.mm596
-rw-r--r--3rdparty/imgui/backend/imgui_impl_opengl2.cpp285
-rw-r--r--3rdparty/imgui/backend/imgui_impl_opengl2.h32
-rw-r--r--3rdparty/imgui/backend/imgui_impl_opengl3.cpp811
-rw-r--r--3rdparty/imgui/backend/imgui_impl_opengl3.h55
-rw-r--r--3rdparty/imgui/backend/imgui_impl_opengl3_loader.h757
-rw-r--r--3rdparty/imgui/backend/imgui_impl_vulkan.cpp1506
-rw-r--r--3rdparty/imgui/backend/imgui_impl_vulkan.h155
-rw-r--r--3rdparty/imgui/backend/imgui_impl_win32.cpp790
-rw-r--r--3rdparty/imgui/backend/imgui_impl_win32.h42
17 files changed, 0 insertions, 7189 deletions
diff --git a/3rdparty/imgui/backend/imgui_impl_dx11.cpp b/3rdparty/imgui/backend/imgui_impl_dx11.cpp
deleted file mode 100644
index 3f628cb..0000000
--- a/3rdparty/imgui/backend/imgui_impl_dx11.cpp
+++ /dev/null
@@ -1,594 +0,0 @@
-// dear imgui: Renderer Backend for DirectX11
-// This needs to be used along with a Platform Backend (e.g. Win32)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
-// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer.
-// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled).
-// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore.
-// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
-// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility.
-// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions.
-// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example.
-// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
-// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself.
-// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
-// 2016-05-07: DirectX11: Disabling depth-write.
-
-#include "imgui.h"
-#include "imgui_impl_dx11.h"
-
-// DirectX
-#include <stdio.h>
-#include <d3d11.h>
-#include <d3dcompiler.h>
-#ifdef _MSC_VER
-#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
-#endif
-
-// DirectX11 data
-struct ImGui_ImplDX11_Data
-{
- ID3D11Device* pd3dDevice;
- ID3D11DeviceContext* pd3dDeviceContext;
- IDXGIFactory* pFactory;
- ID3D11Buffer* pVB;
- ID3D11Buffer* pIB;
- ID3D11VertexShader* pVertexShader;
- ID3D11InputLayout* pInputLayout;
- ID3D11Buffer* pVertexConstantBuffer;
- ID3D11PixelShader* pPixelShader;
- ID3D11SamplerState* pFontSampler;
- ID3D11ShaderResourceView* pFontTextureView;
- ID3D11RasterizerState* pRasterizerState;
- ID3D11BlendState* pBlendState;
- ID3D11DepthStencilState* pDepthStencilState;
- int VertexBufferSize;
- int IndexBufferSize;
-
- ImGui_ImplDX11_Data() { memset(this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; }
-};
-
-struct VERTEX_CONSTANT_BUFFER
-{
- float mvp[4][4];
-};
-
-// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
-}
-
-// Functions
-static void ImGui_ImplDX11_SetupRenderState(ImDrawData* draw_data, ID3D11DeviceContext* ctx)
-{
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
-
- // Setup viewport
- D3D11_VIEWPORT vp;
- memset(&vp, 0, sizeof(D3D11_VIEWPORT));
- vp.Width = draw_data->DisplaySize.x;
- vp.Height = draw_data->DisplaySize.y;
- vp.MinDepth = 0.0f;
- vp.MaxDepth = 1.0f;
- vp.TopLeftX = vp.TopLeftY = 0;
- ctx->RSSetViewports(1, &vp);
-
- // Setup shader and vertex buffers
- unsigned int stride = sizeof(ImDrawVert);
- unsigned int offset = 0;
- ctx->IASetInputLayout(bd->pInputLayout);
- ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset);
- ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0);
- ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- ctx->VSSetShader(bd->pVertexShader, NULL, 0);
- ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer);
- ctx->PSSetShader(bd->pPixelShader, NULL, 0);
- ctx->PSSetSamplers(0, 1, &bd->pFontSampler);
- ctx->GSSetShader(NULL, NULL, 0);
- ctx->HSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
- ctx->DSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
- ctx->CSSetShader(NULL, NULL, 0); // In theory we should backup and restore this as well.. very infrequently used..
-
- // Setup blend state
- const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
- ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff);
- ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0);
- ctx->RSSetState(bd->pRasterizerState);
-}
-
-// Render function
-void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data)
-{
- // Avoid rendering when minimized
- if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
- return;
-
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- ID3D11DeviceContext* ctx = bd->pd3dDeviceContext;
-
- // Create and grow vertex/index buffers if needed
- if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount)
- {
- if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
- bd->VertexBufferSize = draw_data->TotalVtxCount + 5000;
- D3D11_BUFFER_DESC desc;
- memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
- desc.Usage = D3D11_USAGE_DYNAMIC;
- desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert);
- desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- desc.MiscFlags = 0;
- if (bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pVB) < 0)
- return;
- }
- if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount)
- {
- if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
- bd->IndexBufferSize = draw_data->TotalIdxCount + 10000;
- D3D11_BUFFER_DESC desc;
- memset(&desc, 0, sizeof(D3D11_BUFFER_DESC));
- desc.Usage = D3D11_USAGE_DYNAMIC;
- desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx);
- desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- if (bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pIB) < 0)
- return;
- }
-
- // Upload vertex/index data into a single contiguous GPU buffer
- D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource;
- if (ctx->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK)
- return;
- if (ctx->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK)
- return;
- ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData;
- ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData;
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
- memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
- vtx_dst += cmd_list->VtxBuffer.Size;
- idx_dst += cmd_list->IdxBuffer.Size;
- }
- ctx->Unmap(bd->pVB, 0);
- ctx->Unmap(bd->pIB, 0);
-
- // Setup orthographic projection matrix into our constant buffer
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
- {
- D3D11_MAPPED_SUBRESOURCE mapped_resource;
- if (ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
- return;
- VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource.pData;
- float L = draw_data->DisplayPos.x;
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
- float T = draw_data->DisplayPos.y;
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
- float mvp[4][4] =
- {
- { 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 },
- };
- memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
- ctx->Unmap(bd->pVertexConstantBuffer, 0);
- }
-
- // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
- struct BACKUP_DX11_STATE
- {
- UINT ScissorRectsCount, ViewportsCount;
- D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
- D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
- ID3D11RasterizerState* RS;
- ID3D11BlendState* BlendState;
- FLOAT BlendFactor[4];
- UINT SampleMask;
- UINT StencilRef;
- ID3D11DepthStencilState* DepthStencilState;
- ID3D11ShaderResourceView* PSShaderResource;
- ID3D11SamplerState* PSSampler;
- ID3D11PixelShader* PS;
- ID3D11VertexShader* VS;
- ID3D11GeometryShader* GS;
- UINT PSInstancesCount, VSInstancesCount, GSInstancesCount;
- ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation
- D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology;
- ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer;
- UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset;
- DXGI_FORMAT IndexBufferFormat;
- ID3D11InputLayout* InputLayout;
- };
- BACKUP_DX11_STATE old = {};
- old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
- ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects);
- ctx->RSGetViewports(&old.ViewportsCount, old.Viewports);
- ctx->RSGetState(&old.RS);
- ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask);
- ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef);
- ctx->PSGetShaderResources(0, 1, &old.PSShaderResource);
- ctx->PSGetSamplers(0, 1, &old.PSSampler);
- old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256;
- ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount);
- ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount);
- ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer);
- ctx->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount);
-
- ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology);
- ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset);
- ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset);
- ctx->IAGetInputLayout(&old.InputLayout);
-
- // Setup desired DX state
- ImGui_ImplDX11_SetupRenderState(draw_data, ctx);
-
- // Render command lists
- // (Because we merged all buffers into a single one, we maintain our own offset into them)
- int global_idx_offset = 0;
- int global_vtx_offset = 0;
- ImVec2 clip_off = draw_data->DisplayPos;
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback != NULL)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- ImGui_ImplDX11_SetupRenderState(draw_data, ctx);
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y);
- ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y);
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
-
- // Apply scissor/clipping rectangle
- const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
- ctx->RSSetScissorRects(1, &r);
-
- // Bind texture, Draw
- ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID();
- ctx->PSSetShaderResources(0, 1, &texture_srv);
- ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset);
- }
- }
- global_idx_offset += cmd_list->IdxBuffer.Size;
- global_vtx_offset += cmd_list->VtxBuffer.Size;
- }
-
- // Restore modified DX state
- ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
- ctx->RSSetViewports(old.ViewportsCount, old.Viewports);
- ctx->RSSetState(old.RS); if (old.RS) old.RS->Release();
- ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release();
- ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release();
- ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release();
- ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release();
- ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release();
- for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release();
- ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release();
- ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release();
- ctx->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release();
- for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release();
- ctx->IASetPrimitiveTopology(old.PrimitiveTopology);
- ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release();
- ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release();
- ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release();
-}
-
-static void ImGui_ImplDX11_CreateFontsTexture()
-{
- // Build texture atlas
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
-
- // Upload texture to graphics system
- {
- D3D11_TEXTURE2D_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.Width = width;
- desc.Height = height;
- desc.MipLevels = 1;
- desc.ArraySize = 1;
- desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- desc.SampleDesc.Count = 1;
- desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
- desc.CPUAccessFlags = 0;
-
- ID3D11Texture2D* pTexture = NULL;
- D3D11_SUBRESOURCE_DATA subResource;
- subResource.pSysMem = pixels;
- subResource.SysMemPitch = desc.Width * 4;
- subResource.SysMemSlicePitch = 0;
- bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture);
- IM_ASSERT(pTexture != NULL);
-
- // Create texture view
- D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
- ZeroMemory(&srvDesc, sizeof(srvDesc));
- srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- srvDesc.Texture2D.MipLevels = desc.MipLevels;
- srvDesc.Texture2D.MostDetailedMip = 0;
- bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->pFontTextureView);
- pTexture->Release();
- }
-
- // Store our identifier
- io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView);
-
- // Create texture sampler
- {
- D3D11_SAMPLER_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
- desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
- desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
- desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
- desc.MipLODBias = 0.f;
- desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
- desc.MinLOD = 0.f;
- desc.MaxLOD = 0.f;
- bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler);
- }
-}
-
-bool ImGui_ImplDX11_CreateDeviceObjects()
-{
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- if (!bd->pd3dDevice)
- return false;
- if (bd->pFontSampler)
- ImGui_ImplDX11_InvalidateDeviceObjects();
-
- // By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
- // If you would like to use this DX11 sample code but remove this dependency you can:
- // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
- // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
- // See https://github.com/ocornut/imgui/pull/638 for sources and details.
-
- // Create the vertex shader
- {
- static const char* vertexShader =
- "cbuffer vertexBuffer : register(b0) \
- {\
- float4x4 ProjectionMatrix; \
- };\
- struct VS_INPUT\
- {\
- float2 pos : POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- \
- struct PS_INPUT\
- {\
- float4 pos : SV_POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- \
- PS_INPUT main(VS_INPUT input)\
- {\
- PS_INPUT output;\
- output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
- output.col = input.col;\
- output.uv = input.uv;\
- return output;\
- }";
-
- ID3DBlob* vertexShaderBlob;
- if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &vertexShaderBlob, NULL)))
- return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
- if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), NULL, &bd->pVertexShader) != S_OK)
- {
- vertexShaderBlob->Release();
- return false;
- }
-
- // Create the input layout
- D3D11_INPUT_ELEMENT_DESC local_layout[] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
- { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
- };
- if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK)
- {
- vertexShaderBlob->Release();
- return false;
- }
- vertexShaderBlob->Release();
-
- // Create the constant buffer
- {
- D3D11_BUFFER_DESC desc;
- desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER);
- desc.Usage = D3D11_USAGE_DYNAMIC;
- desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
- desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
- desc.MiscFlags = 0;
- bd->pd3dDevice->CreateBuffer(&desc, NULL, &bd->pVertexConstantBuffer);
- }
- }
-
- // Create the pixel shader
- {
- static const char* pixelShader =
- "struct PS_INPUT\
- {\
- float4 pos : SV_POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- sampler sampler0;\
- Texture2D texture0;\
- \
- float4 main(PS_INPUT input) : SV_Target\
- {\
- float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
- return out_col; \
- }";
-
- ID3DBlob* pixelShaderBlob;
- if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &pixelShaderBlob, NULL)))
- return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
- if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), NULL, &bd->pPixelShader) != S_OK)
- {
- pixelShaderBlob->Release();
- return false;
- }
- pixelShaderBlob->Release();
- }
-
- // Create the blending setup
- {
- D3D11_BLEND_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.AlphaToCoverageEnable = false;
- desc.RenderTarget[0].BlendEnable = true;
- desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
- desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
- desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
- desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
- desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
- bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState);
- }
-
- // Create the rasterizer state
- {
- D3D11_RASTERIZER_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.FillMode = D3D11_FILL_SOLID;
- desc.CullMode = D3D11_CULL_NONE;
- desc.ScissorEnable = true;
- desc.DepthClipEnable = true;
- bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState);
- }
-
- // Create depth-stencil State
- {
- D3D11_DEPTH_STENCIL_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.DepthEnable = false;
- desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
- desc.DepthFunc = D3D11_COMPARISON_ALWAYS;
- desc.StencilEnable = false;
- desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
- desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
- desc.BackFace = desc.FrontFace;
- bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState);
- }
-
- ImGui_ImplDX11_CreateFontsTexture();
-
- return true;
-}
-
-void ImGui_ImplDX11_InvalidateDeviceObjects()
-{
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- if (!bd->pd3dDevice)
- return;
-
- if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = NULL; }
- if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = NULL; ImGui::GetIO().Fonts->SetTexID(NULL); } // We copied data->pFontTextureView to io.Fonts->TexID so let's clear that as well.
- if (bd->pIB) { bd->pIB->Release(); bd->pIB = NULL; }
- if (bd->pVB) { bd->pVB->Release(); bd->pVB = NULL; }
- if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = NULL; }
- if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = NULL; }
- if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = NULL; }
- if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = NULL; }
- if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = NULL; }
- if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = NULL; }
- if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = NULL; }
-}
-
-bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context)
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
-
- // Setup backend capabilities flags
- ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)();
- io.BackendRendererUserData = (void*)bd;
- io.BackendRendererName = "imgui_impl_dx11";
- io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-
- // Get factory from device
- IDXGIDevice* pDXGIDevice = NULL;
- IDXGIAdapter* pDXGIAdapter = NULL;
- IDXGIFactory* pFactory = NULL;
-
- if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK)
- if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK)
- if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK)
- {
- bd->pd3dDevice = device;
- bd->pd3dDeviceContext = device_context;
- bd->pFactory = pFactory;
- }
- if (pDXGIDevice) pDXGIDevice->Release();
- if (pDXGIAdapter) pDXGIAdapter->Release();
- bd->pd3dDevice->AddRef();
- bd->pd3dDeviceContext->AddRef();
-
- return true;
-}
-
-void ImGui_ImplDX11_Shutdown()
-{
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- ImGui_ImplDX11_InvalidateDeviceObjects();
- if (bd->pFactory) { bd->pFactory->Release(); }
- if (bd->pd3dDevice) { bd->pd3dDevice->Release(); }
- if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); }
- io.BackendRendererName = NULL;
- io.BackendRendererUserData = NULL;
- IM_DELETE(bd);
-}
-
-void ImGui_ImplDX11_NewFrame()
-{
- ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX11_Init()?");
-
- if (!bd->pFontSampler)
- ImGui_ImplDX11_CreateDeviceObjects();
-}
diff --git a/3rdparty/imgui/backend/imgui_impl_dx11.h b/3rdparty/imgui/backend/imgui_impl_dx11.h
deleted file mode 100644
index a83bce1..0000000
--- a/3rdparty/imgui/backend/imgui_impl_dx11.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// dear imgui: Renderer Backend for DirectX11
-// This needs to be used along with a Platform Backend (e.g. Win32)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-struct ID3D11Device;
-struct ID3D11DeviceContext;
-
-IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context);
-IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame();
-IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data);
-
-// Use if you want to reset your rendering device without losing Dear ImGui state.
-IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects();
-IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects();
diff --git a/3rdparty/imgui/backend/imgui_impl_dx12.cpp b/3rdparty/imgui/backend/imgui_impl_dx12.cpp
deleted file mode 100644
index e9d2e96..0000000
--- a/3rdparty/imgui/backend/imgui_impl_dx12.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-// dear imgui: Renderer Backend for DirectX12
-// This needs to be used along with a Platform Backend (e.g. Win32)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
-// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
-// To build this on 32-bit systems:
-// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file)
-// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
-// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
-// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file)
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-05-19: DirectX12: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
-// 2021-02-18: DirectX12: Change blending equation to preserve alpha in output buffer.
-// 2021-01-11: DirectX12: Improve Windows 7 compatibility (for D3D12On7) by loading d3d12.dll dynamically.
-// 2020-09-16: DirectX12: Avoid rendering calls with zero-sized scissor rectangle since it generates a validation layer warning.
-// 2020-09-08: DirectX12: Clarified support for building on 32-bit systems by redefining ImTextureID.
-// 2019-10-18: DirectX12: *BREAKING CHANGE* Added extra ID3D12DescriptorHeap parameter to ImGui_ImplDX12_Init() function.
-// 2019-05-29: DirectX12: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
-// 2019-04-30: DirectX12: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2019-03-29: Misc: Various minor tidying up.
-// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile().
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-06-12: DirectX12: Moved the ID3D12GraphicsCommandList* parameter from NewFrame() to RenderDrawData().
-// 2018-06-08: Misc: Extracted imgui_impl_dx12.cpp/.h away from the old combined DX12+Win32 example.
-// 2018-06-08: DirectX12: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle (to ease support for future multi-viewport).
-// 2018-02-22: Merged into master with all Win32 code synchronized to other examples.
-
-#include "imgui.h"
-#include "imgui_impl_dx12.h"
-
-// DirectX
-#include <d3d12.h>
-#include <dxgi1_4.h>
-#include <d3dcompiler.h>
-#ifdef _MSC_VER
-#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below.
-#endif
-
-// DirectX data
-struct ImGui_ImplDX12_RenderBuffers
-{
- ID3D12Resource* IndexBuffer;
- ID3D12Resource* VertexBuffer;
- int IndexBufferSize;
- int VertexBufferSize;
-};
-
-struct ImGui_ImplDX12_Data
-{
- ID3D12Device* pd3dDevice;
- ID3D12RootSignature* pRootSignature;
- ID3D12PipelineState* pPipelineState;
- DXGI_FORMAT RTVFormat;
- ID3D12Resource* pFontTextureResource;
- D3D12_CPU_DESCRIPTOR_HANDLE hFontSrvCpuDescHandle;
- D3D12_GPU_DESCRIPTOR_HANDLE hFontSrvGpuDescHandle;
-
- ImGui_ImplDX12_RenderBuffers* pFrameResources;
- UINT numFramesInFlight;
- UINT frameIndex;
-
- ImGui_ImplDX12_Data() { memset(this, 0, sizeof(*this)); frameIndex = UINT_MAX; }
-};
-
-struct VERTEX_CONSTANT_BUFFER
-{
- float mvp[4][4];
-};
-
-// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-static ImGui_ImplDX12_Data* ImGui_ImplDX12_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplDX12_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
-}
-
-// Functions
-static void ImGui_ImplDX12_SetupRenderState(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx, ImGui_ImplDX12_RenderBuffers* fr)
-{
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
-
- // Setup orthographic projection matrix into our constant buffer
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
- VERTEX_CONSTANT_BUFFER vertex_constant_buffer;
- {
- float L = draw_data->DisplayPos.x;
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
- float T = draw_data->DisplayPos.y;
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
- float mvp[4][4] =
- {
- { 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 },
- };
- memcpy(&vertex_constant_buffer.mvp, mvp, sizeof(mvp));
- }
-
- // Setup viewport
- D3D12_VIEWPORT vp;
- memset(&vp, 0, sizeof(D3D12_VIEWPORT));
- vp.Width = draw_data->DisplaySize.x;
- vp.Height = draw_data->DisplaySize.y;
- vp.MinDepth = 0.0f;
- vp.MaxDepth = 1.0f;
- vp.TopLeftX = vp.TopLeftY = 0.0f;
- ctx->RSSetViewports(1, &vp);
-
- // Bind shader and vertex buffers
- unsigned int stride = sizeof(ImDrawVert);
- unsigned int offset = 0;
- D3D12_VERTEX_BUFFER_VIEW vbv;
- memset(&vbv, 0, sizeof(D3D12_VERTEX_BUFFER_VIEW));
- vbv.BufferLocation = fr->VertexBuffer->GetGPUVirtualAddress() + offset;
- vbv.SizeInBytes = fr->VertexBufferSize * stride;
- vbv.StrideInBytes = stride;
- ctx->IASetVertexBuffers(0, 1, &vbv);
- D3D12_INDEX_BUFFER_VIEW ibv;
- memset(&ibv, 0, sizeof(D3D12_INDEX_BUFFER_VIEW));
- ibv.BufferLocation = fr->IndexBuffer->GetGPUVirtualAddress();
- ibv.SizeInBytes = fr->IndexBufferSize * sizeof(ImDrawIdx);
- ibv.Format = sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT;
- ctx->IASetIndexBuffer(&ibv);
- ctx->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- ctx->SetPipelineState(bd->pPipelineState);
- ctx->SetGraphicsRootSignature(bd->pRootSignature);
- ctx->SetGraphicsRoot32BitConstants(0, 16, &vertex_constant_buffer, 0);
-
- // Setup blend factor
- const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f };
- ctx->OMSetBlendFactor(blend_factor);
-}
-
-template<typename T>
-static inline void SafeRelease(T*& res)
-{
- if (res)
- res->Release();
- res = NULL;
-}
-
-// Render function
-void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx)
-{
- // Avoid rendering when minimized
- if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f)
- return;
-
- // FIXME: I'm assuming that this only gets called once per frame!
- // If not, we can't just re-allocate the IB or VB, we'll have to do a proper allocator.
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- bd->frameIndex = bd->frameIndex + 1;
- ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[bd->frameIndex % bd->numFramesInFlight];
-
- // Create and grow vertex/index buffers if needed
- if (fr->VertexBuffer == NULL || fr->VertexBufferSize < draw_data->TotalVtxCount)
- {
- SafeRelease(fr->VertexBuffer);
- fr->VertexBufferSize = draw_data->TotalVtxCount + 5000;
- D3D12_HEAP_PROPERTIES props;
- memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
- props.Type = D3D12_HEAP_TYPE_UPLOAD;
- props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
- props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
- D3D12_RESOURCE_DESC desc;
- memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC));
- desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
- desc.Width = fr->VertexBufferSize * sizeof(ImDrawVert);
- desc.Height = 1;
- desc.DepthOrArraySize = 1;
- desc.MipLevels = 1;
- desc.Format = DXGI_FORMAT_UNKNOWN;
- desc.SampleDesc.Count = 1;
- desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
- desc.Flags = D3D12_RESOURCE_FLAG_NONE;
- if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&fr->VertexBuffer)) < 0)
- return;
- }
- if (fr->IndexBuffer == NULL || fr->IndexBufferSize < draw_data->TotalIdxCount)
- {
- SafeRelease(fr->IndexBuffer);
- fr->IndexBufferSize = draw_data->TotalIdxCount + 10000;
- D3D12_HEAP_PROPERTIES props;
- memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
- props.Type = D3D12_HEAP_TYPE_UPLOAD;
- props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
- props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
- D3D12_RESOURCE_DESC desc;
- memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC));
- desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
- desc.Width = fr->IndexBufferSize * sizeof(ImDrawIdx);
- desc.Height = 1;
- desc.DepthOrArraySize = 1;
- desc.MipLevels = 1;
- desc.Format = DXGI_FORMAT_UNKNOWN;
- desc.SampleDesc.Count = 1;
- desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
- desc.Flags = D3D12_RESOURCE_FLAG_NONE;
- if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&fr->IndexBuffer)) < 0)
- return;
- }
-
- // Upload vertex/index data into a single contiguous GPU buffer
- void* vtx_resource, *idx_resource;
- D3D12_RANGE range;
- memset(&range, 0, sizeof(D3D12_RANGE));
- if (fr->VertexBuffer->Map(0, &range, &vtx_resource) != S_OK)
- return;
- if (fr->IndexBuffer->Map(0, &range, &idx_resource) != S_OK)
- return;
- ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource;
- ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource;
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
- memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
- vtx_dst += cmd_list->VtxBuffer.Size;
- idx_dst += cmd_list->IdxBuffer.Size;
- }
- fr->VertexBuffer->Unmap(0, &range);
- fr->IndexBuffer->Unmap(0, &range);
-
- // Setup desired DX state
- ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr);
-
- // Render command lists
- // (Because we merged all buffers into a single one, we maintain our own offset into them)
- int global_vtx_offset = 0;
- int global_idx_offset = 0;
- ImVec2 clip_off = draw_data->DisplayPos;
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback != NULL)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr);
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y);
- ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y);
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
-
- // Apply Scissor/clipping rectangle, Bind texture, Draw
- const D3D12_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y };
- D3D12_GPU_DESCRIPTOR_HANDLE texture_handle = {};
- texture_handle.ptr = (UINT64)pcmd->GetTexID();
- ctx->SetGraphicsRootDescriptorTable(1, texture_handle);
- ctx->RSSetScissorRects(1, &r);
- ctx->DrawIndexedInstanced(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0);
- }
- }
- global_idx_offset += cmd_list->IdxBuffer.Size;
- global_vtx_offset += cmd_list->VtxBuffer.Size;
- }
-}
-
-static void ImGui_ImplDX12_CreateFontsTexture()
-{
- // Build texture atlas
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
-
- // Upload texture to graphics system
- {
- D3D12_HEAP_PROPERTIES props;
- memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES));
- props.Type = D3D12_HEAP_TYPE_DEFAULT;
- props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
- props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
-
- D3D12_RESOURCE_DESC desc;
- ZeroMemory(&desc, sizeof(desc));
- desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
- desc.Alignment = 0;
- desc.Width = width;
- desc.Height = height;
- desc.DepthOrArraySize = 1;
- desc.MipLevels = 1;
- desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
- desc.Flags = D3D12_RESOURCE_FLAG_NONE;
-
- ID3D12Resource* pTexture = NULL;
- bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc,
- D3D12_RESOURCE_STATE_COPY_DEST, NULL, IID_PPV_ARGS(&pTexture));
-
- UINT uploadPitch = (width * 4 + D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u) & ~(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u);
- UINT uploadSize = height * uploadPitch;
- desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
- desc.Alignment = 0;
- desc.Width = uploadSize;
- desc.Height = 1;
- desc.DepthOrArraySize = 1;
- desc.MipLevels = 1;
- desc.Format = DXGI_FORMAT_UNKNOWN;
- desc.SampleDesc.Count = 1;
- desc.SampleDesc.Quality = 0;
- desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
- desc.Flags = D3D12_RESOURCE_FLAG_NONE;
-
- props.Type = D3D12_HEAP_TYPE_UPLOAD;
- props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
- props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
-
- ID3D12Resource* uploadBuffer = NULL;
- HRESULT hr = bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc,
- D3D12_RESOURCE_STATE_GENERIC_READ, NULL, IID_PPV_ARGS(&uploadBuffer));
- IM_ASSERT(SUCCEEDED(hr));
-
- void* mapped = NULL;
- D3D12_RANGE range = { 0, uploadSize };
- hr = uploadBuffer->Map(0, &range, &mapped);
- IM_ASSERT(SUCCEEDED(hr));
- for (int y = 0; y < height; y++)
- memcpy((void*) ((uintptr_t) mapped + y * uploadPitch), pixels + y * width * 4, width * 4);
- uploadBuffer->Unmap(0, &range);
-
- D3D12_TEXTURE_COPY_LOCATION srcLocation = {};
- srcLocation.pResource = uploadBuffer;
- srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
- srcLocation.PlacedFootprint.Footprint.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- srcLocation.PlacedFootprint.Footprint.Width = width;
- srcLocation.PlacedFootprint.Footprint.Height = height;
- srcLocation.PlacedFootprint.Footprint.Depth = 1;
- srcLocation.PlacedFootprint.Footprint.RowPitch = uploadPitch;
-
- D3D12_TEXTURE_COPY_LOCATION dstLocation = {};
- dstLocation.pResource = pTexture;
- dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
- dstLocation.SubresourceIndex = 0;
-
- D3D12_RESOURCE_BARRIER barrier = {};
- barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
- barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
- barrier.Transition.pResource = pTexture;
- barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
- barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;
- barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-
- ID3D12Fence* fence = NULL;
- hr = bd->pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));
- IM_ASSERT(SUCCEEDED(hr));
-
- HANDLE event = CreateEvent(0, 0, 0, 0);
- IM_ASSERT(event != NULL);
-
- D3D12_COMMAND_QUEUE_DESC queueDesc = {};
- queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
- queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
- queueDesc.NodeMask = 1;
-
- ID3D12CommandQueue* cmdQueue = NULL;
- hr = bd->pd3dDevice->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&cmdQueue));
- IM_ASSERT(SUCCEEDED(hr));
-
- ID3D12CommandAllocator* cmdAlloc = NULL;
- hr = bd->pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&cmdAlloc));
- IM_ASSERT(SUCCEEDED(hr));
-
- ID3D12GraphicsCommandList* cmdList = NULL;
- hr = bd->pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdAlloc, NULL, IID_PPV_ARGS(&cmdList));
- IM_ASSERT(SUCCEEDED(hr));
-
- cmdList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, NULL);
- cmdList->ResourceBarrier(1, &barrier);
-
- hr = cmdList->Close();
- IM_ASSERT(SUCCEEDED(hr));
-
- cmdQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&cmdList);
- hr = cmdQueue->Signal(fence, 1);
- IM_ASSERT(SUCCEEDED(hr));
-
- fence->SetEventOnCompletion(1, event);
- WaitForSingleObject(event, INFINITE);
-
- cmdList->Release();
- cmdAlloc->Release();
- cmdQueue->Release();
- CloseHandle(event);
- fence->Release();
- uploadBuffer->Release();
-
- // Create texture view
- D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc;
- ZeroMemory(&srvDesc, sizeof(srvDesc));
- srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
- srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
- srvDesc.Texture2D.MipLevels = desc.MipLevels;
- srvDesc.Texture2D.MostDetailedMip = 0;
- srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
- bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, bd->hFontSrvCpuDescHandle);
- SafeRelease(bd->pFontTextureResource);
- bd->pFontTextureResource = pTexture;
- }
-
- // Store our identifier
- // READ THIS IF THE STATIC_ASSERT() TRIGGERS:
- // - Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
- // - This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
- // [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file)
- // [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
- // [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
- // [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file)
- static_assert(sizeof(ImTextureID) >= sizeof(bd->hFontSrvGpuDescHandle.ptr), "Can't pack descriptor handle into TexID, 32-bit not supported yet.");
- io.Fonts->SetTexID((ImTextureID)bd->hFontSrvGpuDescHandle.ptr);
-}
-
-bool ImGui_ImplDX12_CreateDeviceObjects()
-{
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- if (!bd || !bd->pd3dDevice)
- return false;
- if (bd->pPipelineState)
- ImGui_ImplDX12_InvalidateDeviceObjects();
-
- // Create the root signature
- {
- D3D12_DESCRIPTOR_RANGE descRange = {};
- descRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
- descRange.NumDescriptors = 1;
- descRange.BaseShaderRegister = 0;
- descRange.RegisterSpace = 0;
- descRange.OffsetInDescriptorsFromTableStart = 0;
-
- D3D12_ROOT_PARAMETER param[2] = {};
-
- param[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
- param[0].Constants.ShaderRegister = 0;
- param[0].Constants.RegisterSpace = 0;
- param[0].Constants.Num32BitValues = 16;
- param[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;
-
- param[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
- param[1].DescriptorTable.NumDescriptorRanges = 1;
- param[1].DescriptorTable.pDescriptorRanges = &descRange;
- param[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
-
- D3D12_STATIC_SAMPLER_DESC staticSampler = {};
- staticSampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
- staticSampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
- staticSampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
- staticSampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
- staticSampler.MipLODBias = 0.f;
- staticSampler.MaxAnisotropy = 0;
- staticSampler.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
- staticSampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
- staticSampler.MinLOD = 0.f;
- staticSampler.MaxLOD = 0.f;
- staticSampler.ShaderRegister = 0;
- staticSampler.RegisterSpace = 0;
- staticSampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
-
- D3D12_ROOT_SIGNATURE_DESC desc = {};
- desc.NumParameters = _countof(param);
- desc.pParameters = param;
- desc.NumStaticSamplers = 1;
- desc.pStaticSamplers = &staticSampler;
- desc.Flags =
- D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT |
- D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
- D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
- D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
-
- // Load d3d12.dll and D3D12SerializeRootSignature() function address dynamically to facilitate using with D3D12On7.
- // See if any version of d3d12.dll is already loaded in the process. If so, give preference to that.
- static HINSTANCE d3d12_dll = ::GetModuleHandleA("d3d12.dll");
- if (d3d12_dll == NULL)
- {
- // Attempt to load d3d12.dll from local directories. This will only succeed if
- // (1) the current OS is Windows 7, and
- // (2) there exists a version of d3d12.dll for Windows 7 (D3D12On7) in one of the following directories.
- // See https://github.com/ocornut/imgui/pull/3696 for details.
- const char* localD3d12Paths[] = { ".\\d3d12.dll", ".\\d3d12on7\\d3d12.dll", ".\\12on7\\d3d12.dll" }; // A. current directory, B. used by some games, C. used in Microsoft D3D12On7 sample
- for (int i = 0; i < IM_ARRAYSIZE(localD3d12Paths); i++)
- if ((d3d12_dll = ::LoadLibraryA(localD3d12Paths[i])) != NULL)
- break;
-
- // If failed, we are on Windows >= 10.
- if (d3d12_dll == NULL)
- d3d12_dll = ::LoadLibraryA("d3d12.dll");
-
- if (d3d12_dll == NULL)
- return false;
- }
-
- PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignatureFn = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)::GetProcAddress(d3d12_dll, "D3D12SerializeRootSignature");
- if (D3D12SerializeRootSignatureFn == NULL)
- return false;
-
- ID3DBlob* blob = NULL;
- if (D3D12SerializeRootSignatureFn(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, NULL) != S_OK)
- return false;
-
- bd->pd3dDevice->CreateRootSignature(0, blob->GetBufferPointer(), blob->GetBufferSize(), IID_PPV_ARGS(&bd->pRootSignature));
- blob->Release();
- }
-
- // By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A)
- // If you would like to use this DX12 sample code but remove this dependency you can:
- // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution]
- // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL.
- // See https://github.com/ocornut/imgui/pull/638 for sources and details.
-
- D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc;
- memset(&psoDesc, 0, sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC));
- psoDesc.NodeMask = 1;
- psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
- psoDesc.pRootSignature = bd->pRootSignature;
- psoDesc.SampleMask = UINT_MAX;
- psoDesc.NumRenderTargets = 1;
- psoDesc.RTVFormats[0] = bd->RTVFormat;
- psoDesc.SampleDesc.Count = 1;
- psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
-
- ID3DBlob* vertexShaderBlob;
- ID3DBlob* pixelShaderBlob;
-
- // Create the vertex shader
- {
- static const char* vertexShader =
- "cbuffer vertexBuffer : register(b0) \
- {\
- float4x4 ProjectionMatrix; \
- };\
- struct VS_INPUT\
- {\
- float2 pos : POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- \
- struct PS_INPUT\
- {\
- float4 pos : SV_POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- \
- PS_INPUT main(VS_INPUT input)\
- {\
- PS_INPUT output;\
- output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\
- output.col = input.col;\
- output.uv = input.uv;\
- return output;\
- }";
-
- if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_5_0", 0, 0, &vertexShaderBlob, NULL)))
- return false; // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
- psoDesc.VS = { vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize() };
-
- // Create the input layout
- static D3D12_INPUT_ELEMENT_DESC local_layout[] =
- {
- { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
- { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
- { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
- };
- psoDesc.InputLayout = { local_layout, 3 };
- }
-
- // Create the pixel shader
- {
- static const char* pixelShader =
- "struct PS_INPUT\
- {\
- float4 pos : SV_POSITION;\
- float4 col : COLOR0;\
- float2 uv : TEXCOORD0;\
- };\
- SamplerState sampler0 : register(s0);\
- Texture2D texture0 : register(t0);\
- \
- float4 main(PS_INPUT input) : SV_Target\
- {\
- float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \
- return out_col; \
- }";
-
- if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_5_0", 0, 0, &pixelShaderBlob, NULL)))
- {
- vertexShaderBlob->Release();
- return false; // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob!
- }
- psoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() };
- }
-
- // Create the blending setup
- {
- D3D12_BLEND_DESC& desc = psoDesc.BlendState;
- desc.AlphaToCoverageEnable = false;
- desc.RenderTarget[0].BlendEnable = true;
- desc.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA;
- desc.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
- desc.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD;
- desc.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_ONE;
- desc.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA;
- desc.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD;
- desc.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
- }
-
- // Create the rasterizer state
- {
- D3D12_RASTERIZER_DESC& desc = psoDesc.RasterizerState;
- desc.FillMode = D3D12_FILL_MODE_SOLID;
- desc.CullMode = D3D12_CULL_MODE_NONE;
- desc.FrontCounterClockwise = FALSE;
- desc.DepthBias = D3D12_DEFAULT_DEPTH_BIAS;
- desc.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP;
- desc.SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS;
- desc.DepthClipEnable = true;
- desc.MultisampleEnable = FALSE;
- desc.AntialiasedLineEnable = FALSE;
- desc.ForcedSampleCount = 0;
- desc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF;
- }
-
- // Create depth-stencil State
- {
- D3D12_DEPTH_STENCIL_DESC& desc = psoDesc.DepthStencilState;
- desc.DepthEnable = false;
- desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL;
- desc.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS;
- desc.StencilEnable = false;
- desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP;
- desc.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
- desc.BackFace = desc.FrontFace;
- }
-
- HRESULT result_pipeline_state = bd->pd3dDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&bd->pPipelineState));
- vertexShaderBlob->Release();
- pixelShaderBlob->Release();
- if (result_pipeline_state != S_OK)
- return false;
-
- ImGui_ImplDX12_CreateFontsTexture();
-
- return true;
-}
-
-void ImGui_ImplDX12_InvalidateDeviceObjects()
-{
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- if (!bd || !bd->pd3dDevice)
- return;
- ImGuiIO& io = ImGui::GetIO();
-
- SafeRelease(bd->pRootSignature);
- SafeRelease(bd->pPipelineState);
- SafeRelease(bd->pFontTextureResource);
- io.Fonts->SetTexID(NULL); // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well.
-
- for (UINT i = 0; i < bd->numFramesInFlight; i++)
- {
- ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i];
- SafeRelease(fr->IndexBuffer);
- SafeRelease(fr->VertexBuffer);
- }
-}
-
-bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap,
- D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle)
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
-
- // Setup backend capabilities flags
- ImGui_ImplDX12_Data* bd = IM_NEW(ImGui_ImplDX12_Data)();
- io.BackendRendererUserData = (void*)bd;
- io.BackendRendererName = "imgui_impl_dx12";
- io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-
- bd->pd3dDevice = device;
- bd->RTVFormat = rtv_format;
- bd->hFontSrvCpuDescHandle = font_srv_cpu_desc_handle;
- bd->hFontSrvGpuDescHandle = font_srv_gpu_desc_handle;
- bd->pFrameResources = new ImGui_ImplDX12_RenderBuffers[num_frames_in_flight];
- bd->numFramesInFlight = num_frames_in_flight;
- bd->frameIndex = UINT_MAX;
- IM_UNUSED(cbv_srv_heap); // Unused in master branch (will be used by multi-viewports)
-
- // Create buffers with a default size (they will later be grown as needed)
- for (int i = 0; i < num_frames_in_flight; i++)
- {
- ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i];
- fr->IndexBuffer = NULL;
- fr->VertexBuffer = NULL;
- fr->IndexBufferSize = 10000;
- fr->VertexBufferSize = 5000;
- }
-
- return true;
-}
-
-void ImGui_ImplDX12_Shutdown()
-{
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- ImGui_ImplDX12_InvalidateDeviceObjects();
- delete[] bd->pFrameResources;
- io.BackendRendererName = NULL;
- io.BackendRendererUserData = NULL;
- IM_DELETE(bd);
-}
-
-void ImGui_ImplDX12_NewFrame()
-{
- ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplDX12_Init()?");
-
- if (!bd->pPipelineState)
- ImGui_ImplDX12_CreateDeviceObjects();
-}
diff --git a/3rdparty/imgui/backend/imgui_impl_dx12.h b/3rdparty/imgui/backend/imgui_impl_dx12.h
deleted file mode 100644
index 6548f6f..0000000
--- a/3rdparty/imgui/backend/imgui_impl_dx12.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// dear imgui: Renderer Backend for DirectX12
-// This needs to be used along with a Platform Backend (e.g. Win32)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'.
-// See imgui_impl_dx12.cpp file for details.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-#include <dxgiformat.h> // DXGI_FORMAT
-
-struct ID3D12Device;
-struct ID3D12DescriptorHeap;
-struct ID3D12GraphicsCommandList;
-struct D3D12_CPU_DESCRIPTOR_HANDLE;
-struct D3D12_GPU_DESCRIPTOR_HANDLE;
-
-// cmd_list is the command list that the implementation will use to render imgui draw lists.
-// Before calling the render function, caller must prepare cmd_list by resetting it and setting the appropriate
-// render target and descriptor heap that contains font_srv_cpu_desc_handle/font_srv_gpu_desc_handle.
-// font_srv_cpu_desc_handle and font_srv_gpu_desc_handle are handles to a single SRV descriptor to use for the internal font texture.
-IMGUI_IMPL_API bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap,
- D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle);
-IMGUI_IMPL_API void ImGui_ImplDX12_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplDX12_NewFrame();
-IMGUI_IMPL_API void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* graphics_command_list);
-
-// Use if you want to reset your rendering device without losing Dear ImGui state.
-IMGUI_IMPL_API void ImGui_ImplDX12_InvalidateDeviceObjects();
-IMGUI_IMPL_API bool ImGui_ImplDX12_CreateDeviceObjects();
diff --git a/3rdparty/imgui/backend/imgui_impl_glfw.cpp b/3rdparty/imgui/backend/imgui_impl_glfw.cpp
deleted file mode 100644
index 516aa3c..0000000
--- a/3rdparty/imgui/backend/imgui_impl_glfw.cpp
+++ /dev/null
@@ -1,643 +0,0 @@
-// dear imgui: Platform Backend for GLFW
-// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..)
-// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)
-// (Requires: GLFW 3.1+)
-
-// Implemented features:
-// [X] Platform: Clipboard support.
-// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLFW_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
-// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
-// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange' (note: the resizing cursors requires GLFW 3.4+).
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2022-02-07: Added ImGui_ImplGlfw_InstallCallbacks()/ImGui_ImplGlfw_RestoreCallbacks() helpers to facilitate user installing callbacks after iniitializing backend.
-// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago)with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion.
-// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[].
-// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+).
-// 2022-01-17: Inputs: always update key mods next and before key event (not in NewFrame) to fix input queue with very low framerates.
-// 2022-01-12: *BREAKING CHANGE*: Now using glfwSetCursorPosCallback(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetCursorPosCallback() and forward it to the backend via ImGui_ImplGlfw_CursorPosCallback().
-// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range.
-// 2022-01-05: Inputs: Converting GLFW untranslated keycodes back to translated keycodes (in the ImGui_ImplGlfw_KeyCallback() function) in order to match the behavior of every other backend, and facilitate the use of GLFW with lettered-shortcuts API.
-// 2021-08-17: *BREAKING CHANGE*: Now using glfwSetWindowFocusCallback() to calling io.AddFocusEvent(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() and forward it to the backend via ImGui_ImplGlfw_WindowFocusCallback().
-// 2021-07-29: *BREAKING CHANGE*: Now using glfwSetCursorEnterCallback(). MousePos is correctly reported when the host platform window is hovered but not focused. If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() callback and forward it to the backend via ImGui_ImplGlfw_CursorEnterCallback().
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2020-01-17: Inputs: Disable error callback while assigning mouse cursors because some X11 setup don't have them and it generates errors.
-// 2019-12-05: Inputs: Added support for new mouse cursors added in GLFW 3.4+ (resizing cursors, not allowed cursor).
-// 2019-10-18: Misc: Previously installed user callbacks are now restored on shutdown.
-// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter.
-// 2019-05-11: Inputs: Don't filter value from character callback before calling AddInputCharacter().
-// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized.
-// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
-// 2018-11-07: Inputs: When installing our GLFW callbacks, we save user's previously installed ones - if any - and chain call them.
-// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls.
-// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
-// 2018-06-08: Misc: Extracted imgui_impl_glfw.cpp/.h away from the old combined GLFW+OpenGL/Vulkan examples.
-// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
-// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value, passed to glfwSetCursor()).
-// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
-// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
-// 2018-01-25: Inputs: Added gamepad support if ImGuiConfigFlags_NavEnableGamepad is set.
-// 2018-01-25: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set).
-// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support.
-// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert.
-// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1).
-// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers.
-
-#include "imgui.h"
-#include "imgui_impl_glfw.h"
-
-// Clang warnings with -Weverything
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
-#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
-#if __has_warning("-Wzero-as-null-pointer-constant")
-#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
-#endif
-#endif
-
-// GLFW
-#include <GLFW/glfw3.h>
-#ifdef _WIN32
-#undef APIENTRY
-#define GLFW_EXPOSE_NATIVE_WIN32
-#include <GLFW/glfw3native.h> // for glfwGetWin32Window
-#endif
-#ifdef GLFW_RESIZE_NESW_CURSOR // Let's be nice to people who pulled GLFW between 2019-04-16 (3.4 define) and 2019-11-29 (cursors defines) // FIXME: Remove when GLFW 3.4 is released?
-#define GLFW_HAS_NEW_CURSORS (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3400) // 3.4+ GLFW_RESIZE_ALL_CURSOR, GLFW_RESIZE_NESW_CURSOR, GLFW_RESIZE_NWSE_CURSOR, GLFW_NOT_ALLOWED_CURSOR
-#else
-#define GLFW_HAS_NEW_CURSORS (0)
-#endif
-#define GLFW_HAS_GAMEPAD_API (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3300) // 3.3+ glfwGetGamepadState() new api
-#define GLFW_HAS_GET_KEY_NAME (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 >= 3200) // 3.2+ glfwGetKeyName()
-
-// GLFW data
-enum GlfwClientApi
-{
- GlfwClientApi_Unknown,
- GlfwClientApi_OpenGL,
- GlfwClientApi_Vulkan
-};
-
-struct ImGui_ImplGlfw_Data
-{
- GLFWwindow* Window;
- GlfwClientApi ClientApi;
- double Time;
- GLFWwindow* MouseWindow;
- GLFWcursor* MouseCursors[ImGuiMouseCursor_COUNT];
- ImVec2 LastValidMousePos;
- bool InstalledCallbacks;
-
- // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
- GLFWwindowfocusfun PrevUserCallbackWindowFocus;
- GLFWcursorposfun PrevUserCallbackCursorPos;
- GLFWcursorenterfun PrevUserCallbackCursorEnter;
- GLFWmousebuttonfun PrevUserCallbackMousebutton;
- GLFWscrollfun PrevUserCallbackScroll;
- GLFWkeyfun PrevUserCallbackKey;
- GLFWcharfun PrevUserCallbackChar;
- GLFWmonitorfun PrevUserCallbackMonitor;
-
- ImGui_ImplGlfw_Data() { memset(this, 0, sizeof(*this)); }
-};
-
-// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
-// - Because glfwPollEvents() process all windows and some events may be called outside of it, you will need to register your own callbacks
-// (passing install_callbacks=false in ImGui_ImplGlfw_InitXXX functions), set the current dear imgui context and then call our callbacks.
-// - Otherwise we may need to store a GLFWWindow* -> ImGuiContext* map and handle this in the backend, adding a little bit of extra complexity to it.
-// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
-static ImGui_ImplGlfw_Data* ImGui_ImplGlfw_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplGlfw_Data*)ImGui::GetIO().BackendPlatformUserData : NULL;
-}
-
-// Functions
-static const char* ImGui_ImplGlfw_GetClipboardText(void* user_data)
-{
- return glfwGetClipboardString((GLFWwindow*)user_data);
-}
-
-static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text)
-{
- glfwSetClipboardString((GLFWwindow*)user_data, text);
-}
-
-static ImGuiKey ImGui_ImplGlfw_KeyToImGuiKey(int key)
-{
- switch (key)
- {
- case GLFW_KEY_TAB: return ImGuiKey_Tab;
- case GLFW_KEY_LEFT: return ImGuiKey_LeftArrow;
- case GLFW_KEY_RIGHT: return ImGuiKey_RightArrow;
- case GLFW_KEY_UP: return ImGuiKey_UpArrow;
- case GLFW_KEY_DOWN: return ImGuiKey_DownArrow;
- case GLFW_KEY_PAGE_UP: return ImGuiKey_PageUp;
- case GLFW_KEY_PAGE_DOWN: return ImGuiKey_PageDown;
- case GLFW_KEY_HOME: return ImGuiKey_Home;
- case GLFW_KEY_END: return ImGuiKey_End;
- case GLFW_KEY_INSERT: return ImGuiKey_Insert;
- case GLFW_KEY_DELETE: return ImGuiKey_Delete;
- case GLFW_KEY_BACKSPACE: return ImGuiKey_Backspace;
- case GLFW_KEY_SPACE: return ImGuiKey_Space;
- case GLFW_KEY_ENTER: return ImGuiKey_Enter;
- case GLFW_KEY_ESCAPE: return ImGuiKey_Escape;
- case GLFW_KEY_APOSTROPHE: return ImGuiKey_Apostrophe;
- case GLFW_KEY_COMMA: return ImGuiKey_Comma;
- case GLFW_KEY_MINUS: return ImGuiKey_Minus;
- case GLFW_KEY_PERIOD: return ImGuiKey_Period;
- case GLFW_KEY_SLASH: return ImGuiKey_Slash;
- case GLFW_KEY_SEMICOLON: return ImGuiKey_Semicolon;
- case GLFW_KEY_EQUAL: return ImGuiKey_Equal;
- case GLFW_KEY_LEFT_BRACKET: return ImGuiKey_LeftBracket;
- case GLFW_KEY_BACKSLASH: return ImGuiKey_Backslash;
- case GLFW_KEY_RIGHT_BRACKET: return ImGuiKey_RightBracket;
- case GLFW_KEY_GRAVE_ACCENT: return ImGuiKey_GraveAccent;
- case GLFW_KEY_CAPS_LOCK: return ImGuiKey_CapsLock;
- case GLFW_KEY_SCROLL_LOCK: return ImGuiKey_ScrollLock;
- case GLFW_KEY_NUM_LOCK: return ImGuiKey_NumLock;
- case GLFW_KEY_PRINT_SCREEN: return ImGuiKey_PrintScreen;
- case GLFW_KEY_PAUSE: return ImGuiKey_Pause;
- case GLFW_KEY_KP_0: return ImGuiKey_Keypad0;
- case GLFW_KEY_KP_1: return ImGuiKey_Keypad1;
- case GLFW_KEY_KP_2: return ImGuiKey_Keypad2;
- case GLFW_KEY_KP_3: return ImGuiKey_Keypad3;
- case GLFW_KEY_KP_4: return ImGuiKey_Keypad4;
- case GLFW_KEY_KP_5: return ImGuiKey_Keypad5;
- case GLFW_KEY_KP_6: return ImGuiKey_Keypad6;
- case GLFW_KEY_KP_7: return ImGuiKey_Keypad7;
- case GLFW_KEY_KP_8: return ImGuiKey_Keypad8;
- case GLFW_KEY_KP_9: return ImGuiKey_Keypad9;
- case GLFW_KEY_KP_DECIMAL: return ImGuiKey_KeypadDecimal;
- case GLFW_KEY_KP_DIVIDE: return ImGuiKey_KeypadDivide;
- case GLFW_KEY_KP_MULTIPLY: return ImGuiKey_KeypadMultiply;
- case GLFW_KEY_KP_SUBTRACT: return ImGuiKey_KeypadSubtract;
- case GLFW_KEY_KP_ADD: return ImGuiKey_KeypadAdd;
- case GLFW_KEY_KP_ENTER: return ImGuiKey_KeypadEnter;
- case GLFW_KEY_KP_EQUAL: return ImGuiKey_KeypadEqual;
- case GLFW_KEY_LEFT_SHIFT: return ImGuiKey_LeftShift;
- case GLFW_KEY_LEFT_CONTROL: return ImGuiKey_LeftCtrl;
- case GLFW_KEY_LEFT_ALT: return ImGuiKey_LeftAlt;
- case GLFW_KEY_LEFT_SUPER: return ImGuiKey_LeftSuper;
- case GLFW_KEY_RIGHT_SHIFT: return ImGuiKey_RightShift;
- case GLFW_KEY_RIGHT_CONTROL: return ImGuiKey_RightCtrl;
- case GLFW_KEY_RIGHT_ALT: return ImGuiKey_RightAlt;
- case GLFW_KEY_RIGHT_SUPER: return ImGuiKey_RightSuper;
- case GLFW_KEY_MENU: return ImGuiKey_Menu;
- case GLFW_KEY_0: return ImGuiKey_0;
- case GLFW_KEY_1: return ImGuiKey_1;
- case GLFW_KEY_2: return ImGuiKey_2;
- case GLFW_KEY_3: return ImGuiKey_3;
- case GLFW_KEY_4: return ImGuiKey_4;
- case GLFW_KEY_5: return ImGuiKey_5;
- case GLFW_KEY_6: return ImGuiKey_6;
- case GLFW_KEY_7: return ImGuiKey_7;
- case GLFW_KEY_8: return ImGuiKey_8;
- case GLFW_KEY_9: return ImGuiKey_9;
- case GLFW_KEY_A: return ImGuiKey_A;
- case GLFW_KEY_B: return ImGuiKey_B;
- case GLFW_KEY_C: return ImGuiKey_C;
- case GLFW_KEY_D: return ImGuiKey_D;
- case GLFW_KEY_E: return ImGuiKey_E;
- case GLFW_KEY_F: return ImGuiKey_F;
- case GLFW_KEY_G: return ImGuiKey_G;
- case GLFW_KEY_H: return ImGuiKey_H;
- case GLFW_KEY_I: return ImGuiKey_I;
- case GLFW_KEY_J: return ImGuiKey_J;
- case GLFW_KEY_K: return ImGuiKey_K;
- case GLFW_KEY_L: return ImGuiKey_L;
- case GLFW_KEY_M: return ImGuiKey_M;
- case GLFW_KEY_N: return ImGuiKey_N;
- case GLFW_KEY_O: return ImGuiKey_O;
- case GLFW_KEY_P: return ImGuiKey_P;
- case GLFW_KEY_Q: return ImGuiKey_Q;
- case GLFW_KEY_R: return ImGuiKey_R;
- case GLFW_KEY_S: return ImGuiKey_S;
- case GLFW_KEY_T: return ImGuiKey_T;
- case GLFW_KEY_U: return ImGuiKey_U;
- case GLFW_KEY_V: return ImGuiKey_V;
- case GLFW_KEY_W: return ImGuiKey_W;
- case GLFW_KEY_X: return ImGuiKey_X;
- case GLFW_KEY_Y: return ImGuiKey_Y;
- case GLFW_KEY_Z: return ImGuiKey_Z;
- case GLFW_KEY_F1: return ImGuiKey_F1;
- case GLFW_KEY_F2: return ImGuiKey_F2;
- case GLFW_KEY_F3: return ImGuiKey_F3;
- case GLFW_KEY_F4: return ImGuiKey_F4;
- case GLFW_KEY_F5: return ImGuiKey_F5;
- case GLFW_KEY_F6: return ImGuiKey_F6;
- case GLFW_KEY_F7: return ImGuiKey_F7;
- case GLFW_KEY_F8: return ImGuiKey_F8;
- case GLFW_KEY_F9: return ImGuiKey_F9;
- case GLFW_KEY_F10: return ImGuiKey_F10;
- case GLFW_KEY_F11: return ImGuiKey_F11;
- case GLFW_KEY_F12: return ImGuiKey_F12;
- default: return ImGuiKey_None;
- }
-}
-
-static void ImGui_ImplGlfw_UpdateKeyModifiers(int mods)
-{
- ImGuiIO& io = ImGui::GetIO();
- io.AddKeyEvent(ImGuiKey_ModCtrl, (mods & GLFW_MOD_CONTROL) != 0);
- io.AddKeyEvent(ImGuiKey_ModShift, (mods & GLFW_MOD_SHIFT) != 0);
- io.AddKeyEvent(ImGuiKey_ModAlt, (mods & GLFW_MOD_ALT) != 0);
- io.AddKeyEvent(ImGuiKey_ModSuper, (mods & GLFW_MOD_SUPER) != 0);
-}
-
-void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackMousebutton != NULL && window == bd->Window)
- bd->PrevUserCallbackMousebutton(window, button, action, mods);
-
- ImGui_ImplGlfw_UpdateKeyModifiers(mods);
-
- ImGuiIO& io = ImGui::GetIO();
- if (button >= 0 && button < ImGuiMouseButton_COUNT)
- io.AddMouseButtonEvent(button, action == GLFW_PRESS);
-}
-
-void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackScroll != NULL && window == bd->Window)
- bd->PrevUserCallbackScroll(window, xoffset, yoffset);
-
- ImGuiIO& io = ImGui::GetIO();
- io.AddMouseWheelEvent((float)xoffset, (float)yoffset);
-}
-
-static int ImGui_ImplGlfw_TranslateUntranslatedKey(int key, int scancode)
-{
-#if GLFW_HAS_GET_KEY_NAME && !defined(__EMSCRIPTEN__)
- // GLFW 3.1+ attempts to "untranslate" keys, which goes the opposite of what every other framework does, making using lettered shortcuts difficult.
- // (It had reasons to do so: namely GLFW is/was more likely to be used for WASD-type game controls rather than lettered shortcuts, but IHMO the 3.1 change could have been done differently)
- // See https://github.com/glfw/glfw/issues/1502 for details.
- // Adding a workaround to undo this (so our keys are translated->untranslated->translated, likely a lossy process).
- // This won't cover edge cases but this is at least going to cover common cases.
- if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_EQUAL)
- return key;
- const char* key_name = glfwGetKeyName(key, scancode);
- if (key_name && key_name[0] != 0 && key_name[1] == 0)
- {
- const char char_names[] = "`-=[]\\,;\'./";
- const int char_keys[] = { GLFW_KEY_GRAVE_ACCENT, GLFW_KEY_MINUS, GLFW_KEY_EQUAL, GLFW_KEY_LEFT_BRACKET, GLFW_KEY_RIGHT_BRACKET, GLFW_KEY_BACKSLASH, GLFW_KEY_COMMA, GLFW_KEY_SEMICOLON, GLFW_KEY_APOSTROPHE, GLFW_KEY_PERIOD, GLFW_KEY_SLASH, 0 };
- IM_ASSERT(IM_ARRAYSIZE(char_names) == IM_ARRAYSIZE(char_keys));
- if (key_name[0] >= '0' && key_name[0] <= '9') { key = GLFW_KEY_0 + (key_name[0] - '0'); }
- else if (key_name[0] >= 'A' && key_name[0] <= 'Z') { key = GLFW_KEY_A + (key_name[0] - 'A'); }
- else if (const char* p = strchr(char_names, key_name[0])) { key = char_keys[p - char_names]; }
- }
- // if (action == GLFW_PRESS) printf("key %d scancode %d name '%s'\n", key, scancode, key_name);
-#else
- IM_UNUSED(scancode);
-#endif
- return key;
-}
-
-void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int keycode, int scancode, int action, int mods)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackKey != NULL && window == bd->Window)
- bd->PrevUserCallbackKey(window, keycode, scancode, action, mods);
-
- if (action != GLFW_PRESS && action != GLFW_RELEASE)
- return;
-
- ImGui_ImplGlfw_UpdateKeyModifiers(mods);
-
- keycode = ImGui_ImplGlfw_TranslateUntranslatedKey(keycode, scancode);
-
- ImGuiIO& io = ImGui::GetIO();
- ImGuiKey imgui_key = ImGui_ImplGlfw_KeyToImGuiKey(keycode);
- io.AddKeyEvent(imgui_key, (action == GLFW_PRESS));
- io.SetKeyEventNativeData(imgui_key, keycode, scancode); // To support legacy indexing (<1.87 user code)
-}
-
-void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackWindowFocus != NULL && window == bd->Window)
- bd->PrevUserCallbackWindowFocus(window, focused);
-
- ImGuiIO& io = ImGui::GetIO();
- io.AddFocusEvent(focused != 0);
-}
-
-void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackCursorPos != NULL && window == bd->Window)
- bd->PrevUserCallbackCursorPos(window, x, y);
-
- ImGuiIO& io = ImGui::GetIO();
- io.AddMousePosEvent((float)x, (float)y);
- bd->LastValidMousePos = ImVec2((float)x, (float)y);
-}
-
-// Workaround: X11 seems to send spurious Leave/Enter events which would make us lose our position,
-// so we back it up and restore on Leave/Enter (see https://github.com/ocornut/imgui/issues/4984)
-void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackCursorEnter != NULL && window == bd->Window)
- bd->PrevUserCallbackCursorEnter(window, entered);
-
- ImGuiIO& io = ImGui::GetIO();
- if (entered)
- {
- bd->MouseWindow = window;
- io.AddMousePosEvent(bd->LastValidMousePos.x, bd->LastValidMousePos.y);
- }
- else if (!entered && bd->MouseWindow == window)
- {
- bd->LastValidMousePos = io.MousePos;
- bd->MouseWindow = NULL;
- io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
- }
-}
-
-void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if (bd->PrevUserCallbackChar != NULL && window == bd->Window)
- bd->PrevUserCallbackChar(window, c);
-
- ImGuiIO& io = ImGui::GetIO();
- io.AddInputCharacter(c);
-}
-
-void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor*, int)
-{
- // Unused in 'master' branch but 'docking' branch will use this, so we declare it ahead of it so if you have to install callbacks you can install this one too.
-}
-
-void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- IM_ASSERT(bd->InstalledCallbacks == false && "Callbacks already installed!");
- IM_ASSERT(bd->Window == window);
-
- bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback);
- bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback);
- bd->PrevUserCallbackCursorPos = glfwSetCursorPosCallback(window, ImGui_ImplGlfw_CursorPosCallback);
- bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback);
- bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback);
- bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback);
- bd->PrevUserCallbackChar = glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
- bd->PrevUserCallbackMonitor = glfwSetMonitorCallback(ImGui_ImplGlfw_MonitorCallback);
- bd->InstalledCallbacks = true;
-}
-
-void ImGui_ImplGlfw_RestoreCallbacks(GLFWwindow* window)
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- IM_ASSERT(bd->InstalledCallbacks == true && "Callbacks not installed!");
- IM_ASSERT(bd->Window == window);
-
- glfwSetWindowFocusCallback(window, bd->PrevUserCallbackWindowFocus);
- glfwSetCursorEnterCallback(window, bd->PrevUserCallbackCursorEnter);
- glfwSetCursorPosCallback(window, bd->PrevUserCallbackCursorPos);
- glfwSetMouseButtonCallback(window, bd->PrevUserCallbackMousebutton);
- glfwSetScrollCallback(window, bd->PrevUserCallbackScroll);
- glfwSetKeyCallback(window, bd->PrevUserCallbackKey);
- glfwSetCharCallback(window, bd->PrevUserCallbackChar);
- glfwSetMonitorCallback(bd->PrevUserCallbackMonitor);
- bd->InstalledCallbacks = false;
- bd->PrevUserCallbackWindowFocus = NULL;
- bd->PrevUserCallbackCursorEnter = NULL;
- bd->PrevUserCallbackCursorPos = NULL;
- bd->PrevUserCallbackMousebutton = NULL;
- bd->PrevUserCallbackScroll = NULL;
- bd->PrevUserCallbackKey = NULL;
- bd->PrevUserCallbackChar = NULL;
- bd->PrevUserCallbackMonitor = NULL;
-}
-
-static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, GlfwClientApi client_api)
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
-
- // Setup backend capabilities flags
- ImGui_ImplGlfw_Data* bd = IM_NEW(ImGui_ImplGlfw_Data)();
- io.BackendPlatformUserData = (void*)bd;
- io.BackendPlatformName = "imgui_impl_glfw";
- io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
- io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
-
- bd->Window = window;
- bd->Time = 0.0;
-
- io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
- io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
- io.ClipboardUserData = bd->Window;
-
- // Set platform dependent data in viewport
-#if defined(_WIN32)
- ImGui::GetMainViewport()->PlatformHandleRaw = (void*)glfwGetWin32Window(bd->Window);
-#endif
-
- // Create mouse cursors
- // (By design, on X11 cursors are user configurable and some cursors may be missing. When a cursor doesn't exist,
- // GLFW will emit an error which will often be printed by the app, so we temporarily disable error reporting.
- // Missing cursors will return NULL and our _UpdateMouseCursor() function will use the Arrow cursor instead.)
- GLFWerrorfun prev_error_callback = glfwSetErrorCallback(NULL);
- bd->MouseCursors[ImGuiMouseCursor_Arrow] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_TextInput] = glfwCreateStandardCursor(GLFW_IBEAM_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = glfwCreateStandardCursor(GLFW_VRESIZE_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_Hand] = glfwCreateStandardCursor(GLFW_HAND_CURSOR);
-#if GLFW_HAS_NEW_CURSORS
- bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_RESIZE_ALL_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_RESIZE_NESW_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_RESIZE_NWSE_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_NOT_ALLOWED_CURSOR);
-#else
- bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
- bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
-#endif
- glfwSetErrorCallback(prev_error_callback);
-
- // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
- if (install_callbacks)
- ImGui_ImplGlfw_InstallCallbacks(window);
-
- bd->ClientApi = client_api;
- return true;
-}
-
-bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks)
-{
- return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_OpenGL);
-}
-
-bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks)
-{
- return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Vulkan);
-}
-
-bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks)
-{
- return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Unknown);
-}
-
-void ImGui_ImplGlfw_Shutdown()
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- IM_ASSERT(bd != NULL && "No platform backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- if (bd->InstalledCallbacks)
- ImGui_ImplGlfw_RestoreCallbacks(bd->Window);
-
- for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++)
- glfwDestroyCursor(bd->MouseCursors[cursor_n]);
-
- io.BackendPlatformName = NULL;
- io.BackendPlatformUserData = NULL;
- IM_DELETE(bd);
-}
-
-static void ImGui_ImplGlfw_UpdateMouseData()
-{
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- ImGuiIO& io = ImGui::GetIO();
-
-#ifdef __EMSCRIPTEN__
- const bool is_app_focused = true;
-#else
- const bool is_app_focused = glfwGetWindowAttrib(bd->Window, GLFW_FOCUSED) != 0;
-#endif
- if (is_app_focused)
- {
- // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user)
- if (io.WantSetMousePos)
- glfwSetCursorPos(bd->Window, (double)io.MousePos.x, (double)io.MousePos.y);
-
- // (Optional) Fallback to provide mouse position when focused (ImGui_ImplGlfw_CursorPosCallback already provides this when hovered or captured)
- if (is_app_focused && bd->MouseWindow == NULL)
- {
- double mouse_x, mouse_y;
- glfwGetCursorPos(bd->Window, &mouse_x, &mouse_y);
- io.AddMousePosEvent((float)mouse_x, (float)mouse_y);
- bd->LastValidMousePos = ImVec2((float)mouse_x, (float)mouse_y);
- }
- }
-}
-
-static void ImGui_ImplGlfw_UpdateMouseCursor()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- if ((io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) || glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
- return;
-
- ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
- if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor)
- {
- // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
- glfwSetInputMode(bd->Window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
- }
- else
- {
- // Show OS mouse cursor
- // FIXME-PLATFORM: Unfocused windows seems to fail changing the mouse cursor with GLFW 3.2, but 3.3 works here.
- glfwSetCursor(bd->Window, bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]);
- glfwSetInputMode(bd->Window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
- }
-}
-
-// Update gamepad inputs
-static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; }
-static void ImGui_ImplGlfw_UpdateGamepads()
-{
- ImGuiIO& io = ImGui::GetIO();
- if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
- return;
-
- io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
-#if GLFW_HAS_GAMEPAD_API
- GLFWgamepadstate gamepad;
- if (!glfwGetGamepadState(GLFW_JOYSTICK_1, &gamepad))
- return;
- #define MAP_BUTTON(KEY_NO, BUTTON_NO, _UNUSED) do { io.AddKeyEvent(KEY_NO, gamepad.buttons[BUTTON_NO] != 0); } while (0)
- #define MAP_ANALOG(KEY_NO, AXIS_NO, _UNUSED, V0, V1) do { float v = gamepad.axes[AXIS_NO]; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0)
-#else
- int axes_count = 0, buttons_count = 0;
- const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
- const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
- if (axes_count == 0 || buttons_count == 0)
- return;
- #define MAP_BUTTON(KEY_NO, _UNUSED, BUTTON_NO) do { io.AddKeyEvent(KEY_NO, (buttons_count > BUTTON_NO && buttons[BUTTON_NO] == GLFW_PRESS)); } while (0)
- #define MAP_ANALOG(KEY_NO, _UNUSED, AXIS_NO, V0, V1) do { float v = (axes_count > AXIS_NO) ? axes[AXIS_NO] : V0; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0)
-#endif
- io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
- MAP_BUTTON(ImGuiKey_GamepadStart, GLFW_GAMEPAD_BUTTON_START, 7);
- MAP_BUTTON(ImGuiKey_GamepadBack, GLFW_GAMEPAD_BUTTON_BACK, 6);
- MAP_BUTTON(ImGuiKey_GamepadFaceDown, GLFW_GAMEPAD_BUTTON_A, 0); // Xbox A, PS Cross
- MAP_BUTTON(ImGuiKey_GamepadFaceRight, GLFW_GAMEPAD_BUTTON_B, 1); // Xbox B, PS Circle
- MAP_BUTTON(ImGuiKey_GamepadFaceLeft, GLFW_GAMEPAD_BUTTON_X, 2); // Xbox X, PS Square
- MAP_BUTTON(ImGuiKey_GamepadFaceUp, GLFW_GAMEPAD_BUTTON_Y, 3); // Xbox Y, PS Triangle
- MAP_BUTTON(ImGuiKey_GamepadDpadLeft, GLFW_GAMEPAD_BUTTON_DPAD_LEFT, 13);
- MAP_BUTTON(ImGuiKey_GamepadDpadRight, GLFW_GAMEPAD_BUTTON_DPAD_RIGHT, 11);
- MAP_BUTTON(ImGuiKey_GamepadDpadUp, GLFW_GAMEPAD_BUTTON_DPAD_UP, 10);
- MAP_BUTTON(ImGuiKey_GamepadDpadDown, GLFW_GAMEPAD_BUTTON_DPAD_DOWN, 12);
- MAP_BUTTON(ImGuiKey_GamepadL1, GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, 4);
- MAP_BUTTON(ImGuiKey_GamepadR1, GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, 5);
- MAP_ANALOG(ImGuiKey_GamepadL2, GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, 4, -0.75f, +1.0f);
- MAP_ANALOG(ImGuiKey_GamepadR2, GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, 5, -0.75f, +1.0f);
- MAP_BUTTON(ImGuiKey_GamepadL3, GLFW_GAMEPAD_BUTTON_LEFT_THUMB, 8);
- MAP_BUTTON(ImGuiKey_GamepadR3, GLFW_GAMEPAD_BUTTON_RIGHT_THUMB, 9);
- MAP_ANALOG(ImGuiKey_GamepadLStickLeft, GLFW_GAMEPAD_AXIS_LEFT_X, 0, -0.25f, -1.0f);
- MAP_ANALOG(ImGuiKey_GamepadLStickRight, GLFW_GAMEPAD_AXIS_LEFT_X, 0, +0.25f, +1.0f);
- MAP_ANALOG(ImGuiKey_GamepadLStickUp, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, -0.25f, -1.0f);
- MAP_ANALOG(ImGuiKey_GamepadLStickDown, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, +0.25f, +1.0f);
- MAP_ANALOG(ImGuiKey_GamepadRStickLeft, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, -0.25f, -1.0f);
- MAP_ANALOG(ImGuiKey_GamepadRStickRight, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, +0.25f, +1.0f);
- MAP_ANALOG(ImGuiKey_GamepadRStickUp, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, -0.25f, -1.0f);
- MAP_ANALOG(ImGuiKey_GamepadRStickDown, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, +0.25f, +1.0f);
- #undef MAP_BUTTON
- #undef MAP_ANALOG
-}
-
-void ImGui_ImplGlfw_NewFrame()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplGlfw_InitForXXX()?");
-
- // Setup display size (every frame to accommodate for window resizing)
- int w, h;
- int display_w, display_h;
- glfwGetWindowSize(bd->Window, &w, &h);
- glfwGetFramebufferSize(bd->Window, &display_w, &display_h);
- io.DisplaySize = ImVec2((float)w, (float)h);
- if (w > 0 && h > 0)
- io.DisplayFramebufferScale = ImVec2((float)display_w / (float)w, (float)display_h / (float)h);
-
- // Setup time step
- double current_time = glfwGetTime();
- io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f);
- bd->Time = current_time;
-
- ImGui_ImplGlfw_UpdateMouseData();
- ImGui_ImplGlfw_UpdateMouseCursor();
-
- // Update game controllers (if enabled and available)
- ImGui_ImplGlfw_UpdateGamepads();
-}
-
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#endif
diff --git a/3rdparty/imgui/backend/imgui_impl_glfw.h b/3rdparty/imgui/backend/imgui_impl_glfw.h
deleted file mode 100644
index 58712de..0000000
--- a/3rdparty/imgui/backend/imgui_impl_glfw.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// dear imgui: Platform Backend for GLFW
-// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..)
-// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.)
-
-// Implemented features:
-// [X] Platform: Clipboard support.
-// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLFW_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
-// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
-// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange' (note: the resizing cursors requires GLFW 3.4+).
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// About GLSL version:
-// The 'glsl_version' initialization parameter defaults to "#version 150" if NULL.
-// Only override if your GL version doesn't handle this GLSL version. Keep NULL if unsure!
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-struct GLFWwindow;
-struct GLFWmonitor;
-
-IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks);
-IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks);
-IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks);
-IMGUI_IMPL_API void ImGui_ImplGlfw_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplGlfw_NewFrame();
-
-// GLFW callbacks (installer)
-// - When calling Init with 'install_callbacks=true': ImGui_ImplGlfw_InstallCallbacks() is called. GLFW callbacks will be installed for you. They will chain-call user's previously installed callbacks, if any.
-// - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call individual function yourself from your own GLFW callbacks.
-IMGUI_IMPL_API void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window);
-IMGUI_IMPL_API void ImGui_ImplGlfw_RestoreCallbacks(GLFWwindow* window);
-
-// GLFW callbacks (individual callbacks to call if you didn't install callbacks)
-IMGUI_IMPL_API void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused); // Since 1.84
-IMGUI_IMPL_API void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered); // Since 1.84
-IMGUI_IMPL_API void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y); // Since 1.87
-IMGUI_IMPL_API void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods);
-IMGUI_IMPL_API void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset);
-IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
-IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c);
-IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event);
diff --git a/3rdparty/imgui/backend/imgui_impl_metal.h b/3rdparty/imgui/backend/imgui_impl_metal.h
deleted file mode 100644
index 469516b..0000000
--- a/3rdparty/imgui/backend/imgui_impl_metal.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// dear imgui: Renderer Backend for Metal
-// This needs to be used along with a Platform Backend (e.g. OSX)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-#include "imgui.h" // IMGUI_IMPL_API
-
-//-----------------------------------------------------------------------------
-// ObjC API
-//-----------------------------------------------------------------------------
-
-#ifdef __OBJC__
-
-@class MTLRenderPassDescriptor;
-@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder;
-
-IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id<MTLDevice> device);
-IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor);
-IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
- id<MTLCommandBuffer> commandBuffer,
- id<MTLRenderCommandEncoder> commandEncoder);
-
-// Called by Init/NewFrame/Shutdown
-IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(id<MTLDevice> device);
-IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture();
-IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device);
-IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
-
-#endif
-
-//-----------------------------------------------------------------------------
-// C++ API
-//-----------------------------------------------------------------------------
-
-// Enable Metal C++ binding support with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file
-// More info about using Metal from C++: https://developer.apple.com/metal/cpp/
-
-#ifdef IMGUI_IMPL_METAL_CPP
-
-#include <Metal/Metal.hpp>
-
-#ifndef __OBJC__
-
-IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device);
-IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor);
-IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
- MTL::CommandBuffer* commandBuffer,
- MTL::RenderCommandEncoder* commandEncoder);
-
-// Called by Init/NewFrame/Shutdown
-IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(MTL::Device* device);
-IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture();
-IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device);
-IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
-
-#endif
-
-#endif
diff --git a/3rdparty/imgui/backend/imgui_impl_metal.mm b/3rdparty/imgui/backend/imgui_impl_metal.mm
deleted file mode 100644
index 358103f..0000000
--- a/3rdparty/imgui/backend/imgui_impl_metal.mm
+++ /dev/null
@@ -1,596 +0,0 @@
-// dear imgui: Renderer Backend for Metal
-// This needs to be used along with a Platform Backend (e.g. OSX)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code).
-// 2021-12-30: Metal: Added Metal C++ support. Enable with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file.
-// 2021-08-24: Metal: Fixed a crash when clipping rect larger than framebuffer is submitted. (#4464)
-// 2021-05-19: Metal: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
-// 2021-02-18: Metal: Change blending equation to preserve alpha in output buffer.
-// 2021-01-25: Metal: Fixed texture storage mode when building on Mac Catalyst.
-// 2019-05-29: Metal: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
-// 2019-04-30: Metal: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2019-02-11: Metal: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-07-05: Metal: Added new Metal backend implementation.
-
-#include "imgui.h"
-#include "imgui_impl_metal.h"
-
-#import <Metal/Metal.h>
-// #import <QuartzCore/CAMetalLayer.h> // Not supported in XCode 9.2. Maybe a macro to detect the SDK version can be used (something like #if MACOS_SDK >= 10.13 ...)
-#import <simd/simd.h>
-
-#pragma mark - Support classes
-
-// A wrapper around a MTLBuffer object that knows the last time it was reused
-@interface MetalBuffer : NSObject
-@property (nonatomic, strong) id<MTLBuffer> buffer;
-@property (nonatomic, assign) NSTimeInterval lastReuseTime;
-- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer;
-@end
-
-// An object that encapsulates the data necessary to uniquely identify a
-// render pipeline state. These are used as cache keys.
-@interface FramebufferDescriptor : NSObject<NSCopying>
-@property (nonatomic, assign) unsigned long sampleCount;
-@property (nonatomic, assign) MTLPixelFormat colorPixelFormat;
-@property (nonatomic, assign) MTLPixelFormat depthPixelFormat;
-@property (nonatomic, assign) MTLPixelFormat stencilPixelFormat;
-- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor;
-@end
-
-// A singleton that stores long-lived objects that are needed by the Metal
-// renderer backend. Stores the render pipeline state cache and the default
-// font texture, and manages the reusable buffer cache.
-@interface MetalContext : NSObject
-@property (nonatomic, strong) id<MTLDepthStencilState> depthStencilState;
-@property (nonatomic, strong) FramebufferDescriptor *framebufferDescriptor; // framebuffer descriptor for current frame; transient
-@property (nonatomic, strong) NSMutableDictionary *renderPipelineStateCache; // pipeline cache; keyed on framebuffer descriptors
-@property (nonatomic, strong, nullable) id<MTLTexture> fontTexture;
-@property (nonatomic, strong) NSMutableArray<MetalBuffer *> *bufferCache;
-@property (nonatomic, assign) NSTimeInterval lastBufferCachePurge;
-- (void)makeDeviceObjectsWithDevice:(id<MTLDevice>)device;
-- (void)makeFontTextureWithDevice:(id<MTLDevice>)device;
-- (MetalBuffer *)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device;
-- (void)enqueueReusableBuffer:(MetalBuffer *)buffer;
-- (id<MTLRenderPipelineState>)renderPipelineStateForFrameAndDevice:(id<MTLDevice>)device;
-- (void)emptyRenderPipelineStateCache;
-- (void)setupRenderState:(ImDrawData *)drawData
- commandBuffer:(id<MTLCommandBuffer>)commandBuffer
- commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
- renderPipelineState:(id<MTLRenderPipelineState>)renderPipelineState
- vertexBuffer:(MetalBuffer *)vertexBuffer
- vertexBufferOffset:(size_t)vertexBufferOffset;
-- (void)renderDrawData:(ImDrawData *)drawData
- commandBuffer:(id<MTLCommandBuffer>)commandBuffer
- commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder;
-@end
-
-static MetalContext *g_sharedMetalContext = nil;
-
-#ifdef IMGUI_IMPL_METAL_CPP
-
-#pragma mark - Dear ImGui Metal C++ Backend API
-
-bool ImGui_ImplMetal_Init(MTL::Device* device)
-{
- return ImGui_ImplMetal_Init((id<MTLDevice>)(device));
-}
-
-void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor)
-{
- ImGui_ImplMetal_NewFrame((MTLRenderPassDescriptor*)(renderPassDescriptor));
-}
-
-void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
- MTL::CommandBuffer* commandBuffer,
- MTL::RenderCommandEncoder* commandEncoder)
-{
- ImGui_ImplMetal_RenderDrawData(draw_data,
- (id<MTLCommandBuffer>)(commandBuffer),
- (id<MTLRenderCommandEncoder>)(commandEncoder));
-
-}
-
-bool ImGui_ImplMetal_CreateFontsTexture(MTL::Device* device)
-{
- return ImGui_ImplMetal_CreateFontsTexture((id<MTLDevice>)(device));
-}
-
-bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device)
-{
- return ImGui_ImplMetal_CreateDeviceObjects((id<MTLDevice>)(device));
-}
-
-#endif // #ifdef IMGUI_IMPL_METAL_CPP
-
-#pragma mark - Dear ImGui Metal Backend API
-
-bool ImGui_ImplMetal_Init(id<MTLDevice> device)
-{
- ImGuiIO& io = ImGui::GetIO();
- io.BackendRendererName = "imgui_impl_metal";
- io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- g_sharedMetalContext = [[MetalContext alloc] init];
- });
-
- ImGui_ImplMetal_CreateDeviceObjects(device);
-
- return true;
-}
-
-void ImGui_ImplMetal_Shutdown()
-{
- ImGui_ImplMetal_DestroyDeviceObjects();
-}
-
-void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor *renderPassDescriptor)
-{
- IM_ASSERT(g_sharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?");
-
- g_sharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor];
-}
-
-// Metal Render function.
-void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, id<MTLCommandBuffer> commandBuffer, id<MTLRenderCommandEncoder> commandEncoder)
-{
- [g_sharedMetalContext renderDrawData:draw_data commandBuffer:commandBuffer commandEncoder:commandEncoder];
-}
-
-bool ImGui_ImplMetal_CreateFontsTexture(id<MTLDevice> device)
-{
- [g_sharedMetalContext makeFontTextureWithDevice:device];
-
- ImGuiIO& io = ImGui::GetIO();
- io.Fonts->SetTexID((__bridge void *)g_sharedMetalContext.fontTexture); // ImTextureID == void*
-
- return (g_sharedMetalContext.fontTexture != nil);
-}
-
-void ImGui_ImplMetal_DestroyFontsTexture()
-{
- ImGuiIO& io = ImGui::GetIO();
- g_sharedMetalContext.fontTexture = nil;
- io.Fonts->SetTexID(nullptr);
-}
-
-bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device)
-{
- [g_sharedMetalContext makeDeviceObjectsWithDevice:device];
-
- ImGui_ImplMetal_CreateFontsTexture(device);
-
- return true;
-}
-
-void ImGui_ImplMetal_DestroyDeviceObjects()
-{
- ImGui_ImplMetal_DestroyFontsTexture();
- [g_sharedMetalContext emptyRenderPipelineStateCache];
-}
-
-#pragma mark - MetalBuffer implementation
-
-@implementation MetalBuffer
-- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer
-{
- if ((self = [super init]))
- {
- _buffer = buffer;
- _lastReuseTime = [NSDate date].timeIntervalSince1970;
- }
- return self;
-}
-@end
-
-#pragma mark - FramebufferDescriptor implementation
-
-@implementation FramebufferDescriptor
-- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor *)renderPassDescriptor
-{
- if ((self = [super init]))
- {
- _sampleCount = renderPassDescriptor.colorAttachments[0].texture.sampleCount;
- _colorPixelFormat = renderPassDescriptor.colorAttachments[0].texture.pixelFormat;
- _depthPixelFormat = renderPassDescriptor.depthAttachment.texture.pixelFormat;
- _stencilPixelFormat = renderPassDescriptor.stencilAttachment.texture.pixelFormat;
- }
- return self;
-}
-
-- (nonnull id)copyWithZone:(nullable NSZone *)zone
-{
- FramebufferDescriptor *copy = [[FramebufferDescriptor allocWithZone:zone] init];
- copy.sampleCount = self.sampleCount;
- copy.colorPixelFormat = self.colorPixelFormat;
- copy.depthPixelFormat = self.depthPixelFormat;
- copy.stencilPixelFormat = self.stencilPixelFormat;
- return copy;
-}
-
-- (NSUInteger)hash
-{
- NSUInteger sc = _sampleCount & 0x3;
- NSUInteger cf = _colorPixelFormat & 0x3FF;
- NSUInteger df = _depthPixelFormat & 0x3FF;
- NSUInteger sf = _stencilPixelFormat & 0x3FF;
- NSUInteger hash = (sf << 22) | (df << 12) | (cf << 2) | sc;
- return hash;
-}
-
-- (BOOL)isEqual:(id)object
-{
- FramebufferDescriptor *other = object;
- if (![other isKindOfClass:[FramebufferDescriptor class]])
- return NO;
- return other.sampleCount == self.sampleCount &&
- other.colorPixelFormat == self.colorPixelFormat &&
- other.depthPixelFormat == self.depthPixelFormat &&
- other.stencilPixelFormat == self.stencilPixelFormat;
-}
-
-@end
-
-#pragma mark - MetalContext implementation
-
-@implementation MetalContext
-- (instancetype)init {
- if ((self = [super init]))
- {
- _renderPipelineStateCache = [NSMutableDictionary dictionary];
- _bufferCache = [NSMutableArray array];
- _lastBufferCachePurge = [NSDate date].timeIntervalSince1970;
- }
- return self;
-}
-
-- (void)makeDeviceObjectsWithDevice:(id<MTLDevice>)device
-{
- MTLDepthStencilDescriptor *depthStencilDescriptor = [[MTLDepthStencilDescriptor alloc] init];
- depthStencilDescriptor.depthWriteEnabled = NO;
- depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways;
- self.depthStencilState = [device newDepthStencilStateWithDescriptor:depthStencilDescriptor];
-}
-
-// We are retrieving and uploading the font atlas as a 4-channels RGBA texture here.
-// In theory we could call GetTexDataAsAlpha8() and upload a 1-channel texture to save on memory access bandwidth.
-// However, using a shader designed for 1-channel texture would make it less obvious to use the ImTextureID facility to render users own textures.
-// You can make that change in your implementation.
-- (void)makeFontTextureWithDevice:(id<MTLDevice>)device
-{
- ImGuiIO &io = ImGui::GetIO();
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
- MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
- width:(NSUInteger)width
- height:(NSUInteger)height
- mipmapped:NO];
- textureDescriptor.usage = MTLTextureUsageShaderRead;
-#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
- textureDescriptor.storageMode = MTLStorageModeManaged;
-#else
- textureDescriptor.storageMode = MTLStorageModeShared;
-#endif
- id <MTLTexture> texture = [device newTextureWithDescriptor:textureDescriptor];
- [texture replaceRegion:MTLRegionMake2D(0, 0, (NSUInteger)width, (NSUInteger)height) mipmapLevel:0 withBytes:pixels bytesPerRow:(NSUInteger)width * 4];
- self.fontTexture = texture;
-}
-
-- (MetalBuffer *)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device
-{
- NSTimeInterval now = [NSDate date].timeIntervalSince1970;
-
- // Purge old buffers that haven't been useful for a while
- if (now - self.lastBufferCachePurge > 1.0)
- {
- NSMutableArray *survivors = [NSMutableArray array];
- for (MetalBuffer *candidate in self.bufferCache)
- {
- if (candidate.lastReuseTime > self.lastBufferCachePurge)
- {
- [survivors addObject:candidate];
- }
- }
- self.bufferCache = [survivors mutableCopy];
- self.lastBufferCachePurge = now;
- }
-
- // See if we have a buffer we can reuse
- MetalBuffer *bestCandidate = nil;
- for (MetalBuffer *candidate in self.bufferCache)
- if (candidate.buffer.length >= length && (bestCandidate == nil || bestCandidate.lastReuseTime > candidate.lastReuseTime))
- bestCandidate = candidate;
-
- if (bestCandidate != nil)
- {
- [self.bufferCache removeObject:bestCandidate];
- bestCandidate.lastReuseTime = now;
- return bestCandidate;
- }
-
- // No luck; make a new buffer
- id<MTLBuffer> backing = [device newBufferWithLength:length options:MTLResourceStorageModeShared];
- return [[MetalBuffer alloc] initWithBuffer:backing];
-}
-
-- (void)enqueueReusableBuffer:(MetalBuffer *)buffer
-{
- [self.bufferCache addObject:buffer];
-}
-
-- (_Nullable id<MTLRenderPipelineState>)renderPipelineStateForFrameAndDevice:(id<MTLDevice>)device
-{
- // Try to retrieve a render pipeline state that is compatible with the framebuffer config for this frame
- // The hit rate for this cache should be very near 100%.
- id<MTLRenderPipelineState> renderPipelineState = self.renderPipelineStateCache[self.framebufferDescriptor];
-
- if (renderPipelineState == nil)
- {
- // No luck; make a new render pipeline state
- renderPipelineState = [self _renderPipelineStateForFramebufferDescriptor:self.framebufferDescriptor device:device];
- // Cache render pipeline state for later reuse
- self.renderPipelineStateCache[self.framebufferDescriptor] = renderPipelineState;
- }
-
- return renderPipelineState;
-}
-
-- (id<MTLRenderPipelineState>)_renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor *)descriptor device:(id<MTLDevice>)device
-{
- NSError *error = nil;
-
- NSString *shaderSource = @""
- "#include <metal_stdlib>\n"
- "using namespace metal;\n"
- "\n"
- "struct Uniforms {\n"
- " float4x4 projectionMatrix;\n"
- "};\n"
- "\n"
- "struct VertexIn {\n"
- " float2 position [[attribute(0)]];\n"
- " float2 texCoords [[attribute(1)]];\n"
- " uchar4 color [[attribute(2)]];\n"
- "};\n"
- "\n"
- "struct VertexOut {\n"
- " float4 position [[position]];\n"
- " float2 texCoords;\n"
- " float4 color;\n"
- "};\n"
- "\n"
- "vertex VertexOut vertex_main(VertexIn in [[stage_in]],\n"
- " constant Uniforms &uniforms [[buffer(1)]]) {\n"
- " VertexOut out;\n"
- " out.position = uniforms.projectionMatrix * float4(in.position, 0, 1);\n"
- " out.texCoords = in.texCoords;\n"
- " out.color = float4(in.color) / float4(255.0);\n"
- " return out;\n"
- "}\n"
- "\n"
- "fragment half4 fragment_main(VertexOut in [[stage_in]],\n"
- " texture2d<half, access::sample> texture [[texture(0)]]) {\n"
- " constexpr sampler linearSampler(coord::normalized, min_filter::linear, mag_filter::linear, mip_filter::linear);\n"
- " half4 texColor = texture.sample(linearSampler, in.texCoords);\n"
- " return half4(in.color) * texColor;\n"
- "}\n";
-
- id<MTLLibrary> library = [device newLibraryWithSource:shaderSource options:nil error:&error];
- if (library == nil)
- {
- NSLog(@"Error: failed to create Metal library: %@", error);
- return nil;
- }
-
- id<MTLFunction> vertexFunction = [library newFunctionWithName:@"vertex_main"];
- id<MTLFunction> fragmentFunction = [library newFunctionWithName:@"fragment_main"];
-
- if (vertexFunction == nil || fragmentFunction == nil)
- {
- NSLog(@"Error: failed to find Metal shader functions in library: %@", error);
- return nil;
- }
-
- MTLVertexDescriptor *vertexDescriptor = [MTLVertexDescriptor vertexDescriptor];
- vertexDescriptor.attributes[0].offset = IM_OFFSETOF(ImDrawVert, pos);
- vertexDescriptor.attributes[0].format = MTLVertexFormatFloat2; // position
- vertexDescriptor.attributes[0].bufferIndex = 0;
- vertexDescriptor.attributes[1].offset = IM_OFFSETOF(ImDrawVert, uv);
- vertexDescriptor.attributes[1].format = MTLVertexFormatFloat2; // texCoords
- vertexDescriptor.attributes[1].bufferIndex = 0;
- vertexDescriptor.attributes[2].offset = IM_OFFSETOF(ImDrawVert, col);
- vertexDescriptor.attributes[2].format = MTLVertexFormatUChar4; // color
- vertexDescriptor.attributes[2].bufferIndex = 0;
- vertexDescriptor.layouts[0].stepRate = 1;
- vertexDescriptor.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
- vertexDescriptor.layouts[0].stride = sizeof(ImDrawVert);
-
- MTLRenderPipelineDescriptor *pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
- pipelineDescriptor.vertexFunction = vertexFunction;
- pipelineDescriptor.fragmentFunction = fragmentFunction;
- pipelineDescriptor.vertexDescriptor = vertexDescriptor;
- pipelineDescriptor.sampleCount = self.framebufferDescriptor.sampleCount;
- pipelineDescriptor.colorAttachments[0].pixelFormat = self.framebufferDescriptor.colorPixelFormat;
- pipelineDescriptor.colorAttachments[0].blendingEnabled = YES;
- pipelineDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd;
- pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
- pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
- pipelineDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperationAdd;
- pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorOne;
- pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
- pipelineDescriptor.depthAttachmentPixelFormat = self.framebufferDescriptor.depthPixelFormat;
- pipelineDescriptor.stencilAttachmentPixelFormat = self.framebufferDescriptor.stencilPixelFormat;
-
- id<MTLRenderPipelineState> renderPipelineState = [device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error];
- if (error != nil)
- {
- NSLog(@"Error: failed to create Metal pipeline state: %@", error);
- }
-
- return renderPipelineState;
-}
-
-- (void)emptyRenderPipelineStateCache
-{
- [self.renderPipelineStateCache removeAllObjects];
-}
-
-- (void)setupRenderState:(ImDrawData *)drawData
- commandBuffer:(id<MTLCommandBuffer>)commandBuffer
- commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
- renderPipelineState:(id<MTLRenderPipelineState>)renderPipelineState
- vertexBuffer:(MetalBuffer *)vertexBuffer
- vertexBufferOffset:(size_t)vertexBufferOffset
-{
- [commandEncoder setCullMode:MTLCullModeNone];
- [commandEncoder setDepthStencilState:g_sharedMetalContext.depthStencilState];
-
- // Setup viewport, orthographic projection matrix
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to
- // draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
- MTLViewport viewport =
- {
- .originX = 0.0,
- .originY = 0.0,
- .width = (double)(drawData->DisplaySize.x * drawData->FramebufferScale.x),
- .height = (double)(drawData->DisplaySize.y * drawData->FramebufferScale.y),
- .znear = 0.0,
- .zfar = 1.0
- };
- [commandEncoder setViewport:viewport];
-
- float L = drawData->DisplayPos.x;
- float R = drawData->DisplayPos.x + drawData->DisplaySize.x;
- float T = drawData->DisplayPos.y;
- float B = drawData->DisplayPos.y + drawData->DisplaySize.y;
- float N = (float)viewport.znear;
- float F = (float)viewport.zfar;
- const float ortho_projection[4][4] =
- {
- { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
- { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
- { 0.0f, 0.0f, 1/(F-N), 0.0f },
- { (R+L)/(L-R), (T+B)/(B-T), N/(F-N), 1.0f },
- };
- [commandEncoder setVertexBytes:&ortho_projection length:sizeof(ortho_projection) atIndex:1];
-
- [commandEncoder setRenderPipelineState:renderPipelineState];
-
- [commandEncoder setVertexBuffer:vertexBuffer.buffer offset:0 atIndex:0];
- [commandEncoder setVertexBufferOffset:vertexBufferOffset atIndex:0];
-}
-
-- (void)renderDrawData:(ImDrawData *)drawData
- commandBuffer:(id<MTLCommandBuffer>)commandBuffer
- commandEncoder:(id<MTLRenderCommandEncoder>)commandEncoder
-{
- // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
- int fb_width = (int)(drawData->DisplaySize.x * drawData->FramebufferScale.x);
- int fb_height = (int)(drawData->DisplaySize.y * drawData->FramebufferScale.y);
- if (fb_width <= 0 || fb_height <= 0 || drawData->CmdListsCount == 0)
- return;
-
- id<MTLRenderPipelineState> renderPipelineState = [self renderPipelineStateForFrameAndDevice:commandBuffer.device];
-
- size_t vertexBufferLength = (size_t)drawData->TotalVtxCount * sizeof(ImDrawVert);
- size_t indexBufferLength = (size_t)drawData->TotalIdxCount * sizeof(ImDrawIdx);
- MetalBuffer* vertexBuffer = [self dequeueReusableBufferOfLength:vertexBufferLength device:commandBuffer.device];
- MetalBuffer* indexBuffer = [self dequeueReusableBufferOfLength:indexBufferLength device:commandBuffer.device];
-
- [self setupRenderState:drawData commandBuffer:commandBuffer commandEncoder:commandEncoder renderPipelineState:renderPipelineState vertexBuffer:vertexBuffer vertexBufferOffset:0];
-
- // Will project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_off = drawData->DisplayPos; // (0,0) unless using multi-viewports
- ImVec2 clip_scale = drawData->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
-
- // Render command lists
- size_t vertexBufferOffset = 0;
- size_t indexBufferOffset = 0;
- for (int n = 0; n < drawData->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = drawData->CmdLists[n];
-
- memcpy((char *)vertexBuffer.buffer.contents + vertexBufferOffset, cmd_list->VtxBuffer.Data, (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
- memcpy((char *)indexBuffer.buffer.contents + indexBufferOffset, cmd_list->IdxBuffer.Data, (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
-
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- [self setupRenderState:drawData commandBuffer:commandBuffer commandEncoder:commandEncoder renderPipelineState:renderPipelineState vertexBuffer:vertexBuffer vertexBufferOffset:vertexBufferOffset];
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
- ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
-
- // Clamp to viewport as setScissorRect() won't accept values that are off bounds
- if (clip_min.x < 0.0f) { clip_min.x = 0.0f; }
- if (clip_min.y < 0.0f) { clip_min.y = 0.0f; }
- if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; }
- if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; }
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
- if (pcmd->ElemCount == 0) // drawIndexedPrimitives() validation doesn't accept this
- continue;
-
- // Apply scissor/clipping rectangle
- MTLScissorRect scissorRect =
- {
- .x = NSUInteger(clip_min.x),
- .y = NSUInteger(clip_min.y),
- .width = NSUInteger(clip_max.x - clip_min.x),
- .height = NSUInteger(clip_max.y - clip_min.y)
- };
- [commandEncoder setScissorRect:scissorRect];
-
- // Bind texture, Draw
- if (ImTextureID tex_id = pcmd->GetTexID())
- [commandEncoder setFragmentTexture:(__bridge id<MTLTexture>)(tex_id) atIndex:0];
-
- [commandEncoder setVertexBufferOffset:(vertexBufferOffset + pcmd->VtxOffset * sizeof(ImDrawVert)) atIndex:0];
- [commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
- indexCount:pcmd->ElemCount
- indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32
- indexBuffer:indexBuffer.buffer
- indexBufferOffset:indexBufferOffset + pcmd->IdxOffset * sizeof(ImDrawIdx)];
- }
- }
-
- vertexBufferOffset += (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert);
- indexBufferOffset += (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx);
- }
-
- __weak id weakSelf = self;
- [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer>)
- {
- dispatch_async(dispatch_get_main_queue(), ^{
- [weakSelf enqueueReusableBuffer:vertexBuffer];
- [weakSelf enqueueReusableBuffer:indexBuffer];
- });
- }];
-}
-
-@end
diff --git a/3rdparty/imgui/backend/imgui_impl_opengl2.cpp b/3rdparty/imgui/backend/imgui_impl_opengl2.cpp
deleted file mode 100644
index 17a6fae..0000000
--- a/3rdparty/imgui/backend/imgui_impl_opengl2.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline)
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**
-// **Prefer using the code in imgui_impl_opengl3.cpp**
-// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.
-// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more
-// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might
-// confuse your GPU driver.
-// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API.
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2021-12-08: OpenGL: Fixed mishandling of the the ImDrawCmd::IdxOffset field! This is an old bug but it never had an effect until some internal rendering changes in 1.86.
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
-// 2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODEL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications.
-// 2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications.
-// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications.
-// 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples.
-// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
-// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplOpenGL2_RenderDrawData() in the .h file so you can call it yourself.
-// 2017-09-01: OpenGL: Save and restore current polygon mode.
-// 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal).
-// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
-
-#include "imgui.h"
-#include "imgui_impl_opengl2.h"
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
-#include <stdint.h> // intptr_t
-#endif
-
-// Include OpenGL header (without an OpenGL loader) requires a bit of fiddling
-#if defined(_WIN32) && !defined(APIENTRY)
-#define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY.
-#endif
-#if defined(_WIN32) && !defined(WINGDIAPI)
-#define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this
-#endif
-#if defined(__APPLE__)
-#define GL_SILENCE_DEPRECATION
-#include <OpenGL/gl.h>
-#else
-#include <GL/gl.h>
-#endif
-
-struct ImGui_ImplOpenGL2_Data
-{
- GLuint FontTexture;
-
- ImGui_ImplOpenGL2_Data() { memset(this, 0, sizeof(*this)); }
-};
-
-// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-static ImGui_ImplOpenGL2_Data* ImGui_ImplOpenGL2_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL2_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
-}
-
-// Functions
-bool ImGui_ImplOpenGL2_Init()
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
-
- // Setup backend capabilities flags
- ImGui_ImplOpenGL2_Data* bd = IM_NEW(ImGui_ImplOpenGL2_Data)();
- io.BackendRendererUserData = (void*)bd;
- io.BackendRendererName = "imgui_impl_opengl2";
-
- return true;
-}
-
-void ImGui_ImplOpenGL2_Shutdown()
-{
- ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
- IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- ImGui_ImplOpenGL2_DestroyDeviceObjects();
- io.BackendRendererName = NULL;
- io.BackendRendererUserData = NULL;
- IM_DELETE(bd);
-}
-
-void ImGui_ImplOpenGL2_NewFrame()
-{
- ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL2_Init()?");
-
- if (!bd->FontTexture)
- ImGui_ImplOpenGL2_CreateDeviceObjects();
-}
-
-static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height)
-{
- // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // In order to composite our output buffer we need to preserve alpha
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_STENCIL_TEST);
- glDisable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
- glEnable(GL_SCISSOR_TEST);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- glEnable(GL_TEXTURE_2D);
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glShadeModel(GL_SMOOTH);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
- // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!),
- // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below.
- // (DO NOT MODIFY THIS FILE! Add the code in your calling function)
- // GLint last_program;
- // glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
- // glUseProgram(0);
- // ImGui_ImplOpenGL2_RenderDrawData(...);
- // glUseProgram(last_program)
- // There are potentially many more states you could need to clear/setup that we can't access from default headers.
- // e.g. glBindBuffer(GL_ARRAY_BUFFER, 0), glDisable(GL_TEXTURE_CUBE_MAP).
-
- // Setup viewport, orthographic projection matrix
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
- glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
-}
-
-// OpenGL2 Render function.
-// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly.
-// This is in order to be able to run within an OpenGL engine that doesn't do so.
-void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data)
-{
- // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
- int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
- int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
- if (fb_width == 0 || fb_height == 0)
- return;
-
- // Backup GL state
- GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
- GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
- GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
- GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
- GLint last_shade_model; glGetIntegerv(GL_SHADE_MODEL, &last_shade_model);
- GLint last_tex_env_mode; glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_tex_env_mode);
- glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
-
- // Setup desired GL state
- ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
-
- // Will project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
- ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
-
- // Render command lists
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data;
- const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data;
- glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)));
- glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)));
- glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)));
-
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height);
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
- ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
-
- // Apply scissor/clipping rectangle (Y is inverted in OpenGL)
- glScissor((int)clip_min.x, (int)(fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y));
-
- // Bind texture, Draw
- glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID());
- glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset);
- }
- }
- }
-
- // Restore modified GL state
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
- glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture);
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glPopAttrib();
- glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]);
- glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
- glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
- glShadeModel(last_shade_model);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_tex_env_mode);
-}
-
-bool ImGui_ImplOpenGL2_CreateFontsTexture()
-{
- // Build texture atlas
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
-
- // Upload texture to graphics system
- GLint last_texture;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
- glGenTextures(1, &bd->FontTexture);
- glBindTexture(GL_TEXTURE_2D, bd->FontTexture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-
- // Store our identifier
- io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
-
- // Restore state
- glBindTexture(GL_TEXTURE_2D, last_texture);
-
- return true;
-}
-
-void ImGui_ImplOpenGL2_DestroyFontsTexture()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData();
- if (bd->FontTexture)
- {
- glDeleteTextures(1, &bd->FontTexture);
- io.Fonts->SetTexID(0);
- bd->FontTexture = 0;
- }
-}
-
-bool ImGui_ImplOpenGL2_CreateDeviceObjects()
-{
- return ImGui_ImplOpenGL2_CreateFontsTexture();
-}
-
-void ImGui_ImplOpenGL2_DestroyDeviceObjects()
-{
- ImGui_ImplOpenGL2_DestroyFontsTexture();
-}
diff --git a/3rdparty/imgui/backend/imgui_impl_opengl2.h b/3rdparty/imgui/backend/imgui_impl_opengl2.h
deleted file mode 100644
index d00d27f..0000000
--- a/3rdparty/imgui/backend/imgui_impl_opengl2.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline)
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)**
-// **Prefer using the code in imgui_impl_opengl3.cpp**
-// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read.
-// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more
-// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might
-// confuse your GPU driver.
-// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API.
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init();
-IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame();
-IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data);
-
-// Called by Init/NewFrame/Shutdown
-IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture();
-IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture();
-IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects();
-IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects();
diff --git a/3rdparty/imgui/backend/imgui_impl_opengl3.cpp b/3rdparty/imgui/backend/imgui_impl_opengl3.cpp
deleted file mode 100644
index 0d3489c..0000000
--- a/3rdparty/imgui/backend/imgui_impl_opengl3.cpp
+++ /dev/null
@@ -1,811 +0,0 @@
-// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
-// - Desktop GL: 2.x 3.x 4.x
-// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
-// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2021-12-15: OpenGL: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers.
-// 2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions.
-// 2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader.
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-06-25: OpenGL: Use OES_vertex_array extension on Emscripten + backup/restore current state.
-// 2021-06-21: OpenGL: Destroy individual vertex/fragment shader objects right after they are linked into the main shader.
-// 2021-05-24: OpenGL: Access GL_CLIP_ORIGIN when "GL_ARB_clip_control" extension is detected, inside of just OpenGL 4.5 version.
-// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
-// 2021-04-06: OpenGL: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5 or greater.
-// 2021-02-18: OpenGL: Change blending equation to preserve alpha in output buffer.
-// 2021-01-03: OpenGL: Backup, setup and restore GL_STENCIL_TEST state.
-// 2020-10-23: OpenGL: Backup, setup and restore GL_PRIMITIVE_RESTART state.
-// 2020-10-15: OpenGL: Use glGetString(GL_VERSION) instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x)
-// 2020-09-17: OpenGL: Fix to avoid compiling/calling glBindSampler() on ES or pre 3.3 context which have the defines set by a loader.
-// 2020-07-10: OpenGL: Added support for glad2 OpenGL loader.
-// 2020-05-08: OpenGL: Made default GLSL version 150 (instead of 130) on OSX.
-// 2020-04-21: OpenGL: Fixed handling of glClipControl(GL_UPPER_LEFT) by inverting projection matrix.
-// 2020-04-12: OpenGL: Fixed context version check mistakenly testing for 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset.
-// 2020-03-24: OpenGL: Added support for glbinding 2.x OpenGL loader.
-// 2020-01-07: OpenGL: Added support for glbinding 3.x OpenGL loader.
-// 2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders.
-// 2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility.
-// 2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call.
-// 2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
-// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop.
-// 2019-03-15: OpenGL: Added a GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early.
-// 2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0).
-// 2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader.
-// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
-// 2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450).
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-11-13: OpenGL: Support for GL 4.5's glClipControl(GL_UPPER_LEFT) / GL_CLIP_ORIGIN.
-// 2018-08-29: OpenGL: Added support for more OpenGL loaders: glew and glad, with comments indicative that any loader can be used.
-// 2018-08-09: OpenGL: Default to OpenGL ES 3 on iOS and Android. GLSL version default to "#version 300 ES".
-// 2018-07-30: OpenGL: Support for GLSL 300 ES and 410 core. Fixes for Emscripten compilation.
-// 2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link.
-// 2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples.
-// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
-// 2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state.
-// 2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a NULL pointer.
-// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150".
-// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
-// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
-// 2018-01-07: OpenGL: Changed GLSL shader version from 330 to 150.
-// 2017-09-01: OpenGL: Save and restore current bound sampler. Save and restore current polygon mode.
-// 2017-05-01: OpenGL: Fixed save and restore of current blend func state.
-// 2017-05-01: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE.
-// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
-// 2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752)
-
-//----------------------------------------
-// OpenGL GLSL GLSL
-// version version string
-//----------------------------------------
-// 2.0 110 "#version 110"
-// 2.1 120 "#version 120"
-// 3.0 130 "#version 130"
-// 3.1 140 "#version 140"
-// 3.2 150 "#version 150"
-// 3.3 330 "#version 330 core"
-// 4.0 400 "#version 400 core"
-// 4.1 410 "#version 410 core"
-// 4.2 420 "#version 410 core"
-// 4.3 430 "#version 430 core"
-// ES 2.0 100 "#version 100" = WebGL 1.0
-// ES 3.0 300 "#version 300 es" = WebGL 2.0
-//----------------------------------------
-
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
-#define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#include "imgui.h"
-#include "imgui_impl_opengl3.h"
-#include <stdio.h>
-#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
-#include <stddef.h> // intptr_t
-#else
-#include <stdint.h> // intptr_t
-#endif
-
-// Clang warnings with -Weverything
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast
-#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness
-#if __has_warning("-Wzero-as-null-pointer-constant")
-#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
-#endif
-#endif
-
-// GL includes
-#if defined(IMGUI_IMPL_OPENGL_ES2)
-#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV))
-#include <OpenGLES/ES2/gl.h> // Use GL ES 2
-#else
-#include <GLES2/gl2.h> // Use GL ES 2
-#endif
-#if defined(__EMSCRIPTEN__)
-#ifndef GL_GLEXT_PROTOTYPES
-#define GL_GLEXT_PROTOTYPES
-#endif
-#include <GLES2/gl2ext.h>
-#endif
-#elif defined(IMGUI_IMPL_OPENGL_ES3)
-#if defined(__APPLE__)
-#include <TargetConditionals.h>
-#endif
-#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV))
-#include <OpenGLES/ES3/gl.h> // Use GL ES 3
-#else
-#include <GLES3/gl3.h> // Use GL ES 3
-#endif
-#elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
-// Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers.
-// Helper libraries are often used for this purpose! Here we are using our own minimal custom loader based on gl3w.
-// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.).
-// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp):
-// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped
-// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases
-// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
-#define IMGL3W_IMPL
-#include "imgui_impl_opengl3_loader.h"
-#endif
-
-// Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension
-#ifndef IMGUI_IMPL_OPENGL_ES2
-#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
-#elif defined(__EMSCRIPTEN__)
-#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
-#define glBindVertexArray glBindVertexArrayOES
-#define glGenVertexArrays glGenVertexArraysOES
-#define glDeleteVertexArrays glDeleteVertexArraysOES
-#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES
-#endif
-
-// Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have.
-#ifdef GL_POLYGON_MODE
-#define IMGUI_IMPL_HAS_POLYGON_MODE
-#endif
-
-// Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have.
-#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2)
-#define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
-#endif
-
-// Desktop GL 3.3+ has glBindSampler()
-#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3)
-#define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
-#endif
-
-// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state
-#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1)
-#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
-#endif
-
-// Desktop GL use extension detection
-#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3)
-#define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
-#endif
-
-// OpenGL Data
-struct ImGui_ImplOpenGL3_Data
-{
- GLuint GlVersion; // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries (e.g. 320 for GL 3.2)
- char GlslVersionString[32]; // Specified by user or detected based on compile time GL settings.
- GLuint FontTexture;
- GLuint ShaderHandle;
- GLint AttribLocationTex; // Uniforms location
- GLint AttribLocationProjMtx;
- GLuint AttribLocationVtxPos; // Vertex attributes location
- GLuint AttribLocationVtxUV;
- GLuint AttribLocationVtxColor;
- unsigned int VboHandle, ElementsHandle;
- GLsizeiptr VertexBufferSize;
- GLsizeiptr IndexBufferSize;
- bool HasClipOrigin;
-
- ImGui_ImplOpenGL3_Data() { memset(this, 0, sizeof(*this)); }
-};
-
-// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
-}
-
-// Functions
-bool ImGui_ImplOpenGL3_Init(const char* glsl_version)
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
-
- // Initialize our loader
-#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM)
- if (imgl3wInit() != 0)
- {
- fprintf(stderr, "Failed to initialize OpenGL loader!\n");
- return false;
- }
-#endif
-
- // Setup backend capabilities flags
- ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)();
- io.BackendRendererUserData = (void*)bd;
- io.BackendRendererName = "imgui_impl_opengl3";
-
- // Query for GL version (e.g. 320 for GL 3.2)
-#if !defined(IMGUI_IMPL_OPENGL_ES2)
- GLint major = 0;
- GLint minor = 0;
- glGetIntegerv(GL_MAJOR_VERSION, &major);
- glGetIntegerv(GL_MINOR_VERSION, &minor);
- if (major == 0 && minor == 0)
- {
- // Query GL_VERSION in desktop GL 2.x, the string will start with "<major>.<minor>"
- const char* gl_version = (const char*)glGetString(GL_VERSION);
- sscanf(gl_version, "%d.%d", &major, &minor);
- }
- bd->GlVersion = (GLuint)(major * 100 + minor * 10);
-#else
- bd->GlVersion = 200; // GLES 2
-#endif
-
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
- if (bd->GlVersion >= 320)
- io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-#endif
-
- // Store GLSL version string so we can refer to it later in case we recreate shaders.
- // Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure.
- if (glsl_version == NULL)
- {
-#if defined(IMGUI_IMPL_OPENGL_ES2)
- glsl_version = "#version 100";
-#elif defined(IMGUI_IMPL_OPENGL_ES3)
- glsl_version = "#version 300 es";
-#elif defined(__APPLE__)
- glsl_version = "#version 150";
-#else
- glsl_version = "#version 130";
-#endif
- }
- IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString));
- strcpy(bd->GlslVersionString, glsl_version);
- strcat(bd->GlslVersionString, "\n");
-
- // Make an arbitrary GL call (we don't actually need the result)
- // IF YOU GET A CRASH HERE: it probably means the OpenGL function loader didn't do its job. Let us know!
- GLint current_texture;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &current_texture);
-
- // Detect extensions we support
- bd->HasClipOrigin = (bd->GlVersion >= 450);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS
- GLint num_extensions = 0;
- glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
- for (GLint i = 0; i < num_extensions; i++)
- {
- const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i);
- if (extension != NULL && strcmp(extension, "GL_ARB_clip_control") == 0)
- bd->HasClipOrigin = true;
- }
-#endif
-
- return true;
-}
-
-void ImGui_ImplOpenGL3_Shutdown()
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- ImGui_ImplOpenGL3_DestroyDeviceObjects();
- io.BackendRendererName = NULL;
- io.BackendRendererUserData = NULL;
- IM_DELETE(bd);
-}
-
-void ImGui_ImplOpenGL3_NewFrame()
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplOpenGL3_Init()?");
-
- if (!bd->ShaderHandle)
- ImGui_ImplOpenGL3_CreateDeviceObjects();
-}
-
-static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object)
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
-
- // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
- glEnable(GL_BLEND);
- glBlendEquation(GL_FUNC_ADD);
- glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_STENCIL_TEST);
- glEnable(GL_SCISSOR_TEST);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
- if (bd->GlVersion >= 310)
- glDisable(GL_PRIMITIVE_RESTART);
-#endif
-#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-#endif
-
- // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT)
-#if defined(GL_CLIP_ORIGIN)
- bool clip_origin_lower_left = true;
- if (bd->HasClipOrigin)
- {
- GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)&current_clip_origin);
- if (current_clip_origin == GL_UPPER_LEFT)
- clip_origin_lower_left = false;
- }
-#endif
-
- // Setup viewport, orthographic projection matrix
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
- glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height);
- float L = draw_data->DisplayPos.x;
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
- float T = draw_data->DisplayPos.y;
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
-#if defined(GL_CLIP_ORIGIN)
- if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left
-#endif
- const float ortho_projection[4][4] =
- {
- { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
- { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
- { 0.0f, 0.0f, -1.0f, 0.0f },
- { (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f },
- };
- glUseProgram(bd->ShaderHandle);
- glUniform1i(bd->AttribLocationTex, 0);
- glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]);
-
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
- if (bd->GlVersion >= 330)
- glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
-#endif
-
- (void)vertex_array_object;
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glBindVertexArray(vertex_array_object);
-#endif
-
- // Bind vertex/index buffers and setup attributes for ImDrawVert
- glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle);
- glEnableVertexAttribArray(bd->AttribLocationVtxPos);
- glEnableVertexAttribArray(bd->AttribLocationVtxUV);
- glEnableVertexAttribArray(bd->AttribLocationVtxColor);
- glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos));
- glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv));
- glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col));
-}
-
-// OpenGL3 Render function.
-// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly.
-// This is in order to be able to run within an OpenGL engine that doesn't do so.
-void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
-{
- // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
- int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
- int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
- if (fb_width <= 0 || fb_height <= 0)
- return;
-
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
-
- // Backup GL state
- GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture);
- glActiveTexture(GL_TEXTURE0);
- GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program);
- GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
- GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; }
-#endif
- GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer);
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object);
-#endif
-#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
- GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
-#endif
- GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
- GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
- GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
- GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
- GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
- GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
- GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
- GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
- GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
- GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
- GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
- GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST);
- GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
- GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE;
-#endif
-
- // Setup desired GL state
- // Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts)
- // The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound.
- GLuint vertex_array_object = 0;
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glGenVertexArrays(1, &vertex_array_object);
-#endif
- ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
-
- // Will project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
- ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
-
- // Render command lists
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
-
- // Upload vertex/index buffers
- GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert);
- GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx);
- if (bd->VertexBufferSize < vtx_buffer_size)
- {
- bd->VertexBufferSize = vtx_buffer_size;
- glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, NULL, GL_STREAM_DRAW);
- }
- if (bd->IndexBufferSize < idx_buffer_size)
- {
- bd->IndexBufferSize = idx_buffer_size;
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, NULL, GL_STREAM_DRAW);
- }
- glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data);
- glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data);
-
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback != NULL)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object);
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
- ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
-
- // Apply scissor/clipping rectangle (Y is inverted in OpenGL)
- glScissor((int)clip_min.x, (int)((float)fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y));
-
- // Bind texture, Draw
- glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID());
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET
- if (bd->GlVersion >= 320)
- glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset);
- else
-#endif
- glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)));
- }
- }
- }
-
- // Destroy the temporary VAO
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glDeleteVertexArrays(1, &vertex_array_object);
-#endif
-
- // Restore modified GL state
- glUseProgram(last_program);
- glBindTexture(GL_TEXTURE_2D, last_texture);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER
- if (bd->GlVersion >= 330)
- glBindSampler(0, last_sampler);
-#endif
- glActiveTexture(last_active_texture);
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glBindVertexArray(last_vertex_array_object);
-#endif
- glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
- glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
- glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
- if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
- if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
- if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
- if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST);
- if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
-#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART
- if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); }
-#endif
-
-#ifdef IMGUI_IMPL_HAS_POLYGON_MODE
- glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
-#endif
- glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
- glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
- (void)bd; // Not all compilation paths use this
-}
-
-bool ImGui_ImplOpenGL3_CreateFontsTexture()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
-
- // Build texture atlas
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
-
- // Upload texture to graphics system
- GLint last_texture;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
- glGenTextures(1, &bd->FontTexture);
- glBindTexture(GL_TEXTURE_2D, bd->FontTexture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-#ifdef GL_UNPACK_ROW_LENGTH // Not on WebGL/ES
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-#endif
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-
- // Store our identifier
- io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
-
- // Restore state
- glBindTexture(GL_TEXTURE_2D, last_texture);
-
- return true;
-}
-
-void ImGui_ImplOpenGL3_DestroyFontsTexture()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- if (bd->FontTexture)
- {
- glDeleteTextures(1, &bd->FontTexture);
- io.Fonts->SetTexID(0);
- bd->FontTexture = 0;
- }
-}
-
-// If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file.
-static bool CheckShader(GLuint handle, const char* desc)
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- GLint status = 0, log_length = 0;
- glGetShaderiv(handle, GL_COMPILE_STATUS, &status);
- glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length);
- if ((GLboolean)status == GL_FALSE)
- fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString);
- if (log_length > 1)
- {
- ImVector<char> buf;
- buf.resize((int)(log_length + 1));
- glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
- fprintf(stderr, "%s\n", buf.begin());
- }
- return (GLboolean)status == GL_TRUE;
-}
-
-// If you get an error please report on GitHub. You may try different GL context version or GLSL version.
-static bool CheckProgram(GLuint handle, const char* desc)
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- GLint status = 0, log_length = 0;
- glGetProgramiv(handle, GL_LINK_STATUS, &status);
- glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length);
- if ((GLboolean)status == GL_FALSE)
- fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString);
- if (log_length > 1)
- {
- ImVector<char> buf;
- buf.resize((int)(log_length + 1));
- glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin());
- fprintf(stderr, "%s\n", buf.begin());
- }
- return (GLboolean)status == GL_TRUE;
-}
-
-bool ImGui_ImplOpenGL3_CreateDeviceObjects()
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
-
- // Backup GL state
- GLint last_texture, last_array_buffer;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture);
- glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- GLint last_vertex_array;
- glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
-#endif
-
- // Parse GLSL version string
- int glsl_version = 130;
- sscanf(bd->GlslVersionString, "#version %d", &glsl_version);
-
- const GLchar* vertex_shader_glsl_120 =
- "uniform mat4 ProjMtx;\n"
- "attribute vec2 Position;\n"
- "attribute vec2 UV;\n"
- "attribute vec4 Color;\n"
- "varying vec2 Frag_UV;\n"
- "varying vec4 Frag_Color;\n"
- "void main()\n"
- "{\n"
- " Frag_UV = UV;\n"
- " Frag_Color = Color;\n"
- " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
- "}\n";
-
- const GLchar* vertex_shader_glsl_130 =
- "uniform mat4 ProjMtx;\n"
- "in vec2 Position;\n"
- "in vec2 UV;\n"
- "in vec4 Color;\n"
- "out vec2 Frag_UV;\n"
- "out vec4 Frag_Color;\n"
- "void main()\n"
- "{\n"
- " Frag_UV = UV;\n"
- " Frag_Color = Color;\n"
- " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
- "}\n";
-
- const GLchar* vertex_shader_glsl_300_es =
- "precision highp float;\n"
- "layout (location = 0) in vec2 Position;\n"
- "layout (location = 1) in vec2 UV;\n"
- "layout (location = 2) in vec4 Color;\n"
- "uniform mat4 ProjMtx;\n"
- "out vec2 Frag_UV;\n"
- "out vec4 Frag_Color;\n"
- "void main()\n"
- "{\n"
- " Frag_UV = UV;\n"
- " Frag_Color = Color;\n"
- " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
- "}\n";
-
- const GLchar* vertex_shader_glsl_410_core =
- "layout (location = 0) in vec2 Position;\n"
- "layout (location = 1) in vec2 UV;\n"
- "layout (location = 2) in vec4 Color;\n"
- "uniform mat4 ProjMtx;\n"
- "out vec2 Frag_UV;\n"
- "out vec4 Frag_Color;\n"
- "void main()\n"
- "{\n"
- " Frag_UV = UV;\n"
- " Frag_Color = Color;\n"
- " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
- "}\n";
-
- const GLchar* fragment_shader_glsl_120 =
- "#ifdef GL_ES\n"
- " precision mediump float;\n"
- "#endif\n"
- "uniform sampler2D Texture;\n"
- "varying vec2 Frag_UV;\n"
- "varying vec4 Frag_Color;\n"
- "void main()\n"
- "{\n"
- " gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n"
- "}\n";
-
- const GLchar* fragment_shader_glsl_130 =
- "uniform sampler2D Texture;\n"
- "in vec2 Frag_UV;\n"
- "in vec4 Frag_Color;\n"
- "out vec4 Out_Color;\n"
- "void main()\n"
- "{\n"
- " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
- "}\n";
-
- const GLchar* fragment_shader_glsl_300_es =
- "precision mediump float;\n"
- "uniform sampler2D Texture;\n"
- "in vec2 Frag_UV;\n"
- "in vec4 Frag_Color;\n"
- "layout (location = 0) out vec4 Out_Color;\n"
- "void main()\n"
- "{\n"
- " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
- "}\n";
-
- const GLchar* fragment_shader_glsl_410_core =
- "in vec2 Frag_UV;\n"
- "in vec4 Frag_Color;\n"
- "uniform sampler2D Texture;\n"
- "layout (location = 0) out vec4 Out_Color;\n"
- "void main()\n"
- "{\n"
- " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
- "}\n";
-
- // Select shaders matching our GLSL versions
- const GLchar* vertex_shader = NULL;
- const GLchar* fragment_shader = NULL;
- if (glsl_version < 130)
- {
- vertex_shader = vertex_shader_glsl_120;
- fragment_shader = fragment_shader_glsl_120;
- }
- else if (glsl_version >= 410)
- {
- vertex_shader = vertex_shader_glsl_410_core;
- fragment_shader = fragment_shader_glsl_410_core;
- }
- else if (glsl_version == 300)
- {
- vertex_shader = vertex_shader_glsl_300_es;
- fragment_shader = fragment_shader_glsl_300_es;
- }
- else
- {
- vertex_shader = vertex_shader_glsl_130;
- fragment_shader = fragment_shader_glsl_130;
- }
-
- // Create shaders
- const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader };
- GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER);
- glShaderSource(vert_handle, 2, vertex_shader_with_version, NULL);
- glCompileShader(vert_handle);
- CheckShader(vert_handle, "vertex shader");
-
- const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader };
- GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER);
- glShaderSource(frag_handle, 2, fragment_shader_with_version, NULL);
- glCompileShader(frag_handle);
- CheckShader(frag_handle, "fragment shader");
-
- // Link
- bd->ShaderHandle = glCreateProgram();
- glAttachShader(bd->ShaderHandle, vert_handle);
- glAttachShader(bd->ShaderHandle, frag_handle);
- glLinkProgram(bd->ShaderHandle);
- CheckProgram(bd->ShaderHandle, "shader program");
-
- glDetachShader(bd->ShaderHandle, vert_handle);
- glDetachShader(bd->ShaderHandle, frag_handle);
- glDeleteShader(vert_handle);
- glDeleteShader(frag_handle);
-
- bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture");
- bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx");
- bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position");
- bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV");
- bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color");
-
- // Create buffers
- glGenBuffers(1, &bd->VboHandle);
- glGenBuffers(1, &bd->ElementsHandle);
-
- ImGui_ImplOpenGL3_CreateFontsTexture();
-
- // Restore modified GL state
- glBindTexture(GL_TEXTURE_2D, last_texture);
- glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
-#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY
- glBindVertexArray(last_vertex_array);
-#endif
-
- return true;
-}
-
-void ImGui_ImplOpenGL3_DestroyDeviceObjects()
-{
- ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData();
- if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; }
- if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; }
- if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; }
- ImGui_ImplOpenGL3_DestroyFontsTexture();
-}
-
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#endif
diff --git a/3rdparty/imgui/backend/imgui_impl_opengl3.h b/3rdparty/imgui/backend/imgui_impl_opengl3.h
deleted file mode 100644
index 98c9aca..0000000
--- a/3rdparty/imgui/backend/imgui_impl_opengl3.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline
-// - Desktop GL: 2.x 3.x 4.x
-// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0)
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID!
-// [x] Renderer: Desktop GL only: Support for large meshes (64k+ vertices) with 16-bit indices.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// About GLSL version:
-// The 'glsl_version' initialization parameter should be NULL (default) or a "#version XXX" string.
-// On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es"
-// Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp.
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-// Backend API
-IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = NULL);
-IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame();
-IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data);
-
-// (Optional) Called by Init/NewFrame/Shutdown
-IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateFontsTexture();
-IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture();
-IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects();
-IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
-
-// Specific OpenGL ES versions
-//#define IMGUI_IMPL_OPENGL_ES2 // Auto-detected on Emscripten
-//#define IMGUI_IMPL_OPENGL_ES3 // Auto-detected on iOS/Android
-
-// You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line.
-#if !defined(IMGUI_IMPL_OPENGL_ES2) \
- && !defined(IMGUI_IMPL_OPENGL_ES3)
-
-// Try to detect GLES on matching platforms
-#if defined(__APPLE__)
-#include <TargetConditionals.h>
-#endif
-#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__))
-#define IMGUI_IMPL_OPENGL_ES3 // iOS, Android -> GL ES 3, "#version 300 es"
-#elif defined(__EMSCRIPTEN__)
-#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100"
-#else
-// Otherwise imgui_impl_opengl3_loader.h will be used.
-#endif
-
-#endif
diff --git a/3rdparty/imgui/backend/imgui_impl_opengl3_loader.h b/3rdparty/imgui/backend/imgui_impl_opengl3_loader.h
deleted file mode 100644
index e24760d..0000000
--- a/3rdparty/imgui/backend/imgui_impl_opengl3_loader.h
+++ /dev/null
@@ -1,757 +0,0 @@
-//-----------------------------------------------------------------------------
-// About imgui_impl_opengl3_loader.h:
-//
-// We embed our own OpenGL loader to not require user to provide their own or to have to use ours,
-// which proved to be endless problems for users.
-// Our loader is custom-generated, based on gl3w but automatically filtered to only include
-// enums/functions that we use in our imgui_impl_opengl3.cpp source file in order to be small.
-//
-// YOU SHOULD NOT NEED TO INCLUDE/USE THIS DIRECTLY. THIS IS USED BY imgui_impl_opengl3.cpp ONLY.
-// THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE.
-//
-// Regenerate with:
-// python gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt
-//
-// More info:
-// https://github.com/dearimgui/gl3w_stripped
-// https://github.com/ocornut/imgui/issues/4445
-//-----------------------------------------------------------------------------
-
-/*
- * This file was generated with gl3w_gen.py, part of imgl3w
- * (hosted at https://github.com/dearimgui/gl3w_stripped)
- *
- * This is free and unencumbered software released into the public domain.
- *
- * Anyone is free to copy, modify, publish, use, compile, sell, or
- * distribute this software, either in source code form or as a compiled
- * binary, for any purpose, commercial or non-commercial, and by any
- * means.
- *
- * In jurisdictions that recognize copyright laws, the author or authors
- * of this software dedicate any and all copyright interest in the
- * software to the public domain. We make this dedication for the benefit
- * of the public at large and to the detriment of our heirs and
- * successors. We intend this dedication to be an overt act of
- * relinquishment in perpetuity of all present and future rights to this
- * software under copyright law.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __gl3w_h_
-#define __gl3w_h_
-
-// Adapted from KHR/khrplatform.h to avoid including entire file.
-#ifndef __khrplatform_h_
-typedef float khronos_float_t;
-typedef signed char khronos_int8_t;
-typedef unsigned char khronos_uint8_t;
-typedef signed short int khronos_int16_t;
-typedef unsigned short int khronos_uint16_t;
-#ifdef _WIN64
-typedef signed long long int khronos_intptr_t;
-typedef signed long long int khronos_ssize_t;
-#else
-typedef signed long int khronos_intptr_t;
-typedef signed long int khronos_ssize_t;
-#endif
-
-#if defined(_MSC_VER) && !defined(__clang__)
-typedef signed __int64 khronos_int64_t;
-typedef unsigned __int64 khronos_uint64_t;
-#elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100)
-#include <stdint.h>
-typedef int64_t khronos_int64_t;
-typedef uint64_t khronos_uint64_t;
-#else
-typedef signed long long khronos_int64_t;
-typedef unsigned long long khronos_uint64_t;
-#endif
-#endif // __khrplatform_h_
-
-#ifndef __gl_glcorearb_h_
-#define __gl_glcorearb_h_ 1
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
-** Copyright 2013-2020 The Khronos Group Inc.
-** SPDX-License-Identifier: MIT
-**
-** This header is generated from the Khronos OpenGL / OpenGL ES XML
-** API Registry. The current version of the Registry, generator scripts
-** used to make the header, and the header can be found at
-** https://github.com/KhronosGroup/OpenGL-Registry
-*/
-#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN 1
-#endif
-#include <windows.h>
-#endif
-#ifndef APIENTRY
-#define APIENTRY
-#endif
-#ifndef APIENTRYP
-#define APIENTRYP APIENTRY *
-#endif
-#ifndef GLAPI
-#define GLAPI extern
-#endif
-/* glcorearb.h is for use with OpenGL core profile implementations.
-** It should should be placed in the same directory as gl.h and
-** included as <GL/glcorearb.h>.
-**
-** glcorearb.h includes only APIs in the latest OpenGL core profile
-** implementation together with APIs in newer ARB extensions which
-** can be supported by the core profile. It does not, and never will
-** include functionality removed from the core profile, such as
-** fixed-function vertex and fragment processing.
-**
-** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or
-** <GL/glext.h> in the same source file.
-*/
-/* Generated C header for:
- * API: gl
- * Profile: core
- * Versions considered: .*
- * Versions emitted: .*
- * Default extensions included: glcore
- * Additional extensions included: _nomatch_^
- * Extensions removed: _nomatch_^
- */
-#ifndef GL_VERSION_1_0
-typedef void GLvoid;
-typedef unsigned int GLenum;
-
-typedef khronos_float_t GLfloat;
-typedef int GLint;
-typedef int GLsizei;
-typedef unsigned int GLbitfield;
-typedef double GLdouble;
-typedef unsigned int GLuint;
-typedef unsigned char GLboolean;
-typedef khronos_uint8_t GLubyte;
-#define GL_COLOR_BUFFER_BIT 0x00004000
-#define GL_FALSE 0
-#define GL_TRUE 1
-#define GL_TRIANGLES 0x0004
-#define GL_ONE 1
-#define GL_SRC_ALPHA 0x0302
-#define GL_ONE_MINUS_SRC_ALPHA 0x0303
-#define GL_FRONT_AND_BACK 0x0408
-#define GL_POLYGON_MODE 0x0B40
-#define GL_CULL_FACE 0x0B44
-#define GL_DEPTH_TEST 0x0B71
-#define GL_STENCIL_TEST 0x0B90
-#define GL_VIEWPORT 0x0BA2
-#define GL_BLEND 0x0BE2
-#define GL_SCISSOR_BOX 0x0C10
-#define GL_SCISSOR_TEST 0x0C11
-#define GL_UNPACK_ROW_LENGTH 0x0CF2
-#define GL_PACK_ALIGNMENT 0x0D05
-#define GL_TEXTURE_2D 0x0DE1
-#define GL_UNSIGNED_BYTE 0x1401
-#define GL_UNSIGNED_SHORT 0x1403
-#define GL_UNSIGNED_INT 0x1405
-#define GL_FLOAT 0x1406
-#define GL_RGBA 0x1908
-#define GL_FILL 0x1B02
-#define GL_VERSION 0x1F02
-#define GL_EXTENSIONS 0x1F03
-#define GL_LINEAR 0x2601
-#define GL_TEXTURE_MAG_FILTER 0x2800
-#define GL_TEXTURE_MIN_FILTER 0x2801
-typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);
-typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
-typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
-typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
-typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
-typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
-typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
-typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
-typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
-typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
-typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
-typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
-GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
-GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
-GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
-GLAPI void APIENTRY glClear (GLbitfield mask);
-GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-GLAPI void APIENTRY glDisable (GLenum cap);
-GLAPI void APIENTRY glEnable (GLenum cap);
-GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
-GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
-GLAPI GLenum APIENTRY glGetError (void);
-GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data);
-GLAPI const GLubyte *APIENTRY glGetString (GLenum name);
-GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
-GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
-#endif
-#endif /* GL_VERSION_1_0 */
-#ifndef GL_VERSION_1_1
-typedef khronos_float_t GLclampf;
-typedef double GLclampd;
-#define GL_TEXTURE_BINDING_2D 0x8069
-typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
-typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
-typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
-typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
-GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
-GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
-GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
-#endif
-#endif /* GL_VERSION_1_1 */
-#ifndef GL_VERSION_1_3
-#define GL_TEXTURE0 0x84C0
-#define GL_ACTIVE_TEXTURE 0x84E0
-typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glActiveTexture (GLenum texture);
-#endif
-#endif /* GL_VERSION_1_3 */
-#ifndef GL_VERSION_1_4
-#define GL_BLEND_DST_RGB 0x80C8
-#define GL_BLEND_SRC_RGB 0x80C9
-#define GL_BLEND_DST_ALPHA 0x80CA
-#define GL_BLEND_SRC_ALPHA 0x80CB
-#define GL_FUNC_ADD 0x8006
-typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
-GLAPI void APIENTRY glBlendEquation (GLenum mode);
-#endif
-#endif /* GL_VERSION_1_4 */
-#ifndef GL_VERSION_1_5
-typedef khronos_ssize_t GLsizeiptr;
-typedef khronos_intptr_t GLintptr;
-#define GL_ARRAY_BUFFER 0x8892
-#define GL_ELEMENT_ARRAY_BUFFER 0x8893
-#define GL_ARRAY_BUFFER_BINDING 0x8894
-#define GL_STREAM_DRAW 0x88E0
-typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
-typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
-typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
-typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);
-GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
-GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
-GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
-GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
-#endif
-#endif /* GL_VERSION_1_5 */
-#ifndef GL_VERSION_2_0
-typedef char GLchar;
-typedef khronos_int16_t GLshort;
-typedef khronos_int8_t GLbyte;
-typedef khronos_uint16_t GLushort;
-#define GL_BLEND_EQUATION_RGB 0x8009
-#define GL_BLEND_EQUATION_ALPHA 0x883D
-#define GL_FRAGMENT_SHADER 0x8B30
-#define GL_VERTEX_SHADER 0x8B31
-#define GL_COMPILE_STATUS 0x8B81
-#define GL_LINK_STATUS 0x8B82
-#define GL_INFO_LOG_LENGTH 0x8B84
-#define GL_CURRENT_PROGRAM 0x8B8D
-#define GL_UPPER_LEFT 0x8CA2
-typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
-typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
-typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
-typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
-typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
-typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
-typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
-typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
-typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
-typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
-typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
-typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
-typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
-typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
-typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
-typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
-GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);
-GLAPI void APIENTRY glCompileShader (GLuint shader);
-GLAPI GLuint APIENTRY glCreateProgram (void);
-GLAPI GLuint APIENTRY glCreateShader (GLenum type);
-GLAPI void APIENTRY glDeleteProgram (GLuint program);
-GLAPI void APIENTRY glDeleteShader (GLuint shader);
-GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);
-GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);
-GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
-GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
-GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
-GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
-GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
-GLAPI void APIENTRY glLinkProgram (GLuint program);
-GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
-GLAPI void APIENTRY glUseProgram (GLuint program);
-GLAPI void APIENTRY glUniform1i (GLint location, GLint v0);
-GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
-GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
-#endif
-#endif /* GL_VERSION_2_0 */
-#ifndef GL_VERSION_3_0
-typedef khronos_uint16_t GLhalf;
-#define GL_MAJOR_VERSION 0x821B
-#define GL_MINOR_VERSION 0x821C
-#define GL_NUM_EXTENSIONS 0x821D
-#define GL_FRAMEBUFFER_SRGB 0x8DB9
-#define GL_VERTEX_ARRAY_BINDING 0x85B5
-typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
-typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
-typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
-typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
-typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
-typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index);
-GLAPI void APIENTRY glBindVertexArray (GLuint array);
-GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
-GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
-#endif
-#endif /* GL_VERSION_3_0 */
-#ifndef GL_VERSION_3_1
-#define GL_VERSION_3_1 1
-#define GL_PRIMITIVE_RESTART 0x8F9D
-#endif /* GL_VERSION_3_1 */
-#ifndef GL_VERSION_3_2
-#define GL_VERSION_3_2 1
-typedef struct __GLsync *GLsync;
-typedef khronos_uint64_t GLuint64;
-typedef khronos_int64_t GLint64;
-typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
-#endif
-#endif /* GL_VERSION_3_2 */
-#ifndef GL_VERSION_3_3
-#define GL_VERSION_3_3 1
-#define GL_SAMPLER_BINDING 0x8919
-typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
-#ifdef GL_GLEXT_PROTOTYPES
-GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);
-#endif
-#endif /* GL_VERSION_3_3 */
-#ifndef GL_VERSION_4_1
-typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);
-typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);
-#endif /* GL_VERSION_4_1 */
-#ifndef GL_VERSION_4_3
-typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
-#endif /* GL_VERSION_4_3 */
-#ifndef GL_VERSION_4_5
-#define GL_CLIP_ORIGIN 0x935C
-typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param);
-typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
-#endif /* GL_VERSION_4_5 */
-#ifndef GL_ARB_bindless_texture
-typedef khronos_uint64_t GLuint64EXT;
-#endif /* GL_ARB_bindless_texture */
-#ifndef GL_ARB_cl_event
-struct _cl_context;
-struct _cl_event;
-#endif /* GL_ARB_cl_event */
-#ifndef GL_ARB_clip_control
-#define GL_ARB_clip_control 1
-#endif /* GL_ARB_clip_control */
-#ifndef GL_ARB_debug_output
-typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
-#endif /* GL_ARB_debug_output */
-#ifndef GL_EXT_EGL_image_storage
-typedef void *GLeglImageOES;
-#endif /* GL_EXT_EGL_image_storage */
-#ifndef GL_EXT_direct_state_access
-typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params);
-typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params);
-typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params);
-typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param);
-typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param);
-#endif /* GL_EXT_direct_state_access */
-#ifndef GL_NV_draw_vulkan_image
-typedef void (APIENTRY *GLVULKANPROCNV)(void);
-#endif /* GL_NV_draw_vulkan_image */
-#ifndef GL_NV_gpu_shader5
-typedef khronos_int64_t GLint64EXT;
-#endif /* GL_NV_gpu_shader5 */
-#ifndef GL_NV_vertex_buffer_unified_memory
-typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result);
-#endif /* GL_NV_vertex_buffer_unified_memory */
-#ifdef __cplusplus
-}
-#endif
-#endif
-
-#ifndef GL3W_API
-#define GL3W_API
-#endif
-
-#ifndef __gl_h_
-#define __gl_h_
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define GL3W_OK 0
-#define GL3W_ERROR_INIT -1
-#define GL3W_ERROR_LIBRARY_OPEN -2
-#define GL3W_ERROR_OPENGL_VERSION -3
-
-typedef void (*GL3WglProc)(void);
-typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc);
-
-/* gl3w api */
-GL3W_API int imgl3wInit(void);
-GL3W_API int imgl3wInit2(GL3WGetProcAddressProc proc);
-GL3W_API int imgl3wIsSupported(int major, int minor);
-GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc);
-
-/* gl3w internal state */
-union GL3WProcs {
- GL3WglProc ptr[54];
- struct {
- PFNGLACTIVETEXTUREPROC ActiveTexture;
- PFNGLATTACHSHADERPROC AttachShader;
- PFNGLBINDBUFFERPROC BindBuffer;
- PFNGLBINDSAMPLERPROC BindSampler;
- PFNGLBINDTEXTUREPROC BindTexture;
- PFNGLBINDVERTEXARRAYPROC BindVertexArray;
- PFNGLBLENDEQUATIONPROC BlendEquation;
- PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate;
- PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
- PFNGLBUFFERDATAPROC BufferData;
- PFNGLBUFFERSUBDATAPROC BufferSubData;
- PFNGLCLEARPROC Clear;
- PFNGLCLEARCOLORPROC ClearColor;
- PFNGLCOMPILESHADERPROC CompileShader;
- PFNGLCREATEPROGRAMPROC CreateProgram;
- PFNGLCREATESHADERPROC CreateShader;
- PFNGLDELETEBUFFERSPROC DeleteBuffers;
- PFNGLDELETEPROGRAMPROC DeleteProgram;
- PFNGLDELETESHADERPROC DeleteShader;
- PFNGLDELETETEXTURESPROC DeleteTextures;
- PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays;
- PFNGLDETACHSHADERPROC DetachShader;
- PFNGLDISABLEPROC Disable;
- PFNGLDRAWELEMENTSPROC DrawElements;
- PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex;
- PFNGLENABLEPROC Enable;
- PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
- PFNGLGENBUFFERSPROC GenBuffers;
- PFNGLGENTEXTURESPROC GenTextures;
- PFNGLGENVERTEXARRAYSPROC GenVertexArrays;
- PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
- PFNGLGETERRORPROC GetError;
- PFNGLGETINTEGERVPROC GetIntegerv;
- PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
- PFNGLGETPROGRAMIVPROC GetProgramiv;
- PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
- PFNGLGETSHADERIVPROC GetShaderiv;
- PFNGLGETSTRINGPROC GetString;
- PFNGLGETSTRINGIPROC GetStringi;
- PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
- PFNGLISENABLEDPROC IsEnabled;
- PFNGLLINKPROGRAMPROC LinkProgram;
- PFNGLPIXELSTOREIPROC PixelStorei;
- PFNGLPOLYGONMODEPROC PolygonMode;
- PFNGLREADPIXELSPROC ReadPixels;
- PFNGLSCISSORPROC Scissor;
- PFNGLSHADERSOURCEPROC ShaderSource;
- PFNGLTEXIMAGE2DPROC TexImage2D;
- PFNGLTEXPARAMETERIPROC TexParameteri;
- PFNGLUNIFORM1IPROC Uniform1i;
- PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
- PFNGLUSEPROGRAMPROC UseProgram;
- PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
- PFNGLVIEWPORTPROC Viewport;
- } gl;
-};
-
-GL3W_API extern union GL3WProcs imgl3wProcs;
-
-/* OpenGL functions */
-#define glActiveTexture imgl3wProcs.gl.ActiveTexture
-#define glAttachShader imgl3wProcs.gl.AttachShader
-#define glBindBuffer imgl3wProcs.gl.BindBuffer
-#define glBindSampler imgl3wProcs.gl.BindSampler
-#define glBindTexture imgl3wProcs.gl.BindTexture
-#define glBindVertexArray imgl3wProcs.gl.BindVertexArray
-#define glBlendEquation imgl3wProcs.gl.BlendEquation
-#define glBlendEquationSeparate imgl3wProcs.gl.BlendEquationSeparate
-#define glBlendFuncSeparate imgl3wProcs.gl.BlendFuncSeparate
-#define glBufferData imgl3wProcs.gl.BufferData
-#define glBufferSubData imgl3wProcs.gl.BufferSubData
-#define glClear imgl3wProcs.gl.Clear
-#define glClearColor imgl3wProcs.gl.ClearColor
-#define glCompileShader imgl3wProcs.gl.CompileShader
-#define glCreateProgram imgl3wProcs.gl.CreateProgram
-#define glCreateShader imgl3wProcs.gl.CreateShader
-#define glDeleteBuffers imgl3wProcs.gl.DeleteBuffers
-#define glDeleteProgram imgl3wProcs.gl.DeleteProgram
-#define glDeleteShader imgl3wProcs.gl.DeleteShader
-#define glDeleteTextures imgl3wProcs.gl.DeleteTextures
-#define glDeleteVertexArrays imgl3wProcs.gl.DeleteVertexArrays
-#define glDetachShader imgl3wProcs.gl.DetachShader
-#define glDisable imgl3wProcs.gl.Disable
-#define glDrawElements imgl3wProcs.gl.DrawElements
-#define glDrawElementsBaseVertex imgl3wProcs.gl.DrawElementsBaseVertex
-#define glEnable imgl3wProcs.gl.Enable
-#define glEnableVertexAttribArray imgl3wProcs.gl.EnableVertexAttribArray
-#define glGenBuffers imgl3wProcs.gl.GenBuffers
-#define glGenTextures imgl3wProcs.gl.GenTextures
-#define glGenVertexArrays imgl3wProcs.gl.GenVertexArrays
-#define glGetAttribLocation imgl3wProcs.gl.GetAttribLocation
-#define glGetError imgl3wProcs.gl.GetError
-#define glGetIntegerv imgl3wProcs.gl.GetIntegerv
-#define glGetProgramInfoLog imgl3wProcs.gl.GetProgramInfoLog
-#define glGetProgramiv imgl3wProcs.gl.GetProgramiv
-#define glGetShaderInfoLog imgl3wProcs.gl.GetShaderInfoLog
-#define glGetShaderiv imgl3wProcs.gl.GetShaderiv
-#define glGetString imgl3wProcs.gl.GetString
-#define glGetStringi imgl3wProcs.gl.GetStringi
-#define glGetUniformLocation imgl3wProcs.gl.GetUniformLocation
-#define glIsEnabled imgl3wProcs.gl.IsEnabled
-#define glLinkProgram imgl3wProcs.gl.LinkProgram
-#define glPixelStorei imgl3wProcs.gl.PixelStorei
-#define glPolygonMode imgl3wProcs.gl.PolygonMode
-#define glReadPixels imgl3wProcs.gl.ReadPixels
-#define glScissor imgl3wProcs.gl.Scissor
-#define glShaderSource imgl3wProcs.gl.ShaderSource
-#define glTexImage2D imgl3wProcs.gl.TexImage2D
-#define glTexParameteri imgl3wProcs.gl.TexParameteri
-#define glUniform1i imgl3wProcs.gl.Uniform1i
-#define glUniformMatrix4fv imgl3wProcs.gl.UniformMatrix4fv
-#define glUseProgram imgl3wProcs.gl.UseProgram
-#define glVertexAttribPointer imgl3wProcs.gl.VertexAttribPointer
-#define glViewport imgl3wProcs.gl.Viewport
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-#ifdef IMGL3W_IMPL
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdlib.h>
-
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
-#if defined(_WIN32)
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN 1
-#endif
-#include <windows.h>
-
-static HMODULE libgl;
-typedef PROC(__stdcall* GL3WglGetProcAddr)(LPCSTR);
-static GL3WglGetProcAddr wgl_get_proc_address;
-
-static int open_libgl(void)
-{
- libgl = LoadLibraryA("opengl32.dll");
- if (!libgl)
- return GL3W_ERROR_LIBRARY_OPEN;
- wgl_get_proc_address = (GL3WglGetProcAddr)GetProcAddress(libgl, "wglGetProcAddress");
- return GL3W_OK;
-}
-
-static void close_libgl(void) { FreeLibrary(libgl); }
-static GL3WglProc get_proc(const char *proc)
-{
- GL3WglProc res;
- res = (GL3WglProc)wgl_get_proc_address(proc);
- if (!res)
- res = (GL3WglProc)GetProcAddress(libgl, proc);
- return res;
-}
-#elif defined(__APPLE__)
-#include <dlfcn.h>
-
-static void *libgl;
-static int open_libgl(void)
-{
- libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL);
- if (!libgl)
- return GL3W_ERROR_LIBRARY_OPEN;
- return GL3W_OK;
-}
-
-static void close_libgl(void) { dlclose(libgl); }
-
-static GL3WglProc get_proc(const char *proc)
-{
- GL3WglProc res;
- *(void **)(&res) = dlsym(libgl, proc);
- return res;
-}
-#else
-#include <dlfcn.h>
-
-static void *libgl;
-static GL3WglProc (*glx_get_proc_address)(const GLubyte *);
-
-static int open_libgl(void)
-{
- libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
- if (!libgl)
- return GL3W_ERROR_LIBRARY_OPEN;
- *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
- return GL3W_OK;
-}
-
-static void close_libgl(void) { dlclose(libgl); }
-
-static GL3WglProc get_proc(const char *proc)
-{
- GL3WglProc res;
- res = glx_get_proc_address((const GLubyte *)proc);
- if (!res)
- *(void **)(&res) = dlsym(libgl, proc);
- return res;
-}
-#endif
-
-static struct { int major, minor; } version;
-
-static int parse_version(void)
-{
- if (!glGetIntegerv)
- return GL3W_ERROR_INIT;
- glGetIntegerv(GL_MAJOR_VERSION, &version.major);
- glGetIntegerv(GL_MINOR_VERSION, &version.minor);
- if (version.major < 3)
- return GL3W_ERROR_OPENGL_VERSION;
- return GL3W_OK;
-}
-
-static void load_procs(GL3WGetProcAddressProc proc);
-
-int imgl3wInit(void)
-{
- int res = open_libgl();
- if (res)
- return res;
- atexit(close_libgl);
- return imgl3wInit2(get_proc);
-}
-
-int imgl3wInit2(GL3WGetProcAddressProc proc)
-{
- load_procs(proc);
- return parse_version();
-}
-
-int imgl3wIsSupported(int major, int minor)
-{
- if (major < 3)
- return 0;
- if (version.major == major)
- return version.minor >= minor;
- return version.major >= major;
-}
-
-GL3WglProc imgl3wGetProcAddress(const char *proc) { return get_proc(proc); }
-
-static const char *proc_names[] = {
- "glActiveTexture",
- "glAttachShader",
- "glBindBuffer",
- "glBindSampler",
- "glBindTexture",
- "glBindVertexArray",
- "glBlendEquation",
- "glBlendEquationSeparate",
- "glBlendFuncSeparate",
- "glBufferData",
- "glBufferSubData",
- "glClear",
- "glClearColor",
- "glCompileShader",
- "glCreateProgram",
- "glCreateShader",
- "glDeleteBuffers",
- "glDeleteProgram",
- "glDeleteShader",
- "glDeleteTextures",
- "glDeleteVertexArrays",
- "glDetachShader",
- "glDisable",
- "glDrawElements",
- "glDrawElementsBaseVertex",
- "glEnable",
- "glEnableVertexAttribArray",
- "glGenBuffers",
- "glGenTextures",
- "glGenVertexArrays",
- "glGetAttribLocation",
- "glGetError",
- "glGetIntegerv",
- "glGetProgramInfoLog",
- "glGetProgramiv",
- "glGetShaderInfoLog",
- "glGetShaderiv",
- "glGetString",
- "glGetStringi",
- "glGetUniformLocation",
- "glIsEnabled",
- "glLinkProgram",
- "glPixelStorei",
- "glPolygonMode",
- "glReadPixels",
- "glScissor",
- "glShaderSource",
- "glTexImage2D",
- "glTexParameteri",
- "glUniform1i",
- "glUniformMatrix4fv",
- "glUseProgram",
- "glVertexAttribPointer",
- "glViewport",
-};
-
-GL3W_API union GL3WProcs imgl3wProcs;
-
-static void load_procs(GL3WGetProcAddressProc proc)
-{
- size_t i;
- for (i = 0; i < ARRAY_SIZE(proc_names); i++)
- imgl3wProcs.ptr[i] = proc(proc_names[i]);
-}
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/3rdparty/imgui/backend/imgui_impl_vulkan.cpp b/3rdparty/imgui/backend/imgui_impl_vulkan.cpp
deleted file mode 100644
index dbd8b18..0000000
--- a/3rdparty/imgui/backend/imgui_impl_vulkan.cpp
+++ /dev/null
@@ -1,1506 +0,0 @@
-// dear imgui: Renderer Backend for Vulkan
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-// [!] Renderer: User texture binding. Use 'VkDescriptorSet' as ImTextureID. Read the FAQ about ImTextureID! See https://github.com/ocornut/imgui/pull/914 for discussions.
-
-// Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'.
-// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*.
-// To build this on 32-bit systems and support texture changes:
-// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in our .vcxproj files)
-// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like.
-// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!)
-// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in our batch files)
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification.
-// IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/
-
-// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app.
-// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h.
-// You will use those if you want to use this rendering backend in your engine/app.
-// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by
-// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code.
-// Read comments in imgui_impl_vulkan.h.
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2021-10-15: Vulkan: Call vkCmdSetScissor() at the end of render a full-viewport to reduce likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling vkCmdSetScissor() explicitly every frame.
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-03-22: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize.
-// 2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer.
-// 2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions().
-// 2020-11-11: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation.
-// 2020-09-07: Vulkan: Added VkPipeline parameter to ImGui_ImplVulkan_RenderDrawData (default to one passed to ImGui_ImplVulkan_Init).
-// 2020-05-04: Vulkan: Fixed crash if initial frame has no vertices.
-// 2020-04-26: Vulkan: Fixed edge case where render callbacks wouldn't be called if the ImDrawData didn't have vertices.
-// 2019-08-01: Vulkan: Added support for specifying multisample count. Set ImGui_ImplVulkan_InitInfo::MSAASamples to one of the VkSampleCountFlagBits values to use, default is non-multisampled as before.
-// 2019-05-29: Vulkan: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
-// 2019-04-30: Vulkan: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
-// 2019-04-04: *BREAKING CHANGE*: Vulkan: Added ImageCount/MinImageCount fields in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). Added ImGui_ImplVulkan_SetMinImageCount().
-// 2019-04-04: Vulkan: Added VkInstance argument to ImGui_ImplVulkanH_CreateWindow() optional helper.
-// 2019-04-04: Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like.
-// 2019-04-01: Vulkan: Support for 32-bit index buffer (#define ImDrawIdx unsigned int).
-// 2019-02-16: Vulkan: Viewport and clipping rectangles correctly using draw_data->FramebufferScale to allow retina display.
-// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
-// 2018-08-25: Vulkan: Fixed mishandled VkSurfaceCapabilitiesKHR::maxImageCount=0 case.
-// 2018-06-22: Inverted the parameters to ImGui_ImplVulkan_RenderDrawData() to be consistent with other backends.
-// 2018-06-08: Misc: Extracted imgui_impl_vulkan.cpp/.h away from the old combined GLFW+Vulkan example.
-// 2018-06-08: Vulkan: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
-// 2018-03-03: Vulkan: Various refactor, created a couple of ImGui_ImplVulkanH_XXX helper that the example can use and that viewport support will use.
-// 2018-03-01: Vulkan: Renamed ImGui_ImplVulkan_Init_Info to ImGui_ImplVulkan_InitInfo and fields to match more closely Vulkan terminology.
-// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback, ImGui_ImplVulkan_Render() calls ImGui_ImplVulkan_RenderDrawData() itself.
-// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
-// 2017-05-15: Vulkan: Fix scissor offset being negative. Fix new Vulkan validation warnings. Set required depth member for buffer image copy.
-// 2016-11-13: Vulkan: Fix validation layer warnings and errors and redeclare gl_PerVertex.
-// 2016-10-18: Vulkan: Add location decorators & change to use structs as in/out in glsl, update embedded spv (produced with glslangValidator -x). Null the released resources.
-// 2016-08-27: Vulkan: Fix Vulkan example for use when a depth buffer is active.
-
-#include "imgui_impl_vulkan.h"
-#include <stdio.h>
-
-// Visual Studio warnings
-#ifdef _MSC_VER
-#pragma warning (disable: 4127) // condition expression is constant
-#endif
-
-// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData()
-// [Please zero-clear before use!]
-struct ImGui_ImplVulkanH_FrameRenderBuffers
-{
- VkDeviceMemory VertexBufferMemory;
- VkDeviceMemory IndexBufferMemory;
- VkDeviceSize VertexBufferSize;
- VkDeviceSize IndexBufferSize;
- VkBuffer VertexBuffer;
- VkBuffer IndexBuffer;
-};
-
-// Each viewport will hold 1 ImGui_ImplVulkanH_WindowRenderBuffers
-// [Please zero-clear before use!]
-struct ImGui_ImplVulkanH_WindowRenderBuffers
-{
- uint32_t Index;
- uint32_t Count;
- ImGui_ImplVulkanH_FrameRenderBuffers* FrameRenderBuffers;
-};
-
-// Vulkan data
-struct ImGui_ImplVulkan_Data
-{
- ImGui_ImplVulkan_InitInfo VulkanInitInfo;
- VkRenderPass RenderPass;
- VkDeviceSize BufferMemoryAlignment;
- VkPipelineCreateFlags PipelineCreateFlags;
- VkDescriptorSetLayout DescriptorSetLayout;
- VkPipelineLayout PipelineLayout;
- VkPipeline Pipeline;
- uint32_t Subpass;
- VkShaderModule ShaderModuleVert;
- VkShaderModule ShaderModuleFrag;
-
- // Font data
- VkSampler FontSampler;
- VkDeviceMemory FontMemory;
- VkImage FontImage;
- VkImageView FontView;
- VkDescriptorSet FontDescriptorSet;
- VkDeviceMemory UploadBufferMemory;
- VkBuffer UploadBuffer;
-
- // Render buffers
- ImGui_ImplVulkanH_WindowRenderBuffers MainWindowRenderBuffers;
-
- ImGui_ImplVulkan_Data()
- {
- memset(this, 0, sizeof(*this));
- BufferMemoryAlignment = 256;
- }
-};
-
-// Forward Declarations
-bool ImGui_ImplVulkan_CreateDeviceObjects();
-void ImGui_ImplVulkan_DestroyDeviceObjects();
-void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator);
-void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator);
-void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator);
-void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator);
-void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
-void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator);
-
-// Vulkan prototypes for use with custom loaders
-// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h
-#ifdef VK_NO_PROTOTYPES
-static bool g_FunctionsLoaded = false;
-#else
-static bool g_FunctionsLoaded = true;
-#endif
-#ifdef VK_NO_PROTOTYPES
-#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindBufferMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindImageMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindDescriptorSets) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindIndexBuffer) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindPipeline) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindVertexBuffers) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdCopyBufferToImage) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdDrawIndexed) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdPipelineBarrier) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdPushConstants) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdSetScissor) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdSetViewport) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateBuffer) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateCommandPool) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateDescriptorSetLayout) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateFence) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateFramebuffer) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateGraphicsPipelines) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateImage) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateImageView) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreatePipelineLayout) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateRenderPass) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSampler) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSemaphore) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateShaderModule) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSwapchainKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyBuffer) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyCommandPool) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyDescriptorSetLayout) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyFence) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyFramebuffer) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyImage) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyImageView) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyPipeline) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyPipelineLayout) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyRenderPass) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySampler) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySemaphore) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyShaderModule) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySurfaceKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySwapchainKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkDeviceWaitIdle) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkFlushMappedMemoryRanges) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeCommandBuffers) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetBufferMemoryRequirements) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetImageMemoryRequirements) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceMemoryProperties) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfaceFormatsKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfacePresentModesKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetSwapchainImagesKHR) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkMapMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkUnmapMemory) \
- IMGUI_VULKAN_FUNC_MAP_MACRO(vkUpdateDescriptorSets)
-
-// Define function pointers
-#define IMGUI_VULKAN_FUNC_DEF(func) static PFN_##func func;
-IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF)
-#undef IMGUI_VULKAN_FUNC_DEF
-#endif // VK_NO_PROTOTYPES
-
-//-----------------------------------------------------------------------------
-// SHADERS
-//-----------------------------------------------------------------------------
-
-// glsl_shader.vert, compiled with:
-// # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert
-/*
-#version 450 core
-layout(location = 0) in vec2 aPos;
-layout(location = 1) in vec2 aUV;
-layout(location = 2) in vec4 aColor;
-layout(push_constant) uniform uPushConstant { vec2 uScale; vec2 uTranslate; } pc;
-
-out gl_PerVertex { vec4 gl_Position; };
-layout(location = 0) out struct { vec4 Color; vec2 UV; } Out;
-
-void main()
-{
- Out.Color = aColor;
- Out.UV = aUV;
- gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1);
-}
-*/
-static uint32_t __glsl_shader_vert_spv[] =
-{
- 0x07230203,0x00010000,0x00080001,0x0000002e,0x00000000,0x00020011,0x00000001,0x0006000b,
- 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
- 0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015,
- 0x0000001b,0x0000001c,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,
- 0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43,
- 0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f,
- 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005,
- 0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000,
- 0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00040005,0x0000001c,
- 0x736f5061,0x00000000,0x00060005,0x0000001e,0x73755075,0x6e6f4368,0x6e617473,0x00000074,
- 0x00050006,0x0000001e,0x00000000,0x61635375,0x0000656c,0x00060006,0x0000001e,0x00000001,
- 0x61725475,0x616c736e,0x00006574,0x00030005,0x00000020,0x00006370,0x00040047,0x0000000b,
- 0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015,
- 0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047,
- 0x00000019,0x00000002,0x00040047,0x0000001c,0x0000001e,0x00000000,0x00050048,0x0000001e,
- 0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023,0x00000008,
- 0x00030047,0x0000001e,0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,
- 0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,
- 0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020,
- 0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015,
- 0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020,
- 0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020,
- 0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020,
- 0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020,
- 0x00000017,0x00000003,0x00000008,0x0003001e,0x00000019,0x00000007,0x00040020,0x0000001a,
- 0x00000003,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000003,0x0004003b,0x00000014,
- 0x0000001c,0x00000001,0x0004001e,0x0000001e,0x00000008,0x00000008,0x00040020,0x0000001f,
- 0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,0x00000021,
- 0x00000009,0x00000008,0x0004002b,0x00000006,0x00000028,0x00000000,0x0004002b,0x00000006,
- 0x00000029,0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
- 0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012,
- 0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016,
- 0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018,
- 0x00000016,0x0004003d,0x00000008,0x0000001d,0x0000001c,0x00050041,0x00000021,0x00000022,
- 0x00000020,0x0000000d,0x0004003d,0x00000008,0x00000023,0x00000022,0x00050085,0x00000008,
- 0x00000024,0x0000001d,0x00000023,0x00050041,0x00000021,0x00000025,0x00000020,0x00000013,
- 0x0004003d,0x00000008,0x00000026,0x00000025,0x00050081,0x00000008,0x00000027,0x00000024,
- 0x00000026,0x00050051,0x00000006,0x0000002a,0x00000027,0x00000000,0x00050051,0x00000006,
- 0x0000002b,0x00000027,0x00000001,0x00070050,0x00000007,0x0000002c,0x0000002a,0x0000002b,
- 0x00000028,0x00000029,0x00050041,0x00000011,0x0000002d,0x0000001b,0x0000000d,0x0003003e,
- 0x0000002d,0x0000002c,0x000100fd,0x00010038
-};
-
-// glsl_shader.frag, compiled with:
-// # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag
-/*
-#version 450 core
-layout(location = 0) out vec4 fColor;
-layout(set=0, binding=0) uniform sampler2D sTexture;
-layout(location = 0) in struct { vec4 Color; vec2 UV; } In;
-void main()
-{
- fColor = In.Color * texture(sTexture, In.UV.st);
-}
-*/
-static uint32_t __glsl_shader_frag_spv[] =
-{
- 0x07230203,0x00010000,0x00080001,0x0000001e,0x00000000,0x00020011,0x00000001,0x0006000b,
- 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
- 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010,
- 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,
- 0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000,
- 0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001,
- 0x00005655,0x00030005,0x0000000d,0x00006e49,0x00050005,0x00000016,0x78655473,0x65727574,
- 0x00000000,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x0000001e,
- 0x00000000,0x00040047,0x00000016,0x00000022,0x00000000,0x00040047,0x00000016,0x00000021,
- 0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
- 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
- 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,0x00000006,
- 0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,0x00000001,
- 0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,0x00000020,
- 0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000001,
- 0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000,
- 0x00000001,0x00000000,0x0003001b,0x00000014,0x00000013,0x00040020,0x00000015,0x00000000,
- 0x00000014,0x0004003b,0x00000015,0x00000016,0x00000000,0x0004002b,0x0000000e,0x00000018,
- 0x00000001,0x00040020,0x00000019,0x00000001,0x0000000a,0x00050036,0x00000002,0x00000004,
- 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000010,0x00000011,0x0000000d,
- 0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,0x0004003d,0x00000014,0x00000017,
- 0x00000016,0x00050041,0x00000019,0x0000001a,0x0000000d,0x00000018,0x0004003d,0x0000000a,
- 0x0000001b,0x0000001a,0x00050057,0x00000007,0x0000001c,0x00000017,0x0000001b,0x00050085,
- 0x00000007,0x0000001d,0x00000012,0x0000001c,0x0003003e,0x00000009,0x0000001d,0x000100fd,
- 0x00010038
-};
-
-//-----------------------------------------------------------------------------
-// FUNCTIONS
-//-----------------------------------------------------------------------------
-
-// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-// FIXME: multi-context support is not tested and probably dysfunctional in this backend.
-static ImGui_ImplVulkan_Data* ImGui_ImplVulkan_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplVulkan_Data*)ImGui::GetIO().BackendRendererUserData : NULL;
-}
-
-static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- VkPhysicalDeviceMemoryProperties prop;
- vkGetPhysicalDeviceMemoryProperties(v->PhysicalDevice, &prop);
- for (uint32_t i = 0; i < prop.memoryTypeCount; i++)
- if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1 << i))
- return i;
- return 0xFFFFFFFF; // Unable to find memoryType
-}
-
-static void check_vk_result(VkResult err)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- if (!bd)
- return;
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- if (v->CheckVkResultFn)
- v->CheckVkResultFn(err);
-}
-
-static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- VkResult err;
- if (buffer != VK_NULL_HANDLE)
- vkDestroyBuffer(v->Device, buffer, v->Allocator);
- if (buffer_memory != VK_NULL_HANDLE)
- vkFreeMemory(v->Device, buffer_memory, v->Allocator);
-
- VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment;
- VkBufferCreateInfo buffer_info = {};
- buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- buffer_info.size = vertex_buffer_size_aligned;
- buffer_info.usage = usage;
- buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &buffer);
- check_vk_result(err);
-
- VkMemoryRequirements req;
- vkGetBufferMemoryRequirements(v->Device, buffer, &req);
- bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment;
- VkMemoryAllocateInfo alloc_info = {};
- alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- alloc_info.allocationSize = req.size;
- alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
- err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &buffer_memory);
- check_vk_result(err);
-
- err = vkBindBufferMemory(v->Device, buffer, buffer_memory, 0);
- check_vk_result(err);
- p_buffer_size = req.size;
-}
-
-static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
-
- // Bind pipeline:
- {
- vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
- }
-
- // Bind Vertex And Index Buffer:
- if (draw_data->TotalVtxCount > 0)
- {
- VkBuffer vertex_buffers[1] = { rb->VertexBuffer };
- VkDeviceSize vertex_offset[1] = { 0 };
- vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, vertex_offset);
- vkCmdBindIndexBuffer(command_buffer, rb->IndexBuffer, 0, sizeof(ImDrawIdx) == 2 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32);
- }
-
- // Setup viewport:
- {
- VkViewport viewport;
- viewport.x = 0;
- viewport.y = 0;
- viewport.width = (float)fb_width;
- viewport.height = (float)fb_height;
- viewport.minDepth = 0.0f;
- viewport.maxDepth = 1.0f;
- vkCmdSetViewport(command_buffer, 0, 1, &viewport);
- }
-
- // Setup scale and translation:
- // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
- {
- float scale[2];
- scale[0] = 2.0f / draw_data->DisplaySize.x;
- scale[1] = 2.0f / draw_data->DisplaySize.y;
- float translate[2];
- translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0];
- translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1];
- vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale);
- vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate);
- }
-}
-
-// Render function
-void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline)
-{
- // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
- int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
- int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
- if (fb_width <= 0 || fb_height <= 0)
- return;
-
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- if (pipeline == VK_NULL_HANDLE)
- pipeline = bd->Pipeline;
-
- // Allocate array to store enough vertex/index buffers
- ImGui_ImplVulkanH_WindowRenderBuffers* wrb = &bd->MainWindowRenderBuffers;
- if (wrb->FrameRenderBuffers == NULL)
- {
- wrb->Index = 0;
- wrb->Count = v->ImageCount;
- wrb->FrameRenderBuffers = (ImGui_ImplVulkanH_FrameRenderBuffers*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count);
- memset(wrb->FrameRenderBuffers, 0, sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count);
- }
- IM_ASSERT(wrb->Count == v->ImageCount);
- wrb->Index = (wrb->Index + 1) % wrb->Count;
- ImGui_ImplVulkanH_FrameRenderBuffers* rb = &wrb->FrameRenderBuffers[wrb->Index];
-
- if (draw_data->TotalVtxCount > 0)
- {
- // Create or resize the vertex/index buffers
- size_t vertex_size = draw_data->TotalVtxCount * sizeof(ImDrawVert);
- size_t index_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx);
- if (rb->VertexBuffer == VK_NULL_HANDLE || rb->VertexBufferSize < vertex_size)
- CreateOrResizeBuffer(rb->VertexBuffer, rb->VertexBufferMemory, rb->VertexBufferSize, vertex_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
- if (rb->IndexBuffer == VK_NULL_HANDLE || rb->IndexBufferSize < index_size)
- CreateOrResizeBuffer(rb->IndexBuffer, rb->IndexBufferMemory, rb->IndexBufferSize, index_size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
-
- // Upload vertex/index data into a single contiguous GPU buffer
- ImDrawVert* vtx_dst = NULL;
- ImDrawIdx* idx_dst = NULL;
- VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, rb->VertexBufferSize, 0, (void**)(&vtx_dst));
- check_vk_result(err);
- err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, rb->IndexBufferSize, 0, (void**)(&idx_dst));
- check_vk_result(err);
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
- memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
- vtx_dst += cmd_list->VtxBuffer.Size;
- idx_dst += cmd_list->IdxBuffer.Size;
- }
- VkMappedMemoryRange range[2] = {};
- range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
- range[0].memory = rb->VertexBufferMemory;
- range[0].size = VK_WHOLE_SIZE;
- range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
- range[1].memory = rb->IndexBufferMemory;
- range[1].size = VK_WHOLE_SIZE;
- err = vkFlushMappedMemoryRanges(v->Device, 2, range);
- check_vk_result(err);
- vkUnmapMemory(v->Device, rb->VertexBufferMemory);
- vkUnmapMemory(v->Device, rb->IndexBufferMemory);
- }
-
- // Setup desired Vulkan state
- ImGui_ImplVulkan_SetupRenderState(draw_data, pipeline, command_buffer, rb, fb_width, fb_height);
-
- // Will project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
- ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
-
- // Render command lists
- // (Because we merged all buffers into a single one, we maintain our own offset into them)
- int global_vtx_offset = 0;
- int global_idx_offset = 0;
- for (int n = 0; n < draw_data->CmdListsCount; n++)
- {
- const ImDrawList* cmd_list = draw_data->CmdLists[n];
- for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
- {
- const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
- if (pcmd->UserCallback != NULL)
- {
- // User callback, registered via ImDrawList::AddCallback()
- // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
- if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
- ImGui_ImplVulkan_SetupRenderState(draw_data, pipeline, command_buffer, rb, fb_width, fb_height);
- else
- pcmd->UserCallback(cmd_list, pcmd);
- }
- else
- {
- // Project scissor/clipping rectangles into framebuffer space
- ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
- ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
-
- // Clamp to viewport as vkCmdSetScissor() won't accept values that are off bounds
- if (clip_min.x < 0.0f) { clip_min.x = 0.0f; }
- if (clip_min.y < 0.0f) { clip_min.y = 0.0f; }
- if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; }
- if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; }
- if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
- continue;
-
- // Apply scissor/clipping rectangle
- VkRect2D scissor;
- scissor.offset.x = (int32_t)(clip_min.x);
- scissor.offset.y = (int32_t)(clip_min.y);
- scissor.extent.width = (uint32_t)(clip_max.x - clip_min.x);
- scissor.extent.height = (uint32_t)(clip_max.y - clip_min.y);
- vkCmdSetScissor(command_buffer, 0, 1, &scissor);
-
- // Bind DescriptorSet with font or user texture
- VkDescriptorSet desc_set[1] = { (VkDescriptorSet)pcmd->TextureId };
- if (sizeof(ImTextureID) < sizeof(ImU64))
- {
- // We don't support texture switches if ImTextureID hasn't been redefined to be 64-bit. Do a flaky check that other textures haven't been used.
- IM_ASSERT(pcmd->TextureId == (ImTextureID)bd->FontDescriptorSet);
- desc_set[0] = bd->FontDescriptorSet;
- }
- vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL);
-
- // Draw
- vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0);
- }
- }
- global_idx_offset += cmd_list->IdxBuffer.Size;
- global_vtx_offset += cmd_list->VtxBuffer.Size;
- }
-
- // Note: at this point both vkCmdSetViewport() and vkCmdSetScissor() have been called.
- // Our last values will leak into user/application rendering IF:
- // - Your app uses a pipeline with VK_DYNAMIC_STATE_VIEWPORT or VK_DYNAMIC_STATE_SCISSOR dynamic state
- // - And you forgot to call vkCmdSetViewport() and vkCmdSetScissor() yourself to explicitely set that state.
- // If you use VK_DYNAMIC_STATE_VIEWPORT or VK_DYNAMIC_STATE_SCISSOR you are responsible for setting the values before rendering.
- // In theory we should aim to backup/restore those values but I am not sure this is possible.
- // We perform a call to vkCmdSetScissor() to set back a full viewport which is likely to fix things for 99% users but technically this is not perfect. (See github #4644)
- VkRect2D scissor = { { 0, 0 }, { (uint32_t)fb_width, (uint32_t)fb_height } };
- vkCmdSetScissor(command_buffer, 0, 1, &scissor);
-}
-
-bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
-
- unsigned char* pixels;
- int width, height;
- io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
- size_t upload_size = width * height * 4 * sizeof(char);
-
- VkResult err;
-
- // Create the Image:
- {
- VkImageCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- info.imageType = VK_IMAGE_TYPE_2D;
- info.format = VK_FORMAT_R8G8B8A8_UNORM;
- info.extent.width = width;
- info.extent.height = height;
- info.extent.depth = 1;
- info.mipLevels = 1;
- info.arrayLayers = 1;
- info.samples = VK_SAMPLE_COUNT_1_BIT;
- info.tiling = VK_IMAGE_TILING_OPTIMAL;
- info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
- info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- err = vkCreateImage(v->Device, &info, v->Allocator, &bd->FontImage);
- check_vk_result(err);
- VkMemoryRequirements req;
- vkGetImageMemoryRequirements(v->Device, bd->FontImage, &req);
- VkMemoryAllocateInfo alloc_info = {};
- alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- alloc_info.allocationSize = req.size;
- alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits);
- err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->FontMemory);
- check_vk_result(err);
- err = vkBindImageMemory(v->Device, bd->FontImage, bd->FontMemory, 0);
- check_vk_result(err);
- }
-
- // Create the Image View:
- {
- VkImageViewCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- info.image = bd->FontImage;
- info.viewType = VK_IMAGE_VIEW_TYPE_2D;
- info.format = VK_FORMAT_R8G8B8A8_UNORM;
- info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- info.subresourceRange.levelCount = 1;
- info.subresourceRange.layerCount = 1;
- err = vkCreateImageView(v->Device, &info, v->Allocator, &bd->FontView);
- check_vk_result(err);
- }
-
- // Create the Descriptor Set:
- bd->FontDescriptorSet = (VkDescriptorSet)ImGui_ImplVulkan_AddTexture(bd->FontSampler, bd->FontView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
-
- // Create the Upload Buffer:
- {
- VkBufferCreateInfo buffer_info = {};
- buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- buffer_info.size = upload_size;
- buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
- buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &bd->UploadBuffer);
- check_vk_result(err);
- VkMemoryRequirements req;
- vkGetBufferMemoryRequirements(v->Device, bd->UploadBuffer, &req);
- bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment;
- VkMemoryAllocateInfo alloc_info = {};
- alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- alloc_info.allocationSize = req.size;
- alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits);
- err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->UploadBufferMemory);
- check_vk_result(err);
- err = vkBindBufferMemory(v->Device, bd->UploadBuffer, bd->UploadBufferMemory, 0);
- check_vk_result(err);
- }
-
- // Upload to Buffer:
- {
- char* map = NULL;
- err = vkMapMemory(v->Device, bd->UploadBufferMemory, 0, upload_size, 0, (void**)(&map));
- check_vk_result(err);
- memcpy(map, pixels, upload_size);
- VkMappedMemoryRange range[1] = {};
- range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
- range[0].memory = bd->UploadBufferMemory;
- range[0].size = upload_size;
- err = vkFlushMappedMemoryRanges(v->Device, 1, range);
- check_vk_result(err);
- vkUnmapMemory(v->Device, bd->UploadBufferMemory);
- }
-
- // Copy to Image:
- {
- VkImageMemoryBarrier copy_barrier[1] = {};
- copy_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- copy_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
- copy_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
- copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- copy_barrier[0].image = bd->FontImage;
- copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- copy_barrier[0].subresourceRange.levelCount = 1;
- copy_barrier[0].subresourceRange.layerCount = 1;
- vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1, copy_barrier);
-
- VkBufferImageCopy region = {};
- region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- region.imageSubresource.layerCount = 1;
- region.imageExtent.width = width;
- region.imageExtent.height = height;
- region.imageExtent.depth = 1;
- vkCmdCopyBufferToImage(command_buffer, bd->UploadBuffer, bd->FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
-
- VkImageMemoryBarrier use_barrier[1] = {};
- use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- use_barrier[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
- use_barrier[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
- use_barrier[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
- use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- use_barrier[0].image = bd->FontImage;
- use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- use_barrier[0].subresourceRange.levelCount = 1;
- use_barrier[0].subresourceRange.layerCount = 1;
- vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, NULL, 0, NULL, 1, use_barrier);
- }
-
- // Store our identifier
- io.Fonts->SetTexID((ImTextureID)bd->FontDescriptorSet);
-
- return true;
-}
-
-static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator)
-{
- // Create the shader modules
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- if (bd->ShaderModuleVert == VK_NULL_HANDLE)
- {
- VkShaderModuleCreateInfo vert_info = {};
- vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
- vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
- vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
- VkResult err = vkCreateShaderModule(device, &vert_info, allocator, &bd->ShaderModuleVert);
- check_vk_result(err);
- }
- if (bd->ShaderModuleFrag == VK_NULL_HANDLE)
- {
- VkShaderModuleCreateInfo frag_info = {};
- frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
- frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
- frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
- VkResult err = vkCreateShaderModule(device, &frag_info, allocator, &bd->ShaderModuleFrag);
- check_vk_result(err);
- }
-}
-
-static void ImGui_ImplVulkan_CreateFontSampler(VkDevice device, const VkAllocationCallbacks* allocator)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- if (bd->FontSampler)
- return;
-
- VkSamplerCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
- info.magFilter = VK_FILTER_LINEAR;
- info.minFilter = VK_FILTER_LINEAR;
- info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
- info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.minLod = -1000;
- info.maxLod = 1000;
- info.maxAnisotropy = 1.0f;
- VkResult err = vkCreateSampler(device, &info, allocator, &bd->FontSampler);
- check_vk_result(err);
-}
-
-static void ImGui_ImplVulkan_CreateDescriptorSetLayout(VkDevice device, const VkAllocationCallbacks* allocator)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- if (bd->DescriptorSetLayout)
- return;
-
- ImGui_ImplVulkan_CreateFontSampler(device, allocator);
- VkSampler sampler[1] = { bd->FontSampler };
- VkDescriptorSetLayoutBinding binding[1] = {};
- binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- binding[0].descriptorCount = 1;
- binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
- binding[0].pImmutableSamplers = sampler;
- VkDescriptorSetLayoutCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
- info.bindingCount = 1;
- info.pBindings = binding;
- VkResult err = vkCreateDescriptorSetLayout(device, &info, allocator, &bd->DescriptorSetLayout);
- check_vk_result(err);
-}
-
-static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAllocationCallbacks* allocator)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- if (bd->PipelineLayout)
- return;
-
- // Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
- ImGui_ImplVulkan_CreateDescriptorSetLayout(device, allocator);
- VkPushConstantRange push_constants[1] = {};
- push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
- push_constants[0].offset = sizeof(float) * 0;
- push_constants[0].size = sizeof(float) * 4;
- VkDescriptorSetLayout set_layout[1] = { bd->DescriptorSetLayout };
- VkPipelineLayoutCreateInfo layout_info = {};
- layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
- layout_info.setLayoutCount = 1;
- layout_info.pSetLayouts = set_layout;
- layout_info.pushConstantRangeCount = 1;
- layout_info.pPushConstantRanges = push_constants;
- VkResult err = vkCreatePipelineLayout(device, &layout_info, allocator, &bd->PipelineLayout);
- check_vk_result(err);
-}
-
-static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline, uint32_t subpass)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_CreateShaderModules(device, allocator);
-
- VkPipelineShaderStageCreateInfo stage[2] = {};
- stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
- stage[0].module = bd->ShaderModuleVert;
- stage[0].pName = "main";
- stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
- stage[1].module = bd->ShaderModuleFrag;
- stage[1].pName = "main";
-
- VkVertexInputBindingDescription binding_desc[1] = {};
- binding_desc[0].stride = sizeof(ImDrawVert);
- binding_desc[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
-
- VkVertexInputAttributeDescription attribute_desc[3] = {};
- attribute_desc[0].location = 0;
- attribute_desc[0].binding = binding_desc[0].binding;
- attribute_desc[0].format = VK_FORMAT_R32G32_SFLOAT;
- attribute_desc[0].offset = IM_OFFSETOF(ImDrawVert, pos);
- attribute_desc[1].location = 1;
- attribute_desc[1].binding = binding_desc[0].binding;
- attribute_desc[1].format = VK_FORMAT_R32G32_SFLOAT;
- attribute_desc[1].offset = IM_OFFSETOF(ImDrawVert, uv);
- attribute_desc[2].location = 2;
- attribute_desc[2].binding = binding_desc[0].binding;
- attribute_desc[2].format = VK_FORMAT_R8G8B8A8_UNORM;
- attribute_desc[2].offset = IM_OFFSETOF(ImDrawVert, col);
-
- VkPipelineVertexInputStateCreateInfo vertex_info = {};
- vertex_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
- vertex_info.vertexBindingDescriptionCount = 1;
- vertex_info.pVertexBindingDescriptions = binding_desc;
- vertex_info.vertexAttributeDescriptionCount = 3;
- vertex_info.pVertexAttributeDescriptions = attribute_desc;
-
- VkPipelineInputAssemblyStateCreateInfo ia_info = {};
- ia_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
- ia_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
-
- VkPipelineViewportStateCreateInfo viewport_info = {};
- viewport_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
- viewport_info.viewportCount = 1;
- viewport_info.scissorCount = 1;
-
- VkPipelineRasterizationStateCreateInfo raster_info = {};
- raster_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
- raster_info.polygonMode = VK_POLYGON_MODE_FILL;
- raster_info.cullMode = VK_CULL_MODE_NONE;
- raster_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
- raster_info.lineWidth = 1.0f;
-
- VkPipelineMultisampleStateCreateInfo ms_info = {};
- ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
- ms_info.rasterizationSamples = (MSAASamples != 0) ? MSAASamples : VK_SAMPLE_COUNT_1_BIT;
-
- VkPipelineColorBlendAttachmentState color_attachment[1] = {};
- color_attachment[0].blendEnable = VK_TRUE;
- color_attachment[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
- color_attachment[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
- color_attachment[0].colorBlendOp = VK_BLEND_OP_ADD;
- color_attachment[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
- color_attachment[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
- color_attachment[0].alphaBlendOp = VK_BLEND_OP_ADD;
- color_attachment[0].colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
-
- VkPipelineDepthStencilStateCreateInfo depth_info = {};
- depth_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
-
- VkPipelineColorBlendStateCreateInfo blend_info = {};
- blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
- blend_info.attachmentCount = 1;
- blend_info.pAttachments = color_attachment;
-
- VkDynamicState dynamic_states[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
- VkPipelineDynamicStateCreateInfo dynamic_state = {};
- dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
- dynamic_state.dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states);
- dynamic_state.pDynamicStates = dynamic_states;
-
- ImGui_ImplVulkan_CreatePipelineLayout(device, allocator);
-
- VkGraphicsPipelineCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
- info.flags = bd->PipelineCreateFlags;
- info.stageCount = 2;
- info.pStages = stage;
- info.pVertexInputState = &vertex_info;
- info.pInputAssemblyState = &ia_info;
- info.pViewportState = &viewport_info;
- info.pRasterizationState = &raster_info;
- info.pMultisampleState = &ms_info;
- info.pDepthStencilState = &depth_info;
- info.pColorBlendState = &blend_info;
- info.pDynamicState = &dynamic_state;
- info.layout = bd->PipelineLayout;
- info.renderPass = renderPass;
- info.subpass = subpass;
- VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline);
- check_vk_result(err);
-}
-
-bool ImGui_ImplVulkan_CreateDeviceObjects()
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- VkResult err;
-
- if (!bd->FontSampler)
- {
- VkSamplerCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
- info.magFilter = VK_FILTER_LINEAR;
- info.minFilter = VK_FILTER_LINEAR;
- info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
- info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
- info.minLod = -1000;
- info.maxLod = 1000;
- info.maxAnisotropy = 1.0f;
- err = vkCreateSampler(v->Device, &info, v->Allocator, &bd->FontSampler);
- check_vk_result(err);
- }
-
- if (!bd->DescriptorSetLayout)
- {
- VkSampler sampler[1] = {bd->FontSampler};
- VkDescriptorSetLayoutBinding binding[1] = {};
- binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- binding[0].descriptorCount = 1;
- binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
- binding[0].pImmutableSamplers = sampler;
- VkDescriptorSetLayoutCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
- info.bindingCount = 1;
- info.pBindings = binding;
- err = vkCreateDescriptorSetLayout(v->Device, &info, v->Allocator, &bd->DescriptorSetLayout);
- check_vk_result(err);
- }
-
- if (!bd->PipelineLayout)
- {
- // Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
- VkPushConstantRange push_constants[1] = {};
- push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
- push_constants[0].offset = sizeof(float) * 0;
- push_constants[0].size = sizeof(float) * 4;
- VkDescriptorSetLayout set_layout[1] = { bd->DescriptorSetLayout };
- VkPipelineLayoutCreateInfo layout_info = {};
- layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
- layout_info.setLayoutCount = 1;
- layout_info.pSetLayouts = set_layout;
- layout_info.pushConstantRangeCount = 1;
- layout_info.pPushConstantRanges = push_constants;
- err = vkCreatePipelineLayout(v->Device, &layout_info, v->Allocator, &bd->PipelineLayout);
- check_vk_result(err);
- }
-
- ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, bd->RenderPass, v->MSAASamples, &bd->Pipeline, bd->Subpass);
-
- return true;
-}
-
-void ImGui_ImplVulkan_DestroyFontUploadObjects()
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- if (bd->UploadBuffer)
- {
- vkDestroyBuffer(v->Device, bd->UploadBuffer, v->Allocator);
- bd->UploadBuffer = VK_NULL_HANDLE;
- }
- if (bd->UploadBufferMemory)
- {
- vkFreeMemory(v->Device, bd->UploadBufferMemory, v->Allocator);
- bd->UploadBufferMemory = VK_NULL_HANDLE;
- }
-}
-
-void ImGui_ImplVulkan_DestroyDeviceObjects()
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator);
- ImGui_ImplVulkan_DestroyFontUploadObjects();
-
- if (bd->ShaderModuleVert) { vkDestroyShaderModule(v->Device, bd->ShaderModuleVert, v->Allocator); bd->ShaderModuleVert = VK_NULL_HANDLE; }
- if (bd->ShaderModuleFrag) { vkDestroyShaderModule(v->Device, bd->ShaderModuleFrag, v->Allocator); bd->ShaderModuleFrag = VK_NULL_HANDLE; }
- if (bd->FontView) { vkDestroyImageView(v->Device, bd->FontView, v->Allocator); bd->FontView = VK_NULL_HANDLE; }
- if (bd->FontImage) { vkDestroyImage(v->Device, bd->FontImage, v->Allocator); bd->FontImage = VK_NULL_HANDLE; }
- if (bd->FontMemory) { vkFreeMemory(v->Device, bd->FontMemory, v->Allocator); bd->FontMemory = VK_NULL_HANDLE; }
- if (bd->FontSampler) { vkDestroySampler(v->Device, bd->FontSampler, v->Allocator); bd->FontSampler = VK_NULL_HANDLE; }
- if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; }
- if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; }
- if (bd->Pipeline) { vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator); bd->Pipeline = VK_NULL_HANDLE; }
-}
-
-bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data)
-{
- // Load function pointers
- // You can use the default Vulkan loader using:
- // ImGui_ImplVulkan_LoadFunctions([](const char* function_name, void*) { return vkGetInstanceProcAddr(your_vk_isntance, function_name); });
- // But this would be equivalent to not setting VK_NO_PROTOTYPES.
-#ifdef VK_NO_PROTOTYPES
-#define IMGUI_VULKAN_FUNC_LOAD(func) \
- func = reinterpret_cast<decltype(func)>(loader_func(#func, user_data)); \
- if (func == NULL) \
- return false;
- IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_LOAD)
-#undef IMGUI_VULKAN_FUNC_LOAD
-#else
- IM_UNUSED(loader_func);
- IM_UNUSED(user_data);
-#endif
- g_FunctionsLoaded = true;
- return true;
-}
-
-bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass)
-{
- IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
-
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendRendererUserData == NULL && "Already initialized a renderer backend!");
-
- // Setup backend capabilities flags
- ImGui_ImplVulkan_Data* bd = IM_NEW(ImGui_ImplVulkan_Data)();
- io.BackendRendererUserData = (void*)bd;
- io.BackendRendererName = "imgui_impl_vulkan";
- io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-
- IM_ASSERT(info->Instance != VK_NULL_HANDLE);
- IM_ASSERT(info->PhysicalDevice != VK_NULL_HANDLE);
- IM_ASSERT(info->Device != VK_NULL_HANDLE);
- IM_ASSERT(info->Queue != VK_NULL_HANDLE);
- IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE);
- IM_ASSERT(info->MinImageCount >= 2);
- IM_ASSERT(info->ImageCount >= info->MinImageCount);
- IM_ASSERT(render_pass != VK_NULL_HANDLE);
-
- bd->VulkanInitInfo = *info;
- bd->RenderPass = render_pass;
- bd->Subpass = info->Subpass;
-
- ImGui_ImplVulkan_CreateDeviceObjects();
-
- return true;
-}
-
-void ImGui_ImplVulkan_Shutdown()
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- IM_ASSERT(bd != NULL && "No renderer backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- ImGui_ImplVulkan_DestroyDeviceObjects();
- io.BackendRendererName = NULL;
- io.BackendRendererUserData = NULL;
- IM_DELETE(bd);
-}
-
-void ImGui_ImplVulkan_NewFrame()
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplVulkan_Init()?");
- IM_UNUSED(bd);
-}
-
-void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- IM_ASSERT(min_image_count >= 2);
- if (bd->VulkanInitInfo.MinImageCount == min_image_count)
- return;
-
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
- VkResult err = vkDeviceWaitIdle(v->Device);
- check_vk_result(err);
- ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator);
- bd->VulkanInitInfo.MinImageCount = min_image_count;
-}
-
-// Register a texture
-// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions.
-VkDescriptorSet ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout)
-{
- ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
- ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
-
- // Create Descriptor Set:
- VkDescriptorSet descriptor_set;
- {
- VkDescriptorSetAllocateInfo alloc_info = {};
- alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
- alloc_info.descriptorPool = v->DescriptorPool;
- alloc_info.descriptorSetCount = 1;
- alloc_info.pSetLayouts = &bd->DescriptorSetLayout;
- VkResult err = vkAllocateDescriptorSets(v->Device, &alloc_info, &descriptor_set);
- check_vk_result(err);
- }
-
- // Update the Descriptor Set:
- {
- VkDescriptorImageInfo desc_image[1] = {};
- desc_image[0].sampler = sampler;
- desc_image[0].imageView = image_view;
- desc_image[0].imageLayout = image_layout;
- VkWriteDescriptorSet write_desc[1] = {};
- write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- write_desc[0].dstSet = descriptor_set;
- write_desc[0].descriptorCount = 1;
- write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- write_desc[0].pImageInfo = desc_image;
- vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, NULL);
- }
- return descriptor_set;
-}
-
-//-------------------------------------------------------------------------
-// Internal / Miscellaneous Vulkan Helpers
-// (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own app.)
-//-------------------------------------------------------------------------
-// You probably do NOT need to use or care about those functions.
-// Those functions only exist because:
-// 1) they facilitate the readability and maintenance of the multiple main.cpp examples files.
-// 2) the upcoming multi-viewport feature will need them internally.
-// Generally we avoid exposing any kind of superfluous high-level helpers in the backends,
-// but it is too much code to duplicate everywhere so we exceptionally expose them.
-//
-// Your engine/app will likely _already_ have code to setup all that stuff (swap chain, render pass, frame buffers, etc.).
-// You may read this code to learn about Vulkan, but it is recommended you use you own custom tailored code to do equivalent work.
-// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions)
-//-------------------------------------------------------------------------
-
-VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space)
-{
- IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
- IM_ASSERT(request_formats != NULL);
- IM_ASSERT(request_formats_count > 0);
-
- // Per Spec Format and View Format are expected to be the same unless VK_IMAGE_CREATE_MUTABLE_BIT was set at image creation
- // Assuming that the default behavior is without setting this bit, there is no need for separate Swapchain image and image view format
- // Additionally several new color spaces were introduced with Vulkan Spec v1.0.40,
- // hence we must make sure that a format with the mostly available color space, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, is found and used.
- uint32_t avail_count;
- vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, NULL);
- ImVector<VkSurfaceFormatKHR> avail_format;
- avail_format.resize((int)avail_count);
- vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, avail_format.Data);
-
- // First check if only one format, VK_FORMAT_UNDEFINED, is available, which would imply that any format is available
- if (avail_count == 1)
- {
- if (avail_format[0].format == VK_FORMAT_UNDEFINED)
- {
- VkSurfaceFormatKHR ret;
- ret.format = request_formats[0];
- ret.colorSpace = request_color_space;
- return ret;
- }
- else
- {
- // No point in searching another format
- return avail_format[0];
- }
- }
- else
- {
- // Request several formats, the first found will be used
- for (int request_i = 0; request_i < request_formats_count; request_i++)
- for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++)
- if (avail_format[avail_i].format == request_formats[request_i] && avail_format[avail_i].colorSpace == request_color_space)
- return avail_format[avail_i];
-
- // If none of the requested image formats could be found, use the first available
- return avail_format[0];
- }
-}
-
-VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count)
-{
- IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
- IM_ASSERT(request_modes != NULL);
- IM_ASSERT(request_modes_count > 0);
-
- // Request a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory
- uint32_t avail_count = 0;
- vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, NULL);
- ImVector<VkPresentModeKHR> avail_modes;
- avail_modes.resize((int)avail_count);
- vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, avail_modes.Data);
- //for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++)
- // printf("[vulkan] avail_modes[%d] = %d\n", avail_i, avail_modes[avail_i]);
-
- for (int request_i = 0; request_i < request_modes_count; request_i++)
- for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++)
- if (request_modes[request_i] == avail_modes[avail_i])
- return request_modes[request_i];
-
- return VK_PRESENT_MODE_FIFO_KHR; // Always available
-}
-
-void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator)
-{
- IM_ASSERT(physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE);
- (void)physical_device;
- (void)allocator;
-
- // Create Command Buffers
- VkResult err;
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- {
- ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
- ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i];
- {
- VkCommandPoolCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
- info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- info.queueFamilyIndex = queue_family;
- err = vkCreateCommandPool(device, &info, allocator, &fd->CommandPool);
- check_vk_result(err);
- }
- {
- VkCommandBufferAllocateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
- info.commandPool = fd->CommandPool;
- info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
- info.commandBufferCount = 1;
- err = vkAllocateCommandBuffers(device, &info, &fd->CommandBuffer);
- check_vk_result(err);
- }
- {
- VkFenceCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
- info.flags = VK_FENCE_CREATE_SIGNALED_BIT;
- err = vkCreateFence(device, &info, allocator, &fd->Fence);
- check_vk_result(err);
- }
- {
- VkSemaphoreCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
- err = vkCreateSemaphore(device, &info, allocator, &fsd->ImageAcquiredSemaphore);
- check_vk_result(err);
- err = vkCreateSemaphore(device, &info, allocator, &fsd->RenderCompleteSemaphore);
- check_vk_result(err);
- }
- }
-}
-
-int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode)
-{
- if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR)
- return 3;
- if (present_mode == VK_PRESENT_MODE_FIFO_KHR || present_mode == VK_PRESENT_MODE_FIFO_RELAXED_KHR)
- return 2;
- if (present_mode == VK_PRESENT_MODE_IMMEDIATE_KHR)
- return 1;
- IM_ASSERT(0);
- return 1;
-}
-
-// Also destroy old swap chain and in-flight frames data, if any.
-void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count)
-{
- VkResult err;
- VkSwapchainKHR old_swapchain = wd->Swapchain;
- wd->Swapchain = VK_NULL_HANDLE;
- err = vkDeviceWaitIdle(device);
- check_vk_result(err);
-
- // We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one.
- // Destroy old Framebuffer
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- {
- ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator);
- ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator);
- }
- IM_FREE(wd->Frames);
- IM_FREE(wd->FrameSemaphores);
- wd->Frames = NULL;
- wd->FrameSemaphores = NULL;
- wd->ImageCount = 0;
- if (wd->RenderPass)
- vkDestroyRenderPass(device, wd->RenderPass, allocator);
- if (wd->Pipeline)
- vkDestroyPipeline(device, wd->Pipeline, allocator);
-
- // If min image count was not specified, request different count of images dependent on selected present mode
- if (min_image_count == 0)
- min_image_count = ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(wd->PresentMode);
-
- // Create Swapchain
- {
- VkSwapchainCreateInfoKHR info = {};
- info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
- info.surface = wd->Surface;
- info.minImageCount = min_image_count;
- info.imageFormat = wd->SurfaceFormat.format;
- info.imageColorSpace = wd->SurfaceFormat.colorSpace;
- info.imageArrayLayers = 1;
- info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
- info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; // Assume that graphics family == present family
- info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
- info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
- info.presentMode = wd->PresentMode;
- info.clipped = VK_TRUE;
- info.oldSwapchain = old_swapchain;
- VkSurfaceCapabilitiesKHR cap;
- err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, wd->Surface, &cap);
- check_vk_result(err);
- if (info.minImageCount < cap.minImageCount)
- info.minImageCount = cap.minImageCount;
- else if (cap.maxImageCount != 0 && info.minImageCount > cap.maxImageCount)
- info.minImageCount = cap.maxImageCount;
-
- if (cap.currentExtent.width == 0xffffffff)
- {
- info.imageExtent.width = wd->Width = w;
- info.imageExtent.height = wd->Height = h;
- }
- else
- {
- info.imageExtent.width = wd->Width = cap.currentExtent.width;
- info.imageExtent.height = wd->Height = cap.currentExtent.height;
- }
- err = vkCreateSwapchainKHR(device, &info, allocator, &wd->Swapchain);
- check_vk_result(err);
- err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, NULL);
- check_vk_result(err);
- VkImage backbuffers[16] = {};
- IM_ASSERT(wd->ImageCount >= min_image_count);
- IM_ASSERT(wd->ImageCount < IM_ARRAYSIZE(backbuffers));
- err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, backbuffers);
- check_vk_result(err);
-
- IM_ASSERT(wd->Frames == NULL);
- wd->Frames = (ImGui_ImplVulkanH_Frame*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_Frame) * wd->ImageCount);
- wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->ImageCount);
- memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->ImageCount);
- memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->ImageCount);
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- wd->Frames[i].Backbuffer = backbuffers[i];
- }
- if (old_swapchain)
- vkDestroySwapchainKHR(device, old_swapchain, allocator);
-
- // Create the Render Pass
- {
- VkAttachmentDescription attachment = {};
- attachment.format = wd->SurfaceFormat.format;
- attachment.samples = VK_SAMPLE_COUNT_1_BIT;
- attachment.loadOp = wd->ClearEnable ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
- VkAttachmentReference color_attachment = {};
- color_attachment.attachment = 0;
- color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- VkSubpassDescription subpass = {};
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.colorAttachmentCount = 1;
- subpass.pColorAttachments = &color_attachment;
- VkSubpassDependency dependency = {};
- dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
- dependency.dstSubpass = 0;
- dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- dependency.srcAccessMask = 0;
- dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- VkRenderPassCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
- info.attachmentCount = 1;
- info.pAttachments = &attachment;
- info.subpassCount = 1;
- info.pSubpasses = &subpass;
- info.dependencyCount = 1;
- info.pDependencies = &dependency;
- err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass);
- check_vk_result(err);
-
- // We do not create a pipeline by default as this is also used by examples' main.cpp,
- // but secondary viewport in multi-viewport mode may want to create one with:
- //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, bd->Subpass);
- }
-
- // Create The Image Views
- {
- VkImageViewCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- info.viewType = VK_IMAGE_VIEW_TYPE_2D;
- info.format = wd->SurfaceFormat.format;
- info.components.r = VK_COMPONENT_SWIZZLE_R;
- info.components.g = VK_COMPONENT_SWIZZLE_G;
- info.components.b = VK_COMPONENT_SWIZZLE_B;
- info.components.a = VK_COMPONENT_SWIZZLE_A;
- VkImageSubresourceRange image_range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
- info.subresourceRange = image_range;
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- {
- ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
- info.image = fd->Backbuffer;
- err = vkCreateImageView(device, &info, allocator, &fd->BackbufferView);
- check_vk_result(err);
- }
- }
-
- // Create Framebuffer
- {
- VkImageView attachment[1];
- VkFramebufferCreateInfo info = {};
- info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
- info.renderPass = wd->RenderPass;
- info.attachmentCount = 1;
- info.pAttachments = attachment;
- info.width = wd->Width;
- info.height = wd->Height;
- info.layers = 1;
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- {
- ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
- attachment[0] = fd->BackbufferView;
- err = vkCreateFramebuffer(device, &info, allocator, &fd->Framebuffer);
- check_vk_result(err);
- }
- }
-}
-
-// Create or resize window
-void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count)
-{
- IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
- (void)instance;
- ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count);
- ImGui_ImplVulkanH_CreateWindowCommandBuffers(physical_device, device, wd, queue_family, allocator);
-}
-
-void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator)
-{
- vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals)
- //vkQueueWaitIdle(bd->Queue);
-
- for (uint32_t i = 0; i < wd->ImageCount; i++)
- {
- ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator);
- ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator);
- }
- IM_FREE(wd->Frames);
- IM_FREE(wd->FrameSemaphores);
- wd->Frames = NULL;
- wd->FrameSemaphores = NULL;
- vkDestroyPipeline(device, wd->Pipeline, allocator);
- vkDestroyRenderPass(device, wd->RenderPass, allocator);
- vkDestroySwapchainKHR(device, wd->Swapchain, allocator);
- vkDestroySurfaceKHR(instance, wd->Surface, allocator);
-
- *wd = ImGui_ImplVulkanH_Window();
-}
-
-void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator)
-{
- vkDestroyFence(device, fd->Fence, allocator);
- vkFreeCommandBuffers(device, fd->CommandPool, 1, &fd->CommandBuffer);
- vkDestroyCommandPool(device, fd->CommandPool, allocator);
- fd->Fence = VK_NULL_HANDLE;
- fd->CommandBuffer = VK_NULL_HANDLE;
- fd->CommandPool = VK_NULL_HANDLE;
-
- vkDestroyImageView(device, fd->BackbufferView, allocator);
- vkDestroyFramebuffer(device, fd->Framebuffer, allocator);
-}
-
-void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator)
-{
- vkDestroySemaphore(device, fsd->ImageAcquiredSemaphore, allocator);
- vkDestroySemaphore(device, fsd->RenderCompleteSemaphore, allocator);
- fsd->ImageAcquiredSemaphore = fsd->RenderCompleteSemaphore = VK_NULL_HANDLE;
-}
-
-void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator)
-{
- if (buffers->VertexBuffer) { vkDestroyBuffer(device, buffers->VertexBuffer, allocator); buffers->VertexBuffer = VK_NULL_HANDLE; }
- if (buffers->VertexBufferMemory) { vkFreeMemory(device, buffers->VertexBufferMemory, allocator); buffers->VertexBufferMemory = VK_NULL_HANDLE; }
- if (buffers->IndexBuffer) { vkDestroyBuffer(device, buffers->IndexBuffer, allocator); buffers->IndexBuffer = VK_NULL_HANDLE; }
- if (buffers->IndexBufferMemory) { vkFreeMemory(device, buffers->IndexBufferMemory, allocator); buffers->IndexBufferMemory = VK_NULL_HANDLE; }
- buffers->VertexBufferSize = 0;
- buffers->IndexBufferSize = 0;
-}
-
-void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator)
-{
- for (uint32_t n = 0; n < buffers->Count; n++)
- ImGui_ImplVulkanH_DestroyFrameRenderBuffers(device, &buffers->FrameRenderBuffers[n], allocator);
- IM_FREE(buffers->FrameRenderBuffers);
- buffers->FrameRenderBuffers = NULL;
- buffers->Index = 0;
- buffers->Count = 0;
-}
diff --git a/3rdparty/imgui/backend/imgui_impl_vulkan.h b/3rdparty/imgui/backend/imgui_impl_vulkan.h
deleted file mode 100644
index d80bfc4..0000000
--- a/3rdparty/imgui/backend/imgui_impl_vulkan.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// dear imgui: Renderer Backend for Vulkan
-// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..)
-
-// Implemented features:
-// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
-// [!] Renderer: User texture binding. Use 'VkDescriptorSet' as ImTextureID. Read the FAQ about ImTextureID! See https://github.com/ocornut/imgui/pull/914 for discussions.
-
-// Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'.
-// See imgui_impl_vulkan.cpp file for details.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-// The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification.
-// IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/
-
-// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app.
-// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h.
-// You will use those if you want to use this rendering backend in your engine/app.
-// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by
-// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code.
-// Read comments in imgui_impl_vulkan.h.
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-// [Configuration] in order to use a custom Vulkan function loader:
-// (1) You'll need to disable default Vulkan function prototypes.
-// We provide a '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' convenience configuration flag.
-// In order to make sure this is visible from the imgui_impl_vulkan.cpp compilation unit:
-// - Add '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' in your imconfig.h file
-// - Or as a compilation flag in your build system
-// - Or uncomment here (not recommended because you'd be modifying imgui sources!)
-// - Do not simply add it in a .cpp file!
-// (2) Call ImGui_ImplVulkan_LoadFunctions() before ImGui_ImplVulkan_Init() with your custom function.
-// If you have no idea what this is, leave it alone!
-//#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES
-
-// Vulkan includes
-#if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES)
-#define VK_NO_PROTOTYPES
-#endif
-#include <vulkan/vulkan.h>
-
-// Initialization data, for ImGui_ImplVulkan_Init()
-// [Please zero-clear before use!]
-struct ImGui_ImplVulkan_InitInfo
-{
- VkInstance Instance;
- VkPhysicalDevice PhysicalDevice;
- VkDevice Device;
- uint32_t QueueFamily;
- VkQueue Queue;
- VkPipelineCache PipelineCache;
- VkDescriptorPool DescriptorPool;
- uint32_t Subpass;
- uint32_t MinImageCount; // >= 2
- uint32_t ImageCount; // >= MinImageCount
- VkSampleCountFlagBits MSAASamples; // >= VK_SAMPLE_COUNT_1_BIT (0 -> default to VK_SAMPLE_COUNT_1_BIT)
- const VkAllocationCallbacks* Allocator;
- void (*CheckVkResultFn)(VkResult err);
-};
-
-// Called by user code
-IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass);
-IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame();
-IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE);
-IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer);
-IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontUploadObjects();
-IMGUI_IMPL_API void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated)
-
-// Register a texture (VkDescriptorSet == ImTextureID)
-// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions.
-IMGUI_IMPL_API VkDescriptorSet ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout);
-
-// Optional: load Vulkan functions with a custom function loader
-// This is only useful with IMGUI_IMPL_VULKAN_NO_PROTOTYPES / VK_NO_PROTOTYPES
-IMGUI_IMPL_API bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data = NULL);
-
-//-------------------------------------------------------------------------
-// Internal / Miscellaneous Vulkan Helpers
-// (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own engine/app.)
-//-------------------------------------------------------------------------
-// You probably do NOT need to use or care about those functions.
-// Those functions only exist because:
-// 1) they facilitate the readability and maintenance of the multiple main.cpp examples files.
-// 2) the upcoming multi-viewport feature will need them internally.
-// Generally we avoid exposing any kind of superfluous high-level helpers in the backends,
-// but it is too much code to duplicate everywhere so we exceptionally expose them.
-//
-// Your engine/app will likely _already_ have code to setup all that stuff (swap chain, render pass, frame buffers, etc.).
-// You may read this code to learn about Vulkan, but it is recommended you use you own custom tailored code to do equivalent work.
-// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions)
-//-------------------------------------------------------------------------
-
-struct ImGui_ImplVulkanH_Frame;
-struct ImGui_ImplVulkanH_Window;
-
-// Helpers
-IMGUI_IMPL_API void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wnd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
-IMGUI_IMPL_API void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wnd, const VkAllocationCallbacks* allocator);
-IMGUI_IMPL_API VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space);
-IMGUI_IMPL_API VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count);
-IMGUI_IMPL_API int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode);
-
-// Helper structure to hold the data needed by one rendering frame
-// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
-// [Please zero-clear before use!]
-struct ImGui_ImplVulkanH_Frame
-{
- VkCommandPool CommandPool;
- VkCommandBuffer CommandBuffer;
- VkFence Fence;
- VkImage Backbuffer;
- VkImageView BackbufferView;
- VkFramebuffer Framebuffer;
-};
-
-struct ImGui_ImplVulkanH_FrameSemaphores
-{
- VkSemaphore ImageAcquiredSemaphore;
- VkSemaphore RenderCompleteSemaphore;
-};
-
-// Helper structure to hold the data needed by one rendering context into one OS window
-// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
-struct ImGui_ImplVulkanH_Window
-{
- int Width;
- int Height;
- VkSwapchainKHR Swapchain;
- VkSurfaceKHR Surface;
- VkSurfaceFormatKHR SurfaceFormat;
- VkPresentModeKHR PresentMode;
- VkRenderPass RenderPass;
- VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo
- bool ClearEnable;
- VkClearValue ClearValue;
- uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
- uint32_t ImageCount; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count)
- uint32_t SemaphoreIndex; // Current set of swapchain wait semaphores we're using (needs to be distinct from per frame data)
- ImGui_ImplVulkanH_Frame* Frames;
- ImGui_ImplVulkanH_FrameSemaphores* FrameSemaphores;
-
- ImGui_ImplVulkanH_Window()
- {
- memset(this, 0, sizeof(*this));
- PresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
- ClearEnable = true;
- }
-};
-
diff --git a/3rdparty/imgui/backend/imgui_impl_win32.cpp b/3rdparty/imgui/backend/imgui_impl_win32.cpp
deleted file mode 100644
index 157b57d..0000000
--- a/3rdparty/imgui/backend/imgui_impl_win32.cpp
+++ /dev/null
@@ -1,790 +0,0 @@
-// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications)
-// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
-
-// Implemented features:
-// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
-// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
-// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
-// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-#include "imgui.h"
-#include "imgui_impl_win32.h"
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
-#include <windowsx.h> // GET_X_LPARAM(), GET_Y_LPARAM()
-#include <tchar.h>
-#include <dwmapi.h>
-
-// Configuration flags to add in your imconfig.h file:
-//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD // Disable gamepad support. This was meaningful before <1.81 but we now load XInput dynamically so the option is now less relevant.
-
-// Using XInput for gamepad (will load DLL dynamically)
-#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
-#include <xinput.h>
-typedef DWORD (WINAPI *PFN_XInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*);
-typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*);
-#endif
-
-// CHANGELOG
-// (minor and older changes stripped away, please see git history for details)
-// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago)with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion.
-// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[].
-// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+).
-// 2022-01-17: Inputs: always update key mods next and before a key event (not in NewFrame) to fix input queue with very low framerates.
-// 2022-01-12: Inputs: Update mouse inputs using WM_MOUSEMOVE/WM_MOUSELEAVE + fallback to provide it when focused but not hovered/captured. More standard and will allow us to pass it to future input queue API.
-// 2022-01-12: Inputs: Maintain our own copy of MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted.
-// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range.
-// 2021-12-16: Inputs: Fill VK_LCONTROL/VK_RCONTROL/VK_LSHIFT/VK_RSHIFT/VK_LMENU/VK_RMENU for completeness.
-// 2021-08-17: Calling io.AddFocusEvent() on WM_SETFOCUS/WM_KILLFOCUS messages.
-// 2021-08-02: Inputs: Fixed keyboard modifiers being reported when host window doesn't have focus.
-// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events).
-// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
-// 2021-06-08: Fixed ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1).
-// 2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS).
-// 2021-02-18: Added ImGui_ImplWin32_EnableAlphaCompositing(). Non Visual Studio users will need to link with dwmapi.lib (MinGW/gcc: use -ldwmapi).
-// 2021-02-17: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1.
-// 2021-01-25: Inputs: Dynamically loading XInput DLL.
-// 2020-12-04: Misc: Fixed setting of io.DisplaySize to invalid/uninitialized data when after hwnd has been closed.
-// 2020-03-03: Inputs: Calling AddInputCharacterUTF16() to support surrogate pairs leading to codepoint >= 0x10000 (for more complete CJK inputs)
-// 2020-02-17: Added ImGui_ImplWin32_EnableDpiAwareness(), ImGui_ImplWin32_GetDpiScaleForHwnd(), ImGui_ImplWin32_GetDpiScaleForMonitor() helper functions.
-// 2020-01-14: Inputs: Added support for #define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD/IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT.
-// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor.
-// 2019-05-11: Inputs: Don't filter value from WM_CHAR before calling AddInputCharacter().
-// 2019-01-17: Misc: Using GetForegroundWindow()+IsChild() instead of GetActiveWindow() to be compatible with windows created in a different thread or parent.
-// 2019-01-17: Inputs: Added support for mouse buttons 4 and 5 via WM_XBUTTON* messages.
-// 2019-01-15: Inputs: Added support for XInput gamepads (if ImGuiConfigFlags_NavEnableGamepad is set by user application).
-// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window.
-// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor.
-// 2018-06-10: Inputs: Fixed handling of mouse wheel messages to support fine position messages (typically sent by track-pads).
-// 2018-06-08: Misc: Extracted imgui_impl_win32.cpp/.h away from the old combined DX9/DX10/DX11/DX12 examples.
-// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors and ImGuiBackendFlags_HasSetMousePos flags + honor ImGuiConfigFlags_NoMouseCursorChange flag.
-// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling).
-// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space.
-// 2018-02-06: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set).
-// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves.
-// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support.
-// 2018-01-08: Inputs: Added mapping for ImGuiKey_Insert.
-// 2018-01-05: Inputs: Added WM_LBUTTONDBLCLK double-click handlers for window classes with the CS_DBLCLKS flag.
-// 2017-10-23: Inputs: Added WM_SYSKEYDOWN / WM_SYSKEYUP handlers so e.g. the VK_MENU key can be read.
-// 2017-10-23: Inputs: Using Win32 ::SetCapture/::GetCapture() to retrieve mouse positions outside the client area when dragging.
-// 2016-11-12: Inputs: Only call Win32 ::SetCursor(NULL) when io.MouseDrawCursor is set.
-
-struct ImGui_ImplWin32_Data
-{
- HWND hWnd;
- HWND MouseHwnd;
- bool MouseTracked;
- int MouseButtonsDown;
- INT64 Time;
- INT64 TicksPerSecond;
- ImGuiMouseCursor LastMouseCursor;
- bool HasGamepad;
- bool WantUpdateHasGamepad;
-
-#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
- HMODULE XInputDLL;
- PFN_XInputGetCapabilities XInputGetCapabilities;
- PFN_XInputGetState XInputGetState;
-#endif
-
- ImGui_ImplWin32_Data() { memset(this, 0, sizeof(*this)); }
-};
-
-// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts
-// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts.
-// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
-// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context.
-static ImGui_ImplWin32_Data* ImGui_ImplWin32_GetBackendData()
-{
- return ImGui::GetCurrentContext() ? (ImGui_ImplWin32_Data*)ImGui::GetIO().BackendPlatformUserData : NULL;
-}
-
-// Functions
-bool ImGui_ImplWin32_Init(void* hwnd)
-{
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!");
-
- INT64 perf_frequency, perf_counter;
- if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&perf_frequency))
- return false;
- if (!::QueryPerformanceCounter((LARGE_INTEGER*)&perf_counter))
- return false;
-
- // Setup backend capabilities flags
- ImGui_ImplWin32_Data* bd = IM_NEW(ImGui_ImplWin32_Data)();
- io.BackendPlatformUserData = (void*)bd;
- io.BackendPlatformName = "imgui_impl_win32";
- io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
- io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
-
- bd->hWnd = (HWND)hwnd;
- bd->WantUpdateHasGamepad = true;
- bd->TicksPerSecond = perf_frequency;
- bd->Time = perf_counter;
- bd->LastMouseCursor = ImGuiMouseCursor_COUNT;
-
- // Set platform dependent data in viewport
- ImGui::GetMainViewport()->PlatformHandleRaw = (void*)hwnd;
-
- // Dynamically load XInput library
-#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
- const char* xinput_dll_names[] =
- {
- "xinput1_4.dll", // Windows 8+
- "xinput1_3.dll", // DirectX SDK
- "xinput9_1_0.dll", // Windows Vista, Windows 7
- "xinput1_2.dll", // DirectX SDK
- "xinput1_1.dll" // DirectX SDK
- };
- for (int n = 0; n < IM_ARRAYSIZE(xinput_dll_names); n++)
- if (HMODULE dll = ::LoadLibraryA(xinput_dll_names[n]))
- {
- bd->XInputDLL = dll;
- bd->XInputGetCapabilities = (PFN_XInputGetCapabilities)::GetProcAddress(dll, "XInputGetCapabilities");
- bd->XInputGetState = (PFN_XInputGetState)::GetProcAddress(dll, "XInputGetState");
- break;
- }
-#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
-
- return true;
-}
-
-void ImGui_ImplWin32_Shutdown()
-{
- ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
- IM_ASSERT(bd != NULL && "No platform backend to shutdown, or already shutdown?");
- ImGuiIO& io = ImGui::GetIO();
-
- // Unload XInput library
-#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
- if (bd->XInputDLL)
- ::FreeLibrary(bd->XInputDLL);
-#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
-
- io.BackendPlatformName = NULL;
- io.BackendPlatformUserData = NULL;
- IM_DELETE(bd);
-}
-
-static bool ImGui_ImplWin32_UpdateMouseCursor()
-{
- ImGuiIO& io = ImGui::GetIO();
- if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange)
- return false;
-
- ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
- if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor)
- {
- // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
- ::SetCursor(NULL);
- }
- else
- {
- // Show OS mouse cursor
- LPTSTR win32_cursor = IDC_ARROW;
- switch (imgui_cursor)
- {
- case ImGuiMouseCursor_Arrow: win32_cursor = IDC_ARROW; break;
- case ImGuiMouseCursor_TextInput: win32_cursor = IDC_IBEAM; break;
- case ImGuiMouseCursor_ResizeAll: win32_cursor = IDC_SIZEALL; break;
- case ImGuiMouseCursor_ResizeEW: win32_cursor = IDC_SIZEWE; break;
- case ImGuiMouseCursor_ResizeNS: win32_cursor = IDC_SIZENS; break;
- case ImGuiMouseCursor_ResizeNESW: win32_cursor = IDC_SIZENESW; break;
- case ImGuiMouseCursor_ResizeNWSE: win32_cursor = IDC_SIZENWSE; break;
- case ImGuiMouseCursor_Hand: win32_cursor = IDC_HAND; break;
- case ImGuiMouseCursor_NotAllowed: win32_cursor = IDC_NO; break;
- }
- ::SetCursor(::LoadCursor(NULL, win32_cursor));
- }
- return true;
-}
-
-static bool IsVkDown(int vk)
-{
- return (::GetKeyState(vk) & 0x8000) != 0;
-}
-
-static void ImGui_ImplWin32_AddKeyEvent(ImGuiKey key, bool down, int native_keycode, int native_scancode = -1)
-{
- ImGuiIO& io = ImGui::GetIO();
- io.AddKeyEvent(key, down);
- io.SetKeyEventNativeData(key, native_keycode, native_scancode); // To support legacy indexing (<1.87 user code)
- IM_UNUSED(native_scancode);
-}
-
-static void ImGui_ImplWin32_ProcessKeyEventsWorkarounds()
-{
- // Left & right Shift keys: when both are pressed together, Windows tend to not generate the WM_KEYUP event for the first released one.
- if (ImGui::IsKeyDown(ImGuiKey_LeftShift) && !IsVkDown(VK_LSHIFT))
- ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, false, VK_LSHIFT);
- if (ImGui::IsKeyDown(ImGuiKey_RightShift) && !IsVkDown(VK_RSHIFT))
- ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, false, VK_RSHIFT);
-
- // Sometimes WM_KEYUP for Win key is not passed down to the app (e.g. for Win+V on some setups, according to GLFW).
- if (ImGui::IsKeyDown(ImGuiKey_LeftSuper) && !IsVkDown(VK_LWIN))
- ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftSuper, false, VK_LWIN);
- if (ImGui::IsKeyDown(ImGuiKey_RightSuper) && !IsVkDown(VK_RWIN))
- ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightSuper, false, VK_RWIN);
-}
-
-static void ImGui_ImplWin32_UpdateKeyModifiers()
-{
- ImGuiIO& io = ImGui::GetIO();
- io.AddKeyEvent(ImGuiKey_ModCtrl, IsVkDown(VK_CONTROL));
- io.AddKeyEvent(ImGuiKey_ModShift, IsVkDown(VK_SHIFT));
- io.AddKeyEvent(ImGuiKey_ModAlt, IsVkDown(VK_MENU));
- io.AddKeyEvent(ImGuiKey_ModSuper, IsVkDown(VK_APPS));
-}
-
-static void ImGui_ImplWin32_UpdateMouseData()
-{
- ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
- ImGuiIO& io = ImGui::GetIO();
- IM_ASSERT(bd->hWnd != 0);
-
- const bool is_app_focused = (::GetForegroundWindow() == bd->hWnd);
- if (is_app_focused)
- {
- // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user)
- if (io.WantSetMousePos)
- {
- POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y };
- if (::ClientToScreen(bd->hWnd, &pos))
- ::SetCursorPos(pos.x, pos.y);
- }
-
- // (Optional) Fallback to provide mouse position when focused (WM_MOUSEMOVE already provides this when hovered or captured)
- if (!io.WantSetMousePos && !bd->MouseTracked)
- {
- POINT pos;
- if (::GetCursorPos(&pos) && ::ScreenToClient(bd->hWnd, &pos))
- io.AddMousePosEvent((float)pos.x, (float)pos.y);
- }
- }
-}
-
-// Gamepad navigation mapping
-static void ImGui_ImplWin32_UpdateGamepads()
-{
-#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
- if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0)
- return;
-
- // Calling XInputGetState() every frame on disconnected gamepads is unfortunately too slow.
- // Instead we refresh gamepad availability by calling XInputGetCapabilities() _only_ after receiving WM_DEVICECHANGE.
- if (bd->WantUpdateHasGamepad)
- {
- XINPUT_CAPABILITIES caps = {};
- bd->HasGamepad = bd->XInputGetCapabilities ? (bd->XInputGetCapabilities(0, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) : false;
- bd->WantUpdateHasGamepad = false;
- }
-
- io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad;
- XINPUT_STATE xinput_state;
- XINPUT_GAMEPAD& gamepad = xinput_state.Gamepad;
- if (!bd->HasGamepad || bd->XInputGetState == NULL || bd->XInputGetState(0, &xinput_state) != ERROR_SUCCESS)
- return;
- io.BackendFlags |= ImGuiBackendFlags_HasGamepad;
-
- #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V)
- #define MAP_BUTTON(KEY_NO, BUTTON_ENUM) { io.AddKeyEvent(KEY_NO, (gamepad.wButtons & BUTTON_ENUM) != 0); }
- #define MAP_ANALOG(KEY_NO, VALUE, V0, V1) { float vn = (float)(VALUE - V0) / (float)(V1 - V0); io.AddKeyAnalogEvent(KEY_NO, vn > 0.10f, IM_SATURATE(vn)); }
- MAP_BUTTON(ImGuiKey_GamepadStart, XINPUT_GAMEPAD_START);
- MAP_BUTTON(ImGuiKey_GamepadBack, XINPUT_GAMEPAD_BACK);
- MAP_BUTTON(ImGuiKey_GamepadFaceDown, XINPUT_GAMEPAD_A);
- MAP_BUTTON(ImGuiKey_GamepadFaceRight, XINPUT_GAMEPAD_B);
- MAP_BUTTON(ImGuiKey_GamepadFaceLeft, XINPUT_GAMEPAD_X);
- MAP_BUTTON(ImGuiKey_GamepadFaceUp, XINPUT_GAMEPAD_Y);
- MAP_BUTTON(ImGuiKey_GamepadDpadLeft, XINPUT_GAMEPAD_DPAD_LEFT);
- MAP_BUTTON(ImGuiKey_GamepadDpadRight, XINPUT_GAMEPAD_DPAD_RIGHT);
- MAP_BUTTON(ImGuiKey_GamepadDpadUp, XINPUT_GAMEPAD_DPAD_UP);
- MAP_BUTTON(ImGuiKey_GamepadDpadDown, XINPUT_GAMEPAD_DPAD_DOWN);
- MAP_BUTTON(ImGuiKey_GamepadL1, XINPUT_GAMEPAD_LEFT_SHOULDER);
- MAP_BUTTON(ImGuiKey_GamepadR1, XINPUT_GAMEPAD_RIGHT_SHOULDER);
- MAP_ANALOG(ImGuiKey_GamepadL2, gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255);
- MAP_ANALOG(ImGuiKey_GamepadR2, gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255);
- MAP_BUTTON(ImGuiKey_GamepadL3, XINPUT_GAMEPAD_LEFT_THUMB);
- MAP_BUTTON(ImGuiKey_GamepadR3, XINPUT_GAMEPAD_RIGHT_THUMB);
- MAP_ANALOG(ImGuiKey_GamepadLStickLeft, gamepad.sThumbLX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768);
- MAP_ANALOG(ImGuiKey_GamepadLStickRight, gamepad.sThumbLX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
- MAP_ANALOG(ImGuiKey_GamepadLStickUp, gamepad.sThumbLY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
- MAP_ANALOG(ImGuiKey_GamepadLStickDown, gamepad.sThumbLY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768);
- MAP_ANALOG(ImGuiKey_GamepadRStickLeft, gamepad.sThumbRX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768);
- MAP_ANALOG(ImGuiKey_GamepadRStickRight, gamepad.sThumbRX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
- MAP_ANALOG(ImGuiKey_GamepadRStickUp, gamepad.sThumbRY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767);
- MAP_ANALOG(ImGuiKey_GamepadRStickDown, gamepad.sThumbRY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768);
- #undef MAP_BUTTON
- #undef MAP_ANALOG
-#endif // #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD
-}
-
-void ImGui_ImplWin32_NewFrame()
-{
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
- IM_ASSERT(bd != NULL && "Did you call ImGui_ImplWin32_Init()?");
-
- // Setup display size (every frame to accommodate for window resizing)
- RECT rect = { 0, 0, 0, 0 };
- ::GetClientRect(bd->hWnd, &rect);
- io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top));
-
- // Setup time step
- INT64 current_time = 0;
- ::QueryPerformanceCounter((LARGE_INTEGER*)&current_time);
- io.DeltaTime = (float)(current_time - bd->Time) / bd->TicksPerSecond;
- bd->Time = current_time;
-
- // Update OS mouse position
- ImGui_ImplWin32_UpdateMouseData();
-
- // Process workarounds for known Windows key handling issues
- ImGui_ImplWin32_ProcessKeyEventsWorkarounds();
-
- // Update OS mouse cursor with the cursor requested by imgui
- ImGuiMouseCursor mouse_cursor = io.MouseDrawCursor ? ImGuiMouseCursor_None : ImGui::GetMouseCursor();
- if (bd->LastMouseCursor != mouse_cursor)
- {
- bd->LastMouseCursor = mouse_cursor;
- ImGui_ImplWin32_UpdateMouseCursor();
- }
-
- // Update game controllers (if enabled and available)
- ImGui_ImplWin32_UpdateGamepads();
-}
-
-// There is no distinct VK_xxx for keypad enter, instead it is VK_RETURN + KF_EXTENDED, we assign it an arbitrary value to make code more readable (VK_ codes go up to 255)
-#define IM_VK_KEYPAD_ENTER (VK_RETURN + 256)
-
-// Map VK_xxx to ImGuiKey_xxx.
-static ImGuiKey ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam)
-{
- switch (wParam)
- {
- case VK_TAB: return ImGuiKey_Tab;
- case VK_LEFT: return ImGuiKey_LeftArrow;
- case VK_RIGHT: return ImGuiKey_RightArrow;
- case VK_UP: return ImGuiKey_UpArrow;
- case VK_DOWN: return ImGuiKey_DownArrow;
- case VK_PRIOR: return ImGuiKey_PageUp;
- case VK_NEXT: return ImGuiKey_PageDown;
- case VK_HOME: return ImGuiKey_Home;
- case VK_END: return ImGuiKey_End;
- case VK_INSERT: return ImGuiKey_Insert;
- case VK_DELETE: return ImGuiKey_Delete;
- case VK_BACK: return ImGuiKey_Backspace;
- case VK_SPACE: return ImGuiKey_Space;
- case VK_RETURN: return ImGuiKey_Enter;
- case VK_ESCAPE: return ImGuiKey_Escape;
- case VK_OEM_7: return ImGuiKey_Apostrophe;
- case VK_OEM_COMMA: return ImGuiKey_Comma;
- case VK_OEM_MINUS: return ImGuiKey_Minus;
- case VK_OEM_PERIOD: return ImGuiKey_Period;
- case VK_OEM_2: return ImGuiKey_Slash;
- case VK_OEM_1: return ImGuiKey_Semicolon;
- case VK_OEM_PLUS: return ImGuiKey_Equal;
- case VK_OEM_4: return ImGuiKey_LeftBracket;
- case VK_OEM_5: return ImGuiKey_Backslash;
- case VK_OEM_6: return ImGuiKey_RightBracket;
- case VK_OEM_3: return ImGuiKey_GraveAccent;
- case VK_CAPITAL: return ImGuiKey_CapsLock;
- case VK_SCROLL: return ImGuiKey_ScrollLock;
- case VK_NUMLOCK: return ImGuiKey_NumLock;
- case VK_SNAPSHOT: return ImGuiKey_PrintScreen;
- case VK_PAUSE: return ImGuiKey_Pause;
- case VK_NUMPAD0: return ImGuiKey_Keypad0;
- case VK_NUMPAD1: return ImGuiKey_Keypad1;
- case VK_NUMPAD2: return ImGuiKey_Keypad2;
- case VK_NUMPAD3: return ImGuiKey_Keypad3;
- case VK_NUMPAD4: return ImGuiKey_Keypad4;
- case VK_NUMPAD5: return ImGuiKey_Keypad5;
- case VK_NUMPAD6: return ImGuiKey_Keypad6;
- case VK_NUMPAD7: return ImGuiKey_Keypad7;
- case VK_NUMPAD8: return ImGuiKey_Keypad8;
- case VK_NUMPAD9: return ImGuiKey_Keypad9;
- case VK_DECIMAL: return ImGuiKey_KeypadDecimal;
- case VK_DIVIDE: return ImGuiKey_KeypadDivide;
- case VK_MULTIPLY: return ImGuiKey_KeypadMultiply;
- case VK_SUBTRACT: return ImGuiKey_KeypadSubtract;
- case VK_ADD: return ImGuiKey_KeypadAdd;
- case IM_VK_KEYPAD_ENTER: return ImGuiKey_KeypadEnter;
- case VK_LSHIFT: return ImGuiKey_LeftShift;
- case VK_LCONTROL: return ImGuiKey_LeftCtrl;
- case VK_LMENU: return ImGuiKey_LeftAlt;
- case VK_LWIN: return ImGuiKey_LeftSuper;
- case VK_RSHIFT: return ImGuiKey_RightShift;
- case VK_RCONTROL: return ImGuiKey_RightCtrl;
- case VK_RMENU: return ImGuiKey_RightAlt;
- case VK_RWIN: return ImGuiKey_RightSuper;
- case VK_APPS: return ImGuiKey_Menu;
- case '0': return ImGuiKey_0;
- case '1': return ImGuiKey_1;
- case '2': return ImGuiKey_2;
- case '3': return ImGuiKey_3;
- case '4': return ImGuiKey_4;
- case '5': return ImGuiKey_5;
- case '6': return ImGuiKey_6;
- case '7': return ImGuiKey_7;
- case '8': return ImGuiKey_8;
- case '9': return ImGuiKey_9;
- case 'A': return ImGuiKey_A;
- case 'B': return ImGuiKey_B;
- case 'C': return ImGuiKey_C;
- case 'D': return ImGuiKey_D;
- case 'E': return ImGuiKey_E;
- case 'F': return ImGuiKey_F;
- case 'G': return ImGuiKey_G;
- case 'H': return ImGuiKey_H;
- case 'I': return ImGuiKey_I;
- case 'J': return ImGuiKey_J;
- case 'K': return ImGuiKey_K;
- case 'L': return ImGuiKey_L;
- case 'M': return ImGuiKey_M;
- case 'N': return ImGuiKey_N;
- case 'O': return ImGuiKey_O;
- case 'P': return ImGuiKey_P;
- case 'Q': return ImGuiKey_Q;
- case 'R': return ImGuiKey_R;
- case 'S': return ImGuiKey_S;
- case 'T': return ImGuiKey_T;
- case 'U': return ImGuiKey_U;
- case 'V': return ImGuiKey_V;
- case 'W': return ImGuiKey_W;
- case 'X': return ImGuiKey_X;
- case 'Y': return ImGuiKey_Y;
- case 'Z': return ImGuiKey_Z;
- case VK_F1: return ImGuiKey_F1;
- case VK_F2: return ImGuiKey_F2;
- case VK_F3: return ImGuiKey_F3;
- case VK_F4: return ImGuiKey_F4;
- case VK_F5: return ImGuiKey_F5;
- case VK_F6: return ImGuiKey_F6;
- case VK_F7: return ImGuiKey_F7;
- case VK_F8: return ImGuiKey_F8;
- case VK_F9: return ImGuiKey_F9;
- case VK_F10: return ImGuiKey_F10;
- case VK_F11: return ImGuiKey_F11;
- case VK_F12: return ImGuiKey_F12;
- default: return ImGuiKey_None;
- }
-}
-
-// Allow compilation with old Windows SDK. MinGW doesn't have default _WIN32_WINNT/WINVER versions.
-#ifndef WM_MOUSEHWHEEL
-#define WM_MOUSEHWHEEL 0x020E
-#endif
-#ifndef DBT_DEVNODES_CHANGED
-#define DBT_DEVNODES_CHANGED 0x0007
-#endif
-
-// Win32 message handler (process Win32 mouse/keyboard inputs, etc.)
-// Call from your application's message handler.
-// When implementing your own backend, you can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if Dear ImGui wants to use your inputs.
-// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
-// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
-// Generally you may always pass all inputs to Dear ImGui, and hide them from your application based on those two flags.
-// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinates when dragging mouse outside of our window bounds.
-// PS: We treat DBLCLK messages as regular mouse down messages, so this code will work on windows classes that have the CS_DBLCLKS flag set. Our own example app code doesn't set this flag.
-#if 0
-// Copy this line into your .cpp file to forward declare the function.
-extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
-#endif
-IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- if (ImGui::GetCurrentContext() == NULL)
- return 0;
-
- ImGuiIO& io = ImGui::GetIO();
- ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
-
- switch (msg)
- {
- case WM_MOUSEMOVE:
- // We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events
- bd->MouseHwnd = hwnd;
- if (!bd->MouseTracked)
- {
- TRACKMOUSEEVENT tme = { sizeof(tme), TME_LEAVE, hwnd, 0 };
- ::TrackMouseEvent(&tme);
- bd->MouseTracked = true;
- }
- io.AddMousePosEvent((float)GET_X_LPARAM(lParam), (float)GET_Y_LPARAM(lParam));
- break;
- case WM_MOUSELEAVE:
- if (bd->MouseHwnd == hwnd)
- bd->MouseHwnd = NULL;
- bd->MouseTracked = false;
- io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
- break;
- case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
- case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
- case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
- case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
- {
- int button = 0;
- if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
- if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
- if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
- if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
- if (bd->MouseButtonsDown == 0 && ::GetCapture() == NULL)
- ::SetCapture(hwnd);
- bd->MouseButtonsDown |= 1 << button;
- io.AddMouseButtonEvent(button, true);
- return 0;
- }
- case WM_LBUTTONUP:
- case WM_RBUTTONUP:
- case WM_MBUTTONUP:
- case WM_XBUTTONUP:
- {
- int button = 0;
- if (msg == WM_LBUTTONUP) { button = 0; }
- if (msg == WM_RBUTTONUP) { button = 1; }
- if (msg == WM_MBUTTONUP) { button = 2; }
- if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
- bd->MouseButtonsDown &= ~(1 << button);
- if (bd->MouseButtonsDown == 0 && ::GetCapture() == hwnd)
- ::ReleaseCapture();
- io.AddMouseButtonEvent(button, false);
- return 0;
- }
- case WM_MOUSEWHEEL:
- io.AddMouseWheelEvent(0.0f, (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA);
- return 0;
- case WM_MOUSEHWHEEL:
- io.AddMouseWheelEvent((float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f);
- return 0;
- case WM_KEYDOWN:
- case WM_KEYUP:
- case WM_SYSKEYDOWN:
- case WM_SYSKEYUP:
- {
- const bool is_key_down = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN);
- if (wParam < 256)
- {
- // Submit modifiers
- ImGui_ImplWin32_UpdateKeyModifiers();
-
- // Obtain virtual key code
- // (keypad enter doesn't have its own... VK_RETURN with KF_EXTENDED flag means keypad enter, see IM_VK_KEYPAD_ENTER definition for details, it is mapped to ImGuiKey_KeyPadEnter.)
- int vk = (int)wParam;
- if ((wParam == VK_RETURN) && (HIWORD(lParam) & KF_EXTENDED))
- vk = IM_VK_KEYPAD_ENTER;
-
- // Submit key event
- const ImGuiKey key = ImGui_ImplWin32_VirtualKeyToImGuiKey(vk);
- const int scancode = (int)LOBYTE(HIWORD(lParam));
- if (key != ImGuiKey_None)
- ImGui_ImplWin32_AddKeyEvent(key, is_key_down, vk, scancode);
-
- // Submit individual left/right modifier events
- if (vk == VK_SHIFT)
- {
- // Important: Shift keys tend to get stuck when pressed together, missing key-up events are corrected in ImGui_ImplWin32_ProcessKeyEventsWorkarounds()
- if (IsVkDown(VK_LSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, is_key_down, VK_LSHIFT, scancode); }
- if (IsVkDown(VK_RSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, is_key_down, VK_RSHIFT, scancode); }
- }
- else if (vk == VK_CONTROL)
- {
- if (IsVkDown(VK_LCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftCtrl, is_key_down, VK_LCONTROL, scancode); }
- if (IsVkDown(VK_RCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightCtrl, is_key_down, VK_RCONTROL, scancode); }
- }
- else if (vk == VK_MENU)
- {
- if (IsVkDown(VK_LMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftAlt, is_key_down, VK_LMENU, scancode); }
- if (IsVkDown(VK_RMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightAlt, is_key_down, VK_RMENU, scancode); }
- }
- }
- return 0;
- }
- case WM_SETFOCUS:
- case WM_KILLFOCUS:
- io.AddFocusEvent(msg == WM_SETFOCUS);
- return 0;
- case WM_CHAR:
- // You can also use ToAscii()+GetKeyboardState() to retrieve characters.
- if (wParam > 0 && wParam < 0x10000)
- io.AddInputCharacterUTF16((unsigned short)wParam);
- return 0;
- case WM_SETCURSOR:
- if (LOWORD(lParam) == HTCLIENT && ImGui_ImplWin32_UpdateMouseCursor())
- return 1;
- return 0;
- case WM_DEVICECHANGE:
- if ((UINT)wParam == DBT_DEVNODES_CHANGED)
- bd->WantUpdateHasGamepad = true;
- return 0;
- }
- return 0;
-}
-
-
-//--------------------------------------------------------------------------------------------------------
-// DPI-related helpers (optional)
-//--------------------------------------------------------------------------------------------------------
-// - Use to enable DPI awareness without having to create an application manifest.
-// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
-// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
-// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
-// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
-//---------------------------------------------------------------------------------------------------------
-// This is the scheme successfully used by GLFW (from which we borrowed some of the code) and other apps aiming to be highly portable.
-// ImGui_ImplWin32_EnableDpiAwareness() is just a helper called by main.cpp, we don't call it automatically.
-// If you are trying to implement your own backend for your own engine, you may ignore that noise.
-//---------------------------------------------------------------------------------------------------------
-
-// Perform our own check with RtlVerifyVersionInfo() instead of using functions from <VersionHelpers.h> as they
-// require a manifest to be functional for checks above 8.1. See https://github.com/ocornut/imgui/issues/4200
-static BOOL _IsWindowsVersionOrGreater(WORD major, WORD minor, WORD)
-{
- typedef LONG(WINAPI* PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*, ULONG, ULONGLONG);
- static PFN_RtlVerifyVersionInfo RtlVerifyVersionInfoFn = NULL;
- if (RtlVerifyVersionInfoFn == NULL)
- if (HMODULE ntdllModule = ::GetModuleHandleA("ntdll.dll"))
- RtlVerifyVersionInfoFn = (PFN_RtlVerifyVersionInfo)GetProcAddress(ntdllModule, "RtlVerifyVersionInfo");
- if (RtlVerifyVersionInfoFn == NULL)
- return FALSE;
-
- RTL_OSVERSIONINFOEXW versionInfo = { };
- ULONGLONG conditionMask = 0;
- versionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
- versionInfo.dwMajorVersion = major;
- versionInfo.dwMinorVersion = minor;
- VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
- VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
- return (RtlVerifyVersionInfoFn(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask) == 0) ? TRUE : FALSE;
-}
-
-#define _IsWindowsVistaOrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0600), LOBYTE(0x0600), 0) // _WIN32_WINNT_VISTA
-#define _IsWindows8OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0602), LOBYTE(0x0602), 0) // _WIN32_WINNT_WIN8
-#define _IsWindows8Point1OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0603), LOBYTE(0x0603), 0) // _WIN32_WINNT_WINBLUE
-#define _IsWindows10OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0A00), LOBYTE(0x0A00), 0) // _WIN32_WINNT_WINTHRESHOLD / _WIN32_WINNT_WIN10
-
-#ifndef DPI_ENUMS_DECLARED
-typedef enum { PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS;
-typedef enum { MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2, MDT_DEFAULT = MDT_EFFECTIVE_DPI } MONITOR_DPI_TYPE;
-#endif
-#ifndef _DPI_AWARENESS_CONTEXTS_
-DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
-#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE (DPI_AWARENESS_CONTEXT)-3
-#endif
-#ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
-#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (DPI_AWARENESS_CONTEXT)-4
-#endif
-typedef HRESULT(WINAPI* PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS); // Shcore.lib + dll, Windows 8.1+
-typedef HRESULT(WINAPI* PFN_GetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*); // Shcore.lib + dll, Windows 8.1+
-typedef DPI_AWARENESS_CONTEXT(WINAPI* PFN_SetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT); // User32.lib + dll, Windows 10 v1607+ (Creators Update)
-
-// Helper function to enable DPI awareness without setting up a manifest
-void ImGui_ImplWin32_EnableDpiAwareness()
-{
- if (_IsWindows10OrGreater())
- {
- static HINSTANCE user32_dll = ::LoadLibraryA("user32.dll"); // Reference counted per-process
- if (PFN_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContextFn = (PFN_SetThreadDpiAwarenessContext)::GetProcAddress(user32_dll, "SetThreadDpiAwarenessContext"))
- {
- SetThreadDpiAwarenessContextFn(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
- return;
- }
- }
- if (_IsWindows8Point1OrGreater())
- {
- static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process
- if (PFN_SetProcessDpiAwareness SetProcessDpiAwarenessFn = (PFN_SetProcessDpiAwareness)::GetProcAddress(shcore_dll, "SetProcessDpiAwareness"))
- {
- SetProcessDpiAwarenessFn(PROCESS_PER_MONITOR_DPI_AWARE);
- return;
- }
- }
-#if _WIN32_WINNT >= 0x0600
- ::SetProcessDPIAware();
-#endif
-}
-
-#if defined(_MSC_VER) && !defined(NOGDI)
-#pragma comment(lib, "gdi32") // Link with gdi32.lib for GetDeviceCaps(). MinGW will require linking with '-lgdi32'
-#endif
-
-float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor)
-{
- UINT xdpi = 96, ydpi = 96;
- if (_IsWindows8Point1OrGreater())
- {
- static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process
- static PFN_GetDpiForMonitor GetDpiForMonitorFn = NULL;
- if (GetDpiForMonitorFn == NULL && shcore_dll != NULL)
- GetDpiForMonitorFn = (PFN_GetDpiForMonitor)::GetProcAddress(shcore_dll, "GetDpiForMonitor");
- if (GetDpiForMonitorFn != NULL)
- {
- GetDpiForMonitorFn((HMONITOR)monitor, MDT_EFFECTIVE_DPI, &xdpi, &ydpi);
- IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert!
- return xdpi / 96.0f;
- }
- }
-#ifndef NOGDI
- const HDC dc = ::GetDC(NULL);
- xdpi = ::GetDeviceCaps(dc, LOGPIXELSX);
- ydpi = ::GetDeviceCaps(dc, LOGPIXELSY);
- IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert!
- ::ReleaseDC(NULL, dc);
-#endif
- return xdpi / 96.0f;
-}
-
-float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd)
-{
- HMONITOR monitor = ::MonitorFromWindow((HWND)hwnd, MONITOR_DEFAULTTONEAREST);
- return ImGui_ImplWin32_GetDpiScaleForMonitor(monitor);
-}
-
-//---------------------------------------------------------------------------------------------------------
-// Transparency related helpers (optional)
-//--------------------------------------------------------------------------------------------------------
-
-#if defined(_MSC_VER)
-#pragma comment(lib, "dwmapi") // Link with dwmapi.lib. MinGW will require linking with '-ldwmapi'
-#endif
-
-// [experimental]
-// Borrowed from GLFW's function updateFramebufferTransparency() in src/win32_window.c
-// (the Dwm* functions are Vista era functions but we are borrowing logic from GLFW)
-void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd)
-{
- if (!_IsWindowsVistaOrGreater())
- return;
-
- BOOL composition;
- if (FAILED(::DwmIsCompositionEnabled(&composition)) || !composition)
- return;
-
- BOOL opaque;
- DWORD color;
- if (_IsWindows8OrGreater() || (SUCCEEDED(::DwmGetColorizationColor(&color, &opaque)) && !opaque))
- {
- HRGN region = ::CreateRectRgn(0, 0, -1, -1);
- DWM_BLURBEHIND bb = {};
- bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
- bb.hRgnBlur = region;
- bb.fEnable = TRUE;
- ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb);
- ::DeleteObject(region);
- }
- else
- {
- DWM_BLURBEHIND bb = {};
- bb.dwFlags = DWM_BB_ENABLE;
- ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb);
- }
-}
-
-//---------------------------------------------------------------------------------------------------------
diff --git a/3rdparty/imgui/backend/imgui_impl_win32.h b/3rdparty/imgui/backend/imgui_impl_win32.h
deleted file mode 100644
index a04b6a7..0000000
--- a/3rdparty/imgui/backend/imgui_impl_win32.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// dear imgui: Platform Backend for Windows (standard windows API for 32 and 64 bits applications)
-// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..)
-
-// Implemented features:
-// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui)
-// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set]
-// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
-// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'.
-
-// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
-// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
-// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
-// Read online: https://github.com/ocornut/imgui/tree/master/docs
-
-#pragma once
-#include "imgui.h" // IMGUI_IMPL_API
-
-IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd);
-IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown();
-IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame();
-
-// Win32 message handler your application need to call.
-// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on <windows.h> from this helper.
-// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it.
-#if 0
-extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
-#endif
-
-// DPI-related helpers (optional)
-// - Use to enable DPI awareness without having to create an application manifest.
-// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps.
-// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc.
-// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime,
-// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies.
-IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness();
-IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd
-IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor
-
-// Transparency related helpers (optional) [experimental]
-// - Use to enable alpha compositing transparency with the desktop.
-// - Use together with e.g. clearing your framebuffer with zero-alpha.
-IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd