mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
Separate shader for image processing and simple texture display.
ImageShader added a second texture for mask blending. Cleanup of User Interface windows.
This commit is contained in:
@@ -40,6 +40,8 @@
|
||||
#include "ImGuiToolkit.h"
|
||||
#include "GstToolkit.h"
|
||||
#include "Mixer.h"
|
||||
#include "FrameBuffer.h"
|
||||
#include "MediaPlayer.h"
|
||||
#include "PickingVisitor.h"
|
||||
|
||||
static std::thread loadThread;
|
||||
@@ -75,6 +77,8 @@ UserInterface::UserInterface()
|
||||
{
|
||||
currentFileDialog = "";
|
||||
currentTextEdit = "";
|
||||
show_preview = true;
|
||||
show_media_player = false;
|
||||
}
|
||||
|
||||
bool UserInterface::Init()
|
||||
@@ -265,7 +269,7 @@ void UserInterface::NewFrame()
|
||||
}
|
||||
|
||||
void UserInterface::Render()
|
||||
{
|
||||
{
|
||||
ImVec2 geometry(static_cast<float>(Rendering::manager().Width()), static_cast<float>(Rendering::manager().Height()));
|
||||
|
||||
// file modal dialog
|
||||
@@ -283,6 +287,12 @@ void UserInterface::Render()
|
||||
// warning modal dialog
|
||||
Log::Render();
|
||||
|
||||
// windows
|
||||
if (show_preview)
|
||||
RenderPreview();
|
||||
if (show_media_player)
|
||||
RenderMediaPlayer();
|
||||
|
||||
// Rendering
|
||||
ImGui::Render();
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
@@ -681,7 +691,6 @@ void MainWindow::Render()
|
||||
ImGui::SetNextWindowPos(ImVec2(40, 40), ImGuiCond_FirstUseEver);
|
||||
ImGui::SetNextWindowSize(ImVec2(300, 300), ImGuiCond_FirstUseEver);
|
||||
|
||||
|
||||
ImGui::Begin(IMGUI_TITLE_MAINWINDOW, NULL, ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoCollapse);
|
||||
|
||||
// Menu Bar
|
||||
@@ -703,8 +712,12 @@ void MainWindow::Render()
|
||||
}
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
if (ImGui::BeginMenu("Appearance"))
|
||||
if (ImGui::BeginMenu("Windows"))
|
||||
{
|
||||
ImGui::MenuItem( IMGUI_TITLE_PREVIEW, NULL, &UserInterface::manager().show_preview);
|
||||
ImGui::MenuItem( IMGUI_TITLE_MEDIAPLAYER, NULL, &UserInterface::manager().show_media_player);
|
||||
ImGui::MenuItem( IMGUI_TITLE_SHADEREDITOR, NULL, &show_editor_window);
|
||||
ImGui::MenuItem("Appearance", NULL, false, false);
|
||||
ImGui::SetNextItemWidth(200);
|
||||
if ( ImGui::SliderFloat("Scale", &Settings::application.scale, 0.8f, 1.2f, "%.1f"))
|
||||
ImGui::GetIO().FontGlobalScale = Settings::application.scale;
|
||||
@@ -716,7 +729,6 @@ void MainWindow::Render()
|
||||
}
|
||||
if (ImGui::BeginMenu("Tools"))
|
||||
{
|
||||
ImGui::MenuItem( ICON_FA_CODE " Shader Editor", NULL, &show_editor_window);
|
||||
ImGui::MenuItem( ICON_FA_LIST " Logs", "Ctrl+L", &show_logs_window);
|
||||
ImGui::MenuItem( ICON_FA_TACHOMETER_ALT " Metrics", NULL, &show_overlay_stats);
|
||||
if ( ImGui::MenuItem( ICON_FA_CAMERA_RETRO " Screenshot", NULL) )
|
||||
@@ -811,6 +823,136 @@ void MainWindow::Render()
|
||||
}
|
||||
}
|
||||
|
||||
void UserInterface::RenderPreview()
|
||||
{
|
||||
FrameBuffer *output = Mixer::manager().frame();
|
||||
if (output)
|
||||
{
|
||||
ImGui::SetNextWindowPos(ImVec2(100, 300), ImGuiCond_FirstUseEver);
|
||||
ImGui::SetNextWindowSize(ImVec2(640, 480), ImGuiCond_FirstUseEver);
|
||||
ImGui::Begin(ICON_FA_LAPTOP " Preview", &show_preview, ImGuiWindowFlags_NoScrollbar);
|
||||
float width = ImGui::GetContentRegionAvail().x;
|
||||
|
||||
ImVec2 imagesize ( width, width / output->aspectRatio());
|
||||
ImGui::Image((void*)(intptr_t)output->texture(), imagesize, ImVec2(0.f, 0.f), ImVec2(1.f, -1.f));
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
}
|
||||
|
||||
void UserInterface::RenderMediaPlayer()
|
||||
{
|
||||
bool show = false;
|
||||
MediaPlayer *mp = nullptr;
|
||||
MediaSource *s = nullptr;
|
||||
if ( Mixer::manager().currentSource()) {
|
||||
s = static_cast<MediaSource *>(Mixer::manager().currentSource());
|
||||
if (s) {
|
||||
mp = s->mediaplayer();
|
||||
if (mp && mp->isOpen())
|
||||
show = true;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::SetNextWindowPos(ImVec2(200, 200), ImGuiCond_FirstUseEver);
|
||||
ImGui::SetNextWindowSize(ImVec2(300, 300), ImGuiCond_FirstUseEver);
|
||||
|
||||
if ( !ImGui::Begin(IMGUI_TITLE_MEDIAPLAYER, &show_media_player, ImGuiWindowFlags_NoScrollbar) || !show)
|
||||
{
|
||||
ImGui::End();
|
||||
return;
|
||||
}
|
||||
|
||||
float width = ImGui::GetContentRegionAvail().x;
|
||||
float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
|
||||
|
||||
ImVec2 imagesize ( width, width / mp->aspectRatio());
|
||||
ImGui::Image((void*)(uintptr_t)mp->texture(), imagesize);
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::SameLine(-1);
|
||||
ImGui::Text(" %s %d x %d\n Framerate %.2f / %.2f", mp->codec().c_str(), mp->width(), mp->height(), mp->updateFrameRate() , mp->frameRate() );
|
||||
}
|
||||
|
||||
if (ImGui::Button(ICON_FA_FAST_BACKWARD))
|
||||
mp->rewind();
|
||||
ImGui::SameLine(0, spacing);
|
||||
|
||||
// remember playing mode of the GUI
|
||||
bool media_playing_mode = mp->isPlaying();
|
||||
|
||||
// display buttons Play/Stop depending on current playing mode
|
||||
if (media_playing_mode) {
|
||||
|
||||
if (ImGui::Button(ICON_FA_STOP " Stop"))
|
||||
media_playing_mode = false;
|
||||
ImGui::SameLine(0, spacing);
|
||||
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(ICON_FA_FORWARD))
|
||||
mp->fastForward ();
|
||||
ImGui::PopButtonRepeat();
|
||||
}
|
||||
else {
|
||||
|
||||
if (ImGui::Button(ICON_FA_PLAY " Play"))
|
||||
media_playing_mode = true;
|
||||
ImGui::SameLine(0, spacing);
|
||||
|
||||
ImGui::PushButtonRepeat(true);
|
||||
if (ImGui::Button(ICON_FA_STEP_FORWARD))
|
||||
mp->seekNextFrame();
|
||||
ImGui::PopButtonRepeat();
|
||||
}
|
||||
|
||||
ImGui::SameLine(0, spacing * 4.f);
|
||||
|
||||
static int current_loop = 0;
|
||||
static std::vector< std::pair<int, int> > iconsloop = { {0,15}, {1,15}, {19,14} };
|
||||
current_loop = (int) mp->loop();
|
||||
if ( ImGuiToolkit::ButtonIconMultistate(iconsloop, ¤t_loop) )
|
||||
mp->setLoop( (MediaPlayer::LoopMode) current_loop );
|
||||
|
||||
float speed = static_cast<float>(mp->playSpeed());
|
||||
ImGui::SameLine(0, spacing);
|
||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - 40.0);
|
||||
// ImGui::SetNextItemWidth(width - 90.0);
|
||||
if (ImGui::DragFloat( "##Speed", &speed, 0.01f, -10.f, 10.f, "Speed x %.1f", 2.f))
|
||||
mp->setPlaySpeed( static_cast<double>(speed) );
|
||||
ImGui::SameLine(0, spacing);
|
||||
if (ImGuiToolkit::ButtonIcon(12, 14)) {
|
||||
speed = 1.f;
|
||||
mp->setPlaySpeed( static_cast<double>(speed) );
|
||||
mp->setLoop( MediaPlayer::LOOP_REWIND );
|
||||
}
|
||||
|
||||
guint64 current_t = mp->position();
|
||||
guint64 seek_t = current_t;
|
||||
|
||||
bool slider_pressed = ImGuiToolkit::TimelineSlider( "simpletimeline", &seek_t,
|
||||
mp->duration(), mp->frameDuration());
|
||||
|
||||
// if the seek target time is different from the current position time
|
||||
// (i.e. the difference is less than one frame)
|
||||
if ( ABS_DIFF (current_t, seek_t) > mp->frameDuration() ) {
|
||||
|
||||
// request seek (ASYNC)
|
||||
mp->seekTo(seek_t);
|
||||
}
|
||||
|
||||
// play/stop command should be following the playing mode (buttons)
|
||||
// AND force to stop when the slider is pressed
|
||||
bool media_play = media_playing_mode & (!slider_pressed);
|
||||
|
||||
// apply play action to media only if status should change
|
||||
// NB: The seek command performed an ASYNC state change, but
|
||||
// gst_element_get_state called in isPlaying() will wait for the state change to complete.
|
||||
if ( mp->isPlaying(true) != media_play ) {
|
||||
mp->play( media_play );
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void UserInterface::OpenTextEditor(std::string text)
|
||||
{
|
||||
currentTextEdit = text;
|
||||
|
||||
Reference in New Issue
Block a user