Finalizing implementation of SrtReceiverSource

Added icons, unified UI, loading and saving in XML.
This commit is contained in:
Bruno Herbelin
2022-01-24 23:06:47 +01:00
parent 2ae0ef40d4
commit 9ed76ae4da
13 changed files with 696 additions and 14 deletions

View File

@@ -447,6 +447,7 @@ set(VMIX_RSC_FILES
./rsc/mesh/icon_vector_square_slash.ply ./rsc/mesh/icon_vector_square_slash.ply
./rsc/mesh/icon_cube.ply ./rsc/mesh/icon_cube.ply
./rsc/mesh/icon_sequence.ply ./rsc/mesh/icon_sequence.ply
./rsc/mesh/icon_receive.ply
./rsc/mesh/h_line.ply ./rsc/mesh/h_line.ply
./rsc/mesh/h_mark.ply ./rsc/mesh/h_mark.ply
) )

View File

@@ -441,10 +441,12 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
shadows[PATTERN]= shadow; shadows[PATTERN]= shadow;
icons[CAMERA] = new Mesh("mesh/icon_camera.ply"); icons[CAMERA] = new Mesh("mesh/icon_camera.ply");
shadows[CAMERA] = shadow; shadows[CAMERA] = shadow;
icons[CUBE] = new Mesh("mesh/icon_cube.ply"); icons[CUBE] = new Mesh("mesh/icon_cube.ply");
shadows[CUBE] = shadow; shadows[CUBE] = shadow;
icons[SHARE] = new Mesh("mesh/icon_share.ply"); icons[SHARE] = new Mesh("mesh/icon_share.ply");
shadows[SHARE] = shadow; shadows[SHARE] = shadow;
icons[RECEIVE] = new Mesh("mesh/icon_receive.ply");
shadows[RECEIVE]= shadow;
icons[DOTS] = new Mesh("mesh/icon_dots.ply"); icons[DOTS] = new Mesh("mesh/icon_dots.ply");
shadows[DOTS] = nullptr; shadows[DOTS] = nullptr;
icons[BUSY] = new Mesh("mesh/icon_circles.ply"); icons[BUSY] = new Mesh("mesh/icon_circles.ply");

View File

@@ -60,7 +60,7 @@ protected:
class Symbol : public Node class Symbol : public Node
{ {
public: public:
typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, SEQUENCE, VIDEO, SESSION, CLONE, RENDER, GROUP, PATTERN, CAMERA, CUBE, SHARE, typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, SEQUENCE, VIDEO, SESSION, CLONE, RENDER, GROUP, PATTERN, CAMERA, CUBE, SHARE, RECEIVE,
DOTS, BUSY, LOCK, UNLOCK, EYE, EYESLASH, VECTORSLASH, ARROWS, ROTATION, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type; DOTS, BUSY, LOCK, UNLOCK, EYE, EYESLASH, VECTORSLASH, ARROWS, ROTATION, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type;
Symbol(Type t, glm::vec3 pos = glm::vec3(0.f)); Symbol(Type t, glm::vec3 pos = glm::vec3(0.f));
~Symbol(); ~Symbol();

View File

@@ -32,6 +32,7 @@
#include "PatternSource.h" #include "PatternSource.h"
#include "DeviceSource.h" #include "DeviceSource.h"
#include "NetworkSource.h" #include "NetworkSource.h"
#include "SrtReceiverSource.h"
#include "MultiFileSource.h" #include "MultiFileSource.h"
#include "StreamSource.h" #include "StreamSource.h"
#include "RenderSource.h" #include "RenderSource.h"
@@ -352,6 +353,9 @@ void SessionLoader::load(XMLElement *sessionNode)
else if ( std::string(pType) == "GenericStreamSource") { else if ( std::string(pType) == "GenericStreamSource") {
load_source = new GenericStreamSource(id_xml_); load_source = new GenericStreamSource(id_xml_);
} }
else if ( std::string(pType) == "SrtReceiverSource") {
load_source = new SrtReceiverSource(id_xml_);
}
// skip failed (including clones) // skip failed (including clones)
if (!load_source) if (!load_source)
@@ -480,6 +484,9 @@ Source *SessionLoader::createSource(tinyxml2::XMLElement *sourceNode, Mode mode)
else if ( std::string(pType) == "GenericStreamSource") { else if ( std::string(pType) == "GenericStreamSource") {
load_source = new GenericStreamSource(id__); load_source = new GenericStreamSource(id__);
} }
else if ( std::string(pType) == "SrtReceiverSource") {
load_source = new SrtReceiverSource(id__);
}
else if ( std::string(pType) == "CloneSource") { else if ( std::string(pType) == "CloneSource") {
// clone from given origin // clone from given origin
XMLElement* originNode = xmlCurrent_->FirstChildElement("origin"); XMLElement* originNode = xmlCurrent_->FirstChildElement("origin");
@@ -1089,6 +1096,18 @@ void SessionLoader::visit (GenericStreamSource& s)
} }
} }
void SessionLoader::visit (SrtReceiverSource& s)
{
XMLElement* ip = xmlCurrent_->FirstChildElement("ip");
XMLElement* port = xmlCurrent_->FirstChildElement("port");
if (ip && port) {
const char * textip = ip->GetText();
const char * textport = port->GetText();
if (textip && textport)
s.setConnection(textip, textport);
}
}
void SessionLoader::visit (CloneSource& s) void SessionLoader::visit (CloneSource& s)
{ {

View File

@@ -61,6 +61,7 @@ public:
void visit (NetworkSource& s) override; void visit (NetworkSource& s) override;
void visit (MultiFileSource& s) override; void visit (MultiFileSource& s) override;
void visit (GenericStreamSource& s) override; void visit (GenericStreamSource& s) override;
void visit (SrtReceiverSource& s) override;
static void XMLToNode(const tinyxml2::XMLElement *xml, Node &n); static void XMLToNode(const tinyxml2::XMLElement *xml, Node &n);
static void XMLToSourcecore(tinyxml2::XMLElement *xml, SourceCore &s); static void XMLToSourcecore(tinyxml2::XMLElement *xml, SourceCore &s);

View File

@@ -36,6 +36,7 @@ using namespace tinyxml2;
#include "PatternSource.h" #include "PatternSource.h"
#include "DeviceSource.h" #include "DeviceSource.h"
#include "NetworkSource.h" #include "NetworkSource.h"
#include "SrtReceiverSource.h"
#include "MultiFileSource.h" #include "MultiFileSource.h"
#include "ImageShader.h" #include "ImageShader.h"
#include "ImageProcessingShader.h" #include "ImageProcessingShader.h"
@@ -725,6 +726,22 @@ void SessionVisitor::visit (GenericStreamSource& s)
xmlCurrent_->InsertEndChild(desc); xmlCurrent_->InsertEndChild(desc);
} }
void SessionVisitor::visit (SrtReceiverSource& s)
{
xmlCurrent_->SetAttribute("type", "SrtReceiverSource");
XMLElement *ip = xmlDoc_->NewElement("ip");
XMLText *iptext = xmlDoc_->NewText( s.ip().c_str() );
ip->InsertEndChild( iptext );
xmlCurrent_->InsertEndChild(ip);
XMLElement *port = xmlDoc_->NewElement("port");
XMLText *porttext = xmlDoc_->NewText( s.port().c_str() );
port->InsertEndChild( porttext );
xmlCurrent_->InsertEndChild(port);
}
std::string SessionVisitor::getClipboard(const SourceList &list) std::string SessionVisitor::getClipboard(const SourceList &list)
{ {
std::string x = ""; std::string x = "";

View File

@@ -67,6 +67,7 @@ public:
void visit (MixingGroup& s) override; void visit (MixingGroup& s) override;
void visit (MultiFileSource& s) override; void visit (MultiFileSource& s) override;
void visit (GenericStreamSource& s) override; void visit (GenericStreamSource& s) override;
void visit (SrtReceiverSource& s) override;
static tinyxml2::XMLElement *NodeToXML(const Node &n, tinyxml2::XMLDocument *doc); static tinyxml2::XMLElement *NodeToXML(const Node &n, tinyxml2::XMLDocument *doc);
static tinyxml2::XMLElement *ImageToXML(const FrameBufferImage *img, tinyxml2::XMLDocument *doc); static tinyxml2::XMLElement *ImageToXML(const FrameBufferImage *img, tinyxml2::XMLDocument *doc);

View File

@@ -24,7 +24,7 @@
#define ICON_SOURCE_RENDER 0, 2 #define ICON_SOURCE_RENDER 0, 2
#define ICON_SOURCE_CLONE 9, 2 #define ICON_SOURCE_CLONE 9, 2
#define ICON_SOURCE_GSTREAMER 16, 16 #define ICON_SOURCE_GSTREAMER 16, 16
#define ICON_SOURCE_SRT 14, 5 #define ICON_SOURCE_SRT 11, 8
#define ICON_SOURCE 13, 11 #define ICON_SOURCE 13, 11
class SourceCallback; class SourceCallback;

View File

@@ -11,7 +11,7 @@ SrtReceiverSource::SrtReceiverSource(uint64_t id) : StreamSource(id)
stream_ = new Stream; stream_ = new Stream;
// set symbol // set symbol
symbol_ = new Symbol(Symbol::SHARE, glm::vec3(0.75f, 0.75f, 0.01f)); symbol_ = new Symbol(Symbol::RECEIVE, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f; symbol_->scale_.y = 1.5f;
} }

View File

@@ -3792,7 +3792,7 @@ void OutputPreview::Render()
} }
// start broadcast (broadcaster does not exists) // start broadcast (broadcaster does not exists)
else { else {
if ( ImGui::MenuItem( ICON_FA_GLOBE " Broadcast") ) { if ( ImGui::MenuItem( ICON_FA_PODCAST " Broadcast") ) {
video_broadcaster_ = new VideoBroadcast(Settings::application.broadcast_port); video_broadcaster_ = new VideoBroadcast(Settings::application.broadcast_port);
FrameGrabbing::manager().add(video_broadcaster_); FrameGrabbing::manager().add(video_broadcaster_);
} }
@@ -3872,7 +3872,7 @@ void OutputPreview::Render()
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(IMGUI_COLOR_BROADCAST, 0.8f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(IMGUI_COLOR_BROADCAST, 0.8f));
else else
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(IMGUI_COLOR_BROADCAST, 0.4f)); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(IMGUI_COLOR_BROADCAST, 0.4f));
ImGui::Text(ICON_FA_GLOBE); ImGui::Text(ICON_FA_PODCAST);
ImGui::PopStyleColor(1); ImGui::PopStyleColor(1);
ImGui::PopFont(); ImGui::PopFont();
} }
@@ -3929,7 +3929,7 @@ void OutputPreview::Render()
Connection::manager().info().name.c_str(), Connection::manager().info().name.c_str(),
Streaming::manager().listStreams().size() ); Streaming::manager().listStreams().size() );
if (video_broadcaster_) if (video_broadcaster_)
ImGui::Text( " " ICON_FA_GLOBE " %s", video_broadcaster_->info().c_str() ); ImGui::Text( " " ICON_FA_PODCAST " %s", video_broadcaster_->info().c_str() );
} }
ImGui::End(); ImGui::End();
@@ -5107,7 +5107,7 @@ void Navigator::RenderNewPannel()
} }
} }
if ( ImGui::Selectable("Custom SRT") ) { if ( ImGui::Selectable("SRT Broadcaster") ) {
new_source_preview_.setSource(); new_source_preview_.setSource();
custom_connected = true; custom_connected = true;
} }
@@ -5120,11 +5120,12 @@ void Navigator::RenderNewPannel()
ImGuiToolkit::HelpToolTip("Create a source getting images from connected devices or machines;\n" ImGuiToolkit::HelpToolTip("Create a source getting images from connected devices or machines;\n"
ICON_FA_CARET_RIGHT " webcams or frame grabbers\n" ICON_FA_CARET_RIGHT " webcams or frame grabbers\n"
ICON_FA_CARET_RIGHT " screen capture\n" ICON_FA_CARET_RIGHT " screen capture\n"
ICON_FA_CARET_RIGHT " stream shared by vimix"); ICON_FA_CARET_RIGHT " stream shared by vimix on local network\n"
ICON_FA_CARET_RIGHT " SRT stream (e.g. broadcasted by vimix)");
if (custom_connected) { if (custom_connected) {
ImGui::Text("\nCustom network SRT stream:"); ImGui::Text("\nConnect to SRT broadcaster:");
ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);
ImGuiToolkit::InputText("IP", &Settings::application.custom_connect_ip, ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsDecimal); ImGuiToolkit::InputText("IP", &Settings::application.custom_connect_ip, ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsDecimal);
@@ -5141,7 +5142,7 @@ void Navigator::RenderNewPannel()
ImGui::InputText("##url", bufurl, IM_ARRAYSIZE(bufurl), ImGuiInputTextFlags_ReadOnly); ImGui::InputText("##url", bufurl, IM_ARRAYSIZE(bufurl), ImGuiInputTextFlags_ReadOnly);
ImGui::PopStyleColor(1); ImGui::PopStyleColor(1);
ImGui::SameLine(0); ImGuiToolkit::Indication("URL for connecting to a stream on Secure Reliable Transport (SRT) protocol", ICON_FA_GLOBE); ImGui::SameLine(0); ImGuiToolkit::Indication("URL for connecting to a stream on Secure Reliable Transport (SRT) protocol", ICON_SOURCE_SRT);
if ( ImGui::Button("Try to connect", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) { if ( ImGui::Button("Try to connect", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ) {
new_source_preview_.setSource( Mixer::manager().createSourceSrt(Settings::application.custom_connect_ip, Settings::application.custom_connect_port), bufurl); new_source_preview_.setSource( Mixer::manager().createSourceSrt(Settings::application.custom_connect_ip, Settings::application.custom_connect_port), bufurl);
@@ -5929,7 +5930,7 @@ void Navigator::RenderMainPannelSettings()
ImFormatString(msg, IM_ARRAYSIZE(msg),"Port for broadcasting on Secure Reliable Transport (SRT) protocol\n" ImFormatString(msg, IM_ARRAYSIZE(msg),"Port for broadcasting on Secure Reliable Transport (SRT) protocol\n"
"You can e.g. connect to:\n srt://%s:%d", "You can e.g. connect to:\n srt://%s:%d",
NetworkToolkit::host_ips()[1].c_str(), Settings::application.broadcast_port); NetworkToolkit::host_ips()[1].c_str(), Settings::application.broadcast_port);
ImGuiToolkit::Indication(msg, ICON_FA_GLOBE); ImGuiToolkit::Indication(msg, ICON_FA_PODCAST);
ImGui::SameLine(0); ImGui::SameLine(0);
ImGui::SetCursorPosX(-1.f * IMGUI_RIGHT_ALIGN); ImGui::SetCursorPosX(-1.f * IMGUI_RIGHT_ALIGN);
ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN); ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);

View File

@@ -188,7 +188,7 @@ std::string VideoBroadcast::info() const
if (!initialized_) if (!initialized_)
ret << "Starting"; ret << "Starting";
else if (active_) else if (active_)
ret << "Streaming SRT on Port " << port_; ret << "SRT Broadcast on Port " << port_;
else else
ret << "Terminated"; ret << "Terminated";

Binary file not shown.

640
rsc/mesh/icon_receive.ply Normal file
View File

@@ -0,0 +1,640 @@
ply
format ascii 1.0
comment Created by Blender 2.93.3 - www.blender.org
element vertex 322
property float x
property float y
property float z
property float nx
property float ny
property float nz
element face 305
property list uchar uint vertex_indices
end_header
-0.074302 -0.110441 0.000000 -0.000000 0.000000 1.000000
-0.046569 -0.091956 0.000000 -0.000000 0.000000 1.000000
-0.074302 -0.091956 0.000000 -0.000000 0.000000 1.000000
-0.046569 -0.110441 0.000000 0.000000 0.000000 1.000000
-0.009591 -0.091956 0.000000 -0.000000 0.000000 1.000000
0.008899 -0.005125 0.000000 -0.000000 0.000000 1.000000
-0.009591 -0.005125 0.000000 -0.000000 0.000000 1.000000
0.008899 -0.091956 0.000000 0.000000 0.000000 1.000000
-0.037324 -0.110441 0.000000 -0.000000 0.000000 1.000000
-0.037324 -0.091956 0.000000 -0.000000 0.000000 1.000000
0.036632 -0.091956 0.000000 -0.000000 0.000000 1.000000
0.036632 -0.110441 0.000000 0.000000 0.000000 1.000000
0.045877 -0.110441 0.000000 -0.000000 0.000000 1.000000
0.073610 -0.091956 0.000000 -0.000000 0.000000 1.000000
0.045877 -0.091956 0.000000 -0.000000 0.000000 1.000000
0.073610 -0.110441 0.000000 0.000000 0.000000 1.000000
-0.003960 0.043868 0.000000 0.000000 0.000000 1.000000
0.003268 0.043868 0.000000 0.000000 0.000000 1.000000
-0.000346 0.044111 0.000000 0.000000 0.000000 1.000000
-0.007427 0.043159 0.000000 0.000000 0.000000 1.000000
0.006735 0.043159 0.000000 0.000000 0.000000 1.000000
-0.010714 0.042018 0.000000 0.000000 0.000000 1.000000
0.010022 0.042018 0.000000 0.000000 0.000000 1.000000
-0.013790 0.040475 0.000000 0.000000 0.000000 1.000000
0.013098 0.040475 0.000000 0.000000 0.000000 1.000000
-0.016623 0.038562 0.000000 0.000000 0.000000 1.000000
0.015931 0.038562 0.000000 0.000000 0.000000 1.000000
-0.019181 0.036311 0.000000 0.000000 0.000000 1.000000
0.018489 0.036311 0.000000 0.000000 0.000000 1.000000
-0.021432 0.033753 0.000000 0.000000 0.000000 1.000000
0.020740 0.033753 0.000000 0.000000 0.000000 1.000000
-0.023346 0.030921 0.000000 0.000000 0.000000 1.000000
0.022654 0.030921 0.000000 0.000000 0.000000 1.000000
-0.024889 0.027846 0.000000 0.000000 0.000000 1.000000
0.024197 0.027846 0.000000 0.000000 0.000000 1.000000
-0.026031 0.024560 0.000000 0.000000 0.000000 1.000000
0.025339 0.024560 0.000000 0.000000 0.000000 1.000000
-0.026739 0.021094 0.000000 0.000000 0.000000 1.000000
0.026047 0.021094 0.000000 0.000000 0.000000 1.000000
-0.026982 0.017480 0.000000 0.000000 0.000000 1.000000
0.026290 0.017480 0.000000 0.000000 0.000000 1.000000
-0.026739 0.013866 0.000000 -0.000000 0.000000 1.000000
0.026047 0.013866 0.000000 0.000000 0.000000 1.000000
0.025339 0.010401 0.000000 0.000000 0.000000 1.000000
-0.026031 0.010401 0.000000 0.000000 0.000000 1.000000
0.024197 0.007114 0.000000 0.000000 0.000000 1.000000
-0.024889 0.007114 0.000000 0.000000 0.000000 1.000000
-0.023346 0.004039 0.000000 -0.000000 0.000000 1.000000
0.022654 0.004039 0.000000 0.000000 0.000000 1.000000
-0.021432 0.001207 0.000000 0.000000 0.000000 1.000000
0.020740 0.001207 0.000000 0.000000 0.000000 1.000000
-0.019181 -0.001351 0.000000 0.000000 0.000000 1.000000
0.018489 -0.001351 0.000000 0.000000 0.000000 1.000000
-0.016623 -0.003602 0.000000 0.000000 0.000000 1.000000
0.015931 -0.003602 0.000000 0.000000 0.000000 1.000000
-0.013790 -0.005515 0.000000 0.000000 0.000000 1.000000
0.013098 -0.005515 0.000000 0.000000 0.000000 1.000000
-0.010714 -0.007058 0.000000 0.000000 0.000000 1.000000
0.010022 -0.007058 0.000000 0.000000 0.000000 1.000000
-0.007427 -0.008199 0.000000 0.000000 0.000000 1.000000
0.006735 -0.008199 0.000000 0.000000 0.000000 1.000000
-0.003960 -0.008907 0.000000 0.000000 0.000000 1.000000
0.003268 -0.008907 0.000000 0.000000 0.000000 1.000000
-0.000346 -0.009151 0.000000 0.000000 0.000000 1.000000
-0.012995 0.108281 0.000000 0.000000 0.000000 1.000000
0.012322 0.108280 0.000000 0.000000 0.000000 1.000000
-0.000337 0.109131 0.000000 0.000000 0.000000 1.000000
-0.025133 0.105805 0.000000 0.000000 0.000000 1.000000
0.024461 0.105804 0.000000 0.000000 0.000000 1.000000
-0.036642 0.101813 0.000000 0.000000 0.000000 1.000000
0.035968 0.101812 0.000000 0.000000 0.000000 1.000000
-0.047409 0.096416 0.000000 0.000000 0.000000 1.000000
0.046734 0.096414 0.000000 0.000000 0.000000 1.000000
-0.057325 0.089725 0.000000 0.000000 0.000000 1.000000
0.056647 0.089722 0.000000 0.000000 0.000000 1.000000
-0.066278 0.081850 0.000000 0.000000 0.000000 1.000000
-0.010382 0.088476 0.000000 0.000000 0.000000 1.000000
-0.000536 0.089165 0.000000 0.000000 0.000000 1.000000
0.009413 0.088519 0.000000 0.000000 0.000000 1.000000
0.065598 0.081846 0.000000 0.000000 0.000000 1.000000
0.018959 0.086586 0.000000 0.000000 0.000000 1.000000
-0.019837 0.086518 0.000000 0.000000 0.000000 1.000000
0.028015 0.083454 0.000000 0.000000 0.000000 1.000000
-0.028813 0.083380 0.000000 0.000000 0.000000 1.000000
0.036493 0.079213 0.000000 0.000000 0.000000 1.000000
-0.037222 0.079147 0.000000 0.000000 0.000000 1.000000
-0.074157 0.072901 0.000000 0.000000 0.000000 1.000000
0.073475 0.072898 0.000000 0.000000 0.000000 1.000000
0.044304 0.073950 0.000000 0.000000 0.000000 1.000000
-0.044977 0.073908 0.000000 0.000000 0.000000 1.000000
-0.000978 0.077515 0.000000 0.000000 0.000000 1.000000
-0.000452 0.077516 0.000000 0.000000 0.000000 1.000000
-0.000715 0.077517 0.000000 0.000000 0.000000 1.000000
-0.000188 0.077515 0.000000 0.000000 0.000000 1.000000
-0.001240 0.077513 0.000000 0.000000 0.000000 1.000000
0.000076 0.077513 0.000000 0.000000 0.000000 1.000000
-0.001502 0.077509 0.000000 0.000000 0.000000 1.000000
0.000339 0.077509 0.000000 0.000000 0.000000 1.000000
0.000604 0.077505 0.000000 0.000000 0.000000 1.000000
-0.001763 0.077504 0.000000 0.000000 0.000000 1.000000
0.000868 0.077499 0.000000 0.000000 0.000000 1.000000
-0.009719 0.076788 0.000000 0.000000 0.000000 1.000000
-0.001763 0.077504 0.000000 0.000000 0.000000 1.000000
0.001132 0.077493 0.000000 0.000000 0.000000 1.000000
0.001396 0.077486 0.000000 0.000000 0.000000 1.000000
0.009188 0.076753 0.000000 0.000000 0.000000 1.000000
-0.017345 0.075064 0.000000 0.000000 0.000000 1.000000
0.016663 0.075050 0.000000 0.000000 0.000000 1.000000
-0.024572 0.072402 0.000000 0.000000 0.000000 1.000000
0.023757 0.072441 0.000000 0.000000 0.000000 1.000000
0.051360 0.067754 0.000000 0.000000 0.000000 1.000000
-0.051990 0.067750 0.000000 0.000000 0.000000 1.000000
-0.080853 0.062990 0.000000 0.000000 0.000000 1.000000
0.080167 0.062986 0.000000 0.000000 0.000000 1.000000
0.030402 0.068992 0.000000 0.000000 0.000000 1.000000
-0.031331 0.068870 0.000000 0.000000 0.000000 1.000000
0.036534 0.064770 0.000000 0.000000 0.000000 1.000000
-0.037554 0.064538 0.000000 0.000000 0.000000 1.000000
0.057573 0.060713 0.000000 0.000000 0.000000 1.000000
-0.058174 0.060760 0.000000 0.000000 0.000000 1.000000
0.042087 0.059841 0.000000 0.000000 0.000000 1.000000
-0.043170 0.059474 0.000000 0.000000 0.000000 1.000000
-0.086253 0.052226 0.000000 0.000000 0.000000 1.000000
0.085565 0.052223 0.000000 0.000000 0.000000 1.000000
-0.063441 0.053025 0.000000 0.000000 0.000000 1.000000
0.062854 0.052916 0.000000 0.000000 0.000000 1.000000
0.003670 0.057332 0.000000 0.000000 0.000000 1.000000
0.046995 0.054269 0.000000 0.000000 0.000000 1.000000
-0.048111 0.053748 0.000000 0.000000 0.000000 1.000000
-0.001926 0.057502 0.000000 0.000000 0.000000 1.000000
-0.007012 0.056977 0.000000 0.000000 0.000000 1.000000
0.009049 0.056417 0.000000 0.000000 0.000000 1.000000
-0.011892 0.055830 0.000000 0.000000 0.000000 1.000000
0.014159 0.054808 0.000000 0.000000 0.000000 1.000000
-0.016527 0.054103 0.000000 0.000000 0.000000 1.000000
0.018950 0.052557 0.000000 0.000000 0.000000 1.000000
0.051194 0.048121 0.000000 0.000000 0.000000 1.000000
-0.020872 0.051836 0.000000 0.000000 0.000000 1.000000
-0.052309 0.047428 0.000000 0.000000 0.000000 1.000000
-0.067703 0.044632 0.000000 0.000000 0.000000 1.000000
0.067116 0.044450 0.000000 0.000000 0.000000 1.000000
0.023371 0.049714 0.000000 0.000000 0.000000 1.000000
-0.090248 0.040721 0.000000 0.000000 0.000000 1.000000
0.089558 0.040718 0.000000 0.000000 0.000000 1.000000
-0.024888 0.049072 0.000000 0.000000 0.000000 1.000000
0.027368 0.046332 0.000000 0.000000 0.000000 1.000000
-0.028533 0.045853 0.000000 0.000000 0.000000 1.000000
0.054616 0.041463 0.000000 0.000000 0.000000 1.000000
-0.055694 0.040583 0.000000 0.000000 0.000000 1.000000
0.030892 0.042462 0.000000 0.000000 0.000000 1.000000
-0.031764 0.042219 0.000000 0.000000 0.000000 1.000000
-0.070874 0.035669 0.000000 0.000000 0.000000 1.000000
0.070269 0.035405 0.000000 0.000000 0.000000 1.000000
0.033891 0.038155 0.000000 0.000000 0.000000 1.000000
-0.034539 0.038212 0.000000 0.000000 0.000000 1.000000
0.057197 0.034361 0.000000 0.000000 0.000000 1.000000
-0.092726 0.028585 0.000000 0.000000 0.000000 1.000000
0.092035 0.028583 0.000000 0.000000 0.000000 1.000000
-0.058197 0.033282 0.000000 0.000000 0.000000 1.000000
-0.036819 0.033874 0.000000 0.000000 0.000000 1.000000
0.036312 0.033463 0.000000 0.000000 0.000000 1.000000
-0.072865 0.026222 0.000000 0.000000 0.000000 1.000000
0.072225 0.025868 0.000000 0.000000 0.000000 1.000000
0.058871 0.026881 0.000000 0.000000 0.000000 1.000000
-0.038559 0.029246 0.000000 0.000000 0.000000 1.000000
0.038106 0.028437 0.000000 0.000000 0.000000 1.000000
-0.059749 0.025595 0.000000 0.000000 0.000000 1.000000
-0.039720 0.024369 0.000000 0.000000 0.000000 1.000000
-0.093577 0.015929 0.000000 0.000000 0.000000 1.000000
0.092885 0.015929 0.000000 0.000000 0.000000 1.000000
0.039220 0.023129 0.000000 0.000000 0.000000 1.000000
0.059572 0.019088 0.000000 0.000000 0.000000 1.000000
-0.073589 0.016380 0.000000 0.000000 0.000000 1.000000
0.072897 0.015929 0.000000 0.000000 0.000000 1.000000
-0.060282 0.017589 0.000000 0.000000 0.000000 1.000000
-0.040258 0.019286 0.000000 0.000000 0.000000 1.000000
0.039602 0.017589 0.000000 0.000000 0.000000 1.000000
-0.040275 0.016406 0.000000 0.000000 0.000000 1.000000
0.059528 0.014874 0.000000 0.000000 0.000000 1.000000
-0.060144 0.013509 0.000000 0.000000 0.000000 1.000000
0.039512 0.014887 0.000000 0.000000 0.000000 1.000000
-0.040091 0.013575 0.000000 0.000000 0.000000 1.000000
-0.073455 0.011449 0.000000 0.000000 0.000000 1.000000
-0.093367 0.009601 0.000000 0.000000 0.000000 1.000000
0.072736 0.011054 0.000000 -0.000000 0.000000 1.000000
0.092675 0.009604 0.000000 0.000000 0.000000 1.000000
0.039245 0.012233 0.000000 0.000000 0.000000 1.000000
0.059197 0.010734 0.000000 0.000000 0.000000 1.000000
-0.039713 0.010801 0.000000 0.000000 0.000000 1.000000
-0.059737 0.009502 0.000000 0.000000 0.000000 1.000000
0.038807 0.009632 0.000000 0.000000 0.000000 1.000000
-0.072999 0.006604 0.000000 0.000000 0.000000 1.000000
0.072262 0.006264 0.000000 0.000000 0.000000 1.000000
-0.039148 0.008090 0.000000 0.000000 0.000000 1.000000
0.058588 0.006678 0.000000 0.000000 0.000000 1.000000
0.038203 0.007091 0.000000 0.000000 0.000000 1.000000
0.092056 0.003409 0.000000 0.000000 0.000000 1.000000
-0.092747 0.003401 0.000000 0.000000 0.000000 1.000000
-0.059069 0.005577 0.000000 0.000000 0.000000 1.000000
-0.038402 0.005450 0.000000 0.000000 0.000000 1.000000
0.037440 0.004614 0.000000 0.000000 0.000000 1.000000
0.057711 0.002714 0.000000 0.000000 0.000000 1.000000
-0.072231 0.001856 0.000000 0.000000 0.000000 1.000000
0.071483 0.001570 0.000000 0.000000 0.000000 1.000000
-0.058150 0.001743 0.000000 0.000000 0.000000 1.000000
-0.037482 0.002886 0.000000 0.000000 0.000000 1.000000
0.036523 0.002209 0.000000 0.000000 0.000000 1.000000
0.091043 -0.002646 0.000000 0.000000 0.000000 1.000000
-0.091731 -0.002660 0.000000 0.000000 0.000000 1.000000
-0.036396 0.000406 0.000000 0.000000 0.000000 1.000000
0.056575 -0.001148 0.000000 0.000000 0.000000 1.000000
0.035459 -0.000119 0.000000 0.000000 0.000000 1.000000
-0.071162 -0.002784 0.000000 0.000000 0.000000 1.000000
-0.056989 -0.001992 0.000000 0.000000 0.000000 1.000000
0.070409 -0.003019 0.000000 0.000000 0.000000 1.000000
-0.035149 -0.001984 0.000000 0.000000 0.000000 1.000000
0.034252 -0.002366 0.000000 0.000000 0.000000 1.000000
0.055192 -0.004897 0.000000 0.000000 0.000000 1.000000
-0.033750 -0.004276 0.000000 0.000000 0.000000 1.000000
-0.055594 -0.005619 0.000000 0.000000 0.000000 1.000000
0.032909 -0.004523 0.000000 0.000000 0.000000 1.000000
0.089650 -0.008548 0.000000 0.000000 0.000000 1.000000
-0.090335 -0.008569 0.000000 0.000000 0.000000 1.000000
-0.069802 -0.007308 0.000000 0.000000 0.000000 1.000000
0.069053 -0.007492 0.000000 0.000000 0.000000 1.000000
-0.032205 -0.006464 0.000000 0.000000 0.000000 1.000000
0.031435 -0.006587 0.000000 0.000000 0.000000 1.000000
0.053569 -0.008525 0.000000 0.000000 0.000000 1.000000
-0.053974 -0.009129 0.000000 0.000000 0.000000 1.000000
-0.030520 -0.008540 0.000000 0.000000 0.000000 1.000000
0.029836 -0.008551 0.000000 0.000000 0.000000 1.000000
-0.068163 -0.011704 0.000000 0.000000 0.000000 1.000000
0.067422 -0.011841 0.000000 0.000000 0.000000 1.000000
0.051718 -0.012022 0.000000 0.000000 0.000000 1.000000
-0.028702 -0.010499 0.000000 0.000000 0.000000 1.000000
0.087893 -0.014287 0.000000 0.000000 0.000000 1.000000
0.028119 -0.010409 0.000000 0.000000 0.000000 1.000000
-0.088573 -0.014316 0.000000 0.000000 0.000000 1.000000
-0.052139 -0.012513 0.000000 0.000000 0.000000 1.000000
0.028396 -0.010686 0.000000 0.000000 0.000000 1.000000
-0.028980 -0.010777 0.000000 0.000000 0.000000 1.000000
0.029163 -0.011453 0.000000 0.000000 0.000000 1.000000
-0.029748 -0.011545 0.000000 0.000000 0.000000 1.000000
0.030322 -0.012612 0.000000 0.000000 0.000000 1.000000
-0.030909 -0.012705 0.000000 0.000000 0.000000 1.000000
-0.066254 -0.015962 0.000000 0.000000 0.000000 1.000000
0.065528 -0.016054 0.000000 0.000000 0.000000 1.000000
0.049648 -0.015378 0.000000 0.000000 0.000000 1.000000
-0.050097 -0.015763 0.000000 0.000000 0.000000 1.000000
0.031775 -0.014064 0.000000 0.000000 0.000000 1.000000
-0.032363 -0.014159 0.000000 0.000000 0.000000 1.000000
0.033423 -0.015712 0.000000 0.000000 0.000000 1.000000
-0.034014 -0.015809 0.000000 0.000000 0.000000 1.000000
0.085786 -0.019851 0.000000 0.000000 0.000000 1.000000
-0.086460 -0.019888 0.000000 0.000000 0.000000 1.000000
0.047368 -0.018584 0.000000 0.000000 0.000000 1.000000
0.035170 -0.017458 0.000000 0.000000 0.000000 1.000000
-0.047858 -0.018869 0.000000 0.000000 0.000000 1.000000
-0.035762 -0.017558 0.000000 0.000000 0.000000 1.000000
-0.064086 -0.020073 0.000000 0.000000 0.000000 1.000000
0.063380 -0.020122 0.000000 0.000000 0.000000 1.000000
0.036916 -0.019204 0.000000 0.000000 0.000000 1.000000
-0.037511 -0.019306 0.000000 0.000000 0.000000 1.000000
0.044889 -0.021631 0.000000 0.000000 0.000000 1.000000
-0.045430 -0.021823 0.000000 0.000000 0.000000 1.000000
0.038564 -0.020852 0.000000 0.000000 0.000000 1.000000
-0.039161 -0.020956 0.000000 0.000000 0.000000 1.000000
0.083344 -0.025228 0.000000 0.000000 0.000000 1.000000
-0.084010 -0.025274 0.000000 0.000000 0.000000 1.000000
-0.061671 -0.024026 0.000000 0.000000 0.000000 1.000000
0.060989 -0.024035 0.000000 0.000000 0.000000 1.000000
0.040017 -0.022305 0.000000 0.000000 0.000000 1.000000
-0.040616 -0.022410 0.000000 0.000000 0.000000 1.000000
0.041943 -0.024230 0.000000 0.000000 0.000000 1.000000
0.042220 -0.024508 0.000000 0.000000 0.000000 1.000000
-0.042822 -0.024616 0.000000 0.000000 0.000000 1.000000
-0.042544 -0.024338 0.000000 0.000000 0.000000 1.000000
-0.041776 -0.023570 0.000000 0.000000 0.000000 1.000000
0.041176 -0.023463 0.000000 0.000000 0.000000 -1.000000
0.041943 -0.024230 0.000000 0.000000 0.000000 -1.000000
0.040017 -0.022305 0.000000 0.000000 0.000000 -1.000000
-0.059018 -0.027810 0.000000 0.000000 0.000000 1.000000
0.058365 -0.027783 0.000000 0.000000 0.000000 1.000000
0.080582 -0.030407 0.000000 0.000000 0.000000 1.000000
-0.081239 -0.030462 0.000000 0.000000 0.000000 1.000000
0.055518 -0.031355 0.000000 0.000000 0.000000 1.000000
-0.056138 -0.031416 0.000000 0.000000 0.000000 1.000000
0.077515 -0.035376 0.000000 0.000000 0.000000 1.000000
-0.078161 -0.035441 0.000000 0.000000 0.000000 1.000000
0.052458 -0.034743 0.000000 0.000000 0.000000 1.000000
-0.053042 -0.034833 0.000000 0.000000 0.000000 1.000000
0.052737 -0.035022 0.000000 0.000000 0.000000 1.000000
-0.053321 -0.035112 0.000000 0.000000 0.000000 1.000000
0.053508 -0.035793 0.000000 0.000000 0.000000 1.000000
-0.054093 -0.035883 0.000000 0.000000 0.000000 1.000000
0.074158 -0.040125 0.000000 0.000000 0.000000 1.000000
-0.074791 -0.040199 0.000000 0.000000 0.000000 1.000000
0.054673 -0.036957 0.000000 0.000000 0.000000 1.000000
-0.055259 -0.037047 0.000000 0.000000 0.000000 1.000000
0.056133 -0.038417 0.000000 0.000000 0.000000 1.000000
-0.056721 -0.038507 0.000000 0.000000 0.000000 1.000000
0.057789 -0.040073 0.000000 0.000000 0.000000 1.000000
-0.058380 -0.040164 0.000000 0.000000 0.000000 1.000000
0.059545 -0.041828 0.000000 0.000000 0.000000 1.000000
0.070525 -0.044641 0.000000 0.000000 0.000000 1.000000
-0.060137 -0.041919 0.000000 0.000000 0.000000 1.000000
-0.071144 -0.044724 0.000000 0.000000 0.000000 1.000000
0.061300 -0.043583 0.000000 0.000000 0.000000 1.000000
-0.061895 -0.043674 0.000000 0.000000 0.000000 1.000000
0.062957 -0.045240 0.000000 0.000000 0.000000 1.000000
-0.063554 -0.045330 0.000000 0.000000 0.000000 1.000000
0.064417 -0.046700 0.000000 0.000000 0.000000 1.000000
0.066632 -0.048914 0.000000 0.000000 0.000000 1.000000
-0.067233 -0.049004 0.000000 0.000000 0.000000 1.000000
-0.066954 -0.048725 0.000000 0.000000 0.000000 1.000000
-0.065016 -0.046790 0.000000 0.000000 0.000000 1.000000
0.065582 -0.047864 0.000000 0.000000 0.000000 -1.000000
0.066632 -0.048914 0.000000 0.000000 0.000000 -1.000000
0.064417 -0.046700 0.000000 0.000000 0.000000 -1.000000
-0.066182 -0.047954 0.000000 0.000000 0.000000 1.000000
0.066353 -0.048635 0.000000 0.000000 0.000000 1.000000
0.065582 -0.047864 0.000000 0.000000 0.000000 1.000000
3 0 1 2
3 0 3 1
3 4 5 6
3 4 7 5
3 8 4 9
3 8 7 4
3 8 10 7
3 8 11 10
3 12 13 14
3 12 15 13
3 16 17 18
3 19 17 16
3 19 20 17
3 21 20 19
3 21 22 20
3 23 22 21
3 23 24 22
3 25 24 23
3 25 26 24
3 27 26 25
3 27 28 26
3 29 28 27
3 29 30 28
3 31 30 29
3 31 32 30
3 33 32 31
3 33 34 32
3 35 34 33
3 35 36 34
3 37 36 35
3 37 38 36
3 39 38 37
3 39 40 38
3 41 40 39
3 41 42 40
3 41 43 42
3 44 43 41
3 44 45 43
3 46 45 44
3 47 45 46
3 47 48 45
3 49 48 47
3 49 50 48
3 51 50 49
3 51 52 50
3 53 52 51
3 53 54 52
3 55 54 53
3 55 56 54
3 57 56 55
3 57 58 56
3 59 58 57
3 59 60 58
3 61 60 59
3 61 62 60
3 63 62 61
3 64 65 66
3 67 65 64
3 67 68 65
3 69 68 67
3 69 70 68
3 71 70 69
3 71 72 70
3 73 72 71
3 73 74 72
3 75 76 73
3 76 77 73
3 77 74 73
3 77 78 74
3 78 79 74
3 80 79 78
3 75 81 76
3 82 79 80
3 75 83 81
3 84 79 82
3 75 85 83
3 86 85 75
3 84 87 79
3 88 87 84
3 86 89 85
3 90 91 92
3 90 93 91
3 94 93 90
3 94 95 93
3 96 95 94
3 96 97 95
3 96 98 97
3 99 98 96
3 99 100 98
3 101 99 102
3 101 100 99
3 101 103 100
3 101 104 103
3 101 105 104
3 106 105 101
3 106 107 105
3 108 107 106
3 108 109 107
3 110 87 88
3 86 111 89
3 112 111 86
3 110 113 87
3 108 114 109
3 115 114 108
3 115 116 114
3 117 116 115
3 118 113 110
3 112 119 111
3 117 120 116
3 121 120 117
3 122 119 112
3 118 123 113
3 122 124 119
3 125 123 118
3 121 126 120
3 126 127 120
3 128 129 121
3 129 126 121
3 128 130 129
3 131 127 126
3 128 132 130
3 133 127 131
3 128 134 132
3 135 127 133
3 135 136 127
3 128 137 134
3 138 137 128
3 122 139 124
3 140 123 125
3 141 136 135
3 142 139 122
3 140 143 123
3 138 144 137
3 145 136 141
3 138 146 144
3 145 147 136
3 148 146 138
3 149 147 145
3 148 150 146
3 142 151 139
3 152 143 140
3 153 147 149
3 148 154 150
3 153 155 147
3 156 151 142
3 152 157 143
3 158 154 148
3 158 159 154
3 160 155 153
3 156 161 151
3 162 157 152
3 160 163 155
3 158 164 159
3 165 163 160
3 166 164 158
3 166 167 164
3 168 161 156
3 162 169 157
3 170 163 165
3 170 171 163
3 168 172 161
3 173 169 162
3 174 167 166
3 174 175 167
3 176 171 170
3 174 177 175
3 176 178 171
3 179 177 174
3 180 178 176
3 179 181 177
3 168 182 172
3 183 182 168
3 184 169 173
3 184 185 169
3 186 178 180
3 186 187 178
3 179 188 181
3 189 188 179
3 190 187 186
3 183 191 182
3 192 185 184
3 189 193 188
3 190 194 187
3 195 194 190
3 192 196 185
3 197 191 183
3 198 193 189
3 198 199 193
3 200 194 195
3 200 201 194
3 197 202 191
3 203 196 192
3 204 199 198
3 204 205 199
3 206 201 200
3 203 207 196
3 208 202 197
3 204 209 205
3 206 210 201
3 211 210 206
3 208 212 202
3 213 209 204
3 214 207 203
3 213 215 209
3 216 210 211
3 216 217 210
3 213 218 215
3 219 218 213
3 220 217 216
3 214 221 207
3 222 212 208
3 222 223 212
3 224 221 214
3 219 225 218
3 226 217 220
3 226 227 217
3 228 225 219
3 228 229 225
3 230 227 226
3 222 231 223
3 232 221 224
3 230 233 227
3 228 234 229
3 232 235 221
3 236 233 230
3 237 231 222
3 238 234 228
3 239 233 236
3 238 240 234
3 241 233 239
3 238 242 240
3 243 233 241
3 238 244 242
3 237 245 231
3 246 235 232
3 243 247 233
3 248 244 238
3 249 247 243
3 248 250 244
3 251 247 249
3 248 252 250
3 246 253 235
3 254 245 237
3 251 255 247
3 256 255 251
3 257 252 248
3 257 258 252
3 254 259 245
3 260 253 246
3 261 255 256
3 257 262 258
3 261 263 255
3 264 262 257
3 265 263 261
3 264 266 262
3 260 267 253
3 268 259 254
3 268 269 259
3 270 267 260
3 271 263 265
3 264 272 266
3 271 273 263
3 273 274 263
3 275 276 264
3 276 277 264
3 277 272 264
3 278 279 280
3 268 281 269
3 282 267 270
3 282 283 267
3 284 281 268
3 285 283 282
3 284 286 281
3 285 287 283
3 288 286 284
3 289 287 285
3 288 290 286
3 291 287 289
3 288 292 290
3 293 287 291
3 288 294 292
3 293 295 287
3 296 294 288
3 297 295 293
3 296 298 294
3 299 295 297
3 296 300 298
3 301 295 299
3 296 302 300
3 303 295 301
3 303 304 295
3 296 305 302
3 306 305 296
3 307 304 303
3 306 308 305
3 309 304 307
3 306 310 308
3 309 311 304
3 311 312 304
3 313 314 306
3 314 315 306
3 315 310 306
3 316 317 318
3 314 319 315
3 320 312 321