Implementation of vertical crop (2 axis projection manipulation in frame

buffer). Cleanup of UI for appearance view.
This commit is contained in:
brunoherbelin
2020-11-26 20:30:37 +01:00
parent b6af17f283
commit 20f1320e2d
15 changed files with 575 additions and 162 deletions

View File

@@ -341,6 +341,7 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
icons[BUSY] = new Mesh("mesh/icon_circles.ply"); icons[BUSY] = new Mesh("mesh/icon_circles.ply");
icons[LOCK] = new Mesh("mesh/icon_lock.ply"); icons[LOCK] = new Mesh("mesh/icon_lock.ply");
icons[UNLOCK] = new Mesh("mesh/icon_unlock.ply"); icons[UNLOCK] = new Mesh("mesh/icon_unlock.ply");
icons[CROP] = new Mesh("mesh/icon_rightarrow.ply");
icons[CIRCLE] = new Mesh("mesh/icon_circle.ply"); icons[CIRCLE] = new Mesh("mesh/icon_circle.ply");
icons[CLOCK] = new Mesh("mesh/icon_clock.ply"); icons[CLOCK] = new Mesh("mesh/icon_clock.ply");
icons[CLOCK_H] = new Mesh("mesh/icon_clock_hand.ply"); icons[CLOCK_H] = new Mesh("mesh/icon_clock_hand.ply");

View File

@@ -55,20 +55,21 @@ protected:
Mesh *shadow_; Mesh *shadow_;
glm::vec2 corner_; glm::vec2 corner_;
Type type_; Type type_;
}; };
class Symbol : public Node class Symbol : public Node
{ {
public: public:
typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, VIDEO, SESSION, CLONE, RENDER, PATTERN, CAMERA, SHARE, typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, VIDEO, SESSION, CLONE, RENDER, PATTERN, CAMERA, SHARE,
DOTS, BUSY, LOCK, UNLOCK, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type; DOTS, BUSY, LOCK, UNLOCK, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type;
Symbol(Type t = CIRCLE_POINT, glm::vec3 pos = glm::vec3(0.f)); Symbol(Type t = CIRCLE_POINT, glm::vec3 pos = glm::vec3(0.f));
~Symbol(); ~Symbol();
void draw (glm::mat4 modelview, glm::mat4 projection) override; void draw (glm::mat4 modelview, glm::mat4 projection) override;
void accept (Visitor& v) override; void accept (Visitor& v) override;
GlmToolkit::AxisAlignedBoundingBox bbox() const { return symbol_->bbox(); }
Type type() const { return type_; } Type type() const { return type_; }
glm::vec4 color; glm::vec4 color;

View File

@@ -28,7 +28,7 @@ FrameBuffer::FrameBuffer(glm::vec3 resolution, bool useAlpha, bool multiSampling
{ {
attrib_.viewport = glm::ivec2(resolution); attrib_.viewport = glm::ivec2(resolution);
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f); attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f);
projection_ = glm::ortho(-1.f, 1.f, 1.f, -1.f, -1.f, 1.f); crop(glm::vec2(1.f, 1.f));
} }
FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampling): FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampling):
@@ -37,7 +37,7 @@ FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampl
{ {
attrib_.viewport = glm::ivec2(width, height); attrib_.viewport = glm::ivec2(width, height);
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f); attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f);
projection_ = glm::ortho(-1.f, 1.f, 1.f, -1.f, -1.f, 1.f); crop(glm::vec2(1.f, 1.f));
} }
void FrameBuffer::init() void FrameBuffer::init()
@@ -252,14 +252,16 @@ glm::mat4 FrameBuffer::projection() const
return projection_; return projection_;
} }
float FrameBuffer::projectionAspectRatio() const
glm::vec2 FrameBuffer::projectionArea() const
{ {
return ( 1.f / projection_[0][0] ); // TODO height return projection_crop_;
} }
void FrameBuffer::crop(glm::vec2 c) void FrameBuffer::crop(glm::vec2 c)
{ {
glm::vec2 scale = glm::clamp(c, glm::vec2(0.2f, 0.2f), glm::vec2(1.f, 1.f)); projection_crop_.x = CLAMP(c.x, 0.1f, 1.f);
projection_ = glm::ortho(-scale.x, scale.x, scale.y, -scale.y, -1.f, 1.f); projection_crop_.y = CLAMP(c.y, 0.1f, 1.f);
projection_ = glm::ortho(-projection_crop_.x, projection_crop_.x, projection_crop_.y, -projection_crop_.y, -1.f, 1.f);
} }

View File

@@ -44,7 +44,7 @@ public:
// projection and crop // projection and crop
glm::mat4 projection() const; glm::mat4 projection() const;
float projectionAspectRatio() const; glm::vec2 projectionArea() const;
void crop(glm::vec2 c); void crop(glm::vec2 c);
// internal pixel format // internal pixel format
@@ -60,6 +60,7 @@ private:
RenderingAttrib attrib_; RenderingAttrib attrib_;
glm::mat4 projection_; glm::mat4 projection_;
glm::vec2 projection_crop_;
uint textureid_, intermediate_textureid_; uint textureid_, intermediate_textureid_;
uint framebufferid_, intermediate_framebufferid_; uint framebufferid_, intermediate_framebufferid_;
bool use_alpha_, use_multi_sampling_; bool use_alpha_, use_multi_sampling_;

View File

@@ -396,10 +396,11 @@ void ImGuiVisitor::visit (Source& s)
// preview // preview
float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN; float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN;
float width = preview_width; float width = preview_width;
float height = width / ( s.frame()->aspectRatio() * s.frame()->projectionAspectRatio() ); glm::vec2 size = s.frame()->projectionArea() * glm::vec2( s.frame()->aspectRatio(), 1.f);
float height = width * size.y / size.x;
if (height > 200) { if (height > 200) {
height = 200; height = 200;
width = height * ( s.frame()->aspectRatio() * s.frame()->projectionAspectRatio() ); width = height * size.x / size.y;
} }
ImGui::Image((void*)(uintptr_t) s.frame()->texture(), ImVec2(width, height)); ImGui::Image((void*)(uintptr_t) s.frame()->texture(), ImVec2(width, height));

View File

@@ -170,6 +170,23 @@ void PickingVisitor::visit(Handles &n)
} }
void PickingVisitor::visit(Symbol& n)
{
// discard if not visible or if not exactly one point given for picking
if ((!n.visible_ && !force_) || points_.size() != 1)
return;
// apply inverse transform to the point of interest
glm::vec4 P = glm::inverse(modelview_) * glm::vec4( points_[0], 1.f );
// test bounding box for picking from a single point
if ( n.bbox().contains( glm::vec3(P)) ) {
// add this to the nodes picked
nodes_.push_back( std::pair(&n, glm::vec2(P)) );
}
}
void PickingVisitor::visit(Scene &n) void PickingVisitor::visit(Scene &n)
{ {
n.root()->accept(*this); n.root()->accept(*this);

View File

@@ -50,6 +50,11 @@ public:
* @param n * @param n
*/ */
void visit(Handles& n) override; void visit(Handles& n) override;
/**
* @brief visit Disk : picking grabber for mixing view
* @param n
*/
void visit(Symbol& n) override;
/** /**
* @brief visit Disk : picking grabber for mixing view * @brief visit Disk : picking grabber for mixing view
* @param n * @param n

View File

@@ -448,8 +448,9 @@ void Source::update(float dt)
// MODIFY CROP // MODIFY CROP
if (renderbuffer_) { if (renderbuffer_) {
groups_[View::MIXING]->scale_.x *= renderbuffer_->projectionAspectRatio(); glm::vec2 crop = renderbuffer_->projectionArea();
groups_[View::LAYER]->scale_.x = renderbuffer_->projectionAspectRatio(); groups_[View::MIXING]->scale_.x *= crop.x / crop.y;
groups_[View::LAYER]->scale_.x = crop.x / crop.y;
} }
need_update_ = false; need_update_ = false;

View File

@@ -1956,7 +1956,7 @@ void Navigator::Render()
Mixer::manager().setView(View::LAYER); Mixer::manager().setView(View::LAYER);
view_pannel_visible = previous_view == Settings::application.current_view; view_pannel_visible = previous_view == Settings::application.current_view;
} }
if (ImGui::Selectable( ICON_FA_IMAGE, &selected_view[4], 0, iconsize)) if (ImGui::Selectable( ICON_FA_SIGN, &selected_view[4], 0, iconsize))
{ {
Mixer::manager().setView(View::APPEARANCE); Mixer::manager().setView(View::APPEARANCE);
view_pannel_visible = previous_view == Settings::application.current_view; view_pannel_visible = previous_view == Settings::application.current_view;

183
View.cpp
View File

@@ -818,11 +818,20 @@ void showContextMenu(View::Mode m, const char* label)
s->group(m)->translation_ = glm::vec3(0,0,0); s->group(m)->translation_ = glm::vec3(0,0,0);
s->touch(); s->touch();
} }
else if (ImGui::Selectable( ICON_FA_VECTOR_SQUARE " Restore" )){ else if (ImGui::Selectable( ICON_FA_VECTOR_SQUARE " Reset" )){
s->group(m)->scale_ = glm::vec3(1,1,1); s->group(m)->scale_ = glm::vec3(1,1,1);
s->group(m)->rotation_.z = 0; s->group(m)->rotation_.z = 0;
s->touch(); s->touch();
} }
else if (ImGui::Selectable( ICON_FA_EXPAND " Fit" )){
FrameBuffer *output = Mixer::manager().session()->frame();
float w = 1.f;
if (output) w = output->aspectRatio() / s->frame()->aspectRatio();
s->group(m)->scale_ = glm::vec3(w,1,1);
s->group(m)->rotation_.z = 0;
s->group(m)->translation_ = glm::vec3(0,0,0);
s->touch();
}
else if (ImGui::Selectable( ICON_FA_PERCENTAGE " Original aspect ratio" )){ //ICON_FA_ARROWS_ALT_H else if (ImGui::Selectable( ICON_FA_PERCENTAGE " Original aspect ratio" )){ //ICON_FA_ARROWS_ALT_H
s->group(m)->scale_.x = s->group(m)->scale_.y; s->group(m)->scale_.x = s->group(m)->scale_.y;
s->touch(); s->touch();
@@ -1741,33 +1750,76 @@ AppearanceView::AppearanceView() : View(APPEARANCE), edit_source_(nullptr), need
// no settings found: store application default // no settings found: store application default
Settings::application.views[mode_].name = "Appearance"; Settings::application.views[mode_].name = "Appearance";
scene.root()->scale_ = glm::vec3(APPEARANCE_DEFAULT_SCALE, APPEARANCE_DEFAULT_SCALE, 1.0f); scene.root()->scale_ = glm::vec3(APPEARANCE_DEFAULT_SCALE, APPEARANCE_DEFAULT_SCALE, 1.0f);
scene.root()->translation_ = glm::vec3(1.8f, 0.f, 0.0f); scene.root()->translation_ = glm::vec3(0.8f, 0.f, 0.0f);
saveSettings(); saveSettings();
} }
else else
restoreSettings(); restoreSettings();
// Scene background // Scene background
//
// global dark
Surface *tmp = new Surface( new Shader); Surface *tmp = new Surface( new Shader);
tmp->scale_ = glm::vec3(20.f, 20.f, 1.f); tmp->scale_ = glm::vec3(20.f, 20.f, 1.f);
tmp->shader()->color = glm::vec4( 0.1f, 0.1f, 0.1f, 0.6f ); tmp->shader()->color = glm::vec4( 0.1f, 0.1f, 0.1f, 0.6f );
scene.bg()->attach(tmp); scene.bg()->attach(tmp);
backgroundframe = new Frame(Frame::SHARP, Frame::THIN, Frame::NONE); // frame showing the source original shape
backgroundframe->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 0.3f ); backgroundframe_ = new Surface( new Shader);
scene.bg()->attach(backgroundframe); backgroundframe_->shader()->color = glm::vec4( COLOR_LIMBO_CIRCLE, 0.8f );
scene.bg()->attach(backgroundframe_);
// Horizontal axis
horizontal_line_ = new Mesh("mesh/h_line.ply");
horizontal_line_->shader()->color = glm::vec4( COLOR_TRANSITION_LINES, 0.9f );
horizontal_line_->translation_ = glm::vec3(0.f, 1.1f, 0.0f);
horizontal_line_->scale_.x = 1.0f;
horizontal_line_->scale_.y = 3.0f;
scene.bg()->attach(horizontal_line_);
Mesh *mark = new Mesh("mesh/h_mark.ply");
mark->translation_ = glm::vec3(0.f, 1.1f, 0.0f);
mark->scale_ = glm::vec3(2.5f, -2.5f, 0.0f);
mark->shader()->color = glm::vec4( COLOR_TRANSITION_LINES, 0.9f );
scene.bg()->attach(mark);
// vertical axis
vertical_line_ = new Group;
Mesh *line = new Mesh("mesh/h_line.ply");
line->shader()->color = glm::vec4( COLOR_TRANSITION_LINES, 0.9f );
line->translation_ = glm::vec3(-0.1f, 0.0f, 0.0f);
line->scale_.x = 1.0f;
line->scale_.y = 3.0f;
line->rotation_.z = M_PI_2;
vertical_line_->attach(line);
mark = new Mesh("mesh/h_mark.ply");
mark->translation_ = glm::vec3(-0.1f, 0.0f, 0.0f);
mark->scale_ = glm::vec3(2.5f, -2.5f, 0.0f);
mark->rotation_.z = M_PI_2;
mark->shader()->color = glm::vec4( COLOR_TRANSITION_LINES, 0.9f );
vertical_line_->attach(mark);
scene.bg()->attach(vertical_line_);
// surface showing the source transparency background
backgroundpreview = new ImageSurface("images/checker.dds"); // black : TODO transparency grid backgroundpreview = new ImageSurface("images/checker.dds"); // black : TODO transparency grid
backgroundpreview->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f, 64.f)); backgroundpreview->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f, 64.f));
backgroundpreview->translation_.z = 0.001f; backgroundpreview->translation_.z = 0.001f;
scene.bg()->attach(backgroundpreview); scene.bg()->attach(backgroundpreview);
// surface to show the texture of the source
surfacepreview = new Surface; // to attach source preview surfacepreview = new Surface; // to attach source preview
surfacepreview->translation_.z = 0.002f; surfacepreview->translation_.z = 0.002f;
scene.bg()->attach(surfacepreview); scene.bg()->attach(surfacepreview);
// Geometry Scene foreground // Geometry Scene foreground
Frame *border = new Frame(Frame::SHARP, Frame::LARGE, Frame::GLOW); //
border->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 1.f ); // frame showing the edited source shape
scene.fg()->attach(border); foregroundframe_ = new Frame(Frame::SHARP, Frame::LARGE, Frame::GLOW);
foregroundframe_->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 1.f );
scene.fg()->attach(foregroundframe_);
// crop icons
crop_horizontal_ = new Symbol(Symbol::CROP);
crop_horizontal_->translation_ = glm::vec3(1.0f, 1.1f, 0.f);
scene.fg()->attach(crop_horizontal_);
crop_vertical_ = new Symbol(Symbol::CROP);
crop_vertical_->rotation_.z = M_PI_2;
crop_vertical_->translation_ = glm::vec3(-1.1f, -1.0f, 0.f);
scene.fg()->attach(crop_vertical_);
// User interface foreground // User interface foreground
// //
// point to show POSITION // point to show POSITION
@@ -1904,6 +1956,10 @@ std::pair<Node *, glm::vec2> AppearanceView::pick(glm::vec2 P)
pick = *itp; pick = *itp;
break; break;
} }
else if ( (*itp).first == crop_horizontal_ || (*itp).first == crop_vertical_ ) {
pick = *itp;
break;
}
} }
// not found: the edit source was not clicked // not found: the edit source was not clicked
if ( itp == pv.rend() ) if ( itp == pv.rend() )
@@ -1930,25 +1986,34 @@ void AppearanceView::adjustBackground()
{ {
// by default consider edit source is null // by default consider edit source is null
float image_original_width = 1.f; float image_original_width = 1.f;
float image_projection_width = 1.f; glm::vec2 image_crop_area = glm::vec2(1.f, 1.f);
surfacepreview->setTextureIndex(0); surfacepreview->setTextureIndex(0);
// if its a valid index // if its a valid index
if (edit_source_ != nullptr) { if (edit_source_ != nullptr) {
// update rendering frame to match edit source AR // update rendering frame to match edit source AR
image_original_width = edit_source_->frame()->aspectRatio(); image_original_width = edit_source_->frame()->aspectRatio();
image_projection_width = image_original_width * edit_source_->frame()->projectionAspectRatio();;
surfacepreview->setTextureIndex( edit_source_->frame()->texture() ); surfacepreview->setTextureIndex( edit_source_->frame()->texture() );
image_crop_area = edit_source_->frame()->projectionArea();
image_crop_area.x *= image_original_width;
} }
// update aspect ratio // update aspect ratio
backgroundframe->scale_.x = image_original_width;
surfacepreview->scale_.x = image_projection_width; // background
backgroundpreview->scale_.x = image_projection_width; horizontal_line_->scale_.x = image_original_width;
backgroundpreview->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f * image_projection_width, 64.f)); vertical_line_->translation_.x = -image_original_width;
for (NodeSet::iterator node = scene.fg()->begin(); node != scene.fg()->end(); node++) { backgroundframe_->scale_.x = image_original_width;
(*node)->scale_.x = image_projection_width;
} surfacepreview->scale_ = glm::vec3(image_crop_area, 1.f);
backgroundpreview->scale_ = glm::vec3(image_crop_area, 1.f);
backgroundpreview->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f * image_crop_area.x, 64.f * image_crop_area.y));
// foreground
crop_horizontal_->translation_.x = image_crop_area.x;
crop_vertical_->translation_.y = -image_crop_area.y;
crop_vertical_->translation_.x = -image_original_width - 0.1f;
foregroundframe_->scale_ = glm::vec3(image_crop_area, 1.f);
} }
Source *AppearanceView::getEditOrCurrentSource() Source *AppearanceView::getEditOrCurrentSource()
@@ -1991,42 +2056,20 @@ void AppearanceView::draw()
} }
showContextMenu(mode_,"AppearanceContextMenu"); showContextMenu(mode_,"AppearanceContextMenu");
// draw general view
// if ( edit_source_ != nullptr ) {
// glm::vec2 P = Rendering::manager().project(glm::vec3(1.1f, 1.14f, 0.f), scene.root()->transform_, false);
// ImGui::SetNextWindowPos(ImVec2(P.x, P.y), ImGuiCond_Always);
// if (ImGui::Begin("##WIDTH", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoBackground
// | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings
// | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
// {
// ImGuiToolkit::PushFont(ImGuiToolkit::FONT_LARGE);
// ImGui::SetNextItemWidth(100.f);
// float crop_width = edit_source_->frame()->projectionAspectRatio();
// if ( ImGui::DragFloat("##apppearancewidth", &crop_width, 0.05f, 0.2f, 1.f, "%.1f ") )
// {
// // crop horizontally
// edit_source_->frame()->crop(glm::vec2(crop_width, 1.f));
// // TODO scale GEOMETRY and RENDER groups
// edit_source_->touch();
// // update background and frame
// adjustBackground();
// }
// ImGui::PopFont();
// ImGui::End();
// }
// }
Shader::force_blending_opacity = true; Shader::force_blending_opacity = true;
View::draw(); View::draw();
Shader::force_blending_opacity = false; Shader::force_blending_opacity = false;
if (edit_source_ != nullptr){ if (edit_source_ != nullptr){
// force to redraw the frame of the edit source (even if source is not visible) // force to redraw the frame of the edit source (even if source is not visible)
DrawVisitor dv(edit_source_->frames_[mode_], Rendering::manager().Projection(), true); DrawVisitor dv(edit_source_->frames_[mode_], Rendering::manager().Projection(), true);
scene.accept(dv); scene.accept(dv);
// float edit_width = edit_source_->frame()->aspectRatio();
// glm::vec2 cropped = edit_source_->frame()->projectionArea();
// crop_horizontal_->translation_.x = cropped.x * edit_width;
} }
} }
@@ -2034,16 +2077,53 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
{ {
View::Cursor ret = Cursor(); View::Cursor ret = Cursor();
// work on the given source
if (!s)
return ret;
Group *sourceNode = s->group(mode_); // groups_[View::GEOMETRY]
// grab coordinates in scene-View reference frame // grab coordinates in scene-View reference frame
glm::vec3 scene_from = Rendering::manager().unProject(from, scene.root()->transform_); glm::vec3 scene_from = Rendering::manager().unProject(from, scene.root()->transform_);
glm::vec3 scene_to = Rendering::manager().unProject(to, scene.root()->transform_); glm::vec3 scene_to = Rendering::manager().unProject(to, scene.root()->transform_);
glm::vec3 scene_translation = scene_to - scene_from; glm::vec3 scene_translation = scene_to - scene_from;
// work on the given source
if (!s) {
if ( edit_source_ != nullptr ) {
// make sure matrix transform of stored status is updated
edit_source_->stored_status_->update(0);
// picking on the resizing handles in the corners
if ( pick.first == crop_horizontal_ ) {
// crop horizontally
glm::vec2 cropped = edit_source_->frame()->projectionArea();
float max_width = edit_source_->frame()->aspectRatio();
cropped.x = CLAMP(scene_to.x, 0.2f, max_width) / max_width;
edit_source_->frame()->crop(cropped);
// TODO scale GEOMETRY and RENDER groups
edit_source_->touch();
// update background and frame
adjustBackground();
// cursor indication
ret.type = Cursor_ResizeEW;
}
if ( pick.first == crop_vertical_ ) {
// crop vertically
glm::vec2 cropped = edit_source_->frame()->projectionArea();
cropped.y = -1.f * CLAMP(scene_to.y, -1.f, -0.2f);
edit_source_->frame()->crop(cropped);
// TODO scale GEOMETRY and RENDER groups
edit_source_->touch();
// update background and frame
adjustBackground();
// cursor indication
ret.type = Cursor_ResizeNS;
}
}
return ret;
}
Group *sourceNode = s->group(mode_); // groups_[View::GEOMETRY]
// make sure matrix transform of stored status is updated // make sure matrix transform of stored status is updated
s->stored_status_->update(0); s->stored_status_->update(0);
@@ -2075,6 +2155,7 @@ View::Cursor AppearanceView::grab (Source *s, glm::vec2 from, glm::vec2 to, std:
// convert source position in corner reference frame // convert source position in corner reference frame
glm::vec4 center = scene_to_corner_transform * glm::vec4( s->stored_status_->translation_, 1.f); glm::vec4 center = scene_to_corner_transform * glm::vec4( s->stored_status_->translation_, 1.f);
// picking on the resizing handles in the corners // picking on the resizing handles in the corners
if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) { if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) {

14
View.h
View File

@@ -12,6 +12,8 @@ typedef std::list<Source *> SourceList;
class SessionSource; class SessionSource;
class Surface; class Surface;
class Symbol; class Symbol;
class Mesh;
class Frame;
class View class View
{ {
@@ -212,8 +214,8 @@ public:
void play(bool open); void play(bool open);
private: private:
class Surface *output_surface_; Surface *output_surface_;
class Mesh *mark_100ms_, *mark_1s_; Mesh *mark_100ms_, *mark_1s_;
Switch *gradient_; Switch *gradient_;
SessionSource *transition_source_; SessionSource *transition_source_;
}; };
@@ -247,10 +249,16 @@ private:
void adjustBackground(); void adjustBackground();
class Frame *backgroundframe;
Surface *backgroundpreview; Surface *backgroundpreview;
Surface *surfacepreview; Surface *surfacepreview;
Surface *backgroundframe_;
Frame *foregroundframe_;
Mesh *horizontal_line_;
Group *vertical_line_;
Symbol *crop_horizontal_;
Symbol *crop_vertical_;
Symbol *overlay_position_; Symbol *overlay_position_;
Symbol *overlay_position_cross_; Symbol *overlay_position_cross_;
Symbol *overlay_scaling_; Symbol *overlay_scaling_;

View File

@@ -19,6 +19,7 @@ class LineCircle;
class Mesh; class Mesh;
class Frame; class Frame;
class Handles; class Handles;
class Symbol;
class Disk; class Disk;
class Stream; class Stream;
class MediaPlayer; class MediaPlayer;
@@ -57,6 +58,7 @@ public:
virtual void visit (Mesh&) {} virtual void visit (Mesh&) {}
virtual void visit (Frame&) {} virtual void visit (Frame&) {}
virtual void visit (Handles&) {} virtual void visit (Handles&) {}
virtual void visit (Symbol&) {}
virtual void visit (Disk&) {} virtual void visit (Disk&) {}
virtual void visit (Stream&) {} virtual void visit (Stream&) {}
virtual void visit (MediaPlayer&) {} virtual void visit (MediaPlayer&) {}

View File

@@ -39,7 +39,7 @@
#define LAYER_DEFAULT_SCALE 0.8f #define LAYER_DEFAULT_SCALE 0.8f
#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 APPEARANCE_DEFAULT_SCALE 1.6f #define APPEARANCE_DEFAULT_SCALE 2.f
#define APPEARANCE_MIN_SCALE 0.4f #define APPEARANCE_MIN_SCALE 0.4f
#define APPEARANCE_MAX_SCALE 10.0f #define APPEARANCE_MAX_SCALE 10.0f
#define TRANSITION_DEFAULT_SCALE 5.0f #define TRANSITION_DEFAULT_SCALE 5.0f

View File

@@ -1,7 +1,7 @@
ply ply
format ascii 1.0 format ascii 1.0
comment Created by Blender 2.83.1 - www.blender.org, source file: 'h_line.blend' comment Created by Blender 2.91.0 - www.blender.org
element vertex 26 element vertex 14
property float x property float x
property float y property float y
property float z property float z
@@ -9,56 +9,32 @@ property uchar red
property uchar green property uchar green
property uchar blue property uchar blue
property uchar alpha property uchar alpha
element face 24 element face 12
property list uchar uint vertex_indices property list uchar uint vertex_indices
end_header end_header
0.003030 -0.016358 0.000000 255 255 255 255 0.982449 0.001584 0.000000 255 255 255 255
-0.000000 -0.013902 0.000000 255 255 255 255 1.000075 -0.001403 0.000000 255 255 255 255
-0.000000 -0.016360 0.000000 255 255 255 255 1.000097 0.001584 0.000000 255 255 255 255
0.003030 -0.010598 0.000000 255 255 255 255 0.971637 -0.001403 0.000000 255 255 255 255
-0.000000 -0.008243 0.000000 255 255 255 255 -0.036323 0.001584 0.000000 255 255 255 255
0.003030 -0.005245 0.000000 255 255 255 255 -0.963025 0.001584 0.000000 255 255 255 255
0.000000 0.000013 0.000000 255 255 255 255 -0.976754 -0.001385 0.000000 255 255 255 255
-0.017626 0.003000 0.000000 255 255 255 255 -0.951104 -0.001403 0.000000 255 255 255 255
0.003200 0.003000 0.000000 255 255 255 255 -0.987628 0.001584 0.000000 255 255 255 255
-0.036323 0.003000 0.000000 255 255 255 255 -1.000000 -0.001403 0.000000 255 255 255 255
-0.028438 0.000013 0.000000 255 255 255 255 -0.499475 0.001584 0.000000 255 255 255 255
-0.963025 0.003000 0.000000 255 255 255 255 -0.048249 -0.001403 0.000000 255 255 255 255
-0.976754 0.000031 0.000000 255 255 255 255 -1.000000 0.001584 0.000000 255 255 255 255
-0.951104 0.000013 0.000000 255 255 255 255 -0.499484 -0.001403 0.000000 255 255 255 255
-0.987628 0.003000 0.000000 255 255 255 255
-1.000000 0.000013 0.000000 255 255 255 255
-1.003292 -0.004700 0.000000 255 255 255 255
-1.003000 0.003000 0.000000 255 255 255 255
-1.003287 -0.010859 0.000000 255 255 255 255
-1.000000 -0.007704 0.000000 255 255 255 255
-0.499475 0.003000 0.000000 255 255 255 255
-0.048249 0.000013 0.000000 255 255 255 255
-1.003287 -0.016722 0.000000 255 255 255 255
-1.000000 -0.014160 0.000000 255 255 255 255
-0.499484 0.000013 0.000000 255 255 255 255
-1.000000 -0.016720 0.000000 255 255 255 255
3 0 1 2 3 0 1 2
3 3 4 1 3 3 0 4
3 5 6 4 3 5 6 7
3 7 6 8 3 8 9 6
3 9 10 7 3 7 10 5
3 11 12 13 3 10 11 4
3 14 15 12
3 16 15 17
3 18 19 16
3 13 20 11
3 20 21 9
3 22 23 18
3 0 3 1 3 0 3 1
3 3 5 4 3 4 11 3
3 5 8 6 3 5 8 6
3 7 10 6 3 8 12 9
3 9 21 10 3 7 13 10
3 11 14 12 3 10 13 11
3 14 17 15
3 16 19 15
3 18 23 19
3 13 24 20
3 20 24 21
3 22 25 23

View File

@@ -1,47 +1,364 @@
ply ply
format ascii 1.0 format ascii 1.0
comment Created by Blender 2.90.1 - www.blender.org comment Created by Blender 2.91.0 - www.blender.org
element vertex 18 element vertex 178
property float x property float x
property float y property float y
property float z property float z
property uchar red element face 176
property uchar green
property uchar blue
property uchar alpha
element face 15
property list uchar uint vertex_indices property list uchar uint vertex_indices
end_header end_header
-0.098559 0.044351 0.000000 255 255 255 255 -0.007848 0.007826 0.000000
-0.080774 0.054762 0.000000 255 255 255 255 -0.006431 0.036270 0.000000
-0.098559 0.097694 0.000000 255 255 255 255 -0.007848 0.036270 0.000000
-0.000743 -0.000102 0.000000 255 255 255 255 -0.004848 0.036270 0.000000
-0.080774 0.026570 0.000000 255 255 255 255 -0.003156 0.036270 0.000000
-0.025899 -0.000102 0.000000 255 255 255 255 -0.001410 0.036270 0.000000
-0.214161 -0.044555 0.000000 255 255 255 255 0.000337 0.036270 0.000000
-0.196376 0.026570 0.000000 255 255 255 255 0.002029 0.036270 0.000000
-0.214161 0.044351 0.000000 255 255 255 255 0.003612 0.036270 0.000000
-0.196376 -0.026773 0.000000 255 255 255 255 0.005029 0.036270 0.000000
-0.080774 -0.054965 0.000000 255 255 255 255 0.006227 0.036270 0.000000
-0.098559 -0.097898 0.000000 255 255 255 255 0.007151 0.036270 0.000000
-0.080774 -0.026773 0.000000 255 255 255 255 0.007746 0.036270 0.000000
-0.098559 -0.044555 0.000000 255 255 255 255 0.007956 0.036270 0.000000
0.000234 -0.099325 -0.001878 255 255 255 255 0.007956 0.007826 0.000000
0.020009 -0.099325 -0.001878 255 255 255 255 -0.044254 0.028970 0.000000
0.020009 0.097955 -0.001878 255 255 255 255 -0.041697 0.028916 0.000000
0.000234 0.097955 -0.001878 255 255 255 255 -0.042967 0.029065 0.000000
0.041804 0.028897 0.000000
0.044362 0.028951 0.000000
0.043074 0.029046 0.000000
-0.045523 0.028615 0.000000
0.045631 0.028597 0.000000
-0.040480 0.028538 0.000000
0.040587 0.028519 0.000000
-0.046737 0.027987 0.000000
0.046845 0.027968 0.000000
-0.039351 0.027945 0.000000
0.039459 0.027926 0.000000
-0.047861 0.027070 0.000000
0.047969 0.027051 0.000000
-0.038348 0.027152 0.000000
0.038455 0.027133 0.000000
-0.037505 0.026175 0.000000
0.037612 0.026156 0.000000
-0.048301 0.026630 0.000000
0.048408 0.026611 0.000000
-0.049517 0.025415 0.000000
0.049624 0.025396 0.000000
-0.036858 0.025027 0.000000
0.036966 0.025008 0.000000
-0.051354 0.023578 0.000000
0.051461 0.023559 0.000000
-0.036444 0.023724 0.000000
0.036552 0.023705 0.000000
-0.036298 0.022281 0.000000
0.036406 0.022262 0.000000
-0.053656 0.021276 0.000000
0.053763 0.021257 0.000000
-0.036298 0.021997 0.000000
0.036406 0.007826 0.000000
-0.036298 0.021211 0.000000
-0.056269 0.018664 0.000000
0.056376 0.018645 0.000000
-0.036298 0.020023 0.000000
-0.036298 0.018534 0.000000
-0.059037 0.015897 0.000000
0.059144 0.015878 0.000000
-0.036298 0.016844 0.000000
-0.036298 0.015054 0.000000
-0.061805 0.013129 0.000000
0.061912 0.013110 0.000000
-0.036298 0.013263 0.000000
-0.036298 0.011574 0.000000
-0.064418 0.010517 0.000000
0.064525 0.010498 0.000000
-0.036298 0.010085 0.000000
-0.066720 0.008215 0.000000
0.066828 0.008196 0.000000
-0.036298 0.008897 0.000000
-0.036298 0.008110 0.000000
-0.068557 0.006379 0.000000
0.068664 0.006360 0.000000
-0.036298 0.007826 0.000000
-0.069773 0.005163 0.000000
0.069880 0.005144 0.000000
-0.070213 0.004723 0.000000
0.070320 0.004704 0.000000
-0.070819 0.004030 0.000000
0.070926 0.004011 0.000000
-0.071315 0.003279 0.000000
0.071422 0.003260 0.000000
-0.071701 0.002483 0.000000
0.071808 0.002464 0.000000
-0.071976 0.001653 0.000000
0.072084 0.001634 0.000000
-0.072142 0.000800 0.000000
0.072249 0.000780 0.000000
-0.072197 -0.000065 0.000000
0.072304 -0.000084 0.000000
-0.072142 -0.000930 0.000000
0.072249 -0.000949 0.000000
-0.071976 -0.001783 0.000000
0.072084 -0.001802 0.000000
-0.071701 -0.002613 0.000000
0.071808 -0.002633 0.000000
-0.071315 -0.003410 0.000000
0.071422 -0.003429 0.000000
-0.070819 -0.004160 0.000000
0.070926 -0.004179 0.000000
-0.070213 -0.004854 0.000000
0.070320 -0.004873 0.000000
-0.069773 -0.005293 0.000000
0.069880 -0.005312 0.000000
-0.068557 -0.006509 0.000000
0.068664 -0.006528 0.000000
-0.066720 -0.008345 0.000000
-0.036298 -0.007975 0.000000
-0.007848 -0.007975 0.000000
0.007956 -0.007975 0.000000
0.036406 -0.007975 0.000000
0.066828 -0.008364 0.000000
-0.036298 -0.022412 0.000000
-0.007848 -0.036419 0.000000
-0.007043 -0.036419 0.000000
-0.001921 -0.036419 0.000000
0.007956 -0.036419 0.000000
0.036406 -0.008260 0.000000
0.036406 -0.009046 0.000000
-0.064418 -0.010647 0.000000
0.064525 -0.010666 0.000000
0.036406 -0.010234 0.000000
0.036406 -0.011723 0.000000
-0.061805 -0.013260 0.000000
0.061912 -0.013278 0.000000
0.036406 -0.013413 0.000000
-0.059037 -0.016027 0.000000
0.059144 -0.016046 0.000000
0.036406 -0.015203 0.000000
0.036406 -0.016993 0.000000
-0.056269 -0.018795 0.000000
0.056376 -0.018813 0.000000
0.036406 -0.018683 0.000000
0.036406 -0.020172 0.000000
-0.053656 -0.021407 0.000000
0.053763 -0.021426 0.000000
0.036406 -0.021360 0.000000
0.036406 -0.022146 0.000000
-0.051354 -0.023709 0.000000
0.051461 -0.023728 0.000000
0.036406 -0.022431 0.000000
-0.036444 -0.023855 0.000000
0.036552 -0.023874 0.000000
-0.049517 -0.025545 0.000000
0.049624 -0.025564 0.000000
-0.036858 -0.025158 0.000000
0.036966 -0.025176 0.000000
-0.037505 -0.026305 0.000000
0.037612 -0.026324 0.000000
-0.048301 -0.026761 0.000000
0.048408 -0.026780 0.000000
-0.038348 -0.027283 0.000000
0.038455 -0.027302 0.000000
-0.047861 -0.027200 0.000000
0.047969 -0.027219 0.000000
-0.046737 -0.028118 0.000000
0.046845 -0.028136 0.000000
-0.039351 -0.028075 0.000000
0.039459 -0.028094 0.000000
-0.040479 -0.028668 0.000000
0.040587 -0.028687 0.000000
-0.045523 -0.028746 0.000000
0.045631 -0.028765 0.000000
-0.041697 -0.029047 0.000000
0.041804 -0.029066 0.000000
-0.044254 -0.029100 0.000000
0.044362 -0.029119 0.000000
-0.042967 -0.029196 0.000000
0.043074 -0.029215 0.000000
-0.000229 -0.036419 0.000000
0.006539 -0.036419 0.000000
0.004956 -0.036419 0.000000
0.001517 -0.036419 0.000000
0.003264 -0.036419 0.000000
-0.003504 -0.036419 0.000000
-0.004921 -0.036419 0.000000
-0.006120 -0.036419 0.000000
-0.007638 -0.036419 0.000000
3 0 1 2 3 0 1 2
3 1 3 2 3 0 3 1
3 0 4 1 3 0 4 3
3 5 3 1 3 0 5 4
3 6 7 8 3 0 6 5
3 7 0 8 3 0 7 6
3 7 4 0 3 0 8 7
3 6 9 7 3 0 9 8
3 10 3 5 3 0 10 9
3 10 11 3 3 0 11 10
3 6 12 9 3 0 12 11
3 6 13 12 3 0 13 12
3 13 10 12 3 0 14 13
3 11 10 13 3 15 16 17
4 14 15 16 17 3 18 19 20
3 21 16 15
3 18 22 19
3 21 23 16
3 24 22 18
3 25 23 21
3 24 26 22
3 25 27 23
3 28 26 24
3 29 27 25
3 28 30 26
3 29 31 27
3 32 30 28
3 29 33 31
3 34 30 32
3 35 33 29
3 34 36 30
3 37 33 35
3 34 38 36
3 37 39 33
3 40 38 34
3 41 39 37
3 40 42 38
3 41 43 39
3 44 42 40
3 41 45 43
3 46 42 44
3 47 45 41
3 46 48 42
3 47 49 45
3 50 48 46
3 47 51 49
3 52 51 47
3 50 53 48
3 52 54 51
3 52 55 54
3 56 55 52
3 50 57 53
3 56 58 55
3 56 59 58
3 60 59 56
3 50 61 57
3 60 62 59
3 60 63 62
3 64 63 60
3 50 65 61
3 64 66 63
3 67 66 64
3 50 68 65
3 67 69 66
3 67 70 69
3 71 70 67
3 50 72 68
3 71 73 70
3 71 0 73
3 71 14 0
3 71 50 14
3 71 72 50
3 74 72 71
3 74 75 72
3 76 75 74
3 76 77 75
3 78 77 76
3 78 79 77
3 80 79 78
3 80 81 79
3 82 81 80
3 82 83 81
3 84 83 82
3 84 85 83
3 86 85 84
3 86 87 85
3 88 87 86
3 88 89 87
3 90 89 88
3 90 91 89
3 92 91 90
3 92 93 91
3 94 93 92
3 94 95 93
3 96 95 94
3 96 97 95
3 98 97 96
3 98 99 97
3 100 99 98
3 100 101 99
3 102 101 100
3 102 103 101
3 104 103 102
3 104 105 103
3 106 105 104
3 106 107 105
3 107 108 105
3 108 109 105
3 109 110 105
3 110 111 105
3 106 112 107
3 113 109 108
3 113 114 109
3 114 115 109
3 115 116 109
3 117 111 110
3 118 111 117
3 119 112 106
3 118 120 111
3 121 120 118
3 122 120 121
3 123 112 119
3 122 124 120
3 125 124 122
3 126 112 123
3 125 127 124
3 128 127 125
3 129 127 128
3 130 112 126
3 129 131 127
3 132 131 129
3 133 131 132
3 134 112 130
3 133 135 131
3 136 135 133
3 137 135 136
3 138 112 134
3 137 139 135
3 140 139 137
3 138 141 112
3 142 139 140
3 143 141 138
3 142 144 139
3 143 145 141
3 146 144 142
3 143 147 145
3 148 144 146
3 149 147 143
3 148 150 144
3 149 151 147
3 152 150 148
3 153 151 149
3 152 154 150
3 155 151 153
3 152 156 154
3 155 157 151
3 158 156 152
3 155 159 157
3 160 156 158
3 161 159 155
3 160 162 156
3 161 163 159
3 164 162 160
3 165 163 161
3 164 166 162
3 165 167 163
3 168 166 164
3 115 169 116
3 169 170 116
3 169 171 170
3 169 172 171
3 172 173 171
3 114 174 115
3 114 175 174
3 114 176 175
3 113 177 114