First effective implementation of LayerView (both GUI, sorting and

storing in session)
This commit is contained in:
brunoherbelin
2020-05-18 21:58:50 +02:00
parent 80478abde2
commit 530762d1d2
8 changed files with 78 additions and 22 deletions

View File

@@ -206,6 +206,15 @@ void Group::attach(Node *child)
} }
void Group::sort()
{
// reorder list of nodes
NodeSet ordered_children;
for(auto it = children_.begin(); it != children_.end(); it++)
ordered_children.insert(*it);
children_.swap(ordered_children);
}
void Group::detatch(Node *child) void Group::detatch(Node *child)
{ {
// find the node with this id, and erase it out of the list of children // find the node with this id, and erase it out of the list of children

View File

@@ -167,12 +167,12 @@ public:
virtual void clear(); virtual void clear();
virtual void attach (Node *child); virtual void attach (Node *child);
virtual void detatch (Node *child); virtual void detatch (Node *child);
virtual void sort();
NodeSet::iterator begin(); NodeSet::iterator begin();
NodeSet::iterator end(); NodeSet::iterator end();
uint numChildren() const; uint numChildren() const;
protected: protected:
NodeSet children_; NodeSet children_;

View File

@@ -5,6 +5,8 @@
#include "Session.h" #include "Session.h"
#include "GarbageVisitor.h" #include "GarbageVisitor.h"
#include "Log.h"
Session::Session() Session::Session()
{ {
config_[View::RENDERING] = new Group; config_[View::RENDERING] = new Group;
@@ -30,7 +32,10 @@ void Session::update(float dt)
{ {
// pre-render of all sources // pre-render of all sources
for( SourceList::iterator it = sources_.begin(); it != sources_.end(); it++){ for( SourceList::iterator it = sources_.begin(); it != sources_.end(); it++){
(*it)->render( ); // render the source
(*it)->render();
// update the source
(*it)->update(dt);
} }
// update the scene tree // update the scene tree

View File

@@ -193,6 +193,9 @@ void SessionCreator::visit (Source& s)
xmlCurrent_ = sourceNode->FirstChildElement("Geometry"); xmlCurrent_ = sourceNode->FirstChildElement("Geometry");
s.groupNode(View::GEOMETRY)->accept(*this); s.groupNode(View::GEOMETRY)->accept(*this);
xmlCurrent_ = sourceNode->FirstChildElement("Layer");
s.groupNode(View::LAYER)->accept(*this);
xmlCurrent_ = sourceNode->FirstChildElement("Blending"); xmlCurrent_ = sourceNode->FirstChildElement("Blending");
s.blendingShader()->accept(*this); s.blendingShader()->accept(*this);

View File

@@ -311,6 +311,10 @@ void SessionVisitor::visit (Source& s)
sourceNode->InsertEndChild(xmlCurrent_); sourceNode->InsertEndChild(xmlCurrent_);
s.groupNode(View::GEOMETRY)->accept(*this); s.groupNode(View::GEOMETRY)->accept(*this);
xmlCurrent_ = xmlDoc_->NewElement( "Layer" );
sourceNode->InsertEndChild(xmlCurrent_);
s.groupNode(View::LAYER)->accept(*this);
xmlCurrent_ = xmlDoc_->NewElement( "Blending" ); xmlCurrent_ = xmlDoc_->NewElement( "Blending" );
sourceNode->InsertEndChild(xmlCurrent_); sourceNode->InsertEndChild(xmlCurrent_);
s.blendingShader()->accept(*this); s.blendingShader()->accept(*this);

View File

@@ -14,8 +14,9 @@
#include "MediaPlayer.h" #include "MediaPlayer.h"
#include "SearchVisitor.h" #include "SearchVisitor.h"
#include "Log.h"
Source::Source(const std::string &name) : name_(name), initialized_(false) Source::Source(const std::string &name) : name_(name), initialized_(false), need_update_(true)
{ {
sprintf(initials_, "__"); sprintf(initials_, "__");
@@ -107,6 +108,30 @@ void Source::setOverlayVisible(bool on)
(*o).second->visible_ = on; (*o).second->visible_ = on;
} }
void Source::update(float dt)
{
if (need_update_)
{
// ADJUST alpha based on MIXING node
// read position of the mixing node and interpret this as transparency of render output
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
float alpha = 1.0 - CLAMP( SQUARE( glm::length(dist) ), 0.f, 1.f );
blendingshader_->color.a = alpha;
// MODIFY geometry based on GEOMETRY node
groups_[View::RENDERING]->translation_ = groups_[View::GEOMETRY]->translation_;
groups_[View::RENDERING]->scale_ = groups_[View::GEOMETRY]->scale_;
groups_[View::RENDERING]->rotation_ = groups_[View::GEOMETRY]->rotation_;
// MODIFY DEPTH
groups_[View::MIXING]->translation_.z = groups_[View::LAYER]->translation_.z;
groups_[View::GEOMETRY]->translation_.z = groups_[View::LAYER]->translation_.z;
groups_[View::RENDERING]->translation_.z = groups_[View::LAYER]->translation_.z;
need_update_ = false;
}
}
Handles *Source::handleNode(Handles::Type t) const Handles *Source::handleNode(Handles::Type t) const
{ {
if ( t == Handles::ROTATE ) if ( t == Handles::ROTATE )
@@ -285,17 +310,6 @@ void MediaSource::render()
renderbuffer_->begin(); renderbuffer_->begin();
mediasurface_->draw(glm::identity<glm::mat4>(), projection); mediasurface_->draw(glm::identity<glm::mat4>(), projection);
renderbuffer_->end(); renderbuffer_->end();
// ADJUST alpha based on MIXING node
// read position of the mixing node and interpret this as transparency of render output
float alpha = 1.0 - CLAMP( SQUARE( glm::length(groups_[View::MIXING]->translation_) ), 0.f, 1.f );
blendingshader_->color.a = alpha;
// MODIFY geometry based on GEOMETRY node
groups_[View::RENDERING]->translation_ = groups_[View::GEOMETRY]->translation_;
groups_[View::RENDERING]->scale_ = groups_[View::GEOMETRY]->scale_;
groups_[View::RENDERING]->rotation_ = groups_[View::GEOMETRY]->rotation_;
} }
} }

View File

@@ -37,24 +37,32 @@ public:
inline Node *groupNode(View::Mode m) const { return static_cast<Node*>(groups_.at(m)); } inline Node *groupNode(View::Mode m) const { return static_cast<Node*>(groups_.at(m)); }
Handles *handleNode(Handles::Type t) const; Handles *handleNode(Handles::Type t) const;
// every Source has a shader to control image processing effects // a Source has a shader to control image processing effects
inline ImageProcessingShader *processingShader() const { return rendershader_; } inline ImageProcessingShader *processingShader() const { return rendershader_; }
// every Source has a shader to control mixing effects // a Source has a shader to control mixing effects
inline ImageShader *blendingShader() const { return blendingshader_; } inline ImageShader *blendingShader() const { return blendingshader_; }
// every Source shall have a frame buffer // a Source shall be updated before displayed (Mixing, Geometry and Layer)
virtual FrameBuffer *frame() const = 0; void update (float dt);
// every Source shall be rendered before draw // touch to request update
virtual void render() = 0; inline void touch() { need_update_ = true; }
// accept all kind of visitors // accept all kind of visitors
virtual void accept (Visitor& v); virtual void accept (Visitor& v);
// every Source shall informs if the source failed (i.e. shall be deleted) // SPECIFIC implementation for subtypes
// a Source shall informs if the source failed (i.e. shall be deleted)
virtual bool failed() const { return false; } virtual bool failed() const { return false; }
// every Source shall have a frame buffer
virtual FrameBuffer *frame() const = 0;
// every Source shall be rendered into the frame buffer
virtual void render() = 0;
protected: protected:
// name // name
std::string name_; std::string name_;
@@ -84,6 +92,9 @@ protected:
// overlay to be displayed on top of source // overlay to be displayed on top of source
std::map<View::Mode, Group*> overlays_; std::map<View::Mode, Group*> overlays_;
Handles *resize_handle_, *resize_H_handle_, *resize_V_handle_, *rotate_handle_; Handles *resize_handle_, *resize_H_handle_, *resize_V_handle_, *rotate_handle_;
// update need
bool need_update_;
}; };
// TODO SourceSet sorted by shader // TODO SourceSet sorted by shader

View File

@@ -42,6 +42,9 @@ void View::update(float dt)
{ {
// recursive update from root of scene // recursive update from root of scene
scene.update( dt ); scene.update( dt );
// reorder depth
scene.fg()->sort();
} }
void View::drag (glm::vec2 from, glm::vec2 to) void View::drag (glm::vec2 from, glm::vec2 to)
@@ -126,6 +129,8 @@ void MixingView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::pair<Node *
// compute delta translation // compute delta translation
sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from;
// request update
s->touch();
} }
@@ -323,6 +328,8 @@ void GeometryView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::pair<Node
sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from;
} }
// request update
s->touch();
} }
LayerView::LayerView() : View(LAYER), aspect_ratio(1.f) LayerView::LayerView() : View(LAYER), aspect_ratio(1.f)
@@ -379,7 +386,6 @@ void LayerView::zoom (float factor)
z = CLAMP( z + 0.1f * factor, 0.2f, 10.f); z = CLAMP( z + 0.1f * factor, 0.2f, 10.f);
scene.root()->scale_.x = z; scene.root()->scale_.x = z;
scene.root()->scale_.y = z; scene.root()->scale_.y = z;
Log::Info("scale layer %f", scene.root()->scale_.x );
} }
@@ -409,6 +415,10 @@ void LayerView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::pair<Node *,
sourceNode->translation_.x = CLAMP( sourceNode->translation_.x, -10.f, 0.f); sourceNode->translation_.x = CLAMP( sourceNode->translation_.x, -10.f, 0.f);
sourceNode->translation_.y = sourceNode->translation_.x / aspect_ratio; sourceNode->translation_.y = sourceNode->translation_.x / aspect_ratio;
// change depth
sourceNode->translation_.z = -sourceNode->translation_.x;
// request update
s->touch();
} }