From 20f1320e2d457d579db74cbf4a239cdb99c31fda Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Thu, 26 Nov 2020 20:30:37 +0100 Subject: [PATCH] Implementation of vertical crop (2 axis projection manipulation in frame buffer). Cleanup of UI for appearance view. --- Decorations.cpp | 1 + Decorations.h | 5 +- FrameBuffer.cpp | 14 +- FrameBuffer.h | 3 +- ImGuiVisitor.cpp | 7 +- PickingVisitor.cpp | 17 ++ PickingVisitor.h | 5 + Source.cpp | 5 +- UserInterfaceManager.cpp | 2 +- View.cpp | 187 ++++++++++++----- View.h | 16 +- Visitor.h | 2 + defines.h | 2 +- rsc/mesh/h_line.ply | 76 +++---- rsc/mesh/icon_rightarrow.ply | 395 +++++++++++++++++++++++++++++++---- 15 files changed, 575 insertions(+), 162 deletions(-) diff --git a/Decorations.cpp b/Decorations.cpp index 83d0a2b..f71075b 100644 --- a/Decorations.cpp +++ b/Decorations.cpp @@ -341,6 +341,7 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t) icons[BUSY] = new Mesh("mesh/icon_circles.ply"); icons[LOCK] = new Mesh("mesh/icon_lock.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[CLOCK] = new Mesh("mesh/icon_clock.ply"); icons[CLOCK_H] = new Mesh("mesh/icon_clock_hand.ply"); diff --git a/Decorations.h b/Decorations.h index d3dadad..6b5bd0a 100644 --- a/Decorations.h +++ b/Decorations.h @@ -55,20 +55,21 @@ protected: Mesh *shadow_; glm::vec2 corner_; Type type_; - }; class Symbol : public Node { public: 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(); void draw (glm::mat4 modelview, glm::mat4 projection) override; void accept (Visitor& v) override; + GlmToolkit::AxisAlignedBoundingBox bbox() const { return symbol_->bbox(); } + Type type() const { return type_; } glm::vec4 color; diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index a5a8b4e..4f08b30 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -28,7 +28,7 @@ FrameBuffer::FrameBuffer(glm::vec3 resolution, bool useAlpha, bool multiSampling { attrib_.viewport = glm::ivec2(resolution); 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): @@ -37,7 +37,7 @@ FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampl { attrib_.viewport = glm::ivec2(width, height); 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() @@ -252,14 +252,16 @@ glm::mat4 FrameBuffer::projection() const 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) { - glm::vec2 scale = glm::clamp(c, glm::vec2(0.2f, 0.2f), glm::vec2(1.f, 1.f)); - projection_ = glm::ortho(-scale.x, scale.x, scale.y, -scale.y, -1.f, 1.f); + projection_crop_.x = CLAMP(c.x, 0.1f, 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); } diff --git a/FrameBuffer.h b/FrameBuffer.h index 1b76cc2..29a8059 100644 --- a/FrameBuffer.h +++ b/FrameBuffer.h @@ -44,7 +44,7 @@ public: // projection and crop glm::mat4 projection() const; - float projectionAspectRatio() const; + glm::vec2 projectionArea() const; void crop(glm::vec2 c); // internal pixel format @@ -60,6 +60,7 @@ private: RenderingAttrib attrib_; glm::mat4 projection_; + glm::vec2 projection_crop_; uint textureid_, intermediate_textureid_; uint framebufferid_, intermediate_framebufferid_; bool use_alpha_, use_multi_sampling_; diff --git a/ImGuiVisitor.cpp b/ImGuiVisitor.cpp index db6a478..0413cbf 100644 --- a/ImGuiVisitor.cpp +++ b/ImGuiVisitor.cpp @@ -395,11 +395,12 @@ void ImGuiVisitor::visit (Source& s) // preview float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN; - float width = preview_width; - float height = width / ( s.frame()->aspectRatio() * s.frame()->projectionAspectRatio() ); + float width = preview_width; + glm::vec2 size = s.frame()->projectionArea() * glm::vec2( s.frame()->aspectRatio(), 1.f); + float height = width * size.y / size.x; if (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)); diff --git a/PickingVisitor.cpp b/PickingVisitor.cpp index 00905b5..5315489 100644 --- a/PickingVisitor.cpp +++ b/PickingVisitor.cpp @@ -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) { n.root()->accept(*this); diff --git a/PickingVisitor.h b/PickingVisitor.h index 8a7d16e..4ecf5a2 100644 --- a/PickingVisitor.h +++ b/PickingVisitor.h @@ -50,6 +50,11 @@ public: * @param n */ 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 * @param n diff --git a/Source.cpp b/Source.cpp index bbac18c..562159b 100644 --- a/Source.cpp +++ b/Source.cpp @@ -448,8 +448,9 @@ void Source::update(float dt) // MODIFY CROP if (renderbuffer_) { - groups_[View::MIXING]->scale_.x *= renderbuffer_->projectionAspectRatio(); - groups_[View::LAYER]->scale_.x = renderbuffer_->projectionAspectRatio(); + glm::vec2 crop = renderbuffer_->projectionArea(); + groups_[View::MIXING]->scale_.x *= crop.x / crop.y; + groups_[View::LAYER]->scale_.x = crop.x / crop.y; } need_update_ = false; diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 1b0b285..ff18af0 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -1956,7 +1956,7 @@ void Navigator::Render() Mixer::manager().setView(View::LAYER); 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); view_pannel_visible = previous_view == Settings::application.current_view; diff --git a/View.cpp b/View.cpp index 9abd191..336319d 100644 --- a/View.cpp +++ b/View.cpp @@ -818,11 +818,20 @@ void showContextMenu(View::Mode m, const char* label) s->group(m)->translation_ = glm::vec3(0,0,0); 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)->rotation_.z = 0; 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 s->group(m)->scale_.x = s->group(m)->scale_.y; s->touch(); @@ -1741,33 +1750,76 @@ AppearanceView::AppearanceView() : View(APPEARANCE), edit_source_(nullptr), need // no settings found: store application default Settings::application.views[mode_].name = "Appearance"; 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(); } else restoreSettings(); // Scene background + // + // global dark Surface *tmp = new Surface( new Shader); tmp->scale_ = glm::vec3(20.f, 20.f, 1.f); tmp->shader()->color = glm::vec4( 0.1f, 0.1f, 0.1f, 0.6f ); scene.bg()->attach(tmp); - backgroundframe = new Frame(Frame::SHARP, Frame::THIN, Frame::NONE); - backgroundframe->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 0.3f ); - scene.bg()->attach(backgroundframe); + // frame showing the source original shape + backgroundframe_ = new Surface( new Shader); + 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->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f, 64.f)); backgroundpreview->translation_.z = 0.001f; scene.bg()->attach(backgroundpreview); + // surface to show the texture of the source surfacepreview = new Surface; // to attach source preview surfacepreview->translation_.z = 0.002f; scene.bg()->attach(surfacepreview); // Geometry Scene foreground - Frame *border = new Frame(Frame::SHARP, Frame::LARGE, Frame::GLOW); - border->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 1.f ); - scene.fg()->attach(border); - + // + // frame showing the edited source shape + 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 // // point to show POSITION @@ -1898,15 +1950,19 @@ std::pair AppearanceView::pick(glm::vec2 P) auto itp = pv.rbegin(); for (; itp != pv.rend(); itp++){ // test if source contains this node - Source::hasNode is_in_source((*itp).first ); + Source::hasNode is_in_source( (*itp).first ); if ( is_in_source( s ) ){ // a node in the current source was clicked ! pick = *itp; break; } + else if ( (*itp).first == crop_horizontal_ || (*itp).first == crop_vertical_ ) { + pick = *itp; + break; + } } // not found: the edit source was not clicked - if (itp == pv.rend()) + if ( itp == pv.rend() ) s = nullptr; // picking on the menu handle else if ( pick.first == s->handles_[mode_][Handles::MENU] ) { @@ -1930,25 +1986,34 @@ void AppearanceView::adjustBackground() { // by default consider edit source is null 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); // if its a valid index if (edit_source_ != nullptr) { // update rendering frame to match edit source AR image_original_width = edit_source_->frame()->aspectRatio(); - image_projection_width = image_original_width * edit_source_->frame()->projectionAspectRatio();; surfacepreview->setTextureIndex( edit_source_->frame()->texture() ); + image_crop_area = edit_source_->frame()->projectionArea(); + image_crop_area.x *= image_original_width; } // update aspect ratio - backgroundframe->scale_.x = image_original_width; - surfacepreview->scale_.x = image_projection_width; - backgroundpreview->scale_.x = image_projection_width; - backgroundpreview->setTextureUV(glm::vec4(0.5f, 0.5f, 64.f * image_projection_width, 64.f)); - for (NodeSet::iterator node = scene.fg()->begin(); node != scene.fg()->end(); node++) { - (*node)->scale_.x = image_projection_width; - } + + // background + horizontal_line_->scale_.x = image_original_width; + vertical_line_->translation_.x = -image_original_width; + backgroundframe_->scale_.x = image_original_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() @@ -1991,42 +2056,20 @@ void AppearanceView::draw() } showContextMenu(mode_,"AppearanceContextMenu"); - -// 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(); -// } - -// } - + // draw general view Shader::force_blending_opacity = true; View::draw(); Shader::force_blending_opacity = false; if (edit_source_ != nullptr){ + // 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); 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(); - // work on the given source - if (!s) - return ret; - Group *sourceNode = s->group(mode_); // groups_[View::GEOMETRY] - // grab coordinates in scene-View reference frame 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_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 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 glm::vec4 center = scene_to_corner_transform * glm::vec4( s->stored_status_->translation_, 1.f); + // picking on the resizing handles in the corners if ( pick.first == s->handles_[mode_][Handles::RESIZE] ) { diff --git a/View.h b/View.h index 60362bd..d0d2dbf 100644 --- a/View.h +++ b/View.h @@ -12,6 +12,8 @@ typedef std::list SourceList; class SessionSource; class Surface; class Symbol; +class Mesh; +class Frame; class View { @@ -212,8 +214,8 @@ public: void play(bool open); private: - class Surface *output_surface_; - class Mesh *mark_100ms_, *mark_1s_; + Surface *output_surface_; + Mesh *mark_100ms_, *mark_1s_; Switch *gradient_; SessionSource *transition_source_; }; @@ -247,9 +249,15 @@ private: void adjustBackground(); - class Frame *backgroundframe; 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_cross_; diff --git a/Visitor.h b/Visitor.h index 1366244..423bb42 100644 --- a/Visitor.h +++ b/Visitor.h @@ -19,6 +19,7 @@ class LineCircle; class Mesh; class Frame; class Handles; +class Symbol; class Disk; class Stream; class MediaPlayer; @@ -57,6 +58,7 @@ public: virtual void visit (Mesh&) {} virtual void visit (Frame&) {} virtual void visit (Handles&) {} + virtual void visit (Symbol&) {} virtual void visit (Disk&) {} virtual void visit (Stream&) {} virtual void visit (MediaPlayer&) {} diff --git a/defines.h b/defines.h index 5ed2500..b455bd2 100644 --- a/defines.h +++ b/defines.h @@ -39,7 +39,7 @@ #define LAYER_DEFAULT_SCALE 0.8f #define LAYER_MIN_SCALE 0.4f #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_MAX_SCALE 10.0f #define TRANSITION_DEFAULT_SCALE 5.0f diff --git a/rsc/mesh/h_line.ply b/rsc/mesh/h_line.ply index bf0a42c..f704fd8 100644 --- a/rsc/mesh/h_line.ply +++ b/rsc/mesh/h_line.ply @@ -1,7 +1,7 @@ ply format ascii 1.0 -comment Created by Blender 2.83.1 - www.blender.org, source file: 'h_line.blend' -element vertex 26 +comment Created by Blender 2.91.0 - www.blender.org +element vertex 14 property float x property float y property float z @@ -9,56 +9,32 @@ property uchar red property uchar green property uchar blue property uchar alpha -element face 24 +element face 12 property list uchar uint vertex_indices end_header -0.003030 -0.016358 0.000000 255 255 255 255 --0.000000 -0.013902 0.000000 255 255 255 255 --0.000000 -0.016360 0.000000 255 255 255 255 -0.003030 -0.010598 0.000000 255 255 255 255 --0.000000 -0.008243 0.000000 255 255 255 255 -0.003030 -0.005245 0.000000 255 255 255 255 -0.000000 0.000013 0.000000 255 255 255 255 --0.017626 0.003000 0.000000 255 255 255 255 -0.003200 0.003000 0.000000 255 255 255 255 --0.036323 0.003000 0.000000 255 255 255 255 --0.028438 0.000013 0.000000 255 255 255 255 --0.963025 0.003000 0.000000 255 255 255 255 --0.976754 0.000031 0.000000 255 255 255 255 --0.951104 0.000013 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 +0.982449 0.001584 0.000000 255 255 255 255 +1.000075 -0.001403 0.000000 255 255 255 255 +1.000097 0.001584 0.000000 255 255 255 255 +0.971637 -0.001403 0.000000 255 255 255 255 +-0.036323 0.001584 0.000000 255 255 255 255 +-0.963025 0.001584 0.000000 255 255 255 255 +-0.976754 -0.001385 0.000000 255 255 255 255 +-0.951104 -0.001403 0.000000 255 255 255 255 +-0.987628 0.001584 0.000000 255 255 255 255 +-1.000000 -0.001403 0.000000 255 255 255 255 +-0.499475 0.001584 0.000000 255 255 255 255 +-0.048249 -0.001403 0.000000 255 255 255 255 +-1.000000 0.001584 0.000000 255 255 255 255 +-0.499484 -0.001403 0.000000 255 255 255 255 3 0 1 2 -3 3 4 1 -3 5 6 4 -3 7 6 8 -3 9 10 7 -3 11 12 13 -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 3 0 4 +3 5 6 7 +3 8 9 6 +3 7 10 5 +3 10 11 4 3 0 3 1 -3 3 5 4 +3 4 11 3 3 5 8 6 -3 7 10 6 -3 9 21 10 -3 11 14 12 -3 14 17 15 -3 16 19 15 -3 18 23 19 -3 13 24 20 -3 20 24 21 -3 22 25 23 +3 8 12 9 +3 7 13 10 +3 10 13 11 diff --git a/rsc/mesh/icon_rightarrow.ply b/rsc/mesh/icon_rightarrow.ply index d55af9d..4711456 100644 --- a/rsc/mesh/icon_rightarrow.ply +++ b/rsc/mesh/icon_rightarrow.ply @@ -1,47 +1,364 @@ ply format ascii 1.0 -comment Created by Blender 2.90.1 - www.blender.org -element vertex 18 +comment Created by Blender 2.91.0 - www.blender.org +element vertex 178 property float x property float y property float z -property uchar red -property uchar green -property uchar blue -property uchar alpha -element face 15 +element face 176 property list uchar uint vertex_indices end_header --0.098559 0.044351 0.000000 255 255 255 255 --0.080774 0.054762 0.000000 255 255 255 255 --0.098559 0.097694 0.000000 255 255 255 255 --0.000743 -0.000102 0.000000 255 255 255 255 --0.080774 0.026570 0.000000 255 255 255 255 --0.025899 -0.000102 0.000000 255 255 255 255 --0.214161 -0.044555 0.000000 255 255 255 255 --0.196376 0.026570 0.000000 255 255 255 255 --0.214161 0.044351 0.000000 255 255 255 255 --0.196376 -0.026773 0.000000 255 255 255 255 --0.080774 -0.054965 0.000000 255 255 255 255 --0.098559 -0.097898 0.000000 255 255 255 255 --0.080774 -0.026773 0.000000 255 255 255 255 --0.098559 -0.044555 0.000000 255 255 255 255 -0.000234 -0.099325 -0.001878 255 255 255 255 -0.020009 -0.099325 -0.001878 255 255 255 255 -0.020009 0.097955 -0.001878 255 255 255 255 -0.000234 0.097955 -0.001878 255 255 255 255 +-0.007848 0.007826 0.000000 +-0.006431 0.036270 0.000000 +-0.007848 0.036270 0.000000 +-0.004848 0.036270 0.000000 +-0.003156 0.036270 0.000000 +-0.001410 0.036270 0.000000 +0.000337 0.036270 0.000000 +0.002029 0.036270 0.000000 +0.003612 0.036270 0.000000 +0.005029 0.036270 0.000000 +0.006227 0.036270 0.000000 +0.007151 0.036270 0.000000 +0.007746 0.036270 0.000000 +0.007956 0.036270 0.000000 +0.007956 0.007826 0.000000 +-0.044254 0.028970 0.000000 +-0.041697 0.028916 0.000000 +-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 1 3 2 -3 0 4 1 -3 5 3 1 -3 6 7 8 -3 7 0 8 -3 7 4 0 -3 6 9 7 -3 10 3 5 -3 10 11 3 -3 6 12 9 -3 6 13 12 -3 13 10 12 -3 11 10 13 -4 14 15 16 17 +3 0 3 1 +3 0 4 3 +3 0 5 4 +3 0 6 5 +3 0 7 6 +3 0 8 7 +3 0 9 8 +3 0 10 9 +3 0 11 10 +3 0 12 11 +3 0 13 12 +3 0 14 13 +3 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