Ui.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <Tests/Framework/Framework.h>
  6. #include <AnKi/GpuMemory/RebarTransientMemoryPool.h>
  7. #include <AnKi/Util/HighRezTimer.h>
  8. #include <AnKi/Ui.h>
  9. #include <AnKi/Window.h>
  10. using namespace anki;
  11. namespace {
  12. class Label : public UiImmediateModeBuilder
  13. {
  14. public:
  15. using UiImmediateModeBuilder::UiImmediateModeBuilder;
  16. Bool m_windowInitialized = false;
  17. U32 m_buttonClickCount = 0;
  18. void build(CanvasPtr canvas) final
  19. {
  20. Vec4 oldBackground = ImGui::GetStyle().Colors[ImGuiCol_WindowBg];
  21. ImGui::GetStyle().Colors[ImGuiCol_WindowBg].w = 0.8f;
  22. ImGui::Begin("ImGui Demo", nullptr);
  23. if(!m_windowInitialized)
  24. {
  25. ImGui::SetWindowPos(Vec2(20, 10));
  26. ImGui::SetWindowSize(Vec2(200, 500));
  27. m_windowInitialized = true;
  28. }
  29. ImGui::Text("Label default size");
  30. canvas->pushFont(canvas->getDefaultFont(), 30);
  31. ImGui::Text("Label size 30");
  32. ImGui::PopFont();
  33. m_buttonClickCount += ImGui::Button("Toggle");
  34. if(m_buttonClickCount & 1)
  35. {
  36. ImGui::Button("Toggled");
  37. }
  38. ImGui::End();
  39. ImGui::GetStyle().Colors[ImGuiCol_WindowBg] = oldBackground;
  40. }
  41. };
  42. } // namespace
  43. ANKI_TEST(Ui, Ui)
  44. {
  45. g_vsyncCVar = true;
  46. g_validationCVar = true;
  47. g_windowWidthCVar = 1024;
  48. g_windowHeightCVar = 760;
  49. g_dataPathsCVar = "EngineAssets";
  50. initWindow();
  51. ANKI_TEST_EXPECT_NO_ERR(Input::allocateSingleton().init());
  52. initGrManager();
  53. ANKI_TEST_EXPECT_NO_ERR(ResourceManager::allocateSingleton().init(allocAligned, nullptr));
  54. UiManager* ui = &UiManager::allocateSingleton();
  55. RebarTransientMemoryPool::allocateSingleton().init();
  56. ANKI_TEST_EXPECT_NO_ERR(ui->init(allocAligned, nullptr));
  57. {
  58. FontPtr font;
  59. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(font, "UbuntuRegular.ttf", Array<U32, 4>{10, 20, 30, 60}));
  60. CanvasPtr canvas;
  61. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(canvas, font, 20, NativeWindow::getSingleton().getWidth(), NativeWindow::getSingleton().getHeight()));
  62. IntrusivePtr<Label, UiObjectDeleter> label;
  63. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(label));
  64. Bool done = false;
  65. while(!done)
  66. {
  67. ANKI_TEST_EXPECT_NO_ERR(Input::getSingleton().handleEvents());
  68. HighRezTimer timer;
  69. timer.start();
  70. canvas->handleInput();
  71. if(Input::getSingleton().getKey(KeyCode::kEscape))
  72. {
  73. done = true;
  74. }
  75. canvas->beginBuilding();
  76. label->build(canvas);
  77. TexturePtr presentTex = GrManager::getSingleton().acquireNextPresentableTexture();
  78. CommandBufferInitInfo cinit;
  79. cinit.m_flags = CommandBufferFlag::kGeneralWork | CommandBufferFlag::kSmallBatch;
  80. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cinit);
  81. TextureBarrierInfo barrier;
  82. barrier.m_previousUsage = TextureUsageBit::kNone;
  83. barrier.m_nextUsage = TextureUsageBit::kRtvDsvWrite;
  84. barrier.m_textureView = TextureView(presentTex.get(), TextureSubresourceDesc::all());
  85. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  86. RenderTarget rt;
  87. rt.m_textureView = TextureView(presentTex.get(), TextureSubresourceDesc::all());
  88. rt.m_clearValue.m_colorf = {{1.0, 0.0, 1.0, 1.0}};
  89. cmdb->beginRenderPass({rt});
  90. canvas->appendToCommandBuffer(*cmdb);
  91. cmdb->endRenderPass();
  92. barrier.m_previousUsage = TextureUsageBit::kRtvDsvWrite;
  93. barrier.m_nextUsage = TextureUsageBit::kPresent;
  94. cmdb->setPipelineBarrier({&barrier, 1}, {}, {});
  95. cmdb->endRecording();
  96. GrManager::getSingleton().submit(cmdb.get());
  97. GrManager::getSingleton().swapBuffers();
  98. RebarTransientMemoryPool::getSingleton().endFrame();
  99. timer.stop();
  100. const F32 TICK = 1.0f / 30.0f;
  101. if(timer.getElapsedTime() < TICK)
  102. {
  103. HighRezTimer::sleep(TICK - timer.getElapsedTime());
  104. }
  105. }
  106. }
  107. UiManager::freeSingleton();
  108. RebarTransientMemoryPool::freeSingleton();
  109. ResourceManager::freeSingleton();
  110. GrManager::freeSingleton();
  111. Input::freeSingleton();
  112. NativeWindow::freeSingleton();
  113. }