diff --git a/CMakeLists.txt b/CMakeLists.txt index 6be5b5f..591cb95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -265,6 +265,8 @@ set(VMIX_RSC_FILES ./rsc/mesh/border_round.ply ./rsc/mesh/border_sharp.ply ./rsc/mesh/border_large_round.ply + ./rsc/mesh/border_handles_sharp.ply + ./rsc/mesh/border_handles_overlay.ply ./rsc/mesh/border_large_sharp.ply ./rsc/mesh/border_vertical_overlay.ply ./rsc/mesh/circle.ply diff --git a/MediaPlayer.cpp b/MediaPlayer.cpp index 1a548bf..dadeae0 100644 --- a/MediaPlayer.cpp +++ b/MediaPlayer.cpp @@ -225,6 +225,10 @@ void MediaPlayer::close() GstClockTime MediaPlayer::duration() { + // cannot play an image + if (isimage_) + return GST_CLOCK_TIME_NONE; + if (duration_ == GST_CLOCK_TIME_NONE && pipeline_ != nullptr) { gint64 d = GST_CLOCK_TIME_NONE; if ( gst_element_query_duration(pipeline_, GST_FORMAT_TIME, &d) ) diff --git a/Mesh.cpp b/Mesh.cpp index 7c4cc90..cf0bd41 100644 --- a/Mesh.cpp +++ b/Mesh.cpp @@ -377,24 +377,28 @@ void Mesh::accept(Visitor& v) Frame::Frame(Style style) : Node() { + overlay_ = nullptr; + shadow_ = nullptr; + color = glm::vec4( 1.f, 1.f, 1.f, 1.f); switch (style) { - case SHARP_LARGE: - border_ = new Mesh("mesh/border_large_sharp.ply"); + case SHARP_HANDLES: + border_ = new Mesh("mesh/border_handles_sharp.ply"); + overlay_ = new Mesh("mesh/border_handles_overlay.ply"); + shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png"); break; case SHARP_THIN: border_ = new Mesh("mesh/border_sharp.ply"); break; case ROUND_LARGE: border_ = new Mesh("mesh/border_large_round.ply"); + shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png"); break; default: case ROUND_THIN: border_ = new Mesh("mesh/border_round.ply"); + shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png"); break; } - overlay_ = nullptr; - shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png"); - color = glm::vec4( 1.f, 1.f, 1.f, 1.f); } Frame::~Frame() @@ -416,7 +420,8 @@ void Frame::draw(glm::mat4 modelview, glm::mat4 projection) if ( visible_ ) { // not absolutely necessary but saves some CPU time.. // shadow - shadow_->draw( modelview * transform_, projection); + if(shadow_) + shadow_->draw( modelview * transform_, projection); if (overlay_) { // overlat is not altered diff --git a/Mesh.h b/Mesh.h index 912a3a3..fddac9c 100644 --- a/Mesh.h +++ b/Mesh.h @@ -41,7 +41,7 @@ class Frame : public Node public: - typedef enum { ROUND_THIN = 0, ROUND_LARGE, SHARP_THIN, SHARP_LARGE } Style; + typedef enum { ROUND_THIN = 0, ROUND_LARGE, SHARP_THIN, SHARP_HANDLES } Style; Frame(Style style); ~Frame(); diff --git a/PickingVisitor.cpp b/PickingVisitor.cpp index 396ac32..198c3ed 100644 --- a/PickingVisitor.cpp +++ b/PickingVisitor.cpp @@ -19,7 +19,7 @@ void PickingVisitor::visit(Node &n) { modelview_ *= n.transform_; -// modelview_ = modelview_ * transform(n.translation_, n.rotation_, n.scale_); +// modelview_ *= transform(n.translation_, n.rotation_, n.scale_); // Log::Info("Node %d", n.id()); // Log::Info("%s", glm::to_string(modelview_).c_str()); } @@ -65,7 +65,7 @@ void PickingVisitor::visit(Surface &n) // if P is inside [LL UR] rectangle: if ( P.x > LL.x && P.x < UR.x && P.y > LL.y && P.y < UR.y ) // add this surface to the nodes picked - nodes_.push_back(&n); + nodes_.push_back( std::pair(&n, glm::vec2(P)) ); } void PickingVisitor::visit(LineSquare &) @@ -89,7 +89,7 @@ void PickingVisitor::visit(LineCircle &n) float r = glm::length( glm::vec2(P) ); if ( r < 1.02 && r > 0.98) - nodes_.push_back(&n); + nodes_.push_back( std::pair(&n, glm::vec2(P)) ); } void PickingVisitor::visit(Scene &n) diff --git a/PickingVisitor.h b/PickingVisitor.h index acb5358..70b50cf 100644 --- a/PickingVisitor.h +++ b/PickingVisitor.h @@ -3,6 +3,7 @@ #include #include +#include #include "Visitor.h" @@ -10,11 +11,13 @@ class PickingVisitor: public Visitor { glm::vec2 point_; glm::mat4 modelview_; - std::vector nodes_; + std::vector< std::pair > nodes_; public: + + PickingVisitor(glm::vec2 coordinates); - std::vector picked() { return nodes_; } + std::vector< std::pair > picked() { return nodes_; } // Elements of Scene void visit(Scene& n); diff --git a/Source.cpp b/Source.cpp index daaed9f..230cb4e 100644 --- a/Source.cpp +++ b/Source.cpp @@ -33,13 +33,16 @@ Source::Source(const std::string &name) : name_(name), initialized_(false) // default geometry nodes groups_[View::GEOMETRY] = new Group; + frame = new Frame(Frame::SHARP_THIN); + frame->translation_.z = 0.1; + frame->color = glm::vec4( 0.8f, 0.8f, 0.0f, 0.9f); + groups_[View::GEOMETRY]->attach(frame); // will be associated to nodes later blendingshader_ = new ImageShader; rendershader_ = new ImageProcessingShader; renderbuffer_ = nullptr; rendersurface_ = nullptr; - overlay_ = nullptr; } Source::~Source() @@ -73,8 +76,10 @@ void Source::accept(Visitor& v) void Source::setOverlayVisible(bool on) { - if (overlay_) - overlay_->visible_ = on; +// if (overlay_) +// overlay_->visible_ = on; + for (auto o = overlays_.begin(); o != overlays_.end(); o++) + (*o).second->visible_ = on; } bool hasNode::operator()(const Source* elem) const @@ -107,13 +112,18 @@ MediaSource::MediaSource(const std::string &name) : Source(name), path_("") mediasurface_ = new Surface(rendershader_); // extra overlay for mixing view - overlay_ = new Frame(Frame::ROUND_LARGE); - overlay_->overlay_ = new Mesh("mesh/icon_video.ply"); - overlay_->translation_.z = 0.1; - overlay_->color = glm::vec4( 0.8f, 0.8f, 0.0f, 1.f); - overlay_->visible_ = false; - groups_[View::MIXING]->attach(overlay_); + overlays_[View::MIXING] = new Frame(Frame::ROUND_LARGE); + overlays_[View::MIXING]->translation_.z = 0.1; + overlays_[View::MIXING]->color = glm::vec4( 0.8f, 0.8f, 0.0f, 1.f); + overlays_[View::MIXING]->visible_ = false; + groups_[View::MIXING]->attach(overlays_[View::MIXING]); + // extra overlay for geometry view + overlays_[View::GEOMETRY] = new Frame(Frame::SHARP_HANDLES); + overlays_[View::GEOMETRY]->translation_.z = 0.1; + overlays_[View::GEOMETRY]->color = glm::vec4( 0.8f, 0.8f, 0.0f, 1.f); + overlays_[View::GEOMETRY]->visible_ = false; + groups_[View::GEOMETRY]->attach(overlays_[View::GEOMETRY]); } MediaSource::~MediaSource() @@ -179,13 +189,20 @@ void MediaSource::init() ImageShader *is = static_cast(surfacemix->shader()); if (is) is->stipple = 1.0; groups_[View::MIXING]->attach(surfacemix); + if (mediaplayer_->duration() == GST_CLOCK_TIME_NONE) + overlays_[View::MIXING]->overlay_ = new Mesh("mesh/icon_image.ply"); + else + overlays_[View::MIXING]->overlay_ = new Mesh("mesh/icon_video.ply"); // scale all mixing nodes to match aspect ratio of the media for (NodeSet::iterator node = groups_[View::MIXING]->begin(); node != groups_[View::MIXING]->end(); node++) { (*node)->scale_.x = mediaplayer_->aspectRatio(); } - + for (NodeSet::iterator node = groups_[View::GEOMETRY]->begin(); + node != groups_[View::GEOMETRY]->end(); node++) { + (*node)->scale_.x = mediaplayer_->aspectRatio(); + } // mixingshader_->mask = ImageShader::mask_presets["Halo"]; // done init once and for all diff --git a/Source.h b/Source.h index d07e28a..bccd976 100644 --- a/Source.h +++ b/Source.h @@ -80,7 +80,7 @@ protected: ImageShader *blendingshader_; // overlay to be displayed on top of source - Frame *overlay_; + std::map overlays_; }; // TODO : source set sorted by shader diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index 1a6e160..5e42570 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -306,10 +306,8 @@ void UserInterface::handleMouse() { // drag current source Mixer::manager().currentView()->grab( mouseclic[ImGuiMouseButton_Left], mousepos, current); - } else { - // Log::Info("Mouse drag (%.1f,%.1f)(%.1f,%.1f)", io.MouseClickedPos[0].x, io.MouseClickedPos[0].y, io.MousePos.x, io.MousePos.y); // Selection area ImGui::GetBackgroundDrawList()->AddRect(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos, @@ -318,9 +316,9 @@ void UserInterface::handleMouse() ImGui::GetColorU32(ImGuiCol_ResizeGripHovered, 0.3f)); } } - else if ( ImGui::IsMouseDown(ImGuiMouseButton_Left)) { + else if ( ImGui::IsMouseDown(ImGuiMouseButton_Left) ) { - // get coordinate in world view of mouse cursor + // get coordinate in world coordinate of mouse cursor glm::vec3 point = Rendering::manager().unProject(mousepos); // picking visitor traverses the scene @@ -331,7 +329,7 @@ void UserInterface::handleMouse() if (pv.picked().empty()) Mixer::manager().unsetCurrentSource(); else - Mixer::manager().setCurrentSource(pv.picked().back()); + Mixer::manager().setCurrentSource(pv.picked().back().first); } else if ( ImGui::IsMouseReleased(ImGuiMouseButton_Left) ) diff --git a/View.cpp b/View.cpp index faf85e9..8b0619a 100644 --- a/View.cpp +++ b/View.cpp @@ -11,6 +11,7 @@ #include "View.h" #include "Source.h" #include "Primitives.h" +#include "PickingVisitor.h" #include "Resource.h" #include "Mesh.h" #include "Mixer.h" @@ -69,7 +70,6 @@ MixingView::MixingView() : View(MIXING) MixingView::~MixingView() { - // TODO : verify that scene is deleted, and all children with it } @@ -123,7 +123,7 @@ void MixingView::grab (glm::vec2 from, glm::vec2 to, Source *s) // unproject glm::vec3 gl_Position_from = Rendering::manager().unProject(from, scene.root()->transform_); - glm::vec3 gl_Position_to = Rendering::manager().unProject(to, scene.root()->transform_); + glm::vec3 gl_Position_to = Rendering::manager().unProject(to, scene.root()->transform_); // compute delta translation sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; @@ -238,7 +238,6 @@ GeometryView::GeometryView() : View(GEOMETRY) GeometryView::~GeometryView() { - // TODO : verify that scene is deleted, and all children with it } @@ -291,19 +290,69 @@ void GeometryView::grab (glm::vec2 from, glm::vec2 to, Source *s) Group *sourceNode = s->group(View::GEOMETRY); static glm::vec3 start_translation = glm::vec3(0.f); + static glm::vec3 start_scale = glm::vec3(0.f); static glm::vec2 start_position = glm::vec2(0.f); + if ( start_position != from ) { start_position = from; start_translation = sourceNode->translation_; + start_scale = sourceNode->scale_; } - // unproject + // unproject in scene coordinates glm::vec3 gl_Position_from = Rendering::manager().unProject(from, scene.root()->transform_); glm::vec3 gl_Position_to = Rendering::manager().unProject(to, scene.root()->transform_); - // compute delta translation - sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; + // coordinate in source + glm::mat4 modelview; + glm::vec2 clicpos(0.f); + PickingVisitor pv(gl_Position_to); + sourceNode->accept(pv); + if (!pv.picked().empty()){ + clicpos = pv.picked().back().second; + modelview = pv.picked().back().first->transform_; +// Log::Info("clic pos source %.2f. %.2f", clicpos.x, clicpos.y); + } + +// glm::vec4 P = glm::inverse(sourceNode->transform_ * modelview) * glm::vec4( gl_Position_to, 1.f ); + + + if ( ABS(clicpos.x)>0.9f && ABS(clicpos.y)>0.9f ) + { + // clic inside corner + Log::Info("corner %.2f. %.2f", clicpos.x, clicpos.y); +// Log::Info(" %.2f. %.2f", P.x, P.y); + +// glm::vec2 topos = clicpos; +// PickingVisitor pv(gl_Position_from); +// sourceNode->accept(pv); + +// if (!pv.picked().empty()){ +// topos = pv.picked().back().second; +//// Log::Info("scale %.2f. %.2f", topos.x, topos.y); +// } + + glm::vec4 P = glm::inverse(sourceNode->transform_ * modelview) * glm::vec4( gl_Position_from, 1.f ); + + + sourceNode->scale_ = start_scale * (glm::vec3(clicpos, 1.f) / glm::vec3(P) ); + Log::Info("scale %.2f. %.2f", sourceNode->scale_.x, sourceNode->scale_.y); + Log::Info(" %.2f. %.2f", start_scale.x, start_scale.y); + } + else if ( ABS(clicpos.x)>0.95f && ABS(clicpos.y)<0.05f ) + { + // clic resize horizontal + Log::Info("H resize %.2f. %.2f", clicpos.x, clicpos.y); + } + else if ( ABS(clicpos.x)<0.05f && ABS(clicpos.y)>0.95f ) + { + // clic resize vertical + Log::Info("V resize %.2f. %.2f", clicpos.x, clicpos.y); + } + else + // clic inside source: compute delta translation + sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; } diff --git a/rsc/mesh/icon_image.ply b/rsc/mesh/icon_image.ply index 5d7d9b7..819b6b2 100644 --- a/rsc/mesh/icon_image.ply +++ b/rsc/mesh/icon_image.ply @@ -12,67 +12,67 @@ property uchar alpha element face 57 property list uchar uint vertex_indices end_header -0.640531 -0.899390 0.000000 255 255 255 255 -0.662011 -0.727588 0.000000 255 255 255 255 -0.640531 -0.706113 0.000000 255 255 255 255 -0.898289 -0.706113 0.000000 255 255 255 255 -0.876809 -0.727588 0.000000 255 255 255 255 -0.898289 -0.899390 0.000000 255 255 255 255 -0.662011 -0.877915 0.000000 255 255 255 255 -0.876809 -0.877915 0.000000 255 255 255 255 -0.708155 -0.749211 0.000000 255 255 255 255 -0.712525 -0.749211 0.000000 255 255 255 255 -0.710340 -0.749063 0.000000 255 255 255 255 -0.714621 -0.749639 0.000000 255 255 255 255 -0.706059 -0.749639 0.000000 255 255 255 255 -0.716609 -0.750330 0.000000 255 255 255 255 -0.704072 -0.750330 0.000000 255 255 255 255 -0.718469 -0.751263 0.000000 255 255 255 255 -0.702211 -0.751263 0.000000 255 255 255 255 -0.720183 -0.752421 0.000000 255 255 255 255 -0.700498 -0.752421 0.000000 255 255 255 255 -0.721730 -0.753783 0.000000 255 255 255 255 -0.698951 -0.753783 0.000000 255 255 255 255 -0.723092 -0.755330 0.000000 255 255 255 255 -0.697589 -0.755330 0.000000 255 255 255 255 -0.724250 -0.757043 0.000000 255 255 255 255 -0.696431 -0.757043 0.000000 255 255 255 255 -0.725183 -0.758902 0.000000 255 255 255 255 -0.695497 -0.758902 0.000000 255 255 255 255 -0.725874 -0.760890 0.000000 255 255 255 255 -0.694806 -0.760890 0.000000 255 255 255 255 -0.726303 -0.762985 0.000000 255 255 255 255 -0.694378 -0.762985 0.000000 255 255 255 255 -0.726450 -0.765170 0.000000 255 255 255 255 -0.694230 -0.765170 0.000000 255 255 255 255 -0.694378 -0.767357 0.000000 255 255 255 255 -0.726303 -0.767357 0.000000 255 255 255 255 -0.694806 -0.769454 0.000000 255 255 255 255 -0.725874 -0.769454 0.000000 255 255 255 255 -0.695497 -0.771442 0.000000 255 255 255 255 -0.725183 -0.771442 0.000000 255 255 255 255 -0.763836 -0.813489 0.000000 255 255 255 255 -0.844589 -0.856440 0.000000 255 255 255 255 -0.790890 -0.770539 0.000000 255 255 255 255 -0.696431 -0.773302 0.000000 255 255 255 255 -0.724250 -0.773302 0.000000 255 255 255 255 -0.697589 -0.775015 0.000000 255 255 255 255 -0.723092 -0.775015 0.000000 255 255 255 255 -0.698951 -0.776561 0.000000 255 255 255 255 -0.721730 -0.776561 0.000000 255 255 255 255 -0.700498 -0.777922 0.000000 255 255 255 255 -0.720183 -0.777922 0.000000 255 255 255 255 -0.702211 -0.779079 0.000000 255 255 255 255 -0.718469 -0.779079 0.000000 255 255 255 255 -0.704072 -0.780011 0.000000 255 255 255 255 -0.716609 -0.780011 0.000000 255 255 255 255 -0.706059 -0.780701 0.000000 255 255 255 255 -0.714621 -0.780701 0.000000 255 255 255 255 -0.708155 -0.781129 0.000000 255 255 255 255 -0.712525 -0.781129 0.000000 255 255 255 255 -0.710340 -0.781276 0.000000 255 255 255 255 -0.694230 -0.856440 0.000000 255 255 255 255 -0.737190 -0.792443 0.000000 255 255 255 255 +-0.124093 1.079884 0.000000 255 255 255 255 +-0.103797 1.242214 0.000000 255 255 255 255 +-0.124093 1.262506 0.000000 255 255 255 255 +0.119454 1.262506 0.000000 255 255 255 255 +0.099159 1.242214 0.000000 255 255 255 255 +0.119454 1.079884 0.000000 255 255 255 255 +-0.103797 1.100175 0.000000 255 255 255 255 +0.099159 1.100175 0.000000 255 255 255 255 +-0.060197 1.221784 0.000000 255 255 255 255 +-0.056067 1.221784 0.000000 255 255 255 255 +-0.058132 1.221923 0.000000 255 255 255 255 +-0.054087 1.221379 0.000000 255 255 255 255 +-0.062177 1.221379 0.000000 255 255 255 255 +-0.052209 1.220727 0.000000 255 255 255 255 +-0.064055 1.220727 0.000000 255 255 255 255 +-0.050451 1.219844 0.000000 255 255 255 255 +-0.065813 1.219844 0.000000 255 255 255 255 +-0.048832 1.218751 0.000000 255 255 255 255 +-0.067432 1.218751 0.000000 255 255 255 255 +-0.047370 1.217464 0.000000 255 255 255 255 +-0.068894 1.217464 0.000000 255 255 255 255 +-0.046083 1.216002 0.000000 255 255 255 255 +-0.070181 1.216002 0.000000 255 255 255 255 +-0.044989 1.214384 0.000000 255 255 255 255 +-0.071274 1.214384 0.000000 255 255 255 255 +-0.044107 1.212627 0.000000 255 255 255 255 +-0.072157 1.212627 0.000000 255 255 255 255 +-0.043454 1.210749 0.000000 255 255 255 255 +-0.072810 1.210749 0.000000 255 255 255 255 +-0.043049 1.208769 0.000000 255 255 255 255 +-0.073215 1.208769 0.000000 255 255 255 255 +-0.042910 1.206705 0.000000 255 255 255 255 +-0.073354 1.206705 0.000000 255 255 255 255 +-0.073215 1.204638 0.000000 255 255 255 255 +-0.043049 1.204638 0.000000 255 255 255 255 +-0.072810 1.202657 0.000000 255 255 255 255 +-0.043454 1.202657 0.000000 255 255 255 255 +-0.072157 1.200779 0.000000 255 255 255 255 +-0.044107 1.200778 0.000000 255 255 255 255 +-0.007586 1.161049 0.000000 255 255 255 255 +0.068715 1.120467 0.000000 255 255 255 255 +0.017976 1.201632 0.000000 255 255 255 255 +-0.071274 1.199021 0.000000 255 255 255 255 +-0.044989 1.199021 0.000000 255 255 255 255 +-0.070181 1.197403 0.000000 255 255 255 255 +-0.046083 1.197403 0.000000 255 255 255 255 +-0.068894 1.195941 0.000000 255 255 255 255 +-0.047370 1.195941 0.000000 255 255 255 255 +-0.067432 1.194655 0.000000 255 255 255 255 +-0.048832 1.194655 0.000000 255 255 255 255 +-0.065813 1.193563 0.000000 255 255 255 255 +-0.050451 1.193563 0.000000 255 255 255 255 +-0.064055 1.192681 0.000000 255 255 255 255 +-0.052209 1.192681 0.000000 255 255 255 255 +-0.062177 1.192029 0.000000 255 255 255 255 +-0.054087 1.192029 0.000000 255 255 255 255 +-0.060197 1.191625 0.000000 255 255 255 255 +-0.056067 1.191625 0.000000 255 255 255 255 +-0.058132 1.191486 0.000000 255 255 255 255 +-0.073354 1.120467 0.000000 255 255 255 255 +-0.032763 1.180935 0.000000 255 255 255 255 3 0 1 2 3 1 3 2 3 1 4 3 diff --git a/rsc/mesh/icon_video.ply b/rsc/mesh/icon_video.ply index c6d9089..e9626da 100644 --- a/rsc/mesh/icon_video.ply +++ b/rsc/mesh/icon_video.ply @@ -12,70 +12,70 @@ property uchar alpha element face 80 property list uchar uint vertex_indices end_header -0.658177 -0.900641 0.000000 255 255 255 255 -0.678184 -0.680614 0.000000 255 255 255 255 -0.658177 -0.680614 0.000000 255 255 255 255 -0.678184 -0.700617 0.000000 255 255 255 255 -0.698190 -0.700617 0.000000 255 255 255 255 -0.718197 -0.680614 0.000000 255 255 255 255 -0.698190 -0.680614 0.000000 255 255 255 255 -0.718197 -0.720619 0.000000 255 255 255 255 -0.838237 -0.720619 0.000000 255 255 255 255 -0.858243 -0.680614 0.000000 255 255 255 255 -0.838237 -0.680614 0.000000 255 255 255 255 -0.858243 -0.700617 0.000000 255 255 255 255 -0.878250 -0.700617 0.000000 255 255 255 255 -0.898256 -0.680614 0.000000 255 255 255 255 -0.878250 -0.680614 0.000000 255 255 255 255 -0.898256 -0.900641 0.000000 255 255 255 255 -0.678184 -0.720619 0.000000 255 255 255 255 -0.858243 -0.720619 0.000000 255 255 255 255 -0.878250 -0.720619 0.000000 255 255 255 255 -0.678184 -0.740622 0.000000 255 255 255 255 -0.698190 -0.720619 0.000000 255 255 255 255 -0.698190 -0.740622 0.000000 255 255 255 255 -0.858243 -0.740622 0.000000 255 255 255 255 -0.878250 -0.740622 0.000000 255 255 255 255 -0.678184 -0.760624 0.000000 255 255 255 255 -0.718197 -0.750623 0.000000 255 255 255 255 -0.838237 -0.750623 0.000000 255 255 255 255 -0.878250 -0.760624 0.000000 255 255 255 255 -0.698190 -0.760624 0.000000 255 255 255 255 -0.718197 -0.830632 0.000000 255 255 255 255 -0.838237 -0.830632 0.000000 255 255 255 255 -0.858243 -0.760624 0.000000 255 255 255 255 -0.678184 -0.780626 0.000000 255 255 255 255 -0.698190 -0.780626 0.000000 255 255 255 255 -0.858243 -0.780626 0.000000 255 255 255 255 -0.878250 -0.780626 0.000000 255 255 255 255 -0.678184 -0.800629 0.000000 255 255 255 255 -0.698190 -0.800629 0.000000 255 255 255 255 -0.858243 -0.800629 0.000000 255 255 255 255 -0.878250 -0.800629 0.000000 255 255 255 255 -0.678184 -0.820631 0.000000 255 255 255 255 -0.698190 -0.820631 0.000000 255 255 255 255 -0.858243 -0.820631 0.000000 255 255 255 255 -0.878250 -0.820631 0.000000 255 255 255 255 -0.678184 -0.840634 0.000000 255 255 255 255 -0.878250 -0.840634 0.000000 255 255 255 255 -0.678184 -0.860636 0.000000 255 255 255 255 -0.698190 -0.840634 0.000000 255 255 255 255 -0.698190 -0.860636 0.000000 255 255 255 255 -0.858243 -0.840634 0.000000 255 255 255 255 -0.858243 -0.860636 0.000000 255 255 255 255 -0.878250 -0.860636 0.000000 255 255 255 255 -0.678184 -0.880638 0.000000 255 255 255 255 -0.718197 -0.860636 0.000000 255 255 255 255 -0.698190 -0.880638 0.000000 255 255 255 255 -0.718197 -0.900641 0.000000 255 255 255 255 -0.838237 -0.860636 0.000000 255 255 255 255 -0.838237 -0.900641 0.000000 255 255 255 255 -0.858243 -0.880638 0.000000 255 255 255 255 -0.878250 -0.880638 0.000000 255 255 255 255 -0.678184 -0.900641 0.000000 255 255 255 255 -0.698190 -0.900641 0.000000 255 255 255 255 -0.858243 -0.900641 0.000000 255 255 255 255 -0.878250 -0.900641 0.000000 255 255 255 255 +-0.122371 1.059774 0.000000 255 255 255 255 +-0.102365 1.279800 0.000000 255 255 255 255 +-0.122371 1.279800 0.000000 255 255 255 255 +-0.102365 1.259798 0.000000 255 255 255 255 +-0.082358 1.259798 0.000000 255 255 255 255 +-0.062351 1.279800 0.000000 255 255 255 255 +-0.082358 1.279800 0.000000 255 255 255 255 +-0.062351 1.239795 0.000000 255 255 255 255 +0.057688 1.239795 0.000000 255 255 255 255 +0.077695 1.279800 0.000000 255 255 255 255 +0.057688 1.279800 0.000000 255 255 255 255 +0.077695 1.259798 0.000000 255 255 255 255 +0.097701 1.259798 0.000000 255 255 255 255 +0.117708 1.279800 0.000000 255 255 255 255 +0.097701 1.279800 0.000000 255 255 255 255 +0.117708 1.059774 0.000000 255 255 255 255 +-0.102365 1.239795 0.000000 255 255 255 255 +0.077695 1.239795 0.000000 255 255 255 255 +0.097701 1.239795 0.000000 255 255 255 255 +-0.102365 1.219793 0.000000 255 255 255 255 +-0.082358 1.239795 0.000000 255 255 255 255 +-0.082358 1.219793 0.000000 255 255 255 255 +0.077695 1.219793 0.000000 255 255 255 255 +0.097701 1.219793 0.000000 255 255 255 255 +-0.102365 1.199791 0.000000 255 255 255 255 +-0.062351 1.209792 0.000000 255 255 255 255 +0.057688 1.209792 0.000000 255 255 255 255 +0.097701 1.199791 0.000000 255 255 255 255 +-0.082358 1.199791 0.000000 255 255 255 255 +-0.062351 1.129782 0.000000 255 255 255 255 +0.057688 1.129782 0.000000 255 255 255 255 +0.077695 1.199791 0.000000 255 255 255 255 +-0.102365 1.179788 0.000000 255 255 255 255 +-0.082358 1.179788 0.000000 255 255 255 255 +0.077695 1.179788 0.000000 255 255 255 255 +0.097701 1.179788 0.000000 255 255 255 255 +-0.102365 1.159786 0.000000 255 255 255 255 +-0.082358 1.159786 0.000000 255 255 255 255 +0.077695 1.159786 0.000000 255 255 255 255 +0.097701 1.159786 0.000000 255 255 255 255 +-0.102365 1.139784 0.000000 255 255 255 255 +-0.082358 1.139784 0.000000 255 255 255 255 +0.077695 1.139784 0.000000 255 255 255 255 +0.097701 1.139784 0.000000 255 255 255 255 +-0.102365 1.119781 0.000000 255 255 255 255 +0.097701 1.119781 0.000000 255 255 255 255 +-0.102365 1.099779 0.000000 255 255 255 255 +-0.082358 1.119781 0.000000 255 255 255 255 +-0.082358 1.099779 0.000000 255 255 255 255 +0.077695 1.119781 0.000000 255 255 255 255 +0.077695 1.099779 0.000000 255 255 255 255 +0.097701 1.099779 0.000000 255 255 255 255 +-0.102365 1.079776 0.000000 255 255 255 255 +-0.062351 1.099779 0.000000 255 255 255 255 +-0.082358 1.079776 0.000000 255 255 255 255 +-0.062351 1.059774 0.000000 255 255 255 255 +0.057688 1.099779 0.000000 255 255 255 255 +0.057688 1.059774 0.000000 255 255 255 255 +0.077695 1.079776 0.000000 255 255 255 255 +0.097701 1.079776 0.000000 255 255 255 255 +-0.102365 1.059774 0.000000 255 255 255 255 +-0.082358 1.059774 0.000000 255 255 255 255 +0.077695 1.059774 0.000000 255 255 255 255 +0.097701 1.059774 0.000000 255 255 255 255 3 0 1 2 3 0 3 1 3 4 5 6