Ui.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright (C) 2009-2018, 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/core/Config.h>
  7. #include <anki/util/HighRezTimer.h>
  8. #include <anki/Ui.h>
  9. #include <anki/Input.h>
  10. #include <anki/core/StagingGpuMemoryManager.h>
  11. namespace anki
  12. {
  13. static FramebufferPtr createDefaultFb(GrManager& gr)
  14. {
  15. FramebufferInitInfo fbinit;
  16. fbinit.m_colorAttachmentCount = 1;
  17. fbinit.m_colorAttachments[0].m_clearValue.m_colorf = {{1.0, 0.0, 1.0, 1.0}};
  18. return gr.newFramebuffer(fbinit);
  19. }
  20. class Label : public UiImmediateModeBuilder
  21. {
  22. public:
  23. using UiImmediateModeBuilder::UiImmediateModeBuilder;
  24. void build(CanvasPtr canvas) final
  25. {
  26. nk_context* ctx = &canvas->getNkContext();
  27. if(nk_begin(ctx,
  28. "Window name",
  29. nk_rect(10, 10, 200, 500),
  30. NK_WINDOW_BORDER | NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE | NK_WINDOW_MINIMIZABLE | NK_WINDOW_TITLE))
  31. {
  32. nk_layout_row_dynamic(ctx, 30, 1);
  33. canvas->pushFont(canvas->getDefaultFont(), 10);
  34. nk_label(ctx, "Label0", NK_TEXT_ALIGN_LEFT);
  35. canvas->popFont();
  36. canvas->pushFont(canvas->getDefaultFont(), 60);
  37. nk_label(ctx, "Label1", NK_TEXT_ALIGN_LEFT);
  38. canvas->popFont();
  39. }
  40. nk_end(ctx);
  41. }
  42. };
  43. ANKI_TEST(Ui, Ui)
  44. {
  45. Config cfg;
  46. initConfig(cfg);
  47. cfg.set("window.vsync", 1);
  48. cfg.set("window.debugContext", 0);
  49. cfg.set("width", 1024);
  50. cfg.set("height", 760);
  51. NativeWindow* win = createWindow(cfg);
  52. Input* in = new Input();
  53. GrManager* gr = createGrManager(cfg, win);
  54. PhysicsWorld* physics;
  55. ResourceFilesystem* fs;
  56. ResourceManager* resource = createResourceManager(cfg, gr, physics, fs);
  57. UiManager* ui = new UiManager();
  58. ANKI_TEST_EXPECT_NO_ERR(in->init(win));
  59. StagingGpuMemoryManager* stagingMem = new StagingGpuMemoryManager();
  60. ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg));
  61. HeapAllocator<U8> alloc(allocAligned, nullptr);
  62. ANKI_TEST_EXPECT_NO_ERR(ui->init(allocAligned, nullptr, resource, gr, stagingMem, in));
  63. {
  64. FontPtr font;
  65. ANKI_TEST_EXPECT_NO_ERR(
  66. ui->newInstance(font, "engine_data/UbuntuRegular.ttf", std::initializer_list<U32>{10, 20, 30, 60}));
  67. CanvasPtr canvas;
  68. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(canvas, font, 30, win->getWidth(), win->getHeight()));
  69. IntrusivePtr<Label> label;
  70. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(label));
  71. FramebufferPtr fb = createDefaultFb(*gr);
  72. Bool done = false;
  73. while(!done)
  74. {
  75. ANKI_TEST_EXPECT_NO_ERR(in->handleEvents());
  76. HighRezTimer timer;
  77. timer.start();
  78. canvas->handleInput();
  79. if(in->getKey(KeyCode::ESCAPE))
  80. {
  81. done = true;
  82. }
  83. canvas->beginBuilding();
  84. label->build(canvas);
  85. canvas->endBuilding();
  86. gr->beginFrame();
  87. CommandBufferInitInfo cinit;
  88. cinit.m_flags = CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::SMALL_BATCH;
  89. CommandBufferPtr cmdb = gr->newCommandBuffer(cinit);
  90. cmdb->beginRenderPass(fb, {{}}, {});
  91. canvas->appendToCommandBuffer(cmdb);
  92. cmdb->endRenderPass();
  93. cmdb->flush();
  94. gr->swapBuffers();
  95. stagingMem->endFrame();
  96. timer.stop();
  97. const F32 TICK = 1.0 / 30.0;
  98. if(timer.getElapsedTime() < TICK)
  99. {
  100. HighRezTimer::sleep(TICK - timer.getElapsedTime());
  101. }
  102. }
  103. }
  104. delete ui;
  105. delete stagingMem;
  106. delete resource;
  107. delete physics;
  108. delete fs;
  109. GrManager::deleteInstance(gr);
  110. delete in;
  111. delete win;
  112. }
  113. } // end namespace anki