// Dear ImGui + SDL3 + OpenGL3 #include #include #include #include #include "imgui_themes.h" #include "imgui.h" #include "imgui_impl_sdl3.h" #include "imgui_impl_opengl3.h" #include "digital_modulation_fr.hpp" #include "engine.h" #include "imgui_utils.h" #include "modulations.h" #include "application.h" static void showApplicationQuitMenu() { if (ImGui::BeginMenu(APPLICATION_MENU_HEAD)) { if (ImGui::MenuItem(APPLICATION_QUIT, APPLICATION_QUIT_SHORTCUT) ) { SDL_Event event; event.type = SDL_EVENT_QUIT; SDL_PushEvent( &event ); } ImGui::EndMenu(); } } int main(void) { // démarrage de l'application Application app; Application * p_app = &app; Engine engine; // -----------------IMGUI INIT--------------------------- IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); ImGui::StyleColorsLight(); ImGui_ImplSDL3_InitForOpenGL(engine.getWindow(), engine.getGL_Context()); ImGui_ImplOpenGL3_Init(engine.get_glsl_version()); ImGuiStyle& style = ImGui::GetStyle(); style.FontSizeBase = 22.0f; io.Fonts->AddFontFromFileTTF("../fonts/DroidSans.ttf"); // Création d'une instance de la classe DigitalModulation // (son initialisation est réalisée par le constructeur de la classe) DigitalModulation dmod; // Pointeur, utilisé par les différents menus DigitalModulation * p_dmod = &dmod; // ---------------------- MAIN LOOP ---------------------- bool done = false; while (!done) { SDL_Event event; while (SDL_PollEvent(&event)) { ImGui_ImplSDL3_ProcessEvent(&event); switch (event.type) { case SDL_EVENT_QUIT: done = true; break; case SDL_EVENT_WINDOW_RESIZED: { SDL_SetWindowSize(engine.getWindow(), event.window.data1, event.window.data2); } break; default: break; } } ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplSDL3_NewFrame(); ImGui::NewFrame(); // Corrige le redimensionnement (se voit quand on change de thème) ImGui::SetNextWindowPos(ImVec2(0,27), ImGuiCond_Always); ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize, ImGuiCond_Always); ImGui::Begin( "Modulation numerique", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize ); // some geometry to avoid hidden main application menu // on commence par calculer la place disponible et on soustrait 23.0 pixels en y ImVec2 windowSize(ImGui::GetIO().DisplaySize.x, ImGui::GetIO().DisplaySize.y - 23.0f); ImGui::SetNextWindowSize(windowSize); // On décale ensuite le contenu de 23.0 pixels vers le bas, ce qui représente 1 ligne environ ImVec2 main_viewport_pos = ImGui::GetMainViewport()->Pos; ImGui::SetNextWindowPos(ImVec2(main_viewport_pos.x,main_viewport_pos.y + 23.0f)); if (ImGui::BeginMainMenuBar()) { showApplicationQuitMenu(); selectThemeMenu(p_app); selectFrameSize(p_dmod); ImGui::EndMainMenuBar(); } ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_NoTooltip; int anErr = 0; if (ImGui::BeginTabBar("Modulation Numérique d'Amplitude", tab_bar_flags)) { if (ImGui::BeginTabItem("Modulation numérique d'Amplitude")) { app.set_current_tab(Amplitude_TAB); static int am_bits[WORD_SIZE_MAX] = {0}; static float am_carrier_freq = 2.0f; dmod.setDigitalModulationType(Amplitude_TAB, MOD_OOK_TYPE); static DigitalModulationType aType = dmod.get_AM_DigitalModulationType(); anErr = dmod.AmplitudeDigitalModulation(&am_carrier_freq, &am_bits[0], &aType); if (anErr != EXIT_SUCCESS) { std::cout << "Problème !!" << "\n"; return (-1); } ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Modulation numérique de fréquence")) { app.set_current_tab(Frequency_TAB); static int fm_bits[WORD_SIZE_MAX] = {0}; static float fm_carrier_freq = 2.0f; dmod.setDigitalModulationType(Frequency_TAB, MOD_FSK_TYPE); static DigitalModulationType fm_Type = dmod.get_FM_DigitalModulationType(); anErr = dmod.FrequencyDigitalModulation(&fm_carrier_freq, &fm_bits[0], &fm_Type); if (anErr != EXIT_SUCCESS) { std::cout << "Problème !!" << "\n"; return (-1); } ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Modulation numérique de phase")) { app.set_current_tab(Phase_TAB); static int pm_bits[WORD_SIZE_MAX] = {0}; static float pm_carrier_freq = 2.0f; dmod.setDigitalModulationType(Phase_TAB, MOD_BPSK_TYPE); static DigitalModulationType pm_Type = p_dmod->get_PM_DigitalModulationType(); anErr = dmod.PhaseDigitalModulation(&pm_carrier_freq, &pm_bits[0], &pm_Type); if (anErr != EXIT_SUCCESS) { std::cout << "Problème !!" << "\n"; return (-1); } ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Modulation numérique M-QAM")) { app.set_current_tab(M_QAM_TAB); static int pm_bits[WORD_SIZE_MAX] = {0}; static float pm_carrier_freq = 2.0f; dmod.setDigitalModulationType(M_QAM_TAB, MOD_4_QAM_TYPE); static DigitalModulationType pm_Type = p_dmod->getM_QAM_DigitalModulationType(); anErr = dmod.M_QAM_DigitalModulation(&pm_carrier_freq, &pm_bits[0], &pm_Type); if (anErr != EXIT_SUCCESS) { std::cout << "Problème !!" << "\n"; return (-1); } ImGui::EndTabItem(); } ImGui::EndTabBar(); } ImGui::End(); // -----------------------RENDER ---------------------- ImGui::Render(); glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); glClearColor(0.95f, 0.95f, 0.95f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); SDL_GL_SwapWindow(engine.getWindow()); } // ------------------ CLEANUP ------------------ ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplSDL3_Shutdown(); ImGui::DestroyContext(); engine.~Engine(); dmod.~DigitalModulation(); app.~Application(); SDL_Quit(); return 0; }