Compare commits

..

80 Commits
0.5 ... 0.5.2

Author SHA1 Message Date
Bruno
ef7722bb5c Better terminology and icons for SessionGroup 2021-02-22 14:06:10 +01:00
brunoherbelin
8019f4ea25 Cleanup blending update 2021-02-21 22:02:04 +01:00
Bruno
a612395ca3 Added Lighten only blending mode 2021-02-20 00:26:21 +01:00
brunoherbelin
4718bf166f Shading pre-multiplied alpha for simple shapes too 2021-02-19 16:53:38 +01:00
Bruno
f51bc1f1f4 New Blending with pre-multiplied alpha
Finally found how to improve blending modes by pre-multiplying color by alpha in the shader, so that the blending equations can be applied on top of the apha manipulation.
2021-02-18 23:36:01 +01:00
Bruno
64071a4a55 Merge remote-tracking branch 'origin/master' 2021-02-16 23:01:21 +01:00
Bruno
678bdf066e Temporarily acceptable SessionGroup with opaque background 2021-02-16 23:01:02 +01:00
Bruno
cb5562eca2 Blending with separate alpha and color functions 2021-02-16 23:01:02 +01:00
Bruno
23386fccc2 Minor improvement XML
Do not save timeline for single frame media
2021-02-16 23:01:02 +01:00
Bruno
4b1d6a8ac0 Temporarily acceptable SessionGroup with opaque background 2021-02-16 22:58:45 +01:00
Bruno
146408607a Blending with separate alpha and color functions 2021-02-16 22:58:19 +01:00
Bruno
ffee2f067a Minor improvement XML
Do not same timeline for single frame media
2021-02-16 22:57:40 +01:00
Bruno
935762506d Bugfix: frae grabber should be called in Mixer
Grab frames in session update fails with SessionSource and SessionGroups.
2021-02-16 22:50:15 +01:00
brunoherbelin
885ce67174 OSX compile fix 2021-02-15 09:03:30 +01:00
Bruno
e37b21760e BugFix: interrupting recursive session loading
Prevent crash on  recursive (infinite) loading of session file (containing itself).
2021-02-14 18:56:48 +01:00
Bruno
25c2bb59f5 Draft searchFileVisitor 2021-02-13 13:45:00 +01:00
brunoherbelin
a1e4709910 OGL optimization (no mipmap, antialias lines) 2021-02-13 12:39:21 +01:00
brunoherbelin
0593e46e62 Changed colors a bit
Selection area, group and pain tools matching the highlight color. White
mask tool.
2021-02-11 21:14:21 +01:00
brunoherbelin
dca3033c06 Bugfix; correcting introduced bug with RenderSource and new Session
resolution.
2021-02-11 20:28:57 +01:00
brunoherbelin
d45554e162 Eyecandy: better color and transparency for icons in Mixing and Layer
views
2021-02-09 18:52:26 +01:00
brunoherbelin
8c4d3f3a18 Unified use of SessionSource in Mixer (import) for SessionFile and
SessionGroup sources.
2021-02-09 18:47:54 +01:00
Bruno
6bb5c0d208 Merge remote-tracking branch 'origin/master' 2021-02-09 18:35:55 +01:00
brunoherbelin
209caadd44 Bugfix in realtime vtenc OSX recording (allow-frame-reordering=0) 2021-02-08 12:09:53 +01:00
Bruno
89fa11447a New decoration frame for group in Layers view 2021-02-07 23:22:15 +01:00
Bruno
84416f566b Early implementation of groups: SessionGroupSource.
Rename SessionSource to SessionFileSource.
2021-02-07 22:01:07 +01:00
Bruno
65564065d9 New Symbol cube 2021-02-07 20:48:32 +01:00
Bruno
79540c0232 cleanup header 2021-02-07 20:48:10 +01:00
Bruno
5d23a285b4 get color of highlight 2021-02-07 20:47:55 +01:00
Bruno
1964a26fc3 add source find by depth 2021-02-07 20:46:30 +01:00
Bruno
e37a189bae add pop of source in selection 2021-02-07 20:45:13 +01:00
Bruno
5328995a79 added force non visible to BBox visitor 2021-02-07 20:43:56 +01:00
brunoherbelin
6929eb3307 Minor improvement log window 2021-02-05 22:27:47 +01:00
brunoherbelin
33f00f9da4 Bugfix (crash when reordering source) 2021-02-05 19:04:13 +01:00
brunoherbelin
34380e8592 BugFix: copy-paste a selection containing a source and its clone: fixed
that the clone is created (after the source).
2021-02-05 18:16:13 +01:00
brunoherbelin
8185c93457 Fixed replacement of failed RenderView after sessionSource import (if a
sessionSource contains a RenderView, the later should be re-created).
2021-02-05 18:11:16 +01:00
brunoherbelin
93b6bc9ca4 Bugfix in Recursive loopback of RenderView inside a SessionSource: fixed
loading and import into main session.
2021-02-04 23:25:49 +01:00
brunoherbelin
d76dfa4a9d Revert "Cleanup tooltips."
This reverts commit d23267d333.
2021-02-04 22:45:13 +01:00
brunoherbelin
d23267d333 Cleanup tooltips. 2021-01-31 20:09:11 +01:00
brunoherbelin
e8a258094f Eye candy on help markers and icon; added display of shortcut on the
side (grey text).
2021-01-31 14:18:43 +01:00
brunoherbelin
ffb30bc292 Slight modification of button play behavior in transition view (allows to
stop animation)
2021-01-30 23:51:39 +01:00
brunoherbelin
fa798c8809 Fixed position of UI in views to match ImGui size 2021-01-30 23:40:31 +01:00
brunoherbelin
ac15bbc840 Display preview of source centered in fixed-size preview area. 2021-01-30 23:23:30 +01:00
brunoherbelin
e26052013c Matching creation of new session source with recent changes on
SessionSource.
2021-01-30 22:45:27 +01:00
brunoherbelin
9215be6bfc ..and also reset fading after new empty session is created. 2021-01-30 22:43:22 +01:00
brunoherbelin
691c6d174b Bugfix in rare cases of smooth transition and combined session fading. 2021-01-30 22:34:16 +01:00
brunoherbelin
4bc9bf581e Cleanup pattern and session sources 2021-01-30 16:03:26 +01:00
brunoherbelin
3686106dab Bugfix restoring aspect ratio action. 2021-01-30 16:02:38 +01:00
brunoherbelin
62bc779dee Import of SessionSource: the merging of sources in session now applies
transformations of the sessionsource; so visually nothing (almost)
should change on the output.
2021-01-30 12:26:49 +01:00
brunoherbelin
843fa86c00 Depth management: layer actions operate on depth only (Z), and update of
source places the icon in LayerView (X,Y)
2021-01-30 12:24:18 +01:00
brunoherbelin
9bfc5b269a Fixed session source import; merge sources from the inside session,
adjust their alpha and depth, and delete former session source
immediately.
2021-01-29 22:32:02 +01:00
brunoherbelin
a7b6a67a92 reimplementation of LineSquare using rectangular polygons for horizontal
and vertical lines.
2021-01-28 13:50:31 +01:00
brunoherbelin
9b795a0df7 Improved time management for software framerate limiter. 2021-01-27 09:35:46 +01:00
brunoherbelin
29c40036b2 have to use ALT+TAB for view switcher in OSX 2021-01-26 22:35:59 +01:00
brunoherbelin
49e845137a Make CTRL+TAB compatible for OSX 2021-01-26 22:23:28 +01:00
brunoherbelin
394bfe2da4 Size dependent spaces for combo box in views. 2021-01-26 22:17:28 +01:00
brunoherbelin
6607bd319c New view navigation with [CTRL+TAB] 2021-01-26 22:16:57 +01:00
brunoherbelin
54c5eb6155 Reordering of Sources in list. 2021-01-25 22:24:08 +01:00
brunoherbelin
49ec387cfa New icon. 2021-01-25 19:17:43 +01:00
brunoherbelin
0ef6164b24 Added close icon to widgets. 2021-01-24 23:02:27 +01:00
brunoherbelin
87a25ca19f Improved transition view interface. 2021-01-24 22:31:09 +01:00
brunoherbelin
e564b63f77 Added icon to toggle lock in pannel (and fixed icon) 2021-01-24 22:18:31 +01:00
brunoherbelin
0e6ad3e25c BugFix changing workspace current selected source. 2021-01-24 20:41:06 +01:00
brunoherbelin
c3442a1090 Using brush settings in AppearanceView 2021-01-24 20:21:26 +01:00
brunoherbelin
83e5c37b60 Use settings for global brush parmeters. 2021-01-24 19:23:51 +01:00
Bruno
2dda3da8b1 thematic color of View UI 2021-01-24 18:21:14 +01:00
brunoherbelin
7e6ee0806d oops; terminate properly painting action. 2021-01-24 17:44:09 +01:00
Bruno
9c0adb4ce6 Important feature: source locking and workspace.
Source locking property, views ability to test if a source is selectable, change of selection when switch view, picking testing locking and workspace.
2021-01-24 17:19:41 +01:00
Bruno
b17136d23a Improved DrawVisitor to accept list of nodes 2021-01-24 17:16:28 +01:00
Bruno
edeec9568e Mixer Utility to deselect quickly a source 2021-01-24 10:55:19 +01:00
Bruno
e5ed27180f New buttons and icon modes 2021-01-24 10:54:25 +01:00
Bruno
207ac11ded Improved and new icons 2021-01-24 10:53:18 +01:00
brunoherbelin
2bc8420c24 New decoration handle for locked/unlocked. Bugfix picking mirrored
handles.
2021-01-23 10:08:26 +01:00
brunoherbelin
f4048fca04 Increased size of source icon 2021-01-21 23:02:50 +01:00
brunoherbelin
9942d8e628 Do not warn about canceled session set. Information message when user
quits transtition.
2021-01-21 22:47:58 +01:00
brunoherbelin
2fe282ef6a new Gui icon button 2021-01-21 22:31:43 +01:00
brunoherbelin
12dcd34b3d New eye icon 2021-01-21 21:14:13 +01:00
brunoherbelin
0cf4732347 (no change - keep code for later) 2021-01-19 19:08:19 +01:00
brunoherbelin
4e6a402142 Improved message and log. 2021-01-19 19:07:24 +01:00
brunoherbelin
9449936df0 Making sure disabling accelerated hardware acceleration on codec
decoding discards the corresponding gstreamer decoders.
2021-01-18 18:30:16 +01:00
brunoherbelin
7c555465b8 Bugfix copy imageprocessing shader should not copy shader properties 2021-01-18 18:24:36 +01:00
88 changed files with 8522 additions and 2710 deletions

View File

@@ -6,7 +6,7 @@
#include "Primitives.h"
#include "Decorations.h"
BoundingBoxVisitor::BoundingBoxVisitor(): Visitor()
BoundingBoxVisitor::BoundingBoxVisitor(bool force): force_(force)
{
modelview_ = glm::identity<glm::mat4>();
@@ -35,7 +35,7 @@ void BoundingBoxVisitor::visit(Group &n)
return;
glm::mat4 mv = modelview_;
for (NodeSet::iterator node = n.begin(); node != n.end(); node++) {
if ( (*node)->visible_ )
if ( (*node)->visible_ || force_)
(*node)->accept(*this);
modelview_ = mv;
}
@@ -46,14 +46,13 @@ void BoundingBoxVisitor::visit(Switch &n)
if (!n.visible_ || n.numChildren() < 1)
return;
glm::mat4 mv = modelview_;
n.activeChild()->accept(*this);
if ( n.activeChild()->visible_ || force_)
n.activeChild()->accept(*this);
modelview_ = mv;
}
void BoundingBoxVisitor::visit(Primitive &n)
{
if (!n.visible_)
return;
bbox_.extend(n.bbox().transformed(modelview_));
@@ -64,3 +63,4 @@ void BoundingBoxVisitor::visit(Scene &n)
{
n.ws()->accept(*this);
}

View File

@@ -8,11 +8,11 @@
class BoundingBoxVisitor: public Visitor
{
glm::mat4 modelview_;
bool force_;
GlmToolkit::AxisAlignedBoundingBox bbox_;
public:
BoundingBoxVisitor();
BoundingBoxVisitor(bool force = false);
void setModelview(glm::mat4 modelview);
GlmToolkit::AxisAlignedBoundingBox bbox();
@@ -23,6 +23,7 @@ public:
void visit(Group& n) override;
void visit(Switch& n) override;
void visit(Primitive& n) override;
};
#endif // BOUNDINGBOXVISITOR_H

View File

@@ -303,6 +303,7 @@ set(VMIX_RSC_FILES
./rsc/shaders/mask_draw.fs
./rsc/shaders/image.vs
./rsc/shaders/imageprocessing.fs
./rsc/shaders/imageblending.fs
./rsc/fonts/Hack-Regular.ttf
./rsc/fonts/Roboto-Regular.ttf
./rsc/fonts/Roboto-Bold.ttf
@@ -335,9 +336,14 @@ set(VMIX_RSC_FILES
./rsc/mesh/corner.ply
./rsc/mesh/shadow.ply
./rsc/mesh/glow.ply
./rsc/mesh/border_round_left.ply
./rsc/mesh/border_round.ply
./rsc/mesh/border_top.ply
./rsc/mesh/border_perspective_round_left.ply
./rsc/mesh/border_perspective_round.ply
./rsc/mesh/border_perspective_top.ply
./rsc/mesh/border_sharp.ply
./rsc/mesh/border_large_round_left.ply
./rsc/mesh/border_large_round.ply
./rsc/mesh/border_large_top.ply
./rsc/mesh/border_handles_rotation.ply
@@ -347,6 +353,8 @@ set(VMIX_RSC_FILES
./rsc/mesh/border_handles_sharp.ply
./rsc/mesh/border_handles_menu.ply
./rsc/mesh/border_handles_crop.ply
./rsc/mesh/border_handles_lock.ply
./rsc/mesh/border_handles_lock_open.ply
./rsc/mesh/border_handles_shadow.ply
./rsc/mesh/border_large_sharp.ply
./rsc/mesh/border_vertical_overlay.ply
@@ -364,6 +372,7 @@ set(VMIX_RSC_FILES
./rsc/mesh/icon_share.ply
./rsc/mesh/icon_clone.ply
./rsc/mesh/icon_vimix.ply
./rsc/mesh/icon_group_vimix.ply
./rsc/mesh/icon_circles.ply
./rsc/mesh/icon_dots.ply
./rsc/mesh/icon_empty.ply
@@ -377,6 +386,10 @@ set(VMIX_RSC_FILES
./rsc/mesh/icon_grid.ply
./rsc/mesh/icon_rightarrow.ply
./rsc/mesh/icon_crop.ply
./rsc/mesh/icon_eye.ply
./rsc/mesh/icon_eye_slash.ply
./rsc/mesh/icon_vector_square_slash.ply
./rsc/mesh/icon_cube.ply
./rsc/mesh/h_line.ply
./rsc/mesh/h_mark.ply
)
@@ -471,7 +484,7 @@ SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
SET(CPACK_PACKAGE_CONTACT "bruno.herbelin@gmail.com")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING.txt")
SET(CPACK_PACKAGE_VERSION_MAJOR "0")
SET(CPACK_PACKAGE_VERSION_MINOR "4")
SET(CPACK_PACKAGE_VERSION_MINOR "5")
SET(CPACK_PACKAGE_VENDOR "Bruno Herbelin")
SET(CPACK_SOURCE_IGNORE_FILES
"/\\\\.git/"

View File

@@ -12,7 +12,8 @@
#include "Log.h"
Frame::Frame(CornerType corner, BorderType border, ShadowType shadow) : Node(), side_(nullptr), top_(nullptr), shadow_(nullptr), square_(nullptr)
Frame::Frame(CornerType corner, BorderType border, ShadowType shadow) : Node(),
right_(nullptr), left_(nullptr), top_(nullptr), shadow_(nullptr), square_(nullptr)
{
static Mesh *shadows[3] = {nullptr};
if (shadows[0] == nullptr) {
@@ -20,33 +21,54 @@ Frame::Frame(CornerType corner, BorderType border, ShadowType shadow) : Node(),
shadows[1] = new Mesh("mesh/shadow.ply", "images/shadow.dds");
shadows[2] = new Mesh("mesh/shadow_perspective.ply", "images/shadow_perspective.dds");
}
static Mesh *frames[4] = {nullptr};
static Mesh *frames[9] = {nullptr};
if (frames[0] == nullptr) {
frames[0] = new Mesh("mesh/border_round.ply");
frames[1] = new Mesh("mesh/border_top.ply");
frames[2] = new Mesh("mesh/border_large_round.ply");
frames[3] = new Mesh("mesh/border_large_top.ply");
frames[1] = new Mesh("mesh/border_round_left.ply");
frames[2] = new Mesh("mesh/border_top.ply");
frames[3] = new Mesh("mesh/border_large_round.ply");
frames[4] = new Mesh("mesh/border_large_round_left.ply");
frames[5] = new Mesh("mesh/border_large_top.ply");
frames[6] = new Mesh("mesh/border_perspective_round.ply");
frames[7] = new Mesh("mesh/border_perspective_round_left.ply");
frames[8] = new Mesh("mesh/border_perspective_top.ply");
}
static LineSquare *sharpframethin = new LineSquare( 3 );
static LineSquare *sharpframelarge = new LineSquare( 5 );
static LineSquare *sharpframethin = new LineSquare( 4.f );
static LineSquare *sharpframelarge = new LineSquare( 6.f );
if (corner == SHARP) {
// Round corners
if (corner == ROUND){
if (border == THIN) {
right_ = frames[0];
left_ = frames[1];
top_ = frames[2];
}
else{
right_ = frames[3];
left_ = frames[4];
top_ = frames[5];
}
}
// Group corners
else if (corner == GROUP){
if (border == THIN) {
right_ = frames[6];
left_ = frames[7];
top_ = frames[8];
}
else{
right_ = frames[6];
left_ = frames[7];
top_ = frames[8];
}
}
// Sharp corner
else {
if (border == LARGE)
square_ = sharpframelarge;
else
square_ = sharpframethin;
}
else {
// Round corners
if (border == THIN) {
side_ = frames[0];
top_ = frames[1];
}
else{
side_ = frames[2];
top_ = frames[3];
}
}
switch (shadow) {
default:
@@ -76,8 +98,10 @@ void Frame::update( float dt )
Node::update(dt);
if(top_)
top_->update(dt);
if(side_)
side_->update(dt);
if(right_)
right_->update(dt);
if(left_)
left_->update(dt);
if(shadow_)
shadow_->update(dt);
if(square_)
@@ -87,9 +111,11 @@ void Frame::update( float dt )
void Frame::draw(glm::mat4 modelview, glm::mat4 projection)
{
if ( !initialized() ) {
if(side_ && !side_->initialized())
side_->init();
if(top_ && !top_->initialized())
if(right_ && !right_->initialized())
right_->init();
if(left_ && !left_->initialized())
left_->init();
if(top_ && !top_->initialized())
top_->init();
if(shadow_ && !shadow_->initialized())
shadow_->init();
@@ -102,27 +128,28 @@ void Frame::draw(glm::mat4 modelview, glm::mat4 projection)
glm::mat4 ctm = modelview * transform_;
// sharp border (scaled)
if(square_) {
square_->setColor(color);
square_->draw( ctm, projection);
}
// shadow (scaled)
if(shadow_){
shadow_->shader()->color.a = 0.98f;
shadow_->draw( ctm, projection);
}
// top (scaled)
// round top (scaled)
if(top_) {
top_->shader()->color = color;
top_->draw( ctm, projection);
}
// top (scaled)
if(square_) {
square_->shader()->color = color;
square_->draw( ctm, projection);
}
// round sides
if(right_) {
if(side_) {
side_->shader()->color = color;
right_->shader()->color = color;
// get scale
glm::vec4 scale = ctm * glm::vec4(1.f, 1.0f, 0.f, 0.f);
@@ -132,17 +159,26 @@ void Frame::draw(glm::mat4 modelview, glm::mat4 projection)
glm::vec4 vec = ctm * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
if(side_) {
// right side
vec = ctm * glm::vec4(1.f, 0.f, 0.f, 1.f);
right_->draw( GlmToolkit::transform(vec, rot, glm::vec3(scale.y, scale.y, 1.f)), projection );
// left side
vec = ctm * glm::vec4(1.f, 0.f, 0.f, 1.f);
side_->draw( GlmToolkit::transform(vec, rot, glm::vec3(scale.y, scale.y, 1.f)), projection );
}
if(left_) {
// right side
vec = ctm * glm::vec4(-1.f, 0.f, 0.f, 1.f);
side_->draw( GlmToolkit::transform(vec, rot, glm::vec3(-scale.y, scale.y, 1.f)), projection );
left_->shader()->color = color;
}
// get scale
glm::vec4 scale = ctm * glm::vec4(1.f, 1.0f, 0.f, 0.f);
// get rotation
glm::vec3 rot(0.f);
glm::vec4 vec = ctm * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
// right side
vec = ctm * glm::vec4(-1.f, 0.f, 0.f, 1.f);
left_->draw( GlmToolkit::transform(vec, rot, glm::vec3(scale.y, scale.y, 1.f)), projection );
}
}
}
@@ -161,6 +197,8 @@ Handles::Handles(Type type) : Node(), type_(type)
static Mesh *handle_scale = new Mesh("mesh/border_handles_scale.ply");
static Mesh *handle_crop = new Mesh("mesh/border_handles_crop.ply");
static Mesh *handle_menu = new Mesh("mesh/border_handles_menu.ply");
static Mesh *handle_lock = new Mesh("mesh/border_handles_lock.ply");
static Mesh *handle_unlock = new Mesh("mesh/border_handles_lock_open.ply");
static Mesh *handle_shadow = new Mesh("mesh/border_handles_shadow.ply", "images/soft_shadow.dds");
if ( type_ == Handles::ROTATE ) {
@@ -175,6 +213,12 @@ Handles::Handles(Type type) : Node(), type_(type)
else if ( type_ == Handles::CROP ) {
handle_ = handle_crop;
}
else if ( type_ == Handles::LOCKED ) {
handle_ = handle_lock;
}
else if ( type_ == Handles::UNLOCKED ) {
handle_ = handle_unlock;
}
else {
handle_ = handle_corner;
}
@@ -212,16 +256,13 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
handle_->shader()->color = color;
handle_active->shader()->color = color;
// extract rotation from modelview
glm::mat4 ctm;
glm::vec3 rot(0.f);
glm::vec4 vec = modelview * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
glm::vec4 vec;
glm::vec3 tra, rot, sca;
// extract scaling and mirroring
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
glm::vec4 mirror = glm::sign(vec);
// get rotation and mirroring from the modelview
GlmToolkit::inverse_transform(modelview, tra, rot, sca);
glm::vec3 mirror = glm::sign(sca);
if ( type_ == Handles::RESIZE ) {
@@ -299,7 +340,7 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
glm::vec4 pos = ctm * glm::vec4(mirror.x * 0.12f, mirror.x * -0.12f, 0.f, 1.f);
// 2. ..from the bottom right corner (1,1)
vec = ( modelview * glm::vec4(1.f, -1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, glm::vec3(mirror.x, mirror.y, 1.f));
ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw
shadow_->draw( ctm, projection );
handle_->draw( ctm, projection );
@@ -309,9 +350,9 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
// 1. Fixed displacement by (0.12,0.12) along the rotation..
ctm = GlmToolkit::transform(glm::vec4(0.f), rot, mirror);
glm::vec4 pos = ctm * glm::vec4(mirror.x * 0.12f, mirror.x * 0.12f, 0.f, 1.f);
// 2. ..from the bottom right corner (1,1)
// 2. ..from the bottom right corner (1,-1)
vec = ( modelview * glm::vec4(-1.f, -1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, glm::vec3(mirror.x, mirror.y, 1.f));
ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw
shadow_->draw( ctm, projection );
handle_->draw( ctm, projection );
@@ -323,7 +364,19 @@ void Handles::draw(glm::mat4 modelview, glm::mat4 projection)
glm::vec4 pos = ctm * glm::vec4( -0.12f, 0.12f, 0.f, 1.f);
// 2. ..from the top right corner (1,1)
vec = ( modelview * glm::vec4(-1.f, 1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, glm::vec3(1.f));
ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw
shadow_->draw( ctm, projection );
handle_->draw( ctm, projection );
}
else if ( type_ == Handles::LOCKED || type_ == Handles::UNLOCKED ){
// one icon in top left corner
// 1. Fixed displacement by (-0.12,0.12) along the rotation..
ctm = GlmToolkit::transform(glm::vec4(0.f), rot, mirror);
glm::vec4 pos = ctm * glm::vec4( -0.12f, 0.12f, 0.f, 1.f);
// 2. ..from the bottom right corner (1,-1)
vec = ( modelview * glm::vec4(1.f, -1.f, 0.f, 1.f) ) + pos;
ctm = GlmToolkit::transform(vec, rot, mirror);
// 3. draw
shadow_->draw( ctm, projection );
handle_->draw( ctm, projection );
@@ -359,10 +412,14 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
shadows[CLONE] = shadow;
icons[RENDER] = new Mesh("mesh/icon_render.ply");
shadows[RENDER] = shadow;
icons[GROUP] = new Mesh("mesh/icon_group_vimix.ply");
shadows[GROUP] = shadow;
icons[PATTERN] = new Mesh("mesh/icon_gear.ply");
shadows[PATTERN]= shadow;
icons[CAMERA] = new Mesh("mesh/icon_camera.ply");
shadows[CAMERA] = shadow;
icons[CUBE] = new Mesh("mesh/icon_cube.ply");
shadows[CUBE] = shadow;
icons[SHARE] = new Mesh("mesh/icon_share.ply");
shadows[SHARE] = shadow;
icons[DOTS] = new Mesh("mesh/icon_dots.ply");
@@ -373,6 +430,12 @@ Symbol::Symbol(Type t, glm::vec3 pos) : Node(), type_(t)
shadows[LOCK] = shadow;
icons[UNLOCK] = new Mesh("mesh/icon_unlock.ply");
shadows[UNLOCK] = shadow;
icons[EYE] = new Mesh("mesh/icon_eye.ply");
shadows[EYE] = shadow;
icons[EYESLASH] = new Mesh("mesh/icon_eye_slash.ply");
shadows[EYESLASH] = shadow;
icons[VECTORSLASH] = new Mesh("mesh/icon_vector_square_slash.ply");
shadows[VECTORSLASH] = shadow;
icons[ARROWS] = new Mesh("mesh/icon_rightarrow.ply");
shadows[ARROWS] = shadow;
icons[CIRCLE] = new Mesh("mesh/icon_circle.ply");

View File

@@ -12,7 +12,7 @@ class Frame : public Node
{
public:
typedef enum { ROUND = 0, SHARP } CornerType;
typedef enum { ROUND = 0, SHARP, GROUP } CornerType;
typedef enum { THIN = 0, LARGE } BorderType;
typedef enum { NONE = 0, GLOW, DROP, PERSPECTIVE } ShadowType;
@@ -23,11 +23,11 @@ public:
void draw (glm::mat4 modelview, glm::mat4 projection) override;
void accept (Visitor& v) override;
Mesh *border() const { return side_; }
glm::vec4 color;
protected:
Mesh *side_;
Mesh *right_;
Mesh *left_;
Mesh *top_;
Mesh *shadow_;
LineSquare *square_;
@@ -36,7 +36,7 @@ protected:
class Handles : public Node
{
public:
typedef enum { RESIZE = 0, RESIZE_H, RESIZE_V, ROTATE, SCALE, CROP, MENU } Type;
typedef enum { RESIZE = 0, RESIZE_H, RESIZE_V, ROTATE, SCALE, CROP, MENU, LOCKED, UNLOCKED } Type;
Handles(Type type);
~Handles();
@@ -60,8 +60,8 @@ protected:
class Symbol : public Node
{
public:
typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, VIDEO, SESSION, CLONE, RENDER, PATTERN, CAMERA, SHARE,
DOTS, BUSY, LOCK, UNLOCK, ARROWS, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type;
typedef enum { CIRCLE_POINT = 0, SQUARE_POINT, IMAGE, VIDEO, SESSION, CLONE, RENDER, GROUP, PATTERN, CAMERA, CUBE, SHARE,
DOTS, BUSY, LOCK, UNLOCK, EYE, EYESLASH, VECTORSLASH, ARROWS, CROP, CIRCLE, SQUARE, CLOCK, CLOCK_H, GRID, CROSS, EMPTY } Type;
Symbol(Type t = CIRCLE_POINT, glm::vec3 pos = glm::vec3(0.f));
~Symbol();

View File

@@ -331,7 +331,8 @@ DeviceSource::DeviceSource() : StreamSource()
stream_ = new Stream;
// set symbol
symbol_ = new Symbol(Symbol::CAMERA, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::CAMERA, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
DeviceSource::~DeviceSource()

View File

@@ -1,3 +1,4 @@
#include <algorithm>
#include <glm/gtc/matrix_transform.hpp>
@@ -8,14 +9,21 @@
DrawVisitor::DrawVisitor(Node *nodetodraw, glm::mat4 projection, bool force): force_(force)
{
target_ = nodetodraw;
targets_.push_back(nodetodraw);
modelview_ = glm::identity<glm::mat4>();
projection_ = projection;
done_ = false;
num_duplicat_ = 1;
transform_duplicat_ = glm::identity<glm::mat4>();
}
DrawVisitor::DrawVisitor(std::vector<Node *> nodestodraw, glm::mat4 projection, bool force): force_(force)
{
targets_ = nodestodraw;
modelview_ = glm::identity<glm::mat4>();
projection_ = projection;
num_duplicat_ = 1;
transform_duplicat_ = glm::identity<glm::mat4>();
}
void DrawVisitor::loop(int num, glm::mat4 transform)
{
@@ -30,22 +38,25 @@ void DrawVisitor::visit(Node &n)
if (force_)
n.visible_ = true;
// draw the target
if ( target_ && n.id() == target_->id()) {
// find the node with this id
std::vector<Node *>::iterator it = std::find_if(targets_.begin(), targets_.end(), hasId(n.id()));
// found this node in the list of targets: draw it
if (it != targets_.end()) {
targets_.erase(it);
for (int i = 0; i < num_duplicat_; ++i) {
// draw multiple copies if requested
n.draw(modelview_, projection_);
modelview_ *= transform_duplicat_;
}
done_ = true;
}
// restore visibility
n.visible_ = v;
if (done_) return;
if (targets_.empty()) return;
// update transform
modelview_ *= n.transform_;
@@ -55,11 +66,11 @@ void DrawVisitor::visit(Node &n)
void DrawVisitor::visit(Group &n)
{
// no need to traverse deeper if this node was drawn already
if (done_) return;
if (targets_.empty()) return;
// traverse children
glm::mat4 mv = modelview_;
for (NodeSet::iterator node = n.begin(); !done_ && node != n.end(); node++) {
for (NodeSet::iterator node = n.begin(); !targets_.empty() && node != n.end(); node++) {
if ( (*node)->visible_ || force_)
(*node)->accept(*this);
modelview_ = mv;
@@ -68,7 +79,6 @@ void DrawVisitor::visit(Group &n)
void DrawVisitor::visit(Scene &n)
{
done_ = false;
modelview_ = glm::identity<glm::mat4>();
n.root()->accept(*this);
}
@@ -76,7 +86,7 @@ void DrawVisitor::visit(Scene &n)
void DrawVisitor::visit(Switch &n)
{
// no need to traverse deeper if this node was drawn already
if (done_) return;
if (targets_.empty()) return;
// traverse acive child
glm::mat4 mv = modelview_;

View File

@@ -1,21 +1,21 @@
#ifndef DRAWVISITOR_H
#define DRAWVISITOR_H
#include <glm/glm.hpp>
#include "GlmToolkit.h"
#include "Visitor.h"
class DrawVisitor : public Visitor
{
glm::mat4 modelview_;
glm::mat4 projection_;
Node *target_;
bool done_;
std::vector<Node *> targets_;
bool force_;
int num_duplicat_;
glm::mat4 transform_duplicat_;
public:
DrawVisitor(Node *nodetodraw, glm::mat4 projection, bool force = false);
DrawVisitor(std::vector<Node *> nodestodraw, glm::mat4 projection, bool force = false);
void loop(int num, glm::mat4 transform);

View File

@@ -56,8 +56,8 @@ FrameBuffer::FrameBuffer(glm::vec3 resolution, bool useAlpha, bool multiSampling
use_alpha_(useAlpha), use_multi_sampling_(multiSampling)
{
attrib_.viewport = glm::ivec2(resolution);
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f);
setProjectionArea(glm::vec2(1.f, 1.f));
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, 0.f);
}
FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampling):
@@ -65,8 +65,8 @@ FrameBuffer::FrameBuffer(uint width, uint height, bool useAlpha, bool multiSampl
use_alpha_(useAlpha), use_multi_sampling_(multiSampling)
{
attrib_.viewport = glm::ivec2(width, height);
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, use_alpha_ ? 0.f : 1.f);
setProjectionArea(glm::vec2(1.f, 1.f));
attrib_.clear_color = glm::vec4(0.f, 0.f, 0.f, 0.f);
}
void FrameBuffer::init()

View File

@@ -80,7 +80,7 @@ protected:
*/
class FrameGrabbing
{
friend class Session;
friend class Mixer;
// Private Constructor
FrameGrabbing();

View File

@@ -4,6 +4,7 @@
#include <glm/gtc/matrix_access.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/vector_angle.hpp>
#include <glm/gtc/random.hpp>
#include <chrono>
@@ -27,6 +28,25 @@ glm::mat4 GlmToolkit::transform(glm::vec3 translation, glm::vec3 rotation, glm::
return View * Model;
}
void GlmToolkit::inverse_transform(glm::mat4 M, glm::vec3 &translation, glm::vec3 &rotation, glm::vec3 &scale)
{
// extract rotation from modelview
glm::mat4 ctm;
glm::vec3 rot(0.f);
glm::vec4 vec = M * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
rotation = rot;
// extract scaling
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * M ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
scale = glm::vec3(vec.x, vec.y, 1.f);
// extract translation
vec = M * glm::vec4(0.f, 0.f, 0.f, 1.f);
translation = glm::vec3(vec);
}
GlmToolkit::AxisAlignedBoundingBox::AxisAlignedBoundingBox() {
mMin = glm::vec3(1.f);

View File

@@ -13,6 +13,7 @@ uint64_t uniqueId();
// get Matrix for these transformation components
glm::mat4 transform(glm::vec3 translation, glm::vec3 rotation, glm::vec3 scale);
void inverse_transform(glm::mat4 M, glm::vec3 &translation, glm::vec3 &rotation, glm::vec3 &scale);
class AxisAlignedBoundingBox
{

View File

@@ -137,7 +137,7 @@ string GstToolkit::gst_version()
// see https://developer.ridgerun.com/wiki/index.php?title=GStreamer_modify_the_elements_rank
std::list<std::string> GstToolkit::enable_gpu_decoding_plugins()
std::list<std::string> GstToolkit::enable_gpu_decoding_plugins(bool enable)
{
static list<string> pluginslist;
static GstRegistry* plugins_register = nullptr;
@@ -162,7 +162,7 @@ std::list<std::string> GstToolkit::enable_gpu_decoding_plugins()
GstPluginFeature* feature = gst_registry_lookup_feature(plugins_register, plugins[i]);
if(feature != NULL) {
pluginslist.push_front( string( plugins[i] ) );
gst_plugin_feature_set_rank(feature, GST_RANK_PRIMARY + 1);
gst_plugin_feature_set_rank(feature, enable ? GST_RANK_PRIMARY + 1 : GST_RANK_MARGINAL);
gst_object_unref(feature);
}
}

View File

@@ -21,7 +21,7 @@ std::string filename_to_uri(std::string filename);
std::string gst_version();
std::list<std::string> all_plugins();
std::list<std::string> enable_gpu_decoding_plugins();
std::list<std::string> enable_gpu_decoding_plugins(bool enable = true);
std::list<std::string> all_plugin_features(std::string pluginname);
bool enable_feature (std::string name, bool enable);

View File

@@ -25,6 +25,7 @@
#include "GstToolkit.h"
#include "SystemToolkit.h"
unsigned int textureicons = 0;
std::map <ImGuiToolkit::font_style, ImFont*>fontmap;
@@ -90,14 +91,14 @@ void ImGuiToolkit::ButtonSwitch(const char* label, bool* toggle, const char* hel
// hover
ImU32 col_bg;
if (ImGui::IsItemHovered())
if (ImGui::IsItemHovered()) //
col_bg = ImGui::GetColorU32(ImLerp(colors[ImGuiCol_FrameBgHovered], colors[ImGuiCol_TabHovered], t));
else
col_bg = ImGui::GetColorU32(ImLerp(colors[ImGuiCol_FrameBg], colors[ImGuiCol_TabActive], t));
// draw help text if present
if (help) {
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6, 0.6, 0.6, 1.f));
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6, 0.6, 0.6, 0.9f));
ImGui::RenderText(draw_pos, help);
ImGui::PopStyleColor(1);
}
@@ -115,7 +116,7 @@ void ImGuiToolkit::ButtonSwitch(const char* label, bool* toggle, const char* hel
}
void ImGuiToolkit::Icon(int i, int j)
void ImGuiToolkit::Icon(int i, int j, bool enabled)
{
// icons.dds is a 20 x 20 grid of icons
if (textureicons == 0)
@@ -123,7 +124,11 @@ void ImGuiToolkit::Icon(int i, int j)
ImVec2 uv0( static_cast<float>(i) * 0.05, static_cast<float>(j) * 0.05 );
ImVec2 uv1( uv0.x + 0.05, uv0.y + 0.05 );
ImGui::Image((void*)(intptr_t)textureicons, ImVec2(ImGui::GetTextLineHeightWithSpacing(), ImGui::GetTextLineHeightWithSpacing()), uv0, uv1);
ImVec4 tint_color = ImGui::GetStyle().Colors[ImGuiCol_Text];
if (!enabled)
tint_color = ImVec4(0.6f, 0.6f, 0.6f, 0.8f);
ImGui::Image((void*)(intptr_t)textureicons, ImVec2(ImGui::GetTextLineHeightWithSpacing(), ImGui::GetTextLineHeightWithSpacing()), uv0, uv1, tint_color);
}
bool ImGuiToolkit::ButtonIcon(int i, int j, const char *tooltip)
@@ -168,6 +173,34 @@ bool ImGuiToolkit::ButtonIconToggle(int i, int j, int i_toggle, int j_toggle, bo
}
bool ImGuiToolkit::IconButton(int i, int j, const char *tooltip)
{
bool ret = false;
ImGui::PushID( i * 20 + j );
float frame_height = ImGui::GetFrameHeight();
float frame_width = frame_height;
ImVec2 draw_pos = ImGui::GetCursorScreenPos();
// toggle action : operate on the whole area
ImGui::InvisibleButton("##iconbutton", ImVec2(frame_width, frame_height));
if (ImGui::IsItemClicked())
ret = true;
ImGui::SetCursorScreenPos(draw_pos);
Icon(i, j, !ret);
if (tooltip != nullptr && ImGui::IsItemHovered())
{
ImGui::BeginTooltip();
ImGui::Text("%s", tooltip);
ImGui::EndTooltip();
}
ImGui::PopID();
return ret;
}
bool ImGuiToolkit::IconToggle(int i, int j, int i_toggle, int j_toggle, bool* toggle, const char *tooltips[])
{
bool ret = false;
@@ -186,10 +219,10 @@ bool ImGuiToolkit::IconToggle(int i, int j, int i_toggle, int j_toggle, bool* to
ImGui::SetCursorScreenPos(draw_pos);
if (*toggle) {
Icon(i_toggle, j_toggle);
Icon(i_toggle, j_toggle, !ret);
}
else {
Icon(i, j);
Icon(i, j, !ret);
}
int tooltipid = *toggle ? 1 : 0;
@@ -232,6 +265,42 @@ bool ImGuiToolkit::ButtonIconMultistate(std::vector<std::pair<int, int> > icons,
return ret;
}
bool ImGuiToolkit::ComboIcon (std::vector<std::pair<int, int> > icons, int* state)
{
bool ret = false;
Sum id = std::for_each(icons.begin(), icons.end(), Sum());
ImGui::PushID( id.sum );
ImVec2 draw_pos = ImGui::GetCursorScreenPos();
float w = ImGui::GetTextLineHeight();
ImGui::SetNextItemWidth(w * 2.6f);
if (ImGui::BeginCombo("##ComboIcon", " ") )
{
std::vector<std::pair<int, int> >::iterator it = icons.begin();
for(int i = 0 ; it != icons.end(); i++, it++) {
ImGui::PushID( id.sum + i + 1);
ImVec2 pos = ImGui::GetCursorScreenPos();
// combo selectable item
if ( ImGui::Selectable(" ", i == *state )){
*state = i;
ret = true;
}
// draw item icon
ImGui::SetCursorScreenPos( pos + ImVec2(w/6.f,0) );
Icon( (*it).first, (*it).second );
ImGui::PopID();
}
ImGui::EndCombo();
}
// redraw current ad preview value
ImGui::SetCursorScreenPos(draw_pos + ImVec2(w/9.f,w/9.f));
Icon(icons[*state].first, icons[*state].second );
ImGui::PopID();
return ret;
}
void ImGuiToolkit::ShowIconsWindow(bool* p_open)
{
@@ -269,33 +338,37 @@ void ImGuiToolkit::ShowIconsWindow(bool* p_open)
ImGui::End();
}
void ImGuiToolkit::ToolTip(const char* desc)
void ImGuiToolkit::ToolTip(const char* desc, const char* shortcut)
{
if (ImGui::IsItemHovered())
{
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT);
ImGui::BeginTooltip();
ImGui::Text(desc);
ImGui::EndTooltip();
ImGui::PopFont();
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT);
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(desc);
ImGui::PopTextWrapPos();
if (shortcut) {
ImGui::SameLine();
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.6, 0.6, 0.6, 0.9f));
ImGui::Text(shortcut);
ImGui::PopStyleColor();
}
ImGui::EndTooltip();
ImGui::PopFont();
}
// Helper to display a little (?) mark which shows a tooltip when hovered.
// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.txt)
void ImGuiToolkit::HelpMarker(const char* desc, const char* icon)
void ImGuiToolkit::HelpMarker(const char* desc, const char* icon, const char* shortcut)
{
ImGui::TextDisabled( icon );
if (ImGui::IsItemHovered())
{
ImGui::BeginTooltip();
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT);
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
ImGui::TextUnformatted(desc);
ImGui::PopTextWrapPos();
ImGui::PopFont();
ImGui::EndTooltip();
}
ToolTip(desc, shortcut);
}
void ImGuiToolkit::HelpIcon(const char* desc, int i, int j, const char* shortcut)
{
ImGuiToolkit::Icon(i, j, false);
if (ImGui::IsItemHovered())
ToolTip(desc, shortcut);
}
// Draws a timeline showing
@@ -837,15 +910,19 @@ void ImGuiToolkit::ShowStats(bool *p_open, int* p_corner, bool *p_timer)
ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background
if (ImGui::Begin("Metrics", NULL, (corner != -1 ? ImGuiWindowFlags_NoMove : 0) | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
if (ImGui::Begin("Metrics", NULL, (corner != -1 ? ImGuiWindowFlags_NoMove : 0) | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
{
int mode = (*p_timer) ? 1 : 0;
ImGui::SetNextItemWidth(250);
ImGui::SetNextItemWidth(220);
if (ImGui::Combo("##mode", &mode, ICON_FA_TACHOMETER_ALT " Performance\0" ICON_FA_HOURGLASS_HALF " Timers\0") ) {
(*p_timer) = mode > 0;
}
bool dumm = true;
ImGui::SameLine();
if (ImGuiToolkit::IconButton(5,8))
ImGui::OpenPopup("metrics_menu");
ImGui::Spacing();
if (*p_timer) {
guint64 time_ = gst_util_get_timestamp ();
@@ -853,14 +930,14 @@ void ImGuiToolkit::ShowStats(bool *p_open, int* p_corner, bool *p_timer)
ImGui::Text("%s", GstToolkit::time_to_string(time_-start_time_1_, GstToolkit::TIME_STRING_FIXED).c_str());
ImGui::PopFont();
ImGui::SameLine(0, 10);
if (ImGuiToolkit::IconToggle(11, 14, 12, 14, &dumm))
if (ImGuiToolkit::IconButton(12, 14))
start_time_1_ = time_; // reset timer 1
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_LARGE);
ImGui::Text("%s", GstToolkit::time_to_string(time_-start_time_2_, GstToolkit::TIME_STRING_FIXED).c_str());
ImGui::PopFont();
ImGui::SameLine(0, 10); dumm = true;
if (ImGuiToolkit::IconToggle(11, 14, 12, 14, &dumm))
start_time_1_ = time_; // reset timer 2
ImGui::SameLine(0, 10);
if (ImGuiToolkit::IconButton(12, 14))
start_time_2_ = time_; // reset timer 2
}
else {
@@ -870,20 +947,39 @@ void ImGuiToolkit::ShowStats(bool *p_open, int* p_corner, bool *p_timer)
ImGui::Text("Refresh %.1f FPS", io.Framerate);
ImGui::Text("Memory %s", SystemToolkit::byte_to_string( SystemToolkit::memory_usage()).c_str() );
ImGui::PopFont();
}
if (ImGui::BeginPopupContextWindow())
if (ImGui::BeginPopup("metrics_menu"))
{
if (ImGui::MenuItem("Free position", NULL, corner == -1)) *p_corner = -1;
if (ImGui::MenuItem("Top", NULL, corner == 1)) *p_corner = 1;
if (ImGui::MenuItem("Bottom", NULL, corner == 3)) *p_corner = 3;
if (p_open && ImGui::MenuItem("Close")) *p_open = false;
if (ImGui::MenuItem( ICON_FA_ANGLE_UP " Top", NULL, corner == 1)) *p_corner = 1;
if (ImGui::MenuItem( ICON_FA_ANGLE_DOWN " Bottom", NULL, corner == 3)) *p_corner = 3;
if (ImGui::MenuItem( ICON_FA_EXPAND_ARROWS_ALT " Free position", NULL, corner == -1)) *p_corner = -1;
if (p_open && ImGui::MenuItem( ICON_FA_TIMES " Close")) *p_open = false;
ImGui::EndPopup();
}
ImGui::End();
}
}
// BHBN : TODO stats on video decoding : would be useful if we could know which is HW or SW decoder
//#include "MediaPlayer.h"
//ImGuiToolkit::PushFont(ImGuiToolkit::FONT_MONO);
//uint bitrate_ = 0;
//uint pixels_ = 0;
//uint videos_ = 0;
//uint images_ = 0;
//for (auto it = MediaPlayer::begin(); it != MediaPlayer::end(); it++)
//{
// MediaInfo info = (*it)->media();
// bitrate_ += info.bitrate;
// pixels_ += info.height * info.width * 4;
// if (info.isimage) images_++; else videos_++;
//}
//ImGui::Text("%d video%s %d image%s", videos_, videos_>1?"s":" ", images_, images_>1?"s":" ");
//ImGui::Text("Bitrate %s/s", SystemToolkit::bits_to_string( bitrate_ ).c_str() );
//ImGui::Text("Texture %s", SystemToolkit::byte_to_string( pixels_ ).c_str() );
//ImGui::PopFont();
void ImGuiToolkit::WindowText(const char* window_name, ImVec2 window_pos, const char* text)
{
@@ -936,10 +1032,12 @@ void ImGuiToolkit::WindowDragFloat(const char* window_name, ImVec2 window_pos, f
}
}
ImVec4 ImGuiToolkit::GetHighlightColor()
ImVec4 ImGuiToolkit::HighlightColor(bool active)
{
ImVec4* colors = ImGui::GetStyle().Colors;
return colors[ImGuiCol_CheckMark];
if (active)
return ImGui::GetStyle().Colors[ImGuiCol_CheckMark];
else
return ImGui::GetStyle().Colors[ImGuiCol_TabUnfocusedActive];
}
void ImGuiToolkit::SetAccentColor(accent_color color)
@@ -1001,7 +1099,7 @@ void ImGuiToolkit::SetAccentColor(accent_color color)
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.13f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.10f, 0.10f, 0.10f, 0.60f);
colors[ImGuiCol_DragDropTarget] = colors[ImGuiCol_HeaderActive];
}
else if (color == ImGuiToolkit::ACCENT_GREY) {
colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
@@ -1052,6 +1150,7 @@ void ImGuiToolkit::SetAccentColor(accent_color color)
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.13f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.10f, 0.10f, 0.10f, 0.60f);
colors[ImGuiCol_DragDropTarget] = colors[ImGuiCol_HeaderActive];
}
else {
// default BLUE
@@ -1081,7 +1180,7 @@ void ImGuiToolkit::SetAccentColor(accent_color color)
colors[ImGuiCol_ButtonActive] = ImVec4(0.24f, 0.24f, 0.24f, 0.67f);
colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f);
colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.51f);
colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.71f);
colors[ImGuiCol_Separator] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f);
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.67f);
colors[ImGuiCol_SeparatorActive] = ImVec4(0.59f, 0.73f, 0.90f, 0.95f);
@@ -1103,7 +1202,9 @@ void ImGuiToolkit::SetAccentColor(accent_color color)
colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f);
colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.13f);
colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.10f, 0.10f, 0.10f, 0.60f);
colors[ImGuiCol_DragDropTarget] = colors[ImGuiCol_HeaderActive];
}
}

View File

@@ -11,20 +11,25 @@
namespace ImGuiToolkit
{
// Icons from resource icon.dds
void Icon(int i, int j);
void Icon (int i, int j, bool enabled = true);
bool IconButton (int i, int j, const char *tooltips = nullptr);
bool IconToggle (int i, int j, int i_toggle, int j_toggle, bool* toggle, const char *tooltips[] = nullptr);
void ShowIconsWindow(bool* p_open);
// utility buttons
// icon buttons
bool ButtonIcon (int i, int j, const char* tooltip = nullptr);
bool ButtonIconToggle (int i, int j, int i_toggle, int j_toggle, bool* toggle);
bool ButtonIconMultistate (std::vector<std::pair<int, int> > icons, int* state);
bool ButtonToggle(const char* label, bool* toggle);
void ButtonSwitch (const char* label, bool* toggle , const char *help = nullptr);
bool IconToggle (int i, int j, int i_toggle, int j_toggle, bool* toggle, const char *tooltips[] = nullptr);
bool ComboIcon (std::vector<std::pair<int, int> > icons, int* state);
// utility buttons
bool ButtonToggle (const char* label, bool* toggle);
void ButtonSwitch (const char* label, bool* toggle , const char *help = nullptr);
void ButtonOpenUrl (const char* url, const ImVec2& size_arg = ImVec2(0,0));
void ToolTip (const char* desc);
void HelpMarker (const char* desc, const char* icon = ICON_FA_QUESTION_CIRCLE);
void ToolTip (const char* desc, const char* shortcut = "");
void HelpMarker (const char* desc, const char* icon = ICON_FA_QUESTION_CIRCLE, const char* shortcut = nullptr);
void HelpIcon (const char* desc, int i = 19, int j = 5, const char* shortcut = "");
// utility sliders
bool TimelineSlider (const char* label, guint64 *time, guint64 start, guint64 end, guint64 step, const float width);
@@ -55,7 +60,7 @@ namespace ImGuiToolkit
ACCENT_GREY
} accent_color;
void SetAccentColor (accent_color color);
struct ImVec4 GetHighlightColor ();
struct ImVec4 HighlightColor (bool active = true);
void ShowStats (bool* p_open, int* p_corner, bool* p_timer);

View File

@@ -171,7 +171,7 @@ void ImGuiVisitor::visit(Shader &n)
// ImGui::SameLine(0, 5);
ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);
int mode = n.blending;
if (ImGui::Combo("Blending", &mode, "Normal\0Screen\0Inverse\0Addition\0Subtract\0") ) {
if (ImGui::Combo("Blending", &mode, "Normal\0Screen\0Subtract\0Multiply\0Soft light\0Soft subtract\0Lighten only\0None\0") ) {
n.blending = Shader::BlendMode(mode);
std::ostringstream oss;
@@ -180,20 +180,26 @@ void ImGuiVisitor::visit(Shader &n)
case Shader::BLEND_OPACITY:
oss<<"Normal";
break;
case Shader::BLEND_ADD:
case Shader::BLEND_SCREEN:
oss<<"Screen";
break;
case Shader::BLEND_SUBSTRACT:
oss<<"Inverse";
break;
case Shader::BLEND_LAYER_ADD:
oss<<"Addition";
break;
case Shader::BLEND_LAYER_SUBSTRACT:
case Shader::BLEND_SUBTRACT:
oss<<"Subtract";
break;
case Shader::BLEND_CUSTOM:
oss<<"Custom";
case Shader::BLEND_MULTIPLY:
oss<<"Multiply";
break;
case Shader::BLEND_SOFT_LIGHT:
oss<<"Soft light";
break;
case Shader::BLEND_SOFT_SUBTRACT:
oss<<"Soft subtract";
break;
case Shader::BLEND_LIGHTEN_ONLY:
oss<<"Lighten only";
break;
case Shader::BLEND_NONE:
oss<<"None";
break;
}
Action::manager().store(oss.str(), n.id());
@@ -393,18 +399,22 @@ void ImGuiVisitor::visit (Source& s)
// preview
float preview_width = ImGui::GetContentRegionAvail().x IMGUI_RIGHT_ALIGN;
float width = preview_width;
float height = s.frame()->projectionArea().y * width / ( s.frame()->projectionArea().x * s.frame()->aspectRatio());
if (height > 230) {
height = 230;
width = height * s.frame()->aspectRatio() * ( s.frame()->projectionArea().x / s.frame()->projectionArea().y);
}
ImGui::Image((void*)(uintptr_t) s.frame()->texture(), ImVec2(width, height));
float preview_height = 4.5f * ImGui::GetFrameHeightWithSpacing();
ImVec2 pos = ImGui::GetCursorPos(); // remember where we were...
float space = ImGui::GetStyle().ItemSpacing.y;
float width = preview_width;
float height = s.frame()->projectionArea().y * width / ( s.frame()->projectionArea().x * s.frame()->aspectRatio());
if (height > preview_height - space) {
height = preview_height - space;
width = height * s.frame()->aspectRatio() * ( s.frame()->projectionArea().x / s.frame()->projectionArea().y);
}
// centered image
ImGui::SetCursorPos( ImVec2(pos.x + 0.5f * (preview_width-width), pos.y + 0.5f * (preview_height-height-space)) );
ImGui::Image((void*)(uintptr_t) s.frame()->texture(), ImVec2(width, height));
// inform on visibility status
ImGui::SetCursorPos( ImVec2(preview_width + 20, pos.y -height ) );
ImGui::SetCursorPos( ImVec2(preview_width + 20, pos.y ) );
if (s.active()) {
if (s.blendingShader()->color.a > 0.f)
ImGuiToolkit::HelpMarker("Visible", ICON_FA_EYE);
@@ -414,16 +424,25 @@ void ImGuiVisitor::visit (Source& s)
else
ImGuiToolkit::HelpMarker("Inactive", ICON_FA_SNOWFLAKE);
// Inform on status of lock
ImGui::SetCursorPos( ImVec2(preview_width + 20, pos.y -height + ImGui::GetFrameHeight()) );
if (s.locked())
ImGuiToolkit::HelpMarker("Locked", ICON_FA_LOCK);
// Inform on workspace
ImGui::SetCursorPos( ImVec2(preview_width + 20, pos.y + ImGui::GetFrameHeightWithSpacing()) );
if (s.workspace() == Source::BACKGROUND)
ImGuiToolkit::HelpIcon("Background",10, 16);
else if (s.workspace() == Source::FOREGROUND)
ImGuiToolkit::HelpIcon("Foreground",12, 16);
else
ImGuiToolkit::HelpMarker("Unlocked", ICON_FA_LOCK_OPEN);
ImGuiToolkit::HelpIcon("Stage",11, 16);
// locking
ImGui::SetCursorPos( ImVec2(preview_width + 20, pos.y + 2.f * ImGui::GetFrameHeightWithSpacing()) );
const char *tooltip[2] = {"Unlocked", "Locked"};
bool l = s.locked();
if (ImGuiToolkit::IconToggle(15,6,17,6, &l, tooltip ) )
s.setLocked(l);
// toggle enable/disable image processing
bool on = s.imageProcessingEnabled();
ImGui::SetCursorPos( ImVec2(preview_width + 15, pos.y -ImGui::GetFrameHeight() ) );
ImGui::SetCursorPos( ImVec2(preview_width + 15, pos.y + 3.5f * ImGui::GetFrameHeightWithSpacing()) );
if ( ImGuiToolkit::ButtonToggle(ICON_FA_MAGIC, &on) ){
std::ostringstream oss;
oss << s.name() << ": " << ( on ? "Enable Filter" : "Disable Filter");
@@ -431,7 +450,7 @@ void ImGuiVisitor::visit (Source& s)
}
s.setImageProcessingEnabled(on);
ImGui::SetCursorPos(pos); // ...come back
ImGui::SetCursorPosY(pos.y + preview_height); // ...come back
// image processing pannel
if (s.imageProcessingEnabled())
@@ -446,27 +465,27 @@ void ImGuiVisitor::visit (Source& s)
void ImGuiVisitor::visit (MediaSource& s)
{
if ( s.mediaplayer()->isImage() ) {
ImGuiToolkit::Icon(2,9);
ImGui::SameLine(0, 10);
ImGuiToolkit::Icon(s.icon().x, s.icon().y);
ImGui::SameLine(0, 10);
if ( s.mediaplayer()->isImage() )
ImGui::Text("Image File");
}
else {
ImGuiToolkit::Icon(18,13);
ImGui::SameLine(0, 10);
else
ImGui::Text("Video File");
}
if ( ImGui::Button(IMGUI_TITLE_MEDIAPLAYER, ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
UserInterface::manager().showMediaPlayer( s.mediaplayer());
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
}
void ImGuiVisitor::visit (SessionSource& s)
void ImGuiVisitor::visit (SessionFileSource& s)
{
if (s.session() == nullptr)
return;
ImGuiToolkit::Icon(s.icon().x, s.icon().y);
ImGui::SameLine(0, 10);
ImGui::Text("Session File");
ImGui::Text("%s", SystemToolkit::base_filename(s.path()).c_str());
// ImGui::Text("%s", SystemToolkit::base_filename(s.path()).c_str());
if (ImGuiToolkit::ButtonIcon(3, 2)) s.session()->setFading(0.f);
float f = s.session()->fading();
@@ -480,14 +499,29 @@ void ImGuiVisitor::visit (SessionSource& s)
Action::manager().store(oss.str(), s.id());
}
if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Make Current", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
if ( ImGui::Button( ICON_FA_FILE_UPLOAD " Open File", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().set( s.detach() );
if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().merge( s.detach() );
if ( ImGui::Button( ICON_FA_FILE_EXPORT " Import sources", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().import( &s );
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
}
void ImGuiVisitor::visit (SessionGroupSource& s)
{
if (s.session() == nullptr)
return;
ImGuiToolkit::Icon(s.icon().x, s.icon().y);
ImGui::SameLine(0, 10);
ImGui::Text("Flat Session");
if ( ImGui::Button( ICON_FA_UPLOAD " Expand sources", ImVec2(IMGUI_RIGHT_ALIGN, 0)) ){
Mixer::manager().import( &s );
}
}
void ImGuiVisitor::visit (RenderSource& s)
{
ImGuiToolkit::Icon(s.icon().x, s.icon().y);

View File

@@ -23,7 +23,8 @@ public:
void visit (ImageProcessingShader& n) override;
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& 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;

View File

@@ -80,8 +80,6 @@ void ImageProcessingShader::reset()
void ImageProcessingShader::operator = (const ImageProcessingShader &S )
{
Shader::operator =(S);
brightness = S.brightness;
contrast = S.contrast;
saturation = S.saturation;

View File

@@ -2,14 +2,15 @@
#include "defines.h"
#include "Visitor.h"
#include "ImageShader.h"
#include "Resource.h"
#include "rsc/fonts/IconsFontAwesome5.h"
//#include
static ShadingProgram imageShadingProgram("shaders/image.vs", "shaders/image.fs");
#include "ImageShader.h"
const char* MaskShader::mask_names[3] = { ICON_FA_EXPAND, ICON_FA_EDIT, ICON_FA_SHAPES };
ShadingProgram imageShadingProgram("shaders/image.vs", "shaders/image.fs");
ShadingProgram inverseAlphaProgram("shaders/image.vs", "shaders/imageblending.fs");
const char* MaskShader::mask_names[3] = { ICON_FA_EXPAND, ICON_FA_EDIT, ICON_FA_SHAPES };
const char* MaskShader::mask_shapes[5] = { "Elipse", "Oblong", "Rectangle", "Horizontal", "Vertical" };
std::vector< ShadingProgram* > MaskShader::mask_programs;
@@ -25,15 +26,15 @@ void ImageShader::use()
{
Shader::use();
// set stippling
program_->setUniform("stipple", stipple);
// setup mask texture
glActiveTexture(GL_TEXTURE1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, mask_texture);
glBindTexture (GL_TEXTURE_2D, mask_texture);
glActiveTexture(GL_TEXTURE0);
}
void ImageShader::reset()
@@ -61,6 +62,15 @@ void ImageShader::accept(Visitor& v) {
}
DivideAlphaShader::DivideAlphaShader(): ImageShader()
{
// to inverse alpha mode, use dedicated shading program
program_ = &inverseAlphaProgram;
// reset instance
reset();
blending = Shader::BLEND_NONE;
}
MaskShader::MaskShader(): Shader(), mode(0)

View File

@@ -27,6 +27,14 @@ public:
float stipple;
};
class DivideAlphaShader : public ImageShader
{
public:
DivideAlphaShader();
};
class MaskShader : public Shader
{

33
Log.cpp
View File

@@ -43,6 +43,7 @@ struct AppLog
{
mtx.lock();
int old_size = Buf.size();
Buf.appendf("%04d ", LineOffsets.size()); // this adds 6 characters to show line number
Buf.appendfv(fmt, args);
Buf.append("\n");
@@ -66,6 +67,9 @@ struct AppLog
// window
ImGui::SameLine(0, 0);
static bool numbering = true;
ImGuiToolkit::ButtonToggle( ICON_FA_SORT_NUMERIC_DOWN, &numbering );
ImGui::SameLine();
bool clear = ImGui::Button( ICON_FA_BACKSPACE " Clear");
ImGui::SameLine();
bool copy = ImGui::Button( ICON_FA_COPY " Copy");
@@ -73,7 +77,7 @@ struct AppLog
Filter.Draw("Filter", -60.0f);
ImGui::Separator();
ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_HorizontalScrollbar);
ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_AlwaysHorizontalScrollbar);
if (clear)
Clear();
@@ -118,7 +122,7 @@ struct AppLog
{
for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
{
const char* line_start = buf + LineOffsets[line_no];
const char* line_start = buf + LineOffsets[line_no] + (numbering?0:6);
const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
ImGui::TextUnformatted(line_start, line_end);
}
@@ -195,10 +199,10 @@ void Log::Warning(const char* fmt, ...)
Log::Info("Warning - %s\n", buf.c_str());
}
void Log::Render(bool showNofitications, bool showWarnings)
void Log::Render(bool *showWarnings)
{
bool show_warnings = !warnings.empty() & showWarnings;
bool show_notification = !notifications.empty() & showNofitications;
bool show_warnings = !warnings.empty();
bool show_notification = !notifications.empty();
if (!show_notification && !show_warnings)
return;
@@ -238,6 +242,7 @@ void Log::Render(bool showNofitications, bool showWarnings)
notifications.clear();
}
if (show_warnings) {
ImGui::OpenPopup("Warning");
if (ImGui::BeginPopupModal("Warning", NULL, ImGuiWindowFlags_AlwaysAutoResize))
@@ -255,8 +260,21 @@ void Log::Render(bool showNofitications, bool showWarnings)
}
ImGui::PopTextWrapPos();
ImGui::Dummy(ImVec2(width * 0.8f, 0)); ImGui::SameLine(); // right align
if (ImGui::Button(" Ok ", ImVec2(width * 0.2f, 0))) {
bool close = false;
ImGui::Spacing();
if (ImGui::Button("Show logs", ImVec2(width * 0.2f, 0))) {
close = true;
if (showWarnings!= nullptr)
*showWarnings = true;
}
ImGui::SameLine();
ImGui::Dummy(ImVec2(width * 0.6f, 0)); // right align
ImGui::SameLine();
if (ImGui::Button(" Ok ", ImVec2(width * 0.2f, 0)))
close = true;
if (close) {
ImGui::CloseCurrentPopup();
// messages have been seen
warnings.clear();
@@ -267,7 +285,6 @@ void Log::Render(bool showNofitications, bool showWarnings)
}
}
}
void Log::Error(const char* fmt, ...)

2
Log.h
View File

@@ -12,7 +12,7 @@ namespace Log
// Draw logs
void ShowLogWindow(bool* p_open = nullptr);
void Render(bool showNofitications = true, bool showWarnings = true);
void Render(bool *showWarnings = nullptr);
}
#endif // __LOG_H_

View File

@@ -933,9 +933,9 @@ void MediaPlayer::setTimeline(Timeline tl)
// return media_.timeline.toggleGaps(from, to);
//}
std::string MediaPlayer::codec() const
MediaInfo MediaPlayer::media() const
{
return media_.codec_name;
return media_;
}
std::string MediaPlayer::uri() const

View File

@@ -101,7 +101,7 @@ public:
/**
* Get name of Codec of the media
* */
std::string codec() const;
MediaInfo media() const;
/**
* True if a media was oppenned
* */

View File

@@ -45,7 +45,7 @@ MediaPlayer *MediaSource::mediaplayer() const
glm::ivec2 MediaSource::icon() const
{
if (mediaplayer_->isImage())
return glm::ivec2(2, 9);
return glm::ivec2(4, 9);
else
return glm::ivec2(18, 13);
}
@@ -79,9 +79,10 @@ void MediaSource::init()
// icon in mixing view
if (mediaplayer_->isImage())
symbol_ = new Symbol(Symbol::IMAGE, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::IMAGE, glm::vec3(0.75f, 0.75f, 0.01f));
else
symbol_ = new Symbol(Symbol::VIDEO, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::VIDEO, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
// set the renderbuffer of the source and attach rendering nodes
attach(renderbuffer);

291
Mixer.cpp
View File

@@ -17,6 +17,7 @@ using namespace tinyxml2;
#include "Settings.h"
#include "Log.h"
#include "View.h"
#include "ImageShader.h"
#include "SystemToolkit.h"
#include "SessionCreator.h"
#include "SessionVisitor.h"
@@ -34,6 +35,7 @@ using namespace tinyxml2;
#define THREADED_LOADING
static std::vector< std::future<Session *> > sessionLoaders_;
static std::vector< std::future<Session *> > sessionImporters_;
static std::vector< SessionSource * > sessionSourceToImport_;
const std::chrono::milliseconds timeout_ = std::chrono::milliseconds(4);
@@ -163,6 +165,18 @@ void Mixer::update()
}
#endif
// if there is a session source to import
if (!sessionSourceToImport_.empty()) {
// get the session source to be imported
SessionSource *source = sessionSourceToImport_.back();
// merge the session inside this session source
merge( source );
// important: delete the sessionsource itself
deleteSource(source);
// done with this session source
sessionSourceToImport_.pop_back();
}
// if a change of session is requested
if (sessionSwapRequested_) {
sessionSwapRequested_ = false;
@@ -170,6 +184,7 @@ void Mixer::update()
if ( back_session_ ) {
// swap front and back sessions
swap();
View::need_deep_update_++;
// set session filename
Rendering::manager().mainWindow().setTitle(session_->filename());
Settings::application.recentSessions.push(session_->filename());
@@ -188,19 +203,30 @@ void Mixer::update()
update_time_ = gst_util_get_timestamp ();
guint64 current_time = gst_util_get_timestamp ();
// dt is in milisecond, with fractional precision (from micro seconds)
dt_ = static_cast<float>( GST_TIME_AS_USECONDS(current_time - update_time_) * 0.001f);
dt_ = static_cast<float>( GST_TIME_AS_USECONDS(current_time - update_time_) ) * 0.001f;
update_time_ = current_time;
// update session and associated sources
session_->update(dt_);
// grab frames to recorders & streamers
FrameGrabbing::manager().grabFrame(session_->frame(), dt_);
// delete sources which failed update (one by one)
Source *failure = session()->failedSource();
if (failure != nullptr) {
MediaSource *failedFile = dynamic_cast<MediaSource *>(failure);
if (failedFile != nullptr) {
Settings::application.recentImport.remove( failedFile->path() );
// failed media: remove it from the list of imports
MediaSource *failedMedia = dynamic_cast<MediaSource *>(failure);
if (failedMedia != nullptr) {
Settings::application.recentImport.remove( failedMedia->path() );
}
// failed Render loopback: replace it with one matching the current session
RenderSource *failedRender = dynamic_cast<RenderSource *>(failure);
if (failedRender != nullptr) {
if ( recreateSource(failedRender) )
failure = nullptr; // prevent delete (already done in recreateSource)
}
// delete the source
deleteSource(failure, false);
}
@@ -237,7 +263,7 @@ Source * Mixer::createSourceFile(const std::string &path)
if ( ext == "mix" )
{
// create a session source
SessionSource *ss = new SessionSource();
SessionFileSource *ss = new SessionFileSource;
ss->load(path);
s = ss;
}
@@ -267,7 +293,8 @@ Source * Mixer::createSourceFile(const std::string &path)
Source * Mixer::createSourceRender()
{
// ready to create a source
RenderSource *s = new RenderSource(session_);
RenderSource *s = new RenderSource;
s->setSession(session_);
// propose a new name based on session name
s->setName(SystemToolkit::base_filename(session_->filename()));
@@ -327,6 +354,20 @@ Source * Mixer::createSourceNetwork(const std::string &nameconnection)
return s;
}
Source * Mixer::createSourceGroup()
{
SessionGroupSource *s = new SessionGroupSource;
s->setResolution( Mixer::manager().session()->frame()->resolution() );
// propose a new name
s->setName("Group");
return s;
}
Source * Mixer::createSourceClone(const std::string &namesource)
{
// ready to create a source
@@ -396,6 +437,78 @@ void Mixer::insertSource(Source *s, View::Mode m)
}
}
bool Mixer::replaceSource(Source *from, Source *to)
{
if ( from == nullptr || to == nullptr)
return false;
// rename
renameSource(to, from->name());
// remove source Nodes from all views
detach(from);
// copy all transforms
to->group(View::MIXING)->copyTransform( from->group(View::MIXING) );
to->group(View::GEOMETRY)->copyTransform( from->group(View::GEOMETRY) );
to->group(View::LAYER)->copyTransform( from->group(View::LAYER) );
to->group(View::MIXING)->copyTransform( from->group(View::MIXING) );
// TODO copy all filters
// add source Nodes to all views
attach(to);
// add source
session_->addSource(to);
// delete source
session_->deleteSource(from);
return true;
}
bool Mixer::recreateSource(Source *s)
{
if ( s == nullptr )
return false;
// get the xml description from this source, and exit if not wellformed
tinyxml2::XMLDocument xmlDoc;
tinyxml2::XMLError eResult = xmlDoc.Parse(Source::xml(s).c_str());
if ( XMLResultError(eResult))
return false;
tinyxml2::XMLElement *root = xmlDoc.FirstChildElement(APP_NAME);
if ( root == nullptr )
return false;
XMLElement* sourceNode = root->FirstChildElement("Source");
if ( sourceNode == nullptr )
return false;
// actually create the source with SessionLoader using xml description
SessionLoader loader( session_ );
Source *replacement = loader.createSource(sourceNode, false); // not clone
if (replacement == nullptr)
return false;
// remove source Nodes from all views
detach(s);
// delete source
session_->deleteSource(s);
// add sources Nodes to all views
attach(replacement);
// add source
session_->addSource(replacement);
return true;
}
void Mixer::deleteSource(Source *s, bool withundo)
{
if ( s != nullptr )
@@ -500,6 +613,16 @@ void Mixer::uncover(Source *s)
}
}
void Mixer::deselect(Source *s)
{
if ( s != nullptr ) {
if ( s == *current_source_)
unsetCurrentSource();
Mixer::selection().remove(s);
}
}
void Mixer::deleteSelection()
{
// get clones first : this way we store the history of deletion in the right order
@@ -516,7 +639,50 @@ void Mixer::deleteSelection()
}
// empty the selection
while ( !selection().empty() )
deleteSource( selection().front()); // this also remove element from selection()
deleteSource( selection().front() ); // this also remove element from selection()
}
void Mixer::groupSelection()
{
float d = 2.f;
SessionGroupSource *group = new SessionGroupSource;
group->setResolution( Mixer::manager().session()->frame()->resolution() );
// empty the selection
while ( !selection().empty() ) {
Source *s = selection().front();
d = s->depth();
// import source into group
if ( group->import(s) ) {
// detach & remove element from selection()
detach (s);
// remove source from session
session_->removeSource(s);
}
else
selection().pop_front();
}
// set depth at given location
group->group(View::LAYER)->translation_.z = d;
// set alpha to full opacity
group->group(View::MIXING)->translation_.x = 0.f;
group->group(View::MIXING)->translation_.y = 0.f;
// Add source to Session
session_->addSource(group);
// Attach source to Mixer
attach(group);
// avoid name duplicates
renameSource(group, "group");
}
@@ -700,7 +866,11 @@ void Mixer::setView(View::Mode m)
if ( current_view_ == &transition_ ) {
// get the session detached from the transition view and set it as current session
// NB: detatch() can return nullptr, which is then ignored.
set ( transition_.detach() );
Session *se = transition_.detach();
if ( se != nullptr )
set ( se );
else
Log::Info("Transition interrupted: Session source added.");
}
switch (m) {
@@ -722,10 +892,17 @@ void Mixer::setView(View::Mode m)
break;
}
// setttings
Settings::application.current_view = (int) m;
// selection might have to change
for (auto sit = session_->begin(); sit != session_->end(); sit++) {
if ( !current_view_->canSelect(*sit) )
deselect( *sit );
}
// need to deeply update view to apply eventual changes
View::need_deep_update_++;
Settings::application.current_view = (int) m;
}
View *Mixer::view(View::Mode m)
@@ -774,7 +951,7 @@ void Mixer::load(const std::string& filename)
if (sessionLoaders_.empty()) {
// Start async thread for loading the session
// Will be obtained in the future in update()
sessionLoaders_.emplace_back( std::async(std::launch::async, Session::load, filename) );
sessionLoaders_.emplace_back( std::async(std::launch::async, Session::load, filename, 0) );
}
#else
set( Session::load(filename) );
@@ -788,7 +965,7 @@ void Mixer::open(const std::string& filename)
Log::Info("\nStarting transition to session %s", filename.c_str());
// create special SessionSource to be used for the smooth transition
SessionSource *ts = new SessionSource();
SessionFileSource *ts = new SessionFileSource;
// open filename if specified
if (!filename.empty())
ts->load(filename);
@@ -812,13 +989,19 @@ void Mixer::import(const std::string& filename)
if (sessionImporters_.empty()) {
// Start async thread for loading the session
// Will be obtained in the future in update()
sessionImporters_.emplace_back( std::async(std::launch::async, Session::load, filename) );
sessionImporters_.emplace_back( std::async(std::launch::async, Session::load, filename, 0) );
}
#else
merge( Session::load(filename) );
#endif
}
void Mixer::import(SessionSource *source)
{
sessionSourceToImport_.push_back( source );
}
void Mixer::merge(Session *session)
{
if ( session == nullptr ) {
@@ -826,11 +1009,76 @@ void Mixer::merge(Session *session)
return;
}
// new state in history manager
Action::manager().store( std::to_string(session->numSource()) + std::string(" sources imported."));
// import every sources
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource()) {
// avoid name duplicates
renameSource(s, s->name());
insertSource(s);
// Add source to Session
session_->addSource(s);
// Attach source to Mixer
attach(s);
}
// needs to update !
View::need_deep_update_++;
// avoid display issues
current_view_->update(0.f);
}
void Mixer::merge(SessionSource *source)
{
if ( source == nullptr ) {
Log::Warning("Failed to import Session Source.");
return;
}
// new state in history manager
Action::manager().store( source->name().c_str() + std::string(" imported."));
Session *session = source->detach();
// import every sources
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource()) {
// avoid name duplicates
renameSource(s, s->name());
// scale alpha
s->setAlpha( s->alpha() * source->alpha() );
// set depth at given location
s->group(View::LAYER)->translation_.z = source->depth() + (s->depth() / MAX_DEPTH);
// set location
// a. transform of node to import
Group *sNode = s->group(View::GEOMETRY);
glm::mat4 sTransform = GlmToolkit::transform(sNode->translation_, sNode->rotation_, sNode->scale_);
// b. transform of session source
Group *sourceNode = source->group(View::GEOMETRY);
glm::mat4 sourceTransform = GlmToolkit::transform(sourceNode->translation_, sourceNode->rotation_, sourceNode->scale_);
// c. combined transform of source and session source
sourceTransform *= sTransform;
GlmToolkit::inverse_transform(sourceTransform, sNode->translation_, sNode->rotation_, sNode->scale_);
// Add source to Session
session_->addSource(s);
// Attach source to Mixer
attach(s);
}
// needs to update !
View::need_deep_update_++;
// avoid display issues
current_view_->update(0.f);
}
void Mixer::swap()
@@ -890,8 +1138,7 @@ void Mixer::close()
if (Settings::application.smooth_transition)
{
// create empty SessionSource to be used for the smooth transition
SessionSource *ts = new SessionSource();
ts->load();
SessionFileSource *ts = new SessionFileSource;
// insert source and switch to transition view
insertSource(ts, View::TRANSITION);
@@ -923,10 +1170,8 @@ void Mixer::clear()
void Mixer::set(Session *s)
{
if ( s == nullptr ) {
Log::Warning("Session loading cancelled.");
if ( s == nullptr )
return;
}
// delete previous back session if needed
if (back_session_)
@@ -958,7 +1203,13 @@ void Mixer::paste(const std::string& clipboard)
XMLElement* sourceNode = root->FirstChildElement("Source");
for( ; sourceNode ; sourceNode = sourceNode->NextSiblingElement())
{
addSource(loader.cloneOrCreateSource(sourceNode));
Source *s = loader.createSource(sourceNode);
if (s) {
// Add source to Session
session_->addSource(s);
// Add source to Mixer
addSource(s);
}
}
}

19
Mixer.h
View File

@@ -5,6 +5,8 @@
#include "Session.h"
#include "Selection.h"
class SessionSource;
class Mixer
{
// Private Constructor
@@ -43,6 +45,7 @@ public:
Source * createSourcePattern(uint pattern, glm::ivec2 res);
Source * createSourceDevice (const std::string &namedevice);
Source * createSourceNetwork(const std::string &nameconnection);
Source * createSourceGroup ();
// operations on sources
void addSource (Source *s);
@@ -50,7 +53,9 @@ public:
void renameSource (Source *s, const std::string &newname);
void attach (Source *s);
void detach (Source *s);
void deselect (Source *s);
void deleteSelection();
void groupSelection();
// current source
Source * currentSource ();
@@ -74,8 +79,8 @@ public:
View *view (View::Mode m = View::INVALID);
void setView (View::Mode m);
void conceal(Source *s);
void uncover(Source *s);
void conceal (Source *s);
void uncover (Source *s);
bool concealed(Source *s);
// manipulate, load and save sessions
@@ -85,8 +90,10 @@ public:
void saveas (const std::string& filename);
void load (const std::string& filename);
void import (const std::string& filename);
void merge (Session *s);
void set (Session *s);
void import (SessionSource *source);
void merge (Session *session);
void merge (SessionSource *source);
void set (Session *session);
// operations depending on transition mode
void close ();
@@ -105,7 +112,9 @@ protected:
SourceList candidate_sources_;
SourceList stash_;
void insertSource(Source *s, View::Mode m = View::INVALID);
void insertSource (Source *s, View::Mode m = View::INVALID);
bool replaceSource (Source *from, Source *to);
bool recreateSource(Source *s);
void setCurrentSource(SourceList::iterator it);
SourceList::iterator current_source_;

View File

@@ -274,8 +274,8 @@ NetworkSource::NetworkSource() : StreamSource()
stream_ = (Stream *) new NetworkStream;
// set symbol
symbol_ = new Symbol(Symbol::SHARE, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::SHARE, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}

View File

@@ -137,7 +137,8 @@ PatternSource::PatternSource() : StreamSource()
stream_ = (Stream *) new Pattern;
// set symbol
symbol_ = new Symbol(Symbol::PATTERN, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::PATTERN, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
void PatternSource::setPattern(uint type, glm::ivec2 resolution)

View File

@@ -35,7 +35,7 @@ public:
Pattern *pattern() const;
void setPattern(uint type, glm::ivec2 resolution);
glm::ivec2 icon() const override { return glm::ivec2(12, 5); }
glm::ivec2 icon() const override { return glm::ivec2(11, 5); }
};

View File

@@ -132,6 +132,8 @@ void PickingVisitor::visit(Handles &n)
glm::vec4 vec = modelview_ * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview_ ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
glm::vec4 mirror = glm::sign(vec);
bool picked = false;
if ( n.type() == Handles::RESIZE ) {
@@ -153,24 +155,29 @@ void PickingVisitor::visit(Handles &n)
}
else if ( n.type() == Handles::ROTATE ){
// the icon for rotation is on the right top corner at (0.12, 0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f );
glm::vec4 pos = glm::inverse(ctm) * ( mirror * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ) );
picked = glm::length( glm::vec2( 1.f, 1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale;
}
else if ( n.type() == Handles::SCALE ){
// the icon for scaling is on the right bottom corner at (0.12, -0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, -0.12f, 0.f, 0.f );
glm::vec4 pos = glm::inverse(ctm) * ( mirror * glm::vec4( 0.12f, -0.12f, 0.f, 0.f ) );
picked = glm::length( glm::vec2( 1.f, -1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale;
}
else if ( n.type() == Handles::CROP ){
// the icon for cropping is on the left bottom corner at (0.12, 0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * glm::vec4( 0.12f, 0.12f, 0.f, 0.f );
glm::vec4 pos = glm::inverse(ctm) * ( mirror * glm::vec4( 0.12f, 0.12f, 0.f, 0.f ) );
picked = glm::length( glm::vec2( -1.f, -1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale;
}
else if ( n.type() == Handles::MENU ){
// the icon for restore is on the left top corner at (-0.12, 0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * glm::vec4( -0.12f, 0.12f, 0.f, 0.f );
// the icon for menu is on the left top corner at (-0.12, 0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * ( mirror * glm::vec4( -0.12f, 0.12f, 0.f, 0.f ) );
picked = glm::length( glm::vec2( -1.f, 1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale;
}
else if ( n.type() == Handles::LOCKED || n.type() == Handles::UNLOCKED ){
// the icon for lock is on the right bottom corner at (-0.12, 0.12) in scene coordinates
glm::vec4 pos = glm::inverse(ctm) * ( mirror * glm::vec4( -0.12f, 0.12f, 0.f, 0.f ) );
picked = glm::length( glm::vec2( 1.f, -1.f) + glm::vec2(pos) - glm::vec2(P) ) < 1.5f * scale;
}
if ( picked )
// add this to the nodes picked

View File

@@ -11,6 +11,7 @@
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_access.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/vector_angle.hpp>
#include <glm/gtc/constants.hpp>
#define GLM_ENABLE_EXPERIMENTAL
@@ -224,6 +225,204 @@ void Points::accept(Visitor& v)
v.visit(*this);
}
HLine::HLine(float linewidth): Primitive(new Shader), width(linewidth)
{
// 1 3
// +-------+ ^
// / | / | \ |
// +-----+ => 0 + | / | + 5 | linewidth
// -1 1 \ | / | / |
// +-------+ v
// 2 4
//
points_ = std::vector<glm::vec3> { glm::vec3( -1.f, 0.f, 0.f ),
glm::vec3( -0.999f, 0.001f, 0.f ),
glm::vec3( -0.999f, -0.001f, 0.f ),
glm::vec3( 0.999f, 0.001f, 0.f ),
glm::vec3( 0.999f, -0.001f, 0.f ),
glm::vec3( 1.f, 0.f, 0.f ) };
colors_ = std::vector<glm::vec4> { glm::vec4( 1.f, 1.f, 1.f , 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ) };
indices_ = std::vector<uint> { 0, 1, 2, 3, 4, 5 };
drawMode_ = GL_TRIANGLE_STRIP;
// default scale
scale_.y = width;
//default color
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
}
HLine::~HLine()
{
// do NOT delete vao_ (unique)
vao_ = 0;
}
void HLine::init()
{
// use static unique vertex array object
static uint unique_vao_ = 0;
static uint unique_drawCount = 0;
if (unique_vao_) {
// 1. only init Node (not the primitive vao)
Node::init();
// 2. use the global vertex array object
vao_ = unique_vao_;
drawCount_ = unique_drawCount;
// compute AxisAlignedBoundingBox
bbox_.extend(points_);
// arrays of vertices are not needed anymore
points_.clear();
colors_.clear();
texCoords_.clear();
indices_.clear();
}
else {
// 1. init the Primitive (only once)
Primitive::init();
// 2. remember global vertex array object
unique_vao_ = vao_;
unique_drawCount = drawCount_;
// 3. unique_vao_ will NOT be deleted
}
}
void HLine::draw(glm::mat4 modelview, glm::mat4 projection)
{
// extract pure scaling from modelview (without rotation)
glm::mat4 ctm;
glm::vec3 rot(0.f);
glm::vec4 vec = modelview * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
// Change transform to use linewidth independently of scale in Y (vertical)
scale_.y = (float) width / vec.y;
update(0);
// change color
shader_->color = color;
Primitive::draw(modelview, projection);
}
VLine::VLine(float linewidth): Primitive(new Shader), width(linewidth)
{
points_ = std::vector<glm::vec3> { glm::vec3( 0.f, -1.f, 0.f ),
glm::vec3( 0.001f, -0.999f, 0.f ),
glm::vec3( -0.001f, -0.999f, 0.f ),
glm::vec3( 0.001f, 0.999f, 0.f ),
glm::vec3( -0.001f, 0.999f, 0.f ),
glm::vec3( 0.f, 1.f, 0.f )};
colors_ = std::vector<glm::vec4> { glm::vec4( 1.f, 1.f, 1.f , 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ) };
indices_ = std::vector<uint> { 0, 1, 2, 3, 4, 5 };
drawMode_ = GL_TRIANGLE_STRIP;
// default scale
scale_.x = width;
// default color
color = glm::vec4( 1.f, 1.f, 1.f, 1.f);
}
VLine::~VLine()
{
// do NOT delete vao_ (unique)
vao_ = 0;
}
void VLine::init()
{
// use static unique vertex array object
static uint unique_vao_ = 0;
static uint unique_drawCount = 0;
if (unique_vao_) {
// 1. only init Node (not the primitive vao)
Node::init();
// 2. use the global vertex array object
vao_ = unique_vao_;
drawCount_ = unique_drawCount;
// compute AxisAlignedBoundingBox
bbox_.extend(points_);
// arrays of vertices are not needed anymore
points_.clear();
colors_.clear();
texCoords_.clear();
indices_.clear();
}
else {
// 1. init the Primitive (only once)
Primitive::init();
// 2. remember global vertex array object
unique_vao_ = vao_;
unique_drawCount = drawCount_;
// 3. unique_vao_ will NOT be deleted
}
}
void VLine::draw(glm::mat4 modelview, glm::mat4 projection)
{
// extract pure scaling from modelview (without rotation)
glm::mat4 ctm;
glm::vec3 rot(0.f);
glm::vec4 vec = modelview * glm::vec4(1.f, 0.f, 0.f, 0.f);
rot.z = glm::orientedAngle( glm::vec3(1.f, 0.f, 0.f), glm::normalize(glm::vec3(vec)), glm::vec3(0.f, 0.f, 1.f) );
ctm = glm::rotate(glm::identity<glm::mat4>(), -rot.z, glm::vec3(0.f, 0.f, 1.f)) * modelview ;
vec = ctm * glm::vec4(1.f, 1.f, 0.f, 0.f);
// Change transform to use linewidth independently of scale in X (horizontal)
scale_.x = width / vec.x;
update(0);
// change color
shader_->color = color;
Primitive::draw(modelview, projection);
}
LineSquare::LineSquare(float linewidth) : Group()
{
top_ = new HLine(linewidth);
top_->translation_ = glm::vec3(0.f, 1.f, 0.f);
attach(top_);
bottom_ = new HLine(linewidth);
bottom_->translation_ = glm::vec3(0.f, -1.f, 0.f);
attach(bottom_);
left_ = new VLine(linewidth);
left_->translation_ = glm::vec3(-1.f, 0.f, 0.f);
attach(left_);
right_ = new VLine(linewidth);
right_->translation_ = glm::vec3(1.f, 0.f, 0.f);
attach(right_);
}
void LineSquare::setLineWidth(float v)
{
top_->width = v;
bottom_->width = v;
left_->width = v;
right_->width = v;
}
void LineSquare::setColor(glm::vec4 c)
{
top_->color = c;
bottom_->color = c;
left_->color = c;
right_->color = c;
}
LineStrip::LineStrip(std::vector<glm::vec3> points, std::vector<glm::vec4> colors, uint linewidth) : Primitive(new Shader), linewidth_(linewidth)
{
for(size_t i = 0; i < points.size(); ++i)
@@ -263,64 +462,6 @@ void LineStrip::accept(Visitor& v)
}
static const std::vector<glm::vec3> square_points {
glm::vec3( -1.f, -1.f, 0.f ), glm::vec3( -1.f, 1.f, 0.f ),
glm::vec3( 1.f, 1.f, 0.f ), glm::vec3( 1.f, -1.f, 0.f ),
glm::vec3( -1.f, -1.f, 0.f )
};
static const std::vector<glm::vec4> square_colors {
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f ), glm::vec4( 1.f, 1.f, 1.f, 1.f ),
glm::vec4( 1.f, 1.f, 1.f, 1.f )
};
LineSquare::LineSquare(uint linewidth) : LineStrip(square_points, square_colors, linewidth)
{
}
void LineSquare::init()
{
// use static unique vertex array object
static uint unique_vao_ = 0;
static uint unique_drawCount = 0;
if (unique_vao_) {
// 1. only init Node (not the primitive vao)
Node::init();
// 2. use the global vertex array object
vao_ = unique_vao_;
drawCount_ = unique_drawCount;
// compute AxisAlignedBoundingBox
bbox_.extend(points_);
// arrays of vertices are not needed anymore
points_.clear();
colors_.clear();
texCoords_.clear();
indices_.clear();
}
else {
// 1. init the Primitive (only once)
Primitive::init();
// 2. remember global vertex array object
unique_vao_ = vao_;
unique_drawCount = drawCount_;
}
}
void LineSquare::accept(Visitor& v)
{
Primitive::accept(v);
v.visit(*this);
}
LineSquare::~LineSquare()
{
// do NOT delete vao_ (unique)
vao_ = 0;
}
LineCircle::LineCircle(uint linewidth) : LineStrip(std::vector<glm::vec3>(), std::vector<glm::vec4>(), linewidth)
{
static int N = 72;

View File

@@ -124,6 +124,52 @@ public:
};
class HLine : public Primitive {
public:
HLine(float width = 1.f);
virtual ~HLine();
void init () override;
void draw(glm::mat4 modelview, glm::mat4 projection) override;
glm::vec4 color;
float width;
};
class VLine : public Primitive {
public:
VLine(float width = 1.f);
virtual ~VLine();
void init () override;
void draw(glm::mat4 modelview, glm::mat4 projection) override;
glm::vec4 color;
float width;
};
/**
* @brief The LineSquare class is a group of 4 lines (width & height = 1.0)
*/
class LineSquare : public Group {
HLine *top_, *bottom_;
VLine *left_, *right_;
public:
LineSquare(float linewidth = 1.f);
void setLineWidth(float v);
inline float lineWidth() const { return top_->width; }
void setColor(glm::vec4 c);
inline glm::vec4 color() const { return top_->color; }
};
/**
* @brief The LineStrip class is a Primitive to draw lines
*/
@@ -145,21 +191,6 @@ public:
};
/**
* @brief The LineSquare class is a square LineStrip (width & height = 1.0)
*/
class LineSquare : public LineStrip {
public:
LineSquare(uint linewidth = 1);
void init() override;
void accept(Visitor& v) override;
virtual ~LineSquare();
};
/**
* @brief The LineCircle class is a circular LineStrip (diameter = 1.0)
*/

View File

@@ -145,7 +145,7 @@ const std::vector<std::string> VideoRecorder::profile_description {
// "video/x-raw, format=I420 ! x264enc pass=4 quantizer=26 speed-preset=3 threads=4 ! video/x-h264, profile=baseline ! h264parse ! ",
"video/x-raw, format=I420 ! x264enc tune=\"zerolatency\" threads=4 ! video/x-h264, profile=baseline ! h264parse ! ",
#else
"video/x-raw, format=I420 ! vtenc_h264_hw realtime=1 ! h264parse ! ",
"video/x-raw, format=I420 ! vtenc_h264_hw realtime=1 allow-frame-reordering=0 ! h264parse ! ",
#endif
"video/x-raw, format=Y444_10LE ! x264enc pass=4 quantizer=16 speed-preset=4 threads=4 ! video/x-h264, profile=(string)high-4:4:4 ! h264parse ! ",
// Control x265 encoder quality :

View File

@@ -158,8 +158,8 @@ bool Rendering::init()
gst_init (NULL, NULL);
// increase selection rank for GPU decoding plugins
std::list<std::string> gpuplugins = GstToolkit::enable_gpu_decoding_plugins(Settings::application.render.gpu_decoding);
if (Settings::application.render.gpu_decoding) {
std::list<std::string> gpuplugins = GstToolkit::enable_gpu_decoding_plugins();
if (gpuplugins.size() > 0) {
Log::Info("Video decoding favoring the following GPU decoding plugin(s):");
for(auto it = gpuplugins.begin(); it != gpuplugins.end(); it++)
@@ -229,6 +229,8 @@ void Rendering::pushBackDrawCallback(RenderingCallback function)
void Rendering::draw()
{
// guint64 _time = gst_util_get_timestamp ();
// operate on main window context
main_.makeCurrent();
@@ -275,10 +277,13 @@ void Rendering::draw()
// software framerate limiter 60FPS if not v-sync
if ( Settings::application.render.vsync < 1 ) {
int dt = 18000 - int( 1000.f * Mixer::manager().dt() );
if (dt > 100)
g_usleep( dt );
static GTimer *timer = g_timer_new ();
double elapsed = g_timer_elapsed (timer, NULL) * 1000000.0;
if (elapsed < 16000)
g_usleep( 16000 - (gulong)elapsed );
g_timer_start(timer);
}
}
@@ -673,9 +678,11 @@ bool RenderingWindow::init(int index, GLFWwindow *share)
// This hint can improve the speed of texturing when perspective-correct texture coordinate interpolation isn't needed
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
//
// fast mipmaps (we are not really using mipmaps anyway)
glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
// acurate derivative for shader
glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_NICEST);
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
// if not main window
if ( master_ != NULL ) {

View File

@@ -1,6 +1,11 @@
#include <algorithm>
#include "SearchVisitor.h"
#include "Scene.h"
#include "MediaSource.h"
#include "Session.h"
#include "SessionSource.h"
SearchVisitor::SearchVisitor(Node *node) : Visitor(), node_(node), found_(false)
{
@@ -39,3 +44,65 @@ void SearchVisitor::visit(Scene &n)
// search only in workspace
n.ws()->accept(*this);
}
SearchFileVisitor::SearchFileVisitor() : Visitor()
{
}
void SearchFileVisitor::visit(Node &n)
{
}
void SearchFileVisitor::visit(Group &n)
{
for (NodeSet::iterator node = n.begin(); node != n.end(); node++) {
(*node)->accept(*this);
}
}
void SearchFileVisitor::visit(Switch &n)
{
if (n.numChildren()>0)
n.activeChild()->accept(*this);
}
void SearchFileVisitor::visit(Scene &n)
{
// search only in workspace
n.ws()->accept(*this);
}
void SearchFileVisitor::visit (MediaSource& s)
{
filenames_.push_back( s.path() );
}
void SearchFileVisitor::visit (SessionFileSource& s)
{
filenames_.push_back( s.path() );
}
std::list<std::string> SearchFileVisitor::parse (Session *se)
{
SearchFileVisitor sv;
for (auto iter = se->begin(); iter != se->end(); iter++){
(*iter)->accept(sv);
}
return sv.filenames();
}
bool SearchFileVisitor::find (Session *se, std::string path)
{
std::list<std::string> filenames = parse (se);
return std::find(filenames.begin(), filenames.end(), path) != filenames.end();
}

View File

@@ -1,8 +1,12 @@
#ifndef SEARCHVISITOR_H
#define SEARCHVISITOR_H
#include <list>
#include <string>
#include "Visitor.h"
class Session;
class SearchVisitor: public Visitor
{
Node *node_;
@@ -14,12 +18,35 @@ public:
inline Node *node() const { return found_ ? node_ : nullptr; }
// Elements of Scene
void visit(Scene& n);
void visit(Node& n);
void visit(Primitive&) {}
void visit(Group& n);
void visit(Switch& n);
void visit (Scene& n) override;
void visit (Node& n) override;
void visit (Primitive&) override {}
void visit (Group& n) override;
void visit (Switch& n) override;
};
class SearchFileVisitor: public Visitor
{
std::list<std::string> filenames_;
public:
SearchFileVisitor();
inline std::list<std::string> filenames() const { return filenames_; }
// Elements of Scene
void visit (Scene& n) override;
void visit (Node& n) override;
void visit (Primitive&) override {}
void visit (Group& n) override;
void visit (Switch& n) override;
// Sources
void visit (MediaSource& s) override;
void visit (SessionFileSource& s) override;
static std::list<std::string> parse (Session *se);
static bool find (Session *se, std::string path);
};
#endif // SEARCHVISITOR_H

View File

@@ -117,6 +117,12 @@ Source *Selection::front()
return selection_.front();
}
void Selection::pop_front()
{
if (!selection_.empty()) // TODO set mode ?
selection_.pop_front();
}
bool Selection::empty()
{
return selection_.empty();
@@ -156,9 +162,21 @@ std::string Selection::xml()
xmlDoc.InsertEndChild(selectionNode);
// fill doc
SourceList selection_clones_;
SessionVisitor sv(&xmlDoc, selectionNode);
for (auto iter = selection_.begin(); iter != selection_.end(); iter++, sv.setRoot(selectionNode) )
for (auto iter = selection_.begin(); iter != selection_.end(); iter++, sv.setRoot(selectionNode) ){
// keep the clones for later
CloneSource *clone = dynamic_cast<CloneSource *>(*iter);
if (clone)
(*iter)->accept(sv);
else
selection_clones_.push_back(*iter);
}
// add the clones at the end
for (auto iter = selection_clones_.begin(); iter != selection_clones_.end(); iter++, sv.setRoot(selectionNode) ){
(*iter)->accept(sv);
}
// get compact string
tinyxml2::XMLPrinter xmlPrint(0, true);

View File

@@ -22,6 +22,7 @@ public:
SourceList::iterator begin ();
SourceList::iterator end ();
Source *front();
void pop_front();
bool contains (Source *s);
bool empty();
uint size ();

View File

@@ -4,9 +4,9 @@
#include "Settings.h"
#include "FrameBuffer.h"
#include "Session.h"
#include "GarbageVisitor.h"
#include "FrameGrabber.h"
#include "SessionCreator.h"
#include "SessionSource.h"
#include "Log.h"
@@ -15,7 +15,7 @@ Session::Session() : failedSource_(nullptr), active_(true), fading_target_(0.f)
filename_ = "";
config_[View::RENDERING] = new Group;
config_[View::RENDERING]->scale_ = FrameBuffer::getResolutionFromParameters(Settings::application.render.ratio, Settings::application.render.res);
config_[View::RENDERING]->scale_ = glm::vec3(0.f);
config_[View::GEOMETRY] = new Group;
config_[View::GEOMETRY]->scale_ = Settings::application.views[View::GEOMETRY].default_scale;
@@ -63,11 +63,19 @@ void Session::setActive (bool on)
// update all sources
void Session::update(float dt)
{
failedSource_ = nullptr;
// no update until render view is initialized
if ( render_.frame() == nullptr )
return;
// pre-render of all sources
failedSource_ = nullptr;
for( SourceList::iterator it = sources_.begin(); it != sources_.end(); it++){
// ensure the RenderSource is rendering this session
RenderSource *s = dynamic_cast<RenderSource *>( *it );
if ( s!= nullptr && s->session() != this )
s->setSession(this);
if ( (*it)->failed() ) {
failedSource_ = (*it);
}
@@ -91,32 +99,33 @@ void Session::update(float dt)
// draw render view in Frame Buffer
render_.draw();
// grab frames to recorders & streamers
FrameGrabbing::manager().grabFrame(render_.frame(), dt);
}
SourceList::iterator Session::addSource(Source *s)
{
SourceList::iterator its = sources_.end();
// lock before change
access_.lock();
// find the source
SourceList::iterator its = find(s);
its = find(s);
// ok, its NOT in the list !
if (its == sources_.end()) {
// insert the source in the rendering
render_.scene.ws()->attach(s->group(View::RENDERING));
// insert the source to the beginning of the list
sources_.push_front(s);
// return the iterator to the source created at the beginning
its = sources_.begin();
}
// unlock access
access_.unlock();
// return the iterator to the source created at the beginning
return sources_.begin();
return its;
}
SourceList::iterator Session::deleteSource(Source *s)
@@ -181,10 +190,12 @@ Source *Session::popSource()
return s;
}
void Session::setResolution(glm::vec3 resolution)
void Session::setResolution(glm::vec3 resolution, bool useAlpha)
{
render_.setResolution(resolution);
config_[View::RENDERING]->scale_ = resolution;
// setup the render view: if not specified the default config resulution will be used
render_.setResolution( resolution, useAlpha );
// store the actual resolution set in the render view
config_[View::RENDERING]->scale_ = render_.resolution();
}
void Session::setFading(float f, bool forcenow)
@@ -225,6 +236,11 @@ SourceList::iterator Session::find(Node *node)
return std::find_if(sources_.begin(), sources_.end(), Source::hasNode(node));
}
SourceList::iterator Session::find(float depth_from, float depth_to)
{
return std::find_if(sources_.begin(), sources_.end(), Source::hasDepth(depth_from, depth_to));
}
uint Session::numSource() const
{
return sources_.size();
@@ -275,6 +291,23 @@ int Session::index(SourceList::iterator it) const
return index;
}
void Session::move(int current_index, int target_index)
{
if ( current_index < 0 || current_index > (int) sources_.size()
|| target_index < 0 || target_index > (int) sources_.size()
|| target_index == current_index )
return;
SourceList::iterator from = at(current_index);
SourceList::iterator to = at(target_index);
if ( target_index > current_index )
to++;
Source *s = (*from);
sources_.erase(from);
sources_.insert(to, s);
}
void Session::lock()
{
access_.lock();
@@ -286,9 +319,9 @@ void Session::unlock()
}
Session *Session::load(const std::string& filename)
Session *Session::load(const std::string& filename, uint recursion)
{
SessionCreator creator;
SessionCreator creator(recursion);
creator.load(filename);
return creator.session();

View File

@@ -14,7 +14,7 @@ public:
Session();
~Session();
static Session *load(const std::string& filename);
static Session *load(const std::string& filename, uint recursion = 0);
// add given source into the session
SourceList::iterator addSource (Source *s);
@@ -38,12 +38,14 @@ public:
SourceList::iterator find (Source *s);
SourceList::iterator find (std::string name);
SourceList::iterator find (Node *node);
SourceList::iterator find (float depth_from, float depth_to);
SourceList::iterator find (uint64_t id);
std::list<uint64_t> getIdList() const;
SourceList::iterator at (int index);
int index (SourceList::iterator it) const;
int index (SourceList::iterator it) const;
void move (int current_index, int target_index);
// update all sources and mark sources which failed
void update (float dt);
@@ -59,7 +61,7 @@ public:
inline FrameBuffer *frame () const { return render_.frame(); }
// configure rendering resolution
void setResolution(glm::vec3 resolution);
void setResolution(glm::vec3 resolution, bool useAlpha = false);
// manipulate fading of output
void setFading(float f, bool forcenow = false);

View File

@@ -52,7 +52,7 @@ std::string SessionCreator::info(const std::string& filename)
return ret;
}
SessionCreator::SessionCreator(): SessionLoader(nullptr)
SessionCreator::SessionCreator(int recursion): SessionLoader(nullptr, recursion)
{
}
@@ -85,12 +85,12 @@ void SessionCreator::load(const std::string& filename)
// session file seems legit, create a session
session_ = new Session;
// load views config (includes resolution of session rendering)
loadConfig( xmlDoc_.FirstChildElement("Views") );
// ready to read sources
SessionLoader::load( xmlDoc_.FirstChildElement("Session") );
// load optionnal config
loadConfig( xmlDoc_.FirstChildElement("Views") );
// all good
session_->setFilename(filename);
}
@@ -108,7 +108,7 @@ void SessionCreator::loadConfig(XMLElement *viewsNode)
}
}
SessionLoader::SessionLoader(Session *session): Visitor(), session_(session)
SessionLoader::SessionLoader(Session *session, int recursion): Visitor(), session_(session), recursion_(recursion)
{
}
@@ -117,6 +117,11 @@ void SessionLoader::load(XMLElement *sessionNode)
{
sources_id_.clear();
if (recursion_ > MAX_SESSION_LEVEL) {
Log::Warning("Recursive or imbricated sessions detected! Interrupting loading after %d iterations.\n", MAX_SESSION_LEVEL);
return;
}
if (sessionNode != nullptr && session_ != nullptr) {
XMLElement* sourceNode = sessionNode->FirstChildElement("Source");
@@ -142,10 +147,13 @@ void SessionLoader::load(XMLElement *sessionNode)
load_source = new MediaSource;
}
else if ( std::string(pType) == "SessionSource") {
load_source = new SessionSource;
load_source = new SessionFileSource;
}
else if ( std::string(pType) == "GroupSource") {
load_source = new SessionGroupSource;
}
else if ( std::string(pType) == "RenderSource") {
load_source = new RenderSource(session_);
load_source = new RenderSource;
}
else if ( std::string(pType) == "PatternSource") {
load_source = new PatternSource;
@@ -220,7 +228,7 @@ void SessionLoader::load(XMLElement *sessionNode)
}
Source *SessionLoader::cloneOrCreateSource(tinyxml2::XMLElement *sourceNode)
Source *SessionLoader::createSource(tinyxml2::XMLElement *sourceNode, bool clone_duplicates)
{
xmlCurrent_ = sourceNode;
@@ -228,10 +236,13 @@ Source *SessionLoader::cloneOrCreateSource(tinyxml2::XMLElement *sourceNode)
Source *load_source = nullptr;
bool is_clone = false;
SourceList::iterator sit = session_->end();
// check if a source with the given id exists in the session
uint64_t id__ = 0;
xmlCurrent_->QueryUnsigned64Attribute("id", &id__);
SourceList::iterator sit = session_->find(id__);
if (clone_duplicates) {
uint64_t id__ = 0;
xmlCurrent_->QueryUnsigned64Attribute("id", &id__);
sit = session_->find(id__);
}
// no source with this id exists
if ( sit == session_->end() ) {
@@ -242,10 +253,13 @@ Source *SessionLoader::cloneOrCreateSource(tinyxml2::XMLElement *sourceNode)
load_source = new MediaSource;
}
else if ( std::string(pType) == "SessionSource") {
load_source = new SessionSource;
load_source = new SessionFileSource;
}
else if ( std::string(pType) == "GroupSource") {
load_source = new SessionGroupSource;
}
else if ( std::string(pType) == "RenderSource") {
load_source = new RenderSource(session_);
load_source = new RenderSource;
}
else if ( std::string(pType) == "PatternSource") {
load_source = new PatternSource;
@@ -278,8 +292,6 @@ Source *SessionLoader::cloneOrCreateSource(tinyxml2::XMLElement *sourceNode)
// apply config to source
if (load_source) {
load_source->accept(*this);
// reset mixing (force to place in mixing scene)
load_source->group(View::MIXING)->translation_ = glm::vec3(DEFAULT_MIXING_TRANSLATION, 0.f);
// increment depth for clones (avoid supperposition)
if (is_clone)
load_source->group(View::LAYER)->translation_.z += 0.2f;
@@ -447,6 +459,9 @@ void SessionLoader::visit (Source& s)
XMLElement* sourceNode = xmlCurrent_;
const char *pName = sourceNode->Attribute("name");
s.setName(pName);
bool l = false;
sourceNode->QueryBoolAttribute("locked", &l);
s.setLocked(l);
xmlCurrent_ = sourceNode->FirstChildElement("Mixing");
if (xmlCurrent_) s.groupNode(View::MIXING)->accept(*this);
@@ -518,17 +533,36 @@ void SessionLoader::visit (MediaSource& s)
s.mediaplayer()->accept(*this);
}
void SessionLoader::visit (SessionSource& s)
void SessionLoader::visit (SessionFileSource& s)
{
// set uri
XMLElement* pathNode = xmlCurrent_->FirstChildElement("path");
if (pathNode) {
std::string path = std::string ( pathNode->GetText() );
// load only new files
if ( path != s.path() )
s.load(path);
s.load(path, recursion_ + 1);
}
}
void SessionLoader::visit (SessionGroupSource& s)
{
// set resolution from host session
s.setResolution( session_->config(View::RENDERING)->scale_ );
// get the inside session
XMLElement* sessionGroupNode = xmlCurrent_->FirstChildElement("Session");
if (sessionGroupNode) {
// load session inside group
SessionLoader grouploader( s.session(), recursion_ + 1 );
grouploader.load( sessionGroupNode );
}
}
void SessionLoader::visit (RenderSource& s)
{
s.setSession( session_ );
}
void SessionLoader::visit (PatternSource& s)

View File

@@ -13,13 +13,13 @@ class SessionLoader : public Visitor {
public:
SessionLoader(Session *session);
SessionLoader(Session *session, int recursion = 0);
inline Session *session() const { return session_; }
void load(tinyxml2::XMLElement *sessionNode);
inline std::list<uint64_t> getIdList() const { return sources_id_; }
Source *cloneOrCreateSource(tinyxml2::XMLElement *sourceNode);
Source *createSource(tinyxml2::XMLElement *sourceNode, bool clone_duplicates = true);
// Elements of Scene
void visit (Node& n) override;
@@ -47,7 +47,9 @@ public:
// Sources
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& s) override;
void visit (SessionFileSource& s) override;
void visit (SessionGroupSource& s) override;
void visit (RenderSource& s) override;
void visit (PatternSource& s) override;
void visit (DeviceSource& s) override;
void visit (NetworkSource& s) override;
@@ -56,6 +58,7 @@ protected:
tinyxml2::XMLElement *xmlCurrent_;
Session *session_;
std::list<uint64_t> sources_id_;
int recursion_;
static void XMLToNode(tinyxml2::XMLElement *xml, Node &n);
};
@@ -67,7 +70,7 @@ class SessionCreator : public SessionLoader {
void loadConfig(tinyxml2::XMLElement *viewsNode);
public:
SessionCreator();
SessionCreator(int recursion = 0);
void load(const std::string& filename);

View File

@@ -17,7 +17,81 @@
#include "Mixer.h"
SessionSource::SessionSource() : Source(), path_("")
SessionSource::SessionSource() : Source()
{
failed_ = false;
session_ = new Session;
}
SessionSource::~SessionSource()
{
// delete session
if (session_)
delete session_;
}
Session *SessionSource::detach()
{
// remember pointer to give away
Session *giveaway = session_;
// work on a new session
session_ = new Session;
// make disabled
initialized_ = false;
// ask to delete me
failed_ = true;
// lost ref to previous session: to be deleted elsewhere...
return giveaway;
}
bool SessionSource::failed() const
{
return failed_;
}
uint SessionSource::texture() const
{
if (session_ && session_->frame())
return session_->frame()->texture();
else
return Resource::getTextureBlack();
}
void SessionSource::setActive (bool on)
{
Source::setActive(on);
// change status of session (recursive change of internal sources)
if (session_ != nullptr)
session_->setActive(active_);
}
void SessionSource::update(float dt)
{
if (session_ == nullptr)
return;
// update content
if (active_)
session_->update(dt);
// delete a source which failed
if (session_->failedSource() != nullptr) {
session_->deleteSource(session_->failedSource());
// fail session if all sources failed
if ( session_->numSource() < 1)
failed_ = true;
}
Source::update(dt);
}
SessionFileSource::SessionFileSource() : SessionSource(), path_("")
{
// specific node for transition view
groups_[View::TRANSITION]->visible_ = false;
@@ -27,7 +101,7 @@ SessionSource::SessionSource() : Source(), path_("")
frames_[View::TRANSITION] = new Switch;
Frame *frame = new Frame(Frame::ROUND, Frame::THIN, Frame::DROP);
frame->translation_.z = 0.1;
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.9f);
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.95f);
frames_[View::TRANSITION]->attach(frame);
frame = new Frame(Frame::ROUND, Frame::LARGE, Frame::DROP);
frame->translation_.z = 0.01;
@@ -48,62 +122,36 @@ SessionSource::SessionSource() : Source(), path_("")
groups_[View::TRANSITION]->attach(overlays_[View::TRANSITION]);
// set symbol
symbol_ = new Symbol(Symbol::SESSION, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::SESSION, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
failed_ = false;
wait_for_sources_ = false;
session_ = nullptr;
}
SessionSource::~SessionSource()
{
// delete session
if (session_)
delete session_;
}
void SessionSource::load(const std::string &p)
void SessionFileSource::load(const std::string &p, uint recursion)
{
path_ = p;
if ( path_.empty() )
// delete session
if (session_) {
delete session_;
session_ = nullptr;
}
// init session
if ( path_.empty() ) {
// empty session
session_ = new Session;
else
Log::Warning("Empty Session filename provided.");
}
else {
// launch a thread to load the session file
sessionLoader_ = std::async(std::launch::async, Session::load, path_);
Log::Notify("Opening %s", p.c_str());
sessionLoader_ = std::async(std::launch::async, Session::load, path_, recursion);
Log::Notify("Opening %s", p.c_str());
}
}
Session *SessionSource::detach()
{
// remember pointer to give away
Session *giveaway = session_;
// work on a new session
session_ = new Session;
// make disabled
initialized_ = false;
failed_ = true;
return giveaway;
}
bool SessionSource::failed() const
{
return failed_;
}
uint SessionSource::texture() const
{
if (session_ == nullptr)
return Resource::getTextureBlack();
return session_->frame()->texture();
}
void SessionSource::init()
void SessionFileSource::init()
{
// init is first about getting the loaded session
if (session_ == nullptr) {
@@ -154,7 +202,7 @@ void SessionSource::init()
texturesurface_->setTextureIndex( session_->frame()->texture() );
// create Frame buffer matching size of session
FrameBuffer *renderbuffer = new FrameBuffer( session_->frame()->resolution());
FrameBuffer *renderbuffer = new FrameBuffer( session_->frame()->resolution() );
// set the renderbuffer of the source and attach rendering nodes
attach(renderbuffer);
@@ -164,12 +212,13 @@ void SessionSource::init()
wait_for_sources_ = true;
else {
initialized_ = true;
Log::Info("New Session created.");
Log::Info("New Session created (%d x %d).", renderbuffer->width(), renderbuffer->height());
}
}
}
if (initialized_){
if (initialized_)
{
// remove the loading icon
Node *loader = overlays_[View::TRANSITION]->back();
overlays_[View::TRANSITION]->detach(loader);
@@ -179,38 +228,7 @@ void SessionSource::init()
}
}
void SessionSource::setActive (bool on)
{
Source::setActive(on);
// change status of session (recursive change of internal sources)
if (session_ != nullptr)
session_->setActive(active_);
}
void SessionSource::update(float dt)
{
if (session_ == nullptr)
return;
// update content
if (active_)
session_->update(dt);
// delete a source which failed
if (session_->failedSource() != nullptr) {
session_->deleteSource(session_->failedSource());
// fail session if all sources failed
if ( session_->numSource() < 1)
failed_ = true;
}
Source::update(dt);
}
void SessionSource::accept(Visitor& v)
void SessionFileSource::accept(Visitor& v)
{
Source::accept(v);
if (!failed())
@@ -218,29 +236,116 @@ void SessionSource::accept(Visitor& v)
}
RenderSource::RenderSource(Session *session) : Source(), session_(session)
SessionGroupSource::SessionGroupSource() : SessionSource(), resolution_(glm::vec3(0.f))
{
// // redo frame for layers view
// frames_[View::LAYER]->clear();
// // Groups in LAYER have an additional border
// Group *group = new Group;
// Frame *frame = new Frame(Frame::ROUND, Frame::THIN, Frame::PERSPECTIVE);
// frame->translation_.z = 0.1;
// frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.95f);
// group->attach(frame);
// Frame *persp = new Frame(Frame::GROUP, Frame::THIN, Frame::NONE);
// persp->translation_.z = 0.1;
// persp->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.95f);
// group->attach(persp);
// frames_[View::LAYER]->attach(group);
// group = new Group;
// frame = new Frame(Frame::ROUND, Frame::LARGE, Frame::PERSPECTIVE);
// frame->translation_.z = 0.1;
// frame->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 1.f);
// group->attach(frame);
// persp = new Frame(Frame::GROUP, Frame::LARGE, Frame::NONE);
// persp->translation_.z = 0.1;
// persp->color = glm::vec4( COLOR_HIGHLIGHT_SOURCE, 1.f);
// group->attach(persp);
// frames_[View::LAYER]->attach(group);
// set symbol
symbol_ = new Symbol(Symbol::GROUP, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
void SessionGroupSource::init()
{
if ( resolution_.x > 0.f && resolution_.y > 0.f ) {
session_->setResolution( resolution_ );
// update to draw framebuffer
session_->update( dt_ );
// get the texture index from framebuffer of session, apply it to the surface
texturesurface_->setTextureIndex( session_->frame()->texture() );
// create Frame buffer matching size of session
FrameBuffer *renderbuffer = new FrameBuffer( session_->frame()->resolution() );
// set the renderbuffer of the source and attach rendering nodes
attach(renderbuffer);
// deep update to reorder
View::need_deep_update_++;
// done init
initialized_ = true;
Log::Info("Source Group (%d x %d).", int(renderbuffer->resolution().x), int(renderbuffer->resolution().y) );
}
}
bool SessionGroupSource::import(Source *source)
{
bool ret = false;
if ( session_ )
{
SourceList::iterator its = session_->addSource(source);
if (its != session_->end())
ret = true;
}
return ret;
}
void SessionGroupSource::accept(Visitor& v)
{
Source::accept(v);
if (!failed())
v.visit(*this);
}
RenderSource::RenderSource() : Source(), session_(nullptr)
{
// set symbol
symbol_ = new Symbol(Symbol::RENDER, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::RENDER, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
bool RenderSource::failed() const
{
return session_ == nullptr;
if (initialized_ && session_!=nullptr)
return renderbuffer_->resolution() != session_->frame()->resolution();
return false;
}
uint RenderSource::texture() const
{
if (session_ == nullptr)
return Resource::getTextureBlack();
else
if (session_ && session_->frame())
return session_->frame()->texture();
else
return Resource::getTextureBlack(); // getTextureTransparent ?
}
void RenderSource::init()
{
if (session_ && session_->frame()->texture() != Resource::getTextureBlack()) {
if (session_ && session_->frame() && session_->frame()->texture() != Resource::getTextureBlack()) {
FrameBuffer *fb = session_->frame();
@@ -248,7 +353,7 @@ void RenderSource::init()
texturesurface_->setTextureIndex( fb->texture() );
// create Frame buffer matching size of output session
FrameBuffer *renderbuffer = new FrameBuffer( fb->resolution());
FrameBuffer *renderbuffer = new FrameBuffer( fb->resolution() );
// set the renderbuffer of the source and attach rendering nodes
attach(renderbuffer);
@@ -263,9 +368,19 @@ void RenderSource::init()
}
glm::vec3 RenderSource::resolution() const
{
if (initialized_)
return renderbuffer_->resolution();
else if (session_ && session_->frame())
return session_->frame()->resolution();
else
return glm::vec3(0.f);
}
void RenderSource::accept(Visitor& v)
{
Source::accept(v);
if (!failed())
// if (!failed())
v.visit(*this);
}

View File

@@ -9,48 +9,88 @@ class SessionSource : public Source
{
public:
SessionSource();
~SessionSource();
virtual ~SessionSource();
// implementation of source API
void update (float dt) override;
void setActive (bool on) override;
bool failed() const override;
uint texture() const override;
void accept (Visitor& v) override;
bool failed () const override;
uint texture () const override;
// Session Source specific interface
void load(const std::string &p = "");
Session *detach();
inline std::string path() const { return path_; }
inline Session *session() const { return session_; }
glm::ivec2 icon() const override { return glm::ivec2(3, 16); }
protected:
Session *session_;
std::atomic<bool> failed_;
};
class SessionFileSource : public SessionSource
{
public:
SessionFileSource();
// implementation of source API
void accept (Visitor& v) override;
// SessionFile Source specific interface
void load(const std::string &p = "", uint recursion = 0);
inline std::string path() const { return path_; }
glm::ivec2 icon() const override { return glm::ivec2(19, 6); }
protected:
void init() override;
static void loadSession(const std::string& filename, SessionSource *source);
std::string path_;
Session *session_;
std::atomic<bool> failed_;
std::atomic<bool> wait_for_sources_;
std::future<Session *> sessionLoader_;
};
class SessionGroupSource : public SessionSource
{
public:
SessionGroupSource();
// implementation of source API
void accept (Visitor& v) override;
// SessionGroup Source specific interface
inline void setResolution (glm::vec3 v) { resolution_ = v; }
// import a source
bool import(Source *source);
// TODO import session entirely : bool import();
glm::ivec2 icon() const override { return glm::ivec2(10, 6); }
protected:
void init() override;
glm::vec3 resolution_;
};
class RenderSource : public Source
{
public:
RenderSource(Session *session);
RenderSource();
// implementation of source API
bool failed() const override;
bool failed () const override;
uint texture() const override;
void accept (Visitor& v) override;
inline Session *session () const { return session_; }
inline void setSession (Session *se) { session_ = se; }
glm::vec3 resolution() const;
glm::ivec2 icon() const override { return glm::ivec2(0, 2); }
protected:

View File

@@ -5,6 +5,7 @@
#include "Decorations.h"
#include "Source.h"
#include "MediaSource.h"
#include "Session.h"
#include "SessionSource.h"
#include "PatternSource.h"
#include "DeviceSource.h"
@@ -151,31 +152,34 @@ void SessionVisitor::visit(MediaPlayer &n)
{
XMLElement *newelement = xmlDoc_->NewElement("MediaPlayer");
newelement->SetAttribute("id", n.id());
newelement->SetAttribute("play", n.isPlaying());
newelement->SetAttribute("loop", (int) n.loop());
newelement->SetAttribute("speed", n.playSpeed());
// timeline
XMLElement *timelineelement = xmlDoc_->NewElement("Timeline");
if (!n.isImage()) {
newelement->SetAttribute("play", n.isPlaying());
newelement->SetAttribute("loop", (int) n.loop());
newelement->SetAttribute("speed", n.playSpeed());
// gaps in timeline
XMLElement *gapselement = xmlDoc_->NewElement("Gaps");
TimeIntervalSet gaps = n.timeline()->gaps();
for( auto it = gaps.begin(); it!= gaps.end(); it++) {
XMLElement *g = xmlDoc_->NewElement("Interval");
g->SetAttribute("begin", (*it).begin);
g->SetAttribute("end", (*it).end);
gapselement->InsertEndChild(g);
// timeline
XMLElement *timelineelement = xmlDoc_->NewElement("Timeline");
// gaps in timeline
XMLElement *gapselement = xmlDoc_->NewElement("Gaps");
TimeIntervalSet gaps = n.timeline()->gaps();
for( auto it = gaps.begin(); it!= gaps.end(); it++) {
XMLElement *g = xmlDoc_->NewElement("Interval");
g->SetAttribute("begin", (*it).begin);
g->SetAttribute("end", (*it).end);
gapselement->InsertEndChild(g);
}
timelineelement->InsertEndChild(gapselement);
// fading in timeline
XMLElement *fadingelement = xmlDoc_->NewElement("Fading");
XMLElement *array = XMLElementEncodeArray(xmlDoc_, n.timeline()->fadingArray(), MAX_TIMELINE_ARRAY * sizeof(float));
fadingelement->InsertEndChild(array);
timelineelement->InsertEndChild(fadingelement);
newelement->InsertEndChild(timelineelement);
}
timelineelement->InsertEndChild(gapselement);
// fading in timeline
XMLElement *fadingelement = xmlDoc_->NewElement("Fading");
XMLElement *array = XMLElementEncodeArray(xmlDoc_, n.timeline()->fadingArray(), MAX_TIMELINE_ARRAY * sizeof(float));
fadingelement->InsertEndChild(array);
timelineelement->InsertEndChild(fadingelement);
newelement->InsertEndChild(timelineelement);
xmlCurrent_->InsertEndChild(newelement);
}
@@ -342,6 +346,7 @@ void SessionVisitor::visit (Source& s)
XMLElement *sourceNode = xmlDoc_->NewElement( "Source" );
sourceNode->SetAttribute("id", s.id());
sourceNode->SetAttribute("name", s.name().c_str() );
sourceNode->SetAttribute("locked", s.locked() );
// insert into hierarchy
xmlCurrent_->InsertFirstChild(sourceNode);
@@ -412,7 +417,7 @@ void SessionVisitor::visit (MediaSource& s)
s.mediaplayer()->accept(*this);
}
void SessionVisitor::visit (SessionSource& s)
void SessionVisitor::visit (SessionFileSource& s)
{
xmlCurrent_->SetAttribute("type", "SessionSource");
@@ -422,6 +427,22 @@ void SessionVisitor::visit (SessionSource& s)
path->InsertEndChild( text );
}
void SessionVisitor::visit (SessionGroupSource& s)
{
xmlCurrent_->SetAttribute("type", "GroupSource");
Session *se = s.session();
XMLElement *rootgroup = xmlDoc_->NewElement("Session");
xmlCurrent_->InsertEndChild(rootgroup);
for (auto iter = se->begin(); iter != se->end(); iter++){
setRoot(rootgroup);
(*iter)->accept(*this);
}
}
void SessionVisitor::visit (RenderSource&)
{
xmlCurrent_->SetAttribute("type", "RenderSource");

View File

@@ -44,7 +44,8 @@ public:
// Sources
void visit (Source& s) override;
void visit (MediaSource& s) override;
void visit (SessionSource& s) override;
void visit (SessionFileSource& s) override;
void visit (SessionGroupSource& s) override;
void visit (RenderSource&) override;
void visit (CloneSource& s) override;
void visit (PatternSource& s) override;

View File

@@ -110,6 +110,11 @@ void Settings::Save()
SourceConfNode->SetAttribute("res", application.source.res);
pRoot->InsertEndChild(SourceConfNode);
// Brush
XMLElement *BrushNode = xmlDoc.NewElement( "Brush" );
BrushNode->InsertEndChild( XMLElementFromGLM(&xmlDoc, application.brush) );
pRoot->InsertEndChild(BrushNode);
// bloc connections
{
XMLElement *connectionsNode = xmlDoc.NewElement( "Connections" );
@@ -131,6 +136,7 @@ void Settings::Save()
// save current view only if [mixing, geometry, layers, appearance]
int v = application.current_view > 4 ? 1 : application.current_view;
viewsNode->SetAttribute("current", v);
viewsNode->SetAttribute("workspace", application.current_workspace);
map<int, Settings::ViewConfig>::iterator iter;
for (iter=application.views.begin(); iter != application.views.end(); iter++)
@@ -325,6 +331,12 @@ void Settings::Load()
}
}
// Brush
XMLElement * brushnode = pRoot->FirstChildElement("Brush");
if (brushnode != nullptr) {
tinyxml2::XMLElementToGLM( brushnode->FirstChildElement("vec3"), application.brush);
}
// bloc views
{
application.views.clear(); // trash existing list
@@ -332,6 +344,7 @@ void Settings::Load()
if (pElement)
{
pElement->QueryIntAttribute("current", &application.current_view);
pElement->QueryIntAttribute("workspace", &application.current_workspace);
XMLElement* viewNode = pElement->FirstChildElement("View");
for( ; viewNode ; viewNode=viewNode->NextSiblingElement())

View File

@@ -190,8 +190,12 @@ struct Application
// Settings of Views
int current_view;
int current_workspace;
std::map<int, ViewConfig> views;
// settings brush texture paint
glm::vec3 brush;
// settings render
RenderConfig render;
@@ -221,6 +225,8 @@ struct Application
action_history_follow_view = false;
accept_connections = false;
current_view = 1;
current_workspace= 1;
brush = glm::vec3(0.5f, 0.1f, 0.f);
windows = std::vector<WindowConfig>(3);
windows[0].name = APP_NAME APP_TITLE;
windows[0].w = 1600;

View File

@@ -1,4 +1,4 @@
#include "Shader.h"
#include "Shader.h"
#include "Resource.h"
#include "FrameBuffer.h"
#include "Log.h"
@@ -23,12 +23,31 @@
ShadingProgram *ShadingProgram::currentProgram_ = nullptr;
ShadingProgram simpleShadingProgram("shaders/simple.vs", "shaders/simple.fs");
// Blending presets for matching with Shader::BlendMode
GLenum blending_equation[6] = { GL_FUNC_ADD, GL_FUNC_ADD, GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_ADD, GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_ADD};
GLenum blending_source_function[6] = { GL_SRC_ALPHA,GL_SRC_ALPHA,GL_SRC_ALPHA,GL_SRC_ALPHA,GL_SRC_ALPHA,GL_SRC_ALPHA};
GLenum blending_destination_function[6] = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE, GL_DST_COLOR, GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA};
// Blending presets for matching with Shader::BlendModes:
GLenum blending_equation[8] = { GL_FUNC_ADD, // normal
GL_FUNC_ADD, // screen
GL_FUNC_REVERSE_SUBTRACT, // subtract
GL_FUNC_ADD, // multiply
GL_FUNC_ADD, // soft light
GL_FUNC_REVERSE_SUBTRACT, // soft subtract
GL_MAX, // lighten only
GL_FUNC_ADD};
GLenum blending_source_function[8] = { GL_ONE, // normal
GL_ONE, // screen
GL_SRC_COLOR, // subtract (can be GL_ONE)
GL_DST_COLOR, // multiply : src x dst color
GL_DST_COLOR, // soft light : src x dst color
GL_DST_COLOR, // soft subtract
GL_ONE, // lighten only
GL_ONE};
GLenum blending_destination_function[8] = {GL_ONE_MINUS_SRC_ALPHA,// normal
GL_ONE, // screen
GL_ONE, // subtract
GL_ONE_MINUS_SRC_ALPHA, // multiply
GL_ONE, // soft light
GL_ONE, // soft subtract
GL_ONE, // lighten only
GL_ZERO};
ShadingProgram::ShadingProgram(const std::string& vertex_file, const std::string& fragment_file) : vertex_id_(0), fragment_id_(0), id_(0)
{
@@ -206,7 +225,7 @@ void Shader::use()
if (!program_->initialized())
program_->init();
// Use program and set uniforms
// Use program
program_->use();
// set uniforms
@@ -221,19 +240,13 @@ void Shader::use()
// Blending Function
if (force_blending_opacity) {
glEnable(GL_BLEND);
glBlendEquation(blending_equation[BLEND_OPACITY]);
glBlendFunc(blending_source_function[BLEND_OPACITY], blending_destination_function[BLEND_OPACITY]);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
else if ( blending != BLEND_CUSTOM ) {
else if ( blending < BLEND_NONE ) {
glEnable(GL_BLEND);
glBlendEquation(blending_equation[blending]);
glBlendFunc(blending_source_function[blending], blending_destination_function[blending]);
// TODO different blending for alpha and color
// glBlendEquationSeparate(blending_equation[blending], GL_FUNC_ADD);
// glBlendFuncSeparate(blending_source_function[blending], blending_destination_function[blending], GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquationSeparate(blending_equation[blending], GL_FUNC_ADD);
glBlendFuncSeparate(blending_source_function[blending], blending_destination_function[blending], GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
else
glDisable(GL_BLEND);

View File

@@ -60,11 +60,13 @@ public:
typedef enum {
BLEND_OPACITY = 0,
BLEND_ADD,
BLEND_SUBSTRACT,
BLEND_LAYER_ADD,
BLEND_LAYER_SUBSTRACT,
BLEND_CUSTOM
BLEND_SCREEN,
BLEND_SUBTRACT,
BLEND_MULTIPLY,
BLEND_SOFT_LIGHT,
BLEND_SOFT_SUBTRACT,
BLEND_LIGHTEN_ONLY,
BLEND_NONE
} BlendMode;
BlendMode blending;
@@ -72,7 +74,6 @@ public:
protected:
ShadingProgram *program_;
};

View File

@@ -1,5 +1,6 @@
#include <algorithm>
#include <locale>
#include <tinyxml2.h>
#include <glm/gtc/matrix_access.hpp>
#include <glm/gtc/matrix_transform.hpp>
@@ -14,10 +15,11 @@
#include "ImageShader.h"
#include "ImageProcessingShader.h"
#include "SystemToolkit.h"
#include "SessionVisitor.h"
#include "Log.h"
#include "Mixer.h"
Source::Source() : initialized_(false), active_(true), locked_(false), need_update_(true), symbol_(nullptr)
Source::Source() : initialized_(false), symbol_(nullptr), active_(true), locked_(false), need_update_(true), workspace_(STAGE)
{
// create unique id
id_ = GlmToolkit::uniqueId();
@@ -41,7 +43,7 @@ Source::Source() : initialized_(false), active_(true), locked_(false), need_upda
frames_[View::MIXING] = new Switch;
Frame *frame = new Frame(Frame::ROUND, Frame::THIN, Frame::DROP);
frame->translation_.z = 0.1;
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.9f);
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.95f);
frames_[View::MIXING]->attach(frame);
frame = new Frame(Frame::ROUND, Frame::LARGE, Frame::DROP);
frame->translation_.z = 0.01;
@@ -63,7 +65,7 @@ Source::Source() : initialized_(false), active_(true), locked_(false), need_upda
frames_[View::GEOMETRY] = new Switch;
frame = new Frame(Frame::SHARP, Frame::THIN, Frame::NONE);
frame->translation_.z = 0.1;
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.7f);
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.8f);
frames_[View::GEOMETRY]->attach(frame);
frame = new Frame(Frame::SHARP, Frame::LARGE, Frame::GLOW);
frame->translation_.z = 0.1;
@@ -117,7 +119,7 @@ Source::Source() : initialized_(false), active_(true), locked_(false), need_upda
frames_[View::LAYER] = new Switch;
frame = new Frame(Frame::ROUND, Frame::THIN, Frame::PERSPECTIVE);
frame->translation_.z = 0.1;
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.8f);
frame->color = glm::vec4( COLOR_DEFAULT_SOURCE, 0.95f);
frames_[View::LAYER]->attach(frame);
frame = new Frame(Frame::ROUND, Frame::LARGE, Frame::PERSPECTIVE);
frame->translation_.z = 0.1;
@@ -178,21 +180,12 @@ Source::Source() : initialized_(false), active_(true), locked_(false), need_upda
groups_[View::TRANSITION] = new Group;
//
// shared locker symbol
//
locker_ = new Symbol(Symbol::LOCK, glm::vec3(0.8f, -0.8f, 0.01f));
locker_->color = glm::vec4(1.f, 1.f, 1.f, 0.6f);
// add semi transparent icon statically to mixing and layer views
Group *lockgroup = new Group;
lockgroup->translation_.z = 0.1;
lockgroup->attach( locker_ );
groups_[View::LAYER]->attach(lockgroup);
groups_[View::MIXING]->attach(lockgroup);
// add semi transparent icon dynamically with overlay
overlays_[View::LAYER]->attach( locker_ );
overlays_[View::MIXING]->attach( locker_ );
// locker switch button : locked / unlocked icons
locker_ = new Switch;
lock_ = new Handles(Handles::LOCKED);
locker_->attach(lock_);
unlock_ = new Handles(Handles::UNLOCKED);
locker_->attach(unlock_);
// create objects
stored_status_ = new Group;
@@ -299,7 +292,7 @@ void Source::setMode(Source::Mode m)
// show overlay if current
bool current = m >= Source::CURRENT;
for (auto o = overlays_.begin(); o != overlays_.end(); o++)
(*o).second->visible_ = current;
(*o).second->visible_ = current & !locked_;
// show in appearance view if current
groups_[View::APPEARANCE]->visible_ = m > Source::VISIBLE;
@@ -359,6 +352,13 @@ void Source::render()
void Source::attach(FrameBuffer *renderbuffer)
{
// invalid argument
if (renderbuffer == nullptr)
return;
// replace renderbuffer_
if (renderbuffer_)
delete renderbuffer_;
renderbuffer_ = renderbuffer;
// if a symbol is available, add it to overlay
@@ -389,6 +389,14 @@ void Source::attach(FrameBuffer *renderbuffer)
if (groups_[View::TRANSITION]->numChildren() > 0)
groups_[View::TRANSITION]->attach(mixingsurface_);
// hack to place the symbols in the corner independently of aspect ratio
symbol_->translation_.x += 0.1f * (renderbuffer_->aspectRatio()-1.f);
// add lock icon to views (displayed on front)
groups_[View::LAYER]->attach( locker_ );
groups_[View::MIXING]->attach( locker_ );
groups_[View::GEOMETRY]->attach( locker_ );
// scale all icon nodes to match aspect ratio
for (int v = View::MIXING; v < View::INVALID; v++) {
NodeSet::iterator node;
@@ -398,10 +406,6 @@ void Source::attach(FrameBuffer *renderbuffer)
}
}
// hack to place the symbols in the corner independently of aspect ratio
symbol_->translation_.x += 0.1f * (renderbuffer_->aspectRatio()-1.f);
locker_->translation_.x += 0.1f * (renderbuffer_->aspectRatio()-1.f);
// (re) create the masking buffer
if (maskbuffer_)
delete maskbuffer_;
@@ -430,22 +434,16 @@ void Source::setActive (bool on)
groups_[View::RENDERING]->visible_ = active_;
groups_[View::GEOMETRY]->visible_ = active_;
groups_[View::LAYER]->visible_ = active_;
}
void Source::setLocked (bool on)
{
locked_ = on;
// the lock icon is visible when locked
locker_->visible_ = on;
// a locked source is not visible in the GEOMETRY view (that's the whole point of it!)
groups_[View::GEOMETRY]->visible_ = !locked_;
// the lock icon
locker_->setActive( on ? 0 : 1);
}
// Transfer functions from coordinates to alpha (1 - transparency)
float linear_(float x, float y) {
return 1.f - CLAMP( sqrt( ( x * x ) + ( y * y ) ), 0.f, 1.f );
@@ -461,6 +459,47 @@ float sin_quad(float x, float y) {
// return 0.5f + 0.5f * cos( M_PI * CLAMP( ( ( x * x ) + ( y * y ) ), 0.f, 1.f ) );
}
float Source::depth() const
{
return group(View::RENDERING)->translation_.z;
}
void Source::setDepth(float d)
{
groups_[View::LAYER]->translation_.z = CLAMP(d, MIN_DEPTH, MAX_DEPTH);
touch();
}
float Source::alpha() const
{
return blendingShader()->color.a;
}
void Source::setAlpha(float a)
{
// todo clamp a
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
glm::vec2 step = glm::normalize(dist) * 0.01f;
// special case: perfectly centered (step is null).
if ( glm::length(dist) < EPSILON)
// step in the diagonal
step = glm::vec2(0.01f, 0.01f);
// converge linearly to reduce the difference of alpha
float delta = sin_quad(dist.x, dist.y) - CLAMP(a, 0.f, 1.f);
while ( glm::abs(delta) > 0.01f ){
dist += step * glm::sign(delta);
delta = sin_quad(dist.x, dist.y) - CLAMP(a, 0.f, 1.f);
}
// apply new mixing coordinates
groups_[View::MIXING]->translation_.x = dist.x;
groups_[View::MIXING]->translation_.y = dist.y;
touch();
}
void Source::update(float dt)
{
// keep delta-t
@@ -469,13 +508,11 @@ void Source::update(float dt)
// update nodes if needed
if (renderbuffer_ && mixingsurface_ && maskbuffer_ && need_update_)
{
// Log::Info("UPDATE %s %f", initials_, dt);
// ADJUST alpha based on MIXING node
// read position of the mixing node and interpret this as transparency of render output
glm::vec2 dist = glm::vec2(groups_[View::MIXING]->translation_);
// use the sinusoidal transfer function
blendingshader_->color = glm::vec4(1.0, 1.0, 1.0, sin_quad( dist.x, dist.y ));
blendingshader_->color = glm::vec4(1.f, 1.f, 1.f, sin_quad( dist.x, dist.y ));
mixingshader_->color = blendingshader_->color;
// CHANGE update status based on limbo
@@ -504,18 +541,21 @@ void Source::update(float dt)
mixingsurface_->update(dt_);
// Layers icons are displayed in Perspective (diagonal)
groups_[View::LAYER]->translation_.x = -groups_[View::LAYER]->translation_.z;
groups_[View::LAYER]->translation_.y = groups_[View::LAYER]->translation_.x / LAYER_PERSPECTIVE;
// CHANGE lock based on range of layers stage
bool l = (groups_[View::LAYER]->translation_.x < -FOREGROUND_DEPTH)
|| (groups_[View::LAYER]->translation_.x > -BACKGROUND_DEPTH);
setLocked( l );
// adjust position of layer icon: step up when on stage
if (groups_[View::LAYER]->translation_.x < -FOREGROUND_DEPTH)
// Update workspace based on depth, and
// adjust vertical position of icon depending on workspace
if (groups_[View::LAYER]->translation_.x < -LAYER_FOREGROUND) {
groups_[View::LAYER]->translation_.y -= 0.3f;
else if (groups_[View::LAYER]->translation_.x < -BACKGROUND_DEPTH)
workspace_ = Source::FOREGROUND;
}
else if (groups_[View::LAYER]->translation_.x < -LAYER_BACKGROUND) {
groups_[View::LAYER]->translation_.y -= 0.15f;
workspace_ = Source::STAGE;
}
else
workspace_ = Source::BACKGROUND;
// MODIFY depth based on LAYER node
groups_[View::MIXING]->translation_.z = groups_[View::LAYER]->translation_.z;
@@ -637,6 +677,27 @@ void Source::setMask(FrameBufferImage *img)
}
std::string Source::xml(Source *s)
{
std::string x = "";
tinyxml2::XMLDocument xmlDoc;
tinyxml2::XMLElement *selectionNode = xmlDoc.NewElement(APP_NAME);
selectionNode->SetAttribute("size", 1);
xmlDoc.InsertEndChild(selectionNode);
SessionVisitor sv(&xmlDoc, selectionNode);
s->accept(sv);
// get compact string
tinyxml2::XMLPrinter xmlPrint(0, true);
xmlDoc.Print( &xmlPrint );
x = xmlPrint.CStr();
return x;
}
bool Source::hasNode::operator()(const Source* elem) const
{
if (_n && elem)
@@ -677,7 +738,8 @@ CloneSource *Source::clone()
CloneSource::CloneSource(Source *origin) : Source(), origin_(origin)
{
// set symbol
symbol_ = new Symbol(Symbol::CLONE, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::CLONE, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
CloneSource::~CloneSource()

View File

@@ -77,6 +77,7 @@ public:
// a Source has a shader to control mixing effects
inline ImageShader *blendingShader () const { return blendingshader_; }
// a Source has a shader used to render in fbo
inline Shader *renderingShader () const { return renderingshader_; }
@@ -96,12 +97,20 @@ public:
virtual void update (float dt);
// update mode
inline bool active () const { return active_; }
virtual void setActive (bool on);
inline bool active () { return active_; }
// lock mode
inline bool locked () const { return locked_; }
virtual void setLocked (bool on);
inline bool locked () { return locked_; }
// Workspace
typedef enum {
BACKGROUND = 0,
STAGE = 1,
FOREGROUND = 2
} Workspace;
inline Workspace workspace () const { return workspace_; }
// a Source shall informs if the source failed (i.e. shall be deleted)
virtual bool failed () const = 0;
@@ -116,9 +125,16 @@ public:
virtual void accept (Visitor& v);
// operations on mask
void storeMask(FrameBufferImage *img = nullptr);
FrameBufferImage *getMask() const { return maskimage_; }
void setMask(FrameBufferImage *img);
inline FrameBufferImage *getMask () const { return maskimage_; }
void setMask (FrameBufferImage *img);
void storeMask (FrameBufferImage *img = nullptr);
float depth () const;
void setDepth (float d);
float alpha () const;
void setAlpha (float a);
struct hasNode: public std::unary_function<Source*, bool>
{
@@ -148,8 +164,25 @@ public:
uint64_t _id;
};
struct hasDepth: public std::unary_function<Source*, bool>
{
inline bool operator()(const Source* elem) const {
return (elem && elem->depth()>_from && elem->depth()<_to );
}
hasDepth(float d1, float d2) {
_from = MIN(d1, d2);
_to = MAX(d1, d2);
}
private:
float _from;
float _to;
};
virtual glm::ivec2 icon () const { return glm::ivec2(12, 11); }
// get the xml description text of a source
static std::string xml(Source *s);
protected:
// name
std::string name_;
@@ -200,7 +233,9 @@ protected:
std::map<View::Mode, Group*> overlays_;
std::map<View::Mode, Switch*> frames_;
std::map<View::Mode, Handles*[7]> handles_;
Symbol *symbol_, *locker_;
Handles *lock_, *unlock_;
Switch *locker_;
Symbol *symbol_;
// update
bool active_;
@@ -208,6 +243,7 @@ protected:
bool need_update_;
float dt_;
Group *stored_status_;
Workspace workspace_;
// clones
CloneList clones_;

View File

@@ -18,7 +18,8 @@ GenericStreamSource::GenericStreamSource() : StreamSource()
stream_ = new Stream;
// set symbol
symbol_ = new Symbol(Symbol::EMPTY, glm::vec3(0.8f, 0.8f, 0.01f));
symbol_ = new Symbol(Symbol::EMPTY, glm::vec3(0.75f, 0.75f, 0.01f));
symbol_->scale_.y = 1.5f;
}
void GenericStreamSource::setDescription(const std::string &desc)

View File

@@ -109,6 +109,24 @@ string SystemToolkit::byte_to_string(long b)
return oss.str();
}
string SystemToolkit::bits_to_string(long b)
{
double numbytes = static_cast<double>(b);
ostringstream oss;
std::list<std::string> list = {" bit", " Kbit", " Mbit", " Gbit", " Tbit"};
std::list<std::string>::iterator i = list.begin();
while(numbytes >= 1000.0 && i != list.end())
{
i++;
numbytes /= 1000.0;
}
oss << std::fixed << std::setprecision(2) << numbytes << *i;
return oss.str();
}
string SystemToolkit::date_time_string()
{

View File

@@ -76,6 +76,9 @@ namespace SystemToolkit
// get a string to display memory size with unit KB, MB, GB, TB
std::string byte_to_string(long b);
// get a string to display bit size with unit Kbit, MBit, Gbit, Tbit
std::string bits_to_string(long b);
// get a transliteration to Latin of any string
std::string transliterate(std::string input);
}

View File

@@ -71,7 +71,6 @@ static TextEditor editor;
// utility functions
void ShowAboutGStreamer(bool* p_open);
void ShowAboutOpengl(bool* p_open);
void ShowConfig(bool* p_open);
void ShowSandbox(bool* p_open);
// static objects for multithreaded file dialog
@@ -162,6 +161,8 @@ UserInterface::UserInterface()
show_imgui_about = false;
show_gst_about = false;
show_opengl_about = false;
show_view_navigator = 0;
target_view_navigator = 1;
currentTextEdit = "";
screenshot_step = 0;
@@ -262,7 +263,7 @@ void UserInterface::handleKeyboard()
}
else if (ImGui::IsKeyPressed( GLFW_KEY_S )) {
// Save Session
if (Mixer::manager().session()->filename().empty())
if (shift_modifier_active || Mixer::manager().session()->filename().empty())
selectSaveFilename();
else
Mixer::manager().save();
@@ -271,6 +272,10 @@ void UserInterface::handleKeyboard()
// New Session
Mixer::manager().close();
}
// else if (ImGui::IsKeyPressed( GLFW_KEY_SPACE )) {
// // New Session
// Mixer::manager().session()->setActive( !Mixer::manager().session()->active() );
// }
else if (ImGui::IsKeyPressed( GLFW_KEY_L )) {
// Logs
Settings::application.widget.logs = !Settings::application.widget.logs;
@@ -382,7 +387,7 @@ void UserInterface::handleKeyboard()
else if (ImGui::IsKeyPressed( GLFW_KEY_INSERT ))
navigator.togglePannelNew();
// button tab to select next
else if (ImGui::IsKeyPressed( GLFW_KEY_TAB )) {
else if ( !alt_modifier_active && ImGui::IsKeyPressed( GLFW_KEY_TAB )) {
if (shift_modifier_active)
Mixer::manager().setCurrentPrevious();
else
@@ -400,6 +405,17 @@ void UserInterface::handleKeyboard()
}
}
// special case: CTRL + TAB is ALT + TAB in OSX
if (io.ConfigMacOSXBehaviors ? io.KeyAlt : io.KeyCtrl) {
if (ImGui::IsKeyPressed( GLFW_KEY_TAB ))
show_view_navigator += shift_modifier_active ? 3 : 1;
}
else if (show_view_navigator > 0) {
show_view_navigator = 0;
Mixer::manager().setView((View::Mode) target_view_navigator);
}
// confirmation for leaving vimix: prevent un-wanted Ctrl+Q, but make it easy to confirm
if (ImGui::BeginPopup("confirm_quit_popup"))
{
@@ -547,7 +563,7 @@ void UserInterface::handleMouse()
}
// no source is selected
else
clear_selection = true;
Mixer::manager().unsetCurrentSource();
}
if (clear_selection) {
// unset current
@@ -608,7 +624,7 @@ void UserInterface::handleMouse()
glm::vec2 d = mousepos - mouse_smooth;
mouse_smooth += smoothing * d;
ImVec2 start = ImVec2(mouse_smooth.x / io.DisplayFramebufferScale.x, mouse_smooth.y / io.DisplayFramebufferScale.y);
ImGui::GetBackgroundDrawList()->AddLine(io.MousePos, start, ImGui::GetColorU32(ImGuiCol_ResizeGripHovered), 5.f);
ImGui::GetBackgroundDrawList()->AddLine(io.MousePos, start, ImGui::GetColorU32(ImGuiCol_HeaderActive), 5.f);
}
else
mouse_smooth = mousepos;
@@ -635,10 +651,11 @@ void UserInterface::handleMouse()
}
// Selection area
else {
ImGui::GetBackgroundDrawList()->AddRect(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos,
ImGui::GetColorU32(ImGuiCol_ResizeGripHovered));
ImGui::GetBackgroundDrawList()->AddRectFilled(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos,
ImGui::GetColorU32(ImGuiCol_ResizeGripHovered, 0.3f));
// highlight-colored selection rectangle
ImVec4 color = ImGuiToolkit::HighlightColor();
ImGui::GetBackgroundDrawList()->AddRect(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos, ImGui::GetColorU32(color));
color.w = 0.12; // transparent
ImGui::GetBackgroundDrawList()->AddRectFilled(io.MouseClickedPos[ImGuiMouseButton_Left], io.MousePos, ImGui::GetColorU32(color));
// Bounding box multiple sources selection
Mixer::manager().view()->select(mouseclic[ImGuiMouseButton_Left], mousepos);
@@ -765,7 +782,7 @@ void UserInterface::NewFrame()
void UserInterface::Render()
{
// warning modal dialog
Log::Render();
Log::Render(&Settings::application.widget.logs);
// clear view mode in Transition view
if ( !Settings::application.transition.hide_windows || Settings::application.current_view < View::TRANSITION) {
@@ -784,7 +801,9 @@ void UserInterface::Render()
if (Settings::application.widget.logs)
Log::ShowLogWindow(&Settings::application.widget.logs);
// about dialogs
// dialogs
if (show_view_navigator > 0)
target_view_navigator = RenderViewNavigator( &show_view_navigator );
if (show_vimix_about)
RenderAbout(&show_vimix_about);
if (show_imgui_about)
@@ -842,7 +861,7 @@ void UserInterface::showMenuFile()
if (ImGui::MenuItem( ICON_FA_FILE_UPLOAD " Open", CTRL_MOD "O"))
selectOpenFilename();
if (ImGui::MenuItem( ICON_FA_FILE_UPLOAD " Reload", CTRL_MOD "+Shift+O"))
if (ImGui::MenuItem( ICON_FA_FILE_UPLOAD " Reload", CTRL_MOD "Shift+O"))
Mixer::manager().load( Mixer::manager().session()->filename() );
if (ImGui::MenuItem( ICON_FA_FILE_EXPORT " Import")) {
@@ -861,7 +880,7 @@ void UserInterface::showMenuFile()
navigator.hidePannel();
}
}
if (ImGui::MenuItem( ICON_FA_SAVE " Save as"))
if (ImGui::MenuItem( ICON_FA_SAVE " Save as", CTRL_MOD "Shift+S"))
selectSaveFilename();
ImGui::MenuItem( ICON_FA_FILE_DOWNLOAD " Save on exit", nullptr, &Settings::application.recentSessions.save_on_exit);
@@ -1049,6 +1068,8 @@ void UserInterface::RenderHistory()
bool tmp = false;
if (ImGui::BeginMenuBar())
{
if (ImGuiToolkit::IconButton(4,16))
Settings::application.widget.history = false;
if (ImGui::BeginMenu(IMGUI_TITLE_HISTORY))
{
if ( ImGui::MenuItem( ICON_FA_UNDO " Undo", CTRL_MOD "Z") )
@@ -1139,6 +1160,8 @@ void UserInterface::RenderPreview()
// menu (no title bar)
if (ImGui::BeginMenuBar())
{
if (ImGuiToolkit::IconButton(4,16))
Settings::application.widget.preview = false;
if (ImGui::BeginMenu(IMGUI_TITLE_PREVIEW))
{
glm::ivec2 p = FrameBuffer::getParametersFromResolution(output->resolution());
@@ -1372,6 +1395,97 @@ void UserInterface::RenderPreview()
#endif
}
int UserInterface::RenderViewNavigator(int *shift)
{
// calculate potential target view index :
// - shift increment : minus 1 to not react to first trigger
// - current_view : indices are between 1 (Mixing) and 5 (Appearance)
// - Modulo 4 to allow multiple repetition of shift increment
int target_index = ( (Settings::application.current_view -1)+ (*shift -1) )%4 + 1;
// prepare rendering of centered, fixed-size, semi-transparent window;
ImGuiIO& io = ImGui::GetIO();
ImVec2 window_pos = ImVec2(io.DisplaySize.x / 2.f, io.DisplaySize.y / 2.f);
ImVec2 window_pos_pivot = ImVec2(0.5f, 0.5f);
ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot);
ImGui::SetNextWindowSize(ImVec2(500.f, 120.f + 2.f * ImGui::GetTextLineHeight()), ImGuiCond_Always);
ImGui::SetNextWindowBgAlpha(0.85f);
// show window
if (ImGui::Begin("Views", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
{
// prepare rendering of the array of selectable icons
bool selected_view[View::INVALID] = { };
selected_view[ target_index ] = true;
ImVec2 iconsize(120.f, 120.f);
// draw icons centered horizontally and vertically
ImVec2 alignment = ImVec2(0.4f, 0.5f);
ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment);
// draw in 4 columns
ImGui::Columns(4, NULL, false);
// 4 selectable large icons
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_LARGE);
if (ImGui::Selectable( ICON_FA_BULLSEYE, &selected_view[1], 0, iconsize))
{
Mixer::manager().setView(View::MIXING);
*shift = 0;
}
ImGui::NextColumn();
if (ImGui::Selectable( ICON_FA_OBJECT_UNGROUP , &selected_view[2], 0, iconsize))
{
Mixer::manager().setView(View::GEOMETRY);
*shift = 0;
}
ImGui::NextColumn();
if (ImGui::Selectable( ICON_FA_LAYER_GROUP, &selected_view[3], 0, iconsize))
{
Mixer::manager().setView(View::LAYER);
*shift = 0;
}
ImGui::NextColumn();
if (ImGui::Selectable( ICON_FA_CHESS_BOARD, &selected_view[4], 0, iconsize))
{
Mixer::manager().setView(View::APPEARANCE);
*shift = 0;
}
ImGui::PopFont();
// 4 subtitles (text centered in column)
ImGui::NextColumn();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Mixing").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x);
ImGuiToolkit::PushFont(Settings::application.current_view == 1 ? ImGuiToolkit::FONT_BOLD : ImGuiToolkit::FONT_DEFAULT);
ImGui::Text("Mixing");
ImGui::PopFont();
ImGui::NextColumn();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Geometry").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x);
ImGuiToolkit::PushFont(Settings::application.current_view == 2 ? ImGuiToolkit::FONT_BOLD : ImGuiToolkit::FONT_DEFAULT);
ImGui::Text("Geometry");
ImGui::PopFont();
ImGui::NextColumn();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Layers").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x);
ImGuiToolkit::PushFont(Settings::application.current_view == 3 ? ImGuiToolkit::FONT_BOLD : ImGuiToolkit::FONT_DEFAULT);
ImGui::Text("Layers");
ImGui::PopFont();
ImGui::NextColumn();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (ImGui::GetColumnWidth() - ImGui::CalcTextSize("Texturing").x) * 0.5f - ImGui::GetStyle().ItemSpacing.x);
ImGuiToolkit::PushFont(Settings::application.current_view == 4 ? ImGuiToolkit::FONT_BOLD : ImGuiToolkit::FONT_DEFAULT);
ImGui::Text("Texturing");
ImGui::PopFont();
ImGui::Columns(1);
ImGui::PopStyleVar();
ImGui::End();
}
return target_index;
}
void UserInterface::showMediaPlayer(MediaPlayer *mp)
{
Settings::application.widget.media_player = true;
@@ -1442,6 +1556,8 @@ void MediaController::Render()
// menu (no title bar)
if (ImGui::BeginMenuBar())
{
if (ImGuiToolkit::IconButton(4,16))
Settings::application.widget.media_player = false;
if (ImGui::BeginMenu(IMGUI_TITLE_MEDIAPLAYER))
{
ImGui::MenuItem( ICON_FA_EYE " Preview", nullptr, &Settings::application.widget.media_player_view);
@@ -1535,8 +1651,8 @@ void MediaController::Render()
ImGui::SetCursorScreenPos(tooltip_pos);
ImGui::Text(" %s", mp_->filename().c_str());
ImGui::Text(" %s", mp_->codec().c_str());
if ( mp_->frameRate() > 0.f )
ImGui::Text(" %s", mp_->media().codec_name.c_str());
if ( mp_->frameRate() > 1.f )
ImGui::Text(" %d x %d px, %.2f / %.2f fps", mp_->width(), mp_->height(), mp_->updateFrameRate() , mp_->frameRate() );
else
ImGui::Text(" %d x %d px", mp_->width(), mp_->height());
@@ -1896,8 +2012,8 @@ void Navigator::hidePannel()
void Navigator::Render()
{
std::string about = "";
static uint count_about = 0;
std::string tooltip_ = "";
static uint timer_tooltip_ = 0;
ImGuiIO& io = ImGui::GetIO();
ImGuiStyle& style = ImGui::GetStyle();
@@ -1933,15 +2049,16 @@ void Navigator::Render()
applyButtonSelection(NAV_MENU);
}
if (ImGui::IsItemHovered())
about = "Main menu [Home]";
tooltip_ = "Main menu HOME";
// the list of INITIALS for sources
int index = 0;
SourceList::iterator iter;
for (iter = Mixer::manager().session()->begin(); iter != Mixer::manager().session()->end(); iter++, index++)
{
Source *s = (*iter);
// draw an indicator for current source
if ( (*iter)->mode() >= Source::SELECTED ){
if ( s->mode() >= Source::SELECTED ){
ImDrawList* draw_list = ImGui::GetWindowDrawList();
ImVec2 p1 = ImGui::GetCursorScreenPos() + ImVec2(icon_width, 0.5f * icon_width);
ImVec2 p2 = ImVec2(p1.x + 2.f, p1.y + 2.f);
@@ -1953,13 +2070,35 @@ void Navigator::Render()
draw_list->AddRect(p1, p2, color, 0.0f, 0, 3.f);
}
// draw select box
ImGui::PushID(std::to_string((*iter)->group(View::RENDERING)->id()).c_str());
if (ImGui::Selectable( (*iter)->initials(), &selected_button[index], 0, iconsize))
ImGui::PushID(std::to_string(s->group(View::RENDERING)->id()).c_str());
if (ImGui::Selectable(s->initials(), &selected_button[index], 0, iconsize))
{
applyButtonSelection(index);
if (selected_button[index])
Mixer::manager().setCurrentIndex(index);
}
if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
{
ImGui::SetDragDropPayload("DND_SOURCE", &index, sizeof(int));
ImGui::Text( ICON_FA_SORT " %s ", s->initials());
ImGui::EndDragDropSource();
}
if (ImGui::BeginDragDropTarget())
{
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_SOURCE"))
{
if ( payload->DataSize == sizeof(int) ) {
int payload_index = *(const int*)payload->Data;
int current_source_index = Mixer::manager().indexCurrentSource();
Mixer::manager().session()->move(payload_index, index);
if (payload_index == current_source_index)
applyButtonSelection(index);
}
}
ImGui::EndDragDropTarget();
}
ImGui::PopID();
}
@@ -1970,7 +2109,7 @@ void Navigator::Render()
applyButtonSelection(NAV_NEW);
}
if (ImGui::IsItemHovered())
about = "New Source [Ins]";
tooltip_ = "New Source INS";
}
else {
@@ -1999,46 +2138,42 @@ void Navigator::Render()
view_pannel_visible = previous_view == Settings::application.current_view;
}
if (ImGui::IsItemHovered())
about = "Mixing [ F1 ]";
tooltip_ = "Mixing F1";
if (ImGui::Selectable( ICON_FA_OBJECT_UNGROUP , &selected_view[2], 0, iconsize))
{
if (ImGui::IsItemHovered())
Mixer::manager().setView(View::GEOMETRY);
view_pannel_visible = previous_view == Settings::application.current_view;
}
if (ImGui::IsItemHovered())
about = "Geometry [ F2 ]";
tooltip_ = "Geometry F2";
if (ImGui::Selectable( ICON_FA_LAYER_GROUP, &selected_view[3], 0, iconsize))
{
Mixer::manager().setView(View::LAYER);
view_pannel_visible = previous_view == Settings::application.current_view;
}
if (ImGui::IsItemHovered())
about = "Layers [ F3 ]";
tooltip_ = "Layers F3";
if (ImGui::Selectable( ICON_FA_CHESS_BOARD, &selected_view[4], 0, iconsize))
{
Mixer::manager().setView(View::APPEARANCE);
view_pannel_visible = previous_view == Settings::application.current_view;
}
if (ImGui::IsItemHovered())
about = "Texturing [ F4 ]";
tooltip_ = "Texturing F4";
ImGui::End();
}
if (!about.empty()) {
count_about++;
if (count_about > 100) {
ImGuiToolkit::PushFont(ImGuiToolkit::FONT_DEFAULT);
ImGui::BeginTooltip();
ImGui::Text("%s", about.c_str());
ImGui::EndTooltip();
ImGui::PopFont();
}
// show tooltip
if (!tooltip_.empty()) {
timer_tooltip_++;
// pseudo timeout for showing tooltip
if (timer_tooltip_ > 80)
ImGuiToolkit::ToolTip(tooltip_.substr(0, tooltip_.size()-4).c_str(), tooltip_.substr(tooltip_.size()-4, 4).c_str());
}
else
count_about = 0;
timer_tooltip_ = 0;
if ( view_pannel_visible && !pannel_visible_ )
RenderViewPannel( ImVec2(width_, sourcelist_height_), ImVec2(width_*0.8f, height_ - sourcelist_height_) );
@@ -2082,10 +2217,9 @@ void Navigator::RenderViewPannel(ImVec2 draw_pos , ImVec2 draw_size)
ImGui::SetNextWindowBgAlpha(0.95f); // Transparent background
if (ImGui::Begin("##ViewPannel", NULL, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
{
bool dumm = true;
ImGui::SetCursorPosX(10.f);
ImGui::SetCursorPosY(10.f);
if (ImGuiToolkit::IconToggle(4,7,5,7, &dumm)) {
if (ImGuiToolkit::IconButton(5,7)) {
// reset zoom
Mixer::manager().view((View::Mode)Settings::application.current_view)->recenter();
}
@@ -2497,10 +2631,10 @@ void Navigator::RenderMainPannel()
ImGui::PopFont();
// Icon to switch fullscreen
ImGui::SetCursorPos(ImVec2(pannel_width_ - 35.f, 15.f));
ImGui::SetCursorPos(ImVec2(pannel_width_ - 40.f, 13.f));
const char *tooltip[2] = {"Enter Fullscreen (" CTRL_MOD "Shift+F)", "Exit Fullscreen (" CTRL_MOD "Shift+F)"};
bool fs = Rendering::manager().mainWindow().isFullscreen();
if ( ImGuiToolkit::IconToggle(3,15,2,15, &fs, tooltip ) ) {
if ( ImGuiToolkit::IconToggle(4,15,3,15, &fs, tooltip ) ) {
Rendering::manager().mainWindow().toggleFullscreen();
}
// Session menu
@@ -2625,7 +2759,7 @@ void Navigator::RenderMainPannel()
// display the sessions list and detect if one was selected (double clic)
bool session_selected = false;
ImGui::SetNextItemWidth(IMGUI_RIGHT_ALIGN);
ImGui::ListBoxHeader("##Sessions", 5);
ImGui::ListBoxHeader("##Sessions", CLAMP(sessions_list.size(), 4, 8));
static std::string file_info = "";
static std::list<std::string>::iterator file_selected = sessions_list.end();
for(auto it = sessions_list.begin(); it != sessions_list.end(); it++) {

View File

@@ -113,6 +113,8 @@ class UserInterface
bool show_imgui_about;
bool show_gst_about;
bool show_opengl_about;
int show_view_navigator;
int target_view_navigator;
unsigned int screenshot_step;
// frame grabbers
@@ -165,6 +167,7 @@ protected:
void RenderPreview();
void RenderHistory();
void RenderShaderEditor();
int RenderViewNavigator(int* shift);
void handleKeyboard();
void handleMouse();
void handleScreenshot();

687
View.cpp

File diff suppressed because it is too large Load Diff

51
View.h
View File

@@ -9,11 +9,14 @@
class Source;
typedef std::list<Source *> SourceList;
class SessionSource;
class Session;
class SessionFileSource;
class Surface;
class Symbol;
class Mesh;
class Frame;
class Disk;
class Handles;
class View
{
@@ -60,6 +63,7 @@ public:
// select sources provided a start and end selection points in screen coordinates
virtual void select(glm::vec2, glm::vec2);
virtual void selectAll();
virtual bool canSelect(Source *);
// drag the view provided a start and an end point in screen coordinates
virtual Cursor drag (glm::vec2, glm::vec2);
@@ -93,6 +97,10 @@ protected:
std::string current_action_;
uint64_t current_id_;
Mode mode_;
// contex menu
bool show_context_menu_;
inline void openContextMenu() { show_context_menu_ = true; }
};
@@ -106,8 +114,6 @@ public:
void resize (int) override;
int size () override;
void centerSource(Source *) override;
void select(glm::vec2, glm::vec2) override;
void selectAll() override;
std::pair<Node *, glm::vec2> pick(glm::vec2) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2>) override;
@@ -121,12 +127,12 @@ private:
float limbo_scale_;
Group *slider_root_;
class Disk *slider_;
class Disk *button_white_;
class Disk *button_black_;
class Disk *stashCircle_;
class Mesh *mixingCircle_;
Disk *slider_;
Disk *button_white_;
Disk *button_black_;
Disk *stashCircle_;
Mesh *mixingCircle_;
Mesh *circle_;
};
class RenderView : public View
@@ -139,8 +145,9 @@ public:
~RenderView ();
void draw () override;
bool canSelect(Source *) override;
void setResolution (glm::vec3 resolution = glm::vec3(0.f));
void setResolution (glm::vec3 resolution = glm::vec3(0.f), bool useAlpha = false);
glm::vec3 resolution() const { return frame_buffer_->resolution(); }
void setFading(float f = 0.f);
@@ -158,6 +165,7 @@ public:
void update (float dt) override;
void resize (int) override;
int size () override;
bool canSelect(Source *) override;
std::pair<Node *, glm::vec2> pick(glm::vec2 P) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
@@ -176,7 +184,6 @@ private:
Node *overlay_scaling_cross_;
Node *overlay_scaling_grid_;
Node *overlay_crop_;
bool show_context_menu_;
};
class LayerView : public View
@@ -184,10 +191,13 @@ class LayerView : public View
public:
LayerView();
void draw () override;
void update (float dt) override;
void resize (int) override;
int size () override;
bool canSelect(Source *) override;
std::pair<Node *, glm::vec2> pick(glm::vec2) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
void arrow (glm::vec2) override;
@@ -198,6 +208,10 @@ private:
Mesh *persp_layer_;
Mesh *persp_left_, *persp_right_;
Group *frame_;
Group *overlay_group_;
Frame *overlay_group_frame_;
Handles *overlay_group_icon_;
};
class TransitionView : public View
@@ -208,22 +222,22 @@ public:
void draw () override;
void update (float dt) override;
void zoom (float factor) override;
void selectAll() override;
bool canSelect(Source *) override;
std::pair<Node *, glm::vec2> pick(glm::vec2 P) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
void arrow (glm::vec2) override;
Cursor drag (glm::vec2, glm::vec2) override;
void attach(SessionSource *ts);
class Session *detach();
void attach(SessionFileSource *ts);
Session *detach();
void play(bool open);
private:
Surface *output_surface_;
Mesh *mark_100ms_, *mark_1s_;
Switch *gradient_;
SessionSource *transition_source_;
SessionFileSource *transition_source_;
};
@@ -232,14 +246,12 @@ class AppearanceView : public View
public:
AppearanceView();
void select(glm::vec2, glm::vec2) override;
void selectAll() override;
void draw () override;
void update (float dt) override;
void resize (int) override;
int size () override;
bool canSelect(Source *) override;
void select(glm::vec2 A, glm::vec2 B) override;
std::pair<Node *, glm::vec2> pick(glm::vec2 P) override;
Cursor grab (Source *s, glm::vec2 from, glm::vec2 to, std::pair<Node *, glm::vec2> pick) override;
@@ -280,7 +292,6 @@ private:
Symbol *overlay_rotation_fix_;
Node *overlay_rotation_clock_;
Symbol *overlay_rotation_clock_hand_;
bool show_context_menu_;
// for mask shader draw: 0=cursor, 1=brush, 2=eraser, 3=crop_shape
int mask_cursor_paint_;

View File

@@ -32,7 +32,8 @@ class MediaSource;
class PatternSource;
class DeviceSource;
class GenericStreamSource;
class SessionSource;
class SessionFileSource;
class SessionGroupSource;
class RenderSource;
class CloneSource;
class NetworkSource;
@@ -75,7 +76,8 @@ public:
virtual void visit (GenericStreamSource&) {}
virtual void visit (DeviceSource&) {}
virtual void visit (PatternSource&) {}
virtual void visit (SessionSource&) {}
virtual void visit (SessionFileSource&) {}
virtual void visit (SessionGroupSource&) {}
virtual void visit (RenderSource&) {}
virtual void visit (CloneSource&) {}

View File

@@ -9,6 +9,7 @@
#define XML_VERSION_MAJOR 0
#define XML_VERSION_MINOR 2
#define MAX_RECENT_HISTORY 20
#define MAX_SESSION_LEVEL 3
#define MINI(a, b) (((a) < (b)) ? (a) : (b))
#define MAXI(a, b) (((a) > (b)) ? (a) : (b))
@@ -24,15 +25,13 @@
#define ROUND(val, factor) float( int( val * factor ) ) / factor;
#define SCENE_UNIT 5.f
#define CIRCLE_SQUARE_DIST(x,y) ( (x*x + y*y) / (SCENE_UNIT * SCENE_UNIT * SCENE_UNIT * SCENE_UNIT) )
#define MIN_SCALE 0.01f
#define MAX_SCALE 10.f
#define CLAMP_SCALE(x) SIGN(x) * CLAMP( ABS(x), MIN_SCALE, MAX_SCALE)
#define SCENE_DEPTH 14.f
#define MIN_DEPTH 0.f
#define MAX_DEPTH 12.f
#define BACKGROUND_DEPTH 2.f
#define FOREGROUND_DEPTH 10.f
#define DELTA_DEPTH 0.05f
#define MIXING_DEFAULT_SCALE 2.4f
#define MIXING_MIN_SCALE 0.8f
#define MIXING_MAX_SCALE 7.0f
@@ -45,6 +44,9 @@
#define LAYER_MIN_SCALE 0.4f
#define LAYER_MAX_SCALE 1.7f
#define LAYER_PERSPECTIVE 2.0f
#define LAYER_BACKGROUND 2.f
#define LAYER_FOREGROUND 10.f
#define LAYER_STEP 0.25f
#define APPEARANCE_DEFAULT_SCALE 2.f
#define APPEARANCE_MIN_SCALE 0.4f
#define APPEARANCE_MAX_SCALE 7.0f
@@ -80,17 +82,21 @@
#define COLOR_BGROUND 0.2f, 0.2f, 0.2f
#define COLOR_NAVIGATOR 0.1f, 0.1f, 0.1f
#define COLOR_DEFAULT_SOURCE 0.8f, 0.8f, 0.8f
#define COLOR_DEFAULT_SOURCE 0.7f, 0.7f, 0.7f
#define COLOR_HIGHLIGHT_SOURCE 1.f, 1.f, 1.f
#define COLOR_TRANSITION_SOURCE 1.f, 0.5f, 1.f
#define COLOR_TRANSITION_LINES 0.9f, 0.9f, 0.9f
#define COLOR_APPEARANCE_SOURCE 0.9f, 0.9f, 0.1f
#define COLOR_APPEARANCE_MASK 0.1f, 0.9f, 0.9f
#define COLOR_APPEARANCE_MASK_DISABLE 0.3f, 0.6f, 0.6f
#define COLOR_FRAME 0.8f, 0.f, 0.8f
#define COLOR_FRAME_LIGHT 0.95f, 0.3f, 0.95f
#define COLOR_APPEARANCE_LIGHT 1.0f, 1.0f, 0.9f
#define COLOR_APPEARANCE_MASK 0.9f, 0.9f, 0.9f
#define COLOR_APPEARANCE_MASK_DISABLE 0.6f, 0.6f, 0.6f
#define COLOR_FRAME 0.75f, 0.2f, 0.75f
#define COLOR_FRAME_LIGHT 0.9f, 0.6f, 0.9f
#define COLOR_CIRCLE 0.25f, 0.65f, 0.7f
#define COLOR_CIRCLE_LIGHT 0.6f, 0.95f, 1.f
#define COLOR_LIMBO_CIRCLE 0.16f, 0.16f, 0.16f
#define COLOR_SLIDER_CIRCLE 0.11f, 0.11f, 0.11f
#define COLOR_STASH_CIRCLE 0.06f, 0.06f, 0.06f
#endif // VMIX_DEFINES_H

View File

@@ -9,7 +9,7 @@ monitor or a projector, but can be streamed or recorded live (no audio).
![screenshot](vimix_0.2_beta.jpg)
Check the [Graphical User Manual](https://github.com/brunoherbelin/vimix/wiki/User-manual) for more details.
Check the [Graphical User Manual](https://github.com/brunoherbelin/vimix/wiki/User-manual) for more details or this selection of [videos by Jean Detheux](https://vimeo.com/showcase/7871359).
## Install vimix

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

View File

@@ -27,9 +27,9 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="34.523709"
inkscape:cy="21.609175"
inkscape:zoom="22.627417"
inkscape:cx="35.082716"
inkscape:cy="31.811389"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:document-units="px"
@@ -41,8 +41,8 @@
guidetolerance="10000"
inkscape:window-width="2890"
inkscape:window-height="1885"
inkscape:window-x="982"
inkscape:window-y="112"
inkscape:window-x="817"
inkscape:window-y="89"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
@@ -168,7 +168,7 @@
xlink:href="#linearGradient3237-580"
id="radialGradient855"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.0147937,-0.11912026,0.11328765,3.8182126,-1.0246148,2.407343)"
gradientTransform="matrix(4.0147937,-0.11912026,0.11328765,3.8182126,-0.22443818,-46.542095)"
cx="8"
cy="8"
fx="8"
@@ -191,20 +191,32 @@
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(-0.8,48.8)">
transform="translate(-0.8,48.8)"
style="opacity:0.89674699">
<ellipse
style="fill:#0c0c0c;fill-opacity:0.477137;stroke:none;stroke-width:0.862179;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
id="path854"
cx="32.799999"
cy="-16.91748"
rx="27.470198"
ry="27.375973" />
<path
id="path4090"
d="m 32.8,-48.060406 c -17.255744,0 -31.2604062,14.004662 -31.2604062,31.260406 0,17.25574444 14.0046622,31.260406 31.2604062,31.260406 17.255744,0 31.260406,-14.00466156 31.260406,-31.260406 0,-17.255744 -14.004662,-31.260406 -31.260406,-31.260406 z m 0,3.907551 c 15.098776,0 27.352855,12.254079 27.352855,27.352855 0,15.0987764 -12.254079,27.352856 -27.352855,27.352856 -15.098776,0 -27.3528555,-12.2540796 -27.3528555,-27.352856 0,-15.098776 12.2540795,-27.352855 27.3528555,-27.352855 z"
style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#848484;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.34172;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.6;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
inkscape:connector-curvature="0" />
d="m 32.8,-48.060406 c -17.255744,0 -31.2604061,14.004662 -31.2604061,31.260406 0,17.25574393 14.0046621,31.260406 31.2604061,31.260406 17.255744,0 31.260406,-14.00466207 31.260406,-31.260406 0,-17.255744 -14.004662,-31.260406 -31.260406,-31.260406 z m 0,3.907551 c 15.098776,0 27.352855,12.254079 27.352855,27.352855 0,15.0987763 -12.254079,27.352856 -27.352855,27.352856 -15.098776,0 -27.3528552,-12.2540797 -27.3528552,-27.352856 0,-15.098776 12.2540792,-27.352855 27.3528552,-27.352855 z"
style="display:inline;overflow:visible;visibility:visible;opacity:0.2;fill:#848484;fill-opacity:0.654019;fill-rule:nonzero;stroke:none;stroke-width:4.34172;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3.6;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
inkscape:connector-curvature="0"
inkscape:export-xdpi="405"
inkscape:export-ydpi="405" />
<g
id="g858">
<path
id="path4096"
style="display:inline;overflow:visible;visibility:visible;opacity:0.801;fill:url(#radialGradient855);fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:stroke fill markers;enable-background:accumulate"
d="m 36.688849,-42.590063 c -0.303933,2.108537 -2.081796,3.675579 -4.183594,3.6875 -2.080492,0.0106 -3.863017,-1.50665 -4.21289,-3.585937 -12.672805,2.236616 -21.7888326,13.427755 -21.4160161,26.291015 0.1430268,4.836336 1.636139,9.5362214 4.3105471,13.5683594 L 33.725958,-20.359594 v -1.535156 c 0,-3.229159 2.616539,-5.847657 5.845703,-5.847657 1.906945,0 3.585217,0.927726 4.652344,2.339844 h 1.195313 c 3.875281,0 7.017578,2.093968 7.017578,4.677734 l -7.017578,1.167969 v 5.847656 c 0,6.3779194 -4.259861,11.7530414 -10.085938,13.45898538 l 3.015625,8.15429682 c 0.05432,0.149079 0.106204,0.243515 0.205076,0.378518 C 50.521949,5.6477954 58.834499,-4.9395226 58.733771,-17.193579 58.61364,-29.921919 49.273879,-40.681635 36.688849,-42.590063 Z m 2.769317,19.244586 c -0.764292,0 -1.38415,0.619286 -1.38415,1.384151 0,0.764288 0.619858,1.385691 1.38415,1.385691 0.764291,0 1.385692,-0.621403 1.385692,-1.385691 0,-0.764865 -0.621402,-1.384151 -1.385692,-1.384151 z M 31.800177,0.30446838 c -0.138877,0.0044 -0.274456,0.01953 -0.414062,0.01953 h -2.855469 l 2.800781,7.58007782 c 0.138751,0.380792 0.336318,0.7630677 0.493205,1.0479047 0.763561,0.0573 0.707955,0.03676 1.473592,0.02631 0.559417,-0.01186 1.118303,-0.04182 1.675781,-0.08984 z m -14.0625,0.01953 -2.873047,1.43554602 c 3.582287,3.433627 8.074429,5.76748 12.943359,6.7246095 L 24.788458,0.32399838 Z"
sodipodi:nodetypes="ccccccsscsccscccccssssscsccccccccccc" />
</g>
<path
id="path4096"
style="display:inline;overflow:visible;visibility:visible;opacity:0.801;fill:url(#radialGradient855);fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.09426;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:stroke fill markers;enable-background:accumulate"
d="m 35.888672,6.359375 c -0.303933,2.1085366 -2.081796,3.675579 -4.183594,3.6875 -2.080492,0.0106 -3.863017,-1.5066505 -4.21289,-3.5859375 C 14.819383,8.697554 5.7033554,19.888693 6.0761719,32.751953 c 0.1430268,4.836335 1.636139,9.536221 4.3105471,13.568359 L 32.925781,28.589844 v -1.535156 c 0,-3.229159 2.616539,-5.847657 5.845703,-5.847657 1.906945,0 3.585217,0.927726 4.652344,2.339844 h 1.195313 c 3.875281,0 7.017578,2.093968 7.017578,4.677734 l -7.017578,1.167969 v 5.847656 c 0,6.377919 -4.259861,11.753041 -10.085938,13.458985 l 3.015625,8.154297 c 0.05432,0.149079 0.106204,0.243515 0.205076,0.378518 C 49.721772,54.597233 58.034322,44.009915 57.933594,31.755859 57.813463,19.027519 48.473702,8.2678032 35.888672,6.359375 Z m 2.882812,18.941406 c -0.968462,0 -1.753906,0.78472 -1.753906,1.753907 0,0.968457 0.785445,1.755859 1.753906,1.755859 0.96846,0 1.75586,-0.787402 1.75586,-1.755859 0,-0.969187 -0.787401,-1.753907 -1.75586,-1.753907 z M 31,49.253906 c -0.138877,0.0044 -0.274456,0.01953 -0.414062,0.01953 h -2.855469 l 2.800781,7.580078 c 0.138751,0.380792 0.336318,0.763068 0.493205,1.047905 0.763561,0.0573 0.707955,0.03676 1.473592,0.02631 0.559417,-0.01186 1.118303,-0.04182 1.675781,-0.08984 z m -14.0625,0.01953 -2.873047,1.435546 c 3.582287,3.433627 8.074429,5.76748 12.943359,6.72461 l -3.019531,-8.160156 z"
transform="translate(0.8,-48.8)"
sodipodi:nodetypes="ccccccsscsccscccccssssscsccccccccccc" />
<path
style="opacity:0.80908332;fill:#acacac;fill-opacity:1;stroke:#1c1c1c;stroke-width:1.12343;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
style="opacity:0.809083;fill:#888888;fill-opacity:1;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
id="path859"
sodipodi:type="arc"
sodipodi:cx="32.47654"

Before

Width:  |  Height:  |  Size: 323 KiB

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,332 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 161
property float x
property float y
property float z
element face 161
property list uchar uint vertex_indices
end_header
-0.012242 0.075367 0.000000
-0.001435 0.075367 0.000000
-0.006839 0.075732 0.000000
-0.017428 0.074305 0.000000
0.003751 0.074305 0.000000
-0.022347 0.072593 0.000000
0.008670 0.072593 0.000000
-0.026951 0.070279 0.000000
0.013274 0.070279 0.000000
-0.031194 0.067412 0.000000
0.017517 0.067412 0.000000
-0.035026 0.064038 0.000000
0.021349 0.064038 0.000000
-0.038400 0.060207 0.000000
0.024723 0.060207 0.000000
-0.041268 0.055965 0.000000
0.027591 0.055965 0.000000
-0.043583 0.051362 0.000000
-0.009399 0.054572 0.000000
-0.006839 0.054745 0.000000
-0.004278 0.054572 0.000000
0.029905 0.051362 0.000000
-0.011855 0.054069 0.000000
-0.001822 0.054069 0.000000
-0.014185 0.053258 0.000000
0.000508 0.053258 0.000000
-0.016366 0.052163 0.000000
0.002689 0.052163 0.000000
-0.018376 0.050804 0.000000
0.004699 0.050804 0.000000
-0.045295 0.046444 0.000000
0.031618 0.046444 0.000000
-0.020191 0.049207 0.000000
0.006514 0.049206 0.000000
-0.021789 0.047392 0.000000
0.008112 0.047392 0.000000
-0.023148 0.045383 0.000000
0.009471 0.045383 0.000000
-0.046357 0.041260 0.000000
0.032680 0.041260 0.000000
-0.024244 0.043202 0.000000
0.010567 0.043202 0.000000
-0.025055 0.040872 0.000000
0.011378 0.040872 0.000000
0.033045 0.035857 0.000000
-0.046722 0.035857 0.000000
-0.025558 0.038416 0.000000
0.011881 0.038416 0.000000
-0.025731 0.035857 0.000000
0.012054 0.035857 0.000000
-0.046722 0.035485 0.000000
-0.025731 0.016969 0.000000
0.012054 0.035485 0.000000
0.033045 0.016969 0.000000
-0.046722 0.034458 0.000000
0.012054 0.034458 0.000000
-0.046722 0.032906 0.000000
0.012054 0.032906 0.000000
-0.046722 0.030960 0.000000
0.012054 0.030960 0.000000
-0.046722 0.028752 0.000000
0.012054 0.028752 0.000000
-0.046722 0.026413 0.000000
0.012054 0.026413 0.000000
-0.046722 0.024073 0.000000
0.012054 0.024073 0.000000
-0.046722 0.021865 0.000000
0.012054 0.021865 0.000000
-0.046722 0.019920 0.000000
0.012054 0.019920 0.000000
-0.046722 0.018368 0.000000
0.012054 0.018368 0.000000
-0.046722 0.017340 0.000000
0.012054 0.017340 0.000000
-0.046722 0.016969 0.000000
0.012054 0.016969 0.000000
-0.054728 0.016854 0.000000
-0.053020 0.016969 0.000000
0.039343 0.016969 0.000000
0.041051 0.016854 0.000000
0.042690 0.016519 0.000000
-0.056367 0.016519 0.000000
0.044244 0.015979 0.000000
-0.057921 0.015979 0.000000
0.045698 0.015249 0.000000
-0.059375 0.015249 0.000000
0.047038 0.014344 0.000000
-0.060715 0.014344 0.000000
0.048248 0.013279 0.000000
-0.061925 0.013279 0.000000
0.049312 0.012070 0.000000
-0.062989 0.012070 0.000000
0.050217 0.010731 0.000000
-0.063894 0.010731 0.000000
-0.064624 0.009277 0.000000
0.050947 0.009277 0.000000
-0.065164 0.007723 0.000000
0.051487 0.007723 0.000000
-0.065499 0.006084 0.000000
0.051822 0.006084 0.000000
-0.065614 0.004376 0.000000
0.051937 0.004376 0.000000
-0.065614 0.003385 0.000000
0.051937 0.003385 0.000000
0.051937 0.000645 0.000000
-0.065614 0.000645 0.000000
0.051937 -0.003494 0.000000
-0.065614 -0.003494 0.000000
0.051937 -0.008682 0.000000
-0.065614 -0.008682 0.000000
0.051937 -0.014570 0.000000
-0.065614 -0.014570 0.000000
0.051937 -0.020808 0.000000
-0.065614 -0.020808 0.000000
0.051937 -0.027046 0.000000
-0.065614 -0.027046 0.000000
0.051937 -0.032934 0.000000
-0.065614 -0.032934 0.000000
0.051937 -0.038122 0.000000
-0.065614 -0.038122 0.000000
0.051937 -0.042261 0.000000
-0.065614 -0.042261 0.000000
0.051937 -0.045001 0.000000
-0.065614 -0.045001 0.000000
0.051937 -0.045992 0.000000
-0.065614 -0.045992 0.000000
-0.065499 -0.047701 0.000000
0.051822 -0.047701 0.000000
-0.065164 -0.049339 0.000000
0.051487 -0.049339 0.000000
-0.064624 -0.050893 0.000000
0.050947 -0.050893 0.000000
-0.063894 -0.052347 0.000000
0.050217 -0.052347 0.000000
-0.062989 -0.053686 0.000000
0.049312 -0.053686 0.000000
-0.061925 -0.054896 0.000000
0.048248 -0.054896 0.000000
-0.060715 -0.055960 0.000000
0.047038 -0.055960 0.000000
-0.059375 -0.056865 0.000000
0.045698 -0.056865 0.000000
-0.057921 -0.057595 0.000000
0.044244 -0.057595 0.000000
-0.056367 -0.058135 0.000000
0.042690 -0.058135 0.000000
-0.054728 -0.058470 0.000000
0.041051 -0.058470 0.000000
-0.053020 -0.058585 0.000000
0.039343 -0.058585 0.000000
-0.051202 -0.058585 0.000000
-0.046178 -0.058585 0.000000
-0.038588 -0.058585 0.000000
-0.029074 -0.058585 0.000000
-0.018277 -0.058585 0.000000
-0.006839 -0.058585 0.000000
0.004600 -0.058585 0.000000
0.015397 -0.058585 0.000000
0.024911 -0.058585 0.000000
0.032501 -0.058585 0.000000
0.037525 -0.058585 0.000000
3 0 1 2
3 3 1 0
3 3 4 1
3 5 4 3
3 5 6 4
3 7 6 5
3 7 8 6
3 9 8 7
3 9 10 8
3 11 10 9
3 11 12 10
3 13 12 11
3 13 14 12
3 15 14 13
3 15 16 14
3 17 18 15
3 18 19 15
3 19 16 15
3 19 20 16
3 20 21 16
3 17 22 18
3 23 21 20
3 17 24 22
3 25 21 23
3 17 26 24
3 27 21 25
3 17 28 26
3 29 21 27
3 30 28 17
3 29 31 21
3 30 32 28
3 33 31 29
3 30 34 32
3 35 31 33
3 30 36 34
3 37 31 35
3 38 36 30
3 37 39 31
3 38 40 36
3 41 39 37
3 38 42 40
3 43 39 41
3 43 44 39
3 45 42 38
3 45 46 42
3 47 44 43
3 45 48 46
3 49 44 47
3 50 48 45
3 50 51 48
3 52 44 49
3 52 53 44
3 54 51 50
3 55 53 52
3 56 51 54
3 57 53 55
3 58 51 56
3 59 53 57
3 60 51 58
3 61 53 59
3 62 51 60
3 63 53 61
3 64 51 62
3 65 53 63
3 66 51 64
3 67 53 65
3 68 51 66
3 69 53 67
3 70 51 68
3 71 53 69
3 72 51 70
3 73 53 71
3 74 51 72
3 75 53 73
3 76 74 77
3 76 51 74
3 76 75 51
3 76 53 75
3 76 78 53
3 76 79 78
3 76 80 79
3 81 80 76
3 81 82 80
3 83 82 81
3 83 84 82
3 85 84 83
3 85 86 84
3 87 86 85
3 87 88 86
3 89 88 87
3 89 90 88
3 91 90 89
3 91 92 90
3 93 92 91
3 94 92 93
3 94 95 92
3 96 95 94
3 96 97 95
3 98 97 96
3 98 99 97
3 100 99 98
3 100 101 99
3 102 101 100
3 102 103 101
3 102 104 103
3 105 104 102
3 105 106 104
3 107 106 105
3 107 108 106
3 109 108 107
3 109 110 108
3 111 110 109
3 111 112 110
3 113 112 111
3 113 114 112
3 115 114 113
3 115 116 114
3 117 116 115
3 117 118 116
3 119 118 117
3 119 120 118
3 121 120 119
3 121 122 120
3 123 122 121
3 123 124 122
3 125 124 123
3 126 124 125
3 126 127 124
3 128 127 126
3 128 129 127
3 130 129 128
3 130 131 129
3 132 131 130
3 132 133 131
3 134 133 132
3 134 135 133
3 136 135 134
3 136 137 135
3 138 137 136
3 138 139 137
3 140 139 138
3 140 141 139
3 142 141 140
3 142 143 141
3 144 143 142
3 144 145 143
3 146 145 144
3 146 147 145
3 148 147 146
3 148 149 147
3 150 149 148
3 151 149 150
3 152 149 151
3 153 149 152
3 154 149 153
3 155 149 154
3 156 149 155
3 157 149 156
3 158 149 157
3 159 149 158
3 160 149 159

View File

@@ -0,0 +1,444 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 218
property float x
property float y
property float z
element face 216
property list uchar uint vertex_indices
end_header
0.040385 0.075489 0.000000
0.051230 0.075530 0.000000
0.045805 0.075878 0.000000
0.056437 0.074479 0.000000
0.035192 0.074396 0.000000
0.061378 0.072775 0.000000
0.030273 0.072647 0.000000
0.066004 0.070464 0.000000
0.025675 0.070292 0.000000
0.070267 0.067595 0.000000
0.021443 0.067380 0.000000
0.074118 0.064217 0.000000
0.017624 0.063960 0.000000
0.077509 0.060377 0.000000
0.014265 0.060083 0.000000
0.080392 0.056124 0.000000
0.011412 0.055797 0.000000
0.045753 0.054861 0.000000
0.048336 0.054711 0.000000
0.082719 0.051506 0.000000
0.009113 0.051151 0.000000
0.043198 0.054661 0.000000
0.050817 0.054224 0.000000
0.040752 0.054128 0.000000
0.053172 0.053424 0.000000
0.038435 0.053287 0.000000
0.055376 0.052333 0.000000
0.036271 0.052161 0.000000
0.057409 0.050975 0.000000
0.034279 0.050773 0.000000
0.084441 0.046572 0.000000
0.007413 0.046196 0.000000
0.059245 0.049374 0.000000
0.032483 0.049147 0.000000
0.060863 0.047551 0.000000
0.030904 0.047307 0.000000
0.062238 0.045532 0.000000
0.029563 0.045275 0.000000
0.085509 0.041369 0.000000
0.006358 0.040980 0.000000
0.063349 0.043338 0.000000
0.028482 0.043076 0.000000
0.064170 0.040994 0.000000
0.027683 0.040733 0.000000
0.085876 0.035946 0.000000
0.064680 0.038522 0.000000
0.005997 0.035552 0.000000
0.027188 0.038270 0.000000
0.064855 0.035946 0.000000
0.027018 0.035710 0.000000
0.064855 0.035533 0.000000
0.085876 0.035533 0.000000
0.027018 0.017031 0.000000
0.005997 0.035188 0.000000
0.064855 0.034389 0.000000
0.085876 0.034389 0.000000
0.005997 0.034180 0.000000
0.064855 0.032662 0.000000
0.085876 0.032662 0.000000
0.005997 0.032658 0.000000
0.064855 0.030497 0.000000
0.085876 0.030497 0.000000
0.005997 0.030750 0.000000
0.005997 0.028585 0.000000
0.064855 0.028041 0.000000
0.085876 0.028041 0.000000
0.005997 0.026292 0.000000
0.064855 0.025438 0.000000
0.085876 0.025438 0.000000
0.005997 0.023998 0.000000
0.064855 0.022835 0.000000
0.085876 0.022835 0.000000
0.005997 0.021833 0.000000
0.064855 0.020378 0.000000
0.085876 0.020378 0.000000
0.005997 0.019925 0.000000
0.064855 0.018213 0.000000
0.085876 0.018213 0.000000
0.005997 0.018403 0.000000
0.005997 0.017396 0.000000
0.064855 0.016486 0.000000
0.085876 0.016486 0.000000
0.005997 0.017031 0.000000
-0.054573 0.016916 0.000000
-0.052862 0.017031 0.000000
0.027266 0.017031 0.000000
0.027952 0.017031 0.000000
0.028988 0.017031 0.000000
0.030288 0.017031 0.000000
0.031762 0.017031 0.000000
0.033324 0.017031 0.000000
0.034886 0.017031 0.000000
0.036360 0.017031 0.000000
0.037660 0.017031 0.000000
0.038696 0.017031 0.000000
0.039382 0.017031 0.000000
0.039630 0.017031 0.000000
0.041341 0.016916 0.000000
-0.056214 0.016581 0.000000
0.042982 0.016581 0.000000
-0.057770 0.016040 0.000000
0.044539 0.016040 0.000000
0.064855 0.015343 0.000000
0.085876 0.015343 0.000000
-0.059227 0.015309 0.000000
0.045995 0.015309 0.000000
0.064855 0.014930 0.000000
0.085876 0.014930 0.000000
-0.060568 0.014403 0.000000
0.047336 0.014403 0.000000
0.064913 0.014072 0.000000
0.085819 0.014072 0.000000
-0.061780 0.013337 0.000000
0.048548 0.013337 0.000000
0.085652 0.013249 0.000000
0.065080 0.013249 0.000000
-0.062846 0.012126 0.000000
0.049614 0.012126 0.000000
0.085382 0.012470 0.000000
0.065349 0.012470 0.000000
0.085018 0.011742 0.000000
0.065714 0.011742 0.000000
-0.063752 0.010785 0.000000
0.050520 0.010785 0.000000
0.084566 0.011072 0.000000
0.066166 0.011072 0.000000
0.084034 0.010467 0.000000
0.066698 0.010467 0.000000
-0.064483 0.009329 0.000000
0.051251 0.009329 0.000000
0.083429 0.009935 0.000000
0.067303 0.009935 0.000000
0.082758 0.009483 0.000000
0.067974 0.009483 0.000000
0.082030 0.009118 0.000000
0.068702 0.009118 0.000000
-0.065024 0.007773 0.000000
0.051792 0.007773 0.000000
0.081251 0.008849 0.000000
0.069481 0.008849 0.000000
0.080428 0.008682 0.000000
0.070303 0.008682 0.000000
0.071162 0.008625 0.000000
0.079570 0.008625 0.000000
0.071327 0.008625 0.000000
0.071785 0.008625 0.000000
0.072476 0.008625 0.000000
0.073342 0.008625 0.000000
0.074325 0.008625 0.000000
0.075366 0.008625 0.000000
0.076407 0.008625 0.000000
0.077390 0.008625 0.000000
0.078256 0.008625 0.000000
0.078947 0.008625 0.000000
0.079405 0.008625 0.000000
-0.065359 0.006132 0.000000
0.052128 0.006132 0.000000
-0.065475 0.004421 0.000000
0.052243 0.004421 0.000000
-0.065475 0.003429 0.000000
0.052243 0.003429 0.000000
-0.065475 0.000685 0.000000
0.052243 0.000685 0.000000
-0.065475 -0.003460 0.000000
0.052243 -0.003460 0.000000
-0.065475 -0.008656 0.000000
0.052243 -0.008656 0.000000
-0.065475 -0.014552 0.000000
0.052243 -0.014552 0.000000
-0.065475 -0.020799 0.000000
0.052243 -0.020799 0.000000
-0.065475 -0.027045 0.000000
0.052243 -0.027045 0.000000
-0.065475 -0.032941 0.000000
0.052243 -0.032941 0.000000
-0.065475 -0.038137 0.000000
0.052243 -0.038137 0.000000
-0.065475 -0.042282 0.000000
0.052243 -0.042282 0.000000
-0.065475 -0.045026 0.000000
0.052243 -0.045026 0.000000
-0.065475 -0.046018 0.000000
0.052243 -0.046018 0.000000
-0.065359 -0.047729 0.000000
0.052128 -0.047729 0.000000
-0.065024 -0.049370 0.000000
0.051792 -0.049370 0.000000
-0.064483 -0.050926 0.000000
0.051251 -0.050926 0.000000
-0.063752 -0.052382 0.000000
0.050520 -0.052382 0.000000
-0.062846 -0.053723 0.000000
0.049614 -0.053723 0.000000
-0.061780 -0.054934 0.000000
0.048548 -0.054934 0.000000
-0.060568 -0.056000 0.000000
0.047336 -0.056000 0.000000
-0.059227 -0.056906 0.000000
0.045995 -0.056906 0.000000
-0.057770 -0.057637 0.000000
0.044539 -0.057637 0.000000
-0.056214 -0.058178 0.000000
0.042982 -0.058178 0.000000
-0.054573 -0.058513 0.000000
0.041341 -0.058513 0.000000
-0.052862 -0.058628 0.000000
0.039630 -0.058628 0.000000
-0.051042 -0.058628 0.000000
-0.046011 -0.058628 0.000000
-0.038410 -0.058628 0.000000
-0.028883 -0.058628 0.000000
-0.018070 -0.058628 0.000000
-0.006616 -0.058628 0.000000
0.004839 -0.058628 0.000000
0.015651 -0.058628 0.000000
0.025178 -0.058628 0.000000
0.032779 -0.058628 0.000000
0.037810 -0.058628 0.000000
3 0 1 2
3 0 3 1
3 4 3 0
3 4 5 3
3 6 5 4
3 6 7 5
3 8 7 6
3 8 9 7
3 10 9 8
3 10 11 9
3 12 11 10
3 12 13 11
3 14 13 12
3 14 15 13
3 16 15 14
3 16 17 15
3 17 18 15
3 18 19 15
3 20 21 16
3 21 17 16
3 22 19 18
3 20 23 21
3 24 19 22
3 20 25 23
3 26 19 24
3 20 27 25
3 28 19 26
3 20 29 27
3 28 30 19
3 31 29 20
3 32 30 28
3 31 33 29
3 34 30 32
3 31 35 33
3 36 30 34
3 31 37 35
3 36 38 30
3 39 37 31
3 40 38 36
3 39 41 37
3 42 38 40
3 39 43 41
3 42 44 38
3 45 44 42
3 46 43 39
3 46 47 43
3 48 44 45
3 46 49 47
3 50 44 48
3 50 51 44
3 46 52 49
3 53 52 46
3 54 51 50
3 54 55 51
3 56 52 53
3 57 55 54
3 57 58 55
3 59 52 56
3 60 58 57
3 60 61 58
3 62 52 59
3 63 52 62
3 64 61 60
3 64 65 61
3 66 52 63
3 67 65 64
3 67 68 65
3 69 52 66
3 70 68 67
3 70 71 68
3 72 52 69
3 73 71 70
3 73 74 71
3 75 52 72
3 76 74 73
3 76 77 74
3 78 52 75
3 79 52 78
3 80 77 76
3 80 81 77
3 82 52 79
3 83 82 84
3 83 52 82
3 83 85 52
3 83 86 85
3 83 87 86
3 83 88 87
3 83 89 88
3 83 90 89
3 83 91 90
3 83 92 91
3 83 93 92
3 83 94 93
3 83 95 94
3 83 96 95
3 83 97 96
3 98 97 83
3 98 99 97
3 100 99 98
3 100 101 99
3 102 81 80
3 102 103 81
3 104 101 100
3 104 105 101
3 106 103 102
3 106 107 103
3 108 105 104
3 108 109 105
3 110 107 106
3 110 111 107
3 112 109 108
3 112 113 109
3 110 114 111
3 115 114 110
3 116 113 112
3 116 117 113
3 115 118 114
3 119 118 115
3 119 120 118
3 121 120 119
3 122 117 116
3 122 123 117
3 121 124 120
3 125 124 121
3 125 126 124
3 127 126 125
3 128 123 122
3 128 129 123
3 127 130 126
3 131 130 127
3 131 132 130
3 133 132 131
3 133 134 132
3 135 134 133
3 136 129 128
3 136 137 129
3 135 138 134
3 139 138 135
3 139 140 138
3 141 140 139
3 142 140 141
3 142 143 140
3 144 143 142
3 145 143 144
3 146 143 145
3 147 143 146
3 148 143 147
3 149 143 148
3 150 143 149
3 151 143 150
3 152 143 151
3 153 143 152
3 154 143 153
3 155 137 136
3 155 156 137
3 157 156 155
3 157 158 156
3 159 158 157
3 159 160 158
3 161 160 159
3 161 162 160
3 163 162 161
3 163 164 162
3 165 164 163
3 165 166 164
3 167 166 165
3 167 168 166
3 169 168 167
3 169 170 168
3 171 170 169
3 171 172 170
3 173 172 171
3 173 174 172
3 175 174 173
3 175 176 174
3 177 176 175
3 177 178 176
3 179 178 177
3 179 180 178
3 181 180 179
3 181 182 180
3 183 182 181
3 183 184 182
3 185 184 183
3 185 186 184
3 187 186 185
3 187 188 186
3 189 188 187
3 189 190 188
3 191 190 189
3 191 192 190
3 193 192 191
3 193 194 192
3 195 194 193
3 195 196 194
3 197 196 195
3 197 198 196
3 199 198 197
3 199 200 198
3 201 200 199
3 201 202 200
3 203 202 201
3 203 204 202
3 205 204 203
3 205 206 204
3 207 206 205
3 208 206 207
3 209 206 208
3 210 206 209
3 211 206 210
3 212 206 211
3 213 206 212
3 214 206 213
3 215 206 214
3 216 206 215
3 217 206 216

View File

@@ -0,0 +1,102 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 39
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 49
property list uchar uint vertex_indices
end_header
0.999961 1.039382 0.000000 255 255 255 255
0.036681 1.013523 0.000000 255 255 255 255
0.999928 1.013523 0.000000 255 255 255 255
0.048614 1.000000 0.000000 255 255 255 255
0.999934 1.000000 0.000000 255 255 255 255
0.028181 1.000395 0.000000 255 255 255 255
0.017356 1.011536 0.000000 255 255 255 255
0.007989 0.991539 0.000000 255 255 255 255
-0.011462 0.981739 0.000000 255 255 255 255
-0.003061 1.002581 0.000000 255 255 255 255
-0.013586 0.963042 0.000000 255 255 255 255
-0.000320 0.970926 0.000000 255 255 255 255
-0.040085 0.987614 0.000000 255 255 255 255
-0.034447 1.010591 0.000000 255 255 255 255
-0.021394 1.028161 0.000000 255 255 255 255
-0.000456 1.037345 0.000000 255 255 255 255
0.019362 1.039382 0.000000 255 255 255 255
-0.040085 0.000016 0.000000 255 255 255 255
-0.013585 -0.963025 0.000000 255 255 255 255
-0.013586 0.000008 0.000000 255 255 255 255
-0.040084 -0.987582 0.000000 255 255 255 255
-0.011300 -0.987628 0.000000 255 255 255 255
-0.000159 -0.976754 0.000000 255 255 255 255
-0.000142 -0.951104 0.000000 255 255 255 255
0.008328 -0.992067 0.000000 255 255 255 255
0.015389 -1.011229 0.000000 255 255 255 255
-0.002718 -1.003111 0.000000 255 255 255 255
0.037626 -1.013506 0.000000 255 255 255 255
0.026236 -1.000095 0.000000 255 255 255 255
0.020330 -1.039350 0.000000 255 255 255 255
-0.002473 -1.037015 0.000000 255 255 255 255
-0.021043 -1.028691 0.000000 255 255 255 255
-0.034734 -1.013730 0.000000 255 255 255 255
-0.001031 0.951116 0.000000 255 255 255 255
0.999929 -1.013506 0.000000 255 255 255 255
0.049546 -1.000000 0.000000 255 255 255 255
0.999926 -1.039350 0.000000 255 255 255 255
-0.000142 -0.000000 0.000000 255 255 255 255
0.999922 -1.000000 0.000000 255 255 255 255
3 0 1 2
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 17 10 12
3 17 18 19
3 20 21 18
3 18 22 23
3 21 24 22
3 25 24 26
3 27 28 25
3 25 29 27
3 30 26 31
3 26 32 31
3 23 19 18
3 19 33 10
3 34 35 27
3 27 36 34
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 33 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 17 19 10
3 17 20 18
3 20 32 21
3 18 21 22
3 21 26 24
3 25 28 24
3 27 35 28
3 25 30 29
3 30 25 26
3 26 21 32
3 23 37 19
3 19 37 33
3 34 38 35
3 27 29 36
3 17 12 20

View File

@@ -0,0 +1,104 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - 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
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
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 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

View File

@@ -0,0 +1,53 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - 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
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
3 0 1 2
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 17 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 10 12 17

View File

@@ -0,0 +1,24 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - 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
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
3 0 1 2
3 2 3 0
3 0 4 1
3 2 5 3

View File

@@ -0,0 +1,101 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 39
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 48
property list uchar uint vertex_indices
end_header
1.000026 1.027167 0.000000 255 255 255 255
0.036786 1.013523 0.000000 255 255 255 255
1.000033 1.013523 0.000000 255 255 255 255
0.048719 1.000000 0.000000 255 255 255 255
1.000039 1.000000 0.000000 255 255 255 255
0.028285 1.000395 0.000000 255 255 255 255
0.017461 1.011536 0.000000 255 255 255 255
0.008094 0.991539 0.000000 255 255 255 255
-0.011358 0.981739 0.000000 255 255 255 255
-0.002956 1.002581 0.000000 255 255 255 255
-0.013481 0.963042 0.000000 255 255 255 255
-0.000215 0.970926 0.000000 255 255 255 255
-0.027129 0.976006 0.000000 255 255 255 255
-0.024977 0.994955 0.000000 255 255 255 255
-0.016462 1.016078 0.000000 255 255 255 255
0.004229 1.025153 0.000000 255 255 255 255
0.023815 1.027167 0.000000 255 255 255 255
-0.027129 0.000011 0.000000 255 255 255 255
-0.013481 -0.963025 0.000000 255 255 255 255
-0.013481 0.000008 0.000000 255 255 255 255
-0.027129 -0.975985 0.000000 255 255 255 255
-0.011195 -0.987628 0.000000 255 255 255 255
-0.000055 -0.976754 0.000000 255 255 255 255
-0.000038 -0.951104 0.000000 255 255 255 255
0.008432 -0.992067 0.000000 255 255 255 255
0.015494 -1.011229 0.000000 255 255 255 255
-0.002614 -1.003111 0.000000 255 255 255 255
0.037730 -1.013506 0.000000 255 255 255 255
0.026340 -1.000095 0.000000 255 255 255 255
0.024771 -1.027145 0.000000 255 255 255 255
0.002235 -1.024837 0.000000 255 255 255 255
-0.016116 -1.016610 0.000000 255 255 255 255
-0.024813 -1.000919 0.000000 255 255 255 255
-0.000927 0.951116 0.000000 255 255 255 255
1.000033 -1.013506 0.000000 255 255 255 255
0.049651 -1.000000 0.000000 255 255 255 255
1.000026 -1.027145 0.000000 255 255 255 255
-0.000038 -0.000000 0.000000 255 255 255 255
1.000026 -1.000000 0.000000 255 255 255 255
3 0 1 2
3 2 3 4
3 1 5 3
3 6 7 5
3 8 7 9
3 10 11 8
3 8 12 10
3 13 9 14
3 9 15 14
3 6 16 15
3 17 10 12
3 17 18 19
3 20 21 18
3 18 22 23
3 21 24 22
3 25 24 26
3 27 28 25
3 25 29 27
3 30 26 31
3 26 32 31
3 23 19 18
3 19 33 10
3 34 35 27
3 27 36 34
3 0 16 1
3 2 1 3
3 1 6 5
3 6 9 7
3 8 11 7
3 10 33 11
3 8 13 12
3 13 8 9
3 9 6 15
3 6 1 16
3 17 19 10
3 17 20 18
3 20 32 21
3 18 21 22
3 21 26 24
3 25 28 24
3 27 35 28
3 25 30 29
3 30 25 26
3 26 21 32
3 23 37 19
3 19 37 33
3 34 38 35
3 27 29 36

40
rsc/mesh/icon_cube.ply Normal file
View File

@@ -0,0 +1,40 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 14
property float x
property float y
property float z
element face 16
property list uchar uint vertex_indices
end_header
-0.100035 0.057779 0.000000
-0.002114 0.090894 0.000000
-0.002069 0.111204 0.000000
0.095897 0.057200 0.000000
-0.072133 0.052704 0.000000
0.068377 0.052027 0.000000
-0.100035 -0.050237 0.000000
0.078085 0.037024 0.000000
0.095897 -0.050237 0.000000
-0.002025 0.014469 0.000000
0.006837 -0.000988 0.000000
0.078085 -0.039552 0.000000
0.006837 -0.077564 0.000000
-0.002069 -0.102495 0.000000
3 0 1 2
3 1 3 2
3 0 4 1
3 5 3 1
3 6 4 0
3 5 7 3
3 7 8 3
3 6 9 4
3 9 7 5
3 9 10 7
3 11 8 7
3 6 10 9
3 6 12 10
3 12 8 11
3 13 12 6
3 12 13 8

680
rsc/mesh/icon_eye.ply Normal file
View File

@@ -0,0 +1,680 @@
ply
format ascii 1.0
comment Created by Blender 2.91.0 - www.blender.org
element vertex 336
property float x
property float y
property float z
element face 334
property list uchar uint vertex_indices
end_header
-0.010156 0.068409 0.000014
0.011150 0.068410 0.000014
0.000497 0.068925 0.000014
0.021529 0.066895 0.000014
-0.020536 0.066893 0.000014
0.031590 0.064425 0.000014
-0.030598 0.064422 0.000014
0.041286 0.061046 0.000014
-0.040295 0.061042 0.000014
0.050572 0.056803 0.000014
-0.049582 0.056798 0.000014
0.059402 0.051743 0.000014
-0.058412 0.051736 0.000014
0.000497 0.052101 0.000014
-0.002837 0.051991 0.000014
0.003831 0.051991 0.000014
-0.006139 0.051663 0.000014
0.007132 0.051663 0.000014
0.067730 0.045910 0.000014
-0.066741 0.045901 0.000014
-0.009398 0.051122 0.000014
0.010392 0.051122 0.000014
-0.012605 0.050371 0.000014
0.013598 0.050371 0.000014
-0.015750 0.049416 0.000014
0.016743 0.049416 0.000014
-0.018822 0.048259 0.000014
0.019816 0.048259 0.000014
-0.021814 0.046904 0.000014
0.022807 0.046904 0.000014
-0.024713 0.045357 0.000014
0.025707 0.045357 0.000014
0.075511 0.039349 0.000014
-0.074522 0.039340 0.000014
-0.027511 0.043621 0.000014
0.028505 0.043621 0.000014
-0.030199 0.041699 0.000014
0.031192 0.041699 0.000014
-0.032765 0.039597 0.000014
0.033758 0.039597 0.000014
-0.035200 0.037318 0.000014
0.036194 0.037318 0.000014
0.082698 0.032107 0.000014
-0.081709 0.032098 0.000014
-0.037480 0.034883 0.000014
0.038474 0.034883 0.000014
-0.000254 0.035258 0.000014
0.002502 0.035221 0.000014
0.000497 0.035276 0.000014
-0.001003 0.035222 0.000014
-0.001751 0.035169 0.000014
0.004492 0.035048 0.000014
-0.002498 0.035100 0.000014
-0.003242 0.035014 0.000014
0.006461 0.034757 0.000014
-0.003985 0.034911 0.000014
-0.004724 0.034792 0.000014
-0.039583 0.032317 0.000014
0.040576 0.032317 0.000014
-0.005461 0.034656 0.000014
0.008405 0.034351 0.000014
-0.006196 0.034504 0.000014
-0.006926 0.034335 0.000014
0.010318 0.033833 0.000014
-0.007653 0.034150 0.000014
-0.008376 0.033948 0.000014
-0.007808 0.033125 0.000014
0.012195 0.033203 0.000014
0.014032 0.032463 0.000014
-0.007292 0.032274 0.000014
0.015824 0.031616 0.000014
-0.041505 0.029630 0.000014
0.042498 0.029630 0.000014
-0.006828 0.031397 0.000014
0.089246 0.024229 0.000014
-0.088256 0.024221 0.000014
0.017565 0.030662 0.000014
-0.006419 0.030496 0.000014
0.019252 0.029605 0.000014
-0.006063 0.029574 0.000014
-0.043242 0.026833 0.000014
0.044235 0.026833 0.000014
0.020878 0.028445 0.000014
-0.005763 0.028634 0.000014
-0.005519 0.027677 0.000014
0.022439 0.027185 0.000014
-0.005331 0.026707 0.000014
0.023922 0.025834 0.000014
-0.044789 0.023934 0.000014
0.045783 0.023934 0.000014
-0.005201 0.025726 0.000014
0.025316 0.024404 0.000014
-0.005128 0.024737 0.000014
-0.005115 0.023742 0.000014
0.026618 0.022898 0.000014
0.095110 0.015760 0.000014
-0.094119 0.015753 0.000014
-0.046144 0.020943 0.000014
0.047137 0.020943 0.000014
-0.005160 0.022743 0.000014
0.027825 0.021323 0.000014
-0.005265 0.021748 0.000014
-0.005429 0.020766 0.000014
0.028935 0.019681 0.000014
-0.047301 0.017871 0.000014
0.048295 0.017871 0.000014
-0.005649 0.019799 0.000014
-0.005926 0.018849 0.000014
0.029946 0.017978 0.000014
-0.006257 0.017918 0.000014
0.030854 0.016219 0.000014
-0.006643 0.017009 0.000014
-0.048257 0.014727 0.000014
0.049251 0.014727 0.000014
-0.007081 0.016125 0.000014
0.031658 0.014407 0.000014
-0.007571 0.015267 0.000014
0.100243 0.006745 0.000014
-0.099250 0.006742 0.000014
-0.008111 0.014438 0.000014
-0.049008 0.011521 0.000014
0.050001 0.011521 0.000014
-0.008702 0.013640 0.000014
0.032354 0.012549 0.000014
-0.009340 0.012876 0.000014
-0.010026 0.012148 0.000014
0.032941 0.010647 0.000014
-0.010754 0.011463 0.000014
-0.049549 0.008262 0.000014
0.050542 0.008262 0.000014
-0.011518 0.010824 0.000014
-0.012316 0.010234 0.000014
0.033416 0.008707 0.000014
-0.032298 0.008549 0.000014
-0.031007 0.009931 0.000014
-0.031830 0.010499 0.000014
-0.013145 0.009694 0.000014
-0.030156 0.009415 0.000014
-0.014003 0.009204 0.000014
-0.029278 0.008951 0.000014
-0.014888 0.008766 0.000014
-0.028377 0.008542 0.000014
-0.015797 0.008381 0.000014
0.033775 0.006734 0.000014
-0.032647 0.006582 0.000014
-0.027455 0.008187 0.000014
-0.016728 0.008049 0.000014
-0.049876 0.004961 0.000014
0.050870 0.004961 0.000014
-0.026515 0.007887 0.000014
-0.017678 0.007773 0.000014
-0.025558 0.007642 0.000014
-0.018645 0.007552 0.000014
-0.024588 0.007455 0.000014
-0.019628 0.007389 0.000014
-0.023607 0.007324 0.000014
-0.020622 0.007284 0.000014
-0.022617 0.007252 0.000014
-0.021621 0.007238 0.000014
0.100436 0.006345 0.000014
-0.099442 0.006342 0.000014
0.034017 0.004742 0.000014
-0.032877 0.004606 0.000014
0.100612 0.005939 0.000014
-0.099619 0.005936 0.000014
0.100772 0.005527 0.000014
-0.099779 0.005523 0.000014
0.100916 0.005109 0.000014
-0.099923 0.005106 0.000014
0.101043 0.004686 0.000014
-0.100050 0.004683 0.000014
-0.049987 0.001628 0.000014
0.050980 0.001628 0.000014
0.034138 0.002749 0.000014
0.101154 0.004259 0.000014
-0.100161 0.004256 0.000014
-0.032990 0.002624 0.000014
0.101248 0.003828 0.000014
-0.100255 0.003825 0.000014
0.101325 0.003393 0.000014
-0.100332 0.003390 0.000014
0.101385 0.002956 0.000014
-0.100392 0.002952 0.000014
0.101429 0.002516 0.000014
-0.100435 0.002512 0.000014
0.034141 0.000759 0.000014
-0.032986 0.000642 0.000014
0.101455 0.002073 0.000014
-0.100461 0.002070 0.000014
0.101463 0.001630 0.000014
-0.100470 0.001626 0.000014
0.101455 0.001186 0.000014
-0.049876 -0.001705 0.000014
0.050872 -0.001706 0.000014
-0.100461 0.001183 0.000014
0.101429 0.000744 0.000014
-0.100435 0.000740 0.000014
0.034026 -0.001223 0.000014
0.101386 0.000304 0.000014
-0.100392 0.000300 0.000014
-0.032865 -0.001334 0.000014
0.101325 -0.000134 0.000014
-0.100332 -0.000137 0.000014
0.101248 -0.000569 0.000014
-0.100255 -0.000572 0.000014
0.101154 -0.001000 0.000014
-0.100161 -0.001003 0.000014
0.101043 -0.001427 0.000014
-0.100050 -0.001430 0.000014
0.033795 -0.003191 0.000014
-0.032627 -0.003300 0.000014
0.100916 -0.001850 0.000014
-0.099923 -0.001853 0.000014
-0.049549 -0.005006 0.000014
0.050545 -0.005007 0.000014
0.100772 -0.002267 0.000014
-0.099779 -0.002271 0.000014
0.100612 -0.002680 0.000014
-0.099619 -0.002683 0.000014
0.100436 -0.003086 0.000014
-0.099442 -0.003089 0.000014
0.100243 -0.003486 0.000014
-0.099250 -0.003489 0.000014
0.033449 -0.005140 0.000014
-0.032274 -0.005250 0.000014
0.095112 -0.012497 0.000014
-0.094117 -0.012504 0.000014
-0.049008 -0.008265 0.000014
0.050005 -0.008266 0.000014
0.032988 -0.007066 0.000014
-0.031806 -0.007179 0.000014
0.032414 -0.008963 0.000014
-0.031222 -0.009081 0.000014
-0.048257 -0.011471 0.000014
0.049256 -0.011473 0.000014
0.031728 -0.010825 0.000014
-0.030525 -0.010952 0.000014
0.030930 -0.012649 0.000014
-0.029713 -0.012787 0.000014
-0.047301 -0.014615 0.000014
0.048300 -0.014618 0.000014
0.089250 -0.020965 0.000014
-0.088253 -0.020973 0.000014
0.030023 -0.014428 0.000014
-0.028793 -0.014570 0.000014
0.029007 -0.016157 0.000014
-0.027773 -0.016287 0.000014
-0.046144 -0.017687 0.000014
0.047144 -0.017691 0.000014
0.027889 -0.017823 0.000014
-0.026657 -0.017935 0.000014
-0.044789 -0.020678 0.000014
0.045790 -0.020682 0.000014
0.026679 -0.019412 0.000014
-0.025449 -0.019509 0.000014
0.025382 -0.020921 0.000014
-0.024151 -0.021007 0.000014
-0.043242 -0.023577 0.000014
0.044243 -0.023582 0.000014
0.024001 -0.022348 0.000014
0.082702 -0.028842 0.000014
-0.081704 -0.028851 0.000014
-0.022769 -0.022425 0.000014
0.022541 -0.023687 0.000014
-0.021306 -0.023759 0.000014
-0.041505 -0.026374 0.000014
0.042506 -0.026380 0.000014
0.021005 -0.024938 0.000014
-0.019765 -0.025006 0.000014
0.019399 -0.026096 0.000014
-0.018150 -0.026161 0.000014
0.017725 -0.027158 0.000014
-0.016466 -0.027221 0.000014
-0.039583 -0.029061 0.000014
0.040584 -0.029067 0.000014
0.015989 -0.028120 0.000014
-0.014715 -0.028183 0.000014
0.014194 -0.028981 0.000014
-0.012903 -0.029043 0.000014
0.075515 -0.036084 0.000014
-0.074517 -0.036093 0.000014
0.012345 -0.029736 0.000014
-0.011042 -0.029793 0.000014
-0.037480 -0.031627 0.000014
0.038481 -0.031633 0.000014
0.010446 -0.030383 0.000014
-0.009148 -0.030428 0.000014
0.008512 -0.030915 0.000014
-0.007226 -0.030947 0.000014
0.006558 -0.031329 0.000014
-0.005283 -0.031351 0.000014
0.004589 -0.031626 0.000014
-0.003322 -0.031639 0.000014
0.002612 -0.031804 0.000014
-0.035200 -0.034062 0.000014
0.036201 -0.034069 0.000014
-0.001349 -0.031811 0.000014
0.000631 -0.031866 0.000014
-0.032765 -0.036341 0.000014
0.033765 -0.036348 0.000014
0.067734 -0.042645 0.000014
-0.066736 -0.042654 0.000014
-0.030199 -0.038443 0.000014
0.031198 -0.038451 0.000014
-0.027511 -0.040365 0.000014
0.028511 -0.040372 0.000014
-0.024713 -0.042101 0.000014
0.025712 -0.042109 0.000014
-0.021814 -0.043648 0.000014
0.022812 -0.043656 0.000014
0.059406 -0.048480 0.000014
-0.058408 -0.048487 0.000014
-0.018822 -0.045003 0.000014
0.019820 -0.045009 0.000014
-0.015750 -0.046160 0.000014
0.016746 -0.046166 0.000014
-0.012605 -0.047115 0.000014
0.013601 -0.047121 0.000014
-0.009398 -0.047866 0.000014
0.010393 -0.047870 0.000014
-0.006139 -0.048407 0.000014
0.007134 -0.048410 0.000014
-0.002837 -0.048735 0.000014
0.003831 -0.048736 0.000014
0.050575 -0.053542 0.000014
-0.049579 -0.053547 0.000014
0.000497 -0.048845 0.000014
0.041289 -0.057786 0.000014
-0.040293 -0.057790 0.000014
0.031592 -0.061166 0.000014
-0.030597 -0.061169 0.000014
0.021530 -0.063637 0.000014
-0.020536 -0.063639 0.000014
0.011150 -0.065153 0.000014
-0.010156 -0.065154 0.000014
0.000497 -0.065669 0.000014
3 0 1 2
3 0 3 1
3 4 3 0
3 4 5 3
3 6 5 4
3 6 7 5
3 8 7 6
3 8 9 7
3 10 9 8
3 10 11 9
3 12 13 10
3 13 11 10
3 12 14 13
3 15 11 13
3 12 16 14
3 17 11 15
3 17 18 11
3 19 16 12
3 19 20 16
3 21 18 17
3 19 22 20
3 23 18 21
3 19 24 22
3 25 18 23
3 19 26 24
3 27 18 25
3 19 28 26
3 29 18 27
3 19 30 28
3 31 18 29
3 31 32 18
3 33 30 19
3 33 34 30
3 35 32 31
3 33 36 34
3 37 32 35
3 33 38 36
3 39 32 37
3 33 40 38
3 41 32 39
3 41 42 32
3 43 40 33
3 43 44 40
3 45 42 41
3 46 47 48
3 49 47 46
3 50 47 49
3 50 51 47
3 52 51 50
3 53 51 52
3 53 54 51
3 55 54 53
3 56 54 55
3 43 57 44
3 58 42 45
3 59 54 56
3 59 60 54
3 61 60 59
3 62 60 61
3 62 63 60
3 64 63 62
3 65 63 64
3 66 63 65
3 66 67 63
3 66 68 67
3 69 68 66
3 69 70 68
3 43 71 57
3 72 42 58
3 73 70 69
3 72 74 42
3 75 71 43
3 73 76 70
3 77 76 73
3 77 78 76
3 79 78 77
3 75 80 71
3 81 74 72
3 79 82 78
3 83 82 79
3 84 82 83
3 84 85 82
3 86 85 84
3 86 87 85
3 75 88 80
3 89 74 81
3 90 87 86
3 90 91 87
3 92 91 90
3 93 91 92
3 93 94 91
3 89 95 74
3 96 88 75
3 96 97 88
3 98 95 89
3 99 94 93
3 99 100 94
3 101 100 99
3 102 100 101
3 102 103 100
3 96 104 97
3 105 95 98
3 106 103 102
3 107 103 106
3 107 108 103
3 109 108 107
3 109 110 108
3 111 110 109
3 96 112 104
3 113 95 105
3 114 110 111
3 114 115 110
3 116 115 114
3 113 117 95
3 118 112 96
3 119 115 116
3 118 120 112
3 121 117 113
3 122 115 119
3 122 123 115
3 124 123 122
3 125 123 124
3 125 126 123
3 127 126 125
3 118 128 120
3 129 117 121
3 130 126 127
3 131 126 130
3 131 132 126
3 133 134 135
3 136 132 131
3 133 137 134
3 138 132 136
3 133 139 137
3 140 132 138
3 133 141 139
3 142 132 140
3 142 143 132
3 144 141 133
3 144 145 141
3 146 143 142
3 118 147 128
3 148 117 129
3 144 149 145
3 150 143 146
3 144 151 149
3 152 143 150
3 144 153 151
3 154 143 152
3 144 155 153
3 156 143 154
3 144 157 155
3 158 143 156
3 144 158 157
3 144 143 158
3 148 159 117
3 160 147 118
3 144 161 143
3 162 161 144
3 148 163 159
3 164 147 160
3 148 165 163
3 166 147 164
3 148 167 165
3 168 147 166
3 148 169 167
3 170 147 168
3 170 171 147
3 172 169 148
3 162 173 161
3 172 174 169
3 175 171 170
3 176 173 162
3 172 177 174
3 178 171 175
3 172 179 177
3 180 171 178
3 172 181 179
3 182 171 180
3 172 183 181
3 184 171 182
3 176 185 173
3 186 185 176
3 172 187 183
3 188 171 184
3 172 189 187
3 190 171 188
3 172 191 189
3 190 192 171
3 193 191 172
3 194 192 190
3 193 195 191
3 196 192 194
3 186 197 185
3 193 198 195
3 199 192 196
3 200 197 186
3 193 201 198
3 202 192 199
3 193 203 201
3 204 192 202
3 193 205 203
3 206 192 204
3 193 207 205
3 208 192 206
3 200 209 197
3 210 209 200
3 193 211 207
3 212 192 208
3 212 213 192
3 214 211 193
3 214 215 211
3 216 213 212
3 214 217 215
3 218 213 216
3 214 219 217
3 220 213 218
3 214 221 219
3 222 213 220
3 210 223 209
3 224 223 210
3 214 225 221
3 226 213 222
3 226 227 213
3 228 225 214
3 224 229 223
3 230 229 224
3 230 231 229
3 232 231 230
3 226 233 227
3 234 225 228
3 232 235 231
3 236 235 232
3 236 237 235
3 238 237 236
3 226 239 233
3 240 225 234
3 240 241 225
3 242 239 226
3 238 243 237
3 244 243 238
3 244 245 243
3 246 245 244
3 242 247 239
3 248 241 240
3 246 249 245
3 250 249 246
3 242 251 247
3 252 241 248
3 250 253 249
3 254 253 250
3 254 255 253
3 256 255 254
3 242 257 251
3 258 241 252
3 256 259 255
3 258 260 241
3 261 257 242
3 262 259 256
3 262 263 259
3 264 263 262
3 261 265 257
3 266 260 258
3 264 267 263
3 268 267 264
3 268 269 267
3 270 269 268
3 270 271 269
3 272 271 270
3 261 273 265
3 274 260 266
3 272 275 271
3 276 275 272
3 276 277 275
3 278 277 276
3 274 279 260
3 280 273 261
3 278 281 277
3 282 281 278
3 280 283 273
3 284 279 274
3 282 285 281
3 286 285 282
3 286 287 285
3 288 287 286
3 288 289 287
3 290 289 288
3 290 291 289
3 292 291 290
3 292 293 291
3 280 294 283
3 295 279 284
3 296 293 292
3 296 297 293
3 280 298 294
3 299 279 295
3 299 300 279
3 301 298 280
3 301 302 298
3 303 300 299
3 301 304 302
3 305 300 303
3 301 306 304
3 307 300 305
3 301 308 306
3 309 300 307
3 309 310 300
3 311 308 301
3 311 312 308
3 313 310 309
3 311 314 312
3 315 310 313
3 311 316 314
3 317 310 315
3 311 318 316
3 319 310 317
3 311 320 318
3 321 310 319
3 311 322 320
3 323 310 321
3 323 324 310
3 325 322 311
3 325 326 322
3 326 324 323
3 325 324 326
3 325 327 324
3 328 327 325
3 328 329 327
3 330 329 328
3 330 331 329
3 332 331 330
3 332 333 331
3 334 333 332
3 334 335 333

948
rsc/mesh/icon_eye_slash.ply Normal file
View File

@@ -0,0 +1,948 @@
ply
format ascii 1.0
comment Created by Blender 2.91.0 - www.blender.org
element vertex 470
property float x
property float y
property float z
element face 468
property list uchar uint vertex_indices
end_header
-0.099706 0.091319 0.000014
-0.098970 0.091314 0.000014
-0.099337 0.091328 0.000014
-0.100075 0.091285 0.000014
-0.098605 0.091275 0.000014
-0.100442 0.091227 0.000014
-0.098245 0.091213 0.000014
-0.100802 0.091145 0.000014
-0.097890 0.091128 0.000014
-0.101154 0.091040 0.000014
-0.097541 0.091019 0.000014
-0.101498 0.090913 0.000014
-0.097200 0.090889 0.000014
-0.101831 0.090764 0.000014
-0.096867 0.090735 0.000014
-0.102155 0.090594 0.000014
-0.096544 0.090560 0.000014
-0.102466 0.090403 0.000014
-0.096231 0.090364 0.000014
-0.102765 0.090192 0.000014
-0.095931 0.090146 0.000014
-0.103049 0.089962 0.000014
-0.095053 0.089467 0.000014
-0.103319 0.089713 0.000014
-0.103574 0.089445 0.000014
-0.092625 0.087591 0.000014
-0.103811 0.089160 0.000014
-0.103946 0.088986 0.000014
-0.104321 0.088503 0.000014
-0.104887 0.087775 0.000014
-0.105596 0.086862 0.000014
-0.088957 0.084756 0.000014
-0.106401 0.085826 0.000014
-0.107254 0.084728 0.000014
-0.084360 0.081204 0.000014
-0.108107 0.083630 0.000014
-0.108912 0.082594 0.000014
-0.109622 0.081681 0.000014
-0.110188 0.080953 0.000014
-0.079142 0.077172 0.000014
-0.110562 0.080471 0.000014
-0.110698 0.080296 0.000014
-0.110916 0.079996 0.000014
-0.111112 0.079684 0.000014
-0.111287 0.079361 0.000014
-0.111440 0.079029 0.000014
-0.111571 0.078687 0.000014
-0.111679 0.078339 0.000014
-0.111764 0.077984 0.000014
-0.111826 0.077624 0.000014
-0.111864 0.077260 0.000014
-0.111879 0.076893 0.000014
-0.073615 0.072901 0.000014
-0.111870 0.076524 0.000014
-0.111836 0.076155 0.000014
-0.111778 0.075789 0.000014
-0.111696 0.075429 0.000014
-0.111591 0.075077 0.000014
-0.111464 0.074734 0.000014
-0.111315 0.074400 0.000014
-0.111145 0.074077 0.000014
-0.110954 0.073766 0.000014
-0.110744 0.073467 0.000014
-0.110513 0.073183 0.000014
-0.110264 0.072913 0.000014
-0.109997 0.072659 0.000014
-0.068087 0.068629 0.000014
-0.109712 0.072422 0.000014
-0.105650 0.069283 0.000014
-0.094422 0.060607 0.000014
-0.004122 0.068780 0.000014
0.011047 0.068364 0.000014
0.000386 0.068879 0.000014
-0.008613 0.068493 0.000014
-0.062870 0.064597 0.000014
-0.013080 0.068021 0.000014
0.021434 0.066847 0.000014
-0.017518 0.067364 0.000014
-0.021922 0.066525 0.000014
0.031502 0.064376 0.000014
-0.026285 0.065505 0.000014
-0.030601 0.064305 0.000014
-0.058272 0.061045 0.000014
0.041205 0.060994 0.000014
-0.034867 0.062926 0.000014
-0.039075 0.061370 0.000014
-0.043220 0.059639 0.000014
-0.054604 0.058210 0.000014
0.050498 0.056749 0.000014
-0.077459 0.047500 0.000014
-0.047296 0.057733 0.000014
-0.052176 0.056334 0.000014
-0.051298 0.055655 0.000014
0.059334 0.051684 0.000014
-0.002527 0.051955 0.000014
0.000386 0.052043 0.000014
0.002600 0.051995 0.000014
0.004804 0.051852 0.000014
-0.005419 0.051700 0.000014
0.006996 0.051612 0.000014
-0.008281 0.051278 0.000014
0.067668 0.045847 0.000014
0.009172 0.051278 0.000014
-0.011107 0.050693 0.000014
0.011329 0.050849 0.000014
0.013465 0.050327 0.000014
-0.013890 0.049948 0.000014
0.015576 0.049713 0.000014
-0.016623 0.049043 0.000014
0.017659 0.049007 0.000014
-0.019299 0.047983 0.000014
0.019711 0.048211 0.000014
0.021729 0.047324 0.000014
-0.021912 0.046769 0.000014
-0.056197 0.031070 0.000014
0.023711 0.046348 0.000014
-0.024455 0.045404 0.000014
0.025652 0.045284 0.000014
0.075455 0.039282 0.000014
-0.026920 0.043891 0.000014
0.027545 0.044136 0.000014
0.029382 0.042909 0.000014
-0.029302 0.042232 0.000014
0.031160 0.041605 0.000014
-0.031592 0.040429 0.000014
0.032876 0.040227 0.000014
-0.031084 0.040036 0.000014
0.034530 0.038777 0.000014
-0.029679 0.038951 0.000014
0.082647 0.032034 0.000014
-0.027557 0.037311 0.000014
0.036118 0.037257 0.000014
-0.024897 0.035256 0.000014
0.037638 0.035669 0.000014
0.039088 0.034016 0.000014
-0.021878 0.032923 0.000014
-0.001705 0.035113 0.000014
0.001731 0.035197 0.000014
0.000013 0.035199 0.000014
0.003447 0.035105 0.000014
-0.003417 0.034937 0.000014
0.005156 0.034926 0.000014
-0.005122 0.034673 0.000014
0.006857 0.034657 0.000014
-0.006815 0.034320 0.000014
0.008545 0.034300 0.000014
-0.008493 0.033877 0.000014
0.010216 0.033855 0.000014
0.040467 0.032300 0.000014
-0.007985 0.033148 0.000014
0.011867 0.033322 0.000014
0.013489 0.032703 0.000014
-0.007517 0.032396 0.000014
-0.018680 0.030452 0.000014
0.015070 0.032003 0.000014
-0.007091 0.031623 0.000014
0.041771 0.030523 0.000014
0.089200 0.024150 0.000014
0.016609 0.031223 0.000014
-0.006707 0.030829 0.000014
0.018103 0.030367 0.000014
-0.032067 0.012424 0.000014
-0.006367 0.030018 0.000014
0.042998 0.028687 0.000014
-0.015481 0.027980 0.000014
0.019548 0.029436 0.000014
-0.006069 0.029190 0.000014
0.020942 0.028432 0.000014
-0.005815 0.028348 0.000014
0.044146 0.026794 0.000014
0.022283 0.027358 0.000014
-0.005606 0.027493 0.000014
-0.012462 0.025648 0.000014
-0.005442 0.026628 0.000014
0.023567 0.026215 0.000014
0.045211 0.024853 0.000014
-0.005324 0.025753 0.000014
0.024792 0.025005 0.000014
-0.087751 0.024625 0.000014
-0.085826 0.025590 0.000014
-0.086550 0.026150 0.000014
-0.005252 0.024870 0.000014
-0.009802 0.023592 0.000014
-0.083824 0.024043 0.000014
0.025955 0.023731 0.000014
-0.005227 0.023982 0.000014
0.046187 0.022872 0.000014
-0.088935 0.023085 0.000014
0.095068 0.015675 0.000014
-0.080800 0.021706 0.000014
-0.005243 0.023686 0.000014
0.027053 0.022395 0.000014
-0.005264 0.023390 0.000014
-0.007680 0.021952 0.000014
-0.005290 0.023095 0.000014
-0.005322 0.022800 0.000014
-0.090099 0.021529 0.000014
0.047074 0.020854 0.000014
-0.005359 0.022507 0.000014
-0.005402 0.022213 0.000014
0.028083 0.020999 0.000014
-0.005449 0.021921 0.000014
-0.006275 0.020867 0.000014
-0.005502 0.021630 0.000014
-0.077009 0.018777 0.000014
-0.005561 0.021339 0.000014
-0.091242 0.019956 0.000014
-0.005624 0.021050 0.000014
-0.005693 0.020761 0.000014
0.029039 0.019550 0.000014
-0.005767 0.020474 0.000014
0.047871 0.018802 0.000014
-0.092362 0.018365 0.000014
0.029915 0.018060 0.000014
0.048576 0.016719 0.000014
-0.072706 0.015453 0.000014
-0.093458 0.016755 0.000014
0.030711 0.016529 0.000014
-0.094528 0.015126 0.000014
0.049191 0.014609 0.000014
0.031424 0.014963 0.000014
0.100205 0.006654 0.000014
-0.068149 0.011932 0.000014
-0.095571 0.013476 0.000014
0.032055 0.013364 0.000014
0.049713 0.012474 0.000014
-0.096584 0.011804 0.000014
0.032602 0.011735 0.000014
0.050141 0.010317 0.000014
-0.006504 -0.007329 0.000014
-0.063591 0.008410 0.000014
-0.097567 0.010110 0.000014
0.033065 0.010081 0.000014
0.050476 0.008141 0.000014
-0.098517 0.008392 0.000014
0.033441 0.008404 0.000014
-0.059289 0.005086 0.000014
0.033730 0.006707 0.000014
-0.099432 0.006651 0.000014
0.050715 0.005950 0.000014
0.033932 0.004994 0.000014
0.100398 0.006254 0.000014
-0.099625 0.006251 0.000014
0.100575 0.005848 0.000014
-0.099802 0.005844 0.000014
0.050859 0.003747 0.000014
0.100735 0.005435 0.000014
-0.099962 0.005432 0.000014
0.100879 0.005017 0.000014
-0.100106 0.005014 0.000014
-0.055498 0.002157 0.000014
0.101006 0.004594 0.000014
-0.100233 0.004590 0.000014
0.034044 0.003268 0.000014
0.101117 0.004167 0.000014
-0.100344 0.004163 0.000014
0.101211 0.003735 0.000014
-0.100438 0.003732 0.000014
0.050906 0.001533 0.000014
0.101288 0.003300 0.000014
-0.100515 0.003297 0.000014
0.101348 0.002862 0.000014
-0.100575 0.002859 0.000014
0.034066 0.001533 0.000014
0.101391 0.002422 0.000014
-0.100619 0.002418 0.000014
0.101417 0.001979 0.000014
-0.100645 0.001976 0.000014
-0.052474 -0.000180 0.000014
0.101426 0.001535 0.000014
-0.100653 0.001532 0.000014
0.101417 0.001091 0.000014
0.034043 0.000647 0.000014
0.050868 -0.000353 0.000014
-0.100645 0.001088 0.000014
0.101392 0.000649 0.000014
-0.100619 0.000645 0.000014
0.101348 0.000208 0.000014
0.033996 -0.000238 0.000014
-0.100575 0.000205 0.000014
0.101288 -0.000230 0.000014
-0.100515 -0.000233 0.000014
-0.050472 -0.001727 0.000014
0.101211 -0.000665 0.000014
-0.100438 -0.000668 0.000014
0.033925 -0.001121 0.000014
0.050755 -0.002217 0.000014
0.101117 -0.001096 0.000014
-0.100344 -0.001100 0.000014
0.101006 -0.001524 0.000014
-0.100233 -0.001527 0.000014
0.033830 -0.002001 0.000014
0.100879 -0.001947 0.000014
-0.100106 -0.001950 0.000014
-0.049748 -0.002286 0.000014
0.100735 -0.002365 0.000014
-0.099962 -0.002368 0.000014
0.033713 -0.002879 0.000014
0.050569 -0.004058 0.000014
-0.048853 -0.008687 0.000014
0.100575 -0.002777 0.000014
-0.099802 -0.002781 0.000014
0.100398 -0.003184 0.000014
-0.099625 -0.003188 0.000014
0.033572 -0.003752 0.000014
0.100205 -0.003584 0.000014
-0.099432 -0.003588 0.000014
0.098392 -0.006978 0.000014
-0.094295 -0.012609 0.000014
0.033408 -0.004621 0.000014
0.050313 -0.005877 0.000014
0.033221 -0.005486 0.000014
0.033010 -0.006346 0.000014
0.049990 -0.007672 0.000014
0.032777 -0.007201 0.000014
0.096470 -0.010306 0.000014
0.032521 -0.008049 0.000014
0.019059 -0.027082 0.000014
0.049601 -0.009444 0.000014
0.032242 -0.008891 0.000014
-0.047194 -0.014806 0.000014
0.046030 -0.019547 0.000014
0.049149 -0.011192 0.000014
0.094441 -0.013564 0.000014
0.048637 -0.012915 0.000014
-0.088427 -0.021084 0.000014
0.048066 -0.014612 0.000014
0.092307 -0.016751 0.000014
0.047440 -0.016285 0.000014
-0.044820 -0.020591 0.000014
0.046760 -0.017931 0.000014
0.090071 -0.019865 0.000014
0.046030 -0.019551 0.000014
0.046030 -0.019547 0.000014
0.046030 -0.019547 0.000014
0.046030 -0.019548 0.000014
0.046030 -0.019548 0.000014
0.046030 -0.019549 0.000014
0.046030 -0.019549 0.000014
0.046030 -0.019549 0.000014
0.046030 -0.019550 0.000014
0.046030 -0.019550 0.000014
0.046030 -0.019550 0.000014
0.046030 -0.019551 0.000014
0.087733 -0.022902 0.000014
-0.041782 -0.025990 0.000014
-0.081874 -0.028968 0.000014
0.085297 -0.025861 0.000014
0.082764 -0.028738 0.000014
-0.038131 -0.030949 0.000014
0.043189 -0.045727 0.000014
0.080135 -0.031532 0.000014
-0.074682 -0.036215 0.000014
-0.033916 -0.035417 0.000014
0.077414 -0.034239 0.000014
0.074602 -0.036858 0.000014
-0.029188 -0.039342 0.000014
-0.066895 -0.042780 0.000014
0.071700 -0.039386 0.000014
-0.023998 -0.042670 0.000014
0.110485 -0.069355 0.000014
-0.018395 -0.045350 0.000014
-0.058561 -0.048618 0.000014
-0.012429 -0.047330 0.000014
0.064452 -0.062157 0.000014
-0.006152 -0.048556 0.000014
0.008756 -0.048200 0.000014
0.009866 -0.048338 0.000014
0.009508 -0.048060 0.000014
0.008001 -0.048328 0.000014
0.007245 -0.048444 0.000014
0.010857 -0.049104 0.000014
0.006487 -0.048550 0.000014
0.005728 -0.048643 0.000014
0.000386 -0.048976 0.000014
-0.049725 -0.053682 0.000014
0.004968 -0.048725 0.000014
0.004207 -0.048796 0.000014
0.003444 -0.048855 0.000014
0.002681 -0.048903 0.000014
0.001917 -0.048939 0.000014
0.001152 -0.048963 0.000014
0.012353 -0.050261 0.000014
0.014228 -0.051712 0.000014
0.016356 -0.053358 0.000014
0.018611 -0.055102 0.000014
-0.040433 -0.057928 0.000014
0.020865 -0.056846 0.000014
0.022993 -0.058492 0.000014
-0.030729 -0.061309 0.000014
0.024868 -0.059943 0.000014
0.026364 -0.061100 0.000014
0.027355 -0.061866 0.000014
-0.020661 -0.063780 0.000014
0.027713 -0.062143 0.000014
0.025512 -0.062692 0.000014
0.081414 -0.075264 0.000014
0.023296 -0.063202 0.000014
0.021068 -0.063673 0.000014
0.018825 -0.064102 0.000014
-0.010274 -0.065297 0.000014
0.016569 -0.064487 0.000014
0.014298 -0.064828 0.000014
0.012014 -0.065121 0.000014
0.009716 -0.065365 0.000014
0.000386 -0.065812 0.000014
0.007405 -0.065558 0.000014
0.005079 -0.065698 0.000014
0.002740 -0.065783 0.000014
0.110770 -0.069592 0.000014
0.111038 -0.069846 0.000014
0.111287 -0.070116 0.000014
0.111517 -0.070400 0.000014
0.111728 -0.070699 0.000014
0.111919 -0.071010 0.000014
0.112089 -0.071333 0.000014
0.112238 -0.071666 0.000014
0.112366 -0.072010 0.000014
0.112470 -0.072362 0.000014
0.112552 -0.072721 0.000014
0.112611 -0.073087 0.000014
0.112645 -0.073457 0.000014
0.112654 -0.073825 0.000014
0.112640 -0.074192 0.000014
0.112601 -0.074556 0.000014
0.112540 -0.074917 0.000014
0.112454 -0.075271 0.000014
0.092643 -0.083941 0.000014
0.112346 -0.075620 0.000014
0.112216 -0.075961 0.000014
0.112063 -0.076294 0.000014
0.111888 -0.076617 0.000014
0.111692 -0.076929 0.000014
0.111474 -0.077230 0.000014
0.111339 -0.077404 0.000014
0.110964 -0.077886 0.000014
0.110398 -0.078614 0.000014
0.109688 -0.079528 0.000014
0.108882 -0.080564 0.000014
0.108029 -0.081661 0.000014
0.107176 -0.082759 0.000014
0.106370 -0.083795 0.000014
0.105660 -0.084708 0.000014
0.096704 -0.087079 0.000014
0.105094 -0.085437 0.000014
0.104719 -0.085919 0.000014
0.104584 -0.086093 0.000014
0.104347 -0.086379 0.000014
0.104092 -0.086646 0.000014
0.103822 -0.086895 0.000014
0.103538 -0.087126 0.000014
0.097004 -0.087297 0.000014
0.103239 -0.087337 0.000014
0.097317 -0.087494 0.000014
0.102928 -0.087527 0.000014
0.097640 -0.087669 0.000014
0.102604 -0.087698 0.000014
0.097973 -0.087822 0.000014
0.102271 -0.087847 0.000014
0.098314 -0.087953 0.000014
0.101927 -0.087974 0.000014
0.098663 -0.088061 0.000014
0.101575 -0.088078 0.000014
0.099018 -0.088146 0.000014
0.101215 -0.088160 0.000014
0.099378 -0.088208 0.000014
0.100848 -0.088218 0.000014
0.099743 -0.088247 0.000014
0.100479 -0.088252 0.000014
0.100110 -0.088262 0.000014
3 0 1 2
3 3 1 0
3 3 4 1
3 5 4 3
3 5 6 4
3 7 6 5
3 7 8 6
3 9 8 7
3 9 10 8
3 11 10 9
3 11 12 10
3 13 12 11
3 13 14 12
3 15 14 13
3 15 16 14
3 17 16 15
3 17 18 16
3 19 18 17
3 19 20 18
3 21 20 19
3 21 22 20
3 23 22 21
3 24 22 23
3 24 25 22
3 26 25 24
3 27 25 26
3 28 25 27
3 29 25 28
3 30 25 29
3 30 31 25
3 32 31 30
3 33 31 32
3 33 34 31
3 35 34 33
3 36 34 35
3 37 34 36
3 38 34 37
3 38 39 34
3 40 39 38
3 41 39 40
3 42 39 41
3 43 39 42
3 44 39 43
3 45 39 44
3 46 39 45
3 47 39 46
3 48 39 47
3 49 39 48
3 50 39 49
3 51 39 50
3 51 52 39
3 53 52 51
3 54 52 53
3 55 52 54
3 56 52 55
3 57 52 56
3 58 52 57
3 59 52 58
3 60 52 59
3 61 52 60
3 62 52 61
3 63 52 62
3 64 52 63
3 65 52 64
3 65 66 52
3 67 66 65
3 68 66 67
3 69 66 68
3 70 71 72
3 73 71 70
3 69 74 66
3 75 71 73
3 75 76 71
3 77 76 75
3 78 76 77
3 78 79 76
3 80 79 78
3 81 79 80
3 69 82 74
3 81 83 79
3 84 83 81
3 85 83 84
3 86 83 85
3 69 87 82
3 86 88 83
3 89 87 69
3 90 88 86
3 89 91 87
3 92 88 90
3 92 93 88
3 89 92 91
3 89 94 92
3 94 95 92
3 95 93 92
3 96 93 95
3 97 93 96
3 89 98 94
3 99 93 97
3 89 100 98
3 99 101 93
3 102 101 99
3 89 103 100
3 104 101 102
3 105 101 104
3 89 106 103
3 107 101 105
3 89 108 106
3 109 101 107
3 89 110 108
3 111 101 109
3 112 101 111
3 89 113 110
3 114 113 89
3 115 101 112
3 114 116 113
3 117 101 115
3 117 118 101
3 114 119 116
3 120 118 117
3 121 118 120
3 114 122 119
3 123 118 121
3 114 124 122
3 125 118 123
3 114 126 124
3 127 118 125
3 114 128 126
3 127 129 118
3 114 130 128
3 131 129 127
3 114 132 130
3 133 129 131
3 134 129 133
3 114 135 132
3 136 137 138
3 136 139 137
3 140 139 136
3 140 141 139
3 142 141 140
3 142 143 141
3 144 143 142
3 144 145 143
3 146 145 144
3 146 147 145
3 148 129 134
3 149 147 146
3 149 150 147
3 149 151 150
3 152 151 149
3 114 153 135
3 152 154 151
3 155 154 152
3 156 129 148
3 156 157 129
3 155 158 154
3 159 158 155
3 159 160 158
3 161 153 114
3 162 160 159
3 163 157 156
3 161 164 153
3 162 165 160
3 166 165 162
3 166 167 165
3 168 167 166
3 169 157 163
3 168 170 167
3 171 170 168
3 161 172 164
3 173 170 171
3 173 174 170
3 175 157 169
3 176 174 173
3 176 177 174
3 178 179 180
3 181 177 176
3 161 182 172
3 178 183 179
3 181 184 177
3 185 184 181
3 186 157 175
3 187 183 178
3 186 188 157
3 187 189 183
3 190 184 185
3 190 191 184
3 192 191 190
3 161 193 182
3 194 191 192
3 195 191 194
3 196 189 187
3 197 188 186
3 198 191 195
3 199 191 198
3 199 200 191
3 201 200 199
3 161 202 193
3 203 200 201
3 196 204 189
3 205 200 203
3 206 204 196
3 207 200 205
3 208 200 207
3 208 209 200
3 161 210 202
3 211 188 197
3 210 209 208
3 161 209 210
3 212 204 206
3 161 213 209
3 214 188 211
3 212 215 204
3 216 215 212
3 161 217 213
3 218 215 216
3 219 188 214
3 161 220 217
3 219 221 188
3 218 222 215
3 223 222 218
3 161 224 220
3 225 221 219
3 226 222 223
3 161 227 224
3 228 221 225
3 229 227 161
3 226 230 222
3 231 230 226
3 229 232 227
3 233 221 228
3 234 230 231
3 229 235 232
3 234 236 230
3 229 237 235
3 238 236 234
3 239 221 233
3 229 240 237
3 239 241 221
3 242 236 238
3 239 243 241
3 244 236 242
3 245 243 239
3 245 246 243
3 247 236 244
3 245 248 246
3 249 236 247
3 249 250 236
3 245 251 248
3 252 250 249
3 229 253 240
3 245 254 251
3 255 250 252
3 245 256 254
3 257 250 255
3 258 256 245
3 258 259 256
3 260 250 257
3 258 261 259
3 262 250 260
3 229 263 253
3 258 264 261
3 265 250 262
3 258 266 264
3 267 250 265
3 267 268 250
3 258 269 266
3 270 268 267
3 258 271 269
3 229 272 263
3 273 271 258
3 274 268 270
3 273 275 271
3 276 268 274
3 273 277 275
3 229 278 272
3 279 268 276
3 273 280 277
3 281 268 279
3 281 282 268
3 273 283 280
3 284 282 281
3 229 285 278
3 286 283 273
3 286 287 283
3 288 282 284
3 286 289 287
3 290 282 288
3 229 291 285
3 286 292 289
3 293 282 290
3 293 294 282
3 286 295 292
3 296 294 293
3 229 297 291
3 298 295 286
3 296 299 294
3 298 300 295
3 301 299 296
3 298 302 300
3 303 299 301
3 229 304 297
3 298 305 302
3 306 299 303
3 298 307 305
3 308 299 306
3 229 309 304
3 310 307 298
3 229 311 309
3 229 312 311
3 313 307 310
3 229 314 312
3 313 315 307
3 229 316 314
3 317 316 229
3 318 315 313
3 317 319 316
3 308 320 299
3 317 321 319
3 322 315 318
3 322 323 315
3 324 323 322
3 325 320 308
3 326 323 324
3 326 327 323
3 328 327 326
3 325 329 320
3 330 327 328
3 330 331 327
3 332 331 330
3 317 333 321
3 317 334 333
3 317 335 334
3 317 336 335
3 317 337 336
3 317 338 337
3 317 339 338
3 317 340 339
3 317 341 340
3 317 342 341
3 317 343 342
3 317 332 343
3 317 331 332
3 317 344 331
3 325 345 329
3 346 345 325
3 317 347 344
3 317 348 347
3 346 349 345
3 350 348 317
3 350 351 348
3 352 349 346
3 352 353 349
3 350 354 351
3 350 355 354
3 352 356 353
3 357 356 352
3 350 358 355
3 357 359 356
3 350 360 358
3 357 361 359
3 362 361 357
3 362 363 361
3 364 360 350
3 362 365 363
3 366 367 368
3 369 367 366
3 370 367 369
3 370 371 367
3 372 371 370
3 373 371 372
3 362 374 365
3 375 374 362
3 376 371 373
3 377 371 376
3 378 371 377
3 379 371 378
3 380 371 379
3 381 371 380
3 374 371 381
3 375 371 374
3 375 382 371
3 375 383 382
3 375 384 383
3 375 385 384
3 386 385 375
3 386 387 385
3 386 388 387
3 389 388 386
3 389 390 388
3 389 391 390
3 389 392 391
3 393 392 389
3 393 394 392
3 393 395 394
3 396 360 364
3 393 397 395
3 393 398 397
3 393 399 398
3 400 399 393
3 400 401 399
3 400 402 401
3 400 403 402
3 400 404 403
3 405 404 400
3 405 406 404
3 405 407 406
3 405 408 407
3 396 409 360
3 396 410 409
3 396 411 410
3 396 412 411
3 396 413 412
3 396 414 413
3 396 415 414
3 396 416 415
3 396 417 416
3 396 418 417
3 396 419 418
3 396 420 419
3 396 421 420
3 396 422 421
3 396 423 422
3 396 424 423
3 396 425 424
3 396 426 425
3 427 426 396
3 427 428 426
3 427 429 428
3 427 430 429
3 427 431 430
3 427 432 431
3 427 433 432
3 427 434 433
3 427 435 434
3 427 436 435
3 427 437 436
3 427 438 437
3 427 439 438
3 427 440 439
3 427 441 440
3 427 442 441
3 443 442 427
3 443 444 442
3 443 445 444
3 443 446 445
3 443 447 446
3 443 448 447
3 443 449 448
3 443 450 449
3 451 450 443
3 451 452 450
3 453 452 451
3 453 454 452
3 455 454 453
3 455 456 454
3 457 456 455
3 457 458 456
3 459 458 457
3 459 460 458
3 461 460 459
3 461 462 460
3 463 462 461
3 463 464 462
3 465 464 463
3 465 466 464
3 467 466 465
3 467 468 466
3 469 468 467

View File

@@ -0,0 +1,648 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 320
property float x
property float y
property float z
element face 318
property list uchar uint vertex_indices
end_header
-0.075364 0.080724 0.001667
0.096283 0.097068 0.001667
-0.075364 0.097068 0.001667
0.079936 0.080724 0.001667
0.096283 -0.074543 0.001667
0.079936 -0.074543 0.001667
-0.099885 -0.099059 0.001667
-0.083538 0.048037 0.001667
-0.099885 0.064381 0.001667
0.063589 0.064381 0.001667
0.047241 0.048037 0.001667
0.063589 -0.099059 0.001667
-0.083538 -0.082715 0.001667
0.047241 -0.082715 0.001667
0.002248 0.021272 0.001667
0.005256 0.021354 0.001667
0.004134 0.021399 0.001667
0.006351 0.021220 0.001667
0.000438 0.020903 0.001667
0.007418 0.021002 0.001667
0.008452 0.020704 0.001667
-0.001277 0.020307 0.001667
0.009452 0.020328 0.001667
0.010412 0.019878 0.001667
-0.002882 0.019501 0.001667
0.011331 0.019358 0.001667
-0.004361 0.018503 0.001667
0.012206 0.018773 0.001667
0.013032 0.018124 0.001667
-0.005696 0.017328 0.001667
0.013808 0.017417 0.001667
0.014529 0.016654 0.001667
-0.006871 0.015993 0.001667
0.015193 0.015839 0.001667
-0.007870 0.014515 0.001667
0.018036 0.015840 0.001667
0.020300 0.015738 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015840 0.001667
0.018036 0.015839 0.001667
0.018036 0.015839 0.001667
0.018036 0.015839 0.001667
0.018036 0.015839 0.001667
0.018036 0.015839 0.001667
0.022471 0.015443 0.001667
0.024530 0.014966 0.001667
0.026456 0.014322 0.001667
-0.008676 0.012910 0.001667
0.028230 0.013523 0.001667
0.029832 0.012583 0.001667
-0.009271 0.011195 0.001667
0.004134 0.011670 0.001667
0.031243 0.011515 0.001667
0.003568 0.011632 0.001667
0.004700 0.011632 0.001667
0.003026 0.011521 0.001667
0.005242 0.011521 0.001667
0.002511 0.011342 0.001667
0.005757 0.011342 0.001667
0.032441 0.010333 0.001667
0.002029 0.011101 0.001667
0.006239 0.011101 0.001667
-0.009641 0.009386 0.001667
0.001586 0.010801 0.001667
0.006682 0.010801 0.001667
0.001185 0.010449 0.001667
0.007083 0.010449 0.001667
0.000833 0.010048 0.001667
0.007435 0.010048 0.001667
0.033408 0.009049 0.001667
0.000533 0.009605 0.001667
0.007735 0.009605 0.001667
0.000291 0.009123 0.001667
0.007977 0.009123 0.001667
-0.009768 0.007500 0.001667
0.000112 0.008609 0.001667
0.008156 0.008609 0.001667
0.034123 0.007677 0.001667
0.000001 0.008066 0.001667
0.008267 0.008066 0.001667
-0.000037 0.007500 0.001667
0.008305 0.007500 0.001667
0.034566 0.006229 0.001667
-0.009768 0.007428 0.001667
0.000001 0.006934 0.001667
0.008267 0.006934 0.001667
-0.009768 0.007230 0.001667
-0.009768 0.006930 0.001667
0.008156 0.006392 0.001667
0.000112 0.006392 0.001667
-0.009768 0.006555 0.001667
-0.009768 0.006129 0.001667
0.007977 0.005877 0.001667
0.000291 0.005877 0.001667
0.034719 0.004720 0.001667
-0.009768 0.005677 0.001667
0.007735 0.005396 0.001667
0.000533 0.005396 0.001667
-0.009768 0.005226 0.001667
0.007435 0.004952 0.001667
0.000833 0.004952 0.001667
-0.009768 0.004800 0.001667
0.007083 0.004552 0.001667
0.001185 0.004552 0.001667
-0.009768 0.004424 0.001667
0.018036 0.001941 0.001667
0.006682 0.004199 0.001667
0.001586 0.004199 0.001667
-0.009768 0.004125 0.001667
0.006239 0.003900 0.001667
0.002029 0.003900 0.001667
-0.009768 0.003927 0.001667
-0.009768 0.003855 0.001667
0.005757 0.003658 0.001667
0.002511 0.003658 0.001667
-0.074397 -0.046979 0.001667
0.005242 0.003479 0.001667
0.003026 0.003479 0.001667
0.004700 0.003368 0.001667
0.003568 0.003368 0.001667
0.004134 0.003330 0.001667
0.018036 0.001667 0.001667
0.018036 0.000911 0.001667
0.018036 -0.000231 0.001667
0.018036 -0.001663 0.001667
0.018036 -0.003288 0.001667
0.018036 -0.005009 0.001667
0.018036 -0.006730 0.001667
0.018036 -0.008355 0.001667
0.018036 -0.009787 0.001667
0.018036 -0.010929 0.001667
0.018036 -0.011685 0.001667
0.018036 -0.011959 0.001667
0.017829 -0.015695 0.001667
0.017222 -0.019311 0.001667
0.016238 -0.022783 0.001667
0.014898 -0.026090 0.001667
0.013226 -0.029209 0.001667
0.011243 -0.032119 0.001667
0.008971 -0.034798 0.001667
0.006432 -0.037223 0.001667
0.003650 -0.039373 0.001667
0.000646 -0.041226 0.001667
-0.047778 -0.045317 0.001667
-0.002558 -0.042759 0.001667
-0.005940 -0.043951 0.001667
-0.005799 -0.044332 0.001667
-0.014345 -0.045266 0.001667
-0.005409 -0.045386 0.001667
-0.014428 -0.045269 0.001667
-0.014193 -0.045678 0.001667
-0.014510 -0.045274 0.001667
-0.014592 -0.045279 0.001667
-0.014673 -0.045284 0.001667
-0.014755 -0.045290 0.001667
-0.014836 -0.045295 0.001667
-0.014918 -0.045301 0.001667
-0.015000 -0.045306 0.001667
-0.015082 -0.045310 0.001667
-0.015164 -0.045314 0.001667
-0.015246 -0.045316 0.001667
-0.015329 -0.045317 0.001667
-0.048194 -0.045525 0.001667
-0.031010 -0.045317 0.001667
-0.023293 -0.066183 0.001667
-0.022117 -0.045317 0.001667
-0.021986 -0.045671 0.001667
-0.004820 -0.046979 0.001667
-0.049343 -0.046099 0.001667
-0.021623 -0.046651 0.001667
-0.013772 -0.046815 0.001667
-0.051078 -0.046967 0.001667
-0.021076 -0.048131 0.001667
-0.013137 -0.048534 0.001667
-0.053254 -0.048054 0.001667
-0.004082 -0.048975 0.001667
-0.074558 -0.047105 0.001667
-0.074713 -0.047236 0.001667
-0.074863 -0.047373 0.001667
-0.075007 -0.047515 0.001667
-0.075145 -0.047663 0.001667
-0.075278 -0.047815 0.001667
-0.075405 -0.047973 0.001667
-0.075525 -0.048136 0.001667
-0.055723 -0.049288 0.001667
-0.020390 -0.049987 0.001667
-0.075640 -0.048303 0.001667
-0.075747 -0.048475 0.001667
-0.075849 -0.048651 0.001667
-0.012340 -0.050688 0.001667
-0.075943 -0.048831 0.001667
-0.076031 -0.049015 0.001667
-0.003244 -0.051240 0.001667
-0.076111 -0.049202 0.001667
-0.076184 -0.049391 0.001667
-0.058338 -0.050596 0.001667
-0.076249 -0.049583 0.001667
-0.076307 -0.049777 0.001667
-0.076357 -0.049973 0.001667
-0.076400 -0.050171 0.001667
-0.019611 -0.052093 0.001667
-0.076435 -0.050370 0.001667
-0.076463 -0.050571 0.001667
-0.076482 -0.050773 0.001667
-0.060954 -0.051903 0.001667
-0.011436 -0.053133 0.001667
-0.076494 -0.050975 0.001667
-0.076498 -0.051179 0.001667
-0.076415 -0.052124 0.001667
-0.002357 -0.053640 0.001667
-0.063423 -0.053138 0.001667
-0.018786 -0.054323 0.001667
-0.076178 -0.053003 0.001667
-0.075802 -0.053804 0.001667
-0.010478 -0.055724 0.001667
-0.065599 -0.054225 0.001667
-0.001469 -0.056039 0.001667
-0.075304 -0.054518 0.001667
-0.067334 -0.055093 0.001667
-0.017961 -0.056554 0.001667
-0.074700 -0.055135 0.001667
-0.068483 -0.055667 0.001667
-0.074008 -0.055644 0.001667
-0.073242 -0.056036 0.001667
-0.068899 -0.055875 0.001667
-0.009520 -0.058314 0.001667
-0.069782 -0.056223 0.001667
-0.072421 -0.056300 0.001667
-0.000631 -0.058304 0.001667
-0.070674 -0.056404 0.001667
-0.071559 -0.056426 0.001667
-0.017183 -0.058660 0.001667
0.000107 -0.060300 0.001667
-0.008616 -0.060759 0.001667
-0.016497 -0.060516 0.001667
0.000696 -0.061893 0.001667
-0.015949 -0.061996 0.001667
-0.007819 -0.062913 0.001667
0.001086 -0.062947 0.001667
-0.015587 -0.062976 0.001667
-0.007184 -0.064632 0.001667
0.001227 -0.063328 0.001667
-0.015456 -0.063330 0.001667
0.001306 -0.063600 0.001667
-0.015377 -0.063602 0.001667
0.001347 -0.063874 0.001667
-0.015336 -0.063876 0.001667
0.001351 -0.064147 0.001667
-0.015332 -0.064149 0.001667
0.001320 -0.064414 0.001667
-0.015363 -0.064416 0.001667
0.001255 -0.064674 0.001667
-0.015428 -0.064676 0.001667
-0.006763 -0.065769 0.001667
0.001158 -0.064922 0.001667
-0.015525 -0.064924 0.001667
0.001030 -0.065156 0.001667
-0.015653 -0.065158 0.001667
0.000873 -0.065373 0.001667
-0.015810 -0.065375 0.001667
0.000688 -0.065568 0.001667
-0.015995 -0.065571 0.001667
0.000476 -0.065740 0.001667
-0.016206 -0.065742 0.001667
0.000240 -0.065885 0.001667
-0.016442 -0.065887 0.001667
-0.006611 -0.066181 0.001667
-0.000019 -0.066000 0.001667
-0.016702 -0.066002 0.001667
-0.000096 -0.066028 0.001667
-0.016779 -0.066030 0.001667
-0.000310 -0.066106 0.001667
-0.016992 -0.066108 0.001667
-0.000632 -0.066223 0.001667
-0.017314 -0.066225 0.001667
-0.006496 -0.066440 0.001667
-0.023178 -0.066442 0.001667
-0.001035 -0.066370 0.001667
-0.017718 -0.066372 0.001667
-0.001493 -0.066537 0.001667
-0.018176 -0.066539 0.001667
-0.006351 -0.066676 0.001667
-0.023033 -0.066678 0.001667
-0.001979 -0.066713 0.001667
-0.018661 -0.066715 0.001667
-0.006179 -0.066888 0.001667
-0.022861 -0.066890 0.001667
-0.002464 -0.066890 0.001667
-0.019146 -0.066892 0.001667
-0.005983 -0.067073 0.001667
-0.022665 -0.067075 0.001667
-0.002922 -0.067057 0.001667
-0.019604 -0.067059 0.001667
-0.003326 -0.067204 0.001667
-0.020008 -0.067206 0.001667
-0.005766 -0.067230 0.001667
-0.022449 -0.067232 0.001667
-0.003648 -0.067321 0.001667
-0.020330 -0.067323 0.001667
-0.005532 -0.067358 0.001667
-0.022215 -0.067360 0.001667
-0.003861 -0.067399 0.001667
-0.020543 -0.067401 0.001667
-0.005284 -0.067455 0.001667
-0.021966 -0.067457 0.001667
-0.003938 -0.067427 0.001667
-0.020620 -0.067429 0.001667
-0.004210 -0.067506 0.001667
-0.020893 -0.067508 0.001667
-0.005024 -0.067519 0.001667
-0.021707 -0.067521 0.001667
-0.004484 -0.067546 0.001667
-0.021167 -0.067548 0.001667
-0.004757 -0.067551 0.001667
-0.021439 -0.067553 0.001667
3 0 1 2
3 0 3 1
3 3 4 1
3 5 4 3
3 6 7 8
3 7 9 8
3 7 10 9
3 10 11 9
3 6 12 7
3 13 11 10
3 6 13 12
3 6 11 13
3 14 15 16
3 14 17 15
3 18 17 14
3 18 19 17
3 18 20 19
3 21 20 18
3 21 22 20
3 21 23 22
3 24 23 21
3 24 25 23
3 26 25 24
3 26 27 25
3 26 28 27
3 29 28 26
3 29 30 28
3 29 31 30
3 32 31 29
3 32 33 31
3 34 33 32
3 35 36 37
3 38 36 35
3 39 36 38
3 40 36 39
3 41 36 40
3 42 36 41
3 43 36 42
3 44 36 43
3 45 36 44
3 46 36 45
3 47 36 46
3 48 36 47
3 34 48 33
3 34 36 48
3 34 49 36
3 34 50 49
3 34 51 50
3 52 51 34
3 52 53 51
3 52 54 53
3 55 54 52
3 55 56 54
3 56 57 54
3 55 58 56
3 59 57 56
3 55 60 58
3 61 57 59
3 55 62 60
3 63 57 61
3 63 64 57
3 55 65 62
3 66 64 63
3 67 65 55
3 67 68 65
3 69 64 66
3 67 70 68
3 71 64 69
3 67 72 70
3 73 64 71
3 73 74 64
3 67 75 72
3 76 74 73
3 67 77 75
3 78 74 76
3 79 77 67
3 79 80 77
3 81 74 78
3 81 82 74
3 79 83 80
3 84 82 81
3 79 85 83
3 86 82 84
3 86 87 82
3 88 85 79
3 88 89 85
3 90 87 86
3 91 89 88
3 92 89 91
3 93 87 90
3 92 94 89
3 95 94 92
3 96 94 95
3 97 87 93
3 96 98 94
3 97 99 87
3 100 98 96
3 101 99 97
3 100 102 98
3 103 102 100
3 104 99 101
3 103 105 102
3 106 105 103
3 107 99 104
3 106 108 105
3 109 108 106
3 107 110 99
3 111 110 107
3 109 112 108
3 113 112 109
3 114 110 111
3 113 115 112
3 116 115 113
3 117 115 116
3 118 110 114
3 117 119 115
3 120 119 117
3 121 110 118
3 120 122 119
3 123 110 121
3 120 124 122
3 125 110 123
3 120 125 124
3 120 110 125
3 120 126 110
3 120 127 126
3 120 128 127
3 120 129 128
3 120 130 129
3 120 131 130
3 120 132 131
3 120 133 132
3 120 134 133
3 120 135 134
3 120 136 135
3 120 137 136
3 120 138 137
3 120 139 138
3 120 140 139
3 120 141 140
3 120 142 141
3 120 143 142
3 120 144 143
3 120 145 144
3 120 146 145
3 120 147 146
3 120 148 147
3 148 149 147
3 148 150 149
3 148 151 150
3 148 152 151
3 152 153 151
3 148 154 152
3 155 153 152
3 148 156 154
3 148 157 156
3 148 158 157
3 148 159 158
3 148 160 159
3 148 161 160
3 148 162 161
3 148 163 162
3 148 164 163
3 148 165 164
3 148 166 165
3 120 167 148
3 168 166 148
3 169 170 168
3 170 166 168
3 169 171 170
3 155 172 153
3 120 173 167
3 169 174 171
3 175 172 155
3 120 176 173
3 169 177 174
3 178 172 175
3 120 179 176
3 178 180 172
3 181 179 120
3 182 179 181
3 183 179 182
3 184 179 183
3 185 179 184
3 186 179 185
3 187 179 186
3 188 179 187
3 188 189 179
3 169 190 177
3 191 189 188
3 192 189 191
3 193 189 192
3 194 180 178
3 195 189 193
3 196 189 195
3 194 197 180
3 198 189 196
3 199 189 198
3 199 200 189
3 201 200 199
3 202 200 201
3 203 200 202
3 204 200 203
3 169 205 190
3 206 200 204
3 207 200 206
3 208 200 207
3 208 209 200
3 210 197 194
3 211 209 208
3 212 209 211
3 213 209 212
3 210 214 197
3 213 215 209
3 169 216 205
3 217 215 213
3 218 215 217
3 219 214 210
3 218 220 215
3 219 221 214
3 222 220 218
3 222 223 220
3 169 224 216
3 225 223 222
3 225 226 223
3 227 226 225
3 228 226 227
3 228 229 226
3 230 221 219
3 228 231 229
3 232 231 228
3 230 233 221
3 232 234 231
3 235 234 232
3 169 236 224
3 230 237 233
3 238 237 230
3 169 239 236
3 238 240 237
3 169 241 239
3 242 240 238
3 242 243 240
3 169 244 241
3 245 243 242
3 245 246 243
3 169 247 244
3 245 248 246
3 169 249 247
3 245 250 248
3 169 251 249
3 245 252 250
3 169 253 251
3 245 254 252
3 169 255 253
3 245 256 254
3 169 257 255
3 258 256 245
3 258 259 256
3 169 260 257
3 258 261 259
3 169 262 260
3 258 263 261
3 169 264 262
3 258 265 263
3 169 266 264
3 258 267 265
3 169 268 266
3 258 269 267
3 169 270 268
3 271 269 258
3 271 272 269
3 169 273 270
3 271 274 272
3 169 275 273
3 271 276 274
3 169 277 275
3 271 278 276
3 169 279 277
3 280 278 271
3 281 279 169
3 280 282 278
3 281 283 279
3 280 284 282
3 281 285 283
3 286 284 280
3 287 285 281
3 286 288 284
3 287 289 285
3 290 288 286
3 291 289 287
3 290 292 288
3 291 293 289
3 294 292 290
3 295 293 291
3 294 296 292
3 295 297 293
3 294 298 296
3 295 299 297
3 300 298 294
3 301 299 295
3 300 302 298
3 301 303 299
3 304 302 300
3 305 303 301
3 304 306 302
3 305 307 303
3 308 306 304
3 309 307 305
3 308 310 306
3 309 311 307
3 308 312 310
3 309 313 311
3 314 312 308
3 315 313 309
3 314 316 312
3 315 317 313
3 318 316 314
3 319 317 315

View File

@@ -1,6 +1,6 @@
ply
format ascii 1.0
comment Created by Blender 2.90.0 - www.blender.org
comment Created by Blender 2.91.2 - www.blender.org
element vertex 183
property float x
property float y
@@ -8,189 +8,189 @@ property float z
element face 187
property list uchar uint vertex_indices
end_header
-0.009432 0.094246 0.000000
0.003738 0.094295 0.000000
-0.002850 0.094717 0.000000
0.010061 0.093020 0.000000
-0.015738 0.092918 0.000000
0.016061 0.090949 0.000000
-0.021711 0.090794 0.000000
0.021679 0.088143 0.000000
-0.027296 0.087934 0.000000
0.026855 0.084659 0.000000
-0.032435 0.084398 0.000000
0.031532 0.080557 0.000000
-0.037073 0.080246 0.000000
0.035651 0.075894 0.000000
-0.041152 0.075537 0.000000
0.039152 0.070729 0.000000
-0.044616 0.070332 0.000000
-0.002914 0.069195 0.000000
0.000224 0.069013 0.000000
0.041977 0.065121 0.000000
-0.047408 0.064691 0.000000
-0.006016 0.068952 0.000000
0.003236 0.068422 0.000000
-0.008987 0.068306 0.000000
0.006096 0.067450 0.000000
-0.011800 0.067284 0.000000
0.008773 0.066126 0.000000
-0.014428 0.065917 0.000000
0.011241 0.064477 0.000000
-0.016847 0.064231 0.000000
0.044068 0.059129 0.000000
-0.049473 0.058673 0.000000
0.013472 0.062532 0.000000
-0.019028 0.062257 0.000000
0.015436 0.060319 0.000000
-0.020946 0.060022 0.000000
0.017106 0.057867 0.000000
-0.022575 0.057555 0.000000
0.045366 0.052811 0.000000
-0.050753 0.052338 0.000000
0.018454 0.055203 0.000000
-0.023887 0.054884 0.000000
0.019452 0.052356 0.000000
-0.024857 0.052039 0.000000
0.045811 0.046226 0.000000
0.020071 0.049354 0.000000
-0.051192 0.045747 0.000000
-0.025459 0.049048 0.000000
0.020284 0.046226 0.000000
-0.025665 0.045939 0.000000
0.020284 0.045572 0.000000
0.045811 0.045572 0.000000
-0.025665 0.013047 0.000000
-0.051192 0.045104 0.000000
0.020284 0.043764 0.000000
0.045811 0.043764 0.000000
-0.051192 0.043325 0.000000
0.020284 0.041034 0.000000
0.045811 0.041034 0.000000
-0.051192 0.040638 0.000000
0.020284 0.037611 0.000000
0.045811 0.037611 0.000000
-0.051192 0.037269 0.000000
0.020284 0.033727 0.000000
0.045811 0.033727 0.000000
-0.051192 0.033447 0.000000
0.020284 0.029612 0.000000
0.045811 0.029612 0.000000
-0.051192 0.029397 0.000000
0.020284 0.025496 0.000000
0.045811 0.025496 0.000000
-0.051192 0.025348 0.000000
0.020284 0.021612 0.000000
0.045811 0.021612 0.000000
-0.051192 0.021525 0.000000
0.020284 0.018189 0.000000
0.045811 0.018189 0.000000
-0.051192 0.018157 0.000000
0.020284 0.015459 0.000000
0.045811 0.015459 0.000000
-0.051192 0.015469 0.000000
-0.051192 0.013691 0.000000
0.020284 0.013651 0.000000
0.045811 0.013651 0.000000
-0.051192 0.013047 0.000000
0.020284 0.012997 0.000000
0.021859 0.012998 0.000000
0.023659 0.012999 0.000000
0.045811 0.012997 0.000000
-0.060928 0.012907 0.000000
-0.058851 0.013047 0.000000
0.053470 0.013047 0.000000
0.025647 0.012998 0.000000
0.027786 0.012997 0.000000
0.055547 0.012907 0.000000
0.043820 0.012995 0.000000
0.030038 0.012996 0.000000
0.032366 0.012995 0.000000
0.034731 0.012994 0.000000
0.041679 0.012994 0.000000
0.037097 0.012993 0.000000
0.039425 0.012993 0.000000
-0.062921 0.012500 0.000000
0.057540 0.012500 0.000000
-0.064811 0.011843 0.000000
0.059430 0.011843 0.000000
-0.066580 0.010956 0.000000
0.061199 0.010956 0.000000
-0.068209 0.009856 0.000000
0.062828 0.009856 0.000000
-0.069680 0.008561 0.000000
0.064299 0.008561 0.000000
-0.070975 0.007090 0.000000
0.065594 0.007090 0.000000
-0.072075 0.005461 0.000000
0.066694 0.005461 0.000000
-0.072963 0.003693 0.000000
0.067582 0.003693 0.000000
-0.073620 0.001804 0.000000
0.068239 0.001804 0.000000
-0.074027 -0.000189 0.000000
0.068646 -0.000189 0.000000
-0.074167 -0.002266 0.000000
0.068786 -0.002266 0.000000
-0.074167 -0.003270 0.000000
0.068786 -0.003270 0.000000
-0.074167 -0.006047 0.000000
0.068786 -0.006047 0.000000
-0.074167 -0.010242 0.000000
0.068786 -0.010242 0.000000
-0.074167 -0.015500 0.000000
0.068786 -0.015500 0.000000
-0.074167 -0.021467 0.000000
0.068786 -0.021467 0.000000
-0.074167 -0.027788 0.000000
0.068786 -0.027788 0.000000
-0.074167 -0.034109 0.000000
0.068786 -0.034109 0.000000
-0.074167 -0.040076 0.000000
0.068786 -0.040076 0.000000
-0.074167 -0.045334 0.000000
0.068786 -0.045334 0.000000
-0.074167 -0.049529 0.000000
0.068786 -0.049529 0.000000
-0.074167 -0.052306 0.000000
0.068786 -0.052306 0.000000
-0.074167 -0.053310 0.000000
0.068786 -0.053310 0.000000
-0.074027 -0.055387 0.000000
0.068646 -0.055387 0.000000
-0.073620 -0.057380 0.000000
0.068239 -0.057380 0.000000
-0.072963 -0.059269 0.000000
0.067582 -0.059269 0.000000
-0.072075 -0.061037 0.000000
0.066694 -0.061037 0.000000
-0.070975 -0.062666 0.000000
0.065594 -0.062666 0.000000
-0.069680 -0.064137 0.000000
0.064299 -0.064137 0.000000
-0.068209 -0.065431 0.000000
0.062828 -0.065431 0.000000
-0.066580 -0.066532 0.000000
0.061199 -0.066532 0.000000
-0.064811 -0.067419 0.000000
0.059430 -0.067419 0.000000
-0.062921 -0.068076 0.000000
0.057540 -0.068076 0.000000
-0.060928 -0.068483 0.000000
0.055547 -0.068483 0.000000
-0.058851 -0.068623 0.000000
0.053470 -0.068623 0.000000
-0.056641 -0.068623 0.000000
-0.050531 -0.068623 0.000000
-0.041301 -0.068623 0.000000
-0.029731 -0.068623 0.000000
-0.016601 -0.068623 0.000000
-0.002690 -0.068623 0.000000
0.011220 -0.068623 0.000000
0.024350 -0.068623 0.000000
0.035920 -0.068623 0.000000
0.045150 -0.068623 0.000000
0.051260 -0.068623 0.000000
-0.007900 0.079000 -0.000010
0.003131 0.079042 -0.000010
-0.002387 0.079396 -0.000010
0.008428 0.077974 -0.000010
-0.013182 0.077888 -0.000010
0.013453 0.076239 -0.000010
-0.018186 0.076109 -0.000010
0.018159 0.073889 -0.000010
-0.022864 0.073714 -0.000010
0.022495 0.070971 -0.000010
-0.027169 0.070752 -0.000010
0.026412 0.067534 -0.000010
-0.031053 0.067274 -0.000010
0.029862 0.063628 -0.000010
-0.034470 0.063330 -0.000010
0.032795 0.059302 -0.000010
-0.037372 0.058970 -0.000010
-0.002441 0.058018 -0.000010
0.000188 0.057865 -0.000010
0.035162 0.054605 -0.000010
-0.039711 0.054244 -0.000010
-0.005039 0.057814 -0.000010
0.002711 0.057370 -0.000010
-0.007527 0.057272 -0.000010
0.005106 0.056556 -0.000010
-0.009884 0.056417 -0.000010
0.007349 0.055446 -0.000010
-0.012086 0.055271 -0.000010
0.009416 0.054065 -0.000010
-0.014111 0.053859 -0.000010
0.036913 0.049586 -0.000010
-0.041440 0.049204 -0.000010
0.011284 0.052436 -0.000010
-0.015938 0.052205 -0.000010
0.012930 0.050582 -0.000010
-0.017545 0.050333 -0.000010
0.014329 0.048528 -0.000010
-0.018909 0.048267 -0.000010
0.038000 0.044294 -0.000010
-0.042513 0.043898 -0.000010
0.015458 0.046297 -0.000010
-0.020009 0.046030 -0.000010
0.016294 0.043912 -0.000010
-0.020821 0.043647 -0.000010
0.038373 0.038777 -0.000010
0.016813 0.041398 -0.000010
-0.042881 0.038377 -0.000010
-0.021325 0.041141 -0.000010
0.016991 0.038777 -0.000010
-0.021498 0.038537 -0.000010
0.016991 0.038230 -0.000010
0.038373 0.038230 -0.000010
-0.021498 0.010986 -0.000010
-0.042881 0.037838 -0.000010
0.016991 0.036716 -0.000010
0.038373 0.036716 -0.000010
-0.042881 0.036348 -0.000010
0.016991 0.034428 -0.000010
0.038373 0.034428 -0.000010
-0.042881 0.034097 -0.000010
0.016991 0.031561 -0.000010
0.038373 0.031561 -0.000010
-0.042881 0.031275 -0.000010
0.016991 0.028308 -0.000010
0.038373 0.028308 -0.000010
-0.042881 0.028073 -0.000010
0.016991 0.024861 -0.000010
0.038373 0.024861 -0.000010
-0.042881 0.024681 -0.000010
0.016991 0.021414 -0.000010
0.038373 0.021414 -0.000010
-0.042881 0.021289 -0.000010
0.016991 0.018160 -0.000010
0.038373 0.018160 -0.000010
-0.042881 0.018087 -0.000010
0.016991 0.015293 -0.000010
0.038373 0.015293 -0.000010
-0.042881 0.015266 -0.000010
0.016991 0.013006 -0.000010
0.038373 0.013006 -0.000010
-0.042881 0.013015 -0.000010
-0.042881 0.011525 -0.000010
0.016991 0.011492 -0.000010
0.038373 0.011492 -0.000010
-0.042881 0.010986 -0.000010
0.016991 0.010944 -0.000010
0.018310 0.010945 -0.000010
0.019818 0.010945 -0.000010
0.038373 0.010944 -0.000010
-0.051036 0.010869 -0.000010
-0.049295 0.010986 -0.000010
0.044788 0.010986 -0.000010
0.021483 0.010945 -0.000010
0.023275 0.010944 -0.000010
0.046528 0.010869 -0.000010
0.036705 0.010942 -0.000010
0.025161 0.010943 -0.000010
0.027111 0.010942 -0.000010
0.029092 0.010941 -0.000010
0.034912 0.010941 -0.000010
0.031073 0.010941 -0.000010
0.033024 0.010941 -0.000010
-0.052705 0.010528 -0.000010
0.048198 0.010528 -0.000010
-0.054288 0.009978 -0.000010
0.049781 0.009978 -0.000010
-0.055769 0.009234 -0.000010
0.051262 0.009234 -0.000010
-0.057134 0.008313 -0.000010
0.052627 0.008313 -0.000010
-0.058366 0.007228 -0.000010
0.053859 0.007228 -0.000010
-0.059451 0.005996 -0.000010
0.054944 0.005996 -0.000010
-0.060373 0.004632 -0.000010
0.055865 0.004632 -0.000010
-0.061116 0.003151 -0.000010
0.056609 0.003151 -0.000010
-0.061666 0.001568 -0.000010
0.057159 0.001568 -0.000010
-0.062008 -0.000101 -0.000010
0.057500 -0.000101 -0.000010
-0.062125 -0.001841 -0.000010
0.057618 -0.001841 -0.000010
-0.062125 -0.002682 -0.000010
0.057618 -0.002682 -0.000010
-0.062125 -0.005008 -0.000010
0.057618 -0.005008 -0.000010
-0.062125 -0.008522 -0.000010
0.057618 -0.008522 -0.000010
-0.062125 -0.012926 -0.000010
0.057618 -0.012926 -0.000010
-0.062125 -0.017924 -0.000010
0.057618 -0.017924 -0.000010
-0.062125 -0.023219 -0.000010
0.057618 -0.023219 -0.000010
-0.062125 -0.028514 -0.000010
0.057618 -0.028514 -0.000010
-0.062125 -0.033512 -0.000010
0.057618 -0.033512 -0.000010
-0.062125 -0.037916 -0.000010
0.057618 -0.037916 -0.000010
-0.062125 -0.041430 -0.000010
0.057618 -0.041430 -0.000010
-0.062125 -0.043756 -0.000010
0.057618 -0.043756 -0.000010
-0.062125 -0.044597 -0.000010
0.057618 -0.044597 -0.000010
-0.062008 -0.046337 -0.000010
0.057500 -0.046337 -0.000010
-0.061666 -0.048006 -0.000010
0.057159 -0.048006 -0.000010
-0.061116 -0.049589 -0.000010
0.056609 -0.049589 -0.000010
-0.060373 -0.051070 -0.000010
0.055865 -0.051070 -0.000010
-0.059451 -0.052434 -0.000010
0.054944 -0.052434 -0.000010
-0.058366 -0.053666 -0.000010
0.053859 -0.053666 -0.000010
-0.057134 -0.054750 -0.000010
0.052627 -0.054750 -0.000010
-0.055769 -0.055672 -0.000010
0.051262 -0.055672 -0.000010
-0.054288 -0.056415 -0.000010
0.049781 -0.056415 -0.000010
-0.052705 -0.056965 -0.000010
0.048198 -0.056965 -0.000010
-0.051036 -0.057307 -0.000010
0.046528 -0.057307 -0.000010
-0.049295 -0.057424 -0.000010
0.044788 -0.057424 -0.000010
-0.047444 -0.057424 -0.000010
-0.042326 -0.057424 -0.000010
-0.034595 -0.057424 -0.000010
-0.024903 -0.057424 -0.000010
-0.013905 -0.057424 -0.000010
-0.002254 -0.057424 -0.000010
0.009398 -0.057424 -0.000010
0.020396 -0.057424 -0.000010
0.030087 -0.057424 -0.000010
0.037819 -0.057424 -0.000010
0.042937 -0.057424 -0.000010
3 0 1 2
3 0 3 1
3 4 3 0

View File

@@ -1,6 +1,6 @@
ply
format ascii 1.0
comment Created by Blender 2.90.0 - www.blender.org
comment Created by Blender 2.91.2 - www.blender.org
element vertex 207
property float x
property float y
@@ -8,213 +8,213 @@ property float z
element face 205
property list uchar uint vertex_indices
end_header
-0.009432 0.099819 0.000000
0.003738 0.099869 0.000000
-0.002850 0.100291 0.000000
0.010061 0.098593 0.000000
-0.015738 0.098491 0.000000
0.016061 0.096523 0.000000
-0.021711 0.096368 0.000000
0.021679 0.093717 0.000000
-0.027296 0.093508 0.000000
0.026855 0.090233 0.000000
-0.032435 0.089972 0.000000
0.031532 0.086130 0.000000
-0.037073 0.085819 0.000000
0.035651 0.081468 0.000000
-0.041152 0.081111 0.000000
0.039152 0.076303 0.000000
-0.044616 0.075906 0.000000
-0.002914 0.074769 0.000000
0.000224 0.074587 0.000000
0.041977 0.070695 0.000000
-0.047408 0.070264 0.000000
-0.006016 0.074526 0.000000
0.003236 0.073996 0.000000
-0.008987 0.073879 0.000000
0.006096 0.073024 0.000000
-0.011800 0.072858 0.000000
0.008773 0.071699 0.000000
-0.014428 0.071490 0.000000
0.011241 0.070051 0.000000
-0.016847 0.069805 0.000000
0.044068 0.064703 0.000000
-0.049473 0.064247 0.000000
0.013472 0.068106 0.000000
-0.019028 0.067830 0.000000
0.015436 0.065893 0.000000
-0.020946 0.065595 0.000000
0.017106 0.063440 0.000000
-0.022575 0.063128 0.000000
0.045366 0.058385 0.000000
-0.050753 0.057912 0.000000
0.018454 0.060776 0.000000
-0.023887 0.060458 0.000000
0.019452 0.057930 0.000000
-0.024857 0.057613 0.000000
0.045811 0.051799 0.000000
0.020071 0.054928 0.000000
-0.051192 0.051321 0.000000
-0.025459 0.054621 0.000000
0.020284 0.051799 0.000000
-0.025665 0.051512 0.000000
0.020284 0.051699 0.000000
0.045811 0.051699 0.000000
0.020284 0.051421 0.000000
0.045811 0.051421 0.000000
-0.025665 0.013047 0.000000
0.020284 0.051002 0.000000
0.045811 0.051002 0.000000
-0.051192 0.050568 0.000000
0.020284 0.050476 0.000000
0.045811 0.050476 0.000000
-0.051192 0.048486 0.000000
0.020284 0.049879 0.000000
0.045811 0.049879 0.000000
0.020284 0.049247 0.000000
0.045811 0.049247 0.000000
0.020284 0.048615 0.000000
0.045811 0.048615 0.000000
0.020284 0.048018 0.000000
0.045811 0.048018 0.000000
-0.051192 0.045341 0.000000
0.020284 0.047493 0.000000
0.045811 0.047493 0.000000
0.020284 0.047073 0.000000
0.045811 0.047073 0.000000
0.020284 0.046795 0.000000
0.045811 0.046795 0.000000
0.020284 0.046695 0.000000
0.045811 0.046695 0.000000
0.020354 0.045653 0.000000
0.045742 0.045653 0.000000
0.020557 0.044655 0.000000
0.045539 0.044655 0.000000
-0.051192 0.041398 0.000000
0.020884 0.043709 0.000000
0.045212 0.043709 0.000000
0.021327 0.042824 0.000000
0.044769 0.042824 0.000000
0.021875 0.042010 0.000000
0.044220 0.042010 0.000000
0.022522 0.041276 0.000000
0.043574 0.041276 0.000000
-0.051192 0.036924 0.000000
0.023257 0.040629 0.000000
0.042839 0.040629 0.000000
0.024071 0.040081 0.000000
0.042025 0.040081 0.000000
0.024955 0.039638 0.000000
0.041140 0.039638 0.000000
0.025901 0.039311 0.000000
0.040194 0.039311 0.000000
0.026900 0.039108 0.000000
0.039195 0.039108 0.000000
0.027942 0.039038 0.000000
0.038153 0.039038 0.000000
0.028143 0.039038 0.000000
0.028699 0.039038 0.000000
0.029538 0.039038 0.000000
0.030590 0.039038 0.000000
0.031783 0.039038 0.000000
0.033048 0.039038 0.000000
0.034312 0.039038 0.000000
0.035506 0.039038 0.000000
0.036558 0.039038 0.000000
0.037397 0.039038 0.000000
0.037952 0.039038 0.000000
-0.051192 0.032184 0.000000
-0.051192 0.027444 0.000000
-0.051192 0.022970 0.000000
-0.051192 0.019027 0.000000
-0.051192 0.015882 0.000000
-0.051192 0.013800 0.000000
-0.051192 0.013047 0.000000
-0.060928 0.012907 0.000000
-0.058851 0.013047 0.000000
0.053470 0.013047 0.000000
0.055547 0.012907 0.000000
-0.062921 0.012500 0.000000
0.057540 0.012500 0.000000
-0.064811 0.011843 0.000000
0.059430 0.011843 0.000000
-0.066580 0.010956 0.000000
0.061199 0.010956 0.000000
-0.068209 0.009856 0.000000
0.062828 0.009856 0.000000
-0.069680 0.008561 0.000000
0.064299 0.008561 0.000000
-0.070975 0.007090 0.000000
0.065594 0.007090 0.000000
-0.072075 0.005461 0.000000
0.066694 0.005461 0.000000
-0.072963 0.003693 0.000000
0.067582 0.003693 0.000000
-0.073620 0.001804 0.000000
0.068239 0.001804 0.000000
-0.074027 -0.000189 0.000000
0.068646 -0.000189 0.000000
-0.074167 -0.002266 0.000000
0.068786 -0.002266 0.000000
-0.074167 -0.003270 0.000000
0.068786 -0.003270 0.000000
-0.074167 -0.006047 0.000000
0.068786 -0.006047 0.000000
-0.074167 -0.010242 0.000000
0.068786 -0.010242 0.000000
-0.074167 -0.015500 0.000000
0.068786 -0.015500 0.000000
-0.074167 -0.021467 0.000000
0.068786 -0.021467 0.000000
-0.074167 -0.027788 0.000000
0.068786 -0.027788 0.000000
-0.074167 -0.034109 0.000000
0.068786 -0.034109 0.000000
-0.074167 -0.040076 0.000000
0.068786 -0.040076 0.000000
-0.074167 -0.045334 0.000000
0.068786 -0.045334 0.000000
-0.074167 -0.049529 0.000000
0.068786 -0.049529 0.000000
-0.074167 -0.052306 0.000000
0.068786 -0.052306 0.000000
-0.074167 -0.053310 0.000000
0.068786 -0.053310 0.000000
-0.074027 -0.055387 0.000000
0.068646 -0.055387 0.000000
-0.073620 -0.057380 0.000000
0.068239 -0.057380 0.000000
-0.072963 -0.059269 0.000000
0.067582 -0.059269 0.000000
-0.072075 -0.061037 0.000000
0.066694 -0.061037 0.000000
-0.070975 -0.062666 0.000000
0.065594 -0.062666 0.000000
-0.069680 -0.064137 0.000000
0.064299 -0.064137 0.000000
-0.068209 -0.065431 0.000000
0.062828 -0.065431 0.000000
-0.066580 -0.066532 0.000000
0.061199 -0.066532 0.000000
-0.064811 -0.067419 0.000000
0.059430 -0.067419 0.000000
-0.062921 -0.068076 0.000000
0.057540 -0.068076 0.000000
-0.060928 -0.068483 0.000000
0.055547 -0.068483 0.000000
-0.058851 -0.068623 0.000000
0.053470 -0.068623 0.000000
-0.056641 -0.068623 0.000000
-0.050531 -0.068623 0.000000
-0.041301 -0.068623 0.000000
-0.029731 -0.068623 0.000000
-0.016601 -0.068623 0.000000
-0.002690 -0.068623 0.000000
0.011220 -0.068623 0.000000
0.024350 -0.068623 0.000000
0.035920 -0.068623 0.000000
0.045150 -0.068623 0.000000
0.051260 -0.068623 0.000000
0.004060 0.080795 -0.000011
-0.006788 0.080836 -0.000011
-0.001361 0.081184 -0.000011
-0.011996 0.079785 -0.000011
0.009254 0.079701 -0.000011
-0.016937 0.078080 -0.000011
0.014174 0.077952 -0.000011
-0.021564 0.075769 -0.000011
0.018774 0.075596 -0.000011
-0.025828 0.072899 -0.000011
0.023007 0.072684 -0.000011
-0.029680 0.069520 -0.000011
0.026826 0.069264 -0.000011
-0.033072 0.065679 -0.000011
0.030186 0.065386 -0.000011
-0.035956 0.061426 -0.000011
0.033039 0.061099 -0.000011
-0.001309 0.060162 -0.000011
-0.003893 0.060012 -0.000011
-0.038283 0.056807 -0.000011
0.035339 0.056452 -0.000011
0.001246 0.059962 -0.000011
-0.006374 0.059526 -0.000011
0.003693 0.059430 -0.000011
-0.008729 0.058725 -0.000011
0.006010 0.058588 -0.000011
-0.010935 0.057634 -0.000011
0.008175 0.057462 -0.000011
-0.012968 0.056276 -0.000011
0.010167 0.056074 -0.000011
-0.040006 0.051871 -0.000011
0.037040 0.051495 -0.000011
-0.014804 0.054674 -0.000011
0.011964 0.054447 -0.000011
-0.016422 0.052851 -0.000011
0.013544 0.052606 -0.000011
-0.017798 0.050831 -0.000011
0.014885 0.050574 -0.000011
-0.041074 0.046667 -0.000011
0.038094 0.046278 -0.000011
-0.018909 0.048637 -0.000011
0.015966 0.048375 -0.000011
-0.019730 0.046292 -0.000011
0.016765 0.046032 -0.000011
-0.041441 0.041243 -0.000011
-0.020241 0.043820 -0.000011
0.038456 0.040849 -0.000011
0.017261 0.043568 -0.000011
-0.020416 0.041243 -0.000011
0.017430 0.041007 -0.000011
-0.020416 0.041161 -0.000011
-0.041441 0.041161 -0.000011
-0.020416 0.040932 -0.000011
-0.041441 0.040932 -0.000011
0.017430 0.009325 -0.000011
-0.020416 0.040586 -0.000011
-0.041441 0.040586 -0.000011
0.038456 0.040229 -0.000011
-0.020416 0.040153 -0.000011
-0.041441 0.040153 -0.000011
0.038456 0.038514 -0.000011
-0.020416 0.039662 -0.000011
-0.041441 0.039662 -0.000011
-0.020416 0.039141 -0.000011
-0.041441 0.039141 -0.000011
-0.020416 0.038621 -0.000011
-0.041441 0.038621 -0.000011
-0.020416 0.038129 -0.000011
-0.041441 0.038129 -0.000011
0.038456 0.035924 -0.000011
-0.020416 0.037696 -0.000011
-0.041441 0.037696 -0.000011
-0.020416 0.037351 -0.000011
-0.041441 0.037351 -0.000011
-0.020416 0.037122 -0.000011
-0.041441 0.037122 -0.000011
-0.020416 0.037039 -0.000011
-0.041441 0.037039 -0.000011
-0.020473 0.036181 -0.000011
-0.041384 0.036181 -0.000011
-0.020640 0.035359 -0.000011
-0.041217 0.035359 -0.000011
0.038456 0.032676 -0.000011
-0.020910 0.034579 -0.000011
-0.040947 0.034579 -0.000011
-0.021274 0.033851 -0.000011
-0.040583 0.033851 -0.000011
-0.021726 0.033180 -0.000011
-0.040131 0.033180 -0.000011
-0.022259 0.032575 -0.000011
-0.039598 0.032575 -0.000011
0.038456 0.028991 -0.000011
-0.022864 0.032043 -0.000011
-0.038993 0.032043 -0.000011
-0.023534 0.031591 -0.000011
-0.038323 0.031591 -0.000011
-0.024263 0.031227 -0.000011
-0.037594 0.031227 -0.000011
-0.025042 0.030957 -0.000011
-0.036815 0.030957 -0.000011
-0.025865 0.030790 -0.000011
-0.035992 0.030790 -0.000011
-0.026723 0.030733 -0.000011
-0.035134 0.030733 -0.000011
-0.026889 0.030733 -0.000011
-0.027346 0.030733 -0.000011
-0.028037 0.030733 -0.000011
-0.028904 0.030733 -0.000011
-0.029887 0.030733 -0.000011
-0.030929 0.030733 -0.000011
-0.031970 0.030733 -0.000011
-0.032953 0.030733 -0.000011
-0.033820 0.030733 -0.000011
-0.034511 0.030733 -0.000011
-0.034968 0.030733 -0.000011
0.038456 0.025087 -0.000011
0.038456 0.021183 -0.000011
0.038456 0.017498 -0.000011
0.038456 0.014251 -0.000011
0.038456 0.011660 -0.000011
0.038456 0.009945 -0.000011
0.038456 0.009325 -0.000011
0.046475 0.009210 -0.000011
0.044764 0.009325 -0.000011
-0.047749 0.009325 -0.000011
-0.049460 0.009210 -0.000011
0.048117 0.008874 -0.000011
-0.051102 0.008874 -0.000011
0.049673 0.008333 -0.000011
-0.052658 0.008333 -0.000011
0.051130 0.007602 -0.000011
-0.054115 0.007602 -0.000011
0.052472 0.006696 -0.000011
-0.055457 0.006696 -0.000011
0.053683 0.005630 -0.000011
-0.056668 0.005630 -0.000011
0.054750 0.004418 -0.000011
-0.057735 0.004418 -0.000011
0.055656 0.003077 -0.000011
-0.058641 0.003077 -0.000011
0.056387 0.001621 -0.000011
-0.059373 0.001621 -0.000011
0.056928 0.000064 -0.000011
-0.059914 0.000064 -0.000011
0.057264 -0.001577 -0.000011
-0.060249 -0.001577 -0.000011
0.057379 -0.003288 -0.000011
-0.060364 -0.003288 -0.000011
0.057379 -0.004115 -0.000011
-0.060364 -0.004115 -0.000011
0.057379 -0.006402 -0.000011
-0.060364 -0.006402 -0.000011
0.057379 -0.009857 -0.000011
-0.060364 -0.009857 -0.000011
0.057379 -0.014188 -0.000011
-0.060364 -0.014188 -0.000011
0.057379 -0.019102 -0.000011
-0.060364 -0.019102 -0.000011
0.057379 -0.024309 -0.000011
-0.060364 -0.024309 -0.000011
0.057379 -0.029516 -0.000011
-0.060364 -0.029516 -0.000011
0.057379 -0.034430 -0.000011
-0.060364 -0.034430 -0.000011
0.057379 -0.038761 -0.000011
-0.060364 -0.038761 -0.000011
0.057379 -0.042216 -0.000011
-0.060364 -0.042216 -0.000011
0.057379 -0.044503 -0.000011
-0.060364 -0.044503 -0.000011
0.057379 -0.045330 -0.000011
-0.060364 -0.045330 -0.000011
0.057264 -0.047041 -0.000011
-0.060249 -0.047041 -0.000011
0.056928 -0.048682 -0.000011
-0.059914 -0.048682 -0.000011
0.056387 -0.050239 -0.000011
-0.059373 -0.050239 -0.000011
0.055656 -0.051695 -0.000011
-0.058641 -0.051695 -0.000011
0.054750 -0.053036 -0.000011
-0.057735 -0.053036 -0.000011
0.053683 -0.054248 -0.000011
-0.056668 -0.054248 -0.000011
0.052472 -0.055314 -0.000011
-0.055457 -0.055314 -0.000011
0.051130 -0.056220 -0.000011
-0.054115 -0.056220 -0.000011
0.049673 -0.056951 -0.000011
-0.052658 -0.056951 -0.000011
0.048117 -0.057492 -0.000011
-0.051102 -0.057492 -0.000011
0.046475 -0.057828 -0.000011
-0.049460 -0.057828 -0.000011
0.044764 -0.057943 -0.000011
-0.047749 -0.057943 -0.000011
0.042944 -0.057943 -0.000011
0.037911 -0.057943 -0.000011
0.030309 -0.057943 -0.000011
0.020779 -0.057943 -0.000011
0.009964 -0.057943 -0.000011
-0.001493 -0.057943 -0.000011
-0.012950 -0.057943 -0.000011
-0.023764 -0.057943 -0.000011
-0.033294 -0.057943 -0.000011
-0.040896 -0.057943 -0.000011
-0.045929 -0.057943 -0.000011
3 0 1 2
3 0 3 1
3 4 3 0

View File

@@ -0,0 +1,664 @@
ply
format ascii 1.0
comment Created by Blender 2.91.2 - www.blender.org
element vertex 328
property float x
property float y
property float z
element face 326
property list uchar uint vertex_indices
end_header
-0.054947 0.061984 0.000000
-0.053447 0.062056 0.000000
-0.053901 0.062056 0.000000
-0.052189 0.062056 0.000000
-0.050289 0.062056 0.000000
-0.047907 0.062056 0.000000
-0.045204 0.062056 0.000000
-0.042340 0.062056 0.000000
-0.039477 0.062056 0.000000
-0.036774 0.062056 0.000000
-0.034392 0.062056 0.000000
-0.032492 0.062056 0.000000
-0.031234 0.062056 0.000000
-0.030779 0.062056 0.000000
-0.029733 0.061984 0.000000
0.029835 0.061984 0.000000
0.050684 0.062056 0.000000
0.030881 0.062056 0.000000
0.040676 0.052282 0.000000
-0.055950 0.061777 0.000000
-0.028730 0.061777 0.000000
0.028832 0.061777 0.000000
-0.056901 0.061443 0.000000
-0.027779 0.061443 0.000000
0.027881 0.061443 0.000000
-0.057791 0.060991 0.000000
-0.026889 0.060991 0.000000
0.026991 0.060991 0.000000
-0.058611 0.060431 0.000000
-0.026070 0.060431 0.000000
0.026171 0.060431 0.000000
-0.059351 0.059771 0.000000
-0.025329 0.059771 0.000000
0.025431 0.059771 0.000000
-0.060003 0.059023 0.000000
-0.024678 0.059023 0.000000
0.024780 0.059023 0.000000
-0.060556 0.058193 0.000000
-0.024124 0.058193 0.000000
0.024226 0.058193 0.000000
-0.061003 0.057293 0.000000
-0.023677 0.057293 0.000000
0.023779 0.057293 0.000000
-0.061333 0.056331 0.000000
-0.023347 0.056331 0.000000
0.023449 0.056331 0.000000
-0.061538 0.055316 0.000000
-0.023142 0.055316 0.000000
0.023244 0.055316 0.000000
-0.061609 0.054258 0.000000
-0.023071 0.054258 0.000000
0.023173 0.054258 0.000000
-0.061609 0.053798 0.000000
-0.022161 0.054258 0.000000
-0.019646 0.054258 0.000000
-0.015846 0.054258 0.000000
-0.011082 0.054258 0.000000
-0.005676 0.054258 0.000000
0.000051 0.054258 0.000000
0.005778 0.054258 0.000000
0.011184 0.054258 0.000000
0.015948 0.054258 0.000000
0.019748 0.054258 0.000000
0.022263 0.054258 0.000000
-0.061609 0.052525 0.000000
-0.061609 0.050603 0.000000
-0.052099 0.052282 0.000000
-0.052099 0.033119 0.000000
-0.032907 0.052282 0.000000
-0.032907 0.033119 0.000000
-0.023071 0.038663 0.000000
0.033332 0.052282 0.000000
0.033332 0.045109 0.000000
-0.061609 0.048193 0.000000
-0.061609 0.045459 0.000000
0.052523 0.037198 0.000000
0.061711 0.045870 0.000000
0.061711 0.046171 0.000000
0.061711 0.045037 0.000000
-0.061609 0.042561 0.000000
0.023173 0.038663 0.000000
0.023173 0.035187 0.000000
0.061711 0.043779 0.000000
0.061711 0.042203 0.000000
-0.061609 0.039664 0.000000
0.061711 0.040414 0.000000
0.061711 0.038518 0.000000
-0.061609 0.036930 0.000000
-0.023071 0.038509 0.000000
0.061711 0.036622 0.000000
-0.023071 0.038085 0.000000
-0.023071 0.037444 0.000000
-0.023071 0.036641 0.000000
0.052523 0.033119 0.000000
-0.061609 0.034520 0.000000
-0.023071 0.035729 0.000000
0.061711 0.034833 0.000000
-0.023071 0.034764 0.000000
0.061711 0.033257 0.000000
-0.023071 0.033798 0.000000
-0.061609 0.032598 0.000000
-0.023071 0.032887 0.000000
0.061711 0.031999 0.000000
0.038054 0.023067 0.000000
0.048347 0.033119 0.000000
-0.023071 0.032083 0.000000
-0.061609 0.031325 0.000000
-0.023071 0.031443 0.000000
0.061711 0.031166 0.000000
-0.023071 0.031018 0.000000
-0.061609 0.030865 0.000000
0.061711 0.030865 0.000000
-0.023071 0.030865 0.000000
-0.061538 0.029807 0.000000
-0.023142 0.029807 0.000000
0.061640 0.029807 0.000000
-0.023347 0.028792 0.000000
0.061435 0.028792 0.000000
-0.061333 0.028792 0.000000
-0.023677 0.027830 0.000000
0.061105 0.027830 0.000000
-0.061003 0.027830 0.000000
-0.024124 0.026930 0.000000
0.060658 0.026930 0.000000
-0.060556 0.026930 0.000000
-0.024678 0.026100 0.000000
0.060105 0.026100 0.000000
-0.060003 0.026100 0.000000
-0.025329 0.025351 0.000000
0.059453 0.025351 0.000000
-0.059351 0.025351 0.000000
-0.026070 0.024692 0.000000
0.058713 0.024692 0.000000
-0.058611 0.024692 0.000000
-0.026889 0.024132 0.000000
0.057893 0.024132 0.000000
-0.057791 0.024132 0.000000
-0.027779 0.023680 0.000000
0.057003 0.023680 0.000000
-0.056901 0.023680 0.000000
-0.028730 0.023345 0.000000
0.056052 0.023345 0.000000
-0.055950 0.023345 0.000000
-0.029733 0.023138 0.000000
0.055049 0.023138 0.000000
-0.054947 0.023138 0.000000
-0.030779 0.023067 0.000000
0.054003 0.023067 0.000000
-0.053901 0.023067 0.000000
-0.053901 0.022146 0.000000
-0.038486 0.023067 0.000000
-0.038486 -0.023719 0.000000
0.038588 0.023067 0.000000
0.038588 -0.023719 0.000000
0.054003 0.022146 0.000000
0.054003 0.019601 0.000000
-0.053901 0.019601 0.000000
0.054003 0.015756 0.000000
-0.053901 0.015756 0.000000
0.054003 0.010937 0.000000
-0.053901 0.010937 0.000000
0.054003 0.005468 0.000000
-0.053901 0.005468 0.000000
0.054003 -0.000326 0.000000
-0.053901 -0.000326 0.000000
0.054003 -0.006120 0.000000
-0.053901 -0.006120 0.000000
0.054003 -0.011589 0.000000
-0.053901 -0.011589 0.000000
0.054003 -0.016409 0.000000
-0.053901 -0.016409 0.000000
0.054003 -0.020254 0.000000
-0.053901 -0.020254 0.000000
0.054003 -0.022799 0.000000
-0.053901 -0.022799 0.000000
0.054003 -0.023719 0.000000
-0.053901 -0.023719 0.000000
-0.054947 -0.023790 0.000000
-0.037141 -0.023719 0.000000
-0.048284 -0.034601 0.000000
0.029835 -0.023790 0.000000
0.030881 -0.023719 0.000000
0.055049 -0.023790 0.000000
-0.055950 -0.023998 0.000000
0.028832 -0.023998 0.000000
0.056052 -0.023998 0.000000
-0.056901 -0.024332 0.000000
0.027881 -0.024332 0.000000
0.057003 -0.024332 0.000000
-0.057791 -0.024784 0.000000
0.026991 -0.024784 0.000000
0.057893 -0.024784 0.000000
-0.058611 -0.025344 0.000000
0.026171 -0.025344 0.000000
0.058713 -0.025344 0.000000
-0.059351 -0.026004 0.000000
0.025431 -0.026004 0.000000
0.059453 -0.026004 0.000000
-0.060003 -0.026753 0.000000
0.024780 -0.026753 0.000000
0.060105 -0.026753 0.000000
-0.060556 -0.027582 0.000000
0.024226 -0.027582 0.000000
0.060658 -0.027582 0.000000
-0.061003 -0.028482 0.000000
0.023779 -0.028482 0.000000
0.061105 -0.028482 0.000000
-0.061333 -0.029445 0.000000
0.023449 -0.029445 0.000000
0.061435 -0.029445 0.000000
-0.061538 -0.030459 0.000000
0.023244 -0.030459 0.000000
0.061640 -0.030459 0.000000
-0.061609 -0.031517 0.000000
0.023173 -0.031517 0.000000
0.061711 -0.031517 0.000000
-0.061609 -0.031834 0.000000
0.023173 -0.031671 0.000000
0.061711 -0.031978 0.000000
0.023173 -0.032095 0.000000
-0.061609 -0.032710 0.000000
0.061711 -0.033250 0.000000
0.023173 -0.032736 0.000000
-0.061609 -0.034033 0.000000
0.023173 -0.033539 0.000000
0.052523 -0.034601 0.000000
0.061711 -0.035173 0.000000
0.023173 -0.034451 0.000000
-0.061609 -0.035691 0.000000
-0.052099 -0.034601 0.000000
0.023173 -0.035416 0.000000
0.033332 -0.034601 0.000000
-0.052099 -0.038327 0.000000
0.033332 -0.053764 0.000000
0.052523 -0.053764 0.000000
0.061711 -0.037582 0.000000
0.023173 -0.036382 0.000000
-0.061609 -0.037573 0.000000
0.023173 -0.037293 0.000000
-0.032907 -0.046238 0.000000
-0.023071 -0.039315 0.000000
-0.023071 -0.036632 0.000000
0.023173 -0.038097 0.000000
-0.061609 -0.039566 0.000000
0.061711 -0.040317 0.000000
0.023173 -0.038737 0.000000
-0.061609 -0.041560 0.000000
-0.061609 -0.043442 0.000000
-0.061609 -0.045100 0.000000
-0.061609 -0.046423 0.000000
-0.061609 -0.047299 0.000000
-0.061609 -0.047615 0.000000
0.023173 -0.039162 0.000000
0.023173 -0.039315 0.000000
0.061711 -0.043214 0.000000
0.061711 -0.046111 0.000000
0.061711 -0.048846 0.000000
-0.032907 -0.053764 0.000000
0.061711 -0.051255 0.000000
0.061711 -0.053178 0.000000
0.061711 -0.054450 0.000000
-0.049771 -0.062708 0.000000
-0.040614 -0.053764 0.000000
-0.023071 -0.054910 0.000000
0.061711 -0.054910 0.000000
-0.023142 -0.055968 0.000000
-0.022161 -0.054910 0.000000
-0.019646 -0.054910 0.000000
-0.015846 -0.054910 0.000000
-0.011082 -0.054910 0.000000
-0.005676 -0.054910 0.000000
0.000051 -0.054910 0.000000
0.005778 -0.054910 0.000000
0.011184 -0.054910 0.000000
0.015948 -0.054910 0.000000
0.019748 -0.054910 0.000000
0.022263 -0.054910 0.000000
0.023173 -0.054910 0.000000
0.023244 -0.055968 0.000000
0.061640 -0.055968 0.000000
-0.023347 -0.056983 0.000000
0.023449 -0.056983 0.000000
0.061435 -0.056983 0.000000
-0.023677 -0.057945 0.000000
0.023779 -0.057945 0.000000
0.061105 -0.057945 0.000000
-0.024124 -0.058846 0.000000
0.024226 -0.058846 0.000000
0.060658 -0.058846 0.000000
-0.024678 -0.059675 0.000000
0.024780 -0.059675 0.000000
0.060105 -0.059675 0.000000
-0.025329 -0.060424 0.000000
0.025431 -0.060424 0.000000
0.059453 -0.060424 0.000000
-0.026070 -0.061083 0.000000
0.026171 -0.061083 0.000000
0.058713 -0.061083 0.000000
-0.026889 -0.061643 0.000000
0.026991 -0.061643 0.000000
0.057893 -0.061643 0.000000
-0.027779 -0.062095 0.000000
0.027881 -0.062095 0.000000
0.057003 -0.062095 0.000000
-0.028730 -0.062429 0.000000
0.028832 -0.062429 0.000000
0.056052 -0.062429 0.000000
-0.029733 -0.062637 0.000000
0.029835 -0.062637 0.000000
0.055049 -0.062637 0.000000
-0.030779 -0.062708 0.000000
0.030881 -0.062708 0.000000
0.054003 -0.062708 0.000000
0.031336 -0.062708 0.000000
0.032594 -0.062708 0.000000
0.034494 -0.062708 0.000000
0.036876 -0.062708 0.000000
0.039579 -0.062708 0.000000
0.042442 -0.062708 0.000000
0.045306 -0.062708 0.000000
0.048009 -0.062708 0.000000
0.050390 -0.062708 0.000000
0.052291 -0.062708 0.000000
0.053548 -0.062708 0.000000
-0.071576 -0.061008 0.000000
0.073069 0.060167 0.000000
0.064126 0.071586 0.000000
-0.062632 -0.072426 0.000000
3 0 1 2
3 0 3 1
3 0 4 3
3 0 5 4
3 0 6 5
3 0 7 6
3 0 8 7
3 0 9 8
3 0 10 9
3 0 11 10
3 0 12 11
3 0 13 12
3 0 14 13
3 15 16 17
3 15 18 16
3 19 14 0
3 19 20 14
3 21 18 15
3 22 20 19
3 22 23 20
3 24 18 21
3 25 23 22
3 25 26 23
3 27 18 24
3 28 26 25
3 28 29 26
3 30 18 27
3 31 29 28
3 31 32 29
3 33 18 30
3 34 32 31
3 34 35 32
3 36 18 33
3 37 35 34
3 37 38 35
3 39 18 36
3 40 38 37
3 40 41 38
3 42 18 39
3 43 41 40
3 43 44 41
3 45 18 42
3 46 44 43
3 46 47 44
3 48 18 45
3 49 47 46
3 49 50 47
3 51 18 48
3 52 50 49
3 52 53 50
3 52 54 53
3 52 55 54
3 52 56 55
3 52 57 56
3 52 58 57
3 52 59 58
3 52 60 59
3 52 61 60
3 52 62 61
3 52 63 62
3 52 51 63
3 52 18 51
3 64 18 52
3 65 66 64
3 66 18 64
3 65 67 66
3 68 18 66
3 69 70 68
3 70 71 68
3 71 18 68
3 70 72 71
3 73 67 65
3 74 67 73
3 75 76 77
3 75 78 76
3 79 67 74
3 70 80 72
3 80 81 72
3 75 82 78
3 75 83 82
3 84 67 79
3 75 85 83
3 75 86 85
3 87 67 84
3 69 88 70
3 75 89 86
3 69 90 88
3 69 91 90
3 69 92 91
3 93 89 75
3 94 67 87
3 69 95 92
3 93 96 89
3 69 97 95
3 93 98 96
3 69 99 97
3 100 67 94
3 69 101 99
3 93 102 98
3 100 69 67
3 100 101 69
3 103 93 104
3 103 102 93
3 100 105 101
3 106 105 100
3 106 107 105
3 103 108 102
3 106 109 107
3 110 109 106
3 103 111 108
3 110 112 109
3 113 112 110
3 113 114 112
3 103 115 111
3 113 116 114
3 103 117 115
3 118 116 113
3 118 119 116
3 103 120 117
3 121 119 118
3 121 122 119
3 103 123 120
3 124 122 121
3 124 125 122
3 103 126 123
3 127 125 124
3 127 128 125
3 103 129 126
3 130 128 127
3 130 131 128
3 103 132 129
3 133 131 130
3 133 134 131
3 103 135 132
3 136 134 133
3 136 137 134
3 103 138 135
3 139 137 136
3 139 140 137
3 103 141 138
3 142 140 139
3 142 143 140
3 103 144 141
3 145 143 142
3 145 146 143
3 103 147 144
3 148 146 145
3 149 150 148
3 150 146 148
3 149 151 150
3 152 147 103
3 153 147 152
3 153 154 147
3 153 155 154
3 156 151 149
3 153 157 155
3 158 151 156
3 153 159 157
3 160 151 158
3 153 161 159
3 162 151 160
3 153 163 161
3 164 151 162
3 153 165 163
3 166 151 164
3 153 167 165
3 168 151 166
3 153 169 167
3 170 151 168
3 153 171 169
3 172 151 170
3 153 173 171
3 174 151 172
3 153 175 173
3 176 151 174
3 177 151 176
3 177 178 151
3 177 179 178
3 180 153 181
3 180 175 153
3 180 182 175
3 183 179 177
3 184 182 180
3 184 185 182
3 186 179 183
3 187 185 184
3 187 188 185
3 189 179 186
3 190 188 187
3 190 191 188
3 192 179 189
3 193 191 190
3 193 194 191
3 195 179 192
3 196 194 193
3 196 197 194
3 198 179 195
3 199 197 196
3 199 200 197
3 201 179 198
3 202 200 199
3 202 203 200
3 204 179 201
3 205 203 202
3 205 206 203
3 207 179 204
3 208 206 205
3 208 209 206
3 210 179 207
3 211 209 208
3 211 212 209
3 213 179 210
3 214 212 211
3 214 215 212
3 216 179 213
3 217 215 214
3 217 218 215
3 219 218 217
3 220 179 216
3 219 221 218
3 222 221 219
3 223 179 220
3 224 221 222
3 224 225 221
3 225 226 221
3 227 225 224
3 228 229 223
3 229 179 223
3 230 231 227
3 231 225 227
3 228 232 229
3 230 233 231
3 234 226 225
3 234 235 226
3 236 233 230
3 237 232 228
3 238 233 236
3 239 240 241
3 242 233 238
3 243 232 237
3 234 244 235
3 245 233 242
3 243 246 232
3 246 247 232
3 247 248 232
3 248 249 232
3 249 250 232
3 250 251 232
3 252 233 245
3 253 233 252
3 239 253 240
3 239 233 253
3 234 254 244
3 234 255 254
3 234 256 255
3 257 233 239
3 234 258 256
3 234 259 258
3 234 260 259
3 261 257 262
3 261 263 257
3 263 233 257
3 263 234 233
3 263 260 234
3 263 264 260
3 261 265 263
3 266 264 263
3 267 264 266
3 268 264 267
3 269 264 268
3 270 264 269
3 271 264 270
3 272 264 271
3 273 264 272
3 274 264 273
3 275 264 274
3 276 264 275
3 277 264 276
3 278 264 277
3 278 279 264
3 261 280 265
3 281 279 278
3 281 282 279
3 261 283 280
3 284 282 281
3 284 285 282
3 261 286 283
3 287 285 284
3 287 288 285
3 261 289 286
3 290 288 287
3 290 291 288
3 261 292 289
3 293 291 290
3 293 294 291
3 261 295 292
3 296 294 293
3 296 297 294
3 261 298 295
3 299 297 296
3 299 300 297
3 261 301 298
3 302 300 299
3 302 303 300
3 261 304 301
3 305 303 302
3 305 306 303
3 261 307 304
3 308 306 305
3 308 309 306
3 261 310 307
3 311 309 308
3 311 312 309
3 313 312 311
3 314 312 313
3 315 312 314
3 316 312 315
3 317 312 316
3 318 312 317
3 319 312 318
3 320 312 319
3 321 312 320
3 322 312 321
3 323 312 322
3 324 325 326
3 324 327 325

File diff suppressed because it is too large Load Diff

View File

@@ -9,11 +9,10 @@ in vec2 vertexUV;
uniform vec3 iResolution; // viewport image resolution (in pixels)
uniform mat4 iTransform; // image transformation
uniform vec4 color;
uniform vec4 uv;
// Image Shader
uniform sampler2D iChannel0; // input channel (texture id).
uniform sampler2D iChannel1; // input mask
uniform sampler2D iChannel0; // input channel (texture id).
uniform sampler2D iChannel1; // input mask
uniform float stipple;
void main()
@@ -28,11 +27,11 @@ void main()
// read mask intensity as average of RGB
float maskIntensity = dot(texture(iChannel1, vertexUV).rgb, vec3(1.0/3.0));
// alpha is a mix of texture alpha, vertex alpha, and uniform alpha affected by stippling
// alpha is a mix of texture, vertex, uniform and mask alpha, affected by stippling
float A = textureColor.a * vertexColor.a * color.a * maskIntensity;
A += textureColor.a * stipple * ( int(gl_FragCoord.x + gl_FragCoord.y) % 2 );
A = clamp(A, 0.0, 1.0);
// output RGBA
FragColor = vec4(RGB, clamp(A, 0.0, 1.0) );
// FragColor = texture(iChannel1, vertexUV);
// output RGB with Alpha pre-multiplied
FragColor = vec4(RGB * A, A);
}

View File

@@ -6,9 +6,9 @@ in vec4 vertexColor;
in vec2 vertexUV;
// from General Shader
uniform vec3 iResolution; // viewport resolution (in pixels)
uniform vec3 iResolution; // viewport image resolution (in pixels)
uniform mat4 iTransform; // image transformation
uniform vec4 color;
uniform vec4 uv;
// Image Shader
uniform sampler2D iChannel0; // input channel (texture id).
@@ -18,18 +18,19 @@ uniform float stipple;
void main()
{
// adjust UV
vec2 texcoord = vec2(uv.x, uv.y) + vertexUV * vec2(uv.z - uv.x, uv.w - uv.y);
vec4 texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0);
// color is a mix of texture (manipulated with brightness & contrast), vertex and uniform colors
vec4 textureColor = texture(iChannel0, texcoord);
// color texture
vec4 textureColor = texture(iChannel0, texcoord.xy);
vec3 RGB = textureColor.rgb * vertexColor.rgb * color.rgb;
// alpha is a mix of texture alpha, vertex alpha, and uniform alpha affected by stippling
float maskIntensity = dot(texture(iChannel1, vertexUV).rgb, vec3(1.0/3.0));
// alpha is a mix of texture, vertex, uniform and mask alpha
float A = textureColor.a * vertexColor.a * color.a;
float A = textureColor.a * vertexColor.a * color.a * maskIntensity;
A -= stipple * ( int(gl_FragCoord.x + gl_FragCoord.y) % 2 > 0 ? 0.05 : 0.95 );
// post-reversing premultiplication of alpha
float invA = 1.0 / clamp( A , 0.000001, 10.0);
// float invA = 1.0 / (A*A);
// output RGBA
FragColor = vec4(RGB, clamp(A, 0.0, 1.0) );
// output
FragColor = vec4( RGB * invA, A);
}

View File

@@ -326,8 +326,7 @@ void main(void)
float alpha = clamp(ma * color.a, 0.0, 1.0);
// read color & apply basic filterid
vec3 transformedRGB;
transformedRGB = apply_filter();
vec3 transformedRGB = apply_filter();
// chromakey
alpha -= mix( 0.0, 1.0 - alphachromakey( transformedRGB, chromakey.rgb, chromadelta), float(chromadelta > 0.0001) );
@@ -355,6 +354,7 @@ void main(void)
// luma key
alpha -= mix( 0.0, step( transformedHSL.z, lumakey ), float(lumakey > EPSILON));
alpha = clamp(alpha, 0.0, 1.0);
// level threshold
transformedHSL = mix( transformedHSL, vec3(0.0, 0.0, 0.95 - step( transformedHSL.z, threshold )), float(threshold > EPSILON));
@@ -366,7 +366,7 @@ void main(void)
transformedRGB = LevelsControl(transformedRGB, levels.x, gamma.rgb * gamma.a, levels.y, levels.z, levels.w);
// apply base color and alpha for final fragment color
FragColor = vec4(transformedRGB * vertexColor.rgb * color.rgb, clamp(alpha, 0.0, 1.0) );
FragColor = vec4(transformedRGB * vertexColor.rgb * color.rgb * alpha, alpha);
}

View File

@@ -33,6 +33,11 @@ float sdCircle( in vec2 p, in float b)
return ( length( p ) / b );
}
float sdElipse( in vec2 p, in float b)
{
return ( length( p ) / b );
}
const mat3 KERNEL = mat3( 0.0625, 0.125, 0.0625,
0.125, 0.25, 0.125,
0.0625, 0.125, 0.0625);

View File

@@ -7,11 +7,11 @@ in vec4 vertexColor;
uniform vec3 iResolution; // viewport resolution (in pixels)
uniform vec4 color; // drawing color
uniform vec4 uv;
void main()
{
FragColor = color * vertexColor;
vec4 c = color * vertexColor;
FragColor = vec4( c.r * c.a, c.g * c.a, c.b * c.a, c.a);
}
// RGBA 2 YUVA converter