Work-in progress scaling of sources in geometry view

This commit is contained in:
brunoherbelin
2020-05-14 17:52:33 +02:00
parent 0e1cbd33f2
commit a0d9b81620
12 changed files with 237 additions and 159 deletions

View File

@@ -265,6 +265,8 @@ set(VMIX_RSC_FILES
./rsc/mesh/border_round.ply ./rsc/mesh/border_round.ply
./rsc/mesh/border_sharp.ply ./rsc/mesh/border_sharp.ply
./rsc/mesh/border_large_round.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_large_sharp.ply
./rsc/mesh/border_vertical_overlay.ply ./rsc/mesh/border_vertical_overlay.ply
./rsc/mesh/circle.ply ./rsc/mesh/circle.ply

View File

@@ -225,6 +225,10 @@ void MediaPlayer::close()
GstClockTime MediaPlayer::duration() GstClockTime MediaPlayer::duration()
{ {
// cannot play an image
if (isimage_)
return GST_CLOCK_TIME_NONE;
if (duration_ == GST_CLOCK_TIME_NONE && pipeline_ != nullptr) { if (duration_ == GST_CLOCK_TIME_NONE && pipeline_ != nullptr) {
gint64 d = GST_CLOCK_TIME_NONE; gint64 d = GST_CLOCK_TIME_NONE;
if ( gst_element_query_duration(pipeline_, GST_FORMAT_TIME, &d) ) if ( gst_element_query_duration(pipeline_, GST_FORMAT_TIME, &d) )

View File

@@ -377,24 +377,28 @@ void Mesh::accept(Visitor& v)
Frame::Frame(Style style) : Node() Frame::Frame(Style style) : Node()
{ {
overlay_ = nullptr;
shadow_ = nullptr;
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
switch (style) { switch (style) {
case SHARP_LARGE: case SHARP_HANDLES:
border_ = new Mesh("mesh/border_large_sharp.ply"); 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; break;
case SHARP_THIN: case SHARP_THIN:
border_ = new Mesh("mesh/border_sharp.ply"); border_ = new Mesh("mesh/border_sharp.ply");
break; break;
case ROUND_LARGE: case ROUND_LARGE:
border_ = new Mesh("mesh/border_large_round.ply"); border_ = new Mesh("mesh/border_large_round.ply");
shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png");
break; break;
default: default:
case ROUND_THIN: case ROUND_THIN:
border_ = new Mesh("mesh/border_round.ply"); border_ = new Mesh("mesh/border_round.ply");
shadow_ = new Mesh("mesh/shadow.ply", "images/shadow.png");
break; 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() 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.. if ( visible_ ) { // not absolutely necessary but saves some CPU time..
// shadow // shadow
shadow_->draw( modelview * transform_, projection); if(shadow_)
shadow_->draw( modelview * transform_, projection);
if (overlay_) { if (overlay_) {
// overlat is not altered // overlat is not altered

2
Mesh.h
View File

@@ -41,7 +41,7 @@ class Frame : public Node
public: 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(Style style);
~Frame(); ~Frame();

View File

@@ -19,7 +19,7 @@ void PickingVisitor::visit(Node &n)
{ {
modelview_ *= n.transform_; 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("Node %d", n.id());
// Log::Info("%s", glm::to_string(modelview_).c_str()); // 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 is inside [LL UR] rectangle:
if ( P.x > LL.x && P.x < UR.x && P.y > LL.y && P.y < UR.y ) if ( P.x > LL.x && P.x < UR.x && P.y > LL.y && P.y < UR.y )
// add this surface to the nodes picked // add this surface to the nodes picked
nodes_.push_back(&n); nodes_.push_back( std::pair(&n, glm::vec2(P)) );
} }
void PickingVisitor::visit(LineSquare &) void PickingVisitor::visit(LineSquare &)
@@ -89,7 +89,7 @@ void PickingVisitor::visit(LineCircle &n)
float r = glm::length( glm::vec2(P) ); float r = glm::length( glm::vec2(P) );
if ( r < 1.02 && r > 0.98) 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) void PickingVisitor::visit(Scene &n)

View File

@@ -3,6 +3,7 @@
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <vector> #include <vector>
#include <utility>
#include "Visitor.h" #include "Visitor.h"
@@ -10,11 +11,13 @@ class PickingVisitor: public Visitor
{ {
glm::vec2 point_; glm::vec2 point_;
glm::mat4 modelview_; glm::mat4 modelview_;
std::vector<Node *> nodes_; std::vector< std::pair<Node *, glm::vec2> > nodes_;
public: public:
PickingVisitor(glm::vec2 coordinates); PickingVisitor(glm::vec2 coordinates);
std::vector<Node *> picked() { return nodes_; } std::vector< std::pair<Node *, glm::vec2> > picked() { return nodes_; }
// Elements of Scene // Elements of Scene
void visit(Scene& n); void visit(Scene& n);

View File

@@ -33,13 +33,16 @@ Source::Source(const std::string &name) : name_(name), initialized_(false)
// default geometry nodes // default geometry nodes
groups_[View::GEOMETRY] = new Group; 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 // will be associated to nodes later
blendingshader_ = new ImageShader; blendingshader_ = new ImageShader;
rendershader_ = new ImageProcessingShader; rendershader_ = new ImageProcessingShader;
renderbuffer_ = nullptr; renderbuffer_ = nullptr;
rendersurface_ = nullptr; rendersurface_ = nullptr;
overlay_ = nullptr;
} }
Source::~Source() Source::~Source()
@@ -73,8 +76,10 @@ void Source::accept(Visitor& v)
void Source::setOverlayVisible(bool on) void Source::setOverlayVisible(bool on)
{ {
if (overlay_) // if (overlay_)
overlay_->visible_ = on; // overlay_->visible_ = on;
for (auto o = overlays_.begin(); o != overlays_.end(); o++)
(*o).second->visible_ = on;
} }
bool hasNode::operator()(const Source* elem) const bool hasNode::operator()(const Source* elem) const
@@ -107,13 +112,18 @@ MediaSource::MediaSource(const std::string &name) : Source(name), path_("")
mediasurface_ = new Surface(rendershader_); mediasurface_ = new Surface(rendershader_);
// extra overlay for mixing view // extra overlay for mixing view
overlay_ = new Frame(Frame::ROUND_LARGE); overlays_[View::MIXING] = new Frame(Frame::ROUND_LARGE);
overlay_->overlay_ = new Mesh("mesh/icon_video.ply"); overlays_[View::MIXING]->translation_.z = 0.1;
overlay_->translation_.z = 0.1; overlays_[View::MIXING]->color = glm::vec4( 0.8f, 0.8f, 0.0f, 1.f);
overlay_->color = glm::vec4( 0.8f, 0.8f, 0.0f, 1.f); overlays_[View::MIXING]->visible_ = false;
overlay_->visible_ = false; groups_[View::MIXING]->attach(overlays_[View::MIXING]);
groups_[View::MIXING]->attach(overlay_);
// 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() MediaSource::~MediaSource()
@@ -179,13 +189,20 @@ void MediaSource::init()
ImageShader *is = static_cast<ImageShader *>(surfacemix->shader()); ImageShader *is = static_cast<ImageShader *>(surfacemix->shader());
if (is) is->stipple = 1.0; if (is) is->stipple = 1.0;
groups_[View::MIXING]->attach(surfacemix); 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 // scale all mixing nodes to match aspect ratio of the media
for (NodeSet::iterator node = groups_[View::MIXING]->begin(); for (NodeSet::iterator node = groups_[View::MIXING]->begin();
node != groups_[View::MIXING]->end(); node++) { node != groups_[View::MIXING]->end(); node++) {
(*node)->scale_.x = mediaplayer_->aspectRatio(); (*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"]; // mixingshader_->mask = ImageShader::mask_presets["Halo"];
// done init once and for all // done init once and for all

View File

@@ -80,7 +80,7 @@ protected:
ImageShader *blendingshader_; ImageShader *blendingshader_;
// overlay to be displayed on top of source // overlay to be displayed on top of source
Frame *overlay_; std::map<View::Mode, Frame*> overlays_;
}; };
// TODO : source set sorted by shader // TODO : source set sorted by shader

View File

@@ -306,10 +306,8 @@ void UserInterface::handleMouse()
{ {
// drag current source // drag current source
Mixer::manager().currentView()->grab( mouseclic[ImGuiMouseButton_Left], mousepos, current); Mixer::manager().currentView()->grab( mouseclic[ImGuiMouseButton_Left], mousepos, current);
} }
else { else {
// Log::Info("Mouse drag (%.1f,%.1f)(%.1f,%.1f)", io.MouseClickedPos[0].x, io.MouseClickedPos[0].y, io.MousePos.x, io.MousePos.y); // Log::Info("Mouse drag (%.1f,%.1f)(%.1f,%.1f)", io.MouseClickedPos[0].x, io.MouseClickedPos[0].y, io.MousePos.x, io.MousePos.y);
// Selection area // Selection area
ImGui::GetBackgroundDrawList()->AddRect(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos, ImGui::GetBackgroundDrawList()->AddRect(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos,
@@ -318,9 +316,9 @@ void UserInterface::handleMouse()
ImGui::GetColorU32(ImGuiCol_ResizeGripHovered, 0.3f)); 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); glm::vec3 point = Rendering::manager().unProject(mousepos);
// picking visitor traverses the scene // picking visitor traverses the scene
@@ -331,7 +329,7 @@ void UserInterface::handleMouse()
if (pv.picked().empty()) if (pv.picked().empty())
Mixer::manager().unsetCurrentSource(); Mixer::manager().unsetCurrentSource();
else else
Mixer::manager().setCurrentSource(pv.picked().back()); Mixer::manager().setCurrentSource(pv.picked().back().first);
} }
else if ( ImGui::IsMouseReleased(ImGuiMouseButton_Left) ) else if ( ImGui::IsMouseReleased(ImGuiMouseButton_Left) )

View File

@@ -11,6 +11,7 @@
#include "View.h" #include "View.h"
#include "Source.h" #include "Source.h"
#include "Primitives.h" #include "Primitives.h"
#include "PickingVisitor.h"
#include "Resource.h" #include "Resource.h"
#include "Mesh.h" #include "Mesh.h"
#include "Mixer.h" #include "Mixer.h"
@@ -69,7 +70,6 @@ MixingView::MixingView() : View(MIXING)
MixingView::~MixingView() 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 // unproject
glm::vec3 gl_Position_from = Rendering::manager().unProject(from, scene.root()->transform_); 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 // compute delta translation
sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from;
@@ -238,7 +238,6 @@ GeometryView::GeometryView() : View(GEOMETRY)
GeometryView::~GeometryView() 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); Group *sourceNode = s->group(View::GEOMETRY);
static glm::vec3 start_translation = glm::vec3(0.f); 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); static glm::vec2 start_position = glm::vec2(0.f);
if ( start_position != from ) { if ( start_position != from ) {
start_position = from; start_position = from;
start_translation = sourceNode->translation_; 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_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 // coordinate in source
sourceNode->translation_ = start_translation + gl_Position_to - gl_Position_from; 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;
} }

View File

@@ -12,67 +12,67 @@ property uchar alpha
element face 57 element face 57
property list uchar uint vertex_indices property list uchar uint vertex_indices
end_header end_header
0.640531 -0.899390 0.000000 255 255 255 255 -0.124093 1.079884 0.000000 255 255 255 255
0.662011 -0.727588 0.000000 255 255 255 255 -0.103797 1.242214 0.000000 255 255 255 255
0.640531 -0.706113 0.000000 255 255 255 255 -0.124093 1.262506 0.000000 255 255 255 255
0.898289 -0.706113 0.000000 255 255 255 255 0.119454 1.262506 0.000000 255 255 255 255
0.876809 -0.727588 0.000000 255 255 255 255 0.099159 1.242214 0.000000 255 255 255 255
0.898289 -0.899390 0.000000 255 255 255 255 0.119454 1.079884 0.000000 255 255 255 255
0.662011 -0.877915 0.000000 255 255 255 255 -0.103797 1.100175 0.000000 255 255 255 255
0.876809 -0.877915 0.000000 255 255 255 255 0.099159 1.100175 0.000000 255 255 255 255
0.708155 -0.749211 0.000000 255 255 255 255 -0.060197 1.221784 0.000000 255 255 255 255
0.712525 -0.749211 0.000000 255 255 255 255 -0.056067 1.221784 0.000000 255 255 255 255
0.710340 -0.749063 0.000000 255 255 255 255 -0.058132 1.221923 0.000000 255 255 255 255
0.714621 -0.749639 0.000000 255 255 255 255 -0.054087 1.221379 0.000000 255 255 255 255
0.706059 -0.749639 0.000000 255 255 255 255 -0.062177 1.221379 0.000000 255 255 255 255
0.716609 -0.750330 0.000000 255 255 255 255 -0.052209 1.220727 0.000000 255 255 255 255
0.704072 -0.750330 0.000000 255 255 255 255 -0.064055 1.220727 0.000000 255 255 255 255
0.718469 -0.751263 0.000000 255 255 255 255 -0.050451 1.219844 0.000000 255 255 255 255
0.702211 -0.751263 0.000000 255 255 255 255 -0.065813 1.219844 0.000000 255 255 255 255
0.720183 -0.752421 0.000000 255 255 255 255 -0.048832 1.218751 0.000000 255 255 255 255
0.700498 -0.752421 0.000000 255 255 255 255 -0.067432 1.218751 0.000000 255 255 255 255
0.721730 -0.753783 0.000000 255 255 255 255 -0.047370 1.217464 0.000000 255 255 255 255
0.698951 -0.753783 0.000000 255 255 255 255 -0.068894 1.217464 0.000000 255 255 255 255
0.723092 -0.755330 0.000000 255 255 255 255 -0.046083 1.216002 0.000000 255 255 255 255
0.697589 -0.755330 0.000000 255 255 255 255 -0.070181 1.216002 0.000000 255 255 255 255
0.724250 -0.757043 0.000000 255 255 255 255 -0.044989 1.214384 0.000000 255 255 255 255
0.696431 -0.757043 0.000000 255 255 255 255 -0.071274 1.214384 0.000000 255 255 255 255
0.725183 -0.758902 0.000000 255 255 255 255 -0.044107 1.212627 0.000000 255 255 255 255
0.695497 -0.758902 0.000000 255 255 255 255 -0.072157 1.212627 0.000000 255 255 255 255
0.725874 -0.760890 0.000000 255 255 255 255 -0.043454 1.210749 0.000000 255 255 255 255
0.694806 -0.760890 0.000000 255 255 255 255 -0.072810 1.210749 0.000000 255 255 255 255
0.726303 -0.762985 0.000000 255 255 255 255 -0.043049 1.208769 0.000000 255 255 255 255
0.694378 -0.762985 0.000000 255 255 255 255 -0.073215 1.208769 0.000000 255 255 255 255
0.726450 -0.765170 0.000000 255 255 255 255 -0.042910 1.206705 0.000000 255 255 255 255
0.694230 -0.765170 0.000000 255 255 255 255 -0.073354 1.206705 0.000000 255 255 255 255
0.694378 -0.767357 0.000000 255 255 255 255 -0.073215 1.204638 0.000000 255 255 255 255
0.726303 -0.767357 0.000000 255 255 255 255 -0.043049 1.204638 0.000000 255 255 255 255
0.694806 -0.769454 0.000000 255 255 255 255 -0.072810 1.202657 0.000000 255 255 255 255
0.725874 -0.769454 0.000000 255 255 255 255 -0.043454 1.202657 0.000000 255 255 255 255
0.695497 -0.771442 0.000000 255 255 255 255 -0.072157 1.200779 0.000000 255 255 255 255
0.725183 -0.771442 0.000000 255 255 255 255 -0.044107 1.200778 0.000000 255 255 255 255
0.763836 -0.813489 0.000000 255 255 255 255 -0.007586 1.161049 0.000000 255 255 255 255
0.844589 -0.856440 0.000000 255 255 255 255 0.068715 1.120467 0.000000 255 255 255 255
0.790890 -0.770539 0.000000 255 255 255 255 0.017976 1.201632 0.000000 255 255 255 255
0.696431 -0.773302 0.000000 255 255 255 255 -0.071274 1.199021 0.000000 255 255 255 255
0.724250 -0.773302 0.000000 255 255 255 255 -0.044989 1.199021 0.000000 255 255 255 255
0.697589 -0.775015 0.000000 255 255 255 255 -0.070181 1.197403 0.000000 255 255 255 255
0.723092 -0.775015 0.000000 255 255 255 255 -0.046083 1.197403 0.000000 255 255 255 255
0.698951 -0.776561 0.000000 255 255 255 255 -0.068894 1.195941 0.000000 255 255 255 255
0.721730 -0.776561 0.000000 255 255 255 255 -0.047370 1.195941 0.000000 255 255 255 255
0.700498 -0.777922 0.000000 255 255 255 255 -0.067432 1.194655 0.000000 255 255 255 255
0.720183 -0.777922 0.000000 255 255 255 255 -0.048832 1.194655 0.000000 255 255 255 255
0.702211 -0.779079 0.000000 255 255 255 255 -0.065813 1.193563 0.000000 255 255 255 255
0.718469 -0.779079 0.000000 255 255 255 255 -0.050451 1.193563 0.000000 255 255 255 255
0.704072 -0.780011 0.000000 255 255 255 255 -0.064055 1.192681 0.000000 255 255 255 255
0.716609 -0.780011 0.000000 255 255 255 255 -0.052209 1.192681 0.000000 255 255 255 255
0.706059 -0.780701 0.000000 255 255 255 255 -0.062177 1.192029 0.000000 255 255 255 255
0.714621 -0.780701 0.000000 255 255 255 255 -0.054087 1.192029 0.000000 255 255 255 255
0.708155 -0.781129 0.000000 255 255 255 255 -0.060197 1.191625 0.000000 255 255 255 255
0.712525 -0.781129 0.000000 255 255 255 255 -0.056067 1.191625 0.000000 255 255 255 255
0.710340 -0.781276 0.000000 255 255 255 255 -0.058132 1.191486 0.000000 255 255 255 255
0.694230 -0.856440 0.000000 255 255 255 255 -0.073354 1.120467 0.000000 255 255 255 255
0.737190 -0.792443 0.000000 255 255 255 255 -0.032763 1.180935 0.000000 255 255 255 255
3 0 1 2 3 0 1 2
3 1 3 2 3 1 3 2
3 1 4 3 3 1 4 3

View File

@@ -12,70 +12,70 @@ property uchar alpha
element face 80 element face 80
property list uchar uint vertex_indices property list uchar uint vertex_indices
end_header end_header
0.658177 -0.900641 0.000000 255 255 255 255 -0.122371 1.059774 0.000000 255 255 255 255
0.678184 -0.680614 0.000000 255 255 255 255 -0.102365 1.279800 0.000000 255 255 255 255
0.658177 -0.680614 0.000000 255 255 255 255 -0.122371 1.279800 0.000000 255 255 255 255
0.678184 -0.700617 0.000000 255 255 255 255 -0.102365 1.259798 0.000000 255 255 255 255
0.698190 -0.700617 0.000000 255 255 255 255 -0.082358 1.259798 0.000000 255 255 255 255
0.718197 -0.680614 0.000000 255 255 255 255 -0.062351 1.279800 0.000000 255 255 255 255
0.698190 -0.680614 0.000000 255 255 255 255 -0.082358 1.279800 0.000000 255 255 255 255
0.718197 -0.720619 0.000000 255 255 255 255 -0.062351 1.239795 0.000000 255 255 255 255
0.838237 -0.720619 0.000000 255 255 255 255 0.057688 1.239795 0.000000 255 255 255 255
0.858243 -0.680614 0.000000 255 255 255 255 0.077695 1.279800 0.000000 255 255 255 255
0.838237 -0.680614 0.000000 255 255 255 255 0.057688 1.279800 0.000000 255 255 255 255
0.858243 -0.700617 0.000000 255 255 255 255 0.077695 1.259798 0.000000 255 255 255 255
0.878250 -0.700617 0.000000 255 255 255 255 0.097701 1.259798 0.000000 255 255 255 255
0.898256 -0.680614 0.000000 255 255 255 255 0.117708 1.279800 0.000000 255 255 255 255
0.878250 -0.680614 0.000000 255 255 255 255 0.097701 1.279800 0.000000 255 255 255 255
0.898256 -0.900641 0.000000 255 255 255 255 0.117708 1.059774 0.000000 255 255 255 255
0.678184 -0.720619 0.000000 255 255 255 255 -0.102365 1.239795 0.000000 255 255 255 255
0.858243 -0.720619 0.000000 255 255 255 255 0.077695 1.239795 0.000000 255 255 255 255
0.878250 -0.720619 0.000000 255 255 255 255 0.097701 1.239795 0.000000 255 255 255 255
0.678184 -0.740622 0.000000 255 255 255 255 -0.102365 1.219793 0.000000 255 255 255 255
0.698190 -0.720619 0.000000 255 255 255 255 -0.082358 1.239795 0.000000 255 255 255 255
0.698190 -0.740622 0.000000 255 255 255 255 -0.082358 1.219793 0.000000 255 255 255 255
0.858243 -0.740622 0.000000 255 255 255 255 0.077695 1.219793 0.000000 255 255 255 255
0.878250 -0.740622 0.000000 255 255 255 255 0.097701 1.219793 0.000000 255 255 255 255
0.678184 -0.760624 0.000000 255 255 255 255 -0.102365 1.199791 0.000000 255 255 255 255
0.718197 -0.750623 0.000000 255 255 255 255 -0.062351 1.209792 0.000000 255 255 255 255
0.838237 -0.750623 0.000000 255 255 255 255 0.057688 1.209792 0.000000 255 255 255 255
0.878250 -0.760624 0.000000 255 255 255 255 0.097701 1.199791 0.000000 255 255 255 255
0.698190 -0.760624 0.000000 255 255 255 255 -0.082358 1.199791 0.000000 255 255 255 255
0.718197 -0.830632 0.000000 255 255 255 255 -0.062351 1.129782 0.000000 255 255 255 255
0.838237 -0.830632 0.000000 255 255 255 255 0.057688 1.129782 0.000000 255 255 255 255
0.858243 -0.760624 0.000000 255 255 255 255 0.077695 1.199791 0.000000 255 255 255 255
0.678184 -0.780626 0.000000 255 255 255 255 -0.102365 1.179788 0.000000 255 255 255 255
0.698190 -0.780626 0.000000 255 255 255 255 -0.082358 1.179788 0.000000 255 255 255 255
0.858243 -0.780626 0.000000 255 255 255 255 0.077695 1.179788 0.000000 255 255 255 255
0.878250 -0.780626 0.000000 255 255 255 255 0.097701 1.179788 0.000000 255 255 255 255
0.678184 -0.800629 0.000000 255 255 255 255 -0.102365 1.159786 0.000000 255 255 255 255
0.698190 -0.800629 0.000000 255 255 255 255 -0.082358 1.159786 0.000000 255 255 255 255
0.858243 -0.800629 0.000000 255 255 255 255 0.077695 1.159786 0.000000 255 255 255 255
0.878250 -0.800629 0.000000 255 255 255 255 0.097701 1.159786 0.000000 255 255 255 255
0.678184 -0.820631 0.000000 255 255 255 255 -0.102365 1.139784 0.000000 255 255 255 255
0.698190 -0.820631 0.000000 255 255 255 255 -0.082358 1.139784 0.000000 255 255 255 255
0.858243 -0.820631 0.000000 255 255 255 255 0.077695 1.139784 0.000000 255 255 255 255
0.878250 -0.820631 0.000000 255 255 255 255 0.097701 1.139784 0.000000 255 255 255 255
0.678184 -0.840634 0.000000 255 255 255 255 -0.102365 1.119781 0.000000 255 255 255 255
0.878250 -0.840634 0.000000 255 255 255 255 0.097701 1.119781 0.000000 255 255 255 255
0.678184 -0.860636 0.000000 255 255 255 255 -0.102365 1.099779 0.000000 255 255 255 255
0.698190 -0.840634 0.000000 255 255 255 255 -0.082358 1.119781 0.000000 255 255 255 255
0.698190 -0.860636 0.000000 255 255 255 255 -0.082358 1.099779 0.000000 255 255 255 255
0.858243 -0.840634 0.000000 255 255 255 255 0.077695 1.119781 0.000000 255 255 255 255
0.858243 -0.860636 0.000000 255 255 255 255 0.077695 1.099779 0.000000 255 255 255 255
0.878250 -0.860636 0.000000 255 255 255 255 0.097701 1.099779 0.000000 255 255 255 255
0.678184 -0.880638 0.000000 255 255 255 255 -0.102365 1.079776 0.000000 255 255 255 255
0.718197 -0.860636 0.000000 255 255 255 255 -0.062351 1.099779 0.000000 255 255 255 255
0.698190 -0.880638 0.000000 255 255 255 255 -0.082358 1.079776 0.000000 255 255 255 255
0.718197 -0.900641 0.000000 255 255 255 255 -0.062351 1.059774 0.000000 255 255 255 255
0.838237 -0.860636 0.000000 255 255 255 255 0.057688 1.099779 0.000000 255 255 255 255
0.838237 -0.900641 0.000000 255 255 255 255 0.057688 1.059774 0.000000 255 255 255 255
0.858243 -0.880638 0.000000 255 255 255 255 0.077695 1.079776 0.000000 255 255 255 255
0.878250 -0.880638 0.000000 255 255 255 255 0.097701 1.079776 0.000000 255 255 255 255
0.678184 -0.900641 0.000000 255 255 255 255 -0.102365 1.059774 0.000000 255 255 255 255
0.698190 -0.900641 0.000000 255 255 255 255 -0.082358 1.059774 0.000000 255 255 255 255
0.858243 -0.900641 0.000000 255 255 255 255 0.077695 1.059774 0.000000 255 255 255 255
0.878250 -0.900641 0.000000 255 255 255 255 0.097701 1.059774 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