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[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");

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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_;

View File

@@ -396,10 +396,11 @@ 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() );
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));

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)
{
n.root()->accept(*this);

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

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->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
@@ -1904,6 +1956,10 @@ std::pair<Node *, glm::vec2> AppearanceView::pick(glm::vec2 P)
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() )
@@ -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] ) {

14
View.h
View File

@@ -12,6 +12,8 @@ typedef std::list<Source *> 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,10 +249,16 @@ private:
void adjustBackground();
class Frame *backgroundframe;
Surface *backgroundpreview;
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_;
Symbol *overlay_scaling_;

View File

@@ -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&) {}

View File

@@ -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

View File

@@ -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

View File

@@ -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