Improved user visual feedback on geometryview actions (rotation and

scaling).
This commit is contained in:
brunoherbelin
2020-09-09 23:39:08 +02:00
parent 32234c4d7c
commit a5545147f0
7 changed files with 179 additions and 258 deletions

View File

@@ -313,6 +313,7 @@ set(VMIX_RSC_FILES
./rsc/mesh/icon_unlock.ply ./rsc/mesh/icon_unlock.ply
./rsc/mesh/icon_circle.ply ./rsc/mesh/icon_circle.ply
./rsc/mesh/icon_square.ply ./rsc/mesh/icon_square.ply
./rsc/mesh/icon_cross.ply
./rsc/mesh/icon_clock.ply ./rsc/mesh/icon_clock.ply
./rsc/mesh/icon_grid.ply ./rsc/mesh/icon_grid.ply
./rsc/mesh/h_line.ply ./rsc/mesh/h_line.ply

View File

@@ -296,6 +296,7 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
icons[SQUARE] = new Mesh("mesh/icon_square.ply"); icons[SQUARE] = new Mesh("mesh/icon_square.ply");
icons[CLOCK] = new Mesh("mesh/icon_clock.ply"); icons[CLOCK] = new Mesh("mesh/icon_clock.ply");
icons[GRID] = new Mesh("mesh/icon_grid.ply"); icons[GRID] = new Mesh("mesh/icon_grid.ply");
icons[CROSS] = new Mesh("mesh/icon_cross.ply");
icons[EMPTY] = new Mesh("mesh/icon_empty.ply"); icons[EMPTY] = new Mesh("mesh/icon_empty.ply");
} }
@@ -322,10 +323,29 @@ void Symbol::draw(glm::mat4 modelview, glm::mat4 projection)
// set color // set color
symbol_->shader()->color = color; symbol_->shader()->color = color;
glm::mat4 ctm = modelview * transform_; // glm::mat4 ctm = modelview * transform_;
// correct for aspect ratio // // correct for aspect ratio
glm::vec4 vec = ctm * glm::vec4(1.f, 1.0f, 0.f, 0.f); // glm::vec4 vec = ctm * glm::vec4(1.f, 1.0f, 0.f, 0.f);
ctm *= glm::scale(glm::identity<glm::mat4>(), glm::vec3( vec.y / vec.x, 1.f, 1.f)); // ctm *= glm::scale(glm::identity<glm::mat4>(), glm::vec3( vec.y / vec.x, 1.f, 1.f));
// rebuild a matrix with rotation (see handles) and translation from modelview + translation_
// and define scale to be 1, 1
glm::mat4 ctm;
glm::vec3 rot(0.f);
glm::vec4 vec = modelview * 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) );
// extract scaling
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
glm::vec3 sca = glm::vec3(vec.y , vec.y, 1.f) * glm::vec3(scale_.y, scale_.y, 1.f);
glm::vec3 tran = glm::vec3(modelview[3][0], modelview[3][1], modelview[3][2]) ;
tran += translation_ * glm::vec3(vec);
rot.z += rotation_.z;
ctm = GlmToolkit::transform(tran, rot, sca);
symbol_->draw( ctm, projection); symbol_->draw( ctm, projection);
} }

View File

@@ -57,7 +57,7 @@ protected:
class Symbol : public Node class Symbol : public Node
{ {
public: public:
typedef enum { POINT = 0, IMAGE, VIDEO, SESSION, CLONE, RENDER, DOTS, BUSY, LOCK, UNLOCK, CIRCLE, SQUARE, CLOCK, GRID, EMPTY } Type; typedef enum { POINT = 0, IMAGE, VIDEO, SESSION, CLONE, RENDER, DOTS, BUSY, LOCK, UNLOCK, CIRCLE, SQUARE, CLOCK, GRID, CROSS, EMPTY } Type;
Symbol(Type t = POINT, glm::vec3 pos = glm::vec3(0.f)); Symbol(Type t = POINT, glm::vec3 pos = glm::vec3(0.f));
~Symbol(); ~Symbol();

View File

@@ -52,7 +52,7 @@ void Node::copyTransform(Node *other)
{ {
if (!other) if (!other)
return; return;
transform_ = glm::identity<glm::mat4>(); transform_ = other->transform_;
scale_ = other->scale_; scale_ = other->scale_;
rotation_ = other->rotation_; rotation_ = other->rotation_;
translation_ = other->translation_; translation_ = other->translation_;

109
View.cpp
View File

@@ -626,31 +626,47 @@ GeometryView::GeometryView() : View(GEOMETRY)
scene.fg()->attach(border); scene.fg()->attach(border);
// User interface foreground // User interface foreground
//
// 'clock' : tic marks every 10 degrees for ROTATION
// (with opaque background)
Group *g = new Group; Group *g = new Group;
Symbol *s = new Symbol(Symbol::CLOCK); Symbol *s = new Symbol(Symbol::CLOCK);
g->attach(s); g->attach(s);
Symbol *d = new Symbol(Symbol::POINT); s = new Symbol(Symbol::POINT);
d->color = glm::vec4(0.f, 0.f, 0.f, 0.25f); s->color = glm::vec4(0.f, 0.f, 0.f, 0.25f);
d->scale_ = glm::vec3(28.f, 28.f, 1.f); s->scale_ = glm::vec3(28.f, 28.f, 1.f);
d->translation_.z = -0.1; s->translation_.z = -0.1;
g->attach(d); g->attach(s);
overlay_rotation_clock_ = g; overlay_rotation_clock_ = g;
overlay_rotation_clock_->scale_ = glm::vec3(0.25f, 0.25f, 1.f); overlay_rotation_clock_->scale_ = glm::vec3(0.25f, 0.25f, 1.f);
scene.fg()->attach(overlay_rotation_clock_); scene.fg()->attach(overlay_rotation_clock_);
overlay_rotation_clock_->visible_ = false; overlay_rotation_clock_->visible_ = false;
// circle to show the center of ROTATION
overlay_rotation_circle_ = new Symbol(Symbol::CIRCLE); overlay_rotation_ = new Symbol(Symbol::CIRCLE);
overlay_rotation_circle_->scale_ = glm::vec3(0.25f, 0.25f, 1.f); overlay_rotation_->scale_ = glm::vec3(0.25f, 0.25f, 1.f);
scene.fg()->attach(overlay_rotation_circle_); scene.fg()->attach(overlay_rotation_);
overlay_rotation_circle_->visible_ = false; overlay_rotation_->visible_ = false;
// 'grid' : tic marks every 0.1 step for SCALING
overlay_grid_ = new Symbol(Symbol::GRID); g = new Group;
overlay_grid_->scale_ = glm::vec3(1.f, 1.f, 1.f); s = new Symbol(Symbol::GRID);
scene.fg()->attach(overlay_grid_); g->attach(s);
overlay_grid_->visible_ = false; s = new Symbol(Symbol::POINT);
s->color = glm::vec4(0.f, 0.f, 0.f, 0.25f);
s->scale_ = glm::vec3(23.f, 23.f, 1.f);
s->translation_.z = -0.1;
g->attach(s);
overlay_scaling_grid_ = g;
overlay_scaling_grid_->scale_ = glm::vec3(0.28f, 0.28f, 1.f);
scene.fg()->attach(overlay_scaling_grid_);
overlay_scaling_grid_->visible_ = false;
// cross in the square for proportional SCALING
overlay_scaling_cross_ = new Symbol(Symbol::CROSS);
overlay_scaling_cross_->scale_ = glm::vec3(0.28f, 0.28f, 1.f);
scene.fg()->attach(overlay_scaling_cross_);
overlay_scaling_cross_->visible_ = false;
// square to show the center of SCALING
overlay_scaling_ = new Symbol(Symbol::SQUARE); overlay_scaling_ = new Symbol(Symbol::SQUARE);
overlay_scaling_->scale_ = glm::vec3(0.25f, 0.25f, 1.f); overlay_scaling_->scale_ = glm::vec3(0.28f, 0.28f, 1.f);
scene.fg()->attach(overlay_scaling_); scene.fg()->attach(overlay_scaling_);
overlay_scaling_->visible_ = false; overlay_scaling_->visible_ = false;
@@ -776,7 +792,7 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
std::ostringstream info; std::ostringstream info;
if (pick.first) { if (pick.first) {
// which corner was picked ? // which corner was picked ?
glm::vec2 corner = glm::sign(pick.second); glm::vec2 corner = glm::round(pick.second);
// transform from source center to corner // transform from source center to corner
glm::mat4 T = GlmToolkit::transform(glm::vec3(corner.x, corner.y, 0.f), glm::vec3(0.f, 0.f, 0.f), glm::mat4 T = GlmToolkit::transform(glm::vec3(corner.x, corner.y, 0.f), glm::vec3(0.f, 0.f, 0.f),
@@ -798,11 +814,12 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
// picking on the resizing handles in the corners // picking on the resizing handles in the corners
if ( pick.first == s->handle_[Handles::RESIZE] ) { if ( pick.first == s->handle_[Handles::RESIZE] ) {
overlay_scaling_->visible_ = true; // overlay_scaling_->visible_ = true;
glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 0.f, 0.f, 1.f); // glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 0.f, 0.f, 1.f);
overlay_scaling_->translation_.x = icon.x; // overlay_scaling_->translation_.x = icon.x;
overlay_scaling_->translation_.y = icon.y; // overlay_scaling_->translation_.y = icon.y;
overlay_scaling_->update(0); // overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
// overlay_scaling_->update(0);
// RESIZE CORNER // RESIZE CORNER
// proportional SCALING with SHIFT // proportional SCALING with SHIFT
@@ -848,11 +865,12 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
// picking on the BORDER RESIZING handles left or right // picking on the BORDER RESIZING handles left or right
else if ( pick.first == s->handle_[Handles::RESIZE_H] ) { else if ( pick.first == s->handle_[Handles::RESIZE_H] ) {
overlay_scaling_->visible_ = true; // overlay_scaling_->visible_ = true;
glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 1.f, 0.f, 1.f); // glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 0.f, 0.f, 1.f);
overlay_scaling_->translation_.x = icon.x; // overlay_scaling_->translation_.x = icon.x;
overlay_scaling_->translation_.y = icon.y; // overlay_scaling_->translation_.y = icon.y;
overlay_scaling_->update(0); // overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
// overlay_scaling_->update(0);
// SHIFT: HORIZONTAL SCALE to restore source aspect ratio // SHIFT: HORIZONTAL SCALE to restore source aspect ratio
if (UserInterface::manager().shiftModifier()) { if (UserInterface::manager().shiftModifier()) {
@@ -886,11 +904,12 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
// picking on the BORDER RESIZING handles top or bottom // picking on the BORDER RESIZING handles top or bottom
else if ( pick.first == s->handle_[Handles::RESIZE_V] ) { else if ( pick.first == s->handle_[Handles::RESIZE_V] ) {
overlay_scaling_->visible_ = true; // overlay_scaling_->visible_ = true;
glm::vec4 icon = corner_to_scene_transform * glm::vec4(1.f, 0.f, 0.f, 1.f); // glm::vec4 icon = corner_to_scene_transform * glm::vec4(0.f, 0.f, 0.f, 1.f);
overlay_scaling_->translation_.x = icon.x; // overlay_scaling_->translation_.x = icon.x;
overlay_scaling_->translation_.y = icon.y; // overlay_scaling_->translation_.y = icon.y;
overlay_scaling_->update(0); // overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
// overlay_scaling_->update(0);
// SHIFT: VERTICAL SCALE to restore source aspect ratio // SHIFT: VERTICAL SCALE to restore source aspect ratio
if (UserInterface::manager().shiftModifier()) { if (UserInterface::manager().shiftModifier()) {
@@ -924,15 +943,20 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
// picking on the CENTRER SCALING handle // picking on the CENTRER SCALING handle
else if ( pick.first == s->handle_[Handles::SCALE] ) { else if ( pick.first == s->handle_[Handles::SCALE] ) {
overlay_scaling_cross_->visible_ = false;
overlay_scaling_grid_->visible_ = false;
overlay_scaling_->visible_ = true; overlay_scaling_->visible_ = true;
overlay_scaling_->translation_.x = s->stored_status_->translation_.x; overlay_scaling_->translation_.x = s->stored_status_->translation_.x;
overlay_scaling_->translation_.y = s->stored_status_->translation_.y; overlay_scaling_->translation_.y = s->stored_status_->translation_.y;
overlay_scaling_->rotation_.z = s->stored_status_->rotation_.z;
overlay_scaling_->update(0); overlay_scaling_->update(0);
// PROPORTIONAL ONLY // PROPORTIONAL ONLY
if (UserInterface::manager().shiftModifier()) { if (UserInterface::manager().shiftModifier()) {
float factor = glm::length( glm::vec2( source_to ) ) / glm::length( glm::vec2( source_from ) ); float factor = glm::length( glm::vec2( source_to ) ) / glm::length( glm::vec2( source_from ) );
source_scaling = glm::vec3(factor, factor, 1.f); source_scaling = glm::vec3(factor, factor, 1.f);
overlay_scaling_cross_->visible_ = true;
overlay_scaling_cross_->copyTransform(overlay_scaling_);
} }
// apply center scaling // apply center scaling
sourceNode->scale_ = s->stored_status_->scale_ * source_scaling; sourceNode->scale_ = s->stored_status_->scale_ * source_scaling;
@@ -940,6 +964,8 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
if (UserInterface::manager().altModifier()) { if (UserInterface::manager().altModifier()) {
sourceNode->scale_.x = ROUND(sourceNode->scale_.x, 10.f); sourceNode->scale_.x = ROUND(sourceNode->scale_.x, 10.f);
sourceNode->scale_.y = ROUND(sourceNode->scale_.y, 10.f); sourceNode->scale_.y = ROUND(sourceNode->scale_.y, 10.f);
overlay_scaling_grid_->visible_ = true;
overlay_scaling_grid_->copyTransform(overlay_scaling_);
} }
// show cursor depending on diagonal (corner picked) // show cursor depending on diagonal (corner picked)
ret.type = Cursor_ResizeNWSE; ret.type = Cursor_ResizeNWSE;
@@ -951,10 +977,10 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
// ROTATION on CENTER // ROTATION on CENTER
overlay_rotation_clock_->visible_ = false; overlay_rotation_clock_->visible_ = false;
overlay_rotation_circle_->visible_ = true; overlay_rotation_->visible_ = true;
overlay_rotation_circle_->translation_.x = s->stored_status_->translation_.x; overlay_rotation_->translation_.x = s->stored_status_->translation_.x;
overlay_rotation_circle_->translation_.y = s->stored_status_->translation_.y; overlay_rotation_->translation_.y = s->stored_status_->translation_.y;
overlay_rotation_circle_->update(0); overlay_rotation_->update(0);
// rotation center to center of source (disregarding scale) // rotation center to center of source (disregarding scale)
glm::mat4 T = glm::translate(glm::identity<glm::mat4>(), s->stored_status_->translation_); glm::mat4 T = glm::translate(glm::identity<glm::mat4>(), s->stored_status_->translation_);
@@ -970,9 +996,7 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
degrees = (degrees / 10) * 10; degrees = (degrees / 10) * 10;
sourceNode->rotation_.z = glm::radians( float(degrees) ); sourceNode->rotation_.z = glm::radians( float(degrees) );
overlay_rotation_clock_->visible_ = true; overlay_rotation_clock_->visible_ = true;
overlay_rotation_clock_->translation_.x = s->stored_status_->translation_.x; overlay_rotation_clock_->copyTransform(overlay_rotation_);
overlay_rotation_clock_->translation_.y = s->stored_status_->translation_.y;
overlay_rotation_clock_->update(0);
} }
// show cursor for rotation // show cursor for rotation
ret.type = Cursor_Hand; ret.type = Cursor_Hand;
@@ -1022,8 +1046,9 @@ View::Cursor GeometryView::grab (Source *s, glm::vec2 from, glm::vec2 to, std::p
void GeometryView::terminate() void GeometryView::terminate()
{ {
overlay_rotation_clock_->visible_ = false; overlay_rotation_clock_->visible_ = false;
overlay_rotation_circle_->visible_ = false; overlay_rotation_->visible_ = false;
overlay_grid_->visible_ = false; overlay_scaling_grid_->visible_ = false;
overlay_scaling_cross_->visible_ = false;
overlay_scaling_->visible_ = false; overlay_scaling_->visible_ = false;
} }

5
View.h
View File

@@ -148,10 +148,11 @@ public:
void terminate(); void terminate();
private: private:
Node *overlay_rotation_circle_; Node *overlay_rotation_;
Node *overlay_rotation_clock_; Node *overlay_rotation_clock_;
Node *overlay_scaling_; Node *overlay_scaling_;
Node *overlay_grid_; Node *overlay_scaling_cross_;
Node *overlay_scaling_grid_;
}; };
class LayerView : public View class LayerView : public View

View File

@@ -1,7 +1,7 @@
ply ply
format ascii 1.0 format ascii 1.0
comment Created by Blender 2.90.0 - www.blender.org comment Created by Blender 2.90.0 - www.blender.org
element vertex 164 element vertex 80
property float x property float x
property float y property float y
property float z property float z
@@ -9,173 +9,89 @@ property uchar red
property uchar green property uchar green
property uchar blue property uchar blue
property uchar alpha property uchar alpha
element face 82 element face 40
property list uchar uint vertex_indices property list uchar uint vertex_indices
end_header end_header
-0.009185 0.309212 0.000000 255 255 255 255 -0.009185 0.712606 0.000000 255 255 255 255
0.009185 0.291011 0.000000 255 255 255 255 0.009185 0.611799 0.000000 255 255 255 255
0.009185 0.309212 0.000000 255 255 255 255 0.009185 0.712606 0.000000 255 255 255 255
-0.009185 0.291011 0.000000 255 255 255 255 -0.009185 0.611799 0.000000 255 255 255 255
-0.009185 0.209212 0.000000 255 255 255 255 0.190815 0.712606 0.000000 255 255 255 255
0.009185 0.191011 0.000000 255 255 255 255 0.209185 0.611800 0.000000 255 255 255 255
0.009185 0.209212 0.000000 255 255 255 255 0.209185 0.712606 0.000000 255 255 255 255
-0.009185 0.191011 0.000000 255 255 255 255 0.190815 0.611800 0.000000 255 255 255 255
-0.009185 0.109212 0.000000 255 255 255 255 0.390815 0.712606 0.000000 255 255 255 255
0.009185 0.091011 0.000000 255 255 255 255 0.409185 0.611800 0.000000 255 255 255 255
0.009185 0.109212 0.000000 255 255 255 255 0.409185 0.712606 0.000000 255 255 255 255
-0.009185 0.091011 0.000000 255 255 255 255 0.390815 0.611800 0.000000 255 255 255 255
-0.009185 0.009212 0.000000 255 255 255 255 -0.409185 0.712606 0.000000 255 255 255 255
0.009185 -0.008989 0.000000 255 255 255 255 -0.390815 0.611799 0.000000 255 255 255 255
0.009185 0.009212 0.000000 255 255 255 255 -0.390815 0.712606 0.000000 255 255 255 255
-0.009185 -0.008989 0.000000 255 255 255 255 -0.409185 0.611799 0.000000 255 255 255 255
0.090815 0.009212 0.000000 255 255 255 255 -0.209185 0.712606 0.000000 255 255 255 255
0.109185 -0.008989 0.000000 255 255 255 255 -0.190815 0.611799 0.000000 255 255 255 255
0.109185 0.009212 0.000000 255 255 255 255 -0.190815 0.712606 0.000000 255 255 255 255
0.090815 -0.008989 0.000000 255 255 255 255 -0.209185 0.611799 0.000000 255 255 255 255
0.190815 0.009212 0.000000 255 255 255 255 0.714442 0.007350 0.000000 255 255 255 255
0.209185 -0.008989 0.000000 255 255 255 255 0.613635 -0.011021 0.000000 255 255 255 255
0.209185 0.009212 0.000000 255 255 255 255 0.714442 -0.011021 0.000000 255 255 255 255
0.190815 -0.008989 0.000000 255 255 255 255 0.613635 0.007350 0.000000 255 255 255 255
0.290815 0.009212 0.000000 255 255 255 255 0.714442 -0.192650 0.000000 255 255 255 255
0.309185 -0.008989 0.000000 255 255 255 255 0.613635 -0.211021 0.000000 255 255 255 255
0.309185 0.009212 0.000000 255 255 255 255 0.714442 -0.211021 0.000000 255 255 255 255
0.290815 -0.008989 0.000000 255 255 255 255 0.613635 -0.192650 0.000000 255 255 255 255
0.390815 0.009212 0.000000 255 255 255 255 0.714442 -0.392650 0.000000 255 255 255 255
0.409185 -0.008989 0.000000 255 255 255 255 0.613635 -0.411021 0.000000 255 255 255 255
0.409185 0.009212 0.000000 255 255 255 255 0.714442 -0.411021 0.000000 255 255 255 255
0.390815 -0.008989 0.000000 255 255 255 255 0.613635 -0.392650 0.000000 255 255 255 255
0.490815 0.009212 0.000000 255 255 255 255 0.714441 0.407350 0.000000 255 255 255 255
0.509185 -0.008989 0.000000 255 255 255 255 0.613635 0.388979 0.000000 255 255 255 255
0.509185 0.009212 0.000000 255 255 255 255 0.714441 0.388979 0.000000 255 255 255 255
0.490815 -0.008989 0.000000 255 255 255 255 0.613635 0.407350 0.000000 255 255 255 255
-0.609185 0.009212 0.000000 255 255 255 255 0.714442 0.207350 0.000000 255 255 255 255
-0.590815 -0.008989 0.000000 255 255 255 255 0.613635 0.188979 0.000000 255 255 255 255
-0.590815 0.009212 0.000000 255 255 255 255 0.714442 0.188979 0.000000 255 255 255 255
-0.609185 -0.008989 0.000000 255 255 255 255 0.613635 0.207350 0.000000 255 255 255 255
-0.509185 0.009212 0.000000 255 255 255 255 0.009185 -0.716277 0.000000 255 255 255 255
-0.490815 -0.008989 0.000000 255 255 255 255 -0.009185 -0.615470 0.000000 255 255 255 255
-0.490815 0.009212 0.000000 255 255 255 255 -0.009185 -0.716277 0.000000 255 255 255 255
-0.509185 -0.008989 0.000000 255 255 255 255 0.009185 -0.615470 0.000000 255 255 255 255
-0.409185 0.009212 0.000000 255 255 255 255 -0.190815 -0.716277 0.000000 255 255 255 255
-0.390815 -0.008989 0.000000 255 255 255 255 -0.209185 -0.615470 0.000000 255 255 255 255
-0.390815 0.009212 0.000000 255 255 255 255 -0.209185 -0.716277 0.000000 255 255 255 255
-0.409185 -0.008989 0.000000 255 255 255 255 -0.190815 -0.615470 0.000000 255 255 255 255
-0.309185 0.009212 0.000000 255 255 255 255 -0.390815 -0.716277 0.000000 255 255 255 255
-0.290815 -0.008989 0.000000 255 255 255 255 -0.409185 -0.615470 0.000000 255 255 255 255
-0.290815 0.009212 0.000000 255 255 255 255 -0.409185 -0.716277 0.000000 255 255 255 255
-0.309185 -0.008989 0.000000 255 255 255 255 -0.390815 -0.615470 0.000000 255 255 255 255
-0.209185 0.009212 0.000000 255 255 255 255 0.409185 -0.716277 0.000000 255 255 255 255
-0.190815 -0.008989 0.000000 255 255 255 255 0.390815 -0.615470 0.000000 255 255 255 255
-0.190815 0.009212 0.000000 255 255 255 255 0.390815 -0.716277 0.000000 255 255 255 255
-0.209185 -0.008989 0.000000 255 255 255 255 0.409185 -0.615470 0.000000 255 255 255 255
-0.109185 0.009212 0.000000 255 255 255 255 0.209185 -0.716277 0.000000 255 255 255 255
-0.090815 -0.008989 0.000000 255 255 255 255 0.190815 -0.615470 0.000000 255 255 255 255
-0.090815 0.009212 0.000000 255 255 255 255 0.190815 -0.716277 0.000000 255 255 255 255
-0.109185 -0.008989 0.000000 255 255 255 255 0.209185 -0.615470 0.000000 255 255 255 255
0.590815 0.009212 0.000000 255 255 255 255 -0.714441 -0.011020 0.000000 255 255 255 255
0.609185 -0.008989 0.000000 255 255 255 255 -0.613635 0.007350 0.000000 255 255 255 255
0.609185 0.009212 0.000000 255 255 255 255 -0.714441 0.007350 0.000000 255 255 255 255
0.590815 -0.008989 0.000000 255 255 255 255 -0.613635 -0.011020 0.000000 255 255 255 255
0.690815 0.009212 0.000000 255 255 255 255 -0.714442 0.188980 0.000000 255 255 255 255
0.709185 -0.008989 0.000000 255 255 255 255 -0.613635 0.207350 0.000000 255 255 255 255
0.709185 0.009212 0.000000 255 255 255 255 -0.714442 0.207350 0.000000 255 255 255 255
0.690815 -0.008989 0.000000 255 255 255 255 -0.613635 0.188980 0.000000 255 255 255 255
0.790815 0.009212 0.000000 255 255 255 255 -0.714442 0.388980 0.000000 255 255 255 255
0.809185 -0.008989 0.000000 255 255 255 255 -0.613635 0.407350 0.000000 255 255 255 255
0.809185 0.009212 0.000000 255 255 255 255 -0.714442 0.407350 0.000000 255 255 255 255
0.790815 -0.008989 0.000000 255 255 255 255 -0.613635 0.388980 0.000000 255 255 255 255
0.890815 0.009212 0.000000 255 255 255 255 -0.714441 -0.411020 0.000000 255 255 255 255
0.909185 -0.008989 0.000000 255 255 255 255 -0.613635 -0.392650 0.000000 255 255 255 255
0.909185 0.009212 0.000000 255 255 255 255 -0.714441 -0.392650 0.000000 255 255 255 255
0.890815 -0.008989 0.000000 255 255 255 255 -0.613635 -0.411020 0.000000 255 255 255 255
0.990815 0.009212 0.000000 255 255 255 255 -0.714441 -0.211020 0.000000 255 255 255 255
1.009185 -0.008989 0.000000 255 255 255 255 -0.613635 -0.192650 0.000000 255 255 255 255
1.009185 0.009212 0.000000 255 255 255 255 -0.714441 -0.192650 0.000000 255 255 255 255
0.990815 -0.008989 0.000000 255 255 255 255 -0.613635 -0.211020 0.000000 255 255 255 255
-1.009185 0.009212 0.000000 255 255 255 255
-0.990815 -0.008989 0.000000 255 255 255 255
-0.990815 0.009212 0.000000 255 255 255 255
-1.009185 -0.008989 0.000000 255 255 255 255
-0.909185 0.009212 0.000000 255 255 255 255
-0.890815 -0.008989 0.000000 255 255 255 255
-0.890815 0.009212 0.000000 255 255 255 255
-0.909185 -0.008989 0.000000 255 255 255 255
-0.809185 0.009212 0.000000 255 255 255 255
-0.790815 -0.008989 0.000000 255 255 255 255
-0.790815 0.009212 0.000000 255 255 255 255
-0.809185 -0.008989 0.000000 255 255 255 255
-0.709185 0.009212 0.000000 255 255 255 255
-0.690815 -0.008989 0.000000 255 255 255 255
-0.690815 0.009212 0.000000 255 255 255 255
-0.709185 -0.008989 0.000000 255 255 255 255
-0.009185 0.409212 0.000000 255 255 255 255
0.009185 0.391011 0.000000 255 255 255 255
0.009185 0.409212 0.000000 255 255 255 255
-0.009185 0.391011 0.000000 255 255 255 255
-0.009185 0.809212 0.000000 255 255 255 255
0.009185 0.791011 0.000000 255 255 255 255
0.009185 0.809212 0.000000 255 255 255 255
-0.009185 0.791011 0.000000 255 255 255 255
-0.009185 0.709212 0.000000 255 255 255 255
0.009185 0.691011 0.000000 255 255 255 255
0.009185 0.709212 0.000000 255 255 255 255
-0.009185 0.691011 0.000000 255 255 255 255
-0.009185 0.609212 0.000000 255 255 255 255
0.009185 0.591011 0.000000 255 255 255 255
0.009185 0.609212 0.000000 255 255 255 255
-0.009185 0.591011 0.000000 255 255 255 255
-0.009185 0.509212 0.000000 255 255 255 255
0.009185 0.491011 0.000000 255 255 255 255
0.009185 0.509212 0.000000 255 255 255 255
-0.009185 0.491011 0.000000 255 255 255 255
-0.009185 0.909212 0.000000 255 255 255 255
0.009185 0.891011 0.000000 255 255 255 255
0.009185 0.909212 0.000000 255 255 255 255
-0.009185 0.891011 0.000000 255 255 255 255
-0.009185 -0.190788 0.000000 255 255 255 255
0.009185 -0.208989 0.000000 255 255 255 255
0.009185 -0.190788 0.000000 255 255 255 255
-0.009185 -0.208989 0.000000 255 255 255 255
-0.009185 -0.290788 0.000000 255 255 255 255
0.009185 -0.308989 0.000000 255 255 255 255
0.009185 -0.290788 0.000000 255 255 255 255
-0.009185 -0.308989 0.000000 255 255 255 255
-0.009185 -0.390788 0.000000 255 255 255 255
0.009185 -0.408989 0.000000 255 255 255 255
0.009185 -0.390788 0.000000 255 255 255 255
-0.009185 -0.408989 0.000000 255 255 255 255
-0.009185 -0.490788 0.000000 255 255 255 255
0.009185 -0.508989 0.000000 255 255 255 255
0.009185 -0.490788 0.000000 255 255 255 255
-0.009185 -0.508989 0.000000 255 255 255 255
-0.009185 -0.090788 0.000000 255 255 255 255
0.009185 -0.108989 0.000000 255 255 255 255
0.009185 -0.090788 0.000000 255 255 255 255
-0.009185 -0.108989 0.000000 255 255 255 255
-0.009185 -0.690788 0.000000 255 255 255 255
0.009185 -0.708989 0.000000 255 255 255 255
0.009185 -0.690788 0.000000 255 255 255 255
-0.009185 -0.708989 0.000000 255 255 255 255
-0.009185 -0.790788 0.000000 255 255 255 255
0.009185 -0.808989 0.000000 255 255 255 255
0.009185 -0.790788 0.000000 255 255 255 255
-0.009185 -0.808989 0.000000 255 255 255 255
-0.009185 -0.890788 0.000000 255 255 255 255
0.009185 -0.908989 0.000000 255 255 255 255
0.009185 -0.890788 0.000000 255 255 255 255
-0.009185 -0.908989 0.000000 255 255 255 255
-0.009185 -0.990788 0.000000 255 255 255 255
0.009185 -1.008989 0.000000 255 255 255 255
0.009185 -0.990788 0.000000 255 255 255 255
-0.009185 -1.008989 0.000000 255 255 255 255
-0.009185 -0.590788 0.000000 255 255 255 255
0.009185 -0.608989 0.000000 255 255 255 255
0.009185 -0.590788 0.000000 255 255 255 255
-0.009185 -0.608989 0.000000 255 255 255 255
-0.009185 1.009212 0.000000 255 255 255 255
0.009185 0.991011 0.000000 255 255 255 255
0.009185 1.009212 0.000000 255 255 255 255
-0.009185 0.991011 0.000000 255 255 255 255
3 0 1 2 3 0 1 2
3 0 3 1 3 0 3 1
3 4 5 6 3 4 5 6
@@ -216,45 +132,3 @@ end_header
3 72 75 73 3 72 75 73
3 76 77 78 3 76 77 78
3 76 79 77 3 76 79 77
3 80 81 82
3 80 83 81
3 84 85 86
3 84 87 85
3 88 89 90
3 88 91 89
3 92 93 94
3 92 95 93
3 96 97 98
3 96 99 97
3 100 101 102
3 100 103 101
3 104 105 106
3 104 107 105
3 108 109 110
3 108 111 109
3 112 113 114
3 112 115 113
3 116 117 118
3 116 119 117
3 120 121 122
3 120 123 121
3 124 125 126
3 124 127 125
3 128 129 130
3 128 131 129
3 132 133 134
3 132 135 133
3 136 137 138
3 136 139 137
3 140 141 142
3 140 143 141
3 144 145 146
3 144 147 145
3 148 149 150
3 148 151 149
3 152 153 154
3 152 155 153
3 156 157 158
3 156 159 157
3 160 161 162
3 160 163 161