|
|
@ -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); |
|
|
|