Ui.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright (C) 2009-2016, 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.newInstance<Framebuffer>(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, 800),
  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("vsync", 1);
  48. cfg.set("debugContext", 0);
  49. NativeWindow* win = createWindow(cfg);
  50. Input* in = new Input();
  51. GrManager* gr = createGrManager(cfg, win);
  52. PhysicsWorld* physics;
  53. ResourceFilesystem* fs;
  54. ResourceManager* resource = createResourceManager(cfg, gr, physics, fs);
  55. UiManager* ui = new UiManager();
  56. ANKI_TEST_EXPECT_NO_ERR(in->init(win));
  57. StagingGpuMemoryManager* stagingMem = new StagingGpuMemoryManager();
  58. ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg));
  59. HeapAllocator<U8> alloc(allocAligned, nullptr);
  60. ANKI_TEST_EXPECT_NO_ERR(ui->init(alloc, resource, gr, stagingMem, in));
  61. {
  62. FontPtr font;
  63. ANKI_TEST_EXPECT_NO_ERR(
  64. ui->newInstance(font, "engine_data/UbuntuRegular.ttf", std::initializer_list<U32>{10, 20, 30, 60}));
  65. CanvasPtr canvas;
  66. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(canvas, font, 30));
  67. IntrusivePtr<Label> label;
  68. ANKI_TEST_EXPECT_NO_ERR(ui->newInstance(label));
  69. FramebufferPtr fb = createDefaultFb(*gr);
  70. U iterations = 300;
  71. while(iterations--)
  72. {
  73. ANKI_TEST_EXPECT_NO_ERR(in->handleEvents());
  74. HighRezTimer timer;
  75. timer.start();
  76. canvas->handleInput();
  77. canvas->beginBuilding();
  78. label->build(canvas);
  79. canvas->endBuilding();
  80. gr->beginFrame();
  81. CommandBufferInitInfo cinit;
  82. cinit.m_flags = CommandBufferFlag::GRAPHICS_WORK | CommandBufferFlag::SMALL_BATCH;
  83. CommandBufferPtr cmdb = gr->newInstance<CommandBuffer>(cinit);
  84. cmdb->beginRenderPass(fb);
  85. canvas->appendToCommandBuffer(cmdb);
  86. cmdb->endRenderPass();
  87. cmdb->flush();
  88. gr->swapBuffers();
  89. stagingMem->endFrame();
  90. timer.stop();
  91. const F32 TICK = 1.0 / 30.0;
  92. if(timer.getElapsedTime() < TICK)
  93. {
  94. HighRezTimer::sleep(TICK - timer.getElapsedTime());
  95. }
  96. }
  97. }
  98. delete ui;
  99. delete stagingMem;
  100. delete resource;
  101. delete physics;
  102. delete fs;
  103. delete gr;
  104. delete in;
  105. delete win;
  106. }
  107. } // end namespace anki