Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static size_t calc_n_verts(ImDrawData *draw_data) {
- size_t total = 0;
- for (int i = 0; i < draw_data->CmdListsCount; i++) {
- auto cmd_list = draw_data->CmdLists[i];
- for (int j = 0; j < cmd_list->CmdBuffer.Size; j++) {
- auto pcmd = &cmd_list->CmdBuffer[j];
- if (!pcmd->UserCallback) {
- total += pcmd->ElemCount;
- }
- }
- }
- return total;
- }
- static glm::vec4 rgba_to_vec(uint32_t rgba) {
- float r, g, b, a;
- r = static_cast<float>(rgba >> 24) / 255.f;
- g = static_cast<float>((rgba >> 16) & 255) / 255.f;
- b = static_cast<float>((rgba >> 8) & 255) / 255.f;
- a = static_cast<float>(rgba & 255) / 255.f;
- return {r, g, b, a};
- }
- size_t imgui_drawer::generate_mesh(ImDrawData *draw_data, vertex *verts) {
- size_t total = 0;
- for (int i = 0; i < draw_data->CmdListsCount; i++) {
- auto cmd_list = draw_data->CmdLists[i];
- for (int j = 0; j < cmd_list->CmdBuffer.Size; j++) {
- auto pcmd = &cmd_list->CmdBuffer[j];
- if (pcmd->UserCallback)
- continue;
- assert(reinterpret_cast<uintptr_t>(pcmd->TextureId) == _tex.get_id());
- for (size_t n = 0; n < pcmd->ElemCount; n++) {
- vertex &v = verts[n];
- ImDrawVert &iv = cmd_list->VtxBuffer.Data[cmd_list->IdxBuffer.Data[pcmd->IdxOffset + n]];
- v.pos = {iv.pos.x, iv.pos.y, 0.f};
- v.uv = {iv.uv.x, iv.uv.y};
- v.color = rgba_to_vec(iv.col);
- }
- verts += pcmd->ElemCount;
- total += pcmd->ElemCount;
- }
- }
- return total;
- }
- void imgui_drawer::update_mesh() {
- size_t n_verts = calc_n_verts(ImGui::GetDrawData());
- _mesh.resize(n_verts);
- _mesh.update_sync(&imgui_drawer::generate_mesh, this, ImGui::GetDrawData());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement