Greatly improved rendering of frame and decorators. Creation of a

DrawVisitor to selectively draw single nodes (for overlay of frame in
GeometryView)
This commit is contained in:
brunoherbelin
2020-06-02 00:23:49 +02:00
parent 7b4408ece6
commit c0572faabf
17 changed files with 642 additions and 407 deletions

View File

@@ -225,6 +225,7 @@ set(VMIX_SRCS
RenderingManager.cpp
UserInterfaceManager.cpp
PickingVisitor.cpp
DrawVisitor.cpp
SearchVisitor.cpp
ImGuiToolkit.cpp
ImGuiVisitor.cpp
@@ -266,8 +267,10 @@ set(VMIX_RSC_FILES
./rsc/mesh/shadow.ply
./rsc/mesh/target.ply
./rsc/mesh/border_round.ply
./rsc/mesh/border_top.ply
./rsc/mesh/border_sharp.ply
./rsc/mesh/border_large_round.ply
./rsc/mesh/border_large_top.ply
./rsc/mesh/border_handles_rotation.ply
./rsc/mesh/border_handles_overlay.ply
./rsc/mesh/border_handles_sharp.ply

View File

@@ -1,41 +1,38 @@
#include <glad/glad.h>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/vector_angle.hpp>
#include "Resource.h"
#include "Visitor.h"
#include "ImageShader.h"
#include "Log.h"
#include "GlmToolkit.h"
#include "Decorations.h"
#include "Visitor.h"
#include "ImageShader.h"
#include "GlmToolkit.h"
Frame::Frame(Type type) : Node(), type_(type)
Frame::Frame(Type type) : Node(), type_(type), side_(nullptr), top_(nullptr), shadow_(nullptr), square_(nullptr)
{
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
switch (type) {
case SHARP_LARGE:
border_ = nullptr; //new Mesh("mesh/border_large_sharp.ply");
square_ = new LineSquare(color, 2.f );
shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png");
break;
case SHARP_THIN:
border_ = new Mesh("mesh/border_sharp.ply");
shadow_ = nullptr;
square_ = new LineSquare(color, 2.f );
break;
case ROUND_LARGE:
border_ = new Mesh("mesh/border_large_round.ply");
side_ = new Mesh("mesh/border_large_round.ply");
top_ = new Mesh("mesh/border_large_top.ply");
shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png");
break;
default:
case ROUND_THIN:
border_ = new Mesh("mesh/border_round.ply");
side_ = new Mesh("mesh/border_round.ply");
top_ = new Mesh("mesh/border_top.ply");
shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png");
break;
case ROUND_SHADOW:
border_ = new Mesh("mesh/border_round.ply");
side_ = new Mesh("mesh/border_round.ply");
top_ = new Mesh("mesh/border_top.ply");
shadow_ = new Mesh("mesh/shadow_perspective.ply", "images/shadow_perspective.png");
break;
}
@@ -43,41 +40,73 @@ Frame::Frame(Type type) : Node(), type_(type)
Frame::~Frame()
{
if(border_) delete border_;
if(side_) delete side_;
if(top_) delete top_;
if(shadow_) delete shadow_;
}
void Frame::update( float dt )
{
Node::update(dt);
if(top_)
top_->update(dt);
if(side_)
side_->update(dt);
if(shadow_)
shadow_->update(dt);
}
void Frame::draw(glm::mat4 modelview, glm::mat4 projection)
{
if ( !initialized() ) {
if(border_) border_->init();
if(side_) side_->init();
if(top_) top_->init();
if(shadow_) shadow_->init();
init();
}
if ( visible_ ) {
// shadow
glm::mat4 ctm = modelview * transform_;
// shadow (scaled)
if(shadow_)
shadow_->draw( modelview * transform_, projection);
shadow_->draw( ctm, projection);
if(border_) {
// right side
float ar = scale_.x / scale_.y;
glm::vec3 s(1.f, 1.f, 1.f);
// glm::vec3 s(scale_.y, scale_.y, 1.0);
glm::vec3 t(translation_.x - 1.0 + ar, translation_.y, translation_.z);
glm::mat4 ctm = modelview * GlmToolkit::transform(t, rotation_, s);
// top (scaled)
if(top_) {
top_->shader()->color = color;
top_->draw( ctm, projection);
}
// top (scaled)
if(square_) {
square_->shader()->color = color;
square_->draw( ctm, projection);
}
if(side_) {
side_->shader()->color = color;
// get scale
glm::vec4 scale = ctm * glm::vec4(1.f, 1.0f, 0.f, 0.f);
// get rotation
glm::vec3 rot(0.f);
glm::vec4 vec = ctm * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
if(side_) {
if(border_) {
// right side
border_->shader()->color = color;
border_->draw( ctm, projection );
// left side
t.x = -t.x;
s.x = -s.x;
ctm = modelview * GlmToolkit::transform(t, rotation_, s);
border_->draw( ctm, projection );
vec = ctm * glm::vec4(1.f, 0.f, 0.f, 1.f);
side_->draw( GlmToolkit::transform(vec, rot, glm::vec3(scale.y, scale.y, 1.f)), projection );
// right side
vec = ctm * glm::vec4(-1.f, 0.f, 0.f, 1.f);
side_->draw( GlmToolkit::transform(vec, rot, glm::vec3(-scale.y, scale.y, 1.f)), projection );
}
}
}

View File

@@ -5,6 +5,7 @@
#include <string>
#include <glm/glm.hpp>
#include "Primitives.h"
#include "Mesh.h"
class Frame : public Node
@@ -15,18 +16,20 @@ public:
Frame(Type type);
~Frame();
void update (float dt) override;
void draw (glm::mat4 modelview, glm::mat4 projection) override;
void accept (Visitor& v) override;
Type type() const { return type_; }
Mesh *border() const { return border_; }
Mesh *border() const { return side_; }
glm::vec4 color;
protected:
Mesh *border_;
Mesh *shadow_;
Type type_;
Mesh *side_;
Mesh *top_;
Mesh *shadow_;
LineSquare *square_;
};
class Handles : public Node

141
DrawVisitor.cpp Normal file
View File

@@ -0,0 +1,141 @@
#include <glm/gtc/matrix_transform.hpp>
#include "DrawVisitor.h"
#include "Scene.h"
DrawVisitor::DrawVisitor(Node *nodetodraw, glm::mat4 projection)
{
target_ = nodetodraw;
modelview_ = glm::identity<glm::mat4>();
projection_ = projection;
done_ = false;
}
void DrawVisitor::visit(Node &n)
{
// draw the target
if ( n.id() == target_->id()) {
n.draw(modelview_, projection_);
done_ = true;
}
if (done_) return;
// update transform
modelview_ *= n.transform_;
}
void DrawVisitor::visit(Group &n)
{
// no need to traverse deeper if this node was drawn already
if (done_) return;
// traverse children
glm::mat4 mv = modelview_;
for (NodeSet::iterator node = n.begin(); !done_ && node != n.end(); node++) {
(*node)->accept(*this);
modelview_ = mv;
}
}
void DrawVisitor::visit(Scene &n)
{
n.root()->accept(*this);
}
void DrawVisitor::visit(Switch &n)
{
glm::mat4 mv = modelview_;
(*n.activeChild())->accept(*this);
modelview_ = mv;
}
void DrawVisitor::visit(Animation &n)
{
}
void DrawVisitor::visit(Primitive &n)
{
}
void DrawVisitor::visit(Surface &n)
{
}
void DrawVisitor::visit(ImageSurface &n)
{
}
void DrawVisitor::visit(FrameBufferSurface &n)
{
}
void DrawVisitor::visit(MediaSurface &n)
{
}
void DrawVisitor::visit(MediaPlayer &n)
{
}
void DrawVisitor::visit(Shader &n)
{
}
void DrawVisitor::visit(ImageShader &n)
{
}
void DrawVisitor::visit(ImageProcessingShader &n)
{
}
void DrawVisitor::visit(LineStrip &n)
{
}
void DrawVisitor::visit(LineSquare &)
{
}
void DrawVisitor::visit(LineCircle &n)
{
}
void DrawVisitor::visit(Mesh &n)
{
}
void DrawVisitor::visit(Frame &n)
{
}
void DrawVisitor::visit (Source& s)
{
}
void DrawVisitor::visit (MediaSource& s)
{
}

42
DrawVisitor.h Normal file
View File

@@ -0,0 +1,42 @@
#ifndef DRAWVISITOR_H
#define DRAWVISITOR_H
#include <glm/glm.hpp>
#include "Visitor.h"
class DrawVisitor : public Visitor
{
glm::mat4 modelview_;
glm::mat4 projection_;
Node *target_;
bool done_;
public:
DrawVisitor(Node *nodetodraw, glm::mat4 projection);
void visit(Scene& n) override;
void visit(Node& n) override;
void visit(Group& n) override;
void visit(Switch& n) override;
void visit(Animation& n) override;
void visit(Primitive& n) override;
void visit(Surface& n) override;
void visit(ImageSurface& n) override;
void visit(MediaSurface& n) override;
void visit(FrameBufferSurface& n) override;
void visit(LineStrip& n) override;
void visit(LineSquare&) override;
void visit(LineCircle& n) override;
void visit(Mesh& n) override;
void visit(Frame& n) override;
void visit(MediaPlayer& n) override;
void visit(Shader& n) override;
void visit(ImageShader& n) override;
void visit(ImageProcessingShader& n) override;
void visit (Source& s) override;
void visit (MediaSource& s) override;
};
#endif // DRAWVISITOR_H

View File

@@ -7,8 +7,8 @@
#include "Visitor.h"
class GarbageVisitor : public Visitor {
class GarbageVisitor : public Visitor
{
Group *current_;
std::list<Node *> targets_;
bool found_;

View File

@@ -65,8 +65,8 @@ void PickingVisitor::visit(Surface &n)
void PickingVisitor::visit(Frame &n)
{
if (n.border())
n.border()->accept(*this);
// if (n.border())
// n.border()->accept(*this);
}
void PickingVisitor::visit(Handles &n)

View File

@@ -17,14 +17,6 @@
#include <glm/gtx/rotate_vector.hpp>
static const std::vector<glm::vec3> square_points {
glm::vec3( -0.99f, -1.f, 0.f ), glm::vec3( -1.f, -0.99f, 0.f ),
glm::vec3( -1.f, 0.99f, 0.f ), glm::vec3( -0.99f, 1.f, 0.f ),
glm::vec3( 0.99f, 1.f, 0.f ), glm::vec3( 1.f, 0.99f, 0.f ),
glm::vec3( 1.f, -0.99f, 0.f ), glm::vec3( 0.99f, -1.f, 0.f ),
glm::vec3( -0.99f, -1.f, 0.f )
};
Surface::Surface(Shader *s) : Primitive(s), textureindex_(0)
{
@@ -258,7 +250,7 @@ void LineStrip::draw(glm::mat4 modelview, glm::mat4 projection)
if ( !initialized() )
init();
glLineWidth(linewidth_);
glLineWidth(linewidth_ * Rendering::manager().mainWindow().dpiScale());
Primitive::draw(modelview, projection);
@@ -272,6 +264,13 @@ void LineStrip::accept(Visitor& v)
}
static const std::vector<glm::vec3> square_points {
glm::vec3( -1.f, -1.f, 0.f ), glm::vec3( -1.f, 1.f, 0.f ),
glm::vec3( 1.f, 1.f, 0.f ), glm::vec3( 1.f, -1.f, 0.f ),
glm::vec3( -1.f, -1.f, 0.f )
};
LineSquare::LineSquare(glm::vec4 color, uint linewidth) : LineStrip(square_points, color, linewidth)
{
}

View File

@@ -66,6 +66,8 @@ public:
// get total height available in monitor
int maxHeight();
inline float dpiScale() const { return dpi_scale_; }
// get which monitor contains this point
static GLFWmonitor *monitorAt(int x, int y);
// get which monitor has this name

View File

@@ -222,21 +222,16 @@ FrameBuffer *Source::frame() const
}
}
Handles *Source::handleNode(Handles::Type t) const
bool Source::contains(Node *node) const
{
if ( t == Handles::ROTATE )
return rotate_handle_;
else if ( t == Handles::RESIZE_H )
return resize_H_handle_;
else if ( t == Handles::RESIZE_V )
return resize_V_handle_;
else
return resize_handle_;
hasNode tester(node);
return tester(this);
}
bool hasNode::operator()(const Source* elem) const
{
if (elem)
if (_n && elem)
{
SearchVisitor sv(_n);
elem->group(View::MIXING)->accept(sv);

View File

@@ -24,6 +24,9 @@ typedef std::list<CloneSource *> CloneList;
class Source
{
friend class View;
friend class GeometryView;
public:
// create a source and add it to the list
// only subclasses of sources can actually be instanciated
@@ -44,10 +47,12 @@ public:
// an overlay can be displayed on top of the source
void setOverlayVisible(bool on);
// get handle on the node used to manipulate the source in a view
// get handle on the nodes used to manipulate the source in a view
inline Group *group(View::Mode m) const { return groups_.at(m); }
inline Node *groupNode(View::Mode m) const { return static_cast<Node*>(groups_.at(m)); }
Handles *handleNode(Handles::Type t) const;
// tests if a given node is part of the source
bool contains(Node *node) const;
// a Source has a shader to control image processing effects
inline ImageProcessingShader *processingShader() const { return rendershader_; }

View File

@@ -293,7 +293,7 @@ void UserInterface::handleMouse()
mouseclic[ImGuiMouseButton_Left] = glm::vec2(io.MouseClickedPos[ImGuiMouseButton_Left].x * io.DisplayFramebufferScale.y, io.MouseClickedPos[ImGuiMouseButton_Left].y* io.DisplayFramebufferScale.x);
mouseclic[ImGuiMouseButton_Right] = glm::vec2(io.MouseClickedPos[ImGuiMouseButton_Right].x * io.DisplayFramebufferScale.y, io.MouseClickedPos[ImGuiMouseButton_Right].y* io.DisplayFramebufferScale.x);
static std::pair<Node *, glm::vec2> pick = { nullptr, glm::vec2(0.f) };
static std::pair<Node *, glm::vec2> picked = { nullptr, glm::vec2(0.f) };
// if not on any window
if ( !ImGui::IsAnyWindowHovered() && !ImGui::IsAnyWindowFocused() )
@@ -351,8 +351,8 @@ void UserInterface::handleMouse()
{
if (current)
{
// drag current source
int c = Mixer::manager().currentView()->grab( mouseclic[ImGuiMouseButton_Left], mousepos, current, pick);
// grab current source
int c = Mixer::manager().currentView()->grab( mouseclic[ImGuiMouseButton_Left], mousepos, current, picked);
ImGui::SetMouseCursor(c);
}
else {
@@ -371,21 +371,15 @@ void UserInterface::handleMouse()
// get coordinate in world coordinate of mouse cursor
glm::vec3 point = Rendering::manager().unProject(mousepos);
// ask the view what was picked
picked = Mixer::manager().currentView()->pick(point);
// picking visitor traverses the scene
PickingVisitor pv(point);
Mixer::manager().currentView()->scene.accept(pv);
// picking visitor found nodes?
if (pv.picked().empty()) {
if (picked.first == nullptr){
// nothing picked, unset current
Mixer::manager().unsetCurrentSource();
navigator.hidePannel();
}
else {
// top-most Node picked
pick = pv.picked().back();
// find source containing the cliced Node
Mixer::manager().setCurrentSource( pick.first );
} else {
Mixer::manager().setCurrentSource( picked.first );
if (navigator.pannelVisible())
navigator.showPannelSource( Mixer::manager().indexCurrentSource() );
}
@@ -393,7 +387,7 @@ void UserInterface::handleMouse()
}
else if ( ImGui::IsMouseReleased(ImGuiMouseButton_Left) )
{
pick = { nullptr, glm::vec2(0.f) };
picked = { nullptr, glm::vec2(0.f) };
}
if ( ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) )

View File

@@ -13,6 +13,7 @@
#include "Source.h"
#include "Primitives.h"
#include "PickingVisitor.h"
#include "DrawVisitor.h"
#include "Mesh.h"
#include "Mixer.h"
#include "FrameBuffer.h"
@@ -78,6 +79,26 @@ View::Cursor View::drag (glm::vec2 from, glm::vec2 to)
return Cursor_ResizeAll;
}
std::pair<Node *, glm::vec2> View::pick(glm::vec3 point)
{
std::pair<Node *, glm::vec2> picked = { nullptr, glm::vec2(0.f) };
// picking visitor traverses the scene
PickingVisitor pv(point);
scene.accept(pv);
// picking visitor found nodes?
if ( !pv.picked().empty()) {
// select top-most Node picked
picked = pv.picked().back();
}
return picked;
}
MixingView::MixingView() : View(MIXING)
{
// read default settings
@@ -267,6 +288,58 @@ void GeometryView::zoom( float factor )
scene.root()->scale_.y = z;
}
void GeometryView::draw()
{
// draw scene of this view
scene.root()->draw(glm::identity<glm::mat4>(), Rendering::manager().Projection());
// draw overlay of current source
Source *s = Mixer::manager().currentSource();
if (s != nullptr) {
DrawVisitor dv(s->overlays_[View::GEOMETRY], Rendering::manager().Projection());
scene.accept(dv);
}
}
std::pair<Node *, glm::vec2> GeometryView::pick(glm::vec3 point)
{
std::pair<Node *, glm::vec2> picked = { nullptr, glm::vec2(0.f) };
// picking visitor traverses the scene
PickingVisitor pv(point);
scene.accept(pv);
// picking visitor found nodes?
if ( !pv.picked().empty()) {
Source *s = Mixer::manager().currentSource();
if (s != nullptr) {
// find if the current source was picked
auto itp = pv.picked().begin();
for (; itp != pv.picked().end(); itp++){
if (s->contains( (*itp).first )){
picked = *itp;
break;
}
}
// not found: the current source was not clicked
if (itp == pv.picked().end())
s = nullptr;
}
// maybe the source changed
if (s == nullptr)
{
// select top-most Node picked
picked = pv.picked().back();
}
}
return picked;
}
View::Cursor GeometryView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::pair<Node *, glm::vec2> pick)
{
View::Cursor ret = Cursor_Arrow;
@@ -305,7 +378,7 @@ View::Cursor GeometryView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::p
// which manipulation to perform?
if (pick.first) {
// picking on the resizing handles in the corners
if ( pick.first == s->handleNode(Handles::RESIZE) ) {
if ( pick.first == s->resize_handle_ ) {
if (UserInterface::manager().keyboardModifier())
S_resize.y = S_resize.x;
sourceNode->scale_ = start_scale * S_resize;
@@ -324,17 +397,17 @@ View::Cursor GeometryView::grab (glm::vec2 from, glm::vec2 to, Source *s, std::p
ret = axis.x * axis.y > 0.f ? Cursor_ResizeNESW : Cursor_ResizeNWSE;
}
// picking on the resizing handles left or right
else if ( pick.first == s->handleNode(Handles::RESIZE_H) ) {
else if ( pick.first == s->resize_H_handle_ ) {
sourceNode->scale_ = start_scale * glm::vec3(S_resize.x, 1.f, 1.f);
ret = Cursor_ResizeEW;
}
// picking on the resizing handles top or bottom
else if ( pick.first == s->handleNode(Handles::RESIZE_V) ) {
else if ( pick.first == s->resize_V_handle_ ) {
sourceNode->scale_ = start_scale * glm::vec3(1.f, S_resize.y, 1.f);
ret = Cursor_ResizeNS;
}
// picking on the rotating handle
else if ( pick.first == s->handleNode(Handles::ROTATE) ) {
else if ( pick.first == s->rotate_handle_ ) {
float angle = glm::orientedAngle( glm::normalize(glm::vec2(S_from)), glm::normalize(glm::vec2(S_to)));
if (UserInterface::manager().keyboardModifier())

3
View.h
View File

@@ -34,6 +34,7 @@ public:
Cursor_NotAllowed
} Cursor;
virtual std::pair<Node *, glm::vec2> pick(glm::vec3 point);
virtual Cursor drag (glm::vec2, glm::vec2);
virtual Cursor grab (glm::vec2, glm::vec2, Source*, std::pair<Node *, glm::vec2>) {
return Cursor_Arrow;
@@ -88,8 +89,10 @@ class GeometryView : public View
public:
GeometryView();
void draw () override;
void update (float dt) override;
void zoom (float factor) override;
std::pair<Node *, glm::vec2> pick(glm::vec3 point) override;
Cursor grab (glm::vec2 from, glm::vec2 to, Source *s, std::pair<Node *, glm::vec2> pick) override;
Cursor over (glm::vec2, Source*, std::pair<Node *, glm::vec2>) override;

View File

@@ -1,7 +1,7 @@
ply
format ascii 1.0
comment Created by Blender 2.82 (sub 7) - www.blender.org, source file: 'border_large.blend'
element vertex 45
comment Created by Blender 2.82 (sub 7) - www.blender.org, source file: 'border_large_round.blend'
element vertex 39
property float x
property float y
property float z
@@ -9,108 +9,94 @@ property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 57
element face 49
property list uchar uint vertex_indices
end_header
-0.950647 -1.000000 0.000000 255 255 255 255
-0.000071 -1.013523 0.000000 255 255 255 255
-0.000077 -1.000000 0.000000 255 255 255 255
-0.962557 -1.013523 0.000000 255 255 255 255
-0.007321 -1.039382 0.000000 255 255 255 255
0.963176 -1.013523 0.000000 255 255 255 255
0.951244 -1.000000 0.000000 255 255 255 255
0.971677 -1.000395 0.000000 255 255 255 255
0.982502 -1.011536 0.000000 255 255 255 255
0.991868 -0.991539 0.000000 255 255 255 255
1.011320 -0.981739 0.000000 255 255 255 255
1.002918 -1.002581 0.000000 255 255 255 255
1.013443 -0.963042 0.000000 255 255 255 255
1.000178 -0.970926 0.000000 255 255 255 255
1.039942 -0.987614 0.000000 255 255 255 255
1.034304 -1.010591 0.000000 255 255 255 255
1.021251 -1.028161 0.000000 255 255 255 255
1.000314 -1.037345 0.000000 255 255 255 255
0.980495 -1.039382 0.000000 255 255 255 255
1.039942 -0.000016 0.000000 255 255 255 255
1.013443 0.963025 0.000000 255 255 255 255
1.013443 -0.000008 0.000000 255 255 255 255
1.039942 0.987582 0.000000 255 255 255 255
1.011158 0.987628 0.000000 255 255 255 255
1.000017 0.976754 0.000000 255 255 255 255
1.000000 0.951104 0.000000 255 255 255 255
0.991530 0.992067 0.000000 255 255 255 255
0.984469 1.011229 0.000000 255 255 255 255
1.002576 1.003111 0.000000 255 255 255 255
0.962232 1.013506 0.000000 255 255 255 255
0.973622 1.000095 0.000000 255 255 255 255
0.979528 1.039350 0.000000 255 255 255 255
1.002331 1.037015 0.000000 255 255 255 255
1.020900 1.028691 0.000000 255 255 255 255
1.034592 1.013730 0.000000 255 255 255 255
1.000889 -0.951116 0.000000 255 255 255 255
-0.951593 1.000000 0.000000 255 255 255 255
-0.000071 1.013506 0.000000 255 255 255 255
-0.963515 1.013506 0.000000 255 255 255 255
0.950312 1.000000 0.000000 255 255 255 255
-0.007321 1.039350 0.000000 255 255 255 255
-0.994357 -1.039382 0.000000 255 255 255 255
1.000000 0.000000 0.000000 255 255 255 255
-0.000064 1.000000 0.000000 255 255 255 255
-0.995340 1.039350 0.000000 255 255 255 255
-0.999961 -1.039382 0.000000 255 255 255 255
-0.036682 -1.013523 0.000000 255 255 255 255
-0.999928 -1.013523 0.000000 255 255 255 255
-0.048614 -1.000000 0.000000 255 255 255 255
-0.999935 -1.000000 0.000000 255 255 255 255
-0.028181 -1.000395 0.000000 255 255 255 255
-0.017356 -1.011536 0.000000 255 255 255 255
-0.007989 -0.991539 0.000000 255 255 255 255
0.011462 -0.981739 0.000000 255 255 255 255
0.003061 -1.002581 0.000000 255 255 255 255
0.013586 -0.963042 0.000000 255 255 255 255
0.000320 -0.970926 0.000000 255 255 255 255
0.040085 -0.987614 0.000000 255 255 255 255
0.034447 -1.010591 0.000000 255 255 255 255
0.021394 -1.028161 0.000000 255 255 255 255
0.000456 -1.037345 0.000000 255 255 255 255
-0.019362 -1.039382 0.000000 255 255 255 255
0.040085 -0.000016 0.000000 255 255 255 255
0.013585 0.963025 0.000000 255 255 255 255
0.013586 -0.000008 0.000000 255 255 255 255
0.040084 0.987582 0.000000 255 255 255 255
0.011300 0.987628 0.000000 255 255 255 255
0.000160 0.976754 0.000000 255 255 255 255
0.000142 0.951104 0.000000 255 255 255 255
-0.008328 0.992067 0.000000 255 255 255 255
-0.015389 1.011229 0.000000 255 255 255 255
0.002718 1.003111 0.000000 255 255 255 255
-0.037625 1.013506 0.000000 255 255 255 255
-0.026235 1.000095 0.000000 255 255 255 255
-0.020330 1.039350 0.000000 255 255 255 255
0.002473 1.037015 0.000000 255 255 255 255
0.021043 1.028691 0.000000 255 255 255 255
0.034734 1.013730 0.000000 255 255 255 255
0.001031 -0.951116 0.000000 255 255 255 255
-0.999929 1.013506 0.000000 255 255 255 255
-0.049546 1.000000 0.000000 255 255 255 255
-0.999926 1.039350 0.000000 255 255 255 255
0.000142 0.000000 0.000000 255 255 255 255
-0.999922 1.000000 0.000000 255 255 255 255
3 0 1 2
3 3 4 1
3 4 5 1
3 1 6 2
3 5 7 6
3 8 9 7
3 10 9 11
3 12 13 10
3 10 14 12
3 15 11 16
3 11 17 16
3 8 18 17
3 19 12 14
3 19 20 21
3 22 23 20
3 20 24 25
3 23 26 24
3 27 26 28
3 29 30 27
3 27 31 29
3 32 28 33
3 28 34 33
3 25 21 20
3 21 35 12
3 36 37 38
3 37 39 29
3 29 40 37
3 40 38 37
3 0 3 1
3 3 41 4
3 4 18 5
3 1 5 6
3 5 8 7
3 8 11 9
3 10 13 9
3 12 35 13
3 10 15 14
3 15 10 11
3 11 8 17
3 8 5 18
3 19 21 12
3 19 22 20
3 22 34 23
3 20 23 24
3 23 28 26
3 27 30 26
3 29 39 30
3 27 32 31
3 32 27 28
3 28 23 34
3 25 42 21
3 21 42 35
3 36 43 37
3 37 43 39
3 29 31 40
3 40 44 38
3 19 14 22
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 17 10 12
3 17 18 19
3 20 21 18
3 18 22 23
3 21 24 22
3 25 24 26
3 27 28 25
3 25 29 27
3 30 26 31
3 26 32 31
3 23 19 18
3 19 33 10
3 34 35 27
3 27 36 34
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 33 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 17 19 10
3 17 20 18
3 20 32 21
3 18 21 22
3 21 26 24
3 25 28 24
3 27 35 28
3 25 30 29
3 30 25 26
3 26 21 32
3 23 37 19
3 19 37 33
3 34 38 35
3 27 29 36
3 17 12 20

View File

@@ -1,7 +1,7 @@
ply
format ascii 1.0
comment Created by Blender 2.82 (sub 7) - www.blender.org, source file: 'border.blend'
element vertex 45
comment Created by Blender 2.82 (sub 7) - www.blender.org, source file: 'border_round.blend'
element vertex 39
property float x
property float y
property float z
@@ -9,107 +9,93 @@ property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 56
element face 48
property list uchar uint vertex_indices
end_header
-0.950647 -1.000000 0.000000 255 255 255 255
-0.000071 -1.013523 0.000000 255 255 255 255
-0.000077 -1.000000 0.000000 255 255 255 255
-0.962557 -1.013523 0.000000 255 255 255 255
-0.000064 -1.027167 0.000000 255 255 255 255
0.963176 -1.013523 0.000000 255 255 255 255
0.951244 -1.000000 0.000000 255 255 255 255
0.971677 -1.000395 0.000000 255 255 255 255
0.982502 -1.011536 0.000000 255 255 255 255
0.991868 -0.991539 0.000000 255 255 255 255
1.011320 -0.981739 0.000000 255 255 255 255
1.002918 -1.002581 0.000000 255 255 255 255
1.013443 -0.963042 0.000000 255 255 255 255
1.000178 -0.970926 0.000000 255 255 255 255
1.027092 -0.976006 0.000000 255 255 255 255
1.024939 -0.994955 0.000000 255 255 255 255
1.016425 -1.016078 0.000000 255 255 255 255
0.995733 -1.025153 0.000000 255 255 255 255
0.976147 -1.027167 0.000000 255 255 255 255
1.027092 -0.000011 0.000000 255 255 255 255
1.013443 0.963025 0.000000 255 255 255 255
1.013443 -0.000008 0.000000 255 255 255 255
1.027092 0.975985 0.000000 255 255 255 255
1.011158 0.987628 0.000000 255 255 255 255
1.000017 0.976754 0.000000 255 255 255 255
1.000000 0.951104 0.000000 255 255 255 255
0.991530 0.992067 0.000000 255 255 255 255
0.984469 1.011229 0.000000 255 255 255 255
1.002576 1.003111 0.000000 255 255 255 255
0.962232 1.013506 0.000000 255 255 255 255
0.973622 1.000095 0.000000 255 255 255 255
0.975191 1.027145 0.000000 255 255 255 255
0.997727 1.024837 0.000000 255 255 255 255
1.016078 1.016610 0.000000 255 255 255 255
1.024775 1.000919 0.000000 255 255 255 255
1.000889 -0.951116 0.000000 255 255 255 255
-0.951593 1.000000 0.000000 255 255 255 255
-0.000071 1.013506 0.000000 255 255 255 255
-0.963515 1.013506 0.000000 255 255 255 255
0.950312 1.000000 0.000000 255 255 255 255
-0.000064 1.027145 0.000000 255 255 255 255
-0.975505 -1.027167 0.000000 255 255 255 255
1.000000 0.000000 0.000000 255 255 255 255
-0.000064 1.000000 0.000000 255 255 255 255
-0.976476 1.027145 0.000000 255 255 255 255
-1.000026 -1.027167 0.000000 255 255 255 255
-0.036786 -1.013523 0.000000 255 255 255 255
-1.000033 -1.013523 0.000000 255 255 255 255
-0.048719 -1.000000 0.000000 255 255 255 255
-1.000039 -1.000000 0.000000 255 255 255 255
-0.028286 -1.000395 0.000000 255 255 255 255
-0.017461 -1.011536 0.000000 255 255 255 255
-0.008094 -0.991539 0.000000 255 255 255 255
0.011357 -0.981739 0.000000 255 255 255 255
0.002956 -1.002581 0.000000 255 255 255 255
0.013481 -0.963042 0.000000 255 255 255 255
0.000215 -0.970926 0.000000 255 255 255 255
0.027129 -0.976006 0.000000 255 255 255 255
0.024977 -0.994955 0.000000 255 255 255 255
0.016462 -1.016078 0.000000 255 255 255 255
-0.004229 -1.025153 0.000000 255 255 255 255
-0.023815 -1.027167 0.000000 255 255 255 255
0.027129 -0.000011 0.000000 255 255 255 255
0.013481 0.963025 0.000000 255 255 255 255
0.013481 -0.000008 0.000000 255 255 255 255
0.027129 0.975985 0.000000 255 255 255 255
0.011195 0.987628 0.000000 255 255 255 255
0.000055 0.976754 0.000000 255 255 255 255
0.000038 0.951104 0.000000 255 255 255 255
-0.008432 0.992067 0.000000 255 255 255 255
-0.015494 1.011229 0.000000 255 255 255 255
0.002614 1.003111 0.000000 255 255 255 255
-0.037730 1.013506 0.000000 255 255 255 255
-0.026340 1.000095 0.000000 255 255 255 255
-0.024771 1.027145 0.000000 255 255 255 255
-0.002235 1.024837 0.000000 255 255 255 255
0.016116 1.016610 0.000000 255 255 255 255
0.024813 1.000919 0.000000 255 255 255 255
0.000926 -0.951116 0.000000 255 255 255 255
-1.000033 1.013506 0.000000 255 255 255 255
-0.049650 1.000000 0.000000 255 255 255 255
-1.000026 1.027145 0.000000 255 255 255 255
0.000038 0.000000 0.000000 255 255 255 255
-1.000026 1.000000 0.000000 255 255 255 255
3 0 1 2
3 3 4 1
3 4 5 1
3 1 6 2
3 5 7 6
3 8 9 7
3 10 9 11
3 12 13 10
3 10 14 12
3 15 11 16
3 11 17 16
3 8 18 17
3 19 12 14
3 19 20 21
3 22 23 20
3 20 24 25
3 23 26 24
3 27 26 28
3 29 30 27
3 27 31 29
3 32 28 33
3 28 34 33
3 25 21 20
3 21 35 12
3 36 37 38
3 37 39 29
3 29 40 37
3 40 38 37
3 0 3 1
3 3 41 4
3 4 18 5
3 1 5 6
3 5 8 7
3 8 11 9
3 10 13 9
3 12 35 13
3 10 15 14
3 15 10 11
3 11 8 17
3 8 5 18
3 19 21 12
3 19 22 20
3 22 34 23
3 20 23 24
3 23 28 26
3 27 30 26
3 29 39 30
3 27 32 31
3 32 27 28
3 28 23 34
3 25 42 21
3 21 42 35
3 36 43 37
3 37 43 39
3 29 31 40
3 40 44 38
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 17 10 12
3 17 18 19
3 20 21 18
3 18 22 23
3 21 24 22
3 25 24 26
3 27 28 25
3 25 29 27
3 30 26 31
3 26 32 31
3 23 19 18
3 19 33 10
3 34 35 27
3 27 36 34
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 33 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 17 19 10
3 17 20 18
3 20 32 21
3 18 21 22
3 21 26 24
3 25 28 24
3 27 35 28
3 25 30 29
3 30 25 26
3 26 21 32
3 23 37 19
3 19 37 33
3 34 38 35
3 27 29 36

View File

@@ -1,7 +1,7 @@
ply
format ascii 1.0
comment Created by Blender 2.82 (sub 7) - www.blender.org, source file: 'border_sharp.blend'
element vertex 52
element vertex 39
property float x
property float y
property float z
@@ -9,120 +9,94 @@ property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 62
element face 49
property list uchar uint vertex_indices
end_header
-0.950647 -1.000000 0.000000 255 255 255 255
-0.000071 -1.003000 0.000000 255 255 255 255
-0.000077 -1.000000 0.000000 255 255 255 255
-0.962557 -1.003000 0.000000 255 255 255 255
0.000015 -1.007400 0.000000 255 255 255 255
0.963176 -1.003000 0.000000 255 255 255 255
0.951244 -1.000000 0.000000 255 255 255 255
0.971677 -1.000000 0.000000 255 255 255 255
0.982502 -1.003000 0.000000 255 255 255 255
1.000000 -1.000000 0.000000 255 255 255 255
1.003758 -0.981739 0.000000 255 255 255 255
1.003000 -1.002581 0.000000 255 255 255 255
1.003000 -0.963042 0.000000 255 255 255 255
1.000000 -0.970926 0.000000 255 255 255 255
1.007400 -0.970801 0.000000 255 255 255 255
1.007400 -0.997446 0.000000 255 255 255 255
1.007400 -1.007400 0.000000 255 255 255 255
0.996947 -1.007400 0.000000 255 255 255 255
0.973770 -1.007400 0.000000 255 255 255 255
1.007400 -0.000016 0.000000 255 255 255 255
1.003000 0.963025 0.000000 255 255 255 255
1.003000 -0.000008 0.000000 255 255 255 255
1.007400 0.987582 0.000000 255 255 255 255
1.003000 0.987628 0.000000 255 255 255 255
1.000017 0.976754 0.000000 255 255 255 255
1.000000 0.951104 0.000000 255 255 255 255
1.000000 1.000000 0.000000 255 255 255 255
0.984469 1.003292 0.000000 255 255 255 255
1.003000 1.003000 0.000000 255 255 255 255
0.962232 1.003287 0.000000 255 255 255 255
0.973622 1.000000 0.000000 255 255 255 255
0.979528 1.007393 0.000000 255 255 255 255
1.002331 1.007393 0.000000 255 255 255 255
1.005447 1.007400 0.000000 255 255 255 255
1.007400 1.007400 0.000000 255 255 255 255
1.000000 -0.951116 0.000000 255 255 255 255
-0.951593 1.000000 0.000000 255 255 255 255
-0.000071 1.003287 0.000000 255 255 255 255
-0.963515 1.003287 0.000000 255 255 255 255
0.950312 1.000000 0.000000 255 255 255 255
-0.000290 1.007393 0.000000 255 255 255 255
-0.971125 -1.007400 0.000000 255 255 255 255
1.000000 0.000000 0.000000 255 255 255 255
-0.000064 1.000000 0.000000 255 255 255 255
-0.969477 1.007393 0.000000 255 255 255 255
1.007402 -0.002983 0.000000 255 255 255 255
1.049534 -0.000048 0.000000 255 255 255 255
1.006874 -0.000048 0.000000 255 255 255 255
1.049534 0.003142 0.000000 255 255 255 255
1.006210 -0.002992 0.000000 255 255 255 255
1.049533 -0.002983 0.000000 255 255 255 255
1.006300 0.003142 0.000000 255 255 255 255
-0.999971 -1.007400 0.000000 255 255 255 255
-0.036811 -1.003000 0.000000 255 255 255 255
-1.000058 -1.003000 0.000000 255 255 255 255
-0.048743 -1.000000 0.000000 255 255 255 255
-1.000064 -1.000000 0.000000 255 255 255 255
-0.028310 -1.000000 0.000000 255 255 255 255
-0.017485 -1.003000 0.000000 255 255 255 255
0.000013 -1.000000 0.000000 255 255 255 255
0.003771 -0.981739 0.000000 255 255 255 255
0.003013 -1.002581 0.000000 255 255 255 255
0.003013 -0.963042 0.000000 255 255 255 255
0.000013 -0.970926 0.000000 255 255 255 255
0.007413 -0.970801 0.000000 255 255 255 255
0.007413 -0.997446 0.000000 255 255 255 255
0.007413 -1.007400 0.000000 255 255 255 255
-0.003040 -1.007400 0.000000 255 255 255 255
-0.026217 -1.007400 0.000000 255 255 255 255
0.007413 -0.000016 0.000000 255 255 255 255
0.003013 0.963025 0.000000 255 255 255 255
0.003013 -0.000008 0.000000 255 255 255 255
0.007413 0.987582 0.000000 255 255 255 255
0.003013 0.987628 0.000000 255 255 255 255
0.000031 0.976754 0.000000 255 255 255 255
0.000013 0.951104 0.000000 255 255 255 255
0.000013 1.000000 0.000000 255 255 255 255
-0.015518 1.003292 0.000000 255 255 255 255
0.003013 1.003000 0.000000 255 255 255 255
-0.037754 1.003287 0.000000 255 255 255 255
-0.026365 1.000000 0.000000 255 255 255 255
-0.020459 1.007393 0.000000 255 255 255 255
0.002344 1.007393 0.000000 255 255 255 255
0.005460 1.007400 0.000000 255 255 255 255
0.007413 1.007400 0.000000 255 255 255 255
0.000013 -0.951116 0.000000 255 255 255 255
-1.000058 1.003287 0.000000 255 255 255 255
-0.049675 1.000000 0.000000 255 255 255 255
-1.000277 1.007393 0.000000 255 255 255 255
0.000013 0.000000 0.000000 255 255 255 255
-1.000051 1.000000 0.000000 255 255 255 255
3 0 1 2
3 3 4 1
3 4 5 1
3 1 6 2
3 5 7 6
3 8 9 7
3 10 9 11
3 12 13 10
3 10 14 12
3 15 11 16
3 11 17 16
3 8 18 17
3 19 12 14
3 19 20 21
3 22 23 20
3 20 24 25
3 23 26 24
3 27 26 28
3 29 30 27
3 27 31 29
3 32 28 33
3 28 34 33
3 25 21 20
3 21 35 12
3 36 37 38
3 37 39 29
3 29 40 37
3 40 38 37
3 0 3 1
3 3 41 4
3 4 18 5
3 1 5 6
3 5 8 7
3 8 11 9
3 10 13 9
3 12 35 13
3 10 15 14
3 15 10 11
3 11 8 17
3 8 5 18
3 19 21 12
3 19 22 20
3 22 34 23
3 20 23 24
3 23 28 26
3 27 30 26
3 29 39 30
3 27 32 31
3 32 27 28
3 28 23 34
3 25 42 21
3 21 42 35
3 36 43 37
3 37 43 39
3 29 31 40
3 40 44 38
3 19 14 22
3 45 46 47
3 48 47 46
3 49 45 47
3 45 50 46
3 48 51 47
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 17 10 12
3 17 18 19
3 20 21 18
3 18 22 23
3 21 24 22
3 25 24 26
3 27 28 25
3 25 29 27
3 30 26 31
3 26 32 31
3 23 19 18
3 19 33 10
3 34 35 27
3 27 36 34
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 33 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 17 19 10
3 17 20 18
3 20 32 21
3 18 21 22
3 21 26 24
3 25 28 24
3 27 35 28
3 25 30 29
3 30 25 26
3 26 21 32
3 23 37 19
3 19 37 33
3 34 38 35
3 27 29 36
3 17 12 20