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;
165 bx::mtxOrtho(ortho,
x,
x + width,
y + height,
y, 0.0f, 1000.0f, 0.0f, caps->homogeneousDepth);
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)
233 auto index = indices[cmd->IdxOffset + 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};
262 if(texture.
s.
phandle.idx != gfx::invalid_handle)
269 state |= BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA);
274 clipRect.x = (cmd->ClipRect.x - clipPos.x) * clipScale.x;
275 clipRect.y = (cmd->ClipRect.y - clipPos.y) * clipScale.y;
276 clipRect.z = (cmd->ClipRect.z - clipPos.x) * clipScale.x;
277 clipRect.w = (cmd->ClipRect.w - clipPos.y) * clipScale.y;
279 if(clipRect.x < fb_width && clipRect.y < fb_height && clipRect.z >= 0.0f && clipRect.w >= 0.0f)
281 const uint16_t xx = uint16_t(bx::max(clipRect.x, 0.0f));
282 const uint16_t yy = uint16_t(bx::max(clipRect.y, 0.0f));
283 encoder->setScissor(xx,
285 uint16_t(bx::min(clipRect.z, 65535.0f) - xx),
286 uint16_t(bx::min(clipRect.w, 65535.0f) - yy));
288 encoder->setState(state);
289 encoder->setTexture(tex_index,
s_tex, texture.
s.
handle);
290 encoder->setVertexBuffer(0, &tvb, cmd->VtxOffset, numVertices);
291 encoder->setIndexBuffer(&tib, cmd->IdxOffset, cmd->ElemCount);
292 encoder->submit(
id, program);
326 if(
nullptr == _allocator)
328 static bx::DefaultAllocator allocator;
332 ImGui::SetAllocatorFunctions(memAlloc, memFree,
nullptr);
334 m_imgui = ImGui::CreateContext();
335 ImGui::SetCurrentContext(
m_imgui);
337 ImGuiIO& io = ImGui::GetIO();
339 io.DisplaySize = ImVec2(1280.0f, 720.0f);
340 io.DeltaTime = 1.0f / 60.0f;
343 io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;
344 io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports;
347 io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures;
349 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
350 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
353 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
354 platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = (int)caps->limits.maxTextureSize;
358 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
359 io.ConfigWindowsMoveFromTitleBarOnly =
true;
361 io.ConfigDockingTransparentPayload =
true;
362 io.ConfigDpiScaleFonts =
true;
363 io.ConfigDpiScaleViewports =
false;
376 auto vs_imgui_cubemap_image = am.
get_asset<
gfx::shader>(
"editor:/data/shaders/imgui/vs_imgui_cubemap_image.sc");
377 auto fs_imgui_cubemap_image = am.get_asset<
gfx::shader>(
"editor:/data/shaders/imgui/fs_imgui_cubemap_image.sc");
382 .add(gfx::attribute::Position, 2, gfx::attribute_type::Float)
383 .add(gfx::attribute::TexCoord0, 2, gfx::attribute_type::Float)
384 .add(gfx::attribute::Color0, 4, gfx::attribute_type::Uint8,
true)
393 ImFontGlyphRangesBuilder exclude_ranges_builder;
395 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
398 exclude_ranges_builder.AddRanges(frm.
ranges);
401 ImVector<ImWchar> exclude_ranges;
402 exclude_ranges_builder.BuildRanges(&exclude_ranges);
406 config.FontDataOwnedByAtlas =
false;
407 config.MergeMode =
false;
408 config.GlyphExcludeRanges = exclude_ranges.Data;
412 const ImWchar* ranges = io.Fonts->GetGlyphRangesDefault();
414 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Thin");
416 sizeof(inter_thin_ttf),
420 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-ExtraLight");
423 sizeof(inter_extra_light_ttf),
427 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Light");
429 sizeof(inter_light_ttf),
433 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Medium");
435 sizeof(inter_medium_ttf),
439 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-SemiBold");
441 sizeof(inter_semi_bold_ttf),
446 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-ExtraBold");
448 sizeof(inter_extra_bold_ttf),
452 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Black");
454 sizeof(inter_black_ttf),
460 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"RobotoMono-Regular");
462 sizeof(s_robotoMonoRegularTtf),
469 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name),
"Inter-Regular");
471 sizeof(inter_regular_ttf),
477 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
480 ImFontConfig merge_config;
481 merge_config.FontDataOwnedByAtlas =
false;
482 merge_config.MergeMode =
true;
483 ImFormatString(merge_config.Name, IM_ARRAYSIZE(merge_config.Name),
"%s", frm.
name);
484 io.Fonts->AddFontFromMemoryTTF((
void*)frm.
data, (
int)frm.
size, _fontSize, &merge_config, frm.
ranges);
488 sizeof(inter_bold_ttf),
493 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
497 ImFontConfig merge_config;
498 merge_config.FontDataOwnedByAtlas =
false;
499 merge_config.MergeMode =
true;
500 ImFormatString(merge_config.Name, IM_ARRAYSIZE(merge_config.Name),
"%s", frm.
name);
502 io.Fonts->AddFontFromMemoryTTF((
void*)frm.
data, (
int)frm.
size, _fontSize, &merge_config, frm.
ranges);