CoreSource complement

The CORE of a source is all what can be interpolated
This commit is contained in:
Bruno
2021-04-18 10:59:39 +02:00
parent 31eb13e16d
commit 8389010002
4 changed files with 81 additions and 62 deletions

View File

@@ -56,7 +56,7 @@ void Node::clearCallbacks()
}
}
void Node::copyTransform(Node *other)
void Node::copyTransform(const Node *other)
{
if (!other)
return;

View File

@@ -64,7 +64,7 @@ public:
// accept all kind of visitors
virtual void accept (Visitor& v);
void copyTransform (Node *other);
void copyTransform (const Node *other);
// public members, to manipulate with care
bool visible_;

View File

@@ -19,9 +19,67 @@
SourceCore::SourceCore() : processingshader_(nullptr)
{
// default nodes
groups_[View::RENDERING] = new Group;
groups_[View::RENDERING]->visible_ = false;
groups_[View::MIXING] = new Group;
groups_[View::MIXING]->visible_ = false;
groups_[View::GEOMETRY] = new Group;
groups_[View::GEOMETRY]->visible_ = false;
groups_[View::LAYER] = new Group;
groups_[View::LAYER]->visible_ = false;
groups_[View::TEXTURE] = new Group;
groups_[View::TEXTURE]->visible_ = false;
groups_[View::TRANSITION] = new Group;
// temp node
stored_status_ = new Group;
// filtered image shader (with texturing and processing) for rendering
processingshader_ = new ImageProcessingShader;
// default rendering with image processing disabled
renderingshader_ = static_cast<Shader *>(new ImageShader);
}
SourceCore::~SourceCore()
{
// all groups and their children are deleted in the scene
// this deletes renderingshader_ (and all source-attached nodes
// e.g. rendersurface_, overlays, blendingshader_, etc.)
delete groups_[View::RENDERING];
delete groups_[View::MIXING];
delete groups_[View::GEOMETRY];
delete groups_[View::LAYER];
delete groups_[View::TEXTURE];
delete groups_[View::TRANSITION];
delete stored_status_;
// don't forget that the processing shader
// could be created but not used and not deleted above
if ( renderingshader_ != processingshader_ )
delete processingshader_;
groups_.clear();
}
SourceCore& SourceCore::operator= (SourceCore const& other)
{
if (this != &other) { // no self assignment
// copy groups properties
groups_[View::RENDERING]->copyTransform( other.group(View::RENDERING) );
groups_[View::MIXING]->copyTransform( other.group(View::MIXING) );
groups_[View::GEOMETRY]->copyTransform( other.group(View::GEOMETRY) );
groups_[View::LAYER]->copyTransform( other.group(View::LAYER) );
groups_[View::TEXTURE]->copyTransform( other.group(View::TEXTURE) );
stored_status_->copyTransform( other.stored_status_ );
// copy shader properties
processingshader_->copy(*other.processingshader_);
renderingshader_->copy(*other.renderingshader_);
}
return *this;
}
Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol_(nullptr), active_(true), locked_(false), need_update_(true), workspace_(STAGE)
{
// create unique id
@@ -34,13 +92,7 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
// create groups and overlays for each view
// default rendering node
groups_[View::RENDERING] = new Group;
groups_[View::RENDERING]->visible_ = false;
// default mixing nodes
groups_[View::MIXING] = new Group;
groups_[View::MIXING]->visible_ = false;
groups_[View::MIXING]->scale_ = glm::vec3(0.15f, 0.15f, 1.f);
groups_[View::MIXING]->translation_ = glm::vec3(DEFAULT_MIXING_TRANSLATION, 0.f);
@@ -75,9 +127,6 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
groups_[View::MIXING]->attach(overlay_mixinggroup_);
// default geometry nodes
groups_[View::GEOMETRY] = new Group;
groups_[View::GEOMETRY]->visible_ = false;
frames_[View::GEOMETRY] = new Switch;
frame = new Frame(Frame::SHARP, Frame::THIN, Frame::NONE);
frame->translation_.z = 0.1;
@@ -128,8 +177,6 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
groups_[View::GEOMETRY]->attach(overlays_[View::GEOMETRY]);
// default layer nodes
groups_[View::LAYER] = new Group;
groups_[View::LAYER]->visible_ = false;
groups_[View::LAYER]->translation_.z = -1.f;
frames_[View::LAYER] = new Switch;
@@ -149,9 +196,6 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
groups_[View::LAYER]->attach(overlays_[View::LAYER]);
// default appearance node
groups_[View::TEXTURE] = new Group;
groups_[View::TEXTURE]->visible_ = false;
frames_[View::TEXTURE] = new Switch;
frame = new Frame(Frame::SHARP, Frame::THIN, Frame::NONE);
frame->translation_.z = 0.1;
@@ -192,9 +236,6 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
overlays_[View::TEXTURE]->attach(handles_[View::TEXTURE][Handles::MENU]);
groups_[View::TEXTURE]->attach(overlays_[View::TEXTURE]);
// empty transition node
groups_[View::TRANSITION] = new Group;
// locker switch button : locked / unlocked icons
locker_ = new Switch;
lock_ = new Handles(Handles::LOCKED);
@@ -202,20 +243,12 @@ Source::Source(uint64_t id) : SourceCore(), id_(id), initialized_(false), symbol
unlock_ = new Handles(Handles::UNLOCKED);
locker_->attach(unlock_);
// create objects
stored_status_ = new Group;
// simple image shader (with texturing) for blending
blendingshader_ = new ImageShader;
// mask produced by dedicated shader
maskshader_ = new MaskShader;
masksurface_ = new Surface(maskshader_);
// filtered image shader (with texturing and processing) for rendering
processingshader_ = new ImageProcessingShader;
// default rendering with image processing enabled
renderingshader_ = static_cast<Shader *>(processingshader_);
// for drawing in mixing view
mixingshader_ = new ImageShader;
mixingshader_->stipple = 1.0;
@@ -249,7 +282,6 @@ Source::~Source()
clones_.clear();
// delete objects
delete stored_status_;
if (renderbuffer_)
delete renderbuffer_;
if (maskbuffer_)
@@ -259,25 +291,11 @@ Source::~Source()
if (masksurface_)
delete masksurface_; // deletes maskshader_
// all groups and their children are deleted in the scene
// this includes rendersurface_, overlays, blendingshader_ and rendershader_
delete groups_[View::RENDERING];
delete groups_[View::MIXING];
delete groups_[View::GEOMETRY];
delete groups_[View::LAYER];
delete groups_[View::TEXTURE];
delete groups_[View::TRANSITION];
groups_.clear();
frames_.clear();
overlays_.clear();
// don't forget that the processing shader
// could be created but not used
if ( renderingshader_ != processingshader_ )
delete processingshader_;
delete texturesurface_;
overlays_.clear();
frames_.clear();
handles_.clear();
}
void Source::setName (const std::string &name)

View File

@@ -27,13 +27,29 @@ class SourceCore
{
public:
SourceCore();
virtual ~SourceCore();
// get handle on the nodes used to manipulate the source in a view
inline Group *group (View::Mode m) const { return groups_.at(m); }
inline Node *groupNode (View::Mode m) const { return static_cast<Node*>(groups_.at(m)); }
// a Source has a shader used to render in fbo
inline Shader *renderingShader () const { return renderingshader_; }
// a Source always has an image processing shader
inline ImageProcessingShader *processingShader () const { return processingshader_; }
SourceCore& operator= (SourceCore const& other);
protected:
// nodes
std::map<View::Mode, Group*> groups_;
// temporary copy for interaction
Group *stored_status_;
// image processing shaders
ImageProcessingShader *processingshader_;
// pointer to the currently attached shader
// (will be processingshader_ if image processing is enabled)
Shader *renderingshader_;
};
class Source : public SourceCore
@@ -75,16 +91,9 @@ public:
Mode mode () const;
void setMode (Mode m);
// get handle on the nodes used to manipulate the source in a view
inline Group *group (View::Mode m) const { return groups_.at(m); }
inline Node *groupNode (View::Mode m) const { return static_cast<Node*>(groups_.at(m)); }
// tests if a given node is part of the source
bool contains (Node *node) const;
// the rendering shader always have an image processing shader
inline ImageProcessingShader *processingShader () const { return processingshader_; }
// the image processing shader can be enabled or disabled
// (NB: when disabled, a simple ImageShader is applied)
void setImageProcessingEnabled (bool on);
@@ -93,9 +102,6 @@ public:
// a Source has a shader to control mixing effects
inline ImageShader *blendingShader () const { return blendingshader_; }
// a Source has a shader used to render in fbo
inline Shader *renderingShader () const { return renderingshader_; }
// every Source has a frame buffer from the renderbuffer
virtual FrameBuffer *frame () const;
@@ -234,10 +240,6 @@ protected:
FrameBufferSurface *rendersurface_;
FrameBufferSurface *mixingsurface_;
// pointer to the currently attached shader
// (will be processingshader_ if image processing is enabled)
Shader *renderingshader_;
// blendingshader provides mixing controls
ImageShader *blendingshader_;
ImageShader *mixingshader_;
@@ -268,7 +270,6 @@ protected:
bool locked_;
bool need_update_;
float dt_;
Group *stored_status_;
Workspace workspace_;
// clones