mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-11 18:34:58 +01:00
work in progress: Mixer manage creation of sources
Views displayed independently
This commit is contained in:
@@ -69,7 +69,12 @@ void ImGuiVisitor::visit(Group &n)
|
||||
|
||||
void ImGuiVisitor::visit(Switch &n)
|
||||
{
|
||||
// TODO : display selection of active child
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(Animation &n)
|
||||
{
|
||||
// TODO : display group and animation parameters
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(Primitive &n)
|
||||
@@ -82,9 +87,9 @@ void ImGuiVisitor::visit(Primitive &n)
|
||||
ImGui::PopID();
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(ImageSurface &n)
|
||||
void ImGuiVisitor::visit(FrameBufferSurface &n)
|
||||
{
|
||||
|
||||
ImGui::Text("Framebuffer");
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(MediaSurface &n)
|
||||
@@ -127,26 +132,6 @@ void ImGuiVisitor::visit(ImageShader &n)
|
||||
ImGui::PopID();
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(LineStrip &n)
|
||||
{
|
||||
ImGui::Text("Lines");
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(LineSquare &n)
|
||||
{
|
||||
ImGui::Text("Square");
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(LineCircle &n)
|
||||
{
|
||||
ImGui::Text("Circle");
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(Mesh &n)
|
||||
{
|
||||
ImGui::Text("Mesh");
|
||||
}
|
||||
|
||||
void ImGuiVisitor::visit(Scene &n)
|
||||
{
|
||||
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
|
||||
|
||||
@@ -9,22 +9,24 @@ public:
|
||||
ImGuiVisitor();
|
||||
|
||||
// Elements of Scene
|
||||
void visit(Scene& n) override;
|
||||
void visit(Node& n) override;
|
||||
void visit(Group& n) override;
|
||||
void visit(Switch& n) override;
|
||||
void visit(Primitive& n) override;
|
||||
void visit(ImageSurface& n) override;
|
||||
void visit(MediaSurface& n) override;
|
||||
void visit(LineStrip& n) override;
|
||||
void visit(LineSquare& n) override;
|
||||
void visit(LineCircle& n) override;
|
||||
void visit(Mesh& n) override;
|
||||
void visit(Scene& n);
|
||||
void visit(Node& n);
|
||||
void visit(Group& n);
|
||||
void visit(Switch& n);
|
||||
void visit(Animation& n);
|
||||
void visit(Primitive& n);
|
||||
void visit(ImageSurface&) {}
|
||||
void visit(MediaSurface& n);
|
||||
void visit(FrameBufferSurface& n);
|
||||
void visit(LineStrip&) {}
|
||||
void visit(LineSquare&) {}
|
||||
void visit(LineCircle&) {}
|
||||
void visit(Mesh&) {}
|
||||
|
||||
// Elements with attributes
|
||||
void visit(MediaPlayer& n) override;
|
||||
void visit(Shader& n) override;
|
||||
void visit(ImageShader& n) override;
|
||||
void visit(MediaPlayer& n);
|
||||
void visit(Shader& n);
|
||||
void visit(ImageShader& n);
|
||||
};
|
||||
|
||||
#endif // IMGUIVISITOR_H
|
||||
|
||||
26
Mixer.cpp
26
Mixer.cpp
@@ -21,7 +21,7 @@ void Mixer::update()
|
||||
if (update_time_ == GST_CLOCK_TIME_NONE)
|
||||
update_time_ = gst_util_get_timestamp ();
|
||||
gint64 current_time = gst_util_get_timestamp ();
|
||||
gint64 dt = current_time - update_time_;
|
||||
float dt = static_cast<float>( GST_TIME_AS_MSECONDS(current_time - update_time_) ) * 0.001f;
|
||||
update_time_ = current_time;
|
||||
|
||||
// render of all sources
|
||||
@@ -29,8 +29,9 @@ void Mixer::update()
|
||||
(*it)->render();
|
||||
}
|
||||
|
||||
// recursive update of all views
|
||||
mixing_.update( static_cast<float>( GST_TIME_AS_MSECONDS(dt)) * 0.001f );
|
||||
// recursive update of ALL views
|
||||
render_.update(dt);
|
||||
mixing_.update(dt);
|
||||
// TODO other views
|
||||
|
||||
|
||||
@@ -49,6 +50,15 @@ void Mixer::draw()
|
||||
// manangement of sources
|
||||
void Mixer::createSourceMedia(std::string uri)
|
||||
{
|
||||
// create source
|
||||
MediaSource *m = new MediaSource("s", uri);
|
||||
|
||||
// add Nodes to ALL views
|
||||
//
|
||||
// Render Node
|
||||
render_.scene.root()->addChild(m->group(View::RENDERING));
|
||||
// Mixing Node
|
||||
mixing_.scene.root()->addChild(m->group(View::MIXING));
|
||||
|
||||
}
|
||||
|
||||
@@ -72,10 +82,10 @@ Source *Mixer::currentSource()
|
||||
}
|
||||
|
||||
// management of view
|
||||
void Mixer::setCurrentView(viewMode m)
|
||||
void Mixer::setCurrentView(View::Mode m)
|
||||
{
|
||||
switch (m) {
|
||||
case MIXING:
|
||||
case View::MIXING:
|
||||
current_view_ = &mixing_;
|
||||
break;
|
||||
default:
|
||||
@@ -84,12 +94,12 @@ void Mixer::setCurrentView(viewMode m)
|
||||
}
|
||||
}
|
||||
|
||||
View *Mixer::getView(viewMode m)
|
||||
View *Mixer::getView(View::Mode m)
|
||||
{
|
||||
switch (m) {
|
||||
case RENDERING:
|
||||
case View::RENDERING:
|
||||
return &render_;
|
||||
case MIXING:
|
||||
case View::MIXING:
|
||||
return &mixing_;
|
||||
default:
|
||||
return nullptr;
|
||||
|
||||
9
Mixer.h
9
Mixer.h
@@ -14,8 +14,8 @@ class Mixer
|
||||
{
|
||||
// Private Constructor
|
||||
Mixer();
|
||||
Mixer(Rendering const& copy); // Not Implemented
|
||||
Mixer& operator=(Rendering const& copy); // Not Implemented
|
||||
Mixer(Mixer const& copy); // Not Implemented
|
||||
Mixer& operator=(Mixer const& copy); // Not Implemented
|
||||
|
||||
public:
|
||||
|
||||
@@ -40,9 +40,8 @@ public:
|
||||
Source *currentSource();
|
||||
|
||||
// management of view
|
||||
typedef enum {RENDERING = 0, MIXING=1, GEOMETRY=2, LAYER=3, INVALID=4 } viewMode;
|
||||
View *getView(viewMode m);
|
||||
void setCurrentView(viewMode m);
|
||||
View *getView(View::Mode m);
|
||||
void setCurrentView(View::Mode m);
|
||||
View *currentView();
|
||||
|
||||
inline FrameBuffer *frame() const { return render_.frameBuffer(); }
|
||||
|
||||
@@ -337,11 +337,8 @@ glm::mat4 Rendering::Projection()
|
||||
|
||||
glm::vec3 Rendering::unProject(glm::vec2 screen_coordinate, glm::mat4 modelview)
|
||||
{
|
||||
glm::vec3 coordinates = glm::vec3( screen_coordinate.x, -screen_coordinate.y, 0.f);
|
||||
glm::vec3 coordinates = glm::vec3( screen_coordinate.x, main_window_attributes_.viewport.y - screen_coordinate.y, 0.f);
|
||||
glm::vec4 viewport = glm::vec4( 0.f, 0.f, main_window_attributes_.viewport.x, main_window_attributes_.viewport.y);
|
||||
|
||||
// glm::mat4 mv = glm::scale(modelview, glm::vec3(1.f, -1.f, 1.f));
|
||||
// glm::mat4 mv = glm::inverse(modelview);
|
||||
glm::vec3 point = glm::unProject(coordinates, modelview, Projection(), viewport);
|
||||
|
||||
return point;
|
||||
|
||||
@@ -175,7 +175,11 @@ void Primitive::deleteGLBuffers_()
|
||||
|
||||
Group::~Group()
|
||||
{
|
||||
children_.clear();
|
||||
// for(auto it = children_.begin(); it != children_.end(); )
|
||||
// it = children_.erase(it);
|
||||
// TODO vrify that desctructor of node is called
|
||||
children_.erase(children_.begin(), children_.end());
|
||||
|
||||
}
|
||||
|
||||
void Group::update( float dt )
|
||||
@@ -354,7 +358,7 @@ void Animation::update( float dt )
|
||||
|
||||
void Animation::accept(Visitor& v)
|
||||
{
|
||||
Node::accept(v);
|
||||
Group::accept(v);
|
||||
v.visit(*this);
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,19 @@ void SessionVisitor::visit(Switch &n)
|
||||
xmlCurrent_->SetAttribute("active", n.getIndexActiveChild());
|
||||
}
|
||||
|
||||
void SessionVisitor::visit(Animation &n)
|
||||
{
|
||||
// Node of a different type
|
||||
xmlCurrent_->SetAttribute("type", "Animation");
|
||||
|
||||
XMLElement *anim = xmlDoc_->NewElement("Movement");
|
||||
anim->SetAttribute("speed", n.speed_);
|
||||
anim->SetAttribute("radius", n.radius_);
|
||||
XMLElement *axis = XMLElementFromGLM(xmlDoc_, n.axis_);
|
||||
anim->InsertEndChild(axis);
|
||||
xmlCurrent_->InsertEndChild(anim);
|
||||
}
|
||||
|
||||
void SessionVisitor::visit(Primitive &n)
|
||||
{
|
||||
// Node of a different type
|
||||
@@ -88,6 +101,12 @@ void SessionVisitor::visit(ImageSurface &n)
|
||||
xmlCurrent_->InsertEndChild(image);
|
||||
}
|
||||
|
||||
void SessionVisitor::visit(FrameBufferSurface &n)
|
||||
{
|
||||
// Node of a different type
|
||||
xmlCurrent_->SetAttribute("type", "FrameBufferSurface");
|
||||
}
|
||||
|
||||
void SessionVisitor::visit(MediaSurface &n)
|
||||
{
|
||||
// Node of a different type
|
||||
|
||||
@@ -16,22 +16,24 @@ public:
|
||||
tinyxml2::XMLElement *root() {return xmlRoot_;}
|
||||
|
||||
// Elements of Scene
|
||||
void visit(Scene& n) override;
|
||||
void visit(Node& n) override;
|
||||
void visit(Group& n) override;
|
||||
void visit(Switch& n) override;
|
||||
void visit(Primitive& n) override;
|
||||
void visit(ImageSurface& n) override;
|
||||
void visit(MediaSurface& n) override;
|
||||
void visit(LineStrip& n) override;
|
||||
void visit(LineSquare&) override;
|
||||
void visit(LineCircle& n) override;
|
||||
void visit(Mesh& n) override;
|
||||
void visit(Scene& n);
|
||||
void visit(Node& n);
|
||||
void visit(Group& n);
|
||||
void visit(Switch& n);
|
||||
void visit(Animation& n);
|
||||
void visit(Primitive& n);
|
||||
void visit(ImageSurface& n);
|
||||
void visit(MediaSurface& n);
|
||||
void visit(FrameBufferSurface& n);
|
||||
void visit(LineStrip& n);
|
||||
void visit(LineSquare&);
|
||||
void visit(LineCircle& n);
|
||||
void visit(Mesh& n);
|
||||
|
||||
// Elements with attributes
|
||||
void visit(MediaPlayer& n) override;
|
||||
void visit(Shader& n) override;
|
||||
void visit(ImageShader& n) override;
|
||||
void visit(MediaPlayer& n);
|
||||
void visit(Shader& n);
|
||||
void visit(ImageShader& n);
|
||||
};
|
||||
|
||||
#endif // XMLVISITOR_H
|
||||
|
||||
73
Source.cpp
73
Source.cpp
@@ -3,21 +3,45 @@
|
||||
|
||||
#include "Source.h"
|
||||
|
||||
#include "FrameBuffer.h"
|
||||
#include "ImageShader.h"
|
||||
#include "Primitives.h"
|
||||
#include "Mesh.h"
|
||||
#include "MediaPlayer.h"
|
||||
|
||||
|
||||
// gobal static list of all sources
|
||||
SourceList Source::sources_;
|
||||
|
||||
|
||||
Source::Source(std::string name = "") : name_(""), buffer_(nullptr), shader_(nullptr), surface_(nullptr)
|
||||
Source::Source(std::string name = "") : name_("")
|
||||
{
|
||||
// set a name
|
||||
rename(name);
|
||||
|
||||
// create groups for each view
|
||||
|
||||
// default rendering node
|
||||
groups_[View::RENDERING] = new Group;
|
||||
groups_[View::RENDERING]->scale_ = glm::vec3(5.f, 5.f, 1.f); // fit height full window
|
||||
|
||||
// default mixing nodes
|
||||
groups_[View::MIXING] = new Group;
|
||||
Frame *frame = new Frame;
|
||||
groups_[View::MIXING]->addChild(frame);
|
||||
groups_[View::MIXING]->scale_ = glm::vec3(0.25f, 0.25f, 1.f);
|
||||
|
||||
// add source to the list
|
||||
sources_.push_back(this);
|
||||
}
|
||||
|
||||
Source::~Source()
|
||||
{
|
||||
// delete groups and their children
|
||||
delete groups_[View::RENDERING];
|
||||
delete groups_[View::MIXING];
|
||||
groups_.clear();
|
||||
|
||||
// remove this source from the list
|
||||
sources_.remove(this);
|
||||
}
|
||||
|
||||
@@ -46,7 +70,6 @@ std::string Source::rename (std::string newname)
|
||||
return name_;
|
||||
}
|
||||
|
||||
|
||||
SourceList::iterator Source::begin()
|
||||
{
|
||||
return sources_.begin();
|
||||
@@ -61,3 +84,47 @@ uint Source::numSource()
|
||||
{
|
||||
return sources_.size();
|
||||
}
|
||||
|
||||
MediaSource::MediaSource(std::string name, std::string uri) : Source(name)
|
||||
{
|
||||
surface_ = new MediaSurface(uri);
|
||||
|
||||
// add the surface to draw in the views
|
||||
groups_[View::RENDERING]->addChild(surface_);
|
||||
groups_[View::MIXING]->addChild(surface_);
|
||||
|
||||
}
|
||||
|
||||
MediaSource::~MediaSource()
|
||||
{
|
||||
// TODO verify that surface_ node is deleted in Source destructor
|
||||
}
|
||||
|
||||
Shader *MediaSource::shader() const
|
||||
{
|
||||
return surface_->shader();
|
||||
}
|
||||
|
||||
std::string MediaSource::uri() const
|
||||
{
|
||||
return surface_->getUri();
|
||||
}
|
||||
|
||||
MediaPlayer *MediaSource::mediaplayer() const
|
||||
{
|
||||
return surface_->getMediaPlayer();
|
||||
}
|
||||
|
||||
void MediaSource::render()
|
||||
{
|
||||
// surface_->shader()
|
||||
|
||||
// scalle all mixing nodes to match scale of surface
|
||||
for (NodeSet::iterator node = groups_[View::MIXING]->begin();
|
||||
node != groups_[View::MIXING]->end(); node++) {
|
||||
(*node)->scale_ = surface_->scale_;
|
||||
}
|
||||
|
||||
// read position of the mixing node and interpret this as transparency change
|
||||
|
||||
}
|
||||
|
||||
51
Source.h
51
Source.h
@@ -2,11 +2,16 @@
|
||||
#define SOURCE_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <list>
|
||||
|
||||
#include "FrameBuffer.h"
|
||||
#include "ImageShader.h"
|
||||
#include "Primitives.h"
|
||||
#include "View.h"
|
||||
|
||||
class ImageShader;
|
||||
class Surface;
|
||||
class FrameBuffer;
|
||||
class MediaPlayer;
|
||||
class MediaSurface;
|
||||
|
||||
class Source;
|
||||
// TODO : source set sorted by shader
|
||||
@@ -17,6 +22,7 @@ class Source
|
||||
{
|
||||
public:
|
||||
// create a source and add it to the list
|
||||
// only subclasses of sources can actually be instanciated
|
||||
Source(std::string name);
|
||||
virtual ~Source();
|
||||
|
||||
@@ -24,13 +30,13 @@ public:
|
||||
inline std::string name () const { return name_; }
|
||||
std::string rename (std::string newname);
|
||||
|
||||
// void setCustomShader();
|
||||
inline Shader *shader() const { return shader_; }
|
||||
// get handle on the node used to manipulate the source in a view
|
||||
inline Group *group(View::Mode m) { return groups_[m]; }
|
||||
|
||||
// for scene
|
||||
inline FrameBufferSurface *surface() const { return surface_; }
|
||||
// every Source have a shader to control visual effects
|
||||
virtual Shader *shader() const = 0;
|
||||
|
||||
// only subclasses of sources can actually be instanciated
|
||||
// every Source shall be rendered before draw
|
||||
virtual void render() = 0;
|
||||
|
||||
// global management of list of sources
|
||||
@@ -42,12 +48,8 @@ protected:
|
||||
// name
|
||||
std::string name_;
|
||||
|
||||
// a source draws in a frame buffer an input using a given shader
|
||||
FrameBuffer *buffer_;
|
||||
ImageShader *shader_;
|
||||
|
||||
// a surface is used to draw in the scenes
|
||||
FrameBufferSurface *surface_;
|
||||
// nodes
|
||||
std::map<View::Mode, Group*> groups_;
|
||||
|
||||
// static global list of sources
|
||||
static SourceList sources_;
|
||||
@@ -68,4 +70,25 @@ private:
|
||||
|
||||
};
|
||||
|
||||
class MediaSource : public Source
|
||||
{
|
||||
public:
|
||||
MediaSource(std::string name, std::string uri);
|
||||
~MediaSource();
|
||||
|
||||
void render();
|
||||
|
||||
// Source interface
|
||||
Shader *shader() const;
|
||||
|
||||
// Media specific interface
|
||||
std::string uri() const;
|
||||
MediaPlayer *mediaplayer() const;
|
||||
|
||||
protected:
|
||||
|
||||
MediaSurface *surface_;
|
||||
};
|
||||
|
||||
|
||||
#endif // SOURCE_H
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtx/string_cast.hpp>
|
||||
|
||||
// generic image loader
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
@@ -161,34 +162,47 @@ void UserInterface::handleMouse()
|
||||
// if not on any window
|
||||
if ( !ImGui::IsAnyWindowHovered() && !ImGui::IsAnyWindowFocused() )
|
||||
{
|
||||
ImGui::FocusWindow(0);
|
||||
//
|
||||
// Mouse wheel over background
|
||||
//
|
||||
if ( io.MouseWheel != 0) {
|
||||
|
||||
// scroll => zoom current view
|
||||
Mixer::manager().currentView()->zoom( io.MouseWheel );
|
||||
}
|
||||
//
|
||||
// RIGHT Mouse button
|
||||
//
|
||||
if ( ImGui::IsMouseDown(ImGuiMouseButton_Right)) {
|
||||
|
||||
Log::Info("Right Mouse press (%.1f,%.1f)", io.MousePos.x, io.MousePos.y);
|
||||
|
||||
glm::vec3 point = Rendering::manager().unProject(glm::vec2(io.MousePos.x, io.MousePos.y),
|
||||
Mixer::manager().currentView()->scene.root()->transform_ );
|
||||
|
||||
Log::Info(" (%.1f,%.1f)", point.x, point.y);
|
||||
|
||||
Log::Info(" wheel %.1f", io.MouseWheel);
|
||||
}
|
||||
|
||||
if ( ImGui::IsMouseDragging(ImGuiMouseButton_Right, 10.0f) )
|
||||
{
|
||||
// Log::Info("Mouse drag (%.1f,%.1f)(%.1f,%.1f)", io.MouseDelta.x, io.MouseDelta.y, io.MousePos.x, io.MousePos.y);
|
||||
|
||||
// right mouse drag => drag current view
|
||||
Mixer::manager().currentView()->drag( glm::vec2(io.MouseClickedPos[ImGuiMouseButton_Right].x, io.MouseClickedPos[ImGuiMouseButton_Right].y), glm::vec2(io.MousePos.x, io.MousePos.y));
|
||||
|
||||
ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeAll);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
else
|
||||
ImGui::SetMouseCursor(ImGuiMouseCursor_Arrow);
|
||||
}
|
||||
|
||||
//
|
||||
// RIGHT Mouse button
|
||||
//
|
||||
if ( ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
|
||||
|
||||
Log::Info("Mouse press (%.1f,%.1f)", io.MousePos.x, io.MousePos.y);
|
||||
|
||||
glm::mat4 mv = glm::identity<glm::mat4>();
|
||||
glm::vec3 point = Rendering::manager().unProject(glm::vec2(io.MousePos.x, io.MousePos.y), mv);
|
||||
glm::vec3 point = Rendering::manager().unProject(glm::vec2(io.MousePos.x, io.MousePos.y),
|
||||
Mixer::manager().currentView()->scene.root()->transform_ );
|
||||
|
||||
Log::Info(" (%.1f,%.1f)", point.x, point.y);
|
||||
|
||||
|
||||
15
View.cpp
15
View.cpp
@@ -23,6 +23,7 @@ void View::update(float dt)
|
||||
|
||||
MixingView::MixingView() : View()
|
||||
{
|
||||
// Mixing scene
|
||||
Mesh *disk = new Mesh("mesh/disk.ply", "images/transparencygrid.png");
|
||||
backgound_.addChild(disk);
|
||||
|
||||
@@ -30,26 +31,18 @@ MixingView::MixingView() : View()
|
||||
LineCircle *circle = new LineCircle(pink, 5);
|
||||
backgound_.addChild(circle);
|
||||
|
||||
|
||||
scene.root()->addChild(&backgound_);
|
||||
scene.root()->addChild(&foreground_);
|
||||
|
||||
// make sure there is no depth fight
|
||||
// foreground.translation_ = glm::vec3(0.f, 0.f, 0.1f);
|
||||
}
|
||||
|
||||
MixingView::~MixingView()
|
||||
{
|
||||
// delete background
|
||||
for (NodeSet::iterator node = backgound_.begin(); node != backgound_.end(); node++) {
|
||||
delete (*node);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void MixingView::draw()
|
||||
{
|
||||
// draw in main view
|
||||
// draw scene of this view
|
||||
scene.root()->draw(glm::identity<glm::mat4>(), Rendering::manager().Projection());
|
||||
}
|
||||
|
||||
@@ -104,7 +97,7 @@ void RenderView::setResolution(uint width, uint height)
|
||||
void RenderView::draw()
|
||||
{
|
||||
static glm::mat4 projection = glm::ortho(-SCENE_UNIT, SCENE_UNIT, -SCENE_UNIT, SCENE_UNIT, SCENE_DEPTH, 0.f);
|
||||
glm::mat4 P = glm::scale( projection, glm::vec3(1.f, frame_buffer_->aspectRatio(), 1.f));
|
||||
glm::mat4 P = glm::scale( projection, glm::vec3(1.f / frame_buffer_->aspectRatio(), 1.f, 1.f));
|
||||
frame_buffer_->begin();
|
||||
scene.root()->draw(glm::identity<glm::mat4>(), P);
|
||||
frame_buffer_->end();
|
||||
|
||||
4
View.h
4
View.h
@@ -11,6 +11,8 @@ class View
|
||||
public:
|
||||
View();
|
||||
|
||||
typedef enum {RENDERING = 0, MIXING=1, GEOMETRY=2, LAYER=3, INVALID=4 } Mode;
|
||||
|
||||
virtual void update (float dt);
|
||||
virtual void draw () = 0;
|
||||
virtual void zoom (float) {}
|
||||
@@ -20,7 +22,6 @@ public:
|
||||
|
||||
protected:
|
||||
Group backgound_;
|
||||
Group foreground_;
|
||||
};
|
||||
|
||||
|
||||
@@ -33,6 +34,7 @@ public:
|
||||
void draw () override;
|
||||
void zoom (float factor);
|
||||
void drag (glm::vec2 from, glm::vec2 to);
|
||||
|
||||
};
|
||||
|
||||
class RenderView : public View
|
||||
|
||||
33
Visitor.h
33
Visitor.h
@@ -7,10 +7,12 @@
|
||||
class Node;
|
||||
class Group;
|
||||
class Switch;
|
||||
class Animation;
|
||||
class Primitive;
|
||||
class Scene;
|
||||
class ImageSurface;
|
||||
class MediaSurface;
|
||||
class FrameBufferSurface;
|
||||
class LineStrip;
|
||||
class LineSquare;
|
||||
class LineCircle;
|
||||
@@ -24,20 +26,23 @@ class Visitor {
|
||||
|
||||
public:
|
||||
// Declare overloads for each kind of Node to visit
|
||||
virtual void visit(Scene& n) = 0;
|
||||
virtual void visit(Node& n) = 0;
|
||||
virtual void visit(Group& n) = 0;
|
||||
virtual void visit(Switch& n) = 0;
|
||||
virtual void visit(Primitive& n) = 0;
|
||||
virtual void visit(ImageSurface& n) = 0;
|
||||
virtual void visit(MediaSurface& n) = 0;
|
||||
virtual void visit(LineStrip& n) = 0;
|
||||
virtual void visit(LineSquare& n) = 0;
|
||||
virtual void visit(LineCircle& n) = 0;
|
||||
virtual void visit(Mesh& n) = 0;
|
||||
virtual void visit(MediaPlayer& n) = 0;
|
||||
virtual void visit(Shader& n) = 0;
|
||||
virtual void visit(ImageShader& n) = 0;
|
||||
virtual void visit (Scene&) = 0;
|
||||
virtual void visit (Node&) = 0;
|
||||
virtual void visit (Group&) = 0;
|
||||
virtual void visit (Switch&) = 0;
|
||||
virtual void visit (Animation&) = 0;
|
||||
virtual void visit (Primitive&) = 0;
|
||||
virtual void visit (ImageSurface&) = 0;
|
||||
virtual void visit (MediaSurface&) = 0;
|
||||
virtual void visit (FrameBufferSurface&) = 0;
|
||||
virtual void visit (LineStrip&) = 0;
|
||||
virtual void visit (LineSquare&) = 0;
|
||||
virtual void visit (LineCircle&) = 0;
|
||||
virtual void visit (Mesh&) = 0;
|
||||
|
||||
virtual void visit (MediaPlayer&) = 0;
|
||||
virtual void visit (Shader&) = 0;
|
||||
virtual void visit (ImageShader&) = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
69
main.cpp
69
main.cpp
@@ -31,7 +31,7 @@
|
||||
#include "Mixer.h"
|
||||
#include "RenderingManager.h"
|
||||
#include "UserInterfaceManager.h"
|
||||
|
||||
#include "FrameBuffer.h"
|
||||
|
||||
#include "MediaPlayer.h"
|
||||
#include "Scene.h"
|
||||
@@ -55,9 +55,9 @@
|
||||
//// ("file:///Users/Herbelin/Movies/mp2test.mpg");
|
||||
|
||||
|
||||
MediaSurface testnode1("file:///home/bhbn/Videos/iss.mov");
|
||||
//MediaSurface testnode1("file:///home/bhbn/Videos/iss.mov");
|
||||
MediaSurface testnode2("file:///home/bhbn/Videos/fish.mp4");
|
||||
ImageSurface testnode3("images/seed_512.jpg");
|
||||
//ImageSurface testnode3("images/seed_512.jpg");
|
||||
|
||||
|
||||
void drawMediaPlayer()
|
||||
@@ -200,7 +200,8 @@ void drawScene()
|
||||
// draw GUI tree scene
|
||||
ImGui::Begin(IMGUI_TITLE_MAINWINDOW);
|
||||
static ImGuiVisitor v;
|
||||
Mixer::manager().currentView()->scene.accept(v);
|
||||
// Mixer::manager().currentView()->scene.accept(v);
|
||||
Mixer::manager().getView(View::RENDERING)->scene.accept(v);
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
@@ -255,56 +256,56 @@ int main(int, char**)
|
||||
// UserInterface::manager().OpenTextEditor( Resource::getText("shaders/texture-shader.fs") );
|
||||
|
||||
// init the scene
|
||||
Mixer::manager().setCurrentView(Mixer::MIXING);
|
||||
Mixer::manager().setCurrentView(View::MIXING);
|
||||
Rendering::manager().PushFrontDrawCallback(drawScene);
|
||||
|
||||
// init elements to the scene
|
||||
//testnode3.getShader()->blending = Shader::BLEND_OPACITY;
|
||||
|
||||
Mesh disk("mesh/disk.ply", "images/transparencygrid.png");
|
||||
Mixer::manager().createSourceMedia("file:///home/bhbn/Videos/iss.mov");
|
||||
Mixer::manager().createSourceMedia("file:///home/bhbn/Videos/fish.mp4");
|
||||
|
||||
glm::vec4 pink( 0.8f, 0.f, 0.8f, 1.f );
|
||||
LineCircle circle(pink, 5);
|
||||
// Mesh disk("mesh/disk.ply", "images/transparencygrid.png");
|
||||
|
||||
// glm::vec4 pink( 0.8f, 0.f, 0.8f, 1.f );
|
||||
// LineCircle circle(pink, 5);
|
||||
|
||||
// glm::vec4 color( 0.8f, 0.8f, 0.f, 1.f);
|
||||
// LineSquare border(color, 5);
|
||||
// Mesh shadow("mesh/shadow.ply", "mesh/shadow.png");
|
||||
// Mesh meshicon("mesh/icon_video.ply");
|
||||
|
||||
Frame frame;
|
||||
frame.scale_ = glm::vec3(1.7777778f, 1.f, 1.f);
|
||||
// Frame frame;
|
||||
// frame.scale_ = glm::vec3(1.7777778f, 1.f, 1.f);
|
||||
|
||||
Group g1;
|
||||
g1.translation_ = glm::vec3(1.f, 1.f, 1.f);
|
||||
g1.scale_ = glm::vec3(0.8f, 0.8f, 1.f);
|
||||
// Group g1;
|
||||
// g1.translation_ = glm::vec3(1.f, 1.f, 1.f);
|
||||
// g1.scale_ = glm::vec3(0.8f, 0.8f, 1.f);
|
||||
|
||||
Group g2;
|
||||
g2.translation_ = glm::vec3(-1.f, -1.f, 2.f);
|
||||
// Group g2;
|
||||
// g2.translation_ = glm::vec3(-1.f, -1.f, 2.f);
|
||||
|
||||
Animation A;
|
||||
A.translation_ = glm::vec3(0.f, 0.f, 3.f);
|
||||
A.speed_ = 0.1f;
|
||||
A.axis_ = glm::vec3(1.f, 1.f, 1.f);
|
||||
// Animation A;
|
||||
// A.translation_ = glm::vec3(0.f, 0.f, 3.f);
|
||||
// A.speed_ = 0.1f;
|
||||
// A.axis_ = glm::vec3(1.f, 1.f, 1.f);
|
||||
|
||||
// std::vector<glm::vec3> pts = std::vector<glm::vec3> { glm::vec3( 0.f, 0.f, 0.f ) };
|
||||
// Points P(pts, pink);
|
||||
// P.setPointSize(60);
|
||||
Mesh P("mesh/point.ply");
|
||||
P.scale_ = glm::vec3(0.15f);
|
||||
//// std::vector<glm::vec3> pts = std::vector<glm::vec3> { glm::vec3( 0.f, 0.f, 0.f ) };
|
||||
//// Points P(pts, pink);
|
||||
//// P.setPointSize(60);
|
||||
// Mesh P("mesh/point.ply");
|
||||
// P.scale_ = glm::vec3(0.15f);
|
||||
|
||||
// build tree
|
||||
Mixer::manager().currentView()->scene.root()->addChild(&disk);
|
||||
Mixer::manager().currentView()->scene.root()->addChild(&circle);
|
||||
|
||||
g1.addChild(&testnode3);
|
||||
Mixer::manager().currentView()->scene.root()->addChild(&g1);
|
||||
// g1.addChild(&testnode3);
|
||||
// Mixer::manager().currentView()->scene.root()->addChild(&g1);
|
||||
|
||||
g2.addChild(&testnode1);
|
||||
g2.addChild(&frame);
|
||||
Mixer::manager().currentView()->scene.root()->addChild(&g2);
|
||||
// g2.addChild(&testnode1);
|
||||
// g2.addChild(&frame);
|
||||
// Mixer::manager().currentView()->scene.root()->addChild(&g2);
|
||||
|
||||
A.addChild(&P);
|
||||
Mixer::manager().currentView()->scene.root()->addChild(&A);
|
||||
// A.addChild(&P);
|
||||
// Mixer::manager().currentView()->scene.root()->addChild(&A);
|
||||
|
||||
// init output FBO
|
||||
Rendering::manager().PushBackDrawCallback(drawPreview);
|
||||
|
||||
Reference in New Issue
Block a user