mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-12 02:40:00 +01:00
Fixed session source import; merge sources from the inside session,
adjust their alpha and depth, and delete former session source immediately.
This commit is contained in:
@@ -469,6 +469,9 @@ void ImGuiVisitor::visit (MediaSource& s)
|
|||||||
|
|
||||||
void ImGuiVisitor::visit (SessionSource& s)
|
void ImGuiVisitor::visit (SessionSource& s)
|
||||||
{
|
{
|
||||||
|
if (s.session() == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
ImGuiToolkit::Icon(s.icon().x, s.icon().y);
|
ImGuiToolkit::Icon(s.icon().x, s.icon().y);
|
||||||
ImGui::SameLine(0, 10);
|
ImGui::SameLine(0, 10);
|
||||||
ImGui::Text("Session File");
|
ImGui::Text("Session File");
|
||||||
@@ -489,7 +492,7 @@ void ImGuiVisitor::visit (SessionSource& s)
|
|||||||
if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Open Session", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
|
if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Open Session", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
|
||||||
Mixer::manager().set( s.detach() );
|
Mixer::manager().set( s.detach() );
|
||||||
if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import Session", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
|
if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import Session", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
|
||||||
Mixer::manager().merge( s.detach() );
|
Mixer::manager().import( &s );
|
||||||
|
|
||||||
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
|
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
|
||||||
}
|
}
|
||||||
|
|||||||
48
Mixer.cpp
48
Mixer.cpp
@@ -34,6 +34,7 @@ using namespace tinyxml2;
|
|||||||
#define THREADED_LOADING
|
#define THREADED_LOADING
|
||||||
static std::vector< std::future<Session *> > sessionLoaders_;
|
static std::vector< std::future<Session *> > sessionLoaders_;
|
||||||
static std::vector< std::future<Session *> > sessionImporters_;
|
static std::vector< std::future<Session *> > sessionImporters_;
|
||||||
|
static std::vector< SessionSource * > sessionSourceToImport_;
|
||||||
const std::chrono::milliseconds timeout_ = std::chrono::milliseconds(4);
|
const std::chrono::milliseconds timeout_ = std::chrono::milliseconds(4);
|
||||||
|
|
||||||
|
|
||||||
@@ -163,6 +164,18 @@ void Mixer::update()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// if there is a session source to import
|
||||||
|
if (!sessionSourceToImport_.empty()) {
|
||||||
|
// get the session source to be imported
|
||||||
|
SessionSource *source = sessionSourceToImport_.back();
|
||||||
|
// merge the session inside this session source, and adjust alpha and depth
|
||||||
|
merge( source->detach(), source->alpha(), source->depth() );
|
||||||
|
// important: delete the sessionsource itself
|
||||||
|
deleteSource(source);
|
||||||
|
// done with this session source
|
||||||
|
sessionSourceToImport_.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
// if a change of session is requested
|
// if a change of session is requested
|
||||||
if (sessionSwapRequested_) {
|
if (sessionSwapRequested_) {
|
||||||
sessionSwapRequested_ = false;
|
sessionSwapRequested_ = false;
|
||||||
@@ -839,20 +852,51 @@ void Mixer::import(const std::string& filename)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mixer::merge(Session *session)
|
void Mixer::import(SessionSource *s)
|
||||||
|
{
|
||||||
|
sessionSourceToImport_.push_back( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Mixer::merge(Session *session, float alpha, float depth)
|
||||||
{
|
{
|
||||||
if ( session == nullptr ) {
|
if ( session == nullptr ) {
|
||||||
Log::Warning("Failed to import Session.");
|
Log::Warning("Failed to import Session.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// new state in history manager
|
||||||
|
Action::manager().store( std::to_string(session->numSource()) + std::string(" sources imported."));
|
||||||
|
|
||||||
// import every sources
|
// import every sources
|
||||||
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource()) {
|
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource()) {
|
||||||
|
// avoid name duplicates
|
||||||
renameSource(s, s->name());
|
renameSource(s, s->name());
|
||||||
insertSource(s);
|
|
||||||
|
// scale alpha
|
||||||
|
if ( alpha > 0.f )
|
||||||
|
s->setAlpha( s->alpha() * alpha );
|
||||||
|
|
||||||
|
// set depth at given location
|
||||||
|
if ( depth > 0.f )
|
||||||
|
s->setDepth( depth + (s->depth() / MAX_DEPTH));
|
||||||
|
|
||||||
|
// Add source to Session
|
||||||
|
session_->addSource(s);
|
||||||
|
|
||||||
|
// Attach source to Mixer
|
||||||
|
attach(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// needs to update !
|
||||||
|
View::need_deep_update_++;
|
||||||
|
|
||||||
|
// avoid display issues
|
||||||
|
current_view_->update(0.f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Mixer::swap()
|
void Mixer::swap()
|
||||||
{
|
{
|
||||||
if (!back_session_)
|
if (!back_session_)
|
||||||
|
|||||||
3
Mixer.h
3
Mixer.h
@@ -86,7 +86,8 @@ public:
|
|||||||
void saveas (const std::string& filename);
|
void saveas (const std::string& filename);
|
||||||
void load (const std::string& filename);
|
void load (const std::string& filename);
|
||||||
void import (const std::string& filename);
|
void import (const std::string& filename);
|
||||||
void merge (Session *s);
|
void import (SessionSource *s);
|
||||||
|
void merge (Session *s, float alpha = -1.f, float depth = -1.f);
|
||||||
void set (Session *s);
|
void set (Session *s);
|
||||||
|
|
||||||
// operations depending on transition mode
|
// operations depending on transition mode
|
||||||
|
|||||||
48
Source.cpp
48
Source.cpp
@@ -450,6 +450,48 @@ float sin_quad(float x, float y) {
|
|||||||
// return 0.5f + 0.5f * cos( M_PI * CLAMP( ( ( x * x ) + ( y * y ) ), 0.f, 1.f ) );
|
// return 0.5f + 0.5f * cos( M_PI * CLAMP( ( ( x * x ) + ( y * y ) ), 0.f, 1.f ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float Source::depth()
|
||||||
|
{
|
||||||
|
return groups_[View::RENDERING]->translation_.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Source::setDepth(float d)
|
||||||
|
{
|
||||||
|
groups_[View::LAYER]->translation_.z = CLAMP(d, MIN_DEPTH, MAX_DEPTH);
|
||||||
|
groups_[View::LAYER]->translation_.x = -groups_[View::LAYER]->translation_.z;
|
||||||
|
touch();
|
||||||
|
}
|
||||||
|
|
||||||
|
float Source::alpha()
|
||||||
|
{
|
||||||
|
return sin_quad( groups_[View::MIXING]->translation_.x, groups_[View::MIXING]->translation_.y );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Source::setAlpha(float a)
|
||||||
|
{
|
||||||
|
// todo clamp a
|
||||||
|
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
|
||||||
|
glm::vec2 step = glm::normalize(dist) * 0.01f;
|
||||||
|
|
||||||
|
// special case: perfectly centered (step is null).
|
||||||
|
if ( glm::length(dist) < EPSILON)
|
||||||
|
// step in the diagonal
|
||||||
|
step = glm::vec2(0.01f, 0.01f);
|
||||||
|
|
||||||
|
// converge linearly to reduce the difference of alpha
|
||||||
|
float delta = sin_quad(dist.x, dist.y) - a;
|
||||||
|
while ( glm::abs(delta) > 0.01 ){
|
||||||
|
dist += step * glm::sign(delta);
|
||||||
|
delta = sin_quad(dist.x, dist.y) - a;
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply new mixing coordinates
|
||||||
|
groups_[View::MIXING]->translation_.x = dist.x;
|
||||||
|
groups_[View::MIXING]->translation_.y = dist.y;
|
||||||
|
touch();
|
||||||
|
}
|
||||||
|
|
||||||
void Source::update(float dt)
|
void Source::update(float dt)
|
||||||
{
|
{
|
||||||
// keep delta-t
|
// keep delta-t
|
||||||
@@ -458,8 +500,6 @@ void Source::update(float dt)
|
|||||||
// update nodes if needed
|
// update nodes if needed
|
||||||
if (renderbuffer_ && mixingsurface_ && maskbuffer_ && need_update_)
|
if (renderbuffer_ && mixingsurface_ && maskbuffer_ && need_update_)
|
||||||
{
|
{
|
||||||
// Log::Info("UPDATE %s %f", initials_, dt);
|
|
||||||
|
|
||||||
// ADJUST alpha based on MIXING node
|
// ADJUST alpha based on MIXING node
|
||||||
// read position of the mixing node and interpret this as transparency of render output
|
// read position of the mixing node and interpret this as transparency of render output
|
||||||
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
|
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
|
||||||
@@ -497,11 +537,11 @@ void Source::update(float dt)
|
|||||||
|
|
||||||
// Update workspace based on depth, and
|
// Update workspace based on depth, and
|
||||||
// adjust vertical position of icon depending on workspace
|
// adjust vertical position of icon depending on workspace
|
||||||
if (groups_[View::LAYER]->translation_.x < -FOREGROUND_DEPTH) {
|
if (groups_[View::LAYER]->translation_.x < -LAYER_FOREGROUND) {
|
||||||
groups_[View::LAYER]->translation_.y -= 0.3f;
|
groups_[View::LAYER]->translation_.y -= 0.3f;
|
||||||
workspace_ = Source::FOREGROUND;
|
workspace_ = Source::FOREGROUND;
|
||||||
}
|
}
|
||||||
else if (groups_[View::LAYER]->translation_.x < -BACKGROUND_DEPTH) {
|
else if (groups_[View::LAYER]->translation_.x < -LAYER_BACKGROUND) {
|
||||||
groups_[View::LAYER]->translation_.y -= 0.15f;
|
groups_[View::LAYER]->translation_.y -= 0.15f;
|
||||||
workspace_ = Source::STAGE;
|
workspace_ = Source::STAGE;
|
||||||
}
|
}
|
||||||
|
|||||||
6
Source.h
6
Source.h
@@ -128,6 +128,12 @@ public:
|
|||||||
FrameBufferImage *getMask() const { return maskimage_; }
|
FrameBufferImage *getMask() const { return maskimage_; }
|
||||||
void setMask(FrameBufferImage *img);
|
void setMask(FrameBufferImage *img);
|
||||||
|
|
||||||
|
float depth();
|
||||||
|
void setDepth(float d);
|
||||||
|
|
||||||
|
float alpha();
|
||||||
|
void setAlpha(float a);
|
||||||
|
|
||||||
struct hasNode: public std::unary_function<Source*, bool>
|
struct hasNode: public std::unary_function<Source*, bool>
|
||||||
{
|
{
|
||||||
bool operator()(const Source* elem) const;
|
bool operator()(const Source* elem) const;
|
||||||
|
|||||||
8
View.cpp
8
View.cpp
@@ -1652,16 +1652,16 @@ float LayerView::setDepth(Source *s, float d)
|
|||||||
// negative or no depth given; find the front most depth
|
// negative or no depth given; find the front most depth
|
||||||
if ( depth < 0.f ) {
|
if ( depth < 0.f ) {
|
||||||
// default to place visible in front of background
|
// default to place visible in front of background
|
||||||
depth = BACKGROUND_DEPTH + 0.25f;
|
depth = LAYER_BACKGROUND + LAYER_STEP;
|
||||||
|
|
||||||
// find the front-most souce in the workspace (behind FOREGROUND)
|
// find the front-most souce in the workspace (behind FOREGROUND)
|
||||||
for (NodeSet::iterator node = scene.ws()->begin(); node != scene.ws()->end(); node++) {
|
for (NodeSet::iterator node = scene.ws()->begin(); node != scene.ws()->end(); node++) {
|
||||||
// place in front of previous sources
|
// place in front of previous sources
|
||||||
depth = MAX(depth, (*node)->translation_.z + 0.25f);
|
depth = MAX(depth, (*node)->translation_.z + LAYER_STEP);
|
||||||
|
|
||||||
// in case node is already at max depth
|
// in case node is already at max depth
|
||||||
if ((*node)->translation_.z + 0.05 > MAX_DEPTH )
|
if ((*node)->translation_.z + DELTA_DEPTH > MAX_DEPTH )
|
||||||
(*node)->translation_.z -= 0.05;
|
(*node)->translation_.z -= DELTA_DEPTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,15 +24,13 @@
|
|||||||
#define ROUND(val, factor) float( int( val * factor ) ) / factor;
|
#define ROUND(val, factor) float( int( val * factor ) ) / factor;
|
||||||
|
|
||||||
#define SCENE_UNIT 5.f
|
#define SCENE_UNIT 5.f
|
||||||
#define CIRCLE_SQUARE_DIST(x,y) ( (x*x + y*y) / (SCENE_UNIT * SCENE_UNIT * SCENE_UNIT * SCENE_UNIT) )
|
|
||||||
#define MIN_SCALE 0.01f
|
#define MIN_SCALE 0.01f
|
||||||
#define MAX_SCALE 10.f
|
#define MAX_SCALE 10.f
|
||||||
#define CLAMP_SCALE(x) SIGN(x) * CLAMP( ABS(x), MIN_SCALE, MAX_SCALE)
|
#define CLAMP_SCALE(x) SIGN(x) * CLAMP( ABS(x), MIN_SCALE, MAX_SCALE)
|
||||||
#define SCENE_DEPTH 14.f
|
#define SCENE_DEPTH 14.f
|
||||||
#define MIN_DEPTH 0.f
|
#define MIN_DEPTH 0.f
|
||||||
#define MAX_DEPTH 12.f
|
#define MAX_DEPTH 12.f
|
||||||
#define BACKGROUND_DEPTH 2.f
|
#define DELTA_DEPTH 0.05f
|
||||||
#define FOREGROUND_DEPTH 10.f
|
|
||||||
#define MIXING_DEFAULT_SCALE 2.4f
|
#define MIXING_DEFAULT_SCALE 2.4f
|
||||||
#define MIXING_MIN_SCALE 0.8f
|
#define MIXING_MIN_SCALE 0.8f
|
||||||
#define MIXING_MAX_SCALE 7.0f
|
#define MIXING_MAX_SCALE 7.0f
|
||||||
@@ -45,6 +43,9 @@
|
|||||||
#define LAYER_MIN_SCALE 0.4f
|
#define LAYER_MIN_SCALE 0.4f
|
||||||
#define LAYER_MAX_SCALE 1.7f
|
#define LAYER_MAX_SCALE 1.7f
|
||||||
#define LAYER_PERSPECTIVE 2.0f
|
#define LAYER_PERSPECTIVE 2.0f
|
||||||
|
#define LAYER_BACKGROUND 2.f
|
||||||
|
#define LAYER_FOREGROUND 10.f
|
||||||
|
#define LAYER_STEP 0.25f
|
||||||
#define APPEARANCE_DEFAULT_SCALE 2.f
|
#define APPEARANCE_DEFAULT_SCALE 2.f
|
||||||
#define APPEARANCE_MIN_SCALE 0.4f
|
#define APPEARANCE_MIN_SCALE 0.4f
|
||||||
#define APPEARANCE_MAX_SCALE 7.0f
|
#define APPEARANCE_MAX_SCALE 7.0f
|
||||||
|
|||||||
Reference in New Issue
Block a user