140 if (_drawData->Textures !=
nullptr)
142 for (ImTextureData* tex : *_drawData->Textures)
143 if (tex->Status != ImTextureStatus_OK)
150 int fb_width = (int)(_drawData->DisplaySize.x * _drawData->FramebufferScale.x);
151 int fb_height = (int)(_drawData->DisplaySize.y * _drawData->FramebufferScale.y);
152 if(fb_width <= 0 || fb_height <= 0)
160 float x = _drawData->DisplayPos.x;
161 float y = _drawData->DisplayPos.y;
162 float width = _drawData->DisplaySize.x;
163 float height = _drawData->DisplaySize.y;
171 const ImVec2 clipPos = _drawData->DisplayPos;
174 const ImVec2 clipScale = _drawData->FramebufferScale;
177 for(int32_t ii = 0, num = _drawData->CmdListsCount; ii < num; ++ii)
182 const ImDrawList* drawList = _drawData->CmdLists[ii];
183 uint32_t numVertices = (uint32_t)drawList->VtxBuffer.size();
184 uint32_t numIndices = (uint32_t)drawList->IdxBuffer.size();
195 ImDrawVert* verts = (ImDrawVert*)tvb.data;
196 bx::memCopy(verts, drawList->VtxBuffer.begin(), numVertices *
sizeof(ImDrawVert));
198 ImDrawIdx*
indices = (ImDrawIdx*)tib.data;
199 bx::memCopy(
indices, drawList->IdxBuffer.begin(), numIndices *
sizeof(ImDrawIdx));
203 std::set<uint32_t> converted{};
205 for(
const ImDrawCmd *cmd = drawList->CmdBuffer.begin(), *cmdEnd = drawList->CmdBuffer.end(); cmd != cmdEnd;
209 if(cmd->UserCallback)
211 cmd->UserCallback(drawList, cmd);
213 else if(0 != cmd->ElemCount)
215 uint64_t state = 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_MSAA;
217 uint8_t tex_index = 0;
224 if(ImTextureID_Invalid != cmd->GetTexID())
226 texture.
id = cmd->GetTexID();
231 for(uint32_t e = 0; e < cmd->ElemCount; ++e)
234 if(converted.emplace(
index).second)
236 auto v = (ImDrawVert*)(verts +
index);
237 v->uv.y = 1.0f -
v->uv.y;
243 ? BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA)
246 tex_index = texture.
s.
index;
247 if(0 != texture.
s.
mip)
249 const float lodEnabled[4] = {float(texture.
s.
mip), 1.0f, 0.0f, 0.0f};
257 const float lodEnabled[4] = {float(texture.
s.
mip), 1.0f, 0.0f, 0.0f};
271 state |= BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA);
276 clipRect.x = (cmd->ClipRect.x - clipPos.x) * clipScale.x;
277 clipRect.y = (cmd->ClipRect.y - clipPos.y) * clipScale.y;
278 clipRect.z = (cmd->ClipRect.z - clipPos.x) * clipScale.x;
279 clipRect.w = (cmd->ClipRect.w - clipPos.y) * clipScale.y;
281 if(clipRect.x < fb_width && clipRect.y < fb_height && clipRect.z >= 0.0f && clipRect.w >= 0.0f)
283 const uint16_t xx = uint16_t(bx::max(clipRect.x, 0.0f));
284 const uint16_t yy = uint16_t(bx::max(clipRect.y, 0.0f));
285 encoder->setScissor(xx,
287 uint16_t(bx::min(clipRect.z, 65535.0f) - xx),
288 uint16_t(bx::min(clipRect.w, 65535.0f) - yy));
290 encoder->setState(state);
291 encoder->setTexture(tex_index,
s_tex, texture.
s.
handle);
292 encoder->setVertexBuffer(0, &tvb, cmd->VtxOffset, numVertices);
293 encoder->setIndexBuffer(&tib, cmd->IdxOffset, cmd->ElemCount);
294 encoder->submit(
id, program);
328 if(
nullptr == _allocator)
330 static bx::DefaultAllocator allocator;
336 m_imgui = ImGui::CreateContext();
337 ImGui::SetCurrentContext(
m_imgui);
339 ImGuiIO& io = ImGui::GetIO();
341 io.DisplaySize = ImVec2(1280.0f, 720.0f);
342 io.DeltaTime = 1.0f / 60.0f;
345 io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;
346 io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports;
349 io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures;
351 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
352 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
355 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
356 platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = (int)caps->limits.maxTextureSize;
360 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
361 io.ConfigWindowsMoveFromTitleBarOnly =
true;
363 io.ConfigDockingTransparentPayload =
true;
364 io.ConfigDpiScaleFonts =
true;
365 io.ConfigDpiScaleViewports =
false;
379 .add(gfx::attribute::Position, 2, gfx::attribute_type::Float)
380 .add(gfx::attribute::TexCoord0, 2, gfx::attribute_type::Float)
381 .add(gfx::attribute::Color0, 4, gfx::attribute_type::Uint8,
true)
390 ImFontGlyphRangesBuilder exclude_ranges_builder;
395 exclude_ranges_builder.AddRanges(frm.
ranges);
398 ImVector<ImWchar> exclude_ranges;
399 exclude_ranges_builder.BuildRanges(&exclude_ranges);
403 config.FontDataOwnedByAtlas =
false;
404 config.MergeMode =
false;
405 config.GlyphExcludeRanges = exclude_ranges.Data;
409 const ImWchar* ranges = io.Fonts->GetGlyphRangesDefault();
411 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Thin");
413 sizeof(inter_thin_ttf),
417 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-ExtraLight");
420 sizeof(inter_extra_light_ttf),
424 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Light");
426 sizeof(inter_light_ttf),
430 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Medium");
432 sizeof(inter_medium_ttf),
436 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-SemiBold");
438 sizeof(inter_semi_bold_ttf),
443 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-ExtraBold");
445 sizeof(inter_extra_bold_ttf),
454 ImFontConfig merge_config;
455 merge_config.FontDataOwnedByAtlas =
false;
456 merge_config.MergeMode =
true;
457 ImFormatString(merge_config.Name, IM_ARRAYSIZE(merge_config.Name),
"%s", frm.
name);
459 io.Fonts->AddFontFromMemoryTTF((
void*)frm.
data, (
int)frm.
size, _fontSize, &merge_config, frm.
ranges);
462 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Black");
464 sizeof(inter_black_ttf),
470 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"RobotoMono-Regular");
472 sizeof(s_robotoMonoRegularTtf),
479 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Regular");
481 sizeof(inter_regular_ttf),
490 ImFontConfig merge_config;
491 merge_config.FontDataOwnedByAtlas =
false;
492 merge_config.MergeMode =
true;
493 ImFormatString(merge_config.Name, IM_ARRAYSIZE(merge_config.Name),
"%s", frm.
name);
494 io.Fonts->AddFontFromMemoryTTF((
void*)frm.
data, (
int)frm.
size, _fontSize, &merge_config, frm.
ranges);
498 sizeof(inter_bold_ttf),
507 ImFontConfig merge_config;
508 merge_config.FontDataOwnedByAtlas =
false;
509 merge_config.MergeMode =
true;
510 ImFormatString(merge_config.Name, IM_ARRAYSIZE(merge_config.Name),
"%s", frm.
name);
512 io.Fonts->AddFontFromMemoryTTF((
void*)frm.
data, (
int)frm.
size, _fontSize, &merge_config, frm.
ranges);