New CountVisitor to count the number of sources in session

Session size is the number of elements, use CountVisitor to count the total number of sources inside (recursively through SessionSources).
This commit is contained in:
Bruno Herbelin
2022-04-09 00:35:20 +02:00
parent f2db10d29a
commit 8fef0052a3
15 changed files with 353 additions and 148 deletions

View File

@@ -434,6 +434,7 @@ set(VMIX_SRCS
ImGuiToolkit.cpp
ImGuiVisitor.cpp
InfoVisitor.cpp
CountVisitor.cpp
GstToolkit.cpp
GlmToolkit.cpp
SystemToolkit.cpp

146
CountVisitor.cpp Normal file
View File

@@ -0,0 +1,146 @@
/*
* This file is part of vimix - video live mixer
*
* **Copyright** (C) 2019-2022 Bruno Herbelin <bruno.herbelin@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
**/
#include "Scene.h"
#include "Primitives.h"
#include "MediaSource.h"
#include "CloneSource.h"
#include "RenderSource.h"
#include "SessionSource.h"
#include "PatternSource.h"
#include "DeviceSource.h"
#include "NetworkSource.h"
#include "SrtReceiverSource.h"
#include "MultiFileSource.h"
#include "Session.h"
#include "CountVisitor.h"
CountVisitor::CountVisitor() : num_source_(0), num_playable_(0)
{
}
void CountVisitor::visit(Node &n)
{
}
void CountVisitor::visit(Group &)
{
}
void CountVisitor::visit(Switch &)
{
}
void CountVisitor::visit(Scene &)
{
}
void CountVisitor::visit(Primitive &)
{
}
void CountVisitor::visit(MediaPlayer &mp)
{
}
void CountVisitor::visit(Stream &n)
{
}
void CountVisitor::visit (MediaSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (SessionFileSource& s)
{
num_source_ += s.session()->numSources();
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (SessionGroupSource& s)
{
num_source_ += s.session()->numSources();
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (RenderSource& s)
{
++num_source_;
++num_playable_;
}
void CountVisitor::visit (CloneSource& s)
{
++num_source_;
++num_playable_;
}
void CountVisitor::visit (PatternSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (DeviceSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (NetworkSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (MultiFileSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (GenericStreamSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}
void CountVisitor::visit (SrtReceiverSource& s)
{
++num_source_;
if (s.playable())
++num_playable_;
}

39
CountVisitor.h Normal file
View File

@@ -0,0 +1,39 @@
#ifndef COUNTVISITOR_H
#define COUNTVISITOR_H
#include "Visitor.h"
class CountVisitor : public Visitor
{
uint num_source_;
uint num_playable_;
public:
CountVisitor();
inline uint numSources () const { return num_source_; }
inline uint numPlayableSources () const { return num_playable_; }
// Elements of Scene
void visit (Scene& n) override;
void visit (Node& n) override;
void visit (Group& n) override;
void visit (Switch& n) override;
void visit (Primitive& n) override;
// Elements with attributes
void visit (Stream& n) override;
void visit (MediaPlayer& n) override;
void visit (MediaSource& s) override;
void visit (SessionFileSource& s) override;
void visit (SessionGroupSource& s) override;
void visit (RenderSource& s) override;
void visit (CloneSource& s) override;
void visit (PatternSource& s) override;
void visit (DeviceSource& s) override;
void visit (NetworkSource& s) override;
void visit (MultiFileSource& s) override;
void visit (GenericStreamSource& s) override;
void visit (SrtReceiverSource& s) override;
};
#endif // INFOVISITOR_H

View File

@@ -689,7 +689,7 @@ void ImGuiVisitor::visit (SessionGroupSource& s)
ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f, 0.14f, 0.14f, 0.9f));
ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);
ImGui::InputTextMultiline("##sourcesingroup", (char *)info.c_str(), info.size(),
ImVec2(IMGUI_RIGHT_ALIGN, CLAMP(session->numSource(), 2, 5) * ImGui::GetTextLineHeightWithSpacing()),
ImVec2(IMGUI_RIGHT_ALIGN, CLAMP(session->size(), 2, 5) * ImGui::GetTextLineHeightWithSpacing()),
ImGuiInputTextFlags_ReadOnly);
ImGui::PopStyleColor(1);

View File

@@ -149,7 +149,11 @@ void InfoVisitor::visit (SessionFileSource& s)
std::ostringstream oss;
if (s.session()->frame()){
std::string numsource = std::to_string(s.session()->numSource()) + " source" + (s.session()->numSource()>1 ? "s" : "");
uint N = s.session()->size();
std::string numsource = std::to_string(N) + " source" + (N>1 ? "s" : "");
uint T = s.session()->numSources();
if (T>N)
numsource += " (" + std::to_string(T) + " total)";
if (brief_) {
oss << SystemToolkit::filename(s.path()) << std::endl;
oss << numsource << ", " ;
@@ -172,7 +176,11 @@ void InfoVisitor::visit (SessionGroupSource& s)
return;
std::ostringstream oss;
oss << s.session()->numSource() << " source" << (s.session()->numSource()>1 ? "s" : "");
uint N = s.session()->size();
oss << N << " source" << (N>1 ? "s" : "");
uint T = s.session()->numSources();
if (T>N)
oss << " (" << std::to_string(T) << " total)";
if (s.session()->frame()){
if (brief_) {

View File

@@ -705,7 +705,7 @@ void Mixer::groupSelection()
}
}
if (sessiongroup->session()->numSource() > 0) {
if (sessiongroup->session()->size() > 0) {
// recreate groups in session group
for (auto git = selectgroups.begin(); git != selectgroups.end(); ++git)
sessiongroup->session()->link( *git );
@@ -728,10 +728,10 @@ void Mixer::groupSelection()
// store in action manager
std::ostringstream info;
info << sessiongroup->name() << " inserted: " << sessiongroup->session()->numSource() << " sources groupped.";
info << sessiongroup->name() << " inserted: " << sessiongroup->session()->size() << " sources groupped.";
Action::manager().store(info.str());
Log::Notify("Added %s source '%s' (group of %d sources)", sessiongroup->info().c_str(), sessiongroup->name().c_str(), sessiongroup->session()->numSource());
Log::Notify("Added %s source '%s' (group of %d sources)", sessiongroup->info().c_str(), sessiongroup->name().c_str(), sessiongroup->session()->size());
// give the hand to the user
Mixer::manager().setCurrentSource(sessiongroup);
@@ -763,7 +763,7 @@ void Mixer::groupAll()
break;
}
if (sessiongroup->session()->numSource() > 0) {
if (sessiongroup->session()->size() > 0) {
// recreate groups in session group
for (auto git = allgroups.begin(); git != allgroups.end(); ++git)
@@ -784,7 +784,7 @@ void Mixer::groupAll()
addSource(sessiongroup);
// inform of creation
Log::Info("%s Source '%s' created (%d sources groupped)", sessiongroup->info().c_str(), sessiongroup->name().c_str(), sessiongroup->session()->numSource());
Log::Info("%s Source '%s' created (%d sources groupped)", sessiongroup->info().c_str(), sessiongroup->name().c_str(), sessiongroup->session()->size());
}
else {
delete sessiongroup;
@@ -980,7 +980,7 @@ void Mixer::moveIndex (int current_index, int target_index)
void Mixer::setCurrentNext()
{
if (session_->numSource() > 0) {
if (session_->size() > 0) {
SourceList::iterator it = current_source_;
++it;
@@ -995,7 +995,7 @@ void Mixer::setCurrentNext()
void Mixer::setCurrentPrevious()
{
if (session_->numSource() > 0) {
if (session_->size() > 0) {
SourceList::iterator it = current_source_;
@@ -1037,7 +1037,7 @@ int Mixer::indexCurrentSource() const
int Mixer::numSource() const
{
return (int) session_->numSource();
return (int) session_->size();
}
Source *Mixer::currentSource()
@@ -1221,7 +1221,7 @@ void Mixer::merge(Session *session)
// import every sources
std::ostringstream info;
info << session->numSource() << " sources imported from:" << session->filename();
info << session->size() << " sources imported from:" << session->filename();
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource()) {
// avoid name duplicates
renameSource(s);
@@ -1260,7 +1260,7 @@ void Mixer::merge(SessionSource *source)
// prepare Action manager info
std::ostringstream info;
info << source->name().c_str() << " expanded:" << session->numSource() << " sources imported";
info << source->name().c_str() << " expanded:" << session->size() << " sources imported";
// import sources of the session (if not empty)
if ( !session->empty() ) {
@@ -1395,7 +1395,7 @@ void Mixer::swap()
Action::manager().init();
// notification
Log::Notify("Session %s loaded. %d source(s) created.", session_->filename().c_str(), session_->numSource());
Log::Notify("Session %s loaded. %d source(s) created.", session_->filename().c_str(), session_->size());
}
void Mixer::close(bool smooth)

View File

@@ -33,6 +33,7 @@
#include "MixingGroup.h"
#include "ControlManager.h"
#include "SourceCallback.h"
#include "CountVisitor.h"
#include "Log.h"
#include "Session.h"
@@ -432,11 +433,21 @@ SourceList Session::getDepthSortedList() const
return depth_sorted(sources_);
}
uint Session::numSource() const
uint Session::size() const
{
return sources_.size();
}
uint Session::numSources() const
{
CountVisitor counter;
for( SourceList::const_iterator it = sources_.cbegin(); it != sources_.cend(); ++it) {
(*it)->accept(counter);
}
return counter.numSources();
}
SourceIdList Session::getIdList() const
{
return ids(sources_);

View File

@@ -63,7 +63,7 @@ public:
// management of list of sources
bool empty() const;
uint numSource() const;
uint size() const;
SourceList::iterator begin ();
SourceList::iterator end ();
SourceList::iterator find (Source *s);
@@ -81,6 +81,9 @@ public:
int index (SourceList::iterator it) const;
void move (int current_index, int target_index);
// get total number of sources (recursively)
uint numSources() const;
// update all sources and mark sources which failed
void update (float dt);
uint64_t runtime() const;

View File

@@ -180,7 +180,7 @@ void SessionCreator::load(const std::string& filename)
// all good
Log::Info("Session %s Opened '%s' (%d sources)", std::to_string(session_->id()).c_str(),
filename.c_str(), session_->numSource());
filename.c_str(), session_->size());
}

View File

@@ -165,7 +165,7 @@ void SessionSource::update(float dt)
if (session_->failedSource() != nullptr) {
session_->deleteSource(session_->failedSource());
// fail session if all sources failed
if ( session_->numSource() < 1)
if ( session_->size() < 1)
failed_ = true;
}
@@ -302,7 +302,7 @@ void SessionFileSource::init()
attach(renderbuffer);
// wait for all sources to init
if (session_->numSource() > 0)
if (session_->size() > 0)
wait_for_sources_ = true;
else {
initialized_ = true;

View File

@@ -60,7 +60,7 @@ bool SessionVisitor::saveSession(const std::string& filename, Session *session)
XMLElement *rootnode = xmlDoc.NewElement(APP_NAME);
rootnode->SetAttribute("major", XML_VERSION_MAJOR);
rootnode->SetAttribute("minor", XML_VERSION_MINOR);
rootnode->SetAttribute("size", session->numSource());
rootnode->SetAttribute("size", session->size());
rootnode->SetAttribute("date", SystemToolkit::date_time_string().c_str());
rootnode->SetAttribute("resolution", session->frame()->info().c_str());
xmlDoc.InsertEndChild(rootnode);

View File

@@ -5407,7 +5407,7 @@ void Navigator::Render()
// hack to show more sources if not enough space; make source icons smaller...
ImVec2 sourceiconsize(icon_width, icon_width);
if (sourcelist_height - 2.f * icon_width < Mixer::manager().session()->numSource() * icon_width )
if (sourcelist_height - 2.f * icon_width < Mixer::manager().session()->size() * icon_width )
sourceiconsize.y *= 0.75f;
// Left bar top

View File

@@ -1,104 +1,103 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
comment Created by Blender 2.93.3 - www.blender.org
element vertex 42
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
property float nx
property float ny
property float nz
element face 48
property list uchar uint vertex_indices
end_header
0.024507 -0.996045 0.000000 255 255 255 255
0.174784 -0.905512 0.000000 255 255 255 255
0.027218 -0.975830 0.000000 255 255 255 255
0.185609 -0.916652 0.000000 255 255 255 255
0.191906 -0.891539 0.000000 255 255 255 255
0.211357 -0.881739 0.000000 255 255 255 255
0.202956 -0.902581 0.000000 255 255 255 255
0.213481 -0.863042 0.000000 255 255 255 255
0.200215 -0.870926 0.000000 255 255 255 255
0.227129 -0.876006 0.000000 255 255 255 255
0.224977 -0.894955 0.000000 255 255 255 255
0.216462 -0.916078 0.000000 255 255 255 255
0.198841 -0.930269 0.000000 255 255 255 255
0.017147 -1.015018 0.000000 255 255 255 255
0.227129 0.099989 0.000000 255 255 255 255
0.213481 1.063025 0.000000 255 255 255 255
0.213481 0.099992 0.000000 255 255 255 255
0.227129 1.075985 0.000000 255 255 255 255
0.211195 1.087628 0.000000 255 255 255 255
0.200055 1.076754 0.000000 255 255 255 255
0.200038 1.051104 0.000000 255 255 255 255
0.191568 1.092067 0.000000 255 255 255 255
0.184506 1.111229 0.000000 255 255 255 255
0.202614 1.103111 0.000000 255 255 255 255
0.162270 1.113506 0.000000 255 255 255 255
0.173660 1.100095 0.000000 255 255 255 255
0.175229 1.127145 0.000000 255 255 255 255
0.197765 1.124837 0.000000 255 255 255 255
0.216116 1.116610 0.000000 255 255 255 255
0.224813 1.100919 0.000000 255 255 255 255
0.200926 -0.851116 0.000000 255 255 255 255
-0.800033 1.113506 0.000000 255 255 255 255
0.150350 1.100000 0.000000 255 255 255 255
-0.800026 1.127145 0.000000 255 255 255 255
0.200038 0.100000 0.000000 255 255 255 255
-0.800026 1.100000 0.000000 255 255 255 255
0.016287 1.016200 0.000000 255 255 255 255
0.173893 1.099758 0.000000 255 255 255 255
-0.000785 1.024438 0.000000 255 255 255 255
0.192264 1.092032 0.000000 255 255 255 255
0.024618 1.000701 0.000000 255 255 255 255
0.198820 1.078819 0.000000 255 255 255 255
0.016287 1.016200 0.000000 -0.000000 0.000000 1.000000
0.136328 1.079531 0.000000 -0.000000 0.000000 1.000000
-0.000785 1.024438 0.000000 -0.000000 0.000000 1.000000
0.154699 1.071804 0.000000 0.000000 -0.000000 1.000000
0.024618 1.000701 0.000000 0.000000 -0.000000 1.000000
0.161255 1.058592 0.000000 0.000000 -0.000000 1.000000
0.013495 -1.001311 0.000000 -0.000000 0.000000 1.000000
0.115010 -0.933052 0.000000 -0.000000 0.000000 1.000000
0.016206 -0.981096 0.000000 -0.000000 0.000000 1.000000
0.125834 -0.944192 0.000000 -0.000000 0.000000 1.000000
0.132131 -0.919079 0.000000 -0.000000 0.000000 1.000000
0.151583 -0.909279 0.000000 0.000000 -0.000000 1.000000
0.143181 -0.930121 0.000000 0.000000 -0.000000 1.000000
0.153706 -0.890582 0.000000 0.000000 -0.000000 1.000000
0.140441 -0.898466 0.000000 0.000000 -0.000000 1.000000
0.167355 -0.903547 0.000000 0.000000 0.000000 1.000000
0.165202 -0.922495 0.000000 0.000000 -0.000000 1.000000
0.156688 -0.943618 0.000000 0.000000 -0.000000 1.000000
0.139066 -0.957810 0.000000 0.000000 -0.000000 1.000000
0.006135 -1.020284 0.000000 0.000000 -0.000000 1.000000
0.167355 0.072449 0.000000 0.000000 -0.000000 1.000000
0.153706 1.035485 0.000000 -0.000000 0.000000 1.000000
0.153706 0.072452 0.000000 -0.000000 0.000000 1.000000
0.167355 1.048445 0.000000 -0.000000 -0.000000 1.000000
0.151421 1.060088 0.000000 -0.000000 -0.000000 1.000000
0.140280 1.049214 0.000000 -0.000000 0.000000 1.000000
0.140263 1.023564 0.000000 -0.000000 0.000000 1.000000
0.131793 1.064527 0.000000 -0.000000 -0.000000 1.000000
0.124732 1.083689 0.000000 0.000000 0.000000 1.000000
0.142839 1.075571 0.000000 0.000000 0.000000 1.000000
0.102495 1.085966 0.000000 0.000000 0.000000 1.000000
0.113885 1.072555 0.000000 0.000000 0.000000 1.000000
0.115454 1.099605 0.000000 -0.000000 0.000000 1.000000
0.137990 1.097297 0.000000 0.000000 0.000000 1.000000
0.156341 1.089070 0.000000 0.000000 0.000000 1.000000
0.165038 1.073379 0.000000 0.000000 0.000000 1.000000
0.141152 -0.878656 0.000000 0.000000 -0.000000 1.000000
-0.859808 1.085966 0.000000 0.000000 0.000000 1.000000
0.090575 1.072460 0.000000 0.000000 0.000000 1.000000
-0.859801 1.099605 0.000000 -0.000000 0.000000 1.000000
0.140263 0.072460 0.000000 0.000000 -0.000000 1.000000
-0.859801 1.072460 0.000000 0.000000 0.000000 1.000000
3 0 1 2
3 3 4 1
3 5 4 6
3 7 8 5
3 5 9 7
3 10 6 11
3 6 12 11
3 3 13 12
3 14 7 9
3 14 15 16
3 17 18 15
3 15 19 20
3 18 21 19
3 22 21 23
3 24 25 22
3 22 26 24
3 27 23 28
3 23 29 28
3 20 16 15
3 16 30 7
3 31 32 24
3 24 33 31
3 3 4 5
3 0 3 1
3 3 6 4
3 5 8 4
3 7 30 8
3 5 10 9
3 10 5 6
3 6 3 12
3 3 0 13
3 14 16 7
3 14 17 15
3 17 29 18
3 15 18 19
3 18 23 21
3 22 25 21
3 24 32 25
3 22 27 26
3 27 22 23
3 23 18 29
3 20 34 16
3 16 34 30
3 31 35 32
3 24 26 33
3 36 37 38
3 39 40 41
3 36 39 37
3 39 36 40
3 3 0 4
3 6 7 8
3 9 10 7
3 11 10 12
3 13 14 11
3 11 15 13
3 16 12 17
3 12 18 17
3 9 19 18
3 20 13 15
3 20 21 22
3 23 24 21
3 21 25 26
3 24 27 25
3 28 27 29
3 30 31 28
3 28 32 30
3 33 29 34
3 29 35 34
3 26 22 21
3 22 36 13
3 37 38 30
3 30 39 37
3 6 9 7
3 9 12 10
3 11 14 10
3 13 36 14
3 11 16 15
3 16 11 12
3 12 9 18
3 9 6 19
3 20 22 13
3 20 23 21
3 23 35 24
3 21 24 25
3 24 29 27
3 28 31 27
3 30 38 31
3 28 33 32
3 33 28 29
3 29 24 35
3 26 40 22
3 22 40 36
3 37 41 38
3 30 32 39

View File

@@ -1,35 +1,34 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
comment Created by Blender 2.93.3 - www.blender.org
element vertex 18
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
property float nx
property float ny
property float nz
element face 21
property list uchar uint vertex_indices
end_header
1.299734 1.127167 0.000000 255 255 255 255
0.236786 1.113523 0.000000 255 255 255 255
1.299741 1.113523 0.000000 255 255 255 255
0.248719 1.100000 0.000000 255 255 255 255
1.299747 1.100000 0.000000 255 255 255 255
0.224496 1.099211 0.000000 255 255 255 255
0.217461 1.111536 0.000000 255 255 255 255
0.208094 1.091539 0.000000 255 255 255 255
0.174890 1.091562 0.000000 255 255 255 255
0.197044 1.102581 0.000000 255 255 255 255
0.018332 1.027078 0.000000 255 255 255 255
0.186032 1.080750 0.000000 255 255 255 255
-0.014265 1.017066 0.000000 255 255 255 255
0.161270 1.104778 0.000000 255 255 255 255
0.183538 1.116078 0.000000 255 255 255 255
0.204229 1.125153 0.000000 255 255 255 255
0.223815 1.127167 0.000000 255 255 255 255
0.076770 1.027285 0.000000 255 255 255 255
1.253580 1.099993 0.000000 0.000000 -0.000000 1.000000
0.190633 1.086349 0.000000 0.000000 -0.000000 1.000000
1.253587 1.086349 0.000000 0.000000 -0.000000 1.000000
0.202565 1.072826 0.000000 0.000000 -0.000000 1.000000
1.253593 1.072827 0.000000 0.000000 -0.000000 1.000000
0.178844 1.071034 0.000000 0.000000 -0.000000 1.000000
0.171307 1.084362 0.000000 0.000000 -0.000000 1.000000
0.159933 1.064867 0.000000 0.000000 -0.000000 1.000000
0.129238 1.067900 0.000000 0.000000 0.000000 1.000000
0.150890 1.077414 0.000000 0.000000 0.000000 1.000000
0.000272 1.012947 0.000000 0.000000 0.000000 1.000000
0.139377 1.054579 0.000000 0.000000 0.000000 1.000000
-0.030319 1.014976 0.000000 0.000000 -0.000000 1.000000
0.118628 1.080113 0.000000 0.000000 0.000000 1.000000
0.138387 1.090409 0.000000 0.000000 0.000000 1.000000
0.158075 1.097979 0.000000 -0.000000 0.000000 1.000000
0.177661 1.099993 0.000000 -0.000000 0.000000 1.000000
0.033124 1.009642 0.000000 0.000000 0.000000 1.000000
3 0 1 2
3 2 3 4
3 1 5 3

View File

@@ -1,23 +1,22 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
comment Created by Blender 2.93.3 - www.blender.org
element vertex 6
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
property float nx
property float ny
property float nz
element face 4
property list uchar uint vertex_indices
end_header
-0.275655 1.113506 0.000000 255 255 255 255
0.674727 1.100000 0.000000 255 255 255 255
0.675300 1.113506 0.000000 255 255 255 255
-0.275648 1.127145 0.000000 255 255 255 255
-0.275648 1.100000 0.000000 255 255 255 255
0.675290 1.127145 0.000000 255 255 255 255
-0.469445 1.086125 0.000000 0.000000 0.000000 1.000000
0.636913 1.072620 0.000000 0.000000 0.000000 1.000000
0.637580 1.086125 0.000000 0.000000 0.000000 1.000000
-0.469437 1.099764 0.000000 -0.000000 0.000000 1.000000
-0.469437 1.072620 0.000000 0.000000 0.000000 1.000000
0.637568 1.099764 0.000000 -0.000000 0.000000 1.000000
3 0 1 2
3 2 3 0
3 0 4 1