Unravel Engine C++ Reference
Loading...
Searching...
No Matches
imgui.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2014-2015 Daniel Collin. All rights reserved.
3 * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE
4 */
5#include "imgui.h"
7
8#include <bgfx/embedded_shader.h>
9#include <bx/allocator.h>
10#include <bx/math.h>
11#include <bx/timer.h>
13#include <imgui/imgui.h>
14#include <imgui/imgui_internal.h>
15#include <set>
16#include <cstdint>
17
18#include "graphics/graphics.h"
23
24
25#include "fonts/icons/icons_material_design_icons.ttf.h"
26
27#include "fonts/roboto/roboto_regular.ttf.h"
28#include "fonts/roboto/robotomono_regular.ttf.h"
29
30#include "fonts/inter/inter_thin.ttf.h"
31#include "fonts/inter/inter_light.ttf.h"
32#include "fonts/inter/inter_extra_light.ttf.h"
33#include "fonts/inter/inter_regular.ttf.h"
34#include "fonts/inter/inter_medium.ttf.h"
35#include "fonts/inter/inter_semi_bold.ttf.h"
36#include "fonts/inter/inter_bold.ttf.h"
37#include "fonts/inter/inter_extra_bold.ttf.h"
38#include "fonts/inter/inter_black.ttf.h"
39
40
41#include <engine/engine.h>
43#include <graphics/shader.h>
44
45static const gfx::embedded_shader s_embeddedShaders[] = {BGFX_EMBEDDED_SHADER(vs_ocornut_imgui),
46 BGFX_EMBEDDED_SHADER(fs_ocornut_imgui),
47 BGFX_EMBEDDED_SHADER(vs_imgui_image),
48 BGFX_EMBEDDED_SHADER(fs_imgui_image),
49
50 BGFX_EMBEDDED_SHADER_END()};
51
53{
54 const char* name;
55 const void* data;
56 size_t size;
57 ImWchar ranges[3];
58};
59
61 {"MaterialDesignIcons", s_iconsMaterialDesignIconsTtf, sizeof(s_iconsMaterialDesignIconsTtf), {ICON_MIN_MDI, ICON_MAX_MDI, 0}},
62};
63
64static void* memAlloc(size_t _size, void* _userData);
65static void memFree(void* _ptr, void* _userData);
66
67
68static void ImGui_ImplGFX_DestroyTexture(ImTextureData* tex)
69{
70 auto tex_data = ImGui::FromId(tex->TexID);
71 if (tex_data.s.handle.idx == gfx::invalid_handle)
72 return;
73 gfx::destroy(tex_data.s.handle);
74
75 // Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
76 tex->SetTexID(ImTextureID_Invalid);
77 tex->SetStatus(ImTextureStatus_Destroyed);
78}
79
80void ImGui_ImplGFX_UpdateTexture(ImTextureData* tex)
81{
82 // ImGui_ImplOSPP_Data* bd = ImGui_ImplOSPP_GetBackendData();
83
84 if (tex->Status == ImTextureStatus_WantCreate)
85 {
86 // Create and upload new texture to graphics system
87 //IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
88 IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
89 IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
90
91 auto bpp = tex->BytesPerPixel;
92
93 // Create texture
94 // !Important. Do not provide a memory view, so the texture is not immutable.
95 auto backend_texture = gfx::create_texture_2d((uint16_t)tex->Width,
96 (uint16_t)tex->Height,
97 false,
98 1,
99 gfx::texture_format::BGRA8,
100 0,
101 nullptr);
102
104
105 gfx::update_texture_2d(backend_texture, 0, 0, 0, 0, tex->Width, tex->Height, gfx::make_ref(tex->GetPixels(), tex->Width * tex->Height * bpp), tex->GetPitch());
106
107 // Store identifiers
108 tex->SetTexID(texture.id);
109 tex->SetStatus(ImTextureStatus_OK);
110 }
111 else if (tex->Status == ImTextureStatus_WantUpdates)
112 {
113 // Update selected blocks. We only ever write to textures regions which have never been used before!
114 // This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
115
116 {
117 auto r = tex->UpdateRect;
118 ImGui::ImTexture texture;
119 texture.id = tex->TexID;
120 auto data = tex->GetPixelsAt(r.x, r.y);
121 auto bpp = tex->BytesPerPixel;
122 gfx::update_texture_2d(texture.s.handle, 0, 0, r.x, r.y, r.w, r.h, gfx::make_ref(data, r.w * r.h * bpp), tex->GetPitch());
123 }
124
125
126 tex->SetStatus(ImTextureStatus_OK);
127 }
128 else if (tex->Status == ImTextureStatus_WantDestroy)
129 {
131 }
132}
133
135{
136 void renderData(gfx::view_id id, ImDrawData* _drawData)
137 {
138 // Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
139 // (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
140 if (_drawData->Textures != nullptr)
141 {
142 for (ImTextureData* tex : *_drawData->Textures)
143 if (tex->Status != ImTextureStatus_OK)
145 }
146
147
148 // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates !=
149 // framebuffer coordinates)
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)
153 return;
154
155 gfx::set_view_mode(id, gfx::view_mode::Sequential);
156
157 const gfx::caps* caps = gfx::get_caps();
158 {
159 float ortho[16];
160 float x = _drawData->DisplayPos.x;
161 float y = _drawData->DisplayPos.y;
162 float width = _drawData->DisplaySize.x;
163 float height = _drawData->DisplaySize.y;
164
165 bx::mtxOrtho(ortho, x, x + width, y + height, y, 0.0f, 1000.0f, 0.0f, gfx::is_homogeneous_depth());
166 gfx::set_view_transform(id, nullptr, ortho);
167 gfx::set_view_rect(id, 0, 0, uint16_t(fb_width), uint16_t(fb_height));
168 }
169
170 // (0,0) unless using multi-viewports
171 const ImVec2 clipPos = _drawData->DisplayPos;
172
173 // (1,1) unless using retina display which are often (2,2)
174 const ImVec2 clipScale = _drawData->FramebufferScale;
175
176 // Render command lists
177 for(int32_t ii = 0, num = _drawData->CmdListsCount; ii < num; ++ii)
178 {
181
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();
185
186 if(!checkAvailTransientBuffers(numVertices, m_layout, numIndices))
187 {
188 // not enough space in transient buffer just quit drawing the rest...
189 break;
190 }
191
193 gfx::alloc_transient_index_buffer(&tib, numIndices, sizeof(ImDrawIdx) == 4);
194
195 ImDrawVert* verts = (ImDrawVert*)tvb.data;
196 bx::memCopy(verts, drawList->VtxBuffer.begin(), numVertices * sizeof(ImDrawVert));
197
198 ImDrawIdx* indices = (ImDrawIdx*)tib.data;
199 bx::memCopy(indices, drawList->IdxBuffer.begin(), numIndices * sizeof(ImDrawIdx));
200
201 gfx::encoder* encoder = gfx::begin();
202
203 std::set<uint32_t> converted{};
204
205 for(const ImDrawCmd *cmd = drawList->CmdBuffer.begin(), *cmdEnd = drawList->CmdBuffer.end(); cmd != cmdEnd;
206 ++cmd)
207 {
208 m_drawCalls++;
209 if(cmd->UserCallback)
210 {
211 cmd->UserCallback(drawList, cmd);
212 }
213 else if(0 != cmd->ElemCount)
214 {
215 uint64_t state = 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_MSAA;
216
217 uint8_t tex_index = 0;
218 // gfx::texture_handle th = m_texture;
220
221
222 ImGui::ImTexture texture;
223
224 if(ImTextureID_Invalid != cmd->GetTexID())
225 {
226 texture.id = cmd->GetTexID();
227
228
229 if(0 != (IMGUI_FLAGS_FLIP_UV & texture.s.flags))
230 {
231 for(uint32_t e = 0; e < cmd->ElemCount; ++e)
232 {
233 auto index = indices[cmd->IdxOffset + e];
234 if(converted.emplace(index).second)
235 {
236 auto v = (ImDrawVert*)(verts + index);
237 v->uv.y = 1.0f - v->uv.y;
238 }
239 }
240 }
241
242 state |= 0 != (IMGUI_FLAGS_ALPHA_BLEND & texture.s.flags)
243 ? BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA)
244 : BGFX_STATE_NONE;
245 //th = texture.s.handle;
246 tex_index = texture.s.index;
247 if(0 != texture.s.mip)
248 {
249 const float lodEnabled[4] = {float(texture.s.mip), 1.0f, 0.0f, 0.0f};
251
252 program = m_imageProgram;
253 }
254
255 if(0 != (IMGUI_FLAGS_CUBEMAP & texture.s.flags))
256 {
257 const float lodEnabled[4] = {float(texture.s.mip), 1.0f, 0.0f, 0.0f};
262 }
263
264 if(texture.s.phandle.idx != gfx::invalid_handle)
265 {
266 program = texture.s.phandle;
267 }
268 }
269 else
270 {
271 state |= BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA);
272 }
273
274 // Project scissor/clipping rectangles into framebuffer space
275 ImVec4 clipRect;
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;
280
281 if(clipRect.x < fb_width && clipRect.y < fb_height && clipRect.z >= 0.0f && clipRect.w >= 0.0f)
282 {
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,
286 yy,
287 uint16_t(bx::min(clipRect.z, 65535.0f) - xx),
288 uint16_t(bx::min(clipRect.w, 65535.0f) - yy));
289
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);
295 }
296
297
298 }
299 }
300
301 gfx::end(encoder);
302 }
303 }
304
305 void RenderCallback(unravel::render_window* window, ImGuiViewport* viewport, void*)
306 {
307 bool clear = !(viewport->Flags & ImGuiViewportFlags_NoRendererClear);
308
309 auto& pass = window->begin_present_pass();
310
311 if(clear)
312 {
313 pass.clear();
314 }
315
316 renderData(pass.id, viewport->DrawData);
317 }
318
319 void processEvent(os::event& e)
320 {
322 }
323
324 void create(unravel::render_window* window, float _fontSize, bx::AllocatorI* _allocator)
325 {
326 m_allocator = _allocator;
327
328 if(nullptr == _allocator)
329 {
330 static bx::DefaultAllocator allocator;
331 m_allocator = &allocator;
332 }
333
334 ImGui::SetAllocatorFunctions(memAlloc, memFree, nullptr);
335
336 m_imgui = ImGui::CreateContext();
337 ImGui::SetCurrentContext(m_imgui);
338
339 ImGuiIO& io = ImGui::GetIO();
340
341 io.DisplaySize = ImVec2(1280.0f, 720.0f);
342 io.DeltaTime = 1.0f / 60.0f;
343 // io.IniFilename = nullptr;
344
345 io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;
346 io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the
347 // Renderer side (optional)
348
349 io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures;
350
351 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
352 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
353
354 const gfx::caps* caps = gfx::get_caps();
355 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
356 platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = (int)caps->limits.maxTextureSize;
357
358
359
360 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
361 io.ConfigWindowsMoveFromTitleBarOnly = true;
362 // io.ConfigViewportsNoTaskBarIcon = true;
363 io.ConfigDockingTransparentPayload = true;
364 io.ConfigDpiScaleFonts = true;
365 io.ConfigDpiScaleViewports = false;
366
370 true);
371
372 u_imageLodEnabled = gfx::create_uniform("u_imageLodEnabled", gfx::uniform_type::Vec4);
375 true);
377
378 m_layout.begin()
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)
382 .end();
383
384 s_tex = gfx::create_uniform("s_tex", gfx::uniform_type::Sampler);
385
386 uint8_t* data{};
387 int32_t width{};
388 int32_t height{};
389
390 ImFontGlyphRangesBuilder exclude_ranges_builder;
391
392 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
393 {
394 const FontRangeMerge& frm = s_fontRangeMerge[ii];
395 exclude_ranges_builder.AddRanges(frm.ranges);
396 }
397
398 ImVector<ImWchar> exclude_ranges;
399 exclude_ranges_builder.BuildRanges(&exclude_ranges);
400
401 {
402 ImFontConfig config;
403 config.FontDataOwnedByAtlas = false;
404 config.MergeMode = false;
405 config.GlyphExcludeRanges = exclude_ranges.Data;
406
407 // config.MergeGlyphCenterV = true;
408
409 const ImWchar* ranges = io.Fonts->GetGlyphRangesDefault();
410
411 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Thin");
412 m_font[ImGui::Font::Thin] = io.Fonts->AddFontFromMemoryTTF((void*)inter_thin_ttf,
413 sizeof(inter_thin_ttf),
414 _fontSize,
415 &config,
416 ranges);
417 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-ExtraLight");
418
419 m_font[ImGui::Font::ExtraLight] = io.Fonts->AddFontFromMemoryTTF((void*)inter_extra_light_ttf,
420 sizeof(inter_extra_light_ttf),
421 _fontSize,
422 &config,
423 ranges);
424 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Light");
425 m_font[ImGui::Font::Light] = io.Fonts->AddFontFromMemoryTTF((void*)inter_light_ttf,
426 sizeof(inter_light_ttf),
427 _fontSize,
428 &config,
429 ranges);
430 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Medium");
431 m_font[ImGui::Font::Medium] = io.Fonts->AddFontFromMemoryTTF((void*)inter_medium_ttf,
432 sizeof(inter_medium_ttf),
433 _fontSize,
434 &config,
435 ranges);
436 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-SemiBold");
437 m_font[ImGui::Font::SemiBold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_semi_bold_ttf,
438 sizeof(inter_semi_bold_ttf),
439 _fontSize,
440 &config,
441 ranges);
442
443 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-ExtraBold");
444 m_font[ImGui::Font::ExtraBold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_extra_bold_ttf,
445 sizeof(inter_extra_bold_ttf),
446 _fontSize,
447 &config,
448 ranges);
449
450 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
451 {
452 const FontRangeMerge& frm = s_fontRangeMerge[ii];
453
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);
458
459 io.Fonts->AddFontFromMemoryTTF((void*)frm.data, (int)frm.size, _fontSize, &merge_config, frm.ranges);
460 }
461
462 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Black");
463 m_font[ImGui::Font::Black] = io.Fonts->AddFontFromMemoryTTF((void*)inter_black_ttf,
464 sizeof(inter_black_ttf),
465 _fontSize,
466 &config,
467 ranges);
468
469
470 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "RobotoMono-Regular");
471 m_font[ImGui::Font::Mono] = io.Fonts->AddFontFromMemoryTTF((void*)s_robotoMonoRegularTtf,
472 sizeof(s_robotoMonoRegularTtf),
473 _fontSize,
474 &config,
475 ranges);
476
477
478
479 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Regular");
480 m_font[ImGui::Font::Regular] = io.Fonts->AddFontFromMemoryTTF((void*)inter_regular_ttf,
481 sizeof(inter_regular_ttf),
482 _fontSize,
483 &config,
484 ranges);
485
486
487 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
488 {
489 const FontRangeMerge& frm = s_fontRangeMerge[ii];
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);
495 }
496
497 m_font[ImGui::Font::Bold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_bold_ttf,
498 sizeof(inter_bold_ttf),
499 _fontSize,
500 &config,
501 ranges);
502
503 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
504 {
505 const FontRangeMerge& frm = s_fontRangeMerge[ii];
506
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);
511
512 io.Fonts->AddFontFromMemoryTTF((void*)frm.data, (int)frm.size, _fontSize, &merge_config, frm.ranges);
513 }
514 }
515
516 auto render_callback = [this](unravel::render_window* window, ImGuiViewport* viewport, void* args)
517 {
518 RenderCallback(window, viewport, args);
519 };
520
521 auto swap_callback = [this](unravel::render_window* window, ImGuiViewport* viewport, void* args)
522 {
523 };
524
525 ImGui_ImplOSPP_Init(window, render_callback, swap_callback);
526 }
527
529 {
530 auto& ctx = unravel::engine::context();
531 auto& am = ctx.get_cached<unravel::asset_manager>();
532 auto vs_imgui_cubemap_image = am.get_asset<gfx::shader>("editor:/data/shaders/imgui/vs_imgui_cubemap_image.sc");
533 auto fs_imgui_cubemap_image = am.get_asset<gfx::shader>("editor:/data/shaders/imgui/fs_imgui_cubemap_image.sc");
534 m_cubemapImageProgram = gfx::create_program(vs_imgui_cubemap_image.get()->native_handle(),
535 fs_imgui_cubemap_image.get()->native_handle(),
536 false);
537 }
538
539 void destroy()
540 {
541 for(auto tex : ImGui::GetIO().Fonts->TexList)
542 {
544 }
545
546 m_keepAlive.clear();
548 ImGui::DestroyContext(m_imgui);
549 ImGui::SetCurrentContext(nullptr);
550
552
556 {
558 }
560
561 m_allocator = nullptr;
562 }
563
564 void beginFrame(float dt)
565 {
566 m_keepAlive.clear();
567
569
570 ImGui::NewFrame();
571
572 ImGuizmo::BeginFrame();
573 }
574
576 {
577 m_drawCalls = 0;
578 ImGui::Render();
580 renderData(id, ImGui::GetDrawData());
581 }
582
583 ImGuiContext* m_imgui{};
584 bx::AllocatorI* m_allocator{};
589 // gfx::texture_handle m_texture;
592 std::vector<gfx::texture::ptr> m_keepAlive;
594 std::vector<float> m_fontScale{};
595 uint64_t m_drawCalls{};
596};
597
599
600static void* memAlloc(size_t _size, void* _userData)
601{
602 BX_UNUSED(_userData);
603 return bx::alloc(s_ctx.m_allocator, _size);
604}
605
606static void memFree(void* _ptr, void* _userData)
607{
608 BX_UNUSED(_userData);
609 bx::free(s_ctx.m_allocator, _ptr);
610}
611
612void imguiCreate(unravel::render_window* window, float _fontSize, bx::AllocatorI* _allocator)
613{
614 s_ctx.create(window, _fontSize, _allocator);
615}
616
621
623{
624 s_ctx.destroy();
625}
626
627void imguiProcessEvent(os::event& e)
628{
630}
631
637
639{
640 ImGui::PopFont();
641 s_ctx.endFrame(id);
642}
643
644namespace ImGui
645{
647{
648 auto font = GetFont(_font);
649 PushFont(font, font->LegacySize);
650}
651
652ImFont* GetFont(Font::Enum _font)
653{
654 return s_ctx.m_font[_font];
655}
656
657void PushEnabled(bool _enabled)
658{
659 extern void PushItemFlag(int option, bool enabled);
660 PushItemFlag(ImGuiItemFlags_Disabled, !_enabled);
661 PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * (_enabled ? 1.0f : 0.5f));
662}
663
665{
666 extern void PopItemFlag();
667 PopItemFlag();
668 PopStyleVar();
669}
670
671
673{
674 auto ctx = GetCurrentContext();
675 return (ctx->CurrentItemFlags & ImGuiItemFlags_ReadOnly) != 0;
676}
677
678void PushReadonly(bool _enabled)
679{
680 _enabled |= IsReadonly();
681 extern void PushItemFlag(int option, bool enabled);
682 PushItemFlag(ImGuiItemFlags_ReadOnly, _enabled);
683 //PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * (_enabled ? 0.8f : 1.8f));
684 PushStyleColor(ImGuiCol_Text, _enabled ? GetStyleColorVec4(ImGuiCol_TextDisabled) : GetStyleColorVec4(ImGuiCol_Text));
685}
686
688{
689 extern void PopItemFlag();
690 PopItemFlag();
691 PopStyleColor();
692 //PopStyleVar();
693}
694
696{
697 auto font = ImGui::GetFont();
699 // auto ctx = GetCurrentContext();
700 // ImGuiWindow* window = ctx->CurrentWindow;
701 // IM_ASSERT(window);
702 // auto currentScale = window->FontWindowScale;
703 // s_ctx.m_fontScale.emplace_back(currentScale);
704
705 // auto currentSize = GetFontSize();
706 // float scale = float(size) / currentSize;
707
708 // ImGui::SetWindowFontScale(scale);
709}
710
712{
713 PopFont();
714 // IM_ASSERT(!s_ctx.m_fontScale.empty());
715 // auto scale = s_ctx.m_fontScale.back();
716 // s_ctx.m_fontScale.pop_back();
717 // ImGui::SetWindowFontScale(scale);
718
719}
720
722{
723 auto font = ImGui::GetFont();
724 PushFont(font, font->LegacySize * scale);
725 // auto ctx = GetCurrentContext();
726 // ImGuiWindow* window = ctx->CurrentWindow;
727 // IM_ASSERT(window);
728 // auto currentScale = window->FontWindowScale;
729 // s_ctx.m_fontScale.emplace_back(currentScale);
730
731 // ImGui::SetWindowFontScale(scale);
732}
733
735{
736 PopFont();
737 // IM_ASSERT(!s_ctx.m_fontScale.empty());
738 // auto scale = s_ctx.m_fontScale.back();
739 // s_ctx.m_fontScale.pop_back();
740 // ImGui::SetWindowFontScale(scale);
741
742}
743
744uint64_t GetDrawCalls()
745{
746 return s_ctx.m_drawCalls;
747}
748
750{
751 s_ctx.m_keepAlive.emplace_back(tex);
752}
753
754
755} // namespace ImGui
uint32_t width
uint32_t height
bool checkAvailTransientBuffers(uint32_t _numVertices, const bgfx::VertexLayout &_layout, uint32_t _numIndices)
Definition bgfx_utils.h:97
auto native_handle() const -> T
Definition handle_impl.h:53
Manages assets, including loading, unloading, and storage.
auto get_asset(const std::string &key, load_flags flags=load_flags::standard, load_mode mode=load_mode::immediate) -> asset_handle< T >
Gets an asset by its key.
float y
float x
uint16_t index
ImGui::Font::Enum font
Definition hub.cpp:30
#define ICON_MIN_MDI
#define ICON_MAX_MDI
static void ImGui_ImplGFX_DestroyTexture(ImTextureData *tex)
Definition imgui.cpp:68
static void * memAlloc(size_t _size, void *_userData)
Definition imgui.cpp:600
void imguiCreate(unravel::render_window *window, float _fontSize, bx::AllocatorI *_allocator)
Definition imgui.cpp:612
void imguiProcessEvent(os::event &e)
Definition imgui.cpp:627
void imguiBeginFrame(float dt)
Definition imgui.cpp:632
void imguiEndFrame(gfx::view_id id)
Definition imgui.cpp:638
static const gfx::embedded_shader s_embeddedShaders[]
Definition imgui.cpp:45
void imguiCreateCubemapProgram()
Definition imgui.cpp:617
void ImGui_ImplGFX_UpdateTexture(ImTextureData *tex)
Definition imgui.cpp:80
static OcornutImguiContext s_ctx
Definition imgui.cpp:598
void imguiDestroy()
Definition imgui.cpp:622
static void memFree(void *_ptr, void *_userData)
Definition imgui.cpp:606
static FontRangeMerge s_fontRangeMerge[]
Definition imgui.cpp:60
#define IMGUI_FLAGS_CUBEMAP
Definition imgui.h:43
#define IMGUI_FLAGS_ALPHA_BLEND
Definition imgui.h:41
#define IMGUI_FLAGS_FLIP_UV
Definition imgui.h:42
void ImGui_ImplOSPP_Shutdown()
void ImGui_ImplOSPP_EndFrame()
auto ImGui_ImplOSPP_Init(unravel::render_window *window, ImGui_ImplOSPP_RenderWindow_Callback render_callback, ImGui_ImplOSPP_SwapBuffers_Callback swap_callback) -> bool
void ImGui_ImplOSPP_NewFrame(float delta_time)
auto ImGui_ImplOSPP_ProcessEvent(os::event &event) -> bool
texture_job_type type
void PushWindowFontSize(int size)
Definition imgui.cpp:695
void PushFont(Font::Enum _font)
Definition imgui.cpp:646
ImTexture ToTex(gfx::texture_handle _handle, uint8_t _index, gfx::program_handle _phandle, uint8_t _mip=0, uint8_t _flags=IMGUI_FLAGS_ALPHA_BLEND)
Definition imgui.h:88
void PushEnabled(bool _enabled)
Definition imgui.cpp:657
void PopWindowFontScale()
Definition imgui.cpp:734
ImTexture FromId(ImTextureID _id)
Definition imgui.h:109
void PopEnabled()
Definition imgui.cpp:664
bool IsReadonly()
Definition imgui.cpp:672
uint64_t GetDrawCalls()
Definition imgui.cpp:744
ImFont * GetFont(Font::Enum _font)
Definition imgui.cpp:652
void KeepAliveOneFrame(const gfx::texture::ptr &tex)
Definition imgui.cpp:749
void PushWindowFontScale(float scale)
Definition imgui.cpp:721
void PopWindowFontSize()
Definition imgui.cpp:711
void PopReadonly()
Definition imgui.cpp:687
void PushReadonly(bool _enabled)
Definition imgui.cpp:678
void alloc_transient_index_buffer(transient_index_buffer *_tib, uint32_t _num, bool _index32)
Definition graphics.cpp:582
void alloc_transient_vertex_buffer(transient_vertex_buffer *_tvb, uint32_t _num, const vertex_layout &_decl)
Definition graphics.cpp:587
bgfx::VertexLayout vertex_layout
Definition vertex_decl.h:8
void set_view_mode(view_id _id, view_mode _mode)
Definition graphics.cpp:902
renderer_type get_renderer_type()
Definition graphics.cpp:440
void update_texture_2d(texture_handle _handle, uint16_t _layer, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const memory_view *_mem, uint16_t _pitch)
Definition graphics.cpp:719
void set_view_rect(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:866
const memory_view * make_ref(const void *_data, uint32_t _size, release_fn _releaseFn, void *_userData)
Definition graphics.cpp:465
uniform_handle create_uniform(const char *_name, uniform_type _type, uint16_t _num)
Definition graphics.cpp:821
bgfx::TransientVertexBuffer transient_vertex_buffer
Definition graphics.h:56
shader_handle create_embedded_shader(const embedded_shader *_es, renderer_type _type, const char *_name)
Definition graphics.cpp:402
encoder * begin()
Definition graphics.cpp:422
bgfx::UniformHandle uniform_handle
Definition graphics.h:52
bgfx::TransientIndexBuffer transient_index_buffer
Definition graphics.h:57
program_handle create_program(shader_handle _vsh, shader_handle _fsh, bool _destroyShaders)
Definition graphics.cpp:641
void set_view_transform(view_id _id, const void *_view, const void *_proj)
Definition graphics.cpp:912
const caps * get_caps()
Definition graphics.cpp:445
static const uint16_t invalid_handle
Definition graphics.h:18
bgfx::ViewId view_id
Definition graphics.h:20
texture_handle create_texture_2d(uint16_t _width, uint16_t _height, bool _hasMips, uint16_t _numLayers, texture_format _format, uint64_t _flags, const memory_view *_mem)
Definition graphics.cpp:678
void destroy(index_buffer_handle _handle)
Definition graphics.cpp:505
bgfx::EmbeddedShader embedded_shader
Definition graphics.h:55
bgfx::Caps caps
Definition graphics.h:30
void set_uniform(uniform_handle _handle, const void *_value, uint16_t _num)
Definition graphics.cpp:977
bgfx::ProgramHandle program_handle
Definition graphics.h:49
auto is_homogeneous_depth() -> bool
bgfx::Encoder encoder
Definition graphics.h:39
void end(encoder *_encoder)
Definition graphics.cpp:427
std::vector< float > scale
std::vector< uint32_t > indices
size_t size
Definition imgui.cpp:56
ImWchar ranges[3]
Definition imgui.cpp:57
const char * name
Definition imgui.cpp:54
const void * data
Definition imgui.cpp:55
@ ExtraBold
Definition imgui.h:55
@ SemiBold
Definition imgui.h:53
@ ExtraLight
Definition imgui.h:49
@ Regular
Definition imgui.h:51
void processEvent(os::event &e)
Definition imgui.cpp:319
ImFont * m_font[ImGui::Font::Count]
Definition imgui.cpp:593
gfx::uniform_handle u_imageLodEnabled
Definition imgui.cpp:591
gfx::program_handle m_imageProgram
Definition imgui.cpp:587
ImGuiContext * m_imgui
Definition imgui.cpp:583
void create(unravel::render_window *window, float _fontSize, bx::AllocatorI *_allocator)
Definition imgui.cpp:324
std::vector< float > m_fontScale
Definition imgui.cpp:594
uint64_t m_drawCalls
Definition imgui.cpp:595
void beginFrame(float dt)
Definition imgui.cpp:564
gfx::vertex_layout m_layout
Definition imgui.cpp:585
void endFrame(gfx::view_id id)
Definition imgui.cpp:575
void createCubemapProgram()
Definition imgui.cpp:528
bx::AllocatorI * m_allocator
Definition imgui.cpp:584
void RenderCallback(unravel::render_window *window, ImGuiViewport *viewport, void *)
Definition imgui.cpp:305
gfx::program_handle m_program
Definition imgui.cpp:586
gfx::uniform_handle s_tex
Definition imgui.cpp:590
std::vector< gfx::texture::ptr > m_keepAlive
Definition imgui.cpp:592
gfx::program_handle m_cubemapImageProgram
Definition imgui.cpp:588
void renderData(gfx::view_id id, ImDrawData *_drawData)
Definition imgui.cpp:136
static auto context() -> rtti::context &
Definition engine.cpp:111
Struct representing a render window.
auto begin_present_pass() -> gfx::render_pass &
Begins the present render pass.
uint8_t mip
Definition imgui.h:82
uint8_t flags
Definition imgui.h:81
ImTextureID id
Definition imgui.h:85
struct ImGui::ImTexture::@58 s
gfx::program_handle phandle
Definition imgui.h:80
gfx::texture_handle handle
Definition imgui.h:79
uint8_t index
Definition imgui.h:83
bool enabled