Loading and saving SessionSource in vmx session file.

This commit is contained in:
brunoherbelin
2020-05-20 23:37:36 +02:00
parent eafcc90929
commit f3dcc4e3e5
8 changed files with 77 additions and 15 deletions

View File

@@ -14,6 +14,8 @@
#include "ImageShader.h"
#include "ImageProcessingShader.h"
#include "MediaPlayer.h"
#include "MediaSource.h"
#include "SessionSource.h"
#include "imgui.h"
#include "ImGuiToolkit.h"
@@ -99,6 +101,15 @@ void ImGuiVisitor::visit(Animation &n)
}
void ImGuiVisitor::visit(Scene &n)
{
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
if (ImGui::CollapsingHeader("Scene Property Tree"))
{
n.root()->accept(*this);
}
}
void ImGuiVisitor::visit(Primitive &n)
{
ImGui::PushID(n.id());
@@ -234,13 +245,34 @@ void ImGuiVisitor::visit(ImageProcessingShader &n)
ImGui::PopID();
}
void ImGuiVisitor::visit(Scene &n)
void ImGuiVisitor::visit (Source& s)
{
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
if (ImGui::CollapsingHeader("Scene Property Tree"))
{
n.root()->accept(*this);
}
// blending
s.blendingShader()->accept(*this);
// preview
float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN;
ImVec2 imagesize ( preview_width, preview_width / s.frame()->aspectRatio());
ImGui::Image((void*)(uintptr_t) s.frame()->texture(), imagesize);
// image processing pannel
s.processingShader()->accept(*this);
// geometry direct control
s.groupNode(View::GEOMETRY)->accept(*this);
// Action on source
ImGui::Button("Clone", ImVec2(IMGUI_RIGHT_ALIGN, 0));
}
void ImGuiVisitor::visit (MediaSource& s)
{
ImGui::Button("Open Media Player", ImVec2(IMGUI_RIGHT_ALIGN, 0));
}
void ImGuiVisitor::visit (SessionSource& s)
{
ImGui::Button("Expand", ImVec2(IMGUI_RIGHT_ALIGN, 0));
ImGui::Button("Make Current", ImVec2(IMGUI_RIGHT_ALIGN, 0));
}

View File

@@ -23,6 +23,9 @@ public:
void visit(Shader& n) override;
void visit(ImageShader& n) override;
void visit(ImageProcessingShader& n) override;
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& s) override;
};
#endif // IMGUIVISITOR_H

View File

@@ -7,6 +7,7 @@
#include "Mesh.h"
#include "Source.h"
#include "MediaSource.h"
#include "SessionSource.h"
#include "Session.h"
#include "ImageShader.h"
#include "ImageProcessingShader.h"
@@ -67,11 +68,18 @@ void SessionCreator::loadSession(XMLElement *sessionNode)
counter++;
const char *pType = xmlCurrent_->Attribute("type");
if (!pType)
continue;
if ( std::string(pType) == "MediaSource") {
MediaSource *new_media_source = new MediaSource();
new_media_source->accept(*this);
session_->addSource(new_media_source);
}
if ( std::string(pType) == "SessionSource") {
SessionSource *new_session_source = new SessionSource();
new_session_source->accept(*this);
session_->addSource(new_session_source);
}
// TODO : create other types of source
}
@@ -220,6 +228,17 @@ void SessionCreator::visit (MediaSource& s)
s.mediaplayer()->accept(*this);
}
void SessionCreator::visit (SessionSource& s)
{
// set uri
XMLElement* pathNode = xmlCurrent_->FirstChildElement("path");
if (pathNode) {
std::string path = std::string ( pathNode->GetText() );
s.setPath(path);
}
}

View File

@@ -46,6 +46,7 @@ public:
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& s) override;
static void XMLToNode(tinyxml2::XMLElement *xml, Node &n);
};

View File

@@ -6,6 +6,7 @@
#include "Mesh.h"
#include "Source.h"
#include "MediaSource.h"
#include "SessionSource.h"
#include "ImageShader.h"
#include "ImageProcessingShader.h"
#include "MediaPlayer.h"
@@ -338,3 +339,13 @@ void SessionVisitor::visit (MediaSource& s)
s.mediaplayer()->accept(*this);
}
void SessionVisitor::visit (SessionSource& s)
{
xmlCurrent_->SetAttribute("type", "SessionSource");
XMLElement *path = xmlDoc_->NewElement("path");
xmlCurrent_->InsertEndChild(path);
XMLText *text = xmlDoc_->NewText( s.path().c_str() );
path->InsertEndChild( text );
}

View File

@@ -42,6 +42,7 @@ public:
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& s) override;
static tinyxml2::XMLElement *NodeToXML(Node &n, tinyxml2::XMLDocument *doc);
};

View File

@@ -1028,16 +1028,9 @@ void Navigator::RenderSourcePannel(Source *s)
if (ImGui::InputText("Name", buf5, 64, ImGuiInputTextFlags_CharsNoBlank)){
Mixer::manager().renameSource(s, buf5);
}
// blending pannel
// Source pannel
static ImGuiVisitor v;
s->blendingShader()->accept(v);
// preview
float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN;
ImVec2 imagesize ( preview_width, preview_width / s->frame()->aspectRatio());
ImGui::Image((void*)(uintptr_t) s->frame()->texture(), imagesize);
// image processing pannel
s->processingShader()->accept(v);
s->groupNode(View::GEOMETRY)->accept(v);
s->accept(v);
// ensure change is applied
s->touch();
// delete button

View File

@@ -26,6 +26,7 @@ class ImageShader;
class ImageProcessingShader;
class Source;
class MediaSource;
class SessionSource;
// Declares the interface for the visitors
class Visitor {
@@ -58,6 +59,7 @@ public:
// utility
virtual void visit (Source&) {}
virtual void visit (MediaSource&) {}
virtual void visit (SessionSource&) {}
};