|
|
@ -3,6 +3,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
// Implemented features:
|
|
|
|
// Implemented features:
|
|
|
|
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID in imgui.cpp.
|
|
|
|
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID in imgui.cpp.
|
|
|
|
|
|
|
|
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bits indices.
|
|
|
|
// Missing features:
|
|
|
|
// Missing features:
|
|
|
|
// [ ] Renderer: Multi-viewport / platform windows.
|
|
|
|
// [ ] Renderer: Multi-viewport / platform windows.
|
|
|
|
|
|
|
|
|
|
|
@ -12,6 +13,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
// CHANGELOG
|
|
|
|
// CHANGELOG
|
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
|
|
|
|
|
// 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-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.
|
|
|
|
// 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-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
|
|
|
@ -78,6 +80,7 @@ bool ImGui_ImplMetal_Init(id<MTLDevice> device)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
io.BackendRendererName = "imgui_impl_metal";
|
|
|
|
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;
|
|
|
|
static dispatch_once_t onceToken;
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
|
dispatch_once(&onceToken, ^{
|
|
|
@ -480,13 +483,10 @@ void ImGui_ImplMetal_DestroyDeviceObjects()
|
|
|
|
for (int n = 0; n < drawData->CmdListsCount; n++)
|
|
|
|
for (int n = 0; n < drawData->CmdListsCount; n++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const ImDrawList* cmd_list = drawData->CmdLists[n];
|
|
|
|
const ImDrawList* cmd_list = drawData->CmdLists[n];
|
|
|
|
ImDrawIdx idx_buffer_offset = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memcpy((char *)vertexBuffer.buffer.contents + vertexBufferOffset, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
|
|
|
|
memcpy((char *)vertexBuffer.buffer.contents + vertexBufferOffset, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert));
|
|
|
|
memcpy((char *)indexBuffer.buffer.contents + indexBufferOffset, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
|
|
|
|
memcpy((char *)indexBuffer.buffer.contents + indexBufferOffset, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx));
|
|
|
|
|
|
|
|
|
|
|
|
[commandEncoder setVertexBufferOffset:vertexBufferOffset atIndex:0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
|
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
|
@ -524,14 +524,15 @@ void ImGui_ImplMetal_DestroyDeviceObjects()
|
|
|
|
// Bind texture, Draw
|
|
|
|
// Bind texture, Draw
|
|
|
|
if (pcmd->TextureId != NULL)
|
|
|
|
if (pcmd->TextureId != NULL)
|
|
|
|
[commandEncoder setFragmentTexture:(__bridge id<MTLTexture>)(pcmd->TextureId) atIndex:0];
|
|
|
|
[commandEncoder setFragmentTexture:(__bridge id<MTLTexture>)(pcmd->TextureId) atIndex:0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[commandEncoder setVertexBufferOffset:(vertexBufferOffset + pcmd->VtxOffset * sizeof(ImDrawVert)) atIndex:0];
|
|
|
|
[commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
|
|
|
|
[commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
|
|
|
|
indexCount:pcmd->ElemCount
|
|
|
|
indexCount:pcmd->ElemCount
|
|
|
|
indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32
|
|
|
|
indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32
|
|
|
|
indexBuffer:indexBuffer.buffer
|
|
|
|
indexBuffer:indexBuffer.buffer
|
|
|
|
indexBufferOffset:indexBufferOffset + idx_buffer_offset];
|
|
|
|
indexBufferOffset:indexBufferOffset + pcmd->IdxOffset * sizeof(ImDrawIdx)];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
idx_buffer_offset += pcmd->ElemCount * sizeof(ImDrawIdx);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
vertexBufferOffset += cmd_list->VtxBuffer.Size * sizeof(ImDrawVert);
|
|
|
|
vertexBufferOffset += cmd_list->VtxBuffer.Size * sizeof(ImDrawVert);
|
|
|
|