Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. static size_t calc_n_verts(ImDrawData *draw_data) {
  2.     size_t total = 0;
  3.  
  4.     for (int i = 0; i < draw_data->CmdListsCount; i++) {
  5.         auto cmd_list = draw_data->CmdLists[i];
  6.  
  7.         for (int j = 0; j < cmd_list->CmdBuffer.Size; j++) {
  8.             auto pcmd = &cmd_list->CmdBuffer[j];
  9.  
  10.             if (!pcmd->UserCallback) {
  11.                 total += pcmd->ElemCount;
  12.             }
  13.         }
  14.     }
  15.  
  16.     return total;
  17. }
  18.  
  19. static glm::vec4 rgba_to_vec(uint32_t rgba) {
  20.     float r, g, b, a;
  21.     r = static_cast<float>(rgba >> 24) / 255.f;
  22.     g = static_cast<float>((rgba >> 16) & 255) / 255.f;
  23.     b = static_cast<float>((rgba >> 8) & 255) / 255.f;
  24.     a = static_cast<float>(rgba & 255) / 255.f;
  25.  
  26.     return {r, g, b, a};
  27. }
  28.  
  29. size_t imgui_drawer::generate_mesh(ImDrawData *draw_data, vertex *verts) {
  30.     size_t total = 0;
  31.  
  32.     for (int i = 0; i < draw_data->CmdListsCount; i++) {
  33.         auto cmd_list = draw_data->CmdLists[i];
  34.  
  35.         for (int j = 0; j < cmd_list->CmdBuffer.Size; j++) {
  36.             auto pcmd = &cmd_list->CmdBuffer[j];
  37.  
  38.             if (pcmd->UserCallback)
  39.                 continue;
  40.  
  41.             assert(reinterpret_cast<uintptr_t>(pcmd->TextureId) == _tex.get_id());
  42.             for (size_t n = 0; n < pcmd->ElemCount; n++) {
  43.                 vertex &v = verts[n];
  44.                 ImDrawVert &iv = cmd_list->VtxBuffer.Data[cmd_list->IdxBuffer.Data[pcmd->IdxOffset + n]];
  45.                 v.pos = {iv.pos.x, iv.pos.y, 0.f};
  46.                 v.uv = {iv.uv.x, iv.uv.y};
  47.                 v.color = rgba_to_vec(iv.col);
  48.             }
  49.  
  50.             verts += pcmd->ElemCount;
  51.             total += pcmd->ElemCount;
  52.         }
  53.     }
  54.  
  55.     return total;
  56. }
  57.  
  58. void imgui_drawer::update_mesh() {
  59.     size_t n_verts = calc_n_verts(ImGui::GetDrawData());
  60.  
  61.     _mesh.resize(n_verts);
  62.     _mesh.update_sync(&imgui_drawer::generate_mesh, this, ImGui::GetDrawData());
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement