void ImGui_ImplA5_RenderDrawLists(ImDrawData* draw_data) { int op, src, dst; al_get_blender(&op, &src, &dst); al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA); for (int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; // FIXME-OPT: Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 floats static ImVector<ImDrawVertAllegro> vertices; vertices.resize(cmd_list->VtxBuffer.Size); for (int i = 0; i < cmd_list->VtxBuffer.Size; ++i) { const ImDrawVert &dv = cmd_list->VtxBuffer[i]; ImDrawVertAllegro v; v.pos = dv.pos; v.uv = dv.uv; unsigned char *c = (unsigned char*)&dv.col; v.col = al_map_rgba(c[0], c[1], c[2], c[3]); vertices[i] = v; } // FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices // You can also use '#define ImDrawIdx unsigned int' in imconfig.h and request ImGui to output 32-bit indices static ImVector<int> indices; indices.resize(cmd_list->IdxBuffer.Size); for (int i = 0; i < cmd_list->IdxBuffer.Size; ++i) indices[i] = (int)cmd_list->IdxBuffer.Data[i]; int idx_offset = 0; for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; if (pcmd->UserCallback) { pcmd->UserCallback(cmd_list, pcmd); } else { ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->TextureId; al_set_clipping_rectangle(pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z-pcmd->ClipRect.x, pcmd->ClipRect.w-pcmd->ClipRect.y); al_draw_indexed_prim(&vertices[0], g_VertexDecl, texture, &indices[idx_offset], pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST); } idx_offset += pcmd->ElemCount; } } // Restore modified state al_set_blender(op, src, dst); al_set_clipping_rectangle(0, 0, al_get_display_width(g_Display), al_get_display_height(g_Display)); }
// If you get an error please report on GitHub. You may try different GL context version or GLSL version. static bool CheckProgram(GLuint handle, const char* desc) { GLint status = 0, log_length = 0; glGetProgramiv(handle, GL_LINK_STATUS, &status); glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length); if ((GLboolean)status == GL_FALSE) fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! (with GLSL '%s')\n", desc, g_GlslVersionString); if (log_length > 0) { ImVector<char> buf; buf.resize((int)(log_length + 1)); glGetProgramInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); fprintf(stderr, "%s\n", buf.begin()); } return (GLboolean)status == GL_TRUE; }
// If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file. static bool CheckShader(GLuint handle, const char* desc) { GLint status = 0, log_length = 0; glGetShaderiv(handle, GL_COMPILE_STATUS, &status); glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length); if ((GLboolean)status == GL_FALSE) fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s!\n", desc); if (log_length > 0) { ImVector<char> buf; buf.resize((int)(log_length + 1)); glGetShaderInfoLog(handle, log_length, NULL, (GLchar*)buf.begin()); fprintf(stderr, "%s\n", buf.begin()); } return (GLboolean)status == GL_TRUE; }
bool ImGuiFreeType::BuildFontAtlas(ImFontAtlas* atlas, unsigned int extra_flags) { IM_ASSERT(atlas->ConfigData.Size > 0); IM_ASSERT(atlas->TexGlyphPadding == 1); // Not supported ImFontAtlasBuildRegisterDefaultCustomRects(atlas); atlas->TexID = NULL; atlas->TexWidth = atlas->TexHeight = 0; atlas->TexUvScale = ImVec2(0.0f, 0.0f); atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f); atlas->ClearTexData(); ImVector<FreeTypeFont> fonts; fonts.resize(atlas->ConfigData.Size); ImVec2 max_glyph_size(1.0f, 1.0f); // Count glyphs/ranges, initialize font int total_glyphs_count = 0; int total_ranges_count = 0; for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) { ImFontConfig& cfg = atlas->ConfigData[input_i]; FreeTypeFont& font_face = fonts[input_i]; IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas)); if (!font_face.Init(cfg, extra_flags)) return false; max_glyph_size.x = ImMax(max_glyph_size.x, font_face.Info.MaxAdvanceWidth); max_glyph_size.y = ImMax(max_glyph_size.y, font_face.Info.Ascender - font_face.Info.Descender); if (!cfg.GlyphRanges) cfg.GlyphRanges = atlas->GetGlyphRangesDefault(); for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[ 1 ]; in_range += 2, total_ranges_count++) total_glyphs_count += (in_range[1] - in_range[0]) + 1; } // We need a width for the skyline algorithm. Using a dumb heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish. // Width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height. atlas->TexWidth = (atlas->TexDesiredWidth > 0) ? atlas->TexDesiredWidth : (total_glyphs_count > 4000) ? 4096 : (total_glyphs_count > 2000) ? 2048 : (total_glyphs_count > 1000) ? 1024 : 512; // We don't do the original first pass to determine texture height, but just rough estimate. // Looks ugly inaccurate and excessive, but AFAIK with FreeType we actually need to render glyphs to get exact sizes. // Alternatively, we could just render all glyphs into a big shadow buffer, get their sizes, do the rectangle packing and just copy back from the // shadow buffer to the texture buffer. Will give us an accurate texture height, but eat a lot of temp memory. Probably no one will notice.) const int total_rects = total_glyphs_count + atlas->CustomRects.size(); float min_rects_per_row = ceilf((atlas->TexWidth / (max_glyph_size.x + 1.0f))); float min_rects_per_column = ceilf(total_rects / min_rects_per_row); atlas->TexHeight = (int)(min_rects_per_column * (max_glyph_size.y + 1.0f)); // Create texture atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight); atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); atlas->TexPixelsAlpha8 = (unsigned char*)ImGui::MemAlloc(atlas->TexWidth * atlas->TexHeight); memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); // Start packing ImVector<stbrp_node> pack_nodes; pack_nodes.resize(total_rects); stbrp_context context; stbrp_init_target(&context, atlas->TexWidth, atlas->TexHeight, pack_nodes.Data, total_rects); // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). ImFontAtlasBuildPackCustomRects(atlas, &context); // Render characters, setup ImFont and glyphs for runtime for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++) { ImFontConfig& cfg = atlas->ConfigData[input_i]; FreeTypeFont& font_face = fonts[input_i]; ImFont* dst_font = cfg.DstFont; if (cfg.MergeMode) dst_font->BuildLookupTable(); const float ascent = font_face.Info.Ascender; const float descent = font_face.Info.Descender; ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); const float font_off_x = cfg.GlyphOffset.x; const float font_off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f); bool multiply_enabled = (cfg.RasterizerMultiply != 1.0f); unsigned char multiply_table[256]; if (multiply_enabled) ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply); for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2) { for (uint32_t codepoint = in_range[0]; codepoint <= in_range[1]; ++codepoint) { if (cfg.MergeMode && dst_font->FindGlyphNoFallback((unsigned short)codepoint)) continue; FT_Glyph ft_glyph = NULL; FT_BitmapGlyph ft_glyph_bitmap = NULL; // NB: will point to bitmap within FT_Glyph GlyphInfo glyph_info; if (!font_face.CalcGlyphInfo(codepoint, glyph_info, ft_glyph, ft_glyph_bitmap)) continue; // Pack rectangle stbrp_rect rect; rect.w = (uint16_t)glyph_info.Width + 1; // Account for texture filtering rect.h = (uint16_t)glyph_info.Height + 1; stbrp_pack_rects(&context, &rect, 1); // Copy rasterized pixels to main texture uint8_t* blit_dst = atlas->TexPixelsAlpha8 + rect.y * atlas->TexWidth + rect.x; font_face.BlitGlyph(ft_glyph_bitmap, blit_dst, atlas->TexWidth, multiply_enabled ? multiply_table : NULL); FT_Done_Glyph(ft_glyph); float char_advance_x_org = glyph_info.AdvanceX; float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX); float char_off_x = font_off_x; if (char_advance_x_org != char_advance_x_mod) char_off_x += cfg.PixelSnapH ? (float)(int)((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f; // Register glyph dst_font->AddGlyph((ImWchar)codepoint, glyph_info.OffsetX + char_off_x, glyph_info.OffsetY + font_off_y, glyph_info.OffsetX + char_off_x + glyph_info.Width, glyph_info.OffsetY + font_off_y + glyph_info.Height, rect.x / (float)atlas->TexWidth, rect.y / (float)atlas->TexHeight, (rect.x + glyph_info.Width) / (float)atlas->TexWidth, (rect.y + glyph_info.Height) / (float)atlas->TexHeight, char_advance_x_mod); } } } // Cleanup for (int n = 0; n < fonts.Size; n++) fonts[n].Shutdown(); ImFontAtlasBuildFinish(atlas); return true; }
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the // ImGuiIO structure) // If text or lines are blurry when integrating ImGui in your engine: // - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f) void ImGui_ImplSdlGLES2_RenderDrawLists(ImDrawData *draw_data) { // Backup GL state GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer); GLint last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, &last_blend_equation_rgb); GLint last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &last_blend_equation_alpha); GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); GLboolean last_enable_blend = glIsEnabled(GL_BLEND); GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST); // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled glEnable(GL_BLEND); glBlendEquation(GL_FUNC_ADD); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glEnable(GL_SCISSOR_TEST); glActiveTexture(GL_TEXTURE0); // Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays) ImGuiIO &io = ImGui::GetIO(); float fb_height = io.DisplaySize.y * io.DisplayFramebufferScale.y; draw_data->ScaleClipRects(io.DisplayFramebufferScale); // Setup orthographic projection matrix glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); const float ortho_projection[4][4] = { {2.0f / io.DisplaySize.x, 0.0f, 0.0f, 0.0f}, {0.0f, 2.0f / -io.DisplaySize.y, 0.0f, 0.0f}, {0.0f, 0.0f, -1.0f, 0.0f}, {-1.0f, 1.0f, 0.0f, 1.0f}, }; glUseProgram(g_ShaderHandle); glUniform1i(g_AttribLocationTex, 0); glUniformMatrix4fv(g_AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); for (int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList *cmd_list = draw_data->CmdLists[n]; const ImDrawIdx *idx_buffer_offset = 0; GLint vtx_buffer_offset = 0; glBindBuffer(GL_ARRAY_BUFFER, g_VboHandle); if (g_DrawElemWorkaround) { ImVector<ImDrawVert> vertices; vertices.reserve(cmd_list->IdxBuffer.size()); for (auto &id : cmd_list->IdxBuffer) vertices.push_back(cmd_list->VtxBuffer[id]); glBufferData( GL_ARRAY_BUFFER, (GLsizeiptr)vertices.size() * sizeof(ImDrawVert), (GLvoid *)&vertices.front(), GL_STREAM_DRAW); } else { glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)cmd_list->VtxBuffer.size() * sizeof(ImDrawVert), (GLvoid *)&cmd_list->VtxBuffer.front(), GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ElementsHandle); glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx), (GLvoid *)&cmd_list->IdxBuffer.front(), GL_STREAM_DRAW); } for (const ImDrawCmd *pcmd = cmd_list->CmdBuffer.begin(); pcmd != cmd_list->CmdBuffer.end(); pcmd++) { if (pcmd->UserCallback) { pcmd->UserCallback(cmd_list, pcmd); } else { glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); glScissor((int)pcmd->ClipRect.x, (int)(fb_height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y)); if (g_DrawElemWorkaround) glDrawArrays( GL_TRIANGLES, vtx_buffer_offset, (GLsizei)pcmd->ElemCount); // WARNING: inefficient workaround for devices not supporting GL_UNSIGNED_INT else glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); } if (g_DrawElemWorkaround) vtx_buffer_offset += pcmd->ElemCount; else idx_buffer_offset += pcmd->ElemCount; } } // Restore modified GL state glUseProgram(last_program); glBindTexture(GL_TEXTURE_2D, last_texture); glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer); glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND); if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); }
// Really dumb data structure provided for the example. // Note that we storing links are INDICES (not ID) to make example code shorter, obviously a bad idea for any general purpose code. void ShowExampleAppCustomNodeGraph(bool* opened) { ImGui::SetNextWindowSize(ImVec2(700, 600), ImGuiSetCond_FirstUseEver); /* begin a ImGui window */ if (!ImGui::Begin("Example: Custom Node Graph", opened)) { ImGui::End(); return; } /* define your custom data structure */ // Dummy struct Node { int ID; char Name[32]; ImVec2 Pos, Size; float Value; ImVec4 Color; int InputsCount, OutputsCount; Node(int id, const char* name, const ImVec2& pos, float value, const ImVec4& color, int inputs_count, int outputs_count) { ID = id; strncpy(Name, name, 31); Name[31] = 0; Pos = pos; Value = value; Color = color; InputsCount = inputs_count; OutputsCount = outputs_count; } ImVec2 GetInputSlotPos(int slot_no) const { return ImVec2(Pos.x, Pos.y + Size.y * ((float)slot_no + 1) / ((float)InputsCount + 1)); } ImVec2 GetOutputSlotPos(int slot_no) const { return ImVec2(Pos.x + Size.x, Pos.y + Size.y * ((float)slot_no + 1) / ((float)OutputsCount + 1)); } }; struct NodeLink { int InputIdx, InputSlot, OutputIdx, OutputSlot; NodeLink(int input_idx, int input_slot, int output_idx, int output_slot) { InputIdx = input_idx; InputSlot = input_slot; OutputIdx = output_idx; OutputSlot = output_slot; } }; static ImVector<Node> nodes; static ImVector<NodeLink> links; static bool inited = false; static ImVec2 scrolling = ImVec2(0.0f, 0.0f); static bool show_grid = true; static int node_selected = -1; if (!inited) { nodes.push_back(Node(0, "MainTex", ImVec2(40, 50), 0.5f, ImColor(255, 100, 100), 1, 1)); nodes.push_back(Node(1, "BumpMap", ImVec2(40, 150), 0.42f, ImColor(200, 100, 200), 1, 1)); nodes.push_back(Node(2, "Combine", ImVec2(270, 80), 1.0f, ImColor(0, 200, 100), 2, 2)); links.push_back(NodeLink(0, 0, 2, 0)); links.push_back(NodeLink(1, 0, 2, 1)); inited = true; } // Draw a list of nodes on the left side bool open_context_menu = false; int node_hovered_in_list = -1; int node_hovered_in_scene = -1; ImGui::BeginChild("node_list", ImVec2(100, 0)); ImGui::Text("Nodes"); ImGui::Separator(); for (int node_idx = 0; node_idx < nodes.Size; node_idx++) { Node* node = &nodes[node_idx]; ImGui::PushID(node->ID); /* draw and check if selected */ if (ImGui::Selectable(node->Name, node->ID == node_selected)) node_selected = node->ID; /* check if Hovered. */ if (ImGui::IsItemHovered()) { node_hovered_in_list = node->ID; open_context_menu |= ImGui::IsMouseClicked(1); } ImGui::PopID(); } ImGui::EndChild(); ImGui::SameLine(); ImGui::BeginGroup(); const float NODE_SLOT_RADIUS = 4.0f; const ImVec2 NODE_WINDOW_PADDING(8.0f, 8.0f); // Create our child canvas ImGui::Text("Hold middle mouse button to scroll (%.2f,%.2f)", scrolling.x, scrolling.y); ImGui::SameLine(ImGui::GetWindowWidth() - 100); ImGui::Checkbox("Show grid", &show_grid); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(1, 1)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); ImGui::PushStyleColor(ImGuiCol_ChildWindowBg, ImColor(60, 60, 70, 200)); ImGui::BeginChild("scrolling_region", ImVec2(0, 0), true, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove); ImGui::PushItemWidth(120.0f); ImGui::Text("CursorScreenPos: (%.2f, %.2f).", ImGui::GetCursorScreenPos().x, ImGui::GetCursorScreenPos().y); ImGui::Text("Scrolling: (%.2f, %.2f).", scrolling.x, scrolling.y); ImVec2 offset = ImGui::GetCursorScreenPos() - scrolling; /* get current window draw list, and split into 2 layers */ ImDrawList* draw_list = ImGui::GetWindowDrawList(); draw_list->ChannelsSplit(2); // Display grid if (show_grid) { ImU32 GRID_COLOR = ImColor(200, 200, 200, 40); float GRID_SZ = 64.0f; ImVec2 win_pos = ImGui::GetCursorScreenPos(); ImVec2 canvas_sz = ImGui::GetWindowSize(); for (float x = fmodf(-scrolling.x, GRID_SZ); x < canvas_sz.x; x += GRID_SZ) draw_list->AddLine(ImVec2(x, 0.0f) + win_pos, ImVec2(x, canvas_sz.y) + win_pos, GRID_COLOR); for (float y = fmodf(-scrolling.y, GRID_SZ); y < canvas_sz.y; y += GRID_SZ) draw_list->AddLine(ImVec2(0.0f, y) + win_pos, ImVec2(canvas_sz.x, y) + win_pos, GRID_COLOR); } // Display links draw_list->ChannelsSetCurrent(0); // Background for (int link_idx = 0; link_idx < links.Size; link_idx++) { NodeLink* link = &links[link_idx]; Node* node_inp = &nodes[link->InputIdx]; Node* node_out = &nodes[link->OutputIdx]; ImVec2 p1 = offset + node_inp->GetOutputSlotPos(link->InputSlot); ImVec2 p2 = offset + node_out->GetInputSlotPos(link->OutputSlot); draw_list->AddBezierCurve(p1, p1 + ImVec2(+50, 0), p2 + ImVec2(-50, 0), p2, ImColor(200, 200, 100), 3.0f); } // Display nodes for (int node_idx = 0; node_idx < nodes.Size; node_idx++) { Node* node = &nodes[node_idx]; ImGui::PushID(node->ID); ImVec2 node_rect_min = offset + node->Pos; // Display node contents first draw_list->ChannelsSetCurrent(1); // Foreground bool old_any_active = ImGui::IsAnyItemActive(); ImGui::SetCursorScreenPos(node_rect_min + NODE_WINDOW_PADDING); ImGui::BeginGroup(); // Lock horizontal position ImGui::Text("%s", node->Name); ImGui::SliderFloat("##value", &node->Value, 0.0f, 1.0f, "Alpha %.2f"); ImGui::ColorEdit3("##color", &node->Color.x); ImGui::EndGroup(); // Save the size of what we have emitted and whether any of the widgets are being used bool node_widgets_active = (!old_any_active && ImGui::IsAnyItemActive()); node->Size = ImGui::GetItemRectSize() + NODE_WINDOW_PADDING + NODE_WINDOW_PADDING; ImVec2 node_rect_max = node_rect_min + node->Size; // Display node box draw_list->ChannelsSetCurrent(0); // Background ImGui::SetCursorScreenPos(node_rect_min); ImGui::InvisibleButton("node", node->Size); /* invisible button to check if mouse is hovered. */ if (ImGui::IsItemHovered()) { node_hovered_in_scene = node->ID; open_context_menu |= ImGui::IsMouseClicked(1); } bool node_moving_active = ImGui::IsItemActive(); if (node_widgets_active || node_moving_active) node_selected = node->ID; // static int last_node_selected = -1; // if(node_selected != last_node_selected) // printf("active id: %d\n", node_selected); // last_node_selected = node_selected; if (node_moving_active && ImGui::IsMouseDragging(0)) node->Pos = node->Pos + ImGui::GetIO().MouseDelta; ImU32 node_bg_color = (node_hovered_in_list == node->ID || node_hovered_in_scene == node->ID || (node_hovered_in_list == -1 && node_selected == node->ID)) ? ImColor(75, 75, 75) : ImColor(60, 60, 60); draw_list->AddRectFilled(node_rect_min, node_rect_max, node_bg_color, 4.0f); draw_list->AddRect(node_rect_min, node_rect_max, ImColor(100, 100, 100), 4.0f); for (int slot_idx = 0; slot_idx < node->InputsCount; slot_idx++) draw_list->AddCircleFilled(offset + node->GetInputSlotPos(slot_idx), NODE_SLOT_RADIUS, ImColor(150, 150, 150, 150)); for (int slot_idx = 0; slot_idx < node->OutputsCount; slot_idx++) draw_list->AddCircleFilled(offset + node->GetOutputSlotPos(slot_idx), NODE_SLOT_RADIUS, ImColor(150, 150, 150, 150)); ImGui::PopID(); } draw_list->ChannelsMerge(); // Open context menu if (!ImGui::IsAnyItemHovered() && ImGui::IsMouseHoveringWindow() && ImGui::IsMouseClicked(1)) { node_selected = node_hovered_in_list = node_hovered_in_scene = -1; open_context_menu = true; } if (open_context_menu) { ImGui::OpenPopup("context_menu"); if (node_hovered_in_list != -1) node_selected = node_hovered_in_list; if (node_hovered_in_scene != -1) node_selected = node_hovered_in_scene; } // Draw context menu ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(8, 8)); if (ImGui::BeginPopup("context_menu")) { Node* node = node_selected != -1 ? &nodes[node_selected] : NULL; ImVec2 scene_pos = ImGui::GetMousePosOnOpeningCurrentPopup() - offset; if (node) { ImGui::Text("Node '%s'", node->Name); ImGui::Separator(); if (ImGui::MenuItem("Rename..", NULL, false, false)) {} if (ImGui::MenuItem("Delete", NULL, false, false)) {} if (ImGui::MenuItem("Copy", NULL, false, false)) {} } else { if (ImGui::MenuItem("Add")) { nodes.push_back(Node(nodes.Size, "New node", scene_pos, 0.5f, ImColor(100, 100, 200), 2, 2)); } if (ImGui::MenuItem("Paste", NULL, false, false)) {} } ImGui::EndPopup(); } ImGui::PopStyleVar(); // Scrolling if (ImGui::IsWindowHovered() && !ImGui::IsAnyItemActive() && ImGui::IsMouseDragging(2, 0.0f)) scrolling = scrolling - ImGui::GetIO().MouseDelta; ImGui::PopItemWidth(); ImGui::EndChild(); ImGui::PopStyleColor(); ImGui::PopStyleVar(2); ImGui::EndGroup(); ImGui::End(); }
void ReymentaServerApp::draw() { if (mFirstLaunch) { CI_LOG_V("draw begin"); } // clear the window and set the drawing color to white gl::clear(); gl::color(Color::white()); // draw the fbos mBatchass->getTexturesRef()->draw(); gl::enableAlphaBlending(); //gl::setMatricesWindow(mParameterBag->mRenderWidth, mParameterBag->mRenderHeight); if (mImage) { // iterate over the warps and draw their content for (auto &warp : mWarps) { // there are two ways you can use the warps: if (mUseBeginEnd) { // a) issue your draw commands between begin() and end() statements warp->begin(); // in this demo, we want to draw a specific area of our image, // but if you want to draw the whole image, you can simply use: gl::draw( mImage ); gl::draw(mImage, mSrcArea, warp->getBounds()); warp->end(); } else { // b) simply draw a texture on them (ideal for video) // in this demo, we want to draw a specific area of our image, // but if you want to draw the whole image, you can simply use: warp->draw( mImage ); warp->draw(mBatchass->getTexturesRef()->getTexture(11), mSrcArea); } } } gl::disableAlphaBlending(); //imgui ui::NewFrame(); gl::setMatricesWindow(getWindowSize()); xPos = margin; yPos = margin + 30; #pragma region Info ui::SetNextWindowSize(ImVec2(largePreviewW + 20, largePreviewH), ImGuiSetCond_Once); ui::SetNextWindowPos(ImVec2(xPos, yPos), ImGuiSetCond_Once); sprintf_s(buf, "Fps %c %d###fps", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], (int)mParameterBag->iFps); ui::Begin(buf); { ImGui::PushItemWidth(mParameterBag->mPreviewFboWidth); // fps static ImVector<float> values; if (values.empty()) { values.resize(100); memset(&values.front(), 0, values.size()*sizeof(float)); } static int values_offset = 0; static float refresh_time = -1.0f; if (ui::GetTime() > refresh_time + 1.0f / 6.0f) { refresh_time = ui::GetTime(); values[values_offset] = mParameterBag->iFps; values_offset = (values_offset + 1) % values.size(); } if (mParameterBag->iFps < 12.0) ui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 0, 0, 1)); ui::PlotLines("FPS", &values.front(), (int)values.size(), values_offset, mParameterBag->sFps.c_str(), 0.0f, 300.0f, ImVec2(0, 30)); if (mParameterBag->iFps < 12.0) ui::PopStyleColor(); // Checkbox ui::Checkbox("Tex", &showTextures); ui::SameLine(); ui::Checkbox("Fbos", &showFbos); ui::SameLine(); ui::Checkbox("Shada", &showShaders); ui::Checkbox("Audio", &showAudio); ui::SameLine(); ui::Checkbox("Cmd", &showConsole); ui::SameLine(); ui::Checkbox("OSC", &showOSC); ui::Checkbox("MIDI", &showMidi); ui::SameLine(); ui::Checkbox("Test", &showTest); if (ui::Button("Save Params")) { // save warp settings mBatchass->getWarpsRef()->save("warps1.xml"); // save params mParameterBag->save(); } mParameterBag->iDebug ^= ui::Button("Debug"); ui::SameLine(); mParameterBag->mRenderThumbs ^= ui::Button("Thumbs"); ui::PopItemWidth(); if (ui::Button("Stop Loading")) mBatchass->stopLoading(); } ui::End(); xPos += largePreviewW + 20 + margin; #pragma endregion Info #pragma region WebSockets // websockets ui::SetNextWindowSize(ImVec2(largePreviewW + 20, largePreviewH), ImGuiSetCond_Once); ui::SetNextWindowPos(ImVec2(xPos, yPos), ImGuiSetCond_Once); ui::Begin("WebSockets server"); { if (mParameterBag->mIsWebSocketsServer) { ui::Text("WS Server %d", mParameterBag->mWebSocketsPort); ui::Text("IP %s", mParameterBag->mWebSocketsHost.c_str()); } else { ui::Text("WS Client %d", mParameterBag->mWebSocketsPort); ui::Text("IP %s", mParameterBag->mWebSocketsHost.c_str()); } if (ui::Button("Connect")) { mBatchass->wsConnect(); } ui::SameLine(); if (ui::Button("Ping")) { mBatchass->wsPing(); } } ui::End(); xPos += largePreviewW + 20 + margin; #pragma endregion WebSockets // console if (showConsole) { ui::SetNextWindowSize(ImVec2((w + margin) * mParameterBag->MAX, largePreviewH), ImGuiSetCond_Once); ui::SetNextWindowPos(ImVec2(xPos, yPos), ImGuiSetCond_Once); ShowAppConsole(&showConsole); if (mParameterBag->newMsg) { mParameterBag->newMsg = false; mConsole->AddLog(mParameterBag->mMsg.c_str()); } } if (showTest) { ui::ShowTestWindow(); ui::ShowStyleEditor(); } #pragma region MIDI // MIDI window if (showMidi) { ui::SetNextWindowSize(ImVec2(largePreviewW + 20, largePreviewH), ImGuiSetCond_Once); ui::SetNextWindowPos(ImVec2(xPos, yPos), ImGuiSetCond_Once); ui::Begin("MIDI"); { sprintf_s(buf, "Enable"); if (ui::Button(buf)) mBatchass->midiSetup(); if (ui::CollapsingHeader("MidiIn", "20", true, true)) { ui::Columns(2, "data", true); ui::Text("Name"); ui::NextColumn(); ui::Text("Connect"); ui::NextColumn(); ui::Separator(); for (int i = 0; i < mBatchass->midiInCount(); i++) { ui::Text(mBatchass->midiInPortName(i).c_str()); ui::NextColumn(); if (mBatchass->midiInConnected(i)) { sprintf_s(buf, "Disconnect %d", i); } else { sprintf_s(buf, "Connect %d", i); } if (ui::Button(buf)) { if (mBatchass->midiInConnected(i)) { mBatchass->midiInClosePort(i); } else { mBatchass->midiInOpenPort(i); } } ui::NextColumn(); ui::Separator(); } ui::Columns(1); } } ui::End(); xPos += largePreviewW + 20 + margin; yPos = margin; } #pragma endregion MIDI #pragma region OSC if (showOSC && mParameterBag->mOSCEnabled) { ui::SetNextWindowSize(ImVec2(largeW, largeH), ImGuiSetCond_Once); ui::SetNextWindowPos(ImVec2(xPos, yPos), ImGuiSetCond_Once); ui::Begin("OSC router"); { ui::Text("Sending to host %s", mParameterBag->mOSCDestinationHost.c_str()); ui::SameLine(); ui::Text(" on port %d", mParameterBag->mOSCDestinationPort); ui::Text("Sending to 2nd host %s", mParameterBag->mOSCDestinationHost2.c_str()); ui::SameLine(); ui::Text(" on port %d", mParameterBag->mOSCDestinationPort2); ui::Text(" Receiving on port %d", mParameterBag->mOSCReceiverPort); static char str0[128] = "/live/play"; static int i0 = 0; static float f0 = 0.0f; ui::InputText("address", str0, IM_ARRAYSIZE(str0)); ui::InputInt("track", &i0); ui::InputFloat("clip", &f0, 0.01f, 1.0f); if (ui::Button("Send")) { mBatchass->sendOSCIntMessage(str0, i0); } } ui::End(); xPos += largeW + margin; } #pragma endregion OSC ui::Render(); gl::ScopedGlslProg shader(mBatchass->getShadersRef()->getLiveShader()); //gl::ScopedGlslProg shader(mProg); gl::draw(mMesh); if (mFirstLaunch) { CI_LOG_V("draw end"); mFirstLaunch = false; } }
// Render function. // (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop) void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data) { // Backup Allegro state that will be modified ALLEGRO_TRANSFORM last_transform = *al_get_current_transform(); ALLEGRO_TRANSFORM last_projection_transform = *al_get_current_projection_transform(); int last_clip_x, last_clip_y, last_clip_w, last_clip_h; al_get_clipping_rectangle(&last_clip_x, &last_clip_y, &last_clip_w, &last_clip_h); int last_blender_op, last_blender_src, last_blender_dst; al_get_blender(&last_blender_op, &last_blender_src, &last_blender_dst); // Setup render state al_set_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA); // Setup orthographic projection matrix // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). { float L = draw_data->DisplayPos.x; float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; float T = draw_data->DisplayPos.y; float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; ALLEGRO_TRANSFORM transform; al_identity_transform(&transform); al_use_transform(&transform); al_orthographic_transform(&transform, L, T, 1.0f, R, B, -1.0f); al_use_projection_transform(&transform); } for (int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; // Allegro's implementation of al_draw_indexed_prim() for DX9 is completely broken. Unindex our buffers ourselves. // FIXME-OPT: Unfortunately Allegro doesn't support 32-bits packed colors so we have to convert them to 4 float as well.. static ImVector<ImDrawVertAllegro> vertices; vertices.resize(cmd_list->IdxBuffer.Size); for (int i = 0; i < cmd_list->IdxBuffer.Size; i++) { const ImDrawVert* src_v = &cmd_list->VtxBuffer[cmd_list->IdxBuffer[i]]; ImDrawVertAllegro* dst_v = &vertices[i]; dst_v->pos = src_v->pos; dst_v->uv = src_v->uv; unsigned char* c = (unsigned char*)&src_v->col; dst_v->col = al_map_rgba(c[0], c[1], c[2], c[3]); } const int* indices = NULL; if (sizeof(ImDrawIdx) == 2) { // FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices.. You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices. // Otherwise, we convert them from 16-bit to 32-bit at runtime here, which works perfectly but is a little wasteful. static ImVector<int> indices_converted; indices_converted.resize(cmd_list->IdxBuffer.Size); for (int i = 0; i < cmd_list->IdxBuffer.Size; ++i) indices_converted[i] = (int)cmd_list->IdxBuffer.Data[i]; indices = indices_converted.Data; } else if (sizeof(ImDrawIdx) == 4) { indices = (const int*)cmd_list->IdxBuffer.Data; } // Render command lists int idx_offset = 0; ImVec2 clip_off = draw_data->DisplayPos; for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; if (pcmd->UserCallback) { pcmd->UserCallback(cmd_list, pcmd); } else { ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->TextureId; al_set_clipping_rectangle(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y, pcmd->ClipRect.z - pcmd->ClipRect.x, pcmd->ClipRect.w - pcmd->ClipRect.y); al_draw_prim(&vertices[0], g_VertexDecl, texture, idx_offset, idx_offset + pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST); } idx_offset += pcmd->ElemCount; } } // Restore modified Allegro state al_set_blender(last_blender_op, last_blender_src, last_blender_dst); al_set_clipping_rectangle(last_clip_x, last_clip_y, last_clip_w, last_clip_h); al_use_transform(&last_transform); al_use_projection_transform(&last_projection_transform); }
void VDUI::Run(const char* title, unsigned int fps) { static int currentWindowRow1 = 2; static int currentWindowRow2 = 4; ImGuiStyle& style = ImGui::GetStyle(); if (mIsResizing) { mIsResizing = false; // set ui window and io events callbacks ImGui::connectWindow(getWindow()); ImGui::initialize(); #pragma region style // our theme variables style.WindowRounding = 4; style.WindowPadding = ImVec2(3, 3); style.FramePadding = ImVec2(2, 2); style.ItemSpacing = ImVec2(3, 3); style.ItemInnerSpacing = ImVec2(3, 3); style.WindowMinSize = ImVec2(mVDSettings->mPreviewFboWidth, mVDSettings->mPreviewFboHeight); style.Alpha = 0.85f; style.Colors[ImGuiCol_Text] = ImVec4(0.89f, 0.92f, 0.94f, 1.00f); style.Colors[ImGuiCol_WindowBg] = ImVec4(0.05f, 0.05f, 0.05f, 1.00f); style.Colors[ImGuiCol_Border] = ImVec4(0.40f, 0.40f, 0.40f, 1.00f); style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.38f); style.Colors[ImGuiCol_FrameBg] = ImVec4(0.18f, 0.18f, 0.18f, 1.00f); style.Colors[ImGuiCol_TitleBg] = ImVec4(0.4f, 0.0f, 0.21f, 1.00f); style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.17f, 0.17f, 0.17f, 1.00f); style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.97f, 0.0f, 0.17f, 1.00f); style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.10f, 0.10f, 0.10f, 1.00f); style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.26f, 0.26f, 0.26f, 1.00f); style.Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.26f, 0.26f, 0.26f, 1.00f); // style.Colors[ImGuiCol_ComboBg] = ImVec4(0.13f, 0.13f, 0.13f, 1.00f); style.Colors[ImGuiCol_CheckMark] = ImVec4(0.99f, 0.22f, 0.22f, 0.50f); style.Colors[ImGuiCol_SliderGrab] = ImVec4(0.65f, 0.25f, 0.25f, 1.00f); style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.8f, 0.35f, 0.35f, 1.00f); style.Colors[ImGuiCol_Button] = ImVec4(0.17f, 0.17f, 0.17f, 1.00f); style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f); style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.38f, 0.38f, 0.38f, 1.00f); style.Colors[ImGuiCol_Header] = ImVec4(0.11f, 0.11f, 0.11f, 1.00f); style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f); style.Colors[ImGuiCol_Column] = ImVec4(0.04f, 0.04f, 0.04f, 0.22f); style.Colors[ImGuiCol_ColumnHovered] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); style.Colors[ImGuiCol_ColumnActive] = ImVec4(0.27f, 0.27f, 0.27f, 1.00f); style.Colors[ImGuiCol_ResizeGrip] = ImVec4(0.65f, 0.25f, 0.25f, 1.00f); style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.8f, 0.35f, 0.35f, 1.00f); style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(0.9f, 0.45f, 0.45f, 1.00f); style.Colors[ImGuiCol_CloseButton] = ImVec4(0.28f, 0.28f, 0.28f, 1.00f); style.Colors[ImGuiCol_CloseButtonHovered] = ImVec4(0.20f, 0.20f, 0.20f, 1.00f); style.Colors[ImGuiCol_CloseButtonActive] = ImVec4(0.49f, 0.49f, 0.49f, 1.00f); style.Colors[ImGuiCol_PlotLines] = ImVec4(0.65f, 0.25f, 0.25f, 1.00f); style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.8f, 0.35f, 0.35f, 1.00f); style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.65f, 0.25f, 0.25f, 1.00f); style.Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(0.8f, 0.35f, 0.35f, 1.00f); style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.24f, 0.24f, 0.24f, 1.00f); #pragma endregion style } #pragma region menu if (ImGui::BeginMainMenuBar()) { if (ImGui::BeginMenu("Options")) { ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); ImGui::EndMenu(); } ImGui::EndMainMenuBar(); } #pragma endregion menu mVDSettings->uiXPos = mVDSettings->uiMargin; //ImGui::SetNextWindowSize(ImVec2(mVDSettings->mRenderWidth - 20, mVDSettings->uiYPosRow2 - mVDSettings->uiYPosRow1 - mVDSettings->uiMargin), ImGuiSetCond_Once); ImGui::SetNextWindowSize(ImVec2(800, mVDSettings->uiYPosRow2 - mVDSettings->uiYPosRow1 - mVDSettings->uiMargin), ImGuiSetCond_Once); ImGui::SetNextWindowPos(ImVec2(mVDSettings->uiXPos, mVDSettings->uiYPosRow1), ImGuiSetCond_Once); sprintf(buf, "Videodromm Fps %c %d###fps", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], fps); ImGui::Begin(buf); { ImGui::PushItemWidth(mVDSettings->mPreviewFboWidth); // fps static ImVector<float> values; if (values.empty()) { values.resize(100); memset(&values.front(), 0, values.size() * sizeof(float)); } static int values_offset = 0; static float refresh_time = -1.0f; if (ImGui::GetTime() > refresh_time + 1.0f / 6.0f) { refresh_time = ImGui::GetTime(); values[values_offset] = mVDSession->getFloatUniformValueByIndex(mVDSettings->IFPS); values_offset = (values_offset + 1) % values.size(); } if (mVDSession->getFloatUniformValueByIndex(mVDSettings->IFPS) < 12.0) ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 0, 0, 1)); ImGui::PlotLines("FPS ", &values.front(), (int)values.size(), values_offset, mVDSettings->sFps.c_str(), 0.0f, mVDSession->getTargetFps(), ImVec2(0, 30)); if (mVDSession->getFloatUniformValueByIndex(mVDSettings->IFPS) < 12.0) ImGui::PopStyleColor(); ImGui::SameLine(); ImGui::Text("(Target FPS %.2f) ", mVDSession->getTargetFps()); ImGui::RadioButton("Audio", ¤tWindowRow1, 0); ImGui::SameLine(); ImGui::RadioButton("Midi", ¤tWindowRow1, 1); ImGui::SameLine(); ImGui::RadioButton("Anim", ¤tWindowRow1, 2); ImGui::SameLine(); ImGui::RadioButton("Color", ¤tWindowRow1, 3); ImGui::SameLine(); ImGui::RadioButton("Tempo", ¤tWindowRow1, 4); ImGui::SameLine(); ImGui::RadioButton("Mouse", ¤tWindowRow1, 5); ImGui::SameLine(); ImGui::RadioButton("Osc", ¤tWindowRow1, 6); ImGui::SameLine(); ImGui::RadioButton("WS", ¤tWindowRow1, 7); ImGui::SameLine(); ImGui::RadioButton("Render", ¤tWindowRow1, 8); ImGui::SameLine(); // flip vertically int hue = 0; mVDSession->isFlipV() ? ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue / 7.0f, 1.0f, 0.5f)) : ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(1.0f, 0.1f, 0.1f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue / 7.0f, 0.7f, 0.7f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue / 7.0f, 0.8f, 0.8f)); if (ImGui::Button("FlipV")) { mVDSession->flipV(); } ImGui::PopStyleColor(3); hue++; ImGui::SameLine(); // flip horizontally mVDSession->isFlipH() ? ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue / 7.0f, 1.0f, 0.5f)) : ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(1.0f, 0.1f, 0.1f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue / 7.0f, 0.7f, 0.7f)); ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue / 7.0f, 0.8f, 0.8f)); if (ImGui::Button("FlipH")) { mVDSession->flipH(); } ImGui::PopStyleColor(3); hue++; ImGui::RadioButton("Textures", ¤tWindowRow2, 0); ImGui::SameLine(); ImGui::RadioButton("Fbos", ¤tWindowRow2, 1); ImGui::SameLine(); ImGui::RadioButton("Shaders", ¤tWindowRow2, 2); ImGui::SameLine(); ImGui::RadioButton("Blend", ¤tWindowRow2, 3); ImGui::SameLine(); ImGui::RadioButton("Warps", ¤tWindowRow2, 4); #pragma region Info ImGui::TextWrapped("Msg: %s", mVDSettings->mMsg.c_str()); ImGui::TextWrapped("WS Msg: %s", mVDSettings->mWebSocketsMsg.c_str()); ImGui::TextWrapped("OSC Msg: %s", mVDSettings->mOSCMsg.c_str()); #pragma endregion Info ImGui::PopItemWidth(); } ImGui::End(); switch (currentWindowRow1) { case 0: // Audio mUIAudio->Run("Audio"); break; case 1: // Midi mUIMidi->Run("Midi"); break; case 2: // Animation mUIAnimation->Run("Animation"); break; case 3: // Color mUIColor->Run("Color"); break; case 4: // Tempo mUITempo->Run("Tempo"); break; case 5: // Mouse mUIMouse->Run("Mouse"); break; case 6: // Osc mUIOsc->Run("Osc"); break; case 7: // Websockets mUIWebsockets->Run("Websockets"); break; case 8: // Render mUIRender->Run("Render"); break; } switch (currentWindowRow2) { case 0: // textures mUITextures->Run("Textures"); break; case 1: // Fbos mUIFbos->Run("Fbos"); break; case 2: // Shaders mUIShaders->Run("Shaders"); break; case 3: // Blend mUIBlend->Run("Blend"); break; case 4: // Warps mUIWarps->Run("Warps"); break; } mVDSession->blendRenderEnable(currentWindowRow2 == 3); }