mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-13 11:19:58 +01:00
Creating view for APPEARANCE control
This commit is contained in:
13
Mixer.cpp
13
Mixer.cpp
@@ -78,6 +78,10 @@ static void saveSession(const std::string& filename, Session *session)
|
||||
layer->InsertEndChild( SessionVisitor::NodeToXML(*session->config(View::LAYER), &xmlDoc));
|
||||
views->InsertEndChild(layer);
|
||||
|
||||
XMLElement *appearance = xmlDoc.NewElement( "Appearance" );
|
||||
appearance->InsertEndChild( SessionVisitor::NodeToXML(*session->config(View::APPEARANCE), &xmlDoc));
|
||||
views->InsertEndChild(appearance);
|
||||
|
||||
XMLElement *render = xmlDoc.NewElement( "Rendering" );
|
||||
render->InsertEndChild( SessionVisitor::NodeToXML(*session->config(View::RENDERING), &xmlDoc));
|
||||
views->InsertEndChild(render);
|
||||
@@ -432,6 +436,7 @@ void Mixer::attach(Source *s)
|
||||
mixing_.scene.ws()->attach( s->group(View::MIXING) );
|
||||
geometry_.scene.ws()->attach( s->group(View::GEOMETRY) );
|
||||
layer_.scene.ws()->attach( s->group(View::LAYER) );
|
||||
appearance_.scene.ws()->attach( s->group(View::APPEARANCE) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -447,6 +452,7 @@ void Mixer::detach(Source *s)
|
||||
mixing_.scene.ws()->detatch( s->group(View::MIXING) );
|
||||
geometry_.scene.ws()->detatch( s->group(View::GEOMETRY) );
|
||||
layer_.scene.ws()->detatch( s->group(View::LAYER) );
|
||||
appearance_.scene.ws()->detatch( s->group(View::APPEARANCE) );
|
||||
transition_.scene.ws()->detatch( s->group(View::TRANSITION) );
|
||||
}
|
||||
}
|
||||
@@ -685,6 +691,9 @@ void Mixer::setView(View::Mode m)
|
||||
case View::LAYER:
|
||||
current_view_ = &layer_;
|
||||
break;
|
||||
case View::APPEARANCE:
|
||||
current_view_ = &appearance_;
|
||||
break;
|
||||
case View::MIXING:
|
||||
default:
|
||||
current_view_ = &mixing_;
|
||||
@@ -706,6 +715,8 @@ View *Mixer::view(View::Mode m)
|
||||
return &geometry_;
|
||||
case View::LAYER:
|
||||
return &layer_;
|
||||
case View::APPEARANCE:
|
||||
return &appearance_;
|
||||
case View::MIXING:
|
||||
return &mixing_;
|
||||
default:
|
||||
@@ -725,6 +736,7 @@ void Mixer::saveas(const std::string& filename)
|
||||
session_->config(View::MIXING)->copyTransform( mixing_.scene.root() );
|
||||
session_->config(View::GEOMETRY)->copyTransform( geometry_.scene.root() );
|
||||
session_->config(View::LAYER)->copyTransform( layer_.scene.root() );
|
||||
session_->config(View::APPEARANCE)->copyTransform( appearance_.scene.root() );
|
||||
|
||||
// launch a thread to save the session
|
||||
std::thread (saveSession, filename, session_).detach();
|
||||
@@ -823,6 +835,7 @@ void Mixer::swap()
|
||||
mixing_.scene.root()->copyTransform( session_->config(View::MIXING) );
|
||||
geometry_.scene.root()->copyTransform( session_->config(View::GEOMETRY) );
|
||||
layer_.scene.root()->copyTransform( session_->config(View::LAYER) );
|
||||
appearance_.scene.root()->copyTransform( session_->config(View::APPEARANCE) );
|
||||
|
||||
// set resolution
|
||||
session_->setResolution( session_->config(View::RENDERING)->scale_ );
|
||||
|
||||
1
Mixer.h
1
Mixer.h
@@ -114,6 +114,7 @@ protected:
|
||||
MixingView mixing_;
|
||||
GeometryView geometry_;
|
||||
LayerView layer_;
|
||||
AppearanceView appearance_;
|
||||
TransitionView transition_;
|
||||
|
||||
guint64 update_time_;
|
||||
|
||||
90
Session.cpp
90
Session.cpp
@@ -28,6 +28,10 @@ Session::Session() : failedSource_(nullptr), active_(true), fading_target_(0.f)
|
||||
config_[View::MIXING] = new Group;
|
||||
config_[View::MIXING]->scale_ = Settings::application.views[View::MIXING].default_scale;
|
||||
config_[View::MIXING]->translation_ = Settings::application.views[View::MIXING].default_translation;
|
||||
|
||||
config_[View::APPEARANCE] = new Group;
|
||||
config_[View::APPEARANCE]->scale_ = Settings::application.views[View::APPEARANCE].default_scale;
|
||||
config_[View::APPEARANCE]->translation_ = Settings::application.views[View::APPEARANCE].default_translation;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +47,7 @@ Session::~Session()
|
||||
delete config_[View::GEOMETRY];
|
||||
delete config_[View::LAYER];
|
||||
delete config_[View::MIXING];
|
||||
delete config_[View::APPEARANCE];
|
||||
}
|
||||
|
||||
void Session::setActive (bool on)
|
||||
@@ -89,31 +94,6 @@ void Session::update(float dt)
|
||||
// grab frames to recorders & streamers
|
||||
FrameGrabbing::manager().grabFrame(render_.frame(), dt);
|
||||
|
||||
// // send frame to recorders
|
||||
// std::list<FrameGrabber *>::iterator iter = iter=grabbers_.begin();
|
||||
// // if there is at least once frame grabber
|
||||
// if (iter != grabbers_.end()) {
|
||||
// // grab a frame (once for all recorders)
|
||||
// FrameGrabber::Buffer buf = FrameGrabber::grabFrame(render_.frame());
|
||||
|
||||
// // give the frame to all recorders
|
||||
// while (iter != grabbers_.end())
|
||||
// {
|
||||
// FrameGrabber *rec = *iter;
|
||||
// rec->addFrame(buf, dt);
|
||||
|
||||
// if (rec->finished()) {
|
||||
// iter = grabbers_.erase(iter);
|
||||
// delete rec;
|
||||
// }
|
||||
// else {
|
||||
// iter++;
|
||||
// }
|
||||
// }
|
||||
|
||||
// gst_buffer_unref(buf.buffer);
|
||||
// // gst_clear_buffer(&buf.buffer);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@@ -304,66 +284,6 @@ int Session::index(SourceList::iterator it) const
|
||||
return index;
|
||||
}
|
||||
|
||||
//void Session::addFrameGrabber(FrameGrabber *rec)
|
||||
//{
|
||||
// if (rec != nullptr)
|
||||
// grabbers_.push_back(rec);
|
||||
//}
|
||||
|
||||
|
||||
//FrameGrabber *Session::frontFrameGrabber()
|
||||
//{
|
||||
// if (grabbers_.empty())
|
||||
// return nullptr;
|
||||
// else
|
||||
// return grabbers_.front();
|
||||
//}
|
||||
|
||||
//FrameGrabber *Session::getFrameGrabber(uint64_t id)
|
||||
//{
|
||||
// if (id > 0 && grabbers_.size() > 0 )
|
||||
// {
|
||||
// std::list<FrameGrabber *>::iterator iter = std::find_if(grabbers_.begin(), grabbers_.end(), FrameGrabber::hasId(id));
|
||||
// if (iter != grabbers_.end())
|
||||
// return (*iter);
|
||||
// }
|
||||
|
||||
// return nullptr;
|
||||
//}
|
||||
|
||||
//void Session::stopAllFrameGrabbers()
|
||||
//{
|
||||
// std::list<FrameGrabber *>::iterator iter;
|
||||
// for (iter=grabbers_.begin(); iter != grabbers_.end(); )
|
||||
// (*iter)->stop();
|
||||
//}
|
||||
|
||||
//void Session::clearAllFrameGrabbers()
|
||||
//{
|
||||
// std::list<FrameGrabber *>::iterator iter;
|
||||
// for (iter=grabbers_.begin(); iter != grabbers_.end(); )
|
||||
// {
|
||||
// FrameGrabber *rec = *iter;
|
||||
// rec->stop();
|
||||
// iter = grabbers_.erase(iter);
|
||||
// delete rec;
|
||||
// }
|
||||
//}
|
||||
|
||||
//void Session::transferFrameGrabber(Session *dest)
|
||||
//{
|
||||
// if (dest == nullptr)
|
||||
// return;
|
||||
|
||||
// std::list<FrameGrabber *>::iterator iter;
|
||||
// for (iter=grabbers_.begin(); iter != grabbers_.end(); )
|
||||
// {
|
||||
// dest->grabbers_.push_back(*iter);
|
||||
// iter = grabbers_.erase(iter);
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
void Session::lock()
|
||||
{
|
||||
access_.lock();
|
||||
|
||||
@@ -58,14 +58,6 @@ public:
|
||||
// get frame result of render
|
||||
inline FrameBuffer *frame () const { return render_.frame(); }
|
||||
|
||||
// // Recorders
|
||||
// void addFrameGrabber(FrameGrabber *rec);
|
||||
// FrameGrabber *frontFrameGrabber();
|
||||
// FrameGrabber *getFrameGrabber(uint64_t id);
|
||||
// void stopAllFrameGrabbers();
|
||||
// void clearAllFrameGrabbers();
|
||||
// void transferFrameGrabber(Session *dest);
|
||||
|
||||
// configure rendering resolution
|
||||
void setResolution(glm::vec3 resolution);
|
||||
|
||||
|
||||
10
Source.cpp
10
Source.cpp
@@ -120,6 +120,10 @@ Source::Source() : initialized_(false), active_(true), need_update_(true)
|
||||
overlays_[View::LAYER]->visible_ = false;
|
||||
groups_[View::LAYER]->attach(overlays_[View::LAYER]);
|
||||
|
||||
// default appearance node
|
||||
groups_[View::APPEARANCE] = new Group;
|
||||
groups_[View::APPEARANCE]->visible_ = false;
|
||||
|
||||
// empty transition node
|
||||
groups_[View::TRANSITION] = new Group;
|
||||
|
||||
@@ -156,6 +160,7 @@ Source::~Source()
|
||||
delete groups_[View::MIXING];
|
||||
delete groups_[View::GEOMETRY];
|
||||
delete groups_[View::LAYER];
|
||||
delete groups_[View::APPEARANCE];
|
||||
delete groups_[View::TRANSITION];
|
||||
|
||||
groups_.clear();
|
||||
@@ -253,6 +258,7 @@ void Source::attach(FrameBuffer *renderbuffer)
|
||||
groups_[View::RENDERING]->attach(rendersurface_);
|
||||
groups_[View::GEOMETRY]->attach(rendersurface_);
|
||||
groups_[View::MIXING]->attach(rendersurface_);
|
||||
groups_[View::APPEARANCE]->attach(rendersurface_);
|
||||
// groups_[View::LAYER]->attach(rendersurface_);
|
||||
|
||||
// for mixing and layer views, add another surface to overlay
|
||||
@@ -277,6 +283,10 @@ void Source::attach(FrameBuffer *renderbuffer)
|
||||
node != groups_[View::LAYER]->end(); node++) {
|
||||
(*node)->scale_.x = renderbuffer_->aspectRatio();
|
||||
}
|
||||
for (node = groups_[View::APPEARANCE]->begin();
|
||||
node != groups_[View::APPEARANCE]->end(); node++) {
|
||||
(*node)->scale_.x = renderbuffer_->aspectRatio();
|
||||
}
|
||||
|
||||
// Transition group node is optionnal
|
||||
if ( groups_[View::TRANSITION]->numChildren() > 0 ) {
|
||||
|
||||
@@ -354,6 +354,8 @@ void UserInterface::handleKeyboard()
|
||||
Mixer::manager().setView(View::GEOMETRY);
|
||||
else if (ImGui::IsKeyPressed( GLFW_KEY_F3 ))
|
||||
Mixer::manager().setView(View::LAYER);
|
||||
else if (ImGui::IsKeyPressed( GLFW_KEY_F3 ))
|
||||
Mixer::manager().setView(View::APPEARANCE);
|
||||
else if (ImGui::IsKeyPressed( GLFW_KEY_F12 ))
|
||||
StartScreenshot();
|
||||
// normal keys // make sure no entry / window box is active
|
||||
@@ -915,12 +917,10 @@ void ToolBox::Render()
|
||||
ImGui::InputText("gstreamer pipeline", buf1, 128);
|
||||
if (ImGui::Button("Create Generic Stream Source") )
|
||||
{
|
||||
// GenericStreamSource *s =
|
||||
Mixer::manager().addSource( Mixer::manager().createSourceStream(buf1) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// display histogram of update time and plot framerate
|
||||
//
|
||||
|
||||
88
View.cpp
88
View.cpp
@@ -1692,3 +1692,91 @@ View::Cursor TransitionView::drag (glm::vec2 from, glm::vec2 to)
|
||||
}
|
||||
|
||||
|
||||
AppearanceView::AppearanceView() : View(APPEARANCE)
|
||||
{
|
||||
// read default settings
|
||||
if ( Settings::application.views[mode_].name.empty() ) {
|
||||
// no settings found: store application default
|
||||
Settings::application.views[mode_].name = "Source";
|
||||
scene.root()->scale_ = glm::vec3(SOURCE_DEFAULT_SCALE, SOURCE_DEFAULT_SCALE, 1.0f);
|
||||
scene.root()->translation_ = glm::vec3(1.3f, 1.f, 0.0f);
|
||||
saveSettings();
|
||||
}
|
||||
else
|
||||
restoreSettings();
|
||||
|
||||
// Scene background
|
||||
|
||||
}
|
||||
|
||||
void AppearanceView::update(float dt)
|
||||
{
|
||||
View::update(dt);
|
||||
|
||||
// a more complete update is requested
|
||||
if (View::need_deep_update_) {
|
||||
|
||||
// update rendering of render frame
|
||||
FrameBuffer *output = Mixer::manager().session()->frame();
|
||||
if (output){
|
||||
for (NodeSet::iterator node = scene.bg()->begin(); node != scene.bg()->end(); node++) {
|
||||
(*node)->scale_.x = output->aspectRatio();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AppearanceView::zoom (float factor)
|
||||
{
|
||||
float z = scene.root()->scale_.x;
|
||||
z = CLAMP( z + 0.1f * factor, SOURCE_MIN_SCALE, SOURCE_MAX_SCALE);
|
||||
scene.root()->scale_.x = z;
|
||||
scene.root()->scale_.y = z;
|
||||
}
|
||||
|
||||
void AppearanceView::resize ( int scale )
|
||||
{
|
||||
float z = CLAMP(0.01f * (float) scale, 0.f, 1.f);
|
||||
z *= z;
|
||||
z *= SOURCE_MAX_SCALE - SOURCE_MIN_SCALE;
|
||||
z += SOURCE_MIN_SCALE;
|
||||
scene.root()->scale_.x = z;
|
||||
scene.root()->scale_.y = z;
|
||||
}
|
||||
|
||||
int AppearanceView::size ()
|
||||
{
|
||||
float z = (scene.root()->scale_.x - SOURCE_MIN_SCALE) / (SOURCE_MAX_SCALE - SOURCE_MIN_SCALE);
|
||||
return (int) ( sqrt(z) * 100.f);
|
||||
}
|
||||
|
||||
|
||||
View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick)
|
||||
{
|
||||
if (!s)
|
||||
return Cursor();
|
||||
|
||||
// unproject
|
||||
glm::vec3 gl_Position_from = Rendering::manager().unProject(from, scene.root()->transform_);
|
||||
glm::vec3 gl_Position_to = Rendering::manager().unProject(to, scene.root()->transform_);
|
||||
|
||||
|
||||
std::ostringstream info;
|
||||
info << "Source " ;
|
||||
|
||||
|
||||
|
||||
return Cursor(Cursor_ResizeNESW, info.str() );
|
||||
}
|
||||
|
||||
|
||||
View::Cursor AppearanceView::drag (glm::vec2 from, glm::vec2 to)
|
||||
{
|
||||
Cursor ret = View::drag(from, to);
|
||||
|
||||
// Clamp translation to acceptable area
|
||||
scene.root()->translation_ = glm::clamp(scene.root()->translation_, glm::vec3(-3.f, -1.5f, 0.f), glm::vec3(3.f, 1.5f, 0.f));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
18
View.h
18
View.h
@@ -16,7 +16,7 @@ class View
|
||||
{
|
||||
public:
|
||||
|
||||
typedef enum {RENDERING = 0, MIXING=1, GEOMETRY=2, LAYER=3, TRANSITION=4, INVALID=5 } Mode;
|
||||
typedef enum {RENDERING = 0, MIXING=1, GEOMETRY=2, LAYER=3, APPEARANCE=4, TRANSITION=5, INVALID=6 } Mode;
|
||||
|
||||
View(Mode m);
|
||||
virtual ~View() {}
|
||||
@@ -216,6 +216,22 @@ private:
|
||||
SessionSource *transition_source_;
|
||||
};
|
||||
|
||||
class AppearanceView : public View
|
||||
{
|
||||
public:
|
||||
AppearanceView();
|
||||
|
||||
void update (float dt) override;
|
||||
void zoom (float factor) override;
|
||||
void resize (int) override;
|
||||
int size () override;
|
||||
|
||||
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
|
||||
Cursor drag (glm::vec2, glm::vec2) override;
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // VIEW_H
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
#define LAYER_DEFAULT_SCALE 0.8f
|
||||
#define LAYER_MIN_SCALE 0.4f
|
||||
#define LAYER_MAX_SCALE 1.7f
|
||||
#define SOURCE_DEFAULT_SCALE 1.2f
|
||||
#define SOURCE_MIN_SCALE 0.2f
|
||||
#define SOURCE_MAX_SCALE 10.0f
|
||||
#define TRANSITION_DEFAULT_SCALE 3.0f
|
||||
#define TRANSITION_MIN_DURATION 0.2f
|
||||
#define TRANSITION_MAX_DURATION 10.f
|
||||
|
||||
Reference in New Issue
Block a user