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
60static FontRangeMerge s_fontRangeMerge[] = {
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 backendtexture = (gfx::texture_handle)tex->TexID;
71 if (backendtexture.idx == gfx::invalid_handle)
72 return;
73 gfx::destroy(backendtexture);
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
103 ImGui::ImTexture texture = ImGui::ToTex(backend_texture, 0, {gfx::invalid_handle}, 0, IMGUI_FLAGS_ALPHA_BLEND);
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 {
130 ImGui_ImplGFX_DestroyTexture(tex);
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, caps->homogeneousDepth);
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};
259 program = m_cubemapImageProgram;
260 }
261
262 if(texture.s.phandle.idx != gfx::invalid_handle)
263 {
264 program = texture.s.phandle;
265 }
266 }
267 else
268 {
269 state |= BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA);
270 }
271
272 // Project scissor/clipping rectangles into framebuffer space
273 ImVec4 clipRect;
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;
278
279 if(clipRect.x < fb_width && clipRect.y < fb_height && clipRect.z >= 0.0f && clipRect.w >= 0.0f)
280 {
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,
284 yy,
285 uint16_t(bx::min(clipRect.z, 65535.0f) - xx),
286 uint16_t(bx::min(clipRect.w, 65535.0f) - yy));
287
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);
293 }
294
295
296 }
297 }
298
299 gfx::end(encoder);
300 }
301 }
302
303 void RenderCallback(unravel::render_window* window, ImGuiViewport* viewport, void*)
304 {
305 bool clear = !(viewport->Flags & ImGuiViewportFlags_NoRendererClear);
306
307 auto& pass = window->begin_present_pass();
308
309 if(clear)
310 {
311 pass.clear();
312 }
313
314 renderData(pass.id, viewport->DrawData);
315 }
316
317 void processEvent(os::event& e)
318 {
320 }
321
322 void create(unravel::render_window* window, float _fontSize, bx::AllocatorI* _allocator)
323 {
324 m_allocator = _allocator;
325
326 if(nullptr == _allocator)
327 {
328 static bx::DefaultAllocator allocator;
329 m_allocator = &allocator;
330 }
331
332 ImGui::SetAllocatorFunctions(memAlloc, memFree, nullptr);
333
334 m_imgui = ImGui::CreateContext();
335 ImGui::SetCurrentContext(m_imgui);
336
337 ImGuiIO& io = ImGui::GetIO();
338
339 io.DisplaySize = ImVec2(1280.0f, 720.0f);
340 io.DeltaTime = 1.0f / 60.0f;
341 // io.IniFilename = nullptr;
342
343 io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;
344 io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the
345 // Renderer side (optional)
346
347 io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures;
348
349 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
350 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
351
352 const gfx::caps* caps = gfx::get_caps();
353 ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
354 platform_io.Renderer_TextureMaxWidth = platform_io.Renderer_TextureMaxHeight = (int)caps->limits.maxTextureSize;
355
356
357
358 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
359 io.ConfigWindowsMoveFromTitleBarOnly = true;
360 // io.ConfigViewportsNoTaskBarIcon = true;
361 io.ConfigDockingTransparentPayload = true;
362 io.ConfigDpiScaleFonts = true;
363 io.ConfigDpiScaleViewports = false;
364
366 m_program = gfx::create_program(gfx::create_embedded_shader(s_embeddedShaders, type, "vs_ocornut_imgui"),
367 gfx::create_embedded_shader(s_embeddedShaders, type, "fs_ocornut_imgui"),
368 true);
369
370 u_imageLodEnabled = gfx::create_uniform("u_imageLodEnabled", gfx::uniform_type::Vec4);
371 m_imageProgram = gfx::create_program(gfx::create_embedded_shader(s_embeddedShaders, type, "vs_imgui_image"),
372 gfx::create_embedded_shader(s_embeddedShaders, type, "fs_imgui_image"),
373 true);
374 auto& ctx = unravel::engine::context();
375 auto& am = ctx.get_cached<unravel::asset_manager>();
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");
378
379 m_cubemapImageProgram = gfx::create_program(vs_imgui_cubemap_image.get()->native_handle(), fs_imgui_cubemap_image.get()->native_handle(), false);
380
381 m_layout.begin()
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)
385 .end();
386
387 s_tex = gfx::create_uniform("s_tex", gfx::uniform_type::Sampler);
388
389 uint8_t* data{};
390 int32_t width{};
391 int32_t height{};
392
393 ImFontGlyphRangesBuilder exclude_ranges_builder;
394
395 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
396 {
397 const FontRangeMerge& frm = s_fontRangeMerge[ii];
398 exclude_ranges_builder.AddRanges(frm.ranges);
399 }
400
401 ImVector<ImWchar> exclude_ranges;
402 exclude_ranges_builder.BuildRanges(&exclude_ranges);
403
404 {
405 ImFontConfig config;
406 config.FontDataOwnedByAtlas = false;
407 config.MergeMode = false;
408 config.GlyphExcludeRanges = exclude_ranges.Data;
409
410 // config.MergeGlyphCenterV = true;
411
412 const ImWchar* ranges = io.Fonts->GetGlyphRangesDefault();
413
414 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Thin");
415 m_font[ImGui::Font::Thin] = io.Fonts->AddFontFromMemoryTTF((void*)inter_thin_ttf,
416 sizeof(inter_thin_ttf),
417 _fontSize,
418 &config,
419 ranges);
420 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-ExtraLight");
421
422 m_font[ImGui::Font::ExtraLight] = io.Fonts->AddFontFromMemoryTTF((void*)inter_extra_light_ttf,
423 sizeof(inter_extra_light_ttf),
424 _fontSize,
425 &config,
426 ranges);
427 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Light");
428 m_font[ImGui::Font::Light] = io.Fonts->AddFontFromMemoryTTF((void*)inter_light_ttf,
429 sizeof(inter_light_ttf),
430 _fontSize,
431 &config,
432 ranges);
433 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Medium");
434 m_font[ImGui::Font::Medium] = io.Fonts->AddFontFromMemoryTTF((void*)inter_medium_ttf,
435 sizeof(inter_medium_ttf),
436 _fontSize,
437 &config,
438 ranges);
439 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-SemiBold");
440 m_font[ImGui::Font::SemiBold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_semi_bold_ttf,
441 sizeof(inter_semi_bold_ttf),
442 _fontSize,
443 &config,
444 ranges);
445
446 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-ExtraBold");
447 m_font[ImGui::Font::ExtraBold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_extra_bold_ttf,
448 sizeof(inter_extra_bold_ttf),
449 _fontSize,
450 &config,
451 ranges);
452 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Black");
453 m_font[ImGui::Font::Black] = io.Fonts->AddFontFromMemoryTTF((void*)inter_black_ttf,
454 sizeof(inter_black_ttf),
455 _fontSize,
456 &config,
457 ranges);
458
459
460 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "RobotoMono-Regular");
461 m_font[ImGui::Font::Mono] = io.Fonts->AddFontFromMemoryTTF((void*)s_robotoMonoRegularTtf,
462 sizeof(s_robotoMonoRegularTtf),
463 _fontSize,
464 &config,
465 ranges);
466
467
468
469 ImFormatString(config.Name, IM_ARRAYSIZE(config.Name), "Inter-Regular");
470 m_font[ImGui::Font::Regular] = io.Fonts->AddFontFromMemoryTTF((void*)inter_regular_ttf,
471 sizeof(inter_regular_ttf),
472 _fontSize,
473 &config,
474 ranges);
475
476
477 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
478 {
479 const FontRangeMerge& frm = 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);
485 }
486
487 m_font[ImGui::Font::Bold] = io.Fonts->AddFontFromMemoryTTF((void*)inter_bold_ttf,
488 sizeof(inter_bold_ttf),
489 _fontSize,
490 &config,
491 ranges);
492
493 for(uint32_t ii = 0; ii < BX_COUNTOF(s_fontRangeMerge); ++ii)
494 {
495 const FontRangeMerge& frm = s_fontRangeMerge[ii];
496
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);
501
502 io.Fonts->AddFontFromMemoryTTF((void*)frm.data, (int)frm.size, _fontSize, &merge_config, frm.ranges);
503 }
504 }
505
506 auto render_callback = [this](unravel::render_window* window, ImGuiViewport* viewport, void* args)
507 {
508 RenderCallback(window, viewport, args);
509 };
510
511 auto swap_callback = [this](unravel::render_window* window, ImGuiViewport* viewport, void* args)
512 {
513 };
514
515 ImGui_ImplOSPP_Init(window, render_callback, swap_callback);
516 }
517
518 void destroy()
519 {
520 for(auto tex : ImGui::GetIO().Fonts->TexList)
521 {
522 ImGui_ImplGFX_DestroyTexture(tex);
523 }
524
525 m_keepAlive.clear();
527 ImGui::DestroyContext(m_imgui);
528 ImGui::SetCurrentContext(nullptr);
529
531
536
537 m_allocator = nullptr;
538 }
539
540 void beginFrame(float dt)
541 {
542 m_keepAlive.clear();
543
545
546 ImGui::NewFrame();
547
548 ImGuizmo::BeginFrame();
549 }
550
552 {
553 m_drawCalls = 0;
554 ImGui::Render();
556 renderData(id, ImGui::GetDrawData());
557 }
558
559 ImGuiContext* m_imgui{};
560 bx::AllocatorI* m_allocator{};
565 // gfx::texture_handle m_texture;
568 std::vector<gfx::texture::ptr> m_keepAlive;
570 std::vector<float> m_fontScale{};
571 uint64_t m_drawCalls{};
572};
573
574static OcornutImguiContext s_ctx;
575
576static void* memAlloc(size_t _size, void* _userData)
577{
578 BX_UNUSED(_userData);
579 return bx::alloc(s_ctx.m_allocator, _size);
580}
581
582static void memFree(void* _ptr, void* _userData)
583{
584 BX_UNUSED(_userData);
585 bx::free(s_ctx.m_allocator, _ptr);
586}
587
588void imguiCreate(unravel::render_window* window, float _fontSize, bx::AllocatorI* _allocator)
589{
590 s_ctx.create(window, _fontSize, _allocator);
591}
592
594{
595 s_ctx.destroy();
596}
597
598void imguiProcessEvent(os::event& e)
599{
600 s_ctx.processEvent(e);
601}
602
603void imguiBeginFrame(float dt)
604{
605 s_ctx.beginFrame(dt);
607}
608
610{
611 ImGui::PopFont();
612 s_ctx.endFrame(id);
613}
614
615namespace ImGui
616{
618{
619 auto font = GetFont(_font);
620 PushFont(font, font->LegacySize);
621}
622
623ImFont* GetFont(Font::Enum _font)
624{
625 return s_ctx.m_font[_font];
626}
627
628void PushEnabled(bool _enabled)
629{
630 extern void PushItemFlag(int option, bool enabled);
631 PushItemFlag(ImGuiItemFlags_Disabled, !_enabled);
632 PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * (_enabled ? 1.0f : 0.5f));
633}
634
636{
637 extern void PopItemFlag();
638 PopItemFlag();
639 PopStyleVar();
640}
641
642
644{
645 auto ctx = GetCurrentContext();
646 return (ctx->CurrentItemFlags & ImGuiItemFlags_ReadOnly) != 0;
647}
648
649void PushReadonly(bool _enabled)
650{
651 _enabled |= IsReadonly();
652 extern void PushItemFlag(int option, bool enabled);
653 PushItemFlag(ImGuiItemFlags_ReadOnly, _enabled);
654 //PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * (_enabled ? 0.8f : 1.8f));
655 PushStyleColor(ImGuiCol_Text, _enabled ? GetStyleColorVec4(ImGuiCol_TextDisabled) : GetStyleColorVec4(ImGuiCol_Text));
656}
657
659{
660 extern void PopItemFlag();
661 PopItemFlag();
662 PopStyleColor();
663 //PopStyleVar();
664}
665
667{
668 auto font = ImGui::GetFont();
670 // auto ctx = GetCurrentContext();
671 // ImGuiWindow* window = ctx->CurrentWindow;
672 // IM_ASSERT(window);
673 // auto currentScale = window->FontWindowScale;
674 // s_ctx.m_fontScale.emplace_back(currentScale);
675
676 // auto currentSize = GetFontSize();
677 // float scale = float(size) / currentSize;
678
679 // ImGui::SetWindowFontScale(scale);
680}
681
683{
684 PopFont();
685 // IM_ASSERT(!s_ctx.m_fontScale.empty());
686 // auto scale = s_ctx.m_fontScale.back();
687 // s_ctx.m_fontScale.pop_back();
688 // ImGui::SetWindowFontScale(scale);
689
690}
691
693{
694 auto font = ImGui::GetFont();
695 PushFont(font, font->LegacySize * scale);
696 // auto ctx = GetCurrentContext();
697 // ImGuiWindow* window = ctx->CurrentWindow;
698 // IM_ASSERT(window);
699 // auto currentScale = window->FontWindowScale;
700 // s_ctx.m_fontScale.emplace_back(currentScale);
701
702 // ImGui::SetWindowFontScale(scale);
703}
704
706{
707 PopFont();
708 // IM_ASSERT(!s_ctx.m_fontScale.empty());
709 // auto scale = s_ctx.m_fontScale.back();
710 // s_ctx.m_fontScale.pop_back();
711 // ImGui::SetWindowFontScale(scale);
712
713}
714
715uint64_t GetDrawCalls()
716{
717 return s_ctx.m_drawCalls;
718}
719
721{
722 s_ctx.m_keepAlive.emplace_back(tex);
723}
724
725
726} // namespace ImGui
bool checkAvailTransientBuffers(uint32_t _numVertices, const bgfx::VertexLayout &_layout, uint32_t _numIndices)
Definition bgfx_utils.h:61
manifold_type type
auto native_handle() const -> T
Definition handle_impl.h:40
Manages assets, including loading, unloading, and storage.
auto get_asset(const std::string &key, load_flags flags=load_flags::standard) -> asset_handle< T >
Gets an asset by its key.
float scale
Definition hub.cpp:25
ImGui::Font::Enum font
Definition hub.cpp:24
#define ICON_MIN_MDI
#define ICON_MAX_MDI
void imguiCreate(unravel::render_window *window, float _fontSize, bx::AllocatorI *_allocator)
Definition imgui.cpp:588
void imguiProcessEvent(os::event &e)
Definition imgui.cpp:598
void imguiBeginFrame(float dt)
Definition imgui.cpp:603
void imguiEndFrame(gfx::view_id id)
Definition imgui.cpp:609
void ImGui_ImplGFX_UpdateTexture(ImTextureData *tex)
Definition imgui.cpp:80
void imguiDestroy()
Definition imgui.cpp:593
#define IMGUI_FLAGS_CUBEMAP
Definition imgui.h:42
#define IMGUI_FLAGS_ALPHA_BLEND
Definition imgui.h:40
#define IMGUI_FLAGS_FLIP_UV
Definition imgui.h:41
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
void PushWindowFontSize(int size)
Definition imgui.cpp:666
void PushFont(Font::Enum _font)
Definition imgui.cpp:617
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:87
void PushEnabled(bool _enabled)
Definition imgui.cpp:628
void PopWindowFontScale()
Definition imgui.cpp:705
void PopEnabled()
Definition imgui.cpp:635
bool IsReadonly()
Definition imgui.cpp:643
uint64_t GetDrawCalls()
Definition imgui.cpp:715
ImFont * GetFont(Font::Enum _font)
Definition imgui.cpp:623
void KeepAliveOneFrame(const gfx::texture::ptr &tex)
Definition imgui.cpp:720
void PushWindowFontScale(float scale)
Definition imgui.cpp:692
void PopWindowFontSize()
Definition imgui.cpp:682
void PopReadonly()
Definition imgui.cpp:658
void PushReadonly(bool _enabled)
Definition imgui.cpp:649
void alloc_transient_index_buffer(transient_index_buffer *_tib, uint32_t _num, bool _index32)
Definition graphics.cpp:413
void alloc_transient_vertex_buffer(transient_vertex_buffer *_tvb, uint32_t _num, const vertex_layout &_decl)
Definition graphics.cpp:418
bgfx::VertexLayout vertex_layout
Definition vertex_decl.h:8
void set_view_mode(view_id _id, view_mode _mode)
Definition graphics.cpp:733
renderer_type get_renderer_type()
Definition graphics.cpp:281
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:550
void set_view_rect(view_id _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height)
Definition graphics.cpp:697
const memory_view * make_ref(const void *_data, uint32_t _size, release_fn _releaseFn, void *_userData)
Definition graphics.cpp:306
uniform_handle create_uniform(const char *_name, uniform_type _type, uint16_t _num)
Definition graphics.cpp:652
bgfx::TransientVertexBuffer transient_vertex_buffer
Definition graphics.h:54
shader_handle create_embedded_shader(const embedded_shader *_es, renderer_type _type, const char *_name)
Definition graphics.cpp:245
encoder * begin()
Definition graphics.cpp:265
bgfx::UniformHandle uniform_handle
Definition graphics.h:50
bgfx::TransientIndexBuffer transient_index_buffer
Definition graphics.h:55
program_handle create_program(shader_handle _vsh, shader_handle _fsh, bool _destroyShaders)
Definition graphics.cpp:472
bgfx::TextureHandle texture_handle
Definition graphics.h:49
void set_view_transform(view_id _id, const void *_view, const void *_proj)
Definition graphics.cpp:743
const caps * get_caps()
Definition graphics.cpp:286
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:509
void destroy(index_buffer_handle _handle)
Definition graphics.cpp:341
bgfx::EmbeddedShader embedded_shader
Definition graphics.h:53
bgfx::Caps caps
Definition graphics.h:29
void set_uniform(uniform_handle _handle, const void *_value, uint16_t _num)
Definition graphics.cpp:803
bgfx::ProgramHandle program_handle
Definition graphics.h:47
bgfx::Encoder encoder
Definition graphics.h:38
void end(encoder *_encoder)
Definition graphics.cpp:270
float y
float x
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:54
@ SemiBold
Definition imgui.h:52
@ ExtraLight
Definition imgui.h:48
@ Regular
Definition imgui.h:50
void processEvent(os::event &e)
Definition imgui.cpp:317
ImFont * m_font[ImGui::Font::Count]
Definition imgui.cpp:569
gfx::uniform_handle u_imageLodEnabled
Definition imgui.cpp:567
gfx::program_handle m_imageProgram
Definition imgui.cpp:563
ImGuiContext * m_imgui
Definition imgui.cpp:559
void create(unravel::render_window *window, float _fontSize, bx::AllocatorI *_allocator)
Definition imgui.cpp:322
std::vector< float > m_fontScale
Definition imgui.cpp:570
uint64_t m_drawCalls
Definition imgui.cpp:571
void beginFrame(float dt)
Definition imgui.cpp:540
gfx::vertex_layout m_layout
Definition imgui.cpp:561
void endFrame(gfx::view_id id)
Definition imgui.cpp:551
bx::AllocatorI * m_allocator
Definition imgui.cpp:560
void RenderCallback(unravel::render_window *window, ImGuiViewport *viewport, void *)
Definition imgui.cpp:303
gfx::program_handle m_program
Definition imgui.cpp:562
gfx::uniform_handle s_tex
Definition imgui.cpp:566
std::vector< gfx::texture::ptr > m_keepAlive
Definition imgui.cpp:568
gfx::program_handle m_cubemapImageProgram
Definition imgui.cpp:564
void renderData(gfx::view_id id, ImDrawData *_drawData)
Definition imgui.cpp:136
static auto context() -> rtti::context &
Definition engine.cpp:115
Struct representing a render window.
auto begin_present_pass() -> gfx::render_pass &
Begins the present render pass.
uint8_t mip
Definition imgui.h:81
uint8_t flags
Definition imgui.h:80
ImTextureID id
Definition imgui.h:84
struct ImGui::ImTexture::@57 s
gfx::program_handle phandle
Definition imgui.h:79
gfx::texture_handle handle
Definition imgui.h:78
uint8_t index
Definition imgui.h:82