From 6058ad34c490f505c4acffc30719c8abca165984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 13 Mar 2014 11:33:07 +0200 Subject: Support for rendering to image Task-number: QTRD-2869 Change-Id: I5182c182f15893e70129a95c3cfdd590ed4f0853 Note: Not to be merged until v1.0 is out Change-Id: I5182c182f15893e70129a95c3cfdd590ed4f0853 Reviewed-by: Miikka Heikkinen Reviewed-by: Mika Salmela --- .../engine/abstract3dcontroller.cpp | 6 +++ .../engine/abstract3dcontroller_p.h | 3 ++ src/datavisualization/engine/q3dscene.cpp | 1 - src/datavisualization/engine/q3dscene.h | 1 + src/datavisualization/engine/qabstract3dgraph.cpp | 63 +++++++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 5 +- src/datavisualization/engine/qabstract3dgraph_p.h | 4 ++ 7 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index ec18a850..63d66bc4 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -33,6 +33,7 @@ #include "q3dscene_p.h" #include "q3dscene.h" #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -767,6 +768,11 @@ void Abstract3DController::markSeriesVisualsDirty() emitNeedRender(); } +void Abstract3DController::requestRender(QOpenGLFramebufferObject *fbo) +{ + m_renderer->render(fbo->handle()); +} + void Abstract3DController::handleAxisTitleChanged(const QString &title) { Q_UNUSED(title) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 06be450e..c0a2fac2 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -212,6 +212,8 @@ public: void markDataDirty(); void markSeriesVisualsDirty(); + void requestRender(QOpenGLFramebufferObject *fbo); + void emitNeedRender(); virtual void clearSelection() = 0; @@ -279,6 +281,7 @@ private: QAbstract3DAxis **axisPtr); friend class Bars3DController; + friend class QAbstract3DGraphPrivate; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index be64b928..98f39cc9 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -554,7 +554,6 @@ void Q3DScenePrivate::setWindowSize(const QSize &size) m_windowSize = size; updateGLViewport(); m_changeTracker.windowSizeChanged = true; - m_sceneDirty = true; emit needRender(); } } diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h index d663744e..39c9791f 100644 --- a/src/datavisualization/engine/q3dscene.h +++ b/src/datavisualization/engine/q3dscene.h @@ -93,6 +93,7 @@ private: friend class AbstractDeclarative; friend class QAbstract3DGraph; + friend class QAbstract3DGraphPrivate; friend class Abstract3DController; friend class Q3DScenePrivate; friend class Abstract3DRenderer; diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index bde5b585..5afc1417 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -27,6 +27,8 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -357,6 +359,22 @@ void QAbstract3DGraph::clearSelection() d_ptr->m_visualController->clearSelection(); } +/*! + * Renders current frame to an image of \a imageSize. Default size is the window size. Image is + * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. + * + * \since Qt Data Visualization 1.1 + * + * \return rendered image. + */ +QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) +{ + QSize renderSize = imageSize; + if (renderSize.isEmpty()) + renderSize = size(); + return d_ptr->renderToImage(msaaSamples, renderSize); +} + /*! * \internal */ @@ -453,12 +471,17 @@ QAbstract3DGraphPrivate::QAbstract3DGraphPrivate(QAbstract3DGraph *q) q_ptr(q), m_updatePending(false), m_visualController(0), - m_devicePixelRatio(1.f) + m_devicePixelRatio(1.f), + m_offscreenSurface(0) { } QAbstract3DGraphPrivate::~QAbstract3DGraphPrivate() { + if (m_offscreenSurface) { + m_offscreenSurface->destroy(); + delete m_offscreenSurface; + } if (m_context) m_context->makeCurrent(q_ptr); @@ -526,4 +549,42 @@ void QAbstract3DGraphPrivate::renderNow() m_context->swapBuffers(q_ptr); } +QImage QAbstract3DGraphPrivate::renderToImage(int msaaSamples, const QSize &imageSize) +{ + QImage image; + QOpenGLFramebufferObject *fbo; + QOpenGLFramebufferObjectFormat fboFormat; + if (!m_offscreenSurface) { + // Create an offscreen surface for rendering to images without rendering on screen + m_offscreenSurface = new QOffscreenSurface(q_ptr->screen()); + m_offscreenSurface->setFormat(q_ptr->requestedFormat()); + m_offscreenSurface->create(); + } + // Render the wanted frame offscreen + m_context->makeCurrent(m_offscreenSurface); + fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fboFormat.setInternalTextureFormat(GL_RGB); + fboFormat.setSamples(msaaSamples); + fbo = new QOpenGLFramebufferObject(imageSize, fboFormat); + if (fbo->isValid()) { + QRect originalViewport = m_visualController->m_scene->viewport(); + m_visualController->m_scene->d_ptr->setWindowSize(imageSize); + m_visualController->m_scene->d_ptr->setViewport(QRect(0, 0, + imageSize.width(), + imageSize.height())); + m_visualController->synchDataToRenderer(); + fbo->bind(); + m_context->swapBuffers(m_offscreenSurface); + m_visualController->requestRender(fbo); + image = fbo->toImage(); + fbo->release(); + m_visualController->m_scene->d_ptr->setWindowSize(originalViewport.size()); + m_visualController->m_scene->d_ptr->setViewport(originalViewport); + } + delete fbo; + m_context->makeCurrent(q_ptr); + + return image; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 18eda7df..1109d7b0 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -42,7 +42,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(Q3DScene* scene READ scene) protected: - explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, QWindow *parent = 0); + explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, + QWindow *parent = 0); public: enum SelectionFlag { @@ -95,6 +96,8 @@ public: void clearSelection(); + QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); diff --git a/src/datavisualization/engine/qabstract3dgraph_p.h b/src/datavisualization/engine/qabstract3dgraph_p.h index d28495ab..8e571355 100644 --- a/src/datavisualization/engine/qabstract3dgraph_p.h +++ b/src/datavisualization/engine/qabstract3dgraph_p.h @@ -33,6 +33,7 @@ class QOpenGLContext; class QOpenGLPaintDevice; +class QOffscreenSurface; QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -52,6 +53,8 @@ public: void render(); + QImage renderToImage(int msaaSamples, const QSize &imageSize); + public slots: void renderLater(); void renderNow(); @@ -67,6 +70,7 @@ public: QOpenGLContext *m_context; Abstract3DController *m_visualController; float m_devicePixelRatio; + QOffscreenSurface *m_offscreenSurface; }; QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 41ebe7cc1281c5d4c3535154e10edad838e49270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 18 Mar 2014 09:49:55 +0200 Subject: Use GL_LINES for ES2 grid lines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2527 Change-Id: I08b9c740f6dfaf8107601cfc1e7e53db13bf8268 Note: Not to be merged until 1.0 is released Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/bars3drenderer.cpp | 61 ++++++++++----- src/datavisualization/engine/drawer.cpp | 40 +++++++++- src/datavisualization/engine/drawer_p.h | 2 + .../engine/meshes/backgroundNegatives.obj | 14 ++-- src/datavisualization/engine/scatter3drenderer.cpp | 67 +++++++++++----- src/datavisualization/engine/scatter3drenderer_p.h | 4 +- src/datavisualization/engine/surface3drenderer.cpp | 89 +++++++++++++++++----- src/datavisualization/engine/surface3drenderer_p.h | 4 +- .../global/datavisualizationglobal_p.h | 4 + 9 files changed, 215 insertions(+), 70 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index a7f9e2b3..ead825e4 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -338,7 +338,11 @@ void Bars3DRenderer::drawSlicedScene() // Draw grid lines if (m_cachedTheme->isGridEnabled()) { glDisable(GL_DEPTH_TEST); +#if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; +#else + ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES +#endif // Bind line shader lineShader->bind(); @@ -378,7 +382,11 @@ void Bars3DRenderer::drawSlicedScene() lineShader->setUniformValue(lineShader->MVP(), MVPMatrix); // Draw the object +#if !(defined QT_OPENGL_ES_2) m_drawer->drawObject(lineShader, m_gridLineObj); +#else + m_drawer->drawLine(lineShader); +#endif // Check if we have a line at zero position already if (gridPos == (barPosYAdjustment + zeroPosAdjustment)) @@ -386,6 +394,7 @@ void Bars3DRenderer::drawSlicedScene() gridPos += gridStep; } + // Draw a line at zero, if none exists if (!m_noZeroInRange && noZero) { QMatrix4x4 modelMatrix; @@ -400,10 +409,14 @@ void Bars3DRenderer::drawSlicedScene() itModelMatrix.inverted().transposed()); lineShader->setUniformValue(lineShader->MVP(), MVPMatrix); lineShader->setUniformValue(lineShader->color(), - Utils::vectorFromColor(m_cachedTheme->backgroundColor())); + Utils::vectorFromColor(m_cachedTheme->labelTextColor())); // Draw the object +#if !(defined QT_OPENGL_ES_2) m_drawer->drawObject(lineShader, m_gridLineObj); +#else + m_drawer->drawLine(lineShader); +#endif } } @@ -633,7 +646,7 @@ void Bars3DRenderer::drawSlicedScene() // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item.value())); + item.value())); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } @@ -658,7 +671,7 @@ void Bars3DRenderer::drawSlicedScene() // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item.value())); + item.value())); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } @@ -1073,7 +1086,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } // Draw bars - GLfloat adjustedLightStrength = m_cachedTheme->lightStrength() / 10.0f; GLfloat adjustedHighlightStrength = m_cachedTheme->highlightLightStrength() / 10.0f; @@ -1419,7 +1431,11 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Draw grid lines if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { +#if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; +#else + ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES +#endif QQuaternion lineRotation; // Bind bar shader @@ -1446,11 +1462,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_cachedTheme->lightStrength() / 2.5f); } - GLfloat yFloorLinePosition = 0.0f; + GLfloat yFloorLinePosition = gridLineOffset; if (m_yFlipped) - yFloorLinePosition -= gridLineOffset; - else - yFloorLinePosition += gridLineOffset; + yFloorLinePosition = -yFloorLinePosition; QVector3D gridLineScaler(rowScaleFactor, gridLineWidth, gridLineWidth); @@ -1488,15 +1502,19 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif } // Floor lines: columns +#if defined(QT_OPENGL_ES_2) + lineRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); +#endif gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, columnScaleFactor); for (GLfloat bar = 0.0f; bar <= m_cachedColumnCount; bar++) { QMatrix4x4 modelMatrix; @@ -1526,12 +1544,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif } if (m_axisCacheY.segmentCount() > 0) { @@ -1583,12 +1602,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif lineHeight += heightStep; } @@ -1632,12 +1652,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif lineHeight += heightStep; } } diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index 55a2c2a5..38c15a58 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -45,18 +45,27 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION // Vertex array buffer for point const GLfloat point_data[] = {0.0f, 0.0f, 0.0f}; +// Vertex array buffer for line +const GLfloat line_data[] = { + -1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, +}; + Drawer::Drawer(Q3DTheme *theme) : m_theme(theme), m_textureHelper(0), - m_pointbuffer(0) + m_pointbuffer(0), + m_linebuffer(0) { } Drawer::~Drawer() { delete m_textureHelper; - if (QOpenGLContext::currentContext()) + if (QOpenGLContext::currentContext()) { glDeleteBuffers(1, &m_pointbuffer); + glDeleteBuffers(1, &m_linebuffer); + } } void Drawer::initializeOpenGL() @@ -162,6 +171,8 @@ void Drawer::drawSurfaceGrid(ShaderHelper *shader, SurfaceObject *object) void Drawer::drawPoint(ShaderHelper *shader) { + // Draw a single point + // Generate vertex buffer for point if it does not exist if (!m_pointbuffer) { glGenBuffers(1, &m_pointbuffer); @@ -183,6 +194,31 @@ void Drawer::drawPoint(ShaderHelper *shader) glDisableVertexAttribArray(shader->posAtt()); } +void Drawer::drawLine(ShaderHelper *shader) +{ + // Draw a single line + + // Generate vertex buffer for line if it does not exist + if (!m_linebuffer) { + glGenBuffers(1, &m_linebuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_linebuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(line_data), line_data, GL_STATIC_DRAW); + } + + // 1st attribute buffer : vertices + glEnableVertexAttribArray(shader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, m_linebuffer); + glVertexAttribPointer(shader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + // Draw the line + glDrawArrays(GL_LINES, 0, 2); + + // Free buffers + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableVertexAttribArray(shader->posAtt()); +} + void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelItem, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, const QVector3D &positionComp, const QVector3D &rotation, diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index 8e98aa3a..5d10018e 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -76,6 +76,7 @@ public: GLuint depthTextureId = 0); void drawSurfaceGrid(ShaderHelper *shader, SurfaceObject *object); void drawPoint(ShaderHelper *shader); + void drawLine(ShaderHelper *shader); void drawLabel(const AbstractRenderItem &item, const LabelItem &labelItem, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, const QVector3D &positionComp, const QVector3D &rotation, GLfloat itemHeight, @@ -94,6 +95,7 @@ private: Q3DTheme *m_theme; TextureHelper *m_textureHelper; GLuint m_pointbuffer; + GLuint m_linebuffer; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/meshes/backgroundNegatives.obj b/src/datavisualization/engine/meshes/backgroundNegatives.obj index 76c7c1d8..d314e1fc 100644 --- a/src/datavisualization/engine/meshes/backgroundNegatives.obj +++ b/src/datavisualization/engine/meshes/backgroundNegatives.obj @@ -1,18 +1,18 @@ # Blender v2.66 (sub 0) OBJ File: 'backgroudNegativesWall.blend' # www.blender.org o Cube -v 0.999999 1.000000 1.000001 +v 1.000000 1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 v 1.000000 -3.000000 1.000000 v -1.000000 -3.000000 1.000000 v -1.000000 -3.000000 -1.000000 -vt 0.000100 0.000100 -vt 0.500000 0.000100 -vt 0.500000 0.999900 -vt 0.999900 0.000100 -vt 0.999900 0.999900 -vt 0.000100 0.999900 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 vn 0.000000 -0.000000 -1.000000 vn 1.000000 0.000000 0.000000 s off diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index de1a769a..38e48cc2 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -69,7 +69,9 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_backgroundShader(0), m_labelShader(0), m_backgroundObj(0), + #if !defined(QT_OPENGL_ES_2) m_gridLineObj(0), + #endif m_labelObj(0), m_bgrTexture(0), m_depthTexture(0), @@ -112,7 +114,9 @@ Scatter3DRenderer::~Scatter3DRenderer() delete m_backgroundShader; delete m_labelShader; delete m_backgroundObj; +#if !defined(QT_OPENGL_ES_2) delete m_gridLineObj; +#endif delete m_labelObj; } @@ -135,8 +139,10 @@ void Scatter3DRenderer::initializeOpenGL() // Init selection shader initSelectionShader(); +#if !defined(QT_OPENGL_ES_2) // Load grid line mesh loadGridLineMesh(); +#endif // Load label mesh loadLabelMesh(); @@ -848,7 +854,11 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #endif if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { +#if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; +#else + ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES +#endif // Bind line shader lineShader->bind(); @@ -942,12 +952,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos -= lineStep; } @@ -976,8 +987,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); +#if !defined(QT_OPENGL_ES_2) modelMatrix.rotate(lineYRotation); itModelMatrix.rotate(lineYRotation); +#else + modelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); + itModelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); +#endif MVPMatrix = projectionViewMatrix * modelMatrix; @@ -994,18 +1010,22 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos -= lineStep; } } // Columns (= X) if (m_axisCacheX.segmentCount() > 0) { +#if defined(QT_OPENGL_ES_2) + lineXRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); +#endif // Floor lines #ifndef USE_UNIFORM_SCALING GLfloat lineStep = aspectRatio * m_axisCacheX.subSegmentStep(); @@ -1051,12 +1071,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -1086,10 +1107,15 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); +#if !defined(QT_OPENGL_ES_2) if (m_zFlipped) { modelMatrix.rotate(180.0f, 1.0f, 0.0f, 0.0f); itModelMatrix.rotate(180.0f, 1.0f, 0.0f, 0.0f); } +#else + modelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); + itModelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); +#endif MVPMatrix = projectionViewMatrix * modelMatrix; @@ -1106,12 +1132,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } } @@ -1170,12 +1197,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -1228,12 +1256,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } } @@ -1604,6 +1633,7 @@ void Scatter3DRenderer::loadBackgroundMesh() m_backgroundObj->load(); } +#if !(defined QT_OPENGL_ES_2) void Scatter3DRenderer::loadGridLineMesh() { if (m_gridLineObj) @@ -1611,6 +1641,7 @@ void Scatter3DRenderer::loadGridLineMesh() m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); m_gridLineObj->load(); } +#endif void Scatter3DRenderer::loadLabelMesh() { diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 5591a362..b82ff4ae 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -68,7 +68,9 @@ private: ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; ObjectHelper *m_backgroundObj; +#if !(defined QT_OPENGL_ES_2) ObjectHelper *m_gridLineObj; +#endif ObjectHelper *m_labelObj; GLuint m_bgrTexture; GLuint m_depthTexture; @@ -121,13 +123,13 @@ private: void drawScene(GLuint defaultFboHandle); void loadBackgroundMesh(); - void loadGridLineMesh(); void loadLabelMesh(); void initSelectionShader(); void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader); void initLabelShaders(const QString &vertexShader, const QString &fragmentShader); void initSelectionBuffer(); #if !defined(QT_OPENGL_ES_2) + void loadGridLineMesh(); void initDepthShader(); void updateDepthBuffer(); #else diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 41415393..243c27de 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -72,7 +72,9 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_visibleColumnRange(0.0f), m_visibleRowRange(0.0f), m_backgroundObj(0), + #if !defined(QT_OPENGL_ES_2) m_gridLineObj(0), + #endif m_labelObj(0), m_depthTexture(0), m_depthModelTexture(0), @@ -133,7 +135,9 @@ Surface3DRenderer::~Surface3DRenderer() delete m_labelShader; delete m_backgroundObj; +#if !defined(QT_OPENGL_ES_2) delete m_gridLineObj; +#endif delete m_labelObj; foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { @@ -160,8 +164,10 @@ void Surface3DRenderer::initializeOpenGL() // Init selection shader initSelectionShaders(); +#if !(defined QT_OPENGL_ES_2) // Load grid line mesh loadGridLineMesh(); +#endif // Load label mesh loadLabelMesh(); @@ -415,7 +421,7 @@ void Surface3DRenderer::updateSliceDataModel(const QPoint &point) if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) { // Find axis coordinates for the selected point SurfaceSeriesRenderCache *selectedCache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + m_renderCacheList.value(const_cast(m_selectedSeries)); QSurfaceDataArray &dataArray = selectedCache->dataArray(); QSurfaceDataItem item = dataArray.at(point.x())->at(point.y()); QPointF coords(item.x(), item.z()); @@ -536,7 +542,7 @@ void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const int row = point.x(); if ((m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow) && row == -1) || - (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn) && column == -1)) { + (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn) && column == -1)) { cache->sliceSurfaceObject()->clear(); return; } @@ -847,7 +853,11 @@ void Surface3DRenderer::drawSlicedScene() // Grid lines if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { +#if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; +#else + ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES +#endif // Bind line shader lineShader->bind(); @@ -888,7 +898,11 @@ void Surface3DRenderer::drawSlicedScene() lineShader->setUniformValue(lineShader->MVP(), MVPMatrix); // Draw the object +#if !(defined QT_OPENGL_ES_2) m_drawer->drawObject(lineShader, m_gridLineObj); +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -918,6 +932,10 @@ void Surface3DRenderer::drawSlicedScene() modelMatrix.translate(linePos, 0.0f, -sliceZScale); modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); +#if (defined QT_OPENGL_ES_2) + modelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); + itModelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); +#endif MVPMatrix = projectionViewMatrix * modelMatrix; @@ -928,7 +946,11 @@ void Surface3DRenderer::drawSlicedScene() lineShader->setUniformValue(lineShader->MVP(), MVPMatrix); // Draw the object +#if !(defined QT_OPENGL_ES_2) m_drawer->drawObject(lineShader, m_gridLineObj); +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -1436,7 +1458,11 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QVector3D gridLineScaleY(gridLineWidth, backgroundMargin, gridLineWidth); if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { +#if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; +#else + ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES +#endif // Bind line shader lineShader->bind(); @@ -1514,12 +1540,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos -= lineStep; } @@ -1540,8 +1567,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); +#if !defined(QT_OPENGL_ES_2) modelMatrix.rotate(lineYRotation); itModelMatrix.rotate(lineYRotation); +#else + modelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); + itModelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); +#endif MVPMatrix = projectionViewMatrix * modelMatrix; @@ -1558,18 +1590,22 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos -= lineStep; } } // Columns (= X) if (m_axisCacheX.segmentCount() > 0) { +#if defined(QT_OPENGL_ES_2) + lineXRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); +#endif // Floor lines GLfloat lineStep = -2.0f * aspectRatio * m_axisCacheX.subSegmentStep() / m_scaleFactor; GLfloat linePos = m_scaleX; @@ -1603,12 +1639,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -1629,10 +1666,15 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); +#if !defined(QT_OPENGL_ES_2) if (m_zFlipped) { modelMatrix.rotate(180.0f, 1.0f, 0.0f, 0.0f); itModelMatrix.rotate(180.0f, 1.0f, 0.0f, 0.0f); } +#else + modelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); + itModelMatrix.rotate(90.0f, 0.0f, 0.0f, 1.0f); +#endif MVPMatrix = projectionViewMatrix * modelMatrix; @@ -1649,12 +1691,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } } @@ -1701,12 +1744,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } @@ -1746,12 +1790,13 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->setUniformValue(lineShader->depth(), depthMVPMatrix); // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj, 0, m_depthTexture); - } else -#endif - { + } else { // Draw the object m_drawer->drawObject(lineShader, m_gridLineObj); } +#else + m_drawer->drawLine(lineShader); +#endif linePos += lineStep; } } @@ -2129,6 +2174,7 @@ void Surface3DRenderer::loadBackgroundMesh() m_backgroundObj->load(); } +#if !(defined QT_OPENGL_ES_2) void Surface3DRenderer::loadGridLineMesh() { if (m_gridLineObj) @@ -2136,6 +2182,7 @@ void Surface3DRenderer::loadGridLineMesh() m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); m_gridLineObj->load(); } +#endif void Surface3DRenderer::surfacePointSelected(const QPoint &point) { @@ -2147,7 +2194,7 @@ void Surface3DRenderer::surfacePointSelected(const QPoint &point) if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) { // Find axis coordinates for the selected point SurfaceSeriesRenderCache *selectedCache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + m_renderCacheList.value(const_cast(m_selectedSeries)); QSurfaceDataArray &dataArray = selectedCache->dataArray(); QSurfaceDataItem item = dataArray.at(point.x())->at(point.y()); QPointF coords(item.x(), item.z()); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 2c55d902..5d93ee4a 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -74,7 +74,9 @@ private: GLfloat m_visibleColumnRange; GLfloat m_visibleRowRange; ObjectHelper *m_backgroundObj; +#if !(defined QT_OPENGL_ES_2) ObjectHelper *m_gridLineObj; +#endif ObjectHelper *m_labelObj; GLuint m_depthTexture; GLuint m_depthModelTexture; @@ -138,7 +140,6 @@ private: void initShaders(const QString &vertexShader, const QString &fragmentShader); QRect calculateSampleRect(SurfaceSeriesRenderCache *cache, const QSurfaceDataArray &array); void loadBackgroundMesh(); - void loadGridLineMesh(); void loadLabelMesh(); void drawScene(GLuint defaultFboHandle); void calculateSceneScalingFactors(); @@ -157,6 +158,7 @@ private: QPoint selectionIdToSurfacePoint(uint id); QString createSelectionLabel(SurfaceSeriesRenderCache *cache, float value, int column, int row); #if !defined(QT_OPENGL_ES_2) + void loadGridLineMesh(); void updateDepthBuffer(); #endif void emitSelectedPointChanged(QPoint position); diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h index e448c1cb..71dc8a93 100644 --- a/src/datavisualization/global/datavisualizationglobal_p.h +++ b/src/datavisualization/global/datavisualizationglobal_p.h @@ -43,7 +43,11 @@ static const GLfloat cameraDistance = 6.0f; // Size of font to be used in label texture rendering. Doesn't affect the actual font size. static const int textureFontSize = 50; static const GLfloat defaultRatio = 1.0f / 1.6f; // default aspect ratio 16:10 +#if !(defined QT_OPENGL_ES) static const float gridLineOffset = 0.0001f; // Offset for lifting grid lines off background +#else +static const float gridLineOffset = 0.0035f; // Offset for lifting grid lines off background +#endif // Default light position. To have shadows working correctly, light should be as far as camera, or a bit further // y position is added to the minimum height (or can be thought to be that much above or below the camera) static const QVector3D defaultLightPos = QVector3D(0.0f, 0.5f, 0.0f); -- cgit v1.2.3 From b6621d5651e2f8c8ed4ab4a99d15a36823ac897c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 24 Mar 2014 09:31:07 +0200 Subject: User-defined mesh glimmer fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2648 Change-Id: Ibde745807609dab069d93e7cc9b4d4d547fff6f1 Change-Id: Ibde745807609dab069d93e7cc9b4d4d547fff6f1 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/bars3drenderer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index ead825e4..3a685c91 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1086,6 +1086,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } // Draw bars + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(0.5f, 1.0f); + GLfloat adjustedLightStrength = m_cachedTheme->lightStrength() / 10.0f; GLfloat adjustedHighlightStrength = m_cachedTheme->highlightLightStrength() / 10.0f; @@ -1315,6 +1318,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } seriesPos += m_seriesStep; } + glDisable(GL_POLYGON_OFFSET_FILL); // Bind background shader m_backgroundShader->bind(); -- cgit v1.2.3 From ba812351a1577163a1c9794b667f2b4e3acb9373 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 12 Mar 2014 09:25:51 +0200 Subject: Introduce value axis formatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently only used for label formatting. Also some other preparatory changes for logaxis. Task-number: QTRD-2787 Note: Not to be merged until 1.0 is released Change-Id: I2d7ab70b9c51677d0edd5b0226fb779c9e346286 Reviewed-by: Tomi Korpipää --- src/datavisualization/axis/axis.pri | 7 +- src/datavisualization/axis/qabstract3daxis.cpp | 85 ++-- src/datavisualization/axis/qabstract3daxis_p.h | 5 +- src/datavisualization/axis/qcategory3daxis.cpp | 17 +- src/datavisualization/axis/qcategory3daxis_p.h | 5 + src/datavisualization/axis/qvalue3daxis.cpp | 63 ++- src/datavisualization/axis/qvalue3daxis.h | 7 + src/datavisualization/axis/qvalue3daxis_p.h | 8 + .../axis/qvalue3daxisformatter.cpp | 447 +++++++++++++++++++++ src/datavisualization/axis/qvalue3daxisformatter.h | 81 ++++ .../axis/qvalue3daxisformatter_p.h | 85 ++++ .../engine/abstract3dcontroller.cpp | 50 ++- .../engine/abstract3dcontroller_p.h | 12 +- .../engine/abstract3drenderer.cpp | 13 + .../engine/abstract3drenderer_p.h | 23 +- src/datavisualization/engine/axisrendercache.cpp | 4 + src/datavisualization/engine/axisrendercache_p.h | 16 +- src/datavisualization/engine/bars3dcontroller.cpp | 1 - tests/barstest/chart.cpp | 14 + tests/barstest/chart.h | 1 + tests/barstest/main.cpp | 7 + 21 files changed, 882 insertions(+), 69 deletions(-) create mode 100644 src/datavisualization/axis/qvalue3daxisformatter.cpp create mode 100644 src/datavisualization/axis/qvalue3daxisformatter.h create mode 100644 src/datavisualization/axis/qvalue3daxisformatter_p.h diff --git a/src/datavisualization/axis/axis.pri b/src/datavisualization/axis/axis.pri index 2c8bf70e..24463d1e 100644 --- a/src/datavisualization/axis/axis.pri +++ b/src/datavisualization/axis/axis.pri @@ -4,9 +4,12 @@ HEADERS += \ $$PWD/qvalue3daxis.h \ $$PWD/qvalue3daxis_p.h \ $$PWD/qcategory3daxis.h \ - $$PWD/qcategory3daxis_p.h + $$PWD/qcategory3daxis_p.h \ + $$PWD/qvalue3daxisformatter.h \ + $$PWD/qvalue3daxisformatter_p.h SOURCES += \ $$PWD/qabstract3daxis.cpp \ $$PWD/qvalue3daxis.cpp \ - $$PWD/qcategory3daxis.cpp + $$PWD/qcategory3daxis.cpp \ + $$PWD/qvalue3daxisformatter.cpp diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index 3a327caa..e01f980c 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -265,9 +265,7 @@ QAbstract3DAxisPrivate::QAbstract3DAxisPrivate(QAbstract3DAxis *q, QAbstract3DAx m_isDefaultAxis(false), m_min(0.0f), m_max(10.0f), - m_autoAdjust(true), - m_onlyPositiveValues(false), - m_allowMinMaxSame(false) + m_autoAdjust(true) { } @@ -293,14 +291,25 @@ void QAbstract3DAxisPrivate::updateLabels() void QAbstract3DAxisPrivate::setRange(float min, float max) { bool adjusted = false; - if (m_onlyPositiveValues) { - if (min < 0.0f) { - min = 0.0f; - adjusted = true; - } - if (max < 0.0f) { - max = 0.0f; - adjusted = true; + if (!allowNegatives()) { + if (allowZero()) { + if (min < 0.0f) { + min = 0.0f; + adjusted = true; + } + if (max < 0.0f) { + max = 0.0f; + adjusted = true; + } + } else { + if (min <= 0.0f) { + min = 1.0f; + adjusted = true; + } + if (max <= 0.0f) { + max = 1.0f; + adjusted = true; + } } } // If min >= max, we adjust ranges so that @@ -312,8 +321,8 @@ void QAbstract3DAxisPrivate::setRange(float min, float max) m_min = min; minDirty = true; } - if (m_max != max || min > max || (!m_allowMinMaxSame && min == max)) { - if (min > max || (!m_allowMinMaxSame && min == max)) { + if (m_max != max || min > max || (!allowMinMaxSame() && min == max)) { + if (min > max || (!allowMinMaxSame() && min == max)) { m_max = min + 1.0f; adjusted = true; } else { @@ -339,17 +348,25 @@ void QAbstract3DAxisPrivate::setRange(float min, float max) void QAbstract3DAxisPrivate::setMin(float min) { - if (m_onlyPositiveValues) { - if (min < 0.0f) { - min = 0.0f; - qWarning() << "Warning: Tried to set negative minimum for an axis that only supports" - " positive values:" << min; + if (!allowNegatives()) { + if (allowZero()) { + if (min < 0.0f) { + min = 0.0f; + qWarning() << "Warning: Tried to set negative minimum for an axis that only" + "supports positive values and zero:" << min; + } + } else { + if (min <= 0.0f) { + min = 1.0f; + qWarning() << "Warning: Tried to set negative or zero minimum for an axis that only" + "supports positive values:" << min; + } } } if (m_min != min) { bool maxChanged = false; - if (min > m_max || (!m_allowMinMaxSame && min == m_max)) { + if (min > m_max || (!allowMinMaxSame() && min == m_max)) { float oldMax = m_max; m_max = min + 1.0f; qWarning() << "Warning: Tried to set minimum to equal or larger than maximum for" @@ -368,22 +385,34 @@ void QAbstract3DAxisPrivate::setMin(float min) void QAbstract3DAxisPrivate::setMax(float max) { - if (m_onlyPositiveValues) { - if (max < 0.0f) { - max = 0.0f; - qWarning() << "Warning: Tried to set negative maximum for an axis that only supports" - " positive values:" << max; + if (!allowNegatives()) { + if (allowZero()) { + if (max < 0.0f) { + max = 0.0f; + qWarning() << "Warning: Tried to set negative maximum for an axis that only" + "supports positive values and zero:" << max; + } + } else { + if (max <= 0.0f) { + max = 1.0f; + qWarning() << "Warning: Tried to set negative or zero maximum for an axis that only" + "supports positive values:" << max; + } } } if (m_max != max) { bool minChanged = false; - if (m_min > max || (!m_allowMinMaxSame && m_min == max)) { + if (m_min > max || (!allowMinMaxSame() && m_min == max)) { float oldMin = m_min; m_min = max - 1.0f; - if (m_onlyPositiveValues && m_min < 0.0f) { - m_min = 0.0f; - if (!m_allowMinMaxSame && max == 0.0f) { + if (!allowNegatives() && m_min < 0.0f) { + if (allowZero()) { + m_min = 0.0f; + } else { + m_min = max / 2.0f; // Need some positive value smaller than max + } + if (!allowMinMaxSame() && max == 0.0f) { m_min = oldMin; qWarning() << "Unable to set maximum value to zero."; return; diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h index 4eb8de68..80f8f0b2 100644 --- a/src/datavisualization/axis/qabstract3daxis_p.h +++ b/src/datavisualization/axis/qabstract3daxis_p.h @@ -53,6 +53,9 @@ public: protected: virtual void updateLabels(); + virtual bool allowZero() = 0; + virtual bool allowNegatives() = 0; + virtual bool allowMinMaxSame() = 0; QAbstract3DAxis *q_ptr; @@ -64,8 +67,6 @@ protected: float m_min; float m_max; bool m_autoAdjust; - bool m_onlyPositiveValues; - bool m_allowMinMaxSame; friend class QAbstract3DAxis; friend class QValue3DAxis; diff --git a/src/datavisualization/axis/qcategory3daxis.cpp b/src/datavisualization/axis/qcategory3daxis.cpp index c11a65eb..d4152c90 100644 --- a/src/datavisualization/axis/qcategory3daxis.cpp +++ b/src/datavisualization/axis/qcategory3daxis.cpp @@ -121,8 +121,6 @@ QCategory3DAxisPrivate::QCategory3DAxisPrivate(QCategory3DAxis *q) : QAbstract3DAxisPrivate(q, QAbstract3DAxis::AxisTypeCategory), m_labelsExplicitlySet(false) { - m_onlyPositiveValues = true; - m_allowMinMaxSame = true; } QCategory3DAxisPrivate::~QCategory3DAxisPrivate() @@ -142,6 +140,21 @@ void QCategory3DAxisPrivate::setDataLabels(const QStringList &labels) } } +bool QCategory3DAxisPrivate::allowZero() +{ + return true; +} + +bool QCategory3DAxisPrivate::allowNegatives() +{ + return false; +} + +bool QCategory3DAxisPrivate::allowMinMaxSame() +{ + return true; +} + QCategory3DAxis *QCategory3DAxisPrivate::qptr() { return static_cast(q_ptr); diff --git a/src/datavisualization/axis/qcategory3daxis_p.h b/src/datavisualization/axis/qcategory3daxis_p.h index 1ba5ccb0..0f590ece 100644 --- a/src/datavisualization/axis/qcategory3daxis_p.h +++ b/src/datavisualization/axis/qcategory3daxis_p.h @@ -45,6 +45,11 @@ public: void setDataLabels(const QStringList &labels); +protected: + virtual bool allowZero(); + virtual bool allowNegatives(); + virtual bool allowMinMaxSame(); + private: QCategory3DAxis *qptr(); diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 0d53291d..e93f440f 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -18,7 +18,7 @@ #include "qvalue3daxis.h" #include "qvalue3daxis_p.h" -#include "utils_p.h" +#include "qvalue3daxisformatter_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -79,6 +79,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION QValue3DAxis::QValue3DAxis(QObject *parent) : QAbstract3DAxis(new QValue3DAxisPrivate(this), parent) { + setFormatter(new QValue3DAxisFormatter); } /*! @@ -88,7 +89,6 @@ QValue3DAxis::~QValue3DAxis() { } - /*! * \property QValue3DAxis::segmentCount * @@ -168,6 +168,31 @@ QString QValue3DAxis::labelFormat() const return dptrc()->m_labelFormat; } +/*! + * \property QValue3DAxis::formatter + * + * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter + * is set. + */ +void QValue3DAxis::setFormatter(QValue3DAxisFormatter *formatter) +{ + Q_ASSERT(formatter); + + if (formatter != dptr()->m_formatter) { + delete dptr()->m_formatter; + dptr()->m_formatter = formatter; + formatter->setParent(this); + formatter->d_ptr->setAxis(this); + emit formatterChanged(formatter); + emit dptr()->formatterDirty(); + } +} + +QValue3DAxisFormatter *QValue3DAxis::formatter() const +{ + return dptrc()->m_formatter; +} + /*! * \internal */ @@ -189,7 +214,8 @@ QValue3DAxisPrivate::QValue3DAxisPrivate(QValue3DAxis *q) m_segmentCount(5), m_subSegmentCount(1), m_labelFormat(Utils::defaultLabelFormat()), - m_labelsDirty(true) + m_labelsDirty(true), + m_formatter(0) { } @@ -243,25 +269,30 @@ void QValue3DAxisPrivate::updateLabels() QStringList newLabels; newLabels.reserve(m_segmentCount + 1); - // First label is at axis min, which is an extra segment - float segmentStep = (m_max - m_min) / m_segmentCount; - - QString formatString(m_labelFormat); - Utils::ParamType paramType = Utils::findFormatParamType(formatString); - QByteArray formatArray = formatString.toUtf8(); - - for (int i = 0; i < m_segmentCount; i++) { - float value = m_min + (segmentStep * i); - newLabels.append(Utils::formatLabel(formatArray, paramType, value)); + for (int i = 0; i <= m_segmentCount; i++) { + float value = m_formatter->valueAt(m_formatter->gridPosition(i)); + newLabels.append(m_formatter->stringForValue(value, m_labelFormat)); } - // Ensure max label doesn't suffer from any rounding errors - newLabels.append(Utils::formatLabel(formatArray, paramType, m_max)); - if (m_labels != newLabels) m_labels = newLabels; } +bool QValue3DAxisPrivate::allowZero() +{ + return m_formatter->allowZero(); +} + +bool QValue3DAxisPrivate::allowNegatives() +{ + return m_formatter->allowNegatives(); +} + +bool QValue3DAxisPrivate::allowMinMaxSame() +{ + return false; +} + QValue3DAxis *QValue3DAxisPrivate::qptr() { return static_cast(q_ptr); diff --git a/src/datavisualization/axis/qvalue3daxis.h b/src/datavisualization/axis/qvalue3daxis.h index f0af759b..c5982f33 100644 --- a/src/datavisualization/axis/qvalue3daxis.h +++ b/src/datavisualization/axis/qvalue3daxis.h @@ -20,6 +20,7 @@ #define QVALUE3DAXIS_H #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -31,6 +32,7 @@ class QT_DATAVISUALIZATION_EXPORT QValue3DAxis : public QAbstract3DAxis Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged) Q_PROPERTY(int subSegmentCount READ subSegmentCount WRITE setSubSegmentCount NOTIFY subSegmentCountChanged) Q_PROPERTY(QString labelFormat READ labelFormat WRITE setLabelFormat NOTIFY labelFormatChanged) + Q_PROPERTY(QValue3DAxisFormatter* formatter READ formatter WRITE setFormatter NOTIFY formatterChanged REVISION 1) public: explicit QValue3DAxis(QObject *parent = 0); @@ -45,10 +47,14 @@ public: void setLabelFormat(const QString &format); QString labelFormat() const; + void setFormatter(QValue3DAxisFormatter *formatter); + QValue3DAxisFormatter *formatter() const; + signals: void segmentCountChanged(int count); void subSegmentCountChanged(int count); void labelFormatChanged(const QString &format); + void formatterChanged(QValue3DAxisFormatter *formatter); protected: QValue3DAxisPrivate *dptr(); @@ -59,6 +65,7 @@ private: friend class Bars3DController; friend class Scatter3DController; friend class Surface3DController; + friend class QValue3DAxisFormatter; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index 21fd78ab..c198db75 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -46,14 +46,22 @@ public: virtual void setMin(float min); virtual void setMax (float max); +signals: + void formatterDirty(); + protected: void emitLabelsChanged(); virtual void updateLabels(); + virtual bool allowZero(); + virtual bool allowNegatives(); + virtual bool allowMinMaxSame(); + int m_segmentCount; int m_subSegmentCount; QString m_labelFormat; bool m_labelsDirty; + QValue3DAxisFormatter *m_formatter; private: QValue3DAxis *qptr(); diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp new file mode 100644 index 00000000..5f943bd3 --- /dev/null +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -0,0 +1,447 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "qvalue3daxisformatter_p.h" +#include "qvalue3daxis_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +/*! + * \class QValue3DAxisFormatter + * \inmodule QtDataVisualization + * \brief QValue3DAxisFormatter is base class for value axis formatters. + * \since Qt Data Visualization 1.1 + * + * This class provides formatting rules for a linear QValue3DAxis. Subclass it if you + * want to implement custom value axes. + * + * \sa QLog3DAxisFormatter + */ + +/*! + * \qmltype ValueAxis3DFormatter + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.0 + * \ingroup datavisualization_qml + * \instantiates QValue3DAxisFormatter + * \brief ValueAxis3DFormatter is base type for value axis formatters. + * + * This type provides formatting rules for a linear ValueAxis3D. + * This type is the default type for ValueAxis3D and thus never needs to be explicitly created. + */ + +/*! + * \internal + */ +QValue3DAxisFormatter::QValue3DAxisFormatter(QValue3DAxisFormatterPrivate *d, QObject *parent) : + QObject(parent), + d_ptr(d) +{ +} + +/*! + * Constructs a new QValue3DAxisFormatter instance with optional \a parent. + */ +QValue3DAxisFormatter::QValue3DAxisFormatter(QObject *parent) : + QObject(parent), + d_ptr(new QValue3DAxisFormatterPrivate(this)) +{ +} + +/*! + * Destroys QValue3DAxisFormatter. + */ +QValue3DAxisFormatter::~QValue3DAxisFormatter() +{ +} + +/*! + * \return \c true if negative values are valid values for parent axis. + * The default implementation always returns true. + */ +bool QValue3DAxisFormatter::allowNegatives() const +{ + return true; +} + +/*! + * \return \c true if zero is a valid value for parent axis. + * The default implementation always returns true. + */ +bool QValue3DAxisFormatter::allowZero() const +{ + return true; +} + +/*! + * \return the normalized position along the axis for the grid line indicated by the \a index. + * The total amount of grid lines is equal to segment count plus one. The returned value should be + * between -1.0 (for minimum value) and 1.0 (for maximum value), inclusive. + * The grid line at the index zero corresponds to the minimum value of the axis. + * This value is used to position the segment grid lines when the graph is rendered. + * + * \sa doRecalculate(), gridPositions() + */ +float QValue3DAxisFormatter::gridPosition(int index) +{ + d_ptr->recalculate(); + + Q_ASSERT(d_ptr->m_gridPositions.size() > index); + + return d_ptr->m_gridPositions.at(index); +} + +/*! + * \return the normalized position along the axis for a subsegment grid line of a segment. + * The \a subGridIndex and \a segmentIndex specify the desired subgrid line. + * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive. + * The amount of subgrid lines per segment is equal to subsegment count minus one. + * This value is used to position the subsegment grid lines when the graph is rendered. + * + * \sa doRecalculate(), subGridPositions() + */ +float QValue3DAxisFormatter::subGridPosition(int subGridIndex, int segmentIndex) +{ + d_ptr->recalculate(); + + Q_ASSERT(d_ptr->m_subGridPositions.size() > subGridIndex); + Q_ASSERT(d_ptr->m_subGridPositions.at(0).size() > segmentIndex); + + return d_ptr->m_subGridPositions.at(segmentIndex).at(subGridIndex); +} + +/*! + * \return the normalized position along the axis for given label \a index. + * The total amount of labels is equal to segment count plus one. The label \a index zero + * corresponds to the minimum value of the axis. + * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive. This value is used to position the axis labels when the graph is rendered. + * + * \sa doRecalculate(), labelPositions() + */ +float QValue3DAxisFormatter::labelPosition(int index) +{ + d_ptr->recalculate(); + + Q_ASSERT(d_ptr->m_labelPositions.size() > index); + + return d_ptr->m_labelPositions.at(index); +} + +/*! + * This method can be used to convert a value to a string using formatter specific formatting + * rules supported by the labelFormat property of the parent axis. + * + * \return the formatted label string using \a value and \a format. + * + * \sa doRecalculate(), doStringForValue(), QValue3DAxis::labelFormat + */ +QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) +{ + d_ptr->recalculate(); + return doStringForValue(value, format); +} + +/*! + * \return the normalized position along the axis for the given \a value. + * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive. This value is used to position the items when the graph is rendered. + * + * \sa doRecalculate(), doPositionAt() + */ +float QValue3DAxisFormatter::positionAt(float value) +{ + d_ptr->recalculate(); + return doPositionAt(value); +} + +/*! + * \return the value at the normalized \a position along the axis. + * The \a position value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive. + * + * \sa doRecalculate(), doValueAt() + */ +float QValue3DAxisFormatter::valueAt(float position) +{ + d_ptr->recalculate(); + return doValueAt(position); +} + +/*! + * Creates a new empty instance of this formatter. Must be reimplemented in a subclass. + * + * \return the new instance. The renderer uses this method to cache a copy of the + * the formatter. The ownership of the new copy transfers to the caller. + */ +QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() +{ + return new QValue3DAxisFormatter(); +} + +/*! + * Populates the \a copy with the values of this formatter. + * + * \sa doPopulateCopy() + */ +void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) +{ + d_ptr->recalculate(); + doPopulateCopy(copy); +} + +/*! + * Marks this formatter dirty, prompting the renderer to make a new copy of its cache on the next + * renderer synchronization. Recalculation is also triggered on next access to the values. + * This method should be called by a subclass whenever the formatter + * is changed in a way that affects the resolved values. + */ +void QValue3DAxisFormatter::markDirty() +{ + d_ptr->m_needsRecalculate = true; + if (d_ptr->m_axis) + emit d_ptr->m_axis->dptr()->formatterDirty(); +} + +/*! + * \return the parent axis. The parent axis must only be accessed in doRecalculate() + * method to maintain thread safety in environments using a threaded renderer. + * + * \sa doRecalculate() + */ +QValue3DAxis *QValue3DAxisFormatter::axis() const +{ + return d_ptr->m_axis; +} + +/*! + * This method populates the label and grid line position arrays, as well as calculates + * any values needed for mapping between value and position. It is allowed to access + * the parent axis from inside this function. + * + * This method must be reimplemented in a subclass. + * + * \sa gridPositions(), subGridPositions(), labelPositions(), axis() + */ +void QValue3DAxisFormatter::doRecalculate() +{ + d_ptr->doRecalculate(); +} + +/*! + * Reimplement this method in a subclass to resolve the formatted string for a given \a value + * if the default formatting provided by QValue3DAxis::labelFormat property is not sufficient. + * + * \return the formatted label string using \a value and \a format. + * + * \sa doRecalculate(), stringForValue(), QValue3DAxis::labelFormat + */ +QString QValue3DAxisFormatter::doStringForValue(float value, const QString &format) +{ + return d_ptr->stringForValue(value, format); +} + +/*! + * Reimplement this method if the position cannot be resolved by linear interpolation + * between the parent axis minimum and maximum values. + * + * \return the normalized position along the axis for the given \a value. + * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive, if the value is within the parent axis range. + * + * \sa doRecalculate(), positionAt() + */ +float QValue3DAxisFormatter::doPositionAt(float value) +{ + return d_ptr->positionAt(value); +} + +/*! + * Reimplement this method if the value cannot be resolved by linear interpolation + * between the parent axis minimum and maximum values. + * + * \return the value at the normalized \a position along the axis. + * The \a position value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * inclusive to obtain values within the parent axis range. + * + * \sa doRecalculate(), positionAt() + */ +float QValue3DAxisFormatter::doValueAt(float position) +{ + return d_ptr->valueAt(position); +} + +/*! + * Copies all relevant values from this formatter to the \a copy. + * When reimplementing this method in a subclass, call the the superclass version at some point. + * The renderer uses this method to cache a copy of the the formatter. + * + * \return the new copy. The ownership of the new copy transfers to the caller. + */ +void QValue3DAxisFormatter::doPopulateCopy(QValue3DAxisFormatter ©) +{ + copy.d_ptr->m_min = d_ptr->m_min; + copy.d_ptr->m_max = d_ptr->m_max; +} + +/*! + * \return Returns a reference to the array of normalized grid positions. + * The array size is equal to the segment count of the parent axis plus one. + * The grid line at the index zero corresponds to the minimum value of the axis. + * + * \sa gridPosition() + */ +QVector &QValue3DAxisFormatter::gridPositions() +{ + return d_ptr->m_gridPositions; +} + +/*! + * \return Returns a reference to the array of normalized subgrid positions. + * The array size is equal to subsegment count of the parent axis minus one. + * + * \sa subGridPosition() + */ +QVector > &QValue3DAxisFormatter::subGridPositions() +{ + return d_ptr->m_subGridPositions; +} + +/*! + * \return Returns a reference to the array of normalized label positions. + * The array size is equal to the segment count of the parent axis plus one. + * + * \sa labelPosition() + */ +QVector &QValue3DAxisFormatter::labelPositions() +{ + return d_ptr->m_labelPositions; +} + +// QValue3DAxisFormatterPrivate +QValue3DAxisFormatterPrivate::QValue3DAxisFormatterPrivate(QValue3DAxisFormatter *q) + : QObject(0), + q_ptr(q), + m_needsRecalculate(true), + m_min(0.0f), + m_max(0.0f), + m_rangeNormalizer(0.0f), + m_axis(0), + m_preparsedParamType(Utils::ParamTypeUnknown) +{ +} + +QValue3DAxisFormatterPrivate::~QValue3DAxisFormatterPrivate() +{ +} + +void QValue3DAxisFormatterPrivate::recalculate() +{ + // Only recalculate if we need to and have m_axis pointer. If we do not have + // m_axis, either we are not attached to an axis or this is a renderer cache. + if (m_axis && m_needsRecalculate) + q_ptr->doRecalculate(); +} + +void QValue3DAxisFormatterPrivate::doRecalculate() +{ + m_needsRecalculate = false; + + m_gridPositions.clear(); + m_subGridPositions.clear(); + m_labelPositions.clear(); + + int segmentCount = m_axis->segmentCount(); + int subGridCount = m_axis->subSegmentCount() - 1; + m_min = m_axis->min(); + m_max = m_axis->max(); + m_rangeNormalizer = (m_max - m_min) / 2.0f; + + m_gridPositions.resize(segmentCount + 1); + + float segmentStep = 2.0f / float(segmentCount); + float subSegmentStep = 0; + if (subGridCount > 0) { + subSegmentStep = segmentStep / (subGridCount + 1); + m_subGridPositions.resize(segmentCount); + for (int i = 0; i < segmentCount; i++) + m_subGridPositions[i].resize(subGridCount); + } + + m_labelPositions.resize(segmentCount + 1); + + // Calculate positions + + for (int i = 0; i < segmentCount; i++) { + float gridValue = -1.0f + segmentStep * i; + m_gridPositions[i] = gridValue; + m_labelPositions[i] = gridValue; + if (m_subGridPositions.size()) { + for (int j = 0; j < subGridCount; j++) + m_subGridPositions[i][j] = gridValue + subSegmentStep * i; + } + } + + // Ensure max value doesn't suffer from any rounding errors + m_gridPositions[segmentCount] = 1.0f; + m_labelPositions[segmentCount] = 1.0f; +} + +QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString &format) +{ + if (m_previousLabelFormat.compare(format)) { + // Format string different than the previous one used, reparse it + m_previousLabelFormat = format; + m_preparsedParamType = Utils::findFormatParamType(format); + m_labelFormatArray = format.toUtf8(); + } + + return Utils::formatLabel(m_labelFormatArray, m_preparsedParamType, value); +} + +float QValue3DAxisFormatterPrivate::positionAt(float value) const +{ + return (((value - m_min) / m_rangeNormalizer) - 1.0f); +} + +float QValue3DAxisFormatterPrivate::valueAt(float position) const +{ + return (((position + 1.0f) * m_rangeNormalizer) + m_min); +} + +void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) +{ + Q_ASSERT(axis); + + connect(axis, &QValue3DAxis::segmentCountChanged, + this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + connect(axis, &QValue3DAxis::subSegmentCountChanged, + this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + connect(axis, &QAbstract3DAxis::rangeChanged, + this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + + m_axis = axis; +} + +void QValue3DAxisFormatterPrivate::setNeedsRecalculate() +{ + m_needsRecalculate = true; +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h new file mode 100644 index 00000000..a67b6094 --- /dev/null +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef QVALUE3DAXISFORMATTER_H +#define QVALUE3DAXISFORMATTER_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QValue3DAxisFormatterPrivate; +class QValue3DAxis; + +class QT_DATAVISUALIZATION_EXPORT QValue3DAxisFormatter : public QObject +{ + Q_OBJECT + +protected: + explicit QValue3DAxisFormatter(QValue3DAxisFormatterPrivate *d, QObject *parent = 0); +public: + explicit QValue3DAxisFormatter(QObject *parent = 0); + virtual ~QValue3DAxisFormatter(); + + virtual bool allowNegatives() const; + virtual bool allowZero() const; + + // Getters not const as they can trigger recalculate + float gridPosition(int index); + float subGridPosition(int subGridIndex, int segmentIndex); + float labelPosition(int index); + QString stringForValue(float value, const QString &format); + float positionAt(float value); + float valueAt(float position); + + virtual QValue3DAxisFormatter *createNewInstance(); + void populateCopy(QValue3DAxisFormatter ©); + +protected: + void markDirty(); + QValue3DAxis *axis() const; + + virtual void doRecalculate(); + virtual QString doStringForValue(float value, const QString &format); + virtual float doPositionAt(float value); + virtual float doValueAt(float position); + virtual void doPopulateCopy(QValue3DAxisFormatter ©); + + QVector &gridPositions(); + QVector > &subGridPositions(); + QVector &labelPositions(); + + QScopedPointer d_ptr; + +private: + Q_DISABLE_COPY(QValue3DAxisFormatter) + + friend class Abstract3DController; + friend class QValue3DAxisFormatterPrivate; + friend class QValue3DAxis; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h new file mode 100644 index 00000000..90b0f49e --- /dev/null +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include "datavisualizationglobal_p.h" +#include "qvalue3daxisformatter.h" +#include "utils_p.h" +#include + +#ifndef QVALUE3DAXISFORMATTER_P_H +#define QVALUE3DAXISFORMATTER_P_H + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QValue3DAxis; + +class QValue3DAxisFormatterPrivate : public QObject +{ + Q_OBJECT + +public: + QValue3DAxisFormatterPrivate(QValue3DAxisFormatter *q); + virtual ~QValue3DAxisFormatterPrivate(); + + void recalculate(); + void doRecalculate(); + + QString stringForValue(float value, const QString &format); + float positionAt(float value) const; + float valueAt(float position) const; + + void setAxis(QValue3DAxis *axis); + +public slots: + void setNeedsRecalculate(); + +protected: + QValue3DAxisFormatter *q_ptr; + + bool m_needsRecalculate; + + float m_min; + float m_max; + float m_rangeNormalizer; + + QVector m_gridPositions; + QVector > m_subGridPositions; + QVector m_labelPositions; + + QValue3DAxis *m_axis; + + QString m_previousLabelFormat; + QByteArray m_labelFormatArray; + Utils::ParamType m_preparsedParamType; + + friend class QValue3DAxisFormatter; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 63d66bc4..2a8564a0 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -326,6 +326,31 @@ void Abstract3DController::synchDataToRenderer() } } + if (m_changeTracker.axisXFormatterChanged) { + m_changeTracker.axisXFormatterChanged = false; + if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisX = static_cast(m_axisX); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationX, + valueAxisX->formatter()); + } + } + if (m_changeTracker.axisYFormatterChanged) { + m_changeTracker.axisYFormatterChanged = false; + if (m_axisY->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisY = static_cast(m_axisY); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationY, + valueAxisY->formatter()); + } + } + if (m_changeTracker.axisZFormatterChanged) { + m_changeTracker.axisZFormatterChanged = false; + if (m_axisZ->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisZ = static_cast(m_axisZ); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationZ, + valueAxisZ->formatter()); + } + } + if (m_isSeriesVisibilityDirty || m_isSeriesVisualsDirty) { m_renderer->updateSeries(m_seriesList, m_isSeriesVisibilityDirty); m_isSeriesVisibilityDirty = false; @@ -888,6 +913,11 @@ void Abstract3DController::handleAxisLabelFormatChanged(const QString &format) handleAxisLabelFormatChangedBySender(sender()); } +void Abstract3DController::handleAxisFormatterDirty() +{ + handleAxisFormatterDirtyBySender(sender()); +} + void Abstract3DController::handleInputViewChanged(QAbstract3DInputHandler::InputView view) { // When in automatic slicing mode, input view change to primary disables slice mode @@ -896,15 +926,12 @@ void Abstract3DController::handleInputViewChanged(QAbstract3DInputHandler::Input setSlicingActive(false); } - m_changeTracker.inputViewChanged = true; emitNeedRender(); } void Abstract3DController::handleInputPositionChanged(const QPoint &position) { Q_UNUSED(position) - - m_changeTracker.inputPositionChanged = true; emitNeedRender(); } @@ -938,6 +965,23 @@ void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) emitNeedRender(); } +void Abstract3DController::handleAxisFormatterDirtyBySender(QObject *sender) +{ + if (sender == m_axisX) { + m_isDataDirty = true; + m_changeTracker.axisXFormatterChanged = true; + } else if (sender == m_axisY) { + m_isDataDirty = true; + m_changeTracker.axisYFormatterChanged = true; + } else if (sender == m_axisZ) { + m_isDataDirty = true; + m_changeTracker.axisZFormatterChanged = true; + } else { + qWarning() << __FUNCTION__ << "invoked for invalid axis"; + } + emitNeedRender(); +} + void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { Q_UNUSED(sender) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index c0a2fac2..a8cb040a 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -73,8 +73,9 @@ struct Abstract3DChangeBitField { bool axisXLabelFormatChanged : 1; bool axisYLabelFormatChanged : 1; bool axisZLabelFormatChanged : 1; - bool inputViewChanged : 1; - bool inputPositionChanged : 1; + bool axisXFormatterChanged : 1; + bool axisYFormatterChanged : 1; + bool axisZFormatterChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -102,7 +103,10 @@ struct Abstract3DChangeBitField { axisZSubSegmentCountChanged(true), axisXLabelFormatChanged(true), axisYLabelFormatChanged(true), - axisZLabelFormatChanged(true) + axisZLabelFormatChanged(true), + axisXFormatterChanged(true), + axisYFormatterChanged(true), + axisZFormatterChanged(true) { } }; @@ -233,6 +237,7 @@ public: virtual void handleAxisAutoAdjustRangeChangedInOrientation( QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust) = 0; virtual void handleAxisLabelFormatChangedBySender(QObject *sender); + virtual void handleAxisFormatterDirtyBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; @@ -244,6 +249,7 @@ public slots: void handleAxisSubSegmentCountChanged(int count); void handleAxisAutoAdjustRangeChanged(bool autoAdjust); void handleAxisLabelFormatChanged(const QString &format); + void handleAxisFormatterDirty(); void handleInputViewChanged(QAbstract3DInputHandler::InputView view); void handleInputPositionChanged(const QPoint &position); void handleSeriesVisibilityChanged(bool visible); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 3122cf76..48453a82 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -26,6 +26,7 @@ #include "qabstract3dseries_p.h" #include "q3dtheme_p.h" #include "objecthelper_p.h" +#include "qvalue3daxisformatter_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -332,6 +333,18 @@ void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation axisCacheForOrientation(orientation).setLabelFormat(format); } +void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, + QValue3DAxisFormatter *formatter) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.ctrlFormatter() != formatter) { + delete cache.formatter(); + cache.setFormatter(formatter->createNewInstance()); + cache.setCtrlFormatter(formatter); + } + formatter->populateCopy(*(cache.formatter())); +} + void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) { // Default implementation does nothing. diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 4eb8426f..b198f004 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -84,14 +84,23 @@ public: virtual void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality) = 0; virtual void initShaders(const QString &vertexShader, const QString &fragmentShader) = 0; virtual void initGradientShaders(const QString &vertexShader, const QString &fragmentShader); - virtual void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader) = 0; - virtual void updateAxisType(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis::AxisType type); - virtual void updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation, const QString &title); - virtual void updateAxisLabels(QAbstract3DAxis::AxisOrientation orientation, const QStringList &labels); - virtual void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max); + virtual void initBackgroundShaders(const QString &vertexShader, + const QString &fragmentShader) = 0; + virtual void updateAxisType(QAbstract3DAxis::AxisOrientation orientation, + QAbstract3DAxis::AxisType type); + virtual void updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation, + const QString &title); + virtual void updateAxisLabels(QAbstract3DAxis::AxisOrientation orientation, + const QStringList &labels); + virtual void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, + float max); virtual void updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count); - virtual void updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count); - virtual void updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, const QString &format); + virtual void updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation, + int count); + virtual void updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, + const QString &format); + virtual void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, + QValue3DAxisFormatter *formatter); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void generateBaseColorTexture(const QColor &color, GLuint *texture); diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index a107dd23..bc0ab703 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -30,6 +30,8 @@ AxisRenderCache::AxisRenderCache() m_segmentCount(5), m_subSegmentCount(1), m_font(QFont(QStringLiteral("Arial"))), + m_formatter(0), + m_ctrlFormatter(0), m_drawer(0), m_segmentStep(10.0f), m_subSegmentStep(10.0f) @@ -40,6 +42,8 @@ AxisRenderCache::~AxisRenderCache() { foreach (LabelItem *label, m_labelItems) delete label; + + delete m_formatter; } void AxisRenderCache::setDrawer(Drawer *drawer) diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index e1c51e7c..5b48fbdf 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -48,19 +48,23 @@ public: void setType(QAbstract3DAxis::AxisType type); inline QAbstract3DAxis::AxisType type() const { return m_type; } void setTitle(const QString &title); - inline const QString &title() { return m_title; } + inline const QString &title() const { return m_title; } void setLabels(const QStringList &labels); - inline const QStringList &labels() { return m_labels; } + inline const QStringList &labels() const { return m_labels; } void setMin(float min); - inline float min() { return m_min; } + inline float min() const { return m_min; } void setMax(float max); - inline float max() { return m_max; } + inline float max() const { return m_max; } void setSegmentCount(int count); inline int segmentCount() const { return m_segmentCount; } void setSubSegmentCount(int count); inline int subSegmentCount() const { return m_subSegmentCount; } inline void setLabelFormat(const QString &format) { m_labelFormat = format; } - inline const QString &labelFormat() { return m_labelFormat; } + inline const QString &labelFormat() const { return m_labelFormat; } + inline void setFormatter(QValue3DAxisFormatter *formatter) { m_formatter = formatter; } + inline QValue3DAxisFormatter *formatter() const { return m_formatter; } + inline void setCtrlFormatter(const QValue3DAxisFormatter *formatter) { m_ctrlFormatter = formatter; } + inline const QValue3DAxisFormatter *ctrlFormatter() const { return m_ctrlFormatter; } inline LabelItem &titleItem() { return m_titleItem; } inline QList &labelItems() { return m_labelItems; } @@ -85,6 +89,8 @@ private: int m_subSegmentCount; QString m_labelFormat; QFont m_font; + QValue3DAxisFormatter *m_formatter; + const QValue3DAxisFormatter *m_ctrlFormatter; // Renderer items Drawer *m_drawer; // Not owned diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 91240259..c6c1a9f1 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -28,7 +28,6 @@ #include "q3dtheme_p.h" #include -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index e7a0e2ca..7374f25f 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -20,6 +20,7 @@ #include "custominputhandler.h" #include #include +#include #include #include #include @@ -1044,6 +1045,19 @@ void GraphModifier::toggleRotation() m_rotationTimer.start(20); } +void GraphModifier::useLogAxis() +{ + // TODO proper log axis test + + +// // Change y-axis to log axis +// QValue3DAxis *logAxis = new QValue3DAxis; +// logAxis->formatter()->setBase(10); +// logAxis->setSegmentCount(5); +// logAxis->setRange(1, 100000); +// m_graph->setValueAxis(logAxis); +} + void GraphModifier::insertRemoveTimerTimeout() { if (m_insertRemoveStep < 32) { diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 5758262c..557270e0 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -85,6 +85,7 @@ public: void primarySeriesTest(); void insertRemoveTestToggle(); void toggleRotation(); + void useLogAxis(); public slots: void flipViews(); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index 8189f917..b02fa48f 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -165,6 +165,10 @@ int main(int argc, char **argv) toggleRotationButton->setText(QStringLiteral("Toggle rotation")); toggleRotationButton->setEnabled(true); + QPushButton *logAxisButton = new QPushButton(widget); + logAxisButton->setText(QStringLiteral("Use Log Axis")); + logAxisButton->setEnabled(true); + QColorDialog *colorDialog = new QColorDialog(widget); QLinearGradient grBtoY(0, 0, 100, 0); @@ -313,6 +317,7 @@ int main(int argc, char **argv) vLayout->addWidget(ownThemeButton, 0, Qt::AlignTop); vLayout->addWidget(primarySeriesTestsButton, 0, Qt::AlignTop); vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop); + vLayout->addWidget(logAxisButton, 0, Qt::AlignTop); vLayout->addWidget(gradientBtoYPB, 1, Qt::AlignTop); vLayout2->addWidget(staticCheckBox, 0, Qt::AlignTop); @@ -418,6 +423,8 @@ int main(int argc, char **argv) &GraphModifier::primarySeriesTest); QObject::connect(toggleRotationButton, &QPushButton::clicked, modifier, &GraphModifier::toggleRotation); + QObject::connect(logAxisButton, &QPushButton::clicked, modifier, + &GraphModifier::useLogAxis); QObject::connect(colorDialog, &QColorDialog::currentColorChanged, modifier, &GraphModifier::changeBaseColor); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, -- cgit v1.2.3 From 724bcb35136ed1af699fe8631b9297deb07571ad Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 18 Mar 2014 15:33:00 +0200 Subject: Actually use axis formatter in renderer. Task-number: QTRD-2787 Change-Id: I0ced8e506928df5fba2e8df94258b53457f4412e Reviewed-by: Mika Salmela --- src/datavisualization/axis/qabstract3daxis.cpp | 6 +- src/datavisualization/axis/qvalue3daxis.cpp | 3 +- src/datavisualization/axis/qvalue3daxis.h | 3 +- src/datavisualization/axis/qvalue3daxis_p.h | 1 + .../axis/qvalue3daxisformatter.cpp | 243 +++++--------- src/datavisualization/axis/qvalue3daxisformatter.h | 38 +-- .../axis/qvalue3daxisformatter_p.h | 4 +- .../engine/abstract3dcontroller.cpp | 13 +- .../engine/abstract3drenderer.cpp | 22 +- .../engine/abstract3drenderer_p.h | 2 +- src/datavisualization/engine/axisrendercache.cpp | 74 ++--- src/datavisualization/engine/axisrendercache_p.h | 43 ++- src/datavisualization/engine/bars3drenderer.cpp | 131 ++++---- src/datavisualization/engine/bars3drenderer_p.h | 2 +- .../engine/meshes/backgroundNegatives.obj | 6 +- src/datavisualization/engine/scatter3drenderer.cpp | 274 +++++++--------- src/datavisualization/engine/surface3drenderer.cpp | 359 ++++++++------------- src/datavisualization/engine/surface3drenderer_p.h | 8 +- .../engine/surfaceseriesrendercache.cpp | 8 +- .../engine/surfaceseriesrendercache_p.h | 9 +- src/datavisualization/utils/surfaceobject.cpp | 133 ++++---- src/datavisualization/utils/surfaceobject_p.h | 29 +- tests/barstest/chart.cpp | 9 +- tests/barstest/chart.h | 1 + tests/barstest/main.cpp | 9 +- tests/scattertest/main.cpp | 80 ++++- tests/scattertest/scatterchart.cpp | 53 ++- tests/scattertest/scatterchart.h | 6 + tests/surfacetest/graphmodifier.cpp | 44 ++- tests/surfacetest/graphmodifier.h | 4 + tests/surfacetest/main.cpp | 30 +- 31 files changed, 786 insertions(+), 861 deletions(-) diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index e01f980c..3b60ff5d 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -407,11 +407,11 @@ void QAbstract3DAxisPrivate::setMax(float max) float oldMin = m_min; m_min = max - 1.0f; if (!allowNegatives() && m_min < 0.0f) { - if (allowZero()) { + if (allowZero()) m_min = 0.0f; - } else { + else m_min = max / 2.0f; // Need some positive value smaller than max - } + if (!allowMinMaxSame() && max == 0.0f) { m_min = oldMin; qWarning() << "Unable to set maximum value to zero."; diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index e93f440f..841349dd 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -269,8 +269,9 @@ void QValue3DAxisPrivate::updateLabels() QStringList newLabels; newLabels.reserve(m_segmentCount + 1); + m_formatter->d_ptr->recalculate(); for (int i = 0; i <= m_segmentCount; i++) { - float value = m_formatter->valueAt(m_formatter->gridPosition(i)); + float value = m_formatter->valueAt(m_formatter->gridPositions().at(i)); newLabels.append(m_formatter->stringForValue(value, m_labelFormat)); } diff --git a/src/datavisualization/axis/qvalue3daxis.h b/src/datavisualization/axis/qvalue3daxis.h index c5982f33..bb90f6d3 100644 --- a/src/datavisualization/axis/qvalue3daxis.h +++ b/src/datavisualization/axis/qvalue3daxis.h @@ -62,10 +62,11 @@ protected: private: Q_DISABLE_COPY(QValue3DAxis) + friend class Abstract3DController; friend class Bars3DController; friend class Scatter3DController; friend class Surface3DController; - friend class QValue3DAxisFormatter; + friend class QValue3DAxisFormatterPrivate; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index c198db75..ff281f0c 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -67,6 +67,7 @@ private: QValue3DAxis *qptr(); friend class QValue3DAxis; + friend class Abstract3DController; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index 5f943bd3..c8e0a662 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -30,19 +30,23 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * This class provides formatting rules for a linear QValue3DAxis. Subclass it if you * want to implement custom value axes. * + * The base class has no public API beyond constructors and destructors. It is meant to be only + * used internally. However, subclasses may implement public properties as needed. + * * \sa QLog3DAxisFormatter */ /*! * \qmltype ValueAxis3DFormatter * \inqmlmodule QtDataVisualization - * \since QtDataVisualization 1.0 + * \since QtDataVisualization 1.1 * \ingroup datavisualization_qml * \instantiates QValue3DAxisFormatter * \brief ValueAxis3DFormatter is base type for value axis formatters. * * This type provides formatting rules for a linear ValueAxis3D. * This type is the default type for ValueAxis3D and thus never needs to be explicitly created. + * This type has not public functionality. */ /*! @@ -88,148 +92,17 @@ bool QValue3DAxisFormatter::allowZero() const return true; } -/*! - * \return the normalized position along the axis for the grid line indicated by the \a index. - * The total amount of grid lines is equal to segment count plus one. The returned value should be - * between -1.0 (for minimum value) and 1.0 (for maximum value), inclusive. - * The grid line at the index zero corresponds to the minimum value of the axis. - * This value is used to position the segment grid lines when the graph is rendered. - * - * \sa doRecalculate(), gridPositions() - */ -float QValue3DAxisFormatter::gridPosition(int index) -{ - d_ptr->recalculate(); - - Q_ASSERT(d_ptr->m_gridPositions.size() > index); - - return d_ptr->m_gridPositions.at(index); -} - -/*! - * \return the normalized position along the axis for a subsegment grid line of a segment. - * The \a subGridIndex and \a segmentIndex specify the desired subgrid line. - * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), - * inclusive. - * The amount of subgrid lines per segment is equal to subsegment count minus one. - * This value is used to position the subsegment grid lines when the graph is rendered. - * - * \sa doRecalculate(), subGridPositions() - */ -float QValue3DAxisFormatter::subGridPosition(int subGridIndex, int segmentIndex) -{ - d_ptr->recalculate(); - - Q_ASSERT(d_ptr->m_subGridPositions.size() > subGridIndex); - Q_ASSERT(d_ptr->m_subGridPositions.at(0).size() > segmentIndex); - - return d_ptr->m_subGridPositions.at(segmentIndex).at(subGridIndex); -} - -/*! - * \return the normalized position along the axis for given label \a index. - * The total amount of labels is equal to segment count plus one. The label \a index zero - * corresponds to the minimum value of the axis. - * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), - * inclusive. This value is used to position the axis labels when the graph is rendered. - * - * \sa doRecalculate(), labelPositions() - */ -float QValue3DAxisFormatter::labelPosition(int index) -{ - d_ptr->recalculate(); - - Q_ASSERT(d_ptr->m_labelPositions.size() > index); - - return d_ptr->m_labelPositions.at(index); -} - -/*! - * This method can be used to convert a value to a string using formatter specific formatting - * rules supported by the labelFormat property of the parent axis. - * - * \return the formatted label string using \a value and \a format. - * - * \sa doRecalculate(), doStringForValue(), QValue3DAxis::labelFormat - */ -QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) -{ - d_ptr->recalculate(); - return doStringForValue(value, format); -} - -/*! - * \return the normalized position along the axis for the given \a value. - * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), - * inclusive. This value is used to position the items when the graph is rendered. - * - * \sa doRecalculate(), doPositionAt() - */ -float QValue3DAxisFormatter::positionAt(float value) -{ - d_ptr->recalculate(); - return doPositionAt(value); -} - -/*! - * \return the value at the normalized \a position along the axis. - * The \a position value should be between -1.0 (for minimum value) and 1.0 (for maximum value), - * inclusive. - * - * \sa doRecalculate(), doValueAt() - */ -float QValue3DAxisFormatter::valueAt(float position) -{ - d_ptr->recalculate(); - return doValueAt(position); -} - /*! * Creates a new empty instance of this formatter. Must be reimplemented in a subclass. * * \return the new instance. The renderer uses this method to cache a copy of the * the formatter. The ownership of the new copy transfers to the caller. */ -QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() +QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const { return new QValue3DAxisFormatter(); } -/*! - * Populates the \a copy with the values of this formatter. - * - * \sa doPopulateCopy() - */ -void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) -{ - d_ptr->recalculate(); - doPopulateCopy(copy); -} - -/*! - * Marks this formatter dirty, prompting the renderer to make a new copy of its cache on the next - * renderer synchronization. Recalculation is also triggered on next access to the values. - * This method should be called by a subclass whenever the formatter - * is changed in a way that affects the resolved values. - */ -void QValue3DAxisFormatter::markDirty() -{ - d_ptr->m_needsRecalculate = true; - if (d_ptr->m_axis) - emit d_ptr->m_axis->dptr()->formatterDirty(); -} - -/*! - * \return the parent axis. The parent axis must only be accessed in doRecalculate() - * method to maintain thread safety in environments using a threaded renderer. - * - * \sa doRecalculate() - */ -QValue3DAxis *QValue3DAxisFormatter::axis() const -{ - return d_ptr->m_axis; -} - /*! * This method populates the label and grid line position arrays, as well as calculates * any values needed for mapping between value and position. It is allowed to access @@ -237,9 +110,12 @@ QValue3DAxis *QValue3DAxisFormatter::axis() const * * This method must be reimplemented in a subclass. * + * See gridPositions(), subGridPositions(), and labelPositions() documentation about the arrays + * that need to be populated. + * * \sa gridPositions(), subGridPositions(), labelPositions(), axis() */ -void QValue3DAxisFormatter::doRecalculate() +void QValue3DAxisFormatter::recalculate() { d_ptr->doRecalculate(); } @@ -250,9 +126,9 @@ void QValue3DAxisFormatter::doRecalculate() * * \return the formatted label string using \a value and \a format. * - * \sa doRecalculate(), stringForValue(), QValue3DAxis::labelFormat + * \sa recalculate(), stringForValue(), QValue3DAxis::labelFormat */ -QString QValue3DAxisFormatter::doStringForValue(float value, const QString &format) +QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) const { return d_ptr->stringForValue(value, format); } @@ -262,12 +138,12 @@ QString QValue3DAxisFormatter::doStringForValue(float value, const QString &form * between the parent axis minimum and maximum values. * * \return the normalized position along the axis for the given \a value. - * The returned value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * The returned value should be between 0.0 (for minimum value) and 1.0 (for maximum value), * inclusive, if the value is within the parent axis range. * * \sa doRecalculate(), positionAt() */ -float QValue3DAxisFormatter::doPositionAt(float value) +float QValue3DAxisFormatter::positionAt(float value) const { return d_ptr->positionAt(value); } @@ -277,12 +153,12 @@ float QValue3DAxisFormatter::doPositionAt(float value) * between the parent axis minimum and maximum values. * * \return the value at the normalized \a position along the axis. - * The \a position value should be between -1.0 (for minimum value) and 1.0 (for maximum value), + * The \a position value should be between 0.0 (for minimum value) and 1.0 (for maximum value), * inclusive to obtain values within the parent axis range. * * \sa doRecalculate(), positionAt() */ -float QValue3DAxisFormatter::doValueAt(float position) +float QValue3DAxisFormatter::valueAt(float position) const { return d_ptr->valueAt(position); } @@ -294,31 +170,50 @@ float QValue3DAxisFormatter::doValueAt(float position) * * \return the new copy. The ownership of the new copy transfers to the caller. */ -void QValue3DAxisFormatter::doPopulateCopy(QValue3DAxisFormatter ©) +void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const +{ + d_ptr->doPopulateCopy(*(copy.d_ptr.data())); +} + +/*! + * Marks this formatter dirty, prompting the renderer to make a new copy of its cache on the next + * renderer synchronization. This method should be called by a subclass whenever the formatter + * is changed in a way that affects the resolved values. + */ +void QValue3DAxisFormatter::markDirty() { - copy.d_ptr->m_min = d_ptr->m_min; - copy.d_ptr->m_max = d_ptr->m_max; + d_ptr->markDirty(); +} + +/*! + * \return the parent axis. The parent axis must only be accessed in recalculate() + * method to maintain thread safety in environments using a threaded renderer. + * + * \sa recalculate() + */ +QValue3DAxis *QValue3DAxisFormatter::axis() const +{ + return d_ptr->m_axis; } /*! * \return Returns a reference to the array of normalized grid positions. * The array size is equal to the segment count of the parent axis plus one. + * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * The grid line at the index zero corresponds to the minimum value of the axis. - * - * \sa gridPosition() */ -QVector &QValue3DAxisFormatter::gridPositions() +QVector &QValue3DAxisFormatter::gridPositions() const { return d_ptr->m_gridPositions; } /*! * \return Returns a reference to the array of normalized subgrid positions. - * The array size is equal to subsegment count of the parent axis minus one. - * - * \sa subGridPosition() + * The array size is equal to segment count of tha parent axis times subsegment count of the parent + * axis minus one. + * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. */ -QVector > &QValue3DAxisFormatter::subGridPositions() +QVector > &QValue3DAxisFormatter::subGridPositions() const { return d_ptr->m_subGridPositions; } @@ -326,10 +221,10 @@ QVector > &QValue3DAxisFormatter::subGridPositions() /*! * \return Returns a reference to the array of normalized label positions. * The array size is equal to the segment count of the parent axis plus one. - * - * \sa labelPosition() + * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. + * The label at the index zero corresponds to the minimum value of the axis. */ -QVector &QValue3DAxisFormatter::labelPositions() +QVector &QValue3DAxisFormatter::labelPositions() const { return d_ptr->m_labelPositions; } @@ -356,7 +251,7 @@ void QValue3DAxisFormatterPrivate::recalculate() // Only recalculate if we need to and have m_axis pointer. If we do not have // m_axis, either we are not attached to an axis or this is a renderer cache. if (m_axis && m_needsRecalculate) - q_ptr->doRecalculate(); + q_ptr->recalculate(); } void QValue3DAxisFormatterPrivate::doRecalculate() @@ -371,12 +266,13 @@ void QValue3DAxisFormatterPrivate::doRecalculate() int subGridCount = m_axis->subSegmentCount() - 1; m_min = m_axis->min(); m_max = m_axis->max(); - m_rangeNormalizer = (m_max - m_min) / 2.0f; + m_rangeNormalizer = (m_max - m_min); m_gridPositions.resize(segmentCount + 1); - float segmentStep = 2.0f / float(segmentCount); + float segmentStep = 1.0f / float(segmentCount); float subSegmentStep = 0; + if (subGridCount > 0) { subSegmentStep = segmentStep / (subGridCount + 1); m_subGridPositions.resize(segmentCount); @@ -389,12 +285,12 @@ void QValue3DAxisFormatterPrivate::doRecalculate() // Calculate positions for (int i = 0; i < segmentCount; i++) { - float gridValue = -1.0f + segmentStep * i; + float gridValue = segmentStep * i; m_gridPositions[i] = gridValue; m_labelPositions[i] = gridValue; if (m_subGridPositions.size()) { for (int j = 0; j < subGridCount; j++) - m_subGridPositions[i][j] = gridValue + subSegmentStep * i; + m_subGridPositions[i][j] = gridValue + subSegmentStep * (j + 1); } } @@ -403,6 +299,23 @@ void QValue3DAxisFormatterPrivate::doRecalculate() m_labelPositions[segmentCount] = 1.0f; } +void QValue3DAxisFormatterPrivate::populateCopy(QValue3DAxisFormatter ©) +{ + recalculate(); + q_ptr->populateCopy(copy); +} + +void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate ©) +{ + copy.m_min = m_min; + copy.m_max = m_max; + copy.m_rangeNormalizer = m_rangeNormalizer; + + copy.m_gridPositions = m_gridPositions; + copy.m_labelPositions = m_labelPositions; + copy.m_subGridPositions = m_subGridPositions; +} + QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString &format) { if (m_previousLabelFormat.compare(format)) { @@ -417,12 +330,12 @@ QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString float QValue3DAxisFormatterPrivate::positionAt(float value) const { - return (((value - m_min) / m_rangeNormalizer) - 1.0f); + return ((value - m_min) / m_rangeNormalizer); } float QValue3DAxisFormatterPrivate::valueAt(float position) const { - return (((position + 1.0f) * m_rangeNormalizer) + m_min); + return ((position * m_rangeNormalizer) + m_min); } void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) @@ -430,18 +343,20 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) Q_ASSERT(axis); connect(axis, &QValue3DAxis::segmentCountChanged, - this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + this, &QValue3DAxisFormatterPrivate::markDirty); connect(axis, &QValue3DAxis::subSegmentCountChanged, - this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + this, &QValue3DAxisFormatterPrivate::markDirty); connect(axis, &QAbstract3DAxis::rangeChanged, - this, &QValue3DAxisFormatterPrivate::setNeedsRecalculate); + this, &QValue3DAxisFormatterPrivate::markDirty); m_axis = axis; } -void QValue3DAxisFormatterPrivate::setNeedsRecalculate() +void QValue3DAxisFormatterPrivate::markDirty() { m_needsRecalculate = true; + if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone) + emit m_axis->dptr()->formatterDirty(); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index a67b6094..14ecdc15 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -38,33 +38,22 @@ public: explicit QValue3DAxisFormatter(QObject *parent = 0); virtual ~QValue3DAxisFormatter(); +protected: virtual bool allowNegatives() const; virtual bool allowZero() const; + virtual QValue3DAxisFormatter *createNewInstance() const; + virtual void recalculate(); + virtual QString stringForValue(float value, const QString &format) const; + virtual float positionAt(float value) const; + virtual float valueAt(float position) const; + virtual void populateCopy(QValue3DAxisFormatter ©) const; - // Getters not const as they can trigger recalculate - float gridPosition(int index); - float subGridPosition(int subGridIndex, int segmentIndex); - float labelPosition(int index); - QString stringForValue(float value, const QString &format); - float positionAt(float value); - float valueAt(float position); - - virtual QValue3DAxisFormatter *createNewInstance(); - void populateCopy(QValue3DAxisFormatter ©); - -protected: void markDirty(); QValue3DAxis *axis() const; - virtual void doRecalculate(); - virtual QString doStringForValue(float value, const QString &format); - virtual float doPositionAt(float value); - virtual float doValueAt(float position); - virtual void doPopulateCopy(QValue3DAxisFormatter ©); - - QVector &gridPositions(); - QVector > &subGridPositions(); - QVector &labelPositions(); + QVector &gridPositions() const; + QVector > &subGridPositions() const; + QVector &labelPositions() const; QScopedPointer d_ptr; @@ -72,8 +61,15 @@ private: Q_DISABLE_COPY(QValue3DAxisFormatter) friend class Abstract3DController; + friend class Abstract3DRenderer; + friend class Bars3DRenderer; + friend class Scatter3DRenderer; + friend class Surface3DRenderer; + friend class SurfaceObject; friend class QValue3DAxisFormatterPrivate; friend class QValue3DAxis; + friend class QValue3DAxisPrivate; + friend class AxisRenderCache; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index 90b0f49e..d9f90934 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -48,6 +48,8 @@ public: void recalculate(); void doRecalculate(); + void populateCopy(QValue3DAxisFormatter ©); + void doPopulateCopy(QValue3DAxisFormatterPrivate ©); QString stringForValue(float value, const QString &format); float positionAt(float value) const; @@ -56,7 +58,7 @@ public: void setAxis(QValue3DAxis *axis); public slots: - void setNeedsRecalculate(); + void markDirty(); protected: QValue3DAxisFormatter *q_ptr; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 2a8564a0..8ae9f790 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -19,7 +19,7 @@ #include "abstract3dcontroller_p.h" #include "camerahelper_p.h" #include "qabstract3daxis_p.h" -#include "qvalue3daxis.h" +#include "qvalue3daxis_p.h" #include "qcategory3daxis.h" #include "abstract3drenderer_p.h" #include "q3dcamera.h" @@ -967,13 +967,15 @@ void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) void Abstract3DController::handleAxisFormatterDirtyBySender(QObject *sender) { - if (sender == m_axisX) { + // Sender is QValue3DAxisPrivate + QValue3DAxis *valueAxis = static_cast(sender)->qptr(); + if (valueAxis == m_axisX) { m_isDataDirty = true; m_changeTracker.axisXFormatterChanged = true; - } else if (sender == m_axisY) { + } else if (valueAxis == m_axisY) { m_isDataDirty = true; m_changeTracker.axisYFormatterChanged = true; - } else if (sender == m_axisZ) { + } else if (valueAxis == m_axisZ) { m_isDataDirty = true; m_changeTracker.axisZFormatterChanged = true; } else { @@ -1050,10 +1052,13 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient this, &Abstract3DController::handleAxisSubSegmentCountChanged); QObject::connect(valueAxis, &QValue3DAxis::labelFormatChanged, this, &Abstract3DController::handleAxisLabelFormatChanged); + QObject::connect(valueAxis->dptr(), &QValue3DAxisPrivate::formatterDirty, + this, &Abstract3DController::handleAxisFormatterDirty); handleAxisSegmentCountChangedBySender(valueAxis); handleAxisSubSegmentCountChangedBySender(valueAxis); handleAxisLabelFormatChangedBySender(valueAxis); + handleAxisFormatterDirtyBySender(valueAxis->dptr()); } } diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 48453a82..c5e265aa 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -138,13 +138,13 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) glDisable(GL_SCISSOR_TEST); } -QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) -{ - QString valueLabelFormat = format; - Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); - QByteArray valueFormatArray = valueLabelFormat.toUtf8(); - return Utils::formatLabel(valueFormatArray, valueParamType, value); -} +//QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) +//{ +// QString valueLabelFormat = format; +// Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); +// QByteArray valueFormatArray = valueLabelFormat.toUtf8(); +// return Utils::formatLabel(valueFormatArray, valueParamType, value); +//} void Abstract3DRenderer::updateSelectionState(SelectionState state) { @@ -318,13 +318,15 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count) { - axisCacheForOrientation(orientation).setSegmentCount(count); + AxisRenderCache &cache = axisCacheForOrientation(orientation); + cache.setSegmentCount(count); } void Abstract3DRenderer::updateAxisSubSegmentCount(QAbstract3DAxis::AxisOrientation orientation, int count) { - axisCacheForOrientation(orientation).setSubSegmentCount(count); + AxisRenderCache &cache = axisCacheForOrientation(orientation); + cache.setSubSegmentCount(count); } void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, @@ -342,7 +344,7 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache.setFormatter(formatter->createNewInstance()); cache.setCtrlFormatter(formatter); } - formatter->populateCopy(*(cache.formatter())); + formatter->d_ptr->populateCopy(*(cache.formatter())); } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index b198f004..f6415cca 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -60,7 +60,7 @@ protected: SelectOnSlice }; - QString generateValueLabel(const QString &format, float value); +// QString generateValueLabel(const QString &format, float value); public: virtual ~Abstract3DRenderer(); diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index bc0ab703..1b4fd52d 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -33,8 +33,9 @@ AxisRenderCache::AxisRenderCache() m_formatter(0), m_ctrlFormatter(0), m_drawer(0), - m_segmentStep(10.0f), - m_subSegmentStep(10.0f) + m_positionsDirty(true), + m_translate(0.0f), + m_scale(1.0f) { } @@ -73,8 +74,6 @@ void AxisRenderCache::setType(QAbstract3DAxis::AxisType type) foreach (LabelItem *label, m_labelItems) delete label; m_labelItems.clear(); - m_segmentStep = 10.0f; - m_subSegmentStep = 10.0f; } void AxisRenderCache::setTitle(const QString &title) @@ -114,28 +113,38 @@ void AxisRenderCache::setLabels(const QStringList &labels) } } -void AxisRenderCache::setMin(float min) +void AxisRenderCache::updateAllPositions() { - m_min = min; - updateSegmentStep(); -} - -void AxisRenderCache::setMax(float max) -{ - m_max = max; - updateSegmentStep(); -} - -void AxisRenderCache::setSegmentCount(int count) -{ - m_segmentCount = count; - updateSegmentStep(); -} + // As long as grid and subgrid lines are drawn identically, we can further optimize + // by caching all grid and subgrid positions into a single vector. + // If subgrid lines are ever themed separately, this array will probably become obsolete. + if (m_formatter) { + int subGridCount = m_subSegmentCount - 1; + int fullSize = m_segmentCount + 1 + (m_segmentCount * subGridCount); + m_adjustedGridLinePositions.resize(fullSize); + m_adjustedLabelPositions.resize(m_segmentCount + 1); + int index = 0; + int segment = 0; + for (; segment < m_segmentCount; segment++) { + m_adjustedLabelPositions[segment] = + m_formatter->labelPositions().at(segment) * m_scale + m_translate; + m_adjustedGridLinePositions[index++] = + m_formatter->gridPositions().at(segment) * m_scale + m_translate; + if (subGridCount > 0) { + for (int subGrid = 0; subGrid < subGridCount; subGrid++) { + m_adjustedGridLinePositions[index++] = + m_formatter->subGridPositions().at(segment).at(subGrid) * m_scale + m_translate; + } + } + } + // Last gridline + m_adjustedLabelPositions[segment] = + m_formatter->labelPositions().at(segment) * m_scale + m_translate; + m_adjustedGridLinePositions[index] = + m_formatter->gridPositions().at(segment) * m_scale + m_translate; -void AxisRenderCache::setSubSegmentCount(int count) -{ - m_subSegmentCount = count; - updateSubSegmentStep(); + m_positionsDirty = false; + } } void AxisRenderCache::updateTextures() @@ -157,23 +166,6 @@ void AxisRenderCache::updateTextures() } } -void AxisRenderCache::updateSegmentStep() -{ - if (m_segmentCount > 0) - m_segmentStep = qFabs((m_max - m_min) / m_segmentCount); - else - m_segmentStep = 0.0f; // Irrelevant - updateSubSegmentStep(); -} - -void AxisRenderCache::updateSubSegmentStep() -{ - if (m_subSegmentCount > 1) - m_subSegmentStep = m_segmentStep / m_subSegmentCount; - else - m_subSegmentStep = m_segmentStep; -} - int AxisRenderCache::maxLabelWidth(const QStringList &labels) const { int labelWidth = 0; diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index 5b48fbdf..eede9917 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -51,32 +51,48 @@ public: inline const QString &title() const { return m_title; } void setLabels(const QStringList &labels); inline const QStringList &labels() const { return m_labels; } - void setMin(float min); + inline void setMin(float min) { m_min = min; } inline float min() const { return m_min; } - void setMax(float max); + inline void setMax(float max) { m_max = max; } inline float max() const { return m_max; } - void setSegmentCount(int count); + inline void setSegmentCount(int count) { m_segmentCount = count; m_positionsDirty = true; } inline int segmentCount() const { return m_segmentCount; } - void setSubSegmentCount(int count); + inline void setSubSegmentCount(int count) { m_subSegmentCount = count; m_positionsDirty = true; } inline int subSegmentCount() const { return m_subSegmentCount; } inline void setLabelFormat(const QString &format) { m_labelFormat = format; } inline const QString &labelFormat() const { return m_labelFormat; } - inline void setFormatter(QValue3DAxisFormatter *formatter) { m_formatter = formatter; } + inline void setFormatter(QValue3DAxisFormatter *formatter) + { + m_formatter = formatter; m_positionsDirty = true; + } inline QValue3DAxisFormatter *formatter() const { return m_formatter; } - inline void setCtrlFormatter(const QValue3DAxisFormatter *formatter) { m_ctrlFormatter = formatter; } + inline void setCtrlFormatter(const QValue3DAxisFormatter *formatter) + { + m_ctrlFormatter = formatter; + } inline const QValue3DAxisFormatter *ctrlFormatter() const { return m_ctrlFormatter; } inline LabelItem &titleItem() { return m_titleItem; } inline QList &labelItems() { return m_labelItems; } - inline GLfloat segmentStep() const { return m_segmentStep; } - inline GLfloat subSegmentStep() const { return m_subSegmentStep; } + inline float gridLinePosition(int index) { return m_adjustedGridLinePositions.at(index); } + inline int gridLineCount() { return m_adjustedGridLinePositions.size(); } + inline float labelPosition(int index) { return m_adjustedLabelPositions.at(index); } + inline int labelCount() { return m_adjustedLabelPositions.size(); } + void updateAllPositions(); + inline bool positionsDirty() const { return m_positionsDirty; } + inline void setTranslate(float translate) { m_translate = translate; m_positionsDirty = true; } + inline float translate() { return m_translate; } + inline void setScale(float scale) { m_scale = scale; m_positionsDirty = true; } + inline float scale() { return m_scale; } + inline float positionAt(float value) + { + return m_formatter->positionAt(value) * m_scale + m_translate; + } public slots: void updateTextures(); private: - void updateSegmentStep(); - void updateSubSegmentStep(); int maxLabelWidth(const QStringList &labels) const; // Cached axis values @@ -96,8 +112,11 @@ private: Drawer *m_drawer; // Not owned LabelItem m_titleItem; QList m_labelItems; - GLfloat m_segmentStep; - GLfloat m_subSegmentStep; + QVector m_adjustedGridLinePositions; + QVector m_adjustedLabelPositions; + bool m_positionsDirty; + float m_translate; + float m_scale; Q_DISABLE_COPY(AxisRenderCache) }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 3a685c91..f0a5e3d4 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -84,7 +84,7 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_maxSceneSize(40.0f), m_visualSelectedBarPos(Bars3DController::invalidSelectionPosition()), m_visualSelectedBarSeriesIndex(-1), - m_hasHeightAdjustmentChanged(true), + m_resetCameraBaseOrientation(true), m_selectedBarPos(Bars3DController::invalidSelectionPosition()), m_selectedBarSeries(0), m_noZeroInRange(false), @@ -95,6 +95,8 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_clickedPosition(Bars3DController::invalidSelectionPosition()), m_keepSeriesUniform(false) { + m_axisCacheY.setScale(2.0f); + initializeOpenGLFunctions(); initializeOpenGL(); } @@ -187,6 +189,8 @@ void Bars3DRenderer::updateData() calculateSceneScalingFactors(); } + const QValue3DAxisFormatter *axisFormatter = m_axisCacheY.formatter(); + float zeroPosition = axisFormatter->positionAt(0.0f); for (int series = 0; series < seriesCount; series++) { BarRenderItemArray &renderArray = m_renderingArrays[series]; if (newRows != renderArray.size() @@ -215,22 +219,22 @@ void Bars3DRenderer::updateData() int dataColIndex = minCol; for (; j < updateSize ; j++) { float value = dataRow->at(dataColIndex).value(); - if (!m_noZeroInRange) { - heightValue = GLfloat(value); - } else { - // Adjust height to range - if (!m_hasNegativeValues) { - heightValue = value - m_axisCacheY.min(); - if (heightValue < 0.0f) - heightValue = 0.0f; - } else if (m_axisCacheY.max() < 0.0f) { - heightValue = value - m_axisCacheY.max(); + heightValue = axisFormatter->positionAt(value); + if (m_noZeroInRange) { + if (m_hasNegativeValues) { + heightValue = -1.0f + heightValue; if (heightValue > 0.0f) heightValue = 0.0f; + } else { + if (heightValue < 0.0f) + heightValue = 0.0f; } + } else { + heightValue -= zeroPosition; } renderRow[j].setValue(value); - renderRow[j].setHeight(heightValue / m_heightNormalizer); + renderRow[j].setHeight(heightValue); + float angle = dataRow->at(dataColIndex).rotation(); if (angle) { renderRow[j].setRotation( @@ -263,12 +267,12 @@ void Bars3DRenderer::updateScene(Q3DScene *scene) else scene->activeCamera()->d_ptr->setMinYRotation(0.0f); - if (m_hasHeightAdjustmentChanged) { + if (m_resetCameraBaseOrientation) { // Set initial camera position. Also update if height adjustment has changed. scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector, zeroVector, upVector); - m_hasHeightAdjustmentChanged = false; + m_resetCameraBaseOrientation = false; } Abstract3DRenderer::updateScene(scene); @@ -281,6 +285,9 @@ void Bars3DRenderer::render(GLuint defaultFboHandle) // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); + if (m_axisCacheY.positionsDirty()) + m_axisCacheY.updateAllPositions(); + drawScene(defaultFboHandle); if (m_cachedIsSlicingActivated) drawSlicedScene(); @@ -323,6 +330,7 @@ void Bars3DRenderer::drawSlicedScene() bool itemMode = m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem); GLfloat barPosYAdjustment = -0.8f; // Translate to -1.0 + 0.2 for row/column labels + GLfloat gridAdjustment = 1.0f + barPosYAdjustment - m_negativeBackgroundAdjustment; GLfloat scaleFactor = 0.0f; if (rowMode) scaleFactor = (1.1f * m_rowWidth) / m_scaleFactor; @@ -356,20 +364,18 @@ void Bars3DRenderer::drawSlicedScene() lineShader->setUniformValue(lineShader->lightS(), 0.0f); lineShader->setUniformValue(lineShader->lightColor(), lightColor); - GLfloat gridStep = (2.0f * m_axisCacheY.subSegmentStep()) / m_heightNormalizer; - GLfloat gridPos = barPosYAdjustment; - int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); - // Use the position of the bottom grid line as the base y position for bar labels - // Horizontal lines if (m_axisCacheY.segmentCount() > 0) { + int gridLineCount = m_axisCacheY.gridLineCount(); + QVector3D gridLineScale(scaleFactor, gridLineWidth, gridLineWidth); bool noZero = true; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; + GLfloat gridPos = m_axisCacheY.gridLinePosition(line) + gridAdjustment; modelMatrix.translate(0.0f, gridPos, 0.0f); modelMatrix.scale(gridLineScale); itModelMatrix = modelMatrix; @@ -391,8 +397,6 @@ void Bars3DRenderer::drawSlicedScene() // Check if we have a line at zero position already if (gridPos == (barPosYAdjustment + zeroPosAdjustment)) noZero = false; - - gridPos += gridStep; } // Draw a line at zero, if none exists @@ -431,14 +435,13 @@ void Bars3DRenderer::drawSlicedScene() // Draw grid labels int labelNbr = 0; int labelCount = m_axisCacheY.labels().size(); - gridStep = (2.0f * m_axisCacheY.segmentStep()) / m_heightNormalizer; - gridPos = barPosYAdjustment; QVector3D backLabelRotation(0.0f, 0.0f, 0.0f); QVector3D labelTrans = QVector3D(scaleFactor + labelMargin, 0.0f, 0.0f); for (int i = 0; i < labelCount; i++) { if (m_axisCacheY.labelItems().size() > labelNbr) { const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); + GLfloat gridPos = m_axisCacheY.labelPosition(i) + gridAdjustment; labelTrans.setY(gridPos); m_dummyBarRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, @@ -447,7 +450,6 @@ void Bars3DRenderer::drawSlicedScene() activeCamera, true, true, Drawer::LabelMid, Qt::AlignRight); } labelNbr++; - gridPos += gridStep; } glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); @@ -645,8 +647,9 @@ void Bars3DRenderer::drawSlicedScene() if (item.height() != 0.0f || (!m_noZeroInRange && item.value() == 0.0f)) { // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { - item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item.value())); + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + item.value(), m_axisCacheY.labelFormat()); + item.setSliceLabel(valueLabelText); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } @@ -670,8 +673,9 @@ void Bars3DRenderer::drawSlicedScene() && item.seriesIndex() == m_visualSelectedBarSeriesIndex) { // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { - item.setSliceLabel(generateValueLabel(m_axisCacheY.labelFormat(), - item.value())); + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + item.value(), m_axisCacheY.labelFormat()); + item.setSliceLabel(valueLabelText); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } @@ -1336,12 +1340,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; QVector3D backgroundScaler(rowScaleFactor, 1.0f, columnScaleFactor); - if (m_hasNegativeValues) { - backgroundScaler.setY(0.5f); - modelMatrix.translate(0.0f, m_negativeBackgroundAdjustment, 0.0f); - } else { - modelMatrix.translate(0.0f, 1.0f, 0.0f); - } + modelMatrix.translate(0.0f, m_negativeBackgroundAdjustment, 0.0f); + modelMatrix.scale(backgroundScaler); itModelMatrix.scale(backgroundScaler); modelMatrix.rotate(backgroundRotation, 0.0f, 1.0f, 0.0f); @@ -1434,7 +1434,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_TEXTURE_2D); // Draw grid lines - if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { + if (m_cachedTheme->isGridEnabled()) { #if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; #else @@ -1559,30 +1559,20 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_axisCacheY.segmentCount() > 0) { // Wall lines: back wall - GLfloat heightStep = m_axisCacheY.subSegmentStep(); - GLfloat startLine = 0.0f; - int segmentCount = m_axisCacheY.segmentCount() * m_axisCacheY.subSegmentCount(); + int gridLineCount = m_axisCacheY.gridLineCount(); GLfloat zWallLinePosition = -columnScaleFactor + gridLineOffset; if (m_zFlipped) zWallLinePosition = -zWallLinePosition; - if (m_hasNegativeValues) { - if (m_noZeroInRange) - startLine = m_axisCacheY.min() - m_axisCacheY.max(); - else - startLine = m_axisCacheY.min(); - } - - GLfloat lineHeight = startLine; gridLineScaler = QVector3D(rowScaleFactor, gridLineWidth, gridLineWidth); - for (int segment = 0; segment <= segmentCount; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; modelMatrix.translate(0.0f, - 2.0f * lineHeight / m_heightNormalizer, + m_axisCacheY.gridLinePosition(line), zWallLinePosition); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1613,7 +1603,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - lineHeight += heightStep; } // Wall lines: side wall @@ -1626,15 +1615,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) else lineRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); - lineHeight = startLine; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, columnScaleFactor); - for (int segment = 0; segment <= segmentCount; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; modelMatrix.translate(xWallLinePosition, - 2.0f * lineHeight / m_heightNormalizer, + m_axisCacheY.gridLinePosition(line), 0.0f); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1663,7 +1651,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - lineHeight += heightStep; } } } @@ -1678,16 +1665,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Y Labels int labelNbr = 0; - GLfloat heightStep = m_axisCacheY.segmentStep(); - GLfloat startLine = 0.0f; int labelCount = m_axisCacheY.labels().size(); - if (m_hasNegativeValues) { - if (m_noZeroInRange) - startLine = m_axisCacheY.min() - m_axisCacheY.max(); - else - startLine = m_axisCacheY.min(); - } - GLfloat labelPos = startLine; GLfloat labelMarginXTrans = labelMargin; GLfloat labelMarginZTrans = labelMargin; GLfloat labelXTrans = rowScaleFactor; @@ -1715,7 +1693,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) for (int i = 0; i < labelCount; i++) { if (m_axisCacheY.labelItems().size() > labelNbr) { - backLabelTrans.setY(2.0f * labelPos / m_heightNormalizer); + backLabelTrans.setY(m_axisCacheY.labelPosition(i)); sideLabelTrans.setY(backLabelTrans.y()); glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); @@ -1737,7 +1715,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) true, true, Drawer::LabelMid, sideAlignment); } labelNbr++; - labelPos += heightStep; } // Calculate the positions for row and column labels and store them @@ -1844,9 +1821,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) static const QString seriesNameTag(QStringLiteral("@seriesName")); // Custom format expects printf format specifier. There is no tag for it. - labelText = generateValueLabel( - m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat(), - selectedBar->value()); + labelText = m_axisCacheY.formatter()->stringForValue( + selectedBar->value(), + m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat()); int selBarPosRow = selectedBar->position().x(); int selBarPosCol = selectedBar->position().y(); @@ -1865,10 +1842,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) labelText.replace(valueTitleTag, m_axisCacheY.title()); if (labelText.contains(valueLabelTag)) { - QString labelFormat = m_axisCacheY.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, selectedBar->value()); + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + selectedBar->value(), m_axisCacheY.labelFormat()); labelText.replace(valueLabelTag, valueLabelText); } @@ -1945,7 +1920,6 @@ void Bars3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientatio Abstract3DRenderer::updateAxisRange(orientation, min, max); if (orientation == QAbstract3DAxis::AxisOrientationY) { - calculateHeightAdjustment(); // Check if we have negative values if (min < 0 && !m_hasNegativeValues) { m_hasNegativeValues = true; @@ -1958,6 +1932,7 @@ void Bars3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientatio loadBackgroundMesh(); emit needRender(); } + calculateHeightAdjustment(); } } @@ -2100,7 +2075,7 @@ void Bars3DRenderer::calculateSceneScalingFactors() void Bars3DRenderer::calculateHeightAdjustment() { - GLfloat newAdjustment = 0.0f; + GLfloat newAdjustment = 1.0f; GLfloat maxAbs = qFabs(m_axisCacheY.max()); if (m_axisCacheY.max() < 0.0f) { @@ -2111,7 +2086,8 @@ void Bars3DRenderer::calculateHeightAdjustment() } // Height fractions are used in gradient calculations and are therefore doubled - if (m_axisCacheY.max() < 0.0f || m_axisCacheY.min() > 0.0f) { + // Note that if max or min is exactly zero, we still consider it outside the range + if (m_axisCacheY.max() <= 0.0f || m_axisCacheY.min() >= 0.0f) { m_noZeroInRange = true; m_gradientFraction = 2.0f; } else { @@ -2121,11 +2097,12 @@ void Bars3DRenderer::calculateHeightAdjustment() } // Calculate translation adjustment for negative background - newAdjustment = qBound(0.0f, (maxAbs / m_heightNormalizer), 1.0f) * 2.0f - 0.5f; + if (m_hasNegativeValues) + newAdjustment = (qBound(0.0f, (maxAbs / m_heightNormalizer), 1.0f) - 0.5f) * 2.0f; if (newAdjustment != m_negativeBackgroundAdjustment) { - m_hasHeightAdjustmentChanged = true; m_negativeBackgroundAdjustment = newAdjustment; + m_axisCacheY.setTranslate(m_negativeBackgroundAdjustment - 1.0f); } } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 37ac2b76..2c0417e4 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -96,7 +96,7 @@ private: GLfloat m_maxSceneSize; QPoint m_visualSelectedBarPos; int m_visualSelectedBarSeriesIndex; - bool m_hasHeightAdjustmentChanged; + bool m_resetCameraBaseOrientation; QPoint m_selectedBarPos; const QBar3DSeries *m_selectedBarSeries; BarRenderItem m_dummyBarRenderItem; diff --git a/src/datavisualization/engine/meshes/backgroundNegatives.obj b/src/datavisualization/engine/meshes/backgroundNegatives.obj index d314e1fc..0b94617f 100644 --- a/src/datavisualization/engine/meshes/backgroundNegatives.obj +++ b/src/datavisualization/engine/meshes/backgroundNegatives.obj @@ -4,9 +4,9 @@ o Cube v 1.000000 1.000000 1.000000 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 -v 1.000000 -3.000000 1.000000 -v -1.000000 -3.000000 1.000000 -v -1.000000 -3.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 vt 0.000000 0.000000 vt 0.500000 0.000000 vt 0.500000 1.000000 diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 38e48cc2..ae4b3831 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -48,7 +48,6 @@ const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will const GLfloat labelMargin = 0.05f; const GLfloat defaultMinSize = 0.01f; const GLfloat defaultMaxSize = 0.1f; -const GLfloat defaultMargin = 1.0f + defaultMaxSize; // Default margin for background const GLfloat itemScaler = 3.0f; const GLfloat gridLineWidth = 0.005f; @@ -90,10 +89,13 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), - m_backgroundMargin(defaultMargin), + m_backgroundMargin(defaultMaxSize), m_maxItemSize(0.0f), m_clickedIndex(Scatter3DController::invalidSelectionIndex()) { + m_axisCacheY.setScale(2.0f); + m_axisCacheY.setTranslate(-1.0f); + initializeOpenGLFunctions(); initializeOpenGL(); } @@ -176,10 +178,11 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis if (m_cachedItemSize.at(series) != itemSize) m_cachedItemSize[series] = itemSize; } - m_backgroundMargin = defaultMargin; m_maxItemSize = maxItemSize; if (maxItemSize > defaultMaxSize) - m_backgroundMargin += maxItemSize / itemScaler; + m_backgroundMargin = maxItemSize / itemScaler; + else + m_backgroundMargin = defaultMaxSize; } void Scatter3DRenderer::updateData() @@ -255,6 +258,13 @@ void Scatter3DRenderer::render(GLuint defaultFboHandle) // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); + if (m_axisCacheX.positionsDirty()) + m_axisCacheX.updateAllPositions(); + if (m_axisCacheY.positionsDirty()) + m_axisCacheY.updateAllPositions(); + if (m_axisCacheZ.positionsDirty()) + m_axisCacheZ.updateAllPositions(); + // Draw dots scene drawScene(defaultFboHandle); } @@ -776,17 +786,17 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor; - GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height()) / m_scaleFactor; + GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; + GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; if (m_maxItemSize > zScale) zScale = m_maxItemSize; - QVector3D bgScale(xScale, m_backgroundMargin, zScale); + QVector3D bgScale(xScale, 1.0f + m_backgroundMargin, zScale); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D bgScale((aspectRatio * m_backgroundMargin), - m_backgroundMargin, - (aspectRatio * m_backgroundMargin)); + QVector3D bgScale((aspectRatio + m_backgroundMargin), + 1.0f + m_backgroundMargin, + (aspectRatio + m_backgroundMargin)); #endif modelMatrix.scale(bgScale); // If we're viewing from below, background object must be flipped @@ -845,15 +855,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glDisable(GL_TEXTURE_2D); // Draw grid lines -#ifdef USE_UNIFORM_SCALING - AxisRenderCache *axisCacheMax; - if (m_axisCacheZ.max() > m_axisCacheX.max()) - axisCacheMax = &m_axisCacheZ; - else - axisCacheMax = &m_axisCacheX; -#endif - - if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { + if (m_cachedTheme->isGridEnabled()) { #if !(defined QT_OPENGL_ES_2) ShaderHelper *lineShader = m_backgroundShader; #else @@ -897,39 +899,31 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) else lineXRotation = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, -90.0f); - GLfloat yFloorLinePosition = -m_backgroundMargin + gridLineOffset; + GLfloat yFloorLinePosition = -1.0f - m_backgroundMargin + gridLineOffset; if (m_yFlipped) yFloorLinePosition = -yFloorLinePosition; // Rows (= Z) if (m_axisCacheZ.segmentCount() > 0) { // Floor lines -#ifndef USE_UNIFORM_SCALING - GLfloat lineStep = aspectRatio * m_axisCacheZ.subSegmentStep(); - GLfloat linePos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); // Start line - int lastSegment = m_axisCacheZ.subSegmentCount() * m_axisCacheZ.segmentCount(); -#else - GLfloat lineStep = aspectRatio * axisCacheMax->subSegmentStep(); - GLfloat linePos = -aspectRatio * m_scaleFactor; // Start line - int lastSegment = axisCacheMax->subSegmentCount() * axisCacheMax->segmentCount(); -#endif + int gridLineCount = m_axisCacheZ.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor; + GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D gridLineScaler((aspectRatio * m_backgroundMargin), + QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, yFloorLinePosition, linePos / m_scaleFactor); + modelMatrix.translate(0.0f, yFloorLinePosition, m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -959,30 +953,27 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos -= lineStep; } // Side wall lines - gridLineScaler = QVector3D(gridLineWidth, m_backgroundMargin, gridLineWidth); + gridLineScaler = QVector3D(gridLineWidth, 1.0f + m_backgroundMargin, gridLineWidth); #ifndef USE_UNIFORM_SCALING - GLfloat lineXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width()) - / m_scaleFactor - gridLineOffset; + GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; - linePos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); // Start line #else - GLfloat lineXTrans = aspectRatio * m_backgroundMargin - gridLineOffset; - linePos = -aspectRatio * m_scaleFactor; // Start line + GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_xFlipped) lineXTrans = -lineXTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(lineXTrans, 0.0f, linePos / m_scaleFactor); + modelMatrix.translate(lineXTrans, 0.0f, m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1017,7 +1008,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos -= lineStep; } } @@ -1027,28 +1017,24 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineXRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); #endif // Floor lines + int gridLineCount = m_axisCacheX.gridLineCount(); + #ifndef USE_UNIFORM_SCALING - GLfloat lineStep = aspectRatio * m_axisCacheX.subSegmentStep(); - GLfloat linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x()); - int lastSegment = m_axisCacheX.subSegmentCount() * m_axisCacheX.segmentCount(); - GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height()) / m_scaleFactor; + GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; QVector3D gridLineScaler(gridLineWidth, gridLineWidth, zScale); #else - GLfloat lineStep = aspectRatio * axisCacheMax->subSegmentStep(); - GLfloat linePos = -aspectRatio * m_scaleFactor; - int lastSegment = axisCacheMax->subSegmentCount() * axisCacheMax->segmentCount(); QVector3D gridLineScaler(gridLineWidth, gridLineWidth, - aspectRatio * m_backgroundMargin); + aspectRatio + m_backgroundMargin); #endif - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(linePos / m_scaleFactor, yFloorLinePosition, 0.0f); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, 0.0f); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1078,31 +1064,28 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } // Back wall lines #ifndef USE_UNIFORM_SCALING - GLfloat lineZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height()) - / m_scaleFactor - gridLineOffset; + GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; - linePos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x()); #else - GLfloat lineZTrans = aspectRatio * m_backgroundMargin - gridLineOffset; - linePos = -aspectRatio * m_scaleFactor; + GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_zFlipped) lineZTrans = -lineZTrans; - gridLineScaler = QVector3D(gridLineWidth, m_backgroundMargin, gridLineWidth); + gridLineScaler = QVector3D(gridLineWidth, 1.0f + m_backgroundMargin, gridLineWidth); - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(linePos / m_scaleFactor, 0.0f, lineZTrans); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), 0.0f, lineZTrans); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1139,40 +1122,37 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } } // Horizontal wall lines if (m_axisCacheY.segmentCount() > 0) { // Back wall - GLfloat lineStep = m_axisCacheY.subSegmentStep(); - GLfloat linePos = m_axisCacheY.min() - m_translationOffset.y(); - int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); + int gridLineCount = m_axisCacheY.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height()) - / m_scaleFactor - gridLineOffset; + GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; - GLfloat xScale = (aspectRatio * m_backgroundMargin * m_areaSize.width()) / m_scaleFactor; + GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineZTrans = aspectRatio * m_backgroundMargin - gridLineOffset; - QVector3D gridLineScaler((aspectRatio * m_backgroundMargin), + GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif if (!m_zFlipped) lineZTrans = -lineZTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, linePos / m_heightNormalizer, lineZTrans); + modelMatrix.translate(0.0f, m_axisCacheY.gridLinePosition(line), lineZTrans); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1204,36 +1184,33 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } // Side wall - linePos = m_axisCacheY.min() - m_translationOffset.y(); - lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width()) - / m_scaleFactor - gridLineOffset; + GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; - GLfloat zScale = (aspectRatio * m_backgroundMargin * m_areaSize.height()) - / m_scaleFactor; + GLfloat zScale = (aspectRatio * m_areaSize.height()) + / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, zScale); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineXTrans = aspectRatio * m_backgroundMargin - gridLineOffset; + GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, - aspectRatio * m_backgroundMargin); + aspectRatio + m_backgroundMargin); #endif if (!m_xFlipped) lineXTrans = -lineXTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(lineXTrans, linePos / m_heightNormalizer, 0.0f); + modelMatrix.translate(lineXTrans, m_axisCacheY.gridLinePosition(line), 0.0f); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1263,13 +1240,11 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } } } // Draw axis labels - // Bind label shader m_labelShader->bind(); glEnable(GL_TEXTURE_2D); @@ -1279,22 +1254,17 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Z Labels if (m_axisCacheZ.segmentCount() > 0) { + int labelCount = m_axisCacheZ.labelItems().size(); #ifndef USE_UNIFORM_SCALING - GLfloat posStep = aspectRatio * m_axisCacheZ.segmentStep(); - GLfloat labelPos = -aspectRatio * (m_axisCacheZ.min() - m_translationOffset.z()); - int lastSegment = m_axisCacheZ.segmentCount(); - GLfloat labelXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width()) - / m_scaleFactor + labelMargin; + GLfloat labelXTrans = (aspectRatio * m_areaSize.width()) + / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize + labelMargin; #else - GLfloat posStep = aspectRatio * axisCacheMax->segmentStep(); - GLfloat labelPos = aspectRatio * m_scaleFactor; - int lastSegment = axisCacheMax->segmentCount(); - GLfloat labelXTrans = aspectRatio * m_backgroundMargin + labelMargin; + GLfloat labelXTrans = aspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; - GLfloat labelYTrans = -m_backgroundMargin; + GLfloat labelYTrans = -1.0f - m_backgroundMargin; GLfloat rotLabelX = -90.0f; GLfloat rotLabelY = 0.0f; GLfloat rotLabelZ = 0.0f; @@ -1312,23 +1282,15 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } QVector3D labelRotateVector(rotLabelX, rotLabelY, rotLabelZ); QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); - for (int segment = 0; segment <= lastSegment; segment++) { -#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z + for (int label = 0; label < labelCount; label++) { if (m_axisCacheZ.labelItems().size() > labelNbr) { -#else // ..and this if we want uniform scaling based on largest dimension - if (axisCacheMax->labelItems().size() > labelNbr) { -#endif - labelTrans.setZ(labelPos / m_scaleFactor); + labelTrans.setZ(m_axisCacheZ.labelPosition(label)); - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Draw the label here m_dummyRenderItem.setTranslation(labelTrans); -#ifndef USE_UNIFORM_SCALING const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); -#else - const LabelItem &axisLabelItem = *axisCacheMax->labelItems().at(labelNbr); -#endif m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, @@ -1336,27 +1298,21 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) Drawer::LabelMid, alignment); } labelNbr++; - labelPos -= posStep; } } // X Labels if (m_axisCacheX.segmentCount() > 0) { + int labelCount = m_axisCacheX.labelItems().size(); #ifndef USE_UNIFORM_SCALING - GLfloat posStep = aspectRatio * m_axisCacheX.segmentStep(); - GLfloat labelPos = aspectRatio * (m_axisCacheX.min() - m_translationOffset.x()); - int lastSegment = m_axisCacheX.segmentCount(); - GLfloat labelZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height()) - / m_scaleFactor + labelMargin; + GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize + labelMargin; #else - GLfloat posStep = aspectRatio * axisCacheMax->segmentStep(); - GLfloat labelPos = -aspectRatio * m_scaleFactor; - int lastSegment = axisCacheMax->segmentCount(); - GLfloat labelZTrans = aspectRatio * m_backgroundMargin + labelMargin; + GLfloat labelZTrans = aspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; - GLfloat labelYTrans = -m_backgroundMargin; + GLfloat labelYTrans = -1.0f - m_backgroundMargin; GLfloat rotLabelX = -90.0f; GLfloat rotLabelY = 90.0f; GLfloat rotLabelZ = 0.0f; @@ -1374,23 +1330,15 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } QVector3D labelRotateVector(rotLabelX, rotLabelY, rotLabelZ); QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); - for (int segment = 0; segment <= lastSegment; segment++) { -#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z + for (int label = 0; label < labelCount; label++) { if (m_axisCacheX.labelItems().size() > labelNbr) { -#else // ..and this if we want uniform scaling based on largest dimension - if (axisCacheMax->labelItems().size() > labelNbr) { -#endif - labelTrans.setX(labelPos / m_scaleFactor); + labelTrans.setX(m_axisCacheX.labelPosition(label)); - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Draw the label here m_dummyRenderItem.setTranslation(labelTrans); -#ifndef USE_UNIFORM_SCALING const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); -#else - const LabelItem &axisLabelItem = *axisCacheMax->labelItems().at(labelNbr); -#endif m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, @@ -1398,25 +1346,23 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) Drawer::LabelMid, alignment); } labelNbr++; - labelPos += posStep; } } // Y Labels if (m_axisCacheY.segmentCount() > 0) { - GLfloat posStep = m_axisCacheY.segmentStep(); - GLfloat labelPos = m_axisCacheY.min() - m_translationOffset.y(); + int labelCount = m_axisCacheY.labelItems().size(); int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat labelXTrans = (aspectRatio * m_backgroundMargin * m_areaSize.width()) - / m_scaleFactor; - GLfloat labelZTrans = (aspectRatio * m_backgroundMargin * m_areaSize.height()) - / m_scaleFactor; + GLfloat labelXTrans = (aspectRatio* m_areaSize.width()) + / m_scaleFactor + m_backgroundMargin; + GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize; #else // ..and this if we want uniform scaling based on largest dimension - GLfloat labelXTrans = aspectRatio * m_backgroundMargin; + GLfloat labelXTrans = aspectRatio + m_backgroundMargin; GLfloat labelZTrans = labelXTrans; #endif // Back wall init @@ -1453,12 +1399,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QVector3D labelRotateVectorSide(rotLabelX, rotLabelY, rotLabelZ); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); - for (int segment = 0; segment <= m_axisCacheY.segmentCount(); segment++) { + for (int label = 0; label < labelCount; label++) { if (m_axisCacheY.labelItems().size() > labelNbr) { const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); - const GLfloat labelYTrans = labelPos / m_heightNormalizer; + const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Back wall labelTransBack.setY(labelYTrans); @@ -1477,7 +1423,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) Drawer::LabelMid, alignmentSide); } labelNbr++; - labelPos += posStep; } } glDisable(GL_POLYGON_OFFSET_FILL); @@ -1509,30 +1454,22 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) labelText.replace(zTitleTag, m_axisCacheZ.title()); if (labelText.contains(xLabelTag)) { - QString labelFormat = m_axisCacheX.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, - selectedItem->position().x()); + QString valueLabelText = m_axisCacheX.formatter()->stringForValue( + selectedItem->position().x(), m_axisCacheX.labelFormat()); labelText.replace(xLabelTag, valueLabelText); } if (labelText.contains(yLabelTag)) { - QString labelFormat = m_axisCacheY.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, - selectedItem->position().y()); + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + selectedItem->position().y(), m_axisCacheY.labelFormat()); labelText.replace(yLabelTag, valueLabelText); } if (labelText.contains(zLabelTag)) { - QString labelFormat = m_axisCacheZ.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, - selectedItem->position().z()); + QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( + selectedItem->position().z(), m_axisCacheZ.labelFormat()); labelText.replace(zLabelTag, valueLabelText); } - labelText.replace(seriesNameTag, m_visibleSeriesList[m_selectedItemSeriesIndex].name()); + labelText.replace(seriesNameTag, + m_visibleSeriesList[m_selectedItemSeriesIndex].name()); setSelectionLabel(labelText); m_selectionLabelDirty = false; @@ -1671,11 +1608,10 @@ void Scatter3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Me void Scatter3DRenderer::calculateTranslation(ScatterRenderItem &item) { // We need to normalize translations - GLfloat xTrans = (aspectRatio * (item.position().x() - m_translationOffset.x())) - / m_scaleFactor; - GLfloat zTrans = -(aspectRatio * (item.position().z() - m_translationOffset.z())) - / m_scaleFactor; - GLfloat yTrans = (item.position().y() - m_translationOffset.y()) / m_heightNormalizer; + const QVector3D &pos = item.position(); + float xTrans = m_axisCacheX.positionAt(pos.x()); + float yTrans = m_axisCacheY.positionAt(pos.y()); + float zTrans = m_axisCacheZ.positionAt(pos.z()); item.setTranslation(QVector3D(xTrans, yTrans, zTrans)); } @@ -1686,10 +1622,16 @@ void Scatter3DRenderer::calculateSceneScalingFactors() m_areaSize.setWidth((m_axisCacheX.max() - m_axisCacheX.min()) / 2.0f); m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); - // Calculate translation offsets - m_translationOffset = QVector3D((m_axisCacheX.max() + m_axisCacheX.min()) / 2.0f, - (m_axisCacheY.max() + m_axisCacheY.min()) / 2.0f, - (m_axisCacheZ.max() + m_axisCacheZ.min()) / 2.0f); +#ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z + float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + m_axisCacheX.setScale(factorScaler * m_areaSize.width()); + m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); +#else // ..and this if we want uniform scaling based on largest dimension + m_axisCacheX.setScale(2.0f * aspectRatio); + m_axisCacheZ.setScale(-m_axisCacheX.scale()); +#endif + m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); + m_axisCacheZ.setTranslate(-m_axisCacheZ.scale() / 2.0f); } void Scatter3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 243c27de..ed99e49e 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -41,7 +41,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define SHOW_DEPTH_TEXTURE_SCENE const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. -const GLfloat backgroundMargin = 1.1f; // Margin for background (1.1f = make it 10% larger to avoid items being drawn inside background) +const GLfloat backgroundMargin = 1.1f; // Margin for background (1.10 make it 10% larger to avoid + // selection ball being drawn inside background) const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; const GLfloat sliceZScale = 0.1f; @@ -96,6 +97,9 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_selectionTexturesDirty(false), m_noShadowTexture(0) { + m_axisCacheY.setScale(2.0f); + m_axisCacheY.setTranslate(-1.0f); + // Check if flat feature is supported ShaderHelper tester(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), QStringLiteral(":/shaders/fragmentSurfaceFlat")); @@ -196,7 +200,7 @@ void Surface3DRenderer::updateData() // Need minimum of 2x2 array to draw a surface if (array.size() >= 2 && array.at(0)->size() >= 2) { - QRect sampleSpace = calculateSampleRect(cache, array); + QRect sampleSpace = calculateSampleRect(array); QSurfaceDataArray &dataArray = cache->dataArray(); bool dimensionChanged = false; @@ -259,7 +263,7 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis QSurface3DSeries *surfaceSeries = static_cast(series); SurfaceSeriesRenderCache *cache = m_renderCacheList.value(surfaceSeries); if (!cache) { - cache = new SurfaceSeriesRenderCache; + cache = new SurfaceSeriesRenderCache(this); m_renderCacheList[surfaceSeries] = cache; m_selectionTexturesDirty = true; @@ -341,15 +345,10 @@ void Surface3DRenderer::updateRows(const QVector srcArray->at(row)->at(j + sampleSpace.x()); } - if (cache->isFlatShadingEnabled()) { - cache->surfaceObject()->updateCoarseRow(dstArray, row - sampleSpace.y(), - m_heightNormalizer, - m_axisCacheY.min()); - } else { - cache->surfaceObject()->updateSmoothRow(dstArray, row - sampleSpace.y(), - m_heightNormalizer, - m_axisCacheY.min()); - } + if (cache->isFlatShadingEnabled()) + cache->surfaceObject()->updateCoarseRow(dstArray, row - sampleSpace.y()); + else + cache->surfaceObject()->updateSmoothRow(dstArray, row - sampleSpace.y()); } if (updateBuffers) cache->surfaceObject()->uploadBuffers(); @@ -385,13 +384,10 @@ void Surface3DRenderer::updateItem(const QVectorat(point.y())->at(point.x()); - if (cache->isFlatShadingEnabled()) { - cache->surfaceObject()->updateCoarseItem(dstArray, y, x, m_heightNormalizer, - m_axisCacheY.min()); - } else { - cache->surfaceObject()->updateSmoothItem(dstArray, y, x, m_heightNormalizer, - m_axisCacheY.min()); - } + if (cache->isFlatShadingEnabled()) + cache->surfaceObject()->updateCoarseItem(dstArray, y, x); + else + cache->surfaceObject()->updateSmoothItem(dstArray, y, x); } if (updateBuffers) cache->surfaceObject()->uploadBuffers(); @@ -407,10 +403,17 @@ void Surface3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orienta { Abstract3DRenderer::updateAxisRange(orientation, min, max); - if (orientation == QAbstract3DAxis::AxisOrientationY) { - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) - cache->setObjectDirty(true); - } + foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) + cache->setObjectDirty(true); +} + +void Surface3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, + QValue3DAxisFormatter *formatter) +{ + Abstract3DRenderer::updateAxisFormatter(orientation, formatter); + + foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) + cache->setObjectDirty(true); } void Surface3DRenderer::updateSliceDataModel(const QPoint &point) @@ -556,19 +559,27 @@ void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const QSurfaceDataRow *sliceRow; QSurfaceDataArray &dataArray = cache->dataArray(); float adjust = (0.025f * m_heightNormalizer) / 2.0f; - float stepDown = 2.0f * adjust; + float doubleAdjust = 2.0f * adjust; + bool flipZX = false; + float zBack; + float zFront; if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) { QSurfaceDataRow *src = dataArray.at(row); sliceRow = new QSurfaceDataRow(src->size()); + zBack = m_axisCacheZ.min(); + zFront = m_axisCacheZ.max(); for (int i = 0; i < sliceRow->size(); i++) - (*sliceRow)[i].setPosition(QVector3D(src->at(i).x(), src->at(i).y() + adjust, -1.0f)); + (*sliceRow)[i].setPosition(QVector3D(src->at(i).x(), src->at(i).y() + adjust, zFront)); } else { + flipZX = true; const QRect &sampleSpace = cache->sampleSpace(); sliceRow = new QSurfaceDataRow(sampleSpace.height()); + zBack = m_axisCacheX.min(); + zFront = m_axisCacheX.max(); for (int i = 0; i < sampleSpace.height(); i++) { (*sliceRow)[i].setPosition(QVector3D(dataArray.at(i)->at(column).z(), dataArray.at(i)->at(column).y() + adjust, - -1.0f)); + zFront)); } } sliceDataArray << sliceRow; @@ -577,27 +588,21 @@ void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const QSurfaceDataRow *duplicateRow = new QSurfaceDataRow(*sliceRow); for (int i = 0; i < sliceRow->size(); i++) { (*sliceRow)[i].setPosition(QVector3D(sliceRow->at(i).x(), - sliceRow->at(i).y() - stepDown, - 1.0f)); + sliceRow->at(i).y() - doubleAdjust, + zBack)); } sliceDataArray << duplicateRow; QRect sliceRect(0, 0, sliceRow->size(), 2); if (sliceRow->size() > 0) { - if (cache->isFlatShadingEnabled()) { - cache->sliceSurfaceObject()->setUpData(sliceDataArray, sliceRect, - m_heightNormalizer, - m_axisCacheY.min(), true); - } else { - cache->sliceSurfaceObject()->setUpSmoothData(sliceDataArray, sliceRect, - m_heightNormalizer, - m_axisCacheY.min(), true); - } + if (cache->isFlatShadingEnabled()) + cache->sliceSurfaceObject()->setUpData(sliceDataArray, sliceRect, true, flipZX); + else + cache->sliceSurfaceObject()->setUpSmoothData(sliceDataArray, sliceRect, true, flipZX); } } -QRect Surface3DRenderer::calculateSampleRect(SurfaceSeriesRenderCache *cache, - const QSurfaceDataArray &array) +QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) { QRect sampleSpace; @@ -673,17 +678,6 @@ QRect Surface3DRenderer::calculateSampleRect(SurfaceSeriesRenderCache *cache, m_visibleColumnRange = m_maxVisibleColumnValue - m_minVisibleColumnValue; m_visibleRowRange = m_maxVisibleRowValue - m_minVisibleRowValue; - GLfloat surfaceScaleX = m_scaleX * m_visibleColumnRange / m_areaSize.width(); - GLfloat surfaceScaleZ = m_scaleZ * m_visibleRowRange / m_areaSize.height(); - GLfloat axis2XCenterX = axisMinX + axisMaxX; - GLfloat axis2XCenterZ = axisMinZ + axisMaxZ; - GLfloat data2XCenterX = GLfloat(m_minVisibleColumnValue + m_maxVisibleColumnValue); - GLfloat data2XCenterZ = GLfloat(m_minVisibleRowValue + m_maxVisibleRowValue); - GLfloat surfaceOffsetX = m_scaleX * (data2XCenterX - axis2XCenterX) / m_areaSize.width(); - GLfloat surfaceOffsetZ = -m_scaleZ * (data2XCenterZ - axis2XCenterZ) / m_areaSize.height(); - - cache->setScale(QVector3D(surfaceScaleX, 1.0f, surfaceScaleZ)); - cache->setOffset(QVector3D(surfaceOffsetX, 0.0f, surfaceOffsetZ)); return sampleSpace; } @@ -714,6 +708,13 @@ void Surface3DRenderer::render(GLuint defaultFboHandle) // Handle GL state setup for FBO buffers and clearing of the render surface Abstract3DRenderer::render(defaultFboHandle); + if (m_axisCacheX.positionsDirty()) + m_axisCacheX.updateAllPositions(); + if (m_axisCacheY.positionsDirty()) + m_axisCacheY.updateAllPositions(); + if (m_axisCacheZ.positionsDirty()) + m_axisCacheZ.updateAllPositions(); + drawScene(defaultFboHandle); if (m_cachedIsSlicingActivated) drawSlicedScene(); @@ -766,6 +767,7 @@ void Surface3DRenderer::drawSlicedScene() const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); bool rowMode = m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow); + AxisRenderCache &sliceCache = rowMode ? m_axisCacheX : m_axisCacheZ; GLfloat scaleXBackground = 0.0f; @@ -780,24 +782,16 @@ void Surface3DRenderer::drawSlicedScene() drawGrid = true; } - GLfloat scaleX = 0.0f; - GLfloat offset = 0.0f; - if (rowMode) { - scaleX = cache->scale().x(); + if (rowMode) scaleXBackground = m_scaleXWithBackground; - offset = cache->offset().x(); - } else { - scaleX = cache->scale().z(); + else scaleXBackground = m_scaleZWithBackground; - offset = -cache->offset().z(); - } QMatrix4x4 MVPMatrix; QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(offset, 0.0f, 0.0f); - QVector3D scaling(scaleX, 1.0f, sliceZScale); + QVector3D scaling(1.0f, 1.0f, sliceZScale); modelMatrix.scale(scaling); itModelMatrix.scale(scaling); @@ -872,19 +866,16 @@ void Surface3DRenderer::drawSlicedScene() lineShader->setUniformValue(lineShader->lightColor(), lightColor); // Horizontal lines + int gridLineCount = m_axisCacheY.gridLineCount(); if (m_axisCacheY.segmentCount() > 0) { QVector3D gridLineScaleX(scaleXBackground, gridLineWidth, gridLineWidth); - GLfloat lineStep = 2.0f * m_axisCacheY.subSegmentStep() / m_heightNormalizer; - GLfloat linePos = -1.0f; - int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); - - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, linePos, -sliceZScale); + modelMatrix.translate(0.0f, m_axisCacheY.gridLinePosition(line), -1.0f); modelMatrix.scale(gridLineScaleX); itModelMatrix.scale(gridLineScaleX); @@ -903,33 +894,18 @@ void Surface3DRenderer::drawSlicedScene() #else m_drawer->drawLine(lineShader); #endif - - linePos += lineStep; } } // Vertical lines QVector3D gridLineScaleY(gridLineWidth, backgroundMargin, gridLineWidth); - int lastSegment; - GLfloat lineStep; - GLfloat linePos; - if (rowMode) { - lineStep = -2.0f * aspectRatio * m_axisCacheX.subSegmentStep() / m_scaleFactor; - lastSegment = m_axisCacheX.subSegmentCount() * m_axisCacheX.segmentCount(); - linePos = m_scaleX; - } else { - lineStep = -2.0f * aspectRatio * m_axisCacheZ.subSegmentStep() / m_scaleFactor; - lastSegment = m_axisCacheZ.subSegmentCount() * m_axisCacheZ.segmentCount(); - linePos = m_scaleZ; - } - - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(linePos, 0.0f, -sliceZScale); + modelMatrix.translate(sliceCache.gridLinePosition(line), 0.0f, -1.0f); modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); #if (defined QT_OPENGL_ES_2) @@ -951,8 +927,6 @@ void Surface3DRenderer::drawSlicedScene() #else m_drawer->drawLine(lineShader); #endif - - linePos += lineStep; } } @@ -965,16 +939,15 @@ void Surface3DRenderer::drawSlicedScene() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Y Labels to back wall - GLfloat posStep = 2.0f * m_axisCacheY.segmentStep() / m_heightNormalizer; - GLfloat labelPos = -1.0f; int labelNbr = 0; QVector3D positionComp(0.0f, 0.0f, 0.0f); QVector3D rotation(0.0f, 0.0f, 0.0f); - QVector3D labelTrans = QVector3D(scaleXBackground + labelMargin, labelPos, 0.0f); - for (int segment = 0; segment <= m_axisCacheY.segmentCount(); segment++) { + QVector3D labelTrans = QVector3D(scaleXBackground + labelMargin, 0.0f, 0.0f); + int labelCount = m_axisCacheY.labelCount(); + for (int label = 0; label < labelCount; label++) { if (m_axisCacheY.labelItems().size() > labelNbr) { - labelTrans.setY(labelPos); + labelTrans.setY(m_axisCacheY.labelPosition(label)); const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); // Draw the label here @@ -985,40 +958,25 @@ void Surface3DRenderer::drawSlicedScene() true, true, Drawer::LabelMid, Qt::AlignRight, true); } labelNbr++; - labelPos += posStep; } // X Labels to ground - int countLabelItems; - int lastSegment; - if (rowMode) { - posStep = 2.0f * aspectRatio * m_axisCacheX.segmentStep() / m_scaleFactor; - labelPos = -m_scaleX; - lastSegment = m_axisCacheX.segmentCount(); - countLabelItems = m_axisCacheX.labelItems().size(); - } else { - posStep = 2.0f * aspectRatio * m_axisCacheZ.segmentStep() / m_scaleFactor; - labelPos = -m_scaleZ; - lastSegment = m_axisCacheZ.segmentCount(); - countLabelItems = m_axisCacheZ.labelItems().size(); - } + int countLabelItems = sliceCache.labelItems().size(); labelNbr = 0; positionComp.setY(-0.1f); rotation.setZ(-45.0f); labelTrans.setY(-backgroundMargin); - for (int segment = 0; segment <= lastSegment; segment++) { + labelCount = sliceCache.labelCount(); + for (int label = 0; label < labelCount; label++) { if (countLabelItems > labelNbr) { // Draw the label here - labelTrans.setX(labelPos); + labelTrans.setX(sliceCache.labelPosition(label)); m_dummyRenderItem.setTranslation(labelTrans); LabelItem *axisLabelItem; - if (rowMode) - axisLabelItem = m_axisCacheX.labelItems().at(labelNbr); - else - axisLabelItem = m_axisCacheZ.labelItems().at(labelNbr); + axisLabelItem = sliceCache.labelItems().at(labelNbr); m_drawer->drawLabel(m_dummyRenderItem, *axisLabelItem, viewMatrix, projectionMatrix, positionComp, rotation, 0, QAbstract3DGraph::SelectionRow, @@ -1026,23 +984,16 @@ void Surface3DRenderer::drawSlicedScene() false, false, Drawer::LabelBelow, Qt::AlignBottom, true); } labelNbr++; - labelPos += posStep; } // Draw labels for axes AbstractRenderItem *dummyItem(0); positionComp.setY(m_autoScaleAdjustment); - if (rowMode) { - m_drawer->drawLabel(*dummyItem, m_axisCacheX.titleItem(), viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, Drawer::LabelBottom, - Qt::AlignCenter, true); - } else { - m_drawer->drawLabel(*dummyItem, m_axisCacheZ.titleItem(), viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, Drawer::LabelBottom, - Qt::AlignCenter, true); - } + m_drawer->drawLabel(*dummyItem, sliceCache.titleItem(), viewMatrix, projectionMatrix, + positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + m_labelObj, activeCamera, false, false, Drawer::LabelBottom, + Qt::AlignCenter, true); + // Y-axis label labelTrans = QVector3D(-scaleXBackground - labelMargin, 0.0f, 0.0f); m_dummyRenderItem.setTranslation(labelTrans); @@ -1150,8 +1101,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; - modelMatrix.translate(cache->offset()); - modelMatrix.scale(cache->scale()); MVPMatrix = depthProjectionViewMatrix * modelMatrix; cache->setMVPMatrix(MVPMatrix); m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); @@ -1244,9 +1193,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; - modelMatrix.translate(cache->offset()); - modelMatrix.scale(cache->scale()); - MVPMatrix = projectionViewMatrix * modelMatrix; m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); @@ -1293,10 +1239,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(cache->offset()); - modelMatrix.scale(cache->scale()); - itModelMatrix.scale(cache->scale()); - #ifdef SHOW_DEPTH_TEXTURE_SCENE MVPMatrix = depthProjectionViewMatrix * modelMatrix; #else @@ -1508,16 +1450,14 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Rows (= Z) if (m_axisCacheZ.segmentCount() > 0) { // Floor lines - GLfloat lineStep = 2.0f * aspectRatio * m_axisCacheZ.subSegmentStep() / m_scaleFactor; - GLfloat linePos = m_scaleZ; // Start line - int lastSegment = m_axisCacheZ.subSegmentCount() * m_axisCacheZ.segmentCount(); + int gridLineCount = m_axisCacheZ.gridLineCount(); - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, yFloorLinePosition, linePos); + modelMatrix.translate(0.0f, yFloorLinePosition, m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaleX); itModelMatrix.scale(gridLineScaleX); @@ -1547,22 +1487,20 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos -= lineStep; } // Side wall lines GLfloat lineXTrans = m_scaleXWithBackground - gridLineOffset; - linePos = m_scaleZ; // Start line if (!m_xFlipped) lineXTrans = -lineXTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(lineXTrans, 0.0f, linePos); + modelMatrix.translate(lineXTrans, 0.0f, m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); @@ -1597,7 +1535,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos -= lineStep; } } @@ -1607,16 +1544,14 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineXRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 90.0f); #endif // Floor lines - GLfloat lineStep = -2.0f * aspectRatio * m_axisCacheX.subSegmentStep() / m_scaleFactor; - GLfloat linePos = m_scaleX; - int lastSegment = m_axisCacheX.subSegmentCount() * m_axisCacheX.segmentCount(); + int gridLineCount = m_axisCacheX.gridLineCount(); - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(linePos, yFloorLinePosition, 0.0f); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, 0.0f); modelMatrix.scale(gridLineScaleZ); itModelMatrix.scale(gridLineScaleZ); @@ -1646,22 +1581,20 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } // Back wall lines GLfloat lineZTrans = m_scaleZWithBackground - gridLineOffset; - linePos = m_scaleX; if (!m_zFlipped) lineZTrans = -lineZTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(linePos, 0.0f, lineZTrans); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), 0.0f, lineZTrans); modelMatrix.scale(gridLineScaleY); itModelMatrix.scale(gridLineScaleY); @@ -1698,28 +1631,25 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } } // Horizontal wall lines if (m_axisCacheY.segmentCount() > 0) { // Back wall - GLfloat lineStep = 2.0f * m_axisCacheY.subSegmentStep() / m_heightNormalizer; - GLfloat linePos = -1.0f; - int lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); + int gridLineCount = m_axisCacheY.gridLineCount(); GLfloat lineZTrans = m_scaleZWithBackground - gridLineOffset; if (!m_zFlipped) lineZTrans = -lineZTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, linePos, lineZTrans); + modelMatrix.translate(0.0f, m_axisCacheY.gridLinePosition(line), lineZTrans); modelMatrix.scale(gridLineScaleX); itModelMatrix.scale(gridLineScaleX); @@ -1751,23 +1681,20 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } // Side wall - linePos = -1.0f; - lastSegment = m_axisCacheY.subSegmentCount() * m_axisCacheY.segmentCount(); GLfloat lineXTrans = m_scaleXWithBackground - gridLineOffset; if (!m_xFlipped) lineXTrans = -lineXTrans; - for (int segment = 0; segment <= lastSegment; segment++) { + for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(lineXTrans, linePos, 0.0f); + modelMatrix.translate(lineXTrans, m_axisCacheY.gridLinePosition(line), 0.0f); modelMatrix.scale(gridLineScaleZ); itModelMatrix.scale(gridLineScaleZ); @@ -1797,7 +1724,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) #else m_drawer->drawLine(lineShader); #endif - linePos += lineStep; } } } @@ -1812,9 +1738,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Z Labels QVector3D positionZComp(0.0f, 0.0f, 0.0f); if (m_axisCacheZ.segmentCount() > 0) { - GLfloat posStep = 2.0f * aspectRatio * m_axisCacheZ.segmentStep() / m_scaleFactor; - GLfloat labelPos = m_scaleZ; - int lastSegment = m_axisCacheZ.segmentCount(); + int labelCount = m_axisCacheZ.labelItems().size(); int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; @@ -1835,14 +1759,14 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, - labelPos); + 0.0f); QVector3D rotation(rotLabelX, rotLabelY, rotLabelZ); - for (int segment = 0; segment <= lastSegment; segment++) { + for (int label = 0; label < labelCount; label++) { if (m_axisCacheZ.labelItems().size() > labelNbr) { - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Draw the label here - labelTrans.setZ(labelPos); + labelTrans.setZ(m_axisCacheZ.labelPosition(label)); m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); @@ -1852,14 +1776,11 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) true, true, Drawer::LabelMid, alignment); } labelNbr++; - labelPos -= posStep; } } // X Labels if (m_axisCacheX.segmentCount() > 0) { - GLfloat posStep = 2.0f * aspectRatio * m_axisCacheX.segmentStep() / m_scaleFactor; - GLfloat labelPos = -m_scaleX; - int lastSegment = m_axisCacheX.segmentCount(); + int labelCount = m_axisCacheX.labelItems().size(); int labelNbr = 0; GLfloat labelZTrans = m_scaleZWithBackground + labelMargin; @@ -1879,16 +1800,16 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) rotLabelY += 180.0f; labelYTrans = -labelYTrans; } - QVector3D labelTrans = QVector3D(labelPos, + QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); QVector3D rotation(rotLabelX, rotLabelY, rotLabelZ); - for (int segment = 0; segment <= lastSegment; segment++) { + for (int label = 0; label < labelCount; label++) { if (m_axisCacheX.labelItems().size() > labelNbr) { - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Draw the label here - labelTrans.setX(labelPos); + labelTrans.setX(m_axisCacheX.labelPosition(label)); m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); @@ -1898,13 +1819,12 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) true, true, Drawer::LabelMid, alignment); } labelNbr++; - labelPos += posStep; } } // Y Labels if (m_axisCacheY.segmentCount() > 0) { - GLfloat posStep = 2.0f * m_axisCacheY.segmentStep() / m_heightNormalizer; - GLfloat labelPos = -1.0f; + int labelCount = m_axisCacheY.labelItems().size(); + int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground; GLfloat labelZTrans = m_scaleZWithBackground; @@ -1943,14 +1863,15 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QVector3D labelRotateVectorSide(rotLabelX, rotLabelY, rotLabelZ); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); - for (int segment = 0; segment <= m_axisCacheY.segmentCount(); segment++) { + for (int label = 0; label < labelCount; label++) { if (m_axisCacheY.labelItems().size() > labelNbr) { const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); + const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - glPolygonOffset(GLfloat(segment) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); // Back wall - labelTransBack.setY(labelPos); + labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, labelRotateVectorBack, 0, m_cachedSelectionMode, @@ -1958,7 +1879,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) true, true, Drawer::LabelMid, alignmentBack); // Side wall - labelTransSide.setY(labelPos); + labelTransSide.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, labelRotateVectorSide, 0, m_cachedSelectionMode, @@ -1966,7 +1887,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) true, true, Drawer::LabelMid, alignmentSide); } labelNbr++; - labelPos += posStep; } } glDisable(GL_POLYGON_OFFSET_FILL); @@ -2123,8 +2043,14 @@ void Surface3DRenderer::calculateSceneScalingFactors() m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); m_scaleX = aspectRatio * m_areaSize.width() / m_scaleFactor; m_scaleZ = aspectRatio * m_areaSize.height() / m_scaleFactor; - m_scaleXWithBackground = m_scaleX * backgroundMargin; - m_scaleZWithBackground = m_scaleZ * backgroundMargin; + m_scaleXWithBackground = m_scaleX + backgroundMargin - 1.0f; + m_scaleZWithBackground = m_scaleZ + backgroundMargin - 1.0f; + + float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + m_axisCacheX.setScale(factorScaler * m_areaSize.width()); + m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); + m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); + m_axisCacheZ.setTranslate(-m_axisCacheZ.scale() / 2.0f); } void Surface3DRenderer::checkFlatSupport(SurfaceSeriesRenderCache *cache) @@ -2144,13 +2070,10 @@ void Surface3DRenderer::updateObjects(SurfaceSeriesRenderCache *cache, bool dime const QRect &sampleSpace = cache->sampleSpace(); - if (cache->isFlatShadingEnabled()) { - cache->surfaceObject()->setUpData(dataArray, sampleSpace, m_heightNormalizer, - m_axisCacheY.min(), dimensionChanged); - } else { - cache->surfaceObject()->setUpSmoothData(dataArray, sampleSpace, m_heightNormalizer, - m_axisCacheY.min(), dimensionChanged); - } + if (cache->isFlatShadingEnabled()) + cache->surfaceObject()->setUpData(dataArray, sampleSpace, dimensionChanged); + else + cache->surfaceObject()->setUpSmoothData(dataArray, sampleSpace, dimensionChanged); } void Surface3DRenderer::updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series) @@ -2226,9 +2149,6 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co if (column < 0 || row < 0) return; - QSurfaceDataArray &dataArray = cache->dataArray(); - float value = dataArray.at(row)->at(column).y(); - SelectionPointer *slicePointer = cache->sliceSelectionPointer(); if (!slicePointer && m_cachedIsSlicingActivated) { slicePointer = new SelectionPointer(m_drawer); @@ -2240,26 +2160,23 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co cache->setMainSelectionPointer(mainPointer); } - const QVector3D &scale = cache->scale(); - const QVector3D &offset = cache->offset(); QString selectionLabel; if (label) - selectionLabel = createSelectionLabel(cache, value, column, row); + selectionLabel = createSelectionLabel(cache, column, row); if (m_cachedIsSlicingActivated) { - QVector3D subPos; + QVector3D subPosFront; + QVector3D subPosBack; if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) { - subPos = cache->sliceSurfaceObject()->vertexAt(column, 0); - subPos *= QVector3D(scale.x(), 1.0f, 0.0f); - subPos += QVector3D(offset.x(), 0.0f, 0.0f); + subPosFront = cache->sliceSurfaceObject()->vertexAt(column, 0); + subPosBack = cache->sliceSurfaceObject()->vertexAt(column, 1); } else if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn)) { - subPos = cache->sliceSurfaceObject()->vertexAt(row, 0); - subPos *= QVector3D(scale.z(), 1.0f, 0.0f); - subPos += QVector3D(-offset.z(), 0.0f, 0.0f); + subPosFront = cache->sliceSurfaceObject()->vertexAt(row, 0); + subPosBack = cache->sliceSurfaceObject()->vertexAt(row, 1); } slicePointer->updateBoundingRect(m_secondarySubViewport); slicePointer->updateSliceData(true, m_autoScaleAdjustment); - slicePointer->setPosition(subPos); + slicePointer->setPosition((subPosFront + subPosBack) / 2.0f); slicePointer->setLabel(selectionLabel); slicePointer->setPointerObject(cache->object()); slicePointer->setHighlightColor(cache->singleHighlightColor()); @@ -2270,8 +2187,6 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co QVector3D mainPos; mainPos = cache->surfaceObject()->vertexAt(column, row); - mainPos *= scale; - mainPos += offset; mainPointer->updateBoundingRect(m_primarySubViewport); mainPointer->updateSliceData(false, m_autoScaleAdjustment); mainPointer->setPosition(mainPos); @@ -2307,7 +2222,7 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) return QPoint(row, column); } -QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, float value, +QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, int column, int row) { QSurfaceDataArray &dataArray = cache->dataArray(); @@ -2325,26 +2240,18 @@ QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, labelText.replace(zTitleTag, m_axisCacheZ.title()); if (labelText.contains(xLabelTag)) { - QString labelFormat = m_axisCacheX.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, - dataArray.at(row)->at(column).x()); + QString valueLabelText = m_axisCacheX.formatter()->stringForValue( + dataArray.at(row)->at(column).x(), m_axisCacheX.labelFormat()); labelText.replace(xLabelTag, valueLabelText); } if (labelText.contains(yLabelTag)) { - QString labelFormat = m_axisCacheY.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, value); + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + dataArray.at(row)->at(column).y(), m_axisCacheY.labelFormat()); labelText.replace(yLabelTag, valueLabelText); } if (labelText.contains(zLabelTag)) { - QString labelFormat = m_axisCacheZ.labelFormat(); - if (labelFormat.isEmpty()) - labelFormat = Utils::defaultLabelFormat(); - QString valueLabelText = generateValueLabel(labelFormat, - dataArray.at(row)->at(column).z()); + QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( + dataArray.at(row)->at(column).z(), m_axisCacheZ.labelFormat()); labelText.replace(zLabelTag, valueLabelText); } diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 5d93ee4a..9fd5d0d9 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -112,6 +112,8 @@ public: void updateRows(const QVector &rows); void updateItem(const QVector &points); void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max); + void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, + QValue3DAxisFormatter *formatter); void updateScene(Q3DScene *scene); void updateSlicingActive(bool isSlicing); void updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series); @@ -138,7 +140,7 @@ private: void updateShadowQuality(QAbstract3DGraph::ShadowQuality quality); void updateTextures(); void initShaders(const QString &vertexShader, const QString &fragmentShader); - QRect calculateSampleRect(SurfaceSeriesRenderCache *cache, const QSurfaceDataArray &array); + QRect calculateSampleRect(const QSurfaceDataArray &array); void loadBackgroundMesh(); void loadLabelMesh(); void drawScene(GLuint defaultFboHandle); @@ -156,7 +158,7 @@ private: void surfacePointSelected(const QPoint &point); void updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point, bool label); QPoint selectionIdToSurfacePoint(uint id); - QString createSelectionLabel(SurfaceSeriesRenderCache *cache, float value, int column, int row); + QString createSelectionLabel(SurfaceSeriesRenderCache *cache, int column, int row); #if !defined(QT_OPENGL_ES_2) void loadGridLineMesh(); void updateDepthBuffer(); @@ -164,6 +166,8 @@ private: void emitSelectedPointChanged(QPoint position); Q_DISABLE_COPY(Surface3DRenderer) + + friend class SurfaceObject; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surfaceseriesrendercache.cpp b/src/datavisualization/engine/surfaceseriesrendercache.cpp index ba25d71d..ad81f714 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache.cpp +++ b/src/datavisualization/engine/surfaceseriesrendercache.cpp @@ -25,20 +25,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -SurfaceSeriesRenderCache::SurfaceSeriesRenderCache() +SurfaceSeriesRenderCache::SurfaceSeriesRenderCache(Surface3DRenderer *renderer) : m_surfaceVisible(false), m_surfaceGridVisible(false), m_surfaceFlatShading(true), - m_surfaceObj(new SurfaceObject), - m_sliceSurfaceObj(new SurfaceObject), + m_surfaceObj(new SurfaceObject(renderer)), + m_sliceSurfaceObj(new SurfaceObject(renderer)), m_sampleSpace(QRect(0, 0, 0 , 0)), m_selectionTexture(0), m_selectionIdStart(0), m_selectionIdEnd(0), m_flatChangeAllowed(true), m_flatStatusDirty(false), - m_scale(QVector3D(1.0f, 1.0f, 1.0f)), - m_offset(QVector3D(0.0f, 0.0f, 0.0f)), m_sliceSelectionPointer(0), m_mainSelectionPointer(0), m_slicePointerActive(false), diff --git a/src/datavisualization/engine/surfaceseriesrendercache_p.h b/src/datavisualization/engine/surfaceseriesrendercache_p.h index 2dda0670..bab16201 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache_p.h +++ b/src/datavisualization/engine/surfaceseriesrendercache_p.h @@ -41,13 +41,14 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class Abstract3DRenderer; +class Surface3DRenderer; class ObjectHelper; class TextureHelper; class SurfaceSeriesRenderCache : public SeriesRenderCache { public: - SurfaceSeriesRenderCache(); + SurfaceSeriesRenderCache(Surface3DRenderer *renderer); virtual ~SurfaceSeriesRenderCache(); void populate(QSurface3DSeries *series, Abstract3DRenderer *renderer); @@ -81,10 +82,6 @@ public: selection <= m_selectionIdEnd; } inline bool isFlatStatusDirty() const { return m_flatStatusDirty; } inline void setFlatStatusDirty(bool status) { m_flatStatusDirty = status; } - inline void setScale(const QVector3D &scale) { m_scale = scale; } - inline const QVector3D &scale() const { return m_scale; } - inline void setOffset(const QVector3D &offset) { m_offset = offset; } - inline const QVector3D &offset() const { return m_offset; } // m_MVPMatrix is volatile, used only for optimizing rendering a bit inline void setMVPMatrix(const QMatrix4x4 &matrix) { m_MVPMatrix = matrix; } inline const QMatrix4x4 &MVPMatrix() { return m_MVPMatrix; } @@ -113,8 +110,6 @@ protected: uint m_selectionIdEnd; bool m_flatChangeAllowed; bool m_flatStatusDirty; - QVector3D m_scale; - QVector3D m_offset; QMatrix4x4 m_MVPMatrix; SelectionPointer *m_sliceSelectionPointer; SelectionPointer *m_mainSelectionPointer; diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp index 9bcdfee2..b21961cb 100644 --- a/src/datavisualization/utils/surfaceobject.cpp +++ b/src/datavisualization/utils/surfaceobject.cpp @@ -18,16 +18,21 @@ #include "surfaceobject_p.h" #include "abstractobjecthelper_p.h" +#include "surface3drenderer_p.h" #include QT_BEGIN_NAMESPACE_DATAVISUALIZATION -SurfaceObject::SurfaceObject() +SurfaceObject::SurfaceObject(Surface3DRenderer *renderer) : m_surfaceType(Undefined), m_columns(0), m_rows(0), - m_gridIndexCount(0) + m_gridIndexCount(0), + m_axisCacheX(renderer->m_axisCacheX), + m_axisCacheY(renderer->m_axisCacheY), + m_axisCacheZ(renderer->m_axisCacheZ) + { m_indicesType = GL_UNSIGNED_INT; initializeOpenGLFunctions(); @@ -45,16 +50,11 @@ SurfaceObject::~SurfaceObject() } void SurfaceObject::setUpSmoothData(const QSurfaceDataArray &dataArray, const QRect &space, - GLfloat yRange, GLfloat yMin, bool changeGeometry) + bool changeGeometry, bool flipXZ) { m_columns = space.width(); m_rows = space.height(); int totalSize = m_rows * m_columns; - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; GLfloat uvX = 1.0f / GLfloat(m_columns - 1); GLfloat uvY = 1.0f / GLfloat(m_rows - 1); @@ -68,21 +68,31 @@ void SurfaceObject::setUpSmoothData(const QSurfaceDataArray &dataArray, const QR if (changeGeometry) uvs.resize(totalSize); int totalIndex = 0; + + AxisRenderCache &xCache = flipXZ ? m_axisCacheZ : m_axisCacheX; + AxisRenderCache &zCache = flipXZ ? m_axisCacheX : m_axisCacheZ; + for (int i = 0; i < m_rows; i++) { const QSurfaceDataRow &p = *dataArray.at(i); for (int j = 0; j < m_columns; j++) { const QSurfaceDataItem &data = p.at(j); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[totalIndex] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, - normalizedZ + 1.0f); + float normalizedX = xCache.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = zCache.positionAt(data.z()); + m_vertices[totalIndex] = QVector3D(normalizedX, normalizedY, normalizedZ); if (changeGeometry) uvs[totalIndex] = QVector2D(GLfloat(j) * uvX, GLfloat(i) * uvY); totalIndex++; } } + if (flipXZ) { + for (int i = 0; i < m_vertices.size(); i++) { + m_vertices[i].setX(-m_vertices.at(i).x()); + m_vertices[i].setZ(-m_vertices.at(i).z()); + } + } + // Create normals int rowLimit = m_rows - 1; int colLimit = m_columns - 1; @@ -123,24 +133,18 @@ void SurfaceObject::setUpSmoothData(const QSurfaceDataArray &dataArray, const QR createBuffers(m_vertices, uvs, m_normals, 0, changeGeometry); } -void SurfaceObject::updateSmoothRow(const QSurfaceDataArray &dataArray, int rowIndex, - GLfloat yRange, GLfloat yMin) +void SurfaceObject::updateSmoothRow(const QSurfaceDataArray &dataArray, int rowIndex) { - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; - // Update vertices int p = rowIndex * m_columns; const QSurfaceDataRow &dataRow = *dataArray.at(rowIndex); + for (int j = 0; j < m_columns; j++) { const QSurfaceDataItem &data = dataRow.at(j); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[p++] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, normalizedZ + 1.0f); + float normalizedX = m_axisCacheX.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = m_axisCacheZ.positionAt(data.z()); + m_vertices[p++] = QVector3D(normalizedX, normalizedY, normalizedZ); } // Create normals @@ -183,22 +187,14 @@ void SurfaceObject::updateSmoothRow(const QSurfaceDataArray &dataArray, int rowI } } -void SurfaceObject::updateSmoothItem(const QSurfaceDataArray &dataArray, int row, - int column, GLfloat yRange, GLfloat yMin) +void SurfaceObject::updateSmoothItem(const QSurfaceDataArray &dataArray, int row, int column) { - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; - // Update a vertice const QSurfaceDataItem &data = dataArray.at(row)->at(column); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[row * m_columns + column] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, - normalizedZ + 1.0f); + float normalizedX = m_axisCacheX.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = m_axisCacheZ.positionAt(data.z()); + m_vertices[row * m_columns + column] = QVector3D(normalizedX, normalizedY, normalizedZ); // Create normals int startRow = row; @@ -321,16 +317,11 @@ void SurfaceObject::createSmoothGridlineIndices(int x, int y, int endX, int endY } void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &space, - GLfloat yRange, GLfloat yMin, bool changeGeometry) + bool changeGeometry, bool flipXZ) { m_columns = space.width(); m_rows = space.height(); int totalSize = m_rows * m_columns * 2; - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; GLfloat uvX = 1.0f / GLfloat(m_columns - 1); GLfloat uvY = 1.0f / GLfloat(m_rows - 1); @@ -350,15 +341,17 @@ void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &s int doubleColumns = m_columns * 2 - 2; int rowColLimit = rowLimit * doubleColumns; + AxisRenderCache &xCache = flipXZ ? m_axisCacheZ : m_axisCacheX; + AxisRenderCache &zCache = flipXZ ? m_axisCacheX : m_axisCacheZ; + for (int i = 0; i < m_rows; i++) { const QSurfaceDataRow &row = *dataArray.at(i); for (int j = 0; j < m_columns; j++) { const QSurfaceDataItem &data = row.at(j); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[totalIndex] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, - normalizedZ + 1.0f); + float normalizedX = xCache.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = zCache.positionAt(data.z()); + m_vertices[totalIndex] = QVector3D(normalizedX, normalizedY, normalizedZ); if (changeGeometry) uvs[totalIndex] = QVector2D(GLfloat(j) * uvX, GLfloat(i) * uvY); @@ -373,6 +366,13 @@ void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &s } } + if (flipXZ) { + for (int i = 0; i < m_vertices.size(); i++) { + m_vertices[i].setX(-m_vertices.at(i).x()); + m_vertices[i].setZ(-m_vertices.at(i).z()); + } + } + // Create normals & indices table GLint *indices = 0; int p = 0; @@ -421,26 +421,20 @@ void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &s delete[] indices; } -void SurfaceObject::updateCoarseRow(const QSurfaceDataArray &dataArray, int rowIndex, - GLfloat yRange, GLfloat yMin) +void SurfaceObject::updateCoarseRow(const QSurfaceDataArray &dataArray, int rowIndex) { - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; - int colLimit = m_columns - 1; int doubleColumns = m_columns * 2 - 2; int p = rowIndex * doubleColumns; const QSurfaceDataRow &dataRow = *dataArray.at(rowIndex); + for (int j = 0; j < m_columns; j++) { const QSurfaceDataItem &data = dataRow.at(j); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[p++] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, normalizedZ + 1.0f); + float normalizedX = m_axisCacheX.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = m_axisCacheZ.positionAt(data.z()); + m_vertices[p++] = QVector3D(normalizedX, normalizedY, normalizedZ); if (j > 0 && j < colLimit) { m_vertices[p] = m_vertices[p - 1]; @@ -472,25 +466,18 @@ void SurfaceObject::updateCoarseRow(const QSurfaceDataArray &dataArray, int rowI } } -void SurfaceObject::updateCoarseItem(const QSurfaceDataArray &dataArray, int row, - int column, GLfloat yRange, GLfloat yMin) +void SurfaceObject::updateCoarseItem(const QSurfaceDataArray &dataArray, int row, int column) { - GLfloat xMin = dataArray.at(0)->at(0).x(); - GLfloat zMin = dataArray.at(0)->at(0).z(); - GLfloat xNormalizer = (dataArray.at(0)->last().x() - xMin) / 2.0f; - GLfloat yNormalizer = yRange / 2.0f; - GLfloat zNormalizer = (dataArray.last()->at(0).z() - zMin) / -2.0f; - int colLimit = m_columns - 1; int doubleColumns = m_columns * 2 - 2; // Update a vertice int p = row * doubleColumns + column * 2 - (column > 0); const QSurfaceDataItem &data = dataArray.at(row)->at(column); - float normalizedX = ((data.x() - xMin) / xNormalizer); - float normalizedY = ((data.y() - yMin) / yNormalizer); - float normalizedZ = ((data.z() - zMin) / zNormalizer); - m_vertices[p] = QVector3D(normalizedX - 1.0f, normalizedY - 1.0f, normalizedZ + 1.0f); + float normalizedX = m_axisCacheX.positionAt(data.x()); + float normalizedY = m_axisCacheY.positionAt(data.y()); + float normalizedZ = m_axisCacheZ.positionAt(data.z()); + m_vertices[p] = QVector3D(normalizedX, normalizedY, normalizedZ); p++; if (column > 0 && column < colLimit) diff --git a/src/datavisualization/utils/surfaceobject_p.h b/src/datavisualization/utils/surfaceobject_p.h index 69cb7e5d..c8f7de95 100644 --- a/src/datavisualization/utils/surfaceobject_p.h +++ b/src/datavisualization/utils/surfaceobject_p.h @@ -37,6 +37,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +class Surface3DRenderer; +class AxisRenderCache; + class SurfaceObject : public AbstractObjectHelper { public: @@ -47,21 +50,17 @@ public: }; public: - SurfaceObject(); + SurfaceObject(Surface3DRenderer *renderer); ~SurfaceObject(); - void setUpData(const QSurfaceDataArray &dataArray, const QRect &space, GLfloat yRange, - GLfloat yMin, bool changeGeometry); - void setUpSmoothData(const QSurfaceDataArray &dataArray, const QRect &space, GLfloat yRange, - GLfloat yMin, bool changeGeometry); - void updateCoarseRow(const QSurfaceDataArray &dataArray, int rowIndex, - GLfloat yRange, GLfloat yMin); - void updateSmoothRow(const QSurfaceDataArray &dataArray, int startRow, - GLfloat yRange, GLfloat yMin); - void updateSmoothItem(const QSurfaceDataArray &dataArray, int row, - int column, GLfloat yRange, GLfloat yMin); - void updateCoarseItem(const QSurfaceDataArray &dataArray, int row, - int column, GLfloat yRange, GLfloat yMin); + void setUpData(const QSurfaceDataArray &dataArray, const QRect &space, + bool changeGeometry, bool flipXZ = false); + void setUpSmoothData(const QSurfaceDataArray &dataArray, const QRect &space, + bool changeGeometry, bool flipXZ = false); + void updateCoarseRow(const QSurfaceDataArray &dataArray, int rowIndex); + void updateSmoothRow(const QSurfaceDataArray &dataArray, int startRow); + void updateSmoothItem(const QSurfaceDataArray &dataArray, int row, int column); + void updateCoarseItem(const QSurfaceDataArray &dataArray, int row, int column); void createSmoothIndices(int x, int y, int endX, int endY); void createCoarseIndices(int x, int y, int columns, int rows); void createSmoothGridlineIndices(int x, int y, int endX, int endY); @@ -86,6 +85,10 @@ private: GLuint m_gridIndexCount; QVector m_vertices; QVector m_normals; + // Caches are not owned + AxisRenderCache &m_axisCacheX; + AxisRenderCache &m_axisCacheY; + AxisRenderCache &m_axisCacheZ; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 7374f25f..cf044a45 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -144,7 +144,7 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog) m_dummyData4->setName("Dummy 4"); m_dummyData5->setName("Dummy 5"); - m_temperatureData->setItemLabelFormat(QStringLiteral("@seriesName: @valueTitle for @colLabel @rowLabel: @valueLabel")); + m_temperatureData->setItemLabelFormat(QStringLiteral("@seriesName: @valueTitle for @colLabel @rowLabel: @valueLabel ~ %.4f")); m_temperatureData2->setItemLabelFormat(QStringLiteral("@seriesName: @valueTitle for @colLabel @rowLabel: @valueLabel")); m_genericData->setItemLabelFormat(QStringLiteral("@seriesName: @valueTitle for (@rowIdx, @colIdx): @valueLabel")); @@ -1055,7 +1055,12 @@ void GraphModifier::useLogAxis() // logAxis->formatter()->setBase(10); // logAxis->setSegmentCount(5); // logAxis->setRange(1, 100000); -// m_graph->setValueAxis(logAxis); + // m_graph->setValueAxis(logAxis); +} + +void GraphModifier::changeValueAxisFormat(const QString & text) +{ + m_graph->valueAxis()->setLabelFormat(text); } void GraphModifier::insertRemoveTimerTimeout() diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 557270e0..304103cd 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -86,6 +86,7 @@ public: void insertRemoveTestToggle(); void toggleRotation(); void useLogAxis(); + void changeValueAxisFormat(const QString & text); public slots: void flipViews(); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index b02fa48f..edf61e2e 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -32,6 +32,7 @@ #include #include #include +#include int main(int argc, char **argv) { @@ -290,6 +291,8 @@ int main(int argc, char **argv) shadowQuality->addItem(QStringLiteral("High Soft")); shadowQuality->setCurrentIndex(5); + QLineEdit *valueAxisFormatEdit = new QLineEdit(widget); + vLayout->addWidget(addDataButton, 0, Qt::AlignTop); vLayout->addWidget(addMultiDataButton, 0, Qt::AlignTop); vLayout->addWidget(insertDataButton, 0, Qt::AlignTop); @@ -344,7 +347,9 @@ int main(int argc, char **argv) vLayout2->addWidget(new QLabel(QStringLiteral("Change font")), 0, Qt::AlignTop); vLayout2->addWidget(fontList, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size")), 0, Qt::AlignTop); - vLayout2->addWidget(fontSizeSlider, 1, Qt::AlignTop); + vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Value axis format")), 0, Qt::AlignTop); + vLayout2->addWidget(valueAxisFormatEdit, 1, Qt::AlignTop); // TODO: Add example for setMeshFileName widget->show(); @@ -380,6 +385,8 @@ int main(int argc, char **argv) &QComboBox::setCurrentIndex); QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier, &GraphModifier::changeFontSize); + QObject::connect(valueAxisFormatEdit, &QLineEdit::textEdited, modifier, + &GraphModifier::changeValueAxisFormat); QObject::connect(multiScaleButton, &QPushButton::clicked, modifier, &GraphModifier::toggleMultiseriesScaling); diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 30382ca5..fbe257f5 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -40,6 +40,7 @@ int main(int argc, char **argv) QWidget *widget = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(widget); QVBoxLayout *vLayout = new QVBoxLayout(); + QVBoxLayout *vLayout2 = new QVBoxLayout(); Q3DScatter *chart = new Q3DScatter(); QSize screenSize = chart->screen()->size(); @@ -54,6 +55,7 @@ int main(int argc, char **argv) hLayout->addWidget(container, 1); hLayout->addLayout(vLayout); + hLayout->addLayout(vLayout2); QPushButton *themeButton = new QPushButton(widget); themeButton->setText(QStringLiteral("Change theme")); @@ -161,6 +163,48 @@ int main(int argc, char **argv) pointSizeSlider->setValue(30); pointSizeSlider->setMaximum(100); + QSlider *minSliderX = new QSlider(Qt::Horizontal, widget); + minSliderX->setTickInterval(1); + minSliderX->setTickPosition(QSlider::TicksBelow); + minSliderX->setMinimum(-100); + minSliderX->setValue(-50); + minSliderX->setMaximum(100); + + QSlider *minSliderY = new QSlider(Qt::Horizontal, widget); + minSliderY->setTickInterval(1); + minSliderY->setTickPosition(QSlider::TicksBelow); + minSliderY->setMinimum(-200); + minSliderY->setValue(-100); + minSliderY->setMaximum(200); + + QSlider *minSliderZ = new QSlider(Qt::Horizontal, widget); + minSliderZ->setTickInterval(1); + minSliderZ->setTickPosition(QSlider::TicksBelow); + minSliderZ->setMinimum(-100); + minSliderZ->setValue(-50); + minSliderZ->setMaximum(100); + + QSlider *maxSliderX = new QSlider(Qt::Horizontal, widget); + maxSliderX->setTickInterval(1); + maxSliderX->setTickPosition(QSlider::TicksAbove); + maxSliderX->setMinimum(-100); + maxSliderX->setValue(50); + maxSliderX->setMaximum(100); + + QSlider *maxSliderY = new QSlider(Qt::Horizontal, widget); + maxSliderY->setTickInterval(1); + maxSliderY->setTickPosition(QSlider::TicksAbove); + maxSliderY->setMinimum(-200); + maxSliderY->setValue(120); + maxSliderY->setMaximum(200); + + QSlider *maxSliderZ = new QSlider(Qt::Horizontal, widget); + maxSliderZ->setTickInterval(1); + maxSliderZ->setTickPosition(QSlider::TicksAbove); + maxSliderZ->setMinimum(-100); + maxSliderZ->setValue(50); + maxSliderZ->setMaximum(100); + vLayout->addWidget(themeButton, 0, Qt::AlignTop); vLayout->addWidget(labelButton, 0, Qt::AlignTop); vLayout->addWidget(styleButton, 0, Qt::AlignTop); @@ -185,13 +229,21 @@ int main(int argc, char **argv) vLayout->addWidget(backgroundCheckBox); vLayout->addWidget(gridCheckBox); vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); - vLayout->addWidget(shadowQuality); - vLayout->addWidget(new QLabel(QStringLiteral("Change font"))); - vLayout->addWidget(fontList); - vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size"))); - vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop); - vLayout->addWidget(new QLabel(QStringLiteral("Adjust point size"))); - vLayout->addWidget(pointSizeSlider, 1, Qt::AlignTop); + vLayout->addWidget(shadowQuality, 1, Qt::AlignTop); + + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust point size"))); + vLayout2->addWidget(pointSizeSlider, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust data window"))); + vLayout2->addWidget(minSliderX, 0, Qt::AlignTop); + vLayout2->addWidget(maxSliderX, 0, Qt::AlignTop); + vLayout2->addWidget(minSliderY, 0, Qt::AlignTop); + vLayout2->addWidget(maxSliderY, 0, Qt::AlignTop); + vLayout2->addWidget(minSliderZ, 0, Qt::AlignTop); + vLayout2->addWidget(maxSliderZ, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); + vLayout2->addWidget(fontList); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size"))); + vLayout2->addWidget(fontSizeSlider, 1, Qt::AlignTop); widget->show(); @@ -257,6 +309,20 @@ int main(int argc, char **argv) QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier, &ScatterDataModifier::setGridEnabled); + QObject::connect(minSliderX, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMinX); + QObject::connect(minSliderY, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMinY); + QObject::connect(minSliderZ, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMinZ); + QObject::connect(maxSliderX, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMaxX); + QObject::connect(maxSliderY, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMaxY); + QObject::connect(maxSliderZ, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setMaxZ); + + modifier->start(); return app.exec(); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index aa0c5454..a589919f 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -83,6 +83,12 @@ void ScatterDataModifier::addData() m_chart->axisX()->setRange(-50.0f, 50.0f); m_chart->axisY()->setRange(-1.0f, 1.2f); m_chart->axisZ()->setRange(-50.0f, 50.0f); + m_chart->axisX()->setSegmentCount(6); + m_chart->axisY()->setSegmentCount(4); + m_chart->axisZ()->setSegmentCount(9); + m_chart->axisX()->setSubSegmentCount(2); + m_chart->axisY()->setSubSegmentCount(3); + m_chart->axisZ()->setSubSegmentCount(1); QScatterDataArray *dataArray = new QScatterDataArray; dataArray->resize(numberOfItems); @@ -229,9 +235,12 @@ void ScatterDataModifier::resetAxes() m_chart->setAxisX(new QValue3DAxis); m_chart->setAxisY(new QValue3DAxis); m_chart->setAxisZ(new QValue3DAxis); - m_chart->axisX()->setSegmentCount(5); - m_chart->axisY()->setSegmentCount(5); - m_chart->axisZ()->setSegmentCount(5); + m_chart->axisX()->setSegmentCount(6); + m_chart->axisY()->setSegmentCount(4); + m_chart->axisZ()->setSegmentCount(9); + m_chart->axisX()->setSubSegmentCount(2); + m_chart->axisY()->setSubSegmentCount(3); + m_chart->axisZ()->setSubSegmentCount(1); m_chart->axisX()->setTitle("X"); m_chart->axisY()->setTitle("Y"); m_chart->axisZ()->setTitle("Z"); @@ -516,12 +525,46 @@ void ScatterDataModifier::setGridEnabled(int enabled) m_chart->activeTheme()->setGridEnabled((bool)enabled); } +void ScatterDataModifier::setMinX(int min) +{ + m_chart->axisX()->setMin(min); +} + +void ScatterDataModifier::setMinY(int min) +{ + m_chart->axisY()->setMin(float(min) / 100.0f); +} + +void ScatterDataModifier::setMinZ(int min) +{ + m_chart->axisZ()->setMin(min); +} + +void ScatterDataModifier::setMaxX(int max) +{ + m_chart->axisX()->setMax(max); +} + +void ScatterDataModifier::setMaxY(int max) +{ + m_chart->axisY()->setMax(float(max) / 100.0f); +} + +void ScatterDataModifier::setMaxZ(int max) +{ + m_chart->axisZ()->setMax(max); +} + QVector3D ScatterDataModifier::randVector() { - return QVector3D( + QVector3D retvec = QVector3D( (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f, (float)(rand() % 100) / 100.0f - (float)(rand() % 100) / 100.0f, (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f); + + qDebug() << __FUNCTION__ << retvec; + + return retvec; } QScatter3DSeries *ScatterDataModifier::createAndAddSeries() @@ -535,7 +578,7 @@ QScatter3DSeries *ScatterDataModifier::createAndAddSeries() m_chart->addSeries(series); series->setName(QString("Series %1").arg(counter++)); - series->setItemLabelFormat(QStringLiteral("@seriesName: @xLabel - @yLabel - @zLabel")); + series->setItemLabelFormat(QStringLiteral("@seriesName: (X:@xLabel / Z:@zLabel) Y:@yLabel")); series->setMesh(QAbstract3DSeries::MeshSphere); series->setMeshSmooth(true); series->setBaseColor(QColor(rand() % 256, rand() % 256, rand() % 256)); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 21357d62..23071c85 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -45,6 +45,12 @@ public: void changePointSize(int pointSize); void setBackgroundEnabled(int enabled); void setGridEnabled(int enabled); + void setMinX(int min); + void setMinY(int min); + void setMinZ(int min); + void setMaxX(int max); + void setMaxY(int max); + void setMaxZ(int max); void start(); public slots: diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 7f2a3ef2..e1fed76a 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -49,8 +49,10 @@ GraphModifier::GraphModifier(Q3DSurface *graph) m_activeSample(0), m_fontSize(40), m_rangeX(16.0), + m_rangeY(16.0), m_rangeZ(16.0), m_minX(-8.0), + m_minY(-8.0), m_minZ(-8.0), m_addRowCounter(m_zCount), m_insertTestZPos(0), @@ -85,14 +87,15 @@ GraphModifier::GraphModifier(Q3DSurface *graph) m_multiSampleOffsetX[3] = m_offset; m_multiSampleOffsetZ[3] = m_offset; - m_graph->axisX()->setRange(-m_limitX - m_offset, m_limitX + m_offset); - m_graph->axisY()->setRange(-1.0f, 4.5f); - m_graph->axisZ()->setRange(-m_limitZ - m_offset, m_limitZ + m_offset); +// m_graph->axisX()->setRange(-m_limitX - m_offset, m_limitX + m_offset); +// m_graph->axisY()->setRange(-1.0f, 4.5f); +// m_graph->axisZ()->setRange(-m_limitZ - m_offset, m_limitZ + m_offset); #else - m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX); - m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ); m_graph->addSeries(m_theSeries); #endif + m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX); + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ); for (int i = 0; i < 4; i++) { m_multiseries[i] = new QSurface3DSeries; @@ -134,18 +137,27 @@ void GraphModifier::fillSeries() QSurfaceDataArray *dataArray4 = new QSurfaceDataArray; dataArray4->reserve(m_zCount); + for (int i = 0; i < m_zCount; i++) { QSurfaceDataRow *newRow[4]; + float zAdjust = 0.0f; + if (i == 3) + zAdjust = 0.7f; + for (int s = 0; s < 4; s++) { newRow[s] = new QSurfaceDataRow(m_xCount); - float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[s]; + float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[s] + zAdjust; for (int j = 0; j < m_xCount; j++) { - float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[s]; + float xAdjust = 0.0f; + if (j == 3) + xAdjust = 0.7f; + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[s] + xAdjust; float angle = (z * x) / full * 1.57f; - float y = qSin(angle * float(qPow(1.3f, s))) + 1.1f * s; + float y = (qSin(angle * float(qPow(1.3f, s))) + 1.1f * s) * 3.0f - 5.0f + xAdjust + zAdjust; (*newRow[s])[j].setPosition(QVector3D(x, y, z)); } } + qDebug() << newRow[0]->at(0).z(); *dataArray1 << newRow[0]; *dataArray2 << newRow[1]; *dataArray3 << newRow[2]; @@ -550,6 +562,14 @@ void GraphModifier::adjustXRange(int range) qDebug() << "X Range =" << range; } +void GraphModifier::adjustYRange(int range) +{ + m_rangeY = range; + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + + qDebug() << "Y Range =" << range; +} + void GraphModifier::adjustZRange(int range) { m_rangeZ = range; @@ -566,6 +586,14 @@ void GraphModifier::adjustXMin(int min) qDebug() << "X Minimum =" << min; } +void GraphModifier::adjustYMin(int min) +{ + m_minY = min; + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + + qDebug() << "Y Minimum =" << min; +} + void GraphModifier::adjustZMin(int min) { m_minZ = min; diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index 7d7d425e..9fd0360b 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -82,8 +82,10 @@ public: void adjustXCount(int count); void adjustZCount(int count); void adjustXRange(int range); + void adjustYRange(int range); void adjustZRange(int range); void adjustXMin(int min); + void adjustYMin(int min); void adjustZMin(int min); void updateSamples(); void gradientPressed(); @@ -143,8 +145,10 @@ private: int m_activeSample; int m_fontSize; float m_rangeX; + float m_rangeY; float m_rangeZ; float m_minX; + float m_minY; float m_minZ; int m_addRowCounter; int m_insertTestZPos; diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 99c60893..6b54b8dd 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -182,28 +182,40 @@ int main(int argc, char *argv[]) QSlider *axisRangeSliderX = new QSlider(Qt::Horizontal, widget); axisRangeSliderX->setTickInterval(1); - axisRangeSliderX->setMinimum(2); + axisRangeSliderX->setMinimum(1); axisRangeSliderX->setValue(16); axisRangeSliderX->setMaximum(100); axisRangeSliderX->setEnabled(true); + QSlider *axisRangeSliderY = new QSlider(Qt::Horizontal, widget); + axisRangeSliderY->setTickInterval(1); + axisRangeSliderY->setMinimum(1); + axisRangeSliderY->setValue(16); + axisRangeSliderY->setMaximum(100); + axisRangeSliderY->setEnabled(true); QSlider *axisRangeSliderZ = new QSlider(Qt::Horizontal, widget); axisRangeSliderZ->setTickInterval(1); - axisRangeSliderZ->setMinimum(2); + axisRangeSliderZ->setMinimum(1); axisRangeSliderZ->setValue(16); axisRangeSliderZ->setMaximum(100); axisRangeSliderZ->setEnabled(true); QSlider *axisMinSliderX = new QSlider(Qt::Horizontal, widget); axisMinSliderX->setTickInterval(1); - axisMinSliderX->setMinimum(-50); + axisMinSliderX->setMinimum(-100); axisMinSliderX->setValue(-8); - axisMinSliderX->setMaximum(50); + axisMinSliderX->setMaximum(100); axisMinSliderX->setEnabled(true); + QSlider *axisMinSliderY = new QSlider(Qt::Horizontal, widget); + axisMinSliderY->setTickInterval(1); + axisMinSliderY->setMinimum(-100); + axisMinSliderY->setValue(-8); + axisMinSliderY->setMaximum(100); + axisMinSliderY->setEnabled(true); QSlider *axisMinSliderZ = new QSlider(Qt::Horizontal, widget); axisMinSliderZ->setTickInterval(1); - axisMinSliderZ->setMinimum(-50); + axisMinSliderZ->setMinimum(-100); axisMinSliderZ->setValue(-8); - axisMinSliderZ->setMaximum(50); + axisMinSliderZ->setMaximum(100); axisMinSliderZ->setEnabled(true); QLinearGradient gr(0, 0, 100, 1); @@ -378,9 +390,11 @@ int main(int argc, char *argv[]) #endif vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis range"))); vLayout->addWidget(axisRangeSliderX); + vLayout->addWidget(axisRangeSliderY); vLayout->addWidget(axisRangeSliderZ); vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis minimum"))); vLayout->addWidget(axisMinSliderX); + vLayout->addWidget(axisMinSliderY); vLayout->addWidget(axisMinSliderZ); vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); vLayout2->addWidget(fontList); @@ -510,10 +524,14 @@ int main(int argc, char *argv[]) #endif QObject::connect(axisRangeSliderX, &QSlider::valueChanged, modifier, &GraphModifier::adjustXRange); + QObject::connect(axisRangeSliderY, &QSlider::valueChanged, + modifier, &GraphModifier::adjustYRange); QObject::connect(axisRangeSliderZ, &QSlider::valueChanged, modifier, &GraphModifier::adjustZRange); QObject::connect(axisMinSliderX, &QSlider::valueChanged, modifier, &GraphModifier::adjustXMin); + QObject::connect(axisMinSliderY, &QSlider::valueChanged, + modifier, &GraphModifier::adjustYMin); QObject::connect(axisMinSliderZ, &QSlider::valueChanged, modifier, &GraphModifier::adjustZMin); QObject::connect(colorPB, &QPushButton::pressed, -- cgit v1.2.3 From d56d7703ac755022f85634db98bd43db3ee31cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 09:06:33 +0200 Subject: Added range gradient support for MeshPoints Task-number: QTRD-2701 Change-Id: Id3f096099ef584a6feaaebcbecc084810ec27967 Reviewed-by: Miikka Heikkinen --- README | 1 - src/datavisualization/data/qabstract3dseries.cpp | 3 ++- src/datavisualization/doc/src/qtdatavisualization.qdoc | 2 -- src/datavisualization/engine/scatter3drenderer.cpp | 7 +++++++ src/datavisualization/engine/seriesrendercache.cpp | 2 ++ src/datavisualization/engine/seriesrendercache_p.h | 2 ++ src/datavisualization/utils/utils.cpp | 10 ++++++++++ src/datavisualization/utils/utils_p.h | 2 ++ 8 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README b/README index 7a4b9edb..b51eb586 100644 --- a/README +++ b/README @@ -82,6 +82,5 @@ Known Issues - Q3DLight class (and Light3D QML item) are currently not usable for anything. - Changing any of Q3DScene properties affecting subviewports currently has no effect. - The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. -- Scatter "point" meshes do not support gradients, they always use the base color. - Widget based examples layout incorrectly in iOS. - Reparenting a graph to an item in another QQuickWindow is not supported. diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index e593a1d9..802a4e8e 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -102,7 +102,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Arrow pointing upwards. * \value MeshPoint * 2D point. Usable only with Q3DScatter. - * \b Note: Shadows and color gradients do not affect this style. + * \b Note: Shadows do not affect this style. Color style Q3DTheme::ColorStyleObjectGradient + * is not supported by this style. */ /*! diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index 061addf1..90b1a41e 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -323,8 +323,6 @@ \li Q3DLight class (and Light3D QML item) are currently not usable for anything. \li Changing any of Q3DScene properties affecting subviewports currently has no effect. \li The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. - \li Scatter "point" meshes (QAbstract3DSeries::MeshPoint) do not support gradients, they - always use the base color. \li Widget based examples layout incorrectly in iOS. \li Reparenting a graph to an item in another QQuickWindow is not supported. \endlist diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index ae4b3831..2c957f79 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -730,6 +730,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); if (useColor) { + if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + // Drawing points with range gradient + // Get color from gradient based on items y position converted to percents + int position = int(item.translation().y() * 50.0f) + 50; + dotColor = Utils::vectorFromColor( + currentSeries.gradientImage().pixel(0, position)); + } dotShader->setUniformValue(dotShader->color(), dotColor); } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { dotShader->setUniformValue(dotShader->gradientMin(), diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 896b3b28..8cfd9b08 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -32,6 +32,7 @@ SeriesRenderCache::SeriesRenderCache() m_mesh(QAbstract3DSeries::MeshCube), m_baseUniformTexture(0), m_baseGradientTexture(0), + m_gradientImage(0), m_singleHighlightGradientTexture(0), m_multiHighlightGradientTexture(0) { @@ -150,6 +151,7 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * if (seriesChanged || changeTracker.baseGradientChanged) { QLinearGradient gradient = series->baseGradient(); + m_gradientImage = Utils::getGradientImage(gradient); renderer->fixGradientAndGenerateTexture(&gradient, &m_baseGradientTexture); changeTracker.baseGradientChanged = false; } diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 77e050b0..1ef67c88 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -60,6 +60,7 @@ public: inline const QVector3D &baseColor() const { return m_baseColor; } inline const GLuint &baseUniformTexture() const { return m_baseUniformTexture; } inline const GLuint &baseGradientTexture() const { return m_baseGradientTexture; } + inline const QImage &gradientImage() const { return m_gradientImage; } inline const QVector3D &singleHighlightColor() const { return m_singleHighlightColor; } inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; } inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; } @@ -77,6 +78,7 @@ protected: QVector3D m_baseColor; GLuint m_baseUniformTexture; GLuint m_baseGradientTexture; + QImage m_gradientImage; QVector3D m_singleHighlightColor; GLuint m_singleHighlightGradientTexture; QVector3D m_multiHighlightColor; diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index e0b1370e..be087f91 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -138,6 +138,16 @@ QVector3D Utils::getSelection(QPoint mousepos, int height) return selectedColor; } +QImage Utils::getGradientImage(const QLinearGradient &gradient) +{ + QImage image(QSize(1, 101), QImage::Format_RGB32); + QPainter pmp(&image); + pmp.setBrush(QBrush(gradient)); + pmp.setPen(Qt::NoPen); + pmp.drawRect(0, 0, 1, 101); + return image; +} + Utils::ParamType Utils::mapFormatCharToParamType(const QChar &formatChar) { ParamType retVal = ParamTypeUnknown; diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index 7288419b..c87ef19a 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -37,6 +37,7 @@ class QPainter; class QString; class QPoint; class QImage; +class QLinearGradient; QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -63,6 +64,7 @@ public: bool borders = false, int maxLabelWidth = 0); static QVector3D getSelection(QPoint mousepos, int height); + static QImage getGradientImage(const QLinearGradient &gradient); static ParamType findFormatParamType(const QString &format); static QString formatLabel(const QByteArray &format, ParamType paramType, float value); -- cgit v1.2.3 From 95fdff3ccec471f98aede604f8725f6a7febc0e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 09:19:11 +0200 Subject: Qt5.3.0 MinGW compilation fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I3c9cc0698c22c242126e8b4d1881e8fdf2d50168 Change-Id: I3c9cc0698c22c242126e8b4d1881e8fdf2d50168 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3dcontroller_p.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index a8cb040a..13c334be 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -38,6 +38,7 @@ #include class QFont; +class QOpenGLFramebufferObject; QT_BEGIN_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 169bc06bfef8ed0184f10bf17c0a57ce156fbd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 09:26:11 +0200 Subject: Point style gradient bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Selection highlighting fixed Change-Id: Ieba8af12d8947f27b199d61591a77d295dbc9c48 Change-Id: Ieba8af12d8947f27b199d61591a77d295dbc9c48 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/scatter3drenderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 2c957f79..f85936f9 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -730,7 +730,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); if (useColor) { - if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + if (colorStyle == Q3DTheme::ColorStyleRangeGradient && + (m_selectedItemTotalIndex != dotNo)) { // Drawing points with range gradient // Get color from gradient based on items y position converted to percents int position = int(item.translation().y() * 50.0f) + 50; -- cgit v1.2.3 From 47cf915e7ad484fad11eaced4d10d7948ab45585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 12:55:22 +0200 Subject: Q3DScene emitneedrenders fixed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2410 Change-Id: I68f2de1db5a66a877cfc12c9b097035ed1eb3f0f Change-Id: I68f2de1db5a66a877cfc12c9b097035ed1eb3f0f Reviewed-by: Pasi Keränen --- src/datavisualization/engine/abstract3dcontroller.cpp | 1 - src/datavisualization/engine/q3dscene.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 8ae9f790..a6c086aa 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -773,7 +773,6 @@ bool Abstract3DController::isSlicingActive() const void Abstract3DController::setSlicingActive(bool isSlicing) { m_scene->setSlicingActive(isSlicing); - emitNeedRender(); } Q3DScene *Abstract3DController::scene() diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 98f39cc9..3e21d624 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -411,6 +411,7 @@ void Q3DScene::setActiveLight(Q3DLight *light) d_ptr->m_sceneDirty = true; emit activeLightChanged(light); + emit d_ptr->needRender(); } } -- cgit v1.2.3 From b16a964d0ed24b720e4e71da03cea87e35db7806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 25 Mar 2014 13:30:29 +0200 Subject: Doc fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I5cf4507bb9e4feefbc9a3de377a17b270604191d Change-Id: I5cf4507bb9e4feefbc9a3de377a17b270604191d Reviewed-by: Tomi Korpipää --- src/datavisualization/doc/src/qtdatavisualization.qdoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index 90b1a41e..0fbe36cb 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -195,8 +195,7 @@ Series is combination of logically connected set of data items (handled by a data proxy) and visual properties that describe how the data items should be rendered, such as item meshes and colors. Each visualization type has its own series type. For example, bar graphs - use QBar3DSeries. Bar and scatter graphs can have multiple series added simultaneously. - Surface graphs support only a single series at a time. + use QBar3DSeries. All graphs can have multiple series added simultaneously. This code snippet shows how to use QBar3DSeries to render bars as cylinders and with a gradient instead of a uniform color: -- cgit v1.2.3 From b36b9eb7c65e3a4f6972d2f2145722470d1ad29b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 25 Mar 2014 15:07:06 +0200 Subject: Implement QLogValue3DAxisFormatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2787 Change-Id: I6ecff5c3d2047a2c566051951bf237bf3e68ffab Reviewed-by: Tomi Korpipää Reviewed-by: Mika Salmela Reviewed-by: Miikka Heikkinen --- src/datavisualization/axis/axis.pri | 7 +- .../axis/qlogvalue3daxisformatter.cpp | 398 +++++++++++++++++++++ .../axis/qlogvalue3daxisformatter.h | 75 ++++ .../axis/qlogvalue3daxisformatter_p.h | 73 ++++ src/datavisualization/axis/qvalue3daxis.cpp | 8 +- src/datavisualization/axis/qvalue3daxis_p.h | 3 +- .../axis/qvalue3daxisformatter.cpp | 133 +++++-- src/datavisualization/axis/qvalue3daxisformatter.h | 5 +- .../axis/qvalue3daxisformatter_p.h | 5 +- .../engine/abstract3dcontroller.cpp | 50 +-- .../engine/abstract3drenderer.cpp | 1 + src/datavisualization/engine/axisrendercache_p.h | 8 +- src/datavisualization/engine/surface3drenderer.cpp | 1 + tests/barstest/chart.cpp | 113 +++++- tests/barstest/chart.h | 3 + tests/barstest/main.cpp | 18 +- 16 files changed, 813 insertions(+), 88 deletions(-) create mode 100644 src/datavisualization/axis/qlogvalue3daxisformatter.cpp create mode 100644 src/datavisualization/axis/qlogvalue3daxisformatter.h create mode 100644 src/datavisualization/axis/qlogvalue3daxisformatter_p.h diff --git a/src/datavisualization/axis/axis.pri b/src/datavisualization/axis/axis.pri index 24463d1e..0173b597 100644 --- a/src/datavisualization/axis/axis.pri +++ b/src/datavisualization/axis/axis.pri @@ -6,10 +6,13 @@ HEADERS += \ $$PWD/qcategory3daxis.h \ $$PWD/qcategory3daxis_p.h \ $$PWD/qvalue3daxisformatter.h \ - $$PWD/qvalue3daxisformatter_p.h + $$PWD/qvalue3daxisformatter_p.h \ + $$PWD/qlogvalue3daxisformatter.h \ + $$PWD/qlogvalue3daxisformatter_p.h SOURCES += \ $$PWD/qabstract3daxis.cpp \ $$PWD/qvalue3daxis.cpp \ $$PWD/qcategory3daxis.cpp \ - $$PWD/qvalue3daxisformatter.cpp + $$PWD/qvalue3daxisformatter.cpp \ + $$PWD/qlogvalue3daxisformatter.cpp diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp new file mode 100644 index 00000000..36f27c02 --- /dev/null +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp @@ -0,0 +1,398 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "qlogvalue3daxisformatter_p.h" +#include "qvalue3daxis_p.h" +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +/*! + * \class QLogValue3DAxisFormatter + * \inmodule QtDataVisualization + * \brief QLogValue3DAxisFormatter implements logarithmic value axis formatter. + * \since Qt Data Visualization 1.1 + * + * This class provides formatting rules for a logarithmic QValue3DAxis. + * + * When a QLogValue3DAxisFormatter is attached to a QValue3DAxis, the axis range + * cannot include negative values or the zero. + * + * \sa QValue3DAxisFormatter + */ + +/*! + * \qmltype LogValueAxis3DFormatter + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.1 + * \ingroup datavisualization_qml + * \instantiates QLogValue3DAxisFormatter + * \brief LogValueAxis3DFormatter implements logarithmic value axis formatter. + * + * This type provides formatting rules for a logarithmic ValueAxis3D. + * When a LogValueAxis3DFormatter is attached to a ValueAxis3D, the axis range + * cannot include negative values or the zero. + */ + +/*! + * \qmlproperty real LogValueAxis3DFormatter::base + * + * The \a base of the logarithm used to map axis values. If the base is non-zero, the parent axis + * segment count will be automatically adjusted whenever the axis formatter is recalculated. + * If you want the range to be divided into equal segments like normal value axis, set this + * property value to zero. + * + * The \a base has to be zero or positive value and not equal to one. + * Defaults to ten. + * + * \sa ValueAxis3D::segmentCount + */ + +/*! + * \qmlproperty bool LogValueAxis3DFormatter::autoSubGrid + * + * If this property value is set to \c true, the parent axis sub-segment count is adjusted + * automatically according to the base property value. The number of subsegments is set to + * base value minus one, rounded down. + * Defaults to \c true. + * + * \sa base, ValueAxis3D::subSegmentCount + */ + +/*! + * \qmlproperty bool LogValueAxis3DFormatter::showMaxLabel + * + * When the base property is non-zero, the segments that get automatically generated and depending + * on the range, the last segment is often smaller than the other segments. In extreme cases this + * can lead to overlapping labels on the last two grid lines. By setting this property to \c false, + * you can suppress showing the max label for the axis in cases where the segments do not exactly + * fit the axis. + * Defaults to \c true. + * + * \sa base, AbstractAxis3D::labels + */ + +/*! + * \internal + */ +QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPrivate *d, + QObject *parent) : + QValue3DAxisFormatter(d, parent) +{ +} + +/*! + * Constructs a new QLogValue3DAxisFormatter instance with optional \a parent. + */ +QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QObject *parent) : + QValue3DAxisFormatter(new QLogValue3DAxisFormatterPrivate(this), parent) +{ +} + +/*! + * Destroys QLogValue3DAxisFormatter. + */ +QLogValue3DAxisFormatter::~QLogValue3DAxisFormatter() +{ +} + +/*! + * \property QLogValue3DAxisFormatter::base + * + * The \a base of the logarithm used to map axis values. If the base is non-zero, the parent axis + * segment count will be automatically adjusted whenever the axis formatter is recalculated. + * If you want the range to be divided into equal segments like normal value axis, set this + * property value to zero. + * + * The \a base has to be zero or positive value and not equal to one. + * Defaults to ten. + * + * \sa QValue3DAxis::segmentCount + */ +void QLogValue3DAxisFormatter::setBase(qreal base) +{ + if (base < 0.0f || base == 1.0f) { + qWarning() << "Warning: The logarithm base must be greater than 0 and not equal to 1," + << "attempted:" << base; + return; + } + if (dptr()->m_base != base) { + dptr()->m_base = base; + markDirty(true); + emit baseChanged(base); + } +} + +qreal QLogValue3DAxisFormatter::base() const +{ + return dptrc()->m_base; +} + +/*! + * \property QLogValue3DAxisFormatter::autoSubGrid + * + * If this property value is set to \c true, the parent axis sub-segment count is adjusted + * automatically according to the base property value. The number of subsegments is set to + * base value minus one, rounded up. + * Defaults to \c true. + * + * \sa base, QValue3DAxis::subSegmentCount + */ +void QLogValue3DAxisFormatter::setAutoSubGrid(bool enabled) +{ + if (dptr()->m_autoSubGrid != enabled) { + dptr()->m_autoSubGrid = enabled; + markDirty(false); + emit autoSubGridChanged(enabled); + } +} + +bool QLogValue3DAxisFormatter::autoSubGrid() const +{ + return dptrc()->m_autoSubGrid; +} + +/*! + * \property QLogValue3DAxisFormatter::showMaxLabel + * + * When the base property is non-zero, the segments get automatically generated, and depending + * on the range, the last segment is often smaller than the other segments. In extreme cases this + * can lead to overlapping labels on the last two grid lines. By setting this property to \c false, + * you can suppress showing the max label for the axis in cases where the segments do not exactly + * fit the axis. + * Defaults to \c true. + * + * \sa base, QAbstract3DAxis::labels + */ +void QLogValue3DAxisFormatter::setShowMaxLabel(bool enabled) +{ + if (dptr()->m_showMaxLabel != enabled) { + dptr()->m_showMaxLabel = enabled; + markDirty(true); + emit showMaxLabelChanged(enabled); + } +} + +bool QLogValue3DAxisFormatter::showMaxLabel() const +{ + return dptrc()->m_showMaxLabel; +} + +/*! + * \internal + */ +bool QLogValue3DAxisFormatter::allowNegatives() const +{ + return false; +} + +/*! + * \internal + */ +bool QLogValue3DAxisFormatter::allowZero() const +{ + return false; +} + +/*! + * \internal + */ +QValue3DAxisFormatter *QLogValue3DAxisFormatter::createNewInstance() const +{ + return new QLogValue3DAxisFormatter(); +} + +/*! + * \internal + */ +void QLogValue3DAxisFormatter::recalculate() +{ + dptr()->recalculate(); +} + +/*! + * \internal + */ +float QLogValue3DAxisFormatter::positionAt(float value) const +{ + return dptrc()->positionAt(value); +} + +/*! + * \internal + */ +float QLogValue3DAxisFormatter::valueAt(float position) const +{ + return dptrc()->valueAt(position); +} + +/*! + * \internal + */ +void QLogValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const +{ + QValue3DAxisFormatter::populateCopy(copy); + dptrc()->populateCopy(copy); +} + +/*! + * \internal + */ +QString QLogValue3DAxisFormatter::labelForIndex(int index) const +{ + return dptrc()->labelForIndex(index); +} + +/*! + * \internal + */ +QLogValue3DAxisFormatterPrivate *QLogValue3DAxisFormatter::dptr() +{ + return static_cast(d_ptr.data()); +} + +/*! + * \internal + */ +const QLogValue3DAxisFormatterPrivate *QLogValue3DAxisFormatter::dptrc() const +{ + return static_cast(d_ptr.data()); +} + +// QLogValue3DAxisFormatterPrivate +QLogValue3DAxisFormatterPrivate::QLogValue3DAxisFormatterPrivate(QLogValue3DAxisFormatter *q) + : QValue3DAxisFormatterPrivate(q), + m_base(10.0f), + m_logMin(0.0f), + m_logMax(0.0f), + m_logRangeNormalizer(0.0f), + m_autoSubGrid(true), + m_showMaxLabel(true), + m_evenSegments(true) +{ +} + +QLogValue3DAxisFormatterPrivate::~QLogValue3DAxisFormatterPrivate() +{ +} + +void QLogValue3DAxisFormatterPrivate::recalculate() +{ + if (m_base > 0.0) { + // Update parent axis segment counts + qreal logMin = qLn(qreal(m_min)) / qLn(m_base); + qreal logMax = qLn(qreal(m_max)) / qLn(m_base); + qreal logRangeNormalizer = logMax - logMin; + + int segmentCount = qCeil(logRangeNormalizer); + + m_axis->setSegmentCount(segmentCount); + if (m_autoSubGrid) { + int subSegmentCount = qCeil(m_base) - 1; + if (subSegmentCount < 1) + subSegmentCount = 1; + m_axis->setSubSegmentCount(subSegmentCount); + } + + resetPositionArrays(); + + // Calculate segment positions + for (int i = 0; i < segmentCount; i++) { + float gridValue = float(qreal(i) / logRangeNormalizer); + m_gridPositions[i] = gridValue; + m_labelPositions[i] = gridValue; + } + // Ensure max value doesn't suffer from any rounding errors + m_gridPositions[segmentCount] = 1.0f; + m_labelPositions[segmentCount] = 1.0f; + float lastDiff = 1.0f - m_labelPositions.at(segmentCount - 1); + float firstDiff = m_labelPositions.at(1) - m_labelPositions.at(0); + m_evenSegments = qFuzzyCompare(lastDiff, firstDiff); + } else { + // Grid lines and label positions are the same as the parent class, so call parent impl + // first to populate those + QValue3DAxisFormatterPrivate::doRecalculate(); + m_evenSegments = true; + } + + // When doing position/value mappings, base doesn't matter, so just use natural logarithm + m_logMin = qLn(qreal(m_min)); + m_logMax = qLn(qreal(m_max)); + m_logRangeNormalizer = m_logMax - m_logMin; + + // Subgrid line positions are logarithmically spaced + int subGridCount = m_axis->subSegmentCount() - 1; + if (subGridCount > 0) { + float firstSegmentRange = valueAt(m_gridPositions.at(1)) - m_min; + float subSegmentStep = firstSegmentRange / float(subGridCount + 1); + + // Since the logarithm has the same curvature across whole axis range, we can just calculate + // subgrid positions for the first segment and replicate them to other segments. + QVector actualSubSegmentSteps(subGridCount); + + for (int i = 0; i < subGridCount; i++) { + float currentSubPosition = positionAt(m_min + ((i + 1) * subSegmentStep)); + actualSubSegmentSteps[i] = currentSubPosition; + } + + int segmentCount = m_axis->segmentCount(); + for (int i = 0; i < segmentCount; i++) { + for (int j = 0; j < subGridCount; j++) { + float position = m_gridPositions.at(i) + actualSubSegmentSteps.at(j); + if (position > 1.0f) + position = 1.0f; + m_subGridPositions[i][j] = position; + } + } + } +} + +void QLogValue3DAxisFormatterPrivate::populateCopy(QValue3DAxisFormatter ©) const +{ + QLogValue3DAxisFormatter *logFormatter = static_cast(©); + QLogValue3DAxisFormatterPrivate *priv = logFormatter->dptr(); + + priv->m_base = m_base; + priv->m_logMin = m_logMin; + priv->m_logMax = m_logMax; + priv->m_logRangeNormalizer = m_logRangeNormalizer; +} + +float QLogValue3DAxisFormatterPrivate::positionAt(float value) const +{ + qreal logValue = qLn(qreal(value)); + float retval = float((logValue - m_logMin) / m_logRangeNormalizer); + + return retval; +} + +float QLogValue3DAxisFormatterPrivate::valueAt(float position) const +{ + qreal logValue = (qreal(position) * m_logRangeNormalizer) + m_logMin; + return float(qExp(logValue)); +} + +QString QLogValue3DAxisFormatterPrivate::labelForIndex(int index) const +{ + if (index == m_gridPositions.size() - 1 && !m_evenSegments && !m_showMaxLabel) + return QString(); + else + return QValue3DAxisFormatterPrivate::labelForIndex(index); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.h b/src/datavisualization/axis/qlogvalue3daxisformatter.h new file mode 100644 index 00000000..33466492 --- /dev/null +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef QLOGVALUE3DAXISFORMATTER_H +#define QLOGVALUE3DAXISFORMATTER_H + +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QLogValue3DAxisFormatterPrivate; + +class QT_DATAVISUALIZATION_EXPORT QLogValue3DAxisFormatter : public QValue3DAxisFormatter +{ + Q_OBJECT + + Q_PROPERTY(qreal base READ base WRITE setBase NOTIFY baseChanged) + Q_PROPERTY(bool autoSubGrid READ autoSubGrid WRITE setAutoSubGrid NOTIFY autoSubGridChanged) + Q_PROPERTY(bool showMaxLabel READ showMaxLabel WRITE setShowMaxLabel NOTIFY showMaxLabelChanged) + +protected: + explicit QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPrivate *d, QObject *parent = 0); +public: + explicit QLogValue3DAxisFormatter(QObject *parent = 0); + virtual ~QLogValue3DAxisFormatter(); + + void setBase(qreal base); + qreal base() const; + void setAutoSubGrid(bool enabled); + bool autoSubGrid() const; + void setShowMaxLabel(bool enabled); + bool showMaxLabel() const; + +signals: + void baseChanged(qreal base); + void autoSubGridChanged(bool enabled); + void showMaxLabelChanged(bool enabled); + +protected: + virtual bool allowNegatives() const; + virtual bool allowZero() const; + virtual QValue3DAxisFormatter *createNewInstance() const; + virtual void recalculate(); + virtual float positionAt(float value) const; + virtual float valueAt(float position) const; + virtual void populateCopy(QValue3DAxisFormatter ©) const; + virtual QString labelForIndex(int index) const; + + QLogValue3DAxisFormatterPrivate *dptr(); + const QLogValue3DAxisFormatterPrivate *dptrc() const; + +private: + Q_DISABLE_COPY(QLogValue3DAxisFormatter) + + friend class QLogValue3DAxisFormatterPrivate; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h new file mode 100644 index 00000000..44b5c80c --- /dev/null +++ b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include "datavisualizationglobal_p.h" +#include "qlogvalue3daxisformatter.h" +#include "qvalue3daxisformatter_p.h" + +#ifndef QLOGVALUE3DAXISFORMATTER_P_H +#define QLOGVALUE3DAXISFORMATTER_P_H + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QLogValue3DAxis; + +class QLogValue3DAxisFormatterPrivate : public QValue3DAxisFormatterPrivate +{ + Q_OBJECT + +public: + QLogValue3DAxisFormatterPrivate(QLogValue3DAxisFormatter *q); + virtual ~QLogValue3DAxisFormatterPrivate(); + + void recalculate(); + void populateCopy(QValue3DAxisFormatter ©) const; + + float positionAt(float value) const; + float valueAt(float position) const; + QString labelForIndex(int index) const; + +protected: + QLogValue3DAxisFormatter *qptr(); + + qreal m_base; + qreal m_logMin; + qreal m_logMax; + qreal m_logRangeNormalizer; + bool m_autoSubGrid; + bool m_showMaxLabel; + +private: + bool m_evenSegments; + + friend class QLogValue3DAxisFormatter; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 841349dd..b0b8caa6 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -105,7 +105,7 @@ void QValue3DAxis::setSegmentCount(int count) << count << "-> 1"; count = 1; } - if (dptr()->m_segmentCount != count){ + if (dptr()->m_segmentCount != count) { dptr()->m_segmentCount = count; dptr()->emitLabelsChanged(); emit segmentCountChanged(count); @@ -270,10 +270,8 @@ void QValue3DAxisPrivate::updateLabels() newLabels.reserve(m_segmentCount + 1); m_formatter->d_ptr->recalculate(); - for (int i = 0; i <= m_segmentCount; i++) { - float value = m_formatter->valueAt(m_formatter->gridPositions().at(i)); - newLabels.append(m_formatter->stringForValue(value, m_labelFormat)); - } + for (int i = 0; i <= m_segmentCount; i++) + newLabels.append(m_formatter->labelForIndex(i)); if (m_labels != newLabels) m_labels = newLabels; diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index ff281f0c..b49447af 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -46,11 +46,12 @@ public: virtual void setMin(float min); virtual void setMax (float max); + void emitLabelsChanged(); + signals: void formatterDirty(); protected: - void emitLabelsChanged(); virtual void updateLabels(); virtual bool allowZero(); diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index c8e0a662..b1183023 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -33,7 +33,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * The base class has no public API beyond constructors and destructors. It is meant to be only * used internally. However, subclasses may implement public properties as needed. * - * \sa QLog3DAxisFormatter + * \sa QLogValue3DAxisFormatter */ /*! @@ -108,25 +108,42 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const * any values needed for mapping between value and position. It is allowed to access * the parent axis from inside this function. * - * This method must be reimplemented in a subclass. + * This method must be reimplemented in a subclass. The resetPositionArrays() method must be called + * in the subclass implementation before the position arrays are recalculated. If the subclass + * implementation changes any parent axis values, these changes must be done before + * the resetPositionArrays() call. * * See gridPositions(), subGridPositions(), and labelPositions() documentation about the arrays * that need to be populated. * - * \sa gridPositions(), subGridPositions(), labelPositions(), axis() + * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetPositionArrays() */ void QValue3DAxisFormatter::recalculate() { d_ptr->doRecalculate(); } +/*! + * The parent axis uses this method to request axis label strings for label \a index. + * Reimplement this method if default labeling is not sufficient. + * If an empty string is returned, the label is not shown. + * + * \return A string formatted using axis label formatter. + * + * \sa stringForValue() + */ +QString QValue3DAxisFormatter::labelForIndex(int index) const +{ + return d_ptr->labelForIndex(index); +} + /*! * Reimplement this method in a subclass to resolve the formatted string for a given \a value * if the default formatting provided by QValue3DAxis::labelFormat property is not sufficient. * * \return the formatted label string using \a value and \a format. * - * \sa recalculate(), stringForValue(), QValue3DAxis::labelFormat + * \sa recalculate(), labelForIndex(), QValue3DAxis::labelFormat */ QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) const { @@ -141,7 +158,7 @@ QString QValue3DAxisFormatter::stringForValue(float value, const QString &format * The returned value should be between 0.0 (for minimum value) and 1.0 (for maximum value), * inclusive, if the value is within the parent axis range. * - * \sa doRecalculate(), positionAt() + * \sa recalculate(), valueAt() */ float QValue3DAxisFormatter::positionAt(float value) const { @@ -156,7 +173,7 @@ float QValue3DAxisFormatter::positionAt(float value) const * The \a position value should be between 0.0 (for minimum value) and 1.0 (for maximum value), * inclusive to obtain values within the parent axis range. * - * \sa doRecalculate(), positionAt() + * \sa recalculate(), positionAt() */ float QValue3DAxisFormatter::valueAt(float position) const { @@ -175,14 +192,27 @@ void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const d_ptr->doPopulateCopy(*(copy.d_ptr.data())); } +/*! + * Resets the position arrays based on values read from the parent axis. + * This must be called in recalculate method before the arrays are accessed in subclasses, + * but after any changes to the values of the parent axis. + * + * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), recalculate() + */ +void QValue3DAxisFormatter::resetPositionArrays() +{ + d_ptr->resetPositionArrays(); +} + /*! * Marks this formatter dirty, prompting the renderer to make a new copy of its cache on the next * renderer synchronization. This method should be called by a subclass whenever the formatter - * is changed in a way that affects the resolved values. + * is changed in a way that affects the resolved values. Specify \c true for \a labelsChange + * parameter if the change was such that it requires regenerating the parent axis label strings. */ -void QValue3DAxisFormatter::markDirty() +void QValue3DAxisFormatter::markDirty(bool labelsChange) { - d_ptr->markDirty(); + d_ptr->markDirty(labelsChange); } /*! @@ -197,10 +227,12 @@ QValue3DAxis *QValue3DAxisFormatter::axis() const } /*! - * \return Returns a reference to the array of normalized grid positions. + * \return a reference to the array of normalized grid positions. * The array size is equal to the segment count of the parent axis plus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * The grid line at the index zero corresponds to the minimum value of the axis. + * + * \sa QValue3DAxis::segmentCount */ QVector &QValue3DAxisFormatter::gridPositions() const { @@ -208,10 +240,12 @@ QVector &QValue3DAxisFormatter::gridPositions() const } /*! - * \return Returns a reference to the array of normalized subgrid positions. - * The array size is equal to segment count of tha parent axis times subsegment count of the parent + * \return a reference to the array of normalized subgrid positions. + * The array size is equal to segment count of the parent axis times sub-segment count of the parent * axis minus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. + * + * \sa QValue3DAxis::segmentCount, QValue3DAxis::subSegmentCount */ QVector > &QValue3DAxisFormatter::subGridPositions() const { @@ -219,10 +253,12 @@ QVector > &QValue3DAxisFormatter::subGridPositions() const } /*! - * \return Returns a reference to the array of normalized label positions. + * \return a reference to the array of normalized label positions. * The array size is equal to the segment count of the parent axis plus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * The label at the index zero corresponds to the minimum value of the axis. + * + * \sa QValue3DAxis::segmentCount, QAbstract3DAxis::labels */ QVector &QValue3DAxisFormatter::labelPositions() const { @@ -250,40 +286,29 @@ void QValue3DAxisFormatterPrivate::recalculate() { // Only recalculate if we need to and have m_axis pointer. If we do not have // m_axis, either we are not attached to an axis or this is a renderer cache. - if (m_axis && m_needsRecalculate) + if (m_axis && m_needsRecalculate) { + m_min = m_axis->min(); + m_max = m_axis->max(); + m_rangeNormalizer = (m_max - m_min); + q_ptr->recalculate(); + m_needsRecalculate = false; + } } void QValue3DAxisFormatterPrivate::doRecalculate() { - m_needsRecalculate = false; - - m_gridPositions.clear(); - m_subGridPositions.clear(); - m_labelPositions.clear(); + resetPositionArrays(); int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; - m_min = m_axis->min(); - m_max = m_axis->max(); - m_rangeNormalizer = (m_max - m_min); - - m_gridPositions.resize(segmentCount + 1); float segmentStep = 1.0f / float(segmentCount); float subSegmentStep = 0; - - if (subGridCount > 0) { - subSegmentStep = segmentStep / (subGridCount + 1); - m_subGridPositions.resize(segmentCount); - for (int i = 0; i < segmentCount; i++) - m_subGridPositions[i].resize(subGridCount); - } - - m_labelPositions.resize(segmentCount + 1); + if (subGridCount > 0) + subSegmentStep = segmentStep / float(subGridCount + 1); // Calculate positions - for (int i = 0; i < segmentCount; i++) { float gridValue = segmentStep * i; m_gridPositions[i] = gridValue; @@ -316,6 +341,11 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate & copy.m_subGridPositions = m_subGridPositions; } +QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const +{ + return q_ptr->stringForValue(q_ptr->valueAt(m_gridPositions.at(index)), m_axis->labelFormat()); +} + QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString &format) { if (m_previousLabelFormat.compare(format)) { @@ -343,20 +373,47 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) Q_ASSERT(axis); connect(axis, &QValue3DAxis::segmentCountChanged, - this, &QValue3DAxisFormatterPrivate::markDirty); + this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); connect(axis, &QValue3DAxis::subSegmentCountChanged, - this, &QValue3DAxisFormatterPrivate::markDirty); + this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); connect(axis, &QAbstract3DAxis::rangeChanged, - this, &QValue3DAxisFormatterPrivate::markDirty); + this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); m_axis = axis; } -void QValue3DAxisFormatterPrivate::markDirty() +void QValue3DAxisFormatterPrivate::resetPositionArrays() +{ + m_gridPositions.clear(); + m_subGridPositions.clear(); + m_labelPositions.clear(); + + int segmentCount = m_axis->segmentCount(); + int subGridCount = m_axis->subSegmentCount() - 1; + + m_gridPositions.resize(segmentCount + 1); + + if (subGridCount > 0) { + m_subGridPositions.resize(segmentCount); + for (int i = 0; i < segmentCount; i++) + m_subGridPositions[i].resize(subGridCount); + } + + m_labelPositions.resize(segmentCount + 1); +} + +void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange) { m_needsRecalculate = true; + if (labelsChange) + m_axis->dptr()->emitLabelsChanged(); if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone) emit m_axis->dptr()->formatterDirty(); } +void QValue3DAxisFormatterPrivate::markDirtyNoLabelChange() +{ + markDirty(false); +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index 14ecdc15..6e0e873a 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -43,12 +43,14 @@ protected: virtual bool allowZero() const; virtual QValue3DAxisFormatter *createNewInstance() const; virtual void recalculate(); + virtual QString labelForIndex(int index) const; virtual QString stringForValue(float value, const QString &format) const; virtual float positionAt(float value) const; virtual float valueAt(float position) const; virtual void populateCopy(QValue3DAxisFormatter ©) const; - void markDirty(); + void resetPositionArrays(); + void markDirty(bool labelsChange = false); QValue3DAxis *axis() const; QVector &gridPositions() const; @@ -67,6 +69,7 @@ private: friend class Surface3DRenderer; friend class SurfaceObject; friend class QValue3DAxisFormatterPrivate; + friend class QLogValue3DAxisFormatter; friend class QValue3DAxis; friend class QValue3DAxisPrivate; friend class AxisRenderCache; diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index d9f90934..74b6f20f 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -51,14 +51,17 @@ public: void populateCopy(QValue3DAxisFormatter ©); void doPopulateCopy(QValue3DAxisFormatterPrivate ©); + QString labelForIndex(int index) const; QString stringForValue(float value, const QString &format); float positionAt(float value) const; float valueAt(float position) const; void setAxis(QValue3DAxis *axis); + void resetPositionArrays(); + void markDirty(bool labelsChange); public slots: - void markDirty(); + void markDirtyNoLabelChange(); protected: QValue3DAxisFormatter *q_ptr; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index a6c086aa..7f905243 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -183,6 +183,31 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.selectionModeChanged = false; } + if (m_changeTracker.axisXFormatterChanged) { + m_changeTracker.axisXFormatterChanged = false; + if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisX = static_cast(m_axisX); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationX, + valueAxisX->formatter()); + } + } + if (m_changeTracker.axisYFormatterChanged) { + m_changeTracker.axisYFormatterChanged = false; + if (m_axisY->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisY = static_cast(m_axisY); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationY, + valueAxisY->formatter()); + } + } + if (m_changeTracker.axisZFormatterChanged) { + m_changeTracker.axisZFormatterChanged = false; + if (m_axisZ->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisZ = static_cast(m_axisZ); + m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationZ, + valueAxisZ->formatter()); + } + } + if (m_changeTracker.axisXTypeChanged) { m_renderer->updateAxisType(QAbstract3DAxis::AxisOrientationX, m_axisX->type()); m_changeTracker.axisXTypeChanged = false; @@ -326,31 +351,6 @@ void Abstract3DController::synchDataToRenderer() } } - if (m_changeTracker.axisXFormatterChanged) { - m_changeTracker.axisXFormatterChanged = false; - if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { - QValue3DAxis *valueAxisX = static_cast(m_axisX); - m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationX, - valueAxisX->formatter()); - } - } - if (m_changeTracker.axisYFormatterChanged) { - m_changeTracker.axisYFormatterChanged = false; - if (m_axisY->type() & QAbstract3DAxis::AxisTypeValue) { - QValue3DAxis *valueAxisY = static_cast(m_axisY); - m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationY, - valueAxisY->formatter()); - } - } - if (m_changeTracker.axisZFormatterChanged) { - m_changeTracker.axisZFormatterChanged = false; - if (m_axisZ->type() & QAbstract3DAxis::AxisTypeValue) { - QValue3DAxis *valueAxisZ = static_cast(m_axisZ); - m_renderer->updateAxisFormatter(QAbstract3DAxis::AxisOrientationZ, - valueAxisZ->formatter()); - } - } - if (m_isSeriesVisibilityDirty || m_isSeriesVisualsDirty) { m_renderer->updateSeries(m_seriesList, m_isSeriesVisibilityDirty); m_isSeriesVisibilityDirty = false; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index c5e265aa..f0aec0cc 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -345,6 +345,7 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache.setCtrlFormatter(formatter); } formatter->d_ptr->populateCopy(*(cache.formatter())); + cache.markPositionsDirty(); } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index eede9917..f37857d9 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -33,6 +33,7 @@ #include "labelitem_p.h" #include "qabstract3daxis_p.h" #include "drawer_p.h" +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -66,11 +67,11 @@ public: m_formatter = formatter; m_positionsDirty = true; } inline QValue3DAxisFormatter *formatter() const { return m_formatter; } - inline void setCtrlFormatter(const QValue3DAxisFormatter *formatter) + inline void setCtrlFormatter(QValue3DAxisFormatter *formatter) { m_ctrlFormatter = formatter; } - inline const QValue3DAxisFormatter *ctrlFormatter() const { return m_ctrlFormatter; } + inline QValue3DAxisFormatter *ctrlFormatter() const { return m_ctrlFormatter; } inline LabelItem &titleItem() { return m_titleItem; } inline QList &labelItems() { return m_labelItems; } @@ -80,6 +81,7 @@ public: inline int labelCount() { return m_adjustedLabelPositions.size(); } void updateAllPositions(); inline bool positionsDirty() const { return m_positionsDirty; } + inline void markPositionsDirty() { m_positionsDirty = true; } inline void setTranslate(float translate) { m_translate = translate; m_positionsDirty = true; } inline float translate() { return m_translate; } inline void setScale(float scale) { m_scale = scale; m_positionsDirty = true; } @@ -106,7 +108,7 @@ private: QString m_labelFormat; QFont m_font; QValue3DAxisFormatter *m_formatter; - const QValue3DAxisFormatter *m_ctrlFormatter; + QPointer m_ctrlFormatter; // Renderer items Drawer *m_drawer; // Not owned diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index ed99e49e..9ce80081 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -900,6 +900,7 @@ void Surface3DRenderer::drawSlicedScene() // Vertical lines QVector3D gridLineScaleY(gridLineWidth, backgroundMargin, gridLineWidth); + gridLineCount = sliceCache.gridLineCount(); for (int line = 0; line < gridLineCount; line++) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index cf044a45..c6c7678d 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -20,13 +20,14 @@ #include "custominputhandler.h" #include #include -#include +#include #include #include #include #include #include -#include +#include +#include using namespace QtDataVisualization; @@ -43,7 +44,7 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog) m_barSpacingX(0.1f), m_barSpacingZ(0.1f), m_fontSize(20), - m_segments(4), + m_segments(10), m_subSegments(3), m_minval(-16.0f), m_maxval(20.0f), @@ -222,6 +223,8 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog) &GraphModifier::handleValueAxisChanged); QObject::connect(m_graph, &Q3DBars::primarySeriesChanged, this, &GraphModifier::handlePrimarySeriesChanged); + QObject::connect(m_temperatureAxis, &QAbstract3DAxis::labelsChanged, this, + &GraphModifier::handleValueAxisLabelsChanged); QObject::connect(&m_insertRemoveTimer, &QTimer::timeout, this, &GraphModifier::insertRemoveTimerTimeout); @@ -1047,15 +1050,85 @@ void GraphModifier::toggleRotation() void GraphModifier::useLogAxis() { - // TODO proper log axis test + static int counter = -1; + static QLogValue3DAxisFormatter *logFormatter = new QLogValue3DAxisFormatter; + + counter++; + + switch (counter) { + case 0: { + qDebug() << "Case" << counter << ": Default log axis"; + logFormatter = new QLogValue3DAxisFormatter; + m_graph->valueAxis()->setFormatter(logFormatter); + m_graph->valueAxis()->setRange(1.0f, 1200.0f); + m_graph->valueAxis()->setLabelFormat(QStringLiteral("%.3f")); + break; + } + case 1: { + qDebug() << "Case" << counter << ": Hide max label"; + logFormatter->setShowMaxLabel(false); + break; + } + case 2: { + qDebug() << "Case" << counter << ": Try to hide subgrid unsuccessfully"; + m_graph->valueAxis()->setSubSegmentCount(1); + break; + } + case 3: { + qDebug() << "Case" << counter << ": Hide subgrid property"; + logFormatter->setAutoSubGrid(false); + m_graph->valueAxis()->setSubSegmentCount(1); + break; + } + case 4: { + qDebug() << "Case" << counter << ": Different base: 2"; + logFormatter->setBase(2.0f); + logFormatter->setAutoSubGrid(true); + break; + } + case 5: { + qDebug() << "Case" << counter << ": Different base: 16"; + logFormatter->setBase(16.0f); + break; + } + case 6: { + qDebug() << "Case" << counter << ": Invalid bases"; + logFormatter->setBase(-1.0f); + logFormatter->setBase(1.0f); + break; + } + case 7: { + qDebug() << "Case" << counter << ": Zero base"; + logFormatter->setBase(0.0f); + break; + } + case 8: { + qDebug() << "Case" << counter << ": Explicit ranges and segments"; + int segmentCount = 6; + int base = 4; + m_graph->valueAxis()->setSegmentCount(segmentCount); + m_graph->valueAxis()->setSubSegmentCount(base - 1); + m_graph->valueAxis()->setRange(1.0f / float(base * base), qPow(base, segmentCount - 2)); + break; + } + case 9: { + qDebug() << "Case" << counter << ": Negative range"; + m_graph->valueAxis()->setRange(-20.0f, 50.0f); + break; + } + case 10: { + qDebug() << "Case" << counter << ": Non-integer base"; + logFormatter->setBase(3.3f); + logFormatter->setAutoSubGrid(true); + break; + } + default: + qDebug() << "Resetting logaxis test"; + counter = -1; + break; + } -// // Change y-axis to log axis -// QValue3DAxis *logAxis = new QValue3DAxis; -// logAxis->formatter()->setBase(10); -// logAxis->setSegmentCount(5); -// logAxis->setRange(1, 100000); - // m_graph->setValueAxis(logAxis); } void GraphModifier::changeValueAxisFormat(const QString & text) @@ -1063,6 +1136,21 @@ void GraphModifier::changeValueAxisFormat(const QString & text) m_graph->valueAxis()->setLabelFormat(text); } +void GraphModifier::changeLogBase(const QString &text) +{ + QLogValue3DAxisFormatter *formatter = + qobject_cast(m_graph->valueAxis()->formatter()); + if (formatter) + formatter->setBase(qreal(text.toDouble())); +} + +void GraphModifier::changeValueAxisSegments(int value) +{ + qDebug() << __FUNCTION__ << value; + m_segments = value; + m_graph->valueAxis()->setSegmentCount(m_segments); +} + void GraphModifier::insertRemoveTimerTimeout() { if (m_insertRemoveStep < 32) { @@ -1119,6 +1207,11 @@ void GraphModifier::triggerRotation() } } +void GraphModifier::handleValueAxisLabelsChanged() +{ + qDebug() << __FUNCTION__; +} + void GraphModifier::setBackgroundEnabled(int enabled) { m_graph->activeTheme()->setBackgroundEnabled(bool(enabled)); diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 304103cd..52c46a8c 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -87,6 +87,7 @@ public: void toggleRotation(); void useLogAxis(); void changeValueAxisFormat(const QString & text); + void changeLogBase(const QString & text); public slots: void flipViews(); @@ -96,6 +97,7 @@ public slots: void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality); void handleSelectionChange(const QPoint &position); void setUseNullInputHandler(bool useNull); + void changeValueAxisSegments(int value); void handleRowAxisChanged(QCategory3DAxis *axis); void handleColumnAxisChanged(QCategory3DAxis *axis); @@ -105,6 +107,7 @@ public slots: void insertRemoveTimerTimeout(); void triggerSelection(); void triggerRotation(); + void handleValueAxisLabelsChanged(); signals: void shadowQualityChanged(int quality); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index edf61e2e..f4cd02f7 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -33,6 +33,7 @@ #include #include #include +#include int main(int argc, char **argv) { @@ -292,6 +293,11 @@ int main(int argc, char **argv) shadowQuality->setCurrentIndex(5); QLineEdit *valueAxisFormatEdit = new QLineEdit(widget); + QLineEdit *logBaseEdit = new QLineEdit(widget); + QSpinBox *valueAxisSegmentsSpin = new QSpinBox(widget); + valueAxisSegmentsSpin->setMinimum(1); + valueAxisSegmentsSpin->setMaximum(100); + valueAxisSegmentsSpin->setValue(10); vLayout->addWidget(addDataButton, 0, Qt::AlignTop); vLayout->addWidget(addMultiDataButton, 0, Qt::AlignTop); @@ -320,7 +326,6 @@ int main(int argc, char **argv) vLayout->addWidget(ownThemeButton, 0, Qt::AlignTop); vLayout->addWidget(primarySeriesTestsButton, 0, Qt::AlignTop); vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop); - vLayout->addWidget(logAxisButton, 0, Qt::AlignTop); vLayout->addWidget(gradientBtoYPB, 1, Qt::AlignTop); vLayout2->addWidget(staticCheckBox, 0, Qt::AlignTop); @@ -349,7 +354,12 @@ int main(int argc, char **argv) vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size")), 0, Qt::AlignTop); vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Value axis format")), 0, Qt::AlignTop); - vLayout2->addWidget(valueAxisFormatEdit, 1, Qt::AlignTop); + vLayout2->addWidget(valueAxisFormatEdit, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Log axis base")), 0, Qt::AlignTop); + vLayout2->addWidget(logBaseEdit, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Value axis segments")), 0, Qt::AlignTop); + vLayout2->addWidget(valueAxisSegmentsSpin, 0, Qt::AlignTop); + vLayout->addWidget(logAxisButton, 1, Qt::AlignTop); // TODO: Add example for setMeshFileName widget->show(); @@ -387,6 +397,10 @@ int main(int argc, char **argv) &GraphModifier::changeFontSize); QObject::connect(valueAxisFormatEdit, &QLineEdit::textEdited, modifier, &GraphModifier::changeValueAxisFormat); + QObject::connect(logBaseEdit, &QLineEdit::textEdited, modifier, + &GraphModifier::changeLogBase); + QObject::connect(valueAxisSegmentsSpin, SIGNAL(valueChanged(int)), modifier, + SLOT(changeValueAxisSegments(int))); QObject::connect(multiScaleButton, &QPushButton::clicked, modifier, &GraphModifier::toggleMultiseriesScaling); -- cgit v1.2.3 From 1e99ff2c532977d21776f5f363b8171ef147a7d9 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 26 Mar 2014 09:52:28 +0200 Subject: Make axis labels more accurate by using qreals for label values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also refactor axis formatter sub grid array to be one dimensional. There is no need to know which segment each sub grid line belongs to. Change-Id: Ie9813088650fcc0ca844f3c358ea1abae9258367 Reviewed-by: Tomi Korpipää --- .../axis/qlogvalue3daxisformatter.cpp | 25 +++++--- .../axis/qvalue3daxisformatter.cpp | 66 +++++++++++++--------- src/datavisualization/axis/qvalue3daxisformatter.h | 7 ++- .../axis/qvalue3daxisformatter_p.h | 7 ++- src/datavisualization/engine/axisrendercache.cpp | 37 ++++++------ src/datavisualization/engine/bars3drenderer.cpp | 8 +-- src/datavisualization/engine/scatter3drenderer.cpp | 6 +- src/datavisualization/engine/surface3drenderer.cpp | 6 +- src/datavisualization/utils/utils.cpp | 2 +- src/datavisualization/utils/utils_p.h | 2 +- 10 files changed, 94 insertions(+), 72 deletions(-) diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp index 36f27c02..17ae4476 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp @@ -293,6 +293,11 @@ QLogValue3DAxisFormatterPrivate::~QLogValue3DAxisFormatterPrivate() void QLogValue3DAxisFormatterPrivate::recalculate() { + // When doing position/value mappings, base doesn't matter, so just use natural logarithm + m_logMin = qLn(qreal(m_min)); + m_logMax = qLn(qreal(m_max)); + m_logRangeNormalizer = m_logMax - m_logMin; + if (m_base > 0.0) { // Update parent axis segment counts qreal logMin = qLn(qreal(m_min)) / qLn(m_base); @@ -309,17 +314,19 @@ void QLogValue3DAxisFormatterPrivate::recalculate() m_axis->setSubSegmentCount(subSegmentCount); } - resetPositionArrays(); + resetArrays(); // Calculate segment positions for (int i = 0; i < segmentCount; i++) { - float gridValue = float(qreal(i) / logRangeNormalizer); + float gridValue = float(i) / float(logRangeNormalizer); m_gridPositions[i] = gridValue; m_labelPositions[i] = gridValue; + m_labelValues[i] = qPow(m_base, qreal(i) + logMin); } // Ensure max value doesn't suffer from any rounding errors m_gridPositions[segmentCount] = 1.0f; m_labelPositions[segmentCount] = 1.0f; + m_labelValues[segmentCount] = qreal(m_max); float lastDiff = 1.0f - m_labelPositions.at(segmentCount - 1); float firstDiff = m_labelPositions.at(1) - m_labelPositions.at(0); m_evenSegments = qFuzzyCompare(lastDiff, firstDiff); @@ -327,13 +334,15 @@ void QLogValue3DAxisFormatterPrivate::recalculate() // Grid lines and label positions are the same as the parent class, so call parent impl // first to populate those QValue3DAxisFormatterPrivate::doRecalculate(); + + // Label value array needs to be repopulated + qreal segmentStep = 1.0 / qreal(m_axis->segmentCount()); + for (int i = 0; i < m_labelPositions.size(); i++) + m_labelValues[i] = qExp(segmentStep * qreal(i) * m_logRangeNormalizer + m_logMin); + m_evenSegments = true; } - // When doing position/value mappings, base doesn't matter, so just use natural logarithm - m_logMin = qLn(qreal(m_min)); - m_logMax = qLn(qreal(m_max)); - m_logRangeNormalizer = m_logMax - m_logMin; // Subgrid line positions are logarithmically spaced int subGridCount = m_axis->subSegmentCount() - 1; @@ -355,8 +364,8 @@ void QLogValue3DAxisFormatterPrivate::recalculate() for (int j = 0; j < subGridCount; j++) { float position = m_gridPositions.at(i) + actualSubSegmentSteps.at(j); if (position > 1.0f) - position = 1.0f; - m_subGridPositions[i][j] = position; + position = 1.0f; + m_subGridPositions[i * subGridCount + j] = position; } } } diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index b1183023..7c7db398 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -104,11 +104,11 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const } /*! - * This method populates the label and grid line position arrays, as well as calculates - * any values needed for mapping between value and position. It is allowed to access + * This method populates the label and grid line position arrays and the label value array, as well + * as calculates any values needed for mapping between value and position. It is allowed to access * the parent axis from inside this function. * - * This method must be reimplemented in a subclass. The resetPositionArrays() method must be called + * This method must be reimplemented in a subclass. The resetArrays() method must be called * in the subclass implementation before the position arrays are recalculated. If the subclass * implementation changes any parent axis values, these changes must be done before * the resetPositionArrays() call. @@ -116,7 +116,7 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const * See gridPositions(), subGridPositions(), and labelPositions() documentation about the arrays * that need to be populated. * - * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetPositionArrays() + * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetArrays() */ void QValue3DAxisFormatter::recalculate() { @@ -145,7 +145,7 @@ QString QValue3DAxisFormatter::labelForIndex(int index) const * * \sa recalculate(), labelForIndex(), QValue3DAxis::labelFormat */ -QString QValue3DAxisFormatter::stringForValue(float value, const QString &format) const +QString QValue3DAxisFormatter::stringForValue(qreal value, const QString &format) const { return d_ptr->stringForValue(value, format); } @@ -199,9 +199,9 @@ void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const * * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), recalculate() */ -void QValue3DAxisFormatter::resetPositionArrays() +void QValue3DAxisFormatter::resetArrays() { - d_ptr->resetPositionArrays(); + d_ptr->resetArrays(); } /*! @@ -227,7 +227,7 @@ QValue3DAxis *QValue3DAxisFormatter::axis() const } /*! - * \return a reference to the array of normalized grid positions. + * \return a reference to the array of normalized grid line positions. * The array size is equal to the segment count of the parent axis plus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * The grid line at the index zero corresponds to the minimum value of the axis. @@ -240,14 +240,14 @@ QVector &QValue3DAxisFormatter::gridPositions() const } /*! - * \return a reference to the array of normalized subgrid positions. + * \return a reference to the array of normalized subgrid line positions. * The array size is equal to segment count of the parent axis times sub-segment count of the parent * axis minus one. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * * \sa QValue3DAxis::segmentCount, QValue3DAxis::subSegmentCount */ -QVector > &QValue3DAxisFormatter::subGridPositions() const +QVector &QValue3DAxisFormatter::subGridPositions() const { return d_ptr->m_subGridPositions; } @@ -265,6 +265,18 @@ QVector &QValue3DAxisFormatter::labelPositions() const return d_ptr->m_labelPositions; } +/*! + * \return a reference to the array of values used to generate label strings. + * The array size is equal to the size of the label positions array and + * the indexes correspond to that array as well. + * + * \sa labelPositions() + */ +QVector &QValue3DAxisFormatter::labelValues() const +{ + return d_ptr->m_labelValues; +} + // QValue3DAxisFormatterPrivate QValue3DAxisFormatterPrivate::QValue3DAxisFormatterPrivate(QValue3DAxisFormatter *q) : QObject(0), @@ -298,24 +310,27 @@ void QValue3DAxisFormatterPrivate::recalculate() void QValue3DAxisFormatterPrivate::doRecalculate() { - resetPositionArrays(); + resetArrays(); int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; - float segmentStep = 1.0f / float(segmentCount); - float subSegmentStep = 0; + // Use qreals for intermediate calculations for better accuracy on label values + qreal segmentStep = 1.0 / qreal(segmentCount); + qreal subSegmentStep = 0; if (subGridCount > 0) - subSegmentStep = segmentStep / float(subGridCount + 1); + subSegmentStep = segmentStep / qreal(subGridCount + 1); // Calculate positions + qreal rangeNormalizer = qreal(m_max - m_min); for (int i = 0; i < segmentCount; i++) { - float gridValue = segmentStep * i; - m_gridPositions[i] = gridValue; - m_labelPositions[i] = gridValue; + qreal gridValue = segmentStep * qreal(i); + m_gridPositions[i] = float(gridValue); + m_labelPositions[i] = float(gridValue); + m_labelValues[i] = gridValue * rangeNormalizer + qreal(m_min); if (m_subGridPositions.size()) { for (int j = 0; j < subGridCount; j++) - m_subGridPositions[i][j] = gridValue + subSegmentStep * (j + 1); + m_subGridPositions[i * subGridCount + j] = gridValue + subSegmentStep * (j + 1); } } @@ -343,10 +358,10 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate & QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const { - return q_ptr->stringForValue(q_ptr->valueAt(m_gridPositions.at(index)), m_axis->labelFormat()); + return q_ptr->stringForValue(m_labelValues.at(index), m_axis->labelFormat()); } -QString QValue3DAxisFormatterPrivate::stringForValue(float value, const QString &format) +QString QValue3DAxisFormatterPrivate::stringForValue(qreal value, const QString &format) { if (m_previousLabelFormat.compare(format)) { // Format string different than the previous one used, reparse it @@ -382,24 +397,21 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) m_axis = axis; } -void QValue3DAxisFormatterPrivate::resetPositionArrays() +void QValue3DAxisFormatterPrivate::resetArrays() { m_gridPositions.clear(); m_subGridPositions.clear(); m_labelPositions.clear(); + m_labelValues.clear(); int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; m_gridPositions.resize(segmentCount + 1); - - if (subGridCount > 0) { - m_subGridPositions.resize(segmentCount); - for (int i = 0; i < segmentCount; i++) - m_subGridPositions[i].resize(subGridCount); - } + m_subGridPositions.resize(segmentCount * subGridCount); m_labelPositions.resize(segmentCount + 1); + m_labelValues.resize(segmentCount + 1); } void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange) diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index 6e0e873a..548135c0 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -44,18 +44,19 @@ protected: virtual QValue3DAxisFormatter *createNewInstance() const; virtual void recalculate(); virtual QString labelForIndex(int index) const; - virtual QString stringForValue(float value, const QString &format) const; + virtual QString stringForValue(qreal value, const QString &format) const; virtual float positionAt(float value) const; virtual float valueAt(float position) const; virtual void populateCopy(QValue3DAxisFormatter ©) const; - void resetPositionArrays(); + void resetArrays(); void markDirty(bool labelsChange = false); QValue3DAxis *axis() const; QVector &gridPositions() const; - QVector > &subGridPositions() const; + QVector &subGridPositions() const; QVector &labelPositions() const; + QVector &labelValues() const; QScopedPointer d_ptr; diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index 74b6f20f..b6749fb3 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -52,12 +52,12 @@ public: void doPopulateCopy(QValue3DAxisFormatterPrivate ©); QString labelForIndex(int index) const; - QString stringForValue(float value, const QString &format); + QString stringForValue(qreal value, const QString &format); float positionAt(float value) const; float valueAt(float position) const; void setAxis(QValue3DAxis *axis); - void resetPositionArrays(); + void resetArrays(); void markDirty(bool labelsChange); public slots: @@ -73,8 +73,9 @@ protected: float m_rangeNormalizer; QVector m_gridPositions; - QVector > m_subGridPositions; + QVector m_subGridPositions; QVector m_labelPositions; + QVector m_labelValues; QValue3DAxis *m_axis; diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index 1b4fd52d..8e78522a 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -119,29 +119,28 @@ void AxisRenderCache::updateAllPositions() // by caching all grid and subgrid positions into a single vector. // If subgrid lines are ever themed separately, this array will probably become obsolete. if (m_formatter) { - int subGridCount = m_subSegmentCount - 1; - int fullSize = m_segmentCount + 1 + (m_segmentCount * subGridCount); + int gridCount = m_formatter->gridPositions().size(); + int subGridCount = m_formatter->subGridPositions().size(); + int labelCount = m_formatter->labelPositions().size(); + int fullSize = gridCount + subGridCount; + m_adjustedGridLinePositions.resize(fullSize); - m_adjustedLabelPositions.resize(m_segmentCount + 1); + m_adjustedLabelPositions.resize(labelCount); int index = 0; - int segment = 0; - for (; segment < m_segmentCount; segment++) { - m_adjustedLabelPositions[segment] = - m_formatter->labelPositions().at(segment) * m_scale + m_translate; + int grid = 0; + int label = 0; + for (; label < labelCount; label++) { + m_adjustedLabelPositions[label] = + m_formatter->labelPositions().at(label) * m_scale + m_translate; + } + for (; grid < gridCount; grid++) { m_adjustedGridLinePositions[index++] = - m_formatter->gridPositions().at(segment) * m_scale + m_translate; - if (subGridCount > 0) { - for (int subGrid = 0; subGrid < subGridCount; subGrid++) { - m_adjustedGridLinePositions[index++] = - m_formatter->subGridPositions().at(segment).at(subGrid) * m_scale + m_translate; - } - } + m_formatter->gridPositions().at(grid) * m_scale + m_translate; + } + for (int subGrid = 0; subGrid < subGridCount; subGrid++) { + m_adjustedGridLinePositions[index++] = + m_formatter->subGridPositions().at(subGrid) * m_scale + m_translate; } - // Last gridline - m_adjustedLabelPositions[segment] = - m_formatter->labelPositions().at(segment) * m_scale + m_translate; - m_adjustedGridLinePositions[index] = - m_formatter->gridPositions().at(segment) * m_scale + m_translate; m_positionsDirty = false; } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index f0a5e3d4..0cad8522 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -648,7 +648,7 @@ void Bars3DRenderer::drawSlicedScene() // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - item.value(), m_axisCacheY.labelFormat()); + qreal(item.value()), m_axisCacheY.labelFormat()); item.setSliceLabel(valueLabelText); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; @@ -674,7 +674,7 @@ void Bars3DRenderer::drawSlicedScene() // Create label texture if we need it if (item.sliceLabel().isNull() || m_updateLabels) { QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - item.value(), m_axisCacheY.labelFormat()); + qreal(item.value()), m_axisCacheY.labelFormat()); item.setSliceLabel(valueLabelText); m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; @@ -1822,7 +1822,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Custom format expects printf format specifier. There is no tag for it. labelText = m_axisCacheY.formatter()->stringForValue( - selectedBar->value(), + qreal(selectedBar->value()), m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat()); int selBarPosRow = selectedBar->position().x(); @@ -1843,7 +1843,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (labelText.contains(valueLabelTag)) { QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - selectedBar->value(), m_axisCacheY.labelFormat()); + qreal(selectedBar->value()), m_axisCacheY.labelFormat()); labelText.replace(valueLabelTag, valueLabelText); } diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index f85936f9..49595052 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1463,17 +1463,17 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) if (labelText.contains(xLabelTag)) { QString valueLabelText = m_axisCacheX.formatter()->stringForValue( - selectedItem->position().x(), m_axisCacheX.labelFormat()); + qreal(selectedItem->position().x()), m_axisCacheX.labelFormat()); labelText.replace(xLabelTag, valueLabelText); } if (labelText.contains(yLabelTag)) { QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - selectedItem->position().y(), m_axisCacheY.labelFormat()); + qreal(selectedItem->position().y()), m_axisCacheY.labelFormat()); labelText.replace(yLabelTag, valueLabelText); } if (labelText.contains(zLabelTag)) { QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( - selectedItem->position().z(), m_axisCacheZ.labelFormat()); + qreal(selectedItem->position().z()), m_axisCacheZ.labelFormat()); labelText.replace(zLabelTag, valueLabelText); } labelText.replace(seriesNameTag, diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 9ce80081..86972fdc 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2242,17 +2242,17 @@ QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, if (labelText.contains(xLabelTag)) { QString valueLabelText = m_axisCacheX.formatter()->stringForValue( - dataArray.at(row)->at(column).x(), m_axisCacheX.labelFormat()); + qreal(dataArray.at(row)->at(column).x()), m_axisCacheX.labelFormat()); labelText.replace(xLabelTag, valueLabelText); } if (labelText.contains(yLabelTag)) { QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - dataArray.at(row)->at(column).y(), m_axisCacheY.labelFormat()); + qreal(dataArray.at(row)->at(column).y()), m_axisCacheY.labelFormat()); labelText.replace(yLabelTag, valueLabelText); } if (labelText.contains(zLabelTag)) { QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( - dataArray.at(row)->at(column).z(), m_axisCacheZ.labelFormat()); + qreal(dataArray.at(row)->at(column).z()), m_axisCacheZ.labelFormat()); labelText.replace(zLabelTag, valueLabelText); } diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index be087f91..38fa0b2a 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -187,7 +187,7 @@ Utils::ParamType Utils::findFormatParamType(const QString &format) return ParamTypeUnknown; } -QString Utils::formatLabel(const QByteArray &format, ParamType paramType, float value) +QString Utils::formatLabel(const QByteArray &format, ParamType paramType, qreal value) { switch (paramType) { case ParamTypeInt: diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index c87ef19a..d2c23abf 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -67,7 +67,7 @@ public: static QImage getGradientImage(const QLinearGradient &gradient); static ParamType findFormatParamType(const QString &format); - static QString formatLabel(const QByteArray &format, ParamType paramType, float value); + static QString formatLabel(const QByteArray &format, ParamType paramType, qreal value); static QString defaultLabelFormat(); static float wrapValue(float value, float min, float max); -- cgit v1.2.3 From fffa26dc1470ad6562e390133314fc149134b8e5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 27 Mar 2014 14:26:07 +0200 Subject: Improve axis formatter flexibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Number of grid lines and labels are no longer tied to segment count. Change-Id: I517ebc905f1f70e2e00ae86c05fd0e49e922845d Reviewed-by: Tomi Korpipää --- .../axis/qlogvalue3daxisformatter.cpp | 143 +++++++++++++-------- .../axis/qlogvalue3daxisformatter.h | 8 +- .../axis/qlogvalue3daxisformatter_p.h | 5 +- src/datavisualization/axis/qvalue3daxis.cpp | 6 +- .../axis/qvalue3daxisformatter.cpp | 93 ++++++-------- src/datavisualization/axis/qvalue3daxisformatter.h | 1 - .../axis/qvalue3daxisformatter_p.h | 1 - src/datavisualization/engine/bars3drenderer.cpp | 4 +- src/datavisualization/engine/scatter3drenderer.cpp | 6 +- src/datavisualization/engine/surface3drenderer.cpp | 6 +- tests/barstest/chart.cpp | 7 +- 11 files changed, 147 insertions(+), 133 deletions(-) diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp index 17ae4476..e8c2fbad 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \qmlproperty real LogValueAxis3DFormatter::base * * The \a base of the logarithm used to map axis values. If the base is non-zero, the parent axis - * segment count will be automatically adjusted whenever the axis formatter is recalculated. + * segment count will be ignored when the grid line and label positions are calculated. * If you want the range to be divided into equal segments like normal value axis, set this * property value to zero. * @@ -66,22 +66,24 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty bool LogValueAxis3DFormatter::autoSubGrid * - * If this property value is set to \c true, the parent axis sub-segment count is adjusted - * automatically according to the base property value. The number of subsegments is set to - * base value minus one, rounded down. + * If this property value is set to \c true, the parent axis sub-segment count is ignored + * when calculating sub-grid line positions. The sub-grid positions are generated automatically + * according to the base property value. + * The number of sub-grid lines is set to base value minus one, rounded down. + * This property is ignored when base property value is zero. * Defaults to \c true. * * \sa base, ValueAxis3D::subSegmentCount */ /*! - * \qmlproperty bool LogValueAxis3DFormatter::showMaxLabel + * \qmlproperty bool LogValueAxis3DFormatter::showEdgeLabels * - * When the base property is non-zero, the segments that get automatically generated and depending - * on the range, the last segment is often smaller than the other segments. In extreme cases this - * can lead to overlapping labels on the last two grid lines. By setting this property to \c false, - * you can suppress showing the max label for the axis in cases where the segments do not exactly - * fit the axis. + * When the base property value is non-zero, the whole axis range is often not equally divided into + * segments. The first and last segments are often smaller than the other segments. + * In extreme cases this can lead to overlapping labels on the first and last two grid lines. + * By setting this property to \c false, you can suppress showing the minimum and maximum labels + * for the axis in cases where the segments do not exactly fit the axis. * Defaults to \c true. * * \sa base, AbstractAxis3D::labels @@ -115,7 +117,7 @@ QLogValue3DAxisFormatter::~QLogValue3DAxisFormatter() * \property QLogValue3DAxisFormatter::base * * The \a base of the logarithm used to map axis values. If the base is non-zero, the parent axis - * segment count will be automatically adjusted whenever the axis formatter is recalculated. + * segment count will be ignored when the grid line and label positions are calculated. * If you want the range to be divided into equal segments like normal value axis, set this * property value to zero. * @@ -146,9 +148,11 @@ qreal QLogValue3DAxisFormatter::base() const /*! * \property QLogValue3DAxisFormatter::autoSubGrid * - * If this property value is set to \c true, the parent axis sub-segment count is adjusted - * automatically according to the base property value. The number of subsegments is set to - * base value minus one, rounded up. + * If this property value is set to \c true, the parent axis sub-segment count is ignored + * when calculating sub-grid line positions. The sub-grid positions are generated automatically + * according to the base property value. + * The number of sub-grid lines is set to base value minus one, rounded down. + * This property is ignored when base property value is zero. * Defaults to \c true. * * \sa base, QValue3DAxis::subSegmentCount @@ -168,29 +172,29 @@ bool QLogValue3DAxisFormatter::autoSubGrid() const } /*! - * \property QLogValue3DAxisFormatter::showMaxLabel + * \property QLogValue3DAxisFormatter::showEdgeLabels * - * When the base property is non-zero, the segments get automatically generated, and depending - * on the range, the last segment is often smaller than the other segments. In extreme cases this - * can lead to overlapping labels on the last two grid lines. By setting this property to \c false, - * you can suppress showing the max label for the axis in cases where the segments do not exactly - * fit the axis. + * When the base property value is non-zero, the whole axis range is often not equally divided into + * segments. The first and last segments are often smaller than the other segments. + * In extreme cases this can lead to overlapping labels on the first and last two grid lines. + * By setting this property to \c false, you can suppress showing the minimum and maximum labels + * for the axis in cases where the segments do not exactly fit the axis. * Defaults to \c true. * * \sa base, QAbstract3DAxis::labels */ -void QLogValue3DAxisFormatter::setShowMaxLabel(bool enabled) +void QLogValue3DAxisFormatter::setShowEdgeLabels(bool enabled) { - if (dptr()->m_showMaxLabel != enabled) { - dptr()->m_showMaxLabel = enabled; + if (dptr()->m_showEdgeLabels != enabled) { + dptr()->m_showEdgeLabels = enabled; markDirty(true); - emit showMaxLabelChanged(enabled); + emit showEdgeLabelsChanged(enabled); } } -bool QLogValue3DAxisFormatter::showMaxLabel() const +bool QLogValue3DAxisFormatter::showEdgeLabels() const { - return dptrc()->m_showMaxLabel; + return dptrc()->m_showEdgeLabels; } /*! @@ -277,13 +281,14 @@ const QLogValue3DAxisFormatterPrivate *QLogValue3DAxisFormatter::dptrc() const // QLogValue3DAxisFormatterPrivate QLogValue3DAxisFormatterPrivate::QLogValue3DAxisFormatterPrivate(QLogValue3DAxisFormatter *q) : QValue3DAxisFormatterPrivate(q), - m_base(10.0f), - m_logMin(0.0f), - m_logMax(0.0f), - m_logRangeNormalizer(0.0f), + m_base(10.0), + m_logMin(0.0), + m_logMax(0.0), + m_logRangeNormalizer(0.0), m_autoSubGrid(true), - m_showMaxLabel(true), - m_evenSegments(true) + m_showEdgeLabels(true), + m_evenMinSegment(true), + m_evenMaxSegment(true) { } @@ -298,57 +303,78 @@ void QLogValue3DAxisFormatterPrivate::recalculate() m_logMax = qLn(qreal(m_max)); m_logRangeNormalizer = m_logMax - m_logMin; + int subGridCount = m_axis->subSegmentCount() - 1; + int segmentCount = m_axis->segmentCount(); + qreal segmentStep; if (m_base > 0.0) { // Update parent axis segment counts qreal logMin = qLn(qreal(m_min)) / qLn(m_base); qreal logMax = qLn(qreal(m_max)) / qLn(m_base); qreal logRangeNormalizer = logMax - logMin; - int segmentCount = qCeil(logRangeNormalizer); + qreal minDiff = qCeil(logMin) - logMin; + qreal maxDiff = logMax - qFloor(logMax); + + m_evenMinSegment = qFuzzyCompare(0.0, minDiff); + m_evenMaxSegment = qFuzzyCompare(0.0, maxDiff); + + segmentCount = qRound(logRangeNormalizer - minDiff - maxDiff); + + if (!m_evenMinSegment) + segmentCount++; + if (!m_evenMaxSegment) + segmentCount++; + + segmentStep = 1.0 / logRangeNormalizer; - m_axis->setSegmentCount(segmentCount); if (m_autoSubGrid) { - int subSegmentCount = qCeil(m_base) - 1; - if (subSegmentCount < 1) - subSegmentCount = 1; - m_axis->setSubSegmentCount(subSegmentCount); + subGridCount = qCeil(m_base) - 2; // -2 for subgrid because subsegment count is base - 1 + if (subGridCount < 0) + subGridCount = 0; } - resetArrays(); + m_gridPositions.resize(segmentCount + 1); + m_subGridPositions.resize(segmentCount * subGridCount); + m_labelPositions.resize(segmentCount + 1); + m_labelValues.resize(segmentCount + 1); // Calculate segment positions + int index = 0; + if (!m_evenMinSegment) { + m_gridPositions[0] = 0.0f; + m_labelPositions[0] = 0.0f; + m_labelValues[0] = qreal(m_min); + index++; + } for (int i = 0; i < segmentCount; i++) { - float gridValue = float(i) / float(logRangeNormalizer); - m_gridPositions[i] = gridValue; - m_labelPositions[i] = gridValue; - m_labelValues[i] = qPow(m_base, qreal(i) + logMin); + float gridValue = float((minDiff + qreal(i)) / qreal(logRangeNormalizer)); + m_gridPositions[index] = gridValue; + m_labelPositions[index] = gridValue; + m_labelValues[index] = qPow(m_base, minDiff + qreal(i) + logMin); + index++; } // Ensure max value doesn't suffer from any rounding errors m_gridPositions[segmentCount] = 1.0f; m_labelPositions[segmentCount] = 1.0f; m_labelValues[segmentCount] = qreal(m_max); - float lastDiff = 1.0f - m_labelPositions.at(segmentCount - 1); - float firstDiff = m_labelPositions.at(1) - m_labelPositions.at(0); - m_evenSegments = qFuzzyCompare(lastDiff, firstDiff); } else { // Grid lines and label positions are the same as the parent class, so call parent impl // first to populate those QValue3DAxisFormatterPrivate::doRecalculate(); // Label value array needs to be repopulated - qreal segmentStep = 1.0 / qreal(m_axis->segmentCount()); + segmentStep = 1.0 / qreal(segmentCount); for (int i = 0; i < m_labelPositions.size(); i++) m_labelValues[i] = qExp(segmentStep * qreal(i) * m_logRangeNormalizer + m_logMin); - m_evenSegments = true; + m_evenMaxSegment = true; + m_evenMinSegment = true; } - // Subgrid line positions are logarithmically spaced - int subGridCount = m_axis->subSegmentCount() - 1; if (subGridCount > 0) { - float firstSegmentRange = valueAt(m_gridPositions.at(1)) - m_min; - float subSegmentStep = firstSegmentRange / float(subGridCount + 1); + float oneSegmentRange = valueAt(float(segmentStep)) - m_min; + float subSegmentStep = oneSegmentRange / float(subGridCount + 1); // Since the logarithm has the same curvature across whole axis range, we can just calculate // subgrid positions for the first segment and replicate them to other segments. @@ -359,12 +385,16 @@ void QLogValue3DAxisFormatterPrivate::recalculate() actualSubSegmentSteps[i] = currentSubPosition; } - int segmentCount = m_axis->segmentCount(); + float firstPartialSegmentAdjustment = float(segmentStep) - m_gridPositions.at(1); for (int i = 0; i < segmentCount; i++) { for (int j = 0; j < subGridCount; j++) { float position = m_gridPositions.at(i) + actualSubSegmentSteps.at(j); + if (!m_evenMinSegment && i == 0) + position -= firstPartialSegmentAdjustment; if (position > 1.0f) position = 1.0f; + if (position < 0.0f) + position = 0.0f; m_subGridPositions[i * subGridCount + j] = position; } } @@ -398,10 +428,13 @@ float QLogValue3DAxisFormatterPrivate::valueAt(float position) const QString QLogValue3DAxisFormatterPrivate::labelForIndex(int index) const { - if (index == m_gridPositions.size() - 1 && !m_evenSegments && !m_showMaxLabel) + if (((index == m_gridPositions.size() - 1 && !m_evenMaxSegment) + || (index == 0 && !m_evenMinSegment)) + && !m_showEdgeLabels) { return QString(); - else + } else { return QValue3DAxisFormatterPrivate::labelForIndex(index); + } } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.h b/src/datavisualization/axis/qlogvalue3daxisformatter.h index 33466492..e9683821 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.h +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.h @@ -31,7 +31,7 @@ class QT_DATAVISUALIZATION_EXPORT QLogValue3DAxisFormatter : public QValue3DAxis Q_PROPERTY(qreal base READ base WRITE setBase NOTIFY baseChanged) Q_PROPERTY(bool autoSubGrid READ autoSubGrid WRITE setAutoSubGrid NOTIFY autoSubGridChanged) - Q_PROPERTY(bool showMaxLabel READ showMaxLabel WRITE setShowMaxLabel NOTIFY showMaxLabelChanged) + Q_PROPERTY(bool showEdgeLabels READ showEdgeLabels WRITE setShowEdgeLabels NOTIFY showEdgeLabelsChanged) protected: explicit QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPrivate *d, QObject *parent = 0); @@ -43,13 +43,13 @@ public: qreal base() const; void setAutoSubGrid(bool enabled); bool autoSubGrid() const; - void setShowMaxLabel(bool enabled); - bool showMaxLabel() const; + void setShowEdgeLabels(bool enabled); + bool showEdgeLabels() const; signals: void baseChanged(qreal base); void autoSubGridChanged(bool enabled); - void showMaxLabelChanged(bool enabled); + void showEdgeLabelsChanged(bool enabled); protected: virtual bool allowNegatives() const; diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h index 44b5c80c..6638e2c7 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h @@ -60,10 +60,11 @@ protected: qreal m_logMax; qreal m_logRangeNormalizer; bool m_autoSubGrid; - bool m_showMaxLabel; + bool m_showEdgeLabels; private: - bool m_evenSegments; + bool m_evenMinSegment; + bool m_evenMaxSegment; friend class QLogValue3DAxisFormatter; }; diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index b0b8caa6..b957de4d 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -266,11 +266,13 @@ void QValue3DAxisPrivate::updateLabels() m_labelsDirty = false; + int labelCount = m_formatter->labelPositions().size(); + QStringList newLabels; - newLabels.reserve(m_segmentCount + 1); + newLabels.reserve(labelCount); m_formatter->d_ptr->recalculate(); - for (int i = 0; i <= m_segmentCount; i++) + for (int i = 0; i < labelCount; i++) newLabels.append(m_formatter->labelForIndex(i)); if (m_labels != newLabels) diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index 7c7db398..92940a1b 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -59,7 +59,7 @@ QValue3DAxisFormatter::QValue3DAxisFormatter(QValue3DAxisFormatterPrivate *d, QO } /*! - * Constructs a new QValue3DAxisFormatter instance with optional \a parent. + * Constructs a new QValue3DAxisFormatter instance with an optional \a parent. */ QValue3DAxisFormatter::QValue3DAxisFormatter(QObject *parent) : QObject(parent), @@ -104,19 +104,16 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const } /*! - * This method populates the label and grid line position arrays and the label value array, as well - * as calculates any values needed for mapping between value and position. It is allowed to access - * the parent axis from inside this function. + * This method resizes and populates the label and grid line position arrays and the label value + * array, as well as calculates any values needed for mapping between value and position. + * It is allowed to access the parent axis from inside this function. * - * This method must be reimplemented in a subclass. The resetArrays() method must be called - * in the subclass implementation before the position arrays are recalculated. If the subclass - * implementation changes any parent axis values, these changes must be done before - * the resetPositionArrays() call. + * This method must be reimplemented in a subclass. * - * See gridPositions(), subGridPositions(), and labelPositions() documentation about the arrays - * that need to be populated. + * See gridPositions(), subGridPositions(), labelPositions(), and labelValues() methods for + * documentation about the arrays that need to be resized and populated. * - * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), resetArrays() + * \sa gridPositions(), subGridPositions(), labelPositions(), labelValues(), axis() */ void QValue3DAxisFormatter::recalculate() { @@ -124,13 +121,14 @@ void QValue3DAxisFormatter::recalculate() } /*! - * The parent axis uses this method to request axis label strings for label \a index. - * Reimplement this method if default labeling is not sufficient. + * The parent axis uses this method to request axis label strings for label \a index, + * using the value stored in label values array and QValue3DAxis::labelFormat property. + * Reimplement this method in a subclass if the default labeling is not sufficient. * If an empty string is returned, the label is not shown. * * \return A string formatted using axis label formatter. * - * \sa stringForValue() + * \sa stringForValue(), labelValues(), QValue3DAxis::labelFormat */ QString QValue3DAxisFormatter::labelForIndex(int index) const { @@ -139,7 +137,8 @@ QString QValue3DAxisFormatter::labelForIndex(int index) const /*! * Reimplement this method in a subclass to resolve the formatted string for a given \a value - * if the default formatting provided by QValue3DAxis::labelFormat property is not sufficient. + * if the default formatting rules specified for QValue3DAxis::labelFormat property are not + * sufficient. * * \return the formatted label string using \a value and \a format. * @@ -181,7 +180,8 @@ float QValue3DAxisFormatter::valueAt(float position) const } /*! - * Copies all relevant values from this formatter to the \a copy. + * Copies all necessary values for resolving positions, values, and strings with this formatter + * from this formatter to the \a copy. * When reimplementing this method in a subclass, call the the superclass version at some point. * The renderer uses this method to cache a copy of the the formatter. * @@ -192,18 +192,6 @@ void QValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const d_ptr->doPopulateCopy(*(copy.d_ptr.data())); } -/*! - * Resets the position arrays based on values read from the parent axis. - * This must be called in recalculate method before the arrays are accessed in subclasses, - * but after any changes to the values of the parent axis. - * - * \sa gridPositions(), subGridPositions(), labelPositions(), axis(), recalculate() - */ -void QValue3DAxisFormatter::resetArrays() -{ - d_ptr->resetArrays(); -} - /*! * Marks this formatter dirty, prompting the renderer to make a new copy of its cache on the next * renderer synchronization. This method should be called by a subclass whenever the formatter @@ -228,11 +216,11 @@ QValue3DAxis *QValue3DAxisFormatter::axis() const /*! * \return a reference to the array of normalized grid line positions. - * The array size is equal to the segment count of the parent axis plus one. + * The default array size is equal to the segment count of the parent axis plus one, but + * a subclassed implementation of recalculate method may resize the array differently. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. - * The grid line at the index zero corresponds to the minimum value of the axis. * - * \sa QValue3DAxis::segmentCount + * \sa QValue3DAxis::segmentCount, recalculate() */ QVector &QValue3DAxisFormatter::gridPositions() const { @@ -241,11 +229,12 @@ QVector &QValue3DAxisFormatter::gridPositions() const /*! * \return a reference to the array of normalized subgrid line positions. - * The array size is equal to segment count of the parent axis times sub-segment count of the parent - * axis minus one. + * The default array size is equal to segment count of the parent axis times sub-segment count + * of the parent axis minus one, but a subclassed implementation of recalculate method may resize + * the array differently. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. * - * \sa QValue3DAxis::segmentCount, QValue3DAxis::subSegmentCount + * \sa QValue3DAxis::segmentCount, QValue3DAxis::subSegmentCount, recalculate() */ QVector &QValue3DAxisFormatter::subGridPositions() const { @@ -254,11 +243,13 @@ QVector &QValue3DAxisFormatter::subGridPositions() const /*! * \return a reference to the array of normalized label positions. - * The array size is equal to the segment count of the parent axis plus one. + * The default array size is equal to the segment count of the parent axis plus one, but + * a subclassed implementation of recalculate method may resize the array differently. * The values should be between 0.0 (for minimum value) and 1.0 (for maximum value), inclusive. - * The label at the index zero corresponds to the minimum value of the axis. + * The default behavior is that the label at the index zero corresponds to the minimum value + * of the axis. * - * \sa QValue3DAxis::segmentCount, QAbstract3DAxis::labels + * \sa QValue3DAxis::segmentCount, QAbstract3DAxis::labels, recalculate() */ QVector &QValue3DAxisFormatter::labelPositions() const { @@ -267,7 +258,7 @@ QVector &QValue3DAxisFormatter::labelPositions() const /*! * \return a reference to the array of values used to generate label strings. - * The array size is equal to the size of the label positions array and + * The array size must be equal to the size of the label positions array and * the indexes correspond to that array as well. * * \sa labelPositions() @@ -310,11 +301,15 @@ void QValue3DAxisFormatterPrivate::recalculate() void QValue3DAxisFormatterPrivate::doRecalculate() { - resetArrays(); - int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; + m_gridPositions.resize(segmentCount + 1); + m_subGridPositions.resize(segmentCount * subGridCount); + + m_labelPositions.resize(segmentCount + 1); + m_labelValues.resize(segmentCount + 1); + // Use qreals for intermediate calculations for better accuracy on label values qreal segmentStep = 1.0 / qreal(segmentCount); qreal subSegmentStep = 0; @@ -358,6 +353,7 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate & QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const { + Q_ASSERT(index < m_labelValues.size()); return q_ptr->stringForValue(m_labelValues.at(index), m_axis->labelFormat()); } @@ -397,23 +393,6 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) m_axis = axis; } -void QValue3DAxisFormatterPrivate::resetArrays() -{ - m_gridPositions.clear(); - m_subGridPositions.clear(); - m_labelPositions.clear(); - m_labelValues.clear(); - - int segmentCount = m_axis->segmentCount(); - int subGridCount = m_axis->subSegmentCount() - 1; - - m_gridPositions.resize(segmentCount + 1); - m_subGridPositions.resize(segmentCount * subGridCount); - - m_labelPositions.resize(segmentCount + 1); - m_labelValues.resize(segmentCount + 1); -} - void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange) { m_needsRecalculate = true; diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index 548135c0..970087d3 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -49,7 +49,6 @@ protected: virtual float valueAt(float position) const; virtual void populateCopy(QValue3DAxisFormatter ©) const; - void resetArrays(); void markDirty(bool labelsChange = false); QValue3DAxis *axis() const; diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index b6749fb3..7e661b62 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -57,7 +57,6 @@ public: float valueAt(float position) const; void setAxis(QValue3DAxis *axis); - void resetArrays(); void markDirty(bool labelsChange); public slots: diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 0cad8522..b928e5f0 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -434,7 +434,7 @@ void Bars3DRenderer::drawSlicedScene() // Draw grid labels int labelNbr = 0; - int labelCount = m_axisCacheY.labels().size(); + int labelCount = m_axisCacheY.labelCount(); QVector3D backLabelRotation(0.0f, 0.0f, 0.0f); QVector3D labelTrans = QVector3D(scaleFactor + labelMargin, 0.0f, 0.0f); @@ -1665,7 +1665,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Y Labels int labelNbr = 0; - int labelCount = m_axisCacheY.labels().size(); + int labelCount = m_axisCacheY.labelCount(); GLfloat labelMarginXTrans = labelMargin; GLfloat labelMarginZTrans = labelMargin; GLfloat labelXTrans = rowScaleFactor; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 49595052..909d434f 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1262,7 +1262,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Z Labels if (m_axisCacheZ.segmentCount() > 0) { - int labelCount = m_axisCacheZ.labelItems().size(); + int labelCount = m_axisCacheZ.labelCount(); #ifndef USE_UNIFORM_SCALING GLfloat labelXTrans = (aspectRatio * m_areaSize.width()) / m_scaleFactor + labelMargin + m_backgroundMargin; @@ -1310,7 +1310,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } // X Labels if (m_axisCacheX.segmentCount() > 0) { - int labelCount = m_axisCacheX.labelItems().size(); + int labelCount = m_axisCacheX.labelCount(); #ifndef USE_UNIFORM_SCALING GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) / m_scaleFactor + labelMargin + m_backgroundMargin; @@ -1358,7 +1358,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } // Y Labels if (m_axisCacheY.segmentCount() > 0) { - int labelCount = m_axisCacheY.labelItems().size(); + int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z GLfloat labelXTrans = (aspectRatio* m_areaSize.width()) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 86972fdc..0f9a3f10 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1739,7 +1739,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Z Labels QVector3D positionZComp(0.0f, 0.0f, 0.0f); if (m_axisCacheZ.segmentCount() > 0) { - int labelCount = m_axisCacheZ.labelItems().size(); + int labelCount = m_axisCacheZ.labelCount(); int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; @@ -1781,7 +1781,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } // X Labels if (m_axisCacheX.segmentCount() > 0) { - int labelCount = m_axisCacheX.labelItems().size(); + int labelCount = m_axisCacheX.labelCount(); int labelNbr = 0; GLfloat labelZTrans = m_scaleZWithBackground + labelMargin; @@ -1824,7 +1824,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } // Y Labels if (m_axisCacheY.segmentCount() > 0) { - int labelCount = m_axisCacheY.labelItems().size(); + int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground; diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index c6c7678d..6ecd375a 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -1052,7 +1052,7 @@ void GraphModifier::useLogAxis() { static int counter = -1; static QLogValue3DAxisFormatter *logFormatter = new QLogValue3DAxisFormatter; - + static float minRange = 1.0f; counter++; switch (counter) { @@ -1060,13 +1060,13 @@ void GraphModifier::useLogAxis() qDebug() << "Case" << counter << ": Default log axis"; logFormatter = new QLogValue3DAxisFormatter; m_graph->valueAxis()->setFormatter(logFormatter); - m_graph->valueAxis()->setRange(1.0f, 1200.0f); + m_graph->valueAxis()->setRange(minRange, 1200.0f); m_graph->valueAxis()->setLabelFormat(QStringLiteral("%.3f")); break; } case 1: { qDebug() << "Case" << counter << ": Hide max label"; - logFormatter->setShowMaxLabel(false); + logFormatter->setShowEdgeLabels(false); break; } case 2: { @@ -1124,6 +1124,7 @@ void GraphModifier::useLogAxis() } default: qDebug() << "Resetting logaxis test"; + minRange++; counter = -1; break; } -- cgit v1.2.3 From 25f48fc046bbce83abeeef0a6081de9f5efcd6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 31 Mar 2014 10:10:03 +0300 Subject: Row/colun selection using axis labels, part 1 Task-number: QTRD-2981 + Bars done + Scatter done (= no label selection) - Surface to be done Change-Id: Icd352e40ad6d0ada76380f3dba742f280fd278b3 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/bars3drenderer.cpp | 228 ++++++++++++--------- src/datavisualization/engine/bars3drenderer_p.h | 8 +- src/datavisualization/engine/drawer.cpp | 25 ++- src/datavisualization/engine/drawer_p.h | 4 +- src/datavisualization/engine/scatter3drenderer.cpp | 34 +-- src/datavisualization/engine/scatter3drenderer_p.h | 4 +- .../engine/shaders/plainColor.frag | 5 +- .../global/datavisualizationglobal_p.h | 7 +- src/datavisualization/input/q3dinputhandler.cpp | 7 +- src/datavisualization/utils/texturehelper.cpp | 5 - src/datavisualization/utils/utils.cpp | 7 +- src/datavisualization/utils/utils_p.h | 2 +- 12 files changed, 187 insertions(+), 149 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index b928e5f0..6d54b190 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -825,6 +825,11 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) bool rowMode = m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow); + GLfloat rowScaleFactor = m_rowWidth / m_scaleFactor; + GLfloat columnScaleFactor = m_columnDepth / m_scaleFactor; + + BarRenderItem *selectedBar(0); + #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { // Render scene into a depth texture for using with shadow mapping @@ -982,39 +987,26 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) MVPMatrix = projectionViewMatrix * modelMatrix; - QVector3D barColor = QVector3D(GLfloat(row) / 255.0f, + QVector4D barColor = QVector4D(GLfloat(row) / 255.0f, GLfloat(bar) / 255.0f, - GLfloat(series) / 255.0f); + GLfloat(series) / 255.0f, + itemAlpha); m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); m_selectionShader->setUniformValue(m_selectionShader->color(), barColor); - // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_selectionShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf()); - glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, - (void *)0); - - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf()); - - // Draw the triangles - glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT, - (void *)0); - - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableVertexAttribArray(m_selectionShader->posAtt()); + m_drawer->drawSelectionObject(m_selectionShader, barObj); } } seriesPos += m_seriesStep; } + glCullFace(GL_BACK); + drawLabels(true, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, + columnScaleFactor, false, selectedBar); glEnable(GL_DITHER); // Read color under cursor - QVector3D clickedColor = Utils::getSelection(m_inputPosition, + QVector4D clickedColor = Utils::getSelection(m_inputPosition, m_viewport.height()); m_clickedPosition = selectionColorToArrayPosition(clickedColor); m_clickedSeries = selectionColorToSeries(clickedColor); @@ -1097,7 +1089,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) GLfloat adjustedHighlightStrength = m_cachedTheme->highlightLightStrength() / 10.0f; bool barSelectionFound = false; - BarRenderItem *selectedBar(0); QVector3D baseColor; QVector3D barColor; @@ -1331,9 +1322,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glCullFace(GL_BACK); // Draw background - GLfloat rowScaleFactor = m_rowWidth / m_scaleFactor; - GLfloat columnScaleFactor = m_columnDepth / m_scaleFactor; - if (m_cachedTheme->isBackgroundEnabled() && m_backgroundObj) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; @@ -1654,75 +1642,100 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } } + drawLabels(false, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, + columnScaleFactor, barSelectionFound, selectedBar); - // Bind label shader - m_labelShader->bind(); + // Release shader + glUseProgram(0); + m_selectionDirty = false; +} - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_POLYGON_OFFSET_FILL); +void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, + GLfloat rowScaleFactor, GLfloat columnScaleFactor, + bool barSelectionFound, BarRenderItem *selectedBar) { + ShaderHelper *shader = 0; + GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; + GLfloat alphaForColumnSelection = labelColumnAlpha / 255.0f; + if (drawSelection) { + shader = m_selectionShader; + // m_selectionShader is already bound + } else { + shader = m_labelShader; + shader->bind(); - // Y Labels - int labelNbr = 0; - int labelCount = m_axisCacheY.labelCount(); - GLfloat labelMarginXTrans = labelMargin; - GLfloat labelMarginZTrans = labelMargin; - GLfloat labelXTrans = rowScaleFactor; - GLfloat labelZTrans = columnScaleFactor; - QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); - QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = Qt::AlignLeft; - Qt::AlignmentFlag sideAlignment = Qt::AlignLeft; - if (!m_xFlipped) { - labelXTrans = -labelXTrans; - labelMarginXTrans = -labelMargin; - backLabelRotation.setY(90.0f); - sideAlignment = Qt::AlignRight; + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } - if (m_zFlipped) { - labelZTrans = -labelZTrans; - labelMarginZTrans = -labelMargin; - backAlignment = Qt::AlignRight; - sideLabelRotation.setY(180.f); - } - QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, - labelZTrans + labelMarginZTrans); - QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, - 0.0f, -labelZTrans); - - for (int i = 0; i < labelCount; i++) { - if (m_axisCacheY.labelItems().size() > labelNbr) { - backLabelTrans.setY(m_axisCacheY.labelPosition(i)); - sideLabelTrans.setY(backLabelTrans.y()); - glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); - - const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); - - // Back wall - m_dummyBarRenderItem.setTranslation(backLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, backLabelRotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment); + glEnable(GL_POLYGON_OFFSET_FILL); - // Side wall - m_dummyBarRenderItem.setTranslation(sideLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment); + // Y Labels + if (!drawSelection) { + int labelNbr = 0; + int labelCount = m_axisCacheY.labelCount(); + GLfloat labelMarginXTrans = labelMargin; + GLfloat labelMarginZTrans = labelMargin; + GLfloat labelXTrans = rowScaleFactor; + GLfloat labelZTrans = columnScaleFactor; + QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); + QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); + Qt::AlignmentFlag backAlignment = Qt::AlignLeft; + Qt::AlignmentFlag sideAlignment = Qt::AlignLeft; + if (!m_xFlipped) { + labelXTrans = -labelXTrans; + labelMarginXTrans = -labelMargin; + backLabelRotation.setY(90.0f); + sideAlignment = Qt::AlignRight; + } + if (m_zFlipped) { + labelZTrans = -labelZTrans; + labelMarginZTrans = -labelMargin; + backAlignment = Qt::AlignRight; + sideLabelRotation.setY(180.f); + } + QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, + labelZTrans + labelMarginZTrans); + QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, + 0.0f, -labelZTrans); + + for (int i = 0; i < labelCount; i++) { + if (m_axisCacheY.labelItems().size() > labelNbr) { + backLabelTrans.setY(m_axisCacheY.labelPosition(i)); + sideLabelTrans.setY(backLabelTrans.y()); + + glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); + + const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); + + // Back wall + m_dummyBarRenderItem.setTranslation(backLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, backLabelRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, backAlignment); + + // Side wall + m_dummyBarRenderItem.setTranslation(sideLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, sideAlignment); + } + labelNbr++; } - labelNbr++; } + // Z labels // Calculate the positions for row and column labels and store them GLfloat labelYAdjustment = 0.005f; GLfloat scaledRowWidth = rowScaleFactor; GLfloat scaledColumnDepth = columnScaleFactor; GLfloat colPosValue = scaledRowWidth + labelMargin; GLfloat rowPosValue = scaledColumnDepth + labelMargin; + GLfloat rowPos = 0.0f; + GLfloat colPos = 0.0f; QVector3D labelRotation(-90.0f, 0.0f, 0.0f); if (m_zFlipped) labelRotation.setY(180.0f); @@ -1754,10 +1767,16 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_dummyBarRenderItem.setTranslation(labelPos); const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(row); + if (drawSelection) { + QVector4D labelColor = QVector4D(row / 255.0f, 0.0f, 0.0f, alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment, m_cachedIsSlicingActivated); + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, + false, drawSelection); } } labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); @@ -1771,6 +1790,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) labelRotation.setZ(180.0f); } + // X labels alignment = m_zFlipped ? Qt::AlignRight : Qt::AlignLeft; for (int column = 0; column != m_cachedColumnCount; column++) { if (m_axisCacheX.labelItems().size() > column) { @@ -1791,10 +1811,16 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_dummyBarRenderItem.setTranslation(labelPos); const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(column); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, column / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment); + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, false, drawSelection); } } @@ -1859,7 +1885,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_drawer->drawLabel(*selectedBar, labelItem, viewMatrix, projectionMatrix, zeroVector, zeroVector, selectedBar->height(), - m_cachedSelectionMode, m_labelShader, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, false); // Reset label update flag; they should have been updated when we get here @@ -1870,13 +1896,10 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_selectedBar = 0; } - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - // Release shader - glUseProgram(0); - - m_selectionDirty = false; + if (!drawSelection) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } } void Bars3DRenderer::updateMultiSeriesScaling(bool uniform) @@ -2128,19 +2151,34 @@ Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int return isSelectedType; } -QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector3D &selectionColor) +QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionColor) { QPoint position; - if (selectionColor == selectionSkipColor) { + if (selectionColor == selectionSkipColor + || (selectionColor.w() == labelRowAlpha + && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) + || (selectionColor.w() == labelColumnAlpha + && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn))) { position = Bars3DController::invalidSelectionPosition(); - } else { + } else if (selectionColor.w() == itemAlpha) { + // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), int(selectionColor.y()) + int(m_axisCacheX.min())); + } else if (selectionColor.w() == labelRowAlpha) { + // Row selection + // Use column from previous selection in case we have row + column mode + GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid + position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); + } else if (selectionColor.w() == labelColumnAlpha) { + // Column selection + // Use row from previous selection in case we have row + column mode + GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid + position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); } return position; } -QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector3D &selectionColor) +QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector4D &selectionColor) { if (selectionColor == selectionSkipColor) return 0; diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 2c0417e4..3e7e5178 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -143,6 +143,10 @@ private: void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); + void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, + GLfloat rowScaleFactor, GLfloat columnScaleFactor, + bool barSelectionFound, BarRenderItem *selectedBar); void loadBackgroundMesh(); void loadGridLineMesh(); @@ -158,8 +162,8 @@ private: void calculateSceneScalingFactors(); void calculateHeightAdjustment(); Abstract3DController::SelectionType isSelected(int row, int bar, int seriesIndex); - QPoint selectionColorToArrayPosition(const QVector3D &selectionColor); - QBar3DSeries *selectionColorToSeries(const QVector3D &selectionColor); + QPoint selectionColorToArrayPosition(const QVector4D &selectionColor); + QBar3DSeries *selectionColorToSeries(const QVector4D &selectionColor); Q_DISABLE_COPY(Bars3DRenderer) diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index 38c15a58..ff48d71c 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -149,6 +149,18 @@ void Drawer::drawObject(ShaderHelper *shader, AbstractObjectHelper *object, GLui } } +void Drawer::drawSelectionObject(ShaderHelper *shader, AbstractObjectHelper *object) +{ + glEnableVertexAttribArray(shader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, object->vertexBuf()); + glVertexAttribPointer(shader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object->elementBuf()); + glDrawElements(GL_TRIANGLES, object->indexCount(), GL_UNSIGNED_SHORT, (void *)0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDisableVertexAttribArray(shader->posAtt()); +} + void Drawer::drawSurfaceGrid(ShaderHelper *shader, SurfaceObject *object) { // 1st attribute buffer : vertices @@ -225,7 +237,8 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte GLfloat itemHeight, QAbstract3DGraph::SelectionFlags mode, ShaderHelper *shader, ObjectHelper *object, const Q3DCamera *camera, bool useDepth, bool rotateAlong, - LabelPosition position, Qt::AlignmentFlag alignment, bool isSlicing) + LabelPosition position, Qt::AlignmentFlag alignment, bool isSlicing, + bool isSelecting) { // Draw label if (!labelItem.textureId()) @@ -379,11 +392,15 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte MVPMatrix = projectionmatrix * viewmatrix * modelMatrix; - // Set shader bindings shader->setUniformValue(shader->MVP(), MVPMatrix); - // Draw the object - drawObject(shader, object, labelItem.textureId()); + if (isSelecting) { + // Draw the selection object + drawSelectionObject(shader, object); + } else { + // Draw the object + drawObject(shader, object, labelItem.textureId()); + } } void Drawer::generateSelectionLabelTexture(Abstract3DRenderer *renderer) diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index 5d10018e..c4fb749f 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -74,6 +74,7 @@ public: void drawObject(ShaderHelper *shader, AbstractObjectHelper *object, GLuint textureId = 0, GLuint depthTextureId = 0); + void drawSelectionObject(ShaderHelper *shader, AbstractObjectHelper *object); void drawSurfaceGrid(ShaderHelper *shader, SurfaceObject *object); void drawPoint(ShaderHelper *shader); void drawLine(ShaderHelper *shader); @@ -83,7 +84,8 @@ public: QAbstract3DGraph::SelectionFlags mode, ShaderHelper *shader, ObjectHelper *object, const Q3DCamera *camera, bool useDepth = false, bool rotateAlong = false, LabelPosition position = LabelOver, - Qt::AlignmentFlag alignment = Qt::AlignCenter, bool isSlicing = false); + Qt::AlignmentFlag alignment = Qt::AlignCenter, bool isSlicing = false, + bool isSelecting = false); void generateSelectionLabelTexture(Abstract3DRenderer *item); void generateLabelItem(LabelItem &item, const QString &text, int widestLabel = 0); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 909d434f..9a2522d4 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -534,41 +534,23 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) MVPMatrix = projectionViewMatrix * modelMatrix; - QVector3D dotColor = indexToSelectionColor(dotNo); + QVector4D dotColor = indexToSelectionColor(dotNo); dotColor /= 255.0f; selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix); selectionShader->setUniformValue(selectionShader->color(), dotColor); - if (drawingPoints) { + if (drawingPoints) m_drawer->drawPoint(selectionShader); - } else { - // 1st attribute buffer : vertices - glEnableVertexAttribArray(selectionShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); - glVertexAttribPointer(selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, - (void *)0); - - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); - - // Draw the triangles - glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, - (void *)0); - - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableVertexAttribArray(selectionShader->posAtt()); - } + else + m_drawer->drawSelectionObject(selectionShader, dotObj); dotNo++; } } glEnable(GL_DITHER); // Read color under cursor - QVector3D clickedColor = Utils::getSelection(m_inputPosition, + QVector4D clickedColor = Utils::getSelection(m_inputPosition, m_viewport.height()); selectionColorToSeriesAndIndex(clickedColor, m_clickedIndex, m_clickedSeries); @@ -1739,16 +1721,16 @@ void Scatter3DRenderer::initLabelShaders(const QString &vertexShader, const QStr m_labelShader->initialize(); } -QVector3D Scatter3DRenderer::indexToSelectionColor(GLint index) +QVector4D Scatter3DRenderer::indexToSelectionColor(GLint index) { GLubyte dotIdxRed = index & 0xff; GLubyte dotIdxGreen = (index & 0xff00) >> 8; GLubyte dotIdxBlue = (index & 0xff0000) >> 16; - return QVector3D(dotIdxRed, dotIdxGreen, dotIdxBlue); + return QVector4D(dotIdxRed, dotIdxGreen, dotIdxBlue, 0); } -void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector3D &color, +void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series) { diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index b82ff4ae..62a8de73 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -146,8 +146,8 @@ public slots: void updateSelectedItem(int index, const QScatter3DSeries *series); private: - QVector3D indexToSelectionColor(GLint index); - void selectionColorToSeriesAndIndex(const QVector3D &color, int &index, + QVector4D indexToSelectionColor(GLint index); + void selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series); }; diff --git a/src/datavisualization/engine/shaders/plainColor.frag b/src/datavisualization/engine/shaders/plainColor.frag index 099c87a1..da9ee060 100644 --- a/src/datavisualization/engine/shaders/plainColor.frag +++ b/src/datavisualization/engine/shaders/plainColor.frag @@ -1,7 +1,6 @@ -uniform highp vec3 color_mdl; +uniform highp vec4 color_mdl; void main() { - gl_FragColor.rgb = color_mdl; - gl_FragColor.a = 1.0; + gl_FragColor = color_mdl; } diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h index 71dc8a93..ff658be3 100644 --- a/src/datavisualization/global/datavisualizationglobal_p.h +++ b/src/datavisualization/global/datavisualizationglobal_p.h @@ -57,8 +57,11 @@ static const QVector3D cameraDistanceVector = QVector3D(0.0f, 0.0f, cameraDistan static const QQuaternion identityQuaternion; // Skip color == selection texture's background color -static const QVector3D selectionSkipColor = QVector3D(255.0f, 255.0f, 255.0f); -static const QVector3D invalidColorVector = QVector3D(-1.0f, -1.0f, -1.0f); +static const QVector4D selectionSkipColor = QVector4D(255.0f, 255.0f, 255.0f, 255.0f); +static const QVector4D invalidColorVector = QVector4D(-1.0f, -1.0f, -1.0f, -1.0f); +static const GLfloat itemAlpha = 0.0f; +static const GLfloat labelRowAlpha = 254.0f; +static const GLfloat labelColumnAlpha = 255.0f; static const GLfloat gradientTextureHeight = 1024.0f; static const GLfloat gradientTextureWidth = 2.0f; static const GLfloat uniformTextureHeight = 64.0f; diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp index 1a197418..bcbf1014 100644 --- a/src/datavisualization/input/q3dinputhandler.cpp +++ b/src/datavisualization/input/q3dinputhandler.cpp @@ -94,13 +94,12 @@ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos #else if (Qt::LeftButton == event->button()) { if (scene()->isSlicingActive()) { - if (scene()->isPointInPrimarySubView(mousePos)) { + if (scene()->isPointInPrimarySubView(mousePos)) setInputView(InputViewOnPrimary); - } else if (scene()->isPointInSecondarySubView(mousePos)) { + else if (scene()->isPointInSecondarySubView(mousePos)) setInputView(InputViewOnSecondary); - } else { + else setInputView(InputViewNone); - } } else { // update mouse positions to prevent jumping when releasing or repressing a button setInputPosition(mousePos); diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp index 52c673dc..ee1d51a6 100644 --- a/src/datavisualization/utils/texturehelper.cpp +++ b/src/datavisualization/utils/texturehelper.cpp @@ -108,13 +108,8 @@ GLuint TextureHelper::createSelectionTexture(const QSize &size, GLuint &frameBuf glBindTexture(GL_TEXTURE_2D, textureid); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -#if !defined(QT_OPENGL_ES_2) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); -#else - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.width(), size.height(), 0, GL_RGB, - GL_UNSIGNED_BYTE, NULL); -#endif glBindTexture(GL_TEXTURE_2D, 0); // Create render buffer diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index 38fa0b2a..eb84f162 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -126,15 +126,14 @@ QImage Utils::printTextToImage(const QFont &font, const QString &text, const QCo return image; } -QVector3D Utils::getSelection(QPoint mousepos, int height) +QVector4D Utils::getSelection(QPoint mousepos, int height) { // This is the only one that works with OpenGL ES 2.0, so we're forced to use it // Item count will be limited to 256*256*256 - GLubyte pixel[4] = {255, 255, 255, 0}; + GLubyte pixel[4] = {255, 255, 255, 255}; glReadPixels(mousepos.x(), height - mousepos.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel); - QVector3D selectedColor(pixel[0], pixel[1], pixel[2]); - + QVector4D selectedColor(pixel[0], pixel[1], pixel[2], pixel[3]); return selectedColor; } diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index d2c23abf..c89a299c 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -63,7 +63,7 @@ public: bool labelBackground, bool borders = false, int maxLabelWidth = 0); - static QVector3D getSelection(QPoint mousepos, int height); + static QVector4D getSelection(QPoint mousepos, int height); static QImage getGradientImage(const QLinearGradient &gradient); static ParamType findFormatParamType(const QString &format); -- cgit v1.2.3 From fe3c9ec0a9fb734e83eb70bc725c303a9d36cd6d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 28 Mar 2014 14:51:26 +0200 Subject: Axis formatter customization example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also refactored the formatter api somewhat: - Removed virtual from allowNegatives and allowZero and added a setter function for those. This will make it cleaner if we need to add similar properties to the axis formatter in the future, as no new virtual methods can be added without breaking BC. - Changed the labelValues array to labelStrings list, as it makes more sense to directly format the strings in recalculate. Change-Id: I3ea005afa984bb756845ca356b999762e0807415 Reviewed-by: Tomi Korpipää --- examples/datavisualization/datavisualization.pro | 3 +- .../qmlaxisformatter/customformatter.cpp | 154 +++++++++++++++++ .../qmlaxisformatter/customformatter.h | 71 ++++++++ .../qmlaxisformatter/doc/src/qmlaxisformatter.qdoc | 114 +++++++++++++ .../datavisualization/qmlaxisformatter/main.cpp | 57 +++++++ .../qmlaxisformatter/qml/qmlaxisformatter/Data.qml | 50 ++++++ .../qml/qmlaxisformatter/NewButton.qml | 52 ++++++ .../qmlaxisformatter/qml/qmlaxisformatter/main.qml | 183 +++++++++++++++++++++ .../qmlaxisformatter/qmlaxisformatter.pro | 16 ++ .../qmlaxisformatter/qmlaxisformatter.qrc | 7 + .../datavisualization/qmloscilloscope/datasource.h | 2 - src/datavisualization/axis/qabstract3daxis.cpp | 4 +- src/datavisualization/axis/qabstract3daxis_p.h | 2 +- .../axis/qlogvalue3daxisformatter.cpp | 70 ++++---- .../axis/qlogvalue3daxisformatter.h | 3 - .../axis/qlogvalue3daxisformatter_p.h | 1 - src/datavisualization/axis/qvalue3daxis.cpp | 14 +- src/datavisualization/axis/qvalue3daxis_p.h | 2 +- .../axis/qvalue3daxisformatter.cpp | 87 +++++----- src/datavisualization/axis/qvalue3daxisformatter.h | 13 +- .../axis/qvalue3daxisformatter_p.h | 7 +- src/datavisualization/engine/bars3dcontroller.cpp | 6 +- .../engine/scatter3dcontroller.cpp | 6 +- .../engine/surface3dcontroller.cpp | 6 +- .../datavisualizationqml2_plugin.cpp | 12 +- .../datavisualizationqml2_plugin.h | 4 + 26 files changed, 828 insertions(+), 118 deletions(-) create mode 100644 examples/datavisualization/qmlaxisformatter/customformatter.cpp create mode 100644 examples/datavisualization/qmlaxisformatter/customformatter.h create mode 100644 examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc create mode 100644 examples/datavisualization/qmlaxisformatter/main.cpp create mode 100644 examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml create mode 100644 examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml create mode 100644 examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml create mode 100644 examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro create mode 100644 examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro index 4330ef4c..ebb99e93 100644 --- a/examples/datavisualization/datavisualization.pro +++ b/examples/datavisualization/datavisualization.pro @@ -6,7 +6,8 @@ SUBDIRS += qmlbars \ qmllegend \ qmlmultigraph \ qmloscilloscope \ - qmlsurfacelayers + qmlsurfacelayers \ + qmlaxisformatter !android:!ios { SUBDIRS += bars \ diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.cpp b/examples/datavisualization/qmlaxisformatter/customformatter.cpp new file mode 100644 index 00000000..eeea0451 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/customformatter.cpp @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customformatter.h" +#include +#include +#include + +using namespace QtDataVisualization; + +static const qreal oneDayMs = 60.0 * 60.0 * 24.0 * 1000.0; + +CustomFormatter::CustomFormatter(QObject *parent) : + QValue3DAxisFormatter(parent) +{ +} + +CustomFormatter::~CustomFormatter() +{ +} + +//! [1] +QValue3DAxisFormatter *CustomFormatter::createNewInstance() const +{ + return new CustomFormatter(); +} + +void CustomFormatter::populateCopy(QValue3DAxisFormatter ©) const +{ + QValue3DAxisFormatter::populateCopy(copy); + + CustomFormatter *customFormatter = static_cast(©); + customFormatter->m_originDate = m_originDate; + customFormatter->m_selectionFormat = m_selectionFormat; +} +//! [1] + +//! [2] +void CustomFormatter::recalculate() +{ + // We want our axis to always have gridlines at date breaks + + // Convert range into QDateTimes + QDateTime minTime = valueToDateTime(qreal(axis()->min())); + QDateTime maxTime = valueToDateTime(qreal(axis()->max())); + + // Find out the grid counts + QTime midnight(0, 0); + QDateTime minFullDate(minTime.date(), midnight); + int gridCount = 0; + if (minFullDate != minTime) + minFullDate = minFullDate.addDays(1); + QDateTime maxFullDate(maxTime.date(), midnight); + + gridCount += minFullDate.daysTo(maxFullDate) + 1; + int subGridCount = axis()->subSegmentCount() - 1; + + // Reserve space for position arrays and label strings + gridPositions().resize(gridCount); + subGridPositions().resize((gridCount + 1) * subGridCount); + labelPositions().resize(gridCount); + labelStrings().reserve(gridCount); + + // Calculate positions and format labels + qint64 startMs = minTime.toMSecsSinceEpoch(); + qint64 endMs = maxTime.toMSecsSinceEpoch(); + qreal dateNormalizer = endMs - startMs; + qreal firstLineOffset = (minFullDate.toMSecsSinceEpoch() - startMs) / dateNormalizer; + qreal segmentStep = oneDayMs / dateNormalizer; + qreal subSegmentStep = 0; + if (subGridCount > 0) + subSegmentStep = segmentStep / qreal(subGridCount + 1); + + for (int i = 0; i < gridCount; i++) { + qreal gridValue = firstLineOffset + (segmentStep * qreal(i)); + gridPositions()[i] = float(gridValue); + labelPositions()[i] = float(gridValue); + labelStrings() << minFullDate.addDays(i).toString(axis()->labelFormat()); + } + + for (int i = 0; i <= gridCount; i++) { + if (subGridPositions().size()) { + for (int j = 0; j < subGridCount; j++) { + float position; + if (i) + position = gridPositions().at(i - 1) + subSegmentStep * (j + 1); + else + position = gridPositions().at(0) - segmentStep + subSegmentStep * (j + 1); + if (position > 1.0f || position < 0.0f) + position = gridPositions().at(0); + subGridPositions()[i * subGridCount + j] = position; + } + } + } +} +//! [2] + +//! [3] +QString CustomFormatter::stringForValue(qreal value, const QString &format) const +{ + Q_UNUSED(format) + + return valueToDateTime(value).toString(m_selectionFormat); +} +//! [3] + +QDate CustomFormatter::originDate() const +{ + return m_originDate; +} + +QString CustomFormatter::selectionFormat() const +{ + return m_selectionFormat; +} + +void CustomFormatter::setOriginDate(const QDate &date) +{ + if (m_originDate != date) { + m_originDate = date; + markDirty(true); + emit originDateChanged(date); + } +} + +void CustomFormatter::setSelectionFormat(const QString &format) +{ + if (m_selectionFormat != format) { + m_selectionFormat = format; + emit selectionFormatChanged(format); + } +} + +//! [0] +QDateTime CustomFormatter::valueToDateTime(qreal value) const +{ + return QDateTime(m_originDate).addMSecs(qint64(oneDayMs * value)); +} +//! [0] diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.h b/examples/datavisualization/qmlaxisformatter/customformatter.h new file mode 100644 index 00000000..d439e56a --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/customformatter.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef CUSTOMFORMATTER_H +#define CUSTOMFORMATTER_H + +#include +#include +#include + +using namespace QtDataVisualization; + +//! [2] +class CustomFormatter : public QValue3DAxisFormatter +{ + //! [2] + Q_OBJECT + + //! [1] + Q_PROPERTY(QDate originDate READ originDate WRITE setOriginDate NOTIFY originDateChanged) + //! [1] + //! [3] + Q_PROPERTY(QString selectionFormat READ selectionFormat WRITE setSelectionFormat NOTIFY selectionFormatChanged) + //! [3] +public: + explicit CustomFormatter(QObject *parent = 0); + virtual ~CustomFormatter(); + + //! [0] + virtual QValue3DAxisFormatter *createNewInstance() const; + virtual void populateCopy(QValue3DAxisFormatter ©) const; + virtual void recalculate(); + virtual QString stringForValue(qreal value, const QString &format) const; + //! [0] + + QDate originDate() const; + QString selectionFormat() const; + +public slots: + void setOriginDate(const QDate &date); + void setSelectionFormat(const QString &format); + +signals: + void originDateChanged(const QDate &date); + void selectionFormatChanged(const QString &format); + +private: + Q_DISABLE_COPY(CustomFormatter) + + QDateTime valueToDateTime(qreal value) const; + + QDate m_originDate; + QString m_selectionFormat; +}; + +#endif diff --git a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc new file mode 100644 index 00000000..b990c490 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \example qmlaxisformatter + \title Qt Quick 2 Axis Formatter Example + \ingroup qtdatavisualization_examples + \brief Example of a hybrid C++ and QML application demonstrating different axis formatters. + + The Qt Quick axis formatter example shows how to use predefined axis formatters and how to + create a custom one. + + \image qmlaxisformatter-example.png + + The interesting thing about this example is axis formatters, so we'll concentrate on + that and skip explaining the basic functionality - for + more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}. + + \section1 Custom axis formatter + + Customizing axis formatters requires subclassing the QValue3DAxisFormatter, which cannot be + done in QML code alone. In this example we want an axis that interprets the float values as + a timestamp and shows the date in the axis labels. To achieve this, we introduce a new class + called \c CustomFormatter, which subclasses the QValue3DAxisFormatter: + + \snippet qmlaxisformatter/customformatter.h 2 + \dots 0 + + Since float values of a QScatter3DSeries cannot be directly cast into QDateTime values due to + difference in data width, we need some sort of mapping between the two. We chose to do the + mapping by specifying an origin date for the formatter and interpreting the float values + from the QScatter3DSeries as date offsets to that origin value. The origin date is given as + a property: + + \snippet qmlaxisformatter/customformatter.h 1 + + The mapping from value to QDateTime is done using \c valueToDateTime() method: + + \snippet qmlaxisformatter/customformatter.cpp 0 + + To function as an axis formatter, our \c CustomFormatter needs to reimplement some virtual + methods: + + \snippet qmlaxisformatter/customformatter.h 0 + + The first two are simple, we just create a new instance of \c CustomFormatter and copy the + necessary data over to it. These two methods are used to create and update a cache of formatter for + rendering purposes. It is important to remember to call the superclass implementation + of \c populateCopy(): + + \snippet qmlaxisformatter/customformatter.cpp 1 + + Bulk of the work done by \c CustomFormatter is done in the \c recalculate() method, where + our formatter calculates the grid, subgrid, and label positions, as well as formats the label + strings. + In our custom formatter we ignore the segment count of the axis and draw a grid line always at + midnight. Subsegment count and label positioning is handled normally: + + \snippet qmlaxisformatter/customformatter.cpp 2 + + The axis labels are formatted to show only the date, but for selection label we want little more + resolution for the timestamp, so we specify another property for our custom formatter to allow + user to customize it: + + \snippet qmlaxisformatter/customformatter.h 3 + + This selection format property is used in the reimplemented \c stringToValue method, where we + ignore the submitted format and substitute the custom selection format for it: + + \snippet qmlaxisformatter/customformatter.cpp 3 + + To expose our new custom formatter to the QML, we must declare and register it: + + \snippet qmlaxisformatter/main.cpp 0 + \dots 0 + \snippet qmlaxisformatter/main.cpp 1 + + \section1 QML + + In the QML codes, we define a different axis for each dimension: + + \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 3 + + Z-axis is just a regular ValueAxis3D: + + \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 0 + + For the Y-axis we define a logarithmic axis. ValueAxis3D can be made to show logarithmic scale + by specifying LogValueAxis3DFormatter for \c formatter property of the axis: + + \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 2 + + And finally, for the X-axis we use our new \c CustomFormatter: + + \snippet qmlaxisformatter/qml/qmlaxisformatter/main.qml 1 + + Rest of the application consists of fairly self-explanatory logic for modifying the axes and + showing the graph. +*/ diff --git a/examples/datavisualization/qmlaxisformatter/main.cpp b/examples/datavisualization/qmlaxisformatter/main.cpp new file mode 100644 index 00000000..05ed7b37 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/main.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customformatter.h" + +#include +#include +#include + +//! [0] +Q_DECLARE_METATYPE(CustomFormatter *) +//! [0] + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + //! [1] + qmlRegisterType("CustomFormatter", 1, 0, "CustomFormatter"); + //! [1] + + QQuickView viewer; + + // The following are needed to make examples run without having to install the module + // in desktop environments. +#ifdef Q_OS_WIN + QString extraImportPath(QStringLiteral("%1/../../../../%2")); +#else + QString extraImportPath(QStringLiteral("%1/../../../%2")); +#endif + viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(), + QString::fromLatin1("qml"))); + QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close); + + viewer.setTitle(QStringLiteral("Axis formatter example")); + + viewer.setSource(QUrl("qrc:/qml/qmlaxisformatter/main.qml")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml new file mode 100644 index 00000000..e692c090 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/Data.qml @@ -0,0 +1,50 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 + +Item { + property alias model: dataModel + + ListModel { + id: dataModel + ListElement{ xPos: 2.456103; yPos: 1.0; zPos: 5.0 } + ListElement{ xPos: 5.687549; yPos: 3.0; zPos: 2.5 } + ListElement{ xPos: 2.357458; yPos: 4.1; zPos: 1.0 } + ListElement{ xPos: 4.567458; yPos: 4.75; zPos: 3.9 } + ListElement{ xPos: 6.885439; yPos: 4.9; zPos: 7.2 } + ListElement{ xPos: 2.366769; yPos: 13.42; zPos: 3.5 } + ListElement{ xPos: 7.546457; yPos: 233.1; zPos: 6.9 } + ListElement{ xPos: 2.475867; yPos: 32.91; zPos: 4.1 } + ListElement{ xPos: 8.456546; yPos: 153.68; zPos: 9.52 } + ListElement{ xPos: 3.456348; yPos: 52.96; zPos: 1.6 } + ListElement{ xPos: 1.536446; yPos: 32.4; zPos: 2.92 } + ListElement{ xPos: 8.456666; yPos: 114.74; zPos: 8.18 } + ListElement{ xPos: 5.468486; yPos: 83.1; zPos: 3.8 } + ListElement{ xPos: 6.546586 ; yPos: 63.66; zPos: 3.58 } + ListElement{ xPos: 8.567516 ; yPos: 1.82; zPos: 4.64 } + ListElement{ xPos: 7.678984 ; yPos: 213.18; zPos: 7.22 } + ListElement{ xPos: 7.457569 ; yPos: 63.06; zPos: 4.3 } + ListElement{ xPos: 8.456755 ; yPos: 122.64; zPos: 6.44 } + ListElement{ xPos: 6.234536 ; yPos: 63.96; zPos: 4.38 } + ListElement{ xPos: 9.456718 ; yPos: 243.32; zPos: 4.04 } + ListElement{ xPos: 10.789889 ; yPos: 43.4; zPos: 2.78 } + ListElement{ xPos: 11.346554 ; yPos: 345.12; zPos: 3.1 } + ListElement{ xPos: 12.023454 ; yPos: 500.0; zPos: 3.68 } + } +} diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml new file mode 100644 index 00000000..e4fb99d2 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/NewButton.qml @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 + +Item { + id: newbutton + + property alias text: buttonText.text + + signal clicked + + implicitWidth: buttonText.implicitWidth + 5 + implicitHeight: buttonText.implicitHeight + 10 + + Button { + id: buttonText + width: parent.width + height: parent.height + + style: ButtonStyle { + label: Component { + Text { + text: buttonText.text + clip: true + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + } + } + onClicked: newbutton.clicked() + } +} diff --git a/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml new file mode 100644 index 00000000..7aba08c6 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/qml/qmlaxisformatter/main.qml @@ -0,0 +1,183 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtDataVisualization 1.1 +import CustomFormatter 1.0 +import "." + +Rectangle { + id: mainView + width: 1280 + height: 1024 + + Data { + id: seriesData + } + + Theme3D { + id: themeIsabelle + type: Theme3D.ThemePrimaryColors + font.family: "Lucida Handwriting" + font.pointSize: 40 + } + + //! [1] + ValueAxis3D { + id: dateAxis + formatter: CustomFormatter { + originDate: "2014-01-01" + selectionFormat: "yyyy-MM-dd HH:mm:ss" + } + subSegmentCount: 2 + labelFormat: "yyyy-MM-dd" + min: 0 + max: 14 + } + //! [1] + + //! [2] + ValueAxis3D { + id: logAxis + formatter: LogValueAxis3DFormatter { + id: logAxisFormatter + base: 10 + autoSubGrid: true + showEdgeLabels: true + } + labelFormat: "%.2f" + } + //! [2] + + ValueAxis3D { + id: linearAxis + labelFormat: "%.2f" + min: 0 + max: 500 + } + + //! [0] + ValueAxis3D { + id: valueAxis + segmentCount: 5 + subSegmentCount: 2 + labelFormat: "%.2f" + min: 0 + max: 10 + } + //! [0] + + Item { + id: dataView + anchors.bottom: parent.bottom + width: parent.width + height: parent.height - buttonLayout.height + + Scatter3D { + id: scatterGraph + width: dataView.width + height: dataView.height + theme: themeIsabelle + shadowQuality: AbstractGraph3D.ShadowQualitySoftLow + scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricRight + //! [3] + axisZ: valueAxis + axisY: logAxis + axisX: dateAxis + //! [3] + + Scatter3DSeries { + id: scatterSeries + itemLabelFormat: "@xLabel - (@yLabel, @zLabel)" + meshSmooth: true + ItemModelScatterDataProxy { + itemModel: seriesData.model + xPosRole: "xPos" + yPosRole: "yPos" + zPosRole: "zPos" + } + } + } + } + + RowLayout { + id: buttonLayout + Layout.minimumHeight: exitButton.height + width: parent.width + anchors.left: parent.left + spacing: 0 + + NewButton { + id: yAxisBaseChange + Layout.fillHeight: true + Layout.fillWidth: true + state: "enabled" + onClicked: { + if (logAxisFormatter.base === 10) + logAxisFormatter.base = 0 + else if (logAxisFormatter.base === 2) + logAxisFormatter.base = 10 + else + logAxisFormatter.base = 2 + } + states: [ + State { + name: "enabled" + PropertyChanges { + target: yAxisBaseChange + text: "Y-axis log base: " + logAxisFormatter.base + enabled: true + } + }, + State { + name: "disabled" + PropertyChanges { + target: yAxisBaseChange + text: "Y-axis linear" + enabled: false + } + } + ] + } + + NewButton { + id: yAxisToggle + Layout.fillHeight: true + Layout.fillWidth: true + text: "Toggle Y-axis" + onClicked: { + if (scatterGraph.axisY === linearAxis) { + scatterGraph.axisY = logAxis + yAxisBaseChange.state = "enabled" + } else { + scatterGraph.axisY = linearAxis + yAxisBaseChange.state = "disabled" + } + } + } + + NewButton { + id: exitButton + Layout.fillHeight: true + Layout.fillWidth: true + text: "Quit" + onClicked: Qt.quit(0); + } + } +} diff --git a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro new file mode 100644 index 00000000..0f3b2f80 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.pro @@ -0,0 +1,16 @@ +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +QT += datavisualization + +# The .cpp file which was generated for your project. Feel free to hack it. +SOURCES += main.cpp \ + customformatter.cpp +HEADERS += customformatter.h + +RESOURCES += qmlaxisformatter.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* \ + qml/qmlaxisformatter/* diff --git a/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc new file mode 100644 index 00000000..0cd9e927 --- /dev/null +++ b/examples/datavisualization/qmlaxisformatter/qmlaxisformatter.qrc @@ -0,0 +1,7 @@ + + + qml/qmlaxisformatter/main.qml + qml/qmlaxisformatter/NewButton.qml + qml/qmlaxisformatter/Data.qml + + diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h index ef2f7acb..4f210269 100644 --- a/examples/datavisualization/qmloscilloscope/datasource.h +++ b/examples/datavisualization/qmloscilloscope/datasource.h @@ -22,8 +22,6 @@ #include #include -class QQuickView; - using namespace QtDataVisualization; class DataSource : public QObject diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index 3b60ff5d..94ff4283 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -288,7 +288,7 @@ void QAbstract3DAxisPrivate::updateLabels() // Default implementation does nothing } -void QAbstract3DAxisPrivate::setRange(float min, float max) +void QAbstract3DAxisPrivate::setRange(float min, float max, bool suppressWarnings) { bool adjusted = false; if (!allowNegatives()) { @@ -332,7 +332,7 @@ void QAbstract3DAxisPrivate::setRange(float min, float max) } if (minDirty || maxDirty) { - if (adjusted) { + if (adjusted && !suppressWarnings) { qWarning() << "Warning: Tried to set invalid range for axis." " Range automatically adjusted to a valid one:" << min << "-" << max << "-->" << m_min << "-" << m_max; diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h index 80f8f0b2..38d5361c 100644 --- a/src/datavisualization/axis/qabstract3daxis_p.h +++ b/src/datavisualization/axis/qabstract3daxis_p.h @@ -47,7 +47,7 @@ public: inline bool isDefaultAxis() { return m_isDefaultAxis; } inline void setDefaultAxis(bool isDefault) { m_isDefaultAxis = isDefault; } - virtual void setRange(float min, float max); + virtual void setRange(float min, float max, bool suppressWarnings = false); virtual void setMin(float min); virtual void setMax (float max); diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp index e8c2fbad..128d784d 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp @@ -96,6 +96,8 @@ QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPriva QObject *parent) : QValue3DAxisFormatter(d, parent) { + setAllowNegatives(false); + setAllowZero(false); } /*! @@ -104,6 +106,8 @@ QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPriva QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QObject *parent) : QValue3DAxisFormatter(new QLogValue3DAxisFormatterPrivate(this), parent) { + setAllowNegatives(false); + setAllowZero(false); } /*! @@ -197,22 +201,6 @@ bool QLogValue3DAxisFormatter::showEdgeLabels() const return dptrc()->m_showEdgeLabels; } -/*! - * \internal - */ -bool QLogValue3DAxisFormatter::allowNegatives() const -{ - return false; -} - -/*! - * \internal - */ -bool QLogValue3DAxisFormatter::allowZero() const -{ - return false; -} - /*! * \internal */ @@ -254,14 +242,6 @@ void QLogValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter ©) const dptrc()->populateCopy(copy); } -/*! - * \internal - */ -QString QLogValue3DAxisFormatter::labelForIndex(int index) const -{ - return dptrc()->labelForIndex(index); -} - /*! * \internal */ @@ -305,6 +285,7 @@ void QLogValue3DAxisFormatterPrivate::recalculate() int subGridCount = m_axis->subSegmentCount() - 1; int segmentCount = m_axis->segmentCount(); + QString labelFormat = m_axis->labelFormat(); qreal segmentStep; if (m_base > 0.0) { // Update parent axis segment counts @@ -336,36 +317,53 @@ void QLogValue3DAxisFormatterPrivate::recalculate() m_gridPositions.resize(segmentCount + 1); m_subGridPositions.resize(segmentCount * subGridCount); m_labelPositions.resize(segmentCount + 1); - m_labelValues.resize(segmentCount + 1); + m_labelStrings.clear(); + m_labelStrings.reserve(segmentCount + 1); // Calculate segment positions int index = 0; if (!m_evenMinSegment) { m_gridPositions[0] = 0.0f; m_labelPositions[0] = 0.0f; - m_labelValues[0] = qreal(m_min); + if (m_showEdgeLabels) + m_labelStrings << qptr()->stringForValue(qreal(m_min), labelFormat); + else + m_labelStrings << QString(); index++; } for (int i = 0; i < segmentCount; i++) { float gridValue = float((minDiff + qreal(i)) / qreal(logRangeNormalizer)); m_gridPositions[index] = gridValue; m_labelPositions[index] = gridValue; - m_labelValues[index] = qPow(m_base, minDiff + qreal(i) + logMin); + m_labelStrings << qptr()->stringForValue(qPow(m_base, minDiff + qreal(i) + logMin), + labelFormat); index++; } // Ensure max value doesn't suffer from any rounding errors m_gridPositions[segmentCount] = 1.0f; m_labelPositions[segmentCount] = 1.0f; - m_labelValues[segmentCount] = qreal(m_max); + QString finalLabel; + if (m_showEdgeLabels || m_evenMaxSegment) + finalLabel = qptr()->stringForValue(qreal(m_max), labelFormat); + + if (m_labelStrings.size() > segmentCount) + m_labelStrings.replace(segmentCount, finalLabel); + else + m_labelStrings << finalLabel; } else { // Grid lines and label positions are the same as the parent class, so call parent impl // first to populate those QValue3DAxisFormatterPrivate::doRecalculate(); - // Label value array needs to be repopulated + // Label string list needs to be repopulated segmentStep = 1.0 / qreal(segmentCount); - for (int i = 0; i < m_labelPositions.size(); i++) - m_labelValues[i] = qExp(segmentStep * qreal(i) * m_logRangeNormalizer + m_logMin); + + m_labelStrings << qptr()->stringForValue(qreal(m_min), labelFormat); + for (int i = 1; i < m_labelPositions.size() - 1; i++) + m_labelStrings[i] = qptr()->stringForValue(qExp(segmentStep * qreal(i) + * m_logRangeNormalizer + m_logMin), + labelFormat); + m_labelStrings << qptr()->stringForValue(qreal(m_max), labelFormat); m_evenMaxSegment = true; m_evenMinSegment = true; @@ -426,15 +424,9 @@ float QLogValue3DAxisFormatterPrivate::valueAt(float position) const return float(qExp(logValue)); } -QString QLogValue3DAxisFormatterPrivate::labelForIndex(int index) const +QLogValue3DAxisFormatter *QLogValue3DAxisFormatterPrivate::qptr() { - if (((index == m_gridPositions.size() - 1 && !m_evenMaxSegment) - || (index == 0 && !m_evenMinSegment)) - && !m_showEdgeLabels) { - return QString(); - } else { - return QValue3DAxisFormatterPrivate::labelForIndex(index); - } + return static_cast(q_ptr); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.h b/src/datavisualization/axis/qlogvalue3daxisformatter.h index e9683821..62714a7d 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.h +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.h @@ -52,14 +52,11 @@ signals: void showEdgeLabelsChanged(bool enabled); protected: - virtual bool allowNegatives() const; - virtual bool allowZero() const; virtual QValue3DAxisFormatter *createNewInstance() const; virtual void recalculate(); virtual float positionAt(float value) const; virtual float valueAt(float position) const; virtual void populateCopy(QValue3DAxisFormatter ©) const; - virtual QString labelForIndex(int index) const; QLogValue3DAxisFormatterPrivate *dptr(); const QLogValue3DAxisFormatterPrivate *dptrc() const; diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h index 6638e2c7..af056a06 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h @@ -50,7 +50,6 @@ public: float positionAt(float value) const; float valueAt(float position) const; - QString labelForIndex(int index) const; protected: QLogValue3DAxisFormatter *qptr(); diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index b957de4d..3a8b902f 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -223,11 +223,11 @@ QValue3DAxisPrivate::~QValue3DAxisPrivate() { } -void QValue3DAxisPrivate::setRange(float min, float max) +void QValue3DAxisPrivate::setRange(float min, float max, bool suppressWarnings) { bool dirty = (min != m_min || max != m_max); - QAbstract3DAxisPrivate::setRange(min, max); + QAbstract3DAxisPrivate::setRange(min, max, suppressWarnings); if (dirty) emitLabelsChanged(); @@ -266,17 +266,9 @@ void QValue3DAxisPrivate::updateLabels() m_labelsDirty = false; - int labelCount = m_formatter->labelPositions().size(); - - QStringList newLabels; - newLabels.reserve(labelCount); - m_formatter->d_ptr->recalculate(); - for (int i = 0; i < labelCount; i++) - newLabels.append(m_formatter->labelForIndex(i)); - if (m_labels != newLabels) - m_labels = newLabels; + m_labels = m_formatter->labelStrings(); } bool QValue3DAxisPrivate::allowZero() diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index b49447af..eeccf527 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -42,7 +42,7 @@ public: QValue3DAxisPrivate(QValue3DAxis *q); virtual ~QValue3DAxisPrivate(); - virtual void setRange(float min, float max); + virtual void setRange(float min, float max, bool suppressWarnings = false); virtual void setMin(float min); virtual void setMax (float max); diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index 92940a1b..4cd84d88 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -74,13 +74,29 @@ QValue3DAxisFormatter::~QValue3DAxisFormatter() { } +/*! + * Allow the parent axis to have negative values if \a allow is true. + */ +void QValue3DAxisFormatter::setAllowNegatives(bool allow) +{ + d_ptr->m_allowNegatives = allow; +} + /*! * \return \c true if negative values are valid values for parent axis. * The default implementation always returns true. */ bool QValue3DAxisFormatter::allowNegatives() const { - return true; + return d_ptr->m_allowNegatives; +} + +/*! + * Allow the parent axis to have zero value if \a allow is true. + */ +void QValue3DAxisFormatter::setAllowZero(bool allow) +{ + d_ptr->m_allowZero = allow; } /*! @@ -89,7 +105,7 @@ bool QValue3DAxisFormatter::allowNegatives() const */ bool QValue3DAxisFormatter::allowZero() const { - return true; + return d_ptr->m_allowZero; } /*! @@ -104,16 +120,16 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const } /*! - * This method resizes and populates the label and grid line position arrays and the label value + * This method resizes and populates the label and grid line position arrays and the label strings * array, as well as calculates any values needed for mapping between value and position. * It is allowed to access the parent axis from inside this function. * - * This method must be reimplemented in a subclass. + * This method must be reimplemented in a subclass if the default array contents are not suitable. * - * See gridPositions(), subGridPositions(), labelPositions(), and labelValues() methods for + * See gridPositions(), subGridPositions(), labelPositions(), and labelStrings() methods for * documentation about the arrays that need to be resized and populated. * - * \sa gridPositions(), subGridPositions(), labelPositions(), labelValues(), axis() + * \sa gridPositions(), subGridPositions(), labelPositions(), labelStrings(), axis() */ void QValue3DAxisFormatter::recalculate() { @@ -121,28 +137,14 @@ void QValue3DAxisFormatter::recalculate() } /*! - * The parent axis uses this method to request axis label strings for label \a index, - * using the value stored in label values array and QValue3DAxis::labelFormat property. - * Reimplement this method in a subclass if the default labeling is not sufficient. - * If an empty string is returned, the label is not shown. - * - * \return A string formatted using axis label formatter. - * - * \sa stringForValue(), labelValues(), QValue3DAxis::labelFormat - */ -QString QValue3DAxisFormatter::labelForIndex(int index) const -{ - return d_ptr->labelForIndex(index); -} - -/*! + * This method is used to format a string using the specified value and the specified format. * Reimplement this method in a subclass to resolve the formatted string for a given \a value * if the default formatting rules specified for QValue3DAxis::labelFormat property are not * sufficient. * - * \return the formatted label string using \a value and \a format. + * \return the formatted label string using a \a value and a \a format. * - * \sa recalculate(), labelForIndex(), QValue3DAxis::labelFormat + * \sa recalculate(), labelStrings(), QValue3DAxis::labelFormat */ QString QValue3DAxisFormatter::stringForValue(qreal value, const QString &format) const { @@ -257,15 +259,15 @@ QVector &QValue3DAxisFormatter::labelPositions() const } /*! - * \return a reference to the array of values used to generate label strings. + * \return a reference to the string list containing formatter label strings. * The array size must be equal to the size of the label positions array and * the indexes correspond to that array as well. * * \sa labelPositions() */ -QVector &QValue3DAxisFormatter::labelValues() const +QStringList &QValue3DAxisFormatter::labelStrings() const { - return d_ptr->m_labelValues; + return d_ptr->m_labelStrings; } // QValue3DAxisFormatterPrivate @@ -277,7 +279,9 @@ QValue3DAxisFormatterPrivate::QValue3DAxisFormatterPrivate(QValue3DAxisFormatter m_max(0.0f), m_rangeNormalizer(0.0f), m_axis(0), - m_preparsedParamType(Utils::ParamTypeUnknown) + m_preparsedParamType(Utils::ParamTypeUnknown), + m_allowNegatives(true), + m_allowZero(true) { } @@ -303,12 +307,14 @@ void QValue3DAxisFormatterPrivate::doRecalculate() { int segmentCount = m_axis->segmentCount(); int subGridCount = m_axis->subSegmentCount() - 1; + QString labelFormat = m_axis->labelFormat(); m_gridPositions.resize(segmentCount + 1); m_subGridPositions.resize(segmentCount * subGridCount); m_labelPositions.resize(segmentCount + 1); - m_labelValues.resize(segmentCount + 1); + m_labelStrings.clear(); + m_labelStrings.reserve(segmentCount + 1); // Use qreals for intermediate calculations for better accuracy on label values qreal segmentStep = 1.0 / qreal(segmentCount); @@ -322,7 +328,8 @@ void QValue3DAxisFormatterPrivate::doRecalculate() qreal gridValue = segmentStep * qreal(i); m_gridPositions[i] = float(gridValue); m_labelPositions[i] = float(gridValue); - m_labelValues[i] = gridValue * rangeNormalizer + qreal(m_min); + m_labelStrings << q_ptr->stringForValue(gridValue * rangeNormalizer + qreal(m_min), + labelFormat); if (m_subGridPositions.size()) { for (int j = 0; j < subGridCount; j++) m_subGridPositions[i * subGridCount + j] = gridValue + subSegmentStep * (j + 1); @@ -332,6 +339,7 @@ void QValue3DAxisFormatterPrivate::doRecalculate() // Ensure max value doesn't suffer from any rounding errors m_gridPositions[segmentCount] = 1.0f; m_labelPositions[segmentCount] = 1.0f; + m_labelStrings << q_ptr->stringForValue(qreal(m_max), labelFormat); } void QValue3DAxisFormatterPrivate::populateCopy(QValue3DAxisFormatter ©) @@ -351,12 +359,6 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate & copy.m_subGridPositions = m_subGridPositions; } -QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const -{ - Q_ASSERT(index < m_labelValues.size()); - return q_ptr->stringForValue(m_labelValues.at(index), m_axis->labelFormat()); -} - QString QValue3DAxisFormatterPrivate::stringForValue(qreal value, const QString &format) { if (m_previousLabelFormat.compare(format)) { @@ -383,10 +385,15 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) { Q_ASSERT(axis); + // These signals are all connected to markDirtyNoLabelChange slot, even though most of them + // do require labels to be regenerated. This is because the label regeneration is triggered + // elsewhere in these cases. connect(axis, &QValue3DAxis::segmentCountChanged, this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); connect(axis, &QValue3DAxis::subSegmentCountChanged, this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); + connect(axis, &QValue3DAxis::labelFormatChanged, + this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); connect(axis, &QAbstract3DAxis::rangeChanged, this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange); @@ -396,10 +403,12 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis) void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange) { m_needsRecalculate = true; - if (labelsChange) - m_axis->dptr()->emitLabelsChanged(); - if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone) - emit m_axis->dptr()->formatterDirty(); + if (m_axis) { + if (labelsChange) + m_axis->dptr()->emitLabelsChanged(); + if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone) + emit m_axis->dptr()->formatterDirty(); + } } void QValue3DAxisFormatterPrivate::markDirtyNoLabelChange() diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index 970087d3..5ecc798d 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -22,6 +22,8 @@ #include #include #include +#include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -31,7 +33,6 @@ class QValue3DAxis; class QT_DATAVISUALIZATION_EXPORT QValue3DAxisFormatter : public QObject { Q_OBJECT - protected: explicit QValue3DAxisFormatter(QValue3DAxisFormatterPrivate *d, QObject *parent = 0); public: @@ -39,11 +40,13 @@ public: virtual ~QValue3DAxisFormatter(); protected: - virtual bool allowNegatives() const; - virtual bool allowZero() const; + void setAllowNegatives(bool allow); + bool allowNegatives() const; + void setAllowZero(bool allow); + bool allowZero() const; + virtual QValue3DAxisFormatter *createNewInstance() const; virtual void recalculate(); - virtual QString labelForIndex(int index) const; virtual QString stringForValue(qreal value, const QString &format) const; virtual float positionAt(float value) const; virtual float valueAt(float position) const; @@ -55,7 +58,7 @@ protected: QVector &gridPositions() const; QVector &subGridPositions() const; QVector &labelPositions() const; - QVector &labelValues() const; + QStringList &labelStrings() const; QScopedPointer d_ptr; diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index 7e661b62..f7fd001e 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -29,7 +29,6 @@ #include "datavisualizationglobal_p.h" #include "qvalue3daxisformatter.h" #include "utils_p.h" -#include #ifndef QVALUE3DAXISFORMATTER_P_H #define QVALUE3DAXISFORMATTER_P_H @@ -51,7 +50,6 @@ public: void populateCopy(QValue3DAxisFormatter ©); void doPopulateCopy(QValue3DAxisFormatterPrivate ©); - QString labelForIndex(int index) const; QString stringForValue(qreal value, const QString &format); float positionAt(float value) const; float valueAt(float position) const; @@ -74,7 +72,7 @@ protected: QVector m_gridPositions; QVector m_subGridPositions; QVector m_labelPositions; - QVector m_labelValues; + QStringList m_labelStrings; QValue3DAxis *m_axis; @@ -82,6 +80,9 @@ protected: QByteArray m_labelFormatArray; Utils::ParamType m_preparsedParamType; + bool m_allowNegatives; + bool m_allowZero; + friend class QValue3DAxisFormatter; }; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index c6c1a9f1..0b2a4834 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -545,9 +545,9 @@ void Bars3DController::adjustAxisRanges() } // Call private implementations of setRange to avoid unsetting auto adjust flag if (adjustZ) - categoryAxisZ->dptr()->setRange(0.0f, float(maxRowCount)); + categoryAxisZ->dptr()->setRange(0.0f, float(maxRowCount), true); if (adjustX) - categoryAxisX->dptr()->setRange(0.0f, float(maxColumnCount)); + categoryAxisX->dptr()->setRange(0.0f, float(maxColumnCount), true); } // Now that we know the row and column ranges, figure out the value axis range @@ -582,7 +582,7 @@ void Bars3DController::adjustAxisRanges() minValue = 0.0f; maxValue = 1.0f; } - valueAxis->dptr()->setRange(minValue, maxValue); + valueAxis->dptr()->setRange(minValue, maxValue, true); } } } diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 54292ac0..bf283495 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -407,7 +407,7 @@ void Scatter3DController::adjustValueAxisRange() adjustment = defaultAdjustment; } } - valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment); + valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment, true); } if (adjustY) { // If all points at same coordinate, need to default to some valid range @@ -415,7 +415,7 @@ void Scatter3DController::adjustValueAxisRange() float adjustment = 0.0f; if (minValueY == maxValueY) adjustment = defaultAdjustment; - valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment); + valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment, true); } if (adjustZ) { // If all points at same coordinate, need to default to some valid range @@ -434,7 +434,7 @@ void Scatter3DController::adjustValueAxisRange() adjustment = defaultAdjustment; } } - valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment); + valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment, true); } } } diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 991a1ce8..42e408dd 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -517,7 +517,7 @@ void Surface3DController::adjustValueAxisRange() adjustment = defaultAdjustment; } } - valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment); + valueAxisX->dptr()->setRange(minValueX - adjustment, maxValueX + adjustment, true); } if (adjustY) { // If all points at same coordinate, need to default to some valid range @@ -525,7 +525,7 @@ void Surface3DController::adjustValueAxisRange() float adjustment = 0.0f; if (minValueY == maxValueY) adjustment = defaultAdjustment; - valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment); + valueAxisY->dptr()->setRange(minValueY - adjustment, maxValueY + adjustment, true); } if (adjustZ) { // If all points at same coordinate, need to default to some valid range @@ -544,7 +544,7 @@ void Surface3DController::adjustValueAxisRange() adjustment = defaultAdjustment; } } - valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment); + valueAxisZ->dptr()->setRange(minValueZ - adjustment, maxValueZ + adjustment, true); } } } diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index 04e70ecb..e0e427f3 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -24,7 +24,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) { - // @uri QtDataVisualization + // QtDataVisualization 1.0 + qmlRegisterUncreatableType(uri, 1, 0, "AbstractItemModel", QLatin1String("Trying to create uncreatable: AbstractItemModel.")); qmlRegisterUncreatableType(uri, 1, 0, "AbstractAxis3D", @@ -80,6 +81,15 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 0, "Surface3DSeries"); qRegisterMetaType("QAbstract3DGraph::ShadowQuality"); + + // QtDataVisualization 1.1 + + // New revisions + qmlRegisterType(uri, 1, 1, "ValueAxis3D"); + + // New types + qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); + qmlRegisterType(uri, 1, 1, "LogValueAxis3DFormatter"); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h index e39d6b35..14fb530e 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h @@ -28,6 +28,8 @@ #include "qitemmodelsurfacedataproxy.h" #include "qheightmapsurfacedataproxy.h" #include "qvalue3daxis.h" +#include "qvalue3daxisformatter.h" +#include "qlogvalue3daxisformatter.h" #include "qcategory3daxis.h" #include "q3dobject.h" #include "q3dcamera.h" @@ -58,6 +60,8 @@ QML_DECLARE_TYPE(const QAbstractItemModel) QML_DECLARE_TYPE(QAbstract3DAxis) QML_DECLARE_TYPE(QCategory3DAxis) QML_DECLARE_TYPE(QValue3DAxis) +QML_DECLARE_TYPE(QValue3DAxisFormatter) +QML_DECLARE_TYPE(QLogValue3DAxisFormatter) QML_DECLARE_TYPE(Q3DScene) QML_DECLARE_TYPE(Declarative3DScene) -- cgit v1.2.3 From e076fa05488bb9f58393f0e636c97d07b6fb446d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 1 Apr 2014 10:04:51 +0300 Subject: Axis label dragging support, part 1 Task-number: QTRD-2367 + Added label selection support to surface & scatter + Added Y-label selection support to bars Change-Id: I3153f1e38019604be763492feba66c3af084de14 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/bars3drenderer.cpp | 113 ++++++----- src/datavisualization/engine/scatter3drenderer.cpp | 219 +++++++++++++-------- src/datavisualization/engine/scatter3drenderer_p.h | 2 + src/datavisualization/engine/surface3drenderer.cpp | 151 +++++++++----- src/datavisualization/engine/surface3drenderer_p.h | 2 + .../global/datavisualizationglobal_p.h | 1 + 6 files changed, 307 insertions(+), 181 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 6d54b190..15aa526f 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1655,6 +1655,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer GLfloat rowScaleFactor, GLfloat columnScaleFactor, bool barSelectionFound, BarRenderItem *selectedBar) { ShaderHelper *shader = 0; + GLfloat alphaForValueSelection = labelValueAlpha / 255.0f; GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; GLfloat alphaForColumnSelection = labelColumnAlpha / 255.0f; if (drawSelection) { @@ -1672,59 +1673,63 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer glEnable(GL_POLYGON_OFFSET_FILL); // Y Labels - if (!drawSelection) { - int labelNbr = 0; - int labelCount = m_axisCacheY.labelCount(); - GLfloat labelMarginXTrans = labelMargin; - GLfloat labelMarginZTrans = labelMargin; - GLfloat labelXTrans = rowScaleFactor; - GLfloat labelZTrans = columnScaleFactor; - QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); - QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = Qt::AlignLeft; - Qt::AlignmentFlag sideAlignment = Qt::AlignLeft; - if (!m_xFlipped) { - labelXTrans = -labelXTrans; - labelMarginXTrans = -labelMargin; - backLabelRotation.setY(90.0f); - sideAlignment = Qt::AlignRight; - } - if (m_zFlipped) { - labelZTrans = -labelZTrans; - labelMarginZTrans = -labelMargin; - backAlignment = Qt::AlignRight; - sideLabelRotation.setY(180.f); - } - QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, - labelZTrans + labelMarginZTrans); - QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, - 0.0f, -labelZTrans); - - for (int i = 0; i < labelCount; i++) { - if (m_axisCacheY.labelItems().size() > labelNbr) { - backLabelTrans.setY(m_axisCacheY.labelPosition(i)); - sideLabelTrans.setY(backLabelTrans.y()); - - glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); - - const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); - - // Back wall - m_dummyBarRenderItem.setTranslation(backLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, backLabelRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment); - - // Side wall - m_dummyBarRenderItem.setTranslation(sideLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment); + int labelNbr = 0; + int labelCount = m_axisCacheY.labelCount(); + GLfloat labelMarginXTrans = labelMargin; + GLfloat labelMarginZTrans = labelMargin; + GLfloat labelXTrans = rowScaleFactor; + GLfloat labelZTrans = columnScaleFactor; + QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); + QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); + Qt::AlignmentFlag backAlignment = Qt::AlignLeft; + Qt::AlignmentFlag sideAlignment = Qt::AlignLeft; + if (!m_xFlipped) { + labelXTrans = -labelXTrans; + labelMarginXTrans = -labelMargin; + backLabelRotation.setY(90.0f); + sideAlignment = Qt::AlignRight; + } + if (m_zFlipped) { + labelZTrans = -labelZTrans; + labelMarginZTrans = -labelMargin; + backAlignment = Qt::AlignRight; + sideLabelRotation.setY(180.f); + } + QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, + labelZTrans + labelMarginZTrans); + QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, + 0.0f, -labelZTrans); + + for (int i = 0; i < labelCount; i++) { + if (m_axisCacheY.labelItems().size() > labelNbr) { + backLabelTrans.setY(m_axisCacheY.labelPosition(i)); + sideLabelTrans.setY(backLabelTrans.y()); + + glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); + + const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); + + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, i / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + // Back wall + m_dummyBarRenderItem.setTranslation(backLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, backLabelRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, backAlignment); + + // Side wall + m_dummyBarRenderItem.setTranslation(sideLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, sideAlignment); } + labelNbr++; } // Z labels @@ -2169,11 +2174,17 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC // Use column from previous selection in case we have row + column mode GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); + // TODO: Pass label clicked info to input handler (implement in part 2) } else if (selectionColor.w() == labelColumnAlpha) { // Column selection // Use row from previous selection in case we have row + column mode GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); + // TODO: Pass label clicked info to input handler (implement in part 2) + } else if (selectionColor.w() == labelValueAlpha) { + // Value selection + position = Bars3DController::invalidSelectionPosition(); + // TODO: Pass label clicked info to input handler (implement in part 2) } return position; } diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9a2522d4..a6633183 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -547,6 +547,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotNo++; } } + + drawLabels(true, activeCamera, viewMatrix, projectionMatrix); + glEnable(GL_DITHER); // Read color under cursor @@ -1234,12 +1237,97 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } - // Draw axis labels - m_labelShader->bind(); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); + + // Handle selection clearing and selection label drawing + if (!dotSelectionFound) { + // We have no ownership, don't delete. Just NULL the pointer. + m_selectedItem = NULL; + } else { + glDisable(GL_DEPTH_TEST); + // Draw the selection label + LabelItem &labelItem = selectionLabelItem(); + if (m_selectedItem != selectedItem || m_updateLabels + || !labelItem.textureId() || m_selectionLabelDirty) { + QString labelText = selectionLabel(); + if (labelText.isNull() || m_selectionLabelDirty) { + static const QString xTitleTag(QStringLiteral("@xTitle")); + static const QString yTitleTag(QStringLiteral("@yTitle")); + static const QString zTitleTag(QStringLiteral("@zTitle")); + static const QString xLabelTag(QStringLiteral("@xLabel")); + static const QString yLabelTag(QStringLiteral("@yLabel")); + static const QString zLabelTag(QStringLiteral("@zLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); + + labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat(); + + labelText.replace(xTitleTag, m_axisCacheX.title()); + labelText.replace(yTitleTag, m_axisCacheY.title()); + labelText.replace(zTitleTag, m_axisCacheZ.title()); + + if (labelText.contains(xLabelTag)) { + QString valueLabelText = m_axisCacheX.formatter()->stringForValue( + qreal(selectedItem->position().x()), m_axisCacheX.labelFormat()); + labelText.replace(xLabelTag, valueLabelText); + } + if (labelText.contains(yLabelTag)) { + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + qreal(selectedItem->position().y()), m_axisCacheY.labelFormat()); + labelText.replace(yLabelTag, valueLabelText); + } + if (labelText.contains(zLabelTag)) { + QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( + qreal(selectedItem->position().z()), m_axisCacheZ.labelFormat()); + labelText.replace(zLabelTag, valueLabelText); + } + labelText.replace(seriesNameTag, + m_visibleSeriesList[m_selectedItemSeriesIndex].name()); + + setSelectionLabel(labelText); + m_selectionLabelDirty = false; + } + m_drawer->generateLabelItem(labelItem, labelText); + m_selectedItem = selectedItem; + } + + m_drawer->drawLabel(*selectedItem, labelItem, viewMatrix, projectionMatrix, + zeroVector, zeroVector, selectedItemSize, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, true, false, + Drawer::LabelOver); + + // Reset label update flag; they should have been updated when we get here + m_updateLabels = false; + glEnable(GL_DEPTH_TEST); + } + + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + + // Release shader + glUseProgram(0); + + m_selectionDirty = false; +} + +void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix) { + ShaderHelper *shader = 0; + GLfloat alphaForValueSelection = labelValueAlpha / 255.0f; + GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; + GLfloat alphaForColumnSelection = labelColumnAlpha / 255.0f; + if (drawSelection) { + shader = m_selectionShader; + // m_selectionShader is already bound + } else { + shader = m_labelShader; + shader->bind(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_OFFSET_FILL); // Z Labels @@ -1282,6 +1370,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); + if (drawSelection) { + QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, + alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, true, @@ -1330,6 +1424,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, true, @@ -1396,6 +1496,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); + } + // Back wall labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); @@ -1416,75 +1522,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } glDisable(GL_POLYGON_OFFSET_FILL); - - // Handle selection clearing and selection label drawing - if (!dotSelectionFound) { - // We have no ownership, don't delete. Just NULL the pointer. - m_selectedItem = NULL; - } else { - glDisable(GL_DEPTH_TEST); - // Draw the selection label - LabelItem &labelItem = selectionLabelItem(); - if (m_selectedItem != selectedItem || m_updateLabels - || !labelItem.textureId() || m_selectionLabelDirty) { - QString labelText = selectionLabel(); - if (labelText.isNull() || m_selectionLabelDirty) { - static const QString xTitleTag(QStringLiteral("@xTitle")); - static const QString yTitleTag(QStringLiteral("@yTitle")); - static const QString zTitleTag(QStringLiteral("@zTitle")); - static const QString xLabelTag(QStringLiteral("@xLabel")); - static const QString yLabelTag(QStringLiteral("@yLabel")); - static const QString zLabelTag(QStringLiteral("@zLabel")); - static const QString seriesNameTag(QStringLiteral("@seriesName")); - - labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat(); - - labelText.replace(xTitleTag, m_axisCacheX.title()); - labelText.replace(yTitleTag, m_axisCacheY.title()); - labelText.replace(zTitleTag, m_axisCacheZ.title()); - - if (labelText.contains(xLabelTag)) { - QString valueLabelText = m_axisCacheX.formatter()->stringForValue( - qreal(selectedItem->position().x()), m_axisCacheX.labelFormat()); - labelText.replace(xLabelTag, valueLabelText); - } - if (labelText.contains(yLabelTag)) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(selectedItem->position().y()), m_axisCacheY.labelFormat()); - labelText.replace(yLabelTag, valueLabelText); - } - if (labelText.contains(zLabelTag)) { - QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( - qreal(selectedItem->position().z()), m_axisCacheZ.labelFormat()); - labelText.replace(zLabelTag, valueLabelText); - } - labelText.replace(seriesNameTag, - m_visibleSeriesList[m_selectedItemSeriesIndex].name()); - - setSelectionLabel(labelText); - m_selectionLabelDirty = false; - } - m_drawer->generateLabelItem(labelItem, labelText); - m_selectedItem = selectedItem; - } - - m_drawer->drawLabel(*selectedItem, labelItem, viewMatrix, projectionMatrix, - zeroVector, zeroVector, selectedItemSize, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, true, false, - Drawer::LabelOver); - - // Reset label update flag; they should have been updated when we get here - m_updateLabels = false; - glEnable(GL_DEPTH_TEST); - } - - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - // Release shader - glUseProgram(0); - - m_selectionDirty = false; } void Scatter3DRenderer::updateSelectedItem(int index, const QScatter3DSeries *series) @@ -1735,16 +1772,30 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, QAbstract3DSeries *&series) { if (color != selectionSkipColor) { - index = int(color.x()) - + (int(color.y()) << 8) - + (int(color.z()) << 16); - // Find the series and adjust the index accordingly - for (int i = 0; i < m_renderingArrays.size(); i++) { - if (index < m_renderingArrays.at(i).size()) { - series = m_visibleSeriesList.at(i).series(); - return; // Valid found and already set to return parameters, so we can return - } else { - index -= m_renderingArrays.at(i).size(); + if (color.w() == labelRowAlpha) { + // Row selection + index = Scatter3DController::invalidSelectionIndex(); + // TODO: Pass label clicked info to input handler (implement in part 2) + } else if (color.w() == labelColumnAlpha) { + // Column selection + index = Scatter3DController::invalidSelectionIndex(); + // TODO: Pass label clicked info to input handler (implement in part 2) + } else if (color.w() == labelValueAlpha) { + // Value selection + index = Scatter3DController::invalidSelectionIndex(); + // TODO: Pass label clicked info to input handler (implement in part 2) + } else { + index = int(color.x()) + + (int(color.y()) << 8) + + (int(color.z()) << 16); + // Find the series and adjust the index accordingly + for (int i = 0; i < m_renderingArrays.size(); i++) { + if (index < m_renderingArrays.at(i).size()) { + series = m_visibleSeriesList.at(i).series(); + return; // Valid found and already set to return parameters, so we can return + } else { + index -= m_renderingArrays.at(i).size(); + } } } } diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 62a8de73..8b4d0759 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -121,6 +121,8 @@ private: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void drawScene(GLuint defaultFboHandle); + void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); void loadBackgroundMesh(); void loadLabelMesh(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 0f9a3f10..fc31cd40 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -42,11 +42,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. const GLfloat backgroundMargin = 1.1f; // Margin for background (1.10 make it 10% larger to avoid - // selection ball being drawn inside background) + // selection ball being drawn inside background) const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; const GLfloat sliceZScale = 0.1f; const GLfloat sliceUnits = 2.5f; +const uint alphaMultiplier = 16777216; Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) : Abstract3DRenderer(controller), @@ -1201,6 +1202,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) cache->selectionTexture()); } } + drawLabels(true, activeCamera, viewMatrix, projectionMatrix); glEnable(GL_DITHER); @@ -1212,7 +1214,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Put the RGBA value back to uint #if !defined(QT_OPENGL_ES_2) - uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * 16777216; + uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * alphaMultiplier; #else uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536; #endif @@ -1729,11 +1731,61 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - // Draw axis labels - m_labelShader->bind(); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); + + // Release shader + glUseProgram(0); + + // Selection handling + if (m_selectionDirty || m_selectionLabelDirty) { + QPoint visiblePoint = Surface3DController::invalidSelectionPosition(); + if (m_selectedSeries) { + SurfaceSeriesRenderCache *cache = + m_renderCacheList.value(const_cast(m_selectedSeries)); + if (cache && m_selectedPoint != Surface3DController::invalidSelectionPosition()) { + const QRect &sampleSpace = cache->sampleSpace(); + int x = m_selectedPoint.x() - sampleSpace.y(); + int y = m_selectedPoint.y() - sampleSpace.x(); + if (x >= 0 && y >= 0 && x < sampleSpace.height() && y < sampleSpace.width() + && cache->dataArray().size()) { + visiblePoint = QPoint(x, y); + } + } + } + + if (m_cachedSelectionMode == QAbstract3DGraph::SelectionNone + || visiblePoint == Surface3DController::invalidSelectionPosition()) { + m_selectionActive = false; + } else { + if (m_cachedIsSlicingActivated) + updateSliceDataModel(visiblePoint); + if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem)) + surfacePointSelected(visiblePoint); + m_selectionActive = true; + } + + m_selectionDirty = false; + } +} + +void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix) { + ShaderHelper *shader = 0; + GLfloat alphaForValueSelection = labelValueAlpha / 255.0f; + GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; + GLfloat alphaForColumnSelection = labelColumnAlpha / 255.0f; + if (drawSelection) { + shader = m_surfaceGridShader; + } else { + shader = m_labelShader; + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + shader->bind(); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_OFFSET_FILL); // Z Labels @@ -1771,9 +1823,15 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); + if (drawSelection) { + QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, + alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, rotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } labelNbr++; @@ -1814,9 +1872,15 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_dummyRenderItem.setTranslation(labelTrans); const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); + } + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, rotation, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } labelNbr++; @@ -1871,12 +1935,18 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); + } + // Back wall labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, labelRotateVectorBack, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignmentBack); // Side wall @@ -1884,7 +1954,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, labelRotateVectorSide, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignmentSide); } labelNbr++; @@ -1892,41 +1962,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } glDisable(GL_POLYGON_OFFSET_FILL); - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - - // Release shader - glUseProgram(0); - - // Selection handling - if (m_selectionDirty || m_selectionLabelDirty) { - QPoint visiblePoint = Surface3DController::invalidSelectionPosition(); - if (m_selectedSeries) { - SurfaceSeriesRenderCache *cache = - m_renderCacheList.value(const_cast(m_selectedSeries)); - if (cache && m_selectedPoint != Surface3DController::invalidSelectionPosition()) { - const QRect &sampleSpace = cache->sampleSpace(); - int x = m_selectedPoint.x() - sampleSpace.y(); - int y = m_selectedPoint.y() - sampleSpace.x(); - if (x >= 0 && y >= 0 && x < sampleSpace.height() && y < sampleSpace.width() - && cache->dataArray().size()) { - visiblePoint = QPoint(x, y); - } - } - } - - if (m_cachedSelectionMode == QAbstract3DGraph::SelectionNone - || visiblePoint == Surface3DController::invalidSelectionPosition()) { - m_selectionActive = false; - } else { - if (m_cachedIsSlicingActivated) - updateSliceDataModel(visiblePoint); - if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem)) - surfacePointSelected(visiblePoint); - m_selectionActive = true; - } - - m_selectionDirty = false; + if (!drawSelection) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); } } @@ -2202,6 +2240,27 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co // Maps selection Id to surface point in data array QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { +#if 0 // TODO: Implement fully in part 2 + // Check for label selection + if (id / alphaMultiplier == labelRowAlpha) { + int row = id - (labelRowAlpha * alphaMultiplier); + qDebug() << "row label" << row; + // TODO: Pass label clicked info to input handler + return Surface3DController::invalidSelectionPosition(); + } else if (id / alphaMultiplier == labelColumnAlpha) { + int column = (id - (labelColumnAlpha * alphaMultiplier)) / 256; + qDebug() << "column label" << column; + // TODO: Pass label clicked info to input handler + return Surface3DController::invalidSelectionPosition(); + } else if (id / alphaMultiplier == labelValueAlpha) { + int value = (id - (labelValueAlpha * alphaMultiplier)) / 65536; + qDebug() << "value label" << value; + // TODO: Pass label clicked info to input handler + return Surface3DController::invalidSelectionPosition(); + } +#endif + + // Not a label selection SurfaceSeriesRenderCache *selectedCache = 0; foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { if (cache->isWithinIdRange(id)) { @@ -2373,7 +2432,7 @@ void Surface3DRenderer::initShaders(const QString &vertexShader, const QString & m_surfaceSliceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentSurface")); m_surfaceSliceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), - QStringLiteral(":/shaders/fragmentSurfaceFlat")); + QStringLiteral(":/shaders/fragmentSurfaceFlat")); #else m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentSurfaceES2")); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 9fd5d0d9..7a3b279f 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -144,6 +144,8 @@ private: void loadBackgroundMesh(); void loadLabelMesh(); void drawScene(GLuint defaultFboHandle); + void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); void calculateSceneScalingFactors(); void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader); void initLabelShaders(const QString &vertexShader, const QString &fragmentShader); diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h index ff658be3..f0a4f469 100644 --- a/src/datavisualization/global/datavisualizationglobal_p.h +++ b/src/datavisualization/global/datavisualizationglobal_p.h @@ -60,6 +60,7 @@ static const QQuaternion identityQuaternion; static const QVector4D selectionSkipColor = QVector4D(255.0f, 255.0f, 255.0f, 255.0f); static const QVector4D invalidColorVector = QVector4D(-1.0f, -1.0f, -1.0f, -1.0f); static const GLfloat itemAlpha = 0.0f; +static const GLfloat labelValueAlpha = 253.0f; static const GLfloat labelRowAlpha = 254.0f; static const GLfloat labelColumnAlpha = 255.0f; static const GLfloat gradientTextureHeight = 1024.0f; -- cgit v1.2.3 From aaf51bfad10e0eac7a8ee64e36aab5f0c1119468 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 2 Apr 2014 12:16:05 +0300 Subject: Enable querying selection label via API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also enable suppressing drawing the label on graph. Selection label formatting was consequently moved from renderers to series. Task-number: QTRD-2896 Change-Id: Ia6a1a40298d8db0f54349de3eb27fb0b683dd302 Reviewed-by: Tomi Korpipää --- .../qmlaxisformatter/customformatter.cpp | 1 + .../qmloscilloscope/datasource.cpp | 23 ---- .../datavisualization/qmloscilloscope/datasource.h | 3 - .../qmloscilloscope/doc/src/qmloscilloscope.qdoc | 15 +-- .../qmloscilloscope/qml/qmloscilloscope/main.qml | 31 ++--- src/datavisualization/axis/qvalue3daxisformatter.h | 3 + src/datavisualization/data/qabstract3dseries.cpp | 101 +++++++++++++-- src/datavisualization/data/qabstract3dseries.h | 8 ++ src/datavisualization/data/qabstract3dseries_p.h | 18 ++- src/datavisualization/data/qbar3dseries.cpp | 51 ++++++++ src/datavisualization/data/qbar3dseries_p.h | 1 + src/datavisualization/data/qscatter3dseries.cpp | 45 +++++++ src/datavisualization/data/qscatter3dseries_p.h | 1 + src/datavisualization/data/qsurface3dseries.cpp | 45 +++++++ src/datavisualization/data/qsurface3dseries_p.h | 1 + .../engine/abstract3dcontroller.cpp | 12 ++ .../engine/abstract3dcontroller_p.h | 2 + .../engine/abstract3drenderer.cpp | 8 +- src/datavisualization/engine/bars3dcontroller.cpp | 3 + src/datavisualization/engine/bars3drenderer.cpp | 136 +++++++++------------ src/datavisualization/engine/bars3drenderer_p.h | 4 +- .../engine/scatter3dcontroller.cpp | 2 + src/datavisualization/engine/scatter3drenderer.cpp | 47 +++---- src/datavisualization/engine/seriesrendercache.cpp | 17 ++- src/datavisualization/engine/seriesrendercache_p.h | 4 +- .../engine/surface3dcontroller.cpp | 7 ++ src/datavisualization/engine/surface3drenderer.cpp | 65 +++------- src/datavisualization/engine/surface3drenderer_p.h | 1 - .../datavisualizationqml2_plugin.cpp | 4 + tests/barstest/main.cpp | 2 +- 30 files changed, 414 insertions(+), 247 deletions(-) diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.cpp b/examples/datavisualization/qmlaxisformatter/customformatter.cpp index eeea0451..4a52d273 100644 --- a/examples/datavisualization/qmlaxisformatter/customformatter.cpp +++ b/examples/datavisualization/qmlaxisformatter/customformatter.cpp @@ -142,6 +142,7 @@ void CustomFormatter::setSelectionFormat(const QString &format) { if (m_selectionFormat != format) { m_selectionFormat = format; + markDirty(true); // Necessary to regenerate already visible selection label emit selectionFormatChanged(format); } } diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmloscilloscope/datasource.cpp index 01d7e73d..40ebd962 100644 --- a/examples/datavisualization/qmloscilloscope/datasource.cpp +++ b/examples/datavisualization/qmloscilloscope/datasource.cpp @@ -138,29 +138,6 @@ void DataSource::update(QSurface3DSeries *series) } //! [1] -//! [2] -QString DataSource::selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX, - QValue3DAxis *axisY, QValue3DAxis *axisZ) -{ - QString label; - - if (series && series->selectedPoint() != QSurface3DSeries::invalidSelectionPosition()) { - const QSurfaceDataItem *item = series->dataProxy()->itemAt(series->selectedPoint()); - QString x; - QString y; - QString z; - x.sprintf(axisX->labelFormat().toUtf8().constData(), int(item->x())); - y.sprintf(axisY->labelFormat().toUtf8().constData(), int(item->y())); - z.sprintf(axisZ->labelFormat().toUtf8().constData(), int(item->z())); - label = QStringLiteral("%1, %3: %2").arg(x).arg(y).arg(z); - } else { - label = QStringLiteral("No selection"); - } - - return label; -} -//! [2] - void DataSource::clearData() { for (int i(0); i < m_data.size(); i++) { diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h index 4f210269..76ba7c9c 100644 --- a/examples/datavisualization/qmloscilloscope/datasource.h +++ b/examples/datavisualization/qmloscilloscope/datasource.h @@ -37,9 +37,6 @@ public slots: float xMin, float xMax, float yMin, float yMax, float zMin, float zMax); void update(QSurface3DSeries *series); - - QString selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX, - QValue3DAxis *axisY, QValue3DAxis *axisZ); //! [0] private: void clearData(); diff --git a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc index c574950b..93bd5c30 100644 --- a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc +++ b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc @@ -59,11 +59,6 @@ we still need to call QSurfaceDataProxy::resetArray() after changing the data in it to prompt the graph to render the data. - The final method, \c selectionLabel(), is used to generate a label string we can show on the - QML ui. This method utilizes the axis formats to format the label: - - \snippet qmloscilloscope/datasource.cpp 2 - To be able to access the \c DataSource methods from QML, we need to expose it. We do this by defining a context property in application main: @@ -86,15 +81,11 @@ One interesting detail is that we don't specify a proxy for the Surface3DSeries we attach to the graph. This makes the series to utilize the default QSurfaceDataProxy. - We also specify an empty string for \l{Abstract3DSeries::itemLabelFormat}{itemLabelFormat}, since we want to display - the selected item information in a \c Text element instead of a label above the selection pointer. + We also hide the item label with \l{Abstract3DSeries::itemLabelVisible}{itemLabelFormat}, since + we want to display the selected item information in a \c Text element instead of a floating + label above the selection pointer. This is done because the selection pointer moves around a lot as the data changes, which makes the regular selection label difficult to read. - When selection point changes, we update the label text using a helper function - \c updateSelectionLabel(), which calls one of the methods we defined for our \c DataSource class - to obtain the label: - - \snippet qmloscilloscope/qml/qmloscilloscope/main.qml 1 We initialize the \c DataSource cache when the graph is complete by calling a helper function \c generateData(), which calls the method with the same name on the \c DataSource: diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml index 81884154..5f5bfe1a 100644 --- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml +++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml @@ -19,7 +19,7 @@ import QtQuick 2.1 import QtQuick.Layouts 1.0 import QtQuick.Controls 1.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 import "." Item { @@ -72,9 +72,8 @@ Item { drawMode: Surface3DSeries.DrawSurface; flatShadingEnabled: false; meshSmooth: true - itemLabelFormat: "" - - onSelectedPointChanged: mainView.updateSelectionLabel() + itemLabelFormat: "@xLabel, @zLabel: @yLabel" + itemLabelVisible: false } //! [0] @@ -90,10 +89,7 @@ Item { interval: 1000 / frequencySlider.value running: true repeat: true - onTriggered: { - dataSource.update(surfaceSeries) - mainView.updateSelectionLabel() - } + onTriggered: dataSource.update(surfaceSeries) } //! [3] @@ -218,10 +214,18 @@ Item { Text { id: selectionText - text: "No selection" anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter + + Binding on text { + when: surfaceSeries.itemLabel.length + value: surfaceSeries.itemLabel + } + Binding on text { + when: !surfaceSeries.itemLabel.length + value: "No selection" + } } } } @@ -285,15 +289,6 @@ Item { } - //! [1] - function updateSelectionLabel() { - selectionText.text = dataSource.selectionLabel(surfaceSeries, - surfaceGraph.axisX, - surfaceGraph.axisY, - surfaceGraph.axisZ) - } - //! [1] - //! [4] function generateData() { dataSource.generateData(mainView.sampleCache, mainView.sampleRows, diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h index 5ecc798d..c7b0bac5 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.h +++ b/src/datavisualization/axis/qvalue3daxisformatter.h @@ -76,6 +76,9 @@ private: friend class QValue3DAxis; friend class QValue3DAxisPrivate; friend class AxisRenderCache; + friend class QBar3DSeriesPrivate; + friend class QScatter3DSeriesPrivate; + friend class QSurface3DSeriesPrivate; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 802a4e8e..934fad16 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -240,6 +240,25 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \sa itemLabelFormat */ +/*! + * \qmlproperty string Abstract3DSeries::itemLabel + * + * Contains the formatted item label. If there is no selected item or the selected item is not + * visible, returns an empty string. + * + * \sa itemLabelFormat + */ + +/*! + * \qmlproperty bool Abstract3DSeries::itemLabelVisible + * + * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not + * drawn. If you prefer to show the item label in an external control, set this property to + * \c false. Defaults to \c true. + * + * \sa itemLabelFormat, itemLabel + */ + /*! * \qmlmethod void Abstract3DSeries::setMeshAxisAndAngle(vector3d axis, real angle) * @@ -587,6 +606,41 @@ QString QAbstract3DSeries::name() const return d_ptr->m_name; } +/*! + * \property QAbstract3DSeries::itemLabel + * + * Contains the formatted item label. If there is no selected item or the selected item is not + * visible, returns an empty string. + * + * \sa itemLabelFormat + */ +QString QAbstract3DSeries::itemLabel() const +{ + return d_ptr->itemLabel(); +} + +/*! + * \property QAbstract3DSeries::itemLabelVisible + * + * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not + * drawn. If you prefer to show the item label in an external control, set this property to + * \c false. Defaults to \c true. + * + * \sa itemLabelFormat, itemLabel + */ +void QAbstract3DSeries::setItemLabelVisible(bool visible) +{ + if (d_ptr->m_itemLabelVisible != visible) { + d_ptr->setItemLabelVisible(visible); + emit itemLabelVisibilityChanged(visible); + } +} + +bool QAbstract3DSeries::isItemLabelVisible() const +{ + return d_ptr->m_itemLabelVisible; +} + // QAbstract3DSeriesPrivate QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type) @@ -598,7 +652,9 @@ QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstra m_controller(0), m_mesh(QAbstract3DSeries::MeshCube), m_meshSmooth(false), - m_colorStyle(Q3DTheme::ColorStyleUniform) + m_colorStyle(Q3DTheme::ColorStyleUniform), + m_itemLabelDirty(true), + m_itemLabelVisible(true) { } @@ -631,21 +687,19 @@ void QAbstract3DSeriesPrivate::setController(Abstract3DController *controller) connectControllerAndProxy(controller); m_controller = controller; q_ptr->setParent(controller); + markItemLabelDirty(); } void QAbstract3DSeriesPrivate::setItemLabelFormat(const QString &format) { m_itemLabelFormat = format; - m_changeTracker.itemLabelFormatChanged = true; - if (m_controller) - m_controller->markSeriesVisualsDirty(); + markItemLabelDirty(); } void QAbstract3DSeriesPrivate::setVisible(bool visible) { m_visible = visible; - if (m_controller) - m_controller->markSeriesVisualsDirty(); + markItemLabelDirty(); } void QAbstract3DSeriesPrivate::setMesh(QAbstract3DSeries::Mesh mesh) @@ -739,9 +793,8 @@ void QAbstract3DSeriesPrivate::setMultiHighlightGradient(const QLinearGradient & void QAbstract3DSeriesPrivate::setName(const QString &name) { m_name = name; + markItemLabelDirty(); m_changeTracker.nameChanged = true; - if (m_controller) - m_controller->markSeriesVisualsDirty(); } void QAbstract3DSeriesPrivate::resetToTheme(const Q3DTheme &theme, int seriesIndex, bool force) @@ -781,4 +834,36 @@ void QAbstract3DSeriesPrivate::resetToTheme(const Q3DTheme &theme, int seriesInd } } +QString QAbstract3DSeriesPrivate::itemLabel() +{ + if (m_itemLabelDirty) { + QString oldLabel = m_itemLabel; + if (m_controller && m_visible) + createItemLabel(); + else + m_itemLabel = QString(); + m_itemLabelDirty = false; + + if (oldLabel != m_itemLabel) + emit q_ptr->itemLabelChanged(m_itemLabel); + } + + return m_itemLabel; +} + +void QAbstract3DSeriesPrivate::markItemLabelDirty() +{ + m_itemLabelDirty = true; + m_changeTracker.itemLabelChanged = true; + if (m_controller) + m_controller->markSeriesVisualsDirty(); +} + +void QAbstract3DSeriesPrivate::setItemLabelVisible(bool visible) +{ + m_itemLabelVisible = visible; + markItemLabelDirty(); + m_changeTracker.itemLabelVisibilityChanged = true; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h index bf56422f..55254904 100644 --- a/src/datavisualization/data/qabstract3dseries.h +++ b/src/datavisualization/data/qabstract3dseries.h @@ -50,6 +50,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DSeries : public QObject Q_PROPERTY(QColor multiHighlightColor READ multiHighlightColor WRITE setMultiHighlightColor NOTIFY multiHighlightColorChanged) Q_PROPERTY(QLinearGradient multiHighlightGradient READ multiHighlightGradient WRITE setMultiHighlightGradient NOTIFY multiHighlightGradientChanged) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString itemLabel READ itemLabel NOTIFY itemLabelChanged REVISION 1) + Q_PROPERTY(bool itemLabelVisible READ isItemLabelVisible WRITE setItemLabelVisible NOTIFY itemLabelVisibilityChanged REVISION 1) public: enum SeriesType { @@ -119,6 +121,10 @@ public: void setName(const QString &name); QString name() const; + QString itemLabel() const; + void setItemLabelVisible(bool visible); + bool isItemLabelVisible() const; + signals: void itemLabelFormatChanged(const QString &format); void visibilityChanged(bool visible); @@ -134,6 +140,8 @@ signals: void multiHighlightColorChanged(const QColor &color); void multiHighlightGradientChanged(const QLinearGradient &gradient); void nameChanged(const QString &name); + void itemLabelChanged(const QString &label); + void itemLabelVisibilityChanged(bool visible); protected: QScopedPointer d_ptr; diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h index a803e99b..530afe5e 100644 --- a/src/datavisualization/data/qabstract3dseries_p.h +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -38,7 +38,6 @@ class QAbstractDataProxy; class Abstract3DController; struct QAbstract3DSeriesChangeBitField { - bool itemLabelFormatChanged : 1; bool meshChanged : 1; bool meshSmoothChanged : 1; bool meshRotationChanged : 1; @@ -51,10 +50,11 @@ struct QAbstract3DSeriesChangeBitField { bool multiHighlightColorChanged : 1; bool multiHighlightGradientChanged : 1; bool nameChanged : 1; + bool itemLabelChanged : 1; + bool itemLabelVisibilityChanged : 1; QAbstract3DSeriesChangeBitField() - : itemLabelFormatChanged(true), - meshChanged(true), + : meshChanged(true), meshSmoothChanged(true), meshRotationChanged(true), userDefinedMeshChanged(true), @@ -65,7 +65,9 @@ struct QAbstract3DSeriesChangeBitField { singleHighlightGradientChanged(true), multiHighlightColorChanged(true), multiHighlightGradientChanged(true), - nameChanged(true) + nameChanged(true), + itemLabelChanged(true), + itemLabelVisibilityChanged(true) { } }; @@ -102,6 +104,7 @@ public: virtual void setDataProxy(QAbstractDataProxy *proxy); virtual void setController(Abstract3DController *controller); virtual void connectControllerAndProxy(Abstract3DController *newController) = 0; + virtual void createItemLabel() = 0; void setItemLabelFormat(const QString &format); void setVisible(bool visible); @@ -120,6 +123,10 @@ public: void setName(const QString &name); void resetToTheme(const Q3DTheme &theme, int seriesIndex, bool force); + QString itemLabel(); + void markItemLabelDirty(); + inline bool itemLabelDirty() const { return m_itemLabelDirty; } + void setItemLabelVisible(bool visible); QAbstract3DSeriesChangeBitField m_changeTracker; QAbstract3DSeriesThemeOverrideBitField m_themeTracker; @@ -143,6 +150,9 @@ public: QLinearGradient m_multiHighlightGradient; QString m_name; + QString m_itemLabel; + bool m_itemLabelDirty; + bool m_itemLabelVisible; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp index ed4ffaba..8a05100f 100644 --- a/src/datavisualization/data/qbar3dseries.cpp +++ b/src/datavisualization/data/qbar3dseries.cpp @@ -317,6 +317,56 @@ void QBar3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *newCon } } +void QBar3DSeriesPrivate::createItemLabel() +{ + static const QString rowIndexTag(QStringLiteral("@rowIdx")); + static const QString rowLabelTag(QStringLiteral("@rowLabel")); + static const QString rowTitleTag(QStringLiteral("@rowTitle")); + static const QString colIndexTag(QStringLiteral("@colIdx")); + static const QString colLabelTag(QStringLiteral("@colLabel")); + static const QString colTitleTag(QStringLiteral("@colTitle")); + static const QString valueTitleTag(QStringLiteral("@valueTitle")); + static const QString valueLabelTag(QStringLiteral("@valueLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); + + if (m_selectedBar == QBar3DSeries::invalidSelectionPosition()) { + m_itemLabel = QString(); + return; + } + + QCategory3DAxis *categoryAxisZ = static_cast(m_controller->axisZ()); + QCategory3DAxis *categoryAxisX = static_cast(m_controller->axisX()); + QValue3DAxis *valueAxis = static_cast(m_controller->axisY()); + qreal selectedBarValue = qreal(qptr()->dataProxy()->itemAt(m_selectedBar)->value()); + + // Custom format expects printf format specifier. There is no tag for it. + m_itemLabel = valueAxis->formatter()->stringForValue(selectedBarValue, m_itemLabelFormat); + + int selBarPosRow = m_selectedBar.x(); + int selBarPosCol = m_selectedBar.y(); + m_itemLabel.replace(rowIndexTag, QString::number(selBarPosRow)); + if (categoryAxisZ->labels().size() > selBarPosRow) + m_itemLabel.replace(rowLabelTag, categoryAxisZ->labels().at(selBarPosRow)); + else + m_itemLabel.replace(rowLabelTag, QString()); + m_itemLabel.replace(rowTitleTag, categoryAxisZ->title()); + m_itemLabel.replace(colIndexTag, QString::number(selBarPosCol)); + if (categoryAxisX->labels().size() > selBarPosCol) + m_itemLabel.replace(colLabelTag, categoryAxisX->labels().at(selBarPosCol)); + else + m_itemLabel.replace(colLabelTag, QString()); + m_itemLabel.replace(colTitleTag, categoryAxisX->title()); + m_itemLabel.replace(valueTitleTag, valueAxis->title()); + + if (m_itemLabel.contains(valueLabelTag)) { + QString valueLabelText = valueAxis->formatter()->stringForValue(selectedBarValue, + valueAxis->labelFormat()); + m_itemLabel.replace(valueLabelTag, valueLabelText); + } + + m_itemLabel.replace(seriesNameTag, m_name); +} + void QBar3DSeriesPrivate::handleMeshRotationChanged(const QQuaternion &rotation) { emit qptr()->meshAngleChanged(quaternionAngle(rotation)); @@ -325,6 +375,7 @@ void QBar3DSeriesPrivate::handleMeshRotationChanged(const QQuaternion &rotation) void QBar3DSeriesPrivate::setSelectedBar(const QPoint &position) { if (position != m_selectedBar) { + markItemLabelDirty(); m_selectedBar = position; emit qptr()->selectedBarChanged(m_selectedBar); } diff --git a/src/datavisualization/data/qbar3dseries_p.h b/src/datavisualization/data/qbar3dseries_p.h index 718f1237..c5b51108 100644 --- a/src/datavisualization/data/qbar3dseries_p.h +++ b/src/datavisualization/data/qbar3dseries_p.h @@ -43,6 +43,7 @@ public: virtual void setDataProxy(QAbstractDataProxy *proxy); virtual void connectControllerAndProxy(Abstract3DController *newController); + virtual void createItemLabel(); void handleMeshRotationChanged(const QQuaternion &rotation); diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp index 43bde4dd..f4509ae4 100644 --- a/src/datavisualization/data/qscatter3dseries.cpp +++ b/src/datavisualization/data/qscatter3dseries.cpp @@ -298,9 +298,54 @@ void QScatter3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne } } +void QScatter3DSeriesPrivate::createItemLabel() +{ + static const QString xTitleTag(QStringLiteral("@xTitle")); + static const QString yTitleTag(QStringLiteral("@yTitle")); + static const QString zTitleTag(QStringLiteral("@zTitle")); + static const QString xLabelTag(QStringLiteral("@xLabel")); + static const QString yLabelTag(QStringLiteral("@yLabel")); + static const QString zLabelTag(QStringLiteral("@zLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); + + if (m_selectedItem == QScatter3DSeries::invalidSelectionIndex()) { + m_itemLabel = QString(); + return; + } + + QValue3DAxis *axisX = static_cast(m_controller->axisX()); + QValue3DAxis *axisY = static_cast(m_controller->axisY()); + QValue3DAxis *axisZ = static_cast(m_controller->axisZ()); + QVector3D selectedPosition = qptr()->dataProxy()->itemAt(m_selectedItem)->position(); + + m_itemLabel = m_itemLabelFormat; + + m_itemLabel.replace(xTitleTag, axisX->title()); + m_itemLabel.replace(yTitleTag, axisY->title()); + m_itemLabel.replace(zTitleTag, axisZ->title()); + + if (m_itemLabel.contains(xLabelTag)) { + QString valueLabelText = axisX->formatter()->stringForValue( + qreal(selectedPosition.x()), axisX->labelFormat()); + m_itemLabel.replace(xLabelTag, valueLabelText); + } + if (m_itemLabel.contains(yLabelTag)) { + QString valueLabelText = axisY->formatter()->stringForValue( + qreal(selectedPosition.y()), axisY->labelFormat()); + m_itemLabel.replace(yLabelTag, valueLabelText); + } + if (m_itemLabel.contains(zLabelTag)) { + QString valueLabelText = axisZ->formatter()->stringForValue( + qreal(selectedPosition.z()), axisZ->labelFormat()); + m_itemLabel.replace(zLabelTag, valueLabelText); + } + m_itemLabel.replace(seriesNameTag, m_name); +} + void QScatter3DSeriesPrivate::setSelectedItem(int index) { if (index != m_selectedItem) { + markItemLabelDirty(); m_selectedItem = index; emit qptr()->selectedItemChanged(m_selectedItem); } diff --git a/src/datavisualization/data/qscatter3dseries_p.h b/src/datavisualization/data/qscatter3dseries_p.h index 1abbd406..8717a616 100644 --- a/src/datavisualization/data/qscatter3dseries_p.h +++ b/src/datavisualization/data/qscatter3dseries_p.h @@ -43,6 +43,7 @@ public: virtual void setDataProxy(QAbstractDataProxy *proxy); virtual void connectControllerAndProxy(Abstract3DController *newController); + virtual void createItemLabel(); void setSelectedItem(int index); void setItemSize(float size); diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index 72967bae..60e84f38 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -373,9 +373,54 @@ void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne } } +void QSurface3DSeriesPrivate::createItemLabel() +{ + static const QString xTitleTag(QStringLiteral("@xTitle")); + static const QString yTitleTag(QStringLiteral("@yTitle")); + static const QString zTitleTag(QStringLiteral("@zTitle")); + static const QString xLabelTag(QStringLiteral("@xLabel")); + static const QString yLabelTag(QStringLiteral("@yLabel")); + static const QString zLabelTag(QStringLiteral("@zLabel")); + static const QString seriesNameTag(QStringLiteral("@seriesName")); + + if (m_selectedPoint == QSurface3DSeries::invalidSelectionPosition()) { + m_itemLabel = QString(); + return; + } + + QValue3DAxis *axisX = static_cast(m_controller->axisX()); + QValue3DAxis *axisY = static_cast(m_controller->axisY()); + QValue3DAxis *axisZ = static_cast(m_controller->axisZ()); + QVector3D selectedPosition = qptr()->dataProxy()->itemAt(m_selectedPoint)->position(); + + m_itemLabel = m_itemLabelFormat; + + m_itemLabel.replace(xTitleTag, axisX->title()); + m_itemLabel.replace(yTitleTag, axisY->title()); + m_itemLabel.replace(zTitleTag, axisZ->title()); + + if (m_itemLabel.contains(xLabelTag)) { + QString valueLabelText = axisX->formatter()->stringForValue( + qreal(selectedPosition.x()), axisX->labelFormat()); + m_itemLabel.replace(xLabelTag, valueLabelText); + } + if (m_itemLabel.contains(yLabelTag)) { + QString valueLabelText = axisY->formatter()->stringForValue( + qreal(selectedPosition.y()), axisY->labelFormat()); + m_itemLabel.replace(yLabelTag, valueLabelText); + } + if (m_itemLabel.contains(zLabelTag)) { + QString valueLabelText = axisZ->formatter()->stringForValue( + qreal(selectedPosition.z()), axisZ->labelFormat()); + m_itemLabel.replace(zLabelTag, valueLabelText); + } + m_itemLabel.replace(seriesNameTag, m_name); +} + void QSurface3DSeriesPrivate::setSelectedPoint(const QPoint &position) { if (position != m_selectedPoint) { + markItemLabelDirty(); m_selectedPoint = position; emit qptr()->selectedPointChanged(m_selectedPoint); } diff --git a/src/datavisualization/data/qsurface3dseries_p.h b/src/datavisualization/data/qsurface3dseries_p.h index bc8157bd..d4cc2820 100644 --- a/src/datavisualization/data/qsurface3dseries_p.h +++ b/src/datavisualization/data/qsurface3dseries_p.h @@ -43,6 +43,7 @@ public: virtual void setDataProxy(QAbstractDataProxy *proxy); virtual void connectControllerAndProxy(Abstract3DController *newController); + virtual void createItemLabel(); void setSelectedPoint(const QPoint &position); void setFlatShadingEnabled(bool enabled); diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 7f905243..8c94a9a4 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -783,6 +783,8 @@ Q3DScene *Abstract3DController::scene() void Abstract3DController::markDataDirty() { m_isDataDirty = true; + + markSeriesItemLabelsDirty(); emitNeedRender(); } @@ -813,6 +815,8 @@ void Abstract3DController::handleAxisTitleChangedBySender(QObject *sender) m_changeTracker.axisZTitleChanged = true; else qWarning() << __FUNCTION__ << "invoked for invalid axis"; + + markSeriesItemLabelsDirty(); emitNeedRender(); } @@ -831,6 +835,8 @@ void Abstract3DController::handleAxisLabelsChangedBySender(QObject *sender) m_changeTracker.axisZLabelsChanged = true; else qWarning() << __FUNCTION__ << "invoked for invalid axis"; + + markSeriesItemLabelsDirty(); emitNeedRender(); } @@ -992,6 +998,12 @@ void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender emitNeedRender(); } +void Abstract3DController::markSeriesItemLabelsDirty() +{ + for (int i = 0; i < m_seriesList.size(); i++) + m_seriesList.at(i)->d_ptr->markItemLabelDirty(); +} + void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis *axis, QAbstract3DAxis **axisPtr) { diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 13c334be..e433c97e 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -242,6 +242,8 @@ public: virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; + void markSeriesItemLabelsDirty(); + public slots: void handleAxisTitleChanged(const QString &title); void handleAxisLabelsChanged(); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f0aec0cc..6b3393ab 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -379,14 +379,8 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi visibleCount = 0; } foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) { - // Item selection label may need update - if (current->d_ptr->m_changeTracker.nameChanged - || current->d_ptr->m_changeTracker.itemLabelFormatChanged) { - m_selectionLabelDirty = true; - } + if (current->isVisible()) m_visibleSeriesList[visibleCount++].populate(current, this); - } } } diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 0b2a4834..ec170129 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -106,6 +106,7 @@ void Bars3DController::handleArrayReset() if (series->isVisible()) { adjustAxisRanges(); m_isDataDirty = true; + series->d_ptr->markItemLabelDirty(); } // Clear selection unless still valid setSelectedBar(m_selectedBar, m_selectedBarSeries, false); @@ -132,6 +133,7 @@ void Bars3DController::handleRowsChanged(int startIndex, int count) if (series->isVisible()) { adjustAxisRanges(); m_isDataDirty = true; + series->d_ptr->markItemLabelDirty(); } emitNeedRender(); } @@ -193,6 +195,7 @@ void Bars3DController::handleItemChanged(int rowIndex, int columnIndex) if (series->isVisible()) { adjustAxisRanges(); m_isDataDirty = true; + series->d_ptr->markItemLabelDirty(); } emitNeedRender(); } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 15aa526f..127cfb0e 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -260,6 +260,26 @@ void Bars3DRenderer::updateData() updateSelectedBar(m_selectedBarPos, m_selectedBarSeries); } +void Bars3DRenderer::updateSeries(const QList &seriesList, + bool updateVisibility) +{ + Abstract3DRenderer::updateSeries(seriesList, updateVisibility); + + bool noSelection = true; + int seriesCount = m_visibleSeriesList.size(); + for (int i = 0; i < seriesCount; i++) { + QBar3DSeries *barSeries = static_cast(m_visibleSeriesList.at(i).series()); + if (noSelection + && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition() + && selectionLabel() != m_visibleSeriesList.at(i).itemLabel()) { + m_selectionLabelDirty = true; + noSelection = false; + } + } + if (noSelection && !selectionLabel().isEmpty()) + m_selectionLabelDirty = true; +} + void Bars3DRenderer::updateScene(Q3DScene *scene) { if (m_hasNegativeValues) @@ -1002,7 +1022,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } glCullFace(GL_BACK); drawLabels(true, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, - columnScaleFactor, false, selectedBar); + columnScaleFactor); glEnable(GL_DITHER); // Read color under cursor @@ -1643,7 +1663,41 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } drawLabels(false, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, - columnScaleFactor, barSelectionFound, selectedBar); + columnScaleFactor); + + // Handle selected bar label generation + if (barSelectionFound) { + // Print value of selected bar + glDisable(GL_DEPTH_TEST); + // Draw the selection label + LabelItem &labelItem = selectionLabelItem(); + if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId() + || m_selectionLabelDirty) { + QString labelText = selectionLabel(); + if (labelText.isNull() || m_selectionLabelDirty) { + labelText = m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabel(); + setSelectionLabel(labelText); + m_selectionLabelDirty = false; + } + m_drawer->generateLabelItem(labelItem, labelText); + m_selectedBar = selectedBar; + } + + m_drawer->drawLabel(*selectedBar, labelItem, viewMatrix, projectionMatrix, + zeroVector, zeroVector, selectedBar->height(), + m_cachedSelectionMode, m_labelShader, + m_labelObj, activeCamera, true, false); + + // Reset label update flag; they should have been updated when we get here + m_updateLabels = false; + + glEnable(GL_DEPTH_TEST); + } else { + m_selectedBar = 0; + } + + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); // Release shader glUseProgram(0); @@ -1652,8 +1706,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, - GLfloat rowScaleFactor, GLfloat columnScaleFactor, - bool barSelectionFound, BarRenderItem *selectedBar) { + GLfloat rowScaleFactor, GLfloat columnScaleFactor) { ShaderHelper *shader = 0; GLfloat alphaForValueSelection = labelValueAlpha / 255.0f; GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; @@ -1830,81 +1883,6 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } glDisable(GL_POLYGON_OFFSET_FILL); - - // Handle selected bar label generation - if (barSelectionFound) { - // Print value of selected bar - glDisable(GL_DEPTH_TEST); - // Draw the selection label - LabelItem &labelItem = selectionLabelItem(); - if (m_selectedBar != selectedBar || m_updateLabels || !labelItem.textureId() - || m_selectionLabelDirty) { - QString labelText = selectionLabel(); - if (labelText.isNull() || m_selectionLabelDirty) { - static const QString rowIndexTag(QStringLiteral("@rowIdx")); - static const QString rowLabelTag(QStringLiteral("@rowLabel")); - static const QString rowTitleTag(QStringLiteral("@rowTitle")); - static const QString colIndexTag(QStringLiteral("@colIdx")); - static const QString colLabelTag(QStringLiteral("@colLabel")); - static const QString colTitleTag(QStringLiteral("@colTitle")); - static const QString valueTitleTag(QStringLiteral("@valueTitle")); - static const QString valueLabelTag(QStringLiteral("@valueLabel")); - static const QString seriesNameTag(QStringLiteral("@seriesName")); - - // Custom format expects printf format specifier. There is no tag for it. - labelText = m_axisCacheY.formatter()->stringForValue( - qreal(selectedBar->value()), - m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabelFormat()); - - int selBarPosRow = selectedBar->position().x(); - int selBarPosCol = selectedBar->position().y(); - labelText.replace(rowIndexTag, QString::number(selBarPosRow)); - if (m_axisCacheZ.labels().size() > selBarPosRow) - labelText.replace(rowLabelTag, m_axisCacheZ.labels().at(selBarPosRow)); - else - labelText.replace(rowLabelTag, QString()); - labelText.replace(rowTitleTag, m_axisCacheZ.title()); - labelText.replace(colIndexTag, QString::number(selBarPosCol)); - if (m_axisCacheX.labels().size() > selBarPosCol) - labelText.replace(colLabelTag, m_axisCacheX.labels().at(selBarPosCol)); - else - labelText.replace(colLabelTag, QString()); - labelText.replace(colTitleTag, m_axisCacheX.title()); - labelText.replace(valueTitleTag, m_axisCacheY.title()); - - if (labelText.contains(valueLabelTag)) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(selectedBar->value()), m_axisCacheY.labelFormat()); - labelText.replace(valueLabelTag, valueLabelText); - } - - labelText.replace(seriesNameTag, - m_visibleSeriesList[m_visualSelectedBarSeriesIndex].name()); - - setSelectionLabel(labelText); - m_selectionLabelDirty = false; - } - m_drawer->generateLabelItem(labelItem, labelText); - m_selectedBar = selectedBar; - } - - m_drawer->drawLabel(*selectedBar, labelItem, viewMatrix, projectionMatrix, - zeroVector, zeroVector, selectedBar->height(), - m_cachedSelectionMode, shader, - m_labelObj, activeCamera, true, false); - - // Reset label update flag; they should have been updated when we get here - m_updateLabels = false; - - glEnable(GL_DEPTH_TEST); - } else { - m_selectedBar = 0; - } - - if (!drawSelection) { - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - } } void Bars3DRenderer::updateMultiSeriesScaling(bool uniform) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 3e7e5178..fba5d830 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -114,6 +114,7 @@ public: ~Bars3DRenderer(); void updateData(); + void updateSeries(const QList &seriesList, bool updateVisibility); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); @@ -145,8 +146,7 @@ private: void drawScene(GLuint defaultFboHandle); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, - GLfloat rowScaleFactor, GLfloat columnScaleFactor, - bool barSelectionFound, BarRenderItem *selectedBar); + GLfloat rowScaleFactor, GLfloat columnScaleFactor); void loadBackgroundMesh(); void loadGridLineMesh(); diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index bf283495..a28ee851 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -125,6 +125,7 @@ void Scatter3DController::handleArrayReset() m_isDataDirty = true; } setSelectedItem(m_selectedItem, m_selectedItemSeries); + series->d_ptr->markItemLabelDirty(); emitNeedRender(); } @@ -148,6 +149,7 @@ void Scatter3DController::handleItemsChanged(int startIndex, int count) if (series->isVisible()) { adjustValueAxisRange(); m_isDataDirty = true; + series->d_ptr->markItemLabelDirty(); } emitNeedRender(); } diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index a6633183..43c78137 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -171,18 +171,30 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis if (m_cachedItemSize.size() != seriesCount) m_cachedItemSize.resize(seriesCount); + bool noSelection = true; for (int series = 0; series < seriesCount; series++) { - itemSize = static_cast(m_visibleSeriesList.at(series).series())->itemSize(); + QScatter3DSeries *scatterSeries = + static_cast(m_visibleSeriesList.at(series).series()); + itemSize = scatterSeries->itemSize(); if (maxItemSize < itemSize) maxItemSize = itemSize; if (m_cachedItemSize.at(series) != itemSize) m_cachedItemSize[series] = itemSize; + if (noSelection + && scatterSeries->selectedItem() != QScatter3DSeries::invalidSelectionIndex() + && m_selectionLabel != m_visibleSeriesList.at(series).itemLabel()) { + m_selectionLabelDirty = true; + noSelection = false; + } } m_maxItemSize = maxItemSize; if (maxItemSize > defaultMaxSize) m_backgroundMargin = maxItemSize / itemScaler; else m_backgroundMargin = defaultMaxSize; + + if (noSelection && !selectionLabel().isEmpty()) + m_selectionLabelDirty = true; } void Scatter3DRenderer::updateData() @@ -1251,38 +1263,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) || !labelItem.textureId() || m_selectionLabelDirty) { QString labelText = selectionLabel(); if (labelText.isNull() || m_selectionLabelDirty) { - static const QString xTitleTag(QStringLiteral("@xTitle")); - static const QString yTitleTag(QStringLiteral("@yTitle")); - static const QString zTitleTag(QStringLiteral("@zTitle")); - static const QString xLabelTag(QStringLiteral("@xLabel")); - static const QString yLabelTag(QStringLiteral("@yLabel")); - static const QString zLabelTag(QStringLiteral("@zLabel")); - static const QString seriesNameTag(QStringLiteral("@seriesName")); - - labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabelFormat(); - - labelText.replace(xTitleTag, m_axisCacheX.title()); - labelText.replace(yTitleTag, m_axisCacheY.title()); - labelText.replace(zTitleTag, m_axisCacheZ.title()); - - if (labelText.contains(xLabelTag)) { - QString valueLabelText = m_axisCacheX.formatter()->stringForValue( - qreal(selectedItem->position().x()), m_axisCacheX.labelFormat()); - labelText.replace(xLabelTag, valueLabelText); - } - if (labelText.contains(yLabelTag)) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(selectedItem->position().y()), m_axisCacheY.labelFormat()); - labelText.replace(yLabelTag, valueLabelText); - } - if (labelText.contains(zLabelTag)) { - QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( - qreal(selectedItem->position().z()), m_axisCacheZ.labelFormat()); - labelText.replace(zLabelTag, valueLabelText); - } - labelText.replace(seriesNameTag, - m_visibleSeriesList[m_selectedItemSeriesIndex].name()); - + labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabel(); setSelectionLabel(labelText); m_selectionLabelDirty = false; } diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 8cfd9b08..7e51df1e 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -55,11 +55,6 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * QAbstract3DSeriesChangeBitField &changeTracker = series->d_ptr->m_changeTracker; - if (seriesChanged || changeTracker.itemLabelFormatChanged) { - m_itemLabelFormat = series->itemLabelFormat(); - changeTracker.itemLabelFormatChanged = false; - } - if (seriesChanged || changeTracker.meshChanged || changeTracker.meshSmoothChanged || changeTracker.userDefinedMeshChanged) { m_mesh = series->mesh(); @@ -182,6 +177,18 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * m_name = series->name(); changeTracker.nameChanged = false; } + + if (seriesChanged || changeTracker.itemLabelChanged + || changeTracker.itemLabelVisibilityChanged) { + changeTracker.itemLabelChanged = false; + changeTracker.itemLabelVisibilityChanged = false; + // series->itemLabel() call resolves the item label and emits the changed signal + // if it is dirty, so we need to call it even if m_itemLabel is eventually set + // to an empty string. + m_itemLabel = series->itemLabel(); + if (!series->isItemLabelVisible()) + m_itemLabel = QString(); + } } void SeriesRenderCache::cleanup(TextureHelper *texHelper) diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 1ef67c88..a6ae03cf 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -51,7 +51,6 @@ public: // It is not guaranteed to be valid while rendering and should only be used as an identifier. inline QAbstract3DSeries *series() const { return m_series; } - inline const QString &itemLabelFormat() const { return m_itemLabelFormat; } inline const QAbstract3DSeries::Mesh &mesh() const { return m_mesh; } inline const QQuaternion &meshRotation() const { return m_meshRotation; } inline void setMeshRotation(const QQuaternion &rotation) { m_meshRotation = rotation; } @@ -66,10 +65,10 @@ public: inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; } inline const GLuint &multiHighlightGradientTexture() const { return m_multiHighlightGradientTexture; } inline const QString &name() const { return m_name; } + inline const QString &itemLabel() const { return m_itemLabel; } protected: QAbstract3DSeries *m_series; - QString m_itemLabelFormat; ObjectHelper *m_object; QAbstract3DSeries::Mesh m_mesh; QQuaternion m_meshRotation; @@ -85,6 +84,7 @@ protected: GLuint m_multiHighlightGradientTexture; QString m_name; + QString m_itemLabel; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 42e408dd..2d64e87d 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -297,6 +297,7 @@ void Surface3DController::handleArrayReset() } // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries, false); + series->d_ptr->markItemLabelDirty(); emitNeedRender(); } @@ -321,6 +322,7 @@ void Surface3DController::handleRowsChanged(int startIndex, int count) QSurface3DSeries *series = sender->series(); int oldChangeCount = m_changedRows.size(); + int selectedRow = m_selectedPoint.x(); for (int i = 0; i < count; i++) { bool newItem = true; int candidate = startIndex + i; @@ -334,6 +336,8 @@ void Surface3DController::handleRowsChanged(int startIndex, int count) if (newItem) { ChangeRow newItem = {series, candidate}; m_changedRows.append(newItem); + if (series == m_selectedSeries && selectedRow == candidate) + series->d_ptr->markItemLabelDirty(); } } if (m_changedRows.size()) { @@ -364,6 +368,9 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) m_changedItems.append(newItem); m_changeTracker.itemChanged = true; + if (series == m_selectedSeries && m_selectedPoint == candidate) + series->d_ptr->markItemLabelDirty(); + adjustValueAxisRange(); // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries, false); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index fc31cd40..a3ee0971 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -254,23 +254,25 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) cache->setValid(false); + bool noSelection = true; foreach (QAbstract3DSeries *series, seriesList) { - // Item selection label may need update - if (series->d_ptr->m_changeTracker.nameChanged - || series->d_ptr->m_changeTracker.itemLabelFormatChanged) { - m_selectionLabelDirty = true; - } - QSurface3DSeries *surfaceSeries = static_cast(series); SurfaceSeriesRenderCache *cache = m_renderCacheList.value(surfaceSeries); if (!cache) { cache = new SurfaceSeriesRenderCache(this); m_renderCacheList[surfaceSeries] = cache; - m_selectionTexturesDirty = true; } cache->setValid(true); cache->populate(surfaceSeries, this); + + if (noSelection + && surfaceSeries->selectedPoint() != QSurface3DSeries::invalidSelectionPosition() + && selectionLabel() != cache->itemLabel()) { + m_selectionLabelDirty = true; + noSelection = false; + } + if (cache->isFlatStatusDirty() && cache->sampleSpace().width()) { checkFlatSupport(cache); updateObjects(cache, true); @@ -278,6 +280,9 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis } } + if (noSelection && !selectionLabel().isEmpty()) + m_selectionLabelDirty = true; + // Remove non-valid objects from the cache list foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { if (!cache->isValid()) { @@ -2200,8 +2205,10 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co } QString selectionLabel; - if (label) - selectionLabel = createSelectionLabel(cache, column, row); + if (label) { + m_selectionLabelDirty = false; + selectionLabel = cache->itemLabel(); + } if (m_cachedIsSlicingActivated) { QVector3D subPosFront; @@ -2282,46 +2289,6 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) return QPoint(row, column); } -QString Surface3DRenderer::createSelectionLabel(SurfaceSeriesRenderCache *cache, - int column, int row) -{ - QSurfaceDataArray &dataArray = cache->dataArray(); - QString labelText = cache->itemLabelFormat(); - static const QString xTitleTag(QStringLiteral("@xTitle")); - static const QString yTitleTag(QStringLiteral("@yTitle")); - static const QString zTitleTag(QStringLiteral("@zTitle")); - static const QString xLabelTag(QStringLiteral("@xLabel")); - static const QString yLabelTag(QStringLiteral("@yLabel")); - static const QString zLabelTag(QStringLiteral("@zLabel")); - static const QString seriesNameTag(QStringLiteral("@seriesName")); - - labelText.replace(xTitleTag, m_axisCacheX.title()); - labelText.replace(yTitleTag, m_axisCacheY.title()); - labelText.replace(zTitleTag, m_axisCacheZ.title()); - - if (labelText.contains(xLabelTag)) { - QString valueLabelText = m_axisCacheX.formatter()->stringForValue( - qreal(dataArray.at(row)->at(column).x()), m_axisCacheX.labelFormat()); - labelText.replace(xLabelTag, valueLabelText); - } - if (labelText.contains(yLabelTag)) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(dataArray.at(row)->at(column).y()), m_axisCacheY.labelFormat()); - labelText.replace(yLabelTag, valueLabelText); - } - if (labelText.contains(zLabelTag)) { - QString valueLabelText = m_axisCacheZ.formatter()->stringForValue( - qreal(dataArray.at(row)->at(column).z()), m_axisCacheZ.labelFormat()); - labelText.replace(zLabelTag, valueLabelText); - } - - labelText.replace(seriesNameTag, cache->name()); - - m_selectionLabelDirty = false; - - return labelText; -} - void Surface3DRenderer::updateShadowQuality(QAbstract3DGraph::ShadowQuality quality) { m_cachedShadowQuality = quality; diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 7a3b279f..39e96f55 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -160,7 +160,6 @@ private: void surfacePointSelected(const QPoint &point); void updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point, bool label); QPoint selectionIdToSurfacePoint(uint id); - QString createSelectionLabel(SurfaceSeriesRenderCache *cache, int column, int row); #if !defined(QT_OPENGL_ES_2) void loadGridLineMesh(); void updateDepthBuffer(); diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index e0e427f3..a9b932b4 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -24,6 +24,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) { + // @uri QtDataVisualization + // QtDataVisualization 1.0 qmlRegisterUncreatableType(uri, 1, 0, "AbstractItemModel", @@ -86,6 +88,8 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // New revisions qmlRegisterType(uri, 1, 1, "ValueAxis3D"); + qmlRegisterUncreatableType(uri, 1, 1, "Abstract3DSeries", + QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index f4cd02f7..112e8d4d 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -55,7 +55,7 @@ int main(int argc, char **argv) QSize screenSize = widgetchart->screen()->size(); QWidget *container = QWidget::createWindowContainer(widgetchart); - container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2)); + container->setMinimumSize(QSize(screenSize.width() / 3, screenSize.height() / 3)); container->setMaximumSize(screenSize); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); container->setFocusPolicy(Qt::StrongFocus); -- cgit v1.2.3 From 4633bb2121eb37397c7912ec9d54d7b3ba54d44d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 3 Apr 2014 08:45:03 +0300 Subject: Initialize m_axisCacheY translate properly in bars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If uninitialized, translate never gets set in cases where background adjustment would be zero. Change-Id: I24472febcfc74615d7bfbb33c5c75c4fb5b24a11 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/bars3drenderer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 127cfb0e..9962d9e2 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -96,6 +96,7 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_keepSeriesUniform(false) { m_axisCacheY.setScale(2.0f); + m_axisCacheY.setTranslate(-1.0f); initializeOpenGLFunctions(); initializeOpenGL(); -- cgit v1.2.3 From fdf486f4eb908c4471830b9a8708ebe7333b7bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 3 Apr 2014 12:06:54 +0300 Subject: Axis label dragging support, part 2 Task-number: QTRD-2367 + Added emitting selection signals + Added an example about creating an input handler for axis label dragging - Snapshot for example docs to be taken Change-Id: I641f4feb9e31c32023727b1c7c695324923accc4 Reviewed-by: Miikka Heikkinen --- .../custominput/doc/src/custominput.qdoc | 40 +++--- examples/datavisualization/datavisualization.pro | 3 +- .../draggableaxes/axesinputhandler.cpp | 135 +++++++++++++++++ .../draggableaxes/axesinputhandler.h | 71 +++++++++ examples/datavisualization/draggableaxes/data.cpp | 160 +++++++++++++++++++++ examples/datavisualization/draggableaxes/data.h | 48 +++++++ .../doc/images/draggableaxes-example.png | Bin 0 -> 62422 bytes .../draggableaxes/doc/src/draggableaxes.qdoc | 121 ++++++++++++++++ .../draggableaxes/draggableaxes.pro | 18 +++ examples/datavisualization/draggableaxes/main.cpp | 58 ++++++++ .../engine/abstract3dcontroller.cpp | 6 + .../engine/abstract3dcontroller_p.h | 1 + .../engine/abstract3drenderer.cpp | 1 + .../engine/abstract3drenderer_p.h | 2 + src/datavisualization/engine/bars3dcontroller.cpp | 2 + src/datavisualization/engine/bars3drenderer.cpp | 38 ++--- src/datavisualization/engine/qabstract3dgraph.cpp | 31 ++++ src/datavisualization/engine/qabstract3dgraph.h | 9 ++ .../engine/scatter3dcontroller.cpp | 2 + src/datavisualization/engine/scatter3drenderer.cpp | 8 +- .../engine/surface3dcontroller.cpp | 2 + src/datavisualization/engine/surface3drenderer.cpp | 16 +-- 22 files changed, 723 insertions(+), 49 deletions(-) create mode 100644 examples/datavisualization/draggableaxes/axesinputhandler.cpp create mode 100644 examples/datavisualization/draggableaxes/axesinputhandler.h create mode 100644 examples/datavisualization/draggableaxes/data.cpp create mode 100644 examples/datavisualization/draggableaxes/data.h create mode 100644 examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png create mode 100644 examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc create mode 100644 examples/datavisualization/draggableaxes/draggableaxes.pro create mode 100644 examples/datavisualization/draggableaxes/main.cpp diff --git a/examples/datavisualization/custominput/doc/src/custominput.qdoc b/examples/datavisualization/custominput/doc/src/custominput.qdoc index 59d3c090..46bcdb8d 100644 --- a/examples/datavisualization/custominput/doc/src/custominput.qdoc +++ b/examples/datavisualization/custominput/doc/src/custominput.qdoc @@ -22,49 +22,55 @@ \ingroup qtdatavisualization_examples \brief Implementing custom input handler in a widget application. - The Custom Input example shows how to customize the 3D graph controls in a widget application using a custom graph input handler to capture and process mouse events. - The code in this example shows also how the camera is controlled by using QPropertyAnimation to animate the camera and item selection - is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default - input handler implements. + The Custom Input example shows how to customize the 3D graph controls in a widget application + using a custom graph input handler to capture and process mouse events. + The code in this example shows also how the camera is controlled by using QPropertyAnimation + to animate the camera and item selection is done on mouseover rather than clicking any mouse + buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as + the default input handler implements. \image custominput-example.png \section1 Replacing default input handling - The default input handling mechanism is replaced by setting the active input handler of \l Q3DScatter - to \c CustomInputHandler that implements the custom behavior. + The default input handling mechanism is replaced by setting the active input handler of + Q3DScatter to \c CustomInputHandler that implements the custom behavior. \snippet custominput/scatterdatamodifier.cpp 0 \section1 Implementing custom selection handling - The on mouseover selection handling is implemented in the \c CustomInputHandler that captures the mouse events. - It then stores the last known coordinates to the \l QAbstract3DInputHandler::inputPosition property. + The on mouseover selection handling is implemented in the \c CustomInputHandler that captures + the mouse events. It then stores the last known coordinates to the + QAbstract3DInputHandler::inputPosition property. \snippet custominput/custominputhandler.cpp 0 - As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item - currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving. + As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup + to retrigger selection so that the selection moves to the item currently under the mouse cursor + as the camera animates around the graph even when the mouse cursor is not moving. \snippet custominput/scatterdatamodifier.cpp 1 \section1 Implementing custom zoom handling - The camera has a zoom factor that represents amount of zoom in percentages. In this example the zoom range is limited - between 10% and 500%. This range is then divided to four subranges where \c angleDelta is scaled to different amount of zoom change - based on the current subrange. + The camera has a zoom factor that represents amount of zoom in percentages. In this example the + zoom range is limited between 10% and 500%. This range is then divided to four subranges where + \c angleDelta is scaled to different amount of zoom change based on the current subrange. \snippet custominput/custominputhandler.cpp 1 \section1 Implementing custom camera handling - The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with - a simple QPropertyAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property. + The camera is animated to constantly rotate around the graph with two animations. The rotation + around the graph is done with a simple QPropertyAnimation that just increments during 20 + seconds from 0 degrees to 360 degrees and sets the Q3DCamera::xRotation property. \snippet custominput/scatterdatamodifier.cpp 2 - The camera movement up and down is implemented with a QSequentialAnimationGroup that varies the \l Q3DCamera::yRotation property of the camera - from 5 degrees to 45 degrees and back with in and out easing. + The camera movement up and down is implemented with a QSequentialAnimationGroup that varies + the Q3DCamera::yRotation property of the camera from 5 degrees to 45 degrees and back with in + and out easing. \snippet custominput/scatterdatamodifier.cpp 3 */ diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro index ebb99e93..201a4d82 100644 --- a/examples/datavisualization/datavisualization.pro +++ b/examples/datavisualization/datavisualization.pro @@ -16,7 +16,8 @@ SUBDIRS += qmlbars \ itemmodel \ scatter \ surface \ - rotations + rotations \ + draggableaxes } qtHaveModule(multimedia):!android:!ios: SUBDIRS += audiolevels diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.cpp b/examples/datavisualization/draggableaxes/axesinputhandler.cpp new file mode 100644 index 00000000..70086b1c --- /dev/null +++ b/examples/datavisualization/draggableaxes/axesinputhandler.cpp @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "axesinputhandler.h" +#include + +AxesInputHandler::AxesInputHandler(QAbstract3DGraph *graph, QObject *parent) : + Q3DInputHandler(parent), + m_mousePressed(false), + m_state(StateNormal), + m_axisX(0), + m_axisZ(0), + m_axisY(0), + m_speedModifier(15.0f) +{ + //! [3] + // Connect to the item selection signal from graph + connect(graph, &QAbstract3DGraph::elementSelected, this, + &AxesInputHandler::handleElementSelected); + //! [3] +} + +//! [0] +void AxesInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos) +{ + Q3DInputHandler::mousePressEvent(event, mousePos); + if (Qt::LeftButton == event->button()) + m_mousePressed = true; +} +//! [0] + +//! [2] +void AxesInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos) +{ + //! [5] + // Check if we're trying to drag axis label + if (m_mousePressed && m_state != StateNormal) { + //! [5] + setPreviousInputPos(inputPosition()); + setInputPosition(mousePos); + handleAxisDragging(); + } else { + Q3DInputHandler::mouseMoveEvent(event, mousePos); + } +} +//! [2] + +//! [1] +void AxesInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos) +{ + Q3DInputHandler::mouseReleaseEvent(event, mousePos); + m_mousePressed = false; + m_state = StateNormal; +} +//! [1] + +void AxesInputHandler::handleElementSelected(QAbstract3DGraph::ElementType type) +{ + //! [4] + switch (type) { + case QAbstract3DGraph::ElementAxisXLabel: + m_state = StateDraggingX; + break; + case QAbstract3DGraph::ElementAxisZLabel: + m_state = StateDraggingZ; + break; + case QAbstract3DGraph::ElementAxisYLabel: + m_state = StateDraggingY; + break; + default: + m_state = StateNormal; + break; + } + //! [4] +} + +void AxesInputHandler::handleAxisDragging() +{ + float distance = 0.0f; + + //! [6] + // Get scene orientation from active camera + float xRotation = scene()->activeCamera()->xRotation(); + float yRotation = scene()->activeCamera()->yRotation(); + //! [6] + + //! [7] + // Calculate directional drag multipliers based on rotation + float xMulX = qCos(qDegreesToRadians(xRotation)); + float xMulY = qSin(qDegreesToRadians(xRotation)); + float zMulX = qSin(qDegreesToRadians(xRotation)); + float zMulY = qCos(qDegreesToRadians(xRotation)); + //! [7] + + //! [8] + // Get the drag amount + QPoint move = inputPosition() - previousInputPos(); + + // Flip the effect of y movement if we're viewing from below + float yMove = (yRotation < 0) ? -move.y() : move.y(); + //! [8] + + //! [9] + // Adjust axes + switch (m_state) { + case StateDraggingX: + distance = (move.x() * xMulX - yMove * xMulY) / m_speedModifier; + m_axisX->setRange(m_axisX->min() - distance, m_axisX->max() - distance); + break; + case StateDraggingZ: + distance = (move.x() * zMulX + yMove * zMulY) / m_speedModifier; + m_axisZ->setRange(m_axisZ->min() + distance, m_axisZ->max() + distance); + break; + case StateDraggingY: + distance = move.y() / m_speedModifier; // No need to use adjusted y move here + m_axisY->setRange(m_axisY->min() + distance, m_axisY->max() + distance); + break; + } + //! [9] +} diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.h b/examples/datavisualization/draggableaxes/axesinputhandler.h new file mode 100644 index 00000000..e912ba74 --- /dev/null +++ b/examples/datavisualization/draggableaxes/axesinputhandler.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef AXESINPUTHANDLER_H +#define AXESINPUTHANDLER_H + +#include +#include +#include + +using namespace QtDataVisualization; + +//! [0] +class AxesInputHandler : public Q3DInputHandler +//! [0] +{ + Q_OBJECT + + enum InputState { + StateNormal = 0, + StateDraggingX, + StateDraggingZ, + StateDraggingY + }; + +public: + explicit AxesInputHandler(QAbstract3DGraph *graph, QObject *parent = 0); + + inline void setAxes(QValue3DAxis *axisX, QValue3DAxis *axisZ, QValue3DAxis *axisY) { + m_axisX = axisX; + m_axisZ = axisZ; + m_axisY = axisY; + } + + //! [1] + inline void setDragSpeedModifier(float modifier) { m_speedModifier = modifier; } + //! [1] + + virtual void mousePressEvent(QMouseEvent *event, const QPoint &mousePos); + virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos); + virtual void mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos); + +private: + void handleElementSelected(QAbstract3DGraph::ElementType type); + void handleAxisDragging(); + +private: + bool m_mousePressed; + InputState m_state; + QValue3DAxis *m_axisX; + QValue3DAxis *m_axisZ; + QValue3DAxis *m_axisY; + float m_speedModifier; +}; + +#endif diff --git a/examples/datavisualization/draggableaxes/data.cpp b/examples/datavisualization/draggableaxes/data.cpp new file mode 100644 index 00000000..992c9ee8 --- /dev/null +++ b/examples/datavisualization/draggableaxes/data.cpp @@ -0,0 +1,160 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "data.h" + +#include +#include +#include +#include +#include + +using namespace QtDataVisualization; + +const int itemCount = 500; + +Data::Data(Q3DScatter *scatter) + : m_graph(scatter), + //! [1] + m_inputHandler(new AxesInputHandler(scatter)), + //! [1] + m_autoAdjust(false) +{ + m_graph->activeTheme()->setType(Q3DTheme::ThemeEbony); + m_graph->activeTheme()->setLabelBorderEnabled(true); + m_graph->activeTheme()->setLabelBackgroundColor(QColor(QRgb(0x151550))); + m_graph->activeTheme()->setLabelTextColor(Qt::lightGray); + m_graph->activeTheme()->setFont(QFont("Arial Black", 30)); + m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium); + m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricRight); + + m_graph->axisX()->setRange(-20.0f, 20.0f); + m_graph->axisY()->setRange(-10.0f, 10.0f); + m_graph->axisZ()->setRange(-20.0f, 20.0f); + + //! [0] + // Give ownership of the handler to the graph and make it the active handler + m_graph->setActiveInputHandler(m_inputHandler); + //! [0] + + //! [2] + // Give our axes to the input handler + m_inputHandler->setAxes(m_graph->axisX(), m_graph->axisZ(), m_graph->axisY()); + //! [2] + + addData(); +} + +Data::~Data() +{ + delete m_graph; +} + +void Data::toggleRanges() +{ + if (!m_autoAdjust) { + m_graph->axisX()->setAutoAdjustRange(true); + m_graph->axisZ()->setAutoAdjustRange(true); + m_graph->axisY()->setAutoAdjustRange(true); + m_inputHandler->setDragSpeedModifier(1.5f); + m_autoAdjust = true; + } else { + m_graph->axisX()->setRange(-20.0f, 20.0f); + m_graph->axisY()->setRange(-10.0f, 10.0f); + m_graph->axisZ()->setRange(-20.0f, 20.0f); + m_inputHandler->setDragSpeedModifier(15.0f); + m_autoAdjust = false; + } +} + +void Data::addData() +{ + QScatter3DSeries *series = new QScatter3DSeries; + series->setMesh(QAbstract3DSeries::MeshCube); + series->setMeshSmooth(true); + m_graph->addSeries(series); + + QScatter3DSeries *series2 = new QScatter3DSeries; + series2->setMesh(QAbstract3DSeries::MeshMinimal); + series2->setMeshSmooth(true); + m_graph->addSeries(series2); + + QScatter3DSeries *series3 = new QScatter3DSeries; + series3->setMesh(QAbstract3DSeries::MeshSphere); + series3->setMeshSmooth(true); + m_graph->addSeries(series3); + + QScatter3DSeries *series4 = new QScatter3DSeries; + series4->setMesh(QAbstract3DSeries::MeshBevelCube); + series4->setMeshSmooth(true); + m_graph->addSeries(series4); + + QScatter3DSeries *series5 = new QScatter3DSeries; + series5->setMesh(QAbstract3DSeries::MeshSphere); + m_graph->addSeries(series5); + + QScatterDataArray *dataArray = new QScatterDataArray; + dataArray->resize(itemCount); + QScatterDataItem *ptrToDataArray = &dataArray->first(); + for (int i = 0; i < itemCount; i++) { + ptrToDataArray->setPosition(randVector()); + ptrToDataArray++; + } + QScatterDataArray *dataArray2 = new QScatterDataArray; + dataArray2->resize(itemCount); + ptrToDataArray = &dataArray2->first(); + for (int i = 0; i < itemCount; i++) { + ptrToDataArray->setPosition(randVector()); + ptrToDataArray++; + } + QScatterDataArray *dataArray3 = new QScatterDataArray; + dataArray3->resize(itemCount); + ptrToDataArray = &dataArray3->first(); + for (int i = 0; i < itemCount; i++) { + ptrToDataArray->setPosition(randVector()); + ptrToDataArray++; + } + QScatterDataArray *dataArray4 = new QScatterDataArray; + dataArray4->resize(itemCount); + ptrToDataArray = &dataArray4->first(); + for (int i = 0; i < itemCount; i++) { + ptrToDataArray->setPosition(randVector()); + ptrToDataArray++; + } + QScatterDataArray *dataArray5 = new QScatterDataArray; + dataArray5->resize(itemCount); + ptrToDataArray = &dataArray5->first(); + for (int i = 0; i < itemCount; i++) { + ptrToDataArray->setPosition(randVector()); + ptrToDataArray++; + } + + m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray); + m_graph->seriesList().at(1)->dataProxy()->resetArray(dataArray2); + m_graph->seriesList().at(2)->dataProxy()->resetArray(dataArray3); + m_graph->seriesList().at(3)->dataProxy()->resetArray(dataArray4); + m_graph->seriesList().at(4)->dataProxy()->resetArray(dataArray5); +} + +QVector3D Data::randVector() +{ + return QVector3D( + (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f, + (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f, + (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f); +} diff --git a/examples/datavisualization/draggableaxes/data.h b/examples/datavisualization/draggableaxes/data.h new file mode 100644 index 00000000..40a69497 --- /dev/null +++ b/examples/datavisualization/draggableaxes/data.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef DATA_H +#define DATA_H + +#include "axesinputhandler.h" + +#include +#include + +using namespace QtDataVisualization; + +class Data : public QObject +{ + Q_OBJECT +public: + explicit Data(Q3DScatter *scatter); + ~Data(); + + void toggleRanges(); + +private: + void addData(); + QVector3D randVector(); + +private: + Q3DScatter *m_graph; + AxesInputHandler *m_inputHandler; + bool m_autoAdjust; +}; + +#endif diff --git a/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png b/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png new file mode 100644 index 00000000..b2656b69 Binary files /dev/null and b/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png differ diff --git a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc new file mode 100644 index 00000000..82add19d --- /dev/null +++ b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \example draggableaxes + \title Axis Range Dragging With Labels Example + \ingroup qtdatavisualization_examples + \brief Implementing a custom input handler to support axis dragging. + + The Axis Range Dragging example shows how to customize the 3D graph controls in a widget + application to allow changing axis ranges by clicking on an axis label and dragging. This is + done by implementing a custom input handler to react to selection signals emitted from the + graph. + + \image draggableaxes-example.png + + \section1 Replacing default input handling + + The default input handling mechanism is replaced by setting the active input handler of + Q3DScatter to \c AxesInputHandler that implements the custom behavior: + + \snippet draggableaxes/data.cpp 0 + + \c m_inputHandler was initialized in the constructor: + + \snippet draggableaxes/data.cpp 1 + + We will also need the pointers to the axes, so we will pass them to our input handler too: + + \snippet draggableaxes/data.cpp 2 + + \section1 Extending mouse event handling + + First of all, we inherited our input handler from Q3DInputHandler instead of + QAbstract3DInputHandler. The reason for doing this is to keep all the functionality of the + default input handling, and to add our own functionality on top of it: + + \snippet draggableaxes/axesinputhandler.h 0 + + We start extending the default functionality by re-implementing some of the mouse events. + Let's start with \c {mousePressEvent}. We'll just add button pressed flag for left mouse button + into it, and keep the rest of the default functionality: + + \snippet draggableaxes/axesinputhandler.cpp 0 + + We'll need to modify \c mouseReleaseEvent too to clear the flag and reset the internal state: + + \snippet draggableaxes/axesinputhandler.cpp 1 + + Then we'll modify \c {mouseMoveEvent}. Here we check if the \c m_mousePressed is \c true and + our internal state is something other than \c StateNormal. If so, we'll set the input positions + for mouse move distance calculations and call the axis dragging function (see + \l {Implementing axis dragging} for details): + + \snippet draggableaxes/axesinputhandler.cpp 2 + + We don't need to change the functionality of mouse wheel, so we will not re-implement that. + + \section1 Implementing axis dragging + + First we need to start listening to the selection signal from the graph. We do that in the + constructor, and connect it to \c handleElementSelected method: + + \snippet draggableaxes/axesinputhandler.cpp 3 + + In \c handleElementSelected we check the type of the selection and set our internal state based on + it: + + \snippet draggableaxes/axesinputhandler.cpp 4 + + The actual dragging logic is implemented in \c handleAxisDragging method, which we call from + \c mouseMoveEvent in case the required conditions are met: + + \snippet draggableaxes/axesinputhandler.cpp 5 + + In \c handleAxisDragging we first get the scene orientation from our active camera: + + \snippet draggableaxes/axesinputhandler.cpp 6 + + Then we calculate the modifiers to mouse move direction based on the orientation: + + \snippet draggableaxes/axesinputhandler.cpp 7 + + After that, we calculate the mouse movement, and modify it based on the y rotation of the + camera: + + \snippet draggableaxes/axesinputhandler.cpp 8 + + And finally apply the moved distance to the correct axis: + + \snippet draggableaxes/axesinputhandler.cpp 9 + + We also have a function for setting the dragging speed: + + \snippet draggableaxes/axesinputhandler.h 1 + + This is needed, as the mouse movement distance is absolute (in screen coordinates) and we + need to adjust it to the axis range. The larger the value, the slower the dragging will be. + Note that on this example we do not take scene zoom level into account when determining the + drag speed, so you'll notice changes in the range adjustment as you change the zoom level. + + The modifier could be adjusted automatically based on the axis range and camera zoom level, but + we'll leave implementing that as an excercise for the reader. + + \section1 Example contents +*/ diff --git a/examples/datavisualization/draggableaxes/draggableaxes.pro b/examples/datavisualization/draggableaxes/draggableaxes.pro new file mode 100644 index 00000000..34db5133 --- /dev/null +++ b/examples/datavisualization/draggableaxes/draggableaxes.pro @@ -0,0 +1,18 @@ +android|ios { + error( "This example is not supported for android or ios." ) +} + +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +SOURCES += main.cpp \ + data.cpp \ + axesinputhandler.cpp +HEADERS += data.h \ + axesinputhandler.h + +QT += widgets + +OTHER_FILES += doc/src/* \ + doc/images/* diff --git a/examples/datavisualization/draggableaxes/main.cpp b/examples/datavisualization/draggableaxes/main.cpp new file mode 100644 index 00000000..0834313e --- /dev/null +++ b/examples/datavisualization/draggableaxes/main.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "data.h" + +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + Q3DScatter *graph = new Q3DScatter(); + QWidget *container = QWidget::createWindowContainer(graph); + + container->setMinimumSize(800, 600); + container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + container->setFocusPolicy(Qt::StrongFocus); + + QWidget *widget = new QWidget; + QHBoxLayout *hLayout = new QHBoxLayout(widget); + QVBoxLayout *vLayout = new QVBoxLayout(); + hLayout->addWidget(container, 1); + hLayout->addLayout(vLayout); + + QCommandLinkButton *rangeButton = new QCommandLinkButton(widget); + rangeButton->setText(QStringLiteral("Toggle axis ranges")); + rangeButton->setDescription(QStringLiteral("Switch between automatic axis ranges and preset ranges")); + rangeButton->setIconSize(QSize(0, 0)); + + vLayout->addWidget(rangeButton, 1, Qt::AlignTop); + + widget->setWindowTitle(QStringLiteral("Input Handling for Axes")); + + Data *graphData = new Data(graph); + + QObject::connect(rangeButton, &QCommandLinkButton::clicked, graphData, &Data::toggleRanges); + + widget->show(); + return app.exec(); +} diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 8c94a9a4..a6081960 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -1113,4 +1113,10 @@ void Abstract3DController::emitNeedRender() } } +void Abstract3DController::handlePendingClick() +{ + QAbstract3DGraph::ElementType type = m_renderer->clickedType(); + emit elementSelected(type); + // TODO: Consider adding type specific signals +} QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index e433c97e..aa05fc9f 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -278,6 +278,7 @@ signals: void axisXChanged(QAbstract3DAxis *axis); void axisYChanged(QAbstract3DAxis *axis); void axisZChanged(QAbstract3DAxis *axis); + void elementSelected(QAbstract3DGraph::ElementType type); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6b3393ab..38e81be6 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -46,6 +46,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelDirty(true), m_clickPending(false), m_clickedSeries(0), + m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) #ifdef DISPLAY_RENDER_SPEED , m_isFirstFrame(true), diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index f6415cca..b94c5180 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -109,6 +109,7 @@ public: inline bool isClickPending() { return m_clickPending; } inline void clearClickPending() { m_clickPending = false; } inline QAbstract3DSeries *clickedSeries() const { return m_clickedSeries; } + inline QAbstract3DGraph::ElementType clickedType() { return m_clickedType; } LabelItem &selectionLabelItem(); void setSelectionLabel(const QString &label); @@ -158,6 +159,7 @@ protected: bool m_selectionLabelDirty; bool m_clickPending; QAbstract3DSeries *m_clickedSeries; + QAbstract3DGraph::ElementType m_clickedType; QString m_selectionLabel; LabelItem *m_selectionLabelItem; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index ec170129..49b6f383 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -253,6 +253,8 @@ void Bars3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QBar3DSeries *series = static_cast(m_renderer->clickedSeries()); + Abstract3DController::handlePendingClick(); + setSelectedBar(position, series, true); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 9962d9e2..46df6464 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2137,33 +2137,37 @@ Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionColor) { - QPoint position; - if (selectionColor == selectionSkipColor - || (selectionColor.w() == labelRowAlpha - && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) - || (selectionColor.w() == labelColumnAlpha - && !m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn))) { - position = Bars3DController::invalidSelectionPosition(); - } else if (selectionColor.w() == itemAlpha) { + QPoint position = Bars3DController::invalidSelectionPosition(); + m_clickedType = QAbstract3DGraph::ElementNone; + if (selectionColor.w() == itemAlpha) { // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), int(selectionColor.y()) + int(m_axisCacheX.min())); + // Pass item clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementSeries; } else if (selectionColor.w() == labelRowAlpha) { // Row selection - // Use column from previous selection in case we have row + column mode - GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid - position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); - // TODO: Pass label clicked info to input handler (implement in part 2) + if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionRow)) { + // Use column from previous selection in case we have row + column mode + GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid + position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); + } + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (selectionColor.w() == labelColumnAlpha) { // Column selection - // Use row from previous selection in case we have row + column mode - GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid - position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); - // TODO: Pass label clicked info to input handler (implement in part 2) + if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionColumn)) { + // Use row from previous selection in case we have row + column mode + GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid + position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); + } + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (selectionColor.w() == labelValueAlpha) { // Value selection position = Bars3DController::invalidSelectionPosition(); - // TODO: Pass label clicked info to input handler (implement in part 2) + // Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } return position; } diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 5afc1417..8f3c56b9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -119,6 +119,24 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Shadows are rendered in high quality with softened edges. */ +/*! + \enum QAbstract3DGraph::ElementType + \since Qt Data Visualization 1.1 + + Type of an element in the graph. + + \value ElementNone + No defined element. + \value ElementSeries + A series (i.e. an item in a series). + \value ElementAxisXLabel + X axis label. + \value ElementAxisZLabel + Z axis label. + \value ElementAxisYLabel + Y axis label. +*/ + /*! * \internal */ @@ -128,6 +146,7 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor d_ptr(d) { qRegisterMetaType("QAbstract3DGraph::ShadowQuality"); + qRegisterMetaType("QAbstract3DGraph::ElementType"); // Default to frameless window, as typically graphs are not toplevel setFlags(flags() | Qt::FramelessWindowHint); @@ -375,6 +394,15 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) return d_ptr->renderToImage(msaaSamples, renderSize); } +/*! \fn QAbstract3DGraph::elementSelected(ElementType type) + * \since Qt Data Visualization 1.1 + * + * Emits selection \a type when a selection is made in the graph. + * + * Signal can be used for example for implementing custom input handlers, as demonstrated in this + * \l {Axis Range Dragging With Labels Example}{example}. + */ + /*! * \internal */ @@ -500,6 +528,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::selectionModeChanged); QObject::connect(m_visualController, &Abstract3DController::shadowQualityChanged, q_ptr, &QAbstract3DGraph::shadowQualityChanged); + QObject::connect(m_visualController, &Abstract3DController::elementSelected, q_ptr, + &QAbstract3DGraph::elementSelected); + QObject::connect(m_visualController, &Abstract3DController::needRender, this, &QAbstract3DGraphPrivate::renderLater); diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 1109d7b0..85ee484f 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -70,6 +70,14 @@ public: ShadowQualitySoftHigh }; + enum ElementType { + ElementNone = 0, + ElementSeries, + ElementAxisXLabel, + ElementAxisZLabel, + ElementAxisYLabel + }; + public: virtual ~QAbstract3DGraph(); @@ -116,6 +124,7 @@ signals: void activeThemeChanged(Q3DTheme *theme); void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode); void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); + void elementSelected(QAbstract3DGraph::ElementType type); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index a28ee851..b45a956d 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -274,6 +274,8 @@ void Scatter3DController::handlePendingClick() } } + Abstract3DController::handlePendingClick(); + setSelectedItem(index, series); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 43c78137..f5336832 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1752,19 +1752,20 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series) { + m_clickedType = QAbstract3DGraph::ElementNone; if (color != selectionSkipColor) { if (color.w() == labelRowAlpha) { // Row selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (color.w() == labelColumnAlpha) { // Column selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (color.w() == labelValueAlpha) { // Value selection index = Scatter3DController::invalidSelectionIndex(); - // TODO: Pass label clicked info to input handler (implement in part 2) + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } else { index = int(color.x()) + (int(color.y()) << 8) @@ -1773,6 +1774,7 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, for (int i = 0; i < m_renderingArrays.size(); i++) { if (index < m_renderingArrays.at(i).size()) { series = m_visibleSeriesList.at(i).series(); + m_clickedType = QAbstract3DGraph::ElementSeries; return; // Valid found and already set to return parameters, so we can return } else { index -= m_renderingArrays.at(i).size(); diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 2d64e87d..683a214a 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -126,6 +126,8 @@ void Surface3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QSurface3DSeries *series = static_cast(m_renderer->clickedSeries()); + Abstract3DController::handlePendingClick(); + setSelectedPoint(position, series, true); m_renderer->resetClickedStatus(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index a3ee0971..9e591383 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2247,25 +2247,18 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co // Maps selection Id to surface point in data array QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { -#if 0 // TODO: Implement fully in part 2 + m_clickedType = QAbstract3DGraph::ElementNone; // Check for label selection if (id / alphaMultiplier == labelRowAlpha) { - int row = id - (labelRowAlpha * alphaMultiplier); - qDebug() << "row label" << row; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisZLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelColumnAlpha) { - int column = (id - (labelColumnAlpha * alphaMultiplier)) / 256; - qDebug() << "column label" << column; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisXLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelValueAlpha) { - int value = (id - (labelValueAlpha * alphaMultiplier)) / 65536; - qDebug() << "value label" << value; - // TODO: Pass label clicked info to input handler + m_clickedType = QAbstract3DGraph::ElementAxisYLabel; return Surface3DController::invalidSelectionPosition(); } -#endif // Not a label selection SurfaceSeriesRenderCache *selectedCache = 0; @@ -2286,6 +2279,7 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) int row = ((idInSeries - 1) / sampleSpace.width()) + sampleSpace.y(); m_clickedSeries = selectedCache->series(); + m_clickedType = QAbstract3DGraph::ElementSeries; return QPoint(row, column); } -- cgit v1.2.3 From 1bb92e76313c691104869716a2078adecc38fa72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 3 Apr 2014 12:34:23 +0300 Subject: Added snapshots to 2 examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iad72ba09bd419d2adf3d17636c298f7d54baff27 Change-Id: Iad72ba09bd419d2adf3d17636c298f7d54baff27 Reviewed-by: Tomi Korpipää --- .../doc/images/draggableaxes-example.png | Bin 62422 -> 90050 bytes .../doc/images/qmlaxisformatter-example.png | Bin 0 -> 132952 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png diff --git a/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png b/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png index b2656b69..018694b5 100644 Binary files a/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png and b/examples/datavisualization/draggableaxes/doc/images/draggableaxes-example.png differ diff --git a/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png b/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png new file mode 100644 index 00000000..fbfbd833 Binary files /dev/null and b/examples/datavisualization/qmlaxisformatter/doc/images/qmlaxisformatter-example.png differ -- cgit v1.2.3 From 1b5d9a30adc0c9ca4f7929c375db008830586516 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 3 Apr 2014 15:05:27 +0300 Subject: Introduce fps measurement via properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2134 Change-Id: I181ee6c784b998886c2292b7548e16ce75d86458 Reviewed-by: Tomi Korpipää --- .../qmloscilloscope/qml/qmloscilloscope/main.qml | 27 ++++++++++++++ src/datavisualization/axis/qvalue3daxis.cpp | 10 ++++++ src/datavisualization/data/qabstract3dseries.cpp | 4 +++ ...tdatavisualization-qml-abstractdeclarative.qdoc | 20 +++++++++++ .../engine/abstract3dcontroller.cpp | 39 ++++++++++++++++---- .../engine/abstract3dcontroller_p.h | 12 +++++++ .../engine/abstract3drenderer.cpp | 29 --------------- .../engine/abstract3drenderer_p.h | 11 ------ src/datavisualization/engine/qabstract3dgraph.cpp | 41 +++++++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 9 ++++- src/datavisualizationqml2/abstractdeclarative.cpp | 20 +++++++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 8 +++++ .../datavisualizationqml2_plugin.cpp | 2 ++ tests/barstest/chart.cpp | 15 ++++++++ tests/barstest/chart.h | 5 +++ tests/barstest/main.cpp | 12 +++++++ 16 files changed, 216 insertions(+), 48 deletions(-) diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml index 5f5bfe1a..1373d4f9 100644 --- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml +++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml @@ -65,6 +65,14 @@ Item { axisX.segmentCount: 4 axisY.segmentCount: 4 axisZ.segmentCount: 4 + measureFps: true + + onCurrentFpsChanged: { + if (fps > 10) + fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps) + else + fpsText.text = "FPS: " + Math.round(surfaceGraph.currentFps * 10.0) / 10.0 + } //! [0] Surface3DSeries { @@ -202,6 +210,25 @@ Item { } } + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + Layout.minimumWidth: fpsText.implicitWidth + 10 + Layout.maximumWidth: fpsText.implicitWidth + 10 + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + + border.color: "gray" + border.width: 1 + radius: 4 + + Text { + id: fpsText + anchors.fill: parent + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + Rectangle { Layout.fillHeight: true Layout.fillWidth: true diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 3a8b902f..79d374ea 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -73,6 +73,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \c {d, i, o, x, X, f, F, e, E, g, G, c}. See QString::sprintf() for additional details. */ +/*! + * \qmlproperty ValueAxis3DFormatter ValueAxis3D::formatter + * \since QtDataVisualization 1.1 + * + * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter + * is set. + * + */ + /*! * Constructs QValue3DAxis with the given \a parent. */ @@ -170,6 +179,7 @@ QString QValue3DAxis::labelFormat() const /*! * \property QValue3DAxis::formatter + * \since Qt Data Visualization 1.1 * * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter * is set. diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 934fad16..827f2e7f 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -242,6 +242,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string Abstract3DSeries::itemLabel + * \since QtDataVisualization 1.1 * * Contains the formatted item label. If there is no selected item or the selected item is not * visible, returns an empty string. @@ -251,6 +252,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty bool Abstract3DSeries::itemLabelVisible + * \since QtDataVisualization 1.1 * * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not * drawn. If you prefer to show the item label in an external control, set this property to @@ -608,6 +610,7 @@ QString QAbstract3DSeries::name() const /*! * \property QAbstract3DSeries::itemLabel + * \since Qt Data Visualization 1.1 * * Contains the formatted item label. If there is no selected item or the selected item is not * visible, returns an empty string. @@ -621,6 +624,7 @@ QString QAbstract3DSeries::itemLabel() const /*! * \property QAbstract3DSeries::itemLabelVisible + * \since Qt Data Visualization 1.1 * * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not * drawn. If you prefer to show the item label in an external control, set this property to diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 891cc5c1..e6e3e881 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -124,6 +124,26 @@ \sa renderingMode */ +/*! + * \qmlproperty bool AbstractGraph3D::measureFps + * \since QtDataVisualization 1.1 + * + * If \c true, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to false. + * + * \sa currentFps + */ + +/*! + * \qmlproperty int AbstractGraph3D::currentFps + * \since QtDataVisualization 1.1 + * + * When fps measuring is enabled, the results for the last second are stored in this read-only + * property. It takes at least a second before this value updates after measurement is activated. + * + * \sa measureFps + */ + /*! * \qmlmethod void AbstractGraph3D::clearSelection() * Clears selection from all attached series. diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index a6081960..9283ccb4 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -52,7 +52,10 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_isDataDirty(true), m_isSeriesVisibilityDirty(true), m_isSeriesVisualsDirty(true), - m_renderPending(false) + m_renderPending(false), + m_measureFps(false), + m_numFrames(0), + m_currentFps(0.0) { if (!m_scene) m_scene = new Q3DScene; @@ -373,12 +376,21 @@ void Abstract3DController::render(const GLuint defaultFboHandle) if (!m_renderer) return; - m_renderer->render(defaultFboHandle); + if (m_measureFps) { + // Measure speed (as milliseconds per frame) + m_numFrames++; + int elapsed = m_frameTimer.elapsed(); + if (elapsed >= 1000) { + m_currentFps = qreal(m_numFrames) * 1000.0 / qreal(elapsed); + emit currentFpsChanged(m_currentFps); + m_numFrames = 0; + m_frameTimer.restart(); + } + // To get meaningful framerate, don't just do render on demand. + emitNeedRender(); + } -#ifdef DISPLAY_RENDER_SPEED - // To get meaningful framerate, don't just do render on demand. - emitNeedRender(); -#endif + m_renderer->render(defaultFboHandle); } void Abstract3DController::mouseDoubleClickEvent(QMouseEvent *event) @@ -952,6 +964,21 @@ void Abstract3DController::handleRequestShadowQuality(QAbstract3DGraph::ShadowQu setShadowQuality(quality); } +void Abstract3DController::setMeasureFps(bool enable) +{ + if (m_measureFps != enable) { + m_measureFps = enable; + m_currentFps = 0.0; + + if (enable) { + m_frameTimer.start(); + m_numFrames = -1; + emitNeedRender(); + } + emit measureFpsChanged(enable); + } +} + void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) { // Label format changing needs to dirty the data so that labels are reset. diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index aa05fc9f..f18ed452 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -36,6 +36,7 @@ #include "qabstractdataproxy.h" #include "q3dscene_p.h" #include +#include class QFont; class QOpenGLFramebufferObject; @@ -160,6 +161,11 @@ protected: QList m_seriesList; + bool m_measureFps; + QTime m_frameTimer; + int m_numFrames; + qreal m_currentFps; + explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); public: @@ -269,6 +275,10 @@ public slots: // Renderer callback handlers void handleRequestShadowQuality(QAbstract3DGraph::ShadowQuality quality); + void setMeasureFps(bool enable); + inline bool measureFps() const { return m_measureFps; } + inline qreal currentFps() const { return m_currentFps; } + signals: void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); @@ -279,6 +289,8 @@ signals: void axisYChanged(QAbstract3DAxis *axis); void axisZChanged(QAbstract3DAxis *axis); void elementSelected(QAbstract3DGraph::ElementType type); + void measureFpsChanged(bool enabled); + void currentFpsChanged(qreal fps); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 38e81be6..0b8ac8d1 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -48,10 +48,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) -#ifdef DISPLAY_RENDER_SPEED - , m_isFirstFrame(true), - m_numFrames(0) -#endif { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -97,23 +93,6 @@ void Abstract3DRenderer::initializeOpenGL() void Abstract3DRenderer::render(const GLuint defaultFboHandle) { -#ifdef DISPLAY_RENDER_SPEED - // For speed computation - if (m_isFirstFrame) { - m_lastFrameTime.start(); - m_isFirstFrame = false; - } - - // Measure speed (as milliseconds per frame) - m_numFrames++; - if (m_lastFrameTime.elapsed() >= 1000) { // print only if last measurement was more than 1s ago - qDebug() << float(m_lastFrameTime.elapsed()) / float(m_numFrames) << "ms/frame (=" - << float(m_numFrames) << "fps)"; - m_numFrames = 0; - m_lastFrameTime.restart(); - } -#endif - if (defaultFboHandle) { glDepthMask(true); glEnable(GL_DEPTH_TEST); @@ -139,14 +118,6 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) glDisable(GL_SCISSOR_TEST); } -//QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) -//{ -// QString valueLabelFormat = format; -// Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); -// QByteArray valueFormatArray = valueLabelFormat.toUtf8(); -// return Utils::formatLabel(valueFormatArray, valueParamType, value); -//} - void Abstract3DRenderer::updateSelectionState(SelectionState state) { m_selectionState = state; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index b94c5180..f5ca8d02 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -29,12 +29,7 @@ #ifndef ABSTRACT3DRENDERER_P_H #define ABSTRACT3DRENDERER_P_H -//#define DISPLAY_RENDER_SPEED - #include -#ifdef DISPLAY_RENDER_SPEED -#include -#endif #include "datavisualizationglobal_p.h" #include "abstract3dcontroller_p.h" @@ -163,12 +158,6 @@ protected: QString m_selectionLabel; LabelItem *m_selectionLabelItem; - -#ifdef DISPLAY_RENDER_SPEED - bool m_isFirstFrame; - QTime m_lastFrameTime; - GLint m_numFrames; -#endif }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 8f3c56b9..703cd18b 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -363,7 +363,8 @@ bool QAbstract3DGraph::shadowsSupported() const /*! * \property QAbstract3DGraph::scene * - * This property contains the read only Q3DScene that can be used to access, for example, a camera object. + * This property contains the read only Q3DScene that can be used to access, for example, a camera + * object. */ Q3DScene *QAbstract3DGraph::scene() const { @@ -403,6 +404,39 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * \l {Axis Range Dragging With Labels Example}{example}. */ +/*! + * \property QAbstract3DGraph::measureFps + * \since Qt Data Visualization 1.1 + * + * If \c true, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to false. + * + * \sa currentFps + */ +void QAbstract3DGraph::setMeasureFps(bool enable) +{ + d_ptr->m_visualController->setMeasureFps(enable); +} + +bool QAbstract3DGraph::measureFps() const +{ + return d_ptr->m_visualController->measureFps(); +} + +/*! + * \property QAbstract3DGraph::currentFps + * \since Qt Data Visualization 1.1 + * + * When fps measuring is enabled, the results for the last second are stored in this read-only + * property. It takes at least a second before this value updates after measurement is activated. + * + * \sa measureFps + */ +qreal QAbstract3DGraph::currentFps() const +{ + return d_ptr->m_visualController->currentFps(); +} + /*! * \internal */ @@ -540,6 +574,11 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraphPrivate::handleAxisYChanged); QObject::connect(m_visualController, &Abstract3DController::axisZChanged, this, &QAbstract3DGraphPrivate::handleAxisZChanged); + + QObject::connect(m_visualController, &Abstract3DController::measureFpsChanged, q_ptr, + &QAbstract3DGraph::measureFpsChanged); + QObject::connect(m_visualController, &Abstract3DController::currentFpsChanged, q_ptr, + &QAbstract3DGraph::currentFpsChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 85ee484f..2f417c2f 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -40,6 +40,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) Q_PROPERTY(Q3DScene* scene READ scene) + Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged) + Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -106,6 +108,10 @@ public: QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); + void setMeasureFps(bool enable); + bool measureFps() const; + qreal currentFps() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -118,13 +124,14 @@ protected: void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); - signals: void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); void activeThemeChanged(Q3DTheme *theme); void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode); void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void elementSelected(QAbstract3DGraph::ElementType type); + void measureFpsChanged(bool enabled); + void currentFpsChanged(qreal fps); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 65e7c6c3..881a7860 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -237,6 +237,11 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) &AbstractDeclarative::handleAxisYChanged); QObject::connect(m_controller.data(), &Abstract3DController::axisZChanged, this, &AbstractDeclarative::handleAxisZChanged); + + QObject::connect(m_controller.data(), &Abstract3DController::measureFpsChanged, this, + &AbstractDeclarative::measureFpsChanged); + QObject::connect(m_controller.data(), &Abstract3DController::currentFpsChanged, this, + &AbstractDeclarative::currentFpsChanged); } void AbstractDeclarative::activateOpenGLContext(QQuickWindow *window) @@ -569,6 +574,21 @@ void AbstractDeclarative::checkWindowList(QQuickWindow *window) } } +void AbstractDeclarative::setMeasureFps(bool enable) +{ + m_controller->setMeasureFps(enable); +} + +bool AbstractDeclarative::measureFps() const +{ + return m_controller->measureFps(); +} + +qreal AbstractDeclarative::currentFps() const +{ + return m_controller->currentFps(); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 87b108db..8ba86b11 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -66,6 +66,8 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(QAbstract3DInputHandler* inputHandler READ inputHandler WRITE setInputHandler NOTIFY inputHandlerChanged) Q_PROPERTY(Q3DTheme* theme READ theme WRITE setTheme NOTIFY themeChanged) Q_PROPERTY(RenderingMode renderingMode READ renderingMode WRITE setRenderingMode NOTIFY renderingModeChanged) + Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged REVISION 1) + Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged REVISION 1) public: enum SelectionFlag { @@ -138,6 +140,10 @@ public: void checkWindowList(QQuickWindow *window); + void setMeasureFps(bool enable); + bool measureFps() const; + qreal currentFps() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -167,6 +173,8 @@ signals: void inputHandlerChanged(QAbstract3DInputHandler *inputHandler); void themeChanged(Q3DTheme *theme); void renderingModeChanged(AbstractDeclarative::RenderingMode mode); + void measureFpsChanged(bool enabled); + void currentFpsChanged(qreal fps); private: QPointer m_controller; diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index a9b932b4..71c54265 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -90,6 +90,8 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 1, "ValueAxis3D"); qmlRegisterUncreatableType(uri, 1, 1, "Abstract3DSeries", QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); + qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", + QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 6ecd375a..0a8bef55 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -237,6 +237,10 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog) QObject::connect(&m_rotationTimer, &QTimer::timeout, this, &GraphModifier::triggerRotation); + QObject::connect(m_graph, &QAbstract3DGraph::currentFpsChanged, this, + &GraphModifier::handleFpsChange); + + resetTemperatureData(); } @@ -1213,6 +1217,12 @@ void GraphModifier::handleValueAxisLabelsChanged() qDebug() << __FUNCTION__; } +void GraphModifier::handleFpsChange(qreal fps) +{ + static const QString fpsPrefix(QStringLiteral("FPS: ")); + m_fpsLabel->setText(fpsPrefix + QString::number(qRound(fps))); +} + void GraphModifier::setBackgroundEnabled(int enabled) { m_graph->activeTheme()->setBackgroundEnabled(bool(enabled)); @@ -1235,6 +1245,11 @@ void GraphModifier::rotateY(int rotation) m_graph->scene()->activeCamera()->setCameraPosition(m_xRotation, m_yRotation); } +void GraphModifier::setFpsMeasurement(bool enable) +{ + m_graph->setMeasureFps(enable); +} + void GraphModifier::setSpecsRatio(int barwidth) { m_graph->setBarThickness((float)barwidth / 30.0f); diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 52c46a8c..214c4e17 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -29,6 +29,7 @@ #include #include #include +#include using namespace QtDataVisualization; @@ -58,6 +59,7 @@ public: void changeFontSize(int fontsize); void rotateX(int rotation); void rotateY(int rotation); + void setFpsMeasurement(bool enable); void setBackgroundEnabled(int enabled); void setGridEnabled(int enabled); void setSpecsRatio(int barwidth); @@ -88,6 +90,7 @@ public: void useLogAxis(); void changeValueAxisFormat(const QString & text); void changeLogBase(const QString & text); + void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } public slots: void flipViews(); @@ -108,6 +111,7 @@ public slots: void triggerSelection(); void triggerRotation(); void handleValueAxisLabelsChanged(); + void handleFpsChange(qreal fps); signals: void shadowQualityChanged(int quality); @@ -157,6 +161,7 @@ private: QAbstract3DInputHandler *m_customInputHandler; QTimer m_selectionTimer; QTimer m_rotationTimer; + QLabel *m_fpsLabel; }; #endif diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index 112e8d4d..b1589e0f 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -187,6 +187,12 @@ int main(int argc, char **argv) gradientBtoYPB->setIcon(QIcon(pm)); gradientBtoYPB->setIconSize(QSize(100, 24)); + QLabel *fpsLabel = new QLabel(QStringLiteral("")); + + QCheckBox *fpsCheckBox = new QCheckBox(widget); + fpsCheckBox->setText(QStringLiteral("Measure Fps")); + fpsCheckBox->setChecked(false); + QCheckBox *backgroundCheckBox = new QCheckBox(widget); backgroundCheckBox->setText(QStringLiteral("Show background")); backgroundCheckBox->setChecked(true); @@ -345,6 +351,8 @@ int main(int argc, char **argv) vLayout2->addWidget(minSliderZ, 0, Qt::AlignTop); vLayout2->addWidget(minSliderY, 0, Qt::AlignTop); vLayout2->addWidget(maxSliderY, 0, Qt::AlignTop); + vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop); + vLayout2->addWidget(fpsCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(backgroundCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(gridCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop); @@ -454,6 +462,8 @@ int main(int argc, char **argv) QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier, &GraphModifier::changeFont); + QObject::connect(fpsCheckBox, &QCheckBox::stateChanged, modifier, + &GraphModifier::setFpsMeasurement); QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier, &GraphModifier::setBackgroundEnabled); QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier, @@ -507,6 +517,8 @@ int main(int argc, char **argv) &QSlider::setEnabled); QObject::connect(staticCheckBox, &QCheckBox::stateChanged, modifier, &GraphModifier::restart); + modifier->setFpsLabel(fpsLabel); + modifier->start(); return app.exec(); -- cgit v1.2.3 From 28e42188efb1544cf6b1433c244d590165ee6ebd Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 7 Apr 2014 14:26:32 +0300 Subject: Optimize multiple series rendering. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cache all series instead of just the visible ones on all graphs instead of just surface. Changes to one series now trigger data update to only the affected series, which should significantly improve performance in these cases. Task-number: QTRD-2600 Task-number: QTRD-2957 Change-Id: I6db7c689108fce8d25aace6682a193936d6f0eaf Reviewed-by: Tomi Korpipää --- src/datavisualization/data/barrenderitem.cpp | 5 +- src/datavisualization/data/barrenderitem_p.h | 6 - src/datavisualization/data/qabstract3dseries_p.h | 4 +- src/datavisualization/data/scatterrenderitem.cpp | 4 +- .../engine/abstract3dcontroller.cpp | 21 +- .../engine/abstract3dcontroller_p.h | 4 +- .../engine/abstract3drenderer.cpp | 83 +- .../engine/abstract3drenderer_p.h | 9 +- src/datavisualization/engine/bars3dcontroller.cpp | 17 +- src/datavisualization/engine/bars3dcontroller_p.h | 3 +- src/datavisualization/engine/bars3drenderer.cpp | 1090 ++++++++++---------- src/datavisualization/engine/bars3drenderer_p.h | 16 +- .../engine/barseriesrendercache.cpp | 43 + .../engine/barseriesrendercache_p.h | 61 ++ src/datavisualization/engine/engine.pri | 8 +- .../engine/scatter3dcontroller.cpp | 36 +- .../engine/scatter3dcontroller_p.h | 3 +- src/datavisualization/engine/scatter3drenderer.cpp | 733 ++++++------- src/datavisualization/engine/scatter3drenderer_p.h | 16 +- .../engine/scatterseriesrendercache.cpp | 43 + .../engine/scatterseriesrendercache_p.h | 62 ++ src/datavisualization/engine/seriesrendercache.cpp | 88 +- src/datavisualization/engine/seriesrendercache_p.h | 13 +- .../engine/surface3dcontroller.cpp | 45 +- .../engine/surface3dcontroller_p.h | 4 +- src/datavisualization/engine/surface3drenderer.cpp | 215 ++-- src/datavisualization/engine/surface3drenderer_p.h | 13 +- .../engine/surfaceseriesrendercache.cpp | 28 +- .../engine/surfaceseriesrendercache_p.h | 17 +- src/datavisualization/utils/surfaceobject.cpp | 2 + tests/barstest/chart.cpp | 64 +- tests/barstest/chart.h | 2 + tests/barstest/main.cpp | 6 + tests/scattertest/main.cpp | 6 + tests/scattertest/scatterchart.cpp | 6 + tests/scattertest/scatterchart.h | 1 + tests/surfacetest/graphmodifier.cpp | 38 + tests/surfacetest/graphmodifier.h | 2 + tests/surfacetest/main.cpp | 12 + 39 files changed, 1619 insertions(+), 1210 deletions(-) create mode 100644 src/datavisualization/engine/barseriesrendercache.cpp create mode 100644 src/datavisualization/engine/barseriesrendercache_p.h create mode 100644 src/datavisualization/engine/scatterseriesrendercache.cpp create mode 100644 src/datavisualization/engine/scatterseriesrendercache_p.h diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp index 50d2a4b4..2d9d3daa 100644 --- a/src/datavisualization/data/barrenderitem.cpp +++ b/src/datavisualization/data/barrenderitem.cpp @@ -24,8 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION BarRenderItem::BarRenderItem() : AbstractRenderItem(), m_value(0), - m_height(0.0f), - m_seriesIndex(0) + m_height(0.0f) { } @@ -35,7 +34,6 @@ BarRenderItem::BarRenderItem(const BarRenderItem &other) m_value = other.m_value; m_position = other.m_position; m_height = other.m_height; - m_seriesIndex = other.m_seriesIndex; } BarRenderItem::~BarRenderItem() @@ -67,7 +65,6 @@ void BarRenderSliceItem::setItem(const BarRenderItem &renderItem) m_value = renderItem.value(); m_position = renderItem.position(); m_height = renderItem.height(); - m_seriesIndex = renderItem.seriesIndex(); m_sliceLabel = QString(); m_sliceLabelItem = 0; } diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h index 1122053d..97c069e2 100644 --- a/src/datavisualization/data/barrenderitem_p.h +++ b/src/datavisualization/data/barrenderitem_p.h @@ -54,16 +54,10 @@ public: inline void setHeight(GLfloat height) { m_height = height; } inline GLfloat height() const { return m_height; } - // Series index in visual series that this item belongs to. - // This is only utilized by slicing, so it may not be up to date on all items. - inline void setSeriesIndex(int seriesIndex) { m_seriesIndex = seriesIndex; } - inline int seriesIndex() const { return m_seriesIndex; } - protected: float m_value; QPoint m_position; // x = row, y = column GLfloat m_height; - int m_seriesIndex; friend class QBarDataItem; }; diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h index 530afe5e..e62543af 100644 --- a/src/datavisualization/data/qabstract3dseries_p.h +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -52,6 +52,7 @@ struct QAbstract3DSeriesChangeBitField { bool nameChanged : 1; bool itemLabelChanged : 1; bool itemLabelVisibilityChanged : 1; + bool visibilityChanged : 1; QAbstract3DSeriesChangeBitField() : meshChanged(true), @@ -67,7 +68,8 @@ struct QAbstract3DSeriesChangeBitField { multiHighlightGradientChanged(true), nameChanged(true), itemLabelChanged(true), - itemLabelVisibilityChanged(true) + itemLabelVisibilityChanged(true), + visibilityChanged(true) { } }; diff --git a/src/datavisualization/data/scatterrenderitem.cpp b/src/datavisualization/data/scatterrenderitem.cpp index 3b2e64c5..33df4d28 100644 --- a/src/datavisualization/data/scatterrenderitem.cpp +++ b/src/datavisualization/data/scatterrenderitem.cpp @@ -29,10 +29,10 @@ ScatterRenderItem::ScatterRenderItem() } ScatterRenderItem::ScatterRenderItem(const ScatterRenderItem &other) - : AbstractRenderItem(other), - m_visible(false) + : AbstractRenderItem(other) { m_position = other.m_position; + m_visible = other.m_visible; } ScatterRenderItem::~ScatterRenderItem() diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 9283ccb4..885904d4 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -50,7 +50,6 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_axisZ(0), m_renderer(0), m_isDataDirty(true), - m_isSeriesVisibilityDirty(true), m_isSeriesVisualsDirty(true), m_renderPending(false), m_measureFps(false), @@ -146,7 +145,7 @@ void Abstract3DController::removeSeries(QAbstract3DSeries *series) this, &Abstract3DController::handleSeriesVisibilityChanged); series->d_ptr->setController(0); m_isDataDirty = true; - m_isSeriesVisibilityDirty = true; + m_isSeriesVisualsDirty = true; emitNeedRender(); } } @@ -354,9 +353,13 @@ void Abstract3DController::synchDataToRenderer() } } - if (m_isSeriesVisibilityDirty || m_isSeriesVisualsDirty) { - m_renderer->updateSeries(m_seriesList, m_isSeriesVisibilityDirty); - m_isSeriesVisibilityDirty = false; + if (m_changedSeriesList.size()) { + m_renderer->modifiedSeriesList(m_changedSeriesList); + m_changedSeriesList.clear(); + } + + if (m_isSeriesVisualsDirty) { + m_renderer->updateSeries(m_seriesList); m_isSeriesVisualsDirty = false; } @@ -1018,10 +1021,14 @@ void Abstract3DController::handleAxisFormatterDirtyBySender(QObject *sender) void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { - Q_UNUSED(sender) + QAbstract3DSeries *series = static_cast(sender); + series->d_ptr->m_changeTracker.visibilityChanged = true; m_isDataDirty = true; - m_isSeriesVisibilityDirty = true; + m_isSeriesVisualsDirty = true; + + adjustAxisRanges(); + emitNeedRender(); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index f18ed452..4f597769 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -155,7 +155,6 @@ protected: QList m_axes; // List of all added axes Abstract3DRenderer *m_renderer; bool m_isDataDirty; - bool m_isSeriesVisibilityDirty; bool m_isSeriesVisualsDirty; bool m_renderPending; @@ -166,6 +165,8 @@ protected: int m_numFrames; qreal m_currentFps; + QVector m_changedSeriesList; + explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); public: @@ -247,6 +248,7 @@ public: virtual void handleAxisFormatterDirtyBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; + virtual void adjustAxisRanges() = 0; void markSeriesItemLabelsDirty(); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0b8ac8d1..f70d128b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -47,7 +47,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickPending(false), m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), - m_selectionLabelItem(0) + m_selectionLabelItem(0), + m_visibleSeriesCount(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -59,14 +60,17 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) Abstract3DRenderer::~Abstract3DRenderer() { - for (int i = 0; i < m_visibleSeriesList.size(); i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - delete m_drawer; delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; + + foreach (SeriesRenderCache *cache, m_renderCacheList) { + cache->cleanup(m_textureHelper); + delete cache; + } + m_renderCacheList.clear(); } void Abstract3DRenderer::initializeOpenGL() @@ -285,6 +289,9 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient AxisRenderCache &cache = axisCacheForOrientation(orientation); cache.setMin(min); cache.setMax(max); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); } void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, @@ -318,6 +325,18 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or } formatter->d_ptr->populateCopy(*(cache.formatter())); cache.markPositionsDirty(); + + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); +} + +void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) +{ + foreach (QAbstract3DSeries *series, seriesList) { + SeriesRenderCache *cache = m_renderCacheList.value(series, 0); + if (cache) + cache->setDataDirty(true); + } } void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh) @@ -327,33 +346,45 @@ void Abstract3DRenderer::fixMeshFileName(QString &fileName, QAbstract3DSeries::M Q_UNUSED(mesh) } -void Abstract3DRenderer::updateSeries(const QList &seriesList, - bool updateVisibility) +void Abstract3DRenderer::updateSeries(const QList &seriesList) { - int visibleCount = 0; - if (updateVisibility) { - int oldSize = m_visibleSeriesList.size(); - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - visibleCount++; + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setValid(false); + + m_visibleSeriesCount = 0; + int seriesCount = seriesList.size(); + for (int i = 0; i < seriesCount; i++) { + QAbstract3DSeries *series = seriesList.at(i); + SeriesRenderCache *cache = m_renderCacheList.value(series); + bool newSeries = false; + if (!cache) { + cache = createNewCache(series); + m_renderCacheList[series] = cache; + newSeries = true; } + cache->setValid(true); + cache->populate(newSeries); + if (cache->isVisible()) + m_visibleSeriesCount++; + } - // Clean up series caches that are about to be permanently deleted. - // Can't just use cache destructor, as resize will call that to all items. - if (visibleCount < oldSize) { - for (int i = visibleCount; i < oldSize; i++) - m_visibleSeriesList[i].cleanup(m_textureHelper); - } + // Remove non-valid objects from the cache list + foreach (SeriesRenderCache *cache, m_renderCacheList) { + if (!cache->isValid()) + cleanCache(cache); + } +} - if (visibleCount != oldSize) - m_visibleSeriesList.resize(visibleCount); +SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) +{ + return new SeriesRenderCache(series, this); +} - visibleCount = 0; - } - foreach (QAbstract3DSeries *current, seriesList) { - if (current->isVisible()) - m_visibleSeriesList[visibleCount++].populate(current, this); - } +void Abstract3DRenderer::cleanCache(SeriesRenderCache *cache) +{ + m_renderCacheList.remove(cache->series()); + cache->cleanup(m_textureHelper); + delete cache; } AxisRenderCache &Abstract3DRenderer::axisCacheForOrientation( diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index f5ca8d02..ce21deff 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -61,8 +61,9 @@ public: virtual ~Abstract3DRenderer(); virtual void updateData() = 0; - virtual void updateSeries(const QList &seriesList, bool updateVisibility); - + virtual void updateSeries(const QList &seriesList); + virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); + virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); virtual void updateTheme(Q3DTheme *theme); @@ -96,6 +97,7 @@ public: const QString &format); virtual void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, QValue3DAxisFormatter *formatter); + virtual void modifiedSeriesList(const QVector &seriesList); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void generateBaseColorTexture(const QColor &color, GLuint *texture); @@ -147,7 +149,7 @@ protected: bool m_selectionDirty; SelectionState m_selectionState; QPoint m_inputPosition; - QVector m_visibleSeriesList; + QHash m_renderCacheList; QRect m_primarySubViewport; QRect m_secondarySubViewport; float m_devicePixelRatio; @@ -158,6 +160,7 @@ protected: QString m_selectionLabel; LabelItem *m_selectionLabelItem; + int m_visibleSeriesCount; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 49b6f383..38870115 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -108,6 +108,8 @@ void Bars3DController::handleArrayReset() m_isDataDirty = true; series->d_ptr->markItemLabelDirty(); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); // Clear selection unless still valid setSelectedBar(m_selectedBar, m_selectedBarSeries, false); emitNeedRender(); @@ -122,6 +124,8 @@ void Bars3DController::handleRowsAdded(int startIndex, int count) adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -135,6 +139,8 @@ void Bars3DController::handleRowsChanged(int startIndex, int count) m_isDataDirty = true; series->d_ptr->markItemLabelDirty(); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -161,6 +167,8 @@ void Bars3DController::handleRowsRemoved(int startIndex, int count) adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -183,6 +191,8 @@ void Bars3DController::handleRowsInserted(int startIndex, int count) adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -197,6 +207,8 @@ void Bars3DController::handleItemChanged(int rowIndex, int columnIndex) m_isDataDirty = true; series->d_ptr->markItemLabelDirty(); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -240,8 +252,6 @@ void Bars3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { Abstract3DController::handleSeriesVisibilityChangedBySender(sender); - adjustAxisRanges(); - // Visibility changes may require disabling slicing, // so just reset selection to ensure everything is still valid. setSelectedBar(m_selectedBar, m_selectedBarSeries, false); @@ -341,9 +351,6 @@ void Bars3DController::insertSeries(int index, QAbstract3DSeries *series) Abstract3DController::insertSeries(index, series); if (oldSize != m_seriesList.size()) { - if (series->isVisible()) - adjustAxisRanges(); - QBar3DSeries *barSeries = static_cast(series); if (!oldSize) { m_primarySeries = barSeries; diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 9ea59c89..33928306 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -118,6 +118,7 @@ public: virtual QList barSeriesList(); virtual void handleAxisRangeChangedBySender(QObject *sender); + virtual void adjustAxisRanges(); public slots: void handleArrayReset(); @@ -137,11 +138,9 @@ protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); private: - void adjustAxisRanges(); void adjustSelectionPosition(QPoint &pos, const QBar3DSeries *series); Q_DISABLE_COPY(Bars3DController) - }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 46df6464..6102adde 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -27,6 +27,7 @@ #include "qbardataitem.h" #include "q3dlight.h" #include "qbar3dseries_p.h" +#include "barseriesrendercache_p.h" #include #include @@ -83,17 +84,18 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_scaleFactor(0), m_maxSceneSize(40.0f), m_visualSelectedBarPos(Bars3DController::invalidSelectionPosition()), - m_visualSelectedBarSeriesIndex(-1), m_resetCameraBaseOrientation(true), m_selectedBarPos(Bars3DController::invalidSelectionPosition()), - m_selectedBarSeries(0), + m_selectedSeriesCache(0), m_noZeroInRange(false), m_seriesScaleX(0.0f), m_seriesScaleZ(0.0f), m_seriesStep(0.0f), m_seriesStart(0.0f), m_clickedPosition(Bars3DController::invalidSelectionPosition()), - m_keepSeriesUniform(false) + m_keepSeriesUniform(false), + m_haveUniformColorSeries(false), + m_haveGradientSeries(false) { m_axisCacheY.setScale(2.0f); m_axisCacheY.setTranslate(-1.0f); @@ -151,7 +153,6 @@ void Bars3DRenderer::initializeOpenGL() void Bars3DRenderer::updateData() { - int seriesCount = m_visibleSeriesList.size(); int minRow = m_axisCacheZ.min(); int maxRow = m_axisCacheZ.max(); int minCol = m_axisCacheX.min(); @@ -162,12 +163,9 @@ void Bars3DRenderer::updateData() int dataRowCount = 0; int maxDataRowCount = 0; - if (m_renderingArrays.size() != seriesCount) { - m_renderingArrays.resize(seriesCount); - m_seriesScaleX = 1.0f / float(seriesCount); - m_seriesStep = 1.0f / float(seriesCount); - m_seriesStart = -((float(seriesCount) - 1.0f) / 2.0f) * m_seriesStep; - } + m_seriesScaleX = 1.0f / float(m_visibleSeriesCount); + m_seriesStep = 1.0f / float(m_visibleSeriesCount); + m_seriesStart = -((float(m_visibleSeriesCount) - 1.0f) / 2.0f) * m_seriesStep; if (m_keepSeriesUniform) m_seriesScaleZ = m_seriesScaleX; @@ -178,7 +176,6 @@ void Bars3DRenderer::updateData() // Force update for selection related items m_sliceCache = 0; m_sliceTitleItem = 0; - m_sliceSelection.clear(); m_cachedColumnCount = newColumns; m_cachedRowCount = newRows; @@ -192,95 +189,121 @@ void Bars3DRenderer::updateData() const QValue3DAxisFormatter *axisFormatter = m_axisCacheY.formatter(); float zeroPosition = axisFormatter->positionAt(0.0f); - for (int series = 0; series < seriesCount; series++) { - BarRenderItemArray &renderArray = m_renderingArrays[series]; - if (newRows != renderArray.size() - || newColumns != renderArray.at(0).size()) { - // Destroy old render items and reallocate new array - renderArray.resize(newRows); - for (int i = 0; i < newRows; i++) - renderArray[i].resize(newColumns); - } - // Update cached data window - QBarDataProxy *dataProxy = - static_cast(m_visibleSeriesList.at(series).series())->dataProxy(); - dataRowCount = dataProxy->rowCount(); - if (maxDataRowCount < dataRowCount) - maxDataRowCount = qMin(dataRowCount, newRows); - int dataRowIndex = minRow; - GLfloat heightValue = 0.0f; - for (int i = 0; i < newRows; i++) { - int j = 0; - BarRenderItemRow &renderRow = renderArray[i]; - if (dataRowIndex < dataRowCount) { - const QBarDataRow *dataRow = dataProxy->rowAt(dataRowIndex); - updateSize = qMin((dataRow->size() - minCol), renderRow.size()); - if (dataRow) { - int dataColIndex = minCol; - for (; j < updateSize ; j++) { - float value = dataRow->at(dataColIndex).value(); - heightValue = axisFormatter->positionAt(value); - if (m_noZeroInRange) { - if (m_hasNegativeValues) { - heightValue = -1.0f + heightValue; - if (heightValue > 0.0f) - heightValue = 0.0f; - } else { - if (heightValue < 0.0f) - heightValue = 0.0f; + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + BarSeriesRenderCache *cache = static_cast(baseCache); + if (cache->isVisible()) { + const QBar3DSeries *currentSeries = cache->series(); + BarRenderItemArray &renderArray = cache->renderArray(); + bool dimensionsChanged = false; + if (newRows != renderArray.size() + || newColumns != renderArray.at(0).size()) { + // Destroy old render items and reallocate new array + dimensionsChanged = true; + renderArray.resize(newRows); + for (int i = 0; i < newRows; i++) + renderArray[i].resize(newColumns); + cache->sliceArray().clear(); + } + + if (cache->dataDirty() || dimensionsChanged) { + QBarDataProxy *dataProxy = currentSeries->dataProxy(); + dataRowCount = dataProxy->rowCount(); + if (maxDataRowCount < dataRowCount) + maxDataRowCount = qMin(dataRowCount, newRows); + int dataRowIndex = minRow; + GLfloat heightValue = 0.0f; + for (int i = 0; i < newRows; i++) { + int j = 0; + BarRenderItemRow &renderRow = renderArray[i]; + if (dataRowIndex < dataRowCount) { + const QBarDataRow *dataRow = dataProxy->rowAt(dataRowIndex); + updateSize = qMin((dataRow->size() - minCol), renderRow.size()); + if (dataRow) { + int dataColIndex = minCol; + for (; j < updateSize ; j++) { + float value = dataRow->at(dataColIndex).value(); + heightValue = axisFormatter->positionAt(value); + if (m_noZeroInRange) { + if (m_hasNegativeValues) { + heightValue = -1.0f + heightValue; + if (heightValue > 0.0f) + heightValue = 0.0f; + } else { + if (heightValue < 0.0f) + heightValue = 0.0f; + } + } else { + heightValue -= zeroPosition; + } + renderRow[j].setValue(value); + renderRow[j].setHeight(heightValue); + + float angle = dataRow->at(dataColIndex).rotation(); + if (angle) { + renderRow[j].setRotation( + QQuaternion::fromAxisAndAngle( + upVector, angle)); + } else { + renderRow[j].setRotation(identityQuaternion); + } + dataColIndex++; } - } else { - heightValue -= zeroPosition; - } - renderRow[j].setValue(value); - renderRow[j].setHeight(heightValue); - - float angle = dataRow->at(dataColIndex).rotation(); - if (angle) { - renderRow[j].setRotation( - QQuaternion::fromAxisAndAngle( - upVector, angle)); - } else { - renderRow[j].setRotation(identityQuaternion); } - dataColIndex++; } + for (; j < newColumns; j++) { + renderRow[j].setValue(0.0f); + renderRow[j].setHeight(0.0f); + renderRow[j].setRotation(identityQuaternion); + } + dataRowIndex++; } + cache->setDataDirty(false); } - for (; j < m_renderingArrays.at(series).at(i).size(); j++) { - renderRow[j].setValue(0.0f); - renderRow[j].setHeight(0.0f); - renderRow[j].setRotation(identityQuaternion); - } - dataRowIndex++; } } // Reset selected bar to update selection - updateSelectedBar(m_selectedBarPos, m_selectedBarSeries); + updateSelectedBar(m_selectedBarPos, + m_selectedSeriesCache ? m_selectedSeriesCache->series() : 0); } -void Bars3DRenderer::updateSeries(const QList &seriesList, - bool updateVisibility) +void Bars3DRenderer::updateSeries(const QList &seriesList) { - Abstract3DRenderer::updateSeries(seriesList, updateVisibility); + Abstract3DRenderer::updateSeries(seriesList); bool noSelection = true; - int seriesCount = m_visibleSeriesList.size(); - for (int i = 0; i < seriesCount; i++) { - QBar3DSeries *barSeries = static_cast(m_visibleSeriesList.at(i).series()); - if (noSelection - && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition() - && selectionLabel() != m_visibleSeriesList.at(i).itemLabel()) { - m_selectionLabelDirty = true; - noSelection = false; + int seriesCount = seriesList.size(); + int visualIndex = 0; + m_haveUniformColorSeries = false; + m_haveGradientSeries = false; + for (int i = 0 ; i < seriesCount; i++) { + QBar3DSeries *barSeries = static_cast(seriesList[i]); + if (barSeries->isVisible()) { + BarSeriesRenderCache *cache = + static_cast(m_renderCacheList.value(barSeries)); + if (noSelection + && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition() + && selectionLabel() != cache->itemLabel()) { + m_selectionLabelDirty = true; + noSelection = false; + } + cache->setVisualIndex(visualIndex++); + if (cache->colorStyle() == Q3DTheme::ColorStyleUniform) + m_haveUniformColorSeries = true; + else + m_haveGradientSeries = true; } } if (noSelection && !selectionLabel().isEmpty()) m_selectionLabelDirty = true; } +SeriesRenderCache *Bars3DRenderer::createNewCache(QAbstract3DSeries *series) +{ + return new BarSeriesRenderCache(series, this); +} + void Bars3DRenderer::updateScene(Q3DScene *scene) { if (m_hasNegativeValues) @@ -506,7 +529,6 @@ void Bars3DRenderer::drawSlicedScene() ShaderHelper *barShader = m_barShader; barShader->bind(); - int currentSeriesIndex = -1; Q3DTheme::ColorStyle previousColorStyle = Q3DTheme::ColorStyleUniform; Q3DTheme::ColorStyle colorStyle = Q3DTheme::ColorStyleUniform; ObjectHelper *barObj = 0; @@ -514,29 +536,31 @@ void Bars3DRenderer::drawSlicedScene() QVector3D baseColor; GLuint highlightGradientTexture = 0; GLuint baseGradientTexture = 0; - const SeriesRenderCache *currentSeries = 0; bool colorStyleIsUniform = true; + int firstVisualIndex = m_renderCacheList.size(); + QVector *firstVisualSliceArray = 0; + BarRenderSliceItem *selectedItem = 0; + + QQuaternion seriesRotation; + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + BarSeriesRenderCache *cache = static_cast(baseCache); + QVector &sliceArray = cache->sliceArray(); + int sliceCount = sliceArray.size(); + if (firstVisualIndex > cache->visualIndex()) { + firstVisualIndex = cache->visualIndex(); + firstVisualSliceArray = &sliceArray; + } - int sliceItemCount = m_sliceSelection.size(); - for (int bar = 0; bar < sliceItemCount; bar++) { - const BarRenderSliceItem &item = m_sliceSelection.at(bar); - if (!item.value()) - continue; - - QQuaternion seriesRotation; - - if (item.seriesIndex() != currentSeriesIndex) { - currentSeriesIndex = item.seriesIndex(); - currentSeries = &(m_visibleSeriesList.at(currentSeriesIndex)); - barObj = currentSeries->object(); - colorStyle = currentSeries->colorStyle(); + barObj = cache->object(); + colorStyle = cache->colorStyle(); colorStyleIsUniform = (colorStyle == Q3DTheme::ColorStyleUniform); if (colorStyleIsUniform) { - highlightColor = currentSeries->singleHighlightColor(); - baseColor = currentSeries->baseColor(); + highlightColor = cache->singleHighlightColor(); + baseColor = cache->baseColor(); } else { - highlightGradientTexture = currentSeries->singleHighlightGradientTexture(); - baseGradientTexture = currentSeries->baseGradientTexture(); + highlightGradientTexture = cache->singleHighlightGradientTexture(); + baseGradientTexture = cache->baseGradientTexture(); } // Rebind shader if it has changed @@ -555,76 +579,88 @@ void Bars3DRenderer::drawSlicedScene() } previousColorStyle = colorStyle; - seriesRotation = currentSeries->meshRotation(); - } + seriesRotation = cache->meshRotation(); + bool selectedSeries = (cache == m_selectedSeriesCache); + + for (int bar = 0; bar < sliceCount; bar++) { + BarRenderSliceItem &item = cache->sliceArray()[bar]; + if (selectedSeries && itemMode && sliceGridLabels + && m_visualSelectedBarPos.x() == item.position().x() + && m_visualSelectedBarPos.y() == item.position().y()) { + selectedItem = &item; + } + if (!item.value()) + continue; - if (item.height() < 0) - glCullFace(GL_FRONT); - else - glCullFace(GL_BACK); + if (item.height() < 0) + glCullFace(GL_FRONT); + else + glCullFace(GL_BACK); - QMatrix4x4 MVPMatrix; - QMatrix4x4 modelMatrix; - QMatrix4x4 itModelMatrix; - QQuaternion barRotation = item.rotation(); - GLfloat barPosY = item.translation().y() + barPosYAdjustment - zeroPosAdjustment; - - if (rowMode) { - barPosX = item.translation().x(); - } else { - barPosX = -(item.translation().z()); // flip z; frontmost bar to the left - barRotation *= ninetyDegreeRotation; - } + QMatrix4x4 MVPMatrix; + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + QQuaternion barRotation = item.rotation(); + GLfloat barPosY = item.translation().y() + barPosYAdjustment - zeroPosAdjustment; - modelMatrix.translate(barPosX, barPosY, 0.0f); - modelMatrixScaler.setY(item.height()); + if (rowMode) { + barPosX = item.translation().x(); + } else { + barPosX = -(item.translation().z()); // flip z; frontmost bar to the left + barRotation *= ninetyDegreeRotation; + } - if (!seriesRotation.isIdentity()) - barRotation *= seriesRotation; + modelMatrix.translate(barPosX, barPosY, 0.0f); + modelMatrixScaler.setY(item.height()); - if (!barRotation.isIdentity()) { - modelMatrix.rotate(barRotation); - itModelMatrix.rotate(barRotation); - } + if (!seriesRotation.isIdentity()) + barRotation *= seriesRotation; - modelMatrix.scale(modelMatrixScaler); - itModelMatrix.scale(modelMatrixScaler); + if (!barRotation.isIdentity()) { + modelMatrix.rotate(barRotation); + itModelMatrix.rotate(barRotation); + } - MVPMatrix = projectionViewMatrix * modelMatrix; + modelMatrix.scale(modelMatrixScaler); + itModelMatrix.scale(modelMatrixScaler); - QVector3D barColor; - GLuint gradientTexture = 0; + MVPMatrix = projectionViewMatrix * modelMatrix; - if (itemMode && m_visualSelectedBarPos.x() == item.position().x() - && m_visualSelectedBarPos.y() == item.position().y()) { - if (colorStyleIsUniform) - barColor = highlightColor; - else - gradientTexture = highlightGradientTexture; - } else { - if (colorStyleIsUniform) - barColor = baseColor; - else - gradientTexture = baseGradientTexture; - } + QVector3D barColor; + GLuint gradientTexture = 0; - if (item.height() != 0) { - // Set shader bindings - barShader->setUniformValue(barShader->model(), modelMatrix); - barShader->setUniformValue(barShader->nModel(), - itModelMatrix.inverted().transposed()); - barShader->setUniformValue(barShader->MVP(), MVPMatrix); - if (colorStyleIsUniform) { - barShader->setUniformValue(barShader->color(), barColor); - } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { - barShader->setUniformValue(barShader->gradientHeight(), - (qAbs(item.height()) / m_gradientFraction)); - } + if (itemMode && m_visualSelectedBarPos.x() == item.position().x() + && m_visualSelectedBarPos.y() == item.position().y()) { + if (colorStyleIsUniform) + barColor = highlightColor; + else + gradientTexture = highlightGradientTexture; + } else { + if (colorStyleIsUniform) + barColor = baseColor; + else + gradientTexture = baseGradientTexture; + } - // Draw the object - m_drawer->drawObject(barShader, - barObj, - gradientTexture); + if (item.height() != 0) { + // Set shader bindings + barShader->setUniformValue(barShader->model(), modelMatrix); + barShader->setUniformValue(barShader->nModel(), + itModelMatrix.inverted().transposed()); + barShader->setUniformValue(barShader->MVP(), MVPMatrix); + if (colorStyleIsUniform) { + barShader->setUniformValue(barShader->color(), barColor); + } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + barShader->setUniformValue(barShader->gradientHeight(), + (qAbs(item.height()) / m_gradientFraction)); + } + + // Draw the object + m_drawer->drawObject(barShader, + barObj, + gradientTexture); + } + } } } @@ -644,11 +680,11 @@ void Bars3DRenderer::drawSlicedScene() QVector3D sliceValueRotation(0.0f, 0.0f, 90.0f); QVector3D sliceLabelRotation(0.0f, 0.0f, -45.0f); - int lastLabel = m_sliceCache->labelItems().size() - 1; + int labelCount = m_sliceCache->labelItems().size(); - for (int labelNo = 0; labelNo <= lastLabel; labelNo++) { + for (int labelNo = 0; labelNo < labelCount; labelNo++) { // Get labels from first series only - const BarRenderSliceItem &item = m_sliceSelection.at(labelNo); + const BarRenderSliceItem &item = firstVisualSliceArray->at(labelNo); m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barLabelYPos, item.translation().z())); @@ -660,60 +696,63 @@ void Bars3DRenderer::drawSlicedScene() Qt::AlignRight, true); } - for (int col = 0; col < sliceItemCount; col++) { - BarRenderSliceItem &item = m_sliceSelection[col]; - - if (!sliceGridLabels) { - // Draw values - if (item.height() != 0.0f || (!m_noZeroInRange && item.value() == 0.0f)) { - // Create label texture if we need it - if (item.sliceLabel().isNull() || m_updateLabels) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(item.value()), m_axisCacheY.labelFormat()); - item.setSliceLabel(valueLabelText); - m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); - m_updateLabels = false; - } - Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; - Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; - m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), - barPosYAdjustment - zeroPosAdjustment - + item.height(), - item.translation().z())); - - m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, - projectionMatrix, zeroVector, sliceValueRotation, - item.height(), m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, labelPos, - alignment, true); - } - } else { - // Only draw value for selected item when grid labels are on - if (itemMode && m_visualSelectedBarPos.x() == item.position().x() - && m_visualSelectedBarPos.y() == item.position().y() - && item.seriesIndex() == m_visualSelectedBarSeriesIndex) { - // Create label texture if we need it - if (item.sliceLabel().isNull() || m_updateLabels) { - QString valueLabelText = m_axisCacheY.formatter()->stringForValue( - qreal(item.value()), m_axisCacheY.labelFormat()); - item.setSliceLabel(valueLabelText); - m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); - m_updateLabels = false; + if (!sliceGridLabels) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + BarSeriesRenderCache *cache = static_cast(baseCache); + QVector &sliceArray = cache->sliceArray(); + int sliceCount = sliceArray.size(); + for (int col = 0; col < sliceCount; col++) { + BarRenderSliceItem &item = sliceArray[col]; + + // Draw values + if (item.height() != 0.0f || (!m_noZeroInRange && item.value() == 0.0f)) { + // Create label texture if we need it + if (item.sliceLabel().isNull() || m_updateLabels) { + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + qreal(item.value()), m_axisCacheY.labelFormat()); + item.setSliceLabel(valueLabelText); + m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); + m_updateLabels = false; + } + Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), + barPosYAdjustment - zeroPosAdjustment + + item.height(), + item.translation().z())); + + m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, + projectionMatrix, zeroVector, sliceValueRotation, + item.height(), m_cachedSelectionMode, m_labelShader, + m_labelObj, activeCamera, false, false, labelPos, + alignment, true); + } } - Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; - Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; - m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), - barPosYAdjustment - zeroPosAdjustment - + item.height(), - item.translation().z())); - - m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, - projectionMatrix, zeroVector, sliceValueRotation, - item.height(), m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, labelPos, - alignment, true); } } + } else { + // Only draw value for selected item when grid labels are on + // Create label texture if we need it + if (selectedItem->sliceLabel().isNull() || m_updateLabels) { + QString valueLabelText = m_axisCacheY.formatter()->stringForValue( + qreal(selectedItem->value()), m_axisCacheY.labelFormat()); + selectedItem->setSliceLabel(valueLabelText); + m_drawer->generateLabelItem(selectedItem->sliceLabelItem(), selectedItem->sliceLabel()); + m_updateLabels = false; + } + Qt::AlignmentFlag alignment = (selectedItem->height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Drawer::LabelPosition labelPos = (selectedItem->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + m_dummyBarRenderItem.setTranslation(QVector3D(selectedItem->translation().x(), + barPosYAdjustment - zeroPosAdjustment + + selectedItem->height(), + selectedItem->translation().z())); + + m_drawer->drawLabel(m_dummyBarRenderItem, selectedItem->sliceLabelItem(), viewMatrix, + projectionMatrix, zeroVector, sliceValueRotation, + selectedItem->height(), m_cachedSelectionMode, m_labelShader, + m_labelObj, activeCamera, false, false, labelPos, + alignment, true); } // Draw labels for axes @@ -773,8 +812,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); - int seriesCount = m_visibleSeriesList.size(); - const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); glViewport(m_primarySubViewport.x(), @@ -880,70 +917,74 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Draw bars to depth buffer QVector3D shadowScaler(m_scaleX * m_seriesScaleX * 0.9f, 0.0f, m_scaleZ * m_seriesScaleZ * 0.9f); - float seriesPos = m_seriesStart; - for (int series = 0; series < seriesCount; series++) { - ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); - QQuaternion seriesRotation(m_visibleSeriesList.at(series).meshRotation()); - for (int row = startRow; row != stopRow; row += stepRow) { - for (int bar = startBar; bar != stopBar; bar += stepBar) { - GLfloat shadowOffset = 0.0f; - const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); - if (!item.value()) - continue; - // Set front face culling for negative valued bars and back face culling for - // positive valued bars to remove peter-panning issues - if (item.height() > 0) { - glCullFace(GL_BACK); - if (m_yFlipped) - shadowOffset = 0.015f; - } else { - glCullFace(GL_FRONT); - if (!m_yFlipped) - shadowOffset = -0.015f; - } + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + BarSeriesRenderCache *cache = static_cast(baseCache); + float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + ObjectHelper *barObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + const BarRenderItemArray &renderArray = cache->renderArray(); + for (int row = startRow; row != stopRow; row += stepRow) { + const BarRenderItemRow &renderRow = renderArray.at(row); + for (int bar = startBar; bar != stopBar; bar += stepBar) { + const BarRenderItem &item = renderRow.at(bar); + if (!item.value()) + continue; + GLfloat shadowOffset = 0.0f; + // Set front face culling for negative valued bars and back face culling + // for positive valued bars to remove peter-panning issues + if (item.height() > 0) { + glCullFace(GL_BACK); + if (m_yFlipped) + shadowOffset = 0.015f; + } else { + glCullFace(GL_FRONT); + if (!m_yFlipped) + shadowOffset = -0.015f; + } - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; + QMatrix4x4 modelMatrix; + QMatrix4x4 MVPMatrix; - colPos = (bar + 0.5f + seriesPos) * (m_cachedBarSpacing.width()); - rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); + colPos = (bar + seriesPos) * (m_cachedBarSpacing.width()); + rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); - // Draw shadows for bars "on the other side" a bit off ground to avoid seeing - // shadows through the ground - modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, - item.height() + shadowOffset, - (m_columnDepth - rowPos) / m_scaleFactor); - // Scale the bars down in X and Z to reduce self-shadowing issues - shadowScaler.setY(item.height()); - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) - modelMatrix.rotate(seriesRotation * item.rotation()); - modelMatrix.scale(shadowScaler); + // Draw shadows for bars "on the other side" a bit off ground to avoid + // seeing shadows through the ground + modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, + item.height() + shadowOffset, + (m_columnDepth - rowPos) / m_scaleFactor); + // Scale the bars down in X and Z to reduce self-shadowing issues + shadowScaler.setY(item.height()); + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) + modelMatrix.rotate(seriesRotation * item.rotation()); + modelMatrix.scale(shadowScaler); - MVPMatrix = depthProjectionViewMatrix * modelMatrix; + MVPMatrix = depthProjectionViewMatrix * modelMatrix; - m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); + m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); - // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_depthShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf()); - glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, - (void *)0); + // 1st attribute buffer : vertices + glEnableVertexAttribArray(m_depthShader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, barObj->vertexBuf()); + glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, + (void *)0); - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf()); + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, barObj->elementBuf()); - // Draw the triangles - glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT, - (void *)0); + // Draw the triangles + glDrawElements(GL_TRIANGLES, barObj->indexCount(), GL_UNSIGNED_SHORT, + (void *)0); - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); + // Free buffers + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glDisableVertexAttribArray(m_depthShader->posAtt()); + glDisableVertexAttribArray(m_depthShader->posAtt()); + } } } - seriesPos += m_seriesStep; } // Disable drawing to depth framebuffer (= enable drawing to screen) @@ -962,7 +1003,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Skip selection mode drawing if we're slicing or have no selection mode if (!m_cachedIsSlicingActivated && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone - && m_selectionState == SelectOnScene && seriesCount > 0) { + && m_selectionState == SelectOnScene && m_visibleSeriesCount > 0) { // Bind selection shader m_selectionShader->bind(); @@ -976,50 +1017,54 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // Set clear color to white (= selectionSkipColor) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Needed for clearing the frame buffer glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled - float seriesPos = m_seriesStart; - for (int series = 0; series < seriesCount; series++) { - ObjectHelper *barObj = m_visibleSeriesList.at(series).object(); - QQuaternion seriesRotation(m_visibleSeriesList.at(series).meshRotation()); - for (int row = startRow; row != stopRow; row += stepRow) { - for (int bar = startBar; bar != stopBar; bar += stepBar) { - const BarRenderItem &item = m_renderingArrays.at(series).at(row).at(bar); - if (!item.value()) - continue; - - if (item.height() < 0) - glCullFace(GL_FRONT); - else - glCullFace(GL_BACK); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + BarSeriesRenderCache *cache = static_cast(baseCache); + float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + ObjectHelper *barObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + const BarRenderItemArray &renderArray = cache->renderArray(); + for (int row = startRow; row != stopRow; row += stepRow) { + const BarRenderItemRow &renderRow = renderArray.at(row); + for (int bar = startBar; bar != stopBar; bar += stepBar) { + const BarRenderItem &item = renderRow.at(bar); + if (!item.value()) + continue; + + if (item.height() < 0) + glCullFace(GL_FRONT); + else + glCullFace(GL_BACK); - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; + QMatrix4x4 modelMatrix; + QMatrix4x4 MVPMatrix; - colPos = (bar + 0.5f + seriesPos) * (m_cachedBarSpacing.width()); - rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); + colPos = (bar + seriesPos) * (m_cachedBarSpacing.width()); + rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); - modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, - item.height(), - (m_columnDepth - rowPos) / m_scaleFactor); - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) - modelMatrix.rotate(seriesRotation * item.rotation()); - modelMatrix.scale(QVector3D(m_scaleX * m_seriesScaleX, - item.height(), - m_scaleZ * m_seriesScaleZ)); + modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, + item.height(), + (m_columnDepth - rowPos) / m_scaleFactor); + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) + modelMatrix.rotate(seriesRotation * item.rotation()); + modelMatrix.scale(QVector3D(m_scaleX * m_seriesScaleX, + item.height(), + m_scaleZ * m_seriesScaleZ)); - MVPMatrix = projectionViewMatrix * modelMatrix; + MVPMatrix = projectionViewMatrix * modelMatrix; - QVector4D barColor = QVector4D(GLfloat(row) / 255.0f, - GLfloat(bar) / 255.0f, - GLfloat(series) / 255.0f, - itemAlpha); + QVector4D barColor = QVector4D(GLfloat(row) / 255.0f, + GLfloat(bar) / 255.0f, + GLfloat(cache->visualIndex()) / 255.0f, + itemAlpha); - m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); - m_selectionShader->setUniformValue(m_selectionShader->color(), barColor); + m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); + m_selectionShader->setUniformValue(m_selectionShader->color(), barColor); - m_drawer->drawSelectionObject(m_selectionShader, barObj); + m_drawer->drawSelectionObject(m_selectionShader, barObj); + } } } - seriesPos += m_seriesStep; } glCullFace(GL_BACK); drawLabels(true, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, @@ -1048,18 +1093,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) ShaderHelper *barShader = 0; GLuint gradientTexture = 0; Q3DTheme::ColorStyle previousColorStyle = Q3DTheme::ColorStyleUniform; - bool haveUniformColorSeries = false; - bool haveGradientSeries = false; - - for (int i = 0; i < seriesCount; i++) { - if (m_visibleSeriesList.at(i).colorStyle() == Q3DTheme::ColorStyleUniform) - haveUniformColorSeries = true; - else - haveGradientSeries = true; - } // Set unchanging shader bindings - if (haveGradientSeries) { + if (m_haveGradientSeries) { m_barGradientShader->bind(); m_barGradientShader->setUniformValue(m_barGradientShader->lightP(), lightPos); m_barGradientShader->setUniformValue(m_barGradientShader->view(), viewMatrix); @@ -1069,7 +1105,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_barGradientShader->setUniformValue(m_barGradientShader->lightColor(), lightColor); } - if (haveUniformColorSeries) { + if (m_haveUniformColorSeries) { m_barShader->bind(); m_barShader->setUniformValue(m_barShader->lightP(), lightPos); m_barShader->setUniformValue(m_barShader->view(), viewMatrix); @@ -1082,17 +1118,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) previousColorStyle = Q3DTheme::ColorStyleRangeGradient; } + int sliceReserveAmount = 0; if (m_selectionDirty && m_cachedIsSlicingActivated) { // Slice doesn't own its items, no need to delete them - just clear - m_sliceSelection.clear(); - int reserveAmount; if (rowMode) - reserveAmount = m_cachedColumnCount; + sliceReserveAmount = m_cachedColumnCount; else - reserveAmount = m_cachedRowCount; - if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) - reserveAmount *= m_visibleSeriesList.size(); - m_sliceSelection.resize(reserveAmount); + sliceReserveAmount = m_cachedRowCount; // Set slice cache, i.e. axis cache from where slice labels are taken if (rowMode) @@ -1115,225 +1147,220 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QVector3D barColor; QVector3D modelScaler(m_scaleX * m_seriesScaleX, 0.0f, m_scaleZ * m_seriesScaleZ); bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::invalidSelectionPosition()); - float seriesPos = m_seriesStart; - for (int series = 0; series < seriesCount; series++) { - const SeriesRenderCache ¤tSeries = m_visibleSeriesList.at(series); - QQuaternion seriesRotation(currentSeries.meshRotation()); - ObjectHelper *barObj = currentSeries.object(); - Q3DTheme::ColorStyle colorStyle = currentSeries.colorStyle(); - bool colorStyleIsUniform = (colorStyle == Q3DTheme::ColorStyleUniform); - - // Rebind shader if it has changed - if (colorStyleIsUniform != (previousColorStyle == Q3DTheme::ColorStyleUniform)) { - if (colorStyleIsUniform) - barShader = m_barShader; - else - barShader = m_barGradientShader; - barShader->bind(); - } + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + BarSeriesRenderCache *cache = static_cast(baseCache); + float seriesPos = m_seriesStart + m_seriesStep * cache->visualIndex() + 0.5f; + ObjectHelper *barObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + Q3DTheme::ColorStyle colorStyle = cache->colorStyle(); + BarRenderItemArray &renderArray = cache->renderArray(); + bool colorStyleIsUniform = (colorStyle == Q3DTheme::ColorStyleUniform); + if (sliceReserveAmount) + cache->sliceArray().resize(sliceReserveAmount); - if (colorStyleIsUniform) { - baseColor = currentSeries.baseColor(); - } else if ((previousColorStyle != colorStyle) - && (colorStyle == Q3DTheme::ColorStyleObjectGradient)) { - m_barGradientShader->setUniformValue(m_barGradientShader->gradientHeight(), 0.5f); - } + // Rebind shader if it has changed + if (colorStyleIsUniform != (previousColorStyle == Q3DTheme::ColorStyleUniform)) { + if (colorStyleIsUniform) + barShader = m_barShader; + else + barShader = m_barGradientShader; + barShader->bind(); + } - // Always use base color when no selection mode - if (m_cachedSelectionMode == QAbstract3DGraph::SelectionNone) { - if (colorStyleIsUniform) - barColor = baseColor; - else - gradientTexture = currentSeries.baseGradientTexture(); - } + if (colorStyleIsUniform) { + baseColor = cache->baseColor(); + } else if ((previousColorStyle != colorStyle) + && (colorStyle == Q3DTheme::ColorStyleObjectGradient)) { + m_barGradientShader->setUniformValue(m_barGradientShader->gradientHeight(), 0.5f); + } - previousColorStyle = colorStyle; - int sliceSeriesAdjust = 0; - if (m_selectionDirty && m_cachedIsSlicingActivated) { - int seriesMultiplier = 0; - if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) - seriesMultiplier = series; - if (rowMode) - sliceSeriesAdjust = seriesMultiplier * m_cachedColumnCount; - else - sliceSeriesAdjust = seriesMultiplier * m_cachedRowCount; - } + // Always use base color when no selection mode + if (m_cachedSelectionMode == QAbstract3DGraph::SelectionNone) { + if (colorStyleIsUniform) + barColor = baseColor; + else + gradientTexture = cache->baseGradientTexture(); + } - for (int row = startRow; row != stopRow; row += stepRow) { - for (int bar = startBar; bar != stopBar; bar += stepBar) { - BarRenderItem &item = m_renderingArrays[series][row][bar]; + previousColorStyle = colorStyle; - if (item.height() < 0) - glCullFace(GL_FRONT); - else - glCullFace(GL_BACK); + for (int row = startRow; row != stopRow; row += stepRow) { + BarRenderItemRow &renderRow = renderArray[row]; + for (int bar = startBar; bar != stopBar; bar += stepBar) { + BarRenderItem &item = renderRow[bar]; + if (item.height() < 0) + glCullFace(GL_FRONT); + else + glCullFace(GL_BACK); - QMatrix4x4 modelMatrix; - QMatrix4x4 itModelMatrix; - QMatrix4x4 MVPMatrix; + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + QMatrix4x4 MVPMatrix; - colPos = (bar + 0.5f + seriesPos) * (m_cachedBarSpacing.width()); - rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); - - modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, - item.height(), - (m_columnDepth - rowPos) / m_scaleFactor); - modelScaler.setY(item.height()); - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { - QQuaternion totalRotation = seriesRotation * item.rotation(); - modelMatrix.rotate(totalRotation); - itModelMatrix.rotate(totalRotation); - } - modelMatrix.scale(modelScaler); - itModelMatrix.scale(modelScaler); + colPos = (bar + seriesPos) * (m_cachedBarSpacing.width()); + rowPos = (row + 0.5f) * (m_cachedBarSpacing.height()); + + modelMatrix.translate((colPos - m_rowWidth) / m_scaleFactor, + item.height(), + (m_columnDepth - rowPos) / m_scaleFactor); + modelScaler.setY(item.height()); + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { + QQuaternion totalRotation = seriesRotation * item.rotation(); + modelMatrix.rotate(totalRotation); + itModelMatrix.rotate(totalRotation); + } + modelMatrix.scale(modelScaler); + itModelMatrix.scale(modelScaler); #ifdef SHOW_DEPTH_TEXTURE_SCENE - MVPMatrix = depthProjectionViewMatrix * modelMatrix; + MVPMatrix = depthProjectionViewMatrix * modelMatrix; #else - MVPMatrix = projectionViewMatrix * modelMatrix; + MVPMatrix = projectionViewMatrix * modelMatrix; #endif - GLfloat lightStrength = m_cachedTheme->lightStrength(); - GLfloat shadowLightStrength = adjustedLightStrength; - - if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { - Bars3DController::SelectionType selectionType = Bars3DController::SelectionNone; - if (somethingSelected) - selectionType = isSelected(row, bar, series); - - switch (selectionType) { - case Bars3DController::SelectionItem: { - if (colorStyleIsUniform) - barColor = currentSeries.singleHighlightColor(); - else - gradientTexture = currentSeries.singleHighlightGradientTexture(); - - lightStrength = m_cachedTheme->highlightLightStrength(); - shadowLightStrength = adjustedHighlightStrength; - // Insert position data into render item. We have no ownership, don't delete the previous one - if (!m_cachedIsSlicingActivated - && m_visualSelectedBarSeriesIndex == series) { - selectedBar = &item; - selectedBar->setPosition(QPoint(row, bar)); - item.setTranslation(modelMatrix.column(3).toVector3D()); - barSelectionFound = true; - } - if (m_selectionDirty && m_cachedIsSlicingActivated) { - QVector3D translation = modelMatrix.column(3).toVector3D(); - if (m_cachedSelectionMode & QAbstract3DGraph::SelectionColumn - && seriesCount > 1) { - translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) - * (m_cachedBarSpacing.height()))) - / m_scaleFactor); - } - item.setTranslation(translation); - item.setPosition(QPoint(row, bar)); - item.setSeriesIndex(series); - if (rowMode) - m_sliceSelection[sliceSeriesAdjust + bar].setItem(item); + GLfloat lightStrength = m_cachedTheme->lightStrength(); + GLfloat shadowLightStrength = adjustedLightStrength; + + if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { + Bars3DController::SelectionType selectionType = + Bars3DController::SelectionNone; + if (somethingSelected) + selectionType = isSelected(row, bar, cache); + + switch (selectionType) { + case Bars3DController::SelectionItem: { + if (colorStyleIsUniform) + barColor = cache->singleHighlightColor(); else - m_sliceSelection[sliceSeriesAdjust + row].setItem(item); - } - break; - } - case Bars3DController::SelectionRow: { - // Current bar is on the same row as the selected bar - if (colorStyleIsUniform) - barColor = currentSeries.multiHighlightColor(); - else - gradientTexture = currentSeries.multiHighlightGradientTexture(); - - lightStrength = m_cachedTheme->highlightLightStrength(); - shadowLightStrength = adjustedHighlightStrength; - if (m_cachedIsSlicingActivated) { - item.setTranslation(modelMatrix.column(3).toVector3D()); - item.setPosition(QPoint(row, bar)); - if (m_selectionDirty) { - item.setSeriesIndex(series); - if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > row) - m_sliceTitleItem = m_axisCacheZ.labelItems().at(row); - m_sliceSelection[sliceSeriesAdjust + bar].setItem(item); + gradientTexture = cache->singleHighlightGradientTexture(); + + lightStrength = m_cachedTheme->highlightLightStrength(); + shadowLightStrength = adjustedHighlightStrength; + // Insert position data into render item + // We have no ownership, don't delete the previous one + if (!m_cachedIsSlicingActivated + && m_selectedSeriesCache == cache) { + selectedBar = &item; + selectedBar->setPosition(QPoint(row, bar)); + item.setTranslation(modelMatrix.column(3).toVector3D()); + barSelectionFound = true; + } + if (m_selectionDirty && m_cachedIsSlicingActivated) { + QVector3D translation = modelMatrix.column(3).toVector3D(); + if (m_cachedSelectionMode & QAbstract3DGraph::SelectionColumn + && m_visibleSeriesCount > 1) { + translation.setZ((m_columnDepth + - ((row + seriesPos) + * (m_cachedBarSpacing.height()))) + / m_scaleFactor); + } + item.setTranslation(translation); + item.setPosition(QPoint(row, bar)); + if (rowMode) + cache->sliceArray()[bar].setItem(item); + else + cache->sliceArray()[row].setItem(item); } + break; } - break; - } - case Bars3DController::SelectionColumn: { - // Current bar is on the same column as the selected bar - if (colorStyleIsUniform) - barColor = currentSeries.multiHighlightColor(); - else - gradientTexture = currentSeries.multiHighlightGradientTexture(); - - lightStrength = m_cachedTheme->highlightLightStrength(); - shadowLightStrength = adjustedHighlightStrength; - if (m_cachedIsSlicingActivated) { - QVector3D translation = modelMatrix.column(3).toVector3D(); - if (seriesCount > 1) { - translation.setZ((m_columnDepth - ((row + 0.5f + seriesPos) - * (m_cachedBarSpacing.height()))) - / m_scaleFactor); + case Bars3DController::SelectionRow: { + // Current bar is on the same row as the selected bar + if (colorStyleIsUniform) + barColor = cache->multiHighlightColor(); + else + gradientTexture = cache->multiHighlightGradientTexture(); + + lightStrength = m_cachedTheme->highlightLightStrength(); + shadowLightStrength = adjustedHighlightStrength; + if (m_cachedIsSlicingActivated) { + item.setTranslation(modelMatrix.column(3).toVector3D()); + item.setPosition(QPoint(row, bar)); + if (m_selectionDirty) { + if (!m_sliceTitleItem && m_axisCacheZ.labelItems().size() > row) + m_sliceTitleItem = m_axisCacheZ.labelItems().at(row); + cache->sliceArray()[bar].setItem(item); + } } - item.setTranslation(translation); - item.setPosition(QPoint(row, bar)); - if (m_selectionDirty) { - item.setSeriesIndex(series); - if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > bar) - m_sliceTitleItem = m_axisCacheX.labelItems().at(bar); - m_sliceSelection[sliceSeriesAdjust + row].setItem(item); + break; + } + case Bars3DController::SelectionColumn: { + // Current bar is on the same column as the selected bar + if (colorStyleIsUniform) + barColor = cache->multiHighlightColor(); + else + gradientTexture = cache->multiHighlightGradientTexture(); + + lightStrength = m_cachedTheme->highlightLightStrength(); + shadowLightStrength = adjustedHighlightStrength; + if (m_cachedIsSlicingActivated) { + QVector3D translation = modelMatrix.column(3).toVector3D(); + if (m_visibleSeriesCount > 1) { + translation.setZ((m_columnDepth - ((row + seriesPos) + * (m_cachedBarSpacing.height()))) + / m_scaleFactor); + } + item.setTranslation(translation); + item.setPosition(QPoint(row, bar)); + if (m_selectionDirty) { + if (!m_sliceTitleItem && m_axisCacheX.labelItems().size() > bar) + m_sliceTitleItem = m_axisCacheX.labelItems().at(bar); + cache->sliceArray()[row].setItem(item); + } } + break; + } + case Bars3DController::SelectionNone: { + // Current bar is not selected, nor on a row or column + if (colorStyleIsUniform) + barColor = baseColor; + else + gradientTexture = cache->baseGradientTexture(); + break; + } } - break; - } - case Bars3DController::SelectionNone: { - // Current bar is not selected, nor on a row or column - if (colorStyleIsUniform) - barColor = baseColor; - else - gradientTexture = currentSeries.baseGradientTexture(); - break; - } } - } - // Skip drawing of 0-height bars - if (item.height() != 0) { - // Set shader bindings - barShader->setUniformValue(barShader->model(), modelMatrix); - barShader->setUniformValue(barShader->nModel(), - itModelMatrix.transposed().inverted()); - barShader->setUniformValue(barShader->MVP(), MVPMatrix); - if (colorStyleIsUniform) { - barShader->setUniformValue(barShader->color(), barColor); - } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { - barShader->setUniformValue(barShader->gradientHeight(), - qAbs(item.height()) / m_gradientFraction); - } + // Skip drawing of 0-height bars + if (item.height() != 0) { + // Set shader bindings + barShader->setUniformValue(barShader->model(), modelMatrix); + barShader->setUniformValue(barShader->nModel(), + itModelMatrix.transposed().inverted()); + barShader->setUniformValue(barShader->MVP(), MVPMatrix); + if (colorStyleIsUniform) { + barShader->setUniformValue(barShader->color(), barColor); + } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + barShader->setUniformValue(barShader->gradientHeight(), + qAbs(item.height()) / m_gradientFraction); + } #if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - // Set shadow shader bindings - QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; - barShader->setUniformValue(barShader->shadowQ(), m_shadowQualityToShader); - barShader->setUniformValue(barShader->depth(), depthMVPMatrix); - barShader->setUniformValue(barShader->lightS(), shadowLightStrength); - barShader->setUniformValue(barShader->lightColor(), lightColor); - - // Draw the object - m_drawer->drawObject(barShader, barObj, gradientTexture, m_depthTexture); - } else + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + // Set shadow shader bindings + QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; + barShader->setUniformValue(barShader->shadowQ(), m_shadowQualityToShader); + barShader->setUniformValue(barShader->depth(), depthMVPMatrix); + barShader->setUniformValue(barShader->lightS(), shadowLightStrength); + barShader->setUniformValue(barShader->lightColor(), lightColor); + + // Draw the object + m_drawer->drawObject(barShader, barObj, gradientTexture, m_depthTexture); + } else #else - Q_UNUSED(shadowLightStrength); + Q_UNUSED(shadowLightStrength); #endif - { - // Set shadowless shader bindings - barShader->setUniformValue(barShader->lightS(), lightStrength); + { + // Set shadowless shader bindings + barShader->setUniformValue(barShader->lightS(), lightStrength); - // Draw the object - m_drawer->drawObject(barShader, barObj, gradientTexture); + // Draw the object + m_drawer->drawObject(barShader, barObj, gradientTexture); + } } } } } - seriesPos += m_seriesStep; } + glDisable(GL_POLYGON_OFFSET_FILL); // Bind background shader @@ -1676,7 +1703,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) || m_selectionLabelDirty) { QString labelText = selectionLabel(); if (labelText.isNull() || m_selectionLabelDirty) { - labelText = m_visibleSeriesList[m_visualSelectedBarSeriesIndex].itemLabel(); + labelText = m_selectedSeriesCache->itemLabel(); setSelectionLabel(labelText); m_selectionLabelDirty = false; } @@ -1891,7 +1918,7 @@ void Bars3DRenderer::updateMultiSeriesScaling(bool uniform) m_keepSeriesUniform = uniform; // Recalculate scale factors - m_seriesScaleX = 1.0f / float(m_visibleSeriesList.size()); + m_seriesScaleX = 1.0f / float(m_visibleSeriesCount); if (m_keepSeriesUniform) m_seriesScaleZ = m_seriesScaleX; else @@ -1943,30 +1970,24 @@ void Bars3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientatio } } -void Bars3DRenderer::updateSelectedBar(const QPoint &position, const QBar3DSeries *series) +void Bars3DRenderer::updateSelectedBar(const QPoint &position, QBar3DSeries *series) { m_selectedBarPos = position; - m_selectedBarSeries = series; + m_selectedSeriesCache = static_cast(m_renderCacheList.value(series, 0)); m_selectionDirty = true; m_selectionLabelDirty = true; - m_visualSelectedBarSeriesIndex = -1; - if (m_renderingArrays.isEmpty()) { + if (!m_selectedSeriesCache + || !m_selectedSeriesCache->isVisible() + || m_selectedSeriesCache->renderArray().isEmpty()) { m_visualSelectedBarPos = Bars3DController::invalidSelectionPosition(); return; } int adjustedZ = m_selectedBarPos.x() - int(m_axisCacheZ.min()); int adjustedX = m_selectedBarPos.y() - int(m_axisCacheX.min()); - int maxZ = m_renderingArrays.at(0).size() - 1; - int maxX = maxZ >= 0 ? m_renderingArrays.at(0).at(0).size() - 1 : -1; - - for (int i = 0; i < m_visibleSeriesList.size(); i++) { - if (m_visibleSeriesList.at(i).series() == series) { - m_visualSelectedBarSeriesIndex = i; - break; - } - } + int maxZ = m_selectedSeriesCache->renderArray().size() - 1; + int maxX = maxZ >= 0 ? m_selectedSeriesCache->renderArray().at(0).size() - 1 : -1; if (m_selectedBarPos == Bars3DController::invalidSelectionPosition() || adjustedZ < 0 || adjustedZ > maxZ @@ -2113,13 +2134,13 @@ void Bars3DRenderer::calculateHeightAdjustment() } } -Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, int seriesIndex) +Bars3DController::SelectionType Bars3DRenderer::isSelected(int row, int bar, + const BarSeriesRenderCache *cache) { Bars3DController::SelectionType isSelectedType = Bars3DController::SelectionNone; if ((m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries) - && m_visualSelectedBarSeriesIndex >= 0) - || seriesIndex == m_visualSelectedBarSeriesIndex) { + && m_selectedSeriesCache) || cache == m_selectedSeriesCache) { if (row == m_visualSelectedBarPos.x() && bar == m_visualSelectedBarPos.y() && (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem))) { isSelectedType = Bars3DController::SelectionItem; @@ -2174,10 +2195,17 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC QBar3DSeries *Bars3DRenderer::selectionColorToSeries(const QVector4D &selectionColor) { - if (selectionColor == selectionSkipColor) + if (selectionColor == selectionSkipColor) { return 0; - else - return static_cast(m_visibleSeriesList.at(int(selectionColor.z())).series()); + } else { + int seriesIndexFromColor(selectionColor.z()); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + BarSeriesRenderCache *cache = static_cast(baseCache); + if (cache->visualIndex() == seriesIndexFromColor) + return cache->series(); + } + } + return 0; } void Bars3DRenderer::updateSlicingActive(bool isSlicing) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index fba5d830..549a63f6 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -45,6 +45,7 @@ class ShaderHelper; class ObjectHelper; class LabelItem; class Q3DScene; +class BarSeriesRenderCache; class QT_DATAVISUALIZATION_EXPORT Bars3DRenderer : public Abstract3DRenderer { @@ -60,7 +61,6 @@ private: // Internal state BarRenderItem *m_selectedBar; // points to renderitem array - QVector m_sliceSelection; AxisRenderCache *m_sliceCache; // not owned const LabelItem *m_sliceTitleItem; // not owned bool m_xFlipped; @@ -95,12 +95,10 @@ private: GLfloat m_scaleFactor; GLfloat m_maxSceneSize; QPoint m_visualSelectedBarPos; - int m_visualSelectedBarSeriesIndex; bool m_resetCameraBaseOrientation; QPoint m_selectedBarPos; - const QBar3DSeries *m_selectedBarSeries; + BarSeriesRenderCache *m_selectedSeriesCache; BarRenderItem m_dummyBarRenderItem; - QVector m_renderingArrays; bool m_noZeroInRange; float m_seriesScaleX; float m_seriesScaleZ; @@ -108,13 +106,16 @@ private: float m_seriesStart; QPoint m_clickedPosition; bool m_keepSeriesUniform; + bool m_haveUniformColorSeries; + bool m_haveGradientSeries; public: explicit Bars3DRenderer(Bars3DController *controller); ~Bars3DRenderer(); void updateData(); - void updateSeries(const QList &seriesList, bool updateVisibility); + void updateSeries(const QList &seriesList); + SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); @@ -127,7 +128,7 @@ public slots: const QSizeF &spacing = QSizeF(1.0, 1.0), bool relative = true); void updateSlicingActive(bool isSlicing); - void updateSelectedBar(const QPoint &position, const QBar3DSeries *series); + void updateSelectedBar(const QPoint &position, QBar3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } void resetClickedStatus(); @@ -161,7 +162,8 @@ private: #endif void calculateSceneScalingFactors(); void calculateHeightAdjustment(); - Abstract3DController::SelectionType isSelected(int row, int bar, int seriesIndex); + Abstract3DController::SelectionType isSelected(int row, int bar, + const BarSeriesRenderCache *cache); QPoint selectionColorToArrayPosition(const QVector4D &selectionColor); QBar3DSeries *selectionColorToSeries(const QVector4D &selectionColor); diff --git a/src/datavisualization/engine/barseriesrendercache.cpp b/src/datavisualization/engine/barseriesrendercache.cpp new file mode 100644 index 00000000..83d3e366 --- /dev/null +++ b/src/datavisualization/engine/barseriesrendercache.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "barseriesrendercache_p.h" +#include "bars3drenderer_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +BarSeriesRenderCache::BarSeriesRenderCache(QAbstract3DSeries *series, + Abstract3DRenderer *renderer) + : SeriesRenderCache(series, renderer), + m_visualIndex(-1) +{ +} + +BarSeriesRenderCache::~BarSeriesRenderCache() +{ +} + +void BarSeriesRenderCache::cleanup(TextureHelper *texHelper) +{ + m_renderArray.clear(); + m_sliceArray.clear(); + + SeriesRenderCache::cleanup(texHelper); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/barseriesrendercache_p.h b/src/datavisualization/engine/barseriesrendercache_p.h new file mode 100644 index 00000000..4e169300 --- /dev/null +++ b/src/datavisualization/engine/barseriesrendercache_p.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef BARSERIESRENDERCACHE_P_H +#define BARSERIESRENDERCACHE_P_H + +#include "datavisualizationglobal_p.h" +#include "seriesrendercache_p.h" +#include "qbar3dseries_p.h" +#include "barrenderitem_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class BarSeriesRenderCache : public SeriesRenderCache +{ +public: + BarSeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer); + virtual ~BarSeriesRenderCache(); + + void cleanup(TextureHelper *texHelper); + + inline BarRenderItemArray &renderArray() { return m_renderArray; } + inline QBar3DSeries *series() const { return static_cast(m_series); } + inline QVector &sliceArray() { return m_sliceArray; } + inline void setVisualIndex(int index) { m_visualIndex = index; } + inline int visualIndex() {return m_visualIndex; } + +protected: + BarRenderItemArray m_renderArray; + QVector m_sliceArray; + int m_visualIndex; // order of the series is relevant +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/engine/engine.pri b/src/datavisualization/engine/engine.pri index 9c2e71e4..96fa7fa9 100644 --- a/src/datavisualization/engine/engine.pri +++ b/src/datavisualization/engine/engine.pri @@ -26,7 +26,9 @@ HEADERS += $$PWD/qabstract3dgraph_p.h \ $$PWD/q3dobject.h \ $$PWD/q3dobject_p.h \ $$PWD/q3dscene_p.h \ - $$PWD/surfaceseriesrendercache_p.h + $$PWD/surfaceseriesrendercache_p.h \ + $$PWD/barseriesrendercache_p.h \ + $$PWD/scatterseriesrendercache_p.h SOURCES += $$PWD/qabstract3dgraph.cpp \ $$PWD/q3dbars.cpp \ @@ -48,7 +50,9 @@ SOURCES += $$PWD/qabstract3dgraph.cpp \ $$PWD/q3dlight.cpp \ $$PWD/q3dobject.cpp \ $$PWD/q3dscene.cpp \ - $$PWD/surfaceseriesrendercache.cpp + $$PWD/surfaceseriesrendercache.cpp \ + $$PWD/barseriesrendercache.cpp \ + $$PWD/scatterseriesrendercache.cpp RESOURCES += engine/engine.qrc diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index b45a956d..05c0efe7 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -83,9 +83,6 @@ void Scatter3DController::addSeries(QAbstract3DSeries *series) Abstract3DController::addSeries(series); - if (series->isVisible()) - adjustValueAxisRange(); - QScatter3DSeries *scatterSeries = static_cast(series); if (scatterSeries->selectedItem() != invalidSelectionIndex()) setSelectedItem(scatterSeries->selectedItem(), scatterSeries); @@ -101,7 +98,7 @@ void Scatter3DController::removeSeries(QAbstract3DSeries *series) setSelectedItem(invalidSelectionIndex(), 0); if (wasVisible) - adjustValueAxisRange(); + adjustAxisRanges(); } QList Scatter3DController::scatterSeriesList() @@ -121,9 +118,11 @@ void Scatter3DController::handleArrayReset() { QScatter3DSeries *series = static_cast(sender())->series(); if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); setSelectedItem(m_selectedItem, m_selectedItemSeries); series->d_ptr->markItemLabelDirty(); emitNeedRender(); @@ -135,9 +134,11 @@ void Scatter3DController::handleItemsAdded(int startIndex, int count) Q_UNUSED(count) QScatter3DSeries *series = static_cast(sender())->series(); if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -147,10 +148,12 @@ void Scatter3DController::handleItemsChanged(int startIndex, int count) Q_UNUSED(count) QScatter3DSeries *series = static_cast(sender())->series(); if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; series->d_ptr->markItemLabelDirty(); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -173,9 +176,11 @@ void Scatter3DController::handleItemsRemoved(int startIndex, int count) } if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); if (m_recordInsertsAndRemoves) { InsertRemoveRecord record(false, startIndex, count, series); @@ -200,9 +205,11 @@ void Scatter3DController::handleItemsInserted(int startIndex, int count) } if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); if (m_recordInsertsAndRemoves) { InsertRemoveRecord record(true, startIndex, count, series); @@ -231,7 +238,7 @@ void Scatter3DController::handleAxisAutoAdjustRangeChangedInOrientation( { Q_UNUSED(orientation) Q_UNUSED(autoAdjust) - adjustValueAxisRange(); + adjustAxisRanges(); } void Scatter3DController::handleAxisRangeChangedBySender(QObject *sender) @@ -242,13 +249,6 @@ void Scatter3DController::handleAxisRangeChangedBySender(QObject *sender) setSelectedItem(m_selectedItem, m_selectedItemSeries); } -void Scatter3DController::handleSeriesVisibilityChangedBySender(QObject *sender) -{ - Abstract3DController::handleSeriesVisibilityChangedBySender(sender); - - adjustValueAxisRange(); -} - void Scatter3DController::handlePendingClick() { int index = m_renderer->clickedIndex(); @@ -333,7 +333,7 @@ void Scatter3DController::clearSelection() setSelectedItem(invalidSelectionIndex(), 0); } -void Scatter3DController::adjustValueAxisRange() +void Scatter3DController::adjustAxisRanges() { QValue3DAxis *valueAxisX = static_cast(m_axisX); QValue3DAxis *valueAxisY = static_cast(m_axisY); diff --git a/src/datavisualization/engine/scatter3dcontroller_p.h b/src/datavisualization/engine/scatter3dcontroller_p.h index 53d24549..1194bc3a 100644 --- a/src/datavisualization/engine/scatter3dcontroller_p.h +++ b/src/datavisualization/engine/scatter3dcontroller_p.h @@ -108,8 +108,8 @@ public: virtual void handleAxisAutoAdjustRangeChangedInOrientation( QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust); virtual void handleAxisRangeChangedBySender(QObject *sender); - virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick(); + virtual void adjustAxisRanges(); public slots: void handleArrayReset(); @@ -125,7 +125,6 @@ protected: virtual void startRecordingRemovesAndInserts(); private: - void adjustValueAxisRange(); Q_DISABLE_COPY(Scatter3DController) }; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index f5336832..c6e243a1 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -26,6 +26,7 @@ #include "utils_p.h" #include "q3dlight.h" #include "qscatter3dseries_p.h" +#include "scatterseriesrendercache_p.h" #include #include @@ -83,15 +84,17 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_heightNormalizer(1.0f), m_scaleFactor(0), m_selectedItemIndex(Scatter3DController::invalidSelectionIndex()), - m_selectedItemTotalIndex(Scatter3DController::invalidSelectionIndex()), - m_selectedItemSeriesIndex(Scatter3DController::invalidSelectionIndex()), - m_selectedSeries(0), + m_selectedSeriesCache(0), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), m_backgroundMargin(defaultMaxSize), m_maxItemSize(0.0f), - m_clickedIndex(Scatter3DController::invalidSelectionIndex()) + m_clickedIndex(Scatter3DController::invalidSelectionIndex()), + m_havePointSeries(false), + m_haveMeshSeries(false), + m_haveUniformColorMeshSeries(false), + m_haveGradientMeshSeries(false) { m_axisCacheY.setScale(2.0f); m_axisCacheY.setTranslate(-1.0f); @@ -159,32 +162,99 @@ void Scatter3DRenderer::initializeOpenGL() loadBackgroundMesh(); } -void Scatter3DRenderer::updateSeries(const QList &seriesList, - bool updateVisibility) +void Scatter3DRenderer::updateData() +{ + calculateSceneScalingFactors(); + float minX = float(m_axisCacheX.min()); + float maxX = float(m_axisCacheX.max()); + float minY = float(m_axisCacheY.min()); + float maxY = float(m_axisCacheY.max()); + float minZ = float(m_axisCacheZ.min()); + float maxZ = float(m_axisCacheZ.max()); + int totalDataSize = 0; + + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + ScatterSeriesRenderCache *cache = static_cast(baseCache); + if (cache->isVisible() && cache->dataDirty()) { + const QScatter3DSeries *currentSeries = cache->series(); + ScatterRenderItemArray &renderArray = cache->renderArray(); + QScatterDataProxy *dataProxy = currentSeries->dataProxy(); + const QScatterDataArray &dataArray = *dataProxy->array(); + int dataSize = dataArray.size(); + totalDataSize += dataSize; + if (dataSize != renderArray.size()) + renderArray.resize(dataSize); + + for (int i = 0; i < dataSize; i++) { + QVector3D dotPos = dataArray.at(i).position(); + ScatterRenderItem &renderItem = renderArray[i]; + if ((dotPos.x() >= minX && dotPos.x() <= maxX ) + && (dotPos.y() >= minY && dotPos.y() <= maxY) + && (dotPos.z() >= minZ && dotPos.z() <= maxZ)) { + renderItem.setPosition(dotPos); + renderItem.setVisible(true); + if (!dataArray.at(i).rotation().isIdentity()) + renderItem.setRotation(dataArray.at(i).rotation().normalized()); + else + renderItem.setRotation(identityQuaternion); + calculateTranslation(renderItem); + } else { + renderItem.setVisible(false); + } + } + cache->setDataDirty(false); + } + } + + if (totalDataSize) { + m_dotSizeScale = GLfloat(qBound(defaultMinSize, 2.0f / float(qSqrt(qreal(totalDataSize))), + defaultMaxSize)); + } + + updateSelectedItem(m_selectedItemIndex, + m_selectedSeriesCache ? m_selectedSeriesCache->series() : 0); +} + +void Scatter3DRenderer::updateSeries(const QList &seriesList) { - Abstract3DRenderer::updateSeries(seriesList, updateVisibility); + Abstract3DRenderer::updateSeries(seriesList); - int seriesCount = m_visibleSeriesList.size(); + int seriesCount = seriesList.size(); float maxItemSize = 0.0f; float itemSize = 0.0f; + bool noSelection = true; - if (m_cachedItemSize.size() != seriesCount) - m_cachedItemSize.resize(seriesCount); + m_havePointSeries = false; + m_haveMeshSeries = false; + m_haveUniformColorMeshSeries = false; + m_haveGradientMeshSeries = false; - bool noSelection = true; - for (int series = 0; series < seriesCount; series++) { - QScatter3DSeries *scatterSeries = - static_cast(m_visibleSeriesList.at(series).series()); - itemSize = scatterSeries->itemSize(); - if (maxItemSize < itemSize) - maxItemSize = itemSize; - if (m_cachedItemSize.at(series) != itemSize) - m_cachedItemSize[series] = itemSize; - if (noSelection - && scatterSeries->selectedItem() != QScatter3DSeries::invalidSelectionIndex() - && m_selectionLabel != m_visibleSeriesList.at(series).itemLabel()) { - m_selectionLabelDirty = true; - noSelection = false; + for (int i = 0; i < seriesCount; i++) { + QScatter3DSeries *scatterSeries = static_cast(seriesList[i]); + if (scatterSeries->isVisible()) { + ScatterSeriesRenderCache *cache = + static_cast(m_renderCacheList.value(scatterSeries)); + itemSize = scatterSeries->itemSize(); + if (maxItemSize < itemSize) + maxItemSize = itemSize; + if (cache->itemSize() != itemSize) + cache->setItemSize(itemSize); + if (noSelection + && scatterSeries->selectedItem() != QScatter3DSeries::invalidSelectionIndex() + && m_selectionLabel != cache->itemLabel()) { + m_selectionLabelDirty = true; + noSelection = false; + } + + if (cache->mesh() == QAbstract3DSeries::MeshPoint) { + m_havePointSeries = true; + } else { + m_haveMeshSeries = true; + if (cache->colorStyle() == Q3DTheme::ColorStyleUniform) + m_haveUniformColorMeshSeries = true; + else + m_haveGradientMeshSeries = true; + } } } m_maxItemSize = maxItemSize; @@ -197,53 +267,9 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis m_selectionLabelDirty = true; } -void Scatter3DRenderer::updateData() +SeriesRenderCache *Scatter3DRenderer::createNewCache(QAbstract3DSeries *series) { - int seriesCount = m_visibleSeriesList.size(); - calculateSceneScalingFactors(); - float minX = float(m_axisCacheX.min()); - float maxX = float(m_axisCacheX.max()); - float minY = float(m_axisCacheY.min()); - float maxY = float(m_axisCacheY.max()); - float minZ = float(m_axisCacheZ.min()); - float maxZ = float(m_axisCacheZ.max()); - int totalDataSize = 0; - - if (m_renderingArrays.size() != seriesCount) - m_renderingArrays.resize(seriesCount); - - for (int series = 0; series < seriesCount; series++) { - QScatterDataProxy *dataProxy = - static_cast(m_visibleSeriesList.at(series).series())->dataProxy(); - const QScatterDataArray &dataArray = *dataProxy->array(); - int dataSize = dataArray.size(); - totalDataSize += dataSize; - - if (dataSize != m_renderingArrays.at(series).size()) - m_renderingArrays[series].resize(dataSize); - - for (int i = 0; i < dataSize; i++) { - QVector3D dotPos = dataArray.at(i).position(); - ScatterRenderItem &renderItem = m_renderingArrays[series][i]; - if ((dotPos.x() >= minX && dotPos.x() <= maxX ) - && (dotPos.y() >= minY && dotPos.y() <= maxY) - && (dotPos.z() >= minZ && dotPos.z() <= maxZ)) { - renderItem.setPosition(dotPos); - renderItem.setVisible(true); - if (!dataArray.at(i).rotation().isIdentity()) - renderItem.setRotation(dataArray.at(i).rotation().normalized()); - else - renderItem.setRotation(identityQuaternion); - calculateTranslation(renderItem); - } else { - renderItem.setVisible(false); - } - } - } - m_dotSizeScale = GLfloat(qBound(defaultMinSize, 2.0f / float(qSqrt(qreal(totalDataSize))), - defaultMaxSize)); - - updateSelectedItem(m_selectedItemIndex, m_selectedSeries); + return new ScatterSeriesRenderCache(series, this); } void Scatter3DRenderer::updateScene(Q3DScene *scene) @@ -306,8 +332,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix; - int seriesCount = m_visibleSeriesList.size(); - // Calculate label flipping if (viewMatrix.row(0).x() > 0) m_zFlipped = false; @@ -342,25 +366,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 depthProjectionMatrix; QMatrix4x4 depthProjectionViewMatrix; - // Check if we have any series with points - bool havePointSeries = false; - bool haveMeshSeries = false; - bool haveUniformColorMeshSeries = false; - bool haveGradientMeshSeries = false; - for (int i = 0; i < seriesCount; i++) { - if (m_visibleSeriesList.at(i).mesh() == QAbstract3DSeries::MeshPoint) { - havePointSeries = true; - } else { - haveMeshSeries = true; - if (m_visibleSeriesList.at(i).colorStyle() == Q3DTheme::ColorStyleUniform) - haveUniformColorMeshSeries = true; - else - haveGradientMeshSeries = true; - } - } - #if !defined(QT_OPENGL_ES_2) - if (havePointSeries) { + if (m_havePointSeries) { glEnable(GL_POINT_SMOOTH); glEnable(GL_PROGRAM_POINT_SIZE); } @@ -401,60 +408,63 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; // Draw dots to depth buffer - for (int series = 0; series < seriesCount; series++) { - ObjectHelper *dotObj = m_visibleSeriesList.at(series).object(); - QQuaternion seriesRotation = m_visibleSeriesList.at(series).meshRotation(); - bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint); - - float itemSize = m_cachedItemSize.at(series) / itemScaler; - if (itemSize == 0.0f) - itemSize = m_dotSizeScale; - if (drawingPoints) { - // Scale points based on shadow quality for shadows, not by zoom level - glPointSize(itemSize * 100.0f * m_shadowQualityMultiplier); - } - QVector3D modelScaler(itemSize, itemSize, itemSize); - - for (int dot = 0; dot < m_renderingArrays.at(series).size(); dot++) { - const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot); - if (!item.isVisible()) - continue; - - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - - modelMatrix.translate(item.translation()); - if (!drawingPoints) { - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) - modelMatrix.rotate(seriesRotation * item.rotation()); - modelMatrix.scale(modelScaler); - } - - MVPMatrix = depthProjectionViewMatrix * modelMatrix; - - m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); - + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + ScatterSeriesRenderCache *cache = static_cast(baseCache); + ObjectHelper *dotObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + const ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + bool drawingPoints = (cache->mesh() == QAbstract3DSeries::MeshPoint); + float itemSize = cache->itemSize() / itemScaler; + if (itemSize == 0.0f) + itemSize = m_dotSizeScale; if (drawingPoints) { - m_drawer->drawPoint(m_depthShader); - } else { - // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_depthShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); - glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, - (void *)0); - - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); - - // Draw the triangles - glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, - (void *)0); - - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableVertexAttribArray(m_depthShader->posAtt()); + // Scale points based on shadow quality for shadows, not by zoom level + glPointSize(itemSize * 100.0f * m_shadowQualityMultiplier); + } + QVector3D modelScaler(itemSize, itemSize, itemSize); + for (int dot = 0; dot < renderArraySize; dot++) { + const ScatterRenderItem &item = renderArray.at(dot); + if (!item.isVisible()) + continue; + + QMatrix4x4 modelMatrix; + QMatrix4x4 MVPMatrix; + + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) + modelMatrix.rotate(seriesRotation * item.rotation()); + modelMatrix.scale(modelScaler); + } + + MVPMatrix = depthProjectionViewMatrix * modelMatrix; + + m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); + + if (drawingPoints) { + m_drawer->drawPoint(m_depthShader); + } else { + // 1st attribute buffer : vertices + glEnableVertexAttribArray(m_depthShader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); + glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, + (void *)0); + + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); + + // Draw the triangles + glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, + (void *)0); + + // Free buffers + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableVertexAttribArray(m_depthShader->posAtt()); + } } } } @@ -481,7 +491,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Skip selection mode drawing if we have no selection mode if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone - && SelectOnScene == m_selectionState && seriesCount > 0) { + && SelectOnScene == m_selectionState && m_visibleSeriesCount > 0) { // Draw dots to selection buffer glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); glViewport(0, 0, @@ -493,70 +503,67 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Needed for clearing the frame buffer glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled - int arraySize = 0; - int totalArraySize = 0; - int dotNo = 0; - - // Init previous to opposite of first to ensure we change binding for first series - bool previousDrawingPoints = (m_visibleSeriesList.at(0).mesh() != QAbstract3DSeries::MeshPoint); - for (int series = 0; series < seriesCount; series++) { - ObjectHelper *dotObj = m_visibleSeriesList.at(series).object(); - QQuaternion seriesRotation = m_visibleSeriesList.at(series).meshRotation(); - bool drawingPoints = (m_visibleSeriesList.at(series).mesh() == QAbstract3DSeries::MeshPoint); - - float itemSize = m_cachedItemSize.at(series) / itemScaler; - if (itemSize == 0.0f) - itemSize = m_dotSizeScale; + bool previousDrawingPoints = false; + int totalIndex = 0; + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + ScatterSeriesRenderCache *cache = + static_cast(baseCache); + ObjectHelper *dotObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + const ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + bool drawingPoints = (cache->mesh() == QAbstract3DSeries::MeshPoint); + float itemSize = cache->itemSize() / itemScaler; + if (itemSize == 0.0f) + itemSize = m_dotSizeScale; #if !defined(QT_OPENGL_ES_2) - if (drawingPoints) - glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom -#endif - QVector3D modelScaler(itemSize, itemSize, itemSize); - - // Rebind selection shader if it has changed - if (drawingPoints != previousDrawingPoints) { - previousDrawingPoints = drawingPoints; if (drawingPoints) - selectionShader = pointSelectionShader; - else - selectionShader = m_selectionShader; - - selectionShader->bind(); - } - arraySize = m_renderingArrays.at(series).size(); - totalArraySize += arraySize; + glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom +#endif + QVector3D modelScaler(itemSize, itemSize, itemSize); - if (totalArraySize > 0xfffffe) // Max possible different selection colors, 0xffffff being skipColor - qFatal("Too many objects"); + // Rebind selection shader if it has changed + if (!totalIndex || drawingPoints != previousDrawingPoints) { + previousDrawingPoints = drawingPoints; + if (drawingPoints) + selectionShader = pointSelectionShader; + else + selectionShader = m_selectionShader; - for (int dot = 0; dot < arraySize; dot++) { - const ScatterRenderItem &item = m_renderingArrays.at(series).at(dot); - if (!item.isVisible()) - continue; - - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - - modelMatrix.translate(item.translation()); - if (!drawingPoints) { - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) - modelMatrix.rotate(seriesRotation * item.rotation()); - modelMatrix.scale(modelScaler); + selectionShader->bind(); + } + cache->setSelectionIndexOffset(totalIndex); + for (int dot = 0; dot < renderArraySize; dot++) { + const ScatterRenderItem &item = renderArray.at(dot); + if (!item.isVisible()) { + totalIndex++; + continue; + } + + QMatrix4x4 modelMatrix; + QMatrix4x4 MVPMatrix; + + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) + modelMatrix.rotate(seriesRotation * item.rotation()); + modelMatrix.scale(modelScaler); + } + + MVPMatrix = projectionViewMatrix * modelMatrix; + + QVector4D dotColor = indexToSelectionColor(totalIndex++); + dotColor /= 255.0f; + + selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix); + selectionShader->setUniformValue(selectionShader->color(), dotColor); + + if (drawingPoints) + m_drawer->drawPoint(selectionShader); + else + m_drawer->drawSelectionObject(selectionShader, dotObj); } - - MVPMatrix = projectionViewMatrix * modelMatrix; - - QVector4D dotColor = indexToSelectionColor(dotNo); - dotColor /= 255.0f; - - selectionShader->setUniformValue(selectionShader->MVP(), MVPMatrix); - selectionShader->setUniformValue(selectionShader->color(), dotColor); - - if (drawingPoints) - m_drawer->drawPoint(selectionShader); - else - m_drawer->drawSelectionObject(selectionShader, dotObj); - dotNo++; } } @@ -584,15 +591,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) GLuint gradientTexture = 0; bool dotSelectionFound = false; ScatterRenderItem *selectedItem(0); - int dotNo = 0; QVector3D baseColor; QVector3D dotColor; bool previousDrawingPoints = false; Q3DTheme::ColorStyle previousMeshColorStyle = Q3DTheme::ColorStyleUniform; - if (haveMeshSeries) { + if (m_haveMeshSeries) { // Set unchanging shader bindings - if (haveGradientMeshSeries) { + if (m_haveGradientMeshSeries) { m_dotGradientShader->bind(); m_dotGradientShader->setUniformValue(m_dotGradientShader->lightP(), lightPos); m_dotGradientShader->setUniformValue(m_dotGradientShader->view(), viewMatrix); @@ -600,7 +606,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_cachedTheme->ambientLightStrength()); m_dotGradientShader->setUniformValue(m_dotGradientShader->lightColor(), lightColor); } - if (haveUniformColorMeshSeries) { + if (m_haveUniformColorMeshSeries) { m_dotShader->bind(); m_dotShader->setUniformValue(m_dotShader->lightP(), lightPos); m_dotShader->setUniformValue(m_dotShader->view(), viewMatrix); @@ -620,160 +626,170 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->bind(); } - for (int series = 0; series < seriesCount; series++) { - const SeriesRenderCache ¤tSeries = m_visibleSeriesList.at(series); - QQuaternion seriesRotation = currentSeries.meshRotation(); - ObjectHelper *dotObj = currentSeries.object(); - bool drawingPoints = (currentSeries.mesh() == QAbstract3DSeries::MeshPoint); - Q3DTheme::ColorStyle colorStyle = currentSeries.colorStyle(); - bool colorStyleIsUniform = (colorStyle == Q3DTheme::ColorStyleUniform); - bool useColor = colorStyleIsUniform || drawingPoints; - - float itemSize = m_cachedItemSize.at(series) / itemScaler; - if (itemSize == 0.0f) - itemSize = m_dotSizeScale; + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + ScatterSeriesRenderCache *cache = + static_cast(baseCache); + ObjectHelper *dotObj = cache->object(); + QQuaternion seriesRotation(cache->meshRotation()); + ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + bool selectedSeries = m_cachedSelectionMode > QAbstract3DGraph::SelectionNone + && (m_selectedSeriesCache == cache); + bool drawingPoints = (cache->mesh() == QAbstract3DSeries::MeshPoint); + Q3DTheme::ColorStyle colorStyle = cache->colorStyle(); + bool colorStyleIsUniform = (colorStyle == Q3DTheme::ColorStyleUniform); + bool useColor = colorStyleIsUniform || drawingPoints; + bool rangeGradientPoints = drawingPoints + && (colorStyle == Q3DTheme::ColorStyleRangeGradient); + float itemSize = cache->itemSize() / itemScaler; + if (itemSize == 0.0f) + itemSize = m_dotSizeScale; #if !defined(QT_OPENGL_ES_2) - if (drawingPoints) - glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom + if (drawingPoints) + glPointSize(itemSize * activeCamera->zoomLevel()); // Scale points based on zoom #endif - QVector3D modelScaler(itemSize, itemSize, itemSize); - - // Rebind shader if it has changed - if (drawingPoints != previousDrawingPoints - || (!drawingPoints && - (colorStyleIsUniform != (previousMeshColorStyle == Q3DTheme::ColorStyleUniform)))) { - previousDrawingPoints = drawingPoints; - if (drawingPoints) { - dotShader = pointSelectionShader; - } else { - if (colorStyleIsUniform) - dotShader = m_dotShader; - else - dotShader = m_dotGradientShader; + QVector3D modelScaler(itemSize, itemSize, itemSize); + + // Rebind shader if it has changed + if (drawingPoints != previousDrawingPoints + || (!drawingPoints && + (colorStyleIsUniform != (previousMeshColorStyle + == Q3DTheme::ColorStyleUniform)))) { + previousDrawingPoints = drawingPoints; + if (drawingPoints) { + dotShader = pointSelectionShader; + } else { + if (colorStyleIsUniform) + dotShader = m_dotShader; + else + dotShader = m_dotGradientShader; + } + dotShader->bind(); } - dotShader->bind(); - } - if (!drawingPoints && !colorStyleIsUniform && previousMeshColorStyle != colorStyle) { - if (colorStyle == Q3DTheme::ColorStyleObjectGradient) { - m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientMin(), 0.0f); - m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientHeight(), 0.5f); - } else { - // Each ball is of uniform color according to its Y-coordinate - m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientHeight(), 0.0f); + if (!drawingPoints && !colorStyleIsUniform && previousMeshColorStyle != colorStyle) { + if (colorStyle == Q3DTheme::ColorStyleObjectGradient) { + m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientMin(), 0.0f); + m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientHeight(), + 0.5f); + } else { + // Each dot is of uniform color according to its Y-coordinate + m_dotGradientShader->setUniformValue(m_dotGradientShader->gradientHeight(), + 0.0f); + } } - } - if (!drawingPoints) - previousMeshColorStyle = colorStyle; + if (!drawingPoints) + previousMeshColorStyle = colorStyle; - if (useColor) { - baseColor = currentSeries.baseColor(); - dotColor = baseColor; - } + if (useColor) { + baseColor = cache->baseColor(); + dotColor = baseColor; + } + for (int i = 0; i < renderArraySize; i++) { + ScatterRenderItem &item = renderArray[i]; + if (!item.isVisible()) + continue; - int seriesSize = m_renderingArrays.at(series).size(); - for (int dot = 0; dot < seriesSize; dot++) { - ScatterRenderItem &item = m_renderingArrays[series][dot]; - if (!item.isVisible()) - continue; - - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - QMatrix4x4 itModelMatrix; - - modelMatrix.translate(item.translation()); - if (!drawingPoints) { - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { - QQuaternion totalRotation = seriesRotation * item.rotation(); - modelMatrix.rotate(totalRotation); - itModelMatrix.rotate(totalRotation); + QMatrix4x4 modelMatrix; + QMatrix4x4 MVPMatrix; + QMatrix4x4 itModelMatrix; + + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { + QQuaternion totalRotation = seriesRotation * item.rotation(); + modelMatrix.rotate(totalRotation); + itModelMatrix.rotate(totalRotation); + } + modelMatrix.scale(modelScaler); + itModelMatrix.scale(modelScaler); } - modelMatrix.scale(modelScaler); - itModelMatrix.scale(modelScaler); - } #ifdef SHOW_DEPTH_TEXTURE_SCENE - MVPMatrix = depthProjectionViewMatrix * modelMatrix; + MVPMatrix = depthProjectionViewMatrix * modelMatrix; #else - MVPMatrix = projectionViewMatrix * modelMatrix; + MVPMatrix = projectionViewMatrix * modelMatrix; #endif - if (useColor) - dotColor = baseColor; - else - gradientTexture = currentSeries.baseGradientTexture(); - - GLfloat lightStrength = m_cachedTheme->lightStrength(); - if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone - && (m_selectedItemTotalIndex == dotNo)) { - if (useColor) - dotColor = currentSeries.singleHighlightColor(); - else - gradientTexture = currentSeries.singleHighlightGradientTexture(); - lightStrength = m_cachedTheme->highlightLightStrength(); - // Insert data to ScatterRenderItem. We have no ownership, don't delete the previous one - selectedItem = &item; - dotSelectionFound = true; - // Save selected item size (adjusted with font size) for selection label positioning - selectedItemSize = itemSize + (m_cachedTheme->font().pointSizeF() / 500.0f); - } - - if (!drawingPoints) { - // Set shader bindings - dotShader->setUniformValue(dotShader->model(), modelMatrix); - dotShader->setUniformValue(dotShader->nModel(), - itModelMatrix.inverted().transposed()); - } + if (useColor) { + if (rangeGradientPoints) { + // Drawing points with range gradient + // Get color from gradient based on items y position converted to percent + int position = int(item.translation().y() * 50.0f) + 50; + dotColor = Utils::vectorFromColor( + cache->gradientImage().pixel(0, position)); + } else { + dotColor = baseColor; + } + } else { + gradientTexture = cache->baseGradientTexture(); + } - dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); - if (useColor) { - if (colorStyle == Q3DTheme::ColorStyleRangeGradient && - (m_selectedItemTotalIndex != dotNo)) { - // Drawing points with range gradient - // Get color from gradient based on items y position converted to percents - int position = int(item.translation().y() * 50.0f) + 50; - dotColor = Utils::vectorFromColor( - currentSeries.gradientImage().pixel(0, position)); + GLfloat lightStrength = m_cachedTheme->lightStrength(); + if (selectedSeries && (m_selectedItemIndex == i)) { + if (useColor) + dotColor = cache->singleHighlightColor(); + else + gradientTexture = cache->singleHighlightGradientTexture(); + lightStrength = m_cachedTheme->highlightLightStrength(); + // Insert data to ScatterRenderItem + // We don't have ownership, so don't delete the previous one + selectedItem = &item; + dotSelectionFound = true; + // Save selected item size (adjusted with font size) for selection label + // positioning + selectedItemSize = itemSize + (m_cachedTheme->font().pointSizeF() / 500.0f); } - dotShader->setUniformValue(dotShader->color(), dotColor); - } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { - dotShader->setUniformValue(dotShader->gradientMin(), - (item.translation().y() + 1.0f) / 2.0f); - } -#if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + if (!drawingPoints) { - // Set shadow shader bindings - QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; - dotShader->setUniformValue(dotShader->shadowQ(), m_shadowQualityToShader); - dotShader->setUniformValue(dotShader->depth(), depthMVPMatrix); - dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); + // Set shader bindings + dotShader->setUniformValue(dotShader->model(), modelMatrix); + dotShader->setUniformValue(dotShader->nModel(), + itModelMatrix.inverted().transposed()); + } - // Draw the object - m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); - } else { - // Draw the object - m_drawer->drawPoint(dotShader); + dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); + if (useColor) { + dotShader->setUniformValue(dotShader->color(), dotColor); + } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + dotShader->setUniformValue(dotShader->gradientMin(), + (item.translation().y() + 1.0f) / 2.0f); } - } else +#if !defined(QT_OPENGL_ES_2) + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + if (!drawingPoints) { + // Set shadow shader bindings + QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; + dotShader->setUniformValue(dotShader->shadowQ(), m_shadowQualityToShader); + dotShader->setUniformValue(dotShader->depth(), depthMVPMatrix); + dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); + + // Draw the object + m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); + } else { + // Draw the object + m_drawer->drawPoint(dotShader); + } + } else #endif - { - if (!drawingPoints) { - // Set shadowless shader bindings - dotShader->setUniformValue(dotShader->lightS(), lightStrength); - // Draw the object - m_drawer->drawObject(dotShader, dotObj, gradientTexture); - } else { - // Draw the object - m_drawer->drawPoint(dotShader); + { + if (!drawingPoints) { + // Set shadowless shader bindings + dotShader->setUniformValue(dotShader->lightS(), lightStrength); + // Draw the object + m_drawer->drawObject(dotShader, dotObj, gradientTexture); + } else { + // Draw the object + m_drawer->drawPoint(dotShader); + } } } - dotNo++; } } #if !defined(QT_OPENGL_ES_2) - if (havePointSeries) { + if (m_havePointSeries) { glDisable(GL_POINT_SMOOTH); glDisable(GL_PROGRAM_POINT_SIZE); } @@ -1263,7 +1279,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) || !labelItem.textureId() || m_selectionLabelDirty) { QString labelText = selectionLabel(); if (labelText.isNull() || m_selectionLabelDirty) { - labelText = m_visibleSeriesList[m_selectedItemSeriesIndex].itemLabel(); + labelText = m_selectedSeriesCache->itemLabel(); setSelectionLabel(labelText); m_selectionLabelDirty = false; } @@ -1505,26 +1521,18 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa glDisable(GL_POLYGON_OFFSET_FILL); } -void Scatter3DRenderer::updateSelectedItem(int index, const QScatter3DSeries *series) +void Scatter3DRenderer::updateSelectedItem(int index, QScatter3DSeries *series) { m_selectionDirty = true; m_selectionLabelDirty = true; - m_selectedSeries = series; + m_selectedSeriesCache = + static_cast(m_renderCacheList.value(series, 0)); m_selectedItemIndex = Scatter3DController::invalidSelectionIndex(); - m_selectedItemTotalIndex = Scatter3DController::invalidSelectionIndex(); - m_selectedItemSeriesIndex = Scatter3DController::invalidSelectionIndex(); - if (!m_renderingArrays.isEmpty() && index != Scatter3DController::invalidSelectionIndex()) { - int totalIndex = 0; - for (int i = 0; i < m_visibleSeriesList.size(); i++) { - if (m_visibleSeriesList.at(i).series() == series) { - m_selectedItemSeriesIndex = i; - m_selectedItemIndex = index; - m_selectedItemTotalIndex = index + totalIndex; - break; - } - totalIndex += m_renderingArrays.at(i).size(); - } + if (m_selectedSeriesCache) { + const ScatterRenderItemArray &renderArray = m_selectedSeriesCache->renderArray(); + if (index < renderArray.size() && index >= 0) + m_selectedItemIndex = index; } } @@ -1767,17 +1775,22 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, index = Scatter3DController::invalidSelectionIndex(); m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } else { - index = int(color.x()) + int totalIndex = int(color.x()) + (int(color.y()) << 8) + (int(color.z()) << 16); // Find the series and adjust the index accordingly - for (int i = 0; i < m_renderingArrays.size(); i++) { - if (index < m_renderingArrays.at(i).size()) { - series = m_visibleSeriesList.at(i).series(); - m_clickedType = QAbstract3DGraph::ElementSeries; - return; // Valid found and already set to return parameters, so we can return - } else { - index -= m_renderingArrays.at(i).size(); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + if (baseCache->isVisible()) { + ScatterSeriesRenderCache *cache = + static_cast(baseCache); + int offset = cache->selectionIndexOffset(); + if (totalIndex >= offset + && totalIndex < (offset + cache->renderArray().size())) { + index = totalIndex - offset; + series = cache->series(); + m_clickedType = QAbstract3DGraph::ElementSeries; + return; + } } } } diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 8b4d0759..ab45381e 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -46,6 +46,7 @@ class ObjectHelper; class LabelItem; class Q3DScene; class QAbstractAxisPrivate; +class ScatterSeriesRenderCache; class QT_DATAVISUALIZATION_EXPORT Scatter3DRenderer : public Abstract3DRenderer { @@ -83,26 +84,27 @@ private: GLfloat m_heightNormalizer; GLfloat m_scaleFactor; int m_selectedItemIndex; - int m_selectedItemTotalIndex; - int m_selectedItemSeriesIndex; - const QScatter3DSeries *m_selectedSeries; + ScatterSeriesRenderCache *m_selectedSeriesCache; QSizeF m_areaSize; GLfloat m_dotSizeScale; QVector3D m_translationOffset; bool m_hasHeightAdjustmentChanged; ScatterRenderItem m_dummyRenderItem; - QVector m_renderingArrays; GLfloat m_backgroundMargin; GLfloat m_maxItemSize; - QVector m_cachedItemSize; int m_clickedIndex; + bool m_havePointSeries; + bool m_haveMeshSeries; + bool m_haveUniformColorMeshSeries; + bool m_haveGradientMeshSeries; public: explicit Scatter3DRenderer(Scatter3DController *controller); ~Scatter3DRenderer(); - void updateSeries(const QList &seriesList, bool updateVisibility); void updateData(); + void updateSeries(const QList &seriesList); + SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); inline int clickedIndex() const { return m_clickedIndex; } @@ -145,7 +147,7 @@ private: friend class ScatterRenderItem; public slots: - void updateSelectedItem(int index, const QScatter3DSeries *series); + void updateSelectedItem(int index, QScatter3DSeries *series); private: QVector4D indexToSelectionColor(GLint index); diff --git a/src/datavisualization/engine/scatterseriesrendercache.cpp b/src/datavisualization/engine/scatterseriesrendercache.cpp new file mode 100644 index 00000000..2a2c5393 --- /dev/null +++ b/src/datavisualization/engine/scatterseriesrendercache.cpp @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "scatterseriesrendercache_p.h" +#include "scatter3drenderer_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +ScatterSeriesRenderCache::ScatterSeriesRenderCache(QAbstract3DSeries *series, + Abstract3DRenderer *renderer) + : SeriesRenderCache(series, renderer), + m_itemSize(0.0f), + m_selectionIndexOffset(0) +{ +} + +ScatterSeriesRenderCache::~ScatterSeriesRenderCache() +{ +} + +void ScatterSeriesRenderCache::cleanup(TextureHelper *texHelper) +{ + m_renderArray.clear(); + + SeriesRenderCache::cleanup(texHelper); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatterseriesrendercache_p.h b/src/datavisualization/engine/scatterseriesrendercache_p.h new file mode 100644 index 00000000..b2e2d55f --- /dev/null +++ b/src/datavisualization/engine/scatterseriesrendercache_p.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef SCATTERSERIESRENDERCACHE_P_H +#define SCATTERSERIESRENDERCACHE_P_H + +#include "datavisualizationglobal_p.h" +#include "seriesrendercache_p.h" +#include "qscatter3dseries_p.h" +#include "scatterrenderitem_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class ScatterSeriesRenderCache : public SeriesRenderCache +{ +public: + ScatterSeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer); + virtual ~ScatterSeriesRenderCache(); + + void cleanup(TextureHelper *texHelper); + + inline ScatterRenderItemArray &renderArray() { return m_renderArray; } + inline QScatter3DSeries *series() const { return static_cast(m_series); } + inline void setItemSize(float size) { m_itemSize = size; } + inline float itemSize() const { return m_itemSize; } + inline void setSelectionIndexOffset(int offset) { m_selectionIndexOffset = offset; } + inline int selectionIndexOffset() const { return m_selectionIndexOffset; } + +protected: + ScatterRenderItemArray m_renderArray; + float m_itemSize; + int m_selectionIndexOffset; // Temporarily cached value for selection color calculations +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index 7e51df1e..e674ae43 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -26,15 +26,19 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION const QString smoothString(QStringLiteral("Smooth")); -SeriesRenderCache::SeriesRenderCache() - : m_series(0), +SeriesRenderCache::SeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer) + : m_series(series), m_object(0), m_mesh(QAbstract3DSeries::MeshCube), m_baseUniformTexture(0), m_baseGradientTexture(0), m_gradientImage(0), m_singleHighlightGradientTexture(0), - m_multiHighlightGradientTexture(0) + m_multiHighlightGradientTexture(0), + m_valid(false), + m_visible(false), + m_renderer(renderer), + m_objectDirty(true) { } @@ -42,22 +46,13 @@ SeriesRenderCache::~SeriesRenderCache() { } -void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer *renderer) +void SeriesRenderCache::populate(bool newSeries) { - Q_ASSERT(series); + QAbstract3DSeriesChangeBitField &changeTracker = m_series->d_ptr->m_changeTracker; - bool seriesChanged = false; - - if (m_series != series) { - m_series = series; - seriesChanged = true; - } - - QAbstract3DSeriesChangeBitField &changeTracker = series->d_ptr->m_changeTracker; - - if (seriesChanged || changeTracker.meshChanged || changeTracker.meshSmoothChanged + if (newSeries || changeTracker.meshChanged || changeTracker.meshSmoothChanged || changeTracker.userDefinedMeshChanged) { - m_mesh = series->mesh(); + m_mesh = m_series->mesh(); changeTracker.meshChanged = false; changeTracker.meshSmoothChanged = false; changeTracker.userDefinedMeshChanged = false; @@ -67,7 +62,7 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * // Compose mesh filename if (m_mesh == QAbstract3DSeries::MeshUserDefined) { // Always use the supplied mesh directly - meshFileName = series->userDefinedMesh(); + meshFileName = m_series->userDefinedMesh(); } else { switch (m_mesh) { case QAbstract3DSeries::MeshBar: @@ -107,11 +102,11 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * break; } - if (series->isMeshSmooth() && m_mesh != QAbstract3DSeries::MeshPoint) + if (m_series->isMeshSmooth() && m_mesh != QAbstract3DSeries::MeshPoint) meshFileName += smoothString; // Give renderer an opportunity to customize the mesh - renderer->fixMeshFileName(meshFileName, m_mesh); + m_renderer->fixMeshFileName(meshFileName, m_mesh); } delete m_object; @@ -123,8 +118,8 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * } } - if (seriesChanged || changeTracker.meshRotationChanged) { - m_meshRotation = series->meshRotation().normalized(); + if (newSeries || changeTracker.meshRotationChanged) { + m_meshRotation = m_series->meshRotation().normalized(); if (m_series->type() == QAbstract3DSeries::SeriesTypeBar && (m_meshRotation.x() || m_meshRotation.z())) { m_meshRotation = identityQuaternion; @@ -132,63 +127,68 @@ void SeriesRenderCache::populate(QAbstract3DSeries *series, Abstract3DRenderer * changeTracker.meshRotationChanged = false; } - if (seriesChanged || changeTracker.colorStyleChanged) { - m_colorStyle = series->colorStyle(); + if (newSeries || changeTracker.colorStyleChanged) { + m_colorStyle = m_series->colorStyle(); changeTracker.colorStyleChanged = false; } - if (seriesChanged || changeTracker.baseColorChanged) { - m_baseColor = Utils::vectorFromColor(series->baseColor()); + if (newSeries || changeTracker.baseColorChanged) { + m_baseColor = Utils::vectorFromColor(m_series->baseColor()); if (m_series->type() == QAbstract3DSeries::SeriesTypeSurface) - renderer->generateBaseColorTexture(series->baseColor(), &m_baseUniformTexture); + m_renderer->generateBaseColorTexture(m_series->baseColor(), &m_baseUniformTexture); changeTracker.baseColorChanged = false; } - if (seriesChanged || changeTracker.baseGradientChanged) { - QLinearGradient gradient = series->baseGradient(); + if (newSeries || changeTracker.baseGradientChanged) { + QLinearGradient gradient = m_series->baseGradient(); m_gradientImage = Utils::getGradientImage(gradient); - renderer->fixGradientAndGenerateTexture(&gradient, &m_baseGradientTexture); + m_renderer->fixGradientAndGenerateTexture(&gradient, &m_baseGradientTexture); changeTracker.baseGradientChanged = false; } - if (seriesChanged || changeTracker.singleHighlightColorChanged) { - m_singleHighlightColor = Utils::vectorFromColor(series->singleHighlightColor()); + if (newSeries || changeTracker.singleHighlightColorChanged) { + m_singleHighlightColor = Utils::vectorFromColor(m_series->singleHighlightColor()); changeTracker.singleHighlightColorChanged = false; } - if (seriesChanged || changeTracker.singleHighlightGradientChanged) { - QLinearGradient gradient = series->singleHighlightGradient(); - renderer->fixGradientAndGenerateTexture(&gradient, &m_singleHighlightGradientTexture); + if (newSeries || changeTracker.singleHighlightGradientChanged) { + QLinearGradient gradient = m_series->singleHighlightGradient(); + m_renderer->fixGradientAndGenerateTexture(&gradient, &m_singleHighlightGradientTexture); changeTracker.singleHighlightGradientChanged = false; } - if (seriesChanged || changeTracker.multiHighlightColorChanged) { - m_multiHighlightColor = Utils::vectorFromColor(series->multiHighlightColor()); + if (newSeries || changeTracker.multiHighlightColorChanged) { + m_multiHighlightColor = Utils::vectorFromColor(m_series->multiHighlightColor()); changeTracker.multiHighlightColorChanged = false; } - if (seriesChanged || changeTracker.multiHighlightGradientChanged) { - QLinearGradient gradient = series->multiHighlightGradient(); - renderer->fixGradientAndGenerateTexture(&gradient, &m_multiHighlightGradientTexture); + if (newSeries || changeTracker.multiHighlightGradientChanged) { + QLinearGradient gradient = m_series->multiHighlightGradient(); + m_renderer->fixGradientAndGenerateTexture(&gradient, &m_multiHighlightGradientTexture); changeTracker.multiHighlightGradientChanged = false; } - if (seriesChanged || changeTracker.nameChanged) { - m_name = series->name(); + if (newSeries || changeTracker.nameChanged) { + m_name = m_series->name(); changeTracker.nameChanged = false; } - if (seriesChanged || changeTracker.itemLabelChanged + if (newSeries || changeTracker.itemLabelChanged || changeTracker.itemLabelVisibilityChanged) { changeTracker.itemLabelChanged = false; changeTracker.itemLabelVisibilityChanged = false; // series->itemLabel() call resolves the item label and emits the changed signal // if it is dirty, so we need to call it even if m_itemLabel is eventually set // to an empty string. - m_itemLabel = series->itemLabel(); - if (!series->isItemLabelVisible()) + m_itemLabel = m_series->itemLabel(); + if (!m_series->isItemLabelVisible()) m_itemLabel = QString(); } + + if (newSeries || changeTracker.visibilityChanged) { + m_visible = m_series->isVisible(); + changeTracker.visibilityChanged = false; + } } void SeriesRenderCache::cleanup(TextureHelper *texHelper) diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index a6ae03cf..8536d501 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -41,10 +41,10 @@ class TextureHelper; class SeriesRenderCache { public: - SeriesRenderCache(); + SeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer); virtual ~SeriesRenderCache(); - void populate(QAbstract3DSeries *series, Abstract3DRenderer *renderer); + virtual void populate(bool newSeries); virtual void cleanup(TextureHelper *texHelper); // NOTE: Series pointer can only be used to access the series when syncing with controller. @@ -66,6 +66,11 @@ public: inline const GLuint &multiHighlightGradientTexture() const { return m_multiHighlightGradientTexture; } inline const QString &name() const { return m_name; } inline const QString &itemLabel() const { return m_itemLabel; } + inline void setValid(bool valid) { m_valid = valid; } + inline bool isValid() const { return m_valid; } + inline bool isVisible() const { return m_visible; } + inline void setDataDirty(bool state) { m_objectDirty = state; } + inline bool dataDirty() const { return m_objectDirty; } protected: QAbstract3DSeries *m_series; @@ -85,6 +90,10 @@ protected: QString m_name; QString m_itemLabel; + bool m_valid; + bool m_visible; + Abstract3DRenderer *m_renderer; + bool m_objectDirty; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 683a214a..591cbdda 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -66,11 +66,6 @@ void Surface3DController::synchDataToRenderer() if (!isInitialized()) return; - if (m_changedSeriesList.size()) { - m_renderer->modifiedSeriesList(m_changedSeriesList); - m_changedSeriesList.clear(); - } - Abstract3DController::synchDataToRenderer(); // Notify changes to renderer @@ -98,7 +93,7 @@ void Surface3DController::handleAxisAutoAdjustRangeChangedInOrientation( Q_UNUSED(orientation) Q_UNUSED(autoAdjust) - adjustValueAxisRange(); + adjustAxisRanges(); } void Surface3DController::handleAxisRangeChangedBySender(QObject *sender) @@ -113,8 +108,6 @@ void Surface3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { Abstract3DController::handleSeriesVisibilityChangedBySender(sender); - adjustValueAxisRange(); - // Visibility changes may require disabling slicing, // so just reset selection to ensure everything is still valid. setSelectedPoint(m_selectedPoint, m_selectedSeries, false); @@ -150,9 +143,6 @@ void Surface3DController::addSeries(QAbstract3DSeries *series) Abstract3DController::addSeries(series); - if (series->isVisible()) - adjustValueAxisRange(); - QSurface3DSeries *surfaceSeries = static_cast(series); if (surfaceSeries->selectedPoint() != invalidSelectionPosition()) setSelectedPoint(surfaceSeries->selectedPoint(), surfaceSeries, false); @@ -168,7 +158,7 @@ void Surface3DController::removeSeries(QAbstract3DSeries *series) setSelectedPoint(invalidSelectionPosition(), 0, false); if (wasVisible) - adjustValueAxisRange(); + adjustAxisRanges(); } QList Surface3DController::surfaceSeriesList() @@ -292,11 +282,12 @@ void Surface3DController::handleArrayReset() { QSurface3DSeries *series = static_cast(sender())->series(); if (series->isVisible()) { - adjustValueAxisRange(); - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); + adjustAxisRanges(); m_isDataDirty = true; } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); + // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries, false); series->d_ptr->markItemLabelDirty(); @@ -345,7 +336,7 @@ void Surface3DController::handleRowsChanged(int startIndex, int count) if (m_changedRows.size()) { m_changeTracker.rowsChanged = true; - adjustValueAxisRange(); + adjustAxisRanges(); // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries, false); emitNeedRender(); @@ -373,7 +364,7 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) if (series == m_selectedSeries && m_selectedPoint == candidate) series->d_ptr->markItemLabelDirty(); - adjustValueAxisRange(); + adjustAxisRanges(); // Clear selection unless still valid setSelectedPoint(m_selectedPoint, m_selectedSeries, false); emitNeedRender(); @@ -386,11 +377,11 @@ void Surface3DController::handleRowsAdded(int startIndex, int count) Q_UNUSED(count) QSurface3DSeries *series = static_cast(sender())->series(); if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -409,11 +400,11 @@ void Surface3DController::handleRowsInserted(int startIndex, int count) } if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } @@ -437,16 +428,16 @@ void Surface3DController::handleRowsRemoved(int startIndex, int count) } if (series->isVisible()) { - adjustValueAxisRange(); + adjustAxisRanges(); m_isDataDirty = true; - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); } + if (!m_changedSeriesList.contains(series)) + m_changedSeriesList.append(series); emitNeedRender(); } -void Surface3DController::adjustValueAxisRange() +void Surface3DController::adjustAxisRanges() { QValue3DAxis *valueAxisX = static_cast(m_axisX); QValue3DAxis *valueAxisY = static_cast(m_axisY); diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h index 14c0dd40..b742b6bb 100644 --- a/src/datavisualization/engine/surface3dcontroller_p.h +++ b/src/datavisualization/engine/surface3dcontroller_p.h @@ -77,7 +77,6 @@ private: bool m_flatShadingSupported; QVector m_changedItems; QVector m_changedRows; - QVector m_changedSeriesList; public: explicit Surface3DController(QRect rect, Q3DScene *scene = 0); @@ -97,6 +96,7 @@ public: virtual void handleAxisRangeChangedBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick(); + virtual void adjustAxisRanges(); static QPoint invalidSelectionPosition(); bool isFlatShadingSupported(); @@ -119,8 +119,6 @@ signals: void selectedSeriesChanged(QSurface3DSeries *series); private: - void adjustValueAxisRange(); - Q_DISABLE_COPY(Surface3DController) }; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 9e591383..9e5f0b37 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -144,12 +144,6 @@ Surface3DRenderer::~Surface3DRenderer() delete m_gridLineObj; #endif delete m_labelObj; - - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { - cache->cleanup(m_textureHelper); - delete cache; - } - m_renderCacheList.clear(); } void Surface3DRenderer::initializeOpenGL() @@ -194,22 +188,25 @@ void Surface3DRenderer::updateData() { calculateSceneScalingFactors(); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { - const QSurface3DSeries *currentSeries = cache->series(); - QSurfaceDataProxy *dataProxy = currentSeries->dataProxy(); - const QSurfaceDataArray &array = *dataProxy->array(); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); + if (cache->isVisible() && cache->dataDirty()) { + const QSurface3DSeries *currentSeries = cache->series(); + QSurfaceDataProxy *dataProxy = currentSeries->dataProxy(); + const QSurfaceDataArray &array = *dataProxy->array(); + QSurfaceDataArray &dataArray = cache->dataArray(); + QRect sampleSpace; - // Need minimum of 2x2 array to draw a surface - if (array.size() >= 2 && array.at(0)->size() >= 2) { - QRect sampleSpace = calculateSampleRect(array); + // Need minimum of 2x2 array to draw a surface + if (array.size() >= 2 && array.at(0)->size() >= 2) + sampleSpace = calculateSampleRect(array); - QSurfaceDataArray &dataArray = cache->dataArray(); - bool dimensionChanged = false; + bool dimensionsChanged = false; if (cache->sampleSpace() != sampleSpace) { if (sampleSpace.width() >= 2) m_selectionTexturesDirty = true; - dimensionChanged = true; + dimensionsChanged = true; cache->setSampleSpace(sampleSpace); for (int i = 0; i < dataArray.size(); i++) @@ -218,7 +215,7 @@ void Surface3DRenderer::updateData() } if (sampleSpace.width() >= 2 && sampleSpace.height() >= 2) { - if (dimensionChanged) { + if (dimensionsChanged) { dataArray.reserve(sampleSpace.height()); for (int i = 0; i < sampleSpace.height(); i++) dataArray << new QSurfaceDataRow(sampleSpace.width()); @@ -230,13 +227,13 @@ void Surface3DRenderer::updateData() } } - if (dataArray.size() > 0 && (cache->objectDirty() || dimensionChanged)) { - checkFlatSupport(cache); - updateObjects(cache, dimensionChanged); - cache->setObjectDirty(false); - cache->setFlatStatusDirty(false); - } + checkFlatSupport(cache); + updateObjects(cache, dimensionsChanged); + cache->setFlatStatusDirty(false); + } else { + cache->surfaceObject()->clear(); } + cache->setDataDirty(false); } } @@ -246,26 +243,15 @@ void Surface3DRenderer::updateData() updateSelectedPoint(m_selectedPoint, m_selectedSeries); } -void Surface3DRenderer::updateSeries(const QList &seriesList, - bool updateVisibility) +void Surface3DRenderer::updateSeries(const QList &seriesList) { - Q_UNUSED(updateVisibility); - - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) - cache->setValid(false); + Abstract3DRenderer::updateSeries(seriesList); bool noSelection = true; foreach (QAbstract3DSeries *series, seriesList) { QSurface3DSeries *surfaceSeries = static_cast(series); - SurfaceSeriesRenderCache *cache = m_renderCacheList.value(surfaceSeries); - if (!cache) { - cache = new SurfaceSeriesRenderCache(this); - m_renderCacheList[surfaceSeries] = cache; - m_selectionTexturesDirty = true; - } - cache->setValid(true); - cache->populate(surfaceSeries, this); - + SurfaceSeriesRenderCache *cache = + static_cast( m_renderCacheList.value(series)); if (noSelection && surfaceSeries->selectedPoint() != QSurface3DSeries::invalidSelectionPosition() && selectionLabel() != cache->itemLabel()) { @@ -280,26 +266,15 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis } } - if (noSelection && !selectionLabel().isEmpty()) + if (noSelection && !selectionLabel().isEmpty()) { m_selectionLabelDirty = true; - - // Remove non-valid objects from the cache list - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { - if (!cache->isValid()) { - if (cache->series() == m_selectedSeries) - updateSelectedPoint(Surface3DController::invalidSelectionPosition(), 0); - - m_renderCacheList.remove(cache->series()); - cache->cleanup(m_textureHelper); - delete cache; - - m_selectionTexturesDirty = true; - } + updateSelectedPoint(Surface3DController::invalidSelectionPosition(), 0); } // Selection pointer issues if (m_selectedSeries) { - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); QVector3D highlightColor = Utils::vectorFromColor(cache->series()->singleHighlightColor()); SelectionPointer *slicePointer = cache->sliceSelectionPointer(); @@ -318,19 +293,23 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis } } -void Surface3DRenderer::modifiedSeriesList(const QVector &seriesList) +SeriesRenderCache *Surface3DRenderer::createNewCache(QAbstract3DSeries *series) { - foreach (QSurface3DSeries *series, seriesList) { - SurfaceSeriesRenderCache *cache = m_renderCacheList.value(series); - if (cache) - cache->setObjectDirty(true); - } + m_selectionTexturesDirty = true; + return new SurfaceSeriesRenderCache(series, this); +} + +void Surface3DRenderer::cleanCache(SeriesRenderCache *cache) +{ + Abstract3DRenderer::cleanCache(cache); + m_selectionTexturesDirty = true; } void Surface3DRenderer::updateRows(const QVector &rows) { foreach (Surface3DController::ChangeRow item, rows) { - SurfaceSeriesRenderCache *cache = m_renderCacheList.value(item.series); + SurfaceSeriesRenderCache *cache = + static_cast(m_renderCacheList.value(item.series)); QSurfaceDataArray &dstArray = cache->dataArray(); const QRect &sampleSpace = cache->sampleSpace(); @@ -367,7 +346,8 @@ void Surface3DRenderer::updateRows(const QVector void Surface3DRenderer::updateItem(const QVector &points) { foreach (Surface3DController::ChangeItem item, points) { - SurfaceSeriesRenderCache *cache = m_renderCacheList.value(item.series); + SurfaceSeriesRenderCache *cache = + static_cast(m_renderCacheList.value(item.series)); QSurfaceDataArray &dstArray = cache->dataArray(); const QRect &sampleSpace = cache->sampleSpace(); @@ -404,38 +384,22 @@ void Surface3DRenderer::updateItem(const QVectorsetObjectDirty(true); -} - -void Surface3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, - QValue3DAxisFormatter *formatter) -{ - Abstract3DRenderer::updateAxisFormatter(orientation, formatter); - - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) - cache->setObjectDirty(true); -} - void Surface3DRenderer::updateSliceDataModel(const QPoint &point) { - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) - cache->sliceSurfaceObject()->clear(); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) + static_cast(baseCache)->sliceSurfaceObject()->clear(); if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) { // Find axis coordinates for the selected point - SurfaceSeriesRenderCache *selectedCache = + SeriesRenderCache *selectedCache = m_renderCacheList.value(const_cast(m_selectedSeries)); - QSurfaceDataArray &dataArray = selectedCache->dataArray(); + QSurfaceDataArray &dataArray = + static_cast(selectedCache)->dataArray(); QSurfaceDataItem item = dataArray.at(point.x())->at(point.y()); QPointF coords(item.x(), item.z()); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->series() != m_selectedSeries) { QPoint mappedPoint = mapCoordsToSampleSpace(cache, coords); updateSliceObject(cache, mappedPoint); @@ -446,9 +410,10 @@ void Surface3DRenderer::updateSliceDataModel(const QPoint &point) } else { if (m_selectedSeries) { SurfaceSeriesRenderCache *cache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + static_cast( + m_renderCacheList.value(m_selectedSeries)); if (cache) - updateSliceObject(cache, point); + updateSliceObject(static_cast(cache), point); } } } @@ -728,7 +693,8 @@ void Surface3DRenderer::render(GLuint defaultFboHandle) // Render selection ball if (m_selectionActive && m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem)) { - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->slicePointerActive() && cache->renderable() && m_cachedIsSlicingActivated ) { cache->sliceSelectionPointer()->render(defaultFboHandle); @@ -780,7 +746,8 @@ void Surface3DRenderer::drawSlicedScene() if (m_renderCacheList.size()) { bool drawGrid = false; - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->sliceSurfaceObject()->indexCount() && cache->renderable()) { if (!drawGrid && cache->surfaceGridVisible()) { glEnable(GL_POLYGON_OFFSET_FILL); @@ -838,10 +805,13 @@ void Surface3DRenderer::drawSlicedScene() m_surfaceGridShader->bind(); m_surfaceGridShader->setUniformValue(m_surfaceGridShader->color(), Utils::vectorFromColor(m_cachedTheme->gridLineColor())); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { - if (cache->sliceSurfaceObject()->indexCount() && cache->isSeriesVisible() && + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = + static_cast(baseCache); + if (cache->sliceSurfaceObject()->indexCount() && cache->isVisible() && cache->surfaceGridVisible()) { - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), cache->MVPMatrix()); + m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), + cache->MVPMatrix()); m_drawer->drawSurfaceGrid(m_surfaceGridShader, cache->sliceSurfaceObject()); } } @@ -1101,9 +1071,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_CULL_FACE); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); SurfaceObject *object = cache->surfaceObject(); - if (object->indexCount() && cache->surfaceVisible() && cache->isSeriesVisible() + if (object->indexCount() && cache->surfaceVisible() && cache->isVisible() && cache->sampleSpace().width() >= 2 && cache->sampleSpace().height() >= 2) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; @@ -1134,9 +1105,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_depthModelTexture, 0); glClear(GL_DEPTH_BUFFER_BIT); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); SurfaceObject *object = cache->surfaceObject(); - if (object->indexCount() && cache->surfaceVisible() && cache->isSeriesVisible() + if (object->indexCount() && cache->surfaceVisible() && cache->isVisible() && cache->sampleSpace().width() >= 2 && cache->sampleSpace().height() >= 2) { m_depthShader->setUniformValue(m_depthShader->MVP(), cache->MVPMatrix()); @@ -1195,7 +1167,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_CULL_FACE); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->surfaceObject()->indexCount() && cache->renderable()) { QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; @@ -1242,7 +1215,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) bool drawGrid = false; - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; @@ -1255,7 +1229,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) cache->setMVPMatrix(MVPMatrix); const QRect &sampleSpace = cache->sampleSpace(); - if (cache->surfaceObject()->indexCount() && cache->isSeriesVisible() && + if (cache->surfaceObject()->indexCount() && cache->isVisible() && sampleSpace.width() >= 2 && sampleSpace.height() >= 2) { noShadows = false; if (!drawGrid && cache->surfaceGridVisible()) { @@ -1318,13 +1292,18 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_POLYGON_OFFSET_FILL); m_surfaceGridShader->bind(); m_surfaceGridShader->setUniformValue(m_surfaceGridShader->color(), - Utils::vectorFromColor(m_cachedTheme->gridLineColor())); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), cache->MVPMatrix()); + Utils::vectorFromColor( + m_cachedTheme->gridLineColor())); + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = + static_cast(baseCache); + m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), + cache->MVPMatrix()); const QRect &sampleSpace = cache->sampleSpace(); - if (cache->surfaceObject()->indexCount() && cache->surfaceGridVisible() && - cache->isSeriesVisible() && sampleSpace.width() >= 2 && sampleSpace.height() >= 2) { + if (cache->surfaceObject()->indexCount() && cache->surfaceGridVisible() + && cache->isVisible() && sampleSpace.width() >= 2 + && sampleSpace.height() >= 2) { m_drawer->drawSurfaceGrid(m_surfaceGridShader, cache->surfaceObject()); } } @@ -1746,7 +1725,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QPoint visiblePoint = Surface3DController::invalidSelectionPosition(); if (m_selectedSeries) { SurfaceSeriesRenderCache *cache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + static_cast( + m_renderCacheList.value(const_cast(m_selectedSeries))); if (cache && m_selectedPoint != Surface3DController::invalidSelectionPosition()) { const QRect &sampleSpace = cache->sampleSpace(); int x = m_selectedPoint.x() - sampleSpace.y(); @@ -1985,7 +1965,9 @@ void Surface3DRenderer::updateSelectionTextures() { uint lastSelectionId = 1; - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = + static_cast(baseCache); GLuint texture = cache->selectionTexture(); m_textureHelper->deleteTexture(&texture); createSelectionTexture(cache, lastSelectionId); @@ -2113,14 +2095,13 @@ void Surface3DRenderer::updateObjects(SurfaceSeriesRenderCache *cache, bool dime QSurfaceDataArray &dataArray = cache->dataArray(); const QRect &sampleSpace = cache->sampleSpace(); - if (cache->isFlatShadingEnabled()) cache->surfaceObject()->setUpData(dataArray, sampleSpace, dimensionChanged); else cache->surfaceObject()->setUpSmoothData(dataArray, sampleSpace, dimensionChanged); } -void Surface3DRenderer::updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series) +void Surface3DRenderer::updateSelectedPoint(const QPoint &position, QSurface3DSeries *series) { m_selectedPoint = position; m_selectedSeries = series; @@ -2153,7 +2134,9 @@ void Surface3DRenderer::loadGridLineMesh() void Surface3DRenderer::surfacePointSelected(const QPoint &point) { - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = + static_cast(baseCache); cache->setSlicePointerActivity(false); cache->setMainPointerActivity(false); } @@ -2161,12 +2144,15 @@ void Surface3DRenderer::surfacePointSelected(const QPoint &point) if (m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries)) { // Find axis coordinates for the selected point SurfaceSeriesRenderCache *selectedCache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + static_cast( + m_renderCacheList.value(const_cast(m_selectedSeries))); QSurfaceDataArray &dataArray = selectedCache->dataArray(); QSurfaceDataItem item = dataArray.at(point.x())->at(point.y()); QPointF coords(item.x(), item.z()); - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = + static_cast(baseCache); if (cache->series() != m_selectedSeries) { QPoint mappedPoint = mapCoordsToSampleSpace(cache, coords); updateSelectionPoint(cache, mappedPoint, false); @@ -2177,7 +2163,8 @@ void Surface3DRenderer::surfacePointSelected(const QPoint &point) } else { if (m_selectedSeries) { SurfaceSeriesRenderCache *cache = - m_renderCacheList.value(const_cast(m_selectedSeries)); + static_cast( + m_renderCacheList.value(const_cast(m_selectedSeries))); if (cache) updateSelectionPoint(cache, point, true); } @@ -2262,7 +2249,8 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) // Not a label selection SurfaceSeriesRenderCache *selectedCache = 0; - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->isWithinIdRange(id)) { selectedCache = cache; break; @@ -2346,7 +2334,8 @@ void Surface3DRenderer::updateSlicingActive(bool isSlicing) m_selectionDirty = true; - foreach (SurfaceSeriesRenderCache *cache, m_renderCacheList) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + SurfaceSeriesRenderCache *cache = static_cast(baseCache); if (cache->mainSelectionPointer()) cache->mainSelectionPointer()->updateBoundingRect(m_primarySubViewport); } diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 39e96f55..e1147e3c 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -95,9 +95,8 @@ private: QSizeF m_areaSize; bool m_hasHeightAdjustmentChanged; QPoint m_selectedPoint; - const QSurface3DSeries *m_selectedSeries; + QSurface3DSeries *m_selectedSeries; QPoint m_clickedPosition; - QHash m_renderCacheList; bool m_selectionTexturesDirty; GLuint m_noShadowTexture; @@ -106,17 +105,15 @@ public: ~Surface3DRenderer(); void updateData(); - void updateSeries(const QList &seriesList, bool updateVisibility); + void updateSeries(const QList &seriesList); + SeriesRenderCache *createNewCache(QAbstract3DSeries *series); + void cleanCache(SeriesRenderCache *cache); void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode); - void modifiedSeriesList(const QVector &seriesList); void updateRows(const QVector &rows); void updateItem(const QVector &points); - void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max); - void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, - QValue3DAxisFormatter *formatter); void updateScene(Q3DScene *scene); void updateSlicingActive(bool isSlicing); - void updateSelectedPoint(const QPoint &position, const QSurface3DSeries *series); + void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } void resetClickedStatus(); diff --git a/src/datavisualization/engine/surfaceseriesrendercache.cpp b/src/datavisualization/engine/surfaceseriesrendercache.cpp index ad81f714..db3fa9f7 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache.cpp +++ b/src/datavisualization/engine/surfaceseriesrendercache.cpp @@ -19,16 +19,18 @@ #include "seriesrendercache_p.h" #include "surfaceseriesrendercache_p.h" #include "objecthelper_p.h" -#include "abstract3drenderer_p.h" +#include "surface3drenderer_p.h" #include "texturehelper_p.h" #include "utils_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION -SurfaceSeriesRenderCache::SurfaceSeriesRenderCache(Surface3DRenderer *renderer) - : m_surfaceVisible(false), +SurfaceSeriesRenderCache::SurfaceSeriesRenderCache(QAbstract3DSeries *series, + Surface3DRenderer *renderer) + : SeriesRenderCache(series, renderer), + m_surfaceVisible(false), m_surfaceGridVisible(false), - m_surfaceFlatShading(true), + m_surfaceFlatShading(false), m_surfaceObj(new SurfaceObject(renderer)), m_sliceSurfaceObj(new SurfaceObject(renderer)), m_sampleSpace(QRect(0, 0, 0 , 0)), @@ -36,13 +38,11 @@ SurfaceSeriesRenderCache::SurfaceSeriesRenderCache(Surface3DRenderer *renderer) m_selectionIdStart(0), m_selectionIdEnd(0), m_flatChangeAllowed(true), - m_flatStatusDirty(false), + m_flatStatusDirty(true), m_sliceSelectionPointer(0), m_mainSelectionPointer(0), m_slicePointerActive(false), - m_mainPointerActive(false), - m_valid(false), - m_objectDirty(true) + m_mainPointerActive(false) { } @@ -50,17 +50,15 @@ SurfaceSeriesRenderCache::~SurfaceSeriesRenderCache() { } -void SurfaceSeriesRenderCache::populate(QSurface3DSeries *series, Abstract3DRenderer *renderer) +void SurfaceSeriesRenderCache::populate(bool newSeries) { - Q_ASSERT(series); + SeriesRenderCache::populate(newSeries); - SeriesRenderCache::populate(series, renderer); - - QSurface3DSeries::DrawFlags drawMode = series->drawMode(); + QSurface3DSeries::DrawFlags drawMode = series()->drawMode(); m_surfaceVisible = drawMode.testFlag(QSurface3DSeries::DrawSurface); m_surfaceGridVisible = drawMode.testFlag(QSurface3DSeries::DrawWireframe); - if (m_flatChangeAllowed && m_surfaceFlatShading != series->isFlatShadingEnabled()) { - m_surfaceFlatShading = series->isFlatShadingEnabled(); + if (m_flatChangeAllowed && m_surfaceFlatShading != series()->isFlatShadingEnabled()) { + m_surfaceFlatShading = series()->isFlatShadingEnabled(); m_flatStatusDirty = true; } } diff --git a/src/datavisualization/engine/surfaceseriesrendercache_p.h b/src/datavisualization/engine/surfaceseriesrendercache_p.h index bab16201..9d373812 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache_p.h +++ b/src/datavisualization/engine/surfaceseriesrendercache_p.h @@ -48,10 +48,10 @@ class TextureHelper; class SurfaceSeriesRenderCache : public SeriesRenderCache { public: - SurfaceSeriesRenderCache(Surface3DRenderer *renderer); + SurfaceSeriesRenderCache(QAbstract3DSeries *series, Surface3DRenderer *renderer); virtual ~SurfaceSeriesRenderCache(); - void populate(QSurface3DSeries *series, Abstract3DRenderer *renderer); + virtual void populate(bool newSeries); virtual void cleanup(TextureHelper *texHelper); inline bool surfaceVisible() const { return m_surfaceVisible; } @@ -59,8 +59,6 @@ public: inline bool isFlatShadingEnabled() const { return m_surfaceFlatShading; } inline void setFlatShadingEnabled(bool enabled) { m_surfaceFlatShading = enabled; } inline void setFlatChangeAllowed(bool allowed) { m_flatChangeAllowed = allowed; } - inline void setValid(bool valid) { m_valid = valid; } - inline bool isValid() const { return m_valid; } inline SurfaceObject *surfaceObject() { return m_surfaceObj; } inline SurfaceObject *sliceSurfaceObject() { return m_sliceSurfaceObj; } inline const QRect &sampleSpace() const { return m_sampleSpace; } @@ -68,11 +66,8 @@ public: inline QSurface3DSeries *series() const { return static_cast(m_series); } inline QSurfaceDataArray &dataArray() { return m_dataArray; } inline QSurfaceDataArray &sliceDataArray() { return m_sliceDataArray; } - inline bool isSeriesVisible() const { return m_series->isVisible(); } - inline bool renderable() const { return m_series->isVisible() && (m_surfaceVisible || - m_surfaceGridVisible); } - inline void setObjectDirty(bool state) { m_objectDirty = state; } - inline bool objectDirty() const { return m_objectDirty; } + inline bool renderable() const { return m_visible && (m_surfaceVisible || + m_surfaceGridVisible); } inline void setSelectionTexture(GLuint texture) { m_selectionTexture = texture; } inline GLuint selectionTexture() const { return m_selectionTexture; } inline void setSelectionIdRange(uint start, uint end) { m_selectionIdStart = start; @@ -82,7 +77,6 @@ public: selection <= m_selectionIdEnd; } inline bool isFlatStatusDirty() const { return m_flatStatusDirty; } inline void setFlatStatusDirty(bool status) { m_flatStatusDirty = status; } - // m_MVPMatrix is volatile, used only for optimizing rendering a bit inline void setMVPMatrix(const QMatrix4x4 &matrix) { m_MVPMatrix = matrix; } inline const QMatrix4x4 &MVPMatrix() { return m_MVPMatrix; } @@ -115,9 +109,6 @@ protected: SelectionPointer *m_mainSelectionPointer; bool m_slicePointerActive; bool m_mainPointerActive; - - bool m_valid; - bool m_objectDirty; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp index b21961cb..96d04094 100644 --- a/src/datavisualization/utils/surfaceobject.cpp +++ b/src/datavisualization/utils/surfaceobject.cpp @@ -673,6 +673,8 @@ void SurfaceObject::clear() m_gridIndexCount = 0; m_indexCount = 0; m_surfaceType = Undefined; + m_vertices.clear(); + m_normals.clear(); } QVector3D SurfaceObject::normal(const QVector3D &a, const QVector3D &b, const QVector3D &c) diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 0a8bef55..2c095cf8 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -71,7 +71,8 @@ GraphModifier::GraphModifier(Q3DBars *barchart, QColorDialog *colorDialog) m_defaultInputHandler(0), m_ownTheme(0), m_builtinTheme(new Q3DTheme(Q3DTheme::ThemeStoneMoss)), - m_customInputHandler(new CustomInputHandler) + m_customInputHandler(new CustomInputHandler), + m_extraSeries(0) { m_temperatureData->setObjectName("m_temperatureData"); m_temperatureData2->setObjectName("m_temperatureData2"); @@ -1149,6 +1150,67 @@ void GraphModifier::changeLogBase(const QString &text) formatter->setBase(qreal(text.toDouble())); } +void GraphModifier::addRemoveSeries() +{ + static int counter = 0; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "New series"; + m_extraSeries = new QBar3DSeries; + m_graph->addSeries(m_extraSeries); + QObject::connect(m_extraSeries, &QBar3DSeries::selectedBarChanged, this, + &GraphModifier::handleSelectionChange); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Add data to series"; + QBarDataArray *array = new QBarDataArray; + array->reserve(5); + for (int i = 0; i < 5; i++) { + array->append(new QBarDataRow(10)); + for (int j = 0; j < 10; j++) + (*array->at(i))[j].setValue(i * j); + } + m_extraSeries->dataProxy()->resetArray(array); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Hide series"; + m_extraSeries->setVisible(false); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Modify data when hidden"; + QBarDataArray array; + array.reserve(5); + for (int i = 0; i < 5; i++) { + array.append(new QBarDataRow(10)); + for (int j = 0; j < 10; j++) + (*array.at(i))[j].setValue(2 * i * j); + } + m_extraSeries->dataProxy()->addRows(array); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Show series again"; + m_extraSeries->setVisible(true); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Remove series"; + m_graph->removeSeries(m_extraSeries); + delete m_extraSeries; + m_extraSeries = 0; + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void GraphModifier::changeValueAxisSegments(int value) { qDebug() << __FUNCTION__ << value; diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 214c4e17..e64b282a 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -91,6 +91,7 @@ public: void changeValueAxisFormat(const QString & text); void changeLogBase(const QString & text); void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } + void addRemoveSeries(); public slots: void flipViews(); @@ -162,6 +163,7 @@ private: QTimer m_selectionTimer; QTimer m_rotationTimer; QLabel *m_fpsLabel; + QBar3DSeries *m_extraSeries; }; #endif diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index b1589e0f..e02bddce 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -66,6 +66,10 @@ int main(int argc, char **argv) hLayout->addLayout(vLayout); hLayout->addLayout(vLayout2); + QPushButton *addSeriesButton = new QPushButton(widget); + addSeriesButton->setText(QStringLiteral("Add / Remove a series")); + addSeriesButton->setEnabled(true); + QPushButton *addDataButton = new QPushButton(widget); addDataButton->setText(QStringLiteral("Add a row of data")); addDataButton->setEnabled(false); @@ -305,6 +309,7 @@ int main(int argc, char **argv) valueAxisSegmentsSpin->setMaximum(100); valueAxisSegmentsSpin->setValue(10); + vLayout->addWidget(addSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(addDataButton, 0, Qt::AlignTop); vLayout->addWidget(addMultiDataButton, 0, Qt::AlignTop); vLayout->addWidget(insertDataButton, 0, Qt::AlignTop); @@ -419,6 +424,7 @@ int main(int argc, char **argv) QObject::connect(labelButton, &QPushButton::clicked, modifier, &GraphModifier::changeLabelStyle); QObject::connect(addDataButton, &QPushButton::clicked, modifier, &GraphModifier::addRow); + QObject::connect(addSeriesButton, &QPushButton::clicked, modifier, &GraphModifier::addRemoveSeries); QObject::connect(addMultiDataButton, &QPushButton::clicked, modifier, &GraphModifier::addRows); QObject::connect(insertDataButton, &QPushButton::clicked, modifier, &GraphModifier::insertRow); QObject::connect(insertMultiDataButton, &QPushButton::clicked, modifier, &GraphModifier::insertRows); diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index fbe257f5..2bd60aff 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -102,6 +102,9 @@ int main(int argc, char **argv) QPushButton *setSelectedItemButton = new QPushButton(widget); setSelectedItemButton->setText(QStringLiteral("Select/deselect item 3")); + QPushButton *clearSeriesDataButton = new QPushButton(widget); + clearSeriesDataButton->setText(QStringLiteral("Clear series data")); + QPushButton *addSeriesButton = new QPushButton(widget); addSeriesButton->setText(QStringLiteral("Add Series")); @@ -220,6 +223,7 @@ int main(int argc, char **argv) vLayout->addWidget(removeOneButton, 0, Qt::AlignTop); vLayout->addWidget(removeBunchButton, 0, Qt::AlignTop); vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop); + vLayout->addWidget(clearSeriesDataButton, 0, Qt::AlignTop); vLayout->addWidget(addSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(removeSeriesButton, 0, Qt::AlignTop); vLayout->addWidget(toggleSeriesVisibilityButton, 0, Qt::AlignTop); @@ -280,6 +284,8 @@ int main(int argc, char **argv) &ScatterDataModifier::removeBunch); QObject::connect(setSelectedItemButton, &QPushButton::clicked, modifier, &ScatterDataModifier::selectItem); + QObject::connect(clearSeriesDataButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::clearSeriesData); QObject::connect(addSeriesButton, &QPushButton::clicked, modifier, &ScatterDataModifier::addSeries); QObject::connect(removeSeriesButton, &QPushButton::clicked, modifier, diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index a589919f..2e208926 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -459,6 +459,12 @@ void ScatterDataModifier::setGradient() } } +void ScatterDataModifier::clearSeriesData() +{ + if (m_targetSeries) + m_targetSeries->dataProxy()->resetArray(0); +} + void ScatterDataModifier::addSeries() { QScatter3DSeries *series = createAndAddSeries(); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 23071c85..1470f07b 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -71,6 +71,7 @@ public slots: void selectItem(); void handleSelectionChange(int index); void setGradient(); + void clearSeriesData(); void addSeries(); void removeSeries(); void toggleSeriesVisibility(); diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index e1fed76a..c87eb2fc 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -1093,6 +1093,44 @@ void GraphModifier::removeRow() m_zCount--; } +void GraphModifier::resetArray() +{ + qDebug() << "Reset series data array"; + int rows = 10; + int columns = 10; + float randFactor = float(rand() % 100) / 100.0f; + QSurfaceDataArray *planeArray = new QSurfaceDataArray; + planeArray->reserve(rows); + + for (int i = 0; i < rows; i++) { + planeArray->append(new QSurfaceDataRow); + (*planeArray)[i]->resize(columns); + for (int j = 0; j < columns; j++) { + (*planeArray->at(i))[j].setX(float(j) * randFactor); + (*planeArray->at(i))[j].setY(float(i - j) * randFactor); + (*planeArray->at(i))[j].setZ(float(i)); + } + } + +#ifdef MULTI_SERIES + int series = rand() % 4; + m_multiseries[series]->dataProxy()->resetArray(planeArray); +#else + m_theSeries->dataProxy()->resetArray(planeArray); +#endif +} + +void GraphModifier::resetArrayEmpty() +{ + QSurfaceDataArray *emptryArray = new QSurfaceDataArray; +#ifdef MULTI_SERIES + int series = rand() % 4; + m_multiseries[series]->dataProxy()->resetArray(emptryArray); +#else + m_theSeries->dataProxy()->resetArray(emptryArray); +#endif +} + void GraphModifier::changeMesh() { static int model = 0; diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index 9fd0360b..5c4ed033 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -105,6 +105,8 @@ public: void insertRow(); void insertRows(); void removeRow(); + void resetArray(); + void resetArrayEmpty(); public slots: void changeShadowQuality(int quality); diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 6b54b8dd..bddb2d11 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -338,6 +338,12 @@ int main(int argc, char *argv[]) QPushButton *removeRowButton = new QPushButton(widget); removeRowButton->setText(QStringLiteral("Remove a row")); + QPushButton *resetArrayButton = new QPushButton(widget); + resetArrayButton->setText(QStringLiteral("Reset Series Array to plane")); + + QPushButton *resetArrayEmptyButton = new QPushButton(widget); + resetArrayEmptyButton->setText(QStringLiteral("Reset Series Array to empty")); + QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); @@ -423,6 +429,8 @@ int main(int argc, char *argv[]) vLayout2->addWidget(insertRowButton); vLayout2->addWidget(insertRowsButton); vLayout2->addWidget(removeRowButton); + vLayout2->addWidget(resetArrayButton); + vLayout2->addWidget(resetArrayEmptyButton); widget->show(); @@ -574,6 +582,10 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::insertRows); QObject::connect(removeRowButton,&QPushButton::clicked, modifier, &GraphModifier::removeRow); + QObject::connect(resetArrayButton,&QPushButton::clicked, + modifier, &GraphModifier::resetArray); + QObject::connect(resetArrayEmptyButton,&QPushButton::clicked, + modifier, &GraphModifier::resetArrayEmpty); #ifdef MULTI_SERIES modifier->setSeries1CB(series1CB); -- cgit v1.2.3 From 8c27fb407e0b5f2420d64a7b027fb58fb40718d5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 9 Apr 2014 14:10:35 +0300 Subject: Fix crash when shadows are supported but flat is not MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3033 Change-Id: I07c9a9e8795f0e282e8cbd696a627bc2dc8776bc Reviewed-by: Mika Salmela Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/surface3drenderer.cpp | 29 ++++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 9e5f0b37..0d5536e2 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2372,17 +2372,22 @@ void Surface3DRenderer::initShaders(const QString &vertexShader, const QString & m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentSurface")); } - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceShadowFlat"), - QStringLiteral(":/shaders/fragmentSurfaceShadowFlat")); - } else { - m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), - QStringLiteral(":/shaders/fragmentSurfaceFlat")); - } m_surfaceSliceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentSurface")); - m_surfaceSliceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), - QStringLiteral(":/shaders/fragmentSurfaceFlat")); + if (m_flatSupported) { + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceShadowFlat"), + QStringLiteral(":/shaders/fragmentSurfaceShadowFlat")); + } else { + m_surfaceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), + QStringLiteral(":/shaders/fragmentSurfaceFlat")); + } + m_surfaceSliceFlatShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), + QStringLiteral(":/shaders/fragmentSurfaceFlat")); + } else { + m_surfaceFlatShader = 0; + m_surfaceSliceFlatShader = 0; + } #else m_surfaceSmoothShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentSurfaceES2")); @@ -2394,9 +2399,11 @@ void Surface3DRenderer::initShaders(const QString &vertexShader, const QString & QStringLiteral(":/shaders/fragmentSurfaceES2")); #endif m_surfaceSmoothShader->initialize(); - m_surfaceFlatShader->initialize(); m_surfaceSliceSmoothShader->initialize(); - m_surfaceSliceFlatShader->initialize(); + if (m_flatSupported) { + m_surfaceFlatShader->initialize(); + m_surfaceSliceFlatShader->initialize(); + } } void Surface3DRenderer::initBackgroundShaders(const QString &vertexShader, -- cgit v1.2.3 From ee81feea6f50ab85ad9743098708b1acdb851920 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 11 Apr 2014 09:58:06 +0300 Subject: Fix compile error on ES2 builds Also fix one cosmetic issue. Change-Id: I80f04dc214b544755d2e4b462a3c30277582c390 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/bars3drenderer.cpp | 2 +- src/datavisualization/engine/scatter3drenderer.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 6102adde..c8b25463 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -277,7 +277,7 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) int visualIndex = 0; m_haveUniformColorSeries = false; m_haveGradientSeries = false; - for (int i = 0 ; i < seriesCount; i++) { + for (int i = 0; i < seriesCount; i++) { QBar3DSeries *barSeries = static_cast(seriesList[i]); if (barSeries->isVisible()) { BarSeriesRenderCache *cache = diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index c6e243a1..ef39deba 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -484,7 +484,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) ShaderHelper *pointSelectionShader = m_selectionShader; #else - Q_UNUSED(havePointSeries); ShaderHelper *pointSelectionShader = m_pointShader; #endif ShaderHelper *selectionShader = m_selectionShader; -- cgit v1.2.3 From 79646ac9664745701667104c19bbae8cba8fd2e3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 11 Apr 2014 13:19:29 +0300 Subject: Added some tests for massive arrays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iac99e4fddbbbcb9074051199815e0c58412582fa Reviewed-by: Tomi Korpipää --- tests/scattertest/main.cpp | 16 ++-- tests/scattertest/scatterchart.cpp | 162 ++++++++++++++++++++++++++++++++++++ tests/scattertest/scatterchart.h | 5 ++ tests/surfacetest/graphmodifier.cpp | 147 ++++++++++++++++++++++++++++++++ tests/surfacetest/graphmodifier.h | 5 ++ tests/surfacetest/main.cpp | 6 ++ 6 files changed, 336 insertions(+), 5 deletions(-) diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 2bd60aff..78bab934 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -120,6 +120,9 @@ int main(int argc, char **argv) QPushButton *startTimerButton = new QPushButton(widget); startTimerButton->setText(QStringLiteral("Start/stop timer")); + QPushButton *massiveDataTestButton = new QPushButton(widget); + massiveDataTestButton->setText(QStringLiteral("Massive data test")); + QLinearGradient grBtoY(0, 0, 100, 0); grBtoY.setColorAt(1.0, Qt::black); grBtoY.setColorAt(0.67, Qt::blue); @@ -229,12 +232,13 @@ int main(int argc, char **argv) vLayout->addWidget(toggleSeriesVisibilityButton, 0, Qt::AlignTop); vLayout->addWidget(changeSeriesNameButton, 0, Qt::AlignTop); vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); - vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop); - vLayout->addWidget(backgroundCheckBox); - vLayout->addWidget(gridCheckBox); - vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); - vLayout->addWidget(shadowQuality, 1, Qt::AlignTop); + vLayout->addWidget(massiveDataTestButton, 1, Qt::AlignTop); + vLayout2->addWidget(gradientBtoYPB, 0, Qt::AlignTop); + vLayout2->addWidget(backgroundCheckBox); + vLayout2->addWidget(gridCheckBox); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); + vLayout2->addWidget(shadowQuality, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust point size"))); vLayout2->addWidget(pointSizeSlider, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust data window"))); @@ -296,6 +300,8 @@ int main(int argc, char **argv) &ScatterDataModifier::changeSeriesName); QObject::connect(startTimerButton, &QPushButton::clicked, modifier, &ScatterDataModifier::startStopTimer); + QObject::connect(massiveDataTestButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::massiveDataTest); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, &ScatterDataModifier::setGradient); QObject::connect(themeButton, &QPushButton::clicked, modifier, diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 2e208926..c9404736 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -62,6 +62,8 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) &ScatterDataModifier::handleAxisYChanged); QObject::connect(m_chart, &Q3DScatter::axisZChanged, this, &ScatterDataModifier::handleAxisZChanged); + QObject::connect(m_chart, &QAbstract3DGraph::currentFpsChanged, this, + &ScatterDataModifier::handleFpsChange); } ScatterDataModifier::~ScatterDataModifier() @@ -74,6 +76,161 @@ void ScatterDataModifier::start() addData(); } +static const int itemsPerUnit = 100; // "unit" is one unit range along Z-axis + +void ScatterDataModifier::massiveDataTest() +{ + static int testPhase = 0; + static QTimer *massiveTestTimer = 0; + + if (!massiveTestTimer) + massiveTestTimer = new QTimer; + + int items = 1000000; + int visibleRange = 200; + int unitCount = items / itemsPerUnit; + int cacheSize = visibleRange * itemsPerUnit * 5; + + switch (testPhase) { + case 0: { + float yRangeMin = 0.0f; + float yRangeMax = 1.0f; + float yRangeMargin = 0.05f; + float minY = yRangeMin + yRangeMargin; + float maxY = yRangeMax - yRangeMargin; + float unitBase = minY; + float direction = 1.0f; + + if (!m_massiveTestCacheArray.size()) { + m_massiveTestCacheArray.resize(cacheSize); + int totalIndex = 0; + for (int i = 0; i < unitCount && totalIndex < cacheSize; i++) { + unitBase += direction * (float(rand() % 3) / 100.0f); + if (unitBase > maxY) { + unitBase = maxY; + direction = -1.0f; + } else if (unitBase < minY) { + unitBase = minY; + direction = 1.0f; + } + for (int j = 0; j < itemsPerUnit && totalIndex < cacheSize; j++) { + float randFactor = float(rand() % 100) / (100 / yRangeMargin); + m_massiveTestCacheArray[totalIndex].setPosition( + QVector3D(float(qrand() % itemsPerUnit), + unitBase + randFactor, 0.0f)); + // Z value is irrelevant, we replace it anyway when we take item to use + totalIndex++; + } + } + } + + qDebug() << __FUNCTION__ << testPhase << ": Setting the graph up..."; + QValue3DAxis *xAxis = new QValue3DAxis(); + QValue3DAxis *yAxis = new QValue3DAxis(); + QValue3DAxis *zAxis = new QValue3DAxis(); + xAxis->setRange(0.0f, float(itemsPerUnit - 1)); + yAxis->setRange(yRangeMin, yRangeMax); + zAxis->setRange(0.0f, float(visibleRange - 1)); + xAxis->setSegmentCount(1); + yAxis->setSegmentCount(1); + zAxis->setSegmentCount(1); + m_chart->setMeasureFps(true); + m_chart->setAxisX(xAxis); + m_chart->setAxisY(yAxis); + m_chart->setAxisZ(zAxis); + m_chart->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetRight); + m_chart->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); + foreach (QAbstract3DSeries *series, m_chart->seriesList()) + m_chart->removeSeries(static_cast(series)); + + qDebug() << __FUNCTION__ << testPhase << ": Creating massive array..." << items; + QScatterDataArray *massiveArray = new QScatterDataArray; + massiveArray->resize(items); + + int cacheIndex = 0; + for (int i = 0; i < items; i++) { + // Use qreals for precicion as the numbers can overflow int + float currentZ = float(qreal(i) * qreal(unitCount) / qreal(items)); + (*massiveArray)[i] = m_massiveTestCacheArray.at(cacheIndex++); + (*massiveArray)[i].setZ(currentZ); + if (cacheIndex >= cacheSize) + cacheIndex = 0; + } + qDebug() << __FUNCTION__ << testPhase << ": Massive array creation finished!"; + + QScatter3DSeries *series = new QScatter3DSeries; + series->dataProxy()->resetArray(massiveArray); + series->setMesh(QAbstract3DSeries::MeshPoint); + m_chart->addSeries(series); + break; + } + case 1: { + qDebug() << __FUNCTION__ << testPhase << ": Scroll"; + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &ScatterDataModifier::massiveTestScroll); + massiveTestTimer->start(16); + break; + } + case 2: { + qDebug() << __FUNCTION__ << testPhase << ": Append and scroll"; + massiveTestTimer->stop(); + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &ScatterDataModifier::massiveTestAppendAndScroll); + m_chart->axisZ()->setRange(unitCount - visibleRange, unitCount); + massiveTestTimer->start(16); + break; + } + default: + QObject::disconnect(massiveTestTimer, 0, this, 0); + massiveTestTimer->stop(); + qDebug() << __FUNCTION__ << testPhase << ": Resetting the test"; + testPhase = -1; + } + testPhase++; +} + +void ScatterDataModifier::massiveTestScroll() +{ + const int scrollAmount = 20; + int itemCount = m_chart->seriesList().at(0)->dataProxy()->itemCount(); + int min = m_chart->axisZ()->min() + scrollAmount; + int max = m_chart->axisZ()->max() + scrollAmount; + if (max >= itemCount / itemsPerUnit) { + max = max - min - 1; + min = 0; + } + m_chart->axisZ()->setRange(min, max); +} + +void ScatterDataModifier::massiveTestAppendAndScroll() +{ + const int addedUnits = 50; + const int addedItems = itemsPerUnit * addedUnits; + int cacheSize = m_massiveTestCacheArray.size(); + int itemCount = m_chart->seriesList().at(0)->dataProxy()->itemCount(); + static int cacheIndex = 0; + + // Copy items from cache + QScatterDataArray appendArray; + appendArray.resize(addedItems); + + float zOffset = m_chart->seriesList().at(0)->dataProxy()->itemAt(itemCount - 1)->z(); + for (int i = 0; i < addedItems; i++) { + float currentZ = zOffset + float(qreal(i) * qreal(addedUnits) / qreal(addedItems)); + appendArray[i] = m_massiveTestCacheArray.at(cacheIndex++); + appendArray[i].setZ(currentZ); + if (cacheIndex >= cacheSize) + cacheIndex = 0; + } + + m_chart->seriesList().at(0)->dataProxy()->addItems(appendArray); + int min = m_chart->axisZ()->min() + addedUnits; + int max = m_chart->axisZ()->max() + addedUnits; + m_chart->axisZ()->setRange(min, max); +} + void ScatterDataModifier::addData() { // Add labels @@ -514,6 +671,11 @@ void ScatterDataModifier::handleAxisZChanged(QValue3DAxis *axis) qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_chart->axisZ()); } +void ScatterDataModifier::handleFpsChange(qreal fps) +{ + qDebug() << "FPS:" << fps; +} + void ScatterDataModifier::changeShadowQuality(int quality) { QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 1470f07b..66f69625 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -52,6 +52,9 @@ public: void setMaxY(int max); void setMaxZ(int max); void start(); + void massiveDataTest(); + void massiveTestScroll(); + void massiveTestAppendAndScroll(); public slots: void changeShadowQuality(int quality); @@ -80,6 +83,7 @@ public slots: void handleAxisXChanged(QValue3DAxis *axis); void handleAxisYChanged(QValue3DAxis *axis); void handleAxisZChanged(QValue3DAxis *axis); + void handleFpsChange(qreal fps); signals: void shadowQualityChanged(int quality); @@ -94,6 +98,7 @@ private: int m_loopCounter; int m_selectedItem; QScatter3DSeries *m_targetSeries; + QScatterDataArray m_massiveTestCacheArray; }; #endif diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index c87eb2fc..a4eb3a27 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -117,6 +117,8 @@ GraphModifier::GraphModifier(Q3DSurface *graph) &GraphModifier::handleAxisYChanged); QObject::connect(m_graph, &Q3DSurface::axisZChanged, this, &GraphModifier::handleAxisZChanged); + QObject::connect(m_graph, &QAbstract3DGraph::currentFpsChanged, this, + &GraphModifier::handleFpsChange); } GraphModifier::~GraphModifier() @@ -693,6 +695,11 @@ void GraphModifier::handleAxisZChanged(QValue3DAxis *axis) qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_graph->axisZ()); } +void GraphModifier::handleFpsChange(qreal fps) +{ + qDebug() << "FPS:" << fps; +} + void GraphModifier::resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, float maxX) { m_axisMinSliderX->setValue(minX); @@ -1131,6 +1138,146 @@ void GraphModifier::resetArrayEmpty() #endif } +void GraphModifier::massiveDataTest() +{ + static int testPhase = 0; + static const int cacheSize = 1000; + const int columns = 200; + const int rows = 200000; + const int visibleRows = 200; + const float yRangeMin = 0.0f; + const float yRangeMax = 1.0f; + const float yRangeMargin = 0.05f; + static QTimer *massiveTestTimer = 0; + + // To speed up massive array creation, we generate a smaller cache array + // and copy rows from that to our main array + if (!m_massiveTestCacheArray.size()) { + m_massiveTestCacheArray.reserve(cacheSize); + float minY = yRangeMin + yRangeMargin; + float maxY = yRangeMax - yRangeMargin; + float rowBase = minY; + float direction = 1.0f; + for (int i = 0; i < cacheSize; i++) { + m_massiveTestCacheArray.append(new QSurfaceDataRow); + m_massiveTestCacheArray[i]->resize(columns); + rowBase += direction * (float(rand() % 3) / 100.0f); + if (rowBase > maxY) { + rowBase = maxY; + direction = -1.0f; + } else if (rowBase < minY) { + rowBase = minY; + direction = 1.0f; + } + for (int j = 0; j < columns; j++) { + float randFactor = float(rand() % 100) / (100 / yRangeMargin); + (*m_massiveTestCacheArray.at(i))[j].setX(float(j)); + (*m_massiveTestCacheArray.at(i))[j].setY(rowBase + randFactor); + // Z value is irrelevant, we replace it anyway when we take row to use + } + } + massiveTestTimer = new QTimer; + } + + switch (testPhase) { + case 0: { + qDebug() << __FUNCTION__ << testPhase << ": Setting the graph up..."; + QValue3DAxis *xAxis = new QValue3DAxis(); + QValue3DAxis *yAxis = new QValue3DAxis(); + QValue3DAxis *zAxis = new QValue3DAxis(); + xAxis->setRange(0.0f, float(columns)); + yAxis->setRange(yRangeMin, yRangeMax); + zAxis->setRange(0.0f, float(visibleRows)); + xAxis->setSegmentCount(1); + yAxis->setSegmentCount(1); + zAxis->setSegmentCount(1); + m_graph->setMeasureFps(true); + m_graph->setAxisX(xAxis); + m_graph->setAxisY(yAxis); + m_graph->setAxisZ(zAxis); + m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetRight); + m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); + foreach (QAbstract3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(static_cast(series)); + + qDebug() << __FUNCTION__ << testPhase << ": Creating massive array..." + << rows << "x" << columns; + QSurfaceDataArray *massiveArray = new QSurfaceDataArray; + massiveArray->reserve(rows); + + for (int i = 0; i < rows; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(*m_massiveTestCacheArray.at(i % cacheSize)); + for (int j = 0; j < columns; j++) + (*newRow)[j].setZ(float(i)); + massiveArray->append(newRow); + } + qDebug() << __FUNCTION__ << testPhase << ": Massive array creation finished!"; + + QSurface3DSeries *series = new QSurface3DSeries; + series->dataProxy()->resetArray(massiveArray); + m_graph->addSeries(series); + break; + } + case 1: { + qDebug() << __FUNCTION__ << testPhase << ": Scroll"; + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &GraphModifier::massiveTestScroll); + massiveTestTimer->start(16); + break; + } + case 2: { + qDebug() << __FUNCTION__ << testPhase << ": Append and scroll"; + massiveTestTimer->stop(); + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &GraphModifier::massiveTestAppendAndScroll); + m_graph->axisZ()->setRange(rows - visibleRows, rows); + massiveTestTimer->start(16); + break; + } + default: + QObject::disconnect(massiveTestTimer, 0, this, 0); + massiveTestTimer->stop(); + qDebug() << __FUNCTION__ << testPhase << ": Resetting the test"; + testPhase = -1; + } + testPhase++; +} + +void GraphModifier::massiveTestScroll() +{ + const int scrollAmount = 20; + int maxRows = m_graph->seriesList().at(0)->dataProxy()->rowCount(); + int min = m_graph->axisZ()->min() + scrollAmount; + int max = m_graph->axisZ()->max() + scrollAmount; + if (max >= maxRows) { + max = max - min; + min = 0; + } + m_graph->axisZ()->setRange(min, max); +} + +void GraphModifier::massiveTestAppendAndScroll() +{ + const int addedRows = 50; + int maxRows = m_graph->seriesList().at(0)->dataProxy()->rowCount(); + int columns = m_graph->seriesList().at(0)->dataProxy()->columnCount(); + + QSurfaceDataArray appendArray; + appendArray.reserve(addedRows); + for (int i = 0; i < addedRows; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(*m_massiveTestCacheArray.at((i + maxRows) % 1000)); + for (int j = 0; j < columns; j++) + (*newRow)[j].setZ(float(maxRows + i)); + appendArray.append(newRow); + } + m_graph->seriesList().at(0)->dataProxy()->addRows(appendArray); + int min = m_graph->axisZ()->min() + addedRows; + int max = m_graph->axisZ()->max() + addedRows; + m_graph->axisZ()->setRange(min, max); +} + void GraphModifier::changeMesh() { static int model = 0; diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index 5c4ed033..f79055df 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -107,6 +107,9 @@ public: void removeRow(); void resetArray(); void resetArrayEmpty(); + void massiveDataTest(); + void massiveTestScroll(); + void massiveTestAppendAndScroll(); public slots: void changeShadowQuality(int quality); @@ -118,6 +121,7 @@ public slots: void handleAxisXChanged(QValue3DAxis *axis); void handleAxisYChanged(QValue3DAxis *axis); void handleAxisZChanged(QValue3DAxis *axis); + void handleFpsChange(qreal fps); private: void fillSeries(); @@ -168,6 +172,7 @@ private: float m_offset; float m_multiSampleOffsetX[4]; float m_multiSampleOffsetZ[4]; + QSurfaceDataArray m_massiveTestCacheArray; }; #endif diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index bddb2d11..aa300207 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -344,6 +344,9 @@ int main(int argc, char *argv[]) QPushButton *resetArrayEmptyButton = new QPushButton(widget); resetArrayEmptyButton->setText(QStringLiteral("Reset Series Array to empty")); + QPushButton *massiveDataTestButton = new QPushButton(widget); + massiveDataTestButton->setText(QStringLiteral("Massive data test")); + QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); @@ -431,6 +434,7 @@ int main(int argc, char *argv[]) vLayout2->addWidget(removeRowButton); vLayout2->addWidget(resetArrayButton); vLayout2->addWidget(resetArrayEmptyButton); + vLayout2->addWidget(massiveDataTestButton); widget->show(); @@ -586,6 +590,8 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::resetArray); QObject::connect(resetArrayEmptyButton,&QPushButton::clicked, modifier, &GraphModifier::resetArrayEmpty); + QObject::connect(massiveDataTestButton,&QPushButton::clicked, + modifier, &GraphModifier::massiveDataTest); #ifdef MULTI_SERIES modifier->setSeries1CB(series1CB); -- cgit v1.2.3 From a30c0c304e55ffe30545ab0838e4dbe11a99b8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 15 Apr 2014 10:32:03 +0300 Subject: Add custom item support, part 1 Task-number: QTRD-2866 + Added API for adding and removing custom items + Added custom data and custom render items + Added shaders for textured objects + Added custom item rendering draft to scatter + Fixed some shaders - to be continued in part 2 Change-Id: I9735fd02fc9e86ae486cca4c06f6d7f2a4b0b7da Reviewed-by: Mika Salmela --- src/datavisualization/data/customdataitem.cpp | 48 ++++++++ src/datavisualization/data/customdataitem_p.h | 65 +++++++++++ src/datavisualization/data/customrenderitem.cpp | 51 +++++++++ src/datavisualization/data/customrenderitem_p.h | 60 ++++++++++ src/datavisualization/data/data.pri | 8 +- .../engine/abstract3dcontroller.cpp | 39 ++++++- .../engine/abstract3dcontroller_p.h | 8 ++ .../engine/abstract3drenderer.cpp | 20 +++- .../engine/abstract3drenderer_p.h | 15 ++- src/datavisualization/engine/bars3drenderer.cpp | 25 +++++ src/datavisualization/engine/bars3drenderer_p.h | 4 + src/datavisualization/engine/engine.qrc | 2 + src/datavisualization/engine/qabstract3dgraph.cpp | 32 ++++++ src/datavisualization/engine/qabstract3dgraph.h | 8 +- src/datavisualization/engine/scatter3drenderer.cpp | 124 +++++++++++++++++++++ src/datavisualization/engine/scatter3drenderer_p.h | 6 + src/datavisualization/engine/shaders/default.vert | 8 +- src/datavisualization/engine/shaders/shadow.vert | 8 +- .../engine/shaders/surfaceFlat.vert | 8 +- .../engine/shaders/surfaceShadowFlat.vert | 8 +- src/datavisualization/engine/shaders/texture.frag | 37 ++++++ .../engine/shaders/texture_ES2.frag | 40 +++++++ src/datavisualization/engine/surface3drenderer.cpp | 32 +++++- src/datavisualization/engine/surface3drenderer_p.h | 4 + .../global/datavisualizationglobal_p.h | 1 + 25 files changed, 634 insertions(+), 27 deletions(-) create mode 100644 src/datavisualization/data/customdataitem.cpp create mode 100644 src/datavisualization/data/customdataitem_p.h create mode 100644 src/datavisualization/data/customrenderitem.cpp create mode 100644 src/datavisualization/data/customrenderitem_p.h create mode 100644 src/datavisualization/engine/shaders/texture.frag create mode 100644 src/datavisualization/engine/shaders/texture_ES2.frag diff --git a/src/datavisualization/data/customdataitem.cpp b/src/datavisualization/data/customdataitem.cpp new file mode 100644 index 00000000..8d3a033d --- /dev/null +++ b/src/datavisualization/data/customdataitem.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customdataitem_p.h" +#include "objecthelper_p.h" +#include "texturehelper_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +CustomDataItem::CustomDataItem() : + m_textureHelper(0), + m_texture(0) +{ + m_textureHelper = new TextureHelper(); +} + +CustomDataItem::~CustomDataItem() +{ + if (m_texture) + m_textureHelper->deleteTexture(&m_texture); + delete m_textureHelper; +} + +void CustomDataItem::setTextureImage(const QImage &textureImage) +{ + if (m_texture) + m_textureHelper->deleteTexture(&m_texture); + // Make a texture out of the image + if (!textureImage.isNull()) + m_texture = m_textureHelper->create2DTexture(textureImage, true, true, true); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/customdataitem_p.h b/src/datavisualization/data/customdataitem_p.h new file mode 100644 index 00000000..f607daba --- /dev/null +++ b/src/datavisualization/data/customdataitem_p.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef CUSTOMDATAITEM_P_H +#define CUSTOMDATAITEM_P_H + +#include "datavisualizationglobal_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class TextureHelper; + +class QT_DATAVISUALIZATION_EXPORT CustomDataItem +{ +public: + CustomDataItem(); + virtual ~CustomDataItem(); + + inline void setMeshFile(const QString &meshFile) { m_meshFile = meshFile; } + void setTextureImage(const QImage &textureImage); + inline void setPosition(const QVector3D &position) { m_position = position; } + inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } + inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; } + +private: + TextureHelper *m_textureHelper; + GLuint m_texture; + QString m_meshFile; + QVector3D m_position; + QVector3D m_scaling; + QQuaternion m_rotation; + + friend class Bars3DRenderer; + friend class Scatter3DRenderer; + friend class Surface3DRenderer; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/data/customrenderitem.cpp b/src/datavisualization/data/customrenderitem.cpp new file mode 100644 index 00000000..ad1fba71 --- /dev/null +++ b/src/datavisualization/data/customrenderitem.cpp @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customrenderitem_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +CustomRenderItem::CustomRenderItem() + : AbstractRenderItem(), + m_texture(0), + m_object(0) +{ +} + +CustomRenderItem::CustomRenderItem(const CustomRenderItem &other) + : AbstractRenderItem(other) +{ + m_texture = other.m_texture; +} + +CustomRenderItem::~CustomRenderItem() +{ + if (m_object) + delete m_object; +} + +void CustomRenderItem::setMesh(const QString &meshFile) +{ + if (m_object) + delete m_object; + // Load mesh and make an object of it + m_object = new ObjectHelper(meshFile); + m_object->load(); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h new file mode 100644 index 00000000..9b6dd167 --- /dev/null +++ b/src/datavisualization/data/customrenderitem_p.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef CUSTOMRENDERITEM_P_H +#define CUSTOMRENDERITEM_P_H + +#include "abstractrenderitem_p.h" +#include "objecthelper_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class CustomRenderItem : public AbstractRenderItem +{ +public: + CustomRenderItem(); + CustomRenderItem(const CustomRenderItem &other); + virtual ~CustomRenderItem(); + + inline void setTexture(GLuint texture) { m_texture = texture; } + inline GLuint texture() { return m_texture; } + void setMesh(const QString &meshFile); + inline ObjectHelper *mesh() { return m_object; } + inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } + inline QVector3D scaling() { return m_scaling; } + +private: + GLuint m_texture; + QVector3D m_scaling; + ObjectHelper *m_object; + }; +typedef QVector CustomRenderItemArray; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/data/data.pri b/src/datavisualization/data/data.pri index 6ebfed6b..d3d67076 100644 --- a/src/datavisualization/data/data.pri +++ b/src/datavisualization/data/data.pri @@ -36,7 +36,9 @@ HEADERS += \ $$PWD/qscatter3dseries.h \ $$PWD/qscatter3dseries_p.h \ $$PWD/qsurface3dseries.h \ - $$PWD/qsurface3dseries_p.h + $$PWD/qsurface3dseries_p.h \ + $$PWD/customrenderitem_p.h \ + $$PWD/customdataitem_p.h SOURCES += \ $$PWD/labelitem.cpp \ @@ -61,4 +63,6 @@ SOURCES += \ $$PWD/qabstract3dseries.cpp \ $$PWD/qbar3dseries.cpp \ $$PWD/qscatter3dseries.cpp \ - $$PWD/qsurface3dseries.cpp + $$PWD/qsurface3dseries.cpp \ + $$PWD/customrenderitem.cpp \ + $$PWD/customdataitem.cpp diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 885904d4..e10069ff 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -50,6 +50,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_axisZ(0), m_renderer(0), m_isDataDirty(true), + m_isCustomDataDirty(true), m_isSeriesVisualsDirty(true), m_renderPending(false), m_measureFps(false), @@ -87,6 +88,9 @@ Abstract3DController::~Abstract3DController() destroyRenderer(); delete m_scene; delete m_themeManager; + foreach (CustomDataItem *item, m_customItems) + delete item; + m_customItems.clear(); } void Abstract3DController::destroyRenderer() @@ -369,6 +373,11 @@ void Abstract3DController::synchDataToRenderer() m_renderer->updateData(); m_isDataDirty = false; } + + if (m_isCustomDataDirty) { + m_renderer->updateCustomData(m_customItems); + m_isCustomDataDirty = false; + } } void Abstract3DController::render(const GLuint defaultFboHandle) @@ -814,6 +823,30 @@ void Abstract3DController::requestRender(QOpenGLFramebufferObject *fbo) m_renderer->render(fbo->handle()); } +int Abstract3DController::addCustomItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QImage &textureImage) +{ + CustomDataItem *newItem = new CustomDataItem(); + newItem->setMeshFile(meshFile); + newItem->setPosition(position); + newItem->setScaling(scaling); + newItem->setRotation(rotation); + newItem->setTextureImage(textureImage); + m_customItems.append(newItem); + m_isCustomDataDirty = true; + emitNeedRender(); + return m_customItems.count() - 1; +} + +void Abstract3DController::deleteCustomItem(int index) +{ + delete m_customItems[index]; + m_customItems.removeAt(index); + m_isCustomDataDirty = true; + emitNeedRender(); +} + void Abstract3DController::handleAxisTitleChanged(const QString &title) { Q_UNUSED(title) @@ -974,9 +1007,9 @@ void Abstract3DController::setMeasureFps(bool enable) m_currentFps = 0.0; if (enable) { - m_frameTimer.start(); - m_numFrames = -1; - emitNeedRender(); + m_frameTimer.start(); + m_numFrames = -1; + emitNeedRender(); } emit measureFpsChanged(enable); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 4f597769..98df8fda 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -35,6 +35,7 @@ #include "qabstract3dinputhandler.h" #include "qabstractdataproxy.h" #include "q3dscene_p.h" +#include "customdataitem_p.h" #include #include @@ -155,6 +156,7 @@ protected: QList m_axes; // List of all added axes Abstract3DRenderer *m_renderer; bool m_isDataDirty; + bool m_isCustomDataDirty; bool m_isSeriesVisualsDirty; bool m_renderPending; @@ -167,6 +169,8 @@ protected: QVector m_changedSeriesList; + QList m_customItems; + explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); public: @@ -226,6 +230,10 @@ public: void requestRender(QOpenGLFramebufferObject *fbo); + int addCustomItem(const QString &meshFile, const QVector3D &position, const QVector3D &scaling, + const QQuaternion &rotation, const QImage &textureImage); + void deleteCustomItem(int index); + void emitNeedRender(); virtual void clearSelection() = 0; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index f70d128b..1cb4bdba 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -27,6 +27,7 @@ #include "q3dtheme_p.h" #include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" +#include "shaderhelper_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -48,7 +49,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0), - m_visibleSeriesCount(0) + m_visibleSeriesCount(0), + m_customItemShader(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -65,6 +67,7 @@ Abstract3DRenderer::~Abstract3DRenderer() delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; + delete m_customItemShader; foreach (SeriesRenderCache *cache, m_renderCacheList) { cache->cleanup(m_textureHelper); @@ -140,6 +143,15 @@ void Abstract3DRenderer::initGradientShaders(const QString &vertexShader, Q_UNUSED(fragmentShader) } +void Abstract3DRenderer::initCustomItemShaders(const QString &vertexShader, + const QString &fragmentShader) +{ + if (m_customItemShader) + delete m_customItemShader; + m_customItemShader = new ShaderHelper(this, vertexShader, fragmentShader); + m_customItemShader->initialize(); +} + void Abstract3DRenderer::updateTheme(Q3DTheme *theme) { // Synchronize the controller theme with renderer @@ -206,6 +218,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentShadowNoTex")); initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"), QStringLiteral(":/shaders/fragmentShadowNoTex")); + initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentShadow")); } else { initGradientShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentColorOnY")); @@ -213,6 +227,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragment")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragment")); + initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + QStringLiteral(":/shaders/fragmentTexture")); } #else initGradientShaders(QStringLiteral(":/shaders/vertex"), @@ -221,6 +237,8 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentES2")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentES2")); + initCustomItemShaders(QStringLiteral(":/shaders/vertex"), // TODO: Need new shader? At least this one doesn't work + QStringLiteral(":/shaders/fragmentTextureES2")); #endif } diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index ce21deff..884c0f39 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -36,6 +36,7 @@ #include "axisrendercache_p.h" #include "qabstractdataproxy.h" #include "seriesrendercache_p.h" +#include "customrenderitem_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -55,13 +56,20 @@ protected: SelectOnSlice }; -// QString generateValueLabel(const QString &format, float value); + enum RenderingState { + RenderingNormal = 0, + RenderingSelection, + RenderingDepth + }; + + // QString generateValueLabel(const QString &format, float value); public: virtual ~Abstract3DRenderer(); virtual void updateData() = 0; virtual void updateSeries(const QList &seriesList); + virtual void updateCustomData(const QList &customItems) = 0; virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); @@ -82,6 +90,8 @@ public: virtual void initGradientShaders(const QString &vertexShader, const QString &fragmentShader); virtual void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader) = 0; + virtual void initCustomItemShaders(const QString &vertexShader, + const QString &fragmentShader); virtual void updateAxisType(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis::AxisType type); virtual void updateAxisTitle(QAbstract3DAxis::AxisOrientation orientation, @@ -150,6 +160,7 @@ protected: SelectionState m_selectionState; QPoint m_inputPosition; QHash m_renderCacheList; + CustomRenderItemArray m_customRenderCache; QRect m_primarySubViewport; QRect m_secondarySubViewport; float m_devicePixelRatio; @@ -161,6 +172,8 @@ protected: QString m_selectionLabel; LabelItem *m_selectionLabelItem; int m_visibleSeriesCount; + + ShaderHelper *m_customItemShader; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index c8b25463..f02b9910 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -299,6 +299,11 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) m_selectionLabelDirty = true; } +void Bars3DRenderer::updateCustomData(const QList &customItems) +{ + // TODO +} + SeriesRenderCache *Bars3DRenderer::createNewCache(QAbstract3DSeries *series) { return new BarSeriesRenderCache(series, this); @@ -987,6 +992,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } + drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Disable drawing to depth framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -1067,6 +1075,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } glCullFace(GL_BACK); + drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, + depthProjectionMatrix); drawLabels(true, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, columnScaleFactor); glEnable(GL_DITHER); @@ -1363,6 +1373,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_POLYGON_OFFSET_FILL); + drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Bind background shader m_backgroundShader->bind(); @@ -1732,6 +1745,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_selectionDirty = false; } +void Bars3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, + const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix) +{ + // TODO +} + void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, GLfloat rowScaleFactor, GLfloat columnScaleFactor) { @@ -2189,6 +2210,10 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC position = Bars3DController::invalidSelectionPosition(); // Pass label clicked info to input handler m_clickedType = QAbstract3DGraph::ElementAxisYLabel; + } else if (selectionColor.w() == customItemAlpha) { + // Custom item selection + position = Bars3DController::invalidSelectionPosition(); + m_clickedType = QAbstract3DGraph::ElementCustomItem; } return position; } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 549a63f6..efe84d39 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -115,6 +115,7 @@ public: void updateData(); void updateSeries(const QList &seriesList); + void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); @@ -145,6 +146,9 @@ private: void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); + void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, GLfloat rowScaleFactor, GLfloat columnScaleFactor); diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index 18cba7fe..38a9e651 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -54,5 +54,7 @@ shaders/surfaceShadowNoTex.frag shaders/surfaceShadowFlat.frag shaders/surfaceShadowFlat.vert + shaders/texture.frag + shaders/texture_ES2.frag diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 703cd18b..0d1bdfc9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -135,6 +135,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Z axis label. \value ElementAxisYLabel Y axis label. + \value ElementCustomItem + Custom item. */ /*! @@ -379,6 +381,36 @@ void QAbstract3DGraph::clearSelection() d_ptr->m_visualController->clearSelection(); } +/*! + * Adds a custom mesh item located in \a meshFile to a graph at \a position with \a {scaling}, + * \a rotation and optional \a textureImage. Item must be in Wavefront obj format and include + * vertices, normals and UVs. It also needs to be in triangles. Item position is given in data + * coordinates. + * + * \return index to the added item. + * + * \sa removeCustomItemAt() + * + * \since Qt Data Visualization 1.1 + */ +int QAbstract3DGraph::addCustomItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QImage &textureImage) +{ + return d_ptr->m_visualController->addCustomItem(meshFile, position, scaling, rotation, + textureImage); +} + +/*! + * Removes the custom item at \a {index}. Deletes the resource allocated to it. + * + * \since Qt Data Visualization 1.1 + */ +void QAbstract3DGraph::removeCustomItemAt(int index) +{ + d_ptr->m_visualController->deleteCustomItem(index); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 2f417c2f..2e909b1d 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -77,7 +77,8 @@ public: ElementSeries, ElementAxisXLabel, ElementAxisZLabel, - ElementAxisYLabel + ElementAxisYLabel, + ElementCustomItem }; public: @@ -106,6 +107,11 @@ public: void clearSelection(); + int addCustomItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QImage &textureImage = QImage()); + void removeCustomItemAt(int index); + QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); void setMeasureFps(bool enable); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index ef39deba..b1c5e903 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -267,6 +267,19 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis m_selectionLabelDirty = true; } +void Scatter3DRenderer::updateCustomData(const QList &customItems) +{ + if (customItems.isEmpty() && m_customRenderCache.isEmpty()) + return; + + // There are probably not too many custom items, just recreate the array if something changes + foreach (CustomRenderItem *item, m_customRenderCache) + delete item; + m_customRenderCache.clear(); + foreach (CustomDataItem *item, customItems) + addCustomItem(item); +} + SeriesRenderCache *Scatter3DRenderer::createNewCache(QAbstract3DSeries *series) { return new ScatterSeriesRenderCache(series, this); @@ -469,6 +482,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } + drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Disable drawing to framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -566,6 +582,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } + drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + drawLabels(true, activeCamera, viewMatrix, projectionMatrix); glEnable(GL_DITHER); @@ -794,6 +813,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } #endif + drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Bind background shader m_backgroundShader->bind(); @@ -1305,6 +1327,87 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_selectionDirty = false; } +void Scatter3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, + const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix) +{ + if (m_customRenderCache.isEmpty()) + return; + + int itemIndex = 0; + QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); + QMatrix4x4 depthViewMatrix; + QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix; + QVector3D depthLightPos = activeCamera->d_ptr->calculatePositionRelativeToCamera( + zeroVector, 0.0f, 2.5f / m_autoScaleAdjustment); + depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector); + QMatrix4x4 depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; + + if (RenderingNormal == state) { + shader->bind(); + shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); + shader->setUniformValue(shader->ambientS(), m_cachedTheme->ambientLightStrength()); + shader->setUniformValue(shader->lightColor(), + Utils::vectorFromColor(m_cachedTheme->lightColor())); + shader->setUniformValue(shader->view(), viewMatrix); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + // Draw custom items + foreach (CustomRenderItem *item, m_customRenderCache) { + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + + modelMatrix.translate(item->translation()); + modelMatrix.rotate(item->rotation()); + modelMatrix.scale(item->scaling()); + itModelMatrix.rotate(item->rotation()); + itModelMatrix.scale(item->scaling()); + + if (RenderingNormal == state) { + // Normal render + shader->setUniformValue(shader->model(), modelMatrix); + shader->setUniformValue(shader->MVP(), projectionViewMatrix * modelMatrix); + shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); + +#if !defined(QT_OPENGL_ES_2) + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + // Set shadow shader bindings + shader->setUniformValue(shader->shadowQ(), m_shadowQualityToShader); + shader->setUniformValue(shader->depth(), depthProjectionViewMatrix * modelMatrix); + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength() / 10.0f); + m_drawer->drawObject(shader, item->mesh(), item->texture(), m_depthTexture); + } else +#endif + { + // Set shadowless shader bindings + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength()); + m_drawer->drawObject(shader, item->mesh(), item->texture()); + } + } else if (RenderingSelection == state) { + // Selection render + QVector4D itemColor = indexToSelectionColor(itemIndex++); + itemColor.setW(customItemAlpha); + itemColor /= 255.0f; + shader->setUniformValue(shader->color(), itemColor); + m_drawer->drawObject(shader, item->mesh()); + } else { + // Depth render + shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); + m_drawer->drawObject(shader, item->mesh()); + } + } + + if (RenderingNormal == state) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } +} + void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix) { @@ -1761,6 +1864,7 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, { m_clickedType = QAbstract3DGraph::ElementNone; if (color != selectionSkipColor) { + qDebug() << __FUNCTION__ << color.w(); if (color.w() == labelRowAlpha) { // Row selection index = Scatter3DController::invalidSelectionIndex(); @@ -1773,6 +1877,11 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, // Value selection index = Scatter3DController::invalidSelectionIndex(); m_clickedType = QAbstract3DGraph::ElementAxisYLabel; + } else if (color.w() == customItemAlpha) { + // Custom item selection + index = Scatter3DController::invalidSelectionIndex(); + m_clickedType = QAbstract3DGraph::ElementCustomItem; + qDebug() << "custom item selected"; } else { int totalIndex = int(color.x()) + (int(color.y()) << 8) @@ -1800,4 +1909,19 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, series = 0; } +void Scatter3DRenderer::addCustomItem(CustomDataItem *item) { + CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setMesh(item->m_meshFile); + newItem->setScaling(item->m_scaling); + newItem->setRotation(item->m_rotation); + newItem->setTexture(item->m_texture); + const QVector3D &pos = item->m_position; + float xTrans = m_axisCacheX.positionAt(pos.x()); + float yTrans = m_axisCacheY.positionAt(pos.y()); + float zTrans = m_axisCacheZ.positionAt(pos.z()); + newItem->setTranslation(QVector3D(xTrans, yTrans, zTrans)); + m_customRenderCache.append(newItem); + qDebug() << __FUNCTION__ << item->m_meshFile << newItem->rotation() << newItem->scaling() << newItem->translation(); +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index ab45381e..3aad8788 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -104,6 +104,7 @@ public: void updateData(); void updateSeries(const QList &seriesList); + void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); @@ -123,6 +124,9 @@ private: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void drawScene(GLuint defaultFboHandle); + void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); @@ -142,6 +146,8 @@ private: void calculateTranslation(ScatterRenderItem &item); void calculateSceneScalingFactors(); + void addCustomItem(CustomDataItem *item); + Q_DISABLE_COPY(Scatter3DRenderer) friend class ScatterRenderItem; diff --git a/src/datavisualization/engine/shaders/default.vert b/src/datavisualization/engine/shaders/default.vert index efb40862..e0718b20 100644 --- a/src/datavisualization/engine/shaders/default.vert +++ b/src/datavisualization/engine/shaders/default.vert @@ -17,10 +17,10 @@ varying highp vec2 coords_mdl; void main() { gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); coords_mdl = vertexPosition_mdl.xy; - position_wrld = (M * vec4(vertexPosition_mdl, 1.0)).xyz; - vec3 vertexPosition_cmr = (V * M * vec4(vertexPosition_mdl, 1.0)).xyz; + position_wrld = vec4(M * vec4(vertexPosition_mdl, 1.0)).xyz; + vec3 vertexPosition_cmr = vec4(V * M * vec4(vertexPosition_mdl, 1.0)).xyz; eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr; - vec3 lightPosition_cmr = (V * vec4(lightPosition_wrld, 1.0)).xyz; + vec3 lightPosition_cmr = vec4(V * vec4(lightPosition_wrld, 1.0)).xyz; lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; - normal_cmr = (V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; } diff --git a/src/datavisualization/engine/shaders/shadow.vert b/src/datavisualization/engine/shaders/shadow.vert index e29a8a30..0adcd43c 100644 --- a/src/datavisualization/engine/shaders/shadow.vert +++ b/src/datavisualization/engine/shaders/shadow.vert @@ -28,10 +28,10 @@ void main() { gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); coords_mdl = vertexPosition_mdl.xy; shadowCoord = bias * depthMVP * vec4(vertexPosition_mdl, 1.0); - position_wrld = (M * vec4(vertexPosition_mdl, 1.0)).xyz; - vec3 vertexPosition_cmr = (V * M * vec4(vertexPosition_mdl, 1.0)).xyz; + position_wrld = vec4(M * vec4(vertexPosition_mdl, 1.0)).xyz; + vec3 vertexPosition_cmr = vec4(V * M * vec4(vertexPosition_mdl, 1.0)).xyz; eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr; - lightDirection_cmr = (V * vec4(lightPosition_wrld, 0.0)).xyz; - normal_cmr = (V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + lightDirection_cmr = vec4(V * vec4(lightPosition_wrld, 0.0)).xyz; + normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; UV = vertexUV; } diff --git a/src/datavisualization/engine/shaders/surfaceFlat.vert b/src/datavisualization/engine/shaders/surfaceFlat.vert index 0d39f6bc..102bea78 100644 --- a/src/datavisualization/engine/shaders/surfaceFlat.vert +++ b/src/datavisualization/engine/shaders/surfaceFlat.vert @@ -20,10 +20,10 @@ varying highp vec3 coords_mdl; void main() { gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); coords_mdl = vertexPosition_mdl; - position_wrld = (M * vec4(vertexPosition_mdl, 1.0)).xyz; - vec3 vertexPosition_cmr = (V * M * vec4(vertexPosition_mdl, 1.0)).xyz; + position_wrld = vec4(M * vec4(vertexPosition_mdl, 1.0)).xyz; + vec3 vertexPosition_cmr = vec4(V * M * vec4(vertexPosition_mdl, 1.0)).xyz; eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr; - vec3 lightPosition_cmr = (V * vec4(lightPosition_wrld, 1.0)).xyz; + vec3 lightPosition_cmr = vec4(V * vec4(lightPosition_wrld, 1.0)).xyz; lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; - normal_cmr = (V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; } diff --git a/src/datavisualization/engine/shaders/surfaceShadowFlat.vert b/src/datavisualization/engine/shaders/surfaceShadowFlat.vert index 0a6e967f..8da7b196 100644 --- a/src/datavisualization/engine/shaders/surfaceShadowFlat.vert +++ b/src/datavisualization/engine/shaders/surfaceShadowFlat.vert @@ -28,10 +28,10 @@ void main() { gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); coords_mdl = vertexPosition_mdl; shadowCoord = bias * depthMVP * vec4(vertexPosition_mdl, 1.0); - position_wrld = (M * vec4(vertexPosition_mdl, 1.0)).xyz; - vec3 vertexPosition_cmr = (V * M * vec4(vertexPosition_mdl, 1.0)).xyz; + position_wrld = vec4(M * vec4(vertexPosition_mdl, 1.0)).xyz; + vec3 vertexPosition_cmr = vec4(V * M * vec4(vertexPosition_mdl, 1.0)).xyz; eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr; - vec3 lightPosition_cmr = (V * vec4(lightPosition_wrld, 1.0)).xyz; + vec3 lightPosition_cmr = vec4(V * vec4(lightPosition_wrld, 1.0)).xyz; lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; - normal_cmr = (V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; } diff --git a/src/datavisualization/engine/shaders/texture.frag b/src/datavisualization/engine/shaders/texture.frag new file mode 100644 index 00000000..69509a3f --- /dev/null +++ b/src/datavisualization/engine/shaders/texture.frag @@ -0,0 +1,37 @@ +#version 120 + +varying highp vec2 UV; +varying highp vec3 position_wrld; +varying highp vec3 normal_cmr; +varying highp vec3 eyeDirection_cmr; +varying highp vec3 lightDirection_cmr; + +uniform highp vec3 lightPosition_wrld; +uniform highp sampler2D textureSampler; +uniform highp float lightStrength; +uniform highp float ambientStrength; +uniform highp vec3 lightColor; + +void main() { + highp vec3 materialDiffuseColor = texture2D(textureSampler, UV).rgb; + highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor; + + highp float distance = length(lightPosition_wrld - position_wrld); + + highp vec3 n = normalize(normal_cmr); + highp vec3 l = normalize(lightDirection_cmr); + highp float cosTheta = clamp(dot(n, l), 0.0, 1.0); + + highp vec3 E = normalize(eyeDirection_cmr); + highp vec3 R = reflect(-l, n); + highp float cosAlpha = clamp(dot(E, R), 0.0, 1.0); + + gl_FragColor.rgb = + materialAmbientColor + + materialDiffuseColor * lightStrength * pow(cosTheta, 2) / distance + + materialSpecularColor * lightStrength * pow(cosAlpha, 10) / distance; + gl_FragColor.a = texture2D(textureSampler, UV).a; + gl_FragColor.rgb = clamp(gl_FragColor.rgb, 0.0, 1.0); +} + diff --git a/src/datavisualization/engine/shaders/texture_ES2.frag b/src/datavisualization/engine/shaders/texture_ES2.frag new file mode 100644 index 00000000..e749d763 --- /dev/null +++ b/src/datavisualization/engine/shaders/texture_ES2.frag @@ -0,0 +1,40 @@ +varying highp vec2 UV; +varying highp vec2 coords_mdl; +varying highp vec3 position_wrld; +varying highp vec3 normal_cmr; +varying highp vec3 eyeDirection_cmr; +varying highp vec3 lightDirection_cmr; + +uniform highp vec3 lightPosition_wrld; +uniform highp sampler2D textureSampler; +uniform highp float lightStrength; +uniform highp float ambientStrength; +uniform highp vec3 lightColor; + +void main() { + highp vec3 materialDiffuseColor = texture2D(textureSampler, UV).rgb; + highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor; + + highp float distance = length(lightPosition_wrld - position_wrld); + + highp vec3 n = normalize(normal_cmr); + highp vec3 l = normalize(lightDirection_cmr); + highp float cosTheta = dot(n, l); + if (cosTheta < 0.0) cosTheta = 0.0; + else if (cosTheta > 1.0) cosTheta = 1.0; + + highp vec3 E = normalize(eyeDirection_cmr); + highp vec3 R = reflect(-l, n); + highp float cosAlpha = dot(E, R); + if (cosAlpha < 0.0) cosAlpha = 0.0; + else if (cosAlpha > 1.0) cosAlpha = 1.0; + + gl_FragColor.rgb = + materialAmbientColor + + materialDiffuseColor * lightStrength * (cosTheta * cosTheta) / distance + + materialSpecularColor * lightStrength * (cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha * cosAlpha) / distance; + gl_FragColor.a = texture2D(textureSampler, UV).a; + gl_FragColor.rgb = clamp(gl_FragColor.rgb, 0.0, 1.0); +} + diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 0d5536e2..eeeaaf0d 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -41,8 +41,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define SHOW_DEPTH_TEXTURE_SCENE const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. -const GLfloat backgroundMargin = 1.1f; // Margin for background (1.10 make it 10% larger to avoid - // selection ball being drawn inside background) +// Margin for background (1.10 make it 10% larger to avoid +// selection ball being drawn inside background) +const GLfloat backgroundMargin = 1.1f; const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; const GLfloat sliceZScale = 0.1f; @@ -293,6 +294,11 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis } } +void Surface3DRenderer::updateCustomData(const QList &customItems) +{ + // TODO +} + SeriesRenderCache *Surface3DRenderer::createNewCache(QAbstract3DSeries *series) { m_selectionTexturesDirty = true; @@ -1133,6 +1139,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisableVertexAttribArray(m_depthShader->posAtt()); + drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Disable drawing to depth framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -1180,6 +1189,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) cache->selectionTexture()); } } + drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, + depthProjectionMatrix); drawLabels(true, activeCamera, viewMatrix, projectionMatrix); glEnable(GL_DITHER); @@ -1310,6 +1321,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } + drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, + depthProjectionMatrix); + // Bind background shader m_backgroundShader->bind(); glCullFace(GL_BACK); @@ -1753,6 +1767,14 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } +void Surface3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, + const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix) +{ + // TODO +} + void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix) { @@ -2235,7 +2257,7 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { m_clickedType = QAbstract3DGraph::ElementNone; - // Check for label selection + // Check for label and custom item selection if (id / alphaMultiplier == labelRowAlpha) { m_clickedType = QAbstract3DGraph::ElementAxisZLabel; return Surface3DController::invalidSelectionPosition(); @@ -2245,6 +2267,10 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) } else if (id / alphaMultiplier == labelValueAlpha) { m_clickedType = QAbstract3DGraph::ElementAxisYLabel; return Surface3DController::invalidSelectionPosition(); + } else if (id / alphaMultiplier == customItemAlpha) { + // Custom item selection + m_clickedType = QAbstract3DGraph::ElementCustomItem; + return Surface3DController::invalidSelectionPosition(); } // Not a label selection diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index e1147e3c..98968dd5 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -106,6 +106,7 @@ public: void updateData(); void updateSeries(const QList &seriesList); + void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void cleanCache(SeriesRenderCache *cache); void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode); @@ -141,6 +142,9 @@ private: void loadBackgroundMesh(); void loadLabelMesh(); void drawScene(GLuint defaultFboHandle); + void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, + const QMatrix4x4 &projectionMatrix, + const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); void calculateSceneScalingFactors(); diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h index f0a4f469..612b7bea 100644 --- a/src/datavisualization/global/datavisualizationglobal_p.h +++ b/src/datavisualization/global/datavisualizationglobal_p.h @@ -60,6 +60,7 @@ static const QQuaternion identityQuaternion; static const QVector4D selectionSkipColor = QVector4D(255.0f, 255.0f, 255.0f, 255.0f); static const QVector4D invalidColorVector = QVector4D(-1.0f, -1.0f, -1.0f, -1.0f); static const GLfloat itemAlpha = 0.0f; +static const GLfloat customItemAlpha = 252.0f; static const GLfloat labelValueAlpha = 253.0f; static const GLfloat labelRowAlpha = 254.0f; static const GLfloat labelColumnAlpha = 255.0f; -- cgit v1.2.3 From bf8ed99fb5a474aa6a56d61c9e3a1b5e44d6b6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 16 Apr 2014 12:25:14 +0300 Subject: Add custom item support, part 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2866 + Added custom item rendering Change-Id: If24400fed7c0467d8ebbd554d6e4df3ec5a205f3 Reviewed-by: Tomi Korpipää --- src/datavisualization/data/customdataitem_p.h | 9 +- .../engine/abstract3dcontroller.cpp | 26 +++- .../engine/abstract3dcontroller_p.h | 1 + .../engine/abstract3drenderer.cpp | 120 +++++++++++++++++- .../engine/abstract3drenderer_p.h | 14 +- src/datavisualization/engine/bars3drenderer.cpp | 48 +++---- src/datavisualization/engine/bars3drenderer_p.h | 6 +- src/datavisualization/engine/engine.qrc | 1 + src/datavisualization/engine/qabstract3dgraph.cpp | 19 +++ src/datavisualization/engine/qabstract3dgraph.h | 1 + src/datavisualization/engine/scatter3drenderer.cpp | 141 +++------------------ src/datavisualization/engine/scatter3drenderer_p.h | 9 +- src/datavisualization/engine/shaders/texture.vert | 26 ++++ src/datavisualization/engine/surface3drenderer.cpp | 73 ++++++----- src/datavisualization/engine/surface3drenderer_p.h | 9 +- src/datavisualization/utils/texturehelper.cpp | 6 +- 16 files changed, 296 insertions(+), 213 deletions(-) create mode 100644 src/datavisualization/engine/shaders/texture.vert diff --git a/src/datavisualization/data/customdataitem_p.h b/src/datavisualization/data/customdataitem_p.h index f607daba..c077a17a 100644 --- a/src/datavisualization/data/customdataitem_p.h +++ b/src/datavisualization/data/customdataitem_p.h @@ -42,10 +42,15 @@ public: virtual ~CustomDataItem(); inline void setMeshFile(const QString &meshFile) { m_meshFile = meshFile; } + inline QString meshFile() { return m_meshFile;} void setTextureImage(const QImage &textureImage); + inline GLuint texture() { return m_texture; } inline void setPosition(const QVector3D &position) { m_position = position; } + inline QVector3D position() { return m_position; } inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } + inline QVector3D scaling() { return m_scaling; } inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; } + inline QQuaternion rotation() { return m_rotation; } private: TextureHelper *m_textureHelper; @@ -54,10 +59,6 @@ private: QVector3D m_position; QVector3D m_scaling; QQuaternion m_rotation; - - friend class Bars3DRenderer; - friend class Scatter3DRenderer; - friend class Surface3DRenderer; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index e10069ff..4c66ad76 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -841,10 +841,28 @@ int Abstract3DController::addCustomItem(const QString &meshFile, const QVector3D void Abstract3DController::deleteCustomItem(int index) { - delete m_customItems[index]; - m_customItems.removeAt(index); - m_isCustomDataDirty = true; - emitNeedRender(); + if (m_customItems.size() > index) { + delete m_customItems[index]; + m_customItems.removeAt(index); + m_isCustomDataDirty = true; + emitNeedRender(); + } +} + +void Abstract3DController::deleteCustomItem(const QVector3D &position) +{ + int index = -1; + int counter = 0; + // Get the index for the item at position + foreach (CustomDataItem *item, m_customItems) { + if (item->position() == position) { + index = counter; + break; + } + counter++; + } + if (index >= 0) + deleteCustomItem(index); } void Abstract3DController::handleAxisTitleChanged(const QString &title) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 98df8fda..ba91796e 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -233,6 +233,7 @@ public: int addCustomItem(const QString &meshFile, const QVector3D &position, const QVector3D &scaling, const QQuaternion &rotation, const QImage &textureImage); void deleteCustomItem(int index); + void deleteCustomItem(const QVector3D &position); void emitNeedRender(); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 1cb4bdba..d18a1fc3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -227,7 +227,7 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragment")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragment")); - initCustomItemShaders(QStringLiteral(":/shaders/vertexShadow"), + initCustomItemShaders(QStringLiteral(":/shaders/vertexTexture"), QStringLiteral(":/shaders/fragmentTexture")); } #else @@ -237,7 +237,7 @@ void Abstract3DRenderer::reInitShaders() QStringLiteral(":/shaders/fragmentES2")); initBackgroundShaders(QStringLiteral(":/shaders/vertex"), QStringLiteral(":/shaders/fragmentES2")); - initCustomItemShaders(QStringLiteral(":/shaders/vertex"), // TODO: Need new shader? At least this one doesn't work + initCustomItemShaders(QStringLiteral(":/shaders/vertexTexture"), QStringLiteral(":/shaders/fragmentTextureES2")); #endif } @@ -393,6 +393,19 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi } } +void Abstract3DRenderer::updateCustomData(const QList &customItems) +{ + if (customItems.isEmpty() && m_customRenderCache.isEmpty()) + return; + + // There are probably not too many custom items, just recreate the array if something changes + foreach (CustomRenderItem *item, m_customRenderCache) + delete item; + m_customRenderCache.clear(); + foreach (CustomDataItem *item, customItems) + addCustomItem(item); +} + SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) { return new SeriesRenderCache(series, this); @@ -502,4 +515,107 @@ QString &Abstract3DRenderer::selectionLabel() return m_selectionLabel; } +QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) +{ + GLubyte idxRed = index & 0xff; + GLubyte idxGreen = (index & 0xff00) >> 8; + GLubyte idxBlue = (index & 0xff0000) >> 16; + + return QVector4D(idxRed, idxGreen, idxBlue, 0); +} + +void Abstract3DRenderer::addCustomItem(CustomDataItem *item) { + CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setMesh(item->meshFile()); + newItem->setScaling(item->scaling()); + newItem->setRotation(item->rotation()); + newItem->setTexture(item->texture()); + QVector3D translation = convertPositionToTranslation(item->position()); + newItem->setTranslation(translation); + m_customRenderCache.append(newItem); +} + +void Abstract3DRenderer::drawCustomItems(RenderingState state, + ShaderHelper *shader, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionViewMatrix, + const QMatrix4x4 &depthProjectionViewMatrix, + GLuint depthTexture, + GLfloat shadowQuality) +{ + if (m_customRenderCache.isEmpty()) + return; + + int itemIndex = 0; + + if (RenderingNormal == state) { + shader->bind(); + shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); + shader->setUniformValue(shader->ambientS(), m_cachedTheme->ambientLightStrength()); + shader->setUniformValue(shader->lightColor(), + Utils::vectorFromColor(m_cachedTheme->lightColor())); + shader->setUniformValue(shader->view(), viewMatrix); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + // Draw custom items + foreach (CustomRenderItem *item, m_customRenderCache) { + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + QMatrix4x4 MVPMatrix; + + modelMatrix.translate(item->translation()); + modelMatrix.rotate(item->rotation()); + modelMatrix.scale(item->scaling()); + itModelMatrix.rotate(item->rotation()); + itModelMatrix.scale(item->scaling()); + MVPMatrix = projectionViewMatrix * modelMatrix; + + if (RenderingNormal == state) { + // Normal render + shader->setUniformValue(shader->model(), modelMatrix); + shader->setUniformValue(shader->MVP(), MVPMatrix); + shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); + +#if !defined(QT_OPENGL_ES_2) + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + // Set shadow shader bindings + shader->setUniformValue(shader->shadowQ(), shadowQuality); + shader->setUniformValue(shader->depth(), depthProjectionViewMatrix * modelMatrix); + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength() / 10.0f); + m_drawer->drawObject(shader, item->mesh(), item->texture(), depthTexture); + } else +#else + Q_UNUSED(depthTexture) + Q_UNUSED(shadowQuality) +#endif + { + // Set shadowless shader bindings + shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength()); + m_drawer->drawObject(shader, item->mesh(), item->texture()); + } + } else if (RenderingSelection == state) { + // Selection render + shader->setUniformValue(shader->MVP(), MVPMatrix); + QVector4D itemColor = indexToSelectionColor(itemIndex++); + itemColor.setW(customItemAlpha); + itemColor /= 255.0f; + shader->setUniformValue(shader->color(), itemColor); + m_drawer->drawObject(shader, item->mesh()); + } else { + // Depth render + shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); + m_drawer->drawObject(shader, item->mesh()); + } + } + + if (RenderingNormal == state) { + glDisable(GL_TEXTURE_2D); + glDisable(GL_BLEND); + } +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 884c0f39..967a41a9 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -69,7 +69,7 @@ public: virtual void updateData() = 0; virtual void updateSeries(const QList &seriesList); - virtual void updateCustomData(const QList &customItems) = 0; + virtual void updateCustomData(const QList &customItems); virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); @@ -110,6 +110,11 @@ public: virtual void modifiedSeriesList(const QVector &seriesList); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); + + virtual void addCustomItem(CustomDataItem *item); + + virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; + void generateBaseColorTexture(const QColor &color, GLuint *texture); void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture); @@ -122,6 +127,13 @@ public: void setSelectionLabel(const QString &label); QString &selectionLabel(); + void drawCustomItems(RenderingState state, ShaderHelper *shader, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionViewMatrix, + const QMatrix4x4 &depthProjectionViewMatrix, + GLuint depthTexture, GLfloat shadowQuality); + QVector4D indexToSelectionColor(GLint index); + signals: void needRender(); // Emit this if something in renderer causes need for another render pass. void requestShadowQuality(QAbstract3DGraph::ShadowQuality quality); // For automatic quality adjustments diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index f02b9910..e2feefac 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -299,11 +299,6 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) m_selectionLabelDirty = true; } -void Bars3DRenderer::updateCustomData(const QList &customItems) -{ - // TODO -} - SeriesRenderCache *Bars3DRenderer::createNewCache(QAbstract3DSeries *series) { return new BarSeriesRenderCache(series, this); @@ -575,7 +570,6 @@ void Bars3DRenderer::drawSlicedScene() else barShader = m_barGradientShader; barShader->bind(); - } if (!colorStyleIsUniform && (previousColorStyle != colorStyle) @@ -992,8 +986,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } - drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingDepth, m_depthShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Disable drawing to depth framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -1011,7 +1006,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Skip selection mode drawing if we're slicing or have no selection mode if (!m_cachedIsSlicingActivated && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone - && m_selectionState == SelectOnScene && m_visibleSeriesCount > 0) { + && m_selectionState == SelectOnScene + && (m_visibleSeriesCount > 0 || !m_customRenderCache.isEmpty())) { // Bind selection shader m_selectionShader->bind(); @@ -1075,8 +1071,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } glCullFace(GL_BACK); - drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingSelection, m_selectionShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); drawLabels(true, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, columnScaleFactor); glEnable(GL_DITHER); @@ -1373,15 +1370,16 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) glDisable(GL_POLYGON_OFFSET_FILL); - drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + // Reset culling + glCullFace(GL_BACK); + + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Bind background shader m_backgroundShader->bind(); - // Reset culling - glCullFace(GL_BACK); - // Draw background if (m_cachedTheme->isBackgroundEnabled() && m_backgroundObj) { QMatrix4x4 modelMatrix; @@ -1745,14 +1743,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_selectionDirty = false; } -void Bars3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, - const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix) -{ - // TODO -} - void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, GLfloat rowScaleFactor, GLfloat columnScaleFactor) { @@ -2337,4 +2327,14 @@ void Bars3DRenderer::initLabelShaders(const QString &vertexShader, const QString m_labelShader->initialize(); } +QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position) { + // Convert row and column to translation on graph + float xTrans = (((position.x() + 0.5f) * m_cachedBarSpacing.width()) - m_rowWidth) + / m_scaleFactor; + float zTrans = (m_columnDepth - ((position.z() + 0.5f) * m_cachedBarSpacing.height())) + / m_scaleFactor; + float yTrans = m_axisCacheY.positionAt(position.y()); + return QVector3D(xTrans, yTrans, zTrans); +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index efe84d39..ca0e690e 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -115,11 +115,12 @@ public: void updateData(); void updateSeries(const QList &seriesList); - void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); + QVector3D convertPositionToTranslation(const QVector3D &position); + protected: virtual void initializeOpenGL(); @@ -146,9 +147,6 @@ private: void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); - void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, GLfloat rowScaleFactor, GLfloat columnScaleFactor); diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index 38a9e651..4d95f030 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -56,5 +56,6 @@ shaders/surfaceShadowFlat.vert shaders/texture.frag shaders/texture_ES2.frag + shaders/texture.vert diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 0d1bdfc9..1c46427d 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -389,6 +389,9 @@ void QAbstract3DGraph::clearSelection() * * \return index to the added item. * + * \note No validity checks are made for the position of the item, so it is up to the user to + * provide a valid position. Items positioned outside axis ranges are still rendered. + * * \sa removeCustomItemAt() * * \since Qt Data Visualization 1.1 @@ -404,6 +407,9 @@ int QAbstract3DGraph::addCustomItem(const QString &meshFile, const QVector3D &po /*! * Removes the custom item at \a {index}. Deletes the resource allocated to it. * + * \note The index of the remaining items will change if the item removed is other than + * the last. + * * \since Qt Data Visualization 1.1 */ void QAbstract3DGraph::removeCustomItemAt(int index) @@ -411,6 +417,19 @@ void QAbstract3DGraph::removeCustomItemAt(int index) d_ptr->m_visualController->deleteCustomItem(index); } +/*! + * Removes the custom item at \a {position}. Deletes the resource allocated to it. + * + * \note The index of the remaining items will change if an item is removed from a position that + * is not at the last index. + * + * \since Qt Data Visualization 1.1 + */ +void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) +{ + d_ptr->m_visualController->deleteCustomItem(position); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 2e909b1d..dc0bf6f0 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -111,6 +111,7 @@ public: const QVector3D &scaling, const QQuaternion &rotation, const QImage &textureImage = QImage()); void removeCustomItemAt(int index); + void removeCustomItemAt(const QVector3D &position); QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index b1c5e903..9d5696a0 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -267,19 +267,6 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis m_selectionLabelDirty = true; } -void Scatter3DRenderer::updateCustomData(const QList &customItems) -{ - if (customItems.isEmpty() && m_customRenderCache.isEmpty()) - return; - - // There are probably not too many custom items, just recreate the array if something changes - foreach (CustomRenderItem *item, m_customRenderCache) - delete item; - m_customRenderCache.clear(); - foreach (CustomDataItem *item, customItems) - addCustomItem(item); -} - SeriesRenderCache *Scatter3DRenderer::createNewCache(QAbstract3DSeries *series) { return new ScatterSeriesRenderCache(series, this); @@ -482,8 +469,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } - drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingDepth, m_depthShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Disable drawing to framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -506,7 +494,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Skip selection mode drawing if we have no selection mode if (m_cachedSelectionMode > QAbstract3DGraph::SelectionNone - && SelectOnScene == m_selectionState && m_visibleSeriesCount > 0) { + && SelectOnScene == m_selectionState + && (m_visibleSeriesCount > 0 || !m_customRenderCache.isEmpty())) { // Draw dots to selection buffer glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); glViewport(0, 0, @@ -582,8 +571,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } - drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingSelection, m_selectionShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); drawLabels(true, activeCamera, viewMatrix, projectionMatrix); @@ -813,8 +803,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } #endif - drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Bind background shader m_backgroundShader->bind(); @@ -1327,87 +1318,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_selectionDirty = false; } -void Scatter3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, - const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix) -{ - if (m_customRenderCache.isEmpty()) - return; - - int itemIndex = 0; - QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); - QMatrix4x4 depthViewMatrix; - QMatrix4x4 projectionViewMatrix = projectionMatrix * viewMatrix; - QVector3D depthLightPos = activeCamera->d_ptr->calculatePositionRelativeToCamera( - zeroVector, 0.0f, 2.5f / m_autoScaleAdjustment); - depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector); - QMatrix4x4 depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; - - if (RenderingNormal == state) { - shader->bind(); - shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); - shader->setUniformValue(shader->ambientS(), m_cachedTheme->ambientLightStrength()); - shader->setUniformValue(shader->lightColor(), - Utils::vectorFromColor(m_cachedTheme->lightColor())); - shader->setUniformValue(shader->view(), viewMatrix); - - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - - // Draw custom items - foreach (CustomRenderItem *item, m_customRenderCache) { - QMatrix4x4 modelMatrix; - QMatrix4x4 itModelMatrix; - - modelMatrix.translate(item->translation()); - modelMatrix.rotate(item->rotation()); - modelMatrix.scale(item->scaling()); - itModelMatrix.rotate(item->rotation()); - itModelMatrix.scale(item->scaling()); - - if (RenderingNormal == state) { - // Normal render - shader->setUniformValue(shader->model(), modelMatrix); - shader->setUniformValue(shader->MVP(), projectionViewMatrix * modelMatrix); - shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); - -#if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - // Set shadow shader bindings - shader->setUniformValue(shader->shadowQ(), m_shadowQualityToShader); - shader->setUniformValue(shader->depth(), depthProjectionViewMatrix * modelMatrix); - shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength() / 10.0f); - m_drawer->drawObject(shader, item->mesh(), item->texture(), m_depthTexture); - } else -#endif - { - // Set shadowless shader bindings - shader->setUniformValue(shader->lightS(), m_cachedTheme->lightStrength()); - m_drawer->drawObject(shader, item->mesh(), item->texture()); - } - } else if (RenderingSelection == state) { - // Selection render - QVector4D itemColor = indexToSelectionColor(itemIndex++); - itemColor.setW(customItemAlpha); - itemColor /= 255.0f; - shader->setUniformValue(shader->color(), itemColor); - m_drawer->drawObject(shader, item->mesh()); - } else { - // Depth render - shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); - m_drawer->drawObject(shader, item->mesh()); - } - } - - if (RenderingNormal == state) { - glDisable(GL_TEXTURE_2D); - glDisable(GL_BLEND); - } -} - void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix) { @@ -1849,22 +1759,12 @@ void Scatter3DRenderer::initLabelShaders(const QString &vertexShader, const QStr m_labelShader->initialize(); } -QVector4D Scatter3DRenderer::indexToSelectionColor(GLint index) -{ - GLubyte dotIdxRed = index & 0xff; - GLubyte dotIdxGreen = (index & 0xff00) >> 8; - GLubyte dotIdxBlue = (index & 0xff0000) >> 16; - - return QVector4D(dotIdxRed, dotIdxGreen, dotIdxBlue, 0); -} - void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series) { m_clickedType = QAbstract3DGraph::ElementNone; if (color != selectionSkipColor) { - qDebug() << __FUNCTION__ << color.w(); if (color.w() == labelRowAlpha) { // Row selection index = Scatter3DController::invalidSelectionIndex(); @@ -1881,7 +1781,6 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, // Custom item selection index = Scatter3DController::invalidSelectionIndex(); m_clickedType = QAbstract3DGraph::ElementCustomItem; - qDebug() << "custom item selected"; } else { int totalIndex = int(color.x()) + (int(color.y()) << 8) @@ -1909,19 +1808,11 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, series = 0; } -void Scatter3DRenderer::addCustomItem(CustomDataItem *item) { - CustomRenderItem *newItem = new CustomRenderItem(); - newItem->setMesh(item->m_meshFile); - newItem->setScaling(item->m_scaling); - newItem->setRotation(item->m_rotation); - newItem->setTexture(item->m_texture); - const QVector3D &pos = item->m_position; - float xTrans = m_axisCacheX.positionAt(pos.x()); - float yTrans = m_axisCacheY.positionAt(pos.y()); - float zTrans = m_axisCacheZ.positionAt(pos.z()); - newItem->setTranslation(QVector3D(xTrans, yTrans, zTrans)); - m_customRenderCache.append(newItem); - qDebug() << __FUNCTION__ << item->m_meshFile << newItem->rotation() << newItem->scaling() << newItem->translation(); +QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position) { + float xTrans = m_axisCacheX.positionAt(position.x()); + float yTrans = m_axisCacheY.positionAt(position.y()); + float zTrans = m_axisCacheZ.positionAt(position.z()); + return QVector3D(xTrans, yTrans, zTrans); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 3aad8788..172d0c46 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -104,10 +104,11 @@ public: void updateData(); void updateSeries(const QList &seriesList); - void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateScene(Q3DScene *scene); + QVector3D convertPositionToTranslation(const QVector3D &position); + inline int clickedIndex() const { return m_clickedIndex; } void resetClickedStatus(); @@ -124,9 +125,6 @@ private: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); void drawScene(GLuint defaultFboHandle); - void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); @@ -146,8 +144,6 @@ private: void calculateTranslation(ScatterRenderItem &item); void calculateSceneScalingFactors(); - void addCustomItem(CustomDataItem *item); - Q_DISABLE_COPY(Scatter3DRenderer) friend class ScatterRenderItem; @@ -156,7 +152,6 @@ public slots: void updateSelectedItem(int index, QScatter3DSeries *series); private: - QVector4D indexToSelectionColor(GLint index); void selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series); }; diff --git a/src/datavisualization/engine/shaders/texture.vert b/src/datavisualization/engine/shaders/texture.vert new file mode 100644 index 00000000..7d98b053 --- /dev/null +++ b/src/datavisualization/engine/shaders/texture.vert @@ -0,0 +1,26 @@ +uniform highp mat4 MVP; +uniform highp mat4 V; +uniform highp mat4 M; +uniform highp mat4 itM; +uniform highp vec3 lightPosition_wrld; + +attribute highp vec3 vertexPosition_mdl; +attribute highp vec2 vertexUV; +attribute highp vec3 vertexNormal_mdl; + +varying highp vec2 UV; +varying highp vec3 position_wrld; +varying highp vec3 normal_cmr; +varying highp vec3 eyeDirection_cmr; +varying highp vec3 lightDirection_cmr; + +void main() { + gl_Position = MVP * vec4(vertexPosition_mdl, 1.0); + position_wrld = vec4(M * vec4(vertexPosition_mdl, 1.0)).xyz; + vec3 vertexPosition_cmr = vec4(V * M * vec4(vertexPosition_mdl, 1.0)).xyz; + eyeDirection_cmr = vec3(0.0, 0.0, 0.0) - vertexPosition_cmr; + vec3 lightPosition_cmr = vec4(V * vec4(lightPosition_wrld, 1.0)).xyz; + lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; + normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + UV = vertexUV; +} diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index eeeaaf0d..bdcb8871 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -48,6 +48,8 @@ const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; const GLfloat sliceZScale = 0.1f; const GLfloat sliceUnits = 2.5f; +const uint greenMultiplier = 256; +const uint blueMultiplier = 65536; const uint alphaMultiplier = 16777216; Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) @@ -294,11 +296,6 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis } } -void Surface3DRenderer::updateCustomData(const QList &customItems) -{ - // TODO -} - SeriesRenderCache *Surface3DRenderer::createNewCache(QAbstract3DSeries *series) { m_selectionTexturesDirty = true; @@ -749,7 +746,7 @@ void Surface3DRenderer::drawSlicedScene() GLfloat scaleXBackground = 0.0f; - if (m_renderCacheList.size()) { + if (!m_renderCacheList.isEmpty()) { bool drawGrid = false; foreach (SeriesRenderCache *baseCache, m_renderCacheList) { @@ -1045,8 +1042,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Draw depth buffer #if !defined(QT_OPENGL_ES_2) - GLfloat adjustedLightStrength = m_cachedTheme->lightStrength() / 10.0f; - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone && m_renderCacheList.size()) { + GLfloat adjustedLightStrength = m_cachedTheme->lightStrength() / 10.0f; + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone && + (!m_renderCacheList.isEmpty() || !m_customRenderCache.isEmpty())) { // Render scene into a depth texture for using with shadow mapping // Enable drawing to depth framebuffer glBindFramebuffer(GL_FRAMEBUFFER, m_depthFrameBuffer); @@ -1107,6 +1105,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); + Abstract3DRenderer::drawCustomItems(RenderingDepth, m_depthShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthModelTexture, 0); glClear(GL_DEPTH_BUFFER_BIT); @@ -1139,8 +1141,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glDisableVertexAttribArray(m_depthShader->posAtt()); - drawCustomItems(RenderingDepth, m_depthShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingDepth, m_depthShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Disable drawing to depth framebuffer (= enable drawing to screen) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); @@ -1160,7 +1163,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_TEXTURE_2D); // Draw selection buffer - if (!m_cachedIsSlicingActivated && m_renderCacheList.size() && m_selectionState == SelectOnScene + if (!m_cachedIsSlicingActivated && !m_renderCacheList.isEmpty() + && !m_customRenderCache.isEmpty() + && m_selectionState == SelectOnScene && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { m_selectionShader->bind(); glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); @@ -1189,24 +1194,23 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) cache->selectionTexture()); } } - drawCustomItems(RenderingSelection, m_selectionShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + m_surfaceGridShader->bind(); + Abstract3DRenderer::drawCustomItems(RenderingSelection, m_surfaceGridShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); drawLabels(true, activeCamera, viewMatrix, projectionMatrix); glEnable(GL_DITHER); - GLubyte pixel[4] = {0, 0, 0, 0}; - glReadPixels(m_inputPosition.x(), m_viewport.height() - m_inputPosition.y(), - 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel); + QVector4D clickedColor = Utils::getSelection(m_inputPosition, m_viewport.height()); glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); // Put the RGBA value back to uint -#if !defined(QT_OPENGL_ES_2) - uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * alphaMultiplier; -#else - uint selectionId = pixel[0] + pixel[1] * 256 + pixel[2] * 65536; -#endif + uint selectionId = clickedColor.x() + + clickedColor.y() * greenMultiplier + + clickedColor.z() * blueMultiplier + + clickedColor.w() * alphaMultiplier; m_clickedPosition = selectionIdToSurfacePoint(selectionId); @@ -1220,7 +1224,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } // Draw the surface - if (m_renderCacheList.size()) { + if (!m_renderCacheList.isEmpty()) { // For surface we can see climpses from underneath glDisable(GL_CULL_FACE); @@ -1321,8 +1325,9 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - drawCustomItems(RenderingNormal, m_customItemShader, activeCamera, projectionMatrix, - depthProjectionMatrix); + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); // Bind background shader m_backgroundShader->bind(); @@ -1377,7 +1382,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) m_backgroundShader->setUniformValue(m_backgroundShader->lightS(), adjustedLightStrength); // Draw the object - if (noShadows) + if (noShadows && m_customRenderCache.isEmpty()) m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_noShadowTexture); else m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_depthTexture); @@ -1767,14 +1772,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } -void Surface3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, - const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix) -{ - // TODO -} - void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix) { @@ -1786,12 +1783,11 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa shader = m_surfaceGridShader; } else { shader = m_labelShader; - + shader->bind(); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } - shader->bind(); glEnable(GL_POLYGON_OFFSET_FILL); @@ -2509,4 +2505,11 @@ void Surface3DRenderer::updateDepthBuffer() } #endif +QVector3D Surface3DRenderer::convertPositionToTranslation(const QVector3D &position) { + float xTrans = m_axisCacheX.positionAt(position.x()); + float yTrans = m_axisCacheY.positionAt(position.y()); + float zTrans = m_axisCacheZ.positionAt(position.z()); + return QVector3D(xTrans, yTrans, zTrans); +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 98968dd5..0cd4502a 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -106,7 +106,6 @@ public: void updateData(); void updateSeries(const QList &seriesList); - void updateCustomData(const QList &customItems); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void cleanCache(SeriesRenderCache *cache); void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode); @@ -117,8 +116,8 @@ public: void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } void resetClickedStatus(); + QVector3D convertPositionToTranslation(const QVector3D &position); - void drawSlicedScene(); void render(GLuint defaultFboHandle = 0); protected: @@ -141,12 +140,12 @@ private: QRect calculateSampleRect(const QSurfaceDataArray &array); void loadBackgroundMesh(); void loadLabelMesh(); + + void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); - void drawCustomItems(RenderingState state, ShaderHelper *shader, const Q3DCamera *activeCamera, - const QMatrix4x4 &projectionMatrix, - const QMatrix4x4 &depthProjectionMatrix); void drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); + void calculateSceneScalingFactors(); void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader); void initLabelShaders(const QString &vertexShader, const QString &fragmentShader); diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp index ee1d51a6..07130d7e 100644 --- a/src/datavisualization/utils/texturehelper.cpp +++ b/src/datavisualization/utils/texturehelper.cpp @@ -193,7 +193,8 @@ GLuint TextureHelper::createDepthTexture(const QSize &size, GLuint textureSize) #endif #if !defined(QT_OPENGL_ES_2) -GLuint TextureHelper::createDepthTextureFrameBuffer(const QSize &size, GLuint &frameBuffer, GLuint textureSize) +GLuint TextureHelper::createDepthTextureFrameBuffer(const QSize &size, GLuint &frameBuffer, + GLuint textureSize) { GLuint depthtextureid = createDepthTexture(size, textureSize); @@ -223,7 +224,8 @@ GLuint TextureHelper::createDepthTextureFrameBuffer(const QSize &size, GLuint &f #endif #if !defined(QT_OPENGL_ES_2) -void TextureHelper::fillDepthTexture(GLuint texture,const QSize &size, GLuint textureSize, GLfloat value) +void TextureHelper::fillDepthTexture(GLuint texture,const QSize &size, GLuint textureSize, + GLfloat value) { int nItems = size.width() * textureSize * size.height() * textureSize; GLfloat *bits = new GLfloat[nItems]; -- cgit v1.2.3 From a11dcce773b9ad2a913a32efe0c51b1221694659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 22 Apr 2014 13:19:49 +0300 Subject: Custom Item Example added Task-number: QTRD-3043 + surface selection bug fix - snapshot to be added Change-Id: I17276e39c304cbf1a58eaa2334eff2268656dbf4 Reviewed-by: Mika Salmela --- .../customitems/customitemgraph.cpp | 181 + .../customitems/customitemgraph.h | 48 + .../datavisualization/customitems/customitems.pro | 19 + .../datavisualization/customitems/customitems.qrc | 11 + .../customitems/doc/src/customitems.qdoc | 68 + examples/datavisualization/customitems/layer_1.png | Bin 0 -> 34540 bytes examples/datavisualization/customitems/layer_2.png | Bin 0 -> 10553 bytes examples/datavisualization/customitems/layer_3.png | Bin 0 -> 7119 bytes examples/datavisualization/customitems/main.cpp | 105 + examples/datavisualization/customitems/oilrig.obj | 2039 ++ .../datavisualization/customitems/refinery.obj | 30971 +++++++++++++++++++ examples/datavisualization/datavisualization.pro | 3 +- src/datavisualization/engine/surface3drenderer.cpp | 7 +- 13 files changed, 33448 insertions(+), 4 deletions(-) create mode 100644 examples/datavisualization/customitems/customitemgraph.cpp create mode 100644 examples/datavisualization/customitems/customitemgraph.h create mode 100644 examples/datavisualization/customitems/customitems.pro create mode 100644 examples/datavisualization/customitems/customitems.qrc create mode 100644 examples/datavisualization/customitems/doc/src/customitems.qdoc create mode 100644 examples/datavisualization/customitems/layer_1.png create mode 100644 examples/datavisualization/customitems/layer_2.png create mode 100644 examples/datavisualization/customitems/layer_3.png create mode 100644 examples/datavisualization/customitems/main.cpp create mode 100644 examples/datavisualization/customitems/oilrig.obj create mode 100644 examples/datavisualization/customitems/refinery.obj diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp new file mode 100644 index 00000000..38f71b9e --- /dev/null +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -0,0 +1,181 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customitemgraph.h" + +#include +#include + +using namespace QtDataVisualization; + +CustomItemGraph::CustomItemGraph(Q3DSurface *surface) + : m_graph(surface) +{ + QImage layerOneHMap(":/maps/layer_1.png"); + QHeightMapSurfaceDataProxy *layerOneProxy = new QHeightMapSurfaceDataProxy(layerOneHMap); + QSurface3DSeries *layerOneSeries = new QSurface3DSeries(layerOneProxy); + layerOneSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel")); + layerOneProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f); + layerOneSeries->setDrawMode(QSurface3DSeries::DrawSurface); + layerOneSeries->setFlatShadingEnabled(false); + + QImage layerTwoHMap(":/maps/layer_2.png"); + QHeightMapSurfaceDataProxy *layerTwoProxy = new QHeightMapSurfaceDataProxy(layerTwoHMap); + QSurface3DSeries *layerTwoSeries = new QSurface3DSeries(layerTwoProxy); + layerTwoSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel")); + layerTwoProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f); + layerTwoSeries->setDrawMode(QSurface3DSeries::DrawSurface); + layerTwoSeries->setFlatShadingEnabled(false); + + QImage layerThreeHMap(":/maps/layer_3.png"); + QHeightMapSurfaceDataProxy *layerThreeProxy = new QHeightMapSurfaceDataProxy(layerThreeHMap); + QSurface3DSeries *layerThreeSeries = new QSurface3DSeries(layerThreeProxy); + layerThreeSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel")); + layerThreeProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f); + layerThreeSeries->setDrawMode(QSurface3DSeries::DrawSurface); + layerThreeSeries->setFlatShadingEnabled(false); + + m_graph->axisX()->setLabelFormat("%.1f N"); + m_graph->axisZ()->setLabelFormat("%.1f E"); + m_graph->axisX()->setRange(34.0f, 40.0f); + m_graph->axisY()->setRange(0.0f, 200.0f); + m_graph->axisZ()->setRange(18.0f, 24.0f); + + m_graph->axisX()->setTitle(QStringLiteral("Latitude")); + m_graph->axisY()->setTitle(QStringLiteral("Height")); + m_graph->axisZ()->setTitle(QStringLiteral("Longitude")); + + m_graph->addSeries(layerOneSeries); + m_graph->addSeries(layerTwoSeries); + m_graph->addSeries(layerThreeSeries); + + QLinearGradient grOne; + grOne.setColorAt(0.0, Qt::black); + grOne.setColorAt(0.38, Qt::darkYellow); + grOne.setColorAt(0.39, Qt::darkGreen); + grOne.setColorAt(0.5, Qt::darkGray); + grOne.setColorAt(1.0, Qt::gray); + m_graph->seriesList().at(0)->setBaseGradient(grOne); + m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient); + + QLinearGradient grTwo; + grTwo.setColorAt(0.385, Qt::blue); + grTwo.setColorAt(0.395, Qt::white); + m_graph->seriesList().at(1)->setBaseGradient(grTwo); + m_graph->seriesList().at(1)->setColorStyle(Q3DTheme::ColorStyleRangeGradient); + + QLinearGradient grThree; + grThree.setColorAt(0.0, Qt::white); + grThree.setColorAt(0.05, Qt::black); + m_graph->seriesList().at(2)->setBaseGradient(grThree); + m_graph->seriesList().at(2)->setColorStyle(Q3DTheme::ColorStyleRangeGradient); + + m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); +} + +CustomItemGraph::~CustomItemGraph() +{ + delete m_graph; +} + +void CustomItemGraph::toggleItemOne(bool show) +{ + //! [1] + QVector3D positionOne = QVector3D(39.0f, 77.0f, 19.2f); + //! [1] + if (show) { + //! [0] + QImage color = QImage(2, 2, QImage::Format_ARGB32); + color.fill(Qt::red); + //! [0] + //! [2] + m_graph->addCustomItem(":/items/oilrig.obj", positionOne, + QVector3D(0.025f, 0.025f, 0.025f), + QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 45.0f), + color); + //! [2] + } else { + //! [3] + m_graph->removeCustomItemAt(positionOne); + //! [3] + } +} + +void CustomItemGraph::toggleItemTwo(bool show) +{ + QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f); + if (show) { + QImage color = QImage(2, 2, QImage::Format_ARGB32); + color.fill(Qt::red); + m_graph->addCustomItem(":/items/oilrig.obj", positionTwo, + QVector3D(0.025f, 0.025f, 0.025f), + QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f), + color); + } else { + m_graph->removeCustomItemAt(positionTwo); + } +} + +void CustomItemGraph::toggleItemThree(bool show) +{ + QVector3D positionThree = QVector3D(34.5f, 86.0f, 19.1f); + if (show) { + QImage color = QImage(2, 2, QImage::Format_ARGB32); + color.fill(Qt::darkMagenta); + m_graph->addCustomItem(":/items/refinery.obj", positionThree, + QVector3D(0.066f, 0.066f, 0.066f), + QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f), + color); + } else { + m_graph->removeCustomItemAt(positionThree); + } +} + +void CustomItemGraph::toggleSeeThrough(bool seethrough) +{ + if (seethrough) { + m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawWireframe); + m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawWireframe); + } else { + m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawSurface); + m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawSurface); + } +} + +void CustomItemGraph::toggleOilHighlight(bool highlight) +{ + if (highlight) { + QLinearGradient grThree; + grThree.setColorAt(0.0, Qt::black); + grThree.setColorAt(0.05, Qt::red); + m_graph->seriesList().at(2)->setBaseGradient(grThree); + } else { + QLinearGradient grThree; + grThree.setColorAt(0.0, Qt::white); + grThree.setColorAt(0.05, Qt::black); + m_graph->seriesList().at(2)->setBaseGradient(grThree); + } +} + +void CustomItemGraph::toggleShadows(bool shadows) +{ + if (shadows) + m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium); + else + m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); +} diff --git a/examples/datavisualization/customitems/customitemgraph.h b/examples/datavisualization/customitems/customitemgraph.h new file mode 100644 index 00000000..a13e8620 --- /dev/null +++ b/examples/datavisualization/customitems/customitemgraph.h @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef CUSTOMITEMGRAPH_H +#define CUSTOMITEMGRAPH_H + +#include +#include +#include +#include +#include + +using namespace QtDataVisualization; + +class CustomItemGraph : public QObject +{ + Q_OBJECT +public: + explicit CustomItemGraph(Q3DSurface *surface); + ~CustomItemGraph(); + + void toggleItemOne(bool show); + void toggleItemTwo(bool show); + void toggleItemThree(bool show); + void toggleSeeThrough(bool seethrough); + void toggleOilHighlight(bool highlight); + void toggleShadows(bool shadows); + +private: + Q3DSurface *m_graph; +}; + +#endif diff --git a/examples/datavisualization/customitems/customitems.pro b/examples/datavisualization/customitems/customitems.pro new file mode 100644 index 00000000..99582ea6 --- /dev/null +++ b/examples/datavisualization/customitems/customitems.pro @@ -0,0 +1,19 @@ +android|ios { + error( "This example is not supported for android or ios." ) +} + +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +SOURCES += main.cpp \ + customitemgraph.cpp + +HEADERS += customitemgraph.h + +QT += widgets + +RESOURCES += customitems.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* diff --git a/examples/datavisualization/customitems/customitems.qrc b/examples/datavisualization/customitems/customitems.qrc new file mode 100644 index 00000000..af91d645 --- /dev/null +++ b/examples/datavisualization/customitems/customitems.qrc @@ -0,0 +1,11 @@ + + + layer_1.png + layer_2.png + layer_3.png + + + refinery.obj + oilrig.obj + + diff --git a/examples/datavisualization/customitems/doc/src/customitems.qdoc b/examples/datavisualization/customitems/doc/src/customitems.qdoc new file mode 100644 index 00000000..1878609b --- /dev/null +++ b/examples/datavisualization/customitems/doc/src/customitems.qdoc @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \example customitems + \title Custom Items Example + \ingroup qtdatavisualization_examples + \brief Adding custom items to a surface graph. + + The custom items example shows how to add your own custom meshes as items to a graph, and how + to remove them. + + \image customitems-example.png + + \section1 Adding custom meshes to the application + + We'll add the meshes in a resource file: + + \code + + ... + + refinery.obj + oilrig.obj + + + \endcode + + \section1 Adding custom item to a graph + + In this example we do not have specific textures for our meshes, so we'll just create a small + QImage and fill it with a single color: + + \snippet customitems/customitemgraph.cpp 0 + + Then we'll specify the position for the item in a variable. This way we'll be able to use it + later for removing the correct item: + + \snippet customitems/customitemgraph.cpp 1 + + And finally we'll just add the item to the wanted position with the scale and rotation we want: + + \snippet customitems/customitemgraph.cpp 2 + + \section1 Removing custom item from a graph + + We'll just call \c removeCustomItemAt() with the position + of the item: + + \snippet customitems/customitemgraph.cpp 3 + + \section1 Example Contents +*/ diff --git a/examples/datavisualization/customitems/layer_1.png b/examples/datavisualization/customitems/layer_1.png new file mode 100644 index 00000000..9138c710 Binary files /dev/null and b/examples/datavisualization/customitems/layer_1.png differ diff --git a/examples/datavisualization/customitems/layer_2.png b/examples/datavisualization/customitems/layer_2.png new file mode 100644 index 00000000..61631ae8 Binary files /dev/null and b/examples/datavisualization/customitems/layer_2.png differ diff --git a/examples/datavisualization/customitems/layer_3.png b/examples/datavisualization/customitems/layer_3.png new file mode 100644 index 00000000..066ffbe7 Binary files /dev/null and b/examples/datavisualization/customitems/layer_3.png differ diff --git a/examples/datavisualization/customitems/main.cpp b/examples/datavisualization/customitems/main.cpp new file mode 100644 index 00000000..a37cc76f --- /dev/null +++ b/examples/datavisualization/customitems/main.cpp @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "customitemgraph.h" + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + Q3DSurface *graph = new Q3DSurface(); + QWidget *container = QWidget::createWindowContainer(graph); + + container->setMinimumSize(QSize(1280, 768)); + container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + container->setFocusPolicy(Qt::StrongFocus); + + QWidget *widget = new QWidget; + QHBoxLayout *hLayout = new QHBoxLayout(widget); + QVBoxLayout *vLayoutLeft = new QVBoxLayout(); + vLayoutLeft->setAlignment(Qt::AlignTop); + QVBoxLayout *vLayoutRight = new QVBoxLayout(); + vLayoutRight->setAlignment(Qt::AlignTop); + hLayout->addLayout(vLayoutLeft); + hLayout->addWidget(container, 1); + hLayout->addLayout(vLayoutRight); + + QFont font = QFont("Century Gothic", 14); + QLabel *label = new QLabel("Show:"); + font.setBold(true); + label->setFont(font); + vLayoutLeft->addWidget(label); + + font.setBold(false); + QCheckBox *checkboxOne = new QCheckBox("Oil Rig 1"); + checkboxOne->setFont(font); + vLayoutLeft->addWidget(checkboxOne); + + QCheckBox *checkboxTwo = new QCheckBox("Oil Rig 2"); + checkboxTwo->setFont(font); + vLayoutLeft->addWidget(checkboxTwo); + + QCheckBox *checkboxThree = new QCheckBox("Refinery"); + checkboxThree->setFont(font); + vLayoutLeft->addWidget(checkboxThree); + + QLabel *label2 = new QLabel("Visuals:"); + label2->setFont(font); + vLayoutRight->addWidget(label2); + + QCheckBox *checkboxOneRight = new QCheckBox("See-Through"); + checkboxOneRight->setFont(font); + vLayoutRight->addWidget(checkboxOneRight); + + QCheckBox *checkboxTwoRight = new QCheckBox("Highlight Oil"); + checkboxTwoRight->setFont(font); + vLayoutRight->addWidget(checkboxTwoRight); + + QCheckBox *checkboxThreeRight = new QCheckBox("Shadows"); + checkboxThreeRight->setFont(font); + checkboxThreeRight->setChecked(true); + vLayoutRight->addWidget(checkboxThreeRight); + + widget->setWindowTitle(QStringLiteral("Custom Items Example")); + + widget->show(); + + CustomItemGraph *modifier = new CustomItemGraph(graph); + + QObject::connect(checkboxOne, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleItemOne); + QObject::connect(checkboxTwo, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleItemTwo); + QObject::connect(checkboxThree, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleItemThree); + + QObject::connect(checkboxOneRight, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleSeeThrough); + QObject::connect(checkboxTwoRight, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleOilHighlight); + QObject::connect(checkboxThreeRight, &QCheckBox::stateChanged, + modifier, &CustomItemGraph::toggleShadows); + + return app.exec(); +} diff --git a/examples/datavisualization/customitems/oilrig.obj b/examples/datavisualization/customitems/oilrig.obj new file mode 100644 index 00000000..2ed9421f --- /dev/null +++ b/examples/datavisualization/customitems/oilrig.obj @@ -0,0 +1,2039 @@ +# Blender v2.66 (sub 0) OBJ File: 'oilrig.blend' +# www.blender.org +o Cylinder.007 +v 0.057462 2.272318 -1.170324 +v 0.057461 8.181165 -0.128434 +v 0.055540 2.268930 -1.151111 +v 0.055539 8.177776 -0.109221 +v 0.049849 2.265673 -1.132637 +v 0.049849 8.174520 -0.090747 +v 0.040608 2.262671 -1.115611 +v 0.040608 8.171517 -0.073721 +v 0.028172 2.260039 -1.100687 +v 0.028172 8.168886 -0.058798 +v 0.013019 2.257880 -1.088440 +v 0.013018 8.166726 -0.046550 +v -0.004270 2.256275 -1.079339 +v -0.004271 8.165121 -0.037450 +v -0.023029 2.255287 -1.073735 +v -0.023030 8.164133 -0.031846 +v -0.042539 2.254953 -1.071843 +v -0.042539 8.163799 -0.029953 +v -0.062048 2.255287 -1.073735 +v -0.062048 8.164133 -0.031846 +v -0.080807 2.256275 -1.079339 +v -0.080808 8.165121 -0.037450 +v -0.098096 2.257880 -1.088440 +v -0.098096 8.166726 -0.046550 +v -0.113249 2.260039 -1.100687 +v -0.113250 8.168886 -0.058798 +v -0.125685 2.262671 -1.115611 +v -0.125686 8.171517 -0.073721 +v -0.134926 2.265673 -1.132637 +v -0.134927 8.174520 -0.090747 +v -0.140617 2.268930 -1.151111 +v -0.140618 8.177776 -0.109222 +v -0.142538 2.272318 -1.170324 +v -0.142539 8.181165 -0.128434 +v -0.140617 2.275706 -1.189536 +v -0.140618 8.184552 -0.147647 +v -0.134926 2.278963 -1.208011 +v -0.134927 8.187810 -0.166121 +v -0.125685 2.281965 -1.225037 +v -0.125686 8.190812 -0.183147 +v -0.113249 2.284597 -1.239960 +v -0.113250 8.193443 -0.198071 +v -0.098095 2.286757 -1.252208 +v -0.098096 8.195602 -0.210318 +v -0.080807 2.288361 -1.261308 +v -0.080807 8.197207 -0.219419 +v -0.062047 2.289349 -1.266912 +v -0.062048 8.198195 -0.225023 +v -0.042538 2.289683 -1.268804 +v -0.042539 8.198529 -0.226915 +v -0.023029 2.289349 -1.266912 +v -0.023030 8.198195 -0.225023 +v -0.004270 2.288361 -1.261308 +v -0.004271 8.197207 -0.219418 +v 0.013019 2.286757 -1.252207 +v 0.013018 8.195602 -0.210318 +v 0.028172 2.284597 -1.239960 +v 0.028172 8.193443 -0.198070 +v 0.040609 2.281965 -1.225036 +v 0.040608 8.190812 -0.183147 +v 0.049850 2.278963 -1.208010 +v 0.049849 8.187810 -0.166121 +v 0.055540 2.275706 -1.189536 +v 0.055539 8.184552 -0.147646 +vn 0.995185 -0.017020 0.096528 +vn 0.956940 -0.050408 0.285877 +vn 0.881921 -0.081857 0.464235 +vn 0.773009 -0.110162 0.624758 +vn 0.634397 -0.134231 0.761264 +vn 0.471397 -0.153144 0.868523 +vn 0.290285 -0.166171 0.942402 +vn 0.098018 -0.172812 0.980066 +vn -0.098022 -0.172812 0.980065 +vn -0.290285 -0.166171 0.942402 +vn -0.471392 -0.153145 0.868526 +vn -0.634399 -0.134231 0.761262 +vn -0.773009 -0.110162 0.624757 +vn -0.881923 -0.081857 0.464231 +vn -0.956941 -0.050407 0.285873 +vn -0.995185 -0.017021 0.096528 +vn -0.995185 0.017021 -0.096529 +vn -0.956940 0.050407 -0.285875 +vn -0.881920 0.081858 -0.464238 +vn -0.773015 0.110160 -0.624751 +vn -0.634391 0.134232 -0.761268 +vn -0.471394 0.153144 -0.868524 +vn -0.290288 0.166171 -0.942401 +vn -0.098006 0.172812 -0.980067 +vn 0.098019 0.172812 -0.980065 +vn 0.290285 0.166171 -0.942402 +vn 0.471401 0.153144 -0.868521 +vn 0.634393 0.134232 -0.761267 +vn 0.773011 0.110161 -0.624755 +vn 0.881922 0.081857 -0.464233 +vn -0.000000 0.984796 0.173713 +vn 0.995185 0.017020 -0.096527 +vn 0.956941 0.050407 -0.285872 +vn -0.000011 -0.984808 -0.173648 +vn 0.995185 -0.017020 0.096529 +vn 0.956940 -0.050407 0.285875 +vn 0.881920 -0.081858 0.464237 +vn 0.773011 -0.110161 0.624755 +vn 0.634396 -0.134231 0.761265 +vn 0.471389 -0.153145 0.868527 +vn 0.290287 -0.166171 0.942402 +vn 0.098019 -0.172812 0.980065 +vn -0.098021 -0.172812 0.980065 +vn -0.290282 -0.166171 0.942403 +vn -0.471402 -0.153144 0.868520 +vn -0.634395 -0.134232 0.761265 +vn -0.773010 -0.110161 0.624756 +vn -0.881922 -0.081857 0.464234 +vn -0.956940 -0.050408 0.285875 +vn -0.995185 -0.017020 0.096527 +vn -0.956940 0.050408 -0.285876 +vn -0.881921 0.081857 -0.464236 +vn -0.773009 0.110162 -0.624757 +vn -0.634391 0.134232 -0.761269 +vn -0.471398 0.153144 -0.868522 +vn -0.290282 0.166171 -0.942403 +vn -0.098016 0.172812 -0.980066 +vn 0.098018 0.172812 -0.980065 +vn 0.290287 0.166171 -0.942402 +vn 0.471399 0.153144 -0.868522 +vn 0.773014 0.110161 -0.624751 +vn 0.881921 0.081857 -0.464236 +vn -0.000000 0.984812 0.173622 +vn -0.000000 0.984812 0.173623 +vn -0.000000 0.984801 0.173685 +vn -0.000000 0.984814 0.173615 +vn -0.000000 0.984810 0.173634 +vn -0.000000 0.984808 0.173649 +vn -0.000000 0.984806 0.173660 +vn -0.000043 0.984788 0.173763 +vn -0.000000 0.984797 0.173710 +vn -0.000000 0.984805 0.173661 +vn -0.000000 0.984810 0.173635 +vn -0.000000 0.984810 0.173637 +vn -0.000000 0.984802 0.173683 +vn -0.000000 0.984814 0.173611 +vn -0.000000 0.984800 0.173689 +vn -0.000000 0.984800 0.173690 +vn -0.000000 0.984801 0.173686 +vn 0.000005 0.984810 0.173637 +vn 0.956941 0.050407 -0.285873 +vn -0.000000 -0.984818 -0.173587 +vn -0.000007 -0.984807 -0.173654 +vn -0.000000 -0.984808 -0.173648 +vn -0.000027 -0.984801 -0.173685 +vn -0.000004 -0.984807 -0.173652 +vn -0.000010 -0.984800 -0.173693 +vn -0.000020 -0.984817 -0.173596 +vn -0.000013 -0.984810 -0.173638 +vn -0.000001 -0.984807 -0.173650 +vn -0.000005 -0.984808 -0.173646 +vn -0.000002 -0.984808 -0.173648 +vn 0.000002 -0.984808 -0.173649 +vn 0.000001 -0.984808 -0.173649 +vn -0.000011 -0.984809 -0.173642 +vn -0.000004 -0.984808 -0.173646 +vn -0.000001 -0.984808 -0.173648 +vn -0.000002 -0.984808 -0.173649 +vn -0.000006 -0.984808 -0.173649 +vn 0.000004 -0.984808 -0.173648 +vn 0.000000 -0.984808 -0.173649 +vn -0.000004 -0.984807 -0.173650 +vn 0.000005 -0.984808 -0.173646 +vn 0.000003 -0.984808 -0.173647 +vn 0.000008 -0.984805 -0.173663 +s off +f 1//1 2//1 4//1 +f 3//2 4//2 6//2 +f 5//3 6//3 8//3 +f 7//4 8//4 10//4 +f 9//5 10//5 12//5 +f 11//6 12//6 14//6 +f 13//7 14//7 16//7 +f 15//8 16//8 18//8 +f 17//9 18//9 19//9 +f 19//10 20//10 21//10 +f 21//11 22//11 23//11 +f 23//12 24//12 25//12 +f 25//13 26//13 27//13 +f 27//14 28//14 29//14 +f 29//15 30//15 31//15 +f 31//16 32//16 33//16 +f 33//17 34//17 35//17 +f 35//18 36//18 37//18 +f 37//19 38//19 39//19 +f 39//20 40//20 41//20 +f 41//21 42//21 43//21 +f 43//22 44//22 45//22 +f 45//23 46//23 47//23 +f 47//24 48//24 49//24 +f 49//25 50//25 52//25 +f 51//26 52//26 54//26 +f 53//27 54//27 56//27 +f 55//28 56//28 58//28 +f 57//29 58//29 60//29 +f 59//30 60//30 62//30 +f 48//31 52//31 50//31 +f 63//32 64//32 2//32 +f 61//33 62//33 64//33 +f 1//34 3//34 63//34 +f 3//35 1//35 4//35 +f 5//36 3//36 6//36 +f 7//37 5//37 8//37 +f 9//38 7//38 10//38 +f 11//39 9//39 12//39 +f 13//40 11//40 14//40 +f 15//41 13//41 16//41 +f 17//42 15//42 18//42 +f 18//43 20//43 19//43 +f 20//44 22//44 21//44 +f 22//45 24//45 23//45 +f 24//46 26//46 25//46 +f 26//47 28//47 27//47 +f 28//48 30//48 29//48 +f 30//49 32//49 31//49 +f 32//50 34//50 33//50 +f 34//17 36//17 35//17 +f 36//51 38//51 37//51 +f 38//52 40//52 39//52 +f 40//53 42//53 41//53 +f 42//54 44//54 43//54 +f 44//55 46//55 45//55 +f 46//56 48//56 47//56 +f 48//57 50//57 49//57 +f 51//58 49//58 52//58 +f 53//59 51//59 54//59 +f 55//60 53//60 56//60 +f 57//28 55//28 58//28 +f 59//61 57//61 60//61 +f 61//62 59//62 62//62 +f 48//63 54//63 52//63 +f 46//64 54//64 48//64 +f 46//65 56//65 54//65 +f 44//65 56//65 46//65 +f 44//66 58//66 56//66 +f 42//66 58//66 44//66 +f 42//67 60//67 58//67 +f 40//67 60//67 42//67 +f 40//68 62//68 60//68 +f 38//68 62//68 40//68 +f 38//69 64//69 62//69 +f 20//70 24//70 22//70 +f 16//71 20//71 18//71 +f 16//72 24//72 20//72 +f 36//69 64//69 38//69 +f 34//73 64//73 36//73 +f 2//74 64//74 34//74 +f 4//75 2//75 34//75 +f 4//75 34//75 32//75 +f 6//76 4//76 32//76 +f 6//76 32//76 30//76 +f 6//68 30//68 28//68 +f 8//68 6//68 28//68 +f 10//73 8//73 28//73 +f 10//67 28//67 26//67 +f 12//77 10//77 26//77 +f 12//78 26//78 24//78 +f 14//79 12//79 24//79 +f 16//80 14//80 24//80 +f 1//32 63//32 2//32 +f 63//81 61//81 64//81 +f 19//82 15//82 17//82 +f 41//83 37//83 39//83 +f 3//84 5//84 63//84 +f 45//85 41//85 43//85 +f 45//86 37//86 41//86 +f 49//87 45//87 47//87 +f 49//84 37//84 45//84 +f 49//84 35//84 37//84 +f 49//84 33//84 35//84 +f 49//84 31//84 33//84 +f 55//88 51//88 53//88 +f 59//89 55//89 57//89 +f 61//90 55//90 59//90 +f 63//91 55//91 61//91 +f 63//92 5//92 55//92 +f 5//93 7//93 55//93 +f 7//94 9//94 55//94 +f 29//95 25//95 27//95 +f 31//96 25//96 29//96 +f 49//97 25//97 31//97 +f 49//98 23//98 25//98 +f 9//93 11//93 55//93 +f 11//99 13//99 55//99 +f 13//100 15//100 55//100 +f 15//101 19//101 55//101 +f 19//102 21//102 55//102 +f 21//103 23//103 55//103 +f 23//104 49//104 55//104 +f 49//105 51//105 55//105 +o Cylinder.006 +v 0.053672 2.252534 1.125439 +v 0.053673 8.161380 0.083549 +v 0.051751 2.255921 1.144652 +v 0.051751 8.164768 0.102762 +v 0.046060 2.259179 1.163126 +v 0.046061 8.168025 0.121236 +v 0.036819 2.262181 1.180152 +v 0.036820 8.171027 0.138262 +v 0.024383 2.264812 1.195075 +v 0.024384 8.173658 0.153186 +v 0.009229 2.266972 1.207323 +v 0.009230 8.175818 0.165433 +v -0.008059 2.268577 1.216423 +v -0.008059 8.177423 0.174534 +v -0.026819 2.269565 1.222028 +v -0.026818 8.178411 0.180138 +v -0.046328 2.269898 1.223920 +v -0.046327 8.178745 0.182030 +v -0.065837 2.269565 1.222027 +v -0.065836 8.178411 0.180138 +v -0.084596 2.268577 1.216423 +v -0.084595 8.177423 0.174534 +v -0.101885 2.266972 1.207323 +v -0.101884 8.175818 0.165433 +v -0.117038 2.264812 1.195075 +v -0.117038 8.173658 0.153186 +v -0.129475 2.262181 1.180152 +v -0.129474 8.171027 0.138262 +v -0.138716 2.259179 1.163126 +v -0.138715 8.168025 0.121236 +v -0.144406 2.255921 1.144651 +v -0.144406 8.164768 0.102762 +v -0.146328 2.252534 1.125439 +v -0.146327 8.161380 0.083549 +v -0.144406 2.249146 1.106226 +v -0.144406 8.157992 0.064337 +v -0.138716 2.245888 1.087752 +v -0.138715 8.154735 0.045862 +v -0.129475 2.242886 1.070726 +v -0.129474 8.151732 0.028836 +v -0.117038 2.240255 1.055802 +v -0.117038 8.149101 0.013913 +v -0.101885 2.238095 1.043555 +v -0.101884 8.146942 0.001666 +v -0.084596 2.236491 1.034454 +v -0.084595 8.145337 -0.007435 +v -0.065837 2.235502 1.028850 +v -0.065836 8.144349 -0.013039 +v -0.046328 2.235169 1.026958 +v -0.046327 8.144015 -0.014931 +v -0.026819 2.235502 1.028850 +v -0.026818 8.144349 -0.013039 +v -0.008059 2.236491 1.034455 +v -0.008059 8.145337 -0.007435 +v 0.009229 2.238095 1.043555 +v 0.009230 8.146942 0.001666 +v 0.024383 2.240255 1.055803 +v 0.024384 8.149101 0.013913 +v 0.036819 2.242886 1.070726 +v 0.036820 8.151732 0.028837 +v 0.046060 2.245888 1.087752 +v 0.046061 8.154735 0.045863 +v 0.051751 2.249146 1.106226 +v 0.051752 8.157992 0.064337 +vn 0.995185 0.017020 0.096528 +vn 0.956940 0.050408 0.285877 +vn 0.881921 0.081857 0.464236 +vn 0.773010 0.110161 0.624756 +vn 0.634396 0.134232 0.761265 +vn 0.471397 0.153144 0.868523 +vn 0.290283 0.166171 0.942403 +vn 0.098018 0.172812 0.980066 +vn -0.098018 0.172812 0.980066 +vn -0.290285 0.166171 0.942402 +vn -0.471398 0.153144 0.868522 +vn -0.634392 0.134232 0.761268 +vn -0.773007 0.110162 0.624759 +vn -0.881923 0.081857 0.464231 +vn -0.956941 0.050407 0.285874 +vn -0.995185 0.017021 0.096528 +vn -0.995185 -0.017021 -0.096529 +vn -0.956940 -0.050408 -0.285877 +vn -0.881921 -0.081857 -0.464236 +vn -0.773008 -0.110162 -0.624758 +vn -0.634391 -0.134232 -0.761269 +vn -0.471388 -0.153145 -0.868528 +vn -0.290288 -0.166171 -0.942401 +vn -0.098006 -0.172812 -0.980067 +vn 0.098021 -0.172812 -0.980065 +vn 0.290285 -0.166171 -0.942402 +vn 0.471402 -0.153144 -0.868520 +vn 0.634392 -0.134232 -0.761267 +vn 0.773010 -0.110161 -0.624755 +vn 0.881922 -0.081857 -0.464233 +vn -0.000356 0.984796 -0.173717 +vn 0.995185 -0.017020 -0.096527 +vn 0.956941 -0.050407 -0.285872 +vn -0.000005 -0.984808 0.173646 +vn 0.995185 0.017020 0.096529 +vn 0.956940 0.050407 0.285875 +vn 0.881920 0.081858 0.464237 +vn 0.773011 0.110161 0.624755 +vn 0.634396 0.134231 0.761264 +vn 0.471389 0.153145 0.868527 +vn 0.290292 0.166171 0.942400 +vn 0.098013 0.172812 0.980066 +vn -0.098019 0.172812 0.980065 +vn -0.290283 0.166171 0.942403 +vn -0.471400 0.153144 0.868521 +vn -0.634396 0.134232 0.761264 +vn -0.773010 0.110161 0.624756 +vn -0.881922 0.081857 0.464234 +vn -0.956940 0.050408 0.285876 +vn -0.995185 0.017020 0.096526 +vn -0.995185 -0.017021 -0.096530 +vn -0.956940 -0.050407 -0.285875 +vn -0.773009 -0.110161 -0.624757 +vn -0.634390 -0.134232 -0.761269 +vn -0.471399 -0.153144 -0.868522 +vn -0.290282 -0.166171 -0.942403 +vn -0.098018 -0.172812 -0.980066 +vn 0.098018 -0.172812 -0.980065 +vn 0.290287 -0.166171 -0.942402 +vn 0.471399 -0.153144 -0.868522 +vn 0.634393 -0.134232 -0.761267 +vn 0.773014 -0.110161 -0.624751 +vn 0.881921 -0.081857 -0.464236 +vn -0.000114 0.984812 -0.173626 +vn -0.000002 0.984808 -0.173648 +vn -0.000054 0.984802 -0.173678 +vn -0.000008 0.984808 -0.173648 +vn -0.000004 0.984808 -0.173647 +vn -0.000107 0.984836 -0.173487 +vn -0.000015 0.984812 -0.173622 +vn -0.000013 0.984820 -0.173580 +vn -0.000001 0.984809 -0.173639 +vn -0.000044 0.984787 -0.173766 +vn -0.000047 0.984804 -0.173672 +vn -0.000051 0.984803 -0.173676 +vn -0.000050 0.984803 -0.173675 +vn -0.000006 0.984799 -0.173697 +vn -0.000037 0.984791 -0.173743 +vn -0.000244 0.984806 -0.173659 +vn -0.000025 0.984806 -0.173659 +vn -0.000168 0.984823 -0.173560 +vn -0.000013 0.984812 -0.173624 +vn -0.000088 0.984819 -0.173584 +vn -0.000036 0.984813 -0.173618 +vn 0.000016 0.984808 -0.173645 +vn 0.000005 0.984808 -0.173650 +vn 0.000006 0.984807 -0.173650 +vn 0.000005 0.984808 -0.173649 +vn 0.000002 0.984808 -0.173648 +vn 0.000003 0.984807 -0.173650 +vn 0.000005 0.984804 -0.173667 +vn 0.956941 -0.050407 -0.285873 +vn -0.000005 -0.984808 0.173649 +vn -0.000001 -0.984818 0.173592 +vn -0.000000 -0.984808 0.173648 +vn -0.000006 -0.984808 0.173646 +vn -0.000001 -0.984808 0.173648 +vn -0.000002 -0.984808 0.173648 +vn -0.000001 -0.984806 0.173661 +vn -0.000000 -0.984805 0.173663 +vn -0.000000 -0.984810 0.173635 +vn -0.000000 -0.984810 0.173634 +vn -0.000000 -0.984807 0.173653 +vn -0.000000 -0.984807 0.173650 +vn -0.000000 -0.984808 0.173647 +vn 0.000000 -0.984807 0.173651 +vn -0.000000 -0.984807 0.173649 +vn -0.000000 -0.984810 0.173637 +vn 0.000000 -0.984806 0.173659 +vn -0.000001 -0.984805 0.173664 +s off +f 65//106 66//106 68//106 +f 67//107 68//107 70//107 +f 69//108 70//108 72//108 +f 71//109 72//109 74//109 +f 73//110 74//110 76//110 +f 75//111 76//111 78//111 +f 77//112 78//112 80//112 +f 79//113 80//113 82//113 +f 81//114 82//114 83//114 +f 83//115 84//115 85//115 +f 85//116 86//116 87//116 +f 87//117 88//117 89//117 +f 89//118 90//118 91//118 +f 91//119 92//119 93//119 +f 93//120 94//120 95//120 +f 95//121 96//121 97//121 +f 97//122 98//122 99//122 +f 99//123 100//123 101//123 +f 101//124 102//124 103//124 +f 103//125 104//125 105//125 +f 105//126 106//126 107//126 +f 107//127 108//127 109//127 +f 109//128 110//128 111//128 +f 111//129 112//129 113//129 +f 113//130 114//130 116//130 +f 115//131 116//131 118//131 +f 117//132 118//132 120//132 +f 119//133 120//133 122//133 +f 121//134 122//134 124//134 +f 123//135 124//135 126//135 +f 68//136 66//136 70//136 +f 127//137 128//137 66//137 +f 125//138 126//138 128//138 +f 65//139 67//139 69//139 +f 67//140 65//140 68//140 +f 69//141 67//141 70//141 +f 71//142 69//142 72//142 +f 73//143 71//143 74//143 +f 75//144 73//144 76//144 +f 77//145 75//145 78//145 +f 79//146 77//146 80//146 +f 81//147 79//147 82//147 +f 82//148 84//148 83//148 +f 84//149 86//149 85//149 +f 86//150 88//150 87//150 +f 88//151 90//151 89//151 +f 90//152 92//152 91//152 +f 92//153 94//153 93//153 +f 94//154 96//154 95//154 +f 96//155 98//155 97//155 +f 98//156 100//156 99//156 +f 100//157 102//157 101//157 +f 102//124 104//124 103//124 +f 104//158 106//158 105//158 +f 106//159 108//159 107//159 +f 108//160 110//160 109//160 +f 110//161 112//161 111//161 +f 112//162 114//162 113//162 +f 115//163 113//163 116//163 +f 117//164 115//164 118//164 +f 119//165 117//165 120//165 +f 121//166 119//166 122//166 +f 123//167 121//167 124//167 +f 125//168 123//168 126//168 +f 66//169 128//169 126//169 +f 70//170 66//170 126//170 +f 72//171 70//171 74//171 +f 70//172 126//172 74//172 +f 126//173 124//173 74//173 +f 122//174 120//174 118//174 +f 124//175 122//175 118//175 +f 114//176 118//176 116//176 +f 124//177 118//177 114//177 +f 108//178 112//178 110//178 +f 104//179 108//179 106//179 +f 102//180 108//180 104//180 +f 100//181 108//181 102//181 +f 76//182 74//182 78//182 +f 78//183 74//183 80//183 +f 96//184 100//184 98//184 +f 96//185 108//185 100//185 +f 92//186 96//186 94//186 +f 90//187 96//187 92//187 +f 88//188 96//188 90//188 +f 86//189 96//189 88//189 +f 82//176 86//176 84//176 +f 74//190 124//190 80//190 +f 124//191 114//191 80//191 +f 114//192 112//192 80//192 +f 112//193 108//193 80//193 +f 108//194 96//194 80//194 +f 96//195 86//195 80//195 +f 86//196 82//196 80//196 +f 65//137 127//137 66//137 +f 127//197 125//197 128//197 +f 127//198 65//198 125//198 +f 83//199 79//199 81//199 +f 97//200 93//200 95//200 +f 99//200 93//200 97//200 +f 103//201 99//201 101//201 +f 103//202 93//202 99//202 +f 105//203 93//203 103//203 +f 115//199 111//199 113//199 +f 115//204 109//204 111//204 +f 117//205 109//205 115//205 +f 117//206 107//206 109//206 +f 119//207 107//207 117//207 +f 119//208 105//208 107//208 +f 121//208 105//208 119//208 +f 123//200 105//200 121//200 +f 125//209 105//209 123//209 +f 125//200 65//200 105//200 +f 105//200 65//200 93//200 +f 65//210 69//210 93//210 +f 69//209 71//209 93//209 +f 93//200 71//200 91//200 +f 91//211 71//211 89//211 +f 71//212 73//212 89//212 +f 73//211 75//211 89//211 +f 89//208 75//208 87//208 +f 75//213 77//213 87//213 +f 87//207 77//207 85//207 +f 77//214 79//214 85//214 +f 79//215 83//215 85//215 +o Cylinder.005 +v 1.116865 2.257815 -0.125221 +v 0.074976 8.166661 -0.125221 +v 1.136078 2.261203 -0.123300 +v 0.094188 8.170050 -0.123300 +v 1.154552 2.264460 -0.117609 +v 0.112663 8.173306 -0.117609 +v 1.171578 2.267462 -0.108368 +v 0.129689 8.176309 -0.108368 +v 1.186502 2.270094 -0.095932 +v 0.144612 8.178940 -0.095932 +v 1.198749 2.272254 -0.080778 +v 0.156859 8.181100 -0.080778 +v 1.207850 2.273858 -0.063490 +v 0.165960 8.182705 -0.063490 +v 1.213454 2.274846 -0.044730 +v 0.171564 8.183693 -0.044730 +v 1.215346 2.275180 -0.025221 +v 0.173456 8.184027 -0.025221 +v 1.213454 2.274846 -0.005712 +v 0.171564 8.183693 -0.005712 +v 1.207850 2.273858 0.013047 +v 0.165960 8.182705 0.013047 +v 1.198749 2.272254 0.030336 +v 0.156859 8.181100 0.030336 +v 1.186502 2.270094 0.045489 +v 0.144612 8.178940 0.045489 +v 1.171578 2.267462 0.057926 +v 0.129689 8.176309 0.057926 +v 1.154552 2.264460 0.067167 +v 0.112663 8.173306 0.067167 +v 1.136078 2.261203 0.072857 +v 0.094188 8.170050 0.072857 +v 1.116865 2.257815 0.074779 +v 0.074976 8.166661 0.074779 +v 1.097653 2.254427 0.072857 +v 0.055763 8.163274 0.072857 +v 1.079178 2.251170 0.067167 +v 0.037289 8.160016 0.067167 +v 1.062152 2.248168 0.057926 +v 0.020263 8.157014 0.057926 +v 1.047229 2.245536 0.045489 +v 0.005339 8.154383 0.045489 +v 1.034981 2.243377 0.030336 +v -0.006908 8.152224 0.030336 +v 1.025881 2.241772 0.013047 +v -0.016009 8.150619 0.013047 +v 1.020277 2.240784 -0.005712 +v -0.021613 8.149631 -0.005712 +v 1.018384 2.240450 -0.025221 +v -0.023505 8.149297 -0.025221 +v 1.020277 2.240784 -0.044730 +v -0.021613 8.149631 -0.044730 +v 1.025881 2.241772 -0.063490 +v -0.016009 8.150619 -0.063490 +v 1.034981 2.243377 -0.080778 +v -0.006908 8.152224 -0.080778 +v 1.047229 2.245536 -0.095932 +v 0.005339 8.154383 -0.095932 +v 1.062152 2.248168 -0.108368 +v 0.020263 8.157014 -0.108368 +v 1.079178 2.251170 -0.117609 +v 0.037289 8.160016 -0.117609 +v 1.097653 2.254427 -0.123300 +v 0.055763 8.163274 -0.123300 +vn 0.096528 0.017020 -0.995185 +vn 0.285876 0.050408 -0.956940 +vn 0.464235 0.081857 -0.881921 +vn 0.624757 0.110162 -0.773009 +vn 0.761264 0.134232 -0.634396 +vn 0.868521 0.153144 -0.471400 +vn 0.942403 0.166171 -0.290283 +vn 0.980066 0.172812 -0.098018 +vn 0.980066 0.172812 0.098018 +vn 0.942403 0.166171 0.290283 +vn 0.868521 0.153144 0.471399 +vn 0.761264 0.134232 0.634396 +vn 0.624757 0.110162 0.773009 +vn 0.464235 0.081857 0.881921 +vn 0.285876 0.050408 0.956940 +vn 0.096527 0.017020 0.995185 +vn -0.096528 -0.017021 0.995185 +vn -0.285875 -0.050407 0.956940 +vn -0.464235 -0.081857 0.881921 +vn -0.624754 -0.110161 0.773012 +vn -0.761268 -0.134232 0.634391 +vn -0.868524 -0.153144 0.471394 +vn -0.942401 -0.166171 0.290288 +vn -0.980066 -0.172812 0.098010 +vn -0.980065 -0.172812 -0.098018 +vn -0.942402 -0.166171 -0.290285 +vn -0.868521 -0.153144 -0.471401 +vn -0.761266 -0.134232 -0.634394 +vn -0.624751 -0.110161 -0.773014 +vn -0.464236 -0.081857 -0.881921 +vn -0.173717 0.984796 0.000356 +vn -0.096527 -0.017020 -0.995185 +vn -0.285873 -0.050407 -0.956941 +vn 0.173648 -0.984808 -0.000011 +vn 0.285874 0.050407 -0.956940 +vn 0.464237 0.081858 -0.881920 +vn 0.624752 0.110161 -0.773013 +vn 0.761267 0.134232 -0.634393 +vn 0.868524 0.153144 -0.471394 +vn 0.942402 0.166171 -0.290287 +vn 0.980065 0.172812 -0.098019 +vn 0.980065 0.172812 0.098019 +vn 0.942402 0.166171 0.290287 +vn 0.868524 0.153144 0.471394 +vn 0.761267 0.134232 0.634393 +vn 0.624752 0.110161 0.773013 +vn 0.464237 0.081858 0.881920 +vn 0.285874 0.050407 0.956940 +vn -0.096529 -0.017021 0.995185 +vn -0.285874 -0.050407 0.956940 +vn -0.624758 -0.110162 0.773008 +vn -0.761268 -0.134232 0.634392 +vn -0.868523 -0.153144 0.471397 +vn -0.942402 -0.166171 0.290284 +vn -0.980066 -0.172812 0.098018 +vn -0.980065 -0.172812 -0.098021 +vn -0.868521 -0.153144 -0.471400 +vn -0.761267 -0.134232 -0.634392 +vn -0.624756 -0.110161 -0.773010 +vn -0.464234 -0.081857 -0.881922 +vn -0.173640 0.984809 -0.000036 +vn -0.173648 0.984808 0.000040 +vn -0.173648 0.984808 0.000002 +vn -0.173650 0.984807 -0.000020 +vn -0.173652 0.984807 -0.000031 +vn -0.173635 0.984810 0.000027 +vn -0.173649 0.984808 -0.000009 +vn -0.173641 0.984809 0.000007 +vn -0.173650 0.984807 -0.000006 +vn -0.173640 0.984809 0.000006 +vn -0.173660 0.984806 -0.000014 +vn -0.173675 0.984803 0.000050 +vn -0.173675 0.984803 0.000049 +vn -0.173767 0.984787 -0.000044 +vn -0.173767 0.984787 0.000044 +vn -0.173642 0.984809 0.000000 +vn -0.173677 0.984803 0.000052 +vn -0.173717 0.984796 -0.000357 +vn -0.173646 0.984808 0.000005 +vn -0.173645 0.984808 0.000007 +vn -0.173703 0.984798 -0.000011 +vn -0.173684 0.984802 -0.000003 +vn -0.173667 0.984805 0.000002 +vn -0.173671 0.984804 -0.000015 +vn -0.173656 0.984806 -0.000026 +vn -0.173637 0.984810 0.000008 +vn -0.173643 0.984809 0.000005 +vn -0.096528 -0.017020 -0.995185 +vn -0.285872 -0.050407 -0.956941 +vn 0.173648 -0.984808 -0.000000 +vn 0.173647 -0.984808 0.000006 +vn 0.173647 -0.984808 0.000005 +vn 0.173652 -0.984807 -0.000009 +vn 0.173645 -0.984808 0.000005 +vn 0.173653 -0.984807 -0.000007 +vn 0.173643 -0.984809 0.000006 +vn 0.173652 -0.984807 -0.000003 +vn 0.173643 -0.984809 0.000004 +vn 0.173651 -0.984807 -0.000002 +vn 0.173650 -0.984807 -0.000001 +vn 0.173647 -0.984808 0.000000 +vn 0.173649 -0.984808 0.000000 +vn 0.173652 -0.984807 0.000001 +vn 0.173642 -0.984809 -0.000003 +vn 0.173653 -0.984807 0.000003 +vn 0.173642 -0.984809 -0.000004 +vn 0.173655 -0.984806 0.000007 +vn 0.173641 -0.984809 -0.000008 +vn 0.173658 -0.984806 0.000013 +vn 0.173645 -0.984808 -0.000007 +vn 0.173654 -0.984807 0.000007 +vn 0.173646 -0.984808 -0.000004 +s off +f 129//216 130//216 132//216 +f 131//217 132//217 134//217 +f 133//218 134//218 136//218 +f 135//219 136//219 138//219 +f 137//220 138//220 140//220 +f 139//221 140//221 142//221 +f 141//222 142//222 144//222 +f 143//223 144//223 146//223 +f 145//224 146//224 148//224 +f 147//225 148//225 150//225 +f 149//226 150//226 152//226 +f 151//227 152//227 154//227 +f 153//228 154//228 156//228 +f 155//229 156//229 158//229 +f 157//230 158//230 160//230 +f 159//231 160//231 162//231 +f 161//232 162//232 163//232 +f 163//233 164//233 165//233 +f 165//234 166//234 167//234 +f 167//235 168//235 169//235 +f 169//236 170//236 171//236 +f 171//237 172//237 173//237 +f 173//238 174//238 175//238 +f 175//239 176//239 177//239 +f 177//240 178//240 179//240 +f 179//241 180//241 181//241 +f 181//242 182//242 183//242 +f 183//243 184//243 185//243 +f 185//244 186//244 187//244 +f 187//245 188//245 189//245 +f 132//246 130//246 134//246 +f 191//247 192//247 129//247 +f 189//248 190//248 191//248 +f 129//249 131//249 191//249 +f 131//216 129//216 132//216 +f 133//250 131//250 134//250 +f 135//251 133//251 136//251 +f 137//252 135//252 138//252 +f 139//253 137//253 140//253 +f 141//254 139//254 142//254 +f 143//255 141//255 144//255 +f 145//256 143//256 146//256 +f 147//257 145//257 148//257 +f 149//258 147//258 150//258 +f 151//259 149//259 152//259 +f 153//260 151//260 154//260 +f 155//261 153//261 156//261 +f 157//262 155//262 158//262 +f 159//263 157//263 160//263 +f 161//231 159//231 162//231 +f 162//264 164//264 163//264 +f 164//265 166//265 165//265 +f 166//234 168//234 167//234 +f 168//266 170//266 169//266 +f 170//267 172//267 171//267 +f 172//268 174//268 173//268 +f 174//269 176//269 175//269 +f 176//270 178//270 177//270 +f 178//271 180//271 179//271 +f 180//241 182//241 181//241 +f 182//272 184//272 183//272 +f 184//273 186//273 185//273 +f 186//274 188//274 187//274 +f 188//275 190//275 189//275 +f 130//276 192//276 134//276 +f 192//277 190//277 134//277 +f 190//278 188//278 134//278 +f 188//279 186//279 134//279 +f 186//280 184//280 134//280 +f 184//281 182//281 134//281 +f 182//282 180//282 134//282 +f 180//283 178//283 134//283 +f 178//284 176//284 134//284 +f 176//285 174//285 134//285 +f 174//286 172//286 134//286 +f 170//287 168//287 166//287 +f 170//288 166//288 164//288 +f 148//289 152//289 150//289 +f 140//290 144//290 142//290 +f 172//287 170//287 164//287 +f 134//291 172//291 164//291 +f 136//292 134//292 138//292 +f 134//291 164//291 138//291 +f 162//293 160//293 158//293 +f 162//294 158//294 156//294 +f 146//295 152//295 148//295 +f 146//296 154//296 152//296 +f 144//297 154//297 146//297 +f 140//298 154//298 144//298 +f 138//299 164//299 140//299 +f 162//300 156//300 154//300 +f 164//301 162//301 140//301 +f 162//302 154//302 140//302 +f 192//303 130//303 129//303 +f 190//304 192//304 191//304 +f 131//305 133//305 191//305 +f 133//306 135//306 191//306 +f 135//305 137//305 191//305 +f 137//307 139//307 191//307 +f 139//308 141//308 191//308 +f 141//309 143//309 191//309 +f 143//310 145//310 191//310 +f 145//311 147//311 191//311 +f 147//312 149//312 191//312 +f 149//313 151//313 191//313 +f 151//314 153//314 191//314 +f 153//305 155//305 191//305 +f 155//315 157//315 191//315 +f 157//305 159//305 191//305 +f 159//316 161//316 191//316 +f 161//305 163//305 191//305 +f 163//305 165//305 191//305 +f 165//317 167//317 191//317 +f 167//317 169//317 191//317 +f 169//318 171//318 191//318 +f 171//319 173//319 191//319 +f 173//320 175//320 191//320 +f 175//321 177//321 191//321 +f 177//322 179//322 191//322 +f 179//323 181//323 191//323 +f 181//324 183//324 191//324 +f 183//325 185//325 191//325 +f 185//326 187//326 189//326 +f 191//327 185//327 189//327 +o Cylinder.004 +v -1.178897 2.277600 -0.129009 +v -0.137008 8.186446 -0.129009 +v -1.159685 2.274212 -0.127088 +v -0.117795 8.183058 -0.127088 +v -1.141210 2.270954 -0.121397 +v -0.099321 8.179801 -0.121397 +v -1.124184 2.267952 -0.112156 +v -0.082295 8.176799 -0.112156 +v -1.109261 2.265321 -0.099720 +v -0.067371 8.174168 -0.099720 +v -1.097013 2.263161 -0.084566 +v -0.055124 8.172008 -0.084566 +v -1.087913 2.261557 -0.067277 +v -0.046023 8.170403 -0.067277 +v -1.082309 2.260568 -0.048518 +v -0.040419 8.169415 -0.048518 +v -1.080417 2.260235 -0.029009 +v -0.038527 8.169081 -0.029009 +v -1.082309 2.260568 -0.009500 +v -0.040419 8.169415 -0.009500 +v -1.087913 2.261557 0.009259 +v -0.046023 8.170403 0.009259 +v -1.097013 2.263161 0.026548 +v -0.055124 8.172008 0.026548 +v -1.109261 2.265321 0.041702 +v -0.067371 8.174168 0.041702 +v -1.124184 2.267952 0.054138 +v -0.082295 8.176799 0.054138 +v -1.141210 2.270954 0.063379 +v -0.099321 8.179801 0.063379 +v -1.159685 2.274212 0.069069 +v -0.117795 8.183058 0.069069 +v -1.178897 2.277600 0.070991 +v -0.137008 8.186446 0.070991 +v -1.198110 2.280987 0.069069 +v -0.156220 8.189834 0.069069 +v -1.216584 2.284245 0.063379 +v -0.174695 8.193091 0.063379 +v -1.233610 2.287247 0.054138 +v -0.191721 8.196094 0.054138 +v -1.248534 2.289878 0.041702 +v -0.206644 8.198725 0.041702 +v -1.260781 2.292038 0.026548 +v -0.218892 8.200884 0.026548 +v -1.269882 2.293643 0.009259 +v -0.227992 8.202489 0.009259 +v -1.275486 2.294631 -0.009500 +v -0.233596 8.203477 -0.009500 +v -1.277378 2.294964 -0.029009 +v -0.235489 8.203811 -0.029009 +v -1.275486 2.294631 -0.048518 +v -0.233596 8.203477 -0.048518 +v -1.269882 2.293643 -0.067278 +v -0.227992 8.202489 -0.067278 +v -1.260781 2.292038 -0.084566 +v -0.218892 8.200884 -0.084566 +v -1.248534 2.289878 -0.099720 +v -0.206644 8.198725 -0.099720 +v -1.233610 2.287247 -0.112156 +v -0.191721 8.196094 -0.112156 +v -1.216584 2.284245 -0.121397 +v -0.174695 8.193091 -0.121397 +v -1.198110 2.280987 -0.127088 +v -0.156220 8.189834 -0.127088 +vn 0.096528 -0.017020 -0.995185 +vn 0.285876 -0.050408 -0.956940 +vn 0.464236 -0.081857 -0.881921 +vn 0.624756 -0.110161 -0.773010 +vn 0.761265 -0.134232 -0.634395 +vn 0.868521 -0.153144 -0.471400 +vn 0.942403 -0.166171 -0.290282 +vn 0.980065 -0.172812 -0.098021 +vn 0.980066 -0.172812 0.098018 +vn 0.942402 -0.166171 0.290285 +vn 0.868522 -0.153144 0.471399 +vn 0.761265 -0.134232 0.634395 +vn 0.624756 -0.110161 0.773010 +vn 0.464235 -0.081857 0.881922 +vn 0.285876 -0.050408 0.956940 +vn 0.096527 -0.017020 0.995185 +vn -0.096528 0.017020 0.995185 +vn -0.285876 0.050408 0.956940 +vn -0.464234 0.081857 0.881922 +vn -0.624758 0.110162 0.773008 +vn -0.761264 0.134231 0.634396 +vn -0.868524 0.153144 0.471394 +vn -0.942401 0.166171 0.290288 +vn -0.980066 0.172812 0.098014 +vn -0.980066 0.172812 -0.098014 +vn -0.942403 0.166171 -0.290281 +vn -0.868522 0.153144 -0.471398 +vn -0.761268 0.134232 -0.634392 +vn -0.624751 0.110161 -0.773014 +vn -0.464236 0.081857 -0.881921 +vn 0.173717 0.984795 -0.000357 +vn -0.096527 0.017020 -0.995185 +vn -0.285874 0.050407 -0.956940 +vn -0.173648 -0.984808 0.000011 +vn 0.285874 -0.050407 -0.956940 +vn 0.464237 -0.081858 -0.881920 +vn 0.624755 -0.110161 -0.773011 +vn 0.761264 -0.134231 -0.634396 +vn 0.868524 -0.153144 -0.471394 +vn 0.942402 -0.166171 -0.290287 +vn 0.980066 -0.172812 -0.098013 +vn 0.980066 -0.172812 0.098013 +vn 0.942402 -0.166171 0.290287 +vn 0.868524 -0.153144 0.471394 +vn 0.761264 -0.134231 0.634396 +vn 0.624755 -0.110161 0.773011 +vn 0.464237 -0.081858 0.881920 +vn 0.285874 -0.050407 0.956940 +vn -0.096529 0.017021 0.995185 +vn -0.285874 0.050407 0.956940 +vn -0.464235 0.081857 0.881921 +vn -0.624756 0.110161 0.773010 +vn -0.761269 0.134232 0.634391 +vn -0.868522 0.153144 0.471398 +vn -0.942403 0.166171 0.290282 +vn -0.980066 0.172812 0.098018 +vn -0.980065 0.172812 -0.098019 +vn -0.942402 0.166171 -0.290285 +vn -0.868521 0.153144 -0.471400 +vn -0.761267 0.134232 -0.634392 +vn -0.624756 0.110161 -0.773010 +vn -0.464234 0.081857 -0.881922 +vn 0.173640 0.984809 0.000036 +vn 0.173648 0.984808 -0.000041 +vn 0.173648 0.984808 -0.000002 +vn 0.173650 0.984807 0.000019 +vn 0.173652 0.984807 0.000031 +vn 0.173635 0.984810 -0.000027 +vn 0.173649 0.984808 0.000009 +vn 0.173641 0.984809 -0.000007 +vn 0.173650 0.984807 0.000006 +vn 0.173641 0.984809 -0.000005 +vn 0.173660 0.984806 0.000014 +vn 0.173629 0.984811 -0.000011 +vn 0.173638 0.984810 -0.000005 +vn 0.173649 0.984808 0.000001 +vn 0.173659 0.984806 0.000005 +vn 0.173636 0.984810 -0.000002 +vn 0.173683 0.984802 0.000007 +vn 0.173611 0.984814 0.000000 +vn 0.173649 0.984808 0.000000 +vn 0.173635 0.984810 0.000001 +vn 0.173681 0.984802 -0.000008 +vn 0.173674 0.984803 -0.000006 +vn 0.173644 0.984808 0.000007 +vn 0.173666 0.984805 -0.000005 +vn 0.173677 0.984803 -0.000016 +vn 0.173633 0.984810 0.000028 +vn 0.173518 0.984831 0.000143 +vn 0.173638 0.984810 0.000022 +vn -0.096528 0.017020 -0.995185 +vn -0.285872 0.050407 -0.956941 +vn -0.173648 -0.984808 0.000000 +vn -0.173647 -0.984808 -0.000006 +vn -0.173648 -0.984808 -0.000002 +vn -0.173647 -0.984808 -0.000003 +vn -0.173652 -0.984807 0.000009 +vn -0.173645 -0.984808 -0.000005 +vn -0.173652 -0.984807 0.000005 +vn -0.173644 -0.984809 -0.000005 +vn -0.173652 -0.984807 0.000003 +vn -0.173643 -0.984809 -0.000004 +vn -0.173650 -0.984807 0.000001 +vn -0.173680 -0.984802 0.000024 +vn -0.173592 -0.984818 0.000023 +vn -0.173693 -0.984800 0.000010 +vn -0.173644 -0.984808 -0.000000 +vn -0.173638 -0.984810 0.000013 +vn -0.173653 -0.984807 -0.000003 +vn -0.173644 -0.984808 0.000011 +vn -0.173646 -0.984808 0.000007 +vn -0.173645 -0.984808 -0.000007 +vn -0.173651 -0.984807 0.000003 +vn -0.173649 -0.984808 0.000000 +vn -0.173648 -0.984808 0.000001 +vn -0.173647 -0.984808 0.000002 +vn -0.173640 -0.984809 -0.000005 +vn -0.173647 -0.984808 -0.000001 +s off +f 193//328 194//328 196//328 +f 195//329 196//329 198//329 +f 197//330 198//330 200//330 +f 199//331 200//331 202//331 +f 201//332 202//332 204//332 +f 203//333 204//333 206//333 +f 205//334 206//334 208//334 +f 207//335 208//335 210//335 +f 209//336 210//336 212//336 +f 211//337 212//337 214//337 +f 213//338 214//338 216//338 +f 215//339 216//339 218//339 +f 217//340 218//340 220//340 +f 219//341 220//341 222//341 +f 221//342 222//342 224//342 +f 223//343 224//343 226//343 +f 225//344 226//344 227//344 +f 227//345 228//345 229//345 +f 229//346 230//346 231//346 +f 231//347 232//347 233//347 +f 233//348 234//348 235//348 +f 235//349 236//349 237//349 +f 237//350 238//350 239//350 +f 239//351 240//351 241//351 +f 241//352 242//352 243//352 +f 243//353 244//353 245//353 +f 245//354 246//354 247//354 +f 247//355 248//355 249//355 +f 249//356 250//356 251//356 +f 251//357 252//357 253//357 +f 196//358 194//358 198//358 +f 255//359 256//359 193//359 +f 253//360 254//360 255//360 +f 193//361 195//361 255//361 +f 195//328 193//328 196//328 +f 197//362 195//362 198//362 +f 199//363 197//363 200//363 +f 201//364 199//364 202//364 +f 203//365 201//365 204//365 +f 205//366 203//366 206//366 +f 207//367 205//367 208//367 +f 209//368 207//368 210//368 +f 211//369 209//369 212//369 +f 213//370 211//370 214//370 +f 215//371 213//371 216//371 +f 217//372 215//372 218//372 +f 219//373 217//373 220//373 +f 221//374 219//374 222//374 +f 223//375 221//375 224//375 +f 225//343 223//343 226//343 +f 226//376 228//376 227//376 +f 228//377 230//377 229//377 +f 230//378 232//378 231//378 +f 232//379 234//379 233//379 +f 234//380 236//380 235//380 +f 236//381 238//381 237//381 +f 238//382 240//382 239//382 +f 240//383 242//383 241//383 +f 242//384 244//384 243//384 +f 244//385 246//385 245//385 +f 246//386 248//386 247//386 +f 248//387 250//387 249//387 +f 250//388 252//388 251//388 +f 252//389 254//389 253//389 +f 194//390 256//390 198//390 +f 256//391 254//391 198//391 +f 254//392 252//392 198//392 +f 252//393 250//393 198//393 +f 250//394 248//394 198//394 +f 248//395 246//395 198//395 +f 246//396 244//396 198//396 +f 244//397 242//397 198//397 +f 242//398 240//398 198//398 +f 240//399 238//399 198//399 +f 238//400 236//400 198//400 +f 236//401 234//401 198//401 +f 234//402 232//402 198//402 +f 232//403 230//403 198//403 +f 230//404 228//404 198//404 +f 228//405 226//405 198//405 +f 226//406 224//406 198//406 +f 224//407 222//407 198//407 +f 222//408 220//408 198//408 +f 220//409 218//409 198//409 +f 218//410 216//410 198//410 +f 216//411 214//411 198//411 +f 214//412 212//412 198//412 +f 212//413 210//413 198//413 +f 210//398 208//398 198//398 +f 208//414 206//414 198//414 +f 206//415 204//415 198//415 +f 204//416 202//416 200//416 +f 198//417 204//417 200//417 +f 256//418 194//418 193//418 +f 254//419 256//419 255//419 +f 195//420 197//420 255//420 +f 197//421 199//421 255//421 +f 199//422 201//422 255//422 +f 201//423 203//423 255//423 +f 203//424 205//424 255//424 +f 205//425 207//425 255//425 +f 207//426 209//426 255//426 +f 209//427 211//427 255//427 +f 211//428 213//428 255//428 +f 213//429 215//429 255//429 +f 215//430 217//430 255//430 +f 237//431 233//431 235//431 +f 247//432 243//432 245//432 +f 241//433 237//433 239//433 +f 241//434 233//434 237//434 +f 251//435 247//435 249//435 +f 251//436 243//436 247//436 +f 219//437 221//437 223//437 +f 219//438 223//438 225//438 +f 233//439 229//439 231//439 +f 241//440 229//440 233//440 +f 255//437 251//437 253//437 +f 255//441 217//441 251//441 +f 251//441 217//441 243//441 +f 219//442 225//442 227//442 +f 217//443 219//443 227//443 +f 243//420 217//420 227//420 +f 241//444 243//444 229//444 +f 243//445 227//445 229//445 +o Cube_Cube.001 +v -3.858562 2.027707 3.871576 +v -3.858562 2.027707 -3.907549 +v 3.920563 2.027707 -3.907549 +v 3.920563 2.027707 3.871576 +v -3.858562 2.306528 3.871576 +v -3.858562 2.306528 -3.907549 +v 3.920563 2.306528 -3.907549 +v 3.920563 2.306528 3.871576 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +s off +f 261//446 262//446 257//446 +f 262//447 263//447 258//447 +f 263//448 264//448 260//448 +f 264//449 261//449 257//449 +f 257//450 258//450 259//450 +f 264//451 263//451 262//451 +f 262//446 258//446 257//446 +f 263//447 259//447 258//447 +f 259//448 263//448 260//448 +f 260//449 264//449 257//449 +f 260//450 257//450 259//450 +f 261//451 264//451 262//451 +o Cylinder.003 +v 2.043798 0.024218 -3.001008 +v 2.043798 2.024218 -3.001008 +v 2.238889 0.024218 -2.981793 +v 2.238889 2.024218 -2.981793 +v 2.426482 0.024218 -2.924888 +v 2.426482 2.024218 -2.924888 +v 2.599369 0.024218 -2.832478 +v 2.599369 2.024218 -2.832478 +v 2.750905 0.024218 -2.708115 +v 2.750905 2.024218 -2.708115 +v 2.875268 0.024218 -2.556578 +v 2.875268 2.024218 -2.556578 +v 2.967678 0.024218 -2.383692 +v 2.967678 2.024218 -2.383692 +v 3.024584 0.024218 -2.196099 +v 3.024584 2.024218 -2.196099 +v 3.043798 0.024218 -2.001008 +v 3.043798 2.024218 -2.001008 +v 3.024584 0.024218 -1.805918 +v 3.024584 2.024218 -1.805918 +v 2.967678 0.024218 -1.618325 +v 2.967678 2.024218 -1.618325 +v 2.875268 0.024218 -1.445438 +v 2.875268 2.024218 -1.445438 +v 2.750905 0.024218 -1.293901 +v 2.750905 2.024218 -1.293901 +v 2.599369 0.024218 -1.169539 +v 2.599369 2.024218 -1.169539 +v 2.426482 0.024218 -1.077129 +v 2.426482 2.024218 -1.077129 +v 2.238889 0.024218 -1.020223 +v 2.238889 2.024218 -1.020223 +v 2.043798 0.024218 -1.001008 +v 2.043798 2.024218 -1.001008 +v 1.848708 0.024218 -1.020223 +v 1.848708 2.024218 -1.020223 +v 1.661115 0.024218 -1.077129 +v 1.661115 2.024218 -1.077129 +v 1.488228 0.024218 -1.169539 +v 1.488228 2.024218 -1.169539 +v 1.336691 0.024218 -1.293902 +v 1.336691 2.024218 -1.293902 +v 1.212328 0.024218 -1.445439 +v 1.212328 2.024218 -1.445439 +v 1.119919 0.024218 -1.618326 +v 1.119919 2.024218 -1.618326 +v 1.063013 0.024218 -1.805919 +v 1.063013 2.024218 -1.805919 +v 1.043798 0.024218 -2.001009 +v 1.043798 2.024218 -2.001009 +v 1.063013 0.024218 -2.196100 +v 1.063013 2.024218 -2.196100 +v 1.119919 0.024218 -2.383693 +v 1.119919 2.024218 -2.383693 +v 1.212330 0.024218 -2.556580 +v 1.212330 2.024218 -2.556580 +v 1.336693 0.024218 -2.708116 +v 1.336693 2.024218 -2.708116 +v 1.488229 0.024218 -2.832479 +v 1.488229 2.024218 -2.832479 +v 1.661116 0.024218 -2.924888 +v 1.661116 2.024218 -2.924888 +v 1.848710 0.024218 -2.981794 +v 1.848710 2.024218 -2.981794 +vn 0.098018 0.000000 -0.995185 +vn 0.290285 0.000000 -0.956940 +vn 0.471397 0.000000 -0.881921 +vn 0.634393 0.000000 -0.773011 +vn 0.773011 0.000000 -0.634393 +vn 0.881921 0.000000 -0.471398 +vn 0.956940 0.000000 -0.290285 +vn 0.995185 0.000000 -0.098017 +vn 0.995185 0.000000 0.098017 +vn 0.956940 0.000000 0.290285 +vn 0.881921 0.000000 0.471397 +vn 0.773011 0.000000 0.634393 +vn 0.634393 0.000000 0.773011 +vn 0.471397 0.000000 0.881921 +vn 0.290285 0.000000 0.956940 +vn 0.098017 0.000000 0.995185 +vn -0.098018 0.000000 0.995185 +vn -0.290285 0.000000 0.956940 +vn -0.471397 0.000000 0.881921 +vn -0.634394 0.000000 0.773010 +vn -0.773011 0.000000 0.634393 +vn -0.881922 0.000000 0.471396 +vn -0.956941 0.000000 0.290283 +vn -0.995185 0.000000 0.098017 +vn -0.995185 -0.000000 -0.098018 +vn -0.956940 -0.000000 -0.290286 +vn -0.881921 -0.000000 -0.471398 +vn -0.773010 -0.000000 -0.634394 +vn -0.634392 -0.000000 -0.773012 +vn -0.471396 -0.000000 -0.881922 +vn -0.098016 -0.000000 -0.995185 +vn -0.290283 -0.000000 -0.956941 +s off +f 265//452 266//452 268//452 +f 267//453 268//453 270//453 +f 269//454 270//454 272//454 +f 271//455 272//455 274//455 +f 273//456 274//456 276//456 +f 275//457 276//457 278//457 +f 277//458 278//458 280//458 +f 279//459 280//459 282//459 +f 281//460 282//460 284//460 +f 283//461 284//461 286//461 +f 285//462 286//462 288//462 +f 287//463 288//463 290//463 +f 289//464 290//464 292//464 +f 291//465 292//465 294//465 +f 293//466 294//466 296//466 +f 295//467 296//467 298//467 +f 297//468 298//468 299//468 +f 299//469 300//469 301//469 +f 301//470 302//470 303//470 +f 303//471 304//471 305//471 +f 305//472 306//472 307//472 +f 307//473 308//473 309//473 +f 309//474 310//474 311//474 +f 311//475 312//475 313//475 +f 313//476 314//476 315//476 +f 315//477 316//477 317//477 +f 317//478 318//478 319//478 +f 319//479 320//479 321//479 +f 321//480 322//480 323//480 +f 323//481 324//481 325//481 +f 268//451 266//451 270//451 +f 327//482 328//482 265//482 +f 325//483 326//483 327//483 +f 265//450 267//450 327//450 +f 267//452 265//452 268//452 +f 269//453 267//453 270//453 +f 271//454 269//454 272//454 +f 273//455 271//455 274//455 +f 275//456 273//456 276//456 +f 277//457 275//457 278//457 +f 279//458 277//458 280//458 +f 281//459 279//459 282//459 +f 283//460 281//460 284//460 +f 285//461 283//461 286//461 +f 287//462 285//462 288//462 +f 289//463 287//463 290//463 +f 291//464 289//464 292//464 +f 293//465 291//465 294//465 +f 295//466 293//466 296//466 +f 297//467 295//467 298//467 +f 298//468 300//468 299//468 +f 300//469 302//469 301//469 +f 302//470 304//470 303//470 +f 304//471 306//471 305//471 +f 306//472 308//472 307//472 +f 308//473 310//473 309//473 +f 310//474 312//474 311//474 +f 312//475 314//475 313//475 +f 314//476 316//476 315//476 +f 316//477 318//477 317//477 +f 318//478 320//478 319//478 +f 320//479 322//479 321//479 +f 322//480 324//480 323//480 +f 324//481 326//481 325//481 +f 266//451 328//451 270//451 +f 328//451 326//451 270//451 +f 326//451 324//451 270//451 +f 324//451 322//451 270//451 +f 322//451 320//451 270//451 +f 320//451 318//451 270//451 +f 318//451 316//451 270//451 +f 316//451 314//451 270//451 +f 314//451 312//451 270//451 +f 312//451 310//451 270//451 +f 310//451 308//451 270//451 +f 308//451 306//451 270//451 +f 306//451 304//451 270//451 +f 304//451 302//451 270//451 +f 302//451 300//451 270//451 +f 300//451 298//451 270//451 +f 298//451 296//451 270//451 +f 296//451 294//451 270//451 +f 294//451 292//451 270//451 +f 292//451 290//451 270//451 +f 290//451 288//451 270//451 +f 288//451 286//451 270//451 +f 286//451 284//451 270//451 +f 284//451 282//451 270//451 +f 282//451 280//451 270//451 +f 280//451 278//451 270//451 +f 278//451 276//451 270//451 +f 276//451 274//451 270//451 +f 274//451 272//451 270//451 +f 328//482 266//482 265//482 +f 326//483 328//483 327//483 +f 267//450 269//450 327//450 +f 269//450 271//450 327//450 +f 271//450 273//450 327//450 +f 273//450 275//450 327//450 +f 275//450 277//450 327//450 +f 277//450 279//450 327//450 +f 279//450 281//450 327//450 +f 281//450 283//450 327//450 +f 283//450 285//450 327//450 +f 285//450 287//450 327//450 +f 287//450 289//450 327//450 +f 289//450 291//450 327//450 +f 291//450 293//450 327//450 +f 293//450 295//450 327//450 +f 295//450 297//450 327//450 +f 297//450 299//450 327//450 +f 299//450 301//450 327//450 +f 301//450 303//450 327//450 +f 303//450 305//450 327//450 +f 305//450 307//450 327//450 +f 307//450 309//450 327//450 +f 309//450 311//450 327//450 +f 311//450 313//450 327//450 +f 313//450 315//450 327//450 +f 315//450 317//450 327//450 +f 317//450 319//450 327//450 +f 319//450 321//450 327//450 +f 321//450 323//450 325//450 +f 327//450 321//450 325//450 +o Cylinder.002 +v -2.014818 0.007922 0.998641 +v -2.014818 2.007922 0.998641 +v -1.819728 0.007922 1.017856 +v -1.819728 2.007922 1.017856 +v -1.632135 0.007922 1.074762 +v -1.632135 2.007922 1.074762 +v -1.459248 0.007922 1.167172 +v -1.459248 2.007922 1.167172 +v -1.307712 0.007922 1.291534 +v -1.307712 2.007922 1.291534 +v -1.183349 0.007922 1.443071 +v -1.183349 2.007922 1.443071 +v -1.090939 0.007922 1.615958 +v -1.090939 2.007922 1.615958 +v -1.034033 0.007922 1.803551 +v -1.034033 2.007922 1.803551 +v -1.014818 0.007922 1.998641 +v -1.014818 2.007922 1.998641 +v -1.034033 0.007922 2.193732 +v -1.034033 2.007922 2.193732 +v -1.090939 0.007922 2.381325 +v -1.090939 2.007922 2.381325 +v -1.183349 0.007922 2.554211 +v -1.183349 2.007922 2.554211 +v -1.307712 0.007922 2.705748 +v -1.307712 2.007922 2.705748 +v -1.459248 0.007922 2.830111 +v -1.459248 2.007922 2.830111 +v -1.632135 0.007922 2.922521 +v -1.632135 2.007922 2.922521 +v -1.819728 0.007922 2.979427 +v -1.819728 2.007922 2.979427 +v -2.014819 0.007922 2.998641 +v -2.014819 2.007922 2.998641 +v -2.209909 0.007922 2.979426 +v -2.209909 2.007922 2.979426 +v -2.397502 0.007922 2.922521 +v -2.397502 2.007922 2.922521 +v -2.570389 0.007922 2.830111 +v -2.570389 2.007922 2.830111 +v -2.721926 0.007922 2.705748 +v -2.721926 2.007922 2.705748 +v -2.846288 0.007922 2.554211 +v -2.846288 2.007922 2.554211 +v -2.938698 0.007922 2.381324 +v -2.938698 2.007922 2.381324 +v -2.995604 0.007922 2.193731 +v -2.995604 2.007922 2.193731 +v -3.014818 0.007922 1.998640 +v -3.014818 2.007922 1.998640 +v -2.995604 0.007922 1.803550 +v -2.995604 2.007922 1.803550 +v -2.938698 0.007922 1.615957 +v -2.938698 2.007922 1.615957 +v -2.846287 0.007922 1.443070 +v -2.846287 2.007922 1.443070 +v -2.721924 0.007922 1.291534 +v -2.721924 2.007922 1.291534 +v -2.570388 0.007922 1.167171 +v -2.570388 2.007922 1.167171 +v -2.397501 0.007922 1.074761 +v -2.397501 2.007922 1.074761 +v -2.209907 0.007922 1.017856 +v -2.209907 2.007922 1.017856 +vn 0.098017 0.000000 -0.995185 +vn 0.881921 0.000000 -0.471397 +vn 0.634393 0.000000 0.773010 +vn 0.471396 0.000000 0.881922 +vn -0.881920 -0.000000 -0.471398 +vn -0.634393 -0.000000 -0.773011 +vn -0.471395 -0.000000 -0.881922 +s off +f 329//484 330//484 332//484 +f 331//453 332//453 334//453 +f 333//454 334//454 336//454 +f 335//455 336//455 338//455 +f 337//456 338//456 340//456 +f 339//485 340//485 342//485 +f 341//458 342//458 344//458 +f 343//459 344//459 346//459 +f 345//460 346//460 348//460 +f 347//461 348//461 350//461 +f 349//462 350//462 352//462 +f 351//463 352//463 354//463 +f 353//486 354//486 356//486 +f 355//487 356//487 358//487 +f 357//466 358//466 360//466 +f 359//467 360//467 362//467 +f 361//468 362//468 363//468 +f 363//469 364//469 365//469 +f 365//470 366//470 367//470 +f 367//471 368//471 369//471 +f 369//472 370//472 371//472 +f 371//473 372//473 373//473 +f 373//474 374//474 375//474 +f 375//475 376//475 377//475 +f 377//476 378//476 379//476 +f 379//477 380//477 381//477 +f 381//488 382//488 383//488 +f 383//479 384//479 385//479 +f 385//489 386//489 387//489 +f 387//490 388//490 389//490 +f 332//451 330//451 334//451 +f 391//482 392//482 329//482 +f 389//483 390//483 391//483 +f 329//450 331//450 391//450 +f 331//484 329//484 332//484 +f 333//453 331//453 334//453 +f 335//454 333//454 336//454 +f 337//455 335//455 338//455 +f 339//456 337//456 340//456 +f 341//485 339//485 342//485 +f 343//458 341//458 344//458 +f 345//459 343//459 346//459 +f 347//460 345//460 348//460 +f 349//461 347//461 350//461 +f 351//462 349//462 352//462 +f 353//463 351//463 354//463 +f 355//486 353//486 356//486 +f 357//487 355//487 358//487 +f 359//466 357//466 360//466 +f 361//467 359//467 362//467 +f 362//468 364//468 363//468 +f 364//469 366//469 365//469 +f 366//470 368//470 367//470 +f 368//471 370//471 369//471 +f 370//472 372//472 371//472 +f 372//473 374//473 373//473 +f 374//474 376//474 375//474 +f 376//475 378//475 377//475 +f 378//476 380//476 379//476 +f 380//477 382//477 381//477 +f 382//488 384//488 383//488 +f 384//479 386//479 385//479 +f 386//489 388//489 387//489 +f 388//490 390//490 389//490 +f 330//451 392//451 334//451 +f 392//451 390//451 334//451 +f 390//451 388//451 334//451 +f 388//451 386//451 334//451 +f 386//451 384//451 334//451 +f 384//451 382//451 334//451 +f 382//451 380//451 334//451 +f 380//451 378//451 334//451 +f 378//451 376//451 334//451 +f 376//451 374//451 334//451 +f 374//451 372//451 334//451 +f 372//451 370//451 334//451 +f 370//451 368//451 334//451 +f 368//451 366//451 334//451 +f 366//451 364//451 334//451 +f 364//451 362//451 334//451 +f 362//451 360//451 334//451 +f 360//451 358//451 334//451 +f 358//451 356//451 334//451 +f 356//451 354//451 334//451 +f 354//451 352//451 334//451 +f 352//451 350//451 334//451 +f 350//451 348//451 334//451 +f 348//451 346//451 334//451 +f 346//451 344//451 334//451 +f 344//451 342//451 334//451 +f 342//451 340//451 334//451 +f 340//451 338//451 334//451 +f 338//451 336//451 334//451 +f 392//482 330//482 329//482 +f 390//483 392//483 391//483 +f 331//450 333//450 391//450 +f 333//450 335//450 391//450 +f 335//450 337//450 391//450 +f 337//450 339//450 391//450 +f 339//450 341//450 391//450 +f 341//450 343//450 391//450 +f 343//450 345//450 391//450 +f 345//450 347//450 391//450 +f 347//450 349//450 391//450 +f 349//450 351//450 391//450 +f 351//450 353//450 391//450 +f 353//450 355//450 391//450 +f 355//450 357//450 391//450 +f 357//450 359//450 391//450 +f 359//450 361//450 391//450 +f 361//450 363//450 391//450 +f 363//450 365//450 391//450 +f 365//450 367//450 391//450 +f 367//450 369//450 391//450 +f 369//450 371//450 391//450 +f 371//450 373//450 391//450 +f 373//450 375//450 391//450 +f 375//450 377//450 391//450 +f 377//450 379//450 391//450 +f 379//450 381//450 391//450 +f 381//450 383//450 391//450 +f 383//450 385//450 391//450 +f 385//450 387//450 391//450 +f 387//450 389//450 391//450 +o Cylinder.001 +v -2.001621 -0.021814 -3.021079 +v -2.001621 1.978186 -3.021079 +v -1.806530 -0.021814 -3.001864 +v -1.806530 1.978186 -3.001864 +v -1.618937 -0.021814 -2.944958 +v -1.618937 1.978186 -2.944958 +v -1.446051 -0.021814 -2.852548 +v -1.446051 1.978186 -2.852548 +v -1.294514 -0.021814 -2.728185 +v -1.294514 1.978186 -2.728185 +v -1.170151 -0.021814 -2.576649 +v -1.170151 1.978186 -2.576649 +v -1.077741 -0.021814 -2.403762 +v -1.077741 1.978186 -2.403762 +v -1.020836 -0.021814 -2.216169 +v -1.020836 1.978186 -2.216169 +v -1.001621 -0.021814 -2.021079 +v -1.001621 1.978186 -2.021079 +v -1.020835 -0.021814 -1.825988 +v -1.020835 1.978186 -1.825988 +v -1.077741 -0.021814 -1.638395 +v -1.077741 1.978186 -1.638395 +v -1.170151 -0.021814 -1.465508 +v -1.170151 1.978186 -1.465508 +v -1.294514 -0.021814 -1.313972 +v -1.294514 1.978186 -1.313972 +v -1.446051 -0.021814 -1.189609 +v -1.446051 1.978186 -1.189609 +v -1.618937 -0.021814 -1.097199 +v -1.618937 1.978186 -1.097199 +v -1.806531 -0.021814 -1.040293 +v -1.806531 1.978186 -1.040293 +v -2.001621 -0.021814 -1.021079 +v -2.001621 1.978186 -1.021079 +v -2.196712 -0.021814 -1.040293 +v -2.196712 1.978186 -1.040293 +v -2.384305 -0.021814 -1.097199 +v -2.384305 1.978186 -1.097199 +v -2.557191 -0.021814 -1.189609 +v -2.557191 1.978186 -1.189609 +v -2.708728 -0.021814 -1.313972 +v -2.708728 1.978186 -1.313972 +v -2.833091 -0.021814 -1.465509 +v -2.833091 1.978186 -1.465509 +v -2.925501 -0.021814 -1.638396 +v -2.925501 1.978186 -1.638396 +v -2.982406 -0.021814 -1.825989 +v -2.982406 1.978186 -1.825989 +v -3.001621 -0.021814 -2.021080 +v -3.001621 1.978186 -2.021080 +v -2.982406 -0.021814 -2.216170 +v -2.982406 1.978186 -2.216170 +v -2.925500 -0.021814 -2.403763 +v -2.925500 1.978186 -2.403763 +v -2.833090 -0.021814 -2.576650 +v -2.833090 1.978186 -2.576650 +v -2.708727 -0.021814 -2.728186 +v -2.708727 1.978186 -2.728186 +v -2.557190 -0.021814 -2.852549 +v -2.557190 1.978186 -2.852549 +v -2.384303 -0.021814 -2.944959 +v -2.384303 1.978186 -2.944959 +v -2.196710 -0.021814 -3.001864 +v -2.196710 1.978186 -3.001864 +vn 0.471398 0.000000 -0.881921 +vn -0.634393 0.000000 0.773010 +vn -0.881921 -0.000000 -0.471397 +vn -0.773009 -0.000000 -0.634395 +vn -0.634393 -0.000000 -0.773010 +s off +f 393//484 394//484 396//484 +f 395//453 396//453 398//453 +f 397//491 398//491 400//491 +f 399//455 400//455 402//455 +f 401//456 402//456 404//456 +f 403//485 404//485 406//485 +f 405//458 406//458 408//458 +f 407//459 408//459 410//459 +f 409//460 410//460 412//460 +f 411//461 412//461 414//461 +f 413//462 414//462 416//462 +f 415//463 416//463 418//463 +f 417//464 418//464 420//464 +f 419//465 420//465 422//465 +f 421//466 422//466 424//466 +f 423//467 424//467 426//467 +f 425//468 426//468 427//468 +f 427//469 428//469 429//469 +f 429//470 430//470 431//470 +f 431//492 432//492 433//492 +f 433//472 434//472 435//472 +f 435//473 436//473 437//473 +f 437//474 438//474 439//474 +f 439//475 440//475 441//475 +f 441//476 442//476 443//476 +f 443//477 444//477 445//477 +f 445//493 446//493 447//493 +f 447//494 448//494 449//494 +f 449//495 450//495 451//495 +f 451//490 452//490 453//490 +f 396//451 394//451 398//451 +f 455//482 456//482 393//482 +f 453//483 454//483 455//483 +f 393//450 395//450 455//450 +f 395//484 393//484 396//484 +f 397//453 395//453 398//453 +f 399//491 397//491 400//491 +f 401//455 399//455 402//455 +f 403//456 401//456 404//456 +f 405//485 403//485 406//485 +f 407//458 405//458 408//458 +f 409//459 407//459 410//459 +f 411//460 409//460 412//460 +f 413//461 411//461 414//461 +f 415//462 413//462 416//462 +f 417//463 415//463 418//463 +f 419//464 417//464 420//464 +f 421//465 419//465 422//465 +f 423//466 421//466 424//466 +f 425//467 423//467 426//467 +f 426//468 428//468 427//468 +f 428//469 430//469 429//469 +f 430//470 432//470 431//470 +f 432//492 434//492 433//492 +f 434//472 436//472 435//472 +f 436//473 438//473 437//473 +f 438//474 440//474 439//474 +f 440//475 442//475 441//475 +f 442//476 444//476 443//476 +f 444//477 446//477 445//477 +f 446//493 448//493 447//493 +f 448//494 450//494 449//494 +f 450//495 452//495 451//495 +f 452//490 454//490 453//490 +f 394//451 456//451 398//451 +f 456//451 454//451 398//451 +f 454//451 452//451 398//451 +f 452//451 450//451 398//451 +f 450//451 448//451 398//451 +f 448//451 446//451 398//451 +f 446//451 444//451 398//451 +f 444//451 442//451 398//451 +f 442//451 440//451 398//451 +f 440//451 438//451 398//451 +f 438//451 436//451 398//451 +f 436//451 434//451 398//451 +f 434//451 432//451 398//451 +f 432//451 430//451 398//451 +f 430//451 428//451 398//451 +f 428//451 426//451 398//451 +f 426//451 424//451 398//451 +f 424//451 422//451 398//451 +f 422//451 420//451 398//451 +f 420//451 418//451 398//451 +f 418//451 416//451 398//451 +f 416//451 414//451 398//451 +f 414//451 412//451 398//451 +f 412//451 410//451 398//451 +f 410//451 408//451 398//451 +f 408//451 406//451 398//451 +f 406//451 404//451 398//451 +f 404//451 402//451 398//451 +f 402//451 400//451 398//451 +f 456//482 394//482 393//482 +f 454//483 456//483 455//483 +f 395//450 397//450 455//450 +f 397//450 399//450 455//450 +f 399//450 401//450 455//450 +f 401//450 403//450 455//450 +f 403//450 405//450 455//450 +f 405//450 407//450 455//450 +f 407//450 409//450 455//450 +f 409//450 411//450 455//450 +f 411//450 413//450 455//450 +f 413//450 415//450 455//450 +f 415//450 417//450 455//450 +f 417//450 419//450 455//450 +f 419//450 421//450 455//450 +f 421//450 423//450 455//450 +f 423//450 425//450 455//450 +f 425//450 427//450 455//450 +f 427//450 429//450 455//450 +f 429//450 431//450 455//450 +f 431//450 433//450 455//450 +f 433//450 435//450 455//450 +f 435//450 437//450 455//450 +f 437//450 439//450 455//450 +f 439//450 441//450 455//450 +f 441//450 443//450 455//450 +f 443//450 445//450 455//450 +f 445//450 447//450 455//450 +f 447//450 449//450 455//450 +f 449//450 451//450 455//450 +f 451//450 453//450 455//450 +o Cylinder +v 2.021592 0.003623 1.016610 +v 2.021592 2.003623 1.016610 +v 2.216682 0.003623 1.035825 +v 2.216682 2.003623 1.035825 +v 2.404276 0.003623 1.092731 +v 2.404276 2.003623 1.092731 +v 2.577162 0.003623 1.185141 +v 2.577162 2.003623 1.185141 +v 2.728699 0.003623 1.309503 +v 2.728699 2.003623 1.309503 +v 2.853062 0.003623 1.461040 +v 2.853062 2.003623 1.461040 +v 2.945472 0.003623 1.633927 +v 2.945472 2.003623 1.633927 +v 3.002378 0.003623 1.821520 +v 3.002378 2.003623 1.821520 +v 3.021592 0.003623 2.016610 +v 3.021592 2.003623 2.016610 +v 3.002378 0.003623 2.211700 +v 3.002378 2.003623 2.211700 +v 2.945472 0.003623 2.399293 +v 2.945472 2.003623 2.399293 +v 2.853062 0.003623 2.572180 +v 2.853062 2.003623 2.572180 +v 2.728699 0.003623 2.723717 +v 2.728699 2.003623 2.723717 +v 2.577162 0.003623 2.848080 +v 2.577162 2.003623 2.848080 +v 2.404275 0.003623 2.940490 +v 2.404275 2.003623 2.940490 +v 2.216682 0.003623 2.997396 +v 2.216682 2.003623 2.997396 +v 2.021592 0.003623 3.016610 +v 2.021592 2.003623 3.016610 +v 1.826501 0.003623 2.997395 +v 1.826501 2.003623 2.997395 +v 1.638908 0.003623 2.940490 +v 1.638908 2.003623 2.940490 +v 1.466021 0.003623 2.848079 +v 1.466021 2.003623 2.848079 +v 1.314485 0.003623 2.723716 +v 1.314485 2.003623 2.723716 +v 1.190122 0.003623 2.572180 +v 1.190122 2.003623 2.572180 +v 1.097712 0.003623 2.399293 +v 1.097712 2.003623 2.399293 +v 1.040807 0.003623 2.211699 +v 1.040807 2.003623 2.211699 +v 1.021592 0.003623 2.016609 +v 1.021592 2.003623 2.016609 +v 1.040807 0.003623 1.821519 +v 1.040807 2.003623 1.821519 +v 1.097713 0.003623 1.633926 +v 1.097713 2.003623 1.633926 +v 1.190123 0.003623 1.461039 +v 1.190123 2.003623 1.461039 +v 1.314486 0.003623 1.309502 +v 1.314486 2.003623 1.309502 +v 1.466023 0.003623 1.185140 +v 1.466023 2.003623 1.185140 +v 1.638910 0.003623 1.092730 +v 1.638910 2.003623 1.092730 +v 1.826503 0.003623 1.035825 +v 1.826503 2.003623 1.035825 +s off +f 457//484 458//484 460//484 +f 459//453 460//453 462//453 +f 461//454 462//454 464//454 +f 463//455 464//455 466//455 +f 465//456 466//456 468//456 +f 467//457 468//457 470//457 +f 469//458 470//458 472//458 +f 471//459 472//459 474//459 +f 473//460 474//460 476//460 +f 475//461 476//461 478//461 +f 477//462 478//462 480//462 +f 479//463 480//463 482//463 +f 481//464 482//464 484//464 +f 483//465 484//465 486//465 +f 485//466 486//466 488//466 +f 487//467 488//467 490//467 +f 489//468 490//468 491//468 +f 491//469 492//469 493//469 +f 493//470 494//470 495//470 +f 495//471 496//471 497//471 +f 497//472 498//472 499//472 +f 499//473 500//473 501//473 +f 501//474 502//474 503//474 +f 503//475 504//475 505//475 +f 505//476 506//476 507//476 +f 507//477 508//477 509//477 +f 509//478 510//478 511//478 +f 511//494 512//494 513//494 +f 513//489 514//489 515//489 +f 515//490 516//490 517//490 +f 460//451 458//451 462//451 +f 519//482 520//482 457//482 +f 517//483 518//483 519//483 +f 457//450 459//450 519//450 +f 459//484 457//484 460//484 +f 461//453 459//453 462//453 +f 463//454 461//454 464//454 +f 465//455 463//455 466//455 +f 467//456 465//456 468//456 +f 469//457 467//457 470//457 +f 471//458 469//458 472//458 +f 473//459 471//459 474//459 +f 475//460 473//460 476//460 +f 477//461 475//461 478//461 +f 479//462 477//462 480//462 +f 481//463 479//463 482//463 +f 483//464 481//464 484//464 +f 485//465 483//465 486//465 +f 487//466 485//466 488//466 +f 489//467 487//467 490//467 +f 490//468 492//468 491//468 +f 492//469 494//469 493//469 +f 494//470 496//470 495//470 +f 496//471 498//471 497//471 +f 498//472 500//472 499//472 +f 500//473 502//473 501//473 +f 502//474 504//474 503//474 +f 504//475 506//475 505//475 +f 506//476 508//476 507//476 +f 508//477 510//477 509//477 +f 510//478 512//478 511//478 +f 512//494 514//494 513//494 +f 514//489 516//489 515//489 +f 516//490 518//490 517//490 +f 458//451 520//451 462//451 +f 520//451 518//451 462//451 +f 518//451 516//451 462//451 +f 516//451 514//451 462//451 +f 514//451 512//451 462//451 +f 512//451 510//451 462//451 +f 510//451 508//451 462//451 +f 508//451 506//451 462//451 +f 506//451 504//451 462//451 +f 504//451 502//451 462//451 +f 502//451 500//451 462//451 +f 500//451 498//451 462//451 +f 498//451 496//451 462//451 +f 496//451 494//451 462//451 +f 494//451 492//451 462//451 +f 492//451 490//451 462//451 +f 490//451 488//451 462//451 +f 488//451 486//451 462//451 +f 486//451 484//451 462//451 +f 484//451 482//451 462//451 +f 482//451 480//451 462//451 +f 480//451 478//451 462//451 +f 478//451 476//451 462//451 +f 476//451 474//451 462//451 +f 474//451 472//451 462//451 +f 472//451 470//451 462//451 +f 470//451 468//451 462//451 +f 468//451 466//451 462//451 +f 466//451 464//451 462//451 +f 520//482 458//482 457//482 +f 518//483 520//483 519//483 +f 459//450 461//450 519//450 +f 461//450 463//450 519//450 +f 463//450 465//450 519//450 +f 465//450 467//450 519//450 +f 467//450 469//450 519//450 +f 469//450 471//450 519//450 +f 471//450 473//450 519//450 +f 473//450 475//450 519//450 +f 475//450 477//450 519//450 +f 477//450 479//450 519//450 +f 479//450 481//450 519//450 +f 481//450 483//450 519//450 +f 483//450 485//450 519//450 +f 485//450 487//450 519//450 +f 487//450 489//450 519//450 +f 489//450 491//450 519//450 +f 491//450 493//450 519//450 +f 493//450 495//450 519//450 +f 495//450 497//450 519//450 +f 497//450 499//450 519//450 +f 499//450 501//450 519//450 +f 501//450 503//450 519//450 +f 503//450 505//450 519//450 +f 505//450 507//450 519//450 +f 507//450 509//450 519//450 +f 509//450 511//450 519//450 +f 511//450 513//450 519//450 +f 513//450 515//450 519//450 +f 515//450 517//450 519//450 diff --git a/examples/datavisualization/customitems/refinery.obj b/examples/datavisualization/customitems/refinery.obj new file mode 100644 index 00000000..7939a0f3 --- /dev/null +++ b/examples/datavisualization/customitems/refinery.obj @@ -0,0 +1,30971 @@ +# Blender v2.66 (sub 0) OBJ File: 'factory.blend' +# www.blender.org +o dieshar1 +v -1.505581 1.636078 -0.912755 +v -1.512975 1.623272 -0.912755 +v -1.498187 1.623272 -0.912755 +v -1.505581 1.636078 -0.630708 +v -1.512975 1.623272 -0.630708 +v -1.498187 1.623272 -0.630708 +v -1.499574 1.306647 -0.640558 +v -1.512380 1.306647 -0.647952 +v -1.512380 1.306647 -0.633165 +v -1.499574 1.622775 -0.640558 +v -1.512380 1.622775 -0.647952 +v -1.512380 1.622775 -0.633165 +v -1.505581 1.464048 -0.896511 +v -1.512975 1.451242 -0.896511 +v -1.498187 1.451242 -0.896511 +v -1.505581 1.464048 -0.648053 +v -1.512975 1.451242 -0.648053 +v -1.498187 1.451242 -0.648053 +v -1.499574 1.306647 -0.903833 +v -1.512380 1.306647 -0.911227 +v -1.512380 1.306647 -0.896440 +v -1.499574 1.622775 -0.903833 +v -1.512380 1.622775 -0.911227 +v -1.512380 1.622775 -0.896440 +v 1.624978 0.471789 0.257865 +v 1.612171 0.471769 0.244677 +v 1.612171 0.481140 0.258521 +v 1.624978 1.616473 -0.584410 +v 1.612171 1.607153 -0.584348 +v 1.612171 1.629403 -0.584352 +v 1.625027 1.621906 -0.631470 +v 1.612221 1.613658 -0.631460 +v 1.612221 1.633349 -0.631461 +v 1.618534 0.094580 0.244752 +v 1.611140 0.094580 0.257559 +v 1.625927 0.094580 0.257559 +v 1.618534 0.471792 0.244753 +v 1.611140 0.471792 0.257559 +v 1.625927 0.471793 0.257559 +v 1.617995 0.094580 0.244752 +v 1.610601 0.094580 0.257559 +v 1.625388 0.094580 0.257559 +v 1.617995 0.471792 0.244753 +v 1.610601 0.471792 0.257559 +v 1.625388 0.471792 0.257559 +v 1.624978 0.285277 0.245446 +v 1.612171 0.272452 0.245079 +v 1.612171 0.294629 0.246102 +v 1.624978 1.451203 -0.630738 +v 1.612171 1.441882 -0.630677 +v 1.612171 1.464133 -0.630681 +v 1.618534 0.488793 -0.072555 +v 1.611140 0.472749 -0.059749 +v 1.625927 0.472749 -0.059749 +v 1.618534 0.684995 -0.072555 +v 1.611140 0.668557 -0.059749 +v 1.625927 0.668557 -0.059749 +v 1.617995 0.488793 -0.072555 +v 1.610601 0.472749 -0.059749 +v 1.625388 0.472749 -0.059749 +v 1.617995 0.684995 -0.072555 +v 1.610601 0.668557 -0.059749 +v 1.625388 0.668557 -0.059749 +v 1.618534 0.712317 -0.072555 +v 1.611140 0.696272 -0.059749 +v 1.625927 0.696272 -0.059749 +v 1.618534 0.897755 -0.072555 +v 1.611140 0.881316 -0.059749 +v 1.625927 0.881316 -0.059749 +v 1.617995 0.712317 -0.072555 +v 1.610601 0.696272 -0.059749 +v 1.625388 0.696272 -0.059749 +v 1.617995 0.897755 -0.072555 +v 1.610602 0.881317 -0.059749 +v 1.625388 0.881317 -0.059749 +v 1.618534 0.888679 -0.388140 +v 1.611140 0.872634 -0.375334 +v 1.625927 0.872634 -0.375334 +v 1.618534 1.114379 -0.388140 +v 1.611140 1.097940 -0.375334 +v 1.625927 1.097940 -0.375334 +v 1.617995 0.888679 -0.388140 +v 1.610602 0.872634 -0.375334 +v 1.625388 0.872634 -0.375334 +v 1.617995 1.114379 -0.388140 +v 1.610602 1.097940 -0.375334 +v 1.625388 1.097940 -0.375334 +v 1.618534 1.141700 -0.388140 +v 1.611140 1.125656 -0.375334 +v 1.625927 1.125656 -0.375334 +v 1.618534 1.327138 -0.388140 +v 1.611140 1.310700 -0.375334 +v 1.625927 1.310700 -0.375334 +v 1.617995 1.141700 -0.388140 +v 1.610602 1.125656 -0.375334 +v 1.625388 1.125656 -0.375334 +v 1.617995 1.327138 -0.388140 +v 1.610602 1.310700 -0.375334 +v 1.625388 1.310700 -0.375334 +v -1.207936 1.635017 -0.622513 +v -1.207936 1.622211 -0.615120 +v -1.207936 1.622211 -0.629907 +v 0.319157 1.635017 -0.622513 +v 0.319157 1.622211 -0.615120 +v 0.319157 1.622211 -0.629907 +v -0.439830 1.305587 -0.628520 +v -0.447224 1.305587 -0.615714 +v -0.432437 1.305587 -0.615714 +v -0.439830 1.621715 -0.628520 +v -0.447224 1.621715 -0.615714 +v -0.432437 1.621715 -0.615714 +v -1.191692 1.462988 -0.622513 +v -1.191692 1.450182 -0.615120 +v -1.191692 1.450182 -0.629907 +v -0.447325 1.462988 -0.622513 +v -0.447325 1.450182 -0.615120 +v -0.447325 1.450182 -0.629907 +v -1.199015 1.305587 -0.628520 +v -1.206408 1.305587 -0.615714 +v -1.191621 1.305587 -0.615714 +v -1.199014 1.621715 -0.628520 +v -1.206408 1.621715 -0.615714 +v -1.191621 1.621715 -0.615714 +v -0.432054 1.462988 -0.622513 +v 0.304038 1.450182 -0.615120 +v 0.304038 1.462988 -0.622513 +v -0.432054 1.450182 -0.615120 +v 0.304038 1.450182 -0.629907 +v -0.432054 1.450182 -0.629907 +v 0.311711 1.305587 -0.628520 +v 0.304318 1.305587 -0.615714 +v 0.319104 1.305587 -0.615714 +v 0.311711 1.621715 -0.628520 +v 0.304318 1.621715 -0.615714 +v 0.319104 1.621715 -0.615714 +v 0.680351 1.635017 -0.622513 +v 0.680351 1.622211 -0.615120 +v 0.680351 1.622211 -0.629907 +v 1.234954 1.635017 -0.622513 +v 1.234954 1.622211 -0.615120 +v 1.234954 1.622211 -0.629907 +v 1.225104 1.305587 -0.628520 +v 1.217710 1.305587 -0.615714 +v 1.232497 1.305587 -0.615714 +v 1.225104 1.621715 -0.628520 +v 1.217710 1.621715 -0.615714 +v 1.232497 1.621715 -0.615714 +v 0.696595 1.462988 -0.622513 +v 0.696595 1.450182 -0.615120 +v 0.696595 1.450182 -0.629907 +v 1.217609 1.462988 -0.622513 +v 1.217609 1.450182 -0.615120 +v 1.217609 1.450182 -0.629907 +v 0.689273 1.305587 -0.628520 +v 0.681880 1.305587 -0.615714 +v 0.696667 1.305587 -0.615714 +v 0.689273 1.621715 -0.628520 +v 0.681880 1.621715 -0.615714 +v 0.696667 1.621715 -0.615714 +v -1.144100 1.466867 -0.919406 +v -1.156906 1.466867 -0.926800 +v -1.156906 1.466867 -0.912013 +v -1.144100 1.622775 -0.919406 +v -1.156906 1.622775 -0.926800 +v -1.156906 1.622775 -0.912013 +v 1.607340 1.626949 -0.919395 +v 1.607340 1.635486 -0.919395 +v 1.607340 1.622680 -0.926789 +v 1.607340 1.622680 -0.912001 +v -1.478091 1.635486 -0.919395 +v -1.478091 1.622680 -0.926789 +v -1.478091 1.622680 -0.912002 +v -1.478091 1.626949 -0.919395 +v 1.607340 1.458304 -0.919395 +v 1.607340 1.466841 -0.919395 +v 1.607340 1.454035 -0.926789 +v 1.607340 1.454035 -0.912001 +v -1.478091 1.466841 -0.919395 +v -1.478091 1.454035 -0.926789 +v -1.478091 1.454035 -0.912002 +v -1.478091 1.458304 -0.919395 +v 0.395227 1.305337 -0.919406 +v 0.382421 1.305337 -0.926800 +v 0.382421 1.305337 -0.912013 +v 0.395227 1.454020 -0.919406 +v 0.382421 1.454020 -0.926800 +v 0.382421 1.454020 -0.912013 +v -1.144100 1.305337 -0.919406 +v -1.156906 1.305337 -0.926800 +v -1.156906 1.305337 -0.912013 +v -1.144100 1.454020 -0.919406 +v -1.156906 1.454020 -0.926800 +v -1.156906 1.454020 -0.912013 +v 1.233502 1.305337 -0.919406 +v 1.220696 1.305337 -0.926800 +v 1.220696 1.305337 -0.912013 +v 1.233502 1.454020 -0.919406 +v 1.220696 1.454020 -0.926800 +v 1.220696 1.454020 -0.912013 +v -0.384851 1.305337 -0.919406 +v -0.397658 1.305337 -0.926800 +v -0.397658 1.305337 -0.912013 +v -0.384851 1.454020 -0.919406 +v -0.397658 1.454020 -0.926800 +v -0.397658 1.454020 -0.912013 +v 1.233502 1.466867 -0.919406 +v 1.220695 1.466867 -0.926800 +v 1.220696 1.466867 -0.912013 +v 1.233501 1.622775 -0.919406 +v 1.220695 1.622775 -0.926800 +v 1.220695 1.622775 -0.912013 +v 0.395227 1.466867 -0.919406 +v 0.382421 1.466867 -0.926800 +v 0.382421 1.466867 -0.912013 +v 0.395227 1.622775 -0.919406 +v 0.382422 1.622775 -0.926800 +v 0.382422 1.622775 -0.912013 +v -0.384851 1.466867 -0.919406 +v -0.397658 1.466867 -0.926800 +v -0.397658 1.466867 -0.912013 +v -0.384851 1.622775 -0.919406 +v -0.397657 1.622775 -0.926800 +v -0.397657 1.622775 -0.912013 +v 1.617759 1.635017 -0.621946 +v 1.625152 1.622211 -0.621946 +v 1.610365 1.622211 -0.621946 +v 1.617759 1.635017 -0.910624 +v 1.625152 1.622211 -0.910624 +v 1.610365 1.622211 -0.910624 +v 1.611752 1.305587 -0.630176 +v 1.624558 1.305587 -0.622783 +v 1.624558 1.305587 -0.637570 +v 1.611752 1.621715 -0.630176 +v 1.624558 1.621715 -0.622783 +v 1.624558 1.621715 -0.637570 +v 1.617759 1.462988 -0.637953 +v 1.625152 1.450182 -0.895504 +v 1.617759 1.462988 -0.895504 +v 1.625152 1.450182 -0.637953 +v 1.610366 1.450182 -0.895504 +v 1.610365 1.450182 -0.637953 +v 1.611752 1.305587 -0.903177 +v 1.624558 1.305587 -0.895784 +v 1.624558 1.305587 -0.910571 +v 1.611752 1.621715 -0.903178 +v 1.624558 1.621715 -0.895784 +v 1.624558 1.621715 -0.910571 +vn -0.866023 0.500004 0.000000 +vn -0.866025 0.500001 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.866023 0.500004 0.000000 +vn 0.866025 0.500001 0.000000 +vn 0.500008 0.000000 -0.866021 +vn -1.000000 -0.000000 0.000000 +vn 0.500005 0.000000 0.866022 +vn 0.866028 0.499995 0.000001 +vn 0.500011 0.000000 -0.866019 +vn 0.393087 -0.544953 -0.740614 +vn 0.639848 -0.453187 -0.620658 +vn 0.515158 0.507173 0.690932 +vn 0.428358 0.535535 0.727813 +vn 0.584526 -0.803832 -0.110378 +vn 0.538941 -0.836850 -0.096042 +vn -0.999999 -0.000000 -0.001048 +vn 0.708304 0.701165 0.081686 +vn 0.664990 0.744189 0.063023 +vn -0.866025 0.000000 -0.500001 +vn 0.000000 -0.000000 1.000000 +vn 0.866032 0.000000 -0.499989 +vn 0.000008 -0.000000 1.000000 +vn 0.866030 0.000000 -0.499992 +vn 0.397686 -0.551213 -0.733492 +vn 0.528932 -0.508709 -0.679299 +vn 0.520269 0.512273 0.683299 +vn 0.432486 0.541673 0.720796 +vn -0.866023 0.000000 -0.500004 +vn -0.866023 -0.000000 -0.500005 +vn 0.866037 -0.000000 -0.499980 +vn -0.866023 0.000001 -0.500005 +vn -0.866022 0.000001 -0.500005 +vn 0.866028 -0.000001 -0.499995 +vn -0.866023 0.000001 -0.500003 +vn 0.866035 -0.000001 -0.499983 +vn 0.866036 -0.000001 -0.499981 +vn -0.866024 -0.000000 -0.500003 +vn 0.866031 0.000000 -0.499991 +vn 0.866030 -0.000000 -0.499991 +vn 0.866038 -0.000000 -0.499979 +vn 0.866038 -0.000000 -0.499978 +vn 0.866037 -0.000000 -0.499979 +vn -0.000000 0.500001 0.866025 +vn 0.000000 0.500004 0.866023 +vn 0.000000 0.499998 -0.866026 +vn -0.866027 0.000000 -0.499997 +vn 0.866024 0.000000 -0.500003 +vn 0.000000 0.499998 0.866026 +vn 0.000000 0.500001 -0.866025 +vn 0.000000 0.499995 -0.866028 +vn -0.866026 -0.000000 -0.499998 +vn 0.866027 0.000000 -0.499997 +vn 0.866023 -0.000000 -0.500004 +vn -0.866023 0.000001 -0.500004 +vn -0.866037 -0.000000 -0.499980 +vn 0.866040 0.000000 -0.499974 +vn 0.866026 -0.000001 -0.499998 +vn -0.000000 0.499998 0.866027 +vn 0.000000 0.499998 -0.866027 +vn -0.866030 0.000000 -0.499992 +vn 0.500008 0.000000 0.866021 +vn 1.000000 0.000000 -0.000000 +vn -0.000000 -1.000000 0.000008 +vn -0.000000 0.500005 0.866023 +vn 0.499994 0.000000 -0.866029 +vn 0.499994 0.000000 0.866029 +vn 0.500004 0.000000 -0.866023 +vn 0.499998 0.000000 0.866026 +vn 0.499997 0.000000 -0.866027 +vn 0.499991 0.000000 0.866030 +vn 0.500004 0.000001 -0.866023 +vn -1.000000 -0.000002 0.000016 +vn 0.499998 0.000001 0.866026 +vn 0.499994 -0.000002 -0.866029 +vn -1.000000 0.000003 0.000000 +vn 0.500005 -0.000001 0.866022 +vn 0.499997 -0.000002 -0.866027 +vn 0.500005 -0.000002 0.866022 +vn 0.866023 0.500004 0.000001 +vn 0.866025 0.500001 0.000001 +vn -0.866030 0.499992 -0.000001 +vn -0.866032 0.499989 -0.000001 +vn -0.499994 0.000000 0.866029 +vn -0.499997 0.000000 -0.866027 +vn -0.866037 0.499980 -0.000001 +vn -0.866030 0.499992 0.000000 +vn -0.500004 0.000000 0.866023 +vn -0.499998 0.000000 0.866026 +vn -0.499995 0.000000 -0.866028 +vn -0.500001 -0.000000 -0.866025 +s off +f 1//1 5//1 4//1 +f 1//2 2//2 5//2 +f 2//3 6//3 5//3 +f 2//3 3//3 6//3 +f 3//4 4//4 6//4 +f 3//5 1//5 4//5 +f 7//6 11//6 10//6 +f 7//6 8//6 11//6 +f 8//7 12//7 11//7 +f 8//7 9//7 12//7 +f 9//8 10//8 12//8 +f 9//8 7//8 10//8 +f 13//2 17//2 16//2 +f 13//1 14//1 17//1 +f 14//3 18//3 17//3 +f 14//3 15//3 18//3 +f 15//9 16//9 18//9 +f 15//4 13//4 16//4 +f 19//10 23//10 22//10 +f 19//10 20//10 23//10 +f 20//7 24//7 23//7 +f 20//7 21//7 24//7 +f 21//8 22//8 24//8 +f 21//8 19//8 22//8 +f 25//11 29//11 28//11 +f 25//12 26//12 29//12 +f 26//7 30//7 29//7 +f 26//7 27//7 30//7 +f 27//13 28//13 30//13 +f 27//14 25//14 28//14 +f 28//15 29//15 32//15 +f 32//16 31//16 28//16 +f 29//17 30//17 33//17 +f 33//17 32//17 29//17 +f 30//18 28//18 31//18 +f 31//19 33//19 30//19 +f 34//20 38//20 37//20 +f 34//20 35//20 38//20 +f 35//21 39//21 38//21 +f 35//21 36//21 39//21 +f 36//22 37//22 39//22 +f 36//22 34//22 37//22 +f 40//20 44//20 43//20 +f 40//20 41//20 44//20 +f 41//23 45//23 44//23 +f 41//21 42//21 45//21 +f 42//24 43//24 45//24 +f 42//22 40//22 43//22 +f 46//25 50//25 49//25 +f 46//26 47//26 50//26 +f 47//7 51//7 50//7 +f 47//7 48//7 51//7 +f 48//27 49//27 51//27 +f 48//28 46//28 49//28 +f 52//29 56//29 55//29 +f 52//29 53//29 56//29 +f 53//21 57//21 56//21 +f 53//21 54//21 57//21 +f 54//24 55//24 57//24 +f 54//24 52//24 55//24 +f 58//30 62//30 61//30 +f 58//30 59//30 62//30 +f 59//21 63//21 62//21 +f 59//21 60//21 63//21 +f 60//31 61//31 63//31 +f 60//31 58//31 61//31 +f 64//32 68//32 67//32 +f 64//33 65//33 68//33 +f 65//21 69//21 68//21 +f 65//21 66//21 69//21 +f 66//34 67//34 69//34 +f 66//34 64//34 67//34 +f 70//32 74//32 73//32 +f 70//35 71//35 74//35 +f 71//21 75//21 74//21 +f 71//21 72//21 75//21 +f 72//36 73//36 75//36 +f 72//37 70//37 73//37 +f 76//38 80//38 79//38 +f 76//29 77//29 80//29 +f 77//21 81//21 80//21 +f 77//21 78//21 81//21 +f 78//39 79//39 81//39 +f 78//40 76//40 79//40 +f 82//38 86//38 85//38 +f 82//38 83//38 86//38 +f 83//21 87//21 86//21 +f 83//21 84//21 87//21 +f 84//41 85//41 87//41 +f 84//42 82//42 85//42 +f 88//29 92//29 91//29 +f 88//29 89//29 92//29 +f 89//21 93//21 92//21 +f 89//21 90//21 93//21 +f 90//24 91//24 93//24 +f 90//40 88//40 91//40 +f 94//38 98//38 97//38 +f 94//29 95//29 98//29 +f 95//21 99//21 98//21 +f 95//21 96//21 99//21 +f 96//42 97//42 99//42 +f 96//43 94//43 97//43 +f 100//44 104//44 103//44 +f 100//45 101//45 104//45 +f 101//3 105//3 104//3 +f 101//3 102//3 105//3 +f 102//46 103//46 105//46 +f 102//46 100//46 103//46 +f 106//47 110//47 109//47 +f 106//47 107//47 110//47 +f 107//21 111//21 110//21 +f 107//21 108//21 111//21 +f 108//48 109//48 111//48 +f 108//48 106//48 109//48 +f 112//49 116//49 115//49 +f 112//44 113//44 116//44 +f 113//3 117//3 116//3 +f 113//3 114//3 117//3 +f 114//50 115//50 117//50 +f 114//51 112//51 115//51 +f 118//38 122//38 121//38 +f 118//52 119//52 122//52 +f 119//21 123//21 122//21 +f 119//21 120//21 123//21 +f 120//53 121//53 123//53 +f 120//54 118//54 121//54 +f 124//44 125//44 126//44 +f 124//49 127//49 125//49 +f 127//3 128//3 125//3 +f 127//3 129//3 128//3 +f 129//46 126//46 128//46 +f 129//46 124//46 126//46 +f 130//55 134//55 133//55 +f 130//56 131//56 134//56 +f 131//21 135//21 134//21 +f 131//21 132//21 135//21 +f 132//57 133//57 135//57 +f 132//58 130//58 133//58 +f 136//44 140//44 139//44 +f 136//59 137//59 140//59 +f 137//3 141//3 140//3 +f 137//3 138//3 141//3 +f 138//46 139//46 141//46 +f 138//60 136//60 139//60 +f 142//29 146//29 145//29 +f 142//29 143//29 146//29 +f 143//21 147//21 146//21 +f 143//21 144//21 147//21 +f 144//54 145//54 147//54 +f 144//54 142//54 145//54 +f 148//59 152//59 151//59 +f 148//44 149//44 152//44 +f 149//3 153//3 152//3 +f 149//3 150//3 153//3 +f 150//51 151//51 153//51 +f 150//50 148//50 151//50 +f 154//61 158//61 157//61 +f 154//61 155//61 158//61 +f 155//21 159//21 158//21 +f 155//21 156//21 159//21 +f 156//54 157//54 159//54 +f 156//54 154//54 157//54 +f 160//10 164//10 163//10 +f 160//6 161//6 164//6 +f 161//7 165//7 164//7 +f 161//7 162//7 165//7 +f 162//8 163//8 165//8 +f 162//62 160//62 163//62 +f 166//63 168//63 167//63 +f 166//63 169//63 168//63 +f 166//63 167//63 169//63 +f 167//50 171//50 170//50 +f 167//50 168//50 171//50 +f 168//3 172//3 171//3 +f 168//3 169//3 172//3 +f 169//44 170//44 172//44 +f 169//44 167//44 170//44 +f 173//7 170//7 171//7 +f 173//7 171//7 172//7 +f 173//7 172//7 170//7 +f 174//63 176//63 175//63 +f 174//63 177//63 176//63 +f 174//63 175//63 177//63 +f 175//50 179//50 178//50 +f 175//50 176//50 179//50 +f 176//3 180//3 179//3 +f 176//64 177//64 180//64 +f 177//44 178//44 180//44 +f 177//65 175//65 178//65 +f 181//7 178//7 179//7 +f 181//7 179//7 180//7 +f 181//7 180//7 178//7 +f 182//66 186//66 185//66 +f 182//66 183//66 186//66 +f 183//7 187//7 186//7 +f 183//7 184//7 187//7 +f 184//67 185//67 187//67 +f 184//67 182//67 185//67 +f 188//6 192//6 191//6 +f 188//6 189//6 192//6 +f 189//7 193//7 192//7 +f 189//7 190//7 193//7 +f 190//8 191//8 193//8 +f 190//62 188//62 191//62 +f 194//68 198//68 197//68 +f 194//68 195//68 198//68 +f 195//7 199//7 198//7 +f 195//7 196//7 199//7 +f 196//69 197//69 199//69 +f 196//69 194//69 197//69 +f 200//70 204//70 203//70 +f 200//70 201//70 204//70 +f 201//7 205//7 204//7 +f 201//7 202//7 205//7 +f 202//71 203//71 205//71 +f 202//71 200//71 203//71 +f 206//72 210//72 209//72 +f 206//70 207//70 210//70 +f 207//7 211//7 210//7 +f 207//73 208//73 211//73 +f 208//74 209//74 211//74 +f 208//74 206//74 209//74 +f 212//6 216//6 215//6 +f 212//75 213//75 216//75 +f 213//76 217//76 216//76 +f 213//76 214//76 217//76 +f 214//77 215//77 217//77 +f 214//67 212//67 215//67 +f 218//10 222//10 221//10 +f 218//78 219//78 222//78 +f 219//76 223//76 222//76 +f 219//76 220//76 223//76 +f 220//79 221//79 223//79 +f 220//71 218//71 221//71 +f 224//80 228//80 227//80 +f 224//81 225//81 228//81 +f 225//3 229//3 228//3 +f 225//3 226//3 229//3 +f 226//82 227//82 229//82 +f 226//83 224//83 227//83 +f 230//84 234//84 233//84 +f 230//84 231//84 234//84 +f 231//63 235//63 234//63 +f 231//63 232//63 235//63 +f 232//85 233//85 235//85 +f 232//85 230//85 233//85 +f 236//4 237//4 238//4 +f 236//4 239//4 237//4 +f 239//3 240//3 237//3 +f 239//3 241//3 240//3 +f 241//86 238//86 240//86 +f 241//87 236//87 238//87 +f 242//88 246//88 245//88 +f 242//89 243//89 246//89 +f 243//63 247//63 246//63 +f 243//63 244//63 247//63 +f 244//90 245//90 247//90 +f 244//91 242//91 245//91 +o diescell +v -0.800343 0.946822 0.910336 +v -0.800000 0.946749 2.112060 +v -0.856905 0.941346 0.824050 +v -0.856351 0.941345 2.198073 +v -0.043975 1.020890 2.198073 +v -0.100784 1.015439 2.112141 +v -0.044529 1.020891 0.824050 +v -0.100821 1.015554 0.910441 +v -0.859547 0.975688 2.198073 +v -0.860101 0.975690 0.824050 +v -0.047171 1.054100 2.198073 +v -0.047725 1.054102 0.824051 +vt 0.932530 0.188397 +vt 0.932117 2.812201 +vt 1.002439 0.000005 +vt 1.001760 2.999998 +vt -0.002428 2.999998 +vt 0.067782 2.812376 +vt -0.001748 0.000004 +vt 0.067814 0.188627 +vt 1.001614 2.999996 +vt 1.002294 0.000002 +vt -0.002439 2.999995 +vt -0.001760 0.000002 +vn 0.096499 -0.995333 -0.000088 +vn 0.095415 -0.995438 -0.000040 +vn 0.097450 -0.995240 0.001306 +vn 0.097767 -0.995208 -0.001507 +vn 0.095568 -0.995423 -0.000040 +vn 0.094228 -0.995551 -0.000099 +vn 0.097450 -0.995238 0.002020 +vn 0.097785 -0.995207 -0.000939 +vn -0.995698 -0.092661 0.000402 +vn -0.995697 -0.092663 0.000402 +vn 0.000001 -0.000007 1.000000 +vn 0.995401 0.095793 -0.000402 +vn 0.995401 0.095794 -0.000402 +vn 0.000000 0.000000 -1.000000 +vn -0.000001 0.000014 -1.000000 +vn -0.096075 0.995374 0.000040 +s off +f 248/1/92 249/2/92 250/3/92 +f 251/4/93 250/3/93 249/2/93 +f 252/5/94 251/4/94 249/2/94 +f 252/5/95 249/2/95 253/6/95 +f 254/7/96 252/5/96 253/6/96 +f 254/7/97 253/6/97 255/8/97 +f 250/3/98 254/7/98 255/8/98 +f 248/1/99 250/3/99 255/8/99 +f 250/3/100 251/4/100 256/9/100 +f 256/9/101 257/10/101 250/3/101 +f 251/4/21 252/5/21 258/11/21 +f 258/11/102 256/9/102 251/4/102 +f 252/5/103 254/7/103 259/12/103 +f 259/12/104 258/11/104 252/5/104 +f 254/7/105 250/3/105 257/10/105 +f 257/10/106 259/12/106 254/7/106 +f 257/10/107 256/9/107 258/11/107 +f 257/10/107 258/11/107 259/12/107 +o diesknca +v 0.032569 1.799547 -3.404310 +v 0.025655 1.799547 -3.400318 +v 0.018741 1.799547 -3.396326 +v 0.018741 1.799546 -3.388342 +v 0.018741 1.799545 -3.380358 +v 0.025655 1.799545 -3.376366 +v 0.032569 1.799544 -3.372374 +v 0.039484 1.799545 -3.376366 +v 0.046398 1.799545 -3.380358 +v 0.046398 1.799546 -3.388342 +v 0.046398 1.799547 -3.396326 +v 0.039484 1.799547 -3.400318 +v 0.032569 2.011710 -3.404286 +v 0.025654 2.011629 -3.400295 +v 0.018741 2.011547 -3.396304 +v 0.018741 2.011384 -3.388322 +v 0.018740 2.011220 -3.380340 +v 0.025654 2.011139 -3.376349 +v 0.032569 2.011057 -3.372358 +v 0.039483 2.011139 -3.376349 +v 0.046397 2.011221 -3.380340 +v 0.046397 2.011384 -3.388322 +v 0.046397 2.011547 -3.396304 +v 0.039483 2.011629 -3.400295 +v 0.032569 2.035493 -3.396313 +v 0.018741 2.031813 -3.389229 +v 0.018740 2.024452 -3.375059 +v 0.032569 2.020771 -3.367974 +v 0.046397 2.024452 -3.375059 +v 0.046397 2.031813 -3.389229 +v 0.032569 2.050018 -3.380495 +v 0.018740 2.043779 -3.375513 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.043779 -3.375513 +v 0.032569 2.059114 -3.357977 +v 0.018740 2.051516 -3.355524 +v 0.018740 2.036320 -3.350618 +v 0.032569 2.028723 -3.348165 +v 0.046397 2.036320 -3.350618 +v 0.046397 2.051516 -3.355524 +v 0.032569 2.060771 -3.330759 +v 0.018740 2.052788 -3.330760 +v 0.018740 2.036820 -3.330763 +v 0.032569 2.028836 -3.330764 +v 0.046397 2.036820 -3.330763 +v 0.046397 2.052788 -3.330760 +v 0.032569 2.064860 -3.330672 +v 0.015195 2.054830 -3.330672 +v 0.015195 2.034768 -3.330674 +v 0.032569 2.024737 -3.330674 +v 0.049942 2.034768 -3.330674 +v 0.049942 2.054830 -3.330673 +v 0.032569 2.064887 -3.308321 +v 0.015195 2.054856 -3.308321 +v 0.015195 2.034795 -3.308320 +v 0.032569 2.024764 -3.308320 +v 0.049942 2.034795 -3.308320 +v 0.049942 2.054856 -3.308321 +v 0.032569 2.060795 -3.308268 +v 0.018740 2.052811 -3.308267 +v 0.018740 2.036843 -3.308267 +v 0.032569 2.028859 -3.308267 +v 0.046397 2.036843 -3.308267 +v 0.046397 2.052811 -3.308268 +v 0.032569 2.060795 -3.268561 +v 0.018740 2.052811 -3.268562 +v 0.018740 2.036843 -3.268565 +v 0.032569 2.028859 -3.268566 +v 0.046397 2.036843 -3.268565 +v 0.046397 2.052811 -3.268562 +v 0.025654 2.011629 -3.400295 +v 0.025654 2.011629 -3.400295 +v 0.032569 2.035493 -3.396313 +v 0.018741 2.011547 -3.396304 +v 0.018741 2.031813 -3.389229 +v 0.018741 2.011547 -3.396304 +v 0.018741 2.011384 -3.388322 +v 0.018741 2.031813 -3.389229 +v 0.018741 2.011384 -3.388322 +v 0.018741 2.031813 -3.389229 +v 0.018741 2.011384 -3.388322 +v 0.018740 2.011220 -3.380340 +v 0.018740 2.011220 -3.380340 +v 0.025654 2.011139 -3.376349 +v 0.025654 2.011139 -3.376349 +v 0.018740 2.024452 -3.375059 +v 0.025654 2.011139 -3.376349 +v 0.032569 2.011057 -3.372358 +v 0.032569 2.020771 -3.367974 +v 0.032569 2.011057 -3.372358 +v 0.039483 2.011139 -3.376349 +v 0.032569 2.020771 -3.367974 +v 0.039483 2.011139 -3.376349 +v 0.032569 2.020771 -3.367974 +v 0.039483 2.011139 -3.376349 +v 0.046397 2.011221 -3.380340 +v 0.046397 2.011221 -3.380340 +v 0.046397 2.011384 -3.388322 +v 0.046397 2.011384 -3.388322 +v 0.046397 2.024452 -3.375059 +v 0.046397 2.011384 -3.388322 +v 0.046397 2.011547 -3.396304 +v 0.046397 2.031813 -3.389229 +v 0.046397 2.011547 -3.396304 +v 0.039483 2.011629 -3.400295 +v 0.046397 2.031813 -3.389229 +v 0.039483 2.011629 -3.400295 +v 0.032569 2.035493 -3.396313 +v 0.046397 2.031813 -3.389229 +v 0.039483 2.011629 -3.400295 +v 0.032569 2.011710 -3.404286 +v 0.032569 2.035493 -3.396313 +v 0.032569 2.035493 -3.396313 +v 0.032569 2.035493 -3.396313 +v 0.018741 2.031813 -3.389229 +v 0.032569 2.020771 -3.367974 +v 0.046397 2.024452 -3.375059 +v 0.046397 2.024452 -3.375059 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.024452 -3.375059 +v 0.046397 2.031813 -3.389229 +v 0.046397 2.043779 -3.375513 +v 0.046397 2.031813 -3.389229 +v 0.032569 2.050018 -3.380495 +v 0.046397 2.043779 -3.375513 +v 0.046397 2.031813 -3.389229 +v 0.032569 2.035493 -3.396313 +v 0.032569 2.050018 -3.380495 +v 0.032569 2.050018 -3.380495 +v 0.032569 2.050018 -3.380495 +v 0.018740 2.043779 -3.375513 +v 0.018740 2.051516 -3.355524 +v 0.018741 2.031813 -3.389229 +v 0.018740 2.043779 -3.375513 +v 0.018741 2.031813 -3.389229 +v 0.018740 2.024452 -3.375059 +v 0.018740 2.036320 -3.350618 +v 0.018740 2.024452 -3.375059 +v 0.018740 2.036320 -3.350618 +v 0.032569 2.020771 -3.367974 +v 0.032569 2.028723 -3.348165 +v 0.032569 2.020771 -3.367974 +v 0.032569 2.028723 -3.348165 +v 0.032569 2.020771 -3.367974 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.036320 -3.350618 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.043779 -3.375513 +v 0.046397 2.043779 -3.375513 +v 0.032569 2.059114 -3.357977 +v 0.046397 2.043779 -3.375513 +v 0.032569 2.050018 -3.380495 +v 0.032569 2.059114 -3.357977 +v 0.018740 2.043779 -3.375513 +v 0.018740 2.051516 -3.355524 +v 0.018740 2.043779 -3.375513 +v 0.018740 2.036320 -3.350618 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.036320 -3.350618 +v 0.046397 2.031301 -3.365549 +v 0.046397 2.051516 -3.355524 +v 0.046397 2.051516 -3.355524 +v 0.032569 2.059114 -3.357977 +v 0.032569 2.059114 -3.357977 +v 0.032569 2.059114 -3.357977 +v 0.018740 2.051516 -3.355524 +v 0.018740 2.052788 -3.330760 +v 0.018740 2.051516 -3.355524 +v 0.018740 2.036820 -3.330763 +v 0.018740 2.052788 -3.330760 +v 0.018740 2.036320 -3.350618 +v 0.018740 2.036820 -3.330763 +v 0.018740 2.036320 -3.350618 +v 0.032569 2.028723 -3.348165 +v 0.032569 2.028723 -3.348165 +v 0.032569 2.028723 -3.348165 +v 0.046397 2.036320 -3.350618 +v 0.046397 2.036320 -3.350618 +v 0.046397 2.052788 -3.330760 +v 0.046397 2.036820 -3.330763 +v 0.032569 2.059114 -3.357977 +v 0.032569 2.060771 -3.330759 +v 0.046397 2.052788 -3.330760 +v 0.032569 2.060771 -3.330759 +v 0.032569 2.060771 -3.330759 +v 0.018740 2.052788 -3.330760 +v 0.018740 2.036820 -3.330763 +v 0.018740 2.036820 -3.330763 +v 0.032569 2.028836 -3.330764 +v 0.032569 2.028836 -3.330764 +v 0.032569 2.028836 -3.330764 +v 0.046397 2.036820 -3.330763 +v 0.046397 2.036820 -3.330763 +v 0.046397 2.036820 -3.330763 +v 0.046397 2.052788 -3.330760 +v 0.046397 2.052788 -3.330760 +v 0.032569 2.064860 -3.330672 +v 0.046397 2.052788 -3.330760 +v 0.032569 2.060771 -3.330759 +v 0.032569 2.064860 -3.330672 +v 0.032569 2.064860 -3.330672 +v 0.032569 2.064860 -3.330672 +v 0.015195 2.054830 -3.330672 +v 0.015195 2.054830 -3.330672 +v 0.015195 2.054830 -3.330672 +v 0.015195 2.034768 -3.330674 +v 0.015195 2.034768 -3.330674 +v 0.015195 2.034768 -3.330674 +v 0.032569 2.024737 -3.330674 +v 0.032569 2.024737 -3.330674 +v 0.032569 2.024737 -3.330674 +v 0.049942 2.034768 -3.330674 +v 0.049942 2.034768 -3.330674 +v 0.049942 2.034768 -3.330674 +v 0.049942 2.054830 -3.330673 +v 0.049942 2.054830 -3.330673 +v 0.032569 2.064887 -3.308321 +v 0.049942 2.054830 -3.330673 +v 0.032569 2.064860 -3.330672 +v 0.032569 2.064887 -3.308321 +v 0.032569 2.064887 -3.308321 +v 0.032569 2.064887 -3.308321 +v 0.015195 2.054856 -3.308321 +v 0.015195 2.054856 -3.308321 +v 0.015195 2.054856 -3.308321 +v 0.015195 2.034795 -3.308320 +v 0.015195 2.034795 -3.308320 +v 0.015195 2.034795 -3.308320 +v 0.032569 2.024764 -3.308320 +v 0.032569 2.024764 -3.308320 +v 0.032569 2.024764 -3.308320 +v 0.049942 2.034795 -3.308320 +v 0.049942 2.034795 -3.308320 +v 0.049942 2.034795 -3.308320 +v 0.049942 2.054856 -3.308321 +v 0.049942 2.054856 -3.308321 +v 0.032569 2.060795 -3.308268 +v 0.049942 2.054856 -3.308321 +v 0.032569 2.060795 -3.308268 +v 0.032569 2.060795 -3.308268 +v 0.032569 2.060795 -3.308268 +v 0.018740 2.052811 -3.308267 +v 0.018740 2.052811 -3.308267 +v 0.018740 2.052811 -3.308267 +v 0.018740 2.036843 -3.308267 +v 0.018740 2.036843 -3.308267 +v 0.018740 2.036843 -3.308267 +v 0.032569 2.028859 -3.308267 +v 0.032569 2.028859 -3.308267 +v 0.032569 2.028859 -3.308267 +v 0.046397 2.036843 -3.308267 +v 0.046397 2.036843 -3.308267 +v 0.046397 2.036843 -3.308267 +v 0.046397 2.052811 -3.308268 +v 0.046397 2.052811 -3.308268 +v 0.032569 2.060795 -3.268561 +v 0.046397 2.052811 -3.308268 +v 0.032569 2.060795 -3.308268 +v 0.032569 2.060795 -3.268561 +v 0.015195 2.054830 -3.330672 +v 0.018740 2.052788 -3.330760 +v 0.018740 2.036820 -3.330763 +v 0.015195 2.054830 -3.330672 +v 0.018740 2.036820 -3.330763 +v 0.015195 2.034768 -3.330674 +v 0.018740 2.036843 -3.268565 +v 0.032569 2.060795 -3.268561 +v 0.018740 2.052811 -3.268562 +v 0.032569 2.060795 -3.268561 +v 0.018740 2.036843 -3.268565 +v 0.046397 2.052811 -3.268562 +v 0.046397 2.052811 -3.268562 +v 0.018740 2.036843 -3.268565 +v 0.032569 2.028859 -3.268566 +v 0.046397 2.036843 -3.268565 +v 0.046397 2.052811 -3.268562 +v 0.032569 2.028859 -3.268566 +vt 0.674737 0.500000 +vt 0.357790 0.521564 +vt 0.362449 0.500000 +vt 0.678579 0.514936 +vt 0.352891 0.544006 +vt 0.682512 0.530149 +vt 0.342335 0.546176 +vt 0.690645 0.530801 +vt 0.330727 0.548325 +vt 0.699117 0.531395 +vt 0.324519 0.524834 +vt 0.703471 0.515872 +vt 0.318042 0.500000 +vt 0.707898 0.500000 +vt 0.324519 0.475166 +vt 0.703471 0.484128 +vt 0.330727 0.451675 +vt 0.699117 0.468605 +vt 0.342335 0.453824 +vt 0.690645 0.469199 +vt 0.352891 0.455994 +vt 0.682512 0.469851 +vt 0.357790 0.478436 +vt 0.678579 0.485064 +vt 0.330685 0.518945 +vt 0.333623 0.500000 +vt 0.327574 0.538855 +vt 0.320777 0.541196 +vt 0.313115 0.543741 +vt 0.308918 0.522659 +vt 0.304453 0.500000 +vt 0.308918 0.477341 +vt 0.313115 0.456259 +vt 0.320777 0.458804 +vt 0.327574 0.461145 +vt 0.330685 0.481055 +vt 0.305344 0.518023 +vt 0.306962 0.500000 +vt 0.303622 0.537068 +vt 0.299828 0.539556 +vt 0.295484 0.542370 +vt 0.293070 0.522064 +vt 0.290472 0.500000 +vt 0.293070 0.477936 +vt 0.295484 0.457630 +vt 0.299828 0.460444 +vt 0.303622 0.462932 +vt 0.305344 0.481977 +vt 0.276031 0.517622 +vt 0.276762 0.500000 +vt 0.275251 0.536275 +vt 0.273530 0.538783 +vt 0.271550 0.541655 +vt 0.270444 0.521727 +vt 0.269250 0.500000 +vt 0.270444 0.478273 +vt 0.271550 0.458345 +vt 0.273530 0.461217 +vt 0.275251 0.463725 +vt 0.276031 0.482378 +vt 0.253297 0.517636 +vt 0.253107 0.500000 +vt 0.253501 0.536316 +vt 0.253950 0.538862 +vt 0.254468 0.541789 +vt 0.254758 0.521813 +vt 0.255072 0.500000 +vt 0.254758 0.478187 +vt 0.254468 0.458211 +vt 0.253950 0.461138 +vt 0.253501 0.463684 +vt 0.253297 0.482364 +vt 0.242753 0.517632 +vt 0.242977 0.500000 +vt 0.242515 0.536308 +vt 0.241986 0.538852 +vn -0.499926 0.000093 -0.866068 +vn -0.499993 0.000090 -0.866030 +vn -0.499967 0.000090 -0.866044 +vn -0.500011 0.000089 -0.866019 +vn -1.000000 -0.000002 0.000000 +vn -1.000000 -0.000002 -0.000085 +vn -1.000000 -0.000005 0.000000 +vn -0.499885 -0.000077 0.866092 +vn -0.500011 -0.000071 0.866019 +vn -0.499926 -0.000071 0.866068 +vn -0.499993 -0.000068 0.866030 +vn 0.499908 -0.000066 0.866079 +vn 0.500019 -0.000071 0.866014 +vn 0.499904 -0.000071 0.866081 +vn 0.499993 -0.000075 0.866030 +vn 1.000000 0.000002 -0.000000 +vn 0.499904 0.000089 -0.866081 +vn 0.499992 0.000093 -0.866030 +vn 0.499908 0.000093 -0.866079 +vn 0.499974 0.000095 -0.866040 +vn -0.482624 0.278381 -0.830408 +vn -0.495787 0.280759 -0.821808 +vn -0.481194 0.288947 -0.827624 +vn -1.000000 -0.000004 -0.000049 +vn -1.000000 0.000032 -0.000084 +vn -0.475439 -0.326104 0.817076 +vn -0.498778 -0.336452 0.798762 +vn -0.468977 -0.363295 0.805032 +vn 0.468960 -0.363297 0.805041 +vn 0.498778 -0.336437 0.798768 +vn 0.475466 -0.326102 0.817061 +vn 0.481129 0.288978 -0.827651 +vn 0.495768 0.280765 -0.821818 +vn 0.482606 0.278386 -0.830418 +vn -0.499117 0.638289 -0.586062 +vn -0.473375 0.663754 -0.579091 +vn 0.458128 -0.721284 0.519489 +vn 0.499636 0.652735 -0.569474 +vn 0.476888 0.647446 -0.594468 +vn -0.499042 0.803503 -0.324559 +vn -0.482455 0.816866 -0.316175 +vn -1.000000 -0.000045 -0.000012 +vn -1.000000 0.000046 -0.000023 +vn -0.496313 -0.780940 0.379218 +vn -0.401093 -0.850106 0.341239 +vn 0.499081 -0.804185 0.322807 +vn 0.554248 -0.788967 0.265219 +vn 1.000000 0.000002 -0.000001 +vn 0.499383 0.807971 -0.312728 +vn 0.484095 0.811327 -0.327719 +vn -1.000000 -0.000002 0.000001 +vn 1.000000 0.000003 -0.000001 +vn 0.487131 0.872180 -0.044790 +vn -0.499288 0.864834 -0.052674 +vn -0.487144 0.872172 -0.044798 +vn -0.499874 -0.865824 0.021792 +vn -0.482293 -0.875991 0.005713 +vn 0.499987 -0.866015 0.005648 +vn 0.484403 -0.874568 0.022012 +vn 0.499287 0.864834 -0.052674 +vn -0.012270 0.021276 -0.999698 +vn -0.012326 0.021440 -0.999694 +vn -0.012545 -0.021657 -0.999687 +vn -0.012625 -0.021749 -0.999684 +vn 0.012598 -0.021749 -0.999684 +vn 0.012558 -0.021633 -0.999687 +vn 0.025108 0.000048 -0.999685 +vn 0.024440 0.000179 -0.999701 +vn 0.012264 0.021314 -0.999698 +vn 0.012232 0.021276 -0.999699 +vn -0.500017 0.866015 -0.001034 +vn -0.499999 0.866025 -0.001016 +vn -0.500007 -0.866021 0.001025 +vn -0.500007 -0.866021 0.001026 +vn 0.500008 -0.866020 0.001025 +vn 0.500007 0.866021 -0.001026 +vn 0.499998 0.866026 -0.001035 +vn -0.007550 0.013107 0.999886 +vn -0.007521 0.013074 0.999886 +vn -0.015065 -0.000000 0.999887 +vn -0.014884 0.000036 0.999889 +vn -0.007428 -0.012866 0.999890 +vn -0.007447 -0.012923 0.999889 +vn 0.007461 -0.012923 0.999889 +vn 0.007462 -0.012924 0.999889 +vn 0.014939 0.000015 0.999888 +vn 0.014984 0.000024 0.999888 +vn 0.007501 0.012992 0.999887 +vn 0.007540 0.013107 0.999886 +vn -0.499995 0.866028 -0.000001 +vn -1.000000 -0.000002 0.000009 +vn -0.499994 -0.866029 0.000010 +vn 0.500014 -0.866018 0.000001 +vn 0.499995 -0.866028 0.000009 +vn 1.000000 0.000002 0.000008 +vn 0.500001 0.866025 -0.000006 +vn 0.499994 0.866029 -0.000010 +vn -0.024574 0.000179 -0.999698 +vn -0.025122 0.000071 -0.999684 +vn 0.000009 -0.000164 1.000000 +vn -0.000004 -0.000157 1.000000 +vn 0.000013 -0.000187 1.000000 +vn 0.000000 -0.000179 1.000000 +s off +f 260/13/108 273/14/108 272/15/108 +f 260/13/109 261/16/109 273/14/109 +f 261/16/110 274/17/110 273/14/110 +f 261/16/111 262/18/111 274/17/111 +f 262/18/112 275/19/112 274/17/112 +f 262/18/112 263/20/112 275/19/112 +f 263/20/113 276/21/113 275/19/113 +f 263/20/114 264/22/114 276/21/114 +f 264/22/115 277/23/115 276/21/115 +f 264/22/116 265/24/116 277/23/116 +f 265/24/117 278/25/117 277/23/117 +f 265/24/118 266/26/118 278/25/118 +f 266/26/119 279/27/119 278/25/119 +f 266/26/120 267/28/120 279/27/120 +f 267/28/121 280/29/121 279/27/121 +f 267/28/122 268/30/122 280/29/122 +f 268/30/123 281/31/123 280/29/123 +f 268/30/123 269/32/123 281/31/123 +f 269/32/123 282/33/123 281/31/123 +f 269/32/123 270/34/123 282/33/123 +f 270/34/124 283/35/124 282/33/124 +f 270/34/125 271/36/125 283/35/125 +f 271/36/126 272/15/126 283/35/126 +f 271/36/127 260/13/127 272/15/127 +f 272/15/128 330/37/128 284/38/128 +f 331/15/129 285/14/129 332/37/129 +f 273/14/130 333/39/130 334/37/130 +f 335/14/112 336/17/112 337/39/112 +f 338/17/131 286/40/131 339/39/131 +f 340/17/132 341/19/132 286/40/132 +f 342/19/133 343/41/133 286/40/133 +f 344/19/134 287/21/134 345/41/134 +f 346/21/135 347/42/135 348/41/135 +f 349/21/136 350/23/136 351/42/136 +f 352/23/137 288/43/137 353/42/137 +f 354/23/138 355/25/138 288/43/138 +f 356/25/123 357/44/123 288/43/123 +f 358/25/123 289/27/123 359/44/123 +f 360/27/123 361/45/123 362/44/123 +f 363/27/139 364/29/139 365/45/139 +f 366/29/140 367/46/140 368/45/140 +f 369/29/141 370/31/141 371/46/141 +f 372/31/142 291/47/142 290/46/142 +f 373/31/143 374/33/143 291/47/143 +f 375/33/144 376/48/144 292/47/144 +f 377/33/123 293/35/123 378/48/123 +f 379/35/123 380/38/123 381/48/123 +f 382/35/145 383/15/145 384/38/145 +f 385/38/146 386/49/146 387/50/146 +f 388/38/147 295/37/147 294/49/147 +f 389/37/148 390/51/148 391/49/148 +f 392/37/149 296/39/149 393/51/149 +f 394/39/150 395/52/150 396/51/150 +f 397/39/151 297/40/151 398/52/151 +f 286/40/152 399/53/152 400/52/152 +f 401/40/153 298/41/153 402/53/153 +f 403/41/154 404/54/154 405/53/154 +f 406/41/155 407/42/155 299/54/155 +f 408/42/156 409/55/156 299/54/156 +f 410/42/157 411/43/157 412/55/157 +f 413/43/112 302/56/112 414/55/112 +f 415/43/158 416/44/158 302/56/158 +f 417/44/159 305/57/159 418/56/159 +f 419/44/123 420/45/123 305/57/123 +f 421/45/160 422/58/160 305/57/160 +f 423/45/161 301/46/161 300/58/161 +f 424/46/162 425/59/162 426/58/162 +f 427/46/112 428/47/112 429/59/112 +f 430/47/163 303/60/163 431/59/163 +f 432/47/164 433/48/164 303/60/164 +f 434/48/165 304/50/165 303/60/165 +f 435/48/166 436/38/166 304/50/166 +f 437/50/123 438/61/123 439/62/123 +f 440/50/167 441/49/167 442/61/167 +f 443/49/168 307/63/168 306/61/168 +f 444/49/169 445/51/169 307/63/169 +f 446/51/170 309/64/170 308/63/170 +f 447/51/171 448/52/171 309/64/171 +f 449/52/172 310/65/172 309/64/172 +f 450/52/173 451/53/173 310/65/173 +f 452/53/174 311/66/174 310/65/174 +f 453/53/175 454/54/175 311/66/175 +f 455/54/176 456/67/176 311/66/176 +f 457/54/177 458/55/177 459/67/177 +f 460/55/178 313/68/178 312/67/178 +f 461/55/179 462/56/179 313/68/179 +f 463/56/112 314/69/112 313/68/112 +f 464/56/112 465/57/112 314/69/112 +f 466/57/180 315/70/180 314/69/180 +f 467/57/181 468/58/181 315/70/181 +f 469/58/182 316/71/182 315/70/182 +f 470/58/182 471/59/182 316/71/182 +f 472/59/123 317/72/123 316/71/123 +f 473/59/155 474/60/155 317/72/155 +f 475/60/183 476/62/183 317/72/183 +f 477/60/184 478/50/184 479/62/184 +f 480/62/185 319/73/185 318/74/185 +f 481/62/186 482/61/186 319/73/186 +f 483/61/187 320/75/187 319/73/187 +f 484/61/188 485/63/188 320/75/188 +f 486/63/189 321/76/189 320/75/189 +f 487/63/190 488/64/190 321/76/190 +f 489/64/191 322/77/191 321/76/191 +f 490/64/192 491/65/192 322/77/192 +f 492/65/193 323/78/193 322/77/193 +f 493/65/194 494/66/194 323/78/194 +f 495/66/195 496/79/195 323/78/195 +f 497/66/196 312/67/196 498/79/196 +f 499/67/197 325/80/197 324/79/197 +f 500/67/197 501/68/197 325/80/197 +f 502/68/198 326/81/198 325/80/198 +f 503/68/198 504/69/198 326/81/198 +f 505/69/199 327/82/199 326/81/199 +f 506/69/199 507/70/199 327/82/199 +f 508/70/200 328/83/200 327/82/200 +f 509/70/201 510/71/201 328/83/201 +f 511/71/202 329/84/202 328/83/202 +f 512/71/202 513/72/202 329/84/202 +f 514/72/203 515/74/203 329/84/203 +f 516/72/204 517/62/204 518/74/204 +f 519/74/205 520/85/205 521/86/205 +f 522/74/206 523/73/206 524/85/206 +f 525/73/207 526/87/207 527/85/207 +f 528/73/208 529/75/208 530/87/208 +f 531/75/209 532/88/209 533/87/209 +f 534/75/210 535/76/210 536/88/210 +o dieswall +v -1.412613 0.098376 4.357330 +v 0.555739 0.095511 4.357331 +v 0.555859 0.094949 2.388850 +v -1.412615 0.097814 2.388850 +v -1.379254 0.607765 4.323968 +v 0.522495 0.607763 4.323967 +v 0.522495 0.607765 2.422217 +v -1.379255 0.607767 2.422217 +v 1.207432 0.092447 -3.049533 +v 1.207434 0.093395 0.268969 +v -0.670411 0.096129 0.270138 +v -2.121743 0.098242 0.270138 +v -0.670413 0.095181 -3.049484 +v -0.243875 0.095508 0.270138 +v -0.243877 0.094560 -3.049584 +v -2.125251 0.094257 -3.049582 +v -2.088385 0.507715 0.236775 +v -0.703778 0.507713 0.236775 +v -0.703778 0.507717 -3.016219 +v -2.088385 0.507718 -3.016219 +v -0.210512 0.507713 0.236773 +v 1.174095 0.507711 0.236773 +v 1.174095 0.507715 -3.016220 +v -0.210513 0.507716 -3.016221 +vt 11.358181 0.011520 +vt 12.665374 1.000002 +vt 11.374322 1.000002 +vt 12.680956 0.005964 +vt 13.290203 1.000000 +vt 13.347682 0.004867 +vt 10.777996 1.000000 +vt 10.720117 0.010423 +vt 7.422454 0.011244 +vt 5.351833 0.805839 +vt 7.361876 0.805839 +vt 5.282763 0.007148 +vt 4.169651 0.805836 +vt 4.145276 0.005299 +vt 5.064029 0.805836 +vt 5.076667 0.003502 +vt 2.699338 0.005944 +vt 0.636806 0.805840 +vt 2.632222 0.805840 +vt 0.578067 0.001847 +vt 2.933929 0.805837 +vt 2.923321 -0.000002 +vt 3.827914 0.805837 +vt 3.852311 0.004095 +vn 0.000000 0.065354 0.997862 +vn 0.000094 0.065000 0.997885 +vn 0.997901 0.064761 -0.000000 +vn 0.997890 0.064921 0.000042 +vn -0.000000 0.064928 -0.997890 +vn 0.000095 0.065287 -0.997867 +vn -0.997867 0.065277 0.000001 +vn -0.997863 0.065346 -0.000018 +vn 0.000000 0.081208 0.996697 +vn 0.000117 0.080805 0.996730 +vn 0.996730 0.080804 0.000000 +vn 0.996745 0.080616 -0.000024 +vn -0.000000 0.080373 -0.996765 +vn 0.000017 0.080430 -0.996760 +vn -0.996049 0.088811 0.000000 +vn -0.996691 0.081274 0.000956 +vn 0.000000 0.080678 0.996740 +vn 0.000916 0.077548 0.996988 +vn 0.996778 0.080208 0.000000 +vn 0.996793 0.080022 -0.000024 +vn 0.000001 0.079962 -0.996798 +vn 0.000152 0.080476 -0.996756 +vn -0.996755 0.080492 0.000000 +vn -0.996741 0.080672 -0.000023 +s off +f 537/89/211 542/90/211 541/91/211 +f 537/89/212 538/92/212 542/90/212 +f 538/92/213 543/93/213 542/90/213 +f 538/92/214 539/94/214 543/93/214 +f 539/94/215 544/95/215 543/93/215 +f 539/94/216 540/96/216 544/95/216 +f 540/96/217 541/91/217 544/95/217 +f 540/96/218 537/89/218 541/91/218 +f 548/97/219 554/98/219 553/99/219 +f 548/97/220 547/100/220 554/98/220 +f 547/100/221 555/101/221 554/98/221 +f 547/100/222 549/102/222 555/101/222 +f 549/102/223 556/103/223 555/101/223 +f 549/102/224 552/104/224 556/103/224 +f 552/104/225 553/99/225 556/103/225 +f 552/104/226 548/97/226 553/99/226 +f 550/105/227 558/106/227 557/107/227 +f 550/105/228 546/108/228 558/106/228 +f 546/108/229 559/109/229 558/106/229 +f 546/108/230 545/110/230 559/109/230 +f 545/110/231 560/111/231 559/109/231 +f 545/110/232 551/112/232 560/111/232 +f 551/112/233 557/107/233 560/111/233 +f 551/112/234 550/105/234 557/107/234 +o diesshus +v -0.061721 0.614979 1.165604 +v -0.061721 0.573250 1.165595 +v -0.061721 0.614886 0.962656 +v -0.061721 0.573117 0.917222 +v -0.061721 0.636227 0.917354 +v -0.061721 0.749642 1.089949 +v -0.061721 0.749144 1.165475 +v -0.061721 0.791742 1.165462 +v -0.061721 0.791744 0.917324 +v -0.061721 0.750401 0.917317 +v -0.074691 0.825459 0.917321 +v -0.074691 0.825458 1.165570 +v -0.074691 0.791744 0.917324 +v -0.074691 0.791742 1.165462 +v -0.074691 0.750401 0.917317 +v -0.074691 0.749143 1.165475 +v -0.074691 0.636227 0.917354 +v -0.074691 0.614979 1.165604 +v -0.074691 0.573117 0.917222 +v -0.074691 0.573250 1.165595 +v -0.074691 0.542229 0.917320 +v -0.074691 0.542228 1.165570 +v -0.100631 0.614886 0.962656 +v -0.100631 0.614979 1.165604 +v -0.100631 0.636227 0.917354 +v -0.100631 0.749642 1.089949 +v -0.100631 0.749144 1.165475 +v -0.100631 0.750401 0.917317 +v -0.100631 0.825459 0.917321 +v -0.100630 0.825458 1.165570 +v -0.100631 0.542229 0.917320 +v -0.100631 0.542228 1.165570 +v -0.061721 0.752640 1.856935 +v -0.061721 0.794369 1.856944 +v -0.061721 0.752733 2.059883 +v -0.061721 0.794502 2.105317 +v -0.061721 0.731392 2.105185 +v -0.061721 0.617977 1.932591 +v -0.061721 0.618475 1.857064 +v -0.061721 0.575877 1.857077 +v -0.061721 0.575875 2.105215 +v -0.061721 0.617218 2.105222 +v -0.074691 0.542161 2.105218 +v -0.074691 0.542161 1.856969 +v -0.074691 0.575875 2.105215 +v -0.074691 0.575877 1.857077 +v -0.074691 0.617218 2.105221 +v -0.074691 0.618476 1.857064 +v -0.074691 0.731392 2.105185 +v -0.074691 0.752640 1.856935 +v -0.074691 0.794502 2.105317 +v -0.074691 0.794369 1.856944 +v -0.074691 0.825390 2.105218 +v -0.074691 0.825391 1.856969 +v -0.100631 0.752733 2.059883 +v -0.100631 0.752640 1.856935 +v -0.100631 0.731392 2.105185 +v -0.100631 0.617977 1.932591 +v -0.100631 0.618475 1.857064 +v -0.100631 0.617218 2.105221 +v -0.100631 0.542161 2.105218 +v -0.100631 0.542161 1.856969 +v -0.100631 0.825390 2.105218 +v -0.100631 0.825391 1.856969 +v -0.074691 0.614979 1.165604 +v -0.074691 0.636227 0.917354 +v -0.100631 0.614886 0.962656 +v -0.074691 0.749143 1.165475 +v -0.074691 0.750401 0.917317 +v -0.100631 0.749642 1.089949 +v -0.074691 0.825459 0.917321 +v -0.074691 0.825458 1.165570 +v -0.074691 0.825459 0.917321 +v -0.074691 0.825459 0.917321 +v -0.074691 0.791744 0.917324 +v -0.100631 0.825459 0.917321 +v -0.074691 0.791742 1.165462 +v -0.074691 0.825458 1.165570 +v -0.100630 0.825458 1.165570 +v -0.100631 0.636227 0.917354 +v -0.100631 0.750401 0.917317 +v -0.074691 0.636227 0.917354 +v -0.074691 0.750401 0.917317 +v -0.074691 0.636227 0.917354 +v -0.100631 0.750401 0.917317 +v -0.100631 0.749144 1.165475 +v -0.100631 0.614979 1.165604 +v -0.074691 0.749143 1.165475 +v -0.074691 0.614979 1.165604 +v -0.074691 0.749143 1.165475 +v -0.100631 0.614979 1.165604 +v -0.074691 0.573117 0.917222 +v -0.074691 0.542229 0.917320 +v -0.074691 0.542228 1.165570 +v -0.074691 0.542229 0.917320 +v -0.074691 0.542228 1.165570 +v -0.100631 0.542229 0.917320 +v -0.074691 0.542228 1.165570 +v -0.074691 0.573250 1.165595 +v -0.100631 0.542228 1.165570 +v -0.074691 0.614979 1.165604 +v -0.074691 0.573250 1.165595 +v -0.061721 0.614979 1.165604 +v -0.061721 0.573250 1.165595 +v -0.061721 0.614979 1.165604 +v -0.074691 0.573250 1.165595 +v -0.100631 0.614886 0.962656 +v -0.074691 0.614979 1.165604 +v -0.061721 0.614886 0.962656 +v -0.061721 0.614979 1.165604 +v -0.061721 0.614886 0.962656 +v -0.074691 0.614979 1.165604 +v -0.074691 0.573250 1.165595 +v -0.074691 0.573117 0.917222 +v -0.061721 0.573250 1.165595 +v -0.061721 0.573117 0.917222 +v -0.061721 0.573250 1.165595 +v -0.074691 0.573117 0.917222 +v -0.074691 0.573117 0.917222 +v -0.074691 0.636227 0.917354 +v -0.061721 0.573117 0.917222 +v -0.061721 0.636227 0.917354 +v -0.061721 0.573117 0.917222 +v -0.074691 0.636227 0.917354 +v -0.074691 0.636227 0.917354 +v -0.100631 0.749642 1.089949 +v -0.061721 0.636227 0.917354 +v -0.061721 0.749642 1.089949 +v -0.061721 0.636227 0.917354 +v -0.100631 0.749642 1.089949 +v -0.074691 0.749143 1.165475 +v -0.100631 0.614886 0.962656 +v -0.061721 0.749144 1.165475 +v -0.061721 0.614886 0.962656 +v -0.061721 0.749144 1.165475 +v -0.100631 0.614886 0.962656 +v -0.074691 0.791742 1.165462 +v -0.074691 0.749143 1.165475 +v -0.061721 0.791742 1.165462 +v -0.061721 0.749144 1.165475 +v -0.061721 0.791742 1.165462 +v -0.074691 0.749143 1.165475 +v -0.074691 0.791744 0.917324 +v -0.074691 0.791742 1.165462 +v -0.061721 0.791744 0.917324 +v -0.061721 0.791742 1.165462 +v -0.061721 0.791744 0.917324 +v -0.074691 0.791742 1.165462 +v -0.100631 0.749642 1.089949 +v -0.074691 0.750401 0.917317 +v -0.061721 0.749642 1.089949 +v -0.061721 0.750401 0.917317 +v -0.061721 0.749642 1.089949 +v -0.074691 0.750401 0.917317 +v -0.074691 0.750401 0.917317 +v -0.074691 0.791744 0.917324 +v -0.061721 0.750401 0.917317 +v -0.061721 0.791744 0.917324 +v -0.061721 0.750401 0.917317 +v -0.074691 0.791744 0.917324 +v -0.100631 0.542229 0.917320 +v -0.074691 0.636227 0.917354 +v -0.074691 0.573117 0.917222 +v -0.100631 0.636227 0.917354 +v -0.074691 0.636227 0.917354 +v -0.100631 0.542229 0.917320 +v -0.100631 0.750401 0.917317 +v -0.100631 0.825459 0.917321 +v -0.074691 0.791744 0.917324 +v -0.100631 0.750401 0.917317 +v -0.074691 0.791744 0.917324 +v -0.074691 0.750401 0.917317 +v -0.100631 0.749144 1.165475 +v -0.074691 0.749143 1.165475 +v -0.074691 0.791742 1.165462 +v -0.100631 0.749144 1.165475 +v -0.074691 0.791742 1.165462 +v -0.100630 0.825458 1.165570 +v -0.074691 0.573250 1.165595 +v -0.074691 0.614979 1.165604 +v -0.100631 0.614979 1.165604 +v -0.100631 0.542228 1.165570 +v -0.074691 0.573250 1.165595 +v -0.100631 0.614979 1.165604 +v -0.061721 0.794369 1.856944 +v -0.061721 0.752733 2.059883 +v -0.061721 0.794502 2.105317 +v -0.061721 0.752733 2.059883 +v -0.061721 0.731392 2.105185 +v -0.061721 0.752733 2.059883 +v -0.061721 0.752733 2.059883 +v -0.061721 0.617977 1.932591 +v -0.061721 0.618475 1.857064 +v -0.061721 0.617977 1.932591 +v -0.061721 0.575877 1.857077 +v -0.061721 0.617977 1.932591 +v -0.061721 0.617977 1.932591 +v -0.074691 0.575875 2.105215 +v -0.074691 0.575877 1.857077 +v -0.074691 0.575877 1.857077 +v -0.074691 0.618476 1.857064 +v -0.074691 0.731392 2.105185 +v -0.074691 0.731392 2.105185 +v -0.074691 0.794502 2.105317 +v -0.074691 0.794369 1.856944 +v -0.074691 0.825390 2.105218 +v -0.074691 0.794369 1.856944 +v -0.074691 0.752640 1.856935 +v -0.074691 0.731392 2.105185 +v -0.100631 0.752733 2.059883 +v -0.074691 0.618476 1.857064 +v -0.074691 0.617218 2.105221 +v -0.100631 0.617977 1.932591 +v -0.074691 0.542161 2.105218 +v -0.074691 0.542161 1.856969 +v -0.074691 0.542161 2.105218 +v -0.100631 0.542161 1.856969 +v -0.074691 0.542161 2.105218 +v -0.074691 0.575875 2.105215 +v -0.100631 0.542161 2.105218 +v -0.074691 0.575877 1.857077 +v -0.074691 0.542161 1.856969 +v -0.100631 0.542161 1.856969 +v -0.100631 0.731392 2.105185 +v -0.100631 0.617218 2.105221 +v -0.074691 0.731392 2.105185 +v -0.074691 0.617218 2.105221 +v -0.074691 0.731392 2.105185 +v -0.100631 0.617218 2.105221 +v -0.100631 0.618475 1.857064 +v -0.100631 0.752640 1.856935 +v -0.074691 0.618476 1.857064 +v -0.074691 0.752640 1.856935 +v -0.074691 0.618476 1.857064 +v -0.100631 0.752640 1.856935 +v -0.074691 0.794502 2.105317 +v -0.074691 0.825390 2.105218 +v -0.074691 0.825391 1.856969 +v -0.074691 0.825390 2.105218 +v -0.074691 0.825391 1.856969 +v -0.100631 0.825390 2.105218 +v -0.074691 0.825391 1.856969 +v -0.074691 0.794369 1.856944 +v -0.100631 0.825391 1.856969 +v -0.074691 0.752640 1.856935 +v -0.074691 0.794369 1.856944 +v -0.061721 0.752640 1.856935 +v -0.061721 0.794369 1.856944 +v -0.061721 0.752640 1.856935 +v -0.074691 0.794369 1.856944 +v -0.100631 0.752733 2.059883 +v -0.074691 0.752640 1.856935 +v -0.061721 0.752733 2.059883 +v -0.061721 0.752640 1.856935 +v -0.061721 0.752733 2.059883 +v -0.074691 0.752640 1.856935 +v -0.074691 0.794369 1.856944 +v -0.074691 0.794502 2.105317 +v -0.061721 0.794369 1.856944 +v -0.061721 0.794502 2.105317 +v -0.061721 0.794369 1.856944 +v -0.074691 0.794502 2.105317 +v -0.074691 0.794502 2.105317 +v -0.074691 0.731392 2.105185 +v -0.061721 0.794502 2.105317 +v -0.061721 0.731392 2.105185 +v -0.061721 0.794502 2.105317 +v -0.074691 0.731392 2.105185 +v -0.074691 0.731392 2.105185 +v -0.100631 0.617977 1.932591 +v -0.061721 0.731392 2.105185 +v -0.061721 0.617977 1.932591 +v -0.061721 0.731392 2.105185 +v -0.100631 0.617977 1.932591 +v -0.074691 0.618476 1.857064 +v -0.100631 0.752733 2.059883 +v -0.061721 0.618475 1.857064 +v -0.061721 0.752733 2.059883 +v -0.061721 0.618475 1.857064 +v -0.100631 0.752733 2.059883 +v -0.074691 0.575877 1.857077 +v -0.074691 0.618476 1.857064 +v -0.061721 0.575877 1.857077 +v -0.061721 0.618475 1.857064 +v -0.061721 0.575877 1.857077 +v -0.074691 0.618476 1.857064 +v -0.074691 0.575875 2.105215 +v -0.074691 0.575877 1.857077 +v -0.061721 0.575875 2.105215 +v -0.061721 0.575877 1.857077 +v -0.061721 0.575875 2.105215 +v -0.074691 0.575877 1.857077 +v -0.100631 0.617977 1.932591 +v -0.074691 0.617218 2.105221 +v -0.061721 0.617977 1.932591 +v -0.061721 0.617218 2.105222 +v -0.061721 0.617977 1.932591 +v -0.074691 0.617218 2.105221 +v -0.074691 0.617218 2.105221 +v -0.074691 0.575875 2.105215 +v -0.061721 0.617218 2.105222 +v -0.061721 0.575875 2.105215 +v -0.061721 0.617218 2.105222 +v -0.074691 0.575875 2.105215 +v -0.100631 0.825390 2.105218 +v -0.074691 0.731392 2.105185 +v -0.074691 0.794502 2.105317 +v -0.100631 0.731392 2.105185 +v -0.074691 0.731392 2.105185 +v -0.100631 0.825390 2.105218 +v -0.100631 0.617218 2.105221 +v -0.074691 0.575875 2.105215 +v -0.100631 0.617218 2.105221 +v -0.074691 0.575875 2.105215 +v -0.074691 0.617218 2.105221 +v -0.100631 0.618475 1.857064 +v -0.074691 0.618476 1.857064 +v -0.074691 0.575877 1.857077 +v -0.100631 0.618475 1.857064 +v -0.074691 0.575877 1.857077 +v -0.100631 0.542161 1.856969 +v -0.074691 0.794369 1.856944 +v -0.074691 0.752640 1.856935 +v -0.100631 0.752640 1.856935 +v -0.100631 0.825391 1.856969 +v -0.074691 0.794369 1.856944 +v -0.100631 0.752640 1.856935 +vt 1.810996 1.000000 +vt 1.263047 1.000000 +vt 1.810987 0.880992 +vt 1.263285 0.880987 +vt 1.811002 0.735057 +vt 1.263256 0.730619 +vt 1.810922 0.332037 +vt 1.262971 0.257037 +vt 1.811213 0.109265 +vt 1.262991 0.109736 +vt 1.810996 0.000234 +vt 1.263047 0.000234 +vt 1.710928 0.256707 +vt 1.262971 0.257036 +vt 1.429962 0.732379 +vt 1.811003 0.735057 +vt 1.263046 1.000000 +vt 1.810987 0.880993 +vt 1.263286 0.880986 +vt 1.263285 0.880986 +vt 1.810988 0.880992 +vt -0.262971 0.742963 +vt -0.262990 0.890264 +vt -0.710928 0.743293 +vt -0.811213 0.890735 +vt -0.810921 0.667963 +vt -0.429962 0.267621 +vt -0.263256 0.269381 +vt -0.263285 0.119013 +vt -0.810987 0.119007 +vt -0.811002 0.264943 +vt -0.810996 -0.000000 +vt -0.263047 -0.000000 +vt -0.263285 0.119014 +vt -0.262970 0.742963 +vt -0.811212 0.890735 +vt -0.262991 0.890264 +vt -0.810995 0.999765 +vt -0.263047 0.999765 +vt -0.429963 0.267620 +vn 1.000000 -0.000000 -0.000002 +vn 1.000000 -0.000001 -0.000002 +vn 1.000000 -0.000013 0.000000 +vn 1.000000 0.000016 -0.000002 +vn -0.000002 1.000000 -0.000459 +vn 0.000002 0.835715 -0.549164 +vn -0.000004 -0.833859 0.551978 +vn 0.000000 -0.999990 -0.004396 +vn 0.000000 1.000000 0.000001 +vn 0.000000 -0.000106 -1.000000 +vn 0.000000 -0.003203 0.999995 +vn -0.000000 -0.000324 -1.000000 +vn 0.000009 -0.000322 -1.000000 +vn 0.000000 0.000961 1.000000 +vn 0.000018 0.000958 0.999999 +vn -0.000009 -0.003172 -0.999995 +vn -0.000002 -1.000000 -0.000001 +vn -0.000000 -1.000000 -0.000001 +vn -0.000009 -0.000822 1.000000 +vn -0.000037 -0.000206 1.000000 +vn 0.000000 -0.000217 1.000000 +vn 0.000002 1.000000 -0.000459 +vn 0.000005 1.000000 -0.000459 +vn 0.000000 -1.000000 0.000536 +vn 0.000000 0.002093 -0.999998 +vn -0.000003 0.835714 -0.549164 +vn 0.000000 0.835715 -0.549164 +vn 0.000004 -0.833859 0.551978 +vn -0.000001 -0.833859 0.551978 +vn 0.000000 0.000313 1.000000 +vn 0.000005 1.000000 0.000008 +vn 0.000000 0.000167 -1.000000 +vn -0.006279 0.002093 -0.999978 +vn 0.000000 0.000360 -1.000000 +vn 0.000200 0.000048 -1.000000 +vn 0.000009 0.000167 -1.000000 +vn 0.002551 -0.001240 0.999996 +vn 0.000018 -0.000206 1.000000 +vn -0.000420 -0.000478 1.000000 +vn 1.000000 -0.000001 0.000000 +vn -0.000002 -1.000000 0.000459 +vn 0.000000 -0.835714 0.549165 +vn -0.000004 0.833858 -0.551979 +vn 0.000002 0.999990 0.004395 +vn 0.000002 -1.000000 -0.000002 +vn -0.000000 0.000106 1.000000 +vn 0.000000 0.003203 -0.999995 +vn 0.000000 0.000319 1.000000 +vn 0.000000 -0.000962 -1.000000 +vn 0.000005 -0.000961 -1.000000 +vn -0.000000 0.003196 0.999995 +vn 0.000005 0.000819 -1.000000 +vn 0.000009 0.000217 -1.000000 +vn -0.000009 0.000211 -1.000000 +vn -0.000000 -1.000000 0.000459 +vn -0.000000 1.000000 -0.000536 +vn 0.000000 -0.002097 0.999998 +vn 0.000000 -0.835714 0.549166 +vn 0.000004 -0.835714 0.549165 +vn 0.000003 0.833859 -0.551978 +vn 0.000007 0.833859 -0.551977 +vn 0.000009 -0.000308 -1.000000 +vn -0.000009 -0.000313 -1.000000 +vn 0.000000 -1.000000 -0.000009 +vn -0.000003 0.999990 0.004396 +vn -0.000000 0.999990 0.004396 +vn -0.000037 -0.000161 1.000000 +vn 0.000000 -0.000173 1.000000 +vn -0.006302 -0.002097 0.999978 +vn 0.000000 -0.000358 1.000000 +vn 0.000192 -0.000041 1.000000 +vn -0.000000 -0.000161 1.000000 +vn 0.000000 -0.000308 -1.000000 +vn 0.002547 0.001243 -0.999996 +vn 0.000005 0.000217 -1.000000 +vn -0.000408 0.000474 -1.000000 +s off +f 571/113/235 572/114/235 573/115/235 +f 572/114/235 574/116/235 573/115/235 +f 573/115/236 574/116/236 575/117/236 +f 574/116/236 576/118/236 575/117/236 +f 575/117/236 576/118/236 577/119/236 +f 576/118/235 578/120/235 577/119/235 +f 577/119/235 578/120/235 579/121/235 +f 578/120/237 580/122/237 579/121/237 +f 579/121/63 580/122/63 581/123/63 +f 581/123/238 580/122/238 582/124/238 +f 625/125/239 583/126/239 584/125/239 +f 585/120/240 586/125/240 626/126/240 +f 587/119/241 627/127/241 628/119/241 +f 629/127/242 630/119/242 588/127/242 +f 589/118/243 590/125/243 631/118/243 +f 632/125/243 633/118/243 590/125/243 +f 634/127/244 635/128/244 636/127/244 +f 637/117/245 638/127/245 639/128/245 +f 640/113/246 641/129/246 642/113/246 +f 643/114/247 644/113/247 645/129/247 +f 646/130/248 647/113/248 648/115/248 +f 649/113/249 650/115/249 651/113/249 +f 652/129/250 653/131/250 591/114/250 +f 592/116/251 591/114/251 654/131/251 +f 655/119/252 656/128/252 657/119/252 +f 658/117/253 659/119/253 660/128/253 +f 661/118/254 662/126/254 663/118/254 +f 664/120/255 665/118/255 666/126/255 +f 667/123/256 668/121/256 669/123/256 +f 670/121/257 671/123/257 672/121/257 +f 673/124/258 674/123/258 675/124/258 +f 676/123/258 677/124/258 678/123/258 +f 679/122/259 680/124/259 681/122/259 +f 682/124/259 683/122/259 684/124/259 +f 685/120/260 686/122/260 687/126/260 +f 688/122/261 689/126/261 690/122/261 +f 691/125/262 692/120/262 693/125/262 +f 694/126/263 695/125/263 696/120/263 +f 697/122/264 698/121/264 699/122/264 +f 700/121/264 701/122/264 702/121/264 +f 703/121/265 704/119/265 705/121/265 +f 706/119/265 707/121/265 708/119/265 +f 709/119/242 710/127/242 711/119/242 +f 712/127/242 713/119/242 714/127/242 +f 715/118/266 716/125/266 717/118/266 +f 718/125/266 719/118/266 720/125/266 +f 721/116/267 722/118/267 723/132/267 +f 724/118/268 725/132/268 726/118/268 +f 727/115/269 728/116/269 729/133/269 +f 730/132/270 731/133/270 732/116/270 +f 733/127/264 734/117/264 735/127/264 +f 736/128/271 737/127/271 738/117/271 +f 739/117/272 740/115/272 741/128/272 +f 742/133/273 743/128/273 744/115/273 +f 603/134/63 604/135/63 605/136/63 +f 604/135/63 606/137/63 605/136/63 +f 758/137/274 759/138/274 607/136/274 +f 760/138/274 608/139/274 607/136/274 +f 607/136/274 608/139/274 609/140/274 +f 761/140/63 610/139/63 762/141/63 +f 763/141/63 610/139/63 611/142/63 +f 610/139/274 612/143/274 611/142/274 +f 764/144/63 765/145/63 613/142/63 +f 766/145/63 767/146/63 614/142/63 +f 768/142/275 615/146/275 616/143/275 +f 617/146/276 618/140/276 769/143/276 +f 619/143/277 770/140/277 771/138/277 +f 772/140/278 773/147/278 620/138/278 +f 621/138/279 622/147/279 774/148/279 +f 775/147/251 776/149/251 777/148/251 +f 778/148/280 779/149/280 780/150/280 +f 781/150/281 782/149/281 783/151/281 +f 784/136/282 785/134/282 786/136/282 +f 787/147/282 788/136/282 789/134/282 +f 790/138/283 791/152/283 792/138/283 +f 793/139/284 794/138/284 795/152/284 +f 796/140/285 797/136/285 623/140/285 +f 624/136/243 623/140/243 798/136/243 +f 799/152/243 800/143/243 801/139/243 +f 802/143/286 803/139/286 804/143/286 +f 805/144/287 806/145/287 807/144/287 +f 808/145/288 809/144/288 810/145/288 +f 811/142/289 812/144/289 813/142/289 +f 814/144/289 815/142/289 816/144/289 +f 817/145/290 818/146/290 819/145/290 +f 820/146/290 821/145/290 822/146/290 +f 823/138/291 824/143/291 825/138/291 +f 826/143/291 827/138/291 828/143/291 +f 829/140/292 830/134/292 831/140/292 +f 832/147/293 833/140/293 834/134/293 +f 835/150/294 836/137/294 837/150/294 +f 838/148/295 839/150/295 840/137/295 +f 841/151/296 842/150/296 843/151/296 +f 844/150/297 845/151/297 846/150/297 +f 847/149/298 848/151/298 849/149/298 +f 850/151/298 851/149/298 852/151/298 +f 853/147/299 854/149/299 855/134/299 +f 856/135/300 857/134/300 858/149/300 +f 859/136/301 860/147/301 861/136/301 +f 862/134/302 863/136/302 864/147/302 +f 865/149/303 866/148/303 867/135/303 +f 868/137/304 869/135/304 870/148/304 +f 871/148/305 621/138/305 872/137/305 +f 873/138/306 874/137/306 875/138/306 +f 876/138/307 877/139/307 878/138/307 +f 879/139/308 880/138/308 881/139/308 +f 882/140/309 883/136/309 884/140/309 +f 885/136/310 886/140/310 887/136/310 +f 561/126/274 562/122/274 563/125/274 +f 562/122/274 564/121/274 563/125/274 +f 564/121/63 565/119/63 563/125/63 +f 567/118/274 566/127/274 568/132/274 +f 568/132/274 566/127/274 569/133/274 +f 566/127/274 570/128/274 569/133/274 +f 593/121/274 594/119/274 595/121/274 +f 745/119/274 596/119/274 746/121/274 +f 747/128/63 597/130/63 748/115/63 +f 753/118/274 754/116/274 600/131/274 +f 755/122/274 756/120/274 601/126/274 +f 757/122/274 602/122/274 601/126/274 +f 565/119/63 566/127/63 563/125/63 +f 563/125/63 566/127/63 567/118/63 +f 749/128/63 598/115/63 750/117/63 +f 751/118/63 752/118/63 599/116/63 +o diespum2 +v 1.279149 0.405199 2.597913 +v 1.279149 0.405199 2.943146 +v 1.279150 0.675381 2.597913 +v 1.279150 0.675381 2.943146 +v 1.279149 0.405198 3.358144 +v 1.279149 0.405198 3.703377 +v 1.279150 0.675380 3.358145 +v 1.279150 0.675380 3.703377 +vt -0.967068 0.000000 +vt -0.061724 0.000000 +vt -0.061724 1.000000 +vt -0.967068 1.000000 +vt 1.026576 0.000000 +vt 1.931920 0.000000 +vt 1.931920 0.999999 +vt 1.026576 1.000000 +vn 1.000000 -0.000002 -0.000000 +s off +f 893/153/274 892/154/274 894/155/274 +f 893/153/311 894/155/311 895/156/311 +f 889/157/274 888/158/274 890/159/274 +f 889/157/274 890/159/274 891/160/274 +o dieshing +v -0.419342 0.240450 0.900010 +v -0.419341 0.212152 0.900010 +v -0.640149 0.212372 0.900010 +v -0.640157 0.240592 0.900010 +v -0.419387 0.736461 0.900010 +v -0.419374 0.708381 0.900010 +v -0.640149 0.708324 0.900010 +v -0.640156 0.736489 0.900010 +v -0.640172 0.736489 0.916692 +v -0.419403 0.736461 0.916692 +v -0.419390 0.708381 0.916692 +v -0.640165 0.708324 0.916692 +v -0.640172 0.240593 0.916691 +v -0.419358 0.240450 0.916692 +v -0.419356 0.212152 0.916692 +v -0.640165 0.212372 0.916691 +v -0.646228 0.175972 0.910018 +v -0.681143 0.175972 0.910018 +v -0.640149 0.212372 0.910018 +v -0.642812 0.178288 0.910018 +v -0.681143 0.273273 0.910018 +v -0.681143 0.671913 0.910019 +v -0.681143 0.769213 0.910019 +v -0.645999 0.769213 0.910019 +v -0.642823 0.766897 0.910019 +v -0.640156 0.736489 0.910019 +v -0.646000 0.273273 0.910018 +v -0.646227 0.671913 0.910019 +v -0.642823 0.270956 0.910019 +v -0.642811 0.674229 0.910019 +v -0.640157 0.240593 0.910018 +v -0.640149 0.708324 0.910019 +v -0.681143 0.671913 0.900010 +v -0.642811 0.674229 0.900010 +v -0.646227 0.671913 0.900010 +v -0.681143 0.769213 0.900010 +v -0.645999 0.769213 0.900010 +v -0.642823 0.766897 0.900010 +v -0.681143 0.175972 0.900010 +v -0.642812 0.178288 0.900010 +v -0.646228 0.175972 0.900010 +v -0.681143 0.273273 0.900010 +v -0.642823 0.270956 0.900010 +v -0.645999 0.273272 0.900009 +vt 0.352429 0.823456 +vt 0.352427 0.862690 +vt 0.601358 0.862385 +vt 0.601366 0.823258 +vt 0.352480 0.135760 +vt 0.352466 0.174692 +vt 0.601358 0.174770 +vt 0.601366 0.135721 +vt 0.647573 0.225254 +vt 0.604359 0.222042 +vt 0.608210 0.225254 +vt 0.647573 0.090350 +vt 0.607953 0.090350 +vt 0.604371 0.093562 +vt 0.647573 0.912852 +vt 0.604359 0.909640 +vt 0.608210 0.912852 +vt 0.647573 0.777949 +vt 0.604371 0.781161 +vt 0.607953 0.777949 +vt 0.352446 0.823456 +vt 0.352444 0.862690 +vt 0.352498 0.135760 +vt 0.352483 0.174692 +vt 0.647573 0.225253 +vt 0.604371 0.093563 +vt 0.601383 0.135721 +vt 0.601375 0.174770 +vt 0.601383 0.823258 +vt 0.601375 0.862385 +vn -0.000007 0.000008 -1.000000 +vn -0.000014 0.000123 -1.000000 +vn -0.000007 -0.000016 -1.000000 +vn 0.000160 0.000014 -1.000000 +vn 0.000004 -0.000002 -1.000000 +vn -0.000007 -0.000112 -1.000000 +vn 1.000000 0.000071 0.000916 +vn 1.000000 0.000054 0.000945 +vn -0.000996 -0.999999 0.000004 +vn 0.000646 1.000000 -0.000006 +vn 0.999999 0.000452 0.000947 +vn 0.999999 0.000453 0.000945 +vn 0.000255 -1.000000 0.000006 +vn 0.000127 1.000000 0.000000 +vn -0.000000 -1.000000 -0.000007 +vn 0.996964 -0.077867 0.000000 +vn 0.561266 -0.827635 -0.000001 +vn 0.561256 -0.827642 0.000004 +vn 0.000002 1.000000 0.000006 +vn 0.000000 1.000000 0.000000 +vn 0.589238 0.807960 0.000019 +vn 0.589208 0.807981 0.000005 +vn 0.996178 0.087345 -0.000000 +vn 0.996178 0.087344 0.000002 +vn 0.000001 1.000000 -0.000003 +vn 0.000004 1.000000 0.000009 +vn -0.000003 -1.000000 0.000012 +vn 0.589155 0.808020 -0.000002 +vn 0.589220 0.807973 0.000029 +vn 0.561261 -0.827639 0.000000 +vn 0.996167 0.087470 -0.000001 +vn 0.996167 0.087470 -0.000000 +vn 0.996966 -0.077840 0.000000 +vn 0.000128 1.000000 0.000018 +vn 0.000126 1.000000 -0.000003 +vn 0.000255 -1.000000 0.000000 +vn 0.000255 -1.000000 0.000001 +vn 0.000646 1.000000 0.000001 +vn 0.000646 1.000000 0.000002 +vn -0.000996 -0.999999 0.000001 +vn -0.000996 -1.000000 -0.000005 +s off +f 896/161/105 897/162/105 898/163/105 +f 899/164/105 896/161/105 898/163/105 +f 900/165/105 901/166/105 902/167/105 +f 903/168/105 900/165/105 902/167/105 +f 928/169/312 902/167/312 929/170/312 +f 928/169/313 929/170/313 930/171/313 +f 931/172/314 932/173/314 903/168/314 +f 932/173/315 933/174/315 903/168/315 +f 931/172/316 903/168/316 928/169/316 +f 928/169/105 903/168/105 902/167/105 +f 934/175/105 898/163/105 935/176/105 +f 935/176/105 936/177/105 934/175/105 +f 937/178/105 938/179/105 899/164/105 +f 939/180/317 938/179/317 937/178/317 +f 937/178/105 899/164/105 934/175/105 +f 934/175/105 899/164/105 898/163/105 +f 909/181/318 910/182/318 897/162/318 +f 897/162/319 896/161/319 909/181/319 +f 897/162/320 914/163/320 898/163/320 +f 896/161/321 899/164/321 926/164/321 +f 905/183/322 906/184/322 901/166/322 +f 901/166/323 900/165/323 905/183/323 +f 901/166/324 927/167/324 902/167/324 +f 900/165/325 903/168/325 921/168/325 +f 912/177/326 913/175/326 934/175/326 +f 934/175/251 936/177/251 912/177/251 +f 914/163/327 915/176/327 935/176/327 +f 935/176/327 898/163/327 914/163/327 +f 915/176/328 912/177/328 936/177/328 +f 936/177/329 935/176/329 915/176/329 +f 913/175/7 916/178/7 937/178/7 +f 937/178/7 934/175/7 913/175/7 +f 917/185/7 918/172/7 931/172/7 +f 931/172/7 928/169/7 917/185/7 +f 918/172/330 919/173/330 932/173/330 +f 932/173/331 931/172/331 918/172/331 +f 919/173/332 920/186/332 933/174/332 +f 933/174/333 932/173/333 919/173/333 +f 920/186/334 921/168/334 903/168/334 +f 903/168/335 933/174/335 920/186/335 +f 916/178/336 922/180/336 939/180/336 +f 939/180/337 937/178/337 916/178/337 +f 923/171/338 917/185/338 928/169/338 +f 928/169/3 930/171/3 923/171/3 +f 922/180/339 924/179/339 938/179/339 +f 938/179/340 939/180/340 922/180/340 +f 925/170/341 923/171/341 930/171/341 +f 930/171/341 929/170/341 925/170/341 +f 924/179/342 926/164/342 899/164/342 +f 899/164/343 938/179/343 924/179/343 +f 927/167/344 925/170/344 929/170/344 +f 929/170/344 902/167/344 927/167/344 +f 900/165/345 921/168/345 904/187/345 +f 904/187/346 905/183/346 900/165/346 +f 927/167/347 901/166/347 906/184/347 +f 906/184/348 907/188/348 927/167/348 +f 896/161/349 926/164/349 908/189/349 +f 896/161/350 908/189/350 909/181/350 +f 914/163/351 897/162/351 910/182/351 +f 910/182/352 911/190/352 914/163/352 +o dieswind +v 1.415779 0.552609 2.205991 +v 1.185139 0.552609 2.205991 +v 1.185139 0.831107 2.205992 +v 1.415779 0.848733 2.205992 +v 1.149921 0.553582 2.205991 +v 0.965105 0.553583 2.205991 +v 0.965105 0.814732 2.205992 +v 1.149921 0.828775 2.205992 +v 1.415779 0.552607 4.089635 +v 1.185140 0.552607 4.089635 +v 1.185140 0.831106 4.089635 +v 1.415780 0.848731 4.089636 +v 1.149922 0.553581 4.089635 +v 0.965106 0.553581 4.089635 +v 0.965106 0.814731 4.089635 +v 1.149922 0.828773 4.089636 +v 1.416365 0.547640 1.227853 +v 1.416366 0.841242 1.227854 +v 1.185359 0.823766 1.227854 +v 1.185359 0.547640 1.227853 +v 0.964919 0.547966 1.227854 +v 1.150916 0.547966 1.227853 +v 0.964919 0.808133 1.227854 +v 1.150916 0.822122 1.227854 +v 0.910735 0.808073 1.273595 +v 0.910735 0.547999 1.273595 +v 0.910735 0.547999 1.399248 +v 0.910735 0.548038 1.437904 +v 0.910735 0.548038 1.563519 +v 0.910735 0.547353 1.599721 +v 0.910735 0.547353 1.725347 +v 0.910735 0.808073 1.399249 +v 0.910735 0.808745 1.725347 +v 0.910735 0.808034 1.437904 +v 0.910735 0.808033 1.563519 +v 0.910735 0.808745 1.599722 +v 1.416301 0.841242 1.771434 +v 1.416300 0.547639 1.771433 +v 1.185294 0.823766 1.771434 +v 1.185294 0.547639 1.771434 +v 1.150850 0.547966 1.771433 +v 0.964854 0.547966 1.771434 +v 0.964854 0.808132 1.771434 +v 1.150851 0.822122 1.771434 +v -0.117645 0.565081 1.845654 +v -0.117645 0.565081 1.751331 +v -0.117645 0.565081 1.632836 +v -0.117645 0.565081 1.727158 +v -0.117645 0.672547 1.632836 +v -0.117645 0.672547 1.727158 +v -0.117645 0.672547 1.751331 +v -0.117645 0.672546 1.845654 +v -0.117645 0.696732 1.727158 +v -0.117645 0.696732 1.632836 +v -0.117645 0.696732 1.845654 +v -0.117645 0.696732 1.751331 +v -0.117645 0.804197 1.751332 +v -0.117645 0.804197 1.845654 +v -0.117645 0.804197 1.727158 +v -0.117646 0.804197 1.632836 +v -0.117646 0.565081 1.387403 +v -0.117646 0.565081 1.293081 +v -0.117645 0.672547 1.293081 +v -0.117645 0.672547 1.387403 +v -0.117646 0.565081 1.268907 +v -0.117646 0.565082 1.174585 +v -0.117646 0.672547 1.174585 +v -0.117583 0.672547 1.268907 +v -0.117645 0.696732 1.387403 +v -0.117645 0.696732 1.293081 +v -0.117645 0.804198 1.293081 +v -0.117645 0.804198 1.387403 +v -0.117645 0.697249 1.175038 +v -0.117645 0.697249 1.268454 +v -0.117645 0.803681 1.175038 +v -0.117645 0.803681 1.268454 +vt 0.129625 0.709550 +vt 0.178740 0.709550 +vt 0.058974 0.709550 +vt 0.120266 0.709550 +vt 0.129625 0.963858 +vt 0.178740 0.963858 +vt 0.058973 0.963858 +vt 0.120266 0.963858 +vt 0.178789 0.577492 +vt 0.129361 0.577492 +vt 0.058817 0.577492 +vt 0.120207 0.577492 +vt 0.193189 0.644658 +vt 0.193189 0.627698 +vt 0.193189 0.622810 +vt 0.193189 0.605851 +vt 0.193189 0.600632 +vt 0.193189 0.583668 +vt 0.178807 0.650880 +vt 0.129378 0.650880 +vt 0.058835 0.650880 +vt 0.120225 0.650880 +vt 0.466480 0.648166 +vt 0.466480 0.660901 +vt 0.466480 0.632168 +vt 0.466480 0.644903 +vt 0.466480 0.586298 +vt 0.466480 0.599033 +vt 0.466480 0.570362 +vt 0.466480 0.582974 +vt 0.466480 0.570300 +vt 0.466464 0.583035 +vt 0.466480 0.583035 +vn 0.000000 0.000002 -1.000000 +vn 0.000001 0.000001 -1.000000 +vn 0.000001 0.000002 -1.000000 +vn 0.000000 0.000001 -1.000000 +vn -0.000000 -0.000002 1.000000 +vn -0.000003 0.000000 1.000000 +vn -0.000002 -0.000002 1.000000 +vn -0.000001 0.000001 -1.000000 +vn -0.000001 0.000003 -1.000000 +vn -1.000000 0.000001 0.000002 +vn -1.000000 0.000002 0.000000 +vn -1.000000 0.000001 -0.000001 +vn 0.000001 -0.000001 1.000000 +vn 0.000001 -0.000000 1.000000 +vn 1.000000 0.000004 -0.000005 +vn 1.000000 0.000004 -0.000664 +vn 1.000000 -0.000579 -0.000000 +s off +f 947/191/353 944/191/353 945/192/353 +f 945/192/354 946/192/354 947/191/354 +f 943/193/355 940/193/355 942/194/355 +f 942/194/356 940/193/356 941/194/356 +f 952/195/357 955/195/357 953/196/357 +f 954/196/358 953/196/358 955/195/358 +f 948/197/359 951/197/359 950/198/359 +f 948/197/359 950/198/359 949/198/359 +f 960/199/360 962/199/360 961/200/360 +f 963/200/360 961/200/360 962/199/360 +f 957/201/353 956/201/353 959/202/353 +f 957/201/361 959/202/361 958/202/361 +f 972/203/362 975/204/362 969/204/362 +f 972/203/363 969/204/363 970/203/363 +f 974/205/362 973/206/362 967/206/362 +f 974/205/362 967/206/362 968/205/362 +f 971/207/364 964/208/364 966/207/364 +f 965/208/364 966/207/364 964/208/364 +f 982/209/365 981/209/365 980/210/365 +f 980/210/365 983/210/365 982/209/365 +f 977/211/366 976/211/366 979/212/366 +f 979/212/366 976/211/366 978/212/366 +f 995/213/274 996/213/274 994/214/274 +f 997/214/274 994/214/274 996/213/274 +f 999/215/367 998/216/367 993/215/367 +f 992/216/274 993/215/274 998/216/274 +f 986/215/274 988/215/274 987/216/274 +f 989/216/274 987/216/274 988/215/274 +f 985/213/274 990/213/274 984/214/274 +f 991/214/274 984/214/274 990/213/274 +f 1009/217/274 1010/217/274 1008/218/274 +f 1011/218/274 1008/218/274 1010/217/274 +f 1014/219/274 1015/220/274 1012/219/274 +f 1013/220/274 1012/219/274 1015/220/274 +f 1006/221/368 1007/222/368 1005/221/368 +f 1004/223/369 1005/221/369 1007/222/369 +f 1001/217/274 1002/217/274 1000/218/274 +f 1003/218/274 1000/218/274 1002/217/274 +o diesvert +v -0.459378 0.094249 2.689255 +v -0.459330 0.819549 2.688997 +v -0.459331 0.826566 2.686084 +v -0.459333 0.833488 2.689010 +v -0.459453 1.553187 2.689696 +v -0.459454 1.558014 2.686781 +v -0.459455 1.562877 2.689705 +v -0.459481 2.285283 2.689853 +v -0.459488 2.289675 2.686980 +v -0.459497 2.295024 2.689956 +v -0.460737 3.041305 2.697886 +v -0.498451 3.098831 2.905324 +v -0.524867 3.102593 3.261423 +v -0.727115 0.094249 2.742531 +v -0.727169 0.819549 2.742273 +v -0.728285 0.826566 2.739583 +v -0.727166 0.833488 2.742286 +v -0.727015 1.553187 2.742966 +v -0.728131 1.558014 2.740274 +v -0.727013 1.562877 2.742975 +v -0.726981 2.285283 2.743122 +v -0.728086 2.289675 2.740471 +v -0.726956 2.295024 2.743223 +v -0.725067 3.041305 2.751024 +v -0.680527 3.098831 2.957105 +v -0.568659 3.102593 3.296206 +v -0.954083 0.094249 2.894208 +v -0.954232 0.819549 2.893992 +v -0.956292 0.826566 2.891933 +v -0.954224 0.833488 2.894003 +v -0.953824 1.553187 2.894573 +v -0.955886 1.558014 2.892512 +v -0.953819 1.562877 2.894580 +v -0.953733 2.285283 2.894703 +v -0.955769 2.289675 2.892678 +v -0.953671 2.295024 2.894788 +v -0.948941 3.041305 2.901272 +v -0.828928 3.098831 3.074621 +v -0.595807 3.102593 3.345100 +v -1.105730 0.094249 3.121198 +v -1.105950 0.819549 3.121054 +v -1.108642 0.826566 3.119941 +v -1.105939 0.833488 3.121062 +v -1.105352 1.553187 3.121436 +v -1.108045 1.558014 3.120321 +v -1.105344 1.562877 3.121440 +v -1.105217 2.285283 3.121521 +v -1.107874 2.289675 3.120429 +v -1.105128 2.295024 3.121576 +v -1.098275 3.041305 3.125756 +v -0.921061 3.098831 3.239983 +v -0.602177 3.102593 3.400661 +v -1.158968 0.094249 3.388942 +v -1.159227 0.819549 3.388893 +v -1.162139 0.826566 3.388895 +v -1.159214 0.833488 3.388896 +v -1.158528 1.553187 3.389016 +v -1.161443 1.558014 3.389017 +v -1.158519 1.562877 3.389018 +v -1.158371 2.285283 3.389044 +v -1.161243 2.289675 3.389051 +v -1.158267 2.295024 3.389060 +v -1.150337 3.041305 3.390300 +v -0.942899 3.098831 3.428014 +v -0.586800 3.102593 3.454430 +v -1.105693 0.094249 3.656678 +v -1.105950 0.819549 3.656732 +v -1.108641 0.826566 3.657848 +v -1.105937 0.833488 3.656729 +v -1.105257 1.553187 3.656578 +v -1.107950 1.558014 3.657694 +v -1.105248 1.562877 3.656576 +v -1.105102 2.285283 3.656544 +v -1.107753 2.289675 3.657650 +v -1.105000 2.295024 3.656519 +v -1.097199 3.041305 3.654630 +v -0.891119 3.098831 3.610090 +v -0.552017 3.102593 3.498222 +v -0.954015 0.094249 3.883646 +v -0.954232 0.819549 3.883795 +v -0.956291 0.826566 3.885855 +v -0.954221 0.833488 3.883787 +v -0.953650 1.553187 3.883388 +v -0.955711 1.558014 3.885449 +v -0.953643 1.562877 3.883382 +v -0.953520 2.285283 3.883296 +v -0.955546 2.289675 3.885332 +v -0.953436 2.295024 3.883234 +v -0.946951 3.041305 3.878504 +v -0.773602 3.098831 3.758491 +v -0.503124 3.102593 3.525370 +v -0.727025 0.094249 4.035293 +v -0.727169 0.819549 4.035514 +v -0.728282 0.826566 4.038205 +v -0.727162 0.833488 4.035502 +v -0.726788 1.553187 4.034915 +v -0.727902 1.558014 4.037608 +v -0.726783 1.562877 4.034907 +v -0.726702 2.285283 4.034780 +v -0.727795 2.289675 4.037437 +v -0.726647 2.295024 4.034691 +v -0.722467 3.041305 4.027839 +v -0.608241 3.098831 3.850624 +v -0.447563 3.102593 3.531740 +v -0.459282 0.094249 4.088531 +v -0.459330 0.819549 4.088790 +v -0.459329 0.826566 4.091702 +v -0.459328 0.833488 4.088777 +v -0.459207 1.553187 4.088091 +v -0.459207 1.558014 4.091006 +v -0.459206 1.562877 4.088082 +v -0.459180 2.285283 4.087934 +v -0.459172 2.289675 4.090806 +v -0.459164 2.295024 4.087831 +v -0.457923 3.041305 4.079900 +v -0.420209 3.098831 3.872462 +v -0.393793 3.102593 3.516364 +v -0.191545 0.094249 4.035256 +v -0.191491 0.819549 4.035513 +v -0.190376 0.826566 4.038204 +v -0.191494 0.833488 4.035501 +v -0.191645 1.553187 4.034821 +v -0.190529 1.558014 4.037513 +v -0.191647 1.562877 4.034811 +v -0.191680 2.285283 4.034665 +v -0.190574 2.289675 4.037316 +v -0.191705 2.295024 4.034563 +v -0.193593 3.041305 4.026762 +v -0.238133 3.098831 3.820682 +v -0.350001 3.102593 3.481580 +v 0.035423 0.094249 3.883578 +v 0.035572 0.819549 3.883795 +v 0.037632 0.826566 3.885854 +v 0.035564 0.833488 3.883784 +v 0.035164 1.553187 3.883214 +v 0.037226 1.558014 3.885274 +v 0.035159 1.562877 3.883206 +v 0.035073 2.285283 3.883083 +v 0.037109 2.289675 3.885109 +v 0.035011 2.295024 3.882998 +v 0.030280 3.041305 3.876514 +v -0.089732 3.098831 3.703166 +v -0.322854 3.102593 3.432687 +v 0.187070 0.094249 3.656588 +v 0.187290 0.819549 3.656732 +v 0.189981 0.826566 3.657845 +v 0.187279 0.833488 3.656725 +v 0.186691 1.553187 3.656351 +v 0.189384 1.558014 3.657465 +v 0.186684 1.562877 3.656346 +v 0.186557 2.285283 3.656265 +v 0.189213 2.289675 3.657358 +v 0.186467 2.295024 3.656211 +v 0.179616 3.041305 3.652030 +v 0.002400 3.098831 3.537804 +v -0.316483 3.102593 3.377126 +v 0.240308 0.094249 3.388845 +v 0.240566 0.819549 3.388893 +v 0.243479 0.826566 3.388892 +v 0.240553 0.833488 3.388891 +v 0.239868 1.553187 3.388771 +v 0.242782 1.558014 3.388770 +v 0.239858 1.562877 3.388769 +v 0.239710 2.285283 3.388743 +v 0.242583 2.289675 3.388736 +v 0.239607 2.295024 3.388727 +v 0.231677 3.041305 3.387486 +v 0.024239 3.098831 3.349772 +v -0.331860 3.102593 3.323356 +v 0.187033 0.094249 3.121109 +v 0.187290 0.819549 3.121054 +v 0.189980 0.826566 3.119939 +v 0.187277 0.833488 3.121057 +v 0.186597 1.553187 3.121208 +v 0.189290 1.558014 3.120092 +v 0.186588 1.562877 3.121210 +v 0.186441 2.285283 3.121243 +v 0.189093 2.289675 3.120137 +v 0.186340 2.295024 3.121268 +v 0.178539 3.041305 3.123157 +v -0.027542 3.098831 3.167696 +v -0.366643 3.102593 3.279564 +v 0.035354 0.094249 2.894140 +v 0.035571 0.819549 2.893991 +v 0.037630 0.826566 2.891931 +v 0.035560 0.833488 2.893999 +v 0.034990 1.553187 2.894399 +v 0.037051 1.558014 2.892337 +v 0.034982 1.562877 2.894404 +v 0.034860 2.285283 2.894490 +v 0.036886 2.289675 2.892454 +v 0.034775 2.295024 2.894552 +v 0.028291 3.041305 2.899283 +v -0.145058 3.098831 3.019295 +v -0.415537 3.102593 3.252417 +v -0.191635 0.094249 2.742493 +v -0.191491 0.819549 2.742273 +v -0.190378 0.826566 2.739582 +v -0.191499 0.833488 2.742284 +v -0.191872 1.553187 2.742872 +v -0.190758 1.558014 2.740179 +v -0.191877 1.562877 2.742880 +v -0.191958 2.285283 2.743006 +v -0.190865 2.289675 2.740350 +v -0.192012 2.295024 2.743096 +v -0.196193 3.041305 2.749948 +v -0.310419 3.098831 2.927163 +v -0.471098 3.102593 3.246046 +v -0.445523 3.148009 3.451283 +v -0.445521 3.148009 3.451282 +v -0.459868 3.148009 3.459566 +v -0.459867 3.148009 3.476132 +v -0.445521 3.148009 3.484414 +v -0.431174 3.148009 3.476131 +v -0.431174 3.148009 3.476130 +v -0.431175 3.148009 3.459565 +v -0.419601 3.229638 3.295439 +v -0.418428 3.229638 3.288490 +v -0.421801 3.229638 3.288368 +v -0.419094 3.229638 3.281474 +v -0.422827 3.229638 3.294448 +v -0.422532 3.229638 3.301848 +v -0.422827 3.229638 3.294448 +v -0.425392 3.229638 3.300056 +v -0.427023 3.229638 3.307281 +v -0.425392 3.229638 3.300056 +v -0.429321 3.229638 3.304809 +v -0.429321 3.229638 3.304809 +v -0.432766 3.229638 3.311366 +v -0.434346 3.229638 3.308383 +v -0.439371 3.229638 3.313825 +v -0.440125 3.229638 3.310535 +v -0.440125 3.229638 3.310535 +v -0.446387 3.229638 3.314491 +v -0.446264 3.229638 3.311118 +v -0.453336 3.229638 3.313318 +v -0.452345 3.229638 3.310092 +v -0.459745 3.229638 3.310387 +v -0.457953 3.229638 3.307527 +v -0.465177 3.229638 3.305897 +v -0.457953 3.229638 3.307527 +v -0.462706 3.229638 3.303598 +v -0.469262 3.229638 3.300153 +v -0.462706 3.229638 3.303598 +v -0.466280 3.229638 3.298573 +v -0.466280 3.229638 3.298573 +v -0.471721 3.229638 3.293548 +v -0.468432 3.229638 3.292794 +v -0.468432 3.229638 3.292794 +v -0.472387 3.229638 3.286532 +v -0.469015 3.229638 3.286655 +v -0.471215 3.229638 3.279583 +v -0.469015 3.229638 3.286655 +v -0.467989 3.229638 3.280574 +v -0.468283 3.229638 3.273174 +v -0.467989 3.229638 3.280574 +v -0.465424 3.229638 3.274966 +v -0.463793 3.229638 3.267742 +v -0.465424 3.229638 3.274966 +v -0.461495 3.229638 3.270213 +v -0.458050 3.229638 3.263657 +v -0.461495 3.229638 3.270213 +v -0.456470 3.229638 3.266639 +v -0.456470 3.229638 3.266639 +v -0.451445 3.229638 3.261198 +v -0.450690 3.229638 3.264487 +v -0.450690 3.229638 3.264487 +v -0.444429 3.229638 3.260531 +v -0.444551 3.229638 3.263904 +v -0.437480 3.229638 3.261704 +v -0.438471 3.229638 3.264930 +v -0.431070 3.229638 3.264636 +v -0.438471 3.229638 3.264930 +v -0.432863 3.229638 3.267495 +v -0.432863 3.229638 3.267495 +v -0.425638 3.229638 3.269126 +v -0.428109 3.229638 3.271424 +v -0.428109 3.229638 3.271424 +v -0.421554 3.229638 3.274869 +v -0.424535 3.229638 3.276449 +v -0.424535 3.229638 3.276449 +v -0.422383 3.229638 3.282228 +v -0.422827 3.235215 3.294448 +v -0.421801 3.235215 3.288368 +v -0.425392 3.235215 3.300056 +v -0.429321 3.235215 3.304809 +v -0.434346 3.235215 3.308384 +v -0.440125 3.235215 3.310535 +v -0.446264 3.235215 3.311118 +v -0.452345 3.235215 3.310092 +v -0.457953 3.235215 3.307527 +v -0.462706 3.235215 3.303598 +v -0.466280 3.235215 3.298573 +v -0.468432 3.235215 3.292794 +v -0.469015 3.235215 3.286655 +v -0.467989 3.235215 3.280574 +v -0.465424 3.235215 3.274966 +v -0.461495 3.235215 3.270213 +v -0.456470 3.235215 3.266639 +v -0.450690 3.235215 3.264487 +v -0.444551 3.235215 3.263904 +v -0.438471 3.235215 3.264930 +v -0.432863 3.235215 3.267495 +v -0.428109 3.235215 3.271424 +v -0.424535 3.235215 3.276449 +v -0.422383 3.235215 3.282228 +v -0.428288 3.228788 3.308181 +v -0.463980 3.228788 3.306886 +v -0.432766 3.229018 3.311366 +v -0.439371 3.229006 3.313825 +v -0.446387 3.229002 3.314491 +v -0.453336 3.229006 3.313318 +v -0.459745 3.229018 3.310387 +v -0.427905 3.172996 3.308195 +v -0.427905 3.228788 3.308195 +v -0.428082 3.172995 3.404269 +v -0.464541 3.172995 3.402946 +v -0.464363 3.228788 3.306872 +v -0.464601 3.172879 3.306845 +v -0.463935 3.172995 3.402968 +v -0.464534 3.172995 3.402946 +v -0.428288 3.172996 3.308180 +v -0.464012 3.172995 3.403028 +v -0.464123 3.172995 3.403069 +v -0.464240 3.172995 3.403080 +v -0.464356 3.172995 3.403060 +v -0.464463 3.172995 3.403012 +v -0.419601 3.172996 3.295439 +v -0.422532 3.172996 3.301848 +v -0.427023 3.172996 3.307281 +v -0.471721 3.172996 3.293548 +v -0.472387 3.172996 3.286532 +v -0.471215 3.172996 3.279583 +v -0.468283 3.172996 3.273174 +v -0.463793 3.172996 3.267741 +v -0.458050 3.172996 3.263657 +v -0.451445 3.172996 3.261198 +v -0.444429 3.172996 3.260531 +v -0.437480 3.172996 3.261704 +v -0.431070 3.172996 3.264635 +v -0.425639 3.172996 3.269126 +v -0.421554 3.172996 3.274869 +v -0.419094 3.172996 3.281474 +v -0.506448 3.165919 3.282116 +v -0.524443 3.172996 3.317315 +v -0.506448 3.172996 3.282116 +v -0.524443 3.165919 3.317315 +v -0.522428 3.172996 3.356796 +v -0.522428 3.165919 3.356796 +v -0.500942 3.172996 3.389979 +v -0.500942 3.165919 3.389979 +v -0.500942 3.165919 3.389979 +v -0.465743 3.172995 3.407974 +v -0.465743 3.165919 3.407974 +v -0.465743 3.165919 3.407974 +v -0.445870 3.165919 3.409565 +v -0.426262 3.172995 3.405959 +v -0.426262 3.165919 3.405959 +v -0.426262 3.165919 3.405959 +v -0.408256 3.172995 3.397400 +v -0.408256 3.165919 3.397400 +v -0.381764 3.172996 3.368058 +v -0.381764 3.165919 3.368058 +v -0.373492 3.172996 3.329401 +v -0.373492 3.165919 3.329401 +v -0.373492 3.165919 3.329401 +v -0.385657 3.172996 3.291787 +v -0.385657 3.165919 3.291787 +v -0.385657 3.165919 3.291787 +v -0.415000 3.172996 3.265295 +v -0.415000 3.165919 3.265295 +v -0.433784 3.172996 3.258615 +v -0.433784 3.165919 3.258615 +v -0.453657 3.172996 3.257023 +v -0.433784 3.165919 3.258615 +v -0.473265 3.165919 3.260630 +v -0.491271 3.172996 3.269189 +v -0.491271 3.165919 3.269189 +v -0.491271 3.165919 3.269189 +v -0.511673 3.165919 3.277398 +v -0.531327 3.165919 3.315842 +v -0.529126 3.165919 3.358962 +v -0.505659 3.165919 3.395205 +v -0.467215 3.165919 3.414858 +v -0.424095 3.165919 3.412657 +v -0.404430 3.165919 3.403309 +v -0.375496 3.165919 3.371263 +v -0.366461 3.165919 3.329042 +v -0.379748 3.165919 3.287961 +v -0.411795 3.165919 3.259027 +v -0.432311 3.165919 3.251730 +v -0.454016 3.165919 3.249993 +v -0.475431 3.165919 3.253932 +v -0.495097 3.165919 3.263279 +v -0.511673 3.148010 3.277398 +v -0.531327 3.148010 3.315842 +v -0.529126 3.148010 3.358962 +v -0.505659 3.148009 3.395205 +v -0.467215 3.148009 3.414858 +v -0.424095 3.148009 3.412657 +v -0.404430 3.148009 3.403309 +v -0.375496 3.148010 3.371263 +v -0.366461 3.148010 3.329042 +v -0.379748 3.148010 3.287961 +v -0.411795 3.148010 3.259027 +v -0.432311 3.148010 3.251730 +v -0.454016 3.148010 3.249993 +v -0.475431 3.148010 3.253932 +v -0.495097 3.148010 3.263279 +v -0.502976 3.148010 3.249215 +v -0.566763 3.148010 3.290516 +v -0.601354 3.148010 3.358177 +v -0.604412 3.148009 3.396378 +v -0.597479 3.148009 3.434069 +v -0.556178 3.148009 3.497855 +v -0.488517 3.148009 3.532446 +v -0.412626 3.148009 3.528572 +v -0.348839 3.148009 3.487271 +v -0.314249 3.148009 3.419610 +v -0.318123 3.148010 3.343718 +v -0.359424 3.148010 3.279932 +v -0.427085 3.148010 3.245341 +v -0.566763 3.102593 3.290516 +v -0.601353 3.102593 3.358177 +v -0.597479 3.102592 3.434069 +v -0.556178 3.102593 3.497855 +v -0.488517 3.102593 3.532446 +v -0.412626 3.102592 3.528572 +v -0.348839 3.102593 3.487271 +v -0.314249 3.102593 3.419610 +v -0.318123 3.102592 3.343718 +v -0.359424 3.102593 3.279931 +v -0.427085 3.102593 3.245341 +v -0.502976 3.102592 3.249215 +v -0.322854 3.102593 3.432687 +v -0.089732 3.098831 3.703166 +v -0.089732 3.098831 3.703166 +v 0.002400 3.098831 3.537804 +v 0.240566 0.819549 3.388893 +v 0.187070 0.094249 3.656588 +v 0.189981 0.826566 3.657845 +v 0.187290 0.819549 3.656732 +v 0.187290 0.819549 3.656732 +v 0.240566 0.819549 3.388893 +v 0.187279 0.833488 3.656725 +v 0.189981 0.826566 3.657845 +v 0.189981 0.826566 3.657845 +v 0.186691 1.553187 3.656351 +v 0.187279 0.833488 3.656725 +v 0.187279 0.833488 3.656725 +v 0.189384 1.558014 3.657465 +v 0.186691 1.553187 3.656351 +v 0.186691 1.553187 3.656351 +v 0.186684 1.562877 3.656346 +v 0.189384 1.558014 3.657465 +v 0.189384 1.558014 3.657465 +v 0.186557 2.285283 3.656265 +v 0.186684 1.562877 3.656346 +v 0.186684 1.562877 3.656346 +v 0.189213 2.289675 3.657358 +v 0.186557 2.285283 3.656265 +v 0.186557 2.285283 3.656265 +v 0.186467 2.295024 3.656211 +v 0.189213 2.289675 3.657358 +v 0.189213 2.289675 3.657358 +v 0.179616 3.041305 3.652030 +v 0.186467 2.295024 3.656211 +v 0.186467 2.295024 3.656211 +v 0.002400 3.098831 3.537804 +v 0.179616 3.041305 3.652030 +v 0.179616 3.041305 3.652030 +v 0.002400 3.098831 3.537804 +v 0.002400 3.098831 3.537804 +v 0.240566 0.819549 3.388893 +v 0.240566 0.819549 3.388893 +v 0.240566 0.819549 3.388893 +v -0.464012 3.172995 3.403028 +v -0.408256 3.172995 3.397400 +v -0.408256 3.165919 3.397400 +v -0.408256 3.165919 3.397400 +v -0.408256 3.165919 3.397400 +v -0.404430 3.165919 3.403309 +v -0.408256 3.165919 3.397400 +v -0.428082 3.172995 3.404269 +v -0.428082 3.172995 3.404269 +v -0.408256 3.172995 3.397400 +v -0.428082 3.172995 3.404269 +v -0.463935 3.172995 3.402968 +v -0.463935 3.172995 3.402968 +v -0.464012 3.172995 3.403028 +v -0.464012 3.172995 3.403028 +v -0.404430 3.165919 3.403309 +v -0.404430 3.148009 3.403309 +v -0.404430 3.148009 3.403309 +v -0.404430 3.148009 3.403309 +v -0.314249 3.148009 3.419610 +v -0.404430 3.148009 3.403309 +v -0.314249 3.148009 3.419610 +v -0.314249 3.102593 3.419610 +v -0.314249 3.102593 3.419610 +vt 0.250000 0.230916 +vt 0.250011 -0.000000 +vt 0.312500 0.230916 +vt 0.312511 -0.000000 +vt 0.250000 0.233150 +vt 0.312500 0.233150 +vt 0.250001 0.235354 +vt 0.312501 0.235354 +vt 0.250028 0.464487 +vt 0.312528 0.464487 +vt 0.250028 0.466024 +vt 0.312528 0.466024 +vt 0.250028 0.467572 +vt 0.312528 0.467572 +vt 0.250034 0.697567 +vt 0.312534 0.697567 +vt 0.250036 0.698965 +vt 0.312536 0.698965 +vt 0.250038 0.700668 +vt 0.312538 0.700668 +vt 0.250324 0.938264 +vt 0.312824 0.938264 +vt 0.262848 0.956579 +vt 0.325348 0.956579 +vt 0.325581 0.957777 +vt 0.388081 0.957777 +vt 0.375000 0.230916 +vt 0.375011 -0.000000 +vt 0.375000 0.233150 +vt 0.375001 0.235354 +vt 0.375028 0.464487 +vt 0.375028 0.466024 +vt 0.375028 0.467572 +vt 0.375034 0.697567 +vt 0.375036 0.698965 +vt 0.375038 0.700668 +vt 0.375324 0.938264 +vt 0.387848 0.956579 +vt 0.450581 0.957777 +vt 0.437500 0.230916 +vt 0.437511 -0.000000 +vt 0.437500 0.233150 +vt 0.437501 0.235354 +vt 0.437528 0.464487 +vt 0.437528 0.466024 +vt 0.437528 0.467572 +vt 0.437534 0.697567 +vt 0.437536 0.698965 +vt 0.437538 0.700668 +vt 0.437824 0.938264 +vt 0.450348 0.956579 +vt 0.513081 0.957777 +vt 0.500000 0.230916 +vt 0.500011 -0.000000 +vt 0.500000 0.233150 +vt 0.500000 0.235354 +vt 0.500028 0.464487 +vt 0.500028 0.466024 +vt 0.500028 0.467572 +vt 0.500034 0.697567 +vt 0.500036 0.698965 +vt 0.500038 0.700668 +vt 0.500324 0.938264 +vt 0.512848 0.956579 +vt 0.575581 0.957777 +vt 0.562500 0.230916 +vt 0.562511 -0.000000 +vt 0.562500 0.233150 +vt 0.562500 0.235354 +vt 0.562528 0.464487 +vt 0.562528 0.466024 +vt 0.562528 0.467572 +vt 0.562534 0.697567 +vt 0.562536 0.698965 +vt 0.562538 0.700668 +vt 0.562824 0.938264 +vt 0.575348 0.956579 +vt 0.638081 0.957777 +vt 0.625000 0.230916 +vt 0.625011 -0.000000 +vt 0.625000 0.233150 +vt 0.625000 0.235354 +vt 0.625028 0.464487 +vt 0.625028 0.466024 +vt 0.625028 0.467572 +vt 0.625034 0.697567 +vt 0.625036 0.698965 +vt 0.625038 0.700668 +vt 0.625324 0.938264 +vt 0.637848 0.956579 +vt 0.700581 0.957777 +vt 0.687500 0.230916 +vt 0.687511 -0.000000 +vt 0.687500 0.233150 +vt 0.687501 0.235354 +vt 0.687528 0.464487 +vt 0.687528 0.466024 +vt 0.687528 0.467572 +vt 0.687534 0.697567 +vt 0.687536 0.698965 +vt 0.687538 0.700668 +vt 0.687824 0.938264 +vt 0.700348 0.956579 +vt 0.763081 0.957777 +vt 0.750000 0.230916 +vt 0.750011 -0.000000 +vt 0.750000 0.233150 +vt 0.750001 0.235354 +vt 0.750028 0.464487 +vt 0.750028 0.466024 +vt 0.750028 0.467572 +vt 0.750034 0.697567 +vt 0.750036 0.698965 +vt 0.750038 0.700668 +vt 0.750324 0.938264 +vt 0.762848 0.956579 +vt 0.825581 0.957777 +vt 0.812500 0.230916 +vt 0.812511 -0.000000 +vt 0.812500 0.233150 +vt 0.812501 0.235354 +vt 0.812528 0.464487 +vt 0.812528 0.466024 +vt 0.812528 0.467572 +vt 0.812534 0.697567 +vt 0.812536 0.698965 +vt 0.812538 0.700668 +vt 0.812824 0.938264 +vt 0.825348 0.956579 +vt 0.888081 0.957777 +vt 0.875000 0.230916 +vt 0.875011 -0.000000 +vt 0.875000 0.233150 +vt 0.875001 0.235354 +vt 0.875028 0.464487 +vt 0.875028 0.466024 +vt 0.875028 0.467572 +vt 0.875034 0.697567 +vt 0.875036 0.698965 +vt 0.875038 0.700668 +vt 0.875324 0.938264 +vt 0.887848 0.956579 +vt 0.950581 0.957777 +vt 0.937500 0.230916 +vt 0.937511 -0.000000 +vt 0.937500 0.233150 +vt 0.937501 0.235354 +vt 0.937528 0.464487 +vt 0.937528 0.466024 +vt 0.937528 0.467572 +vt 0.937534 0.697567 +vt 0.937536 0.698965 +vt 0.937538 0.700668 +vt 0.937824 0.938264 +vt 0.950348 0.956579 +vt -0.049419 0.957777 +vt -0.112152 0.956579 +vt 0.013081 0.957777 +vt -0.049652 0.956579 +vt 1.000000 0.230916 +vt -0.000000 0.230916 +vt -0.062489 -0.000000 +vt 0.000011 -0.000000 +vt -0.062500 0.233150 +vt -0.062500 0.230916 +vt 0.000000 0.233150 +vt -0.062499 0.235354 +vt 0.000001 0.235354 +vt -0.062472 0.464487 +vt 0.000028 0.464487 +vt -0.062472 0.466024 +vt 0.000028 0.466024 +vt -0.062472 0.467572 +vt 0.000028 0.467572 +vt -0.062466 0.697567 +vt 0.000034 0.697567 +vt -0.062464 0.698965 +vt 0.000036 0.698965 +vt -0.062462 0.700668 +vt 0.000038 0.700668 +vt -0.062176 0.938264 +vt 0.000324 0.938264 +vt 0.012848 0.956579 +vt 0.075581 0.957777 +vt 0.062500 0.230916 +vt 0.062511 -0.000000 +vt 0.062500 0.233150 +vt 0.062501 0.235354 +vt 0.062528 0.464487 +vt 0.062528 0.466024 +vt 0.062528 0.467572 +vt 0.062534 0.697567 +vt 0.062536 0.698965 +vt 0.062538 0.700668 +vt 0.062824 0.938264 +vt 0.075348 0.956579 +vt 0.138081 0.957777 +vt 0.125000 0.230916 +vt 0.125011 -0.000000 +vt 0.125000 0.233150 +vt 0.125001 0.235354 +vt 0.125028 0.464487 +vt 0.125028 0.466024 +vt 0.125028 0.467572 +vt 0.125034 0.697567 +vt 0.125036 0.698965 +vt 0.125038 0.700668 +vt 0.125324 0.938264 +vt 0.137848 0.956579 +vt 0.200581 0.957777 +vt 0.187500 0.230916 +vt 0.187511 -0.000000 +vt 0.187500 0.233150 +vt 0.187501 0.235354 +vt 0.187528 0.464487 +vt 0.187528 0.466024 +vt 0.187528 0.467572 +vt 0.187534 0.697567 +vt 0.187536 0.698965 +vt 0.187538 0.700668 +vt 0.187824 0.938264 +vt 0.200348 0.956579 +vt 0.263081 0.957777 +vt 0.186024 0.998224 +vt 0.188431 0.998224 +vt 0.193133 0.998224 +vt 0.192960 0.998224 +vt 0.191301 0.998224 +vt 0.186344 0.998224 +vt 0.191921 0.998224 +vt 0.190009 0.998224 +vt 0.195441 0.998224 +vt 0.197462 0.998224 +vt 0.202110 0.998224 +vt 0.208640 0.998224 +vt 0.211746 0.998224 +vt 0.222587 0.998224 +vt 0.223510 0.998224 +vt 0.237403 0.998224 +vt 0.235929 0.998224 +vt 0.250841 0.998224 +vt 0.247306 0.998224 +vt 0.261194 0.998224 +vt 0.256296 0.998224 +vt 0.267739 0.998224 +vt 0.262223 0.998224 +vt 0.270569 0.998224 +vt 0.265030 0.998224 +vt 0.270193 0.998224 +vt 0.265031 0.998224 +vt 0.267236 0.998224 +vt 0.262695 0.998224 +vt 0.262289 0.998224 +vt 0.258505 0.998224 +vt 0.255860 0.998224 +vt 0.252903 0.998224 +vt 0.248373 0.998224 +vt 0.246277 0.998224 +vt 0.240185 0.998224 +vt 0.238965 0.998224 +vt 0.231607 0.998224 +vt 0.231269 0.998224 +vt 0.222922 0.998224 +vt 0.223467 0.998224 +vt 0.214409 0.998224 +vt 0.215835 0.998224 +vt 0.206356 0.998224 +vt 0.208656 0.998224 +vt 0.199083 0.998224 +vt 0.202238 0.998224 +vt 0.196930 0.998224 +vt 0.191301 1.000000 +vt 0.195441 1.000000 +vt 0.191921 1.000000 +vt 0.202110 1.000000 +vt 0.211746 1.000000 +vt 0.223510 1.000000 +vt 0.235929 1.000000 +vt 0.247306 1.000000 +vt 0.256296 1.000000 +vt 0.262223 1.000000 +vt 0.265030 1.000000 +vt 0.265031 1.000000 +vt 0.262695 1.000000 +vt 0.258505 1.000000 +vt 0.252903 1.000000 +vt 0.246277 1.000000 +vt 0.238965 1.000000 +vt 0.231269 1.000000 +vt 0.223467 1.000000 +vt 0.215835 1.000000 +vt 0.208656 1.000000 +vt 0.202238 1.000000 +vt 0.196930 1.000000 +vt 0.193133 1.000000 +vt 0.191565 0.997954 +vt 0.259015 0.997954 +vt 0.197462 0.998027 +vt 0.208640 0.998023 +vt 0.222587 0.998022 +vt 0.237403 0.998023 +vt 0.250841 0.998027 +vt 0.190898 0.980191 +vt 0.190898 0.997954 +vt -0.072776 0.980191 +vt 0.693488 0.980191 +vt 0.259755 0.997954 +vt 0.260209 0.980154 +vt -0.300317 0.980191 +vt 0.693553 0.980191 +vt 0.191565 0.980191 +vt -0.300905 0.980191 +vt 0.698116 0.980191 +vt 0.699095 0.980191 +vt 0.696973 0.980191 +vt 0.695742 0.980191 +vt 0.694498 0.980191 +vt 0.186024 0.980191 +vt 0.186345 0.980191 +vt 0.190009 0.980191 +vt 0.270569 0.980191 +vt 0.270193 0.980191 +vt 0.267236 0.980191 +vt 0.262289 0.980191 +vt 0.255860 0.980191 +vt 0.248373 0.980191 +vt 0.240185 0.980191 +vt 0.231607 0.980191 +vt 0.222922 0.980191 +vt 0.214409 0.980191 +vt 0.206356 0.980191 +vt 0.199083 0.980191 +vt 0.192960 0.980191 +vt 0.316140 0.977938 +vt 0.367478 0.980191 +vt 0.316140 0.980191 +vt 0.367478 0.977938 +vt 0.425104 0.980191 +vt 0.425104 0.977938 +vt 0.504152 0.980191 +vt 0.504152 0.977938 +vt 0.698401 0.980191 +vt 0.698401 0.977938 +vt 0.841862 0.977938 +vt 0.924176 0.980191 +vt 0.924176 0.977938 +vt 0.973733 0.980191 +vt 0.973733 0.977938 +vt -0.026267 0.980191 +vt -0.026267 0.977938 +vt 0.041765 0.980191 +vt 0.041765 0.977938 +vt 0.096459 0.980191 +vt 0.096458 0.977938 +vt 0.146703 0.980191 +vt 0.146703 0.977938 +vt 0.195191 0.980191 +vt 0.195191 0.977938 +vt 0.219182 0.980191 +vt 0.219182 0.977938 +vt 0.243157 0.980191 +vt 0.267223 0.977938 +vt 0.291500 0.980191 +vt 0.291500 0.977938 +vt 0.319857 0.977938 +vt 0.373843 0.977938 +vt 0.435523 0.977938 +vt 0.521549 0.977938 +vt 0.703074 0.977938 +vt 0.905563 0.977938 +vt 0.959131 0.977938 +vt -0.040869 0.977938 +vt 0.032990 0.977938 +vt 0.091113 0.977938 +vt 0.143737 0.977938 +vt 0.194155 0.977938 +vt 0.219045 0.977938 +vt 0.243914 0.977938 +vt 0.268898 0.977938 +vt 0.294149 0.977938 +vt 0.927224 0.980191 +vt 0.699683 0.980191 +vt 0.319857 0.972236 +vt 0.373843 0.972236 +vt 0.435523 0.972236 +vt 0.521549 0.972236 +vt 0.703074 0.972236 +vt 0.905563 0.972236 +vt 0.959131 0.972236 +vt -0.040869 0.972236 +vt 0.032991 0.972236 +vt 0.091113 0.972236 +vt 0.143737 0.972236 +vt 0.194155 0.972236 +vt 0.219045 0.972236 +vt 0.243914 0.972236 +vt 0.268898 0.972236 +vt 0.294149 0.972236 +vt 0.298202 0.972236 +vt 0.381998 0.972236 +vt 0.466101 0.972236 +vt 0.508203 0.972236 +vt 0.550300 0.972236 +vt 0.634357 0.972236 +vt 0.718076 0.972236 +vt 0.884220 0.972236 +vt 0.966794 0.972236 +vt -0.033206 0.972236 +vt 0.049279 0.972236 +vt 0.131896 0.972236 +vt 0.214834 0.972236 +vt 0.381998 0.957777 +vt 0.466101 0.957777 +vt 0.550300 0.957776 +vt 0.634357 0.957777 +vt 0.718076 0.957777 +vt 0.801357 0.972236 +vt 0.801357 0.957776 +vt 0.884220 0.957777 +vt 0.966795 0.957777 +vt -0.033205 0.957777 +vt 0.049279 0.957776 +vt 0.131896 0.957777 +vt 0.214834 0.957777 +vt 0.298202 0.957776 +vt 0.784664 0.972236 +vt 0.784668 0.972236 +vt 0.748789 0.972236 +vt 0.749020 0.972236 +vt 0.772851 0.972236 +vt 0.799687 0.972236 +vt 0.799688 0.972236 +vt 0.810339 0.972236 +vn -0.195091 -0.000336 -0.980785 +vn -0.195159 -0.000363 -0.980771 +vn -0.180693 -0.377045 -0.908398 +vn -0.180694 -0.377019 -0.908409 +vn -0.180228 0.382872 -0.906050 +vn -0.180218 0.382966 -0.906012 +vn -0.195262 0.000902 -0.980751 +vn -0.195094 0.000967 -0.980784 +vn -0.168010 -0.509584 -0.843858 +vn -0.168017 -0.509500 -0.843907 +vn -0.168206 0.507880 -0.844846 +vn -0.168205 0.507886 -0.844843 +vn -0.195301 0.000194 -0.980743 +vn -0.195264 0.000208 -0.980751 +vn -0.164384 -0.540014 -0.825447 +vn -0.164418 -0.539683 -0.825657 +vn -0.171487 0.478735 -0.861049 +vn -0.171421 0.479236 -0.860783 +vn -0.197077 0.010090 -0.980336 +vn -0.195313 0.010746 -0.980682 +vn -0.079570 0.956757 -0.279793 +vn -0.051883 0.964728 -0.258086 +vn -0.008916 0.999897 -0.011225 +vn -0.002884 0.999944 -0.010142 +vn -0.555570 -0.000337 -0.831470 +vn -0.555627 -0.000363 -0.831432 +vn -0.514561 -0.377072 -0.770093 +vn -0.514572 -0.377020 -0.770112 +vn -0.513228 0.382919 -0.768095 +vn -0.513217 0.382965 -0.768080 +vn -0.555717 0.000901 -0.831371 +vn -0.555573 0.000967 -0.831467 +vn -0.478175 -0.509507 -0.715368 +vn -0.478153 -0.509576 -0.715333 +vn -0.478737 0.507802 -0.716204 +vn -0.478690 0.507938 -0.716139 +vn -0.555749 0.000194 -0.831350 +vn -0.555719 0.000208 -0.831370 +vn -0.467750 -0.540033 -0.699696 +vn -0.467874 -0.539665 -0.699897 +vn -0.487931 0.478772 -0.729863 +vn -0.487782 0.479232 -0.729661 +vn -0.557234 0.010090 -0.830294 +vn -0.555737 0.010746 -0.831289 +vn -0.180586 0.956757 -0.228045 +vn -0.146699 0.964728 -0.218585 +vn -0.012533 0.999897 -0.006958 +vn -0.006546 0.999944 -0.008266 +vn -0.831470 -0.000337 -0.555570 +vn -0.831508 -0.000362 -0.555513 +vn -0.770098 -0.377061 -0.514562 +vn -0.770112 -0.377020 -0.514572 +vn -0.768103 0.382905 -0.513226 +vn -0.768077 0.382977 -0.513211 +vn -0.831567 0.000902 -0.555424 +vn -0.831471 0.000967 -0.555567 +vn -0.715494 -0.509591 -0.477896 +vn -0.715509 -0.509561 -0.477906 +vn -0.716341 0.507870 -0.478460 +vn -0.716325 0.507902 -0.478450 +vn -0.831589 0.000194 -0.555391 +vn -0.831568 0.000208 -0.555423 +vn -0.699914 -0.540018 -0.467441 +vn -0.700074 -0.539710 -0.467556 +vn -0.730098 0.478767 -0.487585 +vn -0.729875 0.479244 -0.487450 +vn -0.832557 0.010090 -0.553848 +vn -0.831554 0.010746 -0.555340 +vn -0.254108 0.956757 -0.141579 +vn -0.219181 0.964728 -0.145808 +vn -0.014241 0.999897 -0.001633 +vn -0.009211 0.999944 -0.005132 +vn -0.980785 -0.000337 -0.195090 +vn -0.980799 -0.000362 -0.195022 +vn -0.908387 -0.377075 -0.180687 +vn -0.908407 -0.377024 -0.180693 +vn -0.906032 0.382921 -0.180218 +vn -0.906016 0.382959 -0.180216 +vn -0.980819 0.000902 -0.194918 +vn -0.980786 0.000967 -0.195087 +vn -0.843932 -0.509559 -0.167715 +vn -0.843924 -0.509573 -0.167713 +vn -0.844934 0.507831 -0.167911 +vn -0.844873 0.507935 -0.167902 +vn -0.980827 0.000194 -0.194880 +vn -0.980820 0.000208 -0.194915 +vn -0.825485 -0.540071 -0.164006 +vn -0.825720 -0.539695 -0.164062 +vn -0.861110 0.478774 -0.171072 +vn -0.860861 0.479234 -0.171035 +vn -0.981130 0.010090 -0.193084 +vn -0.980775 0.010746 -0.194845 +vn -0.288945 0.956757 -0.033559 +vn -0.258295 0.964728 -0.050832 +vn -0.013782 0.999897 0.003941 +vn -0.010474 0.999944 -0.001216 +vn -0.980785 -0.000336 0.195090 +vn -0.980772 -0.000363 0.195158 +vn -0.908386 -0.377077 0.180690 +vn -0.908408 -0.377021 0.180693 +vn -0.906037 0.382905 0.180225 +vn -0.906007 0.382980 0.180217 +vn -0.980751 0.000902 0.195263 +vn -0.980784 0.000967 0.195094 +vn -0.843852 -0.509595 0.168008 +vn -0.843876 -0.509555 0.168012 +vn -0.844851 0.507871 0.168208 +vn -0.844818 0.507928 0.168201 +vn -0.980743 0.000194 0.195302 +vn -0.980750 0.000208 0.195266 +vn -0.825430 -0.540041 0.164380 +vn -0.825615 -0.539750 0.164410 +vn -0.861033 0.478764 0.171484 +vn -0.860768 0.479265 0.171418 +vn -0.980337 0.010090 0.197075 +vn -0.980682 0.010745 0.195313 +vn -0.279794 0.956757 0.079571 +vn -0.258086 0.964728 0.051882 +vn -0.011225 0.999897 0.008916 +vn -0.010142 0.999944 0.002884 +vn -0.831470 -0.000337 0.555569 +vn -0.831431 -0.000363 0.555628 +vn -0.770090 -0.377080 0.514559 +vn -0.770118 -0.377001 0.514575 +vn -0.768091 0.382931 0.513225 +vn -0.768076 0.382977 0.513213 +vn -0.831371 0.000902 0.555717 +vn -0.831468 0.000968 0.555572 +vn -0.715338 -0.509568 0.478156 +vn -0.715333 -0.509577 0.478152 +vn -0.716175 0.507863 0.478716 +vn -0.716158 0.507897 0.478704 +vn -0.831350 0.000194 0.555749 +vn -0.831371 0.000208 0.555717 +vn -0.699662 -0.540096 0.467728 +vn -0.699883 -0.539692 0.467864 +vn -0.729852 0.478797 0.487923 +vn -0.729661 0.479232 0.487782 +vn -0.830294 0.010089 0.557234 +vn -0.831289 0.010746 0.555736 +vn -0.228044 0.956757 0.180585 +vn -0.218585 0.964728 0.146699 +vn -0.006959 0.999897 0.012532 +vn -0.008266 0.999944 0.006546 +vn -0.555570 -0.000337 0.831470 +vn -0.555513 -0.000363 0.831508 +vn -0.514566 -0.377042 0.770104 +vn -0.514573 -0.377013 0.770114 +vn -0.513225 0.382913 0.768100 +vn -0.513212 0.382978 0.768077 +vn -0.555424 0.000902 0.831567 +vn -0.555568 0.000967 0.831471 +vn -0.477899 -0.509580 0.715500 +vn -0.477914 -0.509537 0.715521 +vn -0.478474 0.507824 0.716364 +vn -0.478446 0.507916 0.716318 +vn -0.555391 0.000194 0.831590 +vn -0.555421 0.000208 0.831569 +vn -0.467431 -0.540047 0.699898 +vn -0.467542 -0.539751 0.700053 +vn -0.487581 0.478778 0.730093 +vn -0.487441 0.479277 0.729860 +vn -0.553849 0.010089 0.832556 +vn -0.555340 0.010745 0.831554 +vn -0.141579 0.956757 0.254108 +vn -0.145808 0.964728 0.219181 +vn -0.001633 0.999897 0.014241 +vn -0.005132 0.999944 0.009211 +vn -0.195089 -0.000337 0.980786 +vn -0.195023 -0.000362 0.980799 +vn -0.180687 -0.377072 0.908388 +vn -0.180692 -0.377018 0.908409 +vn -0.180216 0.382930 0.906028 +vn -0.180213 0.382981 0.906007 +vn -0.194917 0.000902 0.980819 +vn -0.195085 0.000967 0.980786 +vn -0.167717 -0.509541 0.843943 +vn -0.167707 -0.509616 0.843899 +vn -0.167910 0.507846 0.844925 +vn -0.167900 0.507957 0.844861 +vn -0.194880 0.000194 0.980827 +vn -0.194916 0.000208 0.980820 +vn -0.164003 -0.540096 0.825469 +vn -0.164063 -0.539691 0.825722 +vn -0.171071 0.478786 0.861103 +vn -0.171035 0.479233 0.860862 +vn -0.193082 0.010089 0.981131 +vn -0.194846 0.010746 0.980775 +vn -0.033559 0.956757 0.288945 +vn -0.050831 0.964728 0.258295 +vn 0.003941 0.999897 0.013782 +vn -0.001216 0.999944 0.010474 +vn 0.195091 -0.000336 0.980785 +vn 0.195157 -0.000362 0.980772 +vn 0.180691 -0.377082 0.908383 +vn 0.180694 -0.377020 0.908408 +vn 0.180222 0.382936 0.906024 +vn 0.180221 0.382940 0.906023 +vn 0.195263 0.000902 0.980751 +vn 0.195093 0.000968 0.980784 +vn 0.168007 -0.509614 0.843841 +vn 0.168014 -0.509531 0.843890 +vn 0.168207 0.507880 0.844846 +vn 0.168206 0.507885 0.844843 +vn 0.195301 0.000194 0.980743 +vn 0.195265 0.000208 0.980750 +vn 0.164381 -0.540045 0.825427 +vn 0.164422 -0.539653 0.825676 +vn 0.171484 0.478765 0.861033 +vn 0.171422 0.479237 0.860783 +vn 0.197077 0.010090 0.980336 +vn 0.195314 0.010746 0.980682 +vn 0.079570 0.956757 0.279793 +vn 0.051883 0.964728 0.258086 +vn 0.008916 0.999897 0.011225 +vn 0.002884 0.999944 0.010142 +vn 0.555570 -0.000336 0.831470 +vn 0.555629 -0.000363 0.831430 +vn 0.514561 -0.377074 0.770092 +vn 0.514572 -0.377019 0.770112 +vn 0.513234 0.382897 0.768102 +vn 0.513215 0.382969 0.768078 +vn 0.555717 0.000902 0.831371 +vn 0.555573 0.000968 0.831467 +vn 0.478167 -0.509531 0.715356 +vn 0.478146 -0.509599 0.715322 +vn 0.478737 0.507800 0.716205 +vn 0.478703 0.507899 0.716158 +vn 0.555749 0.000194 0.831350 +vn 0.555718 0.000208 0.831371 +vn 0.467757 -0.540011 0.699708 +vn 0.467876 -0.539660 0.699900 +vn 0.487930 0.478774 0.729862 +vn 0.487774 0.479256 0.729651 +vn 0.557233 0.010090 0.830295 +vn 0.555737 0.010745 0.831289 +vn 0.180586 0.956757 0.228045 +vn 0.146699 0.964728 0.218586 +vn 0.012532 0.999897 0.006958 +vn 0.006546 0.999944 0.008266 +vn 0.831470 -0.000337 0.555570 +vn 0.831508 -0.000363 0.555513 +vn 0.770098 -0.377061 0.514562 +vn 0.770108 -0.377031 0.514569 +vn 0.768101 0.382911 0.513225 +vn 0.768082 0.382963 0.513215 +vn 0.831567 0.000902 0.555424 +vn 0.831471 0.000967 0.555567 +vn 0.715489 -0.509602 0.477892 +vn 0.715519 -0.509541 0.477913 +vn 0.716370 0.507811 0.478478 +vn 0.716328 0.507896 0.478452 +vn 0.831590 0.000194 0.555390 +vn 0.831569 0.000208 0.555421 +vn 0.699918 -0.540011 0.467443 +vn 0.700072 -0.539715 0.467554 +vn 0.730091 0.478784 0.487579 +vn 0.729868 0.479261 0.487445 +vn 0.832556 0.010089 0.553849 +vn 0.831554 0.010745 0.555340 +vn 0.254108 0.956757 0.141579 +vn 0.219181 0.964728 0.145808 +vn 0.014241 0.999897 0.001633 +vn 0.009211 0.999944 0.005132 +vn 0.980785 -0.000336 0.195090 +vn 0.980799 -0.000362 0.195023 +vn 0.908382 -0.377088 0.180686 +vn 0.908404 -0.377031 0.180693 +vn 0.906034 0.382915 0.180218 +vn 0.906008 0.382977 0.180214 +vn 0.980819 0.000902 0.194918 +vn 0.980786 0.000967 0.195086 +vn 0.843936 -0.509553 0.167715 +vn 0.843933 -0.509557 0.167715 +vn 0.844938 0.507823 0.167912 +vn 0.844874 0.507933 0.167902 +vn 0.980827 0.000194 0.194880 +vn 0.980820 0.000208 0.194915 +vn 0.825491 -0.540061 0.164008 +vn 0.825718 -0.539697 0.164061 +vn 0.861106 0.478780 0.171072 +vn 0.860853 0.479248 0.171034 +vn 0.981131 0.010089 0.193082 +vn 0.980775 0.010746 0.194846 +vn 0.288945 0.956757 0.033559 +vn 0.258296 0.964728 0.050831 +vn 0.013782 0.999897 -0.003941 +vn 0.010474 0.999944 0.001216 +vn 0.980785 -0.000336 -0.195090 +vn 0.980772 -0.000363 -0.195158 +vn 0.908383 -0.377083 -0.180690 +vn 0.908405 -0.377029 -0.180692 +vn 0.906033 0.382913 -0.180224 +vn 0.906006 0.382981 -0.180217 +vn 0.980751 0.000902 -0.195263 +vn 0.980784 0.000967 -0.195093 +vn 0.843861 -0.509580 -0.168010 +vn 0.843879 -0.509548 -0.168013 +vn 0.844859 0.507858 -0.168210 +vn 0.844816 0.507932 -0.168200 +vn 0.980743 0.000194 -0.195302 +vn 0.980750 0.000208 -0.195266 +vn 0.825421 -0.540055 -0.164379 +vn 0.825619 -0.539742 -0.164411 +vn 0.861025 0.478779 -0.171482 +vn 0.860775 0.479252 -0.171419 +vn 0.980337 0.010090 -0.197075 +vn 0.980682 0.010745 -0.195313 +vn 0.279794 0.956757 -0.079571 +vn 0.258086 0.964728 -0.051882 +vn 0.011225 0.999897 -0.008915 +vn 0.010142 0.999944 -0.002884 +vn 0.831469 -0.000337 -0.555571 +vn 0.831431 -0.000362 -0.555628 +vn 0.770091 -0.377076 -0.514561 +vn 0.770109 -0.377026 -0.514571 +vn 0.768094 0.382921 -0.513228 +vn 0.768080 0.382962 -0.513218 +vn 0.831371 0.000902 -0.555717 +vn 0.831467 0.000967 -0.555573 +vn 0.715347 -0.509550 -0.478161 +vn 0.715325 -0.509594 -0.478147 +vn 0.716185 0.507841 -0.478724 +vn 0.716125 0.507966 -0.478681 +vn 0.831351 0.000194 -0.555749 +vn 0.831370 0.000207 -0.555719 +vn 0.699666 -0.540089 -0.467730 +vn 0.699896 -0.539667 -0.467873 +vn 0.729862 0.478774 -0.487931 +vn 0.729650 0.479256 -0.487775 +vn 0.830294 0.010089 -0.557234 +vn 0.831288 0.010745 -0.555737 +vn 0.228045 0.956757 -0.180586 +vn 0.218585 0.964728 -0.146699 +vn 0.006958 0.999897 -0.012533 +vn 0.008266 0.999944 -0.006546 +vn 0.555571 -0.000336 -0.831469 +vn 0.555513 -0.000363 -0.831508 +vn 0.514556 -0.377083 -0.770091 +vn 0.514580 -0.376987 -0.770122 +vn 0.513221 0.382928 -0.768095 +vn 0.513216 0.382952 -0.768086 +vn 0.555425 0.000902 -0.831566 +vn 0.555568 0.000967 -0.831471 +vn 0.477890 -0.509607 -0.715487 +vn 0.477917 -0.509529 -0.715525 +vn 0.478454 0.507885 -0.716334 +vn 0.478445 0.507915 -0.716319 +vn 0.555391 0.000194 -0.831590 +vn 0.555422 0.000208 -0.831568 +vn 0.467442 -0.540016 -0.699915 +vn 0.467552 -0.539721 -0.700069 +vn 0.487585 0.478765 -0.730099 +vn 0.487452 0.479239 -0.729877 +vn 0.553847 0.010089 -0.832557 +vn 0.555341 0.010746 -0.831554 +vn 0.141579 0.956757 -0.254108 +vn 0.145807 0.964728 -0.219181 +vn 0.001633 0.999897 -0.014241 +vn 0.005132 0.999944 -0.009211 +vn 0.195090 -0.000337 -0.980785 +vn 0.195023 -0.000362 -0.980799 +vn 0.180690 -0.377045 -0.908399 +vn 0.180694 -0.377003 -0.908415 +vn 0.180219 0.382903 -0.906039 +vn 0.180218 0.382939 -0.906024 +vn 0.194917 0.000902 -0.980819 +vn 0.195087 0.000967 -0.980785 +vn 0.167715 -0.509559 -0.843932 +vn 0.167711 -0.509584 -0.843917 +vn 0.167909 0.507846 -0.844925 +vn 0.167899 0.507957 -0.844861 +vn 0.194879 0.000194 -0.980827 +vn 0.194915 0.000208 -0.980820 +vn 0.164006 -0.540064 -0.825490 +vn 0.164066 -0.539659 -0.825742 +vn 0.171072 0.478772 -0.861111 +vn 0.171037 0.479203 -0.860878 +vn 0.193084 0.010090 -0.981130 +vn 0.194845 0.010746 -0.980775 +vn 0.033559 0.956757 -0.288945 +vn 0.050832 0.964728 -0.258295 +vn -0.003941 0.999897 -0.013782 +vn 0.001216 0.999944 -0.010474 +vn 0.000000 0.000000 0.000000 +vn 0.986066 0.000007 0.166358 +vn 0.986064 -0.000000 0.166364 +vn 0.909398 0.000000 0.415926 +vn 0.770743 0.000000 0.637146 +vn 0.579645 0.000000 0.814869 +vn 0.579619 -0.000035 0.814888 +vn 0.348918 -0.000040 0.937153 +vn 0.348952 -0.000000 0.937141 +vn 0.094451 0.000000 0.995529 +vn -0.166331 0.000000 0.986070 +vn -0.415934 0.000000 0.909395 +vn -0.637128 0.000000 0.770758 +vn -0.814895 0.000000 0.579608 +vn -0.937142 0.000000 0.348949 +vn -0.995529 0.000000 0.094459 +vn -0.986066 -0.000000 -0.166356 +vn -0.909392 -0.000000 -0.415941 +vn -0.770784 -0.000000 -0.637097 +vn -0.579580 -0.000000 -0.814915 +vn -0.348952 -0.000000 -0.937141 +vn -0.094490 -0.000000 -0.995526 +vn 0.166407 0.000000 -0.986057 +vn 0.415901 0.000000 -0.909410 +vn 0.637090 0.000000 -0.770789 +vn 0.814908 0.000000 -0.579590 +vn 0.937146 0.000000 -0.348936 +vn 0.995528 -0.000004 -0.094463 +vn 0.995529 0.000000 -0.094459 +vn 0.579621 0.000047 0.814887 +vn -0.637111 -0.000177 0.770772 +vn 0.579615 -0.000000 0.814891 +vn 0.348906 0.000000 0.937158 +vn 0.094486 0.000000 0.995526 +vn -0.166411 0.000000 0.986056 +vn -0.415902 0.000000 0.909409 +vn -0.637132 0.000000 0.770754 +vn 0.999998 0.000000 0.001845 +vn 0.036055 0.000000 -0.999350 +vn -0.018114 0.864632 0.502079 +vn -0.999991 0.004244 0.000620 +vn -0.018422 0.864628 0.502075 +vn -0.018210 0.864630 0.502079 +vn 0.442788 0.689953 0.572629 +vn 0.036675 0.000317 -0.999327 +vn -0.634286 0.006480 0.773072 +vn -0.018484 0.864628 0.502072 +vn -0.418367 0.786460 0.454367 +vn 0.037296 0.000009 -0.999304 +vn 0.442366 0.690211 0.572643 +vn 0.207313 0.801683 0.560648 +vn 0.207439 0.801643 0.560658 +vn 0.050889 0.839488 0.540990 +vn 0.050629 0.839523 0.540960 +vn -0.087243 0.849872 0.519718 +vn -0.087437 0.849868 0.519692 +vn -0.225222 0.838716 0.495813 +vn -0.223479 0.839022 0.496084 +vn -0.420371 0.785711 0.453812 +vn 0.995009 -0.032192 -0.094453 +vn 0.986055 0.000000 0.166419 +vn 0.909408 0.000000 0.415906 +vn 0.770766 0.000000 0.637119 +vn 0.579642 0.000000 0.814871 +vn -0.814907 0.001411 0.579590 +vn -0.881495 -0.016757 0.471896 +vn -0.937155 0.000000 0.348913 +vn -0.995525 0.000000 0.094501 +vn -0.995525 -0.000000 0.094498 +vn -0.986067 0.000001 -0.166349 +vn -0.909388 0.000002 -0.415949 +vn -0.909382 0.000000 -0.415962 +vn -0.770752 -0.000000 -0.637136 +vn -0.770766 0.000003 -0.637119 +vn -0.579598 0.000003 -0.814902 +vn -0.579621 0.000000 -0.814886 +vn -0.348929 -0.000000 -0.937149 +vn -0.094519 -0.000000 -0.995523 +vn 0.166433 0.000000 -0.986053 +vn 0.415900 0.000000 -0.909410 +vn 0.415872 0.000004 -0.909423 +vn 0.637131 0.000003 -0.770755 +vn 0.637167 -0.000002 -0.770726 +vn 0.814919 -0.000005 -0.579574 +vn 0.814897 0.000000 -0.579606 +vn 0.937133 0.000000 -0.348972 +vn 0.999342 0.000000 0.036269 +vn 0.579438 -0.000007 0.815017 +vn -0.890393 0.000000 -0.455192 +vn -0.998700 0.000000 0.050974 +vn -0.839407 0.000000 0.543503 +vn -0.455195 0.000000 0.890392 +vn -0.079813 0.000000 0.996810 +vn 0.047853 0.345150 0.937327 +vn 0.180911 0.000000 0.983499 +vn 0.429291 -0.000000 0.903166 +vn 0.742237 -0.000000 0.670138 +vn 0.977866 -0.000000 0.209234 +vn 0.977865 0.000014 0.209237 +vn 0.951475 -0.000021 -0.307727 +vn 0.951476 0.000000 -0.307723 +vn 0.670135 0.000000 -0.742239 +vn 0.335084 0.000000 -0.942188 +vn 0.079813 0.000000 -0.996810 +vn -0.047853 -0.345150 -0.937327 +vn -0.288823 0.345130 -0.893010 +vn -0.429291 0.000000 -0.903166 +vn -0.648411 0.000000 -0.761290 +vn 0.000008 1.000000 0.000008 +vn 0.000012 1.000000 0.000003 +vn -0.000005 1.000000 0.000037 +vn 0.000004 1.000000 0.000034 +vn -0.000003 1.000000 0.000005 +vn 0.000000 1.000000 0.000006 +vn 0.000010 1.000000 0.000005 +vn -0.000011 1.000000 0.000032 +vn -0.000003 1.000000 0.000034 +vn 0.000001 1.000000 0.000025 +vn -0.000011 1.000000 0.000003 +vn 0.000008 1.000000 0.000024 +vn -0.000012 1.000000 -0.000003 +vn -0.000006 1.000000 0.000002 +vn -0.000003 1.000000 0.000003 +vn 0.002135 0.999997 0.001092 +vn 0.001927 0.999998 -0.000098 +vn 0.001290 0.999999 -0.000835 +vn 0.000596 0.999999 -0.001139 +vn 0.001641 0.999997 0.001927 +vn -0.005030 0.999987 -0.001203 +vn 0.000006 1.000000 0.000005 +vn -0.032739 0.999119 0.026274 +vn 0.000005 1.000000 0.000005 +vn -0.890390 0.000006 -0.455198 +vn -0.890391 -0.000000 -0.455196 +vn -0.998700 0.000000 0.050981 +vn -0.839403 0.000000 0.543509 +vn -0.455193 0.000000 0.890393 +vn 0.050979 -0.000000 0.998700 +vn 0.429302 -0.000000 0.903161 +vn 0.742234 -0.000000 0.670140 +vn 0.977865 -0.000000 0.209238 +vn 0.977865 0.000003 0.209239 +vn 0.951473 -0.000004 -0.307731 +vn 0.951474 0.000000 -0.307729 +vn 0.670142 0.000000 -0.742233 +vn 0.670133 -0.000029 -0.742241 +vn 0.335069 -0.000022 -0.942193 +vn 0.335086 0.000000 -0.942187 +vn 0.079812 0.000000 -0.996810 +vn -0.180919 0.000000 -0.983498 +vn -0.429276 0.000000 -0.903173 +vn -0.648421 0.000000 -0.761282 +vn -0.648415 0.000010 -0.761287 +vn -0.000000 1.000000 0.000012 +vn -0.000006 1.000000 0.000001 +vn 0.000004 1.000000 0.000010 +vn -0.000001 1.000000 0.000006 +vn 0.000013 1.000000 0.000026 +vn -0.890389 0.000000 -0.455200 +vn -0.890391 -0.000007 -0.455196 +vn -0.996811 -0.000010 -0.079799 +vn -0.960853 -0.213370 0.176736 +vn -0.839408 0.000000 0.543502 +vn -0.455196 0.000000 0.890391 +vn 0.050984 -0.000000 0.998699 +vn 0.543505 -0.000000 0.839406 +vn 0.890392 -0.000000 0.455195 +vn 0.998700 0.000000 -0.050981 +vn 0.839404 0.000000 -0.543508 +vn 0.839406 0.000006 -0.543505 +vn 0.455201 0.000009 -0.890389 +vn 0.455193 -0.000005 -0.890393 +vn -0.050987 -0.000005 -0.998699 +vn -0.050984 -0.000000 -0.998699 +vn -0.543502 0.000000 -0.839408 +vn 0.000059 1.000000 0.000009 +vn 0.000012 1.000000 0.000005 +s off +f 1017/224/370 1016/225/370 1030/226/370 +f 1030/226/371 1016/225/371 1029/227/371 +f 1018/228/372 1017/224/372 1031/229/372 +f 1031/229/373 1017/224/373 1030/226/373 +f 1019/230/374 1018/228/374 1032/231/374 +f 1032/231/375 1018/228/375 1031/229/375 +f 1020/232/376 1019/230/376 1033/233/376 +f 1033/233/377 1019/230/377 1032/231/377 +f 1021/234/378 1020/232/378 1034/235/378 +f 1034/235/379 1020/232/379 1033/233/379 +f 1022/236/380 1021/234/380 1035/237/380 +f 1035/237/381 1021/234/381 1034/235/381 +f 1023/238/382 1022/236/382 1036/239/382 +f 1036/239/383 1022/236/383 1035/237/383 +f 1024/240/384 1023/238/384 1037/241/384 +f 1037/241/385 1023/238/385 1036/239/385 +f 1025/242/386 1024/240/386 1038/243/386 +f 1038/243/387 1024/240/387 1037/241/387 +f 1026/244/388 1025/242/388 1039/245/388 +f 1039/245/389 1025/242/389 1038/243/389 +f 1027/246/390 1026/244/390 1040/247/390 +f 1040/247/391 1026/244/391 1039/245/391 +f 1028/248/392 1027/246/392 1041/249/392 +f 1041/249/393 1027/246/393 1040/247/393 +f 1030/226/394 1029/227/394 1043/250/394 +f 1043/250/395 1029/227/395 1042/251/395 +f 1031/229/396 1030/226/396 1044/252/396 +f 1044/252/397 1030/226/397 1043/250/397 +f 1032/231/398 1031/229/398 1045/253/398 +f 1045/253/399 1031/229/399 1044/252/399 +f 1033/233/400 1032/231/400 1046/254/400 +f 1046/254/401 1032/231/401 1045/253/401 +f 1034/235/402 1033/233/402 1047/255/402 +f 1047/255/403 1033/233/403 1046/254/403 +f 1035/237/404 1034/235/404 1048/256/404 +f 1048/256/405 1034/235/405 1047/255/405 +f 1036/239/406 1035/237/406 1049/257/406 +f 1049/257/407 1035/237/407 1048/256/407 +f 1037/241/408 1036/239/408 1050/258/408 +f 1050/258/409 1036/239/409 1049/257/409 +f 1038/243/410 1037/241/410 1051/259/410 +f 1051/259/411 1037/241/411 1050/258/411 +f 1039/245/412 1038/243/412 1052/260/412 +f 1052/260/413 1038/243/413 1051/259/413 +f 1040/247/414 1039/245/414 1053/261/414 +f 1053/261/415 1039/245/415 1052/260/415 +f 1041/249/416 1040/247/416 1054/262/416 +f 1054/262/417 1040/247/417 1053/261/417 +f 1043/250/418 1042/251/418 1056/263/418 +f 1056/263/419 1042/251/419 1055/264/419 +f 1044/252/420 1043/250/420 1057/265/420 +f 1057/265/421 1043/250/421 1056/263/421 +f 1045/253/422 1044/252/422 1058/266/422 +f 1058/266/423 1044/252/423 1057/265/423 +f 1046/254/424 1045/253/424 1059/267/424 +f 1059/267/425 1045/253/425 1058/266/425 +f 1047/255/426 1046/254/426 1060/268/426 +f 1060/268/427 1046/254/427 1059/267/427 +f 1048/256/428 1047/255/428 1061/269/428 +f 1061/269/429 1047/255/429 1060/268/429 +f 1049/257/430 1048/256/430 1062/270/430 +f 1062/270/431 1048/256/431 1061/269/431 +f 1050/258/432 1049/257/432 1063/271/432 +f 1063/271/433 1049/257/433 1062/270/433 +f 1051/259/434 1050/258/434 1064/272/434 +f 1064/272/435 1050/258/435 1063/271/435 +f 1052/260/436 1051/259/436 1065/273/436 +f 1065/273/437 1051/259/437 1064/272/437 +f 1053/261/438 1052/260/438 1066/274/438 +f 1066/274/439 1052/260/439 1065/273/439 +f 1054/262/440 1053/261/440 1067/275/440 +f 1067/275/441 1053/261/441 1066/274/441 +f 1056/263/442 1055/264/442 1069/276/442 +f 1069/276/443 1055/264/443 1068/277/443 +f 1057/265/444 1056/263/444 1070/278/444 +f 1070/278/445 1056/263/445 1069/276/445 +f 1058/266/446 1057/265/446 1071/279/446 +f 1071/279/447 1057/265/447 1070/278/447 +f 1059/267/448 1058/266/448 1072/280/448 +f 1072/280/449 1058/266/449 1071/279/449 +f 1060/268/450 1059/267/450 1073/281/450 +f 1073/281/451 1059/267/451 1072/280/451 +f 1061/269/452 1060/268/452 1074/282/452 +f 1074/282/453 1060/268/453 1073/281/453 +f 1062/270/454 1061/269/454 1075/283/454 +f 1075/283/455 1061/269/455 1074/282/455 +f 1063/271/456 1062/270/456 1076/284/456 +f 1076/284/457 1062/270/457 1075/283/457 +f 1064/272/458 1063/271/458 1077/285/458 +f 1077/285/459 1063/271/459 1076/284/459 +f 1065/273/460 1064/272/460 1078/286/460 +f 1078/286/461 1064/272/461 1077/285/461 +f 1066/274/462 1065/273/462 1079/287/462 +f 1079/287/463 1065/273/463 1078/286/463 +f 1067/275/464 1066/274/464 1080/288/464 +f 1080/288/465 1066/274/465 1079/287/465 +f 1069/276/466 1068/277/466 1082/289/466 +f 1082/289/467 1068/277/467 1081/290/467 +f 1070/278/468 1069/276/468 1083/291/468 +f 1083/291/469 1069/276/469 1082/289/469 +f 1071/279/470 1070/278/470 1084/292/470 +f 1084/292/471 1070/278/471 1083/291/471 +f 1072/280/472 1071/279/472 1085/293/472 +f 1085/293/473 1071/279/473 1084/292/473 +f 1073/281/474 1072/280/474 1086/294/474 +f 1086/294/475 1072/280/475 1085/293/475 +f 1074/282/476 1073/281/476 1087/295/476 +f 1087/295/477 1073/281/477 1086/294/477 +f 1075/283/478 1074/282/478 1088/296/478 +f 1088/296/479 1074/282/479 1087/295/479 +f 1076/284/480 1075/283/480 1089/297/480 +f 1089/297/481 1075/283/481 1088/296/481 +f 1077/285/482 1076/284/482 1090/298/482 +f 1090/298/483 1076/284/483 1089/297/483 +f 1078/286/484 1077/285/484 1091/299/484 +f 1091/299/485 1077/285/485 1090/298/485 +f 1079/287/486 1078/286/486 1092/300/486 +f 1092/300/487 1078/286/487 1091/299/487 +f 1080/288/488 1079/287/488 1093/301/488 +f 1093/301/489 1079/287/489 1092/300/489 +f 1082/289/490 1081/290/490 1095/302/490 +f 1095/302/491 1081/290/491 1094/303/491 +f 1083/291/492 1082/289/492 1096/304/492 +f 1096/304/493 1082/289/493 1095/302/493 +f 1084/292/494 1083/291/494 1097/305/494 +f 1097/305/495 1083/291/495 1096/304/495 +f 1085/293/496 1084/292/496 1098/306/496 +f 1098/306/497 1084/292/497 1097/305/497 +f 1086/294/498 1085/293/498 1099/307/498 +f 1099/307/499 1085/293/499 1098/306/499 +f 1087/295/500 1086/294/500 1100/308/500 +f 1100/308/501 1086/294/501 1099/307/501 +f 1088/296/502 1087/295/502 1101/309/502 +f 1101/309/503 1087/295/503 1100/308/503 +f 1089/297/504 1088/296/504 1102/310/504 +f 1102/310/505 1088/296/505 1101/309/505 +f 1090/298/506 1089/297/506 1103/311/506 +f 1103/311/507 1089/297/507 1102/310/507 +f 1091/299/508 1090/298/508 1104/312/508 +f 1104/312/509 1090/298/509 1103/311/509 +f 1092/300/510 1091/299/510 1105/313/510 +f 1105/313/511 1091/299/511 1104/312/511 +f 1093/301/512 1092/300/512 1106/314/512 +f 1106/314/513 1092/300/513 1105/313/513 +f 1095/302/514 1094/303/514 1108/315/514 +f 1108/315/515 1094/303/515 1107/316/515 +f 1096/304/516 1095/302/516 1109/317/516 +f 1109/317/517 1095/302/517 1108/315/517 +f 1097/305/518 1096/304/518 1110/318/518 +f 1110/318/519 1096/304/519 1109/317/519 +f 1098/306/520 1097/305/520 1111/319/520 +f 1111/319/521 1097/305/521 1110/318/521 +f 1099/307/522 1098/306/522 1112/320/522 +f 1112/320/523 1098/306/523 1111/319/523 +f 1100/308/524 1099/307/524 1113/321/524 +f 1113/321/525 1099/307/525 1112/320/525 +f 1101/309/526 1100/308/526 1114/322/526 +f 1114/322/527 1100/308/527 1113/321/527 +f 1102/310/528 1101/309/528 1115/323/528 +f 1115/323/529 1101/309/529 1114/322/529 +f 1103/311/530 1102/310/530 1116/324/530 +f 1116/324/531 1102/310/531 1115/323/531 +f 1104/312/532 1103/311/532 1117/325/532 +f 1117/325/533 1103/311/533 1116/324/533 +f 1105/313/534 1104/312/534 1118/326/534 +f 1118/326/535 1104/312/535 1117/325/535 +f 1106/314/536 1105/313/536 1119/327/536 +f 1119/327/537 1105/313/537 1118/326/537 +f 1108/315/538 1107/316/538 1121/328/538 +f 1121/328/539 1107/316/539 1120/329/539 +f 1109/317/540 1108/315/540 1122/330/540 +f 1122/330/541 1108/315/541 1121/328/541 +f 1110/318/542 1109/317/542 1123/331/542 +f 1123/331/543 1109/317/543 1122/330/543 +f 1111/319/544 1110/318/544 1124/332/544 +f 1124/332/545 1110/318/545 1123/331/545 +f 1112/320/546 1111/319/546 1125/333/546 +f 1125/333/547 1111/319/547 1124/332/547 +f 1113/321/548 1112/320/548 1126/334/548 +f 1126/334/549 1112/320/549 1125/333/549 +f 1114/322/550 1113/321/550 1127/335/550 +f 1127/335/551 1113/321/551 1126/334/551 +f 1115/323/552 1114/322/552 1128/336/552 +f 1128/336/553 1114/322/553 1127/335/553 +f 1116/324/554 1115/323/554 1129/337/554 +f 1129/337/555 1115/323/555 1128/336/555 +f 1117/325/556 1116/324/556 1130/338/556 +f 1130/338/557 1116/324/557 1129/337/557 +f 1118/326/558 1117/325/558 1131/339/558 +f 1131/339/559 1117/325/559 1130/338/559 +f 1119/327/560 1118/326/560 1132/340/560 +f 1132/340/561 1118/326/561 1131/339/561 +f 1121/328/562 1120/329/562 1134/341/562 +f 1134/341/563 1120/329/563 1133/342/563 +f 1122/330/564 1121/328/564 1135/343/564 +f 1135/343/565 1121/328/565 1134/341/565 +f 1123/331/566 1122/330/566 1136/344/566 +f 1136/344/567 1122/330/567 1135/343/567 +f 1124/332/568 1123/331/568 1137/345/568 +f 1137/345/569 1123/331/569 1136/344/569 +f 1125/333/570 1124/332/570 1138/346/570 +f 1138/346/571 1124/332/571 1137/345/571 +f 1126/334/572 1125/333/572 1139/347/572 +f 1139/347/573 1125/333/573 1138/346/573 +f 1127/335/574 1126/334/574 1140/348/574 +f 1140/348/575 1126/334/575 1139/347/575 +f 1128/336/576 1127/335/576 1141/349/576 +f 1141/349/577 1127/335/577 1140/348/577 +f 1129/337/578 1128/336/578 1142/350/578 +f 1142/350/579 1128/336/579 1141/349/579 +f 1130/338/580 1129/337/580 1143/351/580 +f 1143/351/581 1129/337/581 1142/350/581 +f 1131/339/582 1130/338/582 1144/352/582 +f 1144/352/583 1130/338/583 1143/351/583 +f 1132/340/584 1131/339/584 1145/353/584 +f 1145/353/585 1131/339/585 1144/352/585 +f 1134/341/586 1133/342/586 1147/354/586 +f 1147/354/587 1133/342/587 1146/355/587 +f 1135/343/588 1134/341/588 1148/356/588 +f 1148/356/589 1134/341/589 1147/354/589 +f 1136/344/590 1135/343/590 1149/357/590 +f 1149/357/591 1135/343/591 1148/356/591 +f 1137/345/592 1136/344/592 1150/358/592 +f 1150/358/593 1136/344/593 1149/357/593 +f 1138/346/594 1137/345/594 1151/359/594 +f 1151/359/595 1137/345/595 1150/358/595 +f 1139/347/596 1138/346/596 1152/360/596 +f 1152/360/597 1138/346/597 1151/359/597 +f 1140/348/598 1139/347/598 1153/361/598 +f 1153/361/599 1139/347/599 1152/360/599 +f 1141/349/600 1140/348/600 1154/362/600 +f 1154/362/601 1140/348/601 1153/361/601 +f 1142/350/602 1141/349/602 1155/363/602 +f 1155/363/603 1141/349/603 1154/362/603 +f 1143/351/604 1142/350/604 1156/364/604 +f 1156/364/605 1142/350/605 1155/363/605 +f 1144/352/606 1143/351/606 1157/365/606 +f 1157/365/607 1143/351/607 1156/364/607 +f 1145/353/608 1144/352/608 1158/366/608 +f 1158/366/609 1144/352/609 1157/365/609 +f 1147/354/610 1146/355/610 1160/367/610 +f 1160/367/611 1146/355/611 1159/368/611 +f 1148/356/612 1147/354/612 1161/369/612 +f 1161/369/613 1147/354/613 1160/367/613 +f 1149/357/614 1148/356/614 1162/370/614 +f 1162/370/615 1148/356/615 1161/369/615 +f 1150/358/616 1149/357/616 1163/371/616 +f 1163/371/617 1149/357/617 1162/370/617 +f 1151/359/618 1150/358/618 1164/372/618 +f 1164/372/619 1150/358/619 1163/371/619 +f 1152/360/620 1151/359/620 1165/373/620 +f 1165/373/621 1151/359/621 1164/372/621 +f 1153/361/622 1152/360/622 1166/374/622 +f 1166/374/623 1152/360/623 1165/373/623 +f 1154/362/624 1153/361/624 1167/375/624 +f 1167/375/625 1153/361/625 1166/374/625 +f 1155/363/626 1154/362/626 1168/376/626 +f 1168/376/627 1154/362/627 1167/375/627 +f 1156/364/628 1155/363/628 1169/377/628 +f 1169/377/629 1155/363/629 1168/376/629 +f 1157/365/630 1156/364/630 1170/378/630 +f 1170/378/631 1156/364/631 1169/377/631 +f 1450/379/632 1451/380/632 1171/381/632 +f 1171/381/633 1452/380/633 1453/382/633 +f 1160/367/634 1159/368/634 1173/383/634 +f 1454/384/635 1455/385/635 1172/386/635 +f 1456/387/636 1457/388/636 1174/389/636 +f 1174/389/637 1458/388/637 1459/384/637 +f 1460/390/638 1461/387/638 1175/391/638 +f 1175/391/639 1462/387/639 1174/389/639 +f 1463/392/640 1464/390/640 1176/393/640 +f 1176/393/641 1465/390/641 1175/391/641 +f 1466/394/642 1467/392/642 1177/395/642 +f 1177/395/643 1468/392/643 1176/393/643 +f 1469/396/644 1470/394/644 1178/397/644 +f 1178/397/645 1471/394/645 1177/395/645 +f 1472/398/646 1473/396/646 1179/399/646 +f 1179/399/647 1474/396/647 1178/397/647 +f 1475/400/648 1476/398/648 1180/401/648 +f 1180/401/649 1477/398/649 1179/399/649 +f 1478/402/650 1479/400/650 1181/403/650 +f 1181/403/651 1480/400/651 1180/401/651 +f 1481/404/652 1482/402/652 1182/405/652 +f 1182/405/653 1483/402/653 1181/403/653 +f 1484/382/654 1485/404/654 1183/406/654 +f 1183/406/655 1486/404/655 1182/405/655 +f 1171/381/656 1487/382/656 1184/407/656 +f 1184/407/657 1488/382/657 1183/406/657 +f 1489/384/658 1172/386/658 1186/408/658 +f 1186/408/659 1172/386/659 1185/409/659 +f 1174/389/660 1490/384/660 1187/410/660 +f 1187/410/661 1491/384/661 1186/408/661 +f 1175/391/662 1174/389/662 1188/411/662 +f 1188/411/663 1174/389/663 1187/410/663 +f 1176/393/664 1175/391/664 1189/412/664 +f 1189/412/665 1175/391/665 1188/411/665 +f 1177/395/666 1176/393/666 1190/413/666 +f 1190/413/667 1176/393/667 1189/412/667 +f 1178/397/668 1177/395/668 1191/414/668 +f 1191/414/669 1177/395/669 1190/413/669 +f 1179/399/670 1178/397/670 1192/415/670 +f 1192/415/671 1178/397/671 1191/414/671 +f 1180/401/672 1179/399/672 1193/416/672 +f 1193/416/673 1179/399/673 1192/415/673 +f 1181/403/674 1180/401/674 1194/417/674 +f 1194/417/675 1180/401/675 1193/416/675 +f 1182/405/676 1181/403/676 1195/418/676 +f 1195/418/677 1181/403/677 1194/417/677 +f 1183/406/678 1182/405/678 1196/419/678 +f 1196/419/679 1182/405/679 1195/418/679 +f 1184/407/680 1183/406/680 1197/420/680 +f 1197/420/681 1183/406/681 1196/419/681 +f 1186/408/682 1185/409/682 1199/421/682 +f 1199/421/683 1185/409/683 1198/422/683 +f 1187/410/684 1186/408/684 1200/423/684 +f 1200/423/685 1186/408/685 1199/421/685 +f 1188/411/686 1187/410/686 1201/424/686 +f 1201/424/687 1187/410/687 1200/423/687 +f 1189/412/688 1188/411/688 1202/425/688 +f 1202/425/689 1188/411/689 1201/424/689 +f 1190/413/690 1189/412/690 1203/426/690 +f 1203/426/691 1189/412/691 1202/425/691 +f 1191/414/692 1190/413/692 1204/427/692 +f 1204/427/693 1190/413/693 1203/426/693 +f 1192/415/694 1191/414/694 1205/428/694 +f 1205/428/695 1191/414/695 1204/427/695 +f 1193/416/696 1192/415/696 1206/429/696 +f 1206/429/697 1192/415/697 1205/428/697 +f 1194/417/698 1193/416/698 1207/430/698 +f 1207/430/699 1193/416/699 1206/429/699 +f 1195/418/700 1194/417/700 1208/431/700 +f 1208/431/701 1194/417/701 1207/430/701 +f 1196/419/702 1195/418/702 1209/432/702 +f 1209/432/703 1195/418/703 1208/431/703 +f 1197/420/704 1196/419/704 1210/433/704 +f 1210/433/705 1196/419/705 1209/432/705 +f 1199/421/706 1198/422/706 1212/434/706 +f 1212/434/707 1198/422/707 1211/435/707 +f 1200/423/708 1199/421/708 1213/436/708 +f 1213/436/709 1199/421/709 1212/434/709 +f 1201/424/710 1200/423/710 1214/437/710 +f 1214/437/711 1200/423/711 1213/436/711 +f 1202/425/712 1201/424/712 1215/438/712 +f 1215/438/713 1201/424/713 1214/437/713 +f 1203/426/714 1202/425/714 1216/439/714 +f 1216/439/715 1202/425/715 1215/438/715 +f 1204/427/716 1203/426/716 1217/440/716 +f 1217/440/717 1203/426/717 1216/439/717 +f 1205/428/718 1204/427/718 1218/441/718 +f 1218/441/719 1204/427/719 1217/440/719 +f 1206/429/720 1205/428/720 1219/442/720 +f 1219/442/721 1205/428/721 1218/441/721 +f 1207/430/722 1206/429/722 1220/443/722 +f 1220/443/723 1206/429/723 1219/442/723 +f 1208/431/724 1207/430/724 1221/444/724 +f 1221/444/725 1207/430/725 1220/443/725 +f 1209/432/726 1208/431/726 1222/445/726 +f 1222/445/727 1208/431/727 1221/444/727 +f 1210/433/728 1209/432/728 1223/446/728 +f 1223/446/729 1209/432/729 1222/445/729 +f 1212/434/730 1211/435/730 1017/224/730 +f 1016/225/731 1017/224/731 1211/435/731 +f 1213/436/732 1212/434/732 1018/228/732 +f 1018/228/733 1212/434/733 1017/224/733 +f 1214/437/734 1213/436/734 1019/230/734 +f 1019/230/735 1213/436/735 1018/228/735 +f 1215/438/736 1214/437/736 1020/232/736 +f 1020/232/737 1214/437/737 1019/230/737 +f 1216/439/738 1215/438/738 1021/234/738 +f 1021/234/739 1215/438/739 1020/232/739 +f 1217/440/740 1216/439/740 1022/236/740 +f 1022/236/741 1216/439/741 1021/234/741 +f 1218/441/742 1217/440/742 1023/238/742 +f 1023/238/743 1217/440/743 1022/236/743 +f 1219/442/744 1218/441/744 1024/240/744 +f 1024/240/745 1218/441/745 1023/238/745 +f 1220/443/746 1219/442/746 1025/242/746 +f 1025/242/747 1219/442/747 1024/240/747 +f 1221/444/748 1220/443/748 1026/244/748 +f 1026/244/749 1220/443/749 1025/242/749 +f 1222/445/750 1221/444/750 1027/246/750 +f 1027/246/751 1221/444/751 1026/244/751 +f 1223/446/752 1222/445/752 1028/248/752 +f 1028/248/753 1222/445/753 1027/246/753 +f 1232/447/331 1233/448/331 1234/449/331 +f 1234/449/331 1233/448/331 1235/450/331 +f 1236/451/331 1232/447/331 1234/449/331 +f 1232/447/331 1236/451/331 1237/452/331 +f 1237/452/754 1236/451/754 1238/451/754 +f 1239/453/331 1237/452/331 1238/451/331 +f 1237/452/331 1239/453/331 1240/454/331 +f 1240/454/754 1239/453/754 1241/453/754 +f 1240/454/331 1241/453/331 1242/455/331 +f 1243/455/754 1240/454/754 1242/455/754 +f 1240/454/331 1243/455/331 1244/456/331 +f 1245/457/331 1244/456/331 1243/455/331 +f 1244/456/331 1245/457/331 1246/458/331 +f 1246/458/331 1245/457/331 1247/459/331 +f 1248/459/754 1246/458/754 1247/459/754 +f 1246/458/331 1248/459/331 1249/460/331 +f 1250/461/331 1249/460/331 1248/459/331 +f 1249/460/331 1250/461/331 1251/462/331 +f 1252/463/331 1251/462/331 1250/461/331 +f 1251/462/331 1252/463/331 1253/464/331 +f 1254/465/331 1253/464/331 1252/463/331 +f 1253/464/331 1254/465/331 1255/466/331 +f 1255/466/754 1254/465/754 1256/465/754 +f 1257/467/331 1255/466/331 1256/465/331 +f 1255/466/331 1257/467/331 1258/468/331 +f 1258/468/754 1257/467/754 1259/467/754 +f 1258/468/331 1259/467/331 1260/469/331 +f 1261/469/754 1258/468/754 1260/469/754 +f 1258/468/331 1261/469/331 1262/470/331 +f 1262/470/331 1261/469/331 1263/471/331 +f 1264/471/754 1262/470/754 1263/471/754 +f 1262/470/331 1264/471/331 1265/472/331 +f 1266/473/331 1265/472/331 1264/471/331 +f 1265/472/331 1266/473/331 1267/474/331 +f 1267/474/754 1266/473/754 1268/473/754 +f 1269/475/331 1267/474/331 1268/473/331 +f 1267/474/331 1269/475/331 1270/476/331 +f 1270/476/754 1269/475/754 1271/475/754 +f 1272/477/331 1270/476/331 1271/475/331 +f 1270/476/331 1272/477/331 1273/478/331 +f 1273/478/754 1272/477/754 1274/477/754 +f 1275/479/331 1273/478/331 1274/477/331 +f 1273/478/331 1275/479/331 1276/480/331 +f 1276/480/754 1275/479/754 1277/479/754 +f 1276/480/331 1277/479/331 1278/481/331 +f 1279/481/754 1276/480/754 1278/481/754 +f 1276/480/331 1279/481/331 1280/482/331 +f 1280/482/331 1279/481/331 1281/483/331 +f 1282/483/754 1280/482/754 1281/483/754 +f 1280/482/331 1282/483/331 1283/484/331 +f 1284/485/331 1283/484/331 1282/483/331 +f 1283/484/331 1284/485/331 1285/486/331 +f 1286/487/331 1285/486/331 1284/485/331 +f 1285/486/331 1286/487/331 1287/488/331 +f 1287/488/754 1286/487/754 1288/487/754 +f 1287/488/331 1288/487/331 1289/489/331 +f 1290/489/754 1287/488/754 1289/489/754 +f 1287/488/331 1290/489/331 1291/490/331 +f 1291/490/331 1290/489/331 1292/491/331 +f 1293/491/754 1291/490/754 1292/491/754 +f 1291/490/331 1293/491/331 1294/492/331 +f 1294/492/331 1293/491/331 1295/493/331 +f 1296/493/754 1294/492/754 1295/493/754 +f 1294/492/331 1296/493/331 1235/450/331 +f 1235/450/331 1296/493/331 1297/494/331 +f 1235/450/331 1297/494/331 1234/449/331 +f 1298/495/331 1301/496/331 1300/497/331 +f 1298/495/331 1302/498/331 1301/496/331 +f 1298/495/331 1303/499/331 1302/498/331 +f 1298/495/331 1304/500/331 1303/499/331 +f 1298/495/331 1305/501/331 1304/500/331 +f 1298/495/331 1306/502/331 1305/501/331 +f 1298/495/331 1307/503/331 1306/502/331 +f 1298/495/331 1308/504/331 1307/503/331 +f 1298/495/331 1309/505/331 1308/504/331 +f 1298/495/331 1310/506/331 1309/505/331 +f 1298/495/331 1311/507/331 1310/506/331 +f 1298/495/331 1312/508/331 1311/507/331 +f 1298/495/331 1313/509/331 1312/508/331 +f 1298/495/331 1314/510/331 1313/509/331 +f 1298/495/331 1315/511/331 1314/510/331 +f 1298/495/331 1316/512/331 1315/511/331 +f 1298/495/331 1317/513/331 1316/512/331 +f 1298/495/331 1318/514/331 1317/513/331 +f 1298/495/331 1319/515/331 1318/514/331 +f 1298/495/331 1320/516/331 1319/515/331 +f 1298/495/331 1321/517/331 1320/516/331 +f 1298/495/331 1299/518/331 1321/517/331 +f 1234/449/755 1299/518/755 1298/495/755 +f 1234/449/756 1298/495/756 1236/451/756 +f 1298/495/754 1238/451/754 1236/451/754 +f 1238/451/757 1298/495/757 1300/497/757 +f 1238/451/757 1300/497/757 1239/453/757 +f 1300/497/754 1241/453/754 1239/453/754 +f 1241/453/758 1300/497/758 1301/496/758 +f 1301/496/758 1242/455/758 1241/453/758 +f 1242/455/754 1301/496/754 1243/455/754 +f 1243/455/759 1301/496/759 1302/498/759 +f 1302/498/760 1245/457/760 1243/455/760 +f 1245/457/761 1302/498/761 1303/499/761 +f 1303/499/762 1247/459/762 1245/457/762 +f 1247/459/754 1303/499/754 1248/459/754 +f 1248/459/763 1303/499/763 1304/500/763 +f 1304/500/763 1250/461/763 1248/459/763 +f 1250/461/764 1304/500/764 1305/501/764 +f 1305/501/764 1252/463/764 1250/461/764 +f 1252/463/765 1305/501/765 1306/502/765 +f 1252/463/765 1306/502/765 1254/465/765 +f 1306/502/754 1256/465/754 1254/465/754 +f 1256/465/766 1306/502/766 1307/503/766 +f 1256/465/766 1307/503/766 1257/467/766 +f 1307/503/754 1259/467/754 1257/467/754 +f 1259/467/767 1307/503/767 1308/504/767 +f 1308/504/767 1260/469/767 1259/467/767 +f 1260/469/754 1308/504/754 1261/469/754 +f 1261/469/768 1308/504/768 1309/505/768 +f 1309/505/768 1263/471/768 1261/469/768 +f 1263/471/754 1309/505/754 1264/471/754 +f 1264/471/769 1309/505/769 1310/506/769 +f 1264/471/769 1310/506/769 1266/473/769 +f 1310/506/754 1268/473/754 1266/473/754 +f 1268/473/770 1310/506/770 1311/507/770 +f 1268/473/770 1311/507/770 1269/475/770 +f 1311/507/754 1271/475/754 1269/475/754 +f 1271/475/771 1311/507/771 1312/508/771 +f 1271/475/771 1312/508/771 1272/477/771 +f 1312/508/754 1274/477/754 1272/477/754 +f 1274/477/772 1312/508/772 1313/509/772 +f 1274/477/772 1313/509/772 1275/479/772 +f 1313/509/754 1277/479/754 1275/479/754 +f 1277/479/773 1313/509/773 1314/510/773 +f 1314/510/773 1278/481/773 1277/479/773 +f 1278/481/754 1314/510/754 1279/481/754 +f 1279/481/774 1314/510/774 1315/511/774 +f 1315/511/774 1281/483/774 1279/481/774 +f 1281/483/754 1315/511/754 1282/483/754 +f 1282/483/775 1315/511/775 1316/512/775 +f 1316/512/775 1284/485/775 1282/483/775 +f 1284/485/776 1316/512/776 1317/513/776 +f 1284/485/776 1317/513/776 1286/487/776 +f 1317/513/754 1288/487/754 1286/487/754 +f 1288/487/777 1317/513/777 1318/514/777 +f 1318/514/777 1289/489/777 1288/487/777 +f 1289/489/754 1318/514/754 1290/489/754 +f 1290/489/778 1318/514/778 1319/515/778 +f 1319/515/778 1292/491/778 1290/489/778 +f 1292/491/754 1319/515/754 1293/491/754 +f 1293/491/779 1319/515/779 1320/516/779 +f 1320/516/779 1295/493/779 1293/491/779 +f 1295/493/754 1320/516/754 1296/493/754 +f 1296/493/780 1320/516/780 1321/517/780 +f 1321/517/780 1297/494/780 1296/493/780 +f 1299/518/781 1234/449/781 1321/517/781 +f 1297/494/782 1321/517/782 1234/449/782 +f 1240/454/783 1244/456/783 1322/519/783 +f 1253/464/784 1255/466/784 1323/520/784 +f 1244/456/785 1324/521/785 1322/519/785 +f 1324/521/786 1244/456/786 1246/458/786 +f 1246/458/786 1325/522/786 1324/521/786 +f 1325/522/787 1246/458/787 1249/460/787 +f 1249/460/787 1326/523/787 1325/522/787 +f 1326/523/788 1249/460/788 1251/462/788 +f 1251/462/788 1327/524/788 1326/523/788 +f 1327/524/789 1251/462/789 1253/464/789 +f 1253/464/789 1328/525/789 1327/524/789 +f 1328/525/790 1253/464/790 1323/520/790 +f 1329/526/791 1330/527/791 1331/528/791 +f 1330/527/792 1329/526/792 1322/519/792 +f 1331/528/793 1330/527/793 1322/519/793 +f 1332/529/794 1333/530/794 1334/531/794 +f 1333/530/795 1332/529/795 1323/520/795 +f 1322/519/796 1335/532/796 1331/528/796 +f 1335/532/797 1322/519/797 1324/521/797 +f 1334/531/798 1333/530/798 1323/520/798 +f 1334/531/799 1323/520/799 1255/466/799 +f 1336/533/800 1323/520/800 1332/529/800 +f 1323/520/801 1336/533/801 1328/525/801 +f 1337/534/802 1322/519/802 1329/526/802 +f 1324/521/803 1338/535/803 1335/532/803 +f 1338/535/804 1324/521/804 1325/522/804 +f 1325/522/805 1339/536/805 1492/537/805 +f 1339/536/806 1325/522/806 1326/523/806 +f 1326/523/807 1340/538/807 1339/536/807 +f 1340/538/808 1326/523/808 1327/524/808 +f 1327/524/809 1341/539/809 1340/538/809 +f 1341/539/810 1327/524/810 1328/525/810 +f 1328/525/811 1342/540/811 1341/539/811 +f 1342/540/812 1328/525/812 1336/533/812 +f 1233/448/813 1343/541/813 1235/450/813 +f 1343/541/814 1233/448/814 1232/447/814 +f 1343/541/815 1232/447/815 1237/452/815 +f 1237/452/815 1344/542/815 1343/541/815 +f 1344/542/816 1237/452/816 1240/454/816 +f 1240/454/816 1345/543/816 1344/542/816 +f 1345/543/817 1240/454/817 1322/519/817 +f 1334/531/818 1255/466/818 1258/468/818 +f 1346/544/819 1334/531/819 1258/468/819 +f 1346/544/820 1258/468/820 1262/470/820 +f 1346/544/821 1262/470/821 1265/472/821 +f 1265/472/822 1347/545/822 1346/544/822 +f 1348/546/823 1347/545/823 1265/472/823 +f 1348/546/823 1265/472/823 1267/474/823 +f 1348/546/824 1267/474/824 1270/476/824 +f 1270/476/825 1349/547/825 1348/546/825 +f 1349/547/826 1270/476/826 1273/478/826 +f 1273/478/827 1350/548/827 1349/547/827 +f 1351/549/828 1350/548/828 1273/478/828 +f 1351/549/829 1273/478/829 1276/480/829 +f 1351/549/830 1276/480/830 1280/482/830 +f 1280/482/830 1352/550/830 1351/549/830 +f 1352/550/831 1280/482/831 1283/484/831 +f 1283/484/831 1353/551/831 1352/550/831 +f 1353/551/832 1283/484/832 1285/486/832 +f 1285/486/832 1354/552/832 1353/551/832 +f 1354/552/833 1285/486/833 1287/488/833 +f 1287/488/834 1355/553/834 1354/552/834 +f 1355/553/835 1287/488/835 1291/490/835 +f 1291/490/836 1356/554/836 1355/553/836 +f 1356/554/837 1291/490/837 1294/492/837 +f 1294/492/838 1357/555/838 1356/554/838 +f 1357/555/839 1294/492/839 1235/450/839 +f 1235/450/839 1358/556/839 1357/555/839 +f 1358/556/840 1235/450/840 1343/541/840 +f 1337/534/841 1345/543/841 1322/519/841 +f 1359/557/842 1360/558/842 1361/559/842 +f 1362/560/842 1360/558/842 1359/557/842 +f 1360/558/843 1362/560/843 1363/561/843 +f 1364/562/843 1363/561/843 1362/560/843 +f 1363/561/844 1364/562/844 1365/563/844 +f 1366/564/844 1365/563/844 1364/562/844 +f 1366/564/754 1365/563/754 1367/564/754 +f 1365/563/845 1366/564/845 1368/565/845 +f 1368/565/845 1366/564/845 1369/566/845 +f 1370/566/754 1368/565/754 1369/566/754 +f 1371/567/846 1368/565/846 1369/566/846 +f 1368/565/847 1371/567/847 1372/568/847 +f 1372/568/848 1371/567/848 1373/569/848 +f 1374/569/754 1372/568/754 1373/569/754 +f 1372/568/849 1374/569/849 1375/570/849 +f 1375/570/849 1374/569/849 1376/571/849 +f 1493/572/850 1494/573/850 1377/574/850 +f 1378/575/850 1377/574/850 1495/573/850 +f 1377/574/851 1378/575/851 1379/576/851 +f 1380/577/852 1379/576/852 1378/575/852 +f 1379/576/754 1380/577/754 1381/577/754 +f 1379/576/853 1380/577/853 1382/578/853 +f 1382/578/854 1380/577/854 1383/579/854 +f 1384/579/754 1382/578/754 1383/579/754 +f 1382/578/855 1384/579/855 1385/580/855 +f 1385/580/855 1384/579/855 1386/581/855 +f 1385/580/856 1386/581/856 1387/582/856 +f 1388/583/856 1387/582/856 1386/581/856 +f 1387/582/857 1388/583/857 1389/584/857 +f 1389/584/754 1388/583/754 1390/583/754 +f 1391/585/858 1389/584/858 1390/583/858 +f 1389/584/859 1391/585/859 1392/586/859 +f 1392/586/860 1391/585/860 1393/587/860 +f 1394/587/754 1392/586/754 1393/587/754 +f 1392/586/861 1394/587/861 1361/559/861 +f 1359/557/861 1361/559/861 1394/587/861 +f 1395/588/331 1396/589/331 1359/557/331 +f 1396/589/331 1362/560/331 1359/557/331 +f 1362/560/331 1396/589/331 1397/590/331 +f 1397/590/331 1364/562/331 1362/560/331 +f 1364/562/331 1397/590/331 1398/591/331 +f 1364/562/331 1398/591/331 1366/564/331 +f 1398/591/754 1366/564/754 1367/564/754 +f 1366/564/862 1398/591/862 1399/592/862 +f 1399/592/863 1369/566/863 1366/564/863 +f 1399/592/754 1369/566/754 1370/566/754 +f 1369/566/331 1399/592/331 1400/593/331 +f 1369/566/331 1400/593/331 1371/567/331 +f 1400/593/864 1373/569/864 1371/567/864 +f 1373/569/865 1400/593/865 1401/594/865 +f 1373/569/754 1401/594/754 1374/569/754 +f 1401/594/331 1376/571/331 1374/569/331 +f 1496/573/331 1497/595/331 1402/596/331 +f 1402/596/331 1378/575/331 1498/573/331 +f 1378/575/866 1402/596/866 1403/597/866 +f 1378/575/867 1403/597/867 1380/577/867 +f 1381/577/754 1403/597/754 1380/577/754 +f 1380/577/331 1403/597/331 1404/598/331 +f 1404/598/331 1383/579/331 1380/577/331 +f 1383/579/331 1404/598/331 1405/599/331 +f 1383/579/754 1405/599/754 1384/579/754 +f 1405/599/331 1386/581/331 1384/579/331 +f 1386/581/868 1405/599/868 1406/600/868 +f 1386/581/869 1406/600/869 1388/583/869 +f 1406/600/754 1390/583/754 1388/583/754 +f 1390/583/870 1406/600/870 1407/601/870 +f 1390/583/871 1407/601/871 1391/585/871 +f 1391/585/872 1407/601/872 1408/602/872 +f 1391/585/331 1408/602/331 1409/603/331 +f 1409/603/331 1393/587/331 1391/585/331 +f 1393/587/331 1409/603/331 1395/588/331 +f 1393/587/754 1395/588/754 1394/587/754 +f 1395/588/331 1359/557/331 1394/587/331 +f 1368/565/331 1372/568/331 1499/604/331 +f 1500/604/331 1372/568/331 1375/570/331 +f 1331/528/873 1501/572/873 1377/574/873 +f 1331/528/874 1377/574/874 1379/576/874 +f 1331/528/875 1379/576/875 1382/578/875 +f 1331/528/876 1382/578/876 1385/580/876 +f 1360/558/877 1334/531/877 1361/559/877 +f 1334/531/878 1360/558/878 1363/561/878 +f 1334/531/879 1363/561/879 1365/563/879 +f 1334/531/880 1365/563/880 1368/565/880 +f 1334/531/881 1392/586/881 1361/559/881 +f 1334/531/882 1368/565/882 1332/529/882 +f 1502/604/331 1503/605/331 1368/565/331 +f 1336/533/331 1332/529/331 1368/565/331 +f 1368/565/331 1504/605/331 1505/537/331 +f 1368/565/331 1506/537/331 1339/536/331 +f 1368/565/331 1339/536/331 1340/538/331 +f 1368/565/331 1340/538/331 1341/539/331 +f 1336/533/331 1368/565/331 1342/540/331 +f 1368/565/331 1341/539/331 1342/540/331 +f 1331/528/883 1344/542/883 1345/543/883 +f 1346/544/884 1392/586/884 1334/531/884 +f 1392/586/331 1346/544/331 1347/545/331 +f 1348/546/331 1392/586/331 1347/545/331 +f 1392/586/331 1348/546/331 1349/547/331 +f 1389/584/331 1392/586/331 1350/548/331 +f 1392/586/331 1349/547/331 1350/548/331 +f 1351/549/331 1389/584/331 1350/548/331 +f 1387/582/331 1389/584/331 1352/550/331 +f 1389/584/331 1351/549/331 1352/550/331 +f 1387/582/331 1352/550/331 1353/551/331 +f 1387/582/331 1353/551/331 1354/552/331 +f 1385/580/331 1387/582/331 1354/552/331 +f 1385/580/331 1354/552/331 1355/553/331 +f 1385/580/331 1355/553/331 1356/554/331 +f 1385/580/331 1356/554/331 1357/555/331 +f 1385/580/331 1357/555/331 1358/556/331 +f 1331/528/885 1345/543/885 1329/526/885 +f 1337/534/331 1329/526/331 1345/543/331 +f 1410/606/886 1396/589/886 1395/588/886 +f 1411/607/887 1396/589/887 1410/606/887 +f 1396/589/888 1411/607/888 1397/590/888 +f 1412/608/888 1397/590/888 1411/607/888 +f 1397/590/889 1412/608/889 1398/591/889 +f 1413/609/889 1398/591/889 1412/608/889 +f 1398/591/890 1413/609/890 1399/592/890 +f 1414/610/890 1399/592/890 1413/609/890 +f 1399/592/891 1414/610/891 1400/593/891 +f 1415/611/891 1400/593/891 1414/610/891 +f 1400/593/892 1415/611/892 1401/594/892 +f 1416/612/892 1401/594/892 1415/611/892 +f 1507/595/893 1508/613/893 1402/596/893 +f 1417/614/893 1402/596/893 1509/613/893 +f 1402/596/894 1417/614/894 1403/597/894 +f 1418/615/895 1403/597/895 1417/614/895 +f 1403/597/896 1418/615/896 1404/598/896 +f 1419/616/897 1404/598/897 1418/615/897 +f 1404/598/898 1419/616/898 1405/599/898 +f 1420/617/899 1405/599/899 1419/616/899 +f 1405/599/900 1420/617/900 1406/600/900 +f 1421/618/901 1406/600/901 1420/617/901 +f 1406/600/902 1421/618/902 1407/601/902 +f 1422/619/902 1407/601/902 1421/618/902 +f 1407/601/903 1422/619/903 1408/602/903 +f 1423/620/903 1408/602/903 1422/619/903 +f 1408/602/904 1423/620/904 1409/603/904 +f 1424/621/904 1409/603/904 1423/620/904 +f 1409/603/905 1424/621/905 1395/588/905 +f 1410/606/906 1395/588/906 1424/621/906 +f 1425/622/331 1426/623/331 1410/606/331 +f 1410/606/331 1426/623/331 1411/607/331 +f 1426/623/331 1427/624/331 1411/607/331 +f 1411/607/331 1427/624/331 1412/608/331 +f 1412/608/907 1427/624/907 1428/625/907 +f 1412/608/908 1428/625/908 1429/626/908 +f 1412/608/909 1429/626/909 1413/609/909 +f 1413/609/331 1429/626/331 1430/627/331 +f 1413/609/331 1430/627/331 1431/628/331 +f 1413/609/331 1431/628/331 1414/610/331 +f 1414/610/331 1433/629/331 1415/611/331 +f 1415/611/331 1433/629/331 1434/630/331 +f 1415/611/331 1434/630/331 1416/612/331 +f 1510/613/910 1511/631/910 1435/632/910 +f 1512/613/911 1435/632/911 1417/614/911 +f 1419/616/331 1436/633/331 1420/617/331 +f 1420/617/331 1436/633/331 1437/634/331 +f 1420/617/331 1437/634/331 1421/618/331 +f 1421/618/331 1437/634/331 1422/619/331 +f 1422/619/331 1437/634/331 1425/622/331 +f 1422/619/331 1425/622/331 1423/620/331 +f 1423/620/331 1425/622/331 1424/621/331 +f 1424/621/331 1425/622/331 1410/606/331 +f 1427/624/912 1426/623/912 1438/635/912 +f 1439/636/913 1427/624/913 1438/635/913 +f 1427/624/914 1439/636/914 1428/625/914 +f 1428/625/915 1439/636/915 1429/626/915 +f 1440/637/888 1429/626/888 1439/636/888 +f 1429/626/916 1440/637/916 1430/627/916 +f 1441/638/916 1430/627/916 1440/637/916 +f 1430/627/917 1441/638/917 1431/628/917 +f 1442/639/917 1431/628/917 1441/638/917 +f 1431/628/918 1442/639/918 1432/640/918 +f 1443/641/918 1432/640/918 1442/639/918 +f 1432/640/919 1443/641/919 1433/629/919 +f 1444/642/919 1433/629/919 1443/641/919 +f 1433/629/920 1444/642/920 1434/630/920 +f 1445/643/920 1434/630/920 1444/642/920 +f 1513/631/921 1514/644/921 1435/632/921 +f 1446/645/921 1435/632/921 1515/644/921 +f 1435/632/922 1446/645/922 1436/633/922 +f 1447/646/923 1436/633/923 1446/645/923 +f 1436/633/924 1447/646/924 1437/634/924 +f 1448/647/925 1437/634/925 1447/646/925 +f 1437/634/926 1448/647/926 1425/622/926 +f 1449/648/927 1425/622/927 1448/647/927 +f 1425/622/928 1449/648/928 1426/623/928 +f 1438/635/928 1426/623/928 1449/648/928 +f 1414/610/331 1224/649/331 1225/650/331 +f 1224/649/331 1414/610/331 1226/651/331 +f 1414/610/331 1431/628/331 1227/652/331 +f 1226/651/331 1414/610/331 1227/652/331 +f 1431/628/331 1432/640/331 1228/653/331 +f 1227/652/331 1431/628/331 1228/653/331 +f 1228/653/331 1432/640/331 1229/654/331 +f 1229/654/331 1432/640/331 1230/655/331 +f 1432/640/331 1231/656/331 1230/655/331 +f 1231/656/331 1414/610/331 1225/650/331 +f 1436/633/331 1419/616/331 1418/615/331 +f 1418/615/331 1435/632/331 1436/633/331 +f 1418/615/331 1417/614/331 1435/632/331 +f 1385/580/331 1358/556/331 1343/541/331 +f 1385/580/929 1343/541/929 1331/528/929 +f 1343/541/930 1344/542/930 1331/528/930 +f 1231/656/331 1432/640/331 1433/629/331 +f 1414/610/331 1231/656/331 1433/629/331 +o dieshor +v -1.482136 1.397097 -0.344602 +v -1.268468 1.397097 -0.348865 +v -1.377330 1.287280 -0.182361 +v -1.377302 1.287301 -0.514561 +v -1.307080 1.274552 -0.499110 +v -1.251737 1.263808 -0.457401 +v -1.266445 1.265872 -0.219972 +v -1.329126 1.279007 -0.189400 +v -1.212771 1.255278 -0.372987 +v -1.237752 1.261046 -0.258050 +v -1.218007 1.256350 -0.300520 +v -1.527717 1.257843 -0.278473 +v -1.543168 1.254950 -0.348461 +v -1.536129 1.256586 -0.396403 +v -1.486009 1.266493 -0.473792 +v -1.425010 1.278087 -0.507522 +v -1.502398 1.263358 -0.239521 +v -1.425010 1.278135 -0.189400 +v -1.467476 1.270451 -0.209142 +v -1.377093 1.396732 -0.114997 +v -1.444477 1.396732 -0.124891 +v -1.504165 1.396732 -0.152639 +v -1.553253 1.396732 -0.195339 +v -1.588838 1.396732 -0.250089 +v -1.608022 1.396732 -0.313988 +v -1.608022 1.396732 -0.382934 +v -1.588838 1.396732 -0.446833 +v -1.553252 1.396733 -0.501583 +v -1.504165 1.396733 -0.544283 +v -1.444478 1.396732 -0.572031 +v -1.377092 1.396732 -0.581925 +v -1.309708 1.396732 -0.572031 +v -1.250021 1.396732 -0.544283 +v -1.200933 1.396732 -0.501583 +v -1.153523 1.396732 -0.415846 +v -1.143628 1.396732 -0.348461 +v -1.165346 1.396732 -0.250089 +v -1.200933 1.396732 -0.195339 +v -1.250021 1.396732 -0.152639 +v -1.309707 1.396732 -0.124892 +v -1.608081 1.339568 -0.313976 +v -1.588891 1.339568 -0.250053 +v -1.588891 1.339568 -0.446869 +v -1.553292 1.339568 -0.501639 +v -1.504186 1.339569 -0.544354 +v -1.444478 1.339568 -0.572112 +v -1.377068 1.339568 -0.582010 +v -1.309659 1.339568 -0.572112 +v -1.553291 1.339568 -0.195284 +v -1.504186 1.339568 -0.152569 +v -1.444478 1.339568 -0.124811 +v -1.377068 1.339568 -0.114913 +v -1.309659 1.339567 -0.124811 +v -1.249950 1.339567 -0.152568 +v -1.200845 1.339567 -0.195284 +v -1.249951 1.339568 -0.544354 +v -1.200845 1.339568 -0.501639 +v -1.153417 1.339568 -0.415871 +v -1.143520 1.339568 -0.348461 +v -1.165245 1.339567 -0.250054 +v -1.329126 1.339079 -0.507522 +v -1.401595 1.339079 -0.512759 +v -1.467475 1.339079 -0.487781 +v -1.502398 1.339079 -0.457401 +v -1.536129 1.339079 -0.396403 +v -1.543168 1.339079 -0.348461 +v -1.608081 1.339568 -0.382947 +v -1.536129 1.339079 -0.300520 +v -1.516387 1.339201 -0.258054 +v -1.486008 1.339201 -0.223131 +v -1.447056 1.339078 -0.197812 +v -1.401595 1.339078 -0.184164 +v -1.352542 1.339078 -0.184164 +v -1.307081 1.339078 -0.197812 +v -1.268128 1.339201 -0.223130 +v -1.226419 1.339078 -0.278474 +v -1.212771 1.339078 -0.372988 +v -1.226419 1.339079 -0.418449 +v -1.268128 1.339079 -0.473792 +v -1.376981 0.714835 -2.824126 +v -1.376981 0.433713 -2.804203 +v -1.376652 0.153096 -2.727210 +v -1.376653 0.144811 -2.193231 +v -1.376653 0.142467 -2.189049 +v -1.376653 0.144809 -2.183706 +v -1.376653 0.144746 -1.660390 +v -1.376653 0.142402 -1.655317 +v -1.376653 0.144745 -1.651051 +v -1.376653 0.149512 -1.125773 +v -1.376653 0.147219 -1.120172 +v -1.376653 0.149607 -1.115223 +v -1.376654 0.144714 -0.591684 +v -1.376654 0.142433 -0.586591 +v -1.376654 0.144837 -0.581587 +v -1.376655 0.151465 -0.039513 +v -1.376363 0.469851 0.037392 +v -1.376983 0.714836 0.045669 +v -1.484562 0.455112 -2.804203 +v -1.591646 0.195730 -2.727210 +v -1.594817 0.188075 -2.193231 +v -1.595713 0.185910 -2.189049 +v -1.594817 0.188074 -2.183705 +v -1.594842 0.188016 -1.660390 +v -1.595739 0.185850 -1.655317 +v -1.594842 0.188015 -1.651051 +v -1.593019 0.192419 -1.125772 +v -1.593896 0.190300 -1.120171 +v -1.592982 0.192507 -1.115223 +v -1.594855 0.187986 -0.591684 +v -1.595728 0.185879 -0.586591 +v -1.594808 0.188100 -0.581587 +v -1.592273 0.194223 -0.039513 +v -1.470162 0.488262 0.037392 +v -1.575764 0.516052 -2.804202 +v -1.773958 0.317393 -2.727210 +v -1.779817 0.311535 -2.193230 +v -1.781475 0.309877 -2.189049 +v -1.779818 0.311534 -2.183705 +v -1.779863 0.311489 -1.660389 +v -1.781521 0.309832 -1.655317 +v -1.779865 0.311488 -1.651051 +v -1.776494 0.314859 -1.125772 +v -1.778116 0.313238 -1.120171 +v -1.776426 0.314927 -1.115222 +v -1.779888 0.311467 -0.591683 +v -1.781501 0.309854 -0.586590 +v -1.779800 0.311554 -0.581587 +v -1.775114 0.316240 -0.039512 +v -1.549775 0.541167 0.037393 +v -1.636703 0.607255 -2.804203 +v -1.895834 0.499563 -2.727209 +v -1.903490 0.496393 -2.193230 +v -1.905656 0.495496 -2.189049 +v -1.903491 0.496392 -2.183705 +v -1.903550 0.496368 -1.660389 +v -1.905715 0.495471 -1.655316 +v -1.903551 0.496368 -1.651050 +v -1.899148 0.498192 -1.125772 +v -1.901266 0.497315 -1.120170 +v -1.899060 0.498229 -1.115222 +v -1.903581 0.496356 -0.591683 +v -1.905689 0.495483 -0.586590 +v -1.903467 0.496403 -0.581586 +v -1.897345 0.498940 -0.039512 +v -1.603082 0.620511 0.037393 +v -1.658103 0.714836 -2.804202 +v -1.938721 0.714507 -2.727209 +v -1.947006 0.714507 -2.193230 +v -1.949350 0.714507 -2.189049 +v -1.947008 0.714507 -2.183705 +v -1.947071 0.714507 -1.660389 +v -1.949415 0.714507 -1.655316 +v -1.947072 0.714507 -1.651050 +v -1.942306 0.714507 -1.125772 +v -1.944599 0.714507 -1.120171 +v -1.942211 0.714507 -1.115222 +v -1.947104 0.714507 -0.591683 +v -1.949386 0.714507 -0.586590 +v -1.946981 0.714507 -0.581586 +v -1.940354 0.714507 -0.039512 +v -1.621968 0.714216 0.037393 +v -1.636704 0.822416 -2.804203 +v -1.896086 0.929500 -2.727209 +v -1.903741 0.932671 -2.193230 +v -1.905907 0.933568 -2.189049 +v -1.903743 0.932671 -2.183705 +v -1.903801 0.932696 -1.660389 +v -1.905967 0.933593 -1.655316 +v -1.903802 0.932696 -1.651050 +v -1.899399 0.930872 -1.125771 +v -1.901518 0.931750 -1.120170 +v -1.899311 0.930836 -1.115222 +v -1.903832 0.932708 -0.591683 +v -1.905940 0.933581 -0.586590 +v -1.903718 0.932661 -0.581586 +v -1.897596 0.930125 -0.039512 +v -1.603557 0.808015 0.037393 +v -1.575764 0.913619 -2.804203 +v -1.774423 1.111813 -2.727209 +v -1.780282 1.117671 -2.193230 +v -1.781940 1.119329 -2.189049 +v -1.780283 1.117672 -2.183705 +v -1.780329 1.117717 -1.660389 +v -1.781986 1.119375 -1.655316 +v -1.780329 1.117718 -1.651051 +v -1.776959 1.114348 -1.125772 +v -1.778580 1.115969 -1.120170 +v -1.776891 1.114280 -1.115222 +v -1.780352 1.117740 -0.591683 +v -1.781965 1.119353 -0.586590 +v -1.780265 1.117653 -0.581586 +v -1.775579 1.112967 -0.039512 +v -1.550652 0.887628 0.037393 +v -1.484561 0.974559 -2.804202 +v -1.592253 1.233689 -2.727209 +v -1.595424 1.241344 -2.193230 +v -1.596321 1.243510 -2.189049 +v -1.595424 1.241345 -2.183705 +v -1.595448 1.241404 -1.660389 +v -1.596346 1.243569 -1.655317 +v -1.595449 1.241405 -1.651051 +v -1.593625 1.237001 -1.125772 +v -1.594503 1.239120 -1.120171 +v -1.593589 1.236913 -1.115222 +v -1.595462 1.241434 -0.591683 +v -1.596335 1.243541 -0.586590 +v -1.595415 1.241320 -0.581587 +v -1.592879 1.235197 -0.039512 +v -1.471308 0.940935 0.037393 +v -1.376980 0.995958 -2.804203 +v -1.377310 1.276575 -2.727210 +v -1.377310 1.284860 -2.193231 +v -1.377310 1.287204 -2.189049 +v -1.377310 1.284862 -2.183706 +v -1.377310 1.284925 -1.660389 +v -1.377310 1.287269 -1.655317 +v -1.377310 1.284926 -1.651051 +v -1.377310 1.280160 -1.125772 +v -1.377310 1.282452 -1.120171 +v -1.377310 1.280064 -1.115222 +v -1.377311 1.284957 -0.591683 +v -1.377311 1.287239 -0.586591 +v -1.377311 1.284834 -0.581587 +v -1.377311 1.278207 -0.039512 +v -1.377603 0.959821 0.037393 +v -1.269399 0.974558 -2.804203 +v -1.162316 1.233941 -2.727210 +v -1.159146 1.241596 -2.193231 +v -1.158249 1.243761 -2.189049 +v -1.159145 1.241597 -2.183705 +v -1.159122 1.241655 -1.660390 +v -1.158224 1.243821 -1.655317 +v -1.159121 1.241656 -1.651051 +v -1.160945 1.237253 -1.125772 +v -1.160068 1.239371 -1.120171 +v -1.160982 1.237164 -1.115223 +v -1.159110 1.241685 -0.591684 +v -1.158237 1.243793 -0.586591 +v -1.159157 1.241571 -0.581587 +v -1.161693 1.235449 -0.039513 +v -1.283804 0.941410 0.037392 +v -1.178197 0.913619 -2.804203 +v -0.980004 1.112277 -2.727211 +v -0.974145 1.118136 -2.193231 +v -0.972487 1.119794 -2.189049 +v -0.974145 1.118137 -2.183706 +v -0.974100 1.118182 -1.660390 +v -0.972443 1.119839 -1.655318 +v -0.974099 1.118183 -1.651051 +v -0.977470 1.114812 -1.125772 +v -0.975849 1.116434 -1.120172 +v -0.977537 1.114745 -1.115223 +v -0.974078 1.118205 -0.591684 +v -0.972465 1.119818 -0.586591 +v -0.974165 1.118117 -0.581587 +v -0.978852 1.113432 -0.039513 +v -1.204191 0.888505 0.037392 +v -1.117258 0.822416 -2.804203 +v -0.858127 0.930107 -2.727211 +v -0.850472 0.933278 -2.193231 +v -0.848307 0.934175 -2.189050 +v -0.850472 0.933278 -2.183706 +v -0.850413 0.933303 -1.660390 +v -0.848248 0.934200 -1.655317 +v -0.850412 0.933303 -1.651052 +v -0.854816 0.931479 -1.125772 +v -0.852698 0.932356 -1.120171 +v -0.854904 0.931442 -1.115223 +v -0.850384 0.933315 -0.591685 +v -0.848277 0.934188 -0.586591 +v -0.850498 0.933268 -0.581587 +v -0.856622 0.930732 -0.039513 +v -1.150884 0.809160 0.037392 +v -1.095858 0.714835 -2.804203 +v -0.815242 0.715164 -2.727210 +v -0.806956 0.715164 -2.193232 +v -0.804612 0.715164 -2.189050 +v -0.806955 0.715164 -2.183707 +v -0.806892 0.715164 -1.660390 +v -0.804549 0.715164 -1.655318 +v -0.806891 0.715164 -1.651052 +v -0.811657 0.715164 -1.125773 +v -0.809365 0.715164 -1.120172 +v -0.811753 0.715164 -1.115223 +v -0.806861 0.715164 -0.591685 +v -0.804580 0.715164 -0.586591 +v -0.806984 0.715164 -0.581588 +v -0.813612 0.715164 -0.039513 +v -1.131998 0.715456 0.037392 +v -1.117258 0.607254 -2.804204 +v -0.857876 0.500171 -2.727211 +v -0.850221 0.497000 -2.193231 +v -0.848056 0.496103 -2.189050 +v -0.850220 0.496999 -2.183706 +v -0.850162 0.496975 -1.660390 +v -0.847996 0.496078 -1.655318 +v -0.850161 0.496975 -1.651052 +v -0.854565 0.498799 -1.125773 +v -0.852447 0.497921 -1.120172 +v -0.854653 0.498836 -1.115223 +v -0.850133 0.496963 -0.591685 +v -0.848026 0.496090 -0.586591 +v -0.850247 0.497010 -0.581588 +v -0.856370 0.499546 -0.039513 +v -1.150409 0.621657 0.037392 +v -1.178197 0.516052 -2.804203 +v -0.979539 0.317858 -2.727210 +v -0.973681 0.311999 -2.193232 +v -0.972023 0.310342 -2.189050 +v -0.973680 0.311998 -2.183707 +v -0.973635 0.311954 -1.660390 +v -0.971978 0.310296 -1.655318 +v -0.973635 0.311953 -1.651052 +v -0.977005 0.315323 -1.125773 +v -0.975384 0.313702 -1.120172 +v -0.977073 0.315391 -1.115223 +v -0.973614 0.311931 -0.591685 +v -0.972001 0.310318 -0.586591 +v -0.973701 0.312018 -0.581587 +v -0.978387 0.316704 -0.039513 +v -1.203315 0.542044 0.037392 +v -1.269400 0.455112 -2.804203 +v -1.161709 0.195982 -2.727211 +v -1.158539 0.188327 -2.193231 +v -1.157642 0.186161 -2.189049 +v -1.158538 0.188326 -2.183706 +v -1.158514 0.188267 -1.660391 +v -1.157618 0.186102 -1.655317 +v -1.158514 0.188266 -1.651052 +v -1.160339 0.192670 -1.125772 +v -1.159461 0.190552 -1.120171 +v -1.160375 0.192758 -1.115223 +v -1.158504 0.188238 -0.591684 +v -1.157630 0.186130 -0.586591 +v -1.158551 0.188352 -0.581587 +v -1.161087 0.194474 -0.039513 +v -1.282659 0.488737 0.037392 +v -1.376981 0.714835 -2.824126 +v -1.376981 0.714835 -2.824126 +v -1.376983 0.714836 0.045669 +v -1.376981 0.714835 -2.824126 +v -1.376983 0.714836 0.045669 +v -1.376981 0.714835 -2.824126 +v -1.376983 0.714836 0.045669 +v -1.376981 0.714835 -2.824126 +v -1.376983 0.714836 0.045669 +v -1.095858 0.714835 -2.804203 +v -1.095858 0.714835 -2.804203 +v -0.815242 0.715164 -2.727210 +v -1.095858 0.714835 -2.804203 +v -0.815242 0.715164 -2.727210 +v -0.806956 0.715164 -2.193232 +v -0.815242 0.715164 -2.727210 +v -0.806956 0.715164 -2.193232 +v -0.804612 0.715164 -2.189050 +v -0.806956 0.715164 -2.193232 +v -0.804612 0.715164 -2.189050 +v -0.806955 0.715164 -2.183707 +v -0.804612 0.715164 -2.189050 +v -0.806955 0.715164 -2.183707 +v -0.806892 0.715164 -1.660390 +v -0.806955 0.715164 -2.183707 +v -0.806892 0.715164 -1.660390 +v -0.804549 0.715164 -1.655318 +v -0.806892 0.715164 -1.660390 +v -0.804549 0.715164 -1.655318 +v -0.806891 0.715164 -1.651052 +v -0.804549 0.715164 -1.655318 +v -0.806891 0.715164 -1.651052 +v -0.811657 0.715164 -1.125773 +v -0.806891 0.715164 -1.651052 +v -0.811657 0.715164 -1.125773 +v -0.809365 0.715164 -1.120172 +v -0.811657 0.715164 -1.125773 +v -0.809365 0.715164 -1.120172 +v -0.811753 0.715164 -1.115223 +v -0.809365 0.715164 -1.120172 +v -0.811753 0.715164 -1.115223 +v -0.806861 0.715164 -0.591685 +v -0.811753 0.715164 -1.115223 +v -0.806861 0.715164 -0.591685 +v -0.804580 0.715164 -0.586591 +v -0.806861 0.715164 -0.591685 +v -0.804580 0.715164 -0.586591 +v -0.806984 0.715164 -0.581588 +v -0.804580 0.715164 -0.586591 +v -0.806984 0.715164 -0.581588 +v -0.813612 0.715164 -0.039513 +v -0.806984 0.715164 -0.581588 +v -0.813612 0.715164 -0.039513 +v -1.131998 0.715456 0.037392 +v -0.813612 0.715164 -0.039513 +v -1.131998 0.715456 0.037392 +vt 0.190735 0.839182 +vt 0.193609 0.896941 +vt 0.188361 0.862662 +vt 0.202488 0.916019 +vt 0.202488 0.809306 +vt 0.215244 0.930898 +vt 0.231371 0.940567 +vt 0.268691 0.940567 +vt 0.250031 0.944014 +vt 0.284816 0.930898 +vt 0.297569 0.916019 +vt 0.306446 0.896941 +vt 0.311087 0.850650 +vt 0.311087 0.874675 +vt 0.306446 0.828384 +vt 0.297569 0.809306 +vt 0.284816 0.794427 +vt 0.215244 0.794427 +vt 0.268691 0.784758 +vt 0.250031 0.781310 +vt 0.231371 0.784758 +vt 0.220184 0.862522 +vt 0.278914 0.864007 +vt 0.316566 0.874679 +vt 0.311595 0.896953 +vt 0.311595 0.828371 +vt 0.302033 0.809287 +vt 0.288188 0.794402 +vt 0.270546 0.784730 +vt 0.250027 0.781281 +vt 0.229507 0.784730 +vt 0.302033 0.916038 +vt 0.288188 0.930923 +vt 0.270546 0.940595 +vt 0.250027 0.944044 +vt 0.229507 0.940595 +vt 0.211863 0.930923 +vt 0.198015 0.916038 +vt 0.211863 0.794402 +vt 0.198015 0.809286 +vt 0.185370 0.839173 +vt 0.182831 0.862662 +vt 0.188451 0.896953 +vt 0.235380 0.807236 +vt 0.257535 0.805412 +vt 0.277449 0.814116 +vt 0.287702 0.824701 +vt 0.297313 0.845957 +vt 0.299277 0.862662 +vt 0.316566 0.850646 +vt 0.297313 0.879368 +vt 0.291718 0.894165 +vt 0.282918 0.906335 +vt 0.271340 0.915157 +vt 0.257535 0.919913 +vt 0.242518 0.919913 +vt 0.228713 0.915157 +vt 0.217134 0.906335 +vt 0.205103 0.887050 +vt 0.201273 0.854116 +vt 0.205103 0.838275 +vt 0.250118 0.920541 +vt 0.233667 0.918088 +vt 0.211884 0.907435 +vt 0.266420 0.918088 +vt 0.281121 0.911209 +vt 0.293223 0.900623 +vt 0.301940 0.887050 +vt 0.307152 0.862662 +vt 0.304752 0.845957 +vt 0.287569 0.818990 +vt 0.266421 0.807236 +vt 0.217127 0.818990 +vt 0.206872 0.824701 +vt 0.193507 0.854116 +vt 0.195279 0.879368 +vt 0.202073 0.894167 +vt 0.226030 0.810168 +vt 0.250108 0.804783 +vt 0.750004 -0.000000 +vt 0.750001 0.006942 +vt 0.692940 0.006942 +vt 0.750093 0.033771 +vt 0.688095 0.033771 +vt 0.750092 0.219840 +vt 0.688016 0.219840 +vt 0.750092 0.221297 +vt 0.687994 0.221297 +vt 0.750092 0.223159 +vt 0.688016 0.223159 +vt 0.750092 0.405512 +vt 0.688015 0.405512 +vt 0.750091 0.407280 +vt 0.687993 0.407280 +vt 0.750092 0.408766 +vt 0.688015 0.408766 +vt 0.750092 0.591803 +vt 0.688060 0.591803 +vt 0.750092 0.593755 +vt 0.688038 0.593755 +vt 0.750092 0.595479 +vt 0.688061 0.595479 +vt 0.750091 0.777910 +vt 0.688014 0.777910 +vt 0.750091 0.779685 +vt 0.687993 0.779685 +vt 0.750091 0.781429 +vt 0.688015 0.781429 +vt 0.750092 0.970318 +vt 0.688078 0.970318 +vt 0.750360 0.997116 +vt 0.694611 0.997116 +vt 0.749994 1.000000 +vt 0.637076 0.006942 +vt 0.628102 0.033771 +vt 0.627960 0.219840 +vt 0.627921 0.221297 +vt 0.627960 0.223159 +vt 0.627959 0.405512 +vt 0.627920 0.407280 +vt 0.627959 0.408766 +vt 0.628040 0.591803 +vt 0.628001 0.593755 +vt 0.628041 0.595479 +vt 0.627958 0.777910 +vt 0.627920 0.779685 +vt 0.627960 0.781429 +vt 0.628073 0.970318 +vt 0.639888 0.997116 +vt 0.582560 0.006942 +vt 0.570598 0.033771 +vt 0.570414 0.219840 +vt 0.570363 0.221297 +vt 0.570414 0.223159 +vt 0.570412 0.405512 +vt 0.570361 0.407280 +vt 0.570412 0.408766 +vt 0.570517 0.591803 +vt 0.570466 0.593755 +vt 0.570519 0.595479 +vt 0.570411 0.777910 +vt 0.570361 0.779685 +vt 0.570414 0.781429 +vt 0.570560 0.970318 +vt 0.586276 0.997116 +vt 0.528074 0.006942 +vt 0.514244 0.033771 +vt 0.514038 0.219840 +vt 0.513981 0.221297 +vt 0.514038 0.223159 +vt 0.514036 0.405512 +vt 0.513979 0.407280 +vt 0.514036 0.408766 +vt 0.514154 0.591803 +vt 0.514097 0.593755 +vt 0.514156 0.595479 +vt 0.514035 0.777910 +vt 0.513979 0.779685 +vt 0.514038 0.781429 +vt 0.514202 0.970318 +vt 0.532461 0.997116 +vt 0.470882 0.006942 +vt 0.456431 0.033771 +vt 0.456223 0.219840 +vt 0.456165 0.221297 +vt 0.456223 0.223159 +vt 0.456221 0.405512 +vt 0.456163 0.407280 +vt 0.456221 0.408766 +vt 0.456340 0.591803 +vt 0.456282 0.593755 +vt 0.456342 0.595479 +vt 0.456220 0.777910 +vt 0.456164 0.779685 +vt 0.456223 0.781428 +vt 0.456389 0.970318 +vt 0.475665 0.997116 +vt 0.407110 0.006942 +vt 0.394047 0.033771 +vt 0.393865 0.219840 +vt 0.393815 0.221297 +vt 0.393865 0.223159 +vt 0.393863 0.405512 +vt 0.393813 0.407280 +vt 0.393863 0.408766 +vt 0.393967 0.591803 +vt 0.393917 0.593755 +vt 0.393969 0.595479 +vt 0.393863 0.777910 +vt 0.393814 0.779685 +vt 0.393865 0.781428 +vt 0.394010 0.970318 +vt 0.411746 0.997116 +vt 0.333132 0.006942 +vt 0.324873 0.033771 +vt 0.324761 0.219840 +vt 0.324730 0.221297 +vt 0.324761 0.223159 +vt 0.324760 0.405512 +vt 0.324729 0.407279 +vt 0.324760 0.408766 +vt 0.324824 0.591803 +vt 0.324794 0.593755 +vt 0.324826 0.595479 +vt 0.324760 0.777910 +vt 0.324730 0.779685 +vt 0.324762 0.781428 +vt 0.324851 0.970318 +vt 0.336463 0.997116 +vt -0.249996 -0.000000 +vt 0.249999 0.006942 +vt 0.250113 0.033771 +vt 0.250111 0.219839 +vt 0.250111 0.221297 +vt 0.250111 0.223159 +vt 0.250111 0.405512 +vt 0.250111 0.407279 +vt 0.250111 0.408766 +vt 0.250113 0.591803 +vt 0.250112 0.593755 +vt 0.250113 0.595479 +vt 0.250112 0.777910 +vt 0.250111 0.779684 +vt 0.250112 0.781428 +vt 0.250113 0.970318 +vt 0.250571 0.997116 +vt 0.166866 0.006942 +vt 0.175343 0.033771 +vt 0.175452 0.219839 +vt 0.175482 0.221297 +vt 0.175452 0.223159 +vt 0.175453 0.405512 +vt 0.175483 0.407279 +vt 0.175453 0.408766 +vt 0.175391 0.591803 +vt 0.175421 0.593755 +vt 0.175390 0.595479 +vt 0.175454 0.777910 +vt 0.175483 0.779684 +vt 0.175452 0.781428 +vt 0.175366 0.970318 +vt 0.164592 0.997116 +vt -0.250006 1.000000 +vt 0.092889 0.006942 +vt 0.106149 0.033771 +vt 0.106328 0.219839 +vt 0.106377 0.221297 +vt 0.106328 0.223159 +vt 0.106329 0.405512 +vt 0.106379 0.407279 +vt 0.106329 0.408766 +vt 0.106228 0.591803 +vt 0.106277 0.593755 +vt 0.106225 0.595479 +vt 0.106331 0.777910 +vt 0.106379 0.779684 +vt 0.106328 0.781428 +vt 0.106186 0.970318 +vt 0.089147 0.997116 +vt 0.029118 0.006942 +vt 0.043746 0.033771 +vt 0.043952 0.219839 +vt 0.044009 0.221297 +vt 0.043952 0.223159 +vt 0.043954 0.405512 +vt 0.044011 0.407279 +vt 0.043954 0.408766 +vt 0.043837 0.591803 +vt 0.043893 0.593755 +vt 0.043834 0.595479 +vt 0.043955 0.777910 +vt 0.044011 0.779684 +vt 0.043952 0.781428 +vt 0.043788 0.970318 +vt 0.025104 0.997116 +vt -0.028074 0.006942 +vt -0.014075 0.033771 +vt -0.013872 0.219839 +vt -0.013815 0.221297 +vt -0.013872 0.223159 +vt -0.013870 0.405512 +vt -0.013813 0.407279 +vt -0.013870 0.408766 +vt -0.013986 0.591803 +vt -0.013930 0.593755 +vt -0.013988 0.595479 +vt -0.013869 0.777910 +vt -0.013814 0.779684 +vt -0.013872 0.781428 +vt -0.014034 0.970318 +vt -0.031756 0.997116 +vt 0.971926 0.006942 +vt 0.917440 0.006942 +vt 0.985925 0.033771 +vt 0.929571 0.033771 +vt 0.986128 0.219839 +vt 0.929753 0.219840 +vt 0.986185 0.221297 +vt 0.929803 0.221297 +vt 0.986128 0.223159 +vt 0.929753 0.223159 +vt 0.986130 0.405512 +vt 0.929754 0.405512 +vt 0.986187 0.407279 +vt 0.929804 0.407279 +vt 0.986130 0.408766 +vt 0.929754 0.408766 +vt 0.986014 0.591803 +vt 0.929651 0.591803 +vt 0.986070 0.593755 +vt 0.929701 0.593755 +vt 0.986012 0.595479 +vt 0.929649 0.595479 +vt 0.986131 0.777910 +vt 0.929755 0.777910 +vt 0.986186 0.779684 +vt 0.929804 0.779685 +vt 0.986128 0.781428 +vt 0.929752 0.781428 +vt 0.985966 0.970318 +vt 0.929608 0.970318 +vt 0.968244 0.997116 +vt 0.914411 0.997116 +vt 0.862925 0.006942 +vt 0.872073 0.033771 +vt 0.872212 0.219840 +vt 0.872251 0.221297 +vt 0.872212 0.223159 +vt 0.872213 0.405512 +vt 0.872252 0.407280 +vt 0.872214 0.408766 +vt 0.872134 0.591803 +vt 0.872172 0.593755 +vt 0.872132 0.595479 +vt 0.872214 0.777910 +vt 0.872252 0.779685 +vt 0.872212 0.781428 +vt 0.872101 0.970318 +vt 0.860807 0.997116 +vt 0.807061 0.006942 +vt 0.812088 0.033771 +vt 0.812165 0.219840 +vt 0.812186 0.221297 +vt 0.812165 0.223159 +vt 0.812165 0.405512 +vt 0.812186 0.407280 +vt 0.812165 0.408766 +vt 0.812121 0.591803 +vt 0.812142 0.593755 +vt 0.812120 0.595479 +vt 0.812165 0.777910 +vt 0.812186 0.779685 +vt 0.812164 0.781428 +vt 0.812103 0.970318 +vt 0.806101 0.997116 +vn -0.000002 1.000000 0.000002 +vn 0.000004 1.000000 0.000002 +vn -0.000000 1.000000 0.000002 +vn 0.000001 1.000000 0.000002 +vn 0.000001 1.000000 0.000001 +vn -0.000002 1.000000 -0.000000 +vn 0.000002 1.000000 0.000003 +vn 0.000001 1.000000 0.000000 +vn 0.000001 1.000000 0.000005 +vn 0.000002 1.000000 -0.000002 +vn 0.000002 1.000000 -0.000000 +vn 0.000002 1.000000 0.000001 +vn -0.174175 0.981511 -0.079368 +vn -0.006137 0.999892 -0.013319 +vn -0.957770 0.001058 0.287535 +vn -0.957768 0.001050 0.287541 +vn -0.838452 0.001111 -0.544974 +vn -0.838450 0.001108 -0.544977 +vn -0.656315 0.001187 -0.754486 +vn -0.656311 0.001180 -0.754490 +vn -0.421556 0.001281 -0.906801 +vn -0.421555 0.001279 -0.906802 +vn -0.145271 0.001395 -0.989391 +vn -0.145282 0.001408 -0.989389 +vn 0.145271 0.001532 -0.989391 +vn 0.145274 0.001528 -0.989390 +vn -0.838448 0.001109 0.544981 +vn -0.838455 0.001093 0.544970 +vn -0.656310 0.001172 0.754490 +vn -0.421560 0.001277 0.906800 +vn -0.421555 0.001271 0.906802 +vn -0.145269 0.001393 0.989391 +vn -0.145269 0.001392 0.989391 +vn 0.145270 0.001519 0.989391 +vn 0.145271 0.001517 0.989391 +vn 0.421560 0.001639 0.906799 +vn 0.421558 0.001641 0.906800 +vn 0.656305 0.001732 0.754493 +vn 0.656311 0.001741 0.754488 +vn 0.421563 0.001647 -0.906798 +vn 0.656305 0.001746 -0.754494 +vn 0.656305 0.001746 -0.754493 +vn 0.875115 0.001819 -0.483911 +vn 0.875115 0.001818 -0.483911 +vn 0.989390 0.001884 -0.145273 +vn 0.976485 0.001859 0.215577 +vn 0.976485 0.001853 0.215580 +vn 0.838447 0.001813 0.544980 +vn 0.004025 -0.999981 -0.004630 +vn 0.000828 -0.999934 -0.011502 +vn 0.002227 -0.999986 -0.004790 +vn 0.000981 -0.999977 -0.006719 +vn -0.000888 -0.999981 -0.006045 +vn -0.003095 -0.999962 -0.008162 +vn -0.004808 -0.999973 -0.005532 +vn -0.003091 -0.999973 -0.006646 +vn -0.004807 -0.999973 -0.005532 +vn -0.006493 -0.999972 -0.003592 +vn -0.005720 -0.999977 -0.003718 +vn -0.008134 -0.999966 -0.001194 +vn -0.006503 -0.999977 -0.001952 +vn -0.008178 -0.999966 0.001201 +vn -0.957768 0.001060 -0.287541 +vn -0.957769 0.001055 -0.287537 +vn -0.999999 0.001032 0.000002 +vn -1.000000 0.001034 0.000000 +vn -0.006803 -0.999977 0.000000 +vn -0.008039 -0.999946 0.006615 +vn -0.004898 -0.999987 0.001463 +vn -0.004616 -0.999981 0.004012 +vn -0.004297 -0.999987 0.002793 +vn -0.004556 -0.999987 0.002169 +vn -0.004485 -0.999977 0.005156 +vn -0.002355 -0.999967 0.007844 +vn -0.002871 -0.999977 0.006168 +vn 0.000000 -0.999966 0.008243 +vn -0.000986 -0.999977 0.006715 +vn 0.002373 -0.999966 0.007905 +vn 0.000985 -0.999977 0.006733 +vn 0.007666 -0.999946 0.006969 +vn 0.002158 -0.999987 0.004642 +vn 0.003458 -0.999982 0.004818 +vn 0.003694 -0.999984 0.004247 +vn 0.006142 -0.999973 0.003992 +vn 0.007496 -0.999971 0.001080 +vn 0.006553 -0.999977 0.001444 +vn 0.007906 -0.999966 -0.002376 +vn 0.006738 -0.999977 -0.000993 +vn 0.139035 -0.032082 0.989768 +vn 0.287424 0.028583 0.957377 +vn 0.432605 -0.032594 0.900994 +vn -0.000000 0.034788 0.999395 +vn -0.140127 -0.031194 0.989642 +vn -0.287430 0.028172 0.957387 +vn -0.417592 -0.025694 0.908271 +vn -0.544784 0.023712 0.838241 +vn -0.653580 -0.022242 0.756531 +vn -0.754316 0.021217 0.656169 +vn -0.836923 -0.020715 0.546928 +vn -0.906632 0.020491 0.421425 +vn -0.975254 -0.042081 0.217044 +vn -0.989392 0.000001 0.145273 +vn -0.989391 -0.000001 -0.145274 +vn -0.989392 0.000001 -0.145270 +vn -0.875115 0.000001 -0.483915 +vn -0.833816 -0.064469 -0.548266 +vn -0.656156 0.022170 -0.754300 +vn -0.476431 -0.047544 -0.877925 +vn 0.004158 -0.999963 -0.007526 +vn 0.005918 -0.999977 -0.003274 +vn 0.006886 -0.999963 -0.005192 +vn 0.797866 0.042802 -0.601313 +vn 0.901524 -0.083515 -0.424594 +vn 0.957768 -0.000003 -0.287541 +vn 0.989734 -0.000001 0.142923 +vn 0.994106 0.082269 0.070611 +vn 0.905719 -0.020725 0.423372 +vn 0.797962 0.041489 0.601278 +vn 0.544216 0.048568 0.837538 +vn -0.002701 0.999996 0.000811 +vn 0.009338 0.999853 0.014403 +vn 0.000250 0.999999 0.001677 +vn 0.015572 0.999869 0.004498 +vn 0.595680 -0.044918 -0.801965 +vn -0.353966 0.055740 -0.933596 +vn 0.204569 -0.057495 -0.977162 +vn 0.483282 0.051183 -0.873967 +vn 0.071898 0.068378 -0.995065 +vn -0.139987 -0.031222 -0.989661 +vn 0.800547 0.044118 0.597644 +vn 0.421563 0.001648 -0.906798 +vn -0.014063 -0.070686 -0.997400 +vn -0.052409 -0.264285 -0.963020 +vn -0.052548 -0.264167 -0.963044 +vn -0.194502 -0.980784 -0.015219 +vn -0.194494 -0.980786 -0.015215 +vn -0.170462 -0.859545 -0.481794 +vn -0.170469 -0.859596 -0.481700 +vn -0.178701 -0.901110 0.395052 +vn -0.178711 -0.901144 0.394970 +vn -0.194524 -0.980898 -0.000119 +vn -0.194525 -0.980898 -0.000119 +vn -0.177179 -0.893417 -0.412813 +vn -0.177183 -0.893451 -0.412736 +vn -0.171254 -0.863554 0.474285 +vn -0.171265 -0.863600 0.474197 +vn -0.194512 -0.980860 0.008900 +vn -0.194517 -0.980859 0.008898 +vn -0.180517 -0.910268 -0.372593 +vn -0.180521 -0.910300 -0.372512 +vn -0.175814 -0.886572 0.427877 +vn -0.175818 -0.886589 0.427842 +vn -0.194517 -0.980856 -0.009168 +vn -0.194512 -0.980857 -0.009166 +vn -0.178096 -0.898041 -0.402249 +vn -0.178102 -0.898082 -0.402155 +vn -0.175956 -0.887266 0.426379 +vn -0.175965 -0.887302 0.426299 +vn -0.194504 -0.980828 0.011991 +vn -0.194511 -0.980827 0.011988 +vn -0.046029 -0.234506 0.971024 +vn -0.046527 -0.234632 0.970970 +vn -0.006630 -0.033780 0.999407 +vn -0.040043 -0.059925 -0.997399 +vn -0.149558 -0.224109 -0.963020 +vn -0.149641 -0.223950 -0.963044 +vn -0.555027 -0.831693 -0.015219 +vn -0.555020 -0.831698 -0.015215 +vn -0.486429 -0.728898 -0.481762 +vn -0.486437 -0.728911 -0.481735 +vn -0.509938 -0.764133 0.395048 +vn -0.509958 -0.764159 0.394973 +vn -0.555091 -0.831790 -0.000119 +vn -0.555090 -0.831790 -0.000119 +vn -0.505588 -0.757607 -0.412810 +vn -0.505599 -0.757627 -0.412760 +vn -0.488689 -0.732291 0.474271 +vn -0.488718 -0.732331 0.474179 +vn -0.555066 -0.831759 0.008899 +vn -0.555068 -0.831757 0.008898 +vn -0.515124 -0.771903 -0.372576 +vn -0.515130 -0.771914 -0.372546 +vn -0.501691 -0.751780 0.427941 +vn -0.501713 -0.751809 0.427863 +vn -0.555067 -0.831755 -0.009168 +vn -0.555064 -0.831757 -0.009167 +vn -0.508207 -0.761532 -0.402238 +vn -0.508215 -0.761546 -0.402202 +vn -0.502109 -0.752397 0.426363 +vn -0.502112 -0.752401 0.426352 +vn -0.555047 -0.831733 0.011990 +vn -0.555052 -0.831729 0.011988 +vn -0.132265 -0.199040 0.971025 +vn -0.132776 -0.198966 0.970970 +vn -0.019052 -0.028672 0.999407 +vn -0.059925 -0.040043 -0.997399 +vn -0.223938 -0.149817 -0.963020 +vn -0.223953 -0.149641 -0.963044 +vn -0.831053 -0.555985 -0.015219 +vn -0.831049 -0.555991 -0.015216 +vn -0.728309 -0.487246 -0.481828 +vn -0.728341 -0.487270 -0.481754 +vn -0.763543 -0.510819 0.395053 +vn -0.763560 -0.510829 0.395006 +vn -0.831149 -0.556049 -0.000119 +vn -0.831150 -0.556049 -0.000119 +vn -0.757015 -0.506448 -0.412842 +vn -0.757061 -0.506483 -0.412715 +vn -0.731734 -0.489538 0.474254 +vn -0.731743 -0.489544 0.474235 +vn -0.831114 -0.556031 0.008900 +vn -0.831117 -0.556026 0.008898 +vn -0.771288 -0.516003 -0.372633 +vn -0.771318 -0.516026 -0.372539 +vn -0.751188 -0.502562 0.427958 +vn -0.751254 -0.502600 0.427796 +vn -0.831114 -0.556026 -0.009169 +vn -0.831111 -0.556031 -0.009167 +vn -0.760927 -0.509066 -0.402295 +vn -0.760965 -0.509095 -0.402187 +vn -0.751779 -0.502952 0.426460 +vn -0.751844 -0.502990 0.426301 +vn -0.831086 -0.556015 0.011991 +vn -0.831089 -0.556011 0.011988 +vn -0.198366 -0.133273 0.971025 +vn -0.198808 -0.133010 0.970971 +vn -0.028573 -0.019198 0.999407 +vn -0.070688 -0.014058 -0.997399 +vn -0.264225 -0.052719 -0.963019 +vn -0.264169 -0.052544 -0.963044 +vn -0.980559 -0.195633 -0.015220 +vn -0.980557 -0.195645 -0.015215 +vn -0.859321 -0.171442 -0.481845 +vn -0.859332 -0.171445 -0.481825 +vn -0.900888 -0.179739 0.395088 +vn -0.900929 -0.179744 0.394993 +vn -0.980673 -0.195655 -0.000120 +vn -0.980672 -0.195657 -0.000119 +vn -0.893222 -0.178206 -0.412793 +vn -0.893252 -0.178214 -0.412723 +vn -0.863338 -0.172247 0.474318 +vn -0.863426 -0.172260 0.474153 +vn -0.980632 -0.195654 0.008900 +vn -0.980634 -0.195648 0.008897 +vn -0.910047 -0.181568 -0.372623 +vn -0.910094 -0.181581 -0.372500 +vn -0.886368 -0.176846 0.427876 +vn -0.886417 -0.176852 0.427771 +vn -0.980632 -0.195646 -0.009169 +vn -0.980631 -0.195652 -0.009166 +vn -0.897828 -0.179123 -0.402268 +vn -0.897858 -0.179131 -0.402198 +vn -0.887062 -0.176979 0.426379 +vn -0.887112 -0.176986 0.426273 +vn -0.980601 -0.195648 0.011991 +vn -0.980602 -0.195641 0.011988 +vn -0.234267 -0.047216 0.971025 +vn -0.234576 -0.046801 0.970971 +vn -0.033745 -0.006801 0.999407 +vn -0.070688 0.014058 -0.997399 +vn -0.264285 0.052410 -0.963020 +vn -0.264172 0.052544 -0.963043 +vn -0.980784 0.194502 -0.015218 +vn -0.980785 0.194497 -0.015216 +vn -0.859480 0.170451 -0.481913 +vn -0.859614 0.170471 -0.481668 +vn -0.901103 0.178701 0.395069 +vn -0.901155 0.178716 0.394943 +vn -0.980897 0.194527 -0.000119 +vn -0.980897 0.194526 -0.000119 +vn -0.893420 0.177179 -0.412805 +vn -0.893425 0.177180 -0.412794 +vn -0.863579 0.171261 0.474237 +vn -0.863530 0.171249 0.474331 +vn -0.980859 0.194514 0.008899 +vn -0.980858 0.194520 0.008897 +vn -0.910274 0.180518 -0.372578 +vn -0.910284 0.180519 -0.372552 +vn -0.886584 0.175818 0.427851 +vn -0.886568 0.175814 0.427885 +vn -0.980856 0.194517 -0.009169 +vn -0.980857 0.194514 -0.009167 +vn -0.898030 0.178093 -0.402275 +vn -0.898057 0.178097 -0.402213 +vn -0.887277 0.175960 0.426353 +vn -0.887295 0.175965 0.426314 +vn -0.980828 0.194506 0.011991 +vn -0.980827 0.194512 0.011988 +vn -0.234504 0.046028 0.971025 +vn -0.234631 0.046528 0.970971 +vn -0.033779 0.006629 0.999407 +vn -0.059926 0.040039 -0.997399 +vn -0.224113 0.149558 -0.963019 +vn -0.223954 0.149640 -0.963043 +vn -0.831693 0.555027 -0.015220 +vn -0.831699 0.555018 -0.015215 +vn -0.728898 0.486427 -0.481764 +vn -0.728915 0.486437 -0.481727 +vn -0.764138 0.509947 0.395027 +vn -0.764115 0.509929 0.395095 +vn -0.831791 0.555089 -0.000119 +vn -0.831789 0.555092 -0.000120 +vn -0.757588 0.505575 -0.412862 +vn -0.757649 0.505611 -0.412705 +vn -0.732228 0.488649 0.474410 +vn -0.732318 0.488714 0.474204 +vn -0.831759 0.555066 0.008899 +vn -0.831758 0.555067 0.008898 +vn -0.771887 0.515114 -0.372623 +vn -0.771917 0.515130 -0.372539 +vn -0.751771 0.501687 0.427961 +vn -0.751808 0.501714 0.427863 +vn -0.831755 0.555067 -0.009169 +vn -0.831757 0.555064 -0.009167 +vn -0.761512 0.508193 -0.402292 +vn -0.761539 0.508209 -0.402220 +vn -0.752384 0.502100 0.426396 +vn -0.752407 0.502117 0.426335 +vn -0.831734 0.555045 0.011991 +vn -0.831729 0.555052 0.011988 +vn -0.199038 0.132268 0.971025 +vn -0.198964 0.132776 0.970971 +vn -0.028670 0.019053 0.999407 +vn -0.040036 0.059929 -0.997399 +vn -0.149820 0.223938 -0.963019 +vn -0.149634 0.223954 -0.963044 +vn -0.555985 0.831053 -0.015219 +vn -0.555992 0.831049 -0.015215 +vn -0.487251 0.728319 -0.481807 +vn -0.487289 0.728371 -0.481691 +vn -0.510795 0.763504 0.395157 +vn -0.510831 0.763565 0.394995 +vn -0.556048 0.831150 -0.000120 +vn -0.556050 0.831149 -0.000119 +vn -0.506457 0.757028 -0.412808 +vn -0.506477 0.757054 -0.412735 +vn -0.489525 0.731714 0.474298 +vn -0.489556 0.731765 0.474189 +vn -0.556031 0.831114 0.008900 +vn -0.556026 0.831117 0.008898 +vn -0.516012 0.771297 -0.372603 +vn -0.516015 0.771301 -0.372590 +vn -0.502567 0.751198 0.427934 +vn -0.502601 0.751256 0.427793 +vn -0.556025 0.831115 -0.009169 +vn -0.556030 0.831112 -0.009166 +vn -0.509069 0.760932 -0.402283 +vn -0.509089 0.760957 -0.402210 +vn -0.502965 0.751806 0.426395 +vn -0.502979 0.751829 0.426340 +vn -0.556015 0.831086 0.011990 +vn -0.556009 0.831090 0.011987 +vn -0.133272 0.198366 0.971025 +vn -0.133007 0.198809 0.970971 +vn -0.019197 0.028574 0.999407 +vn -0.014065 0.070687 -0.997399 +vn -0.052720 0.264223 -0.963020 +vn -0.052551 0.264169 -0.963044 +vn -0.195633 0.980559 -0.015219 +vn -0.195641 0.980558 -0.015215 +vn -0.171452 0.859361 -0.481770 +vn -0.171460 0.859394 -0.481709 +vn -0.179738 0.900897 0.395067 +vn -0.179742 0.900924 0.395006 +vn -0.195655 0.980673 -0.000119 +vn -0.195656 0.980673 -0.000118 +vn -0.178205 0.893215 -0.412808 +vn -0.178210 0.893232 -0.412768 +vn -0.172250 0.863361 0.474275 +vn -0.172254 0.863390 0.474222 +vn -0.195653 0.980633 0.008900 +vn -0.195648 0.980634 0.008898 +vn -0.181564 0.910038 -0.372647 +vn -0.181578 0.910087 -0.372519 +vn -0.176846 0.886378 0.427855 +vn -0.176848 0.886389 0.427830 +vn -0.195647 0.980631 -0.009168 +vn -0.195652 0.980630 -0.009166 +vn -0.179124 0.897825 -0.402276 +vn -0.179134 0.897863 -0.402184 +vn -0.176977 0.887050 0.426405 +vn -0.176985 0.887106 0.426287 +vn -0.195648 0.980601 0.011990 +vn -0.195642 0.980602 0.011988 +vn -0.047214 0.234268 0.971025 +vn -0.046801 0.234576 0.970971 +vn -0.006800 0.033746 0.999407 +vn 0.014061 0.070687 -0.997400 +vn 0.052407 0.264286 -0.963020 +vn 0.052546 0.264167 -0.963044 +vn 0.194502 0.980784 -0.015219 +vn 0.194493 0.980786 -0.015215 +vn 0.170461 0.859545 -0.481794 +vn 0.170468 0.859593 -0.481706 +vn 0.178698 0.901098 0.395082 +vn 0.178710 0.901141 0.394978 +vn 0.194525 0.980898 -0.000118 +vn 0.177175 0.893402 -0.412846 +vn 0.177179 0.893432 -0.412779 +vn 0.171253 0.863543 0.474306 +vn 0.171263 0.863586 0.474225 +vn 0.194513 0.980860 0.008900 +vn 0.194518 0.980859 0.008898 +vn 0.180516 0.910268 -0.372593 +vn 0.180519 0.910295 -0.372525 +vn 0.175812 0.886556 0.427911 +vn 0.175822 0.886592 0.427833 +vn 0.194517 0.980856 -0.009167 +vn 0.194513 0.980857 -0.009165 +vn 0.178094 0.898036 -0.402262 +vn 0.178100 0.898079 -0.402163 +vn 0.175958 0.887271 0.426366 +vn 0.175967 0.887308 0.426287 +vn 0.194505 0.980828 0.011991 +vn 0.194511 0.980827 0.011988 +vn 0.046030 0.234504 0.971025 +vn 0.046532 0.234631 0.970970 +vn 0.006632 0.033780 0.999407 +vn 0.040041 0.059925 -0.997399 +vn 0.149555 0.224111 -0.963020 +vn 0.149638 0.223949 -0.963045 +vn 0.555026 0.831693 -0.015218 +vn 0.555020 0.831698 -0.015215 +vn 0.486418 0.728883 -0.481796 +vn 0.486437 0.728915 -0.481727 +vn 0.509939 0.764129 0.395055 +vn 0.509949 0.764142 0.395018 +vn 0.555090 0.831791 -0.000118 +vn 0.555091 0.831790 -0.000119 +vn 0.505570 0.757580 -0.412883 +vn 0.505599 0.757631 -0.412752 +vn 0.488672 0.732263 0.474331 +vn 0.488740 0.732357 0.474116 +vn 0.555065 0.831759 0.008900 +vn 0.555068 0.831757 0.008899 +vn 0.515115 0.771891 -0.372613 +vn 0.515126 0.771911 -0.372556 +vn 0.501694 0.751782 0.427933 +vn 0.501733 0.751834 0.427796 +vn 0.555067 0.831755 -0.009167 +vn 0.555064 0.831757 -0.009165 +vn 0.508205 0.761529 -0.402245 +vn 0.508222 0.761558 -0.402169 +vn 0.502113 0.752401 0.426352 +vn 0.502118 0.752407 0.426334 +vn 0.555046 0.831733 0.011991 +vn 0.555052 0.831729 0.011988 +vn 0.132268 0.199040 0.971024 +vn 0.132778 0.198965 0.970970 +vn 0.019054 0.028671 0.999407 +vn 0.059922 0.040044 -0.997400 +vn 0.223934 0.149818 -0.963020 +vn 0.223949 0.149642 -0.963044 +vn 0.831053 0.555985 -0.015219 +vn 0.831048 0.555993 -0.015215 +vn 0.728312 0.487247 -0.481822 +vn 0.728375 0.487293 -0.481680 +vn 0.763520 0.510804 0.395115 +vn 0.763563 0.510829 0.395001 +vn 0.831150 0.556049 -0.000119 +vn 0.757026 0.506456 -0.412813 +vn 0.757064 0.506485 -0.412706 +vn 0.731761 0.489556 0.474195 +vn 0.731773 0.489563 0.474170 +vn 0.831114 0.556031 0.008901 +vn 0.831116 0.556027 0.008899 +vn 0.771292 0.516007 -0.372621 +vn 0.771316 0.516026 -0.372544 +vn 0.751225 0.502585 0.427867 +vn 0.751248 0.502599 0.427809 +vn 0.831114 0.556026 -0.009167 +vn 0.831111 0.556031 -0.009164 +vn 0.760940 0.509076 -0.402258 +vn 0.760973 0.509101 -0.402166 +vn 0.751788 0.502956 0.426438 +vn 0.751840 0.502987 0.426311 +vn 0.831086 0.556014 0.011991 +vn 0.831089 0.556010 0.011989 +vn 0.198370 0.133272 0.971024 +vn 0.198812 0.133008 0.970970 +vn 0.028576 0.019197 0.999407 +vn 0.070685 0.014060 -0.997400 +vn 0.264223 0.052716 -0.963020 +vn 0.264169 0.052547 -0.963044 +vn 0.980559 0.195633 -0.015218 +vn 0.980558 0.195641 -0.015215 +vn 0.859371 0.171453 -0.481753 +vn 0.859394 0.171459 -0.481709 +vn 0.900892 0.179738 0.395080 +vn 0.900913 0.179741 0.395031 +vn 0.980673 0.195656 -0.000119 +vn 0.980672 0.195657 -0.000119 +vn 0.893230 0.178207 -0.412773 +vn 0.893282 0.178221 -0.412655 +vn 0.863379 0.172252 0.474242 +vn 0.863401 0.172255 0.474202 +vn 0.980633 0.195654 0.008901 +vn 0.980634 0.195646 0.008898 +vn 0.910046 0.181568 -0.372625 +vn 0.910094 0.181581 -0.372501 +vn 0.886363 0.176844 0.427886 +vn 0.886425 0.176853 0.427754 +vn 0.980632 0.195646 -0.009166 +vn 0.980631 0.195652 -0.009163 +vn 0.897838 0.179125 -0.402246 +vn 0.897877 0.179136 -0.402154 +vn 0.887056 0.176978 0.426392 +vn 0.887111 0.176985 0.426275 +vn 0.980601 0.195650 0.011992 +vn 0.980602 0.195641 0.011988 +vn 0.234270 0.047216 0.971024 +vn 0.234578 0.046803 0.970970 +vn 0.033747 0.006802 0.999407 +vn 0.070685 -0.014056 -0.997400 +vn 0.264286 -0.052407 -0.963020 +vn 0.264171 -0.052543 -0.963044 +vn 0.980784 -0.194503 -0.015219 +vn 0.980785 -0.194495 -0.015215 +vn 0.859545 -0.170462 -0.481794 +vn 0.859574 -0.170466 -0.481741 +vn 0.901087 -0.178697 0.395108 +vn 0.901125 -0.178707 0.395016 +vn 0.980897 -0.194527 -0.000119 +vn 0.980898 -0.194525 -0.000118 +vn 0.893453 -0.177183 -0.412733 +vn 0.893424 -0.177179 -0.412797 +vn 0.863554 -0.171253 0.474286 +vn 0.863625 -0.171270 0.474150 +vn 0.980859 -0.194515 0.008900 +vn 0.980859 -0.194516 0.008899 +vn 0.910275 -0.180518 -0.372575 +vn 0.910273 -0.180518 -0.372580 +vn 0.886592 -0.175820 0.427834 +vn 0.886620 -0.175827 0.427773 +vn 0.980856 -0.194517 -0.009165 +vn 0.980857 -0.194514 -0.009164 +vn 0.898049 -0.178097 -0.402231 +vn 0.898079 -0.178101 -0.402161 +vn 0.887278 -0.175958 0.426352 +vn 0.887330 -0.175971 0.426240 +vn 0.980828 -0.194505 0.011991 +vn 0.980827 -0.194510 0.011989 +vn 0.234506 -0.046029 0.971024 +vn 0.234633 -0.046530 0.970970 +vn 0.033781 -0.006631 0.999407 +vn 0.059921 -0.040043 -0.997400 +vn 0.224112 -0.149558 -0.963019 +vn 0.223949 -0.149642 -0.963044 +vn 0.831693 -0.555027 -0.015219 +vn 0.831698 -0.555019 -0.015215 +vn 0.728871 -0.486411 -0.481820 +vn 0.728925 -0.486444 -0.481706 +vn 0.764119 -0.509931 0.395085 +vn 0.764146 -0.509952 0.395007 +vn 0.831790 -0.555090 -0.000118 +vn 0.757581 -0.505573 -0.412875 +vn 0.757650 -0.505613 -0.412700 +vn 0.732307 -0.488703 0.474232 +vn 0.732324 -0.488715 0.474193 +vn 0.831760 -0.555064 0.008901 +vn 0.831757 -0.555069 0.008899 +vn 0.771878 -0.515108 -0.372650 +vn 0.771929 -0.515136 -0.372505 +vn 0.751812 -0.501713 0.427857 +vn 0.751845 -0.501738 0.427771 +vn 0.831755 -0.555067 -0.009166 +vn 0.831757 -0.555064 -0.009165 +vn 0.761531 -0.508208 -0.402238 +vn 0.761573 -0.508232 -0.402129 +vn 0.752408 -0.502118 0.426332 +vn 0.752416 -0.502124 0.426312 +vn 0.831733 -0.555046 0.011992 +vn 0.831729 -0.555053 0.011988 +vn 0.199041 -0.132268 0.971024 +vn 0.198967 -0.132777 0.970970 +vn 0.028672 -0.019054 0.999407 +vn 0.040038 -0.059926 -0.997400 +vn 0.149820 -0.223936 -0.963020 +vn 0.149636 -0.223951 -0.963045 +vn 0.555985 -0.831053 -0.015218 +vn 0.555992 -0.831048 -0.015215 +vn 0.487257 -0.728329 -0.481785 +vn 0.487296 -0.728382 -0.481666 +vn 0.510812 -0.763531 0.395084 +vn 0.510833 -0.763569 0.394983 +vn 0.556048 -0.831150 -0.000118 +vn 0.556049 -0.831150 -0.000118 +vn 0.506461 -0.757032 -0.412795 +vn 0.506485 -0.757064 -0.412707 +vn 0.489529 -0.731718 0.474288 +vn 0.489554 -0.731758 0.474201 +vn 0.556031 -0.831114 0.008900 +vn 0.556027 -0.831116 0.008899 +vn 0.516014 -0.771303 -0.372587 +vn 0.516021 -0.771313 -0.372556 +vn 0.502586 -0.751228 0.427861 +vn 0.502584 -0.751225 0.427868 +vn 0.556025 -0.831115 -0.009167 +vn 0.556029 -0.831112 -0.009165 +vn 0.509085 -0.760956 -0.402217 +vn 0.509093 -0.760966 -0.402189 +vn 0.502967 -0.751807 0.426393 +vn 0.502984 -0.751836 0.426321 +vn 0.556015 -0.831086 0.011991 +vn 0.556008 -0.831090 0.011988 +vn 0.133274 -0.198368 0.971024 +vn 0.133010 -0.198811 0.970970 +vn 0.019199 -0.028575 0.999407 +vn 0.014060 -0.070686 -0.997400 +vn 0.052716 -0.264223 -0.963020 +vn 0.052546 -0.264168 -0.963044 +vn 0.195633 -0.980559 -0.015218 +vn 0.195641 -0.980558 -0.015215 +vn 0.171450 -0.859356 -0.481781 +vn 0.171459 -0.859394 -0.481709 +vn 0.179739 -0.900887 0.395091 +vn 0.179745 -0.900936 0.394976 +vn 0.195656 -0.980673 -0.000119 +vn 0.195656 -0.980673 -0.000118 +vn 0.178205 -0.893223 -0.412791 +vn 0.178212 -0.893247 -0.412735 +vn 0.172250 -0.863352 0.474293 +vn 0.172257 -0.863401 0.474201 +vn 0.195653 -0.980633 0.008901 +vn 0.195648 -0.980634 0.008898 +vn 0.181568 -0.910052 -0.372611 +vn 0.181578 -0.910087 -0.372519 +vn 0.176841 -0.886342 0.427931 +vn 0.176849 -0.886405 0.427797 +vn 0.195647 -0.980632 -0.009167 +vn 0.195652 -0.980631 -0.009165 +vn 0.179125 -0.897832 -0.402258 +vn 0.179135 -0.897869 -0.402172 +vn 0.176979 -0.887060 0.426384 +vn 0.176985 -0.887099 0.426299 +vn 0.195648 -0.980601 0.011991 +vn 0.195642 -0.980602 0.011988 +vn 0.047217 -0.234270 0.971024 +vn 0.046804 -0.234578 0.970970 +vn 0.006803 -0.033746 0.999407 +s off +f 1550/657/931 1552/658/931 1551/659/931 +f 1550/657/932 1553/660/932 1552/658/932 +f 1549/661/933 1553/660/933 1550/657/933 +f 1549/661/934 1554/662/934 1553/660/934 +f 1549/661/935 1555/663/935 1554/662/935 +f 1549/661/936 1536/664/936 1535/665/936 +f 1549/661/934 1537/666/934 1536/664/934 +f 1549/661/937 1538/667/937 1537/666/937 +f 1549/661/935 1539/668/935 1538/667/935 +f 1549/661/934 1541/669/934 1540/670/934 +f 1549/661/938 1542/671/938 1541/669/938 +f 1549/661/939 1543/672/939 1542/671/939 +f 1549/661/934 1544/673/934 1543/672/934 +f 1548/674/940 1544/673/940 1549/661/940 +f 1548/674/941 1545/675/941 1544/673/941 +f 1548/674/941 1546/676/941 1545/675/941 +f 1548/674/942 1547/677/942 1546/676/942 +f 1549/661/943 1535/665/943 1517/678/943 +f 1516/679/944 1549/661/944 1540/670/944 +f 1556/680/945 1557/681/945 1539/668/945 +f 1539/668/946 1540/670/946 1556/680/946 +f 1558/682/947 1542/671/947 1543/672/947 +f 1559/683/948 1558/682/948 1543/672/948 +f 1559/683/949 1543/672/949 1544/673/949 +f 1560/684/950 1559/683/950 1544/673/950 +f 1560/684/951 1544/673/951 1545/675/951 +f 1545/675/952 1561/685/952 1560/684/952 +f 1561/685/953 1545/675/953 1546/676/953 +f 1546/676/954 1562/686/954 1561/685/954 +f 1562/686/955 1546/676/955 1547/677/955 +f 1547/677/956 1563/687/956 1562/686/956 +f 1539/668/957 1557/681/957 1564/688/957 +f 1538/667/958 1539/668/958 1564/688/958 +f 1565/689/959 1537/666/959 1538/667/959 +f 1538/667/959 1564/688/959 1565/689/959 +f 1565/689/960 1566/690/960 1536/664/960 +f 1536/664/961 1537/666/961 1565/689/961 +f 1566/690/962 1567/691/962 1536/664/962 +f 1567/691/963 1535/665/963 1536/664/963 +f 1567/691/964 1568/692/964 1555/663/964 +f 1535/665/965 1567/691/965 1555/663/965 +f 1554/662/966 1555/663/966 1568/692/966 +f 1569/693/967 1554/662/967 1568/692/967 +f 1570/694/968 1553/660/968 1554/662/968 +f 1554/662/969 1569/693/969 1570/694/969 +f 1547/677/970 1548/674/970 1563/687/970 +f 1571/695/971 1548/674/971 1549/661/971 +f 1549/661/972 1572/696/972 1571/695/972 +f 1572/696/973 1549/661/973 1550/657/973 +f 1550/657/974 1573/697/974 1572/696/974 +f 1573/697/975 1551/659/975 1574/698/975 +f 1573/697/975 1550/657/975 1551/659/975 +f 1574/698/976 1551/659/976 1552/658/976 +f 1552/658/977 1575/699/977 1574/698/977 +f 1575/699/978 1552/658/978 1553/660/978 +f 1553/660/978 1570/694/978 1575/699/978 +f 1576/700/979 1571/695/979 1572/696/979 +f 1576/700/980 1577/701/980 1571/695/980 +f 1577/701/981 1563/687/981 1571/695/981 +f 1562/686/982 1563/687/982 1577/701/982 +f 1578/702/983 1561/685/983 1562/686/983 +f 1562/686/984 1577/701/984 1578/702/984 +f 1578/702/985 1579/703/985 1560/684/985 +f 1560/684/986 1561/685/986 1578/702/986 +f 1559/683/987 1560/684/987 1579/703/987 +f 1579/703/988 1580/704/988 1559/683/988 +f 1580/704/989 1558/682/989 1559/683/989 +f 1580/704/990 1581/705/990 1558/682/990 +f 1581/705/991 1582/706/991 1558/682/991 +f 1581/705/992 1583/707/992 1582/706/992 +f 1541/669/993 1542/671/993 1558/682/993 +f 1582/706/994 1541/669/994 1558/682/994 +f 1582/706/995 1556/680/995 1540/670/995 +f 1540/670/996 1541/669/996 1582/706/996 +f 1583/707/997 1556/680/997 1582/706/997 +f 1583/707/998 1584/708/998 1556/680/998 +f 1584/708/999 1557/681/999 1556/680/999 +f 1584/708/1000 1585/709/1000 1557/681/1000 +f 1585/709/1001 1564/688/1001 1557/681/1001 +f 1585/709/1002 1586/710/1002 1564/688/1002 +f 1565/689/1003 1564/688/1003 1586/710/1003 +f 1586/710/1004 1587/711/1004 1565/689/1004 +f 1587/711/1005 1566/690/1005 1565/689/1005 +f 1587/711/1006 1588/712/1006 1566/690/1006 +f 1567/691/1007 1566/690/1007 1588/712/1007 +f 1588/712/1008 1589/713/1008 1567/691/1008 +f 1568/692/1009 1567/691/1009 1589/713/1009 +f 1589/713/1010 1590/714/1010 1568/692/1010 +f 1569/693/1011 1568/692/1011 1590/714/1011 +f 1590/714/1012 1591/715/1012 1570/694/1012 +f 1570/694/1013 1569/693/1013 1590/714/1013 +f 1575/699/1014 1570/694/1014 1591/715/1014 +f 1591/715/1015 1592/716/1015 1575/699/1015 +f 1574/698/1016 1575/699/1016 1592/716/1016 +f 1592/716/1017 1593/717/1017 1574/698/1017 +f 1573/697/1018 1574/698/1018 1593/717/1018 +f 1588/712/1019 1518/718/1019 1523/719/1019 +f 1589/713/1020 1588/712/1020 1523/719/1020 +f 1523/719/1021 1522/720/1021 1589/713/1021 +f 1518/718/1022 1588/712/1022 1587/711/1022 +f 1518/718/1023 1587/711/1023 1533/721/1023 +f 1533/721/1024 1587/711/1024 1586/710/1024 +f 1586/710/1025 1534/722/1025 1533/721/1025 +f 1534/722/1026 1586/710/1026 1585/709/1026 +f 1585/709/1027 1532/723/1027 1534/722/1027 +f 1532/723/1028 1585/709/1028 1584/708/1028 +f 1532/723/1029 1584/708/1029 1527/724/1029 +f 1527/724/1030 1584/708/1030 1583/707/1030 +f 1583/707/1031 1528/725/1031 1527/724/1031 +f 1528/725/1032 1583/707/1032 1581/705/1032 +f 1528/725/1033 1581/705/1033 1580/704/1033 +f 1580/704/1034 1529/726/1034 1528/725/1034 +f 1529/726/1035 1580/704/1035 1579/703/1035 +f 1579/703/1036 1530/727/1036 1529/726/1036 +f 1530/727/1037 1579/703/1037 1578/702/1037 +f 1578/702/1038 1531/728/1038 1530/727/1038 +f 1576/700/1039 1572/696/1039 1594/729/1039 +f 1594/729/1040 1572/696/1040 1573/697/1040 +f 1573/697/1041 1593/717/1041 1594/729/1041 +f 1521/730/1042 1594/729/1042 1593/717/1042 +f 1524/731/1043 1521/730/1043 1593/717/1043 +f 1524/731/1044 1593/717/1044 1592/716/1044 +f 1524/731/1045 1592/716/1045 1591/715/1045 +f 1591/715/1046 1526/732/1046 1524/731/1046 +f 1525/733/1047 1526/732/1047 1591/715/1047 +f 1525/733/1048 1591/715/1048 1590/714/1048 +f 1522/720/1049 1590/714/1049 1589/713/1049 +f 1539/668/1050 1516/679/1050 1540/670/1050 +f 1516/679/1051 1539/668/1051 1549/661/1051 +f 1555/663/1052 1517/678/1052 1535/665/1052 +f 1555/663/1053 1549/661/1053 1517/678/1053 +f 1594/729/1054 1521/730/1054 1520/734/1054 +f 1578/702/1055 1577/701/1055 1531/728/1055 +f 1576/700/1056 1520/734/1056 1519/735/1056 +f 1520/734/1057 1576/700/1057 1594/729/1057 +f 1519/735/1058 1577/701/1058 1576/700/1058 +f 1577/701/1059 1519/735/1059 1531/728/1059 +f 1525/733/1060 1590/714/1060 1522/720/1060 +f 1563/687/1061 1548/674/1061 1571/695/1061 +f 1595/736/1062 1596/737/1062 1613/738/1062 +f 1596/737/1063 1597/739/1063 1614/740/1063 +f 1596/737/1064 1614/740/1064 1613/738/1064 +f 1597/739/1065 1598/741/1065 1615/742/1065 +f 1597/739/1066 1615/742/1066 1614/740/1066 +f 1598/741/1067 1599/743/1067 1616/744/1067 +f 1598/741/1068 1616/744/1068 1615/742/1068 +f 1599/743/1069 1600/745/1069 1617/746/1069 +f 1599/743/1070 1617/746/1070 1616/744/1070 +f 1600/745/1071 1601/747/1071 1618/748/1071 +f 1600/745/1072 1618/748/1072 1617/746/1072 +f 1601/747/1073 1602/749/1073 1619/750/1073 +f 1601/747/1074 1619/750/1074 1618/748/1074 +f 1602/749/1075 1603/751/1075 1620/752/1075 +f 1602/749/1076 1620/752/1076 1619/750/1076 +f 1603/751/1077 1604/753/1077 1621/754/1077 +f 1603/751/1078 1621/754/1078 1620/752/1078 +f 1604/753/1079 1605/755/1079 1622/756/1079 +f 1604/753/1080 1622/756/1080 1621/754/1080 +f 1605/755/1081 1606/757/1081 1623/758/1081 +f 1605/755/1082 1623/758/1082 1622/756/1082 +f 1606/757/1083 1607/759/1083 1624/760/1083 +f 1606/757/1084 1624/760/1084 1623/758/1084 +f 1607/759/1085 1608/761/1085 1625/762/1085 +f 1607/759/1086 1625/762/1086 1624/760/1086 +f 1608/761/1087 1609/763/1087 1626/764/1087 +f 1608/761/1088 1626/764/1088 1625/762/1088 +f 1609/763/1089 1610/765/1089 1627/766/1089 +f 1609/763/1090 1627/766/1090 1626/764/1090 +f 1610/765/1091 1611/767/1091 1628/768/1091 +f 1610/765/1092 1628/768/1092 1627/766/1092 +f 1611/767/1093 1612/769/1093 1628/768/1093 +f 1595/736/1094 1613/738/1094 1629/770/1094 +f 1613/738/1095 1614/740/1095 1630/771/1095 +f 1613/738/1096 1630/771/1096 1629/770/1096 +f 1614/740/1097 1615/742/1097 1631/772/1097 +f 1614/740/1098 1631/772/1098 1630/771/1098 +f 1615/742/1099 1616/744/1099 1632/773/1099 +f 1615/742/1100 1632/773/1100 1631/772/1100 +f 1616/744/1101 1617/746/1101 1633/774/1101 +f 1616/744/1102 1633/774/1102 1632/773/1102 +f 1617/746/1103 1618/748/1103 1634/775/1103 +f 1617/746/1104 1634/775/1104 1633/774/1104 +f 1618/748/1105 1619/750/1105 1635/776/1105 +f 1618/748/1106 1635/776/1106 1634/775/1106 +f 1619/750/1107 1620/752/1107 1636/777/1107 +f 1619/750/1108 1636/777/1108 1635/776/1108 +f 1620/752/1109 1621/754/1109 1637/778/1109 +f 1620/752/1110 1637/778/1110 1636/777/1110 +f 1621/754/1111 1622/756/1111 1638/779/1111 +f 1621/754/1112 1638/779/1112 1637/778/1112 +f 1622/756/1113 1623/758/1113 1639/780/1113 +f 1622/756/1114 1639/780/1114 1638/779/1114 +f 1623/758/1115 1624/760/1115 1640/781/1115 +f 1623/758/1116 1640/781/1116 1639/780/1116 +f 1624/760/1117 1625/762/1117 1641/782/1117 +f 1624/760/1118 1641/782/1118 1640/781/1118 +f 1625/762/1119 1626/764/1119 1642/783/1119 +f 1625/762/1120 1642/783/1120 1641/782/1120 +f 1626/764/1121 1627/766/1121 1643/784/1121 +f 1626/764/1122 1643/784/1122 1642/783/1122 +f 1627/766/1123 1628/768/1123 1644/785/1123 +f 1627/766/1124 1644/785/1124 1643/784/1124 +f 1628/768/1125 1612/769/1125 1644/785/1125 +f 1595/736/1126 1629/770/1126 1645/786/1126 +f 1629/770/1127 1630/771/1127 1646/787/1127 +f 1629/770/1128 1646/787/1128 1645/786/1128 +f 1630/771/1129 1631/772/1129 1647/788/1129 +f 1630/771/1130 1647/788/1130 1646/787/1130 +f 1631/772/1131 1632/773/1131 1648/789/1131 +f 1631/772/1132 1648/789/1132 1647/788/1132 +f 1632/773/1133 1633/774/1133 1649/790/1133 +f 1632/773/1134 1649/790/1134 1648/789/1134 +f 1633/774/1135 1634/775/1135 1650/791/1135 +f 1633/774/1136 1650/791/1136 1649/790/1136 +f 1634/775/1137 1635/776/1137 1651/792/1137 +f 1634/775/1138 1651/792/1138 1650/791/1138 +f 1635/776/1139 1636/777/1139 1652/793/1139 +f 1635/776/1140 1652/793/1140 1651/792/1140 +f 1636/777/1141 1637/778/1141 1653/794/1141 +f 1636/777/1142 1653/794/1142 1652/793/1142 +f 1637/778/1143 1638/779/1143 1654/795/1143 +f 1637/778/1144 1654/795/1144 1653/794/1144 +f 1638/779/1145 1639/780/1145 1655/796/1145 +f 1638/779/1146 1655/796/1146 1654/795/1146 +f 1639/780/1147 1640/781/1147 1656/797/1147 +f 1639/780/1148 1656/797/1148 1655/796/1148 +f 1640/781/1149 1641/782/1149 1657/798/1149 +f 1640/781/1150 1657/798/1150 1656/797/1150 +f 1641/782/1151 1642/783/1151 1658/799/1151 +f 1641/782/1152 1658/799/1152 1657/798/1152 +f 1642/783/1153 1643/784/1153 1659/800/1153 +f 1642/783/1154 1659/800/1154 1658/799/1154 +f 1643/784/1155 1644/785/1155 1660/801/1155 +f 1643/784/1156 1660/801/1156 1659/800/1156 +f 1644/785/1157 1612/769/1157 1660/801/1157 +f 1595/736/1158 1645/786/1158 1661/802/1158 +f 1645/786/1159 1646/787/1159 1662/803/1159 +f 1645/786/1160 1662/803/1160 1661/802/1160 +f 1646/787/1161 1647/788/1161 1663/804/1161 +f 1646/787/1162 1663/804/1162 1662/803/1162 +f 1647/788/1163 1648/789/1163 1664/805/1163 +f 1647/788/1164 1664/805/1164 1663/804/1164 +f 1648/789/1165 1649/790/1165 1665/806/1165 +f 1648/789/1166 1665/806/1166 1664/805/1166 +f 1649/790/1167 1650/791/1167 1666/807/1167 +f 1649/790/1168 1666/807/1168 1665/806/1168 +f 1650/791/1169 1651/792/1169 1667/808/1169 +f 1650/791/1170 1667/808/1170 1666/807/1170 +f 1651/792/1171 1652/793/1171 1668/809/1171 +f 1651/792/1172 1668/809/1172 1667/808/1172 +f 1652/793/1173 1653/794/1173 1669/810/1173 +f 1652/793/1174 1669/810/1174 1668/809/1174 +f 1653/794/1175 1654/795/1175 1670/811/1175 +f 1653/794/1176 1670/811/1176 1669/810/1176 +f 1654/795/1177 1655/796/1177 1671/812/1177 +f 1654/795/1178 1671/812/1178 1670/811/1178 +f 1655/796/1179 1656/797/1179 1672/813/1179 +f 1655/796/1180 1672/813/1180 1671/812/1180 +f 1656/797/1181 1657/798/1181 1673/814/1181 +f 1656/797/1182 1673/814/1182 1672/813/1182 +f 1657/798/1183 1658/799/1183 1674/815/1183 +f 1657/798/1184 1674/815/1184 1673/814/1184 +f 1658/799/1185 1659/800/1185 1675/816/1185 +f 1658/799/1186 1675/816/1186 1674/815/1186 +f 1659/800/1187 1660/801/1187 1676/817/1187 +f 1659/800/1188 1676/817/1188 1675/816/1188 +f 1660/801/1189 1612/769/1189 1676/817/1189 +f 1595/736/1190 1661/802/1190 1677/818/1190 +f 1661/802/1191 1662/803/1191 1678/819/1191 +f 1661/802/1192 1678/819/1192 1677/818/1192 +f 1662/803/1193 1663/804/1193 1679/820/1193 +f 1662/803/1194 1679/820/1194 1678/819/1194 +f 1663/804/1195 1664/805/1195 1680/821/1195 +f 1663/804/1196 1680/821/1196 1679/820/1196 +f 1664/805/1197 1665/806/1197 1681/822/1197 +f 1664/805/1198 1681/822/1198 1680/821/1198 +f 1665/806/1199 1666/807/1199 1682/823/1199 +f 1665/806/1200 1682/823/1200 1681/822/1200 +f 1666/807/1201 1667/808/1201 1683/824/1201 +f 1666/807/1202 1683/824/1202 1682/823/1202 +f 1667/808/1203 1668/809/1203 1684/825/1203 +f 1667/808/1204 1684/825/1204 1683/824/1204 +f 1668/809/1205 1669/810/1205 1685/826/1205 +f 1668/809/1206 1685/826/1206 1684/825/1206 +f 1669/810/1207 1670/811/1207 1686/827/1207 +f 1669/810/1208 1686/827/1208 1685/826/1208 +f 1670/811/1209 1671/812/1209 1687/828/1209 +f 1670/811/1210 1687/828/1210 1686/827/1210 +f 1671/812/1211 1672/813/1211 1688/829/1211 +f 1671/812/1212 1688/829/1212 1687/828/1212 +f 1672/813/1213 1673/814/1213 1689/830/1213 +f 1672/813/1214 1689/830/1214 1688/829/1214 +f 1673/814/1215 1674/815/1215 1690/831/1215 +f 1673/814/1216 1690/831/1216 1689/830/1216 +f 1674/815/1217 1675/816/1217 1691/832/1217 +f 1674/815/1218 1691/832/1218 1690/831/1218 +f 1675/816/1219 1676/817/1219 1692/833/1219 +f 1675/816/1220 1692/833/1220 1691/832/1220 +f 1676/817/1221 1612/769/1221 1692/833/1221 +f 1595/736/1222 1677/818/1222 1693/834/1222 +f 1677/818/1223 1678/819/1223 1694/835/1223 +f 1677/818/1224 1694/835/1224 1693/834/1224 +f 1678/819/1225 1679/820/1225 1695/836/1225 +f 1678/819/1226 1695/836/1226 1694/835/1226 +f 1679/820/1227 1680/821/1227 1696/837/1227 +f 1679/820/1228 1696/837/1228 1695/836/1228 +f 1680/821/1229 1681/822/1229 1697/838/1229 +f 1680/821/1230 1697/838/1230 1696/837/1230 +f 1681/822/1231 1682/823/1231 1698/839/1231 +f 1681/822/1232 1698/839/1232 1697/838/1232 +f 1682/823/1233 1683/824/1233 1699/840/1233 +f 1682/823/1234 1699/840/1234 1698/839/1234 +f 1683/824/1235 1684/825/1235 1700/841/1235 +f 1683/824/1236 1700/841/1236 1699/840/1236 +f 1684/825/1237 1685/826/1237 1701/842/1237 +f 1684/825/1238 1701/842/1238 1700/841/1238 +f 1685/826/1239 1686/827/1239 1702/843/1239 +f 1685/826/1240 1702/843/1240 1701/842/1240 +f 1686/827/1241 1687/828/1241 1703/844/1241 +f 1686/827/1242 1703/844/1242 1702/843/1242 +f 1687/828/1243 1688/829/1243 1704/845/1243 +f 1687/828/1244 1704/845/1244 1703/844/1244 +f 1688/829/1245 1689/830/1245 1705/846/1245 +f 1688/829/1246 1705/846/1246 1704/845/1246 +f 1689/830/1247 1690/831/1247 1706/847/1247 +f 1689/830/1248 1706/847/1248 1705/846/1248 +f 1690/831/1249 1691/832/1249 1707/848/1249 +f 1690/831/1250 1707/848/1250 1706/847/1250 +f 1691/832/1251 1692/833/1251 1708/849/1251 +f 1691/832/1252 1708/849/1252 1707/848/1252 +f 1692/833/1253 1612/769/1253 1708/849/1253 +f 1595/736/1254 1693/834/1254 1709/850/1254 +f 1693/834/1255 1694/835/1255 1710/851/1255 +f 1693/834/1256 1710/851/1256 1709/850/1256 +f 1694/835/1257 1695/836/1257 1711/852/1257 +f 1694/835/1258 1711/852/1258 1710/851/1258 +f 1695/836/1259 1696/837/1259 1712/853/1259 +f 1695/836/1260 1712/853/1260 1711/852/1260 +f 1696/837/1261 1697/838/1261 1713/854/1261 +f 1696/837/1262 1713/854/1262 1712/853/1262 +f 1697/838/1263 1698/839/1263 1714/855/1263 +f 1697/838/1264 1714/855/1264 1713/854/1264 +f 1698/839/1265 1699/840/1265 1715/856/1265 +f 1698/839/1266 1715/856/1266 1714/855/1266 +f 1699/840/1267 1700/841/1267 1716/857/1267 +f 1699/840/1268 1716/857/1268 1715/856/1268 +f 1700/841/1269 1701/842/1269 1717/858/1269 +f 1700/841/1270 1717/858/1270 1716/857/1270 +f 1701/842/1271 1702/843/1271 1718/859/1271 +f 1701/842/1272 1718/859/1272 1717/858/1272 +f 1702/843/1273 1703/844/1273 1719/860/1273 +f 1702/843/1274 1719/860/1274 1718/859/1274 +f 1703/844/1275 1704/845/1275 1720/861/1275 +f 1703/844/1276 1720/861/1276 1719/860/1276 +f 1704/845/1277 1705/846/1277 1721/862/1277 +f 1704/845/1278 1721/862/1278 1720/861/1278 +f 1705/846/1279 1706/847/1279 1722/863/1279 +f 1705/846/1280 1722/863/1280 1721/862/1280 +f 1706/847/1281 1707/848/1281 1723/864/1281 +f 1706/847/1282 1723/864/1282 1722/863/1282 +f 1707/848/1283 1708/849/1283 1724/865/1283 +f 1707/848/1284 1724/865/1284 1723/864/1284 +f 1708/849/1285 1612/769/1285 1724/865/1285 +f 1853/866/1286 1709/850/1286 1725/867/1286 +f 1709/850/1287 1710/851/1287 1726/868/1287 +f 1709/850/1288 1726/868/1288 1725/867/1288 +f 1710/851/1289 1711/852/1289 1727/869/1289 +f 1710/851/1290 1727/869/1290 1726/868/1290 +f 1711/852/1291 1712/853/1291 1728/870/1291 +f 1711/852/1292 1728/870/1292 1727/869/1292 +f 1712/853/1293 1713/854/1293 1729/871/1293 +f 1712/853/1294 1729/871/1294 1728/870/1294 +f 1713/854/1295 1714/855/1295 1730/872/1295 +f 1713/854/1296 1730/872/1296 1729/871/1296 +f 1714/855/1297 1715/856/1297 1731/873/1297 +f 1714/855/1298 1731/873/1298 1730/872/1298 +f 1715/856/1299 1716/857/1299 1732/874/1299 +f 1715/856/1300 1732/874/1300 1731/873/1300 +f 1716/857/1301 1717/858/1301 1733/875/1301 +f 1716/857/1302 1733/875/1302 1732/874/1302 +f 1717/858/1303 1718/859/1303 1734/876/1303 +f 1717/858/1304 1734/876/1304 1733/875/1304 +f 1718/859/1305 1719/860/1305 1735/877/1305 +f 1718/859/1306 1735/877/1306 1734/876/1306 +f 1719/860/1307 1720/861/1307 1736/878/1307 +f 1719/860/1308 1736/878/1308 1735/877/1308 +f 1720/861/1309 1721/862/1309 1737/879/1309 +f 1720/861/1310 1737/879/1310 1736/878/1310 +f 1721/862/1311 1722/863/1311 1738/880/1311 +f 1721/862/1312 1738/880/1312 1737/879/1312 +f 1722/863/1313 1723/864/1313 1739/881/1313 +f 1722/863/1314 1739/881/1314 1738/880/1314 +f 1723/864/1315 1724/865/1315 1740/882/1315 +f 1723/864/1316 1740/882/1316 1739/881/1316 +f 1724/865/1317 1612/769/1317 1740/882/1317 +f 1854/866/1318 1725/867/1318 1741/883/1318 +f 1725/867/1319 1726/868/1319 1742/884/1319 +f 1725/867/1320 1742/884/1320 1741/883/1320 +f 1726/868/1321 1727/869/1321 1743/885/1321 +f 1726/868/1322 1743/885/1322 1742/884/1322 +f 1727/869/1323 1728/870/1323 1744/886/1323 +f 1727/869/1324 1744/886/1324 1743/885/1324 +f 1728/870/1325 1729/871/1325 1745/887/1325 +f 1728/870/1326 1745/887/1326 1744/886/1326 +f 1729/871/1327 1730/872/1327 1746/888/1327 +f 1729/871/1327 1746/888/1327 1745/887/1327 +f 1730/872/1328 1731/873/1328 1747/889/1328 +f 1730/872/1329 1747/889/1329 1746/888/1329 +f 1731/873/1330 1732/874/1330 1748/890/1330 +f 1731/873/1331 1748/890/1331 1747/889/1331 +f 1732/874/1332 1733/875/1332 1749/891/1332 +f 1732/874/1333 1749/891/1333 1748/890/1333 +f 1733/875/1334 1734/876/1334 1750/892/1334 +f 1733/875/1335 1750/892/1335 1749/891/1335 +f 1734/876/1336 1735/877/1336 1751/893/1336 +f 1734/876/1337 1751/893/1337 1750/892/1337 +f 1735/877/1338 1736/878/1338 1752/894/1338 +f 1735/877/1339 1752/894/1339 1751/893/1339 +f 1736/878/1340 1737/879/1340 1753/895/1340 +f 1736/878/1341 1753/895/1341 1752/894/1341 +f 1737/879/1342 1738/880/1342 1754/896/1342 +f 1737/879/1343 1754/896/1343 1753/895/1343 +f 1738/880/1344 1739/881/1344 1755/897/1344 +f 1738/880/1345 1755/897/1345 1754/896/1345 +f 1739/881/1346 1740/882/1346 1756/898/1346 +f 1739/881/1347 1756/898/1347 1755/897/1347 +f 1740/882/1348 1855/899/1348 1756/898/1348 +f 1856/866/1349 1741/883/1349 1757/900/1349 +f 1741/883/1350 1742/884/1350 1758/901/1350 +f 1741/883/1351 1758/901/1351 1757/900/1351 +f 1742/884/1352 1743/885/1352 1759/902/1352 +f 1742/884/1353 1759/902/1353 1758/901/1353 +f 1743/885/1354 1744/886/1354 1760/903/1354 +f 1743/885/1355 1760/903/1355 1759/902/1355 +f 1744/886/1356 1745/887/1356 1761/904/1356 +f 1744/886/1357 1761/904/1357 1760/903/1357 +f 1745/887/1358 1746/888/1358 1762/905/1358 +f 1745/887/1359 1762/905/1359 1761/904/1359 +f 1746/888/1360 1747/889/1360 1763/906/1360 +f 1746/888/1361 1763/906/1361 1762/905/1361 +f 1747/889/1362 1748/890/1362 1764/907/1362 +f 1747/889/1363 1764/907/1363 1763/906/1363 +f 1748/890/1364 1749/891/1364 1765/908/1364 +f 1748/890/1365 1765/908/1365 1764/907/1365 +f 1749/891/1366 1750/892/1366 1766/909/1366 +f 1749/891/1367 1766/909/1367 1765/908/1367 +f 1750/892/1368 1751/893/1368 1767/910/1368 +f 1750/892/1369 1767/910/1369 1766/909/1369 +f 1751/893/1370 1752/894/1370 1768/911/1370 +f 1751/893/1371 1768/911/1371 1767/910/1371 +f 1752/894/1372 1753/895/1372 1769/912/1372 +f 1752/894/1373 1769/912/1373 1768/911/1373 +f 1753/895/1374 1754/896/1374 1770/913/1374 +f 1753/895/1375 1770/913/1375 1769/912/1375 +f 1754/896/1376 1755/897/1376 1771/914/1376 +f 1754/896/1377 1771/914/1377 1770/913/1377 +f 1755/897/1378 1756/898/1378 1772/915/1378 +f 1755/897/1379 1772/915/1379 1771/914/1379 +f 1756/898/1380 1857/899/1380 1772/915/1380 +f 1858/866/1381 1757/900/1381 1773/916/1381 +f 1757/900/1382 1758/901/1382 1774/917/1382 +f 1757/900/1383 1774/917/1383 1773/916/1383 +f 1758/901/1384 1759/902/1384 1775/918/1384 +f 1758/901/1385 1775/918/1385 1774/917/1385 +f 1759/902/1386 1760/903/1386 1776/919/1386 +f 1759/902/1387 1776/919/1387 1775/918/1387 +f 1760/903/1388 1761/904/1388 1777/920/1388 +f 1760/903/1389 1777/920/1389 1776/919/1389 +f 1761/904/1390 1762/905/1390 1778/921/1390 +f 1761/904/1390 1778/921/1390 1777/920/1390 +f 1762/905/1391 1763/906/1391 1779/922/1391 +f 1762/905/1392 1779/922/1392 1778/921/1392 +f 1763/906/1393 1764/907/1393 1780/923/1393 +f 1763/906/1394 1780/923/1394 1779/922/1394 +f 1764/907/1395 1765/908/1395 1781/924/1395 +f 1764/907/1396 1781/924/1396 1780/923/1396 +f 1765/908/1397 1766/909/1397 1782/925/1397 +f 1765/908/1398 1782/925/1398 1781/924/1398 +f 1766/909/1399 1767/910/1399 1783/926/1399 +f 1766/909/1400 1783/926/1400 1782/925/1400 +f 1767/910/1401 1768/911/1401 1784/927/1401 +f 1767/910/1402 1784/927/1402 1783/926/1402 +f 1768/911/1403 1769/912/1403 1785/928/1403 +f 1768/911/1404 1785/928/1404 1784/927/1404 +f 1769/912/1405 1770/913/1405 1786/929/1405 +f 1769/912/1406 1786/929/1406 1785/928/1406 +f 1770/913/1407 1771/914/1407 1787/930/1407 +f 1770/913/1408 1787/930/1408 1786/929/1408 +f 1771/914/1409 1772/915/1409 1788/931/1409 +f 1771/914/1410 1788/931/1410 1787/930/1410 +f 1772/915/1411 1859/899/1411 1788/931/1411 +f 1860/866/1412 1773/916/1412 1789/932/1412 +f 1773/916/1413 1774/917/1413 1790/933/1413 +f 1773/916/1414 1790/933/1414 1789/932/1414 +f 1774/917/1415 1775/918/1415 1791/934/1415 +f 1774/917/1416 1791/934/1416 1790/933/1416 +f 1775/918/1417 1776/919/1417 1792/935/1417 +f 1775/918/1418 1792/935/1418 1791/934/1418 +f 1776/919/1419 1777/920/1419 1793/936/1419 +f 1776/919/1420 1793/936/1420 1792/935/1420 +f 1777/920/1421 1778/921/1421 1794/937/1421 +f 1777/920/1422 1794/937/1422 1793/936/1422 +f 1778/921/1423 1779/922/1423 1795/938/1423 +f 1778/921/1424 1795/938/1424 1794/937/1424 +f 1779/922/1425 1780/923/1425 1796/939/1425 +f 1779/922/1426 1796/939/1426 1795/938/1426 +f 1780/923/1427 1781/924/1427 1797/940/1427 +f 1780/923/1428 1797/940/1428 1796/939/1428 +f 1781/924/1429 1782/925/1429 1798/941/1429 +f 1781/924/1430 1798/941/1430 1797/940/1430 +f 1782/925/1431 1783/926/1431 1799/942/1431 +f 1782/925/1432 1799/942/1432 1798/941/1432 +f 1783/926/1433 1784/927/1433 1800/943/1433 +f 1783/926/1434 1800/943/1434 1799/942/1434 +f 1784/927/1435 1785/928/1435 1801/944/1435 +f 1784/927/1436 1801/944/1436 1800/943/1436 +f 1785/928/1437 1786/929/1437 1802/945/1437 +f 1785/928/1438 1802/945/1438 1801/944/1438 +f 1786/929/1439 1787/930/1439 1803/946/1439 +f 1786/929/1440 1803/946/1440 1802/945/1440 +f 1787/930/1441 1788/931/1441 1804/947/1441 +f 1787/930/1442 1804/947/1442 1803/946/1442 +f 1788/931/1443 1861/899/1443 1804/947/1443 +f 1595/736/1444 1862/948/1444 1805/949/1444 +f 1863/948/1445 1864/950/1445 1806/951/1445 +f 1865/948/1446 1806/951/1446 1805/949/1446 +f 1866/950/1447 1867/952/1447 1807/953/1447 +f 1868/950/1448 1807/953/1448 1806/951/1448 +f 1869/952/1449 1870/954/1449 1808/955/1449 +f 1871/952/1450 1808/955/1450 1807/953/1450 +f 1872/954/1451 1873/956/1451 1809/957/1451 +f 1874/954/1452 1809/957/1452 1808/955/1452 +f 1875/956/1453 1876/958/1453 1810/959/1453 +f 1877/956/1454 1810/959/1454 1809/957/1454 +f 1878/958/1455 1879/960/1455 1811/961/1455 +f 1880/958/1456 1811/961/1456 1810/959/1456 +f 1881/960/1457 1882/962/1457 1812/963/1457 +f 1883/960/1458 1812/963/1458 1811/961/1458 +f 1884/962/1459 1885/964/1459 1813/965/1459 +f 1886/962/1460 1813/965/1460 1812/963/1460 +f 1887/964/1461 1888/966/1461 1814/967/1461 +f 1889/964/1462 1814/967/1462 1813/965/1462 +f 1890/966/1463 1891/968/1463 1815/969/1463 +f 1892/966/1464 1815/969/1464 1814/967/1464 +f 1893/968/1465 1894/970/1465 1816/971/1465 +f 1895/968/1466 1816/971/1466 1815/969/1466 +f 1896/970/1467 1897/972/1467 1817/973/1467 +f 1898/970/1468 1817/973/1468 1816/971/1468 +f 1899/972/1469 1900/974/1469 1818/975/1469 +f 1901/972/1470 1818/975/1470 1817/973/1470 +f 1902/974/1471 1903/976/1471 1819/977/1471 +f 1904/974/1472 1819/977/1472 1818/975/1472 +f 1905/976/1473 1906/978/1473 1820/979/1473 +f 1907/976/1474 1820/979/1474 1819/977/1474 +f 1908/978/1475 1612/769/1475 1820/979/1475 +f 1595/736/1476 1805/949/1476 1821/980/1476 +f 1805/949/1477 1806/951/1477 1822/981/1477 +f 1805/949/1478 1822/981/1478 1821/980/1478 +f 1806/951/1479 1807/953/1479 1823/982/1479 +f 1806/951/1480 1823/982/1480 1822/981/1480 +f 1807/953/1481 1808/955/1481 1824/983/1481 +f 1807/953/1482 1824/983/1482 1823/982/1482 +f 1808/955/1483 1809/957/1483 1825/984/1483 +f 1808/955/1484 1825/984/1484 1824/983/1484 +f 1809/957/1485 1810/959/1485 1826/985/1485 +f 1809/957/1485 1826/985/1485 1825/984/1485 +f 1810/959/1486 1811/961/1486 1827/986/1486 +f 1810/959/1487 1827/986/1487 1826/985/1487 +f 1811/961/1488 1812/963/1488 1828/987/1488 +f 1811/961/1489 1828/987/1489 1827/986/1489 +f 1812/963/1490 1813/965/1490 1829/988/1490 +f 1812/963/1491 1829/988/1491 1828/987/1491 +f 1813/965/1492 1814/967/1492 1830/989/1492 +f 1813/965/1493 1830/989/1493 1829/988/1493 +f 1814/967/1494 1815/969/1494 1831/990/1494 +f 1814/967/1495 1831/990/1495 1830/989/1495 +f 1815/969/1496 1816/971/1496 1832/991/1496 +f 1815/969/1497 1832/991/1497 1831/990/1497 +f 1816/971/1498 1817/973/1498 1833/992/1498 +f 1816/971/1499 1833/992/1499 1832/991/1499 +f 1817/973/1500 1818/975/1500 1834/993/1500 +f 1817/973/1501 1834/993/1501 1833/992/1501 +f 1818/975/1502 1819/977/1502 1835/994/1502 +f 1818/975/1503 1835/994/1503 1834/993/1503 +f 1819/977/1504 1820/979/1504 1836/995/1504 +f 1819/977/1505 1836/995/1505 1835/994/1505 +f 1820/979/1506 1612/769/1506 1836/995/1506 +f 1595/736/1507 1821/980/1507 1837/996/1507 +f 1821/980/1508 1822/981/1508 1838/997/1508 +f 1821/980/1509 1838/997/1509 1837/996/1509 +f 1822/981/1510 1823/982/1510 1839/998/1510 +f 1822/981/1511 1839/998/1511 1838/997/1511 +f 1823/982/1512 1824/983/1512 1840/999/1512 +f 1823/982/1513 1840/999/1513 1839/998/1513 +f 1824/983/1514 1825/984/1514 1841/1000/1514 +f 1824/983/1515 1841/1000/1515 1840/999/1515 +f 1825/984/1516 1826/985/1516 1842/1001/1516 +f 1825/984/1517 1842/1001/1517 1841/1000/1517 +f 1826/985/1518 1827/986/1518 1843/1002/1518 +f 1826/985/1519 1843/1002/1519 1842/1001/1519 +f 1827/986/1520 1828/987/1520 1844/1003/1520 +f 1827/986/1521 1844/1003/1521 1843/1002/1521 +f 1828/987/1522 1829/988/1522 1845/1004/1522 +f 1828/987/1523 1845/1004/1523 1844/1003/1523 +f 1829/988/1524 1830/989/1524 1846/1005/1524 +f 1829/988/1525 1846/1005/1525 1845/1004/1525 +f 1830/989/1526 1831/990/1526 1847/1006/1526 +f 1830/989/1527 1847/1006/1527 1846/1005/1527 +f 1831/990/1528 1832/991/1528 1848/1007/1528 +f 1831/990/1529 1848/1007/1529 1847/1006/1529 +f 1832/991/1530 1833/992/1530 1849/1008/1530 +f 1832/991/1531 1849/1008/1531 1848/1007/1531 +f 1833/992/1532 1834/993/1532 1850/1009/1532 +f 1833/992/1533 1850/1009/1533 1849/1008/1533 +f 1834/993/1534 1835/994/1534 1851/1010/1534 +f 1834/993/1535 1851/1010/1535 1850/1009/1535 +f 1835/994/1536 1836/995/1536 1852/1011/1536 +f 1835/994/1537 1852/1011/1537 1851/1010/1537 +f 1836/995/1538 1612/769/1538 1852/1011/1538 +f 1595/736/1539 1837/996/1539 1596/737/1539 +f 1837/996/1540 1838/997/1540 1597/739/1540 +f 1837/996/1541 1597/739/1541 1596/737/1541 +f 1838/997/1542 1839/998/1542 1598/741/1542 +f 1838/997/1543 1598/741/1543 1597/739/1543 +f 1839/998/1544 1840/999/1544 1599/743/1544 +f 1839/998/1545 1599/743/1545 1598/741/1545 +f 1840/999/1546 1841/1000/1546 1600/745/1546 +f 1840/999/1547 1600/745/1547 1599/743/1547 +f 1841/1000/1548 1842/1001/1548 1601/747/1548 +f 1841/1000/1549 1601/747/1549 1600/745/1549 +f 1842/1001/1550 1843/1002/1550 1602/749/1550 +f 1842/1001/1551 1602/749/1551 1601/747/1551 +f 1843/1002/1552 1844/1003/1552 1603/751/1552 +f 1843/1002/1553 1603/751/1553 1602/749/1553 +f 1844/1003/1554 1845/1004/1554 1604/753/1554 +f 1844/1003/1555 1604/753/1555 1603/751/1555 +f 1845/1004/1556 1846/1005/1556 1605/755/1556 +f 1845/1004/1557 1605/755/1557 1604/753/1557 +f 1846/1005/1558 1847/1006/1558 1606/757/1558 +f 1846/1005/1559 1606/757/1559 1605/755/1559 +f 1847/1006/1560 1848/1007/1560 1607/759/1560 +f 1847/1006/1561 1607/759/1561 1606/757/1561 +f 1848/1007/1562 1849/1008/1562 1608/761/1562 +f 1848/1007/1563 1608/761/1563 1607/759/1563 +f 1849/1008/1564 1850/1009/1564 1609/763/1564 +f 1849/1008/1565 1609/763/1565 1608/761/1565 +f 1850/1009/1566 1851/1010/1566 1610/765/1566 +f 1850/1009/1567 1610/765/1567 1609/763/1567 +f 1851/1010/1568 1852/1011/1568 1611/767/1568 +f 1851/1010/1569 1611/767/1569 1610/765/1569 +f 1852/1011/1570 1612/769/1570 1611/767/1570 +o dieshor1 +v 0.389528 1.373023 -0.344602 +v 0.603196 1.373023 -0.348864 +v 0.494333 1.263206 -0.182360 +v 0.494362 1.263227 -0.514561 +v 0.564583 1.250478 -0.499110 +v 0.619927 1.239734 -0.457401 +v 0.605219 1.241798 -0.219971 +v 0.542537 1.254933 -0.189400 +v 0.658893 1.231205 -0.372987 +v 0.633912 1.236972 -0.258049 +v 0.653657 1.232276 -0.300519 +v 0.343947 1.233769 -0.278473 +v 0.328496 1.230876 -0.348460 +v 0.335535 1.232512 -0.396402 +v 0.385655 1.242419 -0.473791 +v 0.446654 1.254013 -0.507522 +v 0.369265 1.239284 -0.239520 +v 0.446654 1.254061 -0.189400 +v 0.404189 1.246377 -0.209141 +v 0.494571 1.372658 -0.114997 +v 0.427186 1.372658 -0.124891 +v 0.367499 1.372658 -0.152638 +v 0.318411 1.372658 -0.195338 +v 0.282826 1.372658 -0.250088 +v 0.263642 1.372658 -0.313987 +v 0.263642 1.372658 -0.382934 +v 0.282826 1.372658 -0.446833 +v 0.318412 1.372658 -0.501583 +v 0.367499 1.372658 -0.544283 +v 0.427186 1.372658 -0.572031 +v 0.494571 1.372658 -0.581925 +v 0.561956 1.372658 -0.572031 +v 0.621643 1.372658 -0.544283 +v 0.670731 1.372658 -0.501583 +v 0.718141 1.372658 -0.415846 +v 0.728036 1.372658 -0.348461 +v 0.706318 1.372658 -0.250088 +v 0.670731 1.372658 -0.195338 +v 0.621643 1.372658 -0.152639 +v 0.561956 1.372658 -0.124891 +v 0.263583 1.315494 -0.313975 +v 0.282773 1.315494 -0.250053 +v 0.282773 1.315494 -0.446868 +v 0.318372 1.315494 -0.501638 +v 0.367478 1.315495 -0.544354 +v 0.427186 1.315494 -0.572111 +v 0.494596 1.315494 -0.582010 +v 0.562005 1.315494 -0.572112 +v 0.318372 1.315494 -0.195283 +v 0.367478 1.315494 -0.152568 +v 0.427186 1.315494 -0.124810 +v 0.494595 1.315494 -0.114913 +v 0.562005 1.315493 -0.124810 +v 0.621714 1.315493 -0.152568 +v 0.670819 1.315493 -0.195284 +v 0.621714 1.315494 -0.544354 +v 0.670819 1.315494 -0.501639 +v 0.718246 1.315494 -0.415870 +v 0.728144 1.315494 -0.348461 +v 0.706419 1.315493 -0.250053 +v 0.542537 1.315005 -0.507522 +v 0.470069 1.315005 -0.512758 +v 0.404189 1.315005 -0.487780 +v 0.369265 1.315005 -0.457401 +v 0.335535 1.315005 -0.396402 +v 0.328496 1.315005 -0.348461 +v 0.263583 1.315494 -0.382946 +v 0.335535 1.315005 -0.300519 +v 0.355276 1.315127 -0.258054 +v 0.385656 1.315127 -0.223131 +v 0.424607 1.315004 -0.197812 +v 0.470069 1.315004 -0.184163 +v 0.519122 1.315004 -0.184163 +v 0.564583 1.315004 -0.197812 +v 0.603536 1.315126 -0.223130 +v 0.645245 1.315004 -0.278473 +v 0.658893 1.315004 -0.372987 +v 0.645245 1.315004 -0.418449 +v 0.603536 1.315005 -0.473792 +v 0.494683 0.690761 -2.824126 +v 0.494683 0.409639 -2.804202 +v 0.495012 0.129022 -2.727210 +v 0.495011 0.120736 -2.193231 +v 0.495011 0.118393 -2.189049 +v 0.495011 0.120735 -2.183705 +v 0.495011 0.120672 -1.660389 +v 0.495011 0.118328 -1.655317 +v 0.495011 0.120671 -1.651051 +v 0.495011 0.125437 -1.125772 +v 0.495011 0.123145 -1.120171 +v 0.495011 0.125533 -1.115222 +v 0.495010 0.120640 -0.591683 +v 0.495010 0.118359 -0.586591 +v 0.495010 0.120763 -0.581587 +v 0.495009 0.127390 -0.039513 +v 0.495301 0.445777 0.037393 +v 0.494681 0.690762 0.045669 +v 0.387102 0.431038 -2.804202 +v 0.280018 0.171656 -2.727210 +v 0.276847 0.164001 -2.193230 +v 0.275950 0.161836 -2.189049 +v 0.276847 0.164000 -2.183705 +v 0.276822 0.163942 -1.660389 +v 0.275925 0.161776 -1.655316 +v 0.276821 0.163941 -1.651050 +v 0.278645 0.168344 -1.125771 +v 0.277768 0.166226 -1.120170 +v 0.278682 0.168433 -1.115222 +v 0.276808 0.163912 -0.591684 +v 0.275935 0.161805 -0.586590 +v 0.276855 0.164026 -0.581586 +v 0.279391 0.170149 -0.039512 +v 0.401502 0.464188 0.037393 +v 0.295900 0.491978 -2.804202 +v 0.097706 0.293319 -2.727209 +v 0.091846 0.287461 -2.193230 +v 0.090189 0.285803 -2.189049 +v 0.091845 0.287460 -2.183705 +v 0.091801 0.287415 -1.660389 +v 0.090143 0.285758 -1.655316 +v 0.091800 0.287414 -1.651050 +v 0.095170 0.290785 -1.125771 +v 0.093548 0.289164 -1.120170 +v 0.095237 0.290852 -1.115222 +v 0.091776 0.287392 -0.591683 +v 0.090163 0.285779 -0.586590 +v 0.091864 0.287480 -0.581586 +v 0.096549 0.292166 -0.039512 +v 0.321889 0.517093 0.037393 +v 0.234961 0.583181 -2.804202 +v -0.024171 0.475489 -2.727209 +v -0.031826 0.472319 -2.193230 +v -0.033992 0.471422 -2.189049 +v -0.031827 0.472318 -2.183704 +v -0.031886 0.472294 -1.660389 +v -0.034052 0.471397 -1.655315 +v -0.031887 0.472294 -1.651050 +v -0.027484 0.474118 -1.125771 +v -0.029602 0.473241 -1.120170 +v -0.027395 0.474155 -1.115222 +v -0.031917 0.472282 -0.591683 +v -0.034025 0.471409 -0.586590 +v -0.031803 0.472329 -0.581586 +v -0.025681 0.474866 -0.039511 +v 0.268581 0.596437 0.037393 +v 0.213561 0.690762 -2.804202 +v -0.067057 0.690433 -2.727209 +v -0.075342 0.690433 -2.193229 +v -0.077686 0.690433 -2.189048 +v -0.075344 0.690433 -2.183704 +v -0.075407 0.690433 -1.660389 +v -0.077752 0.690433 -1.655316 +v -0.075409 0.690433 -1.651050 +v -0.070642 0.690433 -1.125771 +v -0.072935 0.690433 -1.120170 +v -0.070547 0.690433 -1.115222 +v -0.075440 0.690433 -0.591682 +v -0.077722 0.690433 -0.586590 +v -0.075317 0.690433 -0.581586 +v -0.068690 0.690433 -0.039512 +v 0.249696 0.690142 0.037393 +v 0.234960 0.798342 -2.804202 +v -0.024422 0.905426 -2.727209 +v -0.032078 0.908597 -2.193230 +v -0.034243 0.909494 -2.189048 +v -0.032079 0.908597 -2.183704 +v -0.032137 0.908622 -1.660389 +v -0.034303 0.909519 -1.655315 +v -0.032138 0.908622 -1.651050 +v -0.027735 0.906798 -1.125771 +v -0.029853 0.907676 -1.120170 +v -0.027647 0.906762 -1.115222 +v -0.032168 0.908634 -0.591683 +v -0.034276 0.909507 -0.586590 +v -0.032055 0.908587 -0.581586 +v -0.025932 0.906051 -0.039511 +v 0.268107 0.783940 0.037393 +v 0.295900 0.889545 -2.804202 +v 0.097241 1.087739 -2.727209 +v 0.091382 1.093597 -2.193230 +v 0.089724 1.095255 -2.189049 +v 0.091381 1.093598 -2.183705 +v 0.091336 1.093643 -1.660389 +v 0.089678 1.095301 -1.655316 +v 0.091335 1.093644 -1.651050 +v 0.094705 1.090274 -1.125771 +v 0.093084 1.091895 -1.120170 +v 0.094773 1.090206 -1.115222 +v 0.091312 1.093666 -0.591683 +v 0.089699 1.095279 -0.586590 +v 0.091399 1.093579 -0.581585 +v 0.096085 1.088893 -0.039511 +v 0.321012 0.863554 0.037393 +v 0.387103 0.950484 -2.804202 +v 0.279411 1.209615 -2.727209 +v 0.276240 1.217270 -2.193230 +v 0.275343 1.219435 -2.189048 +v 0.276239 1.217271 -2.183705 +v 0.276215 1.217330 -1.660389 +v 0.275318 1.219495 -1.655316 +v 0.276215 1.217331 -1.651050 +v 0.278039 1.212927 -1.125771 +v 0.277161 1.215045 -1.120171 +v 0.278075 1.212839 -1.115221 +v 0.276202 1.217360 -0.591683 +v 0.275328 1.219467 -0.586590 +v 0.276249 1.217246 -0.581586 +v 0.278785 1.211123 -0.039511 +v 0.400356 0.916861 0.037393 +v 0.494683 0.971884 -2.804202 +v 0.494354 1.252501 -2.727209 +v 0.494354 1.260786 -2.193230 +v 0.494354 1.263130 -2.189049 +v 0.494354 1.260787 -2.183706 +v 0.494354 1.260851 -1.660389 +v 0.494354 1.263195 -1.655316 +v 0.494354 1.260852 -1.651051 +v 0.494354 1.256086 -1.125771 +v 0.494354 1.258378 -1.120170 +v 0.494354 1.255990 -1.115222 +v 0.494353 1.260883 -0.591683 +v 0.494353 1.263165 -0.586590 +v 0.494353 1.260760 -0.581586 +v 0.494353 1.254133 -0.039512 +v 0.494061 0.935747 0.037393 +v 0.602265 0.950484 -2.804202 +v 0.709348 1.209867 -2.727210 +v 0.712518 1.217521 -2.193231 +v 0.713415 1.219687 -2.189049 +v 0.712519 1.217523 -2.183705 +v 0.712542 1.217581 -1.660389 +v 0.713440 1.219747 -1.655317 +v 0.712543 1.217582 -1.651051 +v 0.710719 1.213179 -1.125772 +v 0.711596 1.215297 -1.120171 +v 0.710682 1.213090 -1.115222 +v 0.712554 1.217611 -0.591684 +v 0.713427 1.219719 -0.586591 +v 0.712507 1.217497 -0.581587 +v 0.709970 1.211375 -0.039512 +v 0.587859 0.917336 0.037393 +v 0.693467 0.889544 -2.804202 +v 0.891660 1.088203 -2.727210 +v 0.897519 1.094062 -2.193231 +v 0.899176 1.095720 -2.189049 +v 0.897520 1.094063 -2.183705 +v 0.897564 1.094108 -1.660390 +v 0.899221 1.095765 -1.655317 +v 0.897565 1.094109 -1.651051 +v 0.894194 1.090738 -1.125772 +v 0.895815 1.092360 -1.120171 +v 0.894126 1.090671 -1.115223 +v 0.897586 1.094131 -0.591684 +v 0.899199 1.095744 -0.586591 +v 0.897499 1.094043 -0.581587 +v 0.892812 1.089357 -0.039513 +v 0.667473 0.864431 0.037393 +v 0.754406 0.798342 -2.804203 +v 1.013537 0.906033 -2.727210 +v 1.021191 0.909204 -2.193231 +v 1.023357 0.910101 -2.189050 +v 1.021192 0.909204 -2.183706 +v 1.021250 0.909229 -1.660390 +v 1.023416 0.910126 -1.655317 +v 1.021251 0.909229 -1.651051 +v 1.016848 0.907405 -1.125772 +v 1.018966 0.908282 -1.120171 +v 1.016759 0.907368 -1.115223 +v 1.021280 0.909241 -0.591684 +v 1.023387 0.910114 -0.586591 +v 1.021166 0.909194 -0.581587 +v 1.015042 0.906658 -0.039513 +v 0.720780 0.785086 0.037393 +v 0.775805 0.690761 -2.804203 +v 1.056422 0.691090 -2.727210 +v 1.064708 0.691090 -2.193231 +v 1.067051 0.691090 -2.189050 +v 1.064709 0.691090 -2.183706 +v 1.064772 0.691090 -1.660390 +v 1.067116 0.691090 -1.655317 +v 1.064773 0.691090 -1.651052 +v 1.060006 0.691090 -1.125773 +v 1.062299 0.691090 -1.120172 +v 1.059910 0.691090 -1.115223 +v 1.064803 0.691090 -0.591684 +v 1.067084 0.691090 -0.586591 +v 1.064680 0.691090 -0.581587 +v 1.058052 0.691090 -0.039513 +v 0.739666 0.691382 0.037393 +v 0.754406 0.583180 -2.804203 +v 1.013788 0.476097 -2.727211 +v 1.021443 0.472926 -2.193231 +v 1.023608 0.472029 -2.189050 +v 1.021444 0.472925 -2.183706 +v 1.021502 0.472901 -1.660390 +v 1.023668 0.472004 -1.655318 +v 1.021503 0.472901 -1.651051 +v 1.017099 0.474725 -1.125772 +v 1.019217 0.473847 -1.120172 +v 1.017010 0.474761 -1.115223 +v 1.021531 0.472889 -0.591684 +v 1.023638 0.472016 -0.586591 +v 1.021417 0.472936 -0.581587 +v 1.015294 0.475472 -0.039513 +v 0.721254 0.597583 0.037393 +v 0.693466 0.491978 -2.804203 +v 0.892125 0.293784 -2.727210 +v 0.897983 0.287925 -2.193231 +v 0.899641 0.286268 -2.189049 +v 0.897984 0.287924 -2.183706 +v 0.898029 0.287880 -1.660390 +v 0.899686 0.286222 -1.655317 +v 0.898029 0.287879 -1.651052 +v 0.894658 0.291249 -1.125773 +v 0.896280 0.289628 -1.120172 +v 0.894590 0.291317 -1.115223 +v 0.898051 0.287857 -0.591684 +v 0.899663 0.286244 -0.586591 +v 0.897963 0.287944 -0.581587 +v 0.893276 0.292630 -0.039513 +v 0.668349 0.517970 0.037393 +v 0.602264 0.431038 -2.804202 +v 0.709955 0.171908 -2.727210 +v 0.713125 0.164253 -2.193231 +v 0.714022 0.162087 -2.189049 +v 0.713125 0.164252 -2.183706 +v 0.713150 0.164193 -1.660390 +v 0.714047 0.162028 -1.655317 +v 0.713150 0.164192 -1.651051 +v 0.711326 0.168596 -1.125772 +v 0.712203 0.166478 -1.120171 +v 0.711289 0.168684 -1.115223 +v 0.713160 0.164164 -0.591684 +v 0.714034 0.162056 -0.586591 +v 0.713113 0.164278 -0.581587 +v 0.710577 0.170400 -0.039513 +v 0.589005 0.464663 0.037393 +v 0.494683 0.690761 -2.824126 +v 0.494683 0.690761 -2.824126 +v 0.494681 0.690762 0.045669 +v 0.494683 0.690761 -2.824126 +v 0.494681 0.690762 0.045669 +v 0.494683 0.690761 -2.824126 +v 0.494681 0.690762 0.045669 +v 0.494683 0.690761 -2.824126 +v 0.494681 0.690762 0.045669 +v 0.775805 0.690761 -2.804203 +v 0.775805 0.690761 -2.804203 +v 1.056422 0.691090 -2.727210 +v 0.775805 0.690761 -2.804203 +v 1.056422 0.691090 -2.727210 +v 1.064708 0.691090 -2.193231 +v 1.056422 0.691090 -2.727210 +v 1.064708 0.691090 -2.193231 +v 1.067051 0.691090 -2.189050 +v 1.064708 0.691090 -2.193231 +v 1.067051 0.691090 -2.189050 +v 1.064709 0.691090 -2.183706 +v 1.067051 0.691090 -2.189050 +v 1.064709 0.691090 -2.183706 +v 1.064772 0.691090 -1.660390 +v 1.064709 0.691090 -2.183706 +v 1.064772 0.691090 -1.660390 +v 1.067116 0.691090 -1.655317 +v 1.064772 0.691090 -1.660390 +v 1.067116 0.691090 -1.655317 +v 1.064773 0.691090 -1.651052 +v 1.067116 0.691090 -1.655317 +v 1.064773 0.691090 -1.651052 +v 1.060006 0.691090 -1.125773 +v 1.064773 0.691090 -1.651052 +v 1.060006 0.691090 -1.125773 +v 1.062299 0.691090 -1.120172 +v 1.060006 0.691090 -1.125773 +v 1.062299 0.691090 -1.120172 +v 1.059910 0.691090 -1.115223 +v 1.062299 0.691090 -1.120172 +v 1.059910 0.691090 -1.115223 +v 1.064803 0.691090 -0.591684 +v 1.059910 0.691090 -1.115223 +v 1.064803 0.691090 -0.591684 +v 1.067084 0.691090 -0.586591 +v 1.064803 0.691090 -0.591684 +v 1.067084 0.691090 -0.586591 +v 1.064680 0.691090 -0.581587 +v 1.067084 0.691090 -0.586591 +v 1.064680 0.691090 -0.581587 +v 1.058052 0.691090 -0.039513 +v 1.064680 0.691090 -0.581587 +v 1.058052 0.691090 -0.039513 +v 0.739666 0.691382 0.037393 +v 1.058052 0.691090 -0.039513 +v 0.739666 0.691382 0.037393 +vt 0.190735 0.839182 +vt 0.193609 0.896941 +vt 0.188361 0.862662 +vt 0.202488 0.916019 +vt 0.202488 0.809306 +vt 0.215244 0.930898 +vt 0.231371 0.940567 +vt 0.268691 0.940567 +vt 0.250031 0.944014 +vt 0.284816 0.930898 +vt 0.297569 0.916019 +vt 0.306446 0.896941 +vt 0.311087 0.850650 +vt 0.311087 0.874675 +vt 0.306446 0.828384 +vt 0.297569 0.809306 +vt 0.284816 0.794427 +vt 0.215244 0.794427 +vt 0.268691 0.784758 +vt 0.250031 0.781310 +vt 0.231371 0.784758 +vt 0.220184 0.862522 +vt 0.278914 0.864007 +vt 0.316566 0.874679 +vt 0.311595 0.896953 +vt 0.311595 0.828371 +vt 0.302033 0.809287 +vt 0.288188 0.794402 +vt 0.270546 0.784730 +vt 0.250027 0.781281 +vt 0.229507 0.784730 +vt 0.302033 0.916038 +vt 0.288188 0.930923 +vt 0.270546 0.940595 +vt 0.250027 0.944044 +vt 0.229507 0.940595 +vt 0.211863 0.930923 +vt 0.198015 0.916038 +vt 0.211863 0.794402 +vt 0.198015 0.809286 +vt 0.185370 0.839173 +vt 0.182831 0.862662 +vt 0.188451 0.896953 +vt 0.235380 0.807236 +vt 0.257535 0.805412 +vt 0.277449 0.814116 +vt 0.287702 0.824701 +vt 0.297313 0.845957 +vt 0.299277 0.862662 +vt 0.316566 0.850646 +vt 0.297313 0.879368 +vt 0.291718 0.894165 +vt 0.282918 0.906335 +vt 0.271340 0.915157 +vt 0.257535 0.919913 +vt 0.242518 0.919913 +vt 0.228713 0.915157 +vt 0.217134 0.906335 +vt 0.205103 0.887050 +vt 0.201273 0.854116 +vt 0.205103 0.838275 +vt 0.250118 0.920541 +vt 0.233667 0.918088 +vt 0.211884 0.907435 +vt 0.266420 0.918088 +vt 0.281121 0.911209 +vt 0.293223 0.900623 +vt 0.301940 0.887050 +vt 0.307152 0.862662 +vt 0.304752 0.845957 +vt 0.287569 0.818990 +vt 0.266421 0.807236 +vt 0.217127 0.818990 +vt 0.206872 0.824701 +vt 0.193507 0.854116 +vt 0.195279 0.879368 +vt 0.202073 0.894167 +vt 0.226030 0.810168 +vt 0.250108 0.804783 +vt 0.750004 -0.000000 +vt 0.750001 0.006942 +vt 0.692940 0.006942 +vt 0.750093 0.033771 +vt 0.688095 0.033771 +vt 0.750092 0.219840 +vt 0.688016 0.219840 +vt 0.750092 0.221297 +vt 0.687994 0.221297 +vt 0.750092 0.223159 +vt 0.688016 0.223159 +vt 0.750092 0.405512 +vt 0.688015 0.405512 +vt 0.750091 0.407280 +vt 0.687993 0.407280 +vt 0.750092 0.408766 +vt 0.688015 0.408766 +vt 0.750092 0.591803 +vt 0.688060 0.591803 +vt 0.750092 0.593755 +vt 0.688038 0.593755 +vt 0.750092 0.595479 +vt 0.688061 0.595479 +vt 0.750091 0.777910 +vt 0.688014 0.777910 +vt 0.750091 0.779685 +vt 0.687993 0.779685 +vt 0.750091 0.781429 +vt 0.688015 0.781429 +vt 0.750092 0.970318 +vt 0.688078 0.970318 +vt 0.750360 0.997116 +vt 0.694611 0.997116 +vt 0.749994 1.000000 +vt 0.637076 0.006942 +vt 0.628102 0.033771 +vt 0.627960 0.219840 +vt 0.627921 0.221297 +vt 0.627960 0.223159 +vt 0.627959 0.405512 +vt 0.627920 0.407280 +vt 0.627959 0.408766 +vt 0.628040 0.591803 +vt 0.628001 0.593755 +vt 0.628041 0.595479 +vt 0.627958 0.777910 +vt 0.627920 0.779685 +vt 0.627960 0.781429 +vt 0.628073 0.970318 +vt 0.639888 0.997116 +vt 0.582560 0.006942 +vt 0.570598 0.033771 +vt 0.570414 0.219840 +vt 0.570363 0.221297 +vt 0.570414 0.223159 +vt 0.570412 0.405512 +vt 0.570361 0.407280 +vt 0.570412 0.408766 +vt 0.570517 0.591803 +vt 0.570466 0.593755 +vt 0.570519 0.595479 +vt 0.570411 0.777910 +vt 0.570361 0.779685 +vt 0.570414 0.781429 +vt 0.570560 0.970318 +vt 0.586276 0.997116 +vt 0.528074 0.006942 +vt 0.514244 0.033771 +vt 0.514038 0.219840 +vt 0.513981 0.221297 +vt 0.514038 0.223159 +vt 0.514036 0.405512 +vt 0.513979 0.407280 +vt 0.514036 0.408766 +vt 0.514154 0.591803 +vt 0.514097 0.593755 +vt 0.514156 0.595479 +vt 0.514035 0.777910 +vt 0.513979 0.779685 +vt 0.514038 0.781429 +vt 0.514202 0.970318 +vt 0.532461 0.997116 +vt 0.470882 0.006942 +vt 0.456431 0.033771 +vt 0.456223 0.219840 +vt 0.456165 0.221297 +vt 0.456223 0.223159 +vt 0.456221 0.405512 +vt 0.456163 0.407280 +vt 0.456221 0.408766 +vt 0.456340 0.591803 +vt 0.456282 0.593755 +vt 0.456342 0.595479 +vt 0.456220 0.777910 +vt 0.456164 0.779685 +vt 0.456223 0.781428 +vt 0.456389 0.970318 +vt 0.475665 0.997116 +vt 0.407110 0.006942 +vt 0.394047 0.033771 +vt 0.393865 0.219840 +vt 0.393815 0.221297 +vt 0.393865 0.223159 +vt 0.393863 0.405512 +vt 0.393813 0.407280 +vt 0.393863 0.408766 +vt 0.393967 0.591803 +vt 0.393917 0.593755 +vt 0.393969 0.595479 +vt 0.393863 0.777910 +vt 0.393814 0.779685 +vt 0.393865 0.781428 +vt 0.394010 0.970318 +vt 0.411746 0.997116 +vt 0.333132 0.006942 +vt 0.324873 0.033771 +vt 0.324761 0.219840 +vt 0.324730 0.221297 +vt 0.324761 0.223159 +vt 0.324760 0.405512 +vt 0.324729 0.407279 +vt 0.324760 0.408766 +vt 0.324824 0.591803 +vt 0.324794 0.593755 +vt 0.324826 0.595479 +vt 0.324760 0.777910 +vt 0.324730 0.779685 +vt 0.324762 0.781428 +vt 0.324851 0.970318 +vt 0.336463 0.997116 +vt -0.249996 -0.000000 +vt 0.249999 0.006942 +vt 0.250113 0.033771 +vt 0.250111 0.219839 +vt 0.250111 0.221297 +vt 0.250111 0.223159 +vt 0.250111 0.405512 +vt 0.250111 0.407279 +vt 0.250111 0.408766 +vt 0.250113 0.591803 +vt 0.250112 0.593755 +vt 0.250113 0.595479 +vt 0.250112 0.777910 +vt 0.250111 0.779684 +vt 0.250112 0.781428 +vt 0.250113 0.970318 +vt 0.250571 0.997116 +vt 0.166866 0.006942 +vt 0.175343 0.033771 +vt 0.175452 0.219839 +vt 0.175482 0.221297 +vt 0.175452 0.223159 +vt 0.175453 0.405512 +vt 0.175483 0.407279 +vt 0.175453 0.408766 +vt 0.175391 0.591803 +vt 0.175421 0.593755 +vt 0.175390 0.595479 +vt 0.175454 0.777910 +vt 0.175483 0.779684 +vt 0.175452 0.781428 +vt 0.175366 0.970318 +vt 0.164592 0.997116 +vt -0.250006 1.000000 +vt 0.092889 0.006942 +vt 0.106149 0.033771 +vt 0.106328 0.219839 +vt 0.106377 0.221297 +vt 0.106328 0.223159 +vt 0.106329 0.405512 +vt 0.106379 0.407279 +vt 0.106329 0.408766 +vt 0.106228 0.591803 +vt 0.106277 0.593755 +vt 0.106225 0.595479 +vt 0.106331 0.777910 +vt 0.106379 0.779684 +vt 0.106328 0.781428 +vt 0.106186 0.970318 +vt 0.089147 0.997116 +vt 0.029118 0.006942 +vt 0.043746 0.033771 +vt 0.043952 0.219839 +vt 0.044009 0.221297 +vt 0.043952 0.223159 +vt 0.043954 0.405512 +vt 0.044011 0.407279 +vt 0.043954 0.408766 +vt 0.043837 0.591803 +vt 0.043893 0.593755 +vt 0.043834 0.595479 +vt 0.043955 0.777910 +vt 0.044011 0.779684 +vt 0.043952 0.781428 +vt 0.043788 0.970318 +vt 0.025104 0.997116 +vt -0.028074 0.006942 +vt -0.014075 0.033771 +vt -0.013872 0.219839 +vt -0.013815 0.221297 +vt -0.013872 0.223159 +vt -0.013870 0.405512 +vt -0.013813 0.407279 +vt -0.013870 0.408766 +vt -0.013986 0.591803 +vt -0.013930 0.593755 +vt -0.013988 0.595479 +vt -0.013869 0.777910 +vt -0.013814 0.779684 +vt -0.013872 0.781428 +vt -0.014034 0.970318 +vt -0.031756 0.997116 +vt 0.971926 0.006942 +vt 0.917440 0.006942 +vt 0.985925 0.033771 +vt 0.929571 0.033771 +vt 0.986128 0.219839 +vt 0.929753 0.219840 +vt 0.986185 0.221297 +vt 0.929803 0.221297 +vt 0.986128 0.223159 +vt 0.929753 0.223159 +vt 0.986130 0.405512 +vt 0.929754 0.405512 +vt 0.986187 0.407279 +vt 0.929804 0.407279 +vt 0.986130 0.408766 +vt 0.929754 0.408766 +vt 0.986014 0.591803 +vt 0.929651 0.591803 +vt 0.986070 0.593755 +vt 0.929701 0.593755 +vt 0.986012 0.595479 +vt 0.929649 0.595479 +vt 0.986131 0.777910 +vt 0.929755 0.777910 +vt 0.986186 0.779684 +vt 0.929804 0.779685 +vt 0.986128 0.781428 +vt 0.929752 0.781428 +vt 0.985966 0.970318 +vt 0.929608 0.970318 +vt 0.968244 0.997116 +vt 0.914411 0.997116 +vt 0.862925 0.006942 +vt 0.872073 0.033771 +vt 0.872212 0.219840 +vt 0.872251 0.221297 +vt 0.872212 0.223159 +vt 0.872213 0.405512 +vt 0.872252 0.407280 +vt 0.872214 0.408766 +vt 0.872134 0.591803 +vt 0.872172 0.593755 +vt 0.872132 0.595479 +vt 0.872214 0.777910 +vt 0.872252 0.779685 +vt 0.872212 0.781428 +vt 0.872101 0.970318 +vt 0.860807 0.997116 +vt 0.807061 0.006942 +vt 0.812088 0.033771 +vt 0.812165 0.219840 +vt 0.812186 0.221297 +vt 0.812165 0.223159 +vt 0.812165 0.405512 +vt 0.812186 0.407280 +vt 0.812165 0.408766 +vt 0.812121 0.591803 +vt 0.812142 0.593755 +vt 0.812120 0.595479 +vt 0.812165 0.777910 +vt 0.812186 0.779685 +vt 0.812164 0.781428 +vt 0.812103 0.970318 +vt 0.806101 0.997116 +vn -0.000000 1.000000 -0.000002 +vn 0.000005 1.000000 -0.000011 +vn -0.174206 0.981504 -0.079382 +vn -0.006136 0.999893 -0.013316 +vn -0.957768 0.001051 0.287540 +vn -0.838452 0.001110 -0.544975 +vn -0.838454 0.001114 -0.544971 +vn -0.656315 0.001192 -0.754486 +vn -0.656308 0.001181 -0.754492 +vn -0.421557 0.001281 -0.906801 +vn -0.145272 0.001395 -0.989391 +vn -0.145283 0.001408 -0.989389 +vn 0.145270 0.001532 -0.989391 +vn 0.145274 0.001527 -0.989390 +vn -0.838451 0.001109 0.544975 +vn -0.838455 0.001101 0.544970 +vn -0.656309 0.001173 0.754492 +vn -0.656305 0.001178 0.754494 +vn -0.421562 0.001275 0.906798 +vn -0.421560 0.001272 0.906800 +vn -0.145269 0.001391 0.989391 +vn 0.145268 0.001519 0.989391 +vn 0.145271 0.001514 0.989391 +vn 0.421557 0.001638 0.906800 +vn 0.421556 0.001639 0.906801 +vn 0.656306 0.001727 0.754493 +vn 0.656314 0.001739 0.754486 +vn 0.421561 0.001646 -0.906799 +vn 0.656304 0.001746 -0.754494 +vn 0.656309 0.001739 -0.754490 +vn 0.875118 0.001811 -0.483906 +vn 0.875115 0.001820 -0.483911 +vn 0.989389 0.001885 -0.145280 +vn 0.989389 0.001886 -0.145281 +vn 0.976485 0.001860 0.215577 +vn 0.976484 0.001853 0.215580 +vn 0.838448 0.001813 0.544979 +vn 0.838444 0.001805 0.544985 +vn -0.000888 -0.999981 -0.006046 +vn -0.003092 -0.999962 -0.008161 +vn -0.004812 -0.999973 -0.005531 +vn -0.003092 -0.999973 -0.006647 +vn -0.957768 0.001058 -0.287540 +vn -0.957769 0.001054 -0.287537 +vn -0.008039 -0.999946 0.006612 +vn -0.004899 -0.999987 0.001463 +vn -0.004617 -0.999981 0.004017 +vn -0.002355 -0.999966 0.007845 +vn 0.007663 -0.999946 0.006969 +vn 0.002159 -0.999987 0.004644 +vn 0.003460 -0.999982 0.004817 +vn 0.003695 -0.999984 0.004248 +vn 0.006142 -0.999973 0.003993 +vn 0.139040 -0.032083 0.989767 +vn 0.287427 0.028580 0.957376 +vn 0.432601 -0.032593 0.900996 +vn -0.000000 0.034790 0.999395 +vn -0.140128 -0.031191 0.989642 +vn -0.287425 0.028174 0.957389 +vn -0.417598 -0.025697 0.908268 +vn -0.544788 0.023708 0.838238 +vn -0.653572 -0.022241 0.756537 +vn -0.754311 0.021219 0.656174 +vn -0.836929 -0.020718 0.546919 +vn -0.906632 0.020485 0.421424 +vn -0.975254 -0.042086 0.217046 +vn -0.989393 0.000002 0.145263 +vn -0.989393 0.000001 -0.145262 +vn -0.989393 0.000001 -0.145261 +vn -0.833813 -0.064473 -0.548269 +vn -0.656151 0.022168 -0.754304 +vn 0.006887 -0.999963 -0.005192 +vn 0.797867 0.042802 -0.601313 +vn 0.957769 -0.000002 -0.287540 +vn 0.989734 0.000000 0.142923 +vn 0.994106 0.082261 0.070618 +vn 0.905723 -0.020728 0.423363 +vn 0.797961 0.041489 0.601279 +vn 0.544211 0.048568 0.837541 +vn -0.002700 0.999996 0.000812 +vn 0.015571 0.999869 0.004498 +vn 0.595675 -0.044920 -0.801969 +vn 0.204573 -0.057494 -0.977161 +vn 0.483278 0.051180 -0.873970 +vn 0.071900 0.068381 -0.995065 +vn -0.139990 -0.031221 -0.989661 +vn 0.800546 0.044118 0.597645 +vn 0.421559 0.001648 -0.906799 +vn -0.052549 -0.264167 -0.963045 +vn -0.170460 -0.859539 -0.481806 +vn -0.170467 -0.859585 -0.481720 +vn -0.178701 -0.901113 0.395046 +vn -0.178712 -0.901152 0.394953 +vn -0.177179 -0.893417 -0.412812 +vn -0.177183 -0.893450 -0.412738 +vn -0.171254 -0.863560 0.474275 +vn -0.171265 -0.863605 0.474189 +vn -0.180517 -0.910265 -0.372601 +vn -0.180521 -0.910304 -0.372504 +vn -0.175814 -0.886568 0.427886 +vn -0.175819 -0.886589 0.427841 +vn -0.178097 -0.898043 -0.402245 +vn -0.178102 -0.898086 -0.402146 +vn -0.194505 -0.980828 0.011991 +vn -0.046028 -0.234506 0.971024 +vn -0.046528 -0.234632 0.970970 +vn -0.006629 -0.033780 0.999407 +vn -0.040043 -0.059925 -0.997400 +vn -0.149557 -0.224110 -0.963020 +vn -0.149640 -0.223949 -0.963044 +vn -0.555020 -0.831698 -0.015216 +vn -0.486425 -0.728891 -0.481777 +vn -0.486444 -0.728922 -0.481711 +vn -0.509944 -0.764140 0.395029 +vn -0.509969 -0.764172 0.394934 +vn -0.555092 -0.831789 -0.000119 +vn -0.555090 -0.831790 -0.000118 +vn -0.505588 -0.757605 -0.412815 +vn -0.505600 -0.757626 -0.412760 +vn -0.488691 -0.732292 0.474268 +vn -0.488720 -0.732331 0.474177 +vn -0.555066 -0.831759 0.008900 +vn -0.555069 -0.831757 0.008898 +vn -0.515125 -0.771906 -0.372568 +vn -0.515131 -0.771916 -0.372541 +vn -0.501689 -0.751780 0.427942 +vn -0.501723 -0.751824 0.427824 +vn -0.555068 -0.831755 -0.009169 +vn -0.555063 -0.831758 -0.009166 +vn -0.508209 -0.761534 -0.402230 +vn -0.508218 -0.761548 -0.402193 +vn -0.502110 -0.752396 0.426363 +vn -0.502113 -0.752401 0.426352 +vn -0.555046 -0.831733 0.011991 +vn -0.555053 -0.831729 0.011988 +vn -0.132266 -0.199041 0.971024 +vn -0.223937 -0.149816 -0.963020 +vn -0.223952 -0.149641 -0.963044 +vn -0.831053 -0.555986 -0.015220 +vn -0.831048 -0.555993 -0.015216 +vn -0.728329 -0.487261 -0.481781 +vn -0.728340 -0.487269 -0.481757 +vn -0.763565 -0.510835 0.394989 +vn -0.763568 -0.510837 0.394981 +vn -0.831149 -0.556049 -0.000118 +vn -0.757014 -0.506449 -0.412842 +vn -0.757033 -0.506464 -0.412791 +vn -0.731732 -0.489539 0.474257 +vn -0.731738 -0.489543 0.474243 +vn -0.831116 -0.556028 0.008899 +vn -0.771288 -0.516003 -0.372632 +vn -0.771316 -0.516025 -0.372544 +vn -0.751211 -0.502575 0.427903 +vn -0.751247 -0.502596 0.427815 +vn -0.831112 -0.556030 -0.009167 +vn -0.760931 -0.509069 -0.402283 +vn -0.760967 -0.509097 -0.402181 +vn -0.751782 -0.502953 0.426454 +vn -0.751838 -0.502986 0.426315 +vn -0.831085 -0.556016 0.011990 +vn -0.831089 -0.556010 0.011987 +vn -0.198366 -0.133274 0.971025 +vn -0.198808 -0.133011 0.970970 +vn -0.070688 -0.014059 -0.997399 +vn -0.264169 -0.052546 -0.963044 +vn -0.980560 -0.195630 -0.015220 +vn -0.980557 -0.195643 -0.015215 +vn -0.859321 -0.171441 -0.481846 +vn -0.859321 -0.171440 -0.481846 +vn -0.900899 -0.179739 0.395064 +vn -0.900936 -0.179744 0.394976 +vn -0.980673 -0.195656 -0.000118 +vn -0.980673 -0.195655 -0.000119 +vn -0.893182 -0.178198 -0.412881 +vn -0.893213 -0.178207 -0.412810 +vn -0.863334 -0.172245 0.474327 +vn -0.863417 -0.172258 0.474171 +vn -0.980633 -0.195654 0.008901 +vn -0.980634 -0.195648 0.008898 +vn -0.910046 -0.181568 -0.372625 +vn -0.910097 -0.181582 -0.372494 +vn -0.886360 -0.176844 0.427894 +vn -0.886421 -0.176852 0.427762 +vn -0.897830 -0.179123 -0.402263 +vn -0.897864 -0.179132 -0.402184 +vn -0.887054 -0.176978 0.426396 +vn -0.887112 -0.176986 0.426272 +vn -0.980601 -0.195645 0.011990 +vn -0.234577 -0.046800 0.970970 +vn -0.070688 0.014059 -0.997399 +vn -0.264286 0.052409 -0.963019 +vn -0.264171 0.052545 -0.963044 +vn -0.980785 0.194499 -0.015218 +vn -0.980785 0.194495 -0.015217 +vn -0.859469 0.170448 -0.481934 +vn -0.859648 0.170476 -0.481604 +vn -0.901109 0.178701 0.395056 +vn -0.901190 0.178722 0.394860 +vn -0.980898 0.194525 -0.000119 +vn -0.980898 0.194524 -0.000119 +vn -0.893381 0.177174 -0.412891 +vn -0.893456 0.177184 -0.412725 +vn -0.863570 0.171259 0.474255 +vn -0.863574 0.171260 0.474247 +vn -0.980859 0.194514 0.008900 +vn -0.980858 0.194519 0.008898 +vn -0.910278 0.180518 -0.372568 +vn -0.886588 0.175817 0.427842 +vn -0.886601 0.175821 0.427815 +vn -0.980857 0.194512 -0.009166 +vn -0.898035 0.178092 -0.402264 +vn -0.898032 0.178092 -0.402270 +vn -0.887277 0.175958 0.426355 +vn -0.887296 0.175963 0.426314 +vn -0.980827 0.194510 0.011989 +vn -0.234505 0.046030 0.971025 +vn -0.234631 0.046527 0.970971 +vn -0.033779 0.006630 0.999407 +vn -0.059926 0.040039 -0.997400 +vn -0.831692 0.555028 -0.015220 +vn -0.831698 0.555019 -0.015216 +vn -0.728921 0.486441 -0.481714 +vn -0.728893 0.486424 -0.481774 +vn -0.764164 0.509964 0.394955 +vn -0.764152 0.509955 0.394991 +vn -0.831790 0.555091 -0.000119 +vn -0.831789 0.555092 -0.000119 +vn -0.757610 0.505590 -0.412803 +vn -0.757644 0.505609 -0.412716 +vn -0.732259 0.488671 0.474338 +vn -0.732314 0.488712 0.474212 +vn -0.831759 0.555066 0.008900 +vn -0.831757 0.555069 0.008898 +vn -0.771888 0.515113 -0.372623 +vn -0.771913 0.515128 -0.372549 +vn -0.751794 0.501702 0.427903 +vn -0.751826 0.501726 0.427820 +vn -0.831755 0.555067 -0.009168 +vn -0.761494 0.508183 -0.402340 +vn -0.761544 0.508212 -0.402209 +vn -0.752383 0.502101 0.426396 +vn -0.752406 0.502119 0.426335 +vn -0.831735 0.555044 0.011992 +vn -0.831728 0.555053 0.011987 +vn -0.199039 0.132265 0.971025 +vn -0.028670 0.019052 0.999407 +vn -0.040039 0.059926 -0.997400 +vn -0.149820 0.223939 -0.963019 +vn -0.149638 0.223954 -0.963044 +vn -0.555986 0.831053 -0.015219 +vn -0.555991 0.831049 -0.015216 +vn -0.487237 0.728299 -0.481851 +vn -0.487291 0.728373 -0.481685 +vn -0.510816 0.763535 0.395070 +vn -0.510834 0.763565 0.394990 +vn -0.556049 0.831149 -0.000119 +vn -0.506456 0.757024 -0.412816 +vn -0.506479 0.757054 -0.412733 +vn -0.489525 0.731711 0.474304 +vn -0.489558 0.731767 0.474184 +vn -0.556027 0.831116 0.008898 +vn -0.516010 0.771294 -0.372610 +vn -0.516016 0.771302 -0.372586 +vn -0.502574 0.751209 0.427908 +vn -0.502607 0.751266 0.427768 +vn -0.556026 0.831114 -0.009169 +vn -0.556030 0.831112 -0.009167 +vn -0.509073 0.760934 -0.402274 +vn -0.509093 0.760961 -0.402198 +vn -0.502967 0.751806 0.426395 +vn -0.502982 0.751831 0.426333 +vn -0.556014 0.831086 0.011990 +vn -0.556010 0.831089 0.011988 +vn -0.133271 0.198368 0.971025 +vn -0.133007 0.198810 0.970971 +vn -0.019196 0.028574 0.999407 +vn -0.014060 0.070687 -0.997399 +vn -0.052721 0.264225 -0.963019 +vn -0.052547 0.264169 -0.963044 +vn -0.195642 0.980557 -0.015215 +vn -0.171453 0.859362 -0.481768 +vn -0.171458 0.859382 -0.481730 +vn -0.179738 0.900898 0.395066 +vn -0.179742 0.900930 0.394991 +vn -0.195654 0.980673 -0.000119 +vn -0.178205 0.893215 -0.412807 +vn -0.178209 0.893233 -0.412767 +vn -0.172249 0.863363 0.474273 +vn -0.172252 0.863385 0.474232 +vn -0.195647 0.980634 0.008898 +vn -0.181565 0.910038 -0.372645 +vn -0.176845 0.886376 0.427859 +vn -0.176847 0.886386 0.427839 +vn -0.195647 0.980632 -0.009168 +vn -0.195652 0.980631 -0.009166 +vn -0.179124 0.897827 -0.402269 +vn -0.179134 0.897865 -0.402180 +vn -0.176976 0.887052 0.426402 +vn -0.176983 0.887098 0.426304 +vn -0.195647 0.980601 0.011991 +vn -0.195641 0.980602 0.011988 +vn 0.014060 0.070687 -0.997399 +vn 0.052406 0.264286 -0.963020 +vn 0.052546 0.264167 -0.963045 +vn 0.170458 0.859534 -0.481815 +vn 0.170464 0.859571 -0.481746 +vn 0.178700 0.901104 0.395067 +vn 0.178712 0.901148 0.394962 +vn 0.194525 0.980897 -0.000118 +vn 0.177175 0.893401 -0.412847 +vn 0.171251 0.863538 0.474316 +vn 0.171265 0.863595 0.474206 +vn 0.194517 0.980859 0.008898 +vn 0.180520 0.910300 -0.372514 +vn 0.175812 0.886552 0.427919 +vn 0.175821 0.886591 0.427837 +vn 0.178094 0.898037 -0.402258 +vn 0.175956 0.887263 0.426384 +vn 0.194510 0.980827 0.011988 +vn 0.046029 0.234504 0.971025 +vn 0.006630 0.033780 0.999407 +vn 0.040039 0.059926 -0.997400 +vn 0.149555 0.224110 -0.963020 +vn 0.149638 0.223951 -0.963044 +vn 0.555027 0.831693 -0.015218 +vn 0.555020 0.831698 -0.015214 +vn 0.486407 0.728865 -0.481833 +vn 0.486425 0.728895 -0.481770 +vn 0.509943 0.764136 0.395036 +vn 0.509957 0.764154 0.394984 +vn 0.555090 0.831790 -0.000118 +vn 0.555091 0.831790 -0.000118 +vn 0.505599 0.757629 -0.412757 +vn 0.488678 0.732270 0.474316 +vn 0.488739 0.732354 0.474122 +vn 0.555066 0.831759 0.008900 +vn 0.555069 0.831757 0.008899 +vn 0.515122 0.771903 -0.372580 +vn 0.515125 0.771909 -0.372563 +vn 0.501700 0.751791 0.427910 +vn 0.501732 0.751833 0.427800 +vn 0.508225 0.761564 -0.402154 +vn 0.502124 0.752417 0.426310 +vn 0.555045 0.831734 0.011992 +vn 0.132778 0.198966 0.970970 +vn 0.059923 0.040042 -0.997400 +vn 0.223934 0.149819 -0.963020 +vn 0.223949 0.149640 -0.963045 +vn 0.831053 0.555985 -0.015217 +vn 0.831049 0.555991 -0.015214 +vn 0.728287 0.487232 -0.481875 +vn 0.728329 0.487263 -0.481780 +vn 0.763536 0.510814 0.395072 +vn 0.763565 0.510831 0.394993 +vn 0.831150 0.556048 -0.000118 +vn 0.831150 0.556049 -0.000118 +vn 0.757022 0.506454 -0.412821 +vn 0.757043 0.506470 -0.412765 +vn 0.731758 0.489553 0.474203 +vn 0.731743 0.489544 0.474235 +vn 0.831113 0.556032 0.008901 +vn 0.771287 0.516003 -0.372635 +vn 0.771325 0.516033 -0.372516 +vn 0.751225 0.502584 0.427868 +vn 0.751236 0.502591 0.427839 +vn 0.831115 0.556026 -0.009167 +vn 0.831112 0.556030 -0.009165 +vn 0.760944 0.509078 -0.402248 +vn 0.760975 0.509102 -0.402158 +vn 0.751803 0.502965 0.426402 +vn 0.751846 0.502990 0.426297 +vn 0.831087 0.556014 0.011991 +vn 0.198371 0.133272 0.971024 +vn 0.198812 0.133009 0.970970 +vn 0.264223 0.052715 -0.963020 +vn 0.980559 0.195634 -0.015218 +vn 0.980558 0.195642 -0.015214 +vn 0.859309 0.171439 -0.481868 +vn 0.859381 0.171457 -0.481732 +vn 0.900895 0.179738 0.395074 +vn 0.900923 0.179742 0.395008 +vn 0.980673 0.195656 -0.000118 +vn 0.893199 0.178201 -0.412843 +vn 0.893251 0.178215 -0.412725 +vn 0.863339 0.172246 0.474318 +vn 0.863385 0.172253 0.474232 +vn 0.980633 0.195652 0.008901 +vn 0.980634 0.195647 0.008899 +vn 0.910059 0.181570 -0.372591 +vn 0.910090 0.181579 -0.372512 +vn 0.886347 0.176840 0.427920 +vn 0.886393 0.176846 0.427823 +vn 0.980632 0.195646 -0.009167 +vn 0.980631 0.195651 -0.009165 +vn 0.897841 0.179126 -0.402237 +vn 0.897881 0.179136 -0.402145 +vn 0.887064 0.176980 0.426375 +vn 0.887127 0.176988 0.426241 +vn 0.980601 0.195649 0.011992 +vn 0.980602 0.195642 0.011989 +vn 0.264286 -0.052405 -0.963020 +vn 0.264169 -0.052543 -0.963044 +vn 0.980784 -0.194502 -0.015218 +vn 0.980786 -0.194493 -0.015214 +vn 0.859535 -0.170458 -0.481813 +vn 0.859562 -0.170462 -0.481763 +vn 0.901097 -0.178698 0.395084 +vn 0.901135 -0.178708 0.394994 +vn 0.980898 -0.194524 -0.000118 +vn 0.893421 -0.177178 -0.412804 +vn 0.893432 -0.177179 -0.412780 +vn 0.863538 -0.171249 0.474316 +vn 0.863629 -0.171272 0.474142 +vn 0.980859 -0.194513 0.008901 +vn 0.980859 -0.194516 0.008900 +vn 0.910271 -0.180517 -0.372586 +vn 0.910284 -0.180519 -0.372553 +vn 0.886560 -0.175813 0.427903 +vn 0.886591 -0.175821 0.427834 +vn 0.980856 -0.194517 -0.009167 +vn 0.980857 -0.194514 -0.009165 +vn 0.898053 -0.178099 -0.402222 +vn 0.898097 -0.178104 -0.402121 +vn 0.887294 -0.175963 0.426317 +vn 0.887334 -0.175973 0.426230 +vn 0.980828 -0.194504 0.011992 +vn 0.980827 -0.194512 0.011989 +vn 0.234506 -0.046031 0.971024 +vn 0.234632 -0.046530 0.970970 +vn 0.059923 -0.040039 -0.997400 +vn 0.224109 -0.149560 -0.963020 +vn 0.223953 -0.149641 -0.963043 +vn 0.831693 -0.555028 -0.015218 +vn 0.831698 -0.555020 -0.015214 +vn 0.728860 -0.486405 -0.481844 +vn 0.728915 -0.486438 -0.481727 +vn 0.764125 -0.509937 0.395065 +vn 0.764138 -0.509947 0.395028 +vn 0.831790 -0.555091 -0.000118 +vn 0.831789 -0.555092 -0.000118 +vn 0.757587 -0.505577 -0.412860 +vn 0.757651 -0.505615 -0.412697 +vn 0.732309 -0.488705 0.474227 +vn 0.732312 -0.488708 0.474219 +vn 0.831759 -0.555065 0.008901 +vn 0.831756 -0.555070 0.008899 +vn 0.771886 -0.515112 -0.372629 +vn 0.771924 -0.515133 -0.372520 +vn 0.751791 -0.501699 0.427912 +vn 0.751815 -0.501718 0.427847 +vn 0.831755 -0.555067 -0.009167 +vn 0.831757 -0.555064 -0.009166 +vn 0.761545 -0.508216 -0.402201 +vn 0.752413 -0.502119 0.426322 +vn 0.752433 -0.502134 0.426271 +vn 0.831732 -0.555047 0.011992 +vn 0.831730 -0.555051 0.011989 +vn 0.199041 -0.132267 0.971024 +vn 0.198966 -0.132778 0.970970 +vn 0.028672 -0.019053 0.999407 +vn 0.040034 -0.059927 -0.997400 +vn 0.149822 -0.223937 -0.963019 +vn 0.149633 -0.223953 -0.963045 +vn 0.555992 -0.831049 -0.015214 +vn 0.487251 -0.728319 -0.481807 +vn 0.487282 -0.728361 -0.481712 +vn 0.510809 -0.763528 0.395093 +vn 0.510830 -0.763564 0.394997 +vn 0.506461 -0.757033 -0.412794 +vn 0.506486 -0.757065 -0.412705 +vn 0.489521 -0.731705 0.474317 +vn 0.489549 -0.731751 0.474217 +vn 0.556032 -0.831113 0.008901 +vn 0.556028 -0.831116 0.008899 +vn 0.516012 -0.771302 -0.372593 +vn 0.516032 -0.771327 -0.372513 +vn 0.502572 -0.751204 0.427917 +vn 0.502593 -0.751239 0.427832 +vn 0.556024 -0.831115 -0.009168 +vn 0.556031 -0.831111 -0.009164 +vn 0.509092 -0.760965 -0.402192 +vn 0.502975 -0.751820 0.426361 +vn 0.502985 -0.751837 0.426319 +vn 0.556015 -0.831086 0.011992 +vn 0.556008 -0.831091 0.011988 +vn 0.133010 -0.198812 0.970970 +vn 0.019199 -0.028574 0.999407 +vn 0.195634 -0.980559 -0.015218 +vn 0.195641 -0.980557 -0.015215 +vn 0.171448 -0.859351 -0.481791 +vn 0.171457 -0.859388 -0.481721 +vn 0.179741 -0.900894 0.395074 +vn 0.179746 -0.900939 0.394970 +vn 0.178206 -0.893226 -0.412784 +vn 0.178212 -0.893248 -0.412734 +vn 0.172249 -0.863345 0.474305 +vn 0.172258 -0.863406 0.474191 +vn 0.195653 -0.980633 0.008900 +vn 0.181570 -0.910057 -0.372596 +vn 0.181577 -0.910084 -0.372527 +vn 0.176841 -0.886345 0.427924 +vn 0.176849 -0.886401 0.427805 +vn 0.195648 -0.980631 -0.009167 +vn 0.195652 -0.980630 -0.009165 +vn 0.179125 -0.897830 -0.402263 +vn 0.179136 -0.897871 -0.402168 +vn 0.176979 -0.887057 0.426389 +vn 0.047216 -0.234271 0.971024 +vn 0.006801 -0.033746 0.999407 +s off +f 1943/1012/931 1945/1013/931 1944/1014/931 +f 1943/1012/932 1946/1015/932 1945/1013/932 +f 1942/1016/933 1946/1015/933 1943/1012/933 +f 1942/1016/934 1947/1017/934 1946/1015/934 +f 1942/1016/935 1948/1018/935 1947/1017/935 +f 1942/1016/936 1929/1019/936 1928/1020/936 +f 1942/1016/934 1930/1021/934 1929/1019/934 +f 1942/1016/937 1931/1022/937 1930/1021/937 +f 1942/1016/935 1932/1023/935 1931/1022/935 +f 1942/1016/1571 1934/1024/1571 1933/1025/1571 +f 1942/1016/934 1935/1026/934 1934/1024/934 +f 1942/1016/939 1936/1027/939 1935/1026/939 +f 1942/1016/934 1937/1028/934 1936/1027/934 +f 1941/1029/940 1937/1028/940 1942/1016/940 +f 1941/1029/941 1938/1030/941 1937/1028/941 +f 1941/1029/941 1939/1031/941 1938/1030/941 +f 1941/1029/1572 1940/1032/1572 1939/1031/1572 +f 1942/1016/1573 1928/1020/1573 1910/1033/1573 +f 1909/1034/1574 1942/1016/1574 1933/1025/1574 +f 1949/1035/945 1950/1036/945 1932/1023/945 +f 1932/1023/1575 1933/1025/1575 1949/1035/1575 +f 1951/1037/1576 1935/1026/1576 1936/1027/1576 +f 1952/1038/1577 1951/1037/1577 1936/1027/1577 +f 1952/1038/1578 1936/1027/1578 1937/1028/1578 +f 1953/1039/1579 1952/1038/1579 1937/1028/1579 +f 1953/1039/1580 1937/1028/1580 1938/1030/1580 +f 1938/1030/952 1954/1040/952 1953/1039/952 +f 1954/1040/1581 1938/1030/1581 1939/1031/1581 +f 1939/1031/1582 1955/1041/1582 1954/1040/1582 +f 1955/1041/1583 1939/1031/1583 1940/1032/1583 +f 1940/1032/1584 1956/1042/1584 1955/1041/1584 +f 1932/1023/1585 1950/1036/1585 1957/1043/1585 +f 1931/1022/1586 1932/1023/1586 1957/1043/1586 +f 1958/1044/1587 1930/1021/1587 1931/1022/1587 +f 1931/1022/1588 1957/1043/1588 1958/1044/1588 +f 1958/1044/1589 1959/1045/1589 1929/1019/1589 +f 1929/1019/1590 1930/1021/1590 1958/1044/1590 +f 1959/1045/1591 1960/1046/1591 1929/1019/1591 +f 1960/1046/1591 1928/1020/1591 1929/1019/1591 +f 1960/1046/1592 1961/1047/1592 1948/1018/1592 +f 1928/1020/1593 1960/1046/1593 1948/1018/1593 +f 1947/1017/1594 1948/1018/1594 1961/1047/1594 +f 1962/1048/1595 1947/1017/1595 1961/1047/1595 +f 1963/1049/1596 1946/1015/1596 1947/1017/1596 +f 1947/1017/1597 1962/1048/1597 1963/1049/1597 +f 1940/1032/1598 1941/1029/1598 1956/1042/1598 +f 1964/1050/1599 1941/1029/1599 1942/1016/1599 +f 1942/1016/1600 1965/1051/1600 1964/1050/1600 +f 1965/1051/1601 1942/1016/1601 1943/1012/1601 +f 1943/1012/1602 1966/1052/1602 1965/1051/1602 +f 1966/1052/1603 1944/1014/1603 1967/1053/1603 +f 1966/1052/1604 1943/1012/1604 1944/1014/1604 +f 1967/1053/1605 1944/1014/1605 1945/1013/1605 +f 1945/1013/1606 1968/1054/1606 1967/1053/1606 +f 1968/1054/1607 1945/1013/1607 1946/1015/1607 +f 1946/1015/1608 1963/1049/1608 1968/1054/1608 +f 1969/1055/979 1964/1050/979 1965/1051/979 +f 1969/1055/980 1970/1056/980 1964/1050/980 +f 1970/1056/981 1956/1042/981 1964/1050/981 +f 1955/1041/982 1956/1042/982 1970/1056/982 +f 1971/1057/1609 1954/1040/1609 1955/1041/1609 +f 1955/1041/1610 1970/1056/1610 1971/1057/1610 +f 1971/1057/1611 1972/1058/1611 1953/1039/1611 +f 1953/1039/1612 1954/1040/1612 1971/1057/1612 +f 1952/1038/987 1953/1039/987 1972/1058/987 +f 1972/1058/988 1973/1059/988 1952/1038/988 +f 1973/1059/989 1951/1037/989 1952/1038/989 +f 1973/1059/990 1974/1060/990 1951/1037/990 +f 1974/1060/991 1975/1061/991 1951/1037/991 +f 1974/1060/992 1976/1062/992 1975/1061/992 +f 1934/1024/1613 1935/1026/1613 1951/1037/1613 +f 1975/1061/1614 1934/1024/1614 1951/1037/1614 +f 1975/1061/996 1949/1035/996 1933/1025/996 +f 1933/1025/996 1934/1024/996 1975/1061/996 +f 1976/1062/997 1949/1035/997 1975/1061/997 +f 1976/1062/1615 1977/1063/1615 1949/1035/1615 +f 1977/1063/1616 1950/1036/1616 1949/1035/1616 +f 1977/1063/1617 1978/1064/1617 1950/1036/1617 +f 1978/1064/1001 1957/1043/1001 1950/1036/1001 +f 1978/1064/1002 1979/1065/1002 1957/1043/1002 +f 1958/1044/1003 1957/1043/1003 1979/1065/1003 +f 1979/1065/1618 1980/1066/1618 1958/1044/1618 +f 1980/1066/1005 1959/1045/1005 1958/1044/1005 +f 1980/1066/1006 1981/1067/1006 1959/1045/1006 +f 1960/1046/1007 1959/1045/1007 1981/1067/1007 +f 1981/1067/1008 1982/1068/1008 1960/1046/1008 +f 1961/1047/1009 1960/1046/1009 1982/1068/1009 +f 1982/1068/1619 1983/1069/1619 1961/1047/1619 +f 1962/1048/1620 1961/1047/1620 1983/1069/1620 +f 1983/1069/1621 1984/1070/1621 1963/1049/1621 +f 1963/1049/1622 1962/1048/1622 1983/1069/1622 +f 1968/1054/1623 1963/1049/1623 1984/1070/1623 +f 1984/1070/1015 1985/1071/1015 1968/1054/1015 +f 1967/1053/1016 1968/1054/1016 1985/1071/1016 +f 1985/1071/1017 1986/1072/1017 1967/1053/1017 +f 1966/1052/1018 1967/1053/1018 1986/1072/1018 +f 1981/1067/1624 1911/1073/1624 1916/1074/1624 +f 1982/1068/1625 1981/1067/1625 1916/1074/1625 +f 1916/1074/1626 1915/1075/1626 1982/1068/1626 +f 1911/1073/1627 1981/1067/1627 1980/1066/1627 +f 1911/1073/1628 1980/1066/1628 1926/1076/1628 +f 1926/1076/1629 1980/1066/1629 1979/1065/1629 +f 1979/1065/1630 1927/1077/1630 1926/1076/1630 +f 1927/1077/1631 1979/1065/1631 1978/1064/1631 +f 1978/1064/1632 1925/1078/1632 1927/1077/1632 +f 1925/1078/1633 1978/1064/1633 1977/1063/1633 +f 1925/1078/1634 1977/1063/1634 1920/1079/1634 +f 1920/1079/1635 1977/1063/1635 1976/1062/1635 +f 1976/1062/1636 1921/1080/1636 1920/1079/1636 +f 1921/1080/1637 1976/1062/1637 1974/1060/1637 +f 1921/1080/1638 1974/1060/1638 1973/1059/1638 +f 1973/1059/1639 1922/1081/1639 1921/1080/1639 +f 1922/1081/1035 1973/1059/1035 1972/1058/1035 +f 1972/1058/1640 1923/1082/1640 1922/1081/1640 +f 1923/1082/1641 1972/1058/1641 1971/1057/1641 +f 1971/1057/1038 1924/1083/1038 1923/1082/1038 +f 1969/1055/1039 1965/1051/1039 1987/1084/1039 +f 1987/1084/1040 1965/1051/1040 1966/1052/1040 +f 1966/1052/1642 1986/1072/1642 1987/1084/1642 +f 1914/1085/1643 1987/1084/1643 1986/1072/1643 +f 1917/1086/1043 1914/1085/1043 1986/1072/1043 +f 1917/1086/1644 1986/1072/1644 1985/1071/1644 +f 1917/1086/1645 1985/1071/1645 1984/1070/1645 +f 1984/1070/1646 1919/1087/1646 1917/1086/1646 +f 1918/1088/1647 1919/1087/1647 1984/1070/1647 +f 1918/1088/1648 1984/1070/1648 1983/1069/1648 +f 1915/1075/1649 1983/1069/1649 1982/1068/1649 +f 1932/1023/1650 1909/1034/1650 1933/1025/1650 +f 1909/1034/1051 1932/1023/1051 1942/1016/1051 +f 1948/1018/1052 1910/1033/1052 1928/1020/1052 +f 1948/1018/1651 1942/1016/1651 1910/1033/1651 +f 1987/1084/1652 1914/1085/1652 1913/1089/1652 +f 1971/1057/1055 1970/1056/1055 1924/1083/1055 +f 1969/1055/1653 1913/1089/1653 1912/1090/1653 +f 1913/1089/1654 1969/1055/1654 1987/1084/1654 +f 1912/1090/1655 1970/1056/1655 1969/1055/1655 +f 1970/1056/1656 1912/1090/1656 1924/1083/1656 +f 1918/1088/1657 1983/1069/1657 1915/1075/1657 +f 1956/1042/1658 1941/1029/1658 1964/1050/1658 +f 1988/1091/1062 1989/1092/1062 2006/1093/1062 +f 1989/1092/1063 1990/1094/1063 2007/1095/1063 +f 1989/1092/1659 2007/1095/1659 2006/1093/1659 +f 1990/1094/1065 1991/1096/1065 2008/1097/1065 +f 1990/1094/1066 2008/1097/1066 2007/1095/1066 +f 1991/1096/1660 1992/1098/1660 2009/1099/1660 +f 1991/1096/1661 2009/1099/1661 2008/1097/1661 +f 1992/1098/1662 1993/1100/1662 2010/1101/1662 +f 1992/1098/1663 2010/1101/1663 2009/1099/1663 +f 1993/1100/1072 1994/1102/1072 2011/1103/1072 +f 1993/1100/1071 2011/1103/1071 2010/1101/1071 +f 1994/1102/1664 1995/1104/1664 2012/1105/1664 +f 1994/1102/1665 2012/1105/1665 2011/1103/1665 +f 1995/1104/1666 1996/1106/1666 2013/1107/1666 +f 1995/1104/1667 2013/1107/1667 2012/1105/1667 +f 1996/1106/1077 1997/1108/1077 2014/1109/1077 +f 1996/1106/1078 2014/1109/1078 2013/1107/1078 +f 1997/1108/1668 1998/1110/1668 2015/1111/1668 +f 1997/1108/1669 2015/1111/1669 2014/1109/1669 +f 1998/1110/1670 1999/1112/1670 2016/1113/1670 +f 1998/1110/1671 2016/1113/1671 2015/1111/1671 +f 1999/1112/1083 2000/1114/1083 2017/1115/1083 +f 1999/1112/1084 2017/1115/1084 2016/1113/1084 +f 2000/1114/1672 2001/1116/1672 2018/1117/1672 +f 2000/1114/1673 2018/1117/1673 2017/1115/1673 +f 2001/1116/1087 2002/1118/1087 2019/1119/1087 +f 2001/1116/1088 2019/1119/1088 2018/1117/1088 +f 2002/1118/1674 2003/1120/1674 2020/1121/1674 +f 2002/1118/1090 2020/1121/1090 2019/1119/1090 +f 2003/1120/1675 2004/1122/1675 2021/1123/1675 +f 2003/1120/1676 2021/1123/1676 2020/1121/1676 +f 2004/1122/1677 2005/1124/1677 2021/1123/1677 +f 1988/1091/1678 2006/1093/1678 2022/1125/1678 +f 2006/1093/1679 2007/1095/1679 2023/1126/1679 +f 2006/1093/1680 2023/1126/1680 2022/1125/1680 +f 2007/1095/1097 2008/1097/1097 2024/1127/1097 +f 2007/1095/1681 2024/1127/1681 2023/1126/1681 +f 2008/1097/1682 2009/1099/1682 2025/1128/1682 +f 2008/1097/1683 2025/1128/1683 2024/1127/1683 +f 2009/1099/1684 2010/1101/1684 2026/1129/1684 +f 2009/1099/1685 2026/1129/1685 2025/1128/1685 +f 2010/1101/1686 2011/1103/1686 2027/1130/1686 +f 2010/1101/1687 2027/1130/1687 2026/1129/1687 +f 2011/1103/1688 2012/1105/1688 2028/1131/1688 +f 2011/1103/1689 2028/1131/1689 2027/1130/1689 +f 2012/1105/1690 2013/1107/1690 2029/1132/1690 +f 2012/1105/1691 2029/1132/1691 2028/1131/1691 +f 2013/1107/1692 2014/1109/1692 2030/1133/1692 +f 2013/1107/1693 2030/1133/1693 2029/1132/1693 +f 2014/1109/1694 2015/1111/1694 2031/1134/1694 +f 2014/1109/1695 2031/1134/1695 2030/1133/1695 +f 2015/1111/1696 2016/1113/1696 2032/1135/1696 +f 2015/1111/1697 2032/1135/1697 2031/1134/1697 +f 2016/1113/1698 2017/1115/1698 2033/1136/1698 +f 2016/1113/1699 2033/1136/1699 2032/1135/1699 +f 2017/1115/1700 2018/1117/1700 2034/1137/1700 +f 2017/1115/1701 2034/1137/1701 2033/1136/1701 +f 2018/1117/1702 2019/1119/1702 2035/1138/1702 +f 2018/1117/1703 2035/1138/1703 2034/1137/1703 +f 2019/1119/1704 2020/1121/1704 2036/1139/1704 +f 2019/1119/1705 2036/1139/1705 2035/1138/1705 +f 2020/1121/1706 2021/1123/1706 2037/1140/1706 +f 2020/1121/1124 2037/1140/1124 2036/1139/1124 +f 2021/1123/1125 2005/1124/1125 2037/1140/1125 +f 1988/1091/1126 2022/1125/1126 2038/1141/1126 +f 2022/1125/1707 2023/1126/1707 2039/1142/1707 +f 2022/1125/1708 2039/1142/1708 2038/1141/1708 +f 2023/1126/1709 2024/1127/1709 2040/1143/1709 +f 2023/1126/1710 2040/1143/1710 2039/1142/1710 +f 2024/1127/1711 2025/1128/1711 2041/1144/1711 +f 2024/1127/1712 2041/1144/1712 2040/1143/1712 +f 2025/1128/1713 2026/1129/1713 2042/1145/1713 +f 2025/1128/1714 2042/1145/1714 2041/1144/1714 +f 2026/1129/1715 2027/1130/1715 2043/1146/1715 +f 2026/1129/1715 2043/1146/1715 2042/1145/1715 +f 2027/1130/1716 2028/1131/1716 2044/1147/1716 +f 2027/1130/1717 2044/1147/1717 2043/1146/1717 +f 2028/1131/1718 2029/1132/1718 2045/1148/1718 +f 2028/1131/1719 2045/1148/1719 2044/1147/1719 +f 2029/1132/1141 2030/1133/1141 2046/1149/1141 +f 2029/1132/1720 2046/1149/1720 2045/1148/1720 +f 2030/1133/1721 2031/1134/1721 2047/1150/1721 +f 2030/1133/1722 2047/1150/1722 2046/1149/1722 +f 2031/1134/1723 2032/1135/1723 2048/1151/1723 +f 2031/1134/1724 2048/1151/1724 2047/1150/1724 +f 2032/1135/1147 2033/1136/1147 2049/1152/1147 +f 2032/1135/1725 2049/1152/1725 2048/1151/1725 +f 2033/1136/1726 2034/1137/1726 2050/1153/1726 +f 2033/1136/1727 2050/1153/1727 2049/1152/1727 +f 2034/1137/1728 2035/1138/1728 2051/1154/1728 +f 2034/1137/1729 2051/1154/1729 2050/1153/1729 +f 2035/1138/1730 2036/1139/1730 2052/1155/1730 +f 2035/1138/1731 2052/1155/1731 2051/1154/1731 +f 2036/1139/1732 2037/1140/1732 2053/1156/1732 +f 2036/1139/1733 2053/1156/1733 2052/1155/1733 +f 2037/1140/1157 2005/1124/1157 2053/1156/1157 +f 1988/1091/1734 2038/1141/1734 2054/1157/1734 +f 2038/1141/1159 2039/1142/1159 2055/1158/1159 +f 2038/1141/1735 2055/1158/1735 2054/1157/1735 +f 2039/1142/1736 2040/1143/1736 2056/1159/1736 +f 2039/1142/1737 2056/1159/1737 2055/1158/1737 +f 2040/1143/1738 2041/1144/1738 2057/1160/1738 +f 2040/1143/1739 2057/1160/1739 2056/1159/1739 +f 2041/1144/1740 2042/1145/1740 2058/1161/1740 +f 2041/1144/1741 2058/1161/1741 2057/1160/1741 +f 2042/1145/1742 2043/1146/1742 2059/1162/1742 +f 2042/1145/1743 2059/1162/1743 2058/1161/1743 +f 2043/1146/1744 2044/1147/1744 2060/1163/1744 +f 2043/1146/1745 2060/1163/1745 2059/1162/1745 +f 2044/1147/1746 2045/1148/1746 2061/1164/1746 +f 2044/1147/1747 2061/1164/1747 2060/1163/1747 +f 2045/1148/1748 2046/1149/1748 2062/1165/1748 +f 2045/1148/1749 2062/1165/1749 2061/1164/1749 +f 2046/1149/1750 2047/1150/1750 2063/1166/1750 +f 2046/1149/1751 2063/1166/1751 2062/1165/1751 +f 2047/1150/1752 2048/1151/1752 2064/1167/1752 +f 2047/1150/1753 2064/1167/1753 2063/1166/1753 +f 2048/1151/1179 2049/1152/1179 2065/1168/1179 +f 2048/1151/1180 2065/1168/1180 2064/1167/1180 +f 2049/1152/1754 2050/1153/1754 2066/1169/1754 +f 2049/1152/1755 2066/1169/1755 2065/1168/1755 +f 2050/1153/1756 2051/1154/1756 2067/1170/1756 +f 2050/1153/1757 2067/1170/1757 2066/1169/1757 +f 2051/1154/1758 2052/1155/1758 2068/1171/1758 +f 2051/1154/1186 2068/1171/1186 2067/1170/1186 +f 2052/1155/1187 2053/1156/1187 2069/1172/1187 +f 2052/1155/1759 2069/1172/1759 2068/1171/1759 +f 2053/1156/1189 2005/1124/1189 2069/1172/1189 +f 1988/1091/1760 2054/1157/1760 2070/1173/1760 +f 2054/1157/1761 2055/1158/1761 2071/1174/1761 +f 2054/1157/1762 2071/1174/1762 2070/1173/1762 +f 2055/1158/1763 2056/1159/1763 2072/1175/1763 +f 2055/1158/1764 2072/1175/1764 2071/1174/1764 +f 2056/1159/1765 2057/1160/1765 2073/1176/1765 +f 2056/1159/1766 2073/1176/1766 2072/1175/1766 +f 2057/1160/1767 2058/1161/1767 2074/1177/1767 +f 2057/1160/1768 2074/1177/1768 2073/1176/1768 +f 2058/1161/1769 2059/1162/1769 2075/1178/1769 +f 2058/1161/1770 2075/1178/1770 2074/1177/1770 +f 2059/1162/1771 2060/1163/1771 2076/1179/1771 +f 2059/1162/1772 2076/1179/1772 2075/1178/1772 +f 2060/1163/1773 2061/1164/1773 2077/1180/1773 +f 2060/1163/1774 2077/1180/1774 2076/1179/1774 +f 2061/1164/1775 2062/1165/1775 2078/1181/1775 +f 2061/1164/1776 2078/1181/1776 2077/1180/1776 +f 2062/1165/1777 2063/1166/1777 2079/1182/1777 +f 2062/1165/1208 2079/1182/1208 2078/1181/1208 +f 2063/1166/1778 2064/1167/1778 2080/1183/1778 +f 2063/1166/1779 2080/1183/1779 2079/1182/1779 +f 2064/1167/1211 2065/1168/1211 2081/1184/1211 +f 2064/1167/1780 2081/1184/1780 2080/1183/1780 +f 2065/1168/1781 2066/1169/1781 2082/1185/1781 +f 2065/1168/1782 2082/1185/1782 2081/1184/1782 +f 2066/1169/1783 2067/1170/1783 2083/1186/1783 +f 2066/1169/1784 2083/1186/1784 2082/1185/1784 +f 2067/1170/1217 2068/1171/1217 2084/1187/1217 +f 2067/1170/1785 2084/1187/1785 2083/1186/1785 +f 2068/1171/1786 2069/1172/1786 2085/1188/1786 +f 2068/1171/1787 2085/1188/1787 2084/1187/1787 +f 2069/1172/1788 2005/1124/1788 2085/1188/1788 +f 1988/1091/1789 2070/1173/1789 2086/1189/1789 +f 2070/1173/1223 2071/1174/1223 2087/1190/1223 +f 2070/1173/1224 2087/1190/1224 2086/1189/1224 +f 2071/1174/1790 2072/1175/1790 2088/1191/1790 +f 2071/1174/1791 2088/1191/1791 2087/1190/1791 +f 2072/1175/1792 2073/1176/1792 2089/1192/1792 +f 2072/1175/1793 2089/1192/1793 2088/1191/1793 +f 2073/1176/1794 2074/1177/1794 2090/1193/1794 +f 2073/1176/1795 2090/1193/1795 2089/1192/1795 +f 2074/1177/1796 2075/1178/1796 2091/1194/1796 +f 2074/1177/1797 2091/1194/1797 2090/1193/1797 +f 2075/1178/1798 2076/1179/1798 2092/1195/1798 +f 2075/1178/1799 2092/1195/1799 2091/1194/1799 +f 2076/1179/1800 2077/1180/1800 2093/1196/1800 +f 2076/1179/1801 2093/1196/1801 2092/1195/1801 +f 2077/1180/1802 2078/1181/1802 2094/1197/1802 +f 2077/1180/1803 2094/1197/1803 2093/1196/1803 +f 2078/1181/1804 2079/1182/1804 2095/1198/1804 +f 2078/1181/1805 2095/1198/1805 2094/1197/1805 +f 2079/1182/1806 2080/1183/1806 2096/1199/1806 +f 2079/1182/1807 2096/1199/1807 2095/1198/1807 +f 2080/1183/1808 2081/1184/1808 2097/1200/1808 +f 2080/1183/1244 2097/1200/1244 2096/1199/1244 +f 2081/1184/1809 2082/1185/1809 2098/1201/1809 +f 2081/1184/1810 2098/1201/1810 2097/1200/1810 +f 2082/1185/1811 2083/1186/1811 2099/1202/1811 +f 2082/1185/1812 2099/1202/1812 2098/1201/1812 +f 2083/1186/1813 2084/1187/1813 2100/1203/1813 +f 2083/1186/1814 2100/1203/1814 2099/1202/1814 +f 2084/1187/1815 2085/1188/1815 2101/1204/1815 +f 2084/1187/1252 2101/1204/1252 2100/1203/1252 +f 2085/1188/1816 2005/1124/1816 2101/1204/1816 +f 1988/1091/1817 2086/1189/1817 2102/1205/1817 +f 2086/1189/1818 2087/1190/1818 2103/1206/1818 +f 2086/1189/1819 2103/1206/1819 2102/1205/1819 +f 2087/1190/1820 2088/1191/1820 2104/1207/1820 +f 2087/1190/1821 2104/1207/1821 2103/1206/1821 +f 2088/1191/1822 2089/1192/1822 2105/1208/1822 +f 2088/1191/1823 2105/1208/1823 2104/1207/1823 +f 2089/1192/1824 2090/1193/1824 2106/1209/1824 +f 2089/1192/1825 2106/1209/1825 2105/1208/1825 +f 2090/1193/1826 2091/1194/1826 2107/1210/1826 +f 2090/1193/1264 2107/1210/1264 2106/1209/1264 +f 2091/1194/1827 2092/1195/1827 2108/1211/1827 +f 2091/1194/1828 2108/1211/1828 2107/1210/1828 +f 2092/1195/1829 2093/1196/1829 2109/1212/1829 +f 2092/1195/1830 2109/1212/1830 2108/1211/1830 +f 2093/1196/1269 2094/1197/1269 2110/1213/1269 +f 2093/1196/1831 2110/1213/1831 2109/1212/1831 +f 2094/1197/1832 2095/1198/1832 2111/1214/1832 +f 2094/1197/1833 2111/1214/1833 2110/1213/1833 +f 2095/1198/1834 2096/1199/1834 2112/1215/1834 +f 2095/1198/1835 2112/1215/1835 2111/1214/1835 +f 2096/1199/1836 2097/1200/1836 2113/1216/1836 +f 2096/1199/1837 2113/1216/1837 2112/1215/1837 +f 2097/1200/1838 2098/1201/1838 2114/1217/1838 +f 2097/1200/1839 2114/1217/1839 2113/1216/1839 +f 2098/1201/1840 2099/1202/1840 2115/1218/1840 +f 2098/1201/1841 2115/1218/1841 2114/1217/1841 +f 2099/1202/1842 2100/1203/1842 2116/1219/1842 +f 2099/1202/1843 2116/1219/1843 2115/1218/1843 +f 2100/1203/1844 2101/1204/1844 2117/1220/1844 +f 2100/1203/1845 2117/1220/1845 2116/1219/1845 +f 2101/1204/1846 2005/1124/1846 2117/1220/1846 +f 2246/1221/1847 2102/1205/1847 2118/1222/1847 +f 2102/1205/1848 2103/1206/1848 2119/1223/1848 +f 2102/1205/1849 2119/1223/1849 2118/1222/1849 +f 2103/1206/1289 2104/1207/1289 2120/1224/1289 +f 2103/1206/1850 2120/1224/1850 2119/1223/1850 +f 2104/1207/1851 2105/1208/1851 2121/1225/1851 +f 2104/1207/1852 2121/1225/1852 2120/1224/1852 +f 2105/1208/1853 2106/1209/1853 2122/1226/1853 +f 2105/1208/1854 2122/1226/1854 2121/1225/1854 +f 2106/1209/1855 2107/1210/1855 2123/1227/1855 +f 2106/1209/1296 2123/1227/1296 2122/1226/1296 +f 2107/1210/1856 2108/1211/1856 2124/1228/1856 +f 2107/1210/1857 2124/1228/1857 2123/1227/1857 +f 2108/1211/1858 2109/1212/1858 2125/1229/1858 +f 2108/1211/1859 2125/1229/1859 2124/1228/1859 +f 2109/1212/1301 2110/1213/1301 2126/1230/1301 +f 2109/1212/1860 2126/1230/1860 2125/1229/1860 +f 2110/1213/1861 2111/1214/1861 2127/1231/1861 +f 2110/1213/1304 2127/1231/1304 2126/1230/1304 +f 2111/1214/1862 2112/1215/1862 2128/1232/1862 +f 2111/1214/1863 2128/1232/1863 2127/1231/1863 +f 2112/1215/1864 2113/1216/1864 2129/1233/1864 +f 2112/1215/1865 2129/1233/1865 2128/1232/1865 +f 2113/1216/1866 2114/1217/1866 2130/1234/1866 +f 2113/1216/1867 2130/1234/1867 2129/1233/1867 +f 2114/1217/1868 2115/1218/1868 2131/1235/1868 +f 2114/1217/1869 2131/1235/1869 2130/1234/1869 +f 2115/1218/1870 2116/1219/1870 2132/1236/1870 +f 2115/1218/1871 2132/1236/1871 2131/1235/1871 +f 2116/1219/1315 2117/1220/1315 2133/1237/1315 +f 2116/1219/1316 2133/1237/1316 2132/1236/1316 +f 2117/1220/1317 2005/1124/1317 2133/1237/1317 +f 2247/1221/1872 2118/1222/1872 2134/1238/1872 +f 2118/1222/1873 2119/1223/1873 2135/1239/1873 +f 2118/1222/1874 2135/1239/1874 2134/1238/1874 +f 2119/1223/1321 2120/1224/1321 2136/1240/1321 +f 2119/1223/1322 2136/1240/1322 2135/1239/1322 +f 2120/1224/1875 2121/1225/1875 2137/1241/1875 +f 2120/1224/1876 2137/1241/1876 2136/1240/1876 +f 2121/1225/1877 2122/1226/1877 2138/1242/1877 +f 2121/1225/1878 2138/1242/1878 2137/1241/1878 +f 2122/1226/1879 2123/1227/1879 2139/1243/1879 +f 2122/1226/1327 2139/1243/1327 2138/1242/1327 +f 2123/1227/1880 2124/1228/1880 2140/1244/1880 +f 2123/1227/1329 2140/1244/1329 2139/1243/1329 +f 2124/1228/1881 2125/1229/1881 2141/1245/1881 +f 2124/1228/1882 2141/1245/1882 2140/1244/1882 +f 2125/1229/1332 2126/1230/1332 2142/1246/1332 +f 2125/1229/1883 2142/1246/1883 2141/1245/1883 +f 2126/1230/1334 2127/1231/1334 2143/1247/1334 +f 2126/1230/1884 2143/1247/1884 2142/1246/1884 +f 2127/1231/1885 2128/1232/1885 2144/1248/1885 +f 2127/1231/1886 2144/1248/1886 2143/1247/1886 +f 2128/1232/1338 2129/1233/1338 2145/1249/1338 +f 2128/1232/1339 2145/1249/1339 2144/1248/1339 +f 2129/1233/1887 2130/1234/1887 2146/1250/1887 +f 2129/1233/1341 2146/1250/1341 2145/1249/1341 +f 2130/1234/1888 2131/1235/1888 2147/1251/1888 +f 2130/1234/1343 2147/1251/1343 2146/1250/1343 +f 2131/1235/1344 2132/1236/1344 2148/1252/1344 +f 2131/1235/1889 2148/1252/1889 2147/1251/1889 +f 2132/1236/1890 2133/1237/1890 2149/1253/1890 +f 2132/1236/1347 2149/1253/1347 2148/1252/1347 +f 2133/1237/1891 2248/1254/1891 2149/1253/1891 +f 2249/1221/1892 2134/1238/1892 2150/1255/1892 +f 2134/1238/1893 2135/1239/1893 2151/1256/1893 +f 2134/1238/1894 2151/1256/1894 2150/1255/1894 +f 2135/1239/1895 2136/1240/1895 2152/1257/1895 +f 2135/1239/1896 2152/1257/1896 2151/1256/1896 +f 2136/1240/1897 2137/1241/1897 2153/1258/1897 +f 2136/1240/1898 2153/1258/1898 2152/1257/1898 +f 2137/1241/1899 2138/1242/1899 2154/1259/1899 +f 2137/1241/1900 2154/1259/1900 2153/1258/1900 +f 2138/1242/1901 2139/1243/1901 2155/1260/1901 +f 2138/1242/1902 2155/1260/1902 2154/1259/1902 +f 2139/1243/1360 2140/1244/1360 2156/1261/1360 +f 2139/1243/1903 2156/1261/1903 2155/1260/1903 +f 2140/1244/1904 2141/1245/1904 2157/1262/1904 +f 2140/1244/1905 2157/1262/1905 2156/1261/1905 +f 2141/1245/1906 2142/1246/1906 2158/1263/1906 +f 2141/1245/1907 2158/1263/1907 2157/1262/1907 +f 2142/1246/1908 2143/1247/1908 2159/1264/1908 +f 2142/1246/1909 2159/1264/1909 2158/1263/1909 +f 2143/1247/1910 2144/1248/1910 2160/1265/1910 +f 2143/1247/1911 2160/1265/1911 2159/1264/1911 +f 2144/1248/1370 2145/1249/1370 2161/1266/1370 +f 2144/1248/1371 2161/1266/1371 2160/1265/1371 +f 2145/1249/1372 2146/1250/1372 2162/1267/1372 +f 2145/1249/1912 2162/1267/1912 2161/1266/1912 +f 2146/1250/1374 2147/1251/1374 2163/1268/1374 +f 2146/1250/1913 2163/1268/1913 2162/1267/1913 +f 2147/1251/1914 2148/1252/1914 2164/1269/1914 +f 2147/1251/1377 2164/1269/1377 2163/1268/1377 +f 2148/1252/1378 2149/1253/1378 2165/1270/1378 +f 2148/1252/1915 2165/1270/1915 2164/1269/1915 +f 2149/1253/1380 2250/1254/1380 2165/1270/1380 +f 2251/1221/1916 2150/1255/1916 2166/1271/1916 +f 2150/1255/1917 2151/1256/1917 2167/1272/1917 +f 2150/1255/1918 2167/1272/1918 2166/1271/1918 +f 2151/1256/1919 2152/1257/1919 2168/1273/1919 +f 2151/1256/1920 2168/1273/1920 2167/1272/1920 +f 2152/1257/1921 2153/1258/1921 2169/1274/1921 +f 2152/1257/1922 2169/1274/1922 2168/1273/1922 +f 2153/1258/1923 2154/1259/1923 2170/1275/1923 +f 2153/1258/1924 2170/1275/1924 2169/1274/1924 +f 2154/1259/1925 2155/1260/1925 2171/1276/1925 +f 2154/1259/1926 2171/1276/1926 2170/1275/1926 +f 2155/1260/1927 2156/1261/1927 2172/1277/1927 +f 2155/1260/1928 2172/1277/1928 2171/1276/1928 +f 2156/1261/1929 2157/1262/1929 2173/1278/1929 +f 2156/1261/1930 2173/1278/1930 2172/1277/1930 +f 2157/1262/1931 2158/1263/1931 2174/1279/1931 +f 2157/1262/1396 2174/1279/1396 2173/1278/1396 +f 2158/1263/1932 2159/1264/1932 2175/1280/1932 +f 2158/1263/1933 2175/1280/1933 2174/1279/1933 +f 2159/1264/1934 2160/1265/1934 2176/1281/1934 +f 2159/1264/1935 2176/1281/1935 2175/1280/1935 +f 2160/1265/1936 2161/1266/1936 2177/1282/1936 +f 2160/1265/1937 2177/1282/1937 2176/1281/1937 +f 2161/1266/1938 2162/1267/1938 2178/1283/1938 +f 2161/1266/1939 2178/1283/1939 2177/1282/1939 +f 2162/1267/1940 2163/1268/1940 2179/1284/1940 +f 2162/1267/1941 2179/1284/1941 2178/1283/1941 +f 2163/1268/1942 2164/1269/1942 2180/1285/1942 +f 2163/1268/1408 2180/1285/1408 2179/1284/1408 +f 2164/1269/1943 2165/1270/1943 2181/1286/1943 +f 2164/1269/1944 2181/1286/1944 2180/1285/1944 +f 2165/1270/1411 2252/1254/1411 2181/1286/1411 +f 2253/1221/1412 2166/1271/1412 2182/1287/1412 +f 2166/1271/1945 2167/1272/1945 2183/1288/1945 +f 2166/1271/1414 2183/1288/1414 2182/1287/1414 +f 2167/1272/1946 2168/1273/1946 2184/1289/1946 +f 2167/1272/1947 2184/1289/1947 2183/1288/1947 +f 2168/1273/1948 2169/1274/1948 2185/1290/1948 +f 2168/1273/1949 2185/1290/1949 2184/1289/1949 +f 2169/1274/1950 2170/1275/1950 2186/1291/1950 +f 2169/1274/1951 2186/1291/1951 2185/1290/1951 +f 2170/1275/1952 2171/1276/1952 2187/1292/1952 +f 2170/1275/1952 2187/1292/1952 2186/1291/1952 +f 2171/1276/1953 2172/1277/1953 2188/1293/1953 +f 2171/1276/1954 2188/1293/1954 2187/1292/1954 +f 2172/1277/1955 2173/1278/1955 2189/1294/1955 +f 2172/1277/1956 2189/1294/1956 2188/1293/1956 +f 2173/1278/1957 2174/1279/1957 2190/1295/1957 +f 2173/1278/1958 2190/1295/1958 2189/1294/1958 +f 2174/1279/1959 2175/1280/1959 2191/1296/1959 +f 2174/1279/1960 2191/1296/1960 2190/1295/1960 +f 2175/1280/1961 2176/1281/1961 2192/1297/1961 +f 2175/1280/1962 2192/1297/1962 2191/1296/1962 +f 2176/1281/1963 2177/1282/1963 2193/1298/1963 +f 2176/1281/1964 2193/1298/1964 2192/1297/1964 +f 2177/1282/1965 2178/1283/1965 2194/1299/1965 +f 2177/1282/1966 2194/1299/1966 2193/1298/1966 +f 2178/1283/1967 2179/1284/1967 2195/1300/1967 +f 2178/1283/1968 2195/1300/1968 2194/1299/1968 +f 2179/1284/1969 2180/1285/1969 2196/1301/1969 +f 2179/1284/1970 2196/1301/1970 2195/1300/1970 +f 2180/1285/1441 2181/1286/1441 2197/1302/1441 +f 2180/1285/1442 2197/1302/1442 2196/1301/1442 +f 2181/1286/1443 2254/1254/1443 2197/1302/1443 +f 1988/1091/1444 2255/1303/1444 2198/1304/1444 +f 2256/1303/1971 2257/1305/1971 2199/1306/1971 +f 2258/1303/1972 2199/1306/1972 2198/1304/1972 +f 2259/1305/1973 2260/1307/1973 2200/1308/1973 +f 2261/1305/1974 2200/1308/1974 2199/1306/1974 +f 2262/1307/1975 2263/1309/1975 2201/1310/1975 +f 2264/1307/1976 2201/1310/1976 2200/1308/1976 +f 2265/1309/1977 2266/1311/1977 2202/1312/1977 +f 2267/1309/1978 2202/1312/1978 2201/1310/1978 +f 2268/1311/1454 2269/1313/1454 2203/1314/1454 +f 2270/1311/1979 2203/1314/1979 2202/1312/1979 +f 2271/1313/1980 2272/1315/1980 2204/1316/1980 +f 2273/1313/1981 2204/1316/1981 2203/1314/1981 +f 2274/1315/1982 2275/1317/1982 2205/1318/1982 +f 2276/1315/1983 2205/1318/1983 2204/1316/1983 +f 2277/1317/1984 2278/1319/1984 2206/1320/1984 +f 2279/1317/1985 2206/1320/1985 2205/1318/1985 +f 2280/1319/1986 2281/1321/1986 2207/1322/1986 +f 2282/1319/1987 2207/1322/1987 2206/1320/1987 +f 2283/1321/1988 2284/1323/1988 2208/1324/1988 +f 2285/1321/1989 2208/1324/1989 2207/1322/1989 +f 2286/1323/1990 2287/1325/1990 2209/1326/1990 +f 2288/1323/1991 2209/1326/1991 2208/1324/1991 +f 2289/1325/1992 2290/1327/1992 2210/1328/1992 +f 2291/1325/1993 2210/1328/1993 2209/1326/1993 +f 2292/1327/1994 2293/1329/1994 2211/1330/1994 +f 2294/1327/1995 2211/1330/1995 2210/1328/1995 +f 2295/1329/1996 2296/1331/1996 2212/1332/1996 +f 2297/1329/1997 2212/1332/1997 2211/1330/1997 +f 2298/1331/1998 2299/1333/1998 2213/1334/1998 +f 2300/1331/1999 2213/1334/1999 2212/1332/1999 +f 2301/1333/1475 2005/1124/1475 2213/1334/1475 +f 1988/1091/2000 2198/1304/2000 2214/1335/2000 +f 2198/1304/2001 2199/1306/2001 2215/1336/2001 +f 2198/1304/2002 2215/1336/2002 2214/1335/2002 +f 2199/1306/2003 2200/1308/2003 2216/1337/2003 +f 2199/1306/2004 2216/1337/2004 2215/1336/2004 +f 2200/1308/2005 2201/1310/2005 2217/1338/2005 +f 2200/1308/2006 2217/1338/2006 2216/1337/2006 +f 2201/1310/2007 2202/1312/2007 2218/1339/2007 +f 2201/1310/2008 2218/1339/2008 2217/1338/2008 +f 2202/1312/2009 2203/1314/2009 2219/1340/2009 +f 2202/1312/2010 2219/1340/2010 2218/1339/2010 +f 2203/1314/2011 2204/1316/2011 2220/1341/2011 +f 2203/1314/2012 2220/1341/2012 2219/1340/2012 +f 2204/1316/2013 2205/1318/2013 2221/1342/2013 +f 2204/1316/2014 2221/1342/2014 2220/1341/2014 +f 2205/1318/2015 2206/1320/2015 2222/1343/2015 +f 2205/1318/2016 2222/1343/2016 2221/1342/2016 +f 2206/1320/2017 2207/1322/2017 2223/1344/2017 +f 2206/1320/2018 2223/1344/2018 2222/1343/2018 +f 2207/1322/2019 2208/1324/2019 2224/1345/2019 +f 2207/1322/2020 2224/1345/2020 2223/1344/2020 +f 2208/1324/2021 2209/1326/2021 2225/1346/2021 +f 2208/1324/2022 2225/1346/2022 2224/1345/2022 +f 2209/1326/2023 2210/1328/2023 2226/1347/2023 +f 2209/1326/1499 2226/1347/1499 2225/1346/1499 +f 2210/1328/2024 2211/1330/2024 2227/1348/2024 +f 2210/1328/2025 2227/1348/2025 2226/1347/2025 +f 2211/1330/2026 2212/1332/2026 2228/1349/2026 +f 2211/1330/2027 2228/1349/2027 2227/1348/2027 +f 2212/1332/2028 2213/1334/2028 2229/1350/2028 +f 2212/1332/2029 2229/1350/2029 2228/1349/2029 +f 2213/1334/2030 2005/1124/2030 2229/1350/2030 +f 1988/1091/2031 2214/1335/2031 2230/1351/2031 +f 2214/1335/2032 2215/1336/2032 2231/1352/2032 +f 2214/1335/2033 2231/1352/2033 2230/1351/2033 +f 2215/1336/1510 2216/1337/1510 2232/1353/1510 +f 2215/1336/2034 2232/1353/2034 2231/1352/2034 +f 2216/1337/2035 2217/1338/2035 2233/1354/2035 +f 2216/1337/2036 2233/1354/2036 2232/1353/2036 +f 2217/1338/2037 2218/1339/2037 2234/1355/2037 +f 2217/1338/2038 2234/1355/2038 2233/1354/2038 +f 2218/1339/1517 2219/1340/1517 2235/1356/1517 +f 2218/1339/1517 2235/1356/1517 2234/1355/1517 +f 2219/1340/2039 2220/1341/2039 2236/1357/2039 +f 2219/1340/2040 2236/1357/2040 2235/1356/2040 +f 2220/1341/2041 2221/1342/2041 2237/1358/2041 +f 2220/1341/2042 2237/1358/2042 2236/1357/2042 +f 2221/1342/2043 2222/1343/2043 2238/1359/2043 +f 2221/1342/2044 2238/1359/2044 2237/1358/2044 +f 2222/1343/2045 2223/1344/2045 2239/1360/2045 +f 2222/1343/2046 2239/1360/2046 2238/1359/2046 +f 2223/1344/2047 2224/1345/2047 2240/1361/2047 +f 2223/1344/2048 2240/1361/2048 2239/1360/2048 +f 2224/1345/2049 2225/1346/2049 2241/1362/2049 +f 2224/1345/2050 2241/1362/2050 2240/1361/2050 +f 2225/1346/1530 2226/1347/1530 2242/1363/1530 +f 2225/1346/2051 2242/1363/2051 2241/1362/2051 +f 2226/1347/2052 2227/1348/2052 2243/1364/2052 +f 2226/1347/2053 2243/1364/2053 2242/1363/2053 +f 2227/1348/2054 2228/1349/2054 2244/1365/2054 +f 2227/1348/2055 2244/1365/2055 2243/1364/2055 +f 2228/1349/1536 2229/1350/1536 2245/1366/1536 +f 2228/1349/2056 2245/1366/2056 2244/1365/2056 +f 2229/1350/2057 2005/1124/2057 2245/1366/2057 +f 1988/1091/1539 2230/1351/1539 1989/1092/1539 +f 2230/1351/1540 2231/1352/1540 1990/1094/1540 +f 2230/1351/1541 1990/1094/1541 1989/1092/1541 +f 2231/1352/2058 2232/1353/2058 1991/1096/2058 +f 2231/1352/2059 1991/1096/2059 1990/1094/2059 +f 2232/1353/2060 2233/1354/2060 1992/1098/2060 +f 2232/1353/2061 1992/1098/2061 1991/1096/2061 +f 2233/1354/2062 2234/1355/2062 1993/1100/2062 +f 2233/1354/2063 1993/1100/2063 1992/1098/2063 +f 2234/1355/1548 2235/1356/1548 1994/1102/1548 +f 2234/1355/1549 1994/1102/1549 1993/1100/1549 +f 2235/1356/2064 2236/1357/2064 1995/1104/2064 +f 2235/1356/2065 1995/1104/2065 1994/1102/2065 +f 2236/1357/2066 2237/1358/2066 1996/1106/2066 +f 2236/1357/2067 1996/1106/2067 1995/1104/2067 +f 2237/1358/2068 2238/1359/2068 1997/1108/2068 +f 2237/1358/1555 1997/1108/1555 1996/1106/1555 +f 2238/1359/2069 2239/1360/2069 1998/1110/2069 +f 2238/1359/2070 1998/1110/2070 1997/1108/2070 +f 2239/1360/2071 2240/1361/2071 1999/1112/2071 +f 2239/1360/2072 1999/1112/2072 1998/1110/2072 +f 2240/1361/2073 2241/1362/2073 2000/1114/2073 +f 2240/1361/2074 2000/1114/2074 1999/1112/2074 +f 2241/1362/2075 2242/1363/2075 2001/1116/2075 +f 2241/1362/2076 2001/1116/2076 2000/1114/2076 +f 2242/1363/2077 2243/1364/2077 2002/1118/2077 +f 2242/1363/1565 2002/1118/1565 2001/1116/1565 +f 2243/1364/1566 2244/1365/1566 2003/1120/1566 +f 2243/1364/1567 2003/1120/1567 2002/1118/1567 +f 2244/1365/2078 2245/1366/2078 2004/1122/2078 +f 2244/1365/1569 2004/1122/1569 2003/1120/1569 +f 2245/1366/2079 2005/1124/2079 2004/1122/2079 +o diesTor2 +v -0.121174 0.081108 -3.220146 +v -0.279660 0.081108 -3.220136 +v -0.279614 0.081108 -3.561658 +v -0.121175 0.081108 -3.561658 +v -0.121175 1.021814 -3.561658 +v -0.279613 1.021814 -3.561658 +v -0.279659 1.021814 -3.220136 +v -0.121174 1.021814 -3.220147 +v -0.121054 1.083170 -3.495022 +v -0.235293 1.083170 -3.495020 +v -0.235322 1.083171 -3.286775 +v -0.121054 1.083170 -3.286783 +vn -1.000000 0.000000 -0.000135 +vn 0.000066 0.000000 1.000000 +vn 0.000068 0.000001 1.000000 +vn 0.000001 0.735652 -0.677360 +vn -0.000011 0.735666 -0.677345 +vn -0.810579 0.585629 -0.000109 +vn -0.810580 0.585628 -0.000110 +vn 0.000046 0.735647 0.677365 +vn 0.000052 0.735652 0.677360 +vn -0.000000 1.000000 -0.000001 +s off +f 2305//105 2304//105 2306//105 +f 2307//105 2306//105 2304//105 +f 2304//2080 2303//2080 2307//2080 +f 2308//2080 2307//2080 2303//2080 +f 2303//2081 2302//2081 2308//2081 +f 2302//2082 2309//2082 2308//2082 +f 2306//2083 2307//2083 2310//2083 +f 2311//2084 2310//2084 2307//2084 +f 2307//2085 2308//2085 2311//2085 +f 2312//2086 2311//2086 2308//2086 +f 2308//2087 2309//2087 2312//2087 +f 2313//2088 2312//2088 2309//2088 +f 2311//2089 2312//2089 2310//2089 +f 2313//938 2310//938 2312//938 +o diesTor3 +v 0.157877 0.466232 -3.388764 +v -0.049119 0.081074 -3.388764 +v -0.038222 0.081074 -3.429434 +v -0.016486 0.222057 -3.388764 +v -0.009961 0.222057 -3.413117 +v -0.019060 0.444358 -3.402505 +v -0.093437 0.466232 -3.388764 +v -0.076089 0.466144 -3.451296 +v -0.085450 0.866339 -3.420294 +v -0.012809 0.904039 -3.382836 +v -0.012548 2.009546 -3.388764 +v -0.053920 0.866339 -3.474904 +v -0.008450 0.081075 -3.459206 +v -0.030500 0.466232 -3.497398 +v 0.000691 0.866339 -3.506434 +v 0.011167 0.081075 -3.467332 +v 0.019613 0.222057 -3.435810 +v 0.018479 0.444358 -3.440044 +v 0.032220 0.466232 -3.514205 +v 0.032220 2.009546 -3.433012 +v 0.032220 0.081108 -3.470077 +v 0.072889 0.081075 -3.459206 +v 0.094939 0.466232 -3.497399 +v 0.044076 0.904039 -3.433012 +v 0.102661 0.081074 -3.429434 +v 0.066660 0.222057 -3.423204 +v 0.140528 0.466144 -3.451296 +v 0.137719 0.866339 -3.449674 +v 0.078196 0.444358 -3.415309 +v 0.084404 0.444358 -3.373738 +v 0.113558 0.081074 -3.388764 +v 0.080926 0.222057 -3.388764 +v 0.154040 0.866339 -3.388764 +v 0.076988 0.904039 -3.388764 +v 0.076468 2.009546 -3.388764 +v 0.102662 0.081074 -3.348095 +v 0.074400 0.222057 -3.364412 +v 0.140528 0.466144 -3.326232 +v 0.137719 0.866339 -3.327854 +v 0.072890 0.081074 -3.318323 +v 0.094940 0.466232 -3.280130 +v 0.093130 0.866339 -3.283265 +v 0.032220 0.081108 -3.307451 +v 0.044826 0.222057 -3.341718 +v 0.045960 0.444358 -3.337485 +v 0.032220 0.466232 -3.263324 +v 0.032220 2.009546 -3.344516 +v -0.008449 0.081074 -3.318322 +v -0.030500 0.466232 -3.280130 +v 0.000691 0.866339 -3.271095 +v 0.009316 0.904039 -3.349093 +v -0.038222 0.081074 -3.348094 +v -0.009960 0.222057 -3.364411 +v -0.076088 0.466144 -3.326232 +v -0.013756 0.444358 -3.362220 +v -0.085450 0.866339 -3.357235 +v 0.017740 2.009546 -3.390671 +v 0.028129 2.009546 -3.404034 +v 0.040124 2.009546 -3.402455 +v 0.047670 2.009546 -3.388764 +v 0.040124 2.009546 -3.375073 +v 0.024315 2.009546 -3.375073 +v -0.012809 0.904039 -3.382836 +v 0.076988 0.904039 -3.388764 +v 0.076988 0.904039 -3.388764 +v 0.076988 0.904039 -3.388764 +v 0.009316 0.904039 -3.349093 +v 0.009316 0.904039 -3.349093 +v 0.009316 0.904039 -3.349093 +v -0.012809 0.904039 -3.382836 +vt 0.750000 0.704656 +vt 0.750000 0.653986 +vt 0.745293 0.635870 +vt 0.743291 0.683061 +vt 0.746362 0.706374 +vt 0.750000 0.847632 +vt 0.722247 0.945192 +vt 0.732883 0.826662 +vt 0.678606 0.919138 +vt 0.756675 0.891814 +vt 0.738394 0.613802 +vt 0.736452 0.563542 +vt 0.720486 0.741064 +vt 0.657434 0.792142 +vt -0.243325 0.891814 +vt 0.250000 0.624485 +vt 0.257298 0.500000 +vt 0.740915 0.542953 +vt 0.701691 0.303215 +vt 0.737060 0.560765 +vt 0.716048 0.500001 +vt 0.736610 0.500001 +vt 0.738394 0.386199 +vt 0.742975 0.310185 +vt 0.720486 0.258937 +vt 0.743346 0.386865 +vt 0.697791 0.063379 +vt 0.743291 0.316940 +vt 0.753979 0.290949 +vt 0.732882 0.173338 +vt 0.750000 0.108679 +vt 0.250000 0.376822 +vt -0.250000 0.108679 +vt 0.750000 0.346014 +vt 0.750000 0.295344 +vt 0.750000 0.152368 +vt 0.750000 0.052186 +vt 0.754707 0.364130 +vt 0.756709 0.316939 +vt 0.767117 0.173338 +vt 0.802209 0.063379 +vt 0.761606 0.386199 +vt 0.763548 0.436459 +vt 0.779514 0.258937 +vt 0.834773 0.116725 +vt 0.242701 0.500001 +vt 0.759085 0.457048 +vt 0.793572 0.801075 +vt -0.206428 0.801075 +vt 0.763390 0.499999 +vt 0.783952 0.499999 +vt 0.761606 0.613801 +vt 0.757025 0.689816 +vt 0.779514 0.741063 +vt 0.842567 0.792141 +vt 0.754707 0.635869 +vt 0.756709 0.683061 +vt 0.777754 0.945192 +vt 0.767118 0.826662 +vt 0.250315 0.542204 +vt 0.252520 0.511989 +vt 0.252260 0.476871 +vt 0.250000 0.455009 +vt 0.247740 0.476871 +vt 0.247740 0.523131 +vn -0.942655 0.218194 -0.252573 +vn -0.942656 0.218196 -0.252566 +vn -0.965572 -0.027171 -0.258713 +vn -0.963604 -0.001830 -0.267328 +vn -0.865879 0.018473 -0.499913 +vn -0.363082 0.907870 -0.209625 +vn -0.690069 0.218197 -0.690069 +vn -0.707099 0.004813 -0.707098 +vn -0.197842 -0.960136 -0.197476 +vn -0.711057 -0.002091 -0.703132 +vn -0.175934 0.936048 -0.304732 +vn -0.702958 -0.003648 -0.711222 +vn -0.590193 0.245119 -0.769148 +vn -0.608664 -0.018212 -0.793219 +vn -0.197527 -0.960191 -0.197527 +vn -0.271499 0.911892 -0.307801 +vn -0.661482 -0.007094 -0.749927 +vn -0.372991 0.223677 -0.900470 +vn -0.079179 -0.952058 -0.295493 +vn -0.258823 -0.001636 -0.965923 +vn -0.126375 0.223652 -0.966441 +vn 0.250238 0.249791 -0.935407 +vn 0.382637 -0.015642 -0.923766 +vn 0.098358 -0.966405 -0.237459 +vn 0.072300 -0.960191 -0.269827 +vn 0.258624 0.039126 -0.965185 +vn 0.250604 0.249908 -0.935277 +vn 0.258759 0.020872 -0.965716 +vn 0.381770 0.069116 -0.921670 +vn 0.691758 0.207215 -0.691761 +vn 0.226820 0.805417 -0.547591 +vn 0.599735 -0.795170 -0.089566 +vn 0.158750 -0.974456 -0.158849 +vn 0.325057 0.914265 -0.241780 +vn 0.707091 0.007583 -0.707082 +vn 0.802379 0.000378 -0.596815 +vn 0.895691 0.245118 -0.371017 +vn 0.942655 0.218191 -0.252575 +vn 0.987983 -0.046030 -0.147548 +vn 0.923816 0.011411 -0.382667 +vn 0.270687 -0.959839 -0.073742 +vn 0.965896 0.007828 -0.258811 +vn 0.963558 0.009240 -0.267338 +vn 0.436479 0.892081 -0.116953 +vn 0.942651 0.218190 0.252593 +vn 0.942656 0.218196 0.252568 +vn 0.965410 -0.032594 0.258691 +vn 0.299724 -0.950512 0.081812 +vn 0.963558 0.009239 0.267339 +vn 0.965896 0.007828 0.258812 +vn 0.436479 0.892081 0.116954 +vn 0.690074 0.218196 0.690064 +vn 0.686071 -0.000354 0.727535 +vn 0.201707 -0.958538 0.201293 +vn 0.707083 0.007828 0.707087 +vn 0.711043 0.008726 0.703094 +vn 0.283858 0.915886 0.283860 +vn 0.707109 0.000333 0.707105 +vn 0.590197 0.245119 0.769145 +vn 0.608668 -0.018212 0.793216 +vn 0.191319 -0.960331 0.202881 +vn 0.179700 0.934743 0.306535 +vn 0.505682 -0.014048 0.862605 +vn 0.252800 0.207153 0.945082 +vn 0.079176 -0.952058 0.295493 +vn 0.258810 0.008738 0.965889 +vn -0.250239 0.249790 0.935407 +vn -0.382633 -0.015639 0.923768 +vn -0.098358 -0.966406 0.237457 +vn -0.072299 -0.960191 0.269825 +vn 0.130472 0.029528 0.991012 +vn -0.366751 0.285524 0.885421 +vn -0.382636 -0.015639 0.923767 +vn -0.258818 -0.001636 0.965925 +vn 0.057880 0.896312 0.439630 +vn -0.690066 0.218197 0.690072 +vn -0.710590 0.037806 0.702590 +vn -0.706565 0.039125 0.706566 +vn -0.211649 -0.954272 0.211116 +vn -0.337278 0.878912 0.337279 +vn -0.503601 0.798348 0.330191 +vn -0.702917 0.011619 0.711177 +vn -0.836270 0.003137 0.548308 +vn -0.942648 0.218198 0.252594 +vn -0.942654 0.218194 0.252578 +vn -0.991280 -0.018213 0.130508 +vn -0.965911 0.004815 0.258828 +vn -0.308684 -0.950296 0.040640 +vn -0.963602 -0.001831 0.267337 +vn -0.356870 -0.934154 0.000001 +vn -0.005092 -0.999987 0.000000 +vn -0.999801 0.019959 0.000000 +vn -0.460648 0.887583 0.000000 +vn 0.711042 0.007840 -0.703106 +vn -0.499902 0.019418 -0.865864 +s off +f 2315/1367/2090 2317/1368/2090 2318/1369/2090 +f 2315/1367/2091 2318/1369/2091 2316/1370/2091 +f 2317/1368/2092 2319/1371/2092 2318/1369/2092 +f 2320/1372/2093 2322/1373/2093 2321/1374/2093 +f 2321/1374/2094 2322/1373/2094 2325/1375/2094 +f 2322/1373/2095 2323/1376/2095 2325/1375/2095 +f 2316/1370/2096 2318/1369/2096 2326/1377/2096 +f 2318/1369/2097 2319/1371/2097 2331/1378/2097 +f 2319/1371/2098 2321/1374/2098 2327/1379/2098 +f 2321/1374/2099 2325/1375/2099 2327/1379/2099 +f 2323/1376/2100 2328/1380/2100 2325/1375/2100 +f 2376/1381/2101 2324/1382/2101 2333/1383/2101 +f 2326/1377/2102 2318/1369/2102 2330/1384/2102 +f 2318/1369/2103 2331/1378/2103 2330/1384/2103 +f 2331/1378/2104 2319/1371/2104 2327/1379/2104 +f 2328/1380/2105 2323/1376/2105 2337/1385/2105 +f 2323/1376/2106 2333/1383/2106 2337/1385/2106 +f 2326/1377/2107 2330/1384/2107 2329/1386/2107 +f 2327/1379/2108 2332/1387/2108 2331/1378/2108 +f 2327/1379/2109 2328/1380/2109 2332/1387/2109 +f 2329/1386/2110 2330/1384/2110 2334/1388/2110 +f 2334/1388/2111 2330/1384/2111 2335/1389/2111 +f 2330/1384/2112 2331/1378/2112 2342/1390/2112 +f 2331/1378/2113 2336/1391/2113 2342/1390/2113 +f 2331/1378/2114 2332/1387/2114 2336/1391/2114 +f 2332/1387/2115 2328/1380/2115 2336/1391/2115 +f 2335/1389/2116 2330/1384/2116 2339/1392/2116 +f 2330/1384/2117 2342/1390/2117 2339/1392/2117 +f 2336/1391/2118 2328/1380/2118 2341/1393/2118 +f 2335/1389/2119 2339/1392/2119 2338/1394/2119 +f 2328/1380/2120 2337/1385/2120 2341/1393/2120 +f 2342/1390/2121 2336/1391/2121 2343/1395/2121 +f 2336/1391/2122 2340/1396/2122 2343/1395/2122 +f 2341/1393/2123 2337/1385/2123 2347/1397/2123 +f 2337/1385/2124 2333/1383/2124 2348/1398/2124 +f 2337/1385/2125 2348/1398/2125 2377/1399/2125 +f 2338/1394/2126 2339/1392/2126 2345/1400/2126 +f 2338/1394/2127 2345/1400/2127 2344/1401/2127 +f 2339/1392/2128 2342/1390/2128 2343/1395/2128 +f 2339/1392/2129 2343/1395/2129 2345/1400/2129 +f 2314/1402/2130 2343/1395/2130 2340/1396/2130 +f 2340/1396/2131 2341/1393/2131 2346/1403/2131 +f 2314/1402/2132 2340/1396/2132 2346/1403/2132 +f 2341/1393/2133 2347/1397/2133 2346/1403/2133 +f 2344/1401/2134 2345/1400/2134 2350/1404/2134 +f 2344/1401/2135 2350/1404/2135 2349/1405/2135 +f 2345/1400/2136 2343/1395/2136 2350/1404/2136 +f 2314/1402/2137 2351/1406/2137 2343/1395/2137 +f 2314/1402/2138 2346/1403/2138 2351/1406/2138 +f 2346/1403/2139 2352/1407/2139 2351/1406/2139 +f 2346/1403/2140 2347/1397/2140 2352/1407/2140 +f 2349/1405/2141 2350/1404/2141 2353/1408/2141 +f 2350/1404/2142 2343/1395/2142 2358/1409/2142 +f 2343/1395/2143 2351/1406/2143 2354/1410/2143 +f 2351/1406/2144 2352/1407/2144 2355/1411/2144 +f 2351/1406/2145 2355/1411/2145 2354/1410/2145 +f 2352/1407/2146 2347/1397/2146 2355/1411/2146 +f 2378/1399/2147 2348/1398/2147 2360/1412/2147 +f 2353/1408/2148 2350/1404/2148 2357/1413/2148 +f 2350/1404/2149 2358/1409/2149 2357/1413/2149 +f 2358/1409/2150 2343/1395/2150 2354/1410/2150 +f 2355/1411/2151 2347/1397/2151 2364/1414/2151 +f 2379/1399/2152 2360/1412/2152 2380/1415/2152 +f 2353/1408/2153 2357/1413/2153 2356/1416/2153 +f 2354/1410/2154 2359/1417/2154 2358/1409/2154 +f 2354/1410/2155 2355/1411/2155 2359/1417/2155 +f 2356/1416/2156 2357/1413/2156 2361/1418/2156 +f 2357/1413/2157 2358/1409/2157 2368/1419/2157 +f 2358/1409/2158 2362/1420/2158 2368/1419/2158 +f 2358/1409/2159 2359/1417/2159 2362/1420/2159 +f 2359/1417/2160 2355/1411/2160 2363/1421/2160 +f 2361/1418/2161 2357/1413/2161 2366/1422/2161 +f 2357/1413/2162 2368/1419/2162 2366/1422/2162 +f 2359/1417/2163 2363/1421/2163 2362/1420/2163 +f 2355/1411/2164 2364/1414/2164 2363/1421/2164 +f 2361/1418/2165 2366/1422/2165 2365/1423/2165 +f 2362/1420/2166 2369/1424/2166 2367/1425/2166 +f 2362/1420/2167 2363/1421/2167 2369/1424/2167 +f 2368/1419/2168 2362/1420/2168 2367/1425/2168 +f 2369/1424/2169 2363/1421/2169 2323/1376/2169 +f 2363/1421/2170 2364/1414/2170 2323/1376/2170 +f 2381/1415/2171 2360/1412/2171 2324/1382/2171 +f 2382/1415/2172 2324/1382/2172 2383/1381/2172 +f 2365/1423/2173 2366/1422/2173 2317/1368/2173 +f 2365/1423/2174 2317/1368/2174 2315/1367/2174 +f 2366/1422/2175 2368/1419/2175 2319/1371/2175 +f 2366/1422/2176 2319/1371/2176 2317/1368/2176 +f 2368/1419/2177 2367/1425/2177 2319/1371/2177 +f 2367/1425/2178 2369/1424/2178 2320/1372/2178 +f 2367/1425/2179 2321/1374/2179 2319/1371/2179 +f 2367/1425/2180 2320/1372/2180 2321/1374/2180 +f 2320/1372/2181 2369/1424/2181 2322/1373/2181 +f 2369/1424/2182 2323/1376/2182 2322/1373/2182 +f 2336/1391/2183 2341/1393/2183 2340/1396/2183 +f 2328/1380/2184 2327/1379/2184 2325/1375/2184 +f 2333/1383/331 2324/1382/331 2370/1426/331 +f 2370/1426/331 2371/1427/331 2333/1383/331 +f 2371/1427/331 2372/1428/331 2333/1383/331 +f 2348/1398/331 2333/1383/331 2373/1429/331 +f 2372/1428/331 2373/1429/331 2333/1383/331 +f 2348/1398/331 2373/1429/331 2360/1412/331 +f 2374/1430/331 2360/1412/331 2373/1429/331 +f 2374/1430/331 2375/1431/331 2360/1412/331 +f 2324/1382/331 2360/1412/331 2370/1426/331 +f 2375/1431/331 2370/1426/331 2360/1412/331 +o diesentr +v -1.749531 0.798069 0.757057 +v -1.216430 0.798069 0.757057 +v -1.749531 0.798069 0.482212 +v -1.216430 0.798069 0.482212 +v -1.749531 0.093855 0.757057 +v -1.216430 0.093855 0.757057 +v -1.749531 0.093855 0.482212 +v -1.216430 0.093855 0.482212 +v -1.216430 0.798069 0.757057 +v -1.216430 0.093855 0.757057 +v -1.216430 0.093855 0.757057 +vt 0.424239 0.775438 +vt 0.575761 0.775438 +vt 0.075761 0.775438 +vt -0.075761 0.775438 +vt -0.075761 0.224562 +vt 0.575761 0.224562 +vt 0.075761 0.224562 +vt 0.424239 0.224562 +vt 0.924239 0.775438 +vt 0.924239 0.224562 +s off +f 2386/1432/331 2384/1433/331 2387/1434/331 +f 2384/1433/331 2385/1435/331 2387/1434/331 +f 2389/1436/3 2388/1437/3 2391/1438/3 +f 2390/1439/3 2391/1438/3 2388/1437/3 +f 2392/1440/21 2384/1433/21 2393/1441/21 +f 2384/1433/21 2388/1437/21 2394/1441/21 +f 2387/1434/63 2385/1435/63 2391/1438/63 +f 2389/1436/63 2391/1438/63 2385/1435/63 +f 2386/1432/105 2387/1434/105 2390/1439/105 +f 2391/1438/105 2390/1439/105 2387/1434/105 +f 2384/1433/7 2386/1432/7 2388/1437/7 +f 2390/1439/7 2388/1437/7 2386/1432/7 +o diestable +v 1.257437 0.108984 1.444684 +v 1.268351 0.108984 1.444684 +v 1.257437 0.108984 1.433770 +v 1.268351 0.108984 1.433770 +v 1.257437 0.210344 1.444684 +v 1.268351 0.210344 1.444684 +v 1.257437 0.210344 1.433770 +v 1.268351 0.210344 1.433770 +v 1.125997 0.218131 1.449539 +v 1.273299 0.218131 1.449539 +v 1.125997 0.218131 1.300170 +v 1.273299 0.218131 1.300170 +v 1.125997 0.209975 1.449539 +v 1.273299 0.209975 1.449539 +v 1.125997 0.209975 1.300170 +v 1.273299 0.209975 1.300170 +v 1.257437 0.108984 1.315815 +v 1.268351 0.108984 1.315815 +v 1.257437 0.108984 1.304900 +v 1.268351 0.108984 1.304900 +v 1.257437 0.210344 1.315815 +v 1.268351 0.210344 1.315815 +v 1.257437 0.210344 1.304900 +v 1.268351 0.210344 1.304900 +v 1.130359 0.108984 1.444684 +v 1.141273 0.108984 1.444684 +v 1.130359 0.108984 1.433770 +v 1.141273 0.108984 1.433770 +v 1.130359 0.210344 1.444684 +v 1.141273 0.210344 1.444684 +v 1.130359 0.210344 1.433770 +v 1.141273 0.210344 1.433770 +v 1.130359 0.108984 1.315815 +v 1.141273 0.108984 1.315815 +v 1.130359 0.108984 1.304900 +v 1.141273 0.108984 1.304900 +v 1.130359 0.210344 1.315815 +v 1.141273 0.210344 1.315815 +v 1.130359 0.210344 1.304900 +v 1.141273 0.210344 1.304900 +v 1.049546 0.372457 1.743024 +v 1.350588 0.372457 1.743024 +v 1.049546 0.372457 1.475445 +v 1.350588 0.372457 1.475445 +v 1.049546 0.355648 1.743024 +v 1.350588 0.355648 1.743024 +v 1.049546 0.355648 1.475445 +v 1.350588 0.355648 1.475445 +v 1.316244 0.355807 1.733738 +v 1.342980 0.355807 1.733738 +v 1.316244 0.355807 1.710513 +v 1.342980 0.355807 1.710513 +v 1.316244 0.108981 1.733738 +v 1.342980 0.108981 1.733738 +v 1.316244 0.108981 1.710513 +v 1.342980 0.108981 1.710513 +v 1.316244 0.355807 1.508034 +v 1.342980 0.355807 1.508034 +v 1.316244 0.355807 1.484808 +v 1.342980 0.355807 1.484808 +v 1.316244 0.108981 1.508034 +v 1.342980 0.108981 1.508034 +v 1.316244 0.108981 1.484808 +v 1.342980 0.108981 1.484808 +v 1.056349 0.355807 1.508034 +v 1.083084 0.355807 1.508034 +v 1.056349 0.355807 1.484808 +v 1.083084 0.355807 1.484808 +v 1.056349 0.108981 1.508034 +v 1.083084 0.108981 1.508034 +v 1.056349 0.108981 1.484808 +v 1.083084 0.108981 1.484808 +v 1.056349 0.355807 1.733738 +v 1.083084 0.355807 1.733738 +v 1.056349 0.355807 1.710513 +v 1.083084 0.355807 1.710513 +v 1.056349 0.108981 1.733738 +v 1.083084 0.108981 1.733738 +v 1.056349 0.108981 1.710513 +v 1.083084 0.108981 1.710513 +vt 0.107686 0.967496 +vt 0.107686 0.894425 +vt 0.033590 0.894425 +vt 0.033590 0.967496 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.107685 0.104738 +vt 0.107685 0.031668 +vt 0.033589 0.031668 +vt 0.033589 0.104738 +vt 0.970391 0.967496 +vt 0.970391 0.894425 +vt 0.896295 0.894425 +vt 0.896295 0.967496 +vt 0.970390 0.104738 +vt 0.970390 0.031668 +vt 0.896294 0.031668 +vt 0.896295 0.104738 +vt 0.025273 0.965299 +vt 0.114081 0.965299 +vt 0.025273 0.878500 +vt 0.114081 0.878500 +vt 0.025273 0.121792 +vt 0.114081 0.121792 +vt 0.025273 0.034992 +vt 0.114081 0.034992 +vt 0.888592 0.121792 +vt 0.977400 0.121792 +vt 0.888592 0.034992 +vt 0.977400 0.034992 +vt 0.888592 0.965299 +vt 0.977400 0.965299 +vt 0.888592 0.878499 +vt 0.977400 0.878499 +s off +f 2395/1442/3 2397/1443/3 2398/1444/3 +f 2395/1442/3 2398/1444/3 2396/1445/3 +f 2399/1442/331 2400/1445/331 2402/1444/331 +f 2402/1444/331 2401/1443/331 2399/1442/331 +f 2395/1442/21 2396/1445/21 2400/1445/21 +f 2395/1442/21 2400/1445/21 2399/1442/21 +f 2396/1445/63 2398/1444/63 2402/1444/63 +f 2402/1444/63 2400/1445/63 2396/1445/63 +f 2398/1444/105 2397/1443/105 2401/1443/105 +f 2401/1443/105 2402/1444/105 2398/1444/105 +f 2397/1443/7 2395/1442/7 2399/1442/7 +f 2399/1442/7 2401/1443/7 2397/1443/7 +f 2405/1446/331 2403/1447/331 2406/1448/331 +f 2404/1449/331 2406/1448/331 2403/1447/331 +f 2408/1449/3 2407/1447/3 2410/1448/3 +f 2409/1446/3 2410/1448/3 2407/1447/3 +f 2404/1449/21 2403/1447/21 2408/1449/21 +f 2407/1447/21 2408/1449/21 2403/1447/21 +f 2406/1448/63 2404/1449/63 2410/1448/63 +f 2408/1449/63 2410/1448/63 2404/1449/63 +f 2405/1446/105 2406/1448/105 2409/1446/105 +f 2410/1448/105 2409/1446/105 2406/1448/105 +f 2403/1447/7 2405/1446/7 2407/1447/7 +f 2409/1446/7 2407/1447/7 2405/1446/7 +f 2411/1450/3 2413/1451/3 2414/1452/3 +f 2414/1452/3 2412/1453/3 2411/1450/3 +f 2415/1450/331 2416/1453/331 2418/1452/331 +f 2418/1452/331 2417/1451/331 2415/1450/331 +f 2411/1450/21 2412/1453/21 2416/1453/21 +f 2416/1453/21 2415/1450/21 2411/1450/21 +f 2412/1453/63 2414/1452/63 2418/1452/63 +f 2418/1452/63 2416/1453/63 2412/1453/63 +f 2414/1452/105 2413/1451/105 2417/1451/105 +f 2417/1451/105 2418/1452/105 2414/1452/105 +f 2413/1451/7 2411/1450/7 2415/1450/7 +f 2415/1450/7 2417/1451/7 2413/1451/7 +f 2419/1454/3 2421/1455/3 2422/1456/3 +f 2422/1456/3 2420/1457/3 2419/1454/3 +f 2423/1454/331 2424/1457/331 2426/1456/331 +f 2426/1456/331 2425/1455/331 2423/1454/331 +f 2419/1454/21 2420/1457/21 2424/1457/21 +f 2424/1457/21 2423/1454/21 2419/1454/21 +f 2420/1457/63 2422/1456/63 2426/1456/63 +f 2426/1456/63 2424/1457/63 2420/1457/63 +f 2422/1456/105 2421/1455/105 2425/1455/105 +f 2425/1455/105 2426/1456/105 2422/1456/105 +f 2421/1455/7 2419/1454/7 2423/1454/7 +f 2423/1454/7 2425/1455/7 2421/1455/7 +f 2427/1458/3 2429/1459/3 2430/1460/3 +f 2430/1460/3 2428/1461/3 2427/1458/3 +f 2431/1458/331 2432/1461/331 2434/1460/331 +f 2434/1460/331 2433/1459/331 2431/1458/331 +f 2427/1458/21 2428/1461/21 2432/1461/21 +f 2432/1461/21 2431/1458/21 2427/1458/21 +f 2428/1461/63 2430/1460/63 2434/1460/63 +f 2434/1460/63 2432/1461/63 2428/1461/63 +f 2430/1460/105 2429/1459/105 2433/1459/105 +f 2433/1459/105 2434/1460/105 2430/1460/105 +f 2429/1459/7 2427/1458/7 2431/1458/7 +f 2431/1458/7 2433/1459/7 2429/1459/7 +f 2437/1446/331 2435/1447/331 2438/1448/331 +f 2436/1449/331 2438/1448/331 2435/1447/331 +f 2440/1449/3 2439/1447/3 2442/1448/3 +f 2441/1446/3 2442/1448/3 2439/1447/3 +f 2436/1449/21 2435/1447/21 2440/1449/21 +f 2439/1447/21 2440/1449/21 2435/1447/21 +f 2438/1448/63 2436/1449/63 2442/1448/63 +f 2440/1449/63 2442/1448/63 2436/1449/63 +f 2437/1446/105 2438/1448/105 2441/1446/105 +f 2442/1448/105 2441/1446/105 2438/1448/105 +f 2435/1447/7 2437/1446/7 2439/1447/7 +f 2441/1446/7 2439/1447/7 2437/1446/7 +f 2444/1462/21 2443/1463/21 2448/1462/21 +f 2447/1463/21 2448/1462/21 2443/1463/21 +f 2446/1464/63 2444/1462/63 2450/1464/63 +f 2448/1462/63 2450/1464/63 2444/1462/63 +f 2445/1465/105 2446/1464/105 2449/1465/105 +f 2450/1464/105 2449/1465/105 2446/1464/105 +f 2443/1463/7 2445/1465/7 2447/1463/7 +f 2449/1465/7 2447/1463/7 2445/1465/7 +f 2452/1466/21 2451/1467/21 2456/1466/21 +f 2455/1467/21 2456/1466/21 2451/1467/21 +f 2454/1468/63 2452/1466/63 2458/1468/63 +f 2456/1466/63 2458/1468/63 2452/1466/63 +f 2453/1469/105 2454/1468/105 2457/1469/105 +f 2458/1468/105 2457/1469/105 2454/1468/105 +f 2451/1467/7 2453/1469/7 2455/1467/7 +f 2457/1469/7 2455/1467/7 2453/1469/7 +f 2460/1470/21 2459/1471/21 2464/1470/21 +f 2463/1471/21 2464/1470/21 2459/1471/21 +f 2462/1472/63 2460/1470/63 2466/1472/63 +f 2464/1470/63 2466/1472/63 2460/1470/63 +f 2461/1473/105 2462/1472/105 2465/1473/105 +f 2466/1472/105 2465/1473/105 2462/1472/105 +f 2459/1471/7 2461/1473/7 2463/1471/7 +f 2465/1473/7 2463/1471/7 2461/1473/7 +f 2468/1474/21 2467/1475/21 2472/1474/21 +f 2471/1475/21 2472/1474/21 2467/1475/21 +f 2470/1476/63 2468/1474/63 2474/1476/63 +f 2472/1474/63 2474/1476/63 2468/1474/63 +f 2469/1477/105 2470/1476/105 2473/1477/105 +f 2474/1476/105 2473/1477/105 2470/1476/105 +f 2467/1475/7 2469/1477/7 2471/1475/7 +f 2473/1477/7 2471/1475/7 2469/1477/7 +o diesveta +v 0.284820 3.117997 3.288503 +v 0.301529 3.117997 3.288503 +v 0.284820 3.117997 3.276784 +v 0.301529 3.117997 3.276784 +v 0.284820 0.094288 3.288503 +v 0.301529 0.094288 3.288503 +v 0.284820 0.094288 3.276784 +v 0.301529 0.094288 3.276784 +v 0.284820 3.117997 3.475511 +v 0.301529 3.117997 3.475511 +v 0.284820 3.117997 3.463792 +v 0.301529 3.117997 3.463792 +v 0.284820 0.094288 3.475511 +v 0.301529 0.094288 3.475511 +v 0.284820 0.094288 3.463792 +v 0.301529 0.094288 3.463792 +v 0.285544 3.117019 3.463942 +v 0.300805 3.117019 3.463942 +v 0.285544 3.124938 3.463942 +v 0.300805 3.124938 3.463942 +v 0.285544 3.117019 3.288942 +v 0.300805 3.117019 3.288942 +v 0.285544 3.124938 3.288942 +v 0.300805 3.124938 3.288942 +v 0.285544 3.004029 3.463942 +v 0.300805 3.004029 3.463942 +v 0.285544 3.011948 3.463942 +v 0.300805 3.011948 3.463942 +v 0.285544 3.004029 3.288942 +v 0.300805 3.004029 3.288942 +v 0.285544 3.011948 3.288942 +v 0.300805 3.011948 3.288942 +v 0.285544 2.879785 3.463942 +v 0.300805 2.879785 3.463942 +v 0.285544 2.887704 3.463942 +v 0.300805 2.887704 3.463942 +v 0.285544 2.879785 3.288942 +v 0.300805 2.879785 3.288942 +v 0.285544 2.887704 3.288942 +v 0.300805 2.887704 3.288942 +v 0.285544 2.755542 3.463942 +v 0.300805 2.755542 3.463942 +v 0.285544 2.763461 3.463942 +v 0.300805 2.763461 3.463942 +v 0.285544 2.755542 3.288942 +v 0.300805 2.755542 3.288942 +v 0.285544 2.763461 3.288942 +v 0.300805 2.763461 3.288942 +v 0.285544 2.631298 3.463942 +v 0.300805 2.631298 3.463942 +v 0.285544 2.639217 3.463942 +v 0.300805 2.639217 3.463942 +v 0.285544 2.631298 3.288942 +v 0.300805 2.631298 3.288942 +v 0.285544 2.639217 3.288942 +v 0.300805 2.639217 3.288942 +v 0.285544 2.507055 3.463942 +v 0.300805 2.507055 3.463942 +v 0.285544 2.514973 3.463942 +v 0.300805 2.514973 3.463942 +v 0.285544 2.507055 3.288942 +v 0.300805 2.507055 3.288942 +v 0.285544 2.514973 3.288942 +v 0.300805 2.514973 3.288942 +v 0.285544 2.382811 3.463942 +v 0.300805 2.382811 3.463942 +v 0.285544 2.390730 3.463942 +v 0.300805 2.390730 3.463942 +v 0.285544 2.382811 3.288942 +v 0.300805 2.382811 3.288942 +v 0.285544 2.390730 3.288942 +v 0.300805 2.390730 3.288942 +v 0.285544 2.258567 3.463942 +v 0.300805 2.258567 3.463942 +v 0.285544 2.266486 3.463942 +v 0.300805 2.266486 3.463942 +v 0.285544 2.258567 3.288942 +v 0.300805 2.258567 3.288942 +v 0.285544 2.266486 3.288942 +v 0.300805 2.266486 3.288942 +v 0.285544 2.134324 3.463942 +v 0.300805 2.134324 3.463942 +v 0.285544 2.142243 3.463942 +v 0.300805 2.142243 3.463942 +v 0.285544 2.134324 3.288942 +v 0.300805 2.134324 3.288942 +v 0.285544 2.142243 3.288942 +v 0.300805 2.142243 3.288942 +v 0.285544 2.010080 3.463942 +v 0.300805 2.010080 3.463942 +v 0.285544 2.017999 3.463942 +v 0.300805 2.017999 3.463942 +v 0.285544 2.010080 3.288942 +v 0.300805 2.010080 3.288942 +v 0.285544 2.017999 3.288942 +v 0.300805 2.017999 3.288942 +v 0.285544 1.885837 3.463942 +v 0.300805 1.885837 3.463942 +v 0.285544 1.893756 3.463942 +v 0.300805 1.893756 3.463942 +v 0.285544 1.885837 3.288942 +v 0.300805 1.885837 3.288942 +v 0.285544 1.893756 3.288942 +v 0.300805 1.893756 3.288942 +v 0.285544 1.761593 3.463942 +v 0.300805 1.761593 3.463942 +v 0.285544 1.769512 3.463942 +v 0.300805 1.769512 3.463942 +v 0.285544 1.761593 3.288942 +v 0.300805 1.761593 3.288942 +v 0.285544 1.769512 3.288942 +v 0.300805 1.769512 3.288942 +v 0.285544 1.637350 3.463942 +v 0.300805 1.637350 3.463942 +v 0.285544 1.645269 3.463942 +v 0.300805 1.645269 3.463942 +v 0.285544 1.637350 3.288942 +v 0.300805 1.637350 3.288942 +v 0.285544 1.645269 3.288942 +v 0.300805 1.645269 3.288942 +v 0.285544 1.513106 3.463942 +v 0.300805 1.513106 3.463942 +v 0.285544 1.521025 3.463942 +v 0.300805 1.521025 3.463942 +v 0.285544 1.513106 3.288942 +v 0.300805 1.513106 3.288942 +v 0.285544 1.521025 3.288942 +v 0.300805 1.521025 3.288942 +v 0.285544 1.388863 3.463942 +v 0.300805 1.388863 3.463942 +v 0.285544 1.396782 3.463942 +v 0.300805 1.396782 3.463942 +v 0.285544 1.388863 3.288942 +v 0.300805 1.388863 3.288942 +v 0.285544 1.396782 3.288942 +v 0.300805 1.396782 3.288942 +v 0.285544 1.264619 3.463942 +v 0.300805 1.264619 3.463942 +v 0.285544 1.272538 3.463942 +v 0.300805 1.272538 3.463942 +v 0.285544 1.264619 3.288942 +v 0.300805 1.264619 3.288942 +v 0.285544 1.272538 3.288942 +v 0.300805 1.272538 3.288942 +v 0.285544 1.140376 3.463942 +v 0.300805 1.140376 3.463942 +v 0.285544 1.148295 3.463942 +v 0.300805 1.148295 3.463942 +v 0.285544 1.140376 3.288942 +v 0.300805 1.140376 3.288942 +v 0.285544 1.148295 3.288942 +v 0.300805 1.148295 3.288942 +v 0.285544 1.016132 3.463942 +v 0.300805 1.016132 3.463942 +v 0.285544 1.024051 3.463942 +v 0.300805 1.024051 3.463942 +v 0.285544 1.016132 3.288942 +v 0.300805 1.016132 3.288942 +v 0.285544 1.024051 3.288942 +v 0.300805 1.024051 3.288942 +v 0.285544 0.891889 3.463942 +v 0.300805 0.891889 3.463942 +v 0.285544 0.899808 3.463942 +v 0.300805 0.899808 3.463942 +v 0.285544 0.891889 3.288942 +v 0.300805 0.891889 3.288942 +v 0.285544 0.899808 3.288942 +v 0.300805 0.899808 3.288942 +v 0.285544 0.767645 3.463942 +v 0.300805 0.767645 3.463942 +v 0.285544 0.775564 3.463942 +v 0.300805 0.775564 3.463942 +v 0.285544 0.767645 3.288942 +v 0.300805 0.767645 3.288942 +v 0.285544 0.775564 3.288942 +v 0.300805 0.775564 3.288942 +v 0.285544 0.643402 3.463942 +v 0.300805 0.643402 3.463942 +v 0.285544 0.651320 3.463942 +v 0.300805 0.651320 3.463942 +v 0.285544 0.643402 3.288942 +v 0.300805 0.643402 3.288942 +v 0.285544 0.651320 3.288942 +v 0.300805 0.651320 3.288942 +v 0.285544 0.519158 3.463942 +v 0.300805 0.519158 3.463942 +v 0.285544 0.527077 3.463942 +v 0.300805 0.527077 3.463942 +v 0.285544 0.519158 3.288942 +v 0.300805 0.519158 3.288942 +v 0.285544 0.527077 3.288942 +v 0.300805 0.527077 3.288942 +v 0.285544 0.394915 3.463942 +v 0.300805 0.394915 3.463942 +v 0.285544 0.402834 3.463942 +v 0.300805 0.402834 3.463942 +v 0.285544 0.394915 3.288942 +v 0.300805 0.394915 3.288942 +v 0.285544 0.402834 3.288942 +v 0.300805 0.402834 3.288942 +v 0.285544 0.270671 3.463942 +v 0.300805 0.270671 3.463942 +v 0.285544 0.278590 3.463942 +v 0.300805 0.278590 3.463942 +v 0.285544 0.270671 3.288942 +v 0.300805 0.270671 3.288942 +v 0.285544 0.278590 3.288942 +v 0.300805 0.278590 3.288942 +v 0.285544 0.146428 3.463942 +v 0.300805 0.146428 3.463942 +v 0.285544 0.154347 3.463942 +v 0.300805 0.154347 3.463942 +v 0.285544 0.146428 3.288942 +v 0.300805 0.146428 3.288942 +v 0.285544 0.154347 3.288942 +v 0.300805 0.154347 3.288942 +v 0.301410 2.643810 3.489135 +v 0.376276 2.643811 3.524195 +v 0.376281 2.643811 3.519145 +v 0.301464 2.643810 3.496503 +v 0.444948 2.643811 3.509104 +v 0.442711 2.643811 3.504622 +v 0.504548 2.643811 3.388581 +v 0.499693 2.643811 3.388503 +v 0.424202 2.643811 3.230654 +v 0.422936 2.643811 3.235530 +v 0.368515 2.643811 3.226357 +v 0.368852 2.643811 3.231395 +v 0.301451 2.643811 3.253116 +v 0.301497 2.643811 3.262935 +v 0.301410 2.637257 3.489135 +v 0.376281 2.637258 3.519145 +v 0.301464 2.637257 3.496503 +v 0.376276 2.637258 3.524195 +v 0.442711 2.637258 3.504622 +v 0.444948 2.637258 3.509104 +v 0.499693 2.637257 3.388503 +v 0.504548 2.637257 3.388581 +v 0.422936 2.637257 3.235530 +v 0.424202 2.637257 3.230654 +v 0.368852 2.637257 3.231395 +v 0.368515 2.637257 3.226357 +v 0.301497 2.637257 3.262935 +v 0.301451 2.637257 3.253116 +v 0.301410 2.162579 3.489135 +v 0.376276 2.162579 3.524195 +v 0.376281 2.162579 3.519145 +v 0.301464 2.162579 3.496503 +v 0.444948 2.162579 3.509104 +v 0.442711 2.162579 3.504622 +v 0.504548 2.162579 3.388581 +v 0.499693 2.162579 3.388503 +v 0.424202 2.162579 3.230654 +v 0.422936 2.162579 3.235530 +v 0.368515 2.162579 3.226357 +v 0.368852 2.162579 3.231395 +v 0.301451 2.162579 3.253116 +v 0.301497 2.162579 3.262935 +v 0.301410 2.156025 3.489135 +v 0.376281 2.156026 3.519145 +v 0.301464 2.156025 3.496503 +v 0.376276 2.156026 3.524195 +v 0.442711 2.156026 3.504622 +v 0.444948 2.156026 3.509104 +v 0.499693 2.156025 3.388503 +v 0.504548 2.156025 3.388581 +v 0.422936 2.156026 3.235530 +v 0.424202 2.156026 3.230654 +v 0.368852 2.156026 3.231395 +v 0.368515 2.156026 3.226357 +v 0.301497 2.156026 3.262935 +v 0.301451 2.156026 3.253116 +v 0.301410 1.681347 3.489135 +v 0.376276 1.681347 3.524195 +v 0.376281 1.681347 3.519145 +v 0.301464 1.681347 3.496503 +v 0.444948 1.681347 3.509104 +v 0.442711 1.681347 3.504622 +v 0.504548 1.681347 3.388581 +v 0.499693 1.681347 3.388503 +v 0.424202 1.681348 3.230654 +v 0.422936 1.681348 3.235530 +v 0.368515 1.681348 3.226357 +v 0.368852 1.681348 3.231395 +v 0.301451 1.681348 3.253116 +v 0.301497 1.681348 3.262935 +v 0.301410 1.674794 3.489135 +v 0.376281 1.674794 3.519145 +v 0.301464 1.674794 3.496503 +v 0.376276 1.674794 3.524195 +v 0.442711 1.674794 3.504622 +v 0.444948 1.674794 3.509104 +v 0.499693 1.674794 3.388503 +v 0.504548 1.674794 3.388581 +v 0.422936 1.674794 3.235530 +v 0.424202 1.674794 3.230654 +v 0.368852 1.674794 3.231395 +v 0.368515 1.674794 3.226357 +v 0.301497 1.674794 3.262935 +v 0.301451 1.674794 3.253116 +v 0.301410 1.200115 3.489135 +v 0.376276 1.200115 3.524195 +v 0.376281 1.200115 3.519145 +v 0.301464 1.200115 3.496503 +v 0.444948 1.200115 3.509104 +v 0.442711 1.200115 3.504622 +v 0.504548 1.200115 3.388581 +v 0.499693 1.200115 3.388503 +v 0.424202 1.200116 3.230654 +v 0.422936 1.200116 3.235530 +v 0.368515 1.200116 3.226357 +v 0.368852 1.200116 3.231395 +v 0.301451 1.200116 3.253116 +v 0.301497 1.200116 3.262935 +v 0.301410 1.193562 3.489135 +v 0.376281 1.193562 3.519145 +v 0.301464 1.193562 3.496503 +v 0.376276 1.193562 3.524195 +v 0.442711 1.193562 3.504622 +v 0.444948 1.193562 3.509104 +v 0.499693 1.193562 3.388503 +v 0.504548 1.193562 3.388581 +v 0.422936 1.193562 3.235530 +v 0.424202 1.193562 3.230654 +v 0.368852 1.193562 3.231395 +v 0.368515 1.193562 3.226357 +v 0.301497 1.193562 3.262935 +v 0.301451 1.193562 3.253116 +v 0.301410 3.125042 3.489135 +v 0.376276 3.125042 3.524195 +v 0.376281 3.125042 3.519145 +v 0.301464 3.125042 3.496503 +v 0.444948 3.125042 3.509104 +v 0.442711 3.125042 3.504622 +v 0.504548 3.125042 3.388581 +v 0.499693 3.125042 3.388503 +v 0.424202 3.125043 3.230654 +v 0.422936 3.125043 3.235530 +v 0.368515 3.125043 3.226357 +v 0.368852 3.125043 3.231395 +v 0.301451 3.125042 3.253116 +v 0.301497 3.125042 3.262935 +v 0.301410 3.118489 3.489135 +v 0.376281 3.118489 3.519145 +v 0.301464 3.118489 3.496503 +v 0.376276 3.118489 3.524195 +v 0.442711 3.118489 3.504622 +v 0.444948 3.118489 3.509104 +v 0.499693 3.118489 3.388503 +v 0.504548 3.118489 3.388581 +v 0.422936 3.118489 3.235530 +v 0.424202 3.118489 3.230654 +v 0.368852 3.118489 3.231395 +v 0.368515 3.118489 3.226357 +v 0.301497 3.118489 3.262935 +v 0.301451 3.118489 3.253116 +v 0.301495 3.125048 3.514077 +v 0.301468 3.387222 3.513988 +v 0.301468 3.387222 3.523932 +v 0.301468 3.118244 3.523932 +v 0.301495 3.125048 3.236090 +v 0.301467 3.118245 3.226146 +v 0.301468 3.387223 3.226146 +v 0.301468 3.387223 3.236090 +v 0.284795 3.125048 3.514077 +v 0.284795 3.387223 3.513988 +v 0.284795 3.387222 3.523932 +v 0.284795 3.118244 3.523932 +v 0.284795 3.118245 3.226146 +v 0.284795 3.387223 3.226146 +v 0.284795 3.387223 3.236090 +v 0.284795 3.125048 3.236090 +v 0.499693 2.643811 3.388503 +v 0.499693 2.643811 3.388503 +v 0.504548 2.643811 3.388581 +v 0.499693 2.643811 3.388503 +v 0.499693 2.637257 3.388503 +v 0.499693 2.643811 3.388503 +v 0.504548 2.643811 3.388581 +v 0.504548 2.637257 3.388581 +v 0.504548 2.637257 3.388581 +v 0.504548 2.637257 3.388581 +v 0.499693 2.637257 3.388503 +v 0.504548 2.637257 3.388581 +v 0.499693 2.162579 3.388503 +v 0.499693 2.162579 3.388503 +v 0.504548 2.162579 3.388581 +v 0.499693 2.162579 3.388503 +v 0.499693 2.156025 3.388503 +v 0.499693 2.162579 3.388503 +v 0.504548 2.162579 3.388581 +v 0.504548 2.156025 3.388581 +v 0.504548 2.156025 3.388581 +v 0.504548 2.156025 3.388581 +v 0.499693 2.156025 3.388503 +v 0.504548 2.156025 3.388581 +v 0.499693 1.681347 3.388503 +v 0.499693 1.681347 3.388503 +v 0.504548 1.681347 3.388581 +v 0.499693 1.681347 3.388503 +v 0.499693 1.674794 3.388503 +v 0.499693 1.681347 3.388503 +v 0.504548 1.681347 3.388581 +v 0.504548 1.674794 3.388581 +v 0.504548 1.674794 3.388581 +v 0.504548 1.674794 3.388581 +v 0.499693 1.674794 3.388503 +v 0.504548 1.674794 3.388581 +v 0.499693 1.200115 3.388503 +v 0.499693 1.200115 3.388503 +v 0.504548 1.200115 3.388581 +v 0.499693 1.200115 3.388503 +v 0.499693 1.193562 3.388503 +v 0.499693 1.200115 3.388503 +v 0.504548 1.200115 3.388581 +v 0.504548 1.193562 3.388581 +v 0.504548 1.193562 3.388581 +v 0.504548 1.193562 3.388581 +v 0.499693 1.193562 3.388503 +v 0.504548 1.193562 3.388581 +v 0.499693 3.125042 3.388503 +v 0.499693 3.125042 3.388503 +v 0.504548 3.125042 3.388581 +v 0.499693 3.125042 3.388503 +v 0.499693 3.118489 3.388503 +v 0.499693 3.125042 3.388503 +v 0.504548 3.125042 3.388581 +v 0.504548 3.118489 3.388581 +v 0.504548 3.118489 3.388581 +v 0.504548 3.118489 3.388581 +v 0.499693 3.118489 3.388503 +v 0.504548 3.118489 3.388581 +vt 0.383754 0.966046 +vt 0.393690 0.967771 +vt 0.370644 0.968788 +vt 0.380729 0.970678 +vt 0.380729 0.024548 +vt 0.393690 0.026986 +vt 0.370644 0.026134 +vt 0.383754 0.028434 +vt 0.608040 0.967492 +vt 0.617803 0.965747 +vt 0.621042 0.970371 +vt 0.630918 0.968461 +vt 0.630918 0.026408 +vt 0.617803 0.028686 +vt 0.621042 0.024805 +vt 0.608040 0.027220 +vt 0.381746 0.970604 +vt 0.393571 0.967941 +vt 0.381746 0.970771 +vt 0.393571 0.968123 +vt 0.620561 0.970206 +vt 0.608687 0.967577 +vt 0.620561 0.970376 +vt 0.608687 0.967761 +vt 0.620561 0.967559 +vt 0.608687 0.964699 +vt 0.381746 0.967992 +vt 0.393571 0.965095 +vt 0.620561 0.967760 +vt 0.381746 0.968190 +vt 0.608687 0.964917 +vt 0.393571 0.965311 +vt 0.620561 0.964049 +vt 0.608687 0.960886 +vt 0.381746 0.964528 +vt 0.393571 0.961324 +vt 0.620561 0.964295 +vt 0.381746 0.964771 +vt 0.608687 0.961153 +vt 0.393571 0.961588 +vt 0.620561 0.959692 +vt 0.608687 0.956154 +vt 0.381746 0.960227 +vt 0.393571 0.956644 +vt 0.620561 0.960001 +vt 0.381746 0.960532 +vt 0.608687 0.956489 +vt 0.393571 0.956975 +vt 0.620561 0.954141 +vt 0.608687 0.950130 +vt 0.381746 0.954749 +vt 0.393571 0.950685 +vt 0.620561 0.954540 +vt 0.381746 0.955142 +vt 0.608687 0.950563 +vt 0.393571 0.951113 +vt 0.620561 0.946834 +vt 0.608687 0.942209 +vt 0.381746 0.947535 +vt 0.393571 0.942849 +vt 0.620561 0.947368 +vt 0.381746 0.948062 +vt 0.608687 0.942788 +vt 0.393571 0.943421 +vt 0.620561 0.936793 +vt 0.608687 0.931343 +vt 0.381746 0.937620 +vt 0.393571 0.932096 +vt 0.620561 0.937544 +vt 0.381746 0.938361 +vt 0.608687 0.932154 +vt 0.393571 0.932899 +vt 0.620561 0.922170 +vt 0.608687 0.915562 +vt 0.381746 0.923174 +vt 0.393571 0.916474 +vt 0.620561 0.923297 +vt 0.381746 0.924288 +vt 0.608687 0.916777 +vt 0.393571 0.917676 +vt 0.620561 0.899037 +vt 0.608687 0.890730 +vt 0.381746 0.900305 +vt 0.393571 0.891873 +vt 0.620561 0.900901 +vt 0.381746 0.902149 +vt 0.608687 0.892724 +vt 0.393571 0.893849 +vt 0.620561 0.857627 +vt 0.608687 0.846783 +vt 0.381746 0.859298 +vt 0.393571 0.848264 +vt 0.620561 0.861192 +vt 0.381746 0.862831 +vt 0.608687 0.850537 +vt 0.393571 0.851993 +vt 0.620561 0.768416 +vt 0.608687 0.754909 +vt 0.381746 0.770550 +vt 0.393571 0.756718 +vt 0.620561 0.776788 +vt 0.381746 0.778906 +vt 0.608687 0.763352 +vt 0.393571 0.765155 +vt 0.620561 0.550902 +vt 0.608687 0.546810 +vt 0.381746 0.551582 +vt 0.393571 0.547338 +vt 0.620561 0.569714 +vt 0.381746 0.570632 +vt 0.608687 0.564184 +vt 0.393571 0.564899 +vt 0.620561 0.285149 +vt 0.608687 0.298230 +vt 0.381746 0.283047 +vt 0.393571 0.296500 +vt 0.620561 0.297402 +vt 0.381746 0.295341 +vt 0.608687 0.310179 +vt 0.393571 0.308493 +vt 0.620561 0.164310 +vt 0.608687 0.176187 +vt 0.381746 0.162470 +vt 0.393571 0.174573 +vt 0.620561 0.169191 +vt 0.381746 0.167318 +vt 0.608687 0.181266 +vt 0.393571 0.179626 +vt 0.620561 0.112002 +vt 0.608687 0.121054 +vt 0.381746 0.110618 +vt 0.393571 0.119812 +vt 0.620561 0.114367 +vt 0.381746 0.112958 +vt 0.608687 0.123572 +vt 0.393571 0.122309 +vt 0.620561 0.084340 +vt 0.608687 0.091443 +vt 0.381746 0.083259 +vt 0.393571 0.090464 +vt 0.620561 0.085699 +vt 0.381746 0.084602 +vt 0.608687 0.092904 +vt 0.393571 0.091911 +vt 0.620561 0.067468 +vt 0.608687 0.073261 +vt 0.381746 0.066589 +vt 0.393571 0.072461 +vt 0.620561 0.068343 +vt 0.381746 0.067453 +vt 0.608687 0.074206 +vt 0.393571 0.073396 +vt 0.620561 0.056162 +vt 0.608687 0.061036 +vt 0.381746 0.055424 +vt 0.393571 0.060362 +vt 0.620561 0.056770 +vt 0.381746 0.056024 +vt 0.608687 0.061693 +vt 0.393571 0.061013 +vt 0.620561 0.048077 +vt 0.608687 0.052275 +vt 0.381746 0.047441 +vt 0.393571 0.051694 +vt 0.620561 0.048523 +vt 0.381746 0.047881 +vt 0.608687 0.052759 +vt 0.393571 0.052173 +vt 0.620561 0.042015 +vt 0.608687 0.045699 +vt 0.381746 0.041457 +vt 0.393571 0.045189 +vt 0.620561 0.042355 +vt 0.381746 0.041793 +vt 0.608687 0.046069 +vt 0.393571 0.045555 +vt 0.620561 0.037304 +vt 0.608687 0.040584 +vt 0.381746 0.036808 +vt 0.393571 0.040130 +vt 0.620561 0.037573 +vt 0.381746 0.037073 +vt 0.608687 0.040876 +vt 0.393571 0.040419 +vt 0.620561 0.033540 +vt 0.608687 0.036494 +vt 0.381746 0.033093 +vt 0.393571 0.036085 +vt 0.620561 0.033757 +vt 0.381746 0.033307 +vt 0.608687 0.036730 +vt 0.393571 0.036319 +vt 0.620561 0.030463 +vt 0.608687 0.033151 +vt 0.381746 0.030057 +vt 0.393571 0.032779 +vt 0.620561 0.030642 +vt 0.381746 0.030234 +vt 0.608687 0.033346 +vt 0.393571 0.032971 +vt 0.620561 0.027902 +vt 0.608687 0.030367 +vt 0.381746 0.027530 +vt 0.393571 0.030026 +vt 0.620561 0.028053 +vt 0.381746 0.027678 +vt 0.608687 0.030531 +vt 0.393571 0.030187 +vt 0.620561 0.025738 +vt 0.608687 0.028013 +vt 0.381746 0.025394 +vt 0.393571 0.027698 +vt 0.620561 0.025866 +vt 0.381746 0.025520 +vt 0.608687 0.028152 +vt 0.393571 0.027836 +vt 0.640847 0.948546 +vt 0.730453 0.947553 +vt 0.729780 0.949273 +vt 0.645746 0.946577 +vt 0.807153 0.949990 +vt 0.806555 0.951704 +vt 0.980671 0.961177 +vt 0.979902 0.962854 +vt -0.020098 0.962854 +vt 0.217920 0.948463 +vt 0.218214 0.950192 +vt -0.019329 0.961177 +vt 0.277692 0.947231 +vt 0.278281 0.948953 +vt 0.353809 0.946378 +vt 0.360274 0.949023 +vt 0.729780 0.948909 +vt 0.640847 0.948177 +vt 0.645746 0.946194 +vt 0.730453 0.947177 +vt 0.806556 0.951357 +vt 0.807153 0.949630 +vt 0.979902 0.962585 +vt 0.980671 0.960896 +vt 0.218214 0.949834 +vt -0.020098 0.962585 +vt -0.019329 0.960896 +vt 0.217920 0.948093 +vt 0.278281 0.948587 +vt 0.277692 0.946852 +vt 0.360274 0.948657 +vt 0.353809 0.945994 +vt 0.640847 0.893087 +vt 0.730453 0.891144 +vt 0.729780 0.894513 +vt 0.645746 0.889242 +vt 0.807153 0.895921 +vt 0.806555 0.899305 +vt 0.980671 0.918313 +vt 0.979902 0.921731 +vt -0.020098 0.921731 +vt 0.217920 0.892924 +vt 0.218214 0.896319 +vt -0.019329 0.918313 +vt 0.277692 0.890515 +vt 0.278281 0.893885 +vt 0.353809 0.888855 +vt 0.360274 0.894022 +vt 0.729780 0.892970 +vt 0.640847 0.891527 +vt 0.645746 0.887635 +vt 0.730453 0.889560 +vt 0.806556 0.897822 +vt 0.807153 0.894396 +vt 0.979902 0.920546 +vt 0.980671 0.917081 +vt 0.218214 0.894799 +vt -0.020098 0.920546 +vt -0.019329 0.917081 +vt 0.217920 0.891362 +vt 0.278281 0.892334 +vt 0.277692 0.888923 +vt 0.360274 0.892474 +vt 0.353809 0.887244 +vt 0.640847 0.377943 +vt 0.730453 0.380078 +vt 0.729780 0.376336 +vt 0.645746 0.382108 +vt 0.807153 0.374713 +vt 0.806555 0.370667 +vt 0.980671 0.343209 +vt 0.979902 0.337222 +vt -0.020098 0.337222 +vt 0.217920 0.378125 +vt 0.218214 0.374249 +vt -0.019329 0.343209 +vt 0.277692 0.380756 +vt 0.278281 0.377049 +vt 0.353809 0.382515 +vt 0.360274 0.376893 +vt 0.729780 0.364224 +vt 0.640847 0.365951 +vt 0.645746 0.370434 +vt 0.730453 0.368249 +vt 0.806556 0.358143 +vt 0.807153 0.362482 +vt 0.979902 0.322633 +vt 0.980671 0.328940 +vt 0.218214 0.361983 +vt -0.020098 0.322633 +vt -0.019329 0.328940 +vt 0.217920 0.366147 +vt 0.278281 0.364990 +vt 0.277692 0.368978 +vt 0.360274 0.364823 +vt 0.353809 0.370873 +vt 0.640847 0.084648 +vt 0.730453 0.086233 +vt 0.729780 0.083487 +vt 0.645746 0.087786 +vt 0.807153 0.082341 +vt 0.806555 0.079594 +vt 0.980671 0.064283 +vt 0.979902 0.061550 +vt -0.020098 0.061550 +vt 0.217920 0.084781 +vt 0.218214 0.082018 +vt -0.019329 0.064283 +vt 0.277692 0.086746 +vt 0.278281 0.083999 +vt 0.353809 0.088102 +vt 0.360274 0.083886 +vt 0.729780 0.082532 +vt 0.640847 0.083681 +vt 0.645746 0.086786 +vt 0.730453 0.085249 +vt 0.806556 0.078679 +vt 0.807153 0.081398 +vt 0.979902 0.060831 +vt 0.980671 0.063534 +vt 0.218214 0.081078 +vt -0.020098 0.060831 +vt -0.019329 0.063534 +vt 0.217920 0.083812 +vt 0.278281 0.083038 +vt 0.277692 0.085757 +vt 0.360274 0.082927 +vt 0.353809 0.087099 +vt 0.640847 0.966265 +vt 0.730453 0.965607 +vt 0.729780 0.966746 +vt 0.645746 0.964960 +vt 0.807153 0.967221 +vt 0.806555 0.968354 +vt 0.980671 0.974601 +vt 0.979902 0.975704 +vt -0.020098 0.975704 +vt 0.217920 0.966210 +vt 0.218214 0.967354 +vt -0.019329 0.974601 +vt 0.277692 0.965393 +vt 0.278281 0.966534 +vt 0.353809 0.964829 +vt 0.360274 0.966581 +vt 0.729780 0.966589 +vt 0.640847 0.966106 +vt 0.645746 0.964795 +vt 0.730453 0.965445 +vt 0.806556 0.968205 +vt 0.807153 0.967066 +vt 0.979902 0.975589 +vt 0.980671 0.974481 +vt 0.218214 0.967200 +vt -0.020098 0.975589 +vt -0.019329 0.974481 +vt 0.217920 0.966051 +vt 0.278281 0.966376 +vt 0.277692 0.965230 +vt 0.360274 0.966423 +vt 0.353809 0.964663 +vt 0.655963 0.961724 +vt 0.655895 0.967785 +vt 0.660921 0.966189 +vt 0.660921 0.959652 +vt 0.343945 0.961692 +vt 0.338953 0.959601 +vt 0.338953 0.966147 +vt 0.343966 0.967743 +vt 0.643488 0.959495 +vt 0.643438 0.965904 +vt 0.648750 0.964395 +vt 0.648750 0.957518 +vt 0.351116 0.957470 +vt 0.351116 0.964354 +vt 0.356415 0.965865 +vt 0.356415 0.959464 +vn 0.000000 -1.000000 0.000001 +vn -0.000006 1.000000 -0.000000 +vn 0.000002 1.000000 -0.000001 +vn 0.372048 0.000000 -0.928213 +vn -0.347132 0.000000 0.937816 +vn -0.213577 0.000000 -0.976926 +vn 0.214625 -0.000000 0.976697 +vn 0.214623 0.000016 0.976697 +vn -0.897735 0.000000 -0.440535 +vn 0.896386 0.000065 0.443275 +vn 0.896387 0.000000 0.443272 +vn -0.893795 0.000000 0.448475 +vn 0.891283 0.000000 -0.453447 +vn -0.076242 0.000000 0.997089 +vn 0.076943 0.000000 -0.997036 +vn 0.076944 0.000006 -0.997036 +vn 0.424078 -0.000000 0.905626 +vn -0.370605 -0.000027 -0.928790 +vn -0.370603 -0.000000 -0.928791 +vn 0.000000 -1.000000 -0.000002 +vn -0.000004 -1.000000 0.000002 +vn -0.000000 -1.000000 0.000004 +vn 0.000006 -1.000000 0.000000 +vn -0.000013 1.000000 0.000024 +vn 0.000003 1.000000 0.000024 +vn -0.000003 -1.000000 0.000001 +vn -0.000000 -1.000000 0.000003 +vn 0.076943 0.000000 -0.997035 +vn 0.076944 0.000006 -0.997035 +vn -0.000003 1.000000 -0.000000 +vn 0.000004 1.000000 0.000001 +vn -0.000000 1.000000 0.000003 +vn -0.000004 1.000000 0.000000 +vn 0.891284 0.000000 -0.453447 +vn -0.000002 -1.000000 0.000001 +vn -0.000000 -1.000000 0.000002 +vn 0.000003 -1.000000 0.000000 +vn 1.000000 0.000104 0.000000 +vn 0.999996 -0.000000 0.002776 +vn 0.999996 -0.000002 -0.002798 +vn -0.000000 -0.000339 -1.000000 +vn 0.000000 1.000000 0.000024 +vn 0.000014 1.000000 -0.000000 +vn 0.000000 -0.000001 1.000000 +s off +f 2477/1478/331 2475/1479/331 2478/1480/331 +f 2475/1479/331 2476/1481/331 2478/1480/331 +f 2480/1482/3 2479/1483/3 2482/1484/3 +f 2481/1485/3 2482/1484/3 2479/1483/3 +f 2476/1481/21 2475/1479/21 2480/1482/21 +f 2475/1479/21 2479/1483/21 2480/1482/21 +f 2478/1480/63 2476/1481/63 2482/1484/63 +f 2480/1482/63 2482/1484/63 2476/1481/63 +f 2477/1478/105 2478/1480/105 2481/1485/105 +f 2482/1484/105 2481/1485/105 2478/1480/105 +f 2475/1479/7 2477/1478/7 2479/1483/7 +f 2481/1485/7 2479/1483/7 2477/1478/7 +f 2485/1486/331 2483/1487/331 2486/1488/331 +f 2484/1489/331 2486/1488/331 2483/1487/331 +f 2488/1490/3 2487/1491/3 2490/1492/3 +f 2489/1493/3 2490/1492/3 2487/1491/3 +f 2484/1489/21 2483/1487/21 2488/1490/21 +f 2487/1491/21 2488/1490/21 2483/1487/21 +f 2486/1488/63 2484/1489/63 2490/1492/63 +f 2488/1490/63 2490/1492/63 2484/1489/63 +f 2485/1486/105 2486/1488/105 2489/1493/105 +f 2490/1492/105 2489/1493/105 2486/1488/105 +f 2483/1487/7 2485/1486/7 2487/1491/7 +f 2489/1493/7 2487/1491/7 2485/1486/7 +f 2496/1494/105 2495/1495/105 2498/1496/105 +f 2497/1497/105 2498/1496/105 2495/1495/105 +f 2492/1498/3 2491/1499/3 2496/1494/3 +f 2495/1495/3 2496/1494/3 2491/1499/3 +f 2494/1500/63 2492/1498/63 2498/1496/63 +f 2496/1494/63 2498/1496/63 2492/1498/63 +f 2493/1501/331 2494/1500/331 2497/1497/331 +f 2498/1496/331 2497/1497/331 2494/1500/331 +f 2491/1499/7 2493/1501/7 2495/1495/7 +f 2497/1497/7 2495/1495/7 2493/1501/7 +f 2500/1502/3 2499/1503/3 2504/1504/3 +f 2503/1505/3 2504/1504/3 2499/1503/3 +f 2502/1506/63 2500/1502/63 2506/1507/63 +f 2504/1504/63 2506/1507/63 2500/1502/63 +f 2501/1508/331 2502/1506/331 2505/1509/331 +f 2506/1507/331 2505/1509/331 2502/1506/331 +f 2499/1503/7 2501/1508/7 2503/1505/7 +f 2505/1509/7 2503/1505/7 2501/1508/7 +f 2508/1510/3 2507/1511/3 2512/1512/3 +f 2511/1513/3 2512/1512/3 2507/1511/3 +f 2510/1514/63 2508/1510/63 2514/1515/63 +f 2512/1512/63 2514/1515/63 2508/1510/63 +f 2509/1516/331 2510/1514/331 2513/1517/331 +f 2514/1515/331 2513/1517/331 2510/1514/331 +f 2507/1511/7 2509/1516/7 2511/1513/7 +f 2513/1517/7 2511/1513/7 2509/1516/7 +f 2516/1518/3 2515/1519/3 2520/1520/3 +f 2519/1521/3 2520/1520/3 2515/1519/3 +f 2518/1522/63 2516/1518/63 2522/1523/63 +f 2520/1520/63 2522/1523/63 2516/1518/63 +f 2517/1524/331 2518/1522/331 2521/1525/331 +f 2522/1523/331 2521/1525/331 2518/1522/331 +f 2515/1519/7 2517/1524/7 2519/1521/7 +f 2521/1525/7 2519/1521/7 2517/1524/7 +f 2524/1526/3 2523/1527/3 2528/1528/3 +f 2527/1529/3 2528/1528/3 2523/1527/3 +f 2526/1530/63 2524/1526/63 2530/1531/63 +f 2528/1528/63 2530/1531/63 2524/1526/63 +f 2525/1532/331 2526/1530/331 2529/1533/331 +f 2530/1531/331 2529/1533/331 2526/1530/331 +f 2523/1527/7 2525/1532/7 2527/1529/7 +f 2529/1533/7 2527/1529/7 2525/1532/7 +f 2532/1534/3 2531/1535/3 2536/1536/3 +f 2535/1537/3 2536/1536/3 2531/1535/3 +f 2534/1538/63 2532/1534/63 2538/1539/63 +f 2536/1536/63 2538/1539/63 2532/1534/63 +f 2533/1540/331 2534/1538/331 2537/1541/331 +f 2538/1539/331 2537/1541/331 2534/1538/331 +f 2531/1535/7 2533/1540/7 2535/1537/7 +f 2537/1541/7 2535/1537/7 2533/1540/7 +f 2540/1542/3 2539/1543/3 2544/1544/3 +f 2543/1545/3 2544/1544/3 2539/1543/3 +f 2542/1546/63 2540/1542/63 2546/1547/63 +f 2544/1544/63 2546/1547/63 2540/1542/63 +f 2541/1548/331 2542/1546/331 2545/1549/331 +f 2546/1547/331 2545/1549/331 2542/1546/331 +f 2539/1543/7 2541/1548/7 2543/1545/7 +f 2545/1549/7 2543/1545/7 2541/1548/7 +f 2548/1550/3 2547/1551/3 2552/1552/3 +f 2551/1553/3 2552/1552/3 2547/1551/3 +f 2550/1554/63 2548/1550/63 2554/1555/63 +f 2552/1552/63 2554/1555/63 2548/1550/63 +f 2549/1556/331 2550/1554/331 2553/1557/331 +f 2554/1555/331 2553/1557/331 2550/1554/331 +f 2547/1551/7 2549/1556/7 2551/1553/7 +f 2553/1557/7 2551/1553/7 2549/1556/7 +f 2556/1558/3 2555/1559/3 2560/1560/3 +f 2559/1561/3 2560/1560/3 2555/1559/3 +f 2558/1562/63 2556/1558/63 2562/1563/63 +f 2560/1560/63 2562/1563/63 2556/1558/63 +f 2557/1564/331 2558/1562/331 2561/1565/331 +f 2562/1563/331 2561/1565/331 2558/1562/331 +f 2555/1559/7 2557/1564/7 2559/1561/7 +f 2561/1565/7 2559/1561/7 2557/1564/7 +f 2564/1566/3 2563/1567/3 2568/1568/3 +f 2567/1569/3 2568/1568/3 2563/1567/3 +f 2566/1570/63 2564/1566/63 2570/1571/63 +f 2568/1568/63 2570/1571/63 2564/1566/63 +f 2565/1572/331 2566/1570/331 2569/1573/331 +f 2570/1571/331 2569/1573/331 2566/1570/331 +f 2563/1567/7 2565/1572/7 2567/1569/7 +f 2569/1573/7 2567/1569/7 2565/1572/7 +f 2572/1574/2185 2571/1575/2185 2576/1576/2185 +f 2575/1577/2185 2576/1576/2185 2571/1575/2185 +f 2574/1578/63 2572/1574/63 2578/1579/63 +f 2576/1576/63 2578/1579/63 2572/1574/63 +f 2573/1580/331 2574/1578/331 2577/1581/331 +f 2578/1579/331 2577/1581/331 2574/1578/331 +f 2571/1575/7 2573/1580/7 2575/1577/7 +f 2577/1581/7 2575/1577/7 2573/1580/7 +f 2580/1582/2185 2579/1583/2185 2584/1584/2185 +f 2583/1585/2185 2584/1584/2185 2579/1583/2185 +f 2582/1586/63 2580/1582/63 2586/1587/63 +f 2584/1584/63 2586/1587/63 2580/1582/63 +f 2581/1588/331 2582/1586/331 2585/1589/331 +f 2586/1587/331 2585/1589/331 2582/1586/331 +f 2579/1583/7 2581/1588/7 2583/1585/7 +f 2585/1589/7 2583/1585/7 2581/1588/7 +f 2588/1590/2185 2587/1591/2185 2592/1592/2185 +f 2591/1593/2185 2592/1592/2185 2587/1591/2185 +f 2590/1594/63 2588/1590/63 2594/1595/63 +f 2592/1592/63 2594/1595/63 2588/1590/63 +f 2589/1596/331 2590/1594/331 2593/1597/331 +f 2594/1595/331 2593/1597/331 2590/1594/331 +f 2587/1591/7 2589/1596/7 2591/1593/7 +f 2593/1597/7 2591/1593/7 2589/1596/7 +f 2596/1598/2185 2595/1599/2185 2600/1600/2185 +f 2599/1601/2185 2600/1600/2185 2595/1599/2185 +f 2598/1602/63 2596/1598/63 2602/1603/63 +f 2600/1600/63 2602/1603/63 2596/1598/63 +f 2597/1604/331 2598/1602/331 2601/1605/331 +f 2602/1603/331 2601/1605/331 2598/1602/331 +f 2595/1599/7 2597/1604/7 2599/1601/7 +f 2601/1605/7 2599/1601/7 2597/1604/7 +f 2604/1606/2185 2603/1607/2185 2608/1608/2185 +f 2607/1609/2185 2608/1608/2185 2603/1607/2185 +f 2606/1610/63 2604/1606/63 2610/1611/63 +f 2608/1608/63 2610/1611/63 2604/1606/63 +f 2605/1612/331 2606/1610/331 2609/1613/331 +f 2610/1611/331 2609/1613/331 2606/1610/331 +f 2603/1607/7 2605/1612/7 2607/1609/7 +f 2609/1613/7 2607/1609/7 2605/1612/7 +f 2612/1614/2185 2611/1615/2185 2616/1616/2185 +f 2615/1617/2185 2616/1616/2185 2611/1615/2185 +f 2614/1618/63 2612/1614/63 2618/1619/63 +f 2616/1616/63 2618/1619/63 2612/1614/63 +f 2613/1620/331 2614/1618/331 2617/1621/331 +f 2618/1619/331 2617/1621/331 2614/1618/331 +f 2611/1615/7 2613/1620/7 2615/1617/7 +f 2617/1621/7 2615/1617/7 2613/1620/7 +f 2620/1622/2185 2619/1623/2185 2624/1624/2185 +f 2623/1625/2185 2624/1624/2185 2619/1623/2185 +f 2622/1626/63 2620/1622/63 2626/1627/63 +f 2624/1624/63 2626/1627/63 2620/1622/63 +f 2621/1628/331 2622/1626/331 2625/1629/331 +f 2626/1627/331 2625/1629/331 2622/1626/331 +f 2619/1623/7 2621/1628/7 2623/1625/7 +f 2625/1629/7 2623/1625/7 2621/1628/7 +f 2628/1630/3 2627/1631/3 2632/1632/3 +f 2631/1633/3 2632/1632/3 2627/1631/3 +f 2630/1634/63 2628/1630/63 2634/1635/63 +f 2632/1632/63 2634/1635/63 2628/1630/63 +f 2629/1636/331 2630/1634/331 2633/1637/331 +f 2634/1635/331 2633/1637/331 2630/1634/331 +f 2627/1631/7 2629/1636/7 2631/1633/7 +f 2633/1637/7 2631/1633/7 2629/1636/7 +f 2636/1638/3 2635/1639/3 2640/1640/3 +f 2639/1641/3 2640/1640/3 2635/1639/3 +f 2638/1642/63 2636/1638/63 2642/1643/63 +f 2640/1640/63 2642/1643/63 2636/1638/63 +f 2637/1644/331 2638/1642/331 2641/1645/331 +f 2642/1643/331 2641/1645/331 2638/1642/331 +f 2635/1639/7 2637/1644/7 2639/1641/7 +f 2641/1645/7 2639/1641/7 2637/1644/7 +f 2644/1646/3 2643/1647/3 2648/1648/3 +f 2647/1649/3 2648/1648/3 2643/1647/3 +f 2646/1650/63 2644/1646/63 2650/1651/63 +f 2648/1648/63 2650/1651/63 2644/1646/63 +f 2645/1652/331 2646/1650/331 2649/1653/331 +f 2650/1651/331 2649/1653/331 2646/1650/331 +f 2643/1647/7 2645/1652/7 2647/1649/7 +f 2649/1653/7 2647/1649/7 2645/1652/7 +f 2652/1654/3 2651/1655/3 2656/1656/3 +f 2655/1657/3 2656/1656/3 2651/1655/3 +f 2654/1658/63 2652/1654/63 2658/1659/63 +f 2656/1656/63 2658/1659/63 2652/1654/63 +f 2653/1660/331 2654/1658/331 2657/1661/331 +f 2658/1659/331 2657/1661/331 2654/1658/331 +f 2651/1655/7 2653/1660/7 2655/1657/7 +f 2657/1661/7 2655/1657/7 2653/1660/7 +f 2660/1662/3 2659/1663/3 2664/1664/3 +f 2663/1665/3 2664/1664/3 2659/1663/3 +f 2662/1666/63 2660/1662/63 2666/1667/63 +f 2664/1664/63 2666/1667/63 2660/1662/63 +f 2661/1668/331 2662/1666/331 2665/1669/331 +f 2666/1667/331 2665/1669/331 2662/1666/331 +f 2659/1663/7 2661/1668/7 2663/1665/7 +f 2665/1669/7 2663/1665/7 2661/1668/7 +f 2668/1670/3 2667/1671/3 2672/1672/3 +f 2671/1673/3 2672/1672/3 2667/1671/3 +f 2670/1674/63 2668/1670/63 2674/1675/63 +f 2672/1672/63 2674/1675/63 2668/1670/63 +f 2669/1676/331 2670/1674/331 2673/1677/331 +f 2674/1675/331 2673/1677/331 2670/1674/331 +f 2667/1671/7 2669/1676/7 2671/1673/7 +f 2673/1677/7 2671/1673/7 2669/1676/7 +f 2676/1678/3 2675/1679/3 2680/1680/3 +f 2679/1681/3 2680/1680/3 2675/1679/3 +f 2678/1682/63 2676/1678/63 2682/1683/63 +f 2680/1680/63 2682/1683/63 2676/1678/63 +f 2677/1684/331 2678/1682/331 2681/1685/331 +f 2682/1683/331 2681/1685/331 2678/1682/331 +f 2675/1679/7 2677/1684/7 2679/1681/7 +f 2681/1685/7 2679/1681/7 2677/1684/7 +f 2684/1686/3 2683/1687/3 2688/1688/3 +f 2687/1689/3 2688/1688/3 2683/1687/3 +f 2686/1690/63 2684/1686/63 2690/1691/63 +f 2688/1688/63 2690/1691/63 2684/1686/63 +f 2685/1692/331 2686/1690/331 2689/1693/331 +f 2690/1691/331 2689/1693/331 2686/1690/331 +f 2683/1687/7 2685/1692/7 2687/1689/7 +f 2689/1693/7 2687/1689/7 2685/1692/7 +f 2691/1694/2186 2692/1695/2186 2693/1696/2186 +f 2691/1694/2186 2694/1697/2186 2692/1695/2186 +f 2693/1696/331 2695/1698/331 2696/1699/331 +f 2693/1696/331 2692/1695/331 2695/1698/331 +f 2696/1699/1571 2697/1700/1571 2698/1701/1571 +f 2696/1699/2187 2695/1698/2187 2697/1700/2187 +f 2847/1702/942 2699/1703/942 2700/1704/942 +f 2848/1702/933 2849/1705/933 2699/1703/933 +f 2700/1704/331 2701/1706/331 2702/1707/331 +f 2700/1704/331 2699/1703/331 2701/1706/331 +f 2702/1707/331 2703/1708/331 2704/1709/331 +f 2702/1707/331 2701/1706/331 2703/1708/331 +f 2691/1694/2188 2693/1696/2188 2706/1710/2188 +f 2706/1710/2188 2705/1711/2188 2691/1694/2188 +f 2692/1695/2189 2694/1697/2189 2707/1712/2189 +f 2707/1712/2189 2708/1713/2189 2692/1695/2189 +f 2693/1696/2190 2696/1699/2190 2709/1714/2190 +f 2709/1714/2190 2706/1710/2190 2693/1696/2190 +f 2695/1698/2191 2692/1695/2191 2708/1713/2191 +f 2708/1713/2192 2710/1715/2192 2695/1698/2192 +f 2696/1699/2193 2698/1701/2193 2711/1716/2193 +f 2711/1716/2193 2709/1714/2193 2696/1699/2193 +f 2697/1700/2194 2695/1698/2194 2710/1715/2194 +f 2710/1715/2195 2712/1717/2195 2697/1700/2195 +f 2850/1702/2196 2700/1704/2196 2713/1718/2196 +f 2713/1718/2196 2851/1719/2196 2852/1702/2196 +f 2699/1703/2197 2853/1705/2197 2854/1720/2197 +f 2855/1720/2197 2714/1721/2197 2699/1703/2197 +f 2700/1704/2198 2702/1707/2198 2715/1722/2198 +f 2715/1722/2198 2713/1718/2198 2700/1704/2198 +f 2701/1706/2199 2699/1703/2199 2714/1721/2199 +f 2714/1721/2200 2716/1723/2200 2701/1706/2200 +f 2702/1707/2201 2704/1709/2201 2717/1724/2201 +f 2717/1724/2201 2715/1722/2201 2702/1707/2201 +f 2703/1708/2202 2701/1706/2202 2716/1723/2202 +f 2716/1723/2203 2718/1725/2203 2703/1708/2203 +f 2718/1725/3 2716/1723/3 2715/1722/3 +f 2715/1722/3 2717/1724/3 2718/1725/3 +f 2716/1723/3 2714/1721/3 2713/1718/3 +f 2715/1722/3 2716/1723/3 2713/1718/3 +f 2713/1718/2204 2856/1720/2204 2857/1719/2204 +f 2858/1720/251 2713/1718/251 2714/1721/251 +f 2712/1717/2205 2710/1715/2205 2709/1714/2205 +f 2709/1714/2206 2711/1716/2206 2712/1717/2206 +f 2710/1715/3 2708/1713/3 2706/1710/3 +f 2709/1714/3 2710/1715/3 2706/1710/3 +f 2705/1711/2207 2706/1710/2207 2708/1713/2207 +f 2708/1713/2207 2707/1712/2207 2705/1711/2207 +f 2719/1726/2186 2720/1727/2186 2721/1728/2186 +f 2719/1726/2186 2722/1729/2186 2720/1727/2186 +f 2721/1728/331 2723/1730/331 2724/1731/331 +f 2721/1728/331 2720/1727/331 2723/1730/331 +f 2724/1731/1571 2725/1732/1571 2726/1733/1571 +f 2724/1731/2187 2723/1730/2187 2725/1732/2187 +f 2859/1734/942 2727/1735/942 2728/1736/942 +f 2860/1734/933 2861/1737/933 2727/1735/933 +f 2728/1736/331 2729/1738/331 2730/1739/331 +f 2728/1736/331 2727/1735/331 2729/1738/331 +f 2730/1739/331 2731/1740/331 2732/1741/331 +f 2730/1739/331 2729/1738/331 2731/1740/331 +f 2719/1726/2188 2721/1728/2188 2734/1742/2188 +f 2734/1742/2188 2733/1743/2188 2719/1726/2188 +f 2720/1727/2189 2722/1729/2189 2735/1744/2189 +f 2735/1744/2189 2736/1745/2189 2720/1727/2189 +f 2721/1728/2190 2724/1731/2190 2737/1746/2190 +f 2737/1746/2190 2734/1742/2190 2721/1728/2190 +f 2723/1730/2191 2720/1727/2191 2736/1745/2191 +f 2736/1745/2192 2738/1747/2192 2723/1730/2192 +f 2724/1731/2193 2726/1733/2193 2739/1748/2193 +f 2739/1748/2193 2737/1746/2193 2724/1731/2193 +f 2725/1732/2194 2723/1730/2194 2738/1747/2194 +f 2738/1747/2195 2740/1749/2195 2725/1732/2195 +f 2862/1734/2196 2728/1736/2196 2741/1750/2196 +f 2741/1750/2196 2863/1751/2196 2864/1734/2196 +f 2727/1735/2197 2865/1737/2197 2866/1752/2197 +f 2867/1752/2197 2742/1753/2197 2727/1735/2197 +f 2728/1736/2198 2730/1739/2198 2743/1754/2198 +f 2743/1754/2198 2741/1750/2198 2728/1736/2198 +f 2729/1738/2199 2727/1735/2199 2742/1753/2199 +f 2742/1753/2200 2744/1755/2200 2729/1738/2200 +f 2730/1739/2201 2732/1741/2201 2745/1756/2201 +f 2745/1756/2201 2743/1754/2201 2730/1739/2201 +f 2731/1740/2202 2729/1738/2202 2744/1755/2202 +f 2744/1755/2203 2746/1757/2203 2731/1740/2203 +f 2746/1757/3 2744/1755/3 2743/1754/3 +f 2743/1754/3 2745/1756/3 2746/1757/3 +f 2744/1755/3 2742/1753/3 2741/1750/3 +f 2743/1754/3 2744/1755/3 2741/1750/3 +f 2741/1750/2204 2868/1752/2204 2869/1751/2204 +f 2870/1752/251 2741/1750/251 2742/1753/251 +f 2740/1749/2205 2738/1747/2205 2737/1746/2205 +f 2737/1746/2206 2739/1748/2206 2740/1749/2206 +f 2738/1747/3 2736/1745/3 2734/1742/3 +f 2737/1746/3 2738/1747/3 2734/1742/3 +f 2733/1743/2207 2734/1742/2207 2736/1745/2207 +f 2736/1745/2207 2735/1744/2207 2733/1743/2207 +f 2747/1758/2208 2748/1759/2208 2749/1760/2208 +f 2747/1758/936 2750/1761/936 2748/1759/936 +f 2749/1760/331 2751/1762/331 2752/1763/331 +f 2749/1760/2209 2748/1759/2209 2751/1762/2209 +f 2752/1763/2089 2753/1764/2089 2754/1765/2089 +f 2752/1763/938 2751/1762/938 2753/1764/938 +f 2871/1766/942 2755/1767/942 2756/1768/942 +f 2872/1766/933 2873/1769/933 2755/1767/933 +f 2756/1768/331 2757/1770/331 2758/1771/331 +f 2756/1768/331 2755/1767/331 2757/1770/331 +f 2758/1771/331 2759/1772/331 2760/1773/331 +f 2758/1771/331 2757/1770/331 2759/1772/331 +f 2747/1758/2188 2749/1760/2188 2762/1774/2188 +f 2762/1774/2188 2761/1775/2188 2747/1758/2188 +f 2748/1759/2189 2750/1761/2189 2763/1776/2189 +f 2763/1776/2189 2764/1777/2189 2748/1759/2189 +f 2749/1760/2190 2752/1763/2190 2765/1778/2190 +f 2765/1778/2190 2762/1774/2190 2749/1760/2190 +f 2751/1762/2191 2748/1759/2191 2764/1777/2191 +f 2764/1777/2192 2766/1779/2192 2751/1762/2192 +f 2752/1763/2193 2754/1765/2193 2767/1780/2193 +f 2767/1780/2193 2765/1778/2193 2752/1763/2193 +f 2753/1764/2194 2751/1762/2194 2766/1779/2194 +f 2766/1779/2195 2768/1781/2195 2753/1764/2195 +f 2874/1766/2196 2756/1768/2196 2769/1782/2196 +f 2769/1782/2196 2875/1783/2196 2876/1766/2196 +f 2755/1767/2197 2877/1769/2197 2878/1784/2197 +f 2879/1784/2197 2770/1785/2197 2755/1767/2197 +f 2756/1768/2198 2758/1771/2198 2771/1786/2198 +f 2771/1786/2198 2769/1782/2198 2756/1768/2198 +f 2757/1770/2199 2755/1767/2199 2770/1785/2199 +f 2770/1785/2200 2772/1787/2200 2757/1770/2200 +f 2758/1771/2201 2760/1773/2201 2773/1788/2201 +f 2773/1788/2201 2771/1786/2201 2758/1771/2201 +f 2759/1772/2202 2757/1770/2202 2772/1787/2202 +f 2772/1787/2203 2774/1789/2203 2759/1772/2203 +f 2774/1789/3 2772/1787/3 2771/1786/3 +f 2771/1786/3 2773/1788/3 2774/1789/3 +f 2772/1787/3 2770/1785/3 2769/1782/3 +f 2771/1786/3 2772/1787/3 2769/1782/3 +f 2769/1782/2204 2880/1784/2204 2881/1783/2204 +f 2882/1784/251 2769/1782/251 2770/1785/251 +f 2768/1781/2210 2766/1779/2210 2765/1778/2210 +f 2765/1778/2211 2767/1780/2211 2768/1781/2211 +f 2766/1779/3 2764/1777/3 2762/1774/3 +f 2765/1778/3 2766/1779/3 2762/1774/3 +f 2761/1775/2207 2762/1774/2207 2764/1777/2207 +f 2764/1777/2207 2763/1776/2207 2761/1775/2207 +f 2775/1790/2208 2776/1791/2208 2777/1792/2208 +f 2775/1790/936 2778/1793/936 2776/1791/936 +f 2777/1792/331 2779/1794/331 2780/1795/331 +f 2777/1792/2209 2776/1791/2209 2779/1794/2209 +f 2780/1795/2089 2781/1796/2089 2782/1797/2089 +f 2780/1795/938 2779/1794/938 2781/1796/938 +f 2883/1798/942 2783/1799/942 2784/1800/942 +f 2884/1798/933 2885/1801/933 2783/1799/933 +f 2784/1800/331 2785/1802/331 2786/1803/331 +f 2784/1800/331 2783/1799/331 2785/1802/331 +f 2786/1803/331 2787/1804/331 2788/1805/331 +f 2786/1803/331 2785/1802/331 2787/1804/331 +f 2775/1790/2188 2777/1792/2188 2790/1806/2188 +f 2790/1806/2188 2789/1807/2188 2775/1790/2188 +f 2776/1791/2189 2778/1793/2189 2791/1808/2189 +f 2791/1808/2189 2792/1809/2189 2776/1791/2189 +f 2777/1792/2190 2780/1795/2190 2793/1810/2190 +f 2793/1810/2190 2790/1806/2190 2777/1792/2190 +f 2779/1794/2191 2776/1791/2191 2792/1809/2191 +f 2792/1809/2192 2794/1811/2192 2779/1794/2192 +f 2780/1795/2193 2782/1797/2193 2795/1812/2193 +f 2795/1812/2193 2793/1810/2193 2780/1795/2193 +f 2781/1796/2194 2779/1794/2194 2794/1811/2194 +f 2794/1811/2195 2796/1813/2195 2781/1796/2195 +f 2886/1798/2196 2784/1800/2196 2797/1814/2196 +f 2797/1814/2196 2887/1815/2196 2888/1798/2196 +f 2783/1799/2197 2889/1801/2197 2890/1816/2197 +f 2891/1816/2197 2798/1817/2197 2783/1799/2197 +f 2784/1800/2198 2786/1803/2198 2799/1818/2198 +f 2799/1818/2198 2797/1814/2198 2784/1800/2198 +f 2785/1802/2212 2783/1799/2212 2798/1817/2212 +f 2798/1817/2213 2800/1819/2213 2785/1802/2213 +f 2786/1803/2201 2788/1805/2201 2801/1820/2201 +f 2801/1820/2201 2799/1818/2201 2786/1803/2201 +f 2787/1804/2202 2785/1802/2202 2800/1819/2202 +f 2800/1819/2203 2802/1821/2203 2787/1804/2203 +f 2802/1821/3 2800/1819/3 2799/1818/3 +f 2799/1818/3 2801/1820/3 2802/1821/3 +f 2800/1819/3 2798/1817/3 2797/1814/3 +f 2799/1818/3 2800/1819/3 2797/1814/3 +f 2797/1814/2204 2892/1816/2204 2893/1815/2204 +f 2894/1816/251 2797/1814/251 2798/1817/251 +f 2796/1813/2210 2794/1811/2210 2793/1810/2210 +f 2793/1810/2211 2795/1812/2211 2796/1813/2211 +f 2794/1811/3 2792/1809/3 2790/1806/3 +f 2793/1810/3 2794/1811/3 2790/1806/3 +f 2789/1807/2207 2790/1806/2207 2792/1809/2207 +f 2792/1809/2207 2791/1808/2207 2789/1807/2207 +f 2803/1822/2214 2804/1823/2214 2805/1824/2214 +f 2803/1822/2214 2806/1825/2214 2804/1823/2214 +f 2805/1824/331 2807/1826/331 2808/1827/331 +f 2805/1824/331 2804/1823/331 2807/1826/331 +f 2808/1827/1571 2809/1828/1571 2810/1829/1571 +f 2808/1827/2187 2807/1826/2187 2809/1828/2187 +f 2895/1830/2215 2811/1831/2215 2812/1832/2215 +f 2896/1830/2216 2897/1833/2216 2811/1831/2216 +f 2812/1832/331 2813/1834/331 2814/1835/331 +f 2812/1832/331 2811/1831/331 2813/1834/331 +f 2814/1835/2217 2815/1836/2217 2816/1837/2217 +f 2814/1835/2214 2813/1834/2214 2815/1836/2214 +f 2803/1822/2188 2805/1824/2188 2818/1838/2188 +f 2818/1838/2188 2817/1839/2188 2803/1822/2188 +f 2804/1823/2189 2806/1825/2189 2819/1840/2189 +f 2819/1840/2189 2820/1841/2189 2804/1823/2189 +f 2805/1824/2190 2808/1827/2190 2821/1842/2190 +f 2821/1842/2190 2818/1838/2190 2805/1824/2190 +f 2807/1826/2191 2804/1823/2191 2820/1841/2191 +f 2820/1841/2192 2822/1843/2192 2807/1826/2192 +f 2808/1827/2193 2810/1829/2193 2823/1844/2193 +f 2823/1844/2193 2821/1842/2193 2808/1827/2193 +f 2809/1828/2194 2807/1826/2194 2822/1843/2194 +f 2822/1843/2195 2824/1845/2195 2809/1828/2195 +f 2898/1830/2196 2812/1832/2196 2825/1846/2196 +f 2825/1846/2196 2899/1847/2196 2900/1830/2196 +f 2811/1831/2197 2901/1833/2197 2902/1848/2197 +f 2903/1848/2218 2826/1849/2218 2811/1831/2218 +f 2812/1832/2198 2814/1835/2198 2827/1850/2198 +f 2827/1850/2198 2825/1846/2198 2812/1832/2198 +f 2813/1834/2199 2811/1831/2199 2826/1849/2199 +f 2826/1849/2213 2828/1851/2213 2813/1834/2213 +f 2814/1835/2201 2816/1837/2201 2829/1852/2201 +f 2829/1852/2201 2827/1850/2201 2814/1835/2201 +f 2815/1836/2202 2813/1834/2202 2828/1851/2202 +f 2828/1851/2203 2830/1853/2203 2815/1836/2203 +f 2830/1853/3 2828/1851/3 2827/1850/3 +f 2827/1850/3 2829/1852/3 2830/1853/3 +f 2828/1851/3 2826/1849/3 2825/1846/3 +f 2827/1850/3 2828/1851/3 2825/1846/3 +f 2825/1846/2204 2904/1848/2204 2905/1847/2204 +f 2906/1848/251 2825/1846/251 2826/1849/251 +f 2824/1845/2219 2822/1843/2219 2821/1842/2219 +f 2821/1842/2220 2823/1844/2220 2824/1845/2220 +f 2822/1843/3 2820/1841/3 2818/1838/3 +f 2821/1842/3 2822/1843/3 2818/1838/3 +f 2817/1839/2221 2818/1838/2221 2820/1841/2221 +f 2820/1841/2221 2819/1840/2221 2817/1839/2221 +f 2831/1854/2222 2832/1855/2222 2833/1856/2222 +f 2831/1854/2223 2833/1856/2223 2834/1857/2223 +f 2835/1858/2224 2836/1859/2224 2837/1860/2224 +f 2838/1861/2222 2835/1858/2222 2837/1860/2222 +f 2839/1862/2225 2840/1863/2225 2832/1855/2225 +f 2832/1855/2225 2831/1854/2225 2839/1862/2225 +f 2840/1863/2226 2841/1864/2226 2833/1856/2226 +f 2833/1856/2227 2832/1855/2227 2840/1863/2227 +f 2841/1864/2228 2842/1865/2228 2834/1857/2228 +f 2834/1857/2228 2833/1856/2228 2841/1864/2228 +f 2843/1866/356 2844/1867/356 2837/1860/356 +f 2837/1860/356 2836/1859/356 2843/1866/356 +f 2845/1868/2228 2846/1869/2228 2835/1858/2228 +f 2835/1858/2228 2838/1861/2228 2845/1868/2228 +f 2844/1867/331 2845/1868/331 2838/1861/331 +f 2838/1861/331 2837/1860/331 2844/1867/331 +f 2846/1869/7 2845/1868/7 2844/1867/7 +f 2844/1867/7 2843/1866/7 2846/1869/7 +f 2842/1865/7 2841/1864/7 2839/1862/7 +f 2839/1862/7 2841/1864/7 2840/1863/7 +o diespipe +v -0.292075 0.095761 0.910208 +v -0.307054 0.110567 0.910064 +v -0.292067 0.118629 0.910036 +v -0.278101 0.110565 0.910073 +v -0.278263 0.100553 0.910141 +v -0.587005 0.096190 0.910078 +v -0.601497 0.093851 0.910043 +v -0.601496 0.110514 0.910021 +v -0.572545 0.093849 0.910052 +v -0.307192 0.100167 0.910132 +v -0.587019 0.118924 0.910021 +v -0.572544 0.110565 0.910021 +v -0.292578 0.094251 0.065413 +v -0.307056 0.094251 0.071849 +v -0.307056 0.115094 0.084720 +v -0.292578 0.120427 0.091155 +v -0.278101 0.115094 0.084720 +v -0.278101 0.094251 0.071849 +v -0.307056 0.123153 0.065185 +v -0.292578 0.123094 0.056827 +v -0.278101 0.123153 0.065185 +v -0.307055 1.451027 0.065422 +v -0.292577 1.445030 0.059599 +v -0.307055 1.444126 0.084606 +v -0.292577 1.444209 0.092963 +v -0.278100 1.444126 0.084606 +v -0.278100 1.451027 0.065422 +v -0.307055 1.463019 0.077068 +v -0.292577 1.469016 0.082891 +v -0.278100 1.463019 0.077068 +v -0.307055 1.470944 0.058367 +v -0.292577 1.479302 0.058447 +v -0.278100 1.470944 0.058367 +v -0.306964 1.455421 -0.332629 +v -0.292692 1.447077 -0.346968 +v -0.307072 1.472122 -0.332597 +v -0.292763 1.480468 -0.346924 +v -0.277996 1.472120 -0.332597 +v -0.277888 1.455419 -0.332629 +v -0.587020 0.084905 0.092576 +v -0.601498 0.104427 0.071849 +v -0.587020 0.099093 0.065413 +v -0.601498 0.093258 0.092887 +v -0.601498 0.115094 0.084720 +v -0.587020 0.120428 0.091155 +v -0.572543 0.115094 0.084720 +v -0.572543 0.104427 0.071849 +v -0.572543 0.093257 0.092886 +v -0.601498 0.123154 0.065185 +v -0.587020 0.123094 0.056827 +v -0.572543 0.123153 0.065185 +v -0.601497 1.451027 0.065422 +v -0.587019 1.445030 0.059599 +v -0.601496 1.444126 0.084606 +v -0.587019 1.444210 0.092964 +v -0.572542 1.444126 0.084606 +v -0.572542 1.451027 0.065422 +v -0.601496 1.463020 0.077068 +v -0.587019 1.469016 0.082891 +v -0.572542 1.463020 0.077068 +v -0.601496 1.470944 0.058368 +v -0.587019 1.479302 0.058447 +v -0.572542 1.470944 0.058368 +v -0.601550 1.455442 -0.332629 +v -0.586949 1.447104 -0.346968 +v -0.601550 1.472143 -0.332597 +v -0.586948 1.480496 -0.346925 +v -0.572379 1.472141 -0.332597 +v -0.572380 1.455440 -0.332629 +v -1.147675 1.480534 -0.347007 +v -1.155754 1.527605 -0.361467 +v -1.147733 1.527605 -0.347018 +v -1.155766 1.472177 -0.361457 +v -1.171797 1.527605 -0.361468 +v -1.171787 1.472179 -0.361457 +v -1.179818 1.527605 -0.347018 +v -1.179854 1.480535 -0.347007 +v -1.171797 1.527605 -0.332569 +v -1.171787 1.472179 -0.332557 +v -1.155754 1.527605 -0.332568 +v -1.155766 1.472177 -0.332557 +v -1.151367 1.527673 -0.300325 +v -1.151367 1.553988 -0.300325 +v -1.129875 1.527673 -0.312836 +v -1.122256 1.553988 -0.322848 +v -1.115832 1.527673 -0.347018 +v -1.117467 1.553988 -0.359529 +v -1.129875 1.527673 -0.381200 +v -1.139804 1.553988 -0.388882 +v -1.163775 1.527673 -0.395358 +v -1.176184 1.553988 -0.393712 +v -1.197676 1.527673 -0.381200 +v -1.205295 1.553988 -0.371188 +v -1.211718 1.527673 -0.347018 +v -1.210084 1.553988 -0.334507 +v -1.197676 1.527673 -0.312836 +v -1.187746 1.553988 -0.305154 +v -1.176184 1.527673 -0.300325 +v -1.176184 1.553988 -0.300325 +v 0.298350 1.480443 -0.347008 +v 0.290305 1.527603 -0.361468 +v 0.298327 1.527603 -0.347018 +v 0.290347 1.472108 -0.361457 +v 0.274263 1.527603 -0.361468 +v 0.274246 1.472110 -0.361457 +v 0.266241 1.527603 -0.347018 +v 0.266271 1.480445 -0.347008 +v 0.274263 1.527603 -0.332569 +v 0.274246 1.472110 -0.332558 +v 0.290305 1.527603 -0.332569 +v 0.290347 1.472108 -0.332558 +v 0.294692 1.527671 -0.300325 +v 0.294692 1.553986 -0.300325 +v 0.316185 1.527671 -0.312837 +v 0.323804 1.553986 -0.322848 +v 0.330227 1.527671 -0.347018 +v 0.328593 1.553986 -0.359530 +v 0.316185 1.527671 -0.381200 +v 0.306255 1.553986 -0.388882 +v 0.282284 1.527671 -0.395359 +v 0.269876 1.553986 -0.393712 +v 0.248383 1.527671 -0.381200 +v 0.240764 1.553986 -0.371189 +v 0.234341 1.527671 -0.347018 +v 0.235975 1.553986 -0.334507 +v 0.248384 1.527671 -0.312837 +v 0.258312 1.553986 -0.305155 +v 0.269876 1.527671 -0.300325 +v 0.269876 1.553986 -0.300325 +v 0.381154 1.440537 -0.332547 +v 0.384937 1.465925 -0.332546 +v 0.375690 1.452036 -0.332547 +v 0.397818 1.441383 -0.332546 +v 0.389561 1.472869 -0.346997 +v 0.406150 1.441805 -0.346997 +v 0.384937 1.465925 -0.361447 +v 0.397818 1.441383 -0.361447 +v 0.375690 1.452037 -0.361447 +v 0.381154 1.440538 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.367567 1.472087 -0.332546 +v 0.367698 1.480429 -0.346997 +v 0.367567 1.472087 -0.361446 +v 0.274228 1.455423 -0.332546 +v 0.274229 1.455423 -0.361447 +v 0.274228 1.447081 -0.346997 +v -0.292856 1.472118 -0.361446 +v -0.292857 1.455432 -0.361446 +v -0.586936 1.472161 -0.361446 +v -0.586937 1.455476 -0.361446 +v -1.155780 1.455486 -0.332546 +v -1.155780 1.455486 -0.361446 +v -1.155780 1.447144 -0.346996 +v -1.236537 1.472195 -0.332546 +v -1.236636 1.480537 -0.346996 +v -1.236537 1.472195 -0.361446 +v -1.264335 1.465568 -0.332546 +v -1.254110 1.452384 -0.332546 +v -1.269448 1.472160 -0.346996 +v -1.264336 1.465568 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.248996 1.445791 -0.346996 +v -1.281743 1.444267 -0.332546 +v -1.265282 1.441541 -0.332546 +v -1.289974 1.445631 -0.346996 +v -1.281743 1.444267 -0.361446 +v -1.265282 1.441541 -0.361446 +v -1.257051 1.440177 -0.346996 +v -1.281659 1.397097 -0.361446 +v -1.264987 1.397097 -0.361446 +v 0.380231 1.397095 -0.361446 +v 0.371888 1.397095 -0.346997 +v 0.380231 1.397095 -0.332546 +v 0.396917 1.397095 -0.361447 +v 0.405259 1.397095 -0.346997 +v 0.396917 1.397095 -0.332547 +v 0.387445 1.397095 -0.332546 +v 0.387456 1.397095 -0.332547 +v -1.264987 1.397097 -0.332546 +v -1.281659 1.397097 -0.332546 +v -1.289994 1.397097 -0.346996 +v -1.256652 1.397097 -0.346996 +v -1.467952 0.686714 0.234200 +v -1.482925 0.698137 0.223114 +v -1.467952 0.698141 0.231759 +v -1.468099 0.668499 0.477396 +v -1.468099 0.685681 0.477396 +v -1.482979 0.694272 0.477396 +v -1.497860 0.685681 0.477396 +v -1.482979 0.659907 0.477396 +v -1.497860 0.668499 0.477396 +v -1.497900 0.669545 0.252358 +v -1.482926 0.661201 0.250097 +v -1.497900 0.692191 0.252964 +v -1.467952 0.669545 0.252358 +v -1.467952 0.694141 0.249813 +v -1.497900 0.686715 0.234200 +v -1.482926 0.683001 0.226393 +v -1.467952 0.686714 0.234200 +v -1.482926 0.698154 0.257693 +v -1.497899 1.450291 0.228780 +v -1.482925 1.444157 0.222690 +v -1.497899 1.462561 0.240963 +v -1.482925 1.468695 0.247054 +v -1.467951 1.462561 0.240963 +v -1.467951 1.447184 0.227851 +v -1.497899 1.449471 -0.332978 +v -1.482925 1.443342 -0.326881 +v -1.497899 1.472101 -0.320973 +v -1.482924 1.480746 -0.321005 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.454811 -0.320908 +v -1.497899 1.461730 -0.345170 +v -1.482925 1.467860 -0.351266 +v -1.467952 1.461730 -0.345170 +v -1.467952 1.444925 -0.336195 +v -1.497900 1.440084 -0.355280 +v -1.482925 1.440333 -0.363922 +v -1.467952 1.440084 -0.355281 +v -1.497899 1.397098 -0.355443 +v -1.482990 1.397098 -0.364135 +v -1.467999 1.397098 -0.355555 +v -1.482925 1.397098 -0.329592 +v -1.497819 1.397098 -0.338191 +v -1.467952 1.397098 -0.338237 +v 0.615024 0.668496 0.477378 +v 0.615024 0.685679 0.477378 +v 0.600144 0.694270 0.477378 +v 0.585263 0.685679 0.477378 +v 0.600144 0.659905 0.477378 +v 0.585263 0.668496 0.477378 +v 0.585223 0.669543 0.252340 +v 0.600197 0.661199 0.250078 +v 0.585223 0.692189 0.252946 +v 0.615171 0.669543 0.252340 +v 0.615171 0.694139 0.249795 +v 0.585223 0.686712 0.234181 +v 0.600197 0.682999 0.226374 +v 0.615171 0.686712 0.234181 +v 0.600197 0.698152 0.257674 +v 0.585224 1.450289 0.228762 +v 0.600198 1.444155 0.222671 +v 0.585224 1.462559 0.240944 +v 0.600198 1.468693 0.247036 +v 0.615172 1.462559 0.240944 +v 0.615172 1.447181 0.227832 +v 0.585224 1.449469 -0.332997 +v 0.600198 1.443340 -0.326900 +v 0.585224 1.472099 -0.320992 +v 0.600198 1.480744 -0.321024 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.454809 -0.320927 +v 0.585224 1.461728 -0.345189 +v 0.600197 1.467858 -0.351285 +v 0.615171 1.461728 -0.345189 +v 0.615171 1.444923 -0.336214 +v 0.585223 1.440082 -0.355299 +v 0.600197 1.440331 -0.363941 +v 0.615171 1.440082 -0.355299 +v 0.585224 1.397096 -0.355461 +v 0.600133 1.397096 -0.364154 +v 0.615123 1.397096 -0.355573 +v 0.600197 1.397096 -0.329611 +v 0.585303 1.397096 -0.338210 +v 0.615171 1.397096 -0.338256 +v -0.433317 0.676592 2.698729 +v -0.433273 0.695542 2.698728 +v -0.449769 0.667176 2.699296 +v -0.449592 0.705025 2.699290 +v -0.465995 0.695641 2.699864 +v -0.466089 0.676719 2.699867 +v -0.449682 0.124829 2.328056 +v -0.449682 0.094779 2.341581 +v -0.433248 0.100781 2.326608 +v -0.466116 0.123353 2.338130 +v -0.466116 0.106945 2.347295 +v -0.433248 0.123353 2.338130 +v -0.466116 0.127242 2.357770 +v -0.449682 0.127267 2.367258 +v -0.433248 0.127242 2.357770 +v -0.466115 0.661664 2.338843 +v -0.449681 0.661686 2.329355 +v -0.466115 0.664713 2.358441 +v -0.449681 0.662700 2.367486 +v -0.433248 0.661620 2.357819 +v -0.433248 0.661664 2.338843 +v -0.466114 0.693041 2.361220 +v -0.449681 0.702079 2.358333 +v -0.433248 0.671832 2.362039 +v -0.433248 0.693041 2.361220 +v -0.466114 0.675520 2.372075 +v -0.449682 0.124019 2.112728 +v -0.466115 0.114532 2.112725 +v -0.466112 0.095554 2.112725 +v -0.449663 0.096334 2.112726 +v -0.433248 0.095564 2.112732 +v -0.433248 0.114532 2.112733 +v -0.449675 0.124016 2.112728 +v -0.443805 3.183812 3.439444 +v -0.458152 3.183558 3.447723 +v -0.443805 3.186335 3.473371 +v -0.429459 3.192196 3.467518 +v -0.429459 3.183558 3.447723 +v -0.458152 3.203918 3.455812 +v -0.443805 3.209780 3.449959 +v -0.458152 3.192196 3.467518 +v -0.429459 3.203918 3.455812 +v -0.458152 3.211245 3.475512 +v -0.443805 3.219528 3.475507 +v -0.429459 3.211245 3.475512 +v -0.458152 3.211244 4.092529 +v -0.443805 3.219527 4.092540 +v -0.458152 3.188301 4.102205 +v -0.443805 3.186088 4.093656 +v -0.429458 3.188301 4.102205 +v -0.429458 3.211244 4.092529 +v -0.458152 3.203329 4.111561 +v -0.443805 3.209200 4.117404 +v -0.429458 3.203329 4.111561 +v -0.443805 3.184472 4.128129 +v -0.429458 3.184475 4.119846 +v -0.458152 3.184475 4.119846 +v -0.458156 0.094247 4.117269 +v -0.443809 0.094247 4.125552 +v -0.458156 0.094247 4.100702 +v -0.443809 0.094247 4.092418 +v -0.429462 0.094247 4.100701 +v -0.429462 0.094247 4.117269 +v -0.443807 3.148010 3.439536 +v -0.443805 3.148010 3.439536 +v -0.458152 3.148010 3.447819 +v -0.458152 3.148010 3.464385 +v -0.458151 3.148010 3.464386 +v -0.443805 3.148010 3.472668 +v -0.443804 3.148010 3.472667 +v -0.429459 3.148010 3.464385 +v -0.429459 3.148010 3.447819 +v -0.429460 3.148010 3.447818 +v -0.292578 0.123094 0.056827 +v -0.292578 0.123094 0.056827 +v -0.307056 0.123153 0.065185 +v -0.307055 1.451027 0.065422 +v -0.307056 0.123153 0.065185 +v -0.307055 1.451027 0.065422 +v -0.307056 0.123153 0.065185 +v -0.307056 0.115094 0.084720 +v -0.307055 1.444126 0.084606 +v -0.307056 0.115094 0.084720 +v -0.307055 1.444126 0.084606 +v -0.307056 0.115094 0.084720 +v -0.292577 1.444209 0.092963 +v -0.292578 0.120427 0.091155 +v -0.278101 0.115094 0.084720 +v -0.278100 1.444126 0.084606 +v -0.278101 0.115094 0.084720 +v -0.278100 1.444126 0.084606 +v -0.278101 0.115094 0.084720 +v -0.278101 0.123153 0.065185 +v -0.278101 0.123153 0.065185 +v -0.292577 1.445030 0.059599 +v -0.278100 1.451027 0.065422 +v -0.278101 0.123153 0.065185 +v -0.292578 0.123094 0.056827 +v -0.292577 1.445030 0.059599 +v -0.307055 1.451027 0.065422 +v -0.307055 1.444126 0.084606 +v -0.307055 1.444126 0.084606 +v -0.307055 1.463019 0.077068 +v -0.307055 1.444126 0.084606 +v -0.292577 1.444209 0.092963 +v -0.292577 1.469016 0.082891 +v -0.292577 1.444209 0.092963 +v -0.292577 1.469016 0.082891 +v -0.292577 1.444209 0.092963 +v -0.278100 1.444126 0.084606 +v -0.278100 1.463019 0.077068 +v -0.278100 1.444126 0.084606 +v -0.278100 1.451027 0.065422 +v -0.278100 1.463019 0.077068 +v -0.307055 1.451027 0.065422 +v -0.307055 1.463019 0.077068 +v -0.307055 1.463019 0.077068 +v -0.307055 1.463019 0.077068 +v -0.292577 1.469016 0.082891 +v -0.292577 1.479302 0.058447 +v -0.292577 1.469016 0.082891 +v -0.292577 1.479302 0.058447 +v -0.292577 1.469016 0.082891 +v -0.278100 1.463019 0.077068 +v -0.278100 1.470944 0.058367 +v -0.278100 1.463019 0.077068 +v -0.278100 1.451027 0.065422 +v -0.278100 1.470944 0.058367 +v -0.292577 1.445030 0.059599 +v -0.292577 1.445030 0.059599 +v -0.307055 1.451027 0.065422 +v -0.306964 1.455421 -0.332629 +v -0.307055 1.451027 0.065422 +v -0.306964 1.455421 -0.332629 +v -0.307055 1.451027 0.065422 +v -0.307055 1.470944 0.058367 +v -0.307072 1.472122 -0.332597 +v -0.307055 1.470944 0.058367 +v -0.307072 1.472122 -0.332597 +v -0.307055 1.470944 0.058367 +v -0.292577 1.479302 0.058447 +v -0.292763 1.480468 -0.346924 +v -0.292577 1.479302 0.058447 +v -0.292763 1.480468 -0.346924 +v -0.292577 1.479302 0.058447 +v -0.278100 1.470944 0.058367 +v -0.277996 1.472120 -0.332597 +v -0.278100 1.470944 0.058367 +v -0.277996 1.472120 -0.332597 +v -0.278100 1.470944 0.058367 +v -0.278100 1.451027 0.065422 +v -0.277888 1.455419 -0.332629 +v -0.278100 1.451027 0.065422 +v -0.292692 1.447077 -0.346968 +v -0.277888 1.455419 -0.332629 +v -0.278100 1.451027 0.065422 +v -0.292577 1.445030 0.059599 +v -0.292692 1.447077 -0.346968 +v -0.587020 0.084905 0.092576 +v -0.601498 0.104427 0.071849 +v -0.601498 0.093258 0.092887 +v -0.601498 0.104427 0.071849 +v -0.572543 0.093257 0.092886 +v -0.587020 0.099093 0.065413 +v -0.572543 0.104427 0.071849 +v -0.572543 0.093257 0.092886 +v -0.587020 0.084905 0.092576 +v -0.587020 0.099093 0.065413 +v -0.587020 0.099093 0.065413 +v -0.601498 0.104427 0.071849 +v -0.601498 0.123154 0.065185 +v -0.601498 0.104427 0.071849 +v -0.601498 0.115094 0.084720 +v -0.601498 0.123154 0.065185 +v -0.572543 0.115094 0.084720 +v -0.572543 0.104427 0.071849 +v -0.587020 0.123094 0.056827 +v -0.572543 0.123153 0.065185 +v -0.572543 0.104427 0.071849 +v -0.587020 0.099093 0.065413 +v -0.587020 0.123094 0.056827 +v -0.587020 0.123094 0.056827 +v -0.601498 0.123154 0.065185 +v -0.601497 1.451027 0.065422 +v -0.601498 0.123154 0.065185 +v -0.601497 1.451027 0.065422 +v -0.601498 0.123154 0.065185 +v -0.601498 0.115094 0.084720 +v -0.601496 1.444126 0.084606 +v -0.601498 0.115094 0.084720 +v -0.601496 1.444126 0.084606 +v -0.601498 0.115094 0.084720 +v -0.587019 1.444210 0.092964 +v -0.587020 0.120428 0.091155 +v -0.587019 1.444210 0.092964 +v -0.587020 0.120428 0.091155 +v -0.572543 0.115094 0.084720 +v -0.572542 1.444126 0.084606 +v -0.572543 0.115094 0.084720 +v -0.572542 1.444126 0.084606 +v -0.572543 0.115094 0.084720 +v -0.572543 0.123153 0.065185 +v -0.572542 1.451027 0.065422 +v -0.587019 1.445030 0.059599 +v -0.572542 1.451027 0.065422 +v -0.572543 0.123153 0.065185 +v -0.587020 0.123094 0.056827 +v -0.587019 1.445030 0.059599 +v -0.601497 1.451027 0.065422 +v -0.601496 1.444126 0.084606 +v -0.601496 1.444126 0.084606 +v -0.601496 1.463020 0.077068 +v -0.601496 1.444126 0.084606 +v -0.587019 1.444210 0.092964 +v -0.587019 1.469016 0.082891 +v -0.587019 1.444210 0.092964 +v -0.587019 1.469016 0.082891 +v -0.587019 1.444210 0.092964 +v -0.572542 1.444126 0.084606 +v -0.572542 1.463020 0.077068 +v -0.572542 1.444126 0.084606 +v -0.572542 1.451027 0.065422 +v -0.572542 1.463020 0.077068 +v -0.601497 1.451027 0.065422 +v -0.601496 1.463020 0.077068 +v -0.601496 1.470944 0.058368 +v -0.601496 1.463020 0.077068 +v -0.587019 1.469016 0.082891 +v -0.587019 1.479302 0.058447 +v -0.587019 1.469016 0.082891 +v -0.587019 1.479302 0.058447 +v -0.587019 1.469016 0.082891 +v -0.572542 1.463020 0.077068 +v -0.572542 1.470944 0.058368 +v -0.572542 1.463020 0.077068 +v -0.572542 1.451027 0.065422 +v -0.572542 1.470944 0.058368 +v -0.587019 1.445030 0.059599 +v -0.587019 1.445030 0.059599 +v -0.601497 1.451027 0.065422 +v -0.601550 1.455442 -0.332629 +v -0.601497 1.451027 0.065422 +v -0.601550 1.455442 -0.332629 +v -0.601497 1.451027 0.065422 +v -0.601496 1.470944 0.058368 +v -0.601550 1.472143 -0.332597 +v -0.601496 1.470944 0.058368 +v -0.601550 1.472143 -0.332597 +v -0.601496 1.470944 0.058368 +v -0.587019 1.479302 0.058447 +v -0.586948 1.480496 -0.346925 +v -0.587019 1.479302 0.058447 +v -0.586948 1.480496 -0.346925 +v -0.587019 1.479302 0.058447 +v -0.572542 1.470944 0.058368 +v -0.572379 1.472141 -0.332597 +v -0.572542 1.470944 0.058368 +v -0.572379 1.472141 -0.332597 +v -0.572542 1.470944 0.058368 +v -0.572542 1.451027 0.065422 +v -0.572380 1.455440 -0.332629 +v -0.572542 1.451027 0.065422 +v -0.586949 1.447104 -0.346968 +v -0.572380 1.455440 -0.332629 +v -0.572542 1.451027 0.065422 +v -0.587019 1.445030 0.059599 +v -0.586949 1.447104 -0.346968 +v -1.147675 1.480534 -0.347007 +v -1.155754 1.527605 -0.361467 +v -1.155766 1.472177 -0.361457 +v -1.155754 1.527605 -0.361467 +v -1.155766 1.472177 -0.361457 +v -1.171797 1.527605 -0.361468 +v -1.171787 1.472179 -0.361457 +v -1.171797 1.527605 -0.361468 +v -1.179818 1.527605 -0.347018 +v -1.179854 1.480535 -0.347007 +v -1.179818 1.527605 -0.347018 +v -1.179854 1.480535 -0.347007 +v -1.171797 1.527605 -0.332569 +v -1.171787 1.472179 -0.332557 +v -1.171797 1.527605 -0.332569 +v -1.171787 1.472179 -0.332557 +v -1.155754 1.527605 -0.332568 +v -1.155766 1.472177 -0.332557 +v -1.147733 1.527605 -0.347018 +v -1.155754 1.527605 -0.332568 +v -1.155766 1.472177 -0.332557 +v -1.147675 1.480534 -0.347007 +v -1.147733 1.527605 -0.347018 +v -1.151367 1.553988 -0.300325 +v -1.129875 1.527673 -0.312836 +v -1.122256 1.553988 -0.322848 +v -1.129875 1.527673 -0.312836 +v -1.122256 1.553988 -0.322848 +v -1.115832 1.527673 -0.347018 +v -1.117467 1.553988 -0.359529 +v -1.115832 1.527673 -0.347018 +v -1.117467 1.553988 -0.359529 +v -1.129875 1.527673 -0.381200 +v -1.139804 1.553988 -0.388882 +v -1.129875 1.527673 -0.381200 +v -1.139804 1.553988 -0.388882 +v -1.163775 1.527673 -0.395358 +v -1.176184 1.553988 -0.393712 +v -1.163775 1.527673 -0.395358 +v -1.176184 1.553988 -0.393712 +v -1.197676 1.527673 -0.381200 +v -1.205295 1.553988 -0.371188 +v -1.197676 1.527673 -0.381200 +v -1.205295 1.553988 -0.371188 +v -1.211718 1.527673 -0.347018 +v -1.210084 1.553988 -0.334507 +v -1.211718 1.527673 -0.347018 +v -1.210084 1.553988 -0.334507 +v -1.197676 1.527673 -0.312836 +v -1.187746 1.553988 -0.305154 +v -1.197676 1.527673 -0.312836 +v -1.187746 1.553988 -0.305154 +v -1.176184 1.527673 -0.300325 +v -1.176184 1.553988 -0.300325 +v -1.176184 1.527673 -0.300325 +v -1.151367 1.527673 -0.300325 +v -1.176184 1.553988 -0.300325 +v -1.151367 1.527673 -0.300325 +v -1.151367 1.553988 -0.300325 +v -1.151367 1.527673 -0.300325 +v -1.176184 1.527673 -0.300325 +v -1.171797 1.527605 -0.332569 +v -1.176184 1.527673 -0.300325 +v -1.197676 1.527673 -0.312836 +v -1.171797 1.527605 -0.332569 +v -1.197676 1.527673 -0.312836 +v -1.179818 1.527605 -0.347018 +v -1.171797 1.527605 -0.332569 +v -1.197676 1.527673 -0.312836 +v -1.211718 1.527673 -0.347018 +v -1.179818 1.527605 -0.347018 +v -1.155754 1.527605 -0.332568 +v -1.129875 1.527673 -0.312836 +v -1.151367 1.527673 -0.300325 +v -1.155754 1.527605 -0.332568 +v -1.147733 1.527605 -0.347018 +v -1.129875 1.527673 -0.312836 +v -1.129875 1.527673 -0.312836 +v -1.147733 1.527605 -0.347018 +v -1.115832 1.527673 -0.347018 +v -1.147733 1.527605 -0.347018 +v -1.129875 1.527673 -0.381200 +v -1.115832 1.527673 -0.347018 +v -1.147733 1.527605 -0.347018 +v -1.155754 1.527605 -0.361467 +v -1.129875 1.527673 -0.381200 +v -1.129875 1.527673 -0.381200 +v -1.155754 1.527605 -0.361467 +v -1.163775 1.527673 -0.395358 +v -1.155754 1.527605 -0.361467 +v -1.171797 1.527605 -0.361468 +v -1.163775 1.527673 -0.395358 +v -1.171797 1.527605 -0.361468 +v -1.197676 1.527673 -0.381200 +v -1.163775 1.527673 -0.395358 +v -1.179818 1.527605 -0.347018 +v -1.211718 1.527673 -0.347018 +v -1.197676 1.527673 -0.381200 +v -1.171797 1.527605 -0.361468 +v -1.179818 1.527605 -0.347018 +v -1.197676 1.527673 -0.381200 +v -1.155754 1.527605 -0.332568 +v -1.151367 1.527673 -0.300325 +v -1.171797 1.527605 -0.332569 +v -1.139804 1.553988 -0.388882 +v -1.187746 1.553988 -0.305154 +v -1.176184 1.553988 -0.300325 +v -1.139804 1.553988 -0.388882 +v -1.176184 1.553988 -0.300325 +v -1.151367 1.553988 -0.300325 +v -1.151367 1.553988 -0.300325 +v -1.117467 1.553988 -0.359529 +v -1.139804 1.553988 -0.388882 +v -1.117467 1.553988 -0.359529 +v -1.151367 1.553988 -0.300325 +v -1.122256 1.553988 -0.322848 +v -1.187746 1.553988 -0.305154 +v -1.139804 1.553988 -0.388882 +v -1.176184 1.553988 -0.393712 +v -1.187746 1.553988 -0.305154 +v -1.176184 1.553988 -0.393712 +v -1.210084 1.553988 -0.334507 +v -1.176184 1.553988 -0.393712 +v -1.205295 1.553988 -0.371188 +v -1.210084 1.553988 -0.334507 +v 0.298350 1.480443 -0.347008 +v 0.290305 1.527603 -0.361468 +v 0.290347 1.472108 -0.361457 +v 0.290305 1.527603 -0.361468 +v 0.290347 1.472108 -0.361457 +v 0.274263 1.527603 -0.361468 +v 0.274246 1.472110 -0.361457 +v 0.274263 1.527603 -0.361468 +v 0.274246 1.472110 -0.361457 +v 0.266241 1.527603 -0.347018 +v 0.266271 1.480445 -0.347008 +v 0.266241 1.527603 -0.347018 +v 0.266271 1.480445 -0.347008 +v 0.274263 1.527603 -0.332569 +v 0.274246 1.472110 -0.332558 +v 0.274263 1.527603 -0.332569 +v 0.274246 1.472110 -0.332558 +v 0.290305 1.527603 -0.332569 +v 0.290347 1.472108 -0.332558 +v 0.298327 1.527603 -0.347018 +v 0.290305 1.527603 -0.332569 +v 0.290347 1.472108 -0.332558 +v 0.298350 1.480443 -0.347008 +v 0.298327 1.527603 -0.347018 +v 0.294692 1.553986 -0.300325 +v 0.316185 1.527671 -0.312837 +v 0.323804 1.553986 -0.322848 +v 0.316185 1.527671 -0.312837 +v 0.328593 1.553986 -0.359530 +v 0.330227 1.527671 -0.347018 +v 0.306255 1.553986 -0.388882 +v 0.316185 1.527671 -0.381200 +v 0.306255 1.553986 -0.388882 +v 0.282284 1.527671 -0.395359 +v 0.269876 1.553986 -0.393712 +v 0.282284 1.527671 -0.395359 +v 0.240764 1.553986 -0.371189 +v 0.248383 1.527671 -0.381200 +v 0.240764 1.553986 -0.371189 +v 0.234341 1.527671 -0.347018 +v 0.235975 1.553986 -0.334507 +v 0.234341 1.527671 -0.347018 +v 0.258312 1.553986 -0.305155 +v 0.248384 1.527671 -0.312837 +v 0.269876 1.553986 -0.300325 +v 0.269876 1.527671 -0.300325 +v 0.294692 1.527671 -0.300325 +v 0.294692 1.527671 -0.300325 +v 0.294692 1.553986 -0.300325 +v 0.294692 1.527671 -0.300325 +v 0.269876 1.527671 -0.300325 +v 0.274263 1.527603 -0.332569 +v 0.269876 1.527671 -0.300325 +v 0.248384 1.527671 -0.312837 +v 0.274263 1.527603 -0.332569 +v 0.248384 1.527671 -0.312837 +v 0.266241 1.527603 -0.347018 +v 0.274263 1.527603 -0.332569 +v 0.248384 1.527671 -0.312837 +v 0.234341 1.527671 -0.347018 +v 0.266241 1.527603 -0.347018 +v 0.290305 1.527603 -0.332569 +v 0.316185 1.527671 -0.312837 +v 0.294692 1.527671 -0.300325 +v 0.290305 1.527603 -0.332569 +v 0.298327 1.527603 -0.347018 +v 0.316185 1.527671 -0.312837 +v 0.316185 1.527671 -0.312837 +v 0.298327 1.527603 -0.347018 +v 0.330227 1.527671 -0.347018 +v 0.298327 1.527603 -0.347018 +v 0.316185 1.527671 -0.381200 +v 0.330227 1.527671 -0.347018 +v 0.298327 1.527603 -0.347018 +v 0.290305 1.527603 -0.361468 +v 0.316185 1.527671 -0.381200 +v 0.316185 1.527671 -0.381200 +v 0.290305 1.527603 -0.361468 +v 0.282284 1.527671 -0.395359 +v 0.290305 1.527603 -0.361468 +v 0.274263 1.527603 -0.361468 +v 0.282284 1.527671 -0.395359 +v 0.274263 1.527603 -0.361468 +v 0.248383 1.527671 -0.381200 +v 0.282284 1.527671 -0.395359 +v 0.266241 1.527603 -0.347018 +v 0.234341 1.527671 -0.347018 +v 0.248383 1.527671 -0.381200 +v 0.274263 1.527603 -0.361468 +v 0.266241 1.527603 -0.347018 +v 0.248383 1.527671 -0.381200 +v 0.290305 1.527603 -0.332569 +v 0.294692 1.527671 -0.300325 +v 0.274263 1.527603 -0.332569 +v 0.306255 1.553986 -0.388882 +v 0.258312 1.553986 -0.305155 +v 0.269876 1.553986 -0.300325 +v 0.306255 1.553986 -0.388882 +v 0.269876 1.553986 -0.300325 +v 0.294692 1.553986 -0.300325 +v 0.294692 1.553986 -0.300325 +v 0.328593 1.553986 -0.359530 +v 0.306255 1.553986 -0.388882 +v 0.328593 1.553986 -0.359530 +v 0.294692 1.553986 -0.300325 +v 0.323804 1.553986 -0.322848 +v 0.258312 1.553986 -0.305155 +v 0.306255 1.553986 -0.388882 +v 0.269876 1.553986 -0.393712 +v 0.258312 1.553986 -0.305155 +v 0.269876 1.553986 -0.393712 +v 0.235975 1.553986 -0.334507 +v 0.269876 1.553986 -0.393712 +v 0.240764 1.553986 -0.371189 +v 0.235975 1.553986 -0.334507 +v 0.381154 1.440537 -0.332547 +v 0.384937 1.465925 -0.332546 +v 0.397818 1.441383 -0.332546 +v 0.384937 1.465925 -0.332546 +v 0.397818 1.441383 -0.332546 +v 0.389561 1.472869 -0.346997 +v 0.389561 1.472869 -0.346997 +v 0.406150 1.441805 -0.346997 +v 0.384937 1.465925 -0.361447 +v 0.384937 1.465925 -0.361447 +v 0.397818 1.441383 -0.361447 +v 0.375690 1.452037 -0.361447 +v 0.375690 1.452037 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.381154 1.440537 -0.332547 +v 0.375690 1.452036 -0.332547 +v 0.375690 1.452036 -0.332547 +v 0.384937 1.465925 -0.332546 +v 0.384937 1.465925 -0.332546 +v 0.367567 1.472087 -0.332546 +v 0.384937 1.465925 -0.332546 +v 0.389561 1.472869 -0.346997 +v 0.367698 1.480429 -0.346997 +v 0.389561 1.472869 -0.346997 +v 0.367698 1.480429 -0.346997 +v 0.384937 1.465925 -0.361447 +v 0.367567 1.472087 -0.361446 +v 0.384937 1.465925 -0.361447 +v 0.375690 1.452037 -0.361447 +v 0.367567 1.472087 -0.361446 +v 0.375690 1.452036 -0.332547 +v 0.290347 1.472108 -0.332558 +v 0.375690 1.452036 -0.332547 +v 0.367567 1.472087 -0.332546 +v 0.290347 1.472108 -0.332558 +v 0.367567 1.472087 -0.332546 +v 0.298350 1.480443 -0.347008 +v 0.290347 1.472108 -0.332558 +v 0.367567 1.472087 -0.332546 +v 0.367698 1.480429 -0.346997 +v 0.298350 1.480443 -0.347008 +v 0.367698 1.480429 -0.346997 +v 0.290347 1.472108 -0.361457 +v 0.298350 1.480443 -0.347008 +v 0.367698 1.480429 -0.346997 +v 0.367567 1.472087 -0.361446 +v 0.290347 1.472108 -0.361457 +v 0.367567 1.472087 -0.361446 +v 0.290347 1.472108 -0.361457 +v 0.367567 1.472087 -0.361446 +v 0.375690 1.452037 -0.361447 +v 0.274229 1.455423 -0.361447 +v 0.375690 1.452037 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.274229 1.455423 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.375690 1.452036 -0.332547 +v 0.274228 1.455423 -0.332546 +v 0.274228 1.455423 -0.332546 +v 0.290347 1.472108 -0.332558 +v 0.274246 1.472110 -0.332558 +v 0.290347 1.472108 -0.361457 +v 0.274229 1.455423 -0.361447 +v 0.274246 1.472110 -0.361457 +v 0.274229 1.455423 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.371067 1.445092 -0.346997 +v 0.274228 1.455423 -0.332546 +v 0.274228 1.447081 -0.346997 +v 0.274228 1.455423 -0.332546 +v -0.277996 1.472120 -0.332597 +v -0.277888 1.455419 -0.332629 +v 0.274228 1.455423 -0.332546 +v 0.274246 1.472110 -0.332558 +v -0.277996 1.472120 -0.332597 +v 0.274246 1.472110 -0.332558 +v -0.292763 1.480468 -0.346924 +v -0.277996 1.472120 -0.332597 +v 0.274246 1.472110 -0.332558 +v 0.266271 1.480445 -0.347008 +v -0.292763 1.480468 -0.346924 +v 0.266271 1.480445 -0.347008 +v -0.292763 1.480468 -0.346924 +v 0.274246 1.472110 -0.361457 +v -0.292856 1.472118 -0.361446 +v 0.274246 1.472110 -0.361457 +v -0.292856 1.472118 -0.361446 +v 0.274229 1.455423 -0.361447 +v -0.292857 1.455432 -0.361446 +v 0.274229 1.455423 -0.361447 +v -0.292692 1.447077 -0.346968 +v -0.292857 1.455432 -0.361446 +v 0.274229 1.455423 -0.361447 +v 0.274228 1.447081 -0.346997 +v -0.292692 1.447077 -0.346968 +v 0.274228 1.447081 -0.346997 +v -0.277888 1.455419 -0.332629 +v -0.292692 1.447077 -0.346968 +v 0.274228 1.447081 -0.346997 +v 0.274228 1.455423 -0.332546 +v -0.277888 1.455419 -0.332629 +v -0.306964 1.455421 -0.332629 +v -0.572379 1.472141 -0.332597 +v -0.572380 1.455440 -0.332629 +v -0.306964 1.455421 -0.332629 +v -0.307072 1.472122 -0.332597 +v -0.572379 1.472141 -0.332597 +v -0.307072 1.472122 -0.332597 +v -0.586948 1.480496 -0.346925 +v -0.572379 1.472141 -0.332597 +v -0.307072 1.472122 -0.332597 +v -0.292763 1.480468 -0.346924 +v -0.586948 1.480496 -0.346925 +v -0.292763 1.480468 -0.346924 +v -0.292856 1.472118 -0.361446 +v -0.586948 1.480496 -0.346925 +v -0.292857 1.455432 -0.361446 +v -0.292692 1.447077 -0.346968 +v -0.586949 1.447104 -0.346968 +v -0.292692 1.447077 -0.346968 +v -0.572380 1.455440 -0.332629 +v -0.586949 1.447104 -0.346968 +v -0.292692 1.447077 -0.346968 +v -0.306964 1.455421 -0.332629 +v -0.572380 1.455440 -0.332629 +v -0.586948 1.480496 -0.346925 +v -0.292856 1.472118 -0.361446 +v -0.292856 1.472118 -0.361446 +v -0.586936 1.472161 -0.361446 +v -0.292856 1.472118 -0.361446 +v -0.292857 1.455432 -0.361446 +v -0.586937 1.455476 -0.361446 +v -0.292857 1.455432 -0.361446 +v -0.586949 1.447104 -0.346968 +v -0.586937 1.455476 -0.361446 +v -0.601550 1.455442 -0.332629 +v -1.155766 1.472177 -0.332557 +v -0.601550 1.455442 -0.332629 +v -0.601550 1.472143 -0.332597 +v -1.155766 1.472177 -0.332557 +v -0.601550 1.472143 -0.332597 +v -1.147675 1.480534 -0.347007 +v -1.155766 1.472177 -0.332557 +v -0.601550 1.472143 -0.332597 +v -0.586948 1.480496 -0.346925 +v -1.147675 1.480534 -0.347007 +v -0.586948 1.480496 -0.346925 +v -1.155766 1.472177 -0.361457 +v -1.147675 1.480534 -0.347007 +v -0.586948 1.480496 -0.346925 +v -0.586936 1.472161 -0.361446 +v -1.155766 1.472177 -0.361457 +v -0.586936 1.472161 -0.361446 +v -1.155766 1.472177 -0.361457 +v -0.586936 1.472161 -0.361446 +v -0.586937 1.455476 -0.361446 +v -1.155780 1.455486 -0.361446 +v -0.586937 1.455476 -0.361446 +v -1.155780 1.455486 -0.361446 +v -0.586937 1.455476 -0.361446 +v -0.586949 1.447104 -0.346968 +v -1.155780 1.447144 -0.346996 +v -0.586949 1.447104 -0.346968 +v -1.155780 1.455486 -0.332546 +v -1.155780 1.447144 -0.346996 +v -0.586949 1.447104 -0.346968 +v -0.601550 1.455442 -0.332629 +v -1.155780 1.455486 -0.332546 +v -1.155780 1.455486 -0.332546 +v -1.155766 1.472177 -0.332557 +v -1.171787 1.472179 -0.332557 +v -1.155766 1.472177 -0.361457 +v -1.155780 1.455486 -0.361446 +v -1.171787 1.472179 -0.361457 +v -1.155780 1.455486 -0.332546 +v -1.171787 1.472179 -0.332557 +v -1.171787 1.472179 -0.332557 +v -1.171787 1.472179 -0.332557 +v -1.179854 1.480535 -0.347007 +v -1.179854 1.480535 -0.347007 +v -1.179854 1.480535 -0.347007 +v -1.171787 1.472179 -0.361457 +v -1.171787 1.472179 -0.361457 +v -1.236537 1.472195 -0.361446 +v -1.171787 1.472179 -0.361457 +v -1.155780 1.455486 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.155780 1.455486 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.155780 1.455486 -0.361446 +v -1.155780 1.447144 -0.346996 +v -1.248996 1.445791 -0.346996 +v -1.155780 1.447144 -0.346996 +v -1.155780 1.455486 -0.332546 +v -1.248996 1.445791 -0.346996 +v -1.155780 1.455486 -0.332546 +v -1.155780 1.455486 -0.332546 +v -1.236537 1.472195 -0.332546 +v -1.264335 1.465568 -0.332546 +v -1.236537 1.472195 -0.332546 +v -1.264335 1.465568 -0.332546 +v -1.236537 1.472195 -0.332546 +v -1.236636 1.480537 -0.346996 +v -1.269448 1.472160 -0.346996 +v -1.236636 1.480537 -0.346996 +v -1.269448 1.472160 -0.346996 +v -1.236636 1.480537 -0.346996 +v -1.236537 1.472195 -0.361446 +v -1.264336 1.465568 -0.361446 +v -1.236537 1.472195 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.264336 1.465568 -0.361446 +v -1.248996 1.445791 -0.346996 +v -1.155780 1.455486 -0.332546 +v -1.254110 1.452384 -0.332546 +v -1.254110 1.452384 -0.332546 +v -1.254110 1.452384 -0.332546 +v -1.264335 1.465568 -0.332546 +v -1.281743 1.444267 -0.332546 +v -1.264335 1.465568 -0.332546 +v -1.281743 1.444267 -0.332546 +v -1.264335 1.465568 -0.332546 +v -1.269448 1.472160 -0.346996 +v -1.289974 1.445631 -0.346996 +v -1.269448 1.472160 -0.346996 +v -1.289974 1.445631 -0.346996 +v -1.269448 1.472160 -0.346996 +v -1.264336 1.465568 -0.361446 +v -1.281743 1.444267 -0.361446 +v -1.264336 1.465568 -0.361446 +v -1.281743 1.444267 -0.361446 +v -1.264336 1.465568 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.265282 1.441541 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.265282 1.441541 -0.361446 +v -1.254110 1.452384 -0.361446 +v -1.248996 1.445791 -0.346996 +v -1.257051 1.440177 -0.346996 +v -1.248996 1.445791 -0.346996 +v -1.265282 1.441541 -0.332546 +v -1.257051 1.440177 -0.346996 +v -1.248996 1.445791 -0.346996 +v -1.254110 1.452384 -0.332546 +v -1.265282 1.441541 -0.332546 +v -1.289974 1.445631 -0.346996 +v -1.281743 1.444267 -0.361446 +v -1.281743 1.444267 -0.361446 +v -1.289994 1.397097 -0.346996 +v -1.281659 1.397097 -0.361446 +v -1.281743 1.444267 -0.361446 +v -1.264987 1.397097 -0.361446 +v -1.281743 1.444267 -0.361446 +v -1.265282 1.441541 -0.361446 +v -1.264987 1.397097 -0.361446 +v -1.265282 1.441541 -0.361446 +v -1.257051 1.440177 -0.346996 +v 0.381154 1.440538 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.381154 1.440538 -0.361447 +v 0.397818 1.441383 -0.361447 +v 0.371067 1.445092 -0.346997 +v 0.380231 1.397095 -0.361446 +v 0.371067 1.445092 -0.346997 +v 0.371888 1.397095 -0.346997 +v 0.381154 1.440537 -0.332547 +v 0.381154 1.440537 -0.332547 +v 0.371888 1.397095 -0.346997 +v 0.397818 1.441383 -0.361447 +v 0.380231 1.397095 -0.361446 +v 0.397818 1.441383 -0.361447 +v 0.406150 1.441805 -0.346997 +v 0.406150 1.441805 -0.346997 +v 0.397818 1.441383 -0.332546 +v 0.405259 1.397095 -0.346997 +v 0.396917 1.397095 -0.361447 +v 0.406150 1.441805 -0.346997 +v 0.397818 1.441383 -0.332546 +v 0.405259 1.397095 -0.346997 +v 0.397818 1.441383 -0.332546 +v 0.381154 1.440537 -0.332547 +v 0.380231 1.397095 -0.332546 +v 0.381154 1.440537 -0.332547 +v 0.387445 1.397095 -0.332546 +v 0.381154 1.440537 -0.332547 +v 0.387456 1.397095 -0.332547 +v 0.396917 1.397095 -0.332547 +v 0.381154 1.440537 -0.332547 +v -1.265282 1.441541 -0.332546 +v -1.257051 1.440177 -0.346996 +v -1.265282 1.441541 -0.332546 +v -1.281743 1.444267 -0.332546 +v -1.281743 1.444267 -0.332546 +v -1.264987 1.397097 -0.332546 +v -1.281743 1.444267 -0.332546 +v -1.289974 1.445631 -0.346996 +v -1.289974 1.445631 -0.346996 +v -1.289994 1.397097 -0.346996 +v -1.281659 1.397097 -0.332546 +v -1.264987 1.397097 -0.361446 +v -1.257051 1.440177 -0.346996 +v -1.264987 1.397097 -0.332546 +v -1.256652 1.397097 -0.346996 +v -1.257051 1.440177 -0.346996 +v -0.307056 0.094251 0.071849 +v -0.292578 0.094251 0.065413 +v -0.307056 0.094251 0.071849 +v -0.292075 0.095761 0.910208 +v -0.307056 0.094251 0.071849 +v -0.307192 0.100167 0.910132 +v -0.307056 0.115094 0.084720 +v -0.307056 0.115094 0.084720 +v -0.307192 0.100167 0.910132 +v -0.307056 0.115094 0.084720 +v -0.307054 0.110567 0.910064 +v -0.292578 0.120427 0.091155 +v -0.292578 0.120427 0.091155 +v -0.307054 0.110567 0.910064 +v -0.292578 0.120427 0.091155 +v -0.292067 0.118629 0.910036 +v -0.278101 0.115094 0.084720 +v -0.278101 0.115094 0.084720 +v -0.292067 0.118629 0.910036 +v -0.278101 0.115094 0.084720 +v -0.278101 0.110565 0.910073 +v -0.278101 0.094251 0.071849 +v -0.278101 0.094251 0.071849 +v -0.278101 0.110565 0.910073 +v -0.278101 0.094251 0.071849 +v -0.278263 0.100553 0.910141 +v -0.292578 0.094251 0.065413 +v -0.278263 0.100553 0.910141 +v -0.292075 0.095761 0.910208 +v -0.292578 0.094251 0.065413 +v -0.601498 0.093258 0.092887 +v -0.587020 0.084905 0.092576 +v -0.601498 0.093258 0.092887 +v -0.587005 0.096190 0.910078 +v -0.601498 0.093258 0.092887 +v -0.601497 0.093851 0.910043 +v -0.601498 0.115094 0.084720 +v -0.601498 0.115094 0.084720 +v -0.601497 0.093851 0.910043 +v -0.572543 0.093257 0.092886 +v -0.587020 0.084905 0.092576 +v -0.572545 0.093849 0.910052 +v -0.587005 0.096190 0.910078 +v -0.587020 0.084905 0.092576 +v -0.601498 0.115094 0.084720 +v -0.601496 0.110514 0.910021 +v -0.587020 0.120428 0.091155 +v -0.587020 0.120428 0.091155 +v -0.601496 0.110514 0.910021 +v -0.587020 0.120428 0.091155 +v -0.587019 0.118924 0.910021 +v -0.572543 0.115094 0.084720 +v -0.587019 0.118924 0.910021 +v -0.572543 0.115094 0.084720 +v -0.572543 0.115094 0.084720 +v -0.572544 0.110565 0.910021 +v -0.572543 0.093257 0.092886 +v -0.572543 0.093257 0.092886 +v -0.572544 0.110565 0.910021 +v -0.572545 0.093849 0.910052 +v -1.497860 0.668499 0.477396 +v -1.497900 0.669545 0.252358 +v -1.497860 0.668499 0.477396 +v -1.497900 0.692191 0.252964 +v -1.497860 0.685681 0.477396 +v -1.497900 0.692191 0.252964 +v -1.482926 0.698154 0.257693 +v -1.482979 0.694272 0.477396 +v -1.482926 0.698154 0.257693 +v -1.482979 0.694272 0.477396 +v -1.467952 0.694141 0.249813 +v -1.467952 0.694141 0.249813 +v -1.482979 0.659907 0.477396 +v -1.497900 0.669545 0.252358 +v -1.467952 0.694141 0.249813 +v -1.468099 0.668499 0.477396 +v -1.468099 0.668499 0.477396 +v -1.482926 0.661201 0.250097 +v -1.467952 0.669545 0.252358 +v -1.468099 0.668499 0.477396 +v -1.482979 0.659907 0.477396 +v -1.482926 0.661201 0.250097 +v -1.482926 0.661201 0.250097 +v -1.482926 0.661201 0.250097 +v -1.497900 0.669545 0.252358 +v -1.497900 0.686715 0.234200 +v -1.497900 0.669545 0.252358 +v -1.497900 0.692191 0.252964 +v -1.497900 0.686715 0.234200 +v -1.467952 0.694141 0.249813 +v -1.467952 0.669545 0.252358 +v -1.467952 0.669545 0.252358 +v -1.482926 0.683001 0.226393 +v -1.467952 0.686714 0.234200 +v -1.467952 0.669545 0.252358 +v -1.482926 0.661201 0.250097 +v -1.482926 0.683001 0.226393 +v -1.482926 0.683001 0.226393 +v -1.482926 0.683001 0.226393 +v -1.497900 0.686715 0.234200 +v -1.497899 1.450291 0.228780 +v -1.497900 0.686715 0.234200 +v -1.497899 1.450291 0.228780 +v -1.497900 0.686715 0.234200 +v -1.497900 0.692191 0.252964 +v -1.497899 1.462561 0.240963 +v -1.497900 0.692191 0.252964 +v -1.497899 1.462561 0.240963 +v -1.497900 0.692191 0.252964 +v -1.482926 0.698154 0.257693 +v -1.482925 1.468695 0.247054 +v -1.482926 0.698154 0.257693 +v -1.482925 1.468695 0.247054 +v -1.482926 0.698154 0.257693 +v -1.467952 0.694141 0.249813 +v -1.467951 1.462561 0.240963 +v -1.467952 0.694141 0.249813 +v -1.467951 1.462561 0.240963 +v -1.467952 0.694141 0.249813 +v -1.467952 0.686714 0.234200 +v -1.467951 1.447184 0.227851 +v -1.467952 0.686714 0.234200 +v -1.482925 1.444157 0.222690 +v -1.467951 1.447184 0.227851 +v -1.467952 0.686714 0.234200 +v -1.482926 0.683001 0.226393 +v -1.482925 1.444157 0.222690 +v -1.482925 1.444157 0.222690 +v -1.482925 1.444157 0.222690 +v -1.497899 1.450291 0.228780 +v -1.497899 1.449471 -0.332978 +v -1.497899 1.450291 0.228780 +v -1.497899 1.449471 -0.332978 +v -1.497899 1.450291 0.228780 +v -1.497899 1.462561 0.240963 +v -1.497899 1.472101 -0.320973 +v -1.497899 1.462561 0.240963 +v -1.497899 1.472101 -0.320973 +v -1.497899 1.462561 0.240963 +v -1.482925 1.468695 0.247054 +v -1.482924 1.480746 -0.321005 +v -1.482925 1.468695 0.247054 +v -1.482924 1.480746 -0.321005 +v -1.482925 1.468695 0.247054 +v -1.467951 1.462561 0.240963 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.462561 0.240963 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.462561 0.240963 +v -1.467951 1.447184 0.227851 +v -1.467951 1.454811 -0.320908 +v -1.467951 1.447184 0.227851 +v -1.482925 1.443342 -0.326881 +v -1.467951 1.454811 -0.320908 +v -1.467951 1.447184 0.227851 +v -1.482925 1.444157 0.222690 +v -1.482925 1.443342 -0.326881 +v -1.497899 1.472101 -0.320973 +v -1.482924 1.480746 -0.321005 +v -1.482924 1.480746 -0.321005 +v -1.467951 1.472101 -0.320973 +v -1.497899 1.449471 -0.332978 +v -1.497899 1.472101 -0.320973 +v -1.497899 1.472101 -0.320973 +v -1.482925 1.467860 -0.351266 +v -1.482925 1.467860 -0.351266 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.472101 -0.320973 +v -1.467951 1.454811 -0.320908 +v -1.467952 1.444925 -0.336195 +v -1.467951 1.454811 -0.320908 +v -1.482925 1.443342 -0.326881 +v -1.467952 1.444925 -0.336195 +v -1.497899 1.449471 -0.332978 +v -1.497899 1.461730 -0.345170 +v -1.497899 1.461730 -0.345170 +v -1.482925 1.467860 -0.351266 +v -1.482925 1.467860 -0.351266 +v -1.467952 1.461730 -0.345170 +v -1.467952 1.461730 -0.345170 +v -1.467952 1.444925 -0.336195 +v -1.497900 1.440084 -0.355280 +v -1.482925 1.467860 -0.351266 +v -1.482925 1.467860 -0.351266 +v -1.467952 1.440084 -0.355281 +v -1.497899 1.449471 -0.332978 +v -1.497900 1.440084 -0.355280 +v -1.497900 1.440084 -0.355280 +v -1.497899 1.397098 -0.355443 +v -1.482990 1.397098 -0.364135 +v -1.497900 1.440084 -0.355280 +v -1.482925 1.440333 -0.363922 +v -1.482925 1.440333 -0.363922 +v -1.467952 1.440084 -0.355281 +v -1.482925 1.440333 -0.363922 +v -1.467999 1.397098 -0.355555 +v -1.482990 1.397098 -0.364135 +v -1.467952 1.444925 -0.336195 +v -1.482925 1.443342 -0.326881 +v -1.482925 1.443342 -0.326881 +v -1.482925 1.397098 -0.329592 +v -1.497819 1.397098 -0.338191 +v -1.482925 1.443342 -0.326881 +v -1.497899 1.449471 -0.332978 +v -1.497899 1.397098 -0.355443 +v -1.497819 1.397098 -0.338191 +v -1.497899 1.449471 -0.332978 +v -1.467952 1.440084 -0.355281 +v -1.467952 1.444925 -0.336195 +v -1.467999 1.397098 -0.355555 +v -1.467952 1.440084 -0.355281 +v -1.482925 1.397098 -0.329592 +v -1.467952 1.397098 -0.338237 +v -1.467952 1.444925 -0.336195 +v 0.585263 0.668496 0.477378 +v 0.585223 0.669543 0.252340 +v 0.585263 0.668496 0.477378 +v 0.585223 0.692189 0.252946 +v 0.585263 0.685679 0.477378 +v 0.585223 0.692189 0.252946 +v 0.600197 0.698152 0.257674 +v 0.600144 0.694270 0.477378 +v 0.600197 0.698152 0.257674 +v 0.600144 0.694270 0.477378 +v 0.615171 0.694139 0.249795 +v 0.615171 0.694139 0.249795 +v 0.600144 0.659905 0.477378 +v 0.585223 0.669543 0.252340 +v 0.615171 0.694139 0.249795 +v 0.615024 0.668496 0.477378 +v 0.615024 0.668496 0.477378 +v 0.600197 0.661199 0.250078 +v 0.615171 0.669543 0.252340 +v 0.615024 0.668496 0.477378 +v 0.600144 0.659905 0.477378 +v 0.600197 0.661199 0.250078 +v 0.600197 0.661199 0.250078 +v 0.600197 0.661199 0.250078 +v 0.585223 0.669543 0.252340 +v 0.585223 0.686712 0.234181 +v 0.585223 0.669543 0.252340 +v 0.585223 0.692189 0.252946 +v 0.585223 0.686712 0.234181 +v 0.615171 0.694139 0.249795 +v 0.615171 0.669543 0.252340 +v 0.615171 0.669543 0.252340 +v 0.600197 0.682999 0.226374 +v 0.615171 0.686712 0.234181 +v 0.615171 0.669543 0.252340 +v 0.600197 0.661199 0.250078 +v 0.600197 0.682999 0.226374 +v 0.600197 0.682999 0.226374 +v 0.600197 0.682999 0.226374 +v 0.585223 0.686712 0.234181 +v 0.585224 1.450289 0.228762 +v 0.585223 0.686712 0.234181 +v 0.585224 1.450289 0.228762 +v 0.585223 0.686712 0.234181 +v 0.585223 0.692189 0.252946 +v 0.585224 1.462559 0.240944 +v 0.585223 0.692189 0.252946 +v 0.585224 1.462559 0.240944 +v 0.585223 0.692189 0.252946 +v 0.600197 0.698152 0.257674 +v 0.600198 1.468693 0.247036 +v 0.600197 0.698152 0.257674 +v 0.600198 1.468693 0.247036 +v 0.600197 0.698152 0.257674 +v 0.615171 0.694139 0.249795 +v 0.615172 1.462559 0.240944 +v 0.615171 0.694139 0.249795 +v 0.615172 1.462559 0.240944 +v 0.615171 0.694139 0.249795 +v 0.615171 0.686712 0.234181 +v 0.615172 1.447181 0.227832 +v 0.615171 0.686712 0.234181 +v 0.600198 1.444155 0.222671 +v 0.615172 1.447181 0.227832 +v 0.615171 0.686712 0.234181 +v 0.600197 0.682999 0.226374 +v 0.600198 1.444155 0.222671 +v 0.600198 1.444155 0.222671 +v 0.600198 1.444155 0.222671 +v 0.585224 1.450289 0.228762 +v 0.585224 1.449469 -0.332997 +v 0.585224 1.450289 0.228762 +v 0.585224 1.449469 -0.332997 +v 0.585224 1.450289 0.228762 +v 0.585224 1.462559 0.240944 +v 0.585224 1.472099 -0.320992 +v 0.585224 1.462559 0.240944 +v 0.585224 1.472099 -0.320992 +v 0.585224 1.462559 0.240944 +v 0.600198 1.468693 0.247036 +v 0.600198 1.480744 -0.321024 +v 0.600198 1.468693 0.247036 +v 0.600198 1.480744 -0.321024 +v 0.600198 1.468693 0.247036 +v 0.615172 1.462559 0.240944 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.462559 0.240944 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.462559 0.240944 +v 0.615172 1.447181 0.227832 +v 0.615172 1.454809 -0.320927 +v 0.615172 1.447181 0.227832 +v 0.600198 1.443340 -0.326900 +v 0.615172 1.454809 -0.320927 +v 0.615172 1.447181 0.227832 +v 0.600198 1.444155 0.222671 +v 0.600198 1.443340 -0.326900 +v 0.585224 1.472099 -0.320992 +v 0.600198 1.480744 -0.321024 +v 0.600198 1.480744 -0.321024 +v 0.615172 1.472099 -0.320992 +v 0.585224 1.449469 -0.332997 +v 0.585224 1.472099 -0.320992 +v 0.585224 1.472099 -0.320992 +v 0.600197 1.467858 -0.351285 +v 0.600197 1.467858 -0.351285 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.472099 -0.320992 +v 0.615172 1.454809 -0.320927 +v 0.615171 1.444923 -0.336214 +v 0.615172 1.454809 -0.320927 +v 0.600198 1.443340 -0.326900 +v 0.615171 1.444923 -0.336214 +v 0.585224 1.449469 -0.332997 +v 0.585224 1.461728 -0.345189 +v 0.585224 1.461728 -0.345189 +v 0.600197 1.467858 -0.351285 +v 0.600197 1.467858 -0.351285 +v 0.615171 1.461728 -0.345189 +v 0.615171 1.461728 -0.345189 +v 0.615171 1.444923 -0.336214 +v 0.585223 1.440082 -0.355299 +v 0.600197 1.467858 -0.351285 +v 0.600197 1.467858 -0.351285 +v 0.615171 1.440082 -0.355299 +v 0.585224 1.449469 -0.332997 +v 0.585223 1.440082 -0.355299 +v 0.585223 1.440082 -0.355299 +v 0.585224 1.397096 -0.355461 +v 0.600133 1.397096 -0.364154 +v 0.585223 1.440082 -0.355299 +v 0.600197 1.440331 -0.363941 +v 0.600197 1.440331 -0.363941 +v 0.615171 1.440082 -0.355299 +v 0.600197 1.440331 -0.363941 +v 0.615123 1.397096 -0.355573 +v 0.600133 1.397096 -0.364154 +v 0.615171 1.444923 -0.336214 +v 0.600198 1.443340 -0.326900 +v 0.600198 1.443340 -0.326900 +v 0.600197 1.397096 -0.329611 +v 0.585303 1.397096 -0.338210 +v 0.600198 1.443340 -0.326900 +v 0.585224 1.449469 -0.332997 +v 0.585224 1.397096 -0.355461 +v 0.585303 1.397096 -0.338210 +v 0.585224 1.449469 -0.332997 +v 0.615171 1.440082 -0.355299 +v 0.615171 1.444923 -0.336214 +v 0.615123 1.397096 -0.355573 +v 0.615171 1.440082 -0.355299 +v 0.600197 1.397096 -0.329611 +v 0.615171 1.397096 -0.338256 +v 0.615171 1.444923 -0.336214 +v -0.466116 0.106945 2.347295 +v -0.466116 0.127242 2.357770 +v -0.466116 0.106945 2.347295 +v -0.449682 0.127267 2.367258 +v -0.449682 0.094779 2.341581 +v -0.449682 0.127267 2.367258 +v -0.449682 0.094779 2.341581 +v -0.433248 0.127242 2.357770 +v -0.433248 0.100781 2.326608 +v -0.433248 0.127242 2.357770 +v -0.449682 0.124829 2.328056 +v -0.466116 0.123353 2.338130 +v -0.466115 0.661664 2.338843 +v -0.466116 0.123353 2.338130 +v -0.466115 0.661664 2.338843 +v -0.466116 0.123353 2.338130 +v -0.466116 0.127242 2.357770 +v -0.466115 0.664713 2.358441 +v -0.466116 0.127242 2.357770 +v -0.466115 0.664713 2.358441 +v -0.466116 0.127242 2.357770 +v -0.449682 0.127267 2.367258 +v -0.449681 0.662700 2.367486 +v -0.449682 0.127267 2.367258 +v -0.449681 0.662700 2.367486 +v -0.449682 0.127267 2.367258 +v -0.433248 0.127242 2.357770 +v -0.433248 0.661620 2.357819 +v -0.433248 0.127242 2.357770 +v -0.433248 0.661620 2.357819 +v -0.433248 0.127242 2.357770 +v -0.433248 0.123353 2.338130 +v -0.433248 0.661664 2.338843 +v -0.433248 0.123353 2.338130 +v -0.449681 0.661686 2.329355 +v -0.433248 0.661664 2.338843 +v -0.433248 0.123353 2.338130 +v -0.449682 0.124829 2.328056 +v -0.449681 0.661686 2.329355 +v -0.449681 0.662700 2.367486 +v -0.433248 0.661620 2.357819 +v -0.433248 0.661620 2.357819 +v -0.433248 0.661664 2.338843 +v -0.433248 0.671832 2.362039 +v -0.449681 0.661686 2.329355 +v -0.449681 0.661686 2.329355 +v -0.466115 0.661664 2.338843 +v -0.466114 0.693041 2.361220 +v -0.466115 0.661664 2.338843 +v -0.466115 0.664713 2.358441 +v -0.466114 0.693041 2.361220 +v -0.433248 0.671832 2.362039 +v -0.433248 0.661664 2.338843 +v -0.433248 0.661664 2.338843 +v -0.449681 0.702079 2.358333 +v -0.433248 0.693041 2.361220 +v -0.433248 0.661664 2.338843 +v -0.449681 0.661686 2.329355 +v -0.449681 0.702079 2.358333 +v -0.466114 0.693041 2.361220 +v -0.466115 0.664713 2.358441 +v -0.466115 0.664713 2.358441 +v -0.449681 0.662700 2.367486 +v -0.466116 0.123353 2.338130 +v -0.449682 0.124829 2.328056 +v -0.466116 0.123353 2.338130 +v -0.449682 0.124019 2.112728 +v -0.466116 0.123353 2.338130 +v -0.466115 0.114532 2.112725 +v -0.466116 0.106945 2.347295 +v -0.466116 0.106945 2.347295 +v -0.466115 0.114532 2.112725 +v -0.466116 0.106945 2.347295 +v -0.466112 0.095554 2.112725 +v -0.449682 0.094779 2.341581 +v -0.449682 0.094779 2.341581 +v -0.466112 0.095554 2.112725 +v -0.449682 0.094779 2.341581 +v -0.449663 0.096334 2.112726 +v -0.433248 0.100781 2.326608 +v -0.449663 0.096334 2.112726 +v -0.433248 0.100781 2.326608 +v -0.433248 0.100781 2.326608 +v -0.433248 0.095564 2.112732 +v -0.433248 0.123353 2.338130 +v -0.433248 0.123353 2.338130 +v -0.449682 0.124829 2.328056 +v -0.449682 0.124019 2.112728 +v -0.449682 0.124829 2.328056 +v -0.449675 0.124016 2.112728 +v -0.449682 0.124829 2.328056 +v -0.433248 0.114532 2.112733 +v -0.433248 0.123353 2.338130 +v -0.433248 0.095564 2.112732 +v -0.449681 0.662700 2.367486 +v -0.433248 0.671832 2.362039 +v -0.433248 0.671832 2.362039 +v -0.433317 0.676592 2.698729 +v -0.433273 0.695542 2.698728 +v -0.433248 0.671832 2.362039 +v -0.433248 0.693041 2.361220 +v -0.466114 0.675520 2.372075 +v -0.449681 0.662700 2.367486 +v -0.449681 0.662700 2.367486 +v -0.433317 0.676592 2.698729 +v -0.449681 0.702079 2.358333 +v -0.465995 0.695641 2.699864 +v -0.449681 0.702079 2.358333 +v -0.466114 0.693041 2.361220 +v -0.466114 0.693041 2.361220 +v -0.466089 0.676719 2.699867 +v -0.466114 0.693041 2.361220 +v -0.466114 0.675520 2.372075 +v -0.466089 0.676719 2.699867 +v -0.466114 0.675520 2.372075 +v -0.449769 0.667176 2.699296 +v -0.449681 0.702079 2.358333 +v -0.449592 0.705025 2.699290 +v -0.433248 0.693041 2.361220 +v -0.433248 0.693041 2.361220 +v -0.449592 0.705025 2.699290 +v -0.433273 0.695542 2.698728 +v -0.443805 3.209780 3.449959 +v -0.443805 3.183812 3.439444 +v -0.443805 3.209780 3.449959 +v -0.443805 3.209780 3.449959 +v -0.443805 3.209780 3.449959 +v -0.458152 3.203918 3.455812 +v -0.458152 3.203918 3.455812 +v -0.458152 3.192196 3.467518 +v -0.458152 3.211245 3.475512 +v -0.429459 3.192196 3.467518 +v -0.429459 3.203918 3.455812 +v -0.429459 3.203918 3.455812 +v -0.443805 3.219528 3.475507 +v -0.429459 3.203918 3.455812 +v -0.443805 3.209780 3.449959 +v -0.443805 3.219528 3.475507 +v -0.458152 3.211245 3.475512 +v -0.458152 3.211244 4.092529 +v -0.458152 3.211245 3.475512 +v -0.458152 3.192196 3.467518 +v -0.458152 3.192196 3.467518 +v -0.458152 3.192196 3.467518 +v -0.429459 3.192196 3.467518 +v -0.429459 3.192196 3.467518 +v -0.429459 3.192196 3.467518 +v -0.429459 3.211245 3.475512 +v -0.429459 3.211245 3.475512 +v -0.443805 3.219527 4.092540 +v -0.429459 3.211245 3.475512 +v -0.443805 3.219528 3.475507 +v -0.443805 3.219527 4.092540 +v -0.443805 3.219527 4.092540 +v -0.443805 3.219527 4.092540 +v -0.458152 3.211244 4.092529 +v -0.458152 3.211244 4.092529 +v -0.458152 3.188301 4.102205 +v -0.429458 3.188301 4.102205 +v -0.429458 3.211244 4.092529 +v -0.429458 3.211244 4.092529 +v -0.443805 3.209200 4.117404 +v -0.429458 3.203329 4.111561 +v -0.429458 3.211244 4.092529 +v -0.443805 3.219527 4.092540 +v -0.443805 3.209200 4.117404 +v -0.443805 3.209200 4.117404 +v -0.443805 3.209200 4.117404 +v -0.458152 3.203329 4.111561 +v -0.458152 3.203329 4.111561 +v -0.458152 3.188301 4.102205 +v -0.429458 3.188301 4.102205 +v -0.429458 3.203329 4.111561 +v -0.429458 3.203329 4.111561 +v -0.443805 3.184472 4.128129 +v -0.429458 3.203329 4.111561 +v -0.443805 3.209200 4.117404 +v -0.443805 3.184472 4.128129 +v -0.443805 3.184472 4.128129 +v -0.443805 3.184472 4.128129 +v -0.458152 3.184475 4.119846 +v -0.458152 3.184475 4.119846 +v -0.458152 3.184475 4.119846 +v -0.458152 3.188301 4.102205 +v -0.458152 3.188301 4.102205 +v -0.458152 3.188301 4.102205 +v -0.443805 3.186088 4.093656 +v -0.443805 3.186088 4.093656 +v -0.443809 0.094247 4.092418 +v -0.443805 3.186088 4.093656 +v -0.429458 3.188301 4.102205 +v -0.429458 3.188301 4.102205 +v -0.429458 3.188301 4.102205 +v -0.429458 3.184475 4.119846 +v -0.429458 3.184475 4.119846 +v -0.443809 0.094247 4.125552 +v -0.429458 3.184475 4.119846 +v -0.443805 3.184472 4.128129 +v -0.443809 0.094247 4.125552 +v -0.458152 3.183558 3.447723 +v -0.443805 3.183812 3.439444 +v -0.443805 3.183812 3.439444 +v -0.443807 3.148010 3.439536 +v -0.458152 3.183558 3.447723 +v -0.443807 3.148010 3.439536 +v -0.458152 3.183558 3.447723 +v -0.458152 3.148010 3.447819 +v -0.458152 3.192196 3.467518 +v -0.458152 3.192196 3.467518 +v -0.458152 3.148010 3.447819 +v -0.458152 3.192196 3.467518 +v -0.458152 3.148010 3.464385 +v -0.443805 3.186335 3.473371 +v -0.443805 3.186335 3.473371 +v -0.458152 3.148010 3.464385 +v -0.443805 3.186335 3.473371 +v -0.458152 3.148010 3.464385 +v -0.443805 3.186335 3.473371 +v -0.443805 3.148010 3.472668 +v -0.429459 3.192196 3.467518 +v -0.458151 3.148010 3.464386 +v -0.458152 3.148010 3.464385 +v -0.443805 3.186335 3.473371 +v -0.429459 3.192196 3.467518 +v -0.443805 3.148010 3.472668 +v -0.429459 3.192196 3.467518 +v -0.443804 3.148010 3.472667 +v -0.429459 3.192196 3.467518 +v -0.429459 3.148010 3.464385 +v -0.429459 3.183558 3.447723 +v -0.429459 3.183558 3.447723 +v -0.429459 3.148010 3.464385 +v -0.429459 3.183558 3.447723 +v -0.429459 3.148010 3.447819 +v -0.443805 3.183812 3.439444 +v -0.443805 3.183812 3.439444 +v -0.429459 3.148010 3.447819 +v -0.443805 3.148010 3.439536 +v -0.443805 3.183812 3.439444 +vt 0.553158 0.969055 +vt 0.556971 0.967589 +vt 0.553158 0.968707 +vt 0.556971 0.967937 +vt 0.556971 0.965353 +vt 0.549345 0.965700 +vt 0.549345 0.967937 +vt 0.549345 0.967589 +vt 0.553158 0.876089 +vt 0.556971 0.877194 +vt 0.553158 0.876076 +vt 0.554034 0.876346 +vt 0.556971 0.877207 +vt 0.556971 0.879430 +vt 0.556971 0.878253 +vt 0.556971 0.879444 +vt 0.553158 0.880547 +vt 0.556970 0.879444 +vt 0.556614 0.879548 +vt 0.553158 0.880562 +vt 0.556374 0.879619 +vt 0.549345 0.879430 +vt 0.552650 0.880413 +vt 0.550724 0.879848 +vt 0.550150 0.879680 +vt 0.549345 0.879444 +vt 0.549345 0.877194 +vt 0.549346 0.877207 +vt 0.550904 0.876750 +vt 0.512968 0.424220 +vt 0.516816 0.421421 +vt 0.512968 0.420552 +vt 0.516816 0.424262 +vt 0.516816 0.423159 +vt 0.516816 0.424346 +vt 0.512968 0.424388 +vt 0.509121 0.424346 +vt 0.509121 0.423159 +vt 0.509121 0.421421 +vt 0.509121 0.424262 +vt 0.516816 0.420522 +vt 0.512968 0.419393 +vt 0.516816 0.422778 +vt 0.512968 0.423907 +vt 0.512968 0.424028 +vt 0.509121 0.422778 +vt 0.509121 0.420522 +vt 0.512968 0.424272 +vt 0.516816 0.423143 +vt 0.509121 0.423143 +vt 0.509121 0.420887 +vt 0.512968 0.422912 +vt 0.516816 0.422126 +vt 0.509121 0.422126 +vt 0.509121 0.420553 +vt 0.512968 0.419767 +vt 0.512968 0.419758 +vt 0.516816 0.419580 +vt 0.512968 0.419569 +vt 0.516816 0.420553 +vt 0.516816 0.419601 +vt 0.512968 0.419612 +vt 0.509121 0.419601 +vt 0.509121 0.419580 +vt 0.516792 0.366813 +vt 0.512999 0.364877 +vt 0.516820 0.366817 +vt 0.509065 0.366813 +vt 0.591216 0.424220 +vt 0.595064 0.421421 +vt 0.591216 0.420552 +vt 0.595064 0.424262 +vt 0.595064 0.423159 +vt 0.595064 0.424346 +vt 0.591216 0.424388 +vt 0.587369 0.424346 +vt 0.587369 0.423159 +vt 0.587369 0.421421 +vt 0.587369 0.424262 +vt 0.595064 0.420522 +vt 0.591216 0.419393 +vt 0.595064 0.422778 +vt 0.591216 0.423907 +vt 0.591216 0.424028 +vt 0.587369 0.422778 +vt 0.587369 0.420522 +vt 0.595064 0.420887 +vt 0.591216 0.419758 +vt 0.595064 0.423143 +vt 0.591216 0.424272 +vt 0.587369 0.423143 +vt 0.587369 0.420887 +vt 0.595064 0.420553 +vt 0.591216 0.419767 +vt 0.595064 0.422126 +vt 0.591216 0.422912 +vt 0.587369 0.422126 +vt 0.587369 0.420553 +vt 0.595064 0.419580 +vt 0.591216 0.419569 +vt 0.595064 0.419601 +vt 0.591216 0.419612 +vt 0.587369 0.419601 +vt 0.587369 0.419580 +vt 0.595078 0.366813 +vt 0.591198 0.364877 +vt 0.595078 0.366817 +vt 0.591197 0.364883 +vt 0.587326 0.366817 +vt 0.587326 0.366813 +vt 0.740210 0.364872 +vt 0.742357 0.362920 +vt 0.740226 0.364870 +vt 0.742361 0.362921 +vt 0.746621 0.362919 +vt 0.746618 0.362921 +vt 0.748752 0.364870 +vt 0.748762 0.364872 +vt 0.746621 0.366821 +vt 0.746618 0.366823 +vt 0.742357 0.366821 +vt 0.742361 0.366823 +vt 0.744489 0.371397 +vt 0.741192 0.371174 +vt 0.738119 0.370522 +vt 0.735480 0.369485 +vt 0.733455 0.368133 +vt 0.732182 0.366559 +vt 0.731748 0.364870 +vt 0.732182 0.363181 +vt 0.733455 0.361607 +vt 0.735480 0.360255 +vt 0.738119 0.359218 +vt 0.741192 0.358566 +vt 0.744489 0.358344 +vt 0.747787 0.358566 +vt 0.750859 0.359218 +vt 0.753498 0.360255 +vt 0.755523 0.361607 +vt 0.756796 0.363181 +vt 0.757230 0.364870 +vt 0.756796 0.366559 +vt 0.755523 0.368133 +vt 0.753498 0.369485 +vt 0.750859 0.370522 +vt 0.747787 0.371174 +vt 0.355930 0.364872 +vt 0.358068 0.362920 +vt 0.355936 0.364870 +vt 0.358056 0.362921 +vt 0.362331 0.362919 +vt 0.362335 0.362921 +vt 0.364463 0.364870 +vt 0.364455 0.364872 +vt 0.362331 0.366821 +vt 0.362335 0.366823 +vt 0.358068 0.366821 +vt 0.358056 0.366823 +vt 0.360199 0.371397 +vt 0.356902 0.371174 +vt 0.353829 0.370522 +vt 0.351190 0.369485 +vt 0.349165 0.368133 +vt 0.347893 0.366559 +vt 0.347459 0.364870 +vt 0.347893 0.363181 +vt 0.349165 0.361607 +vt 0.351190 0.360255 +vt 0.353829 0.359218 +vt 0.356902 0.358566 +vt 0.360199 0.358344 +vt 0.363497 0.358566 +vt 0.366570 0.359218 +vt 0.369208 0.360255 +vt 0.371233 0.361607 +vt 0.372506 0.363181 +vt 0.372940 0.364870 +vt 0.372506 0.366559 +vt 0.371233 0.368133 +vt 0.369208 0.369485 +vt 0.366570 0.370522 +vt 0.363497 0.371174 +vt 0.327282 0.364873 +vt 0.329496 0.362922 +vt 0.332919 0.362922 +vt 0.335377 0.362922 +vt 0.333925 0.362922 +vt 0.336605 0.364873 +vt 0.336139 0.364873 +vt 0.335377 0.366824 +vt 0.333925 0.366824 +vt 0.337535 0.366824 +vt 0.337605 0.366824 +vt 0.332919 0.366824 +vt 0.337501 0.364873 +vt 0.331690 0.364873 +vt 0.337535 0.362922 +vt 0.362340 0.362922 +vt 0.513043 0.362922 +vt 0.362340 0.364873 +vt 0.362340 0.366824 +vt 0.513018 0.364883 +vt 0.591182 0.362922 +vt 0.591194 0.362922 +vt 0.742364 0.366824 +vt 0.742364 0.362922 +vt 0.742364 0.364873 +vt 0.746616 0.366824 +vt 0.591216 0.534582 +vt 0.587369 0.534582 +vt 0.587369 0.534586 +vt 0.829303 0.441843 +vt 0.825324 0.443010 +vt 0.825324 0.443340 +vt 0.829317 0.476174 +vt 0.833282 0.446787 +vt 0.829303 0.446783 +vt 0.833272 0.476174 +vt 0.833282 0.446794 +vt 0.833282 0.445792 +vt 0.829303 0.445486 +vt 0.833282 0.446402 +vt 0.829303 0.446708 +vt 0.829303 0.446797 +vt 0.825324 0.446402 +vt 0.825324 0.445796 +vt 0.825324 0.444017 +vt 0.825324 0.445792 +vt 0.829303 0.443127 +vt 0.833282 0.443340 +vt 0.829303 0.442286 +vt 0.833282 0.444017 +vt 0.833282 0.445448 +vt 0.833282 0.445796 +vt 0.829303 0.446502 +vt 0.829303 0.446686 +vt 0.825324 0.445448 +vt 0.833282 0.445345 +vt 0.833282 0.443010 +vt 0.825324 0.445345 +vt 0.833282 0.442994 +vt 0.829303 0.441826 +vt 0.829303 0.446512 +vt 0.829303 0.446495 +vt 0.825323 0.445328 +vt 0.825323 0.442994 +vt 0.833282 0.442946 +vt 0.829303 0.441814 +vt 0.833282 0.445210 +vt 0.833282 0.445328 +vt 0.829303 0.446342 +vt 0.825324 0.445210 +vt 0.825324 0.442946 +vt 0.833282 0.442608 +vt 0.829303 0.441786 +vt 0.833282 0.444253 +vt 0.829303 0.445075 +vt 0.825324 0.444253 +vt 0.825324 0.442608 +vt 0.556971 0.877667 +vt 0.553158 0.876682 +vt 0.556971 0.879637 +vt 0.549345 0.879637 +vt 0.549345 0.877667 +vt 0.556971 0.878286 +vt 0.553158 0.877496 +vt 0.553158 0.880622 +vt 0.553158 0.880657 +vt 0.549345 0.879867 +vt 0.549345 0.878286 +vt 0.556971 0.879972 +vt 0.553158 0.879695 +vt 0.556971 0.880526 +vt 0.556971 0.879867 +vt 0.553158 0.880803 +vt 0.549345 0.880526 +vt 0.549345 0.879972 +vt 0.553158 0.880948 +vt 0.556971 0.880947 +vt 0.549345 0.880947 +vt 0.553158 0.880945 +vt 0.556971 0.964249 +vt 0.553158 0.964250 +vt 0.556971 0.880946 +vt 0.556971 0.964246 +vt 0.553158 0.964244 +vt 0.549345 0.964246 +vt 0.549345 0.964761 +vt 0.553158 0.964401 +vt 0.549345 0.965483 +vt 0.549345 0.964249 +vt 0.553158 0.965844 +vt 0.556971 0.966818 +vt 0.553158 0.967607 +vt 0.556971 0.965483 +vt 0.556971 0.965240 +vt 0.556971 0.964761 +vt 0.553158 0.964451 +vt 0.549345 0.965240 +vt 0.549345 0.966818 +vt 0.556971 0.967645 +vt 0.553158 0.968691 +vt 0.556971 0.965555 +vt 0.553158 0.964510 +vt 0.549345 0.965555 +vt 0.549345 0.967645 +vn -0.484937 -0.249540 -0.838192 +vn -0.397482 -0.206176 -0.894147 +vn -1.000000 0.000001 0.000000 +vn 0.490904 -0.195752 -0.848938 +vn 0.391952 -0.262505 -0.881740 +vn -0.372467 0.001947 -0.928043 +vn -0.499983 0.000155 -0.866035 +vn -0.499960 0.000075 0.866049 +vn -0.405800 -0.001248 0.913961 +vn 0.499967 -0.001183 0.866044 +vn 0.406222 0.000078 0.913775 +vn 0.373114 0.000165 -0.927785 +vn 0.499966 0.001816 -0.866043 +vn -1.000000 0.000002 0.000001 +vn -0.466258 0.327809 0.821672 +vn -0.473133 0.331435 0.816270 +vn 0.467259 0.332612 0.819170 +vn 0.474021 0.326276 0.817831 +vn -0.470849 0.812296 0.344204 +vn -0.473617 0.811784 0.341604 +vn 0.471238 0.812960 0.342099 +vn 0.473986 0.810748 0.343547 +vn -0.507861 -0.861429 -0.004193 +vn -0.386167 -0.922372 -0.010271 +vn -0.999979 -0.006491 -0.000299 +vn -1.000000 0.000018 0.000046 +vn -0.501848 0.864952 0.002630 +vn -0.499990 0.866027 0.002721 +vn 0.490446 0.871469 0.002282 +vn 0.500004 0.866019 0.002739 +vn 0.999979 0.006491 0.000285 +vn 1.000000 0.000190 0.000535 +vn 0.497759 -0.867266 -0.009305 +vn 0.384302 -0.923195 -0.004755 +vn -0.469933 -0.782399 -0.408674 +vn -0.461111 -0.783735 -0.416095 +vn 0.470951 -0.779151 -0.413676 +vn 0.462280 -0.785966 -0.410554 +vn -0.478536 -0.295780 -0.826751 +vn -0.476735 -0.294709 -0.828173 +vn -1.000000 0.000002 -0.000002 +vn 0.478740 -0.294346 -0.827145 +vn 0.476951 -0.296070 -0.827563 +vn -0.372468 0.001947 -0.928043 +vn -0.499995 0.000155 -0.866028 +vn -1.000000 0.000001 0.000025 +vn -1.000000 0.000001 -0.000003 +vn -0.499983 0.000075 0.866035 +vn -0.405788 -0.001248 0.913966 +vn 0.499992 -0.001184 0.866029 +vn 0.406234 0.000078 0.913769 +vn 1.000000 -0.000001 0.000003 +vn 0.373125 0.000166 -0.927781 +vn 0.499977 0.001816 -0.866037 +vn -1.000000 0.000012 0.000029 +vn -0.466272 0.327809 0.821664 +vn -0.473151 0.331438 0.816258 +vn 0.467271 0.332616 0.819161 +vn 0.474041 0.326274 0.817821 +vn 1.000000 -0.000002 0.000002 +vn -1.000000 0.000028 0.000012 +vn -0.470834 0.812298 0.344219 +vn -0.473628 0.811782 0.341595 +vn 0.471225 0.812969 0.342094 +vn 0.474000 0.810736 0.343557 +vn -0.499226 -0.866460 -0.004505 +vn -0.386136 -0.922386 -0.010179 +vn -1.000000 0.000028 0.000135 +vn -1.000000 0.000073 0.000137 +vn -0.494500 0.869174 0.002733 +vn -0.499981 0.866033 0.002462 +vn 0.495511 0.868598 0.002645 +vn 0.499995 0.866024 0.002860 +vn 1.000000 -0.000036 0.000416 +vn 1.000000 0.000145 0.000409 +vn 0.503524 -0.863930 -0.009372 +vn 0.384275 -0.923207 -0.004643 +vn 0.874312 0.000965 -0.485363 +vn 0.872579 -0.000288 -0.488473 +vn 0.000030 -0.000189 -1.000000 +vn 0.000015 -0.000194 -1.000000 +vn -0.874332 -0.000256 -0.485329 +vn -0.873021 0.000547 -0.487683 +vn -0.874328 0.000775 0.485335 +vn -0.873168 -0.000063 0.487420 +vn -0.000015 0.000202 1.000000 +vn 0.000000 0.000198 1.000000 +vn 0.874332 -0.000107 0.485329 +vn 0.872214 0.001190 0.489123 +vn 0.503100 -0.000000 0.864228 +vn 0.607304 0.122813 0.784920 +vn 0.918044 -0.122298 0.377146 +vn 0.984149 0.122217 0.128503 +vn 0.918045 -0.122301 -0.377143 +vn 0.789780 0.122549 -0.601024 +vn 0.382447 -0.123028 -0.915750 +vn 0.130595 0.123133 -0.983760 +vn -0.382453 -0.123039 -0.915746 +vn -0.607291 0.122796 -0.784933 +vn -0.918046 -0.122327 -0.377131 +vn -0.984155 0.122186 -0.128490 +vn -0.918049 -0.122311 0.377129 +vn -0.789768 0.122570 0.601036 +vn -0.502105 -0.062322 0.862558 +vn -0.385408 0.000000 0.922746 +vn 0.000000 -0.999998 0.002107 +vn -0.001147 -0.999997 0.001951 +vn -0.001860 -0.999998 0.001016 +vn -0.002123 -0.999997 0.000879 +vn 0.001143 -0.999997 0.001944 +vn 0.001845 -0.999998 0.001024 +vn 0.002123 -0.999997 0.000879 +vn 0.002123 -0.999997 -0.000872 +vn 0.001838 -0.999998 -0.001020 +vn 0.000926 -0.999997 -0.002217 +vn 0.000000 -0.999998 -0.001998 +vn -0.000934 -0.999997 -0.002219 +vn -0.002123 -0.999997 -0.000879 +vn -0.001845 -0.999998 -0.001024 +vn 0.000015 -0.999998 0.002098 +vn 0.000001 1.000000 -0.000002 +vn 0.000010 1.000000 0.000001 +vn 0.000000 1.000000 -0.000003 +vn 0.000003 1.000000 -0.000002 +vn 0.000009 1.000000 0.000001 +vn 0.874287 0.000303 -0.485409 +vn 0.874661 0.000573 -0.484735 +vn 0.000015 -0.000189 -1.000000 +vn -0.000000 -0.000193 -1.000000 +vn -0.874304 0.000172 -0.485378 +vn -0.875669 -0.000667 -0.482912 +vn -0.874297 -0.000445 0.485391 +vn -0.875423 0.000368 0.483357 +vn -0.000015 0.000211 1.000000 +vn 0.000015 0.000202 1.000000 +vn 0.874301 0.000754 0.485384 +vn 0.874677 0.000524 0.484707 +vn 0.503104 -0.000000 0.864226 +vn 0.607290 0.122795 0.784933 +vn 0.918044 -0.122326 0.377136 +vn 0.984154 0.122190 0.128489 +vn 0.918049 -0.122313 -0.377129 +vn 0.789779 0.122549 -0.601025 +vn 0.382463 -0.123018 -0.915745 +vn 0.130593 0.123161 -0.983756 +vn -0.382459 -0.123025 -0.915746 +vn -0.607296 0.122809 -0.784927 +vn -0.918048 -0.122305 -0.377133 +vn -0.984152 0.122196 -0.128503 +vn -0.918040 -0.122320 0.377147 +vn -0.789775 0.122532 0.601034 +vn -0.502119 -0.062349 0.862548 +vn -0.385379 0.000000 0.922758 +vn -0.000010 0.000000 1.000000 +vn -0.001851 -0.999998 0.001028 +vn -0.002138 -0.999997 0.000878 +vn 0.001147 -0.999997 0.001951 +vn 0.001851 -0.999998 0.001028 +vn 0.002138 -0.999997 0.000878 +vn 0.002138 -0.999997 -0.000871 +vn 0.001845 -0.999998 -0.001024 +vn 0.000925 -0.999997 -0.002231 +vn 0.000000 -0.999998 -0.002012 +vn -0.000932 -0.999997 -0.002233 +vn -0.002138 -0.999997 -0.000878 +vn -0.001851 -0.999998 -0.001028 +vn 0.000017 1.000000 0.000010 +vn -0.000010 1.000000 -0.000001 +vn -0.000030 -0.000014 1.000000 +vn -0.000013 -0.000017 1.000000 +vn 0.789880 0.414533 0.451943 +vn 0.781845 0.417516 0.463033 +vn 0.786234 0.419867 -0.453373 +vn 0.784250 0.411598 -0.464262 +vn -0.809399 -0.384578 -0.443817 +vn -0.809403 -0.384580 0.443806 +vn -0.000010 -0.000028 1.000000 +vn 0.293295 0.826814 0.479955 +vn 0.285269 0.825052 0.487761 +vn 0.286502 0.828616 -0.480949 +vn 0.291708 0.822338 -0.488535 +vn -0.000011 0.000007 -1.000000 +vn 0.000027 0.000674 1.000000 +vn -0.000151 -0.000085 1.000000 +vn 0.000162 0.866200 0.499698 +vn 0.000092 0.866054 0.499951 +vn 0.000253 0.866174 -0.499742 +vn 0.000309 0.866046 -0.499965 +vn 0.000142 -0.000780 -1.000000 +vn 0.000000 0.000012 -1.000000 +vn -0.029946 -0.897132 -0.440747 +vn -0.029946 -0.897140 0.440730 +vn 0.000015 0.000686 1.000000 +vn -0.000000 -0.000643 -1.000000 +vn -0.017785 -0.865895 -0.499910 +vn -0.017783 -0.865898 0.499904 +vn -0.000150 -0.001928 0.999998 +vn -0.000071 0.000686 1.000000 +vn -0.000020 0.864022 0.503455 +vn 0.000111 0.866269 0.499578 +vn -0.000038 0.866908 -0.498468 +vn 0.000002 0.866236 -0.499636 +vn -0.000019 0.000000 -1.000000 +vn -0.000014 -0.866114 -0.499847 +vn -0.000019 -0.866032 -0.499989 +vn 0.000032 -0.864354 0.502884 +vn -0.000069 -0.866035 0.499983 +vn -0.000000 -0.001941 0.999998 +vn -0.000001 -0.001956 0.999998 +vn 0.000062 0.863896 0.503670 +vn 0.000080 0.864050 0.503406 +vn 0.000082 0.866908 -0.498469 +vn -0.000081 -0.866114 -0.499846 +vn -0.000081 -0.864481 0.502665 +vn -0.000061 -0.864312 0.502956 +vn 0.000127 0.867300 -0.497785 +vn -0.000000 -0.000014 -1.000000 +vn -0.000001 0.000000 -1.000000 +vn -0.000127 -0.865703 -0.500559 +vn 0.000151 0.000686 1.000000 +vn 0.000071 -0.001941 0.999998 +vn 0.000089 0.865638 0.500670 +vn -0.000015 0.863926 0.503619 +vn 0.000132 0.865627 -0.500689 +vn 0.000034 0.867300 -0.497785 +vn 0.000018 -0.000629 -1.000000 +vn -0.000016 -0.866022 -0.500006 +vn -0.000035 -0.865703 -0.500559 +vn -0.000085 -0.866029 0.499993 +vn 0.000007 -0.864458 0.502706 +vn 0.000000 0.000686 1.000000 +vn 0.000015 -0.000629 -1.000000 +vn 0.000177 0.000855 1.000000 +vn 0.000312 0.866049 0.499960 +vn 0.000131 0.865697 0.500568 +vn -0.000058 0.866041 -0.499974 +vn 0.000140 0.865703 -0.500558 +vn -0.000166 0.000147 -1.000000 +vn 0.000020 -0.000624 -1.000000 +vn 0.028575 -0.905567 -0.423241 +vn 0.012561 -0.865954 -0.499966 +vn 0.012564 -0.865961 0.499954 +vn -0.205270 0.860966 0.465405 +vn -0.215739 0.845018 0.489287 +vn -0.218610 0.856265 -0.467996 +vn -0.202079 0.847578 -0.490689 +vn -0.000011 0.000010 -1.000000 +vn 0.028575 -0.905567 0.423241 +vn 0.000003 0.000019 1.000000 +vn 0.000007 0.000005 1.000000 +vn -0.692360 0.565829 0.447744 +vn -0.690371 0.534134 0.487944 +vn -0.705073 0.545509 -0.453091 +vn -0.674833 0.551490 -0.490366 +vn 0.000014 -0.000001 -1.000000 +vn -0.000022 0.000001 -1.000000 +vn 0.631641 -0.650846 -0.421223 +vn 0.495364 -0.710700 -0.499520 +vn 0.530328 -0.760902 0.373872 +vn 0.604064 -0.622410 0.497707 +vn -0.868904 0.000367 -0.494980 +vn -0.866194 -0.001555 -0.499706 +vn -0.000014 -0.000005 -1.000000 +vn 0.000015 0.000005 -1.000000 +vn 0.869132 0.005775 -0.494546 +vn -0.817269 0.017362 -0.575994 +vn 0.000000 -0.000005 -1.000000 +vn -0.865930 -0.014824 -0.499946 +vn -0.821969 -0.014071 0.569358 +vn -0.865889 0.018401 0.499898 +vn -0.000014 0.000000 -1.000000 +vn 0.866381 -0.017620 -0.499072 +vn 0.866389 -0.017265 0.499071 +vn 0.865912 -0.017256 -0.499899 +vn 0.865910 -0.017613 0.499890 +vn -0.000014 -0.000005 1.000000 +vn 0.000000 0.000005 1.000000 +vn 0.020404 0.002960 0.999787 +vn 0.869146 0.005770 0.494522 +vn -0.000001 -0.000005 1.000000 +vn 0.000000 -0.000005 1.000000 +vn -0.868992 -0.001560 0.494824 +vn -0.866206 0.000366 0.499688 +vn 0.866199 0.008022 -0.499635 +vn 0.866199 0.008028 0.499635 +vn 0.000794 -0.999998 0.001786 +vn -0.279825 -0.960027 0.006729 +vn -1.000000 0.000103 -0.000164 +vn -0.999912 0.013267 0.000074 +vn -0.347708 0.937589 0.005143 +vn -0.473733 0.880665 0.002230 +vn 0.346423 0.938077 0.001844 +vn 0.500042 0.865988 0.004752 +vn 0.999869 -0.016168 0.000314 +vn -0.003343 -0.999966 0.007516 +vn 0.327793 -0.944748 0.001493 +vn -0.499505 -0.866228 0.011967 +vn 0.159350 -0.987222 0.000717 +vn -1.000000 0.000061 0.000002 +vn 0.499735 -0.866178 0.000628 +vn -0.159788 -0.987057 0.013629 +vn -0.347717 0.937585 0.005204 +vn -0.502312 0.864685 0.001589 +vn 0.346383 0.938091 0.001723 +vn 0.500070 0.865972 0.004753 +vn 1.000000 -0.000061 0.000002 +vn 0.491688 -0.181956 -0.851549 +vn -0.499988 -0.866024 -0.003938 +vn -1.000000 -0.000005 0.000176 +vn -1.000000 -0.000000 0.000177 +vn -0.377151 0.925761 0.026921 +vn -0.499923 0.865937 0.015179 +vn 0.267224 0.963483 0.017089 +vn 0.499738 0.865567 0.032498 +vn 1.000000 -0.000000 0.000644 +vn -0.487341 -0.873197 -0.005084 +vn 1.000000 0.000067 0.000652 +vn 0.487201 -0.873282 -0.003743 +vn 0.499995 -0.866015 -0.004811 +vn -0.472051 -0.648878 -0.596762 +vn -0.453381 -0.647647 -0.612372 +vn -1.000000 -0.000000 0.000006 +vn 1.000000 -0.000001 -0.000007 +vn 0.474067 -0.639777 -0.604934 +vn 0.456025 -0.655056 -0.602448 +vn -0.378351 -0.004503 -0.925651 +vn -0.463526 -0.006288 -0.886061 +vn -1.000000 0.000001 0.000009 +vn -1.000000 0.000001 0.000006 +vn -0.381827 0.014397 0.924122 +vn -0.305829 0.013144 0.951996 +vn 0.381272 0.012762 0.924375 +vn 0.467786 0.010179 0.883783 +vn 1.000000 -0.000001 -0.000008 +vn 0.327279 -0.007889 -0.944895 +vn 0.463158 -0.004312 -0.886265 +vn -0.379308 -0.925269 0.001373 +vn -0.378614 -0.925554 0.001351 +vn -1.000000 0.000005 0.000000 +vn -1.000000 0.000009 0.000000 +vn -0.499899 0.865959 0.014702 +vn -0.385843 0.922357 0.019567 +vn 0.499905 0.865885 0.018369 +vn 0.384526 0.922981 0.015670 +vn 1.000000 -0.000008 -0.000000 +vn 0.610821 -0.791693 -0.011004 +vn 0.197634 -0.980275 0.001454 +vn -0.469676 0.812264 -0.345879 +vn 0.469713 0.812238 -0.345890 +vn -1.000000 0.000003 0.000003 +vn -0.472845 0.809895 -0.347114 +vn 0.472858 0.809887 -0.347115 +vn 1.000000 -0.000002 -0.000004 +vn 1.000000 -0.000000 -0.000008 +vn 0.392367 -0.772369 0.499495 +vn -1.000000 0.000015 0.000015 +vn -0.476583 0.372042 -0.796526 +vn 0.476594 0.372038 -0.796521 +vn -0.469174 0.368892 -0.802368 +vn 0.469188 0.368889 -0.802361 +vn -1.000000 -0.000011 0.000026 +vn -0.503668 0.003253 -0.863891 +vn -0.499881 0.005017 -0.866079 +vn 0.499894 0.004962 -0.866072 +vn 0.496773 0.003536 -0.867873 +vn 0.531315 -0.049569 0.845723 +vn -0.499356 -0.050691 0.864912 +vn -0.407261 -0.091076 0.908759 +vn -0.999987 -0.001989 0.004637 +vn 1.000000 -0.000010 0.000003 +vn 0.999996 -0.001097 -0.002740 +vn 0.499675 -0.036943 0.865425 +vn -0.499988 -0.866023 -0.003938 +vn -0.377168 0.925754 0.026921 +vn -0.499932 0.865932 0.015180 +vn 0.267219 0.963484 0.017089 +vn 0.499737 0.865567 0.032498 +vn -0.487350 -0.873192 -0.005083 +vn 0.487190 -0.873288 -0.003743 +vn 0.499992 -0.866016 -0.004811 +vn -0.472054 -0.648876 -0.596763 +vn -0.453391 -0.647645 -0.612366 +vn 0.474054 -0.639781 -0.604940 +vn 0.456013 -0.655059 -0.602454 +vn -0.378374 -0.004503 -0.925642 +vn -0.463527 -0.006288 -0.886061 +vn -0.381838 0.014397 0.924117 +vn -0.305852 0.013144 0.951988 +vn 0.381262 0.012762 0.924379 +vn 0.467774 0.010179 0.883789 +vn 0.327283 -0.007889 -0.944893 +vn 0.463146 -0.004312 -0.886271 +vn -0.379331 -0.925260 0.001372 +vn -0.378637 -0.925544 0.001351 +vn -0.499913 0.865951 0.014703 +vn -0.385866 0.922347 0.019566 +vn 0.499881 0.865899 0.018369 +vn 0.384528 0.922980 0.015670 +vn 0.610800 -0.791708 -0.011004 +vn 0.197643 -0.980273 0.001454 +vn -0.469692 0.812253 -0.345882 +vn 0.469695 0.812249 -0.345887 +vn -0.472858 0.809887 -0.347115 +vn 0.472873 0.809873 -0.347125 +vn 1.000000 0.000016 -0.000036 +vn 0.392352 -0.772379 0.499490 +vn -0.476594 0.372039 -0.796520 +vn 0.476604 0.372050 -0.796510 +vn 1.000000 0.000031 -0.000008 +vn -0.469186 0.368890 -0.802362 +vn 0.469176 0.368892 -0.802367 +vn -0.503671 0.003253 -0.863890 +vn -0.499893 0.005013 -0.866073 +vn 0.499882 0.004957 -0.866079 +vn 0.496782 0.003540 -0.867868 +vn 0.531303 -0.049569 0.845731 +vn -0.499354 -0.050691 0.864914 +vn -0.407272 -0.091071 0.908755 +vn -0.999988 -0.001974 0.004602 +vn 1.000000 -0.000013 0.000003 +vn 0.999996 -0.001108 -0.002760 +vn 0.499666 -0.036944 0.865430 +vn -0.455993 -0.408157 0.790872 +vn -0.183097 -0.609591 0.771281 +vn 0.411893 -0.565031 0.714901 +vn 0.655579 -0.575614 0.488759 +vn -0.499989 0.002096 -0.866029 +vn -0.522673 0.001130 -0.852532 +vn -0.482255 -0.001093 0.876030 +vn -0.499997 -0.000367 0.866027 +vn 0.506987 -0.000366 0.861953 +vn 0.499997 -0.000079 0.866027 +vn 0.500007 0.001147 -0.866021 +vn 0.522750 0.002062 -0.852483 +vn 0.460336 -0.338989 0.820474 +vn -0.420405 0.528892 -0.737247 +vn -0.425969 0.525323 -0.736605 +vn -1.000000 0.000019 -0.000003 +vn 1.000000 -0.000001 0.000001 +vn 0.419674 0.527016 -0.739005 +vn 0.425295 0.527561 -0.735394 +vn -1.000000 0.000016 0.000026 +vn -0.401120 -0.717841 0.569040 +vn -0.091728 0.995777 -0.003746 +vn -0.499697 0.865537 -0.033876 +vn -1.000000 0.000001 -0.000002 +vn -1.000000 -0.000160 -0.000007 +vn -0.585677 -0.809591 0.039304 +vn 0.047341 -0.998856 -0.006783 +vn 0.337958 -0.941140 -0.006367 +vn -0.046861 -0.998604 0.024362 +vn 0.112993 0.992836 -0.038858 +vn 0.467797 0.883830 -0.003324 +vn 0.500002 0.866018 -0.003255 +vn 0.488876 -0.872265 0.012432 +vn 0.999997 -0.002365 0.000240 +vn 1.000000 0.000001 0.000074 +vn -0.613252 -0.789817 0.010492 +vn 0.497018 -0.867660 0.011836 +vn -0.496732 0.867873 -0.007367 +vn -0.482783 0.875716 -0.006553 +vn -0.999988 0.004952 0.000314 +vn -1.000000 0.000048 0.000078 +vn -0.504719 -0.863278 0.003197 +vn 0.482926 0.875627 -0.007690 +vn 0.502232 0.864709 -0.006370 +vn -0.469318 0.331433 -0.818470 +vn -0.477097 0.324485 -0.816754 +vn -1.000000 0.000002 -0.000001 +vn 1.000000 -0.000002 0.000001 +vn 0.468269 0.326224 -0.821159 +vn 0.476205 0.330045 -0.815045 +vn -0.474845 0.822242 -0.313752 +vn -0.464944 0.829805 -0.308627 +vn 0.476002 0.824279 -0.306572 +vn 0.466324 0.826488 -0.315373 +vn -0.500000 0.866025 0.000001 +vn -0.500003 0.866024 0.000001 +vn -0.155956 -0.987745 -0.006062 +vn -0.378054 -0.925783 -0.000369 +vn 0.152661 -0.988279 -0.000394 +vn 0.376177 -0.926530 -0.005686 +vn 0.500000 0.866025 0.000001 +vn 0.499990 0.866031 0.000001 +vn -0.471139 0.814581 0.338358 +vn -0.470627 0.814681 0.338830 +vn 0.471207 0.814394 0.338711 +vn 0.470695 0.814800 0.338449 +vn -0.467984 0.351631 0.810769 +vn -0.473439 0.354365 0.806400 +vn 0.467225 0.355689 0.809436 +vn 0.472740 0.350621 0.808444 +vn -0.500000 -0.000722 0.866025 +vn -0.499979 -0.000722 0.866037 +vn -0.500057 0.000421 -0.865993 +vn -0.511862 0.000344 -0.859067 +vn 0.499987 0.000346 -0.866033 +vn 0.511854 0.000417 -0.859072 +vn 0.500000 -0.000723 0.866025 +vn 0.499979 -0.000723 0.866037 +vn -0.499811 -0.002216 -0.866132 +vn -0.425796 -0.002319 -0.904816 +vn -0.500009 -0.002322 -0.866017 +vn -0.399549 -0.064842 0.914416 +vn -0.755360 0.132308 0.641815 +vn -0.499962 -0.015879 0.865902 +vn 0.383606 -0.016934 0.923342 +vn 0.755253 -0.132190 -0.641965 +vn 0.613487 -0.108038 0.782280 +vn 0.499035 -0.061287 0.864412 +vn 0.499806 -0.002318 -0.866134 +vn 0.418405 -0.044337 -0.907178 +vn 0.499996 -0.002221 -0.866025 +s off +f 2919/1870/2229 2925/1871/2229 2926/1872/2229 +f 2919/1870/2230 2920/1873/2230 2925/1871/2230 +f 2920/1873/2231 2921/1874/2231 2925/1871/2231 +f 2923/1875/63 2924/1876/63 2927/1877/63 +f 2924/1876/2232 2926/1872/2232 2927/1877/2232 +f 2924/1876/2233 2919/1870/2233 2926/1872/2233 +f 3245/1878/2234 2928/1879/2234 2929/1880/2234 +f 3246/1880/2235 3247/1878/2235 3248/1878/2235 +f 3249/1879/2231 2930/1878/2231 3250/1881/2231 +f 3251/1882/2231 3252/1879/2231 3253/1881/2231 +f 3254/1879/2236 2931/1882/2236 3255/1883/2236 +f 3256/1882/2237 2922/1883/2237 2931/1882/2237 +f 2922/1883/2238 2932/1882/2238 3257/1884/2238 +f 3258/1885/2239 3259/1883/2239 3260/1884/2239 +f 3261/1883/274 2933/1885/274 3262/1886/274 +f 3263/1887/274 3264/1886/274 2933/1885/274 +f 3265/1886/2240 3266/1887/2240 3267/1888/2240 +f 3268/1889/2241 3269/1886/2241 3270/1890/2241 +f 3271/1889/2242 3272/1891/2242 2934/1889/2242 +f 3273/1889/2243 2935/1892/2243 3274/1891/2243 +f 3275/1892/2244 3276/1893/2244 3277/1891/2244 +f 3278/1891/2245 2936/1893/2245 3279/1894/2245 +f 3280/1895/2246 3281/1891/2246 3282/1894/2246 +f 3283/1891/63 3284/1895/63 3285/1896/63 +f 3286/1897/2242 3287/1898/2242 2937/1880/2242 +f 3288/1898/2247 2938/1878/2247 2937/1880/2247 +f 3289/1899/2248 3290/1900/2248 3291/1901/2248 +f 3292/1899/2249 2939/1902/2249 3293/1900/2249 +f 3294/1902/2250 3295/1903/2250 3296/1900/2250 +f 3297/1902/63 3298/1904/63 3299/1903/63 +f 3300/1905/2251 2940/1906/2251 2941/1907/2251 +f 3301/1906/2252 3302/1908/2252 3303/1907/2252 +f 3304/1906/2253 2942/1909/2253 3305/1908/2253 +f 3306/1909/2254 3307/1901/2254 3308/1908/2254 +f 3309/1909/2255 2943/1899/2255 3310/1901/2255 +f 3311/1901/2256 3312/1910/2256 3313/1911/2256 +f 3314/1901/2257 2944/1900/2257 3315/1910/2257 +f 3316/1900/2258 3317/1912/2258 3318/1910/2258 +f 3319/1900/2259 2945/1903/2259 3320/1912/2259 +f 3321/1903/2260 3322/1913/2260 3323/1912/2260 +f 3324/1903/2261 3325/1914/2261 3326/1913/2261 +f 3327/1914/2262 3328/1915/2262 3329/1913/2262 +f 2946/1914/2263 2947/1907/2263 2948/1915/2263 +f 3330/1907/2264 2949/1916/2264 3331/1915/2264 +f 3332/1907/7 2950/1908/7 3333/1916/7 +f 2952/1912/63 2954/1917/63 2953/1918/63 +f 3334/1912/2265 3335/1913/2265 3336/1917/2265 +f 3337/1913/2266 3338/1919/2266 3339/1917/2266 +f 3340/1913/2267 2955/1915/2267 2956/1919/2267 +f 2948/1915/2268 3341/1920/2268 3342/1919/2268 +f 3343/1915/2269 3344/1916/2269 3345/1920/2269 +f 3346/1918/63 3347/1921/63 2957/1922/63 +f 2953/1918/2270 3348/1917/2270 3349/1921/2270 +f 3350/1917/2271 3351/1923/2271 3352/1921/2271 +f 3353/1917/2272 2958/1919/2272 2959/1923/2272 +f 2956/1919/2273 3354/1924/2273 3355/1923/2273 +f 3356/1919/2274 2960/1920/2274 3357/1924/2274 +f 3358/1920/2275 3359/1925/2275 3360/1924/2275 +f 3361/1920/2276 2961/1926/2276 3362/1925/2276 +f 3363/1925/2277 2951/1927/2277 3364/1928/2277 +f 3365/1925/2278 2962/1929/2278 3366/1927/2278 +f 3367/1929/2279 3368/1930/2279 3369/1927/2279 +f 3370/1929/2280 2963/1922/2280 3371/1930/2280 +f 3372/1922/274 3373/1931/274 3374/1930/274 +f 2957/1922/2281 3375/1921/2281 3376/1931/2281 +f 3377/1921/2282 3378/1932/2282 3379/1931/2282 +f 3380/1924/2283 3381/1928/2283 2964/1933/2283 +f 3382/1924/2284 2965/1925/2284 3383/1928/2284 +f 3384/1928/2285 3385/1934/2285 3386/1935/2285 +f 3387/1928/2286 2966/1927/2286 3388/1934/2286 +f 3389/1927/2287 3390/1936/2287 3391/1934/2287 +f 3392/1927/2288 3393/1930/2288 3394/1936/2288 +f 3395/1933/2289 3396/1935/2289 2967/1937/2289 +f 2964/1933/2290 2968/1928/2290 3397/1935/2290 +f 3398/1938/2291 3399/1939/2291 3400/1940/2291 +f 3401/1938/2292 2969/1941/2292 3402/1939/2292 +f 3403/1941/2293 3404/1942/2293 3405/1939/2293 +f 3406/1941/63 3407/1943/63 3408/1942/63 +f 3409/1944/2294 2970/1945/2294 2971/1946/2294 +f 3410/1945/2295 3411/1947/2295 3412/1946/2295 +f 3413/1945/2296 2972/1948/2296 3414/1947/2296 +f 3415/1948/2297 3416/1940/2297 3417/1947/2297 +f 3418/1948/2298 2973/1938/2298 3419/1940/2298 +f 3420/1940/2299 3421/1949/2299 3422/1950/2299 +f 3423/1940/2300 2974/1939/2300 3424/1949/2300 +f 3425/1939/2301 3426/1951/2301 3427/1949/2301 +f 3428/1939/2302 2975/1942/2302 3429/1951/2302 +f 3430/1942/2303 3431/1952/2303 3432/1951/2303 +f 3433/1942/2304 3434/1953/2304 3435/1952/2304 +f 3436/1953/2305 3437/1954/2305 3438/1952/2305 +f 2976/1953/2306 2977/1946/2306 2978/1954/2306 +f 3439/1946/2307 2979/1955/2307 3440/1954/2307 +f 3441/1946/2308 2980/1947/2308 3442/1955/2308 +f 3443/1947/2309 2981/1950/2309 3444/1955/2309 +f 3445/1947/2310 2982/1940/2310 3446/1950/2310 +f 2981/1950/2311 2983/1956/2311 3447/1957/2311 +f 3448/1950/2312 2984/1949/2312 3449/1956/2312 +f 3450/1949/2313 2985/1958/2313 3451/1956/2313 +f 3452/1949/2314 2986/1951/2314 3453/1958/2314 +f 3454/1951/2315 2987/1959/2315 3455/1958/2315 +f 3456/1951/2316 3457/1952/2316 3458/1959/2316 +f 3459/1952/2317 3460/1960/2317 3461/1959/2317 +f 2989/1952/2318 2988/1954/2318 2990/1960/2318 +f 3462/1954/2319 3463/1961/2319 2991/1960/2319 +f 3464/1954/2320 3465/1955/2320 2992/1961/2320 +f 3466/1955/2321 3467/1957/2321 2993/1961/2321 +f 3468/1955/2322 3469/1950/2322 2994/1957/2322 +f 3470/1957/2323 3471/1962/2323 2995/1963/2323 +f 3472/1957/2324 3473/1956/2324 2996/1962/2324 +f 3474/1956/2325 3475/1964/2325 2997/1962/2325 +f 3476/1956/2326 3477/1958/2326 2998/1964/2326 +f 3478/1958/2327 3479/1965/2327 2999/1964/2327 +f 3480/1958/2328 3481/1959/2328 3000/1965/2328 +f 3482/1959/2329 3483/1966/2329 3001/1965/2329 +f 3484/1959/2330 3485/1960/2330 3002/1966/2330 +f 3486/1960/2331 3487/1967/2331 3003/1966/2331 +f 3488/1960/2332 3489/1961/2332 3004/1967/2332 +f 3490/1961/2333 3491/1963/2333 3005/1967/2333 +f 3492/1961/21 3493/1957/21 3494/1963/21 +f 3495/1963/21 3496/1968/21 3497/1969/21 +f 3498/1963/2334 3499/1962/2334 3500/1968/2334 +f 3501/1962/2335 3502/1970/2335 3503/1968/2335 +f 3504/1962/2336 3505/1964/2336 3506/1970/2336 +f 3507/1964/2337 3508/1971/2337 3509/1970/2337 +f 3510/1964/2338 3511/1965/2338 3512/1971/2338 +f 3513/1965/2339 3514/1972/2339 3515/1971/2339 +f 3516/1965/2340 3517/1966/2340 3518/1972/2340 +f 3519/1966/2341 3520/1973/2341 3521/1972/2341 +f 3522/1966/2342 3523/1967/2342 3524/1973/2342 +f 3525/1967/2343 3526/1969/2343 3527/1973/2343 +f 3528/1967/2344 3529/1963/2344 3530/1969/2344 +f 3531/1969/2345 3532/1974/2345 3533/1975/2345 +f 3534/1969/2346 3535/1968/2346 3536/1974/2346 +f 3537/1968/2347 3538/1976/2347 3539/1974/2347 +f 3540/1968/2348 3541/1970/2348 3542/1976/2348 +f 3543/1970/2349 3544/1977/2349 3545/1976/2349 +f 3546/1970/2350 3547/1971/2350 3548/1977/2350 +f 3549/1971/331 3550/1978/331 3551/1977/331 +f 3552/1971/331 3553/1972/331 3554/1978/331 +f 3555/1972/2351 3556/1979/2351 3557/1978/2351 +f 3558/1972/2352 3559/1973/2352 3560/1979/2352 +f 3561/1973/2353 3562/1975/2353 3563/1979/2353 +f 3006/1973/2354 3007/1969/2354 3008/1975/2354 +f 3564/1980/2355 3009/1981/2355 3565/1982/2355 +f 3566/1980/2356 3010/1983/2356 3567/1981/2356 +f 3568/1983/2357 3011/1984/2357 3569/1981/2357 +f 3570/1983/2358 3012/1985/2358 3571/1984/2358 +f 3572/1985/2359 3013/1986/2359 3573/1984/2359 +f 3574/1985/2360 3014/1987/2360 3575/1986/2360 +f 3576/1987/2361 3015/1988/2361 3577/1986/2361 +f 3578/1987/2362 3016/1989/2362 3579/1988/2362 +f 3580/1989/2363 3017/1990/2363 3581/1988/2363 +f 3582/1989/2364 3583/1991/2364 3584/1990/2364 +f 3585/1991/2365 3586/1982/2365 3587/1990/2365 +f 3019/1991/2366 3018/1980/2366 3020/1982/2366 +f 3588/1992/2367 3589/1992/2367 3021/1993/2367 +f 3590/1992/2368 3591/1993/2368 3022/1993/2368 +f 3021/1993/2369 3022/1993/2369 3023/1994/2369 +f 3592/1993/2370 3593/1994/2370 3024/1994/2370 +f 3023/1994/2371 3024/1994/2371 3025/1995/2371 +f 3594/1994/2372 3595/1995/2372 3026/1995/2372 +f 3596/1995/2373 3597/1995/2373 3027/1996/2373 +f 3598/1995/2374 3599/1996/2374 3028/1996/2374 +f 3027/1996/2375 3028/1996/2375 3029/1997/2375 +f 3600/1996/2376 3601/1997/2376 3030/1997/2376 +f 3602/1997/2377 3603/1997/2377 3031/1998/2377 +f 3604/1997/2378 3605/1998/2378 3032/1998/2378 +f 3031/1998/2379 3032/1998/2379 3033/1999/2379 +f 3606/1998/2380 3607/1999/2380 3034/1999/2380 +f 3033/1999/2381 3034/1999/2381 3035/2000/2381 +f 3608/1999/2382 3609/2000/2382 3610/2000/2382 +f 3035/2000/2382 3611/2000/2382 3612/2001/2382 +f 3613/2000/2334 3614/2001/2334 3615/2001/2334 +f 3616/2001/2335 3617/2001/2335 3618/2002/2335 +f 3619/2001/2383 3620/2002/2383 3621/2002/2383 +f 3622/2002/2384 3623/2002/2384 3624/2003/2384 +f 3625/2002/2385 3626/2003/2385 3627/2003/2385 +f 3628/2003/2386 3629/2003/2386 3630/2004/2386 +f 3631/2003/2387 3632/2004/2387 3633/2004/2387 +f 3634/2004/2388 3635/2004/2388 3636/2005/2388 +f 3637/2004/2389 3638/2005/2389 3639/2005/2389 +f 3640/2005/2390 3641/2005/2390 3642/2006/2390 +f 3643/2005/2391 3644/2006/2391 3645/2006/2391 +f 3646/2006/2392 3647/2006/2392 3648/2007/2392 +f 3649/2006/2393 3650/2007/2393 3651/2007/2393 +f 3652/2007/2394 3653/2007/2394 3654/2008/2394 +f 3655/2007/2334 3656/2008/2334 3657/2008/2334 +f 3658/2008/2395 3659/2008/2395 3660/2009/2395 +f 3661/2008/2396 3662/2009/2396 3663/2009/2396 +f 3664/2009/331 3665/2009/331 3666/2010/331 +f 3667/2009/331 3668/2010/331 3669/2010/331 +f 3670/2010/331 3671/2010/331 3672/2011/331 +f 3673/2010/2353 3674/2011/2353 3675/2011/2353 +f 3676/2011/2353 3677/2011/2353 3678/2012/2353 +f 3036/2011/2397 3037/2012/2397 3038/2012/2397 +f 3679/2012/2398 3039/2012/2398 3680/2013/2398 +f 3681/2012/2399 3040/2013/2399 3682/2013/2399 +f 3683/2013/2400 3041/2013/2400 3684/2014/2400 +f 3041/2013/2401 3042/2014/2401 3685/2014/2401 +f 3686/2014/2402 3043/2014/2402 3687/2015/2402 +f 3043/2014/105 3044/2015/105 3688/2015/105 +f 3689/2015/105 3045/2015/105 3690/1992/105 +f 3045/2015/2403 3046/1992/2403 3691/1992/2403 +f 3692/1994/2404 3693/1993/2404 3694/1990/2404 +f 3695/1990/2405 3696/1993/2405 3047/1992/2405 +f 3697/1992/2406 3048/2015/2406 3698/1988/2406 +f 3699/2015/2407 3700/2014/2407 3701/1988/2407 +f 3702/2014/2408 3049/2013/2408 3703/1988/2408 +f 3040/2013/2409 3704/1986/2409 3705/1988/2409 +f 3706/2013/2410 3707/2012/2410 3708/1986/2410 +f 3709/2012/2411 3710/2011/2411 3050/1986/2411 +f 3711/1986/2412 3712/2011/2412 3713/2010/2412 +f 3714/2010/2413 3715/2009/2413 3716/1986/2413 +f 3717/1990/2414 3718/1995/2414 3719/1994/2414 +f 3720/1996/2415 3721/1995/2415 3722/1990/2415 +f 3723/1990/2416 3724/1982/2416 3725/1996/2416 +f 3726/1996/2417 3051/1982/2417 3727/1997/2417 +f 3728/1997/2418 3729/1982/2418 3730/1998/2418 +f 3731/1982/2419 3732/1999/2419 3733/1998/2419 +f 3734/1982/2420 3735/2000/2420 3736/1999/2420 +f 3737/1982/2421 3738/1981/2421 3739/2000/2421 +f 3740/2000/2422 3741/1981/2422 3742/2001/2422 +f 3743/2001/2423 3744/1981/2423 3052/2002/2423 +f 3745/2002/2424 3746/1981/2424 3747/2003/2424 +f 3748/1981/2425 3749/2004/2425 3750/2003/2425 +f 3751/1981/2426 3752/1984/2426 3753/2004/2426 +f 3754/1984/2427 3755/2005/2427 3756/2004/2427 +f 3757/1984/2428 3758/2006/2428 3759/2005/2428 +f 3760/1984/2429 3053/2007/2429 3761/2006/2429 +f 3013/1986/2430 3762/2009/2430 3763/2008/2430 +f 3764/2008/2431 3054/2007/2431 3765/1984/2431 +f 3011/1984/2422 3766/1986/2422 3767/2008/2422 +f 3768/1990/2432 3769/1992/2432 3770/1988/2432 +f 3771/2011/2433 3772/2007/2433 3773/2010/2433 +f 3774/2009/2434 3775/2010/2434 3776/2007/2434 +f 3777/2007/2435 3778/2008/2435 3779/2009/2435 +f 3780/2003/2436 3781/2014/2436 3782/2015/2436 +f 3783/2015/2437 3784/2002/2437 3785/2003/2437 +f 3786/2002/2438 3787/2015/2438 3788/1992/2438 +f 3789/1992/2439 3790/1993/2439 3791/2002/2439 +f 3792/2002/2440 3793/1993/2440 3794/2001/2440 +f 3795/2001/2441 3796/1993/2441 3797/1994/2441 +f 3798/1994/2442 3799/2000/2442 3800/2001/2442 +f 3801/2000/2443 3802/1994/2443 3803/1995/2443 +f 3804/1995/2444 3805/1999/2444 3055/2000/2444 +f 3806/1999/2445 3056/1995/2445 3807/1996/2445 +f 3808/1996/2446 3809/1997/2446 3810/1999/2446 +f 3811/1998/2447 3812/1999/2447 3813/1997/2447 +f 3814/2014/2448 3815/2003/2448 3057/2004/2448 +f 3816/2014/2449 3817/2004/2449 3818/2005/2449 +f 3819/2005/2450 3820/2006/2450 3821/2014/2450 +f 3822/2006/2451 3823/2013/2451 3824/2014/2451 +f 3825/2013/2452 3826/2006/2452 3827/2012/2452 +f 3828/2006/2453 3829/2011/2453 3830/2012/2453 +f 3831/2006/2454 3058/2007/2454 3832/2011/2454 +f 3833/2016/2445 3834/2017/2445 3835/2018/2445 +f 3836/2016/2455 3059/2019/2455 3837/2017/2455 +f 3838/2019/2456 3839/2020/2456 3840/2017/2456 +f 3841/2019/2457 3842/2021/2457 3843/2020/2457 +f 3844/2021/2458 3845/2022/2458 3846/2020/2458 +f 3847/2021/2459 3848/2023/2459 3849/2022/2459 +f 3850/2023/2460 3851/2024/2460 3852/2022/2460 +f 3853/2023/2461 3854/2025/2461 3060/2024/2461 +f 3855/2025/2462 3061/2026/2462 3060/2024/2462 +f 3856/2025/2463 3857/2027/2463 3061/2026/2463 +f 3858/2027/2464 3062/2018/2464 3061/2026/2464 +f 3859/2027/2465 3860/2016/2465 3062/2018/2465 +f 3861/2028/2466 3067/2028/2466 3862/2029/2466 +f 3863/2028/2467 3864/2029/2467 3865/2029/2467 +f 3866/2029/2468 3068/2029/2468 3867/2030/2468 +f 3868/2029/2469 3869/2030/2469 3870/2030/2469 +f 3871/2030/2470 3872/2030/2470 3873/2031/2470 +f 3874/2030/21 3063/2031/21 3064/2031/21 +f 3875/2031/21 3876/2031/21 3877/2032/21 +f 3878/2031/2471 3065/2032/2471 3879/2032/2471 +f 3880/2032/2472 3881/2032/2472 3882/2033/2472 +f 3883/2032/2473 3066/2033/2473 3884/2033/2473 +f 3885/2033/2474 3886/2033/2474 3887/2034/2474 +f 3888/2033/2475 3889/2034/2475 3890/2034/2475 +f 3891/2034/2476 3892/2034/2476 3893/2035/2476 +f 3894/2034/2477 3069/2035/2477 3070/2035/2477 +f 3895/2035/2478 3896/2035/2478 3897/2036/2478 +f 3898/2035/2479 3071/2036/2479 3899/2036/2479 +f 3900/2036/2480 3901/2036/2480 3902/2037/2480 +f 3903/2036/2481 3072/2037/2481 3904/2037/2481 +f 3905/2037/2482 3906/2037/2482 3907/2038/2482 +f 3908/2037/2483 3073/2038/2483 3909/2038/2483 +f 3910/2038/2484 3911/2038/2484 3912/2039/2484 +f 3913/2038/2485 3074/2039/2485 3914/2039/2485 +f 3915/2039/2486 3916/2039/2486 3917/2040/2486 +f 3918/2039/2487 3919/2040/2487 3920/2040/2487 +f 3921/2040/2488 3922/2040/2488 3923/2041/2488 +f 3087/2040/2489 3924/2041/2489 3925/2041/2489 +f 3926/2041/2490 3075/2041/2490 3927/2042/2490 +f 3076/2041/2491 3928/2042/2491 3929/2042/2491 +f 3930/2042/2492 3931/2042/2492 3932/2043/2492 +f 3933/2042/2493 3934/2043/2493 3935/2043/2493 +f 3936/2043/2494 3077/2043/2494 3937/2044/2494 +f 3077/2043/2495 3938/2044/2495 3939/2044/2495 +f 3078/2044/2496 3940/2044/2496 3941/2045/2496 +f 3942/2044/2497 3943/2045/2497 3944/2045/2497 +f 3079/2045/2498 3945/2045/2498 3946/2046/2498 +f 3947/2045/2499 3080/2046/2499 3948/2046/2499 +f 3080/2046/2500 3949/2046/2500 3950/2047/2500 +f 3081/2046/2501 3951/2047/2501 3952/2047/2501 +f 3953/2047/2502 3954/2047/2502 3955/2048/2502 +f 3956/2047/2503 3082/2048/2503 3957/2048/2503 +f 3082/2048/2504 3958/2048/2504 3959/2049/2504 +f 3960/2048/2505 3083/2049/2505 3961/2049/2505 +f 3962/2049/2506 3084/2049/2506 3963/2050/2506 +f 3964/2049/21 3965/2050/21 3966/2050/21 +f 3967/2050/2507 3085/2050/2507 3968/2051/2507 +f 3085/2050/2508 3969/2051/2508 3970/2051/2508 +f 3971/2051/2509 3086/2051/2509 3972/2028/2509 +f 3086/2051/2510 3973/2028/2510 3974/2028/2510 +f 3975/2030/2511 3976/2029/2511 3977/2026/2511 +f 3978/2026/2512 3979/2029/2512 3088/2028/2512 +f 3980/2028/2513 3981/2051/2513 3982/2024/2513 +f 2907/2051/2514 3983/2050/2514 3984/2024/2514 +f 2916/2050/2515 3985/2049/2515 3986/2024/2515 +f 3987/2049/2516 3988/2022/2516 3989/2024/2516 +f 2908/2049/2517 3990/2048/2517 3991/2022/2517 +f 3992/2048/2518 3993/2047/2518 3994/2022/2518 +f 2909/2022/2519 3995/2047/2519 3996/2046/2519 +f 3997/2046/2520 3998/2045/2520 3999/2022/2520 +f 2910/2026/2521 4000/2031/2521 4001/2030/2521 +f 4002/2032/63 4003/2031/63 4004/2026/63 +f 2911/2026/2522 4005/2018/2522 4006/2032/2522 +f 4007/2032/2523 4008/2018/2523 4009/2033/2523 +f 4010/2033/2524 4011/2018/2524 4012/2034/2524 +f 2912/2018/2525 4013/2035/2525 4014/2034/2525 +f 2913/2018/2526 4015/2036/2526 4016/2035/2526 +f 4017/2018/7 4018/2017/7 4019/2036/7 +f 4020/2036/2527 4021/2017/2527 2914/2037/2527 +f 4022/2037/2528 2915/2017/2528 4023/2038/2528 +f 4024/2038/2529 4025/2017/2529 4026/2039/2529 +f 4027/2017/2530 4028/2040/2530 4029/2039/2530 +f 2917/2017/2531 4030/2020/2531 4031/2040/2531 +f 4032/2020/2532 4033/2041/2532 4034/2040/2532 +f 4035/2020/2533 2918/2042/2533 4036/2041/2533 +f 4037/2020/63 4038/2043/63 4039/2042/63 +f 4040/2022/2534 4041/2045/2534 4042/2044/2534 +f 3090/2044/2535 3091/2043/2535 3089/2020/2535 +f 3096/2020/2536 3097/2022/2536 3098/2044/2536 +f 4043/2026/2537 3100/2028/2537 4044/2024/2537 +f 4045/2047/2538 3095/2043/2538 4046/2046/2538 +f 4047/2045/2539 3106/2046/2539 4048/2043/2539 +f 3095/2043/2540 3094/2044/2540 4049/2045/2540 +f 4050/2039/2541 3102/2050/2541 4051/2051/2541 +f 4052/2051/2542 3093/2038/2542 4053/2039/2542 +f 3093/2038/2543 3092/2051/2543 4054/2028/2543 +f 4055/2028/2544 4056/2029/2544 3099/2038/2544 +f 4057/2038/2545 4058/2029/2545 3101/2037/2545 +f 4059/2037/2546 4060/2029/2546 4061/2030/2546 +f 4062/2030/2547 4063/2036/2547 4064/2037/2547 +f 4065/2036/2548 3103/2030/2548 3104/2031/2548 +f 4066/2031/2549 4067/2035/2549 4068/2036/2549 +f 4069/2035/2550 4070/2031/2550 4071/2032/2550 +f 4072/2032/2551 4073/2033/2551 3105/2035/2551 +f 4074/2034/2552 4075/2035/2552 4076/2033/2552 +f 4077/2050/2553 4078/2039/2553 4079/2040/2553 +f 4080/2052/2554 3107/2053/2554 3108/2054/2554 +f 4081/2053/2555 4082/2055/2555 4083/2054/2555 +f 4084/2053/2556 3109/2056/2556 4085/2055/2556 +f 4086/2056/2557 4087/2057/2557 4088/2055/2557 +f 4089/2056/2558 3110/2058/2558 4090/2057/2558 +f 4091/2058/2559 4092/2059/2559 4093/2057/2559 +f 4094/2058/2560 3111/2060/2560 4095/2059/2560 +f 4096/2059/2561 4097/2061/2561 4098/2062/2561 +f 4099/2059/2562 3112/2063/2562 4100/2061/2562 +f 4101/2063/2551 4102/2064/2551 4103/2061/2551 +f 4104/2063/2563 4105/2065/2563 4106/2064/2563 +f 4107/2065/2564 4108/2066/2564 4109/2064/2564 +f 4110/2021/2565 3113/2067/2565 3114/2068/2565 +f 4111/2067/2566 4112/1935/2566 4113/2068/2566 +f 4114/2067/2567 3115/2069/2567 4115/1935/2567 +f 4116/2069/2568 4117/1937/2568 4118/1935/2568 +f 4119/2069/2569 3116/2070/2569 4120/1937/2569 +f 4121/1934/2570 4122/1978/2570 4123/1979/2570 +f 4124/1934/2571 3117/1936/2571 4125/1978/2571 +f 4126/1936/2572 4127/1977/2572 4128/1978/2572 +f 4129/1936/63 3118/2071/63 4130/1977/63 +f 4131/2071/2573 4132/2072/2573 4133/1977/2573 +f 4134/2071/2574 4135/2068/2574 4136/2072/2574 +f 4137/2068/2575 4138/2072/2575 4139/2072/2575 +f 4140/2068/2576 4141/2068/2576 3120/2072/2576 +f 4142/2068/2577 4143/1975/2577 3120/2072/2577 +f 4144/1977/2578 4145/2072/2578 3119/2073/2578 +f 4146/2072/2579 4147/2073/2579 3119/2073/2579 +f 4148/2072/2580 4149/2072/2580 3121/2073/2580 +f 4150/2072/2581 3122/1975/2581 3121/2073/2581 +f 4151/1974/2582 4152/1991/2582 4153/2074/2582 +f 4154/1974/2583 4155/1976/2583 4156/1991/2583 +f 4157/1976/2584 4158/1977/2584 3123/1980/2584 +f 4159/1977/2585 4160/1983/2585 3123/1980/2585 +f 4161/1977/2586 4162/2073/2586 3125/1983/2586 +f 4163/2073/63 4164/2075/63 3125/1983/63 +f 4165/2073/2587 4166/2073/2587 3124/2075/2587 +f 4167/2073/2588 4168/2076/2588 3124/2075/2588 +f 3126/2073/2589 4169/1975/2589 4170/2076/2589 +f 4171/1975/2590 3127/2074/2590 4172/2076/2590 +f 4173/1975/2591 4174/1974/2591 4175/2074/2591 +f 3128/2074/2592 4176/1989/2592 4177/2077/2592 +f 4178/2074/2593 4179/1991/2593 4180/1989/2593 +f 3129/2078/2594 4181/2079/2594 4182/1945/2594 +f 4183/1945/2595 3130/2079/2595 4184/1948/2595 +f 4185/1948/2596 4186/2079/2596 4187/2080/2596 +f 4188/2081/2597 4189/2082/2597 4190/2083/2597 +f 3131/2084/2598 4191/2085/2598 4192/2086/2598 +f 3131/2084/2599 4193/2087/2599 4194/2085/2599 +f 4195/2087/2600 4196/2088/2600 4197/2085/2600 +f 3136/2020/2601 3137/2022/2601 3138/2044/2601 +f 4198/2026/2537 3140/2028/2537 4199/2024/2537 +f 4200/2047/2538 3135/2043/2538 4201/2046/2538 +f 4202/2045/2602 3146/2046/2602 4203/2043/2602 +f 3135/2043/2603 3134/2044/2603 4204/2045/2603 +f 4205/2039/2604 3142/2050/2604 4206/2051/2604 +f 4207/2051/2605 3133/2038/2605 4208/2039/2605 +f 3133/2038/2543 3132/2051/2543 4209/2028/2543 +f 4210/2028/2606 4211/2029/2606 3139/2038/2606 +f 4212/2038/2545 4213/2029/2545 3141/2037/2545 +f 4214/2037/2607 4215/2029/2607 4216/2030/2607 +f 4217/2030/2608 4218/2036/2608 4219/2037/2608 +f 4220/2036/2609 3143/2030/2609 3144/2031/2609 +f 4221/2031/2610 4222/2035/2610 4223/2036/2610 +f 4224/2035/2550 4225/2031/2550 4226/2032/2550 +f 4227/2032/2551 4228/2033/2551 3145/2035/2551 +f 4229/2034/2611 4230/2035/2611 4231/2033/2611 +f 4232/2050/2612 4233/2039/2612 4234/2040/2612 +f 4235/2052/2613 3147/2053/2613 3148/2054/2613 +f 4236/2053/2614 4237/2055/2614 4238/2054/2614 +f 4239/2053/2556 3149/2056/2556 4240/2055/2556 +f 4241/2056/2557 4242/2057/2557 4243/2055/2557 +f 4244/2056/2615 3150/2058/2615 4245/2057/2615 +f 4246/2058/2616 4247/2059/2616 4248/2057/2616 +f 4249/2058/2617 3151/2060/2617 4250/2059/2617 +f 4251/2059/2618 4252/2061/2618 4253/2062/2618 +f 4254/2059/2562 3152/2063/2562 4255/2061/2562 +f 4256/2063/2551 4257/2064/2551 4258/2061/2551 +f 4259/2063/2619 4260/2065/2619 4261/2064/2619 +f 4262/2065/2620 4263/2066/2620 4264/2064/2620 +f 4265/2021/2621 3153/2067/2621 3154/2068/2621 +f 4266/2067/2622 4267/1935/2622 4268/2068/2622 +f 4269/2067/2567 3155/2069/2567 4270/1935/2567 +f 4271/2069/2568 4272/1937/2568 4273/1935/2568 +f 4274/2069/2623 3156/2070/2623 4275/1937/2623 +f 4276/1934/2624 4277/1978/2624 4278/1979/2624 +f 4279/1934/2625 3157/1936/2625 4280/1978/2625 +f 4281/1936/2626 4282/1977/2626 4283/1978/2626 +f 4284/1936/63 3158/2071/63 4285/1977/63 +f 4286/2071/2573 4287/2072/2573 4288/1977/2573 +f 4289/2071/2627 4290/2068/2627 4291/2072/2627 +f 4292/2068/2628 4293/2072/2628 4294/2072/2628 +f 4295/2068/2629 4296/2068/2629 3160/2072/2629 +f 4297/2068/2630 4298/1975/2630 3160/2072/2630 +f 4299/1977/2578 4300/2072/2578 3159/2073/2578 +f 4301/2072/2631 4302/2073/2631 3159/2073/2631 +f 4303/2072/2632 4304/2072/2632 3161/2073/2632 +f 4305/2072/2633 3162/1975/2633 3161/2073/2633 +f 4306/1974/2582 4307/1991/2582 4308/2074/2582 +f 4309/1974/2634 4310/1976/2634 4311/1991/2634 +f 4312/1976/2584 4313/1977/2584 3163/1980/2584 +f 4314/1977/2635 4315/1983/2635 3163/1980/2635 +f 4316/1977/2636 4317/2073/2636 3165/1983/2636 +f 4318/2073/2637 4319/2075/2637 3165/1983/2637 +f 4320/2073/2638 4321/2073/2638 3164/2075/2638 +f 4322/2073/2639 4323/2076/2639 3164/2075/2639 +f 3166/2073/2589 4324/1975/2589 4325/2076/2589 +f 4326/1975/2640 3167/2074/2640 4327/2076/2640 +f 4328/1975/2641 4329/1974/2641 4330/2074/2641 +f 3168/2074/2642 4331/1989/2642 4332/2077/2642 +f 4333/2074/2643 4334/1991/2643 4335/1989/2643 +f 3169/2078/2644 4336/2079/2644 4337/1945/2644 +f 4338/1945/2645 3170/2079/2645 4339/1948/2645 +f 4340/1948/2646 4341/2079/2646 4342/2080/2646 +f 4343/2081/2647 4344/2082/2647 4345/2083/2647 +f 3171/2084/2648 4346/2085/2648 4347/2086/2648 +f 3171/2084/2649 4348/2087/2649 4349/2085/2649 +f 4350/2087/2650 4351/2088/2650 4352/2085/2650 +f 3181/2086/363 3182/2089/363 3184/2090/363 +f 4353/2086/2651 3185/2085/2651 4354/2089/2651 +f 4355/2085/2652 3179/2091/2652 4356/2089/2652 +f 4357/2085/2653 3186/2088/2653 4358/2091/2653 +f 4359/2088/2654 3180/2092/2654 4360/2091/2654 +f 4361/2088/274 3183/2093/274 4362/2092/274 +f 3178/2092/2655 3187/2094/2655 3188/2095/2655 +f 4363/2094/2656 4364/2096/2656 4365/2095/2656 +f 4366/2094/2231 3189/2097/2231 4367/2096/2231 +f 4368/2097/2231 4369/2098/2231 4370/2096/2231 +f 4371/2097/2657 3190/2090/2657 4372/2098/2657 +f 4373/2098/2658 4374/2099/2658 4375/2100/2658 +f 4376/2098/2659 3191/2101/2659 4377/2099/2659 +f 4378/2101/2660 4379/2102/2660 4380/2099/2660 +f 4381/2101/274 3192/2103/274 4382/2102/274 +f 4383/2103/274 4384/2104/274 4385/2102/274 +f 4386/2103/2661 4387/2105/2661 4388/2104/2661 +f 4389/2105/2662 4390/2106/2662 4391/2104/2662 +f 4392/2099/2663 4393/2107/2663 3195/2108/2663 +f 4394/2099/63 4395/2102/63 4396/2107/63 +f 4397/2104/2664 3193/2106/2664 3194/2109/2664 +f 4398/2106/2665 4399/2082/2665 4400/2109/2665 +f 4401/2106/2666 4402/2083/2666 4403/2082/2666 +f 4404/2083/2667 4405/2100/2667 3196/2081/2667 +f 4406/2081/2668 4407/2110/2668 4408/2111/2668 +f 4409/2081/2669 4410/2108/2669 4411/2110/2669 +f 4412/2107/2670 4413/2112/2670 3197/2113/2670 +f 4414/2112/2671 4415/2114/2671 3197/2113/2671 +f 3198/2082/2672 4416/2111/2672 4417/2115/2672 +f 3199/2082/2673 4418/2081/2673 4419/2111/2673 +f 4420/2111/2674 4421/2116/2674 4422/2117/2674 +f 3200/2111/2675 4423/2110/2675 4424/2116/2675 +f 4425/2110/2676 4426/2118/2676 4427/2116/2676 +f 3201/2110/2677 4428/2119/2677 4429/2118/2677 +f 4430/2119/2678 4431/2120/2678 4432/2118/2678 +f 4433/2119/2679 3202/2113/2679 4434/2120/2679 +f 4435/2113/2288 4436/2121/2288 4437/2120/2288 +f 4438/2113/2680 3203/2114/2680 4439/2121/2680 +f 4440/2114/2681 4441/2122/2681 3204/2121/2681 +f 3203/2114/2682 4442/2115/2682 4443/2122/2682 +f 4444/2115/2288 4445/2117/2288 4446/2122/2288 +f 3172/2115/2683 4447/2111/2683 4448/2117/2683 +f 4449/2117/2684 3173/2123/2684 4450/2124/2684 +f 4451/2117/2685 4452/2116/2685 4453/2123/2685 +f 3174/2116/2686 4454/2125/2686 4455/2123/2686 +f 3174/2116/2687 4456/2118/2687 4457/2125/2687 +f 4458/2118/2688 3176/2126/2688 3175/2125/2688 +f 4459/2118/2689 4460/2120/2689 4461/2126/2689 +f 4462/2120/2690 3177/2127/2690 3176/2126/2690 +f 4463/2120/2691 4464/2121/2691 4465/2127/2691 +f 4466/2121/2692 4467/2128/2692 4468/2127/2692 +f 4469/2121/2693 4470/2122/2693 4471/2128/2693 +f 4472/2122/2694 4473/2124/2694 4474/2128/2694 +f 3205/1880/2695 3210/2129/2695 3211/2130/2695 +f 3205/1880/2696 3206/1879/2696 3210/2129/2696 +f 3206/1879/2697 3212/2131/2697 3210/2129/2697 +f 3208/1886/2698 3209/1891/2698 3213/2132/2698 +f 3209/1891/2699 4475/2133/2699 3213/2132/2699 +f 3209/1891/2700 4476/1896/2700 4477/2133/2700 +f 4478/1896/2701 3214/2130/2701 3215/2133/2701 +f 4479/1896/2702 4480/1880/2702 3214/2130/2702 +f 4481/2130/2697 4482/2134/2697 4483/2135/2697 +f 4484/2131/2698 4485/2136/2698 3216/2137/2698 +f 4486/2136/2703 4487/2138/2703 3216/2137/2703 +f 4488/2136/2704 4489/2132/2704 4490/2138/2704 +f 3215/2133/2705 3217/2135/2705 3218/2139/2705 +f 3215/2133/2706 3214/2130/2706 3217/2135/2706 +f 4491/2135/364 3219/2140/364 4492/2141/364 +f 4493/2135/2697 4494/2134/2697 3219/2140/2697 +f 4495/2134/2707 3220/2142/2707 3219/2140/2707 +f 4496/2134/2708 3207/2143/2708 3220/2142/2708 +f 3207/2143/2709 3221/2144/2709 3220/2142/2709 +f 3207/2143/2710 4497/2137/2710 3221/2144/2710 +f 4498/2137/274 3222/2145/274 3221/2144/274 +f 4499/2137/274 4500/2138/274 3222/2145/274 +f 4501/2138/2711 4502/2146/2711 3222/2145/2711 +f 4503/2138/2712 4504/2139/2712 4505/2146/2712 +f 4506/2142/2713 3223/2147/2713 3224/2148/2713 +f 4507/2142/2714 4508/2144/2714 3223/2147/2714 +f 4509/2144/2242 4510/2149/2242 3223/2147/2242 +f 4511/2146/2667 4512/2141/2667 3225/2150/2667 +f 4513/2150/2715 4514/2151/2715 4515/2152/2715 +f 4516/2150/2716 4517/2153/2716 4518/2151/2716 +f 4519/2153/2717 3228/2154/2717 3226/2151/2717 +f 4520/2153/2718 4521/2148/2718 3228/2154/2718 +f 4522/2148/363 4523/2155/363 3228/2154/363 +f 4524/2148/63 4525/2147/63 3227/2155/63 +f 4526/2147/2719 4527/2156/2719 3227/2155/2719 +f 4528/2147/2720 4529/2149/2720 4530/2156/2720 +f 4531/2155/2721 3229/2157/2721 3230/2158/2721 +f 4532/2155/2722 4533/2156/2722 3229/2157/2722 +f 4534/2156/2231 3231/2159/2231 3229/2157/2231 +f 4535/2156/2231 4536/2160/2231 3231/2159/2231 +f 4537/2160/2723 3232/2161/2723 3231/2159/2723 +f 4538/2160/2724 4539/2152/2724 3232/2161/2724 +f 4540/2161/2725 3233/2162/2725 4541/2163/2725 +f 4542/2161/2726 4543/2164/2726 3233/2162/2726 +f 4544/2164/274 3234/2165/274 3233/2162/274 +f 4545/2164/274 4546/2166/274 3234/2165/274 +f 4547/2166/2727 4548/2167/2727 3234/2165/2727 +f 4549/2166/2728 4550/2158/2728 4551/2167/2728 +f 3235/2158/2729 4552/2168/2729 4553/2167/2729 +f 4554/2158/2730 3236/2157/2730 4555/2168/2730 +f 3237/2157/2731 4556/2169/2731 4557/2168/2731 +f 4558/2157/2697 4559/2159/2697 4560/2169/2697 +f 3238/2159/362 4561/2163/362 4562/2169/362 +f 4563/2159/2732 4564/2161/2732 4565/2163/2732 +f 3239/2163/2733 4566/2170/2733 4567/2171/2733 +f 3240/2163/2734 4568/2162/2734 4569/2170/2734 +f 4570/2162/2735 4571/2172/2735 4572/2170/2735 +f 4573/2162/2736 4574/2165/2736 4575/2172/2736 +f 3241/2165/2737 4576/2167/2737 4577/2173/2737 +f 3242/2167/2738 4578/2174/2738 4579/2173/2738 +f 4580/2167/274 4581/2168/274 4582/2174/274 +f 3243/2168/274 4583/2175/274 4584/2174/274 +f 4585/2168/2739 4586/2169/2739 4587/2175/2739 +f 3244/2169/2740 4588/2171/2740 4589/2175/2740 +f 3244/2169/2741 4590/2163/2741 4591/2171/2741 +o dieshara +v -0.205252 3.245716 3.742707 +v -0.216276 3.245716 3.749071 +v -0.216276 3.245716 3.736342 +v -0.205252 3.118819 3.742707 +v -0.216276 3.118819 3.749071 +v -0.216276 3.118819 3.736342 +v -0.206203 3.387220 3.741983 +v -0.207522 3.387220 3.737924 +v -0.210975 3.387220 3.735415 +v -0.215244 3.387220 3.735415 +v -0.218697 3.387220 3.737924 +v -0.220016 3.387220 3.741983 +v -0.218697 3.387220 3.746043 +v -0.215244 3.387220 3.748552 +v -0.210975 3.387220 3.748552 +v -0.207522 3.387220 3.746043 +v -0.206203 3.262122 3.741983 +v -0.207522 3.262122 3.737924 +v -0.210975 3.262122 3.735415 +v -0.215244 3.262122 3.735415 +v -0.218697 3.262122 3.737924 +v -0.220016 3.262122 3.741983 +v -0.218697 3.262122 3.746043 +v -0.215244 3.262122 3.748552 +v -0.210975 3.262122 3.748552 +v -0.207522 3.262122 3.746043 +v -0.679881 3.387220 3.743565 +v -0.681200 3.387220 3.739506 +v -0.684653 3.387220 3.736997 +v -0.688922 3.387220 3.736997 +v -0.692375 3.387220 3.739506 +v -0.693694 3.387220 3.743565 +v -0.692375 3.387220 3.747625 +v -0.688922 3.387220 3.750134 +v -0.684653 3.387220 3.750134 +v -0.681200 3.387220 3.747625 +v -0.679881 3.262123 3.743565 +v -0.681200 3.262123 3.739506 +v -0.684654 3.262123 3.736997 +v -0.688922 3.262123 3.736997 +v -0.692375 3.262123 3.739506 +v -0.693694 3.262123 3.743565 +v -0.692375 3.262123 3.747625 +v -0.688922 3.262123 3.750134 +v -0.684653 3.262123 3.750134 +v -0.681200 3.262123 3.747625 +v -0.881025 3.387221 3.393770 +v -0.882344 3.387221 3.389710 +v -0.885798 3.387221 3.387201 +v -0.890066 3.387221 3.387201 +v -0.893519 3.387221 3.389710 +v -0.894838 3.387221 3.393770 +v -0.893519 3.387221 3.397829 +v -0.890066 3.387221 3.400338 +v -0.885798 3.387221 3.400338 +v -0.882344 3.387221 3.397829 +v -0.881025 3.262124 3.393770 +v -0.882344 3.262124 3.389710 +v -0.885798 3.262124 3.387201 +v -0.890066 3.262124 3.387201 +v -0.893519 3.262124 3.389710 +v -0.894838 3.262124 3.393770 +v -0.893519 3.262124 3.397829 +v -0.890066 3.262124 3.400338 +v -0.885798 3.262124 3.400338 +v -0.882344 3.262124 3.397829 +v -0.682628 3.387222 3.012104 +v -0.683946 3.387222 3.008044 +v -0.687400 3.387222 3.005535 +v -0.691668 3.387222 3.005535 +v -0.695121 3.387222 3.008044 +v -0.696440 3.387222 3.012104 +v -0.695121 3.387222 3.016163 +v -0.691668 3.387222 3.018672 +v -0.687400 3.387222 3.018672 +v -0.683946 3.387222 3.016163 +v -0.682628 3.262125 3.012104 +v -0.683946 3.262125 3.008044 +v -0.687400 3.262125 3.005535 +v -0.691668 3.262125 3.005535 +v -0.695121 3.262125 3.008044 +v -0.696440 3.262125 3.012104 +v -0.695121 3.262125 3.016163 +v -0.691668 3.262125 3.018672 +v -0.687400 3.262125 3.018672 +v -0.683946 3.262125 3.016163 +v -0.204912 3.387222 3.015418 +v -0.206232 3.387222 3.011359 +v -0.209685 3.387222 3.008850 +v -0.213953 3.387222 3.008850 +v -0.217406 3.387222 3.011359 +v -0.218725 3.387222 3.015418 +v -0.217406 3.387222 3.019477 +v -0.213953 3.387222 3.021986 +v -0.209685 3.387222 3.021986 +v -0.206232 3.387222 3.019478 +v -0.204913 3.262125 3.015418 +v -0.206232 3.262125 3.011359 +v -0.209685 3.262125 3.008850 +v -0.213953 3.262125 3.008850 +v -0.217406 3.262125 3.011359 +v -0.218725 3.262125 3.015418 +v -0.217406 3.262125 3.019477 +v -0.213953 3.262125 3.021986 +v -0.209685 3.262125 3.021986 +v -0.206232 3.262125 3.019477 +v -0.029668 3.387221 3.235538 +v -0.030987 3.387221 3.231478 +v -0.034441 3.387221 3.228969 +v -0.038709 3.387221 3.228969 +v -0.042162 3.387221 3.231478 +v -0.043481 3.387221 3.235538 +v -0.042162 3.387221 3.239597 +v -0.038709 3.387221 3.242106 +v -0.034441 3.387221 3.242106 +v -0.030987 3.387221 3.239597 +v -0.029668 3.262125 3.235538 +v -0.030987 3.262125 3.231478 +v -0.034441 3.262125 3.228969 +v -0.038709 3.262125 3.228969 +v -0.042162 3.262125 3.231478 +v -0.043481 3.262125 3.235538 +v -0.042162 3.262125 3.239597 +v -0.038709 3.262125 3.242106 +v -0.034441 3.262125 3.242106 +v -0.030987 3.262125 3.239597 +v -0.028398 3.245787 3.234976 +v -0.029717 3.245787 3.230917 +v -0.033170 3.245787 3.228408 +v -0.037439 3.245787 3.228407 +v -0.040892 3.245787 3.230917 +v -0.042211 3.245787 3.234976 +v -0.040892 3.245787 3.239035 +v -0.037439 3.245787 3.241544 +v -0.033170 3.245787 3.241544 +v -0.029717 3.245787 3.239035 +v -0.205022 3.245788 3.015661 +v -0.206341 3.245788 3.011601 +v -0.209794 3.245788 3.009092 +v -0.214063 3.245788 3.009092 +v -0.217516 3.245788 3.011601 +v -0.218835 3.245788 3.015661 +v -0.217516 3.245788 3.019720 +v -0.214063 3.245788 3.022229 +v -0.209794 3.245788 3.022229 +v -0.206341 3.245788 3.019720 +v -0.684006 3.245789 3.011274 +v -0.685325 3.245789 3.007215 +v -0.688778 3.245789 3.004705 +v -0.693047 3.245789 3.004705 +v -0.696500 3.245789 3.007214 +v -0.697819 3.245789 3.011274 +v -0.696500 3.245789 3.015333 +v -0.693047 3.245789 3.017842 +v -0.688778 3.245789 3.017842 +v -0.685325 3.245789 3.015333 +v -0.881019 3.245789 3.394308 +v -0.882338 3.245789 3.390249 +v -0.885792 3.245789 3.387740 +v -0.890060 3.245789 3.387740 +v -0.893513 3.245789 3.390249 +v -0.894832 3.245789 3.394308 +v -0.893513 3.245789 3.398368 +v -0.890060 3.245789 3.400877 +v -0.885792 3.245789 3.400877 +v -0.882338 3.245789 3.398368 +v -0.680241 3.245789 3.743258 +v -0.681560 3.245789 3.739198 +v -0.685013 3.245789 3.736689 +v -0.689281 3.245789 3.736689 +v -0.692734 3.245789 3.739198 +v -0.694053 3.245789 3.743258 +v -0.692734 3.245789 3.747317 +v -0.689281 3.245789 3.749826 +v -0.685013 3.245789 3.749826 +v -0.681560 3.245789 3.747317 +v -0.206203 3.245790 3.741984 +v -0.207522 3.245790 3.737924 +v -0.210975 3.245790 3.735415 +v -0.215244 3.245790 3.735415 +v -0.218697 3.245790 3.737924 +v -0.220016 3.245790 3.741984 +v -0.218697 3.245790 3.746043 +v -0.215244 3.245790 3.748552 +v -0.210975 3.245790 3.748552 +v -0.207522 3.245790 3.746043 +v -0.034618 3.245790 3.514323 +v -0.035937 3.245790 3.510264 +v -0.039390 3.245790 3.507755 +v -0.043659 3.245790 3.507755 +v -0.047112 3.245790 3.510264 +v -0.048431 3.245790 3.514323 +v -0.047112 3.245790 3.518383 +v -0.043659 3.245790 3.520892 +v -0.039390 3.245790 3.520892 +v -0.035937 3.245790 3.518383 +v 0.284792 3.262126 3.243422 +v 0.259520 3.262126 3.226256 +v 0.259520 3.262126 3.243422 +v 0.284792 3.262126 3.226256 +v 0.259520 3.245787 3.226256 +v 0.284792 3.245787 3.226256 +v 0.259520 3.245787 3.243422 +v 0.284792 3.245787 3.243422 +v 0.243297 3.262126 3.226256 +v 0.243297 3.262126 3.243422 +v 0.243297 3.245787 3.226256 +v 0.243297 3.245787 3.243422 +v 0.214357 3.262126 3.226256 +v 0.214357 3.262126 3.243422 +v 0.214357 3.245787 3.226256 +v 0.214357 3.245787 3.243422 +v 0.185533 3.262126 3.226256 +v 0.185533 3.262126 3.243422 +v 0.185533 3.245787 3.226256 +v 0.185533 3.245787 3.243422 +v 0.156862 3.262125 3.226256 +v 0.156862 3.262126 3.243421 +v 0.156862 3.245787 3.226256 +v 0.156862 3.245787 3.243421 +v 0.128382 3.262125 3.226256 +v 0.128382 3.262125 3.243422 +v 0.128382 3.245787 3.226256 +v 0.128382 3.245787 3.243421 +v 0.100132 3.262125 3.226256 +v 0.100132 3.262125 3.243421 +v 0.100132 3.245787 3.226256 +v 0.100132 3.245787 3.243421 +v 0.072150 3.262125 3.226256 +v 0.072150 3.262125 3.243421 +v 0.072150 3.245787 3.226256 +v 0.072150 3.245787 3.243421 +v 0.044475 3.262125 3.226256 +v 0.044475 3.262125 3.243421 +v 0.044475 3.245787 3.226256 +v 0.044475 3.245787 3.243421 +v 0.017144 3.262125 3.226256 +v 0.017144 3.262125 3.243421 +v 0.017144 3.245787 3.226256 +v 0.017144 3.245787 3.243421 +v -0.009803 3.262125 3.226256 +v -0.009803 3.262125 3.243421 +v -0.009803 3.245787 3.226256 +v -0.009803 3.245787 3.243421 +v -0.030544 3.262125 3.226463 +v -0.030544 3.245787 3.226463 +v -0.040496 3.262125 3.243532 +v -0.040496 3.245787 3.243532 +v -0.048924 3.245787 3.191907 +v -0.048924 3.262125 3.191907 +v -0.063603 3.245787 3.200301 +v -0.063603 3.262125 3.200301 +v -0.071262 3.262125 3.154022 +v -0.085398 3.262125 3.163335 +v -0.071262 3.245788 3.154022 +v -0.085398 3.245788 3.163335 +v -0.096033 3.262125 3.117762 +v -0.109477 3.262125 3.128085 +v -0.096033 3.245788 3.117762 +v -0.109477 3.245788 3.128085 +v -0.123474 3.262125 3.083504 +v -0.136054 3.262125 3.094904 +v -0.123474 3.245788 3.083504 +v -0.136054 3.245788 3.094904 +v -0.153822 3.262125 3.051628 +v -0.165346 3.262125 3.064136 +v -0.153822 3.245788 3.051628 +v -0.165346 3.245788 3.064136 +v -0.187307 3.262125 3.022520 +v -0.197574 3.262125 3.036119 +v -0.187307 3.245788 3.022520 +v -0.197574 3.245788 3.036119 +v -0.224147 3.245788 2.996572 +v -0.224147 3.262125 2.996572 +v -0.232970 3.262125 3.011187 +v -0.232970 3.245788 3.011187 +v -0.264553 3.262125 2.974174 +v -0.271778 3.262125 2.989675 +v -0.264553 3.245788 2.974174 +v -0.271778 3.245788 2.989675 +v -0.308721 3.262125 2.955713 +v -0.314251 3.262125 2.971923 +v -0.308721 3.245788 2.955713 +v -0.314251 3.245788 2.971923 +v -0.356845 3.262125 2.941563 +v -0.360649 3.262125 2.958282 +v -0.356845 3.245788 2.941563 +v -0.360649 3.245788 2.958282 +v -0.409118 3.262125 2.932087 +v -0.411230 3.262125 2.949114 +v -0.409118 3.245788 2.932087 +v -0.411230 3.245788 2.949114 +v -0.466206 3.262125 2.927636 +v -0.465779 3.262125 2.944794 +v -0.466206 3.245788 2.927636 +v -0.465779 3.245788 2.944794 +v -0.529976 3.262125 2.936305 +v -0.526731 3.262125 2.953146 +v -0.529976 3.245788 2.936306 +v -0.526731 3.245788 2.953146 +v -0.589490 3.262125 2.952163 +v -0.584227 3.262125 2.968465 +v -0.589490 3.245789 2.952163 +v -0.584227 3.245789 2.968465 +v -0.644802 3.262125 2.974759 +v -0.637564 3.262125 2.990253 +v -0.644802 3.245789 2.974759 +v -0.637564 3.245789 2.990253 +v -0.695562 3.262125 3.003613 +v -0.695562 3.245789 3.003613 +v -0.686442 3.245789 3.018036 +v -0.686442 3.262125 3.018036 +v -0.741423 3.245789 3.038244 +v -0.741423 3.262125 3.038244 +v -0.730557 3.245789 3.051347 +v -0.730557 3.262125 3.051347 +v -0.782041 3.262125 3.078164 +v -0.769605 3.262125 3.089724 +v -0.782041 3.245789 3.078164 +v -0.769605 3.245789 3.089724 +v -0.817074 3.262125 3.122883 +v -0.803277 3.262125 3.132705 +v -0.817074 3.245789 3.122883 +v -0.803277 3.245789 3.132705 +v -0.846186 3.262125 3.171909 +v -0.831261 3.262125 3.179834 +v -0.846186 3.245789 3.171909 +v -0.831261 3.245789 3.179834 +v -0.869040 3.262124 3.224748 +v -0.853242 3.262124 3.230654 +v -0.869040 3.245789 3.224748 +v -0.853242 3.245789 3.230654 +v -0.885307 3.262124 3.280902 +v -0.868901 3.262124 3.284711 +v -0.885307 3.245789 3.280902 +v -0.868901 3.245789 3.284711 +v -0.894660 3.262124 3.339877 +v -0.877915 3.262124 3.341551 +v -0.894660 3.245789 3.339877 +v -0.877915 3.245789 3.341551 +v -0.896754 3.245789 3.401602 +v -0.896754 3.262124 3.401602 +v -0.879978 3.262124 3.400293 +v -0.879978 3.245789 3.400293 +v -0.886838 3.262124 3.456983 +v -0.870454 3.262124 3.453084 +v -0.886838 3.245789 3.456983 +v -0.870454 3.245789 3.453084 +v -0.871997 3.262124 3.510005 +v -0.856069 3.262124 3.504477 +v -0.871997 3.245789 3.510005 +v -0.856069 3.245789 3.504477 +v -0.852213 3.262123 3.560639 +v -0.836931 3.262123 3.553460 +v -0.852213 3.245789 3.560639 +v -0.836931 3.245789 3.553460 +v -0.827519 3.262123 3.608358 +v -0.813096 3.262123 3.599522 +v -0.827519 3.245789 3.608358 +v -0.813096 3.245789 3.599522 +v -0.797948 3.262123 3.652627 +v -0.784621 3.262123 3.642153 +v -0.797948 3.245789 3.652627 +v -0.784621 3.245789 3.642153 +v -0.763539 3.262123 3.692903 +v -0.751557 3.262123 3.680856 +v -0.763539 3.245789 3.692902 +v -0.751557 3.245789 3.680856 +v -0.724334 3.262123 3.728637 +v -0.713949 3.262123 3.715136 +v -0.724334 3.245789 3.728637 +v -0.713949 3.245789 3.715136 +v -0.680392 3.245789 3.759278 +v -0.680392 3.262123 3.759278 +v -0.671831 3.262123 3.744505 +v -0.671831 3.245789 3.744505 +v -0.631781 3.262123 3.784274 +v -0.625221 3.262123 3.768472 +v -0.631781 3.245789 3.784274 +v -0.625221 3.245789 3.768472 +v -0.578584 3.262123 3.803084 +v -0.574128 3.262123 3.786537 +v -0.578584 3.245789 3.803084 +v -0.574128 3.245789 3.786537 +v -0.520888 3.262123 3.815180 +v -0.518553 3.262123 3.798187 +v -0.520888 3.245789 3.815180 +v -0.518553 3.245789 3.798187 +v -0.458851 3.262123 3.820048 +v -0.458429 3.262123 3.802893 +v -0.458851 3.245789 3.820048 +v -0.458429 3.245789 3.802893 +v -0.405006 3.262122 3.818570 +v -0.406488 3.262122 3.801477 +v -0.405006 3.245789 3.818570 +v -0.406488 3.245789 3.801477 +v -0.353588 3.262122 3.810728 +v -0.357075 3.262122 3.793941 +v -0.353588 3.245789 3.810728 +v -0.357075 3.245789 3.793941 +v -0.304946 3.262122 3.797126 +v -0.310338 3.262122 3.780872 +v -0.304946 3.245789 3.797126 +v -0.310338 3.245790 3.780872 +v -0.259343 3.262122 3.778374 +v -0.266508 3.262122 3.762849 +v -0.259343 3.245789 3.778374 +v -0.266508 3.245790 3.762849 +v -0.217037 3.262122 3.755083 +v -0.225826 3.262122 3.740452 +v -0.217037 3.245790 3.755083 +v -0.225826 3.245790 3.740452 +v -0.178276 3.245790 3.727859 +v -0.178275 3.262122 3.727859 +v -0.188539 3.262122 3.714264 +v -0.188539 3.245790 3.714264 +v -0.143304 3.262122 3.697305 +v -0.154900 3.262122 3.684873 +v -0.143304 3.245790 3.697305 +v -0.154900 3.245790 3.684873 +v -0.112366 3.262122 3.664016 +v -0.125160 3.262122 3.652875 +v -0.112366 3.245790 3.664016 +v -0.125161 3.245790 3.652875 +v -0.085706 3.262122 3.628582 +v -0.099574 3.262122 3.618870 +v -0.085706 3.245790 3.628582 +v -0.099574 3.245790 3.618870 +v -0.063569 3.262122 3.591585 +v -0.078389 3.262122 3.583466 +v -0.063569 3.245790 3.591585 +v -0.078389 3.245790 3.583466 +v -0.046212 3.262122 3.553601 +v -0.061850 3.262122 3.547277 +v -0.046212 3.245790 3.553601 +v -0.061850 3.245790 3.547277 +v -0.035721 3.262122 3.522561 +v -0.047433 3.262122 3.504187 +v -0.035721 3.245790 3.522561 +v -0.047433 3.245790 3.504187 +v -0.015910 3.262122 3.522476 +v -0.016229 3.262122 3.504577 +v -0.015910 3.245790 3.522476 +v -0.016229 3.245790 3.504577 +v 0.010685 3.262122 3.522476 +v 0.010484 3.262122 3.504565 +v 0.010685 3.245790 3.522476 +v 0.010484 3.245790 3.504565 +v 0.037908 3.262122 3.522476 +v 0.037809 3.262122 3.504558 +v 0.037908 3.245790 3.522476 +v 0.037809 3.245790 3.504558 +v 0.065696 3.262122 3.522476 +v 0.065685 3.262122 3.504555 +v 0.065696 3.245790 3.522476 +v 0.065685 3.245790 3.504555 +v 0.093987 3.262122 3.522476 +v 0.094050 3.262122 3.504557 +v 0.093987 3.245790 3.522476 +v 0.094050 3.245790 3.504557 +v 0.122718 3.262122 3.522476 +v 0.122844 3.262122 3.504561 +v 0.122718 3.245790 3.522476 +v 0.122844 3.245790 3.504561 +v 0.151826 3.262122 3.522476 +v 0.152004 3.262122 3.504569 +v 0.151826 3.245790 3.522476 +v 0.152004 3.245790 3.504569 +v 0.181249 3.262122 3.522477 +v 0.181469 3.262122 3.504580 +v 0.181249 3.245790 3.522477 +v 0.181469 3.245790 3.504580 +v 0.210926 3.262122 3.522477 +v 0.211177 3.262122 3.504592 +v 0.210926 3.245790 3.522477 +v 0.211177 3.245790 3.504592 +v 0.240793 3.262122 3.522478 +v 0.241065 3.262122 3.504606 +v 0.240793 3.245790 3.522478 +v 0.241065 3.245790 3.504607 +v 0.257997 3.262122 3.522478 +v 0.258280 3.262122 3.504621 +v 0.257997 3.245790 3.522478 +v 0.258280 3.245790 3.504621 +v 0.284467 3.262122 3.523059 +v 0.284373 3.262122 3.504870 +v 0.284467 3.245790 3.523059 +v 0.284373 3.245790 3.507518 +v -0.034791 3.387363 3.514364 +v -0.036109 3.387364 3.510304 +v -0.039563 3.387364 3.507795 +v -0.043831 3.387364 3.507795 +v -0.047284 3.387364 3.510304 +v -0.048603 3.387365 3.514364 +v -0.047284 3.387364 3.518423 +v -0.043831 3.387364 3.520932 +v -0.039563 3.387363 3.520932 +v -0.036109 3.387363 3.518423 +v -0.897977 3.403733 3.400838 +v -0.878715 3.403806 3.336111 +v -0.895821 3.403806 3.334201 +v -0.881836 3.403733 3.400838 +v -0.878715 3.387264 3.336111 +v -0.881837 3.387337 3.400838 +v -0.895821 3.387264 3.334201 +v -0.897978 3.387336 3.400838 +v -0.867843 3.403804 3.274055 +v -0.884532 3.403804 3.269795 +v -0.867843 3.387266 3.274055 +v -0.884532 3.387266 3.269795 +v -0.849117 3.403800 3.215166 +v -0.865072 3.403800 3.208618 +v -0.849117 3.387269 3.215166 +v -0.865072 3.387269 3.208619 +v -0.822961 3.403798 3.160172 +v -0.837871 3.403798 3.151441 +v -0.822961 3.387272 3.160172 +v -0.837871 3.387272 3.151441 +v -0.789799 3.403796 3.109801 +v -0.803358 3.403796 3.099029 +v -0.789799 3.387275 3.109801 +v -0.803358 3.387275 3.099029 +v -0.750053 3.403794 3.064780 +v -0.761967 3.403793 3.052154 +v -0.750053 3.387277 3.064780 +v -0.761967 3.387277 3.052154 +v -0.704138 3.403790 3.025832 +v -0.714135 3.403790 3.011588 +v -0.704138 3.387279 3.025832 +v -0.714135 3.387279 3.011588 +v -0.652463 3.403788 2.993680 +v -0.660309 3.403788 2.978104 +v -0.652463 3.387282 2.993680 +v -0.660309 3.387283 2.978104 +v -0.595428 3.403785 2.969051 +v -0.600944 3.403785 2.952474 +v -0.595427 3.387285 2.969051 +v -0.600944 3.387285 2.952474 +v -0.533420 3.403783 2.952676 +v -0.536505 3.403784 2.935461 +v -0.533420 3.387287 2.952676 +v -0.536505 3.387288 2.935461 +v -0.467084 3.403780 2.945306 +v -0.467201 3.403781 2.927811 +v -0.467084 3.387290 2.945306 +v -0.467201 3.387290 2.927811 +v -0.407494 3.403779 2.950058 +v -0.405304 3.403779 2.932710 +v -0.407495 3.387292 2.950057 +v -0.405304 3.387292 2.932710 +v -0.352922 3.403777 2.960197 +v -0.348926 3.403777 2.943193 +v -0.352921 3.387295 2.960197 +v -0.348925 3.387295 2.943193 +v -0.303357 3.403774 2.975363 +v -0.297479 3.403774 2.958941 +v -0.303357 3.387296 2.975363 +v -0.297479 3.387296 2.958941 +v -0.258460 3.403773 2.995206 +v -0.250709 3.403773 2.979618 +v -0.258460 3.387299 2.995206 +v -0.250709 3.387299 2.979618 +v -0.217887 3.403770 3.019398 +v -0.208365 3.403770 3.004872 +v -0.217887 3.387300 3.019398 +v -0.208365 3.387300 3.004872 +v -0.181299 3.403768 3.047629 +v -0.170191 3.403768 3.034332 +v -0.181299 3.387302 3.047629 +v -0.170191 3.387302 3.034332 +v -0.148374 3.403765 3.079597 +v -0.135915 3.403766 3.067616 +v -0.148374 3.387304 3.079597 +v -0.135915 3.387304 3.067616 +v -0.118806 3.403764 3.115002 +v -0.105247 3.403764 3.104342 +v -0.118806 3.387307 3.115002 +v -0.105247 3.387307 3.104342 +v -0.092305 3.403762 3.153536 +v -0.077881 3.403762 3.144137 +v -0.092305 3.387308 3.153536 +v -0.077882 3.387308 3.144137 +v -0.068589 3.403759 3.194881 +v -0.053507 3.403759 3.186636 +v -0.068589 3.387310 3.194881 +v -0.053507 3.387310 3.186636 +v -0.044226 3.403758 3.243448 +v -0.034330 3.403758 3.226375 +v -0.044226 3.387312 3.243448 +v -0.034330 3.387312 3.226375 +v -0.009815 3.403756 3.243817 +v -0.009816 3.403756 3.226373 +v -0.009813 3.387314 3.243818 +v -0.009815 3.387314 3.226374 +v 0.022104 3.403755 3.243811 +v 0.022102 3.403754 3.226371 +v 0.022106 3.387316 3.243812 +v 0.022104 3.387315 3.226372 +v 0.055940 3.403753 3.243804 +v 0.055938 3.403752 3.226367 +v 0.055942 3.387317 3.243804 +v 0.055940 3.387316 3.226367 +v 0.091472 3.403751 3.243795 +v 0.091470 3.403750 3.226361 +v 0.091474 3.387318 3.243795 +v 0.091472 3.387318 3.226362 +v 0.128477 3.403750 3.243785 +v 0.128476 3.403750 3.226355 +v 0.128479 3.387320 3.243786 +v 0.128477 3.387320 3.226355 +v 0.166736 3.403749 3.243775 +v 0.166734 3.403748 3.226348 +v 0.166738 3.387322 3.243776 +v 0.166736 3.387321 3.226348 +v 0.206025 3.403747 3.243765 +v 0.206024 3.403747 3.226341 +v 0.206027 3.387323 3.243766 +v 0.206026 3.387323 3.226342 +v 0.246124 3.403745 3.243757 +v 0.246122 3.403745 3.226336 +v 0.246126 3.387325 3.243757 +v 0.246124 3.387324 3.226336 +v 0.286810 3.403744 3.243749 +v 0.286809 3.403744 3.226331 +v 0.286812 3.387326 3.243749 +v 0.286811 3.387326 3.226332 +v 0.327863 3.403743 3.243743 +v 0.327861 3.403742 3.226329 +v 0.327865 3.387328 3.243744 +v 0.327863 3.387327 3.226330 +v 0.369072 3.403741 3.243740 +v 0.369045 3.403740 3.226329 +v 0.369074 3.387329 3.243741 +v 0.369047 3.387329 3.226330 +v 0.389608 3.403740 3.245059 +v 0.392026 3.403740 3.227825 +v 0.389610 3.387331 3.245060 +v 0.392028 3.387330 3.227826 +v 0.408457 3.403739 3.249382 +v 0.413538 3.403739 3.232763 +v 0.408460 3.387331 3.249383 +v 0.413540 3.387331 3.232764 +v 0.425682 3.403738 3.256446 +v 0.433310 3.403738 3.240876 +v 0.425683 3.387332 3.256447 +v 0.433312 3.387331 3.240877 +v 0.441232 3.403737 3.266013 +v 0.451177 3.403737 3.251870 +v 0.441233 3.387332 3.266015 +v 0.451179 3.387332 3.251872 +v 0.455044 3.403737 3.277862 +v 0.466993 3.403736 3.265438 +v 0.455045 3.387334 3.277864 +v 0.466994 3.387333 3.265440 +v 0.467029 3.403736 3.291773 +v 0.480633 3.403735 3.281270 +v 0.467029 3.387334 3.291773 +v 0.480633 3.387334 3.281271 +v 0.477081 3.403735 3.307518 +v 0.491990 3.403734 3.299059 +v 0.477081 3.387335 3.307519 +v 0.491991 3.387335 3.299061 +v 0.485086 3.403734 3.324862 +v 0.500970 3.403733 3.318515 +v 0.485086 3.387336 3.324863 +v 0.500969 3.387335 3.318515 +v 0.490925 3.403733 3.343559 +v 0.507476 3.403733 3.339351 +v 0.490925 3.387337 3.343560 +v 0.507475 3.387336 3.339351 +v 0.494481 3.403732 3.363354 +v 0.511416 3.403732 3.361290 +v 0.494480 3.387338 3.363355 +v 0.511415 3.387337 3.361291 +v 0.495639 3.403732 3.383988 +v 0.512692 3.403731 3.384063 +v 0.495638 3.387338 3.383990 +v 0.512691 3.387338 3.384065 +v 0.494190 3.403731 3.403972 +v 0.511059 3.403730 3.406520 +v 0.494189 3.387339 3.403972 +v 0.511058 3.387338 3.406520 +v 0.490162 3.403731 3.422238 +v 0.506461 3.403729 3.427344 +v 0.490161 3.387341 3.422238 +v 0.506460 3.387339 3.427344 +v 0.483777 3.403730 3.438778 +v 0.499101 3.403729 3.446400 +v 0.483775 3.387341 3.438780 +v 0.499099 3.387340 3.446401 +v 0.475233 3.403729 3.453587 +v 0.489201 3.403728 3.463554 +v 0.475230 3.387342 3.453588 +v 0.489198 3.387341 3.463555 +v 0.464709 3.403728 3.466645 +v 0.477006 3.403727 3.478683 +v 0.464707 3.387342 3.466645 +v 0.477003 3.387341 3.478684 +v 0.452373 3.403728 3.477911 +v 0.462771 3.403726 3.491684 +v 0.452371 3.387344 3.477911 +v 0.462769 3.387342 3.491684 +v 0.438393 3.403727 3.487329 +v 0.446755 3.403726 3.502474 +v 0.438391 3.387344 3.487329 +v 0.446752 3.387342 3.502473 +v 0.422939 3.403726 3.494823 +v 0.429205 3.403724 3.510984 +v 0.422938 3.387345 3.494822 +v 0.429204 3.387344 3.510983 +v 0.406200 3.403725 3.500308 +v 0.410363 3.403724 3.517158 +v 0.406199 3.387346 3.500306 +v 0.410362 3.387345 3.517156 +v 0.388366 3.403724 3.503696 +v 0.390457 3.403723 3.520940 +v 0.388364 3.387347 3.503694 +v 0.390455 3.387345 3.520938 +v 0.369579 3.403723 3.504902 +v 0.369770 3.403722 3.522274 +v 0.369577 3.387347 3.504900 +v 0.369769 3.387346 3.522272 +v 0.341038 3.403723 3.505027 +v 0.341138 3.403721 3.522397 +v 0.341034 3.387349 3.505025 +v 0.341134 3.387348 3.522395 +v 0.307508 3.403721 3.504871 +v 0.307542 3.403719 3.522238 +v 0.307505 3.387350 3.504869 +v 0.307539 3.387348 3.522237 +v 0.270053 3.403719 3.504832 +v 0.270042 3.403717 3.522183 +v 0.270051 3.387352 3.504832 +v 0.270040 3.387350 3.522183 +v 0.229737 3.403717 3.504830 +v 0.229695 3.403715 3.522181 +v 0.229735 3.387353 3.504830 +v 0.229692 3.387352 3.522181 +v 0.187622 3.403716 3.504826 +v 0.187556 3.403715 3.522177 +v 0.187621 3.387355 3.504826 +v 0.187555 3.387353 3.522177 +v 0.144769 3.403715 3.504821 +v 0.144685 3.403713 3.522172 +v 0.144767 3.387357 3.504820 +v 0.144684 3.387355 3.522171 +v 0.102240 3.403713 3.504813 +v 0.102142 3.403711 3.522166 +v 0.102238 3.387358 3.504813 +v 0.102141 3.387357 3.522165 +v 0.061094 3.403711 3.504806 +v 0.060986 3.403709 3.522159 +v 0.061093 3.387359 3.504806 +v 0.060985 3.387357 3.522158 +v 0.022391 3.403710 3.504798 +v 0.022277 3.403708 3.522151 +v 0.022390 3.387361 3.504798 +v 0.022276 3.387360 3.522151 +v -0.012810 3.403708 3.504791 +v -0.012924 3.403706 3.522145 +v -0.012811 3.387363 3.504791 +v -0.012925 3.387361 3.522144 +v -0.048399 3.403707 3.504735 +v -0.036162 3.403705 3.522184 +v -0.048400 3.387364 3.504734 +v -0.036164 3.387363 3.522183 +v -0.064707 3.403705 3.549778 +v -0.048984 3.403703 3.556363 +v -0.064709 3.387367 3.549779 +v -0.048986 3.387365 3.556363 +v -0.083518 3.403702 3.589091 +v -0.068733 3.403701 3.597631 +v -0.083521 3.387368 3.589092 +v -0.068735 3.387366 3.597631 +v -0.107852 3.403701 3.627356 +v -0.094157 3.403699 3.637607 +v -0.107854 3.387370 3.627356 +v -0.094159 3.387369 3.637607 +v -0.137374 3.403698 3.663773 +v -0.124913 3.403697 3.675541 +v -0.137376 3.387372 3.663773 +v -0.124915 3.387371 3.675541 +v -0.171746 3.403696 3.697555 +v -0.160666 3.403694 3.710676 +v -0.171748 3.387374 3.697554 +v -0.160668 3.387372 3.710675 +v -0.210624 3.403694 3.727921 +v -0.201085 3.403692 3.742241 +v -0.210626 3.387377 3.727921 +v -0.201087 3.387374 3.742240 +v -0.253662 3.403692 3.754103 +v -0.245838 3.403690 3.769461 +v -0.253663 3.387378 3.754102 +v -0.245838 3.387377 3.769460 +v -0.300521 3.403690 3.775338 +v -0.294588 3.403688 3.791548 +v -0.300523 3.387380 3.775337 +v -0.294590 3.387379 3.791547 +v -0.350870 3.403688 3.790871 +v -0.346994 3.403687 3.807711 +v -0.350871 3.387382 3.790869 +v -0.346995 3.387380 3.807710 +v -0.404387 3.403686 3.799948 +v -0.402699 3.403684 3.817156 +v -0.404387 3.387385 3.799946 +v -0.402700 3.387383 3.817154 +v -0.460839 3.403684 3.801810 +v -0.461261 3.403682 3.819094 +v -0.460840 3.387387 3.801808 +v -0.461262 3.387385 3.819093 +v -0.526396 3.403682 3.796171 +v -0.528992 3.403680 3.813252 +v -0.526397 3.387389 3.796169 +v -0.528992 3.387387 3.813250 +v -0.587176 3.403679 3.782070 +v -0.592096 3.403678 3.798605 +v -0.587176 3.387392 3.782068 +v -0.592096 3.387390 3.798603 +v -0.643018 3.403677 3.760283 +v -0.650180 3.403675 3.775937 +v -0.643018 3.387394 3.760281 +v -0.650180 3.387392 3.775934 +v -0.693684 3.403674 3.731570 +v -0.702931 3.403672 3.746037 +v -0.693684 3.387396 3.731568 +v -0.702931 3.387394 3.746035 +v -0.738925 3.403672 3.696689 +v -0.750044 3.403670 3.709709 +v -0.738925 3.387398 3.696687 +v -0.750043 3.387396 3.709707 +v -0.778483 3.403670 3.656393 +v -0.791225 3.403667 3.667752 +v -0.778482 3.387402 3.656391 +v -0.791225 3.387399 3.667749 +v -0.812087 3.403667 3.611438 +v -0.826192 3.403665 3.620966 +v -0.812086 3.387403 3.611436 +v -0.826191 3.387402 3.620965 +v -0.839463 3.403665 3.562584 +v -0.854664 3.403663 3.570148 +v -0.839462 3.387406 3.562582 +v -0.854663 3.387404 3.570146 +v -0.860336 3.403663 3.510597 +v -0.876366 3.403661 3.516085 +v -0.860335 3.387409 3.510596 +v -0.876364 3.387407 3.516083 +v -0.874431 3.403660 3.456248 +v -0.891019 3.403658 3.459564 +v -0.874429 3.387411 3.456247 +v -0.891017 3.387409 3.459563 +v -0.679256 3.245716 3.743027 +v -0.690281 3.245716 3.749392 +v -0.690281 3.245716 3.736662 +v -0.679256 3.118819 3.743027 +v -0.690281 3.118819 3.749392 +v -0.690281 3.118819 3.736662 +v -0.880437 3.245716 3.393795 +v -0.891462 3.245716 3.400160 +v -0.891462 3.245716 3.387431 +v -0.880437 3.118819 3.393795 +v -0.891462 3.118819 3.400160 +v -0.891462 3.118819 3.387431 +v -0.679256 3.387444 3.743027 +v -0.690281 3.387444 3.749392 +v -0.690281 3.387444 3.736662 +v -0.679256 3.261928 3.743027 +v -0.690281 3.261928 3.749392 +v -0.690281 3.261928 3.736662 +v -0.682661 3.245716 3.011692 +v -0.693685 3.245716 3.018057 +v -0.693685 3.245716 3.005327 +v -0.682661 3.118819 3.011692 +v -0.693685 3.118819 3.018057 +v -0.693685 3.118819 3.005327 +v -0.205252 3.387444 3.742707 +v -0.216276 3.387444 3.749071 +v -0.216276 3.387444 3.736342 +v -0.205252 3.261928 3.742707 +v -0.216276 3.261928 3.749071 +v -0.216276 3.261928 3.736342 +v -0.204039 3.245716 3.014293 +v -0.215063 3.245716 3.020658 +v -0.215063 3.245716 3.007928 +v -0.204039 3.118819 3.014293 +v -0.215063 3.118819 3.020658 +v -0.215063 3.118819 3.007928 +v -0.034328 3.387444 3.514317 +v -0.045353 3.387444 3.520681 +v -0.045353 3.387444 3.507952 +v -0.034328 3.261928 3.514317 +v -0.045353 3.261928 3.520681 +v -0.045353 3.261928 3.507952 +v -0.028292 3.245716 3.234825 +v -0.039316 3.245716 3.241190 +v -0.039316 3.245716 3.228460 +v -0.028292 3.118819 3.234825 +v -0.039316 3.118819 3.241190 +v -0.039316 3.118819 3.228460 +v -0.034328 3.245716 3.514317 +v -0.045353 3.245716 3.520681 +v -0.045353 3.245716 3.507952 +v -0.034328 3.118819 3.514317 +v -0.045353 3.118819 3.520681 +v -0.045353 3.118819 3.507952 +v -0.028292 3.387444 3.234825 +v -0.039316 3.387444 3.241190 +v -0.039316 3.387444 3.228460 +v -0.028292 3.261928 3.234825 +v -0.039316 3.261928 3.241190 +v -0.039316 3.261928 3.228460 +v -0.204039 3.387444 3.014293 +v -0.215063 3.387444 3.020658 +v -0.215063 3.387444 3.007928 +v -0.204039 3.261928 3.014293 +v -0.215063 3.261928 3.020658 +v -0.215063 3.261928 3.007928 +v -0.682661 3.387444 3.011692 +v -0.693685 3.387444 3.018057 +v -0.693685 3.387444 3.005327 +v -0.682661 3.261928 3.011692 +v -0.693685 3.261928 3.018057 +v -0.693685 3.261928 3.005327 +v -0.880437 3.387444 3.393795 +v -0.891462 3.387444 3.400160 +v -0.891462 3.387444 3.387431 +v -0.880437 3.261928 3.393795 +v -0.891462 3.261928 3.400160 +v -0.891462 3.261928 3.387431 +v -0.210975 3.387220 3.735415 +v -0.206203 3.387220 3.741983 +v -0.206203 3.387220 3.741983 +v -0.218697 3.387220 3.737924 +v -0.206203 3.387220 3.741983 +v -0.220016 3.387220 3.741983 +v -0.206203 3.387220 3.741983 +v -0.218697 3.387220 3.746043 +v -0.206203 3.387220 3.741983 +v -0.206203 3.387220 3.741983 +v -0.210975 3.387220 3.748552 +v -0.684653 3.387220 3.736997 +v -0.679881 3.387220 3.743565 +v -0.679881 3.387220 3.743565 +v -0.692375 3.387220 3.739506 +v -0.679881 3.387220 3.743565 +v -0.693694 3.387220 3.743565 +v -0.679881 3.387220 3.743565 +v -0.692375 3.387220 3.747625 +v -0.684653 3.387220 3.750134 +v -0.885798 3.387221 3.387201 +v -0.881025 3.387221 3.393770 +v -0.881025 3.387221 3.393770 +v -0.893519 3.387221 3.389710 +v -0.881025 3.387221 3.393770 +v -0.894838 3.387221 3.393770 +v -0.881025 3.387221 3.393770 +v -0.893519 3.387221 3.397829 +v -0.881025 3.387221 3.393770 +v -0.890066 3.387221 3.400338 +v -0.881025 3.387221 3.393770 +v -0.885798 3.387221 3.400338 +v -0.687400 3.387222 3.005535 +v -0.682628 3.387222 3.012104 +v -0.682628 3.387222 3.012104 +v -0.695121 3.387222 3.008044 +v -0.682628 3.387222 3.012104 +v -0.696440 3.387222 3.012104 +v -0.682628 3.387222 3.012104 +v -0.695121 3.387222 3.016163 +v -0.687400 3.387222 3.018672 +v -0.209685 3.387222 3.008850 +v -0.204912 3.387222 3.015418 +v -0.204912 3.387222 3.015418 +v -0.217406 3.387222 3.011359 +v -0.204912 3.387222 3.015418 +v -0.218725 3.387222 3.015418 +v -0.204912 3.387222 3.015418 +v -0.217406 3.387222 3.019477 +v -0.204912 3.387222 3.015418 +v -0.204912 3.387222 3.015418 +v -0.209685 3.387222 3.021986 +v -0.034441 3.387221 3.228969 +v -0.029668 3.387221 3.235538 +v -0.029668 3.387221 3.235538 +v -0.042162 3.387221 3.231478 +v -0.029668 3.387221 3.235538 +v -0.043481 3.387221 3.235538 +v -0.029668 3.387221 3.235538 +v -0.042162 3.387221 3.239597 +v -0.034441 3.387221 3.242106 +v 0.284792 3.262126 3.226256 +v 0.259520 3.262126 3.226256 +v 0.284792 3.262126 3.226256 +v 0.259520 3.262126 3.243422 +v 0.284792 3.262126 3.243422 +v 0.259520 3.262126 3.243422 +v 0.259520 3.262126 3.226256 +v 0.243297 3.262126 3.226256 +v 0.259520 3.262126 3.226256 +v 0.243297 3.262126 3.243422 +v 0.259520 3.262126 3.243422 +v 0.243297 3.262126 3.243422 +v 0.243297 3.262126 3.226256 +v 0.214357 3.262126 3.226256 +v 0.243297 3.262126 3.226256 +v 0.214357 3.262126 3.243422 +v 0.243297 3.262126 3.243422 +v 0.214357 3.262126 3.243422 +v 0.214357 3.262126 3.226256 +v 0.185533 3.262126 3.226256 +v 0.214357 3.262126 3.226256 +v 0.185533 3.262126 3.243422 +v 0.214357 3.262126 3.243422 +v 0.185533 3.262126 3.243422 +v 0.185533 3.262126 3.226256 +v 0.156862 3.262125 3.226256 +v 0.185533 3.262126 3.226256 +v 0.156862 3.262126 3.243421 +v 0.185533 3.262126 3.243422 +v 0.156862 3.262126 3.243421 +v 0.156862 3.262125 3.226256 +v 0.128382 3.262125 3.226256 +v 0.156862 3.262125 3.226256 +v 0.128382 3.262125 3.243422 +v 0.156862 3.262126 3.243421 +v 0.128382 3.262125 3.243422 +v 0.128382 3.262125 3.226256 +v 0.100132 3.262125 3.226256 +v 0.128382 3.262125 3.226256 +v 0.100132 3.262125 3.243421 +v 0.128382 3.262125 3.243422 +v 0.100132 3.262125 3.243421 +v 0.100132 3.262125 3.226256 +v 0.072150 3.262125 3.226256 +v 0.100132 3.262125 3.226256 +v 0.072150 3.245787 3.243421 +v 0.100132 3.245787 3.243421 +v 0.100132 3.262125 3.243421 +v 0.072150 3.262125 3.243421 +v 0.072150 3.262125 3.243421 +v 0.072150 3.262125 3.226256 +v 0.044475 3.262125 3.226256 +v 0.072150 3.262125 3.226256 +v 0.044475 3.262125 3.226256 +v 0.072150 3.262125 3.226256 +v 0.072150 3.245787 3.226256 +v 0.044475 3.245787 3.226256 +v 0.072150 3.245787 3.226256 +v 0.044475 3.245787 3.226256 +v 0.072150 3.245787 3.226256 +v 0.072150 3.245787 3.243421 +v 0.044475 3.245787 3.243421 +v 0.072150 3.245787 3.243421 +v 0.044475 3.262125 3.243421 +v 0.044475 3.245787 3.243421 +v 0.072150 3.245787 3.243421 +v 0.072150 3.262125 3.243421 +v 0.044475 3.262125 3.243421 +v 0.044475 3.262125 3.243421 +v 0.044475 3.262125 3.243421 +v 0.044475 3.262125 3.226256 +v 0.017144 3.262125 3.226256 +v 0.044475 3.262125 3.226256 +v 0.017144 3.262125 3.226256 +v 0.044475 3.262125 3.226256 +v 0.044475 3.245787 3.226256 +v 0.017144 3.245787 3.226256 +v 0.044475 3.245787 3.226256 +v 0.017144 3.245787 3.226256 +v 0.044475 3.245787 3.226256 +v 0.044475 3.245787 3.243421 +v 0.017144 3.245787 3.243421 +v 0.044475 3.245787 3.243421 +v 0.017144 3.262125 3.243421 +v 0.017144 3.245787 3.243421 +v 0.044475 3.245787 3.243421 +v 0.044475 3.262125 3.243421 +v 0.017144 3.262125 3.243421 +v 0.017144 3.262125 3.243421 +v 0.017144 3.262125 3.243421 +v 0.017144 3.262125 3.226256 +v -0.009803 3.262125 3.226256 +v 0.017144 3.262125 3.226256 +v -0.009803 3.262125 3.226256 +v 0.017144 3.262125 3.226256 +v 0.017144 3.245787 3.226256 +v -0.009803 3.245787 3.226256 +v 0.017144 3.245787 3.226256 +v -0.009803 3.245787 3.226256 +v 0.017144 3.245787 3.226256 +v 0.017144 3.245787 3.243421 +v -0.009803 3.245787 3.243421 +v 0.017144 3.245787 3.243421 +v -0.009803 3.262125 3.243421 +v -0.009803 3.245787 3.243421 +v 0.017144 3.245787 3.243421 +v 0.017144 3.262125 3.243421 +v -0.009803 3.262125 3.243421 +v -0.009803 3.262125 3.243421 +v -0.009803 3.262125 3.226256 +v -0.009803 3.262125 3.226256 +v -0.009803 3.262125 3.226256 +v -0.009803 3.245787 3.226256 +v -0.009803 3.245787 3.243421 +v -0.009803 3.245787 3.243421 +v -0.009803 3.262125 3.243421 +v -0.030544 3.262125 3.226463 +v -0.030544 3.262125 3.226463 +v -0.030544 3.245787 3.226463 +v -0.030544 3.245787 3.226463 +v -0.040496 3.245787 3.243532 +v -0.040496 3.245787 3.243532 +v -0.040496 3.262125 3.243532 +v -0.063603 3.262125 3.200301 +v -0.063603 3.262125 3.200301 +v -0.048924 3.262125 3.191907 +v -0.071262 3.262125 3.154022 +v -0.048924 3.262125 3.191907 +v -0.071262 3.262125 3.154022 +v -0.048924 3.245787 3.191907 +v -0.071262 3.245788 3.154022 +v -0.071262 3.245788 3.154022 +v -0.063603 3.245787 3.200301 +v -0.085398 3.245788 3.163335 +v -0.063603 3.245787 3.200301 +v -0.085398 3.245788 3.163335 +v -0.063603 3.262125 3.200301 +v -0.085398 3.262125 3.163335 +v -0.085398 3.262125 3.163335 +v -0.071262 3.262125 3.154022 +v -0.096033 3.262125 3.117762 +v -0.071262 3.262125 3.154022 +v -0.096033 3.262125 3.117762 +v -0.071262 3.262125 3.154022 +v -0.071262 3.245788 3.154022 +v -0.096033 3.245788 3.117762 +v -0.071262 3.245788 3.154022 +v -0.096033 3.245788 3.117762 +v -0.071262 3.245788 3.154022 +v -0.085398 3.245788 3.163335 +v -0.109477 3.245788 3.128085 +v -0.085398 3.245788 3.163335 +v -0.109477 3.262125 3.128085 +v -0.109477 3.245788 3.128085 +v -0.085398 3.245788 3.163335 +v -0.085398 3.262125 3.163335 +v -0.109477 3.262125 3.128085 +v -0.109477 3.262125 3.128085 +v -0.109477 3.262125 3.128085 +v -0.096033 3.262125 3.117762 +v -0.123474 3.262125 3.083504 +v -0.096033 3.262125 3.117762 +v -0.123474 3.262125 3.083504 +v -0.096033 3.262125 3.117762 +v -0.096033 3.245788 3.117762 +v -0.123474 3.245788 3.083504 +v -0.096033 3.245788 3.117762 +v -0.123474 3.245788 3.083504 +v -0.096033 3.245788 3.117762 +v -0.109477 3.245788 3.128085 +v -0.136054 3.245788 3.094904 +v -0.109477 3.245788 3.128085 +v -0.136054 3.245788 3.094904 +v -0.109477 3.245788 3.128085 +v -0.109477 3.262125 3.128085 +v -0.136054 3.262125 3.094904 +v -0.136054 3.262125 3.094904 +v -0.123474 3.262125 3.083504 +v -0.153822 3.262125 3.051628 +v -0.123474 3.262125 3.083504 +v -0.153822 3.262125 3.051628 +v -0.123474 3.262125 3.083504 +v -0.123474 3.245788 3.083504 +v -0.153822 3.245788 3.051628 +v -0.123474 3.245788 3.083504 +v -0.153822 3.245788 3.051628 +v -0.123474 3.245788 3.083504 +v -0.136054 3.245788 3.094904 +v -0.165346 3.245788 3.064136 +v -0.136054 3.245788 3.094904 +v -0.165346 3.245788 3.064136 +v -0.136054 3.245788 3.094904 +v -0.136054 3.262125 3.094904 +v -0.165346 3.262125 3.064136 +v -0.165346 3.262125 3.064136 +v -0.153822 3.262125 3.051628 +v -0.187307 3.262125 3.022520 +v -0.153822 3.262125 3.051628 +v -0.187307 3.262125 3.022520 +v -0.153822 3.262125 3.051628 +v -0.153822 3.245788 3.051628 +v -0.187307 3.245788 3.022520 +v -0.153822 3.245788 3.051628 +v -0.187307 3.245788 3.022520 +v -0.153822 3.245788 3.051628 +v -0.165346 3.245788 3.064136 +v -0.197574 3.245788 3.036119 +v -0.165346 3.245788 3.064136 +v -0.197574 3.245788 3.036119 +v -0.165346 3.245788 3.064136 +v -0.165346 3.262125 3.064136 +v -0.197574 3.262125 3.036119 +v -0.187307 3.262125 3.022520 +v -0.187307 3.262125 3.022520 +v -0.187307 3.245788 3.022520 +v -0.224147 3.245788 2.996572 +v -0.197574 3.245788 3.036119 +v -0.197574 3.245788 3.036119 +v -0.197574 3.262125 3.036119 +v -0.232970 3.262125 3.011187 +v -0.224147 3.262125 2.996572 +v -0.264553 3.262125 2.974174 +v -0.224147 3.262125 2.996572 +v -0.264553 3.262125 2.974174 +v -0.224147 3.245788 2.996572 +v -0.264553 3.245788 2.974174 +v -0.224147 3.245788 2.996572 +v -0.264553 3.245788 2.974174 +v -0.224147 3.245788 2.996572 +v -0.232970 3.245788 3.011187 +v -0.271778 3.245788 2.989675 +v -0.232970 3.245788 3.011187 +v -0.271778 3.245788 2.989675 +v -0.232970 3.262125 3.011187 +v -0.271778 3.262125 2.989675 +v -0.264553 3.262125 2.974174 +v -0.308721 3.262125 2.955713 +v -0.264553 3.262125 2.974174 +v -0.308721 3.262125 2.955713 +v -0.264553 3.262125 2.974174 +v -0.264553 3.245788 2.974174 +v -0.308721 3.245788 2.955713 +v -0.264553 3.245788 2.974174 +v -0.308721 3.245788 2.955713 +v -0.264553 3.245788 2.974174 +v -0.271778 3.245788 2.989675 +v -0.314251 3.245788 2.971923 +v -0.271778 3.245788 2.989675 +v -0.314251 3.245788 2.971923 +v -0.271778 3.245788 2.989675 +v -0.271778 3.262125 2.989675 +v -0.314251 3.262125 2.971923 +v -0.308721 3.262125 2.955713 +v -0.356845 3.262125 2.941563 +v -0.308721 3.262125 2.955713 +v -0.356845 3.262125 2.941563 +v -0.308721 3.262125 2.955713 +v -0.308721 3.245788 2.955713 +v -0.356845 3.245788 2.941563 +v -0.308721 3.245788 2.955713 +v -0.356845 3.245788 2.941563 +v -0.308721 3.245788 2.955713 +v -0.314251 3.245788 2.971923 +v -0.360649 3.245788 2.958282 +v -0.314251 3.245788 2.971923 +v -0.360649 3.245788 2.958282 +v -0.314251 3.245788 2.971923 +v -0.314251 3.262125 2.971923 +v -0.360649 3.262125 2.958282 +v -0.356845 3.262125 2.941563 +v -0.409118 3.262125 2.932087 +v -0.356845 3.262125 2.941563 +v -0.409118 3.262125 2.932087 +v -0.356845 3.262125 2.941563 +v -0.356845 3.245788 2.941563 +v -0.409118 3.245788 2.932087 +v -0.356845 3.245788 2.941563 +v -0.409118 3.245788 2.932087 +v -0.356845 3.245788 2.941563 +v -0.360649 3.245788 2.958282 +v -0.411230 3.245788 2.949114 +v -0.360649 3.245788 2.958282 +v -0.411230 3.245788 2.949114 +v -0.360649 3.245788 2.958282 +v -0.360649 3.262125 2.958282 +v -0.411230 3.262125 2.949114 +v -0.409118 3.262125 2.932087 +v -0.466206 3.262125 2.927636 +v -0.409118 3.262125 2.932087 +v -0.466206 3.262125 2.927636 +v -0.409118 3.262125 2.932087 +v -0.409118 3.245788 2.932087 +v -0.466206 3.245788 2.927636 +v -0.409118 3.245788 2.932087 +v -0.466206 3.245788 2.927636 +v -0.409118 3.245788 2.932087 +v -0.411230 3.245788 2.949114 +v -0.465779 3.245788 2.944794 +v -0.411230 3.245788 2.949114 +v -0.465779 3.245788 2.944794 +v -0.411230 3.245788 2.949114 +v -0.411230 3.262125 2.949114 +v -0.465779 3.262125 2.944794 +v -0.466206 3.262125 2.927636 +v -0.529976 3.262125 2.936305 +v -0.466206 3.262125 2.927636 +v -0.529976 3.262125 2.936305 +v -0.466206 3.262125 2.927636 +v -0.466206 3.245788 2.927636 +v -0.529976 3.245788 2.936306 +v -0.466206 3.245788 2.927636 +v -0.529976 3.245788 2.936306 +v -0.466206 3.245788 2.927636 +v -0.465779 3.245788 2.944794 +v -0.526731 3.245788 2.953146 +v -0.465779 3.245788 2.944794 +v -0.526731 3.245788 2.953146 +v -0.465779 3.245788 2.944794 +v -0.465779 3.262125 2.944794 +v -0.526731 3.262125 2.953146 +v -0.529976 3.262125 2.936305 +v -0.589490 3.262125 2.952163 +v -0.529976 3.262125 2.936305 +v -0.589490 3.262125 2.952163 +v -0.529976 3.262125 2.936305 +v -0.529976 3.245788 2.936306 +v -0.589490 3.245789 2.952163 +v -0.529976 3.245788 2.936306 +v -0.589490 3.245789 2.952163 +v -0.529976 3.245788 2.936306 +v -0.526731 3.245788 2.953146 +v -0.584227 3.245789 2.968465 +v -0.526731 3.245788 2.953146 +v -0.584227 3.245789 2.968465 +v -0.526731 3.245788 2.953146 +v -0.526731 3.262125 2.953146 +v -0.584227 3.262125 2.968465 +v -0.589490 3.262125 2.952163 +v -0.644802 3.262125 2.974759 +v -0.589490 3.262125 2.952163 +v -0.644802 3.262125 2.974759 +v -0.589490 3.262125 2.952163 +v -0.589490 3.245789 2.952163 +v -0.644802 3.245789 2.974759 +v -0.589490 3.245789 2.952163 +v -0.644802 3.245789 2.974759 +v -0.589490 3.245789 2.952163 +v -0.584227 3.245789 2.968465 +v -0.637564 3.245789 2.990253 +v -0.584227 3.245789 2.968465 +v -0.637564 3.245789 2.990253 +v -0.584227 3.245789 2.968465 +v -0.584227 3.262125 2.968465 +v -0.637564 3.262125 2.990253 +v -0.644802 3.262125 2.974759 +v -0.644802 3.262125 2.974759 +v -0.644802 3.262125 2.974759 +v -0.644802 3.245789 2.974759 +v -0.644802 3.245789 2.974759 +v -0.637564 3.245789 2.990253 +v -0.637564 3.245789 2.990253 +v -0.637564 3.245789 2.990253 +v -0.637564 3.262125 2.990253 +v -0.686442 3.262125 3.018036 +v -0.695562 3.262125 3.003613 +v -0.695562 3.245789 3.003613 +v -0.741423 3.245789 3.038244 +v -0.695562 3.245789 3.003613 +v -0.741423 3.245789 3.038244 +v -0.686442 3.245789 3.018036 +v -0.730557 3.245789 3.051347 +v -0.686442 3.245789 3.018036 +v -0.686442 3.262125 3.018036 +v -0.730557 3.262125 3.051347 +v -0.730557 3.262125 3.051347 +v -0.741423 3.262125 3.038244 +v -0.741423 3.262125 3.038244 +v -0.782041 3.262125 3.078164 +v -0.741423 3.262125 3.038244 +v -0.741423 3.245789 3.038244 +v -0.741423 3.245789 3.038244 +v -0.741423 3.245789 3.038244 +v -0.730557 3.245789 3.051347 +v -0.730557 3.245789 3.051347 +v -0.769605 3.262125 3.089724 +v -0.730557 3.245789 3.051347 +v -0.769605 3.262125 3.089724 +v -0.782041 3.262125 3.078164 +v -0.817074 3.262125 3.122883 +v -0.782041 3.262125 3.078164 +v -0.803277 3.262125 3.132705 +v -0.769605 3.262125 3.089724 +v -0.803277 3.262125 3.132705 +v -0.817074 3.262125 3.122883 +v -0.846186 3.262125 3.171909 +v -0.817074 3.262125 3.122883 +v -0.831261 3.262125 3.179834 +v -0.803277 3.262125 3.132705 +v -0.831261 3.262125 3.179834 +v -0.846186 3.262125 3.171909 +v -0.869040 3.262124 3.224748 +v -0.846186 3.262125 3.171909 +v -0.853242 3.262124 3.230654 +v -0.831261 3.262125 3.179834 +v -0.853242 3.262124 3.230654 +v -0.869040 3.262124 3.224748 +v -0.885307 3.262124 3.280902 +v -0.869040 3.262124 3.224748 +v -0.885307 3.245789 3.280902 +v -0.853242 3.245789 3.230654 +v -0.868901 3.245789 3.284711 +v -0.868901 3.245789 3.284711 +v -0.853242 3.245789 3.230654 +v -0.853242 3.262124 3.230654 +v -0.868901 3.262124 3.284711 +v -0.868901 3.262124 3.284711 +v -0.868901 3.262124 3.284711 +v -0.885307 3.262124 3.280902 +v -0.894660 3.262124 3.339877 +v -0.885307 3.262124 3.280902 +v -0.894660 3.262124 3.339877 +v -0.885307 3.262124 3.280902 +v -0.885307 3.245789 3.280902 +v -0.894660 3.245789 3.339877 +v -0.885307 3.245789 3.280902 +v -0.894660 3.245789 3.339877 +v -0.885307 3.245789 3.280902 +v -0.868901 3.245789 3.284711 +v -0.877915 3.245789 3.341551 +v -0.868901 3.245789 3.284711 +v -0.877915 3.262124 3.341551 +v -0.877915 3.245789 3.341551 +v -0.868901 3.245789 3.284711 +v -0.868901 3.262124 3.284711 +v -0.877915 3.262124 3.341551 +v -0.894660 3.262124 3.339877 +v -0.894660 3.245789 3.339877 +v -0.877915 3.245789 3.341551 +v -0.877915 3.245789 3.341551 +v -0.877915 3.262124 3.341551 +v -0.879978 3.262124 3.400293 +v -0.879978 3.262124 3.400293 +v -0.896754 3.262124 3.401602 +v -0.886838 3.262124 3.456983 +v -0.896754 3.262124 3.401602 +v -0.886838 3.262124 3.456983 +v -0.896754 3.262124 3.401602 +v -0.896754 3.245789 3.401602 +v -0.886838 3.245789 3.456983 +v -0.896754 3.245789 3.401602 +v -0.886838 3.245789 3.456983 +v -0.879978 3.245789 3.400293 +v -0.870454 3.262124 3.453084 +v -0.870454 3.245789 3.453084 +v -0.879978 3.245789 3.400293 +v -0.879978 3.262124 3.400293 +v -0.870454 3.262124 3.453084 +v -0.870454 3.262124 3.453084 +v -0.870454 3.262124 3.453084 +v -0.886838 3.262124 3.456983 +v -0.886838 3.262124 3.456983 +v -0.871997 3.262124 3.510005 +v -0.886838 3.262124 3.456983 +v -0.886838 3.245789 3.456983 +v -0.886838 3.245789 3.456983 +v -0.871997 3.245789 3.510005 +v -0.886838 3.245789 3.456983 +v -0.870454 3.245789 3.453084 +v -0.870454 3.245789 3.453084 +v -0.856069 3.262124 3.504477 +v -0.856069 3.245789 3.504477 +v -0.870454 3.245789 3.453084 +v -0.870454 3.262124 3.453084 +v -0.856069 3.262124 3.504477 +v -0.856069 3.262124 3.504477 +v -0.856069 3.262124 3.504477 +v -0.871997 3.262124 3.510005 +v -0.852213 3.262123 3.560639 +v -0.871997 3.262124 3.510005 +v -0.852213 3.262123 3.560639 +v -0.871997 3.262124 3.510005 +v -0.871997 3.245789 3.510005 +v -0.852213 3.245789 3.560639 +v -0.871997 3.245789 3.510005 +v -0.852213 3.245789 3.560639 +v -0.871997 3.245789 3.510005 +v -0.856069 3.245789 3.504477 +v -0.836931 3.245789 3.553460 +v -0.856069 3.245789 3.504477 +v -0.836931 3.262123 3.553460 +v -0.836931 3.245789 3.553460 +v -0.856069 3.245789 3.504477 +v -0.856069 3.262124 3.504477 +v -0.836931 3.262123 3.553460 +v -0.836931 3.262123 3.553460 +v -0.836931 3.262123 3.553460 +v -0.852213 3.262123 3.560639 +v -0.827519 3.262123 3.608358 +v -0.852213 3.262123 3.560639 +v -0.827519 3.262123 3.608358 +v -0.852213 3.262123 3.560639 +v -0.852213 3.245789 3.560639 +v -0.827519 3.245789 3.608358 +v -0.852213 3.245789 3.560639 +v -0.827519 3.245789 3.608358 +v -0.852213 3.245789 3.560639 +v -0.836931 3.245789 3.553460 +v -0.836931 3.245789 3.553460 +v -0.813096 3.262123 3.599522 +v -0.813096 3.245789 3.599522 +v -0.836931 3.245789 3.553460 +v -0.836931 3.262123 3.553460 +v -0.813096 3.262123 3.599522 +v -0.813096 3.262123 3.599522 +v -0.813096 3.262123 3.599522 +v -0.827519 3.262123 3.608358 +v -0.827519 3.262123 3.608358 +v -0.797948 3.262123 3.652627 +v -0.827519 3.262123 3.608358 +v -0.827519 3.245789 3.608358 +v -0.797948 3.245789 3.652627 +v -0.827519 3.245789 3.608358 +v -0.797948 3.245789 3.652627 +v -0.827519 3.245789 3.608358 +v -0.813096 3.245789 3.599522 +v -0.813096 3.245789 3.599522 +v -0.784621 3.262123 3.642153 +v -0.784621 3.245789 3.642153 +v -0.813096 3.245789 3.599522 +v -0.813096 3.262123 3.599522 +v -0.784621 3.262123 3.642153 +v -0.784621 3.262123 3.642153 +v -0.784621 3.262123 3.642153 +v -0.797948 3.262123 3.652627 +v -0.797948 3.262123 3.652627 +v -0.763539 3.262123 3.692903 +v -0.797948 3.262123 3.652627 +v -0.797948 3.245789 3.652627 +v -0.797948 3.245789 3.652627 +v -0.763539 3.245789 3.692902 +v -0.797948 3.245789 3.652627 +v -0.784621 3.245789 3.642153 +v -0.751557 3.245789 3.680856 +v -0.784621 3.245789 3.642153 +v -0.751557 3.262123 3.680856 +v -0.751557 3.245789 3.680856 +v -0.784621 3.245789 3.642153 +v -0.784621 3.262123 3.642153 +v -0.751557 3.262123 3.680856 +v -0.751557 3.262123 3.680856 +v -0.751557 3.262123 3.680856 +v -0.763539 3.262123 3.692903 +v -0.724334 3.262123 3.728637 +v -0.763539 3.262123 3.692903 +v -0.724334 3.262123 3.728637 +v -0.763539 3.262123 3.692903 +v -0.763539 3.245789 3.692902 +v -0.724334 3.245789 3.728637 +v -0.763539 3.245789 3.692902 +v -0.724334 3.245789 3.728637 +v -0.763539 3.245789 3.692902 +v -0.751557 3.245789 3.680856 +v -0.713949 3.245789 3.715136 +v -0.751557 3.245789 3.680856 +v -0.713949 3.262123 3.715136 +v -0.713949 3.245789 3.715136 +v -0.751557 3.245789 3.680856 +v -0.751557 3.262123 3.680856 +v -0.713949 3.262123 3.715136 +v -0.724334 3.262123 3.728637 +v -0.724334 3.262123 3.728637 +v -0.724334 3.245789 3.728637 +v -0.680392 3.245789 3.759278 +v -0.713949 3.245789 3.715136 +v -0.713949 3.245789 3.715136 +v -0.713949 3.262123 3.715136 +v -0.671831 3.262123 3.744505 +v -0.671831 3.262123 3.744505 +v -0.680392 3.262123 3.759278 +v -0.680392 3.262123 3.759278 +v -0.631781 3.262123 3.784274 +v -0.680392 3.262123 3.759278 +v -0.680392 3.245789 3.759278 +v -0.680392 3.245789 3.759278 +v -0.631781 3.245789 3.784274 +v -0.680392 3.245789 3.759278 +v -0.671831 3.245789 3.744505 +v -0.671831 3.245789 3.744505 +v -0.625221 3.262123 3.768472 +v -0.625221 3.245789 3.768472 +v -0.671831 3.245789 3.744505 +v -0.671831 3.262123 3.744505 +v -0.625221 3.262123 3.768472 +v -0.625221 3.262123 3.768472 +v -0.625221 3.262123 3.768472 +v -0.631781 3.262123 3.784274 +v -0.631781 3.262123 3.784274 +v -0.578584 3.262123 3.803084 +v -0.631781 3.262123 3.784274 +v -0.631781 3.245789 3.784274 +v -0.578584 3.245789 3.803084 +v -0.631781 3.245789 3.784274 +v -0.578584 3.245789 3.803084 +v -0.631781 3.245789 3.784274 +v -0.625221 3.245789 3.768472 +v -0.574128 3.245789 3.786537 +v -0.625221 3.245789 3.768472 +v -0.574128 3.262123 3.786537 +v -0.574128 3.245789 3.786537 +v -0.625221 3.245789 3.768472 +v -0.625221 3.262123 3.768472 +v -0.574128 3.262123 3.786537 +v -0.574128 3.262123 3.786537 +v -0.574128 3.262123 3.786537 +v -0.578584 3.262123 3.803084 +v -0.520888 3.262123 3.815180 +v -0.578584 3.262123 3.803084 +v -0.520888 3.262123 3.815180 +v -0.578584 3.262123 3.803084 +v -0.578584 3.245789 3.803084 +v -0.520888 3.245789 3.815180 +v -0.578584 3.245789 3.803084 +v -0.520888 3.245789 3.815180 +v -0.578584 3.245789 3.803084 +v -0.574128 3.245789 3.786537 +v -0.518553 3.245789 3.798187 +v -0.574128 3.245789 3.786537 +v -0.518553 3.262123 3.798187 +v -0.518553 3.245789 3.798187 +v -0.574128 3.245789 3.786537 +v -0.574128 3.262123 3.786537 +v -0.518553 3.262123 3.798187 +v -0.518553 3.262123 3.798187 +v -0.518553 3.262123 3.798187 +v -0.520888 3.262123 3.815180 +v -0.458851 3.262123 3.820048 +v -0.458851 3.262123 3.820048 +v -0.520888 3.262123 3.815180 +v -0.520888 3.245789 3.815180 +v -0.458851 3.245789 3.820048 +v -0.520888 3.245789 3.815180 +v -0.458851 3.245789 3.820048 +v -0.518553 3.245789 3.798187 +v -0.518553 3.245789 3.798187 +v -0.458429 3.262123 3.802893 +v -0.458429 3.245789 3.802893 +v -0.518553 3.245789 3.798187 +v -0.518553 3.262123 3.798187 +v -0.458429 3.262123 3.802893 +v -0.458429 3.262123 3.802893 +v -0.458429 3.262123 3.802893 +v -0.458851 3.262123 3.820048 +v -0.458851 3.262123 3.820048 +v -0.405006 3.262122 3.818570 +v -0.458851 3.262123 3.820048 +v -0.458851 3.245789 3.820048 +v -0.458851 3.245789 3.820048 +v -0.405006 3.245789 3.818570 +v -0.458851 3.245789 3.820048 +v -0.458429 3.245789 3.802893 +v -0.406488 3.245789 3.801477 +v -0.458429 3.245789 3.802893 +v -0.406488 3.262122 3.801477 +v -0.406488 3.245789 3.801477 +v -0.458429 3.245789 3.802893 +v -0.458429 3.262123 3.802893 +v -0.406488 3.262122 3.801477 +v -0.406488 3.262122 3.801477 +v -0.406488 3.262122 3.801477 +v -0.405006 3.262122 3.818570 +v -0.405006 3.262122 3.818570 +v -0.353588 3.262122 3.810728 +v -0.405006 3.262122 3.818570 +v -0.405006 3.245789 3.818570 +v -0.353588 3.245789 3.810728 +v -0.405006 3.245789 3.818570 +v -0.353588 3.245789 3.810728 +v -0.405006 3.245789 3.818570 +v -0.406488 3.245789 3.801477 +v -0.357075 3.245789 3.793941 +v -0.406488 3.245789 3.801477 +v -0.357075 3.262122 3.793941 +v -0.357075 3.245789 3.793941 +v -0.406488 3.245789 3.801477 +v -0.406488 3.262122 3.801477 +v -0.357075 3.262122 3.793941 +v -0.357075 3.262122 3.793941 +v -0.357075 3.262122 3.793941 +v -0.353588 3.262122 3.810728 +v -0.304946 3.262122 3.797126 +v -0.353588 3.262122 3.810728 +v -0.304946 3.262122 3.797126 +v -0.353588 3.262122 3.810728 +v -0.353588 3.245789 3.810728 +v -0.304946 3.245789 3.797126 +v -0.353588 3.245789 3.810728 +v -0.304946 3.245789 3.797126 +v -0.353588 3.245789 3.810728 +v -0.357075 3.245789 3.793941 +v -0.310338 3.245790 3.780872 +v -0.357075 3.245789 3.793941 +v -0.310338 3.262122 3.780872 +v -0.310338 3.245790 3.780872 +v -0.357075 3.245789 3.793941 +v -0.357075 3.262122 3.793941 +v -0.310338 3.262122 3.780872 +v -0.310338 3.262122 3.780872 +v -0.310338 3.262122 3.780872 +v -0.304946 3.262122 3.797126 +v -0.259343 3.262122 3.778374 +v -0.304946 3.262122 3.797126 +v -0.259343 3.262122 3.778374 +v -0.304946 3.262122 3.797126 +v -0.304946 3.245789 3.797126 +v -0.304946 3.245789 3.797126 +v -0.259343 3.245789 3.778374 +v -0.304946 3.245789 3.797126 +v -0.310338 3.245790 3.780872 +v -0.266508 3.245790 3.762849 +v -0.310338 3.245790 3.780872 +v -0.266508 3.262122 3.762849 +v -0.266508 3.245790 3.762849 +v -0.310338 3.245790 3.780872 +v -0.310338 3.262122 3.780872 +v -0.266508 3.262122 3.762849 +v -0.266508 3.262122 3.762849 +v -0.266508 3.262122 3.762849 +v -0.259343 3.262122 3.778374 +v -0.259343 3.262122 3.778374 +v -0.217037 3.262122 3.755083 +v -0.259343 3.262122 3.778374 +v -0.259343 3.245789 3.778374 +v -0.259343 3.245789 3.778374 +v -0.217037 3.245790 3.755083 +v -0.259343 3.245789 3.778374 +v -0.266508 3.245790 3.762849 +v -0.266508 3.245790 3.762849 +v -0.225826 3.262122 3.740452 +v -0.225826 3.245790 3.740452 +v -0.266508 3.245790 3.762849 +v -0.266508 3.262122 3.762849 +v -0.225826 3.262122 3.740452 +v -0.217037 3.262122 3.755083 +v -0.217037 3.262122 3.755083 +v -0.217037 3.245790 3.755083 +v -0.178276 3.245790 3.727859 +v -0.225826 3.245790 3.740452 +v -0.225826 3.245790 3.740452 +v -0.225826 3.262122 3.740452 +v -0.188539 3.262122 3.714264 +v -0.188539 3.262122 3.714264 +v -0.188539 3.262122 3.714264 +v -0.178275 3.262122 3.727859 +v -0.143304 3.262122 3.697305 +v -0.178275 3.262122 3.727859 +v -0.143304 3.262122 3.697305 +v -0.178275 3.262122 3.727859 +v -0.178276 3.245790 3.727859 +v -0.143304 3.245790 3.697305 +v -0.178276 3.245790 3.727859 +v -0.143304 3.245790 3.697305 +v -0.178276 3.245790 3.727859 +v -0.188539 3.245790 3.714264 +v -0.154900 3.245790 3.684873 +v -0.188539 3.245790 3.714264 +v -0.154900 3.262122 3.684873 +v -0.154900 3.245790 3.684873 +v -0.188539 3.245790 3.714264 +v -0.188539 3.262122 3.714264 +v -0.154900 3.262122 3.684873 +v -0.154900 3.262122 3.684873 +v -0.154900 3.262122 3.684873 +v -0.143304 3.262122 3.697305 +v -0.112366 3.262122 3.664016 +v -0.112366 3.262122 3.664016 +v -0.143304 3.262122 3.697305 +v -0.143304 3.245790 3.697305 +v -0.112366 3.245790 3.664016 +v -0.143304 3.245790 3.697305 +v -0.112366 3.245790 3.664016 +v -0.154900 3.245790 3.684873 +v -0.154900 3.245790 3.684873 +v -0.125160 3.262122 3.652875 +v -0.125161 3.245790 3.652875 +v -0.154900 3.245790 3.684873 +v -0.154900 3.262122 3.684873 +v -0.125160 3.262122 3.652875 +v -0.125160 3.262122 3.652875 +v -0.125160 3.262122 3.652875 +v -0.112366 3.262122 3.664016 +v -0.112366 3.262122 3.664016 +v -0.085706 3.262122 3.628582 +v -0.112366 3.262122 3.664016 +v -0.112366 3.245790 3.664016 +v -0.112366 3.245790 3.664016 +v -0.085706 3.245790 3.628582 +v -0.112366 3.245790 3.664016 +v -0.125161 3.245790 3.652875 +v -0.125161 3.245790 3.652875 +v -0.099574 3.262122 3.618870 +v -0.099574 3.245790 3.618870 +v -0.125161 3.245790 3.652875 +v -0.125160 3.262122 3.652875 +v -0.099574 3.262122 3.618870 +v -0.099574 3.262122 3.618870 +v -0.099574 3.262122 3.618870 +v -0.085706 3.262122 3.628582 +v -0.063569 3.262122 3.591585 +v -0.085706 3.262122 3.628582 +v -0.063569 3.262122 3.591585 +v -0.085706 3.262122 3.628582 +v -0.085706 3.245790 3.628582 +v -0.063569 3.245790 3.591585 +v -0.085706 3.245790 3.628582 +v -0.063569 3.245790 3.591585 +v -0.085706 3.245790 3.628582 +v -0.099574 3.245790 3.618870 +v -0.078389 3.245790 3.583466 +v -0.099574 3.245790 3.618870 +v -0.078389 3.262122 3.583466 +v -0.078389 3.245790 3.583466 +v -0.099574 3.245790 3.618870 +v -0.099574 3.262122 3.618870 +v -0.078389 3.262122 3.583466 +v -0.078389 3.262122 3.583466 +v -0.078389 3.262122 3.583466 +v -0.063569 3.262122 3.591585 +v -0.046212 3.262122 3.553601 +v -0.063569 3.262122 3.591585 +v -0.046212 3.262122 3.553601 +v -0.063569 3.262122 3.591585 +v -0.063569 3.245790 3.591585 +v -0.046212 3.245790 3.553601 +v -0.063569 3.245790 3.591585 +v -0.046212 3.245790 3.553601 +v -0.063569 3.245790 3.591585 +v -0.078389 3.245790 3.583466 +v -0.061850 3.245790 3.547277 +v -0.078389 3.245790 3.583466 +v -0.061850 3.262122 3.547277 +v -0.061850 3.245790 3.547277 +v -0.078389 3.245790 3.583466 +v -0.078389 3.262122 3.583466 +v -0.061850 3.262122 3.547277 +v -0.061850 3.262122 3.547277 +v -0.061850 3.262122 3.547277 +v -0.046212 3.262122 3.553601 +v -0.035721 3.262122 3.522561 +v -0.046212 3.262122 3.553601 +v -0.035721 3.262122 3.522561 +v -0.046212 3.245790 3.553601 +v -0.061850 3.245790 3.547277 +v -0.047433 3.262122 3.504187 +v -0.061850 3.245790 3.547277 +v -0.047433 3.262122 3.504187 +v -0.047433 3.262122 3.504187 +v -0.047433 3.262122 3.504187 +v -0.035721 3.262122 3.522561 +v -0.035721 3.262122 3.522561 +v -0.015910 3.262122 3.522476 +v -0.035721 3.262122 3.522561 +v -0.035721 3.245790 3.522561 +v -0.035721 3.245790 3.522561 +v -0.015910 3.245790 3.522476 +v -0.047433 3.245790 3.504187 +v -0.016229 3.262122 3.504577 +v -0.047433 3.245790 3.504187 +v -0.047433 3.262122 3.504187 +v -0.016229 3.262122 3.504577 +v -0.016229 3.262122 3.504577 +v -0.016229 3.262122 3.504577 +v -0.015910 3.262122 3.522476 +v 0.010685 3.262122 3.522476 +v -0.015910 3.262122 3.522476 +v -0.015910 3.262122 3.522476 +v -0.015910 3.245790 3.522476 +v 0.010685 3.245790 3.522476 +v -0.015910 3.245790 3.522476 +v -0.015910 3.245790 3.522476 +v -0.016229 3.245790 3.504577 +v 0.010484 3.245790 3.504565 +v -0.016229 3.245790 3.504577 +v 0.010484 3.262122 3.504565 +v 0.010484 3.245790 3.504565 +v -0.016229 3.245790 3.504577 +v -0.016229 3.262122 3.504577 +v 0.010484 3.262122 3.504565 +v 0.010484 3.262122 3.504565 +v 0.010484 3.262122 3.504565 +v 0.010685 3.262122 3.522476 +v 0.037908 3.262122 3.522476 +v 0.010685 3.262122 3.522476 +v 0.037908 3.262122 3.522476 +v 0.010685 3.262122 3.522476 +v 0.010685 3.245790 3.522476 +v 0.037908 3.245790 3.522476 +v 0.010685 3.245790 3.522476 +v 0.037908 3.245790 3.522476 +v 0.010685 3.245790 3.522476 +v 0.010484 3.245790 3.504565 +v 0.010484 3.245790 3.504565 +v 0.037809 3.262122 3.504558 +v 0.037809 3.245790 3.504558 +v 0.010484 3.245790 3.504565 +v 0.010484 3.262122 3.504565 +v 0.037809 3.262122 3.504558 +v 0.037809 3.262122 3.504558 +v 0.037809 3.262122 3.504558 +v 0.037908 3.262122 3.522476 +v 0.065696 3.262122 3.522476 +v 0.037908 3.262122 3.522476 +v 0.065696 3.262122 3.522476 +v 0.037908 3.262122 3.522476 +v 0.037908 3.245790 3.522476 +v 0.037908 3.245790 3.522476 +v 0.065696 3.245790 3.522476 +v 0.037908 3.245790 3.522476 +v 0.037809 3.245790 3.504558 +v 0.037809 3.245790 3.504558 +v 0.065685 3.262122 3.504555 +v 0.065685 3.245790 3.504555 +v 0.037809 3.245790 3.504558 +v 0.037809 3.262122 3.504558 +v 0.065685 3.262122 3.504555 +v 0.065685 3.262122 3.504555 +v 0.065685 3.262122 3.504555 +v 0.065696 3.262122 3.522476 +v 0.065696 3.262122 3.522476 +v 0.093987 3.262122 3.522476 +v 0.065696 3.262122 3.522476 +v 0.065696 3.245790 3.522476 +v 0.093987 3.245790 3.522476 +v 0.065696 3.245790 3.522476 +v 0.093987 3.245790 3.522476 +v 0.065696 3.245790 3.522476 +v 0.065685 3.245790 3.504555 +v 0.065685 3.245790 3.504555 +v 0.094050 3.262122 3.504557 +v 0.094050 3.245790 3.504557 +v 0.065685 3.245790 3.504555 +v 0.065685 3.262122 3.504555 +v 0.094050 3.262122 3.504557 +v 0.094050 3.262122 3.504557 +v 0.094050 3.262122 3.504557 +v 0.093987 3.262122 3.522476 +v 0.122718 3.262122 3.522476 +v 0.093987 3.262122 3.522476 +v 0.122718 3.262122 3.522476 +v 0.093987 3.262122 3.522476 +v 0.093987 3.245790 3.522476 +v 0.093987 3.245790 3.522476 +v 0.122718 3.245790 3.522476 +v 0.093987 3.245790 3.522476 +v 0.094050 3.245790 3.504557 +v 0.094050 3.245790 3.504557 +v 0.122844 3.262122 3.504561 +v 0.122844 3.245790 3.504561 +v 0.094050 3.245790 3.504557 +v 0.094050 3.262122 3.504557 +v 0.122844 3.262122 3.504561 +v 0.122844 3.262122 3.504561 +v 0.122844 3.262122 3.504561 +v 0.122718 3.262122 3.522476 +v 0.122718 3.262122 3.522476 +v 0.151826 3.262122 3.522476 +v 0.122718 3.262122 3.522476 +v 0.122718 3.245790 3.522476 +v 0.122718 3.245790 3.522476 +v 0.151826 3.245790 3.522476 +v 0.122718 3.245790 3.522476 +v 0.122844 3.245790 3.504561 +v 0.152004 3.245790 3.504569 +v 0.122844 3.245790 3.504561 +v 0.152004 3.262122 3.504569 +v 0.152004 3.245790 3.504569 +v 0.122844 3.245790 3.504561 +v 0.122844 3.262122 3.504561 +v 0.152004 3.262122 3.504569 +v 0.152004 3.262122 3.504569 +v 0.152004 3.262122 3.504569 +v 0.151826 3.262122 3.522476 +v 0.151826 3.262122 3.522476 +v 0.181249 3.262122 3.522477 +v 0.151826 3.262122 3.522476 +v 0.151826 3.245790 3.522476 +v 0.151826 3.245790 3.522476 +v 0.181249 3.245790 3.522477 +v 0.151826 3.245790 3.522476 +v 0.152004 3.245790 3.504569 +v 0.181469 3.245790 3.504580 +v 0.152004 3.245790 3.504569 +v 0.181469 3.262122 3.504580 +v 0.181469 3.245790 3.504580 +v 0.152004 3.245790 3.504569 +v 0.152004 3.262122 3.504569 +v 0.181469 3.262122 3.504580 +v 0.181469 3.262122 3.504580 +v 0.181469 3.262122 3.504580 +v 0.181249 3.262122 3.522477 +v 0.181249 3.262122 3.522477 +v 0.210926 3.262122 3.522477 +v 0.181249 3.262122 3.522477 +v 0.181249 3.245790 3.522477 +v 0.181249 3.245790 3.522477 +v 0.210926 3.245790 3.522477 +v 0.181249 3.245790 3.522477 +v 0.181469 3.245790 3.504580 +v 0.181469 3.245790 3.504580 +v 0.211177 3.262122 3.504592 +v 0.211177 3.245790 3.504592 +v 0.181469 3.245790 3.504580 +v 0.181469 3.262122 3.504580 +v 0.211177 3.262122 3.504592 +v 0.211177 3.262122 3.504592 +v 0.211177 3.262122 3.504592 +v 0.210926 3.262122 3.522477 +v 0.210926 3.262122 3.522477 +v 0.240793 3.262122 3.522478 +v 0.210926 3.262122 3.522477 +v 0.210926 3.245790 3.522477 +v 0.240793 3.245790 3.522478 +v 0.210926 3.245790 3.522477 +v 0.240793 3.245790 3.522478 +v 0.210926 3.245790 3.522477 +v 0.211177 3.245790 3.504592 +v 0.211177 3.245790 3.504592 +v 0.241065 3.262122 3.504606 +v 0.241065 3.245790 3.504607 +v 0.211177 3.245790 3.504592 +v 0.211177 3.262122 3.504592 +v 0.241065 3.262122 3.504606 +v 0.241065 3.262122 3.504606 +v 0.241065 3.262122 3.504606 +v 0.240793 3.262122 3.522478 +v 0.240793 3.262122 3.522478 +v 0.257997 3.262122 3.522478 +v 0.240793 3.262122 3.522478 +v 0.240793 3.245790 3.522478 +v 0.240793 3.245790 3.522478 +v 0.257997 3.245790 3.522478 +v 0.240793 3.245790 3.522478 +v 0.241065 3.245790 3.504607 +v 0.241065 3.245790 3.504607 +v 0.258280 3.262122 3.504621 +v 0.258280 3.245790 3.504621 +v 0.241065 3.245790 3.504607 +v 0.241065 3.262122 3.504606 +v 0.258280 3.262122 3.504621 +v 0.258280 3.262122 3.504621 +v 0.258280 3.262122 3.504621 +v 0.257997 3.262122 3.522478 +v 0.257997 3.262122 3.522478 +v 0.284467 3.262122 3.523059 +v 0.257997 3.262122 3.522478 +v 0.257997 3.245790 3.522478 +v 0.257997 3.245790 3.522478 +v 0.284467 3.245790 3.523059 +v 0.257997 3.245790 3.522478 +v 0.258280 3.245790 3.504621 +v 0.258280 3.245790 3.504621 +v 0.284373 3.262122 3.504870 +v 0.284373 3.245790 3.507518 +v 0.258280 3.245790 3.504621 +v 0.258280 3.262122 3.504621 +v 0.284373 3.262122 3.504870 +v 0.284792 3.245787 3.226256 +v 0.284792 3.262126 3.243422 +v 0.284792 3.245787 3.243422 +v 0.284792 3.262126 3.226256 +v 0.284792 3.262126 3.243422 +v 0.284792 3.245787 3.226256 +v 0.284467 3.245790 3.523059 +v 0.284373 3.245790 3.507518 +v 0.284373 3.262122 3.504870 +v 0.284467 3.262122 3.523059 +v 0.284467 3.245790 3.523059 +v 0.284373 3.262122 3.504870 +v -0.016229 3.245790 3.504577 +v -0.035721 3.245790 3.522561 +v -0.016229 3.245790 3.504577 +v -0.034618 3.245790 3.514323 +v -0.047433 3.245790 3.504187 +v -0.016229 3.245790 3.504577 +v -0.016229 3.245790 3.504577 +v -0.035937 3.245790 3.510264 +v -0.039390 3.245790 3.507755 +v -0.047433 3.245790 3.504187 +v -0.039390 3.245790 3.507755 +v -0.047433 3.245790 3.504187 +v -0.043659 3.245790 3.507755 +v -0.047433 3.245790 3.504187 +v -0.047112 3.245790 3.510264 +v -0.061850 3.245790 3.547277 +v -0.046212 3.245790 3.553601 +v -0.061850 3.245790 3.547277 +v -0.061850 3.245790 3.547277 +v -0.047112 3.245790 3.510264 +v -0.048431 3.245790 3.514323 +v -0.046212 3.245790 3.553601 +v -0.048431 3.245790 3.514323 +v -0.035721 3.245790 3.522561 +v -0.046212 3.245790 3.553601 +v -0.046212 3.245790 3.553601 +v -0.047112 3.245790 3.518383 +v -0.043659 3.245790 3.520892 +v -0.035721 3.245790 3.522561 +v -0.035721 3.245790 3.522561 +v -0.035937 3.245790 3.518383 +v -0.034618 3.245790 3.514323 +v -0.035721 3.245790 3.522561 +v -0.188539 3.245790 3.714264 +v -0.178276 3.245790 3.727859 +v -0.188539 3.245790 3.714264 +v -0.206203 3.245790 3.741984 +v -0.188539 3.245790 3.714264 +v -0.225826 3.245790 3.740452 +v -0.188539 3.245790 3.714264 +v -0.188539 3.245790 3.714264 +v -0.210975 3.245790 3.735415 +v -0.215244 3.245790 3.735415 +v -0.225826 3.245790 3.740452 +v -0.217037 3.245790 3.755083 +v -0.225826 3.245790 3.740452 +v -0.225826 3.245790 3.740452 +v -0.220016 3.245790 3.741984 +v -0.217037 3.245790 3.755083 +v -0.220016 3.245790 3.741984 +v -0.217037 3.245790 3.755083 +v -0.218697 3.245790 3.746043 +v -0.178276 3.245790 3.727859 +v -0.217037 3.245790 3.755083 +v -0.217037 3.245790 3.755083 +v -0.210975 3.245790 3.748552 +v -0.178276 3.245790 3.727859 +v -0.210975 3.245790 3.748552 +v -0.207522 3.245790 3.746043 +v -0.206203 3.245790 3.741984 +v -0.178276 3.245790 3.727859 +v -0.671831 3.245789 3.744505 +v -0.680392 3.245789 3.759278 +v -0.713949 3.245789 3.715136 +v -0.671831 3.245789 3.744505 +v -0.671831 3.245789 3.744505 +v -0.680241 3.245789 3.743258 +v -0.681560 3.245789 3.739198 +v -0.713949 3.245789 3.715136 +v -0.724334 3.245789 3.728637 +v -0.713949 3.245789 3.715136 +v -0.685013 3.245789 3.736689 +v -0.724334 3.245789 3.728637 +v -0.724334 3.245789 3.728637 +v -0.689281 3.245789 3.736689 +v -0.724334 3.245789 3.728637 +v -0.692734 3.245789 3.739198 +v -0.680392 3.245789 3.759278 +v -0.724334 3.245789 3.728637 +v -0.724334 3.245789 3.728637 +v -0.692734 3.245789 3.747317 +v -0.680392 3.245789 3.759278 +v -0.692734 3.245789 3.747317 +v -0.680392 3.245789 3.759278 +v -0.689281 3.245789 3.749826 +v -0.680392 3.245789 3.759278 +v -0.681560 3.245789 3.747317 +v -0.680241 3.245789 3.743258 +v -0.680392 3.245789 3.759278 +v -0.894660 3.245789 3.339877 +v -0.877915 3.245789 3.341551 +v -0.877915 3.245789 3.341551 +v -0.879978 3.245789 3.400293 +v -0.881019 3.245789 3.394308 +v -0.894660 3.245789 3.339877 +v -0.881019 3.245789 3.394308 +v -0.894660 3.245789 3.339877 +v -0.882338 3.245789 3.390249 +v -0.894660 3.245789 3.339877 +v -0.894660 3.245789 3.339877 +v -0.890060 3.245789 3.387740 +v -0.896754 3.245789 3.401602 +v -0.894660 3.245789 3.339877 +v -0.894660 3.245789 3.339877 +v -0.894832 3.245789 3.394308 +v -0.896754 3.245789 3.401602 +v -0.894832 3.245789 3.394308 +v -0.896754 3.245789 3.401602 +v -0.896754 3.245789 3.401602 +v -0.890060 3.245789 3.400877 +v -0.870454 3.245789 3.453084 +v -0.879978 3.245789 3.400293 +v -0.870454 3.245789 3.453084 +v -0.870454 3.245789 3.453084 +v -0.890060 3.245789 3.400877 +v -0.885792 3.245789 3.400877 +v -0.879978 3.245789 3.400293 +v -0.885792 3.245789 3.400877 +v -0.881019 3.245789 3.394308 +v -0.879978 3.245789 3.400293 +v -0.644802 3.245789 2.974759 +v -0.695562 3.245789 3.003613 +v -0.644802 3.245789 2.974759 +v -0.644802 3.245789 2.974759 +v -0.685325 3.245789 3.007215 +v -0.688778 3.245789 3.004705 +v -0.695562 3.245789 3.003613 +v -0.688778 3.245789 3.004705 +v -0.730557 3.245789 3.051347 +v -0.695562 3.245789 3.003613 +v -0.695562 3.245789 3.003613 +v -0.693047 3.245789 3.004705 +v -0.696500 3.245789 3.007214 +v -0.730557 3.245789 3.051347 +v -0.696500 3.245789 3.007214 +v -0.730557 3.245789 3.051347 +v -0.686442 3.245789 3.018036 +v -0.730557 3.245789 3.051347 +v -0.730557 3.245789 3.051347 +v -0.696500 3.245789 3.015333 +v -0.686442 3.245789 3.018036 +v -0.693047 3.245789 3.017842 +v -0.686442 3.245789 3.018036 +v -0.644802 3.245789 2.974759 +v -0.686442 3.245789 3.018036 +v -0.685325 3.245789 3.015333 +v -0.684006 3.245789 3.011274 +v -0.644802 3.245789 2.974759 +v -0.685325 3.245789 3.015333 +v -0.224147 3.245788 2.996572 +v -0.187307 3.245788 3.022520 +v -0.187307 3.245788 3.022520 +v -0.224147 3.245788 2.996572 +v -0.206341 3.245788 3.011601 +v -0.232970 3.245788 3.011187 +v -0.224147 3.245788 2.996572 +v -0.224147 3.245788 2.996572 +v -0.209794 3.245788 3.009092 +v -0.214063 3.245788 3.009092 +v -0.232970 3.245788 3.011187 +v -0.214063 3.245788 3.009092 +v -0.232970 3.245788 3.011187 +v -0.217516 3.245788 3.011601 +v -0.197574 3.245788 3.036119 +v -0.232970 3.245788 3.011187 +v -0.232970 3.245788 3.011187 +v -0.218835 3.245788 3.015661 +v -0.217516 3.245788 3.019720 +v -0.197574 3.245788 3.036119 +v -0.217516 3.245788 3.019720 +v -0.187307 3.245788 3.022520 +v -0.197574 3.245788 3.036119 +v -0.187307 3.245788 3.022520 +v -0.214063 3.245788 3.022229 +v -0.187307 3.245788 3.022520 +v -0.209794 3.245788 3.022229 +v -0.205022 3.245788 3.015661 +v -0.187307 3.245788 3.022520 +v -0.030544 3.245787 3.226463 +v -0.009803 3.245787 3.226256 +v -0.030544 3.245787 3.226463 +v -0.028398 3.245787 3.234976 +v -0.030544 3.245787 3.226463 +v -0.029717 3.245787 3.230917 +v -0.063603 3.245787 3.200301 +v -0.063603 3.245787 3.200301 +v -0.029717 3.245787 3.230917 +v -0.063603 3.245787 3.200301 +v -0.033170 3.245787 3.228408 +v -0.063603 3.245787 3.200301 +v -0.037439 3.245787 3.228407 +v -0.040496 3.245787 3.243532 +v -0.063603 3.245787 3.200301 +v -0.063603 3.245787 3.200301 +v -0.040892 3.245787 3.230917 +v -0.040496 3.245787 3.243532 +v -0.042211 3.245787 3.234976 +v -0.040496 3.245787 3.243532 +v -0.040892 3.245787 3.239035 +v -0.040496 3.245787 3.243532 +v -0.037439 3.245787 3.241544 +v -0.009803 3.245787 3.243421 +v -0.009803 3.245787 3.226256 +v -0.009803 3.245787 3.243421 +v -0.009803 3.245787 3.243421 +v -0.037439 3.245787 3.241544 +v -0.028398 3.245787 3.234976 +v -0.009803 3.245787 3.226256 +v -0.009803 3.262125 3.243421 +v -0.030544 3.262125 3.226463 +v -0.029668 3.262125 3.235538 +v -0.030544 3.262125 3.226463 +v -0.030987 3.262125 3.231478 +v -0.030544 3.262125 3.226463 +v -0.048924 3.262125 3.191907 +v -0.030987 3.262125 3.231478 +v -0.048924 3.262125 3.191907 +v -0.034441 3.262125 3.228969 +v -0.048924 3.262125 3.191907 +v -0.038709 3.262125 3.228969 +v -0.048924 3.262125 3.191907 +v -0.048924 3.262125 3.191907 +v -0.063603 3.262125 3.200301 +v -0.042162 3.262125 3.231478 +v -0.048924 3.262125 3.191907 +v -0.063603 3.262125 3.200301 +v -0.040496 3.262125 3.243532 +v -0.043481 3.262125 3.235538 +v -0.063603 3.262125 3.200301 +v -0.042162 3.262125 3.239597 +v -0.040496 3.262125 3.243532 +v -0.040496 3.262125 3.243532 +v -0.009803 3.262125 3.243421 +v -0.009803 3.262125 3.243421 +v -0.034441 3.262125 3.242106 +v -0.009803 3.262125 3.243421 +v -0.029668 3.262125 3.235538 +v -0.030987 3.262125 3.239597 +v -0.009803 3.262125 3.243421 +v -0.197574 3.262125 3.036119 +v -0.187307 3.262125 3.022520 +v -0.187307 3.262125 3.022520 +v -0.224147 3.262125 2.996572 +v -0.204913 3.262125 3.015418 +v -0.187307 3.262125 3.022520 +v -0.206232 3.262125 3.011359 +v -0.224147 3.262125 2.996572 +v -0.224147 3.262125 2.996572 +v -0.224147 3.262125 2.996572 +v -0.232970 3.262125 3.011187 +v -0.213953 3.262125 3.008850 +v -0.224147 3.262125 2.996572 +v -0.217406 3.262125 3.011359 +v -0.232970 3.262125 3.011187 +v -0.232970 3.262125 3.011187 +v -0.197574 3.262125 3.036119 +v -0.218725 3.262125 3.015418 +v -0.232970 3.262125 3.011187 +v -0.217406 3.262125 3.019477 +v -0.217406 3.262125 3.019477 +v -0.197574 3.262125 3.036119 +v -0.213953 3.262125 3.021986 +v -0.197574 3.262125 3.036119 +v -0.197574 3.262125 3.036119 +v -0.206232 3.262125 3.019477 +v -0.197574 3.262125 3.036119 +v -0.204913 3.262125 3.015418 +v -0.637564 3.262125 2.990253 +v -0.637564 3.262125 2.990253 +v -0.695562 3.262125 3.003613 +v -0.683946 3.262125 3.008044 +v -0.637564 3.262125 2.990253 +v -0.687400 3.262125 3.005535 +v -0.695562 3.262125 3.003613 +v -0.691668 3.262125 3.005535 +v -0.695562 3.262125 3.003613 +v -0.741423 3.262125 3.038244 +v -0.691668 3.262125 3.005535 +v -0.741423 3.262125 3.038244 +v -0.741423 3.262125 3.038244 +v -0.696440 3.262125 3.012104 +v -0.741423 3.262125 3.038244 +v -0.695121 3.262125 3.016163 +v -0.741423 3.262125 3.038244 +v -0.741423 3.262125 3.038244 +v -0.730557 3.262125 3.051347 +v -0.730557 3.262125 3.051347 +v -0.686442 3.262125 3.018036 +v -0.691668 3.262125 3.018672 +v -0.741423 3.262125 3.038244 +v -0.687400 3.262125 3.018672 +v -0.686442 3.262125 3.018036 +v -0.637564 3.262125 2.990253 +v -0.687400 3.262125 3.018672 +v -0.686442 3.262125 3.018036 +v -0.683946 3.262125 3.016163 +v -0.682628 3.262125 3.012104 +v -0.683946 3.262125 3.016163 +v -0.637564 3.262125 2.990253 +v -0.879978 3.262124 3.400293 +v -0.877915 3.262124 3.341551 +v -0.881025 3.262124 3.393770 +v -0.877915 3.262124 3.341551 +v -0.882344 3.262124 3.389710 +v -0.877915 3.262124 3.341551 +v -0.885798 3.262124 3.387201 +v -0.877915 3.262124 3.341551 +v -0.890066 3.262124 3.387201 +v -0.877915 3.262124 3.341551 +v -0.894660 3.262124 3.339877 +v -0.890066 3.262124 3.387201 +v -0.894660 3.262124 3.339877 +v -0.894660 3.262124 3.339877 +v -0.896754 3.262124 3.401602 +v -0.893519 3.262124 3.389710 +v -0.894660 3.262124 3.339877 +v -0.894838 3.262124 3.393770 +v -0.894838 3.262124 3.393770 +v -0.896754 3.262124 3.401602 +v -0.896754 3.262124 3.401602 +v -0.896754 3.262124 3.401602 +v -0.879978 3.262124 3.400293 +v -0.890066 3.262124 3.400338 +v -0.896754 3.262124 3.401602 +v -0.885798 3.262124 3.400338 +v -0.879978 3.262124 3.400293 +v -0.882344 3.262124 3.397829 +v -0.879978 3.262124 3.400293 +v -0.881025 3.262124 3.393770 +v -0.680392 3.262123 3.759278 +v -0.671831 3.262123 3.744505 +v -0.671831 3.262123 3.744505 +v -0.713949 3.262123 3.715136 +v -0.679881 3.262123 3.743565 +v -0.671831 3.262123 3.744505 +v -0.713949 3.262123 3.715136 +v -0.688922 3.262123 3.736997 +v -0.713949 3.262123 3.715136 +v -0.692375 3.262123 3.739506 +v -0.713949 3.262123 3.715136 +v -0.724334 3.262123 3.728637 +v -0.692375 3.262123 3.739506 +v -0.724334 3.262123 3.728637 +v -0.724334 3.262123 3.728637 +v -0.680392 3.262123 3.759278 +v -0.693694 3.262123 3.743565 +v -0.724334 3.262123 3.728637 +v -0.692375 3.262123 3.747625 +v -0.680392 3.262123 3.759278 +v -0.680392 3.262123 3.759278 +v -0.684653 3.262123 3.750134 +v -0.680392 3.262123 3.759278 +v -0.681200 3.262123 3.747625 +v -0.680392 3.262123 3.759278 +v -0.679881 3.262123 3.743565 +v -0.178275 3.262122 3.727859 +v -0.178275 3.262122 3.727859 +v -0.188539 3.262122 3.714264 +v -0.207522 3.262122 3.737924 +v -0.178275 3.262122 3.727859 +v -0.210975 3.262122 3.735415 +v -0.188539 3.262122 3.714264 +v -0.225826 3.262122 3.740452 +v -0.210975 3.262122 3.735415 +v -0.188539 3.262122 3.714264 +v -0.215244 3.262122 3.735415 +v -0.215244 3.262122 3.735415 +v -0.225826 3.262122 3.740452 +v -0.218697 3.262122 3.737924 +v -0.225826 3.262122 3.740452 +v -0.225826 3.262122 3.740452 +v -0.217037 3.262122 3.755083 +v -0.220016 3.262122 3.741983 +v -0.217037 3.262122 3.755083 +v -0.218697 3.262122 3.746043 +v -0.217037 3.262122 3.755083 +v -0.215244 3.262122 3.748552 +v -0.217037 3.262122 3.755083 +v -0.217037 3.262122 3.755083 +v -0.178275 3.262122 3.727859 +v -0.210975 3.262122 3.748552 +v -0.178275 3.262122 3.727859 +v -0.178275 3.262122 3.727859 +v -0.206203 3.262122 3.741983 +v -0.897977 3.403733 3.400838 +v -0.878715 3.403806 3.336111 +v -0.881836 3.403733 3.400838 +v -0.878715 3.403806 3.336111 +v -0.881836 3.403733 3.400838 +v -0.878715 3.387264 3.336111 +v -0.881837 3.387337 3.400838 +v -0.878715 3.387264 3.336111 +v -0.881837 3.387337 3.400838 +v -0.895821 3.387264 3.334201 +v -0.897978 3.387336 3.400838 +v -0.895821 3.403806 3.334201 +v -0.895821 3.387264 3.334201 +v -0.897977 3.403733 3.400838 +v -0.895821 3.403806 3.334201 +v -0.895821 3.403806 3.334201 +v -0.878715 3.403806 3.336111 +v -0.867843 3.403804 3.274055 +v -0.878715 3.403806 3.336111 +v -0.867843 3.403804 3.274055 +v -0.878715 3.403806 3.336111 +v -0.878715 3.387264 3.336111 +v -0.867843 3.387266 3.274055 +v -0.878715 3.387264 3.336111 +v -0.867843 3.387266 3.274055 +v -0.878715 3.387264 3.336111 +v -0.895821 3.387264 3.334201 +v -0.884532 3.387266 3.269795 +v -0.895821 3.387264 3.334201 +v -0.884532 3.403804 3.269795 +v -0.884532 3.387266 3.269795 +v -0.895821 3.387264 3.334201 +v -0.895821 3.403806 3.334201 +v -0.884532 3.403804 3.269795 +v -0.884532 3.403804 3.269795 +v -0.867843 3.403804 3.274055 +v -0.849117 3.403800 3.215166 +v -0.867843 3.403804 3.274055 +v -0.849117 3.403800 3.215166 +v -0.867843 3.403804 3.274055 +v -0.867843 3.387266 3.274055 +v -0.849117 3.387269 3.215166 +v -0.867843 3.387266 3.274055 +v -0.849117 3.387269 3.215166 +v -0.867843 3.387266 3.274055 +v -0.884532 3.387266 3.269795 +v -0.865072 3.387269 3.208619 +v -0.884532 3.387266 3.269795 +v -0.865072 3.403800 3.208618 +v -0.865072 3.387269 3.208619 +v -0.884532 3.387266 3.269795 +v -0.884532 3.403804 3.269795 +v -0.865072 3.403800 3.208618 +v -0.865072 3.403800 3.208618 +v -0.849117 3.403800 3.215166 +v -0.822961 3.403798 3.160172 +v -0.849117 3.403800 3.215166 +v -0.822961 3.403798 3.160172 +v -0.849117 3.403800 3.215166 +v -0.849117 3.387269 3.215166 +v -0.822961 3.387272 3.160172 +v -0.849117 3.387269 3.215166 +v -0.822961 3.387272 3.160172 +v -0.849117 3.387269 3.215166 +v -0.865072 3.387269 3.208619 +v -0.837871 3.387272 3.151441 +v -0.865072 3.387269 3.208619 +v -0.837871 3.403798 3.151441 +v -0.837871 3.387272 3.151441 +v -0.865072 3.387269 3.208619 +v -0.865072 3.403800 3.208618 +v -0.837871 3.403798 3.151441 +v -0.837871 3.403798 3.151441 +v -0.822961 3.403798 3.160172 +v -0.789799 3.403796 3.109801 +v -0.822961 3.403798 3.160172 +v -0.789799 3.403796 3.109801 +v -0.822961 3.403798 3.160172 +v -0.822961 3.387272 3.160172 +v -0.789799 3.387275 3.109801 +v -0.822961 3.387272 3.160172 +v -0.789799 3.387275 3.109801 +v -0.822961 3.387272 3.160172 +v -0.837871 3.387272 3.151441 +v -0.803358 3.387275 3.099029 +v -0.837871 3.387272 3.151441 +v -0.803358 3.403796 3.099029 +v -0.803358 3.387275 3.099029 +v -0.837871 3.387272 3.151441 +v -0.837871 3.403798 3.151441 +v -0.803358 3.403796 3.099029 +v -0.803358 3.403796 3.099029 +v -0.789799 3.403796 3.109801 +v -0.750053 3.403794 3.064780 +v -0.789799 3.403796 3.109801 +v -0.750053 3.403794 3.064780 +v -0.789799 3.403796 3.109801 +v -0.789799 3.387275 3.109801 +v -0.750053 3.387277 3.064780 +v -0.789799 3.387275 3.109801 +v -0.750053 3.387277 3.064780 +v -0.789799 3.387275 3.109801 +v -0.803358 3.387275 3.099029 +v -0.761967 3.387277 3.052154 +v -0.803358 3.387275 3.099029 +v -0.761967 3.403793 3.052154 +v -0.761967 3.387277 3.052154 +v -0.803358 3.387275 3.099029 +v -0.803358 3.403796 3.099029 +v -0.761967 3.403793 3.052154 +v -0.761967 3.403793 3.052154 +v -0.750053 3.403794 3.064780 +v -0.704138 3.403790 3.025832 +v -0.750053 3.403794 3.064780 +v -0.704138 3.403790 3.025832 +v -0.750053 3.403794 3.064780 +v -0.750053 3.387277 3.064780 +v -0.704138 3.387279 3.025832 +v -0.750053 3.387277 3.064780 +v -0.704138 3.387279 3.025832 +v -0.750053 3.387277 3.064780 +v -0.761967 3.387277 3.052154 +v -0.714135 3.387279 3.011588 +v -0.761967 3.387277 3.052154 +v -0.714135 3.403790 3.011588 +v -0.714135 3.387279 3.011588 +v -0.761967 3.387277 3.052154 +v -0.761967 3.403793 3.052154 +v -0.714135 3.403790 3.011588 +v -0.704138 3.403790 3.025832 +v -0.704138 3.403790 3.025832 +v -0.652463 3.403788 2.993680 +v -0.704138 3.403790 3.025832 +v -0.704138 3.387279 3.025832 +v -0.652463 3.387282 2.993680 +v -0.704138 3.387279 3.025832 +v -0.652463 3.387282 2.993680 +v -0.704138 3.387279 3.025832 +v -0.714135 3.387279 3.011588 +v -0.660309 3.387283 2.978104 +v -0.714135 3.387279 3.011588 +v -0.660309 3.387283 2.978104 +v -0.714135 3.387279 3.011588 +v -0.714135 3.403790 3.011588 +v -0.660309 3.403788 2.978104 +v -0.660309 3.403788 2.978104 +v -0.660309 3.403788 2.978104 +v -0.652463 3.403788 2.993680 +v -0.652463 3.403788 2.993680 +v -0.595428 3.403785 2.969051 +v -0.652463 3.403788 2.993680 +v -0.652463 3.387282 2.993680 +v -0.652463 3.387282 2.993680 +v -0.652463 3.387282 2.993680 +v -0.660309 3.387283 2.978104 +v -0.660309 3.387283 2.978104 +v -0.600944 3.403785 2.952474 +v -0.660309 3.387283 2.978104 +v -0.660309 3.403788 2.978104 +v -0.600944 3.403785 2.952474 +v -0.595428 3.403785 2.969051 +v -0.533420 3.403783 2.952676 +v -0.595428 3.403785 2.969051 +v -0.536505 3.403784 2.935461 +v -0.600944 3.403785 2.952474 +v -0.536505 3.403784 2.935461 +v -0.533420 3.403783 2.952676 +v -0.467084 3.403780 2.945306 +v -0.533420 3.403783 2.952676 +v -0.467201 3.403781 2.927811 +v -0.536505 3.403784 2.935461 +v -0.467201 3.403781 2.927811 +v -0.467084 3.403780 2.945306 +v -0.407494 3.403779 2.950058 +v -0.467084 3.403780 2.945306 +v -0.405304 3.403779 2.932710 +v -0.467201 3.403781 2.927811 +v -0.405304 3.403779 2.932710 +v -0.407494 3.403779 2.950058 +v -0.352922 3.403777 2.960197 +v -0.407494 3.403779 2.950058 +v -0.348926 3.403777 2.943193 +v -0.405304 3.403779 2.932710 +v -0.348926 3.403777 2.943193 +v -0.352922 3.403777 2.960197 +v -0.303357 3.403774 2.975363 +v -0.352922 3.403777 2.960197 +v -0.297479 3.403774 2.958941 +v -0.348926 3.403777 2.943193 +v -0.297479 3.403774 2.958941 +v -0.303357 3.403774 2.975363 +v -0.258460 3.403773 2.995206 +v -0.303357 3.403774 2.975363 +v -0.303357 3.387296 2.975363 +v -0.258460 3.387299 2.995206 +v -0.303357 3.387296 2.975363 +v -0.297479 3.387296 2.958941 +v -0.297479 3.387296 2.958941 +v -0.250709 3.403773 2.979618 +v -0.250709 3.387299 2.979618 +v -0.297479 3.387296 2.958941 +v -0.297479 3.403774 2.958941 +v -0.250709 3.403773 2.979618 +v -0.250709 3.403773 2.979618 +v -0.250709 3.403773 2.979618 +v -0.258460 3.403773 2.995206 +v -0.258460 3.403773 2.995206 +v -0.258460 3.403773 2.995206 +v -0.258460 3.387299 2.995206 +v -0.258460 3.387299 2.995206 +v -0.258460 3.387299 2.995206 +v -0.250709 3.387299 2.979618 +v -0.208365 3.387300 3.004872 +v -0.250709 3.387299 2.979618 +v -0.208365 3.387300 3.004872 +v -0.250709 3.387299 2.979618 +v -0.250709 3.403773 2.979618 +v -0.208365 3.403770 3.004872 +v -0.217887 3.403770 3.019398 +v -0.181299 3.403768 3.047629 +v -0.181299 3.403768 3.047629 +v -0.217887 3.403770 3.019398 +v -0.217887 3.387300 3.019398 +v -0.181299 3.387302 3.047629 +v -0.181299 3.387302 3.047629 +v -0.217887 3.387300 3.019398 +v -0.208365 3.387300 3.004872 +v -0.170191 3.387302 3.034332 +v -0.208365 3.387300 3.004872 +v -0.170191 3.387302 3.034332 +v -0.208365 3.387300 3.004872 +v -0.208365 3.403770 3.004872 +v -0.170191 3.403768 3.034332 +v -0.181299 3.403768 3.047629 +v -0.148374 3.403765 3.079597 +v -0.181299 3.403768 3.047629 +v -0.148374 3.403765 3.079597 +v -0.181299 3.403768 3.047629 +v -0.181299 3.387302 3.047629 +v -0.148374 3.387304 3.079597 +v -0.181299 3.387302 3.047629 +v -0.148374 3.387304 3.079597 +v -0.181299 3.387302 3.047629 +v -0.170191 3.387302 3.034332 +v -0.135915 3.387304 3.067616 +v -0.170191 3.387302 3.034332 +v -0.135915 3.387304 3.067616 +v -0.170191 3.387302 3.034332 +v -0.170191 3.403768 3.034332 +v -0.135915 3.403766 3.067616 +v -0.148374 3.403765 3.079597 +v -0.118806 3.403764 3.115002 +v -0.148374 3.403765 3.079597 +v -0.118806 3.403764 3.115002 +v -0.148374 3.403765 3.079597 +v -0.148374 3.387304 3.079597 +v -0.118806 3.387307 3.115002 +v -0.148374 3.387304 3.079597 +v -0.118806 3.387307 3.115002 +v -0.148374 3.387304 3.079597 +v -0.135915 3.387304 3.067616 +v -0.105247 3.387307 3.104342 +v -0.135915 3.387304 3.067616 +v -0.105247 3.387307 3.104342 +v -0.135915 3.387304 3.067616 +v -0.135915 3.403766 3.067616 +v -0.105247 3.403764 3.104342 +v -0.118806 3.403764 3.115002 +v -0.092305 3.403762 3.153536 +v -0.118806 3.403764 3.115002 +v -0.092305 3.403762 3.153536 +v -0.118806 3.403764 3.115002 +v -0.118806 3.387307 3.115002 +v -0.092305 3.387308 3.153536 +v -0.118806 3.387307 3.115002 +v -0.092305 3.387308 3.153536 +v -0.118806 3.387307 3.115002 +v -0.105247 3.387307 3.104342 +v -0.077882 3.387308 3.144137 +v -0.105247 3.387307 3.104342 +v -0.077882 3.387308 3.144137 +v -0.105247 3.387307 3.104342 +v -0.105247 3.403764 3.104342 +v -0.077881 3.403762 3.144137 +v -0.092305 3.403762 3.153536 +v -0.068589 3.403759 3.194881 +v -0.092305 3.403762 3.153536 +v -0.068589 3.403759 3.194881 +v -0.092305 3.403762 3.153536 +v -0.092305 3.387308 3.153536 +v -0.068589 3.387310 3.194881 +v -0.092305 3.387308 3.153536 +v -0.068589 3.387310 3.194881 +v -0.092305 3.387308 3.153536 +v -0.077882 3.387308 3.144137 +v -0.053507 3.387310 3.186636 +v -0.077882 3.387308 3.144137 +v -0.053507 3.403759 3.186636 +v -0.053507 3.387310 3.186636 +v -0.077882 3.387308 3.144137 +v -0.077881 3.403762 3.144137 +v -0.053507 3.403759 3.186636 +v -0.053507 3.403759 3.186636 +v -0.068589 3.403759 3.194881 +v -0.044226 3.403758 3.243448 +v -0.068589 3.403759 3.194881 +v -0.044226 3.403758 3.243448 +v -0.068589 3.403759 3.194881 +v -0.068589 3.387310 3.194881 +v -0.044226 3.387312 3.243448 +v -0.068589 3.387310 3.194881 +v -0.044226 3.387312 3.243448 +v -0.068589 3.387310 3.194881 +v -0.053507 3.387310 3.186636 +v -0.034330 3.387312 3.226375 +v -0.053507 3.387310 3.186636 +v -0.034330 3.387312 3.226375 +v -0.053507 3.387310 3.186636 +v -0.053507 3.403759 3.186636 +v -0.034330 3.403758 3.226375 +v -0.034330 3.403758 3.226375 +v -0.034330 3.403758 3.226375 +v -0.044226 3.403758 3.243448 +v -0.009815 3.403756 3.243817 +v -0.044226 3.403758 3.243448 +v -0.009815 3.403756 3.243817 +v -0.044226 3.403758 3.243448 +v -0.044226 3.387312 3.243448 +v -0.009813 3.387314 3.243818 +v -0.044226 3.387312 3.243448 +v -0.009813 3.387314 3.243818 +v -0.044226 3.387312 3.243448 +v -0.034330 3.387312 3.226375 +v -0.009815 3.387314 3.226374 +v -0.034330 3.387312 3.226375 +v -0.009815 3.387314 3.226374 +v -0.034330 3.387312 3.226375 +v -0.034330 3.403758 3.226375 +v -0.009816 3.403756 3.226373 +v -0.009816 3.403756 3.226373 +v -0.009815 3.403756 3.243817 +v 0.022104 3.403755 3.243811 +v -0.009815 3.403756 3.243817 +v 0.022104 3.403755 3.243811 +v -0.009815 3.403756 3.243817 +v -0.009813 3.387314 3.243818 +v 0.022106 3.387316 3.243812 +v -0.009813 3.387314 3.243818 +v 0.022106 3.387316 3.243812 +v -0.009813 3.387314 3.243818 +v -0.009815 3.387314 3.226374 +v 0.022104 3.387315 3.226372 +v -0.009815 3.387314 3.226374 +v 0.022104 3.387315 3.226372 +v -0.009815 3.387314 3.226374 +v -0.009816 3.403756 3.226373 +v 0.022102 3.403754 3.226371 +v 0.022102 3.403754 3.226371 +v 0.022104 3.403755 3.243811 +v 0.055940 3.403753 3.243804 +v 0.022104 3.403755 3.243811 +v 0.055940 3.403753 3.243804 +v 0.022104 3.403755 3.243811 +v 0.022106 3.387316 3.243812 +v 0.055942 3.387317 3.243804 +v 0.022106 3.387316 3.243812 +v 0.055942 3.387317 3.243804 +v 0.022106 3.387316 3.243812 +v 0.022104 3.387315 3.226372 +v 0.055940 3.387316 3.226367 +v 0.022104 3.387315 3.226372 +v 0.055940 3.387316 3.226367 +v 0.022104 3.387315 3.226372 +v 0.022102 3.403754 3.226371 +v 0.055938 3.403752 3.226367 +v 0.055938 3.403752 3.226367 +v 0.055940 3.403753 3.243804 +v 0.091472 3.403751 3.243795 +v 0.055940 3.403753 3.243804 +v 0.091472 3.403751 3.243795 +v 0.055940 3.403753 3.243804 +v 0.055942 3.387317 3.243804 +v 0.091474 3.387318 3.243795 +v 0.055942 3.387317 3.243804 +v 0.091474 3.387318 3.243795 +v 0.055942 3.387317 3.243804 +v 0.055940 3.387316 3.226367 +v 0.091472 3.387318 3.226362 +v 0.055940 3.387316 3.226367 +v 0.091472 3.387318 3.226362 +v 0.055940 3.387316 3.226367 +v 0.055938 3.403752 3.226367 +v 0.091470 3.403750 3.226361 +v 0.091470 3.403750 3.226361 +v 0.091472 3.403751 3.243795 +v 0.128477 3.403750 3.243785 +v 0.091472 3.403751 3.243795 +v 0.128477 3.403750 3.243785 +v 0.091472 3.403751 3.243795 +v 0.091474 3.387318 3.243795 +v 0.128479 3.387320 3.243786 +v 0.091474 3.387318 3.243795 +v 0.128479 3.387320 3.243786 +v 0.091474 3.387318 3.243795 +v 0.091472 3.387318 3.226362 +v 0.128477 3.387320 3.226355 +v 0.091472 3.387318 3.226362 +v 0.128477 3.387320 3.226355 +v 0.091472 3.387318 3.226362 +v 0.091470 3.403750 3.226361 +v 0.128476 3.403750 3.226355 +v 0.128476 3.403750 3.226355 +v 0.128477 3.403750 3.243785 +v 0.166736 3.403749 3.243775 +v 0.128477 3.403750 3.243785 +v 0.166736 3.403749 3.243775 +v 0.128477 3.403750 3.243785 +v 0.128479 3.387320 3.243786 +v 0.166738 3.387322 3.243776 +v 0.128479 3.387320 3.243786 +v 0.166738 3.387322 3.243776 +v 0.128479 3.387320 3.243786 +v 0.128477 3.387320 3.226355 +v 0.166736 3.387321 3.226348 +v 0.128477 3.387320 3.226355 +v 0.166736 3.387321 3.226348 +v 0.128477 3.387320 3.226355 +v 0.128476 3.403750 3.226355 +v 0.166734 3.403748 3.226348 +v 0.166734 3.403748 3.226348 +v 0.166736 3.403749 3.243775 +v 0.206025 3.403747 3.243765 +v 0.166736 3.403749 3.243775 +v 0.206025 3.403747 3.243765 +v 0.166736 3.403749 3.243775 +v 0.166738 3.387322 3.243776 +v 0.206027 3.387323 3.243766 +v 0.166738 3.387322 3.243776 +v 0.206027 3.387323 3.243766 +v 0.166738 3.387322 3.243776 +v 0.166736 3.387321 3.226348 +v 0.206026 3.387323 3.226342 +v 0.166736 3.387321 3.226348 +v 0.206026 3.387323 3.226342 +v 0.166736 3.387321 3.226348 +v 0.166734 3.403748 3.226348 +v 0.206024 3.403747 3.226341 +v 0.206024 3.403747 3.226341 +v 0.206025 3.403747 3.243765 +v 0.246124 3.403745 3.243757 +v 0.206025 3.403747 3.243765 +v 0.246124 3.403745 3.243757 +v 0.206025 3.403747 3.243765 +v 0.206027 3.387323 3.243766 +v 0.246126 3.387325 3.243757 +v 0.206027 3.387323 3.243766 +v 0.246126 3.387325 3.243757 +v 0.206027 3.387323 3.243766 +v 0.206026 3.387323 3.226342 +v 0.246124 3.387324 3.226336 +v 0.206026 3.387323 3.226342 +v 0.246122 3.403745 3.226336 +v 0.246124 3.387324 3.226336 +v 0.206026 3.387323 3.226342 +v 0.206024 3.403747 3.226341 +v 0.246122 3.403745 3.226336 +v 0.246122 3.403745 3.226336 +v 0.246122 3.403745 3.226336 +v 0.246124 3.403745 3.243757 +v 0.286810 3.403744 3.243749 +v 0.246124 3.403745 3.243757 +v 0.286810 3.403744 3.243749 +v 0.246124 3.403745 3.243757 +v 0.246126 3.387325 3.243757 +v 0.286812 3.387326 3.243749 +v 0.246126 3.387325 3.243757 +v 0.286812 3.387326 3.243749 +v 0.246126 3.387325 3.243757 +v 0.246124 3.387324 3.226336 +v 0.286811 3.387326 3.226332 +v 0.246124 3.387324 3.226336 +v 0.286811 3.387326 3.226332 +v 0.246124 3.387324 3.226336 +v 0.246122 3.403745 3.226336 +v 0.286809 3.403744 3.226331 +v 0.286809 3.403744 3.226331 +v 0.286810 3.403744 3.243749 +v 0.327863 3.403743 3.243743 +v 0.286810 3.403744 3.243749 +v 0.327863 3.403743 3.243743 +v 0.286810 3.403744 3.243749 +v 0.286812 3.387326 3.243749 +v 0.327865 3.387328 3.243744 +v 0.286812 3.387326 3.243749 +v 0.327865 3.387328 3.243744 +v 0.286812 3.387326 3.243749 +v 0.286811 3.387326 3.226332 +v 0.327863 3.387327 3.226330 +v 0.286811 3.387326 3.226332 +v 0.327861 3.403742 3.226329 +v 0.327863 3.387327 3.226330 +v 0.286811 3.387326 3.226332 +v 0.286809 3.403744 3.226331 +v 0.327861 3.403742 3.226329 +v 0.327861 3.403742 3.226329 +v 0.327861 3.403742 3.226329 +v 0.327863 3.403743 3.243743 +v 0.369072 3.403741 3.243740 +v 0.327863 3.403743 3.243743 +v 0.369072 3.403741 3.243740 +v 0.327863 3.403743 3.243743 +v 0.327865 3.387328 3.243744 +v 0.369074 3.387329 3.243741 +v 0.327865 3.387328 3.243744 +v 0.369074 3.387329 3.243741 +v 0.327865 3.387328 3.243744 +v 0.327863 3.387327 3.226330 +v 0.369047 3.387329 3.226330 +v 0.327863 3.387327 3.226330 +v 0.369047 3.387329 3.226330 +v 0.327863 3.387327 3.226330 +v 0.327861 3.403742 3.226329 +v 0.369045 3.403740 3.226329 +v 0.369072 3.403741 3.243740 +v 0.389608 3.403740 3.245059 +v 0.369072 3.403741 3.243740 +v 0.389608 3.403740 3.245059 +v 0.369072 3.403741 3.243740 +v 0.369074 3.387329 3.243741 +v 0.389610 3.387331 3.245060 +v 0.369074 3.387329 3.243741 +v 0.389610 3.387331 3.245060 +v 0.369074 3.387329 3.243741 +v 0.369047 3.387329 3.226330 +v 0.392028 3.387330 3.227826 +v 0.369047 3.387329 3.226330 +v 0.392026 3.403740 3.227825 +v 0.392028 3.387330 3.227826 +v 0.369047 3.387329 3.226330 +v 0.369045 3.403740 3.226329 +v 0.392026 3.403740 3.227825 +v 0.392026 3.403740 3.227825 +v 0.389608 3.403740 3.245059 +v 0.408457 3.403739 3.249382 +v 0.389608 3.403740 3.245059 +v 0.408457 3.403739 3.249382 +v 0.389608 3.403740 3.245059 +v 0.389610 3.387331 3.245060 +v 0.408460 3.387331 3.249383 +v 0.389610 3.387331 3.245060 +v 0.408460 3.387331 3.249383 +v 0.389610 3.387331 3.245060 +v 0.392028 3.387330 3.227826 +v 0.413540 3.387331 3.232764 +v 0.392028 3.387330 3.227826 +v 0.413540 3.387331 3.232764 +v 0.392028 3.387330 3.227826 +v 0.392026 3.403740 3.227825 +v 0.413538 3.403739 3.232763 +v 0.408457 3.403739 3.249382 +v 0.425682 3.403738 3.256446 +v 0.408457 3.403739 3.249382 +v 0.425682 3.403738 3.256446 +v 0.408457 3.403739 3.249382 +v 0.408460 3.387331 3.249383 +v 0.425683 3.387332 3.256447 +v 0.408460 3.387331 3.249383 +v 0.425683 3.387332 3.256447 +v 0.408460 3.387331 3.249383 +v 0.413540 3.387331 3.232764 +v 0.433312 3.387331 3.240877 +v 0.413540 3.387331 3.232764 +v 0.433312 3.387331 3.240877 +v 0.413540 3.387331 3.232764 +v 0.413538 3.403739 3.232763 +v 0.433310 3.403738 3.240876 +v 0.425682 3.403738 3.256446 +v 0.441232 3.403737 3.266013 +v 0.425682 3.403738 3.256446 +v 0.441232 3.403737 3.266013 +v 0.425682 3.403738 3.256446 +v 0.425683 3.387332 3.256447 +v 0.441233 3.387332 3.266015 +v 0.425683 3.387332 3.256447 +v 0.441233 3.387332 3.266015 +v 0.425683 3.387332 3.256447 +v 0.433312 3.387331 3.240877 +v 0.451179 3.387332 3.251872 +v 0.433312 3.387331 3.240877 +v 0.451179 3.387332 3.251872 +v 0.433312 3.387331 3.240877 +v 0.433310 3.403738 3.240876 +v 0.451177 3.403737 3.251870 +v 0.451177 3.403737 3.251870 +v 0.441232 3.403737 3.266013 +v 0.455044 3.403737 3.277862 +v 0.441232 3.403737 3.266013 +v 0.455044 3.403737 3.277862 +v 0.441232 3.403737 3.266013 +v 0.441233 3.387332 3.266015 +v 0.455045 3.387334 3.277864 +v 0.441233 3.387332 3.266015 +v 0.455045 3.387334 3.277864 +v 0.441233 3.387332 3.266015 +v 0.451179 3.387332 3.251872 +v 0.466994 3.387333 3.265440 +v 0.451179 3.387332 3.251872 +v 0.466994 3.387333 3.265440 +v 0.451179 3.387332 3.251872 +v 0.451177 3.403737 3.251870 +v 0.466993 3.403736 3.265438 +v 0.466993 3.403736 3.265438 +v 0.466993 3.403736 3.265438 +v 0.455044 3.403737 3.277862 +v 0.455044 3.403737 3.277862 +v 0.467029 3.403736 3.291773 +v 0.455044 3.403737 3.277862 +v 0.455045 3.387334 3.277864 +v 0.455045 3.387334 3.277864 +v 0.455045 3.387334 3.277864 +v 0.466994 3.387333 3.265440 +v 0.466994 3.387333 3.265440 +v 0.480633 3.403735 3.281270 +v 0.466994 3.387333 3.265440 +v 0.466993 3.403736 3.265438 +v 0.480633 3.403735 3.281270 +v 0.467029 3.403736 3.291773 +v 0.477081 3.403735 3.307518 +v 0.467029 3.403736 3.291773 +v 0.491990 3.403734 3.299059 +v 0.480633 3.403735 3.281270 +v 0.491990 3.403734 3.299059 +v 0.477081 3.403735 3.307518 +v 0.485086 3.403734 3.324862 +v 0.477081 3.403735 3.307518 +v 0.500970 3.403733 3.318515 +v 0.491990 3.403734 3.299059 +v 0.500970 3.403733 3.318515 +v 0.485086 3.403734 3.324862 +v 0.490925 3.403733 3.343559 +v 0.485086 3.403734 3.324862 +v 0.507476 3.403733 3.339351 +v 0.500970 3.403733 3.318515 +v 0.507476 3.403733 3.339351 +v 0.490925 3.403733 3.343559 +v 0.494481 3.403732 3.363354 +v 0.490925 3.403733 3.343559 +v 0.511416 3.403732 3.361290 +v 0.507476 3.403733 3.339351 +v 0.511416 3.403732 3.361290 +v 0.494481 3.403732 3.363354 +v 0.495639 3.403732 3.383988 +v 0.494481 3.403732 3.363354 +v 0.512692 3.403731 3.384063 +v 0.511416 3.403732 3.361290 +v 0.512692 3.403731 3.384063 +v 0.495639 3.403732 3.383988 +v 0.494190 3.403731 3.403972 +v 0.495639 3.403732 3.383988 +v 0.511059 3.403730 3.406520 +v 0.512692 3.403731 3.384063 +v 0.511059 3.403730 3.406520 +v 0.494190 3.403731 3.403972 +v 0.490162 3.403731 3.422238 +v 0.494190 3.403731 3.403972 +v 0.506461 3.403729 3.427344 +v 0.511059 3.403730 3.406520 +v 0.506461 3.403729 3.427344 +v 0.490162 3.403731 3.422238 +v 0.483777 3.403730 3.438778 +v 0.490162 3.403731 3.422238 +v 0.499101 3.403729 3.446400 +v 0.506461 3.403729 3.427344 +v 0.499101 3.403729 3.446400 +v 0.483777 3.403730 3.438778 +v 0.475233 3.403729 3.453587 +v 0.483777 3.403730 3.438778 +v 0.489201 3.403728 3.463554 +v 0.499101 3.403729 3.446400 +v 0.489201 3.403728 3.463554 +v 0.475233 3.403729 3.453587 +v 0.464709 3.403728 3.466645 +v 0.475233 3.403729 3.453587 +v 0.477006 3.403727 3.478683 +v 0.489201 3.403728 3.463554 +v 0.477006 3.403727 3.478683 +v 0.464709 3.403728 3.466645 +v 0.452373 3.403728 3.477911 +v 0.464709 3.403728 3.466645 +v 0.464707 3.387342 3.466645 +v 0.452371 3.387344 3.477911 +v 0.452371 3.387344 3.477911 +v 0.462769 3.387342 3.491684 +v 0.477003 3.387341 3.478684 +v 0.462771 3.403726 3.491684 +v 0.462769 3.387342 3.491684 +v 0.477003 3.387341 3.478684 +v 0.477006 3.403727 3.478683 +v 0.462771 3.403726 3.491684 +v 0.462771 3.403726 3.491684 +v 0.462771 3.403726 3.491684 +v 0.452373 3.403728 3.477911 +v 0.438393 3.403727 3.487329 +v 0.452373 3.403728 3.477911 +v 0.438393 3.403727 3.487329 +v 0.452373 3.403728 3.477911 +v 0.452371 3.387344 3.477911 +v 0.438391 3.387344 3.487329 +v 0.452371 3.387344 3.477911 +v 0.438391 3.387344 3.487329 +v 0.452371 3.387344 3.477911 +v 0.462769 3.387342 3.491684 +v 0.446752 3.387342 3.502473 +v 0.462769 3.387342 3.491684 +v 0.446755 3.403726 3.502474 +v 0.446752 3.387342 3.502473 +v 0.462769 3.387342 3.491684 +v 0.462771 3.403726 3.491684 +v 0.446755 3.403726 3.502474 +v 0.446755 3.403726 3.502474 +v 0.446755 3.403726 3.502474 +v 0.438393 3.403727 3.487329 +v 0.422939 3.403726 3.494823 +v 0.438393 3.403727 3.487329 +v 0.422939 3.403726 3.494823 +v 0.438393 3.403727 3.487329 +v 0.438391 3.387344 3.487329 +v 0.422938 3.387345 3.494822 +v 0.438391 3.387344 3.487329 +v 0.422938 3.387345 3.494822 +v 0.438391 3.387344 3.487329 +v 0.446752 3.387342 3.502473 +v 0.429204 3.387344 3.510983 +v 0.446752 3.387342 3.502473 +v 0.429205 3.403724 3.510984 +v 0.429204 3.387344 3.510983 +v 0.446752 3.387342 3.502473 +v 0.446755 3.403726 3.502474 +v 0.429205 3.403724 3.510984 +v 0.429205 3.403724 3.510984 +v 0.429205 3.403724 3.510984 +v 0.422939 3.403726 3.494823 +v 0.406200 3.403725 3.500308 +v 0.422939 3.403726 3.494823 +v 0.406200 3.403725 3.500308 +v 0.422939 3.403726 3.494823 +v 0.422938 3.387345 3.494822 +v 0.406199 3.387346 3.500306 +v 0.422938 3.387345 3.494822 +v 0.406199 3.387346 3.500306 +v 0.422938 3.387345 3.494822 +v 0.429204 3.387344 3.510983 +v 0.410362 3.387345 3.517156 +v 0.429204 3.387344 3.510983 +v 0.410363 3.403724 3.517158 +v 0.410362 3.387345 3.517156 +v 0.429204 3.387344 3.510983 +v 0.429205 3.403724 3.510984 +v 0.410363 3.403724 3.517158 +v 0.410363 3.403724 3.517158 +v 0.410363 3.403724 3.517158 +v 0.406200 3.403725 3.500308 +v 0.388366 3.403724 3.503696 +v 0.406200 3.403725 3.500308 +v 0.388366 3.403724 3.503696 +v 0.406200 3.403725 3.500308 +v 0.406199 3.387346 3.500306 +v 0.388364 3.387347 3.503694 +v 0.406199 3.387346 3.500306 +v 0.388364 3.387347 3.503694 +v 0.406199 3.387346 3.500306 +v 0.410362 3.387345 3.517156 +v 0.390455 3.387345 3.520938 +v 0.410362 3.387345 3.517156 +v 0.390457 3.403723 3.520940 +v 0.390455 3.387345 3.520938 +v 0.410362 3.387345 3.517156 +v 0.410363 3.403724 3.517158 +v 0.390457 3.403723 3.520940 +v 0.390457 3.403723 3.520940 +v 0.390457 3.403723 3.520940 +v 0.388366 3.403724 3.503696 +v 0.369579 3.403723 3.504902 +v 0.388366 3.403724 3.503696 +v 0.369579 3.403723 3.504902 +v 0.388366 3.403724 3.503696 +v 0.388364 3.387347 3.503694 +v 0.369577 3.387347 3.504900 +v 0.388364 3.387347 3.503694 +v 0.369577 3.387347 3.504900 +v 0.388364 3.387347 3.503694 +v 0.390455 3.387345 3.520938 +v 0.369769 3.387346 3.522272 +v 0.390455 3.387345 3.520938 +v 0.369770 3.403722 3.522274 +v 0.369769 3.387346 3.522272 +v 0.390455 3.387345 3.520938 +v 0.390457 3.403723 3.520940 +v 0.369770 3.403722 3.522274 +v 0.369770 3.403722 3.522274 +v 0.369770 3.403722 3.522274 +v 0.369579 3.403723 3.504902 +v 0.341038 3.403723 3.505027 +v 0.369579 3.403723 3.504902 +v 0.341038 3.403723 3.505027 +v 0.369579 3.403723 3.504902 +v 0.369577 3.387347 3.504900 +v 0.341034 3.387349 3.505025 +v 0.369577 3.387347 3.504900 +v 0.341034 3.387349 3.505025 +v 0.369577 3.387347 3.504900 +v 0.369769 3.387346 3.522272 +v 0.341134 3.387348 3.522395 +v 0.369769 3.387346 3.522272 +v 0.341138 3.403721 3.522397 +v 0.341134 3.387348 3.522395 +v 0.369769 3.387346 3.522272 +v 0.369770 3.403722 3.522274 +v 0.341138 3.403721 3.522397 +v 0.341138 3.403721 3.522397 +v 0.341138 3.403721 3.522397 +v 0.341038 3.403723 3.505027 +v 0.307508 3.403721 3.504871 +v 0.341038 3.403723 3.505027 +v 0.307508 3.403721 3.504871 +v 0.341038 3.403723 3.505027 +v 0.341034 3.387349 3.505025 +v 0.307505 3.387350 3.504869 +v 0.307505 3.387350 3.504869 +v 0.341034 3.387349 3.505025 +v 0.341134 3.387348 3.522395 +v 0.307539 3.387348 3.522237 +v 0.341134 3.387348 3.522395 +v 0.307542 3.403719 3.522238 +v 0.307539 3.387348 3.522237 +v 0.341134 3.387348 3.522395 +v 0.341138 3.403721 3.522397 +v 0.307542 3.403719 3.522238 +v 0.307542 3.403719 3.522238 +v 0.307542 3.403719 3.522238 +v 0.307508 3.403721 3.504871 +v 0.270053 3.403719 3.504832 +v 0.307508 3.403721 3.504871 +v 0.270053 3.403719 3.504832 +v 0.307508 3.403721 3.504871 +v 0.307505 3.387350 3.504869 +v 0.270051 3.387352 3.504832 +v 0.307505 3.387350 3.504869 +v 0.270051 3.387352 3.504832 +v 0.307505 3.387350 3.504869 +v 0.307539 3.387348 3.522237 +v 0.270040 3.387350 3.522183 +v 0.307539 3.387348 3.522237 +v 0.270042 3.403717 3.522183 +v 0.270040 3.387350 3.522183 +v 0.307539 3.387348 3.522237 +v 0.307542 3.403719 3.522238 +v 0.270042 3.403717 3.522183 +v 0.270042 3.403717 3.522183 +v 0.270042 3.403717 3.522183 +v 0.270053 3.403719 3.504832 +v 0.229737 3.403717 3.504830 +v 0.270053 3.403719 3.504832 +v 0.229737 3.403717 3.504830 +v 0.270053 3.403719 3.504832 +v 0.270051 3.387352 3.504832 +v 0.229735 3.387353 3.504830 +v 0.270051 3.387352 3.504832 +v 0.229735 3.387353 3.504830 +v 0.270051 3.387352 3.504832 +v 0.270040 3.387350 3.522183 +v 0.229692 3.387352 3.522181 +v 0.270040 3.387350 3.522183 +v 0.229695 3.403715 3.522181 +v 0.229692 3.387352 3.522181 +v 0.270040 3.387350 3.522183 +v 0.270042 3.403717 3.522183 +v 0.229695 3.403715 3.522181 +v 0.229695 3.403715 3.522181 +v 0.229695 3.403715 3.522181 +v 0.229737 3.403717 3.504830 +v 0.187622 3.403716 3.504826 +v 0.229737 3.403717 3.504830 +v 0.187622 3.403716 3.504826 +v 0.229737 3.403717 3.504830 +v 0.229735 3.387353 3.504830 +v 0.187621 3.387355 3.504826 +v 0.229735 3.387353 3.504830 +v 0.187621 3.387355 3.504826 +v 0.229735 3.387353 3.504830 +v 0.229692 3.387352 3.522181 +v 0.187555 3.387353 3.522177 +v 0.229692 3.387352 3.522181 +v 0.187556 3.403715 3.522177 +v 0.187555 3.387353 3.522177 +v 0.229692 3.387352 3.522181 +v 0.229695 3.403715 3.522181 +v 0.187556 3.403715 3.522177 +v 0.187556 3.403715 3.522177 +v 0.187556 3.403715 3.522177 +v 0.187622 3.403716 3.504826 +v 0.144769 3.403715 3.504821 +v 0.187622 3.403716 3.504826 +v 0.144769 3.403715 3.504821 +v 0.187622 3.403716 3.504826 +v 0.187621 3.387355 3.504826 +v 0.144767 3.387357 3.504820 +v 0.187621 3.387355 3.504826 +v 0.144767 3.387357 3.504820 +v 0.187621 3.387355 3.504826 +v 0.187555 3.387353 3.522177 +v 0.144684 3.387355 3.522171 +v 0.187555 3.387353 3.522177 +v 0.144685 3.403713 3.522172 +v 0.144684 3.387355 3.522171 +v 0.187555 3.387353 3.522177 +v 0.187556 3.403715 3.522177 +v 0.144685 3.403713 3.522172 +v 0.144685 3.403713 3.522172 +v 0.144685 3.403713 3.522172 +v 0.144769 3.403715 3.504821 +v 0.102240 3.403713 3.504813 +v 0.144769 3.403715 3.504821 +v 0.102240 3.403713 3.504813 +v 0.144769 3.403715 3.504821 +v 0.144767 3.387357 3.504820 +v 0.102238 3.387358 3.504813 +v 0.144767 3.387357 3.504820 +v 0.102238 3.387358 3.504813 +v 0.144767 3.387357 3.504820 +v 0.144684 3.387355 3.522171 +v 0.102141 3.387357 3.522165 +v 0.144684 3.387355 3.522171 +v 0.102142 3.403711 3.522166 +v 0.102141 3.387357 3.522165 +v 0.144685 3.403713 3.522172 +v 0.102142 3.403711 3.522166 +v 0.102142 3.403711 3.522166 +v 0.102142 3.403711 3.522166 +v 0.102240 3.403713 3.504813 +v 0.061094 3.403711 3.504806 +v 0.102240 3.403713 3.504813 +v 0.061094 3.403711 3.504806 +v 0.102240 3.403713 3.504813 +v 0.102238 3.387358 3.504813 +v 0.061093 3.387359 3.504806 +v 0.102238 3.387358 3.504813 +v 0.061093 3.387359 3.504806 +v 0.102238 3.387358 3.504813 +v 0.102141 3.387357 3.522165 +v 0.060985 3.387357 3.522158 +v 0.102141 3.387357 3.522165 +v 0.060986 3.403709 3.522159 +v 0.060985 3.387357 3.522158 +v 0.102141 3.387357 3.522165 +v 0.102142 3.403711 3.522166 +v 0.060986 3.403709 3.522159 +v 0.060986 3.403709 3.522159 +v 0.060986 3.403709 3.522159 +v 0.061094 3.403711 3.504806 +v 0.022391 3.403710 3.504798 +v 0.061094 3.403711 3.504806 +v 0.022391 3.403710 3.504798 +v 0.061094 3.403711 3.504806 +v 0.061093 3.387359 3.504806 +v 0.022390 3.387361 3.504798 +v 0.061093 3.387359 3.504806 +v 0.022390 3.387361 3.504798 +v 0.061093 3.387359 3.504806 +v 0.060985 3.387357 3.522158 +v 0.022276 3.387360 3.522151 +v 0.060985 3.387357 3.522158 +v 0.022277 3.403708 3.522151 +v 0.022276 3.387360 3.522151 +v 0.060985 3.387357 3.522158 +v 0.060986 3.403709 3.522159 +v 0.022277 3.403708 3.522151 +v 0.022277 3.403708 3.522151 +v 0.022277 3.403708 3.522151 +v 0.022391 3.403710 3.504798 +v -0.012810 3.403708 3.504791 +v 0.022391 3.403710 3.504798 +v -0.012810 3.403708 3.504791 +v 0.022391 3.403710 3.504798 +v 0.022390 3.387361 3.504798 +v -0.012811 3.387363 3.504791 +v 0.022390 3.387361 3.504798 +v -0.012811 3.387363 3.504791 +v 0.022390 3.387361 3.504798 +v 0.022276 3.387360 3.522151 +v -0.012925 3.387361 3.522144 +v 0.022276 3.387360 3.522151 +v -0.012924 3.403706 3.522145 +v -0.012925 3.387361 3.522144 +v 0.022276 3.387360 3.522151 +v 0.022277 3.403708 3.522151 +v -0.012924 3.403706 3.522145 +v -0.012924 3.403706 3.522145 +v -0.012924 3.403706 3.522145 +v -0.012810 3.403708 3.504791 +v -0.048399 3.403707 3.504735 +v -0.012810 3.403708 3.504791 +v -0.048399 3.403707 3.504735 +v -0.012810 3.403708 3.504791 +v -0.012811 3.387363 3.504791 +v -0.048400 3.387364 3.504734 +v -0.012811 3.387363 3.504791 +v -0.012925 3.387361 3.522144 +v -0.012925 3.387361 3.522144 +v -0.036162 3.403705 3.522184 +v -0.036164 3.387363 3.522183 +v -0.012925 3.387361 3.522144 +v -0.012924 3.403706 3.522145 +v -0.036162 3.403705 3.522184 +v -0.036162 3.403705 3.522184 +v -0.036162 3.403705 3.522184 +v -0.048399 3.403707 3.504735 +v -0.064707 3.403705 3.549778 +v -0.048399 3.403707 3.504735 +v -0.064707 3.403705 3.549778 +v -0.048399 3.403707 3.504735 +v -0.048400 3.387364 3.504734 +v -0.064709 3.387367 3.549779 +v -0.036164 3.387363 3.522183 +v -0.048984 3.403703 3.556363 +v -0.036164 3.387363 3.522183 +v -0.036162 3.403705 3.522184 +v -0.048984 3.403703 3.556363 +v -0.048984 3.403703 3.556363 +v -0.048984 3.403703 3.556363 +v -0.064707 3.403705 3.549778 +v -0.083518 3.403702 3.589091 +v -0.064707 3.403705 3.549778 +v -0.083518 3.403702 3.589091 +v -0.064707 3.403705 3.549778 +v -0.064709 3.387367 3.549779 +v -0.083521 3.387368 3.589092 +v -0.064709 3.387367 3.549779 +v -0.083521 3.387368 3.589092 +v -0.064709 3.387367 3.549779 +v -0.068735 3.387366 3.597631 +v -0.048986 3.387365 3.556363 +v -0.068733 3.403701 3.597631 +v -0.068735 3.387366 3.597631 +v -0.048986 3.387365 3.556363 +v -0.048984 3.403703 3.556363 +v -0.068733 3.403701 3.597631 +v -0.068733 3.403701 3.597631 +v -0.068733 3.403701 3.597631 +v -0.083518 3.403702 3.589091 +v -0.107852 3.403701 3.627356 +v -0.083518 3.403702 3.589091 +v -0.107852 3.403701 3.627356 +v -0.083518 3.403702 3.589091 +v -0.083521 3.387368 3.589092 +v -0.107854 3.387370 3.627356 +v -0.083521 3.387368 3.589092 +v -0.107854 3.387370 3.627356 +v -0.083521 3.387368 3.589092 +v -0.068735 3.387366 3.597631 +v -0.094159 3.387369 3.637607 +v -0.068735 3.387366 3.597631 +v -0.094157 3.403699 3.637607 +v -0.094159 3.387369 3.637607 +v -0.068735 3.387366 3.597631 +v -0.068733 3.403701 3.597631 +v -0.094157 3.403699 3.637607 +v -0.094157 3.403699 3.637607 +v -0.094157 3.403699 3.637607 +v -0.107852 3.403701 3.627356 +v -0.137374 3.403698 3.663773 +v -0.107852 3.403701 3.627356 +v -0.137374 3.403698 3.663773 +v -0.107852 3.403701 3.627356 +v -0.107854 3.387370 3.627356 +v -0.137376 3.387372 3.663773 +v -0.107854 3.387370 3.627356 +v -0.137376 3.387372 3.663773 +v -0.107854 3.387370 3.627356 +v -0.094159 3.387369 3.637607 +v -0.124915 3.387371 3.675541 +v -0.094159 3.387369 3.637607 +v -0.124913 3.403697 3.675541 +v -0.124915 3.387371 3.675541 +v -0.094159 3.387369 3.637607 +v -0.094157 3.403699 3.637607 +v -0.124913 3.403697 3.675541 +v -0.124913 3.403697 3.675541 +v -0.124913 3.403697 3.675541 +v -0.137374 3.403698 3.663773 +v -0.171746 3.403696 3.697555 +v -0.137374 3.403698 3.663773 +v -0.171746 3.403696 3.697555 +v -0.137374 3.403698 3.663773 +v -0.137376 3.387372 3.663773 +v -0.171748 3.387374 3.697554 +v -0.137376 3.387372 3.663773 +v -0.171748 3.387374 3.697554 +v -0.137376 3.387372 3.663773 +v -0.124915 3.387371 3.675541 +v -0.160668 3.387372 3.710675 +v -0.124915 3.387371 3.675541 +v -0.160666 3.403694 3.710676 +v -0.160668 3.387372 3.710675 +v -0.124915 3.387371 3.675541 +v -0.124913 3.403697 3.675541 +v -0.160666 3.403694 3.710676 +v -0.160666 3.403694 3.710676 +v -0.160666 3.403694 3.710676 +v -0.171746 3.403696 3.697555 +v -0.210624 3.403694 3.727921 +v -0.171746 3.403696 3.697555 +v -0.210624 3.403694 3.727921 +v -0.171746 3.403696 3.697555 +v -0.171748 3.387374 3.697554 +v -0.210626 3.387377 3.727921 +v -0.171748 3.387374 3.697554 +v -0.210626 3.387377 3.727921 +v -0.171748 3.387374 3.697554 +v -0.160668 3.387372 3.710675 +v -0.201087 3.387374 3.742240 +v -0.160668 3.387372 3.710675 +v -0.201085 3.403692 3.742241 +v -0.201087 3.387374 3.742240 +v -0.160668 3.387372 3.710675 +v -0.160666 3.403694 3.710676 +v -0.201085 3.403692 3.742241 +v -0.201085 3.403692 3.742241 +v -0.201085 3.403692 3.742241 +v -0.210624 3.403694 3.727921 +v -0.253662 3.403692 3.754103 +v -0.210624 3.403694 3.727921 +v -0.253662 3.403692 3.754103 +v -0.210624 3.403694 3.727921 +v -0.210626 3.387377 3.727921 +v -0.253663 3.387378 3.754102 +v -0.210626 3.387377 3.727921 +v -0.253663 3.387378 3.754102 +v -0.210626 3.387377 3.727921 +v -0.201087 3.387374 3.742240 +v -0.245838 3.387377 3.769460 +v -0.201087 3.387374 3.742240 +v -0.245838 3.403690 3.769461 +v -0.245838 3.387377 3.769460 +v -0.201087 3.387374 3.742240 +v -0.201085 3.403692 3.742241 +v -0.245838 3.403690 3.769461 +v -0.245838 3.403690 3.769461 +v -0.245838 3.403690 3.769461 +v -0.253662 3.403692 3.754103 +v -0.300521 3.403690 3.775338 +v -0.253662 3.403692 3.754103 +v -0.300521 3.403690 3.775338 +v -0.253662 3.403692 3.754103 +v -0.253663 3.387378 3.754102 +v -0.300523 3.387380 3.775337 +v -0.253663 3.387378 3.754102 +v -0.300523 3.387380 3.775337 +v -0.253663 3.387378 3.754102 +v -0.245838 3.387377 3.769460 +v -0.245838 3.387377 3.769460 +v -0.294588 3.403688 3.791548 +v -0.294590 3.387379 3.791547 +v -0.245838 3.387377 3.769460 +v -0.245838 3.403690 3.769461 +v -0.294588 3.403688 3.791548 +v -0.294588 3.403688 3.791548 +v -0.294588 3.403688 3.791548 +v -0.300521 3.403690 3.775338 +v -0.300521 3.403690 3.775338 +v -0.350870 3.403688 3.790871 +v -0.300521 3.403690 3.775338 +v -0.300523 3.387380 3.775337 +v -0.300523 3.387380 3.775337 +v -0.350871 3.387382 3.790869 +v -0.300523 3.387380 3.775337 +v -0.294590 3.387379 3.791547 +v -0.346995 3.387380 3.807710 +v -0.294590 3.387379 3.791547 +v -0.346994 3.403687 3.807711 +v -0.346995 3.387380 3.807710 +v -0.294590 3.387379 3.791547 +v -0.294588 3.403688 3.791548 +v -0.346994 3.403687 3.807711 +v -0.346994 3.403687 3.807711 +v -0.346994 3.403687 3.807711 +v -0.350870 3.403688 3.790871 +v -0.404387 3.403686 3.799948 +v -0.350870 3.403688 3.790871 +v -0.404387 3.403686 3.799948 +v -0.350870 3.403688 3.790871 +v -0.350871 3.387382 3.790869 +v -0.404387 3.387385 3.799946 +v -0.350871 3.387382 3.790869 +v -0.404387 3.387385 3.799946 +v -0.350871 3.387382 3.790869 +v -0.346995 3.387380 3.807710 +v -0.402700 3.387383 3.817154 +v -0.346995 3.387380 3.807710 +v -0.402699 3.403684 3.817156 +v -0.402700 3.387383 3.817154 +v -0.346995 3.387380 3.807710 +v -0.346994 3.403687 3.807711 +v -0.402699 3.403684 3.817156 +v -0.402699 3.403684 3.817156 +v -0.402699 3.403684 3.817156 +v -0.404387 3.403686 3.799948 +v -0.460839 3.403684 3.801810 +v -0.404387 3.403686 3.799948 +v -0.460839 3.403684 3.801810 +v -0.404387 3.403686 3.799948 +v -0.404387 3.387385 3.799946 +v -0.460840 3.387387 3.801808 +v -0.404387 3.387385 3.799946 +v -0.460840 3.387387 3.801808 +v -0.404387 3.387385 3.799946 +v -0.402700 3.387383 3.817154 +v -0.461262 3.387385 3.819093 +v -0.402700 3.387383 3.817154 +v -0.461261 3.403682 3.819094 +v -0.461262 3.387385 3.819093 +v -0.402700 3.387383 3.817154 +v -0.402699 3.403684 3.817156 +v -0.461261 3.403682 3.819094 +v -0.461261 3.403682 3.819094 +v -0.460839 3.403684 3.801810 +v -0.526396 3.403682 3.796171 +v -0.460839 3.403684 3.801810 +v -0.526396 3.403682 3.796171 +v -0.460839 3.403684 3.801810 +v -0.460840 3.387387 3.801808 +v -0.526397 3.387389 3.796169 +v -0.460840 3.387387 3.801808 +v -0.526397 3.387389 3.796169 +v -0.460840 3.387387 3.801808 +v -0.461262 3.387385 3.819093 +v -0.528992 3.387387 3.813250 +v -0.461262 3.387385 3.819093 +v -0.528992 3.403680 3.813252 +v -0.528992 3.387387 3.813250 +v -0.461262 3.387385 3.819093 +v -0.461261 3.403682 3.819094 +v -0.528992 3.403680 3.813252 +v -0.528992 3.403680 3.813252 +v -0.526396 3.403682 3.796171 +v -0.587176 3.403679 3.782070 +v -0.526396 3.403682 3.796171 +v -0.587176 3.403679 3.782070 +v -0.526396 3.403682 3.796171 +v -0.526397 3.387389 3.796169 +v -0.587176 3.387392 3.782068 +v -0.526397 3.387389 3.796169 +v -0.587176 3.387392 3.782068 +v -0.526397 3.387389 3.796169 +v -0.528992 3.387387 3.813250 +v -0.592096 3.387390 3.798603 +v -0.528992 3.387387 3.813250 +v -0.592096 3.403678 3.798605 +v -0.592096 3.387390 3.798603 +v -0.528992 3.387387 3.813250 +v -0.528992 3.403680 3.813252 +v -0.592096 3.403678 3.798605 +v -0.592096 3.403678 3.798605 +v -0.587176 3.403679 3.782070 +v -0.643018 3.403677 3.760283 +v -0.587176 3.403679 3.782070 +v -0.643018 3.403677 3.760283 +v -0.587176 3.403679 3.782070 +v -0.587176 3.387392 3.782068 +v -0.643018 3.387394 3.760281 +v -0.587176 3.387392 3.782068 +v -0.643018 3.387394 3.760281 +v -0.587176 3.387392 3.782068 +v -0.592096 3.387390 3.798603 +v -0.650180 3.387392 3.775934 +v -0.592096 3.387390 3.798603 +v -0.650180 3.403675 3.775937 +v -0.650180 3.387392 3.775934 +v -0.592096 3.387390 3.798603 +v -0.592096 3.403678 3.798605 +v -0.650180 3.403675 3.775937 +v -0.650180 3.403675 3.775937 +v -0.643018 3.403677 3.760283 +v -0.693684 3.403674 3.731570 +v -0.643018 3.403677 3.760283 +v -0.693684 3.403674 3.731570 +v -0.643018 3.403677 3.760283 +v -0.643018 3.387394 3.760281 +v -0.693684 3.387396 3.731568 +v -0.643018 3.387394 3.760281 +v -0.693684 3.387396 3.731568 +v -0.643018 3.387394 3.760281 +v -0.650180 3.387392 3.775934 +v -0.702931 3.387394 3.746035 +v -0.650180 3.387392 3.775934 +v -0.702931 3.403672 3.746037 +v -0.702931 3.387394 3.746035 +v -0.650180 3.387392 3.775934 +v -0.650180 3.403675 3.775937 +v -0.702931 3.403672 3.746037 +v -0.702931 3.403672 3.746037 +v -0.693684 3.403674 3.731570 +v -0.738925 3.403672 3.696689 +v -0.693684 3.403674 3.731570 +v -0.738925 3.403672 3.696689 +v -0.693684 3.403674 3.731570 +v -0.693684 3.387396 3.731568 +v -0.738925 3.387398 3.696687 +v -0.693684 3.387396 3.731568 +v -0.738925 3.387398 3.696687 +v -0.693684 3.387396 3.731568 +v -0.702931 3.387394 3.746035 +v -0.750043 3.387396 3.709707 +v -0.702931 3.387394 3.746035 +v -0.750044 3.403670 3.709709 +v -0.750043 3.387396 3.709707 +v -0.702931 3.387394 3.746035 +v -0.702931 3.403672 3.746037 +v -0.750044 3.403670 3.709709 +v -0.750044 3.403670 3.709709 +v -0.738925 3.403672 3.696689 +v -0.778483 3.403670 3.656393 +v -0.738925 3.403672 3.696689 +v -0.778483 3.403670 3.656393 +v -0.738925 3.403672 3.696689 +v -0.738925 3.387398 3.696687 +v -0.778482 3.387402 3.656391 +v -0.738925 3.387398 3.696687 +v -0.778482 3.387402 3.656391 +v -0.738925 3.387398 3.696687 +v -0.750043 3.387396 3.709707 +v -0.791225 3.387399 3.667749 +v -0.750043 3.387396 3.709707 +v -0.791225 3.403667 3.667752 +v -0.791225 3.387399 3.667749 +v -0.750043 3.387396 3.709707 +v -0.750044 3.403670 3.709709 +v -0.791225 3.403667 3.667752 +v -0.791225 3.403667 3.667752 +v -0.778483 3.403670 3.656393 +v -0.812087 3.403667 3.611438 +v -0.778483 3.403670 3.656393 +v -0.812087 3.403667 3.611438 +v -0.778483 3.403670 3.656393 +v -0.778482 3.387402 3.656391 +v -0.812086 3.387403 3.611436 +v -0.778482 3.387402 3.656391 +v -0.812086 3.387403 3.611436 +v -0.778482 3.387402 3.656391 +v -0.791225 3.387399 3.667749 +v -0.826191 3.387402 3.620965 +v -0.791225 3.387399 3.667749 +v -0.826192 3.403665 3.620966 +v -0.826191 3.387402 3.620965 +v -0.791225 3.387399 3.667749 +v -0.791225 3.403667 3.667752 +v -0.826192 3.403665 3.620966 +v -0.826192 3.403665 3.620966 +v -0.812087 3.403667 3.611438 +v -0.839463 3.403665 3.562584 +v -0.812087 3.403667 3.611438 +v -0.839463 3.403665 3.562584 +v -0.812087 3.403667 3.611438 +v -0.812086 3.387403 3.611436 +v -0.839462 3.387406 3.562582 +v -0.812086 3.387403 3.611436 +v -0.839462 3.387406 3.562582 +v -0.812086 3.387403 3.611436 +v -0.826191 3.387402 3.620965 +v -0.854663 3.387404 3.570146 +v -0.826191 3.387402 3.620965 +v -0.854664 3.403663 3.570148 +v -0.854663 3.387404 3.570146 +v -0.826191 3.387402 3.620965 +v -0.826192 3.403665 3.620966 +v -0.854664 3.403663 3.570148 +v -0.854664 3.403663 3.570148 +v -0.839463 3.403665 3.562584 +v -0.860336 3.403663 3.510597 +v -0.839463 3.403665 3.562584 +v -0.860336 3.403663 3.510597 +v -0.839463 3.403665 3.562584 +v -0.839462 3.387406 3.562582 +v -0.860335 3.387409 3.510596 +v -0.839462 3.387406 3.562582 +v -0.860335 3.387409 3.510596 +v -0.839462 3.387406 3.562582 +v -0.854663 3.387404 3.570146 +v -0.876364 3.387407 3.516083 +v -0.854663 3.387404 3.570146 +v -0.876366 3.403661 3.516085 +v -0.876364 3.387407 3.516083 +v -0.854663 3.387404 3.570146 +v -0.854664 3.403663 3.570148 +v -0.876366 3.403661 3.516085 +v -0.876366 3.403661 3.516085 +v -0.860336 3.403663 3.510597 +v -0.874431 3.403660 3.456248 +v -0.860336 3.403663 3.510597 +v -0.874431 3.403660 3.456248 +v -0.860336 3.403663 3.510597 +v -0.860335 3.387409 3.510596 +v -0.874429 3.387411 3.456247 +v -0.860335 3.387409 3.510596 +v -0.874429 3.387411 3.456247 +v -0.860335 3.387409 3.510596 +v -0.876364 3.387407 3.516083 +v -0.891017 3.387409 3.459563 +v -0.876364 3.387407 3.516083 +v -0.891019 3.403658 3.459564 +v -0.891017 3.387409 3.459563 +v -0.876364 3.387407 3.516083 +v -0.876366 3.403661 3.516085 +v -0.891019 3.403658 3.459564 +v -0.891019 3.403658 3.459564 +v -0.881836 3.403733 3.400838 +v -0.897977 3.403733 3.400838 +v -0.874431 3.403660 3.456248 +v -0.881836 3.403733 3.400838 +v -0.874431 3.403660 3.456248 +v -0.881837 3.387337 3.400838 +v -0.881836 3.403733 3.400838 +v -0.874431 3.403660 3.456248 +v -0.874429 3.387411 3.456247 +v -0.881837 3.387337 3.400838 +v -0.874429 3.387411 3.456247 +v -0.897978 3.387336 3.400838 +v -0.881837 3.387337 3.400838 +v -0.874429 3.387411 3.456247 +v -0.891017 3.387409 3.459563 +v -0.897978 3.387336 3.400838 +v -0.891017 3.387409 3.459563 +v -0.897977 3.403733 3.400838 +v -0.897978 3.387336 3.400838 +v -0.891017 3.387409 3.459563 +v -0.891019 3.403658 3.459564 +v -0.897977 3.403733 3.400838 +v -0.012811 3.387363 3.504791 +v -0.036164 3.387363 3.522183 +v -0.012811 3.387363 3.504791 +v -0.034791 3.387363 3.514364 +v -0.048400 3.387364 3.504734 +v -0.012811 3.387363 3.504791 +v -0.012811 3.387363 3.504791 +v -0.036109 3.387364 3.510304 +v -0.048400 3.387364 3.504734 +v -0.039563 3.387364 3.507795 +v -0.048400 3.387364 3.504734 +v -0.043831 3.387364 3.507795 +v -0.064709 3.387367 3.549779 +v -0.048400 3.387364 3.504734 +v -0.047284 3.387364 3.510304 +v -0.048986 3.387365 3.556363 +v -0.064709 3.387367 3.549779 +v -0.064709 3.387367 3.549779 +v -0.047284 3.387364 3.510304 +v -0.048603 3.387365 3.514364 +v -0.048986 3.387365 3.556363 +v -0.048603 3.387365 3.514364 +v -0.036164 3.387363 3.522183 +v -0.048986 3.387365 3.556363 +v -0.048986 3.387365 3.556363 +v -0.047284 3.387364 3.518423 +v -0.036164 3.387363 3.522183 +v -0.043831 3.387364 3.520932 +v -0.036164 3.387363 3.522183 +v -0.036109 3.387363 3.518423 +v -0.034791 3.387363 3.514364 +v -0.036164 3.387363 3.522183 +v -0.029717 3.245787 3.239035 +v -0.009803 3.245787 3.243421 +v -0.033170 3.245787 3.241544 +vt 0.357565 0.854108 +vt 0.352049 0.884888 +vt 0.348469 0.885324 +vt 0.349075 0.885926 +vt 0.351231 0.884360 +vt 0.345286 0.886759 +vt 0.344897 0.886109 +vt 0.335112 0.886824 +vt 0.325214 0.887013 +vt 0.325480 0.886346 +vt 0.335113 0.887506 +vt 0.310169 0.882883 +vt 0.306391 0.878970 +vt 0.305245 0.879283 +vt 0.311084 0.882402 +vt 0.302178 0.874711 +vt 0.303438 0.874563 +vt 0.302940 0.862782 +vt 0.304010 0.857267 +vt 0.305228 0.857493 +vt 0.301660 0.862694 +vt 0.314295 0.849797 +vt 0.322713 0.848533 +vt 0.322377 0.847875 +vt 0.315020 0.850361 +vt 0.332449 0.847216 +vt 0.332460 0.847898 +vt 0.341754 0.848257 +vt 0.346538 0.848134 +vt 0.346165 0.848787 +vt 0.341963 0.847584 +vt 0.309233 0.853349 +vt 0.337175 0.847295 +vt 0.337086 0.847975 +vt 0.350624 0.848999 +vt 0.350023 0.849603 +vt 0.354080 0.850249 +vt 0.353038 0.850732 +vt 0.356835 0.852123 +vt 0.356836 0.853532 +vt 0.356835 0.853532 +vt 0.356835 0.882048 +vt 0.356835 0.883121 +vt 0.356836 0.883119 +vt 0.356835 0.882044 +vt 0.359543 0.880996 +vt 0.356832 0.880996 +vt 0.356832 0.886978 +vt 0.356836 0.882044 +vt 0.351787 0.884888 +vt 0.350969 0.884360 +vt 0.348813 0.885926 +vt 0.348207 0.885324 +vt 0.345024 0.886759 +vt 0.344635 0.886109 +vt 0.340383 0.887310 +vt 0.340200 0.886635 +vt 0.334851 0.887506 +vt 0.334850 0.886824 +vt 0.324952 0.887013 +vt 0.325218 0.886346 +vt 0.316602 0.885468 +vt 0.317196 0.884863 +vt 0.309907 0.882883 +vt 0.310822 0.882402 +vt 0.304983 0.879283 +vt 0.306129 0.878970 +vt 0.301916 0.874711 +vt 0.303176 0.874563 +vt 0.300763 0.869197 +vt 0.302053 0.869186 +vt 0.301398 0.862694 +vt 0.302678 0.862782 +vt 0.303748 0.857267 +vt 0.304966 0.857493 +vt 0.307926 0.852949 +vt 0.308971 0.853349 +vt 0.314033 0.849797 +vt 0.314759 0.850361 +vt 0.322115 0.847875 +vt 0.322451 0.848533 +vt 0.332187 0.847216 +vt 0.332198 0.847898 +vt 0.336914 0.847295 +vt 0.336824 0.847975 +vt 0.341701 0.847584 +vt 0.341492 0.848257 +vt 0.346276 0.848134 +vt 0.345903 0.848787 +vt 0.350362 0.848999 +vt 0.349761 0.849603 +vt 0.353818 0.850249 +vt 0.352777 0.850732 +vt 0.356836 0.852123 +vt 0.356832 0.854108 +vt 0.356832 0.847787 +vt 0.359543 0.854108 +vt 0.446297 0.886191 +vt 0.444812 0.885643 +vt 0.444462 0.886191 +vt 0.445730 0.885304 +vt 0.446864 0.885304 +vt 0.447782 0.885643 +vt 0.448132 0.886191 +vt 0.447782 0.886739 +vt 0.446864 0.887078 +vt 0.445730 0.887078 +vt 0.444812 0.886739 +vt 0.491850 0.916922 +vt 0.490015 0.916922 +vt 0.490365 0.916374 +vt 0.491283 0.916035 +vt 0.492417 0.916035 +vt 0.493335 0.916374 +vt 0.493685 0.916922 +vt 0.493335 0.917470 +vt 0.492417 0.917809 +vt 0.491283 0.917809 +vt 0.490365 0.917470 +vt 0.617730 0.917135 +vt 0.615894 0.917135 +vt 0.616245 0.916587 +vt 0.617163 0.916249 +vt 0.618297 0.916249 +vt 0.619215 0.916587 +vt 0.619565 0.917135 +vt 0.619215 0.917683 +vt 0.618297 0.918022 +vt 0.617163 0.918022 +vt 0.616245 0.917683 +vt 0.671183 0.869910 +vt 0.669348 0.869910 +vt 0.669699 0.869362 +vt 0.670616 0.869023 +vt 0.671751 0.869023 +vt 0.672668 0.869362 +vt 0.673019 0.869910 +vt 0.672668 0.870458 +vt 0.671751 0.870797 +vt 0.670616 0.870797 +vt 0.669699 0.870458 +vt 0.618459 0.818382 +vt 0.616624 0.818382 +vt 0.616974 0.817834 +vt 0.617892 0.817495 +vt 0.619026 0.817495 +vt 0.619944 0.817834 +vt 0.620295 0.818382 +vt 0.619944 0.818930 +vt 0.619026 0.819268 +vt 0.617892 0.819268 +vt 0.616974 0.818930 +vt 0.491507 0.818829 +vt 0.489671 0.818829 +vt 0.490022 0.818281 +vt 0.490939 0.817942 +vt 0.492074 0.817942 +vt 0.492991 0.818281 +vt 0.493342 0.818829 +vt 0.492991 0.819377 +vt 0.492074 0.819716 +vt 0.490939 0.819716 +vt 0.490022 0.819377 +vt 0.444936 0.848547 +vt 0.443100 0.848547 +vt 0.443451 0.847999 +vt 0.444368 0.847660 +vt 0.445503 0.847660 +vt 0.446420 0.847999 +vt 0.446771 0.848547 +vt 0.446420 0.849095 +vt 0.445503 0.849434 +vt 0.444368 0.849434 +vt 0.443451 0.849095 +vt 0.442763 0.848471 +vt 0.443113 0.849019 +vt 0.443113 0.847923 +vt 0.444031 0.847584 +vt 0.445165 0.847584 +vt 0.446083 0.847923 +vt 0.446433 0.848471 +vt 0.446083 0.849019 +vt 0.445165 0.849358 +vt 0.444031 0.849358 +vt 0.489700 0.818862 +vt 0.490051 0.819410 +vt 0.490051 0.818314 +vt 0.490969 0.817975 +vt 0.492103 0.817975 +vt 0.493021 0.818314 +vt 0.493371 0.818862 +vt 0.493021 0.819410 +vt 0.492103 0.819749 +vt 0.490969 0.819749 +vt 0.616990 0.818270 +vt 0.617341 0.818818 +vt 0.617341 0.817721 +vt 0.618259 0.817383 +vt 0.618258 0.817383 +vt 0.619393 0.817383 +vt 0.620310 0.817721 +vt 0.620661 0.818270 +vt 0.620310 0.818818 +vt 0.619393 0.819156 +vt 0.618259 0.819156 +vt 0.618258 0.819156 +vt 0.669347 0.869983 +vt 0.669697 0.870531 +vt 0.669697 0.869435 +vt 0.670615 0.869096 +vt 0.671749 0.869096 +vt 0.672667 0.869435 +vt 0.673017 0.869983 +vt 0.672667 0.870531 +vt 0.671749 0.870869 +vt 0.670615 0.870869 +vt 0.615990 0.917094 +vt 0.616340 0.917642 +vt 0.616340 0.916546 +vt 0.617258 0.916207 +vt 0.618392 0.916207 +vt 0.619310 0.916546 +vt 0.619661 0.917094 +vt 0.619310 0.917642 +vt 0.618392 0.917981 +vt 0.617258 0.917981 +vt 0.444416 0.886186 +vt 0.444766 0.886734 +vt 0.444766 0.885638 +vt 0.445684 0.885299 +vt 0.446818 0.885299 +vt 0.447736 0.885638 +vt 0.448087 0.886186 +vt 0.447736 0.886734 +vt 0.446818 0.887072 +vt 0.445684 0.887072 +vt 0.359533 0.849612 +vt 0.366249 0.847294 +vt 0.366249 0.849612 +vt 0.359533 0.847294 +vt 0.370560 0.847294 +vt 0.370560 0.849612 +vt 0.378251 0.847294 +vt 0.378251 0.849612 +vt 0.385911 0.847294 +vt 0.385911 0.849612 +vt 0.393530 0.847294 +vt 0.393530 0.849611 +vt 0.401099 0.847294 +vt 0.401099 0.849612 +vt 0.401099 0.849611 +vt 0.408606 0.847294 +vt 0.408606 0.849611 +vt 0.416042 0.847294 +vt 0.416042 0.849611 +vt 0.423397 0.847294 +vt 0.423397 0.849611 +vt 0.430660 0.847294 +vt 0.430660 0.849611 +vt 0.437821 0.847294 +vt 0.437821 0.849611 +vt 0.443333 0.847322 +vt 0.445978 0.849626 +vt 0.448217 0.842657 +vt 0.452118 0.843790 +vt 0.454154 0.837542 +vt 0.457910 0.838799 +vt 0.460737 0.832646 +vt 0.464309 0.834040 +vt 0.468029 0.828021 +vt 0.471372 0.829560 +vt 0.476094 0.823718 +vt 0.479157 0.825406 +vt 0.484993 0.819788 +vt 0.487721 0.821624 +vt 0.507441 0.815354 +vt 0.505521 0.813261 +vt 0.517258 0.810768 +vt 0.518728 0.812957 +vt 0.530047 0.808858 +vt 0.531058 0.811115 +vt 0.543939 0.807579 +vt 0.544500 0.809877 +vt 0.559110 0.806978 +vt 0.558996 0.809294 +vt 0.576057 0.808148 +vt 0.575194 0.810422 +vt 0.591873 0.810289 +vt 0.590474 0.812490 +vt 0.606572 0.813340 +vt 0.604648 0.815431 +vt 0.620061 0.817235 +vt 0.617637 0.819182 +vt 0.632249 0.821911 +vt 0.629361 0.823680 +vt 0.643043 0.827300 +vt 0.639738 0.828861 +vt 0.652353 0.833338 +vt 0.648686 0.834664 +vt 0.660089 0.839957 +vt 0.656123 0.841027 +vt 0.666163 0.847090 +vt 0.661965 0.847888 +vt 0.670486 0.854672 +vt 0.666126 0.855186 +vt 0.672972 0.862634 +vt 0.668522 0.862860 +vt 0.673528 0.870967 +vt 0.669070 0.870791 +vt 0.670893 0.878444 +vt 0.666539 0.877918 +vt 0.666949 0.885603 +vt 0.662716 0.884856 +vt 0.661691 0.892439 +vt 0.657630 0.891470 +vt 0.655129 0.898881 +vt 0.651296 0.897688 +vt 0.647271 0.904858 +vt 0.643729 0.903444 +vt 0.638126 0.910296 +vt 0.634942 0.908669 +vt 0.638126 0.910295 +vt 0.627708 0.915120 +vt 0.624948 0.913297 +vt 0.616030 0.919257 +vt 0.613755 0.917262 +vt 0.603112 0.922632 +vt 0.601368 0.920498 +vt 0.588975 0.925171 +vt 0.587790 0.922937 +vt 0.573642 0.926804 +vt 0.573022 0.924510 +vt 0.557156 0.927461 +vt 0.557044 0.925145 +vt 0.542846 0.927262 +vt 0.543240 0.924954 +vt 0.529182 0.926203 +vt 0.530109 0.923937 +vt 0.516255 0.924367 +vt 0.517688 0.922172 +vt 0.504137 0.921835 +vt 0.506040 0.919739 +vt 0.492894 0.918690 +vt 0.495229 0.916715 +vt 0.482593 0.915015 +vt 0.485320 0.913179 +vt 0.473299 0.910890 +vt 0.476381 0.909211 +vt 0.465077 0.906396 +vt 0.468477 0.904891 +vt 0.457992 0.901612 +vt 0.461678 0.900300 +vt 0.452110 0.896617 +vt 0.456048 0.895521 +vt 0.447497 0.891488 +vt 0.451653 0.890635 +vt 0.444709 0.887298 +vt 0.447821 0.884817 +vt 0.439444 0.887286 +vt 0.439529 0.884870 +vt 0.432377 0.887286 +vt 0.432430 0.884868 +vt 0.425142 0.887286 +vt 0.425168 0.884867 +vt 0.417757 0.887286 +vt 0.417760 0.884867 +vt 0.410239 0.887286 +vt 0.410222 0.884867 +vt 0.402604 0.887286 +vt 0.402570 0.884868 +vt 0.394868 0.887286 +vt 0.394821 0.884869 +vt 0.387049 0.887286 +vt 0.386991 0.884870 +vt 0.379163 0.887287 +vt 0.379096 0.884872 +vt 0.371225 0.887287 +vt 0.371153 0.884874 +vt 0.366653 0.887287 +vt 0.366578 0.884876 +vt 0.359619 0.887365 +vt 0.359644 0.884909 +vt 0.359644 0.885267 +vt 0.494783 0.816285 +vt 0.497128 0.818258 +vt 0.673853 0.870864 +vt 0.668734 0.862126 +vt 0.673280 0.861868 +vt 0.669564 0.870864 +vt 0.665845 0.853747 +vt 0.670280 0.853172 +vt 0.660869 0.845797 +vt 0.665109 0.844913 +vt 0.653918 0.838372 +vt 0.657880 0.837193 +vt 0.645105 0.831572 +vt 0.648708 0.830117 +vt 0.634542 0.825493 +vt 0.637708 0.823789 +vt 0.622340 0.820235 +vt 0.624997 0.818312 +vt 0.608608 0.815894 +vt 0.610693 0.813791 +vt 0.593451 0.812569 +vt 0.594917 0.810331 +vt 0.593450 0.812569 +vt 0.594916 0.810331 +vt 0.576972 0.810358 +vt 0.577792 0.808034 +vt 0.559343 0.809363 +vt 0.559374 0.807001 +vt 0.543507 0.810005 +vt 0.542925 0.807663 +vt 0.529005 0.811374 +vt 0.527943 0.809078 +vt 0.515833 0.813421 +vt 0.514271 0.811204 +vt 0.503902 0.816100 +vt 0.501842 0.813996 +vn 0.499993 0.000000 0.866030 +vn 0.499993 0.000000 -0.866030 +vn -0.000112 1.000000 0.000154 +vn -0.000000 1.000000 0.000073 +vn 0.000026 1.000000 0.000036 +vn 0.000000 1.000000 0.000117 +vn -0.000009 1.000000 0.000000 +vn 0.000000 -1.000000 0.000014 +vn 0.000015 0.000000 -1.000000 +vn -0.000015 -1.000000 0.000000 +vn -0.000008 0.000015 -1.000000 +vn -0.000008 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000014 +vn -0.000008 1.000000 0.000000 +vn 0.000008 -1.000000 0.000028 +vn -0.000017 0.000000 1.000000 +vn -0.000008 -1.000000 0.000014 +vn 0.000000 -1.000000 0.000028 +vn 0.000000 -0.000029 1.000000 +vn 0.000017 0.000000 1.000000 +vn -0.000017 -0.000029 1.000000 +vn -0.009955 -0.000000 -0.999950 +vn 0.003604 -0.000000 0.999994 +vn 0.882877 0.000000 -0.469604 +vn -0.881930 0.000000 0.471381 +vn 0.000003 1.000000 0.000005 +vn 0.861407 0.000000 -0.507915 +vn -0.000006 -1.000000 -0.000009 +vn -0.000006 -1.000000 -0.000010 +vn -0.861423 0.000000 0.507889 +vn -0.861423 0.000000 0.507888 +vn -0.000003 1.000000 -0.000004 +vn -0.000003 1.000000 -0.000005 +vn 0.825715 0.000000 -0.564088 +vn -0.000003 -1.000000 -0.000004 +vn -0.000003 -1.000000 -0.000005 +vn -0.825727 0.000000 0.564070 +vn 0.780481 0.000000 -0.625180 +vn -0.780499 -0.000009 0.625157 +vn -0.780497 0.000000 0.625159 +vn 0.000004 1.000000 0.000004 +vn 0.724257 0.000000 -0.689530 +vn -0.724276 -0.000020 0.689510 +vn -0.724273 -0.000010 0.689513 +vn 0.656066 0.000000 -0.754704 +vn -0.000009 -1.000000 0.000011 +vn -0.000004 -1.000000 -0.000004 +vn -0.656081 0.000000 0.754690 +vn -0.656087 -0.000022 0.754685 +vn 0.575840 0.000000 -0.817562 +vn -0.575853 0.000000 0.817553 +vn 0.484814 0.000000 -0.874618 +vn -0.000009 -1.000000 -0.000004 +vn -0.000009 -1.000000 -0.000006 +vn -0.484808 0.000000 0.874621 +vn 0.385642 -0.000013 -0.922648 +vn 0.385638 0.000000 -0.922650 +vn -0.385633 0.000000 0.922652 +vn 0.282089 0.000000 -0.959388 +vn 0.282093 -0.000014 -0.959387 +vn -0.282065 0.000000 0.959395 +vn 0.178377 0.000000 -0.983962 +vn -0.178346 0.000000 0.983968 +vn -0.000004 1.000000 -0.000001 +vn 0.077732 0.000000 -0.996974 +vn -0.078959 0.000000 0.996878 +vn -0.134708 -0.000029 -0.990885 +vn -0.134716 0.000000 -0.990884 +vn 0.135762 -0.000000 0.990741 +vn -0.257477 -0.000000 -0.966285 +vn -0.257469 -0.000028 -0.966286 +vn -0.000004 -1.000000 0.000001 +vn 0.257454 -0.000000 0.966291 +vn -0.378174 -0.000000 -0.925735 +vn 0.378157 -0.000000 0.925741 +vn -0.000004 1.000000 0.000002 +vn -0.494185 0.000013 -0.869357 +vn -0.494182 0.000000 -0.869359 +vn 0.494166 -0.000000 0.869368 +vn -0.602613 -0.000000 -0.798034 +vn -0.602616 0.000012 -0.798032 +vn 0.000008 -1.000000 0.000011 +vn 0.602604 -0.000000 0.798041 +vn 0.000007 1.000000 0.000013 +vn -0.700951 -0.000000 -0.713209 +vn -0.000003 -1.000000 0.000003 +vn 0.000010 -1.000000 0.000010 +vn 0.700950 -0.000000 0.713211 +vn -0.787203 -0.000000 -0.616695 +vn -0.000011 -1.000000 -0.000009 +vn 0.000003 -1.000000 -0.000003 +vn 0.787198 -0.000000 0.616700 +vn -0.859838 -0.000000 -0.510566 +vn 0.000002 -1.000000 -0.000004 +vn -0.000012 -1.000000 -0.000007 +vn 0.859842 -0.000000 0.510560 +vn -0.000005 1.000000 0.000012 +vn -0.000006 1.000000 0.000011 +vn -0.917826 -0.000000 -0.396984 +vn -0.000001 -1.000000 0.000004 +vn -0.000002 -1.000000 0.000004 +vn 0.917825 -0.000006 0.396985 +vn 0.917826 0.000000 0.396983 +vn 0.000001 1.000000 -0.000004 +vn -0.960510 -0.000000 -0.278244 +vn 0.960512 -0.000000 0.278240 +vn 0.960511 -0.000004 0.278241 +vn -0.987656 -0.000000 -0.156637 +vn 0.000000 -1.000000 -0.000004 +vn 0.000001 -1.000000 -0.000004 +vn 0.987659 -0.000002 0.156622 +vn 0.987659 0.000000 0.156622 +vn -0.999425 -0.000000 -0.033908 +vn 0.999384 -0.000000 0.035099 +vn 0.999384 -0.000001 0.035099 +vn -0.984347 0.000000 0.176242 +vn 0.000001 -1.000000 0.000004 +vn 0.984111 0.000000 -0.177552 +vn 0.000001 1.000000 0.000004 +vn -0.962987 -0.000004 0.269548 +vn -0.962987 0.000000 0.269549 +vn 0.962992 0.000000 -0.269530 +vn 0.962992 0.000000 -0.269529 +vn 0.000002 1.000000 0.000004 +vn -0.931426 0.000000 0.363930 +vn -0.931427 -0.000005 0.363929 +vn 0.000011 -1.000000 -0.000009 +vn 0.931432 0.000000 -0.363916 +vn -0.888126 0.000000 0.459600 +vn 0.000002 -1.000000 0.000004 +vn 0.000013 -1.000000 -0.000006 +vn 0.888138 0.000000 -0.459577 +vn -0.831546 0.000000 0.555455 +vn -0.000002 -1.000000 -0.000004 +vn 0.831559 0.000000 -0.555437 +vn -0.000011 1.000000 0.000009 +vn 0.000003 1.000000 0.000004 +vn -0.760305 -0.000009 0.649566 +vn -0.760303 0.000000 0.649569 +vn 0.760320 0.000000 -0.649549 +vn 0.000007 1.000000 0.000006 +vn -0.000006 1.000000 0.000014 +vn -0.673641 0.000000 0.739059 +vn -0.673644 -0.000011 0.739056 +vn 0.673659 0.000000 -0.739042 +vn -0.571973 0.000000 0.820273 +vn 0.571975 0.000000 -0.820271 +vn -0.000004 1.000000 -0.000002 +vn -0.457296 0.000000 0.889315 +vn 0.000004 -1.000000 0.000002 +vn 0.457292 0.000013 -0.889317 +vn 0.457295 0.000000 -0.889315 +vn -0.333367 0.000000 0.942797 +vn 0.000001 -1.000000 -0.000014 +vn 0.333346 0.000000 -0.942805 +vn 0.333342 0.000014 -0.942806 +vn -0.205193 0.000000 0.978721 +vn -0.000001 -1.000000 -0.000015 +vn 0.205158 0.000000 -0.978729 +vn -0.078217 0.000000 0.996936 +vn 0.000004 -1.000000 0.000000 +vn 0.000004 -1.000000 0.000001 +vn 0.078047 0.000000 -0.996950 +vn 0.000010 1.000000 0.000013 +vn 0.000013 1.000000 0.000000 +vn 0.027429 0.000000 0.999624 +vn -0.027256 0.000000 -0.999628 +vn 0.000002 1.000000 0.000014 +vn 0.150769 0.000000 0.988569 +vn -0.150761 0.000000 -0.988570 +vn 0.000004 1.000000 0.000013 +vn 0.269301 -0.000014 0.963056 +vn 0.269305 -0.000000 0.963055 +vn -0.000012 -1.000000 -0.000025 +vn 0.000005 -1.000000 -0.000001 +vn -0.269304 0.000000 -0.963055 +vn 0.000001 1.000000 0.000014 +vn 0.380309 -0.000014 0.924860 +vn 0.380309 -0.000014 0.924859 +vn -0.000011 -1.000000 -0.000026 +vn -0.380309 0.000000 -0.924859 +vn 0.482284 0.000000 0.876015 +vn 0.482280 -0.000013 0.876017 +vn 0.000013 -1.000000 -0.000008 +vn -0.000009 -1.000000 -0.000027 +vn -0.482284 0.000000 -0.876015 +vn 0.574746 -0.000017 0.818332 +vn 0.574750 -0.000000 0.818329 +vn -0.574747 0.000000 -0.818331 +vn 0.657946 0.000000 0.753065 +vn 0.657941 -0.000019 0.753069 +vn -0.657942 0.000000 -0.753069 +vn 0.732499 0.000000 0.680768 +vn -0.732494 0.000022 -0.680773 +vn -0.732489 -0.000000 -0.680779 +vn 0.799079 0.000000 0.601226 +vn -0.799060 0.000000 -0.601251 +vn -0.799066 0.000024 -0.601243 +vn 0.858127 0.000000 0.513438 +vn 0.000003 -1.000000 -0.000005 +vn -0.858112 0.000000 -0.513462 +vn 0.000002 1.000000 -0.000006 +vn 0.000003 1.000000 -0.000005 +vn 0.909535 0.000000 0.415628 +vn 0.000002 -1.000000 -0.000005 +vn -0.909514 0.000000 -0.415674 +vn 0.947354 0.000000 0.320187 +vn -0.948327 0.000000 -0.317294 +vn 0.000008 1.000000 -0.000000 +vn 0.000000 1.000000 0.000013 +vn 0.004284 0.000000 0.999991 +vn 0.012499 0.000000 -0.999922 +vn 0.000018 0.000000 1.000000 +vn -0.000464 0.000000 -1.000000 +vn 0.000009 0.000000 1.000000 +vn -0.000262 0.000000 -1.000000 +vn -0.000103 0.000000 -1.000000 +vn 0.000059 0.000000 -1.000000 +vn 0.000157 0.000015 -1.000000 +vn 0.000166 0.000000 -1.000000 +vn -0.000008 0.000000 1.000000 +vn 0.000008 -1.000000 0.000000 +vn 0.000278 0.000000 -1.000000 +vn 0.000270 0.000015 -1.000000 +vn 0.000356 0.000000 -1.000000 +vn -0.000024 0.000000 1.000000 +vn 0.000417 0.000000 -1.000000 +vn -0.000016 0.000000 1.000000 +vn 0.000487 -0.000029 -1.000000 +vn 0.000471 0.000000 -1.000000 +vn -0.000028 0.000000 1.000000 +vn 0.000845 0.000000 -1.000000 +vn 0.000873 -0.000029 -1.000000 +vn 0.000009 1.000000 0.000000 +vn -0.021946 0.000000 0.999759 +vn 0.108923 -0.159078 -0.981239 +vn 0.009539 0.000000 -0.999954 +vn 0.999982 -0.000973 -0.006000 +vn 0.999987 0.000000 -0.005127 +vn -0.000027 -1.000000 -0.000050 +vn -0.000008 -1.000000 0.000018 +vn -0.000009 -1.000000 0.000012 +vn 0.000014 -1.000000 -0.000001 +vn 0.000003 -1.000000 -0.000006 +vn 0.000088 -1.000000 0.000029 +vn 0.000023 -1.000000 -0.000007 +vn -0.000065 -1.000000 -0.000005 +vn -0.000020 -1.000000 0.000037 +vn -0.000328 -1.000000 0.000452 +vn 0.000005 -1.000000 0.000004 +vn 0.000000 -1.000000 0.000030 +vn 0.000005 -1.000000 0.000007 +vn 0.000007 -1.000000 0.000002 +vn 0.000019 -1.000000 -0.000020 +vn 0.000009 -1.000000 -0.000003 +vn 0.000000 -1.000000 0.000005 +vn -0.000011 -1.000000 -0.000003 +vn -0.000012 -1.000000 -0.000004 +vn -0.000005 -1.000000 0.000002 +vn -0.000000 -1.000000 0.000007 +vn -0.000003 -1.000000 0.000004 +vn -0.000024 -1.000000 0.000044 +vn -0.000091 -1.000000 0.000125 +vn -0.000000 -1.000000 0.000017 +vn 0.000422 -1.000000 -0.000078 +vn 0.000017 -1.000000 -0.000003 +vn -0.000055 -1.000000 0.000041 +vn -0.000003 -1.000000 0.000014 +vn -0.000015 -1.000000 -0.000005 +vn 0.000033 1.000000 -0.000056 +vn 0.000098 1.000000 -0.000135 +vn 0.000000 1.000000 -0.000019 +vn -0.000015 1.000000 -0.000009 +vn -0.000009 1.000000 -0.000012 +vn -0.000015 1.000000 -0.000005 +vn -0.000042 1.000000 0.000050 +vn -0.000019 1.000000 0.000006 +vn -0.000002 1.000000 0.000009 +vn -0.000024 1.000000 -0.000062 +vn 0.000005 1.000000 0.000014 +vn 0.000040 1.000000 0.000059 +vn -0.000020 1.000000 -0.000027 +vn 0.000034 1.000000 0.000070 +vn -0.000021 1.000000 0.000003 +vn -0.000012 1.000000 0.000004 +vn 0.000000 1.000000 0.000005 +vn -0.000001 1.000000 0.000005 +vn 0.000018 1.000000 0.000004 +vn 0.000014 1.000000 0.000004 +vn -0.000018 1.000000 0.000035 +vn 0.000000 1.000000 0.000011 +vn 0.000004 1.000000 0.000006 +vn 0.000007 1.000000 0.000002 +vn 0.000019 1.000000 -0.000020 +vn 0.000009 1.000000 -0.000003 +vn 0.000007 1.000000 -0.000002 +vn 0.000006 1.000000 -0.000005 +vn 0.000006 1.000000 -0.000008 +vn -0.000013 1.000000 -0.000028 +vn 0.000000 1.000000 -0.000011 +vn 0.000018 1.000000 0.000016 +vn 0.000057 1.000000 0.000078 +vn 0.000010 1.000000 0.000003 +vn -0.000123 0.999999 0.001098 +vn -0.000044 0.999999 0.001121 +vn 0.998839 0.000000 0.048163 +vn 0.998839 -0.000058 0.048178 +vn -0.000154 -0.999999 0.001127 +vn 0.000059 -0.999999 0.001082 +vn -0.999476 0.000000 -0.032357 +vn -0.999477 0.000062 -0.032341 +vn 0.000007 1.000000 -0.000028 +vn 0.000003 1.000000 -0.000030 +vn 0.985000 0.000000 0.172554 +vn 0.000010 -1.000000 -0.000040 +vn -0.000024 -1.000000 -0.000037 +vn -0.984984 0.000000 -0.172647 +vn 0.000021 1.000000 -0.000052 +vn 0.000014 1.000000 -0.000056 +vn 0.952980 0.000000 0.303035 +vn 0.952979 -0.000000 0.303035 +vn 0.000013 -1.000000 -0.000032 +vn 0.000008 -1.000000 -0.000032 +vn -0.952949 -0.000009 -0.303130 +vn -0.952950 -0.000000 -0.303128 +vn 0.000019 1.000000 -0.000033 +vn 0.000015 1.000000 -0.000036 +vn 0.903061 0.000000 0.429513 +vn 0.000028 -1.000000 -0.000047 +vn 0.000020 -1.000000 -0.000049 +vn -0.903023 0.000000 -0.429592 +vn -0.903022 -0.000012 -0.429594 +vn 0.000021 1.000000 -0.000027 +vn 0.000018 1.000000 -0.000031 +vn 0.835242 0.000008 0.549883 +vn 0.835241 -0.000000 0.549885 +vn 0.000032 -1.000000 -0.000040 +vn 0.000025 -1.000000 -0.000043 +vn -0.835187 0.000000 -0.549966 +vn 0.000020 1.000000 -0.000038 +vn 0.000025 1.000000 -0.000031 +vn 0.749655 0.000000 0.661829 +vn 0.749657 0.000010 0.661827 +vn 0.000050 -1.000000 -0.000009 +vn 0.000019 -1.000000 -0.000024 +vn -0.749594 0.000000 -0.661898 +vn 0.000037 1.000000 -0.000026 +vn 0.000029 1.000000 -0.000046 +vn 0.646881 0.000000 0.762591 +vn 0.000026 -1.000000 -0.000018 +vn 0.000045 -1.000000 -0.000005 +vn -0.646807 -0.000022 -0.762654 +vn -0.646811 -0.000000 -0.762650 +vn 0.000038 1.000000 -0.000004 +vn 0.000032 1.000000 -0.000023 +vn 0.528281 0.000000 0.849069 +vn 0.000038 -1.000000 -0.000035 +vn 0.000043 -1.000000 -0.000030 +vn -0.528213 0.000000 -0.849112 +vn -0.528207 -0.000025 -0.849115 +vn 0.000042 1.000000 -0.000014 +vn 0.000043 1.000000 -0.000006 +vn 0.396437 0.000011 0.918062 +vn 0.396435 -0.000000 0.918063 +vn 0.000044 -1.000000 -0.000015 +vn 0.000031 -1.000000 -0.000031 +vn -0.396374 0.000013 -0.918089 +vn -0.396371 -0.000000 -0.918091 +vn 0.000035 1.000000 0.000021 +vn 0.000035 1.000000 -0.000012 +vn 0.255326 -0.000014 0.966855 +vn 0.255331 0.000007 0.966854 +vn 0.000022 -1.000000 -0.000032 +vn 0.000034 -1.000000 -0.000011 +vn -0.255270 0.000014 -0.966870 +vn 0.000043 1.000000 0.000013 +vn 0.000042 1.000000 0.000020 +vn 0.110429 0.000000 0.993884 +vn 0.110425 -0.000014 0.993884 +vn 0.000043 -1.000000 -0.000000 +vn 0.000031 -1.000000 -0.000033 +vn -0.109712 0.000000 -0.993963 +vn -0.109716 0.000014 -0.993963 +vn 0.000034 1.000000 0.000004 +vn 0.000031 1.000000 0.000013 +vn -0.079488 -0.000012 0.996836 +vn -0.079485 0.000000 0.996836 +vn 0.000032 -1.000000 0.000004 +vn 0.000031 -1.000000 -0.000000 +vn 0.078902 -0.000002 -0.996882 +vn 0.078901 0.000000 -0.996882 +vn 0.000032 1.000000 0.000008 +vn -0.182677 0.000009 0.983173 +vn -0.182682 -0.000009 0.983172 +vn 0.000050 -1.000000 0.000012 +vn 0.000050 -1.000000 0.000006 +vn 0.182802 0.000005 -0.983150 +vn 0.182805 -0.000005 -0.983149 +vn 0.000050 1.000000 0.000018 +vn 0.000054 1.000000 0.000013 +vn -0.292580 0.000000 0.956241 +vn -0.292578 0.000005 0.956242 +vn 0.000022 -1.000000 0.000008 +vn 0.000022 -1.000000 0.000005 +vn 0.292689 0.000028 -0.956208 +vn 0.292695 0.000008 -0.956206 +vn 0.000021 1.000000 0.000010 +vn 0.000023 1.000000 0.000008 +vn -0.404252 0.000000 0.914648 +vn 0.000048 -1.000000 0.000024 +vn 0.000048 -1.000000 0.000017 +vn 0.404360 0.000000 -0.914600 +vn 0.404352 0.000026 -0.914603 +vn 0.000045 1.000000 0.000029 +vn 0.000050 1.000000 0.000025 +vn -0.512137 0.000000 0.858903 +vn -0.512137 0.000000 0.858904 +vn 0.000025 -1.000000 0.000017 +vn 0.000026 -1.000000 0.000013 +vn 0.512223 0.000000 -0.858852 +vn 0.000030 1.000000 0.000025 +vn 0.000035 1.000000 0.000023 +vn -0.610889 0.000000 0.791716 +vn 0.000032 -1.000000 0.000026 +vn 0.000033 -1.000000 0.000022 +vn 0.610951 0.000000 -0.791669 +vn 0.000025 1.000000 0.000046 +vn 0.000044 1.000000 0.000037 +vn -0.696601 0.000000 0.717459 +vn 0.000038 -1.000000 0.000020 +vn 0.000035 -1.000000 0.000029 +vn 0.696642 0.000010 -0.717419 +vn 0.696645 0.000000 -0.717416 +vn 0.000025 1.000000 0.000031 +vn 0.000015 1.000000 0.000035 +vn -0.767534 0.000000 0.641009 +vn 0.000038 -1.000000 0.000049 +vn 0.000049 -1.000000 0.000031 +vn 0.767578 0.000000 -0.640956 +vn 0.767576 0.000009 -0.640958 +vn 0.000022 1.000000 0.000033 +vn 0.000025 1.000000 0.000032 +vn -0.823955 -0.000016 0.566656 +vn -0.823951 0.000000 0.566660 +vn 0.000017 -1.000000 0.000026 +vn 0.000018 -1.000000 0.000023 +vn 0.823983 -0.000008 -0.566614 +vn 0.823982 0.000000 -0.566616 +vn 0.000023 1.000000 0.000043 +vn 0.000027 1.000000 0.000042 +vn -0.867426 0.000000 0.497567 +vn -0.867428 -0.000014 0.497562 +vn 0.000022 -1.000000 0.000040 +vn 0.000024 -1.000000 0.000037 +vn 0.867458 0.000000 -0.497511 +vn 0.867460 -0.000012 -0.497507 +vn 0.000045 1.000000 0.000026 +vn 0.000017 1.000000 0.000031 +vn -0.893838 0.000000 0.448391 +vn 0.000041 -1.000000 0.000024 +vn 0.000023 -1.000000 0.000043 +vn 0.900615 0.000000 -0.434617 +vn 0.000068 1.000000 -0.000027 +vn 0.000034 1.000000 0.000020 +vn -0.010732 0.000042 0.999942 +vn -0.010752 0.000000 0.999942 +vn 0.000055 -1.000000 0.000027 +vn 0.000058 -1.000000 0.000034 +vn -0.000049 -0.000029 -1.000000 +vn -0.000068 -0.000000 -1.000000 +vn 0.000060 1.000000 -0.000041 +vn 0.000052 1.000000 -0.000027 +vn 0.000179 0.000058 1.000000 +vn 0.000172 0.000044 1.000000 +vn 0.000037 -1.000000 0.000055 +vn 0.000022 -1.000000 0.000027 +vn -0.000067 -0.000058 -1.000000 +vn -0.000082 -0.000029 -1.000000 +vn 0.000049 1.000000 -0.000027 +vn 0.000056 1.000000 -0.000041 +vn 0.000211 0.000029 1.000000 +vn 0.000225 0.000058 1.000000 +vn 0.000035 -1.000000 0.000027 +vn 0.000049 -1.000000 0.000055 +vn -0.000127 -0.000029 -1.000000 +vn -0.000113 -0.000058 -1.000000 +vn 0.000054 1.000000 -0.000027 +vn 0.000262 0.000044 1.000000 +vn 0.000255 0.000029 1.000000 +vn 0.000040 -1.000000 0.000027 +vn -0.000161 -0.000044 -1.000000 +vn -0.000168 -0.000029 -1.000000 +vn 0.000019 1.000000 -0.000027 +vn 0.000258 0.000044 1.000000 +vn 0.000058 -1.000000 0.000027 +vn -0.000180 -0.000029 -1.000000 +vn -0.000174 -0.000044 -1.000000 +vn 0.000056 1.000000 -0.000068 +vn 0.000037 1.000000 -0.000027 +vn 0.000268 0.000044 1.000000 +vn 0.000037 -1.000000 0.000041 +vn 0.000031 -1.000000 0.000027 +vn -0.000181 -0.000029 -1.000000 +vn 0.000024 1.000000 -0.000041 +vn 0.000036 1.000000 -0.000068 +vn 0.000243 0.000044 1.000000 +vn 0.000042 -1.000000 0.000027 +vn 0.000049 -1.000000 0.000041 +vn -0.000170 -0.000029 -1.000000 +vn -0.000164 -0.000044 -1.000000 +vn 0.000042 1.000000 -0.000027 +vn 0.000048 1.000000 -0.000041 +vn 0.000220 0.000029 1.000000 +vn 0.000226 0.000044 1.000000 +vn 0.000042 -1.000000 0.000041 +vn 0.000036 -1.000000 0.000027 +vn -0.000137 -0.000044 -1.000000 +vn -0.000143 -0.000029 -1.000000 +vn 0.000035 1.000000 -0.000041 +vn 0.000029 1.000000 -0.000027 +vn 0.000193 0.000044 1.000000 +vn 0.000188 0.000029 1.000000 +vn 0.000035 -1.000000 0.000055 +vn 0.000029 -1.000000 0.000041 +vn -0.000105 -0.000044 -1.000000 +vn 0.000035 1.000000 -0.000027 +vn 0.000041 1.000000 -0.000041 +vn 0.000128 0.000044 1.000000 +vn 0.000035 -1.000000 0.000041 +vn 0.000041 -1.000000 0.000055 +vn -0.000052 -0.000058 -1.000000 +vn -0.000058 -0.000044 -1.000000 +vn 0.000046 1.000000 -0.000041 +vn 0.000040 1.000000 -0.000027 +vn 0.000081 0.000058 1.000000 +vn 0.000075 0.000044 1.000000 +vn 0.000006 -0.000044 -1.000000 +vn 0.000012 -0.000058 -1.000000 +vn 0.000022 1.000000 -0.000025 +vn 0.000037 1.000000 -0.000041 +vn -0.064093 0.000038 0.997944 +vn -0.064081 0.000052 0.997945 +vn 0.000056 -1.000000 0.000035 +vn 0.000060 -1.000000 0.000041 +vn 0.064965 -0.000052 -0.997888 +vn 0.064953 -0.000036 -0.997888 +vn 0.000034 1.000000 -0.000004 +vn 0.000055 1.000000 -0.000020 +vn -0.223532 0.000045 0.974697 +vn -0.223551 0.000022 0.974692 +vn 0.000029 -1.000000 0.000038 +vn 0.000026 -1.000000 0.000031 +vn 0.223731 -0.000052 -0.974651 +vn 0.223721 -0.000037 -0.974653 +vn 0.000066 1.000000 -0.000014 +vn 0.000042 1.000000 -0.000001 +vn -0.379455 0.000048 0.925210 +vn -0.379483 0.000013 0.925199 +vn 0.000013 -1.000000 0.000037 +vn 0.000011 -1.000000 0.000032 +vn 0.379600 -0.000033 -0.925151 +vn 0.379594 -0.000024 -0.925153 +vn 0.000068 1.000000 -0.000003 +vn 0.000081 1.000000 -0.000006 +vn -0.524009 0.000044 0.851713 +vn -0.524021 0.000029 0.851705 +vn 0.000003 -1.000000 0.000019 +vn 0.000006 -1.000000 0.000034 +vn 0.524089 -0.000027 -0.851663 +vn 0.524081 -0.000014 -0.851668 +vn 0.000044 1.000000 -0.000034 +vn 0.000027 1.000000 -0.000032 +vn -0.651117 0.000037 0.758977 +vn -0.651123 0.000028 0.758972 +vn 0.000058 -1.000000 0.000094 +vn 0.000057 -1.000000 0.000057 +vn 0.651138 -0.000039 -0.758959 +vn 0.651119 -0.000007 -0.758976 +vn 0.000038 1.000000 0.000027 +vn 0.000108 1.000000 0.000027 +vn -0.757590 0.000041 0.652731 +vn -0.757602 0.000020 0.652716 +vn -0.000005 -1.000000 0.000039 +vn -0.000005 -1.000000 0.000034 +vn 0.757600 -0.000028 -0.652719 +vn 0.757597 -0.000022 -0.652722 +vn 0.000046 1.000000 0.000024 +vn -0.842878 0.000030 0.538105 +vn -0.842873 0.000040 0.538113 +vn -0.000005 -1.000000 0.000048 +vn -0.000003 -1.000000 0.000042 +vn 0.842876 -0.000035 -0.538107 +vn 0.842871 -0.000023 -0.538115 +vn 0.000046 1.000000 0.000040 +vn 0.000056 1.000000 0.000043 +vn -0.907955 0.000048 0.419068 +vn -0.907966 0.000016 0.419044 +vn -0.000016 -1.000000 0.000035 +vn -0.000014 -1.000000 0.000031 +vn 0.907973 -0.000065 -0.419029 +vn 0.907958 -0.000019 -0.419061 +vn 0.000045 1.000000 0.000009 +vn 0.000031 1.000000 0.000003 +vn -0.954535 0.000044 0.298098 +vn -0.000038 -1.000000 0.000076 +vn -0.000014 -1.000000 0.000039 +vn 0.954538 -0.000040 -0.298091 +vn 0.954543 -0.000064 -0.298073 +vn 0.000048 1.000000 0.000046 +vn 0.000056 1.000000 0.000050 +vn -0.984248 0.000047 0.176795 +vn -0.984249 0.000040 0.176790 +vn -0.000048 -1.000000 0.000069 +vn -0.000042 -1.000000 0.000062 +vn 0.984256 -0.000049 -0.176751 +vn 0.984254 -0.000037 -0.176759 +vn 0.000056 1.000000 0.000028 +vn 0.000045 1.000000 0.000021 +vn -0.998430 0.000064 0.056018 +vn -0.998431 0.000035 0.055995 +vn -0.000042 -1.000000 0.000025 +vn -0.000052 -1.000000 0.000034 +vn 0.998434 -0.000067 -0.055935 +vn 0.998433 -0.000036 -0.055958 +vn 0.000037 1.000000 0.000035 +vn 0.000056 1.000000 0.000052 +vn -0.997384 0.000057 -0.072281 +vn -0.997384 0.000051 -0.072286 +vn -0.000047 -1.000000 0.000032 +vn -0.000042 -1.000000 0.000029 +vn 0.997364 -0.000088 0.072564 +vn 0.997365 -0.000054 0.072540 +vn 0.000072 1.000000 0.000050 +vn 0.000041 1.000000 0.000009 +vn -0.976534 0.000057 -0.215362 +vn -0.976534 0.000054 -0.215365 +vn -0.000105 -1.000000 0.000055 +vn -0.000046 -1.000000 0.000024 +vn 0.976482 -0.000089 0.215600 +vn 0.976483 -0.000079 0.215593 +vn 0.000063 1.000000 0.000062 +vn 0.000066 1.000000 0.000069 +vn -0.932900 0.000086 -0.360136 +vn -0.932889 0.000054 -0.360163 +vn -0.000070 -1.000000 0.000016 +vn -0.000096 -1.000000 0.000026 +vn 0.932823 -0.000091 0.360335 +vn 0.932825 -0.000085 0.360331 +vn 0.000039 1.000000 0.000064 +vn 0.000048 1.000000 0.000092 +vn -0.866173 0.000115 -0.499745 +vn -0.866150 0.000068 -0.499784 +vn -0.000059 -1.000000 -0.000006 +vn 0.866101 -0.000107 0.499869 +vn 0.866114 -0.000075 0.499846 +vn 0.000011 1.000000 0.000088 +vn 0.000013 1.000000 0.000102 +vn -0.778611 0.000107 -0.627507 +vn -0.778605 0.000098 -0.627514 +vn -0.000073 -1.000000 -0.000004 +vn 0.778570 -0.000098 0.627557 +vn 0.778575 -0.000089 0.627551 +vn 0.000027 1.000000 0.000066 +vn 0.000027 1.000000 0.000072 +vn -0.674390 0.000101 -0.738376 +vn -0.674382 0.000090 -0.738383 +vn -0.000123 -1.000000 -0.000029 +vn -0.000055 -1.000000 -0.000023 +vn 0.674380 -0.000081 0.738385 +vn 0.674381 -0.000079 0.738384 +vn 0.000006 1.000000 0.000075 +vn 0.000005 1.000000 0.000083 +vn -0.558684 0.000091 -0.829381 +vn -0.558678 0.000083 -0.829385 +vn -0.000079 -1.000000 -0.000067 +vn -0.000074 -1.000000 -0.000065 +vn 0.558671 -0.000107 0.829389 +vn 0.558700 -0.000067 0.829370 +vn -0.000015 1.000000 0.000109 +vn -0.000006 1.000000 0.000082 +vn -0.436323 0.000091 -0.899790 +vn -0.436313 0.000079 -0.899795 +vn -0.000101 -1.000000 -0.000049 +vn -0.000106 -1.000000 -0.000051 +vn 0.436330 -0.000117 0.899787 +vn 0.436349 -0.000091 0.899777 +vn -0.000014 1.000000 0.000074 +vn -0.000033 1.000000 0.000116 +vn -0.311365 0.000129 -0.950290 +vn -0.311329 0.000087 -0.950302 +vn -0.000048 -1.000000 -0.000059 +vn -0.000059 -1.000000 -0.000065 +vn 0.311349 -0.000129 0.950296 +vn 0.311360 -0.000115 0.950292 +vn -0.000022 1.000000 0.000072 +vn -0.000025 1.000000 0.000077 +vn -0.186650 0.000108 -0.982426 +vn -0.186665 0.000125 -0.982424 +vn -0.000055 -1.000000 -0.000076 +vn -0.000036 -1.000000 -0.000062 +vn 0.186642 -0.000123 0.982428 +vn 0.186639 -0.000125 0.982428 +vn -0.000030 1.000000 0.000069 +vn -0.000033 1.000000 0.000073 +vn -0.064068 0.000108 -0.997946 +vn -0.064057 0.000095 -0.997946 +vn -0.000044 -1.000000 -0.000096 +vn -0.000028 -1.000000 -0.000080 +vn 0.064372 -0.000124 0.997926 +vn 0.064383 -0.000109 0.997925 +vn -0.000050 1.000000 0.000096 +vn -0.000033 1.000000 0.000069 +vn -0.004377 0.000118 -0.999990 +vn -0.004369 0.000102 -0.999990 +vn -0.000067 -1.000000 -0.000082 +vn -0.000075 -1.000000 -0.000095 +vn 0.004280 -0.000132 0.999991 +vn 0.004288 -0.000117 0.999991 +vn -0.000064 1.000000 0.000124 +vn 0.004643 0.000116 -0.999989 +vn 0.004643 0.000115 -0.999989 +vn -0.000028 -1.000000 -0.000096 +vn -0.000021 -1.000000 -0.000082 +vn -0.004712 -0.000101 0.999989 +vn -0.004726 -0.000130 0.999989 +vn -0.000045 1.000000 0.000110 +vn -0.000051 1.000000 0.000124 +vn 0.001038 0.000014 -0.999999 +vn 0.000993 0.000116 -1.000000 +vn -0.000051 -1.000000 -0.000110 +vn -0.001437 -0.000014 0.999999 +vn -0.001475 -0.000102 0.999999 +vn -0.000041 1.000000 0.000082 +vn -0.000053 1.000000 0.000110 +vn 0.000047 0.000015 -1.000000 +vn -0.000024 -1.000000 -0.000083 +vn -0.000035 -1.000000 -0.000110 +vn -0.000047 -0.000015 1.000000 +vn -0.000017 1.000000 0.000082 +vn 0.000096 0.000015 -1.000000 +vn -0.000051 -1.000000 -0.000124 +vn -0.000034 -1.000000 -0.000083 +vn -0.000091 -0.000015 1.000000 +vn -0.000039 1.000000 0.000110 +vn -0.000028 1.000000 0.000082 +vn 0.000134 0.000029 -1.000000 +vn 0.000139 0.000015 -1.000000 +vn -0.000056 -1.000000 -0.000124 +vn -0.000128 -0.000029 1.000000 +vn -0.000122 -0.000015 1.000000 +vn -0.000039 1.000000 0.000096 +vn 0.000168 0.000015 -1.000000 +vn 0.000163 0.000029 -1.000000 +vn -0.000034 -1.000000 -0.000110 +vn -0.000146 -0.000015 1.000000 +vn -0.000151 -0.000029 1.000000 +vn -0.000046 1.000000 0.000110 +vn -0.000041 1.000000 0.000096 +vn 0.000185 -0.000000 -1.000000 +vn 0.000180 0.000015 -1.000000 +vn -0.000023 -1.000000 -0.000110 +vn -0.000168 -0.000015 1.000000 +vn -0.000031 1.000000 0.000082 +vn -0.000043 1.000000 0.000110 +vn 0.000197 -0.000000 -1.000000 +vn -0.000043 -1.000000 -0.000083 +vn -0.000055 -1.000000 -0.000110 +vn -0.000191 -0.000029 1.000000 +vn -0.000185 -0.000015 1.000000 +vn -0.000054 1.000000 0.000123 +vn -0.000034 1.000000 0.000082 +vn 0.000210 -0.000000 -1.000000 +vn -0.000054 -1.000000 -0.000124 +vn -0.000190 -0.000015 1.000000 +vn -0.000196 -0.000029 1.000000 +vn -0.000051 1.000000 0.000131 +vn -0.000047 1.000000 0.000123 +vn 0.001568 0.000044 -0.999999 +vn 0.001588 -0.000000 -0.999999 +vn -0.000082 -1.000000 -0.000124 +vn 0.001683 -0.000044 0.999999 +vn 0.001703 -0.000015 0.999999 +vn 0.000074 1.000000 0.000077 +vn 0.000055 1.000000 0.000057 +vn -0.940268 0.000107 -0.340437 +vn -0.940270 0.000127 -0.340430 +vn 0.936282 -0.000107 0.351250 +vn 0.936278 -0.000127 0.351259 +vn 0.000047 1.000000 0.000086 +vn 0.000063 1.000000 0.000103 +vn -0.902052 0.000122 -0.431628 +vn -0.902048 0.000101 -0.431635 +vn -0.000087 -1.000000 -0.000017 +vn -0.000113 -1.000000 -0.000019 +vn 0.902035 -0.000122 0.431662 +vn 0.902039 -0.000101 0.431655 +vn 0.000061 1.000000 0.000081 +vn 0.000055 1.000000 0.000072 +vn -0.843826 0.000101 -0.536616 +vn -0.843828 0.000111 -0.536613 +vn -0.000094 -1.000000 0.000009 +vn -0.000101 -1.000000 0.000007 +vn 0.843805 -0.000101 0.536649 +vn 0.843804 -0.000111 0.536652 +vn 0.000028 1.000000 0.000092 +vn 0.000039 1.000000 0.000110 +vn -0.776810 0.000111 -0.629735 +vn -0.776806 0.000093 -0.629740 +vn -0.000104 -1.000000 -0.000032 +vn -0.000072 -1.000000 -0.000020 +vn 0.776771 -0.000111 0.629784 +vn 0.776775 -0.000093 0.629779 +vn 0.000048 1.000000 0.000123 +vn 0.000031 1.000000 0.000088 +vn -0.700953 0.000105 -0.713207 +vn -0.000095 -1.000000 -0.000047 +vn -0.000091 -1.000000 -0.000045 +vn 0.700905 -0.000104 0.713255 +vn 0.700905 -0.000105 0.713255 +vn 0.000037 1.000000 0.000092 +vn 0.000047 1.000000 0.000124 +vn -0.615567 0.000120 -0.788084 +vn -0.615561 0.000097 -0.788089 +vn -0.000121 -1.000000 -0.000069 +vn -0.000092 -1.000000 -0.000050 +vn 0.615503 -0.000108 0.788135 +vn 0.615505 -0.000101 0.788133 +vn 0.000021 1.000000 0.000113 +vn 0.000019 1.000000 0.000104 +vn -0.519720 0.000106 -0.854337 +vn -0.519721 0.000112 -0.854336 +vn -0.000080 -1.000000 -0.000068 +vn -0.000099 -1.000000 -0.000084 +vn 0.519654 -0.000093 0.854377 +vn 0.519652 -0.000100 0.854378 +vn 0.000001 1.000000 0.000088 +vn 0.000004 1.000000 0.000122 +vn -0.412756 0.000102 -0.910842 +vn -0.412756 0.000105 -0.910841 +vn -0.000069 -1.000000 -0.000063 +vn -0.000076 -1.000000 -0.000070 +vn 0.412685 -0.000102 0.910874 +vn 0.412688 -0.000091 0.910872 +vn -0.000005 1.000000 0.000100 +vn -0.000005 1.000000 0.000090 +vn -0.294798 0.000102 -0.955560 +vn -0.294795 0.000091 -0.955561 +vn -0.000072 -1.000000 -0.000097 +vn -0.000053 -1.000000 -0.000069 +vn 0.294720 -0.000102 0.955584 +vn 0.294723 -0.000091 0.955583 +vn -0.000030 1.000000 0.000100 +vn -0.000031 1.000000 0.000106 +vn -0.167222 0.000091 -0.985919 +vn -0.167224 0.000097 -0.985919 +vn -0.000062 -1.000000 -0.000105 +vn -0.000060 -1.000000 -0.000100 +vn 0.167159 -0.000121 0.985930 +vn 0.167166 -0.000097 0.985929 +vn -0.000026 1.000000 0.000082 +vn -0.032971 0.000134 -0.999456 +vn -0.032958 0.000089 -0.999457 +vn -0.000037 -1.000000 -0.000097 +vn -0.000040 -1.000000 -0.000107 +vn 0.033077 -0.000119 0.999453 +vn 0.033077 -0.000118 0.999453 +vn -0.000044 1.000000 0.000105 +vn -0.000036 1.000000 0.000082 +vn 0.085701 0.000114 -0.996321 +vn 0.085698 0.000126 -0.996321 +vn -0.000025 -1.000000 -0.000088 +vn -0.000027 -1.000000 -0.000097 +vn -0.085945 -0.000129 0.996300 +vn -0.085941 -0.000111 0.996300 +vn -0.000054 1.000000 0.000085 +vn -0.000063 1.000000 0.000102 +vn 0.225992 0.000143 -0.974129 +vn 0.226001 0.000107 -0.974127 +vn -0.000025 -1.000000 -0.000094 +vn -0.226093 -0.000128 0.974106 +vn -0.226091 -0.000122 0.974106 +vn -0.000086 1.000000 0.000083 +vn -0.000081 1.000000 0.000077 +vn 0.363481 0.000120 -0.931602 +vn 0.363477 0.000136 -0.931603 +vn 0.000016 -1.000000 -0.000160 +vn 0.000008 -1.000000 -0.000084 +vn -0.363566 -0.000123 0.931568 +vn -0.000085 1.000000 0.000078 +vn -0.000088 1.000000 0.000081 +vn 0.493033 0.000127 -0.870011 +vn 0.493035 0.000116 -0.870009 +vn 0.000020 -1.000000 -0.000102 +vn 0.000032 -1.000000 -0.000153 +vn -0.493102 -0.000115 0.869971 +vn -0.000102 1.000000 0.000060 +vn -0.000107 1.000000 0.000063 +vn 0.610588 0.000111 -0.791948 +vn 0.610587 0.000116 -0.791949 +vn 0.000045 -1.000000 -0.000127 +vn 0.000032 -1.000000 -0.000095 +vn -0.610646 -0.000122 0.791904 +vn -0.610642 -0.000104 0.791907 +vn -0.000127 1.000000 0.000068 +vn -0.000106 1.000000 0.000056 +vn 0.713615 0.000134 -0.700538 +vn 0.713621 0.000103 -0.700531 +vn 0.000053 -1.000000 -0.000129 +vn 0.000050 -1.000000 -0.000123 +vn -0.713672 -0.000124 0.700481 +vn -0.713670 -0.000113 0.700482 +vn -0.000122 1.000000 0.000045 +vn -0.000141 1.000000 0.000052 +vn 0.800963 0.000103 -0.598713 +vn 0.800959 0.000126 -0.598719 +vn 0.000060 -1.000000 -0.000087 +vn 0.000074 -1.000000 -0.000106 +vn -0.801009 -0.000144 0.598653 +vn -0.801003 -0.000111 0.598660 +vn -0.000127 1.000000 0.000029 +vn -0.000132 1.000000 0.000030 +vn 0.872370 0.000101 -0.488847 +vn 0.872370 0.000097 -0.488846 +vn 0.000075 -1.000000 -0.000101 +vn 0.000061 -1.000000 -0.000086 +vn -0.872406 -0.000144 0.488783 +vn -0.872405 -0.000137 0.488784 +vn -0.000088 1.000000 0.000004 +vn -0.000137 1.000000 0.000009 +vn 0.927993 0.000112 -0.372598 +vn 0.927995 0.000093 -0.372593 +vn 0.000076 -1.000000 -0.000081 +vn 0.000083 -1.000000 -0.000086 +vn -0.928022 -0.000136 0.372526 +vn -0.928021 -0.000134 0.372527 +vn -0.000121 1.000000 -0.000028 +vn -0.000099 1.000000 -0.000027 +vn 0.967977 0.000136 -0.251039 +vn 0.967979 0.000107 -0.251031 +vn 0.000115 -1.000000 -0.000069 +vn 0.000086 -1.000000 -0.000052 +vn -0.967999 -0.000136 0.250952 +vn -0.967999 -0.000132 0.250953 +vn -0.000044 0.999999 0.001272 +vn 0.000145 0.999999 0.001302 +vn 0.991190 -0.000058 -0.132450 +vn 0.991183 0.000130 -0.132504 +vn 0.000059 -0.999999 0.001326 +vn 0.000368 -0.999999 0.001195 +vn -0.993048 0.000061 0.117710 +vn -0.993054 -0.000129 0.117658 +vn -0.000014 -1.000000 -0.000033 +vn -0.000090 -1.000000 -0.000206 +vn -0.000040 -1.000000 0.000038 +vn -0.000048 -1.000000 -0.000029 +vn 0.000000 -1.000000 -0.000078 +vn -0.000060 -1.000000 0.000012 +vn -0.000094 -1.000000 0.000019 +vn -0.000123 -1.000000 0.000005 +vn -0.000014 -1.000000 0.000054 +vn -0.000193 -1.000000 0.000004 +vn -0.000185 -1.000000 -0.000007 +vn -0.000076 -1.000000 0.000009 +vn -0.000279 -1.000000 0.000568 +vn -0.000047 -1.000000 -0.000064 +vn -0.000204 -1.000000 -0.000066 +vn 0.499976 0.000000 0.866039 +vn 0.499991 0.000000 -0.866031 +vn 0.499979 0.000000 0.866038 +vn 0.499979 0.000000 -0.866038 +vn 0.499993 0.000000 0.866029 +vn 0.499978 0.000000 -0.866038 +vn 0.499978 0.000000 0.866038 +s off +f 4592/2176/2742 4596/2176/2742 4595/2176/2742 +f 4592/2176/2742 4593/2176/2742 4596/2176/2742 +f 4593/2176/7 4597/2176/7 4596/2176/7 +f 4593/2176/7 4594/2176/7 4597/2176/7 +f 4594/2176/2743 4595/2176/2743 4597/2176/2743 +f 4594/2176/2743 4592/2176/2743 4595/2176/2743 +f 4598/2177/331 4599/2178/331 4600/2179/331 +f 4598/2177/331 5520/2180/331 4601/2178/331 +f 5521/2180/331 4601/2178/331 4602/2178/331 +f 5522/2180/331 5523/2180/331 4603/2178/331 +f 5524/2178/331 5525/2181/331 4604/2182/331 +f 5526/2178/331 5527/2179/331 4605/2181/331 +f 5528/2179/331 4605/2181/331 4606/2181/331 +f 5529/2179/331 5530/2179/331 4607/2181/331 +f 4618/2183/331 4619/2184/331 4620/2185/331 +f 4618/2183/331 5531/2186/331 4621/2184/331 +f 5532/2186/331 4621/2184/331 4622/2184/331 +f 5533/2186/331 5534/2186/331 4623/2184/331 +f 5535/2186/331 5536/2185/331 4624/2184/331 +f 5537/2186/331 5538/2183/331 4625/2185/331 +f 4618/2183/331 4625/2185/331 4626/2185/331 +f 4618/2183/331 5539/2183/331 4627/2185/331 +f 4638/2187/331 4639/2188/331 4640/2189/331 +f 4638/2187/331 5540/2190/331 4641/2188/331 +f 5541/2190/331 4641/2188/331 4642/2188/331 +f 5542/2190/331 5543/2190/331 4643/2188/331 +f 5544/2188/331 5545/2191/331 4644/2192/331 +f 5546/2188/331 5547/2189/331 4645/2191/331 +f 5548/2189/331 5549/2191/331 4646/2191/331 +f 5550/2189/331 5551/2189/331 4647/2191/331 +f 4658/2193/331 4659/2194/331 4660/2195/331 +f 4658/2193/331 5552/2196/331 4661/2194/331 +f 5553/2196/331 4661/2194/331 4662/2194/331 +f 5554/2196/331 5555/2196/331 4663/2194/331 +f 5556/2196/331 5557/2195/331 4664/2194/331 +f 5558/2196/331 5559/2193/331 4665/2195/331 +f 4658/2193/331 4665/2195/331 4666/2195/331 +f 4658/2193/331 5560/2193/331 4667/2195/331 +f 4678/2197/331 4679/2198/331 4680/2199/331 +f 4678/2197/331 5561/2200/331 4681/2198/331 +f 5562/2200/331 4681/2198/331 4682/2198/331 +f 5563/2200/331 5564/2200/331 4683/2198/331 +f 5565/2198/331 5566/2201/331 4684/2202/331 +f 5567/2198/331 5568/2199/331 4685/2201/331 +f 5569/2199/331 4685/2201/331 4686/2201/331 +f 5570/2199/331 5571/2199/331 4687/2201/331 +f 4698/2203/2744 4699/2204/2744 4700/2205/2744 +f 4698/2203/2745 5572/2206/2745 4701/2204/2745 +f 5573/2206/2746 4701/2204/2746 4702/2204/2746 +f 5574/2206/2747 5575/2206/2747 4703/2204/2747 +f 5576/2206/331 5577/2205/331 4704/2204/331 +f 5578/2206/331 5579/2203/331 4705/2205/331 +f 4698/2203/331 4705/2205/331 4706/2205/331 +f 4698/2203/331 5580/2203/331 4707/2205/331 +f 4788/2207/2748 4789/2200/2748 4790/2200/2748 +f 4788/2207/2748 4791/2207/2748 4789/2200/2748 +f 5581/2200/105 4792/2199/105 5582/2198/105 +f 5583/2200/105 4793/2197/105 4792/2199/105 +f 4793/2197/2749 4794/2199/2749 4792/2199/2749 +f 4793/2197/2749 4795/2197/2749 4794/2199/2749 +f 4795/2197/21 5584/2198/21 4794/2199/21 +f 4795/2197/21 5585/2200/21 5586/2198/21 +f 4790/2200/331 4796/2198/331 4797/2198/331 +f 4790/2200/331 4789/2200/331 4796/2198/331 +f 5587/2198/2750 4798/2201/2750 5588/2202/2750 +f 5589/2198/2750 4792/2199/2750 4798/2201/2750 +f 4792/2199/2751 4799/2201/2751 4798/2201/2751 +f 4792/2199/2749 4794/2199/2749 4799/2201/2749 +f 4794/2199/21 5590/2202/21 4799/2201/21 +f 4794/2199/21 5591/2198/21 5592/2202/21 +f 4797/2198/331 4800/2202/331 4801/2202/331 +f 4797/2198/331 4796/2198/331 4800/2202/331 +f 5593/2202/2752 4802/2208/2752 5594/2209/2752 +f 5595/2202/105 4798/2201/105 4802/2208/105 +f 4798/2201/2749 4803/2208/2749 4802/2208/2749 +f 4798/2201/2753 4799/2201/2753 4803/2208/2753 +f 4799/2201/21 5596/2209/21 4803/2208/21 +f 4799/2201/21 5597/2202/21 5598/2209/21 +f 4801/2202/331 4804/2209/331 4805/2209/331 +f 4801/2202/331 4800/2202/331 4804/2209/331 +f 5599/2209/105 4806/2206/105 5600/2203/105 +f 5601/2209/2752 4802/2208/2752 4806/2206/2752 +f 4802/2208/2749 4807/2206/2749 4806/2206/2749 +f 4802/2208/2749 4803/2208/2749 4807/2206/2749 +f 4803/2208/21 5602/2203/21 4807/2206/21 +f 4803/2208/21 5603/2209/21 5604/2203/21 +f 4805/2209/2754 4808/2203/2754 4809/2203/2754 +f 4805/2209/2755 4804/2209/2755 4808/2203/2755 +f 5605/2203/105 4810/2204/105 5606/2205/105 +f 5607/2203/105 4806/2206/105 4810/2204/105 +f 4806/2206/2756 4811/2204/2756 4810/2204/2756 +f 4806/2206/2749 4807/2206/2749 4811/2204/2749 +f 4807/2206/2757 5608/2205/2757 4811/2204/2757 +f 4807/2206/2757 5609/2203/2757 5610/2205/2757 +f 4809/2203/2755 4812/2205/2755 4813/2205/2755 +f 4809/2203/2754 4808/2203/2754 4812/2205/2754 +f 5611/2205/105 4814/2210/105 5612/2211/105 +f 5613/2205/105 4810/2204/105 4814/2210/105 +f 4810/2204/2758 4815/2210/2758 4814/2210/2758 +f 4810/2204/2759 4811/2204/2759 4815/2210/2759 +f 4811/2204/2760 5614/2211/2760 4815/2210/2760 +f 4811/2204/2761 5615/2205/2761 5616/2211/2761 +f 4813/2205/331 4816/2211/331 4817/2211/331 +f 4813/2205/331 4812/2205/331 4816/2211/331 +f 5617/2211/105 4818/2212/105 5618/2213/105 +f 5619/2211/105 4814/2210/105 4818/2212/105 +f 4814/2210/2749 4819/2212/2749 4818/2212/2749 +f 4814/2210/2749 4815/2210/2749 4819/2212/2749 +f 4815/2210/21 5620/2213/21 4819/2212/21 +f 4815/2210/2762 5621/2211/2762 5622/2213/2762 +f 4817/2211/331 4820/2213/331 4821/2213/331 +f 4817/2211/331 4816/2211/331 4820/2213/331 +f 5623/2213/105 4822/2214/105 5624/2215/105 +f 5625/2213/105 4818/2212/105 4822/2214/105 +f 4818/2212/2749 4823/2214/2749 4822/2214/2749 +f 4818/2212/2749 4819/2212/2749 4823/2214/2749 +f 4819/2212/21 4821/2213/21 5626/2216/21 +f 5627/2213/21 5628/2215/21 5629/2216/21 +f 4821/2213/2748 4824/2213/2748 4825/2215/2748 +f 5630/2217/2748 5631/2218/2748 5632/2219/2748 +f 5633/2220/105 4826/2218/105 5634/2217/105 +f 5635/2221/105 5636/2220/105 5637/2222/105 +f 5638/2218/2749 4827/2221/2749 5639/2223/2749 +f 5640/2217/2749 5641/2221/2749 5642/2222/2749 +f 5643/2221/21 5644/2219/21 5645/2223/21 +f 5646/2222/21 5647/2220/21 5648/2222/21 +f 5649/2222/331 4828/2220/331 4829/2217/331 +f 5650/2218/331 5651/2223/331 5652/2219/331 +f 5653/2219/105 4830/2223/105 5654/2223/105 +f 5655/2224/105 5656/2225/105 5657/2226/105 +f 5658/2224/2749 4831/2218/2749 5659/2225/2749 +f 5660/2218/2749 5661/2225/2749 5662/2225/2749 +f 5663/2218/21 5664/2219/21 5665/2225/21 +f 5666/2219/21 5667/2226/21 5668/2225/21 +f 5669/2219/331 4832/2217/331 4833/2226/331 +f 5670/2217/331 5671/2226/331 5672/2226/331 +f 5673/2217/105 4834/2224/105 5674/2226/105 +f 5675/2226/105 5676/2227/105 5677/2228/105 +f 5678/2226/2749 4835/2225/2749 5679/2227/2749 +f 5680/2225/2749 5681/2227/2749 5682/2227/2749 +f 5683/2225/21 5684/2225/21 5685/2227/21 +f 5686/2225/21 5687/2228/21 5688/2227/21 +f 5689/2225/331 5690/2226/331 4836/2228/331 +f 5691/2226/2763 4837/2228/2763 4836/2228/2763 +f 5692/2226/2763 5693/2226/2763 4837/2228/2763 +f 5694/2228/2764 4838/2229/2764 4839/2230/2764 +f 5695/2228/2764 5696/2227/2764 4838/2229/2764 +f 5697/2227/2765 4840/2229/2765 4841/2229/2765 +f 5698/2227/2765 5699/2227/2765 4840/2229/2765 +f 5700/2227/3 4842/2230/3 4840/2229/3 +f 5701/2227/2766 4843/2228/2766 4842/2230/2766 +f 5702/2228/2766 5703/2230/2766 5704/2230/2766 +f 4843/2228/2767 4844/2228/2767 4845/2230/2767 +f 5705/2230/2767 5706/2231/2767 5707/2232/2767 +f 5708/2230/2768 4846/2229/2768 5709/2231/2768 +f 4841/2229/2768 5710/2231/2768 5711/2231/2768 +f 4840/2229/2769 4847/2229/2769 5712/2231/2769 +f 4840/2229/2770 5713/2232/2770 5714/2231/2770 +f 5715/2229/2771 4845/2230/2771 5716/2232/2771 +f 4842/2230/2772 5717/2232/2772 5718/2232/2772 +f 4845/2230/2773 4848/2230/2773 4849/2232/2773 +f 5719/2232/2774 5720/2233/2774 5721/2234/2774 +f 5722/2232/2775 4850/2231/2775 5723/2233/2775 +f 5724/2231/2775 5725/2233/2775 5726/2233/2775 +f 5727/2231/2776 4851/2231/2776 5728/2233/2776 +f 5729/2231/2777 5730/2234/2777 5731/2233/2777 +f 5732/2231/2778 5733/2232/2778 5734/2234/2778 +f 5735/2232/2778 5736/2234/2778 5737/2234/2778 +f 5738/2232/331 4852/2232/331 4853/2234/331 +f 5739/2234/331 5740/2235/331 5741/2236/331 +f 5742/2234/2779 4854/2233/2779 5743/2235/2779 +f 5744/2233/2779 5745/2235/2779 5746/2235/2779 +f 5747/2233/3 4855/2233/3 5748/2235/3 +f 5749/2233/3 5750/2236/3 5751/2235/3 +f 5752/2233/2780 4853/2234/2780 5753/2236/2780 +f 5754/2234/2781 5755/2236/2781 5756/2236/2781 +f 4853/2234/2782 4856/2234/2782 4857/2236/2782 +f 5757/2236/2782 5758/2237/2782 5759/2238/2782 +f 5760/2236/2783 4858/2235/2783 5761/2237/2783 +f 5762/2235/2783 5763/2237/2783 5764/2237/2783 +f 5765/2235/3 4859/2235/3 5766/2237/3 +f 5767/2235/3 5768/2238/3 5769/2237/3 +f 5770/2235/2784 4857/2236/2784 5771/2238/2784 +f 5772/2236/2785 5773/2238/2785 5774/2238/2785 +f 4857/2236/331 4860/2236/331 4861/2238/331 +f 5775/2238/331 5776/2239/331 5777/2240/331 +f 5778/2238/2786 4862/2237/2786 5779/2239/2786 +f 5780/2237/2786 5781/2239/2786 5782/2239/2786 +f 5783/2237/2787 4863/2237/2787 5784/2239/2787 +f 5785/2237/2788 5786/2240/2788 5787/2239/2788 +f 5788/2237/2789 4861/2238/2789 5789/2240/2789 +f 5790/2238/2790 5791/2240/2790 5792/2240/2790 +f 5793/2238/2791 4864/2238/2791 4865/2240/2791 +f 5794/2240/2791 5795/2241/2791 5796/2242/2791 +f 5797/2240/2792 4866/2239/2792 4867/2241/2792 +f 5798/2239/2792 5799/2241/2792 5800/2241/2792 +f 4866/2239/331 4868/2239/331 4869/2241/331 +f 4866/2239/331 5801/2242/331 5802/2241/331 +f 5803/2239/2793 4870/2240/2793 5804/2242/2793 +f 4865/2240/2793 5805/2242/2793 5806/2242/2793 +f 5807/2240/2794 4871/2240/2794 5808/2242/2794 +f 5809/2242/2795 5810/2243/2795 5811/2244/2795 +f 5812/2242/2796 4869/2241/2796 5813/2243/2796 +f 4867/2241/2796 5814/2243/2796 5815/2243/2796 +f 4869/2241/331 4872/2241/331 4873/2243/331 +f 4869/2241/331 5816/2244/331 5817/2243/331 +f 5818/2241/2797 4874/2242/2797 5819/2244/2797 +f 5820/2242/2798 5821/2244/2798 5822/2244/2798 +f 5823/2242/3 4875/2242/3 5824/2244/3 +f 5825/2244/3 5826/2245/3 5827/2246/3 +f 5828/2244/2799 4873/2243/2799 5829/2245/2799 +f 5830/2243/2799 5831/2245/2799 5832/2245/2799 +f 4873/2243/331 4876/2243/331 4877/2245/331 +f 4873/2243/331 5833/2246/331 5834/2245/331 +f 5835/2243/2800 4878/2244/2800 5836/2246/2800 +f 5837/2244/2801 5838/2246/2801 5839/2246/2801 +f 5840/2244/3 4879/2244/3 5841/2246/3 +f 5842/2246/3 5843/2247/3 5844/2248/3 +f 5845/2246/2802 4877/2245/2802 5846/2247/2802 +f 5847/2245/2802 5848/2247/2802 5849/2247/2802 +f 4877/2245/331 4880/2245/331 4881/2247/331 +f 4877/2245/331 5850/2248/331 5851/2247/331 +f 5852/2245/2803 4882/2246/2803 5853/2248/2803 +f 5854/2246/2803 5855/2248/2803 5856/2248/2803 +f 5857/2246/3 4883/2246/3 5858/2248/3 +f 5859/2248/3 5860/2249/3 5861/2250/3 +f 5862/2248/2804 4881/2247/2804 5863/2249/2804 +f 5864/2247/2804 5865/2249/2804 5866/2249/2804 +f 4881/2247/2217 4884/2247/2217 4885/2249/2217 +f 4881/2247/2805 5867/2250/2805 5868/2249/2805 +f 5869/2247/2806 4886/2248/2806 5870/2250/2806 +f 5871/2248/2806 5872/2250/2806 5873/2250/2806 +f 5874/2248/3 4887/2248/3 5875/2250/3 +f 5876/2250/3 5877/2251/3 5878/2252/3 +f 5879/2250/2807 4885/2249/2807 5880/2251/2807 +f 5881/2249/2807 5882/2251/2807 5883/2251/2807 +f 4885/2249/331 4888/2249/331 4889/2251/331 +f 4885/2249/331 5884/2252/331 5885/2251/331 +f 5886/2249/2808 4890/2250/2808 5887/2252/2808 +f 5888/2250/2809 5889/2252/2809 5890/2252/2809 +f 5891/2250/3 4891/2250/3 5892/2252/3 +f 5893/2252/3 5894/2253/3 5895/2254/3 +f 5896/2252/2810 4889/2251/2810 5897/2253/2810 +f 5898/2251/2810 5899/2253/2810 5900/2253/2810 +f 4889/2251/331 4892/2251/331 4893/2253/331 +f 4889/2251/331 5901/2254/331 5902/2253/331 +f 5903/2251/2811 4894/2252/2811 5904/2254/2811 +f 5905/2252/2812 5906/2254/2812 5907/2254/2812 +f 5908/2252/2813 4895/2252/2813 5909/2254/2813 +f 5910/2254/2813 5911/2255/2813 5912/2256/2813 +f 5913/2254/2814 4893/2253/2814 5914/2255/2814 +f 5915/2253/2814 5916/2255/2814 5917/2255/2814 +f 4893/2253/331 4896/2253/331 4897/2255/331 +f 4893/2253/331 5918/2256/331 5919/2255/331 +f 5920/2253/2815 4898/2254/2815 5921/2256/2815 +f 5922/2254/2815 5923/2256/2815 5924/2256/2815 +f 5925/2254/3 4899/2254/3 5926/2256/3 +f 5927/2256/3 5928/2257/3 5929/2258/3 +f 5930/2256/2816 4897/2255/2816 5931/2257/2816 +f 5932/2255/2816 5933/2257/2816 5934/2257/2816 +f 4897/2255/2817 5935/2255/2817 4900/2257/2817 +f 5936/2255/2818 4901/2258/2818 4900/2257/2818 +f 5937/2255/2819 5938/2256/2819 4901/2258/2819 +f 5939/2256/3 5940/2258/3 4902/2258/3 +f 5941/2256/2820 4903/2256/2820 4902/2258/2820 +f 5942/2258/2820 5943/2259/2820 5944/2260/2820 +f 5945/2258/2821 4904/2257/2821 4905/2259/2821 +f 4900/2257/2822 5946/2259/2822 5947/2259/2822 +f 5948/2257/2823 4906/2257/2823 5949/2259/2823 +f 5950/2257/2824 4907/2260/2824 5951/2259/2824 +f 5952/2257/2824 5953/2258/2824 4907/2260/2824 +f 5954/2258/331 4908/2260/331 4909/2260/331 +f 5955/2258/2825 5956/2258/2825 4908/2260/2825 +f 5957/2260/2826 4910/2261/2826 5958/2262/2826 +f 5959/2260/2826 5960/2259/2826 4910/2261/2826 +f 5961/2259/2827 4911/2261/2827 4910/2261/2827 +f 5962/2259/2828 5963/2259/2828 4911/2261/2828 +f 5964/2259/2829 5965/2262/2829 4911/2261/2829 +f 5966/2259/2829 4907/2260/2829 5967/2262/2829 +f 4909/2260/331 4912/2262/331 4913/2262/331 +f 4909/2260/331 4908/2260/331 4912/2262/331 +f 5968/2262/2830 4914/2263/2830 5969/2264/2830 +f 5970/2262/2830 4910/2261/2830 4914/2263/2830 +f 4910/2261/2831 4915/2263/2831 4914/2263/2831 +f 4910/2261/2832 4911/2261/2832 4915/2263/2832 +f 4911/2261/2833 5971/2264/2833 4915/2263/2833 +f 4911/2261/2833 5972/2262/2833 5973/2264/2833 +f 4913/2262/331 4916/2264/331 4917/2264/331 +f 4913/2262/331 4912/2262/331 4916/2264/331 +f 5974/2264/2834 4918/2265/2834 5975/2266/2834 +f 5976/2264/2834 4914/2263/2834 4918/2265/2834 +f 4914/2263/2835 4919/2265/2835 4918/2265/2835 +f 4914/2263/2836 4915/2263/2836 4919/2265/2836 +f 4915/2263/2837 5977/2266/2837 4919/2265/2837 +f 4915/2263/2837 5978/2264/2837 5979/2266/2837 +f 4917/2264/2838 4920/2266/2838 4921/2266/2838 +f 4917/2264/2839 4916/2264/2839 4920/2266/2839 +f 5980/2266/2840 4922/2267/2840 5981/2268/2840 +f 5982/2266/2840 4918/2265/2840 4922/2267/2840 +f 4918/2265/2841 4923/2267/2841 4922/2267/2841 +f 4918/2265/2842 4919/2265/2842 4923/2267/2842 +f 4919/2265/2843 5983/2268/2843 4923/2267/2843 +f 4919/2265/2844 5984/2266/2844 5985/2268/2844 +f 4921/2266/2845 4924/2268/2845 4925/2268/2845 +f 4921/2266/2845 4920/2266/2845 4924/2268/2845 +f 5986/2268/2846 4926/2214/2846 5987/2215/2846 +f 5988/2268/2846 4922/2267/2846 4926/2214/2846 +f 4922/2267/2841 4927/2267/2841 5989/2269/2841 +f 4922/2267/2841 5990/2216/2841 5991/2269/2841 +f 4923/2267/2847 4925/2268/2847 5992/2216/2847 +f 5993/2268/2848 5994/2268/2848 5995/2215/2848 +f 5996/2217/331 4928/2218/331 4929/2219/331 +f 5997/2224/331 5998/2218/331 5999/2217/331 +f 6000/2221/2849 4930/2224/2849 6001/2222/2849 +f 6002/2218/2849 6003/2221/2849 6004/2223/2849 +f 6005/2217/2850 4931/2221/2850 6006/2222/2850 +f 6007/2221/2851 6008/2219/2851 6009/2223/2851 +f 6010/2222/2852 6011/2224/2852 6012/2222/2852 +f 6013/2222/2853 6014/2224/2853 6015/2217/2853 +f 4928/2218/2854 4932/2223/2854 4933/2219/2854 +f 6016/2219/2854 6017/2223/2854 4932/2223/2854 +f 6018/2215/2855 4934/2176/2855 4935/2270/2855 +f 6019/2214/2856 6020/2271/2856 6021/2271/2856 +f 4934/2176/331 4936/2214/331 4937/2271/331 +f 6022/2272/331 6023/2216/331 6024/2270/331 +f 6025/2269/2857 4938/2272/2857 6026/2271/2857 +f 6027/2272/2857 6028/2216/2857 6029/2270/2857 +f 6030/2214/2858 4939/2272/2858 6031/2271/2858 +f 6032/2273/2859 6033/2274/2859 6034/2275/2859 +f 6035/2273/2859 6036/2276/2859 6037/2274/2859 +f 6038/2273/2860 4940/2277/2860 4941/2276/2860 +f 6039/2273/2860 6040/2278/2860 4940/2277/2860 +f 6041/2273/2861 4942/2279/2861 6042/2278/2861 +f 6043/2273/2862 6044/2280/2862 4942/2279/2862 +f 6045/2273/3 4943/2281/3 6046/2280/3 +f 6047/2273/3 6048/2282/3 4943/2281/3 +f 6049/2273/2863 6050/2283/2863 6051/2282/2863 +f 6052/2273/2864 6053/2275/2864 6054/2283/2864 +f 6055/2284/2865 4944/2285/2865 4945/2286/2865 +f 6056/2284/2860 6057/2286/2860 6058/2287/2860 +f 6059/2284/2866 4946/2287/2866 6060/2288/2866 +f 6061/2284/2867 6062/2288/2867 6063/2289/2867 +f 6064/2284/2868 4947/2289/2868 6065/2290/2868 +f 6066/2284/3 6067/2290/3 6068/2291/3 +f 6069/2284/2869 6070/2291/2869 6071/2292/2869 +f 6072/2284/2869 6073/2292/2869 6074/2293/2869 +f 6075/2284/331 4948/2293/331 4949/2294/331 +f 6076/2284/331 6077/2294/331 6078/2285/331 +f 6079/2285/2870 4950/2286/2870 6080/2285/2870 +f 6081/2286/2870 6082/2286/2870 6083/2285/2870 +f 6084/2286/2871 4951/2286/2871 6085/2287/2871 +f 6086/2287/2872 6087/2287/2872 4951/2286/2872 +f 6088/2287/2873 6089/2287/2873 6090/2288/2873 +f 6091/2288/2873 6092/2288/2873 6093/2287/2873 +f 6094/2288/331 4952/2288/331 4953/2289/331 +f 6095/2289/331 6096/2289/331 4952/2288/331 +f 6097/2289/2874 4954/2289/2874 6098/2290/2874 +f 6099/2289/2874 6100/2290/2874 6101/2290/2874 +f 6102/2290/2776 4955/2290/2776 6103/2291/2776 +f 6104/2291/2875 6105/2291/2875 4955/2290/2875 +f 6106/2291/2876 6107/2291/2876 6108/2292/2876 +f 6109/2292/2876 6110/2292/2876 6111/2291/2876 +f 6112/2292/2877 4956/2292/2877 4957/2293/2877 +f 6113/2293/2878 6114/2293/2878 4956/2292/2878 +f 6115/2293/2879 4958/2293/2879 6116/2294/2879 +f 6117/2294/2880 6118/2294/2880 4958/2293/2880 +f 6119/2294/3 4959/2294/3 6120/2285/3 +f 6121/2294/3 6122/2285/3 6123/2285/3 +f 6124/2295/2881 6125/2296/2881 6126/2297/2881 +f 6127/2295/2881 6128/2297/2881 6129/2298/2881 +f 6130/2295/2882 4960/2298/2882 4961/2299/2882 +f 6131/2295/2883 6132/2299/2883 6133/2300/2883 +f 6134/2295/2884 4962/2300/2884 6135/2301/2884 +f 6136/2295/2885 6137/2301/2885 6138/2302/2885 +f 6139/2295/3 4963/2302/3 6140/2303/3 +f 6141/2295/3 6142/2303/3 6143/2304/3 +f 6144/2295/2886 6145/2304/2886 6146/2305/2886 +f 6147/2295/2886 6148/2305/2886 6149/2296/2886 +f 6150/2296/2887 4964/2297/2887 4965/2296/2887 +f 6151/2297/2887 6152/2297/2887 6153/2296/2887 +f 6154/2297/2888 4966/2297/2888 4967/2298/2888 +f 6155/2298/2888 6156/2298/2888 4966/2297/2888 +f 6157/2298/2889 4968/2298/2889 4969/2299/2889 +f 6158/2299/2889 6159/2299/2889 4968/2298/2889 +f 6160/2299/2890 4970/2299/2890 6161/2300/2890 +f 6162/2300/2890 6163/2300/2890 4970/2299/2890 +f 6164/2300/2891 4971/2300/2891 6165/2301/2891 +f 6166/2301/2891 6167/2301/2891 4971/2300/2891 +f 6168/2301/2892 6169/2301/2892 6170/2302/2892 +f 6171/2302/2893 6172/2302/2893 6173/2301/2893 +f 6174/2302/331 4972/2302/331 4973/2303/331 +f 6175/2303/331 6176/2303/331 4972/2302/331 +f 6177/2303/2894 4974/2303/2894 6178/2304/2894 +f 6179/2304/2894 6180/2304/2894 6181/2305/2894 +f 6182/2303/2895 4975/2304/2895 6183/2304/2895 +f 6184/2304/3 6185/2305/3 6186/2305/3 +f 6187/2305/2896 6188/2305/2896 6189/2296/2896 +f 6190/2305/2897 6191/2296/2897 6192/2296/2897 +f 6193/2306/331 4976/2307/331 4977/2308/331 +f 6194/2306/331 6195/2308/331 6196/2309/331 +f 6197/2306/2898 4978/2309/2898 6198/2310/2898 +f 6199/2306/2898 6200/2310/2898 6201/2311/2898 +f 6202/2306/3 4979/2311/3 6203/2312/3 +f 6204/2306/2899 6205/2312/2899 6206/2313/2899 +f 6207/2306/2900 6208/2313/2900 6209/2314/2900 +f 6210/2306/2900 6211/2314/2900 6212/2315/2900 +f 6213/2306/331 4980/2315/331 4981/2316/331 +f 6214/2306/331 6215/2316/331 6216/2307/331 +f 4976/2307/2901 4982/2308/2901 6217/2307/2901 +f 6218/2308/2901 6219/2308/2901 6220/2307/2901 +f 6221/2308/2902 4983/2308/2902 6222/2309/2902 +f 4978/2309/2903 6223/2309/2903 4983/2308/2903 +f 6224/2309/2904 6225/2309/2904 6226/2310/2904 +f 6227/2310/2904 6228/2310/2904 6229/2309/2904 +f 6230/2310/2905 4984/2310/2905 4985/2311/2905 +f 6231/2311/2906 6232/2311/2906 4984/2310/2906 +f 6233/2311/2907 4986/2311/2907 6234/2312/2907 +f 6235/2312/2907 6236/2312/2907 4986/2311/2907 +f 6237/2312/3 4987/2312/3 6238/2313/3 +f 6239/2313/3 6240/2313/3 6241/2314/3 +f 6242/2312/2908 6243/2313/2908 6244/2313/2908 +f 6245/2314/2908 6246/2314/2908 6247/2315/2908 +f 6248/2313/2909 4988/2314/2909 4989/2314/2909 +f 6249/2315/2909 6250/2315/2909 4988/2314/2909 +f 6251/2315/2910 4990/2315/2910 6252/2316/2910 +f 6253/2316/2910 6254/2316/2910 6255/2307/2910 +f 6256/2315/3 4991/2316/3 6257/2316/3 +f 6258/2316/3 6259/2307/3 6260/2307/3 +f 6261/2317/2911 6262/2318/2911 6263/2319/2911 +f 6264/2317/2911 6265/2319/2911 6266/2320/2911 +f 6267/2317/2912 4992/2320/2912 4993/2321/2912 +f 6268/2317/2912 6269/2321/2912 6270/2322/2912 +f 6271/2317/2913 4994/2322/2913 6272/2323/2913 +f 6273/2317/2914 6274/2323/2914 6275/2324/2914 +f 6276/2317/2915 4995/2324/2915 6277/2325/2915 +f 6278/2317/2916 6279/2325/2916 6280/2326/2916 +f 6281/2317/2917 6282/2326/2917 6283/2327/2917 +f 6284/2317/2917 6285/2327/2917 6286/2318/2917 +f 6287/2318/331 4996/2319/331 4997/2318/331 +f 6288/2319/2918 6289/2319/2918 6290/2318/2918 +f 6291/2319/2919 4998/2319/2919 6292/2320/2919 +f 6293/2320/2920 6294/2320/2920 4998/2319/2920 +f 6295/2320/2921 4999/2320/2921 6296/2321/2921 +f 6297/2321/2921 6298/2321/2921 6299/2322/2921 +f 6300/2320/2922 6301/2321/2922 6302/2321/2922 +f 6303/2322/2922 6304/2322/2922 6305/2321/2922 +f 6306/2322/331 5000/2322/331 5001/2323/331 +f 6307/2323/331 6308/2323/331 5000/2322/331 +f 6309/2323/2923 5002/2323/2923 6310/2324/2923 +f 6311/2324/2924 6312/2324/2924 5002/2323/2924 +f 6313/2324/2925 5003/2324/2925 6314/2325/2925 +f 6315/2325/2926 6316/2325/2926 5003/2324/2926 +f 6317/2325/2927 6318/2325/2927 6319/2326/2927 +f 6320/2326/2927 6321/2326/2927 6322/2325/2927 +f 6323/2326/2928 5004/2326/2928 5005/2327/2928 +f 6324/2327/2929 6325/2327/2929 6326/2318/2929 +f 6327/2326/2930 5006/2327/2930 5007/2327/2930 +f 6328/2318/2930 6329/2327/2930 6330/2318/2930 +f 6331/2328/331 5008/2329/331 5009/2330/331 +f 6332/2328/331 6333/2330/331 6334/2331/331 +f 6335/2328/2931 5010/2331/2931 6336/2332/2931 +f 6337/2328/2932 6338/2332/2932 6339/2333/2932 +f 6340/2328/3 5011/2333/3 6341/2334/3 +f 6342/2328/3 6343/2334/3 6344/2335/3 +f 6345/2328/2933 6346/2335/2933 6347/2336/2933 +f 6348/2328/2933 6349/2336/2933 6350/2337/2933 +f 6351/2328/331 5012/2337/331 5013/2338/331 +f 6352/2328/331 6353/2338/331 6354/2329/331 +f 5008/2329/2934 5014/2330/2934 6355/2329/2934 +f 6356/2330/2934 6357/2330/2934 6358/2329/2934 +f 6359/2330/3 5015/2330/3 6360/2331/3 +f 5010/2331/3 6361/2331/3 5015/2330/3 +f 6362/2331/2935 6363/2331/2935 6364/2332/2935 +f 6365/2332/2936 6366/2332/2936 6367/2331/2936 +f 6368/2332/331 5016/2332/331 5017/2333/331 +f 6369/2333/331 6370/2333/331 5016/2332/331 +f 6371/2333/2937 5018/2333/2937 6372/2334/2937 +f 6373/2334/2937 6374/2334/2937 5018/2333/2937 +f 6375/2334/3 5019/2334/3 6376/2335/3 +f 6377/2335/3 6378/2335/3 5019/2334/3 +f 6379/2335/2938 6380/2335/2938 6381/2336/2938 +f 6382/2336/2939 6383/2336/2939 6384/2335/2939 +f 6385/2336/866 5020/2336/866 5021/2337/866 +f 6386/2337/866 6387/2337/866 6388/2338/866 +f 6389/2336/2940 5022/2337/2940 6390/2337/2940 +f 6391/2338/2940 6392/2338/2940 6393/2329/2940 +f 6394/2337/2941 5023/2338/2941 6395/2338/2941 +f 6396/2338/2941 6397/2329/2941 6398/2329/2941 +f 6399/2339/2942 6400/2340/2942 6401/2341/2942 +f 6402/2339/2942 6403/2341/2942 6404/2342/2942 +f 6405/2339/2943 5024/2342/2943 5025/2343/2943 +f 6406/2339/2944 6407/2343/2944 6408/2344/2944 +f 6409/2339/2945 5026/2344/2945 6410/2345/2945 +f 6411/2339/2945 6412/2345/2945 6413/2346/2945 +f 6414/2339/2946 5027/2346/2946 6415/2347/2946 +f 6416/2339/2941 6417/2347/2941 6418/2348/2941 +f 6419/2339/2947 6420/2348/2947 6421/2349/2947 +f 6422/2339/2947 6423/2349/2947 6424/2340/2947 +f 6425/2340/862 5028/2341/862 5029/2340/862 +f 6426/2341/331 6427/2341/331 6428/2340/331 +f 6429/2341/2948 5030/2341/2948 6430/2342/2948 +f 5024/2342/2948 6431/2342/2948 5030/2341/2948 +f 6432/2342/2949 6433/2342/2949 5031/2343/2949 +f 6434/2343/2949 5025/2343/2949 6435/2342/2949 +f 6436/2343/2950 5032/2343/2950 5033/2344/2950 +f 6437/2344/2951 6438/2344/2951 5032/2343/2951 +f 6439/2344/2952 5034/2344/2952 6440/2345/2952 +f 6441/2345/2952 6442/2345/2952 5034/2344/2952 +f 6443/2345/3 5035/2345/3 6444/2346/3 +f 6445/2346/2953 6446/2346/2953 5035/2345/2953 +f 6447/2346/2953 6448/2346/2953 6449/2347/2953 +f 6450/2347/331 5036/2347/331 5037/2348/331 +f 6451/2347/331 6452/2347/331 6453/2346/331 +f 6454/2348/2954 5038/2348/2954 5036/2347/2954 +f 6455/2348/2954 6456/2348/2954 6457/2349/2954 +f 6458/2349/3 5039/2349/3 5038/2348/3 +f 6459/2349/3 6460/2349/3 6461/2340/3 +f 6462/2340/2955 6463/2349/2955 6464/2340/2955 +f 6465/2350/2955 6466/2350/2955 6467/2351/2955 +f 6468/2350/331 5040/2350/331 5041/2352/331 +f 6469/2352/331 6470/2352/331 6471/2350/331 +f 6472/2352/2956 5042/2352/2956 6473/2353/2956 +f 6474/2353/2956 6475/2353/2956 6476/2352/2956 +f 6477/2353/3 5043/2353/3 6478/2354/3 +f 6479/2354/3 6480/2354/3 5043/2353/3 +f 6481/2354/2957 6482/2354/2957 6483/2355/2957 +f 6484/2355/2957 6485/2355/2957 6486/2354/2957 +f 6487/2355/331 5044/2355/331 5045/2356/331 +f 6488/2356/331 6489/2356/331 6490/2355/331 +f 6491/2356/21 5046/2356/21 6492/2357/21 +f 6493/2357/21 6494/2357/21 5046/2356/21 +f 6495/2357/3 5047/2357/3 6496/2358/3 +f 6497/2358/3 6498/2358/3 5047/2357/3 +f 6499/2358/2958 6500/2358/2958 6501/2359/2958 +f 6502/2359/2958 6503/2359/2958 6504/2358/2958 +f 6505/2359/2950 5048/2359/2950 5049/2351/2950 +f 6506/2351/2950 6507/2351/2950 5048/2359/2950 +f 6508/2351/21 5050/2351/21 6509/2350/21 +f 6510/2360/21 6511/2360/21 6512/2361/21 +f 6513/2360/3 5051/2360/3 6514/2362/3 +f 6515/2362/3 6516/2362/3 5051/2360/3 +f 6517/2362/2959 6518/2362/2959 6519/2363/2959 +f 6520/2363/2959 6521/2363/2959 6522/2362/2959 +f 6523/2363/331 5052/2363/331 5053/2364/331 +f 6524/2364/331 6525/2364/331 6526/2363/331 +f 6527/2364/2757 5054/2364/2757 6528/2365/2757 +f 6529/2365/2757 6530/2365/2757 5054/2364/2757 +f 6531/2365/3 5055/2365/3 6532/2366/3 +f 6533/2366/3 6534/2366/3 5055/2365/3 +f 6535/2366/2960 6536/2366/2960 6537/2367/2960 +f 6538/2367/2961 6539/2367/2961 6540/2366/2961 +f 6541/2367/331 5056/2367/331 5057/2368/331 +f 6542/2368/331 6543/2368/331 5056/2367/331 +f 6544/2368/2962 5058/2368/2962 6545/2369/2962 +f 6546/2369/2962 6547/2369/2962 5058/2368/2962 +f 6548/2369/2963 5059/2369/2963 6549/2361/2963 +f 6550/2361/2963 6551/2361/2963 6552/2369/2963 +f 6553/2361/2964 6554/2361/2964 6555/2360/2964 +f 6556/2370/2965 6557/2370/2965 6558/2371/2965 +f 6559/2370/331 5060/2370/331 5061/2372/331 +f 6560/2372/331 6561/2372/331 5060/2370/331 +f 6562/2372/2962 5062/2372/2962 6563/2373/2962 +f 6564/2373/2962 6565/2374/2962 5062/2372/2962 +f 6566/2374/3 5063/2373/3 6567/2375/3 +f 6568/2375/3 6569/2375/3 6570/2374/3 +f 6571/2375/2966 6572/2375/2966 6573/2376/2966 +f 6574/2376/2966 6575/2376/2966 6576/2375/2966 +f 6577/2376/331 5064/2376/331 5065/2377/331 +f 6578/2377/331 6579/2377/331 5064/2376/331 +f 6580/2377/2967 5066/2377/2967 6581/2378/2967 +f 6582/2378/2967 6583/2378/2967 5066/2377/2967 +f 6584/2378/3 5067/2378/3 6585/2379/3 +f 6586/2379/3 6587/2379/3 5067/2378/3 +f 6588/2379/2968 6589/2379/2968 6590/2380/2968 +f 6591/2380/2968 6592/2381/2968 6593/2379/2968 +f 6594/2371/331 5068/2380/331 5069/2371/331 +f 6595/2371/331 6596/2381/331 5068/2380/331 +f 6597/2371/2969 5070/2371/2969 6598/2370/2969 +f 6599/2382/2969 6600/2382/2969 6601/2383/2969 +f 6602/2382/3 5071/2382/3 6603/2384/3 +f 6604/2384/3 6605/2384/3 5071/2382/3 +f 6606/2384/2970 6607/2384/2970 6608/2385/2970 +f 6609/2385/2971 6610/2385/2971 6611/2384/2971 +f 6612/2385/331 5072/2385/331 5073/2386/331 +f 6613/2386/331 6614/2386/331 5072/2385/331 +f 6615/2386/2972 5074/2386/2972 6616/2387/2972 +f 6617/2387/2972 6618/2387/2972 5074/2386/2972 +f 6619/2387/3 5075/2387/3 6620/2388/3 +f 6621/2388/3 6622/2388/3 5075/2387/3 +f 6623/2389/2973 6624/2388/2973 6625/2388/2973 +f 6626/2389/2974 6627/2388/2974 6628/2389/2974 +f 6629/2389/2951 5076/2389/2951 5077/2390/2951 +f 6630/2390/2975 6631/2390/2975 5076/2389/2975 +f 6632/2390/2976 5078/2390/2976 6633/2391/2976 +f 6634/2391/2976 6635/2391/2976 5078/2390/2976 +f 6636/2391/3 5079/2391/3 6637/2383/3 +f 6638/2383/3 6639/2383/3 5079/2391/3 +f 6640/2383/2977 6641/2383/2977 6642/2382/2977 +f 6643/2392/2978 6644/2392/2978 6645/2393/2978 +f 6646/2392/63 6647/2392/63 6648/2394/63 +f 6649/2394/63 6650/2394/63 6651/2392/63 +f 6652/2394/2979 6653/2394/2979 6654/2395/2979 +f 6655/2395/2980 6656/2395/2980 6657/2394/2980 +f 6658/2395/3 6659/2395/3 4778/2396/3 +f 6660/2396/2981 6661/2396/2981 4779/2395/2981 +f 6662/2396/2982 6663/2396/2982 4780/2397/2982 +f 6664/2397/2983 6665/2397/2983 6666/2396/2983 +f 4781/2397/3 6667/2397/3 6668/2398/3 +f 6669/2398/3 6670/2398/3 4782/2397/3 +f 6671/2398/2984 6672/2398/2984 6673/2399/2984 +f 6674/2399/2985 6675/2399/2985 4783/2398/2985 +f 6676/2399/2986 6677/2399/2986 6678/2400/2986 +f 6679/2400/2987 6680/2400/2987 4784/2399/2987 +f 6681/2400/3 6682/2400/3 4785/2401/3 +f 6683/2401/2988 6684/2401/2988 6685/2400/2988 +f 6686/2401/3 4785/2401/3 4786/2393/3 +f 6687/2393/3 4786/2393/3 4787/2401/3 +f 6688/2393/3 6689/2393/3 6690/2392/3 +f 6691/2285/3 6692/2285/3 4768/2294/3 +f 6693/2285/3 6694/2285/3 4769/2286/3 +f 6695/2286/3 4769/2286/3 4770/2285/3 +f 6696/2286/3 6697/2286/3 4771/2287/3 +f 6698/2287/3 6699/2287/3 6700/2286/3 +f 6701/2287/3 4771/2287/3 4772/2288/3 +f 6702/2288/3 6703/2288/3 4773/2287/3 +f 6704/2288/3 4772/2288/3 6705/2289/3 +f 6706/2289/3 6707/2289/3 4774/2288/3 +f 6708/2289/3 6709/2289/3 4775/2290/3 +f 6710/2290/3 6711/2290/3 4776/2289/3 +f 6712/2290/3 4775/2290/3 6713/2291/3 +f 6714/2291/3 6715/2291/3 4777/2290/3 +f 6716/2291/3 6717/2291/3 6718/2292/3 +f 6719/2292/3 6720/2292/3 4758/2291/3 +f 6721/2292/2989 6722/2292/2989 4759/2293/2989 +f 6723/2293/3 6724/2293/3 6725/2292/3 +f 6726/2293/2990 4759/2293/2990 4760/2294/2990 +f 6727/2294/2991 6728/2294/2991 6729/2293/2991 +f 6730/2294/2992 4760/2294/2992 4761/2285/2992 +f 6731/2402/2993 6732/2402/2993 4762/2403/2993 +f 6733/2402/2994 6734/2402/2994 4763/2404/2994 +f 6735/2404/2995 6736/2404/2995 4764/2402/2995 +f 6737/2404/2996 4763/2404/2996 6738/2405/2996 +f 6739/2405/3 6740/2405/3 4765/2404/3 +f 6741/2406/3 6742/2405/3 4766/2405/3 +f 6743/2406/3 4766/2405/3 4767/2406/3 +f 6744/2406/3 6745/2406/3 6746/2407/3 +f 6747/2407/3 6748/2407/3 4748/2406/3 +f 6749/2407/3 6750/2407/3 6751/2408/3 +f 6752/2408/3 6753/2408/3 4749/2407/3 +f 6754/2408/3 6755/2408/3 4750/2409/3 +f 6756/2409/3 4750/2409/3 4751/2408/3 +f 6757/2409/3 6758/2409/3 4752/2410/3 +f 6759/2410/3 6760/2410/3 4753/2409/3 +f 6761/2410/3 4752/2410/3 6762/2411/3 +f 4754/2411/3 6763/2411/3 6764/2410/3 +f 6765/2411/3 4754/2411/3 4755/2403/3 +f 6766/2403/2206 6767/2403/2206 6768/2411/2206 +f 6769/2403/2206 6770/2403/2206 4756/2402/2206 +f 6771/2412/2997 6772/2413/2997 6773/2414/2997 +f 6774/2412/3 6775/2415/3 4757/2413/3 +f 6776/2415/3 6777/2413/3 4757/2413/3 +f 6778/2415/3 4738/2415/3 4739/2413/3 +f 6779/2415/3 6780/2414/3 4740/2413/3 +f 6781/2415/3 6782/2412/3 6783/2414/3 +f 6784/2412/3 6785/2414/3 4741/2414/3 +f 6786/2412/2998 6787/2412/2998 4742/2414/2998 +f 6788/2414/3 6789/2416/3 6790/2417/3 +f 6791/2414/2999 6792/2413/2999 4743/2416/2999 +f 6793/2413/3000 4743/2416/3000 4744/2416/3000 +f 6794/2413/3001 6795/2413/3001 4745/2416/3001 +f 6796/2413/3002 6797/2417/3002 4745/2416/3002 +f 6798/2413/3 6799/2414/3 4746/2417/3 +f 4747/2414/3 6800/2417/3 4746/2417/3 +f 6801/2414/3 6802/2414/3 6803/2417/3 +f 6804/2417/3 6805/2418/3 6806/2419/3 +f 6807/2417/3 6808/2416/3 4729/2418/3 +f 6809/2416/3 4728/2418/3 4729/2418/3 +f 6810/2416/3 6811/2416/3 4730/2418/3 +f 6812/2416/3 6813/2419/3 4731/2418/3 +f 6814/2416/3 6815/2417/3 6816/2419/3 +f 6817/2417/3 6818/2419/3 4732/2419/3 +f 6819/2417/3 6820/2417/3 4733/2419/3 +f 6821/2419/3003 6822/2420/3003 4734/2421/3003 +f 6823/2419/3 6824/2418/3 6825/2420/3 +f 6826/2418/3004 6827/2420/3004 4735/2420/3004 +f 6828/2418/3005 6829/2418/3005 4735/2420/3005 +f 6830/2418/3 6831/2421/3 4736/2420/3 +f 6832/2418/3 6833/2419/3 4737/2421/3 +f 6834/2419/3 6835/2421/3 4737/2421/3 +f 6836/2419/2759 6837/2419/2759 4718/2421/2759 +f 6838/2421/3006 6839/2422/3006 4719/2423/3006 +f 6840/2421/3 6841/2420/3 6842/2422/3 +f 6843/2420/3 6844/2422/3 4720/2422/3 +f 6845/2420/3 6846/2420/3 4721/2422/3 +f 6847/2420/3 6848/2423/3 4722/2422/3 +f 6849/2420/3007 6850/2421/3007 4723/2423/3007 +f 6851/2421/3008 6852/2423/3008 4723/2423/3008 +f 6853/2421/3 6854/2421/3 4724/2423/3 +f 6855/2423/3 6856/2424/3 4725/2425/3 +f 6857/2423/3 6858/2422/3 6859/2424/3 +f 6860/2422/3009 6861/2424/3009 4727/2424/3009 +f 6862/2422/3 6863/2422/3 4726/2424/3 +f 6864/2422/3010 6865/2426/3010 4727/2424/3010 +f 6866/2422/331 6867/2423/331 4708/2426/331 +f 6868/2423/331 6869/2425/331 4709/2426/331 +f 6870/2423/331 6871/2423/331 6872/2425/331 +f 6873/2425/331 6874/2427/331 4710/2428/331 +f 6875/2425/331 6876/2424/331 4711/2427/331 +f 6877/2424/331 6878/2427/331 4712/2427/331 +f 6879/2424/331 6880/2424/331 4713/2427/331 +f 6881/2424/331 6882/2428/331 4713/2427/331 +f 6883/2424/331 6884/2426/331 4714/2428/331 +f 6885/2426/331 6886/2428/331 4714/2428/331 +f 6887/2426/331 6888/2425/331 4715/2428/331 +f 4715/2428/331 6889/2429/331 6890/2430/331 +f 4715/2428/331 6891/2427/331 4716/2429/331 +f 6892/2427/331 6893/2429/331 4717/2429/331 +f 6894/2427/331 6895/2427/331 6896/2429/331 +f 6897/2427/331 6898/2430/331 4688/2429/331 +f 6899/2427/3011 6900/2428/3011 4689/2430/3011 +f 6901/2428/331 6902/2430/331 4689/2430/331 +f 6903/2428/3012 6904/2428/3012 4690/2430/3012 +f 4690/2430/3013 6905/2431/3013 4691/2432/3013 +f 6906/2430/3014 6907/2429/3014 4692/2431/3014 +f 6908/2429/3015 6909/2431/3015 4692/2431/3015 +f 6910/2429/3016 6911/2429/3016 4693/2431/3016 +f 6912/2429/3017 6913/2432/3017 4694/2431/3017 +f 6914/2429/3018 6915/2430/3018 6916/2432/3018 +f 6917/2430/331 6918/2432/331 4695/2432/331 +f 6919/2430/331 6920/2430/331 4696/2432/331 +f 4696/2432/331 6921/2433/331 4697/2434/331 +f 6922/2432/331 6923/2431/331 6924/2433/331 +f 4668/2431/331 6925/2433/331 4669/2433/331 +f 6926/2431/3019 6927/2431/3019 4670/2433/3019 +f 6928/2431/3020 6929/2434/3020 4670/2433/3020 +f 6930/2431/331 6931/2432/331 4671/2434/331 +f 6932/2432/331 6933/2434/331 6934/2434/331 +f 6935/2432/331 6936/2432/331 4672/2434/331 +f 4672/2434/331 6937/2435/331 4673/2436/331 +f 6938/2434/331 6939/2433/331 4674/2435/331 +f 6940/2433/331 6941/2435/331 4675/2435/331 +f 6942/2433/3021 6943/2433/3021 4676/2435/3021 +f 6944/2433/3022 6945/2436/3022 4676/2435/3022 +f 6946/2433/331 6947/2434/331 6948/2436/331 +f 4677/2434/3023 6949/2436/3023 6950/2436/3023 +f 6951/2434/331 6952/2434/331 6953/2436/331 +f 6954/2436/3024 6955/2435/3024 6956/2437/3024 +f 6957/2435/3025 6958/2437/3025 4648/2437/3025 +f 6959/2435/3026 6960/2435/3026 4649/2437/3026 +f 6961/2436/866 6962/2438/866 4650/2438/866 +f 6963/2436/3027 6964/2436/3027 4651/2438/3027 +f 6965/2437/3028 6966/2439/3028 6967/2439/3028 +f 6968/2437/2767 6969/2437/2767 4652/2439/2767 +f 6970/2437/3029 6971/2440/3029 4653/2439/3029 +f 6972/2438/3030 6973/2440/3030 6974/2440/3030 +f 6975/2438/331 6976/2438/331 4654/2440/331 +f 4654/2440/331 6977/2441/331 4655/2442/331 +f 6978/2440/331 6979/2439/331 4656/2441/331 +f 6980/2439/331 6981/2441/331 4656/2441/331 +f 6982/2439/331 6983/2439/331 4657/2441/331 +f 6984/2439/331 6985/2442/331 6986/2441/331 +f 6987/2439/331 6988/2440/331 4628/2442/331 +f 6989/2440/3031 6990/2442/3031 4629/2442/3031 +f 6991/2440/331 6992/2440/331 4629/2442/331 +f 4630/2442/3032 6993/2441/3032 4631/2443/3032 +f 6994/2441/3033 6995/2443/3033 4632/2443/3033 +f 6996/2441/883 6997/2441/883 6998/2443/883 +f 6999/2441/3034 7000/2444/3034 4633/2443/3034 +f 7001/2441/3035 7002/2442/3035 4634/2444/3035 +f 7003/2442/3036 7004/2444/3036 4634/2444/3036 +f 7005/2442/331 7006/2442/331 4635/2444/331 +f 4635/2444/331 7007/2445/331 4636/2446/331 +f 7008/2444/331 7009/2443/331 4637/2445/331 +f 7010/2443/331 7011/2445/331 7012/2445/331 +f 4608/2443/3037 7013/2443/3037 4609/2445/3037 +f 7014/2443/3038 7015/2446/3038 4610/2445/3038 +f 7016/2443/3039 7017/2444/3039 7018/2446/3039 +f 7019/2444/3040 7020/2446/3040 4611/2446/3040 +f 7021/2444/3041 7022/2444/3041 7023/2446/3041 +f 7024/2446/331 7025/2447/331 4612/2448/331 +f 7026/2446/331 7027/2445/331 4613/2447/331 +f 7028/2445/331 7029/2447/331 4613/2447/331 +f 7030/2445/331 7031/2445/331 4614/2447/331 +f 7032/2445/331 7033/2448/331 4615/2447/331 +f 7034/2445/331 7035/2446/331 4616/2448/331 +f 7036/2446/3042 7037/2448/3042 4616/2448/3042 +f 7038/2446/3043 7039/2446/3043 4617/2448/3043 +f 4617/2448/3044 7040/2449/3044 7041/2450/3044 +f 5090/2451/3045 5091/2452/3045 5092/2453/3045 +f 7042/2452/3046 5093/2453/3046 7043/2453/3046 +f 7044/2452/3047 5094/2452/3047 7045/2453/3047 +f 7046/2452/3048 5095/2454/3048 7047/2453/3048 +f 7048/2452/3049 5096/2451/3049 7049/2454/3049 +f 7050/2451/3050 5097/2454/3050 7051/2454/3050 +f 7052/2451/3051 7053/2451/3051 7054/2454/3051 +f 5097/2454/3052 7055/2455/3052 7056/2456/3052 +f 7057/2454/3053 5098/2453/3053 5099/2455/3053 +f 5092/2453/3054 7058/2455/3054 7059/2455/3054 +f 7060/2453/3055 5100/2453/3055 7061/2455/3055 +f 7062/2453/3055 7063/2456/3055 7064/2455/3055 +f 7065/2453/3056 5101/2454/3056 7066/2456/3056 +f 7067/2454/3057 7068/2456/3057 7069/2456/3057 +f 7070/2454/3058 7071/2454/3058 7072/2456/3058 +f 7073/2456/3058 7074/2457/3058 7075/2458/3058 +f 7076/2456/3059 5102/2455/3059 5103/2457/3059 +f 5099/2455/3060 7077/2457/3060 7078/2457/3060 +f 7079/2455/3061 5104/2455/3061 7080/2457/3061 +f 7081/2455/3062 7082/2458/3062 7083/2457/3062 +f 7084/2455/3063 5105/2456/3063 7085/2458/3063 +f 7086/2456/3064 7087/2458/3064 7088/2458/3064 +f 7089/2456/3065 7090/2456/3065 7091/2458/3065 +f 7092/2458/3066 7093/2459/3066 7094/2460/3066 +f 7095/2458/3067 5106/2457/3067 5107/2459/3067 +f 5103/2457/3068 7096/2459/3068 7097/2459/3068 +f 7098/2457/3069 5108/2457/3069 7099/2459/3069 +f 7100/2457/3069 7101/2460/3069 7102/2459/3069 +f 7103/2457/3070 5109/2458/3070 7104/2460/3070 +f 7105/2458/3071 7106/2460/3071 7107/2460/3071 +f 7108/2458/3072 7109/2458/3072 7110/2460/3072 +f 7111/2460/3073 7112/2461/3073 7113/2462/3073 +f 7114/2460/3074 5110/2459/3074 5111/2461/3074 +f 5107/2459/3075 7115/2461/3075 7116/2461/3075 +f 7117/2459/3076 5112/2459/3076 7118/2461/3076 +f 7119/2459/3077 7120/2462/3077 7121/2461/3077 +f 7122/2459/3078 5113/2460/3078 7123/2462/3078 +f 7124/2460/3079 7125/2462/3079 7126/2462/3079 +f 7127/2460/3080 7128/2460/3080 7129/2462/3080 +f 7130/2462/3080 7131/2463/3080 7132/2464/3080 +f 7133/2462/3081 5114/2461/3081 5115/2463/3081 +f 5111/2461/3082 7134/2463/3082 7135/2463/3082 +f 7136/2461/3083 5116/2461/3083 7137/2463/3083 +f 7138/2461/3084 7139/2464/3084 7140/2463/3084 +f 7141/2461/3085 5117/2462/3085 7142/2464/3085 +f 7143/2462/3086 7144/2464/3086 7145/2464/3086 +f 7146/2462/3087 7147/2462/3087 7148/2464/3087 +f 7149/2464/3087 7150/2465/3087 7151/2466/3087 +f 7152/2464/3088 5118/2463/3088 5119/2465/3088 +f 5115/2463/3089 7153/2465/3089 7154/2465/3089 +f 7155/2463/3090 5120/2463/3090 7156/2465/3090 +f 7157/2463/3090 7158/2466/3090 7159/2465/3090 +f 7160/2463/3091 5121/2464/3091 7161/2466/3091 +f 7162/2464/3092 7163/2466/3092 7164/2466/3092 +f 7165/2464/3093 7166/2464/3093 7167/2466/3093 +f 7168/2466/3094 7169/2465/3094 7170/2467/3094 +f 5119/2465/3095 5122/2467/3095 5123/2467/3095 +f 5119/2465/3096 7171/2465/3096 5122/2467/3096 +f 7172/2465/3097 5124/2466/3097 7173/2468/3097 +f 7174/2466/3097 7175/2468/3097 7176/2468/3097 +f 7177/2466/3098 5125/2466/3098 7178/2468/3098 +f 7179/2467/3099 7180/2469/3099 7181/2469/3099 +f 7182/2467/3100 5123/2467/3100 7183/2469/3100 +f 7184/2467/3101 7185/2470/3101 7186/2469/3101 +f 7187/2468/3102 5126/2470/3102 5127/2470/3102 +f 7188/2468/3103 7189/2468/3103 5126/2470/3103 +f 7190/2470/3104 5128/2471/3104 7191/2472/3104 +f 7192/2470/3105 7193/2469/3105 5128/2471/3105 +f 7194/2469/3106 5129/2471/3106 5128/2471/3106 +f 7195/2469/3107 7196/2469/3107 5129/2471/3107 +f 7197/2469/3108 7198/2472/3108 5129/2471/3108 +f 7199/2469/3109 7200/2470/3109 7201/2472/3109 +f 5127/2470/3110 5130/2472/3110 5131/2472/3110 +f 5127/2470/3111 5126/2470/3111 5130/2472/3111 +f 7202/2472/3112 5132/2473/3112 7203/2474/3112 +f 7204/2472/3113 5128/2471/3113 5132/2473/3113 +f 5128/2471/3114 5133/2473/3114 5132/2473/3114 +f 5128/2471/3115 5129/2471/3115 5133/2473/3115 +f 5129/2471/3116 7205/2474/3116 5133/2473/3116 +f 5129/2471/3116 7206/2472/3116 7207/2474/3116 +f 5131/2472/3117 5134/2474/3117 5135/2474/3117 +f 5131/2472/3118 5130/2472/3118 5134/2474/3118 +f 7208/2474/3119 5136/2475/3119 7209/2476/3119 +f 7210/2474/3120 5132/2473/3120 5136/2475/3120 +f 5132/2473/3121 5137/2475/3121 5136/2475/3121 +f 5132/2473/3122 5133/2473/3122 5137/2475/3122 +f 5133/2473/3123 7211/2476/3123 5137/2475/3123 +f 5133/2473/3124 7212/2474/3124 7213/2476/3124 +f 5135/2474/3125 5138/2476/3125 5139/2476/3125 +f 5135/2474/3126 5134/2474/3126 5138/2476/3126 +f 7214/2476/3127 5140/2477/3127 7215/2478/3127 +f 7216/2476/3128 5136/2475/3128 5140/2477/3128 +f 5136/2475/3129 5141/2477/3129 5140/2477/3129 +f 5136/2475/3130 5137/2475/3130 5141/2477/3130 +f 5137/2475/3131 7217/2478/3131 5141/2477/3131 +f 5137/2475/3132 7218/2476/3132 7219/2478/3132 +f 5139/2476/3133 5142/2478/3133 5143/2478/3133 +f 5139/2476/3125 5138/2476/3125 5142/2478/3125 +f 7220/2478/3134 5144/2479/3134 7221/2480/3134 +f 7222/2478/3135 5140/2477/3135 5144/2479/3135 +f 5140/2477/3136 5145/2479/3136 5144/2479/3136 +f 5140/2477/3137 5141/2477/3137 5145/2479/3137 +f 5141/2477/3138 7223/2480/3138 5145/2479/3138 +f 5141/2477/3139 7224/2478/3139 7225/2480/3139 +f 5143/2478/3140 5146/2480/3140 5147/2480/3140 +f 5143/2478/3141 5142/2478/3141 5146/2480/3141 +f 7226/2480/3142 5148/2481/3142 7227/2482/3142 +f 7228/2480/3143 5144/2479/3143 5148/2481/3143 +f 5144/2479/3144 5149/2481/3144 5148/2481/3144 +f 5144/2479/3145 5145/2479/3145 5149/2481/3145 +f 5145/2479/3146 7229/2482/3146 5149/2481/3146 +f 5145/2479/3147 7230/2480/3147 7231/2482/3147 +f 5147/2480/3148 5150/2482/3148 5151/2482/3148 +f 5147/2480/3149 5146/2480/3149 5150/2482/3149 +f 7232/2481/3150 5152/2483/3150 7233/2483/3150 +f 7234/2481/3150 5148/2481/3150 5152/2483/3150 +f 7235/2482/3151 5153/2484/3151 7236/2484/3151 +f 7237/2482/3152 7238/2482/3152 5153/2484/3152 +f 7239/2484/3153 7240/2485/3153 7241/2486/3153 +f 7242/2484/3154 7243/2483/3154 7244/2485/3154 +f 7245/2483/3155 5154/2485/3155 5155/2485/3155 +f 7246/2483/3156 7247/2483/3156 5154/2485/3156 +f 7248/2483/3157 5156/2486/3157 5154/2485/3157 +f 7249/2484/3158 7250/2486/3158 5156/2486/3158 +f 7251/2484/3159 5157/2484/3159 5156/2486/3159 +f 7252/2486/3160 7253/2487/3160 7254/2488/3160 +f 7255/2486/3161 5155/2485/3161 7256/2487/3161 +f 7257/2485/3161 7258/2487/3161 7259/2487/3161 +f 5155/2485/3162 5158/2485/3162 5159/2487/3162 +f 5155/2485/3163 7260/2488/3163 7261/2487/3163 +f 5154/2485/3164 5160/2486/3164 7262/2488/3164 +f 7263/2486/3164 7264/2488/3164 7265/2488/3164 +f 5156/2486/3165 5161/2486/3165 7266/2488/3165 +f 7267/2488/3166 7268/2489/3166 7269/2490/3166 +f 7270/2488/3167 5159/2487/3167 7271/2489/3167 +f 7272/2487/3167 7273/2489/3167 7274/2489/3167 +f 5159/2487/3168 5162/2487/3168 5163/2489/3168 +f 5159/2487/3169 7275/2490/3169 7276/2489/3169 +f 7277/2487/3170 5164/2488/3170 7278/2490/3170 +f 7279/2488/3170 7280/2490/3170 7281/2490/3170 +f 7282/2488/3171 5165/2488/3171 7283/2490/3171 +f 7284/2490/3172 7285/2491/3172 7286/2492/3172 +f 7287/2490/3173 5163/2489/3173 7288/2491/3173 +f 7289/2489/3174 7290/2491/3174 7291/2491/3174 +f 5163/2489/3175 5166/2489/3175 5167/2491/3175 +f 5163/2489/3176 7292/2492/3176 7293/2491/3176 +f 7294/2489/3177 5168/2490/3177 7295/2492/3177 +f 7296/2490/3177 7297/2492/3177 7298/2492/3177 +f 7299/2490/3178 5169/2490/3178 7300/2492/3178 +f 7301/2492/3179 7302/2493/3179 7303/2494/3179 +f 7304/2492/3180 5167/2491/3180 7305/2493/3180 +f 7306/2491/3181 7307/2493/3181 7308/2493/3181 +f 5167/2491/3182 5170/2491/3182 5171/2493/3182 +f 5167/2491/3183 7309/2494/3183 7310/2493/3183 +f 7311/2491/3184 5172/2492/3184 7312/2494/3184 +f 7313/2492/3185 7314/2494/3185 7315/2494/3185 +f 7316/2492/3186 5173/2492/3186 7317/2494/3186 +f 7318/2494/3187 7319/2495/3187 7320/2496/3187 +f 7321/2494/3188 5171/2493/3188 7322/2495/3188 +f 7323/2493/3189 7324/2497/3189 7325/2495/3189 +f 5171/2493/3190 5174/2493/3190 5175/2497/3190 +f 5171/2493/3191 7326/2496/3191 7327/2497/3191 +f 7328/2493/3192 5176/2494/3192 7329/2496/3192 +f 7330/2494/3193 7331/2496/3193 7332/2496/3193 +f 7333/2494/3194 5177/2494/3194 7334/2496/3194 +f 7335/2496/3195 7336/2498/3195 7337/2499/3195 +f 7338/2496/3196 7339/2495/3196 7340/2498/3196 +f 7341/2495/3197 7342/2498/3197 7343/2498/3197 +f 7344/2495/3198 5178/2497/3198 5179/2498/3198 +f 5175/2497/3199 7345/2499/3199 7346/2498/3199 +f 7347/2497/3200 5180/2496/3200 7348/2499/3200 +f 7349/2496/3200 7350/2499/3200 7351/2499/3200 +f 7352/2496/3201 5181/2496/3201 7353/2499/3201 +f 7354/2498/3202 7355/2500/3202 7356/2500/3202 +f 7357/2498/3203 5179/2498/3203 7358/2500/3203 +f 7359/2499/3203 7360/2501/3203 7361/2501/3203 +f 7362/2499/3204 5182/2499/3204 5183/2501/3204 +f 7363/2501/3205 7364/2502/3205 7365/2503/3205 +f 7366/2501/3206 5184/2500/3206 7367/2502/3206 +f 7368/2500/3207 7369/2502/3207 7370/2502/3207 +f 7371/2500/3208 5185/2500/3208 7372/2502/3208 +f 7373/2500/3209 7374/2503/3209 7375/2502/3209 +f 7376/2500/3210 5183/2501/3210 7377/2503/3210 +f 7378/2501/3211 7379/2503/3211 7380/2503/3211 +f 5183/2501/3212 5186/2501/3212 5187/2503/3212 +f 7381/2503/3213 7382/2504/3213 7383/2505/3213 +f 7384/2503/3214 5188/2502/3214 7385/2504/3214 +f 7386/2502/3215 7387/2504/3215 7388/2504/3215 +f 7389/2502/3216 5189/2502/3216 7390/2504/3216 +f 7391/2502/3217 7392/2505/3217 7393/2504/3217 +f 7394/2502/3218 5187/2503/3218 7395/2505/3218 +f 7396/2503/3219 7397/2505/3219 7398/2505/3219 +f 5187/2503/3220 5190/2503/3220 5191/2505/3220 +f 7399/2505/3221 7400/2506/3221 7401/2507/3221 +f 7402/2505/3222 5192/2504/3222 7403/2506/3222 +f 7404/2504/3223 7405/2506/3223 7406/2506/3223 +f 7407/2504/3224 5193/2504/3224 7408/2506/3224 +f 7409/2504/3225 7410/2507/3225 7411/2506/3225 +f 7412/2504/3226 5191/2505/3226 7413/2507/3226 +f 7414/2505/3227 7415/2507/3227 7416/2507/3227 +f 5191/2505/3228 5194/2505/3228 5195/2507/3228 +f 7417/2507/3228 7418/2508/3228 7419/2509/3228 +f 7420/2507/3229 5196/2506/3229 7421/2508/3229 +f 7422/2506/3230 7423/2508/3230 7424/2508/3230 +f 7425/2506/3231 5197/2506/3231 7426/2508/3231 +f 7427/2506/3231 7428/2509/3231 7429/2508/3231 +f 7430/2506/3232 5195/2507/3232 7431/2509/3232 +f 7432/2507/3233 7433/2509/3233 7434/2509/3233 +f 5195/2507/3234 5198/2507/3234 5199/2509/3234 +f 7435/2509/3234 7436/2510/3234 7437/2511/3234 +f 7438/2509/3235 5200/2508/3235 7439/2510/3235 +f 7440/2508/3235 7441/2510/3235 7442/2510/3235 +f 7443/2508/3236 5201/2508/3236 7444/2510/3236 +f 7445/2508/3236 7446/2511/3236 7447/2510/3236 +f 7448/2508/3237 5199/2509/3237 7449/2511/3237 +f 7450/2509/3238 7451/2511/3238 7452/2511/3238 +f 5199/2509/3239 5202/2509/3239 5203/2511/3239 +f 7453/2511/3240 7454/2512/3240 7455/2513/3240 +f 7456/2511/3241 5204/2510/3241 7457/2512/3241 +f 7458/2510/3241 7459/2512/3241 7460/2512/3241 +f 7461/2510/3242 5205/2510/3242 7462/2512/3242 +f 7463/2510/3243 7464/2513/3243 7465/2512/3243 +f 7466/2510/3238 5203/2511/3238 7467/2513/3238 +f 7468/2511/3244 7469/2513/3244 7470/2513/3244 +f 5203/2511/3245 5206/2511/3245 5207/2513/3245 +f 7471/2513/3246 7472/2514/3246 7473/2515/3246 +f 7474/2513/3247 5208/2512/3247 7475/2514/3247 +f 7476/2512/3247 7477/2514/3247 7478/2514/3247 +f 7479/2512/3248 5209/2512/3248 7480/2514/3248 +f 7481/2512/3249 7482/2515/3249 7483/2514/3249 +f 7484/2512/3250 5207/2513/3250 7485/2515/3250 +f 7486/2513/3251 7487/2515/3251 7488/2515/3251 +f 5207/2513/3252 5210/2513/3252 5211/2515/3252 +f 7489/2515/3253 7490/2516/3253 7491/2517/3253 +f 7492/2515/3254 5212/2514/3254 7493/2516/3254 +f 7494/2514/3255 7495/2516/3255 7496/2516/3255 +f 7497/2514/3256 5213/2514/3256 7498/2516/3256 +f 7499/2514/3257 7500/2517/3257 7501/2516/3257 +f 7502/2514/3258 7503/2515/3258 7504/2517/3258 +f 7505/2515/3259 7506/2517/3259 7507/2517/3259 +f 7508/2515/3260 5214/2515/3260 5215/2517/3260 +f 7509/2517/3261 7510/2518/3261 7511/2519/3261 +f 7512/2517/3262 5216/2516/3262 7513/2518/3262 +f 7514/2516/3263 7515/2518/3263 7516/2518/3263 +f 7517/2516/3264 5217/2516/3264 7518/2518/3264 +f 7519/2516/3265 7520/2519/3265 7521/2518/3265 +f 7522/2516/3266 5215/2517/3266 7523/2519/3266 +f 7524/2517/3266 7525/2519/3266 7526/2519/3266 +f 5215/2517/3267 5218/2517/3267 5219/2519/3267 +f 7527/2518/3268 7528/2520/3268 7529/2520/3268 +f 7530/2518/3269 5220/2518/3269 7531/2520/3269 +f 7532/2519/3269 7533/2521/3269 7534/2521/3269 +f 7535/2519/3270 5221/2519/3270 7536/2521/3270 +f 7537/2521/3271 7538/2522/3271 7539/2523/3271 +f 7540/2521/3272 7541/2520/3272 7542/2522/3272 +f 7543/2520/3273 7544/2522/3273 7545/2522/3273 +f 7546/2520/3274 5222/2520/3274 5223/2522/3274 +f 7547/2520/3275 7548/2523/3275 7549/2522/3275 +f 7550/2520/3276 5224/2521/3276 7551/2523/3276 +f 7552/2521/3277 7553/2523/3277 7554/2523/3277 +f 7555/2521/3270 5225/2521/3270 7556/2523/3270 +f 7557/2523/3270 7558/2524/3270 7559/2525/3270 +f 7560/2523/3278 5223/2522/3278 7561/2524/3278 +f 7562/2522/3279 7563/2524/3279 7564/2524/3279 +f 5223/2522/3280 5226/2522/3280 5227/2524/3280 +f 5223/2522/3281 7565/2525/3281 7566/2524/3281 +f 7567/2522/3282 5228/2523/3282 7568/2525/3282 +f 7569/2523/3283 7570/2525/3283 7571/2525/3283 +f 7572/2523/3284 5229/2523/3284 7573/2525/3284 +f 7574/2525/3285 7575/2526/3285 7576/2527/3285 +f 7577/2525/3286 7578/2524/3286 7579/2526/3286 +f 7580/2524/3287 7581/2526/3287 7582/2526/3287 +f 7583/2524/3288 5230/2524/3288 5231/2526/3288 +f 5227/2524/3289 7584/2527/3289 7585/2526/3289 +f 7586/2524/3290 5232/2525/3290 7587/2527/3290 +f 7588/2525/3291 7589/2527/3291 7590/2527/3291 +f 7591/2525/3292 5233/2525/3292 7592/2527/3292 +f 7593/2527/3293 7594/2528/3293 7595/2529/3293 +f 7596/2527/3294 5231/2526/3294 7597/2528/3294 +f 7598/2526/3295 7599/2528/3295 7600/2528/3295 +f 5231/2526/3296 5234/2526/3296 5235/2528/3296 +f 5231/2526/3297 7601/2529/3297 7602/2528/3297 +f 7603/2526/3298 5236/2527/3298 7604/2529/3298 +f 7605/2527/3299 7606/2529/3299 7607/2529/3299 +f 7608/2527/3300 5237/2527/3300 7609/2529/3300 +f 7610/2529/3301 7611/2530/3301 7612/2531/3301 +f 7613/2529/3302 5235/2528/3302 7614/2530/3302 +f 7615/2528/3303 7616/2530/3303 7617/2530/3303 +f 5235/2528/3304 5238/2528/3304 5239/2530/3304 +f 5235/2528/3305 7618/2531/3305 7619/2530/3305 +f 7620/2528/3306 5240/2529/3306 7621/2531/3306 +f 7622/2529/3307 7623/2531/3307 7624/2531/3307 +f 7625/2529/3308 5241/2529/3308 7626/2531/3308 +f 7627/2531/3309 7628/2532/3309 7629/2533/3309 +f 7630/2531/3310 5239/2530/3310 7631/2532/3310 +f 7632/2530/3311 7633/2532/3311 7634/2532/3311 +f 5239/2530/3312 5242/2530/3312 5243/2532/3312 +f 7635/2531/3313 7636/2533/3313 7637/2533/3313 +f 7638/2531/3314 5244/2531/3314 7639/2533/3314 +f 7640/2533/3315 7641/2534/3315 7642/2535/3315 +f 7643/2533/3316 5245/2532/3316 7644/2534/3316 +f 7645/2532/3317 7646/2534/3317 7647/2534/3317 +f 7648/2532/3318 5243/2532/3318 7649/2534/3318 +f 7650/2532/3319 7651/2535/3319 7652/2534/3319 +f 7653/2533/3320 5246/2535/3320 5247/2535/3320 +f 7654/2533/3321 7655/2533/3321 5246/2535/3321 +f 7656/2535/3322 5248/2536/3322 7657/2537/3322 +f 7658/2535/3323 7659/2534/3323 5248/2536/3323 +f 7660/2534/3324 5249/2536/3324 5248/2536/3324 +f 7661/2534/3325 7662/2534/3325 5249/2536/3325 +f 7663/2534/3326 7664/2537/3326 5249/2536/3326 +f 7665/2534/3327 7666/2535/3327 7667/2537/3327 +f 5247/2535/3328 5250/2537/3328 5251/2537/3328 +f 5247/2535/3163 5246/2535/3163 5250/2537/3163 +f 7668/2537/3329 5252/2538/3329 7669/2539/3329 +f 7670/2537/3330 5248/2536/3330 5252/2538/3330 +f 5248/2536/3331 5253/2538/3331 5252/2538/3331 +f 5248/2536/3332 5249/2536/3332 5253/2538/3332 +f 5249/2536/3333 7671/2539/3333 5253/2538/3333 +f 5249/2536/3334 7672/2537/3334 7673/2539/3334 +f 5251/2537/3335 5254/2539/3335 5255/2539/3335 +f 5251/2537/3336 5250/2537/3336 5254/2539/3336 +f 7674/2539/3337 5256/2540/3337 7675/2541/3337 +f 7676/2539/3338 5252/2538/3338 5256/2540/3338 +f 5252/2538/3339 5257/2540/3339 5256/2540/3339 +f 5252/2538/3340 5253/2538/3340 5257/2540/3340 +f 5253/2538/3341 7677/2541/3341 5257/2540/3341 +f 5253/2538/3342 7678/2539/3342 7679/2541/3342 +f 5255/2539/3343 5258/2541/3343 5259/2541/3343 +f 5255/2539/3344 5254/2539/3344 5258/2541/3344 +f 7680/2541/3345 5260/2542/3345 7681/2543/3345 +f 7682/2541/3345 5256/2540/3345 5260/2542/3345 +f 5256/2540/3346 5261/2542/3346 5260/2542/3346 +f 5256/2540/3347 5257/2540/3347 5261/2542/3347 +f 5257/2540/3348 7683/2543/3348 5261/2542/3348 +f 5257/2540/3349 7684/2541/3349 7685/2543/3349 +f 5259/2541/3350 5262/2543/3350 5263/2543/3350 +f 5259/2541/3351 5258/2541/3351 5262/2543/3351 +f 7686/2543/3352 5264/2544/3352 7687/2545/3352 +f 7688/2543/3353 5260/2542/3353 5264/2544/3353 +f 5260/2542/3354 5265/2544/3354 5264/2544/3354 +f 5260/2542/3355 5261/2542/3355 5265/2544/3355 +f 5261/2542/3356 7689/2545/3356 5265/2544/3356 +f 5261/2542/3357 7690/2543/3357 7691/2545/3357 +f 5263/2543/3358 5266/2545/3358 5267/2545/3358 +f 5263/2543/3359 5262/2543/3359 5266/2545/3359 +f 7692/2545/3360 5268/2546/3360 7693/2547/3360 +f 7694/2545/3361 5264/2544/3361 5268/2546/3361 +f 5264/2544/3362 5269/2546/3362 5268/2546/3362 +f 5264/2544/3363 5265/2544/3363 5269/2546/3363 +f 5265/2544/3364 7695/2547/3364 5269/2546/3364 +f 5265/2544/3365 7696/2545/3365 7697/2547/3365 +f 5267/2545/3366 5270/2547/3366 5271/2547/3366 +f 5267/2545/3367 5266/2545/3367 5270/2547/3367 +f 7698/2547/3368 5272/2548/3368 7699/2549/3368 +f 7700/2547/3369 5268/2546/3369 5272/2548/3369 +f 5268/2546/3370 5273/2548/3370 5272/2548/3370 +f 5268/2546/3371 5269/2546/3371 5273/2548/3371 +f 5269/2546/3372 7701/2549/3372 5273/2548/3372 +f 5269/2546/3373 7702/2547/3373 7703/2549/3373 +f 5271/2547/3374 5274/2549/3374 5275/2549/3374 +f 5271/2547/3375 5270/2547/3375 5274/2549/3375 +f 7704/2549/3376 5276/2550/3376 7705/2551/3376 +f 7706/2549/3377 5272/2548/3377 5276/2550/3377 +f 5272/2548/3378 5277/2550/3378 5276/2550/3378 +f 5272/2548/3379 5273/2548/3379 5277/2550/3379 +f 5273/2548/3380 7707/2551/3380 5277/2550/3380 +f 5273/2548/3381 7708/2549/3381 7709/2551/3381 +f 5275/2549/3382 5278/2551/3382 5279/2551/3382 +f 5275/2549/3383 5274/2549/3383 5278/2551/3383 +f 7710/2551/3384 5280/2552/3384 7711/2553/3384 +f 7712/2551/3385 5276/2550/3385 5280/2552/3385 +f 5276/2550/3386 5281/2552/3386 5280/2552/3386 +f 5276/2550/3387 5277/2550/3387 5281/2552/3387 +f 5277/2550/3388 7713/2553/3388 5281/2552/3388 +f 5277/2550/3389 7714/2551/3389 7715/2553/3389 +f 5279/2551/3390 5282/2553/3390 5283/2553/3390 +f 5279/2551/3391 5278/2551/3391 5282/2553/3391 +f 7716/2553/3392 5284/2554/3392 7717/2555/3392 +f 7718/2553/3393 5280/2552/3393 5284/2554/3393 +f 5280/2552/2988 5285/2554/2988 5284/2554/2988 +f 5280/2552/3394 5281/2552/3394 5285/2554/3394 +f 5281/2552/3395 7719/2555/3395 5285/2554/3395 +f 5281/2552/3396 7720/2553/3396 7721/2555/3396 +f 5283/2553/3397 5286/2555/3397 5287/2555/3397 +f 5283/2553/3398 5282/2553/3398 5286/2555/3398 +f 7722/2555/3399 5288/2556/3399 7723/2557/3399 +f 7724/2555/3400 5284/2554/3400 5288/2556/3400 +f 5284/2554/3401 5289/2556/3401 5288/2556/3401 +f 5284/2554/2988 5285/2554/2988 5289/2556/2988 +f 5285/2554/3402 7725/2558/3402 5289/2556/3402 +f 5285/2554/3403 7726/2555/3403 7727/2558/3403 +f 5287/2555/3404 5290/2557/3404 5291/2558/3404 +f 5287/2555/3405 5286/2555/3405 5290/2557/3405 +f 7728/2415/3406 5292/2412/3406 7729/2412/3406 +f 7730/2415/3407 7731/2412/3407 7732/2415/3407 +f 5288/2556/3408 5293/2558/3408 7733/2557/3408 +f 5288/2556/3409 5289/2556/3409 7734/2557/3409 +f 7735/2535/3410 7736/2532/3410 7737/2402/3410 +f 7738/2535/3411 7739/2402/3411 7740/2404/3411 +f 7741/2533/3412 5294/2535/3412 5295/2405/3412 +f 7742/2535/3413 7743/2404/3413 7744/2405/3413 +f 7745/2406/3414 5296/2533/3414 7746/2405/3414 +f 7747/2533/3415 7748/2406/3415 7749/2407/3415 +f 7750/2533/3416 5297/2407/3416 7751/2531/3416 +f 7752/2530/3417 7753/2531/3417 7754/2408/3417 +f 7755/2531/3418 7756/2407/3418 7757/2408/3418 +f 7758/2530/3419 7759/2408/3419 7760/2409/3419 +f 7761/2532/3420 5298/2530/3420 5299/2410/3420 +f 7762/2530/3421 7763/2409/3421 7764/2410/3421 +f 7765/2532/3422 5300/2410/3422 7766/2411/3422 +f 7767/2532/3423 7768/2411/3423 7769/2403/3423 +f 7770/2403/3424 5301/2402/3424 7771/2532/3424 +f 7772/2521/3425 7773/2520/3425 7774/2285/3425 +f 7775/2521/3426 7776/2285/3426 7777/2286/3426 +f 7778/2521/3427 7779/2286/3427 7780/2287/3427 +f 7781/2519/3428 5302/2521/3428 5303/2288/3428 +f 7782/2521/3429 7783/2287/3429 7784/2288/3429 +f 7785/2519/3430 5304/2288/3430 7786/2289/3430 +f 7787/2518/3431 7788/2519/3431 7789/2290/3431 +f 7790/2519/3432 5305/2289/3432 7791/2290/3432 +f 7792/2518/3433 7793/2290/3433 7794/2291/3433 +f 7795/2518/3434 7796/2291/3434 7797/2292/3434 +f 7798/2520/3435 7799/2518/3435 7800/2293/3435 +f 7801/2518/3436 5306/2292/3436 5307/2293/3436 +f 7802/2520/3437 7803/2293/3437 7804/2294/3437 +f 7805/2294/3438 5308/2285/3438 7806/2520/3438 +f 7807/2501/3439 7808/2500/3439 7809/2392/3439 +f 7810/2499/3440 5309/2501/3440 7811/2394/3440 +f 7812/2501/3441 7813/2392/3441 7814/2394/3441 +f 7815/2499/3442 7816/2394/3442 7817/2395/3442 +f 7818/2498/3443 7819/2499/3443 7820/2395/3443 +f 7821/2498/3444 5310/2395/3444 5311/2396/3444 +f 7822/2498/3445 7823/2396/3445 7824/2397/3445 +f 7825/2498/3446 5312/2397/3446 7826/2398/3446 +f 7827/2500/3447 7828/2498/3447 7829/2399/3447 +f 7830/2498/3448 5313/2398/3448 7831/2399/3448 +f 7832/2500/3449 7833/2399/3449 7834/2400/3449 +f 7835/2500/3450 7836/2400/3450 7837/2401/3450 +f 7838/2500/3451 7839/2401/3451 7840/2393/3451 +f 7841/2393/3452 5314/2392/3452 5315/2500/3452 +f 7842/2481/3453 7843/2482/3453 7844/2382/3453 +f 7845/2482/3454 5316/2484/3454 7846/2382/3454 +f 7847/2481/3455 7848/2382/3455 7849/2384/3455 +f 7850/2481/3456 5317/2384/3456 7851/2385/3456 +f 7852/2481/3457 7853/2385/3457 7854/2386/3457 +f 7855/2481/3458 7856/2386/3458 7857/2387/3458 +f 7858/2483/3459 7859/2481/3459 7860/2388/3459 +f 7861/2481/3460 5318/2387/3460 5319/2388/3460 +f 7862/2389/3452 7863/2483/3452 7864/2388/3452 +f 7865/2483/3461 5320/2389/3461 7866/2390/3461 +f 7867/2483/3462 7868/2390/3462 7869/2486/3462 +f 5316/2484/3463 5321/2486/3463 7870/2391/3463 +f 7871/2486/3464 7872/2390/3464 7873/2391/3464 +f 7874/2484/3465 7875/2391/3465 7876/2383/3465 +f 7877/2382/3466 7878/2484/3466 7879/2383/3466 +f 7880/2465/3467 5322/2370/3467 5323/2372/3467 +f 7881/2467/3468 7882/2465/3468 7883/2374/3468 +f 7884/2465/3469 5324/2372/3469 7885/2374/3469 +f 7886/2467/3470 7887/2374/3470 7888/2375/3470 +f 7889/2470/3471 5325/2467/3471 7890/2376/3471 +f 7891/2467/3448 7892/2375/3448 7893/2376/3448 +f 7894/2470/3472 7895/2376/3472 7896/2377/3472 +f 7897/2470/3473 7898/2377/3473 7899/2378/3473 +f 7900/2468/3474 5326/2470/3474 5327/2379/3474 +f 7901/2470/3475 7902/2378/3475 7903/2379/3475 +f 7904/2468/3476 5328/2379/3476 7905/2381/3476 +f 7906/2371/3476 7907/2468/3476 7908/2381/3476 +f 7909/2465/3477 5329/2468/3477 7910/2371/3477 +f 7911/2370/3478 7912/2465/3478 7913/2371/3478 +f 7914/2559/3479 7915/2449/3479 7916/2362/3479 +f 7917/2449/3479 7918/2360/3479 7919/2362/3479 +f 7920/2559/3480 5330/2362/3480 5331/2363/3480 +f 7921/2560/3480 7922/2559/3480 7923/2364/3480 +f 7924/2559/3481 5332/2363/3481 7925/2364/3481 +f 7926/2560/3481 7927/2364/3481 7928/2365/3481 +f 7929/2560/3482 5333/2365/3482 7930/2366/3482 +f 7931/2450/3483 7932/2560/3483 7933/2367/3483 +f 7934/2560/3484 7935/2366/3484 7936/2367/3484 +f 7937/2450/3484 7938/2367/3484 7939/2368/3484 +f 7940/2449/3485 5334/2450/3485 5335/2368/3485 +f 7941/2449/3486 7942/2368/3486 7943/2369/3486 +f 7944/2449/3487 5336/2369/3487 7945/2361/3487 +f 7946/2360/3488 7947/2449/3488 7948/2361/3488 +f 7949/2437/3448 5337/2435/3448 7950/2350/3448 +f 7951/2437/3489 7952/2350/3489 7953/2352/3489 +f 7954/2437/3490 7955/2352/3490 7956/2440/3490 +f 7957/2440/3491 7958/2352/3491 7959/2353/3491 +f 7960/2440/3492 5338/2353/3492 5339/2354/3492 +f 7961/2440/3467 7962/2354/3467 7963/2355/3467 +f 7964/2438/3493 5340/2440/3493 7965/2356/3493 +f 7966/2440/3494 7967/2355/3494 7968/2356/3494 +f 7969/2438/3495 5341/2356/3495 7970/2357/3495 +f 7971/2438/3463 7972/2357/3463 7973/2358/3463 +f 7974/2438/3496 7975/2358/3496 7976/2436/3496 +f 5337/2435/3497 7977/2436/3497 7978/2351/3497 +f 7979/2436/3498 5342/2358/3498 5343/2359/3498 +f 7980/2350/3499 7981/2435/3499 7982/2351/3499 +f 7983/2436/3500 5344/2437/3500 7984/2340/3500 +f 7985/2340/3501 7986/2437/3501 7987/2341/3501 +f 7988/2341/3502 5345/2437/3502 7989/2439/3502 +f 7990/2341/3502 7991/2439/3502 7992/2342/3502 +f 7993/2342/3503 7994/2439/3503 7995/2343/3503 +f 7996/2343/3503 7997/2439/3503 7998/2344/3503 +f 7999/2439/3504 5346/2440/3504 5347/2345/3504 +f 8000/2344/3505 8001/2439/3505 8002/2345/3505 +f 8003/2440/3506 5348/2438/3506 8004/2346/3506 +f 8005/2345/3506 8006/2440/3506 8007/2346/3506 +f 8008/2346/3507 5349/2438/3507 8009/2347/3507 +f 8010/2347/3508 8011/2438/3508 8012/2436/3508 +f 8013/2347/3509 8014/2436/3509 8015/2348/3509 +f 8016/2348/3510 8017/2436/3510 8018/2349/3510 +f 8019/2340/3511 5350/2349/3511 5351/2436/3511 +f 8020/2450/3512 8021/2449/3512 8022/2329/3512 +f 8023/2449/3513 5352/2559/3513 8024/2330/3513 +f 8025/2329/3513 8026/2449/3513 8027/2330/3513 +f 8028/2330/3514 5353/2559/3514 8029/2331/3514 +f 8030/2331/3483 8031/2559/3483 8032/2332/3483 +f 8033/2559/3515 8034/2560/3515 8035/2333/3515 +f 8036/2332/3516 8037/2559/3516 8038/2333/3516 +f 8039/2333/3517 5354/2560/3517 5355/2334/3517 +f 8040/2560/3518 8041/2450/3518 8042/2335/3518 +f 8043/2334/3519 5356/2560/3519 8044/2335/3519 +f 8045/2335/3520 8046/2450/3520 8047/2336/3520 +f 8048/2336/3521 8049/2450/3521 5357/2337/3521 +f 8050/2337/3522 8051/2450/3522 8052/2338/3522 +f 8053/2338/3523 8054/2450/3523 8055/2329/3523 +f 8056/2318/3524 5358/2466/3524 5359/2319/3524 +f 8057/2466/3525 8058/2467/3525 8059/2320/3525 +f 8060/2319/3526 5360/2466/3526 8061/2320/3526 +f 8062/2320/3527 8063/2467/3527 8064/2321/3527 +f 8065/2321/3528 8066/2467/3528 5361/2469/3528 +f 8067/2321/3529 8068/2469/3529 8069/2322/3529 +f 8070/2322/3530 5362/2469/3530 5363/2323/3530 +f 8071/2323/3531 8072/2469/3531 8073/2324/3531 +f 8074/2324/3532 5364/2469/3532 8075/2325/3532 +f 8076/2469/3533 8077/2470/3533 8078/2326/3533 +f 8079/2470/3534 5365/2468/3534 8080/2326/3534 +f 8081/2325/3535 5361/2469/3535 8082/2326/3535 +f 8083/2327/3536 8084/2468/3536 8085/2466/3536 +f 8086/2326/3537 8087/2468/3537 8088/2327/3537 +f 8089/2318/3538 5366/2327/3538 5367/2466/3538 +f 8090/2484/3539 8091/2482/3539 8092/2307/3539 +f 8093/2307/3540 5368/2482/3540 8094/2308/3540 +f 8095/2308/3541 8096/2482/3541 8097/2309/3541 +f 8098/2309/3542 5369/2482/3542 8099/2310/3542 +f 8100/2310/3543 8101/2482/3543 8102/2481/3543 +f 8103/2310/3544 8104/2481/3544 8105/2311/3544 +f 8106/2481/3545 8107/2483/3545 8108/2312/3545 +f 8109/2311/3546 5370/2481/3546 5371/2312/3546 +f 8110/2312/3547 8111/2483/3547 8112/2313/3547 +f 8113/2313/3548 5372/2483/3548 8114/2314/3548 +f 8115/2483/3549 8116/2484/3549 8117/2315/3549 +f 8118/2314/3550 5373/2483/3550 8119/2315/3550 +f 8120/2315/3551 8121/2484/3551 8122/2316/3551 +f 8123/2316/3552 8124/2484/3552 8125/2307/3552 +f 8126/2500/3553 8127/2501/3553 8128/2296/3553 +f 8129/2501/3554 5374/2499/3554 5375/2297/3554 +f 8130/2296/3555 8131/2501/3555 8132/2297/3555 +f 8133/2297/3556 5376/2499/3556 8134/2298/3556 +f 8135/2298/3556 8136/2499/3556 8137/2299/3556 +f 8138/2299/3557 5377/2499/3557 8139/2300/3557 +f 8140/2300/3558 8141/2499/3558 8142/2498/3558 +f 8143/2300/3559 8144/2498/3559 8145/2301/3559 +f 8146/2498/3560 8147/2500/3560 8148/2302/3560 +f 8149/2301/3561 5378/2498/3561 5379/2302/3561 +f 8150/2302/3562 8151/2500/3562 8152/2303/3562 +f 8153/2303/3563 5380/2500/3563 8154/2304/3563 +f 8155/2304/3564 8156/2500/3564 8157/2305/3564 +f 8158/2305/3565 5381/2500/3565 8159/2296/3565 +f 8160/2285/3566 8161/2520/3566 8162/2286/3566 +f 8163/2520/3567 8164/2521/3567 8165/2287/3567 +f 8166/2286/3568 8167/2520/3568 8168/2287/3568 +f 8169/2521/3569 5382/2519/3569 5383/2288/3569 +f 8170/2287/3570 8171/2521/3570 8172/2288/3570 +f 8173/2288/3571 5384/2519/3571 8174/2289/3571 +f 8175/2289/3572 8176/2519/3572 8177/2290/3572 +f 8178/2519/3573 5385/2518/3573 8179/2290/3573 +f 8180/2290/3574 8181/2518/3574 8182/2291/3574 +f 8183/2291/3575 8184/2518/3575 8185/2292/3575 +f 8186/2292/3576 8187/2518/3576 8188/2293/3576 +f 8189/2518/3577 5386/2520/3577 5387/2293/3577 +f 8190/2293/3578 8191/2520/3578 8192/2294/3578 +f 8193/2294/3579 5388/2520/3579 8194/2285/3579 +f 8195/2275/3580 8196/2275/3580 8197/2283/3580 +f 8198/2275/3581 5389/2275/3581 8199/2274/3581 +f 8200/2274/3582 8201/2274/3582 5389/2275/3582 +f 8202/2274/3583 8203/2274/3583 8204/2276/3583 +f 8205/2276/3584 8206/2276/3584 8207/2274/3584 +f 8208/2276/3585 5390/2276/3585 5391/2277/3585 +f 8209/2277/3586 8210/2277/3586 5390/2276/3586 +f 8211/2277/3587 5392/2277/3587 8212/2278/3587 +f 8213/2278/3588 8214/2278/3588 5392/2277/3588 +f 8215/2278/3589 5393/2278/3589 8216/2279/3589 +f 8217/2279/3590 8218/2279/3590 8219/2278/3590 +f 8220/2279/3591 8221/2279/3591 8222/2280/3591 +f 8223/2280/3592 8224/2280/3592 8225/2279/3592 +f 8226/2280/3593 5394/2280/3593 5395/2281/3593 +f 8227/2281/3594 8228/2281/3594 8229/2280/3594 +f 8230/2281/3595 5396/2281/3595 8231/2282/3595 +f 8232/2282/3596 8233/2282/3596 8234/2281/3596 +f 8235/2282/3597 5397/2282/3597 8236/2283/3597 +f 8237/2283/3598 8238/2283/3598 8239/2282/3598 +f 8240/2283/3599 8241/2283/3599 8242/2275/3599 +f 8243/2561/3600 8244/2562/3600 8245/2563/3600 +f 8246/2561/3601 5398/2564/3601 5399/2562/3601 +f 8247/2564/3593 8248/2562/3593 8249/2562/3593 +f 8250/2564/3602 5400/2564/3602 8251/2562/3602 +f 8252/2564/3603 8253/2563/3603 8254/2562/3603 +f 8255/2564/3604 5401/2561/3604 8256/2563/3604 +f 8257/2561/3605 8258/2563/3605 8259/2563/3605 +f 8260/2561/3606 8261/2561/3606 8262/2563/3606 +f 8263/2563/3607 8264/2565/3607 8265/2566/3607 +f 8266/2563/3608 5402/2562/3608 5403/2565/3608 +f 5399/2562/3609 8267/2565/3609 8268/2565/3609 +f 8269/2562/3610 5404/2562/3610 8270/2565/3610 +f 8271/2562/3611 8272/2566/3611 8273/2565/3611 +f 8274/2562/3612 5405/2563/3612 8275/2566/3612 +f 8276/2563/3613 8277/2566/3613 8278/2566/3613 +f 8279/2563/3614 8280/2563/3614 8281/2566/3614 +f 8282/2566/3615 8283/2567/3615 8284/2568/3615 +f 8285/2566/3616 5406/2565/3616 5407/2567/3616 +f 5403/2565/3617 8286/2567/3617 8287/2567/3617 +f 8288/2565/3618 5408/2565/3618 8289/2567/3618 +f 8290/2565/3619 8291/2568/3619 8292/2567/3619 +f 8293/2565/3620 5409/2566/3620 8294/2568/3620 +f 8295/2566/3612 8296/2568/3612 8297/2568/3612 +f 8298/2566/3621 8299/2566/3621 8300/2568/3621 +f 8301/2568/3622 8302/2569/3622 8303/2570/3622 +f 8304/2568/3623 5410/2567/3623 5411/2569/3623 +f 5407/2567/3624 8305/2569/3624 8306/2569/3624 +f 8307/2567/3625 5412/2567/3625 8308/2569/3625 +f 8309/2567/3626 8310/2570/3626 8311/2569/3626 +f 8312/2567/3627 5413/2568/3627 8313/2570/3627 +f 8314/2568/3628 8315/2570/3628 8316/2570/3628 +f 8317/2568/3629 8318/2568/3629 8319/2570/3629 +f 8320/2570/3629 8321/2571/3629 8322/2572/3629 +f 8323/2570/3630 5414/2569/3630 5415/2571/3630 +f 5411/2569/3631 8324/2571/3631 8325/2571/3631 +f 8326/2569/3632 5416/2569/3632 8327/2571/3632 +f 8328/2569/3633 8329/2572/3633 8330/2571/3633 +f 8331/2569/3634 5417/2570/3634 8332/2572/3634 +f 8333/2570/3635 8334/2572/3635 8335/2572/3635 +f 8336/2570/3636 8337/2570/3636 8338/2572/3636 +f 8339/2572/3636 8340/2573/3636 8341/2574/3636 +f 8342/2572/3637 5418/2571/3637 5419/2573/3637 +f 5415/2571/3638 8343/2573/3638 8344/2573/3638 +f 8345/2571/3639 5420/2571/3639 8346/2573/3639 +f 8347/2571/3640 8348/2574/3640 8349/2573/3640 +f 8350/2571/3641 5421/2572/3641 8351/2574/3641 +f 8352/2572/3642 8353/2574/3642 8354/2574/3642 +f 8355/2572/3643 8356/2572/3643 8357/2574/3643 +f 8358/2574/3644 8359/2575/3644 8360/2576/3644 +f 8361/2574/3645 5422/2573/3645 5423/2575/3645 +f 5419/2573/3646 8362/2575/3646 8363/2575/3646 +f 8364/2573/3647 5424/2573/3647 8365/2575/3647 +f 8366/2573/3648 8367/2576/3648 8368/2575/3648 +f 8369/2573/3649 5425/2574/3649 8370/2576/3649 +f 8371/2574/3650 8372/2576/3650 8373/2576/3650 +f 8374/2574/3651 8375/2574/3651 8376/2576/3651 +f 8377/2576/3652 8378/2577/3652 8379/2578/3652 +f 8380/2576/3653 5426/2575/3653 5427/2577/3653 +f 5423/2575/3654 8381/2577/3654 8382/2577/3654 +f 8383/2575/3655 5428/2575/3655 8384/2577/3655 +f 8385/2575/3656 8386/2578/3656 8387/2577/3656 +f 8388/2575/3657 5429/2576/3657 8389/2578/3657 +f 8390/2576/3658 8391/2578/3658 8392/2578/3658 +f 8393/2576/3659 8394/2576/3659 8395/2578/3659 +f 8396/2578/3660 8397/2579/3660 8398/2580/3660 +f 8399/2578/3661 5430/2577/3661 5431/2579/3661 +f 5427/2577/3662 8400/2581/3662 8401/2579/3662 +f 8402/2577/3663 5432/2577/3663 8403/2581/3663 +f 8404/2577/3664 8405/2582/3664 8406/2581/3664 +f 8407/2577/3665 5433/2578/3665 8408/2582/3665 +f 8409/2578/3666 8410/2580/3666 8411/2582/3666 +f 8412/2578/3667 8413/2578/3667 8414/2580/3667 +f 8415/2580/3668 8416/2583/3668 8417/2584/3668 +f 8418/2580/3669 5434/2579/3669 5435/2583/3669 +f 5431/2579/3670 8419/2583/3670 8420/2583/3670 +f 8421/2579/3671 5436/2581/3671 8422/2583/3671 +f 8423/2581/3672 8424/2584/3672 8425/2583/3672 +f 8426/2581/3673 5437/2582/3673 8427/2584/3673 +f 8428/2582/3674 8429/2584/3674 8430/2584/3674 +f 8431/2582/3675 8432/2580/3675 8433/2584/3675 +f 8434/2584/3676 8435/2585/3676 8436/2586/3676 +f 8437/2584/3677 5438/2583/3677 5439/2585/3677 +f 5435/2583/3678 8438/2585/3678 8439/2585/3678 +f 8440/2583/3679 5440/2583/3679 8441/2585/3679 +f 8442/2583/3680 8443/2586/3680 8444/2585/3680 +f 8445/2583/3681 5441/2584/3681 8446/2586/3681 +f 8447/2584/3682 8448/2586/3682 8449/2586/3682 +f 8450/2584/3683 8451/2584/3683 8452/2586/3683 +f 8453/2586/3684 8454/2587/3684 8455/2588/3684 +f 8456/2586/3685 8457/2585/3685 8458/2587/3685 +f 5439/2585/3686 8459/2587/3686 8460/2587/3686 +f 8461/2585/3687 8462/2585/3687 8463/2587/3687 +f 8464/2585/3688 8465/2588/3688 8466/2587/3688 +f 8467/2585/3689 8468/2586/3689 8469/2588/3689 +f 8470/2586/3690 8471/2588/3690 8472/2588/3690 +f 8473/2586/3691 8474/2586/3691 8475/2588/3691 +f 8476/2588/3692 8477/2589/3692 8478/2590/3692 +f 8479/2588/3693 8480/2587/3693 5080/2589/3693 +f 8481/2587/3694 8482/2589/3694 5081/2589/3694 +f 8483/2587/3695 8484/2587/3695 5082/2589/3695 +f 8485/2587/3696 8486/2590/3696 5082/2589/3696 +f 8487/2587/3697 8488/2588/3697 5083/2590/3697 +f 8489/2588/3698 8490/2590/3698 5084/2590/3698 +f 8491/2588/3699 8492/2588/3699 8493/2590/3699 +f 8494/2590/3700 8495/2591/3700 5085/2592/3700 +f 8496/2590/3701 8497/2589/3701 8498/2591/3701 +f 8499/2589/3702 8500/2591/3702 5086/2591/3702 +f 8501/2589/3703 8502/2589/3703 5087/2591/3703 +f 8503/2589/3704 8504/2592/3704 5087/2591/3704 +f 8505/2589/3705 8506/2590/3705 5088/2592/3705 +f 8507/2590/3706 5088/2592/3706 5089/2592/3706 +f 8508/2590/3707 8509/2590/3707 8510/2592/3707 +f 8511/2592/3 8512/2593/3 8513/2594/3 +f 5442/2176/3708 5446/2176/3708 5445/2176/3708 +f 5442/2176/3708 5443/2176/3708 5446/2176/3708 +f 5443/2176/7 5447/2176/7 5446/2176/7 +f 5443/2176/7 5444/2176/7 5447/2176/7 +f 5444/2176/3709 5445/2176/3709 5447/2176/3709 +f 5444/2176/3709 5442/2176/3709 5445/2176/3709 +f 5448/2176/3710 5452/2176/3710 5451/2176/3710 +f 5448/2176/3710 5449/2176/3710 5452/2176/3710 +f 5449/2176/7 5453/2176/7 5452/2176/7 +f 5449/2176/7 5450/2176/7 5453/2176/7 +f 5450/2176/2743 5451/2176/2743 5453/2176/2743 +f 5450/2176/2743 5448/2176/2743 5451/2176/2743 +f 5454/2176/3708 5458/2176/3708 5457/2176/3708 +f 5454/2176/3708 5455/2176/3708 5458/2176/3708 +f 5455/2176/7 5459/2176/7 5458/2176/7 +f 5455/2176/7 5456/2176/7 5459/2176/7 +f 5456/2176/3709 5457/2176/3709 5459/2176/3709 +f 5456/2176/3709 5454/2176/3709 5457/2176/3709 +f 5460/2176/2742 5464/2176/2742 5463/2176/2742 +f 5460/2176/2742 5461/2176/2742 5464/2176/2742 +f 5461/2176/7 5465/2176/7 5464/2176/7 +f 5461/2176/7 5462/2176/7 5465/2176/7 +f 5462/2176/3711 5463/2176/3711 5465/2176/3711 +f 5462/2176/3711 5460/2176/3711 5463/2176/3711 +f 5466/2176/2742 5470/2176/2742 5469/2176/2742 +f 5466/2176/2742 5467/2176/2742 5470/2176/2742 +f 5467/2176/7 5471/2176/7 5470/2176/7 +f 5467/2176/7 5468/2176/7 5471/2176/7 +f 5468/2176/2743 5469/2176/2743 5471/2176/2743 +f 5468/2176/2743 5466/2176/2743 5469/2176/2743 +f 5472/2176/2742 5476/2176/2742 5475/2176/2742 +f 5472/2176/2742 5473/2176/2742 5476/2176/2742 +f 5473/2176/7 5477/2176/7 5476/2176/7 +f 5473/2176/7 5474/2176/7 5477/2176/7 +f 5474/2176/2743 5475/2176/2743 5477/2176/2743 +f 5474/2176/2743 5472/2176/2743 5475/2176/2743 +f 5478/2176/3712 5482/2176/3712 5481/2176/3712 +f 5478/2176/3712 5479/2176/3712 5482/2176/3712 +f 5479/2176/7 5483/2176/7 5482/2176/7 +f 5479/2176/7 5480/2176/7 5483/2176/7 +f 5480/2176/3711 5481/2176/3711 5483/2176/3711 +f 5480/2176/3711 5478/2176/3711 5481/2176/3711 +f 5484/2176/2742 5488/2176/2742 5487/2176/2742 +f 5484/2176/2742 5485/2176/2742 5488/2176/2742 +f 5485/2176/7 5489/2176/7 5488/2176/7 +f 5485/2176/7 5486/2176/7 5489/2176/7 +f 5486/2176/2743 5487/2176/2743 5489/2176/2743 +f 5486/2176/2743 5484/2176/2743 5487/2176/2743 +f 5490/2176/3712 5494/2176/3712 5493/2176/3712 +f 5490/2176/3712 5491/2176/3712 5494/2176/3712 +f 5491/2176/7 5495/2176/7 5494/2176/7 +f 5491/2176/7 5492/2176/7 5495/2176/7 +f 5492/2176/3711 5493/2176/3711 5495/2176/3711 +f 5492/2176/3711 5490/2176/3711 5493/2176/3711 +f 5496/2176/2742 5500/2176/2742 5499/2176/2742 +f 5496/2176/2742 5497/2176/2742 5500/2176/2742 +f 5497/2176/7 5501/2176/7 5500/2176/7 +f 5497/2176/7 5498/2176/7 5501/2176/7 +f 5498/2176/2743 5499/2176/2743 5501/2176/2743 +f 5498/2176/2743 5496/2176/2743 5499/2176/2743 +f 5502/2176/2742 5506/2176/2742 5505/2176/2742 +f 5502/2176/2742 5503/2176/2742 5506/2176/2742 +f 5503/2176/7 5507/2176/7 5506/2176/7 +f 5503/2176/7 5504/2176/7 5507/2176/7 +f 5504/2176/2743 5505/2176/2743 5507/2176/2743 +f 5504/2176/2743 5502/2176/2743 5505/2176/2743 +f 5508/2176/2742 5512/2176/2742 5511/2176/2742 +f 5508/2176/2742 5509/2176/2742 5512/2176/2742 +f 5509/2176/7 5513/2176/7 5512/2176/7 +f 5509/2176/7 5510/2176/7 5513/2176/7 +f 5510/2176/3713 5511/2176/3713 5513/2176/3713 +f 5510/2176/3713 5508/2176/3713 5511/2176/3713 +f 5514/2176/3714 5518/2176/3714 5517/2176/3714 +f 5514/2176/3714 5515/2176/3714 5518/2176/3714 +f 5515/2176/7 5519/2176/7 5518/2176/7 +f 5515/2176/7 5516/2176/7 5519/2176/7 +f 5516/2176/2743 5517/2176/2743 5519/2176/2743 +f 5516/2176/2743 5514/2176/2743 5517/2176/2743 +o diesflot +v -0.401193 0.055775 -3.209282 +v 1.604848 0.055775 -3.209282 +v -0.401193 0.055775 -3.580296 +v 1.604848 0.055775 -3.580296 +v -0.401193 0.078960 -3.209282 +v 1.604848 0.078960 -3.209282 +v -0.401193 0.078960 -3.580296 +v 1.604848 0.078960 -3.580296 +vt 1.000000 0.999999 +vt 1.000000 -0.000000 +vt -0.000000 0.000001 +vt 0.000000 1.000000 +s off +f 8514/2595/3 8516/2596/3 8517/2597/3 +f 8514/2595/3 8517/2597/3 8515/2598/3 +f 8518/2595/331 8519/2598/331 8521/2597/331 +f 8521/2597/331 8520/2596/331 8518/2595/331 +f 8514/2595/21 8515/2598/21 8519/2598/21 +f 8514/2595/21 8519/2598/21 8518/2595/21 +f 8515/2598/63 8517/2597/63 8521/2597/63 +f 8521/2597/63 8519/2598/63 8515/2598/63 +f 8517/2597/105 8516/2596/105 8520/2596/105 +f 8520/2596/105 8521/2597/105 8517/2597/105 +f 8516/2596/7 8514/2595/7 8518/2595/7 +f 8518/2595/7 8520/2596/7 8516/2596/7 +o diessta1 +v 0.407273 1.560407 -3.273475 +v 1.274506 0.079407 -3.273476 +v 0.407273 1.753628 -3.273475 +v 1.384322 0.078328 -3.273476 +v 0.407273 1.560407 -3.256104 +v 1.274506 0.079407 -3.256105 +v 0.407273 1.753628 -3.256104 +v 1.384322 0.078328 -3.256105 +vn -0.000002 -0.000001 1.000000 +vn -0.862937 -0.505312 -0.000000 +vn -0.009819 -0.999952 -0.000000 +vn 0.863826 0.503790 0.000000 +vn 0.863826 0.503791 -0.000000 +s off +f 8522//105 8524//105 8525//105 +f 8522//105 8525//105 8523//105 +f 8526//21 8527//21 8529//21 +f 8529//3715 8528//3715 8526//3715 +f 8522//3716 8523//3716 8527//3716 +f 8522//3716 8527//3716 8526//3716 +f 8523//3717 8525//3717 8529//3717 +f 8529//3717 8527//3717 8523//3717 +f 8525//3718 8524//3718 8528//3718 +f 8528//3719 8529//3719 8525//3719 +f 8524//7 8522//7 8526//7 +f 8526//7 8528//7 8524//7 +o diestowe +v 0.306703 1.715652 -3.136786 +v -0.241581 1.715652 -3.136786 +v 0.306703 1.645991 -3.136786 +v -0.241581 1.645991 -3.136786 +v 0.306703 1.715651 -3.088839 +v -0.241581 1.715652 -3.088839 +v 0.306703 1.645991 -3.088839 +v -0.241581 1.645991 -3.088839 +v -0.242075 1.624523 -3.136786 +v -0.242075 1.913041 -3.136786 +v -0.311735 1.624523 -3.136786 +v -0.311735 1.913041 -3.136786 +v -0.242075 1.624523 -3.088839 +v -0.242075 1.913041 -3.088839 +v -0.311735 1.624523 -3.088839 +v -0.311735 1.913041 -3.088839 +v -0.309031 1.914657 -3.136786 +v 0.374756 1.914657 -3.136786 +v -0.309031 1.971231 -3.136786 +v 0.374756 1.971231 -3.136786 +v -0.309031 1.914656 -3.088839 +v 0.374756 1.914657 -3.088839 +v -0.309031 1.971231 -3.088839 +v 0.374756 1.971231 -3.088839 +v 0.003541 1.825624 -3.136786 +v -0.241096 1.825624 -3.136786 +v 0.003541 1.786256 -3.136786 +v -0.241096 1.786256 -3.136786 +v 0.003541 1.825624 -3.088839 +v -0.241096 1.825624 -3.088839 +v 0.003541 1.786256 -3.088839 +v -0.241096 1.786256 -3.088839 +v 0.301138 1.825624 -3.136786 +v 0.056500 1.825624 -3.136786 +v 0.301138 1.786256 -3.136786 +v 0.056500 1.786256 -3.136786 +v 0.301138 1.825624 -3.088839 +v 0.056500 1.825624 -3.088839 +v 0.301138 1.786256 -3.088839 +v 0.056500 1.786256 -3.088839 +v 0.056593 1.719998 -3.136786 +v 0.056593 1.913041 -3.136786 +v 0.005808 1.719998 -3.136786 +v 0.005808 1.913041 -3.136786 +v 0.056593 1.719998 -3.088839 +v 0.056593 1.913041 -3.088839 +v 0.005808 1.719998 -3.088839 +v 0.005808 1.913041 -3.088839 +v 0.375739 1.624523 -3.136786 +v 0.375739 1.913041 -3.136786 +v 0.306079 1.624523 -3.136786 +v 0.306079 1.913041 -3.136786 +v 0.375739 1.624523 -3.088839 +v 0.375739 1.913041 -3.088839 +v 0.306079 1.624523 -3.088840 +v 0.306079 1.913041 -3.088839 +v -0.040921 1.566501 -3.265816 +v -0.312383 1.104840 -3.265816 +v -0.123557 1.567101 -3.265816 +v -0.312914 1.211838 -3.265815 +v -0.040921 1.566501 -3.219866 +v -0.312383 1.104840 -3.219866 +v -0.123557 1.567101 -3.219866 +v -0.312914 1.211838 -3.219866 +v -0.345949 0.126149 -3.273591 +v -0.345949 0.308024 -3.516224 +v -0.345949 0.190034 -3.273591 +v -0.345949 0.371909 -3.516224 +v -0.313570 0.126149 -3.273591 +v -0.313570 0.308024 -3.516224 +v -0.313570 0.190034 -3.273591 +v -0.313570 0.371909 -3.516224 +v -0.345949 0.606722 -3.273591 +v -0.345949 0.414207 -3.516224 +v -0.345949 0.672715 -3.273591 +v -0.345949 0.480200 -3.516224 +v -0.313570 0.606722 -3.273591 +v -0.313570 0.414207 -3.516224 +v -0.313570 0.672715 -3.273591 +v -0.313570 0.480200 -3.516224 +v -0.345949 0.726221 -3.273591 +v -0.345949 0.904923 -3.516224 +v -0.345949 0.790954 -3.273591 +v -0.345949 0.969656 -3.516224 +v -0.313570 0.726221 -3.273591 +v -0.313570 0.904923 -3.516224 +v -0.313570 0.790954 -3.273591 +v -0.313570 0.969656 -3.516224 +v -0.345949 1.193540 -3.273590 +v -0.345949 1.009300 -3.516224 +v -0.345949 1.262894 -3.273590 +v -0.345949 1.078654 -3.516224 +v -0.313570 1.193540 -3.273590 +v -0.313570 1.009300 -3.516224 +v -0.313570 1.262894 -3.273590 +v -0.313570 1.078654 -3.516224 +v -0.345949 1.328254 -3.273590 +v -0.345949 1.514726 -3.516224 +v -0.345949 1.391820 -3.273590 +v -0.345949 1.578292 -3.516224 +v -0.313570 1.328254 -3.273590 +v -0.313570 1.514726 -3.516224 +v -0.313570 1.391820 -3.273590 +v -0.313570 1.578292 -3.516224 +v -0.345400 1.914020 -3.704611 +v -0.345400 1.914020 -3.572824 +v -0.345400 1.969632 -3.704611 +v -0.345400 1.969632 -3.572824 +v -0.313363 1.914020 -3.704611 +v -0.313363 1.914020 -3.572824 +v -0.313363 1.969632 -3.704611 +v -0.313363 1.969632 -3.572824 +v -0.345401 0.082163 -3.572693 +v -0.345401 0.082162 -3.516119 +v -0.345400 1.969846 -3.572692 +v -0.345400 1.969846 -3.516118 +v -0.312896 0.082163 -3.572693 +v -0.312896 0.082162 -3.516119 +v -0.312896 1.969846 -3.572692 +v -0.312896 1.969846 -3.516118 +v -0.345400 1.914020 -3.085090 +v -0.345400 1.914020 -3.216877 +v -0.345400 1.969631 -3.085090 +v -0.345400 1.969631 -3.216877 +v -0.313363 1.914020 -3.085090 +v -0.313363 1.914020 -3.216877 +v -0.313363 1.969631 -3.085090 +v -0.313363 1.969631 -3.216877 +v -0.345401 0.082162 -3.217010 +v -0.345401 0.082162 -3.273584 +v -0.345400 1.969846 -3.217009 +v -0.345400 1.969846 -3.273583 +v -0.312896 0.082162 -3.217010 +v -0.312896 0.082162 -3.273584 +v -0.312896 1.969846 -3.217009 +v -0.312896 1.969846 -3.273583 +v 0.104214 1.566501 -3.265816 +v 0.375676 1.104840 -3.265816 +v 0.186850 1.567101 -3.265816 +v 0.376207 1.211838 -3.265815 +v 0.104214 1.566501 -3.219866 +v 0.375676 1.104840 -3.219866 +v 0.186850 1.567101 -3.219866 +v 0.376207 1.211838 -3.219865 +v -0.040922 1.566501 -3.569497 +v -0.312384 1.104840 -3.569497 +v -0.123558 1.567101 -3.569497 +v -0.312914 1.211838 -3.569497 +v -0.040922 1.566501 -3.523546 +v -0.312384 1.104840 -3.523546 +v -0.123558 1.567101 -3.523546 +v -0.312914 1.211839 -3.523546 +v 0.104214 1.566501 -3.569497 +v 0.375676 1.104840 -3.569497 +v 0.186850 1.567101 -3.569497 +v 0.376207 1.211838 -3.569497 +v 0.104214 1.566501 -3.523546 +v 0.375676 1.104840 -3.523546 +v 0.186850 1.567101 -3.523546 +v 0.376207 1.211838 -3.523546 +v 0.375967 0.126149 -3.273591 +v 0.375967 0.308025 -3.516224 +v 0.375967 0.190034 -3.273591 +v 0.375967 0.371910 -3.516224 +v 0.408347 0.126149 -3.273591 +v 0.408347 0.308025 -3.516224 +v 0.408347 0.190034 -3.273591 +v 0.408347 0.371910 -3.516224 +v 0.375967 0.606722 -3.273591 +v 0.375967 0.414207 -3.516224 +v 0.375967 0.672715 -3.273591 +v 0.375967 0.480200 -3.516224 +v 0.408347 0.606722 -3.273591 +v 0.408347 0.414207 -3.516224 +v 0.408347 0.672715 -3.273591 +v 0.408347 0.480200 -3.516224 +v 0.375967 0.726221 -3.273591 +v 0.375967 0.904923 -3.516224 +v 0.375967 0.790954 -3.273591 +v 0.375967 0.969656 -3.516224 +v 0.408347 0.726221 -3.273591 +v 0.408347 0.904923 -3.516224 +v 0.408347 0.790954 -3.273591 +v 0.408348 0.969656 -3.516224 +v 0.375967 1.193540 -3.273590 +v 0.375967 1.009300 -3.516224 +v 0.375967 1.262894 -3.273590 +v 0.375967 1.078654 -3.516224 +v 0.408348 1.193540 -3.273590 +v 0.408348 1.009300 -3.516224 +v 0.408348 1.262894 -3.273590 +v 0.408348 1.078654 -3.516224 +v 0.375967 1.328254 -3.273590 +v 0.375967 1.514726 -3.516224 +v 0.375967 1.391820 -3.273590 +v 0.375967 1.578292 -3.516224 +v 0.408347 1.328254 -3.273590 +v 0.408347 1.514726 -3.516224 +v 0.408348 1.391820 -3.273590 +v 0.408348 1.578292 -3.516224 +v 0.376516 1.914020 -3.704611 +v 0.376516 1.914020 -3.572824 +v 0.376516 1.969632 -3.704611 +v 0.376516 1.969631 -3.572824 +v 0.408554 1.914020 -3.704611 +v 0.408554 1.914020 -3.572824 +v 0.408554 1.969632 -3.704611 +v 0.408554 1.969631 -3.572824 +v 0.376516 0.082163 -3.572693 +v 0.376516 0.082163 -3.516119 +v 0.376516 1.969846 -3.572692 +v 0.376516 1.969846 -3.516118 +v 0.409021 0.082163 -3.572693 +v 0.409021 0.082163 -3.516119 +v 0.409021 1.969846 -3.572692 +v 0.409021 1.969846 -3.516118 +v 0.376516 1.914020 -3.085090 +v 0.376516 1.914020 -3.216877 +v 0.376516 1.969631 -3.085090 +v 0.376516 1.969631 -3.216877 +v 0.408554 1.914020 -3.085090 +v 0.408554 1.914020 -3.216877 +v 0.408554 1.969631 -3.085090 +v 0.408554 1.969631 -3.216877 +v 0.376516 0.082163 -3.217010 +v 0.376516 0.082163 -3.273584 +v 0.376516 1.969846 -3.217009 +v 0.376516 1.969846 -3.273583 +v 0.409021 0.082163 -3.217010 +v 0.409021 0.082163 -3.273584 +v 0.409021 1.969846 -3.217009 +v 0.409021 1.969846 -3.273583 +v 0.306702 1.715652 -3.704375 +v -0.241581 1.715652 -3.704375 +v 0.306702 1.645991 -3.704375 +v -0.241581 1.645992 -3.704375 +v 0.306702 1.715652 -3.656428 +v -0.241581 1.715652 -3.656428 +v 0.306702 1.645991 -3.656428 +v -0.241581 1.645992 -3.656428 +v -0.242075 1.624523 -3.704375 +v -0.242075 1.913041 -3.704374 +v -0.311735 1.624523 -3.704375 +v -0.311735 1.913041 -3.704374 +v -0.242075 1.624523 -3.656428 +v -0.242075 1.913041 -3.656428 +v -0.311735 1.624523 -3.656428 +v -0.311735 1.913041 -3.656428 +v -0.309031 1.914657 -3.704374 +v 0.374756 1.914657 -3.704374 +v -0.309031 1.971231 -3.704374 +v 0.374756 1.971231 -3.704374 +v -0.309031 1.914657 -3.656428 +v 0.374756 1.914657 -3.656428 +v -0.309031 1.971231 -3.656428 +v 0.374756 1.971231 -3.656428 +v 0.003541 1.825624 -3.704375 +v -0.241096 1.825624 -3.704375 +v 0.003541 1.786256 -3.704375 +v -0.241096 1.786256 -3.704375 +v 0.003541 1.825624 -3.656428 +v -0.241096 1.825624 -3.656428 +v 0.003541 1.786256 -3.656428 +v -0.241096 1.786256 -3.656428 +v 0.301138 1.825624 -3.704375 +v 0.056500 1.825624 -3.704375 +v 0.301138 1.786256 -3.704375 +v 0.056500 1.786256 -3.704375 +v 0.301138 1.825624 -3.656428 +v 0.056500 1.825624 -3.656428 +v 0.301138 1.786256 -3.656428 +v 0.056500 1.786256 -3.656428 +v 0.056593 1.719998 -3.704375 +v 0.056593 1.913041 -3.704375 +v 0.005808 1.719998 -3.704375 +v 0.005808 1.913041 -3.704375 +v 0.056593 1.719998 -3.656428 +v 0.056593 1.913041 -3.656428 +v 0.005808 1.719998 -3.656428 +v 0.005808 1.913041 -3.656428 +v 0.375739 1.624523 -3.704375 +v 0.375739 1.913041 -3.704375 +v 0.306079 1.624523 -3.704375 +v 0.306079 1.913041 -3.704375 +v 0.375739 1.624523 -3.656428 +v 0.375739 1.913041 -3.656428 +v 0.306079 1.624523 -3.656428 +v 0.306079 1.913041 -3.656428 +v 1.370150 0.081107 -3.523300 +v 1.340369 0.149246 -3.517422 +v 0.997722 0.738212 -3.517422 +v 0.697908 1.253554 -3.517422 +v 1.370150 0.081107 -3.504046 +v 1.340369 0.149246 -3.504046 +v 1.033800 0.676198 -3.504045 +v 0.997722 0.738212 -3.504045 +v 0.734028 1.191466 -3.504045 +v 0.697908 1.253554 -3.504045 +v 1.340369 0.149246 -3.523300 +v 1.033800 0.676197 -3.523300 +v 0.997722 0.738212 -3.523300 +v 0.734028 1.191466 -3.523300 +v 0.697908 1.253554 -3.523300 +v 1.340345 0.484758 -3.523300 +v 1.370128 0.425825 -3.523300 +v 0.990942 1.086166 -3.523300 +v 1.027019 1.024152 -3.523300 +v 0.691127 1.601508 -3.523300 +v 0.727248 1.539420 -3.523300 +v 1.370128 0.425825 -3.504045 +v 1.340345 0.484758 -3.504045 +v 1.027019 1.024152 -3.504045 +v 0.990942 1.086166 -3.504045 +v 0.727248 1.539420 -3.504045 +v 0.691127 1.601508 -3.504045 +v 1.340345 0.484758 -3.517422 +v 1.370128 0.425825 -3.517422 +v 0.990942 1.086166 -3.517422 +v 0.691127 1.601508 -3.517422 +v 1.340480 0.543128 -3.517422 +v 1.370263 0.484195 -3.517422 +v 1.340480 0.543128 -3.504045 +v 1.370263 0.484195 -3.504045 +v 0.990401 1.145780 -3.517422 +v 1.026478 1.083765 -3.523300 +v 0.990401 1.145780 -3.504045 +v 1.026478 1.083765 -3.504045 +v 0.690587 1.661121 -3.523300 +v 0.726706 1.599034 -3.523300 +v 0.690587 1.661121 -3.504045 +v 0.726706 1.599034 -3.504045 +v 1.340480 0.543128 -3.523300 +v 1.370263 0.484195 -3.523300 +v 0.990401 1.145780 -3.523300 +v 0.508759 1.969596 -3.517422 +v 0.508759 1.969596 -3.504045 +v 0.508759 1.969596 -3.523300 +v 0.493598 1.938539 -3.504045 +v 0.493598 1.938539 -3.517422 +v 0.493598 1.938539 -3.523300 +v 0.409109 1.937471 -3.504045 +v 0.409109 1.937471 -3.517422 +v 0.409105 1.969562 -3.517422 +v 0.409105 1.969561 -3.504045 +v 0.409109 1.937471 -3.523300 +v 0.409105 1.969562 -3.523300 +v 1.480814 0.287450 -3.504046 +v 1.480814 0.287450 -3.517422 +v 1.480814 0.287450 -3.523300 +v 1.447263 0.290953 -3.517422 +v 1.447263 0.290953 -3.504046 +v 1.447263 0.290953 -3.523300 +v 1.432788 0.273403 -3.517422 +v 1.432788 0.273403 -3.504046 +v 1.454261 0.251148 -3.504046 +v 1.454261 0.251148 -3.517422 +v 1.432788 0.273403 -3.523300 +v 1.454261 0.251148 -3.523300 +v 1.370149 0.081107 -3.261425 +v 1.340369 0.149246 -3.261425 +v 0.997722 0.738212 -3.261425 +v 0.697908 1.253554 -3.261425 +v 1.370149 0.081107 -3.274242 +v 1.340369 0.149246 -3.274242 +v 1.033800 0.676197 -3.274242 +v 0.997722 0.738212 -3.274242 +v 0.734028 1.191466 -3.274241 +v 0.697908 1.253554 -3.274241 +v 1.370149 0.081107 -3.255793 +v 1.340369 0.149246 -3.255793 +v 1.033800 0.676197 -3.255793 +v 0.997722 0.738212 -3.255793 +v 0.734028 1.191466 -3.255793 +v 0.697908 1.253554 -3.255793 +v 1.340345 0.484759 -3.255793 +v 1.370128 0.425825 -3.255793 +v 0.990941 1.086166 -3.255793 +v 1.027019 1.024152 -3.255793 +v 0.691127 1.601508 -3.255793 +v 0.727247 1.539420 -3.255793 +v 1.370128 0.425825 -3.274241 +v 1.340345 0.484759 -3.274241 +v 1.027019 1.024152 -3.274241 +v 0.990941 1.086166 -3.274241 +v 0.727247 1.539420 -3.274241 +v 0.691127 1.601508 -3.274241 +v 1.340345 0.484759 -3.261425 +v 1.370128 0.425825 -3.261425 +v 0.990941 1.086166 -3.261425 +v 0.691127 1.601508 -3.261425 +v 1.340480 0.543128 -3.261425 +v 1.370263 0.484195 -3.261425 +v 1.340480 0.543128 -3.274242 +v 1.370263 0.484195 -3.274241 +v 0.990401 1.145780 -3.261425 +v 1.026478 1.083765 -3.255793 +v 0.990401 1.145780 -3.274241 +v 1.026478 1.083765 -3.274241 +v 0.690587 1.661121 -3.255793 +v 0.726706 1.599034 -3.255793 +v 0.690587 1.661121 -3.274241 +v 0.726706 1.599034 -3.274241 +v 1.340480 0.543128 -3.255793 +v 1.370263 0.484195 -3.255793 +v 0.990401 1.145780 -3.255793 +v 0.508759 1.969596 -3.261425 +v 0.508759 1.969596 -3.274241 +v 0.508759 1.969596 -3.255793 +v 0.493598 1.938539 -3.274241 +v 0.493598 1.938539 -3.261425 +v 0.493598 1.938539 -3.255793 +v 0.409109 1.937471 -3.274241 +v 0.409109 1.937471 -3.261425 +v 0.409105 1.969561 -3.261425 +v 0.409105 1.969561 -3.274241 +v 0.409109 1.937471 -3.255793 +v 0.409105 1.969561 -3.255793 +v 1.480813 0.287450 -3.274241 +v 1.480813 0.287450 -3.261425 +v 1.480813 0.287450 -3.255793 +v 1.447263 0.290952 -3.261425 +v 1.447263 0.290952 -3.274241 +v 1.447263 0.290953 -3.255793 +v 1.432788 0.273403 -3.261425 +v 1.432788 0.273403 -3.274242 +v 1.454261 0.251148 -3.274242 +v 1.454261 0.251148 -3.261425 +v 1.432788 0.273403 -3.255793 +v 1.454261 0.251148 -3.255793 +v -0.345949 1.078654 -3.516224 +v -0.345949 1.193540 -3.273590 +v -0.313570 1.078654 -3.516224 +v -0.313570 1.193540 -3.273590 +v -0.345949 1.193540 -3.273590 +v -0.345949 1.193540 -3.273590 +v -0.313570 1.078654 -3.516224 +v -0.345400 1.969846 -3.572692 +v -0.345400 1.969846 -3.516118 +v -0.312896 1.969846 -3.572692 +v -0.312896 1.969846 -3.516118 +v -0.312896 1.969846 -3.572692 +v -0.345400 1.969846 -3.516118 +v -0.345400 1.969846 -3.273583 +v -0.345400 1.969846 -3.217009 +v -0.312896 1.969846 -3.217009 +v -0.312896 1.969846 -3.217009 +v -0.312896 1.969846 -3.273583 +v -0.345400 1.969846 -3.273583 +v 0.375967 1.078654 -3.516224 +v 0.375967 1.193540 -3.273590 +v 0.408348 1.078654 -3.516224 +v 0.408348 1.193540 -3.273590 +v 0.375967 1.193540 -3.273590 +v 0.375967 1.193540 -3.273590 +v 0.408348 1.078654 -3.516224 +v 0.376516 1.969846 -3.572692 +v 0.376516 1.969846 -3.516118 +v 0.409021 1.969846 -3.572692 +v 0.409021 1.969846 -3.516118 +v 0.409021 1.969846 -3.572692 +v 0.376516 1.969846 -3.516118 +v 0.376516 1.969846 -3.273583 +v 0.376516 1.969846 -3.217009 +v 0.409021 1.969846 -3.217009 +v 0.409021 1.969846 -3.217009 +v 0.409021 1.969846 -3.273583 +v 0.376516 1.969846 -3.273583 +vt 0.821799 0.523678 +vt 0.828666 0.525755 +vt 0.914218 0.515038 +vt 0.906572 0.514589 +vt 0.821799 0.528056 +vt 0.906572 0.517295 +vt 0.914218 0.517827 +vt 0.828666 0.530513 +vt 0.916711 0.515167 +vt 0.922278 0.514240 +vt 0.893839 0.512671 +vt 0.887398 0.513311 +vt 0.916711 0.517980 +vt 0.887398 0.515780 +vt 0.893839 0.515022 +vt 0.922278 0.516881 +vt 0.893459 0.512686 +vt 0.888648 0.512377 +vt 0.790660 0.518585 +vt 0.793128 0.519683 +vt 0.893459 0.515040 +vt 0.793128 0.523328 +vt 0.790660 0.522027 +vt 0.888648 0.514673 +vt 0.866947 0.516851 +vt 0.870954 0.517314 +vt 0.899244 0.514136 +vt 0.895383 0.513881 +vt 0.866947 0.519974 +vt 0.895383 0.516456 +vt 0.899244 0.516758 +vt 0.870954 0.520523 +vt 0.814192 0.520878 +vt 0.817143 0.521779 +vt 0.863148 0.518098 +vt 0.859190 0.517571 +vt 0.814192 0.524743 +vt 0.859190 0.520827 +vt 0.863148 0.521451 +vt 0.817143 0.525810 +vt 0.870350 0.519032 +vt 0.877889 0.518162 +vt 0.858475 0.515900 +vt 0.851177 0.516474 +vt 0.870350 0.522557 +vt 0.851177 0.519528 +vt 0.858475 0.518848 +vt 0.877889 0.521527 +vt 0.811983 0.528026 +vt 0.831193 0.526444 +vt 0.807452 0.519148 +vt 0.792993 0.519723 +vt 0.811983 0.533198 +vt 0.792993 0.523376 +vt 0.807452 0.522694 +vt 0.831193 0.531328 +vt 0.912700 0.508757 +vt 0.903517 0.509579 +vt 0.974031 0.507949 +vt 0.988909 0.508041 +vt 0.988909 0.510902 +vt 0.903517 0.512987 +vt 0.974031 0.510777 +vt 0.912700 0.511873 +vt 0.104351 0.505784 +vt 0.098746 0.505937 +vt 0.081143 0.493625 +vt 0.087608 0.493775 +vt 0.107140 0.505915 +vt 0.090190 0.493611 +vt 0.083613 0.493449 +vt 0.101479 0.506079 +vt 0.054781 0.506869 +vt 0.046689 0.506985 +vt 0.069482 0.493381 +vt 0.076692 0.493528 +vt 0.056631 0.507091 +vt 0.079076 0.493343 +vt 0.071709 0.493184 +vt 0.048303 0.507219 +vt 0.039938 0.507068 +vt 0.031572 0.507154 +vt 0.007681 0.492705 +vt 0.016433 0.492735 +vt 0.041342 0.507311 +vt 0.017032 0.492471 +vt 0.007963 0.492438 +vt 0.032701 0.507406 +vt 0.977388 0.507223 +vt 0.968230 0.507152 +vt 0.992866 0.492704 +vt -0.007134 0.492704 +vt 0.002294 0.492697 +vt -0.022612 0.507223 +vt -0.023431 0.507483 +vt 0.002379 0.492429 +vt -0.007396 0.492436 +vt 0.992604 0.492436 +vt 0.967095 0.507404 +vt 0.976569 0.507483 +vt 0.959789 0.507065 +vt 0.951796 0.506965 +vt 0.929832 0.493395 +vt 0.937050 0.493260 +vt 0.958377 0.507308 +vt 0.934982 0.493051 +vt 0.927590 0.493198 +vt 0.950136 0.507197 +vt 0.891955 0.485492 +vt 0.896648 0.485154 +vt 0.891955 0.491661 +vt 0.896648 0.491466 +vt 0.893897 0.491273 +vt 0.893897 0.484818 +vt 0.889167 0.491481 +vt 0.889167 0.485180 +vt -0.108062 0.491667 +vt 0.108089 0.491669 +vt -0.108062 0.494317 +vt 0.108089 0.494318 +vt 0.110920 0.494194 +vt 0.110920 0.491486 +vt -0.110893 0.494193 +vt -0.110893 0.491485 +vt 0.891938 0.491667 +vt 0.891938 0.494317 +vt 0.889107 0.491485 +vt 0.889107 0.494193 +vt 0.896648 0.514846 +vt 0.891955 0.514508 +vt 0.891955 0.508339 +vt 0.896648 0.508534 +vt 0.893897 0.515182 +vt 0.893897 0.508727 +vt 0.889167 0.508519 +vt 0.889167 0.514820 +vt 0.108089 0.508331 +vt -0.108062 0.508333 +vt -0.108062 0.505683 +vt 0.108089 0.505682 +vt 0.110920 0.508514 +vt 0.110920 0.505806 +vt -0.110893 0.505807 +vt -0.110893 0.508515 +vt 0.891938 0.505683 +vt 0.891938 0.508333 +vt 0.889107 0.508515 +vt 0.889107 0.505807 +vt 0.882447 0.511318 +vt 0.866748 0.512472 +vt 0.896781 0.529478 +vt 0.950673 0.535086 +vt 0.882447 0.515343 +vt 0.950673 0.547420 +vt 0.896781 0.539879 +vt 0.866748 0.516906 +vt 0.912700 0.488150 +vt 0.903517 0.487038 +vt 0.974031 0.489244 +vt 0.988909 0.489119 +vt 0.988909 0.491980 +vt 0.903517 0.490446 +vt 0.974031 0.492072 +vt 0.912700 0.491266 +vt 0.882447 0.484687 +vt 0.866748 0.483127 +vt 0.896781 0.460197 +vt 0.950673 0.452671 +vt 0.882447 0.488712 +vt 0.950673 0.465006 +vt 0.896781 0.470599 +vt 0.866748 0.487561 +vt 0.207654 0.509152 +vt 0.204586 0.509797 +vt 0.192914 0.487773 +vt 0.197618 0.488741 +vt 0.214559 0.509251 +vt 0.205991 0.488555 +vt 0.201940 0.487533 +vt 0.211949 0.509919 +vt 0.165783 0.517557 +vt 0.153447 0.519823 +vt 0.182799 0.485729 +vt 0.189329 0.487043 +vt 0.178016 0.518292 +vt 0.198836 0.486756 +vt 0.193140 0.485343 +vt 0.166757 0.520900 +vt 0.140904 0.522004 +vt 0.121666 0.525076 +vt 0.036040 0.466170 +vt 0.073066 0.468861 +vt 0.155016 0.523506 +vt 0.085415 0.464109 +vt 0.043051 0.459800 +vt 0.136369 0.527371 +vt 0.904700 0.528680 +vt 0.877825 0.524999 +vt 0.966451 0.466053 +vt -0.033549 0.466053 +vt 0.010929 0.465372 +vt -0.095300 0.528680 +vt -0.109429 0.532270 +vt 0.013144 0.458441 +vt -0.040115 0.459603 +vt 0.959885 0.459603 +vt 0.863127 0.527271 +vt 0.890571 0.532270 +vt 0.858543 0.521911 +vt 0.844039 0.519371 +vt 0.816537 0.485862 +vt 0.824053 0.484377 +vt 0.844460 0.523392 +vt 0.812898 0.483867 +vt 0.806278 0.485487 +vt 0.830927 0.520372 +vt 0.790370 0.477655 +vt 0.792782 0.476356 +vt 0.790370 0.487148 +vt 0.792782 0.486399 +vt 0.785866 0.486249 +vt 0.785866 0.476097 +vt 0.783817 0.487022 +vt 0.783817 0.477436 +vt -0.209639 0.487160 +vt 0.209652 0.487164 +vt -0.209639 0.491242 +vt 0.209652 0.491245 +vt 0.216299 0.491158 +vt 0.216299 0.487037 +vt -0.216287 0.491155 +vt -0.216287 0.487032 +vt 0.790361 0.487160 +vt 0.790361 0.491242 +vt 0.783713 0.487032 +vt 0.783713 0.491155 +vt 0.792782 0.523644 +vt 0.790370 0.522345 +vt 0.790370 0.512852 +vt 0.792782 0.513601 +vt 0.785866 0.523903 +vt 0.785866 0.513751 +vt 0.783817 0.512978 +vt 0.783817 0.522564 +vt 0.209652 0.512836 +vt -0.209639 0.512840 +vt -0.209639 0.508758 +vt 0.209652 0.508755 +vt 0.216299 0.512963 +vt 0.216299 0.508842 +vt -0.216287 0.508845 +vt -0.216287 0.512968 +vt 0.790361 0.508758 +vt 0.790361 0.512840 +vt 0.783713 0.512968 +vt 0.783713 0.508845 +vt 0.821799 0.471624 +vt 0.828666 0.469139 +vt 0.914218 0.481969 +vt 0.906572 0.482507 +vt 0.821799 0.476001 +vt 0.906572 0.485212 +vt 0.914218 0.484758 +vt 0.828666 0.473896 +vt 0.916711 0.481814 +vt 0.922278 0.482925 +vt 0.893839 0.484806 +vt 0.887398 0.484039 +vt 0.916711 0.484626 +vt 0.887398 0.486508 +vt 0.893839 0.487157 +vt 0.922278 0.485566 +vt 0.893459 0.484788 +vt 0.888648 0.485158 +vt 0.790660 0.477720 +vt 0.793128 0.476405 +vt 0.893459 0.487142 +vt 0.793128 0.480050 +vt 0.790660 0.481163 +vt 0.888648 0.487455 +vt 0.866947 0.479797 +vt 0.870954 0.479242 +vt 0.899244 0.483050 +vt 0.895383 0.483356 +vt 0.866947 0.482920 +vt 0.895383 0.485931 +vt 0.899244 0.485672 +vt 0.870954 0.482451 +vt 0.814192 0.474974 +vt 0.817143 0.473895 +vt 0.863148 0.478303 +vt 0.859190 0.478934 +vt 0.814192 0.478838 +vt 0.859190 0.482190 +vt 0.863148 0.481656 +vt 0.817143 0.477925 +vt 0.870350 0.477185 +vt 0.877889 0.478226 +vt 0.858475 0.480936 +vt 0.851177 0.480249 +vt 0.870350 0.480710 +vt 0.851177 0.483302 +vt 0.858475 0.483884 +vt 0.877889 0.481591 +vt 0.811983 0.466424 +vt 0.831193 0.468315 +vt 0.807452 0.477046 +vt 0.792993 0.476357 +vt 0.811983 0.471595 +vt 0.792993 0.480009 +vt 0.807452 0.480592 +vt 0.831193 0.473198 +vt 0.422813 0.492577 +vt 0.427775 0.492168 +vt 0.427775 0.493022 +vt 0.422813 0.493386 +vt 0.515538 0.484703 +vt 0.534578 0.484457 +vt 0.534578 0.486151 +vt 0.515538 0.486993 +vt 0.695542 0.485136 +vt 0.711239 0.486183 +vt 0.711239 0.488252 +vt 0.695542 0.487361 +vt 0.427775 0.491792 +vt 0.422813 0.492221 +vt 0.534578 0.483713 +vt 0.381713 0.493524 +vt 0.384644 0.493162 +vt 0.415898 0.492405 +vt 0.420363 0.491986 +vt 0.415665 0.486943 +vt 0.423384 0.485465 +vt 0.499455 0.484648 +vt 0.517529 0.483443 +vt 0.604883 0.466614 +vt 0.649112 0.468055 +vt 0.689591 0.483644 +vt 0.707225 0.484853 +vt 0.384644 0.494187 +vt 0.381713 0.494495 +vt 0.420363 0.493187 +vt 0.415898 0.493543 +vt 0.423384 0.487642 +vt 0.415665 0.488899 +vt 0.517529 0.485922 +vt 0.499455 0.486947 +vt 0.649112 0.472818 +vt 0.604883 0.471590 +vt 0.707225 0.487121 +vt 0.689591 0.486093 +vt 0.384644 0.493475 +vt 0.420363 0.492353 +vt 0.415898 0.492752 +vt 0.423384 0.486129 +vt 0.517529 0.484200 +vt 0.649112 0.469507 +vt 0.707225 0.485546 +vt 0.405062 0.494262 +vt 0.405062 0.493559 +vt 0.404720 0.494409 +vt 0.404720 0.493724 +vt 0.405062 0.493251 +vt 0.404720 0.493424 +vt 0.762654 0.491877 +vt 0.762654 0.490882 +vt 0.762654 0.490445 +vt 0.766441 0.490592 +vt 0.766441 0.491619 +vt 0.766441 0.490141 +vt 0.784854 0.490757 +vt 0.784854 0.491765 +vt 0.783705 0.492033 +vt 0.783705 0.491057 +vt 0.784854 0.490314 +vt 0.783705 0.490628 +vt 0.410375 0.493763 +vt 0.410375 0.494444 +vt 0.410375 0.493464 +vt 0.408011 0.494286 +vt 0.408011 0.493587 +vt 0.408011 0.493279 +vt 0.427775 0.508526 +vt 0.422813 0.508081 +vt 0.427775 0.507707 +vt 0.422813 0.507305 +vt 0.534578 0.516917 +vt 0.515538 0.516558 +vt 0.534578 0.515295 +vt 0.515538 0.514365 +vt 0.711239 0.514957 +vt 0.695542 0.516090 +vt 0.711239 0.512975 +vt 0.695542 0.513958 +vt 0.427775 0.508885 +vt 0.422813 0.508422 +vt 0.534578 0.517630 +vt 0.384644 0.507402 +vt 0.381713 0.507010 +vt 0.415898 0.508222 +vt 0.420363 0.508675 +vt 0.423384 0.515733 +vt 0.415665 0.514134 +vt 0.499455 0.516617 +vt 0.517529 0.517921 +vt 0.649112 0.534564 +vt 0.604883 0.536121 +vt 0.689591 0.517704 +vt 0.707225 0.516395 +vt 0.381713 0.506081 +vt 0.384644 0.506421 +vt 0.420363 0.507525 +vt 0.415898 0.507132 +vt 0.415665 0.512261 +vt 0.423384 0.513649 +vt 0.517529 0.515548 +vt 0.499455 0.514416 +vt 0.604883 0.531362 +vt 0.649112 0.530007 +vt 0.707225 0.514223 +vt 0.689591 0.515359 +vt 0.384644 0.507103 +vt 0.420363 0.508324 +vt 0.381713 0.506727 +vt 0.415898 0.507889 +vt 0.423384 0.515097 +vt 0.517529 0.517197 +vt 0.649112 0.533174 +vt 0.707225 0.515732 +vt 0.405062 0.507011 +vt 0.405062 0.506338 +vt 0.404720 0.506175 +vt 0.404720 0.506831 +vt 0.405062 0.507307 +vt 0.404720 0.507119 +vt 0.762654 0.508972 +vt 0.762654 0.509925 +vt 0.762654 0.510344 +vt 0.766441 0.510240 +vt 0.766441 0.509257 +vt 0.766441 0.510672 +vt 0.784854 0.510061 +vt 0.784854 0.509095 +vt 0.783705 0.508800 +vt 0.783705 0.509734 +vt 0.784854 0.510485 +vt 0.783705 0.510145 +vt 0.410375 0.506789 +vt 0.410375 0.506137 +vt 0.410375 0.507076 +vt 0.408011 0.506311 +vt 0.408011 0.506981 +vt 0.408011 0.507276 +vn 0.000000 -0.000004 1.000000 +vn -0.000003 -0.000001 1.000000 +vn -0.000000 -0.000001 -1.000000 +vn -0.000007 0.000004 -1.000000 +vn 0.000003 -0.000002 1.000000 +vn 0.862019 -0.506876 0.000000 +vn -0.999988 -0.004955 0.000000 +vn -0.882474 0.470362 0.000000 +vn 0.007253 0.999974 0.000000 +vn -0.000000 -0.800158 -0.599790 +vn 0.000000 0.800158 0.599790 +vn 0.000000 -0.783369 0.621556 +vn 0.000000 0.783370 -0.621556 +vn 0.000001 -0.805183 -0.593026 +vn -0.000001 0.805183 0.593027 +vn -0.000000 0.805183 0.593027 +vn 0.000000 -0.796418 0.604747 +vn 0.000000 0.796417 -0.604747 +vn -0.000000 -0.792891 -0.609363 +vn -0.000003 -0.792891 -0.609363 +vn 0.000000 0.792891 0.609363 +vn 0.000004 0.000002 -1.000000 +vn -0.000004 -0.000002 1.000000 +vn -0.000000 0.000001 1.000000 +vn -0.862019 -0.506876 -0.000000 +vn -0.862019 -0.506876 -0.000001 +vn 0.999988 -0.004955 0.000000 +vn 0.882473 0.470363 0.000000 +vn -0.007253 0.999974 0.000003 +vn -0.007255 0.999974 0.000000 +vn -0.999988 -0.004958 0.000000 +vn -0.882473 0.470363 0.000000 +vn -0.882473 0.470363 -0.000001 +vn 0.007255 0.999974 0.000000 +vn -0.007253 0.999974 0.000000 +vn -0.000000 -0.800157 -0.599790 +vn 1.000000 0.000006 -0.000005 +vn 0.000000 -0.783370 0.621556 +vn 0.000000 0.783369 -0.621557 +vn 1.000000 -0.000006 -0.000004 +vn -0.000000 -0.805183 -0.593026 +vn 1.000000 -0.000006 -0.000005 +vn 1.000000 -0.000007 -0.000005 +vn 0.000000 0.000004 -1.000000 +vn 0.892503 0.451040 0.000000 +vn 0.892504 0.451040 -0.000000 +vn 0.864368 0.502860 -0.000023 +vn 0.864371 0.502855 -0.000000 +vn 0.864371 0.502854 0.000000 +vn 0.864369 0.502859 0.000000 +vn -0.000001 -0.000001 -1.000000 +vn -0.000007 -0.000000 -1.000000 +vn -0.000001 -0.000001 1.000000 +vn 0.000001 0.000001 1.000000 +vn -1.000000 -0.000071 -0.000000 +vn 1.000000 0.000063 -0.000000 +vn 0.999810 0.019483 0.000000 +vn -0.999810 -0.019482 -0.000000 +vn 0.999810 0.019482 0.000000 +vn -0.719633 -0.694354 0.000000 +vn -0.000007 -0.000004 1.000000 +vn 0.000007 0.000000 1.000000 +vn -0.719634 -0.694354 0.000000 +vn 0.861480 0.507792 -0.000000 +vn 0.861480 0.507792 -0.000005 +vn -0.862743 -0.505642 -0.000000 +vn -0.862743 -0.505642 0.000005 +vn -0.000006 -0.000004 1.000000 +vn 0.000007 0.000004 -1.000000 +vn 0.012634 -0.999920 0.000009 +vn 0.012635 -0.999920 0.000000 +vn -0.000346 1.000000 -0.000009 +vn -0.000343 1.000000 0.000009 +vn 0.012634 -0.999920 0.000000 +vn -0.000343 1.000000 0.000000 +vn 0.864731 0.502235 -0.000000 +vn 0.864362 0.502869 -0.000023 +vn 0.864363 0.502869 0.000000 +vn -0.864698 -0.502291 -0.000000 +vn -0.864363 -0.502869 -0.000000 +vn 0.871800 0.489863 0.000000 +vn -0.868064 -0.496453 -0.000004 +vn -0.868064 -0.496452 -0.000000 +vn 0.000002 -0.000000 1.000000 +vn -0.771453 0.636287 0.000000 +vn 0.807143 -0.590356 0.000000 +vn 0.892506 0.451036 0.000000 +vn 0.864369 0.502857 0.000000 +vn 0.864370 0.502857 0.000000 +vn 0.000006 -0.000001 1.000000 +vn 0.000003 0.000001 -1.000000 +vn 1.000000 0.000062 -0.000000 +vn 1.000000 0.000063 0.000028 +vn 0.999810 0.019484 0.000000 +vn -0.999810 -0.019483 -0.000000 +vn -0.000008 -0.000004 -1.000000 +vn 0.000008 -0.000000 -1.000000 +vn -0.719630 -0.694358 0.000000 +vn 0.000000 0.000004 1.000000 +vn -0.862744 -0.505641 -0.000005 +vn -0.862744 -0.505641 0.000000 +vn 0.000003 0.000000 1.000000 +vn 0.012638 -0.999920 0.000000 +vn -0.000348 1.000000 0.000000 +vn 0.864731 0.502236 -0.000000 +vn -0.864698 -0.502292 -0.000000 +vn -0.864363 -0.502869 0.000005 +vn -0.000007 -0.000004 -1.000000 +vn 0.000008 0.000004 1.000000 +vn -0.000008 -0.000004 1.000000 +vn -0.000001 -0.000000 1.000000 +vn -0.868065 -0.496451 -0.000024 +vn -0.868064 -0.496452 -0.000011 +vn -0.868064 -0.496453 0.000011 +vn 0.000001 0.000006 -1.000000 +vn 0.000008 0.000007 -1.000000 +vn 0.807148 -0.590349 0.000000 +vn -0.771453 0.636287 -0.000013 +vn -0.771455 0.636284 0.000000 +s off +f 8530/2599/105 8532/2600/105 8533/2601/105 +f 8530/2599/105 8533/2601/105 8531/2602/105 +f 8534/2603/21 8535/2604/21 8537/2605/21 +f 8537/2605/21 8536/2606/21 8534/2603/21 +f 8530/2599/331 8531/2602/331 8535/2604/331 +f 8530/2599/933 8535/2604/933 8534/2603/933 +f 8533/2601/3 8532/2600/3 8536/2606/3 +f 8536/2606/2204 8537/2605/2204 8533/2601/2204 +f 8538/2607/353 8540/2608/353 8541/2609/353 +f 8541/2609/353 8539/2610/353 8538/2607/353 +f 8542/2611/21 8543/2612/21 8545/2613/21 +f 8545/2613/21 8544/2614/21 8542/2611/21 +f 8538/2607/63 8539/2610/63 8543/2612/63 +f 8543/2612/63 8542/2611/63 8538/2607/63 +f 8541/2609/2231 8540/2608/2231 8544/2614/2231 +f 8544/2614/2231 8545/2613/2231 8541/2609/2231 +f 8546/2615/105 8548/2616/105 8549/2617/105 +f 8549/2617/105 8547/2618/105 8546/2615/105 +f 8550/2619/3720 8551/2620/3720 8553/2621/3720 +f 8553/2621/3720 8552/2622/3720 8550/2619/3720 +f 8546/2615/3 8547/2618/3 8551/2620/3 +f 8551/2620/2204 8550/2619/2204 8546/2615/2204 +f 8549/2617/331 8548/2616/331 8552/2622/331 +f 8552/2622/1571 8553/2621/1571 8549/2617/1571 +f 8554/2623/105 8556/2624/105 8557/2625/105 +f 8557/2625/105 8555/2626/105 8554/2623/105 +f 8558/2627/21 8559/2628/21 8561/2629/21 +f 8561/2629/21 8560/2630/21 8558/2627/21 +f 8554/2623/933 8555/2626/933 8559/2628/933 +f 8559/2628/1571 8558/2627/1571 8554/2623/1571 +f 8557/2625/2204 8556/2624/2204 8560/2630/2204 +f 8560/2630/3 8561/2629/3 8557/2625/3 +f 8562/2631/105 8564/2632/105 8565/2633/105 +f 8565/2633/105 8563/2634/105 8562/2631/105 +f 8566/2635/21 8567/2636/21 8569/2637/21 +f 8569/2637/21 8568/2638/21 8566/2635/21 +f 8562/2631/1571 8563/2634/1571 8567/2636/1571 +f 8567/2636/331 8566/2635/331 8562/2631/331 +f 8565/2633/2204 8564/2632/2204 8568/2638/2204 +f 8568/2638/2220 8569/2637/2220 8565/2633/2220 +f 8570/2639/105 8572/2640/105 8573/2641/105 +f 8573/2641/105 8571/2642/105 8570/2639/105 +f 8574/2643/21 8575/2644/21 8577/2645/21 +f 8577/2645/21 8576/2646/21 8574/2643/21 +f 8570/2639/63 8571/2642/63 8575/2644/63 +f 8575/2644/63 8574/2643/63 8570/2639/63 +f 8573/2641/7 8572/2640/7 8576/2646/7 +f 8576/2646/7 8577/2645/7 8573/2641/7 +f 8578/2647/105 8580/2648/105 8581/2649/105 +f 8581/2649/105 8579/2650/105 8578/2647/105 +f 8582/2651/21 8583/2652/21 8585/2653/21 +f 8585/2653/3721 8584/2654/3721 8582/2651/3721 +f 8578/2647/63 8579/2650/63 8583/2652/63 +f 8583/2652/63 8582/2651/63 8578/2647/63 +f 8581/2649/7 8580/2648/7 8584/2654/7 +f 8584/2654/7 8585/2653/7 8581/2649/7 +f 8588/2655/3722 8586/2656/3722 8589/2657/3722 +f 8587/2658/3723 8589/2657/3723 8586/2656/3723 +f 8591/2659/3724 8590/2660/3724 8593/2661/3724 +f 8592/2662/21 8593/2661/21 8590/2660/21 +f 8587/2658/3725 8586/2656/3725 8591/2659/3725 +f 8590/2660/3725 8591/2659/3725 8586/2656/3725 +f 8589/2657/3726 8587/2658/3726 8593/2661/3726 +f 8591/2659/3726 8593/2661/3726 8587/2658/3726 +f 8588/2655/3727 8589/2657/3727 8592/2662/3727 +f 8593/2661/3727 8592/2662/3727 8589/2657/3727 +f 8586/2656/3728 8588/2655/3728 8590/2660/3728 +f 8592/2662/3728 8590/2660/3728 8588/2655/3728 +f 8594/2663/7 8596/2664/7 8597/2665/7 +f 8597/2665/7 8595/2666/7 8594/2663/7 +f 8598/2667/63 8599/2668/63 8601/2669/63 +f 8601/2669/63 8600/2670/63 8598/2667/63 +f 8594/2663/3729 8595/2666/3729 8599/2668/3729 +f 8599/2668/3729 8598/2667/3729 8594/2663/3729 +f 8597/2665/3730 8596/2664/3730 8600/2670/3730 +f 8600/2670/3730 8601/2669/3730 8597/2665/3730 +f 8602/2671/7 8604/2672/7 8605/2673/7 +f 8605/2673/7 8603/2674/7 8602/2671/7 +f 8606/2675/63 8607/2676/63 8609/2677/63 +f 8609/2677/63 8608/2678/63 8606/2675/63 +f 8602/2671/3731 8603/2674/3731 8607/2676/3731 +f 8607/2676/3731 8606/2675/3731 8602/2671/3731 +f 8605/2673/3732 8604/2672/3732 8608/2678/3732 +f 8608/2678/3732 8609/2677/3732 8605/2673/3732 +f 8610/2679/7 8612/2680/7 8613/2681/7 +f 8613/2681/7 8611/2682/7 8610/2679/7 +f 8614/2683/63 8615/2684/63 8617/2685/63 +f 8617/2685/63 8616/2686/63 8614/2683/63 +f 8610/2679/3733 8611/2682/3733 8615/2684/3733 +f 8615/2684/3733 8614/2683/3733 8610/2679/3733 +f 8613/2681/3734 8612/2680/3734 8616/2686/3734 +f 8616/2686/3735 8617/2685/3735 8613/2681/3735 +f 8618/2687/7 8620/2688/7 8621/2689/7 +f 8959/2690/7 8619/2691/7 8960/2692/7 +f 8622/2693/63 8623/2694/63 8625/2695/63 +f 8961/2696/63 8624/2697/63 8962/2698/63 +f 8963/2692/3736 8619/2691/3736 8623/2694/3736 +f 8623/2694/3736 8622/2693/3736 8964/2692/3736 +f 8621/2689/3737 8620/2688/3737 8624/2697/3737 +f 8624/2697/3737 8965/2696/3737 8621/2689/3737 +f 8626/2699/7 8628/2700/7 8629/2701/7 +f 8629/2701/7 8627/2702/7 8626/2699/7 +f 8630/2703/63 8631/2704/63 8633/2705/63 +f 8633/2705/63 8632/2706/63 8630/2703/63 +f 8626/2699/3738 8627/2702/3738 8631/2704/3738 +f 8631/2704/3739 8630/2703/3739 8626/2699/3739 +f 8629/2701/3740 8628/2700/3740 8632/2706/3740 +f 8632/2706/3740 8633/2705/3740 8629/2701/3740 +f 8636/2707/7 8634/2708/7 8637/2709/7 +f 8635/2710/7 8637/2709/7 8634/2708/7 +f 8639/2711/63 8638/2712/63 8641/2713/63 +f 8640/2714/63 8641/2713/63 8638/2712/63 +f 8635/2710/3 8634/2708/3 8639/2711/3 +f 8638/2712/3 8639/2711/3 8634/2708/3 +f 8637/2709/3720 8635/2710/3720 8641/2713/3720 +f 8639/2711/3720 8641/2713/3720 8635/2710/3720 +f 8636/2707/331 8637/2709/331 8640/2714/331 +f 8641/2713/331 8640/2714/331 8637/2709/331 +f 8634/2708/105 8636/2707/105 8638/2712/105 +f 8640/2714/105 8638/2712/105 8636/2707/105 +f 8644/2715/7 8642/2716/7 8645/2717/7 +f 8643/2718/7 8645/2717/7 8642/2716/7 +f 8647/2719/63 8646/2720/63 8649/2721/63 +f 8648/2722/63 8649/2721/63 8646/2720/63 +f 8643/2718/2204 8642/2716/2204 8647/2719/2204 +f 8646/2720/2204 8647/2719/2204 8642/2716/2204 +f 8645/2717/2228 8643/2718/2228 8649/2721/2228 +f 8647/2719/2228 8649/2721/2228 8643/2718/2228 +f 8966/2723/331 8967/2724/331 8968/2725/331 +f 8969/2726/331 8970/2725/331 8971/2724/331 +f 8642/2716/356 8644/2715/356 8646/2720/356 +f 8648/2722/356 8646/2720/356 8644/2715/356 +f 8650/2727/7 8652/2728/7 8653/2729/7 +f 8653/2729/7 8651/2730/7 8650/2727/7 +f 8654/2731/63 8655/2732/63 8657/2733/63 +f 8657/2733/63 8656/2734/63 8654/2731/63 +f 8650/2727/3 8651/2730/3 8655/2732/3 +f 8655/2732/3 8654/2731/3 8650/2727/3 +f 8651/2730/105 8653/2729/105 8657/2733/105 +f 8657/2733/105 8655/2732/105 8651/2730/105 +f 8653/2729/331 8652/2728/331 8656/2734/331 +f 8656/2734/331 8657/2733/331 8653/2729/331 +f 8652/2728/21 8650/2727/21 8654/2731/21 +f 8654/2731/21 8656/2734/21 8652/2728/21 +f 8658/2735/7 8660/2736/7 8661/2737/7 +f 8661/2737/7 8659/2738/7 8658/2735/7 +f 8662/2739/63 8663/2740/63 8665/2741/63 +f 8665/2741/63 8664/2742/63 8662/2739/63 +f 8658/2735/3 8659/2738/3 8663/2740/3 +f 8663/2740/3 8662/2739/3 8658/2735/3 +f 8659/2738/105 8661/2737/105 8665/2741/105 +f 8665/2741/105 8663/2740/105 8659/2738/105 +f 8972/2743/933 8973/2744/933 8974/2745/933 +f 8975/2745/3037 8976/2746/3037 8977/2743/3037 +f 8660/2736/2228 8658/2735/2228 8662/2739/2228 +f 8662/2739/2228 8664/2742/2228 8660/2736/2228 +f 8666/2747/3722 8668/2748/3722 8669/2749/3722 +f 8669/2749/3741 8667/2750/3741 8666/2747/3741 +f 8670/2751/3742 8671/2752/3742 8673/2753/3742 +f 8673/2753/3743 8672/2754/3743 8670/2751/3743 +f 8666/2747/3744 8667/2750/3744 8671/2752/3744 +f 8671/2752/3745 8670/2751/3745 8666/2747/3745 +f 8667/2750/3746 8669/2749/3746 8673/2753/3746 +f 8673/2753/3746 8671/2752/3746 8667/2750/3746 +f 8669/2749/3747 8668/2748/3747 8672/2754/3747 +f 8672/2754/3747 8673/2753/3747 8669/2749/3747 +f 8668/2748/3748 8666/2747/3748 8670/2751/3748 +f 8670/2751/3749 8672/2754/3749 8668/2748/3749 +f 8676/2755/105 8674/2756/105 8677/2757/105 +f 8675/2758/105 8677/2757/105 8674/2756/105 +f 8679/2759/21 8678/2760/21 8681/2761/21 +f 8680/2762/21 8681/2761/21 8678/2760/21 +f 8675/2758/3725 8674/2756/3725 8679/2759/3725 +f 8678/2760/3725 8679/2759/3725 8674/2756/3725 +f 8677/2757/3750 8675/2758/3750 8681/2761/3750 +f 8679/2759/3750 8681/2761/3750 8675/2758/3750 +f 8676/2755/3751 8677/2757/3751 8680/2762/3751 +f 8681/2761/3752 8680/2762/3752 8677/2757/3752 +f 8674/2756/3753 8676/2755/3753 8678/2760/3753 +f 8680/2762/3753 8678/2760/3753 8676/2755/3753 +f 8682/2763/105 8684/2764/105 8685/2765/105 +f 8685/2765/105 8683/2766/105 8682/2763/105 +f 8686/2767/21 8687/2768/21 8689/2769/21 +f 8689/2769/21 8688/2770/21 8686/2767/21 +f 8682/2763/3744 8683/2766/3744 8687/2768/3744 +f 8687/2768/3744 8686/2767/3744 8682/2763/3744 +f 8683/2766/3746 8685/2765/3746 8689/2769/3746 +f 8689/2769/3746 8687/2768/3746 8683/2766/3746 +f 8685/2765/3747 8684/2764/3747 8688/2770/3747 +f 8688/2770/3747 8689/2769/3747 8685/2765/3747 +f 8684/2764/3754 8682/2763/3754 8686/2767/3754 +f 8686/2767/3754 8688/2770/3754 8684/2764/3754 +f 8690/2771/7 8692/2772/7 8693/2773/7 +f 8693/2773/7 8691/2774/7 8690/2771/7 +f 8694/2775/63 8695/2776/63 8697/2777/63 +f 8697/2777/63 8696/2778/63 8694/2775/63 +f 8690/2771/3755 8691/2774/3755 8695/2776/3755 +f 8695/2776/3755 8694/2775/3755 8690/2771/3755 +f 8693/2773/3730 8692/2772/3730 8696/2778/3730 +f 8696/2778/3730 8697/2777/3730 8693/2773/3730 +f 8698/2779/7 8700/2780/7 8701/2781/7 +f 8701/2781/7 8699/2782/7 8698/2779/7 +f 8702/2783/3756 8703/2784/3756 8705/2785/3756 +f 8705/2785/235 8704/2786/235 8702/2783/235 +f 8698/2779/3757 8699/2782/3757 8703/2784/3757 +f 8703/2784/3757 8702/2783/3757 8698/2779/3757 +f 8701/2781/3758 8700/2780/3758 8704/2786/3758 +f 8704/2786/3758 8705/2785/3758 8701/2781/3758 +f 8706/2787/7 8708/2788/7 8709/2789/7 +f 8709/2789/7 8707/2790/7 8706/2787/7 +f 8710/2791/3759 8711/2792/3759 8713/2793/3759 +f 8713/2793/3759 8712/2794/3759 8710/2791/3759 +f 8706/2787/3760 8707/2790/3760 8711/2792/3760 +f 8711/2792/3760 8710/2791/3760 8706/2787/3760 +f 8709/2789/3735 8708/2788/3735 8712/2794/3735 +f 8712/2794/3735 8713/2793/3735 8709/2789/3735 +f 8714/2795/7 8716/2796/7 8717/2797/7 +f 8978/2798/7 8715/2799/7 8979/2800/7 +f 8718/2801/63 8719/2802/63 8721/2803/63 +f 8980/2804/63 8720/2805/63 8981/2806/63 +f 8982/2800/3736 8715/2799/3736 8719/2802/3736 +f 8719/2802/3736 8718/2801/3736 8983/2800/3736 +f 8717/2797/3737 8716/2796/3737 8720/2805/3737 +f 8720/2805/3737 8984/2804/3737 8717/2797/3737 +f 8722/2807/7 8724/2808/7 8725/2809/7 +f 8725/2809/7 8723/2810/7 8722/2807/7 +f 8726/2811/3761 8727/2812/3761 8729/2813/3761 +f 8729/2813/3762 8728/2814/3762 8726/2811/3762 +f 8722/2807/3738 8723/2810/3738 8727/2812/3738 +f 8727/2812/3738 8726/2811/3738 8722/2807/3738 +f 8725/2809/3740 8724/2808/3740 8728/2814/3740 +f 8728/2814/3740 8729/2813/3740 8725/2809/3740 +f 8732/2815/7 8730/2816/7 8733/2817/7 +f 8731/2818/7 8733/2817/7 8730/2816/7 +f 8735/2819/63 8734/2820/63 8737/2821/63 +f 8736/2822/63 8737/2821/63 8734/2820/63 +f 8731/2818/3 8730/2816/3 8735/2819/3 +f 8734/2820/3 8735/2819/3 8730/2816/3 +f 8733/2817/3720 8731/2818/3720 8737/2821/3720 +f 8735/2819/3720 8737/2821/3720 8731/2818/3720 +f 8732/2815/243 8733/2817/243 8736/2822/243 +f 8737/2821/243 8736/2822/243 8733/2817/243 +f 8730/2816/3763 8732/2815/3763 8734/2820/3763 +f 8736/2822/3763 8734/2820/3763 8732/2815/3763 +f 8740/2823/7 8738/2824/7 8741/2825/7 +f 8739/2826/7 8741/2825/7 8738/2824/7 +f 8743/2827/63 8742/2828/63 8745/2829/63 +f 8744/2830/63 8745/2829/63 8742/2828/63 +f 8739/2826/2204 8738/2824/2204 8743/2827/2204 +f 8742/2828/2204 8743/2827/2204 8738/2824/2204 +f 8741/2825/2228 8739/2826/2228 8745/2829/2228 +f 8743/2827/2228 8745/2829/2228 8739/2826/2228 +f 8985/2831/331 8986/2832/331 8987/2833/331 +f 8988/2834/331 8989/2833/331 8990/2832/331 +f 8738/2824/356 8740/2823/356 8742/2828/356 +f 8744/2830/356 8742/2828/356 8740/2823/356 +f 8746/2835/7 8748/2836/7 8749/2837/7 +f 8749/2837/7 8747/2838/7 8746/2835/7 +f 8750/2839/63 8751/2840/63 8753/2841/63 +f 8753/2841/63 8752/2842/63 8750/2839/63 +f 8746/2835/252 8747/2838/252 8751/2840/252 +f 8751/2840/252 8750/2839/252 8746/2835/252 +f 8747/2838/3763 8749/2837/3763 8753/2841/3763 +f 8753/2841/3763 8751/2840/3763 8747/2838/3763 +f 8749/2837/2089 8748/2836/2089 8752/2842/2089 +f 8752/2842/2089 8753/2841/2089 8749/2837/2089 +f 8748/2836/21 8746/2835/21 8750/2839/21 +f 8750/2839/21 8752/2842/21 8748/2836/21 +f 8754/2843/7 8756/2844/7 8757/2845/7 +f 8757/2845/7 8755/2846/7 8754/2843/7 +f 8758/2847/63 8759/2848/63 8761/2849/63 +f 8761/2849/63 8760/2850/63 8758/2847/63 +f 8754/2843/3 8755/2846/3 8759/2848/3 +f 8759/2848/3 8758/2847/3 8754/2843/3 +f 8755/2846/105 8757/2845/105 8761/2849/105 +f 8761/2849/105 8759/2848/105 8755/2846/105 +f 8991/2851/331 8992/2852/331 8993/2853/331 +f 8994/2853/331 8995/2854/331 8996/2851/331 +f 8756/2844/2228 8754/2843/2228 8758/2847/2228 +f 8758/2847/2228 8760/2850/2228 8756/2844/2228 +f 8762/2855/105 8764/2856/105 8765/2857/105 +f 8765/2857/105 8763/2858/105 8762/2855/105 +f 8766/2859/21 8767/2860/21 8769/2861/21 +f 8769/2861/21 8768/2862/21 8766/2859/21 +f 8762/2855/1571 8763/2858/1571 8767/2860/1571 +f 8767/2860/331 8766/2859/331 8762/2855/331 +f 8765/2857/3 8764/2856/3 8768/2862/3 +f 8768/2862/3 8769/2861/3 8765/2857/3 +f 8770/2863/353 8772/2864/353 8773/2865/353 +f 8773/2865/353 8771/2866/353 8770/2863/353 +f 8774/2867/2228 8775/2868/2228 8777/2869/2228 +f 8777/2869/2228 8776/2870/2228 8774/2867/2228 +f 8770/2863/63 8771/2866/63 8775/2868/63 +f 8775/2868/63 8774/2867/63 8770/2863/63 +f 8773/2865/7 8772/2864/7 8776/2870/7 +f 8776/2870/7 8777/2869/7 8773/2865/7 +f 8778/2871/105 8780/2872/105 8781/2873/105 +f 8781/2873/105 8779/2874/105 8778/2871/105 +f 8782/2875/21 8783/2876/21 8785/2877/21 +f 8785/2877/21 8784/2878/21 8782/2875/21 +f 8778/2871/3 8779/2874/3 8783/2876/3 +f 8783/2876/3 8782/2875/3 8778/2871/3 +f 8781/2873/331 8780/2872/331 8784/2878/331 +f 8784/2878/331 8785/2877/331 8781/2873/331 +f 8786/2879/105 8788/2880/105 8789/2881/105 +f 8789/2881/105 8787/2882/105 8786/2879/105 +f 8790/2883/21 8791/2884/21 8793/2885/21 +f 8793/2885/21 8792/2886/21 8790/2883/21 +f 8786/2879/1571 8787/2882/1571 8791/2884/1571 +f 8791/2884/331 8790/2883/331 8786/2879/331 +f 8789/2881/3 8788/2880/3 8792/2886/3 +f 8792/2886/3 8793/2885/3 8789/2881/3 +f 8794/2887/105 8796/2888/105 8797/2889/105 +f 8797/2889/105 8795/2890/105 8794/2887/105 +f 8798/2891/21 8799/2892/21 8801/2893/21 +f 8801/2893/21 8800/2894/21 8798/2891/21 +f 8794/2887/331 8795/2890/331 8799/2892/331 +f 8799/2892/933 8798/2891/933 8794/2887/933 +f 8797/2889/2204 8796/2888/2204 8800/2894/2204 +f 8800/2894/2204 8801/2893/2204 8797/2889/2204 +f 8802/2895/105 8804/2896/105 8805/2897/105 +f 8805/2897/105 8803/2898/105 8802/2895/105 +f 8806/2899/21 8807/2900/21 8809/2901/21 +f 8809/2901/21 8808/2902/21 8806/2899/21 +f 8802/2895/63 8803/2898/63 8807/2900/63 +f 8807/2900/63 8806/2899/63 8802/2895/63 +f 8805/2897/7 8804/2896/7 8808/2902/7 +f 8808/2902/7 8809/2901/7 8805/2897/7 +f 8810/2903/105 8812/2904/105 8813/2905/105 +f 8813/2905/105 8811/2906/105 8810/2903/105 +f 8814/2907/21 8815/2908/21 8817/2909/21 +f 8817/2909/21 8816/2910/21 8814/2907/21 +f 8810/2903/274 8811/2906/274 8815/2908/274 +f 8815/2908/274 8814/2907/274 8810/2903/274 +f 8813/2905/7 8812/2904/7 8816/2910/7 +f 8816/2910/7 8817/2909/7 8813/2905/7 +f 8850/2911/3764 8849/2912/3764 8851/2913/3764 +f 8851/2913/3765 8852/2914/3765 8850/2911/3765 +f 8854/2915/3766 8853/2916/3766 8855/2917/3766 +f 8855/2917/3767 8856/2918/3767 8854/2915/3767 +f 8858/2919/3768 8857/2920/3768 8859/2921/3768 +f 8859/2921/3768 8860/2922/3768 8858/2919/3768 +f 8849/2912/3764 8850/2911/3764 8861/2923/3764 +f 8862/2924/3764 8861/2923/3764 8850/2911/3764 +f 8853/2916/3769 8854/2915/3769 8863/2925/3769 +f 8818/2926/105 8828/2927/105 8834/2928/105 +f 8833/2929/105 8834/2928/105 8828/2927/105 +f 8829/2930/105 8830/2931/105 8836/2932/105 +f 8835/2933/105 8836/2932/105 8830/2931/105 +f 8831/2934/3770 8832/2935/3770 8838/2936/3770 +f 8837/2937/3771 8838/2936/3771 8832/2935/3771 +f 8823/2938/3715 8822/2939/3715 8840/2940/3715 +f 8839/2941/3772 8840/2940/3772 8822/2939/3772 +f 8825/2942/21 8824/2943/21 8842/2944/21 +f 8841/2945/21 8842/2944/21 8824/2943/21 +f 8827/2946/3773 8826/2947/3773 8844/2948/3773 +f 8843/2949/3773 8844/2948/3773 8826/2947/3773 +f 8819/2950/3774 8823/2938/3774 8845/2951/3774 +f 8840/2940/3774 8845/2951/3774 8823/2938/3774 +f 8822/2939/3775 8818/2926/3775 8839/2941/3775 +f 8846/2952/3775 8839/2941/3775 8818/2926/3775 +f 8836/2932/3776 8841/2945/3776 8824/2943/3776 +f 8820/2953/3777 8825/2942/3777 8847/2954/3777 +f 8842/2944/3777 8847/2954/3777 8825/2942/3777 +f 8838/2936/3778 8843/2949/3778 8826/2947/3778 +f 8821/2955/3777 8827/2946/3777 8848/2956/3777 +f 8844/2948/3777 8848/2956/3777 8827/2946/3777 +f 8834/2928/3775 8846/2952/3775 8818/2926/3775 +f 8828/2927/3774 8819/2950/3774 8833/2929/3774 +f 8845/2951/3774 8833/2929/3774 8819/2950/3774 +f 8824/2943/3776 8829/2930/3776 8836/2932/3776 +f 8830/2931/3777 8820/2953/3777 8835/2933/3777 +f 8847/2954/3777 8835/2933/3777 8820/2953/3777 +f 8826/2947/3778 8831/2934/3778 8838/2936/3778 +f 8832/2935/3777 8821/2955/3777 8837/2937/3777 +f 8848/2956/3777 8837/2937/3777 8821/2955/3777 +f 8840/2940/21 8839/2941/21 8851/2913/21 +f 8852/2914/21 8851/2913/21 8839/2941/21 +f 8883/2957/3779 8882/2958/3779 8884/2959/3779 +f 8885/2960/3779 8884/2959/3779 8882/2958/3779 +f 8842/2944/3780 8841/2945/3780 8855/2917/3780 +f 8856/2918/3781 8855/2917/3781 8841/2945/3781 +f 8844/2948/3780 8843/2949/3780 8859/2921/3780 +f 8860/2922/3781 8859/2921/3781 8843/2949/3781 +f 8834/2928/105 8833/2929/105 8862/2924/105 +f 8861/2923/105 8862/2924/105 8833/2929/105 +f 8882/2958/3782 8886/2961/3782 8885/2960/3782 +f 8887/2962/3782 8885/2960/3782 8886/2961/3782 +f 8836/2932/105 8835/2933/105 8854/2915/105 +f 8863/2925/3763 8854/2915/3763 8835/2933/3763 +f 8838/2936/3763 8837/2937/3763 8858/2919/3763 +f 8857/2920/3763 8858/2919/3763 8837/2937/3763 +f 8859/2921/3783 8857/2920/3783 8865/2963/3783 +f 8864/2964/3784 8865/2963/3784 8857/2920/3784 +f 8866/2965/3783 8864/2964/3783 8857/2920/3783 +f 8848/2956/3785 8844/2948/3785 8868/2966/3785 +f 8867/2967/3786 8868/2966/3786 8844/2948/3786 +f 8837/2937/3785 8848/2956/3785 8869/2968/3785 +f 8868/2966/3785 8869/2968/3785 8848/2956/3785 +f 8844/2948/3787 8859/2921/3787 8867/2967/3787 +f 8865/2963/21 8867/2967/21 8859/2921/21 +f 8857/2920/3788 8837/2937/3788 8866/2965/3788 +f 8869/2968/2446 8866/2965/2446 8837/2937/2446 +f 8868/2966/3789 8867/2967/3789 8871/2969/3789 +f 8870/2970/3790 8871/2969/3790 8867/2967/3790 +f 8865/2963/3791 8864/2964/3791 8873/2971/3791 +f 8872/2972/3792 8873/2971/3792 8864/2964/3792 +f 8867/2967/21 8865/2963/21 8870/2970/21 +f 8873/2971/21 8870/2970/21 8865/2963/21 +f 8869/2968/3793 8868/2966/3793 8874/2973/3793 +f 8871/2969/3793 8874/2973/3793 8868/2966/3793 +f 8866/2965/105 8869/2968/105 8875/2974/105 +f 8874/2973/105 8875/2974/105 8869/2968/105 +f 8864/2964/3794 8866/2965/3794 8872/2972/3794 +f 8875/2974/3794 8872/2972/3794 8866/2965/3794 +f 8851/2913/3795 8849/2912/3795 8856/2918/3795 +f 8854/2915/3795 8856/2918/3795 8849/2912/3795 +f 8855/2917/3796 8853/2916/3796 8860/2922/3796 +f 8858/2919/3797 8860/2922/3797 8853/2916/3797 +f 8849/2912/3795 8861/2923/3795 8854/2915/3795 +f 8853/2916/3797 8863/2925/3797 8858/2919/3797 +f 8845/2951/3798 8840/2940/3798 8836/2932/3798 +f 8841/2945/3798 8836/2932/3798 8840/2940/3798 +f 8847/2954/3799 8842/2944/3799 8838/2936/3799 +f 8843/2949/3799 8838/2936/3799 8842/2944/3799 +f 8833/2929/3798 8845/2951/3798 8836/2932/3798 +f 8835/2933/3799 8847/2954/3799 8838/2936/3799 +f 8840/2940/21 8851/2913/21 8841/2945/21 +f 8856/2918/21 8841/2945/21 8851/2913/21 +f 8842/2944/3787 8855/2917/3787 8843/2949/3787 +f 8860/2922/21 8843/2949/21 8855/2917/21 +f 8861/2923/105 8833/2929/105 8854/2915/105 +f 8836/2932/105 8854/2915/105 8833/2929/105 +f 8863/2925/3788 8835/2933/3788 8858/2919/3788 +f 8838/2936/3788 8858/2919/3788 8835/2933/3788 +f 8850/2911/3800 8852/2914/3800 8877/2975/3800 +f 8876/2976/3800 8877/2975/3800 8852/2914/3800 +f 8862/2924/3800 8850/2911/3800 8878/2977/3800 +f 8877/2975/3800 8878/2977/3800 8850/2911/3800 +f 8839/2941/3801 8846/2952/3801 8880/2978/3801 +f 8879/2979/3802 8880/2978/3802 8846/2952/3802 +f 8846/2952/3802 8834/2928/3802 8879/2979/3802 +f 8881/2980/3802 8879/2979/3802 8834/2928/3802 +f 8852/2914/3803 8839/2941/3803 8876/2976/3803 +f 8880/2978/357 8876/2976/357 8839/2941/357 +f 8834/2928/105 8862/2924/105 8881/2980/105 +f 8878/2977/105 8881/2980/105 8862/2924/105 +f 8880/2978/3804 8879/2979/3804 8883/2957/3804 +f 8882/2958/3804 8883/2957/3804 8879/2979/3804 +f 8876/2976/21 8880/2978/21 8884/2959/21 +f 8883/2957/21 8884/2959/21 8880/2978/21 +f 8877/2975/3805 8876/2976/3805 8885/2960/3805 +f 8884/2959/3805 8885/2960/3805 8876/2976/3805 +f 8879/2979/3804 8881/2980/3804 8882/2958/3804 +f 8886/2961/3804 8882/2958/3804 8881/2980/3804 +f 8878/2977/3805 8877/2975/3805 8887/2962/3805 +f 8885/2960/3805 8887/2962/3805 8877/2975/3805 +f 8881/2980/105 8878/2977/105 8886/2961/105 +f 8887/2962/105 8886/2961/105 8878/2977/105 +f 8920/2981/3806 8921/2982/3806 8922/2983/3806 +f 8923/2984/3806 8922/2983/3806 8921/2982/3806 +f 8924/2985/3807 8925/2986/3807 8926/2987/3807 +f 8927/2988/3808 8926/2987/3808 8925/2986/3808 +f 8928/2989/3768 8929/2990/3768 8930/2991/3768 +f 8931/2992/3768 8930/2991/3768 8929/2990/3768 +f 8921/2982/3806 8920/2981/3806 8932/2993/3806 +f 8932/2993/3806 8933/2994/3806 8921/2982/3806 +f 8925/2986/3807 8924/2985/3807 8934/2995/3807 +f 8899/2996/3715 8898/2997/3715 8905/2998/3715 +f 8905/2998/3772 8904/2999/3772 8899/2996/3772 +f 8901/3000/21 8900/3001/21 8907/3002/21 +f 8907/3002/3809 8906/3003/3809 8901/3000/3809 +f 8903/3004/3773 8902/3005/3773 8909/3006/3773 +f 8909/3006/3773 8908/3007/3773 8903/3004/3773 +f 8892/3008/3810 8893/3009/3810 8911/3010/3810 +f 8911/3010/3810 8910/3011/3810 8892/3008/3810 +f 8894/3012/354 8895/3013/354 8913/3014/354 +f 8913/3014/354 8912/3015/354 8894/3012/354 +f 8896/3016/354 8897/3017/354 8915/3018/354 +f 8915/3018/354 8914/3019/354 8896/3016/354 +f 8893/3009/3774 8889/3020/3774 8916/3021/3774 +f 8916/3021/3774 8911/3010/3774 8893/3009/3774 +f 8888/3022/3811 8892/3008/3811 8910/3011/3811 +f 8910/3011/3812 8917/3023/3812 8888/3022/3812 +f 8912/3015/3813 8907/3002/3813 8894/3012/3813 +f 8895/3013/3814 8890/3024/3814 8918/3025/3814 +f 8918/3025/3814 8913/3014/3814 8895/3013/3814 +f 8914/3019/3776 8909/3006/3776 8896/3016/3776 +f 8897/3017/3814 8891/3026/3814 8919/3027/3814 +f 8919/3027/3814 8915/3018/3814 8897/3017/3814 +f 8898/2997/3775 8888/3022/3775 8917/3023/3775 +f 8917/3023/3775 8905/2998/3775 8898/2997/3775 +f 8889/3020/3774 8899/2996/3774 8904/2999/3774 +f 8904/2999/3774 8916/3021/3774 8889/3020/3774 +f 8900/3001/3813 8894/3012/3813 8907/3002/3813 +f 8890/3024/3814 8901/3000/3814 8906/3003/3814 +f 8906/3003/3814 8918/3025/3814 8890/3024/3814 +f 8902/3005/3776 8896/3016/3776 8909/3006/3776 +f 8891/3026/3814 8903/3004/3814 8908/3007/3814 +f 8908/3007/3814 8919/3027/3814 8891/3026/3814 +f 8910/3011/3815 8911/3010/3815 8922/2983/3815 +f 8922/2983/3816 8923/2984/3816 8910/3011/3816 +f 8953/3028/3817 8954/3029/3817 8955/3030/3817 +f 8955/3030/3817 8956/3031/3817 8953/3028/3817 +f 8912/3015/105 8913/3014/105 8926/2987/105 +f 8926/2987/105 8927/2988/105 8912/3015/105 +f 8914/3019/105 8915/3018/105 8930/2991/105 +f 8930/2991/105 8931/2992/105 8914/3019/105 +f 8904/2999/21 8905/2998/21 8933/2994/21 +f 8933/2994/3818 8932/2993/3818 8904/2999/3818 +f 8957/3032/3817 8953/3028/3817 8956/3031/3817 +f 8956/3031/3817 8958/3033/3817 8957/3032/3817 +f 8906/3003/3720 8907/3002/3720 8925/2986/3720 +f 8925/2986/21 8934/2995/21 8906/3003/21 +f 8908/3007/21 8909/3006/21 8929/2990/21 +f 8929/2990/21 8928/2989/21 8908/3007/21 +f 8928/2989/3783 8930/2991/3783 8936/3034/3783 +f 8936/3034/3783 8935/3035/3783 8928/2989/3783 +f 8935/3035/3783 8937/3036/3783 8928/2989/3783 +f 8915/3018/3819 8919/3027/3819 8939/3037/3819 +f 8939/3037/3820 8938/3038/3820 8915/3018/3820 +f 8919/3027/3820 8908/3007/3820 8940/3039/3820 +f 8940/3039/3820 8939/3037/3820 8919/3027/3820 +f 8930/2991/105 8915/3018/105 8938/3038/105 +f 8938/3038/105 8936/3034/105 8930/2991/105 +f 8908/3007/3821 8928/2989/3821 8937/3036/3821 +f 8937/3036/365 8940/3039/365 8908/3007/365 +f 8938/3038/3822 8939/3037/3822 8942/3040/3822 +f 8942/3040/3822 8941/3041/3822 8938/3038/3822 +f 8935/3035/3823 8936/3034/3823 8944/3042/3823 +f 8944/3042/3823 8943/3043/3823 8935/3035/3823 +f 8936/3034/105 8938/3038/105 8941/3041/105 +f 8941/3041/105 8944/3042/105 8936/3034/105 +f 8939/3037/3822 8940/3039/3822 8945/3044/3822 +f 8945/3044/3822 8942/3040/3822 8939/3037/3822 +f 8940/3039/21 8937/3036/21 8946/3045/21 +f 8946/3045/21 8945/3044/21 8940/3039/21 +f 8937/3036/3823 8935/3035/3823 8943/3043/3823 +f 8943/3043/3823 8946/3045/3823 8937/3036/3823 +f 8920/2981/3795 8922/2983/3795 8927/2988/3795 +f 8927/2988/3795 8925/2986/3795 8920/2981/3795 +f 8924/2985/3797 8926/2987/3797 8931/2992/3797 +f 8931/2992/3797 8929/2990/3797 8924/2985/3797 +f 8932/2993/3824 8920/2981/3824 8925/2986/3824 +f 8934/2995/3797 8924/2985/3797 8929/2990/3797 +f 8911/3010/3825 8916/3021/3825 8907/3002/3825 +f 8907/3002/3825 8912/3015/3825 8911/3010/3825 +f 8913/3014/3826 8918/3025/3826 8909/3006/3826 +f 8909/3006/3799 8914/3019/3799 8913/3014/3799 +f 8916/3021/3825 8904/2999/3825 8907/3002/3825 +f 8918/3025/3799 8906/3003/3799 8909/3006/3799 +f 8922/2983/3827 8911/3010/3827 8912/3015/3827 +f 8912/3015/2446 8927/2988/2446 8922/2983/2446 +f 8926/2987/2446 8913/3014/2446 8914/3019/2446 +f 8914/3019/2446 8931/2992/2446 8926/2987/2446 +f 8904/2999/3828 8932/2993/3828 8925/2986/3828 +f 8925/2986/3829 8907/3002/3829 8904/2999/3829 +f 8906/3003/3830 8934/2995/3830 8929/2990/3830 +f 8929/2990/3830 8909/3006/3830 8906/3003/3830 +f 8923/2984/3800 8921/2982/3800 8948/3046/3800 +f 8948/3046/3800 8947/3047/3800 8923/2984/3800 +f 8921/2982/3800 8933/2994/3800 8949/3048/3800 +f 8949/3048/3800 8948/3046/3800 8921/2982/3800 +f 8917/3023/3831 8910/3011/3831 8951/3049/3831 +f 8951/3049/3802 8950/3050/3802 8917/3023/3802 +f 8905/2998/3832 8917/3023/3832 8950/3050/3832 +f 8950/3050/3833 8952/3051/3833 8905/2998/3833 +f 8910/3011/105 8923/2984/105 8947/3047/105 +f 8947/3047/105 8951/3049/105 8910/3011/105 +f 8933/2994/3821 8905/2998/3821 8952/3051/3821 +f 8952/3051/2228 8949/3048/2228 8933/2994/2228 +f 8950/3050/3804 8951/3049/3804 8954/3029/3804 +f 8954/3029/3804 8953/3028/3804 8950/3050/3804 +f 8951/3049/3834 8947/3047/3834 8955/3030/3834 +f 8955/3030/3835 8954/3029/3835 8951/3049/3835 +f 8947/3047/3836 8948/3046/3836 8956/3031/3836 +f 8956/3031/3836 8955/3030/3836 8947/3047/3836 +f 8952/3051/3837 8950/3050/3837 8953/3028/3837 +f 8953/3028/3838 8957/3032/3838 8952/3051/3838 +f 8948/3046/3836 8949/3048/3836 8958/3033/3836 +f 8958/3033/3836 8956/3031/3836 8948/3046/3836 +f 8949/3048/21 8952/3051/21 8957/3032/21 +f 8957/3032/21 8958/3033/21 8949/3048/21 +o diesstt +v -0.296352 1.662356 -3.221428 +v -0.296352 1.662356 -3.275026 +v -0.296352 1.662356 -3.506036 +v -0.296352 1.662356 -3.561567 +v 0.359187 1.662355 -3.506504 +v 0.359187 1.662354 -3.561833 +v 0.359187 1.662355 -3.275478 +v 0.359186 1.662355 -3.224203 +v 0.080829 1.662355 -3.401248 +v 0.359288 1.662620 -3.643597 +v 0.071182 1.662355 -3.421006 +v 0.054191 1.662355 -3.434626 +v 0.032265 1.662355 -3.439701 +v 0.080829 1.662355 -3.378388 +v -0.295763 1.662621 -3.643598 +v -0.296266 1.662489 -3.125565 +v 0.359029 1.662488 -3.125564 +v 0.010338 1.662355 -3.434626 +v -0.006651 1.662355 -3.421006 +v -0.016299 1.662355 -3.401248 +v -0.016299 1.662356 -3.378388 +v -0.006651 1.662356 -3.358629 +v 0.071182 1.662355 -3.358629 +v 0.010338 1.662356 -3.345009 +v 0.054191 1.662355 -3.345009 +v 0.032265 1.662356 -3.339934 +v 0.376012 1.662473 -3.505132 +v 0.376012 1.662474 -3.275120 +v -0.313058 1.662191 -3.505301 +v -0.311537 1.662192 -3.275289 +v 1.340575 0.149549 -3.274866 +v 1.333836 0.161131 -3.274866 +v 1.297768 0.223128 -3.274866 +v 1.290971 0.234809 -3.274866 +v 1.254944 0.296738 -3.274866 +v 1.248148 0.308419 -3.274866 +v 1.212107 0.370371 -3.274866 +v 1.205317 0.382039 -3.274866 +v 1.169291 0.443965 -3.274867 +v 1.162495 0.455645 -3.274867 +v 1.126440 0.517620 -3.274866 +v 1.121320 0.526422 -3.274867 +v 1.083573 0.591304 -3.274867 +v 1.076895 0.602781 -3.274867 +v 1.040779 0.664862 -3.274867 +v 1.034006 0.676502 -3.274867 +v 0.997929 0.738517 -3.274867 +v 0.991194 0.750091 -3.274867 +v 0.955109 0.812120 -3.274868 +v 0.948392 0.823662 -3.274868 +v 0.912284 0.885729 -3.274868 +v 0.905546 0.897310 -3.274867 +v 0.869469 0.959324 -3.274868 +v 0.862736 0.970895 -3.274868 +v 0.826588 1.033030 -3.274868 +v 0.819927 1.044479 -3.274868 +v 0.783743 1.106676 -3.274868 +v 0.777116 1.118065 -3.274868 +v 0.740983 1.180176 -3.274868 +v 0.734235 1.191773 -3.274868 +v 0.698115 1.253860 -3.274868 +v 0.691429 1.265351 -3.274868 +v 0.655343 1.327381 -3.274869 +v 0.648537 1.339078 -3.274869 +v 0.612501 1.401021 -3.274869 +v 0.605827 1.412492 -3.274869 +v 0.569634 1.474705 -3.274869 +v 0.562958 1.486177 -3.274869 +v 0.526792 1.548344 -3.274869 +v 0.520148 1.559763 -3.274869 +v 1.234700 0.146925 -3.274866 +v 1.227960 0.158507 -3.274866 +v 1.191893 0.220504 -3.274866 +v 1.185096 0.232186 -3.274866 +v 1.149069 0.294114 -3.274866 +v 1.142272 0.305795 -3.274866 +v 1.106231 0.367747 -3.274866 +v 1.099442 0.379415 -3.274867 +v 1.063416 0.441341 -3.274867 +v 1.056620 0.453021 -3.274867 +v 1.020565 0.514996 -3.274867 +v 1.015444 0.523798 -3.274867 +v 0.977697 0.588680 -3.274867 +v 0.971020 0.600157 -3.274867 +v 0.934903 0.662239 -3.274867 +v 0.928131 0.673878 -3.274867 +v 0.892053 0.735893 -3.274867 +v 0.885319 0.747467 -3.274867 +v 0.849233 0.809496 -3.274868 +v 0.842517 0.821038 -3.274868 +v 0.806409 0.883106 -3.274868 +v 0.799670 0.894686 -3.274868 +v 0.763593 0.956700 -3.274868 +v 0.756860 0.968271 -3.274868 +v 0.720713 1.030406 -3.274868 +v 0.714051 1.041855 -3.274868 +v 0.677868 1.104052 -3.274868 +v 0.671241 1.115441 -3.274868 +v 0.631716 1.178019 -3.274869 +v 0.628359 1.189149 -3.274869 +v 0.592240 1.251236 -3.274869 +v 0.585554 1.262727 -3.274869 +v 0.549467 1.324757 -3.274869 +v 0.542661 1.336454 -3.274869 +v 0.506626 1.398397 -3.274869 +v 0.499951 1.409868 -3.274869 +v 0.463758 1.472081 -3.274869 +v 0.457083 1.483553 -3.274869 +v 0.420916 1.545720 -3.274869 +v 0.414273 1.557139 -3.274870 +v 1.340575 0.149548 -3.504670 +v 1.333836 0.161130 -3.504670 +v 1.297768 0.223128 -3.504670 +v 1.290972 0.234809 -3.504670 +v 1.254944 0.296737 -3.504670 +v 1.248148 0.308418 -3.504670 +v 1.212107 0.370370 -3.504670 +v 1.205317 0.382038 -3.504670 +v 1.169291 0.443964 -3.504670 +v 1.162495 0.455644 -3.504670 +v 1.126441 0.517620 -3.504670 +v 1.121319 0.526422 -3.504670 +v 1.083573 0.591304 -3.504671 +v 1.076895 0.602780 -3.504671 +v 1.040779 0.664862 -3.504671 +v 1.034006 0.676502 -3.504671 +v 0.997929 0.738517 -3.504671 +v 0.991194 0.750090 -3.504671 +v 0.955109 0.812119 -3.504671 +v 0.948392 0.823661 -3.504671 +v 0.912284 0.885729 -3.504671 +v 0.905546 0.897310 -3.504671 +v 0.869469 0.959324 -3.504672 +v 0.862736 0.970895 -3.504672 +v 0.826588 1.033030 -3.504672 +v 0.819927 1.044479 -3.504672 +v 0.783743 1.106676 -3.504672 +v 0.777116 1.118065 -3.504672 +v 0.740983 1.180176 -3.504672 +v 0.734235 1.191772 -3.504672 +v 0.698115 1.253860 -3.504672 +v 0.691429 1.265351 -3.504672 +v 0.655343 1.327380 -3.504673 +v 0.648537 1.339078 -3.504673 +v 0.612501 1.401020 -3.504673 +v 0.605827 1.412491 -3.504673 +v 0.569633 1.474705 -3.504673 +v 0.562959 1.486177 -3.504673 +v 0.526792 1.548344 -3.504673 +v 0.520148 1.559763 -3.504673 +v 1.234700 0.146924 -3.504670 +v 1.227961 0.158506 -3.504670 +v 1.191893 0.220504 -3.504670 +v 1.185096 0.232185 -3.504670 +v 1.149069 0.294113 -3.504670 +v 1.142272 0.305794 -3.504670 +v 1.106231 0.367746 -3.504670 +v 1.099442 0.379414 -3.504670 +v 1.063416 0.441340 -3.504670 +v 1.056620 0.453020 -3.504670 +v 1.020565 0.514996 -3.504671 +v 1.015444 0.523798 -3.504671 +v 0.977697 0.588680 -3.504671 +v 0.971020 0.600157 -3.504671 +v 0.934903 0.662238 -3.504671 +v 0.928131 0.673878 -3.504671 +v 0.892053 0.735892 -3.504671 +v 0.885319 0.747466 -3.504671 +v 0.849233 0.809495 -3.504671 +v 0.842517 0.821037 -3.504671 +v 0.806409 0.883105 -3.504672 +v 0.799671 0.894686 -3.504672 +v 0.763593 0.956700 -3.504672 +v 0.756861 0.968271 -3.504672 +v 0.720713 1.030406 -3.504672 +v 0.714051 1.041855 -3.504672 +v 0.677868 1.104052 -3.504672 +v 0.671241 1.115441 -3.504672 +v 0.635107 1.177552 -3.504672 +v 0.628360 1.189148 -3.504672 +v 0.592240 1.251236 -3.504672 +v 0.585554 1.262727 -3.504673 +v 0.549467 1.324756 -3.504673 +v 0.542661 1.336454 -3.504673 +v 0.506625 1.398396 -3.504673 +v 0.499951 1.409867 -3.504673 +v 0.463758 1.472081 -3.504673 +v 0.457083 1.483553 -3.504673 +v 0.420916 1.545720 -3.504673 +v 0.414273 1.557139 -3.504673 +vt 2.999985 4.153948 +vt 1.596516 5.332810 +vt 2.526482 4.154374 +vt 1.710941 5.373654 +vt 1.789814 5.445583 +vt 2.206063 4.154374 +vt 0.868175 4.154374 +vt 1.819201 5.538409 +vt 1.464133 5.332810 +vt 2.999987 6.927130 +vt 1.789814 5.631235 +vt 1.710941 5.703163 +vt 2.524935 6.929626 +vt 2.203353 6.929626 +vt 0.865555 6.929626 +vt 1.596516 5.744008 +vt 1.464133 5.744008 +vt 1.349707 5.703163 +vt 1.349707 5.373654 +vt 0.571240 4.154374 +vt 0.555166 6.929626 +vt 1.270835 5.631235 +vt 0.000013 4.155042 +vt 1.270835 5.445583 +vt 0.000013 6.929258 +vt 1.241448 5.538409 +vt 2.198123 4.083143 +vt 0.866102 4.083143 +vt 2.199098 7.000349 +vt 0.867076 6.993907 +vt 2.190341 -0.000348 +vt 2.190380 0.028182 +vt 0.859529 -0.000349 +vt 0.859568 0.028182 +vt 2.190590 0.180874 +vt 2.190629 0.209649 +vt 0.859778 0.180874 +vt 0.859818 0.209649 +vt 2.190839 0.362171 +vt 2.190879 0.390945 +vt 0.860027 0.362171 +vt 0.860067 0.390945 +vt 2.191088 0.543524 +vt 2.191128 0.572267 +vt 0.860277 0.543524 +vt 0.860316 0.572266 +vt 2.191338 0.724783 +vt 2.191377 0.753554 +vt 0.860526 0.724783 +vt 0.860566 0.753554 +vt 2.191587 0.906193 +vt 2.191617 0.927873 +vt 0.860776 0.906193 +vt 0.860805 0.927872 +vt 2.191837 1.087673 +vt 2.191876 1.115944 +vt 0.861025 1.087672 +vt 0.861064 1.115943 +vt 2.192086 1.268843 +vt 2.192125 1.297515 +vt 0.861274 1.268842 +vt 0.861314 1.297514 +vt 2.192336 1.450250 +vt 2.192375 1.478760 +vt 0.861524 1.450249 +vt 0.861563 1.478760 +vt 2.192585 1.631529 +vt 2.192624 1.659962 +vt 0.861773 1.631529 +vt 0.861812 1.659961 +vt 2.192834 1.812826 +vt 2.192873 1.841353 +vt 0.862023 1.812826 +vt 0.862062 1.841353 +vt 2.193084 1.994087 +vt 2.193123 2.022590 +vt 0.862272 1.994086 +vt 0.862311 2.022589 +vt 2.193333 2.175620 +vt 2.193372 2.203823 +vt 0.862522 2.175620 +vt 0.862561 2.203823 +vt 2.193583 2.357006 +vt 2.193621 2.385061 +vt 0.862771 2.357006 +vt 0.862810 2.385060 +vt 2.193831 2.538034 +vt 2.193871 2.566599 +vt 0.863020 2.538033 +vt 0.863059 2.566598 +vt 2.194081 2.719514 +vt 2.194120 2.747819 +vt 0.863270 2.719513 +vt 0.863309 2.747819 +vt 2.194330 2.900590 +vt 2.194370 2.929405 +vt 0.863519 2.900589 +vt 0.863558 2.929404 +vt 2.194580 3.081962 +vt 2.194618 3.110219 +vt 0.863768 3.081962 +vt 0.863807 3.110218 +vt 2.194829 3.263443 +vt 2.194868 3.291701 +vt 0.864018 3.263442 +vt 0.864057 3.291701 +vt 2.195079 3.444812 +vt 2.195117 3.472940 +vt 0.864267 3.444811 +vt 0.864306 3.472939 +vt 2.190331 0.447880 +vt 0.859520 0.447879 +vt 2.190371 0.476410 +vt 0.859559 0.476409 +vt 2.190581 0.629103 +vt 0.859769 0.629102 +vt 2.190620 0.657877 +vt 0.859809 0.657877 +vt 2.190830 0.810399 +vt 0.860018 0.810399 +vt 2.190870 0.839173 +vt 0.860058 0.839172 +vt 2.191079 0.991753 +vt 0.860268 0.991752 +vt 2.191119 1.020495 +vt 0.860307 1.020495 +vt 2.191329 1.173012 +vt 0.860517 1.173011 +vt 2.191368 1.201782 +vt 0.860557 1.201782 +vt 2.191578 1.354421 +vt 0.860767 1.354420 +vt 2.191608 1.376101 +vt 0.860797 1.376100 +vt 2.191828 1.535901 +vt 0.861016 1.535900 +vt 2.191867 1.564172 +vt 0.861055 1.564171 +vt 2.192077 1.717071 +vt 0.861265 1.717070 +vt 2.192116 1.745743 +vt 0.861305 1.745742 +vt 2.192327 1.898478 +vt 0.861515 1.898477 +vt 2.192366 1.926988 +vt 0.861554 1.926988 +vt 2.192576 2.079757 +vt 0.861764 2.079756 +vt 2.192615 2.108190 +vt 0.861804 2.108189 +vt 2.192825 2.261055 +vt 0.862014 2.261054 +vt 2.192864 2.289581 +vt 0.862053 2.289581 +vt 2.193075 2.442315 +vt 0.862263 2.442314 +vt 2.193114 2.470817 +vt 0.862302 2.470817 +vt 2.193324 2.623848 +vt 0.862513 2.623847 +vt 2.193363 2.652051 +vt 0.862552 2.652051 +vt 2.193574 2.805234 +vt 0.862762 2.805233 +vt 2.193612 2.833289 +vt 0.862801 2.833288 +vt 2.193822 2.986262 +vt 0.863013 3.000615 +vt 2.193862 3.014827 +vt 0.863051 3.014826 +vt 2.194072 3.167742 +vt 0.863261 3.167741 +vt 2.194111 3.196048 +vt 0.863300 3.196047 +vt 2.194321 3.348818 +vt 0.863510 3.348818 +vt 2.194361 3.377633 +vt 0.863550 3.377632 +vt 2.194571 3.530190 +vt 0.863759 3.530190 +vt 2.194609 3.558446 +vt 0.863798 3.558446 +vt 2.194820 3.711671 +vt 0.864009 3.711670 +vt 2.194859 3.739929 +vt 0.864048 3.739929 +vt 2.195070 3.893040 +vt 0.864259 3.893039 +vt 2.195108 3.921168 +vt 0.864297 3.921167 +vn 0.001875 0.999993 0.003245 +vn -0.000666 1.000000 0.000325 +vn -0.000467 1.000000 0.000583 +vn -0.000219 1.000000 0.000945 +vn 0.000002 0.999999 0.001299 +vn 0.000224 1.000000 0.000942 +vn 0.000468 1.000000 0.000584 +vn -0.001562 0.999994 0.003221 +vn 0.000003 1.000000 0.000002 +vn 0.000000 1.000000 -0.000005 +vn -0.000000 1.000000 -0.000006 +vn 0.000629 0.999999 -0.001345 +vn -0.000229 1.000000 -0.000286 +vn 0.000002 1.000000 -0.000606 +vn -0.000215 1.000000 -0.000953 +vn 0.000106 1.000000 -0.000460 +vn -0.000556 0.999999 -0.001386 +vn -0.007021 0.999975 -0.000002 +vn -0.007071 0.999975 -0.000005 +vn -0.009837 0.999952 0.000064 +vn -0.010833 0.999941 -0.000002 +vn 0.864343 0.502902 -0.000001 +vn 0.864336 0.502915 -0.000000 +vn 0.864332 0.502921 -0.000001 +vn 0.864328 0.502928 -0.000001 +vn 0.864346 0.502898 -0.000001 +vn 0.864344 0.502902 -0.000001 +vn 0.864333 0.502920 -0.000001 +vn 0.864327 0.502931 -0.000000 +vn 0.864333 0.502919 -0.000000 +vn 0.864334 0.502917 -0.000000 +vn 0.864339 0.502909 -0.000000 +vn 0.864358 0.502878 -0.000002 +vn 0.864331 0.502923 -0.000002 +vn 0.864330 0.502925 -0.000001 +vn 0.864336 0.502915 -0.000002 +vn 0.864324 0.502935 -0.000001 +vn 0.864321 0.502941 -0.000000 +vn 0.864331 0.502923 -0.000001 +vn 0.864322 0.502939 -0.000000 +vn 0.864337 0.502913 -0.000001 +vn 0.864320 0.502943 -0.000001 +vn 0.864339 0.502910 -0.000003 +vn 0.864335 0.502917 -0.000000 +vn 0.864332 0.502922 -0.000000 +vn 0.864330 0.502925 -0.000000 +vn 0.864325 0.502934 0.000000 +vn 0.864327 0.502930 -0.000000 +vn 0.864336 0.502916 -0.000000 +vn 0.864335 0.502916 -0.000000 +vn 0.864340 0.502907 0.000000 +vn 0.864347 0.502896 -0.000001 +vn 0.864340 0.502908 -0.000003 +vn 0.864338 0.502911 -0.000002 +vn 0.864345 0.502899 -0.000003 +vn 0.864323 0.502937 -0.000000 +vn 0.864340 0.502909 -0.000001 +vn 0.864337 0.502912 -0.000000 +vn 0.024777 -0.999693 0.000002 +vn -0.024775 0.999693 -0.000002 +vn 0.024777 -0.999693 0.000003 +vn 0.024775 -0.999693 0.000002 +vn -0.024774 0.999693 -0.000002 +vn 0.024774 -0.999693 0.000002 +vn 0.024775 -0.999693 0.000003 +vn -0.024777 0.999693 -0.000002 +vn 0.024776 -0.999693 0.000002 +vn -0.024775 0.999693 -0.000003 +vn -0.024776 0.999693 -0.000002 +vn 0.024776 -0.999690 0.002395 +vn 0.019744 -0.999805 0.000002 +vn 0.024778 -0.999693 0.000002 +vn 0.024775 -0.999693 0.000001 +vn -0.864342 -0.502905 0.000000 +vn -0.864334 -0.502918 0.000001 +vn -0.864337 -0.502914 0.000001 +vn -0.864338 -0.502911 0.000001 +vn -0.864338 -0.502912 0.000001 +vn -0.864330 -0.502925 0.000001 +vn -0.864333 -0.502920 0.000000 +vn -0.864327 -0.502931 0.000001 +vn -0.864328 -0.502928 0.000001 +vn -0.864340 -0.502908 0.000000 +vn -0.864356 -0.502880 0.000000 +vn -0.864346 -0.502898 0.000001 +vn -0.864343 -0.502903 0.000001 +vn -0.864343 -0.502902 0.000001 +vn -0.864336 -0.502915 0.000002 +vn -0.864333 -0.502919 0.000000 +vn -0.864330 -0.502926 0.000001 +vn -0.864339 -0.502910 0.000000 +vn -0.864319 -0.502943 0.000003 +vn -0.864337 -0.502913 0.000000 +vn -0.864336 -0.502915 0.000000 +vn -0.864338 -0.502912 0.000000 +vn -0.864339 -0.502910 0.000001 +vn -0.864320 -0.502942 0.000000 +vn -0.864318 -0.502946 0.000000 +vn -0.864321 -0.502940 0.000000 +vn -0.957312 -0.288739 -0.013540 +vn -0.864337 -0.502912 0.000000 +vn -0.864345 -0.502900 0.000000 +vn -0.864343 -0.502904 0.000000 +vn -0.864324 -0.502935 0.000002 +vn -0.864341 -0.502906 0.000000 +vn -0.864325 -0.502933 0.000002 +vn -0.864355 -0.502882 0.000000 +s off +f 9006/3052/3839 9005/3053/3839 9002/3054/3839 +f 9005/3053/3840 9006/3052/3840 9007/3055/3840 +f 9007/3055/3841 9006/3052/3841 9008/3056/3841 +f 9002/3054/940 9005/3053/940 9001/3057/940 +f 9001/3057/940 9005/3053/940 9003/3058/940 +f 9008/3056/3842 9006/3052/3842 9009/3059/3842 +f 9005/3053/938 9010/3060/938 9003/3058/938 +f 9006/3052/3843 9011/3061/3843 9009/3059/3843 +f 9009/3059/3844 9011/3061/3844 9014/3062/3844 +f 9014/3062/3845 9011/3061/3845 9015/3063/3845 +f 9011/3061/3846 9000/3064/3846 9015/3063/3846 +f 9000/3064/940 8999/3065/940 9015/3063/940 +f 8999/3065/940 8998/3066/940 9015/3063/940 +f 9015/3063/3847 8998/3066/3847 9016/3067/3847 +f 9016/3067/3848 8998/3066/3848 9017/3068/3848 +f 9017/3068/3849 8998/3066/3849 9018/3069/3849 +f 9010/3060/2944 9019/3070/2944 9003/3058/2944 +f 9003/3058/940 9019/3070/940 9004/3071/940 +f 8998/3066/2349 8997/3072/2349 9018/3069/2349 +f 9018/3069/2782 8997/3072/2782 9020/3073/2782 +f 9004/3071/3850 9019/3070/3850 9013/3074/3850 +f 9019/3070/3851 9021/3075/3851 9013/3074/3851 +f 9013/3074/3852 9021/3075/3852 9012/3076/3852 +f 9021/3075/3853 9022/3077/3853 9012/3076/3853 +f 9022/3077/3854 9020/3073/3854 9012/3076/3854 +f 9020/3073/3855 8997/3072/3855 9012/3076/3855 +f 9023/3078/3856 9001/3057/3856 9003/3058/3856 +f 9003/3058/3857 9024/3079/3857 9023/3078/3857 +f 8999/3065/3858 9025/3080/3858 9026/3081/3858 +f 8999/3065/3859 9026/3081/3859 8998/3066/3859 +f 9107/3082/3860 9108/3083/3860 9027/3084/3860 +f 9028/3085/3861 9027/3084/3861 9108/3083/3861 +f 9109/3086/3862 9110/3087/3862 9029/3088/3862 +f 9030/3089/3863 9029/3088/3863 9110/3087/3863 +f 9111/3090/3864 9112/3091/3864 9031/3092/3864 +f 9032/3093/3865 9031/3092/3865 9112/3091/3865 +f 9113/3094/3866 9114/3095/3866 9033/3096/3866 +f 9034/3097/3867 9033/3096/3867 9114/3095/3867 +f 9115/3098/3868 9116/3099/3868 9035/3100/3868 +f 9036/3101/3869 9035/3100/3869 9116/3099/3869 +f 9117/3102/3870 9118/3103/3870 9037/3104/3870 +f 9038/3105/3871 9037/3104/3871 9118/3103/3871 +f 9119/3106/3872 9120/3107/3872 9039/3108/3872 +f 9040/3109/3873 9039/3108/3873 9120/3107/3873 +f 9121/3110/3874 9122/3111/3874 9041/3112/3874 +f 9042/3113/3875 9041/3112/3875 9122/3111/3875 +f 9123/3114/3862 9124/3115/3862 9043/3116/3862 +f 9044/3117/3876 9043/3116/3876 9124/3115/3876 +f 9125/3118/3877 9126/3119/3877 9045/3120/3877 +f 9046/3121/3878 9045/3120/3878 9126/3119/3878 +f 9127/3122/3879 9128/3123/3879 9047/3124/3879 +f 9048/3125/3866 9047/3124/3866 9128/3123/3866 +f 9129/3126/3880 9130/3127/3880 9049/3128/3880 +f 9050/3129/3881 9049/3128/3881 9130/3127/3881 +f 9131/3130/3882 9132/3131/3882 9051/3132/3882 +f 9052/3133/3879 9051/3132/3879 9132/3131/3879 +f 9133/3134/3883 9134/3135/3883 9053/3136/3883 +f 9054/3137/3884 9053/3136/3884 9134/3135/3884 +f 9135/3138/3885 9136/3139/3885 9055/3140/3885 +f 9056/3141/3886 9055/3140/3886 9136/3139/3886 +f 9137/3142/3887 9138/3143/3887 9057/3144/3887 +f 9058/3145/3888 9057/3144/3888 9138/3143/3888 +f 9139/3146/3889 9140/3147/3889 9059/3148/3889 +f 9060/3149/3890 9059/3148/3890 9140/3147/3890 +f 9141/3150/3891 9142/3151/3891 9061/3152/3891 +f 9062/3153/3892 9061/3152/3892 9142/3151/3892 +f 9143/3154/3893 9144/3155/3893 9063/3156/3893 +f 9064/3157/3894 9063/3156/3894 9144/3155/3894 +f 9145/3158/3895 9146/3159/3895 9065/3160/3895 +f 9066/3161/3896 9065/3160/3896 9146/3159/3896 +f 9147/3162/3897 9107/3082/3897 9067/3163/3897 +f 9027/3084/3897 9067/3163/3897 9107/3082/3897 +f 9108/3083/3898 9148/3164/3898 9028/3085/3898 +f 9068/3165/3898 9028/3085/3898 9148/3164/3898 +f 9149/3166/3899 9109/3086/3899 9069/3167/3899 +f 9029/3088/3900 9069/3167/3900 9109/3086/3900 +f 9110/3087/3901 9150/3168/3901 9030/3089/3901 +f 9070/3169/3901 9030/3089/3901 9150/3168/3901 +f 9151/3170/3902 9111/3090/3902 9071/3171/3902 +f 9031/3092/3903 9071/3171/3903 9111/3090/3903 +f 9112/3091/3904 9152/3172/3904 9032/3093/3904 +f 9072/3173/3904 9032/3093/3904 9152/3172/3904 +f 9153/3174/3903 9113/3094/3903 9073/3175/3903 +f 9033/3096/3903 9073/3175/3903 9113/3094/3903 +f 9114/3095/3898 9154/3176/3898 9034/3097/3898 +f 9074/3177/3898 9034/3097/3898 9154/3176/3898 +f 9155/3178/3905 9115/3098/3905 9075/3179/3905 +f 9035/3100/3900 9075/3179/3900 9115/3098/3900 +f 9116/3099/3904 9156/3180/3904 9036/3101/3904 +f 9076/3181/3904 9036/3101/3904 9156/3180/3904 +f 9157/3182/3900 9117/3102/3900 9077/3183/3900 +f 9037/3104/3905 9077/3183/3905 9117/3102/3905 +f 9118/3103/3906 9158/3184/3906 9038/3105/3906 +f 9078/3185/3904 9038/3105/3904 9158/3184/3904 +f 9159/3186/3900 9119/3106/3900 9079/3187/3900 +f 9039/3108/3900 9079/3187/3900 9119/3106/3900 +f 9120/3107/3898 9160/3188/3898 9040/3109/3898 +f 9080/3189/3898 9040/3109/3898 9160/3188/3898 +f 9161/3190/3905 9121/3110/3905 9081/3191/3905 +f 9041/3112/3900 9081/3191/3900 9121/3110/3900 +f 9122/3111/3907 9162/3192/3907 9042/3113/3907 +f 9082/3193/3898 9042/3113/3898 9162/3192/3898 +f 9163/3194/3897 9123/3114/3897 9083/3195/3897 +f 9043/3116/3905 9083/3195/3905 9123/3114/3905 +f 9124/3115/3907 9164/3196/3907 9044/3117/3907 +f 9084/3197/3898 9044/3117/3898 9164/3196/3898 +f 9165/3198/3905 9125/3118/3905 9085/3199/3905 +f 9045/3120/3899 9085/3199/3899 9125/3118/3899 +f 9126/3119/3907 9166/3200/3907 9046/3121/3907 +f 9086/3201/3907 9046/3121/3907 9166/3200/3907 +f 9167/3202/3900 9127/3122/3900 9087/3203/3900 +f 9047/3124/3900 9087/3203/3900 9127/3122/3900 +f 9128/3123/3898 9168/3204/3898 9048/3125/3898 +f 9088/3205/3907 9048/3125/3907 9168/3204/3907 +f 9169/3206/3900 9129/3126/3900 9089/3207/3900 +f 9049/3128/3905 9089/3207/3905 9129/3126/3905 +f 9130/3127/3907 9170/3208/3907 9050/3129/3907 +f 9090/3209/3904 9050/3129/3904 9170/3208/3904 +f 9171/3210/3897 9131/3130/3897 9091/3211/3897 +f 9051/3132/3900 9091/3211/3900 9131/3130/3900 +f 9132/3131/3904 9172/3212/3904 9052/3133/3904 +f 9092/3213/3904 9052/3133/3904 9172/3212/3904 +f 9173/3214/3897 9133/3134/3897 9093/3215/3897 +f 9053/3136/3900 9093/3215/3900 9133/3134/3900 +f 9134/3135/3898 9174/3216/3898 9054/3137/3898 +f 9094/3217/3904 9054/3137/3904 9174/3216/3904 +f 9175/3218/3908 9135/3138/3908 9095/3219/3908 +f 9055/3140/3909 9095/3219/3909 9135/3138/3909 +f 9136/3139/3907 9176/3220/3907 9056/3141/3907 +f 9096/3221/3904 9056/3141/3904 9176/3220/3904 +f 9177/3222/3897 9137/3142/3897 9097/3223/3897 +f 9057/3144/3897 9097/3223/3897 9137/3142/3897 +f 9138/3143/3904 9178/3224/3904 9058/3145/3904 +f 9098/3225/3898 9058/3145/3898 9178/3224/3898 +f 9179/3226/3910 9139/3146/3910 9099/3227/3910 +f 9059/3148/3911 9099/3227/3911 9139/3146/3911 +f 9140/3147/3898 9180/3228/3898 9060/3149/3898 +f 9100/3229/3904 9060/3149/3904 9180/3228/3904 +f 9181/3230/3900 9141/3150/3900 9101/3231/3900 +f 9061/3152/3900 9101/3231/3900 9141/3150/3900 +f 9142/3151/3904 9182/3232/3904 9062/3153/3904 +f 9102/3233/3906 9062/3153/3906 9182/3232/3906 +f 9183/3234/3900 9143/3154/3900 9103/3235/3900 +f 9063/3156/3899 9103/3235/3899 9143/3154/3899 +f 9144/3155/3904 9184/3236/3904 9064/3157/3904 +f 9104/3237/3898 9064/3157/3898 9184/3236/3898 +f 9185/3238/3900 9145/3158/3900 9105/3239/3900 +f 9065/3160/3899 9105/3239/3899 9145/3158/3899 +f 9146/3159/3907 9186/3240/3907 9066/3161/3907 +f 9106/3241/3907 9066/3161/3907 9186/3240/3907 +f 9148/3164/3912 9147/3162/3912 9068/3165/3912 +f 9067/3163/3913 9068/3165/3913 9147/3162/3913 +f 9150/3168/3914 9149/3166/3914 9070/3169/3914 +f 9069/3167/3915 9070/3169/3915 9149/3166/3915 +f 9152/3172/3916 9151/3170/3916 9072/3173/3916 +f 9071/3171/3917 9072/3173/3917 9151/3170/3917 +f 9154/3176/3918 9153/3174/3918 9074/3177/3918 +f 9073/3175/3919 9074/3177/3919 9153/3174/3919 +f 9156/3180/3920 9155/3178/3920 9076/3181/3920 +f 9075/3179/3921 9076/3181/3921 9155/3178/3921 +f 9158/3184/3922 9157/3182/3922 9078/3185/3922 +f 9077/3183/3923 9078/3185/3923 9157/3182/3923 +f 9160/3188/3924 9159/3186/3924 9080/3189/3924 +f 9079/3187/3915 9080/3189/3915 9159/3186/3915 +f 9162/3192/3925 9161/3190/3925 9082/3193/3925 +f 9081/3191/3926 9082/3193/3926 9161/3190/3926 +f 9164/3196/3927 9163/3194/3927 9084/3197/3927 +f 9083/3195/3928 9084/3197/3928 9163/3194/3928 +f 9166/3200/3929 9165/3198/3929 9086/3201/3929 +f 9085/3199/3930 9086/3201/3930 9165/3198/3930 +f 9168/3204/3931 9167/3202/3931 9088/3205/3931 +f 9087/3203/3932 9088/3205/3932 9167/3202/3932 +f 9170/3208/3933 9169/3206/3933 9090/3209/3933 +f 9089/3207/3912 9090/3209/3912 9169/3206/3912 +f 9172/3212/3934 9171/3210/3934 9092/3213/3934 +f 9091/3211/3934 9092/3213/3934 9171/3210/3934 +f 9174/3216/3935 9173/3214/3935 9094/3217/3935 +f 9093/3215/3936 9094/3217/3936 9173/3214/3936 +f 9176/3220/3937 9175/3218/3937 9096/3221/3937 +f 9095/3219/3938 9096/3221/3938 9175/3218/3938 +f 9178/3224/3939 9177/3222/3939 9098/3225/3939 +f 9097/3223/3939 9098/3225/3939 9177/3222/3939 +f 9180/3228/3940 9179/3226/3940 9100/3229/3940 +f 9099/3227/3941 9100/3229/3941 9179/3226/3941 +f 9182/3232/3916 9181/3230/3916 9102/3233/3916 +f 9101/3231/3942 9102/3233/3942 9181/3230/3942 +f 9184/3236/3943 9183/3234/3943 9104/3237/3943 +f 9103/3235/3944 9104/3237/3944 9183/3234/3944 +f 9186/3240/3945 9185/3238/3945 9106/3241/3945 +f 9105/3239/3945 9106/3241/3945 9185/3238/3945 +o diesnohu +v 1.463325 0.093492 2.192520 +v 1.463327 0.094038 4.103106 +v 0.900380 0.094857 4.103106 +v 0.900378 0.094311 2.192519 +v 0.900749 0.094193 1.781114 +v 0.900605 0.094032 1.218040 +v 1.463663 0.093374 1.781233 +v 1.464291 0.931704 2.165873 +v 1.463476 0.875838 2.165874 +v 1.463327 0.875999 2.192522 +v 1.463327 0.875999 2.222919 +v 1.463327 0.875998 4.072710 +v 1.463327 0.875998 4.103107 +v 1.464291 0.931702 4.131416 +v 1.463476 0.875836 4.131416 +v 1.431916 0.929351 2.165873 +v 1.431082 0.875838 2.165874 +v 1.432104 0.929460 2.192521 +v 1.431223 0.876204 2.192522 +v 1.432104 0.929460 2.222919 +v 1.431223 0.876204 2.222919 +v 1.432105 0.929459 4.072710 +v 1.431223 0.876202 4.072710 +v 1.432105 0.929459 4.103107 +v 1.431223 0.876202 4.103107 +v 1.431917 0.929349 4.131416 +v 1.431083 0.875836 4.131415 +v 1.431917 0.929349 4.063842 +v 1.431082 0.875836 4.063842 +v 1.431916 0.929351 2.234157 +v 1.431082 0.875838 2.234158 +v 1.380968 0.873080 2.234158 +v 1.381833 0.925676 2.234157 +v 1.381834 0.925674 4.063842 +v 1.380969 0.873078 4.063842 +v 0.900543 0.892141 2.165873 +v 0.900381 0.845629 2.166436 +v 0.900381 0.845629 2.192521 +v 0.900381 0.845629 2.222919 +v 0.900381 0.845628 4.072709 +v 0.900544 0.892139 4.131415 +v 0.900381 0.845628 4.103106 +v 0.900381 0.845628 4.130291 +v 0.932918 0.894427 2.165873 +v 0.931798 0.844994 2.165873 +v 0.933051 0.893983 2.192521 +v 0.931815 0.845715 2.192521 +v 0.933051 0.893983 2.222919 +v 0.931815 0.845715 2.222919 +v 0.932939 0.893980 4.072709 +v 0.931880 0.845713 4.072709 +v 0.932939 0.893980 4.103106 +v 0.931880 0.845713 4.103106 +v 0.932919 0.894425 4.131415 +v 0.931799 0.844993 4.131415 +v 0.932918 0.894425 4.063841 +v 0.931799 0.844993 4.063841 +v 0.932918 0.894427 2.234158 +v 0.931798 0.844994 2.234157 +v 0.981911 0.848079 2.234157 +v 0.983002 0.897949 2.234158 +v 0.983003 0.897947 4.063841 +v 0.981912 0.848078 4.063841 +v 0.900378 0.115100 2.222918 +v 1.463327 0.115100 2.222918 +v 1.415778 0.552529 2.205991 +v 1.185138 0.552529 2.205991 +v 1.185139 0.831028 2.205991 +v 1.415778 0.848654 2.205991 +v 1.149921 0.553503 2.205991 +v 0.965106 0.553503 2.205991 +v 0.965105 0.814653 2.205991 +v 1.149921 0.828695 2.205991 +v 0.943114 0.837778 2.216147 +v 1.436269 0.871013 2.216148 +v 1.436268 0.531104 2.216147 +v 0.943115 0.531104 2.216147 +v 1.416596 0.849704 2.216148 +v 1.416596 0.551479 2.216147 +v 1.184321 0.831953 2.216147 +v 1.184320 0.551479 2.216147 +v 1.151280 0.551479 2.216147 +v 0.963746 0.551479 2.216147 +v 0.963746 0.816470 2.216147 +v 1.151280 0.830719 2.216147 +v 0.943114 0.837778 2.222919 +v 1.436269 0.871013 2.222919 +v 1.436268 0.531104 2.222918 +v 0.943115 0.531104 2.222918 +v 0.943114 0.837778 2.195835 +v 1.436269 0.871013 2.195835 +v 1.436268 0.531104 2.195834 +v 0.943115 0.531104 2.195835 +v 1.416596 0.849704 2.195835 +v 1.416596 0.551479 2.195835 +v 1.184321 0.831953 2.195835 +v 1.184320 0.551479 2.195835 +v 1.151280 0.551479 2.195835 +v 0.963746 0.551479 2.195835 +v 0.963746 0.816470 2.195835 +v 1.151280 0.830719 2.195835 +v 0.943114 0.837778 2.192521 +v 1.436269 0.871013 2.192522 +v 1.436268 0.531104 2.192521 +v 0.943115 0.531104 2.192521 +v 0.900379 0.115098 4.072709 +v 1.463328 0.115098 4.072709 +v 1.415779 0.552528 4.089636 +v 1.185139 0.552528 4.089636 +v 1.185139 0.831026 4.089637 +v 1.415779 0.848652 4.089637 +v 1.149922 0.553501 4.089636 +v 0.965106 0.553501 4.089636 +v 0.965106 0.814651 4.089637 +v 1.149922 0.828693 4.089637 +v 0.937493 0.837777 4.079480 +v 1.436269 0.871011 4.079480 +v 1.436269 0.531102 4.079480 +v 0.943115 0.531102 4.079480 +v 1.416597 0.849702 4.079480 +v 1.416597 0.551477 4.079480 +v 1.184321 0.831951 4.079480 +v 1.184321 0.551478 4.079480 +v 1.151281 0.551478 4.079480 +v 0.963747 0.551478 4.079480 +v 0.963746 0.816468 4.079480 +v 1.151280 0.830717 4.079480 +v 0.937493 0.837777 4.072709 +v 1.436269 0.871011 4.072710 +v 1.436269 0.531102 4.072709 +v 0.943115 0.531102 4.072709 +v 0.937493 0.837777 4.099792 +v 1.436269 0.871011 4.099793 +v 1.436269 0.531102 4.099793 +v 0.943115 0.531102 4.099792 +v 1.416597 0.849702 4.099793 +v 1.416597 0.551477 4.099793 +v 1.184321 0.831951 4.099792 +v 1.184321 0.551478 4.099793 +v 1.151281 0.551478 4.099793 +v 0.963747 0.551478 4.099792 +v 0.963746 0.816468 4.099793 +v 1.151280 0.830717 4.099792 +v 0.937493 0.837777 4.103106 +v 1.436269 0.871011 4.103107 +v 1.436269 0.531102 4.103107 +v 0.943115 0.531102 4.103106 +v 1.345370 0.115099 3.027511 +v 1.017895 0.115099 3.027511 +v 1.345370 0.133115 3.027511 +v 1.017895 0.133115 3.027511 +v 1.345370 0.115099 2.511425 +v 1.345370 0.133116 2.511426 +v 1.017895 0.115099 2.511426 +v 1.017895 0.133116 2.511426 +v 1.279150 0.133115 2.979055 +v 1.083920 0.133114 2.979055 +v 1.279150 0.133115 2.562004 +v 1.083920 0.133115 2.562004 +v 1.345370 0.115098 3.787743 +v 1.017895 0.115098 3.787743 +v 1.345370 0.133115 3.787743 +v 1.017895 0.133115 3.787743 +v 1.345370 0.115099 3.271658 +v 1.345370 0.133115 3.271658 +v 1.017895 0.115099 3.271658 +v 1.017895 0.133115 3.271658 +v 1.279149 0.133114 3.739287 +v 1.083920 0.133114 3.739287 +v 1.279149 0.133114 3.322236 +v 1.083921 0.133114 3.322236 +v 1.463727 0.936778 1.780627 +v 1.463696 0.867985 1.748138 +v 1.463728 0.867985 1.250921 +v 1.463727 0.936778 1.218442 +v 1.431609 0.868086 1.250921 +v 1.431576 0.868086 1.748138 +v 1.431633 0.934468 1.250921 +v 1.431600 0.934468 1.748138 +v 0.943519 0.830164 1.218051 +v 1.436672 0.863063 1.218051 +v 1.463730 0.109174 1.218051 +v 1.436672 0.526584 1.218050 +v 0.900781 0.897513 1.218051 +v 0.943519 0.526583 1.218050 +v 1.417001 0.546753 1.223843 +v 1.417000 0.841969 1.223843 +v 1.184725 0.824397 1.223843 +v 1.184725 0.546753 1.223843 +v 1.151685 0.546753 1.223843 +v 0.964151 0.546753 1.223843 +v 0.964150 0.809070 1.223843 +v 1.151684 0.823175 1.223843 +v 0.943519 0.830164 1.223843 +v 1.436672 0.863063 1.223843 +v 1.436672 0.526584 1.223843 +v 0.943519 0.526584 1.223843 +v 1.416366 0.547560 1.227852 +v 1.416366 0.841163 1.227852 +v 1.185360 0.823687 1.227853 +v 1.185359 0.547560 1.227852 +v 0.964919 0.547886 1.227852 +v 1.150915 0.547886 1.227852 +v 0.964919 0.808053 1.227853 +v 1.150916 0.822042 1.227853 +v 0.943519 0.830164 1.251065 +v 1.436672 0.863063 1.251065 +v 1.463731 0.109174 1.251065 +v 1.436672 0.526584 1.251065 +v 0.933952 0.899798 1.251059 +v 0.933952 0.109174 1.251058 +v 0.943519 0.526583 1.251065 +v 1.417000 0.841969 1.237170 +v 1.417001 0.546753 1.237170 +v 1.184725 0.824397 1.237170 +v 1.184725 0.546753 1.237170 +v 1.151685 0.546753 1.237170 +v 0.964151 0.546753 1.237170 +v 0.964150 0.809070 1.237170 +v 1.151684 0.823175 1.237170 +v 1.436672 0.863063 1.237170 +v 0.943519 0.830164 1.237170 +v 1.436672 0.526584 1.237170 +v 0.943519 0.526583 1.237170 +v 0.933962 0.830208 1.253380 +v 0.933962 0.526628 1.253380 +v 0.933941 0.899524 1.748221 +v 0.933962 0.830208 1.746534 +v 0.933941 0.109174 1.748220 +v 0.933962 0.526627 1.746533 +v 0.920025 0.809114 1.273052 +v 0.920026 0.546798 1.273052 +v 0.920026 0.546797 1.399789 +v 0.920026 0.546797 1.437342 +v 0.920026 0.546797 1.564079 +v 0.920026 0.546797 1.599165 +v 0.920026 0.546797 1.725902 +v 0.920025 0.809114 1.399789 +v 0.920026 0.809114 1.725902 +v 0.920025 0.809114 1.437342 +v 0.920025 0.809114 1.564079 +v 0.920025 0.809114 1.599165 +v 0.920025 0.830208 1.253380 +v 0.920025 0.830208 1.746534 +v 0.920026 0.526628 1.253380 +v 0.920026 0.526627 1.746534 +v 0.910735 0.807993 1.273594 +v 0.910735 0.547919 1.273593 +v 0.910735 0.547918 1.399247 +v 0.910735 0.547958 1.437903 +v 0.910735 0.547958 1.563518 +v 0.910734 0.547273 1.599721 +v 0.910734 0.547273 1.725346 +v 0.910735 0.807993 1.399248 +v 0.910735 0.808665 1.725346 +v 0.910735 0.807953 1.437903 +v 0.910735 0.807953 1.563518 +v 0.910735 0.808665 1.599721 +v 0.900781 0.526628 1.253380 +v 0.900781 0.830208 1.253380 +v 0.900748 0.897512 1.781117 +v 0.900780 0.830208 1.746534 +v 0.900780 0.526628 1.746534 +v 0.906754 0.546798 1.273052 +v 0.906753 0.809114 1.273052 +v 0.906754 0.546797 1.399789 +v 0.906754 0.546797 1.437342 +v 0.906754 0.546797 1.564079 +v 0.906754 0.546797 1.599165 +v 0.906754 0.546797 1.725902 +v 0.906753 0.809114 1.399789 +v 0.906753 0.809114 1.725902 +v 0.906753 0.809114 1.437342 +v 0.906753 0.809114 1.564079 +v 0.906753 0.809114 1.599165 +v 0.906753 0.830208 1.746534 +v 0.906753 0.830208 1.253380 +v 0.906754 0.526628 1.253380 +v 0.906754 0.526627 1.746533 +v 0.943453 0.830163 1.781234 +v 1.436607 0.863063 1.781234 +v 1.436607 0.526583 1.781234 +v 0.943453 0.526583 1.781234 +v 1.416935 0.841969 1.775442 +v 1.416935 0.546753 1.775442 +v 1.184659 0.824397 1.775442 +v 1.184659 0.546753 1.775442 +v 1.151619 0.546753 1.775442 +v 0.964085 0.546753 1.775442 +v 0.964086 0.809070 1.775442 +v 1.151619 0.823175 1.775442 +v 1.436607 0.863063 1.775442 +v 0.943453 0.830163 1.775442 +v 1.436607 0.526583 1.775442 +v 0.943453 0.526583 1.775442 +v 1.416300 0.841162 1.771433 +v 1.416300 0.547559 1.771433 +v 1.185294 0.823686 1.771433 +v 1.185294 0.547559 1.771433 +v 1.150850 0.547886 1.771433 +v 0.964854 0.547886 1.771433 +v 0.964854 0.808052 1.771433 +v 1.150850 0.822042 1.771433 +v 0.943454 0.830163 1.748220 +v 1.436607 0.863062 1.748220 +v 1.463665 0.109174 1.748219 +v 1.436607 0.526583 1.748220 +v 0.943453 0.526583 1.748220 +v 1.416935 0.546753 1.762115 +v 1.416935 0.841969 1.762115 +v 1.184659 0.824397 1.762116 +v 1.184659 0.546753 1.762115 +v 1.151619 0.546753 1.762115 +v 0.964085 0.546753 1.762115 +v 0.964086 0.809070 1.762115 +v 1.151619 0.823175 1.762115 +v 0.943453 0.830163 1.762115 +v 1.436607 0.863062 1.762115 +v 1.436607 0.526583 1.762115 +v 0.943453 0.526583 1.762115 +v 1.349776 0.355679 1.742367 +v 1.049500 0.355679 1.742367 +v 1.349776 0.372361 1.742367 +v 1.049500 0.372361 1.742367 +v 1.464291 0.931704 2.165873 +v 1.463476 0.875838 2.165874 +v 1.431082 0.875838 2.165874 +v 1.431082 0.875838 2.165874 +v 1.431916 0.929351 2.165873 +v 1.464291 0.931704 2.165873 +v 1.463476 0.875838 2.165874 +v 1.463327 0.875999 2.192522 +v 1.431223 0.876204 2.192522 +v 1.431223 0.876204 2.192522 +v 1.431082 0.875838 2.165874 +v 1.463476 0.875838 2.165874 +v 1.463327 0.875998 4.103107 +v 1.463476 0.875836 4.131416 +v 1.431083 0.875836 4.131415 +v 1.431083 0.875836 4.131415 +v 1.431223 0.876202 4.103107 +v 1.463327 0.875998 4.103107 +v 1.463476 0.875836 4.131416 +v 1.464291 0.931702 4.131416 +v 1.431917 0.929349 4.131416 +v 1.431917 0.929349 4.131416 +v 1.431083 0.875836 4.131415 +v 1.463476 0.875836 4.131416 +v 1.463327 0.875999 2.222919 +v 1.431082 0.875838 2.234158 +v 1.431223 0.876204 2.222919 +v 1.431916 0.929351 2.234157 +v 1.431082 0.875838 2.234158 +v 1.431916 0.929351 2.234157 +v 1.431082 0.875836 4.063842 +v 1.431917 0.929349 4.063842 +v 1.431082 0.875836 4.063842 +v 0.900381 0.845629 2.166436 +v 0.900543 0.892141 2.165873 +v 0.931798 0.844994 2.165873 +v 0.932918 0.894427 2.165873 +v 0.931798 0.844994 2.165873 +v 0.900543 0.892141 2.165873 +v 0.900381 0.845629 2.192521 +v 0.900381 0.845629 2.166436 +v 0.931815 0.845715 2.192521 +v 0.931798 0.844994 2.165873 +v 0.931815 0.845715 2.192521 +v 0.900381 0.845629 2.166436 +v 0.900381 0.845628 4.130291 +v 0.900381 0.845628 4.103106 +v 0.931799 0.844993 4.131415 +v 0.931880 0.845713 4.103106 +v 0.931799 0.844993 4.131415 +v 0.900381 0.845628 4.103106 +v 0.900544 0.892139 4.131415 +v 0.900381 0.845628 4.130291 +v 0.932919 0.894425 4.131415 +v 0.931799 0.844993 4.131415 +v 0.932919 0.894425 4.131415 +v 0.900381 0.845628 4.130291 +v 0.931798 0.844994 2.234157 +v 0.900381 0.845629 2.222919 +v 0.931815 0.845715 2.222919 +v 0.931798 0.844994 2.234157 +v 0.932918 0.894427 2.234158 +v 0.932918 0.894427 2.234158 +v 0.932918 0.894425 4.063841 +v 0.931799 0.844993 4.063841 +v 0.931799 0.844993 4.063841 +v 1.431223 0.876204 2.222919 +v 1.463327 0.875999 2.222919 +v 1.431223 0.876204 2.222919 +v 1.463327 0.875999 2.222919 +v 1.431223 0.876204 2.222919 +v 1.432104 0.929460 2.222919 +v 0.933051 0.893983 2.222919 +v 1.431223 0.876204 2.222919 +v 0.933051 0.893983 2.222919 +v 0.933051 0.893983 2.222919 +v 0.931815 0.845715 2.222919 +v 0.900381 0.845629 2.222919 +v 0.900381 0.845629 2.222919 +v 0.931815 0.845715 2.222919 +v 0.900381 0.845629 2.222919 +v 1.416596 0.551479 2.216147 +v 1.416596 0.551479 2.216147 +v 1.416596 0.849704 2.216148 +v 1.415778 0.848654 2.205991 +v 1.416596 0.849704 2.216148 +v 1.416596 0.849704 2.216148 +v 1.184321 0.831953 2.216147 +v 1.415778 0.552529 2.205991 +v 1.184320 0.551479 2.216147 +v 1.184320 0.551479 2.216147 +v 1.416596 0.551479 2.216147 +v 1.415778 0.552529 2.205991 +v 0.963746 0.551479 2.216147 +v 0.963746 0.551479 2.216147 +v 1.151280 0.551479 2.216147 +v 0.965106 0.553503 2.205991 +v 0.963746 0.816470 2.216147 +v 0.963746 0.816470 2.216147 +v 0.963746 0.551479 2.216147 +v 0.965106 0.553503 2.205991 +v 1.185138 0.552529 2.205991 +v 1.185139 0.831028 2.205991 +v 1.184321 0.831953 2.216147 +v 1.184321 0.831953 2.216147 +v 1.184320 0.551479 2.216147 +v 1.185138 0.552529 2.205991 +v 1.149921 0.553503 2.205991 +v 1.151280 0.551479 2.216147 +v 1.151280 0.551479 2.216147 +v 1.151280 0.830719 2.216147 +v 0.965105 0.814653 2.205991 +v 1.149921 0.828695 2.205991 +v 1.151280 0.830719 2.216147 +v 1.151280 0.830719 2.216147 +v 0.963746 0.816470 2.216147 +v 0.965105 0.814653 2.205991 +v 0.943114 0.837778 2.216147 +v 1.436269 0.871013 2.216148 +v 1.436269 0.871013 2.222919 +v 1.436269 0.871013 2.222919 +v 0.943114 0.837778 2.222919 +v 0.943114 0.837778 2.216147 +v 1.436269 0.871013 2.216148 +v 1.436268 0.531104 2.216147 +v 1.436268 0.531104 2.222918 +v 1.436268 0.531104 2.222918 +v 1.436269 0.871013 2.222919 +v 1.436269 0.871013 2.216148 +v 1.436268 0.531104 2.216147 +v 0.943115 0.531104 2.216147 +v 0.943115 0.531104 2.222918 +v 0.943115 0.531104 2.222918 +v 1.436268 0.531104 2.222918 +v 1.436268 0.531104 2.216147 +v 0.943115 0.531104 2.216147 +v 0.943114 0.837778 2.216147 +v 0.943114 0.837778 2.222919 +v 0.943114 0.837778 2.222919 +v 0.943115 0.531104 2.222918 +v 0.943115 0.531104 2.216147 +v 1.431223 0.876204 2.192522 +v 1.431223 0.876204 2.192522 +v 1.463327 0.875999 2.192522 +v 1.463327 0.875999 2.192522 +v 1.432104 0.929460 2.192521 +v 1.431223 0.876204 2.192522 +v 0.933051 0.893983 2.192521 +v 1.431223 0.876204 2.192522 +v 0.933051 0.893983 2.192521 +v 0.933051 0.893983 2.192521 +v 0.931815 0.845715 2.192521 +v 0.900381 0.845629 2.192521 +v 0.900381 0.845629 2.192521 +v 0.900381 0.845629 2.192521 +v 0.931815 0.845715 2.192521 +v 1.463327 0.115100 2.222918 +v 1.463325 0.093492 2.192520 +v 1.463327 0.115100 2.222918 +v 0.900378 0.115100 2.222918 +v 0.900378 0.094311 2.192519 +v 0.900378 0.094311 2.192519 +v 1.416596 0.551479 2.195835 +v 1.416596 0.849704 2.195835 +v 1.416596 0.551479 2.195835 +v 1.415778 0.848654 2.205991 +v 1.416596 0.849704 2.195835 +v 1.184321 0.831953 2.195835 +v 1.416596 0.849704 2.195835 +v 1.415778 0.552529 2.205991 +v 1.184320 0.551479 2.195835 +v 1.416596 0.551479 2.195835 +v 1.184320 0.551479 2.195835 +v 1.415778 0.552529 2.205991 +v 0.963746 0.551479 2.195835 +v 1.151280 0.551479 2.195835 +v 0.963746 0.551479 2.195835 +v 0.965106 0.553503 2.205991 +v 0.963746 0.816470 2.195835 +v 0.963746 0.551479 2.195835 +v 0.963746 0.816470 2.195835 +v 0.965106 0.553503 2.205991 +v 1.185139 0.831028 2.205991 +v 1.185138 0.552529 2.205991 +v 1.184321 0.831953 2.195835 +v 1.184320 0.551479 2.195835 +v 1.184321 0.831953 2.195835 +v 1.185138 0.552529 2.205991 +v 1.149921 0.553503 2.205991 +v 1.151280 0.551479 2.195835 +v 1.151280 0.830719 2.195835 +v 1.151280 0.551479 2.195835 +v 1.149921 0.828695 2.205991 +v 0.965105 0.814653 2.205991 +v 1.151280 0.830719 2.195835 +v 0.963746 0.816470 2.195835 +v 1.151280 0.830719 2.195835 +v 0.965105 0.814653 2.205991 +v 1.436269 0.871013 2.195835 +v 0.943114 0.837778 2.195835 +v 1.436269 0.871013 2.192522 +v 0.943114 0.837778 2.192521 +v 1.436269 0.871013 2.192522 +v 0.943114 0.837778 2.195835 +v 1.436268 0.531104 2.195834 +v 1.436269 0.871013 2.195835 +v 1.436268 0.531104 2.192521 +v 1.436269 0.871013 2.192522 +v 1.436268 0.531104 2.192521 +v 1.436269 0.871013 2.195835 +v 0.943115 0.531104 2.195835 +v 1.436268 0.531104 2.195834 +v 0.943115 0.531104 2.192521 +v 1.436268 0.531104 2.192521 +v 0.943115 0.531104 2.192521 +v 1.436268 0.531104 2.195834 +v 0.943114 0.837778 2.195835 +v 0.943115 0.531104 2.195835 +v 0.943114 0.837778 2.192521 +v 0.943115 0.531104 2.192521 +v 0.943114 0.837778 2.192521 +v 0.943115 0.531104 2.195835 +v 1.431223 0.876202 4.072710 +v 1.431223 0.876202 4.072710 +v 1.463327 0.875998 4.072710 +v 1.463327 0.875998 4.072710 +v 1.432105 0.929459 4.072710 +v 1.431223 0.876202 4.072710 +v 0.932939 0.893980 4.072709 +v 1.431223 0.876202 4.072710 +v 0.932939 0.893980 4.072709 +v 0.932939 0.893980 4.072709 +v 0.931880 0.845713 4.072709 +v 0.900381 0.845628 4.072709 +v 0.900381 0.845628 4.072709 +v 0.900381 0.845628 4.072709 +v 0.931880 0.845713 4.072709 +v 1.416597 0.551477 4.079480 +v 1.416597 0.849702 4.079480 +v 1.416597 0.551477 4.079480 +v 1.415779 0.848652 4.089637 +v 1.416597 0.849702 4.079480 +v 1.184321 0.831951 4.079480 +v 1.416597 0.849702 4.079480 +v 1.415779 0.552528 4.089636 +v 1.184321 0.551478 4.079480 +v 1.416597 0.551477 4.079480 +v 1.184321 0.551478 4.079480 +v 1.415779 0.552528 4.089636 +v 0.963747 0.551478 4.079480 +v 1.151281 0.551478 4.079480 +v 0.963747 0.551478 4.079480 +v 0.965106 0.553501 4.089636 +v 0.963746 0.816468 4.079480 +v 0.963747 0.551478 4.079480 +v 0.963746 0.816468 4.079480 +v 0.965106 0.553501 4.089636 +v 1.185139 0.831026 4.089637 +v 1.185139 0.552528 4.089636 +v 1.184321 0.831951 4.079480 +v 1.184321 0.551478 4.079480 +v 1.184321 0.831951 4.079480 +v 1.185139 0.552528 4.089636 +v 1.149922 0.553501 4.089636 +v 1.151281 0.551478 4.079480 +v 1.151280 0.830717 4.079480 +v 1.151281 0.551478 4.079480 +v 1.149922 0.828693 4.089637 +v 0.965106 0.814651 4.089637 +v 1.151280 0.830717 4.079480 +v 0.963746 0.816468 4.079480 +v 1.151280 0.830717 4.079480 +v 0.965106 0.814651 4.089637 +v 1.436269 0.871011 4.079480 +v 0.937493 0.837777 4.079480 +v 1.436269 0.871011 4.072710 +v 0.937493 0.837777 4.072709 +v 1.436269 0.871011 4.072710 +v 0.937493 0.837777 4.079480 +v 1.436269 0.531102 4.079480 +v 1.436269 0.871011 4.079480 +v 1.436269 0.531102 4.072709 +v 1.436269 0.871011 4.072710 +v 1.436269 0.531102 4.072709 +v 1.436269 0.871011 4.079480 +v 0.943115 0.531102 4.079480 +v 1.436269 0.531102 4.079480 +v 0.943115 0.531102 4.072709 +v 1.436269 0.531102 4.072709 +v 0.943115 0.531102 4.072709 +v 1.436269 0.531102 4.079480 +v 0.937493 0.837777 4.079480 +v 0.943115 0.531102 4.079480 +v 0.937493 0.837777 4.072709 +v 0.943115 0.531102 4.072709 +v 0.937493 0.837777 4.072709 +v 0.943115 0.531102 4.079480 +v 1.431223 0.876202 4.103107 +v 1.463327 0.875998 4.103107 +v 1.431223 0.876202 4.103107 +v 1.463327 0.875998 4.103107 +v 1.431223 0.876202 4.103107 +v 1.432105 0.929459 4.103107 +v 0.932939 0.893980 4.103106 +v 1.431223 0.876202 4.103107 +v 0.932939 0.893980 4.103106 +v 0.932939 0.893980 4.103106 +v 0.931880 0.845713 4.103106 +v 0.900381 0.845628 4.103106 +v 0.900381 0.845628 4.103106 +v 0.931880 0.845713 4.103106 +v 0.900381 0.845628 4.103106 +v 1.463328 0.115098 4.072709 +v 1.463327 0.094038 4.103106 +v 1.463328 0.115098 4.072709 +v 0.900379 0.115098 4.072709 +v 0.900380 0.094857 4.103106 +v 0.900380 0.094857 4.103106 +v 1.416597 0.551477 4.099793 +v 1.416597 0.551477 4.099793 +v 1.416597 0.849702 4.099793 +v 1.415779 0.848652 4.089637 +v 1.416597 0.849702 4.099793 +v 1.416597 0.849702 4.099793 +v 1.184321 0.831951 4.099792 +v 1.415779 0.552528 4.089636 +v 1.184321 0.551478 4.099793 +v 1.184321 0.551478 4.099793 +v 1.416597 0.551477 4.099793 +v 1.415779 0.552528 4.089636 +v 0.963747 0.551478 4.099792 +v 0.963747 0.551478 4.099792 +v 1.151281 0.551478 4.099793 +v 0.965106 0.553501 4.089636 +v 0.963746 0.816468 4.099793 +v 0.963746 0.816468 4.099793 +v 0.963747 0.551478 4.099792 +v 0.965106 0.553501 4.089636 +v 1.185139 0.552528 4.089636 +v 1.185139 0.831026 4.089637 +v 1.184321 0.831951 4.099792 +v 1.184321 0.831951 4.099792 +v 1.184321 0.551478 4.099793 +v 1.185139 0.552528 4.089636 +v 1.149922 0.553501 4.089636 +v 1.151281 0.551478 4.099793 +v 1.151281 0.551478 4.099793 +v 1.151280 0.830717 4.099792 +v 0.965106 0.814651 4.089637 +v 1.149922 0.828693 4.089637 +v 1.151280 0.830717 4.099792 +v 1.151280 0.830717 4.099792 +v 0.963746 0.816468 4.099793 +v 0.965106 0.814651 4.089637 +v 0.937493 0.837777 4.099792 +v 1.436269 0.871011 4.099793 +v 1.436269 0.871011 4.103107 +v 1.436269 0.871011 4.103107 +v 0.937493 0.837777 4.103106 +v 0.937493 0.837777 4.099792 +v 1.436269 0.871011 4.099793 +v 1.436269 0.531102 4.099793 +v 1.436269 0.531102 4.103107 +v 1.436269 0.531102 4.103107 +v 1.436269 0.871011 4.103107 +v 1.436269 0.871011 4.099793 +v 1.436269 0.531102 4.099793 +v 0.943115 0.531102 4.099792 +v 0.943115 0.531102 4.103106 +v 0.943115 0.531102 4.103106 +v 1.436269 0.531102 4.103107 +v 1.436269 0.531102 4.099793 +v 0.943115 0.531102 4.099792 +v 0.937493 0.837777 4.099792 +v 0.937493 0.837777 4.103106 +v 0.937493 0.837777 4.103106 +v 0.943115 0.531102 4.103106 +v 0.943115 0.531102 4.099792 +v 1.345370 0.115099 3.027511 +v 1.345370 0.133115 3.027511 +v 1.345370 0.115099 3.027511 +v 1.017895 0.115099 3.027511 +v 1.017895 0.133115 3.027511 +v 1.017895 0.133115 3.027511 +v 1.345370 0.115099 2.511425 +v 1.017895 0.115099 2.511426 +v 1.017895 0.133116 2.511426 +v 1.017895 0.133116 2.511426 +v 1.345370 0.133116 2.511426 +v 1.345370 0.115099 2.511425 +v 1.017895 0.133115 3.027511 +v 1.345370 0.133115 3.027511 +v 1.017895 0.133115 3.027511 +v 1.345370 0.133115 3.027511 +v 1.345370 0.133116 2.511426 +v 1.345370 0.133115 3.027511 +v 1.017895 0.133116 2.511426 +v 1.017895 0.133115 3.027511 +v 1.017895 0.133116 2.511426 +v 1.345370 0.133116 2.511426 +v 1.017895 0.133116 2.511426 +v 1.345370 0.133116 2.511426 +v 1.345370 0.115098 3.787743 +v 1.345370 0.133115 3.787743 +v 1.345370 0.115098 3.787743 +v 1.017895 0.115098 3.787743 +v 1.017895 0.133115 3.787743 +v 1.017895 0.133115 3.787743 +v 1.345370 0.115099 3.271658 +v 1.017895 0.115099 3.271658 +v 1.017895 0.133115 3.271658 +v 1.017895 0.133115 3.271658 +v 1.345370 0.133115 3.271658 +v 1.345370 0.115099 3.271658 +v 1.017895 0.133115 3.787743 +v 1.345370 0.133115 3.787743 +v 1.017895 0.133115 3.787743 +v 1.345370 0.133115 3.787743 +v 1.345370 0.133115 3.271658 +v 1.345370 0.133115 3.787743 +v 1.017895 0.133115 3.271658 +v 1.017895 0.133115 3.787743 +v 1.017895 0.133115 3.271658 +v 1.345370 0.133115 3.271658 +v 1.017895 0.133115 3.271658 +v 1.345370 0.133115 3.271658 +v 0.900378 0.115100 2.222918 +v 1.017895 0.115099 2.511426 +v 1.345370 0.115099 2.511425 +v 0.900378 0.115100 2.222918 +v 1.345370 0.115099 2.511425 +v 1.463327 0.115100 2.222918 +v 1.463327 0.115100 2.222918 +v 1.345370 0.115099 2.511425 +v 1.345370 0.115099 3.027511 +v 0.900378 0.115100 2.222918 +v 1.017895 0.115099 3.027511 +v 1.017895 0.115099 2.511426 +v 1.463327 0.115100 2.222918 +v 1.345370 0.115099 3.027511 +v 1.345370 0.115099 3.271658 +v 1.345370 0.115098 3.787743 +v 1.463328 0.115098 4.072709 +v 1.345370 0.115099 3.271658 +v 1.345370 0.115099 3.271658 +v 1.463328 0.115098 4.072709 +v 1.463327 0.115100 2.222918 +v 1.463327 0.115100 2.222918 +v 1.463328 0.115098 4.072709 +v 1.463327 0.094038 4.103106 +v 1.463327 0.094038 4.103106 +v 1.463325 0.093492 2.192520 +v 1.463327 0.115100 2.222918 +v 1.017895 0.115099 3.271658 +v 1.345370 0.115099 3.027511 +v 1.017895 0.115099 3.027511 +v 1.017895 0.115099 3.271658 +v 1.345370 0.115099 3.271658 +v 1.345370 0.115099 3.027511 +v 1.017895 0.115099 3.027511 +v 0.900378 0.115100 2.222918 +v 1.017895 0.115099 3.271658 +v 0.900379 0.115098 4.072709 +v 1.017895 0.115098 3.787743 +v 1.017895 0.115099 3.271658 +v 0.900379 0.115098 4.072709 +v 1.017895 0.115099 3.271658 +v 0.900378 0.115100 2.222918 +v 0.900379 0.115098 4.072709 +v 0.900378 0.115100 2.222918 +v 0.900380 0.094857 4.103106 +v 0.900380 0.094857 4.103106 +v 0.900378 0.115100 2.222918 +v 0.900378 0.094311 2.192519 +v 0.900379 0.115098 4.072709 +v 1.463328 0.115098 4.072709 +v 1.017895 0.115098 3.787743 +v 1.345370 0.115098 3.787743 +v 1.017895 0.115098 3.787743 +v 1.463328 0.115098 4.072709 +v 1.417001 0.546753 1.223843 +v 1.417000 0.841969 1.223843 +v 1.417001 0.546753 1.223843 +v 1.416366 0.841163 1.227852 +v 1.417000 0.841969 1.223843 +v 1.184725 0.824397 1.223843 +v 1.417000 0.841969 1.223843 +v 1.416366 0.547560 1.227852 +v 1.184725 0.546753 1.223843 +v 1.417001 0.546753 1.223843 +v 1.184725 0.546753 1.223843 +v 1.416366 0.547560 1.227852 +v 0.964151 0.546753 1.223843 +v 1.151685 0.546753 1.223843 +v 0.964151 0.546753 1.223843 +v 0.964919 0.547886 1.227852 +v 0.964150 0.809070 1.223843 +v 0.964151 0.546753 1.223843 +v 0.964150 0.809070 1.223843 +v 0.964919 0.547886 1.227852 +v 1.185360 0.823687 1.227853 +v 1.185359 0.547560 1.227852 +v 1.184725 0.824397 1.223843 +v 1.184725 0.546753 1.223843 +v 1.184725 0.824397 1.223843 +v 1.185359 0.547560 1.227852 +v 1.150915 0.547886 1.227852 +v 1.151685 0.546753 1.223843 +v 1.151684 0.823175 1.223843 +v 1.151685 0.546753 1.223843 +v 1.150916 0.822042 1.227853 +v 0.964919 0.808053 1.227853 +v 1.151684 0.823175 1.223843 +v 0.964150 0.809070 1.223843 +v 1.151684 0.823175 1.223843 +v 0.964919 0.808053 1.227853 +v 1.436672 0.863063 1.223843 +v 0.943519 0.830164 1.223843 +v 1.436672 0.863063 1.218051 +v 0.943519 0.830164 1.218051 +v 1.436672 0.863063 1.218051 +v 0.943519 0.830164 1.223843 +v 1.436672 0.526584 1.223843 +v 1.436672 0.863063 1.223843 +v 1.436672 0.526584 1.218050 +v 1.436672 0.863063 1.218051 +v 1.436672 0.526584 1.218050 +v 1.436672 0.863063 1.223843 +v 0.943519 0.830164 1.223843 +v 0.943519 0.526584 1.223843 +v 0.943519 0.830164 1.218051 +v 0.943519 0.526583 1.218050 +v 0.943519 0.830164 1.218051 +v 0.943519 0.526584 1.223843 +v 0.943519 0.526584 1.223843 +v 1.436672 0.526584 1.223843 +v 0.943519 0.526583 1.218050 +v 1.436672 0.526584 1.218050 +v 0.943519 0.526583 1.218050 +v 1.436672 0.526584 1.223843 +v 1.463730 0.109174 1.218051 +v 1.463727 0.936778 1.218442 +v 1.463728 0.867985 1.250921 +v 1.463728 0.867985 1.250921 +v 1.463731 0.109174 1.251065 +v 1.463730 0.109174 1.218051 +v 1.417001 0.546753 1.237170 +v 1.417001 0.546753 1.237170 +v 1.417000 0.841969 1.237170 +v 1.416366 0.841163 1.227852 +v 1.417000 0.841969 1.237170 +v 1.417000 0.841969 1.237170 +v 1.184725 0.824397 1.237170 +v 1.416366 0.547560 1.227852 +v 1.184725 0.546753 1.237170 +v 1.184725 0.546753 1.237170 +v 1.417001 0.546753 1.237170 +v 1.416366 0.547560 1.227852 +v 0.964151 0.546753 1.237170 +v 0.964151 0.546753 1.237170 +v 1.151685 0.546753 1.237170 +v 0.964919 0.547886 1.227852 +v 0.964150 0.809070 1.237170 +v 0.964150 0.809070 1.237170 +v 0.964151 0.546753 1.237170 +v 0.964919 0.547886 1.227852 +v 1.185359 0.547560 1.227852 +v 1.185360 0.823687 1.227853 +v 1.184725 0.824397 1.237170 +v 1.184725 0.824397 1.237170 +v 1.184725 0.546753 1.237170 +v 1.185359 0.547560 1.227852 +v 1.150915 0.547886 1.227852 +v 1.151685 0.546753 1.237170 +v 1.151685 0.546753 1.237170 +v 1.151684 0.823175 1.237170 +v 0.964919 0.808053 1.227853 +v 1.150916 0.822042 1.227853 +v 1.151684 0.823175 1.237170 +v 1.151684 0.823175 1.237170 +v 0.964150 0.809070 1.237170 +v 0.964919 0.808053 1.227853 +v 0.943519 0.830164 1.237170 +v 1.436672 0.863063 1.237170 +v 1.436672 0.863063 1.251065 +v 1.436672 0.863063 1.251065 +v 0.943519 0.830164 1.251065 +v 0.943519 0.830164 1.237170 +v 1.436672 0.863063 1.237170 +v 1.436672 0.526584 1.237170 +v 1.436672 0.526584 1.251065 +v 1.436672 0.526584 1.251065 +v 1.436672 0.863063 1.251065 +v 1.436672 0.863063 1.237170 +v 0.943519 0.526583 1.237170 +v 0.943519 0.830164 1.237170 +v 0.943519 0.830164 1.251065 +v 0.943519 0.830164 1.251065 +v 0.943519 0.526583 1.251065 +v 0.943519 0.526583 1.237170 +v 1.436672 0.526584 1.237170 +v 0.943519 0.526583 1.237170 +v 0.943519 0.526583 1.251065 +v 0.943519 0.526583 1.251065 +v 1.436672 0.526584 1.251065 +v 1.436672 0.526584 1.237170 +v 0.933952 0.899798 1.251059 +v 0.933952 0.109174 1.251058 +v 0.933952 0.899798 1.251059 +v 0.933952 0.899798 1.251059 +v 0.933952 0.109174 1.251058 +v 0.920026 0.546798 1.273052 +v 0.920026 0.546798 1.273052 +v 0.920025 0.809114 1.273052 +v 0.910735 0.547919 1.273593 +v 0.920026 0.546797 1.399789 +v 0.920026 0.546797 1.399789 +v 0.920026 0.546798 1.273052 +v 0.910735 0.547919 1.273593 +v 0.920026 0.546797 1.564079 +v 0.920026 0.546797 1.564079 +v 0.920026 0.546797 1.437342 +v 0.920026 0.546797 1.725902 +v 0.920026 0.546797 1.725902 +v 0.920026 0.546797 1.599165 +v 0.910735 0.807993 1.273594 +v 0.920025 0.809114 1.273052 +v 0.920025 0.809114 1.273052 +v 0.920025 0.809114 1.399789 +v 0.910734 0.547273 1.725346 +v 0.920026 0.809114 1.725902 +v 0.920026 0.809114 1.725902 +v 0.920026 0.546797 1.725902 +v 0.910734 0.547273 1.725346 +v 0.910735 0.547918 1.399247 +v 0.910735 0.807993 1.399248 +v 0.920025 0.809114 1.399789 +v 0.920025 0.809114 1.399789 +v 0.920026 0.546797 1.399789 +v 0.910735 0.547918 1.399247 +v 0.910735 0.547958 1.437903 +v 0.920026 0.546797 1.437342 +v 0.920026 0.546797 1.437342 +v 0.920025 0.809114 1.437342 +v 0.910735 0.807953 1.437903 +v 0.920025 0.809114 1.437342 +v 0.920025 0.809114 1.437342 +v 0.920025 0.809114 1.564079 +v 0.910735 0.547958 1.563518 +v 0.910735 0.807953 1.563518 +v 0.920025 0.809114 1.564079 +v 0.920025 0.809114 1.564079 +v 0.920026 0.546797 1.564079 +v 0.910735 0.547958 1.563518 +v 0.910734 0.547273 1.599721 +v 0.920026 0.546797 1.599165 +v 0.920026 0.546797 1.599165 +v 0.920025 0.809114 1.599165 +v 0.910735 0.808665 1.725346 +v 0.910735 0.808665 1.599721 +v 0.920025 0.809114 1.599165 +v 0.920025 0.809114 1.599165 +v 0.920026 0.809114 1.725902 +v 0.910735 0.808665 1.725346 +v 0.920025 0.830208 1.253380 +v 0.920026 0.526628 1.253380 +v 0.933962 0.526628 1.253380 +v 0.933962 0.526628 1.253380 +v 0.933962 0.830208 1.253380 +v 0.920025 0.830208 1.253380 +v 0.920025 0.830208 1.746534 +v 0.920025 0.830208 1.253380 +v 0.933962 0.830208 1.253380 +v 0.933962 0.830208 1.253380 +v 0.933962 0.830208 1.746534 +v 0.920025 0.830208 1.746534 +v 0.920026 0.526627 1.746534 +v 0.920025 0.830208 1.746534 +v 0.933962 0.830208 1.746534 +v 0.933962 0.830208 1.746534 +v 0.933962 0.526627 1.746533 +v 0.920026 0.526627 1.746534 +v 0.920026 0.526628 1.253380 +v 0.920026 0.526627 1.746534 +v 0.933962 0.526627 1.746533 +v 0.933962 0.526627 1.746533 +v 0.933962 0.526628 1.253380 +v 0.920026 0.526628 1.253380 +v 0.900781 0.897513 1.218051 +v 0.900781 0.897513 1.218051 +v 0.900605 0.094032 1.218040 +v 0.900781 0.897513 1.218051 +v 0.900605 0.094032 1.218040 +v 0.906754 0.546798 1.273052 +v 0.906753 0.809114 1.273052 +v 0.906754 0.546798 1.273052 +v 0.910735 0.547919 1.273593 +v 0.906754 0.546797 1.399789 +v 0.906754 0.546798 1.273052 +v 0.906754 0.546797 1.399789 +v 0.910735 0.547919 1.273593 +v 0.906754 0.546797 1.564079 +v 0.906754 0.546797 1.437342 +v 0.906754 0.546797 1.564079 +v 0.906754 0.546797 1.725902 +v 0.906754 0.546797 1.599165 +v 0.906754 0.546797 1.725902 +v 0.910735 0.807993 1.273594 +v 0.906753 0.809114 1.273052 +v 0.906753 0.809114 1.399789 +v 0.906753 0.809114 1.273052 +v 0.910734 0.547273 1.725346 +v 0.906753 0.809114 1.725902 +v 0.906754 0.546797 1.725902 +v 0.906753 0.809114 1.725902 +v 0.910734 0.547273 1.725346 +v 0.910735 0.807993 1.399248 +v 0.910735 0.547918 1.399247 +v 0.906753 0.809114 1.399789 +v 0.906754 0.546797 1.399789 +v 0.906753 0.809114 1.399789 +v 0.910735 0.547918 1.399247 +v 0.910735 0.547958 1.437903 +v 0.906754 0.546797 1.437342 +v 0.906753 0.809114 1.437342 +v 0.906754 0.546797 1.437342 +v 0.910735 0.807953 1.437903 +v 0.906753 0.809114 1.437342 +v 0.906753 0.809114 1.564079 +v 0.906753 0.809114 1.437342 +v 0.910735 0.807953 1.563518 +v 0.910735 0.547958 1.563518 +v 0.906753 0.809114 1.564079 +v 0.906754 0.546797 1.564079 +v 0.906753 0.809114 1.564079 +v 0.910735 0.547958 1.563518 +v 0.910734 0.547273 1.599721 +v 0.906754 0.546797 1.599165 +v 0.906753 0.809114 1.599165 +v 0.906754 0.546797 1.599165 +v 0.910735 0.808665 1.599721 +v 0.910735 0.808665 1.725346 +v 0.906753 0.809114 1.599165 +v 0.906753 0.809114 1.725902 +v 0.906753 0.809114 1.599165 +v 0.910735 0.808665 1.725346 +v 0.906754 0.526628 1.253380 +v 0.906753 0.830208 1.253380 +v 0.900781 0.526628 1.253380 +v 0.900781 0.830208 1.253380 +v 0.900781 0.526628 1.253380 +v 0.906753 0.830208 1.253380 +v 0.906753 0.830208 1.253380 +v 0.906753 0.830208 1.746534 +v 0.900781 0.830208 1.253380 +v 0.900780 0.830208 1.746534 +v 0.900781 0.830208 1.253380 +v 0.906753 0.830208 1.746534 +v 0.906753 0.830208 1.746534 +v 0.906754 0.526627 1.746533 +v 0.900780 0.830208 1.746534 +v 0.900780 0.526628 1.746534 +v 0.900780 0.830208 1.746534 +v 0.906754 0.526627 1.746533 +v 0.906754 0.526627 1.746533 +v 0.906754 0.526628 1.253380 +v 0.900780 0.526628 1.746534 +v 0.900781 0.526628 1.253380 +v 0.900780 0.526628 1.746534 +v 0.906754 0.526628 1.253380 +v 0.900748 0.897512 1.781117 +v 0.900748 0.897512 1.781117 +v 0.900749 0.094193 1.781114 +v 0.900749 0.094193 1.781114 +v 0.900749 0.094193 1.781114 +v 0.900749 0.094193 1.781114 +v 1.416935 0.546753 1.775442 +v 1.416935 0.546753 1.775442 +v 1.416935 0.841969 1.775442 +v 1.416300 0.841162 1.771433 +v 1.416935 0.841969 1.775442 +v 1.416935 0.841969 1.775442 +v 1.184659 0.824397 1.775442 +v 1.416300 0.547559 1.771433 +v 1.184659 0.546753 1.775442 +v 1.184659 0.546753 1.775442 +v 1.416935 0.546753 1.775442 +v 1.416300 0.547559 1.771433 +v 0.964085 0.546753 1.775442 +v 0.964085 0.546753 1.775442 +v 1.151619 0.546753 1.775442 +v 0.964854 0.547886 1.771433 +v 0.964086 0.809070 1.775442 +v 0.964086 0.809070 1.775442 +v 0.964085 0.546753 1.775442 +v 0.964854 0.547886 1.771433 +v 1.185294 0.547559 1.771433 +v 1.185294 0.823686 1.771433 +v 1.184659 0.824397 1.775442 +v 1.184659 0.824397 1.775442 +v 1.184659 0.546753 1.775442 +v 1.185294 0.547559 1.771433 +v 1.150850 0.547886 1.771433 +v 1.151619 0.546753 1.775442 +v 1.151619 0.546753 1.775442 +v 1.151619 0.823175 1.775442 +v 0.964854 0.808052 1.771433 +v 1.150850 0.822042 1.771433 +v 1.151619 0.823175 1.775442 +v 1.151619 0.823175 1.775442 +v 0.964086 0.809070 1.775442 +v 0.964854 0.808052 1.771433 +v 0.943453 0.830163 1.775442 +v 1.436607 0.863063 1.775442 +v 1.436607 0.863063 1.781234 +v 1.436607 0.863063 1.781234 +v 0.943453 0.830163 1.781234 +v 0.943453 0.830163 1.775442 +v 1.436607 0.863063 1.775442 +v 1.436607 0.526583 1.775442 +v 1.436607 0.526583 1.781234 +v 1.436607 0.526583 1.781234 +v 1.436607 0.863063 1.781234 +v 1.436607 0.863063 1.775442 +v 0.943453 0.526583 1.775442 +v 0.943453 0.830163 1.775442 +v 0.943453 0.830163 1.781234 +v 0.943453 0.830163 1.781234 +v 0.943453 0.526583 1.781234 +v 0.943453 0.526583 1.775442 +v 1.436607 0.526583 1.775442 +v 0.943453 0.526583 1.775442 +v 0.943453 0.526583 1.781234 +v 0.943453 0.526583 1.781234 +v 1.436607 0.526583 1.781234 +v 1.436607 0.526583 1.775442 +v 0.933941 0.899524 1.748221 +v 0.933941 0.899524 1.748221 +v 0.933941 0.899524 1.748221 +v 0.933941 0.109174 1.748220 +v 0.933941 0.109174 1.748220 +v 0.933941 0.109174 1.748220 +v 0.933941 0.109174 1.748220 +v 1.463727 0.936778 1.780627 +v 1.463663 0.093374 1.781233 +v 1.463696 0.867985 1.748138 +v 1.463665 0.109174 1.748219 +v 1.463696 0.867985 1.748138 +v 1.463663 0.093374 1.781233 +v 1.416935 0.546753 1.762115 +v 1.416935 0.841969 1.762115 +v 1.416935 0.546753 1.762115 +v 1.416300 0.841162 1.771433 +v 1.416935 0.841969 1.762115 +v 1.184659 0.824397 1.762116 +v 1.416935 0.841969 1.762115 +v 1.416300 0.547559 1.771433 +v 1.184659 0.546753 1.762115 +v 1.416935 0.546753 1.762115 +v 1.184659 0.546753 1.762115 +v 1.416300 0.547559 1.771433 +v 0.964085 0.546753 1.762115 +v 1.151619 0.546753 1.762115 +v 0.964085 0.546753 1.762115 +v 0.964854 0.547886 1.771433 +v 0.964086 0.809070 1.762115 +v 0.964085 0.546753 1.762115 +v 0.964086 0.809070 1.762115 +v 0.964854 0.547886 1.771433 +v 1.185294 0.823686 1.771433 +v 1.185294 0.547559 1.771433 +v 1.184659 0.824397 1.762116 +v 1.184659 0.546753 1.762115 +v 1.184659 0.824397 1.762116 +v 1.185294 0.547559 1.771433 +v 1.150850 0.547886 1.771433 +v 1.151619 0.546753 1.762115 +v 1.151619 0.823175 1.762115 +v 1.151619 0.546753 1.762115 +v 1.150850 0.822042 1.771433 +v 0.964854 0.808052 1.771433 +v 1.151619 0.823175 1.762115 +v 0.964086 0.809070 1.762115 +v 1.151619 0.823175 1.762115 +v 0.964854 0.808052 1.771433 +v 1.436607 0.863062 1.762115 +v 0.943453 0.830163 1.762115 +v 1.436607 0.863062 1.748220 +v 0.943454 0.830163 1.748220 +v 1.436607 0.863062 1.748220 +v 0.943453 0.830163 1.762115 +v 1.436607 0.526583 1.762115 +v 1.436607 0.863062 1.762115 +v 1.436607 0.526583 1.748220 +v 1.436607 0.863062 1.748220 +v 1.436607 0.526583 1.748220 +v 1.436607 0.863062 1.762115 +v 0.943453 0.830163 1.762115 +v 0.943453 0.526583 1.762115 +v 0.943454 0.830163 1.748220 +v 0.943453 0.526583 1.748220 +v 0.943454 0.830163 1.748220 +v 0.943453 0.526583 1.762115 +v 0.943453 0.526583 1.762115 +v 1.436607 0.526583 1.762115 +v 0.943453 0.526583 1.748220 +v 1.436607 0.526583 1.748220 +v 0.943453 0.526583 1.748220 +v 1.436607 0.526583 1.762115 +v 1.463731 0.109174 1.251065 +v 1.463665 0.109174 1.748219 +v 1.463663 0.093374 1.781233 +v 1.463663 0.093374 1.781233 +v 1.463730 0.109174 1.218051 +v 1.463731 0.109174 1.251065 +v 0.933941 0.109174 1.748220 +v 1.463665 0.109174 1.748219 +v 1.463731 0.109174 1.251065 +v 1.463731 0.109174 1.251065 +v 0.933952 0.109174 1.251058 +v 0.933941 0.109174 1.748220 +vt 0.072063 0.334485 +vt 0.072254 0.325338 +vt 0.006016 0.325338 +vt 0.072063 0.344919 +vt 0.072062 0.990283 +vt 0.072062 0.979849 +vt 0.006015 1.000000 +vt 0.072254 1.000000 +vt 0.008805 0.325338 +vt 0.071820 0.334485 +vt 0.008675 0.334485 +vt 0.071820 0.979849 +vt 0.008675 0.979849 +vt 0.008805 0.976806 +vt 0.008675 0.990283 +vt 0.071820 0.990283 +vt 0.008805 1.000000 +vt 0.000001 0.006016 +vt 0.001446 0.072254 +vt 0.058890 0.072254 +vt 0.057412 0.008805 +vt 0.001446 0.325338 +vt 0.001711 0.334485 +vt 0.058642 0.334485 +vt 0.058890 0.325338 +vt 0.001710 0.990283 +vt 0.001445 1.000000 +vt 0.058889 1.000000 +vt 0.058641 0.990283 +vt 0.001445 0.072254 +vt 0.000000 0.006015 +vt 0.057410 0.008805 +vt 0.058889 0.072254 +vt 0.072254 0.348777 +vt 0.008675 0.344919 +vt 0.071820 0.344919 +vt 0.001711 0.344919 +vt 0.058890 0.348777 +vt 0.058642 0.344919 +vt 0.008805 0.348776 +vt 0.072254 0.976806 +vt 0.147758 0.075524 +vt 0.146225 0.013162 +vt 0.146223 0.013162 +vt 0.147757 0.075524 +vt 0.108072 0.325531 +vt 0.108072 0.334485 +vt 0.052924 0.325338 +vt 0.108072 0.344919 +vt 0.108071 0.979849 +vt 0.108071 0.990283 +vt 0.052924 1.000000 +vt 0.108071 0.999614 +vt 0.108824 0.325338 +vt 0.050213 0.325338 +vt 0.107970 0.334485 +vt 0.050740 0.334485 +vt 0.050741 0.979849 +vt 0.107970 0.979849 +vt 0.050213 0.976805 +vt 0.107970 0.990283 +vt 0.050741 0.990283 +vt 0.108824 1.000000 +vt 0.050213 1.000000 +vt 0.999995 0.108072 +vt 0.999706 0.052924 +vt 0.944281 0.108824 +vt 0.942296 0.050213 +vt 0.999995 0.334485 +vt 0.999995 0.325531 +vt 0.944252 0.334485 +vt 0.944281 0.325338 +vt 0.999994 0.999614 +vt 0.999994 0.990283 +vt 0.944280 1.000000 +vt 0.944137 0.990283 +vt 0.999705 0.052924 +vt 0.999994 0.108071 +vt 0.942294 0.050213 +vt 0.944280 0.108824 +vt 0.050740 0.344919 +vt 0.108824 0.348776 +vt 0.107970 0.344919 +vt 0.944282 0.348776 +vt 0.999995 0.344919 +vt 0.944252 0.344919 +vt 0.050213 0.348776 +vt 0.108824 0.976805 +vt 0.944282 0.108824 +vt 0.855414 0.105166 +vt 0.853480 0.046037 +vt 0.942295 0.050213 +vt 0.853479 0.046037 +vt 0.855413 0.105166 +vt 0.058642 0.071820 +vt 0.924214 0.117380 +vt 0.049694 0.077975 +vt 0.001711 0.072063 +vt 0.001711 0.974240 +vt 0.049694 0.480996 +vt 0.057078 0.008675 +vt 0.942060 0.050740 +vt 0.944252 0.107970 +vt 1.000000 0.974239 +vt 0.924213 0.480995 +vt 0.496477 0.124287 +vt 0.084579 0.103240 +vt 0.084579 0.456837 +vt 0.496478 0.456837 +vt 0.555070 0.456837 +vt 0.887627 0.456837 +vt 0.887627 0.142645 +vt 0.555069 0.125751 +vt 0.104485 0.339109 +vt 0.455592 0.339109 +vt 0.456837 0.342595 +vt 0.103240 0.342595 +vt 0.495027 0.339109 +vt 0.086029 0.339109 +vt 0.084579 0.342595 +vt 0.496477 0.342595 +vt 0.495028 0.339109 +vt 0.496478 0.342595 +vt 0.557479 0.339109 +vt 0.885216 0.339108 +vt 0.887627 0.342595 +vt 0.555070 0.342595 +vt 0.454438 0.339108 +vt 0.144800 0.339109 +vt 0.142645 0.342595 +vt 0.125384 0.339109 +vt 0.124287 0.342595 +vt 0.128150 0.339109 +vt 0.454438 0.339109 +vt 0.125751 0.342595 +vt 0.885217 0.339109 +vt 0.555069 0.342595 +vt 0.924214 0.342595 +vt 0.049694 0.342595 +vt 0.049694 0.344919 +vt 0.924214 0.344919 +vt 0.077975 0.342595 +vt 0.480996 0.342595 +vt 0.480996 0.344919 +vt 0.077975 0.344919 +vt 0.924213 0.342595 +vt 0.924213 0.344919 +vt 0.480995 0.342595 +vt 0.117380 0.342595 +vt 0.117380 0.344919 +vt 0.480995 0.344919 +vt 0.001713 0.999860 +vt 0.999999 0.998889 +vt 0.974240 0.344919 +vt 0.999860 0.334485 +vt 0.974239 0.344919 +vt 0.998889 0.334485 +vt 0.456837 0.335622 +vt 0.103240 0.335623 +vt 0.084579 0.335623 +vt 0.496477 0.335623 +vt 0.496478 0.335622 +vt 0.084579 0.335622 +vt 0.887627 0.335622 +vt 0.555070 0.335622 +vt 0.142645 0.335622 +vt 0.124287 0.335623 +vt 0.125751 0.335623 +vt 0.555069 0.335623 +vt 0.049694 0.335623 +vt 0.924214 0.335622 +vt 0.049694 0.334485 +vt 0.924214 0.334485 +vt 0.480996 0.335622 +vt 0.077975 0.335623 +vt 0.480996 0.334485 +vt 0.077975 0.334485 +vt 0.924213 0.335622 +vt 0.049694 0.335622 +vt 0.924213 0.334485 +vt 0.117380 0.335622 +vt 0.480995 0.335622 +vt 0.117380 0.334485 +vt 0.480995 0.334485 +vt 0.934182 0.117380 +vt 0.058641 0.071820 +vt 0.049693 0.077975 +vt 0.001710 0.072062 +vt 0.001709 0.974239 +vt 0.049693 0.480995 +vt 0.057077 0.008675 +vt 0.942258 0.050741 +vt 0.944137 0.107970 +vt 0.999998 0.974239 +vt 0.084578 0.103240 +vt 0.084577 0.456837 +vt 0.496477 0.456837 +vt 0.555068 0.456837 +vt 0.887626 0.456837 +vt 0.887626 0.142645 +vt 0.555068 0.125750 +vt 0.455592 0.985659 +vt 0.104485 0.985659 +vt 0.456837 0.982173 +vt 0.103240 0.982173 +vt 0.086028 0.985659 +vt 0.495026 0.985659 +vt 0.084578 0.982173 +vt 0.496477 0.982173 +vt 0.495027 0.985659 +vt 0.084577 0.982173 +vt 0.885216 0.985659 +vt 0.557478 0.985659 +vt 0.887626 0.982173 +vt 0.555068 0.982173 +vt 0.144799 0.985659 +vt 0.454437 0.985659 +vt 0.142645 0.982173 +vt 0.125384 0.985659 +vt 0.124287 0.982173 +vt 0.454438 0.985659 +vt 0.128150 0.985659 +vt 0.125750 0.982173 +vt 0.049693 0.982173 +vt 0.934182 0.982173 +vt 0.049693 0.979849 +vt 0.934182 0.979849 +vt 0.480995 0.982173 +vt 0.077975 0.982173 +vt 0.480995 0.979849 +vt 0.077975 0.979849 +vt 0.924213 0.982173 +vt 0.924213 0.979849 +vt 0.117380 0.982173 +vt 0.117380 0.979849 +vt 0.001710 0.999210 +vt 0.999997 0.998239 +vt 0.974239 0.979849 +vt 0.999210 0.990283 +vt 0.998239 0.990283 +vt 0.456837 0.989146 +vt 0.103240 0.989146 +vt 0.084578 0.989146 +vt 0.496477 0.989145 +vt 0.496477 0.989146 +vt 0.084577 0.989146 +vt 0.887626 0.989145 +vt 0.555068 0.989146 +vt 0.142645 0.989146 +vt 0.456837 0.989145 +vt 0.124287 0.989145 +vt 0.125750 0.989145 +vt 0.555068 0.989145 +vt 0.887626 0.989146 +vt 0.934182 0.989145 +vt 0.049693 0.989146 +vt 0.049693 0.990283 +vt 0.934182 0.990283 +vt 0.077975 0.989146 +vt 0.480995 0.989146 +vt 0.480995 0.990283 +vt 0.077975 0.990283 +vt 0.924213 0.989145 +vt 0.924213 0.990283 +vt 0.480995 0.989145 +vt 0.117380 0.989145 +vt 0.117380 0.990283 +vt 0.791605 0.974240 +vt 0.210886 0.974240 +vt 0.210886 0.952878 +vt 0.791605 0.952878 +vt 0.974240 0.621091 +vt 0.974240 0.443947 +vt 0.952878 0.443948 +vt 0.952878 0.621091 +vt 0.974240 0.443948 +vt 0.791605 0.621091 +vt 0.210886 0.621091 +vt 0.328316 0.604459 +vt 0.674520 0.604459 +vt 0.210886 0.443948 +vt 0.328316 0.461308 +vt 0.791605 0.443948 +vt 0.674520 0.461308 +vt 0.974240 0.882036 +vt 0.974240 0.704893 +vt 0.952878 0.704893 +vt 0.952878 0.882036 +vt 0.791605 0.882036 +vt 0.210886 0.882036 +vt 0.328317 0.865404 +vt 0.674520 0.865404 +vt 0.210886 0.704893 +vt 0.328317 0.722254 +vt 0.791605 0.704893 +vt 0.674520 0.722254 +vt 1.000000 0.344919 +vt 0.210886 0.443947 +vt 0.001709 0.979849 +vt 0.999998 0.979849 +vt 0.923496 0.126410 +vt 0.001001 0.000000 +vt 0.048977 0.087402 +vt 0.000995 0.981267 +vt 0.048978 0.486356 +vt 0.999285 0.046556 +vt 0.999597 0.999220 +vt 0.923497 0.486356 +vt 0.083862 0.112412 +vt 0.495761 0.133247 +vt 0.083862 0.462441 +vt 0.495761 0.462441 +vt 0.554352 0.462441 +vt 0.886909 0.462441 +vt 0.886910 0.151420 +vt 0.554352 0.134696 +vt 0.461485 0.003368 +vt 0.113368 0.003368 +vt 0.462441 0.001992 +vt 0.112412 0.001991 +vt 0.084988 0.003368 +vt 0.494635 0.003368 +vt 0.083862 0.001991 +vt 0.495761 0.001992 +vt 0.494636 0.003368 +vt 0.083862 0.001992 +vt 0.885547 0.003368 +vt 0.555716 0.003368 +vt 0.886909 0.001992 +vt 0.554352 0.001992 +vt 0.152626 0.003368 +vt 0.461098 0.003368 +vt 0.151420 0.001992 +vt 0.134089 0.003368 +vt 0.133247 0.001992 +vt 0.136039 0.003368 +vt 0.134696 0.001992 +vt 0.555715 0.003368 +vt 0.886910 0.001992 +vt 0.048977 0.001992 +vt 0.923496 0.001992 +vt 0.048977 0.000004 +vt 0.923496 0.000004 +vt 0.486356 0.001992 +vt 0.087402 0.001992 +vt 0.486356 0.000004 +vt 0.087402 0.000004 +vt 0.126410 0.001992 +vt 0.126410 0.000004 +vt 0.923497 0.001992 +vt 0.048978 0.001992 +vt 0.923497 0.000004 +vt 0.048978 0.000004 +vt 0.057956 0.081446 +vt 0.048978 0.087402 +vt 0.000998 0.081566 +vt 0.057913 0.002739 +vt 0.940461 0.043846 +vt 0.940461 0.981267 +vt 0.923497 0.126410 +vt 0.886910 0.462441 +vt 0.981267 0.000004 +vt 0.000000 0.000138 +vt 0.081566 0.011286 +vt 0.981267 0.011336 +vt 0.462441 0.006566 +vt 0.112412 0.006566 +vt 0.083862 0.006566 +vt 0.495761 0.006566 +vt 0.886910 0.006566 +vt 0.554352 0.006566 +vt 0.151420 0.006566 +vt 0.133247 0.006566 +vt 0.134696 0.006566 +vt 0.923497 0.006566 +vt 0.048977 0.006566 +vt 0.048978 0.011335 +vt 0.923496 0.011335 +vt 0.087402 0.006566 +vt 0.486356 0.006566 +vt 0.486356 0.011335 +vt 0.087402 0.011335 +vt 0.126410 0.006566 +vt 0.126410 0.011335 +vt 0.048978 0.006566 +vt 0.923497 0.011335 +vt 0.126357 0.012130 +vt 0.486303 0.012130 +vt 0.043846 0.011333 +vt 0.981267 0.011333 +vt 0.044170 0.181981 +vt 0.126357 0.181402 +vt 0.981267 0.181981 +vt 0.486303 0.181402 +vt 0.462389 0.018882 +vt 0.462389 0.062384 +vt 0.462389 0.075274 +vt 0.462389 0.118776 +vt 0.462389 0.130819 +vt 0.462389 0.174321 +vt 0.151367 0.062384 +vt 0.151367 0.018882 +vt 0.151367 0.174321 +vt 0.151367 0.075274 +vt 0.151367 0.118776 +vt 0.151367 0.130819 +vt 0.981633 0.152696 +vt 0.981633 0.461060 +vt 0.965157 0.462389 +vt 0.965158 0.151367 +vt 0.981633 0.019068 +vt 0.981633 0.062198 +vt 0.965157 0.062384 +vt 0.965157 0.018882 +vt 0.981633 0.075466 +vt 0.981633 0.118583 +vt 0.965157 0.118776 +vt 0.965157 0.075274 +vt 0.981634 0.131010 +vt 0.981634 0.174130 +vt 0.965157 0.174321 +vt 0.965157 0.130819 +vt 0.965158 0.018882 +vt 0.965158 0.062384 +vt 0.981634 0.461825 +vt 0.981633 0.151900 +vt 0.965157 0.151367 +vt 0.981633 0.152743 +vt 0.981633 0.461013 +vt 0.965158 0.075274 +vt 0.965158 0.118776 +vt 0.981633 0.174130 +vt 0.981633 0.131010 +vt 0.965158 0.130819 +vt 0.965158 0.126357 +vt 0.965157 0.486303 +vt 0.940444 0.486303 +vt 0.940443 0.126357 +vt 0.965158 0.181402 +vt 0.965158 0.012130 +vt 0.940443 0.012130 +vt 0.940444 0.181402 +vt 0.940444 0.126357 +vt 0.965157 0.012130 +vt 0.965157 0.181402 +vt 0.940444 0.012130 +vt 0.486304 0.012130 +vt 0.046556 0.000004 +vt 0.999220 0.000000 +vt 0.046556 0.193273 +vt 0.999029 0.193272 +vt 0.988694 0.462389 +vt 0.988694 0.151367 +vt 0.988694 0.062384 +vt 0.988694 0.018882 +vt 0.988694 0.118776 +vt 0.988694 0.075274 +vt 0.988694 0.174321 +vt 0.988694 0.130819 +vt 0.988694 0.486304 +vt 0.988694 0.126357 +vt 0.999286 0.486304 +vt 0.999285 0.126357 +vt 0.988694 0.012130 +vt 0.988694 0.181402 +vt 0.999285 0.012130 +vt 0.999286 0.181402 +vt 0.988694 0.486303 +vt 0.999286 0.126357 +vt 0.999286 0.486303 +vt 0.999286 0.012130 +vt 0.923613 0.126410 +vt 0.049094 0.087402 +vt 0.001113 1.000000 +vt 0.049094 0.486356 +vt 0.999343 0.046556 +vt 0.999341 0.999029 +vt 0.923613 0.486356 +vt 0.495877 0.133247 +vt 0.083978 0.112412 +vt 0.083978 0.462441 +vt 0.495877 0.462441 +vt 0.554468 0.462441 +vt 0.887026 0.462441 +vt 0.887025 0.151420 +vt 0.554469 0.134696 +vt 0.113368 0.189949 +vt 0.461485 0.189949 +vt 0.462441 0.191325 +vt 0.112412 0.191325 +vt 0.494751 0.189949 +vt 0.085104 0.189949 +vt 0.083978 0.191325 +vt 0.495877 0.191325 +vt 0.494752 0.189949 +vt 0.555831 0.189949 +vt 0.885664 0.189949 +vt 0.887026 0.191325 +vt 0.554468 0.191325 +vt 0.461098 0.189949 +vt 0.152626 0.189949 +vt 0.151420 0.191325 +vt 0.134089 0.189949 +vt 0.133247 0.191325 +vt 0.136039 0.189949 +vt 0.134696 0.191325 +vt 0.885663 0.189949 +vt 0.554469 0.191325 +vt 0.887025 0.191325 +vt 0.923613 0.191325 +vt 0.049094 0.191325 +vt 0.049094 0.193313 +vt 0.923613 0.193313 +vt 0.087402 0.191325 +vt 0.486356 0.191325 +vt 0.486356 0.193313 +vt 0.087402 0.193313 +vt 0.126410 0.191325 +vt 0.126410 0.193313 +vt 0.923612 0.126410 +vt 0.058014 0.081446 +vt 0.001056 0.081566 +vt 0.001110 0.981267 +vt 0.057971 0.002739 +vt 0.940482 0.044170 +vt 0.940482 0.981267 +vt 0.000000 0.193105 +vt 1.000000 0.193313 +vt 0.081566 0.181953 +vt 0.462441 0.186751 +vt 0.112412 0.186751 +vt 0.083978 0.186751 +vt 0.495877 0.186751 +vt 0.887026 0.186751 +vt 0.554468 0.186751 +vt 0.151420 0.186751 +vt 0.133247 0.186751 +vt 0.134696 0.186751 +vt 0.554469 0.186751 +vt 0.887025 0.186751 +vt 0.049094 0.186751 +vt 0.923613 0.186751 +vt 0.049094 0.181981 +vt 0.923612 0.181981 +vt 0.486356 0.186751 +vt 0.087402 0.186751 +vt 0.486356 0.181981 +vt 0.087402 0.181981 +vt 0.126410 0.186751 +vt 0.126410 0.181981 +vt 0.923613 0.181981 +vt 0.735558 0.688993 +vt 0.203072 0.688993 +vt 0.203072 0.669213 +vt 0.735558 0.669213 +vt 0.940482 0.181981 +vt 0.001110 0.181981 +vt 0.000995 0.011336 +vt 0.940461 0.011333 +vn 0.999877 -0.014583 0.005693 +vn 0.999850 -0.017306 -0.000000 +vn 0.999879 -0.014583 -0.005359 +vn -0.999866 0.015576 0.005051 +vn -0.999839 0.016544 0.006981 +vn -0.999643 0.016549 0.020961 +vn -0.999852 0.016553 -0.004742 +vn -0.999857 0.015587 -0.006571 +vn 0.000000 -0.000009 -1.000000 +vn 0.000001 -0.000009 -1.000000 +vn -0.006366 -0.999962 0.006017 +vn 0.000000 -0.999906 0.013721 +vn 0.000000 -0.999984 -0.005695 +vn -0.006366 -0.999896 -0.012946 +vn -0.000015 -0.000009 1.000000 +vn -0.999792 0.016543 -0.011944 +vn -0.006365 -0.999448 -0.032598 +vn -0.999742 0.015574 -0.016561 +vn -0.999763 0.015590 0.015203 +vn -0.999994 0.003496 -0.000000 +vn -0.999994 0.003498 0.000000 +vn 0.999744 -0.022646 -0.000009 +vn 0.999658 -0.025605 -0.005422 +vn 0.999753 -0.021938 -0.003426 +vn 0.999757 -0.021939 0.002288 +vn 0.999743 -0.022641 0.001072 +vn -0.018148 -0.012031 -0.999763 +vn 0.002729 -0.999996 0.000002 +vn -0.019702 -0.999440 0.027030 +vn -0.020206 -0.999796 0.000000 +vn 0.002709 -0.999673 -0.025429 +vn 0.001706 -0.024163 0.999707 +vn -0.035734 0.000809 0.999361 +vn 0.999672 -0.025605 -0.000146 +vn 0.002723 -0.997949 -0.063963 +vn 0.999662 -0.022649 0.012738 +vn 0.999718 -0.022633 -0.007246 +vn -0.000001 0.000010 -1.000000 +vn -0.000024 -0.000002 1.000000 +vn -0.000001 0.000001 1.000000 +vn 0.000015 -0.000001 1.000000 +vn -0.000001 -0.000003 1.000000 +vn -0.000000 -0.000020 1.000000 +vn 0.000000 -0.000023 1.000000 +vn -0.000003 0.000003 1.000000 +vn 0.000002 -0.000002 1.000000 +vn 0.000010 -0.000002 1.000000 +vn -0.000000 -0.000012 1.000000 +vn -0.996774 -0.000001 0.080257 +vn -0.996773 -0.000001 0.080267 +vn 0.075845 -0.992439 0.096500 +vn 0.000000 0.994697 0.102850 +vn 0.000000 0.994698 0.102844 +vn 0.000000 0.980725 0.195396 +vn -0.000000 0.980727 0.195386 +vn 0.991166 0.000003 0.132623 +vn 0.991156 -0.000000 0.132704 +vn 0.996774 -0.000001 0.080259 +vn 0.996771 -0.000002 0.080291 +vn -0.991168 -0.000000 0.132609 +vn -0.991168 0.000000 0.132616 +vn 0.074451 -0.979865 0.185262 +vn 0.074451 -0.979865 0.185261 +vn 0.067239 -0.997737 0.000000 +vn 0.000008 0.000002 -1.000000 +vn 0.000001 0.000000 -1.000000 +vn 0.000000 0.000003 -1.000000 +vn 0.000005 0.000002 -1.000000 +vn 0.000001 -0.000010 -1.000000 +vn -0.000012 0.000000 -1.000000 +vn 0.000001 -0.000016 -1.000000 +vn 0.000002 0.000013 -1.000000 +vn 0.000010 0.000002 -1.000000 +vn -0.000021 0.000004 -1.000000 +vn 0.000000 0.000011 -1.000000 +vn -0.000001 0.000022 -1.000000 +vn 1.000000 -0.000002 -0.000042 +vn -1.000000 0.000004 -0.000022 +vn -0.996774 -0.000001 -0.080260 +vn -0.996773 -0.000001 -0.080274 +vn 0.075845 -0.992438 -0.096509 +vn 0.075845 -0.992439 -0.096505 +vn 0.000000 0.994697 -0.102849 +vn 0.000001 0.980723 -0.195404 +vn 0.000000 0.980725 -0.195394 +vn 0.991166 0.000003 -0.132623 +vn 0.991155 0.000000 -0.132710 +vn 0.996774 -0.000001 -0.080262 +vn 0.996771 -0.000002 -0.080295 +vn -0.991167 0.000000 -0.132616 +vn -0.991168 0.000000 -0.132616 +vn 0.074451 -0.979865 -0.185262 +vn 0.074451 -0.979863 -0.185272 +vn 0.000000 1.000000 -0.000018 +vn 0.000004 0.000001 -1.000000 +vn -0.000006 0.000001 -1.000000 +vn -0.000002 0.000002 -1.000000 +vn -0.000018 -0.000000 -1.000000 +vn 0.000001 0.000023 -1.000000 +vn -0.996771 0.000001 -0.080292 +vn -0.996777 -0.000001 -0.080222 +vn 0.075844 -0.992439 -0.096506 +vn 0.075845 -0.992439 -0.096499 +vn 0.000000 0.994697 -0.102850 +vn 0.000001 0.980726 -0.195389 +vn 0.000000 0.980727 -0.195386 +vn 0.991160 -0.000000 -0.132672 +vn 0.991172 0.000003 -0.132582 +vn 0.996773 -0.000001 -0.080268 +vn 0.996774 -0.000001 -0.080257 +vn -0.991161 0.000000 -0.132667 +vn -0.991170 -0.000002 -0.132599 +vn 0.074451 -0.979866 -0.185254 +vn 0.074451 -0.979867 -0.185252 +vn 0.066485 -0.997787 0.000000 +vn 0.066485 -0.997787 -0.000009 +vn 0.000000 1.000000 -0.000009 +vn 0.999832 0.018329 0.000000 +vn 0.000035 -0.000000 1.000000 +vn -0.000001 -0.000002 1.000000 +vn -0.000009 -0.000001 1.000000 +vn -0.000000 -0.000021 1.000000 +vn -0.000020 -0.000002 1.000000 +vn 0.000000 0.000002 1.000000 +vn 0.000001 0.000023 1.000000 +vn 1.000000 0.000001 0.000000 +vn 1.000000 0.000001 0.000008 +vn -1.000000 0.000003 0.000034 +vn -0.996771 0.000001 0.080292 +vn -0.996777 -0.000002 0.080226 +vn 0.075844 -0.992438 0.096511 +vn 0.075844 -0.992438 0.096514 +vn 0.000001 0.994696 0.102855 +vn -0.000001 0.980727 0.195386 +vn 0.991158 -0.000001 0.132684 +vn 0.991173 0.000003 0.132576 +vn 0.996773 -0.000001 0.080276 +vn 0.996774 -0.000001 0.080257 +vn -0.991161 -0.000000 0.132667 +vn -0.991168 -0.000002 0.132611 +vn 0.074451 -0.979863 0.185271 +vn 0.074451 -0.979863 0.185269 +vn 0.066485 -0.997787 -0.000018 +vn -0.000000 0.000026 -1.000000 +vn -0.000000 1.000000 -0.000016 +vn -0.000001 1.000000 -0.000018 +vn -0.000012 1.000000 0.000001 +vn -0.000013 1.000000 0.000001 +vn 0.000014 1.000000 0.000001 +vn 0.000012 1.000000 0.000001 +vn -0.000000 1.000000 0.000018 +vn -0.000000 1.000000 0.000016 +vn 0.000013 1.000000 0.000001 +vn -0.000004 1.000000 0.000001 +vn 0.000006 1.000000 0.000001 +vn -0.000005 1.000000 0.000001 +vn 1.000000 -0.000012 -0.000001 +vn 1.000000 -0.000059 -0.000001 +vn -1.000000 -0.000046 0.000000 +vn -1.000000 -0.000030 0.000001 +vn -0.000362 0.005434 -0.999985 +vn 0.013156 0.000472 -0.999913 +vn 0.000059 0.000002 -1.000000 +vn 0.000666 0.000419 -1.000000 +vn 0.000026 0.000013 -1.000000 +vn 0.000223 0.000002 -1.000000 +vn 0.000019 -0.000000 -1.000000 +vn -0.000000 0.000024 -1.000000 +vn -0.000000 -0.000021 -1.000000 +vn 0.000007 0.000000 -1.000000 +vn 0.000003 0.000119 -1.000000 +vn -0.000001 0.000011 -1.000000 +vn -0.000001 0.000013 -1.000000 +vn 0.000013 -0.000001 -1.000000 +vn -0.987686 0.000000 -0.156450 +vn -0.987716 -0.000003 -0.156260 +vn 0.074129 -0.979868 -0.185374 +vn 0.074128 -0.979863 -0.185401 +vn -0.000000 0.980353 -0.197251 +vn -0.000000 0.962318 -0.271927 +vn 0.000000 0.962314 -0.271940 +vn 0.982112 0.000001 -0.188299 +vn 0.982127 0.000003 -0.188220 +vn 0.987693 -0.000000 -0.156403 +vn 0.987691 -0.000001 -0.156421 +vn -0.982084 0.000001 -0.188445 +vn -0.982112 -0.000001 -0.188300 +vn 0.072457 -0.963346 -0.258291 +vn 0.072458 -0.963352 -0.258267 +vn 0.066564 -0.997782 0.000000 +vn 0.066564 -0.997782 0.000010 +vn 0.000000 1.000000 -0.000010 +vn -0.001788 0.026807 0.999639 +vn 0.000090 0.028698 0.999588 +vn 0.005279 0.000189 0.999986 +vn 0.000029 0.000001 1.000000 +vn 0.000276 -0.000000 1.000000 +vn 0.000285 0.000132 1.000000 +vn -0.000675 -0.000000 1.000000 +vn -0.000698 0.000000 1.000000 +vn -0.000012 -0.000002 1.000000 +vn 0.000000 -0.000016 1.000000 +vn 0.000037 0.000002 1.000000 +vn -0.000001 -0.000035 1.000000 +vn 1.000000 0.000004 -0.000029 +vn 1.000000 0.000003 -0.000014 +vn -0.997686 -0.000000 0.067992 +vn -0.997691 -0.000002 0.067916 +vn 0.075190 -0.993882 0.080905 +vn 0.075189 -0.993880 0.080921 +vn -0.000000 0.996274 0.086243 +vn -0.000000 0.992690 0.120692 +vn 0.996613 0.000001 0.082235 +vn 0.996616 0.000002 0.082199 +vn 0.997687 -0.000001 0.067983 +vn 0.997687 -0.000001 0.067979 +vn -0.996610 0.000001 0.082275 +vn -0.996614 -0.000001 0.082229 +vn 0.074511 -0.990649 0.114296 +vn 0.074510 -0.990647 0.114306 +vn 0.066564 -0.997782 -0.000003 +vn 0.066564 -0.997782 -0.000001 +vn -1.000000 0.000001 -0.000017 +vn 1.000000 -0.000001 -0.000017 +vn -0.000000 1.000000 0.000004 +vn 0.999990 -0.000001 -0.004388 +vn 0.999991 0.000000 -0.004262 +vn 1.000000 0.000146 0.000023 +vn 1.000000 0.000308 0.000000 +vn 0.999920 -0.000000 0.012660 +vn 0.999918 -0.000000 0.012789 +vn 1.000000 -0.000024 0.000023 +vn 1.000000 -0.000052 -0.000000 +vn 1.000000 -0.000044 -0.000002 +vn 1.000000 0.000097 0.000006 +vn 1.000000 0.000002 0.000002 +vn 1.000000 -0.000000 0.000023 +vn 1.000000 0.000003 0.000006 +vn 1.000000 0.000026 -0.000004 +vn 1.000000 0.000002 -0.000002 +vn 0.058202 -0.000001 0.998305 +vn 0.058205 -0.000001 0.998305 +vn 0.119784 0.992800 0.000001 +vn 0.119787 0.992800 0.000001 +vn 0.123964 0.992287 0.000001 +vn 0.051105 0.998693 0.000000 +vn 0.051099 0.998694 0.000001 +vn 0.119793 -0.992799 -0.000001 +vn 0.059746 0.000001 -0.998214 +vn 0.059745 0.000001 -0.998214 +vn 0.058192 0.000001 -0.998305 +vn 0.058213 0.000001 -0.998304 +vn 0.060244 -0.000001 0.998184 +vn 0.060247 -0.000001 0.998183 +vn 0.123958 -0.992288 -0.000000 +vn 0.123964 -0.992287 0.000000 +vn 0.060234 0.000001 -0.998184 +vn 0.060231 0.000001 -0.998185 +vn 0.059693 -0.000001 0.998217 +vn 0.059711 -0.000000 0.998216 +vn 0.048277 -0.998834 -0.000001 +vn 0.048275 -0.998834 -0.000001 +vn -0.000009 0.000001 -1.000000 +vn -1.000000 0.000000 -0.000013 +vn -0.999997 0.000219 0.002288 +vn -1.000000 -0.000023 -0.000058 +vn -1.000000 -0.000469 -0.000001 +vn -1.000000 -0.000001 -0.000911 +vn -1.000000 0.000000 -0.000889 +vn -1.000000 0.000385 0.000256 +vn -1.000000 0.000071 -0.000001 +vn -1.000000 -0.000002 -0.000002 +vn -1.000000 -0.000003 0.000003 +vn -1.000000 -0.000003 -0.000000 +vn -1.000000 -0.000003 -0.000003 +vn -1.000000 -0.000002 0.000002 +vn -0.134822 -0.000001 0.990870 +vn -0.134798 -0.000001 0.990873 +vn -0.271049 0.962566 0.000001 +vn -0.271049 0.962565 0.000001 +vn -0.279907 0.960027 0.000001 +vn -0.118595 0.992943 0.000000 +vn -0.118580 0.992944 0.000001 +vn -0.271004 -0.962578 -0.000001 +vn -0.138320 0.000001 -0.990388 +vn -0.138352 0.000001 -0.990383 +vn -0.134769 0.000001 -0.990877 +vn -0.134822 0.000001 -0.990870 +vn -0.139478 -0.000001 0.990225 +vn -0.139483 -0.000001 0.990224 +vn -0.279848 -0.960044 -0.000000 +vn -0.139424 0.000001 -0.990233 +vn -0.139449 0.000001 -0.990229 +vn -0.138323 -0.000001 0.990387 +vn -0.138233 -0.000002 0.990400 +vn -0.112067 -0.993701 -0.000001 +vn -0.000020 0.000001 -1.000000 +vn -0.000563 0.008441 0.999964 +vn 0.020430 0.000716 0.999791 +vn 0.000053 -0.000000 1.000000 +vn 0.000716 0.002201 0.999997 +vn -0.002760 -0.000003 0.999996 +vn -0.002800 -0.000001 0.999996 +vn -0.000211 -0.000016 1.000000 +vn 0.000000 -0.000277 1.000000 +vn 0.000000 -0.000006 1.000000 +vn -0.000005 -0.000001 1.000000 +vn 0.000005 -0.000001 1.000000 +vn -0.987697 0.000000 0.156379 +vn -0.987684 0.000001 0.156460 +vn 0.074130 -0.979874 0.185345 +vn 0.074129 -0.979869 0.185371 +vn -0.000000 0.980356 0.197234 +vn -0.000000 0.980359 0.197220 +vn -0.000000 0.962328 0.271891 +vn 0.000000 0.962321 0.271918 +vn 0.982135 -0.000001 0.188175 +vn 0.982120 -0.000002 0.188259 +vn 0.987698 -0.000002 0.156375 +vn 0.987715 -0.000000 0.156264 +vn -0.982098 -0.000000 0.188372 +vn -0.982120 -0.000002 0.188254 +vn 0.072458 -0.963348 0.258283 +vn 0.072458 -0.963346 0.258292 +vn 0.001017 -0.015259 -0.999883 +vn -0.000051 -0.016329 -0.999867 +vn -0.002999 -0.000107 -0.999995 +vn -0.000011 0.000001 -1.000000 +vn -0.000166 0.000002 -1.000000 +vn -0.000167 -0.000018 -1.000000 +vn -0.000029 0.000001 -1.000000 +vn -0.000086 0.000002 -1.000000 +vn 0.000000 -0.000015 -1.000000 +vn 0.000001 -0.000006 -1.000000 +vn -0.000004 0.000043 -1.000000 +vn -0.000000 0.000006 -1.000000 +vn 0.000005 0.000001 -1.000000 +vn -0.000005 0.000000 -1.000000 +vn -0.000004 0.000002 -1.000000 +vn 0.000002 0.000051 -1.000000 +vn -0.000005 0.000001 -1.000000 +vn 1.000000 -0.000076 -0.000811 +vn 1.000000 -0.000040 0.000042 +vn -0.997687 -0.000000 -0.067970 +vn -0.997685 0.000001 -0.068009 +vn 0.075189 -0.993882 -0.080897 +vn 0.075189 -0.993881 -0.080910 +vn 0.000000 0.996274 -0.086240 +vn 0.000000 0.996274 -0.086241 +vn -0.000000 0.992689 -0.120698 +vn 0.996619 -0.000001 -0.082164 +vn 0.996616 -0.000002 -0.082203 +vn 0.997687 -0.000002 -0.067972 +vn 0.997691 0.000000 -0.067919 +vn -0.996611 0.000000 -0.082254 +vn -0.996615 -0.000002 -0.082205 +vn 0.074511 -0.990648 -0.114299 +vn 0.074512 -0.990649 -0.114291 +vn 0.066564 -0.997782 0.000001 +vn 1.000000 -0.000001 0.000017 +vn 1.000000 0.000145 0.000131 +vn 0.999989 -0.004732 -0.000014 +s off +f 9196/3242/3946 9195/3243/3946 9194/3244/3946 +f 9197/3245/3947 9196/3242/3947 9194/3244/3947 +f 9199/3246/3947 9198/3247/3947 9200/3248/3947 +f 9201/3249/3948 9199/3246/3948 9200/3248/3948 +f 9202/3250/3949 9203/3243/3949 9205/3251/3949 +f 9205/3251/3950 9204/3252/3950 9202/3250/3950 +f 9209/3253/3951 9208/3254/3951 9214/3255/3951 +f 9210/3256/3952 9211/3257/3952 9213/3249/3952 +f 9213/3249/3953 9212/3258/3953 9210/3256/3953 +f 9511/3259/3954 9512/3260/3954 9513/3261/3954 +f 9514/3261/3955 9515/3262/3955 9516/3259/3955 +f 9517/3263/3956 9518/3264/3956 9519/3265/3956 +f 9520/3265/3957 9521/3266/3957 9522/3263/3957 +f 9523/3267/3958 9524/3268/3958 9525/3269/3958 +f 9526/3269/3959 9527/3270/3959 9528/3267/3959 +f 9529/3271/21 9530/3272/21 9531/3273/21 +f 9532/3273/3960 9533/3274/3960 9534/3271/3960 +f 9217/3275/3961 9206/3276/3961 9207/3277/3961 +f 9535/3278/3962 9536/3279/3962 9537/3280/3962 +f 9216/3281/3963 9206/3276/3963 9217/3275/3963 +f 9215/3282/3964 9209/3253/3964 9214/3255/3964 +f 9538/3262/3954 9539/3261/3954 9218/3283/3954 +f 9218/3283/3955 9219/3284/3955 9540/3262/3955 +f 9541/3261/21 9542/3273/21 9220/3285/21 +f 9220/3285/21 9221/3286/21 9543/3261/21 +f 9223/3287/3965 9224/3288/3965 9222/3289/3965 +f 9224/3288/3965 9225/3290/3965 9222/3289/3965 +f 9226/3291/3966 9228/3292/3966 9227/3293/3966 +f 9228/3292/3966 9229/3294/3966 9227/3293/3966 +f 9231/3295/3967 9230/3296/3967 9233/3297/3967 +f 9232/3298/3968 9233/3297/3968 9230/3296/3968 +f 9236/3299/3969 9237/3300/3969 9242/3301/3969 +f 9239/3302/3970 9238/3303/3970 9241/3304/3970 +f 9240/3305/3971 9241/3304/3971 9238/3303/3971 +f 9544/3306/3972 9545/3307/3972 9546/3308/3972 +f 9547/3309/105 9548/3308/105 9549/3307/105 +f 9550/3310/3973 9551/3311/3973 9552/3312/3973 +f 9553/3313/3974 9554/3312/3974 9555/3311/3974 +f 9556/3314/3975 9557/3315/3975 9558/3316/3975 +f 9559/3317/3976 9560/3316/3976 9561/3315/3976 +f 9562/3318/3977 9563/3319/3977 9564/3320/3977 +f 9565/3321/3978 9566/3320/3978 9567/3319/3978 +f 9234/3322/3979 9245/3323/3979 9235/3324/3979 +f 9568/3325/3980 9569/3326/3980 9570/3327/3980 +f 9234/3322/3981 9244/3328/3981 9245/3323/3981 +f 9237/3300/3982 9243/3329/3982 9242/3301/3982 +f 9571/3330/3983 9572/3309/3983 9246/3331/3983 +f 9247/3332/3983 9246/3331/3983 9573/3309/3983 +f 9574/3333/21 9575/3321/21 9248/3334/21 +f 9249/3335/21 9248/3334/21 9576/3321/21 +f 9577/3336/21 9272/3337/21 9273/3338/21 +f 9578/3339/21 9579/3336/21 9273/3338/21 +f 9251/3340/2228 9580/3339/2228 9273/3338/2228 +f 9251/3340/3984 9273/3338/3984 9274/3341/3984 +f 9581/3336/3818 9582/3342/3818 9583/3343/3818 +f 9272/3337/21 9584/3336/21 9585/3343/21 +f 9272/3337/21 9586/3343/21 9587/3344/21 +f 9250/3345/2228 9251/3340/2228 9274/3341/2228 +f 9250/3345/3985 9274/3341/3985 9275/3346/3985 +f 9588/3306/3986 9250/3345/3986 9275/3346/3986 +f 9589/3306/3987 9275/3346/3987 9272/3337/3987 +f 9590/3344/21 9591/3306/21 9272/3337/21 +f 9266/3347/3988 9264/3348/3988 9260/3337/3988 +f 9263/3346/3989 9265/3349/3989 9267/3350/3989 +f 9263/3346/3989 9267/3350/3989 9268/3351/3989 +f 9263/3346/3990 9268/3351/3990 9269/3352/3990 +f 9260/3337/3991 9263/3346/3991 9269/3352/3991 +f 9260/3337/359 9269/3352/359 9270/3353/359 +f 9268/3351/21 9267/3350/21 9266/3347/21 +f 9271/3354/21 9268/3351/21 9266/3347/21 +f 9271/3354/21 9266/3347/21 9260/3337/21 +f 9270/3353/21 9271/3354/21 9260/3337/21 +f 9261/3338/3991 9264/3348/3991 9265/3349/3991 +f 9265/3349/3992 9262/3341/3992 9261/3338/3992 +f 9260/3337/3985 9264/3348/3985 9261/3338/3985 +f 9263/3346/3993 9262/3341/3993 9265/3349/3993 +f 9255/3355/3994 9252/3356/3994 9592/3357/3994 +f 9593/3357/3995 9594/3358/3995 9255/3355/3995 +f 9254/3359/3996 9595/3360/3996 9596/3361/3996 +f 9597/3361/3996 9598/3362/3996 9254/3359/3996 +f 9599/3360/3997 9253/3363/3997 9600/3364/3997 +f 9601/3364/3998 9602/3361/3998 9603/3360/3998 +f 9256/3365/3999 9257/3366/3999 9604/3367/3999 +f 9605/3367/4000 9606/3368/4000 9256/3365/4000 +f 9607/3369/4001 9258/3370/4001 9608/3371/4001 +f 9609/3371/4002 9610/3357/4002 9611/3369/4002 +f 9612/3356/4003 9613/3372/4003 9614/3373/4003 +f 9615/3373/4004 9616/3357/4004 9617/3356/4004 +f 9259/3374/4005 9618/3375/4005 9619/3357/4005 +f 9620/3357/4006 9621/3376/4006 9259/3374/4006 +f 9622/3377/4007 9623/3365/4007 9624/3378/4007 +f 9625/3378/4008 9626/3367/4008 9627/3377/4008 +f 9628/3379/4009 9629/3380/4009 9630/3381/4009 +f 9631/3381/4009 9632/3382/4009 9633/3379/4009 +f 9634/3383/2231 9635/3384/2231 9636/3385/2231 +f 9637/3385/2231 9638/3386/2231 9639/3383/2231 +f 9640/3380/331 9641/3387/331 9642/3388/331 +f 9643/3388/331 9644/3381/331 9645/3380/331 +f 9646/3389/123 9647/3390/123 9648/3391/123 +f 9649/3391/123 9650/3392/123 9651/3389/123 +f 9288/3337/354 9652/3336/354 9289/3338/354 +f 9653/3336/105 9654/3339/105 9289/3338/105 +f 9655/3339/353 9187/3393/353 9289/3338/353 +f 9289/3338/4010 9187/3393/4010 9290/3341/4010 +f 9656/3342/3955 9657/3336/3955 9658/3343/3955 +f 9659/3336/4011 9288/3337/4011 9660/3343/4011 +f 9661/3343/105 9288/3337/105 9662/3344/105 +f 9187/3393/355 9190/3394/355 9290/3341/355 +f 9290/3341/4012 9190/3394/4012 9291/3346/4012 +f 9190/3394/4013 9663/3306/4013 9291/3346/4013 +f 9291/3346/353 9664/3306/353 9288/3337/353 +f 9665/3306/105 9666/3344/105 9288/3337/105 +f 9280/3348/4014 9282/3347/4014 9276/3337/4014 +f 9281/3349/105 9279/3346/105 9283/3350/105 +f 9283/3350/105 9279/3346/105 9284/3351/105 +f 9284/3351/105 9279/3346/105 9285/3352/105 +f 9279/3346/360 9276/3337/360 9285/3352/360 +f 9285/3352/4015 9276/3337/4015 9286/3353/4015 +f 9283/3350/353 9284/3351/353 9282/3347/353 +f 9284/3351/353 9287/3354/353 9282/3347/353 +f 9282/3347/4016 9287/3354/4016 9276/3337/4016 +f 9287/3354/4017 9286/3353/4017 9276/3337/4017 +f 9280/3348/4018 9277/3338/4018 9281/3349/4018 +f 9278/3341/4019 9281/3349/4019 9277/3338/4019 +f 9280/3348/4020 9276/3337/4020 9277/3338/4020 +f 9278/3341/4021 9279/3346/4021 9281/3349/4021 +f 9197/3245/63 9667/3395/63 9196/3242/63 +f 9668/3396/4022 9196/3242/4022 9669/3395/4022 +f 9670/3397/4023 9225/3290/4023 9671/3398/4023 +f 9224/3288/76 9672/3398/76 9225/3290/76 +f 9252/3356/4024 9255/3355/4024 9673/3399/4024 +f 9674/3400/4025 9675/3399/4025 9255/3355/4025 +f 9676/3360/4026 9254/3359/4026 9677/3401/4026 +f 9678/3402/4027 9679/3401/4027 9254/3359/4027 +f 9253/3363/4028 9680/3360/4028 9681/3403/4028 +f 9682/3404/4028 9683/3403/4028 9684/3360/4028 +f 9257/3366/4029 9256/3365/4029 9685/3405/4029 +f 9686/3406/4030 9687/3405/4030 9256/3365/4030 +f 9258/3370/4031 9688/3369/4031 9689/3407/4031 +f 9690/3399/4032 9691/3407/4032 9692/3369/4032 +f 9693/3372/4033 9694/3356/4033 9695/3408/4033 +f 9696/3399/4034 9697/3408/4034 9698/3356/4034 +f 9699/3375/4035 9259/3374/4035 9700/3399/4035 +f 9701/3409/4036 9702/3399/4036 9259/3374/4036 +f 9703/3365/4037 9704/3377/4037 9705/3410/4037 +f 9706/3405/4038 9707/3410/4038 9708/3377/4038 +f 9709/3411/4009 9710/3412/4009 9711/3413/4009 +f 9712/3414/4009 9713/3413/4009 9714/3412/4009 +f 9715/3415/2231 9716/3416/2231 9717/3417/2231 +f 9718/3418/2231 9719/3417/2231 9720/3416/2231 +f 9721/3419/4039 9722/3420/4039 9723/3421/4039 +f 9724/3413/331 9725/3421/331 9726/3420/331 +f 9727/3422/123 9728/3423/123 9729/3424/123 +f 9730/3425/123 9731/3424/123 9732/3423/123 +f 9314/3426/354 9733/3427/354 9315/3428/354 +f 9734/3427/105 9735/3429/105 9315/3428/105 +f 9736/3429/356 9293/3430/356 9315/3428/356 +f 9315/3428/4040 9293/3430/4040 9316/3431/4040 +f 9737/3432/4011 9738/3427/4011 9739/3433/4011 +f 9740/3427/4011 9314/3426/4011 9741/3433/4011 +f 9742/3433/105 9314/3426/105 9743/3434/105 +f 9293/3430/356 9292/3435/356 9316/3431/356 +f 9316/3431/4011 9292/3435/4011 9317/3346/4011 +f 9292/3435/4041 9744/3319/4041 9317/3346/4041 +f 9317/3346/353 9745/3319/353 9314/3426/353 +f 9746/3319/105 9747/3434/105 9314/3426/105 +f 9306/3436/105 9308/3347/105 9302/3426/105 +f 9307/3437/105 9305/3346/105 9309/3438/105 +f 9309/3438/105 9305/3346/105 9310/3439/105 +f 9310/3439/105 9305/3346/105 9311/3440/105 +f 9305/3346/4042 9302/3426/4042 9311/3440/4042 +f 9311/3440/4043 9302/3426/4043 9312/3441/4043 +f 9309/3438/353 9310/3439/353 9308/3347/353 +f 9310/3439/353 9313/3442/353 9308/3347/353 +f 9308/3347/105 9313/3442/105 9302/3426/105 +f 9313/3442/4044 9312/3441/4044 9302/3426/4044 +f 9306/3436/4042 9303/3428/4042 9307/3437/4042 +f 9304/3431/354 9307/3437/354 9303/3428/354 +f 9306/3436/105 9302/3426/105 9303/3428/105 +f 9304/3431/105 9305/3346/105 9307/3437/105 +f 9294/3443/4045 9297/3444/4045 9748/3445/4045 +f 9749/3446/4046 9750/3445/4046 9297/3444/4046 +f 9751/3447/4047 9296/3448/4047 9752/3449/4047 +f 9753/3450/4048 9754/3449/4048 9296/3448/4048 +f 9295/3451/4049 9755/3447/4049 9756/3450/4049 +f 9757/3452/4049 9758/3450/4049 9759/3447/4049 +f 9299/3453/4050 9298/3454/4050 9760/3455/4050 +f 9761/3456/4051 9762/3455/4051 9298/3454/4051 +f 9300/3457/4052 9763/3458/4052 9764/3459/4052 +f 9765/3445/4053 9766/3459/4053 9767/3458/4053 +f 9768/3460/4054 9769/3443/4054 9770/3461/4054 +f 9771/3445/4055 9772/3461/4055 9773/3443/4055 +f 9774/3462/4056 9301/3463/4056 9775/3445/4056 +f 9776/3464/4057 9777/3445/4057 9301/3463/4057 +f 9778/3454/4058 9779/3453/4058 9780/3456/4058 +f 9781/3455/4059 9782/3456/4059 9783/3453/4059 +f 9784/3465/4060 9785/3466/4060 9786/3467/4060 +f 9787/3468/4061 9788/3467/4061 9789/3466/4061 +f 9790/3469/7 9791/3470/7 9792/3471/7 +f 9793/3472/7 9794/3471/7 9795/3470/7 +f 9796/3473/331 9797/3465/331 9798/3474/331 +f 9799/3467/4062 9800/3474/4062 9801/3465/4062 +f 9802/3475/4063 9803/3469/4063 9804/3476/4063 +f 9805/3471/4063 9806/3476/4063 9807/3469/4063 +f 9808/3427/3772 9330/3426/3772 9331/3428/3772 +f 9809/3429/21 9810/3427/21 9331/3428/21 +f 9188/3477/2228 9811/3429/2228 9331/3428/2228 +f 9188/3477/4064 9331/3428/4064 9332/3431/4064 +f 9812/3427/3830 9813/3432/3830 9814/3433/3830 +f 9330/3426/3830 9815/3427/3830 9816/3433/3830 +f 9330/3426/21 9817/3433/21 9818/3434/21 +f 9189/3478/4065 9188/3477/4065 9332/3431/4065 +f 9189/3478/4065 9332/3431/4065 9333/3346/4065 +f 9819/3319/4066 9189/3478/4066 9333/3346/4066 +f 9820/3319/21 9333/3346/21 9330/3426/21 +f 9821/3434/21 9822/3319/21 9330/3426/21 +f 9324/3347/4067 9322/3436/4067 9318/3426/4067 +f 9321/3346/3989 9323/3437/3989 9325/3438/3989 +f 9321/3346/3989 9325/3438/3989 9326/3439/3989 +f 9321/3346/3990 9326/3439/3990 9327/3440/3990 +f 9318/3426/21 9321/3346/21 9327/3440/21 +f 9318/3426/4068 9327/3440/4068 9328/3441/4068 +f 9326/3439/4069 9325/3438/4069 9324/3347/4069 +f 9329/3442/4069 9326/3439/4069 9324/3347/4069 +f 9329/3442/21 9324/3347/21 9318/3426/21 +f 9328/3441/4070 9329/3442/4070 9318/3426/4070 +f 9319/3428/21 9322/3436/21 9323/3437/21 +f 9323/3437/21 9320/3431/21 9319/3428/21 +f 9318/3426/3985 9322/3436/3985 9319/3428/3985 +f 9321/3346/3772 9320/3431/3772 9323/3437/3772 +f 9823/3479/4071 9198/3247/4071 9199/3246/4071 +f 9199/3246/4072 9824/3480/4072 9825/3479/4072 +f 9226/3291/4073 9826/3479/4073 9827/3481/4073 +f 9828/3481/363 9228/3292/363 9226/3291/363 +f 9297/3444/4074 9294/3443/4074 9829/3482/4074 +f 9830/3482/4075 9831/3483/4075 9297/3444/4075 +f 9296/3448/4076 9832/3447/4076 9833/3484/4076 +f 9834/3484/4077 9835/3485/4077 9296/3448/4077 +f 9836/3447/3997 9295/3451/3997 9837/3486/3997 +f 9838/3486/4078 9839/3487/4078 9840/3447/4078 +f 9298/3454/4079 9299/3453/4079 9841/3488/4079 +f 9842/3488/4000 9843/3489/4000 9298/3454/4000 +f 9844/3458/4080 9300/3457/4080 9845/3490/4080 +f 9846/3490/4081 9847/3491/4081 9848/3458/4081 +f 9849/3443/4082 9850/3460/4082 9851/3492/4082 +f 9852/3492/4083 9853/3482/4083 9854/3443/4083 +f 9301/3463/4084 9855/3462/4084 9856/3482/4084 +f 9857/3482/4085 9858/3493/4085 9301/3463/4085 +f 9859/3453/4086 9860/3454/4086 9861/3494/4086 +f 9862/3494/4087 9863/3495/4087 9864/3453/4087 +f 9865/3496/4088 9866/3497/4088 9867/3498/4088 +f 9868/3498/4060 9869/3499/4060 9870/3496/4060 +f 9871/3500/7 9872/3501/7 9873/3502/7 +f 9874/3502/7 9875/3503/7 9876/3500/7 +f 9877/3497/331 9878/3504/331 9879/3505/331 +f 9880/3505/331 9881/3498/331 9882/3497/331 +f 9883/3506/4063 9884/3507/4063 9885/3508/4063 +f 9886/3508/4063 9887/3502/4063 9888/3506/4063 +f 9335/3509/21 9334/3510/21 9336/3511/21 +f 9336/3511/21 9337/3512/21 9335/3509/21 +f 9889/3513/63 9338/3514/63 9339/3515/63 +f 9339/3515/63 9890/3516/63 9891/3513/63 +f 9340/3517/7 9892/3513/7 9893/3516/7 +f 9894/3516/7 9341/3515/7 9340/3517/7 +f 9895/3510/2446 9896/3509/2446 9897/3512/2446 +f 9898/3512/4089 9899/3511/4089 9900/3510/4089 +f 9901/3518/4090 9902/3519/4090 9342/3520/4090 +f 9342/3520/4091 9343/3521/4091 9903/3518/4091 +f 9904/3519/4092 9905/3522/4092 9344/3523/4092 +f 9344/3523/4093 9342/3520/4093 9906/3519/4093 +f 9907/3524/4094 9908/3518/4094 9343/3521/4094 +f 9343/3521/4095 9345/3525/4095 9909/3524/4095 +f 9910/3522/4096 9911/3524/4096 9345/3525/4096 +f 9345/3525/4097 9344/3523/4097 9912/3522/4097 +f 9347/3509/21 9346/3510/21 9348/3511/21 +f 9348/3511/21 9349/3512/21 9347/3509/21 +f 9913/3526/63 9350/3527/63 9351/3528/63 +f 9351/3528/63 9914/3529/63 9915/3526/63 +f 9352/3527/7 9916/3526/7 9917/3529/7 +f 9918/3529/7 9353/3528/7 9352/3527/7 +f 9919/3510/105 9920/3509/105 9921/3512/105 +f 9922/3512/105 9923/3511/105 9924/3510/105 +f 9925/3530/4090 9926/3531/4090 9354/3532/4090 +f 9354/3532/4090 9355/3533/4090 9927/3530/4090 +f 9928/3531/4092 9929/3534/4092 9356/3535/4092 +f 9356/3535/4093 9354/3532/4093 9930/3531/4093 +f 9931/3536/4098 9932/3530/4098 9355/3533/4098 +f 9355/3533/4095 9357/3537/4095 9933/3536/4095 +f 9934/3534/4097 9935/3536/4097 9357/3537/4097 +f 9357/3537/4097 9356/3535/4097 9936/3534/4097 +f 9937/3538/2216 9938/3524/2216 9939/3539/2216 +f 9940/3538/2216 9941/3539/2216 9942/3278/2216 +f 9943/3278/4099 9944/3539/4099 9945/3519/4099 +f 9946/3538/4100 9947/3518/4100 9948/3524/4100 +f 9949/3278/4101 9950/3519/4101 9951/3534/4101 +f 9952/3531/908 9953/3540/908 9954/3534/908 +f 9955/3534/4099 9956/3540/4099 9957/3278/4099 +f 9958/3395/4102 9959/3479/4102 9960/3480/4102 +f 9961/3480/4103 9962/3396/4103 9963/3395/4103 +f 9964/3536/331 9965/3519/331 9966/3518/331 +f 9967/3536/243 9968/3534/243 9969/3519/243 +f 9970/3518/2950 9971/3538/2950 9972/3536/2950 +f 9973/3541/2215 9974/3530/2215 9975/3536/2215 +f 9976/3541/2215 9977/3536/2215 9978/3538/2215 +f 9979/3479/4104 9980/3397/4104 9981/3481/4104 +f 9982/3481/4105 9983/3397/4105 9984/3398/4105 +f 9985/3541/2089 9986/3540/2089 9987/3530/2089 +f 9988/3531/1571 9989/3530/1571 9990/3540/1571 +f 9366/3542/4106 9361/3543/4106 9367/3544/4106 +f 9361/3543/4107 9368/3545/4107 9367/3544/4107 +f 9367/3544/4108 9368/3545/4108 9369/3546/4108 +f 9361/3543/4109 9366/3542/4109 9370/3547/4109 +f 9370/3547/4110 9366/3542/4110 9192/3548/4110 +f 9366/3542/4111 9371/3549/4111 9192/3548/4111 +f 9368/3545/4112 9192/3548/4112 9369/3546/4112 +f 9369/3546/4113 9192/3548/4113 9371/3549/4113 +f 9373/3550/4114 9374/3551/4114 9380/3542/4114 +f 9372/3552/105 9383/3549/105 9375/3553/105 +f 9375/3553/105 9383/3549/105 9376/3554/105 +f 9376/3554/105 9383/3549/105 9377/3555/105 +f 9383/3549/360 9380/3542/360 9377/3555/360 +f 9377/3555/4015 9380/3542/4015 9378/3556/4015 +f 9375/3553/356 9376/3554/356 9374/3551/356 +f 9376/3554/4115 9379/3557/4115 9374/3551/4115 +f 9374/3551/4116 9379/3557/4116 9380/3542/4116 +f 9379/3557/4117 9378/3556/4117 9380/3542/4117 +f 9373/3550/4118 9380/3542/4118 9381/3544/4118 +f 9373/3550/4119 9381/3544/4119 9372/3552/4119 +f 9382/3546/105 9372/3552/105 9381/3544/105 +f 9382/3546/105 9383/3549/105 9372/3552/105 +f 9384/3558/4120 9385/3559/4120 9991/3560/4120 +f 9992/3561/4121 9993/3560/4121 9385/3559/4121 +f 9994/3562/4122 9386/3563/4122 9995/3564/4122 +f 9996/3565/4123 9997/3564/4123 9386/3563/4123 +f 9387/3566/4124 9998/3562/4124 9999/3565/4124 +f 10000/3567/4124 10001/3565/4124 10002/3562/4124 +f 9388/3568/4125 9389/3569/4125 10003/3570/4125 +f 10004/3571/4126 10005/3570/4126 9389/3569/4126 +f 9390/3572/4127 10006/3573/4127 10007/3574/4127 +f 10008/3560/4128 10009/3574/4128 10010/3573/4128 +f 10011/3575/4129 10012/3558/4129 10013/3576/4129 +f 10014/3560/4130 10015/3576/4130 10016/3558/4130 +f 10017/3573/4131 9391/3577/4131 10018/3560/4131 +f 10019/3578/4132 10020/3560/4132 9391/3577/4132 +f 10021/3579/4133 10022/3568/4133 10023/3571/4133 +f 10024/3580/4134 10025/3571/4134 10026/3568/4134 +f 10027/3581/4135 10028/3582/4135 10029/3583/4135 +f 10030/3584/4136 10031/3583/4136 10032/3582/4136 +f 10033/3585/2231 10034/3586/2231 10035/3587/2231 +f 10036/3588/2231 10037/3587/2231 10038/3586/2231 +f 10039/3589/311 10040/3585/311 10041/3590/311 +f 10042/3587/311 10043/3590/311 10044/3585/311 +f 10045/3591/4137 10046/3592/4137 10047/3593/4137 +f 10048/3594/331 10049/3593/331 10050/3592/331 +f 9362/3595/4138 9392/3542/4138 9393/3596/4138 +f 9360/3597/4139 9362/3595/4139 9393/3596/4139 +f 9394/3545/4140 9360/3597/4140 9393/3596/4140 +f 9394/3545/4141 9393/3596/4141 9395/3546/4141 +f 9362/3595/4142 9364/3598/4142 9396/3599/4142 +f 9392/3542/4143 9362/3595/4143 9396/3599/4143 +f 9392/3542/4144 9396/3599/4144 9397/3600/4144 +f 9398/3549/4145 9392/3542/4145 9397/3600/4145 +f 9397/3600/4146 9394/3545/4146 9395/3546/4146 +f 9397/3600/4147 9395/3546/4147 9398/3549/4147 +f 9401/3551/21 9399/3550/21 9408/3601/21 +f 9404/3602/21 9400/3552/21 9402/3553/21 +f 9404/3602/21 9402/3553/21 9403/3554/21 +f 9408/3601/4148 9404/3602/4148 9405/3556/4148 +f 9403/3554/2228 9402/3553/2228 9401/3551/2228 +f 9406/3557/2228 9403/3554/2228 9401/3551/2228 +f 9406/3557/21 9401/3551/21 9408/3601/21 +f 9405/3556/4149 9406/3557/4149 9408/3601/4149 +f 9408/3601/21 9399/3550/21 9407/3544/21 +f 9407/3544/365 9399/3550/365 9400/3552/365 +f 9400/3552/3772 9409/3546/3772 9407/3544/3772 +f 9400/3552/21 9404/3602/21 9410/3549/21 +f 9410/3549/21 9409/3546/21 9400/3552/21 +f 9408/3601/365 9410/3549/365 9404/3602/365 +f 10051/3603/4150 10052/3604/4150 10053/3605/4150 +f 10054/3605/4151 10055/3606/4151 10056/3603/4151 +f 9385/3559/4152 9384/3558/4152 10057/3607/4152 +f 10058/3607/4153 10059/3608/4153 9385/3559/4153 +f 9386/3563/4154 10060/3562/4154 10061/3609/4154 +f 10062/3609/4155 10063/3610/4155 9386/3563/4155 +f 10064/3562/4156 9387/3566/4156 10065/3610/4156 +f 10066/3610/4156 10067/3609/4156 10068/3562/4156 +f 9389/3569/4157 9388/3568/4157 10069/3611/4157 +f 10070/3611/4157 10071/3612/4157 9389/3569/4157 +f 10072/3573/4158 9390/3572/4158 10073/3613/4158 +f 10074/3613/4159 10075/3607/4159 10076/3573/4159 +f 10077/3558/4160 10078/3575/4160 10079/3614/4160 +f 10080/3614/4161 10081/3607/4161 10082/3558/4161 +f 9391/3577/4162 10083/3573/4162 10084/3607/4162 +f 10085/3607/4163 10086/3615/4163 9391/3577/4163 +f 10087/3568/4164 10088/3579/4164 10089/3612/4164 +f 10090/3612/4165 10091/3611/4165 10092/3568/4165 +f 10093/3616/4166 10094/3617/4166 10095/3618/4166 +f 10096/3618/4167 10097/3619/4167 10098/3616/4167 +f 10099/3620/2231 10100/3621/2231 10101/3622/2231 +f 10102/3622/4168 10103/3623/4168 10104/3620/4168 +f 10105/3621/4169 10106/3624/4169 10107/3625/4169 +f 10108/3625/311 10109/3622/311 10110/3621/311 +f 10111/3626/331 10112/3616/331 10113/3627/331 +f 10114/3627/4170 10115/3618/4170 10116/3626/4170 +f 9411/3628/4171 9412/3629/4171 10117/3630/4171 +f 10118/3631/4172 10119/3630/4172 9412/3629/4172 +f 9411/3628/4173 10120/3630/4173 9413/3632/4173 +f 9414/3633/4174 9411/3628/4174 9413/3632/4174 +f 9414/3633/4175 9413/3632/4175 9415/3634/4175 +f 9416/3635/4176 9414/3633/4176 9415/3634/4176 +f 9415/3634/4177 10121/3631/4177 9412/3629/4177 +f 9415/3634/4178 9412/3629/4178 9416/3635/4178 +f 9432/3635/4179 9418/3636/4179 9419/3637/4179 +f 9432/3635/4180 9419/3637/4180 9420/3638/4180 +f 9432/3635/63 9420/3638/63 9421/3639/63 +f 9432/3635/63 9421/3639/63 9422/3640/63 +f 9432/3635/63 9422/3640/63 9423/3641/63 +f 9424/3642/63 9417/3643/63 9430/3633/63 +f 9430/3633/4181 9432/3635/4181 9423/3641/4181 +f 9430/3633/4182 9423/3641/4182 9425/3644/4182 +f 9420/3638/4183 9419/3637/4183 9424/3642/4183 +f 9426/3645/123 9420/3638/123 9424/3642/123 +f 9426/3645/63 9424/3642/63 9430/3633/63 +f 9427/3646/63 9426/3645/63 9430/3633/63 +f 9422/3640/123 9421/3639/123 9427/3646/123 +f 9428/3647/123 9422/3640/123 9427/3646/123 +f 9428/3647/63 9427/3646/63 9430/3633/63 +f 9425/3644/4184 9428/3647/4184 9430/3633/4184 +f 9429/3628/63 9430/3633/63 9417/3643/63 +f 9429/3628/4181 9417/3643/4181 9418/3636/4181 +f 9418/3636/4185 9431/3629/4185 9429/3628/4185 +f 9432/3635/63 9431/3629/63 9418/3636/63 +f 9433/3648/4186 9434/3649/4186 10122/3650/4186 +f 10123/3650/4187 10124/3651/4187 9433/3648/4187 +f 10125/3652/4188 9435/3653/4188 10126/3654/4188 +f 10127/3654/4189 10128/3655/4189 10129/3652/4189 +f 9436/3656/4190 9437/3657/4190 10130/3658/4190 +f 10131/3658/4190 10132/3659/4190 9436/3656/4190 +f 9438/3660/4191 9439/3661/4191 10133/3662/4191 +f 10134/3662/4192 10135/3663/4192 9438/3660/4192 +f 9440/3653/4193 10136/3652/4193 10137/3664/4193 +f 10138/3664/4193 10139/3665/4193 9440/3653/4193 +f 10140/3666/4194 9441/3667/4194 10141/3668/4194 +f 10142/3668/4195 10143/3650/4195 10144/3666/4195 +f 10145/3649/4196 10146/3648/4196 10147/3651/4196 +f 10148/3651/4197 10149/3650/4197 10150/3649/4197 +f 9442/3669/4198 10151/3670/4198 10152/3650/4198 +f 10153/3650/4199 10154/3651/4199 9442/3669/4199 +f 9443/3657/4200 10155/3656/4200 10156/3671/4200 +f 10157/3671/4201 10158/3672/4201 9443/3657/4201 +f 10159/3670/4202 10160/3669/4202 10161/3651/4202 +f 10162/3651/4203 10163/3650/4203 10164/3670/4203 +f 9444/3667/4204 10165/3666/4204 10166/3650/4204 +f 10167/3650/4205 10168/3651/4205 9444/3667/4205 +f 10169/3673/4206 10170/3674/4206 10171/3675/4206 +f 10172/3675/4207 10173/3662/4207 10174/3673/4207 +f 10175/3676/2228 10176/3677/2228 10177/3678/2228 +f 10178/3678/2228 10179/3679/2228 10180/3676/2228 +f 10181/3680/252 10182/3681/252 10183/3682/252 +f 10184/3682/252 10185/3683/252 10186/3680/252 +f 10187/3677/356 10188/3676/356 10189/3684/356 +f 10190/3684/4208 10191/3678/4208 10192/3677/4208 +f 10193/3685/243 10194/3686/243 10195/3683/243 +f 10196/3683/243 10197/3687/243 10198/3685/243 +f 9445/3688/4209 9446/3628/4209 10199/3689/4209 +f 10200/3689/4210 10201/3690/4210 9445/3688/4210 +f 10202/3689/4211 9446/3628/4211 9447/3691/4211 +f 9446/3628/4212 9448/3633/4212 9447/3691/4212 +f 9447/3691/4213 9448/3633/4213 9191/3692/4213 +f 9448/3633/4214 9449/3635/4214 9191/3692/4214 +f 10203/3690/4215 9191/3692/4215 9445/3688/4215 +f 9445/3688/4216 9191/3692/4216 9449/3635/4216 +f 9450/3636/7 9465/3635/7 9452/3637/7 +f 9452/3637/7 9465/3635/7 9453/3638/7 +f 9453/3638/7 9465/3635/7 9454/3639/7 +f 9454/3639/7 9465/3635/7 9455/3640/7 +f 9455/3640/7 9465/3635/7 9456/3641/7 +f 9451/3643/7 9457/3642/7 9462/3633/7 +f 9465/3635/4217 9462/3633/4217 9456/3641/4217 +f 9456/3641/4218 9462/3633/4218 9458/3644/4218 +f 9452/3637/4219 9453/3638/4219 9457/3642/4219 +f 9453/3638/4219 9459/3645/4219 9457/3642/4219 +f 9457/3642/7 9459/3645/7 9462/3633/7 +f 9459/3645/7 9460/3646/7 9462/3633/7 +f 9454/3639/4219 9455/3640/4219 9460/3646/4219 +f 9455/3640/4219 9461/3647/4219 9460/3646/4219 +f 9460/3646/7 9461/3647/7 9462/3633/7 +f 9461/3647/7 9458/3644/7 9462/3633/7 +f 9462/3633/7 9463/3628/7 9451/3643/7 +f 9451/3643/4220 9463/3628/4220 9450/3636/4220 +f 9464/3688/4221 9450/3636/4221 9463/3628/4221 +f 9464/3688/7 9465/3635/7 9450/3636/7 +f 9434/3649/4222 9433/3648/4222 10204/3693/4222 +f 10205/3694/4223 10206/3693/4223 9433/3648/4223 +f 9435/3653/4224 10207/3652/4224 10208/3695/4224 +f 10209/3696/4225 10210/3695/4225 10211/3652/4225 +f 9437/3657/4226 9436/3656/4226 10212/3697/4226 +f 10213/3698/4226 10214/3697/4226 9436/3656/4226 +f 9439/3661/4227 9438/3660/4227 10215/3699/4227 +f 10216/3700/4228 10217/3699/4228 9438/3660/4228 +f 10218/3652/4229 9440/3653/4229 10219/3696/4229 +f 10220/3695/4229 10221/3696/4229 9440/3653/4229 +f 9441/3667/4230 10222/3666/4230 10223/3694/4230 +f 10224/3693/4231 10225/3694/4231 10226/3666/4231 +f 10227/3648/4232 10228/3649/4232 10229/3694/4232 +f 10230/3693/4233 10231/3694/4233 10232/3649/4233 +f 10233/3670/4234 9442/3669/4234 10234/3693/4234 +f 10235/3694/4235 10236/3693/4235 9442/3669/4235 +f 10237/3656/4236 9443/3657/4236 10238/3698/4236 +f 10239/3697/4236 10240/3698/4236 9443/3657/4236 +f 10241/3669/4237 10242/3670/4237 10243/3694/4237 +f 10244/3693/4238 10245/3694/4238 10246/3670/4238 +f 10247/3666/4239 9444/3667/4239 10248/3693/4239 +f 10249/3694/4240 10250/3693/4240 9444/3667/4240 +f 10251/3674/4241 10252/3673/4241 10253/3700/4241 +f 10254/3699/4241 10255/3700/4241 10256/3673/4241 +f 10257/3701/2228 10258/3702/2228 10259/3703/2228 +f 10260/3704/2228 10261/3703/2228 10262/3702/2228 +f 10263/3705/252 10264/3706/252 10265/3707/252 +f 10266/3708/252 10267/3707/252 10268/3706/252 +f 10269/3702/356 10270/3709/356 10271/3710/356 +f 10272/3711/4242 10273/3710/4242 10274/3709/4242 +f 10275/3706/2350 10276/3705/2350 10277/3708/2350 +f 10278/3712/243 10279/3708/243 10280/3705/243 +f 9358/3543/4243 9466/3713/4243 9467/3714/4243 +f 9193/3715/4244 9358/3543/4244 9467/3714/4244 +f 9193/3715/4245 9467/3714/4245 9468/3716/4245 +f 9466/3713/4246 9358/3543/4246 10281/3717/4246 +f 9466/3713/4247 10282/3717/4247 10283/3718/4247 +f 9469/3719/4248 9466/3713/4248 10284/3718/4248 +f 10285/3718/4249 9193/3715/4249 9468/3716/4249 +f 10286/3718/4250 9468/3716/4250 9469/3719/4250 +f 9472/3720/2505 9470/3721/2505 9479/3713/2505 +f 9481/3719/4251 9471/3722/4251 9473/3723/4251 +f 9481/3719/4251 9473/3723/4251 9474/3724/4251 +f 9481/3719/4251 9474/3724/4251 9475/3725/4251 +f 9479/3713/4252 9481/3719/4252 9475/3725/4252 +f 9479/3713/3772 9475/3725/3772 9476/3726/3772 +f 9474/3724/2228 9473/3723/2228 9472/3720/2228 +f 9477/3727/2228 9474/3724/2228 9472/3720/2228 +f 9477/3727/21 9472/3720/21 9479/3713/21 +f 9476/3726/21 9477/3727/21 9479/3713/21 +f 9479/3713/21 9470/3721/21 9478/3714/21 +f 9478/3714/21 9470/3721/21 9471/3722/21 +f 9471/3722/4253 9480/3716/4253 9478/3714/4253 +f 9481/3719/4251 9480/3716/4251 9471/3722/4251 +f 9482/3728/4254 9483/3729/4254 10287/3730/4254 +f 10288/3730/4255 10289/3731/4255 9482/3728/4255 +f 9484/3732/4256 10290/3733/4256 10291/3734/4256 +f 10292/3734/4257 10293/3735/4257 9484/3732/4257 +f 10294/3733/4258 9485/3736/4258 10295/3735/4258 +f 10296/3735/4259 10297/3734/4259 10298/3733/4259 +f 9486/3737/4260 9487/3738/4260 10299/3739/4260 +f 10300/3739/4261 10301/3740/4261 9486/3737/4261 +f 10302/3741/4262 9488/3742/4262 10303/3743/4262 +f 10304/3743/4263 10305/3730/4263 10306/3741/4263 +f 10307/3729/4264 10308/3744/4264 10309/3745/4264 +f 10310/3745/4265 10311/3730/4265 10312/3729/4265 +f 9489/3746/4266 10313/3741/4266 10314/3730/4266 +f 10315/3730/4267 10316/3747/4267 9489/3746/4267 +f 10317/3748/4268 10318/3737/4268 10319/3749/4268 +f 10320/3749/4269 10321/3750/4269 10322/3748/4269 +f 10323/3751/4135 10324/3752/4135 10325/3753/4135 +f 10326/3753/4135 10327/3754/4135 10328/3751/4135 +f 10329/3755/7 10330/3756/7 10331/3757/7 +f 10332/3757/7 10333/3758/7 10334/3755/7 +f 10335/3756/274 10336/3759/274 10337/3760/274 +f 10338/3760/274 10339/3757/274 10340/3756/274 +f 10341/3752/331 10342/3751/331 10343/3754/331 +f 10344/3754/4137 10345/3753/4137 10346/3752/4137 +f 9490/3761/4270 9363/3762/4270 9491/3714/4270 +f 9363/3762/4271 9359/3763/4271 9491/3714/4271 +f 9359/3763/4272 9492/3764/4272 9491/3714/4272 +f 9491/3714/4273 9492/3764/4273 9493/3716/4273 +f 9365/3765/4274 9363/3762/4274 10347/3766/4274 +f 9363/3762/4275 9490/3761/4275 10348/3766/4275 +f 10349/3766/4276 9490/3761/4276 10350/3767/4276 +f 9490/3761/4277 9494/3719/4277 10351/3767/4277 +f 9492/3764/360 10352/3767/360 9493/3716/360 +f 9493/3716/105 10353/3767/105 9494/3719/105 +f 9496/3721/4278 9497/3720/4278 9503/3713/4278 +f 9495/3722/4279 9506/3719/4279 9498/3723/4279 +f 9498/3723/4280 9506/3719/4280 9499/3724/4280 +f 9499/3724/4281 9506/3719/4281 9500/3725/4281 +f 9506/3719/4282 9503/3713/4282 9500/3725/4282 +f 9500/3725/4283 9503/3713/4283 9501/3726/4283 +f 9498/3723/4284 9499/3724/4284 9497/3720/4284 +f 9499/3724/4040 9502/3727/4040 9497/3720/4040 +f 9497/3720/4285 9502/3727/4285 9503/3713/4285 +f 9502/3727/4281 9501/3726/4281 9503/3713/4281 +f 9496/3721/105 9503/3713/105 9504/3714/105 +f 9496/3721/105 9504/3714/105 9495/3722/105 +f 9505/3716/4286 9495/3722/4286 9504/3714/4286 +f 9505/3716/4281 9506/3719/4281 9495/3722/4281 +f 10354/3768/4287 10355/3769/4287 10356/3770/4287 +f 10357/3634/4288 10358/3770/4288 10359/3769/4288 +f 9483/3729/4289 9482/3728/4289 10360/3771/4289 +f 10361/3772/4290 10362/3771/4290 9482/3728/4290 +f 10363/3733/4291 9484/3732/4291 10364/3773/4291 +f 10365/3774/4292 10366/3773/4292 9484/3732/4292 +f 9485/3736/4293 10367/3733/4293 10368/3774/4293 +f 10369/3773/4294 10370/3774/4294 10371/3733/4294 +f 9487/3738/4295 9486/3737/4295 10372/3775/4295 +f 10373/3776/4295 10374/3775/4295 9486/3737/4295 +f 9488/3742/4296 10375/3741/4296 10376/3777/4296 +f 10377/3771/4297 10378/3777/4297 10379/3741/4297 +f 10380/3744/4298 10381/3729/4298 10382/3778/4298 +f 10383/3771/4299 10384/3778/4299 10385/3729/4299 +f 10386/3741/4300 9489/3746/4300 10387/3771/4300 +f 10388/3779/4301 10389/3771/4301 9489/3746/4301 +f 10390/3737/4302 10391/3748/4302 10392/3780/4302 +f 10393/3781/4303 10394/3780/4303 10395/3748/4303 +f 10396/3782/4135 10397/3783/4135 10398/3784/4135 +f 10399/3785/4304 10400/3784/4304 10401/3783/4304 +f 10402/3786/7 10403/3787/7 10404/3788/7 +f 10405/3789/7 10406/3788/7 10407/3787/7 +f 10408/3790/4305 10409/3786/4305 10410/3791/4305 +f 10411/3788/311 10412/3791/311 10413/3786/311 +f 10414/3783/331 10415/3782/331 10416/3792/331 +f 10417/3784/331 10418/3792/331 10419/3782/331 +f 10420/3606/4306 10421/3634/4306 10422/3769/4306 +f 10423/3769/4307 10424/3603/4307 10425/3606/4307 +f 9508/3793/21 9507/3794/21 9509/3795/21 +f 9509/3795/21 9510/3796/21 9508/3793/21 +f 10426/3797/243 10427/3798/243 10428/3799/243 +f 10429/3799/243 10430/3800/243 10431/3797/243 +o diesent1 +v 0.333828 0.798069 0.757057 +v 0.866927 0.798069 0.757057 +v 0.333828 0.798069 0.482212 +v 0.866927 0.798069 0.482212 +v 0.333828 0.093855 0.757057 +v 0.866927 0.093855 0.757057 +v 0.333828 0.093855 0.482212 +v 0.866927 0.093855 0.482212 +v 0.866927 0.798069 0.757057 +v 0.866927 0.093855 0.757057 +v 0.866927 0.093855 0.757057 +vt 0.424239 0.775438 +vt 0.575761 0.775438 +vt 0.075761 0.775438 +vt -0.075761 0.775438 +vt -0.075761 0.224562 +vt 0.575761 0.224562 +vt 0.075761 0.224562 +vt 0.424239 0.224562 +vt 0.924239 0.775438 +vt 0.924239 0.224562 +s off +f 10434/3801/331 10432/3802/331 10435/3803/331 +f 10432/3802/331 10433/3804/331 10435/3803/331 +f 10437/3805/3 10436/3806/3 10439/3807/3 +f 10438/3808/3 10439/3807/3 10436/3806/3 +f 10440/3809/21 10432/3802/21 10441/3810/21 +f 10432/3802/21 10436/3806/21 10442/3810/21 +f 10435/3803/63 10433/3804/63 10439/3807/63 +f 10437/3805/63 10439/3807/63 10433/3804/63 +f 10434/3801/105 10435/3803/105 10438/3808/105 +f 10439/3807/105 10438/3808/105 10435/3803/105 +f 10432/3802/7 10434/3801/7 10436/3806/7 +f 10438/3808/7 10436/3806/7 10434/3801/7 +o diespump +v 1.183788 0.526257 2.556130 +v 1.183788 0.541556 2.556130 +v 1.197042 0.549206 2.556130 +v 1.210296 0.541529 2.556130 +v 1.210296 0.526257 2.556130 +v 1.197051 0.518613 2.556130 +v 1.260328 0.135139 2.973181 +v 1.065098 0.135139 2.973180 +v 1.260328 0.135139 2.556130 +v 1.065099 0.135139 2.556130 +v 1.260328 0.393582 2.954599 +v 1.260328 0.393583 2.574712 +v 1.260328 0.384988 2.574579 +v 1.260328 0.384988 2.758081 +v 1.260328 0.144767 2.758081 +v 1.260328 0.384988 2.771100 +v 1.260328 0.384988 2.954602 +v 1.260328 0.144767 2.771100 +v 1.260328 0.690886 2.574712 +v 1.260328 0.702328 2.556130 +v 1.260328 0.702327 2.973181 +v 1.260328 0.690886 2.954600 +v 1.260328 0.331349 2.565462 +v 1.260328 0.201994 2.574576 +v 1.260328 0.331349 2.574541 +v 1.260328 0.201994 2.565498 +v 1.260328 0.360397 2.574541 +v 1.260328 0.360397 2.565461 +v 1.260328 0.172946 2.574576 +v 1.260328 0.172946 2.565497 +v 1.260328 0.144767 2.574579 +v 1.260328 0.360396 2.954621 +v 1.260328 0.360396 2.963701 +v 1.260328 0.144767 2.954602 +v 1.260328 0.331348 2.963701 +v 1.260328 0.407143 2.592039 +v 1.260328 0.407143 2.937272 +v 1.260328 0.677326 2.592039 +v 1.260328 0.677325 2.937273 +v 1.299571 0.291820 2.733095 +v 1.299571 0.294369 2.731623 +v 1.299571 0.289270 2.731623 +v 1.299571 0.294369 2.728679 +v 1.299571 0.289270 2.728679 +v 1.299571 0.291820 2.727207 +v 1.299571 0.291820 2.800351 +v 1.299571 0.294369 2.798878 +v 1.299571 0.289270 2.798878 +v 1.299571 0.294369 2.795934 +v 1.299571 0.289270 2.795934 +v 1.299571 0.291820 2.794462 +v 1.260328 0.331348 2.954622 +v 1.260328 0.201993 2.963623 +v 1.260328 0.172945 2.963623 +v 1.275802 0.201993 2.954545 +v 1.275802 0.172945 2.954545 +v 1.275802 0.172945 2.963623 +v 1.275802 0.201993 2.963623 +v 1.260328 0.172945 2.954545 +v 1.260328 0.201993 2.954545 +v 1.275802 0.360396 2.954621 +v 1.275802 0.331348 2.954621 +v 1.275802 0.331348 2.963701 +v 1.275802 0.360396 2.963701 +v 1.275802 0.201994 2.574576 +v 1.275802 0.201994 2.565498 +v 1.275802 0.172946 2.574576 +v 1.275802 0.172946 2.565498 +v 1.275802 0.360397 2.565461 +v 1.275802 0.331349 2.565462 +v 1.275802 0.360397 2.574541 +v 1.275802 0.331349 2.574541 +v 1.292898 0.407143 2.592039 +v 1.292898 0.393583 2.574712 +v 1.292898 0.407143 2.937272 +v 1.292898 0.393582 2.954599 +v 1.292898 0.690886 2.574712 +v 1.292898 0.677326 2.592039 +v 1.292898 0.690886 2.954600 +v 1.292898 0.677325 2.937272 +v 1.292898 0.294369 2.728679 +v 1.292898 0.291820 2.727207 +v 1.292898 0.289270 2.728679 +v 1.292898 0.144767 2.574579 +v 1.292898 0.144767 2.758081 +v 1.292898 0.289270 2.731623 +v 1.292898 0.291820 2.733095 +v 1.292898 0.384988 2.758082 +v 1.292898 0.294369 2.731623 +v 1.292898 0.384988 2.574579 +v 1.292898 0.294369 2.795934 +v 1.292898 0.384988 2.771100 +v 1.292898 0.291820 2.794462 +v 1.292898 0.144767 2.771100 +v 1.292898 0.289270 2.795934 +v 1.292898 0.144767 2.954602 +v 1.292898 0.289270 2.798878 +v 1.292898 0.291820 2.800351 +v 1.292898 0.294369 2.798878 +v 1.292898 0.384988 2.954602 +v 1.065099 0.702327 2.973181 +v 1.065099 0.702328 2.556130 +v 1.183788 0.526257 3.316362 +v 1.183788 0.541556 3.316362 +v 1.197042 0.549205 3.316362 +v 1.210296 0.541529 3.316362 +v 1.210296 0.526257 3.316362 +v 1.197051 0.518612 3.316362 +v 1.260328 0.135138 3.733413 +v 1.065099 0.135138 3.733413 +v 1.260328 0.135138 3.316362 +v 1.065098 0.135138 3.316362 +v 1.260328 0.393582 3.714832 +v 1.260328 0.393582 3.334944 +v 1.260328 0.384987 3.334811 +v 1.260328 0.384987 3.518314 +v 1.260328 0.144766 3.518314 +v 1.260328 0.384987 3.531332 +v 1.260328 0.384987 3.714834 +v 1.260328 0.144766 3.531332 +v 1.260328 0.690885 3.334944 +v 1.260328 0.702327 3.316362 +v 1.260328 0.702327 3.733414 +v 1.260328 0.690885 3.714832 +v 1.260328 0.331348 3.325694 +v 1.260328 0.201993 3.334808 +v 1.260328 0.331348 3.334773 +v 1.260328 0.201993 3.325729 +v 1.260328 0.360396 3.334773 +v 1.260328 0.360396 3.325694 +v 1.260328 0.172945 3.334808 +v 1.260328 0.172945 3.325729 +v 1.260328 0.144766 3.334811 +v 1.260328 0.360395 3.714854 +v 1.260328 0.360395 3.723933 +v 1.260328 0.144766 3.714834 +v 1.260328 0.331348 3.723933 +v 1.260328 0.407143 3.352271 +v 1.260328 0.407142 3.697504 +v 1.260328 0.677325 3.352272 +v 1.260328 0.677324 3.697504 +v 1.299571 0.291819 3.493328 +v 1.299571 0.294369 3.491856 +v 1.299571 0.289269 3.491856 +v 1.299571 0.294369 3.488912 +v 1.299571 0.289269 3.488911 +v 1.299571 0.291819 3.487439 +v 1.299571 0.291819 3.560583 +v 1.299571 0.294369 3.559111 +v 1.299571 0.289269 3.559111 +v 1.299571 0.294369 3.556166 +v 1.299571 0.289269 3.556167 +v 1.299571 0.291819 3.554694 +v 1.260328 0.331348 3.714854 +v 1.260328 0.201992 3.723855 +v 1.260328 0.172945 3.723855 +v 1.275802 0.201992 3.714778 +v 1.275802 0.172945 3.714777 +v 1.275802 0.172945 3.723855 +v 1.275802 0.201992 3.723855 +v 1.260328 0.172945 3.714777 +v 1.260328 0.201992 3.714777 +v 1.275802 0.360395 3.714854 +v 1.275802 0.331348 3.714854 +v 1.275802 0.331348 3.723933 +v 1.275802 0.360395 3.723933 +v 1.275802 0.201993 3.334808 +v 1.275802 0.201993 3.325729 +v 1.275802 0.172945 3.334808 +v 1.275802 0.172945 3.325729 +v 1.275802 0.360396 3.325694 +v 1.275802 0.331348 3.325694 +v 1.275802 0.360396 3.334773 +v 1.275802 0.331348 3.334773 +v 1.292898 0.407143 3.352271 +v 1.292898 0.393582 3.334944 +v 1.292898 0.407142 3.697504 +v 1.292898 0.393582 3.714831 +v 1.292898 0.690885 3.334944 +v 1.292898 0.677325 3.352272 +v 1.292898 0.690885 3.714832 +v 1.292898 0.677324 3.697504 +v 1.292898 0.294369 3.488911 +v 1.292898 0.291819 3.487439 +v 1.292898 0.289269 3.488911 +v 1.292898 0.144766 3.334811 +v 1.292898 0.144766 3.518314 +v 1.292898 0.289269 3.491856 +v 1.292898 0.291819 3.493328 +v 1.292898 0.384987 3.518314 +v 1.292898 0.294369 3.491856 +v 1.292898 0.384987 3.334811 +v 1.292898 0.294368 3.556166 +v 1.292898 0.384987 3.531332 +v 1.292898 0.291819 3.554694 +v 1.292898 0.144766 3.531332 +v 1.292898 0.289269 3.556167 +v 1.292898 0.144766 3.714834 +v 1.292898 0.289269 3.559111 +v 1.292898 0.291819 3.560582 +v 1.292898 0.294368 3.559111 +v 1.292898 0.384987 3.714834 +v 1.065099 0.702327 3.733414 +v 1.065099 0.702327 3.316362 +vn 1.000000 0.000010 -0.000026 +vn 1.000000 0.000008 -0.000198 +vn 1.000000 -0.000000 -0.000025 +vn 1.000000 -0.000007 0.000004 +vn -0.000000 -0.000271 -1.000000 +vn 0.000005 1.000000 -0.000005 +vn 0.000000 0.001551 -0.999999 +vn -0.000001 -1.000000 0.000013 +vn 0.000015 -0.000102 -1.000000 +vn 0.000000 0.000785 1.000000 +vn -0.000000 -0.000008 -1.000000 +vn 0.000000 0.000016 -1.000000 +vn 0.000031 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000010 +vn 0.000015 -0.000008 1.000000 +vn -0.000001 -1.000000 -0.000002 +vn 0.000000 0.002039 0.999998 +vn -0.000000 -0.000593 1.000000 +vn 0.000015 -0.000592 1.000000 +vn -0.003361 0.000000 0.999994 +vn 0.001130 -0.000000 0.999999 +vn 0.000140 -0.000008 -1.000000 +vn 0.002217 0.000000 -0.999998 +vn -0.000001 -1.000000 -0.000001 +vn -0.000007 -0.000001 1.000000 +vn -0.000002 1.000000 0.000001 +vn 0.000007 -0.000002 1.000000 +vn -0.000022 0.000003 -1.000000 +vn -0.000007 0.000001 -1.000000 +vn -0.000740 -0.000271 -1.000000 +vn -0.000000 -0.000093 -1.000000 +vn 0.002230 0.000001 -0.999998 +vn 0.000003 1.000000 0.000000 +vn -0.005341 -0.000592 0.999986 +vn 0.001126 0.000001 0.999999 +vn 0.000000 -0.499980 0.866037 +vn 0.000000 1.000000 0.000020 +vn 0.000004 0.499928 -0.866067 +vn 0.000000 0.499937 -0.866062 +vn -0.000000 -0.499924 -0.866069 +vn 0.000000 0.500106 0.865964 +vn -0.000004 0.500097 0.865969 +vn 0.000000 -0.500106 0.865964 +vn 0.000009 -1.000000 0.000000 +vn 0.000000 -1.000000 -0.000020 +vn -0.000004 0.499924 -0.866069 +vn 0.000004 -0.499985 -0.866034 +vn -0.000015 -0.000002 1.000000 +vn -1.000000 0.000000 -0.000001 +vn -0.000002 0.000001 -1.000000 +vn 0.000016 -0.000004 -1.000000 +vn -0.000004 0.000000 -1.000000 +vn -0.000002 0.000004 -1.000000 +vn 0.000007 0.000001 -1.000000 +vn 0.000001 0.000003 -1.000000 +vn -0.000017 -0.000002 -1.000000 +vn 1.000000 0.000000 -0.000001 +vn 1.000000 0.000030 -0.000001 +vn 1.000000 -0.000001 0.000002 +vn 1.000000 -0.000000 0.000010 +vn 1.000000 0.000001 -0.000001 +vn 1.000000 0.000025 0.000000 +vn 1.000000 -0.000003 -0.000001 +vn 1.000000 -0.000000 0.000026 +vn -0.000000 -1.000000 -0.000003 +vn -0.000000 -0.000269 -1.000000 +vn -0.000006 1.000000 0.000010 +vn -0.000000 -0.000118 -1.000000 +vn 0.000000 0.000805 1.000000 +vn 0.000000 0.000008 -1.000000 +vn 0.000000 -0.000008 1.000000 +vn -0.000015 -0.000016 1.000000 +vn -0.000001 -1.000000 0.000005 +vn -0.000005 -1.000000 -0.000002 +vn 0.000006 1.000000 -0.000007 +vn -0.000046 -0.000592 1.000000 +vn 0.000000 -0.000586 1.000000 +vn -0.003360 -0.000025 0.999994 +vn 0.001181 -0.000016 0.999999 +vn 0.000209 0.000000 -1.000000 +vn 0.002335 0.000008 -0.999997 +vn 0.000002 -1.000000 -0.000001 +vn 0.000007 -0.000001 1.000000 +vn -0.000015 0.000002 -1.000000 +vn -0.000692 -0.000269 -1.000000 +vn 0.000007 -0.000122 -1.000000 +vn -0.000002 -1.000000 -0.000002 +vn 0.002231 0.000000 -0.999997 +vn 0.000022 0.002027 0.999998 +vn -0.005239 -0.000586 0.999986 +vn 0.001136 -0.000002 0.999999 +vn -0.000001 1.000000 0.000001 +vn 0.000000 0.499993 0.866029 +vn 0.000004 -0.499976 0.866039 +vn 0.000000 -0.499984 0.866034 +vn 0.000013 -1.000000 0.000000 +vn 0.000009 -1.000000 -0.000010 +vn 0.000031 0.499998 -0.866027 +vn 0.000000 0.500058 -0.865992 +vn -0.000000 -0.499971 -0.866042 +vn 0.000007 -0.499984 -0.866034 +vn -0.000062 0.499876 0.866097 +vn -0.000004 0.499989 0.866032 +vn 0.000000 -0.499924 0.866069 +vn -0.000062 -0.500045 0.865999 +vn -0.000013 1.000000 0.000010 +vn -0.000007 0.499998 -0.866027 +vn 0.000000 0.499984 -0.866034 +vn -0.000000 -0.500045 -0.865999 +vn 0.000004 -0.500054 -0.865994 +vn 0.000007 0.000001 1.000000 +vn -1.000000 -0.000000 0.000001 +vn 0.000021 0.000016 -1.000000 +vn -0.000003 0.000001 -1.000000 +vn 0.000117 0.000016 -1.000000 +s off +f 10454//63 10453//63 10455//63 +f 10456//63 10455//63 10453//63 +f 10458//63 10457//63 10456//63 +f 10458//63 10456//63 10453//63 +f 10459//63 10458//63 10453//63 +f 10457//63 10458//63 10460//63 +f 10461//63 10454//63 10462//63 +f 10461//63 10462//63 10463//63 +f 10464//63 10461//63 10463//63 +f 10464//63 10463//63 10449//63 +f 10466//63 10465//63 10467//63 +f 10465//63 10466//63 10468//63 +f 10455//4308 10469//4308 10470//4308 +f 10472//2573 10471//2573 10473//2573 +f 10475//63 10474//63 10459//63 +f 10475//63 10459//63 10453//63 +f 10454//63 10455//63 10470//63 +f 10462//63 10454//63 10470//63 +f 10451//63 10462//63 10470//63 +f 10451//4309 10470//4309 10465//4309 +f 10451//4310 10465//4310 10468//4310 +f 10451//4310 10468//4310 10472//4310 +f 10451//4311 10472//4311 10473//4311 +f 10449//63 10451//63 10473//63 +f 10449//63 10473//63 10457//63 +f 10449//63 10457//63 10460//63 +f 10449//63 10460//63 10476//63 +f 10475//63 10453//63 10464//63 +f 10475//63 10464//63 10449//63 +f 10475//63 10449//63 10477//63 +f 10483//63 10482//63 10484//63 +f 10485//63 10483//63 10484//63 +f 10485//63 10484//63 10486//63 +f 10487//63 10485//63 10486//63 +f 10489//63 10488//63 10490//63 +f 10491//63 10489//63 10490//63 +f 10491//63 10490//63 10492//63 +f 10493//63 10491//63 10492//63 +f 10494//63 10477//63 10495//63 +f 10477//63 10449//63 10495//63 +f 10496//63 10495//63 10449//63 +f 10449//63 10476//63 10496//63 +f 10498//63 10497//63 10499//63 +f 10499//63 10497//63 10500//63 +f 10476//63 10501//63 10496//63 +f 10502//63 10494//63 10495//63 +f 10504//63 10503//63 10505//63 +f 10505//63 10503//63 10506//63 +f 10508//63 10507//63 10509//63 +f 10509//63 10510//63 10508//63 +f 10512//63 10511//63 10513//63 +f 10514//63 10512//63 10513//63 +f 10516//63 10515//63 10517//63 +f 10517//63 10518//63 10516//63 +f 10516//63 10519//63 10520//63 +f 10520//63 10515//63 10516//63 +f 10519//63 10521//63 10522//63 +f 10522//63 10520//63 10519//63 +f 10522//63 10521//63 10518//63 +f 10518//63 10517//63 10522//63 +f 10526//63 10523//63 10524//63 +f 10526//63 10524//63 10525//63 +f 10526//63 10525//63 10527//63 +f 10527//63 10525//63 10528//63 +f 10528//63 10529//63 10527//63 +f 10529//63 10530//63 10527//63 +f 10531//63 10530//63 10529//63 +f 10523//63 10530//63 10531//63 +f 10523//63 10526//63 10532//63 +f 10532//63 10530//63 10523//63 +f 10534//63 10533//63 10535//63 +f 10535//63 10536//63 10534//63 +f 10535//63 10537//63 10536//63 +f 10537//63 10538//63 10536//63 +f 10537//63 10539//63 10538//63 +f 10539//63 10540//63 10538//63 +f 10540//63 10542//63 10538//63 +f 10541//63 10542//63 10540//63 +f 10541//63 10534//63 10542//63 +f 10533//63 10534//63 10541//63 +f 10544//243 10543//243 10463//243 +f 10463//243 10462//243 10544//243 +f 10543//4065 10450//4065 10449//4065 +f 10449//365 10463//365 10543//365 +f 10467//3 10465//3 10512//3 +f 10512//3 10514//3 10467//3 +f 10466//4312 10467//4312 10514//4312 +f 10514//4312 10507//4312 10466//4312 +f 10468//934 10466//934 10507//934 +f 10507//4313 10508//4313 10468//4313 +f 10455//4314 10513//4314 10469//4314 +f 10470//331 10469//331 10513//331 +f 10513//331 10511//331 10470//331 +f 10471//4315 10472//4315 10510//4315 +f 10510//4315 10509//4315 10471//4315 +f 10473//4316 10471//4316 10509//4316 +f 10474//2216 10475//2216 10506//2216 +f 10506//2216 10503//2216 10474//2216 +f 10459//4317 10474//4317 10503//4317 +f 10465//4318 10470//4318 10511//4318 +f 10511//4318 10512//4318 10465//4318 +f 10472//4319 10468//4319 10508//4319 +f 10508//4320 10510//4320 10472//4320 +f 10475//21 10477//21 10505//21 +f 10505//21 10506//21 10475//21 +f 10477//2207 10494//2207 10504//2207 +f 10504//4321 10505//4321 10477//4321 +f 10495//4322 10496//4322 10499//4322 +f 10499//4147 10500//4147 10495//4147 +f 10496//4323 10501//4323 10498//4323 +f 10498//4323 10499//4323 10496//4323 +f 10502//934 10495//934 10500//934 +f 10500//934 10497//934 10502//934 +f 10476//4324 10498//4324 10501//4324 +f 10494//4325 10502//4325 10497//4325 +f 10497//4326 10504//4326 10494//4326 +f 10497//4327 10498//4327 10538//4327 +f 10503//4328 10504//4328 10542//4328 +f 10509//4329 10507//4329 10526//4329 +f 10514//4330 10513//4330 10526//4330 +f 10478//243 10479//243 10517//243 +f 10517//243 10515//243 10478//243 +f 10453//4331 10454//4331 10516//4331 +f 10516//4331 10518//4331 10453//4331 +f 10454//356 10461//356 10519//356 +f 10519//356 10516//356 10454//356 +f 10480//21 10478//21 10515//21 +f 10515//4332 10520//4332 10480//4332 +f 10461//4333 10464//4333 10521//4333 +f 10521//243 10519//243 10461//243 +f 10481//252 10480//252 10520//252 +f 10520//251 10522//251 10481//251 +f 10464//4334 10453//4334 10518//4334 +f 10518//357 10521//357 10464//357 +f 10479//4335 10481//4335 10522//4335 +f 10522//4336 10517//4336 10479//4336 +f 10507//4337 10514//4337 10526//4337 +f 10473//4338 10509//4338 10526//4338 +f 10457//252 10473//252 10526//252 +f 10526//252 10527//252 10457//252 +f 10513//4314 10455//4314 10532//4314 +f 10532//4339 10526//4339 10513//4339 +f 10455//243 10456//243 10530//243 +f 10530//4340 10532//4340 10455//4340 +f 10476//252 10460//252 10536//252 +f 10536//251 10538//251 10476//251 +f 10498//4324 10476//4324 10538//4324 +f 10504//4341 10497//4341 10538//4341 +f 10538//4342 10542//4342 10504//4342 +f 10459//4317 10503//4317 10542//4317 +f 10458//243 10459//243 10542//243 +f 10542//243 10534//243 10458//243 +f 10531//59 10529//59 10482//59 +f 10482//59 10483//59 10531//59 +f 10529//4343 10528//4343 10484//4343 +f 10484//4343 10482//4343 10529//4343 +f 10523//4344 10531//4344 10483//4344 +f 10483//2975 10485//2975 10523//2975 +f 10528//4321 10525//4321 10486//4321 +f 10486//4321 10484//4321 10528//4321 +f 10524//4345 10523//4345 10485//4345 +f 10485//4346 10487//4346 10524//4346 +f 10525//4347 10524//4347 10487//4347 +f 10487//4347 10486//4347 10525//4347 +f 10541//4348 10540//4348 10488//4348 +f 10488//4349 10489//4349 10541//4349 +f 10540//4350 10539//4350 10490//4350 +f 10490//4350 10488//4350 10540//4350 +f 10533//2748 10541//2748 10489//2748 +f 10489//2748 10491//2748 10533//2748 +f 10539//4351 10537//4351 10492//4351 +f 10492//4352 10490//4352 10539//4352 +f 10535//4353 10533//4353 10491//4353 +f 10491//4353 10493//4353 10535//4353 +f 10537//4354 10535//4354 10493//4354 +f 10493//4354 10492//4354 10537//4354 +f 10527//4355 10530//4355 10456//4355 +f 10456//21 10457//21 10527//21 +f 10534//105 10536//105 10460//105 +f 10460//105 10458//105 10534//105 +f 10543//7 10544//7 10452//7 +f 10450//4356 10543//4356 10452//4356 +f 10443//4357 10452//4357 10544//4357 +f 10443//4358 10448//4358 10452//4358 +f 10443//4359 10544//4359 10444//4359 +f 10544//4012 10462//4012 10444//4012 +f 10462//4360 10445//4360 10444//4360 +f 10462//4361 10451//4361 10446//4361 +f 10445//4362 10462//4362 10446//4362 +f 10446//105 10451//105 10447//105 +f 10452//354 10448//354 10451//354 +f 10451//4363 10448//4363 10447//4363 +f 10556//4364 10555//4364 10557//4364 +f 10558//4365 10557//4365 10555//4365 +f 10560//274 10559//274 10558//274 +f 10560//63 10558//63 10555//63 +f 10561//63 10560//63 10555//63 +f 10559//274 10560//274 10562//274 +f 10563//274 10556//274 10564//274 +f 10563//63 10564//63 10565//63 +f 10566//63 10563//63 10565//63 +f 10566//63 10565//63 10551//63 +f 10568//63 10567//63 10569//63 +f 10567//63 10568//63 10570//63 +f 10557//63 10571//63 10572//63 +f 10574//63 10573//63 10575//63 +f 10577//63 10576//63 10561//63 +f 10577//63 10561//63 10555//63 +f 10556//63 10557//63 10572//63 +f 10564//4366 10556//4366 10572//4366 +f 10553//4367 10564//4367 10572//4367 +f 10553//63 10572//63 10567//63 +f 10553//63 10567//63 10570//63 +f 10553//63 10570//63 10574//63 +f 10553//63 10574//63 10575//63 +f 10551//4368 10553//4368 10575//4368 +f 10551//4369 10575//4369 10559//4369 +f 10551//4369 10559//4369 10562//4369 +f 10551//4370 10562//4370 10578//4370 +f 10577//63 10555//63 10566//63 +f 10577//63 10566//63 10551//63 +f 10577//63 10551//63 10579//63 +f 10585//63 10584//63 10586//63 +f 10587//63 10585//63 10586//63 +f 10587//63 10586//63 10588//63 +f 10589//63 10587//63 10588//63 +f 10591//63 10590//63 10592//63 +f 10593//63 10591//63 10592//63 +f 10593//63 10592//63 10594//63 +f 10595//63 10593//63 10594//63 +f 10596//63 10579//63 10597//63 +f 10579//63 10551//63 10597//63 +f 10598//63 10597//63 10551//63 +f 10551//63 10578//63 10598//63 +f 10600//4371 10599//4371 10601//4371 +f 10601//4371 10599//4371 10602//4371 +f 10578//63 10603//63 10598//63 +f 10604//63 10596//63 10597//63 +f 10606//4371 10605//4371 10607//4371 +f 10607//4371 10605//4371 10608//4371 +f 10610//63 10609//63 10611//63 +f 10611//63 10612//63 10610//63 +f 10614//63 10613//63 10615//63 +f 10616//63 10614//63 10615//63 +f 10618//63 10617//63 10619//63 +f 10619//63 10620//63 10618//63 +f 10618//63 10621//63 10622//63 +f 10622//63 10617//63 10618//63 +f 10621//63 10623//63 10624//63 +f 10624//63 10622//63 10621//63 +f 10624//63 10623//63 10620//63 +f 10620//63 10619//63 10624//63 +f 10628//63 10625//63 10626//63 +f 10628//63 10626//63 10627//63 +f 10628//63 10627//63 10629//63 +f 10629//63 10627//63 10630//63 +f 10630//63 10631//63 10629//63 +f 10631//63 10632//63 10629//63 +f 10633//63 10632//63 10631//63 +f 10625//63 10632//63 10633//63 +f 10625//63 10628//63 10634//63 +f 10634//63 10632//63 10625//63 +f 10636//63 10635//63 10637//63 +f 10637//63 10638//63 10636//63 +f 10637//63 10639//63 10638//63 +f 10639//63 10640//63 10638//63 +f 10639//63 10641//63 10640//63 +f 10641//63 10642//63 10640//63 +f 10642//63 10644//63 10640//63 +f 10643//63 10644//63 10642//63 +f 10643//63 10636//63 10644//63 +f 10635//63 10636//63 10643//63 +f 10646//243 10645//243 10565//243 +f 10565//243 10564//243 10646//243 +f 10645//4065 10552//4065 10551//4065 +f 10551//2228 10565//2228 10645//2228 +f 10569//4372 10567//4372 10614//4372 +f 10614//4372 10616//4372 10569//4372 +f 10568//4373 10569//4373 10616//4373 +f 10616//4373 10609//4373 10568//4373 +f 10570//2817 10568//2817 10609//2817 +f 10609//2817 10610//2817 10570//2817 +f 10557//4314 10615//4314 10571//4314 +f 10572//4374 10571//4374 10615//4374 +f 10615//331 10613//331 10572//331 +f 10573//4323 10574//4323 10612//4323 +f 10612//4323 10611//4323 10573//4323 +f 10575//4375 10573//4375 10611//4375 +f 10576//331 10577//331 10608//331 +f 10608//331 10605//331 10576//331 +f 10561//4376 10576//4376 10605//4376 +f 10567//4377 10572//4377 10613//4377 +f 10613//4377 10614//4377 10567//4377 +f 10574//105 10570//105 10610//105 +f 10610//105 10612//105 10574//105 +f 10577//4378 10579//4378 10607//4378 +f 10607//4379 10608//4379 10577//4379 +f 10579//2902 10596//2902 10606//2902 +f 10606//326 10607//326 10579//326 +f 10597//4378 10598//4378 10601//4378 +f 10601//4378 10602//4378 10597//4378 +f 10598//4380 10603//4380 10600//4380 +f 10600//4381 10601//4381 10598//4381 +f 10604//4382 10597//4382 10602//4382 +f 10602//934 10599//934 10604//934 +f 10578//4324 10600//4324 10603//4324 +f 10596//4383 10604//4383 10599//4383 +f 10599//4384 10606//4384 10596//4384 +f 10599//4385 10600//4385 10640//4385 +f 10605//4386 10606//4386 10644//4386 +f 10611//4387 10609//4387 10628//4387 +f 10616//4388 10615//4388 10628//4388 +f 10580//942 10581//942 10619//942 +f 10619//935 10617//935 10580//935 +f 10555//4331 10556//4331 10618//4331 +f 10618//4331 10620//4331 10555//4331 +f 10556//353 10563//353 10621//353 +f 10621//353 10618//353 10556//353 +f 10582//357 10580//357 10617//357 +f 10617//357 10622//357 10582//357 +f 10563//243 10566//243 10623//243 +f 10623//243 10621//243 10563//243 +f 10583//4389 10582//4389 10622//4389 +f 10622//252 10624//252 10583//252 +f 10566//4390 10555//4390 10620//4390 +f 10620//357 10623//357 10566//357 +f 10581//105 10583//105 10624//105 +f 10624//4391 10619//4391 10581//4391 +f 10609//4392 10616//4392 10628//4392 +f 10575//4393 10611//4393 10628//4393 +f 10559//4394 10575//4394 10628//4394 +f 10628//252 10629//252 10559//252 +f 10615//4314 10557//4314 10634//4314 +f 10634//4395 10628//4395 10615//4395 +f 10557//935 10558//935 10632//935 +f 10632//942 10634//942 10557//942 +f 10578//3 10562//3 10638//3 +f 10638//3 10640//3 10578//3 +f 10600//4396 10578//4396 10640//4396 +f 10606//4397 10599//4397 10640//4397 +f 10640//4398 10644//4398 10606//4398 +f 10561//4376 10605//4376 10644//4376 +f 10560//4399 10561//4399 10644//4399 +f 10644//243 10636//243 10560//243 +f 10633//4400 10631//4400 10584//4400 +f 10584//4400 10585//4400 10633//4400 +f 10631//4401 10630//4401 10586//4401 +f 10586//4402 10584//4402 10631//4402 +f 10625//331 10633//331 10585//331 +f 10585//331 10587//331 10625//331 +f 10630//4403 10627//4403 10588//4403 +f 10588//4404 10586//4404 10630//4404 +f 10626//4405 10625//4405 10587//4405 +f 10587//4406 10589//4406 10626//4406 +f 10627//4407 10626//4407 10589//4407 +f 10589//4408 10588//4408 10627//4408 +f 10643//4409 10642//4409 10590//4409 +f 10590//4410 10591//4410 10643//4410 +f 10642//4411 10641//4411 10592//4411 +f 10592//4412 10590//4412 10642//4412 +f 10635//2748 10643//2748 10591//2748 +f 10591//4413 10593//4413 10635//4413 +f 10641//4351 10639//4351 10594//4351 +f 10594//4352 10592//4352 10641//4352 +f 10637//4414 10635//4414 10593//4414 +f 10593//4415 10595//4415 10637//4415 +f 10639//4416 10637//4416 10595//4416 +f 10595//4417 10594//4417 10639//4417 +f 10629//4418 10632//4418 10558//4418 +f 10558//21 10559//21 10629//21 +f 10636//2750 10638//2750 10562//2750 +f 10562//353 10560//353 10636//353 +f 10645//7 10646//7 10554//7 +f 10552//4419 10645//4419 10554//4419 +f 10554//360 10646//360 10545//360 +f 10550//356 10554//356 10545//356 +f 10646//4420 10546//4420 10545//4420 +f 10646//105 10564//105 10546//105 +f 10564//105 10547//105 10546//105 +f 10564//4421 10553//4421 10548//4421 +f 10547//105 10564//105 10548//105 +f 10548//4422 10553//4422 10549//4422 +f 10554//356 10550//356 10553//356 +f 10553//356 10550//356 10549//356 +o diestube +v 0.024503 2.034427 -3.269937 +v 0.029510 2.030835 -3.270235 +v 0.035484 2.029452 -3.270625 +v 0.041514 2.030488 -3.271049 +v 0.046684 2.033785 -3.271441 +v 0.050204 2.038842 -3.271742 +v 0.047210 2.056257 -3.271747 +v 0.042203 2.059849 -3.271449 +v 0.036229 2.061232 -3.271059 +v 0.030199 2.060196 -3.270635 +v 0.025030 2.056899 -3.270242 +v 0.021509 2.051841 -3.269941 +v 0.010635 2.044261 -3.269347 +v 0.012470 2.055936 -3.269375 +v 0.018209 2.064179 -3.269865 +v 0.026635 2.069554 -3.270504 +v 0.036464 2.071243 -3.271195 +v 0.046201 2.068988 -3.271832 +v 0.054364 2.063133 -3.272317 +v 0.059993 2.052969 -3.272829 +v 0.061422 2.044602 -3.272576 +v 0.059244 2.034747 -3.272309 +v 0.053505 2.026505 -3.271819 +v 0.045079 2.021130 -3.271179 +v 0.035249 2.019442 -3.270489 +v 0.025512 2.021696 -3.269852 +v 0.017704 2.029020 -3.280683 +v 0.359737 0.196687 -3.268408 +v 0.361765 0.197644 -3.268652 +v 0.014096 2.055922 -3.286190 +v 0.060747 2.036602 -3.283722 +v 0.361517 0.197001 -3.268580 +v 0.363545 0.197958 -3.268824 +v 0.055538 2.063230 -3.283653 +v 0.024060 2.040180 -3.297788 +v 0.027339 2.034927 -3.297948 +v 0.013432 2.044793 -3.297039 +v 0.023008 2.046296 -3.297789 +v 0.020185 2.028051 -3.297377 +v 0.015306 2.056437 -3.297386 +v 0.024345 2.052341 -3.297954 +v 0.028348 2.022196 -3.297864 +v 0.032346 2.031335 -3.298247 +v 0.021045 2.064679 -3.297877 +v 0.027865 2.057399 -3.298254 +v 0.029471 2.070054 -3.298516 +v 0.033035 2.060696 -3.298646 +v 0.039300 2.071742 -3.299207 +v 0.039065 2.061731 -3.299070 +v 0.049037 2.069487 -3.299844 +v 0.045039 2.060348 -3.299461 +v 0.038085 2.019942 -3.298501 +v 0.038320 2.029952 -3.298637 +v 0.047914 2.021630 -3.299191 +v 0.044350 2.030988 -3.299061 +v 0.056341 2.027005 -3.299831 +v 0.049519 2.034286 -3.299453 +v 0.053040 2.039342 -3.299754 +v 0.054377 2.045388 -3.299918 +v 0.062792 2.053495 -3.300536 +v 0.053325 2.051503 -3.299920 +v 0.057200 2.063633 -3.300329 +v 0.050046 2.056757 -3.299759 +v 0.063729 2.048181 -3.300542 +v 0.063169 2.040174 -3.300454 +v 0.014369 2.039483 -3.297047 +v 0.060930 2.047655 -3.272835 +v 0.011572 2.038950 -3.269356 +v 0.014677 2.031832 -3.269235 +v 0.013540 2.055816 -3.280681 +v 0.018261 2.029126 -3.286191 +v 0.056095 2.063335 -3.289165 +v 0.061304 2.036707 -3.289233 +v 1.023580 2.239589 -3.352769 +v 0.926453 2.222463 -3.345940 +v 0.927320 2.216949 -3.344934 +v -0.094876 2.036708 -3.273077 +v -0.096202 2.045141 -3.274615 +v -0.270318 2.014446 -3.262351 +v 1.024489 2.238942 -3.360386 +v 0.927362 2.221816 -3.353556 +v 0.927877 2.217053 -3.350445 +v -0.094319 2.036813 -3.278589 +v -0.095107 2.044096 -3.283345 +v -0.269222 2.013401 -3.271084 +v 1.025793 2.235528 -3.367112 +v 0.928666 2.218402 -3.360282 +v 0.928750 2.215117 -3.355540 +v 0.057798 2.061544 -3.294318 +v 0.014145 2.053842 -3.291224 +v -0.093446 2.034876 -3.283684 +v -0.093575 2.039901 -3.290934 +v -0.267689 2.009204 -3.278675 +v 1.027293 2.229868 -3.371923 +v 0.930167 2.212742 -3.365093 +v 0.929807 2.211433 -3.359442 +v 0.060381 2.058130 -3.298327 +v 0.013671 2.049892 -3.295016 +v -0.092389 2.031192 -3.287585 +v -0.091840 2.033194 -3.296227 +v -0.265954 2.002495 -3.283968 +v 1.028761 2.222823 -3.374088 +v 0.931635 2.205696 -3.367258 +v 0.930886 2.206564 -3.361557 +v -0.091310 2.026323 -3.289700 +v -0.090166 2.024997 -3.298418 +v -0.264280 1.994295 -3.286160 +v 1.029974 2.215464 -3.373276 +v 0.932847 2.198338 -3.366446 +v 0.931824 2.201250 -3.361564 +v -0.090372 2.021009 -3.289707 +v -0.088807 2.016556 -3.297173 +v -0.262921 1.985852 -3.284913 +v 1.030747 2.208913 -3.369611 +v 0.933620 2.191787 -3.362782 +v 0.932477 2.196300 -3.359461 +v 0.063581 2.043090 -3.298383 +v 0.015830 2.034678 -3.295003 +v -0.089718 2.016060 -3.287604 +v -0.087972 2.009159 -3.292681 +v -0.262085 1.978453 -3.280421 +v 1.030962 2.204168 -3.363652 +v 0.933835 2.187041 -3.356822 +v 0.932747 2.192468 -3.355569 +v 0.062301 2.038986 -3.294382 +v 0.017593 2.031111 -3.291219 +v -0.089449 2.012228 -3.283711 +v -0.087786 2.003929 -3.285628 +v -0.261899 1.973222 -3.273364 +v 1.030586 2.201950 -3.356304 +v 0.933459 2.184823 -3.349474 +v 0.932591 2.190338 -3.350479 +v 0.587018 2.129404 -3.326179 +v 0.530405 2.119422 -3.322198 +v -0.089605 2.010098 -3.278622 +v -0.088278 2.001664 -3.277085 +v -0.262392 1.970957 -3.264819 +v 1.029678 2.202596 -3.348688 +v 0.932550 2.185470 -3.341858 +v 0.932034 2.190233 -3.344968 +v 0.586462 2.129299 -3.320668 +v 0.529847 2.119317 -3.316688 +v -0.090162 2.009993 -3.273111 +v -0.089374 2.002709 -3.268355 +v -0.263488 1.972003 -3.256087 +v 1.028373 2.206010 -3.341962 +v 0.931246 2.188884 -3.335132 +v 0.931161 2.192170 -3.339874 +v 0.060715 2.038687 -3.278687 +v 0.016008 2.030809 -3.275533 +v -0.091035 2.011930 -3.268017 +v -0.090906 2.006905 -3.260766 +v -0.265020 1.976200 -3.248495 +v 1.026873 2.211670 -3.337150 +v 0.929746 2.194544 -3.330320 +v 0.930104 2.195853 -3.335972 +v 0.061207 2.042644 -3.274894 +v 0.013459 2.034226 -3.271528 +v -0.092091 2.015613 -3.264115 +v -0.092641 2.013611 -3.255473 +v -0.266755 1.982909 -3.243201 +v 1.025404 2.218716 -3.334985 +v 0.928277 2.201590 -3.328156 +v 0.929025 2.200722 -3.333857 +v -0.093171 2.020482 -3.261999 +v -0.094315 2.021809 -3.253282 +v -0.268430 1.991109 -3.241011 +v 1.024191 2.226074 -3.335798 +v 0.927064 2.208948 -3.328967 +v 0.928087 2.206036 -3.333850 +v -0.094109 2.025797 -3.261993 +v -0.095673 2.030249 -3.254528 +v -0.269789 1.999551 -3.242257 +v 1.023419 2.232625 -3.339462 +v 0.926292 2.215499 -3.332633 +v 0.927434 2.210986 -3.335953 +v 0.058008 2.057683 -3.274838 +v 0.011300 2.049440 -3.271541 +v -0.094762 2.030746 -3.264096 +v -0.096509 2.037647 -3.259019 +v -0.270624 2.006951 -3.246750 +v 1.023204 2.237371 -3.345422 +v 0.926077 2.220245 -3.338592 +v 0.927165 2.214818 -3.339845 +v 0.056212 2.061246 -3.278622 +v 0.012561 2.053540 -3.275538 +v -0.095031 2.034578 -3.267988 +v -0.096695 2.042876 -3.266072 +v -0.270810 2.012181 -3.253806 +v 0.545799 2.103575 -3.323039 +v 0.577967 2.109243 -3.325300 +v 0.577266 2.110056 -3.319956 +v 0.545099 2.104385 -3.317694 +v 0.532864 2.113647 -3.322221 +v 0.532163 2.114460 -3.316877 +v 0.561972 2.102748 -3.318830 +v 0.562673 2.101935 -3.324175 +v 0.582449 2.116489 -3.320359 +v 0.583150 2.115676 -3.325703 +v 0.537408 2.109182 -3.317200 +v 0.538110 2.108369 -3.322544 +v 0.055538 2.063230 -3.283653 +v 0.056095 2.063335 -3.289165 +v 0.056095 2.063335 -3.289165 +v 0.060747 2.036602 -3.283722 +v 0.060747 2.036602 -3.283722 +v 0.060747 2.036602 -3.283722 +v 0.060930 2.047655 -3.272835 +v 0.059993 2.052969 -3.272829 +v 0.059993 2.052969 -3.272829 +v 0.055538 2.063230 -3.283653 +v 0.055538 2.063230 -3.283653 +v 0.060715 2.038687 -3.278687 +v 0.060715 2.038687 -3.278687 +v 0.061207 2.042644 -3.274894 +v 0.061207 2.042644 -3.274894 +v 0.061207 2.042644 -3.274894 +v 0.058008 2.057683 -3.274838 +v 0.058008 2.057683 -3.274838 +v 0.056212 2.061246 -3.278622 +v 0.056212 2.061246 -3.278622 +v 0.060930 2.047655 -3.272835 +v 0.059993 2.052969 -3.272829 +v 0.059993 2.052969 -3.272829 +vt 0.959908 0.501828 +vt 0.959856 0.496848 +vt 0.960169 0.507154 +vt 0.959907 0.507185 +vt 0.959854 0.512202 +vt 0.960036 0.516684 +vt 0.959883 0.485857 +vt 0.960038 0.492221 +vt 0.959757 0.492935 +vt 0.959879 0.523155 +vt 0.959754 0.516186 +vt 0.959665 0.527142 +vt 0.959620 0.518541 +vt 0.959421 0.527886 +vt 0.959471 0.518843 +vt 0.959183 0.524998 +vt 0.959328 0.516943 +vt 0.959670 0.482023 +vt 0.959623 0.490679 +vt 0.959427 0.481462 +vt 0.959474 0.490490 +vt 0.959188 0.484540 +vt 0.959331 0.492503 +vt 0.958943 0.495480 +vt 0.959218 0.496496 +vt 0.958922 0.503019 +vt 0.959155 0.501869 +vt 0.958927 0.508260 +vt 0.959154 0.507720 +vt 0.958993 0.518667 +vt 0.959216 0.513042 +vt 0.978153 0.523140 +vt 0.967196 0.516447 +vt 0.970723 0.516438 +vt 0.978711 0.481476 +vt 0.979005 0.484553 +vt 0.979242 0.491039 +vt 0.971037 0.492509 +vt 0.978184 0.512193 +vt 0.978148 0.485867 +vt 0.967172 0.493406 +vt 0.978307 0.516175 +vt 0.978417 0.527122 +vt 0.978472 0.518527 +vt 0.978718 0.527865 +vt 0.978657 0.518829 +vt 0.979011 0.524978 +vt 0.978833 0.516930 +vt 0.978410 0.482036 +vt 0.978304 0.492941 +vt 0.978468 0.490686 +vt 0.978653 0.490497 +vt 0.978829 0.492508 +vt 0.967041 0.492514 +vt 0.978969 0.496499 +vt 0.978971 0.513031 +vt 0.967067 0.518599 +vt 0.979375 0.499984 +vt 0.979188 0.502985 +vt 0.979193 0.508222 +vt 0.979246 0.518651 +vt 0.977960 0.516673 +vt 0.978182 0.496850 +vt 0.977705 0.507116 +vt 0.977700 0.502584 +vt 0.977906 0.496219 +vt 0.960164 0.502618 +vt 0.970693 0.493400 +vt 0.971057 0.518590 +vt 0.466722 0.513991 +vt 0.466923 0.511895 +vt 0.469942 0.513545 +vt 0.469659 0.511516 +vt 0.466298 0.510861 +vt 0.468627 0.510866 +vt -0.028943 0.518590 +vt -0.032933 0.518599 +vt 0.969342 0.518252 +vt 0.970100 0.512672 +vt 0.965037 0.517453 +vt 0.967383 0.512677 +vt 0.969003 0.513341 +vt 0.965858 0.512757 +vt 0.472075 0.509802 +vt 0.472783 0.511529 +vt 0.470780 0.509709 +vt 0.963368 0.516661 +vt 0.964870 0.511327 +vt 0.963945 0.514664 +vt 0.961298 0.514569 +vt 0.963125 0.510651 +vt 0.473802 0.507018 +vt 0.474814 0.508253 +vt 0.472428 0.507569 +vt 0.960504 0.513048 +vt 0.962947 0.508830 +vt 0.961484 0.511384 +vt 0.958694 0.510046 +vt 0.474578 0.503586 +vt 0.475727 0.504218 +vt 0.473322 0.504772 +vt 0.961906 0.505567 +vt 0.957618 0.504576 +vt 0.961220 0.507345 +vt 0.960433 0.503345 +vt 0.474287 0.500030 +vt 0.473324 0.501744 +vt 0.475385 0.500035 +vt 0.958230 0.498987 +vt 0.961902 0.502035 +vt 0.472972 0.496888 +vt 0.473838 0.496339 +vt 0.472436 0.498944 +vt 0.960477 0.498177 +vt 0.960438 0.494123 +vt 0.962938 0.498769 +vt 0.960881 0.499258 +vt 0.962497 0.495702 +vt 0.470832 0.494639 +vt 0.471321 0.493693 +vt 0.470792 0.496799 +vt 0.963340 0.494496 +vt 0.961479 0.498420 +vt 0.964857 0.496266 +vt 0.963930 0.495177 +vt 0.963912 0.490726 +vt 0.468193 0.493627 +vt 0.468217 0.492503 +vt 0.468641 0.495636 +vt 0.469626 0.488280 +vt 0.470224 0.483813 +vt 0.967366 0.494908 +vt 0.968124 0.489319 +vt 0.965037 0.493221 +vt 0.968114 0.492194 +vt 0.465457 0.494007 +vt 0.464998 0.492950 +vt 0.466312 0.495632 +vt 0.463369 0.488275 +vt -0.028963 0.492509 +vt 0.461580 0.483811 +vt 0.972429 0.490120 +vt 0.970084 0.494904 +vt 0.971260 0.492779 +vt 0.463042 0.495721 +vt 0.462157 0.494967 +vt 0.464160 0.496789 +vt -0.025255 0.494481 +vt 0.972595 0.496254 +vt 0.973933 0.495160 +vt 0.976166 0.493005 +vt 0.461315 0.498505 +vt 0.460128 0.498242 +vt 0.462512 0.498929 +vt -0.022379 0.498151 +vt 0.974517 0.498750 +vt 0.976382 0.498393 +vt 0.978767 0.497526 +vt 0.973992 0.494886 +vt 0.975895 0.498191 +vt 0.460539 0.501935 +vt 0.459215 0.502276 +vt 0.461619 0.501725 +vt 0.979842 0.502993 +vt 0.975559 0.502012 +vt 0.976682 0.502189 +vt 0.460830 0.505491 +vt 0.459557 0.506457 +vt 0.461616 0.504752 +vt -0.020812 0.502985 +vt -0.020807 0.508222 +vt 0.979231 0.508579 +vt 0.975562 0.505544 +vt 0.976235 0.506276 +vt 0.462145 0.508632 +vt 0.461103 0.510152 +vt 0.462504 0.507552 +vt 0.977025 0.513442 +vt 0.974620 0.509831 +vt 0.464284 0.510882 +vt 0.463618 0.512799 +vt 0.464147 0.509697 +vt -0.022381 0.513012 +vt -0.025244 0.516635 +vt 0.972081 0.512313 +vt 0.973553 0.516841 +vt 0.972609 0.511313 +vt 0.973963 0.514640 +vt 0.470085 0.471402 +vt 0.461782 0.473312 +vt 0.470074 0.460042 +vt 0.463365 0.469478 +vt 0.462819 0.448533 +vt 0.462286 0.451993 +vt 0.469858 0.446937 +vt 0.469618 0.468045 +vt 0.461996 0.461892 +vt 0.463249 0.459907 +vt 0.469701 0.458435 +vt 0.470032 0.450237 +vt 0.976408 0.511350 +vt 0.974745 0.494481 +vt 0.977621 0.498151 +vt 0.977619 0.513012 +vt 0.974756 0.516635 +vt 0.974527 0.508809 +vn -0.078240 -0.018390 -0.996765 +vn -0.076053 -0.013311 -0.997015 +vn -0.068103 -0.012087 -0.997605 +vn -0.068090 -0.011973 -0.997607 +vn -0.068053 -0.011970 -0.997610 +vn -0.068053 -0.011977 -0.997610 +vn -0.068008 -0.011965 -0.997613 +vn -0.068050 -0.012004 -0.997610 +vn -0.068022 -0.012007 -0.997612 +vn -0.068036 -0.012013 -0.997610 +vn -0.067986 -0.012042 -0.997614 +vn -0.068062 -0.012040 -0.997608 +vn -0.068083 -0.012012 -0.997607 +vn -0.067977 -0.012004 -0.997615 +vn -0.067958 -0.011994 -0.997616 +vn -0.068064 -0.011992 -0.997609 +vn -0.068033 -0.011955 -0.997611 +vn -0.068046 -0.011960 -0.997610 +vn -0.068053 -0.011980 -0.997610 +vn -0.068028 -0.011957 -0.997612 +vn -0.067975 -0.012079 -0.997614 +vn -0.068462 -0.006172 -0.997635 +vn -0.062694 -0.013176 -0.997946 +vn -0.063610 -0.010102 -0.997924 +vn -0.062664 -0.011088 -0.997973 +vn -0.068013 -0.011981 -0.997612 +vn -0.067974 -0.012021 -0.997615 +vn -0.068049 -0.012027 -0.997609 +vn -0.827691 0.556427 -0.072913 +vn 0.539483 -0.841064 0.039608 +vn 0.820493 -0.566983 0.072950 +vn 0.881293 -0.470916 0.039512 +vn 0.985351 0.169444 0.019290 +vn 0.972570 -0.212479 0.094658 +vn -0.666034 -0.744680 -0.043021 +vn -0.584152 -0.808305 -0.073555 +vn -0.826801 0.557639 -0.073750 +vn 0.820543 -0.566911 0.072943 +vn 0.820559 -0.566888 0.072938 +vn -0.539480 0.841067 -0.039593 +vn -0.539524 0.841038 -0.039617 +vn 0.539493 -0.841059 0.039596 +vn 0.539442 -0.841091 0.039603 +vn -0.169316 0.985562 0.000441 +vn -0.169265 0.985570 0.000464 +vn 0.169280 -0.985568 -0.000458 +vn 0.169210 -0.985580 -0.000450 +vn 0.227939 0.972836 0.040426 +vn 0.227953 0.972832 0.040432 +vn -0.227823 -0.972863 -0.040424 +vn -0.227897 -0.972846 -0.040414 +vn -0.227892 -0.972847 -0.040425 +vn -0.227873 -0.972851 -0.040430 +vn 0.227869 0.972852 0.040430 +vn 0.227886 0.972848 0.040435 +vn 0.169264 -0.985571 -0.000457 +vn 0.169267 -0.985570 -0.000458 +vn -0.169248 0.985573 0.000463 +vn -0.169270 0.985570 0.000457 +vn 0.539449 -0.841087 0.039589 +vn -0.539497 0.841056 -0.039597 +vn -0.539521 0.841040 -0.039606 +vn 0.887861 -0.460080 0.005368 +vn -0.820512 0.566957 -0.072940 +vn -0.972582 0.212421 -0.094666 +vn -0.969036 -0.166647 -0.182204 +vn -0.969021 -0.166705 -0.182228 +vn -0.845804 -0.524967 -0.094994 +vn 0.596911 0.798271 0.080383 +vn 0.584089 0.808352 0.073541 +vn -0.584202 -0.808269 -0.073544 +vn -0.584102 -0.808340 -0.073562 +vn 0.067993 0.011987 0.997614 +vn 0.067987 0.012071 0.997613 +vn 0.028347 0.088945 0.995633 +vn 0.088252 0.015432 0.995979 +vn 0.083304 -0.003980 0.996516 +vn 0.068010 0.012022 0.997612 +vn 0.068054 0.012025 0.997609 +vn 0.067998 0.011991 0.997613 +vn 0.067930 0.012080 0.997617 +vn 0.068064 0.011993 0.997609 +vn 0.068070 0.011990 0.997608 +vn 0.068020 0.012010 0.997612 +vn 0.068086 0.012001 0.997607 +vn 0.067993 0.011984 0.997614 +vn 0.067986 0.012071 0.997613 +vn 0.048531 0.008603 0.998785 +vn 0.059826 0.043032 0.997281 +vn 0.068026 0.012011 0.997611 +vn 0.068029 0.012058 0.997611 +vn 0.068045 0.011992 0.997610 +vn 0.068034 0.012007 0.997611 +vn 0.067990 0.011996 0.997614 +vn 0.067994 0.011994 0.997614 +vn 0.068045 0.012016 0.997610 +vn 0.068054 0.012044 0.997609 +vn -0.062074 -0.013890 -0.997975 +vn -0.073323 -0.011416 -0.997243 +vn -0.075373 -0.017634 -0.997000 +vn -0.072067 -0.007816 -0.997369 +vn 0.089476 0.014576 0.995882 +vn 0.067980 0.012056 0.997614 +vn 0.059382 -0.007006 0.998211 +vn 0.047193 0.006712 0.998863 +vn -0.820112 0.566058 -0.083632 +vn -0.820790 0.567793 -0.062568 +vn -0.622482 -0.778753 -0.077843 +vn -0.683187 -0.730243 -0.001283 +vn 0.590372 0.803649 0.074897 +vn 0.584151 0.808837 0.067457 +vn 0.851444 -0.518873 0.076250 +vn -0.179823 0.978129 -0.104535 +vn -0.179823 0.978127 -0.104555 +vn -0.979646 -0.172731 -0.102258 +vn -0.979647 -0.172721 -0.102271 +vn -0.173568 0.984821 0.001169 +vn -0.173574 0.984820 0.001079 +vn 0.979643 0.172749 0.102265 +vn 0.979653 0.172709 0.102236 +vn -0.181429 0.973490 -0.139284 +vn -0.181429 0.973489 -0.139291 +vn 0.979601 0.173029 0.102192 +vn -0.185145 0.861349 -0.473073 +vn -0.185145 0.861349 -0.473075 +vn -0.979653 -0.172702 -0.102242 +vn -0.979651 -0.172690 -0.102282 +vn -0.186472 0.907290 -0.376899 +vn -0.186473 0.907325 -0.376815 +vn -0.186344 0.907329 -0.376868 +vn -0.186351 0.907375 -0.376755 +vn 0.979654 0.172704 0.102228 +vn 0.979629 0.172829 0.102258 +vn -0.184259 0.843929 -0.503818 +vn -0.184266 0.843972 -0.503744 +vn 0.979660 0.172620 0.102317 +vn -0.162543 0.613707 -0.772621 +vn -0.162542 0.613700 -0.772627 +vn -0.979649 -0.172698 -0.102288 +vn -0.979643 -0.172703 -0.102343 +vn -0.171396 0.692786 -0.700479 +vn -0.171401 0.692833 -0.700432 +vn -0.171213 0.692773 -0.700537 +vn -0.171245 0.692955 -0.700349 +vn 0.979631 0.172822 0.102252 +vn 0.979648 0.172715 0.102269 +vn 0.979647 0.172731 0.102259 +vn -0.114790 0.269734 -0.956068 +vn -0.114800 0.269775 -0.956056 +vn -0.979640 -0.172716 -0.102346 +vn -0.979650 -0.172688 -0.102293 +vn -0.130017 0.370768 -0.919579 +vn -0.130000 0.370658 -0.919626 +vn -0.129793 0.370705 -0.919637 +vn -0.129835 0.370910 -0.919548 +vn 0.979650 0.172708 0.102267 +vn 0.979646 0.172740 0.102248 +vn -0.109542 0.235686 -0.965636 +vn -0.109544 0.235694 -0.965634 +vn 0.979644 0.172754 0.102239 +vn -0.979650 -0.172691 -0.102293 +vn -0.979646 -0.172707 -0.102305 +vn -0.068201 -0.010912 -0.997612 +vn -0.068233 -0.010739 -0.997612 +vn 0.979649 0.172723 0.102251 +vn 0.979647 0.172767 0.102193 +vn 0.979644 0.172757 0.102236 +vn 0.024229 -0.485857 -0.873702 +vn 0.024248 -0.485917 -0.873668 +vn -0.979637 -0.172787 -0.102256 +vn -0.979647 -0.172738 -0.102242 +vn 0.004164 -0.390597 -0.920552 +vn 0.979650 0.172738 0.102210 +vn 0.979651 0.172744 0.102189 +vn 0.030765 -0.516200 -0.855915 +vn 0.030760 -0.516182 -0.855926 +vn 0.979644 0.172728 0.102288 +vn 0.093289 -0.777221 -0.622273 +vn 0.093294 -0.777233 -0.622258 +vn -0.979647 -0.172729 -0.102255 +vn -0.979631 -0.172825 -0.102244 +vn 0.075481 -0.708002 -0.702165 +vn 0.075470 -0.707956 -0.702212 +vn 0.075672 -0.708012 -0.702134 +vn 0.075604 -0.707801 -0.702354 +vn 0.979653 0.172683 0.102273 +vn 0.979641 0.172696 0.102367 +vn 0.979645 0.172736 0.102263 +vn 0.147707 -0.948890 -0.278909 +vn 0.147706 -0.948889 -0.278915 +vn -0.979627 -0.172809 -0.102312 +vn -0.979629 -0.172795 -0.102320 +vn 0.134778 -0.915517 -0.379030 +vn 0.134769 -0.915494 -0.379088 +vn 0.134774 -0.915480 -0.379120 +vn 0.134961 -0.915982 -0.377840 +vn 0.134905 -0.915459 -0.379124 +vn 0.134861 -0.915371 -0.379352 +vn 0.979649 0.172726 0.102242 +vn 0.979670 0.172667 0.102143 +vn 0.151627 -0.957589 -0.245016 +vn 0.151608 -0.957562 -0.245133 +vn -0.979653 -0.172722 -0.102209 +vn 0.979654 0.172748 0.102153 +vn 0.179829 -0.978122 0.104587 +vn 0.179812 -0.978140 0.104453 +vn -0.979644 -0.172776 -0.102204 +vn -0.979644 -0.172789 -0.102188 +vn 0.173565 -0.984822 -0.001221 +vn 0.173561 -0.984822 -0.001266 +vn 0.173573 -0.984820 -0.001113 +vn 0.173560 -0.984822 -0.001267 +vn 0.979657 0.172682 0.102239 +vn 0.979612 0.172861 0.102368 +vn 0.181499 -0.973472 0.139322 +vn 0.181496 -0.973476 0.139294 +vn 0.979638 0.172761 0.102289 +vn 0.185141 -0.861367 0.473043 +vn 0.185146 -0.861325 0.473117 +vn -0.979638 -0.172805 -0.102215 +vn -0.979635 -0.172787 -0.102276 +vn 0.186482 -0.907306 0.376856 +vn 0.186465 -0.907289 0.376904 +vn 0.186497 -0.907271 0.376932 +vn 0.186485 -0.907374 0.376691 +vn 0.979645 0.172764 0.102214 +vn 0.979652 0.172730 0.102206 +vn 0.979643 0.172750 0.102255 +vn 0.162544 -0.613700 0.772627 +vn 0.162545 -0.613745 0.772591 +vn -0.979628 -0.172816 -0.102296 +vn -0.979652 -0.172796 -0.102096 +vn 0.171397 -0.692801 0.700464 +vn 0.171403 -0.692854 0.700410 +vn 0.171386 -0.692910 0.700359 +vn 0.171389 -0.693004 0.700265 +vn 0.979630 0.172818 0.102267 +vn 0.979662 0.172620 0.102298 +vn 0.159305 -0.585774 0.794664 +vn 0.159312 -0.585889 0.794578 +vn -0.979645 -0.172745 -0.102249 +vn 0.979635 0.172772 0.102294 +vn 0.114800 -0.269812 0.956045 +vn 0.114795 -0.269753 0.956063 +vn -0.979665 -0.172729 -0.102081 +vn -0.979643 -0.172790 -0.102192 +vn 0.979647 0.172695 0.102314 +vn 0.979639 0.172768 0.102270 +vn 0.109602 -0.235598 0.965651 +vn 0.109610 -0.235679 0.965630 +vn -0.979641 -0.172759 -0.102260 +vn 0.979651 0.172722 0.102234 +vn 0.049027 0.117511 0.991861 +vn 0.049025 0.117539 0.991857 +vn -0.979644 -0.172786 -0.102193 +vn -0.979644 -0.172784 -0.102191 +vn 0.068218 0.010823 0.997612 +vn 0.068223 0.010789 0.997612 +vn 0.979643 0.172738 0.102275 +vn 0.979645 0.172694 0.102334 +vn 0.042682 0.152589 0.987368 +vn 0.042681 0.152598 0.987366 +vn -0.979625 -0.172832 -0.102295 +vn 0.979627 0.172811 0.102306 +vn -0.024249 0.485954 0.873648 +vn -0.024240 0.485882 0.873688 +vn -0.979647 -0.172760 -0.102206 +vn -0.979672 -0.172636 -0.102172 +vn 0.979640 0.172739 0.102306 +vn -0.979668 -0.172621 -0.102241 +vn 0.979664 0.172650 0.102222 +vn -0.093289 0.777226 0.622268 +vn -0.093285 0.777199 0.622301 +vn -0.979674 -0.172595 -0.102228 +vn -0.979635 -0.172828 -0.102201 +vn -0.075471 0.707959 0.702209 +vn -0.075472 0.707963 0.702206 +vn -0.098841 0.798175 0.594261 +vn -0.098830 0.798113 0.594347 +vn -0.147705 0.948891 0.278908 +vn -0.147705 0.948888 0.278917 +vn -0.979631 -0.172811 -0.102273 +vn -0.979639 -0.172740 -0.102312 +vn -0.134766 0.915458 0.379177 +vn -0.134768 0.915463 0.379164 +vn -0.134756 0.915510 0.379054 +vn -0.134736 0.915417 0.379286 +vn 0.979638 0.172770 0.102273 +vn 0.979647 0.172744 0.102230 +vn -0.151551 0.957591 0.245056 +vn -0.151547 0.957573 0.245129 +vn -0.915536 -0.389580 -0.100107 +vn -0.902135 -0.428151 -0.053282 +vn -0.708810 -0.705256 0.014251 +vn 0.069746 0.002235 0.997562 +vn 0.069313 -0.005833 0.997578 +vn 0.067781 0.006098 0.997682 +vn 0.068735 0.008540 0.997598 +vn -0.065885 -0.024151 -0.997535 +vn -0.069705 -0.011018 -0.997507 +vn 0.950999 -0.295683 0.090397 +vn -0.063213 -0.016797 -0.997859 +vn -0.067913 -0.006430 -0.997671 +vn 0.068153 0.006578 0.997653 +vn 0.070824 0.005413 0.997474 +vn -0.070707 -0.005587 -0.997481 +vn -0.067686 -0.005560 -0.997691 +vn 0.950873 -0.262205 0.164587 +vn 0.769858 -0.608181 0.193482 +vn 0.769890 -0.608106 0.193588 +vn 0.434629 -0.880126 0.190986 +vn 0.434598 -0.880167 0.190869 +vn 0.186471 -0.907074 0.377419 +vn 0.186478 -0.906689 0.378339 +vn -0.086355 -0.986553 0.138765 +vn -0.086622 -0.986627 0.138070 +vn -0.525529 -0.848679 0.059692 +vn -0.525276 -0.848801 0.060173 +vn -0.708818 -0.705248 0.014234 +vn -0.985613 0.155016 0.067359 +vn -0.973741 0.206965 -0.094840 +vn -0.974057 0.205697 -0.094352 +vn -0.914757 -0.397818 0.070435 +vn -0.847874 -0.521711 -0.094488 +vn -0.839727 -0.535408 -0.090541 +vn -0.845666 -0.525187 -0.095017 +vn -0.847347 -0.522052 -0.097283 +vn -0.830773 -0.411852 -0.374425 +vn -0.973330 0.208554 -0.095572 +vn -0.955667 0.146187 -0.255596 +vn 0.846329 0.523620 0.097722 +vn 0.845664 0.524616 0.098135 +vn 0.873515 0.483042 -0.060349 +vn 0.974621 -0.200240 0.100089 +vn 0.973280 -0.207424 0.098491 +vn 0.992677 -0.070527 -0.098072 +vn 0.972853 -0.211595 0.093727 +vn 0.972922 -0.211145 0.094021 +vn 0.973017 -0.212586 0.089693 +vn 0.968591 0.138406 -0.206579 +vn 0.854661 0.461348 0.238144 +vn 0.846815 0.523983 0.091358 +vn 0.848014 0.521867 0.092343 +vn -0.049027 -0.117510 -0.991861 +vn -0.049029 -0.117503 -0.991861 +vn 0.004146 -0.390513 -0.920588 +vn 0.130003 -0.370670 0.919621 +vn 0.129997 -0.370636 0.919635 +vn -0.004153 0.390544 0.920575 +vn -0.004157 0.390564 0.920566 +vn 0.979638 0.172778 0.102256 +vn 0.979639 0.172774 0.102258 +vn 0.979640 0.172738 0.102312 +vn -0.030677 0.516151 0.855948 +vn -0.030706 0.516256 0.855884 +vn 0.184333 -0.843939 0.503775 +vn 0.184333 -0.843954 0.503748 +vn 0.129972 -0.370803 0.919572 +vn 0.129949 -0.370689 0.919621 +vn 0.068123 0.010898 0.997617 +vn -0.004191 0.390419 0.920628 +vn -0.004214 0.390569 0.920564 +vn -0.075485 0.707934 0.702233 +vn -0.075462 0.707805 0.702366 +vn -0.173473 0.984838 0.001442 +vn -0.173499 0.984833 0.001220 +vn -0.159232 0.585806 -0.794655 +vn -0.159246 0.585880 -0.794598 +vn -0.042617 -0.152534 -0.987379 +vn -0.042603 -0.152637 -0.987364 +vn -0.979650 -0.172611 -0.102428 +vn -0.979655 -0.172782 -0.102090 +vn -0.979646 -0.172735 -0.102258 +vn -0.979642 -0.172733 -0.102294 +vn -0.979644 -0.172740 -0.102263 +vn -0.979656 -0.172708 -0.102208 +vn -0.979630 -0.172829 -0.102253 +vn -0.979639 -0.172774 -0.102260 +vn -0.979632 -0.172821 -0.102244 +vn 0.098904 -0.798124 -0.594320 +vn 0.098910 -0.798158 -0.594274 +vn -0.068050 -0.010485 -0.997627 +vn 0.004317 -0.390334 -0.920663 +vn 0.004370 -0.390535 -0.920577 +vn -0.068028 -0.010664 -0.997626 +vn 0.173617 -0.984812 -0.001391 +vn 0.173647 -0.984807 -0.001139 +vn 0.068232 0.010426 0.997615 +vn 0.985357 0.169410 0.019305 +vn 0.845779 0.525010 0.094984 +vn 0.584171 0.808291 0.073559 +vn 0.584134 0.808317 0.073566 +s off +f 10681/3811/4423 10682/3812/4423 10683/3813/4423 +f 10684/3814/4424 10681/3811/4424 10683/3813/4424 +f 10687/3815/4425 10684/3814/4425 10686/3816/4425 +f 10688/3817/4426 10685/3818/4426 10682/3812/4426 +f 10688/3817/4427 10682/3812/4427 10689/3819/4427 +f 10687/3815/4428 10686/3816/4428 10690/3820/4428 +f 10691/3821/4429 10687/3815/4429 10690/3820/4429 +f 10691/3821/4430 10690/3820/4430 10692/3822/4430 +f 10693/3823/4431 10691/3821/4431 10692/3822/4431 +f 10693/3823/4432 10692/3822/4432 10694/3824/4432 +f 10695/3825/4433 10693/3823/4433 10694/3824/4433 +f 10695/3825/4434 10694/3824/4434 10696/3826/4434 +f 10697/3827/4435 10695/3825/4435 10696/3826/4435 +f 10698/3828/4436 10688/3817/4436 10689/3819/4436 +f 10698/3828/4437 10689/3819/4437 10699/3829/4437 +f 10700/3830/4438 10698/3828/4438 10699/3829/4438 +f 10700/3830/4439 10699/3829/4439 10701/3831/4439 +f 10702/3832/4440 10700/3830/4440 10701/3831/4440 +f 10702/3832/4441 10701/3831/4441 10703/3833/4441 +f 10711/3834/4442 10702/3832/4442 10703/3833/4442 +f 10711/3834/4443 10703/3833/4443 10704/3835/4443 +f 10710/3836/4444 10711/3834/4444 10704/3835/4444 +f 10710/3836/4445 10704/3835/4445 10705/3837/4445 +f 10706/3838/4446 10710/3836/4446 10705/3837/4446 +f 10706/3838/4447 10705/3837/4447 10707/3839/4447 +f 10708/3840/4448 10707/3839/4448 10709/3841/4448 +f 10696/3826/4449 10708/3840/4449 10709/3841/4449 +f 10697/3827/4450 10696/3826/4450 10709/3841/4450 +f 10661/3842/4451 10676/3843/4451 10716/3844/4451 +f 10670/3845/4452 10702/3832/4452 10669/3846/4452 +f 10668/3847/4453 10669/3846/4453 10702/3832/4453 +f 10702/3832/4454 10677/3848/4454 10668/3847/4454 +f 10681/3811/4455 10684/3814/4455 10658/3849/4455 +f 10684/3814/4456 10687/3815/4456 10658/3849/4456 +f 10672/3850/4457 10717/3851/4457 10685/3818/4457 +f 10685/3818/4458 10688/3817/4458 10672/3850/4458 +f 10676/3843/4459 10661/3842/4459 10690/3820/4459 +f 10657/3852/4460 10658/3849/4460 10687/3815/4460 +f 10687/3815/4461 10691/3821/4461 10657/3852/4461 +f 10661/3842/4462 10662/3853/4462 10692/3822/4462 +f 10692/3822/4463 10690/3820/4463 10661/3842/4463 +f 10656/3854/4464 10657/3852/4464 10691/3821/4464 +f 10691/3821/4465 10693/3823/4465 10656/3854/4465 +f 10662/3853/4466 10663/3855/4466 10694/3824/4466 +f 10694/3824/4467 10692/3822/4467 10662/3853/4467 +f 10655/3856/4468 10656/3854/4468 10693/3823/4468 +f 10693/3823/4469 10695/3825/4469 10655/3856/4469 +f 10663/3855/4470 10664/3857/4470 10696/3826/4470 +f 10696/3826/4471 10694/3824/4471 10663/3855/4471 +f 10654/3858/4472 10655/3856/4472 10695/3825/4472 +f 10695/3825/4473 10697/3827/4473 10654/3858/4473 +f 10671/3859/4474 10672/3850/4474 10688/3817/4474 +f 10688/3817/4475 10698/3828/4475 10671/3859/4475 +f 10648/3860/4476 10649/3861/4476 10699/3829/4476 +f 10699/3829/4477 10689/3819/4477 10648/3860/4477 +f 10670/3845/4478 10671/3859/4478 10698/3828/4478 +f 10698/3828/4479 10700/3830/4479 10670/3845/4479 +f 10649/3861/4480 10650/3862/4480 10701/3831/4480 +f 10701/3831/4481 10699/3829/4481 10649/3861/4481 +f 10702/3832/4482 10670/3845/4482 10700/3830/4482 +f 10650/3862/4483 10651/3863/4483 10703/3833/4483 +f 10703/3833/4484 10701/3831/4484 10650/3862/4484 +f 10702/3832/4485 10711/3834/4485 10719/3864/4485 +f 10651/3863/4486 10652/3865/4486 10704/3835/4486 +f 10705/3837/4487 10704/3835/4487 10652/3865/4487 +f 10652/3865/4488 10653/3866/4488 10707/3839/4488 +f 10707/3839/4489 10705/3837/4489 10652/3865/4489 +f 10709/3841/4490 10707/3839/4490 10653/3866/4490 +f 10664/3857/4491 10718/3867/4491 10708/3840/4491 +f 10708/3840/4492 10696/3826/4492 10664/3857/4492 +f 10653/3866/4493 10654/3858/4493 10697/3827/4493 +f 10697/3827/4494 10709/3841/4494 10653/3866/4494 +f 10651/3863/4495 10669/3846/4495 10668/3847/4495 +f 10652/3865/4496 10651/3863/4496 10668/3847/4496 +f 10652/3865/4497 10667/3868/4497 10713/3869/4497 +f 10666/3870/4498 10653/3866/4498 10652/3865/4498 +f 10653/3866/4499 10666/3870/4499 10665/3871/4499 +f 10653/3866/4500 10665/3871/4500 10664/3857/4500 +f 10664/3857/4501 10654/3858/4501 10653/3866/4501 +f 10664/3857/4502 10663/3855/4502 10655/3856/4502 +f 10655/3856/4503 10654/3858/4503 10664/3857/4503 +f 10663/3855/4504 10662/3853/4504 10656/3854/4504 +f 10656/3854/4505 10655/3856/4505 10663/3855/4505 +f 10662/3853/4506 10661/3842/4506 10657/3852/4506 +f 10657/3852/4507 10656/3854/4507 10662/3853/4507 +f 10661/3842/4508 10660/3872/4508 10657/3852/4508 +f 10660/3872/4509 10658/3849/4509 10657/3852/4509 +f 10647/3873/4510 10658/3849/4510 10659/3874/4510 +f 10647/3873/4511 10714/3875/4511 10715/3876/4511 +f 10715/3876/4512 10672/3850/4512 10648/3860/4512 +f 10648/3860/4513 10647/3873/4513 10715/3876/4513 +f 10672/3850/4514 10671/3859/4514 10649/3861/4514 +f 10649/3861/4515 10648/3860/4515 10672/3850/4515 +f 10671/3859/4516 10670/3845/4516 10650/3862/4516 +f 10650/3862/4517 10649/3861/4517 10671/3859/4517 +f 10650/3862/4518 10670/3845/4518 10669/3846/4518 +f 10650/3862/4519 10669/3846/4519 10651/3863/4519 +f 10707/3839/4520 10708/3840/4520 10706/3838/4520 +f 10682/3812/4521 10712/3877/4521 10683/3813/4521 +f 10686/3816/4522 10684/3814/4522 10683/3813/4522 +f 10682/3812/4523 10685/3818/4523 10712/3877/4523 +f 10652/3865/4524 10713/3869/4524 10666/3870/4524 +f 10652/3865/4525 10668/3847/4525 10667/3868/4525 +f 10658/3849/4526 10660/3872/4526 10659/3874/4526 +f 10714/3875/4527 10647/3873/4527 10659/3874/4527 +f 10661/3842/4528 10716/3844/4528 10660/3872/4528 +f 10690/3820/4529 10686/3816/4529 10676/3843/4529 +f 10717/3851/4530 10672/3850/4530 10673/3878/4530 +f 10673/3878/4531 10672/3850/4531 10715/3876/4531 +f 10718/3867/4532 10664/3857/4532 10680/3879/4532 +f 10680/3879/4533 10664/3857/4533 10665/3871/4533 +f 10702/3832/4534 10719/3864/4534 10677/3848/4534 +f 10721/3880/4535 10720/3881/4535 10727/3882/4535 +f 10727/3882/4536 10720/3881/4536 10726/3883/4536 +f 10722/3884/4537 10721/3880/4537 10728/3885/4537 +f 10728/3885/4538 10721/3880/4538 10727/3882/4538 +f 10848/3886/4539 10722/3884/4539 10849/3887/4539 +f 10850/3887/4540 10722/3884/4540 10728/3885/4540 +f 10724/3888/4541 10723/3889/4541 10730/3890/4541 +f 10730/3890/4542 10723/3889/4542 10729/3891/4542 +f 10725/3892/4543 10724/3888/4543 10731/3893/4543 +f 10731/3893/4544 10724/3888/4544 10730/3890/4544 +f 10726/3883/4545 10720/3881/4545 10732/3894/4545 +f 10727/3882/4546 10726/3883/4546 10733/3895/4546 +f 10733/3895/4547 10726/3883/4547 10732/3894/4547 +f 10728/3885/4548 10727/3882/4548 10734/3896/4548 +f 10734/3896/4549 10727/3882/4549 10733/3895/4549 +f 10718/3867/4550 10728/3885/4550 10735/3897/4550 +f 10735/3897/4551 10728/3885/4551 10734/3896/4551 +f 10729/3891/4552 10676/3843/4552 10737/3898/4552 +f 10737/3898/4553 10676/3843/4553 10736/3899/4553 +f 10730/3890/4554 10729/3891/4554 10738/3900/4554 +f 10738/3900/4555 10729/3891/4555 10737/3898/4555 +f 10731/3893/4556 10730/3890/4556 10739/3901/4556 +f 10739/3901/4557 10730/3890/4557 10738/3900/4557 +f 10732/3894/4558 10720/3881/4558 10740/3902/4558 +f 10733/3895/4559 10732/3894/4559 10741/3903/4559 +f 10741/3903/4560 10732/3894/4560 10740/3902/4560 +f 10734/3896/4561 10733/3895/4561 10742/3904/4561 +f 10742/3904/4562 10733/3895/4562 10741/3903/4562 +f 10735/3897/4563 10734/3896/4563 10743/3905/4563 +f 10743/3905/4564 10734/3896/4564 10742/3904/4564 +f 10737/3898/4565 10736/3899/4565 10745/3906/4565 +f 10745/3906/4566 10736/3899/4566 10744/3907/4566 +f 10738/3900/4567 10737/3898/4567 10746/3908/4567 +f 10746/3908/4568 10737/3898/4568 10745/3906/4568 +f 10740/3902/4569 10720/3881/4569 10748/3909/4569 +f 10741/3903/4570 10740/3902/4570 10749/3910/4570 +f 10749/3910/4571 10740/3902/4571 10748/3909/4571 +f 10742/3904/4572 10741/3903/4572 10750/3911/4572 +f 10750/3911/4573 10741/3903/4573 10749/3910/4573 +f 10743/3905/4574 10742/3904/4574 10706/3838/4574 +f 10706/3838/4575 10742/3904/4575 10750/3911/4575 +f 10745/3906/4576 10744/3907/4576 10751/3912/4576 +f 10751/3912/4577 10744/3907/4577 10683/3813/4577 +f 10746/3908/4578 10745/3906/4578 10752/3913/4578 +f 10752/3913/4579 10745/3906/4579 10751/3912/4579 +f 10747/3914/4580 10746/3908/4580 10753/3915/4580 +f 10753/3915/4581 10746/3908/4581 10752/3913/4581 +f 10748/3909/4582 10720/3881/4582 10754/3916/4582 +f 10750/3911/4583 10749/3910/4583 10756/3917/4583 +f 10756/3917/4584 10749/3910/4584 10755/3918/4584 +f 10706/3838/4585 10750/3911/4585 10710/3836/4585 +f 10710/3836/4586 10750/3911/4586 10756/3917/4586 +f 10752/3913/4587 10751/3912/4587 10758/3919/4587 +f 10758/3919/4588 10751/3912/4588 10757/3920/4588 +f 10754/3916/4589 10720/3881/4589 10760/3921/4589 +f 10755/3918/4590 10754/3916/4590 10761/3922/4590 +f 10761/3922/4591 10754/3916/4591 10760/3921/4591 +f 10756/3917/4592 10755/3918/4592 10762/3923/4592 +f 10762/3923/4593 10755/3918/4593 10761/3922/4593 +f 10710/3836/4594 10756/3917/4594 10763/3924/4594 +f 10758/3919/4595 10757/3920/4595 10766/3925/4595 +f 10766/3925/4596 10757/3920/4596 10765/3926/4596 +f 10759/3927/4597 10758/3919/4597 10767/3928/4597 +f 10767/3928/4598 10758/3919/4598 10766/3925/4598 +f 10760/3921/4599 10720/3881/4599 10768/3929/4599 +f 10761/3922/4600 10760/3921/4600 10769/3930/4600 +f 10769/3930/4601 10760/3921/4601 10768/3929/4601 +f 10762/3923/4602 10761/3922/4602 10770/3931/4602 +f 10770/3931/4603 10761/3922/4603 10769/3930/4603 +f 10763/3924/4604 10762/3923/4604 10770/3931/4604 +f 10771/3932/4605 10763/3924/4605 10770/3931/4605 +f 10765/3926/4606 10764/3933/4606 10773/3934/4606 +f 10773/3934/4607 10764/3933/4607 10772/3935/4607 +f 10766/3925/4608 10765/3926/4608 10774/3936/4608 +f 10774/3936/4609 10765/3926/4609 10773/3934/4609 +f 10768/3929/4610 10720/3881/4610 10776/3937/4610 +f 10769/3930/4611 10768/3929/4611 10777/3938/4611 +f 10777/3938/4612 10768/3929/4612 10776/3937/4612 +f 10770/3931/4613 10769/3930/4613 10778/3939/4613 +f 10778/3939/4614 10769/3930/4614 10777/3938/4614 +f 10779/3940/4615 10770/3931/4615 10778/3939/4615 +f 10780/3941/4616 10770/3931/4616 10779/3940/4616 +f 10771/3932/4617 10770/3931/4617 10719/3864/4617 +f 10719/3864/4618 10770/3931/4618 10780/3941/4618 +f 10773/3934/4619 10772/3935/4619 10781/3942/4619 +f 10781/3942/4620 10772/3935/4620 10717/3851/4620 +f 10774/3936/4621 10773/3934/4621 10782/3943/4621 +f 10782/3943/4622 10773/3934/4622 10781/3942/4622 +f 10775/3944/4623 10774/3936/4623 10783/3945/4623 +f 10783/3945/4624 10774/3936/4624 10782/3943/4624 +f 10739/3901/4625 10775/3944/4625 10783/3945/4625 +f 10776/3937/4626 10720/3881/4626 10784/3946/4626 +f 10777/3938/4627 10776/3937/4627 10785/3947/4627 +f 10785/3947/4628 10776/3937/4628 10784/3946/4628 +f 10778/3939/4629 10777/3938/4629 10786/3948/4629 +f 10786/3948/4630 10777/3938/4630 10785/3947/4630 +f 10779/3940/4631 10778/3939/4631 10787/3949/4631 +f 10787/3949/4632 10778/3939/4632 10786/3948/4632 +f 10719/3864/4633 10780/3941/4633 10851/3950/4633 +f 10852/3950/4634 10780/3941/4634 10788/3951/4634 +f 10782/3943/4635 10781/3942/4635 10790/3952/4635 +f 10790/3952/4636 10781/3942/4636 10789/3953/4636 +f 10783/3945/4637 10782/3943/4637 10791/3954/4637 +f 10791/3954/4638 10782/3943/4638 10790/3952/4638 +f 10784/3946/4639 10720/3881/4639 10792/3955/4639 +f 10785/3947/4640 10784/3946/4640 10793/3956/4640 +f 10793/3956/4641 10784/3946/4641 10792/3955/4641 +f 10786/3948/4642 10785/3947/4642 10794/3957/4642 +f 10794/3957/4643 10785/3947/4643 10793/3956/4643 +f 10787/3949/4644 10786/3948/4644 10794/3957/4644 +f 10853/3950/4645 10788/3951/4645 10795/3958/4645 +f 10789/3953/4646 10673/3878/4646 10797/3959/4646 +f 10797/3959/4647 10673/3878/4647 10796/3960/4647 +f 10790/3952/4648 10789/3953/4648 10798/3961/4648 +f 10798/3961/4649 10789/3953/4649 10797/3959/4649 +f 10792/3955/4650 10720/3881/4650 10800/3962/4650 +f 10793/3956/4651 10792/3955/4651 10801/3963/4651 +f 10801/3963/4652 10792/3955/4652 10800/3962/4652 +f 10794/3957/4653 10793/3956/4653 10802/3964/4653 +f 10802/3964/4654 10793/3956/4654 10801/3963/4654 +f 10795/3958/4655 10794/3957/4655 10802/3964/4655 +f 10803/3965/4656 10795/3958/4656 10802/3964/4656 +f 10797/3959/4657 10796/3960/4657 10805/3966/4657 +f 10805/3966/4658 10796/3960/4658 10804/3967/4658 +f 10798/3961/4659 10797/3959/4659 10806/3968/4659 +f 10806/3968/4660 10797/3959/4660 10805/3966/4660 +f 10799/3969/4661 10798/3961/4661 10807/3970/4661 +f 10807/3970/4662 10798/3961/4662 10806/3968/4662 +f 10739/3901/4663 10799/3969/4663 10807/3970/4663 +f 10800/3962/4664 10720/3881/4664 10808/3971/4664 +f 10801/3963/4665 10800/3962/4665 10809/3972/4665 +f 10809/3972/4666 10800/3962/4666 10808/3971/4666 +f 10802/3964/4667 10801/3963/4667 10810/3973/4667 +f 10810/3973/4668 10801/3963/4668 10809/3972/4668 +f 10806/3968/4669 10805/3966/4669 10812/3974/4669 +f 10812/3974/4670 10805/3966/4670 10811/3975/4670 +f 10807/3970/4671 10806/3968/4671 10813/3976/4671 +f 10813/3976/4672 10806/3968/4672 10812/3974/4672 +f 10739/3901/4673 10807/3970/4673 10813/3976/4673 +f 10808/3971/4674 10720/3881/4674 10814/3977/4674 +f 10809/3972/4675 10808/3971/4675 10815/3978/4675 +f 10815/3978/4676 10808/3971/4676 10814/3977/4676 +f 10810/3973/4677 10809/3972/4677 10816/3979/4677 +f 10816/3979/4678 10809/3972/4678 10815/3978/4678 +f 10854/3980/4679 10810/3973/4679 10855/3981/4679 +f 10856/3981/4680 10810/3973/4680 10816/3979/4680 +f 10812/3974/4681 10811/3975/4681 10818/3982/4681 +f 10818/3982/4682 10811/3975/4682 10817/3983/4682 +f 10813/3976/4683 10812/3974/4683 10819/3984/4683 +f 10819/3984/4684 10812/3974/4684 10818/3982/4684 +f 10739/3901/4685 10813/3976/4685 10819/3984/4685 +f 10814/3977/4686 10720/3881/4686 10820/3985/4686 +f 10815/3978/4687 10814/3977/4687 10821/3986/4687 +f 10821/3986/4688 10814/3977/4688 10820/3985/4688 +f 10816/3979/4689 10815/3978/4689 10822/3987/4689 +f 10822/3987/4690 10815/3978/4690 10821/3986/4690 +f 10818/3982/4691 10817/3983/4691 10826/3988/4691 +f 10739/3901/4692 10819/3984/4692 10827/3989/4692 +f 10820/3985/4693 10720/3881/4693 10828/3990/4693 +f 10821/3986/4694 10820/3985/4694 10829/3991/4694 +f 10829/3991/4695 10820/3985/4695 10828/3990/4695 +f 10822/3987/4696 10821/3986/4696 10830/3992/4696 +f 10830/3992/4697 10821/3986/4697 10829/3991/4697 +f 10823/3993/4698 10822/3987/4698 10831/3994/4698 +f 10831/3994/4699 10822/3987/4699 10830/3992/4699 +f 10827/3989/4700 10826/3988/4700 10835/3995/4700 +f 10835/3995/4701 10826/3988/4701 10834/3996/4701 +f 10829/3991/4702 10828/3990/4702 10721/3880/4702 +f 10721/3880/4703 10828/3990/4703 10720/3881/4703 +f 10830/3992/4704 10829/3991/4704 10722/3884/4704 +f 10722/3884/4705 10829/3991/4705 10721/3880/4705 +f 10831/3994/4706 10830/3992/4706 10857/3886/4706 +f 10858/3886/4707 10830/3992/4707 10722/3884/4707 +f 10833/3997/4708 10832/3998/4708 10723/3889/4708 +f 10723/3889/4709 10832/3998/4709 10716/3844/4709 +f 10834/3996/4710 10833/3997/4710 10724/3888/4710 +f 10724/3888/4711 10833/3997/4711 10723/3889/4711 +f 10835/3995/4712 10834/3996/4712 10725/3892/4712 +f 10725/3892/4713 10834/3996/4713 10724/3888/4713 +f 10780/3941/4714 10840/3999/4714 10788/3951/4714 +f 10840/3999/4715 10841/4000/4715 10788/3951/4715 +f 10840/3999/4716 10847/4001/4716 10841/4000/4716 +f 10844/4002/4717 10787/3949/4717 10788/3951/4717 +f 10788/3951/4718 10841/4000/4718 10844/4002/4718 +f 10842/4003/4719 10841/4000/4719 10839/4004/4719 +f 10842/4003/4720 10844/4002/4720 10841/4000/4720 +f 10840/3999/4721 10780/3941/4721 10779/3940/4721 +f 10779/3940/4722 10843/4005/4722 10840/3999/4722 +f 10787/3949/4723 10844/4002/4723 10779/3940/4723 +f 10843/4005/4724 10779/3940/4724 10845/4006/4724 +f 10840/3999/4725 10843/4005/4725 10847/4001/4725 +f 10839/4004/4726 10841/4000/4726 10846/4007/4726 +f 10844/4002/4727 10842/4003/4727 10838/4008/4727 +f 10843/4005/4728 10845/4006/4728 10837/4009/4728 +f 10847/4001/4729 10843/4005/4729 10836/4010/4729 +f 10779/3940/4730 10844/4002/4730 10845/4006/4730 +f 10845/4006/4731 10844/4002/4731 10838/4008/4731 +f 10845/4006/4732 10838/4008/4732 10837/4009/4732 +f 10837/4009/4733 10838/4008/4733 10842/4003/4733 +f 10842/4003/4734 10843/4005/4734 10837/4009/4734 +f 10787/3949/4735 10794/3957/4735 10795/3958/4735 +f 10788/3951/4736 10787/3949/4736 10795/3958/4736 +f 10842/4003/4737 10839/4004/4737 10843/4005/4737 +f 10839/4004/4738 10836/4010/4738 10843/4005/4738 +f 10836/4010/4739 10839/4004/4739 10846/4007/4739 +f 10846/4007/4740 10847/4001/4740 10836/4010/4740 +f 10847/4001/4741 10846/4007/4741 10841/4000/4741 +f 10660/3872/4742 10824/4011/4742 10659/3874/4742 +f 10832/3998/4743 10824/4011/4743 10660/3872/4743 +f 10660/3872/4744 10716/3844/4744 10832/3998/4744 +f 10804/3967/4745 10715/3876/4745 10714/3875/4745 +f 10804/3967/4746 10796/3960/4746 10715/3876/4746 +f 10796/3960/4747 10673/3878/4747 10715/3876/4747 +f 10717/3851/4748 10772/3935/4748 10685/3818/4748 +f 10772/3935/4749 10764/3933/4749 10685/3818/4749 +f 10764/3933/4750 10712/3877/4750 10685/3818/4750 +f 10676/3843/4751 10686/3816/4751 10736/3899/4751 +f 10686/3816/4751 10744/3907/4751 10736/3899/4751 +f 10744/3907/4752 10686/3816/4752 10683/3813/4752 +f 10708/3840/4753 10718/3867/4753 10735/3897/4753 +f 10735/3897/4754 10743/3905/4754 10708/3840/4754 +f 10706/3838/4755 10708/3840/4755 10743/3905/4755 +f 10771/3932/4756 10719/3864/4756 10711/3834/4756 +f 10711/3834/4757 10763/3924/4757 10771/3932/4757 +f 10711/3834/4758 10710/3836/4758 10763/3924/4758 +f 10677/3848/4759 10859/4012/4759 10668/3847/4759 +f 10860/4012/4760 10861/4013/4760 10668/3847/4760 +f 10862/4013/4761 10667/3868/4761 10668/3847/4761 +f 10713/3869/4762 10667/3868/4762 10863/4013/4762 +f 10666/3870/4763 10864/4014/4763 10665/3871/4763 +f 10865/4014/4764 10866/4015/4764 10665/3871/4764 +f 10867/4015/4765 10680/3879/4765 10665/3871/4765 +f 10749/3910/4766 10748/3909/4766 10755/3918/4766 +f 10755/3918/4767 10748/3909/4767 10754/3916/4767 +f 10762/3923/4768 10763/3924/4768 10756/3917/4768 +f 10803/3965/4769 10802/3964/4769 10810/3973/4769 +f 10868/3980/4770 10803/3965/4770 10810/3973/4770 +f 10869/3981/4771 10816/3979/4771 10822/3987/4771 +f 10822/3987/4772 10823/3993/4772 10870/3981/4772 +f 10826/3988/4773 10825/4016/4773 10833/3997/4773 +f 10826/3988/4774 10833/3997/4774 10834/3996/4774 +f 10826/3988/4775 10817/3983/4775 10825/4016/4775 +f 10819/3984/4776 10818/3982/4776 10826/3988/4776 +f 10826/3988/4777 10827/3989/4777 10819/3984/4777 +f 10799/3969/4778 10791/3954/4778 10790/3952/4778 +f 10798/3961/4779 10799/3969/4779 10790/3952/4779 +f 10805/3966/4780 10804/3967/4780 10714/3875/4780 +f 10714/3875/4781 10811/3975/4781 10805/3966/4781 +f 10659/3874/4782 10817/3983/4782 10811/3975/4782 +f 10659/3874/4783 10824/4011/4783 10825/4016/4783 +f 10825/4016/4784 10817/3983/4784 10659/3874/4784 +f 10833/3997/4785 10825/4016/4785 10824/4011/4785 +f 10824/4011/4786 10832/3998/4786 10833/3997/4786 +f 10723/3889/4787 10716/3844/4787 10676/3843/4787 +f 10676/3843/4788 10729/3891/4788 10723/3889/4788 +f 10747/3914/4789 10739/3901/4789 10738/3900/4789 +f 10746/3908/4790 10747/3914/4790 10738/3900/4790 +f 10753/3915/4791 10752/3913/4791 10758/3919/4791 +f 10758/3919/4792 10759/3927/4792 10753/3915/4792 +f 10739/3901/4793 10747/3914/4793 10753/3915/4793 +f 10739/3901/4794 10753/3915/4794 10759/3927/4794 +f 10739/3901/4795 10759/3927/4795 10767/3928/4795 +f 10767/3928/4796 10775/3944/4796 10739/3901/4796 +f 10739/3901/4797 10783/3945/4797 10791/3954/4797 +f 10791/3954/4798 10799/3969/4798 10739/3901/4798 +f 10827/3989/4799 10835/3995/4799 10739/3901/4799 +f 10835/3995/4800 10725/3892/4800 10739/3901/4800 +f 10725/3892/4801 10731/3893/4801 10739/3901/4801 +f 10767/3928/4802 10766/3925/4802 10774/3936/4802 +f 10774/3936/4803 10775/3944/4803 10767/3928/4803 +f 10751/3912/4804 10683/3813/4804 10712/3877/4804 +f 10764/3933/4805 10765/3926/4805 10712/3877/4805 +f 10765/3926/4806 10757/3920/4806 10712/3877/4806 +f 10757/3920/4807 10751/3912/4807 10712/3877/4807 +f 10717/3851/4808 10673/3878/4808 10789/3953/4808 +f 10789/3953/4809 10781/3942/4809 10717/3851/4809 +f 10659/3874/4810 10811/3975/4810 10714/3875/4810 +f 10647/3873/4811 10681/3811/4811 10658/3849/4811 +f 10704/3835/4486 10703/3833/4486 10651/3863/4486 +f 10647/3873/4812 10682/3812/4812 10681/3811/4812 +f 10682/3812/4813 10647/3873/4813 10648/3860/4813 +f 10648/3860/4814 10689/3819/4814 10682/3812/4814 +o diesrehu +v -0.101007 0.095483 0.910240 +v -0.466117 0.114525 2.112727 +v -0.466113 0.095555 2.112726 +v -0.433249 0.095564 2.112734 +v -0.433256 0.114536 2.112735 +v -0.445459 0.121581 2.112732 +v -0.800347 0.946820 0.910339 +v -0.800001 0.946748 2.112063 +v -0.100786 1.015438 2.112143 +v -0.100823 1.015553 0.910444 +v -0.100965 0.122363 2.112811 +v -0.640063 0.861893 0.910022 +v -0.358989 0.492151 0.916695 +v -0.640079 0.861893 0.916695 +v -0.289797 0.861893 0.916695 +v -0.640152 0.708323 0.910022 +v -0.289797 0.122409 0.916695 +v -0.640152 0.212372 0.910021 +v -0.640063 0.122409 0.910022 +v -0.681146 0.175972 0.910022 +v -0.642814 0.178288 0.910022 +v -0.800098 0.122354 0.910022 +v -0.681146 0.273272 0.910022 +v -0.681146 0.671911 0.910022 +v -0.681146 0.769212 0.910022 +v -0.642825 0.766895 0.910022 +v -0.640159 0.736488 0.910022 +v -0.642825 0.270956 0.910022 +v -0.642814 0.674228 0.910022 +v -0.640159 0.240592 0.910022 +v -0.289782 0.122409 0.910022 +v -0.104247 0.545789 1.402032 +v -0.104251 0.545789 1.161450 +v -0.107593 0.821093 1.163104 +v -0.107592 0.821093 1.400360 +v -0.107593 0.674159 1.631422 +v -0.107593 0.563470 1.631422 +v -0.107593 0.547699 1.620274 +v -0.107593 0.821093 1.620274 +v -0.107592 0.695121 1.749918 +v -0.107593 0.805810 1.728574 +v -0.107593 0.805810 1.749918 +v -0.107593 0.695121 1.728574 +v -0.107592 0.547699 1.857530 +v -0.107593 0.563470 1.728574 +v -0.107593 0.674159 1.728574 +v -0.107592 0.674159 1.749918 +v -0.107593 0.563470 1.749918 +v -0.107592 0.563470 1.847070 +v -0.107592 0.821093 1.857530 +v -0.107592 0.674159 1.847070 +v -0.107592 0.695121 1.847070 +v -0.107592 0.805810 1.847070 +v -0.107593 0.805810 1.631422 +v -0.107593 0.695121 1.631422 +v -13.479593 14.484671 1.955962 +v -13.534984 12.837234 2.927241 +v -13.466154 11.168139 1.959777 +v -13.534967 9.498934 2.927236 +v -0.799965 0.122333 2.112651 +v -0.292076 0.095762 0.910209 +v -0.307056 0.110567 0.910065 +v -0.292068 0.118630 0.910037 +v -0.278102 0.110566 0.910073 +v -0.278265 0.100554 0.910141 +v -0.601498 0.093851 0.910044 +v -0.601497 0.110514 0.910022 +v -0.572545 0.093849 0.910052 +v -0.307194 0.100168 0.910133 +v -0.587020 0.118924 0.910022 +v -0.572544 0.110565 0.910022 +v -0.107593 0.674159 1.175333 +v -0.107593 0.563470 1.175333 +v -0.107592 0.695121 1.293829 +v -0.107593 0.805810 1.272485 +v -0.107593 0.805810 1.293829 +v -0.107593 0.695121 1.272485 +v -0.107593 0.563470 1.272485 +v -0.107593 0.674159 1.272485 +v -0.107592 0.674159 1.293829 +v -0.107593 0.563470 1.293829 +v -0.107592 0.563470 1.390981 +v -0.107592 0.674159 1.390981 +v -0.107592 0.695121 1.390981 +v -0.107592 0.805810 1.390981 +v -0.107593 0.805810 1.175333 +v -0.107593 0.695121 1.175333 +v -0.289797 0.861893 0.916695 +v -0.640079 0.861893 0.916695 +v -0.640063 0.861893 0.910022 +v -0.289797 0.861893 0.916695 +v -0.289797 0.122409 0.916695 +v -0.640159 0.736488 0.910022 +v -0.640063 0.861893 0.910022 +v -0.640079 0.861893 0.916695 +v -0.100965 0.122363 2.112811 +v -0.100965 0.122363 2.112811 +v -0.100965 0.122363 2.112811 +v -0.100786 1.015438 2.112143 +v -0.100786 1.015438 2.112143 +v -0.100786 1.015438 2.112143 +v -0.100823 1.015553 0.910444 +v -0.100823 1.015553 0.910444 +v -0.100823 1.015553 0.910444 +v -0.100823 1.015553 0.910444 +v -0.100823 1.015553 0.910444 +v -0.101007 0.095483 0.910240 +v -0.101007 0.095483 0.910240 +v -0.101007 0.095483 0.910240 +v -0.100965 0.122363 2.112811 +v -0.100965 0.122363 2.112811 +v -0.800001 0.946748 2.112063 +v -0.800347 0.946820 0.910339 +v -0.800098 0.122354 0.910022 +v -0.800001 0.946748 2.112063 +v -0.800098 0.122354 0.910022 +v -0.289782 0.122409 0.910022 +v -0.799965 0.122333 2.112651 +v -0.799965 0.122333 2.112651 +v -0.799965 0.122333 2.112651 +v -0.799965 0.122333 2.112651 +v -0.289782 0.122409 0.910022 +v -0.289782 0.122409 0.910022 +v -0.640063 0.122409 0.910022 +v -0.289797 0.122409 0.916695 +v -0.289782 0.122409 0.910022 +vt -0.000000 0.000124 +vt 0.999507 0.074648 +vt 0.000255 0.969063 +vt 0.770881 0.166713 +vt 1.000000 0.074571 +vt 0.000052 0.000000 +vt 0.270185 0.166713 +vt 0.000315 0.998227 +vt 0.771017 0.302771 +vt 0.770902 0.166713 +vt 0.771007 0.333328 +vt 0.369092 0.567864 +vt 0.771016 0.840792 +vt 0.771007 0.871409 +vt 0.270185 0.969014 +vt 0.774812 0.908388 +vt 0.770880 0.969014 +vt 0.829606 0.910902 +vt 0.999645 0.969074 +vt 0.829606 0.805336 +vt 0.829606 0.372833 +vt 0.829606 0.267267 +vt 0.774828 0.269780 +vt 0.774828 0.807849 +vt 0.774812 0.370319 +vt 0.270185 0.005548 +vt 0.770902 0.005548 +vt 0.770881 0.000000 +vt 0.166713 0.005548 +vt 0.969014 0.000000 +vt 0.969014 0.005548 +vt 0.302771 0.000000 +vt 0.166713 0.000000 +vt 0.210978 0.407668 +vt 0.210978 0.590504 +vt 0.509669 0.409058 +vt 0.507596 0.590504 +vt 0.969063 1.000000 +vt 0.507596 0.787759 +vt 0.000124 0.999444 +vt 0.210978 0.787759 +vt 0.000000 0.000351 +vt 0.210978 0.210413 +vt 0.998227 0.000182 +vt 0.509669 0.209037 +vt 0.370393 0.599772 +vt 0.490485 0.599772 +vt 0.347651 0.698290 +vt 0.227559 0.680544 +vt 0.227559 0.698290 +vt 0.347651 0.680545 +vt 0.490486 0.680545 +vt 0.370393 0.680545 +vt 0.370393 0.698290 +vt 0.490486 0.698290 +vt 0.490486 0.779062 +vt 0.370393 0.779062 +vt 0.347651 0.779062 +vt 0.227559 0.779062 +vt 0.227559 0.599773 +vt 0.347651 0.599772 +vt 0.074648 0.999377 +vt 0.074571 0.000263 +vt 0.969074 0.000000 +vt 0.969095 0.999867 +vt 0.270163 0.969014 +vt 0.715752 0.981920 +vt 0.715753 0.999998 +vt 0.695057 0.972795 +vt 0.999455 0.969095 +vt 0.492699 0.969911 +vt 0.522228 0.977567 +vt 0.475255 0.977555 +vt 0.475245 0.998138 +vt 0.522223 0.998149 +vt 0.253700 0.992726 +vt 0.253467 0.981864 +vt 0.273442 0.997926 +vt 0.273431 0.973115 +vt 0.294856 0.981862 +vt 0.674363 0.981865 +vt 0.295052 0.993145 +vt 0.674365 1.000000 +vt 0.770880 0.000000 +vt 0.270163 0.000000 +vt 0.370394 0.220580 +vt 0.490486 0.220580 +vt 0.347652 0.319097 +vt 0.227559 0.301352 +vt 0.227559 0.319097 +vt 0.347652 0.301352 +vt 0.490486 0.301352 +vt 0.370394 0.301352 +vt 0.370394 0.319097 +vt 0.490486 0.319097 +vt 0.490486 0.399870 +vt 0.370394 0.399870 +vt 0.347651 0.399870 +vt 0.227559 0.399869 +vt 0.227560 0.220580 +vt 0.347652 0.220580 +vn -0.000188 0.000748 1.000000 +vn -0.000182 0.003387 -0.999994 +vn 0.019010 -0.063969 -0.997771 +vn -0.033246 0.000228 -0.999447 +vn 0.000001 0.053137 -0.998587 +vn 0.019045 -0.000004 -0.999819 +vn 0.020744 -0.003881 -0.999777 +vn 0.023727 0.000001 -0.999718 +vn 0.023707 0.000022 -0.999719 +vn 0.020005 0.003745 -0.999793 +vn 0.000000 -0.000004 -1.000000 +vn -0.000021 -0.000005 -1.000000 +vn -0.000490 0.000384 -1.000000 +vn -0.002659 0.000001 -0.999996 +vn -0.002649 0.000005 -0.999996 +vn -0.001602 0.000708 -0.999998 +vn -0.000000 -0.000003 -1.000000 +vn -0.000089 0.000000 -1.000000 +vn 0.000012 0.000001 -1.000000 +vn -0.000096 -0.000001 -1.000000 +vn 0.000166 0.000001 -1.000000 +vn -0.000000 -1.000000 0.000009 +vn -0.999997 -0.000001 -0.002287 +vn 0.999997 -0.000763 0.002296 +vn 0.999926 0.012148 0.000002 +vn 0.999883 -0.000000 0.015326 +vn 0.999343 0.032975 0.015030 +vn 0.999879 0.015577 -0.000002 +vn 0.999654 -0.000220 -0.026316 +vn 0.999643 -0.000000 -0.026720 +vn 0.999389 -0.034952 -0.000034 +vn 0.999394 -0.034798 -0.000002 +vn 0.999395 -0.034782 0.000002 +vn 0.999395 -0.034793 -0.000002 +vn 0.999645 -0.000206 0.026625 +vn 0.999886 0.012188 -0.008935 +vn 0.999973 0.007315 -0.000198 +vn 0.999970 0.007722 -0.000017 +vn 1.000000 -0.000000 0.000001 +vn 1.000000 0.000004 0.000000 +vn 1.000000 -0.000000 -0.000024 +vn 1.000000 0.000032 0.000000 +vn 1.000000 -0.000005 0.000000 +vn 1.000000 -0.000003 -0.000005 +vn 1.000000 0.000000 -0.000003 +vn 1.000000 0.000001 -0.000002 +vn 1.000000 -0.000044 -0.000005 +vn 1.000000 0.000000 0.000003 +vn -1.000000 -0.000302 0.000287 +vn -1.000000 -0.000044 0.000110 +vn -0.000002 0.000000 -1.000000 +vn 0.002444 0.009024 -0.999956 +vn -0.000078 -0.001316 -0.999999 +vn -0.000227 0.000713 1.000000 +vn -0.000231 0.000712 1.000000 +vn -0.000229 -0.000006 1.000000 +vn -0.000230 -0.000026 1.000000 +vn -0.000229 -0.000038 1.000000 +vn -0.000230 -0.000050 1.000000 +vn 0.000232 0.000081 -1.000000 +vn 0.000366 -0.006769 -0.999977 +vn 0.000144 -0.014542 -0.999894 +vn 0.000651 -0.003426 -0.999994 +vn 0.000551 -0.004245 -0.999991 +vn 0.000047 -0.003576 -0.999994 +vn 0.000162 0.000280 -1.000000 +vn 0.000162 -0.006559 -0.999978 +vn 0.000347 -0.001826 -0.999998 +vn 0.000659 -0.014943 -0.999888 +vn -0.000298 -0.037955 0.999279 +vn -0.000000 -0.003911 -0.999992 +vn 0.000051 0.000775 -1.000000 +vn 0.019047 0.000013 -0.999819 +vn 0.972240 -0.000001 0.233985 +vn 0.990816 0.011215 0.134750 +vn 0.982607 0.185699 -0.000017 +vn 0.982567 0.185909 0.000000 +vn 0.982573 0.185876 -0.000005 +vn 0.961405 0.010010 -0.274957 +vn 1.000000 -0.000047 -0.000006 +vn 1.000000 0.000000 0.000002 +vn 0.982567 0.185907 0.000000 +s off +f 10879/4017/4815 10878/4018/4815 10881/4019/4815 +f 10882/4020/4816 10877/4021/4816 10880/4022/4816 +f 10885/4023/4817 10882/4020/4817 10880/4022/4817 +f 10871/4024/4818 10885/4023/4818 10880/4022/4818 +f 10897/4025/4819 10884/4026/4819 10885/4023/4819 +f 10897/4025/4820 10885/4023/4820 10886/4027/4820 +f 10886/4027/4821 10885/4023/4821 10883/4028/4821 +f 10886/4027/4822 10883/4028/4822 10900/4029/4822 +f 10883/4028/4823 10888/4030/4823 10900/4029/4823 +f 10883/4028/4357 10885/4023/4357 10887/4031/4357 +f 10888/4030/4824 10883/4028/4824 10887/4031/4824 +f 10891/4032/4825 10889/4033/4825 10890/4034/4825 +f 10888/4030/4826 10889/4033/4826 10891/4032/4826 +f 10892/4035/4827 10877/4021/4827 10893/4036/4827 +f 10893/4036/4828 10877/4021/4828 10894/4037/4828 +f 10894/4037/4829 10877/4021/4829 10895/4038/4829 +f 10877/4021/4830 10882/4020/4830 10895/4038/4830 +f 10882/4020/4831 10896/4039/4831 10895/4038/4831 +f 10896/4039/4832 10882/4020/4832 10897/4025/4832 +f 10893/4036/4833 10894/4037/4833 10898/4040/4833 +f 10898/4040/3722 10894/4037/3722 10899/4041/3722 +f 10899/4041/4834 10900/4029/4834 10898/4040/4834 +f 10899/4041/4835 10886/4027/4835 10900/4029/4835 +f 10958/4042/4836 10959/4043/4836 10960/4044/4836 +f 10961/4045/4837 10901/4046/4837 10962/4047/4837 +f 10963/4048/4838 10964/4049/4838 10965/4045/4838 +f 10905/4050/4839 10909/4051/4839 10902/4052/4839 +f 10909/4051/4840 10908/4053/4840 10902/4052/4840 +f 10902/4052/4841 10908/4053/4841 10966/4054/4841 +f 10908/4053/4842 10914/4055/4842 10967/4054/4842 +f 10968/4054/4843 10914/4055/4843 10969/4056/4843 +f 10914/4055/4844 10920/4057/4844 10970/4056/4844 +f 10971/4056/4845 10920/4057/4845 10972/4058/4845 +f 10920/4057/4846 10909/4051/4846 10973/4058/4846 +f 10909/4051/4847 10905/4050/4847 10974/4058/4847 +f 10905/4050/4848 10904/4059/4848 10975/4058/4848 +f 10976/4058/4849 10904/4059/4849 10977/4060/4849 +f 10904/4059/4850 10903/4061/4850 10978/4060/4850 +f 10979/4060/4851 10903/4061/4851 10980/4054/4851 +f 10981/4054/4852 10903/4061/4852 10902/4052/4852 +f 10906/4062/63 10907/4063/63 10908/4053/63 +f 10908/4053/4853 10909/4051/4853 10906/4062/4853 +f 10910/4064/4854 10911/4065/4854 10912/4066/4854 +f 10911/4065/4855 10910/4064/4855 10913/4067/4855 +f 10908/4053/4185 10907/4063/4185 10914/4055/4185 +f 10907/4063/4856 10915/4068/4856 10914/4055/4856 +f 10916/4069/4855 10917/4070/4855 10915/4068/4855 +f 10917/4070/4857 10918/4071/4857 10915/4068/4857 +f 10915/4068/4856 10918/4071/4856 10914/4055/4856 +f 10918/4071/4858 10919/4072/4858 10914/4055/4858 +f 10914/4055/63 10919/4072/63 10920/4057/63 +f 10919/4072/4859 10921/4073/4859 10920/4057/4859 +f 10921/4073/4859 10922/4074/4859 10920/4057/4859 +f 10922/4074/63 10923/4075/63 10920/4057/63 +f 10920/4057/4860 10923/4075/4860 10909/4051/4860 +f 10923/4075/4861 10912/4066/4861 10909/4051/4861 +f 10912/4066/63 10911/4065/63 10909/4051/63 +f 10911/4065/63 10924/4076/63 10909/4051/63 +f 10922/4074/63 10921/4073/63 10910/4064/63 +f 10921/4073/63 10917/4070/63 10910/4064/63 +f 10917/4070/4855 10916/4069/4855 10910/4064/4855 +f 10910/4064/4855 10916/4069/4855 10913/4067/4855 +f 10916/4069/63 10906/4062/63 10913/4067/63 +f 10913/4067/63 10906/4062/63 10925/4077/63 +f 10906/4062/4862 10909/4051/4862 10925/4077/4862 +f 10925/4077/63 10909/4051/63 10924/4076/63 +f 10982/4078/4863 10983/4079/4863 10984/4080/4863 +f 10930/4081/4864 10985/4078/4864 10986/4080/4864 +f 10892/4035/4865 10893/4036/4865 10890/4034/4865 +f 10892/4035/4825 10890/4034/4825 10889/4033/4825 +f 10885/4023/4866 10871/4024/4866 10987/4082/4866 +f 10892/4035/4867 10937/4083/4867 10936/4084/4867 +f 10937/4083/105 10892/4035/105 10889/4033/105 +f 10937/4083/105 10889/4033/105 10940/4085/105 +f 10878/4018/4868 10988/4086/4868 10876/4087/4868 +f 10881/4019/4869 10878/4018/4869 10876/4087/4869 +f 10876/4087/4870 10989/4086/4870 10872/4088/4870 +f 10881/4019/4871 10876/4087/4871 10875/4089/4871 +f 10881/4019/4872 10875/4089/4872 10874/4090/4872 +f 10873/4091/4873 10872/4088/4873 10990/4086/4873 +f 10874/4090/4874 10873/4091/4874 10991/4086/4874 +f 10871/4024/4875 10935/4092/4875 10934/4093/4875 +f 10871/4024/4876 10931/4094/4876 10935/4092/4876 +f 10871/4024/4877 10934/4093/4877 10933/4095/4877 +f 10871/4024/4878 10933/4095/4878 10992/4082/4878 +f 10940/4085/4879 10933/4095/4879 10932/4096/4879 +f 10940/4085/4880 10932/4096/4880 10941/4097/4880 +f 10941/4097/4881 10932/4096/4881 10939/4098/4881 +f 10939/4098/4882 10938/4099/4882 10941/4097/4882 +f 10938/4099/4883 10939/4098/4883 10931/4094/4883 +f 10931/4094/4884 10936/4084/4884 10938/4099/4884 +f 10889/4033/4885 10993/4082/4885 10933/4095/4885 +f 10933/4095/4886 10940/4085/4886 10889/4033/4886 +f 10994/4100/933 10995/4042/933 10996/4101/933 +f 10889/4033/4887 10888/4030/4887 10887/4031/4887 +f 10942/4102/4888 10943/4103/4888 10903/4061/4888 +f 10903/4061/4889 10904/4059/4889 10942/4102/4889 +f 10944/4104/4854 10945/4105/4854 10946/4106/4854 +f 10945/4105/4855 10944/4104/4855 10947/4107/4855 +f 10903/4061/4890 10943/4103/4890 10902/4052/4890 +f 10943/4103/4891 10948/4108/4891 10902/4052/4891 +f 10949/4109/4855 10950/4110/4855 10948/4108/4855 +f 10950/4110/4857 10951/4111/4857 10948/4108/4857 +f 10951/4111/4892 10952/4112/4892 10902/4052/4892 +f 10902/4052/4893 10952/4112/4893 10905/4050/4893 +f 10952/4112/4859 10953/4113/4859 10905/4050/4859 +f 10954/4114/63 10955/4115/63 10905/4050/63 +f 10905/4050/4860 10955/4115/4860 10904/4059/4860 +f 10955/4115/4894 10946/4106/4894 10904/4059/4894 +f 10945/4105/63 10956/4116/63 10904/4059/63 +f 10954/4114/63 10953/4113/63 10944/4104/63 +f 10953/4113/63 10950/4110/63 10944/4104/63 +f 10950/4110/4855 10949/4109/4855 10944/4104/4855 +f 10944/4104/4855 10949/4109/4855 10947/4107/4855 +f 10949/4109/63 10942/4102/63 10947/4107/63 +f 10947/4107/63 10942/4102/63 10957/4117/63 +f 10942/4102/4895 10904/4059/4895 10957/4117/4895 +f 10957/4117/63 10904/4059/63 10956/4116/63 +f 10902/4052/4896 10948/4108/4896 10951/4111/4896 +f 10946/4106/63 10945/4105/63 10904/4059/63 +f 10905/4050/4859 10953/4113/4859 10954/4114/4859 +o dieswast +v -0.831751 0.473587 -2.763217 +v -0.813035 0.473587 -2.763217 +v -0.831751 0.473587 -2.915788 +v -0.813035 0.473587 -2.915788 +v -0.831751 0.491832 -2.763217 +v -0.813035 0.491832 -2.763217 +v -0.831751 0.491832 -2.915788 +v -0.813035 0.491832 -2.915788 +v -0.798346 0.382801 -2.763217 +v -0.779630 0.382801 -2.763217 +v -0.798346 0.382801 -2.915788 +v -0.779630 0.382801 -2.915788 +v -0.798346 0.401046 -2.763217 +v -0.779630 0.401046 -2.763217 +v -0.798346 0.401046 -2.915788 +v -0.779630 0.401046 -2.915788 +v -0.764942 0.292015 -2.763217 +v -0.746226 0.292015 -2.763217 +v -0.764942 0.292015 -2.915788 +v -0.746226 0.292015 -2.915788 +v -0.764942 0.310260 -2.763217 +v -0.746226 0.310260 -2.763217 +v -0.764942 0.310260 -2.915788 +v -0.746226 0.310260 -2.915788 +v -0.731537 0.201229 -2.763217 +v -0.712821 0.201229 -2.763217 +v -0.731537 0.201229 -2.915788 +v -0.712821 0.201229 -2.915788 +v -0.731537 0.219474 -2.763217 +v -0.712821 0.219474 -2.763217 +v -0.731537 0.219474 -2.915788 +v -0.712821 0.219474 -2.915788 +v -0.698132 0.110443 -2.763217 +v -0.679416 0.110443 -2.763217 +v -0.698132 0.110443 -2.915788 +v -0.679416 0.110443 -2.915788 +v -0.698132 0.128688 -2.763217 +v -0.679416 0.128688 -2.763217 +v -0.698132 0.128688 -2.915788 +v -0.679416 0.128688 -2.915788 +v -0.990517 0.473587 -2.763217 +v -1.009233 0.473587 -2.763217 +v -0.990517 0.473587 -2.915788 +v -1.009233 0.473587 -2.915788 +v -0.990517 0.491832 -2.763217 +v -1.009233 0.491832 -2.763217 +v -0.990517 0.491832 -2.915788 +v -1.009233 0.491832 -2.915788 +v -1.023921 0.382801 -2.763217 +v -1.042637 0.382801 -2.763217 +v -1.023921 0.382801 -2.915788 +v -1.042637 0.382801 -2.915788 +v -1.023921 0.401046 -2.763217 +v -1.042637 0.401046 -2.763217 +v -1.023921 0.401046 -2.915788 +v -1.042637 0.401046 -2.915788 +v -1.057326 0.292015 -2.763217 +v -1.076042 0.292015 -2.763217 +v -1.057326 0.292015 -2.915788 +v -1.076042 0.292015 -2.915788 +v -1.057326 0.310260 -2.763217 +v -1.076042 0.310260 -2.763217 +v -1.057326 0.310260 -2.915788 +v -1.076042 0.310260 -2.915788 +v -1.090731 0.201229 -2.763217 +v -1.109447 0.201229 -2.763217 +v -1.090731 0.201229 -2.915788 +v -1.109447 0.201229 -2.915788 +v -1.090731 0.219474 -2.763217 +v -1.109447 0.219474 -2.763217 +v -1.090731 0.219474 -2.915788 +v -1.109447 0.219474 -2.915788 +v -1.124136 0.110443 -2.763217 +v -1.142851 0.110443 -2.763217 +v -1.124136 0.110443 -2.915788 +v -1.142851 0.110443 -2.915788 +v -1.124136 0.128688 -2.763217 +v -1.142851 0.128688 -2.763217 +v -1.124136 0.128688 -2.915788 +v -1.142851 0.128688 -2.915788 +v -0.816083 0.509859 -2.748582 +v -1.007656 0.509859 -2.748582 +v -0.816083 0.509859 -2.932427 +v -1.007656 0.509859 -2.932427 +v -0.820644 0.521511 -2.748582 +v -1.003095 0.521511 -2.748582 +v -0.820644 0.521511 -2.932427 +v -1.003095 0.521511 -2.932427 +v -0.696656 0.093283 -2.749060 +v -0.661219 0.093283 -2.749060 +v -0.696656 0.093283 -2.762797 +v -0.661219 0.093283 -2.762797 +v -0.852122 0.509832 -2.749060 +v -0.816684 0.509832 -2.749060 +v -0.852122 0.509832 -2.762797 +v -0.816684 0.509832 -2.762797 +v -1.127208 0.093283 -2.749060 +v -1.162645 0.093283 -2.749060 +v -1.127208 0.093283 -2.762797 +v -1.162645 0.093283 -2.762797 +v -0.971743 0.509832 -2.749060 +v -1.007180 0.509832 -2.749060 +v -0.971743 0.509832 -2.762797 +v -1.007180 0.509832 -2.762797 +v -0.696656 0.093283 -2.918105 +v -0.661219 0.093283 -2.918105 +v -0.696656 0.093283 -2.931842 +v -0.661219 0.093283 -2.931842 +v -0.852122 0.509832 -2.918105 +v -0.816684 0.509832 -2.918105 +v -0.852122 0.509832 -2.931842 +v -0.816684 0.509832 -2.931842 +v -1.127208 0.093283 -2.918105 +v -1.162645 0.093283 -2.918105 +v -1.127208 0.093283 -2.931842 +v -1.162645 0.093283 -2.931842 +v -0.971743 0.509832 -2.918105 +v -1.007180 0.509832 -2.918105 +v -0.971743 0.509832 -2.931842 +v -1.007180 0.509832 -2.931842 +v -2.718358 0.472506 -2.763302 +v -2.699643 0.472506 -2.763302 +v -2.718358 0.472506 -2.915873 +v -2.699643 0.472506 -2.915873 +v -2.718358 0.490751 -2.763302 +v -2.699643 0.490751 -2.763302 +v -2.718358 0.490751 -2.915873 +v -2.699643 0.490751 -2.915873 +v -2.684954 0.381720 -2.763302 +v -2.666238 0.381720 -2.763302 +v -2.684954 0.381720 -2.915873 +v -2.666238 0.381720 -2.915873 +v -2.684954 0.399965 -2.763302 +v -2.666238 0.399965 -2.763302 +v -2.684954 0.399964 -2.915873 +v -2.666238 0.399964 -2.915873 +v -2.651549 0.290934 -2.763302 +v -2.632833 0.290934 -2.763302 +v -2.651549 0.290934 -2.915873 +v -2.632833 0.290934 -2.915873 +v -2.651549 0.309178 -2.763302 +v -2.632833 0.309178 -2.763302 +v -2.651549 0.309178 -2.915873 +v -2.632833 0.309178 -2.915873 +v -2.618145 0.200148 -2.763302 +v -2.599429 0.200148 -2.763302 +v -2.618145 0.200148 -2.915873 +v -2.599429 0.200148 -2.915873 +v -2.618145 0.218392 -2.763302 +v -2.599429 0.218392 -2.763302 +v -2.618145 0.218392 -2.915873 +v -2.599429 0.218392 -2.915873 +v -2.584739 0.109362 -2.763302 +v -2.566024 0.109362 -2.763302 +v -2.584739 0.109362 -2.915873 +v -2.566024 0.109362 -2.915873 +v -2.584739 0.127606 -2.763302 +v -2.566024 0.127606 -2.763302 +v -2.584739 0.127606 -2.915873 +v -2.566024 0.127606 -2.915873 +v -2.877125 0.472506 -2.763302 +v -2.895840 0.472506 -2.763302 +v -2.877125 0.472506 -2.915873 +v -2.895840 0.472506 -2.915873 +v -2.877125 0.490750 -2.763302 +v -2.895840 0.490750 -2.763302 +v -2.877125 0.490750 -2.915873 +v -2.895840 0.490750 -2.915873 +v -2.910528 0.381720 -2.763302 +v -2.929244 0.381720 -2.763302 +v -2.910528 0.381720 -2.915873 +v -2.929244 0.381720 -2.915873 +v -2.910528 0.399965 -2.763302 +v -2.929244 0.399965 -2.763302 +v -2.910528 0.399964 -2.915873 +v -2.929244 0.399964 -2.915873 +v -2.943934 0.290934 -2.763302 +v -2.962649 0.290934 -2.763302 +v -2.943934 0.290934 -2.915873 +v -2.962649 0.290934 -2.915873 +v -2.943934 0.309178 -2.763302 +v -2.962649 0.309178 -2.763302 +v -2.943934 0.309178 -2.915873 +v -2.962649 0.309178 -2.915873 +v -2.977338 0.200148 -2.763302 +v -2.996054 0.200148 -2.763302 +v -2.977338 0.200148 -2.915873 +v -2.996054 0.200148 -2.915873 +v -2.977338 0.218392 -2.763302 +v -2.996054 0.218392 -2.763302 +v -2.977338 0.218392 -2.915873 +v -2.996054 0.218392 -2.915873 +v -3.010743 0.109362 -2.763302 +v -3.029459 0.109362 -2.763302 +v -3.010743 0.109362 -2.915873 +v -3.029459 0.109362 -2.915873 +v -3.010743 0.127606 -2.763302 +v -3.029459 0.127606 -2.763302 +v -3.010743 0.127606 -2.915873 +v -3.029459 0.127606 -2.915873 +v -2.702691 0.508778 -2.748667 +v -2.894263 0.508778 -2.748667 +v -2.702691 0.508778 -2.932512 +v -2.894263 0.508778 -2.932512 +v -2.707252 0.520430 -2.748667 +v -2.889702 0.520430 -2.748667 +v -2.707252 0.520430 -2.932512 +v -2.889702 0.520430 -2.932512 +v -2.583263 0.092202 -2.749145 +v -2.547826 0.092202 -2.749145 +v -2.583263 0.092202 -2.762882 +v -2.547826 0.092202 -2.762882 +v -2.738729 0.508751 -2.749145 +v -2.703292 0.508751 -2.749145 +v -2.738729 0.508751 -2.762882 +v -2.703292 0.508751 -2.762882 +v -3.013815 0.092202 -2.749145 +v -3.049253 0.092202 -2.749145 +v -3.013815 0.092202 -2.762882 +v -3.049253 0.092202 -2.762882 +v -2.858350 0.508751 -2.749145 +v -2.893787 0.508751 -2.749145 +v -2.858350 0.508751 -2.762882 +v -2.893787 0.508751 -2.762882 +v -2.583263 0.092202 -2.918190 +v -2.547826 0.092202 -2.918190 +v -2.583263 0.092202 -2.931927 +v -2.547826 0.092202 -2.931927 +v -2.738729 0.508751 -2.918190 +v -2.703292 0.508751 -2.918190 +v -2.738729 0.508751 -2.931927 +v -2.703292 0.508751 -2.931927 +v -3.013815 0.092202 -2.918190 +v -3.049253 0.092202 -2.918190 +v -3.013815 0.092202 -2.931927 +v -3.049253 0.092202 -2.931927 +v -2.858350 0.508751 -2.918190 +v -2.893787 0.508751 -2.918190 +v -2.858350 0.508751 -2.931927 +v -2.893787 0.508751 -2.931927 +v -2.039265 0.561766 2.501917 +v -2.018563 0.562510 2.501917 +v -2.039265 0.561766 2.327986 +v -2.018563 0.562510 2.327986 +v -2.040031 0.584368 2.501917 +v -2.019330 0.585112 2.501917 +v -2.040031 0.584368 2.327986 +v -2.019330 0.585112 2.327986 +v -1.998505 0.450623 2.501917 +v -1.977803 0.451367 2.501917 +v -1.998505 0.450623 2.327986 +v -1.977803 0.451367 2.327986 +v -1.999271 0.473225 2.501917 +v -1.978568 0.473970 2.501917 +v -1.999271 0.473225 2.327986 +v -1.978568 0.473970 2.327986 +v -1.957743 0.339481 2.501917 +v -1.937042 0.340225 2.501917 +v -1.957743 0.339481 2.327986 +v -1.937042 0.340225 2.327986 +v -1.958509 0.362083 2.501917 +v -1.937807 0.362827 2.501917 +v -1.958509 0.362083 2.327986 +v -1.937807 0.362827 2.327986 +v -1.916983 0.228338 2.501917 +v -1.896280 0.229082 2.501917 +v -1.916983 0.228338 2.327986 +v -1.896280 0.229082 2.327986 +v -1.917748 0.250940 2.501917 +v -1.897046 0.251684 2.501917 +v -1.917748 0.250940 2.327986 +v -1.897046 0.251684 2.327986 +v -1.876221 0.117195 2.501917 +v -1.855520 0.117939 2.501917 +v -1.876221 0.117195 2.327986 +v -1.855520 0.117939 2.327986 +v -1.876988 0.139798 2.501917 +v -1.856285 0.140542 2.501917 +v -1.876988 0.139798 2.327986 +v -1.856285 0.140542 2.327986 +v -2.202856 0.562519 2.501917 +v -2.223564 0.563077 2.501917 +v -2.202856 0.562519 2.327986 +v -2.223564 0.563077 2.327986 +v -2.202282 0.585128 2.501917 +v -2.222990 0.585686 2.501917 +v -2.202282 0.585128 2.327986 +v -2.222990 0.585686 2.327986 +v -2.242675 0.451015 2.501917 +v -2.263382 0.451573 2.501917 +v -2.242675 0.451015 2.327986 +v -2.263382 0.451573 2.327986 +v -2.242100 0.473623 2.501917 +v -2.262807 0.474181 2.501917 +v -2.242100 0.473623 2.327986 +v -2.262807 0.474181 2.327986 +v -2.282493 0.339510 2.501917 +v -2.303200 0.340068 2.501917 +v -2.282493 0.339510 2.327986 +v -2.303200 0.340068 2.327986 +v -2.281918 0.362118 2.501917 +v -2.302626 0.362677 2.501917 +v -2.281918 0.362118 2.327986 +v -2.302626 0.362677 2.327986 +v -2.322311 0.228005 2.501917 +v -2.343018 0.228564 2.501917 +v -2.322311 0.228005 2.327986 +v -2.343018 0.228564 2.327986 +v -2.321737 0.250614 2.501917 +v -2.342444 0.251172 2.501917 +v -2.321737 0.250614 2.327986 +v -2.342444 0.251172 2.327986 +v -2.362129 0.116501 2.501917 +v -2.382837 0.117059 2.501917 +v -2.362129 0.116501 2.327986 +v -2.382837 0.117059 2.327986 +v -2.361555 0.139109 2.501917 +v -2.382262 0.139667 2.501917 +v -2.361555 0.139109 2.327986 +v -2.382262 0.139667 2.327986 +v -2.023457 0.609319 2.518600 +v -2.220677 0.609973 2.518600 +v -2.023457 0.609319 2.309017 +v -2.220677 0.609973 2.309017 +v -2.028991 0.621578 2.518600 +v -2.215264 0.622281 2.518600 +v -2.028991 0.621578 2.309017 +v -2.215264 0.622281 2.309017 +v -1.873868 0.094593 2.518056 +v -1.834671 0.096002 2.518056 +v -1.873868 0.094593 2.502396 +v -1.834671 0.096002 2.502396 +v -2.063319 0.607853 2.518056 +v -2.024121 0.609262 2.518056 +v -2.063319 0.607853 2.502396 +v -2.024121 0.609262 2.502396 +v -2.366068 0.093925 2.518056 +v -2.405277 0.094982 2.518056 +v -2.366068 0.093925 2.502396 +v -2.405277 0.094982 2.502396 +v -2.180943 0.608868 2.518056 +v -2.220151 0.609925 2.518056 +v -2.180943 0.608868 2.502396 +v -2.220151 0.609925 2.502396 +v -1.873868 0.094593 2.325345 +v -1.834671 0.096002 2.325345 +v -1.873868 0.094593 2.309684 +v -1.834671 0.096002 2.309684 +v -2.063319 0.607852 2.325345 +v -2.024121 0.609262 2.325345 +v -2.063319 0.607852 2.309684 +v -2.024121 0.609262 2.309684 +v -2.366068 0.093925 2.325345 +v -2.405277 0.094982 2.325345 +v -2.366068 0.093925 2.309684 +v -2.405277 0.094982 2.309684 +v -2.180943 0.608868 2.325345 +v -2.220151 0.609925 2.325345 +v -2.180943 0.608868 2.309684 +v -2.220151 0.609925 2.309684 +vt 0.071411 0.031057 +vt 0.071411 0.003068 +vt 0.063574 0.003068 +vt 0.063574 0.031057 +vt 0.057423 0.031057 +vt 0.057423 0.003068 +vt 0.049585 0.003068 +vt 0.049585 0.031057 +vt 0.043434 0.031057 +vt 0.043434 0.003068 +vt 0.035597 0.003068 +vt 0.035597 0.031057 +vt 0.029446 0.031057 +vt 0.029446 0.003068 +vt 0.021609 0.003068 +vt 0.021609 0.031057 +vt 0.015458 0.031057 +vt 0.015458 0.003068 +vt 0.007620 0.003068 +vt 0.007620 0.031057 +vt 0.137895 0.003068 +vt 0.137895 0.031057 +vt 0.145732 0.003068 +vt 0.145732 0.031057 +vt 0.151883 0.003068 +vt 0.151883 0.031057 +vt 0.159721 0.003068 +vt 0.159721 0.031057 +vt 0.165872 0.003068 +vt 0.165872 0.031057 +vt 0.173709 0.003068 +vt 0.173709 0.031057 +vt 0.179860 0.003068 +vt 0.179860 0.031057 +vt 0.187697 0.003068 +vt 0.187697 0.031057 +vt 0.193848 0.003068 +vt 0.193848 0.031057 +vt 0.201686 0.003068 +vt 0.201686 0.031057 +vt 0.064850 0.000016 +vt 0.064850 0.033742 +vt 0.145072 0.000016 +vt 0.145072 0.033742 +vt 0.143162 0.033742 +vt 0.066760 0.033742 +vt 0.143162 0.000016 +vt 0.066760 0.000016 +vt 0.014839 0.033654 +vt 0.014839 0.031134 +vt -0.000000 0.031134 +vt -0.000000 0.033654 +vt 0.079941 0.033654 +vt 0.065102 0.033654 +vt 0.065102 0.031134 +vt 0.079941 0.031134 +vt 0.195135 0.031134 +vt 0.195135 0.033654 +vt 0.209974 0.031134 +vt 0.209974 0.033654 +vt 0.144873 0.033654 +vt 0.130033 0.033654 +vt 0.144873 0.031134 +vt 0.130033 0.031134 +vt 0.014839 0.002643 +vt 0.014839 0.000123 +vt -0.000000 0.000123 +vt -0.000000 0.002643 +vt 0.079941 0.002643 +vt 0.065102 0.002643 +vt 0.065102 0.000123 +vt 0.079941 0.000123 +vt 0.195135 0.000123 +vt 0.195135 0.002643 +vt 0.209974 0.000123 +vt 0.209974 0.002643 +vt 0.144873 0.002643 +vt 0.130033 0.002643 +vt 0.144873 0.000123 +vt 0.130033 0.000123 +vt 0.861437 0.031041 +vt 0.861437 0.003052 +vt 0.853599 0.003052 +vt 0.853599 0.031041 +vt 0.847448 0.031041 +vt 0.847448 0.003052 +vt 0.839611 0.003052 +vt 0.839611 0.031041 +vt 0.833460 0.031041 +vt 0.833460 0.003052 +vt 0.825623 0.003052 +vt 0.825623 0.031041 +vt 0.819472 0.031041 +vt 0.819472 0.003052 +vt 0.811634 0.003052 +vt 0.811634 0.031041 +vt 0.805483 0.031041 +vt 0.805483 0.003052 +vt 0.797646 0.003052 +vt 0.797646 0.031041 +vt 0.927921 0.003052 +vt 0.927921 0.031041 +vt 0.935758 0.003052 +vt 0.935758 0.031041 +vt 0.941909 0.003052 +vt 0.941909 0.031041 +vt 0.949746 0.003052 +vt 0.949746 0.031041 +vt 0.955897 0.003052 +vt 0.955897 0.031041 +vt 0.963735 0.003052 +vt 0.963735 0.031041 +vt 0.969886 0.003052 +vt 0.969886 0.031041 +vt 0.977723 0.003052 +vt 0.977723 0.031041 +vt 0.983874 0.003052 +vt 0.983874 0.031041 +vt 0.991711 0.003052 +vt 0.991711 0.031041 +vt 0.854876 0.000000 +vt 0.854876 0.033726 +vt 0.935098 0.000000 +vt 0.935098 0.033726 +vt 0.933188 0.033726 +vt 0.856786 0.033726 +vt 0.933188 0.000000 +vt 0.856786 0.000000 +vt 0.804865 0.033638 +vt 0.804865 0.031118 +vt 0.790026 0.031118 +vt 0.790026 0.033638 +vt 0.869967 0.033638 +vt 0.855127 0.033638 +vt 0.855127 0.031118 +vt 0.869967 0.031118 +vt 0.985161 0.031118 +vt 0.985161 0.033638 +vt 1.000000 0.031118 +vt 1.000000 0.033638 +vt 0.934898 0.033638 +vt 0.920059 0.033638 +vt 0.934898 0.031118 +vt 0.920059 0.031118 +vt 0.804865 0.002627 +vt 0.804865 0.000107 +vt 0.790026 0.000107 +vt 0.790026 0.002627 +vt 0.869967 0.002627 +vt 0.855127 0.002627 +vt 0.855127 0.000107 +vt 0.869967 0.000107 +vt 0.985161 0.000107 +vt 0.985161 0.002627 +vt 1.000000 0.000107 +vt 1.000000 0.002627 +vt 0.934898 0.002627 +vt 0.920059 0.002627 +vt 0.934898 0.000107 +vt 0.920059 0.000107 +vt 0.577064 0.996939 +vt 0.577064 0.965032 +vt 0.568395 0.965032 +vt 0.568395 0.996939 +vt 0.577384 0.996939 +vt 0.568715 0.996939 +vt 0.568715 0.965032 +vt 0.577384 0.965032 +vt 0.559995 0.996939 +vt 0.559995 0.965032 +vt 0.551326 0.965032 +vt 0.551326 0.996939 +vt 0.560316 0.996939 +vt 0.551647 0.996939 +vt 0.551647 0.965032 +vt 0.560316 0.965032 +vt 0.542926 0.996939 +vt 0.542926 0.965032 +vt 0.534257 0.965032 +vt 0.534257 0.996939 +vt 0.543247 0.996939 +vt 0.534578 0.996939 +vt 0.534578 0.965032 +vt 0.543247 0.965032 +vt 0.525857 0.996939 +vt 0.525857 0.965032 +vt 0.517188 0.965032 +vt 0.517188 0.996939 +vt 0.526178 0.996939 +vt 0.517509 0.996939 +vt 0.517509 0.965032 +vt 0.526178 0.965032 +vt 0.508788 0.996939 +vt 0.508788 0.965032 +vt 0.500119 0.965032 +vt 0.500119 0.996939 +vt 0.509109 0.996939 +vt 0.500440 0.996939 +vt 0.500440 0.965032 +vt 0.509109 0.965032 +vt 0.645568 0.965032 +vt 0.645568 0.996939 +vt 0.654239 0.965032 +vt 0.654239 0.996939 +vt 0.653999 0.996939 +vt 0.645328 0.996939 +vt 0.653999 0.965032 +vt 0.645328 0.965032 +vt 0.662242 0.965032 +vt 0.662242 0.996939 +vt 0.670913 0.965032 +vt 0.670913 0.996939 +vt 0.670673 0.996939 +vt 0.662001 0.996939 +vt 0.670673 0.965032 +vt 0.662001 0.965032 +vt 0.678916 0.965032 +vt 0.678916 0.996939 +vt 0.687587 0.965032 +vt 0.687587 0.996939 +vt 0.687347 0.996939 +vt 0.678676 0.996939 +vt 0.687347 0.965032 +vt 0.678676 0.965032 +vt 0.695590 0.965032 +vt 0.695590 0.996939 +vt 0.704262 0.965032 +vt 0.704262 0.996939 +vt 0.704021 0.996939 +vt 0.695350 0.996939 +vt 0.704021 0.965032 +vt 0.695350 0.965032 +vt 0.712264 0.965032 +vt 0.712264 0.996939 +vt 0.720936 0.965032 +vt 0.720936 0.996939 +vt 0.720695 0.996939 +vt 0.712024 0.996939 +vt 0.720695 0.965032 +vt 0.712024 0.965032 +vt 0.570444 0.961552 +vt 0.570444 1.000000 +vt 0.653031 0.961552 +vt 0.653031 1.000000 +vt 0.650764 1.000000 +vt 0.572761 1.000000 +vt 0.650764 0.961552 +vt 0.572761 0.961552 +vt 0.507803 0.999900 +vt 0.507803 0.997027 +vt 0.491389 0.997027 +vt 0.491389 0.999900 +vt 0.587136 0.999900 +vt 0.570722 0.999900 +vt 0.570722 0.997027 +vt 0.587136 0.997027 +vt 0.713914 0.997027 +vt 0.713914 0.999900 +vt 0.730333 0.997027 +vt 0.730333 0.999900 +vt 0.652810 0.999900 +vt 0.636392 0.999900 +vt 0.652810 0.997027 +vt 0.636392 0.997027 +vt 0.507803 0.964547 +vt 0.507803 0.961675 +vt 0.491389 0.961675 +vt 0.491389 0.964547 +vt 0.587136 0.964547 +vt 0.570722 0.964547 +vt 0.570722 0.961675 +vt 0.587136 0.961675 +vt 0.713914 0.961675 +vt 0.713914 0.964547 +vt 0.730333 0.961675 +vt 0.730333 0.964547 +vt 0.652810 0.964547 +vt 0.636392 0.964547 +vt 0.652810 0.961675 +vt 0.636392 0.961675 +vn -0.931195 0.364521 0.000000 +vn -0.931196 0.364519 -0.000000 +vn 0.931183 0.364552 -0.000000 +vn 0.931182 0.364554 -0.000000 +vn 0.936876 0.349663 -0.000000 +vn -0.936875 -0.349663 -0.000000 +vn -0.936876 0.349662 0.000000 +vn 0.936876 -0.349662 0.000000 +vn -0.931193 0.364528 0.000000 +vn -0.931193 0.364526 -0.000000 +vn 0.931200 0.364509 -0.000000 +vn 0.931199 0.364511 -0.000000 +vn 0.936875 0.349664 -0.000000 +vn -0.936875 -0.349664 -0.000000 +vn -0.936876 0.349663 0.000000 +vn 0.936876 -0.349663 0.000000 +vn 0.936875 0.349665 -0.000000 +vn 0.035929 -0.999354 0.000000 +vn 0.035926 -0.999354 0.000000 +vn -0.035929 0.999354 0.000000 +vn 0.999425 0.033894 -0.000000 +vn -0.999426 -0.033883 0.000000 +vn -0.035927 0.999354 -0.000000 +vn -0.035926 0.999354 0.000000 +vn 0.999426 0.033867 -0.000000 +vn -0.999426 -0.033867 0.000000 +vn 0.035927 -0.999354 0.000000 +vn -0.035928 0.999354 0.000000 +vn 0.999427 0.033852 -0.000000 +vn -0.999426 -0.033873 0.000000 +vn 0.035921 -0.999355 0.000000 +vn 0.035925 -0.999355 0.000001 +vn -0.035925 0.999354 -0.000000 +vn 0.999426 0.033873 -0.000000 +vn -0.999427 -0.033852 0.000000 +vn 0.035923 -0.999355 -0.000000 +vn -0.035921 0.999355 0.000000 +vn -0.035924 0.999355 -0.000000 +vn 0.999427 0.033851 -0.000000 +vn -0.999426 -0.033888 -0.000000 +vn -0.026949 -0.999637 0.000000 +vn -0.026946 -0.999637 0.000000 +vn 0.026946 0.999637 0.000000 +vn 0.026949 0.999637 -0.000000 +vn -0.999678 0.025386 0.000000 +vn 0.999678 -0.025386 0.000000 +vn -0.026950 -0.999637 0.000000 +vn 0.026950 0.999637 -0.000000 +vn 0.026948 0.999637 0.000000 +vn -0.999677 0.025407 -0.000000 +vn 0.999677 -0.025407 0.000000 +vn 0.999677 -0.025428 0.000000 +vn -0.999678 0.025365 -0.000000 +vn 0.999678 -0.025375 0.000000 +vn -0.026947 -0.999637 0.000000 +vn 0.026945 0.999637 -0.000000 +vn -0.003314 -0.999995 0.000000 +vn 0.003773 0.999993 0.000000 +vn -0.915369 0.402616 -0.000000 +vn -0.915368 0.402618 0.000000 +vn 0.911427 0.411462 -0.000000 +vn 0.911428 0.411460 0.000000 +vn 0.938133 0.346276 -0.000000 +vn -0.938133 -0.346276 -0.000000 +vn -0.941034 0.338310 0.000000 +vn 0.941035 -0.338309 0.000000 +vn 0.035925 -0.999354 0.000000 +vn 0.035927 -0.999354 0.000006 +vn 0.938133 0.346276 -0.000002 +s off +f 10997/4118/3 10999/4119/3 11000/4120/3 +f 10997/4118/3 11000/4120/3 10998/4121/3 +f 11001/4118/331 11002/4121/331 11004/4120/331 +f 11004/4120/331 11003/4119/331 11001/4118/331 +f 10997/4118/21 10998/4121/21 11002/4121/21 +f 10997/4118/21 11002/4121/21 11001/4118/21 +f 10998/4121/63 11000/4120/63 11004/4120/63 +f 11004/4120/63 11002/4121/63 10998/4121/63 +f 11000/4120/105 10999/4119/105 11003/4119/105 +f 11003/4119/105 11004/4120/105 11000/4120/105 +f 10999/4119/7 10997/4118/7 11001/4118/7 +f 11001/4118/7 11003/4119/7 10999/4119/7 +f 11005/4122/3 11007/4123/3 11008/4124/3 +f 11008/4124/3 11006/4125/3 11005/4122/3 +f 11009/4122/331 11010/4125/331 11012/4124/331 +f 11012/4124/331 11011/4123/331 11009/4122/331 +f 11005/4122/21 11006/4125/21 11010/4125/21 +f 11010/4125/21 11009/4122/21 11005/4122/21 +f 11006/4125/63 11008/4124/63 11012/4124/63 +f 11012/4124/63 11010/4125/63 11006/4125/63 +f 11008/4124/105 11007/4123/105 11011/4123/105 +f 11011/4123/105 11012/4124/105 11008/4124/105 +f 11007/4123/7 11005/4122/7 11009/4122/7 +f 11009/4122/7 11011/4123/7 11007/4123/7 +f 11013/4126/3 11015/4127/3 11016/4128/3 +f 11016/4128/3 11014/4129/3 11013/4126/3 +f 11017/4126/331 11018/4129/331 11020/4128/331 +f 11020/4128/331 11019/4127/331 11017/4126/331 +f 11013/4126/21 11014/4129/21 11018/4129/21 +f 11018/4129/21 11017/4126/21 11013/4126/21 +f 11014/4129/63 11016/4128/63 11020/4128/63 +f 11020/4128/63 11018/4129/63 11014/4129/63 +f 11016/4128/105 11015/4127/105 11019/4127/105 +f 11019/4127/105 11020/4128/105 11016/4128/105 +f 11015/4127/7 11013/4126/7 11017/4126/7 +f 11017/4126/7 11019/4127/7 11015/4127/7 +f 11021/4130/3 11023/4131/3 11024/4132/3 +f 11024/4132/3 11022/4133/3 11021/4130/3 +f 11025/4130/331 11026/4133/331 11028/4132/331 +f 11028/4132/331 11027/4131/331 11025/4130/331 +f 11021/4130/21 11022/4133/21 11026/4133/21 +f 11026/4133/21 11025/4130/21 11021/4130/21 +f 11022/4133/63 11024/4132/63 11028/4132/63 +f 11028/4132/63 11026/4133/63 11022/4133/63 +f 11024/4132/105 11023/4131/105 11027/4131/105 +f 11027/4131/105 11028/4132/105 11024/4132/105 +f 11023/4131/7 11021/4130/7 11025/4130/7 +f 11025/4130/7 11027/4131/7 11023/4131/7 +f 11029/4134/3 11031/4135/3 11032/4136/3 +f 11032/4136/3 11030/4137/3 11029/4134/3 +f 11033/4134/331 11034/4137/331 11036/4136/331 +f 11036/4136/331 11035/4135/331 11033/4134/331 +f 11029/4134/21 11030/4137/21 11034/4137/21 +f 11034/4137/21 11033/4134/21 11029/4134/21 +f 11030/4137/63 11032/4136/63 11036/4136/63 +f 11036/4136/63 11034/4137/63 11030/4137/63 +f 11032/4136/105 11031/4135/105 11035/4135/105 +f 11035/4135/105 11036/4136/105 11032/4136/105 +f 11031/4135/7 11029/4134/7 11033/4134/7 +f 11033/4134/7 11035/4135/7 11031/4135/7 +f 11039/4138/3 11037/4139/3 11040/4140/3 +f 11038/4141/3 11040/4140/3 11037/4139/3 +f 11042/4141/331 11041/4139/331 11044/4140/331 +f 11043/4138/331 11044/4140/331 11041/4139/331 +f 11038/4141/21 11037/4139/21 11042/4141/21 +f 11041/4139/21 11042/4141/21 11037/4139/21 +f 11040/4140/7 11038/4141/7 11044/4140/7 +f 11042/4141/7 11044/4140/7 11038/4141/7 +f 11039/4138/105 11040/4140/105 11043/4138/105 +f 11044/4140/105 11043/4138/105 11040/4140/105 +f 11037/4139/63 11039/4138/63 11041/4139/63 +f 11043/4138/63 11041/4139/63 11039/4138/63 +f 11047/4142/3 11045/4143/3 11048/4144/3 +f 11046/4145/3 11048/4144/3 11045/4143/3 +f 11050/4145/331 11049/4143/331 11052/4144/331 +f 11051/4142/331 11052/4144/331 11049/4143/331 +f 11046/4145/21 11045/4143/21 11050/4145/21 +f 11049/4143/21 11050/4145/21 11045/4143/21 +f 11048/4144/7 11046/4145/7 11052/4144/7 +f 11050/4145/7 11052/4144/7 11046/4145/7 +f 11047/4142/105 11048/4144/105 11051/4142/105 +f 11052/4144/105 11051/4142/105 11048/4144/105 +f 11045/4143/63 11047/4142/63 11049/4143/63 +f 11051/4142/63 11049/4143/63 11047/4142/63 +f 11055/4146/3 11053/4147/3 11056/4148/3 +f 11054/4149/3 11056/4148/3 11053/4147/3 +f 11058/4149/331 11057/4147/331 11060/4148/331 +f 11059/4146/331 11060/4148/331 11057/4147/331 +f 11054/4149/21 11053/4147/21 11058/4149/21 +f 11057/4147/21 11058/4149/21 11053/4147/21 +f 11056/4148/7 11054/4149/7 11060/4148/7 +f 11058/4149/7 11060/4148/7 11054/4149/7 +f 11055/4146/105 11056/4148/105 11059/4146/105 +f 11060/4148/105 11059/4146/105 11056/4148/105 +f 11053/4147/63 11055/4146/63 11057/4147/63 +f 11059/4146/63 11057/4147/63 11055/4146/63 +f 11063/4150/3 11061/4151/3 11064/4152/3 +f 11062/4153/3 11064/4152/3 11061/4151/3 +f 11066/4153/331 11065/4151/331 11068/4152/331 +f 11067/4150/331 11068/4152/331 11065/4151/331 +f 11062/4153/21 11061/4151/21 11066/4153/21 +f 11065/4151/21 11066/4153/21 11061/4151/21 +f 11064/4152/7 11062/4153/7 11068/4152/7 +f 11066/4153/7 11068/4152/7 11062/4153/7 +f 11063/4150/105 11064/4152/105 11067/4150/105 +f 11068/4152/105 11067/4150/105 11064/4152/105 +f 11061/4151/63 11063/4150/63 11065/4151/63 +f 11067/4150/63 11065/4151/63 11063/4150/63 +f 11071/4154/3 11069/4155/3 11072/4156/3 +f 11070/4157/3 11072/4156/3 11069/4155/3 +f 11074/4157/331 11073/4155/331 11076/4156/331 +f 11075/4154/331 11076/4156/331 11073/4155/331 +f 11070/4157/21 11069/4155/21 11074/4157/21 +f 11073/4155/21 11074/4157/21 11069/4155/21 +f 11072/4156/7 11070/4157/7 11076/4156/7 +f 11074/4157/7 11076/4156/7 11070/4157/7 +f 11071/4154/105 11072/4156/105 11075/4154/105 +f 11076/4156/105 11075/4154/105 11072/4156/105 +f 11069/4155/63 11071/4154/63 11073/4155/63 +f 11075/4154/63 11073/4155/63 11071/4154/63 +f 11079/4158/3 11077/4159/3 11080/4160/3 +f 11078/4161/3 11080/4160/3 11077/4159/3 +f 11082/4162/331 11081/4163/331 11084/4164/331 +f 11083/4165/331 11084/4164/331 11081/4163/331 +f 11078/4161/21 11077/4159/21 11082/4162/21 +f 11081/4163/21 11082/4162/21 11077/4159/21 +f 11080/4160/4897 11078/4161/4897 11084/4164/4897 +f 11082/4162/4898 11084/4164/4898 11078/4161/4898 +f 11079/4158/105 11080/4160/105 11083/4165/105 +f 11084/4164/105 11083/4165/105 11080/4160/105 +f 11077/4159/4899 11079/4158/4899 11081/4163/4899 +f 11083/4165/4900 11081/4163/4900 11079/4158/4900 +f 11085/4166/3 11087/4167/3 11088/4168/3 +f 11088/4168/3 11086/4169/3 11085/4166/3 +f 11089/4170/331 11090/4171/331 11092/4172/331 +f 11092/4172/331 11091/4173/331 11089/4170/331 +f 11085/4166/21 11086/4169/21 11090/4171/21 +f 11090/4171/21 11089/4170/21 11085/4166/21 +f 11086/4169/4901 11088/4168/4901 11092/4172/4901 +f 11092/4172/4901 11090/4171/4901 11086/4169/4901 +f 11088/4168/105 11087/4167/105 11091/4173/105 +f 11091/4173/105 11092/4172/105 11088/4168/105 +f 11087/4167/4902 11085/4166/4902 11089/4170/4902 +f 11089/4170/4902 11091/4173/4902 11087/4167/4902 +f 11095/4174/3 11093/4175/3 11096/4176/3 +f 11094/4177/3 11096/4176/3 11093/4175/3 +f 11098/4178/331 11097/4179/331 11100/4180/331 +f 11099/4181/331 11100/4180/331 11097/4179/331 +f 11094/4177/21 11093/4175/21 11098/4178/21 +f 11097/4179/21 11098/4178/21 11093/4175/21 +f 11096/4176/4903 11094/4177/4903 11100/4180/4903 +f 11098/4178/4903 11100/4180/4903 11094/4177/4903 +f 11095/4174/105 11096/4176/105 11099/4181/105 +f 11100/4180/105 11099/4181/105 11096/4176/105 +f 11093/4175/4904 11095/4174/4904 11097/4179/4904 +f 11099/4181/4904 11097/4179/4904 11095/4174/4904 +f 11101/4182/3 11103/4183/3 11104/4184/3 +f 11104/4184/3 11102/4185/3 11101/4182/3 +f 11105/4186/331 11106/4187/331 11108/4188/331 +f 11108/4188/331 11107/4189/331 11105/4186/331 +f 11101/4182/21 11102/4185/21 11106/4187/21 +f 11106/4187/21 11105/4186/21 11101/4182/21 +f 11102/4185/4901 11104/4184/4901 11108/4188/4901 +f 11108/4188/4901 11106/4187/4901 11102/4185/4901 +f 11104/4184/3722 11103/4183/3722 11107/4189/3722 +f 11107/4189/3722 11108/4188/3722 11104/4184/3722 +f 11103/4183/4902 11101/4182/4902 11105/4186/4902 +f 11105/4186/4902 11107/4189/4902 11103/4183/4902 +f 11111/4190/3 11109/4191/3 11112/4192/3 +f 11110/4193/3 11112/4192/3 11109/4191/3 +f 11114/4194/331 11113/4195/331 11116/4196/331 +f 11115/4197/331 11116/4196/331 11113/4195/331 +f 11110/4193/21 11109/4191/21 11114/4194/21 +f 11113/4195/21 11114/4194/21 11109/4191/21 +f 11112/4192/4903 11110/4193/4903 11116/4196/4903 +f 11114/4194/4903 11116/4196/4903 11110/4193/4903 +f 11111/4190/3722 11112/4192/3722 11115/4197/3722 +f 11116/4196/3722 11115/4197/3722 11112/4192/3722 +f 11109/4191/4904 11111/4190/4904 11113/4195/4904 +f 11115/4197/4904 11113/4195/4904 11111/4190/4904 +f 11117/4198/3 11119/4199/3 11120/4200/3 +f 11120/4200/3 11118/4201/3 11117/4198/3 +f 11121/4198/331 11122/4201/331 11124/4200/331 +f 11124/4200/331 11123/4199/331 11121/4198/331 +f 11117/4198/21 11118/4201/21 11122/4201/21 +f 11122/4201/21 11121/4198/21 11117/4198/21 +f 11118/4201/63 11120/4200/63 11124/4200/63 +f 11124/4200/63 11122/4201/63 11118/4201/63 +f 11120/4200/105 11119/4199/105 11123/4199/105 +f 11123/4199/105 11124/4200/105 11120/4200/105 +f 11119/4199/7 11117/4198/7 11121/4198/7 +f 11121/4198/7 11123/4199/7 11119/4199/7 +f 11125/4202/3 11127/4203/3 11128/4204/3 +f 11128/4204/3 11126/4205/3 11125/4202/3 +f 11129/4202/331 11130/4205/331 11132/4204/331 +f 11132/4204/331 11131/4203/331 11129/4202/331 +f 11125/4202/21 11126/4205/21 11130/4205/21 +f 11130/4205/21 11129/4202/21 11125/4202/21 +f 11126/4205/63 11128/4204/63 11132/4204/63 +f 11132/4204/63 11130/4205/63 11126/4205/63 +f 11128/4204/105 11127/4203/105 11131/4203/105 +f 11131/4203/105 11132/4204/105 11128/4204/105 +f 11127/4203/7 11125/4202/7 11129/4202/7 +f 11129/4202/7 11131/4203/7 11127/4203/7 +f 11133/4206/3 11135/4207/3 11136/4208/3 +f 11136/4208/3 11134/4209/3 11133/4206/3 +f 11137/4206/331 11138/4209/331 11140/4208/331 +f 11140/4208/331 11139/4207/331 11137/4206/331 +f 11133/4206/21 11134/4209/21 11138/4209/21 +f 11138/4209/21 11137/4206/21 11133/4206/21 +f 11134/4209/63 11136/4208/63 11140/4208/63 +f 11140/4208/63 11138/4209/63 11134/4209/63 +f 11136/4208/105 11135/4207/105 11139/4207/105 +f 11139/4207/105 11140/4208/105 11136/4208/105 +f 11135/4207/7 11133/4206/7 11137/4206/7 +f 11137/4206/7 11139/4207/7 11135/4207/7 +f 11141/4210/3 11143/4211/3 11144/4212/3 +f 11144/4212/3 11142/4213/3 11141/4210/3 +f 11145/4210/331 11146/4213/331 11148/4212/331 +f 11148/4212/331 11147/4211/331 11145/4210/331 +f 11141/4210/21 11142/4213/21 11146/4213/21 +f 11146/4213/21 11145/4210/21 11141/4210/21 +f 11142/4213/63 11144/4212/63 11148/4212/63 +f 11148/4212/63 11146/4213/63 11142/4213/63 +f 11144/4212/105 11143/4211/105 11147/4211/105 +f 11147/4211/105 11148/4212/105 11144/4212/105 +f 11143/4211/7 11141/4210/7 11145/4210/7 +f 11145/4210/7 11147/4211/7 11143/4211/7 +f 11149/4214/3 11151/4215/3 11152/4216/3 +f 11152/4216/3 11150/4217/3 11149/4214/3 +f 11153/4214/331 11154/4217/331 11156/4216/331 +f 11156/4216/331 11155/4215/331 11153/4214/331 +f 11149/4214/21 11150/4217/21 11154/4217/21 +f 11154/4217/21 11153/4214/21 11149/4214/21 +f 11150/4217/63 11152/4216/63 11156/4216/63 +f 11156/4216/63 11154/4217/63 11150/4217/63 +f 11152/4216/105 11151/4215/105 11155/4215/105 +f 11155/4215/105 11156/4216/105 11152/4216/105 +f 11151/4215/7 11149/4214/7 11153/4214/7 +f 11153/4214/7 11155/4215/7 11151/4215/7 +f 11159/4218/3 11157/4219/3 11160/4220/3 +f 11158/4221/3 11160/4220/3 11157/4219/3 +f 11162/4221/331 11161/4219/331 11164/4220/331 +f 11163/4218/331 11164/4220/331 11161/4219/331 +f 11158/4221/21 11157/4219/21 11162/4221/21 +f 11161/4219/21 11162/4221/21 11157/4219/21 +f 11160/4220/7 11158/4221/7 11164/4220/7 +f 11162/4221/7 11164/4220/7 11158/4221/7 +f 11159/4218/105 11160/4220/105 11163/4218/105 +f 11164/4220/105 11163/4218/105 11160/4220/105 +f 11157/4219/63 11159/4218/63 11161/4219/63 +f 11163/4218/63 11161/4219/63 11159/4218/63 +f 11167/4222/3 11165/4223/3 11168/4224/3 +f 11166/4225/3 11168/4224/3 11165/4223/3 +f 11170/4225/331 11169/4223/331 11172/4224/331 +f 11171/4222/331 11172/4224/331 11169/4223/331 +f 11166/4225/21 11165/4223/21 11170/4225/21 +f 11169/4223/21 11170/4225/21 11165/4223/21 +f 11168/4224/7 11166/4225/7 11172/4224/7 +f 11170/4225/7 11172/4224/7 11166/4225/7 +f 11167/4222/105 11168/4224/105 11171/4222/105 +f 11172/4224/105 11171/4222/105 11168/4224/105 +f 11165/4223/63 11167/4222/63 11169/4223/63 +f 11171/4222/63 11169/4223/63 11167/4222/63 +f 11175/4226/3 11173/4227/3 11176/4228/3 +f 11174/4229/3 11176/4228/3 11173/4227/3 +f 11178/4229/331 11177/4227/331 11180/4228/331 +f 11179/4226/331 11180/4228/331 11177/4227/331 +f 11174/4229/21 11173/4227/21 11178/4229/21 +f 11177/4227/21 11178/4229/21 11173/4227/21 +f 11176/4228/7 11174/4229/7 11180/4228/7 +f 11178/4229/7 11180/4228/7 11174/4229/7 +f 11175/4226/105 11176/4228/105 11179/4226/105 +f 11180/4228/105 11179/4226/105 11176/4228/105 +f 11173/4227/63 11175/4226/63 11177/4227/63 +f 11179/4226/63 11177/4227/63 11175/4226/63 +f 11183/4230/3 11181/4231/3 11184/4232/3 +f 11182/4233/3 11184/4232/3 11181/4231/3 +f 11186/4233/331 11185/4231/331 11188/4232/331 +f 11187/4230/331 11188/4232/331 11185/4231/331 +f 11182/4233/21 11181/4231/21 11186/4233/21 +f 11185/4231/21 11186/4233/21 11181/4231/21 +f 11184/4232/7 11182/4233/7 11188/4232/7 +f 11186/4233/7 11188/4232/7 11182/4233/7 +f 11183/4230/105 11184/4232/105 11187/4230/105 +f 11188/4232/105 11187/4230/105 11184/4232/105 +f 11181/4231/63 11183/4230/63 11185/4231/63 +f 11187/4230/63 11185/4231/63 11183/4230/63 +f 11191/4234/3 11189/4235/3 11192/4236/3 +f 11190/4237/3 11192/4236/3 11189/4235/3 +f 11194/4237/331 11193/4235/331 11196/4236/331 +f 11195/4234/331 11196/4236/331 11193/4235/331 +f 11190/4237/21 11189/4235/21 11194/4237/21 +f 11193/4235/21 11194/4237/21 11189/4235/21 +f 11192/4236/7 11190/4237/7 11196/4236/7 +f 11194/4237/7 11196/4236/7 11190/4237/7 +f 11191/4234/105 11192/4236/105 11195/4234/105 +f 11196/4236/105 11195/4234/105 11192/4236/105 +f 11189/4235/63 11191/4234/63 11193/4235/63 +f 11195/4234/63 11193/4235/63 11191/4234/63 +f 11199/4238/3 11197/4239/3 11200/4240/3 +f 11198/4241/3 11200/4240/3 11197/4239/3 +f 11202/4242/331 11201/4243/331 11204/4244/331 +f 11203/4245/331 11204/4244/331 11201/4243/331 +f 11198/4241/21 11197/4239/21 11202/4242/21 +f 11201/4243/21 11202/4242/21 11197/4239/21 +f 11200/4240/4905 11198/4241/4905 11204/4244/4905 +f 11202/4242/4906 11204/4244/4906 11198/4241/4906 +f 11199/4238/105 11200/4240/105 11203/4245/105 +f 11204/4244/105 11203/4245/105 11200/4240/105 +f 11197/4239/4907 11199/4238/4907 11201/4243/4907 +f 11203/4245/4908 11201/4243/4908 11199/4238/4908 +f 11205/4246/3 11207/4247/3 11208/4248/3 +f 11208/4248/3 11206/4249/3 11205/4246/3 +f 11209/4250/331 11210/4251/331 11212/4252/331 +f 11212/4252/331 11211/4253/331 11209/4250/331 +f 11205/4246/3743 11206/4249/3743 11210/4251/3743 +f 11210/4251/3743 11209/4250/3743 11205/4246/3743 +f 11206/4249/4909 11208/4248/4909 11212/4252/4909 +f 11212/4252/4909 11210/4251/4909 11206/4249/4909 +f 11208/4248/105 11207/4247/105 11211/4253/105 +f 11211/4253/105 11212/4252/105 11208/4248/105 +f 11207/4247/4910 11205/4246/4910 11209/4250/4910 +f 11209/4250/4910 11211/4253/4910 11207/4247/4910 +f 11215/4254/3 11213/4255/3 11216/4256/3 +f 11214/4257/3 11216/4256/3 11213/4255/3 +f 11218/4258/331 11217/4259/331 11220/4260/331 +f 11219/4261/331 11220/4260/331 11217/4259/331 +f 11214/4257/3743 11213/4255/3743 11218/4258/3743 +f 11217/4259/3743 11218/4258/3743 11213/4255/3743 +f 11216/4256/4911 11214/4257/4911 11220/4260/4911 +f 11218/4258/4911 11220/4260/4911 11214/4257/4911 +f 11215/4254/105 11216/4256/105 11219/4261/105 +f 11220/4260/105 11219/4261/105 11216/4256/105 +f 11213/4255/4912 11215/4254/4912 11217/4259/4912 +f 11219/4261/4912 11217/4259/4912 11215/4254/4912 +f 11221/4262/3 11223/4263/3 11224/4264/3 +f 11224/4264/3 11222/4265/3 11221/4262/3 +f 11225/4266/331 11226/4267/331 11228/4268/331 +f 11228/4268/331 11227/4269/331 11225/4266/331 +f 11221/4262/21 11222/4265/21 11226/4267/21 +f 11226/4267/21 11225/4266/21 11221/4262/21 +f 11222/4265/4913 11224/4264/4913 11228/4268/4913 +f 11228/4268/4913 11226/4267/4913 11222/4265/4913 +f 11224/4264/105 11223/4263/105 11227/4269/105 +f 11227/4269/105 11228/4268/105 11224/4264/105 +f 11223/4263/4910 11221/4262/4910 11225/4266/4910 +f 11225/4266/4910 11227/4269/4910 11223/4263/4910 +f 11231/4270/3 11229/4271/3 11232/4272/3 +f 11230/4273/3 11232/4272/3 11229/4271/3 +f 11234/4274/331 11233/4275/331 11236/4276/331 +f 11235/4277/331 11236/4276/331 11233/4275/331 +f 11230/4273/21 11229/4271/21 11234/4274/21 +f 11233/4275/21 11234/4274/21 11229/4271/21 +f 11232/4272/4911 11230/4273/4911 11236/4276/4911 +f 11234/4274/4911 11236/4276/4911 11230/4273/4911 +f 11231/4270/105 11232/4272/105 11235/4277/105 +f 11236/4276/105 11235/4277/105 11232/4272/105 +f 11229/4271/4912 11231/4270/4912 11233/4275/4912 +f 11235/4277/4912 11233/4275/4912 11231/4270/4912 +f 11237/4278/4914 11239/4279/4914 11240/4280/4914 +f 11240/4280/4915 11238/4281/4915 11237/4278/4915 +f 11241/4282/4916 11242/4283/4916 11244/4284/4916 +f 11244/4284/4916 11243/4285/4916 11241/4282/4916 +f 11237/4278/21 11238/4281/21 11242/4283/21 +f 11242/4283/21 11241/4282/21 11237/4278/21 +f 11238/4281/4917 11240/4280/4917 11244/4284/4917 +f 11244/4284/4917 11242/4283/4917 11238/4281/4917 +f 11240/4280/105 11239/4279/105 11243/4285/105 +f 11243/4285/105 11244/4284/105 11240/4280/105 +f 11239/4279/4918 11237/4278/4918 11241/4282/4918 +f 11241/4282/4918 11243/4285/4918 11239/4279/4918 +f 11245/4286/4915 11247/4287/4915 11248/4288/4915 +f 11248/4288/4915 11246/4289/4915 11245/4286/4915 +f 11249/4290/4919 11250/4291/4919 11252/4292/4919 +f 11252/4292/4920 11251/4293/4920 11249/4290/4920 +f 11245/4286/21 11246/4289/21 11250/4291/21 +f 11250/4291/21 11249/4290/21 11245/4286/21 +f 11246/4289/4921 11248/4288/4921 11252/4292/4921 +f 11252/4292/4921 11250/4291/4921 11246/4289/4921 +f 11248/4288/105 11247/4287/105 11251/4293/105 +f 11251/4293/105 11252/4292/105 11248/4288/105 +f 11247/4287/4922 11245/4286/4922 11249/4290/4922 +f 11249/4290/4922 11251/4293/4922 11247/4287/4922 +f 11253/4294/4923 11255/4295/4923 11256/4296/4923 +f 11256/4296/4915 11254/4297/4915 11253/4294/4915 +f 11257/4298/4916 11258/4299/4916 11260/4300/4916 +f 11260/4300/4924 11259/4301/4924 11257/4298/4924 +f 11253/4294/21 11254/4297/21 11258/4299/21 +f 11258/4299/21 11257/4298/21 11253/4294/21 +f 11254/4297/4925 11256/4296/4925 11260/4300/4925 +f 11260/4300/4925 11258/4299/4925 11254/4297/4925 +f 11256/4296/105 11255/4295/105 11259/4301/105 +f 11259/4301/105 11260/4300/105 11256/4296/105 +f 11255/4295/4926 11253/4294/4926 11257/4298/4926 +f 11257/4298/4926 11259/4301/4926 11255/4295/4926 +f 11261/4302/4927 11263/4303/4927 11264/4304/4927 +f 11264/4304/4928 11262/4305/4928 11261/4302/4928 +f 11265/4306/4919 11266/4307/4919 11268/4308/4919 +f 11268/4308/4929 11267/4309/4929 11265/4306/4929 +f 11261/4302/21 11262/4305/21 11266/4307/21 +f 11266/4307/21 11265/4306/21 11261/4302/21 +f 11262/4305/4930 11264/4304/4930 11268/4308/4930 +f 11268/4308/4930 11266/4307/4930 11262/4305/4930 +f 11264/4304/105 11263/4303/105 11267/4309/105 +f 11267/4309/105 11268/4308/105 11264/4304/105 +f 11263/4303/4931 11261/4302/4931 11265/4306/4931 +f 11265/4306/4931 11267/4309/4931 11263/4303/4931 +f 11269/4310/4932 11271/4311/4932 11272/4312/4932 +f 11272/4312/4923 11270/4313/4923 11269/4310/4923 +f 11273/4314/4933 11274/4315/4933 11276/4316/4933 +f 11276/4316/4934 11275/4317/4934 11273/4314/4934 +f 11269/4310/21 11270/4313/21 11274/4315/21 +f 11274/4315/21 11273/4314/21 11269/4310/21 +f 11270/4313/4935 11272/4312/4935 11276/4316/4935 +f 11276/4316/4925 11274/4315/4925 11270/4313/4925 +f 11272/4312/105 11271/4311/105 11275/4317/105 +f 11275/4317/105 11276/4316/105 11272/4312/105 +f 11271/4311/4936 11269/4310/4936 11273/4314/4936 +f 11273/4314/4936 11275/4317/4936 11271/4311/4936 +f 11279/4318/4937 11277/4319/4937 11280/4320/4937 +f 11278/4321/4938 11280/4320/4938 11277/4319/4938 +f 11282/4322/4939 11281/4323/4939 11284/4324/4939 +f 11283/4325/4940 11284/4324/4940 11281/4323/4940 +f 11278/4321/21 11277/4319/21 11282/4322/21 +f 11281/4323/21 11282/4322/21 11277/4319/21 +f 11280/4320/4941 11278/4321/4941 11284/4324/4941 +f 11282/4322/4941 11284/4324/4941 11278/4321/4941 +f 11279/4318/105 11280/4320/105 11283/4325/105 +f 11284/4324/105 11283/4325/105 11280/4320/105 +f 11277/4319/4942 11279/4318/4942 11281/4323/4942 +f 11283/4325/4942 11281/4323/4942 11279/4318/4942 +f 11287/4326/4943 11285/4327/4943 11288/4328/4943 +f 11286/4329/4943 11288/4328/4943 11285/4327/4943 +f 11290/4330/4944 11289/4331/4944 11292/4332/4944 +f 11291/4333/4945 11292/4332/4945 11289/4331/4945 +f 11286/4329/21 11285/4327/21 11290/4330/21 +f 11289/4331/21 11290/4330/21 11285/4327/21 +f 11288/4328/4946 11286/4329/4946 11292/4332/4946 +f 11290/4330/4946 11292/4332/4946 11286/4329/4946 +f 11287/4326/105 11288/4328/105 11291/4333/105 +f 11292/4332/105 11291/4333/105 11288/4328/105 +f 11285/4327/4947 11287/4326/4947 11289/4331/4947 +f 11291/4333/4947 11289/4331/4947 11287/4326/4947 +f 11295/4334/4943 11293/4335/4943 11296/4336/4943 +f 11294/4337/4943 11296/4336/4943 11293/4335/4943 +f 11298/4338/4945 11297/4339/4945 11300/4340/4945 +f 11299/4341/4945 11300/4340/4945 11297/4339/4945 +f 11294/4337/21 11293/4335/21 11298/4338/21 +f 11297/4339/21 11298/4338/21 11293/4335/21 +f 11296/4336/4946 11294/4337/4946 11300/4340/4946 +f 11298/4338/4946 11300/4340/4946 11294/4337/4946 +f 11295/4334/105 11296/4336/105 11299/4341/105 +f 11300/4340/105 11299/4341/105 11296/4336/105 +f 11293/4335/4948 11295/4334/4948 11297/4339/4948 +f 11299/4341/4948 11297/4339/4948 11295/4334/4948 +f 11303/4342/4943 11301/4343/4943 11304/4344/4943 +f 11302/4345/4943 11304/4344/4943 11301/4343/4943 +f 11306/4346/4940 11305/4347/4940 11308/4348/4940 +f 11307/4349/4940 11308/4348/4940 11305/4347/4940 +f 11302/4345/21 11301/4343/21 11306/4346/21 +f 11305/4347/21 11306/4346/21 11301/4343/21 +f 11304/4344/4949 11302/4345/4949 11308/4348/4949 +f 11306/4346/4949 11308/4348/4949 11302/4345/4949 +f 11303/4342/105 11304/4344/105 11307/4349/105 +f 11308/4348/105 11307/4349/105 11304/4344/105 +f 11301/4343/4950 11303/4342/4950 11305/4347/4950 +f 11307/4349/4950 11305/4347/4950 11303/4342/4950 +f 11311/4350/4951 11309/4351/4951 11312/4352/4951 +f 11310/4353/4951 11312/4352/4951 11309/4351/4951 +f 11314/4354/4952 11313/4355/4952 11316/4356/4952 +f 11315/4357/4952 11316/4356/4952 11313/4355/4952 +f 11310/4353/21 11309/4351/21 11314/4354/21 +f 11313/4355/21 11314/4354/21 11309/4351/21 +f 11312/4352/4946 11310/4353/4946 11316/4356/4946 +f 11314/4354/4946 11316/4356/4946 11310/4353/4946 +f 11311/4350/105 11312/4352/105 11315/4357/105 +f 11316/4356/105 11315/4357/105 11312/4352/105 +f 11309/4351/4947 11311/4350/4947 11313/4355/4947 +f 11315/4357/4947 11313/4355/4947 11311/4350/4947 +f 11319/4358/4953 11317/4359/4953 11320/4360/4953 +f 11318/4361/4953 11320/4360/4953 11317/4359/4953 +f 11322/4362/4954 11321/4363/4954 11324/4364/4954 +f 11323/4365/4954 11324/4364/4954 11321/4363/4954 +f 11318/4361/21 11317/4359/21 11322/4362/21 +f 11321/4363/21 11322/4362/21 11317/4359/21 +f 11320/4360/4955 11318/4361/4955 11324/4364/4955 +f 11322/4362/4956 11324/4364/4956 11318/4361/4956 +f 11319/4358/105 11320/4360/105 11323/4365/105 +f 11324/4364/105 11323/4365/105 11320/4360/105 +f 11317/4359/4957 11319/4358/4957 11321/4363/4957 +f 11323/4365/4958 11321/4363/4958 11319/4358/4958 +f 11325/4366/4923 11327/4367/4923 11328/4368/4923 +f 11328/4368/4923 11326/4369/4923 11325/4366/4923 +f 11329/4370/4919 11330/4371/4919 11332/4372/4919 +f 11332/4372/4919 11331/4373/4919 11329/4370/4919 +f 11325/4366/21 11326/4369/21 11330/4371/21 +f 11330/4371/21 11329/4370/21 11325/4366/21 +f 11326/4369/4959 11328/4368/4959 11332/4372/4959 +f 11332/4372/4959 11330/4371/4959 11326/4369/4959 +f 11328/4368/105 11327/4367/105 11331/4373/105 +f 11331/4373/105 11332/4372/105 11328/4368/105 +f 11327/4367/4960 11325/4366/4960 11329/4370/4960 +f 11329/4370/4960 11331/4373/4960 11327/4367/4960 +f 11335/4374/4938 11333/4375/4938 11336/4376/4938 +f 11334/4377/4938 11336/4376/4938 11333/4375/4938 +f 11338/4378/4945 11337/4379/4945 11340/4380/4945 +f 11339/4381/4945 11340/4380/4945 11337/4379/4945 +f 11334/4377/21 11333/4375/21 11338/4378/21 +f 11337/4379/21 11338/4378/21 11333/4375/21 +f 11336/4376/4961 11334/4377/4961 11340/4380/4961 +f 11338/4378/4961 11340/4380/4961 11334/4377/4961 +f 11335/4374/105 11336/4376/105 11339/4381/105 +f 11340/4380/105 11339/4381/105 11336/4376/105 +f 11333/4375/4962 11335/4374/4962 11337/4379/4962 +f 11339/4381/4962 11337/4379/4962 11335/4374/4962 +f 11341/4382/4963 11343/4383/4963 11344/4384/4963 +f 11344/4384/4964 11342/4385/4964 11341/4382/4964 +f 11345/4386/4919 11346/4387/4919 11348/4388/4919 +f 11348/4388/4919 11347/4389/4919 11345/4386/4919 +f 11341/4382/21 11342/4385/21 11346/4387/21 +f 11346/4387/21 11345/4386/21 11341/4382/21 +f 11342/4385/4965 11344/4384/4965 11348/4388/4965 +f 11348/4388/4959 11346/4387/4959 11342/4385/4959 +f 11344/4384/105 11343/4383/105 11347/4389/105 +f 11347/4389/105 11348/4388/105 11344/4384/105 +f 11343/4383/4960 11341/4382/4960 11345/4386/4960 +f 11345/4386/4960 11347/4389/4960 11343/4383/4960 +f 11351/4390/4938 11349/4391/4938 11352/4392/4938 +f 11350/4393/4938 11352/4392/4938 11349/4391/4938 +f 11354/4394/4945 11353/4395/4945 11356/4396/4945 +f 11355/4397/4945 11356/4396/4945 11353/4395/4945 +f 11350/4393/21 11349/4391/21 11354/4394/21 +f 11353/4395/21 11354/4394/21 11349/4391/21 +f 11352/4392/4961 11350/4393/4961 11356/4396/4961 +f 11354/4394/4961 11356/4396/4961 11350/4393/4961 +f 11351/4390/105 11352/4392/105 11355/4397/105 +f 11356/4396/105 11355/4397/105 11352/4392/105 +f 11349/4391/4962 11351/4390/4962 11353/4395/4962 +f 11355/4397/4962 11353/4395/4962 11351/4390/4962 +o diescel1 +v 1.568650 0.939638 4.205615 +v 1.566468 0.970314 4.145766 +v 1.568531 0.941317 4.095775 +v 1.566468 0.970314 4.045747 +v 1.568531 0.941317 3.995721 +v 1.566468 0.970314 3.945694 +v 1.568129 0.939765 3.895751 +v 1.566468 0.970314 3.846585 +v 1.568530 0.941317 3.796558 +v 1.566468 0.970314 3.746531 +v 1.568118 0.941307 3.697373 +v 1.566467 0.970314 3.645339 +v 1.568530 0.941317 3.596447 +v 1.566467 0.970314 3.546419 +v 1.568530 0.941317 3.497529 +v 1.566467 0.970314 3.447502 +v 1.568530 0.941317 3.397475 +v 1.566467 0.970315 3.347448 +v 1.568530 0.941318 3.296745 +v 1.566467 0.970315 3.246718 +v 1.568122 0.940530 3.196421 +v 1.566467 0.970315 3.147801 +v 1.568530 0.941318 3.097774 +v 1.566467 0.970315 3.047747 +v 1.568529 0.941318 2.998277 +v 1.566466 0.970315 2.948250 +v 1.568119 0.940566 2.899584 +v 1.566466 0.970315 2.848195 +v 1.568529 0.941318 2.798165 +v 1.566466 0.970315 2.748138 +v 1.568118 0.941276 2.698358 +v 1.566466 0.970315 2.649002 +v 1.568529 0.941318 2.598942 +v 1.566466 0.970315 2.549357 +v 1.568529 0.941318 2.499330 +v 1.566466 0.970316 2.449302 +v 1.568528 0.941319 2.400410 +v 1.566466 0.970316 2.350380 +v 1.568528 0.941319 2.300355 +v 1.566465 0.970316 2.250622 +v 1.568111 0.939970 2.201785 +v 1.566465 0.970317 2.150519 +v 1.568678 0.939216 2.093021 +v 0.802168 0.887129 2.091790 +v 0.800954 0.917680 2.150144 +v 0.803017 0.888684 2.200220 +v 0.800954 0.917681 2.250247 +v 0.802608 0.888667 2.298717 +v 0.800954 0.917681 2.350379 +v 0.802606 0.888701 2.400319 +v 0.800954 0.917681 2.449301 +v 0.803017 0.888684 2.499329 +v 0.800955 0.917681 2.549356 +v 0.802603 0.888575 2.597593 +v 0.800955 0.917681 2.649001 +v 0.802615 0.888569 2.698760 +v 0.800955 0.917681 2.748137 +v 0.803018 0.888684 2.798164 +v 0.800955 0.917681 2.848194 +v 0.802608 0.888676 2.898180 +v 0.800955 0.917680 2.948248 +v 0.803018 0.888683 2.998275 +v 0.800955 0.917680 3.047746 +v 0.802599 0.886698 3.096807 +v 0.800955 0.917680 3.147799 +v 0.803018 0.888683 3.197827 +v 0.800956 0.917680 3.246717 +v 0.803018 0.888683 3.296744 +v 0.800956 0.917680 3.347447 +v 0.803019 0.888683 3.397474 +v 0.800956 0.917680 3.447501 +v 0.803019 0.888683 3.497528 +v 0.800956 0.917680 3.546418 +v 0.802611 0.888662 3.594321 +v 0.800956 0.917680 3.645338 +v 0.802607 0.888715 3.697372 +v 0.800956 0.917680 3.746530 +v 0.802608 0.888697 3.795832 +v 0.800957 0.917679 3.846584 +v 0.802618 0.887875 3.895750 +v 0.800957 0.917679 3.945693 +v 0.803019 0.888682 3.995719 +v 0.800957 0.917679 4.045746 +v 0.802606 0.888749 4.095835 +v 0.801131 0.918595 4.144407 +v 0.803025 0.887172 4.204730 +vt 0.997303 0.999582 +vt 0.000036 1.000000 +vt 0.002878 0.971687 +vt 0.999770 0.971044 +vt 0.002882 0.027783 +vt 0.000000 0.000582 +vt 0.998419 -0.000000 +vt 1.000000 0.027606 +vt 0.997313 0.051295 +vt 0.000738 0.052036 +vt 0.002881 0.075140 +vt 0.997849 0.948066 +vt 1.000000 0.074962 +vt 0.997846 0.097892 +vt 0.000191 0.948038 +vt 0.002878 0.924371 +vt 0.999997 0.924370 +vt 0.997311 0.900704 +vt 0.000192 0.900704 +vt 0.002879 0.877038 +vt 0.999997 0.877037 +vt 0.997833 0.853410 +vt 0.000715 0.853411 +vt 0.002879 0.830152 +vt 0.999997 0.830151 +vt 0.997846 0.806142 +vt 0.000192 0.806485 +vt 0.002879 0.782818 +vt 0.999998 0.782818 +vt 0.997848 0.759562 +vt 0.000729 0.759563 +vt 0.002879 0.734947 +vt 0.999998 0.734947 +vt 0.997843 0.710811 +vt 0.000192 0.711817 +vt 0.002879 0.688151 +vt 0.999998 0.688150 +vt 0.997311 0.665021 +vt 0.000193 0.665022 +vt 0.002879 0.641355 +vt 0.999998 0.641355 +vt 0.997311 0.617688 +vt 0.000193 0.617689 +vt 0.002879 0.594022 +vt 0.999998 0.594021 +vt 0.997312 0.570035 +vt 0.000193 0.570035 +vt 0.002880 0.546369 +vt 0.999998 0.546368 +vt 0.997312 0.523239 +vt 0.000723 0.522575 +vt 0.002880 0.499574 +vt 0.999999 0.499573 +vt 0.997857 0.475450 +vt 0.000193 0.475907 +vt 0.002880 0.452240 +vt 0.999999 0.452240 +vt 0.997312 0.428837 +vt 0.000193 0.428837 +vt 0.002880 0.405171 +vt 0.999999 0.405170 +vt 0.997846 0.381484 +vt 0.000727 0.382148 +vt 0.002880 0.357837 +vt 0.999999 0.357837 +vt 0.997312 0.334169 +vt 0.000193 0.334169 +vt 0.002881 0.310503 +vt 0.999999 0.310502 +vt 0.997837 0.287143 +vt 0.000729 0.286953 +vt 0.002881 0.263604 +vt 0.999999 0.263603 +vt 0.997853 0.239283 +vt 0.000194 0.239921 +vt 0.002881 0.216464 +vt 0.999999 0.216463 +vt 0.997313 0.192797 +vt 0.000194 0.192797 +vt 0.002881 0.169131 +vt 1.000000 0.169130 +vt 0.997849 0.145957 +vt 0.000194 0.146001 +vt 0.002881 0.122333 +vt 1.000000 0.122332 +vt 0.000194 0.098667 +vn -0.061333 0.887327 0.457043 +vn -0.060591 0.884475 0.462636 +vn -0.058838 0.877106 -0.476679 +vn -0.060541 0.883781 -0.463967 +vn -0.059572 0.862791 0.502039 +vn -0.058572 0.858228 0.509916 +vn -0.055710 0.847220 -0.528314 +vn -0.056502 0.849884 -0.523931 +vn -0.059064 0.862600 -0.502427 +vn -0.059084 0.855637 0.514194 +vn -0.059230 0.862432 -0.502696 +vn -0.059163 0.862598 0.502419 +vn -0.059377 0.863568 0.500724 +vn -0.059308 0.862585 -0.502425 +vn -0.059308 0.862582 -0.502428 +vn -0.059310 0.862582 0.502428 +vn -0.059310 0.862582 0.502429 +vn -0.058881 0.856364 -0.513004 +vn -0.057671 0.850798 -0.522319 +vn -0.057423 0.847120 0.528289 +vn -0.058637 0.852794 0.518945 +vn -0.059543 0.866001 -0.496484 +vn -0.058788 0.862622 -0.502422 +vn -0.059735 0.862556 0.502423 +vn -0.059112 0.859703 0.507362 +vn -0.059075 0.859194 -0.508229 +vn -0.059005 0.858868 -0.508786 +vn -0.059845 0.871075 0.487491 +vn -0.059914 0.871376 0.486944 +vn -0.059602 0.866852 -0.494989 +vn -0.057541 0.857618 -0.511057 +vn -0.060689 0.862488 0.502426 +vn -0.058646 0.852934 0.518713 +vn -0.058959 0.857507 -0.511082 +vn -0.058959 0.857508 -0.511081 +vn -0.059310 0.862585 0.502424 +vn -0.059310 0.862584 0.502425 +vn -0.059308 0.862584 -0.502425 +vn -0.059308 0.862585 -0.502423 +vn -0.059507 0.865483 -0.497391 +vn -0.059508 0.865485 -0.497387 +vn -0.059310 0.862584 0.502426 +vn -0.059085 0.858091 -0.510086 +vn -0.056673 0.850489 0.522931 +vn -0.058602 0.852313 -0.519739 +vn -0.060870 0.862476 -0.502424 +vn -0.062132 0.862384 0.502428 +vn -0.057978 0.843218 0.534436 +vn -0.059140 0.860132 -0.506632 +vn -0.059139 0.860129 -0.506636 +vn -0.059332 0.862921 -0.501843 +vn -0.056727 0.850984 -0.522120 +vn -0.059424 0.863086 0.501548 +vn -0.059308 0.862559 0.502468 +vn -0.059309 0.862598 -0.502401 +vn -0.059309 0.862597 -0.502403 +vn -0.059066 0.859058 -0.508460 +vn -0.059574 0.861382 -0.504452 +vn -0.058915 0.859528 0.507682 +vn -0.059184 0.860756 0.505566 +vn -0.059670 0.867835 -0.493256 +vn -0.058529 0.862784 -0.502173 +vn -0.060151 0.860570 0.505767 +vn -0.058709 0.853847 0.517203 +vn -0.059308 0.862586 -0.502422 +vn -0.059309 0.862588 -0.502419 +vn -0.059012 0.858275 -0.509786 +vn -0.058850 0.857527 -0.511061 +vn -0.059319 0.862595 0.502405 +vn -0.059307 0.862540 0.502502 +vn -0.059786 0.869529 -0.490250 +vn -0.106284 0.994336 0.000001 +vn 0.997479 0.070959 -0.000002 +s off +f 11442/4398/4966 11357/4399/4966 11358/4400/4966 +f 11441/4401/4967 11442/4398/4967 11358/4400/4967 +f 11398/4402/4968 11399/4403/4968 11400/4404/4968 +f 11398/4402/4969 11400/4404/4969 11401/4405/4969 +f 11398/4402/4970 11401/4405/4970 11402/4406/4970 +f 11397/4407/4971 11398/4402/4971 11402/4406/4971 +f 11396/4408/4972 11397/4407/4972 11402/4406/4972 +f 11440/4409/4973 11441/4401/4973 11358/4400/4973 +f 11396/4408/4974 11402/4406/4974 11403/4410/4974 +f 11396/4408/4975 11403/4410/4975 11404/4411/4975 +f 11440/4409/4976 11358/4400/4976 11359/4412/4976 +f 11440/4409/4977 11359/4412/4977 11360/4413/4977 +f 11439/4414/4978 11440/4409/4978 11360/4413/4978 +f 11438/4415/4979 11439/4414/4979 11360/4413/4979 +f 11438/4415/4980 11360/4413/4980 11361/4416/4980 +f 11438/4415/4981 11361/4416/4981 11362/4417/4981 +f 11437/4418/4982 11438/4415/4982 11362/4417/4982 +f 11436/4419/4983 11437/4418/4983 11362/4417/4983 +f 11436/4419/4984 11362/4417/4984 11363/4420/4984 +f 11436/4419/4985 11363/4420/4985 11364/4421/4985 +f 11435/4422/4986 11436/4419/4986 11364/4421/4986 +f 11434/4423/4987 11435/4422/4987 11364/4421/4987 +f 11434/4423/4988 11364/4421/4988 11365/4424/4988 +f 11434/4423/4989 11365/4424/4989 11366/4425/4989 +f 11433/4426/4990 11434/4423/4990 11366/4425/4990 +f 11432/4427/4991 11433/4426/4991 11366/4425/4991 +f 11432/4427/4992 11366/4425/4992 11367/4428/4992 +f 11432/4427/4993 11367/4428/4993 11368/4429/4993 +f 11431/4430/4994 11432/4427/4994 11368/4429/4994 +f 11430/4431/4995 11431/4430/4995 11368/4429/4995 +f 11430/4431/4996 11368/4429/4996 11369/4432/4996 +f 11430/4431/4997 11369/4432/4997 11370/4433/4997 +f 11429/4434/4998 11430/4431/4998 11370/4433/4998 +f 11428/4435/4999 11429/4434/4999 11370/4433/4999 +f 11428/4435/5000 11370/4433/5000 11371/4436/5000 +f 11428/4435/5001 11371/4436/5001 11372/4437/5001 +f 11427/4438/5002 11428/4435/5002 11372/4437/5002 +f 11426/4439/5003 11427/4438/5003 11372/4437/5003 +f 11426/4439/5004 11372/4437/5004 11373/4440/5004 +f 11426/4439/4982 11373/4440/4982 11374/4441/4982 +f 11425/4442/5002 11426/4439/5002 11374/4441/5002 +f 11424/4443/5005 11425/4442/5005 11374/4441/5005 +f 11424/4443/5006 11374/4441/5006 11375/4444/5006 +f 11424/4443/5007 11375/4444/5007 11376/4445/5007 +f 11423/4446/5001 11424/4443/5001 11376/4445/5001 +f 11422/4447/5000 11423/4446/5000 11376/4445/5000 +f 11422/4447/5008 11376/4445/5008 11377/4448/5008 +f 11422/4447/5009 11377/4448/5009 11378/4449/5009 +f 11421/4450/5007 11422/4447/5007 11378/4449/5007 +f 11420/4451/5010 11421/4450/5010 11378/4449/5010 +f 11420/4451/5011 11378/4449/5011 11379/4452/5011 +f 11420/4451/5012 11379/4452/5012 11380/4453/5012 +f 11419/4454/5013 11420/4451/5013 11380/4453/5013 +f 11418/4455/5014 11419/4454/5014 11380/4453/5014 +f 11418/4455/5015 11380/4453/5015 11381/4456/5015 +f 11418/4455/5002 11381/4456/5002 11382/4457/5002 +f 11417/4458/5007 11418/4455/5007 11382/4457/5007 +f 11416/4459/5016 11417/4458/5016 11382/4457/5016 +f 11416/4459/5017 11382/4457/5017 11383/4460/5017 +f 11416/4459/5018 11383/4460/5018 11384/4461/5018 +f 11415/4462/5019 11416/4459/5019 11384/4461/5019 +f 11414/4463/5020 11415/4462/5020 11384/4461/5020 +f 11414/4463/5021 11384/4461/5021 11385/4464/5021 +f 11414/4463/5007 11385/4464/5007 11386/4465/5007 +f 11413/4466/5007 11414/4463/5007 11386/4465/5007 +f 11412/4467/5022 11413/4466/5022 11386/4465/5022 +f 11412/4467/5023 11386/4465/5023 11387/4468/5023 +f 11412/4467/5024 11387/4468/5024 11388/4469/5024 +f 11411/4470/5025 11412/4467/5025 11388/4469/5025 +f 11410/4471/5026 11411/4470/5026 11388/4469/5026 +f 11410/4471/5027 11388/4469/5027 11389/4472/5027 +f 11410/4471/5028 11389/4472/5028 11390/4473/5028 +f 11409/4474/5029 11410/4471/5029 11390/4473/5029 +f 11408/4475/5030 11409/4474/5030 11390/4473/5030 +f 11408/4475/5031 11390/4473/5031 11391/4476/5031 +f 11408/4475/5002 11391/4476/5002 11392/4477/5002 +f 11407/4478/5001 11408/4475/5001 11392/4477/5001 +f 11406/4479/5032 11407/4478/5032 11392/4477/5032 +f 11406/4479/5033 11392/4477/5033 11393/4480/5033 +f 11406/4479/5034 11393/4480/5034 11394/4481/5034 +f 11405/4482/5035 11406/4479/5035 11394/4481/5035 +f 11404/4411/5036 11405/4482/5036 11394/4481/5036 +f 11396/4408/5037 11404/4411/5037 11394/4481/5037 +f 11396/4408/5038 11394/4481/5038 11395/4483/5038 +o diescel2 +v 1.534572 0.942170 1.848745 +v 1.532588 0.972846 1.788897 +v 1.534464 0.943849 1.738906 +v 1.532588 0.972846 1.688878 +v 1.534464 0.943849 1.638851 +v 1.532588 0.972846 1.588825 +v 1.534098 0.942298 1.538881 +v 1.532588 0.972846 1.489716 +v 1.534463 0.943849 1.439688 +v 1.532588 0.972846 1.389661 +v 1.534088 0.943839 1.340504 +v 1.532588 0.972846 1.288470 +v 1.534463 0.943849 1.239577 +v 1.532588 0.972847 1.189550 +v 1.534463 0.943850 1.140660 +v 0.838544 0.891215 1.140659 +v 0.836669 0.920212 1.189549 +v 0.838173 0.891194 1.237451 +v 0.836669 0.920212 1.288469 +v 0.838169 0.891248 1.340503 +v 0.836669 0.920212 1.389660 +v 0.838170 0.891229 1.438963 +v 0.836669 0.920212 1.489714 +v 0.838179 0.890407 1.538880 +v 0.836669 0.920211 1.588824 +v 0.838544 0.891214 1.638850 +v 0.836669 0.920211 1.688877 +v 0.838168 0.891282 1.738966 +v 0.836828 0.921127 1.787538 +v 0.838549 0.889704 1.847860 +vt 0.997306 0.998751 +vt 0.000000 1.000000 +vt 0.002842 0.915478 +vt 0.999772 0.913559 +vt 0.997852 0.844963 +vt 0.000155 0.844878 +vt 0.002842 0.774226 +vt 0.999999 0.774225 +vt 0.997313 0.703574 +vt 0.000156 0.703576 +vt 0.002843 0.632926 +vt 0.999999 0.632924 +vt 0.997836 0.562391 +vt 0.000679 0.562393 +vt 0.002843 0.492958 +vt 0.999999 0.492956 +vt 0.997848 0.421282 +vt 0.000156 0.422307 +vt 0.002843 0.351656 +vt 1.000000 0.351654 +vt 0.997850 0.282231 +vt 0.000693 0.282233 +vt 0.002843 0.208748 +vt 1.000000 0.208746 +vt 0.997845 0.136696 +vt 0.000156 0.139698 +vt 0.002843 0.069047 +vt 1.000000 0.069045 +vt 0.997313 -0.000000 +vt 0.000157 0.000002 +vn -0.067440 0.886977 0.456864 +vn -0.066625 0.884135 0.462457 +vn -0.062131 0.849599 -0.523757 +vn -0.065129 0.862116 -0.502508 +vn -0.065055 0.862280 0.502236 +vn -0.065291 0.863249 0.500538 +vn -0.065215 0.862265 -0.502241 +vn -0.065215 0.862265 -0.502242 +vn -0.065217 0.862264 0.502243 +vn -0.064745 0.856053 -0.512817 +vn -0.063416 0.850501 -0.522136 +vn -0.063143 0.846827 0.528106 +vn -0.064477 0.852487 0.518757 +vn -0.065473 0.865679 -0.496299 +vn -0.064643 0.862309 -0.502240 +vn -0.065684 0.862233 0.502235 +vn -0.064999 0.859388 0.507176 +vn -0.064959 0.858879 -0.508042 +vn -0.064881 0.858555 -0.508599 +vn -0.065805 0.870747 0.487308 +vn -0.065881 0.871047 0.486761 +vn -0.065537 0.866529 -0.494805 +vn -0.063274 0.857320 -0.510881 +vn -0.066732 0.862155 0.502231 +vn -0.064488 0.852626 0.518526 +vn -0.064831 0.857195 -0.510895 +s off +f 11472/4484/5039 11443/4485/5039 11444/4486/5039 +f 11471/4487/5040 11472/4484/5040 11444/4486/5040 +f 11470/4488/5041 11471/4487/5041 11444/4486/5041 +f 11470/4488/5042 11444/4486/5042 11445/4489/5042 +f 11470/4488/5043 11445/4489/5043 11446/4490/5043 +f 11469/4491/5044 11470/4488/5044 11446/4490/5044 +f 11468/4492/5045 11469/4491/5045 11446/4490/5045 +f 11468/4492/5046 11446/4490/5046 11447/4493/5046 +f 11468/4492/5047 11447/4493/5047 11448/4494/5047 +f 11467/4495/5047 11468/4492/5047 11448/4494/5047 +f 11466/4496/5048 11467/4495/5048 11448/4494/5048 +f 11466/4496/5049 11448/4494/5049 11449/4497/5049 +f 11466/4496/5050 11449/4497/5050 11450/4498/5050 +f 11465/4499/5051 11466/4496/5051 11450/4498/5051 +f 11464/4500/5052 11465/4499/5052 11450/4498/5052 +f 11464/4500/5053 11450/4498/5053 11451/4501/5053 +f 11464/4500/5054 11451/4501/5054 11452/4502/5054 +f 11463/4503/5055 11464/4500/5055 11452/4502/5055 +f 11462/4504/5056 11463/4503/5056 11452/4502/5056 +f 11462/4504/5057 11452/4502/5057 11453/4505/5057 +f 11462/4504/5058 11453/4505/5058 11454/4506/5058 +f 11461/4507/5059 11462/4504/5059 11454/4506/5059 +f 11460/4508/5060 11461/4507/5060 11454/4506/5060 +f 11460/4508/5061 11454/4506/5061 11455/4509/5061 +f 11460/4508/5062 11455/4509/5062 11456/4510/5062 +f 11459/4511/5063 11460/4508/5063 11456/4510/5063 +f 11458/4512/5064 11459/4511/5064 11456/4510/5064 +f 11458/4512/5064 11456/4510/5064 11457/4513/5064 +o diesplat +v 1.582823 0.094055 0.344612 +v 1.610250 0.094055 0.344612 +v 1.582823 0.094055 0.255997 +v 1.610250 0.094055 0.255997 +v 1.582823 1.274342 -0.588823 +v 1.610250 1.274342 -0.588823 +v 1.582823 1.274342 -0.677438 +v 1.610250 1.274342 -0.677438 +v 1.310300 0.094055 0.344612 +v 1.337727 0.094055 0.344612 +v 1.310300 0.094055 0.255997 +v 1.337728 0.094055 0.255997 +v 1.310300 1.274342 -0.588823 +v 1.337727 1.274342 -0.588823 +v 1.310300 1.274342 -0.677438 +v 1.337727 1.274342 -0.677438 +v -0.026408 3.118518 3.219061 +v -0.209857 3.118518 2.992233 +v -0.748455 3.118518 3.034065 +v -0.904553 3.118518 3.376332 +v -0.642079 3.118517 3.787742 +v -0.209855 3.118517 3.760431 +v -0.026408 3.118518 3.533604 +v -0.885329 3.118518 3.507257 +v -0.831417 3.118517 3.623225 +v -0.748455 3.118517 3.718599 +v -0.517928 3.118517 3.825014 +v -0.398558 3.118517 3.826936 +v -0.299362 3.118517 3.803921 +v -0.132731 3.118517 3.699114 +v -0.070684 3.118518 3.622622 +v 0.284708 3.102596 3.533605 +v 0.284708 3.102597 3.219061 +v -0.070686 3.118518 3.130042 +v -0.132734 3.118518 3.053550 +v -0.299363 3.118518 2.948743 +v -0.398559 3.118518 2.925729 +v -0.517928 3.118518 2.927651 +v -0.642079 3.118518 2.964923 +v -0.831417 3.118518 3.129439 +v -0.885329 3.118518 3.245407 +v -0.606146 3.118518 3.376332 +v -0.581118 3.118518 3.291842 +v -0.516323 3.118518 3.235542 +v -0.434659 3.118518 3.221945 +v -0.375287 3.118518 3.240774 +v -0.329014 3.118518 3.280277 +v -0.299141 3.118518 3.340073 +v -0.294943 3.118518 3.374745 +v -0.306808 3.118518 3.433857 +v -0.342438 3.118518 3.487313 +v -0.435288 3.118518 3.530784 +v -0.516323 3.118518 3.517123 +v -0.581118 3.118518 3.460823 +v -0.444811 1.305869 -0.605765 +v -1.198792 1.305868 -0.629850 +v 0.315971 1.305869 -0.605676 +v 0.691758 1.305869 -0.606763 +v 1.221857 1.305869 -0.605901 +v -1.532013 1.305869 -0.939113 +v -1.460398 1.305868 -0.605495 +v 1.338122 1.267407 -0.582751 +v 1.338122 1.274090 -0.588686 +v 1.337857 1.267465 -0.672249 +v 1.337857 1.274168 -0.677320 +v 1.337750 0.155016 0.294652 +v 1.337750 0.148214 0.300042 +v 1.337749 0.228449 0.236673 +v 1.337749 0.221699 0.241573 +v 1.337749 0.302457 0.178439 +v 1.337749 0.296024 0.183373 +v 1.337749 0.376442 0.119701 +v 1.337749 0.370097 0.124749 +v 1.337749 0.450727 0.061470 +v 1.337749 0.443793 0.066404 +v 1.337749 0.525233 0.002503 +v 1.337749 0.518202 0.007887 +v 1.337749 0.599119 -0.055887 +v 1.337749 0.592569 -0.050798 +v 1.337749 0.672775 -0.113962 +v 1.337749 0.666092 -0.109027 +v 1.337749 0.747194 -0.172734 +v 1.337749 0.740356 -0.167496 +v 1.337749 0.821051 -0.230896 +v 1.337749 0.814117 -0.225462 +v 1.337749 0.894818 -0.288881 +v 1.337749 0.888385 -0.283947 +v 1.337749 0.968837 -0.347834 +v 1.337749 0.962154 -0.342399 +v 1.337749 1.043094 -0.406064 +v 1.337749 1.036160 -0.400880 +v 1.337749 1.116601 -0.463806 +v 1.337749 1.110169 -0.459123 +v 1.337749 1.190897 -0.522788 +v 1.337749 1.184213 -0.517353 +v 1.337749 0.148214 0.211355 +v 1.337749 0.155016 0.205965 +v 1.337749 0.221699 0.152885 +v 1.337749 0.228449 0.147985 +v 1.337749 0.296024 0.094686 +v 1.337749 0.302457 0.089752 +v 1.337749 0.370097 0.036061 +v 1.337749 0.376442 0.031013 +v 1.337749 0.443793 -0.022283 +v 1.337749 0.450727 -0.027218 +v 1.337749 0.518202 -0.080801 +v 1.337749 0.525233 -0.086185 +v 1.337749 0.592569 -0.139485 +v 1.337749 0.599119 -0.144574 +v 1.337749 0.666092 -0.197715 +v 1.337749 0.672775 -0.202650 +v 1.337749 0.740356 -0.256183 +v 1.337749 0.747194 -0.261422 +v 1.337749 0.814117 -0.314150 +v 1.337749 0.821051 -0.319584 +v 1.337749 0.888385 -0.372634 +v 1.337749 0.894818 -0.377568 +v 1.337749 0.962154 -0.431086 +v 1.337749 0.968838 -0.436521 +v 1.337749 1.036160 -0.489568 +v 1.337749 1.043094 -0.494752 +v 1.337749 1.110169 -0.547811 +v 1.337749 1.116602 -0.552494 +v 1.337749 1.184214 -0.606041 +v 1.337749 1.190897 -0.611476 +v 1.584126 1.267465 -0.671593 +v 1.584126 1.274168 -0.677320 +v 1.583581 1.267407 -0.582751 +v 1.583582 0.148214 0.300042 +v 1.583582 0.155017 0.294652 +v 1.583582 0.221700 0.241572 +v 1.583582 0.228449 0.236672 +v 1.583582 0.296024 0.183373 +v 1.583582 0.302457 0.178439 +v 1.583582 0.370097 0.124749 +v 1.583582 0.376442 0.119701 +v 1.583582 0.443793 0.066404 +v 1.583582 0.450727 0.061470 +v 1.583582 0.518202 0.007887 +v 1.582903 0.525233 0.002503 +v 1.583581 0.599119 -0.055887 +v 1.583581 0.592570 -0.050797 +v 1.583581 0.666092 -0.109027 +v 1.583757 0.672775 -0.113961 +v 1.583581 0.740356 -0.167496 +v 1.583581 0.747194 -0.172735 +v 1.583643 0.814117 -0.225462 +v 1.584306 0.821051 -0.230897 +v 1.583581 0.888385 -0.283946 +v 1.583581 0.894818 -0.288881 +v 1.583581 0.962154 -0.342399 +v 1.583581 0.968838 -0.347833 +v 1.583581 1.036160 -0.400880 +v 1.583581 1.043094 -0.406064 +v 1.583581 1.110169 -0.459122 +v 1.583581 1.116601 -0.463806 +v 1.583581 1.184214 -0.517353 +v 1.583581 1.190897 -0.522788 +v 1.583581 1.274091 -0.588687 +v 1.583581 0.148214 0.211354 +v 1.583581 0.155017 0.205964 +v 1.583581 0.221700 0.152885 +v 1.583581 0.228449 0.147984 +v 1.583581 0.296024 0.094686 +v 1.583581 0.302457 0.089752 +v 1.583581 0.370097 0.036061 +v 1.583581 0.376442 0.031013 +v 1.583581 0.443793 -0.022284 +v 1.583581 0.450727 -0.027218 +v 1.582903 0.518202 -0.080801 +v 1.583581 0.525233 -0.086185 +v 1.583582 0.592569 -0.139485 +v 1.583581 0.599119 -0.144574 +v 1.583757 0.666092 -0.197715 +v 1.583581 0.672775 -0.202649 +v 1.583581 0.740356 -0.256183 +v 1.583581 0.747194 -0.261422 +v 1.584362 0.814117 -0.314149 +v 1.583581 0.821051 -0.319584 +v 1.583581 0.888385 -0.372634 +v 1.583581 0.894818 -0.377568 +v 1.583582 0.962154 -0.431086 +v 1.583581 0.968838 -0.436521 +v 1.583581 1.036160 -0.489568 +v 1.583581 1.043094 -0.494752 +v 1.583582 1.110169 -0.547810 +v 1.583582 1.116602 -0.552494 +v 1.583582 1.184214 -0.606041 +v 1.583582 1.190897 -0.611476 +v -1.531984 1.305868 -0.606394 +v 0.409249 1.305869 -0.492926 +v 0.409249 1.305869 -0.605664 +v 0.434870 1.305869 -0.504313 +v 0.576752 1.305869 -0.493790 +v 0.577001 1.305869 -0.606940 +v 1.637660 1.305869 -0.605936 +v 1.637663 1.305869 -0.653825 +v 1.584123 1.305869 -0.606264 +v 1.338480 1.305869 -0.605931 +v -1.151550 1.305868 -0.605855 +v -1.292491 1.305868 -0.605866 +v 1.637688 1.305869 -0.939714 +v 1.241132 1.305869 -0.939639 +v 0.387777 1.305869 -0.939478 +v -0.392253 1.305869 -0.939329 +v -1.148097 1.305869 -0.939186 +v 0.513524 1.305869 -0.513244 +v 1.312979 1.305869 -0.677695 +v 1.584057 1.305869 -0.677965 +v 1.617928 1.305869 -0.642239 +v -1.292401 1.305868 -0.490972 +v -1.460288 1.305868 -0.491771 +v -1.329123 1.305868 -0.507527 +v -1.377064 1.305868 -0.514566 +v -1.447052 1.305868 -0.499114 +v 1.337728 0.094055 0.255997 +v 1.310300 0.094055 0.344612 +v 1.337727 1.274342 -0.677438 +v 1.310300 1.274342 -0.588823 +v 1.310300 0.094055 0.344612 +v 1.337727 0.094055 0.344612 +v 1.337727 1.274342 -0.588823 +v 1.337727 1.274342 -0.588823 +v 1.310300 1.274342 -0.588823 +v 1.310300 0.094055 0.344612 +v 1.337727 0.094055 0.344612 +v 1.337728 0.094055 0.255997 +v 1.337727 1.274342 -0.677438 +v 1.337727 1.274342 -0.677438 +v 1.337727 1.274342 -0.588823 +v 1.337727 0.094055 0.344612 +v 1.337728 0.094055 0.255997 +v 1.310300 0.094055 0.255997 +v 1.310300 1.274342 -0.677438 +v 1.310300 1.274342 -0.677438 +v 1.337727 1.274342 -0.677438 +v 1.337728 0.094055 0.255997 +v 1.310300 0.094055 0.255997 +v 1.310300 0.094055 0.344612 +v 1.310300 1.274342 -0.588823 +v 1.310300 1.274342 -0.588823 +v 1.310300 1.274342 -0.677438 +v 1.310300 0.094055 0.255997 +v -0.606146 3.118518 3.376332 +v -0.885329 3.118518 3.507257 +v -0.904553 3.118518 3.376332 +v -0.606146 3.118518 3.376332 +v -0.581118 3.118518 3.460823 +v -0.885329 3.118518 3.507257 +v -0.885329 3.118518 3.245407 +v -0.606146 3.118518 3.376332 +v -0.831417 3.118518 3.129439 +v -0.606146 3.118518 3.376332 +v -0.581118 3.118518 3.460823 +v -0.831417 3.118517 3.623225 +v -0.581118 3.118518 3.460823 +v -0.748455 3.118517 3.718599 +v -0.831417 3.118518 3.129439 +v -0.581118 3.118518 3.291842 +v -0.516323 3.118518 3.517123 +v -0.748455 3.118517 3.718599 +v -0.516323 3.118518 3.517123 +v -0.642079 3.118517 3.787742 +v -0.516323 3.118518 3.517123 +v -0.517928 3.118517 3.825014 +v -0.435288 3.118518 3.530784 +v -0.517928 3.118517 3.825014 +v -0.748455 3.118518 3.034065 +v -0.581118 3.118518 3.291842 +v -0.642079 3.118518 2.964923 +v -0.581118 3.118518 3.291842 +v -0.642079 3.118518 2.964923 +v -0.516323 3.118518 3.235542 +v -0.517928 3.118518 2.927651 +v -0.516323 3.118518 3.235542 +v -0.398559 3.118518 2.925729 +v -0.516323 3.118518 3.235542 +v -0.435288 3.118518 3.530784 +v -0.398558 3.118517 3.826936 +v -0.435288 3.118518 3.530784 +v -0.299362 3.118517 3.803921 +v -0.398559 3.118518 2.925729 +v -0.434659 3.118518 3.221945 +v -0.299363 3.118518 2.948743 +v -0.434659 3.118518 3.221945 +v -0.434659 3.118518 3.221945 +v -0.209857 3.118518 2.992233 +v -0.375287 3.118518 3.240774 +v -0.132734 3.118518 3.053550 +v -0.375287 3.118518 3.240774 +v -0.132734 3.118518 3.053550 +v -0.329014 3.118518 3.280277 +v -0.070686 3.118518 3.130042 +v -0.329014 3.118518 3.280277 +v -0.026408 3.118518 3.219061 +v -0.329014 3.118518 3.280277 +v -0.342438 3.118518 3.487313 +v -0.299362 3.118517 3.803921 +v -0.342438 3.118518 3.487313 +v -0.209855 3.118517 3.760431 +v -0.342438 3.118518 3.487313 +v -0.132731 3.118517 3.699114 +v -0.342438 3.118518 3.487313 +v -0.070684 3.118518 3.622622 +v -0.306808 3.118518 3.433857 +v -0.070684 3.118518 3.622622 +v -0.026408 3.118518 3.219061 +v -0.026408 3.118518 3.533604 +v 0.284708 3.102596 3.533605 +v -0.026408 3.118518 3.219061 +v -0.306808 3.118518 3.433857 +v -0.026408 3.118518 3.219061 +v -0.306808 3.118518 3.433857 +v -0.026408 3.118518 3.219061 +v -0.299141 3.118518 3.340073 +v -0.026408 3.118518 3.219061 +v 1.584126 1.267465 -0.671593 +v 1.337857 1.274168 -0.677320 +v 1.337857 1.267465 -0.672249 +v 1.584126 1.267465 -0.671593 +v 1.584126 1.267465 -0.671593 +v 1.338122 1.267407 -0.582751 +v 1.337750 0.155016 0.294652 +v 1.583582 0.148214 0.300042 +v 1.337749 0.228449 0.236673 +v 1.583582 0.221700 0.241572 +v 1.337749 0.302457 0.178439 +v 1.583582 0.296024 0.183373 +v 1.337749 0.376442 0.119701 +v 1.583582 0.370097 0.124749 +v 1.337749 0.450727 0.061470 +v 1.583582 0.443793 0.066404 +v 1.337749 0.525233 0.002503 +v 1.583582 0.518202 0.007887 +v 1.337749 0.599119 -0.055887 +v 1.583581 0.592570 -0.050797 +v 1.337749 0.672775 -0.113962 +v 1.583581 0.666092 -0.109027 +v 1.337749 0.747194 -0.172734 +v 1.583581 0.740356 -0.167496 +v 1.337749 0.821051 -0.230896 +v 1.583643 0.814117 -0.225462 +v 1.337749 0.894818 -0.288881 +v 1.583581 0.888385 -0.283946 +v 1.337749 0.968837 -0.347834 +v 1.583581 0.962154 -0.342399 +v 1.337749 1.043094 -0.406064 +v 1.583581 1.036160 -0.400880 +v 1.337749 1.116601 -0.463806 +v 1.583581 1.110169 -0.459122 +v 1.337749 1.190897 -0.522788 +v 1.583581 1.184214 -0.517353 +v 1.337749 0.148214 0.211355 +v 1.583581 0.155017 0.205964 +v 1.337749 0.221699 0.152885 +v 1.583581 0.228449 0.147984 +v 1.337749 0.296024 0.094686 +v 1.583581 0.302457 0.089752 +v 1.337749 0.370097 0.036061 +v 1.583581 0.376442 0.031013 +v 1.337749 0.443793 -0.022283 +v 1.583581 0.450727 -0.027218 +v 1.337749 0.518202 -0.080801 +v 1.583581 0.525233 -0.086185 +v 1.337749 0.592569 -0.139485 +v 1.583581 0.599119 -0.144574 +v 1.337749 0.666092 -0.197715 +v 1.583581 0.672775 -0.202649 +v 1.337749 0.740356 -0.256183 +v 1.583581 0.747194 -0.261422 +v 1.337749 0.814117 -0.314150 +v 1.583581 0.821051 -0.319584 +v 1.337749 0.888385 -0.372634 +v 1.583581 0.894818 -0.377568 +v 1.337749 0.962154 -0.431086 +v 1.583581 0.968838 -0.436521 +v 1.337749 1.036160 -0.489568 +v 1.583581 1.043094 -0.494752 +v 1.337749 1.110169 -0.547811 +v 1.583582 1.116602 -0.552494 +v 1.337749 1.184214 -0.606041 +v 1.583582 1.190897 -0.611476 +v 1.583582 1.184214 -0.606041 +v 1.583581 1.184214 -0.517353 +v 1.337749 1.184214 -0.606041 +v 1.337749 1.184213 -0.517353 +v 1.337749 1.184214 -0.606041 +v 1.583581 1.184214 -0.517353 +v 1.583581 1.190897 -0.522788 +v 1.583582 1.190897 -0.611476 +v 1.337749 1.190897 -0.522788 +v 1.337749 1.190897 -0.611476 +v 1.337749 1.190897 -0.522788 +v 1.583582 1.190897 -0.611476 +v 1.583581 1.116601 -0.463806 +v 1.583582 1.116602 -0.552494 +v 1.337749 1.116602 -0.552494 +v 1.337749 1.116602 -0.552494 +v 1.337749 1.116601 -0.463806 +v 1.583581 1.116601 -0.463806 +v 1.583582 1.110169 -0.547810 +v 1.583581 1.110169 -0.459122 +v 1.337749 1.110169 -0.547811 +v 1.337749 1.110169 -0.459123 +v 1.337749 1.110169 -0.547811 +v 1.583581 1.110169 -0.459122 +v 1.583581 1.043094 -0.406064 +v 1.583581 1.043094 -0.494752 +v 1.337749 1.043094 -0.494752 +v 1.337749 1.043094 -0.494752 +v 1.337749 1.043094 -0.406064 +v 1.583581 1.043094 -0.406064 +v 1.583581 1.036160 -0.489568 +v 1.583581 1.036160 -0.400880 +v 1.337749 1.036160 -0.489568 +v 1.337749 1.036160 -0.400880 +v 1.337749 1.036160 -0.489568 +v 1.583581 1.036160 -0.400880 +v 1.583581 0.968838 -0.347833 +v 1.583581 0.968838 -0.436521 +v 1.337749 0.968838 -0.436521 +v 1.337749 0.968838 -0.436521 +v 1.337749 0.968837 -0.347834 +v 1.583581 0.968838 -0.347833 +v 1.583582 0.962154 -0.431086 +v 1.583581 0.962154 -0.342399 +v 1.337749 0.962154 -0.431086 +v 1.337749 0.962154 -0.342399 +v 1.337749 0.962154 -0.431086 +v 1.583581 0.962154 -0.342399 +v 1.583581 0.894818 -0.288881 +v 1.583581 0.894818 -0.377568 +v 1.337749 0.894818 -0.377568 +v 1.337749 0.894818 -0.377568 +v 1.337749 0.894818 -0.288881 +v 1.583581 0.894818 -0.288881 +v 1.583581 0.888385 -0.372634 +v 1.583581 0.888385 -0.283946 +v 1.337749 0.888385 -0.372634 +v 1.337749 0.888385 -0.283947 +v 1.337749 0.888385 -0.372634 +v 1.583581 0.888385 -0.283946 +v 1.584306 0.821051 -0.230897 +v 1.583581 0.821051 -0.319584 +v 1.337749 0.821051 -0.319584 +v 1.337749 0.821051 -0.319584 +v 1.337749 0.821051 -0.230896 +v 1.584306 0.821051 -0.230897 +v 1.584362 0.814117 -0.314149 +v 1.583643 0.814117 -0.225462 +v 1.337749 0.814117 -0.314150 +v 1.337749 0.814117 -0.225462 +v 1.337749 0.814117 -0.314150 +v 1.583643 0.814117 -0.225462 +v 1.583581 0.747194 -0.172735 +v 1.583581 0.747194 -0.261422 +v 1.337749 0.747194 -0.261422 +v 1.337749 0.747194 -0.261422 +v 1.337749 0.747194 -0.172734 +v 1.583581 0.747194 -0.172735 +v 1.583581 0.740356 -0.256183 +v 1.583581 0.740356 -0.167496 +v 1.337749 0.740356 -0.256183 +v 1.337749 0.740356 -0.167496 +v 1.337749 0.740356 -0.256183 +v 1.583581 0.740356 -0.167496 +v 1.583757 0.672775 -0.113961 +v 1.583581 0.672775 -0.202649 +v 1.337749 0.672775 -0.202650 +v 1.337749 0.672775 -0.202650 +v 1.337749 0.672775 -0.113962 +v 1.583757 0.672775 -0.113961 +v 1.583757 0.666092 -0.197715 +v 1.583581 0.666092 -0.109027 +v 1.337749 0.666092 -0.197715 +v 1.337749 0.666092 -0.109027 +v 1.337749 0.666092 -0.197715 +v 1.583581 0.666092 -0.109027 +v 1.583581 0.599119 -0.055887 +v 1.583581 0.599119 -0.144574 +v 1.337749 0.599119 -0.144574 +v 1.337749 0.599119 -0.144574 +v 1.337749 0.599119 -0.055887 +v 1.583581 0.599119 -0.055887 +v 1.583582 0.592569 -0.139485 +v 1.583581 0.592570 -0.050797 +v 1.337749 0.592569 -0.139485 +v 1.337749 0.592569 -0.050798 +v 1.337749 0.592569 -0.139485 +v 1.583581 0.592570 -0.050797 +v 1.582903 0.525233 0.002503 +v 1.583581 0.525233 -0.086185 +v 1.337749 0.525233 -0.086185 +v 1.337749 0.525233 -0.086185 +v 1.337749 0.525233 0.002503 +v 1.582903 0.525233 0.002503 +v 1.582903 0.518202 -0.080801 +v 1.583582 0.518202 0.007887 +v 1.337749 0.518202 -0.080801 +v 1.337749 0.518202 0.007887 +v 1.337749 0.518202 -0.080801 +v 1.583582 0.518202 0.007887 +v 1.583582 0.450727 0.061470 +v 1.583581 0.450727 -0.027218 +v 1.337749 0.450727 -0.027218 +v 1.337749 0.450727 -0.027218 +v 1.337749 0.450727 0.061470 +v 1.583582 0.450727 0.061470 +v 1.583581 0.443793 -0.022284 +v 1.583582 0.443793 0.066404 +v 1.337749 0.443793 -0.022283 +v 1.337749 0.443793 0.066404 +v 1.337749 0.443793 -0.022283 +v 1.583582 0.443793 0.066404 +v 1.583582 0.376442 0.119701 +v 1.583581 0.376442 0.031013 +v 1.337749 0.376442 0.031013 +v 1.337749 0.376442 0.031013 +v 1.337749 0.376442 0.119701 +v 1.583582 0.376442 0.119701 +v 1.583581 0.370097 0.036061 +v 1.583582 0.370097 0.124749 +v 1.337749 0.370097 0.036061 +v 1.337749 0.370097 0.124749 +v 1.337749 0.370097 0.036061 +v 1.583582 0.370097 0.124749 +v 1.583582 0.302457 0.178439 +v 1.583581 0.302457 0.089752 +v 1.337749 0.302457 0.089752 +v 1.337749 0.302457 0.089752 +v 1.337749 0.302457 0.178439 +v 1.583582 0.302457 0.178439 +v 1.583581 0.296024 0.094686 +v 1.583582 0.296024 0.183373 +v 1.337749 0.296024 0.094686 +v 1.337749 0.296024 0.183373 +v 1.337749 0.296024 0.094686 +v 1.583582 0.296024 0.183373 +v 1.583582 0.228449 0.236672 +v 1.583581 0.228449 0.147984 +v 1.337749 0.228449 0.147985 +v 1.337749 0.228449 0.147985 +v 1.337749 0.228449 0.236673 +v 1.583582 0.228449 0.236672 +v 1.583581 0.221700 0.152885 +v 1.583582 0.221700 0.241572 +v 1.337749 0.221699 0.152885 +v 1.337749 0.221699 0.241573 +v 1.337749 0.221699 0.152885 +v 1.583582 0.221700 0.241572 +v 1.583582 0.155017 0.294652 +v 1.583581 0.155017 0.205964 +v 1.337749 0.155016 0.205965 +v 1.337749 0.155016 0.205965 +v 1.337750 0.155016 0.294652 +v 1.583582 0.155017 0.294652 +v 1.583581 0.148214 0.211354 +v 1.583582 0.148214 0.300042 +v 1.337749 0.148214 0.211355 +v 1.337750 0.148214 0.300042 +v 1.337749 0.148214 0.211355 +v 1.583582 0.148214 0.300042 +v -1.532013 1.305869 -0.939113 +v -1.460398 1.305868 -0.605495 +v -1.460398 1.305868 -0.605495 +v -1.198792 1.305868 -0.629850 +v -1.198792 1.305868 -0.629850 +v -1.292491 1.305868 -0.605866 +v -1.198792 1.305868 -0.629850 +v -1.151550 1.305868 -0.605855 +v -1.148097 1.305869 -0.939186 +v -1.532013 1.305869 -0.939113 +v -1.198792 1.305868 -0.629850 +v -1.148097 1.305869 -0.939186 +v -1.151550 1.305868 -0.605855 +v -1.148097 1.305869 -0.939186 +v -0.444811 1.305869 -0.605765 +v -0.392253 1.305869 -0.939329 +v -0.444811 1.305869 -0.605765 +v 0.315971 1.305869 -0.605676 +v -0.392253 1.305869 -0.939329 +v 0.387777 1.305869 -0.939478 +v 0.315971 1.305869 -0.605676 +v 0.577001 1.305869 -0.606940 +v 0.387777 1.305869 -0.939478 +v 0.513524 1.305869 -0.513244 +v 0.513524 1.305869 -0.513244 +v 0.387777 1.305869 -0.939478 +v 0.409249 1.305869 -0.605664 +v 0.387777 1.305869 -0.939478 +v 0.577001 1.305869 -0.606940 +v 1.337857 1.274168 -0.677320 +v 1.583581 1.274091 -0.588687 +v 1.584126 1.274168 -0.677320 +v 1.337857 1.274168 -0.677320 +v 0.387777 1.305869 -0.939478 +v 0.691758 1.305869 -0.606763 +v 1.241132 1.305869 -0.939639 +v 0.691758 1.305869 -0.606763 +v 1.221857 1.305869 -0.605901 +v 1.241132 1.305869 -0.939639 +v 1.221857 1.305869 -0.605901 +v 1.312979 1.305869 -0.677695 +v 1.312979 1.305869 -0.677695 +v 1.338480 1.305869 -0.605931 +v 1.584123 1.305869 -0.606264 +v 1.241132 1.305869 -0.939639 +v 1.312979 1.305869 -0.677695 +v 1.584123 1.305869 -0.606264 +v 1.241132 1.305869 -0.939639 +v 1.637660 1.305869 -0.605936 +v 1.617928 1.305869 -0.642239 +v 1.584123 1.305869 -0.606264 +v 1.584123 1.305869 -0.606264 +v 1.617928 1.305869 -0.642239 +v 1.584057 1.305869 -0.677965 +v 1.584057 1.305869 -0.677965 +v 1.617928 1.305869 -0.642239 +v 1.637688 1.305869 -0.939714 +v 1.241132 1.305869 -0.939639 +v 1.584057 1.305869 -0.677965 +v 1.583581 1.274091 -0.588687 +v 1.338122 1.274090 -0.588686 +v 1.583581 1.267407 -0.582751 +v 1.583581 1.267407 -0.582751 +v 1.338122 1.274090 -0.588686 +v 1.338122 1.267407 -0.582751 +v 1.637688 1.305869 -0.939714 +v 1.617928 1.305869 -0.642239 +v 1.637663 1.305869 -0.653825 +v 0.434870 1.305869 -0.504313 +v 0.513524 1.305869 -0.513244 +v 0.409249 1.305869 -0.605664 +v -1.292491 1.305868 -0.605866 +v -1.292491 1.305868 -0.605866 +v -1.460398 1.305868 -0.605495 +v -1.460398 1.305868 -0.605495 +v -1.460398 1.305868 -0.605495 +v -1.292491 1.305868 -0.605866 +vt 8.691670 3.227463 +vt 3.228502 26.218016 +vt 3.215717 26.257504 +vt 3.236587 26.259426 +vt 3.199730 26.240496 +vt 3.306045 24.460445 +vt 3.297960 24.419033 +vt 3.280178 24.432928 +vt 3.318830 24.420959 +vt 3.331912 24.487963 +vt 3.339814 24.463558 +vt 3.314130 24.501858 +vt 3.272276 24.457333 +vt 3.277273 24.482927 +vt 6.744643 27.544409 +vt 6.488793 27.789074 +vt 6.212293 27.981550 +vt 5.920009 28.121319 +vt 4.183487 23.007385 +vt 4.941600 24.579468 +vt 4.954184 24.571917 +vt 4.599287 25.879627 +vt 3.244054 26.578735 +vt 4.635959 25.959673 +vt 4.569165 25.796175 +vt 4.545637 25.709980 +vt 3.097569 25.996679 +vt 3.157965 26.292049 +vt 4.515058 25.441420 +vt 3.072668 25.087482 +vt 3.054708 25.391493 +vt 4.518344 25.350746 +vt 4.530889 25.245071 +vt 3.117175 24.786402 +vt 4.528443 25.260586 +vt 4.533539 25.229591 +vt 3.188439 24.491156 +vt 4.553782 25.137705 +vt 4.549891 25.152884 +vt 4.557880 25.122589 +vt 2.023186 23.251575 +vt 4.572317 25.054996 +vt 4.566701 25.092554 +vt 4.586352 25.011194 +vt 4.664010 24.861412 +vt 4.633695 24.912497 +vt 4.696759 24.811708 +vt 4.730445 24.765299 +vt 4.844639 24.650700 +vt 4.822166 24.664879 +vt 4.880172 24.621735 +vt 4.868211 24.631088 +vt 4.892247 24.612677 +vt 5.857315 26.059120 +vt 6.974970 27.248066 +vt 7.421564 26.178345 +vt 7.317145 26.553879 +vt 5.974413 25.821560 +vt 6.010146 25.693047 +vt 5.690937 26.244265 +vt 5.596314 26.310135 +vt 5.496290 26.357964 +vt 5.616812 28.207863 +vt 8.793430 3.335716 +vt 8.963280 3.082446 +vt 9.243841 2.664092 +vt 9.073992 2.917363 +vt 8.979249 3.058634 +vt 9.259811 2.640278 +vt 8.173079 2.941836 +vt 7.892519 3.360191 +vt 8.306983 3.801093 +vt 11.481998 -0.673346 +vt 11.190547 -0.498734 +vt 11.292310 -0.390483 +vt 11.383794 -0.784363 +vt 11.099678 -0.363237 +vt 10.909987 -0.080378 +vt 11.201440 -0.254986 +vt 11.011748 0.027873 +vt 7.387641 2.823107 +vt 7.241775 3.040769 +vt 7.285890 2.714867 +vt 7.139880 2.932375 +vt 7.404691 2.797683 +vt 7.302941 2.689441 +vt 7.572608 2.547293 +vt 7.470860 2.439053 +vt 7.588108 2.524180 +vt 7.486360 2.415942 +vt 7.756719 2.272756 +vt 7.654971 2.164517 +vt 7.772328 2.249481 +vt 7.670578 2.141244 +vt 7.958146 1.972399 +vt 7.942177 1.996211 +vt 7.856397 1.864158 +vt 7.840428 1.887973 +vt 8.126745 1.720984 +vt 8.025000 1.612748 +vt 8.142354 1.697709 +vt 8.040608 1.589473 +vt 8.311863 1.444945 +vt 8.210118 1.336709 +vt 8.331437 1.422253 +vt 8.227149 1.311312 +vt 8.513612 1.144115 +vt 8.497513 1.168121 +vt 8.411863 1.035876 +vt 8.681722 0.893438 +vt 8.579974 0.785197 +vt 8.696673 0.869465 +vt 8.595582 0.761924 +vt 8.866686 0.617629 +vt 8.764936 0.509390 +vt 8.883260 0.592914 +vt 8.781510 0.484674 +vt 9.049829 0.343946 +vt 8.948311 0.235951 +vt 9.064539 0.315668 +vt 8.965503 0.210316 +vt 9.235074 0.068305 +vt 9.133326 -0.039935 +vt 9.250684 0.045029 +vt 9.148936 -0.063209 +vt 9.419988 -0.207424 +vt 9.318237 -0.315665 +vt 9.437180 -0.233063 +vt 9.335431 -0.341302 +vt 9.604989 -0.483294 +vt 9.503241 -0.591531 +vt 9.621391 -0.507751 +vt 9.519643 -0.615990 +vt 9.789239 -0.758038 +vt 9.687490 -0.866276 +vt 9.804056 -0.780132 +vt 9.702309 -0.888371 +vt 9.973452 -1.032727 +vt 9.871703 -1.140965 +vt 9.990644 -1.058364 +vt 9.888894 -1.166605 +vt 10.199113 -1.369220 +vt 10.180336 -1.341222 +vt 10.097363 -1.477462 +vt 10.078585 -1.449463 +vt 7.420463 2.513988 +vt 7.522356 2.622381 +vt 7.566452 2.296512 +vt 7.668201 2.404749 +vt 7.583503 2.271086 +vt 7.685253 2.379323 +vt 7.751421 2.020695 +vt 7.853169 2.128935 +vt 7.766922 1.997584 +vt 7.868670 2.105820 +vt 7.935530 1.746162 +vt 8.037278 1.854400 +vt 7.951139 1.722886 +vt 8.052887 1.831125 +vt 8.120988 1.469615 +vt 8.222738 1.577853 +vt 8.136957 1.445803 +vt 8.238706 1.554041 +vt 8.305560 1.194390 +vt 8.407309 1.302629 +vt 8.321169 1.171114 +vt 8.422918 1.279353 +vt 8.594968 1.029290 +vt 8.490680 0.918350 +vt 8.507711 0.892953 +vt 8.609459 1.001193 +vt 8.676325 0.641522 +vt 8.778073 0.749761 +vt 8.692423 0.617518 +vt 8.794172 0.725757 +vt 8.860535 0.366840 +vt 8.961625 0.474381 +vt 8.876143 0.343563 +vt 8.977892 0.451803 +vt 9.045496 0.091033 +vt 9.147245 0.199272 +vt 9.062070 0.066321 +vt 9.163819 0.174560 +vt 9.228871 -0.182407 +vt 9.327697 -0.077277 +vt 9.246063 -0.208041 +vt 9.347813 -0.099805 +vt 9.515635 -0.350052 +vt 9.413887 -0.458291 +vt 9.429496 -0.481567 +vt 9.531244 -0.373328 +vt 9.598797 -0.734021 +vt 9.700546 -0.625785 +vt 9.615991 -0.759660 +vt 9.717739 -0.651421 +vt 9.783801 -1.009892 +vt 9.885551 -0.901653 +vt 9.800203 -1.034348 +vt 9.901951 -0.926107 +vt 9.968053 -1.284636 +vt 10.069799 -1.176399 +vt 9.982868 -1.306729 +vt 10.084616 -1.198493 +vt 10.152263 -1.559325 +vt 10.254010 -1.451087 +vt 10.169454 -1.584962 +vt 10.377923 -1.895820 +vt 10.477459 -1.789494 +vt 10.459341 -1.762478 +vt 10.589499 -0.661404 +vt 10.308938 -0.243047 +vt 10.574682 -0.639312 +vt 10.294122 -0.220951 +vt 10.390433 -0.364566 +vt 10.020516 0.187033 +vt 9.739956 0.605392 +vt 9.114342 1.538277 +vt 8.833778 1.956635 +vt 8.927800 1.816440 +vt 8.647238 2.234795 +vt 8.912190 1.839716 +vt 8.743587 2.091125 +vt 8.463025 2.509483 +vt 8.557767 2.368210 +vt 8.542159 2.391484 +vt 8.373549 2.642907 +vt 8.358047 2.666020 +vt 8.077486 3.084380 +vt 8.190131 2.916410 +vt 7.909571 3.334765 +vt 11.266186 -0.372013 +vt 11.608371 -0.009204 +vt 11.608368 -0.009201 +vt 15.000564 3.601183 +vt 14.651163 3.229590 +vt 14.026266 2.557976 +vt 12.591950 -1.660313 +vt 13.596533 2.098807 +vt 14.026901 2.555202 +vt 15.688848 1.797528 +vt 13.987474 3.265111 +vt 13.596533 2.098806 +vt 13.652785 2.090883 +vt 13.691926 2.073108 +vt 18.679764 4.919809 +vt 18.647970 4.885989 +vt 18.708647 4.849053 +vt 15.752421 1.865156 +vt 15.787593 1.740475 +vt 12.569705 -1.579991 +vt 11.399836 -0.808284 +vt 13.620980 2.057049 +vn 0.000000 0.620311 0.784356 +vn 0.000000 -0.620311 -0.784356 +vn 1.000000 0.000002 0.000003 +vn -0.000004 1.000000 -0.000003 +vn -0.000002 1.000000 0.000004 +vn 0.051107 0.998693 0.000002 +vn 0.051109 0.998693 0.000000 +vn 0.002127 -0.603302 -0.797510 +vn 0.000001 -0.649590 -0.760284 +vn 0.000002 -1.000000 -0.000642 +vn -0.000000 -1.000000 -0.000648 +vn -0.000002 0.620969 0.783835 +vn 0.000000 0.621022 0.783794 +vn -0.000000 0.587479 0.809240 +vn 0.000001 0.587497 0.809226 +vn -0.000002 0.608604 0.793474 +vn -0.000001 0.608632 0.793453 +vn -0.000001 0.622576 0.782559 +vn -0.000000 0.622588 0.782550 +vn -0.000002 0.579808 0.814753 +vn -0.000002 0.579809 0.814753 +vn -0.000001 0.607958 0.793969 +vn -0.000002 0.607939 0.793984 +vn -0.000001 0.613550 0.789656 +vn -0.000002 0.613527 0.789674 +vn -0.000002 0.593929 0.804517 +vn -0.000001 0.593955 0.804498 +vn 0.000001 0.608200 0.793784 +vn -0.000001 0.608153 0.793820 +vn 0.000000 0.616918 0.787028 +vn -0.000001 0.608631 0.793454 +vn -0.000001 0.608634 0.793451 +vn -0.000000 0.630929 0.775840 +vn -0.000001 0.630926 0.775843 +vn 0.000001 0.598874 0.800844 +vn -0.000001 0.598818 0.800885 +vn -0.000000 0.588629 0.808403 +vn -0.000000 0.630920 0.775848 +vn 0.000001 0.630951 0.775823 +vn -0.000001 -0.621013 -0.783800 +vn -0.000000 -0.621036 -0.783782 +vn 0.000000 -0.587499 -0.809225 +vn -0.000001 -0.587467 -0.809249 +vn 0.000002 -0.608620 -0.793462 +vn 0.000001 -0.608589 -0.793486 +vn -0.000001 -0.622553 -0.782578 +vn 0.000002 -0.622607 -0.782535 +vn -0.000000 -0.579800 -0.814759 +vn 0.000001 -0.579828 -0.814739 +vn 0.000001 -0.607936 -0.793986 +vn 0.000002 -0.607958 -0.793969 +vn -0.000001 -0.613508 -0.789688 +vn 0.000000 -0.613543 -0.789661 +vn 0.000002 -0.593973 -0.804485 +vn 0.000001 -0.593955 -0.804498 +vn 0.000001 -0.608167 -0.793809 +vn 0.000001 -0.608174 -0.793803 +vn 0.000000 -0.616920 -0.787026 +vn -0.000001 -0.616883 -0.787054 +vn 0.000000 -0.608613 -0.793467 +vn -0.000001 -0.630902 -0.775863 +vn 0.000001 -0.630929 -0.775840 +vn 0.000000 -0.598805 -0.800895 +vn 0.000001 -0.598823 -0.800882 +vn 0.000000 -0.588600 -0.808425 +vn -0.000000 -0.588582 -0.808437 +vn 0.000000 -0.630910 -0.775856 +vn 0.000000 -0.630920 -0.775848 +vn 0.000001 -1.000000 -0.000003 +vn -0.000001 1.000000 0.000000 +vn 0.000001 -1.000000 -0.000001 +vn 0.000001 -1.000000 -0.000002 +vn -0.000001 1.000000 0.000002 +vn 0.000001 -1.000000 0.000000 +vn -0.000002 1.000000 0.000003 +vn -0.000001 1.000000 0.000004 +vn -0.000001 1.000000 -0.000003 +vn 0.000001 1.000000 0.000003 +vn -0.000000 1.000000 0.000874 +vn -0.000001 1.000000 0.000876 +vn 0.000005 1.000000 -0.000002 +vn 0.000004 1.000000 -0.000000 +vn 0.000000 0.664030 0.747706 +vn 0.000000 0.664033 0.747703 +vn 0.000007 1.000000 0.000001 +s off +f 11473/4514/3 11475/4514/3 11476/4514/3 +f 11473/4514/3 11476/4514/3 11474/4514/3 +f 11477/4514/331 11478/4514/331 11480/4514/331 +f 11480/4514/331 11479/4514/331 11477/4514/331 +f 11473/4514/5065 11474/4514/5065 11478/4514/5065 +f 11473/4514/5065 11478/4514/5065 11477/4514/5065 +f 11474/4514/63 11476/4514/63 11480/4514/63 +f 11480/4514/63 11478/4514/63 11474/4514/63 +f 11476/4514/5066 11475/4514/5066 11479/4514/5066 +f 11479/4514/5066 11480/4514/5066 11476/4514/5066 +f 11475/4514/7 11473/4514/7 11477/4514/7 +f 11477/4514/7 11479/4514/7 11475/4514/7 +f 11481/4515/3 11483/4516/3 11484/4517/3 +f 11688/4515/3 11482/4518/3 11689/4516/3 +f 11485/4519/331 11486/4520/331 11488/4521/331 +f 11690/4519/331 11487/4522/331 11691/4520/331 +f 11692/4519/5065 11693/4523/5065 11694/4524/5065 +f 11695/4519/5065 11696/4525/5065 11697/4523/5065 +f 11698/4519/5067 11699/4526/5067 11700/4527/5067 +f 11701/4519/63 11702/4521/63 11703/4526/63 +f 11704/4528/5066 11705/4529/5066 11706/4528/5066 +f 11707/4528/5066 11708/4529/5066 11709/4529/5066 +f 11710/4530/7 11711/4531/7 11712/4530/7 +f 11713/4530/7 11714/4531/7 11715/4531/7 +f 11514/4532/331 11492/4533/331 11496/4534/331 +f 11526/4535/331 11716/4536/331 11717/4537/331 +f 11513/4538/331 11718/4536/331 11719/4535/331 +f 11720/4539/2860 11721/4540/2860 11497/4541/2860 +f 11512/4542/331 11722/4543/331 11723/4544/331 +f 11724/4545/331 11725/4543/331 11515/4542/331 +f 11726/4546/4399 11727/4547/4399 11498/4548/4399 +f 11525/4549/4399 11728/4547/4399 11729/4546/4399 +f 11491/4549/331 11730/4550/331 11731/4547/331 +f 11732/4551/4399 11733/4550/4399 11493/4552/4399 +f 11734/4553/933 11735/4550/933 11499/4551/933 +f 11524/4550/933 11736/4532/933 11737/4554/933 +f 11738/4555/933 11739/4532/933 11500/4556/933 +f 11511/4557/331 11740/4532/331 11741/4555/331 +f 11742/4558/331 11743/4532/331 11516/4559/331 +f 11510/4560/331 11744/4532/331 11745/4558/331 +f 11509/4561/331 11746/4532/331 11747/4560/331 +f 11748/4562/331 11749/4532/331 11517/4563/331 +f 11750/4564/933 11751/4532/933 11501/4565/933 +f 11523/4566/935 11752/4532/935 11753/4564/935 +f 11508/4567/331 11754/4568/331 11755/4528/331 +f 11490/4569/331 11756/4570/331 11757/4571/331 +f 11490/4569/331 11758/4571/331 11518/4572/331 +f 11507/4573/331 11759/4529/331 11760/4530/331 +f 11761/4574/331 11762/4530/331 11519/4531/331 +f 11506/4575/5068 11763/4531/5068 11764/4576/5068 +f 11489/4577/939 11765/4578/939 11766/4579/939 +f 11767/4579/331 11768/4580/331 11520/4577/331 +f 11769/4578/935 11770/4581/935 11494/4582/935 +f 11771/4582/935 11772/4579/935 11502/4578/935 +f 11773/4583/5069 11774/4584/5069 11503/4585/5069 +f 11522/4586/331 11775/4587/331 11776/4588/331 +f 11777/4589/331 11778/4587/331 11495/4586/331 +f 11504/4589/5070 11505/4590/5070 11779/4591/5070 +f 11780/4589/5071 11781/4591/5071 11782/4587/5071 +f 11783/4592/331 11495/4586/331 11784/4588/331 +f 11521/4592/331 11785/4588/331 11786/4593/331 +f 11787/4591/331 11521/4592/331 11788/4593/331 +f 11536/4590/5072 11537/4592/5072 11598/4591/5072 +f 11599/4594/5073 11789/4595/5073 11790/4596/5073 +f 11534/4597/5074 11791/4596/5074 11792/4595/5074 +f 11793/4598/5075 11600/4594/5075 11794/4599/5075 +f 11601/4596/5076 11602/4599/5076 11538/4594/5076 +f 11795/4600/5077 11539/4598/5077 11796/4601/5077 +f 11603/4602/5078 11604/4600/5078 11540/4603/5078 +f 11797/4601/5079 11541/4603/5079 11798/4600/5079 +f 11605/4604/5080 11606/4602/5080 11542/4605/5080 +f 11799/4603/5081 11543/4605/5081 11800/4602/5081 +f 11607/4606/5082 11608/4604/5082 11544/4607/5082 +f 11801/4605/5083 11545/4607/5083 11802/4604/5083 +f 11609/4608/5084 11610/4609/5084 11546/4610/5084 +f 11803/4611/5085 11547/4610/5085 11804/4609/5085 +f 11611/4612/5086 11612/4608/5086 11548/4613/5086 +f 11805/4610/5087 11549/4613/5087 11806/4608/5087 +f 11614/4614/5088 11613/4612/5088 11550/4615/5088 +f 11807/4613/5089 11551/4615/5089 11808/4612/5089 +f 11615/4616/5090 11616/4614/5090 11552/4617/5090 +f 11809/4615/5091 11553/4617/5091 11810/4614/5091 +f 11617/4618/5092 11618/4616/5092 11554/4619/5092 +f 11811/4617/5093 11555/4619/5093 11812/4616/5093 +f 11619/4620/5094 11620/4621/5094 11556/4622/5094 +f 11813/4623/5094 11557/4620/5094 11814/4624/5094 +f 11621/4622/5095 11622/4624/5095 11558/4620/5095 +f 11815/4625/5096 11559/4623/5096 11816/4626/5096 +f 11623/4624/5097 11624/4626/5097 11560/4623/5097 +f 11817/4627/5098 11561/4625/5098 11818/4628/5098 +f 11625/4626/5099 11626/4628/5099 11562/4625/5099 +f 11819/4629/5100 11563/4627/5100 11820/4630/5100 +f 11627/4628/5101 11628/4630/5101 11564/4627/5101 +f 11821/4631/5101 11565/4629/5101 11822/4632/5101 +f 11629/4630/5102 11630/4632/5102 11566/4629/5102 +f 11823/4633/5103 11567/4631/5103 11824/4634/5103 +f 11633/4632/5104 11632/4634/5104 11568/4631/5104 +f 11825/4635/5105 11569/4633/5105 11826/4636/5105 +f 11635/4634/5106 11634/4636/5106 11570/4633/5106 +f 11827/4637/5107 11571/4635/5107 11828/4638/5107 +f 11637/4636/5108 11636/4638/5108 11572/4635/5108 +f 11829/4639/5109 11573/4637/5109 11830/4640/5109 +f 11639/4638/5110 11638/4640/5110 11574/4637/5110 +f 11831/4641/5111 11575/4639/5111 11832/4642/5111 +f 11641/4640/5112 11640/4642/5112 11576/4639/5112 +f 11833/4643/5113 11577/4641/5113 11834/4644/5113 +f 11643/4645/5114 11642/4643/5114 11578/4646/5114 +f 11835/4644/5115 11579/4646/5115 11836/4643/5115 +f 11645/4647/5116 11644/4645/5116 11580/4648/5116 +f 11837/4646/5117 11581/4648/5117 11838/4645/5117 +f 11647/4649/5118 11646/4647/5118 11582/4650/5118 +f 11839/4648/5119 11583/4650/5119 11840/4647/5119 +f 11649/4651/5120 11648/4649/5120 11584/4652/5120 +f 11841/4650/5121 11585/4652/5121 11842/4649/5121 +f 11651/4653/5122 11650/4651/5122 11586/4654/5122 +f 11843/4652/5123 11587/4654/5123 11844/4651/5123 +f 11653/4655/5124 11652/4656/5124 11588/4657/5124 +f 11845/4658/5124 11589/4657/5124 11846/4656/5124 +f 11655/4659/5125 11654/4660/5125 11590/4661/5125 +f 11847/4662/5126 11591/4661/5126 11848/4660/5126 +f 11657/4661/5127 11656/4662/5127 11592/4663/5127 +f 11849/4664/5128 11593/4663/5128 11850/4662/5128 +f 11659/4663/5129 11658/4664/5129 11594/4665/5129 +f 11851/4666/5130 11595/4665/5130 11852/4664/5130 +f 11661/4665/5131 11660/4666/5131 11596/4667/5131 +f 11853/4668/5132 11597/4667/5132 11854/4666/5132 +f 11855/4667/5133 11856/4668/5133 11857/4669/5133 +f 11858/4670/252 11859/4669/252 11860/4668/252 +f 11861/4669/243 11862/4670/243 11863/4671/243 +f 11864/4672/331 11865/4671/331 11866/4670/331 +f 11867/4671/2216 11868/4672/2216 11869/4673/2216 +f 11870/4674/243 11871/4673/243 11872/4672/243 +f 11873/4673/252 11874/4674/252 11875/4675/252 +f 11876/4676/252 11877/4675/252 11878/4674/252 +f 11879/4675/2216 11880/4676/2216 11881/4677/2216 +f 11882/4678/2216 11883/4677/2216 11884/4676/2216 +f 11885/4677/3 11886/4678/3 11887/4679/3 +f 11888/4680/3 11889/4679/3 11890/4678/3 +f 11891/4681/243 11892/4682/243 11893/4680/243 +f 11894/4682/243 11895/4681/243 11896/4683/243 +f 11897/4684/3 11898/4683/3 11899/4681/3 +f 11900/4683/252 11901/4684/252 11902/4685/252 +f 11903/4686/243 11904/4685/243 11905/4684/243 +f 11906/4685/243 11907/4686/243 11908/4687/243 +f 11909/4688/252 11910/4687/252 11911/4686/252 +f 11912/4687/252 11913/4688/252 11914/4689/252 +f 11915/4690/243 11916/4689/243 11917/4688/243 +f 11918/4689/243 11919/4690/243 11920/4691/243 +f 11921/4692/252 11922/4691/252 11923/4690/252 +f 11924/4691/252 11925/4692/252 11926/4693/252 +f 11927/4694/5134 11928/4693/5134 11929/4692/5134 +f 11930/4693/4399 11931/4694/4399 11932/4695/4399 +f 11933/4696/252 11934/4695/252 11935/4694/252 +f 11936/4695/5135 11937/4696/5135 11938/4697/5135 +f 11939/4698/4399 11940/4697/4399 11941/4696/4399 +f 11942/4697/4399 11943/4698/4399 11944/4699/4399 +f 11945/4700/5136 11946/4699/5136 11947/4698/5136 +f 11948/4701/252 11949/4702/252 11950/4700/252 +f 11951/4702/331 11952/4701/331 11953/4703/331 +f 11954/4704/4399 11955/4703/4399 11956/4701/4399 +f 11957/4703/2185 11958/4704/2185 11959/4705/2185 +f 11960/4706/5135 11961/4705/5135 11962/4704/5135 +f 11963/4705/4399 11964/4706/4399 11965/4707/4399 +f 11966/4708/4399 11967/4707/4399 11968/4706/4399 +f 11969/4707/3 11970/4708/3 11971/4709/3 +f 11972/4710/5135 11973/4709/5135 11974/4708/5135 +f 11975/4709/5137 11976/4710/5137 11977/4711/5137 +f 11978/4712/5137 11979/4711/5137 11980/4710/5137 +f 11981/4711/3 11982/4712/3 11983/4713/3 +f 11984/4714/5136 11985/4713/5136 11986/4712/5136 +f 11987/4713/4399 11988/4714/4399 11989/4715/4399 +f 11990/4716/331 11991/4715/331 11992/4714/331 +f 11993/4715/5135 11994/4716/5135 11995/4717/5135 +f 11996/4718/5138 11997/4717/5138 11998/4716/5138 +f 11999/4607/2089 12000/4605/2089 12001/4671/2089 +f 12002/4669/5139 12003/4671/5139 12004/4605/5139 +f 12005/4611/5136 12006/4607/5136 12007/4673/5136 +f 12008/4671/5135 12009/4673/5135 12010/4607/5135 +f 12011/4613/243 12012/4610/243 12013/4677/243 +f 12014/4675/5140 12015/4677/5140 12016/4610/5140 +f 12017/4715/5138 12018/4717/5138 12019/4650/5138 +f 12020/4654/5135 12021/4652/5135 12022/4719/5135 +f 12023/4717/4333 12024/4719/4333 12025/4652/4333 +f 12026/4657/4399 12027/4658/4399 12028/4720/4399 +f 12029/4721/4372 12030/4722/4372 12031/4655/4372 +f 12032/4651/2850 12033/4653/2850 12034/4718/2850 +f 11533/4723/243 11532/4724/243 11662/4649/243 +f 12035/4714/243 12036/4647/243 11528/4725/243 +f 12037/4726/5141 11673/4725/5141 12038/4647/5141 +f 11672/4710/5142 12039/4643/5142 12040/4727/5142 +f 11678/4701/942 12041/4635/942 12042/4728/942 +f 12043/4729/243 12044/4728/243 12045/4635/243 +f 12046/4618/4399 12047/4684/4399 11527/4730/4399 +f 12048/4730/331 12049/4731/331 11677/4618/331 +f 11529/4732/331 12050/4733/331 12051/4614/331 +f 12052/4678/243 11676/4612/243 12053/4734/243 +f 12054/4608/935 12055/4676/935 11664/4735/935 +f 11664/4735/4099 11663/4736/4099 11665/4608/4099 +f 11667/4606/5137 11679/4672/5137 11666/4737/5137 +f 12056/4670/5137 12057/4604/5137 12058/4738/5137 +f 12059/4602/243 12060/4668/243 12061/4739/243 +f 11530/4666/243 12062/4600/243 12063/4740/243 +f 12064/4741/5143 11535/4740/5143 11631/4600/5143 +f 12065/4742/5144 12066/4743/5144 12067/4598/5144 +f 11675/4662/243 12068/4594/243 12069/4583/243 +f 12070/4584/243 12071/4583/243 11531/4594/243 +f 12072/4744/331 11671/4745/331 11680/4746/331 +f 12073/4747/935 12074/4748/935 12075/4748/935 +f 11670/4749/331 12076/4750/331 12077/4751/331 +f 12078/4752/4399 12079/4753/4399 12080/4754/4399 +f 12081/4754/331 11681/4753/331 12082/4748/331 +f 11669/4755/5145 11682/4756/5145 11668/4752/5145 +f 12083/4756/2187 12084/4757/2187 12085/4752/2187 +f 12086/4757/5146 12087/4753/5146 12088/4752/5146 +f 11674/4758/942 12089/4759/942 12090/4760/942 +f 12091/4759/331 12092/4761/331 12093/4762/331 +f 12094/4759/5147 12095/4762/5147 12096/4760/5147 +f 12097/4762/5148 12098/4763/5148 12099/4750/5148 +f 12100/4655/5149 12101/4721/5149 12102/4764/5149 +f 12103/4765/938 12104/4756/938 12105/4755/938 +f 12106/4514/933 11686/4514/933 11685/4514/933 +f 11686/4514/5137 12107/4514/5137 12108/4514/5137 +f 11686/4514/243 12109/4514/243 11687/4514/243 +f 12110/4514/935 11684/4514/935 11687/4514/935 +f 11685/4514/5137 11683/4514/5137 12111/4514/5137 diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro index 201a4d82..bd736360 100644 --- a/examples/datavisualization/datavisualization.pro +++ b/examples/datavisualization/datavisualization.pro @@ -17,7 +17,8 @@ SUBDIRS += qmlbars \ scatter \ surface \ rotations \ - draggableaxes + draggableaxes \ + customitems } qtHaveModule(multimedia):!android:!ios: SUBDIRS += audiolevels diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index bdcb8871..142a9b67 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1163,8 +1163,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glEnable(GL_TEXTURE_2D); // Draw selection buffer - if (!m_cachedIsSlicingActivated && !m_renderCacheList.isEmpty() - && !m_customRenderCache.isEmpty() + if (!m_cachedIsSlicingActivated && (!m_renderCacheList.isEmpty() + || !m_customRenderCache.isEmpty()) && m_selectionState == SelectOnScene && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { m_selectionShader->bind(); @@ -1774,7 +1774,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamera, const QMatrix4x4 &viewMatrix, - const QMatrix4x4 &projectionMatrix) { + const QMatrix4x4 &projectionMatrix) +{ ShaderHelper *shader = 0; GLfloat alphaForValueSelection = labelValueAlpha / 255.0f; GLfloat alphaForRowSelection = labelRowAlpha / 255.0f; -- cgit v1.2.3 From 555acef736a72cdc92113a268826a6bba77fbe40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 23 Apr 2014 09:58:15 +0300 Subject: Added QML support for custom items Task-number: QTRD-3048 Change-Id: I90e6fbee38bae858c2e0910178684e28eacc6472 Reviewed-by: Mika Salmela --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 40 + src/datavisualization/engine/qabstract3dgraph.cpp | 4 +- src/datavisualizationqml2/abstractdeclarative.cpp | 32 +- src/datavisualizationqml2/abstractdeclarative_p.h | 8 +- tests/qmlcamera/qml/qmlcamera/main.qml | 27 +- tests/qmlcamera/qmlcamera.qrc | 4 + tests/qmlcamera/shuttle.obj | 6349 ++++++++++++++++++++ tests/qmlcamera/shuttle.png | Bin 0 -> 1361 bytes 8 files changed, 6454 insertions(+), 10 deletions(-) create mode 100644 tests/qmlcamera/shuttle.obj create mode 100644 tests/qmlcamera/shuttle.png diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index e6e3e881..36c812f1 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -149,3 +149,43 @@ * Clears selection from all attached series. */ +/*! + * \qmlmethod int AbstractGraph3D::addCustomItem(string meshFile, vector3d position, vector3d scaling, quaternion rotation, string textureFile) + * + * Adds a custom mesh item located in \a meshFile to a graph at \a position with \a {scaling}, + * \a rotation and optional image for a texture located at \a textureFile. Item must be in + * Wavefront obj format and include vertices, normals and UVs. It also needs to be in triangles. + * Item position is given in data coordinates. + * + * \return index to the added item. + * + * \note No validity checks are made for the position of the item, so it is up to the user to + * provide a valid position. Items positioned outside axis ranges are still rendered. + * + * \sa removeCustomItemAt() + * + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod void AbstractGraph3D::removeCustomItemAt(int index) + * + * Removes the custom item at \a {index}. Deletes the resources allocated to it. + * + * \note The index of the remaining items will change if the item removed is other than + * the last. + * + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod void AbstractGraph3D::removeCustomItemAt(vector3d position) + * + * Removes the custom item at \a {position}. Deletes the resources allocated to it. + * + * \note The index of the remaining items will change if an item is removed from a position that + * is not at the last index. + * + * \since Qt Data Visualization 1.1 + */ + diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 1c46427d..e143e756 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -405,7 +405,7 @@ int QAbstract3DGraph::addCustomItem(const QString &meshFile, const QVector3D &po } /*! - * Removes the custom item at \a {index}. Deletes the resource allocated to it. + * Removes the custom item at \a {index}. Deletes the resources allocated to it. * * \note The index of the remaining items will change if the item removed is other than * the last. @@ -418,7 +418,7 @@ void QAbstract3DGraph::removeCustomItemAt(int index) } /*! - * Removes the custom item at \a {position}. Deletes the resource allocated to it. + * Removes the custom item at \a {position}. Deletes the resources allocated to it. * * \note The index of the remaining items will change if an item is removed from a position that * is not at the last index. diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 881a7860..2a02ad24 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -37,18 +37,18 @@ AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) : m_controller(0), m_contextWindow(0), m_renderMode(RenderIndirect), -#if defined(QT_OPENGL_ES_2) + #if defined(QT_OPENGL_ES_2) m_samples(0), -#else + #else m_samples(4), -#endif + #endif m_windowSamples(0), m_initialisedSize(0, 0), -#ifdef USE_SHARED_CONTEXT + #ifdef USE_SHARED_CONTEXT m_context(0), -#else + #else m_stateStore(0), -#endif + #endif m_qtContext(0), m_mainThread(QThread::currentThread()), m_contextThread(0) @@ -211,6 +211,26 @@ bool AbstractDeclarative::shadowsSupported() const return m_controller->shadowsSupported(); } +int AbstractDeclarative::addCustomItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QString &textureFile) +{ + QImage textureImage; + if (!textureFile.isNull()) + textureImage = QImage(textureFile); + return m_controller->addCustomItem(meshFile, position, scaling, rotation, textureImage); +} + +void AbstractDeclarative::removeCustomItemAt(int index) +{ + m_controller->deleteCustomItem(index); +} + +void AbstractDeclarative::removeCustomItemAt(const QVector3D &position) +{ + m_controller->deleteCustomItem(position); +} + void AbstractDeclarative::setSharedController(Abstract3DController *controller) { Q_ASSERT(controller); diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 8ba86b11..4f73380f 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -128,7 +128,13 @@ public: Q_INVOKABLE virtual void clearSelection(); - virtual void geometryChanged(const QRectF & newGeometry, const QRectF & oldGeometry); + Q_INVOKABLE virtual int addCustomItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QString &textureFile = 0); + Q_INVOKABLE virtual void removeCustomItemAt(int index); + Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); + + virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); void setSharedController(Abstract3DController *controller); // Used to synch up data model from controller to renderer while main thread is locked diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index 264d613e..56e7d035 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -75,9 +75,10 @@ Rectangle { property bool selectionOn: false onPressed: { - if (mouse.button == Qt.LeftButton) + if (mouse.button == Qt.LeftButton) { selectionOn = true; testChart.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y); + } } onReleased: { @@ -162,4 +163,28 @@ Rectangle { } } } + + Button { + id: shuttleAdd + anchors.bottom: dataToggle.top + width: camControlArea.width + text: "Add Shuttle" + property bool addObject: true + onClicked: { + if (addObject === true) { + testChart.addCustomItem(":/items/shuttle.obj", + Qt.vector3d(5.0,35.0,3.0), + Qt.vector3d(0.2,0.2,0.2), + Qt.quaternion(0.0,0.0,0.0,0.0), + ":/items/shuttle.png") + text = "Remove Shuttle" + addObject = false + } else { + testChart.removeCustomItemAt(Qt.vector3d(5.0,35.0,3.0)) + text = "Add Shuttle" + addObject = true + } + } + } + } diff --git a/tests/qmlcamera/qmlcamera.qrc b/tests/qmlcamera/qmlcamera.qrc index 90cb0867..3612fa9f 100644 --- a/tests/qmlcamera/qmlcamera.qrc +++ b/tests/qmlcamera/qmlcamera.qrc @@ -5,4 +5,8 @@ qml/qmlcamera/Data.qml qml/qmlcamera/main.qml + + shuttle.obj + shuttle.png + diff --git a/tests/qmlcamera/shuttle.obj b/tests/qmlcamera/shuttle.obj new file mode 100644 index 00000000..e872228d --- /dev/null +++ b/tests/qmlcamera/shuttle.obj @@ -0,0 +1,6349 @@ +# Blender v2.66 (sub 0) OBJ File: '' +# www.blender.org +v -0.290924 -0.416888 -3.733797 +v -0.033253 -0.399965 -3.916942 +v 0.098892 -0.335648 -4.014968 +v 0.110144 -0.419894 -4.016005 +v -0.014627 -0.351984 -3.919619 +v -0.003375 -0.436229 -3.920655 +v 0.077510 -0.338845 -3.987319 +v 0.088762 -0.423090 -3.988356 +v 0.268419 -0.311615 -4.127978 +v 0.279672 -0.395861 -4.129015 +v -0.216945 -0.357152 -3.636585 +v -0.442480 -0.421494 -3.440589 +v 0.040557 -0.350366 -3.819523 +v -0.366883 -0.356351 -3.352865 +v -0.059636 -0.414591 -3.440213 +v 0.195164 -0.388461 -3.624492 +v -0.508658 -0.419445 -3.066802 +v -0.205255 -0.426666 -3.173799 +v -0.446409 -0.327120 -2.985436 +v -0.301084 -0.444031 -2.817294 +v 0.151449 -0.262081 -3.165398 +v 0.405315 -0.264481 -3.348743 +v 0.818570 -0.244023 -3.649532 +v 0.829822 -0.328268 -3.650568 +v 0.438945 -0.298561 -3.337861 +v 0.450197 -0.382806 -3.338897 +v 0.010751 -0.257630 -2.926187 +v 0.476024 -0.294278 -3.283418 +v 0.487276 -0.378524 -3.284455 +v 0.893196 -0.234640 -3.602006 +v 0.904448 -0.318886 -3.603042 +v -0.575146 -0.405155 -2.358083 +v -0.526846 -0.291701 -2.296914 +v -0.123567 -0.205514 -2.586394 +v -0.401501 -0.443667 -2.166967 +v 0.438519 -0.375468 -2.805563 +v 0.688118 -0.342410 -2.991890 +v 0.304996 -0.393955 -2.597466 +v -0.651696 -0.393273 -1.762192 +v -0.615966 -0.265853 -1.716287 +v -0.263638 -0.153966 -1.992210 +v 0.143186 -0.430595 -2.279088 +v -0.512839 -0.438185 -1.613670 +v -0.710028 -0.388098 -1.448538 +v -0.679965 -0.261349 -1.410043 +v -0.813314 -0.388657 -1.206769 +v 0.751287 -0.156495 -2.401505 +v 0.998622 -0.165467 -2.585768 +v -0.031714 -0.447371 -1.755604 +v -0.583894 -0.434779 -1.325088 +v -0.408965 -0.117462 -1.482493 +v -0.790573 -0.268054 -1.169135 +v 0.625851 -0.150158 -2.234187 +v -1.051885 -0.397310 -0.885646 +v -1.031232 -0.284379 -0.851625 +v -0.707410 -0.437077 -1.088477 +v -1.334166 -0.408930 -0.570468 +v 0.404917 -0.087146 -1.938298 +v -0.498689 -0.116097 -1.212783 +v -1.314745 -0.307881 -0.538558 +v -0.959224 -0.446984 -0.774490 +v 1.798825 0.967755 -3.015114 +v 2.046406 0.986555 -3.209870 +v 1.795686 1.006585 -3.015357 +v 2.043267 1.025386 -3.210112 +v 1.806945 0.929656 -3.008470 +v 2.054526 0.948456 -3.203225 +v 1.797665 1.044451 -3.009186 +v 2.045245 1.063251 -3.203941 +v -0.218636 -0.452499 -1.294639 +v -0.644958 -0.132219 -0.977335 +v 1.804675 1.079696 -2.996872 +v 2.052256 1.098496 -3.191627 +v -1.248682 -0.457011 -0.466167 +v 1.840314 0.837931 -2.974904 +v 2.087895 0.856731 -3.169660 +v 1.646588 -0.144702 -2.733368 +v 1.657840 -0.228948 -2.734405 +v 1.737599 -0.131659 -2.805524 +v 1.748852 -0.215905 -2.806561 +v 1.819258 1.148577 -2.971684 +v 1.033279 0.836881 -2.319959 +v 1.031777 0.970096 -2.298396 +v 1.060381 0.758531 -2.296534 +v -0.899523 -0.158764 -0.676483 +v 0.945538 0.814187 -2.200939 +v 0.170080 -0.031614 -1.496071 +v 1.043881 1.032762 -2.270612 +v 0.966443 0.743790 -2.180778 +v 0.952423 0.936921 -2.181507 +v 1.858652 1.239977 -2.912781 +v -0.317238 -0.452926 -1.060344 +v -1.192492 -0.196285 -0.374663 +v 1.856681 0.583228 -2.822182 +v 2.018811 -0.094129 -2.886386 +v 0.967854 0.995533 -2.156932 +v 1.272977 -0.200327 -2.268122 +v 1.284228 -0.284573 -2.269158 +v 1.076506 1.117039 -2.211863 +v -0.484562 -0.458987 -0.834904 +v 1.848687 0.788896 -2.757349 +v 2.078178 -0.164712 -2.848704 +v 1.967059 0.229003 -2.794663 +v 1.967832 0.643840 -2.831535 +v 2.215413 0.662641 -3.026290 +v 0.936685 0.816251 -2.042840 +v 2.039912 0.250063 -2.839813 +v 1.003257 1.074974 -2.104949 +v 1.164321 0.598239 -2.181823 +v 0.950019 0.768391 -2.028775 +v 0.943810 0.900014 -2.031005 +v 2.521226 0.390336 -3.213021 +v 1.936351 1.129229 -2.824698 +v 2.183932 1.148030 -3.019454 +v 2.568967 0.404915 -3.250601 +v 1.055366 0.603082 -2.081103 +v 0.869869 0.465058 -1.923758 +v 0.936491 -0.173930 -1.917023 +v 2.705161 0.067033 -3.318110 +v 2.096944 0.264363 -2.850901 +v 1.957182 0.386704 -2.747152 +v 2.029313 0.077472 -2.774992 +v 0.955724 0.940103 -2.015164 +v 1.928438 1.372002 -2.811322 +v -0.765050 -0.471609 -0.536370 +v 2.030367 0.402476 -2.793896 +v 2.100080 0.103611 -2.820803 +v 2.514476 0.522913 -3.173254 +v 2.574949 0.263657 -3.196595 +v 2.562289 0.536088 -3.211256 +v 2.622122 0.279579 -3.234349 +v 2.598488 0.409527 -3.214962 +v -0.064938 0.006053 -1.100592 +v 2.088244 0.403277 -2.809050 +v 2.151782 0.130884 -2.833575 +v 2.199769 1.159790 -2.964559 +v 2.193588 1.233527 -2.965299 +v 2.221596 1.161935 -2.979915 +v 2.215481 1.234891 -2.980646 +v 2.136538 0.271664 -2.829406 +v 1.137830 1.220917 -2.137315 +v 0.872108 0.654248 -1.875077 +v 0.961190 -0.247342 -1.861737 +v 2.739614 0.051854 -3.275776 +v -2.850674 0.163164 1.082772 +v -2.774223 -0.444295 1.078949 +v -2.508742 -0.433973 0.871016 +v -2.566129 0.205717 0.857016 +v 0.982043 0.994775 -1.981001 +v -1.069794 -0.481435 -0.242789 +v 2.592936 0.518564 -3.182256 +v 2.642673 0.305340 -3.201453 +v -2.926099 0.145051 1.155134 +v -2.869277 -0.451273 1.165592 +v 1.009718 0.673075 -1.961110 +v 2.235091 1.170649 -2.961918 +v 1.045386 1.162465 -2.033586 +v 2.230007 1.231294 -2.962527 +v 2.325998 0.322675 -2.951759 +v 1.972627 1.185781 -2.753756 +v 2.129131 0.389939 -2.793774 +v 2.183229 0.158016 -2.814654 +v 2.227766 1.099078 -2.934829 +v 1.117407 -0.306283 -1.939579 +v 1.981589 1.144577 -2.746340 +v 1.973910 1.228192 -2.748031 +v 2.249297 1.101867 -2.950499 +v 2.210880 1.300532 -2.936848 +v 1.886303 0.951739 -2.651532 +v 2.165588 -0.207364 -2.762840 +v 1.360371 -0.269775 -2.128519 +v 2.232590 1.301186 -2.952497 +v 2.160973 0.274542 -2.798066 +v 0.937019 0.410104 -1.852872 +v 0.960798 0.265444 -1.858128 +v 2.041237 1.191461 -2.784518 +v 2.048705 1.157124 -2.778339 +v 2.042305 1.226803 -2.779748 +v 2.258118 1.120717 -2.937466 +v 2.320933 0.422137 -2.921925 +v 2.366302 0.227636 -2.939436 +v 1.976683 1.431691 -2.744228 +v 2.244230 1.286403 -2.939127 +v -3.086442 -0.474834 1.379359 +v 1.999431 1.110853 -2.726914 +v 1.985242 1.265353 -2.730038 +v -3.023720 -0.458462 1.334241 +v -3.024019 0.109883 1.282283 +v -2.844489 0.344693 1.122684 +v -2.737176 -0.511595 1.117650 +v -2.469550 -0.506414 0.908517 +v -2.551327 0.395732 0.889431 +v 1.000046 -0.329019 -1.811242 +v 2.154800 0.373104 -2.768372 +v 2.199881 0.179835 -2.785773 +v -2.914064 0.322285 1.189905 +v -2.834171 -0.518740 1.204847 +v 1.179604 1.267508 -2.087104 +v 2.051748 1.257770 -2.764754 +v 2.063573 1.129020 -2.762150 +v 2.080589 1.195258 -2.775463 +v -0.196284 0.002337 -0.889996 +v 1.013546 1.060481 -1.927888 +v -3.072142 -0.445996 1.396327 +v 2.603875 0.637948 -3.126857 +v 2.707508 0.193661 -3.166857 +v 2.085482 1.172761 -2.771414 +v 2.081289 1.218414 -2.772337 +v 1.075555 1.201415 -1.986324 +v 2.002330 0.508317 -2.645192 +v 2.127263 -0.027287 -2.693413 +v 2.556508 0.625865 -3.087951 +v 2.661251 0.176820 -3.128379 +v 2.074001 0.520013 -2.695353 +v 2.194747 0.002364 -2.741958 +v 1.000951 0.830916 -1.880131 +v 2.095224 1.154349 -2.760807 +v 2.087476 1.238703 -2.762513 +v 2.023438 1.089743 -2.698434 +v 2.004898 1.291606 -2.702516 +v -3.122983 -0.461461 1.459483 +v -3.158215 -0.041663 1.448402 +v -2.497997 0.004146 0.929450 +v -2.509563 0.149734 0.925099 +v 1.003036 0.858653 -1.877204 +v 2.270079 1.067661 -2.884072 +v 1.005703 0.814744 -1.874867 +v 2.291162 1.070783 -2.900280 +v 2.128013 0.510403 -2.719236 +v 2.238064 0.038604 -2.761713 +v 2.068128 1.279648 -2.741818 +v 2.083579 1.111428 -2.738417 +v 2.247011 1.342852 -2.886831 +v 2.268338 1.343057 -2.903010 +v -2.993610 -0.524459 1.373357 +v -2.994892 0.277606 1.300703 +v 2.627505 0.603237 -3.112099 +v 2.713651 0.233920 -3.145348 +v 2.292918 1.094878 -2.895721 +v 1.006938 0.871768 -1.872413 +v 2.105035 1.197866 -2.757530 +v 2.093582 1.187722 -2.747088 +v 2.092232 1.203828 -2.747250 +v 2.273946 1.321208 -2.897990 +v 0.912103 0.803812 -1.788658 +v 1.019079 -0.292614 -1.771378 +v 2.804159 0.046327 -3.194257 +v 2.107537 1.186366 -2.755460 +v 2.105394 1.209702 -2.755932 +v 2.245164 0.292374 -2.778011 +v 0.747334 -0.381459 -1.545246 +v 2.108331 1.142823 -2.745258 +v 2.098208 1.253036 -2.747486 +v 2.099697 1.174463 -2.740594 +v 2.096009 1.218463 -2.741035 +v 2.112516 1.176954 -2.750038 +v 2.108556 1.220074 -2.750911 +v 1.015678 0.889476 -1.861661 +v 2.162992 0.481149 -2.717304 +v 2.256692 0.079446 -2.753470 +v 1.035607 1.090416 -1.893256 +v 2.119216 1.171063 -2.742090 +v 2.114042 1.227400 -2.743229 +v -3.036469 -0.488219 1.432582 +v 1.026486 0.781917 -1.851175 +v 2.241119 0.356951 -2.758555 +v 2.270656 0.230325 -2.769956 +v -0.400720 -0.022989 -0.663568 +v 2.108939 1.167601 -2.729508 +v 2.352467 0.499374 -2.857929 +v 2.431048 0.162488 -2.888259 +v 2.103901 1.227706 -2.730110 +v 2.078094 0.869479 -2.669583 +v 2.325675 0.888279 -2.864338 +v 2.049954 1.084459 -2.665236 +v 2.029886 1.302955 -2.669655 +v 2.105674 1.107026 -2.710752 +v 2.088951 1.289105 -2.714434 +v 2.107442 1.198835 -2.720560 +v 2.122808 1.139938 -2.727132 +v 2.111851 1.259233 -2.729544 +v 2.126617 1.169588 -2.732825 +v 2.121016 1.230568 -2.734058 +v 2.126010 1.200245 -2.735167 +v 2.126854 1.200309 -2.735831 +v -3.255541 -0.463337 1.614298 +v -3.256979 -0.068785 1.579187 +v -3.090151 -0.525402 1.492390 +v -3.140838 0.071873 1.477060 +v 2.183017 0.449113 -2.704647 +v 2.261101 0.114361 -2.734786 +v 1.025626 0.910940 -1.843900 +v 2.118830 1.168976 -2.716800 +v 2.113792 1.229081 -2.717403 +v 2.133590 1.172756 -2.723654 +v 2.128416 1.229093 -2.724793 +v -2.405642 -0.551479 0.981773 +v -2.505313 0.545503 0.958747 +v 1.032741 0.920593 -1.832253 +v 2.139077 1.180082 -2.715972 +v 2.135116 1.223202 -2.716844 +v 2.126722 1.178219 -2.705876 +v 2.123034 1.222219 -2.706317 +v 2.136451 1.146135 -2.709190 +v 2.126328 1.256348 -2.711419 +v 2.142239 1.190453 -2.710951 +v 2.140096 1.213790 -2.711423 +v 2.330166 1.100055 -2.847870 +v 2.130499 1.192853 -2.699662 +v 2.129149 1.208959 -2.699824 +v 2.142597 1.202290 -2.709353 +v 2.311194 1.326385 -2.850139 +v -0.678415 -0.058034 -0.389918 +v 2.126498 1.116483 -2.683367 +v 2.111047 1.284703 -2.686769 +v 2.335972 1.077011 -2.842714 +v 2.315368 1.073955 -2.825890 +v 2.297923 0.301154 -2.738834 +v 2.313149 1.349285 -2.845444 +v -3.224716 -0.523658 1.644234 +v -3.228977 0.037748 1.596002 +v 2.259607 0.406750 -2.716804 +v 2.310765 0.187427 -2.736550 +v 2.292301 1.349146 -2.828649 +v 1.051190 0.836263 -1.810548 +v 2.074942 1.095809 -2.632374 +v 2.056402 1.297672 -2.636457 +v 1.051411 0.836718 -1.810222 +v 1.051764 0.833314 -1.810103 +v 2.147183 1.160469 -2.694164 +v 2.139435 1.244822 -2.695870 +v 1.051937 0.833724 -1.809843 +v 1.051832 0.835286 -1.809826 +v 1.052011 0.834070 -1.809716 +v 1.052027 0.833906 -1.809712 +v 1.051999 0.834825 -1.809658 +v 1.051961 0.835391 -1.809651 +v 1.052122 0.834297 -1.809553 +v 2.289008 0.296555 -2.724424 +v 1.946327 1.084103 -2.529010 +v 2.264997 -0.237532 -2.656099 +v -3.146048 -0.468059 1.586396 +v 2.295856 0.334163 -2.728890 +v 2.310954 0.269436 -2.734717 +v 2.287534 0.325511 -2.715739 +v 2.300741 0.268886 -2.720837 +v 2.153370 1.180757 -2.684340 +v 2.149177 1.226410 -2.685263 +v -2.995660 -0.411552 1.480706 +v 1.055648 0.923143 -1.800017 +v 2.154070 1.203913 -2.681214 +v -0.987628 -0.106173 -0.106669 +v -3.134648 -0.466717 1.601017 +v 2.142878 1.138361 -2.660432 +v 2.131053 1.267111 -2.663036 +v 2.305306 0.359619 -2.707547 +v 2.331457 0.247507 -2.717641 +v 2.296714 0.347997 -2.697108 +v 2.319591 0.249920 -2.705938 +v 2.094598 1.122062 -2.604852 +v 2.080408 1.276562 -2.607976 +v 0.470274 -0.415629 -1.195124 +v 2.682583 0.683203 -3.020018 +v 2.802250 0.170184 -3.066206 +v 2.692932 0.640855 -3.023288 +v 2.792405 0.214405 -3.061682 +v 2.636060 0.671604 -2.979968 +v 2.757006 0.153092 -3.026651 +v 2.359883 1.134861 -2.806733 +v 2.152321 1.169328 -2.645438 +v 2.145921 1.239007 -2.646847 +v 2.345995 1.300547 -2.808394 +v 2.153390 1.204670 -2.640668 +v 2.412149 0.533689 -2.776916 +v 2.502886 0.144687 -2.811939 +v 0.970224 0.925229 -1.686331 +v 1.091354 -0.325301 -1.665935 +v 2.881699 0.045075 -3.095805 +v 2.371721 1.118882 -2.793227 +v 2.351501 1.116275 -2.775872 +v -3.112347 -0.464090 1.629621 +v 2.105930 1.159222 -2.586859 +v 2.098250 1.242837 -2.588550 +v 2.355013 1.318201 -2.795225 +v 2.334614 1.317729 -2.777893 +v 2.314089 0.357987 -2.673523 +v 2.340505 0.244738 -2.683719 +v 1.104303 1.101391 -1.798523 +v 2.090404 0.561258 -2.516102 +v 2.159124 0.571179 -2.570591 +v 2.234664 -0.057203 -2.571783 +v 2.205596 0.557038 -2.605525 +v 2.229047 0.520855 -2.620486 +v 2.238063 0.482200 -2.623966 +v 2.298549 -0.026551 -2.624406 +v 2.332671 0.012252 -2.654572 +v 2.295672 0.428428 -2.663943 +v 2.328226 0.095662 -2.658767 +v 2.337243 0.057009 -2.662247 +v 2.319328 0.300003 -2.670594 +v 2.323741 0.370700 -2.680527 +v 2.354745 0.175176 -2.686744 +v 2.343450 0.307384 -2.690079 +v 2.353938 0.241245 -2.692182 +v 1.085896 0.905799 -1.761274 +v 2.107213 1.201633 -2.581135 +v 1.172914 1.208536 -1.853034 +v -3.524472 -0.463065 1.962955 +v -3.542270 -0.167984 1.949735 +v 2.374104 1.189970 -2.783334 +v 2.369021 1.250615 -2.783942 +v 1.303689 1.278820 -1.940955 +v -2.749923 0.604098 1.287890 +v -2.601352 -0.583194 1.281085 +v -2.331104 -0.584296 1.070484 +v -2.444929 0.666788 1.044342 +v 2.335002 0.352805 -2.651304 +v 2.357880 0.254727 -2.660134 +v -2.812832 0.575628 1.346300 +v -2.702155 -0.590712 1.367115 +v 2.388829 1.185178 -2.765078 +v 2.382714 1.258133 -2.765809 +v 2.346222 0.364438 -2.655067 +v 2.372374 0.252327 -2.665161 +v 2.368793 1.183281 -2.747422 +v 2.362612 1.257019 -2.748161 +v -3.502416 -0.514638 1.987533 +v -3.528153 -0.092777 1.968860 +v -2.930290 -0.491180 1.547024 +v 2.066685 0.851305 -2.470213 +v -3.080119 -0.460294 1.670958 +v 2.353852 0.333838 -2.636405 +v 2.367060 0.277213 -2.641503 +v 2.140192 0.869385 -2.515599 +v -2.873451 -0.595312 1.528083 +v -2.875654 0.517249 1.427634 +v 2.123721 1.449962 -2.555544 +v 2.366726 0.342510 -2.637991 +v 2.381824 0.277783 -2.643818 +v 2.365586 0.306170 -2.632818 +v 0.180044 -0.433739 -0.860263 +v 2.390810 0.196854 -2.633883 +v 2.339653 0.416178 -2.614137 +v 2.379757 0.310792 -2.633873 +v -2.972414 -0.594417 1.632153 +v -3.043199 0.236465 1.611041 +v 2.197619 0.881876 -2.526829 +v 1.155619 0.140929 -1.644002 +v 2.061041 1.010198 -2.426111 +v 2.124709 0.698580 -2.447134 +v 2.629037 1.066507 -2.869623 +v 2.771686 0.621339 -2.939622 +v 2.857832 0.252023 -2.972872 +v 2.676305 1.087418 -2.904726 +v 2.483987 0.515887 -2.700598 +v 2.562568 0.179001 -2.730927 +v 2.134736 1.022953 -2.472975 +v 2.196270 0.721780 -2.493294 +v -3.115630 -0.588979 1.772415 +v -3.122642 0.192029 1.706162 +v 2.305190 0.463503 -2.547947 +v 2.383274 0.128751 -2.578085 +v 2.026136 1.180204 -2.395136 +v 2.372061 -0.253901 -2.533144 +v 0.043832 -0.439397 -0.700086 +v -2.331525 -0.123197 1.132486 +v 2.610039 1.166097 -2.837585 +v 2.673477 0.969915 -2.869029 +v 2.777325 0.659725 -2.919367 +v 2.880958 0.215439 -2.959367 +v 2.657509 1.185952 -2.873027 +v 2.720273 0.991850 -2.904138 +v 2.379762 0.373280 -2.580731 +v 2.409298 0.246654 -2.592131 +v 2.731814 0.647876 -2.878239 +v 2.836558 0.198831 -2.918667 +v -3.039373 -0.455495 1.723220 +v 2.192646 1.021841 -2.487980 +v 2.248729 0.747345 -2.506499 +v 2.309599 0.498417 -2.529263 +v 2.403300 0.096714 -2.565429 +v 2.237351 0.888547 -2.505383 +v -0.183302 -0.450597 -0.489896 +v 2.405254 0.311230 -2.572676 +v 1.043932 1.013192 -1.572568 +v 1.174857 -0.343976 -1.550015 +v 2.968846 0.048153 -2.984724 +v 2.704206 1.090705 -2.868940 +v 1.193313 1.053879 -1.685613 +v 2.300203 0.530684 -2.498384 +v 2.410253 0.058885 -2.540860 +v -2.870028 -0.379944 1.617982 +v -0.502937 -0.466927 -0.212460 +v 2.262925 0.542265 -2.453038 +v 2.383671 0.024616 -2.499642 +v 2.688581 1.172611 -2.842590 +v 2.740755 1.011263 -2.868450 +v 2.233117 1.007717 -2.472307 +v 2.280868 0.774003 -2.488075 +v -2.681424 0.688036 1.389168 +v -2.372814 0.754289 1.142473 +v -2.249194 -0.603433 1.170773 +v 2.433319 0.963376 -2.621027 +v -2.742923 0.657642 1.444079 +v 2.197806 0.531341 -2.394472 +v 2.322739 -0.004263 -2.442693 +v -3.420844 -0.571247 2.087621 +v -3.456852 0.016609 2.061712 +v 2.261785 0.891425 -2.474043 +v -0.828435 -0.477984 0.061043 +v 2.548733 0.450740 -2.649420 +v 2.594102 0.256238 -2.666930 +v 2.619376 1.253520 -2.777794 +v 2.736592 0.891025 -2.835893 +v 2.666746 1.272449 -2.813868 +v 2.782720 0.913795 -2.871353 +v -2.802757 0.594778 1.513184 +v 2.842664 0.549920 -2.883518 +v 2.892401 0.336695 -2.902714 +v 2.419066 1.038090 -2.596991 +v 2.466659 0.890910 -2.620581 +v 2.366409 0.398028 -2.496960 +v 2.411491 0.204759 -2.514360 +v -3.768498 -0.285858 2.351028 +v -3.754395 -0.436849 2.353898 +v -2.979417 0.290761 1.695520 +v 2.258257 0.990733 -2.446479 +v 2.298049 0.795972 -2.459619 +v -3.744207 -0.468465 2.368351 +v -3.763825 -0.250991 2.363676 +v -2.991889 -0.449902 1.784124 +v 2.589037 0.355701 -2.637096 +v -3.058914 0.242857 1.779885 +v 2.405318 0.303321 -2.484666 +v 2.886850 0.445733 -2.870009 +v 2.109286 1.132686 -2.326646 +v 2.219562 0.592947 -2.363060 +v 2.696261 1.244513 -2.793414 +v 2.792664 0.946380 -2.841198 +v 1.301631 1.132067 -1.690738 +v 2.383062 0.419848 -2.468079 +v 2.437160 0.187925 -2.488959 +v 2.181364 1.141334 -2.376844 +v 2.287943 0.619687 -2.412037 +v 2.862712 0.573808 -2.851874 +v 2.922544 0.317299 -2.874968 +v 2.818116 0.561038 -2.810024 +v 2.878590 0.301782 -2.833364 +v 2.426071 1.103677 -2.552133 +v 2.514010 0.831724 -2.595722 +v 2.235144 1.129736 -2.400364 +v 2.332283 0.654296 -2.432440 +v 2.346390 0.907367 -2.454136 +v -3.411176 0.052851 2.120724 +v 2.429752 0.306199 -2.453326 +v 2.269301 1.099582 -2.397708 +v 2.352008 0.694778 -2.425019 +v 2.386485 0.438404 -2.426523 +v 2.450023 0.166012 -2.451047 +v 2.915866 0.448472 -2.835623 +v 2.344078 0.972432 -2.436077 +v 2.370150 0.844828 -2.444686 +v 2.871840 0.434359 -2.793598 +v -2.786263 -0.483209 1.702896 +v 1.459973 1.193063 -1.759240 +v -3.703011 -0.503725 2.422886 +v -3.730082 -0.199896 2.416091 +v 2.655625 1.315469 -2.699349 +v 2.808775 0.841848 -2.775261 +v 2.702611 1.333742 -2.736255 +v 2.854139 0.865139 -2.811362 +v 2.288410 1.067288 -2.384314 +v 2.357333 0.729951 -2.407073 +v 2.357592 0.441017 -2.374193 +v 2.427305 0.142152 -2.401100 +v 1.807099 1.188967 -2.008747 +v -3.783568 -0.334437 2.490638 +v -3.776477 -0.407414 2.491810 +v 2.122243 1.235844 -2.255761 +v 2.482100 -0.255753 -2.399353 +v 2.726073 1.295463 -2.728897 +v 2.852031 0.905933 -2.791331 +v 2.295756 0.426582 -2.312892 +v 2.367887 0.117350 -2.340733 +v -2.939741 -0.443760 1.851008 +v -3.781106 -0.318610 2.496646 +v -3.771103 -0.424172 2.498541 +v 2.441322 0.304925 -2.409196 +v 2.453266 1.150154 -2.493283 +v 2.568163 0.794829 -2.550234 +v 1.130007 1.063856 -1.452342 +v 1.265938 -0.347821 -1.428686 +v 3.061789 0.055427 -2.865868 +v -2.602579 0.736106 1.497157 +v -2.292120 0.804178 1.248855 +v -2.434953 -0.604050 1.489534 +v -2.163494 -0.608053 1.278256 +v -2.664054 0.704644 1.549387 +v -2.539160 -0.611934 1.572914 +v 2.399283 0.915534 -2.415008 +v -3.707198 -0.182800 2.448233 +v 2.363834 1.022590 -2.395347 +v 2.408991 0.801573 -2.410258 +v -2.722515 -0.616791 1.721958 +v -2.725142 0.639161 1.608672 +v -2.829179 -0.615824 1.810674 +v -2.909245 0.322942 1.786891 +v 2.392228 0.914706 -2.400276 +v 2.398101 0.948794 -2.405777 +v 2.411428 0.883567 -2.410178 +v -2.983486 -0.609514 1.936485 +v -2.991769 0.272910 1.861910 +v 2.388079 0.936458 -2.393279 +v 2.401934 0.893610 -2.400146 +v 1.266405 1.148829 -1.537915 +v 1.276485 1.330618 -1.562468 +v 1.301959 1.399716 -1.588675 +v 1.829089 1.191557 -1.980541 +v 2.385908 3.043540 -2.584738 +v 2.432531 3.084452 -2.624845 +v 2.484531 3.138930 -2.670390 +v 2.555058 3.180480 -2.729192 +v 2.587869 1.699016 -2.618729 +v 2.897153 3.208163 -2.998451 +v 2.950947 3.055532 -3.026375 +v 2.946595 3.189529 -3.035288 +v 2.959600 3.134547 -3.040378 +v 2.417759 0.294566 -2.355182 +v -3.764574 -0.295328 2.521762 +v -3.750702 -0.443027 2.524510 +v 2.358011 0.275051 -2.293223 +v -3.320640 -0.590025 2.214050 +v -3.361390 0.074490 2.184798 +v 2.390117 0.955552 -2.380219 +v 2.415719 0.876379 -2.392909 +v 2.408200 0.974432 -2.384957 +v 2.431282 0.861455 -2.392579 +v -3.753472 -0.287501 2.537197 +v 2.398036 0.969083 -2.363085 +v 2.431485 0.865638 -2.379665 +v -3.651074 -0.516133 2.490283 +v -3.681587 -0.172421 2.482510 +v 2.311849 1.347830 -2.326247 +v -3.741101 -0.282712 2.553676 +v -3.725441 -0.449869 2.556817 +v 2.175858 1.240742 -2.187508 +v 1.176857 1.068079 -1.392566 +v 1.312589 -0.342230 -1.368881 +v -2.560177 0.739860 1.551322 +v -2.121265 -0.602981 1.332435 +v -2.249778 0.807875 1.303072 +v -2.622366 0.708349 1.602724 +v -2.686267 0.642614 1.658664 +v -2.872984 0.326449 1.833357 +v -2.958486 0.276123 1.904730 +v -3.335886 0.076990 2.217503 +v -3.668144 -0.171074 2.499706 +v -3.734634 -0.282056 2.561952 +v -3.734566 -0.369723 2.570150 +v -2.150712 -0.249451 1.324240 +v 1.267079 0.010084 -1.364303 +v 1.704978 -0.191159 -1.687236 +v 2.198494 1.185947 -2.198470 +v 2.267581 1.192809 -2.252964 +v 2.325830 0.562710 -2.240516 +v 2.313725 1.176653 -2.287457 +v 2.336207 1.139528 -2.301576 +v 2.434129 0.098705 -2.282343 +v 2.390649 0.590464 -2.293602 +v 2.344165 1.100576 -2.304204 +v 2.425891 0.627661 -2.324495 +v 2.423750 0.711053 -2.330483 +v 2.431708 0.672101 -2.333111 +v 2.400364 1.044399 -2.342861 +v 2.410625 0.974989 -2.344487 +v 2.420496 0.915260 -2.346699 +v 2.426872 0.985581 -2.358127 +v 2.452506 0.789191 -2.360079 +v 2.446831 0.863022 -2.362433 +v 2.444856 0.921557 -2.366269 +v 2.453526 0.855127 -2.366929 +v 2.496511 1.170443 -2.429398 +v 2.620876 0.785842 -2.491042 +v 2.713268 1.342514 -2.614195 +v 2.759644 1.360499 -2.652004 +v 2.773482 1.317705 -2.658864 +v 2.879037 0.829869 -2.696361 +v 2.909818 0.896081 -2.726441 +v 2.923656 0.853286 -2.733300 +v 2.434469 0.098745 -2.281906 +v -2.120000 -0.602832 1.334057 +v 1.313986 -0.342065 -1.367090 +v 2.435135 0.098824 -2.281052 +v 2.435757 0.098897 -2.280254 +v 2.436307 0.098962 -2.279548 +v 2.436763 0.099016 -2.278964 +v 2.436999 0.099043 -2.278662 +v -2.885212 -0.437337 1.920949 +v -2.717870 -0.356682 1.785125 +v -3.728000 -0.281169 2.570479 +v -3.712341 -0.448326 2.573620 +v -0.735546 -0.053125 0.219066 +v -0.406216 0.000394 -0.041418 +v -0.100273 0.040739 -0.281944 +v 0.172417 0.073341 -0.495491 +v 2.335518 1.350617 -2.295889 +v 0.354290 0.083209 -0.634777 +v -3.623852 -0.512926 2.525198 +v -3.654365 -0.169215 2.517424 +v 2.425971 0.972373 -2.327255 +v 2.459421 0.868929 -2.343834 +v 0.696977 0.054076 -0.892441 +v 2.948120 3.214165 -2.933081 +v 2.606057 3.186486 -2.663780 +v 2.997989 3.195582 -2.969370 +v 2.536222 3.145018 -2.604090 +v 3.012064 3.140727 -2.973088 +v 2.485188 3.090654 -2.557307 +v 1.046458 0.007453 -1.152257 +v -3.714744 -0.282939 2.586870 +v 2.439279 3.049827 -2.516283 +v 3.004908 3.061887 -2.957164 +v 2.449116 0.979252 -2.332477 +v 2.472199 0.866275 -2.340099 +v 1.368491 -0.052711 -1.393705 +v 1.717894 -0.070445 -1.662515 +v 1.478573 -0.058668 -1.476762 +v 2.441737 0.961632 -2.314012 +v 2.467338 0.882459 -2.326701 +v -3.309670 0.080582 2.251135 +v -3.268919 -0.583933 2.280387 +v 2.410137 0.281190 -2.226363 +v -3.701911 -0.287948 2.602134 +v -3.688039 -0.435647 2.604882 +v 2.482991 0.302250 -2.271514 +v 2.455522 0.944402 -2.306774 +v 2.469378 0.901553 -2.313642 +v -2.915858 -0.601549 2.023225 +v -2.924141 0.280876 1.948650 +v 2.468971 0.957141 -2.314878 +v 2.482299 0.891914 -2.319279 +v 2.465229 0.923305 -2.306645 +v -2.755682 -0.607167 1.904943 +v -2.835748 0.331599 1.881160 +v -2.646201 0.648459 1.709923 +v -2.643573 -0.607493 1.823210 +v 2.443879 1.032018 -2.292681 +v 2.489036 0.811001 -2.307592 +v -3.626724 -0.173321 2.551450 +v 2.481117 0.925173 -2.310048 +v -2.579668 0.714584 1.657621 +v -2.454774 -0.601995 1.681149 +v -2.516832 0.746206 1.607137 +v -2.349206 -0.593950 1.599513 +v -2.206373 0.814278 1.358835 +v -2.077747 -0.597953 1.388236 +v 2.667233 1.708364 -2.516935 +v 1.224686 1.075007 -1.330905 +v 1.360617 -0.336670 -1.307250 +v 3.156468 0.066579 -2.744432 +v 2.549224 1.161456 -2.370206 +v 2.664121 0.806131 -2.427157 +v 2.540023 0.316550 -2.282602 +v 1.385180 1.409518 -1.481935 +v -3.679715 -0.306668 2.626691 +v -3.669712 -0.412230 2.628586 +v 1.360989 1.340571 -1.454082 +v 2.400261 0.438891 -2.178853 +v 2.472391 0.129659 -2.206693 +v 2.831269 1.307854 -2.593973 +v 2.957226 0.918323 -2.656406 +v 2.230447 1.248588 -2.116977 +v 2.590304 -0.243009 -2.260568 +v 1.354370 1.159190 -1.425091 +v 1.917054 1.201918 -1.867717 +v -3.673127 -0.321429 2.632291 +v -3.666035 -0.394406 2.633464 +v -2.830682 -0.430915 1.990889 +v 2.473447 0.454663 -2.225597 +v 2.543159 0.155798 -2.252504 +v 2.410583 1.081677 -2.227614 +v 2.479506 0.744341 -2.250373 +v 3.001074 0.449623 -2.628313 +v 2.829160 1.348647 -2.573941 +v 2.980689 0.880044 -2.649048 +v 2.783530 1.330534 -2.535297 +v 2.936681 0.856913 -2.611208 +v 3.051332 0.464469 -2.662340 +v -3.572802 -0.488389 2.589894 +v -3.599872 -0.184558 2.583099 +v 1.591093 1.208507 -1.591064 +v 2.482720 0.988763 -2.258252 +v 2.508792 0.861158 -2.266861 +v 2.531323 0.455464 -2.240752 +v 2.594861 0.183071 -2.265276 +v 2.415908 1.116850 -2.209669 +v 2.498616 0.712046 -2.236978 +v 2.579618 0.323851 -2.261107 +v -2.645182 -0.466535 1.885712 +v 1.939045 1.204508 -1.839511 +v -3.258276 0.070860 2.316835 +v 2.506480 0.926224 -2.248802 +v 2.992383 0.581606 -2.586979 +v 3.052857 0.322350 -2.610320 +v 2.407334 1.150018 -2.179512 +v 2.504473 0.674577 -2.211588 +v 3.042733 0.595054 -2.621444 +v 3.102565 0.338545 -2.644537 +v 2.603378 1.124561 -2.324717 +v 2.691316 0.852608 -2.368305 +v 3.078396 0.468329 -2.624718 +v 2.370287 1.163586 -2.134528 +v 2.476867 0.641940 -2.169721 +v 2.572210 0.442126 -2.225475 +v 2.626308 0.210203 -2.246356 +v 1.491168 1.154391 -1.447635 +v 2.890636 1.267406 -2.544106 +v 2.987040 0.969274 -2.591890 +v 2.788228 0.379194 -2.381967 +v 2.304762 1.155709 -2.075926 +v 2.415038 0.615971 -2.112340 +v 2.604052 0.326729 -2.229767 +v -2.858987 0.266405 2.036315 +v -3.533523 -0.443650 2.638577 +v -3.553141 -0.226176 2.633901 +v 2.469866 1.015657 -2.175067 +v 2.509659 0.820896 -2.188207 +v -2.762138 0.316353 1.974206 +v -2.778535 -0.424773 2.057773 +v 3.071249 0.576878 -2.590723 +v 3.120985 0.363654 -2.609920 +v 2.781708 0.478212 -2.350957 +v 2.827077 0.283710 -2.368468 +v -3.539008 -0.258828 2.645375 +v -3.524905 -0.409819 2.648245 +v 2.597879 0.425291 -2.200073 +v 2.642961 0.232022 -2.217474 +v 2.650729 1.065375 -2.299858 +v 2.698322 0.918196 -2.323448 +v -2.569382 0.622266 1.812512 +v 2.900579 1.299991 -2.513951 +v 3.016554 0.941337 -2.571435 +v 2.855713 1.281357 -2.474664 +v 2.972929 0.918862 -2.532765 +v 2.506130 0.920204 -2.160643 +v -3.173446 -0.542107 2.404937 +v -3.209453 0.045748 2.379028 +v 2.445409 0.560504 -2.076893 +v 2.570342 0.024900 -2.125114 +v -2.493455 0.687025 1.764050 +v 2.684069 0.992910 -2.299412 +v -2.427931 0.717893 1.714301 +v -2.119321 0.784146 1.467606 +v -1.995701 -0.573576 1.495906 +v 2.487048 1.037626 -2.146613 +v 2.534799 0.803912 -2.162379 +v 2.942544 1.202524 -2.516853 +v 2.994718 1.041175 -2.542714 +v 2.517081 0.572200 -2.127054 +v 2.637826 0.054551 -2.173658 +v 2.571093 0.562590 -2.150938 +v 2.681143 0.090791 -2.193414 +v 1.466306 1.086034 -1.335468 +v 2.979094 1.123082 -2.516365 +v -0.568604 -0.447372 0.394570 +v 1.323830 1.046159 -1.213567 +v 1.454755 -0.311009 -1.191014 +v 3.248744 0.081120 -2.625723 +v 2.688243 0.344561 -2.209711 +v -2.593169 -0.347277 1.974947 +v 3.029114 0.682935 -2.497393 +v 3.133857 0.233890 -2.537821 +v 2.530565 0.923082 -2.129303 +v -0.224107 -0.434065 0.145862 +v 3.079074 0.695309 -2.532807 +v 3.182707 0.251022 -2.572807 +v 2.606071 0.533336 -2.149005 +v 2.699770 0.131633 -2.185170 +v 2.490887 1.056969 -2.105453 +v 2.546971 0.782472 -2.123972 +v 2.684199 0.409138 -2.190257 +v 2.713735 0.282512 -2.201657 +v 2.963027 1.221936 -2.481166 +v 3.025790 1.027834 -2.512276 +v 2.918829 1.202466 -2.441528 +v 2.982266 1.006286 -2.472972 +v -2.731051 -0.419180 2.118678 +v 2.346020 1.217882 -1.984849 +v 2.691945 -0.216224 -2.122858 +v 2.626097 0.501300 -2.136348 +v 2.704180 0.166548 -2.166486 +v 2.809263 0.554231 -2.283747 +v 2.887846 0.217345 -2.314077 +v -2.799153 0.230131 2.121073 +v -2.792140 -0.550877 2.187326 +v 0.122037 -0.414552 -0.095656 +v 3.101457 0.660216 -2.517043 +v 3.187603 0.290900 -2.550293 +v 2.461960 1.061494 -2.053272 +v 2.523494 0.760321 -2.073591 +v 3.006995 1.126368 -2.480578 +v 2.963268 1.105875 -2.440934 +v 2.399616 1.050076 -1.991851 +v 2.463283 0.738458 -2.012874 +v 2.541997 0.922437 -2.085123 +v -2.620849 -0.553009 2.083075 +v -2.691633 0.277873 2.061963 +v 0.380138 -0.399580 -0.262083 +v 2.741003 0.353341 -2.170536 +v 2.702686 0.458937 -2.148505 +v 2.753845 0.239614 -2.168251 +v 2.735783 0.349782 -2.158101 +v 2.738935 0.386350 -2.160591 +v 2.754033 0.321623 -2.166418 +v 2.501059 1.494406 -2.071566 +v -2.498046 0.561724 1.911958 +v -2.495843 -0.550836 2.012409 +v 2.518039 0.913888 -2.030968 +v 2.733885 0.378609 -2.149074 +v 2.747093 0.321983 -2.154171 +v 2.457638 0.897352 -1.968773 +v -2.690304 -0.414381 2.170940 +v -3.127855 -0.045628 2.482288 +v -3.102117 -0.467490 2.500962 +v 2.770798 1.227046 -2.232150 +v 2.748385 0.411806 -2.139249 +v 2.774536 0.299695 -2.149342 +v 2.764617 1.300784 -2.232889 +v 2.792626 1.229192 -2.247504 +v -2.409183 0.623172 1.864025 +v -2.298506 -0.543169 1.884841 +v 2.786510 1.302148 -2.248235 +v 2.741907 0.400740 -2.129507 +v 2.764784 0.302663 -2.138337 +v -2.529794 -0.443952 2.062569 +v -2.339763 0.652407 1.813967 +v -2.191192 -0.534884 1.807161 +v -1.920944 -0.535987 1.596561 +v -2.034769 0.715099 1.570418 +v -1.970078 -0.080625 1.596081 +v 1.720073 1.327862 -1.406896 +v 0.572047 -0.387414 -0.352526 +v 2.806120 1.237906 -2.229508 +v 2.801037 1.298551 -2.230116 +v -3.088440 -0.411708 2.522214 +v -3.106239 -0.116627 2.508994 +v 1.609069 1.259907 -1.293617 +v 2.543657 1.253039 -2.021345 +v 1.525799 0.957611 -1.197050 +v 2.757700 0.410246 -2.104644 +v 2.784117 0.296996 -2.114841 +v 2.533483 0.613445 -1.947803 +v 2.602202 0.623366 -2.002292 +v 2.677744 -0.005017 -2.003484 +v 2.648675 0.609224 -2.037226 +v 2.672127 0.573042 -2.052187 +v 2.681143 0.534388 -2.055668 +v 2.741627 0.025636 -2.056106 +v 2.775750 0.064439 -2.086273 +v 2.738751 0.480616 -2.095645 +v 2.771306 0.147849 -2.090468 +v 2.780322 0.109196 -2.093948 +v 2.762407 0.352190 -2.102295 +v 2.766821 0.422887 -2.112228 +v 2.797824 0.227363 -2.118445 +v 2.786530 0.359571 -2.121780 +v 2.797017 0.293432 -2.123883 +v 1.548968 1.153765 -1.228190 +v 2.798795 1.166335 -2.202419 +v 2.552618 1.211834 -2.013930 +v 2.544939 1.295449 -2.015621 +v 2.863513 0.586883 -2.198347 +v 2.954250 0.197881 -2.233369 +v 2.820327 1.169125 -2.218088 +v 2.781909 1.367789 -2.204438 +v 2.803619 1.368443 -2.220086 +v 1.423109 0.978571 -1.105456 +v 1.544240 -0.271959 -1.085059 +v 3.334585 0.098417 -2.514929 +v 1.554716 0.187936 -1.132116 +v 2.612265 1.258718 -2.052108 +v 3.101424 0.726458 -2.383560 +v 3.222370 0.207946 -2.430242 +v -2.658075 -0.410585 2.212276 +v 3.150617 0.738370 -2.420182 +v 3.270283 0.225352 -2.466369 +v 3.160928 0.696012 -2.423422 +v 3.260400 0.269561 -2.461816 +v 2.619734 1.224381 -2.045928 +v 2.613334 1.294060 -2.047338 +v 2.829147 1.187974 -2.205056 +v 2.815259 1.353660 -2.206717 +v 2.570461 1.178110 -1.994503 +v 2.556271 1.332609 -1.997628 +v 2.777033 0.404579 -2.081148 +v 2.799910 0.306502 -2.089978 +v 2.789302 0.416625 -2.086768 +v 2.815452 0.304514 -2.096862 +v 2.634603 1.196277 -2.029740 +v 2.622778 1.325027 -2.032343 +v 2.651619 1.262515 -2.043053 +v 1.554142 0.981857 -1.160642 +v 2.656512 1.240018 -2.039004 +v 2.652319 1.285671 -2.039927 +v -2.635774 -0.407958 2.240880 +v 2.794724 0.385259 -2.065313 +v 2.807933 0.328634 -2.070411 +v 2.809805 0.394697 -2.069692 +v 2.824903 0.329970 -2.075520 +v 2.806035 0.357461 -2.061383 +v -2.489068 -0.351828 2.132329 +v 2.463909 1.145066 -1.865152 +v 2.782581 -0.176570 -1.992240 +v 1.570340 0.895334 -1.144881 +v 1.570297 0.896443 -1.144827 +v 1.570363 0.895879 -1.144798 +v 1.570504 0.894974 -1.144707 +v 1.570489 0.895138 -1.144709 +v 1.570444 0.896371 -1.144649 +v 1.570624 0.894816 -1.144569 +v 2.666254 1.221606 -2.028398 +v 2.658506 1.305960 -2.030103 +v 1.570869 0.894455 -1.144293 +v 1.570594 0.897869 -1.144312 +v 2.594467 1.157000 -1.966023 +v 2.575927 1.358863 -1.970106 +v 1.570894 0.897475 -1.143969 +v 2.833890 0.249041 -2.065584 +v 2.782731 0.468365 -2.045837 +v -2.701300 -0.462008 2.315575 +v -2.705561 0.099398 2.267342 +v 2.841108 1.134918 -2.151662 +v -0.479044 -0.046272 0.545593 +v 2.862191 1.138039 -2.167869 +v 2.822836 0.362979 -2.065575 +v 2.654608 1.178685 -2.006007 +v 2.639158 1.346905 -2.009409 +v -2.624374 -0.406615 2.255502 +v 2.818040 1.410109 -2.154421 +v 2.839368 1.410315 -2.170599 +v 2.863947 1.162135 -2.163311 +v 2.676065 1.265123 -2.025119 +v 2.664612 1.254980 -2.014677 +v 2.663261 1.271085 -2.014839 +v 0.971816 -0.356390 -0.546463 +v 2.844975 1.388465 -2.165580 +v 2.678566 1.253623 -2.023050 +v 2.676423 1.276959 -2.023522 +v 2.679361 1.210080 -2.012848 +v 2.669238 1.320294 -2.015076 +v 2.670727 1.241720 -2.008183 +v 2.667038 1.285720 -2.008625 +v 2.683546 1.244211 -2.017628 +v 2.679586 1.287331 -2.018500 +v 1.579791 0.985026 -1.130600 +v -1.956412 0.610154 1.662774 +v -1.856740 -0.486828 1.685802 +v 2.690246 1.238319 -2.009680 +v 2.685071 1.294657 -2.010819 +v 2.679968 1.234858 -1.997098 +v 2.674930 1.294963 -1.997700 +v -0.132362 0.006287 0.310615 +v 1.590120 0.977428 -1.119874 +v 2.748270 0.515690 -1.979648 +v 2.826352 0.180938 -2.009786 +v -2.571993 0.138873 2.206668 +v -2.521306 -0.458402 2.221998 +v -2.685403 -0.396185 2.345565 +v -2.686840 -0.001633 2.310453 +v 2.620983 1.151716 -1.932826 +v 2.600915 1.370211 -1.937245 +v 2.676704 1.174282 -1.978342 +v 2.659981 1.356362 -1.982024 +v 2.678470 1.266092 -1.988150 +v 2.693838 1.207195 -1.994723 +v 2.682881 1.326489 -1.997135 +v 2.697646 1.236845 -2.000415 +v 2.692045 1.297825 -2.001648 +v 2.697040 1.267502 -2.002758 +v 2.651196 0.936979 -1.934514 +v 2.898778 0.955779 -2.129270 +v 2.929918 0.567420 -2.117638 +v 3.008498 0.230534 -2.147968 +v 2.689859 1.236233 -1.984390 +v 2.684821 1.296338 -1.984993 +v 2.822841 0.425467 -2.012432 +v 2.852378 0.298841 -2.023833 +v 1.608781 0.850501 -1.104316 +v 2.704620 1.240012 -1.991243 +v 2.699446 1.296350 -1.992383 +v 1.624309 1.159754 -1.138181 +v 2.752678 0.550604 -1.960964 +v 2.846378 0.148901 -1.997130 +v 1.606690 0.959087 -1.103622 +v 2.710106 1.247339 -1.983562 +v 2.706145 1.290459 -1.984434 +v 2.697752 1.245476 -1.973465 +v 2.694063 1.289476 -1.973907 +v 2.707481 1.213392 -1.976781 +v 2.697358 1.323606 -1.979010 +v -2.445962 -0.418610 2.191836 +v 3.233725 0.674674 -2.334944 +v 3.319870 0.305357 -2.368193 +v 2.848333 0.363417 -2.004377 +v 2.713269 1.257710 -1.978540 +v 2.711125 1.281046 -1.979012 +v 1.518181 0.875199 -1.011295 +v 1.625158 -0.221229 -0.994015 +v 3.410238 0.117713 -2.416893 +v 2.901195 1.167312 -2.115460 +v 2.701529 1.260111 -1.967251 +v 2.700178 1.276216 -1.967413 +v 2.713626 1.269547 -1.976943 +v 1.616466 0.943560 -1.090626 +v 2.882224 1.393643 -2.117728 +v -2.383910 0.349570 2.084356 +v -2.382627 -0.452496 2.157011 +v 2.697528 1.183740 -1.950957 +v 2.682078 1.351960 -1.954359 +v 2.907001 1.144267 -2.110304 +v 2.886398 1.141212 -2.093480 +v 2.743282 0.582871 -1.930085 +v 2.853333 0.111072 -1.972562 +v 1.623579 0.887518 -1.082372 +v 0.198902 0.047648 0.105888 +v 1.621282 0.931471 -1.084234 +v 2.884178 1.416542 -2.113034 +v 2.863331 1.416404 -2.096239 +v -2.503361 -0.388481 2.254219 +v -2.538594 0.031317 2.243138 +v -1.878374 0.077127 1.724185 +v -1.889940 0.222714 1.719833 +v 2.645971 1.163066 -1.899965 +v 2.627431 1.364929 -1.904047 +v 2.718213 1.227726 -1.961754 +v 2.710466 1.312080 -1.963460 +v 1.626047 0.904541 -1.078374 +v 3.189935 0.700514 -2.275981 +v 3.294679 0.251469 -2.316409 +v 3.238191 0.712702 -2.313742 +v 3.341825 0.268415 -2.353742 +v 2.706004 0.594452 -1.884739 +v 2.826750 0.076803 -1.931343 +v 2.640884 0.583528 -1.826173 +v 2.765818 0.047924 -1.874394 +v 1.714162 1.276631 -1.167239 +v 2.724400 1.248014 -1.951930 +v 2.720207 1.293667 -1.952853 +v 1.654904 1.136021 -1.105274 +v 2.725100 1.271170 -1.948805 +v 2.713907 1.205618 -1.928023 +v 2.702083 1.334368 -1.930626 +v 1.831320 1.344269 -1.251206 +v -2.260945 0.399211 2.027604 +v -2.181051 -0.441814 2.042546 +v 2.809488 0.450216 -1.928661 +v 2.854570 0.256946 -1.946061 +v -2.423567 -0.369548 2.230060 +v -2.180836 0.422861 1.973894 +v -2.073524 -0.433428 1.968859 +v -1.805897 -0.428247 1.759726 +v -1.887675 0.473899 1.740641 +v -2.358199 -0.380076 2.187846 +v -2.358499 0.188271 2.135889 +v 2.990686 0.501054 -2.063247 +v 3.036054 0.306554 -2.080758 +v 2.665627 1.189319 -1.872442 +v 2.651437 1.343818 -1.875567 +v 2.648270 1.510792 -1.882843 +v 2.930912 1.202118 -2.074323 +v 2.723351 1.236585 -1.913028 +v 2.716951 1.306264 -1.914438 +v 2.917024 1.367804 -2.075984 +v 1.384653 -0.306314 -0.725204 +v 2.724420 1.271928 -1.908258 +v 1.621186 0.490687 -0.975352 +v 1.644965 0.346027 -0.980608 +v 0.465380 0.080433 -0.036070 +v 2.848397 0.355508 -1.916368 +v -2.408185 -0.394890 2.251162 +v 2.942750 1.186138 -2.060817 +v 2.578963 1.033323 -1.763117 +v 2.858250 -0.125781 -1.874424 +v 2.922529 1.183532 -2.043463 +v 2.676959 1.226479 -1.854450 +v 2.669279 1.310094 -1.856141 +v 2.926042 1.385458 -2.062815 +v 2.826142 0.472035 -1.899780 +v 2.880239 0.240111 -1.920660 +v 2.905643 1.384987 -2.045482 +v 3.029535 0.405571 -2.049749 +v 3.300344 0.601920 -2.275317 +v 3.350079 0.388695 -2.294513 +v 2.678242 1.268890 -1.848725 +v 2.945134 1.257227 -2.050923 +v 1.755731 1.246131 -1.122488 +v 1.720327 0.756772 -1.049674 +v 2.940050 1.317871 -2.051532 +v -2.214680 0.228844 2.067608 +v -2.157859 -0.367480 2.078067 +v 1.704158 1.079827 -1.054807 +v -2.127781 0.248308 2.009962 +v -2.051331 -0.359151 2.006140 +v -1.843236 0.290860 1.784206 +v -1.785848 -0.348829 1.798208 +v 1.604892 0.740558 -0.935201 +v 1.693974 -0.161033 -0.921860 +v 3.472397 0.138163 -2.335899 +v 1.873536 1.307570 -1.193691 +v 2.872832 0.358386 -1.885027 +v 2.959859 1.252435 -2.032667 +v 2.953743 1.325390 -2.033399 +v 3.342932 0.497244 -2.260519 +v 2.939822 1.250538 -2.015012 +v 2.829564 0.490591 -1.858224 +v 2.893102 0.218199 -1.882748 +v 2.933641 1.324275 -2.015751 +v 1.701154 -0.246228 -0.905127 +v -0.334995 -0.394882 0.699940 +v 3.318333 0.625178 -2.242012 +v 3.378166 0.368670 -2.265106 +v 3.270936 0.612055 -2.203483 +v 3.331410 0.352798 -2.226824 +v 2.870384 0.194339 -1.832802 +v 2.800672 0.493204 -1.805894 +v 2.706330 1.463624 -1.813588 +v 1.735438 1.031940 -1.015094 +v 2.096574 -0.183066 -1.184359 +v 2.738836 0.478769 -1.744593 +v 2.810966 0.169537 -1.772433 +v 1.857375 -0.219119 -0.990222 +v 2.884402 0.357112 -1.840897 +v 3.369567 0.499255 -2.224210 +v 0.704277 0.096803 -0.109143 +v 3.322719 0.484781 -2.185490 +v 1.668063 0.559071 -0.899985 +v 1.734685 -0.079917 -0.893249 +v 3.503355 0.161047 -2.294336 +v 1.853604 0.697100 -1.057274 +v 0.023839 -0.378671 0.476160 +v 2.742703 1.224204 -1.790460 +v 2.990285 1.243004 -1.985215 +v 1.751320 0.995124 -0.995284 +v 1.762367 0.864072 -0.986848 +v 1.978204 0.694100 -1.137927 +v 1.821889 1.171394 -1.054962 +v 2.860838 0.346753 -1.786883 +v 1.768391 0.914212 -0.976082 +v 2.800102 0.741867 -1.764054 +v 3.047683 0.760667 -1.958810 +v 2.801089 0.327237 -1.724923 +v 2.686153 0.887537 -1.683203 +v 2.915644 -0.066074 -1.774558 +v 1.939461 1.218681 -1.105028 +v 0.380965 -0.356962 0.277840 +v 2.157984 -0.096145 -1.130609 +v 2.171539 -0.180007 -1.133476 +v 1.870303 1.101825 -0.999439 +v 2.768902 0.690672 -1.652155 +v 2.931033 0.013315 -1.716360 +v 2.798614 1.350688 -1.707175 +v 1.895380 1.047986 -0.972059 +v -0.263286 -0.086843 0.817096 +v 1.915261 0.855545 -0.963812 +v 1.995518 1.144847 -1.050030 +v 1.923295 0.929349 -0.946858 +v 0.639411 -0.340042 0.173318 +v 2.048910 0.874962 -1.028633 +v 2.024876 1.087065 -1.024636 +v 0.098227 -0.041243 0.603403 +v 1.153992 0.084424 -0.229250 +v 2.057853 0.957558 -1.005829 +v 2.853774 1.270425 -1.644800 +v 2.691514 -0.001160 -1.386453 +v 2.705070 -0.085024 -1.389320 +v 2.781930 0.015918 -1.458515 +v 2.795485 -0.067945 -1.461382 +v 2.889620 0.961520 -1.629051 +v 3.137201 0.980321 -1.823807 +v 2.880562 1.206416 -1.616926 +v 3.128144 1.225217 -1.811681 +v 2.893827 1.173559 -1.603234 +v 3.141408 1.192360 -1.797990 +v -0.165990 -0.329480 0.922774 +v 2.905606 1.059058 -1.599313 +v 3.153188 1.077859 -1.794069 +v 2.902644 1.136966 -1.595558 +v 3.150226 1.155766 -1.790314 +v 2.906628 1.098234 -1.594232 +v 3.154210 1.117035 -1.788988 +v 0.450756 -0.003152 0.428413 +v 0.893967 -0.321301 0.137348 +v 0.203261 -0.310043 0.717218 +v -0.125580 -0.167821 0.986626 +v 0.712336 0.026704 0.345760 +v -0.090811 -0.262476 1.024542 +v 1.652963 0.059929 -0.335038 +v 0.245682 -0.133976 0.786321 +v 0.568430 -0.286725 0.550539 +v 0.283133 -0.240046 0.827356 +v 2.000346 0.011962 -0.463845 +v 0.611741 -0.102875 0.629863 +v 0.998399 0.048451 0.327453 +v 0.827128 -0.268380 0.491359 +v 1.390944 -0.279641 0.074489 +v 2.438757 0.004155 -0.738633 +v 0.652016 -0.215986 0.675288 +v 2.198852 0.014020 -0.544254 +v 0.870584 -0.078559 0.583979 +v 0.910831 -0.196982 0.637049 +v 1.127571 -0.244822 0.495289 +v 1.185795 -0.053488 0.599517 +v 1.535993 0.058149 0.320863 +v 1.947252 -0.218027 0.037437 +v 1.232465 -0.171199 0.659405 +v 2.293159 -0.159573 -0.040558 +v 2.769338 -0.097283 -0.322594 +v 1.695832 -0.196471 0.528473 +v 2.530709 -0.129037 -0.121828 +v 2.157723 0.063260 0.342121 +v 1.776927 -0.020207 0.662777 +v 1.833764 -0.121263 0.736990 +v 3.351091 0.073201 -0.443243 +v 3.364646 -0.010661 -0.446110 +v 2.948324 -0.003291 -0.110055 +v 2.961879 -0.087154 -0.112922 +v 2.992015 0.002089 -0.060870 +v 3.005570 -0.081773 -0.063737 +v 2.525032 0.038738 0.306061 +v 3.379430 0.074900 -0.358922 +v 3.392986 -0.008964 -0.361790 +v 3.036570 0.045434 0.026135 +v 2.796513 0.049478 0.227779 +v 2.357571 -0.130808 0.595337 +v 2.473462 0.016867 0.762129 +v 2.725617 -0.081249 0.592239 +v 2.544662 -0.059737 0.852031 +v 3.261550 -0.027300 0.308389 +v 3.022995 -0.051504 0.513873 +v 2.851826 0.022984 0.782891 +v 3.407963 0.046255 0.499554 +v 2.923753 -0.024800 0.883847 +v 3.168214 0.041578 0.705848 +v 3.711371 0.106264 0.292980 +v 3.724926 0.022401 0.290113 +v 3.531985 0.072015 0.446671 +v 3.545540 -0.011849 0.443804 +v 3.445588 0.055512 0.520889 +v 3.459143 -0.028351 0.518022 +v 3.563503 0.077601 0.432271 +v 3.577058 -0.006262 0.429404 +v 3.488101 0.014784 0.599486 +v 3.249111 0.000073 0.806963 +vt 0.592295 0.226200 +vt 0.597451 0.733993 +vt 0.582117 0.735152 +vt 0.578489 0.226600 +vt 0.583926 0.737917 +vt 0.580317 0.227579 +vt 0.553525 0.740642 +vt 0.440791 0.740508 +vt 0.450875 0.228401 +vt 0.552974 0.228523 +vt 0.390668 0.737686 +vt 0.405291 0.227370 +vt 0.388859 0.734922 +vt 0.403463 0.226391 +vt 0.371983 0.733724 +vt 0.388098 0.225956 +vt 0.619772 0.907170 +vt 0.592331 0.999817 +vt 0.601330 0.999666 +vt 0.610146 0.909999 +vt 0.574598 0.999907 +vt 0.590330 0.911915 +vt 0.553091 0.999969 +vt 0.566105 0.913419 +vt 0.528748 1.000000 +vt 0.538531 0.914447 +vt 0.502634 1.000000 +vt 0.478247 0.914918 +vt 0.475889 0.999968 +vt 0.508812 0.914955 +vt 0.449684 0.999906 +vt 0.448173 0.914340 +vt 0.425163 0.999816 +vt 0.419902 0.913245 +vt 0.403398 0.999703 +vt 0.394672 0.911681 +vt 0.385339 0.999570 +vt 0.373584 0.909717 +vt 0.375862 0.999397 +vt 0.362094 0.906863 +vt 0.605465 0.740602 +vt 0.597205 0.739049 +vt 0.491046 0.731144 +vt 0.490016 0.901745 +vt 0.489949 0.901745 +vt 0.579978 0.737974 +vt 0.489821 0.901745 +vt 0.558870 0.737116 +vt 0.489665 0.901745 +vt 0.534804 0.736510 +vt 0.489489 0.901745 +vt 0.508831 0.736184 +vt 0.489301 0.901744 +vt 0.482087 0.736152 +vt 0.489205 0.901744 +vt 0.455740 0.736416 +vt 0.430942 0.736963 +vt 0.408777 0.737770 +vt 0.390214 0.738801 +vt 0.379997 0.740333 +vt 0.353656 0.886514 +vt 0.378904 0.730193 +vt 0.361705 0.880889 +vt 0.395023 0.727499 +vt 0.380234 0.876591 +vt 0.415254 0.725377 +vt 0.403440 0.873201 +vt 0.438713 0.723920 +vt 0.430309 0.870869 +vt 0.464376 0.723192 +vt 0.459668 0.869695 +vt 0.477566 0.723232 +vt 0.474742 0.869751 +vt 0.491120 0.723224 +vt 0.490232 0.869731 +vt 0.517777 0.724015 +vt 0.520667 0.870977 +vt 0.543181 0.725530 +vt 0.549643 0.873375 +vt 0.566223 0.727704 +vt 0.575892 0.876824 +vt 0.585895 0.730440 +vt 0.598267 0.881171 +vt 0.611334 0.886821 +vt 0.514919 0.001808 +vt 0.498936 0.000000 +vt 0.513858 0.001846 +vt 0.529721 0.013570 +vt 0.531965 0.013618 +vt 0.556734 0.062512 +vt 0.561107 0.062168 +vt 0.573935 0.111992 +vt 0.579743 0.111218 +vt 0.580242 0.134938 +vt 0.586574 0.134186 +vt 0.586077 0.152110 +vt 0.592909 0.152041 +vt 0.591813 0.178477 +vt 0.599157 0.177963 +vt 0.593139 0.193428 +vt 0.600618 0.192699 +vt 0.592908 0.232476 +vt 0.600324 0.231459 +vt 0.496437 0.231529 +vt 0.508654 0.001888 +vt 0.518859 0.013502 +vt 0.535963 0.062914 +vt 0.546664 0.112914 +vt 0.550579 0.135830 +vt 0.554180 0.152166 +vt 0.557666 0.179076 +vt 0.558422 0.194288 +vt 0.558268 0.233688 +vt 0.501777 0.001902 +vt 0.504546 0.013460 +vt 0.508707 0.063079 +vt 0.510973 0.113312 +vt 0.511780 0.136212 +vt 0.512489 0.152160 +vt 0.513077 0.179318 +vt 0.513104 0.194651 +vt 0.512986 0.234213 +vt 0.498076 0.001898 +vt 0.496856 0.013450 +vt 0.494097 0.063062 +vt 0.491870 0.113289 +vt 0.491019 0.136187 +vt 0.490190 0.152133 +vt 0.489240 0.179289 +vt 0.488883 0.194622 +vt 0.488765 0.234184 +vt 0.490954 0.001867 +vt 0.482078 0.013458 +vt 0.466079 0.062831 +vt 0.455287 0.112805 +vt 0.451272 0.135711 +vt 0.447516 0.152039 +vt 0.443646 0.178940 +vt 0.442563 0.194150 +vt 0.442409 0.233550 +vt 0.485218 0.001812 +vt 0.470208 0.013499 +vt 0.443661 0.062377 +vt 0.426084 0.111816 +vt 0.419558 0.134746 +vt 0.413491 0.151904 +vt 0.407324 0.178257 +vt 0.405675 0.193204 +vt 0.405444 0.232252 +vt 0.483722 0.001771 +vt 0.467140 0.013541 +vt 0.437940 0.062021 +vt 0.418694 0.111026 +vt 0.411548 0.133977 +vt 0.404917 0.151817 +vt 0.398200 0.177723 +vt 0.396421 0.192455 +vt 0.396126 0.231215 +vt 0.482807 0.001091 +vt 0.465246 0.012218 +vt 0.434231 0.060860 +vt 0.413722 0.112734 +vt 0.406278 0.130880 +vt 0.397753 0.154535 +vt 0.390718 0.172336 +vt 0.388811 0.184259 +vt 0.483894 0.000866 +vt 0.467479 0.011696 +vt 0.438359 0.060674 +vt 0.419010 0.113922 +vt 0.412060 0.130257 +vt 0.403381 0.155615 +vt 0.396772 0.170695 +vt 0.394947 0.181718 +vt 0.394122 0.224712 +vt 0.489100 0.000562 +vt 0.478265 0.010987 +vt 0.458692 0.060437 +vt 0.445446 0.115578 +vt 0.440842 0.129428 +vt 0.433493 0.157124 +vt 0.429012 0.168469 +vt 0.427688 0.178256 +vt 0.426709 0.223032 +vt 0.492401 0.000471 +vt 0.485112 0.010775 +vt 0.471652 0.060373 +vt 0.462347 0.116094 +vt 0.459225 0.129185 +vt 0.452993 0.157597 +vt 0.449873 0.167802 +vt 0.448880 0.177211 +vt 0.447853 0.222532 +vt 0.495979 0.000427 +vt 0.492542 0.010672 +vt 0.485745 0.060349 +vt 0.480752 0.116370 +vt 0.479235 0.129074 +vt 0.474359 0.157853 +vt 0.472721 0.167476 +vt 0.472093 0.176692 +vt 0.471042 0.222291 +vt 0.497803 0.000430 +vt 0.496333 0.010680 +vt 0.492949 0.060359 +vt 0.490171 0.116373 +vt 0.489471 0.129091 +vt 0.485358 0.157859 +vt 0.484479 0.167501 +vt 0.484040 0.176724 +vt 0.482990 0.222314 +vt 0.499680 0.000431 +vt 0.500232 0.010681 +vt 0.500355 0.060366 +vt 0.499854 0.116392 +vt 0.499996 0.129099 +vt 0.496658 0.157879 +vt 0.496558 0.167505 +vt 0.496314 0.176721 +vt 0.495264 0.222320 +vt 0.503340 0.000484 +vt 0.507844 0.010802 +vt 0.514842 0.060424 +vt 0.518821 0.116161 +vt 0.520601 0.129259 +vt 0.518915 0.157676 +vt 0.520341 0.167887 +vt 0.520484 0.177297 +vt 0.519458 0.222618 +vt 0.506801 0.000583 +vt 0.515045 0.011031 +vt 0.528575 0.060520 +vt 0.536823 0.115687 +vt 0.540149 0.129546 +vt 0.540157 0.157251 +vt 0.543032 0.168605 +vt 0.543547 0.178394 +vt 0.542568 0.223170 +vt 0.512534 0.000900 +vt 0.526992 0.011767 +vt 0.551432 0.060809 +vt 0.566860 0.114099 +vt 0.572744 0.130449 +vt 0.575967 0.155821 +vt 0.581260 0.170915 +vt 0.582411 0.181941 +vt 0.581586 0.224936 +vt 0.514004 0.001128 +vt 0.530070 0.012295 +vt 0.557398 0.061007 +vt 0.574770 0.112926 +vt 0.581304 0.131089 +vt 0.585745 0.154759 +vt 0.591675 0.172575 +vt 0.593008 0.184503 +vt 0.500194 0.123038 +vt 0.538682 0.145632 +vt 0.499355 0.147686 +vt 0.567425 0.437987 +vt 0.495309 0.437689 +vt 0.572058 0.485965 +vt 0.494594 0.485885 +vt 0.579203 0.530428 +vt 0.494130 0.530571 +vt 0.588071 0.564595 +vt 0.493832 0.570346 +vt 0.603460 0.591429 +vt 0.494064 0.596672 +vt 0.634825 0.640783 +vt 0.495158 0.646017 +vt 0.673396 0.693624 +vt 0.496679 0.696159 +vt 0.692678 0.734348 +vt 0.497801 0.742533 +vt 0.702762 0.758051 +vt 0.498113 0.758399 +vt 0.701606 0.793564 +vt 0.498079 0.793255 +vt 0.493311 0.794017 +vt 0.530328 0.123074 +vt 0.571363 0.144013 +vt 0.627653 0.438535 +vt 0.636786 0.486372 +vt 0.650275 0.530678 +vt 0.666763 0.560227 +vt 0.694688 0.587480 +vt 0.750987 0.636789 +vt 0.820060 0.691789 +vt 0.854194 0.727752 +vt 0.872335 0.757923 +vt 0.870198 0.793953 +vt 0.555251 0.123104 +vt 0.591748 0.143109 +vt 0.665577 0.439237 +vt 0.677585 0.487036 +vt 0.695058 0.531278 +vt 0.716302 0.557996 +vt 0.751975 0.585509 +vt 0.823559 0.634725 +vt 0.911312 0.690971 +vt 0.954422 0.723886 +vt 0.977512 0.758039 +vt 0.974704 0.794354 +vt 0.570653 0.123123 +vt 0.596282 0.143062 +vt 0.674482 0.439878 +vt 0.687203 0.487720 +vt 0.705580 0.531920 +vt 0.727870 0.558106 +vt 0.765162 0.585722 +vt 0.839794 0.634825 +vt 0.931229 0.691232 +vt 0.975934 0.723388 +vt 1.000000 0.758335 +vt 0.996949 0.794648 +vt 0.404437 0.142964 +vt 0.426515 0.122951 +vt 0.573874 0.123126 +vt 0.323231 0.439478 +vt 0.310002 0.487319 +vt 0.291306 0.531610 +vt 0.269108 0.558029 +vt 0.232259 0.585436 +vt 0.158605 0.634392 +vt 0.068392 0.690386 +vt 0.024123 0.722737 +vt 0.000000 0.757160 +vt 0.002277 0.793454 +vt 0.408288 0.143022 +vt 0.329678 0.438833 +vt 0.316870 0.486617 +vt 0.298892 0.530832 +vt 0.277591 0.557845 +vt 0.242362 0.585244 +vt 0.172141 0.634290 +vt 0.086185 0.690163 +vt 0.044209 0.723323 +vt 0.021216 0.756939 +vt 0.023503 0.793219 +vt 0.429735 0.122954 +vt 0.428009 0.143973 +vt 0.365185 0.438218 +vt 0.354927 0.486047 +vt 0.340715 0.530335 +vt 0.323958 0.560190 +vt 0.296482 0.587348 +vt 0.241975 0.636524 +vt 0.175315 0.691197 +vt 0.142962 0.727426 +vt 0.125096 0.757073 +vt 0.126941 0.793066 +vt 0.445138 0.122973 +vt 0.460221 0.145670 +vt 0.423771 0.437812 +vt 0.417791 0.485792 +vt 0.409775 0.530252 +vt 0.400446 0.564744 +vt 0.385513 0.591511 +vt 0.356231 0.640793 +vt 0.320514 0.693380 +vt 0.303405 0.734406 +vt 0.293784 0.757604 +vt 0.294807 0.793079 +vt 0.470061 0.123002 +vt 0.584118 0.143846 +vt 0.652512 0.440323 +vt 0.663585 0.488333 +vt 0.679561 0.533226 +vt 0.698964 0.560878 +vt 0.731472 0.587869 +vt 0.796494 0.637100 +vt 0.876085 0.692426 +vt 0.914822 0.726015 +vt 0.935707 0.758515 +vt 0.932883 0.794633 +vt 0.564354 0.123115 +vt 0.557453 0.145374 +vt 0.603941 0.440767 +vt 0.611404 0.489119 +vt 0.622180 0.535513 +vt 0.635332 0.566338 +vt 0.657480 0.591977 +vt 0.701732 0.641506 +vt 0.755840 0.694578 +vt 0.781940 0.731416 +vt 0.796061 0.758682 +vt 0.793893 0.794463 +vt 0.543740 0.123090 +vt 0.520898 0.147383 +vt 0.537164 0.441133 +vt 0.539680 0.489942 +vt 0.543358 0.538385 +vt 0.547975 0.573543 +vt 0.555980 0.597337 +vt 0.571895 0.647283 +vt 0.591287 0.697315 +vt 0.600266 0.738659 +vt 0.605208 0.758809 +vt 0.604010 0.794167 +vt 0.515597 0.123057 +vt 0.480790 0.147467 +vt 0.463733 0.441064 +vt 0.460823 0.489897 +vt 0.456750 0.538466 +vt 0.452065 0.573899 +vt 0.444570 0.597554 +vt 0.429485 0.647493 +vt 0.410904 0.697284 +vt 0.401280 0.738907 +vt 0.396151 0.758578 +vt 0.396067 0.793912 +vt 0.484791 0.123020 +vt 0.444068 0.145371 +vt 0.396343 0.440538 +vt 0.388469 0.488901 +vt 0.377334 0.535405 +vt 0.364191 0.566484 +vt 0.342521 0.591951 +vt 0.299133 0.641406 +vt 0.245883 0.694154 +vt 0.219396 0.731230 +vt 0.205038 0.757996 +vt 0.206019 0.793754 +vt 0.456648 0.122986 +vt 0.417060 0.143778 +vt 0.346645 0.439977 +vt 0.335120 0.487990 +vt 0.318813 0.532980 +vt 0.299476 0.560871 +vt 0.267422 0.587665 +vt 0.203316 0.636772 +vt 0.124729 0.691714 +vt 0.085988 0.725511 +vt 0.064911 0.757495 +vt 0.066727 0.793592 +vt 0.436035 0.122962 +vt 0.495260 0.736170 +vt 0.500696 0.234197 +vt 0.536496 0.234045 +vt 0.577350 0.233157 +vt 0.495655 0.736171 +vt 0.501053 0.234197 +vt 0.464891 0.233960 +vt 0.422300 0.232972 +vt 0.408534 0.223769 +vt 0.563583 0.223955 +vt 0.367604 0.795692 +vt 0.344548 0.863566 +vt 0.343493 0.862334 +vt 0.368659 0.796923 +vt 0.344327 0.876900 +vt 0.343272 0.875668 +vt 0.145143 0.856433 +vt 0.144088 0.855201 +vt 0.144487 0.796170 +vt 0.143432 0.794939 +vt 0.132013 0.795411 +vt 0.130679 0.853014 +vt 0.129623 0.851782 +vt 0.133068 0.796642 +vt 0.006462 0.836828 +vt 0.005407 0.835597 +vt 0.003936 0.813497 +vt 0.002882 0.812266 +vt 0.005457 0.809612 +vt 0.004402 0.808380 +vt 0.004946 0.796489 +vt 0.003891 0.795258 +vt 0.854563 0.797672 +vt 0.853823 0.852194 +vt 0.854872 0.853763 +vt 0.853514 0.796103 +vt 0.978631 0.836386 +vt 0.979680 0.837955 +vt 0.982018 0.813180 +vt 0.983067 0.814749 +vt 0.980641 0.809310 +vt 0.981690 0.810879 +vt 0.981636 0.796256 +vt 0.982685 0.797825 +vt 0.618972 0.797391 +vt 0.639573 0.862183 +vt 0.640622 0.863752 +vt 0.617923 0.795822 +vt 0.639302 0.875450 +vt 0.640350 0.877019 +vt 0.839233 0.855561 +vt 0.840281 0.857130 +vt 0.842114 0.795606 +vt 0.843162 0.797175 +vt 0.341429 0.892018 +vt 0.354422 0.771751 +vt 0.371180 0.771906 +vt 0.361304 0.757630 +vt 0.375583 0.756290 +vt 0.376061 0.747099 +vt 0.386704 0.746114 +vt 0.396022 0.741918 +vt 0.399519 0.741536 +vt 0.406939 0.741656 +vt 0.407021 0.741651 +vt 0.362783 0.891001 +vt 0.382518 0.772090 +vt 0.385281 0.755640 +vt 0.393806 0.745632 +vt 0.401875 0.741347 +vt 0.407053 0.741648 +vt 0.377126 0.890562 +vt 0.415783 0.773053 +vt 0.413937 0.755087 +vt 0.414119 0.745184 +vt 0.408737 0.741153 +vt 0.407022 0.741639 +vt 0.418673 0.890604 +vt 0.457357 0.774594 +vt 0.449912 0.755475 +vt 0.439090 0.745395 +vt 0.417274 0.741201 +vt 0.406885 0.741627 +vt 0.367889 0.778452 +vt 0.364200 0.897177 +vt 0.470167 0.891713 +vt 0.370122 0.761446 +vt 0.381736 0.748731 +vt 0.398612 0.742335 +vt 0.406817 0.741630 +vt 0.341083 0.776828 +vt 0.346977 0.760159 +vt 0.366096 0.747919 +vt 0.393148 0.742062 +vt 0.406985 0.741639 +vt 0.330950 0.895375 +vt 0.334983 0.775889 +vt 0.341985 0.759566 +vt 0.362746 0.747620 +vt 0.391920 0.741975 +vt 0.407026 0.741643 +vt 0.322792 0.894560 +vt 0.337783 0.774019 +vt 0.345386 0.758625 +vt 0.365129 0.747299 +vt 0.392543 0.741914 +vt 0.407019 0.741650 +vt 0.324143 0.893295 +vt 0.342886 0.773061 +vt 0.350401 0.758202 +vt 0.368571 0.747202 +vt 0.393616 0.741910 +vt 0.406994 0.741653 +vt 0.329152 0.892735 +vt 0.606943 0.892335 +vt 0.578997 0.772154 +vt 0.598183 0.772042 +vt 0.576236 0.756530 +vt 0.592545 0.757906 +vt 0.567870 0.746331 +vt 0.580039 0.747342 +vt 0.558973 0.741727 +vt 0.562967 0.742117 +vt 0.553477 0.741826 +vt 0.553572 0.741831 +vt 0.582516 0.891263 +vt 0.566609 0.772310 +vt 0.565670 0.755855 +vt 0.560098 0.745830 +vt 0.556401 0.741531 +vt 0.553436 0.741823 +vt 0.566831 0.890789 +vt 0.533400 0.773194 +vt 0.537139 0.755234 +vt 0.539725 0.745333 +vt 0.549548 0.741322 +vt 0.553438 0.741813 +vt 0.525261 0.890731 +vt 0.494395 0.774638 +vt 0.503451 0.755539 +vt 0.516203 0.745487 +vt 0.541534 0.741350 +vt 0.553540 0.741802 +vt 0.599293 0.897457 +vt 0.597789 0.778726 +vt 0.476853 0.891721 +vt 0.595602 0.761715 +vt 0.582464 0.748970 +vt 0.563094 0.742531 +vt 0.553620 0.741805 +vt 0.620315 0.777161 +vt 0.614992 0.760479 +vt 0.595561 0.748192 +vt 0.567681 0.742270 +vt 0.553478 0.741814 +vt 0.627351 0.895729 +vt 0.624397 0.776234 +vt 0.618175 0.759896 +vt 0.597681 0.747900 +vt 0.568493 0.742185 +vt 0.553449 0.741818 +vt 0.633134 0.894930 +vt 0.618307 0.774354 +vt 0.611745 0.758943 +vt 0.593228 0.747572 +vt 0.567181 0.742122 +vt 0.553475 0.741825 +vt 0.628051 0.893657 +vt 0.611697 0.773381 +vt 0.605318 0.758506 +vt 0.588819 0.747464 +vt 0.565791 0.742115 +vt 0.553508 0.741827 +vt 0.621374 0.893083 +vt 0.467142 0.741480 +vt 0.460043 0.823727 +vt 0.466255 0.823734 +vt 0.491990 0.741510 +vt 0.491102 0.823764 +vt 0.497314 0.823771 +vt 0.459387 0.936839 +vt 0.481806 0.936865 +vt 0.442062 0.996371 +vt 0.457305 0.996390 +vt 0.441061 0.998017 +vt 0.455880 0.998035 +vt 0.440376 0.996388 +vt 0.454893 0.996405 +vt 0.440171 0.989270 +vt 0.454568 0.989287 +vt 0.440732 0.939254 +vt 0.455138 0.939271 +vt 0.441300 0.928768 +vt 0.455901 0.928785 +vt 0.442019 0.920921 +vt 0.456893 0.920939 +vt 0.442564 0.913924 +vt 0.457640 0.913942 +vt 0.463957 0.747884 +vt 0.487465 0.747912 +vt 0.464844 0.743833 +vt 0.488714 0.743862 +vt 0.549439 0.921434 +vt 0.548851 0.918488 +vt 0.544157 0.921323 +vt 0.551271 0.945406 +vt 0.533127 0.945025 +vt 0.552776 0.983628 +vt 0.528590 0.983120 +vt 0.552915 0.990499 +vt 0.528985 0.989997 +vt 0.552488 0.989209 +vt 0.532597 0.988792 +vt 0.540100 0.920799 +vt 0.519194 0.943227 +vt 0.510019 0.980723 +vt 0.510611 0.987626 +vt 0.517323 0.986820 +vt 0.538358 0.920003 +vt 0.513207 0.940494 +vt 0.502039 0.977080 +vt 0.502715 0.984021 +vt 0.510760 0.983824 +vt 0.539395 0.919149 +vt 0.516770 0.937557 +vt 0.506788 0.973165 +vt 0.507415 0.980148 +vt 0.514666 0.980605 +vt 0.542934 0.918463 +vt 0.528929 0.935204 +vt 0.522994 0.970029 +vt 0.523449 0.977045 +vt 0.527995 0.978025 +vt 0.548028 0.918132 +vt 0.546424 0.934066 +vt 0.546314 0.968512 +vt 0.546522 0.975543 +vt 0.547174 0.976777 +vt 0.553310 0.918243 +vt 0.564569 0.934446 +vt 0.570500 0.969019 +vt 0.570451 0.976045 +vt 0.567066 0.977194 +vt 0.557366 0.918766 +vt 0.578501 0.936245 +vt 0.589071 0.971416 +vt 0.588825 0.978417 +vt 0.582340 0.979166 +vt 0.559110 0.919562 +vt 0.584488 0.938978 +vt 0.597051 0.975059 +vt 0.596721 0.982022 +vt 0.588903 0.982162 +vt 0.558072 0.920417 +vt 0.580925 0.941915 +vt 0.592302 0.978974 +vt 0.592022 0.985895 +vt 0.584996 0.985382 +vt 0.554533 0.921102 +vt 0.568767 0.944267 +vt 0.576096 0.982110 +vt 0.575988 0.988998 +vt 0.571668 0.987961 +vt 0.424145 0.921277 +vt 0.423693 0.918338 +vt 0.418870 0.920933 +vt 0.423822 0.945229 +vt 0.405702 0.944048 +vt 0.421388 0.983437 +vt 0.397235 0.981863 +vt 0.420772 0.990308 +vt 0.396875 0.988751 +vt 0.420346 0.989024 +vt 0.400481 0.987729 +vt 0.414819 0.920239 +vt 0.391787 0.941664 +vt 0.378687 0.978685 +vt 0.378524 0.985607 +vt 0.385227 0.985116 +vt 0.413078 0.919381 +vt 0.385807 0.938716 +vt 0.370716 0.974756 +vt 0.370638 0.981719 +vt 0.378671 0.981884 +vt 0.414113 0.918588 +vt 0.389363 0.935994 +vt 0.375457 0.971128 +vt 0.375328 0.978129 +vt 0.382570 0.978900 +vt 0.417648 0.918074 +vt 0.401504 0.934227 +vt 0.391639 0.968773 +vt 0.391339 0.975799 +vt 0.395879 0.976963 +vt 0.422734 0.917975 +vt 0.418975 0.933889 +vt 0.414927 0.968321 +vt 0.414380 0.975353 +vt 0.415032 0.976592 +vt 0.428009 0.918319 +vt 0.437095 0.935070 +vt 0.439080 0.969896 +vt 0.438277 0.976910 +vt 0.434897 0.977887 +vt 0.432060 0.919013 +vt 0.451010 0.937454 +vt 0.457627 0.973073 +vt 0.456628 0.980054 +vt 0.450151 0.980500 +vt 0.433801 0.919872 +vt 0.456990 0.940402 +vt 0.465599 0.977003 +vt 0.464515 0.983942 +vt 0.456707 0.983732 +vt 0.432766 0.920664 +vt 0.453434 0.943124 +vt 0.460858 0.980631 +vt 0.459824 0.987532 +vt 0.452808 0.986716 +vt 0.429231 0.921178 +vt 0.441293 0.944891 +vt 0.444676 0.982987 +vt 0.443813 0.989862 +vt 0.439499 0.988653 +vt 0.489178 0.904955 +vt 0.478920 0.903724 +vt 0.488659 0.905860 +vt 0.513457 0.924223 +vt 0.511674 0.927332 +vt 0.523738 0.959386 +vt 0.521362 0.963531 +vt 0.522949 0.966121 +vt 0.520598 0.970220 +vt 0.515067 0.966111 +vt 0.513113 0.969519 +vt 0.486649 0.906626 +vt 0.504771 0.929961 +vt 0.512160 0.967035 +vt 0.511494 0.973688 +vt 0.505545 0.972402 +vt 0.483455 0.907135 +vt 0.493798 0.931710 +vt 0.497535 0.969367 +vt 0.497023 0.975995 +vt 0.493517 0.974319 +vt 0.479562 0.907310 +vt 0.480427 0.932313 +vt 0.479712 0.970170 +vt 0.479389 0.976790 +vt 0.478859 0.974980 +vt 0.475564 0.907126 +vt 0.466693 0.931678 +vt 0.461405 0.969323 +vt 0.461277 0.975952 +vt 0.463802 0.974284 +vt 0.472068 0.906608 +vt 0.454687 0.929901 +vt 0.445402 0.966955 +vt 0.445442 0.973609 +vt 0.450640 0.972336 +vt 0.469608 0.905838 +vt 0.446236 0.927254 +vt 0.434137 0.963426 +vt 0.434297 0.970118 +vt 0.441375 0.969434 +vt 0.468558 0.904931 +vt 0.442627 0.924138 +vt 0.429327 0.959274 +vt 0.429538 0.966009 +vt 0.437419 0.966018 +vt 0.469077 0.904026 +vt 0.444410 0.921030 +vt 0.431703 0.955130 +vt 0.431889 0.961909 +vt 0.439374 0.962610 +vt 0.471086 0.903260 +vt 0.451313 0.918400 +vt 0.440904 0.951625 +vt 0.440993 0.958442 +vt 0.446941 0.959728 +vt 0.474281 0.902751 +vt 0.462285 0.916651 +vt 0.455530 0.949294 +vt 0.455463 0.956135 +vt 0.458970 0.957810 +vt 0.478174 0.902575 +vt 0.475656 0.916048 +vt 0.473353 0.948490 +vt 0.473097 0.955340 +vt 0.473628 0.957150 +vt 0.482172 0.902760 +vt 0.489391 0.916684 +vt 0.491660 0.949337 +vt 0.491210 0.956177 +vt 0.488685 0.957846 +vt 0.485667 0.903278 +vt 0.501397 0.918460 +vt 0.507663 0.951705 +vt 0.507044 0.958521 +vt 0.501847 0.959794 +vt 0.488128 0.904048 +vt 0.509848 0.921108 +vt 0.518928 0.955234 +vt 0.518190 0.962012 +vt 0.511111 0.962696 +vt 0.490402 0.906636 +vt 0.478826 0.907307 +vt 0.488446 0.905821 +vt 0.501508 0.904625 +vt 0.497682 0.903031 +vt 0.513572 0.898392 +vt 0.507734 0.895959 +vt 0.520474 0.898400 +vt 0.513468 0.895480 +vt 0.527756 0.896328 +vt 0.519527 0.892898 +vt 0.532641 0.890349 +vt 0.523612 0.886586 +vt 0.534751 0.880504 +vt 0.525409 0.876611 +vt 0.483918 0.905221 +vt 0.488823 0.901856 +vt 0.494212 0.894166 +vt 0.497242 0.893329 +vt 0.500470 0.890372 +vt 0.502703 0.883814 +vt 0.503775 0.873743 +vt 0.478030 0.904996 +vt 0.477305 0.901416 +vt 0.476632 0.893495 +vt 0.476145 0.892524 +vt 0.475691 0.889426 +vt 0.475516 0.882776 +vt 0.475646 0.872669 +vt 0.472360 0.905207 +vt 0.466213 0.901829 +vt 0.459702 0.894125 +vt 0.455830 0.893280 +vt 0.451831 0.890314 +vt 0.449337 0.883750 +vt 0.448558 0.873677 +vt 0.468427 0.905797 +vt 0.458520 0.902984 +vt 0.447960 0.895887 +vt 0.441739 0.895394 +vt 0.435282 0.892798 +vt 0.431179 0.886476 +vt 0.429771 0.876497 +vt 0.467286 0.906609 +vt 0.456287 0.904571 +vt 0.444552 0.898310 +vt 0.437650 0.898301 +vt 0.430478 0.896212 +vt 0.425909 0.890222 +vt 0.424318 0.880373 +vt 0.469241 0.907423 +vt 0.460112 0.906165 +vt 0.450390 0.900743 +vt 0.444656 0.901221 +vt 0.438707 0.899641 +vt 0.434938 0.893984 +vt 0.433660 0.884266 +vt 0.473770 0.908024 +vt 0.468971 0.907340 +vt 0.463912 0.902535 +vt 0.460882 0.903372 +vt 0.457764 0.902168 +vt 0.455847 0.896756 +vt 0.455294 0.887134 +vt 0.479658 0.908248 +vt 0.480490 0.907779 +vt 0.481492 0.903207 +vt 0.481979 0.904178 +vt 0.482542 0.903114 +vt 0.483033 0.897794 +vt 0.483423 0.888208 +vt 0.485328 0.908037 +vt 0.491581 0.907367 +vt 0.498422 0.902577 +vt 0.502294 0.903422 +vt 0.506403 0.902226 +vt 0.509212 0.896820 +vt 0.510510 0.887200 +vt 0.489260 0.907447 +vt 0.499275 0.906212 +vt 0.510164 0.900814 +vt 0.516385 0.901307 +vt 0.522952 0.899742 +vt 0.527370 0.894095 +vt 0.529298 0.884380 +vt 0.435164 0.921226 +vt 0.423586 0.921892 +vt 0.433212 0.920281 +vt 0.446278 0.919232 +vt 0.442459 0.917382 +vt 0.458366 0.913050 +vt 0.452538 0.910227 +vt 0.465268 0.913058 +vt 0.458275 0.909671 +vt 0.472557 0.911003 +vt 0.464343 0.907025 +vt 0.477464 0.905073 +vt 0.468453 0.900708 +vt 0.479612 0.895309 +vt 0.470288 0.890792 +vt 0.428687 0.919585 +vt 0.433606 0.916021 +vt 0.439025 0.908150 +vt 0.442059 0.907178 +vt 0.445298 0.904097 +vt 0.447556 0.897496 +vt 0.448667 0.887469 +vt 0.422799 0.919325 +vt 0.422089 0.915513 +vt 0.421447 0.907374 +vt 0.420965 0.906248 +vt 0.420524 0.903004 +vt 0.420375 0.896296 +vt 0.420542 0.886228 +vt 0.417129 0.919572 +vt 0.410995 0.915994 +vt 0.404515 0.908109 +vt 0.400647 0.907129 +vt 0.396659 0.904039 +vt 0.394191 0.897432 +vt 0.393450 0.887403 +vt 0.413194 0.920257 +vt 0.403297 0.917335 +vt 0.392764 0.910156 +vt 0.386546 0.909585 +vt 0.380099 0.906924 +vt 0.376020 0.900598 +vt 0.374650 0.890678 +vt 0.412048 0.921199 +vt 0.401056 0.919178 +vt 0.389345 0.912967 +vt 0.382443 0.912959 +vt 0.375279 0.910887 +vt 0.370733 0.904945 +vt 0.369179 0.895177 +vt 0.414000 0.922144 +vt 0.404875 0.921027 +vt 0.395173 0.915790 +vt 0.389436 0.916346 +vt 0.383493 0.914865 +vt 0.379745 0.909310 +vt 0.378503 0.899693 +vt 0.418526 0.922840 +vt 0.413728 0.922388 +vt 0.408686 0.917867 +vt 0.405652 0.918839 +vt 0.402538 0.917793 +vt 0.400641 0.912523 +vt 0.400124 0.903017 +vt 0.424413 0.923099 +vt 0.425245 0.922896 +vt 0.426264 0.918643 +vt 0.426745 0.919770 +vt 0.427312 0.918886 +vt 0.427823 0.913722 +vt 0.428249 0.904258 +vt 0.430084 0.922854 +vt 0.436339 0.922415 +vt 0.443196 0.917909 +vt 0.447065 0.918889 +vt 0.451177 0.917851 +vt 0.454007 0.912586 +vt 0.455341 0.903083 +vt 0.434019 0.922168 +vt 0.444037 0.921074 +vt 0.454947 0.915862 +vt 0.461165 0.916432 +vt 0.467738 0.914966 +vt 0.472177 0.909421 +vt 0.474141 0.899807 +vt 0.560322 0.921376 +vt 0.548743 0.922041 +vt 0.558370 0.920430 +vt 0.571436 0.919381 +vt 0.567617 0.917532 +vt 0.583524 0.913199 +vt 0.577696 0.910376 +vt 0.590426 0.913208 +vt 0.583432 0.909820 +vt 0.597715 0.911152 +vt 0.589501 0.907174 +vt 0.602622 0.905222 +vt 0.593610 0.900857 +vt 0.604770 0.895458 +vt 0.595446 0.890942 +vt 0.553844 0.919735 +vt 0.558764 0.916170 +vt 0.564183 0.908299 +vt 0.567217 0.907327 +vt 0.570456 0.904246 +vt 0.572714 0.897645 +vt 0.573824 0.887618 +vt 0.547957 0.919475 +vt 0.547247 0.915662 +vt 0.546605 0.907524 +vt 0.546123 0.906397 +vt 0.545682 0.903153 +vt 0.545532 0.896446 +vt 0.545700 0.886378 +vt 0.542286 0.919721 +vt 0.536153 0.916144 +vt 0.529672 0.908258 +vt 0.525804 0.907278 +vt 0.521817 0.904188 +vt 0.519348 0.897581 +vt 0.518608 0.887552 +vt 0.538351 0.920406 +vt 0.528455 0.917485 +vt 0.517922 0.910305 +vt 0.511704 0.909735 +vt 0.505256 0.907073 +vt 0.501178 0.900747 +vt 0.499808 0.890828 +vt 0.537206 0.921348 +vt 0.526215 0.919327 +vt 0.514503 0.913117 +vt 0.507601 0.913109 +vt 0.500437 0.911036 +vt 0.495891 0.905095 +vt 0.494337 0.895326 +vt 0.539158 0.922293 +vt 0.530033 0.921176 +vt 0.520331 0.915940 +vt 0.514594 0.916496 +vt 0.508651 0.915014 +vt 0.504902 0.909460 +vt 0.503661 0.899843 +vt 0.543684 0.922989 +vt 0.538886 0.922537 +vt 0.533844 0.918017 +vt 0.530810 0.918989 +vt 0.527696 0.917942 +vt 0.525799 0.912672 +vt 0.525282 0.903166 +vt 0.549571 0.923249 +vt 0.550403 0.923045 +vt 0.551422 0.918792 +vt 0.551903 0.919919 +vt 0.552470 0.919035 +vt 0.552980 0.913871 +vt 0.553407 0.904407 +vt 0.555241 0.923003 +vt 0.561497 0.922564 +vt 0.568354 0.918058 +vt 0.572222 0.919038 +vt 0.576335 0.918000 +vt 0.579165 0.912735 +vt 0.580499 0.903232 +vt 0.559177 0.922317 +vt 0.569195 0.921223 +vt 0.580104 0.916011 +vt 0.586323 0.916581 +vt 0.592896 0.915115 +vt 0.597334 0.909570 +vt 0.599299 0.899957 +vt 0.559044 0.903560 +vt 0.555560 0.904061 +vt 0.557240 0.903502 +vt 0.562383 0.902441 +vt 0.558853 0.902327 +vt 0.565998 0.899330 +vt 0.560611 0.899155 +vt 0.568167 0.890833 +vt 0.561703 0.890623 +vt 0.555180 0.903480 +vt 0.554825 0.902283 +vt 0.554462 0.899089 +vt 0.554324 0.890544 +vt 0.553180 0.903497 +vt 0.550910 0.902317 +vt 0.548487 0.899141 +vt 0.547155 0.890606 +vt 0.551541 0.903552 +vt 0.547705 0.902423 +vt 0.543596 0.899303 +vt 0.541285 0.890801 +vt 0.550515 0.903635 +vt 0.545699 0.902586 +vt 0.540533 0.899551 +vt 0.537609 0.891098 +vt 0.550258 0.903734 +vt 0.545195 0.902780 +vt 0.539764 0.899847 +vt 0.536687 0.891453 +vt 0.550808 0.903834 +vt 0.546272 0.902975 +vt 0.541408 0.900146 +vt 0.538658 0.891812 +vt 0.552082 0.903920 +vt 0.548764 0.903143 +vt 0.545212 0.900402 +vt 0.543224 0.892119 +vt 0.553886 0.903978 +vt 0.552293 0.903257 +vt 0.550598 0.900576 +vt 0.549688 0.892329 +vt 0.555946 0.904000 +vt 0.556322 0.903301 +vt 0.556747 0.900643 +vt 0.557066 0.892408 +vt 0.557947 0.903983 +vt 0.560237 0.903267 +vt 0.562722 0.900591 +vt 0.564236 0.892346 +vt 0.559585 0.903929 +vt 0.563441 0.903161 +vt 0.567613 0.900428 +vt 0.570106 0.892151 +vt 0.560611 0.903845 +vt 0.565448 0.902998 +vt 0.570676 0.900181 +vt 0.573781 0.891854 +vt 0.560868 0.903746 +vt 0.565951 0.902804 +vt 0.571445 0.899885 +vt 0.574704 0.891499 +vt 0.560318 0.903646 +vt 0.564875 0.902609 +vt 0.569802 0.899586 +vt 0.572732 0.891140 +vt 0.397743 0.903368 +vt 0.394259 0.903868 +vt 0.395939 0.903310 +vt 0.401082 0.902248 +vt 0.397553 0.902134 +vt 0.404697 0.899137 +vt 0.399311 0.898963 +vt 0.406867 0.890641 +vt 0.400403 0.890431 +vt 0.393880 0.903288 +vt 0.393524 0.902090 +vt 0.393162 0.898897 +vt 0.393024 0.890351 +vt 0.391879 0.903305 +vt 0.389610 0.902124 +vt 0.387187 0.898948 +vt 0.385854 0.890414 +vt 0.390241 0.903359 +vt 0.386405 0.902231 +vt 0.382296 0.899111 +vt 0.379985 0.890608 +vt 0.389215 0.903442 +vt 0.384398 0.902393 +vt 0.379233 0.899359 +vt 0.376309 0.890906 +vt 0.388958 0.903541 +vt 0.383895 0.902587 +vt 0.378464 0.899655 +vt 0.375387 0.891261 +vt 0.389508 0.903641 +vt 0.384971 0.902783 +vt 0.380107 0.899953 +vt 0.377358 0.891619 +vt 0.390782 0.903727 +vt 0.387464 0.902951 +vt 0.383912 0.900209 +vt 0.381923 0.891927 +vt 0.392586 0.903786 +vt 0.390993 0.903065 +vt 0.389298 0.900384 +vt 0.388387 0.892136 +vt 0.394645 0.903808 +vt 0.395022 0.903108 +vt 0.395447 0.900450 +vt 0.395766 0.892216 +vt 0.396646 0.903790 +vt 0.398936 0.903074 +vt 0.401422 0.900398 +vt 0.402936 0.892153 +vt 0.398285 0.903736 +vt 0.402141 0.902968 +vt 0.406313 0.900236 +vt 0.408806 0.891959 +vt 0.399310 0.903653 +vt 0.404148 0.902806 +vt 0.409376 0.899988 +vt 0.412481 0.891661 +vt 0.399568 0.903554 +vt 0.404651 0.902612 +vt 0.410145 0.899692 +vt 0.413404 0.891306 +vt 0.399017 0.903454 +vt 0.403575 0.902416 +vt 0.408502 0.899393 +vt 0.411432 0.890948 +vt 0.560050 0.895619 +vt 0.598903 0.933649 +vt 0.559659 0.931810 +vt 0.626960 0.931921 +vt 0.632743 0.931121 +vt 0.633550 0.930793 +vt 0.633940 0.894602 +vt 0.632944 0.930462 +vt 0.633334 0.894271 +vt 0.630952 0.930143 +vt 0.631342 0.893951 +vt 0.627661 0.929849 +vt 0.589170 0.929516 +vt 0.589561 0.893325 +vt 0.398164 0.895426 +vt 0.363809 0.933369 +vt 0.397773 0.931617 +vt 0.330560 0.931567 +vt 0.322401 0.930751 +vt 0.321016 0.894228 +vt 0.320625 0.930420 +vt 0.320649 0.893898 +vt 0.320258 0.930089 +vt 0.321706 0.893582 +vt 0.321316 0.929773 +vt 0.323752 0.929486 +vt 0.361788 0.893053 +vt 0.361398 0.929244 +vt 0.559656 0.902097 +vt 0.555589 0.901346 +vt 0.557317 0.902165 +vt 0.573965 0.927557 +vt 0.563255 0.927865 +vt 0.573734 0.930613 +vt 0.563137 0.930918 +vt 0.570621 0.930463 +vt 0.561812 0.930717 +vt 0.554520 0.902163 +vt 0.550449 0.927858 +vt 0.550467 0.930911 +vt 0.551280 0.930711 +vt 0.552015 0.902093 +vt 0.538979 0.927538 +vt 0.539119 0.930594 +vt 0.541846 0.930447 +vt 0.550473 0.901973 +vt 0.531919 0.926990 +vt 0.532133 0.930052 +vt 0.536040 0.929997 +vt 0.550307 0.901836 +vt 0.531159 0.926362 +vt 0.531382 0.929430 +vt 0.535415 0.929480 +vt 0.551562 0.901718 +vt 0.536905 0.925821 +vt 0.537067 0.928895 +vt 0.540141 0.929035 +vt 0.553901 0.901651 +vt 0.547615 0.925513 +vt 0.547664 0.928591 +vt 0.548949 0.928782 +vt 0.556698 0.901652 +vt 0.560422 0.925520 +vt 0.560334 0.928598 +vt 0.559482 0.928788 +vt 0.559203 0.901723 +vt 0.571891 0.925841 +vt 0.571682 0.928915 +vt 0.568915 0.929052 +vt 0.560745 0.901842 +vt 0.578951 0.926388 +vt 0.578668 0.929457 +vt 0.574722 0.929502 +vt 0.560911 0.901979 +vt 0.579711 0.927017 +vt 0.579419 0.930079 +vt 0.575346 0.930019 +vt 0.398356 0.901905 +vt 0.394289 0.901154 +vt 0.396017 0.901972 +vt 0.412665 0.927365 +vt 0.401954 0.927673 +vt 0.412434 0.930421 +vt 0.401837 0.930726 +vt 0.409321 0.930271 +vt 0.400512 0.930524 +vt 0.394258 0.903992 +vt 0.393220 0.901971 +vt 0.389148 0.927666 +vt 0.389167 0.930719 +vt 0.389979 0.930518 +vt 0.390714 0.901901 +vt 0.377679 0.927345 +vt 0.377819 0.930402 +vt 0.380546 0.930255 +vt 0.389172 0.901781 +vt 0.370618 0.926798 +vt 0.370833 0.929860 +vt 0.374739 0.929804 +vt 0.389006 0.901644 +vt 0.369859 0.926169 +vt 0.370082 0.929238 +vt 0.374115 0.929287 +vt 0.390261 0.901526 +vt 0.375605 0.925629 +vt 0.375767 0.928703 +vt 0.378840 0.928843 +vt 0.392601 0.901458 +vt 0.386315 0.925321 +vt 0.386364 0.928398 +vt 0.387649 0.928590 +vt 0.395398 0.901460 +vt 0.399121 0.925328 +vt 0.399034 0.928406 +vt 0.398181 0.928596 +vt 0.397903 0.901530 +vt 0.410591 0.925648 +vt 0.410382 0.928723 +vt 0.407615 0.928859 +vt 0.399445 0.901650 +vt 0.417651 0.926196 +vt 0.417368 0.929265 +vt 0.413422 0.929310 +vt 0.399611 0.901787 +vt 0.418410 0.926824 +vt 0.418119 0.929886 +vt 0.414046 0.929826 +vn 0.011353 0.401349 0.915830 +vn 0.382275 0.411969 -0.827082 +vn -0.579608 0.385968 -0.717673 +vn -0.581500 0.379101 -0.719810 +vn -0.578936 0.391400 -0.715262 +vn -0.587512 0.353526 -0.727866 +vn -0.281625 0.919126 -0.275399 +vn 0.057253 0.984527 0.165563 +vn 0.071383 0.980926 0.180639 +vn -0.296457 0.908780 -0.293558 +vn 0.474380 0.596789 0.647114 +vn 0.491165 0.565630 0.662404 +vn 0.513932 0.515061 0.685965 +vn 0.517106 0.508774 0.688223 +vn 0.275857 0.401013 -0.873531 +vn -0.191260 0.288827 -0.938047 +vn -0.394971 -0.383221 0.834925 +vn 0.387310 -0.917112 0.094089 +vn 0.623280 0.340129 0.704123 +vn 0.167821 -0.764855 0.621906 +vn 0.346049 -0.937437 -0.037507 +vn 0.028108 -0.899045 0.436933 +vn 0.351848 -0.931425 -0.092898 +vn -0.021699 -0.935636 0.352214 +vn 0.354595 -0.925047 -0.135960 +vn -0.066134 -0.957091 0.282022 +vn 0.350780 -0.921049 -0.169012 +vn 0.518418 -0.764580 -0.382855 +vn 0.338420 -0.920835 -0.193701 +vn 0.202460 -0.979156 -0.015046 +vn 0.316080 -0.924802 -0.211646 +vn 0.010743 -0.996918 -0.077364 +vn 0.282449 -0.932432 -0.225257 +vn -0.263527 -0.963652 0.043672 +vn 0.235603 -0.942106 -0.238563 +vn -0.338664 -0.940489 -0.026948 +vn 0.130589 -0.939299 -0.317209 +vn -0.497787 -0.838588 -0.221198 +vn -0.419324 0.243233 -0.874599 +vn -0.876553 -0.425245 0.225349 +vn 0.628407 0.047426 -0.776421 +vn 0.780297 -0.115146 -0.614673 +vn 0.783563 0.069918 -0.617328 +vn -0.748405 -0.260353 0.609973 +vn -0.749504 -0.261116 0.608264 +vn 0.753014 -0.055422 -0.655629 +vn -0.749474 -0.261025 0.608386 +vn 0.758538 -0.024628 -0.651143 +vn -0.749535 -0.261055 0.608264 +vn 0.767571 -0.000092 -0.640919 +vn -0.749565 -0.261055 0.608234 +vn 0.611438 -0.665090 -0.428663 +vn -0.751213 -0.254250 0.609088 +vn 0.407697 -0.867550 -0.284768 +vn -0.752129 -0.255257 0.607532 +vn 0.356670 -0.868801 -0.343394 +vn 0.296243 -0.863887 -0.407300 +vn 0.220618 -0.847133 -0.483383 +vn 0.021393 -0.758263 -0.651570 +vn -0.141331 -0.391461 -0.909268 +vn -0.187475 -0.241737 0.952055 +vn 0.837397 0.084780 -0.539933 +vn -0.023103 -0.413434 0.910215 +vn 0.824702 0.075686 -0.560442 +vn -0.095370 -0.585253 0.805200 +vn 0.812677 0.068239 -0.578692 +vn -0.154118 -0.691580 0.705618 +vn 0.800623 0.065004 -0.595599 +vn -0.233772 -0.776574 0.584979 +vn 0.788965 0.064425 -0.611011 +vn -0.333689 -0.831782 0.443556 +vn 0.785150 0.052644 -0.617023 +vn -0.415937 -0.817103 0.399091 +vn 0.779382 0.063265 -0.623310 +vn -0.437086 -0.843745 0.311441 +vn 0.767327 0.061159 -0.638295 +vn -0.553789 -0.813898 0.175604 +vn 0.753685 0.061495 -0.654317 +vn -0.658071 -0.750481 0.060671 +vn 0.738456 0.065859 -0.671041 +vn -0.748985 -0.661794 -0.031587 +vn 0.720969 0.071505 -0.689230 +vn -0.847560 -0.510117 -0.146214 +vn -0.934355 -0.298257 -0.194861 +vn -0.388806 -0.092868 0.916593 +vn -0.783807 -0.067476 0.617298 +vn -0.417402 -0.324046 0.848964 +vn 0.045289 -0.536576 0.842616 +vn 0.101627 -0.139500 0.984985 +vn 0.268532 -0.648549 0.712180 +vn 0.342967 -0.179662 0.921964 +vn 0.327982 -0.690237 0.644917 +vn 0.425520 -0.197241 0.883145 +vn 0.333811 -0.702963 0.627979 +vn 0.428297 -0.209754 0.878933 +vn 0.353496 -0.704642 0.615192 +vn 0.454268 -0.208472 0.866115 +vn 0.400616 -0.719047 0.567858 +vn 0.518052 -0.221412 0.826167 +vn 0.455519 -0.674062 0.581439 +vn 0.540757 -0.377819 0.751518 +vn -0.056063 -0.389721 0.919187 +vn -0.071047 -0.408887 0.909787 +vn -0.799554 -0.060579 0.597491 +vn -0.499863 -0.502060 0.705710 +vn -0.068178 -0.820673 0.567278 +vn 0.131443 -0.908658 0.396252 +vn 0.175726 -0.927091 0.331004 +vn 0.185553 -0.931791 0.311930 +vn 0.202643 -0.933988 0.294198 +vn 0.229926 -0.937773 0.260079 +vn 0.249245 -0.927580 0.278268 +vn -0.605335 -0.408643 0.683035 +vn -0.580706 -0.562334 0.588610 +vn -0.185675 -0.914670 0.358959 +vn 0.015992 -0.980255 0.196997 +vn 0.065188 -0.986755 0.148350 +vn 0.079196 -0.987762 0.134129 +vn 0.098361 -0.988250 0.116916 +vn 0.122410 -0.988006 0.093783 +vn 0.182073 -0.973327 0.139500 +vn -0.653920 -0.466628 0.595477 +vn -0.661611 -0.570849 0.486160 +vn -0.310678 -0.929106 0.200537 +vn -0.097995 -0.993866 0.051149 +vn -0.037843 -0.999146 0.014679 +vn -0.021607 -0.999725 0.005341 +vn 0.000305 -0.999939 -0.008972 +vn 0.045381 -0.998901 0.010651 +vn 0.056917 0.996734 0.057009 +vn -0.761834 -0.063967 0.644581 +vn -0.760979 -0.529954 0.374187 +vn -0.492935 -0.869564 0.028474 +vn -0.268410 -0.956328 -0.115513 +vn -0.190405 -0.971160 -0.143376 +vn -0.172277 -0.974181 -0.145756 +vn -0.149602 -0.976074 -0.157720 +vn -0.080416 -0.988525 -0.127750 +vn 0.157567 0.963073 0.218177 +vn -0.774438 -0.080844 0.627430 +vn -0.895108 -0.376080 0.239387 +vn -0.758873 -0.626179 -0.178747 +vn -0.565905 -0.744591 -0.353954 +vn -0.478896 -0.784600 -0.393689 +vn -0.462539 -0.795160 -0.392071 +vn -0.446303 -0.797143 -0.406629 +vn -0.383801 -0.811182 -0.441176 +vn -0.569842 -0.402722 -0.716269 +vn -0.867214 -0.482040 -0.124546 +vn -0.972625 -0.160802 0.167699 +vn -0.913907 -0.254952 -0.315836 +vn -0.789666 -0.307993 -0.530595 +vn -0.731681 -0.333262 -0.594592 +vn -0.719108 -0.343425 -0.604053 +vn -0.711142 -0.341990 -0.614215 +vn -0.645924 -0.361064 -0.672597 +vn -0.589465 -0.359386 -0.723411 +vn -0.558916 -0.355724 -0.749016 +vn -0.984649 -0.017029 0.173559 +vn -0.950407 0.063387 -0.304422 +vn -0.841395 0.103824 -0.530290 +vn -0.806238 0.117710 -0.579699 +vn -0.796869 0.065188 -0.600574 +vn -0.815058 0.082797 -0.573412 +vn -0.747459 0.052217 -0.662221 +vn -0.662618 0.054933 -0.746910 +vn -0.946440 0.184942 0.264534 +vn -0.901151 0.405866 -0.152165 +vn -0.791284 0.484329 -0.373119 +vn -0.758507 0.497940 -0.420301 +vn -0.832942 0.412763 -0.368511 +vn -0.853053 0.386303 -0.350780 +vn -0.759667 0.372906 -0.532762 +vn -0.660024 0.386639 -0.644063 +vn -0.246498 0.354472 -0.901975 +vn -0.869778 0.307108 0.386151 +vn -0.768059 0.638356 0.050264 +vn -0.649892 0.745659 -0.146855 +vn -0.625477 0.757378 -0.187414 +vn -0.755150 0.653676 -0.049348 +vn -0.807489 0.588000 -0.046693 +vn -0.708548 0.652181 -0.269387 +vn -0.584002 0.694327 -0.420484 +vn -0.127415 0.687521 -0.714866 +vn -0.815638 0.347392 0.462600 +vn -0.668355 0.719535 0.188513 +vn -0.535874 0.844081 0.017426 +vn -0.510453 0.859676 -0.017945 +vn -0.661184 0.738060 0.134465 +vn -0.726676 0.668844 0.156682 +vn -0.613208 0.788659 -0.044343 +vn -0.469069 0.859127 -0.204505 +vn -0.005982 0.836024 -0.548601 +vn -0.769311 0.368267 0.521989 +vn -0.581652 0.755638 0.301035 +vn -0.433180 0.887845 0.155126 +vn -0.404614 0.905606 0.127018 +vn -0.570086 0.773553 0.276742 +vn -0.631184 0.706412 0.320200 +vn -0.491775 0.855464 0.162236 +vn -0.328074 0.944578 0.010163 +vn 0.136052 0.927732 -0.347453 +vn -0.751610 0.359294 0.553117 +vn -0.543962 0.760521 0.354472 +vn -0.385083 0.896725 0.218116 +vn -0.352306 0.916196 0.190802 +vn -0.517808 0.788629 0.331462 +vn -0.585437 0.710044 0.391247 +vn -0.428938 0.866573 0.255043 +vn -0.254402 0.960753 0.110477 +vn 0.239692 0.931913 -0.272164 +vn -0.726463 0.373699 0.576678 +vn -0.501083 0.765160 0.404187 +vn -0.335337 0.899319 0.280557 +vn -0.301431 0.917936 0.257851 +vn -0.474563 0.785058 0.398083 +vn -0.523942 0.719474 0.455824 +vn -0.352763 0.870785 0.342387 +vn -0.173925 0.962493 0.208197 +vn -0.035707 0.993988 0.103244 +vn -0.678487 0.364696 0.637684 +vn -0.410749 0.749992 0.518418 +vn -0.224158 0.880764 0.417066 +vn -0.182409 0.898740 0.398663 +vn -0.354961 0.774987 0.522843 +vn -0.385052 0.709708 0.589892 +vn -0.180914 0.837123 0.516190 +vn -0.016968 0.917447 0.397443 +vn -0.462996 0.684591 0.562975 +vn -0.612934 0.339244 0.713553 +vn -0.294046 0.693960 0.657216 +vn -0.084872 0.811884 0.577593 +vn -0.034639 0.826319 0.562120 +vn -0.180486 0.720573 0.669454 +vn -0.199011 0.655660 0.728324 +vn 0.022217 0.734397 0.678335 +vn 0.145665 0.812983 0.563738 +vn -0.714560 0.223823 0.662770 +vn -0.504288 0.240455 0.829341 +vn -0.113254 0.500290 0.858394 +vn 0.119724 0.592853 0.796319 +vn 0.180761 0.608966 0.772301 +vn 0.118778 0.528459 0.840571 +vn 0.082675 0.500137 0.861965 +vn 0.284463 0.498032 0.819147 +vn 0.422620 0.516312 0.744835 +vn 0.035096 0.318186 0.947356 +vn -0.410077 0.052370 0.910520 +vn 0.049562 0.183081 0.981842 +vn 0.291269 0.239875 0.926054 +vn 0.358043 0.252937 0.898770 +vn 0.362987 0.210150 0.907773 +vn 0.343822 0.221992 0.912381 +vn 0.442213 0.193243 0.875820 +vn 0.550554 0.199133 0.810663 +vn -0.318186 0.933988 0.162420 +vn -0.200354 0.971496 0.126591 +vn -0.223548 0.970855 0.086062 +vn -0.066347 0.990966 0.116398 +vn -0.139744 0.989990 0.019105 +vn -0.061495 0.991150 0.117496 +vn -0.134465 0.990814 0.013977 +vn -0.061037 0.991882 0.111362 +vn -0.123630 0.992309 0.003357 +vn -0.057009 0.994201 0.090915 +vn -0.100101 0.994812 -0.016938 +vn -0.012268 0.998962 0.043367 +vn -0.037477 0.996979 -0.067965 +vn 0.029817 0.999237 -0.024323 +vn 0.018677 0.993408 -0.112918 +vn 0.065371 0.994415 -0.082797 +vn 0.053926 0.989196 -0.136113 +vn 0.033235 0.996521 -0.076144 +vn 0.028626 0.992889 -0.115299 +vn -0.016511 0.998688 -0.048128 +vn -0.013733 0.996429 -0.083041 +vn 0.529496 0.712210 -0.460829 +vn 0.523026 0.708579 -0.473617 +vn 0.789056 -0.011536 -0.614185 +vn -0.302988 0.938353 0.166265 +vn -0.265389 0.938994 0.218726 +vn 0.008972 0.974334 0.224860 +vn 0.017914 0.971709 0.235389 +vn 0.009888 0.967406 0.252937 +vn -0.025452 0.968108 0.249153 +vn -0.026399 0.977172 0.210669 +vn -0.000336 0.993500 0.113742 +vn 0.030061 0.999298 0.021210 +vn 0.023957 0.999512 -0.018830 +vn -0.017853 0.999817 0.001221 +vn 0.536332 0.721305 -0.438215 +vn -0.298685 0.932981 0.200690 +vn -0.114658 -0.798791 -0.590564 +vn -0.370708 -0.526780 -0.764885 +vn -0.291025 -0.616688 -0.731407 +vn -0.143254 -0.625172 -0.767205 +vn 0.027223 -0.640553 -0.767418 +vn 0.111332 -0.662038 -0.741111 +vn 0.135563 -0.740410 -0.658315 +vn 0.095309 -0.862575 -0.496811 +vn 0.031892 -0.950316 -0.309610 +vn -0.117801 -0.895688 -0.428724 +vn 0.703726 0.085910 -0.705222 +vn 0.140812 -0.988342 -0.057833 +vn -0.176916 0.112217 -0.977783 +vn -0.463820 -0.000244 -0.885922 +vn -0.396466 0.495773 -0.772637 +vn -0.251259 0.629933 -0.734855 +vn -0.082247 0.613941 -0.785028 +vn 0.062685 0.432813 -0.899289 +vn 0.114200 0.360729 -0.925626 +vn 0.067263 0.509629 -0.857723 +vn -0.147404 0.666036 -0.731162 +vn -0.333659 0.761101 -0.556200 +vn -0.153478 0.913327 -0.377148 +vn -0.370403 -0.745903 -0.553514 +vn -0.117374 0.990661 0.069308 +vn -0.045228 -0.997101 0.061098 +vn -0.457808 -0.775109 -0.435408 +vn -0.716849 -0.364360 -0.594409 +vn -0.842647 0.257424 -0.472915 +vn -0.742363 -0.635609 -0.211829 +vn -0.978973 -0.126621 -0.159734 +vn -0.920560 0.370373 -0.124027 +vn -0.685263 -0.714591 -0.140477 +vn -0.822535 0.452986 -0.343791 +vn -0.424726 0.841395 -0.334086 +vn 0.104862 -0.938810 0.328043 +vn -0.146855 0.961974 -0.230232 +vn -0.592578 0.640126 -0.488907 +vn -0.615009 0.631336 -0.472365 +vn -0.672750 0.632954 -0.383038 +vn -0.732994 0.635304 -0.243019 +vn -0.733726 0.657796 -0.169988 +vn -0.650349 0.747856 -0.133000 +vn -0.509659 0.849849 -0.133976 +vn -0.374187 0.917051 -0.137638 +vn -0.261879 0.943449 -0.203101 +vn -0.750603 0.280526 0.598193 +vn -0.264351 0.961669 0.072787 +vn -0.292032 0.955870 -0.031159 +vn -0.329691 0.920103 -0.211402 +vn -0.339793 0.915555 -0.215125 +vn -0.354900 0.915159 -0.190985 +vn -0.364147 0.919675 -0.146916 +vn -0.327921 0.934049 -0.141392 +vn -0.236305 0.962859 -0.130497 +vn -0.132908 0.981079 -0.140751 +vn -0.095737 0.987732 -0.123142 +vn -0.095767 0.990448 -0.099002 +vn 0.488937 0.717917 -0.495499 +vn -0.306192 0.943205 0.128666 +vn -0.249184 0.966887 0.054659 +vn -0.214362 0.973754 -0.076144 +vn -0.213904 0.973327 -0.082614 +vn -0.208258 0.974456 -0.083956 +vn -0.190619 0.978057 -0.083712 +vn -0.134281 0.983673 -0.119694 +vn -0.065127 0.987915 -0.140446 +vn -0.005676 0.987548 -0.157170 +vn -0.010773 0.991577 -0.128971 +vn -0.047334 0.995025 -0.087466 +vn 0.511277 0.710990 -0.482742 +vn -0.317698 0.934355 0.161168 +vn 0.115726 -0.988556 0.096622 +vn 0.137333 -0.978088 0.156377 +vn 0.149754 -0.969787 0.192450 +vn 0.113804 -0.975402 0.188665 +vn 0.085177 -0.975860 0.201056 +vn 0.090030 -0.983673 0.155797 +vn 0.118778 -0.991150 0.058962 +vn 0.183233 -0.982940 -0.013886 +vn 0.138249 -0.988586 0.059420 +vn 0.134892 -0.989990 0.041383 +vn 0.729453 -0.456862 -0.509049 +vn -0.047090 -0.987243 0.151891 +vn 0.017121 -0.989441 0.143895 +vn 0.119480 -0.983428 0.136174 +vn 0.126865 -0.983886 0.125919 +vn 0.118809 -0.985748 0.119053 +vn 0.100009 -0.988037 0.117252 +vn 0.092471 -0.989349 0.112217 +vn 0.103183 -0.991180 0.082858 +vn 0.137211 -0.989776 0.038453 +vn 0.148564 -0.988800 0.012665 +vn 0.133518 -0.990966 0.011872 +vn 0.619343 -0.669668 -0.409772 +vn -0.082308 -0.983306 0.162206 +vn -0.013428 -0.993072 0.116581 +vn 0.076205 -0.994476 0.071780 +vn 0.089877 -0.994110 0.060427 +vn 0.092868 -0.994140 0.054903 +vn 0.089145 -0.994568 0.053194 +vn 0.092318 -0.994537 0.048616 +vn 0.110874 -0.993408 0.028413 +vn 0.147404 -0.989044 -0.005463 +vn 0.164617 -0.986053 -0.024293 +vn 0.148503 -0.988769 -0.015656 +vn 0.615223 -0.670400 -0.414716 +vn -0.095187 -0.981842 0.163976 +vn -0.030366 -0.994903 0.096072 +vn 0.037080 -0.999023 0.022736 +vn 0.052431 -0.998535 0.012757 +vn 0.059267 -0.998169 0.011414 +vn 0.060518 -0.998016 0.015534 +vn 0.066469 -0.997681 0.014222 +vn 0.091372 -0.995788 0.001312 +vn 0.133305 -0.990692 -0.027131 +vn 0.154118 -0.987274 -0.039003 +vn 0.143284 -0.989319 -0.026276 +vn 0.612751 -0.670492 -0.418226 +vn -0.094028 -0.983001 0.157659 +vn -0.057375 -0.996307 0.063570 +vn -0.016144 -0.999237 -0.034730 +vn -0.002991 -0.999207 -0.039277 +vn 0.003479 -0.999542 -0.030030 +vn 0.002014 -0.999908 -0.012177 +vn 0.004822 -0.999969 -0.002655 +vn 0.037202 -0.999268 -0.006897 +vn 0.092563 -0.995239 -0.029878 +vn 0.117161 -0.992523 -0.033509 +vn 0.112613 -0.993439 -0.018281 +vn 0.609699 -0.669759 -0.423841 +vn -0.078555 -0.987610 0.135685 +vn -0.137303 -0.990387 -0.015900 +vn -0.142460 -0.977447 -0.155675 +vn -0.135044 -0.979888 -0.146733 +vn -0.135533 -0.984924 -0.107364 +vn -0.147191 -0.987518 -0.055879 +vn -0.153020 -0.987945 -0.022248 +vn -0.097934 -0.995117 -0.011658 +vn -0.015992 -0.999634 -0.021455 +vn 0.047945 -0.998474 -0.026307 +vn 0.066897 -0.997559 -0.018983 +vn 0.600665 -0.671346 -0.434065 +vn -0.027772 -0.995697 0.088137 +vn 0.090670 -0.995666 0.019135 +vn 0.090579 -0.995697 0.019044 +vn 0.188879 -0.970733 0.148198 +vn 0.334513 -0.875454 0.348735 +vn 0.092196 -0.995514 0.021088 +vn 0.092257 -0.995483 0.021180 +vn -0.010163 -0.994171 -0.107089 +vn -0.175970 -0.935575 -0.306040 +vn -0.539750 0.570238 -0.619221 +vn 0.411664 0.682363 0.604022 +vn -0.004852 -0.012940 0.999878 +vn 0.696249 0.084201 0.712821 +vn -0.004883 -0.012940 0.999878 +vn 0.990326 0.131718 0.043519 +vn 0.050478 0.019013 -0.998535 +vn -0.983367 -0.129765 -0.126957 +vn -0.108615 -0.026734 0.993713 +vn 0.991089 0.132176 0.014832 +vn 0.062136 0.020569 -0.997833 +vn -0.673421 -0.080905 -0.734764 +vn -0.673421 -0.080905 -0.734794 +vn -0.689810 -0.083254 -0.719169 +vn -0.689810 -0.083285 -0.719169 +vn -0.981964 -0.129429 -0.137730 +vn -0.979644 -0.153935 -0.128636 +vn 0.215613 0.068148 -0.974090 +vn 0.972839 0.151250 0.175115 +vn 0.549547 0.060335 0.833247 +vn 0.530747 0.056856 0.845607 +vn -0.095462 -0.049409 0.994201 +vn -0.961516 -0.147496 -0.231666 +vn -0.523148 -0.055483 -0.850398 +vn 0.187872 0.063875 -0.980102 +vn 0.970794 0.150517 0.186682 +vn -0.106113 -0.051088 0.993011 +vn -0.567309 0.638081 -0.520554 +vn -0.672536 0.613269 -0.414167 +vn -0.600604 0.726829 -0.333079 +vn -0.865627 0.485733 -0.121220 +vn -0.821436 0.567125 -0.059572 +vn -0.932096 0.276009 0.234443 +vn -0.919126 0.294443 0.261635 +vn -0.874447 0.076205 0.479049 +vn -0.883908 0.053224 0.464583 +vn -0.603076 0.791742 0.096896 +vn -0.825739 -0.022523 0.563585 +vn -0.512680 0.740440 -0.434584 +vn -0.416974 0.906156 -0.070406 +vn -0.663503 0.732475 0.152409 +vn -0.827845 0.397473 0.395764 +vn -0.848079 0.094943 0.521256 +vn -0.826167 -0.037660 0.562120 +vn -0.333415 0.927396 -0.169500 +vn -0.134648 0.947172 0.290994 +vn -0.400525 0.795190 0.455214 +vn -0.672384 0.449507 0.588031 +vn -0.789911 0.101962 0.604633 +vn -0.920225 -0.098300 0.378765 +vn -0.052156 0.977294 0.205359 +vn 0.416059 0.251076 0.873959 +vn 0.175665 0.154698 0.972198 +vn -0.109897 -0.090121 0.989837 +vn -0.221870 -0.384716 0.895932 +vn 0.825556 -0.543962 0.150029 +vn 0.010590 -0.999908 0.005737 +vn 0.058046 -0.998260 -0.008972 +vn 0.495163 0.283273 0.821284 +vn -0.225318 -0.960570 0.162877 +vn -0.348491 -0.769860 0.534623 +vn -0.290658 -0.581988 0.759453 +vn 0.808496 -0.539659 0.234657 +vn -0.564837 -0.555742 -0.609973 +vn -0.793847 -0.511612 -0.328593 +vn -0.928495 -0.333506 0.163152 +vn -0.862911 -0.147649 0.483230 +vn 0.801141 0.079134 -0.593188 +vn -0.487472 -0.583026 -0.649922 +vn -0.719382 -0.151708 -0.677816 +vn -0.918424 -0.140019 -0.369945 +vn -0.987701 -0.086550 0.129978 +vn -0.884121 -0.044404 0.465102 +vn 0.804407 0.067415 -0.590197 +vn -0.601794 -0.283303 -0.746666 +vn -0.756035 0.248848 -0.605335 +vn -0.935301 0.212775 -0.282632 +vn -0.976867 0.133824 0.166753 +vn -0.877590 0.049898 0.476791 +vn 0.810999 0.054262 -0.582507 +vn -0.590533 0.500595 -0.632954 +vn -0.717277 0.486373 -0.498917 +vn -0.895657 0.404645 -0.184393 +vn -0.943510 0.251595 0.215583 +vn -0.863338 0.100070 0.494583 +vn 0.816828 0.033052 -0.575884 +vn -0.622181 0.495407 -0.606128 +vn 0.305063 0.740837 0.598376 +vn 0.108097 0.810297 0.575915 +vn 0.178533 0.713523 0.677450 +vn -0.196326 0.640767 0.742180 +vn -0.140599 0.571123 0.808710 +vn -0.506272 0.343059 0.791162 +vn -0.481643 0.329081 0.812220 +vn -0.671957 0.078188 0.736412 +vn -0.685629 0.098453 0.721244 +vn -0.746391 -0.013153 0.665365 +vn -0.312754 0.825800 0.469253 +vn 0.226600 0.827509 0.513627 +vn -0.115696 0.941649 0.316019 +vn -0.376385 0.766289 0.520676 +vn -0.622211 0.421674 0.659536 +vn -0.721458 0.109836 0.683645 +vn -0.743767 -0.027955 0.667837 +vn -0.001251 0.966521 0.256508 +vn -0.398022 0.916166 -0.046754 +vn -0.608875 0.770653 0.187964 +vn -0.773766 0.437574 0.458022 +vn -0.788141 0.102176 0.606922 +vn -0.584918 -0.058779 0.808954 +vn -0.297617 0.948363 -0.109470 +vn -0.762291 0.112308 -0.637410 +vn -0.908078 0.027039 -0.417859 +vn -0.974181 -0.191931 -0.118686 +vn -0.885250 -0.462874 0.045076 +vn 0.108097 -0.628437 -0.770287 +vn 0.111484 -0.991974 0.059542 +vn 0.085665 -0.991058 0.102023 +vn -0.694693 0.143132 -0.704886 +vn -0.127873 -0.949065 0.287851 +vn -0.533952 -0.791681 0.296762 +vn -0.753136 -0.636464 0.166173 +vn -0.002838 -0.644154 -0.764885 +vn 0.497726 -0.430586 0.752861 +vn 0.165593 -0.398602 0.902036 +vn -0.357982 -0.266305 0.894925 +vn -0.666982 -0.124607 0.734550 +vn 0.763817 0.074709 -0.641072 +vn 0.557848 -0.459914 0.690817 +vn 0.489090 -0.009369 0.872158 +vn 0.141697 -0.015137 0.989776 +vn -0.362529 -0.012940 0.931852 +vn -0.663869 -0.018494 0.747581 +vn 0.762780 0.062502 -0.643605 +vn 0.596301 -0.142186 0.790033 +vn 0.374584 0.382000 0.844813 +vn 0.022004 0.325541 0.945250 +vn -0.414838 0.200018 0.887631 +vn -0.681906 0.072970 0.727775 +vn 0.758141 0.048006 -0.650288 +vn 0.419935 0.619617 0.663076 +vn 0.260475 0.601550 0.755150 +vn -0.079928 0.500717 0.861873 +vn -0.464095 0.308054 0.830470 +vn -0.699973 0.119327 0.704093 +vn 0.755120 0.025727 -0.655049 +vn 0.386670 0.614246 0.687857 +vn -0.797174 -0.603107 -0.026521 +vn -0.244301 -0.755242 -0.608173 +vn 0.250954 -0.962004 -0.107303 +vn -0.112033 -0.515458 0.849513 +vn 0.600024 -0.644642 0.473647 +vn 0.108371 -0.565691 -0.817438 +vn 0.871578 -0.463698 0.159001 +vn 0.153172 -0.253609 -0.955077 +vn 0.984649 -0.136814 0.108341 +vn 0.192694 -0.028748 -0.980804 +vn 0.995270 0.083193 0.049776 +vn 0.059358 0.501267 -0.863247 +vn 0.796503 0.598743 0.084140 +vn -0.371776 0.692984 -0.617664 +vn 0.433210 0.798486 0.417951 +vn -0.580859 0.677633 -0.450972 +vn 0.224006 0.783013 0.580218 +vn -0.743370 0.583178 -0.327494 +vn 0.075320 0.691855 0.718070 +vn -0.787133 0.522355 -0.327952 +vn 0.071963 0.637623 0.766930 +vn -0.818659 0.513230 -0.257607 +vn -0.003662 0.622639 0.782464 +vn -0.911527 0.376415 -0.165441 +vn -0.102359 0.487228 0.867244 +vn -0.980560 0.178625 -0.081088 +vn -0.182897 0.289376 0.939573 +vn -0.523942 -0.729637 0.439375 +vn -0.776849 -0.229896 0.586200 +vn -0.699820 -0.676443 0.229469 +vn -0.117740 -0.979553 0.162999 +vn -0.408979 -0.893521 -0.185186 +vn 0.164525 -0.985473 -0.041627 +vn -0.152776 -0.891842 -0.425672 +vn 0.689962 -0.561754 -0.456435 +vn 0.454360 -0.492691 -0.742149 +vn 0.777703 0.233924 -0.583453 +vn -0.864254 -0.495743 0.085330 +vn -0.681845 -0.595752 -0.424390 +vn -0.450972 -0.565142 -0.690786 +vn 0.231727 -0.250313 -0.940001 +vn -0.972015 -0.229987 0.047243 +vn -0.859523 -0.156987 -0.486312 +vn -0.646535 -0.082919 -0.758324 +vn 0.085025 0.109104 -0.990356 +vn -0.990478 0.048311 0.128666 +vn -0.887539 0.300302 -0.349345 +vn -0.679220 0.417493 -0.603565 +vn 0.060488 0.482131 -0.873989 +vn -0.915403 0.260872 0.306497 +vn -0.761162 0.646199 -0.054811 +vn -0.543809 0.792535 -0.275918 +vn 0.161473 0.760338 -0.629109 +vn -0.769860 0.352367 0.532090 +vn -0.521287 0.792932 0.315378 +vn -0.284402 0.949736 0.130772 +vn 0.353923 0.876370 -0.326548 +vn -0.592029 0.299966 0.747978 +vn -0.230628 0.706900 0.668630 +vn 0.032563 0.856044 0.515854 +vn 0.588946 0.807154 -0.040101 +vn -0.427168 0.113987 0.896939 +vn 0.038881 0.404797 0.913541 +vn 0.329691 0.528428 0.782311 +vn 0.810205 0.564165 0.158971 +vn 0.777703 0.233955 -0.583422 +vn -0.320933 -0.157964 0.933805 +vn 0.213782 -0.038301 0.976104 +vn 0.524552 0.045381 0.850154 +vn 0.956145 0.204260 0.209815 +vn -0.304483 -0.437086 0.846278 +vn 0.242317 -0.495590 0.834040 +vn 0.557573 -0.454939 0.694327 +vn 0.981292 -0.168584 0.092654 +vn -0.379955 -0.644246 0.663717 +vn 0.119327 -0.837092 0.533830 +vn 0.423261 -0.829066 0.365337 +vn 0.881680 -0.446150 -0.153417 +vn -0.488205 -0.725425 0.485153 +vn -0.733879 -0.224799 0.640980 +vn -0.678182 -0.676565 0.286843 +vn -0.099948 -0.977447 0.185858 +vn -0.414655 -0.898648 -0.143132 +vn 0.167852 -0.985076 -0.037324 +vn -0.175298 -0.899380 -0.400403 +vn 0.661214 -0.565142 -0.493301 +vn 0.406384 -0.501968 -0.763451 +vn 0.734886 0.228889 -0.638356 +vn -0.853175 -0.499100 0.151402 +vn -0.705008 -0.606250 -0.367931 +vn -0.492904 -0.578600 -0.649770 +vn 0.169286 -0.264016 -0.949522 +vn -0.965056 -0.234626 0.116550 +vn -0.889401 -0.169530 -0.424482 +vn -0.695791 -0.098636 -0.711417 +vn 0.017121 0.093722 -0.995422 +vn -0.979827 0.044832 0.194708 +vn -0.911100 0.289743 -0.293100 +vn -0.721244 0.404004 -0.562609 +vn -0.001923 0.468429 -0.883480 +vn 0.734916 0.228889 -0.638356 +vn -0.894284 0.260659 0.363689 +vn -0.767388 0.641011 -0.013215 +vn -0.566454 0.784967 -0.250771 +vn 0.113529 0.751061 -0.650380 +vn -0.734428 0.356548 0.577441 +vn -0.504013 0.794977 0.337565 +vn -0.281198 0.950102 0.134922 +vn 0.325205 0.873012 -0.363384 +vn -0.542070 0.308603 0.781579 +vn -0.189550 0.716208 0.671590 +vn 0.061708 0.864345 0.499069 +vn 0.579547 0.809656 -0.092471 +vn 0.734886 0.228858 -0.638356 +vn -0.366283 0.125919 0.921934 +vn 0.097873 0.419568 0.902402 +vn 0.378338 0.542711 0.749840 +vn 0.815332 0.571123 0.094913 +vn -0.255989 -0.144780 0.955748 +vn 0.279550 -0.021516 0.959868 +vn 0.580523 0.061892 0.811853 +vn 0.966765 0.212897 0.141392 +vn -0.243629 -0.425153 0.871670 +vn 0.301462 -0.480850 0.823328 +vn 0.606250 -0.440687 0.661977 +vn 0.986419 -0.161626 0.028596 +vn -0.329936 -0.635670 0.697867 +vn 0.160710 -0.827784 0.537492 +vn 0.452467 -0.820734 0.348704 +vn 0.872219 -0.443617 -0.205817 +vn -0.279611 -0.239448 0.929746 +vn -0.728965 -0.331675 0.598804 +vn -0.241798 -0.437696 0.865963 +vn 0.251595 -0.073305 0.965026 +vn 0.314890 -0.405164 0.858272 +vn 0.554064 0.045930 0.831172 +vn 0.623554 -0.318369 0.713981 +vn 0.945769 0.279214 0.165960 +vn 0.996704 0.012146 0.080050 +vn 0.728965 0.331675 -0.598804 +vn 0.728965 0.331675 -0.598773 +vn -0.260384 -0.611774 0.746940 +vn 0.283761 -0.696493 0.659017 +vn 0.589404 -0.638203 0.495224 +vn 0.971679 -0.222236 -0.080233 +vn -0.332560 -0.735099 0.590747 +vn 0.162969 -0.902921 0.397626 +vn 0.456801 -0.864834 0.208258 +vn 0.874447 -0.388348 -0.290597 +vn -0.447310 -0.788965 0.421186 +vn -0.029084 -0.993042 0.113865 +vn 0.245918 -0.963744 -0.103214 +vn 0.719901 -0.460891 -0.518937 +vn -0.587207 -0.765099 0.264107 +vn -0.263222 -0.953124 -0.149022 +vn -0.011078 -0.919919 -0.391858 +vn 0.531480 -0.428755 -0.730522 +vn 0.728965 0.331706 -0.598804 +vn -0.730918 -0.667196 0.143406 +vn -0.503769 -0.789239 -0.351085 +vn -0.275155 -0.740013 -0.613666 +vn 0.337901 -0.296884 -0.893094 +vn -0.856594 -0.510117 0.077425 +vn -0.714072 -0.526353 -0.461501 +vn -0.506058 -0.451430 -0.734886 +vn 0.168676 -0.085330 -0.981964 +vn -0.945067 -0.317820 0.076235 +vn -0.862178 -0.204505 -0.463485 +vn -0.668630 -0.098056 -0.737083 +vn 0.049501 0.173650 -0.983551 +vn -0.982879 -0.119541 0.140019 +vn -0.925474 0.127354 -0.356700 +vn -0.738121 0.266243 -0.619861 +vn -0.001404 0.440687 -0.897641 +vn -0.964293 0.054506 0.259072 +vn -0.894345 0.418653 -0.157476 +vn -0.703970 0.586077 -0.401135 +vn 0.023591 0.675130 -0.737297 +vn 0.728935 0.331706 -0.598804 +vn -0.892117 0.177862 0.415265 +vn -0.773553 0.625111 0.103916 +vn -0.571368 0.812708 -0.114170 +vn 0.120792 0.841243 -0.526933 +vn -0.777367 0.231697 0.584796 +vn -0.581469 0.715232 0.387677 +vn -0.360485 0.911618 0.197333 +vn 0.275369 0.913755 -0.298593 +vn -0.637471 0.207831 0.741874 +vn -0.347331 0.675314 0.650594 +vn -0.103458 0.867794 0.485977 +vn 0.463790 0.881649 -0.087039 +vn -0.493759 0.109928 0.862606 +vn -0.106815 0.511429 0.852626 +vn 0.160588 0.687887 0.707785 +vn 0.657338 0.749779 0.075533 +vn -0.368084 -0.047121 0.928587 +vn 0.103488 0.248543 0.963042 +vn 0.391491 0.399304 0.829005 +vn 0.826594 0.538224 0.164373 +vn 0.869930 0.207892 -0.447157 +vn 0.764183 0.197546 -0.613941 +vn 0.834101 0.302194 -0.461409 +vn 0.965789 0.207770 -0.155034 +vn 0.877438 0.440321 -0.190191 +vn 0.906308 0.209906 -0.366710 +vn 0.854885 0.345256 -0.387158 +vn 0.889004 0.209113 -0.407300 +vn 0.845332 0.324046 -0.424696 +vn 0.972869 0.189856 0.131993 +vn 0.842891 0.532029 0.080264 +vn 0.805780 0.125584 0.578692 +vn 0.631306 0.584796 0.509323 +vn 0.701254 0.095614 0.706442 +vn 0.520554 0.571215 0.634571 +vn 0.775536 0.367412 -0.513291 +vn 0.733024 0.601154 -0.318217 +vn 0.770806 0.438887 -0.461684 +vn 0.773949 0.403546 -0.487960 +vn 0.630360 0.768731 -0.108066 +vn 0.346110 0.902432 0.256508 +vn 0.225166 0.900174 0.372753 +vn 0.709952 0.386090 -0.588977 +vn 0.571215 0.647175 -0.504776 +vn 0.676626 0.465712 -0.570299 +vn 0.693960 0.426313 -0.580187 +vn 0.392254 0.836482 -0.382641 +vn 0.026582 0.993347 -0.111942 +vn -0.105747 0.994324 -0.008850 +vn 0.654866 0.353191 -0.668111 +vn 0.435377 0.566088 -0.699942 +vn 0.597552 0.418500 -0.683920 +vn 0.626820 0.386212 -0.676656 +vn 0.192389 0.717124 -0.669820 +vn -0.241646 0.833186 -0.497330 +vn -0.383557 0.828486 -0.408002 +vn 0.625080 0.277566 -0.729514 +vn 0.361919 0.379589 -0.851405 +vn 0.554796 0.309915 -0.772057 +vn 0.590503 0.294046 -0.751518 +vn 0.084262 0.442701 -0.892666 +vn -0.386700 0.464888 -0.796411 +vn -0.533799 0.447035 -0.717765 +vn 0.628559 0.179479 -0.756737 +vn 0.370525 0.137669 -0.918546 +vn 0.559801 0.169073 -0.811151 +vn 0.594775 0.174444 -0.784722 +vn 0.096927 0.086673 -0.991485 +vn -0.369732 -0.012848 -0.929014 +vn -0.516221 -0.047761 -0.855098 +vn 0.664388 0.085177 -0.742485 +vn 0.458876 -0.094852 -0.883389 +vn 0.611225 0.033723 -0.790704 +vn 0.638417 0.059511 -0.767357 +vn 0.226936 -0.255470 -0.939787 +vn -0.195257 -0.472060 -0.859645 +vn -0.335521 -0.523392 -0.783227 +vn 0.722953 0.019959 -0.690573 +vn 0.603290 -0.255684 -0.755394 +vn 0.695303 -0.059877 -0.716178 +vn 0.709830 -0.019990 -0.704062 +vn 0.439467 -0.492141 -0.751396 +vn 0.089908 -0.789697 -0.606830 +vn -0.040132 -0.852351 -0.521409 +vn 0.788568 0.001282 -0.614917 +vn 0.765099 -0.301706 -0.568804 +vn 0.789483 -0.086673 -0.607562 +vn 0.789788 -0.042726 -0.611835 +vn 0.677572 -0.559893 -0.476852 +vn 0.409467 -0.880612 -0.238350 +vn 0.290780 -0.946501 -0.139775 +vn 0.843623 0.034150 -0.535783 +vn 0.900937 -0.220618 -0.373638 +vn 0.868557 -0.039460 -0.493973 +vn 0.856929 -0.002655 -0.515366 +vn 0.877438 -0.440565 -0.189642 +vn 0.677694 -0.720481 0.147008 +vn 0.568590 -0.780633 0.259346 +vn 0.873409 0.109806 -0.474380 +vn 0.974395 -0.034120 -0.222205 +vn 0.911313 0.069063 -0.405805 +vn 0.893246 0.089511 -0.440504 +vn 0.985534 -0.166112 0.033174 +vn 0.822748 -0.352153 0.446089 +vn 0.718833 -0.399182 0.569109 +vn 0.862636 0.241218 -0.444533 +vn 0.756767 0.231544 -0.611286 +vn 0.824213 0.334788 -0.456679 +vn 0.959288 0.237495 -0.152715 +vn 0.864498 0.468215 -0.182653 +vn 0.899197 0.242531 -0.364147 +vn 0.844020 0.376812 -0.381573 +vn 0.881771 0.242103 -0.404706 +vn 0.834925 0.356151 -0.419507 +vn 0.967681 0.213660 0.133854 +vn 0.828181 0.553178 0.089785 +vn 0.803674 0.135289 0.579455 +vn 0.616474 0.590899 0.520310 +vn 0.700339 0.099704 0.706778 +vn 0.506485 0.571612 0.645497 +vn 0.763726 0.399457 -0.507035 +vn 0.715354 0.627735 -0.306864 +vn 0.757195 0.469680 -0.453902 +vn 0.761193 0.435011 -0.480911 +vn 0.608722 0.787896 -0.092959 +vn 0.321940 0.905911 0.275033 +vn 0.201453 0.897855 0.391461 +vn 0.697409 0.417951 -0.582141 +vn 0.551836 0.673269 -0.492080 +vn 0.662008 0.496200 -0.561693 +vn 0.680380 0.457503 -0.572466 +vn 0.368084 0.854915 -0.365490 +vn -0.000977 0.995849 -0.090670 +vn -0.133000 0.991028 0.012665 +vn 0.643055 0.385266 -0.661824 +vn 0.417737 0.592669 -0.688620 +vn 0.583941 0.449263 -0.676107 +vn 0.614093 0.417676 -0.669637 +vn 0.170751 0.736290 -0.654714 +vn -0.265786 0.836665 -0.478835 +vn -0.407270 0.826136 -0.389294 +vn 0.615162 0.310160 -0.724784 +vn 0.348979 0.407514 -0.843867 +vn 0.543901 0.341472 -0.766472 +vn 0.580096 0.326151 -0.746361 +vn 0.069582 0.463820 -0.883175 +vn -0.401532 0.470992 -0.785394 +vn -0.547868 0.447432 -0.706809 +vn 0.621265 0.212806 -0.754112 +vn 0.364025 0.167394 -0.916196 +vn 0.552660 0.201697 -0.808588 +vn 0.587542 0.207465 -0.782128 +vn 0.091739 0.110477 -0.989624 +vn -0.371838 -0.003143 -0.928251 +vn -0.517106 -0.043641 -0.854762 +vn 0.659688 0.119236 -0.741966 +vn 0.458815 -0.063295 -0.886258 +vn 0.607837 0.067385 -0.791162 +vn 0.634388 0.093417 -0.767327 +vn 0.231208 -0.229011 -0.945555 +vn -0.184667 -0.458785 -0.869106 +vn -0.323252 -0.515549 -0.793512 +vn 0.720176 0.054567 -0.691610 +vn 0.607959 -0.222816 -0.762047 +vn 0.694662 -0.025422 -0.718863 +vn 0.708121 0.014557 -0.705924 +vn 0.450667 -0.463729 -0.762749 +vn 0.109836 -0.773766 -0.623829 +vn -0.018220 -0.841792 -0.539476 +vn 0.786493 0.036073 -0.616504 +vn 0.771477 -0.268349 -0.576830 +vn 0.789850 -0.051943 -0.611042 +vn 0.788934 -0.007935 -0.614368 +vn 0.691305 -0.530747 -0.490249 +vn 0.432783 -0.863735 -0.258095 +vn 0.316233 -0.934965 -0.160680 +vn 0.840877 0.068789 -0.536790 +vn 0.905576 -0.187750 -0.380291 +vn 0.867916 -0.005036 -0.496628 +vn 0.855251 0.031892 -0.517228 +vn 0.888638 -0.412152 -0.200995 +vn 0.697592 -0.704550 0.130039 +vn 0.590503 -0.770074 0.241279 +vn 0.868740 0.143864 -0.473861 +vn 0.974334 -0.002594 -0.225043 +vn 0.907956 0.102756 -0.406262 +vn 0.889218 0.123417 -0.440474 +vn 0.989807 -0.139653 0.027406 +vn 0.833369 -0.338878 0.436598 +vn 0.731101 -0.391369 0.558794 +vn 0.862636 0.241218 -0.444502 +vn 0.899197 0.242500 -0.364147 +vn 0.506485 0.571612 0.645527 +vn 0.763726 0.399487 -0.507035 +vn 0.757195 0.469680 -0.453871 +vn 0.697439 0.417951 -0.582141 +vn -0.133000 0.991028 0.012696 +vn 0.583911 0.449263 -0.676107 +vn 0.348979 0.407483 -0.843867 +vn 0.543931 0.341472 -0.766472 +vn -0.401532 0.470992 -0.785424 +vn 0.091708 0.110477 -0.989624 +vn 0.659719 0.119236 -0.741966 +vn 0.694662 -0.025452 -0.718863 +vn 0.109836 -0.773797 -0.623829 +vn 0.786493 0.036103 -0.616504 +vn 0.771477 -0.268349 -0.576861 +vn 0.840877 0.068789 -0.536821 +vn 0.855220 0.031892 -0.517228 +vn 0.907956 0.102725 -0.406262 +vn 0.731101 -0.391369 0.558824 +vn 0.841060 0.204260 -0.500870 +vn 0.784539 0.059572 -0.617145 +vn 0.798791 0.241432 -0.550981 +vn 0.865413 0.414045 -0.282052 +vn 0.760613 0.506211 -0.406415 +vn 0.723441 0.675710 0.141453 +vn 0.536637 0.839961 -0.080142 +vn 0.548235 0.746971 0.376080 +vn 0.335978 0.933622 0.124271 +vn 0.752129 0.250740 -0.609424 +vn 0.644826 0.529283 -0.551347 +vn 0.330332 0.881069 -0.338450 +vn 0.101566 0.980316 -0.169195 +vn 0.708152 0.230750 -0.667257 +vn 0.535752 0.479720 -0.694845 +vn 0.135899 0.792749 -0.594165 +vn -0.119327 0.879971 -0.459731 +vn 0.673544 0.184545 -0.715720 +vn 0.449904 0.365093 -0.814997 +vn -0.017029 0.588488 -0.808313 +vn -0.293130 0.647877 -0.703055 +vn 0.653584 0.119144 -0.747368 +vn 0.400433 0.202857 -0.893582 +vn -0.105197 0.299326 -0.948302 +vn -0.393292 0.319315 -0.862148 +vn 0.651326 0.044496 -0.757439 +vn 0.394848 0.017670 -0.918546 +vn -0.115177 -0.030641 -0.992859 +vn -0.404645 -0.055605 -0.912748 +vn 0.667104 -0.028016 -0.744407 +vn 0.433973 -0.162206 -0.886196 +vn -0.045442 -0.351268 -0.935148 +vn -0.325419 -0.419904 -0.847194 +vn 0.698508 -0.087374 -0.710196 +vn 0.511856 -0.309458 -0.801355 +vn 0.093356 -0.613666 -0.783990 +vn -0.167669 -0.718070 -0.675436 +vn 0.740776 -0.124516 -0.660085 +vn 0.616688 -0.401624 -0.677023 +vn 0.280160 -0.777917 -0.562395 +vn 0.044557 -0.904721 -0.423658 +vn 0.787439 -0.133824 -0.601642 +vn 0.732444 -0.424696 -0.532060 +vn 0.486465 -0.819056 -0.304086 +vn 0.278970 -0.951415 -0.130131 +vn 0.831416 -0.113834 -0.543809 +vn 0.841578 -0.375134 -0.388592 +vn 0.680929 -0.730735 -0.048372 +vn 0.499893 -0.851070 0.160375 +vn 0.866024 -0.067629 -0.495376 +vn 0.927396 -0.260506 -0.268410 +vn 0.833857 -0.526444 0.165746 +vn 0.673696 -0.618976 0.403699 +vn 0.885983 -0.002228 -0.463698 +vn 0.976867 -0.098239 -0.189856 +vn 0.922025 -0.237312 0.305765 +vn 0.773888 -0.290414 0.562761 +vn 0.888241 0.072390 -0.453627 +vn 0.982452 0.086886 -0.164861 +vn 0.932005 0.092654 0.350291 +vn 0.785211 0.084506 0.613392 +vn 0.872463 0.144902 -0.466659 +vn 0.943327 0.266793 -0.197241 +vn 0.862270 0.413282 0.292611 +vn 0.705985 0.448805 0.547838 +vn 0.841060 0.204291 -0.500870 +vn 0.784570 0.059572 -0.617145 +vn 0.760613 0.506211 -0.406384 +vn 0.723441 0.675680 0.141423 +vn 0.336009 0.933622 0.124271 +vn 0.535722 0.479720 -0.694845 +vn 0.135899 0.792749 -0.594134 +vn -0.016999 0.588488 -0.808313 +vn -0.293100 0.647877 -0.703055 +vn 0.400433 0.202857 -0.893551 +vn 0.651326 0.044496 -0.757469 +vn 0.394818 0.017670 -0.918577 +vn -0.045442 -0.351238 -0.935148 +vn 0.093387 -0.613666 -0.783990 +vn 0.280160 -0.777947 -0.562395 +vn 0.486496 -0.819056 -0.304056 +vn 0.279000 -0.951415 -0.130131 +vn 0.841578 -0.375134 -0.388562 +vn 0.499924 -0.851070 0.160375 +vn 0.866024 -0.067629 -0.495346 +vn 0.976867 -0.098270 -0.189856 +vn 0.922056 -0.237281 0.305765 +vn 0.982452 0.086886 -0.164830 +vn 0.932035 0.092685 0.350291 +vn 0.785241 0.084506 0.613392 +vn 0.872463 0.144932 -0.466659 +vn 0.943327 0.266793 -0.197211 +vn 0.862300 0.413282 0.292611 +vn 0.705985 0.448805 0.547807 +vn -0.602557 -0.161321 -0.781579 +vn 0.115879 -0.991913 0.051546 +vn 0.569872 -0.461409 0.679922 +vn 0.613330 -0.220466 0.758415 +vn 0.618824 -0.013581 0.785363 +vn 0.597156 0.195227 0.777978 +vn 0.547441 0.400739 0.734611 +vn 0.291025 0.843501 0.451399 +vn -0.326334 0.885983 -0.329356 +vn 0.618976 -0.017457 0.785180 +vn 0.066836 -0.997681 -0.011322 +vn -0.473830 -0.584338 -0.658773 +vn -0.560137 -0.358684 -0.746696 +vn -0.603107 -0.157506 -0.781915 +vn -0.619861 0.051881 -0.782983 +vn -0.608539 0.264595 -0.748070 +vn -0.438063 0.757622 -0.483779 +vn 0.158361 0.943083 0.292367 +vn -0.298898 -0.455184 0.838710 +vn -0.785272 -0.055574 0.616627 +vn -0.454390 -0.633290 0.626423 +vn 0.329417 -0.651906 0.682974 +vn 0.086978 -0.932493 0.350475 +vn 0.897397 -0.441145 0.003815 +vn 0.716025 -0.653005 -0.246620 +vn -0.653432 -0.658773 0.372845 +vn -0.224281 -0.973388 -0.046602 +vn 0.481399 -0.685232 -0.546495 +vn -0.843684 -0.517258 0.143559 +vn -0.521531 -0.751701 -0.403577 +vn 0.255623 -0.517869 -0.816340 +vn -0.969604 -0.244484 0.005127 +vn -0.717399 -0.325297 -0.616016 +vn 0.106540 -0.194739 -0.975036 +vn -0.996765 0.080172 -0.004120 +vn -0.758629 0.180090 -0.626087 +vn 0.074801 0.186163 -0.979644 +vn -0.922208 0.369335 0.114292 +vn -0.642232 0.628254 -0.439070 +vn 0.161504 0.522233 -0.837336 +vn -0.766472 0.551256 0.329508 +vn -0.400708 0.910184 -0.104678 +vn 0.342265 0.734306 -0.586200 +vn -0.566881 0.576373 0.588549 +vn -0.091281 0.950774 0.296030 +vn 0.575640 0.766411 -0.284951 +vn 0.784570 0.059542 -0.617145 +vn -0.376293 0.430647 0.820307 +vn 0.205054 0.727439 0.654775 +vn 0.800806 0.598712 -0.014435 +vn -0.250587 0.154088 0.955718 +vn 0.401807 0.299661 0.865291 +vn 0.950530 0.275399 0.143498 +vn -0.224036 -0.170202 0.959593 +vn 0.444899 -0.205390 0.871700 +vn 0.983520 -0.105411 0.146764 +vn -0.298898 -0.455153 0.838710 +vn -0.454360 -0.633290 0.626453 +vn 0.897427 -0.441115 0.003815 +vn 0.716056 -0.653005 -0.246651 +vn 0.478042 0.346324 -0.807154 +vn 0.590289 0.472304 -0.654561 +vn 0.786279 0.049104 -0.615894 +vn -0.653401 -0.658773 0.372845 +vn 0.732505 0.487350 -0.475265 +vn 0.866543 0.386975 -0.315104 +vn 0.106510 -0.194739 -0.975036 +vn 0.956420 0.196387 -0.216041 +vn -0.996765 0.080203 -0.004120 +vn -0.758660 0.180090 -0.626057 +vn 0.074770 0.186193 -0.979644 +vn 0.977935 -0.034547 -0.205969 +vn -0.922208 0.369366 0.114322 +vn 0.161473 0.522233 -0.837367 +vn 0.925565 -0.243690 -0.289712 +vn -0.766472 0.551256 0.329539 +vn 0.342235 0.734306 -0.586200 +vn 0.813379 -0.373730 -0.445723 +vn -0.566851 0.576373 0.588549 +vn 0.671163 -0.388348 -0.631397 +vn -0.376263 0.430647 0.820307 +vn 0.205023 0.727439 0.654775 +vn 0.800806 0.598743 -0.014435 +vn 0.537034 -0.283303 -0.794519 +vn 0.950530 0.275369 0.143498 +vn 0.447127 -0.088626 -0.890042 +vn 0.444899 -0.205390 0.871670 +vn 0.983520 -0.105411 0.146733 +vn 0.425611 0.141789 -0.893704 +s 1 +f 1204/1/1 1236/2/2 1176/3/3 +f 1132/4/4 1176/3/3 1177/5/5 +f 1131/6/6 1177/5/5 980/7/7 +f 980/7/7 448/8/8 466/9/9 +f 940/10/10 980/7/7 466/9/9 +f 466/9/9 448/8/8 175/11/11 +f 223/12/12 175/11/11 174/13/13 +f 224/14/14 174/13/13 117/15/15 +f 1204/1/1 1176/3/3 1132/4/4 +f 1132/4/4 1177/5/5 1131/6/6 +f 1131/6/6 980/7/7 940/10/10 +f 466/9/9 175/11/11 223/12/12 +f 223/12/12 174/13/13 224/14/14 +f 224/14/14 117/15/15 148/16/16 +f 1260/17/17 1208/18/18 1238/19/19 +f 1253/20/20 1109/21/21 1208/18/18 +f 1183/22/22 979/23/23 1109/21/21 +f 1013/24/24 868/25/25 979/23/23 +f 889/26/26 760/27/27 868/25/25 +f 760/27/27 580/28/28 593/29/29 +f 773/30/30 580/28/28 760/27/27 +f 580/28/28 487/31/31 593/29/29 +f 464/32/32 378/33/33 487/31/31 +f 341/34/34 247/35/35 378/33/33 +f 170/36/36 144/37/37 247/35/35 +f 102/38/38 119/39/39 144/37/37 +f 119/39/39 1260/17/17 1238/19/19 +f 95/40/40 1260/17/17 119/39/39 +f 1260/17/17 1253/20/20 1208/18/18 +f 1253/20/20 1183/22/22 1109/21/21 +f 1183/22/22 1013/24/24 979/23/23 +f 1013/24/24 889/26/26 868/25/25 +f 889/26/26 773/30/30 760/27/27 +f 580/28/28 464/32/32 487/31/31 +f 464/32/32 341/34/34 378/33/33 +f 341/34/34 170/36/36 247/35/35 +f 170/36/36 102/38/38 144/37/37 +f 102/38/38 95/40/40 119/39/39 +f 1237/41/41 1207/42/42 661/43/43 +f 1237/41/41 1253/20/20 1260/17/17 +f 697/44/44 696/45/45 1253/20/20 +f 1260/17/17 697/44/44 1253/20/20 +f 1207/42/42 1108/46/46 661/43/43 +f 1207/42/42 1183/22/22 1253/20/20 +f 696/45/45 695/47/47 1183/22/22 +f 1253/20/20 696/45/45 1183/22/22 +f 1108/46/46 978/48/48 661/43/43 +f 1108/46/46 1013/24/24 1183/22/22 +f 695/47/47 694/49/49 1013/24/24 +f 1183/22/22 695/47/47 1013/24/24 +f 978/48/48 867/50/50 661/43/43 +f 978/48/48 889/26/26 1013/24/24 +f 694/49/49 693/51/51 889/26/26 +f 1013/24/24 694/49/49 889/26/26 +f 867/50/50 759/52/52 661/43/43 +f 867/50/50 773/30/30 889/26/26 +f 693/51/51 690/53/53 773/30/30 +f 889/26/26 693/51/51 773/30/30 +f 759/52/52 592/54/54 661/43/43 +f 773/30/30 592/54/54 580/28/28 +f 759/52/52 592/54/54 773/30/30 +f 690/53/53 668/55/55 580/28/28 +f 773/30/30 580/28/28 690/53/53 +f 592/54/54 486/56/56 661/43/43 +f 592/54/54 464/32/32 580/28/28 +f 580/28/28 464/32/32 668/55/55 +f 486/56/56 377/57/57 661/43/43 +f 486/56/56 341/34/34 464/32/32 +f 464/32/32 668/55/55 341/34/34 +f 377/57/57 246/58/58 661/43/43 +f 377/57/57 170/36/36 341/34/34 +f 341/34/34 668/55/55 170/36/36 +f 246/58/58 143/59/59 661/43/43 +f 246/58/58 102/38/38 170/36/36 +f 170/36/36 668/55/55 102/38/38 +f 143/59/59 118/60/60 661/43/43 +f 143/59/59 95/40/40 102/38/38 +f 102/38/38 668/55/55 95/40/40 +f 118/60/60 117/15/15 661/43/43 +f 118/60/60 95/40/40 94/61/61 +f 95/40/40 668/55/55 94/61/61 +f 117/15/15 142/62/62 661/43/43 +f 117/15/15 94/61/61 101/63/63 +f 94/61/61 668/55/55 101/63/63 +f 142/62/62 245/64/64 661/43/43 +f 142/62/62 101/63/63 169/65/65 +f 101/63/63 668/55/55 169/65/65 +f 245/64/64 376/66/66 661/43/43 +f 245/64/64 169/65/65 340/67/67 +f 169/65/65 668/55/55 340/67/67 +f 376/66/66 485/68/68 661/43/43 +f 376/66/66 340/67/67 463/69/69 +f 340/67/67 668/55/55 463/69/69 +f 485/68/68 591/70/70 661/43/43 +f 485/68/68 463/69/69 579/71/71 +f 463/69/69 668/55/55 579/71/71 +f 591/70/70 647/72/72 661/43/43 +f 591/70/70 579/71/71 646/73/73 +f 579/71/71 668/55/55 646/73/73 +f 647/72/72 758/74/74 661/43/43 +f 647/72/72 646/73/73 772/75/75 +f 668/55/55 690/53/53 772/75/75 +f 646/73/73 668/55/55 772/75/75 +f 758/74/74 866/76/76 661/43/43 +f 758/74/74 772/75/75 888/77/77 +f 690/53/53 693/51/51 888/77/77 +f 772/75/75 690/53/53 888/77/77 +f 866/76/76 977/78/78 661/43/43 +f 866/76/76 888/77/77 1012/79/79 +f 693/51/51 694/49/49 1012/79/79 +f 888/77/77 693/51/51 1012/79/79 +f 977/78/78 1107/80/80 661/43/43 +f 977/78/78 1012/79/79 1182/81/81 +f 694/49/49 695/47/47 1182/81/81 +f 1012/79/79 694/49/49 1182/81/81 +f 1107/80/80 1206/82/82 661/43/43 +f 1107/80/80 1182/81/81 1252/83/83 +f 695/47/47 696/45/45 1252/83/83 +f 1182/81/81 695/47/47 1252/83/83 +f 1206/82/82 1236/2/2 661/43/43 +f 1206/82/82 1252/83/83 1259/84/84 +f 696/45/45 697/44/44 1259/84/84 +f 1252/83/83 696/45/45 1259/84/84 +f 1236/2/2 1237/41/41 661/43/43 +f 1236/2/2 1259/84/84 1260/17/17 +f 1259/84/84 697/44/44 1260/17/17 +f 1237/41/41 1253/20/20 1207/42/42 +f 1207/42/42 1183/22/22 1108/46/46 +f 1108/46/46 1013/24/24 978/48/48 +f 978/48/48 889/26/26 867/50/50 +f 867/50/50 773/30/30 759/52/52 +f 592/54/54 486/56/56 464/32/32 +f 486/56/56 377/57/57 341/34/34 +f 377/57/57 246/58/58 170/36/36 +f 246/58/58 143/59/59 102/38/38 +f 143/59/59 118/60/60 95/40/40 +f 118/60/60 117/15/15 94/61/61 +f 117/15/15 101/63/63 142/62/62 +f 142/62/62 169/65/65 245/64/64 +f 245/64/64 340/67/67 376/66/66 +f 376/66/66 463/69/69 485/68/68 +f 485/68/68 579/71/71 591/70/70 +f 591/70/70 646/73/73 647/72/72 +f 647/72/72 772/75/75 758/74/74 +f 758/74/74 888/77/77 866/76/76 +f 866/76/76 1012/79/79 977/78/78 +f 977/78/78 1182/81/81 1107/80/80 +f 1107/80/80 1252/83/83 1206/82/82 +f 1206/82/82 1259/84/84 1236/2/2 +f 1236/2/2 1260/17/17 1237/41/41 +f 777/85/85 659/86/86 766/87/87 +f 777/85/85 824/88/88 835/89/89 +f 835/89/89 924/90/90 945/91/91 +f 945/91/91 1030/92/92 1068/93/93 +f 1068/93/93 1067/94/94 1129/95/95 +f 1129/95/95 1117/96/96 1163/97/97 +f 1163/97/97 1155/98/98 1200/99/99 +f 1200/99/99 1160/100/100 1203/101/101 +f 1203/101/101 1161/102/102 1205/103/103 +f 1205/103/103 660/104/104 1161/102/102 +f 766/87/87 659/86/86 734/105/105 +f 766/87/87 789/106/106 824/88/88 +f 824/88/88 846/107/107 924/90/90 +f 924/90/90 895/108/108 1030/92/92 +f 1030/92/92 906/109/109 1067/94/94 +f 1067/94/94 917/110/110 1117/96/96 +f 1117/96/96 931/111/111 1155/98/98 +f 1155/98/98 937/112/112 1160/100/100 +f 1160/100/100 1161/102/102 938/113/113 +f 1161/102/102 660/104/104 938/113/113 +f 734/105/105 659/86/86 701/114/114 +f 734/105/105 708/115/115 789/106/106 +f 789/106/106 731/116/116 846/107/107 +f 846/107/107 738/117/117 895/108/108 +f 895/108/108 743/118/118 906/109/109 +f 906/109/109 746/119/119 917/110/110 +f 917/110/110 752/120/120 931/111/111 +f 931/111/111 754/121/121 937/112/112 +f 937/112/112 938/113/113 756/122/122 +f 938/113/113 660/104/104 756/122/122 +f 701/114/114 659/86/86 645/123/123 +f 708/115/115 645/123/123 641/124/124 +f 701/114/114 645/123/123 708/115/115 +f 731/116/116 641/124/124 632/125/125 +f 708/115/115 641/124/124 731/116/116 +f 738/117/117 632/125/125 611/126/126 +f 731/116/116 632/125/125 738/117/117 +f 743/118/118 611/126/126 606/127/127 +f 738/117/117 611/126/126 743/118/118 +f 746/119/119 606/127/127 604/128/128 +f 743/118/118 606/127/127 746/119/119 +f 752/120/120 604/128/128 599/129/129 +f 746/119/119 604/128/128 752/120/120 +f 754/121/121 599/129/129 596/130/130 +f 752/120/120 599/129/129 754/121/121 +f 756/122/122 597/131/131 596/130/130 +f 754/121/121 756/122/122 596/130/130 +f 756/122/122 660/104/104 597/131/131 +f 645/123/123 659/86/86 630/132/132 +f 645/123/123 566/133/133 641/124/124 +f 641/124/124 507/134/134 632/125/125 +f 632/125/125 459/135/135 611/126/126 +f 611/126/126 445/136/136 606/127/127 +f 606/127/127 435/137/137 604/128/128 +f 604/128/128 420/138/138 599/129/129 +f 599/129/129 596/130/130 414/139/139 +f 596/130/130 597/131/131 415/140/140 +f 597/131/131 660/104/104 415/140/140 +f 630/132/132 659/86/86 587/141/141 +f 630/132/132 529/142/142 566/133/133 +f 566/133/133 427/143/143 507/134/134 +f 507/134/134 320/144/144 459/135/135 +f 459/135/135 288/145/145 445/136/136 +f 445/136/136 235/146/146 435/137/137 +f 435/137/137 197/147/147 420/138/138 +f 420/138/138 414/139/139 190/148/148 +f 414/139/139 415/140/140 191/149/149 +f 415/140/140 660/104/104 191/149/149 +f 587/141/141 659/86/86 578/150/150 +f 587/141/141 525/151/151 529/142/142 +f 529/142/142 408/152/152 427/143/143 +f 427/143/143 286/153/153 320/144/144 +f 320/144/144 221/154/154 288/145/145 +f 288/145/145 187/155/155 235/146/146 +f 235/146/146 154/156/156 197/147/147 +f 197/147/147 146/157/157 190/148/148 +f 190/148/148 147/158/158 191/149/149 +f 191/149/149 660/104/104 147/158/158 +f 578/150/150 659/86/86 577/159/159 +f 578/150/150 524/160/160 525/151/151 +f 525/151/151 409/161/161 408/152/152 +f 408/152/152 287/162/162 286/153/153 +f 286/153/153 222/163/163 221/154/154 +f 221/154/154 188/164/164 187/155/155 +f 187/155/155 153/165/165 154/156/156 +f 154/156/156 145/166/166 146/157/157 +f 147/158/158 145/166/166 148/16/16 +f 146/157/157 145/166/166 147/158/158 +f 147/158/158 148/16/16 660/104/104 +f 577/159/159 659/86/86 586/167/167 +f 577/159/159 530/168/168 524/160/160 +f 524/160/160 428/169/169 409/161/161 +f 409/161/161 321/170/170 287/162/162 +f 287/162/162 289/171/171 222/163/163 +f 222/163/163 236/172/172 188/164/164 +f 188/164/164 196/173/173 153/165/165 +f 153/165/165 189/174/174 145/166/166 +f 145/166/166 192/175/175 148/16/16 +f 148/16/16 192/175/175 660/104/104 +f 586/167/167 659/86/86 629/176/176 +f 586/167/167 567/177/177 530/168/168 +f 530/168/168 508/178/178 428/169/169 +f 428/169/169 460/179/179 321/170/170 +f 321/170/170 446/180/180 289/171/171 +f 289/171/171 436/181/181 236/172/172 +f 236/172/172 419/182/182 196/173/173 +f 196/173/173 413/183/183 189/174/174 +f 189/174/174 416/184/184 192/175/175 +f 192/175/175 416/184/184 660/104/104 +f 629/176/176 659/86/86 638/185/185 +f 629/176/176 601/186/186 567/177/177 +f 567/177/177 554/187/187 508/178/178 +f 508/178/178 533/188/188 460/179/179 +f 460/179/179 526/189/189 446/180/180 +f 446/180/180 517/190/190 436/181/181 +f 436/181/181 504/191/191 419/182/182 +f 419/182/182 500/192/192 413/183/183 +f 413/183/183 501/193/193 416/184/184 +f 416/184/184 501/193/193 660/104/104 +f 638/185/185 659/86/86 644/194/194 +f 638/185/185 642/195/195 601/186/186 +f 601/186/186 633/196/196 554/187/187 +f 554/187/187 612/197/197 533/188/188 +f 533/188/188 607/198/198 526/189/189 +f 526/189/189 605/199/199 517/190/190 +f 517/190/190 598/200/200 504/191/191 +f 504/191/191 594/201/201 500/192/192 +f 500/192/192 595/202/202 501/193/193 +f 501/193/193 595/202/202 660/104/104 +f 644/194/194 659/86/86 658/203/203 +f 642/195/195 658/203/203 657/204/204 +f 644/194/194 658/203/203 642/195/195 +f 633/196/196 657/204/204 656/205/205 +f 642/195/195 657/204/204 633/196/196 +f 612/197/197 656/205/205 655/206/206 +f 633/196/196 656/205/205 612/197/197 +f 607/198/198 655/206/206 654/207/207 +f 612/197/197 655/206/206 607/198/198 +f 607/198/198 653/208/208 605/199/199 +f 605/199/199 652/209/209 598/200/200 +f 594/201/201 652/209/209 649/210/210 +f 598/200/200 652/209/209 594/201/201 +f 594/201/201 651/211/211 595/202/202 +f 595/202/202 651/211/211 660/104/104 +f 658/203/203 659/86/86 700/212/212 +f 657/204/204 700/212/212 709/213/213 +f 658/203/203 700/212/212 657/204/204 +f 656/205/205 709/213/213 730/214/214 +f 657/204/204 709/213/213 656/205/205 +f 655/206/206 730/214/214 739/215/215 +f 656/205/205 730/214/214 655/206/206 +f 654/207/207 739/215/215 744/216/216 +f 655/206/206 739/215/215 654/207/207 +f 654/207/207 745/217/217 653/208/208 +f 653/208/208 751/218/218 652/209/209 +f 649/210/210 751/218/218 753/219/219 +f 652/209/209 751/218/218 649/210/210 +f 649/210/210 755/220/220 651/211/211 +f 651/211/211 755/220/220 660/104/104 +f 700/212/212 659/86/86 720/221/221 +f 700/212/212 749/222/222 709/213/213 +f 709/213/213 801/223/223 730/214/214 +f 730/214/214 823/224/224 739/215/215 +f 739/215/215 828/225/225 744/216/216 +f 744/216/216 840/226/226 745/217/217 +f 745/217/217 850/227/227 751/218/218 +f 751/218/218 852/228/228 753/219/219 +f 753/219/219 853/229/229 755/220/220 +f 755/220/220 660/104/104 853/229/229 +f 720/221/221 659/86/86 733/230/230 +f 720/221/221 790/231/231 749/222/222 +f 749/222/222 847/232/232 801/223/223 +f 801/223/223 894/233/233 823/224/224 +f 823/224/224 907/234/234 828/225/225 +f 828/225/225 916/235/235 840/226/226 +f 840/226/226 930/236/236 850/227/227 +f 850/227/227 936/237/237 852/228/228 +f 852/228/228 853/229/229 939/238/238 +f 853/229/229 660/104/104 939/238/238 +f 733/230/230 659/86/86 765/239/239 +f 733/230/230 825/240/240 790/231/231 +f 790/231/231 923/241/241 847/232/232 +f 847/232/232 1031/242/242 894/233/233 +f 894/233/233 1066/243/243 907/234/234 +f 907/234/234 1116/244/244 916/235/235 +f 916/235/235 1154/245/245 930/236/236 +f 930/236/236 1159/246/246 936/237/237 +f 936/237/237 939/238/238 1162/247/247 +f 939/238/238 660/104/104 1162/247/247 +f 765/239/239 659/86/86 776/248/248 +f 765/239/239 834/249/249 825/240/240 +f 825/240/240 946/250/250 923/241/241 +f 923/241/241 1069/251/251 1031/242/242 +f 1031/242/242 1130/252/252 1066/243/243 +f 1066/243/243 1164/253/253 1116/244/244 +f 1116/244/244 1199/254/254 1154/245/245 +f 1154/245/245 1202/255/255 1159/246/246 +f 1159/246/246 1204/1/1 1162/247/247 +f 1162/247/247 660/104/104 1204/1/1 +f 776/248/248 659/86/86 777/85/85 +f 776/248/248 835/89/89 834/249/249 +f 834/249/249 945/91/91 946/250/250 +f 946/250/250 1068/93/93 1069/251/251 +f 1069/251/251 1129/95/95 1130/252/252 +f 1130/252/252 1163/97/97 1164/253/253 +f 1164/253/253 1200/99/99 1199/254/254 +f 1199/254/254 1203/101/101 1202/255/255 +f 1204/1/1 1205/103/103 1203/101/101 +f 1202/255/255 1203/101/101 1204/1/1 +f 1204/1/1 660/104/104 1205/103/103 +f 777/85/85 766/87/87 824/88/88 +f 835/89/89 824/88/88 924/90/90 +f 945/91/91 924/90/90 1030/92/92 +f 1068/93/93 1030/92/92 1067/94/94 +f 1129/95/95 1067/94/94 1117/96/96 +f 1163/97/97 1117/96/96 1155/98/98 +f 1200/99/99 1155/98/98 1160/100/100 +f 1203/101/101 1160/100/100 1161/102/102 +f 766/87/87 734/105/105 789/106/106 +f 824/88/88 789/106/106 846/107/107 +f 924/90/90 846/107/107 895/108/108 +f 1030/92/92 895/108/108 906/109/109 +f 1067/94/94 906/109/109 917/110/110 +f 1117/96/96 917/110/110 931/111/111 +f 1155/98/98 931/111/111 937/112/112 +f 1160/100/100 937/112/112 938/113/113 +f 734/105/105 701/114/114 708/115/115 +f 789/106/106 708/115/115 731/116/116 +f 846/107/107 731/116/116 738/117/117 +f 895/108/108 738/117/117 743/118/118 +f 906/109/109 743/118/118 746/119/119 +f 917/110/110 746/119/119 752/120/120 +f 931/111/111 752/120/120 754/121/121 +f 937/112/112 754/121/121 756/122/122 +f 645/123/123 630/132/132 566/133/133 +f 641/124/124 566/133/133 507/134/134 +f 632/125/125 507/134/134 459/135/135 +f 611/126/126 459/135/135 445/136/136 +f 606/127/127 445/136/136 435/137/137 +f 604/128/128 435/137/137 420/138/138 +f 599/129/129 420/138/138 414/139/139 +f 596/130/130 415/140/140 414/139/139 +f 630/132/132 587/141/141 529/142/142 +f 566/133/133 529/142/142 427/143/143 +f 507/134/134 427/143/143 320/144/144 +f 459/135/135 320/144/144 288/145/145 +f 445/136/136 288/145/145 235/146/146 +f 435/137/137 235/146/146 197/147/147 +f 420/138/138 197/147/147 190/148/148 +f 414/139/139 191/149/149 190/148/148 +f 587/141/141 578/150/150 525/151/151 +f 529/142/142 525/151/151 408/152/152 +f 427/143/143 408/152/152 286/153/153 +f 320/144/144 286/153/153 221/154/154 +f 288/145/145 221/154/154 187/155/155 +f 235/146/146 187/155/155 154/156/156 +f 197/147/147 154/156/156 146/157/157 +f 190/148/148 146/157/157 147/158/158 +f 578/150/150 577/159/159 524/160/160 +f 525/151/151 524/160/160 409/161/161 +f 408/152/152 409/161/161 287/162/162 +f 286/153/153 287/162/162 222/163/163 +f 221/154/154 222/163/163 188/164/164 +f 187/155/155 188/164/164 153/165/165 +f 154/156/156 153/165/165 145/166/166 +f 577/159/159 586/167/167 530/168/168 +f 524/160/160 530/168/168 428/169/169 +f 409/161/161 428/169/169 321/170/170 +f 287/162/162 321/170/170 289/171/171 +f 222/163/163 289/171/171 236/172/172 +f 188/164/164 236/172/172 196/173/173 +f 153/165/165 196/173/173 189/174/174 +f 145/166/166 189/174/174 192/175/175 +f 586/167/167 629/176/176 567/177/177 +f 530/168/168 567/177/177 508/178/178 +f 428/169/169 508/178/178 460/179/179 +f 321/170/170 460/179/179 446/180/180 +f 289/171/171 446/180/180 436/181/181 +f 236/172/172 436/181/181 419/182/182 +f 196/173/173 419/182/182 413/183/183 +f 189/174/174 413/183/183 416/184/184 +f 629/176/176 638/185/185 601/186/186 +f 567/177/177 601/186/186 554/187/187 +f 508/178/178 554/187/187 533/188/188 +f 460/179/179 533/188/188 526/189/189 +f 446/180/180 526/189/189 517/190/190 +f 436/181/181 517/190/190 504/191/191 +f 419/182/182 504/191/191 500/192/192 +f 413/183/183 500/192/192 501/193/193 +f 638/185/185 644/194/194 642/195/195 +f 601/186/186 642/195/195 633/196/196 +f 554/187/187 633/196/196 612/197/197 +f 533/188/188 612/197/197 607/198/198 +f 526/189/189 607/198/198 605/199/199 +f 517/190/190 605/199/199 598/200/200 +f 504/191/191 598/200/200 594/201/201 +f 500/192/192 594/201/201 595/202/202 +f 607/198/198 654/207/207 653/208/208 +f 605/199/199 653/208/208 652/209/209 +f 594/201/201 649/210/210 651/211/211 +f 654/207/207 744/216/216 745/217/217 +f 653/208/208 745/217/217 751/218/218 +f 649/210/210 753/219/219 755/220/220 +f 700/212/212 720/221/221 749/222/222 +f 709/213/213 749/222/222 801/223/223 +f 730/214/214 801/223/223 823/224/224 +f 739/215/215 823/224/224 828/225/225 +f 744/216/216 828/225/225 840/226/226 +f 745/217/217 840/226/226 850/227/227 +f 751/218/218 850/227/227 852/228/228 +f 753/219/219 852/228/228 853/229/229 +f 720/221/221 733/230/230 790/231/231 +f 749/222/222 790/231/231 847/232/232 +f 801/223/223 847/232/232 894/233/233 +f 823/224/224 894/233/233 907/234/234 +f 828/225/225 907/234/234 916/235/235 +f 840/226/226 916/235/235 930/236/236 +f 850/227/227 930/236/236 936/237/237 +f 852/228/228 936/237/237 939/238/238 +f 733/230/230 765/239/239 825/240/240 +f 790/231/231 825/240/240 923/241/241 +f 847/232/232 923/241/241 1031/242/242 +f 894/233/233 1031/242/242 1066/243/243 +f 907/234/234 1066/243/243 1116/244/244 +f 916/235/235 1116/244/244 1154/245/245 +f 930/236/236 1154/245/245 1159/246/246 +f 936/237/237 1159/246/246 1162/247/247 +f 765/239/239 776/248/248 834/249/249 +f 825/240/240 834/249/249 946/250/250 +f 923/241/241 946/250/250 1069/251/251 +f 1031/242/242 1069/251/251 1130/252/252 +f 1066/243/243 1130/252/252 1164/253/253 +f 1116/244/244 1164/253/253 1199/254/254 +f 1154/245/245 1199/254/254 1202/255/255 +f 1159/246/246 1202/255/255 1204/1/1 +f 776/248/248 777/85/85 835/89/89 +f 834/249/249 835/89/89 945/91/91 +f 946/250/250 945/91/91 1068/93/93 +f 1069/251/251 1068/93/93 1129/95/95 +f 1130/252/252 1129/95/95 1163/97/97 +f 1164/253/253 1163/97/97 1200/99/99 +f 1199/254/254 1200/99/99 1203/101/101 +f 698/256/256 870/257/257 699/258/258 +f 699/258/258 1033/259/259 702/260/260 +f 702/260/260 1062/261/261 703/262/262 +f 703/262/262 1125/263/263 704/264/264 +f 704/264/264 1178/265/265 705/266/266 +f 705/266/266 1234/267/267 707/268/268 +f 707/268/268 1271/269/269 712/270/270 +f 712/270/270 1297/271/271 719/272/272 +f 719/272/272 1301/273/273 725/274/274 +f 725/274/274 1308/275/275 727/276/276 +f 727/276/276 1306/277/277 726/278/278 +f 726/278/278 1306/277/277 662/279/279 +f 829/280/280 1011/281/281 870/257/257 +f 870/257/257 1263/282/282 1033/259/259 +f 1033/259/259 1270/283/283 1062/261/261 +f 1062/261/261 1291/284/284 1125/263/263 +f 1125/263/263 1295/285/285 1178/265/265 +f 1178/265/265 1303/286/286 1234/267/267 +f 1234/267/267 1313/287/287 1271/269/269 +f 1271/269/269 1320/288/288 1297/271/271 +f 1297/271/271 1329/289/289 1301/273/273 +f 1301/273/273 1333/290/290 1308/275/275 +f 1308/275/275 1332/291/291 1306/277/277 +f 1306/277/277 1332/291/291 662/279/279 +f 922/292/292 1158/293/293 1011/281/281 +f 1011/281/281 1294/294/294 1263/282/282 +f 1263/282/282 1298/295/295 1270/283/283 +f 1270/283/283 1302/296/296 1291/284/284 +f 1291/284/284 1309/297/297 1295/285/285 +f 1295/285/285 1312/298/298 1303/286/286 +f 1303/286/286 1321/299/299 1313/287/287 +f 1313/287/287 1335/300/300 1320/288/288 +f 1320/288/288 1340/301/301 1329/289/289 +f 1329/289/289 1343/302/302 1333/290/290 +f 1333/290/290 1341/303/303 1332/291/291 +f 1332/291/291 1341/303/303 662/279/279 +f 1005/304/304 1158/293/293 1180/305/305 +f 1158/293/293 1294/294/294 1296/306/306 +f 1294/294/294 1298/295/295 1300/307/307 +f 1298/295/295 1302/296/296 1307/308/308 +f 1302/296/296 1309/297/297 1310/309/309 +f 1309/297/297 1312/298/298 1315/310/310 +f 1312/298/298 1321/299/299 1322/311/311 +f 1321/299/299 1335/300/300 1337/312/312 +f 1335/300/300 1340/301/301 1342/313/313 +f 1340/301/301 1343/302/302 1353/314/314 +f 1343/302/302 1341/303/303 1352/315/315 +f 1341/303/303 1352/315/315 662/279/279 +f 1180/305/305 184/316/316 342/317/317 +f 1038/318/318 1180/305/305 342/317/317 +f 1296/306/306 184/316/316 57/319/319 +f 1180/305/305 1296/306/306 184/316/316 +f 1300/307/307 57/319/319 54/320/320 +f 1296/306/306 1300/307/307 57/319/319 +f 1307/308/308 46/321/321 54/320/320 +f 1300/307/307 1307/308/308 54/320/320 +f 1310/309/309 44/322/322 46/321/321 +f 1307/308/308 1310/309/309 46/321/321 +f 1315/310/310 44/322/322 39/323/323 +f 1310/309/309 1315/310/310 44/322/322 +f 1322/311/311 32/324/324 39/323/323 +f 1315/310/310 1322/311/311 39/323/323 +f 1337/312/312 17/325/325 32/324/324 +f 1322/311/311 1337/312/312 32/324/324 +f 1337/312/312 1342/313/313 12/326/326 +f 1353/314/314 1/327/327 12/326/326 +f 1342/313/313 1353/314/314 12/326/326 +f 1/327/327 1352/315/315 2/328/328 +f 1/327/327 1353/314/314 1352/315/315 +f 1352/315/315 662/279/279 2/328/328 +f 342/317/317 184/316/316 204/329/329 +f 184/316/316 60/330/330 57/319/319 +f 57/319/319 55/331/331 54/320/320 +f 54/320/320 52/332/332 46/321/321 +f 46/321/321 45/333/333 44/322/322 +f 44/322/322 40/334/334 39/323/323 +f 39/323/323 33/335/335 32/324/324 +f 32/324/324 19/336/336 17/325/325 +f 17/325/325 14/337/337 12/326/326 +f 12/326/326 11/338/338 1/327/327 +f 1/327/327 2/328/328 13/339/339 +f 2/328/328 662/279/279 13/339/339 +f 353/340/340 349/341/341 204/329/329 +f 204/329/329 93/342/342 60/330/330 +f 60/330/330 85/343/343 55/331/331 +f 55/331/331 71/344/344 52/332/332 +f 52/332/332 59/345/345 45/333/333 +f 45/333/333 51/346/346 40/334/334 +f 40/334/334 41/347/347 33/335/335 +f 33/335/335 34/348/348 19/336/336 +f 19/336/336 27/349/349 14/337/337 +f 14/337/337 21/350/350 11/338/338 +f 11/338/338 22/351/351 13/339/339 +f 13/339/339 22/351/351 662/279/279 +f 431/352/352 492/353/353 349/341/341 +f 349/341/341 352/354/354 93/342/342 +f 93/342/342 313/355/355 85/343/343 +f 85/343/343 268/356/356 71/344/344 +f 71/344/344 202/357/357 59/345/345 +f 59/345/345 133/358/358 51/346/346 +f 51/346/346 87/359/359 41/347/347 +f 41/347/347 58/360/360 34/348/348 +f 34/348/348 53/361/361 27/349/349 +f 27/349/349 47/362/362 21/350/350 +f 21/350/350 48/363/363 22/351/351 +f 22/351/351 48/363/363 662/279/279 +f 531/364/364 699/258/258 492/353/353 +f 492/353/353 702/260/260 352/354/354 +f 352/354/354 703/262/262 313/355/355 +f 313/355/355 704/264/264 268/356/356 +f 268/356/356 705/266/266 202/357/357 +f 202/357/357 707/268/268 133/358/358 +f 133/358/358 712/270/270 87/359/359 +f 87/359/359 719/272/272 58/360/360 +f 58/360/360 725/274/274 53/361/361 +f 53/361/361 727/276/276 47/362/362 +f 47/362/362 726/278/278 48/363/363 +f 48/363/363 726/278/278 662/279/279 +f 698/256/256 829/280/280 870/257/257 +f 699/258/258 870/257/257 1033/259/259 +f 702/260/260 1033/259/259 1062/261/261 +f 703/262/262 1062/261/261 1125/263/263 +f 704/264/264 1125/263/263 1178/265/265 +f 705/266/266 1178/265/265 1234/267/267 +f 707/268/268 1234/267/267 1271/269/269 +f 712/270/270 1271/269/269 1297/271/271 +f 719/272/272 1297/271/271 1301/273/273 +f 725/274/274 1301/273/273 1308/275/275 +f 727/276/276 1308/275/275 1306/277/277 +f 829/280/280 922/292/292 1011/281/281 +f 870/257/257 1011/281/281 1263/282/282 +f 1033/259/259 1263/282/282 1270/283/283 +f 1062/261/261 1270/283/283 1291/284/284 +f 1125/263/263 1291/284/284 1295/285/285 +f 1178/265/265 1295/285/285 1303/286/286 +f 1234/267/267 1303/286/286 1313/287/287 +f 1271/269/269 1313/287/287 1320/288/288 +f 1297/271/271 1320/288/288 1329/289/289 +f 1301/273/273 1329/289/289 1333/290/290 +f 1308/275/275 1333/290/290 1332/291/291 +f 922/292/292 1158/293/293 1005/304/304 +f 1011/281/281 1294/294/294 1158/293/293 +f 1263/282/282 1298/295/295 1294/294/294 +f 1270/283/283 1302/296/296 1298/295/295 +f 1291/284/284 1309/297/297 1302/296/296 +f 1295/285/285 1312/298/298 1309/297/297 +f 1303/286/286 1321/299/299 1312/298/298 +f 1313/287/287 1335/300/300 1321/299/299 +f 1320/288/288 1340/301/301 1335/300/300 +f 1329/289/289 1343/302/302 1340/301/301 +f 1333/290/290 1343/302/302 1341/303/303 +f 1005/304/304 1180/305/305 1038/318/318 +f 1158/293/293 1296/306/306 1180/305/305 +f 1294/294/294 1300/307/307 1296/306/306 +f 1298/295/295 1307/308/308 1300/307/307 +f 1302/296/296 1310/309/309 1307/308/308 +f 1309/297/297 1315/310/310 1310/309/309 +f 1312/298/298 1322/311/311 1315/310/310 +f 1321/299/299 1337/312/312 1322/311/311 +f 1335/300/300 1342/313/313 1337/312/312 +f 1340/301/301 1353/314/314 1342/313/313 +f 1343/302/302 1352/315/315 1353/314/314 +f 1337/312/312 17/325/325 12/326/326 +f 342/317/317 353/340/340 204/329/329 +f 184/316/316 204/329/329 60/330/330 +f 57/319/319 60/330/330 55/331/331 +f 54/320/320 55/331/331 52/332/332 +f 46/321/321 52/332/332 45/333/333 +f 44/322/322 45/333/333 40/334/334 +f 39/323/323 40/334/334 33/335/335 +f 32/324/324 33/335/335 19/336/336 +f 17/325/325 19/336/336 14/337/337 +f 12/326/326 14/337/337 11/338/338 +f 1/327/327 11/338/338 13/339/339 +f 353/340/340 431/352/352 349/341/341 +f 204/329/329 349/341/341 93/342/342 +f 60/330/330 93/342/342 85/343/343 +f 55/331/331 85/343/343 71/344/344 +f 52/332/332 71/344/344 59/345/345 +f 45/333/333 59/345/345 51/346/346 +f 40/334/334 51/346/346 41/347/347 +f 33/335/335 41/347/347 34/348/348 +f 19/336/336 34/348/348 27/349/349 +f 14/337/337 27/349/349 21/350/350 +f 11/338/338 21/350/350 22/351/351 +f 431/352/352 531/364/364 492/353/353 +f 349/341/341 492/353/353 352/354/354 +f 93/342/342 352/354/354 313/355/355 +f 85/343/343 313/355/355 268/356/356 +f 71/344/344 268/356/356 202/357/357 +f 59/345/345 202/357/357 133/358/358 +f 51/346/346 133/358/358 87/359/359 +f 41/347/347 87/359/359 58/360/360 +f 34/348/348 58/360/360 53/361/361 +f 27/349/349 53/361/361 47/362/362 +f 21/350/350 47/362/362 48/363/363 +f 531/364/364 698/256/256 699/258/258 +f 492/353/353 699/258/258 702/260/260 +f 352/354/354 702/260/260 703/262/262 +f 313/355/355 703/262/262 704/264/264 +f 268/356/356 704/264/264 705/266/266 +f 202/357/357 705/266/266 707/268/268 +f 133/358/358 707/268/268 712/270/270 +f 87/359/359 712/270/270 719/272/272 +f 58/360/360 719/272/272 725/274/274 +f 53/361/361 725/274/274 727/276/276 +f 47/362/362 727/276/276 726/278/278 +f 1038/318/318 1180/305/305 1101/365/365 +f 1180/305/305 1296/306/306 1284/366/366 +f 1296/306/306 1300/307/307 1293/367/367 +f 1300/307/307 1307/308/308 1299/368/368 +f 1307/308/308 1310/309/309 1304/369/369 +f 1310/309/309 1315/310/310 1311/370/370 +f 1315/310/310 1322/311/311 1318/371/371 +f 1322/311/311 1337/312/312 1334/372/372 +f 1337/312/312 1342/313/313 1336/373/373 +f 1342/313/313 1353/314/314 1339/374/374 +f 1353/314/314 1352/315/315 1338/375/375 +f 1352/315/315 1338/375/375 662/279/279 +f 984/376/376 935/377/377 1101/365/365 +f 1101/365/365 1219/378/378 1284/366/366 +f 1284/366/366 1240/379/379 1293/367/367 +f 1293/367/367 1255/380/380 1299/368/368 +f 1299/368/368 1267/381/381 1304/369/369 +f 1304/369/369 1292/382/382 1311/370/370 +f 1311/370/370 1305/383/383 1318/371/371 +f 1318/371/371 1314/384/384 1334/372/372 +f 1334/372/372 1316/385/385 1336/373/373 +f 1336/373/373 1319/386/386 1339/374/374 +f 1339/374/374 1317/387/387 1338/375/375 +f 1338/375/375 1317/387/387 662/279/279 +f 887/388/388 799/389/389 935/377/377 +f 935/377/377 865/390/390 1219/378/378 +f 1219/378/378 874/391/391 1240/379/379 +f 1240/379/379 896/392/392 1255/380/380 +f 1255/380/380 908/393/393 1267/381/381 +f 1267/381/381 942/394/394 1292/382/382 +f 1292/382/382 1045/395/395 1305/383/383 +f 1305/383/383 1174/396/396 1314/384/384 +f 1314/384/384 1218/397/397 1316/385/385 +f 1316/385/385 1231/398/398 1319/386/386 +f 1319/386/386 1228/399/399 1317/387/387 +f 1317/387/387 1228/399/399 662/279/279 +f 778/400/400 564/401/401 799/389/389 +f 799/389/389 510/402/402 865/390/390 +f 874/391/391 510/402/402 493/403/403 +f 865/390/390 510/402/402 874/391/391 +f 896/392/392 493/403/403 483/404/404 +f 874/391/391 493/403/403 896/392/392 +f 908/393/393 483/404/404 465/405/405 +f 896/392/392 483/404/404 908/393/393 +f 942/394/394 465/405/405 441/406/406 +f 908/393/393 465/405/405 942/394/394 +f 1045/395/395 441/406/406 362/407/407 +f 942/394/394 441/406/406 1045/395/395 +f 1045/395/395 251/408/408 1174/396/396 +f 1174/396/396 193/409/409 1218/397/397 +f 1218/397/397 164/410/410 1231/398/398 +f 1228/399/399 164/410/410 171/411/411 +f 1231/398/398 164/410/410 1228/399/399 +f 1228/399/399 171/411/411 662/279/279 +f 585/412/412 429/413/413 564/401/401 +f 564/401/401 150/414/414 510/402/402 +f 510/402/402 125/415/415 493/403/403 +f 493/403/403 100/416/416 483/404/404 +f 483/404/404 92/417/417 465/405/405 +f 465/405/405 70/418/418 441/406/406 +f 441/406/406 49/419/419 362/407/407 +f 362/407/407 42/420/420 251/408/408 +f 251/408/408 38/421/421 193/409/409 +f 193/409/409 36/422/422 164/410/410 +f 164/410/410 37/423/423 171/411/411 +f 171/411/411 37/423/423 662/279/279 +f 477/424/424 264/425/425 429/413/413 +f 429/413/413 74/426/426 150/414/414 +f 150/414/414 61/427/427 125/415/415 +f 125/415/415 56/428/428 100/416/416 +f 100/416/416 50/429/429 92/417/417 +f 92/417/417 43/430/430 70/418/418 +f 70/418/418 35/431/431 49/419/419 +f 49/419/419 20/432/432 42/420/420 +f 42/420/420 18/433/433 38/421/421 +f 38/421/421 15/434/434 36/422/422 +f 36/422/422 16/435/435 37/423/423 +f 37/423/423 16/435/435 662/279/279 +f 381/436/436 184/316/316 264/425/425 +f 264/425/425 57/319/319 74/426/426 +f 74/426/426 54/320/320 61/427/427 +f 61/427/427 46/321/321 56/428/428 +f 56/428/428 44/322/322 50/429/429 +f 50/429/429 39/323/323 43/430/430 +f 43/430/430 32/324/324 35/431/431 +f 35/431/431 17/325/325 20/432/432 +f 20/432/432 12/326/326 18/433/433 +f 1/327/327 15/434/434 18/433/433 +f 15/434/434 2/328/328 16/435/435 +f 16/435/435 2/328/328 662/279/279 +f 1038/318/318 984/376/376 1101/365/365 +f 1180/305/305 1101/365/365 1284/366/366 +f 1296/306/306 1284/366/366 1293/367/367 +f 1300/307/307 1293/367/367 1299/368/368 +f 1307/308/308 1299/368/368 1304/369/369 +f 1310/309/309 1304/369/369 1311/370/370 +f 1315/310/310 1311/370/370 1318/371/371 +f 1322/311/311 1318/371/371 1334/372/372 +f 1337/312/312 1334/372/372 1336/373/373 +f 1342/313/313 1336/373/373 1339/374/374 +f 1353/314/314 1339/374/374 1338/375/375 +f 984/376/376 887/388/388 935/377/377 +f 1101/365/365 935/377/377 1219/378/378 +f 1284/366/366 1219/378/378 1240/379/379 +f 1293/367/367 1240/379/379 1255/380/380 +f 1299/368/368 1255/380/380 1267/381/381 +f 1304/369/369 1267/381/381 1292/382/382 +f 1311/370/370 1292/382/382 1305/383/383 +f 1318/371/371 1305/383/383 1314/384/384 +f 1334/372/372 1314/384/384 1316/385/385 +f 1336/373/373 1316/385/385 1319/386/386 +f 1339/374/374 1319/386/386 1317/387/387 +f 887/388/388 778/400/400 799/389/389 +f 935/377/377 799/389/389 865/390/390 +f 1219/378/378 865/390/390 874/391/391 +f 1240/379/379 874/391/391 896/392/392 +f 1255/380/380 896/392/392 908/393/393 +f 1267/381/381 908/393/393 942/394/394 +f 1292/382/382 942/394/394 1045/395/395 +f 1305/383/383 1045/395/395 1174/396/396 +f 1314/384/384 1174/396/396 1218/397/397 +f 1316/385/385 1218/397/397 1231/398/398 +f 1319/386/386 1231/398/398 1228/399/399 +f 778/400/400 585/412/412 564/401/401 +f 799/389/389 564/401/401 510/402/402 +f 1045/395/395 362/407/407 251/408/408 +f 1174/396/396 251/408/408 193/409/409 +f 1218/397/397 193/409/409 164/410/410 +f 585/412/412 477/424/424 429/413/413 +f 564/401/401 429/413/413 150/414/414 +f 510/402/402 150/414/414 125/415/415 +f 493/403/403 125/415/415 100/416/416 +f 483/404/404 100/416/416 92/417/417 +f 465/405/405 92/417/417 70/418/418 +f 441/406/406 70/418/418 49/419/419 +f 362/407/407 49/419/419 42/420/420 +f 251/408/408 42/420/420 38/421/421 +f 193/409/409 38/421/421 36/422/422 +f 164/410/410 36/422/422 37/423/423 +f 477/424/424 381/436/436 264/425/425 +f 429/413/413 264/425/425 74/426/426 +f 150/414/414 74/426/426 61/427/427 +f 125/415/415 61/427/427 56/428/428 +f 100/416/416 56/428/428 50/429/429 +f 92/417/417 50/429/429 43/430/430 +f 70/418/418 43/430/430 35/431/431 +f 49/419/419 35/431/431 20/432/432 +f 42/420/420 20/432/432 18/433/433 +f 38/421/421 18/433/433 15/434/434 +f 36/422/422 15/434/434 16/435/435 +f 381/436/436 342/317/317 184/316/316 +f 264/425/425 184/316/316 57/319/319 +f 74/426/426 57/319/319 54/320/320 +f 61/427/427 54/320/320 46/321/321 +f 56/428/428 46/321/321 44/322/322 +f 50/429/429 44/322/322 39/323/323 +f 43/430/430 39/323/323 32/324/324 +f 35/431/431 32/324/324 17/325/325 +f 20/432/432 17/325/325 12/326/326 +f 18/433/433 12/326/326 1/327/327 +f 1/327/327 2/328/328 15/434/434 +f 648/437/437 759/52/52 756/122/122 +f 650/438/438 648/437/437 756/122/122 +f 756/122/122 759/52/52 867/50/50 +f 854/439/439 867/50/50 978/48/48 +f 938/113/113 978/48/48 1108/46/46 +f 1057/440/440 1108/46/46 1207/42/42 +f 1161/102/102 1207/42/42 1237/41/41 +f 1205/103/103 1237/41/41 1236/2/2 +f 756/122/122 867/50/50 854/439/439 +f 854/439/439 978/48/48 938/113/113 +f 938/113/113 1108/46/46 1057/440/440 +f 1057/440/440 1207/42/42 1161/102/102 +f 1161/102/102 1237/41/41 1205/103/103 +f 1205/103/103 1236/2/2 1204/1/1 +f 692/441/441 597/131/131 592/54/54 +f 691/442/442 597/131/131 692/441/441 +f 597/131/131 486/56/56 592/54/54 +f 502/443/443 377/57/57 486/56/56 +f 415/140/140 246/58/58 377/57/57 +f 297/444/444 143/59/59 246/58/58 +f 191/149/149 118/60/60 143/59/59 +f 147/158/158 117/15/15 118/60/60 +f 597/131/131 502/443/443 486/56/56 +f 502/443/443 415/140/140 377/57/57 +f 415/140/140 297/444/444 246/58/58 +f 297/444/444 191/149/149 143/59/59 +f 191/149/149 147/158/158 118/60/60 +f 147/158/158 148/16/16 117/15/15 +f 148/16/16 142/62/62 117/15/15 +f 192/175/175 245/64/64 142/62/62 +f 298/445/445 376/66/66 245/64/64 +f 416/184/184 485/68/68 376/66/66 +f 501/193/193 591/70/70 485/68/68 +f 595/202/202 647/72/72 591/70/70 +f 148/16/16 192/175/175 142/62/62 +f 192/175/175 298/445/445 245/64/64 +f 298/445/445 416/184/184 376/66/66 +f 416/184/184 501/193/193 485/68/68 +f 501/193/193 595/202/202 591/70/70 +f 595/202/202 651/211/211 647/72/72 +f 651/211/211 758/74/74 647/72/72 +f 755/220/220 866/76/76 758/74/74 +f 853/229/229 977/78/78 866/76/76 +f 939/238/238 1107/80/80 977/78/78 +f 1056/446/446 1206/82/82 1107/80/80 +f 1162/247/247 1236/2/2 1206/82/82 +f 651/211/211 755/220/220 758/74/74 +f 755/220/220 853/229/229 866/76/76 +f 853/229/229 939/238/238 977/78/78 +f 939/238/238 1056/446/446 1107/80/80 +f 1056/446/446 1162/247/247 1206/82/82 +f 1162/247/247 1204/1/1 1236/2/2 +f 97/447/447 78/448/448 77/449/448 +f 98/450/449 78/448/448 97/447/447 +f 77/449/448 80/451/450 79/452/450 +f 78/448/448 80/451/450 77/449/448 +f 79/452/450 31/453/451 30/454/451 +f 80/451/450 31/453/451 79/452/450 +f 30/454/451 29/455/452 28/456/452 +f 31/453/451 29/455/452 30/454/451 +f 28/456/452 98/450/449 97/447/447 +f 29/455/452 98/450/449 28/456/452 +f 25/457/453 24/458/454 23/459/454 +f 26/460/453 24/458/454 25/457/453 +f 23/459/454 10/461/455 9/462/455 +f 24/458/454 10/461/455 23/459/454 +f 9/462/455 4/463/456 3/464/457 +f 10/461/455 4/463/456 9/462/455 +f 3/464/457 8/465/458 7/466/459 +f 4/463/456 8/465/458 3/464/457 +f 7/466/459 6/467/460 5/468/460 +f 8/465/458 6/467/460 7/466/459 +f 5/468/460 26/460/453 25/457/453 +f 6/467/460 26/460/453 5/468/460 +f 1328/469/461 1330/470/462 1331/471/462 +f 1327/472/461 1330/470/462 1328/469/461 +f 1331/471/462 1344/473/463 1345/474/463 +f 1330/470/462 1344/473/463 1331/471/462 +f 1345/474/463 1350/475/464 1351/476/464 +f 1344/473/463 1350/475/464 1345/474/463 +f 1351/476/464 1346/477/465 1347/478/465 +f 1350/475/464 1346/477/465 1351/476/464 +f 1347/478/465 1348/479/466 1349/480/466 +f 1346/477/465 1348/479/466 1347/478/465 +f 1349/480/466 1327/472/461 1328/469/461 +f 1348/479/466 1327/472/461 1349/480/466 +f 1257/481/467 1274/482/468 1275/483/468 +f 1256/484/467 1274/482/468 1257/481/467 +f 1275/483/468 1276/485/469 1277/486/469 +f 1274/482/468 1276/485/469 1275/483/468 +f 1277/486/469 1323/487/470 1324/488/470 +f 1276/485/469 1323/487/470 1277/486/469 +f 1324/488/470 1325/489/471 1326/490/471 +f 1323/487/470 1325/489/471 1324/488/470 +f 1326/490/471 1256/484/467 1257/481/467 +f 1325/489/471 1256/484/467 1326/490/471 +f 91/491/472 99/492/473 141/493/474 +f 99/492/473 108/494/475 157/495/476 +f 108/494/475 149/496/477 203/497/478 +f 149/496/477 258/498/479 292/499/480 +f 258/498/479 329/500/481 335/501/482 +f 124/502/483 141/493/474 198/503/484 +f 141/493/474 157/495/476 209/504/485 +f 157/495/476 203/497/478 261/505/486 +f 203/497/478 292/499/480 299/506/487 +f 335/501/482 338/507/488 299/506/487 +f 292/499/480 335/501/482 299/506/487 +f 182/508/489 198/503/484 412/509/490 +f 198/503/484 209/504/485 407/510/491 +f 209/504/485 261/505/486 388/511/492 +f 261/505/486 299/506/487 350/512/493 +f 299/506/487 338/507/488 337/513/494 +f 437/514/495 412/509/490 565/515/496 +f 412/509/490 407/510/491 540/516/497 +f 407/510/491 388/511/492 489/517/498 +f 350/512/493 405/518/499 489/517/498 +f 388/511/492 350/512/493 489/517/498 +f 350/512/493 337/513/494 328/519/500 +f 565/515/496 109/520/501 104/521/502 +f 643/522/503 565/515/496 104/521/502 +f 540/516/497 116/523/504 109/520/501 +f 565/515/496 540/516/497 109/520/501 +f 489/517/498 155/524/505 116/523/504 +f 540/516/497 489/517/498 116/523/504 +f 405/518/499 265/525/506 155/524/505 +f 489/517/498 405/518/499 155/524/505 +f 328/519/500 325/526/507 265/525/506 +f 405/518/499 328/519/500 265/525/506 +f 104/521/502 109/520/501 84/527/508 +f 109/520/501 116/523/504 89/528/509 +f 116/523/504 155/524/505 110/529/510 +f 155/524/505 265/525/506 227/530/511 +f 325/526/507 333/531/512 227/530/511 +f 265/525/506 325/526/507 227/530/511 +f 75/532/513 84/527/508 82/533/514 +f 84/527/508 89/528/509 86/534/515 +f 89/528/509 110/529/510 106/535/516 +f 110/529/510 227/530/511 216/536/517 +f 227/530/511 333/531/512 336/537/518 +f 66/538/519 82/533/514 83/539/520 +f 82/533/514 86/534/515 90/540/521 +f 86/534/515 106/535/516 111/541/522 +f 106/535/516 216/536/517 225/542/523 +f 216/536/517 336/537/518 334/543/524 +f 72/544/525 83/539/520 88/545/526 +f 83/539/520 90/540/521 96/546/527 +f 90/540/521 111/541/522 123/547/528 +f 111/541/522 225/542/523 240/548/529 +f 225/542/523 334/543/524 332/549/530 +f 81/550/531 88/545/526 99/492/473 +f 88/545/526 96/546/527 108/494/475 +f 96/546/527 123/547/528 149/496/477 +f 123/547/528 240/548/529 258/498/479 +f 240/548/529 332/549/530 329/500/481 +f 91/491/472 141/493/474 124/502/483 +f 99/492/473 157/495/476 141/493/474 +f 108/494/475 203/497/478 157/495/476 +f 149/496/477 292/499/480 203/497/478 +f 258/498/479 335/501/482 292/499/480 +f 124/502/483 198/503/484 182/508/489 +f 141/493/474 209/504/485 198/503/484 +f 157/495/476 261/505/486 209/504/485 +f 203/497/478 299/506/487 261/505/486 +f 182/508/489 412/509/490 437/514/495 +f 198/503/484 407/510/491 412/509/490 +f 209/504/485 388/511/492 407/510/491 +f 261/505/486 350/512/493 388/511/492 +f 299/506/487 337/513/494 350/512/493 +f 437/514/495 565/515/496 643/522/503 +f 412/509/490 540/516/497 565/515/496 +f 407/510/491 489/517/498 540/516/497 +f 350/512/493 328/519/500 405/518/499 +f 104/521/502 84/527/508 75/532/513 +f 109/520/501 89/528/509 84/527/508 +f 116/523/504 110/529/510 89/528/509 +f 155/524/505 227/530/511 110/529/510 +f 75/532/513 82/533/514 66/538/519 +f 84/527/508 86/534/515 82/533/514 +f 89/528/509 106/535/516 86/534/515 +f 110/529/510 216/536/517 106/535/516 +f 227/530/511 336/537/518 216/536/517 +f 66/538/519 83/539/520 72/544/525 +f 82/533/514 90/540/521 83/539/520 +f 86/534/515 111/541/522 90/540/521 +f 106/535/516 225/542/523 111/541/522 +f 216/536/517 334/543/524 225/542/523 +f 72/544/525 88/545/526 81/550/531 +f 83/539/520 96/546/527 88/545/526 +f 90/540/521 123/547/528 96/546/527 +f 111/541/522 240/548/529 123/547/528 +f 225/542/523 332/549/530 240/548/529 +f 81/550/531 99/492/473 91/491/472 +f 88/545/526 108/494/475 99/492/473 +f 96/546/527 149/496/477 108/494/475 +f 123/547/528 258/498/479 149/496/477 +f 240/548/529 329/500/481 258/498/479 +f 1261/551/532 1209/552/533 1254/553/534 +f 1254/553/534 1196/554/535 1246/555/536 +f 1246/555/536 1149/556/537 1201/557/538 +f 1201/557/538 1063/558/539 1094/559/540 +f 1094/559/540 1017/560/541 1023/561/542 +f 1226/562/543 1153/563/544 1209/552/533 +f 1209/552/533 1146/564/545 1196/554/535 +f 1196/554/535 1091/565/546 1149/556/537 +f 1149/556/537 1055/566/547 1063/558/539 +f 1017/560/541 1055/566/547 1014/567/548 +f 1063/558/539 1055/566/547 1017/560/541 +f 1169/568/549 941/569/550 1153/563/544 +f 1153/563/544 947/570/551 1146/564/545 +f 1146/564/545 968/571/552 1091/565/546 +f 1091/565/546 1002/572/553 1055/566/547 +f 1055/566/547 1015/573/554 1014/567/548 +f 915/574/555 791/575/556 941/569/550 +f 941/569/550 816/576/557 947/570/551 +f 947/570/551 863/577/558 968/571/552 +f 1002/572/553 863/577/558 949/578/559 +f 968/571/552 863/577/558 1002/572/553 +f 1002/572/553 1024/579/560 1015/573/554 +f 791/575/556 1249/580/561 1245/581/562 +f 706/582/563 1249/580/561 791/575/556 +f 816/576/557 1245/581/562 1239/583/564 +f 791/575/556 1245/581/562 816/576/557 +f 863/577/558 1239/583/564 1197/584/565 +f 816/576/557 1239/583/564 863/577/558 +f 949/578/559 1197/584/565 1088/585/566 +f 863/577/558 1197/584/565 949/578/559 +f 1024/579/560 1088/585/566 1027/586/567 +f 949/578/559 1088/585/566 1024/579/560 +f 1249/580/561 1268/587/568 1245/581/562 +f 1245/581/562 1264/588/569 1239/583/564 +f 1239/583/564 1244/589/570 1197/584/565 +f 1197/584/565 1124/590/571 1088/585/566 +f 1027/586/567 1124/590/571 1019/591/572 +f 1088/585/566 1124/590/571 1027/586/567 +f 1278/592/573 1272/593/574 1268/587/568 +f 1268/587/568 1266/594/575 1264/588/569 +f 1264/588/569 1248/595/576 1244/589/570 +f 1244/589/570 1137/596/577 1124/590/571 +f 1124/590/571 1016/597/578 1019/591/572 +f 1285/598/579 1269/599/580 1272/593/574 +f 1272/593/574 1262/600/581 1266/594/575 +f 1266/594/575 1243/601/582 1248/595/576 +f 1248/595/576 1126/602/583 1137/596/577 +f 1137/596/577 1018/603/584 1016/597/578 +f 1280/604/585 1265/605/586 1269/599/580 +f 1269/599/580 1258/606/587 1262/600/581 +f 1262/600/581 1227/607/588 1243/601/582 +f 1243/601/582 1114/608/589 1126/602/583 +f 1126/602/583 1020/609/590 1018/603/584 +f 1273/610/591 1254/553/534 1265/605/586 +f 1265/605/586 1246/555/536 1258/606/587 +f 1258/606/587 1201/557/538 1227/607/588 +f 1227/607/588 1094/559/540 1114/608/589 +f 1114/608/589 1023/561/542 1020/609/590 +f 1261/551/532 1226/562/543 1209/552/533 +f 1254/553/534 1209/552/533 1196/554/535 +f 1246/555/536 1196/554/535 1149/556/537 +f 1201/557/538 1149/556/537 1063/558/539 +f 1094/559/540 1063/558/539 1017/560/541 +f 1226/562/543 1169/568/549 1153/563/544 +f 1209/552/533 1153/563/544 1146/564/545 +f 1196/554/535 1146/564/545 1091/565/546 +f 1149/556/537 1091/565/546 1055/566/547 +f 1169/568/549 915/574/555 941/569/550 +f 1153/563/544 941/569/550 947/570/551 +f 1146/564/545 947/570/551 968/571/552 +f 1091/565/546 968/571/552 1002/572/553 +f 1055/566/547 1002/572/553 1015/573/554 +f 915/574/555 706/582/563 791/575/556 +f 941/569/550 791/575/556 816/576/557 +f 947/570/551 816/576/557 863/577/558 +f 1002/572/553 949/578/559 1024/579/560 +f 1249/580/561 1278/592/573 1268/587/568 +f 1245/581/562 1268/587/568 1264/588/569 +f 1239/583/564 1264/588/569 1244/589/570 +f 1197/584/565 1244/589/570 1124/590/571 +f 1278/592/573 1285/598/579 1272/593/574 +f 1268/587/568 1272/593/574 1266/594/575 +f 1264/588/569 1266/594/575 1248/595/576 +f 1244/589/570 1248/595/576 1137/596/577 +f 1124/590/571 1137/596/577 1016/597/578 +f 1285/598/579 1280/604/585 1269/599/580 +f 1272/593/574 1269/599/580 1262/600/581 +f 1266/594/575 1262/600/581 1243/601/582 +f 1248/595/576 1243/601/582 1126/602/583 +f 1137/596/577 1126/602/583 1018/603/584 +f 1280/604/585 1273/610/591 1265/605/586 +f 1269/599/580 1265/605/586 1258/606/587 +f 1262/600/581 1258/606/587 1227/607/588 +f 1243/601/582 1227/607/588 1114/608/589 +f 1126/602/583 1114/608/589 1020/609/590 +f 1273/610/591 1261/551/532 1254/553/534 +f 1265/605/586 1254/553/534 1246/555/536 +f 1258/606/587 1246/555/536 1201/557/538 +f 1227/607/588 1201/557/538 1094/559/540 +f 1114/608/589 1094/559/540 1023/561/542 +f 615/611/592 576/612/593 618/613/594 +f 774/614/595 618/613/594 775/615/594 +f 615/611/592 618/613/594 774/614/595 +f 774/614/595 775/615/594 800/616/596 +f 618/613/594 576/612/593 623/617/597 +f 775/615/594 623/617/597 757/618/598 +f 618/613/594 623/617/597 775/615/594 +f 775/615/594 757/618/598 800/616/596 +f 623/617/597 576/612/593 625/619/599 +f 757/618/598 625/619/599 722/620/600 +f 623/617/597 625/619/599 757/618/598 +f 757/618/598 722/620/600 800/616/596 +f 625/619/599 576/612/593 627/621/601 +f 722/620/600 627/621/601 717/622/602 +f 625/619/599 627/621/601 722/620/600 +f 722/620/600 717/622/602 800/616/596 +f 627/621/601 576/612/593 626/623/603 +f 717/622/602 626/623/603 715/624/604 +f 627/621/601 626/623/603 717/622/602 +f 717/622/602 715/624/604 800/616/596 +f 626/623/603 576/612/593 624/625/605 +f 715/624/604 624/625/605 713/626/606 +f 626/623/603 624/625/605 715/624/604 +f 715/624/604 713/626/606 800/616/596 +f 624/625/605 576/612/593 622/627/607 +f 713/626/606 622/627/607 714/628/608 +f 624/625/605 622/627/607 713/626/606 +f 713/626/606 714/628/608 800/616/596 +f 622/627/607 576/612/593 621/629/609 +f 714/628/608 621/629/609 716/630/610 +f 622/627/607 621/629/609 714/628/608 +f 714/628/608 716/630/610 800/616/596 +f 621/629/609 576/612/593 620/631/611 +f 716/630/610 620/631/611 718/632/612 +f 621/629/609 620/631/611 716/630/610 +f 716/630/610 718/632/612 800/616/596 +f 620/631/611 576/612/593 619/633/613 +f 718/632/612 619/633/613 721/634/614 +f 620/631/611 619/633/613 718/632/612 +f 718/632/612 721/634/614 800/616/596 +f 619/633/613 576/612/593 617/635/615 +f 721/634/614 617/635/615 764/636/616 +f 619/633/613 617/635/615 721/634/614 +f 721/634/614 764/636/616 800/616/596 +f 617/635/615 576/612/593 616/637/617 +f 764/636/616 616/637/617 767/638/618 +f 617/635/615 616/637/617 764/636/616 +f 764/636/616 767/638/618 800/616/596 +f 616/637/617 576/612/593 615/611/592 +f 767/638/618 615/611/592 774/614/595 +f 616/637/617 615/611/592 767/638/618 +f 767/638/618 774/614/595 800/616/596 +f 951/639/619 963/640/620 934/641/621 +f 973/642/622 934/641/621 893/643/623 +f 951/639/619 934/641/621 973/642/622 +f 983/644/624 893/643/623 872/645/625 +f 973/642/622 893/643/623 983/644/624 +f 986/646/626 872/645/625 876/647/627 +f 983/644/624 872/645/625 986/646/626 +f 988/648/628 876/647/627 898/649/628 +f 986/646/626 876/647/627 988/648/628 +f 934/641/621 963/640/620 920/650/629 +f 893/643/623 920/650/629 833/651/630 +f 934/641/621 920/650/629 893/643/623 +f 872/645/625 833/651/630 804/652/631 +f 893/643/623 833/651/630 872/645/625 +f 876/647/627 804/652/631 808/653/632 +f 872/645/625 804/652/631 876/647/627 +f 898/649/628 808/653/632 831/654/628 +f 876/647/627 808/653/632 898/649/628 +f 920/650/629 963/640/620 912/655/633 +f 833/651/630 912/655/633 819/656/634 +f 920/650/629 912/655/633 833/651/630 +f 804/652/631 819/656/634 783/657/635 +f 833/651/630 819/656/634 804/652/631 +f 808/653/632 783/657/635 788/658/636 +f 804/652/631 783/657/635 808/653/632 +f 831/654/628 788/658/636 811/659/628 +f 808/653/632 788/658/636 831/654/628 +f 912/655/633 963/640/620 919/660/637 +f 819/656/634 919/660/637 832/661/638 +f 912/655/633 919/660/637 819/656/634 +f 783/657/635 832/661/638 803/662/639 +f 819/656/634 832/661/638 783/657/635 +f 788/658/636 803/662/639 807/663/640 +f 783/657/635 803/662/639 788/658/636 +f 811/659/628 807/663/640 830/664/628 +f 788/658/636 807/663/640 811/659/628 +f 919/660/637 963/640/620 933/665/641 +f 832/661/638 933/665/641 892/666/642 +f 919/660/637 933/665/641 832/661/638 +f 803/662/639 892/666/642 871/667/643 +f 832/661/638 892/666/642 803/662/639 +f 807/663/640 871/667/643 875/668/644 +f 803/662/639 871/667/643 807/663/640 +f 830/664/628 875/668/644 897/669/628 +f 807/663/640 875/668/644 830/664/628 +f 933/665/641 963/640/620 950/670/645 +f 892/666/642 950/670/645 972/671/646 +f 933/665/641 950/670/645 892/666/642 +f 871/667/643 972/671/646 982/672/647 +f 892/666/642 972/671/646 871/667/643 +f 875/668/644 982/672/647 985/673/648 +f 871/667/643 982/672/647 875/668/644 +f 897/669/628 985/673/648 987/674/628 +f 875/668/644 985/673/648 897/669/628 +f 950/670/645 963/640/620 995/675/649 +f 972/671/646 995/675/649 1082/676/650 +f 950/670/645 995/675/649 972/671/646 +f 982/672/647 1082/676/650 1138/677/651 +f 972/671/646 1082/676/650 982/672/647 +f 985/673/648 1138/677/651 1140/678/652 +f 982/672/647 1138/677/651 985/673/648 +f 987/674/628 1140/678/652 1102/679/628 +f 985/673/648 1140/678/652 987/674/628 +f 995/675/649 963/640/620 1006/680/653 +f 1082/676/650 1006/680/653 1165/681/654 +f 995/675/649 1006/680/653 1082/676/650 +f 1138/677/651 1165/681/654 1222/682/655 +f 1082/676/650 1165/681/654 1138/677/651 +f 1140/678/652 1222/682/655 1220/683/656 +f 1138/677/651 1222/682/655 1140/678/652 +f 1102/679/628 1220/683/656 1192/684/657 +f 1140/678/652 1220/683/656 1102/679/628 +f 1006/680/653 963/640/620 1010/685/658 +f 1165/681/654 1010/685/658 1191/686/659 +f 1006/680/653 1010/685/658 1165/681/654 +f 1222/682/655 1191/686/659 1235/687/660 +f 1165/681/654 1191/686/659 1222/682/655 +f 1220/683/656 1235/687/660 1233/688/661 +f 1222/682/655 1235/687/660 1220/683/656 +f 1192/684/657 1233/688/661 1213/689/628 +f 1220/683/656 1233/688/661 1192/684/657 +f 1010/685/658 963/640/620 1007/690/662 +f 1191/686/659 1007/690/662 1166/691/663 +f 1010/685/658 1007/690/662 1191/686/659 +f 1235/687/660 1166/691/663 1223/692/664 +f 1191/686/659 1166/691/663 1235/687/660 +f 1233/688/661 1223/692/664 1221/693/665 +f 1235/687/660 1223/692/664 1233/688/661 +f 1213/689/628 1221/693/665 1193/694/628 +f 1233/688/661 1221/693/665 1213/689/628 +f 1007/690/662 963/640/620 996/695/666 +f 1166/691/663 996/695/666 1083/696/667 +f 1007/690/662 996/695/666 1166/691/663 +f 1223/692/664 1083/696/667 1139/697/668 +f 1166/691/663 1083/696/667 1223/692/664 +f 1221/693/665 1139/697/668 1141/698/669 +f 1223/692/664 1139/697/668 1221/693/665 +f 1193/694/628 1141/698/669 1103/699/628 +f 1221/693/665 1141/698/669 1193/694/628 +f 996/695/666 963/640/620 951/639/619 +f 1083/696/667 951/639/619 973/642/622 +f 996/695/666 951/639/619 1083/696/667 +f 1139/697/668 973/642/622 983/644/624 +f 1083/696/667 973/642/622 1139/697/668 +f 1141/698/669 983/644/624 986/646/626 +f 1139/697/668 983/644/624 1141/698/669 +f 1103/699/628 986/646/626 988/648/628 +f 1141/698/669 986/646/626 1103/699/628 +f 387/700/670 400/701/671 359/702/672 +f 375/703/673 359/702/672 271/704/674 +f 387/700/670 359/702/672 375/703/673 +f 368/705/675 271/704/674 213/706/676 +f 375/703/673 271/704/674 368/705/675 +f 364/707/677 213/706/676 206/708/678 +f 368/705/675 213/706/676 364/707/677 +f 366/709/679 206/708/678 238/710/679 +f 364/707/677 206/708/678 366/709/679 +f 359/702/672 400/701/671 346/711/680 +f 271/704/674 346/711/680 181/712/681 +f 359/702/672 346/711/680 271/704/674 +f 213/706/676 181/712/681 129/713/682 +f 271/704/674 181/712/681 213/706/676 +f 206/708/678 129/713/682 131/714/683 +f 213/706/676 129/713/682 206/708/678 +f 238/710/679 131/714/683 152/715/679 +f 206/708/678 131/714/683 238/710/679 +f 346/711/680 400/701/671 339/716/684 +f 181/712/681 339/716/684 159/717/685 +f 346/711/680 339/716/684 181/712/681 +f 129/713/682 159/717/685 112/718/686 +f 181/712/681 159/717/685 129/713/682 +f 131/714/683 112/718/686 115/719/687 +f 129/713/682 112/718/686 131/714/683 +f 152/715/679 115/719/687 132/720/679 +f 131/714/683 115/719/687 152/715/679 +f 339/716/684 400/701/671 345/721/688 +f 159/717/685 345/721/688 180/722/689 +f 339/716/684 345/721/688 159/717/685 +f 112/718/686 180/722/689 128/723/690 +f 159/717/685 180/722/689 112/718/686 +f 115/719/687 128/723/690 130/724/691 +f 112/718/686 128/723/690 115/719/687 +f 132/720/679 130/724/691 151/725/692 +f 115/719/687 130/724/691 132/720/679 +f 345/721/688 400/701/671 358/726/693 +f 180/722/689 358/726/693 270/727/694 +f 345/721/688 358/726/693 180/722/689 +f 128/723/690 270/727/694 212/728/695 +f 180/722/689 270/727/694 128/723/690 +f 130/724/691 212/728/695 205/729/696 +f 128/723/690 212/728/695 130/724/691 +f 151/725/692 205/729/696 237/730/679 +f 130/724/691 205/729/696 151/725/692 +f 358/726/693 400/701/671 386/731/697 +f 270/727/694 386/731/697 374/732/698 +f 358/726/693 386/731/697 270/727/694 +f 212/728/695 374/732/698 367/733/699 +f 270/727/694 374/732/698 212/728/695 +f 205/729/696 367/733/699 363/734/700 +f 212/728/695 367/733/699 205/729/696 +f 237/730/679 363/734/700 365/735/679 +f 205/729/696 363/734/700 237/730/679 +f 386/731/697 400/701/671 417/736/701 +f 374/732/698 417/736/701 455/737/702 +f 386/731/697 417/736/701 374/732/698 +f 367/733/699 455/737/702 475/738/703 +f 374/732/698 455/737/702 367/733/699 +f 363/734/700 475/738/703 469/739/704 +f 367/733/699 475/738/703 363/734/700 +f 365/735/679 469/739/704 452/740/705 +f 363/734/700 469/739/704 365/735/679 +f 417/736/701 400/701/671 432/741/706 +f 455/737/702 432/741/706 511/742/707 +f 417/736/701 432/741/706 455/737/702 +f 475/738/703 511/742/707 547/743/708 +f 455/737/702 511/742/707 475/738/703 +f 469/739/704 547/743/708 545/744/709 +f 475/738/703 547/743/708 469/739/704 +f 452/740/705 545/744/709 518/745/679 +f 469/739/704 545/744/709 452/740/705 +f 432/741/706 400/701/671 440/746/710 +f 511/742/707 440/746/710 532/747/711 +f 432/741/706 440/746/710 511/742/707 +f 547/743/708 532/747/711 563/748/712 +f 511/742/707 532/747/711 547/743/708 +f 545/744/709 563/748/712 560/749/713 +f 547/743/708 563/748/712 545/744/709 +f 518/745/679 560/749/713 535/750/679 +f 545/744/709 560/749/713 518/745/679 +f 440/746/710 400/701/671 433/751/714 +f 532/747/711 433/751/714 512/752/715 +f 440/746/710 433/751/714 532/747/711 +f 563/748/712 512/752/715 548/753/716 +f 532/747/711 512/752/715 563/748/712 +f 560/749/713 548/753/716 546/754/717 +f 563/748/712 548/753/716 560/749/713 +f 535/750/679 546/754/717 519/755/679 +f 560/749/713 546/754/717 535/750/679 +f 433/751/714 400/701/671 418/756/718 +f 512/752/715 418/756/718 456/757/719 +f 433/751/714 418/756/718 512/752/715 +f 548/753/716 456/757/719 476/758/720 +f 512/752/715 456/757/719 548/753/716 +f 546/754/717 476/758/720 470/759/721 +f 548/753/716 476/758/720 546/754/717 +f 519/755/679 470/759/721 453/760/679 +f 546/754/717 470/759/721 519/755/679 +f 418/756/718 400/701/671 387/700/670 +f 456/757/719 387/700/670 375/703/673 +f 418/756/718 387/700/670 456/757/719 +f 476/758/720 375/703/673 368/705/675 +f 456/757/719 375/703/673 476/758/720 +f 470/759/721 368/705/675 364/707/677 +f 476/758/720 368/705/675 470/759/721 +f 453/760/679 364/707/677 366/709/679 +f 470/759/721 364/707/677 453/760/679 +f 742/761/722 676/762/723 737/763/724 +f 851/764/725 737/763/724 839/765/726 +f 742/761/722 737/763/724 851/764/725 +f 902/766/727 839/765/726 886/767/728 +f 851/764/725 839/765/726 902/766/727 +f 901/768/729 886/767/728 884/769/730 +f 902/766/727 886/767/728 901/768/729 +f 864/770/731 884/769/730 858/771/732 +f 901/768/729 884/769/730 864/770/731 +f 737/763/724 676/762/723 729/772/733 +f 839/765/726 729/772/733 810/773/734 +f 737/763/724 729/772/733 839/765/726 +f 886/767/728 810/773/734 844/774/735 +f 839/765/726 810/773/734 886/767/728 +f 884/769/730 844/774/735 842/775/736 +f 886/767/728 844/774/735 884/769/730 +f 858/771/732 842/775/736 818/776/731 +f 884/769/730 842/775/736 858/771/732 +f 729/772/733 676/762/723 711/777/737 +f 810/773/734 711/777/737 762/778/738 +f 729/772/733 711/777/737 810/773/734 +f 844/774/735 762/778/738 787/779/739 +f 810/773/734 762/778/738 844/774/735 +f 842/775/736 787/779/739 785/780/740 +f 844/774/735 787/779/739 842/775/736 +f 818/776/731 785/780/740 771/781/731 +f 842/775/736 785/780/740 818/776/731 +f 711/777/737 676/762/723 679/782/741 +f 762/778/738 679/782/741 683/783/742 +f 711/777/737 679/782/741 762/778/738 +f 787/779/739 683/783/742 687/784/743 +f 762/778/738 683/783/742 787/779/739 +f 785/780/740 687/784/743 689/785/744 +f 787/779/739 687/784/743 785/780/740 +f 771/781/731 689/785/744 688/786/731 +f 785/780/740 689/785/744 771/781/731 +f 679/782/741 676/762/723 640/787/745 +f 683/783/742 640/787/745 590/788/746 +f 679/782/741 640/787/745 683/783/742 +f 687/784/743 590/788/746 569/789/747 +f 683/783/742 590/788/746 687/784/743 +f 689/785/744 569/789/747 571/790/748 +f 687/784/743 569/789/747 689/785/744 +f 688/786/731 571/790/748 582/791/749 +f 689/785/744 571/790/748 688/786/731 +f 640/787/745 676/762/723 635/792/750 +f 590/788/746 635/792/750 550/793/751 +f 640/787/745 635/792/750 590/788/746 +f 569/789/747 550/793/751 514/794/752 +f 590/788/746 550/793/751 569/789/747 +f 571/790/748 514/794/752 516/795/753 +f 569/789/747 514/794/752 571/790/748 +f 582/791/749 516/795/753 539/796/731 +f 571/790/748 516/795/753 582/791/749 +f 635/792/750 676/762/723 614/797/754 +f 550/793/751 614/797/754 521/798/755 +f 635/792/750 614/797/754 550/793/751 +f 514/794/752 521/798/755 468/799/756 +f 550/793/751 521/798/755 514/794/752 +f 516/795/753 468/799/756 472/800/757 +f 514/794/752 468/799/756 516/795/753 +f 539/796/731 472/800/757 497/801/731 +f 516/795/753 472/800/757 539/796/731 +f 614/797/754 676/762/723 608/802/758 +f 521/798/755 608/802/758 503/803/759 +f 614/797/754 608/802/758 521/798/755 +f 468/799/756 503/803/759 451/804/760 +f 521/798/755 503/803/759 468/799/756 +f 472/800/757 451/804/760 454/805/761 +f 468/799/756 451/804/760 472/800/757 +f 497/801/731 454/805/761 488/806/731 +f 472/800/757 454/805/761 497/801/731 +f 608/802/758 676/762/723 613/807/762 +f 503/803/759 613/807/762 520/808/763 +f 608/802/758 613/807/762 503/803/759 +f 451/804/760 520/808/763 467/809/764 +f 503/803/759 520/808/763 451/804/760 +f 454/805/761 467/809/764 471/810/765 +f 451/804/760 467/809/764 454/805/761 +f 488/806/731 471/810/765 496/811/731 +f 454/805/761 471/810/765 488/806/731 +f 613/807/762 676/762/723 634/812/766 +f 520/808/763 634/812/766 549/813/767 +f 613/807/762 634/812/766 520/808/763 +f 467/809/764 549/813/767 513/814/768 +f 520/808/763 549/813/767 467/809/764 +f 471/810/765 513/814/768 515/815/769 +f 467/809/764 513/814/768 471/810/765 +f 496/811/731 515/815/769 538/816/770 +f 471/810/765 515/815/769 496/811/731 +f 634/812/766 676/762/723 639/817/771 +f 549/813/767 639/817/771 589/818/772 +f 634/812/766 639/817/771 549/813/767 +f 513/814/768 589/818/772 568/819/773 +f 549/813/767 589/818/772 513/814/768 +f 515/815/769 568/819/773 570/820/774 +f 513/814/768 568/819/773 515/815/769 +f 538/816/770 570/820/774 581/821/749 +f 515/815/769 570/820/774 538/816/770 +f 639/817/771 676/762/723 675/822/775 +f 589/818/772 675/822/775 682/823/776 +f 639/817/771 675/822/775 589/818/772 +f 568/819/773 682/823/776 684/824/777 +f 589/818/772 682/823/776 568/819/773 +f 570/820/774 684/824/777 685/825/778 +f 568/819/773 684/824/777 570/820/774 +f 581/821/749 685/825/778 686/826/749 +f 570/820/774 685/825/778 581/821/749 +f 675/822/775 676/762/723 710/827/779 +f 682/823/776 710/827/779 761/828/780 +f 675/822/775 710/827/779 682/823/776 +f 684/824/777 761/828/780 786/829/781 +f 682/823/776 761/828/780 684/824/777 +f 685/825/778 786/829/781 784/830/782 +f 684/824/777 786/829/781 685/825/778 +f 686/826/749 784/830/782 770/831/749 +f 685/825/778 784/830/782 686/826/749 +f 710/827/779 676/762/723 728/832/783 +f 761/828/780 728/832/783 809/833/784 +f 710/827/779 728/832/783 761/828/780 +f 786/829/781 809/833/784 843/834/785 +f 761/828/780 809/833/784 786/829/781 +f 784/830/782 843/834/785 841/835/786 +f 786/829/781 843/834/785 784/830/782 +f 770/831/749 841/835/786 817/836/749 +f 784/830/782 841/835/786 770/831/749 +f 728/832/783 676/762/723 736/837/787 +f 809/833/784 736/837/787 838/838/788 +f 728/832/783 736/837/787 809/833/784 +f 843/834/785 838/838/788 885/839/789 +f 809/833/784 838/838/788 843/834/785 +f 841/835/786 885/839/789 883/840/790 +f 843/834/785 885/839/789 841/835/786 +f 817/836/749 883/840/790 857/841/731 +f 841/835/786 883/840/790 817/836/749 +f 736/837/787 676/762/723 742/761/722 +f 838/838/788 742/761/722 851/764/725 +f 736/837/787 742/761/722 838/838/788 +f 885/839/789 851/764/725 902/766/727 +f 838/838/788 851/764/725 885/839/789 +f 883/840/790 902/766/727 901/768/729 +f 885/839/789 902/766/727 883/840/790 +f 857/841/731 901/768/729 864/770/731 +f 883/840/790 901/768/729 857/841/731 +f 750/842/791 680/843/792 740/844/793 +f 802/845/794 740/844/793 792/846/795 +f 750/842/791 740/844/793 802/845/794 +f 845/847/796 792/846/795 826/848/797 +f 802/845/794 792/846/795 845/847/796 +f 873/849/798 826/848/797 855/850/799 +f 845/847/796 826/848/797 873/849/798 +f 905/851/800 855/850/799 879/852/801 +f 873/849/798 855/850/799 905/851/800 +f 918/853/802 879/852/801 899/854/803 +f 905/851/800 879/852/801 918/853/802 +f 921/855/804 899/854/803 903/856/805 +f 918/853/802 899/854/803 921/855/804 +f 740/844/793 680/843/792 723/857/806 +f 792/846/795 723/857/806 747/858/807 +f 740/844/793 723/857/806 792/846/795 +f 826/848/797 747/858/807 781/859/808 +f 792/846/795 747/858/807 826/848/797 +f 855/850/799 781/859/808 796/860/809 +f 826/848/797 781/859/808 855/850/799 +f 879/852/801 796/860/809 805/861/810 +f 855/850/799 796/860/809 879/852/801 +f 899/854/803 805/861/810 812/862/811 +f 879/852/801 805/861/810 899/854/803 +f 903/856/805 812/862/811 820/863/812 +f 899/854/803 812/862/811 903/856/805 +f 723/857/806 680/843/792 677/864/813 +f 747/858/807 677/864/813 674/865/814 +f 723/857/806 677/864/813 747/858/807 +f 781/859/808 674/865/814 670/866/815 +f 747/858/807 674/865/814 781/859/808 +f 796/860/809 670/866/815 667/867/816 +f 781/859/808 670/866/815 796/860/809 +f 805/861/810 667/867/816 666/868/817 +f 796/860/809 667/867/816 805/861/810 +f 812/862/811 666/868/817 664/869/818 +f 805/861/810 666/868/817 812/862/811 +f 820/863/812 664/869/818 663/870/819 +f 812/862/811 664/869/818 820/863/812 +f 677/864/813 680/843/792 636/871/820 +f 674/865/814 636/871/820 602/872/821 +f 677/864/813 636/871/820 674/865/814 +f 670/866/815 602/872/821 572/873/822 +f 674/865/814 602/872/821 670/866/815 +f 667/867/816 572/873/822 556/874/823 +f 670/866/815 572/873/822 667/867/816 +f 666/868/817 556/874/823 551/875/824 +f 667/867/816 556/874/823 666/868/817 +f 664/869/818 551/875/824 543/876/825 +f 666/868/817 551/875/824 664/869/818 +f 663/870/819 543/876/825 536/877/826 +f 664/869/818 543/876/825 663/870/819 +f 636/871/820 680/843/792 609/878/827 +f 602/872/821 609/878/827 561/879/828 +f 636/871/820 609/878/827 602/872/821 +f 572/873/822 561/879/828 527/880/829 +f 602/872/821 561/879/828 572/873/822 +f 556/874/823 527/880/829 498/881/830 +f 572/873/822 527/880/829 556/874/823 +f 551/875/824 498/881/830 478/882/831 +f 556/874/823 498/881/830 551/875/824 +f 543/876/825 478/882/831 457/883/832 +f 551/875/824 478/882/831 543/876/825 +f 536/877/826 457/883/832 449/884/833 +f 543/876/825 457/883/832 536/877/826 +f 609/878/827 680/843/792 600/885/834 +f 561/879/828 600/885/834 553/886/835 +f 609/878/827 600/885/834 561/879/828 +f 527/880/829 553/886/835 509/887/836 +f 561/879/828 553/886/835 527/880/829 +f 498/881/830 509/887/836 482/888/837 +f 527/880/829 509/887/836 498/881/830 +f 478/882/831 482/888/837 447/889/838 +f 498/881/830 482/888/837 478/882/831 +f 457/883/832 447/889/838 434/890/839 +f 478/882/831 447/889/838 457/883/832 +f 449/884/833 434/890/839 430/891/840 +f 457/883/832 434/890/839 449/884/833 +f 600/885/834 680/843/792 610/892/841 +f 553/886/835 610/892/841 562/893/842 +f 600/885/834 610/892/841 553/886/835 +f 509/887/836 562/893/842 528/894/843 +f 553/886/835 562/893/842 509/887/836 +f 482/888/837 528/894/843 499/895/844 +f 509/887/836 528/894/843 482/888/837 +f 447/889/838 499/895/844 479/896/845 +f 482/888/837 499/895/844 447/889/838 +f 434/890/839 479/896/845 458/897/846 +f 447/889/838 479/896/845 434/890/839 +f 430/891/840 458/897/846 450/898/847 +f 434/890/839 458/897/846 430/891/840 +f 610/892/841 680/843/792 637/899/848 +f 562/893/842 637/899/848 603/900/849 +f 610/892/841 637/899/848 562/893/842 +f 528/894/843 603/900/849 573/901/850 +f 562/893/842 603/900/849 528/894/843 +f 499/895/844 573/901/850 557/902/851 +f 528/894/843 573/901/850 499/895/844 +f 479/896/845 557/902/851 552/903/852 +f 499/895/844 557/902/851 479/896/845 +f 458/897/846 552/903/852 544/904/853 +f 479/896/845 552/903/852 458/897/846 +f 450/898/847 544/904/853 537/905/854 +f 458/897/846 544/904/853 450/898/847 +f 637/899/848 680/843/792 681/906/855 +f 603/900/849 681/906/855 678/907/856 +f 637/899/848 681/906/855 603/900/849 +f 573/901/850 678/907/856 672/908/857 +f 603/900/849 678/907/856 573/901/850 +f 557/902/851 672/908/857 673/909/858 +f 573/901/850 672/908/857 557/902/851 +f 552/903/852 673/909/858 671/910/859 +f 557/902/851 673/909/858 552/903/852 +f 544/904/853 671/910/859 669/911/860 +f 552/903/852 671/910/859 544/904/853 +f 537/905/854 669/911/860 665/912/861 +f 544/904/853 669/911/860 537/905/854 +f 681/906/855 680/843/792 724/913/862 +f 678/907/856 724/913/862 748/914/863 +f 681/906/855 724/913/862 678/907/856 +f 672/908/857 748/914/863 782/915/864 +f 678/907/856 748/914/863 672/908/857 +f 673/909/858 782/915/864 797/916/865 +f 672/908/857 782/915/864 673/909/858 +f 671/910/859 797/916/865 806/917/866 +f 673/909/858 797/916/865 671/910/859 +f 669/911/860 806/917/866 813/918/867 +f 671/910/859 806/917/866 669/911/860 +f 665/912/861 813/918/867 821/919/868 +f 669/911/860 813/918/867 665/912/861 +f 724/913/862 680/843/792 741/920/869 +f 748/914/863 741/920/869 793/921/870 +f 724/913/862 741/920/869 748/914/863 +f 782/915/864 793/921/870 827/922/871 +f 748/914/863 793/921/870 782/915/864 +f 797/916/865 827/922/871 856/923/872 +f 782/915/864 827/922/871 797/916/865 +f 806/917/866 856/923/872 880/924/873 +f 797/916/865 856/923/872 806/917/866 +f 813/918/867 880/924/873 900/925/874 +f 806/917/866 880/924/873 813/918/867 +f 821/919/868 900/925/874 904/926/875 +f 813/918/867 900/925/874 821/919/868 +f 741/920/869 680/843/792 750/842/791 +f 793/921/870 750/842/791 802/845/794 +f 741/920/869 750/842/791 793/921/870 +f 827/922/871 802/845/794 845/847/796 +f 793/921/870 802/845/794 827/922/871 +f 856/923/872 845/847/796 873/849/798 +f 827/922/871 845/847/796 856/923/872 +f 880/924/873 873/849/798 905/851/800 +f 856/923/872 873/849/798 880/924/873 +f 900/925/874 905/851/800 918/853/802 +f 880/924/873 905/851/800 900/925/874 +f 904/926/875 918/853/802 921/855/804 +f 900/925/874 918/853/802 904/926/875 +f 444/927/876 403/928/877 438/929/878 +f 484/930/879 438/929/878 473/931/880 +f 444/927/876 438/929/878 484/930/879 +f 534/932/881 473/931/880 522/933/882 +f 484/930/879 473/931/880 534/932/881 +f 555/934/883 522/933/882 541/935/884 +f 534/932/881 522/933/882 555/934/883 +f 588/936/885 541/935/884 558/937/886 +f 555/934/883 541/935/884 588/936/885 +f 628/938/887 558/937/886 574/939/888 +f 588/936/885 558/937/886 628/938/887 +f 631/940/889 574/939/888 583/941/890 +f 628/938/887 574/939/888 631/940/889 +f 438/929/878 403/928/877 423/942/891 +f 473/931/880 423/942/891 443/943/892 +f 438/929/878 423/942/891 473/931/880 +f 522/933/882 443/943/892 461/944/893 +f 473/931/880 443/943/892 522/933/882 +f 541/935/884 461/944/893 480/945/894 +f 522/933/882 461/944/893 541/935/884 +f 558/937/886 480/945/894 490/946/895 +f 541/935/884 480/945/894 558/937/886 +f 574/939/888 490/946/895 494/947/896 +f 558/937/886 490/946/895 574/939/888 +f 583/941/890 494/947/896 505/948/897 +f 574/939/888 494/947/896 583/941/890 +f 423/942/891 403/928/877 401/949/898 +f 443/943/892 401/949/898 397/950/899 +f 423/942/891 401/949/898 443/943/892 +f 461/944/893 397/950/899 394/951/900 +f 443/943/892 397/950/899 461/944/893 +f 480/945/894 394/951/900 393/952/901 +f 461/944/893 394/951/900 480/945/894 +f 490/946/895 393/952/901 392/953/902 +f 480/945/894 393/952/901 490/946/895 +f 494/947/896 392/953/902 390/954/903 +f 490/946/895 392/953/902 494/947/896 +f 505/948/897 390/954/903 389/955/904 +f 494/947/896 390/954/903 505/948/897 +f 401/949/898 403/928/877 356/956/905 +f 397/950/899 356/956/905 322/957/906 +f 401/949/898 356/956/905 397/950/899 +f 394/951/900 322/957/906 290/958/907 +f 397/950/899 322/957/906 394/951/900 +f 393/952/901 290/958/907 259/959/908 +f 394/951/900 290/958/907 393/952/901 +f 392/953/902 259/959/908 229/960/909 +f 393/952/901 259/959/908 392/953/902 +f 390/954/903 229/960/909 214/961/910 +f 392/953/902 229/960/909 390/954/903 +f 389/955/904 214/961/910 210/962/911 +f 390/954/903 214/961/910 389/955/904 +f 356/956/905 403/928/877 343/963/912 +f 322/957/906 343/963/912 266/964/913 +f 356/956/905 343/963/912 322/957/906 +f 290/958/907 266/964/913 194/965/914 +f 322/957/906 266/964/913 290/958/907 +f 259/959/908 194/965/914 161/966/915 +f 290/958/907 194/965/914 259/959/908 +f 229/960/909 161/966/915 134/967/916 +f 259/959/908 161/966/915 229/960/909 +f 214/961/910 134/967/916 126/968/917 +f 229/960/909 134/967/916 214/961/910 +f 210/962/911 126/968/917 121/969/918 +f 214/961/910 126/968/917 210/962/911 +f 343/963/912 403/928/877 318/970/919 +f 266/964/913 318/970/919 250/971/920 +f 343/963/912 318/970/919 266/964/913 +f 194/965/914 250/971/920 173/972/921 +f 266/964/913 250/971/920 194/965/914 +f 161/966/915 173/972/921 140/973/922 +f 194/965/914 173/972/921 161/966/915 +f 134/967/916 140/973/922 120/974/923 +f 161/966/915 140/973/922 134/967/916 +f 126/968/917 120/974/923 107/975/924 +f 134/967/916 120/974/923 126/968/917 +f 121/969/918 107/975/924 103/976/925 +f 126/968/917 107/975/924 121/969/918 +f 318/970/919 403/928/877 344/977/926 +f 250/971/920 344/977/926 267/978/927 +f 318/970/919 344/977/926 250/971/920 +f 173/972/921 267/978/927 195/979/928 +f 250/971/920 267/978/927 173/972/921 +f 140/973/922 195/979/928 162/980/929 +f 173/972/921 195/979/928 140/973/922 +f 120/974/923 162/980/929 135/981/930 +f 140/973/922 162/980/929 120/974/923 +f 107/975/924 135/981/930 127/982/931 +f 120/974/923 135/981/930 107/975/924 +f 103/976/925 127/982/931 122/983/932 +f 107/975/924 127/982/931 103/976/925 +f 344/977/926 403/928/877 357/984/933 +f 267/978/927 357/984/933 323/985/934 +f 344/977/926 357/984/933 267/978/927 +f 195/979/928 323/985/934 291/986/935 +f 267/978/927 323/985/934 195/979/928 +f 162/980/929 291/986/935 260/987/936 +f 195/979/928 291/986/935 162/980/929 +f 135/981/930 260/987/936 230/988/937 +f 162/980/929 260/987/936 135/981/930 +f 127/982/931 230/988/937 215/989/938 +f 135/981/930 230/988/937 127/982/931 +f 122/983/932 215/989/938 211/990/939 +f 127/982/931 215/989/938 122/983/932 +f 357/984/933 403/928/877 404/991/940 +f 323/985/934 404/991/940 402/992/941 +f 357/984/933 404/991/940 323/985/934 +f 291/986/935 402/992/941 398/993/942 +f 323/985/934 402/992/941 291/986/935 +f 260/987/936 398/993/942 399/994/943 +f 291/986/935 398/993/942 260/987/936 +f 230/988/937 399/994/943 396/995/944 +f 260/987/936 399/994/943 230/988/937 +f 215/989/938 396/995/944 395/996/945 +f 230/988/937 396/995/944 215/989/938 +f 211/990/939 395/996/945 391/997/946 +f 215/989/938 395/996/945 211/990/939 +f 404/991/940 403/928/877 424/998/947 +f 402/992/941 424/998/947 442/999/948 +f 404/991/940 424/998/947 402/992/941 +f 398/993/942 442/999/948 462/1000/949 +f 402/992/941 442/999/948 398/993/942 +f 399/994/943 462/1000/949 481/1001/950 +f 398/993/942 462/1000/949 399/994/943 +f 396/995/944 481/1001/950 491/1002/951 +f 399/994/943 481/1001/950 396/995/944 +f 395/996/945 491/1002/951 495/1003/952 +f 396/995/944 491/1002/951 395/996/945 +f 391/997/946 495/1003/952 506/1004/953 +f 395/996/945 495/1003/952 391/997/946 +f 424/998/947 403/928/877 439/1005/954 +f 442/999/948 439/1005/954 474/1006/955 +f 424/998/947 439/1005/954 442/999/948 +f 462/1000/949 474/1006/955 523/1007/956 +f 442/999/948 474/1006/955 462/1000/949 +f 481/1001/950 523/1007/956 542/1008/957 +f 462/1000/949 523/1007/956 481/1001/950 +f 491/1002/951 542/1008/957 559/1009/958 +f 481/1001/950 542/1008/957 491/1002/951 +f 495/1003/952 559/1009/958 575/1010/959 +f 491/1002/951 559/1009/958 495/1003/952 +f 506/1004/953 575/1010/959 584/1011/960 +f 495/1003/952 575/1010/959 506/1004/953 +f 439/1005/954 403/928/877 444/927/876 +f 474/1006/955 444/927/876 484/930/879 +f 439/1005/954 444/927/876 474/1006/955 +f 523/1007/956 484/930/879 534/932/881 +f 474/1006/955 484/930/879 523/1007/956 +f 542/1008/957 534/932/881 555/934/883 +f 523/1007/956 534/932/881 542/1008/957 +f 559/1009/958 555/934/883 588/936/885 +f 542/1008/957 555/934/883 559/1009/958 +f 575/1010/959 588/936/885 628/938/887 +f 559/1009/958 588/936/885 575/1010/959 +f 584/1011/960 628/938/887 631/940/889 +f 575/1010/959 628/938/887 584/1011/960 +f 1035/1012/961 966/1013/877 1008/1014/878 +f 1104/1015/879 1008/1014/878 1086/1016/880 +f 1035/1012/961 1008/1014/878 1104/1015/879 +f 1179/1017/962 1086/1016/880 1156/1018/882 +f 1104/1015/879 1086/1016/880 1179/1017/962 +f 1210/1019/883 1156/1018/882 1188/1020/884 +f 1179/1017/962 1156/1018/882 1210/1019/883 +f 1232/1021/885 1188/1020/884 1215/1022/886 +f 1210/1019/883 1188/1020/884 1232/1021/885 +f 1247/1023/887 1215/1022/886 1225/1024/888 +f 1232/1021/885 1215/1022/886 1247/1023/887 +f 1251/1025/889 1225/1024/888 1229/1026/963 +f 1247/1023/887 1225/1024/888 1251/1025/889 +f 1008/1014/878 966/1013/877 997/1027/964 +f 1086/1016/880 997/1027/964 1029/1028/892 +f 1008/1014/878 997/1027/964 1086/1016/880 +f 1156/1018/882 1029/1028/892 1064/1029/965 +f 1086/1016/880 1029/1028/892 1156/1018/882 +f 1188/1020/884 1064/1029/965 1092/1030/894 +f 1156/1018/882 1064/1029/965 1188/1020/884 +f 1215/1022/886 1092/1030/894 1122/1031/895 +f 1188/1020/884 1092/1030/894 1215/1022/886 +f 1225/1024/888 1122/1031/895 1142/1032/896 +f 1215/1022/886 1122/1031/895 1225/1024/888 +f 1229/1026/963 1142/1032/896 1144/1033/897 +f 1225/1024/888 1142/1032/896 1229/1026/963 +f 997/1027/964 966/1013/877 964/1034/966 +f 1029/1028/892 964/1034/966 960/1035/899 +f 997/1027/964 964/1034/966 1029/1028/892 +f 1064/1029/965 960/1035/899 957/1036/900 +f 1029/1028/892 960/1035/899 1064/1029/965 +f 1092/1030/894 957/1036/900 956/1037/901 +f 1064/1029/965 957/1036/900 1092/1030/894 +f 1122/1031/895 956/1037/901 955/1038/902 +f 1092/1030/894 956/1037/901 1122/1031/895 +f 1142/1032/896 955/1038/902 953/1039/903 +f 1122/1031/895 955/1038/902 1142/1032/896 +f 1144/1033/897 953/1039/903 952/1040/967 +f 1142/1032/896 953/1039/903 1144/1033/897 +f 964/1034/966 966/1013/877 926/1041/905 +f 960/1035/899 926/1041/905 910/1042/906 +f 964/1034/966 926/1041/905 960/1035/899 +f 957/1036/900 910/1042/906 890/1043/968 +f 960/1035/899 910/1042/906 957/1036/900 +f 956/1037/901 890/1043/968 877/1044/908 +f 957/1036/900 890/1043/968 956/1037/901 +f 955/1038/902 877/1044/908 861/1045/909 +f 956/1037/901 877/1044/908 955/1038/902 +f 953/1039/903 861/1045/909 859/1046/910 +f 955/1038/902 861/1045/909 953/1039/903 +f 952/1040/967 859/1046/910 848/1047/911 +f 953/1039/903 859/1046/910 952/1040/967 +f 926/1041/905 966/1013/877 913/1048/912 +f 910/1042/906 913/1048/912 881/1049/969 +f 926/1041/905 913/1048/912 910/1042/906 +f 890/1043/968 881/1049/969 836/1050/970 +f 910/1042/906 881/1049/969 890/1043/968 +f 877/1044/908 836/1050/970 814/1051/915 +f 890/1043/968 836/1050/970 877/1044/908 +f 861/1045/909 814/1051/915 794/1052/916 +f 877/1044/908 814/1051/915 861/1045/909 +f 859/1046/910 794/1052/916 779/1053/971 +f 861/1045/909 794/1052/916 859/1046/910 +f 848/1047/911 779/1053/971 768/1054/918 +f 859/1046/910 779/1053/971 848/1047/911 +f 913/1048/912 966/1013/877 909/1055/919 +f 881/1049/969 909/1055/919 869/1056/920 +f 913/1048/912 909/1055/919 881/1049/969 +f 836/1050/970 869/1056/920 822/1057/921 +f 881/1049/969 869/1056/920 836/1050/970 +f 814/1051/915 822/1057/921 798/1058/922 +f 836/1050/970 822/1057/921 814/1051/915 +f 794/1052/916 798/1058/922 763/1059/972 +f 814/1051/915 798/1058/922 794/1052/916 +f 779/1053/971 763/1059/972 735/1060/924 +f 794/1052/916 763/1059/972 779/1053/971 +f 768/1054/918 735/1060/924 732/1061/925 +f 779/1053/971 735/1060/924 768/1054/918 +f 909/1055/919 966/1013/877 914/1062/973 +f 869/1056/920 914/1062/973 882/1063/927 +f 909/1055/919 914/1062/973 869/1056/920 +f 822/1057/921 882/1063/927 837/1064/928 +f 869/1056/920 882/1063/927 822/1057/921 +f 798/1058/922 837/1064/928 815/1065/929 +f 822/1057/921 837/1064/928 798/1058/922 +f 763/1059/972 815/1065/929 795/1066/930 +f 798/1058/922 815/1065/929 763/1059/972 +f 735/1060/924 795/1066/930 780/1067/931 +f 763/1059/972 795/1066/930 735/1060/924 +f 732/1061/925 780/1067/931 769/1068/932 +f 735/1060/924 780/1067/931 732/1061/925 +f 914/1062/973 966/1013/877 927/1069/933 +f 882/1063/927 927/1069/933 911/1070/934 +f 914/1062/973 927/1069/933 882/1063/927 +f 837/1064/928 911/1070/934 891/1071/974 +f 882/1063/927 911/1070/934 837/1064/928 +f 815/1065/929 891/1071/974 878/1072/936 +f 837/1064/928 891/1071/974 815/1065/929 +f 795/1066/930 878/1072/936 862/1073/937 +f 815/1065/929 878/1072/936 795/1066/930 +f 780/1067/931 862/1073/937 860/1074/975 +f 795/1066/930 862/1073/937 780/1067/931 +f 769/1068/932 860/1074/975 849/1075/939 +f 780/1067/931 860/1074/975 769/1068/932 +f 927/1069/933 966/1013/877 967/1076/976 +f 911/1070/934 967/1076/976 965/1077/977 +f 927/1069/933 967/1076/976 911/1070/934 +f 891/1071/974 965/1077/977 961/1078/942 +f 911/1070/934 965/1077/977 891/1071/974 +f 878/1072/936 961/1078/942 962/1079/943 +f 891/1071/974 961/1078/942 878/1072/936 +f 862/1073/937 962/1079/943 959/1080/944 +f 878/1072/936 962/1079/943 862/1073/937 +f 860/1074/975 959/1080/944 958/1081/945 +f 862/1073/937 959/1080/944 860/1074/975 +f 849/1075/939 958/1081/945 954/1082/946 +f 860/1074/975 958/1081/945 849/1075/939 +f 967/1076/976 966/1013/877 998/1083/978 +f 965/1077/977 998/1083/978 1028/1084/948 +f 967/1076/976 998/1083/978 965/1077/977 +f 961/1078/942 1028/1084/948 1065/1085/949 +f 965/1077/977 1028/1084/948 961/1078/942 +f 962/1079/943 1065/1085/949 1093/1086/979 +f 961/1078/942 1065/1085/949 962/1079/943 +f 959/1080/944 1093/1086/979 1123/1087/951 +f 962/1079/943 1093/1086/979 959/1080/944 +f 958/1081/945 1123/1087/951 1143/1088/952 +f 959/1080/944 1123/1087/951 958/1081/945 +f 954/1082/946 1143/1088/952 1145/1089/953 +f 958/1081/945 1143/1088/952 954/1082/946 +f 998/1083/978 966/1013/877 1009/1090/954 +f 1028/1084/948 1009/1090/954 1087/1091/955 +f 998/1083/978 1009/1090/954 1028/1084/948 +f 1065/1085/949 1087/1091/955 1157/1092/980 +f 1028/1084/948 1087/1091/955 1065/1085/949 +f 1093/1086/979 1157/1092/980 1189/1093/957 +f 1065/1085/949 1157/1092/980 1093/1086/979 +f 1123/1087/951 1189/1093/957 1216/1094/958 +f 1093/1086/979 1189/1093/957 1123/1087/951 +f 1143/1088/952 1216/1094/958 1224/1095/959 +f 1123/1087/951 1216/1094/958 1143/1088/952 +f 1145/1089/953 1224/1095/959 1230/1096/981 +f 1143/1088/952 1224/1095/959 1145/1089/953 +f 1009/1090/954 966/1013/877 1035/1012/961 +f 1087/1091/955 1035/1012/961 1104/1015/879 +f 1009/1090/954 1035/1012/961 1087/1091/955 +f 1157/1092/980 1104/1015/879 1179/1017/962 +f 1087/1091/955 1104/1015/879 1157/1092/980 +f 1189/1093/957 1179/1017/962 1210/1019/883 +f 1157/1092/980 1179/1017/962 1189/1093/957 +f 1216/1094/958 1210/1019/883 1232/1021/885 +f 1189/1093/957 1210/1019/883 1216/1094/958 +f 1224/1095/959 1232/1021/885 1247/1023/887 +f 1216/1094/958 1232/1021/885 1224/1095/959 +f 1230/1096/981 1247/1023/887 1251/1025/889 +f 1224/1095/959 1247/1023/887 1230/1096/981 +f 1096/1097/982 1079/1098/983 1090/1099/984 +f 1136/1100/985 1090/1099/984 1100/1101/986 +f 1096/1097/982 1090/1099/984 1136/1100/985 +f 1152/1102/987 1100/1101/986 1119/1103/988 +f 1136/1100/985 1100/1101/986 1152/1102/987 +f 1168/1104/989 1119/1103/988 1134/1105/990 +f 1152/1102/987 1119/1103/988 1168/1104/989 +f 1090/1099/984 1079/1098/983 1078/1106/991 +f 1100/1101/986 1078/1106/991 1076/1107/992 +f 1090/1099/984 1078/1106/991 1100/1101/986 +f 1119/1103/988 1076/1107/992 1073/1108/993 +f 1100/1101/986 1076/1107/992 1119/1103/988 +f 1134/1105/990 1073/1108/993 1071/1109/994 +f 1119/1103/988 1073/1108/993 1134/1105/990 +f 1078/1106/991 1079/1098/983 1059/1110/995 +f 1076/1107/992 1059/1110/995 1050/1111/996 +f 1078/1106/991 1059/1110/995 1076/1107/992 +f 1073/1108/993 1050/1111/996 1037/1112/997 +f 1076/1107/992 1050/1111/996 1073/1108/993 +f 1071/1109/994 1037/1112/997 1026/1113/998 +f 1073/1108/993 1037/1112/997 1071/1109/994 +f 1059/1110/995 1079/1098/983 1054/1114/999 +f 1050/1111/996 1054/1114/999 1022/1115/1000 +f 1059/1110/995 1054/1114/999 1050/1111/996 +f 1037/1112/997 1022/1115/1000 1000/1116/1001 +f 1050/1111/996 1022/1115/1000 1037/1112/997 +f 1026/1113/998 1000/1116/1001 994/1117/1002 +f 1037/1112/997 1000/1116/1001 1026/1113/998 +f 1054/1114/999 1079/1098/983 1048/1118/1003 +f 1022/1115/1000 1048/1118/1003 1004/1119/1004 +f 1054/1114/999 1048/1118/1003 1022/1115/1000 +f 1000/1116/1001 1004/1119/1004 990/1120/1005 +f 1022/1115/1000 1004/1119/1004 1000/1116/1001 +f 994/1117/1002 990/1120/1005 971/1121/1006 +f 1000/1116/1001 990/1120/1005 994/1117/1002 +f 1048/1118/1003 1079/1098/983 1042/1122/1007 +f 1004/1119/1004 1042/1122/1007 1001/1123/1008 +f 1048/1118/1003 1042/1122/1007 1004/1119/1004 +f 990/1120/1005 1001/1123/1008 981/1124/1009 +f 1004/1119/1004 1001/1123/1008 990/1120/1005 +f 971/1121/1006 981/1124/1009 948/1125/1010 +f 990/1120/1005 981/1124/1009 971/1121/1006 +f 1042/1122/1007 1079/1098/983 1047/1126/1011 +f 1001/1123/1008 1047/1126/1011 1003/1127/1012 +f 1042/1122/1007 1047/1126/1011 1001/1123/1008 +f 981/1124/1009 1003/1127/1012 989/1128/1013 +f 1001/1123/1008 1003/1127/1012 981/1124/1009 +f 948/1125/1010 989/1128/1013 970/1129/1014 +f 981/1124/1009 989/1128/1013 948/1125/1010 +f 1047/1126/1011 1079/1098/983 1053/1130/1015 +f 1003/1127/1012 1053/1130/1015 1021/1131/1016 +f 1047/1126/1011 1053/1130/1015 1003/1127/1012 +f 989/1128/1013 1021/1131/1016 999/1132/1017 +f 1003/1127/1012 1021/1131/1016 989/1128/1013 +f 970/1129/1014 999/1132/1017 993/1133/1018 +f 989/1128/1013 999/1132/1017 970/1129/1014 +f 1053/1130/1015 1079/1098/983 1058/1134/1019 +f 1021/1131/1016 1058/1134/1019 1049/1135/1020 +f 1053/1130/1015 1058/1134/1019 1021/1131/1016 +f 999/1132/1017 1049/1135/1020 1036/1136/1021 +f 1021/1131/1016 1049/1135/1020 999/1132/1017 +f 993/1133/1018 1036/1136/1021 1025/1137/1022 +f 999/1132/1017 1036/1136/1021 993/1133/1018 +f 1058/1134/1019 1079/1098/983 1077/1138/1023 +f 1049/1135/1020 1077/1138/1023 1075/1139/1024 +f 1058/1134/1019 1077/1138/1023 1049/1135/1020 +f 1036/1136/1021 1075/1139/1024 1072/1140/1025 +f 1049/1135/1020 1075/1139/1024 1036/1136/1021 +f 1025/1137/1022 1072/1140/1025 1070/1141/1026 +f 1036/1136/1021 1072/1140/1025 1025/1137/1022 +f 1077/1138/1023 1079/1098/983 1089/1142/1027 +f 1075/1139/1024 1089/1142/1027 1099/1143/1028 +f 1077/1138/1023 1089/1142/1027 1075/1139/1024 +f 1072/1140/1025 1099/1143/1028 1118/1144/1029 +f 1075/1139/1024 1099/1143/1028 1072/1140/1025 +f 1070/1141/1026 1118/1144/1029 1133/1145/1030 +f 1072/1140/1025 1118/1144/1029 1070/1141/1026 +f 1089/1142/1027 1079/1098/983 1095/1146/1031 +f 1099/1143/1028 1095/1146/1031 1135/1147/1032 +f 1089/1142/1027 1095/1146/1031 1099/1143/1028 +f 1118/1144/1029 1135/1147/1032 1151/1148/1033 +f 1099/1143/1028 1135/1147/1032 1118/1144/1029 +f 1133/1145/1030 1151/1148/1033 1167/1149/1034 +f 1118/1144/1029 1151/1148/1033 1133/1145/1030 +f 1095/1146/1031 1079/1098/983 1105/1150/1035 +f 1135/1147/1032 1105/1150/1035 1147/1151/1036 +f 1095/1146/1031 1105/1150/1035 1135/1147/1032 +f 1151/1148/1033 1147/1151/1036 1171/1152/1037 +f 1135/1147/1032 1147/1151/1036 1151/1148/1033 +f 1167/1149/1034 1171/1152/1037 1185/1153/1038 +f 1151/1148/1033 1171/1152/1037 1167/1149/1034 +f 1105/1150/1035 1079/1098/983 1113/1154/1039 +f 1147/1151/1036 1113/1154/1039 1150/1155/1040 +f 1105/1150/1035 1113/1154/1039 1147/1151/1036 +f 1171/1152/1037 1150/1155/1040 1175/1156/1041 +f 1147/1151/1036 1150/1155/1040 1171/1152/1037 +f 1185/1153/1038 1175/1156/1041 1194/1157/1042 +f 1171/1152/1037 1175/1156/1041 1185/1153/1038 +f 1113/1154/1039 1079/1098/983 1106/1158/1043 +f 1150/1155/1040 1106/1158/1043 1148/1159/1044 +f 1113/1154/1039 1106/1158/1043 1150/1155/1040 +f 1175/1156/1041 1148/1159/1044 1172/1160/1045 +f 1150/1155/1040 1148/1159/1044 1175/1156/1041 +f 1194/1157/1042 1172/1160/1045 1186/1161/1046 +f 1175/1156/1041 1172/1160/1045 1194/1157/1042 +f 1106/1158/1043 1079/1098/983 1096/1097/982 +f 1148/1159/1044 1096/1097/982 1136/1100/985 +f 1106/1158/1043 1096/1097/982 1148/1159/1044 +f 1172/1160/1045 1136/1100/985 1152/1102/987 +f 1148/1159/1044 1136/1100/985 1172/1160/1045 +f 1186/1161/1046 1152/1102/987 1168/1104/989 +f 1172/1160/1045 1152/1102/987 1186/1161/1046 +f 301/1162/1047 284/1163/1048 296/1164/984 +f 331/1165/985 296/1164/984 305/1166/1049 +f 301/1162/1047 296/1164/984 331/1165/985 +f 355/1167/1050 305/1166/1049 315/1168/988 +f 331/1165/985 305/1166/1049 355/1167/1050 +f 361/1169/989 315/1168/988 327/1170/1051 +f 355/1167/1050 315/1168/988 361/1169/989 +f 296/1164/984 284/1163/1048 283/1171/991 +f 305/1166/1049 283/1171/991 281/1172/992 +f 296/1164/984 283/1171/991 305/1166/1049 +f 315/1168/988 281/1172/992 278/1173/993 +f 305/1166/1049 281/1172/992 315/1168/988 +f 327/1170/1051 278/1173/993 276/1174/994 +f 315/1168/988 278/1173/993 327/1170/1051 +f 283/1171/991 284/1163/1048 263/1175/995 +f 281/1172/992 263/1175/995 253/1176/1052 +f 283/1171/991 263/1175/995 281/1172/992 +f 278/1173/993 253/1176/1052 231/1177/1053 +f 281/1172/992 253/1176/1052 278/1173/993 +f 276/1174/994 231/1177/1053 220/1178/998 +f 278/1173/993 231/1177/1053 276/1174/994 +f 263/1175/995 284/1163/1048 257/1179/999 +f 253/1176/1052 257/1179/999 218/1180/1000 +f 263/1175/995 257/1179/999 253/1176/1052 +f 231/1177/1053 218/1180/1000 199/1181/1054 +f 253/1176/1052 218/1180/1000 231/1177/1053 +f 220/1178/998 199/1181/1054 186/1182/1055 +f 231/1177/1053 199/1181/1054 220/1178/998 +f 257/1179/999 284/1163/1048 249/1183/1003 +f 218/1180/1000 249/1183/1003 208/1184/1056 +f 257/1179/999 249/1183/1003 218/1180/1000 +f 199/1181/1054 208/1184/1056 178/1185/1005 +f 218/1180/1000 208/1184/1056 199/1181/1054 +f 186/1182/1055 178/1185/1005 166/1186/1006 +f 199/1181/1054 178/1185/1005 186/1182/1055 +f 249/1183/1003 284/1163/1048 241/1187/1057 +f 208/1184/1056 241/1187/1057 201/1188/1058 +f 249/1183/1003 241/1187/1057 208/1184/1056 +f 178/1185/1005 201/1188/1058 176/1189/1009 +f 208/1184/1056 201/1188/1058 178/1185/1005 +f 166/1186/1006 176/1189/1009 160/1190/1010 +f 178/1185/1005 176/1189/1009 166/1186/1006 +f 241/1187/1057 284/1163/1048 248/1191/1011 +f 201/1188/1058 248/1191/1011 207/1192/1012 +f 241/1187/1057 248/1191/1011 201/1188/1058 +f 176/1189/1009 207/1192/1012 177/1193/1059 +f 201/1188/1058 207/1192/1012 176/1189/1009 +f 160/1190/1010 177/1193/1059 165/1194/1014 +f 176/1189/1009 177/1193/1059 160/1190/1010 +f 248/1191/1011 284/1163/1048 256/1195/1015 +f 207/1192/1012 256/1195/1015 217/1196/1016 +f 248/1191/1011 256/1195/1015 207/1192/1012 +f 177/1193/1059 217/1196/1016 200/1197/1060 +f 207/1192/1012 217/1196/1016 177/1193/1059 +f 165/1194/1014 200/1197/1060 185/1198/1018 +f 177/1193/1059 200/1197/1060 165/1194/1014 +f 256/1195/1015 284/1163/1048 262/1199/1019 +f 217/1196/1016 262/1199/1019 252/1200/1020 +f 256/1195/1015 262/1199/1019 217/1196/1016 +f 200/1197/1060 252/1200/1020 232/1201/1061 +f 217/1196/1016 252/1200/1020 200/1197/1060 +f 185/1198/1018 232/1201/1061 219/1202/1022 +f 200/1197/1060 232/1201/1061 185/1198/1018 +f 262/1199/1019 284/1163/1048 282/1203/1023 +f 252/1200/1020 282/1203/1023 280/1204/1024 +f 262/1199/1019 282/1203/1023 252/1200/1020 +f 232/1201/1061 280/1204/1024 277/1205/1062 +f 252/1200/1020 280/1204/1024 232/1201/1061 +f 219/1202/1022 277/1205/1062 275/1206/1063 +f 232/1201/1061 277/1205/1062 219/1202/1022 +f 282/1203/1023 284/1163/1048 295/1207/1027 +f 280/1204/1024 295/1207/1027 304/1208/1064 +f 282/1203/1023 295/1207/1027 280/1204/1024 +f 277/1205/1062 304/1208/1064 314/1209/1029 +f 280/1204/1024 304/1208/1064 277/1205/1062 +f 275/1206/1063 314/1209/1029 326/1210/1065 +f 277/1205/1062 314/1209/1029 275/1206/1063 +f 295/1207/1027 284/1163/1048 300/1211/1066 +f 304/1208/1064 300/1211/1066 330/1212/1032 +f 295/1207/1027 300/1211/1066 304/1208/1064 +f 314/1209/1029 330/1212/1032 354/1213/1033 +f 304/1208/1064 330/1212/1032 314/1209/1029 +f 326/1210/1065 354/1213/1033 360/1214/1034 +f 314/1209/1029 354/1213/1033 326/1210/1065 +f 300/1211/1066 284/1163/1048 306/1215/1035 +f 330/1212/1032 306/1215/1035 347/1216/1067 +f 300/1211/1066 306/1215/1035 330/1212/1032 +f 354/1213/1033 347/1216/1067 370/1217/1068 +f 330/1212/1032 347/1216/1067 354/1213/1033 +f 360/1214/1034 370/1217/1068 382/1218/1038 +f 354/1213/1033 370/1217/1068 360/1214/1034 +f 306/1215/1035 284/1163/1048 311/1219/1039 +f 347/1216/1067 311/1219/1039 351/1220/1069 +f 306/1215/1035 311/1219/1039 347/1216/1067 +f 370/1217/1068 351/1220/1069 373/1221/1070 +f 347/1216/1067 351/1220/1069 370/1217/1068 +f 382/1218/1038 373/1221/1070 406/1222/1071 +f 370/1217/1068 373/1221/1070 382/1218/1038 +f 311/1219/1039 284/1163/1048 307/1223/1072 +f 351/1220/1069 307/1223/1072 348/1224/1073 +f 311/1219/1039 307/1223/1072 351/1220/1069 +f 373/1221/1070 348/1224/1073 371/1225/1074 +f 351/1220/1069 348/1224/1073 373/1221/1070 +f 406/1222/1071 371/1225/1074 383/1226/1075 +f 373/1221/1070 371/1225/1074 406/1222/1071 +f 307/1223/1072 284/1163/1048 301/1162/1047 +f 348/1224/1073 301/1162/1047 331/1165/985 +f 307/1223/1072 301/1162/1047 348/1224/1073 +f 371/1225/1074 331/1165/985 355/1167/1050 +f 348/1224/1073 331/1165/985 371/1225/1074 +f 383/1226/1075 355/1167/1050 361/1169/989 +f 371/1225/1074 355/1167/1050 383/1226/1075 +f 1080/1227/1076 1250/1228/1077 1249/580/561 +f 1081/1229/1076 1250/1228/1077 1080/1227/1076 +f 1249/580/561 1279/1230/1078 1278/592/573 +f 1250/1228/1077 1279/1230/1078 1249/580/561 +f 1278/592/573 1286/1231/1079 1285/598/579 +f 1279/1230/1078 1286/1231/1079 1278/592/573 +f 1285/598/579 1290/1232/1080 1289/1233/1080 +f 1286/1231/1079 1290/1232/1080 1285/598/579 +f 1289/1233/1080 1288/1234/1081 1287/1235/1081 +f 1290/1232/1080 1288/1234/1081 1289/1233/1080 +f 1287/1235/1081 1283/1236/1082 1282/1237/1082 +f 1288/1234/1081 1283/1236/1082 1287/1235/1081 +f 1282/1237/1082 1281/1238/1083 1280/604/585 +f 1283/1236/1082 1281/1238/1083 1282/1237/1082 +f 1280/604/585 1242/1239/1084 1241/1240/1084 +f 1281/1238/1083 1242/1239/1084 1280/604/585 +f 1241/1240/1084 1081/1229/1076 1080/1227/1076 +f 1242/1239/1084 1081/1229/1076 1241/1240/1084 +f 273/1241/1085 104/521/502 105/1242/1086 +f 274/1243/1085 273/1241/1085 105/1242/1086 +f 104/521/502 75/532/513 76/1244/1087 +f 105/1242/1086 104/521/502 76/1244/1087 +f 75/532/513 66/538/519 67/1245/1088 +f 76/1244/1087 75/532/513 67/1245/1088 +f 66/538/519 62/1246/1089 63/1247/1089 +f 67/1245/1088 66/538/519 63/1247/1089 +f 62/1246/1089 64/1248/1090 65/1249/1090 +f 63/1247/1089 62/1246/1089 65/1249/1090 +f 64/1248/1090 68/1250/1091 69/1251/1091 +f 65/1249/1090 64/1248/1090 69/1251/1091 +f 68/1250/1091 72/544/525 73/1252/1092 +f 69/1251/1091 68/1250/1091 73/1252/1092 +f 72/544/525 113/1253/1093 114/1254/1093 +f 73/1252/1092 72/544/525 114/1254/1093 +f 113/1253/1093 273/1241/1085 274/1243/1085 +f 114/1254/1093 113/1253/1093 274/1243/1085 +f 1097/1255/1094 1074/1256/1095 1084/1257/1096 +f 1184/1258/1097 1084/1257/1096 1121/1259/1098 +f 1097/1255/1094 1084/1257/1096 1184/1258/1097 +f 1181/1260/1099 1121/1259/1098 1120/1261/1100 +f 1184/1258/1097 1121/1259/1098 1181/1260/1099 +f 1170/1262/1048 1120/1261/1100 1110/1263/1048 +f 1181/1260/1099 1120/1261/1100 1170/1262/1048 +f 1084/1257/1096 1074/1256/1095 1060/1264/1101 +f 1121/1259/1098 1060/1264/1101 1032/1265/1102 +f 1084/1257/1096 1060/1264/1101 1121/1259/1098 +f 1120/1261/1100 1032/1265/1102 1034/1266/1103 +f 1121/1259/1098 1032/1265/1102 1120/1261/1100 +f 1110/1263/1048 1034/1266/1103 1041/1267/1048 +f 1120/1261/1100 1034/1266/1103 1110/1263/1048 +f 1060/1264/1101 1074/1256/1095 1051/1268/1104 +f 1032/1265/1102 1051/1268/1104 969/1269/1105 +f 1060/1264/1101 1051/1268/1104 1032/1265/1102 +f 1034/1266/1103 969/1269/1105 974/1270/1106 +f 1032/1265/1102 969/1269/1105 1034/1266/1103 +f 1041/1267/1048 974/1270/1106 991/1271/1048 +f 1034/1266/1103 974/1270/1106 1041/1267/1048 +f 1051/1268/1104 1074/1256/1095 1043/1272/1107 +f 969/1269/1105 1043/1272/1107 925/1273/1108 +f 1051/1268/1104 1043/1272/1107 969/1269/1105 +f 974/1270/1106 925/1273/1108 929/1274/1109 +f 969/1269/1105 925/1273/1108 974/1270/1106 +f 991/1271/1048 929/1274/1109 943/1275/1048 +f 974/1270/1106 929/1274/1109 991/1271/1048 +f 1043/1272/1107 1074/1256/1095 1044/1276/1110 +f 925/1273/1108 1044/1276/1110 928/1277/1111 +f 1043/1272/1107 1044/1276/1110 925/1273/1108 +f 929/1274/1109 928/1277/1111 932/1278/1112 +f 925/1273/1108 928/1277/1111 929/1274/1109 +f 943/1275/1048 932/1278/1112 944/1279/983 +f 929/1274/1109 932/1278/1112 943/1275/1048 +f 1044/1276/1110 1074/1256/1095 1052/1280/1113 +f 928/1277/1111 1052/1280/1113 975/1281/1114 +f 1044/1276/1110 1052/1280/1113 928/1277/1111 +f 932/1278/1112 975/1281/1114 976/1282/1115 +f 928/1277/1111 975/1281/1114 932/1278/1112 +f 944/1279/983 976/1282/1115 992/1283/983 +f 932/1278/1112 976/1282/1115 944/1279/983 +f 1052/1280/1113 1074/1256/1095 1061/1284/1116 +f 975/1281/1114 1061/1284/1116 1039/1285/1117 +f 1052/1280/1113 1061/1284/1116 975/1281/1114 +f 976/1282/1115 1039/1285/1117 1040/1286/1118 +f 975/1281/1114 1039/1285/1117 976/1282/1115 +f 992/1283/983 1040/1286/1118 1046/1287/1048 +f 976/1282/1115 1040/1286/1118 992/1283/983 +f 1061/1284/1116 1074/1256/1095 1085/1288/1119 +f 1039/1285/1117 1085/1288/1119 1128/1289/1120 +f 1061/1284/1116 1085/1288/1119 1039/1285/1117 +f 1040/1286/1118 1128/1289/1120 1127/1290/1121 +f 1039/1285/1117 1128/1289/1120 1040/1286/1118 +f 1046/1287/1048 1127/1290/1121 1115/1291/1122 +f 1040/1286/1118 1127/1290/1121 1046/1287/1048 +f 1085/1288/1119 1074/1256/1095 1098/1292/1123 +f 1128/1289/1120 1098/1292/1123 1190/1293/1124 +f 1085/1288/1119 1098/1292/1123 1128/1289/1120 +f 1127/1290/1121 1190/1293/1124 1187/1294/1125 +f 1128/1289/1120 1190/1293/1124 1127/1290/1121 +f 1115/1291/1122 1187/1294/1125 1173/1295/1048 +f 1127/1290/1121 1187/1294/1125 1115/1291/1122 +f 1098/1292/1123 1074/1256/1095 1112/1296/1126 +f 1190/1293/1124 1112/1296/1126 1217/1297/1127 +f 1098/1292/1123 1112/1296/1126 1190/1293/1124 +f 1187/1294/1125 1217/1297/1127 1212/1298/1128 +f 1190/1293/1124 1217/1297/1127 1187/1294/1125 +f 1173/1295/1048 1212/1298/1128 1198/1299/1048 +f 1187/1294/1125 1212/1298/1128 1173/1295/1048 +f 1112/1296/1126 1074/1256/1095 1111/1300/1129 +f 1217/1297/1127 1111/1300/1129 1214/1301/1130 +f 1112/1296/1126 1111/1300/1129 1217/1297/1127 +f 1212/1298/1128 1214/1301/1130 1211/1302/1131 +f 1217/1297/1127 1214/1301/1130 1212/1298/1128 +f 1198/1299/1048 1211/1302/1131 1195/1303/1048 +f 1212/1298/1128 1211/1302/1131 1198/1299/1048 +f 1111/1300/1129 1074/1256/1095 1097/1255/1094 +f 1214/1301/1130 1097/1255/1094 1184/1258/1097 +f 1111/1300/1129 1097/1255/1094 1214/1301/1130 +f 1211/1302/1131 1184/1258/1097 1181/1260/1099 +f 1214/1301/1130 1184/1258/1097 1211/1302/1131 +f 1195/1303/1048 1181/1260/1099 1170/1262/1048 +f 1211/1302/1131 1181/1260/1099 1195/1303/1048 +f 302/1304/1132 279/1305/1095 293/1306/1133 +f 380/1307/1097 293/1306/1133 317/1308/1098 +f 302/1304/1132 293/1306/1133 380/1307/1097 +f 379/1309/1134 317/1308/1098 316/1310/1135 +f 380/1307/1097 317/1308/1098 379/1309/1134 +f 369/1311/1136 316/1310/1135 308/1312/1137 +f 379/1309/1134 316/1310/1135 369/1311/1136 +f 369/1311/1136 308/1312/1137 285/1313/1138 +f 293/1306/1133 279/1305/1095 269/1314/1139 +f 317/1308/1098 269/1314/1139 226/1315/1102 +f 293/1306/1133 269/1314/1139 317/1308/1098 +f 316/1310/1135 226/1315/1102 228/1316/1103 +f 317/1308/1098 226/1315/1102 316/1310/1135 +f 308/1312/1137 228/1316/1103 239/1317/1140 +f 316/1310/1135 228/1316/1103 308/1312/1137 +f 308/1312/1137 239/1317/1140 285/1313/1138 +f 269/1314/1139 279/1305/1095 254/1318/1104 +f 226/1315/1102 254/1318/1104 163/1319/1105 +f 269/1314/1139 254/1318/1104 226/1315/1102 +f 228/1316/1103 163/1319/1105 167/1320/1106 +f 226/1315/1102 163/1319/1105 228/1316/1103 +f 239/1317/1140 167/1320/1106 179/1321/1141 +f 228/1316/1103 167/1320/1106 239/1317/1140 +f 239/1317/1140 179/1321/1141 285/1313/1138 +f 254/1318/1104 279/1305/1095 242/1322/1107 +f 163/1319/1105 242/1322/1107 136/1323/1108 +f 254/1318/1104 242/1322/1107 163/1319/1105 +f 167/1320/1106 136/1323/1108 138/1324/1142 +f 163/1319/1105 136/1323/1108 167/1320/1106 +f 179/1321/1141 138/1324/1142 156/1325/1143 +f 167/1320/1106 138/1324/1142 179/1321/1141 +f 179/1321/1141 156/1325/1143 285/1313/1138 +f 242/1322/1107 279/1305/1095 243/1326/1144 +f 136/1323/1108 243/1326/1144 137/1327/1145 +f 242/1322/1107 243/1326/1144 136/1323/1108 +f 138/1324/1142 137/1327/1145 139/1328/1146 +f 136/1323/1108 137/1327/1145 138/1324/1142 +f 156/1325/1143 139/1328/1146 158/1329/1147 +f 138/1324/1142 139/1328/1146 156/1325/1143 +f 156/1325/1143 158/1329/1147 285/1313/1138 +f 243/1326/1144 279/1305/1095 255/1330/1148 +f 137/1327/1145 255/1330/1148 168/1331/1114 +f 243/1326/1144 255/1330/1148 137/1327/1145 +f 139/1328/1146 168/1331/1114 172/1332/1149 +f 137/1327/1145 168/1331/1114 139/1328/1146 +f 158/1329/1147 172/1332/1149 183/1333/1150 +f 139/1328/1146 172/1332/1149 158/1329/1147 +f 158/1329/1147 183/1333/1150 285/1313/1138 +f 255/1330/1148 279/1305/1095 272/1334/1151 +f 168/1331/1114 272/1334/1151 233/1335/1117 +f 255/1330/1148 272/1334/1151 168/1331/1114 +f 172/1332/1149 233/1335/1117 234/1336/1152 +f 168/1331/1114 233/1335/1117 172/1332/1149 +f 183/1333/1150 234/1336/1152 244/1337/1153 +f 172/1332/1149 234/1336/1152 183/1333/1150 +f 183/1333/1150 244/1337/1153 285/1313/1138 +f 272/1334/1151 279/1305/1095 294/1338/1154 +f 233/1335/1117 294/1338/1154 324/1339/1120 +f 272/1334/1151 294/1338/1154 233/1335/1117 +f 234/1336/1152 324/1339/1120 319/1340/1121 +f 233/1335/1117 324/1339/1120 234/1336/1152 +f 244/1337/1153 319/1340/1121 312/1341/1155 +f 234/1336/1152 319/1340/1121 244/1337/1153 +f 244/1337/1153 312/1341/1155 285/1313/1138 +f 294/1338/1154 279/1305/1095 303/1342/1156 +f 324/1339/1120 303/1342/1156 385/1343/1157 +f 294/1338/1154 303/1342/1156 324/1339/1120 +f 319/1340/1121 385/1343/1157 384/1344/1158 +f 324/1339/1120 385/1343/1157 319/1340/1121 +f 312/1341/1155 384/1344/1158 372/1345/1159 +f 319/1340/1121 384/1344/1158 312/1341/1155 +f 312/1341/1155 372/1345/1159 285/1313/1138 +f 303/1342/1156 279/1305/1095 310/1346/1126 +f 385/1343/1157 310/1346/1126 426/1347/1127 +f 303/1342/1156 310/1346/1126 385/1343/1157 +f 384/1344/1158 426/1347/1127 422/1348/1160 +f 385/1343/1157 426/1347/1127 384/1344/1158 +f 372/1345/1159 422/1348/1160 411/1349/1161 +f 384/1344/1158 422/1348/1160 372/1345/1159 +f 372/1345/1159 411/1349/1161 285/1313/1138 +f 310/1346/1126 279/1305/1095 309/1350/1129 +f 426/1347/1127 309/1350/1129 425/1351/1162 +f 310/1346/1126 309/1350/1129 426/1347/1127 +f 422/1348/1160 425/1351/1162 421/1352/1163 +f 426/1347/1127 425/1351/1162 422/1348/1160 +f 411/1349/1161 421/1352/1163 410/1353/1164 +f 422/1348/1160 421/1352/1163 411/1349/1161 +f 411/1349/1161 410/1353/1164 285/1313/1138 +f 309/1350/1129 279/1305/1095 302/1304/1132 +f 425/1351/1162 302/1304/1132 380/1307/1097 +f 309/1350/1129 302/1304/1132 425/1351/1162 +f 421/1352/1163 380/1307/1097 379/1309/1134 +f 425/1351/1162 380/1307/1097 421/1352/1163 +f 410/1353/1164 379/1309/1134 369/1311/1136 +f 421/1352/1163 379/1309/1134 410/1353/1164 +f 410/1353/1164 369/1311/1136 285/1313/1138 diff --git a/tests/qmlcamera/shuttle.png b/tests/qmlcamera/shuttle.png new file mode 100644 index 00000000..52d6244c Binary files /dev/null and b/tests/qmlcamera/shuttle.png differ -- cgit v1.2.3 From 2b19a3ae8b8c34ea674058c7b82de44397e29df2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 24 Apr 2014 07:37:58 +0300 Subject: Color problem fixed Task-number: QTRD-3001 Changed all colors to QVector4Ds to avoid mixups with vec4 and vec3 colors in shaders. Change-Id: I8b44b4d711befca900dd35b3386881f7c31d7dd5 Change-Id: I8b44b4d711befca900dd35b3386881f7c31d7dd5 Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3drenderer.cpp | 2 +- src/datavisualization/engine/bars3drenderer.cpp | 20 ++++++++++---------- src/datavisualization/engine/scatter3drenderer.cpp | 10 +++++----- src/datavisualization/engine/selectionpointer.cpp | 2 +- src/datavisualization/engine/selectionpointer_p.h | 4 ++-- src/datavisualization/engine/seriesrendercache_p.h | 12 ++++++------ src/datavisualization/engine/shaders/colorOnY.frag | 6 +++--- .../engine/shaders/colorOnY_ES2.frag | 6 +++--- src/datavisualization/engine/shaders/default.frag | 8 ++++---- .../engine/shaders/default_ES2.frag | 8 ++++---- src/datavisualization/engine/shaders/shadow.frag | 6 +++--- .../engine/shaders/shadowNoTex.frag | 8 ++++---- .../engine/shaders/shadowNoTexColorOnY.frag | 6 +++--- src/datavisualization/engine/shaders/surface.frag | 6 +++--- .../engine/shaders/surfaceFlat.frag | 6 +++--- .../engine/shaders/surfaceShadowFlat.frag | 6 +++--- .../engine/shaders/surfaceShadowNoTex.frag | 6 +++--- .../engine/shaders/surface_ES2.frag | 6 +++--- src/datavisualization/engine/shaders/texture.frag | 6 +++--- .../engine/shaders/texture_ES2.frag | 6 +++--- src/datavisualization/engine/surface3drenderer.cpp | 12 ++++++------ src/datavisualization/utils/utils.cpp | 13 ++++++++++--- src/datavisualization/utils/utils_p.h | 3 ++- 23 files changed, 88 insertions(+), 80 deletions(-) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index d18a1fc3..af92c691 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -119,7 +119,7 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) m_viewport.width(), m_viewport.height()); glEnable(GL_SCISSOR_TEST); - QVector3D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor()); + QVector4D clearColor = Utils::vectorFromColor(m_cachedTheme->windowColor()); glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_SCISSOR_TEST); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index e2feefac..e41d35b0 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -341,7 +341,7 @@ void Bars3DRenderer::drawSlicedScene() { GLfloat barPosX = 0; QVector3D lightPos; - QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); + QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); static QQuaternion ninetyDegreeRotation = QQuaternion::fromAxisAndAngle(upVector, 90.0f); // Specify viewport @@ -399,7 +399,7 @@ void Bars3DRenderer::drawSlicedScene() lineShader->bind(); // Set unchanging shader bindings - QVector3D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); + QVector4D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); lineShader->setUniformValue(lineShader->lightP(), lightPos); lineShader->setUniformValue(lineShader->view(), viewMatrix); lineShader->setUniformValue(lineShader->color(), lineColor); @@ -532,8 +532,8 @@ void Bars3DRenderer::drawSlicedScene() Q3DTheme::ColorStyle previousColorStyle = Q3DTheme::ColorStyleUniform; Q3DTheme::ColorStyle colorStyle = Q3DTheme::ColorStyleUniform; ObjectHelper *barObj = 0; - QVector3D highlightColor; - QVector3D baseColor; + QVector4D highlightColor; + QVector4D baseColor; GLuint highlightGradientTexture = 0; GLuint baseGradientTexture = 0; bool colorStyleIsUniform = true; @@ -625,7 +625,7 @@ void Bars3DRenderer::drawSlicedScene() MVPMatrix = projectionViewMatrix * modelMatrix; - QVector3D barColor; + QVector4D barColor; GLuint gradientTexture = 0; if (itemMode && m_visualSelectedBarPos.x() == item.position().x() @@ -809,7 +809,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) GLfloat colPos = 0; GLfloat rowPos = 0; - QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); + QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); @@ -1150,8 +1150,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) bool barSelectionFound = false; - QVector3D baseColor; - QVector3D barColor; + QVector4D baseColor; + QVector4D barColor; QVector3D modelScaler(m_scaleX * m_seriesScaleX, 0.0f, m_scaleZ * m_seriesScaleZ); bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::invalidSelectionPosition()); foreach (SeriesRenderCache *baseCache, m_renderCacheList) { @@ -1399,7 +1399,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) #else MVPMatrix = projectionViewMatrix * modelMatrix; #endif - QVector3D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); + QVector4D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); // Set shader bindings m_backgroundShader->setUniformValue(m_backgroundShader->lightP(), lightPos); @@ -1493,7 +1493,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->bind(); // Set unchanging shader bindings - QVector3D barColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); + QVector4D barColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); lineShader->setUniformValue(lineShader->lightP(), lightPos); lineShader->setUniformValue(lineShader->view(), viewMatrix); lineShader->setUniformValue(lineShader->color(), barColor); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9d5696a0..adda3b9f 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -314,7 +314,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); - QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); + QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); // Specify viewport glViewport(m_primarySubViewport.x(), @@ -599,8 +599,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) GLuint gradientTexture = 0; bool dotSelectionFound = false; ScatterRenderItem *selectedItem(0); - QVector3D baseColor; - QVector3D dotColor; + QVector4D baseColor; + QVector4D dotColor; bool previousDrawingPoints = false; Q3DTheme::ColorStyle previousMeshColorStyle = Q3DTheme::ColorStyleUniform; @@ -846,7 +846,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) #else MVPMatrix = projectionViewMatrix * modelMatrix; #endif - QVector3D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); + QVector4D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); // Set shader bindings m_backgroundShader->setUniformValue(m_backgroundShader->lightP(), lightPos); @@ -899,7 +899,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) lineShader->bind(); // Set unchanging shader bindings - QVector3D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); + QVector4D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); lineShader->setUniformValue(lineShader->lightP(), lightPos); lineShader->setUniformValue(lineShader->view(), viewMatrix); lineShader->setUniformValue(lineShader->color(), lineColor); diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp index d4e635bc..e3708095 100644 --- a/src/datavisualization/engine/selectionpointer.cpp +++ b/src/datavisualization/engine/selectionpointer.cpp @@ -209,7 +209,7 @@ void SelectionPointer::updateSliceData(bool sliceActivated, GLfloat autoScaleAdj m_autoScaleAdjustment = autoScaleAdjustment; } -void SelectionPointer::setHighlightColor(const QVector3D &colorVector) +void SelectionPointer::setHighlightColor(const QVector4D &colorVector) { m_highlightColor = colorVector; } diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h index 1eac22be..7c6762be 100644 --- a/src/datavisualization/engine/selectionpointer_p.h +++ b/src/datavisualization/engine/selectionpointer_p.h @@ -57,7 +57,7 @@ public: void updateBoundingRect(const QRect &rect); void updateScene(Q3DScene *scene); void updateSliceData(bool sliceActivated, GLfloat autoScaleAdjustment); - void setHighlightColor(const QVector3D &colorVector); + void setHighlightColor(const QVector4D &colorVector); void setRotation(const QQuaternion &rotation); private: @@ -81,7 +81,7 @@ private: QString m_label; bool m_cachedIsSlicingActivated; GLfloat m_autoScaleAdjustment; - QVector3D m_highlightColor; + QVector4D m_highlightColor; QQuaternion m_rotation; }; diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 8536d501..3cd94487 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -56,13 +56,13 @@ public: inline void setMeshRotation(const QQuaternion &rotation) { m_meshRotation = rotation; } inline ObjectHelper *object() const { return m_object; } inline const Q3DTheme::ColorStyle &colorStyle() const { return m_colorStyle; } - inline const QVector3D &baseColor() const { return m_baseColor; } + inline const QVector4D &baseColor() const { return m_baseColor; } inline const GLuint &baseUniformTexture() const { return m_baseUniformTexture; } inline const GLuint &baseGradientTexture() const { return m_baseGradientTexture; } inline const QImage &gradientImage() const { return m_gradientImage; } - inline const QVector3D &singleHighlightColor() const { return m_singleHighlightColor; } + inline const QVector4D &singleHighlightColor() const { return m_singleHighlightColor; } inline const GLuint &singleHighlightGradientTexture() const { return m_singleHighlightGradientTexture; } - inline const QVector3D &multiHighlightColor() const { return m_multiHighlightColor; } + inline const QVector4D &multiHighlightColor() const { return m_multiHighlightColor; } inline const GLuint &multiHighlightGradientTexture() const { return m_multiHighlightGradientTexture; } inline const QString &name() const { return m_name; } inline const QString &itemLabel() const { return m_itemLabel; } @@ -79,13 +79,13 @@ protected: QQuaternion m_meshRotation; Q3DTheme::ColorStyle m_colorStyle; - QVector3D m_baseColor; + QVector4D m_baseColor; GLuint m_baseUniformTexture; GLuint m_baseGradientTexture; QImage m_gradientImage; - QVector3D m_singleHighlightColor; + QVector4D m_singleHighlightColor; GLuint m_singleHighlightGradientTexture; - QVector3D m_multiHighlightColor; + QVector4D m_multiHighlightColor; GLuint m_multiHighlightGradientTexture; QString m_name; diff --git a/src/datavisualization/engine/shaders/colorOnY.frag b/src/datavisualization/engine/shaders/colorOnY.frag index 8c610cd7..7a5eb46b 100644 --- a/src/datavisualization/engine/shaders/colorOnY.frag +++ b/src/datavisualization/engine/shaders/colorOnY.frag @@ -6,7 +6,7 @@ uniform highp float ambientStrength; uniform sampler2D textureSampler; uniform highp float gradMin; uniform highp float gradHeight; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; varying highp vec3 position_wrld; varying highp vec3 normal_cmr; @@ -17,8 +17,8 @@ varying highp vec2 coords_mdl; void main() { highp vec2 gradientUV = vec2(0.0, gradMin + ((coords_mdl.y + 1.0) * gradHeight)); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); highp vec3 n = normalize(normal_cmr); diff --git a/src/datavisualization/engine/shaders/colorOnY_ES2.frag b/src/datavisualization/engine/shaders/colorOnY_ES2.frag index 5b553562..f2cf14b8 100644 --- a/src/datavisualization/engine/shaders/colorOnY_ES2.frag +++ b/src/datavisualization/engine/shaders/colorOnY_ES2.frag @@ -4,7 +4,7 @@ uniform highp float ambientStrength; uniform sampler2D textureSampler; uniform highp float gradMin; uniform highp float gradHeight; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; varying highp vec3 position_wrld; varying highp vec3 normal_cmr; @@ -15,8 +15,8 @@ varying highp vec2 coords_mdl; void main() { highp vec2 gradientUV = vec2(0.0, gradMin + ((coords_mdl.y + 1.0) * gradHeight)); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); highp vec3 n = normalize(normal_cmr); diff --git a/src/datavisualization/engine/shaders/default.frag b/src/datavisualization/engine/shaders/default.frag index ca6fefb9..d16055a3 100644 --- a/src/datavisualization/engine/shaders/default.frag +++ b/src/datavisualization/engine/shaders/default.frag @@ -8,15 +8,15 @@ varying highp vec3 eyeDirection_cmr; varying highp vec3 lightDirection_cmr; uniform highp vec3 lightPosition_wrld; -uniform highp vec3 color_mdl; +uniform highp vec4 color_mdl; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec3 materialDiffuseColor = color_mdl.rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/default_ES2.frag b/src/datavisualization/engine/shaders/default_ES2.frag index bc5c18b6..6c6d04ab 100644 --- a/src/datavisualization/engine/shaders/default_ES2.frag +++ b/src/datavisualization/engine/shaders/default_ES2.frag @@ -6,15 +6,15 @@ varying highp vec3 eyeDirection_cmr; varying highp vec3 lightDirection_cmr; uniform highp vec3 lightPosition_wrld; -uniform highp vec3 color_mdl; +uniform highp vec4 color_mdl; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec3 materialDiffuseColor = color_mdl.rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/shadow.frag b/src/datavisualization/engine/shaders/shadow.frag index e2286dc5..237e9780 100644 --- a/src/datavisualization/engine/shaders/shadow.frag +++ b/src/datavisualization/engine/shaders/shadow.frag @@ -5,7 +5,7 @@ uniform highp float ambientStrength; uniform highp float shadowQuality; uniform highp sampler2D textureSampler; uniform highp sampler2DShadow shadowMap; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; varying highp vec4 shadowCoord; varying highp vec2 UV; @@ -33,8 +33,8 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), void main() { highp vec3 materialDiffuseColor = texture2D(textureSampler, UV).rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor * 0.2; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb * 0.2; highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/shadowNoTex.frag b/src/datavisualization/engine/shaders/shadowNoTex.frag index d54efea9..b2e7adfc 100644 --- a/src/datavisualization/engine/shaders/shadowNoTex.frag +++ b/src/datavisualization/engine/shaders/shadowNoTex.frag @@ -3,9 +3,9 @@ uniform highp float lightStrength; uniform highp float ambientStrength; uniform highp float shadowQuality; -uniform highp vec3 color_mdl; +uniform highp vec4 color_mdl; uniform highp sampler2DShadow shadowMap; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; varying highp vec4 shadowCoord; varying highp vec3 position_wrld; @@ -32,8 +32,8 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), void main() { highp vec3 materialDiffuseColor = color_mdl.rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/shadowNoTexColorOnY.frag b/src/datavisualization/engine/shaders/shadowNoTexColorOnY.frag index e986a52a..73b84138 100644 --- a/src/datavisualization/engine/shaders/shadowNoTexColorOnY.frag +++ b/src/datavisualization/engine/shaders/shadowNoTexColorOnY.frag @@ -7,7 +7,7 @@ uniform highp sampler2DShadow shadowMap; uniform sampler2D textureSampler; uniform highp float gradMin; uniform highp float gradHeight; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; varying highp vec4 shadowCoord; varying highp vec3 position_wrld; @@ -36,8 +36,8 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), void main() { highp vec2 gradientUV = vec2(0.0, gradMin + ((coords_mdl.y + 1.0) * gradHeight)); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/surface.frag b/src/datavisualization/engine/shaders/surface.frag index b5205d2d..f17dd73e 100644 --- a/src/datavisualization/engine/shaders/surface.frag +++ b/src/datavisualization/engine/shaders/surface.frag @@ -10,13 +10,13 @@ uniform sampler2D textureSampler; uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec2 gradientUV = vec2(0.0, (coords_mdl.y + 1.0) / 2.0); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/surfaceFlat.frag b/src/datavisualization/engine/shaders/surfaceFlat.frag index 7eaa917f..748fb3dd 100644 --- a/src/datavisualization/engine/shaders/surfaceFlat.frag +++ b/src/datavisualization/engine/shaders/surfaceFlat.frag @@ -12,13 +12,13 @@ uniform sampler2D textureSampler; uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec2 gradientUV = vec2(0.0, (coords_mdl.y + 1.0) / 2.0); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/surfaceShadowFlat.frag b/src/datavisualization/engine/shaders/surfaceShadowFlat.frag index 9b9305ab..0613a40c 100644 --- a/src/datavisualization/engine/shaders/surfaceShadowFlat.frag +++ b/src/datavisualization/engine/shaders/surfaceShadowFlat.frag @@ -15,7 +15,7 @@ uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; uniform highp float shadowQuality; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), vec2(0.94558609, -0.76890725), @@ -37,8 +37,8 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), void main() { highp vec2 gradientUV = vec2(0.0, (coords_mdl.y + 1.0) / 2.0); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/surfaceShadowNoTex.frag b/src/datavisualization/engine/shaders/surfaceShadowNoTex.frag index 3427fbae..1acf8f69 100644 --- a/src/datavisualization/engine/shaders/surfaceShadowNoTex.frag +++ b/src/datavisualization/engine/shaders/surfaceShadowNoTex.frag @@ -13,7 +13,7 @@ uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; uniform highp float shadowQuality; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), vec2(0.94558609, -0.76890725), @@ -35,8 +35,8 @@ highp vec2 poissonDisk[16] = vec2[16](vec2(-0.94201624, -0.39906216), void main() { highp vec2 gradientUV = vec2(0.0, (coords_mdl.y + 1.0) / 2.0); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/surface_ES2.frag b/src/datavisualization/engine/shaders/surface_ES2.frag index 0e17cacd..1f3aedb6 100644 --- a/src/datavisualization/engine/shaders/surface_ES2.frag +++ b/src/datavisualization/engine/shaders/surface_ES2.frag @@ -9,13 +9,13 @@ uniform sampler2D textureSampler; uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec2 gradientUV = vec2(0.0, (coords_mdl.y + 1.0) / 2.0); highp vec3 materialDiffuseColor = texture2D(textureSampler, gradientUV).xyz; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/texture.frag b/src/datavisualization/engine/shaders/texture.frag index 69509a3f..41c4259b 100644 --- a/src/datavisualization/engine/shaders/texture.frag +++ b/src/datavisualization/engine/shaders/texture.frag @@ -10,12 +10,12 @@ uniform highp vec3 lightPosition_wrld; uniform highp sampler2D textureSampler; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec3 materialDiffuseColor = texture2D(textureSampler, UV).rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/shaders/texture_ES2.frag b/src/datavisualization/engine/shaders/texture_ES2.frag index e749d763..d82c12fe 100644 --- a/src/datavisualization/engine/shaders/texture_ES2.frag +++ b/src/datavisualization/engine/shaders/texture_ES2.frag @@ -9,12 +9,12 @@ uniform highp vec3 lightPosition_wrld; uniform highp sampler2D textureSampler; uniform highp float lightStrength; uniform highp float ambientStrength; -uniform highp vec3 lightColor; +uniform highp vec4 lightColor; void main() { highp vec3 materialDiffuseColor = texture2D(textureSampler, UV).rgb; - highp vec3 materialAmbientColor = lightColor * ambientStrength * materialDiffuseColor; - highp vec3 materialSpecularColor = lightColor; + highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; + highp vec3 materialSpecularColor = lightColor.rgb; highp float distance = length(lightPosition_wrld - position_wrld); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 142a9b67..f79f92f6 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -278,7 +278,7 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis if (m_selectedSeries) { foreach (SeriesRenderCache *baseCache, m_renderCacheList) { SurfaceSeriesRenderCache *cache = static_cast(baseCache); - QVector3D highlightColor = + QVector4D highlightColor = Utils::vectorFromColor(cache->series()->singleHighlightColor()); SelectionPointer *slicePointer = cache->sliceSelectionPointer(); if (slicePointer) { @@ -712,7 +712,7 @@ void Surface3DRenderer::drawSlicedScene() { QVector3D lightPos; - QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); + QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); // Specify viewport glViewport(m_secondarySubViewport.x(), @@ -835,7 +835,7 @@ void Surface3DRenderer::drawSlicedScene() lineShader->bind(); // Set unchanging shader bindings - QVector3D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); + QVector4D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); lineShader->setUniformValue(lineShader->lightP(), lightPos); lineShader->setUniformValue(lineShader->view(), viewMatrix); lineShader->setUniformValue(lineShader->color(), lineColor); @@ -995,7 +995,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) bool noShadows = true; GLfloat backgroundRotation = 0; - QVector3D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); + QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); glViewport(m_primarySubViewport.x(), m_primarySubViewport.y(), @@ -1358,7 +1358,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) MVPMatrix = projectionViewMatrix * modelMatrix; #endif - QVector3D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); + QVector4D backgroundColor = Utils::vectorFromColor(m_cachedTheme->backgroundColor()); // Set shader bindings m_backgroundShader->setUniformValue(m_backgroundShader->lightP(), lightPos); @@ -1416,7 +1416,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) lineShader->bind(); // Set unchanging shader bindings - QVector3D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); + QVector4D lineColor = Utils::vectorFromColor(m_cachedTheme->gridLineColor()); lineShader->setUniformValue(lineShader->lightP(), lightPos); lineShader->setUniformValue(lineShader->view(), viewMatrix); lineShader->setUniformValue(lineShader->color(), lineColor); diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index eb84f162..b00d1251 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -38,14 +38,21 @@ GLuint Utils::getNearestPowerOfTwo(GLuint value, GLuint &padding) return powOfTwoValue; } -QVector3D Utils::vectorFromColor(const QColor &color) +QVector4D Utils::vectorFromColor(const QColor &color) { - return QVector3D(color.redF(), color.greenF(), color.blueF()); + return QVector4D(color.redF(), color.greenF(), color.blueF(), color.alphaF()); } QColor Utils::colorFromVector(const QVector3D &colorVector) { - return QColor(colorVector.x() * 255.0f, colorVector.y() * 255.0f, colorVector.z() * 255.0f); + return QColor(colorVector.x() * 255.0f, colorVector.y() * 255.0f, + colorVector.z() * 255.0f, 255.0f); +} + +QColor Utils::colorFromVector(const QVector4D &colorVector) +{ + return QColor(colorVector.x() * 255.0f, colorVector.y() * 255.0f, + colorVector.z() * 255.0f, colorVector.w() * 255.0f); } QImage Utils::printTextToImage(const QFont &font, const QString &text, const QColor &bgrColor, diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index c89a299c..46df980f 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -52,8 +52,9 @@ public: }; static GLuint getNearestPowerOfTwo(GLuint value, GLuint &padding); - static QVector3D vectorFromColor(const QColor &color); + static QVector4D vectorFromColor(const QColor &color); static QColor colorFromVector(const QVector3D &colorVector); + static QColor colorFromVector(const QVector4D &colorVector); static void printText(QPainter *painter, const QString &text, const QSize &position, bool absoluteCoords = true, float rotation = 0.0f, float scale = 1.0f); static QImage printTextToImage(const QFont &font, -- cgit v1.2.3 From bff870b1a377a896ca1dca9d2fe8b9cdd245c4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 24 Apr 2014 09:40:24 +0300 Subject: Scatter label selection fixed Task-number: QTRD-3053 Change-Id: Ia0f1a9061d29b799bc60d8c965de4c012fa852b1 Change-Id: Ia0f1a9061d29b799bc60d8c965de4c012fa852b1 Reviewed-by: Mika Salmela --- src/datavisualization/engine/scatter3drenderer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index adda3b9f..3bd06517 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1387,7 +1387,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, true, true, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } labelNbr++; @@ -1441,7 +1441,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVector, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, true, true, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } labelNbr++; @@ -1516,7 +1516,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVectorBack, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, true, true, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignmentBack); // Side wall @@ -1524,7 +1524,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, labelRotateVectorSide, 0, m_cachedSelectionMode, - m_labelShader, m_labelObj, activeCamera, true, true, + shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignmentSide); } labelNbr++; -- cgit v1.2.3 From 34a15f84a9683f8b3eecef1ad4dcbb87afa4d24c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 07:19:26 +0300 Subject: Fixed crash when setting invalid baseColors/Gradients to a Theme3D Task-number: QTRD-3009 Change-Id: Icacc4e656dec286334d827c9282037b2bba78e43 Change-Id: Icacc4e656dec286334d827c9282037b2bba78e43 Reviewed-by: Titta Heikkala --- src/datavisualizationqml2/declarativetheme.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/datavisualizationqml2/declarativetheme.cpp b/src/datavisualizationqml2/declarativetheme.cpp index 5aec2408..f051341e 100644 --- a/src/datavisualizationqml2/declarativetheme.cpp +++ b/src/datavisualizationqml2/declarativetheme.cpp @@ -236,6 +236,10 @@ ColorGradient *DeclarativeTheme3D::convertGradient(const QLinearGradient &gradie void DeclarativeTheme3D::addColor(DeclarativeColor *color) { + if (!color) { + qWarning("Color is invalid, use ThemeColor"); + return; + } clearDummyColors(); m_colors.append(color); connect(color, &DeclarativeColor::colorChanged, @@ -283,6 +287,10 @@ void DeclarativeTheme3D::clearDummyColors() void DeclarativeTheme3D::addGradient(ColorGradient *gradient) { + if (!gradient) { + qWarning("Gradient is invalid, use ColorGradient"); + return; + } clearDummyGradients(); m_gradients.append(gradient); connect(gradient, &ColorGradient::updated, -- cgit v1.2.3 From aea77bbc83b353c0513915b220b856c28831caa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 07:47:38 +0300 Subject: Fixed crash on exit Task-number: QTRD-3052 Change-Id: I05b09df72534e5eae803d58e330b2a8045f47038 Change-Id: I05b09df72534e5eae803d58e330b2a8045f47038 Reviewed-by: Titta Heikkala --- src/datavisualization/engine/abstract3drenderer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index af92c691..458630ed 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -63,7 +63,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) Abstract3DRenderer::~Abstract3DRenderer() { delete m_drawer; - delete m_textureHelper; delete m_cachedScene; delete m_cachedTheme; delete m_selectionLabelItem; @@ -74,6 +73,8 @@ Abstract3DRenderer::~Abstract3DRenderer() delete cache; } m_renderCacheList.clear(); + + delete m_textureHelper; } void Abstract3DRenderer::initializeOpenGL() -- cgit v1.2.3 From b1d028be5bea64a915de13ffcd782e7f5228e47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 08:55:38 +0300 Subject: Added explanation / example of axis label selection Task-number: QTRD-2982 Change-Id: Ia164c2462d6e43ddf79e3e13f356435018c383a9 Reviewed-by: Titta Heikkala --- examples/datavisualization/bars/doc/src/bars.qdoc | 15 +++++++++++++++ src/datavisualization/doc/src/qtdatavisualization.qdoc | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/examples/datavisualization/bars/doc/src/bars.qdoc b/examples/datavisualization/bars/doc/src/bars.qdoc index 361078bb..8f8d6210 100644 --- a/examples/datavisualization/bars/doc/src/bars.qdoc +++ b/examples/datavisualization/bars/doc/src/bars.qdoc @@ -29,6 +29,7 @@ \li Create an application with Q3DBars and some widgets \li Use QBar3DSeries and QBarDataProxy to set data to the graph \li Adjust some graph and series properties using widget controls + \li Select a row or a column by clicking an axis label \endlist It also demonstrates how having negative bar values affects the graph. @@ -167,6 +168,20 @@ \li Font size \endlist + \section1 Selecting a row/column by clicking an axis label + + Selection by axis label is default functionality for bar graphs. As an example, you can select + rows by clicking an axis label in the following way:" + + \list + \li Change selection mode to \c SelectionRow + \li Click a year label + \li The row with the clicked year is selected + \endlist + + You can use the same method with \c SelectionSlice and \c SelectionItem flags, as long as + you have either \c SelectionRow or \c SelectionColumn set as well. + \section1 Example contents */ diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index 0fbe36cb..cdbd4e4b 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -303,7 +303,8 @@ a single row or column. Bar graph additionally supports simply highlighting the whole row and/or column of the selected bar - without opening the slice view. + without opening the slice view. Bar graph also supports selecting/slicing a whole row and/or + column by clicking the axis label, based on selection mode. When multiple series are added to a graph, selecting an item in one of them will clear the selection on other series. -- cgit v1.2.3 From 39ab7c38ea280626468b02acd396667f7ac5cb44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 09:13:12 +0300 Subject: QML them basecolor override by series bug fixed Task-number: QTRD-3010 QML calls properties in "random" (or alphabetical) order, which in this case causes theme initialization to be called after series basecolor override, so setting a basecolor to a series to override theme did not work. Change-Id: I434f2a278bf2a70512a3d4d73c30d80319bd0e8e Reviewed-by: Mika Salmela --- src/datavisualization/engine/abstract3dcontroller.cpp | 5 +++-- src/datavisualization/engine/abstract3dcontroller_p.h | 2 +- src/datavisualizationqml2/abstractdeclarative.cpp | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 4c66ad76..31dcab95 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -725,12 +725,13 @@ void Abstract3DController::releaseTheme(Q3DTheme *theme) if (oldTheme != m_themeManager->activeTheme()) emit activeThemeChanged(m_themeManager->activeTheme()); } + QList Abstract3DController::themes() const { return m_themeManager->themes(); } -void Abstract3DController::setActiveTheme(Q3DTheme *theme) +void Abstract3DController::setActiveTheme(Q3DTheme *theme, bool force) { if (theme != m_themeManager->activeTheme()) { m_themeManager->setActiveTheme(theme); @@ -739,7 +740,7 @@ void Abstract3DController::setActiveTheme(Q3DTheme *theme) Q3DTheme *newActiveTheme = m_themeManager->activeTheme(); // Reset all attached series to the new theme for (int i = 0; i < m_seriesList.size(); i++) - m_seriesList.at(i)->d_ptr->resetToTheme(*newActiveTheme, i, true); + m_seriesList.at(i)->d_ptr->resetToTheme(*newActiveTheme, i, force); markSeriesVisualsDirty(); emit activeThemeChanged(newActiveTheme); } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index ba91796e..07aa9ca3 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -209,7 +209,7 @@ public: virtual void addTheme(Q3DTheme *theme); virtual void releaseTheme(Q3DTheme *theme); - virtual void setActiveTheme(Q3DTheme *theme); + virtual void setActiveTheme(Q3DTheme *theme, bool force = true); virtual Q3DTheme *activeTheme() const; virtual QList themes() const; diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 2a02ad24..3b756d4c 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -171,7 +171,7 @@ Declarative3DScene* AbstractDeclarative::scene() const void AbstractDeclarative::setTheme(Q3DTheme *theme) { - m_controller->setActiveTheme(theme); + m_controller->setActiveTheme(theme, false); } Q3DTheme *AbstractDeclarative::theme() const -- cgit v1.2.3 From ca17845c31846b47f7e4db78f7169925ca28eed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 09:49:16 +0300 Subject: =?UTF-8?q?Added=20customitems=20example=20snapshot=20Change-Id:?= =?UTF-8?q?=20I9803c926feb6fe56be09dbeae074b148ea6b1fca=20Reviewed-by:=20T?= =?UTF-8?q?omi=20Korpip=C3=A4=C3=A4=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customitems/doc/images/customitems-example.png | Bin 0 -> 110217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/datavisualization/customitems/doc/images/customitems-example.png diff --git a/examples/datavisualization/customitems/doc/images/customitems-example.png b/examples/datavisualization/customitems/doc/images/customitems-example.png new file mode 100644 index 00000000..610ed73e Binary files /dev/null and b/examples/datavisualization/customitems/doc/images/customitems-example.png differ -- cgit v1.2.3 From 1b5a206f7dac0e37b40650b5e9d00969cd304a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 25 Apr 2014 14:03:28 +0300 Subject: =?UTF-8?q?Changed=20oil=20refinery=20mesh=20for=20customitems=20C?= =?UTF-8?q?hange-Id:=20I5452a86e5a472476f981df8dd0f8985cfe69f100=20Reviewe?= =?UTF-8?q?d-by:=20Tomi=20Korpip=C3=A4=C3=A4=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customitems/customitemgraph.cpp | 2 +- .../datavisualization/customitems/refinery.obj | 33080 ++----------------- 2 files changed, 2124 insertions(+), 30958 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 38f71b9e..822ca24a 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -138,7 +138,7 @@ void CustomItemGraph::toggleItemThree(bool show) QImage color = QImage(2, 2, QImage::Format_ARGB32); color.fill(Qt::darkMagenta); m_graph->addCustomItem(":/items/refinery.obj", positionThree, - QVector3D(0.066f, 0.066f, 0.066f), + QVector3D(0.04f, 0.04f, 0.04f), QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f), color); } else { diff --git a/examples/datavisualization/customitems/refinery.obj b/examples/datavisualization/customitems/refinery.obj index 7939a0f3..2f0de7f4 100644 --- a/examples/datavisualization/customitems/refinery.obj +++ b/examples/datavisualization/customitems/refinery.obj @@ -1,30971 +1,2137 @@ -# Blender v2.66 (sub 0) OBJ File: 'factory.blend' +# Blender v2.66 (sub 0) OBJ File: 'oilrefinery.blend' # www.blender.org -o dieshar1 -v -1.505581 1.636078 -0.912755 -v -1.512975 1.623272 -0.912755 -v -1.498187 1.623272 -0.912755 -v -1.505581 1.636078 -0.630708 -v -1.512975 1.623272 -0.630708 -v -1.498187 1.623272 -0.630708 -v -1.499574 1.306647 -0.640558 -v -1.512380 1.306647 -0.647952 -v -1.512380 1.306647 -0.633165 -v -1.499574 1.622775 -0.640558 -v -1.512380 1.622775 -0.647952 -v -1.512380 1.622775 -0.633165 -v -1.505581 1.464048 -0.896511 -v -1.512975 1.451242 -0.896511 -v -1.498187 1.451242 -0.896511 -v -1.505581 1.464048 -0.648053 -v -1.512975 1.451242 -0.648053 -v -1.498187 1.451242 -0.648053 -v -1.499574 1.306647 -0.903833 -v -1.512380 1.306647 -0.911227 -v -1.512380 1.306647 -0.896440 -v -1.499574 1.622775 -0.903833 -v -1.512380 1.622775 -0.911227 -v -1.512380 1.622775 -0.896440 -v 1.624978 0.471789 0.257865 -v 1.612171 0.471769 0.244677 -v 1.612171 0.481140 0.258521 -v 1.624978 1.616473 -0.584410 -v 1.612171 1.607153 -0.584348 -v 1.612171 1.629403 -0.584352 -v 1.625027 1.621906 -0.631470 -v 1.612221 1.613658 -0.631460 -v 1.612221 1.633349 -0.631461 -v 1.618534 0.094580 0.244752 -v 1.611140 0.094580 0.257559 -v 1.625927 0.094580 0.257559 -v 1.618534 0.471792 0.244753 -v 1.611140 0.471792 0.257559 -v 1.625927 0.471793 0.257559 -v 1.617995 0.094580 0.244752 -v 1.610601 0.094580 0.257559 -v 1.625388 0.094580 0.257559 -v 1.617995 0.471792 0.244753 -v 1.610601 0.471792 0.257559 -v 1.625388 0.471792 0.257559 -v 1.624978 0.285277 0.245446 -v 1.612171 0.272452 0.245079 -v 1.612171 0.294629 0.246102 -v 1.624978 1.451203 -0.630738 -v 1.612171 1.441882 -0.630677 -v 1.612171 1.464133 -0.630681 -v 1.618534 0.488793 -0.072555 -v 1.611140 0.472749 -0.059749 -v 1.625927 0.472749 -0.059749 -v 1.618534 0.684995 -0.072555 -v 1.611140 0.668557 -0.059749 -v 1.625927 0.668557 -0.059749 -v 1.617995 0.488793 -0.072555 -v 1.610601 0.472749 -0.059749 -v 1.625388 0.472749 -0.059749 -v 1.617995 0.684995 -0.072555 -v 1.610601 0.668557 -0.059749 -v 1.625388 0.668557 -0.059749 -v 1.618534 0.712317 -0.072555 -v 1.611140 0.696272 -0.059749 -v 1.625927 0.696272 -0.059749 -v 1.618534 0.897755 -0.072555 -v 1.611140 0.881316 -0.059749 -v 1.625927 0.881316 -0.059749 -v 1.617995 0.712317 -0.072555 -v 1.610601 0.696272 -0.059749 -v 1.625388 0.696272 -0.059749 -v 1.617995 0.897755 -0.072555 -v 1.610602 0.881317 -0.059749 -v 1.625388 0.881317 -0.059749 -v 1.618534 0.888679 -0.388140 -v 1.611140 0.872634 -0.375334 -v 1.625927 0.872634 -0.375334 -v 1.618534 1.114379 -0.388140 -v 1.611140 1.097940 -0.375334 -v 1.625927 1.097940 -0.375334 -v 1.617995 0.888679 -0.388140 -v 1.610602 0.872634 -0.375334 -v 1.625388 0.872634 -0.375334 -v 1.617995 1.114379 -0.388140 -v 1.610602 1.097940 -0.375334 -v 1.625388 1.097940 -0.375334 -v 1.618534 1.141700 -0.388140 -v 1.611140 1.125656 -0.375334 -v 1.625927 1.125656 -0.375334 -v 1.618534 1.327138 -0.388140 -v 1.611140 1.310700 -0.375334 -v 1.625927 1.310700 -0.375334 -v 1.617995 1.141700 -0.388140 -v 1.610602 1.125656 -0.375334 -v 1.625388 1.125656 -0.375334 -v 1.617995 1.327138 -0.388140 -v 1.610602 1.310700 -0.375334 -v 1.625388 1.310700 -0.375334 -v -1.207936 1.635017 -0.622513 -v -1.207936 1.622211 -0.615120 -v -1.207936 1.622211 -0.629907 -v 0.319157 1.635017 -0.622513 -v 0.319157 1.622211 -0.615120 -v 0.319157 1.622211 -0.629907 -v -0.439830 1.305587 -0.628520 -v -0.447224 1.305587 -0.615714 -v -0.432437 1.305587 -0.615714 -v -0.439830 1.621715 -0.628520 -v -0.447224 1.621715 -0.615714 -v -0.432437 1.621715 -0.615714 -v -1.191692 1.462988 -0.622513 -v -1.191692 1.450182 -0.615120 -v -1.191692 1.450182 -0.629907 -v -0.447325 1.462988 -0.622513 -v -0.447325 1.450182 -0.615120 -v -0.447325 1.450182 -0.629907 -v -1.199015 1.305587 -0.628520 -v -1.206408 1.305587 -0.615714 -v -1.191621 1.305587 -0.615714 -v -1.199014 1.621715 -0.628520 -v -1.206408 1.621715 -0.615714 -v -1.191621 1.621715 -0.615714 -v -0.432054 1.462988 -0.622513 -v 0.304038 1.450182 -0.615120 -v 0.304038 1.462988 -0.622513 -v -0.432054 1.450182 -0.615120 -v 0.304038 1.450182 -0.629907 -v -0.432054 1.450182 -0.629907 -v 0.311711 1.305587 -0.628520 -v 0.304318 1.305587 -0.615714 -v 0.319104 1.305587 -0.615714 -v 0.311711 1.621715 -0.628520 -v 0.304318 1.621715 -0.615714 -v 0.319104 1.621715 -0.615714 -v 0.680351 1.635017 -0.622513 -v 0.680351 1.622211 -0.615120 -v 0.680351 1.622211 -0.629907 -v 1.234954 1.635017 -0.622513 -v 1.234954 1.622211 -0.615120 -v 1.234954 1.622211 -0.629907 -v 1.225104 1.305587 -0.628520 -v 1.217710 1.305587 -0.615714 -v 1.232497 1.305587 -0.615714 -v 1.225104 1.621715 -0.628520 -v 1.217710 1.621715 -0.615714 -v 1.232497 1.621715 -0.615714 -v 0.696595 1.462988 -0.622513 -v 0.696595 1.450182 -0.615120 -v 0.696595 1.450182 -0.629907 -v 1.217609 1.462988 -0.622513 -v 1.217609 1.450182 -0.615120 -v 1.217609 1.450182 -0.629907 -v 0.689273 1.305587 -0.628520 -v 0.681880 1.305587 -0.615714 -v 0.696667 1.305587 -0.615714 -v 0.689273 1.621715 -0.628520 -v 0.681880 1.621715 -0.615714 -v 0.696667 1.621715 -0.615714 -v -1.144100 1.466867 -0.919406 -v -1.156906 1.466867 -0.926800 -v -1.156906 1.466867 -0.912013 -v -1.144100 1.622775 -0.919406 -v -1.156906 1.622775 -0.926800 -v -1.156906 1.622775 -0.912013 -v 1.607340 1.626949 -0.919395 -v 1.607340 1.635486 -0.919395 -v 1.607340 1.622680 -0.926789 -v 1.607340 1.622680 -0.912001 -v -1.478091 1.635486 -0.919395 -v -1.478091 1.622680 -0.926789 -v -1.478091 1.622680 -0.912002 -v -1.478091 1.626949 -0.919395 -v 1.607340 1.458304 -0.919395 -v 1.607340 1.466841 -0.919395 -v 1.607340 1.454035 -0.926789 -v 1.607340 1.454035 -0.912001 -v -1.478091 1.466841 -0.919395 -v -1.478091 1.454035 -0.926789 -v -1.478091 1.454035 -0.912002 -v -1.478091 1.458304 -0.919395 -v 0.395227 1.305337 -0.919406 -v 0.382421 1.305337 -0.926800 -v 0.382421 1.305337 -0.912013 -v 0.395227 1.454020 -0.919406 -v 0.382421 1.454020 -0.926800 -v 0.382421 1.454020 -0.912013 -v -1.144100 1.305337 -0.919406 -v -1.156906 1.305337 -0.926800 -v -1.156906 1.305337 -0.912013 -v -1.144100 1.454020 -0.919406 -v -1.156906 1.454020 -0.926800 -v -1.156906 1.454020 -0.912013 -v 1.233502 1.305337 -0.919406 -v 1.220696 1.305337 -0.926800 -v 1.220696 1.305337 -0.912013 -v 1.233502 1.454020 -0.919406 -v 1.220696 1.454020 -0.926800 -v 1.220696 1.454020 -0.912013 -v -0.384851 1.305337 -0.919406 -v -0.397658 1.305337 -0.926800 -v -0.397658 1.305337 -0.912013 -v -0.384851 1.454020 -0.919406 -v -0.397658 1.454020 -0.926800 -v -0.397658 1.454020 -0.912013 -v 1.233502 1.466867 -0.919406 -v 1.220695 1.466867 -0.926800 -v 1.220696 1.466867 -0.912013 -v 1.233501 1.622775 -0.919406 -v 1.220695 1.622775 -0.926800 -v 1.220695 1.622775 -0.912013 -v 0.395227 1.466867 -0.919406 -v 0.382421 1.466867 -0.926800 -v 0.382421 1.466867 -0.912013 -v 0.395227 1.622775 -0.919406 -v 0.382422 1.622775 -0.926800 -v 0.382422 1.622775 -0.912013 -v -0.384851 1.466867 -0.919406 -v -0.397658 1.466867 -0.926800 -v -0.397658 1.466867 -0.912013 -v -0.384851 1.622775 -0.919406 -v -0.397657 1.622775 -0.926800 -v -0.397657 1.622775 -0.912013 -v 1.617759 1.635017 -0.621946 -v 1.625152 1.622211 -0.621946 -v 1.610365 1.622211 -0.621946 -v 1.617759 1.635017 -0.910624 -v 1.625152 1.622211 -0.910624 -v 1.610365 1.622211 -0.910624 -v 1.611752 1.305587 -0.630176 -v 1.624558 1.305587 -0.622783 -v 1.624558 1.305587 -0.637570 -v 1.611752 1.621715 -0.630176 -v 1.624558 1.621715 -0.622783 -v 1.624558 1.621715 -0.637570 -v 1.617759 1.462988 -0.637953 -v 1.625152 1.450182 -0.895504 -v 1.617759 1.462988 -0.895504 -v 1.625152 1.450182 -0.637953 -v 1.610366 1.450182 -0.895504 -v 1.610365 1.450182 -0.637953 -v 1.611752 1.305587 -0.903177 -v 1.624558 1.305587 -0.895784 -v 1.624558 1.305587 -0.910571 -v 1.611752 1.621715 -0.903178 -v 1.624558 1.621715 -0.895784 -v 1.624558 1.621715 -0.910571 -vn -0.866023 0.500004 0.000000 -vn -0.866025 0.500001 0.000000 +v -2.719012 -0.196783 4.805554 +v -2.719012 -0.196783 -4.824533 +v 2.730989 -0.196783 -4.824533 +v 2.730989 -0.196783 4.805554 +v -2.719012 0.012961 4.805554 +v -2.719012 0.012961 -4.824533 +v 2.730989 0.012961 -4.824533 +v 2.730989 0.012961 4.805554 +vn -0.577349 0.577349 0.577349 +vn -0.577349 0.577349 -0.577349 +vn -0.577349 -0.577349 0.577349 +vn 0.577349 0.577349 -0.577349 +vn 0.577349 -0.577349 -0.577349 +vn 0.577349 0.577349 0.577349 +vn 0.577349 -0.577349 0.577349 +vn -0.577349 -0.577349 -0.577349 +s 1 +f 5//1 6//2 1//3 +f 6//2 7//4 3//5 +f 7//4 8//6 4//7 +f 8//6 5//1 1//3 +f 1//3 2//8 3//5 +f 8//6 7//4 6//2 +f 6//2 2//8 1//3 +f 2//8 6//2 3//5 +f 3//5 7//4 4//7 +f 4//7 8//6 1//3 +f 4//7 1//3 3//5 +f 5//1 8//6 6//2 +v -1.384247 1.252743 0.422195 +v -1.384247 2.069450 0.422195 +v -1.303725 1.252743 0.430041 +v -1.303725 2.069450 0.430041 +v -1.226298 1.252743 0.453279 +v -1.226298 2.069450 0.453279 +v -1.154941 1.252743 0.491015 +v -1.154941 2.069450 0.491015 +v -1.092396 1.252743 0.541799 +v -1.092396 2.069450 0.541799 +v -1.041066 1.252743 0.603679 +v -1.041066 2.069450 0.603679 +v -1.002925 1.252743 0.674278 +v -1.002925 2.069450 0.674278 +v -0.979437 1.252743 0.750883 +v -0.979437 2.069450 0.750883 +v -0.971507 1.252743 0.830548 +v -0.971507 2.069450 0.830548 +v -0.979437 1.252743 0.910214 +v -0.979437 2.069450 0.910214 +v -1.002925 1.252743 0.986818 +v -1.002925 2.069450 0.986818 +v -1.041066 1.252743 1.057417 +v -1.041066 2.069450 1.057417 +v -1.092396 1.252743 1.119298 +v -1.092396 2.069450 1.119298 +v -1.154941 1.252743 1.170082 +v -1.154941 2.069450 1.170082 +v -1.226298 1.252743 1.207818 +v -1.226298 2.069450 1.207818 +v -1.303726 1.252743 1.231055 +v -1.303726 2.069450 1.231055 +v -1.384247 1.252743 1.238902 +v -1.384247 2.069450 1.238902 +v -1.464769 1.252743 1.231055 +v -1.464769 2.069450 1.231055 +v -1.542196 1.252743 1.207818 +v -1.542196 2.069450 1.207818 +v -1.613554 1.252743 1.170082 +v -1.613554 2.069450 1.170082 +v -1.676099 1.252743 1.119298 +v -1.676099 2.069450 1.119298 +v -1.727429 1.252743 1.057417 +v -1.727429 2.069450 1.057417 +v -1.765570 1.252743 0.986818 +v -1.765570 2.069450 0.986818 +v -1.789057 1.252743 0.910214 +v -1.789057 2.069450 0.910214 +v -1.796988 1.252743 0.830548 +v -1.796988 2.069450 0.830548 +v -1.789057 1.252743 0.750882 +v -1.789057 2.069450 0.750882 +v -1.765570 1.252743 0.674278 +v -1.765570 2.069450 0.674278 +v -1.727428 1.252743 0.603679 +v -1.727428 2.069450 0.603679 +v -1.676098 1.252743 0.541798 +v -1.676098 2.069450 0.541798 +v -1.613553 1.252743 0.491015 +v -1.613553 2.069450 0.491015 +v -1.542196 1.252743 0.453279 +v -1.542196 2.069450 0.453279 +v -1.464768 1.252743 0.430041 +v -1.464768 2.069450 0.430041 +vn 0.096985 0.000000 -0.995286 +vn 0.287455 0.000000 -0.957794 +vn 0.467486 0.000000 -0.884001 +vn 0.630338 0.000000 -0.776321 +vn 0.769672 0.000000 -0.638440 +vn 0.879812 0.000000 -0.475321 +vn 0.956070 0.000000 -0.293137 +vn 0.995081 0.000000 -0.099061 +vn 0.995081 0.000000 0.099061 +vn 0.956070 0.000000 0.293137 +vn 0.879813 0.000000 0.475321 +vn 0.769672 0.000000 0.638440 +vn 0.630338 0.000000 0.776321 +vn 0.467486 0.000000 0.884001 +vn 0.287455 0.000000 0.957794 +vn 0.096986 0.000000 0.995286 +vn -0.096986 0.000000 0.995286 +vn -0.287456 0.000000 0.957794 +vn -0.467486 0.000000 0.884001 +vn -0.630338 0.000000 0.776321 +vn -0.769673 0.000000 0.638438 +vn -0.879812 0.000000 0.475322 +vn -0.956071 0.000000 0.293135 +vn -0.995081 0.000000 0.099059 +vn -0.995081 -0.000000 -0.099061 +vn -0.956070 -0.000000 -0.293138 +vn -0.879812 -0.000000 -0.475322 +vn -0.769671 -0.000000 -0.638441 +vn -0.630337 -0.000000 -0.776322 +vn -0.467484 -0.000000 -0.884001 +vn -0.000000 1.000000 0.000000 +vn -0.096985 -0.000000 -0.995286 +vn -0.287454 -0.000000 -0.957794 vn 0.000000 -1.000000 -0.000000 -vn 0.866023 0.500004 0.000000 -vn 0.866025 0.500001 0.000000 -vn 0.500008 0.000000 -0.866021 -vn -1.000000 -0.000000 0.000000 -vn 0.500005 0.000000 0.866022 -vn 0.866028 0.499995 0.000001 -vn 0.500011 0.000000 -0.866019 -vn 0.393087 -0.544953 -0.740614 -vn 0.639848 -0.453187 -0.620658 -vn 0.515158 0.507173 0.690932 -vn 0.428358 0.535535 0.727813 -vn 0.584526 -0.803832 -0.110378 -vn 0.538941 -0.836850 -0.096042 -vn -0.999999 -0.000000 -0.001048 -vn 0.708304 0.701165 0.081686 -vn 0.664990 0.744189 0.063023 -vn -0.866025 0.000000 -0.500001 -vn 0.000000 -0.000000 1.000000 -vn 0.866032 0.000000 -0.499989 -vn 0.000008 -0.000000 1.000000 -vn 0.866030 0.000000 -0.499992 -vn 0.397686 -0.551213 -0.733492 -vn 0.528932 -0.508709 -0.679299 -vn 0.520269 0.512273 0.683299 -vn 0.432486 0.541673 0.720796 -vn -0.866023 0.000000 -0.500004 -vn -0.866023 -0.000000 -0.500005 -vn 0.866037 -0.000000 -0.499980 -vn -0.866023 0.000001 -0.500005 -vn -0.866022 0.000001 -0.500005 -vn 0.866028 -0.000001 -0.499995 -vn -0.866023 0.000001 -0.500003 -vn 0.866035 -0.000001 -0.499983 -vn 0.866036 -0.000001 -0.499981 -vn -0.866024 -0.000000 -0.500003 -vn 0.866031 0.000000 -0.499991 -vn 0.866030 -0.000000 -0.499991 -vn 0.866038 -0.000000 -0.499979 -vn 0.866038 -0.000000 -0.499978 -vn 0.866037 -0.000000 -0.499979 -vn -0.000000 0.500001 0.866025 -vn 0.000000 0.500004 0.866023 -vn 0.000000 0.499998 -0.866026 -vn -0.866027 0.000000 -0.499997 -vn 0.866024 0.000000 -0.500003 -vn 0.000000 0.499998 0.866026 -vn 0.000000 0.500001 -0.866025 -vn 0.000000 0.499995 -0.866028 -vn -0.866026 -0.000000 -0.499998 -vn 0.866027 0.000000 -0.499997 -vn 0.866023 -0.000000 -0.500004 -vn -0.866023 0.000001 -0.500004 -vn -0.866037 -0.000000 -0.499980 -vn 0.866040 0.000000 -0.499974 -vn 0.866026 -0.000001 -0.499998 -vn -0.000000 0.499998 0.866027 -vn 0.000000 0.499998 -0.866027 -vn -0.866030 0.000000 -0.499992 -vn 0.500008 0.000000 0.866021 -vn 1.000000 0.000000 -0.000000 -vn -0.000000 -1.000000 0.000008 -vn -0.000000 0.500005 0.866023 -vn 0.499994 0.000000 -0.866029 -vn 0.499994 0.000000 0.866029 -vn 0.500004 0.000000 -0.866023 -vn 0.499998 0.000000 0.866026 -vn 0.499997 0.000000 -0.866027 -vn 0.499991 0.000000 0.866030 -vn 0.500004 0.000001 -0.866023 -vn -1.000000 -0.000002 0.000016 -vn 0.499998 0.000001 0.866026 -vn 0.499994 -0.000002 -0.866029 -vn -1.000000 0.000003 0.000000 -vn 0.500005 -0.000001 0.866022 -vn 0.499997 -0.000002 -0.866027 -vn 0.500005 -0.000002 0.866022 -vn 0.866023 0.500004 0.000001 -vn 0.866025 0.500001 0.000001 -vn -0.866030 0.499992 -0.000001 -vn -0.866032 0.499989 -0.000001 -vn -0.499994 0.000000 0.866029 -vn -0.499997 0.000000 -0.866027 -vn -0.866037 0.499980 -0.000001 -vn -0.866030 0.499992 0.000000 -vn -0.500004 0.000000 0.866023 -vn -0.499998 0.000000 0.866026 -vn -0.499995 0.000000 -0.866028 -vn -0.500001 -0.000000 -0.866025 s off -f 1//1 5//1 4//1 -f 1//2 2//2 5//2 -f 2//3 6//3 5//3 -f 2//3 3//3 6//3 -f 3//4 4//4 6//4 -f 3//5 1//5 4//5 -f 7//6 11//6 10//6 -f 7//6 8//6 11//6 -f 8//7 12//7 11//7 -f 8//7 9//7 12//7 -f 9//8 10//8 12//8 -f 9//8 7//8 10//8 -f 13//2 17//2 16//2 -f 13//1 14//1 17//1 -f 14//3 18//3 17//3 -f 14//3 15//3 18//3 -f 15//9 16//9 18//9 -f 15//4 13//4 16//4 -f 19//10 23//10 22//10 -f 19//10 20//10 23//10 -f 20//7 24//7 23//7 -f 20//7 21//7 24//7 -f 21//8 22//8 24//8 -f 21//8 19//8 22//8 -f 25//11 29//11 28//11 -f 25//12 26//12 29//12 -f 26//7 30//7 29//7 -f 26//7 27//7 30//7 -f 27//13 28//13 30//13 -f 27//14 25//14 28//14 -f 28//15 29//15 32//15 -f 32//16 31//16 28//16 -f 29//17 30//17 33//17 -f 33//17 32//17 29//17 -f 30//18 28//18 31//18 -f 31//19 33//19 30//19 -f 34//20 38//20 37//20 -f 34//20 35//20 38//20 -f 35//21 39//21 38//21 -f 35//21 36//21 39//21 -f 36//22 37//22 39//22 -f 36//22 34//22 37//22 -f 40//20 44//20 43//20 -f 40//20 41//20 44//20 -f 41//23 45//23 44//23 -f 41//21 42//21 45//21 -f 42//24 43//24 45//24 -f 42//22 40//22 43//22 -f 46//25 50//25 49//25 -f 46//26 47//26 50//26 -f 47//7 51//7 50//7 -f 47//7 48//7 51//7 -f 48//27 49//27 51//27 -f 48//28 46//28 49//28 -f 52//29 56//29 55//29 -f 52//29 53//29 56//29 -f 53//21 57//21 56//21 -f 53//21 54//21 57//21 -f 54//24 55//24 57//24 -f 54//24 52//24 55//24 -f 58//30 62//30 61//30 -f 58//30 59//30 62//30 -f 59//21 63//21 62//21 -f 59//21 60//21 63//21 -f 60//31 61//31 63//31 -f 60//31 58//31 61//31 -f 64//32 68//32 67//32 -f 64//33 65//33 68//33 -f 65//21 69//21 68//21 -f 65//21 66//21 69//21 -f 66//34 67//34 69//34 -f 66//34 64//34 67//34 -f 70//32 74//32 73//32 -f 70//35 71//35 74//35 -f 71//21 75//21 74//21 -f 71//21 72//21 75//21 -f 72//36 73//36 75//36 -f 72//37 70//37 73//37 -f 76//38 80//38 79//38 -f 76//29 77//29 80//29 -f 77//21 81//21 80//21 -f 77//21 78//21 81//21 -f 78//39 79//39 81//39 -f 78//40 76//40 79//40 -f 82//38 86//38 85//38 -f 82//38 83//38 86//38 -f 83//21 87//21 86//21 -f 83//21 84//21 87//21 -f 84//41 85//41 87//41 -f 84//42 82//42 85//42 -f 88//29 92//29 91//29 -f 88//29 89//29 92//29 -f 89//21 93//21 92//21 -f 89//21 90//21 93//21 -f 90//24 91//24 93//24 -f 90//40 88//40 91//40 -f 94//38 98//38 97//38 -f 94//29 95//29 98//29 -f 95//21 99//21 98//21 -f 95//21 96//21 99//21 -f 96//42 97//42 99//42 -f 96//43 94//43 97//43 -f 100//44 104//44 103//44 -f 100//45 101//45 104//45 -f 101//3 105//3 104//3 -f 101//3 102//3 105//3 -f 102//46 103//46 105//46 -f 102//46 100//46 103//46 -f 106//47 110//47 109//47 -f 106//47 107//47 110//47 -f 107//21 111//21 110//21 -f 107//21 108//21 111//21 -f 108//48 109//48 111//48 -f 108//48 106//48 109//48 -f 112//49 116//49 115//49 -f 112//44 113//44 116//44 -f 113//3 117//3 116//3 -f 113//3 114//3 117//3 -f 114//50 115//50 117//50 -f 114//51 112//51 115//51 -f 118//38 122//38 121//38 -f 118//52 119//52 122//52 -f 119//21 123//21 122//21 -f 119//21 120//21 123//21 -f 120//53 121//53 123//53 -f 120//54 118//54 121//54 -f 124//44 125//44 126//44 -f 124//49 127//49 125//49 -f 127//3 128//3 125//3 -f 127//3 129//3 128//3 -f 129//46 126//46 128//46 -f 129//46 124//46 126//46 -f 130//55 134//55 133//55 -f 130//56 131//56 134//56 -f 131//21 135//21 134//21 -f 131//21 132//21 135//21 -f 132//57 133//57 135//57 -f 132//58 130//58 133//58 -f 136//44 140//44 139//44 -f 136//59 137//59 140//59 -f 137//3 141//3 140//3 -f 137//3 138//3 141//3 -f 138//46 139//46 141//46 -f 138//60 136//60 139//60 -f 142//29 146//29 145//29 -f 142//29 143//29 146//29 -f 143//21 147//21 146//21 -f 143//21 144//21 147//21 -f 144//54 145//54 147//54 -f 144//54 142//54 145//54 -f 148//59 152//59 151//59 -f 148//44 149//44 152//44 -f 149//3 153//3 152//3 -f 149//3 150//3 153//3 -f 150//51 151//51 153//51 -f 150//50 148//50 151//50 -f 154//61 158//61 157//61 -f 154//61 155//61 158//61 -f 155//21 159//21 158//21 -f 155//21 156//21 159//21 -f 156//54 157//54 159//54 -f 156//54 154//54 157//54 -f 160//10 164//10 163//10 -f 160//6 161//6 164//6 -f 161//7 165//7 164//7 -f 161//7 162//7 165//7 -f 162//8 163//8 165//8 -f 162//62 160//62 163//62 -f 166//63 168//63 167//63 -f 166//63 169//63 168//63 -f 166//63 167//63 169//63 -f 167//50 171//50 170//50 -f 167//50 168//50 171//50 -f 168//3 172//3 171//3 -f 168//3 169//3 172//3 -f 169//44 170//44 172//44 -f 169//44 167//44 170//44 -f 173//7 170//7 171//7 -f 173//7 171//7 172//7 -f 173//7 172//7 170//7 -f 174//63 176//63 175//63 -f 174//63 177//63 176//63 -f 174//63 175//63 177//63 -f 175//50 179//50 178//50 -f 175//50 176//50 179//50 -f 176//3 180//3 179//3 -f 176//64 177//64 180//64 -f 177//44 178//44 180//44 -f 177//65 175//65 178//65 -f 181//7 178//7 179//7 -f 181//7 179//7 180//7 -f 181//7 180//7 178//7 -f 182//66 186//66 185//66 -f 182//66 183//66 186//66 -f 183//7 187//7 186//7 -f 183//7 184//7 187//7 -f 184//67 185//67 187//67 -f 184//67 182//67 185//67 -f 188//6 192//6 191//6 -f 188//6 189//6 192//6 -f 189//7 193//7 192//7 -f 189//7 190//7 193//7 -f 190//8 191//8 193//8 -f 190//62 188//62 191//62 -f 194//68 198//68 197//68 -f 194//68 195//68 198//68 -f 195//7 199//7 198//7 -f 195//7 196//7 199//7 -f 196//69 197//69 199//69 -f 196//69 194//69 197//69 -f 200//70 204//70 203//70 -f 200//70 201//70 204//70 -f 201//7 205//7 204//7 -f 201//7 202//7 205//7 -f 202//71 203//71 205//71 -f 202//71 200//71 203//71 -f 206//72 210//72 209//72 -f 206//70 207//70 210//70 -f 207//7 211//7 210//7 -f 207//73 208//73 211//73 -f 208//74 209//74 211//74 -f 208//74 206//74 209//74 -f 212//6 216//6 215//6 -f 212//75 213//75 216//75 -f 213//76 217//76 216//76 -f 213//76 214//76 217//76 -f 214//77 215//77 217//77 -f 214//67 212//67 215//67 -f 218//10 222//10 221//10 -f 218//78 219//78 222//78 -f 219//76 223//76 222//76 -f 219//76 220//76 223//76 -f 220//79 221//79 223//79 -f 220//71 218//71 221//71 -f 224//80 228//80 227//80 -f 224//81 225//81 228//81 -f 225//3 229//3 228//3 -f 225//3 226//3 229//3 -f 226//82 227//82 229//82 -f 226//83 224//83 227//83 -f 230//84 234//84 233//84 -f 230//84 231//84 234//84 -f 231//63 235//63 234//63 -f 231//63 232//63 235//63 -f 232//85 233//85 235//85 -f 232//85 230//85 233//85 -f 236//4 237//4 238//4 -f 236//4 239//4 237//4 -f 239//3 240//3 237//3 -f 239//3 241//3 240//3 -f 241//86 238//86 240//86 -f 241//87 236//87 238//87 -f 242//88 246//88 245//88 -f 242//89 243//89 246//89 -f 243//63 247//63 246//63 -f 243//63 244//63 247//63 -f 244//90 245//90 247//90 -f 244//91 242//91 245//91 -o diescell -v -0.800343 0.946822 0.910336 -v -0.800000 0.946749 2.112060 -v -0.856905 0.941346 0.824050 -v -0.856351 0.941345 2.198073 -v -0.043975 1.020890 2.198073 -v -0.100784 1.015439 2.112141 -v -0.044529 1.020891 0.824050 -v -0.100821 1.015554 0.910441 -v -0.859547 0.975688 2.198073 -v -0.860101 0.975690 0.824050 -v -0.047171 1.054100 2.198073 -v -0.047725 1.054102 0.824051 -vt 0.932530 0.188397 -vt 0.932117 2.812201 -vt 1.002439 0.000005 -vt 1.001760 2.999998 -vt -0.002428 2.999998 -vt 0.067782 2.812376 -vt -0.001748 0.000004 -vt 0.067814 0.188627 -vt 1.001614 2.999996 -vt 1.002294 0.000002 -vt -0.002439 2.999995 -vt -0.001760 0.000002 -vn 0.096499 -0.995333 -0.000088 -vn 0.095415 -0.995438 -0.000040 -vn 0.097450 -0.995240 0.001306 -vn 0.097767 -0.995208 -0.001507 -vn 0.095568 -0.995423 -0.000040 -vn 0.094228 -0.995551 -0.000099 -vn 0.097450 -0.995238 0.002020 -vn 0.097785 -0.995207 -0.000939 -vn -0.995698 -0.092661 0.000402 -vn -0.995697 -0.092663 0.000402 -vn 0.000001 -0.000007 1.000000 -vn 0.995401 0.095793 -0.000402 -vn 0.995401 0.095794 -0.000402 -vn 0.000000 0.000000 -1.000000 -vn -0.000001 0.000014 -1.000000 -vn -0.096075 0.995374 0.000040 -s off -f 248/1/92 249/2/92 250/3/92 -f 251/4/93 250/3/93 249/2/93 -f 252/5/94 251/4/94 249/2/94 -f 252/5/95 249/2/95 253/6/95 -f 254/7/96 252/5/96 253/6/96 -f 254/7/97 253/6/97 255/8/97 -f 250/3/98 254/7/98 255/8/98 -f 248/1/99 250/3/99 255/8/99 -f 250/3/100 251/4/100 256/9/100 -f 256/9/101 257/10/101 250/3/101 -f 251/4/21 252/5/21 258/11/21 -f 258/11/102 256/9/102 251/4/102 -f 252/5/103 254/7/103 259/12/103 -f 259/12/104 258/11/104 252/5/104 -f 254/7/105 250/3/105 257/10/105 -f 257/10/106 259/12/106 254/7/106 -f 257/10/107 256/9/107 258/11/107 -f 257/10/107 258/11/107 259/12/107 -o diesknca -v 0.032569 1.799547 -3.404310 -v 0.025655 1.799547 -3.400318 -v 0.018741 1.799547 -3.396326 -v 0.018741 1.799546 -3.388342 -v 0.018741 1.799545 -3.380358 -v 0.025655 1.799545 -3.376366 -v 0.032569 1.799544 -3.372374 -v 0.039484 1.799545 -3.376366 -v 0.046398 1.799545 -3.380358 -v 0.046398 1.799546 -3.388342 -v 0.046398 1.799547 -3.396326 -v 0.039484 1.799547 -3.400318 -v 0.032569 2.011710 -3.404286 -v 0.025654 2.011629 -3.400295 -v 0.018741 2.011547 -3.396304 -v 0.018741 2.011384 -3.388322 -v 0.018740 2.011220 -3.380340 -v 0.025654 2.011139 -3.376349 -v 0.032569 2.011057 -3.372358 -v 0.039483 2.011139 -3.376349 -v 0.046397 2.011221 -3.380340 -v 0.046397 2.011384 -3.388322 -v 0.046397 2.011547 -3.396304 -v 0.039483 2.011629 -3.400295 -v 0.032569 2.035493 -3.396313 -v 0.018741 2.031813 -3.389229 -v 0.018740 2.024452 -3.375059 -v 0.032569 2.020771 -3.367974 -v 0.046397 2.024452 -3.375059 -v 0.046397 2.031813 -3.389229 -v 0.032569 2.050018 -3.380495 -v 0.018740 2.043779 -3.375513 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.043779 -3.375513 -v 0.032569 2.059114 -3.357977 -v 0.018740 2.051516 -3.355524 -v 0.018740 2.036320 -3.350618 -v 0.032569 2.028723 -3.348165 -v 0.046397 2.036320 -3.350618 -v 0.046397 2.051516 -3.355524 -v 0.032569 2.060771 -3.330759 -v 0.018740 2.052788 -3.330760 -v 0.018740 2.036820 -3.330763 -v 0.032569 2.028836 -3.330764 -v 0.046397 2.036820 -3.330763 -v 0.046397 2.052788 -3.330760 -v 0.032569 2.064860 -3.330672 -v 0.015195 2.054830 -3.330672 -v 0.015195 2.034768 -3.330674 -v 0.032569 2.024737 -3.330674 -v 0.049942 2.034768 -3.330674 -v 0.049942 2.054830 -3.330673 -v 0.032569 2.064887 -3.308321 -v 0.015195 2.054856 -3.308321 -v 0.015195 2.034795 -3.308320 -v 0.032569 2.024764 -3.308320 -v 0.049942 2.034795 -3.308320 -v 0.049942 2.054856 -3.308321 -v 0.032569 2.060795 -3.308268 -v 0.018740 2.052811 -3.308267 -v 0.018740 2.036843 -3.308267 -v 0.032569 2.028859 -3.308267 -v 0.046397 2.036843 -3.308267 -v 0.046397 2.052811 -3.308268 -v 0.032569 2.060795 -3.268561 -v 0.018740 2.052811 -3.268562 -v 0.018740 2.036843 -3.268565 -v 0.032569 2.028859 -3.268566 -v 0.046397 2.036843 -3.268565 -v 0.046397 2.052811 -3.268562 -v 0.025654 2.011629 -3.400295 -v 0.025654 2.011629 -3.400295 -v 0.032569 2.035493 -3.396313 -v 0.018741 2.011547 -3.396304 -v 0.018741 2.031813 -3.389229 -v 0.018741 2.011547 -3.396304 -v 0.018741 2.011384 -3.388322 -v 0.018741 2.031813 -3.389229 -v 0.018741 2.011384 -3.388322 -v 0.018741 2.031813 -3.389229 -v 0.018741 2.011384 -3.388322 -v 0.018740 2.011220 -3.380340 -v 0.018740 2.011220 -3.380340 -v 0.025654 2.011139 -3.376349 -v 0.025654 2.011139 -3.376349 -v 0.018740 2.024452 -3.375059 -v 0.025654 2.011139 -3.376349 -v 0.032569 2.011057 -3.372358 -v 0.032569 2.020771 -3.367974 -v 0.032569 2.011057 -3.372358 -v 0.039483 2.011139 -3.376349 -v 0.032569 2.020771 -3.367974 -v 0.039483 2.011139 -3.376349 -v 0.032569 2.020771 -3.367974 -v 0.039483 2.011139 -3.376349 -v 0.046397 2.011221 -3.380340 -v 0.046397 2.011221 -3.380340 -v 0.046397 2.011384 -3.388322 -v 0.046397 2.011384 -3.388322 -v 0.046397 2.024452 -3.375059 -v 0.046397 2.011384 -3.388322 -v 0.046397 2.011547 -3.396304 -v 0.046397 2.031813 -3.389229 -v 0.046397 2.011547 -3.396304 -v 0.039483 2.011629 -3.400295 -v 0.046397 2.031813 -3.389229 -v 0.039483 2.011629 -3.400295 -v 0.032569 2.035493 -3.396313 -v 0.046397 2.031813 -3.389229 -v 0.039483 2.011629 -3.400295 -v 0.032569 2.011710 -3.404286 -v 0.032569 2.035493 -3.396313 -v 0.032569 2.035493 -3.396313 -v 0.032569 2.035493 -3.396313 -v 0.018741 2.031813 -3.389229 -v 0.032569 2.020771 -3.367974 -v 0.046397 2.024452 -3.375059 -v 0.046397 2.024452 -3.375059 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.024452 -3.375059 -v 0.046397 2.031813 -3.389229 -v 0.046397 2.043779 -3.375513 -v 0.046397 2.031813 -3.389229 -v 0.032569 2.050018 -3.380495 -v 0.046397 2.043779 -3.375513 -v 0.046397 2.031813 -3.389229 -v 0.032569 2.035493 -3.396313 -v 0.032569 2.050018 -3.380495 -v 0.032569 2.050018 -3.380495 -v 0.032569 2.050018 -3.380495 -v 0.018740 2.043779 -3.375513 -v 0.018740 2.051516 -3.355524 -v 0.018741 2.031813 -3.389229 -v 0.018740 2.043779 -3.375513 -v 0.018741 2.031813 -3.389229 -v 0.018740 2.024452 -3.375059 -v 0.018740 2.036320 -3.350618 -v 0.018740 2.024452 -3.375059 -v 0.018740 2.036320 -3.350618 -v 0.032569 2.020771 -3.367974 -v 0.032569 2.028723 -3.348165 -v 0.032569 2.020771 -3.367974 -v 0.032569 2.028723 -3.348165 -v 0.032569 2.020771 -3.367974 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.036320 -3.350618 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.043779 -3.375513 -v 0.046397 2.043779 -3.375513 -v 0.032569 2.059114 -3.357977 -v 0.046397 2.043779 -3.375513 -v 0.032569 2.050018 -3.380495 -v 0.032569 2.059114 -3.357977 -v 0.018740 2.043779 -3.375513 -v 0.018740 2.051516 -3.355524 -v 0.018740 2.043779 -3.375513 -v 0.018740 2.036320 -3.350618 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.036320 -3.350618 -v 0.046397 2.031301 -3.365549 -v 0.046397 2.051516 -3.355524 -v 0.046397 2.051516 -3.355524 -v 0.032569 2.059114 -3.357977 -v 0.032569 2.059114 -3.357977 -v 0.032569 2.059114 -3.357977 -v 0.018740 2.051516 -3.355524 -v 0.018740 2.052788 -3.330760 -v 0.018740 2.051516 -3.355524 -v 0.018740 2.036820 -3.330763 -v 0.018740 2.052788 -3.330760 -v 0.018740 2.036320 -3.350618 -v 0.018740 2.036820 -3.330763 -v 0.018740 2.036320 -3.350618 -v 0.032569 2.028723 -3.348165 -v 0.032569 2.028723 -3.348165 -v 0.032569 2.028723 -3.348165 -v 0.046397 2.036320 -3.350618 -v 0.046397 2.036320 -3.350618 -v 0.046397 2.052788 -3.330760 -v 0.046397 2.036820 -3.330763 -v 0.032569 2.059114 -3.357977 -v 0.032569 2.060771 -3.330759 -v 0.046397 2.052788 -3.330760 -v 0.032569 2.060771 -3.330759 -v 0.032569 2.060771 -3.330759 -v 0.018740 2.052788 -3.330760 -v 0.018740 2.036820 -3.330763 -v 0.018740 2.036820 -3.330763 -v 0.032569 2.028836 -3.330764 -v 0.032569 2.028836 -3.330764 -v 0.032569 2.028836 -3.330764 -v 0.046397 2.036820 -3.330763 -v 0.046397 2.036820 -3.330763 -v 0.046397 2.036820 -3.330763 -v 0.046397 2.052788 -3.330760 -v 0.046397 2.052788 -3.330760 -v 0.032569 2.064860 -3.330672 -v 0.046397 2.052788 -3.330760 -v 0.032569 2.060771 -3.330759 -v 0.032569 2.064860 -3.330672 -v 0.032569 2.064860 -3.330672 -v 0.032569 2.064860 -3.330672 -v 0.015195 2.054830 -3.330672 -v 0.015195 2.054830 -3.330672 -v 0.015195 2.054830 -3.330672 -v 0.015195 2.034768 -3.330674 -v 0.015195 2.034768 -3.330674 -v 0.015195 2.034768 -3.330674 -v 0.032569 2.024737 -3.330674 -v 0.032569 2.024737 -3.330674 -v 0.032569 2.024737 -3.330674 -v 0.049942 2.034768 -3.330674 -v 0.049942 2.034768 -3.330674 -v 0.049942 2.034768 -3.330674 -v 0.049942 2.054830 -3.330673 -v 0.049942 2.054830 -3.330673 -v 0.032569 2.064887 -3.308321 -v 0.049942 2.054830 -3.330673 -v 0.032569 2.064860 -3.330672 -v 0.032569 2.064887 -3.308321 -v 0.032569 2.064887 -3.308321 -v 0.032569 2.064887 -3.308321 -v 0.015195 2.054856 -3.308321 -v 0.015195 2.054856 -3.308321 -v 0.015195 2.054856 -3.308321 -v 0.015195 2.034795 -3.308320 -v 0.015195 2.034795 -3.308320 -v 0.015195 2.034795 -3.308320 -v 0.032569 2.024764 -3.308320 -v 0.032569 2.024764 -3.308320 -v 0.032569 2.024764 -3.308320 -v 0.049942 2.034795 -3.308320 -v 0.049942 2.034795 -3.308320 -v 0.049942 2.034795 -3.308320 -v 0.049942 2.054856 -3.308321 -v 0.049942 2.054856 -3.308321 -v 0.032569 2.060795 -3.308268 -v 0.049942 2.054856 -3.308321 -v 0.032569 2.060795 -3.308268 -v 0.032569 2.060795 -3.308268 -v 0.032569 2.060795 -3.308268 -v 0.018740 2.052811 -3.308267 -v 0.018740 2.052811 -3.308267 -v 0.018740 2.052811 -3.308267 -v 0.018740 2.036843 -3.308267 -v 0.018740 2.036843 -3.308267 -v 0.018740 2.036843 -3.308267 -v 0.032569 2.028859 -3.308267 -v 0.032569 2.028859 -3.308267 -v 0.032569 2.028859 -3.308267 -v 0.046397 2.036843 -3.308267 -v 0.046397 2.036843 -3.308267 -v 0.046397 2.036843 -3.308267 -v 0.046397 2.052811 -3.308268 -v 0.046397 2.052811 -3.308268 -v 0.032569 2.060795 -3.268561 -v 0.046397 2.052811 -3.308268 -v 0.032569 2.060795 -3.308268 -v 0.032569 2.060795 -3.268561 -v 0.015195 2.054830 -3.330672 -v 0.018740 2.052788 -3.330760 -v 0.018740 2.036820 -3.330763 -v 0.015195 2.054830 -3.330672 -v 0.018740 2.036820 -3.330763 -v 0.015195 2.034768 -3.330674 -v 0.018740 2.036843 -3.268565 -v 0.032569 2.060795 -3.268561 -v 0.018740 2.052811 -3.268562 -v 0.032569 2.060795 -3.268561 -v 0.018740 2.036843 -3.268565 -v 0.046397 2.052811 -3.268562 -v 0.046397 2.052811 -3.268562 -v 0.018740 2.036843 -3.268565 -v 0.032569 2.028859 -3.268566 -v 0.046397 2.036843 -3.268565 -v 0.046397 2.052811 -3.268562 -v 0.032569 2.028859 -3.268566 -vt 0.674737 0.500000 -vt 0.357790 0.521564 -vt 0.362449 0.500000 -vt 0.678579 0.514936 -vt 0.352891 0.544006 -vt 0.682512 0.530149 -vt 0.342335 0.546176 -vt 0.690645 0.530801 -vt 0.330727 0.548325 -vt 0.699117 0.531395 -vt 0.324519 0.524834 -vt 0.703471 0.515872 -vt 0.318042 0.500000 -vt 0.707898 0.500000 -vt 0.324519 0.475166 -vt 0.703471 0.484128 -vt 0.330727 0.451675 -vt 0.699117 0.468605 -vt 0.342335 0.453824 -vt 0.690645 0.469199 -vt 0.352891 0.455994 -vt 0.682512 0.469851 -vt 0.357790 0.478436 -vt 0.678579 0.485064 -vt 0.330685 0.518945 -vt 0.333623 0.500000 -vt 0.327574 0.538855 -vt 0.320777 0.541196 -vt 0.313115 0.543741 -vt 0.308918 0.522659 -vt 0.304453 0.500000 -vt 0.308918 0.477341 -vt 0.313115 0.456259 -vt 0.320777 0.458804 -vt 0.327574 0.461145 -vt 0.330685 0.481055 -vt 0.305344 0.518023 -vt 0.306962 0.500000 -vt 0.303622 0.537068 -vt 0.299828 0.539556 -vt 0.295484 0.542370 -vt 0.293070 0.522064 -vt 0.290472 0.500000 -vt 0.293070 0.477936 -vt 0.295484 0.457630 -vt 0.299828 0.460444 -vt 0.303622 0.462932 -vt 0.305344 0.481977 -vt 0.276031 0.517622 -vt 0.276762 0.500000 -vt 0.275251 0.536275 -vt 0.273530 0.538783 -vt 0.271550 0.541655 -vt 0.270444 0.521727 -vt 0.269250 0.500000 -vt 0.270444 0.478273 -vt 0.271550 0.458345 -vt 0.273530 0.461217 -vt 0.275251 0.463725 -vt 0.276031 0.482378 -vt 0.253297 0.517636 -vt 0.253107 0.500000 -vt 0.253501 0.536316 -vt 0.253950 0.538862 -vt 0.254468 0.541789 -vt 0.254758 0.521813 -vt 0.255072 0.500000 -vt 0.254758 0.478187 -vt 0.254468 0.458211 -vt 0.253950 0.461138 -vt 0.253501 0.463684 -vt 0.253297 0.482364 -vt 0.242753 0.517632 -vt 0.242977 0.500000 -vt 0.242515 0.536308 -vt 0.241986 0.538852 -vn -0.499926 0.000093 -0.866068 -vn -0.499993 0.000090 -0.866030 -vn -0.499967 0.000090 -0.866044 -vn -0.500011 0.000089 -0.866019 -vn -1.000000 -0.000002 0.000000 -vn -1.000000 -0.000002 -0.000085 -vn -1.000000 -0.000005 0.000000 -vn -0.499885 -0.000077 0.866092 -vn -0.500011 -0.000071 0.866019 -vn -0.499926 -0.000071 0.866068 -vn -0.499993 -0.000068 0.866030 -vn 0.499908 -0.000066 0.866079 -vn 0.500019 -0.000071 0.866014 -vn 0.499904 -0.000071 0.866081 -vn 0.499993 -0.000075 0.866030 -vn 1.000000 0.000002 -0.000000 -vn 0.499904 0.000089 -0.866081 -vn 0.499992 0.000093 -0.866030 -vn 0.499908 0.000093 -0.866079 -vn 0.499974 0.000095 -0.866040 -vn -0.482624 0.278381 -0.830408 -vn -0.495787 0.280759 -0.821808 -vn -0.481194 0.288947 -0.827624 -vn -1.000000 -0.000004 -0.000049 -vn -1.000000 0.000032 -0.000084 -vn -0.475439 -0.326104 0.817076 -vn -0.498778 -0.336452 0.798762 -vn -0.468977 -0.363295 0.805032 -vn 0.468960 -0.363297 0.805041 -vn 0.498778 -0.336437 0.798768 -vn 0.475466 -0.326102 0.817061 -vn 0.481129 0.288978 -0.827651 -vn 0.495768 0.280765 -0.821818 -vn 0.482606 0.278386 -0.830418 -vn -0.499117 0.638289 -0.586062 -vn -0.473375 0.663754 -0.579091 -vn 0.458128 -0.721284 0.519489 -vn 0.499636 0.652735 -0.569474 -vn 0.476888 0.647446 -0.594468 -vn -0.499042 0.803503 -0.324559 -vn -0.482455 0.816866 -0.316175 -vn -1.000000 -0.000045 -0.000012 -vn -1.000000 0.000046 -0.000023 -vn -0.496313 -0.780940 0.379218 -vn -0.401093 -0.850106 0.341239 -vn 0.499081 -0.804185 0.322807 -vn 0.554248 -0.788967 0.265219 -vn 1.000000 0.000002 -0.000001 -vn 0.499383 0.807971 -0.312728 -vn 0.484095 0.811327 -0.327719 -vn -1.000000 -0.000002 0.000001 -vn 1.000000 0.000003 -0.000001 -vn 0.487131 0.872180 -0.044790 -vn -0.499288 0.864834 -0.052674 -vn -0.487144 0.872172 -0.044798 -vn -0.499874 -0.865824 0.021792 -vn -0.482293 -0.875991 0.005713 -vn 0.499987 -0.866015 0.005648 -vn 0.484403 -0.874568 0.022012 -vn 0.499287 0.864834 -0.052674 -vn -0.012270 0.021276 -0.999698 -vn -0.012326 0.021440 -0.999694 -vn -0.012545 -0.021657 -0.999687 -vn -0.012625 -0.021749 -0.999684 -vn 0.012598 -0.021749 -0.999684 -vn 0.012558 -0.021633 -0.999687 -vn 0.025108 0.000048 -0.999685 -vn 0.024440 0.000179 -0.999701 -vn 0.012264 0.021314 -0.999698 -vn 0.012232 0.021276 -0.999699 -vn -0.500017 0.866015 -0.001034 -vn -0.499999 0.866025 -0.001016 -vn -0.500007 -0.866021 0.001025 -vn -0.500007 -0.866021 0.001026 -vn 0.500008 -0.866020 0.001025 -vn 0.500007 0.866021 -0.001026 -vn 0.499998 0.866026 -0.001035 -vn -0.007550 0.013107 0.999886 -vn -0.007521 0.013074 0.999886 -vn -0.015065 -0.000000 0.999887 -vn -0.014884 0.000036 0.999889 -vn -0.007428 -0.012866 0.999890 -vn -0.007447 -0.012923 0.999889 -vn 0.007461 -0.012923 0.999889 -vn 0.007462 -0.012924 0.999889 -vn 0.014939 0.000015 0.999888 -vn 0.014984 0.000024 0.999888 -vn 0.007501 0.012992 0.999887 -vn 0.007540 0.013107 0.999886 -vn -0.499995 0.866028 -0.000001 -vn -1.000000 -0.000002 0.000009 -vn -0.499994 -0.866029 0.000010 -vn 0.500014 -0.866018 0.000001 -vn 0.499995 -0.866028 0.000009 -vn 1.000000 0.000002 0.000008 -vn 0.500001 0.866025 -0.000006 -vn 0.499994 0.866029 -0.000010 -vn -0.024574 0.000179 -0.999698 -vn -0.025122 0.000071 -0.999684 -vn 0.000009 -0.000164 1.000000 -vn -0.000004 -0.000157 1.000000 -vn 0.000013 -0.000187 1.000000 -vn 0.000000 -0.000179 1.000000 -s off -f 260/13/108 273/14/108 272/15/108 -f 260/13/109 261/16/109 273/14/109 -f 261/16/110 274/17/110 273/14/110 -f 261/16/111 262/18/111 274/17/111 -f 262/18/112 275/19/112 274/17/112 -f 262/18/112 263/20/112 275/19/112 -f 263/20/113 276/21/113 275/19/113 -f 263/20/114 264/22/114 276/21/114 -f 264/22/115 277/23/115 276/21/115 -f 264/22/116 265/24/116 277/23/116 -f 265/24/117 278/25/117 277/23/117 -f 265/24/118 266/26/118 278/25/118 -f 266/26/119 279/27/119 278/25/119 -f 266/26/120 267/28/120 279/27/120 -f 267/28/121 280/29/121 279/27/121 -f 267/28/122 268/30/122 280/29/122 -f 268/30/123 281/31/123 280/29/123 -f 268/30/123 269/32/123 281/31/123 -f 269/32/123 282/33/123 281/31/123 -f 269/32/123 270/34/123 282/33/123 -f 270/34/124 283/35/124 282/33/124 -f 270/34/125 271/36/125 283/35/125 -f 271/36/126 272/15/126 283/35/126 -f 271/36/127 260/13/127 272/15/127 -f 272/15/128 330/37/128 284/38/128 -f 331/15/129 285/14/129 332/37/129 -f 273/14/130 333/39/130 334/37/130 -f 335/14/112 336/17/112 337/39/112 -f 338/17/131 286/40/131 339/39/131 -f 340/17/132 341/19/132 286/40/132 -f 342/19/133 343/41/133 286/40/133 -f 344/19/134 287/21/134 345/41/134 -f 346/21/135 347/42/135 348/41/135 -f 349/21/136 350/23/136 351/42/136 -f 352/23/137 288/43/137 353/42/137 -f 354/23/138 355/25/138 288/43/138 -f 356/25/123 357/44/123 288/43/123 -f 358/25/123 289/27/123 359/44/123 -f 360/27/123 361/45/123 362/44/123 -f 363/27/139 364/29/139 365/45/139 -f 366/29/140 367/46/140 368/45/140 -f 369/29/141 370/31/141 371/46/141 -f 372/31/142 291/47/142 290/46/142 -f 373/31/143 374/33/143 291/47/143 -f 375/33/144 376/48/144 292/47/144 -f 377/33/123 293/35/123 378/48/123 -f 379/35/123 380/38/123 381/48/123 -f 382/35/145 383/15/145 384/38/145 -f 385/38/146 386/49/146 387/50/146 -f 388/38/147 295/37/147 294/49/147 -f 389/37/148 390/51/148 391/49/148 -f 392/37/149 296/39/149 393/51/149 -f 394/39/150 395/52/150 396/51/150 -f 397/39/151 297/40/151 398/52/151 -f 286/40/152 399/53/152 400/52/152 -f 401/40/153 298/41/153 402/53/153 -f 403/41/154 404/54/154 405/53/154 -f 406/41/155 407/42/155 299/54/155 -f 408/42/156 409/55/156 299/54/156 -f 410/42/157 411/43/157 412/55/157 -f 413/43/112 302/56/112 414/55/112 -f 415/43/158 416/44/158 302/56/158 -f 417/44/159 305/57/159 418/56/159 -f 419/44/123 420/45/123 305/57/123 -f 421/45/160 422/58/160 305/57/160 -f 423/45/161 301/46/161 300/58/161 -f 424/46/162 425/59/162 426/58/162 -f 427/46/112 428/47/112 429/59/112 -f 430/47/163 303/60/163 431/59/163 -f 432/47/164 433/48/164 303/60/164 -f 434/48/165 304/50/165 303/60/165 -f 435/48/166 436/38/166 304/50/166 -f 437/50/123 438/61/123 439/62/123 -f 440/50/167 441/49/167 442/61/167 -f 443/49/168 307/63/168 306/61/168 -f 444/49/169 445/51/169 307/63/169 -f 446/51/170 309/64/170 308/63/170 -f 447/51/171 448/52/171 309/64/171 -f 449/52/172 310/65/172 309/64/172 -f 450/52/173 451/53/173 310/65/173 -f 452/53/174 311/66/174 310/65/174 -f 453/53/175 454/54/175 311/66/175 -f 455/54/176 456/67/176 311/66/176 -f 457/54/177 458/55/177 459/67/177 -f 460/55/178 313/68/178 312/67/178 -f 461/55/179 462/56/179 313/68/179 -f 463/56/112 314/69/112 313/68/112 -f 464/56/112 465/57/112 314/69/112 -f 466/57/180 315/70/180 314/69/180 -f 467/57/181 468/58/181 315/70/181 -f 469/58/182 316/71/182 315/70/182 -f 470/58/182 471/59/182 316/71/182 -f 472/59/123 317/72/123 316/71/123 -f 473/59/155 474/60/155 317/72/155 -f 475/60/183 476/62/183 317/72/183 -f 477/60/184 478/50/184 479/62/184 -f 480/62/185 319/73/185 318/74/185 -f 481/62/186 482/61/186 319/73/186 -f 483/61/187 320/75/187 319/73/187 -f 484/61/188 485/63/188 320/75/188 -f 486/63/189 321/76/189 320/75/189 -f 487/63/190 488/64/190 321/76/190 -f 489/64/191 322/77/191 321/76/191 -f 490/64/192 491/65/192 322/77/192 -f 492/65/193 323/78/193 322/77/193 -f 493/65/194 494/66/194 323/78/194 -f 495/66/195 496/79/195 323/78/195 -f 497/66/196 312/67/196 498/79/196 -f 499/67/197 325/80/197 324/79/197 -f 500/67/197 501/68/197 325/80/197 -f 502/68/198 326/81/198 325/80/198 -f 503/68/198 504/69/198 326/81/198 -f 505/69/199 327/82/199 326/81/199 -f 506/69/199 507/70/199 327/82/199 -f 508/70/200 328/83/200 327/82/200 -f 509/70/201 510/71/201 328/83/201 -f 511/71/202 329/84/202 328/83/202 -f 512/71/202 513/72/202 329/84/202 -f 514/72/203 515/74/203 329/84/203 -f 516/72/204 517/62/204 518/74/204 -f 519/74/205 520/85/205 521/86/205 -f 522/74/206 523/73/206 524/85/206 -f 525/73/207 526/87/207 527/85/207 -f 528/73/208 529/75/208 530/87/208 -f 531/75/209 532/88/209 533/87/209 -f 534/75/210 535/76/210 536/88/210 -o dieswall -v -1.412613 0.098376 4.357330 -v 0.555739 0.095511 4.357331 -v 0.555859 0.094949 2.388850 -v -1.412615 0.097814 2.388850 -v -1.379254 0.607765 4.323968 -v 0.522495 0.607763 4.323967 -v 0.522495 0.607765 2.422217 -v -1.379255 0.607767 2.422217 -v 1.207432 0.092447 -3.049533 -v 1.207434 0.093395 0.268969 -v -0.670411 0.096129 0.270138 -v -2.121743 0.098242 0.270138 -v -0.670413 0.095181 -3.049484 -v -0.243875 0.095508 0.270138 -v -0.243877 0.094560 -3.049584 -v -2.125251 0.094257 -3.049582 -v -2.088385 0.507715 0.236775 -v -0.703778 0.507713 0.236775 -v -0.703778 0.507717 -3.016219 -v -2.088385 0.507718 -3.016219 -v -0.210512 0.507713 0.236773 -v 1.174095 0.507711 0.236773 -v 1.174095 0.507715 -3.016220 -v -0.210513 0.507716 -3.016221 -vt 11.358181 0.011520 -vt 12.665374 1.000002 -vt 11.374322 1.000002 -vt 12.680956 0.005964 -vt 13.290203 1.000000 -vt 13.347682 0.004867 -vt 10.777996 1.000000 -vt 10.720117 0.010423 -vt 7.422454 0.011244 -vt 5.351833 0.805839 -vt 7.361876 0.805839 -vt 5.282763 0.007148 -vt 4.169651 0.805836 -vt 4.145276 0.005299 -vt 5.064029 0.805836 -vt 5.076667 0.003502 -vt 2.699338 0.005944 -vt 0.636806 0.805840 -vt 2.632222 0.805840 -vt 0.578067 0.001847 -vt 2.933929 0.805837 -vt 2.923321 -0.000002 -vt 3.827914 0.805837 -vt 3.852311 0.004095 -vn 0.000000 0.065354 0.997862 -vn 0.000094 0.065000 0.997885 -vn 0.997901 0.064761 -0.000000 -vn 0.997890 0.064921 0.000042 -vn -0.000000 0.064928 -0.997890 -vn 0.000095 0.065287 -0.997867 -vn -0.997867 0.065277 0.000001 -vn -0.997863 0.065346 -0.000018 -vn 0.000000 0.081208 0.996697 -vn 0.000117 0.080805 0.996730 -vn 0.996730 0.080804 0.000000 -vn 0.996745 0.080616 -0.000024 -vn -0.000000 0.080373 -0.996765 -vn 0.000017 0.080430 -0.996760 -vn -0.996049 0.088811 0.000000 -vn -0.996691 0.081274 0.000956 -vn 0.000000 0.080678 0.996740 -vn 0.000916 0.077548 0.996988 -vn 0.996778 0.080208 0.000000 -vn 0.996793 0.080022 -0.000024 -vn 0.000001 0.079962 -0.996798 -vn 0.000152 0.080476 -0.996756 -vn -0.996755 0.080492 0.000000 -vn -0.996741 0.080672 -0.000023 -s off -f 537/89/211 542/90/211 541/91/211 -f 537/89/212 538/92/212 542/90/212 -f 538/92/213 543/93/213 542/90/213 -f 538/92/214 539/94/214 543/93/214 -f 539/94/215 544/95/215 543/93/215 -f 539/94/216 540/96/216 544/95/216 -f 540/96/217 541/91/217 544/95/217 -f 540/96/218 537/89/218 541/91/218 -f 548/97/219 554/98/219 553/99/219 -f 548/97/220 547/100/220 554/98/220 -f 547/100/221 555/101/221 554/98/221 -f 547/100/222 549/102/222 555/101/222 -f 549/102/223 556/103/223 555/101/223 -f 549/102/224 552/104/224 556/103/224 -f 552/104/225 553/99/225 556/103/225 -f 552/104/226 548/97/226 553/99/226 -f 550/105/227 558/106/227 557/107/227 -f 550/105/228 546/108/228 558/106/228 -f 546/108/229 559/109/229 558/106/229 -f 546/108/230 545/110/230 559/109/230 -f 545/110/231 560/111/231 559/109/231 -f 545/110/232 551/112/232 560/111/232 -f 551/112/233 557/107/233 560/111/233 -f 551/112/234 550/105/234 557/107/234 -o diesshus -v -0.061721 0.614979 1.165604 -v -0.061721 0.573250 1.165595 -v -0.061721 0.614886 0.962656 -v -0.061721 0.573117 0.917222 -v -0.061721 0.636227 0.917354 -v -0.061721 0.749642 1.089949 -v -0.061721 0.749144 1.165475 -v -0.061721 0.791742 1.165462 -v -0.061721 0.791744 0.917324 -v -0.061721 0.750401 0.917317 -v -0.074691 0.825459 0.917321 -v -0.074691 0.825458 1.165570 -v -0.074691 0.791744 0.917324 -v -0.074691 0.791742 1.165462 -v -0.074691 0.750401 0.917317 -v -0.074691 0.749143 1.165475 -v -0.074691 0.636227 0.917354 -v -0.074691 0.614979 1.165604 -v -0.074691 0.573117 0.917222 -v -0.074691 0.573250 1.165595 -v -0.074691 0.542229 0.917320 -v -0.074691 0.542228 1.165570 -v -0.100631 0.614886 0.962656 -v -0.100631 0.614979 1.165604 -v -0.100631 0.636227 0.917354 -v -0.100631 0.749642 1.089949 -v -0.100631 0.749144 1.165475 -v -0.100631 0.750401 0.917317 -v -0.100631 0.825459 0.917321 -v -0.100630 0.825458 1.165570 -v -0.100631 0.542229 0.917320 -v -0.100631 0.542228 1.165570 -v -0.061721 0.752640 1.856935 -v -0.061721 0.794369 1.856944 -v -0.061721 0.752733 2.059883 -v -0.061721 0.794502 2.105317 -v -0.061721 0.731392 2.105185 -v -0.061721 0.617977 1.932591 -v -0.061721 0.618475 1.857064 -v -0.061721 0.575877 1.857077 -v -0.061721 0.575875 2.105215 -v -0.061721 0.617218 2.105222 -v -0.074691 0.542161 2.105218 -v -0.074691 0.542161 1.856969 -v -0.074691 0.575875 2.105215 -v -0.074691 0.575877 1.857077 -v -0.074691 0.617218 2.105221 -v -0.074691 0.618476 1.857064 -v -0.074691 0.731392 2.105185 -v -0.074691 0.752640 1.856935 -v -0.074691 0.794502 2.105317 -v -0.074691 0.794369 1.856944 -v -0.074691 0.825390 2.105218 -v -0.074691 0.825391 1.856969 -v -0.100631 0.752733 2.059883 -v -0.100631 0.752640 1.856935 -v -0.100631 0.731392 2.105185 -v -0.100631 0.617977 1.932591 -v -0.100631 0.618475 1.857064 -v -0.100631 0.617218 2.105221 -v -0.100631 0.542161 2.105218 -v -0.100631 0.542161 1.856969 -v -0.100631 0.825390 2.105218 -v -0.100631 0.825391 1.856969 -v -0.074691 0.614979 1.165604 -v -0.074691 0.636227 0.917354 -v -0.100631 0.614886 0.962656 -v -0.074691 0.749143 1.165475 -v -0.074691 0.750401 0.917317 -v -0.100631 0.749642 1.089949 -v -0.074691 0.825459 0.917321 -v -0.074691 0.825458 1.165570 -v -0.074691 0.825459 0.917321 -v -0.074691 0.825459 0.917321 -v -0.074691 0.791744 0.917324 -v -0.100631 0.825459 0.917321 -v -0.074691 0.791742 1.165462 -v -0.074691 0.825458 1.165570 -v -0.100630 0.825458 1.165570 -v -0.100631 0.636227 0.917354 -v -0.100631 0.750401 0.917317 -v -0.074691 0.636227 0.917354 -v -0.074691 0.750401 0.917317 -v -0.074691 0.636227 0.917354 -v -0.100631 0.750401 0.917317 -v -0.100631 0.749144 1.165475 -v -0.100631 0.614979 1.165604 -v -0.074691 0.749143 1.165475 -v -0.074691 0.614979 1.165604 -v -0.074691 0.749143 1.165475 -v -0.100631 0.614979 1.165604 -v -0.074691 0.573117 0.917222 -v -0.074691 0.542229 0.917320 -v -0.074691 0.542228 1.165570 -v -0.074691 0.542229 0.917320 -v -0.074691 0.542228 1.165570 -v -0.100631 0.542229 0.917320 -v -0.074691 0.542228 1.165570 -v -0.074691 0.573250 1.165595 -v -0.100631 0.542228 1.165570 -v -0.074691 0.614979 1.165604 -v -0.074691 0.573250 1.165595 -v -0.061721 0.614979 1.165604 -v -0.061721 0.573250 1.165595 -v -0.061721 0.614979 1.165604 -v -0.074691 0.573250 1.165595 -v -0.100631 0.614886 0.962656 -v -0.074691 0.614979 1.165604 -v -0.061721 0.614886 0.962656 -v -0.061721 0.614979 1.165604 -v -0.061721 0.614886 0.962656 -v -0.074691 0.614979 1.165604 -v -0.074691 0.573250 1.165595 -v -0.074691 0.573117 0.917222 -v -0.061721 0.573250 1.165595 -v -0.061721 0.573117 0.917222 -v -0.061721 0.573250 1.165595 -v -0.074691 0.573117 0.917222 -v -0.074691 0.573117 0.917222 -v -0.074691 0.636227 0.917354 -v -0.061721 0.573117 0.917222 -v -0.061721 0.636227 0.917354 -v -0.061721 0.573117 0.917222 -v -0.074691 0.636227 0.917354 -v -0.074691 0.636227 0.917354 -v -0.100631 0.749642 1.089949 -v -0.061721 0.636227 0.917354 -v -0.061721 0.749642 1.089949 -v -0.061721 0.636227 0.917354 -v -0.100631 0.749642 1.089949 -v -0.074691 0.749143 1.165475 -v -0.100631 0.614886 0.962656 -v -0.061721 0.749144 1.165475 -v -0.061721 0.614886 0.962656 -v -0.061721 0.749144 1.165475 -v -0.100631 0.614886 0.962656 -v -0.074691 0.791742 1.165462 -v -0.074691 0.749143 1.165475 -v -0.061721 0.791742 1.165462 -v -0.061721 0.749144 1.165475 -v -0.061721 0.791742 1.165462 -v -0.074691 0.749143 1.165475 -v -0.074691 0.791744 0.917324 -v -0.074691 0.791742 1.165462 -v -0.061721 0.791744 0.917324 -v -0.061721 0.791742 1.165462 -v -0.061721 0.791744 0.917324 -v -0.074691 0.791742 1.165462 -v -0.100631 0.749642 1.089949 -v -0.074691 0.750401 0.917317 -v -0.061721 0.749642 1.089949 -v -0.061721 0.750401 0.917317 -v -0.061721 0.749642 1.089949 -v -0.074691 0.750401 0.917317 -v -0.074691 0.750401 0.917317 -v -0.074691 0.791744 0.917324 -v -0.061721 0.750401 0.917317 -v -0.061721 0.791744 0.917324 -v -0.061721 0.750401 0.917317 -v -0.074691 0.791744 0.917324 -v -0.100631 0.542229 0.917320 -v -0.074691 0.636227 0.917354 -v -0.074691 0.573117 0.917222 -v -0.100631 0.636227 0.917354 -v -0.074691 0.636227 0.917354 -v -0.100631 0.542229 0.917320 -v -0.100631 0.750401 0.917317 -v -0.100631 0.825459 0.917321 -v -0.074691 0.791744 0.917324 -v -0.100631 0.750401 0.917317 -v -0.074691 0.791744 0.917324 -v -0.074691 0.750401 0.917317 -v -0.100631 0.749144 1.165475 -v -0.074691 0.749143 1.165475 -v -0.074691 0.791742 1.165462 -v -0.100631 0.749144 1.165475 -v -0.074691 0.791742 1.165462 -v -0.100630 0.825458 1.165570 -v -0.074691 0.573250 1.165595 -v -0.074691 0.614979 1.165604 -v -0.100631 0.614979 1.165604 -v -0.100631 0.542228 1.165570 -v -0.074691 0.573250 1.165595 -v -0.100631 0.614979 1.165604 -v -0.061721 0.794369 1.856944 -v -0.061721 0.752733 2.059883 -v -0.061721 0.794502 2.105317 -v -0.061721 0.752733 2.059883 -v -0.061721 0.731392 2.105185 -v -0.061721 0.752733 2.059883 -v -0.061721 0.752733 2.059883 -v -0.061721 0.617977 1.932591 -v -0.061721 0.618475 1.857064 -v -0.061721 0.617977 1.932591 -v -0.061721 0.575877 1.857077 -v -0.061721 0.617977 1.932591 -v -0.061721 0.617977 1.932591 -v -0.074691 0.575875 2.105215 -v -0.074691 0.575877 1.857077 -v -0.074691 0.575877 1.857077 -v -0.074691 0.618476 1.857064 -v -0.074691 0.731392 2.105185 -v -0.074691 0.731392 2.105185 -v -0.074691 0.794502 2.105317 -v -0.074691 0.794369 1.856944 -v -0.074691 0.825390 2.105218 -v -0.074691 0.794369 1.856944 -v -0.074691 0.752640 1.856935 -v -0.074691 0.731392 2.105185 -v -0.100631 0.752733 2.059883 -v -0.074691 0.618476 1.857064 -v -0.074691 0.617218 2.105221 -v -0.100631 0.617977 1.932591 -v -0.074691 0.542161 2.105218 -v -0.074691 0.542161 1.856969 -v -0.074691 0.542161 2.105218 -v -0.100631 0.542161 1.856969 -v -0.074691 0.542161 2.105218 -v -0.074691 0.575875 2.105215 -v -0.100631 0.542161 2.105218 -v -0.074691 0.575877 1.857077 -v -0.074691 0.542161 1.856969 -v -0.100631 0.542161 1.856969 -v -0.100631 0.731392 2.105185 -v -0.100631 0.617218 2.105221 -v -0.074691 0.731392 2.105185 -v -0.074691 0.617218 2.105221 -v -0.074691 0.731392 2.105185 -v -0.100631 0.617218 2.105221 -v -0.100631 0.618475 1.857064 -v -0.100631 0.752640 1.856935 -v -0.074691 0.618476 1.857064 -v -0.074691 0.752640 1.856935 -v -0.074691 0.618476 1.857064 -v -0.100631 0.752640 1.856935 -v -0.074691 0.794502 2.105317 -v -0.074691 0.825390 2.105218 -v -0.074691 0.825391 1.856969 -v -0.074691 0.825390 2.105218 -v -0.074691 0.825391 1.856969 -v -0.100631 0.825390 2.105218 -v -0.074691 0.825391 1.856969 -v -0.074691 0.794369 1.856944 -v -0.100631 0.825391 1.856969 -v -0.074691 0.752640 1.856935 -v -0.074691 0.794369 1.856944 -v -0.061721 0.752640 1.856935 -v -0.061721 0.794369 1.856944 -v -0.061721 0.752640 1.856935 -v -0.074691 0.794369 1.856944 -v -0.100631 0.752733 2.059883 -v -0.074691 0.752640 1.856935 -v -0.061721 0.752733 2.059883 -v -0.061721 0.752640 1.856935 -v -0.061721 0.752733 2.059883 -v -0.074691 0.752640 1.856935 -v -0.074691 0.794369 1.856944 -v -0.074691 0.794502 2.105317 -v -0.061721 0.794369 1.856944 -v -0.061721 0.794502 2.105317 -v -0.061721 0.794369 1.856944 -v -0.074691 0.794502 2.105317 -v -0.074691 0.794502 2.105317 -v -0.074691 0.731392 2.105185 -v -0.061721 0.794502 2.105317 -v -0.061721 0.731392 2.105185 -v -0.061721 0.794502 2.105317 -v -0.074691 0.731392 2.105185 -v -0.074691 0.731392 2.105185 -v -0.100631 0.617977 1.932591 -v -0.061721 0.731392 2.105185 -v -0.061721 0.617977 1.932591 -v -0.061721 0.731392 2.105185 -v -0.100631 0.617977 1.932591 -v -0.074691 0.618476 1.857064 -v -0.100631 0.752733 2.059883 -v -0.061721 0.618475 1.857064 -v -0.061721 0.752733 2.059883 -v -0.061721 0.618475 1.857064 -v -0.100631 0.752733 2.059883 -v -0.074691 0.575877 1.857077 -v -0.074691 0.618476 1.857064 -v -0.061721 0.575877 1.857077 -v -0.061721 0.618475 1.857064 -v -0.061721 0.575877 1.857077 -v -0.074691 0.618476 1.857064 -v -0.074691 0.575875 2.105215 -v -0.074691 0.575877 1.857077 -v -0.061721 0.575875 2.105215 -v -0.061721 0.575877 1.857077 -v -0.061721 0.575875 2.105215 -v -0.074691 0.575877 1.857077 -v -0.100631 0.617977 1.932591 -v -0.074691 0.617218 2.105221 -v -0.061721 0.617977 1.932591 -v -0.061721 0.617218 2.105222 -v -0.061721 0.617977 1.932591 -v -0.074691 0.617218 2.105221 -v -0.074691 0.617218 2.105221 -v -0.074691 0.575875 2.105215 -v -0.061721 0.617218 2.105222 -v -0.061721 0.575875 2.105215 -v -0.061721 0.617218 2.105222 -v -0.074691 0.575875 2.105215 -v -0.100631 0.825390 2.105218 -v -0.074691 0.731392 2.105185 -v -0.074691 0.794502 2.105317 -v -0.100631 0.731392 2.105185 -v -0.074691 0.731392 2.105185 -v -0.100631 0.825390 2.105218 -v -0.100631 0.617218 2.105221 -v -0.074691 0.575875 2.105215 -v -0.100631 0.617218 2.105221 -v -0.074691 0.575875 2.105215 -v -0.074691 0.617218 2.105221 -v -0.100631 0.618475 1.857064 -v -0.074691 0.618476 1.857064 -v -0.074691 0.575877 1.857077 -v -0.100631 0.618475 1.857064 -v -0.074691 0.575877 1.857077 -v -0.100631 0.542161 1.856969 -v -0.074691 0.794369 1.856944 -v -0.074691 0.752640 1.856935 -v -0.100631 0.752640 1.856935 -v -0.100631 0.825391 1.856969 -v -0.074691 0.794369 1.856944 -v -0.100631 0.752640 1.856935 -vt 1.810996 1.000000 -vt 1.263047 1.000000 -vt 1.810987 0.880992 -vt 1.263285 0.880987 -vt 1.811002 0.735057 -vt 1.263256 0.730619 -vt 1.810922 0.332037 -vt 1.262971 0.257037 -vt 1.811213 0.109265 -vt 1.262991 0.109736 -vt 1.810996 0.000234 -vt 1.263047 0.000234 -vt 1.710928 0.256707 -vt 1.262971 0.257036 -vt 1.429962 0.732379 -vt 1.811003 0.735057 -vt 1.263046 1.000000 -vt 1.810987 0.880993 -vt 1.263286 0.880986 -vt 1.263285 0.880986 -vt 1.810988 0.880992 -vt -0.262971 0.742963 -vt -0.262990 0.890264 -vt -0.710928 0.743293 -vt -0.811213 0.890735 -vt -0.810921 0.667963 -vt -0.429962 0.267621 -vt -0.263256 0.269381 -vt -0.263285 0.119013 -vt -0.810987 0.119007 -vt -0.811002 0.264943 -vt -0.810996 -0.000000 -vt -0.263047 -0.000000 -vt -0.263285 0.119014 -vt -0.262970 0.742963 -vt -0.811212 0.890735 -vt -0.262991 0.890264 -vt -0.810995 0.999765 -vt -0.263047 0.999765 -vt -0.429963 0.267620 -vn 1.000000 -0.000000 -0.000002 -vn 1.000000 -0.000001 -0.000002 -vn 1.000000 -0.000013 0.000000 -vn 1.000000 0.000016 -0.000002 -vn -0.000002 1.000000 -0.000459 -vn 0.000002 0.835715 -0.549164 -vn -0.000004 -0.833859 0.551978 -vn 0.000000 -0.999990 -0.004396 -vn 0.000000 1.000000 0.000001 -vn 0.000000 -0.000106 -1.000000 -vn 0.000000 -0.003203 0.999995 -vn -0.000000 -0.000324 -1.000000 -vn 0.000009 -0.000322 -1.000000 -vn 0.000000 0.000961 1.000000 -vn 0.000018 0.000958 0.999999 -vn -0.000009 -0.003172 -0.999995 -vn -0.000002 -1.000000 -0.000001 -vn -0.000000 -1.000000 -0.000001 -vn -0.000009 -0.000822 1.000000 -vn -0.000037 -0.000206 1.000000 -vn 0.000000 -0.000217 1.000000 -vn 0.000002 1.000000 -0.000459 -vn 0.000005 1.000000 -0.000459 -vn 0.000000 -1.000000 0.000536 -vn 0.000000 0.002093 -0.999998 -vn -0.000003 0.835714 -0.549164 -vn 0.000000 0.835715 -0.549164 -vn 0.000004 -0.833859 0.551978 -vn -0.000001 -0.833859 0.551978 -vn 0.000000 0.000313 1.000000 -vn 0.000005 1.000000 0.000008 -vn 0.000000 0.000167 -1.000000 -vn -0.006279 0.002093 -0.999978 -vn 0.000000 0.000360 -1.000000 -vn 0.000200 0.000048 -1.000000 -vn 0.000009 0.000167 -1.000000 -vn 0.002551 -0.001240 0.999996 -vn 0.000018 -0.000206 1.000000 -vn -0.000420 -0.000478 1.000000 -vn 1.000000 -0.000001 0.000000 -vn -0.000002 -1.000000 0.000459 -vn 0.000000 -0.835714 0.549165 -vn -0.000004 0.833858 -0.551979 -vn 0.000002 0.999990 0.004395 -vn 0.000002 -1.000000 -0.000002 -vn -0.000000 0.000106 1.000000 -vn 0.000000 0.003203 -0.999995 -vn 0.000000 0.000319 1.000000 -vn 0.000000 -0.000962 -1.000000 -vn 0.000005 -0.000961 -1.000000 -vn -0.000000 0.003196 0.999995 -vn 0.000005 0.000819 -1.000000 -vn 0.000009 0.000217 -1.000000 -vn -0.000009 0.000211 -1.000000 -vn -0.000000 -1.000000 0.000459 -vn -0.000000 1.000000 -0.000536 -vn 0.000000 -0.002097 0.999998 -vn 0.000000 -0.835714 0.549166 -vn 0.000004 -0.835714 0.549165 -vn 0.000003 0.833859 -0.551978 -vn 0.000007 0.833859 -0.551977 -vn 0.000009 -0.000308 -1.000000 -vn -0.000009 -0.000313 -1.000000 -vn 0.000000 -1.000000 -0.000009 -vn -0.000003 0.999990 0.004396 -vn -0.000000 0.999990 0.004396 -vn -0.000037 -0.000161 1.000000 -vn 0.000000 -0.000173 1.000000 -vn -0.006302 -0.002097 0.999978 -vn 0.000000 -0.000358 1.000000 -vn 0.000192 -0.000041 1.000000 -vn -0.000000 -0.000161 1.000000 -vn 0.000000 -0.000308 -1.000000 -vn 0.002547 0.001243 -0.999996 -vn 0.000005 0.000217 -1.000000 -vn -0.000408 0.000474 -1.000000 -s off -f 571/113/235 572/114/235 573/115/235 -f 572/114/235 574/116/235 573/115/235 -f 573/115/236 574/116/236 575/117/236 -f 574/116/236 576/118/236 575/117/236 -f 575/117/236 576/118/236 577/119/236 -f 576/118/235 578/120/235 577/119/235 -f 577/119/235 578/120/235 579/121/235 -f 578/120/237 580/122/237 579/121/237 -f 579/121/63 580/122/63 581/123/63 -f 581/123/238 580/122/238 582/124/238 -f 625/125/239 583/126/239 584/125/239 -f 585/120/240 586/125/240 626/126/240 -f 587/119/241 627/127/241 628/119/241 -f 629/127/242 630/119/242 588/127/242 -f 589/118/243 590/125/243 631/118/243 -f 632/125/243 633/118/243 590/125/243 -f 634/127/244 635/128/244 636/127/244 -f 637/117/245 638/127/245 639/128/245 -f 640/113/246 641/129/246 642/113/246 -f 643/114/247 644/113/247 645/129/247 -f 646/130/248 647/113/248 648/115/248 -f 649/113/249 650/115/249 651/113/249 -f 652/129/250 653/131/250 591/114/250 -f 592/116/251 591/114/251 654/131/251 -f 655/119/252 656/128/252 657/119/252 -f 658/117/253 659/119/253 660/128/253 -f 661/118/254 662/126/254 663/118/254 -f 664/120/255 665/118/255 666/126/255 -f 667/123/256 668/121/256 669/123/256 -f 670/121/257 671/123/257 672/121/257 -f 673/124/258 674/123/258 675/124/258 -f 676/123/258 677/124/258 678/123/258 -f 679/122/259 680/124/259 681/122/259 -f 682/124/259 683/122/259 684/124/259 -f 685/120/260 686/122/260 687/126/260 -f 688/122/261 689/126/261 690/122/261 -f 691/125/262 692/120/262 693/125/262 -f 694/126/263 695/125/263 696/120/263 -f 697/122/264 698/121/264 699/122/264 -f 700/121/264 701/122/264 702/121/264 -f 703/121/265 704/119/265 705/121/265 -f 706/119/265 707/121/265 708/119/265 -f 709/119/242 710/127/242 711/119/242 -f 712/127/242 713/119/242 714/127/242 -f 715/118/266 716/125/266 717/118/266 -f 718/125/266 719/118/266 720/125/266 -f 721/116/267 722/118/267 723/132/267 -f 724/118/268 725/132/268 726/118/268 -f 727/115/269 728/116/269 729/133/269 -f 730/132/270 731/133/270 732/116/270 -f 733/127/264 734/117/264 735/127/264 -f 736/128/271 737/127/271 738/117/271 -f 739/117/272 740/115/272 741/128/272 -f 742/133/273 743/128/273 744/115/273 -f 603/134/63 604/135/63 605/136/63 -f 604/135/63 606/137/63 605/136/63 -f 758/137/274 759/138/274 607/136/274 -f 760/138/274 608/139/274 607/136/274 -f 607/136/274 608/139/274 609/140/274 -f 761/140/63 610/139/63 762/141/63 -f 763/141/63 610/139/63 611/142/63 -f 610/139/274 612/143/274 611/142/274 -f 764/144/63 765/145/63 613/142/63 -f 766/145/63 767/146/63 614/142/63 -f 768/142/275 615/146/275 616/143/275 -f 617/146/276 618/140/276 769/143/276 -f 619/143/277 770/140/277 771/138/277 -f 772/140/278 773/147/278 620/138/278 -f 621/138/279 622/147/279 774/148/279 -f 775/147/251 776/149/251 777/148/251 -f 778/148/280 779/149/280 780/150/280 -f 781/150/281 782/149/281 783/151/281 -f 784/136/282 785/134/282 786/136/282 -f 787/147/282 788/136/282 789/134/282 -f 790/138/283 791/152/283 792/138/283 -f 793/139/284 794/138/284 795/152/284 -f 796/140/285 797/136/285 623/140/285 -f 624/136/243 623/140/243 798/136/243 -f 799/152/243 800/143/243 801/139/243 -f 802/143/286 803/139/286 804/143/286 -f 805/144/287 806/145/287 807/144/287 -f 808/145/288 809/144/288 810/145/288 -f 811/142/289 812/144/289 813/142/289 -f 814/144/289 815/142/289 816/144/289 -f 817/145/290 818/146/290 819/145/290 -f 820/146/290 821/145/290 822/146/290 -f 823/138/291 824/143/291 825/138/291 -f 826/143/291 827/138/291 828/143/291 -f 829/140/292 830/134/292 831/140/292 -f 832/147/293 833/140/293 834/134/293 -f 835/150/294 836/137/294 837/150/294 -f 838/148/295 839/150/295 840/137/295 -f 841/151/296 842/150/296 843/151/296 -f 844/150/297 845/151/297 846/150/297 -f 847/149/298 848/151/298 849/149/298 -f 850/151/298 851/149/298 852/151/298 -f 853/147/299 854/149/299 855/134/299 -f 856/135/300 857/134/300 858/149/300 -f 859/136/301 860/147/301 861/136/301 -f 862/134/302 863/136/302 864/147/302 -f 865/149/303 866/148/303 867/135/303 -f 868/137/304 869/135/304 870/148/304 -f 871/148/305 621/138/305 872/137/305 -f 873/138/306 874/137/306 875/138/306 -f 876/138/307 877/139/307 878/138/307 -f 879/139/308 880/138/308 881/139/308 -f 882/140/309 883/136/309 884/140/309 -f 885/136/310 886/140/310 887/136/310 -f 561/126/274 562/122/274 563/125/274 -f 562/122/274 564/121/274 563/125/274 -f 564/121/63 565/119/63 563/125/63 -f 567/118/274 566/127/274 568/132/274 -f 568/132/274 566/127/274 569/133/274 -f 566/127/274 570/128/274 569/133/274 -f 593/121/274 594/119/274 595/121/274 -f 745/119/274 596/119/274 746/121/274 -f 747/128/63 597/130/63 748/115/63 -f 753/118/274 754/116/274 600/131/274 -f 755/122/274 756/120/274 601/126/274 -f 757/122/274 602/122/274 601/126/274 -f 565/119/63 566/127/63 563/125/63 -f 563/125/63 566/127/63 567/118/63 -f 749/128/63 598/115/63 750/117/63 -f 751/118/63 752/118/63 599/116/63 -o diespum2 -v 1.279149 0.405199 2.597913 -v 1.279149 0.405199 2.943146 -v 1.279150 0.675381 2.597913 -v 1.279150 0.675381 2.943146 -v 1.279149 0.405198 3.358144 -v 1.279149 0.405198 3.703377 -v 1.279150 0.675380 3.358145 -v 1.279150 0.675380 3.703377 -vt -0.967068 0.000000 -vt -0.061724 0.000000 -vt -0.061724 1.000000 -vt -0.967068 1.000000 -vt 1.026576 0.000000 -vt 1.931920 0.000000 -vt 1.931920 0.999999 -vt 1.026576 1.000000 -vn 1.000000 -0.000002 -0.000000 -s off -f 893/153/274 892/154/274 894/155/274 -f 893/153/311 894/155/311 895/156/311 -f 889/157/274 888/158/274 890/159/274 -f 889/157/274 890/159/274 891/160/274 -o dieshing -v -0.419342 0.240450 0.900010 -v -0.419341 0.212152 0.900010 -v -0.640149 0.212372 0.900010 -v -0.640157 0.240592 0.900010 -v -0.419387 0.736461 0.900010 -v -0.419374 0.708381 0.900010 -v -0.640149 0.708324 0.900010 -v -0.640156 0.736489 0.900010 -v -0.640172 0.736489 0.916692 -v -0.419403 0.736461 0.916692 -v -0.419390 0.708381 0.916692 -v -0.640165 0.708324 0.916692 -v -0.640172 0.240593 0.916691 -v -0.419358 0.240450 0.916692 -v -0.419356 0.212152 0.916692 -v -0.640165 0.212372 0.916691 -v -0.646228 0.175972 0.910018 -v -0.681143 0.175972 0.910018 -v -0.640149 0.212372 0.910018 -v -0.642812 0.178288 0.910018 -v -0.681143 0.273273 0.910018 -v -0.681143 0.671913 0.910019 -v -0.681143 0.769213 0.910019 -v -0.645999 0.769213 0.910019 -v -0.642823 0.766897 0.910019 -v -0.640156 0.736489 0.910019 -v -0.646000 0.273273 0.910018 -v -0.646227 0.671913 0.910019 -v -0.642823 0.270956 0.910019 -v -0.642811 0.674229 0.910019 -v -0.640157 0.240593 0.910018 -v -0.640149 0.708324 0.910019 -v -0.681143 0.671913 0.900010 -v -0.642811 0.674229 0.900010 -v -0.646227 0.671913 0.900010 -v -0.681143 0.769213 0.900010 -v -0.645999 0.769213 0.900010 -v -0.642823 0.766897 0.900010 -v -0.681143 0.175972 0.900010 -v -0.642812 0.178288 0.900010 -v -0.646228 0.175972 0.900010 -v -0.681143 0.273273 0.900010 -v -0.642823 0.270956 0.900010 -v -0.645999 0.273272 0.900009 -vt 0.352429 0.823456 -vt 0.352427 0.862690 -vt 0.601358 0.862385 -vt 0.601366 0.823258 -vt 0.352480 0.135760 -vt 0.352466 0.174692 -vt 0.601358 0.174770 -vt 0.601366 0.135721 -vt 0.647573 0.225254 -vt 0.604359 0.222042 -vt 0.608210 0.225254 -vt 0.647573 0.090350 -vt 0.607953 0.090350 -vt 0.604371 0.093562 -vt 0.647573 0.912852 -vt 0.604359 0.909640 -vt 0.608210 0.912852 -vt 0.647573 0.777949 -vt 0.604371 0.781161 -vt 0.607953 0.777949 -vt 0.352446 0.823456 -vt 0.352444 0.862690 -vt 0.352498 0.135760 -vt 0.352483 0.174692 -vt 0.647573 0.225253 -vt 0.604371 0.093563 -vt 0.601383 0.135721 -vt 0.601375 0.174770 -vt 0.601383 0.823258 -vt 0.601375 0.862385 -vn -0.000007 0.000008 -1.000000 -vn -0.000014 0.000123 -1.000000 -vn -0.000007 -0.000016 -1.000000 -vn 0.000160 0.000014 -1.000000 -vn 0.000004 -0.000002 -1.000000 -vn -0.000007 -0.000112 -1.000000 -vn 1.000000 0.000071 0.000916 -vn 1.000000 0.000054 0.000945 -vn -0.000996 -0.999999 0.000004 -vn 0.000646 1.000000 -0.000006 -vn 0.999999 0.000452 0.000947 -vn 0.999999 0.000453 0.000945 -vn 0.000255 -1.000000 0.000006 -vn 0.000127 1.000000 0.000000 -vn -0.000000 -1.000000 -0.000007 -vn 0.996964 -0.077867 0.000000 -vn 0.561266 -0.827635 -0.000001 -vn 0.561256 -0.827642 0.000004 -vn 0.000002 1.000000 0.000006 -vn 0.000000 1.000000 0.000000 -vn 0.589238 0.807960 0.000019 -vn 0.589208 0.807981 0.000005 -vn 0.996178 0.087345 -0.000000 -vn 0.996178 0.087344 0.000002 -vn 0.000001 1.000000 -0.000003 -vn 0.000004 1.000000 0.000009 -vn -0.000003 -1.000000 0.000012 -vn 0.589155 0.808020 -0.000002 -vn 0.589220 0.807973 0.000029 -vn 0.561261 -0.827639 0.000000 -vn 0.996167 0.087470 -0.000001 -vn 0.996167 0.087470 -0.000000 -vn 0.996966 -0.077840 0.000000 -vn 0.000128 1.000000 0.000018 -vn 0.000126 1.000000 -0.000003 -vn 0.000255 -1.000000 0.000000 -vn 0.000255 -1.000000 0.000001 -vn 0.000646 1.000000 0.000001 -vn 0.000646 1.000000 0.000002 -vn -0.000996 -0.999999 0.000001 -vn -0.000996 -1.000000 -0.000005 -s off -f 896/161/105 897/162/105 898/163/105 -f 899/164/105 896/161/105 898/163/105 -f 900/165/105 901/166/105 902/167/105 -f 903/168/105 900/165/105 902/167/105 -f 928/169/312 902/167/312 929/170/312 -f 928/169/313 929/170/313 930/171/313 -f 931/172/314 932/173/314 903/168/314 -f 932/173/315 933/174/315 903/168/315 -f 931/172/316 903/168/316 928/169/316 -f 928/169/105 903/168/105 902/167/105 -f 934/175/105 898/163/105 935/176/105 -f 935/176/105 936/177/105 934/175/105 -f 937/178/105 938/179/105 899/164/105 -f 939/180/317 938/179/317 937/178/317 -f 937/178/105 899/164/105 934/175/105 -f 934/175/105 899/164/105 898/163/105 -f 909/181/318 910/182/318 897/162/318 -f 897/162/319 896/161/319 909/181/319 -f 897/162/320 914/163/320 898/163/320 -f 896/161/321 899/164/321 926/164/321 -f 905/183/322 906/184/322 901/166/322 -f 901/166/323 900/165/323 905/183/323 -f 901/166/324 927/167/324 902/167/324 -f 900/165/325 903/168/325 921/168/325 -f 912/177/326 913/175/326 934/175/326 -f 934/175/251 936/177/251 912/177/251 -f 914/163/327 915/176/327 935/176/327 -f 935/176/327 898/163/327 914/163/327 -f 915/176/328 912/177/328 936/177/328 -f 936/177/329 935/176/329 915/176/329 -f 913/175/7 916/178/7 937/178/7 -f 937/178/7 934/175/7 913/175/7 -f 917/185/7 918/172/7 931/172/7 -f 931/172/7 928/169/7 917/185/7 -f 918/172/330 919/173/330 932/173/330 -f 932/173/331 931/172/331 918/172/331 -f 919/173/332 920/186/332 933/174/332 -f 933/174/333 932/173/333 919/173/333 -f 920/186/334 921/168/334 903/168/334 -f 903/168/335 933/174/335 920/186/335 -f 916/178/336 922/180/336 939/180/336 -f 939/180/337 937/178/337 916/178/337 -f 923/171/338 917/185/338 928/169/338 -f 928/169/3 930/171/3 923/171/3 -f 922/180/339 924/179/339 938/179/339 -f 938/179/340 939/180/340 922/180/340 -f 925/170/341 923/171/341 930/171/341 -f 930/171/341 929/170/341 925/170/341 -f 924/179/342 926/164/342 899/164/342 -f 899/164/343 938/179/343 924/179/343 -f 927/167/344 925/170/344 929/170/344 -f 929/170/344 902/167/344 927/167/344 -f 900/165/345 921/168/345 904/187/345 -f 904/187/346 905/183/346 900/165/346 -f 927/167/347 901/166/347 906/184/347 -f 906/184/348 907/188/348 927/167/348 -f 896/161/349 926/164/349 908/189/349 -f 896/161/350 908/189/350 909/181/350 -f 914/163/351 897/162/351 910/182/351 -f 910/182/352 911/190/352 914/163/352 -o dieswind -v 1.415779 0.552609 2.205991 -v 1.185139 0.552609 2.205991 -v 1.185139 0.831107 2.205992 -v 1.415779 0.848733 2.205992 -v 1.149921 0.553582 2.205991 -v 0.965105 0.553583 2.205991 -v 0.965105 0.814732 2.205992 -v 1.149921 0.828775 2.205992 -v 1.415779 0.552607 4.089635 -v 1.185140 0.552607 4.089635 -v 1.185140 0.831106 4.089635 -v 1.415780 0.848731 4.089636 -v 1.149922 0.553581 4.089635 -v 0.965106 0.553581 4.089635 -v 0.965106 0.814731 4.089635 -v 1.149922 0.828773 4.089636 -v 1.416365 0.547640 1.227853 -v 1.416366 0.841242 1.227854 -v 1.185359 0.823766 1.227854 -v 1.185359 0.547640 1.227853 -v 0.964919 0.547966 1.227854 -v 1.150916 0.547966 1.227853 -v 0.964919 0.808133 1.227854 -v 1.150916 0.822122 1.227854 -v 0.910735 0.808073 1.273595 -v 0.910735 0.547999 1.273595 -v 0.910735 0.547999 1.399248 -v 0.910735 0.548038 1.437904 -v 0.910735 0.548038 1.563519 -v 0.910735 0.547353 1.599721 -v 0.910735 0.547353 1.725347 -v 0.910735 0.808073 1.399249 -v 0.910735 0.808745 1.725347 -v 0.910735 0.808034 1.437904 -v 0.910735 0.808033 1.563519 -v 0.910735 0.808745 1.599722 -v 1.416301 0.841242 1.771434 -v 1.416300 0.547639 1.771433 -v 1.185294 0.823766 1.771434 -v 1.185294 0.547639 1.771434 -v 1.150850 0.547966 1.771433 -v 0.964854 0.547966 1.771434 -v 0.964854 0.808132 1.771434 -v 1.150851 0.822122 1.771434 -v -0.117645 0.565081 1.845654 -v -0.117645 0.565081 1.751331 -v -0.117645 0.565081 1.632836 -v -0.117645 0.565081 1.727158 -v -0.117645 0.672547 1.632836 -v -0.117645 0.672547 1.727158 -v -0.117645 0.672547 1.751331 -v -0.117645 0.672546 1.845654 -v -0.117645 0.696732 1.727158 -v -0.117645 0.696732 1.632836 -v -0.117645 0.696732 1.845654 -v -0.117645 0.696732 1.751331 -v -0.117645 0.804197 1.751332 -v -0.117645 0.804197 1.845654 -v -0.117645 0.804197 1.727158 -v -0.117646 0.804197 1.632836 -v -0.117646 0.565081 1.387403 -v -0.117646 0.565081 1.293081 -v -0.117645 0.672547 1.293081 -v -0.117645 0.672547 1.387403 -v -0.117646 0.565081 1.268907 -v -0.117646 0.565082 1.174585 -v -0.117646 0.672547 1.174585 -v -0.117583 0.672547 1.268907 -v -0.117645 0.696732 1.387403 -v -0.117645 0.696732 1.293081 -v -0.117645 0.804198 1.293081 -v -0.117645 0.804198 1.387403 -v -0.117645 0.697249 1.175038 -v -0.117645 0.697249 1.268454 -v -0.117645 0.803681 1.175038 -v -0.117645 0.803681 1.268454 -vt 0.129625 0.709550 -vt 0.178740 0.709550 -vt 0.058974 0.709550 -vt 0.120266 0.709550 -vt 0.129625 0.963858 -vt 0.178740 0.963858 -vt 0.058973 0.963858 -vt 0.120266 0.963858 -vt 0.178789 0.577492 -vt 0.129361 0.577492 -vt 0.058817 0.577492 -vt 0.120207 0.577492 -vt 0.193189 0.644658 -vt 0.193189 0.627698 -vt 0.193189 0.622810 -vt 0.193189 0.605851 -vt 0.193189 0.600632 -vt 0.193189 0.583668 -vt 0.178807 0.650880 -vt 0.129378 0.650880 -vt 0.058835 0.650880 -vt 0.120225 0.650880 -vt 0.466480 0.648166 -vt 0.466480 0.660901 -vt 0.466480 0.632168 -vt 0.466480 0.644903 -vt 0.466480 0.586298 -vt 0.466480 0.599033 -vt 0.466480 0.570362 -vt 0.466480 0.582974 -vt 0.466480 0.570300 -vt 0.466464 0.583035 -vt 0.466480 0.583035 -vn 0.000000 0.000002 -1.000000 -vn 0.000001 0.000001 -1.000000 -vn 0.000001 0.000002 -1.000000 -vn 0.000000 0.000001 -1.000000 -vn -0.000000 -0.000002 1.000000 -vn -0.000003 0.000000 1.000000 -vn -0.000002 -0.000002 1.000000 -vn -0.000001 0.000001 -1.000000 -vn -0.000001 0.000003 -1.000000 -vn -1.000000 0.000001 0.000002 -vn -1.000000 0.000002 0.000000 -vn -1.000000 0.000001 -0.000001 -vn 0.000001 -0.000001 1.000000 -vn 0.000001 -0.000000 1.000000 -vn 1.000000 0.000004 -0.000005 -vn 1.000000 0.000004 -0.000664 -vn 1.000000 -0.000579 -0.000000 +f 9//9 10//9 12//9 +f 11//10 12//10 14//10 +f 13//11 14//11 16//11 +f 15//12 16//12 18//12 +f 17//13 18//13 20//13 +f 19//14 20//14 22//14 +f 21//15 22//15 24//15 +f 23//16 24//16 26//16 +f 25//17 26//17 28//17 +f 27//18 28//18 30//18 +f 29//19 30//19 32//19 +f 31//20 32//20 34//20 +f 33//21 34//21 36//21 +f 35//22 36//22 38//22 +f 37//23 38//23 40//23 +f 39//24 40//24 42//24 +f 41//25 42//25 43//25 +f 43//26 44//26 45//26 +f 45//27 46//27 47//27 +f 47//28 48//28 49//28 +f 49//29 50//29 51//29 +f 51//30 52//30 53//30 +f 53//31 54//31 55//31 +f 55//32 56//32 57//32 +f 57//33 58//33 59//33 +f 59//34 60//34 61//34 +f 61//35 62//35 63//35 +f 63//36 64//36 65//36 +f 65//37 66//37 67//37 +f 67//38 68//38 69//38 +f 12//39 10//39 14//39 +f 71//40 72//40 9//40 +f 69//41 70//41 71//41 +f 9//42 11//42 71//42 +f 11//9 9//9 12//9 +f 13//10 11//10 14//10 +f 15//11 13//11 16//11 +f 17//12 15//12 18//12 +f 19//13 17//13 20//13 +f 21//14 19//14 22//14 +f 23//15 21//15 24//15 +f 25//16 23//16 26//16 +f 27//17 25//17 28//17 +f 29//18 27//18 30//18 +f 31//19 29//19 32//19 +f 33//20 31//20 34//20 +f 35//21 33//21 36//21 +f 37//22 35//22 38//22 +f 39//23 37//23 40//23 +f 41//24 39//24 42//24 +f 42//25 44//25 43//25 +f 44//26 46//26 45//26 +f 46//27 48//27 47//27 +f 48//28 50//28 49//28 +f 50//29 52//29 51//29 +f 52//30 54//30 53//30 +f 54//31 56//31 55//31 +f 56//32 58//32 57//32 +f 58//33 60//33 59//33 +f 60//34 62//34 61//34 +f 62//35 64//35 63//35 +f 64//36 66//36 65//36 +f 66//37 68//37 67//37 +f 68//38 70//38 69//38 +f 10//39 72//39 14//39 +f 72//39 70//39 14//39 +f 70//39 68//39 14//39 +f 68//39 66//39 14//39 +f 66//39 64//39 14//39 +f 64//39 62//39 14//39 +f 62//39 60//39 14//39 +f 60//39 58//39 14//39 +f 58//39 56//39 14//39 +f 56//39 54//39 14//39 +f 54//39 52//39 14//39 +f 52//39 50//39 14//39 +f 50//39 48//39 14//39 +f 48//39 46//39 14//39 +f 46//39 44//39 14//39 +f 44//39 42//39 14//39 +f 42//39 40//39 14//39 +f 40//39 38//39 14//39 +f 38//39 36//39 14//39 +f 36//39 34//39 14//39 +f 34//39 32//39 14//39 +f 32//39 30//39 14//39 +f 30//39 28//39 14//39 +f 28//39 26//39 14//39 +f 26//39 24//39 14//39 +f 24//39 22//39 14//39 +f 22//39 20//39 14//39 +f 20//39 18//39 16//39 +f 14//39 20//39 16//39 +f 72//40 10//40 9//40 +f 70//41 72//41 71//41 +f 11//42 13//42 71//42 +f 13//42 15//42 71//42 +f 15//42 17//42 71//42 +f 17//42 19//42 71//42 +f 19//42 21//42 71//42 +f 21//42 23//42 71//42 +f 23//42 25//42 71//42 +f 25//42 27//42 71//42 +f 27//42 29//42 71//42 +f 29//42 31//42 71//42 +f 31//42 33//42 71//42 +f 33//42 35//42 71//42 +f 35//42 37//42 71//42 +f 37//42 39//42 71//42 +f 39//42 41//42 71//42 +f 41//42 43//42 71//42 +f 43//42 45//42 71//42 +f 45//42 47//42 71//42 +f 47//42 49//42 71//42 +f 49//42 51//42 71//42 +f 51//42 53//42 71//42 +f 53//42 55//42 71//42 +f 55//42 57//42 71//42 +f 57//42 59//42 71//42 +f 59//42 61//42 71//42 +f 61//42 63//42 71//42 +f 63//42 65//42 71//42 +f 65//42 67//42 71//42 +f 67//42 69//42 71//42 +v 1.365790 1.252743 0.402799 +v 1.365790 2.069450 0.402799 +v 1.446312 1.252743 0.410646 +v 1.446312 2.069450 0.410646 +v 1.523739 1.252743 0.433883 +v 1.523739 2.069450 0.433883 +v 1.595097 1.252743 0.471619 +v 1.595097 2.069450 0.471619 +v 1.657642 1.252743 0.522403 +v 1.657642 2.069450 0.522403 +v 1.708972 1.252743 0.584284 +v 1.708972 2.069450 0.584284 +v 1.747113 1.252743 0.654883 +v 1.747113 2.069450 0.654883 +v 1.770600 1.252743 0.731487 +v 1.770600 2.069450 0.731487 +v 1.778531 1.252743 0.811153 +v 1.778531 2.069450 0.811153 +v 1.770600 1.252743 0.890818 +v 1.770600 2.069450 0.890818 +v 1.747113 1.252743 0.967423 +v 1.747113 2.069450 0.967423 +v 1.708972 1.252743 1.038022 +v 1.708972 2.069450 1.038022 +v 1.657642 1.252743 1.099902 +v 1.657642 2.069450 1.099902 +v 1.595097 1.252743 1.150686 +v 1.595097 2.069450 1.150686 +v 1.523739 1.252743 1.188422 +v 1.523739 2.069450 1.188422 +v 1.446312 1.252743 1.211660 +v 1.446312 2.069450 1.211660 +v 1.365790 1.252743 1.219506 +v 1.365790 2.069450 1.219506 +v 1.285269 1.252743 1.211660 +v 1.285269 2.069450 1.211660 +v 1.207841 1.252743 1.188422 +v 1.207841 2.069450 1.188422 +v 1.136484 1.252743 1.150686 +v 1.136484 2.069450 1.150686 +v 1.073939 1.252743 1.099902 +v 1.073939 2.069450 1.099902 +v 1.022609 1.252743 1.038021 +v 1.022609 2.069450 1.038021 +v 0.984468 1.252743 0.967422 +v 0.984468 2.069450 0.967422 +v 0.960981 1.252743 0.890818 +v 0.960981 2.069450 0.890818 +v 0.953050 1.252743 0.811152 +v 0.953050 2.069450 0.811152 +v 0.960981 1.252743 0.731486 +v 0.960981 2.069450 0.731486 +v 0.984468 1.252743 0.654882 +v 0.984468 2.069450 0.654882 +v 1.022609 1.252743 0.584283 +v 1.022609 2.069450 0.584283 +v 1.073939 1.252743 0.522403 +v 1.073939 2.069450 0.522403 +v 1.136485 1.252743 0.471619 +v 1.136485 2.069450 0.471619 +v 1.207842 1.252743 0.433883 +v 1.207842 2.069450 0.433883 +v 1.285269 1.252743 0.410646 +v 1.285269 2.069450 0.410646 +vn -0.879812 0.000000 0.475321 +vn -0.956071 0.000000 0.293136 +vn -0.956070 -0.000000 -0.293137 s off -f 947/191/353 944/191/353 945/192/353 -f 945/192/354 946/192/354 947/191/354 -f 943/193/355 940/193/355 942/194/355 -f 942/194/356 940/193/356 941/194/356 -f 952/195/357 955/195/357 953/196/357 -f 954/196/358 953/196/358 955/195/358 -f 948/197/359 951/197/359 950/198/359 -f 948/197/359 950/198/359 949/198/359 -f 960/199/360 962/199/360 961/200/360 -f 963/200/360 961/200/360 962/199/360 -f 957/201/353 956/201/353 959/202/353 -f 957/201/361 959/202/361 958/202/361 -f 972/203/362 975/204/362 969/204/362 -f 972/203/363 969/204/363 970/203/363 -f 974/205/362 973/206/362 967/206/362 -f 974/205/362 967/206/362 968/205/362 -f 971/207/364 964/208/364 966/207/364 -f 965/208/364 966/207/364 964/208/364 -f 982/209/365 981/209/365 980/210/365 -f 980/210/365 983/210/365 982/209/365 -f 977/211/366 976/211/366 979/212/366 -f 979/212/366 976/211/366 978/212/366 -f 995/213/274 996/213/274 994/214/274 -f 997/214/274 994/214/274 996/213/274 -f 999/215/367 998/216/367 993/215/367 -f 992/216/274 993/215/274 998/216/274 -f 986/215/274 988/215/274 987/216/274 -f 989/216/274 987/216/274 988/215/274 -f 985/213/274 990/213/274 984/214/274 -f 991/214/274 984/214/274 990/213/274 -f 1009/217/274 1010/217/274 1008/218/274 -f 1011/218/274 1008/218/274 1010/217/274 -f 1014/219/274 1015/220/274 1012/219/274 -f 1013/220/274 1012/219/274 1015/220/274 -f 1006/221/368 1007/222/368 1005/221/368 -f 1004/223/369 1005/221/369 1007/222/369 -f 1001/217/274 1002/217/274 1000/218/274 -f 1003/218/274 1000/218/274 1002/217/274 -o diesvert -v -0.459378 0.094249 2.689255 -v -0.459330 0.819549 2.688997 -v -0.459331 0.826566 2.686084 -v -0.459333 0.833488 2.689010 -v -0.459453 1.553187 2.689696 -v -0.459454 1.558014 2.686781 -v -0.459455 1.562877 2.689705 -v -0.459481 2.285283 2.689853 -v -0.459488 2.289675 2.686980 -v -0.459497 2.295024 2.689956 -v -0.460737 3.041305 2.697886 -v -0.498451 3.098831 2.905324 -v -0.524867 3.102593 3.261423 -v -0.727115 0.094249 2.742531 -v -0.727169 0.819549 2.742273 -v -0.728285 0.826566 2.739583 -v -0.727166 0.833488 2.742286 -v -0.727015 1.553187 2.742966 -v -0.728131 1.558014 2.740274 -v -0.727013 1.562877 2.742975 -v -0.726981 2.285283 2.743122 -v -0.728086 2.289675 2.740471 -v -0.726956 2.295024 2.743223 -v -0.725067 3.041305 2.751024 -v -0.680527 3.098831 2.957105 -v -0.568659 3.102593 3.296206 -v -0.954083 0.094249 2.894208 -v -0.954232 0.819549 2.893992 -v -0.956292 0.826566 2.891933 -v -0.954224 0.833488 2.894003 -v -0.953824 1.553187 2.894573 -v -0.955886 1.558014 2.892512 -v -0.953819 1.562877 2.894580 -v -0.953733 2.285283 2.894703 -v -0.955769 2.289675 2.892678 -v -0.953671 2.295024 2.894788 -v -0.948941 3.041305 2.901272 -v -0.828928 3.098831 3.074621 -v -0.595807 3.102593 3.345100 -v -1.105730 0.094249 3.121198 -v -1.105950 0.819549 3.121054 -v -1.108642 0.826566 3.119941 -v -1.105939 0.833488 3.121062 -v -1.105352 1.553187 3.121436 -v -1.108045 1.558014 3.120321 -v -1.105344 1.562877 3.121440 -v -1.105217 2.285283 3.121521 -v -1.107874 2.289675 3.120429 -v -1.105128 2.295024 3.121576 -v -1.098275 3.041305 3.125756 -v -0.921061 3.098831 3.239983 -v -0.602177 3.102593 3.400661 -v -1.158968 0.094249 3.388942 -v -1.159227 0.819549 3.388893 -v -1.162139 0.826566 3.388895 -v -1.159214 0.833488 3.388896 -v -1.158528 1.553187 3.389016 -v -1.161443 1.558014 3.389017 -v -1.158519 1.562877 3.389018 -v -1.158371 2.285283 3.389044 -v -1.161243 2.289675 3.389051 -v -1.158267 2.295024 3.389060 -v -1.150337 3.041305 3.390300 -v -0.942899 3.098831 3.428014 -v -0.586800 3.102593 3.454430 -v -1.105693 0.094249 3.656678 -v -1.105950 0.819549 3.656732 -v -1.108641 0.826566 3.657848 -v -1.105937 0.833488 3.656729 -v -1.105257 1.553187 3.656578 -v -1.107950 1.558014 3.657694 -v -1.105248 1.562877 3.656576 -v -1.105102 2.285283 3.656544 -v -1.107753 2.289675 3.657650 -v -1.105000 2.295024 3.656519 -v -1.097199 3.041305 3.654630 -v -0.891119 3.098831 3.610090 -v -0.552017 3.102593 3.498222 -v -0.954015 0.094249 3.883646 -v -0.954232 0.819549 3.883795 -v -0.956291 0.826566 3.885855 -v -0.954221 0.833488 3.883787 -v -0.953650 1.553187 3.883388 -v -0.955711 1.558014 3.885449 -v -0.953643 1.562877 3.883382 -v -0.953520 2.285283 3.883296 -v -0.955546 2.289675 3.885332 -v -0.953436 2.295024 3.883234 -v -0.946951 3.041305 3.878504 -v -0.773602 3.098831 3.758491 -v -0.503124 3.102593 3.525370 -v -0.727025 0.094249 4.035293 -v -0.727169 0.819549 4.035514 -v -0.728282 0.826566 4.038205 -v -0.727162 0.833488 4.035502 -v -0.726788 1.553187 4.034915 -v -0.727902 1.558014 4.037608 -v -0.726783 1.562877 4.034907 -v -0.726702 2.285283 4.034780 -v -0.727795 2.289675 4.037437 -v -0.726647 2.295024 4.034691 -v -0.722467 3.041305 4.027839 -v -0.608241 3.098831 3.850624 -v -0.447563 3.102593 3.531740 -v -0.459282 0.094249 4.088531 -v -0.459330 0.819549 4.088790 -v -0.459329 0.826566 4.091702 -v -0.459328 0.833488 4.088777 -v -0.459207 1.553187 4.088091 -v -0.459207 1.558014 4.091006 -v -0.459206 1.562877 4.088082 -v -0.459180 2.285283 4.087934 -v -0.459172 2.289675 4.090806 -v -0.459164 2.295024 4.087831 -v -0.457923 3.041305 4.079900 -v -0.420209 3.098831 3.872462 -v -0.393793 3.102593 3.516364 -v -0.191545 0.094249 4.035256 -v -0.191491 0.819549 4.035513 -v -0.190376 0.826566 4.038204 -v -0.191494 0.833488 4.035501 -v -0.191645 1.553187 4.034821 -v -0.190529 1.558014 4.037513 -v -0.191647 1.562877 4.034811 -v -0.191680 2.285283 4.034665 -v -0.190574 2.289675 4.037316 -v -0.191705 2.295024 4.034563 -v -0.193593 3.041305 4.026762 -v -0.238133 3.098831 3.820682 -v -0.350001 3.102593 3.481580 -v 0.035423 0.094249 3.883578 -v 0.035572 0.819549 3.883795 -v 0.037632 0.826566 3.885854 -v 0.035564 0.833488 3.883784 -v 0.035164 1.553187 3.883214 -v 0.037226 1.558014 3.885274 -v 0.035159 1.562877 3.883206 -v 0.035073 2.285283 3.883083 -v 0.037109 2.289675 3.885109 -v 0.035011 2.295024 3.882998 -v 0.030280 3.041305 3.876514 -v -0.089732 3.098831 3.703166 -v -0.322854 3.102593 3.432687 -v 0.187070 0.094249 3.656588 -v 0.187290 0.819549 3.656732 -v 0.189981 0.826566 3.657845 -v 0.187279 0.833488 3.656725 -v 0.186691 1.553187 3.656351 -v 0.189384 1.558014 3.657465 -v 0.186684 1.562877 3.656346 -v 0.186557 2.285283 3.656265 -v 0.189213 2.289675 3.657358 -v 0.186467 2.295024 3.656211 -v 0.179616 3.041305 3.652030 -v 0.002400 3.098831 3.537804 -v -0.316483 3.102593 3.377126 -v 0.240308 0.094249 3.388845 -v 0.240566 0.819549 3.388893 -v 0.243479 0.826566 3.388892 -v 0.240553 0.833488 3.388891 -v 0.239868 1.553187 3.388771 -v 0.242782 1.558014 3.388770 -v 0.239858 1.562877 3.388769 -v 0.239710 2.285283 3.388743 -v 0.242583 2.289675 3.388736 -v 0.239607 2.295024 3.388727 -v 0.231677 3.041305 3.387486 -v 0.024239 3.098831 3.349772 -v -0.331860 3.102593 3.323356 -v 0.187033 0.094249 3.121109 -v 0.187290 0.819549 3.121054 -v 0.189980 0.826566 3.119939 -v 0.187277 0.833488 3.121057 -v 0.186597 1.553187 3.121208 -v 0.189290 1.558014 3.120092 -v 0.186588 1.562877 3.121210 -v 0.186441 2.285283 3.121243 -v 0.189093 2.289675 3.120137 -v 0.186340 2.295024 3.121268 -v 0.178539 3.041305 3.123157 -v -0.027542 3.098831 3.167696 -v -0.366643 3.102593 3.279564 -v 0.035354 0.094249 2.894140 -v 0.035571 0.819549 2.893991 -v 0.037630 0.826566 2.891931 -v 0.035560 0.833488 2.893999 -v 0.034990 1.553187 2.894399 -v 0.037051 1.558014 2.892337 -v 0.034982 1.562877 2.894404 -v 0.034860 2.285283 2.894490 -v 0.036886 2.289675 2.892454 -v 0.034775 2.295024 2.894552 -v 0.028291 3.041305 2.899283 -v -0.145058 3.098831 3.019295 -v -0.415537 3.102593 3.252417 -v -0.191635 0.094249 2.742493 -v -0.191491 0.819549 2.742273 -v -0.190378 0.826566 2.739582 -v -0.191499 0.833488 2.742284 -v -0.191872 1.553187 2.742872 -v -0.190758 1.558014 2.740179 -v -0.191877 1.562877 2.742880 -v -0.191958 2.285283 2.743006 -v -0.190865 2.289675 2.740350 -v -0.192012 2.295024 2.743096 -v -0.196193 3.041305 2.749948 -v -0.310419 3.098831 2.927163 -v -0.471098 3.102593 3.246046 -v -0.445523 3.148009 3.451283 -v -0.445521 3.148009 3.451282 -v -0.459868 3.148009 3.459566 -v -0.459867 3.148009 3.476132 -v -0.445521 3.148009 3.484414 -v -0.431174 3.148009 3.476131 -v -0.431174 3.148009 3.476130 -v -0.431175 3.148009 3.459565 -v -0.419601 3.229638 3.295439 -v -0.418428 3.229638 3.288490 -v -0.421801 3.229638 3.288368 -v -0.419094 3.229638 3.281474 -v -0.422827 3.229638 3.294448 -v -0.422532 3.229638 3.301848 -v -0.422827 3.229638 3.294448 -v -0.425392 3.229638 3.300056 -v -0.427023 3.229638 3.307281 -v -0.425392 3.229638 3.300056 -v -0.429321 3.229638 3.304809 -v -0.429321 3.229638 3.304809 -v -0.432766 3.229638 3.311366 -v -0.434346 3.229638 3.308383 -v -0.439371 3.229638 3.313825 -v -0.440125 3.229638 3.310535 -v -0.440125 3.229638 3.310535 -v -0.446387 3.229638 3.314491 -v -0.446264 3.229638 3.311118 -v -0.453336 3.229638 3.313318 -v -0.452345 3.229638 3.310092 -v -0.459745 3.229638 3.310387 -v -0.457953 3.229638 3.307527 -v -0.465177 3.229638 3.305897 -v -0.457953 3.229638 3.307527 -v -0.462706 3.229638 3.303598 -v -0.469262 3.229638 3.300153 -v -0.462706 3.229638 3.303598 -v -0.466280 3.229638 3.298573 -v -0.466280 3.229638 3.298573 -v -0.471721 3.229638 3.293548 -v -0.468432 3.229638 3.292794 -v -0.468432 3.229638 3.292794 -v -0.472387 3.229638 3.286532 -v -0.469015 3.229638 3.286655 -v -0.471215 3.229638 3.279583 -v -0.469015 3.229638 3.286655 -v -0.467989 3.229638 3.280574 -v -0.468283 3.229638 3.273174 -v -0.467989 3.229638 3.280574 -v -0.465424 3.229638 3.274966 -v -0.463793 3.229638 3.267742 -v -0.465424 3.229638 3.274966 -v -0.461495 3.229638 3.270213 -v -0.458050 3.229638 3.263657 -v -0.461495 3.229638 3.270213 -v -0.456470 3.229638 3.266639 -v -0.456470 3.229638 3.266639 -v -0.451445 3.229638 3.261198 -v -0.450690 3.229638 3.264487 -v -0.450690 3.229638 3.264487 -v -0.444429 3.229638 3.260531 -v -0.444551 3.229638 3.263904 -v -0.437480 3.229638 3.261704 -v -0.438471 3.229638 3.264930 -v -0.431070 3.229638 3.264636 -v -0.438471 3.229638 3.264930 -v -0.432863 3.229638 3.267495 -v -0.432863 3.229638 3.267495 -v -0.425638 3.229638 3.269126 -v -0.428109 3.229638 3.271424 -v -0.428109 3.229638 3.271424 -v -0.421554 3.229638 3.274869 -v -0.424535 3.229638 3.276449 -v -0.424535 3.229638 3.276449 -v -0.422383 3.229638 3.282228 -v -0.422827 3.235215 3.294448 -v -0.421801 3.235215 3.288368 -v -0.425392 3.235215 3.300056 -v -0.429321 3.235215 3.304809 -v -0.434346 3.235215 3.308384 -v -0.440125 3.235215 3.310535 -v -0.446264 3.235215 3.311118 -v -0.452345 3.235215 3.310092 -v -0.457953 3.235215 3.307527 -v -0.462706 3.235215 3.303598 -v -0.466280 3.235215 3.298573 -v -0.468432 3.235215 3.292794 -v -0.469015 3.235215 3.286655 -v -0.467989 3.235215 3.280574 -v -0.465424 3.235215 3.274966 -v -0.461495 3.235215 3.270213 -v -0.456470 3.235215 3.266639 -v -0.450690 3.235215 3.264487 -v -0.444551 3.235215 3.263904 -v -0.438471 3.235215 3.264930 -v -0.432863 3.235215 3.267495 -v -0.428109 3.235215 3.271424 -v -0.424535 3.235215 3.276449 -v -0.422383 3.235215 3.282228 -v -0.428288 3.228788 3.308181 -v -0.463980 3.228788 3.306886 -v -0.432766 3.229018 3.311366 -v -0.439371 3.229006 3.313825 -v -0.446387 3.229002 3.314491 -v -0.453336 3.229006 3.313318 -v -0.459745 3.229018 3.310387 -v -0.427905 3.172996 3.308195 -v -0.427905 3.228788 3.308195 -v -0.428082 3.172995 3.404269 -v -0.464541 3.172995 3.402946 -v -0.464363 3.228788 3.306872 -v -0.464601 3.172879 3.306845 -v -0.463935 3.172995 3.402968 -v -0.464534 3.172995 3.402946 -v -0.428288 3.172996 3.308180 -v -0.464012 3.172995 3.403028 -v -0.464123 3.172995 3.403069 -v -0.464240 3.172995 3.403080 -v -0.464356 3.172995 3.403060 -v -0.464463 3.172995 3.403012 -v -0.419601 3.172996 3.295439 -v -0.422532 3.172996 3.301848 -v -0.427023 3.172996 3.307281 -v -0.471721 3.172996 3.293548 -v -0.472387 3.172996 3.286532 -v -0.471215 3.172996 3.279583 -v -0.468283 3.172996 3.273174 -v -0.463793 3.172996 3.267741 -v -0.458050 3.172996 3.263657 -v -0.451445 3.172996 3.261198 -v -0.444429 3.172996 3.260531 -v -0.437480 3.172996 3.261704 -v -0.431070 3.172996 3.264635 -v -0.425639 3.172996 3.269126 -v -0.421554 3.172996 3.274869 -v -0.419094 3.172996 3.281474 -v -0.506448 3.165919 3.282116 -v -0.524443 3.172996 3.317315 -v -0.506448 3.172996 3.282116 -v -0.524443 3.165919 3.317315 -v -0.522428 3.172996 3.356796 -v -0.522428 3.165919 3.356796 -v -0.500942 3.172996 3.389979 -v -0.500942 3.165919 3.389979 -v -0.500942 3.165919 3.389979 -v -0.465743 3.172995 3.407974 -v -0.465743 3.165919 3.407974 -v -0.465743 3.165919 3.407974 -v -0.445870 3.165919 3.409565 -v -0.426262 3.172995 3.405959 -v -0.426262 3.165919 3.405959 -v -0.426262 3.165919 3.405959 -v -0.408256 3.172995 3.397400 -v -0.408256 3.165919 3.397400 -v -0.381764 3.172996 3.368058 -v -0.381764 3.165919 3.368058 -v -0.373492 3.172996 3.329401 -v -0.373492 3.165919 3.329401 -v -0.373492 3.165919 3.329401 -v -0.385657 3.172996 3.291787 -v -0.385657 3.165919 3.291787 -v -0.385657 3.165919 3.291787 -v -0.415000 3.172996 3.265295 -v -0.415000 3.165919 3.265295 -v -0.433784 3.172996 3.258615 -v -0.433784 3.165919 3.258615 -v -0.453657 3.172996 3.257023 -v -0.433784 3.165919 3.258615 -v -0.473265 3.165919 3.260630 -v -0.491271 3.172996 3.269189 -v -0.491271 3.165919 3.269189 -v -0.491271 3.165919 3.269189 -v -0.511673 3.165919 3.277398 -v -0.531327 3.165919 3.315842 -v -0.529126 3.165919 3.358962 -v -0.505659 3.165919 3.395205 -v -0.467215 3.165919 3.414858 -v -0.424095 3.165919 3.412657 -v -0.404430 3.165919 3.403309 -v -0.375496 3.165919 3.371263 -v -0.366461 3.165919 3.329042 -v -0.379748 3.165919 3.287961 -v -0.411795 3.165919 3.259027 -v -0.432311 3.165919 3.251730 -v -0.454016 3.165919 3.249993 -v -0.475431 3.165919 3.253932 -v -0.495097 3.165919 3.263279 -v -0.511673 3.148010 3.277398 -v -0.531327 3.148010 3.315842 -v -0.529126 3.148010 3.358962 -v -0.505659 3.148009 3.395205 -v -0.467215 3.148009 3.414858 -v -0.424095 3.148009 3.412657 -v -0.404430 3.148009 3.403309 -v -0.375496 3.148010 3.371263 -v -0.366461 3.148010 3.329042 -v -0.379748 3.148010 3.287961 -v -0.411795 3.148010 3.259027 -v -0.432311 3.148010 3.251730 -v -0.454016 3.148010 3.249993 -v -0.475431 3.148010 3.253932 -v -0.495097 3.148010 3.263279 -v -0.502976 3.148010 3.249215 -v -0.566763 3.148010 3.290516 -v -0.601354 3.148010 3.358177 -v -0.604412 3.148009 3.396378 -v -0.597479 3.148009 3.434069 -v -0.556178 3.148009 3.497855 -v -0.488517 3.148009 3.532446 -v -0.412626 3.148009 3.528572 -v -0.348839 3.148009 3.487271 -v -0.314249 3.148009 3.419610 -v -0.318123 3.148010 3.343718 -v -0.359424 3.148010 3.279932 -v -0.427085 3.148010 3.245341 -v -0.566763 3.102593 3.290516 -v -0.601353 3.102593 3.358177 -v -0.597479 3.102592 3.434069 -v -0.556178 3.102593 3.497855 -v -0.488517 3.102593 3.532446 -v -0.412626 3.102592 3.528572 -v -0.348839 3.102593 3.487271 -v -0.314249 3.102593 3.419610 -v -0.318123 3.102592 3.343718 -v -0.359424 3.102593 3.279931 -v -0.427085 3.102593 3.245341 -v -0.502976 3.102592 3.249215 -v -0.322854 3.102593 3.432687 -v -0.089732 3.098831 3.703166 -v -0.089732 3.098831 3.703166 -v 0.002400 3.098831 3.537804 -v 0.240566 0.819549 3.388893 -v 0.187070 0.094249 3.656588 -v 0.189981 0.826566 3.657845 -v 0.187290 0.819549 3.656732 -v 0.187290 0.819549 3.656732 -v 0.240566 0.819549 3.388893 -v 0.187279 0.833488 3.656725 -v 0.189981 0.826566 3.657845 -v 0.189981 0.826566 3.657845 -v 0.186691 1.553187 3.656351 -v 0.187279 0.833488 3.656725 -v 0.187279 0.833488 3.656725 -v 0.189384 1.558014 3.657465 -v 0.186691 1.553187 3.656351 -v 0.186691 1.553187 3.656351 -v 0.186684 1.562877 3.656346 -v 0.189384 1.558014 3.657465 -v 0.189384 1.558014 3.657465 -v 0.186557 2.285283 3.656265 -v 0.186684 1.562877 3.656346 -v 0.186684 1.562877 3.656346 -v 0.189213 2.289675 3.657358 -v 0.186557 2.285283 3.656265 -v 0.186557 2.285283 3.656265 -v 0.186467 2.295024 3.656211 -v 0.189213 2.289675 3.657358 -v 0.189213 2.289675 3.657358 -v 0.179616 3.041305 3.652030 -v 0.186467 2.295024 3.656211 -v 0.186467 2.295024 3.656211 -v 0.002400 3.098831 3.537804 -v 0.179616 3.041305 3.652030 -v 0.179616 3.041305 3.652030 -v 0.002400 3.098831 3.537804 -v 0.002400 3.098831 3.537804 -v 0.240566 0.819549 3.388893 -v 0.240566 0.819549 3.388893 -v 0.240566 0.819549 3.388893 -v -0.464012 3.172995 3.403028 -v -0.408256 3.172995 3.397400 -v -0.408256 3.165919 3.397400 -v -0.408256 3.165919 3.397400 -v -0.408256 3.165919 3.397400 -v -0.404430 3.165919 3.403309 -v -0.408256 3.165919 3.397400 -v -0.428082 3.172995 3.404269 -v -0.428082 3.172995 3.404269 -v -0.408256 3.172995 3.397400 -v -0.428082 3.172995 3.404269 -v -0.463935 3.172995 3.402968 -v -0.463935 3.172995 3.402968 -v -0.464012 3.172995 3.403028 -v -0.464012 3.172995 3.403028 -v -0.404430 3.165919 3.403309 -v -0.404430 3.148009 3.403309 -v -0.404430 3.148009 3.403309 -v -0.404430 3.148009 3.403309 -v -0.314249 3.148009 3.419610 -v -0.404430 3.148009 3.403309 -v -0.314249 3.148009 3.419610 -v -0.314249 3.102593 3.419610 -v -0.314249 3.102593 3.419610 -vt 0.250000 0.230916 -vt 0.250011 -0.000000 -vt 0.312500 0.230916 -vt 0.312511 -0.000000 -vt 0.250000 0.233150 -vt 0.312500 0.233150 -vt 0.250001 0.235354 -vt 0.312501 0.235354 -vt 0.250028 0.464487 -vt 0.312528 0.464487 -vt 0.250028 0.466024 -vt 0.312528 0.466024 -vt 0.250028 0.467572 -vt 0.312528 0.467572 -vt 0.250034 0.697567 -vt 0.312534 0.697567 -vt 0.250036 0.698965 -vt 0.312536 0.698965 -vt 0.250038 0.700668 -vt 0.312538 0.700668 -vt 0.250324 0.938264 -vt 0.312824 0.938264 -vt 0.262848 0.956579 -vt 0.325348 0.956579 -vt 0.325581 0.957777 -vt 0.388081 0.957777 -vt 0.375000 0.230916 -vt 0.375011 -0.000000 -vt 0.375000 0.233150 -vt 0.375001 0.235354 -vt 0.375028 0.464487 -vt 0.375028 0.466024 -vt 0.375028 0.467572 -vt 0.375034 0.697567 -vt 0.375036 0.698965 -vt 0.375038 0.700668 -vt 0.375324 0.938264 -vt 0.387848 0.956579 -vt 0.450581 0.957777 -vt 0.437500 0.230916 -vt 0.437511 -0.000000 -vt 0.437500 0.233150 -vt 0.437501 0.235354 -vt 0.437528 0.464487 -vt 0.437528 0.466024 -vt 0.437528 0.467572 -vt 0.437534 0.697567 -vt 0.437536 0.698965 -vt 0.437538 0.700668 -vt 0.437824 0.938264 -vt 0.450348 0.956579 -vt 0.513081 0.957777 -vt 0.500000 0.230916 -vt 0.500011 -0.000000 -vt 0.500000 0.233150 -vt 0.500000 0.235354 -vt 0.500028 0.464487 -vt 0.500028 0.466024 -vt 0.500028 0.467572 -vt 0.500034 0.697567 -vt 0.500036 0.698965 -vt 0.500038 0.700668 -vt 0.500324 0.938264 -vt 0.512848 0.956579 -vt 0.575581 0.957777 -vt 0.562500 0.230916 -vt 0.562511 -0.000000 -vt 0.562500 0.233150 -vt 0.562500 0.235354 -vt 0.562528 0.464487 -vt 0.562528 0.466024 -vt 0.562528 0.467572 -vt 0.562534 0.697567 -vt 0.562536 0.698965 -vt 0.562538 0.700668 -vt 0.562824 0.938264 -vt 0.575348 0.956579 -vt 0.638081 0.957777 -vt 0.625000 0.230916 -vt 0.625011 -0.000000 -vt 0.625000 0.233150 -vt 0.625000 0.235354 -vt 0.625028 0.464487 -vt 0.625028 0.466024 -vt 0.625028 0.467572 -vt 0.625034 0.697567 -vt 0.625036 0.698965 -vt 0.625038 0.700668 -vt 0.625324 0.938264 -vt 0.637848 0.956579 -vt 0.700581 0.957777 -vt 0.687500 0.230916 -vt 0.687511 -0.000000 -vt 0.687500 0.233150 -vt 0.687501 0.235354 -vt 0.687528 0.464487 -vt 0.687528 0.466024 -vt 0.687528 0.467572 -vt 0.687534 0.697567 -vt 0.687536 0.698965 -vt 0.687538 0.700668 -vt 0.687824 0.938264 -vt 0.700348 0.956579 -vt 0.763081 0.957777 -vt 0.750000 0.230916 -vt 0.750011 -0.000000 -vt 0.750000 0.233150 -vt 0.750001 0.235354 -vt 0.750028 0.464487 -vt 0.750028 0.466024 -vt 0.750028 0.467572 -vt 0.750034 0.697567 -vt 0.750036 0.698965 -vt 0.750038 0.700668 -vt 0.750324 0.938264 -vt 0.762848 0.956579 -vt 0.825581 0.957777 -vt 0.812500 0.230916 -vt 0.812511 -0.000000 -vt 0.812500 0.233150 -vt 0.812501 0.235354 -vt 0.812528 0.464487 -vt 0.812528 0.466024 -vt 0.812528 0.467572 -vt 0.812534 0.697567 -vt 0.812536 0.698965 -vt 0.812538 0.700668 -vt 0.812824 0.938264 -vt 0.825348 0.956579 -vt 0.888081 0.957777 -vt 0.875000 0.230916 -vt 0.875011 -0.000000 -vt 0.875000 0.233150 -vt 0.875001 0.235354 -vt 0.875028 0.464487 -vt 0.875028 0.466024 -vt 0.875028 0.467572 -vt 0.875034 0.697567 -vt 0.875036 0.698965 -vt 0.875038 0.700668 -vt 0.875324 0.938264 -vt 0.887848 0.956579 -vt 0.950581 0.957777 -vt 0.937500 0.230916 -vt 0.937511 -0.000000 -vt 0.937500 0.233150 -vt 0.937501 0.235354 -vt 0.937528 0.464487 -vt 0.937528 0.466024 -vt 0.937528 0.467572 -vt 0.937534 0.697567 -vt 0.937536 0.698965 -vt 0.937538 0.700668 -vt 0.937824 0.938264 -vt 0.950348 0.956579 -vt -0.049419 0.957777 -vt -0.112152 0.956579 -vt 0.013081 0.957777 -vt -0.049652 0.956579 -vt 1.000000 0.230916 -vt -0.000000 0.230916 -vt -0.062489 -0.000000 -vt 0.000011 -0.000000 -vt -0.062500 0.233150 -vt -0.062500 0.230916 -vt 0.000000 0.233150 -vt -0.062499 0.235354 -vt 0.000001 0.235354 -vt -0.062472 0.464487 -vt 0.000028 0.464487 -vt -0.062472 0.466024 -vt 0.000028 0.466024 -vt -0.062472 0.467572 -vt 0.000028 0.467572 -vt -0.062466 0.697567 -vt 0.000034 0.697567 -vt -0.062464 0.698965 -vt 0.000036 0.698965 -vt -0.062462 0.700668 -vt 0.000038 0.700668 -vt -0.062176 0.938264 -vt 0.000324 0.938264 -vt 0.012848 0.956579 -vt 0.075581 0.957777 -vt 0.062500 0.230916 -vt 0.062511 -0.000000 -vt 0.062500 0.233150 -vt 0.062501 0.235354 -vt 0.062528 0.464487 -vt 0.062528 0.466024 -vt 0.062528 0.467572 -vt 0.062534 0.697567 -vt 0.062536 0.698965 -vt 0.062538 0.700668 -vt 0.062824 0.938264 -vt 0.075348 0.956579 -vt 0.138081 0.957777 -vt 0.125000 0.230916 -vt 0.125011 -0.000000 -vt 0.125000 0.233150 -vt 0.125001 0.235354 -vt 0.125028 0.464487 -vt 0.125028 0.466024 -vt 0.125028 0.467572 -vt 0.125034 0.697567 -vt 0.125036 0.698965 -vt 0.125038 0.700668 -vt 0.125324 0.938264 -vt 0.137848 0.956579 -vt 0.200581 0.957777 -vt 0.187500 0.230916 -vt 0.187511 -0.000000 -vt 0.187500 0.233150 -vt 0.187501 0.235354 -vt 0.187528 0.464487 -vt 0.187528 0.466024 -vt 0.187528 0.467572 -vt 0.187534 0.697567 -vt 0.187536 0.698965 -vt 0.187538 0.700668 -vt 0.187824 0.938264 -vt 0.200348 0.956579 -vt 0.263081 0.957777 -vt 0.186024 0.998224 -vt 0.188431 0.998224 -vt 0.193133 0.998224 -vt 0.192960 0.998224 -vt 0.191301 0.998224 -vt 0.186344 0.998224 -vt 0.191921 0.998224 -vt 0.190009 0.998224 -vt 0.195441 0.998224 -vt 0.197462 0.998224 -vt 0.202110 0.998224 -vt 0.208640 0.998224 -vt 0.211746 0.998224 -vt 0.222587 0.998224 -vt 0.223510 0.998224 -vt 0.237403 0.998224 -vt 0.235929 0.998224 -vt 0.250841 0.998224 -vt 0.247306 0.998224 -vt 0.261194 0.998224 -vt 0.256296 0.998224 -vt 0.267739 0.998224 -vt 0.262223 0.998224 -vt 0.270569 0.998224 -vt 0.265030 0.998224 -vt 0.270193 0.998224 -vt 0.265031 0.998224 -vt 0.267236 0.998224 -vt 0.262695 0.998224 -vt 0.262289 0.998224 -vt 0.258505 0.998224 -vt 0.255860 0.998224 -vt 0.252903 0.998224 -vt 0.248373 0.998224 -vt 0.246277 0.998224 -vt 0.240185 0.998224 -vt 0.238965 0.998224 -vt 0.231607 0.998224 -vt 0.231269 0.998224 -vt 0.222922 0.998224 -vt 0.223467 0.998224 -vt 0.214409 0.998224 -vt 0.215835 0.998224 -vt 0.206356 0.998224 -vt 0.208656 0.998224 -vt 0.199083 0.998224 -vt 0.202238 0.998224 -vt 0.196930 0.998224 -vt 0.191301 1.000000 -vt 0.195441 1.000000 -vt 0.191921 1.000000 -vt 0.202110 1.000000 -vt 0.211746 1.000000 -vt 0.223510 1.000000 -vt 0.235929 1.000000 -vt 0.247306 1.000000 -vt 0.256296 1.000000 -vt 0.262223 1.000000 -vt 0.265030 1.000000 -vt 0.265031 1.000000 -vt 0.262695 1.000000 -vt 0.258505 1.000000 -vt 0.252903 1.000000 -vt 0.246277 1.000000 -vt 0.238965 1.000000 -vt 0.231269 1.000000 -vt 0.223467 1.000000 -vt 0.215835 1.000000 -vt 0.208656 1.000000 -vt 0.202238 1.000000 -vt 0.196930 1.000000 -vt 0.193133 1.000000 -vt 0.191565 0.997954 -vt 0.259015 0.997954 -vt 0.197462 0.998027 -vt 0.208640 0.998023 -vt 0.222587 0.998022 -vt 0.237403 0.998023 -vt 0.250841 0.998027 -vt 0.190898 0.980191 -vt 0.190898 0.997954 -vt -0.072776 0.980191 -vt 0.693488 0.980191 -vt 0.259755 0.997954 -vt 0.260209 0.980154 -vt -0.300317 0.980191 -vt 0.693553 0.980191 -vt 0.191565 0.980191 -vt -0.300905 0.980191 -vt 0.698116 0.980191 -vt 0.699095 0.980191 -vt 0.696973 0.980191 -vt 0.695742 0.980191 -vt 0.694498 0.980191 -vt 0.186024 0.980191 -vt 0.186345 0.980191 -vt 0.190009 0.980191 -vt 0.270569 0.980191 -vt 0.270193 0.980191 -vt 0.267236 0.980191 -vt 0.262289 0.980191 -vt 0.255860 0.980191 -vt 0.248373 0.980191 -vt 0.240185 0.980191 -vt 0.231607 0.980191 -vt 0.222922 0.980191 -vt 0.214409 0.980191 -vt 0.206356 0.980191 -vt 0.199083 0.980191 -vt 0.192960 0.980191 -vt 0.316140 0.977938 -vt 0.367478 0.980191 -vt 0.316140 0.980191 -vt 0.367478 0.977938 -vt 0.425104 0.980191 -vt 0.425104 0.977938 -vt 0.504152 0.980191 -vt 0.504152 0.977938 -vt 0.698401 0.980191 -vt 0.698401 0.977938 -vt 0.841862 0.977938 -vt 0.924176 0.980191 -vt 0.924176 0.977938 -vt 0.973733 0.980191 -vt 0.973733 0.977938 -vt -0.026267 0.980191 -vt -0.026267 0.977938 -vt 0.041765 0.980191 -vt 0.041765 0.977938 -vt 0.096459 0.980191 -vt 0.096458 0.977938 -vt 0.146703 0.980191 -vt 0.146703 0.977938 -vt 0.195191 0.980191 -vt 0.195191 0.977938 -vt 0.219182 0.980191 -vt 0.219182 0.977938 -vt 0.243157 0.980191 -vt 0.267223 0.977938 -vt 0.291500 0.980191 -vt 0.291500 0.977938 -vt 0.319857 0.977938 -vt 0.373843 0.977938 -vt 0.435523 0.977938 -vt 0.521549 0.977938 -vt 0.703074 0.977938 -vt 0.905563 0.977938 -vt 0.959131 0.977938 -vt -0.040869 0.977938 -vt 0.032990 0.977938 -vt 0.091113 0.977938 -vt 0.143737 0.977938 -vt 0.194155 0.977938 -vt 0.219045 0.977938 -vt 0.243914 0.977938 -vt 0.268898 0.977938 -vt 0.294149 0.977938 -vt 0.927224 0.980191 -vt 0.699683 0.980191 -vt 0.319857 0.972236 -vt 0.373843 0.972236 -vt 0.435523 0.972236 -vt 0.521549 0.972236 -vt 0.703074 0.972236 -vt 0.905563 0.972236 -vt 0.959131 0.972236 -vt -0.040869 0.972236 -vt 0.032991 0.972236 -vt 0.091113 0.972236 -vt 0.143737 0.972236 -vt 0.194155 0.972236 -vt 0.219045 0.972236 -vt 0.243914 0.972236 -vt 0.268898 0.972236 -vt 0.294149 0.972236 -vt 0.298202 0.972236 -vt 0.381998 0.972236 -vt 0.466101 0.972236 -vt 0.508203 0.972236 -vt 0.550300 0.972236 -vt 0.634357 0.972236 -vt 0.718076 0.972236 -vt 0.884220 0.972236 -vt 0.966794 0.972236 -vt -0.033206 0.972236 -vt 0.049279 0.972236 -vt 0.131896 0.972236 -vt 0.214834 0.972236 -vt 0.381998 0.957777 -vt 0.466101 0.957777 -vt 0.550300 0.957776 -vt 0.634357 0.957777 -vt 0.718076 0.957777 -vt 0.801357 0.972236 -vt 0.801357 0.957776 -vt 0.884220 0.957777 -vt 0.966795 0.957777 -vt -0.033205 0.957777 -vt 0.049279 0.957776 -vt 0.131896 0.957777 -vt 0.214834 0.957777 -vt 0.298202 0.957776 -vt 0.784664 0.972236 -vt 0.784668 0.972236 -vt 0.748789 0.972236 -vt 0.749020 0.972236 -vt 0.772851 0.972236 -vt 0.799687 0.972236 -vt 0.799688 0.972236 -vt 0.810339 0.972236 -vn -0.195091 -0.000336 -0.980785 -vn -0.195159 -0.000363 -0.980771 -vn -0.180693 -0.377045 -0.908398 -vn -0.180694 -0.377019 -0.908409 -vn -0.180228 0.382872 -0.906050 -vn -0.180218 0.382966 -0.906012 -vn -0.195262 0.000902 -0.980751 -vn -0.195094 0.000967 -0.980784 -vn -0.168010 -0.509584 -0.843858 -vn -0.168017 -0.509500 -0.843907 -vn -0.168206 0.507880 -0.844846 -vn -0.168205 0.507886 -0.844843 -vn -0.195301 0.000194 -0.980743 -vn -0.195264 0.000208 -0.980751 -vn -0.164384 -0.540014 -0.825447 -vn -0.164418 -0.539683 -0.825657 -vn -0.171487 0.478735 -0.861049 -vn -0.171421 0.479236 -0.860783 -vn -0.197077 0.010090 -0.980336 -vn -0.195313 0.010746 -0.980682 -vn -0.079570 0.956757 -0.279793 -vn -0.051883 0.964728 -0.258086 -vn -0.008916 0.999897 -0.011225 -vn -0.002884 0.999944 -0.010142 -vn -0.555570 -0.000337 -0.831470 -vn -0.555627 -0.000363 -0.831432 -vn -0.514561 -0.377072 -0.770093 -vn -0.514572 -0.377020 -0.770112 -vn -0.513228 0.382919 -0.768095 -vn -0.513217 0.382965 -0.768080 -vn -0.555717 0.000901 -0.831371 -vn -0.555573 0.000967 -0.831467 -vn -0.478175 -0.509507 -0.715368 -vn -0.478153 -0.509576 -0.715333 -vn -0.478737 0.507802 -0.716204 -vn -0.478690 0.507938 -0.716139 -vn -0.555749 0.000194 -0.831350 -vn -0.555719 0.000208 -0.831370 -vn -0.467750 -0.540033 -0.699696 -vn -0.467874 -0.539665 -0.699897 -vn -0.487931 0.478772 -0.729863 -vn -0.487782 0.479232 -0.729661 -vn -0.557234 0.010090 -0.830294 -vn -0.555737 0.010746 -0.831289 -vn -0.180586 0.956757 -0.228045 -vn -0.146699 0.964728 -0.218585 -vn -0.012533 0.999897 -0.006958 -vn -0.006546 0.999944 -0.008266 -vn -0.831470 -0.000337 -0.555570 -vn -0.831508 -0.000362 -0.555513 -vn -0.770098 -0.377061 -0.514562 -vn -0.770112 -0.377020 -0.514572 -vn -0.768103 0.382905 -0.513226 -vn -0.768077 0.382977 -0.513211 -vn -0.831567 0.000902 -0.555424 -vn -0.831471 0.000967 -0.555567 -vn -0.715494 -0.509591 -0.477896 -vn -0.715509 -0.509561 -0.477906 -vn -0.716341 0.507870 -0.478460 -vn -0.716325 0.507902 -0.478450 -vn -0.831589 0.000194 -0.555391 -vn -0.831568 0.000208 -0.555423 -vn -0.699914 -0.540018 -0.467441 -vn -0.700074 -0.539710 -0.467556 -vn -0.730098 0.478767 -0.487585 -vn -0.729875 0.479244 -0.487450 -vn -0.832557 0.010090 -0.553848 -vn -0.831554 0.010746 -0.555340 -vn -0.254108 0.956757 -0.141579 -vn -0.219181 0.964728 -0.145808 -vn -0.014241 0.999897 -0.001633 -vn -0.009211 0.999944 -0.005132 -vn -0.980785 -0.000337 -0.195090 -vn -0.980799 -0.000362 -0.195022 -vn -0.908387 -0.377075 -0.180687 -vn -0.908407 -0.377024 -0.180693 -vn -0.906032 0.382921 -0.180218 -vn -0.906016 0.382959 -0.180216 -vn -0.980819 0.000902 -0.194918 -vn -0.980786 0.000967 -0.195087 -vn -0.843932 -0.509559 -0.167715 -vn -0.843924 -0.509573 -0.167713 -vn -0.844934 0.507831 -0.167911 -vn -0.844873 0.507935 -0.167902 -vn -0.980827 0.000194 -0.194880 -vn -0.980820 0.000208 -0.194915 -vn -0.825485 -0.540071 -0.164006 -vn -0.825720 -0.539695 -0.164062 -vn -0.861110 0.478774 -0.171072 -vn -0.860861 0.479234 -0.171035 -vn -0.981130 0.010090 -0.193084 -vn -0.980775 0.010746 -0.194845 -vn -0.288945 0.956757 -0.033559 -vn -0.258295 0.964728 -0.050832 -vn -0.013782 0.999897 0.003941 -vn -0.010474 0.999944 -0.001216 -vn -0.980785 -0.000336 0.195090 -vn -0.980772 -0.000363 0.195158 -vn -0.908386 -0.377077 0.180690 -vn -0.908408 -0.377021 0.180693 -vn -0.906037 0.382905 0.180225 -vn -0.906007 0.382980 0.180217 -vn -0.980751 0.000902 0.195263 -vn -0.980784 0.000967 0.195094 -vn -0.843852 -0.509595 0.168008 -vn -0.843876 -0.509555 0.168012 -vn -0.844851 0.507871 0.168208 -vn -0.844818 0.507928 0.168201 -vn -0.980743 0.000194 0.195302 -vn -0.980750 0.000208 0.195266 -vn -0.825430 -0.540041 0.164380 -vn -0.825615 -0.539750 0.164410 -vn -0.861033 0.478764 0.171484 -vn -0.860768 0.479265 0.171418 -vn -0.980337 0.010090 0.197075 -vn -0.980682 0.010745 0.195313 -vn -0.279794 0.956757 0.079571 -vn -0.258086 0.964728 0.051882 -vn -0.011225 0.999897 0.008916 -vn -0.010142 0.999944 0.002884 -vn -0.831470 -0.000337 0.555569 -vn -0.831431 -0.000363 0.555628 -vn -0.770090 -0.377080 0.514559 -vn -0.770118 -0.377001 0.514575 -vn -0.768091 0.382931 0.513225 -vn -0.768076 0.382977 0.513213 -vn -0.831371 0.000902 0.555717 -vn -0.831468 0.000968 0.555572 -vn -0.715338 -0.509568 0.478156 -vn -0.715333 -0.509577 0.478152 -vn -0.716175 0.507863 0.478716 -vn -0.716158 0.507897 0.478704 -vn -0.831350 0.000194 0.555749 -vn -0.831371 0.000208 0.555717 -vn -0.699662 -0.540096 0.467728 -vn -0.699883 -0.539692 0.467864 -vn -0.729852 0.478797 0.487923 -vn -0.729661 0.479232 0.487782 -vn -0.830294 0.010089 0.557234 -vn -0.831289 0.010746 0.555736 -vn -0.228044 0.956757 0.180585 -vn -0.218585 0.964728 0.146699 -vn -0.006959 0.999897 0.012532 -vn -0.008266 0.999944 0.006546 -vn -0.555570 -0.000337 0.831470 -vn -0.555513 -0.000363 0.831508 -vn -0.514566 -0.377042 0.770104 -vn -0.514573 -0.377013 0.770114 -vn -0.513225 0.382913 0.768100 -vn -0.513212 0.382978 0.768077 -vn -0.555424 0.000902 0.831567 -vn -0.555568 0.000967 0.831471 -vn -0.477899 -0.509580 0.715500 -vn -0.477914 -0.509537 0.715521 -vn -0.478474 0.507824 0.716364 -vn -0.478446 0.507916 0.716318 -vn -0.555391 0.000194 0.831590 -vn -0.555421 0.000208 0.831569 -vn -0.467431 -0.540047 0.699898 -vn -0.467542 -0.539751 0.700053 -vn -0.487581 0.478778 0.730093 -vn -0.487441 0.479277 0.729860 -vn -0.553849 0.010089 0.832556 -vn -0.555340 0.010745 0.831554 -vn -0.141579 0.956757 0.254108 -vn -0.145808 0.964728 0.219181 -vn -0.001633 0.999897 0.014241 -vn -0.005132 0.999944 0.009211 -vn -0.195089 -0.000337 0.980786 -vn -0.195023 -0.000362 0.980799 -vn -0.180687 -0.377072 0.908388 -vn -0.180692 -0.377018 0.908409 -vn -0.180216 0.382930 0.906028 -vn -0.180213 0.382981 0.906007 -vn -0.194917 0.000902 0.980819 -vn -0.195085 0.000967 0.980786 -vn -0.167717 -0.509541 0.843943 -vn -0.167707 -0.509616 0.843899 -vn -0.167910 0.507846 0.844925 -vn -0.167900 0.507957 0.844861 -vn -0.194880 0.000194 0.980827 -vn -0.194916 0.000208 0.980820 -vn -0.164003 -0.540096 0.825469 -vn -0.164063 -0.539691 0.825722 -vn -0.171071 0.478786 0.861103 -vn -0.171035 0.479233 0.860862 -vn -0.193082 0.010089 0.981131 -vn -0.194846 0.010746 0.980775 -vn -0.033559 0.956757 0.288945 -vn -0.050831 0.964728 0.258295 -vn 0.003941 0.999897 0.013782 -vn -0.001216 0.999944 0.010474 -vn 0.195091 -0.000336 0.980785 -vn 0.195157 -0.000362 0.980772 -vn 0.180691 -0.377082 0.908383 -vn 0.180694 -0.377020 0.908408 -vn 0.180222 0.382936 0.906024 -vn 0.180221 0.382940 0.906023 -vn 0.195263 0.000902 0.980751 -vn 0.195093 0.000968 0.980784 -vn 0.168007 -0.509614 0.843841 -vn 0.168014 -0.509531 0.843890 -vn 0.168207 0.507880 0.844846 -vn 0.168206 0.507885 0.844843 -vn 0.195301 0.000194 0.980743 -vn 0.195265 0.000208 0.980750 -vn 0.164381 -0.540045 0.825427 -vn 0.164422 -0.539653 0.825676 -vn 0.171484 0.478765 0.861033 -vn 0.171422 0.479237 0.860783 -vn 0.197077 0.010090 0.980336 -vn 0.195314 0.010746 0.980682 -vn 0.079570 0.956757 0.279793 -vn 0.051883 0.964728 0.258086 -vn 0.008916 0.999897 0.011225 -vn 0.002884 0.999944 0.010142 -vn 0.555570 -0.000336 0.831470 -vn 0.555629 -0.000363 0.831430 -vn 0.514561 -0.377074 0.770092 -vn 0.514572 -0.377019 0.770112 -vn 0.513234 0.382897 0.768102 -vn 0.513215 0.382969 0.768078 -vn 0.555717 0.000902 0.831371 -vn 0.555573 0.000968 0.831467 -vn 0.478167 -0.509531 0.715356 -vn 0.478146 -0.509599 0.715322 -vn 0.478737 0.507800 0.716205 -vn 0.478703 0.507899 0.716158 -vn 0.555749 0.000194 0.831350 -vn 0.555718 0.000208 0.831371 -vn 0.467757 -0.540011 0.699708 -vn 0.467876 -0.539660 0.699900 -vn 0.487930 0.478774 0.729862 -vn 0.487774 0.479256 0.729651 -vn 0.557233 0.010090 0.830295 -vn 0.555737 0.010745 0.831289 -vn 0.180586 0.956757 0.228045 -vn 0.146699 0.964728 0.218586 -vn 0.012532 0.999897 0.006958 -vn 0.006546 0.999944 0.008266 -vn 0.831470 -0.000337 0.555570 -vn 0.831508 -0.000363 0.555513 -vn 0.770098 -0.377061 0.514562 -vn 0.770108 -0.377031 0.514569 -vn 0.768101 0.382911 0.513225 -vn 0.768082 0.382963 0.513215 -vn 0.831567 0.000902 0.555424 -vn 0.831471 0.000967 0.555567 -vn 0.715489 -0.509602 0.477892 -vn 0.715519 -0.509541 0.477913 -vn 0.716370 0.507811 0.478478 -vn 0.716328 0.507896 0.478452 -vn 0.831590 0.000194 0.555390 -vn 0.831569 0.000208 0.555421 -vn 0.699918 -0.540011 0.467443 -vn 0.700072 -0.539715 0.467554 -vn 0.730091 0.478784 0.487579 -vn 0.729868 0.479261 0.487445 -vn 0.832556 0.010089 0.553849 -vn 0.831554 0.010745 0.555340 -vn 0.254108 0.956757 0.141579 -vn 0.219181 0.964728 0.145808 -vn 0.014241 0.999897 0.001633 -vn 0.009211 0.999944 0.005132 -vn 0.980785 -0.000336 0.195090 -vn 0.980799 -0.000362 0.195023 -vn 0.908382 -0.377088 0.180686 -vn 0.908404 -0.377031 0.180693 -vn 0.906034 0.382915 0.180218 -vn 0.906008 0.382977 0.180214 -vn 0.980819 0.000902 0.194918 -vn 0.980786 0.000967 0.195086 -vn 0.843936 -0.509553 0.167715 -vn 0.843933 -0.509557 0.167715 -vn 0.844938 0.507823 0.167912 -vn 0.844874 0.507933 0.167902 -vn 0.980827 0.000194 0.194880 -vn 0.980820 0.000208 0.194915 -vn 0.825491 -0.540061 0.164008 -vn 0.825718 -0.539697 0.164061 -vn 0.861106 0.478780 0.171072 -vn 0.860853 0.479248 0.171034 -vn 0.981131 0.010089 0.193082 -vn 0.980775 0.010746 0.194846 -vn 0.288945 0.956757 0.033559 -vn 0.258296 0.964728 0.050831 -vn 0.013782 0.999897 -0.003941 -vn 0.010474 0.999944 0.001216 -vn 0.980785 -0.000336 -0.195090 -vn 0.980772 -0.000363 -0.195158 -vn 0.908383 -0.377083 -0.180690 -vn 0.908405 -0.377029 -0.180692 -vn 0.906033 0.382913 -0.180224 -vn 0.906006 0.382981 -0.180217 -vn 0.980751 0.000902 -0.195263 -vn 0.980784 0.000967 -0.195093 -vn 0.843861 -0.509580 -0.168010 -vn 0.843879 -0.509548 -0.168013 -vn 0.844859 0.507858 -0.168210 -vn 0.844816 0.507932 -0.168200 -vn 0.980743 0.000194 -0.195302 -vn 0.980750 0.000208 -0.195266 -vn 0.825421 -0.540055 -0.164379 -vn 0.825619 -0.539742 -0.164411 -vn 0.861025 0.478779 -0.171482 -vn 0.860775 0.479252 -0.171419 -vn 0.980337 0.010090 -0.197075 -vn 0.980682 0.010745 -0.195313 -vn 0.279794 0.956757 -0.079571 -vn 0.258086 0.964728 -0.051882 -vn 0.011225 0.999897 -0.008915 -vn 0.010142 0.999944 -0.002884 -vn 0.831469 -0.000337 -0.555571 -vn 0.831431 -0.000362 -0.555628 -vn 0.770091 -0.377076 -0.514561 -vn 0.770109 -0.377026 -0.514571 -vn 0.768094 0.382921 -0.513228 -vn 0.768080 0.382962 -0.513218 -vn 0.831371 0.000902 -0.555717 -vn 0.831467 0.000967 -0.555573 -vn 0.715347 -0.509550 -0.478161 -vn 0.715325 -0.509594 -0.478147 -vn 0.716185 0.507841 -0.478724 -vn 0.716125 0.507966 -0.478681 -vn 0.831351 0.000194 -0.555749 -vn 0.831370 0.000207 -0.555719 -vn 0.699666 -0.540089 -0.467730 -vn 0.699896 -0.539667 -0.467873 -vn 0.729862 0.478774 -0.487931 -vn 0.729650 0.479256 -0.487775 -vn 0.830294 0.010089 -0.557234 -vn 0.831288 0.010745 -0.555737 -vn 0.228045 0.956757 -0.180586 -vn 0.218585 0.964728 -0.146699 -vn 0.006958 0.999897 -0.012533 -vn 0.008266 0.999944 -0.006546 -vn 0.555571 -0.000336 -0.831469 -vn 0.555513 -0.000363 -0.831508 -vn 0.514556 -0.377083 -0.770091 -vn 0.514580 -0.376987 -0.770122 -vn 0.513221 0.382928 -0.768095 -vn 0.513216 0.382952 -0.768086 -vn 0.555425 0.000902 -0.831566 -vn 0.555568 0.000967 -0.831471 -vn 0.477890 -0.509607 -0.715487 -vn 0.477917 -0.509529 -0.715525 -vn 0.478454 0.507885 -0.716334 -vn 0.478445 0.507915 -0.716319 -vn 0.555391 0.000194 -0.831590 -vn 0.555422 0.000208 -0.831568 -vn 0.467442 -0.540016 -0.699915 -vn 0.467552 -0.539721 -0.700069 -vn 0.487585 0.478765 -0.730099 -vn 0.487452 0.479239 -0.729877 -vn 0.553847 0.010089 -0.832557 -vn 0.555341 0.010746 -0.831554 -vn 0.141579 0.956757 -0.254108 -vn 0.145807 0.964728 -0.219181 -vn 0.001633 0.999897 -0.014241 -vn 0.005132 0.999944 -0.009211 -vn 0.195090 -0.000337 -0.980785 -vn 0.195023 -0.000362 -0.980799 -vn 0.180690 -0.377045 -0.908399 -vn 0.180694 -0.377003 -0.908415 -vn 0.180219 0.382903 -0.906039 -vn 0.180218 0.382939 -0.906024 -vn 0.194917 0.000902 -0.980819 -vn 0.195087 0.000967 -0.980785 -vn 0.167715 -0.509559 -0.843932 -vn 0.167711 -0.509584 -0.843917 -vn 0.167909 0.507846 -0.844925 -vn 0.167899 0.507957 -0.844861 -vn 0.194879 0.000194 -0.980827 -vn 0.194915 0.000208 -0.980820 -vn 0.164006 -0.540064 -0.825490 -vn 0.164066 -0.539659 -0.825742 -vn 0.171072 0.478772 -0.861111 -vn 0.171037 0.479203 -0.860878 -vn 0.193084 0.010090 -0.981130 -vn 0.194845 0.010746 -0.980775 -vn 0.033559 0.956757 -0.288945 -vn 0.050832 0.964728 -0.258295 -vn -0.003941 0.999897 -0.013782 -vn 0.001216 0.999944 -0.010474 -vn 0.000000 0.000000 0.000000 -vn 0.986066 0.000007 0.166358 -vn 0.986064 -0.000000 0.166364 -vn 0.909398 0.000000 0.415926 -vn 0.770743 0.000000 0.637146 -vn 0.579645 0.000000 0.814869 -vn 0.579619 -0.000035 0.814888 -vn 0.348918 -0.000040 0.937153 -vn 0.348952 -0.000000 0.937141 -vn 0.094451 0.000000 0.995529 -vn -0.166331 0.000000 0.986070 -vn -0.415934 0.000000 0.909395 -vn -0.637128 0.000000 0.770758 -vn -0.814895 0.000000 0.579608 -vn -0.937142 0.000000 0.348949 -vn -0.995529 0.000000 0.094459 -vn -0.986066 -0.000000 -0.166356 -vn -0.909392 -0.000000 -0.415941 -vn -0.770784 -0.000000 -0.637097 -vn -0.579580 -0.000000 -0.814915 -vn -0.348952 -0.000000 -0.937141 -vn -0.094490 -0.000000 -0.995526 -vn 0.166407 0.000000 -0.986057 -vn 0.415901 0.000000 -0.909410 -vn 0.637090 0.000000 -0.770789 -vn 0.814908 0.000000 -0.579590 -vn 0.937146 0.000000 -0.348936 -vn 0.995528 -0.000004 -0.094463 -vn 0.995529 0.000000 -0.094459 -vn 0.579621 0.000047 0.814887 -vn -0.637111 -0.000177 0.770772 -vn 0.579615 -0.000000 0.814891 -vn 0.348906 0.000000 0.937158 -vn 0.094486 0.000000 0.995526 -vn -0.166411 0.000000 0.986056 -vn -0.415902 0.000000 0.909409 -vn -0.637132 0.000000 0.770754 -vn 0.999998 0.000000 0.001845 -vn 0.036055 0.000000 -0.999350 -vn -0.018114 0.864632 0.502079 -vn -0.999991 0.004244 0.000620 -vn -0.018422 0.864628 0.502075 -vn -0.018210 0.864630 0.502079 -vn 0.442788 0.689953 0.572629 -vn 0.036675 0.000317 -0.999327 -vn -0.634286 0.006480 0.773072 -vn -0.018484 0.864628 0.502072 -vn -0.418367 0.786460 0.454367 -vn 0.037296 0.000009 -0.999304 -vn 0.442366 0.690211 0.572643 -vn 0.207313 0.801683 0.560648 -vn 0.207439 0.801643 0.560658 -vn 0.050889 0.839488 0.540990 -vn 0.050629 0.839523 0.540960 -vn -0.087243 0.849872 0.519718 -vn -0.087437 0.849868 0.519692 -vn -0.225222 0.838716 0.495813 -vn -0.223479 0.839022 0.496084 -vn -0.420371 0.785711 0.453812 -vn 0.995009 -0.032192 -0.094453 -vn 0.986055 0.000000 0.166419 -vn 0.909408 0.000000 0.415906 -vn 0.770766 0.000000 0.637119 -vn 0.579642 0.000000 0.814871 -vn -0.814907 0.001411 0.579590 -vn -0.881495 -0.016757 0.471896 -vn -0.937155 0.000000 0.348913 -vn -0.995525 0.000000 0.094501 -vn -0.995525 -0.000000 0.094498 -vn -0.986067 0.000001 -0.166349 -vn -0.909388 0.000002 -0.415949 -vn -0.909382 0.000000 -0.415962 -vn -0.770752 -0.000000 -0.637136 -vn -0.770766 0.000003 -0.637119 -vn -0.579598 0.000003 -0.814902 -vn -0.579621 0.000000 -0.814886 -vn -0.348929 -0.000000 -0.937149 -vn -0.094519 -0.000000 -0.995523 -vn 0.166433 0.000000 -0.986053 -vn 0.415900 0.000000 -0.909410 -vn 0.415872 0.000004 -0.909423 -vn 0.637131 0.000003 -0.770755 -vn 0.637167 -0.000002 -0.770726 -vn 0.814919 -0.000005 -0.579574 -vn 0.814897 0.000000 -0.579606 -vn 0.937133 0.000000 -0.348972 -vn 0.999342 0.000000 0.036269 -vn 0.579438 -0.000007 0.815017 -vn -0.890393 0.000000 -0.455192 -vn -0.998700 0.000000 0.050974 -vn -0.839407 0.000000 0.543503 -vn -0.455195 0.000000 0.890392 -vn -0.079813 0.000000 0.996810 -vn 0.047853 0.345150 0.937327 -vn 0.180911 0.000000 0.983499 -vn 0.429291 -0.000000 0.903166 -vn 0.742237 -0.000000 0.670138 -vn 0.977866 -0.000000 0.209234 -vn 0.977865 0.000014 0.209237 -vn 0.951475 -0.000021 -0.307727 -vn 0.951476 0.000000 -0.307723 -vn 0.670135 0.000000 -0.742239 -vn 0.335084 0.000000 -0.942188 -vn 0.079813 0.000000 -0.996810 -vn -0.047853 -0.345150 -0.937327 -vn -0.288823 0.345130 -0.893010 -vn -0.429291 0.000000 -0.903166 -vn -0.648411 0.000000 -0.761290 -vn 0.000008 1.000000 0.000008 -vn 0.000012 1.000000 0.000003 -vn -0.000005 1.000000 0.000037 -vn 0.000004 1.000000 0.000034 -vn -0.000003 1.000000 0.000005 -vn 0.000000 1.000000 0.000006 -vn 0.000010 1.000000 0.000005 -vn -0.000011 1.000000 0.000032 -vn -0.000003 1.000000 0.000034 -vn 0.000001 1.000000 0.000025 -vn -0.000011 1.000000 0.000003 -vn 0.000008 1.000000 0.000024 -vn -0.000012 1.000000 -0.000003 -vn -0.000006 1.000000 0.000002 -vn -0.000003 1.000000 0.000003 -vn 0.002135 0.999997 0.001092 -vn 0.001927 0.999998 -0.000098 -vn 0.001290 0.999999 -0.000835 -vn 0.000596 0.999999 -0.001139 -vn 0.001641 0.999997 0.001927 -vn -0.005030 0.999987 -0.001203 -vn 0.000006 1.000000 0.000005 -vn -0.032739 0.999119 0.026274 -vn 0.000005 1.000000 0.000005 -vn -0.890390 0.000006 -0.455198 -vn -0.890391 -0.000000 -0.455196 -vn -0.998700 0.000000 0.050981 -vn -0.839403 0.000000 0.543509 -vn -0.455193 0.000000 0.890393 -vn 0.050979 -0.000000 0.998700 -vn 0.429302 -0.000000 0.903161 -vn 0.742234 -0.000000 0.670140 -vn 0.977865 -0.000000 0.209238 -vn 0.977865 0.000003 0.209239 -vn 0.951473 -0.000004 -0.307731 -vn 0.951474 0.000000 -0.307729 -vn 0.670142 0.000000 -0.742233 -vn 0.670133 -0.000029 -0.742241 -vn 0.335069 -0.000022 -0.942193 -vn 0.335086 0.000000 -0.942187 -vn 0.079812 0.000000 -0.996810 -vn -0.180919 0.000000 -0.983498 -vn -0.429276 0.000000 -0.903173 -vn -0.648421 0.000000 -0.761282 -vn -0.648415 0.000010 -0.761287 -vn -0.000000 1.000000 0.000012 -vn -0.000006 1.000000 0.000001 -vn 0.000004 1.000000 0.000010 -vn -0.000001 1.000000 0.000006 -vn 0.000013 1.000000 0.000026 -vn -0.890389 0.000000 -0.455200 -vn -0.890391 -0.000007 -0.455196 -vn -0.996811 -0.000010 -0.079799 -vn -0.960853 -0.213370 0.176736 -vn -0.839408 0.000000 0.543502 -vn -0.455196 0.000000 0.890391 -vn 0.050984 -0.000000 0.998699 -vn 0.543505 -0.000000 0.839406 -vn 0.890392 -0.000000 0.455195 -vn 0.998700 0.000000 -0.050981 -vn 0.839404 0.000000 -0.543508 -vn 0.839406 0.000006 -0.543505 -vn 0.455201 0.000009 -0.890389 -vn 0.455193 -0.000005 -0.890393 -vn -0.050987 -0.000005 -0.998699 -vn -0.050984 -0.000000 -0.998699 -vn -0.543502 0.000000 -0.839408 -vn 0.000059 1.000000 0.000009 -vn 0.000012 1.000000 0.000005 -s off -f 1017/224/370 1016/225/370 1030/226/370 -f 1030/226/371 1016/225/371 1029/227/371 -f 1018/228/372 1017/224/372 1031/229/372 -f 1031/229/373 1017/224/373 1030/226/373 -f 1019/230/374 1018/228/374 1032/231/374 -f 1032/231/375 1018/228/375 1031/229/375 -f 1020/232/376 1019/230/376 1033/233/376 -f 1033/233/377 1019/230/377 1032/231/377 -f 1021/234/378 1020/232/378 1034/235/378 -f 1034/235/379 1020/232/379 1033/233/379 -f 1022/236/380 1021/234/380 1035/237/380 -f 1035/237/381 1021/234/381 1034/235/381 -f 1023/238/382 1022/236/382 1036/239/382 -f 1036/239/383 1022/236/383 1035/237/383 -f 1024/240/384 1023/238/384 1037/241/384 -f 1037/241/385 1023/238/385 1036/239/385 -f 1025/242/386 1024/240/386 1038/243/386 -f 1038/243/387 1024/240/387 1037/241/387 -f 1026/244/388 1025/242/388 1039/245/388 -f 1039/245/389 1025/242/389 1038/243/389 -f 1027/246/390 1026/244/390 1040/247/390 -f 1040/247/391 1026/244/391 1039/245/391 -f 1028/248/392 1027/246/392 1041/249/392 -f 1041/249/393 1027/246/393 1040/247/393 -f 1030/226/394 1029/227/394 1043/250/394 -f 1043/250/395 1029/227/395 1042/251/395 -f 1031/229/396 1030/226/396 1044/252/396 -f 1044/252/397 1030/226/397 1043/250/397 -f 1032/231/398 1031/229/398 1045/253/398 -f 1045/253/399 1031/229/399 1044/252/399 -f 1033/233/400 1032/231/400 1046/254/400 -f 1046/254/401 1032/231/401 1045/253/401 -f 1034/235/402 1033/233/402 1047/255/402 -f 1047/255/403 1033/233/403 1046/254/403 -f 1035/237/404 1034/235/404 1048/256/404 -f 1048/256/405 1034/235/405 1047/255/405 -f 1036/239/406 1035/237/406 1049/257/406 -f 1049/257/407 1035/237/407 1048/256/407 -f 1037/241/408 1036/239/408 1050/258/408 -f 1050/258/409 1036/239/409 1049/257/409 -f 1038/243/410 1037/241/410 1051/259/410 -f 1051/259/411 1037/241/411 1050/258/411 -f 1039/245/412 1038/243/412 1052/260/412 -f 1052/260/413 1038/243/413 1051/259/413 -f 1040/247/414 1039/245/414 1053/261/414 -f 1053/261/415 1039/245/415 1052/260/415 -f 1041/249/416 1040/247/416 1054/262/416 -f 1054/262/417 1040/247/417 1053/261/417 -f 1043/250/418 1042/251/418 1056/263/418 -f 1056/263/419 1042/251/419 1055/264/419 -f 1044/252/420 1043/250/420 1057/265/420 -f 1057/265/421 1043/250/421 1056/263/421 -f 1045/253/422 1044/252/422 1058/266/422 -f 1058/266/423 1044/252/423 1057/265/423 -f 1046/254/424 1045/253/424 1059/267/424 -f 1059/267/425 1045/253/425 1058/266/425 -f 1047/255/426 1046/254/426 1060/268/426 -f 1060/268/427 1046/254/427 1059/267/427 -f 1048/256/428 1047/255/428 1061/269/428 -f 1061/269/429 1047/255/429 1060/268/429 -f 1049/257/430 1048/256/430 1062/270/430 -f 1062/270/431 1048/256/431 1061/269/431 -f 1050/258/432 1049/257/432 1063/271/432 -f 1063/271/433 1049/257/433 1062/270/433 -f 1051/259/434 1050/258/434 1064/272/434 -f 1064/272/435 1050/258/435 1063/271/435 -f 1052/260/436 1051/259/436 1065/273/436 -f 1065/273/437 1051/259/437 1064/272/437 -f 1053/261/438 1052/260/438 1066/274/438 -f 1066/274/439 1052/260/439 1065/273/439 -f 1054/262/440 1053/261/440 1067/275/440 -f 1067/275/441 1053/261/441 1066/274/441 -f 1056/263/442 1055/264/442 1069/276/442 -f 1069/276/443 1055/264/443 1068/277/443 -f 1057/265/444 1056/263/444 1070/278/444 -f 1070/278/445 1056/263/445 1069/276/445 -f 1058/266/446 1057/265/446 1071/279/446 -f 1071/279/447 1057/265/447 1070/278/447 -f 1059/267/448 1058/266/448 1072/280/448 -f 1072/280/449 1058/266/449 1071/279/449 -f 1060/268/450 1059/267/450 1073/281/450 -f 1073/281/451 1059/267/451 1072/280/451 -f 1061/269/452 1060/268/452 1074/282/452 -f 1074/282/453 1060/268/453 1073/281/453 -f 1062/270/454 1061/269/454 1075/283/454 -f 1075/283/455 1061/269/455 1074/282/455 -f 1063/271/456 1062/270/456 1076/284/456 -f 1076/284/457 1062/270/457 1075/283/457 -f 1064/272/458 1063/271/458 1077/285/458 -f 1077/285/459 1063/271/459 1076/284/459 -f 1065/273/460 1064/272/460 1078/286/460 -f 1078/286/461 1064/272/461 1077/285/461 -f 1066/274/462 1065/273/462 1079/287/462 -f 1079/287/463 1065/273/463 1078/286/463 -f 1067/275/464 1066/274/464 1080/288/464 -f 1080/288/465 1066/274/465 1079/287/465 -f 1069/276/466 1068/277/466 1082/289/466 -f 1082/289/467 1068/277/467 1081/290/467 -f 1070/278/468 1069/276/468 1083/291/468 -f 1083/291/469 1069/276/469 1082/289/469 -f 1071/279/470 1070/278/470 1084/292/470 -f 1084/292/471 1070/278/471 1083/291/471 -f 1072/280/472 1071/279/472 1085/293/472 -f 1085/293/473 1071/279/473 1084/292/473 -f 1073/281/474 1072/280/474 1086/294/474 -f 1086/294/475 1072/280/475 1085/293/475 -f 1074/282/476 1073/281/476 1087/295/476 -f 1087/295/477 1073/281/477 1086/294/477 -f 1075/283/478 1074/282/478 1088/296/478 -f 1088/296/479 1074/282/479 1087/295/479 -f 1076/284/480 1075/283/480 1089/297/480 -f 1089/297/481 1075/283/481 1088/296/481 -f 1077/285/482 1076/284/482 1090/298/482 -f 1090/298/483 1076/284/483 1089/297/483 -f 1078/286/484 1077/285/484 1091/299/484 -f 1091/299/485 1077/285/485 1090/298/485 -f 1079/287/486 1078/286/486 1092/300/486 -f 1092/300/487 1078/286/487 1091/299/487 -f 1080/288/488 1079/287/488 1093/301/488 -f 1093/301/489 1079/287/489 1092/300/489 -f 1082/289/490 1081/290/490 1095/302/490 -f 1095/302/491 1081/290/491 1094/303/491 -f 1083/291/492 1082/289/492 1096/304/492 -f 1096/304/493 1082/289/493 1095/302/493 -f 1084/292/494 1083/291/494 1097/305/494 -f 1097/305/495 1083/291/495 1096/304/495 -f 1085/293/496 1084/292/496 1098/306/496 -f 1098/306/497 1084/292/497 1097/305/497 -f 1086/294/498 1085/293/498 1099/307/498 -f 1099/307/499 1085/293/499 1098/306/499 -f 1087/295/500 1086/294/500 1100/308/500 -f 1100/308/501 1086/294/501 1099/307/501 -f 1088/296/502 1087/295/502 1101/309/502 -f 1101/309/503 1087/295/503 1100/308/503 -f 1089/297/504 1088/296/504 1102/310/504 -f 1102/310/505 1088/296/505 1101/309/505 -f 1090/298/506 1089/297/506 1103/311/506 -f 1103/311/507 1089/297/507 1102/310/507 -f 1091/299/508 1090/298/508 1104/312/508 -f 1104/312/509 1090/298/509 1103/311/509 -f 1092/300/510 1091/299/510 1105/313/510 -f 1105/313/511 1091/299/511 1104/312/511 -f 1093/301/512 1092/300/512 1106/314/512 -f 1106/314/513 1092/300/513 1105/313/513 -f 1095/302/514 1094/303/514 1108/315/514 -f 1108/315/515 1094/303/515 1107/316/515 -f 1096/304/516 1095/302/516 1109/317/516 -f 1109/317/517 1095/302/517 1108/315/517 -f 1097/305/518 1096/304/518 1110/318/518 -f 1110/318/519 1096/304/519 1109/317/519 -f 1098/306/520 1097/305/520 1111/319/520 -f 1111/319/521 1097/305/521 1110/318/521 -f 1099/307/522 1098/306/522 1112/320/522 -f 1112/320/523 1098/306/523 1111/319/523 -f 1100/308/524 1099/307/524 1113/321/524 -f 1113/321/525 1099/307/525 1112/320/525 -f 1101/309/526 1100/308/526 1114/322/526 -f 1114/322/527 1100/308/527 1113/321/527 -f 1102/310/528 1101/309/528 1115/323/528 -f 1115/323/529 1101/309/529 1114/322/529 -f 1103/311/530 1102/310/530 1116/324/530 -f 1116/324/531 1102/310/531 1115/323/531 -f 1104/312/532 1103/311/532 1117/325/532 -f 1117/325/533 1103/311/533 1116/324/533 -f 1105/313/534 1104/312/534 1118/326/534 -f 1118/326/535 1104/312/535 1117/325/535 -f 1106/314/536 1105/313/536 1119/327/536 -f 1119/327/537 1105/313/537 1118/326/537 -f 1108/315/538 1107/316/538 1121/328/538 -f 1121/328/539 1107/316/539 1120/329/539 -f 1109/317/540 1108/315/540 1122/330/540 -f 1122/330/541 1108/315/541 1121/328/541 -f 1110/318/542 1109/317/542 1123/331/542 -f 1123/331/543 1109/317/543 1122/330/543 -f 1111/319/544 1110/318/544 1124/332/544 -f 1124/332/545 1110/318/545 1123/331/545 -f 1112/320/546 1111/319/546 1125/333/546 -f 1125/333/547 1111/319/547 1124/332/547 -f 1113/321/548 1112/320/548 1126/334/548 -f 1126/334/549 1112/320/549 1125/333/549 -f 1114/322/550 1113/321/550 1127/335/550 -f 1127/335/551 1113/321/551 1126/334/551 -f 1115/323/552 1114/322/552 1128/336/552 -f 1128/336/553 1114/322/553 1127/335/553 -f 1116/324/554 1115/323/554 1129/337/554 -f 1129/337/555 1115/323/555 1128/336/555 -f 1117/325/556 1116/324/556 1130/338/556 -f 1130/338/557 1116/324/557 1129/337/557 -f 1118/326/558 1117/325/558 1131/339/558 -f 1131/339/559 1117/325/559 1130/338/559 -f 1119/327/560 1118/326/560 1132/340/560 -f 1132/340/561 1118/326/561 1131/339/561 -f 1121/328/562 1120/329/562 1134/341/562 -f 1134/341/563 1120/329/563 1133/342/563 -f 1122/330/564 1121/328/564 1135/343/564 -f 1135/343/565 1121/328/565 1134/341/565 -f 1123/331/566 1122/330/566 1136/344/566 -f 1136/344/567 1122/330/567 1135/343/567 -f 1124/332/568 1123/331/568 1137/345/568 -f 1137/345/569 1123/331/569 1136/344/569 -f 1125/333/570 1124/332/570 1138/346/570 -f 1138/346/571 1124/332/571 1137/345/571 -f 1126/334/572 1125/333/572 1139/347/572 -f 1139/347/573 1125/333/573 1138/346/573 -f 1127/335/574 1126/334/574 1140/348/574 -f 1140/348/575 1126/334/575 1139/347/575 -f 1128/336/576 1127/335/576 1141/349/576 -f 1141/349/577 1127/335/577 1140/348/577 -f 1129/337/578 1128/336/578 1142/350/578 -f 1142/350/579 1128/336/579 1141/349/579 -f 1130/338/580 1129/337/580 1143/351/580 -f 1143/351/581 1129/337/581 1142/350/581 -f 1131/339/582 1130/338/582 1144/352/582 -f 1144/352/583 1130/338/583 1143/351/583 -f 1132/340/584 1131/339/584 1145/353/584 -f 1145/353/585 1131/339/585 1144/352/585 -f 1134/341/586 1133/342/586 1147/354/586 -f 1147/354/587 1133/342/587 1146/355/587 -f 1135/343/588 1134/341/588 1148/356/588 -f 1148/356/589 1134/341/589 1147/354/589 -f 1136/344/590 1135/343/590 1149/357/590 -f 1149/357/591 1135/343/591 1148/356/591 -f 1137/345/592 1136/344/592 1150/358/592 -f 1150/358/593 1136/344/593 1149/357/593 -f 1138/346/594 1137/345/594 1151/359/594 -f 1151/359/595 1137/345/595 1150/358/595 -f 1139/347/596 1138/346/596 1152/360/596 -f 1152/360/597 1138/346/597 1151/359/597 -f 1140/348/598 1139/347/598 1153/361/598 -f 1153/361/599 1139/347/599 1152/360/599 -f 1141/349/600 1140/348/600 1154/362/600 -f 1154/362/601 1140/348/601 1153/361/601 -f 1142/350/602 1141/349/602 1155/363/602 -f 1155/363/603 1141/349/603 1154/362/603 -f 1143/351/604 1142/350/604 1156/364/604 -f 1156/364/605 1142/350/605 1155/363/605 -f 1144/352/606 1143/351/606 1157/365/606 -f 1157/365/607 1143/351/607 1156/364/607 -f 1145/353/608 1144/352/608 1158/366/608 -f 1158/366/609 1144/352/609 1157/365/609 -f 1147/354/610 1146/355/610 1160/367/610 -f 1160/367/611 1146/355/611 1159/368/611 -f 1148/356/612 1147/354/612 1161/369/612 -f 1161/369/613 1147/354/613 1160/367/613 -f 1149/357/614 1148/356/614 1162/370/614 -f 1162/370/615 1148/356/615 1161/369/615 -f 1150/358/616 1149/357/616 1163/371/616 -f 1163/371/617 1149/357/617 1162/370/617 -f 1151/359/618 1150/358/618 1164/372/618 -f 1164/372/619 1150/358/619 1163/371/619 -f 1152/360/620 1151/359/620 1165/373/620 -f 1165/373/621 1151/359/621 1164/372/621 -f 1153/361/622 1152/360/622 1166/374/622 -f 1166/374/623 1152/360/623 1165/373/623 -f 1154/362/624 1153/361/624 1167/375/624 -f 1167/375/625 1153/361/625 1166/374/625 -f 1155/363/626 1154/362/626 1168/376/626 -f 1168/376/627 1154/362/627 1167/375/627 -f 1156/364/628 1155/363/628 1169/377/628 -f 1169/377/629 1155/363/629 1168/376/629 -f 1157/365/630 1156/364/630 1170/378/630 -f 1170/378/631 1156/364/631 1169/377/631 -f 1450/379/632 1451/380/632 1171/381/632 -f 1171/381/633 1452/380/633 1453/382/633 -f 1160/367/634 1159/368/634 1173/383/634 -f 1454/384/635 1455/385/635 1172/386/635 -f 1456/387/636 1457/388/636 1174/389/636 -f 1174/389/637 1458/388/637 1459/384/637 -f 1460/390/638 1461/387/638 1175/391/638 -f 1175/391/639 1462/387/639 1174/389/639 -f 1463/392/640 1464/390/640 1176/393/640 -f 1176/393/641 1465/390/641 1175/391/641 -f 1466/394/642 1467/392/642 1177/395/642 -f 1177/395/643 1468/392/643 1176/393/643 -f 1469/396/644 1470/394/644 1178/397/644 -f 1178/397/645 1471/394/645 1177/395/645 -f 1472/398/646 1473/396/646 1179/399/646 -f 1179/399/647 1474/396/647 1178/397/647 -f 1475/400/648 1476/398/648 1180/401/648 -f 1180/401/649 1477/398/649 1179/399/649 -f 1478/402/650 1479/400/650 1181/403/650 -f 1181/403/651 1480/400/651 1180/401/651 -f 1481/404/652 1482/402/652 1182/405/652 -f 1182/405/653 1483/402/653 1181/403/653 -f 1484/382/654 1485/404/654 1183/406/654 -f 1183/406/655 1486/404/655 1182/405/655 -f 1171/381/656 1487/382/656 1184/407/656 -f 1184/407/657 1488/382/657 1183/406/657 -f 1489/384/658 1172/386/658 1186/408/658 -f 1186/408/659 1172/386/659 1185/409/659 -f 1174/389/660 1490/384/660 1187/410/660 -f 1187/410/661 1491/384/661 1186/408/661 -f 1175/391/662 1174/389/662 1188/411/662 -f 1188/411/663 1174/389/663 1187/410/663 -f 1176/393/664 1175/391/664 1189/412/664 -f 1189/412/665 1175/391/665 1188/411/665 -f 1177/395/666 1176/393/666 1190/413/666 -f 1190/413/667 1176/393/667 1189/412/667 -f 1178/397/668 1177/395/668 1191/414/668 -f 1191/414/669 1177/395/669 1190/413/669 -f 1179/399/670 1178/397/670 1192/415/670 -f 1192/415/671 1178/397/671 1191/414/671 -f 1180/401/672 1179/399/672 1193/416/672 -f 1193/416/673 1179/399/673 1192/415/673 -f 1181/403/674 1180/401/674 1194/417/674 -f 1194/417/675 1180/401/675 1193/416/675 -f 1182/405/676 1181/403/676 1195/418/676 -f 1195/418/677 1181/403/677 1194/417/677 -f 1183/406/678 1182/405/678 1196/419/678 -f 1196/419/679 1182/405/679 1195/418/679 -f 1184/407/680 1183/406/680 1197/420/680 -f 1197/420/681 1183/406/681 1196/419/681 -f 1186/408/682 1185/409/682 1199/421/682 -f 1199/421/683 1185/409/683 1198/422/683 -f 1187/410/684 1186/408/684 1200/423/684 -f 1200/423/685 1186/408/685 1199/421/685 -f 1188/411/686 1187/410/686 1201/424/686 -f 1201/424/687 1187/410/687 1200/423/687 -f 1189/412/688 1188/411/688 1202/425/688 -f 1202/425/689 1188/411/689 1201/424/689 -f 1190/413/690 1189/412/690 1203/426/690 -f 1203/426/691 1189/412/691 1202/425/691 -f 1191/414/692 1190/413/692 1204/427/692 -f 1204/427/693 1190/413/693 1203/426/693 -f 1192/415/694 1191/414/694 1205/428/694 -f 1205/428/695 1191/414/695 1204/427/695 -f 1193/416/696 1192/415/696 1206/429/696 -f 1206/429/697 1192/415/697 1205/428/697 -f 1194/417/698 1193/416/698 1207/430/698 -f 1207/430/699 1193/416/699 1206/429/699 -f 1195/418/700 1194/417/700 1208/431/700 -f 1208/431/701 1194/417/701 1207/430/701 -f 1196/419/702 1195/418/702 1209/432/702 -f 1209/432/703 1195/418/703 1208/431/703 -f 1197/420/704 1196/419/704 1210/433/704 -f 1210/433/705 1196/419/705 1209/432/705 -f 1199/421/706 1198/422/706 1212/434/706 -f 1212/434/707 1198/422/707 1211/435/707 -f 1200/423/708 1199/421/708 1213/436/708 -f 1213/436/709 1199/421/709 1212/434/709 -f 1201/424/710 1200/423/710 1214/437/710 -f 1214/437/711 1200/423/711 1213/436/711 -f 1202/425/712 1201/424/712 1215/438/712 -f 1215/438/713 1201/424/713 1214/437/713 -f 1203/426/714 1202/425/714 1216/439/714 -f 1216/439/715 1202/425/715 1215/438/715 -f 1204/427/716 1203/426/716 1217/440/716 -f 1217/440/717 1203/426/717 1216/439/717 -f 1205/428/718 1204/427/718 1218/441/718 -f 1218/441/719 1204/427/719 1217/440/719 -f 1206/429/720 1205/428/720 1219/442/720 -f 1219/442/721 1205/428/721 1218/441/721 -f 1207/430/722 1206/429/722 1220/443/722 -f 1220/443/723 1206/429/723 1219/442/723 -f 1208/431/724 1207/430/724 1221/444/724 -f 1221/444/725 1207/430/725 1220/443/725 -f 1209/432/726 1208/431/726 1222/445/726 -f 1222/445/727 1208/431/727 1221/444/727 -f 1210/433/728 1209/432/728 1223/446/728 -f 1223/446/729 1209/432/729 1222/445/729 -f 1212/434/730 1211/435/730 1017/224/730 -f 1016/225/731 1017/224/731 1211/435/731 -f 1213/436/732 1212/434/732 1018/228/732 -f 1018/228/733 1212/434/733 1017/224/733 -f 1214/437/734 1213/436/734 1019/230/734 -f 1019/230/735 1213/436/735 1018/228/735 -f 1215/438/736 1214/437/736 1020/232/736 -f 1020/232/737 1214/437/737 1019/230/737 -f 1216/439/738 1215/438/738 1021/234/738 -f 1021/234/739 1215/438/739 1020/232/739 -f 1217/440/740 1216/439/740 1022/236/740 -f 1022/236/741 1216/439/741 1021/234/741 -f 1218/441/742 1217/440/742 1023/238/742 -f 1023/238/743 1217/440/743 1022/236/743 -f 1219/442/744 1218/441/744 1024/240/744 -f 1024/240/745 1218/441/745 1023/238/745 -f 1220/443/746 1219/442/746 1025/242/746 -f 1025/242/747 1219/442/747 1024/240/747 -f 1221/444/748 1220/443/748 1026/244/748 -f 1026/244/749 1220/443/749 1025/242/749 -f 1222/445/750 1221/444/750 1027/246/750 -f 1027/246/751 1221/444/751 1026/244/751 -f 1223/446/752 1222/445/752 1028/248/752 -f 1028/248/753 1222/445/753 1027/246/753 -f 1232/447/331 1233/448/331 1234/449/331 -f 1234/449/331 1233/448/331 1235/450/331 -f 1236/451/331 1232/447/331 1234/449/331 -f 1232/447/331 1236/451/331 1237/452/331 -f 1237/452/754 1236/451/754 1238/451/754 -f 1239/453/331 1237/452/331 1238/451/331 -f 1237/452/331 1239/453/331 1240/454/331 -f 1240/454/754 1239/453/754 1241/453/754 -f 1240/454/331 1241/453/331 1242/455/331 -f 1243/455/754 1240/454/754 1242/455/754 -f 1240/454/331 1243/455/331 1244/456/331 -f 1245/457/331 1244/456/331 1243/455/331 -f 1244/456/331 1245/457/331 1246/458/331 -f 1246/458/331 1245/457/331 1247/459/331 -f 1248/459/754 1246/458/754 1247/459/754 -f 1246/458/331 1248/459/331 1249/460/331 -f 1250/461/331 1249/460/331 1248/459/331 -f 1249/460/331 1250/461/331 1251/462/331 -f 1252/463/331 1251/462/331 1250/461/331 -f 1251/462/331 1252/463/331 1253/464/331 -f 1254/465/331 1253/464/331 1252/463/331 -f 1253/464/331 1254/465/331 1255/466/331 -f 1255/466/754 1254/465/754 1256/465/754 -f 1257/467/331 1255/466/331 1256/465/331 -f 1255/466/331 1257/467/331 1258/468/331 -f 1258/468/754 1257/467/754 1259/467/754 -f 1258/468/331 1259/467/331 1260/469/331 -f 1261/469/754 1258/468/754 1260/469/754 -f 1258/468/331 1261/469/331 1262/470/331 -f 1262/470/331 1261/469/331 1263/471/331 -f 1264/471/754 1262/470/754 1263/471/754 -f 1262/470/331 1264/471/331 1265/472/331 -f 1266/473/331 1265/472/331 1264/471/331 -f 1265/472/331 1266/473/331 1267/474/331 -f 1267/474/754 1266/473/754 1268/473/754 -f 1269/475/331 1267/474/331 1268/473/331 -f 1267/474/331 1269/475/331 1270/476/331 -f 1270/476/754 1269/475/754 1271/475/754 -f 1272/477/331 1270/476/331 1271/475/331 -f 1270/476/331 1272/477/331 1273/478/331 -f 1273/478/754 1272/477/754 1274/477/754 -f 1275/479/331 1273/478/331 1274/477/331 -f 1273/478/331 1275/479/331 1276/480/331 -f 1276/480/754 1275/479/754 1277/479/754 -f 1276/480/331 1277/479/331 1278/481/331 -f 1279/481/754 1276/480/754 1278/481/754 -f 1276/480/331 1279/481/331 1280/482/331 -f 1280/482/331 1279/481/331 1281/483/331 -f 1282/483/754 1280/482/754 1281/483/754 -f 1280/482/331 1282/483/331 1283/484/331 -f 1284/485/331 1283/484/331 1282/483/331 -f 1283/484/331 1284/485/331 1285/486/331 -f 1286/487/331 1285/486/331 1284/485/331 -f 1285/486/331 1286/487/331 1287/488/331 -f 1287/488/754 1286/487/754 1288/487/754 -f 1287/488/331 1288/487/331 1289/489/331 -f 1290/489/754 1287/488/754 1289/489/754 -f 1287/488/331 1290/489/331 1291/490/331 -f 1291/490/331 1290/489/331 1292/491/331 -f 1293/491/754 1291/490/754 1292/491/754 -f 1291/490/331 1293/491/331 1294/492/331 -f 1294/492/331 1293/491/331 1295/493/331 -f 1296/493/754 1294/492/754 1295/493/754 -f 1294/492/331 1296/493/331 1235/450/331 -f 1235/450/331 1296/493/331 1297/494/331 -f 1235/450/331 1297/494/331 1234/449/331 -f 1298/495/331 1301/496/331 1300/497/331 -f 1298/495/331 1302/498/331 1301/496/331 -f 1298/495/331 1303/499/331 1302/498/331 -f 1298/495/331 1304/500/331 1303/499/331 -f 1298/495/331 1305/501/331 1304/500/331 -f 1298/495/331 1306/502/331 1305/501/331 -f 1298/495/331 1307/503/331 1306/502/331 -f 1298/495/331 1308/504/331 1307/503/331 -f 1298/495/331 1309/505/331 1308/504/331 -f 1298/495/331 1310/506/331 1309/505/331 -f 1298/495/331 1311/507/331 1310/506/331 -f 1298/495/331 1312/508/331 1311/507/331 -f 1298/495/331 1313/509/331 1312/508/331 -f 1298/495/331 1314/510/331 1313/509/331 -f 1298/495/331 1315/511/331 1314/510/331 -f 1298/495/331 1316/512/331 1315/511/331 -f 1298/495/331 1317/513/331 1316/512/331 -f 1298/495/331 1318/514/331 1317/513/331 -f 1298/495/331 1319/515/331 1318/514/331 -f 1298/495/331 1320/516/331 1319/515/331 -f 1298/495/331 1321/517/331 1320/516/331 -f 1298/495/331 1299/518/331 1321/517/331 -f 1234/449/755 1299/518/755 1298/495/755 -f 1234/449/756 1298/495/756 1236/451/756 -f 1298/495/754 1238/451/754 1236/451/754 -f 1238/451/757 1298/495/757 1300/497/757 -f 1238/451/757 1300/497/757 1239/453/757 -f 1300/497/754 1241/453/754 1239/453/754 -f 1241/453/758 1300/497/758 1301/496/758 -f 1301/496/758 1242/455/758 1241/453/758 -f 1242/455/754 1301/496/754 1243/455/754 -f 1243/455/759 1301/496/759 1302/498/759 -f 1302/498/760 1245/457/760 1243/455/760 -f 1245/457/761 1302/498/761 1303/499/761 -f 1303/499/762 1247/459/762 1245/457/762 -f 1247/459/754 1303/499/754 1248/459/754 -f 1248/459/763 1303/499/763 1304/500/763 -f 1304/500/763 1250/461/763 1248/459/763 -f 1250/461/764 1304/500/764 1305/501/764 -f 1305/501/764 1252/463/764 1250/461/764 -f 1252/463/765 1305/501/765 1306/502/765 -f 1252/463/765 1306/502/765 1254/465/765 -f 1306/502/754 1256/465/754 1254/465/754 -f 1256/465/766 1306/502/766 1307/503/766 -f 1256/465/766 1307/503/766 1257/467/766 -f 1307/503/754 1259/467/754 1257/467/754 -f 1259/467/767 1307/503/767 1308/504/767 -f 1308/504/767 1260/469/767 1259/467/767 -f 1260/469/754 1308/504/754 1261/469/754 -f 1261/469/768 1308/504/768 1309/505/768 -f 1309/505/768 1263/471/768 1261/469/768 -f 1263/471/754 1309/505/754 1264/471/754 -f 1264/471/769 1309/505/769 1310/506/769 -f 1264/471/769 1310/506/769 1266/473/769 -f 1310/506/754 1268/473/754 1266/473/754 -f 1268/473/770 1310/506/770 1311/507/770 -f 1268/473/770 1311/507/770 1269/475/770 -f 1311/507/754 1271/475/754 1269/475/754 -f 1271/475/771 1311/507/771 1312/508/771 -f 1271/475/771 1312/508/771 1272/477/771 -f 1312/508/754 1274/477/754 1272/477/754 -f 1274/477/772 1312/508/772 1313/509/772 -f 1274/477/772 1313/509/772 1275/479/772 -f 1313/509/754 1277/479/754 1275/479/754 -f 1277/479/773 1313/509/773 1314/510/773 -f 1314/510/773 1278/481/773 1277/479/773 -f 1278/481/754 1314/510/754 1279/481/754 -f 1279/481/774 1314/510/774 1315/511/774 -f 1315/511/774 1281/483/774 1279/481/774 -f 1281/483/754 1315/511/754 1282/483/754 -f 1282/483/775 1315/511/775 1316/512/775 -f 1316/512/775 1284/485/775 1282/483/775 -f 1284/485/776 1316/512/776 1317/513/776 -f 1284/485/776 1317/513/776 1286/487/776 -f 1317/513/754 1288/487/754 1286/487/754 -f 1288/487/777 1317/513/777 1318/514/777 -f 1318/514/777 1289/489/777 1288/487/777 -f 1289/489/754 1318/514/754 1290/489/754 -f 1290/489/778 1318/514/778 1319/515/778 -f 1319/515/778 1292/491/778 1290/489/778 -f 1292/491/754 1319/515/754 1293/491/754 -f 1293/491/779 1319/515/779 1320/516/779 -f 1320/516/779 1295/493/779 1293/491/779 -f 1295/493/754 1320/516/754 1296/493/754 -f 1296/493/780 1320/516/780 1321/517/780 -f 1321/517/780 1297/494/780 1296/493/780 -f 1299/518/781 1234/449/781 1321/517/781 -f 1297/494/782 1321/517/782 1234/449/782 -f 1240/454/783 1244/456/783 1322/519/783 -f 1253/464/784 1255/466/784 1323/520/784 -f 1244/456/785 1324/521/785 1322/519/785 -f 1324/521/786 1244/456/786 1246/458/786 -f 1246/458/786 1325/522/786 1324/521/786 -f 1325/522/787 1246/458/787 1249/460/787 -f 1249/460/787 1326/523/787 1325/522/787 -f 1326/523/788 1249/460/788 1251/462/788 -f 1251/462/788 1327/524/788 1326/523/788 -f 1327/524/789 1251/462/789 1253/464/789 -f 1253/464/789 1328/525/789 1327/524/789 -f 1328/525/790 1253/464/790 1323/520/790 -f 1329/526/791 1330/527/791 1331/528/791 -f 1330/527/792 1329/526/792 1322/519/792 -f 1331/528/793 1330/527/793 1322/519/793 -f 1332/529/794 1333/530/794 1334/531/794 -f 1333/530/795 1332/529/795 1323/520/795 -f 1322/519/796 1335/532/796 1331/528/796 -f 1335/532/797 1322/519/797 1324/521/797 -f 1334/531/798 1333/530/798 1323/520/798 -f 1334/531/799 1323/520/799 1255/466/799 -f 1336/533/800 1323/520/800 1332/529/800 -f 1323/520/801 1336/533/801 1328/525/801 -f 1337/534/802 1322/519/802 1329/526/802 -f 1324/521/803 1338/535/803 1335/532/803 -f 1338/535/804 1324/521/804 1325/522/804 -f 1325/522/805 1339/536/805 1492/537/805 -f 1339/536/806 1325/522/806 1326/523/806 -f 1326/523/807 1340/538/807 1339/536/807 -f 1340/538/808 1326/523/808 1327/524/808 -f 1327/524/809 1341/539/809 1340/538/809 -f 1341/539/810 1327/524/810 1328/525/810 -f 1328/525/811 1342/540/811 1341/539/811 -f 1342/540/812 1328/525/812 1336/533/812 -f 1233/448/813 1343/541/813 1235/450/813 -f 1343/541/814 1233/448/814 1232/447/814 -f 1343/541/815 1232/447/815 1237/452/815 -f 1237/452/815 1344/542/815 1343/541/815 -f 1344/542/816 1237/452/816 1240/454/816 -f 1240/454/816 1345/543/816 1344/542/816 -f 1345/543/817 1240/454/817 1322/519/817 -f 1334/531/818 1255/466/818 1258/468/818 -f 1346/544/819 1334/531/819 1258/468/819 -f 1346/544/820 1258/468/820 1262/470/820 -f 1346/544/821 1262/470/821 1265/472/821 -f 1265/472/822 1347/545/822 1346/544/822 -f 1348/546/823 1347/545/823 1265/472/823 -f 1348/546/823 1265/472/823 1267/474/823 -f 1348/546/824 1267/474/824 1270/476/824 -f 1270/476/825 1349/547/825 1348/546/825 -f 1349/547/826 1270/476/826 1273/478/826 -f 1273/478/827 1350/548/827 1349/547/827 -f 1351/549/828 1350/548/828 1273/478/828 -f 1351/549/829 1273/478/829 1276/480/829 -f 1351/549/830 1276/480/830 1280/482/830 -f 1280/482/830 1352/550/830 1351/549/830 -f 1352/550/831 1280/482/831 1283/484/831 -f 1283/484/831 1353/551/831 1352/550/831 -f 1353/551/832 1283/484/832 1285/486/832 -f 1285/486/832 1354/552/832 1353/551/832 -f 1354/552/833 1285/486/833 1287/488/833 -f 1287/488/834 1355/553/834 1354/552/834 -f 1355/553/835 1287/488/835 1291/490/835 -f 1291/490/836 1356/554/836 1355/553/836 -f 1356/554/837 1291/490/837 1294/492/837 -f 1294/492/838 1357/555/838 1356/554/838 -f 1357/555/839 1294/492/839 1235/450/839 -f 1235/450/839 1358/556/839 1357/555/839 -f 1358/556/840 1235/450/840 1343/541/840 -f 1337/534/841 1345/543/841 1322/519/841 -f 1359/557/842 1360/558/842 1361/559/842 -f 1362/560/842 1360/558/842 1359/557/842 -f 1360/558/843 1362/560/843 1363/561/843 -f 1364/562/843 1363/561/843 1362/560/843 -f 1363/561/844 1364/562/844 1365/563/844 -f 1366/564/844 1365/563/844 1364/562/844 -f 1366/564/754 1365/563/754 1367/564/754 -f 1365/563/845 1366/564/845 1368/565/845 -f 1368/565/845 1366/564/845 1369/566/845 -f 1370/566/754 1368/565/754 1369/566/754 -f 1371/567/846 1368/565/846 1369/566/846 -f 1368/565/847 1371/567/847 1372/568/847 -f 1372/568/848 1371/567/848 1373/569/848 -f 1374/569/754 1372/568/754 1373/569/754 -f 1372/568/849 1374/569/849 1375/570/849 -f 1375/570/849 1374/569/849 1376/571/849 -f 1493/572/850 1494/573/850 1377/574/850 -f 1378/575/850 1377/574/850 1495/573/850 -f 1377/574/851 1378/575/851 1379/576/851 -f 1380/577/852 1379/576/852 1378/575/852 -f 1379/576/754 1380/577/754 1381/577/754 -f 1379/576/853 1380/577/853 1382/578/853 -f 1382/578/854 1380/577/854 1383/579/854 -f 1384/579/754 1382/578/754 1383/579/754 -f 1382/578/855 1384/579/855 1385/580/855 -f 1385/580/855 1384/579/855 1386/581/855 -f 1385/580/856 1386/581/856 1387/582/856 -f 1388/583/856 1387/582/856 1386/581/856 -f 1387/582/857 1388/583/857 1389/584/857 -f 1389/584/754 1388/583/754 1390/583/754 -f 1391/585/858 1389/584/858 1390/583/858 -f 1389/584/859 1391/585/859 1392/586/859 -f 1392/586/860 1391/585/860 1393/587/860 -f 1394/587/754 1392/586/754 1393/587/754 -f 1392/586/861 1394/587/861 1361/559/861 -f 1359/557/861 1361/559/861 1394/587/861 -f 1395/588/331 1396/589/331 1359/557/331 -f 1396/589/331 1362/560/331 1359/557/331 -f 1362/560/331 1396/589/331 1397/590/331 -f 1397/590/331 1364/562/331 1362/560/331 -f 1364/562/331 1397/590/331 1398/591/331 -f 1364/562/331 1398/591/331 1366/564/331 -f 1398/591/754 1366/564/754 1367/564/754 -f 1366/564/862 1398/591/862 1399/592/862 -f 1399/592/863 1369/566/863 1366/564/863 -f 1399/592/754 1369/566/754 1370/566/754 -f 1369/566/331 1399/592/331 1400/593/331 -f 1369/566/331 1400/593/331 1371/567/331 -f 1400/593/864 1373/569/864 1371/567/864 -f 1373/569/865 1400/593/865 1401/594/865 -f 1373/569/754 1401/594/754 1374/569/754 -f 1401/594/331 1376/571/331 1374/569/331 -f 1496/573/331 1497/595/331 1402/596/331 -f 1402/596/331 1378/575/331 1498/573/331 -f 1378/575/866 1402/596/866 1403/597/866 -f 1378/575/867 1403/597/867 1380/577/867 -f 1381/577/754 1403/597/754 1380/577/754 -f 1380/577/331 1403/597/331 1404/598/331 -f 1404/598/331 1383/579/331 1380/577/331 -f 1383/579/331 1404/598/331 1405/599/331 -f 1383/579/754 1405/599/754 1384/579/754 -f 1405/599/331 1386/581/331 1384/579/331 -f 1386/581/868 1405/599/868 1406/600/868 -f 1386/581/869 1406/600/869 1388/583/869 -f 1406/600/754 1390/583/754 1388/583/754 -f 1390/583/870 1406/600/870 1407/601/870 -f 1390/583/871 1407/601/871 1391/585/871 -f 1391/585/872 1407/601/872 1408/602/872 -f 1391/585/331 1408/602/331 1409/603/331 -f 1409/603/331 1393/587/331 1391/585/331 -f 1393/587/331 1409/603/331 1395/588/331 -f 1393/587/754 1395/588/754 1394/587/754 -f 1395/588/331 1359/557/331 1394/587/331 -f 1368/565/331 1372/568/331 1499/604/331 -f 1500/604/331 1372/568/331 1375/570/331 -f 1331/528/873 1501/572/873 1377/574/873 -f 1331/528/874 1377/574/874 1379/576/874 -f 1331/528/875 1379/576/875 1382/578/875 -f 1331/528/876 1382/578/876 1385/580/876 -f 1360/558/877 1334/531/877 1361/559/877 -f 1334/531/878 1360/558/878 1363/561/878 -f 1334/531/879 1363/561/879 1365/563/879 -f 1334/531/880 1365/563/880 1368/565/880 -f 1334/531/881 1392/586/881 1361/559/881 -f 1334/531/882 1368/565/882 1332/529/882 -f 1502/604/331 1503/605/331 1368/565/331 -f 1336/533/331 1332/529/331 1368/565/331 -f 1368/565/331 1504/605/331 1505/537/331 -f 1368/565/331 1506/537/331 1339/536/331 -f 1368/565/331 1339/536/331 1340/538/331 -f 1368/565/331 1340/538/331 1341/539/331 -f 1336/533/331 1368/565/331 1342/540/331 -f 1368/565/331 1341/539/331 1342/540/331 -f 1331/528/883 1344/542/883 1345/543/883 -f 1346/544/884 1392/586/884 1334/531/884 -f 1392/586/331 1346/544/331 1347/545/331 -f 1348/546/331 1392/586/331 1347/545/331 -f 1392/586/331 1348/546/331 1349/547/331 -f 1389/584/331 1392/586/331 1350/548/331 -f 1392/586/331 1349/547/331 1350/548/331 -f 1351/549/331 1389/584/331 1350/548/331 -f 1387/582/331 1389/584/331 1352/550/331 -f 1389/584/331 1351/549/331 1352/550/331 -f 1387/582/331 1352/550/331 1353/551/331 -f 1387/582/331 1353/551/331 1354/552/331 -f 1385/580/331 1387/582/331 1354/552/331 -f 1385/580/331 1354/552/331 1355/553/331 -f 1385/580/331 1355/553/331 1356/554/331 -f 1385/580/331 1356/554/331 1357/555/331 -f 1385/580/331 1357/555/331 1358/556/331 -f 1331/528/885 1345/543/885 1329/526/885 -f 1337/534/331 1329/526/331 1345/543/331 -f 1410/606/886 1396/589/886 1395/588/886 -f 1411/607/887 1396/589/887 1410/606/887 -f 1396/589/888 1411/607/888 1397/590/888 -f 1412/608/888 1397/590/888 1411/607/888 -f 1397/590/889 1412/608/889 1398/591/889 -f 1413/609/889 1398/591/889 1412/608/889 -f 1398/591/890 1413/609/890 1399/592/890 -f 1414/610/890 1399/592/890 1413/609/890 -f 1399/592/891 1414/610/891 1400/593/891 -f 1415/611/891 1400/593/891 1414/610/891 -f 1400/593/892 1415/611/892 1401/594/892 -f 1416/612/892 1401/594/892 1415/611/892 -f 1507/595/893 1508/613/893 1402/596/893 -f 1417/614/893 1402/596/893 1509/613/893 -f 1402/596/894 1417/614/894 1403/597/894 -f 1418/615/895 1403/597/895 1417/614/895 -f 1403/597/896 1418/615/896 1404/598/896 -f 1419/616/897 1404/598/897 1418/615/897 -f 1404/598/898 1419/616/898 1405/599/898 -f 1420/617/899 1405/599/899 1419/616/899 -f 1405/599/900 1420/617/900 1406/600/900 -f 1421/618/901 1406/600/901 1420/617/901 -f 1406/600/902 1421/618/902 1407/601/902 -f 1422/619/902 1407/601/902 1421/618/902 -f 1407/601/903 1422/619/903 1408/602/903 -f 1423/620/903 1408/602/903 1422/619/903 -f 1408/602/904 1423/620/904 1409/603/904 -f 1424/621/904 1409/603/904 1423/620/904 -f 1409/603/905 1424/621/905 1395/588/905 -f 1410/606/906 1395/588/906 1424/621/906 -f 1425/622/331 1426/623/331 1410/606/331 -f 1410/606/331 1426/623/331 1411/607/331 -f 1426/623/331 1427/624/331 1411/607/331 -f 1411/607/331 1427/624/331 1412/608/331 -f 1412/608/907 1427/624/907 1428/625/907 -f 1412/608/908 1428/625/908 1429/626/908 -f 1412/608/909 1429/626/909 1413/609/909 -f 1413/609/331 1429/626/331 1430/627/331 -f 1413/609/331 1430/627/331 1431/628/331 -f 1413/609/331 1431/628/331 1414/610/331 -f 1414/610/331 1433/629/331 1415/611/331 -f 1415/611/331 1433/629/331 1434/630/331 -f 1415/611/331 1434/630/331 1416/612/331 -f 1510/613/910 1511/631/910 1435/632/910 -f 1512/613/911 1435/632/911 1417/614/911 -f 1419/616/331 1436/633/331 1420/617/331 -f 1420/617/331 1436/633/331 1437/634/331 -f 1420/617/331 1437/634/331 1421/618/331 -f 1421/618/331 1437/634/331 1422/619/331 -f 1422/619/331 1437/634/331 1425/622/331 -f 1422/619/331 1425/622/331 1423/620/331 -f 1423/620/331 1425/622/331 1424/621/331 -f 1424/621/331 1425/622/331 1410/606/331 -f 1427/624/912 1426/623/912 1438/635/912 -f 1439/636/913 1427/624/913 1438/635/913 -f 1427/624/914 1439/636/914 1428/625/914 -f 1428/625/915 1439/636/915 1429/626/915 -f 1440/637/888 1429/626/888 1439/636/888 -f 1429/626/916 1440/637/916 1430/627/916 -f 1441/638/916 1430/627/916 1440/637/916 -f 1430/627/917 1441/638/917 1431/628/917 -f 1442/639/917 1431/628/917 1441/638/917 -f 1431/628/918 1442/639/918 1432/640/918 -f 1443/641/918 1432/640/918 1442/639/918 -f 1432/640/919 1443/641/919 1433/629/919 -f 1444/642/919 1433/629/919 1443/641/919 -f 1433/629/920 1444/642/920 1434/630/920 -f 1445/643/920 1434/630/920 1444/642/920 -f 1513/631/921 1514/644/921 1435/632/921 -f 1446/645/921 1435/632/921 1515/644/921 -f 1435/632/922 1446/645/922 1436/633/922 -f 1447/646/923 1436/633/923 1446/645/923 -f 1436/633/924 1447/646/924 1437/634/924 -f 1448/647/925 1437/634/925 1447/646/925 -f 1437/634/926 1448/647/926 1425/622/926 -f 1449/648/927 1425/622/927 1448/647/927 -f 1425/622/928 1449/648/928 1426/623/928 -f 1438/635/928 1426/623/928 1449/648/928 -f 1414/610/331 1224/649/331 1225/650/331 -f 1224/649/331 1414/610/331 1226/651/331 -f 1414/610/331 1431/628/331 1227/652/331 -f 1226/651/331 1414/610/331 1227/652/331 -f 1431/628/331 1432/640/331 1228/653/331 -f 1227/652/331 1431/628/331 1228/653/331 -f 1228/653/331 1432/640/331 1229/654/331 -f 1229/654/331 1432/640/331 1230/655/331 -f 1432/640/331 1231/656/331 1230/655/331 -f 1231/656/331 1414/610/331 1225/650/331 -f 1436/633/331 1419/616/331 1418/615/331 -f 1418/615/331 1435/632/331 1436/633/331 -f 1418/615/331 1417/614/331 1435/632/331 -f 1385/580/331 1358/556/331 1343/541/331 -f 1385/580/929 1343/541/929 1331/528/929 -f 1343/541/930 1344/542/930 1331/528/930 -f 1231/656/331 1432/640/331 1433/629/331 -f 1414/610/331 1231/656/331 1433/629/331 -o dieshor -v -1.482136 1.397097 -0.344602 -v -1.268468 1.397097 -0.348865 -v -1.377330 1.287280 -0.182361 -v -1.377302 1.287301 -0.514561 -v -1.307080 1.274552 -0.499110 -v -1.251737 1.263808 -0.457401 -v -1.266445 1.265872 -0.219972 -v -1.329126 1.279007 -0.189400 -v -1.212771 1.255278 -0.372987 -v -1.237752 1.261046 -0.258050 -v -1.218007 1.256350 -0.300520 -v -1.527717 1.257843 -0.278473 -v -1.543168 1.254950 -0.348461 -v -1.536129 1.256586 -0.396403 -v -1.486009 1.266493 -0.473792 -v -1.425010 1.278087 -0.507522 -v -1.502398 1.263358 -0.239521 -v -1.425010 1.278135 -0.189400 -v -1.467476 1.270451 -0.209142 -v -1.377093 1.396732 -0.114997 -v -1.444477 1.396732 -0.124891 -v -1.504165 1.396732 -0.152639 -v -1.553253 1.396732 -0.195339 -v -1.588838 1.396732 -0.250089 -v -1.608022 1.396732 -0.313988 -v -1.608022 1.396732 -0.382934 -v -1.588838 1.396732 -0.446833 -v -1.553252 1.396733 -0.501583 -v -1.504165 1.396733 -0.544283 -v -1.444478 1.396732 -0.572031 -v -1.377092 1.396732 -0.581925 -v -1.309708 1.396732 -0.572031 -v -1.250021 1.396732 -0.544283 -v -1.200933 1.396732 -0.501583 -v -1.153523 1.396732 -0.415846 -v -1.143628 1.396732 -0.348461 -v -1.165346 1.396732 -0.250089 -v -1.200933 1.396732 -0.195339 -v -1.250021 1.396732 -0.152639 -v -1.309707 1.396732 -0.124892 -v -1.608081 1.339568 -0.313976 -v -1.588891 1.339568 -0.250053 -v -1.588891 1.339568 -0.446869 -v -1.553292 1.339568 -0.501639 -v -1.504186 1.339569 -0.544354 -v -1.444478 1.339568 -0.572112 -v -1.377068 1.339568 -0.582010 -v -1.309659 1.339568 -0.572112 -v -1.553291 1.339568 -0.195284 -v -1.504186 1.339568 -0.152569 -v -1.444478 1.339568 -0.124811 -v -1.377068 1.339568 -0.114913 -v -1.309659 1.339567 -0.124811 -v -1.249950 1.339567 -0.152568 -v -1.200845 1.339567 -0.195284 -v -1.249951 1.339568 -0.544354 -v -1.200845 1.339568 -0.501639 -v -1.153417 1.339568 -0.415871 -v -1.143520 1.339568 -0.348461 -v -1.165245 1.339567 -0.250054 -v -1.329126 1.339079 -0.507522 -v -1.401595 1.339079 -0.512759 -v -1.467475 1.339079 -0.487781 -v -1.502398 1.339079 -0.457401 -v -1.536129 1.339079 -0.396403 -v -1.543168 1.339079 -0.348461 -v -1.608081 1.339568 -0.382947 -v -1.536129 1.339079 -0.300520 -v -1.516387 1.339201 -0.258054 -v -1.486008 1.339201 -0.223131 -v -1.447056 1.339078 -0.197812 -v -1.401595 1.339078 -0.184164 -v -1.352542 1.339078 -0.184164 -v -1.307081 1.339078 -0.197812 -v -1.268128 1.339201 -0.223130 -v -1.226419 1.339078 -0.278474 -v -1.212771 1.339078 -0.372988 -v -1.226419 1.339079 -0.418449 -v -1.268128 1.339079 -0.473792 -v -1.376981 0.714835 -2.824126 -v -1.376981 0.433713 -2.804203 -v -1.376652 0.153096 -2.727210 -v -1.376653 0.144811 -2.193231 -v -1.376653 0.142467 -2.189049 -v -1.376653 0.144809 -2.183706 -v -1.376653 0.144746 -1.660390 -v -1.376653 0.142402 -1.655317 -v -1.376653 0.144745 -1.651051 -v -1.376653 0.149512 -1.125773 -v -1.376653 0.147219 -1.120172 -v -1.376653 0.149607 -1.115223 -v -1.376654 0.144714 -0.591684 -v -1.376654 0.142433 -0.586591 -v -1.376654 0.144837 -0.581587 -v -1.376655 0.151465 -0.039513 -v -1.376363 0.469851 0.037392 -v -1.376983 0.714836 0.045669 -v -1.484562 0.455112 -2.804203 -v -1.591646 0.195730 -2.727210 -v -1.594817 0.188075 -2.193231 -v -1.595713 0.185910 -2.189049 -v -1.594817 0.188074 -2.183705 -v -1.594842 0.188016 -1.660390 -v -1.595739 0.185850 -1.655317 -v -1.594842 0.188015 -1.651051 -v -1.593019 0.192419 -1.125772 -v -1.593896 0.190300 -1.120171 -v -1.592982 0.192507 -1.115223 -v -1.594855 0.187986 -0.591684 -v -1.595728 0.185879 -0.586591 -v -1.594808 0.188100 -0.581587 -v -1.592273 0.194223 -0.039513 -v -1.470162 0.488262 0.037392 -v -1.575764 0.516052 -2.804202 -v -1.773958 0.317393 -2.727210 -v -1.779817 0.311535 -2.193230 -v -1.781475 0.309877 -2.189049 -v -1.779818 0.311534 -2.183705 -v -1.779863 0.311489 -1.660389 -v -1.781521 0.309832 -1.655317 -v -1.779865 0.311488 -1.651051 -v -1.776494 0.314859 -1.125772 -v -1.778116 0.313238 -1.120171 -v -1.776426 0.314927 -1.115222 -v -1.779888 0.311467 -0.591683 -v -1.781501 0.309854 -0.586590 -v -1.779800 0.311554 -0.581587 -v -1.775114 0.316240 -0.039512 -v -1.549775 0.541167 0.037393 -v -1.636703 0.607255 -2.804203 -v -1.895834 0.499563 -2.727209 -v -1.903490 0.496393 -2.193230 -v -1.905656 0.495496 -2.189049 -v -1.903491 0.496392 -2.183705 -v -1.903550 0.496368 -1.660389 -v -1.905715 0.495471 -1.655316 -v -1.903551 0.496368 -1.651050 -v -1.899148 0.498192 -1.125772 -v -1.901266 0.497315 -1.120170 -v -1.899060 0.498229 -1.115222 -v -1.903581 0.496356 -0.591683 -v -1.905689 0.495483 -0.586590 -v -1.903467 0.496403 -0.581586 -v -1.897345 0.498940 -0.039512 -v -1.603082 0.620511 0.037393 -v -1.658103 0.714836 -2.804202 -v -1.938721 0.714507 -2.727209 -v -1.947006 0.714507 -2.193230 -v -1.949350 0.714507 -2.189049 -v -1.947008 0.714507 -2.183705 -v -1.947071 0.714507 -1.660389 -v -1.949415 0.714507 -1.655316 -v -1.947072 0.714507 -1.651050 -v -1.942306 0.714507 -1.125772 -v -1.944599 0.714507 -1.120171 -v -1.942211 0.714507 -1.115222 -v -1.947104 0.714507 -0.591683 -v -1.949386 0.714507 -0.586590 -v -1.946981 0.714507 -0.581586 -v -1.940354 0.714507 -0.039512 -v -1.621968 0.714216 0.037393 -v -1.636704 0.822416 -2.804203 -v -1.896086 0.929500 -2.727209 -v -1.903741 0.932671 -2.193230 -v -1.905907 0.933568 -2.189049 -v -1.903743 0.932671 -2.183705 -v -1.903801 0.932696 -1.660389 -v -1.905967 0.933593 -1.655316 -v -1.903802 0.932696 -1.651050 -v -1.899399 0.930872 -1.125771 -v -1.901518 0.931750 -1.120170 -v -1.899311 0.930836 -1.115222 -v -1.903832 0.932708 -0.591683 -v -1.905940 0.933581 -0.586590 -v -1.903718 0.932661 -0.581586 -v -1.897596 0.930125 -0.039512 -v -1.603557 0.808015 0.037393 -v -1.575764 0.913619 -2.804203 -v -1.774423 1.111813 -2.727209 -v -1.780282 1.117671 -2.193230 -v -1.781940 1.119329 -2.189049 -v -1.780283 1.117672 -2.183705 -v -1.780329 1.117717 -1.660389 -v -1.781986 1.119375 -1.655316 -v -1.780329 1.117718 -1.651051 -v -1.776959 1.114348 -1.125772 -v -1.778580 1.115969 -1.120170 -v -1.776891 1.114280 -1.115222 -v -1.780352 1.117740 -0.591683 -v -1.781965 1.119353 -0.586590 -v -1.780265 1.117653 -0.581586 -v -1.775579 1.112967 -0.039512 -v -1.550652 0.887628 0.037393 -v -1.484561 0.974559 -2.804202 -v -1.592253 1.233689 -2.727209 -v -1.595424 1.241344 -2.193230 -v -1.596321 1.243510 -2.189049 -v -1.595424 1.241345 -2.183705 -v -1.595448 1.241404 -1.660389 -v -1.596346 1.243569 -1.655317 -v -1.595449 1.241405 -1.651051 -v -1.593625 1.237001 -1.125772 -v -1.594503 1.239120 -1.120171 -v -1.593589 1.236913 -1.115222 -v -1.595462 1.241434 -0.591683 -v -1.596335 1.243541 -0.586590 -v -1.595415 1.241320 -0.581587 -v -1.592879 1.235197 -0.039512 -v -1.471308 0.940935 0.037393 -v -1.376980 0.995958 -2.804203 -v -1.377310 1.276575 -2.727210 -v -1.377310 1.284860 -2.193231 -v -1.377310 1.287204 -2.189049 -v -1.377310 1.284862 -2.183706 -v -1.377310 1.284925 -1.660389 -v -1.377310 1.287269 -1.655317 -v -1.377310 1.284926 -1.651051 -v -1.377310 1.280160 -1.125772 -v -1.377310 1.282452 -1.120171 -v -1.377310 1.280064 -1.115222 -v -1.377311 1.284957 -0.591683 -v -1.377311 1.287239 -0.586591 -v -1.377311 1.284834 -0.581587 -v -1.377311 1.278207 -0.039512 -v -1.377603 0.959821 0.037393 -v -1.269399 0.974558 -2.804203 -v -1.162316 1.233941 -2.727210 -v -1.159146 1.241596 -2.193231 -v -1.158249 1.243761 -2.189049 -v -1.159145 1.241597 -2.183705 -v -1.159122 1.241655 -1.660390 -v -1.158224 1.243821 -1.655317 -v -1.159121 1.241656 -1.651051 -v -1.160945 1.237253 -1.125772 -v -1.160068 1.239371 -1.120171 -v -1.160982 1.237164 -1.115223 -v -1.159110 1.241685 -0.591684 -v -1.158237 1.243793 -0.586591 -v -1.159157 1.241571 -0.581587 -v -1.161693 1.235449 -0.039513 -v -1.283804 0.941410 0.037392 -v -1.178197 0.913619 -2.804203 -v -0.980004 1.112277 -2.727211 -v -0.974145 1.118136 -2.193231 -v -0.972487 1.119794 -2.189049 -v -0.974145 1.118137 -2.183706 -v -0.974100 1.118182 -1.660390 -v -0.972443 1.119839 -1.655318 -v -0.974099 1.118183 -1.651051 -v -0.977470 1.114812 -1.125772 -v -0.975849 1.116434 -1.120172 -v -0.977537 1.114745 -1.115223 -v -0.974078 1.118205 -0.591684 -v -0.972465 1.119818 -0.586591 -v -0.974165 1.118117 -0.581587 -v -0.978852 1.113432 -0.039513 -v -1.204191 0.888505 0.037392 -v -1.117258 0.822416 -2.804203 -v -0.858127 0.930107 -2.727211 -v -0.850472 0.933278 -2.193231 -v -0.848307 0.934175 -2.189050 -v -0.850472 0.933278 -2.183706 -v -0.850413 0.933303 -1.660390 -v -0.848248 0.934200 -1.655317 -v -0.850412 0.933303 -1.651052 -v -0.854816 0.931479 -1.125772 -v -0.852698 0.932356 -1.120171 -v -0.854904 0.931442 -1.115223 -v -0.850384 0.933315 -0.591685 -v -0.848277 0.934188 -0.586591 -v -0.850498 0.933268 -0.581587 -v -0.856622 0.930732 -0.039513 -v -1.150884 0.809160 0.037392 -v -1.095858 0.714835 -2.804203 -v -0.815242 0.715164 -2.727210 -v -0.806956 0.715164 -2.193232 -v -0.804612 0.715164 -2.189050 -v -0.806955 0.715164 -2.183707 -v -0.806892 0.715164 -1.660390 -v -0.804549 0.715164 -1.655318 -v -0.806891 0.715164 -1.651052 -v -0.811657 0.715164 -1.125773 -v -0.809365 0.715164 -1.120172 -v -0.811753 0.715164 -1.115223 -v -0.806861 0.715164 -0.591685 -v -0.804580 0.715164 -0.586591 -v -0.806984 0.715164 -0.581588 -v -0.813612 0.715164 -0.039513 -v -1.131998 0.715456 0.037392 -v -1.117258 0.607254 -2.804204 -v -0.857876 0.500171 -2.727211 -v -0.850221 0.497000 -2.193231 -v -0.848056 0.496103 -2.189050 -v -0.850220 0.496999 -2.183706 -v -0.850162 0.496975 -1.660390 -v -0.847996 0.496078 -1.655318 -v -0.850161 0.496975 -1.651052 -v -0.854565 0.498799 -1.125773 -v -0.852447 0.497921 -1.120172 -v -0.854653 0.498836 -1.115223 -v -0.850133 0.496963 -0.591685 -v -0.848026 0.496090 -0.586591 -v -0.850247 0.497010 -0.581588 -v -0.856370 0.499546 -0.039513 -v -1.150409 0.621657 0.037392 -v -1.178197 0.516052 -2.804203 -v -0.979539 0.317858 -2.727210 -v -0.973681 0.311999 -2.193232 -v -0.972023 0.310342 -2.189050 -v -0.973680 0.311998 -2.183707 -v -0.973635 0.311954 -1.660390 -v -0.971978 0.310296 -1.655318 -v -0.973635 0.311953 -1.651052 -v -0.977005 0.315323 -1.125773 -v -0.975384 0.313702 -1.120172 -v -0.977073 0.315391 -1.115223 -v -0.973614 0.311931 -0.591685 -v -0.972001 0.310318 -0.586591 -v -0.973701 0.312018 -0.581587 -v -0.978387 0.316704 -0.039513 -v -1.203315 0.542044 0.037392 -v -1.269400 0.455112 -2.804203 -v -1.161709 0.195982 -2.727211 -v -1.158539 0.188327 -2.193231 -v -1.157642 0.186161 -2.189049 -v -1.158538 0.188326 -2.183706 -v -1.158514 0.188267 -1.660391 -v -1.157618 0.186102 -1.655317 -v -1.158514 0.188266 -1.651052 -v -1.160339 0.192670 -1.125772 -v -1.159461 0.190552 -1.120171 -v -1.160375 0.192758 -1.115223 -v -1.158504 0.188238 -0.591684 -v -1.157630 0.186130 -0.586591 -v -1.158551 0.188352 -0.581587 -v -1.161087 0.194474 -0.039513 -v -1.282659 0.488737 0.037392 -v -1.376981 0.714835 -2.824126 -v -1.376981 0.714835 -2.824126 -v -1.376983 0.714836 0.045669 -v -1.376981 0.714835 -2.824126 -v -1.376983 0.714836 0.045669 -v -1.376981 0.714835 -2.824126 -v -1.376983 0.714836 0.045669 -v -1.376981 0.714835 -2.824126 -v -1.376983 0.714836 0.045669 -v -1.095858 0.714835 -2.804203 -v -1.095858 0.714835 -2.804203 -v -0.815242 0.715164 -2.727210 -v -1.095858 0.714835 -2.804203 -v -0.815242 0.715164 -2.727210 -v -0.806956 0.715164 -2.193232 -v -0.815242 0.715164 -2.727210 -v -0.806956 0.715164 -2.193232 -v -0.804612 0.715164 -2.189050 -v -0.806956 0.715164 -2.193232 -v -0.804612 0.715164 -2.189050 -v -0.806955 0.715164 -2.183707 -v -0.804612 0.715164 -2.189050 -v -0.806955 0.715164 -2.183707 -v -0.806892 0.715164 -1.660390 -v -0.806955 0.715164 -2.183707 -v -0.806892 0.715164 -1.660390 -v -0.804549 0.715164 -1.655318 -v -0.806892 0.715164 -1.660390 -v -0.804549 0.715164 -1.655318 -v -0.806891 0.715164 -1.651052 -v -0.804549 0.715164 -1.655318 -v -0.806891 0.715164 -1.651052 -v -0.811657 0.715164 -1.125773 -v -0.806891 0.715164 -1.651052 -v -0.811657 0.715164 -1.125773 -v -0.809365 0.715164 -1.120172 -v -0.811657 0.715164 -1.125773 -v -0.809365 0.715164 -1.120172 -v -0.811753 0.715164 -1.115223 -v -0.809365 0.715164 -1.120172 -v -0.811753 0.715164 -1.115223 -v -0.806861 0.715164 -0.591685 -v -0.811753 0.715164 -1.115223 -v -0.806861 0.715164 -0.591685 -v -0.804580 0.715164 -0.586591 -v -0.806861 0.715164 -0.591685 -v -0.804580 0.715164 -0.586591 -v -0.806984 0.715164 -0.581588 -v -0.804580 0.715164 -0.586591 -v -0.806984 0.715164 -0.581588 -v -0.813612 0.715164 -0.039513 -v -0.806984 0.715164 -0.581588 -v -0.813612 0.715164 -0.039513 -v -1.131998 0.715456 0.037392 -v -0.813612 0.715164 -0.039513 -v -1.131998 0.715456 0.037392 -vt 0.190735 0.839182 -vt 0.193609 0.896941 -vt 0.188361 0.862662 -vt 0.202488 0.916019 -vt 0.202488 0.809306 -vt 0.215244 0.930898 -vt 0.231371 0.940567 -vt 0.268691 0.940567 -vt 0.250031 0.944014 -vt 0.284816 0.930898 -vt 0.297569 0.916019 -vt 0.306446 0.896941 -vt 0.311087 0.850650 -vt 0.311087 0.874675 -vt 0.306446 0.828384 -vt 0.297569 0.809306 -vt 0.284816 0.794427 -vt 0.215244 0.794427 -vt 0.268691 0.784758 -vt 0.250031 0.781310 -vt 0.231371 0.784758 -vt 0.220184 0.862522 -vt 0.278914 0.864007 -vt 0.316566 0.874679 -vt 0.311595 0.896953 -vt 0.311595 0.828371 -vt 0.302033 0.809287 -vt 0.288188 0.794402 -vt 0.270546 0.784730 -vt 0.250027 0.781281 -vt 0.229507 0.784730 -vt 0.302033 0.916038 -vt 0.288188 0.930923 -vt 0.270546 0.940595 -vt 0.250027 0.944044 -vt 0.229507 0.940595 -vt 0.211863 0.930923 -vt 0.198015 0.916038 -vt 0.211863 0.794402 -vt 0.198015 0.809286 -vt 0.185370 0.839173 -vt 0.182831 0.862662 -vt 0.188451 0.896953 -vt 0.235380 0.807236 -vt 0.257535 0.805412 -vt 0.277449 0.814116 -vt 0.287702 0.824701 -vt 0.297313 0.845957 -vt 0.299277 0.862662 -vt 0.316566 0.850646 -vt 0.297313 0.879368 -vt 0.291718 0.894165 -vt 0.282918 0.906335 -vt 0.271340 0.915157 -vt 0.257535 0.919913 -vt 0.242518 0.919913 -vt 0.228713 0.915157 -vt 0.217134 0.906335 -vt 0.205103 0.887050 -vt 0.201273 0.854116 -vt 0.205103 0.838275 -vt 0.250118 0.920541 -vt 0.233667 0.918088 -vt 0.211884 0.907435 -vt 0.266420 0.918088 -vt 0.281121 0.911209 -vt 0.293223 0.900623 -vt 0.301940 0.887050 -vt 0.307152 0.862662 -vt 0.304752 0.845957 -vt 0.287569 0.818990 -vt 0.266421 0.807236 -vt 0.217127 0.818990 -vt 0.206872 0.824701 -vt 0.193507 0.854116 -vt 0.195279 0.879368 -vt 0.202073 0.894167 -vt 0.226030 0.810168 -vt 0.250108 0.804783 -vt 0.750004 -0.000000 -vt 0.750001 0.006942 -vt 0.692940 0.006942 -vt 0.750093 0.033771 -vt 0.688095 0.033771 -vt 0.750092 0.219840 -vt 0.688016 0.219840 -vt 0.750092 0.221297 -vt 0.687994 0.221297 -vt 0.750092 0.223159 -vt 0.688016 0.223159 -vt 0.750092 0.405512 -vt 0.688015 0.405512 -vt 0.750091 0.407280 -vt 0.687993 0.407280 -vt 0.750092 0.408766 -vt 0.688015 0.408766 -vt 0.750092 0.591803 -vt 0.688060 0.591803 -vt 0.750092 0.593755 -vt 0.688038 0.593755 -vt 0.750092 0.595479 -vt 0.688061 0.595479 -vt 0.750091 0.777910 -vt 0.688014 0.777910 -vt 0.750091 0.779685 -vt 0.687993 0.779685 -vt 0.750091 0.781429 -vt 0.688015 0.781429 -vt 0.750092 0.970318 -vt 0.688078 0.970318 -vt 0.750360 0.997116 -vt 0.694611 0.997116 -vt 0.749994 1.000000 -vt 0.637076 0.006942 -vt 0.628102 0.033771 -vt 0.627960 0.219840 -vt 0.627921 0.221297 -vt 0.627960 0.223159 -vt 0.627959 0.405512 -vt 0.627920 0.407280 -vt 0.627959 0.408766 -vt 0.628040 0.591803 -vt 0.628001 0.593755 -vt 0.628041 0.595479 -vt 0.627958 0.777910 -vt 0.627920 0.779685 -vt 0.627960 0.781429 -vt 0.628073 0.970318 -vt 0.639888 0.997116 -vt 0.582560 0.006942 -vt 0.570598 0.033771 -vt 0.570414 0.219840 -vt 0.570363 0.221297 -vt 0.570414 0.223159 -vt 0.570412 0.405512 -vt 0.570361 0.407280 -vt 0.570412 0.408766 -vt 0.570517 0.591803 -vt 0.570466 0.593755 -vt 0.570519 0.595479 -vt 0.570411 0.777910 -vt 0.570361 0.779685 -vt 0.570414 0.781429 -vt 0.570560 0.970318 -vt 0.586276 0.997116 -vt 0.528074 0.006942 -vt 0.514244 0.033771 -vt 0.514038 0.219840 -vt 0.513981 0.221297 -vt 0.514038 0.223159 -vt 0.514036 0.405512 -vt 0.513979 0.407280 -vt 0.514036 0.408766 -vt 0.514154 0.591803 -vt 0.514097 0.593755 -vt 0.514156 0.595479 -vt 0.514035 0.777910 -vt 0.513979 0.779685 -vt 0.514038 0.781429 -vt 0.514202 0.970318 -vt 0.532461 0.997116 -vt 0.470882 0.006942 -vt 0.456431 0.033771 -vt 0.456223 0.219840 -vt 0.456165 0.221297 -vt 0.456223 0.223159 -vt 0.456221 0.405512 -vt 0.456163 0.407280 -vt 0.456221 0.408766 -vt 0.456340 0.591803 -vt 0.456282 0.593755 -vt 0.456342 0.595479 -vt 0.456220 0.777910 -vt 0.456164 0.779685 -vt 0.456223 0.781428 -vt 0.456389 0.970318 -vt 0.475665 0.997116 -vt 0.407110 0.006942 -vt 0.394047 0.033771 -vt 0.393865 0.219840 -vt 0.393815 0.221297 -vt 0.393865 0.223159 -vt 0.393863 0.405512 -vt 0.393813 0.407280 -vt 0.393863 0.408766 -vt 0.393967 0.591803 -vt 0.393917 0.593755 -vt 0.393969 0.595479 -vt 0.393863 0.777910 -vt 0.393814 0.779685 -vt 0.393865 0.781428 -vt 0.394010 0.970318 -vt 0.411746 0.997116 -vt 0.333132 0.006942 -vt 0.324873 0.033771 -vt 0.324761 0.219840 -vt 0.324730 0.221297 -vt 0.324761 0.223159 -vt 0.324760 0.405512 -vt 0.324729 0.407279 -vt 0.324760 0.408766 -vt 0.324824 0.591803 -vt 0.324794 0.593755 -vt 0.324826 0.595479 -vt 0.324760 0.777910 -vt 0.324730 0.779685 -vt 0.324762 0.781428 -vt 0.324851 0.970318 -vt 0.336463 0.997116 -vt -0.249996 -0.000000 -vt 0.249999 0.006942 -vt 0.250113 0.033771 -vt 0.250111 0.219839 -vt 0.250111 0.221297 -vt 0.250111 0.223159 -vt 0.250111 0.405512 -vt 0.250111 0.407279 -vt 0.250111 0.408766 -vt 0.250113 0.591803 -vt 0.250112 0.593755 -vt 0.250113 0.595479 -vt 0.250112 0.777910 -vt 0.250111 0.779684 -vt 0.250112 0.781428 -vt 0.250113 0.970318 -vt 0.250571 0.997116 -vt 0.166866 0.006942 -vt 0.175343 0.033771 -vt 0.175452 0.219839 -vt 0.175482 0.221297 -vt 0.175452 0.223159 -vt 0.175453 0.405512 -vt 0.175483 0.407279 -vt 0.175453 0.408766 -vt 0.175391 0.591803 -vt 0.175421 0.593755 -vt 0.175390 0.595479 -vt 0.175454 0.777910 -vt 0.175483 0.779684 -vt 0.175452 0.781428 -vt 0.175366 0.970318 -vt 0.164592 0.997116 -vt -0.250006 1.000000 -vt 0.092889 0.006942 -vt 0.106149 0.033771 -vt 0.106328 0.219839 -vt 0.106377 0.221297 -vt 0.106328 0.223159 -vt 0.106329 0.405512 -vt 0.106379 0.407279 -vt 0.106329 0.408766 -vt 0.106228 0.591803 -vt 0.106277 0.593755 -vt 0.106225 0.595479 -vt 0.106331 0.777910 -vt 0.106379 0.779684 -vt 0.106328 0.781428 -vt 0.106186 0.970318 -vt 0.089147 0.997116 -vt 0.029118 0.006942 -vt 0.043746 0.033771 -vt 0.043952 0.219839 -vt 0.044009 0.221297 -vt 0.043952 0.223159 -vt 0.043954 0.405512 -vt 0.044011 0.407279 -vt 0.043954 0.408766 -vt 0.043837 0.591803 -vt 0.043893 0.593755 -vt 0.043834 0.595479 -vt 0.043955 0.777910 -vt 0.044011 0.779684 -vt 0.043952 0.781428 -vt 0.043788 0.970318 -vt 0.025104 0.997116 -vt -0.028074 0.006942 -vt -0.014075 0.033771 -vt -0.013872 0.219839 -vt -0.013815 0.221297 -vt -0.013872 0.223159 -vt -0.013870 0.405512 -vt -0.013813 0.407279 -vt -0.013870 0.408766 -vt -0.013986 0.591803 -vt -0.013930 0.593755 -vt -0.013988 0.595479 -vt -0.013869 0.777910 -vt -0.013814 0.779684 -vt -0.013872 0.781428 -vt -0.014034 0.970318 -vt -0.031756 0.997116 -vt 0.971926 0.006942 -vt 0.917440 0.006942 -vt 0.985925 0.033771 -vt 0.929571 0.033771 -vt 0.986128 0.219839 -vt 0.929753 0.219840 -vt 0.986185 0.221297 -vt 0.929803 0.221297 -vt 0.986128 0.223159 -vt 0.929753 0.223159 -vt 0.986130 0.405512 -vt 0.929754 0.405512 -vt 0.986187 0.407279 -vt 0.929804 0.407279 -vt 0.986130 0.408766 -vt 0.929754 0.408766 -vt 0.986014 0.591803 -vt 0.929651 0.591803 -vt 0.986070 0.593755 -vt 0.929701 0.593755 -vt 0.986012 0.595479 -vt 0.929649 0.595479 -vt 0.986131 0.777910 -vt 0.929755 0.777910 -vt 0.986186 0.779684 -vt 0.929804 0.779685 -vt 0.986128 0.781428 -vt 0.929752 0.781428 -vt 0.985966 0.970318 -vt 0.929608 0.970318 -vt 0.968244 0.997116 -vt 0.914411 0.997116 -vt 0.862925 0.006942 -vt 0.872073 0.033771 -vt 0.872212 0.219840 -vt 0.872251 0.221297 -vt 0.872212 0.223159 -vt 0.872213 0.405512 -vt 0.872252 0.407280 -vt 0.872214 0.408766 -vt 0.872134 0.591803 -vt 0.872172 0.593755 -vt 0.872132 0.595479 -vt 0.872214 0.777910 -vt 0.872252 0.779685 -vt 0.872212 0.781428 -vt 0.872101 0.970318 -vt 0.860807 0.997116 -vt 0.807061 0.006942 -vt 0.812088 0.033771 -vt 0.812165 0.219840 -vt 0.812186 0.221297 -vt 0.812165 0.223159 -vt 0.812165 0.405512 -vt 0.812186 0.407280 -vt 0.812165 0.408766 -vt 0.812121 0.591803 -vt 0.812142 0.593755 -vt 0.812120 0.595479 -vt 0.812165 0.777910 -vt 0.812186 0.779685 -vt 0.812164 0.781428 -vt 0.812103 0.970318 -vt 0.806101 0.997116 -vn -0.000002 1.000000 0.000002 -vn 0.000004 1.000000 0.000002 -vn -0.000000 1.000000 0.000002 -vn 0.000001 1.000000 0.000002 -vn 0.000001 1.000000 0.000001 -vn -0.000002 1.000000 -0.000000 -vn 0.000002 1.000000 0.000003 -vn 0.000001 1.000000 0.000000 -vn 0.000001 1.000000 0.000005 -vn 0.000002 1.000000 -0.000002 -vn 0.000002 1.000000 -0.000000 -vn 0.000002 1.000000 0.000001 -vn -0.174175 0.981511 -0.079368 -vn -0.006137 0.999892 -0.013319 -vn -0.957770 0.001058 0.287535 -vn -0.957768 0.001050 0.287541 -vn -0.838452 0.001111 -0.544974 -vn -0.838450 0.001108 -0.544977 -vn -0.656315 0.001187 -0.754486 -vn -0.656311 0.001180 -0.754490 -vn -0.421556 0.001281 -0.906801 -vn -0.421555 0.001279 -0.906802 -vn -0.145271 0.001395 -0.989391 -vn -0.145282 0.001408 -0.989389 -vn 0.145271 0.001532 -0.989391 -vn 0.145274 0.001528 -0.989390 -vn -0.838448 0.001109 0.544981 -vn -0.838455 0.001093 0.544970 -vn -0.656310 0.001172 0.754490 -vn -0.421560 0.001277 0.906800 -vn -0.421555 0.001271 0.906802 -vn -0.145269 0.001393 0.989391 -vn -0.145269 0.001392 0.989391 -vn 0.145270 0.001519 0.989391 -vn 0.145271 0.001517 0.989391 -vn 0.421560 0.001639 0.906799 -vn 0.421558 0.001641 0.906800 -vn 0.656305 0.001732 0.754493 -vn 0.656311 0.001741 0.754488 -vn 0.421563 0.001647 -0.906798 -vn 0.656305 0.001746 -0.754494 -vn 0.656305 0.001746 -0.754493 -vn 0.875115 0.001819 -0.483911 -vn 0.875115 0.001818 -0.483911 -vn 0.989390 0.001884 -0.145273 -vn 0.976485 0.001859 0.215577 -vn 0.976485 0.001853 0.215580 -vn 0.838447 0.001813 0.544980 -vn 0.004025 -0.999981 -0.004630 -vn 0.000828 -0.999934 -0.011502 -vn 0.002227 -0.999986 -0.004790 -vn 0.000981 -0.999977 -0.006719 -vn -0.000888 -0.999981 -0.006045 -vn -0.003095 -0.999962 -0.008162 -vn -0.004808 -0.999973 -0.005532 -vn -0.003091 -0.999973 -0.006646 -vn -0.004807 -0.999973 -0.005532 -vn -0.006493 -0.999972 -0.003592 -vn -0.005720 -0.999977 -0.003718 -vn -0.008134 -0.999966 -0.001194 -vn -0.006503 -0.999977 -0.001952 -vn -0.008178 -0.999966 0.001201 -vn -0.957768 0.001060 -0.287541 -vn -0.957769 0.001055 -0.287537 -vn -0.999999 0.001032 0.000002 -vn -1.000000 0.001034 0.000000 -vn -0.006803 -0.999977 0.000000 -vn -0.008039 -0.999946 0.006615 -vn -0.004898 -0.999987 0.001463 -vn -0.004616 -0.999981 0.004012 -vn -0.004297 -0.999987 0.002793 -vn -0.004556 -0.999987 0.002169 -vn -0.004485 -0.999977 0.005156 -vn -0.002355 -0.999967 0.007844 -vn -0.002871 -0.999977 0.006168 -vn 0.000000 -0.999966 0.008243 -vn -0.000986 -0.999977 0.006715 -vn 0.002373 -0.999966 0.007905 -vn 0.000985 -0.999977 0.006733 -vn 0.007666 -0.999946 0.006969 -vn 0.002158 -0.999987 0.004642 -vn 0.003458 -0.999982 0.004818 -vn 0.003694 -0.999984 0.004247 -vn 0.006142 -0.999973 0.003992 -vn 0.007496 -0.999971 0.001080 -vn 0.006553 -0.999977 0.001444 -vn 0.007906 -0.999966 -0.002376 -vn 0.006738 -0.999977 -0.000993 -vn 0.139035 -0.032082 0.989768 -vn 0.287424 0.028583 0.957377 -vn 0.432605 -0.032594 0.900994 -vn -0.000000 0.034788 0.999395 -vn -0.140127 -0.031194 0.989642 -vn -0.287430 0.028172 0.957387 -vn -0.417592 -0.025694 0.908271 -vn -0.544784 0.023712 0.838241 -vn -0.653580 -0.022242 0.756531 -vn -0.754316 0.021217 0.656169 -vn -0.836923 -0.020715 0.546928 -vn -0.906632 0.020491 0.421425 -vn -0.975254 -0.042081 0.217044 -vn -0.989392 0.000001 0.145273 -vn -0.989391 -0.000001 -0.145274 -vn -0.989392 0.000001 -0.145270 -vn -0.875115 0.000001 -0.483915 -vn -0.833816 -0.064469 -0.548266 -vn -0.656156 0.022170 -0.754300 -vn -0.476431 -0.047544 -0.877925 -vn 0.004158 -0.999963 -0.007526 -vn 0.005918 -0.999977 -0.003274 -vn 0.006886 -0.999963 -0.005192 -vn 0.797866 0.042802 -0.601313 -vn 0.901524 -0.083515 -0.424594 -vn 0.957768 -0.000003 -0.287541 -vn 0.989734 -0.000001 0.142923 -vn 0.994106 0.082269 0.070611 -vn 0.905719 -0.020725 0.423372 -vn 0.797962 0.041489 0.601278 -vn 0.544216 0.048568 0.837538 -vn -0.002701 0.999996 0.000811 -vn 0.009338 0.999853 0.014403 -vn 0.000250 0.999999 0.001677 -vn 0.015572 0.999869 0.004498 -vn 0.595680 -0.044918 -0.801965 -vn -0.353966 0.055740 -0.933596 -vn 0.204569 -0.057495 -0.977162 -vn 0.483282 0.051183 -0.873967 -vn 0.071898 0.068378 -0.995065 -vn -0.139987 -0.031222 -0.989661 -vn 0.800547 0.044118 0.597644 -vn 0.421563 0.001648 -0.906798 -vn -0.014063 -0.070686 -0.997400 -vn -0.052409 -0.264285 -0.963020 -vn -0.052548 -0.264167 -0.963044 -vn -0.194502 -0.980784 -0.015219 -vn -0.194494 -0.980786 -0.015215 -vn -0.170462 -0.859545 -0.481794 -vn -0.170469 -0.859596 -0.481700 -vn -0.178701 -0.901110 0.395052 -vn -0.178711 -0.901144 0.394970 -vn -0.194524 -0.980898 -0.000119 -vn -0.194525 -0.980898 -0.000119 -vn -0.177179 -0.893417 -0.412813 -vn -0.177183 -0.893451 -0.412736 -vn -0.171254 -0.863554 0.474285 -vn -0.171265 -0.863600 0.474197 -vn -0.194512 -0.980860 0.008900 -vn -0.194517 -0.980859 0.008898 -vn -0.180517 -0.910268 -0.372593 -vn -0.180521 -0.910300 -0.372512 -vn -0.175814 -0.886572 0.427877 -vn -0.175818 -0.886589 0.427842 -vn -0.194517 -0.980856 -0.009168 -vn -0.194512 -0.980857 -0.009166 -vn -0.178096 -0.898041 -0.402249 -vn -0.178102 -0.898082 -0.402155 -vn -0.175956 -0.887266 0.426379 -vn -0.175965 -0.887302 0.426299 -vn -0.194504 -0.980828 0.011991 -vn -0.194511 -0.980827 0.011988 -vn -0.046029 -0.234506 0.971024 -vn -0.046527 -0.234632 0.970970 -vn -0.006630 -0.033780 0.999407 -vn -0.040043 -0.059925 -0.997399 -vn -0.149558 -0.224109 -0.963020 -vn -0.149641 -0.223950 -0.963044 -vn -0.555027 -0.831693 -0.015219 -vn -0.555020 -0.831698 -0.015215 -vn -0.486429 -0.728898 -0.481762 -vn -0.486437 -0.728911 -0.481735 -vn -0.509938 -0.764133 0.395048 -vn -0.509958 -0.764159 0.394973 -vn -0.555091 -0.831790 -0.000119 -vn -0.555090 -0.831790 -0.000119 -vn -0.505588 -0.757607 -0.412810 -vn -0.505599 -0.757627 -0.412760 -vn -0.488689 -0.732291 0.474271 -vn -0.488718 -0.732331 0.474179 -vn -0.555066 -0.831759 0.008899 -vn -0.555068 -0.831757 0.008898 -vn -0.515124 -0.771903 -0.372576 -vn -0.515130 -0.771914 -0.372546 -vn -0.501691 -0.751780 0.427941 -vn -0.501713 -0.751809 0.427863 -vn -0.555067 -0.831755 -0.009168 -vn -0.555064 -0.831757 -0.009167 -vn -0.508207 -0.761532 -0.402238 -vn -0.508215 -0.761546 -0.402202 -vn -0.502109 -0.752397 0.426363 -vn -0.502112 -0.752401 0.426352 -vn -0.555047 -0.831733 0.011990 -vn -0.555052 -0.831729 0.011988 -vn -0.132265 -0.199040 0.971025 -vn -0.132776 -0.198966 0.970970 -vn -0.019052 -0.028672 0.999407 -vn -0.059925 -0.040043 -0.997399 -vn -0.223938 -0.149817 -0.963020 -vn -0.223953 -0.149641 -0.963044 -vn -0.831053 -0.555985 -0.015219 -vn -0.831049 -0.555991 -0.015216 -vn -0.728309 -0.487246 -0.481828 -vn -0.728341 -0.487270 -0.481754 -vn -0.763543 -0.510819 0.395053 -vn -0.763560 -0.510829 0.395006 -vn -0.831149 -0.556049 -0.000119 -vn -0.831150 -0.556049 -0.000119 -vn -0.757015 -0.506448 -0.412842 -vn -0.757061 -0.506483 -0.412715 -vn -0.731734 -0.489538 0.474254 -vn -0.731743 -0.489544 0.474235 -vn -0.831114 -0.556031 0.008900 -vn -0.831117 -0.556026 0.008898 -vn -0.771288 -0.516003 -0.372633 -vn -0.771318 -0.516026 -0.372539 -vn -0.751188 -0.502562 0.427958 -vn -0.751254 -0.502600 0.427796 -vn -0.831114 -0.556026 -0.009169 -vn -0.831111 -0.556031 -0.009167 -vn -0.760927 -0.509066 -0.402295 -vn -0.760965 -0.509095 -0.402187 -vn -0.751779 -0.502952 0.426460 -vn -0.751844 -0.502990 0.426301 -vn -0.831086 -0.556015 0.011991 -vn -0.831089 -0.556011 0.011988 -vn -0.198366 -0.133273 0.971025 -vn -0.198808 -0.133010 0.970971 -vn -0.028573 -0.019198 0.999407 -vn -0.070688 -0.014058 -0.997399 -vn -0.264225 -0.052719 -0.963019 -vn -0.264169 -0.052544 -0.963044 -vn -0.980559 -0.195633 -0.015220 -vn -0.980557 -0.195645 -0.015215 -vn -0.859321 -0.171442 -0.481845 -vn -0.859332 -0.171445 -0.481825 -vn -0.900888 -0.179739 0.395088 -vn -0.900929 -0.179744 0.394993 -vn -0.980673 -0.195655 -0.000120 -vn -0.980672 -0.195657 -0.000119 -vn -0.893222 -0.178206 -0.412793 -vn -0.893252 -0.178214 -0.412723 -vn -0.863338 -0.172247 0.474318 -vn -0.863426 -0.172260 0.474153 -vn -0.980632 -0.195654 0.008900 -vn -0.980634 -0.195648 0.008897 -vn -0.910047 -0.181568 -0.372623 -vn -0.910094 -0.181581 -0.372500 -vn -0.886368 -0.176846 0.427876 -vn -0.886417 -0.176852 0.427771 -vn -0.980632 -0.195646 -0.009169 -vn -0.980631 -0.195652 -0.009166 -vn -0.897828 -0.179123 -0.402268 -vn -0.897858 -0.179131 -0.402198 -vn -0.887062 -0.176979 0.426379 -vn -0.887112 -0.176986 0.426273 -vn -0.980601 -0.195648 0.011991 -vn -0.980602 -0.195641 0.011988 -vn -0.234267 -0.047216 0.971025 -vn -0.234576 -0.046801 0.970971 -vn -0.033745 -0.006801 0.999407 -vn -0.070688 0.014058 -0.997399 -vn -0.264285 0.052410 -0.963020 -vn -0.264172 0.052544 -0.963043 -vn -0.980784 0.194502 -0.015218 -vn -0.980785 0.194497 -0.015216 -vn -0.859480 0.170451 -0.481913 -vn -0.859614 0.170471 -0.481668 -vn -0.901103 0.178701 0.395069 -vn -0.901155 0.178716 0.394943 -vn -0.980897 0.194527 -0.000119 -vn -0.980897 0.194526 -0.000119 -vn -0.893420 0.177179 -0.412805 -vn -0.893425 0.177180 -0.412794 -vn -0.863579 0.171261 0.474237 -vn -0.863530 0.171249 0.474331 -vn -0.980859 0.194514 0.008899 -vn -0.980858 0.194520 0.008897 -vn -0.910274 0.180518 -0.372578 -vn -0.910284 0.180519 -0.372552 -vn -0.886584 0.175818 0.427851 -vn -0.886568 0.175814 0.427885 -vn -0.980856 0.194517 -0.009169 -vn -0.980857 0.194514 -0.009167 -vn -0.898030 0.178093 -0.402275 -vn -0.898057 0.178097 -0.402213 -vn -0.887277 0.175960 0.426353 -vn -0.887295 0.175965 0.426314 -vn -0.980828 0.194506 0.011991 -vn -0.980827 0.194512 0.011988 -vn -0.234504 0.046028 0.971025 -vn -0.234631 0.046528 0.970971 -vn -0.033779 0.006629 0.999407 -vn -0.059926 0.040039 -0.997399 -vn -0.224113 0.149558 -0.963019 -vn -0.223954 0.149640 -0.963043 -vn -0.831693 0.555027 -0.015220 -vn -0.831699 0.555018 -0.015215 -vn -0.728898 0.486427 -0.481764 -vn -0.728915 0.486437 -0.481727 -vn -0.764138 0.509947 0.395027 -vn -0.764115 0.509929 0.395095 -vn -0.831791 0.555089 -0.000119 -vn -0.831789 0.555092 -0.000120 -vn -0.757588 0.505575 -0.412862 -vn -0.757649 0.505611 -0.412705 -vn -0.732228 0.488649 0.474410 -vn -0.732318 0.488714 0.474204 -vn -0.831759 0.555066 0.008899 -vn -0.831758 0.555067 0.008898 -vn -0.771887 0.515114 -0.372623 -vn -0.771917 0.515130 -0.372539 -vn -0.751771 0.501687 0.427961 -vn -0.751808 0.501714 0.427863 -vn -0.831755 0.555067 -0.009169 -vn -0.831757 0.555064 -0.009167 -vn -0.761512 0.508193 -0.402292 -vn -0.761539 0.508209 -0.402220 -vn -0.752384 0.502100 0.426396 -vn -0.752407 0.502117 0.426335 -vn -0.831734 0.555045 0.011991 -vn -0.831729 0.555052 0.011988 -vn -0.199038 0.132268 0.971025 -vn -0.198964 0.132776 0.970971 -vn -0.028670 0.019053 0.999407 -vn -0.040036 0.059929 -0.997399 -vn -0.149820 0.223938 -0.963019 -vn -0.149634 0.223954 -0.963044 -vn -0.555985 0.831053 -0.015219 -vn -0.555992 0.831049 -0.015215 -vn -0.487251 0.728319 -0.481807 -vn -0.487289 0.728371 -0.481691 -vn -0.510795 0.763504 0.395157 -vn -0.510831 0.763565 0.394995 -vn -0.556048 0.831150 -0.000120 -vn -0.556050 0.831149 -0.000119 -vn -0.506457 0.757028 -0.412808 -vn -0.506477 0.757054 -0.412735 -vn -0.489525 0.731714 0.474298 -vn -0.489556 0.731765 0.474189 -vn -0.556031 0.831114 0.008900 -vn -0.556026 0.831117 0.008898 -vn -0.516012 0.771297 -0.372603 -vn -0.516015 0.771301 -0.372590 -vn -0.502567 0.751198 0.427934 -vn -0.502601 0.751256 0.427793 -vn -0.556025 0.831115 -0.009169 -vn -0.556030 0.831112 -0.009166 -vn -0.509069 0.760932 -0.402283 -vn -0.509089 0.760957 -0.402210 -vn -0.502965 0.751806 0.426395 -vn -0.502979 0.751829 0.426340 -vn -0.556015 0.831086 0.011990 -vn -0.556009 0.831090 0.011987 -vn -0.133272 0.198366 0.971025 -vn -0.133007 0.198809 0.970971 -vn -0.019197 0.028574 0.999407 -vn -0.014065 0.070687 -0.997399 -vn -0.052720 0.264223 -0.963020 -vn -0.052551 0.264169 -0.963044 -vn -0.195633 0.980559 -0.015219 -vn -0.195641 0.980558 -0.015215 -vn -0.171452 0.859361 -0.481770 -vn -0.171460 0.859394 -0.481709 -vn -0.179738 0.900897 0.395067 -vn -0.179742 0.900924 0.395006 -vn -0.195655 0.980673 -0.000119 -vn -0.195656 0.980673 -0.000118 -vn -0.178205 0.893215 -0.412808 -vn -0.178210 0.893232 -0.412768 -vn -0.172250 0.863361 0.474275 -vn -0.172254 0.863390 0.474222 -vn -0.195653 0.980633 0.008900 -vn -0.195648 0.980634 0.008898 -vn -0.181564 0.910038 -0.372647 -vn -0.181578 0.910087 -0.372519 -vn -0.176846 0.886378 0.427855 -vn -0.176848 0.886389 0.427830 -vn -0.195647 0.980631 -0.009168 -vn -0.195652 0.980630 -0.009166 -vn -0.179124 0.897825 -0.402276 -vn -0.179134 0.897863 -0.402184 -vn -0.176977 0.887050 0.426405 -vn -0.176985 0.887106 0.426287 -vn -0.195648 0.980601 0.011990 -vn -0.195642 0.980602 0.011988 -vn -0.047214 0.234268 0.971025 -vn -0.046801 0.234576 0.970971 -vn -0.006800 0.033746 0.999407 -vn 0.014061 0.070687 -0.997400 -vn 0.052407 0.264286 -0.963020 -vn 0.052546 0.264167 -0.963044 -vn 0.194502 0.980784 -0.015219 -vn 0.194493 0.980786 -0.015215 -vn 0.170461 0.859545 -0.481794 -vn 0.170468 0.859593 -0.481706 -vn 0.178698 0.901098 0.395082 -vn 0.178710 0.901141 0.394978 -vn 0.194525 0.980898 -0.000118 -vn 0.177175 0.893402 -0.412846 -vn 0.177179 0.893432 -0.412779 -vn 0.171253 0.863543 0.474306 -vn 0.171263 0.863586 0.474225 -vn 0.194513 0.980860 0.008900 -vn 0.194518 0.980859 0.008898 -vn 0.180516 0.910268 -0.372593 -vn 0.180519 0.910295 -0.372525 -vn 0.175812 0.886556 0.427911 -vn 0.175822 0.886592 0.427833 -vn 0.194517 0.980856 -0.009167 -vn 0.194513 0.980857 -0.009165 -vn 0.178094 0.898036 -0.402262 -vn 0.178100 0.898079 -0.402163 -vn 0.175958 0.887271 0.426366 -vn 0.175967 0.887308 0.426287 -vn 0.194505 0.980828 0.011991 -vn 0.194511 0.980827 0.011988 -vn 0.046030 0.234504 0.971025 -vn 0.046532 0.234631 0.970970 -vn 0.006632 0.033780 0.999407 -vn 0.040041 0.059925 -0.997399 -vn 0.149555 0.224111 -0.963020 -vn 0.149638 0.223949 -0.963045 -vn 0.555026 0.831693 -0.015218 -vn 0.555020 0.831698 -0.015215 -vn 0.486418 0.728883 -0.481796 -vn 0.486437 0.728915 -0.481727 -vn 0.509939 0.764129 0.395055 -vn 0.509949 0.764142 0.395018 -vn 0.555090 0.831791 -0.000118 -vn 0.555091 0.831790 -0.000119 -vn 0.505570 0.757580 -0.412883 -vn 0.505599 0.757631 -0.412752 -vn 0.488672 0.732263 0.474331 -vn 0.488740 0.732357 0.474116 -vn 0.555065 0.831759 0.008900 -vn 0.555068 0.831757 0.008899 -vn 0.515115 0.771891 -0.372613 -vn 0.515126 0.771911 -0.372556 -vn 0.501694 0.751782 0.427933 -vn 0.501733 0.751834 0.427796 -vn 0.555067 0.831755 -0.009167 -vn 0.555064 0.831757 -0.009165 -vn 0.508205 0.761529 -0.402245 -vn 0.508222 0.761558 -0.402169 -vn 0.502113 0.752401 0.426352 -vn 0.502118 0.752407 0.426334 -vn 0.555046 0.831733 0.011991 -vn 0.555052 0.831729 0.011988 -vn 0.132268 0.199040 0.971024 -vn 0.132778 0.198965 0.970970 -vn 0.019054 0.028671 0.999407 -vn 0.059922 0.040044 -0.997400 -vn 0.223934 0.149818 -0.963020 -vn 0.223949 0.149642 -0.963044 -vn 0.831053 0.555985 -0.015219 -vn 0.831048 0.555993 -0.015215 -vn 0.728312 0.487247 -0.481822 -vn 0.728375 0.487293 -0.481680 -vn 0.763520 0.510804 0.395115 -vn 0.763563 0.510829 0.395001 -vn 0.831150 0.556049 -0.000119 -vn 0.757026 0.506456 -0.412813 -vn 0.757064 0.506485 -0.412706 -vn 0.731761 0.489556 0.474195 -vn 0.731773 0.489563 0.474170 -vn 0.831114 0.556031 0.008901 -vn 0.831116 0.556027 0.008899 -vn 0.771292 0.516007 -0.372621 -vn 0.771316 0.516026 -0.372544 -vn 0.751225 0.502585 0.427867 -vn 0.751248 0.502599 0.427809 -vn 0.831114 0.556026 -0.009167 -vn 0.831111 0.556031 -0.009164 -vn 0.760940 0.509076 -0.402258 -vn 0.760973 0.509101 -0.402166 -vn 0.751788 0.502956 0.426438 -vn 0.751840 0.502987 0.426311 -vn 0.831086 0.556014 0.011991 -vn 0.831089 0.556010 0.011989 -vn 0.198370 0.133272 0.971024 -vn 0.198812 0.133008 0.970970 -vn 0.028576 0.019197 0.999407 -vn 0.070685 0.014060 -0.997400 -vn 0.264223 0.052716 -0.963020 -vn 0.264169 0.052547 -0.963044 -vn 0.980559 0.195633 -0.015218 -vn 0.980558 0.195641 -0.015215 -vn 0.859371 0.171453 -0.481753 -vn 0.859394 0.171459 -0.481709 -vn 0.900892 0.179738 0.395080 -vn 0.900913 0.179741 0.395031 -vn 0.980673 0.195656 -0.000119 -vn 0.980672 0.195657 -0.000119 -vn 0.893230 0.178207 -0.412773 -vn 0.893282 0.178221 -0.412655 -vn 0.863379 0.172252 0.474242 -vn 0.863401 0.172255 0.474202 -vn 0.980633 0.195654 0.008901 -vn 0.980634 0.195646 0.008898 -vn 0.910046 0.181568 -0.372625 -vn 0.910094 0.181581 -0.372501 -vn 0.886363 0.176844 0.427886 -vn 0.886425 0.176853 0.427754 -vn 0.980632 0.195646 -0.009166 -vn 0.980631 0.195652 -0.009163 -vn 0.897838 0.179125 -0.402246 -vn 0.897877 0.179136 -0.402154 -vn 0.887056 0.176978 0.426392 -vn 0.887111 0.176985 0.426275 -vn 0.980601 0.195650 0.011992 -vn 0.980602 0.195641 0.011988 -vn 0.234270 0.047216 0.971024 -vn 0.234578 0.046803 0.970970 -vn 0.033747 0.006802 0.999407 -vn 0.070685 -0.014056 -0.997400 -vn 0.264286 -0.052407 -0.963020 -vn 0.264171 -0.052543 -0.963044 -vn 0.980784 -0.194503 -0.015219 -vn 0.980785 -0.194495 -0.015215 -vn 0.859545 -0.170462 -0.481794 -vn 0.859574 -0.170466 -0.481741 -vn 0.901087 -0.178697 0.395108 -vn 0.901125 -0.178707 0.395016 -vn 0.980897 -0.194527 -0.000119 -vn 0.980898 -0.194525 -0.000118 -vn 0.893453 -0.177183 -0.412733 -vn 0.893424 -0.177179 -0.412797 -vn 0.863554 -0.171253 0.474286 -vn 0.863625 -0.171270 0.474150 -vn 0.980859 -0.194515 0.008900 -vn 0.980859 -0.194516 0.008899 -vn 0.910275 -0.180518 -0.372575 -vn 0.910273 -0.180518 -0.372580 -vn 0.886592 -0.175820 0.427834 -vn 0.886620 -0.175827 0.427773 -vn 0.980856 -0.194517 -0.009165 -vn 0.980857 -0.194514 -0.009164 -vn 0.898049 -0.178097 -0.402231 -vn 0.898079 -0.178101 -0.402161 -vn 0.887278 -0.175958 0.426352 -vn 0.887330 -0.175971 0.426240 -vn 0.980828 -0.194505 0.011991 -vn 0.980827 -0.194510 0.011989 -vn 0.234506 -0.046029 0.971024 -vn 0.234633 -0.046530 0.970970 -vn 0.033781 -0.006631 0.999407 -vn 0.059921 -0.040043 -0.997400 -vn 0.224112 -0.149558 -0.963019 -vn 0.223949 -0.149642 -0.963044 -vn 0.831693 -0.555027 -0.015219 -vn 0.831698 -0.555019 -0.015215 -vn 0.728871 -0.486411 -0.481820 -vn 0.728925 -0.486444 -0.481706 -vn 0.764119 -0.509931 0.395085 -vn 0.764146 -0.509952 0.395007 -vn 0.831790 -0.555090 -0.000118 -vn 0.757581 -0.505573 -0.412875 -vn 0.757650 -0.505613 -0.412700 -vn 0.732307 -0.488703 0.474232 -vn 0.732324 -0.488715 0.474193 -vn 0.831760 -0.555064 0.008901 -vn 0.831757 -0.555069 0.008899 -vn 0.771878 -0.515108 -0.372650 -vn 0.771929 -0.515136 -0.372505 -vn 0.751812 -0.501713 0.427857 -vn 0.751845 -0.501738 0.427771 -vn 0.831755 -0.555067 -0.009166 -vn 0.831757 -0.555064 -0.009165 -vn 0.761531 -0.508208 -0.402238 -vn 0.761573 -0.508232 -0.402129 -vn 0.752408 -0.502118 0.426332 -vn 0.752416 -0.502124 0.426312 -vn 0.831733 -0.555046 0.011992 -vn 0.831729 -0.555053 0.011988 -vn 0.199041 -0.132268 0.971024 -vn 0.198967 -0.132777 0.970970 -vn 0.028672 -0.019054 0.999407 -vn 0.040038 -0.059926 -0.997400 -vn 0.149820 -0.223936 -0.963020 -vn 0.149636 -0.223951 -0.963045 -vn 0.555985 -0.831053 -0.015218 -vn 0.555992 -0.831048 -0.015215 -vn 0.487257 -0.728329 -0.481785 -vn 0.487296 -0.728382 -0.481666 -vn 0.510812 -0.763531 0.395084 -vn 0.510833 -0.763569 0.394983 -vn 0.556048 -0.831150 -0.000118 -vn 0.556049 -0.831150 -0.000118 -vn 0.506461 -0.757032 -0.412795 -vn 0.506485 -0.757064 -0.412707 -vn 0.489529 -0.731718 0.474288 -vn 0.489554 -0.731758 0.474201 -vn 0.556031 -0.831114 0.008900 -vn 0.556027 -0.831116 0.008899 -vn 0.516014 -0.771303 -0.372587 -vn 0.516021 -0.771313 -0.372556 -vn 0.502586 -0.751228 0.427861 -vn 0.502584 -0.751225 0.427868 -vn 0.556025 -0.831115 -0.009167 -vn 0.556029 -0.831112 -0.009165 -vn 0.509085 -0.760956 -0.402217 -vn 0.509093 -0.760966 -0.402189 -vn 0.502967 -0.751807 0.426393 -vn 0.502984 -0.751836 0.426321 -vn 0.556015 -0.831086 0.011991 -vn 0.556008 -0.831090 0.011988 -vn 0.133274 -0.198368 0.971024 -vn 0.133010 -0.198811 0.970970 -vn 0.019199 -0.028575 0.999407 -vn 0.014060 -0.070686 -0.997400 -vn 0.052716 -0.264223 -0.963020 -vn 0.052546 -0.264168 -0.963044 -vn 0.195633 -0.980559 -0.015218 -vn 0.195641 -0.980558 -0.015215 -vn 0.171450 -0.859356 -0.481781 -vn 0.171459 -0.859394 -0.481709 -vn 0.179739 -0.900887 0.395091 -vn 0.179745 -0.900936 0.394976 -vn 0.195656 -0.980673 -0.000119 -vn 0.195656 -0.980673 -0.000118 -vn 0.178205 -0.893223 -0.412791 -vn 0.178212 -0.893247 -0.412735 -vn 0.172250 -0.863352 0.474293 -vn 0.172257 -0.863401 0.474201 -vn 0.195653 -0.980633 0.008901 -vn 0.195648 -0.980634 0.008898 -vn 0.181568 -0.910052 -0.372611 -vn 0.181578 -0.910087 -0.372519 -vn 0.176841 -0.886342 0.427931 -vn 0.176849 -0.886405 0.427797 -vn 0.195647 -0.980632 -0.009167 -vn 0.195652 -0.980631 -0.009165 -vn 0.179125 -0.897832 -0.402258 -vn 0.179135 -0.897869 -0.402172 -vn 0.176979 -0.887060 0.426384 -vn 0.176985 -0.887099 0.426299 -vn 0.195648 -0.980601 0.011991 -vn 0.195642 -0.980602 0.011988 -vn 0.047217 -0.234270 0.971024 -vn 0.046804 -0.234578 0.970970 -vn 0.006803 -0.033746 0.999407 -s off -f 1550/657/931 1552/658/931 1551/659/931 -f 1550/657/932 1553/660/932 1552/658/932 -f 1549/661/933 1553/660/933 1550/657/933 -f 1549/661/934 1554/662/934 1553/660/934 -f 1549/661/935 1555/663/935 1554/662/935 -f 1549/661/936 1536/664/936 1535/665/936 -f 1549/661/934 1537/666/934 1536/664/934 -f 1549/661/937 1538/667/937 1537/666/937 -f 1549/661/935 1539/668/935 1538/667/935 -f 1549/661/934 1541/669/934 1540/670/934 -f 1549/661/938 1542/671/938 1541/669/938 -f 1549/661/939 1543/672/939 1542/671/939 -f 1549/661/934 1544/673/934 1543/672/934 -f 1548/674/940 1544/673/940 1549/661/940 -f 1548/674/941 1545/675/941 1544/673/941 -f 1548/674/941 1546/676/941 1545/675/941 -f 1548/674/942 1547/677/942 1546/676/942 -f 1549/661/943 1535/665/943 1517/678/943 -f 1516/679/944 1549/661/944 1540/670/944 -f 1556/680/945 1557/681/945 1539/668/945 -f 1539/668/946 1540/670/946 1556/680/946 -f 1558/682/947 1542/671/947 1543/672/947 -f 1559/683/948 1558/682/948 1543/672/948 -f 1559/683/949 1543/672/949 1544/673/949 -f 1560/684/950 1559/683/950 1544/673/950 -f 1560/684/951 1544/673/951 1545/675/951 -f 1545/675/952 1561/685/952 1560/684/952 -f 1561/685/953 1545/675/953 1546/676/953 -f 1546/676/954 1562/686/954 1561/685/954 -f 1562/686/955 1546/676/955 1547/677/955 -f 1547/677/956 1563/687/956 1562/686/956 -f 1539/668/957 1557/681/957 1564/688/957 -f 1538/667/958 1539/668/958 1564/688/958 -f 1565/689/959 1537/666/959 1538/667/959 -f 1538/667/959 1564/688/959 1565/689/959 -f 1565/689/960 1566/690/960 1536/664/960 -f 1536/664/961 1537/666/961 1565/689/961 -f 1566/690/962 1567/691/962 1536/664/962 -f 1567/691/963 1535/665/963 1536/664/963 -f 1567/691/964 1568/692/964 1555/663/964 -f 1535/665/965 1567/691/965 1555/663/965 -f 1554/662/966 1555/663/966 1568/692/966 -f 1569/693/967 1554/662/967 1568/692/967 -f 1570/694/968 1553/660/968 1554/662/968 -f 1554/662/969 1569/693/969 1570/694/969 -f 1547/677/970 1548/674/970 1563/687/970 -f 1571/695/971 1548/674/971 1549/661/971 -f 1549/661/972 1572/696/972 1571/695/972 -f 1572/696/973 1549/661/973 1550/657/973 -f 1550/657/974 1573/697/974 1572/696/974 -f 1573/697/975 1551/659/975 1574/698/975 -f 1573/697/975 1550/657/975 1551/659/975 -f 1574/698/976 1551/659/976 1552/658/976 -f 1552/658/977 1575/699/977 1574/698/977 -f 1575/699/978 1552/658/978 1553/660/978 -f 1553/660/978 1570/694/978 1575/699/978 -f 1576/700/979 1571/695/979 1572/696/979 -f 1576/700/980 1577/701/980 1571/695/980 -f 1577/701/981 1563/687/981 1571/695/981 -f 1562/686/982 1563/687/982 1577/701/982 -f 1578/702/983 1561/685/983 1562/686/983 -f 1562/686/984 1577/701/984 1578/702/984 -f 1578/702/985 1579/703/985 1560/684/985 -f 1560/684/986 1561/685/986 1578/702/986 -f 1559/683/987 1560/684/987 1579/703/987 -f 1579/703/988 1580/704/988 1559/683/988 -f 1580/704/989 1558/682/989 1559/683/989 -f 1580/704/990 1581/705/990 1558/682/990 -f 1581/705/991 1582/706/991 1558/682/991 -f 1581/705/992 1583/707/992 1582/706/992 -f 1541/669/993 1542/671/993 1558/682/993 -f 1582/706/994 1541/669/994 1558/682/994 -f 1582/706/995 1556/680/995 1540/670/995 -f 1540/670/996 1541/669/996 1582/706/996 -f 1583/707/997 1556/680/997 1582/706/997 -f 1583/707/998 1584/708/998 1556/680/998 -f 1584/708/999 1557/681/999 1556/680/999 -f 1584/708/1000 1585/709/1000 1557/681/1000 -f 1585/709/1001 1564/688/1001 1557/681/1001 -f 1585/709/1002 1586/710/1002 1564/688/1002 -f 1565/689/1003 1564/688/1003 1586/710/1003 -f 1586/710/1004 1587/711/1004 1565/689/1004 -f 1587/711/1005 1566/690/1005 1565/689/1005 -f 1587/711/1006 1588/712/1006 1566/690/1006 -f 1567/691/1007 1566/690/1007 1588/712/1007 -f 1588/712/1008 1589/713/1008 1567/691/1008 -f 1568/692/1009 1567/691/1009 1589/713/1009 -f 1589/713/1010 1590/714/1010 1568/692/1010 -f 1569/693/1011 1568/692/1011 1590/714/1011 -f 1590/714/1012 1591/715/1012 1570/694/1012 -f 1570/694/1013 1569/693/1013 1590/714/1013 -f 1575/699/1014 1570/694/1014 1591/715/1014 -f 1591/715/1015 1592/716/1015 1575/699/1015 -f 1574/698/1016 1575/699/1016 1592/716/1016 -f 1592/716/1017 1593/717/1017 1574/698/1017 -f 1573/697/1018 1574/698/1018 1593/717/1018 -f 1588/712/1019 1518/718/1019 1523/719/1019 -f 1589/713/1020 1588/712/1020 1523/719/1020 -f 1523/719/1021 1522/720/1021 1589/713/1021 -f 1518/718/1022 1588/712/1022 1587/711/1022 -f 1518/718/1023 1587/711/1023 1533/721/1023 -f 1533/721/1024 1587/711/1024 1586/710/1024 -f 1586/710/1025 1534/722/1025 1533/721/1025 -f 1534/722/1026 1586/710/1026 1585/709/1026 -f 1585/709/1027 1532/723/1027 1534/722/1027 -f 1532/723/1028 1585/709/1028 1584/708/1028 -f 1532/723/1029 1584/708/1029 1527/724/1029 -f 1527/724/1030 1584/708/1030 1583/707/1030 -f 1583/707/1031 1528/725/1031 1527/724/1031 -f 1528/725/1032 1583/707/1032 1581/705/1032 -f 1528/725/1033 1581/705/1033 1580/704/1033 -f 1580/704/1034 1529/726/1034 1528/725/1034 -f 1529/726/1035 1580/704/1035 1579/703/1035 -f 1579/703/1036 1530/727/1036 1529/726/1036 -f 1530/727/1037 1579/703/1037 1578/702/1037 -f 1578/702/1038 1531/728/1038 1530/727/1038 -f 1576/700/1039 1572/696/1039 1594/729/1039 -f 1594/729/1040 1572/696/1040 1573/697/1040 -f 1573/697/1041 1593/717/1041 1594/729/1041 -f 1521/730/1042 1594/729/1042 1593/717/1042 -f 1524/731/1043 1521/730/1043 1593/717/1043 -f 1524/731/1044 1593/717/1044 1592/716/1044 -f 1524/731/1045 1592/716/1045 1591/715/1045 -f 1591/715/1046 1526/732/1046 1524/731/1046 -f 1525/733/1047 1526/732/1047 1591/715/1047 -f 1525/733/1048 1591/715/1048 1590/714/1048 -f 1522/720/1049 1590/714/1049 1589/713/1049 -f 1539/668/1050 1516/679/1050 1540/670/1050 -f 1516/679/1051 1539/668/1051 1549/661/1051 -f 1555/663/1052 1517/678/1052 1535/665/1052 -f 1555/663/1053 1549/661/1053 1517/678/1053 -f 1594/729/1054 1521/730/1054 1520/734/1054 -f 1578/702/1055 1577/701/1055 1531/728/1055 -f 1576/700/1056 1520/734/1056 1519/735/1056 -f 1520/734/1057 1576/700/1057 1594/729/1057 -f 1519/735/1058 1577/701/1058 1576/700/1058 -f 1577/701/1059 1519/735/1059 1531/728/1059 -f 1525/733/1060 1590/714/1060 1522/720/1060 -f 1563/687/1061 1548/674/1061 1571/695/1061 -f 1595/736/1062 1596/737/1062 1613/738/1062 -f 1596/737/1063 1597/739/1063 1614/740/1063 -f 1596/737/1064 1614/740/1064 1613/738/1064 -f 1597/739/1065 1598/741/1065 1615/742/1065 -f 1597/739/1066 1615/742/1066 1614/740/1066 -f 1598/741/1067 1599/743/1067 1616/744/1067 -f 1598/741/1068 1616/744/1068 1615/742/1068 -f 1599/743/1069 1600/745/1069 1617/746/1069 -f 1599/743/1070 1617/746/1070 1616/744/1070 -f 1600/745/1071 1601/747/1071 1618/748/1071 -f 1600/745/1072 1618/748/1072 1617/746/1072 -f 1601/747/1073 1602/749/1073 1619/750/1073 -f 1601/747/1074 1619/750/1074 1618/748/1074 -f 1602/749/1075 1603/751/1075 1620/752/1075 -f 1602/749/1076 1620/752/1076 1619/750/1076 -f 1603/751/1077 1604/753/1077 1621/754/1077 -f 1603/751/1078 1621/754/1078 1620/752/1078 -f 1604/753/1079 1605/755/1079 1622/756/1079 -f 1604/753/1080 1622/756/1080 1621/754/1080 -f 1605/755/1081 1606/757/1081 1623/758/1081 -f 1605/755/1082 1623/758/1082 1622/756/1082 -f 1606/757/1083 1607/759/1083 1624/760/1083 -f 1606/757/1084 1624/760/1084 1623/758/1084 -f 1607/759/1085 1608/761/1085 1625/762/1085 -f 1607/759/1086 1625/762/1086 1624/760/1086 -f 1608/761/1087 1609/763/1087 1626/764/1087 -f 1608/761/1088 1626/764/1088 1625/762/1088 -f 1609/763/1089 1610/765/1089 1627/766/1089 -f 1609/763/1090 1627/766/1090 1626/764/1090 -f 1610/765/1091 1611/767/1091 1628/768/1091 -f 1610/765/1092 1628/768/1092 1627/766/1092 -f 1611/767/1093 1612/769/1093 1628/768/1093 -f 1595/736/1094 1613/738/1094 1629/770/1094 -f 1613/738/1095 1614/740/1095 1630/771/1095 -f 1613/738/1096 1630/771/1096 1629/770/1096 -f 1614/740/1097 1615/742/1097 1631/772/1097 -f 1614/740/1098 1631/772/1098 1630/771/1098 -f 1615/742/1099 1616/744/1099 1632/773/1099 -f 1615/742/1100 1632/773/1100 1631/772/1100 -f 1616/744/1101 1617/746/1101 1633/774/1101 -f 1616/744/1102 1633/774/1102 1632/773/1102 -f 1617/746/1103 1618/748/1103 1634/775/1103 -f 1617/746/1104 1634/775/1104 1633/774/1104 -f 1618/748/1105 1619/750/1105 1635/776/1105 -f 1618/748/1106 1635/776/1106 1634/775/1106 -f 1619/750/1107 1620/752/1107 1636/777/1107 -f 1619/750/1108 1636/777/1108 1635/776/1108 -f 1620/752/1109 1621/754/1109 1637/778/1109 -f 1620/752/1110 1637/778/1110 1636/777/1110 -f 1621/754/1111 1622/756/1111 1638/779/1111 -f 1621/754/1112 1638/779/1112 1637/778/1112 -f 1622/756/1113 1623/758/1113 1639/780/1113 -f 1622/756/1114 1639/780/1114 1638/779/1114 -f 1623/758/1115 1624/760/1115 1640/781/1115 -f 1623/758/1116 1640/781/1116 1639/780/1116 -f 1624/760/1117 1625/762/1117 1641/782/1117 -f 1624/760/1118 1641/782/1118 1640/781/1118 -f 1625/762/1119 1626/764/1119 1642/783/1119 -f 1625/762/1120 1642/783/1120 1641/782/1120 -f 1626/764/1121 1627/766/1121 1643/784/1121 -f 1626/764/1122 1643/784/1122 1642/783/1122 -f 1627/766/1123 1628/768/1123 1644/785/1123 -f 1627/766/1124 1644/785/1124 1643/784/1124 -f 1628/768/1125 1612/769/1125 1644/785/1125 -f 1595/736/1126 1629/770/1126 1645/786/1126 -f 1629/770/1127 1630/771/1127 1646/787/1127 -f 1629/770/1128 1646/787/1128 1645/786/1128 -f 1630/771/1129 1631/772/1129 1647/788/1129 -f 1630/771/1130 1647/788/1130 1646/787/1130 -f 1631/772/1131 1632/773/1131 1648/789/1131 -f 1631/772/1132 1648/789/1132 1647/788/1132 -f 1632/773/1133 1633/774/1133 1649/790/1133 -f 1632/773/1134 1649/790/1134 1648/789/1134 -f 1633/774/1135 1634/775/1135 1650/791/1135 -f 1633/774/1136 1650/791/1136 1649/790/1136 -f 1634/775/1137 1635/776/1137 1651/792/1137 -f 1634/775/1138 1651/792/1138 1650/791/1138 -f 1635/776/1139 1636/777/1139 1652/793/1139 -f 1635/776/1140 1652/793/1140 1651/792/1140 -f 1636/777/1141 1637/778/1141 1653/794/1141 -f 1636/777/1142 1653/794/1142 1652/793/1142 -f 1637/778/1143 1638/779/1143 1654/795/1143 -f 1637/778/1144 1654/795/1144 1653/794/1144 -f 1638/779/1145 1639/780/1145 1655/796/1145 -f 1638/779/1146 1655/796/1146 1654/795/1146 -f 1639/780/1147 1640/781/1147 1656/797/1147 -f 1639/780/1148 1656/797/1148 1655/796/1148 -f 1640/781/1149 1641/782/1149 1657/798/1149 -f 1640/781/1150 1657/798/1150 1656/797/1150 -f 1641/782/1151 1642/783/1151 1658/799/1151 -f 1641/782/1152 1658/799/1152 1657/798/1152 -f 1642/783/1153 1643/784/1153 1659/800/1153 -f 1642/783/1154 1659/800/1154 1658/799/1154 -f 1643/784/1155 1644/785/1155 1660/801/1155 -f 1643/784/1156 1660/801/1156 1659/800/1156 -f 1644/785/1157 1612/769/1157 1660/801/1157 -f 1595/736/1158 1645/786/1158 1661/802/1158 -f 1645/786/1159 1646/787/1159 1662/803/1159 -f 1645/786/1160 1662/803/1160 1661/802/1160 -f 1646/787/1161 1647/788/1161 1663/804/1161 -f 1646/787/1162 1663/804/1162 1662/803/1162 -f 1647/788/1163 1648/789/1163 1664/805/1163 -f 1647/788/1164 1664/805/1164 1663/804/1164 -f 1648/789/1165 1649/790/1165 1665/806/1165 -f 1648/789/1166 1665/806/1166 1664/805/1166 -f 1649/790/1167 1650/791/1167 1666/807/1167 -f 1649/790/1168 1666/807/1168 1665/806/1168 -f 1650/791/1169 1651/792/1169 1667/808/1169 -f 1650/791/1170 1667/808/1170 1666/807/1170 -f 1651/792/1171 1652/793/1171 1668/809/1171 -f 1651/792/1172 1668/809/1172 1667/808/1172 -f 1652/793/1173 1653/794/1173 1669/810/1173 -f 1652/793/1174 1669/810/1174 1668/809/1174 -f 1653/794/1175 1654/795/1175 1670/811/1175 -f 1653/794/1176 1670/811/1176 1669/810/1176 -f 1654/795/1177 1655/796/1177 1671/812/1177 -f 1654/795/1178 1671/812/1178 1670/811/1178 -f 1655/796/1179 1656/797/1179 1672/813/1179 -f 1655/796/1180 1672/813/1180 1671/812/1180 -f 1656/797/1181 1657/798/1181 1673/814/1181 -f 1656/797/1182 1673/814/1182 1672/813/1182 -f 1657/798/1183 1658/799/1183 1674/815/1183 -f 1657/798/1184 1674/815/1184 1673/814/1184 -f 1658/799/1185 1659/800/1185 1675/816/1185 -f 1658/799/1186 1675/816/1186 1674/815/1186 -f 1659/800/1187 1660/801/1187 1676/817/1187 -f 1659/800/1188 1676/817/1188 1675/816/1188 -f 1660/801/1189 1612/769/1189 1676/817/1189 -f 1595/736/1190 1661/802/1190 1677/818/1190 -f 1661/802/1191 1662/803/1191 1678/819/1191 -f 1661/802/1192 1678/819/1192 1677/818/1192 -f 1662/803/1193 1663/804/1193 1679/820/1193 -f 1662/803/1194 1679/820/1194 1678/819/1194 -f 1663/804/1195 1664/805/1195 1680/821/1195 -f 1663/804/1196 1680/821/1196 1679/820/1196 -f 1664/805/1197 1665/806/1197 1681/822/1197 -f 1664/805/1198 1681/822/1198 1680/821/1198 -f 1665/806/1199 1666/807/1199 1682/823/1199 -f 1665/806/1200 1682/823/1200 1681/822/1200 -f 1666/807/1201 1667/808/1201 1683/824/1201 -f 1666/807/1202 1683/824/1202 1682/823/1202 -f 1667/808/1203 1668/809/1203 1684/825/1203 -f 1667/808/1204 1684/825/1204 1683/824/1204 -f 1668/809/1205 1669/810/1205 1685/826/1205 -f 1668/809/1206 1685/826/1206 1684/825/1206 -f 1669/810/1207 1670/811/1207 1686/827/1207 -f 1669/810/1208 1686/827/1208 1685/826/1208 -f 1670/811/1209 1671/812/1209 1687/828/1209 -f 1670/811/1210 1687/828/1210 1686/827/1210 -f 1671/812/1211 1672/813/1211 1688/829/1211 -f 1671/812/1212 1688/829/1212 1687/828/1212 -f 1672/813/1213 1673/814/1213 1689/830/1213 -f 1672/813/1214 1689/830/1214 1688/829/1214 -f 1673/814/1215 1674/815/1215 1690/831/1215 -f 1673/814/1216 1690/831/1216 1689/830/1216 -f 1674/815/1217 1675/816/1217 1691/832/1217 -f 1674/815/1218 1691/832/1218 1690/831/1218 -f 1675/816/1219 1676/817/1219 1692/833/1219 -f 1675/816/1220 1692/833/1220 1691/832/1220 -f 1676/817/1221 1612/769/1221 1692/833/1221 -f 1595/736/1222 1677/818/1222 1693/834/1222 -f 1677/818/1223 1678/819/1223 1694/835/1223 -f 1677/818/1224 1694/835/1224 1693/834/1224 -f 1678/819/1225 1679/820/1225 1695/836/1225 -f 1678/819/1226 1695/836/1226 1694/835/1226 -f 1679/820/1227 1680/821/1227 1696/837/1227 -f 1679/820/1228 1696/837/1228 1695/836/1228 -f 1680/821/1229 1681/822/1229 1697/838/1229 -f 1680/821/1230 1697/838/1230 1696/837/1230 -f 1681/822/1231 1682/823/1231 1698/839/1231 -f 1681/822/1232 1698/839/1232 1697/838/1232 -f 1682/823/1233 1683/824/1233 1699/840/1233 -f 1682/823/1234 1699/840/1234 1698/839/1234 -f 1683/824/1235 1684/825/1235 1700/841/1235 -f 1683/824/1236 1700/841/1236 1699/840/1236 -f 1684/825/1237 1685/826/1237 1701/842/1237 -f 1684/825/1238 1701/842/1238 1700/841/1238 -f 1685/826/1239 1686/827/1239 1702/843/1239 -f 1685/826/1240 1702/843/1240 1701/842/1240 -f 1686/827/1241 1687/828/1241 1703/844/1241 -f 1686/827/1242 1703/844/1242 1702/843/1242 -f 1687/828/1243 1688/829/1243 1704/845/1243 -f 1687/828/1244 1704/845/1244 1703/844/1244 -f 1688/829/1245 1689/830/1245 1705/846/1245 -f 1688/829/1246 1705/846/1246 1704/845/1246 -f 1689/830/1247 1690/831/1247 1706/847/1247 -f 1689/830/1248 1706/847/1248 1705/846/1248 -f 1690/831/1249 1691/832/1249 1707/848/1249 -f 1690/831/1250 1707/848/1250 1706/847/1250 -f 1691/832/1251 1692/833/1251 1708/849/1251 -f 1691/832/1252 1708/849/1252 1707/848/1252 -f 1692/833/1253 1612/769/1253 1708/849/1253 -f 1595/736/1254 1693/834/1254 1709/850/1254 -f 1693/834/1255 1694/835/1255 1710/851/1255 -f 1693/834/1256 1710/851/1256 1709/850/1256 -f 1694/835/1257 1695/836/1257 1711/852/1257 -f 1694/835/1258 1711/852/1258 1710/851/1258 -f 1695/836/1259 1696/837/1259 1712/853/1259 -f 1695/836/1260 1712/853/1260 1711/852/1260 -f 1696/837/1261 1697/838/1261 1713/854/1261 -f 1696/837/1262 1713/854/1262 1712/853/1262 -f 1697/838/1263 1698/839/1263 1714/855/1263 -f 1697/838/1264 1714/855/1264 1713/854/1264 -f 1698/839/1265 1699/840/1265 1715/856/1265 -f 1698/839/1266 1715/856/1266 1714/855/1266 -f 1699/840/1267 1700/841/1267 1716/857/1267 -f 1699/840/1268 1716/857/1268 1715/856/1268 -f 1700/841/1269 1701/842/1269 1717/858/1269 -f 1700/841/1270 1717/858/1270 1716/857/1270 -f 1701/842/1271 1702/843/1271 1718/859/1271 -f 1701/842/1272 1718/859/1272 1717/858/1272 -f 1702/843/1273 1703/844/1273 1719/860/1273 -f 1702/843/1274 1719/860/1274 1718/859/1274 -f 1703/844/1275 1704/845/1275 1720/861/1275 -f 1703/844/1276 1720/861/1276 1719/860/1276 -f 1704/845/1277 1705/846/1277 1721/862/1277 -f 1704/845/1278 1721/862/1278 1720/861/1278 -f 1705/846/1279 1706/847/1279 1722/863/1279 -f 1705/846/1280 1722/863/1280 1721/862/1280 -f 1706/847/1281 1707/848/1281 1723/864/1281 -f 1706/847/1282 1723/864/1282 1722/863/1282 -f 1707/848/1283 1708/849/1283 1724/865/1283 -f 1707/848/1284 1724/865/1284 1723/864/1284 -f 1708/849/1285 1612/769/1285 1724/865/1285 -f 1853/866/1286 1709/850/1286 1725/867/1286 -f 1709/850/1287 1710/851/1287 1726/868/1287 -f 1709/850/1288 1726/868/1288 1725/867/1288 -f 1710/851/1289 1711/852/1289 1727/869/1289 -f 1710/851/1290 1727/869/1290 1726/868/1290 -f 1711/852/1291 1712/853/1291 1728/870/1291 -f 1711/852/1292 1728/870/1292 1727/869/1292 -f 1712/853/1293 1713/854/1293 1729/871/1293 -f 1712/853/1294 1729/871/1294 1728/870/1294 -f 1713/854/1295 1714/855/1295 1730/872/1295 -f 1713/854/1296 1730/872/1296 1729/871/1296 -f 1714/855/1297 1715/856/1297 1731/873/1297 -f 1714/855/1298 1731/873/1298 1730/872/1298 -f 1715/856/1299 1716/857/1299 1732/874/1299 -f 1715/856/1300 1732/874/1300 1731/873/1300 -f 1716/857/1301 1717/858/1301 1733/875/1301 -f 1716/857/1302 1733/875/1302 1732/874/1302 -f 1717/858/1303 1718/859/1303 1734/876/1303 -f 1717/858/1304 1734/876/1304 1733/875/1304 -f 1718/859/1305 1719/860/1305 1735/877/1305 -f 1718/859/1306 1735/877/1306 1734/876/1306 -f 1719/860/1307 1720/861/1307 1736/878/1307 -f 1719/860/1308 1736/878/1308 1735/877/1308 -f 1720/861/1309 1721/862/1309 1737/879/1309 -f 1720/861/1310 1737/879/1310 1736/878/1310 -f 1721/862/1311 1722/863/1311 1738/880/1311 -f 1721/862/1312 1738/880/1312 1737/879/1312 -f 1722/863/1313 1723/864/1313 1739/881/1313 -f 1722/863/1314 1739/881/1314 1738/880/1314 -f 1723/864/1315 1724/865/1315 1740/882/1315 -f 1723/864/1316 1740/882/1316 1739/881/1316 -f 1724/865/1317 1612/769/1317 1740/882/1317 -f 1854/866/1318 1725/867/1318 1741/883/1318 -f 1725/867/1319 1726/868/1319 1742/884/1319 -f 1725/867/1320 1742/884/1320 1741/883/1320 -f 1726/868/1321 1727/869/1321 1743/885/1321 -f 1726/868/1322 1743/885/1322 1742/884/1322 -f 1727/869/1323 1728/870/1323 1744/886/1323 -f 1727/869/1324 1744/886/1324 1743/885/1324 -f 1728/870/1325 1729/871/1325 1745/887/1325 -f 1728/870/1326 1745/887/1326 1744/886/1326 -f 1729/871/1327 1730/872/1327 1746/888/1327 -f 1729/871/1327 1746/888/1327 1745/887/1327 -f 1730/872/1328 1731/873/1328 1747/889/1328 -f 1730/872/1329 1747/889/1329 1746/888/1329 -f 1731/873/1330 1732/874/1330 1748/890/1330 -f 1731/873/1331 1748/890/1331 1747/889/1331 -f 1732/874/1332 1733/875/1332 1749/891/1332 -f 1732/874/1333 1749/891/1333 1748/890/1333 -f 1733/875/1334 1734/876/1334 1750/892/1334 -f 1733/875/1335 1750/892/1335 1749/891/1335 -f 1734/876/1336 1735/877/1336 1751/893/1336 -f 1734/876/1337 1751/893/1337 1750/892/1337 -f 1735/877/1338 1736/878/1338 1752/894/1338 -f 1735/877/1339 1752/894/1339 1751/893/1339 -f 1736/878/1340 1737/879/1340 1753/895/1340 -f 1736/878/1341 1753/895/1341 1752/894/1341 -f 1737/879/1342 1738/880/1342 1754/896/1342 -f 1737/879/1343 1754/896/1343 1753/895/1343 -f 1738/880/1344 1739/881/1344 1755/897/1344 -f 1738/880/1345 1755/897/1345 1754/896/1345 -f 1739/881/1346 1740/882/1346 1756/898/1346 -f 1739/881/1347 1756/898/1347 1755/897/1347 -f 1740/882/1348 1855/899/1348 1756/898/1348 -f 1856/866/1349 1741/883/1349 1757/900/1349 -f 1741/883/1350 1742/884/1350 1758/901/1350 -f 1741/883/1351 1758/901/1351 1757/900/1351 -f 1742/884/1352 1743/885/1352 1759/902/1352 -f 1742/884/1353 1759/902/1353 1758/901/1353 -f 1743/885/1354 1744/886/1354 1760/903/1354 -f 1743/885/1355 1760/903/1355 1759/902/1355 -f 1744/886/1356 1745/887/1356 1761/904/1356 -f 1744/886/1357 1761/904/1357 1760/903/1357 -f 1745/887/1358 1746/888/1358 1762/905/1358 -f 1745/887/1359 1762/905/1359 1761/904/1359 -f 1746/888/1360 1747/889/1360 1763/906/1360 -f 1746/888/1361 1763/906/1361 1762/905/1361 -f 1747/889/1362 1748/890/1362 1764/907/1362 -f 1747/889/1363 1764/907/1363 1763/906/1363 -f 1748/890/1364 1749/891/1364 1765/908/1364 -f 1748/890/1365 1765/908/1365 1764/907/1365 -f 1749/891/1366 1750/892/1366 1766/909/1366 -f 1749/891/1367 1766/909/1367 1765/908/1367 -f 1750/892/1368 1751/893/1368 1767/910/1368 -f 1750/892/1369 1767/910/1369 1766/909/1369 -f 1751/893/1370 1752/894/1370 1768/911/1370 -f 1751/893/1371 1768/911/1371 1767/910/1371 -f 1752/894/1372 1753/895/1372 1769/912/1372 -f 1752/894/1373 1769/912/1373 1768/911/1373 -f 1753/895/1374 1754/896/1374 1770/913/1374 -f 1753/895/1375 1770/913/1375 1769/912/1375 -f 1754/896/1376 1755/897/1376 1771/914/1376 -f 1754/896/1377 1771/914/1377 1770/913/1377 -f 1755/897/1378 1756/898/1378 1772/915/1378 -f 1755/897/1379 1772/915/1379 1771/914/1379 -f 1756/898/1380 1857/899/1380 1772/915/1380 -f 1858/866/1381 1757/900/1381 1773/916/1381 -f 1757/900/1382 1758/901/1382 1774/917/1382 -f 1757/900/1383 1774/917/1383 1773/916/1383 -f 1758/901/1384 1759/902/1384 1775/918/1384 -f 1758/901/1385 1775/918/1385 1774/917/1385 -f 1759/902/1386 1760/903/1386 1776/919/1386 -f 1759/902/1387 1776/919/1387 1775/918/1387 -f 1760/903/1388 1761/904/1388 1777/920/1388 -f 1760/903/1389 1777/920/1389 1776/919/1389 -f 1761/904/1390 1762/905/1390 1778/921/1390 -f 1761/904/1390 1778/921/1390 1777/920/1390 -f 1762/905/1391 1763/906/1391 1779/922/1391 -f 1762/905/1392 1779/922/1392 1778/921/1392 -f 1763/906/1393 1764/907/1393 1780/923/1393 -f 1763/906/1394 1780/923/1394 1779/922/1394 -f 1764/907/1395 1765/908/1395 1781/924/1395 -f 1764/907/1396 1781/924/1396 1780/923/1396 -f 1765/908/1397 1766/909/1397 1782/925/1397 -f 1765/908/1398 1782/925/1398 1781/924/1398 -f 1766/909/1399 1767/910/1399 1783/926/1399 -f 1766/909/1400 1783/926/1400 1782/925/1400 -f 1767/910/1401 1768/911/1401 1784/927/1401 -f 1767/910/1402 1784/927/1402 1783/926/1402 -f 1768/911/1403 1769/912/1403 1785/928/1403 -f 1768/911/1404 1785/928/1404 1784/927/1404 -f 1769/912/1405 1770/913/1405 1786/929/1405 -f 1769/912/1406 1786/929/1406 1785/928/1406 -f 1770/913/1407 1771/914/1407 1787/930/1407 -f 1770/913/1408 1787/930/1408 1786/929/1408 -f 1771/914/1409 1772/915/1409 1788/931/1409 -f 1771/914/1410 1788/931/1410 1787/930/1410 -f 1772/915/1411 1859/899/1411 1788/931/1411 -f 1860/866/1412 1773/916/1412 1789/932/1412 -f 1773/916/1413 1774/917/1413 1790/933/1413 -f 1773/916/1414 1790/933/1414 1789/932/1414 -f 1774/917/1415 1775/918/1415 1791/934/1415 -f 1774/917/1416 1791/934/1416 1790/933/1416 -f 1775/918/1417 1776/919/1417 1792/935/1417 -f 1775/918/1418 1792/935/1418 1791/934/1418 -f 1776/919/1419 1777/920/1419 1793/936/1419 -f 1776/919/1420 1793/936/1420 1792/935/1420 -f 1777/920/1421 1778/921/1421 1794/937/1421 -f 1777/920/1422 1794/937/1422 1793/936/1422 -f 1778/921/1423 1779/922/1423 1795/938/1423 -f 1778/921/1424 1795/938/1424 1794/937/1424 -f 1779/922/1425 1780/923/1425 1796/939/1425 -f 1779/922/1426 1796/939/1426 1795/938/1426 -f 1780/923/1427 1781/924/1427 1797/940/1427 -f 1780/923/1428 1797/940/1428 1796/939/1428 -f 1781/924/1429 1782/925/1429 1798/941/1429 -f 1781/924/1430 1798/941/1430 1797/940/1430 -f 1782/925/1431 1783/926/1431 1799/942/1431 -f 1782/925/1432 1799/942/1432 1798/941/1432 -f 1783/926/1433 1784/927/1433 1800/943/1433 -f 1783/926/1434 1800/943/1434 1799/942/1434 -f 1784/927/1435 1785/928/1435 1801/944/1435 -f 1784/927/1436 1801/944/1436 1800/943/1436 -f 1785/928/1437 1786/929/1437 1802/945/1437 -f 1785/928/1438 1802/945/1438 1801/944/1438 -f 1786/929/1439 1787/930/1439 1803/946/1439 -f 1786/929/1440 1803/946/1440 1802/945/1440 -f 1787/930/1441 1788/931/1441 1804/947/1441 -f 1787/930/1442 1804/947/1442 1803/946/1442 -f 1788/931/1443 1861/899/1443 1804/947/1443 -f 1595/736/1444 1862/948/1444 1805/949/1444 -f 1863/948/1445 1864/950/1445 1806/951/1445 -f 1865/948/1446 1806/951/1446 1805/949/1446 -f 1866/950/1447 1867/952/1447 1807/953/1447 -f 1868/950/1448 1807/953/1448 1806/951/1448 -f 1869/952/1449 1870/954/1449 1808/955/1449 -f 1871/952/1450 1808/955/1450 1807/953/1450 -f 1872/954/1451 1873/956/1451 1809/957/1451 -f 1874/954/1452 1809/957/1452 1808/955/1452 -f 1875/956/1453 1876/958/1453 1810/959/1453 -f 1877/956/1454 1810/959/1454 1809/957/1454 -f 1878/958/1455 1879/960/1455 1811/961/1455 -f 1880/958/1456 1811/961/1456 1810/959/1456 -f 1881/960/1457 1882/962/1457 1812/963/1457 -f 1883/960/1458 1812/963/1458 1811/961/1458 -f 1884/962/1459 1885/964/1459 1813/965/1459 -f 1886/962/1460 1813/965/1460 1812/963/1460 -f 1887/964/1461 1888/966/1461 1814/967/1461 -f 1889/964/1462 1814/967/1462 1813/965/1462 -f 1890/966/1463 1891/968/1463 1815/969/1463 -f 1892/966/1464 1815/969/1464 1814/967/1464 -f 1893/968/1465 1894/970/1465 1816/971/1465 -f 1895/968/1466 1816/971/1466 1815/969/1466 -f 1896/970/1467 1897/972/1467 1817/973/1467 -f 1898/970/1468 1817/973/1468 1816/971/1468 -f 1899/972/1469 1900/974/1469 1818/975/1469 -f 1901/972/1470 1818/975/1470 1817/973/1470 -f 1902/974/1471 1903/976/1471 1819/977/1471 -f 1904/974/1472 1819/977/1472 1818/975/1472 -f 1905/976/1473 1906/978/1473 1820/979/1473 -f 1907/976/1474 1820/979/1474 1819/977/1474 -f 1908/978/1475 1612/769/1475 1820/979/1475 -f 1595/736/1476 1805/949/1476 1821/980/1476 -f 1805/949/1477 1806/951/1477 1822/981/1477 -f 1805/949/1478 1822/981/1478 1821/980/1478 -f 1806/951/1479 1807/953/1479 1823/982/1479 -f 1806/951/1480 1823/982/1480 1822/981/1480 -f 1807/953/1481 1808/955/1481 1824/983/1481 -f 1807/953/1482 1824/983/1482 1823/982/1482 -f 1808/955/1483 1809/957/1483 1825/984/1483 -f 1808/955/1484 1825/984/1484 1824/983/1484 -f 1809/957/1485 1810/959/1485 1826/985/1485 -f 1809/957/1485 1826/985/1485 1825/984/1485 -f 1810/959/1486 1811/961/1486 1827/986/1486 -f 1810/959/1487 1827/986/1487 1826/985/1487 -f 1811/961/1488 1812/963/1488 1828/987/1488 -f 1811/961/1489 1828/987/1489 1827/986/1489 -f 1812/963/1490 1813/965/1490 1829/988/1490 -f 1812/963/1491 1829/988/1491 1828/987/1491 -f 1813/965/1492 1814/967/1492 1830/989/1492 -f 1813/965/1493 1830/989/1493 1829/988/1493 -f 1814/967/1494 1815/969/1494 1831/990/1494 -f 1814/967/1495 1831/990/1495 1830/989/1495 -f 1815/969/1496 1816/971/1496 1832/991/1496 -f 1815/969/1497 1832/991/1497 1831/990/1497 -f 1816/971/1498 1817/973/1498 1833/992/1498 -f 1816/971/1499 1833/992/1499 1832/991/1499 -f 1817/973/1500 1818/975/1500 1834/993/1500 -f 1817/973/1501 1834/993/1501 1833/992/1501 -f 1818/975/1502 1819/977/1502 1835/994/1502 -f 1818/975/1503 1835/994/1503 1834/993/1503 -f 1819/977/1504 1820/979/1504 1836/995/1504 -f 1819/977/1505 1836/995/1505 1835/994/1505 -f 1820/979/1506 1612/769/1506 1836/995/1506 -f 1595/736/1507 1821/980/1507 1837/996/1507 -f 1821/980/1508 1822/981/1508 1838/997/1508 -f 1821/980/1509 1838/997/1509 1837/996/1509 -f 1822/981/1510 1823/982/1510 1839/998/1510 -f 1822/981/1511 1839/998/1511 1838/997/1511 -f 1823/982/1512 1824/983/1512 1840/999/1512 -f 1823/982/1513 1840/999/1513 1839/998/1513 -f 1824/983/1514 1825/984/1514 1841/1000/1514 -f 1824/983/1515 1841/1000/1515 1840/999/1515 -f 1825/984/1516 1826/985/1516 1842/1001/1516 -f 1825/984/1517 1842/1001/1517 1841/1000/1517 -f 1826/985/1518 1827/986/1518 1843/1002/1518 -f 1826/985/1519 1843/1002/1519 1842/1001/1519 -f 1827/986/1520 1828/987/1520 1844/1003/1520 -f 1827/986/1521 1844/1003/1521 1843/1002/1521 -f 1828/987/1522 1829/988/1522 1845/1004/1522 -f 1828/987/1523 1845/1004/1523 1844/1003/1523 -f 1829/988/1524 1830/989/1524 1846/1005/1524 -f 1829/988/1525 1846/1005/1525 1845/1004/1525 -f 1830/989/1526 1831/990/1526 1847/1006/1526 -f 1830/989/1527 1847/1006/1527 1846/1005/1527 -f 1831/990/1528 1832/991/1528 1848/1007/1528 -f 1831/990/1529 1848/1007/1529 1847/1006/1529 -f 1832/991/1530 1833/992/1530 1849/1008/1530 -f 1832/991/1531 1849/1008/1531 1848/1007/1531 -f 1833/992/1532 1834/993/1532 1850/1009/1532 -f 1833/992/1533 1850/1009/1533 1849/1008/1533 -f 1834/993/1534 1835/994/1534 1851/1010/1534 -f 1834/993/1535 1851/1010/1535 1850/1009/1535 -f 1835/994/1536 1836/995/1536 1852/1011/1536 -f 1835/994/1537 1852/1011/1537 1851/1010/1537 -f 1836/995/1538 1612/769/1538 1852/1011/1538 -f 1595/736/1539 1837/996/1539 1596/737/1539 -f 1837/996/1540 1838/997/1540 1597/739/1540 -f 1837/996/1541 1597/739/1541 1596/737/1541 -f 1838/997/1542 1839/998/1542 1598/741/1542 -f 1838/997/1543 1598/741/1543 1597/739/1543 -f 1839/998/1544 1840/999/1544 1599/743/1544 -f 1839/998/1545 1599/743/1545 1598/741/1545 -f 1840/999/1546 1841/1000/1546 1600/745/1546 -f 1840/999/1547 1600/745/1547 1599/743/1547 -f 1841/1000/1548 1842/1001/1548 1601/747/1548 -f 1841/1000/1549 1601/747/1549 1600/745/1549 -f 1842/1001/1550 1843/1002/1550 1602/749/1550 -f 1842/1001/1551 1602/749/1551 1601/747/1551 -f 1843/1002/1552 1844/1003/1552 1603/751/1552 -f 1843/1002/1553 1603/751/1553 1602/749/1553 -f 1844/1003/1554 1845/1004/1554 1604/753/1554 -f 1844/1003/1555 1604/753/1555 1603/751/1555 -f 1845/1004/1556 1846/1005/1556 1605/755/1556 -f 1845/1004/1557 1605/755/1557 1604/753/1557 -f 1846/1005/1558 1847/1006/1558 1606/757/1558 -f 1846/1005/1559 1606/757/1559 1605/755/1559 -f 1847/1006/1560 1848/1007/1560 1607/759/1560 -f 1847/1006/1561 1607/759/1561 1606/757/1561 -f 1848/1007/1562 1849/1008/1562 1608/761/1562 -f 1848/1007/1563 1608/761/1563 1607/759/1563 -f 1849/1008/1564 1850/1009/1564 1609/763/1564 -f 1849/1008/1565 1609/763/1565 1608/761/1565 -f 1850/1009/1566 1851/1010/1566 1610/765/1566 -f 1850/1009/1567 1610/765/1567 1609/763/1567 -f 1851/1010/1568 1852/1011/1568 1611/767/1568 -f 1851/1010/1569 1611/767/1569 1610/765/1569 -f 1852/1011/1570 1612/769/1570 1611/767/1570 -o dieshor1 -v 0.389528 1.373023 -0.344602 -v 0.603196 1.373023 -0.348864 -v 0.494333 1.263206 -0.182360 -v 0.494362 1.263227 -0.514561 -v 0.564583 1.250478 -0.499110 -v 0.619927 1.239734 -0.457401 -v 0.605219 1.241798 -0.219971 -v 0.542537 1.254933 -0.189400 -v 0.658893 1.231205 -0.372987 -v 0.633912 1.236972 -0.258049 -v 0.653657 1.232276 -0.300519 -v 0.343947 1.233769 -0.278473 -v 0.328496 1.230876 -0.348460 -v 0.335535 1.232512 -0.396402 -v 0.385655 1.242419 -0.473791 -v 0.446654 1.254013 -0.507522 -v 0.369265 1.239284 -0.239520 -v 0.446654 1.254061 -0.189400 -v 0.404189 1.246377 -0.209141 -v 0.494571 1.372658 -0.114997 -v 0.427186 1.372658 -0.124891 -v 0.367499 1.372658 -0.152638 -v 0.318411 1.372658 -0.195338 -v 0.282826 1.372658 -0.250088 -v 0.263642 1.372658 -0.313987 -v 0.263642 1.372658 -0.382934 -v 0.282826 1.372658 -0.446833 -v 0.318412 1.372658 -0.501583 -v 0.367499 1.372658 -0.544283 -v 0.427186 1.372658 -0.572031 -v 0.494571 1.372658 -0.581925 -v 0.561956 1.372658 -0.572031 -v 0.621643 1.372658 -0.544283 -v 0.670731 1.372658 -0.501583 -v 0.718141 1.372658 -0.415846 -v 0.728036 1.372658 -0.348461 -v 0.706318 1.372658 -0.250088 -v 0.670731 1.372658 -0.195338 -v 0.621643 1.372658 -0.152639 -v 0.561956 1.372658 -0.124891 -v 0.263583 1.315494 -0.313975 -v 0.282773 1.315494 -0.250053 -v 0.282773 1.315494 -0.446868 -v 0.318372 1.315494 -0.501638 -v 0.367478 1.315495 -0.544354 -v 0.427186 1.315494 -0.572111 -v 0.494596 1.315494 -0.582010 -v 0.562005 1.315494 -0.572112 -v 0.318372 1.315494 -0.195283 -v 0.367478 1.315494 -0.152568 -v 0.427186 1.315494 -0.124810 -v 0.494595 1.315494 -0.114913 -v 0.562005 1.315493 -0.124810 -v 0.621714 1.315493 -0.152568 -v 0.670819 1.315493 -0.195284 -v 0.621714 1.315494 -0.544354 -v 0.670819 1.315494 -0.501639 -v 0.718246 1.315494 -0.415870 -v 0.728144 1.315494 -0.348461 -v 0.706419 1.315493 -0.250053 -v 0.542537 1.315005 -0.507522 -v 0.470069 1.315005 -0.512758 -v 0.404189 1.315005 -0.487780 -v 0.369265 1.315005 -0.457401 -v 0.335535 1.315005 -0.396402 -v 0.328496 1.315005 -0.348461 -v 0.263583 1.315494 -0.382946 -v 0.335535 1.315005 -0.300519 -v 0.355276 1.315127 -0.258054 -v 0.385656 1.315127 -0.223131 -v 0.424607 1.315004 -0.197812 -v 0.470069 1.315004 -0.184163 -v 0.519122 1.315004 -0.184163 -v 0.564583 1.315004 -0.197812 -v 0.603536 1.315126 -0.223130 -v 0.645245 1.315004 -0.278473 -v 0.658893 1.315004 -0.372987 -v 0.645245 1.315004 -0.418449 -v 0.603536 1.315005 -0.473792 -v 0.494683 0.690761 -2.824126 -v 0.494683 0.409639 -2.804202 -v 0.495012 0.129022 -2.727210 -v 0.495011 0.120736 -2.193231 -v 0.495011 0.118393 -2.189049 -v 0.495011 0.120735 -2.183705 -v 0.495011 0.120672 -1.660389 -v 0.495011 0.118328 -1.655317 -v 0.495011 0.120671 -1.651051 -v 0.495011 0.125437 -1.125772 -v 0.495011 0.123145 -1.120171 -v 0.495011 0.125533 -1.115222 -v 0.495010 0.120640 -0.591683 -v 0.495010 0.118359 -0.586591 -v 0.495010 0.120763 -0.581587 -v 0.495009 0.127390 -0.039513 -v 0.495301 0.445777 0.037393 -v 0.494681 0.690762 0.045669 -v 0.387102 0.431038 -2.804202 -v 0.280018 0.171656 -2.727210 -v 0.276847 0.164001 -2.193230 -v 0.275950 0.161836 -2.189049 -v 0.276847 0.164000 -2.183705 -v 0.276822 0.163942 -1.660389 -v 0.275925 0.161776 -1.655316 -v 0.276821 0.163941 -1.651050 -v 0.278645 0.168344 -1.125771 -v 0.277768 0.166226 -1.120170 -v 0.278682 0.168433 -1.115222 -v 0.276808 0.163912 -0.591684 -v 0.275935 0.161805 -0.586590 -v 0.276855 0.164026 -0.581586 -v 0.279391 0.170149 -0.039512 -v 0.401502 0.464188 0.037393 -v 0.295900 0.491978 -2.804202 -v 0.097706 0.293319 -2.727209 -v 0.091846 0.287461 -2.193230 -v 0.090189 0.285803 -2.189049 -v 0.091845 0.287460 -2.183705 -v 0.091801 0.287415 -1.660389 -v 0.090143 0.285758 -1.655316 -v 0.091800 0.287414 -1.651050 -v 0.095170 0.290785 -1.125771 -v 0.093548 0.289164 -1.120170 -v 0.095237 0.290852 -1.115222 -v 0.091776 0.287392 -0.591683 -v 0.090163 0.285779 -0.586590 -v 0.091864 0.287480 -0.581586 -v 0.096549 0.292166 -0.039512 -v 0.321889 0.517093 0.037393 -v 0.234961 0.583181 -2.804202 -v -0.024171 0.475489 -2.727209 -v -0.031826 0.472319 -2.193230 -v -0.033992 0.471422 -2.189049 -v -0.031827 0.472318 -2.183704 -v -0.031886 0.472294 -1.660389 -v -0.034052 0.471397 -1.655315 -v -0.031887 0.472294 -1.651050 -v -0.027484 0.474118 -1.125771 -v -0.029602 0.473241 -1.120170 -v -0.027395 0.474155 -1.115222 -v -0.031917 0.472282 -0.591683 -v -0.034025 0.471409 -0.586590 -v -0.031803 0.472329 -0.581586 -v -0.025681 0.474866 -0.039511 -v 0.268581 0.596437 0.037393 -v 0.213561 0.690762 -2.804202 -v -0.067057 0.690433 -2.727209 -v -0.075342 0.690433 -2.193229 -v -0.077686 0.690433 -2.189048 -v -0.075344 0.690433 -2.183704 -v -0.075407 0.690433 -1.660389 -v -0.077752 0.690433 -1.655316 -v -0.075409 0.690433 -1.651050 -v -0.070642 0.690433 -1.125771 -v -0.072935 0.690433 -1.120170 -v -0.070547 0.690433 -1.115222 -v -0.075440 0.690433 -0.591682 -v -0.077722 0.690433 -0.586590 -v -0.075317 0.690433 -0.581586 -v -0.068690 0.690433 -0.039512 -v 0.249696 0.690142 0.037393 -v 0.234960 0.798342 -2.804202 -v -0.024422 0.905426 -2.727209 -v -0.032078 0.908597 -2.193230 -v -0.034243 0.909494 -2.189048 -v -0.032079 0.908597 -2.183704 -v -0.032137 0.908622 -1.660389 -v -0.034303 0.909519 -1.655315 -v -0.032138 0.908622 -1.651050 -v -0.027735 0.906798 -1.125771 -v -0.029853 0.907676 -1.120170 -v -0.027647 0.906762 -1.115222 -v -0.032168 0.908634 -0.591683 -v -0.034276 0.909507 -0.586590 -v -0.032055 0.908587 -0.581586 -v -0.025932 0.906051 -0.039511 -v 0.268107 0.783940 0.037393 -v 0.295900 0.889545 -2.804202 -v 0.097241 1.087739 -2.727209 -v 0.091382 1.093597 -2.193230 -v 0.089724 1.095255 -2.189049 -v 0.091381 1.093598 -2.183705 -v 0.091336 1.093643 -1.660389 -v 0.089678 1.095301 -1.655316 -v 0.091335 1.093644 -1.651050 -v 0.094705 1.090274 -1.125771 -v 0.093084 1.091895 -1.120170 -v 0.094773 1.090206 -1.115222 -v 0.091312 1.093666 -0.591683 -v 0.089699 1.095279 -0.586590 -v 0.091399 1.093579 -0.581585 -v 0.096085 1.088893 -0.039511 -v 0.321012 0.863554 0.037393 -v 0.387103 0.950484 -2.804202 -v 0.279411 1.209615 -2.727209 -v 0.276240 1.217270 -2.193230 -v 0.275343 1.219435 -2.189048 -v 0.276239 1.217271 -2.183705 -v 0.276215 1.217330 -1.660389 -v 0.275318 1.219495 -1.655316 -v 0.276215 1.217331 -1.651050 -v 0.278039 1.212927 -1.125771 -v 0.277161 1.215045 -1.120171 -v 0.278075 1.212839 -1.115221 -v 0.276202 1.217360 -0.591683 -v 0.275328 1.219467 -0.586590 -v 0.276249 1.217246 -0.581586 -v 0.278785 1.211123 -0.039511 -v 0.400356 0.916861 0.037393 -v 0.494683 0.971884 -2.804202 -v 0.494354 1.252501 -2.727209 -v 0.494354 1.260786 -2.193230 -v 0.494354 1.263130 -2.189049 -v 0.494354 1.260787 -2.183706 -v 0.494354 1.260851 -1.660389 -v 0.494354 1.263195 -1.655316 -v 0.494354 1.260852 -1.651051 -v 0.494354 1.256086 -1.125771 -v 0.494354 1.258378 -1.120170 -v 0.494354 1.255990 -1.115222 -v 0.494353 1.260883 -0.591683 -v 0.494353 1.263165 -0.586590 -v 0.494353 1.260760 -0.581586 -v 0.494353 1.254133 -0.039512 -v 0.494061 0.935747 0.037393 -v 0.602265 0.950484 -2.804202 -v 0.709348 1.209867 -2.727210 -v 0.712518 1.217521 -2.193231 -v 0.713415 1.219687 -2.189049 -v 0.712519 1.217523 -2.183705 -v 0.712542 1.217581 -1.660389 -v 0.713440 1.219747 -1.655317 -v 0.712543 1.217582 -1.651051 -v 0.710719 1.213179 -1.125772 -v 0.711596 1.215297 -1.120171 -v 0.710682 1.213090 -1.115222 -v 0.712554 1.217611 -0.591684 -v 0.713427 1.219719 -0.586591 -v 0.712507 1.217497 -0.581587 -v 0.709970 1.211375 -0.039512 -v 0.587859 0.917336 0.037393 -v 0.693467 0.889544 -2.804202 -v 0.891660 1.088203 -2.727210 -v 0.897519 1.094062 -2.193231 -v 0.899176 1.095720 -2.189049 -v 0.897520 1.094063 -2.183705 -v 0.897564 1.094108 -1.660390 -v 0.899221 1.095765 -1.655317 -v 0.897565 1.094109 -1.651051 -v 0.894194 1.090738 -1.125772 -v 0.895815 1.092360 -1.120171 -v 0.894126 1.090671 -1.115223 -v 0.897586 1.094131 -0.591684 -v 0.899199 1.095744 -0.586591 -v 0.897499 1.094043 -0.581587 -v 0.892812 1.089357 -0.039513 -v 0.667473 0.864431 0.037393 -v 0.754406 0.798342 -2.804203 -v 1.013537 0.906033 -2.727210 -v 1.021191 0.909204 -2.193231 -v 1.023357 0.910101 -2.189050 -v 1.021192 0.909204 -2.183706 -v 1.021250 0.909229 -1.660390 -v 1.023416 0.910126 -1.655317 -v 1.021251 0.909229 -1.651051 -v 1.016848 0.907405 -1.125772 -v 1.018966 0.908282 -1.120171 -v 1.016759 0.907368 -1.115223 -v 1.021280 0.909241 -0.591684 -v 1.023387 0.910114 -0.586591 -v 1.021166 0.909194 -0.581587 -v 1.015042 0.906658 -0.039513 -v 0.720780 0.785086 0.037393 -v 0.775805 0.690761 -2.804203 -v 1.056422 0.691090 -2.727210 -v 1.064708 0.691090 -2.193231 -v 1.067051 0.691090 -2.189050 -v 1.064709 0.691090 -2.183706 -v 1.064772 0.691090 -1.660390 -v 1.067116 0.691090 -1.655317 -v 1.064773 0.691090 -1.651052 -v 1.060006 0.691090 -1.125773 -v 1.062299 0.691090 -1.120172 -v 1.059910 0.691090 -1.115223 -v 1.064803 0.691090 -0.591684 -v 1.067084 0.691090 -0.586591 -v 1.064680 0.691090 -0.581587 -v 1.058052 0.691090 -0.039513 -v 0.739666 0.691382 0.037393 -v 0.754406 0.583180 -2.804203 -v 1.013788 0.476097 -2.727211 -v 1.021443 0.472926 -2.193231 -v 1.023608 0.472029 -2.189050 -v 1.021444 0.472925 -2.183706 -v 1.021502 0.472901 -1.660390 -v 1.023668 0.472004 -1.655318 -v 1.021503 0.472901 -1.651051 -v 1.017099 0.474725 -1.125772 -v 1.019217 0.473847 -1.120172 -v 1.017010 0.474761 -1.115223 -v 1.021531 0.472889 -0.591684 -v 1.023638 0.472016 -0.586591 -v 1.021417 0.472936 -0.581587 -v 1.015294 0.475472 -0.039513 -v 0.721254 0.597583 0.037393 -v 0.693466 0.491978 -2.804203 -v 0.892125 0.293784 -2.727210 -v 0.897983 0.287925 -2.193231 -v 0.899641 0.286268 -2.189049 -v 0.897984 0.287924 -2.183706 -v 0.898029 0.287880 -1.660390 -v 0.899686 0.286222 -1.655317 -v 0.898029 0.287879 -1.651052 -v 0.894658 0.291249 -1.125773 -v 0.896280 0.289628 -1.120172 -v 0.894590 0.291317 -1.115223 -v 0.898051 0.287857 -0.591684 -v 0.899663 0.286244 -0.586591 -v 0.897963 0.287944 -0.581587 -v 0.893276 0.292630 -0.039513 -v 0.668349 0.517970 0.037393 -v 0.602264 0.431038 -2.804202 -v 0.709955 0.171908 -2.727210 -v 0.713125 0.164253 -2.193231 -v 0.714022 0.162087 -2.189049 -v 0.713125 0.164252 -2.183706 -v 0.713150 0.164193 -1.660390 -v 0.714047 0.162028 -1.655317 -v 0.713150 0.164192 -1.651051 -v 0.711326 0.168596 -1.125772 -v 0.712203 0.166478 -1.120171 -v 0.711289 0.168684 -1.115223 -v 0.713160 0.164164 -0.591684 -v 0.714034 0.162056 -0.586591 -v 0.713113 0.164278 -0.581587 -v 0.710577 0.170400 -0.039513 -v 0.589005 0.464663 0.037393 -v 0.494683 0.690761 -2.824126 -v 0.494683 0.690761 -2.824126 -v 0.494681 0.690762 0.045669 -v 0.494683 0.690761 -2.824126 -v 0.494681 0.690762 0.045669 -v 0.494683 0.690761 -2.824126 -v 0.494681 0.690762 0.045669 -v 0.494683 0.690761 -2.824126 -v 0.494681 0.690762 0.045669 -v 0.775805 0.690761 -2.804203 -v 0.775805 0.690761 -2.804203 -v 1.056422 0.691090 -2.727210 -v 0.775805 0.690761 -2.804203 -v 1.056422 0.691090 -2.727210 -v 1.064708 0.691090 -2.193231 -v 1.056422 0.691090 -2.727210 -v 1.064708 0.691090 -2.193231 -v 1.067051 0.691090 -2.189050 -v 1.064708 0.691090 -2.193231 -v 1.067051 0.691090 -2.189050 -v 1.064709 0.691090 -2.183706 -v 1.067051 0.691090 -2.189050 -v 1.064709 0.691090 -2.183706 -v 1.064772 0.691090 -1.660390 -v 1.064709 0.691090 -2.183706 -v 1.064772 0.691090 -1.660390 -v 1.067116 0.691090 -1.655317 -v 1.064772 0.691090 -1.660390 -v 1.067116 0.691090 -1.655317 -v 1.064773 0.691090 -1.651052 -v 1.067116 0.691090 -1.655317 -v 1.064773 0.691090 -1.651052 -v 1.060006 0.691090 -1.125773 -v 1.064773 0.691090 -1.651052 -v 1.060006 0.691090 -1.125773 -v 1.062299 0.691090 -1.120172 -v 1.060006 0.691090 -1.125773 -v 1.062299 0.691090 -1.120172 -v 1.059910 0.691090 -1.115223 -v 1.062299 0.691090 -1.120172 -v 1.059910 0.691090 -1.115223 -v 1.064803 0.691090 -0.591684 -v 1.059910 0.691090 -1.115223 -v 1.064803 0.691090 -0.591684 -v 1.067084 0.691090 -0.586591 -v 1.064803 0.691090 -0.591684 -v 1.067084 0.691090 -0.586591 -v 1.064680 0.691090 -0.581587 -v 1.067084 0.691090 -0.586591 -v 1.064680 0.691090 -0.581587 -v 1.058052 0.691090 -0.039513 -v 1.064680 0.691090 -0.581587 -v 1.058052 0.691090 -0.039513 -v 0.739666 0.691382 0.037393 -v 1.058052 0.691090 -0.039513 -v 0.739666 0.691382 0.037393 -vt 0.190735 0.839182 -vt 0.193609 0.896941 -vt 0.188361 0.862662 -vt 0.202488 0.916019 -vt 0.202488 0.809306 -vt 0.215244 0.930898 -vt 0.231371 0.940567 -vt 0.268691 0.940567 -vt 0.250031 0.944014 -vt 0.284816 0.930898 -vt 0.297569 0.916019 -vt 0.306446 0.896941 -vt 0.311087 0.850650 -vt 0.311087 0.874675 -vt 0.306446 0.828384 -vt 0.297569 0.809306 -vt 0.284816 0.794427 -vt 0.215244 0.794427 -vt 0.268691 0.784758 -vt 0.250031 0.781310 -vt 0.231371 0.784758 -vt 0.220184 0.862522 -vt 0.278914 0.864007 -vt 0.316566 0.874679 -vt 0.311595 0.896953 -vt 0.311595 0.828371 -vt 0.302033 0.809287 -vt 0.288188 0.794402 -vt 0.270546 0.784730 -vt 0.250027 0.781281 -vt 0.229507 0.784730 -vt 0.302033 0.916038 -vt 0.288188 0.930923 -vt 0.270546 0.940595 -vt 0.250027 0.944044 -vt 0.229507 0.940595 -vt 0.211863 0.930923 -vt 0.198015 0.916038 -vt 0.211863 0.794402 -vt 0.198015 0.809286 -vt 0.185370 0.839173 -vt 0.182831 0.862662 -vt 0.188451 0.896953 -vt 0.235380 0.807236 -vt 0.257535 0.805412 -vt 0.277449 0.814116 -vt 0.287702 0.824701 -vt 0.297313 0.845957 -vt 0.299277 0.862662 -vt 0.316566 0.850646 -vt 0.297313 0.879368 -vt 0.291718 0.894165 -vt 0.282918 0.906335 -vt 0.271340 0.915157 -vt 0.257535 0.919913 -vt 0.242518 0.919913 -vt 0.228713 0.915157 -vt 0.217134 0.906335 -vt 0.205103 0.887050 -vt 0.201273 0.854116 -vt 0.205103 0.838275 -vt 0.250118 0.920541 -vt 0.233667 0.918088 -vt 0.211884 0.907435 -vt 0.266420 0.918088 -vt 0.281121 0.911209 -vt 0.293223 0.900623 -vt 0.301940 0.887050 -vt 0.307152 0.862662 -vt 0.304752 0.845957 -vt 0.287569 0.818990 -vt 0.266421 0.807236 -vt 0.217127 0.818990 -vt 0.206872 0.824701 -vt 0.193507 0.854116 -vt 0.195279 0.879368 -vt 0.202073 0.894167 -vt 0.226030 0.810168 -vt 0.250108 0.804783 -vt 0.750004 -0.000000 -vt 0.750001 0.006942 -vt 0.692940 0.006942 -vt 0.750093 0.033771 -vt 0.688095 0.033771 -vt 0.750092 0.219840 -vt 0.688016 0.219840 -vt 0.750092 0.221297 -vt 0.687994 0.221297 -vt 0.750092 0.223159 -vt 0.688016 0.223159 -vt 0.750092 0.405512 -vt 0.688015 0.405512 -vt 0.750091 0.407280 -vt 0.687993 0.407280 -vt 0.750092 0.408766 -vt 0.688015 0.408766 -vt 0.750092 0.591803 -vt 0.688060 0.591803 -vt 0.750092 0.593755 -vt 0.688038 0.593755 -vt 0.750092 0.595479 -vt 0.688061 0.595479 -vt 0.750091 0.777910 -vt 0.688014 0.777910 -vt 0.750091 0.779685 -vt 0.687993 0.779685 -vt 0.750091 0.781429 -vt 0.688015 0.781429 -vt 0.750092 0.970318 -vt 0.688078 0.970318 -vt 0.750360 0.997116 -vt 0.694611 0.997116 -vt 0.749994 1.000000 -vt 0.637076 0.006942 -vt 0.628102 0.033771 -vt 0.627960 0.219840 -vt 0.627921 0.221297 -vt 0.627960 0.223159 -vt 0.627959 0.405512 -vt 0.627920 0.407280 -vt 0.627959 0.408766 -vt 0.628040 0.591803 -vt 0.628001 0.593755 -vt 0.628041 0.595479 -vt 0.627958 0.777910 -vt 0.627920 0.779685 -vt 0.627960 0.781429 -vt 0.628073 0.970318 -vt 0.639888 0.997116 -vt 0.582560 0.006942 -vt 0.570598 0.033771 -vt 0.570414 0.219840 -vt 0.570363 0.221297 -vt 0.570414 0.223159 -vt 0.570412 0.405512 -vt 0.570361 0.407280 -vt 0.570412 0.408766 -vt 0.570517 0.591803 -vt 0.570466 0.593755 -vt 0.570519 0.595479 -vt 0.570411 0.777910 -vt 0.570361 0.779685 -vt 0.570414 0.781429 -vt 0.570560 0.970318 -vt 0.586276 0.997116 -vt 0.528074 0.006942 -vt 0.514244 0.033771 -vt 0.514038 0.219840 -vt 0.513981 0.221297 -vt 0.514038 0.223159 -vt 0.514036 0.405512 -vt 0.513979 0.407280 -vt 0.514036 0.408766 -vt 0.514154 0.591803 -vt 0.514097 0.593755 -vt 0.514156 0.595479 -vt 0.514035 0.777910 -vt 0.513979 0.779685 -vt 0.514038 0.781429 -vt 0.514202 0.970318 -vt 0.532461 0.997116 -vt 0.470882 0.006942 -vt 0.456431 0.033771 -vt 0.456223 0.219840 -vt 0.456165 0.221297 -vt 0.456223 0.223159 -vt 0.456221 0.405512 -vt 0.456163 0.407280 -vt 0.456221 0.408766 -vt 0.456340 0.591803 -vt 0.456282 0.593755 -vt 0.456342 0.595479 -vt 0.456220 0.777910 -vt 0.456164 0.779685 -vt 0.456223 0.781428 -vt 0.456389 0.970318 -vt 0.475665 0.997116 -vt 0.407110 0.006942 -vt 0.394047 0.033771 -vt 0.393865 0.219840 -vt 0.393815 0.221297 -vt 0.393865 0.223159 -vt 0.393863 0.405512 -vt 0.393813 0.407280 -vt 0.393863 0.408766 -vt 0.393967 0.591803 -vt 0.393917 0.593755 -vt 0.393969 0.595479 -vt 0.393863 0.777910 -vt 0.393814 0.779685 -vt 0.393865 0.781428 -vt 0.394010 0.970318 -vt 0.411746 0.997116 -vt 0.333132 0.006942 -vt 0.324873 0.033771 -vt 0.324761 0.219840 -vt 0.324730 0.221297 -vt 0.324761 0.223159 -vt 0.324760 0.405512 -vt 0.324729 0.407279 -vt 0.324760 0.408766 -vt 0.324824 0.591803 -vt 0.324794 0.593755 -vt 0.324826 0.595479 -vt 0.324760 0.777910 -vt 0.324730 0.779685 -vt 0.324762 0.781428 -vt 0.324851 0.970318 -vt 0.336463 0.997116 -vt -0.249996 -0.000000 -vt 0.249999 0.006942 -vt 0.250113 0.033771 -vt 0.250111 0.219839 -vt 0.250111 0.221297 -vt 0.250111 0.223159 -vt 0.250111 0.405512 -vt 0.250111 0.407279 -vt 0.250111 0.408766 -vt 0.250113 0.591803 -vt 0.250112 0.593755 -vt 0.250113 0.595479 -vt 0.250112 0.777910 -vt 0.250111 0.779684 -vt 0.250112 0.781428 -vt 0.250113 0.970318 -vt 0.250571 0.997116 -vt 0.166866 0.006942 -vt 0.175343 0.033771 -vt 0.175452 0.219839 -vt 0.175482 0.221297 -vt 0.175452 0.223159 -vt 0.175453 0.405512 -vt 0.175483 0.407279 -vt 0.175453 0.408766 -vt 0.175391 0.591803 -vt 0.175421 0.593755 -vt 0.175390 0.595479 -vt 0.175454 0.777910 -vt 0.175483 0.779684 -vt 0.175452 0.781428 -vt 0.175366 0.970318 -vt 0.164592 0.997116 -vt -0.250006 1.000000 -vt 0.092889 0.006942 -vt 0.106149 0.033771 -vt 0.106328 0.219839 -vt 0.106377 0.221297 -vt 0.106328 0.223159 -vt 0.106329 0.405512 -vt 0.106379 0.407279 -vt 0.106329 0.408766 -vt 0.106228 0.591803 -vt 0.106277 0.593755 -vt 0.106225 0.595479 -vt 0.106331 0.777910 -vt 0.106379 0.779684 -vt 0.106328 0.781428 -vt 0.106186 0.970318 -vt 0.089147 0.997116 -vt 0.029118 0.006942 -vt 0.043746 0.033771 -vt 0.043952 0.219839 -vt 0.044009 0.221297 -vt 0.043952 0.223159 -vt 0.043954 0.405512 -vt 0.044011 0.407279 -vt 0.043954 0.408766 -vt 0.043837 0.591803 -vt 0.043893 0.593755 -vt 0.043834 0.595479 -vt 0.043955 0.777910 -vt 0.044011 0.779684 -vt 0.043952 0.781428 -vt 0.043788 0.970318 -vt 0.025104 0.997116 -vt -0.028074 0.006942 -vt -0.014075 0.033771 -vt -0.013872 0.219839 -vt -0.013815 0.221297 -vt -0.013872 0.223159 -vt -0.013870 0.405512 -vt -0.013813 0.407279 -vt -0.013870 0.408766 -vt -0.013986 0.591803 -vt -0.013930 0.593755 -vt -0.013988 0.595479 -vt -0.013869 0.777910 -vt -0.013814 0.779684 -vt -0.013872 0.781428 -vt -0.014034 0.970318 -vt -0.031756 0.997116 -vt 0.971926 0.006942 -vt 0.917440 0.006942 -vt 0.985925 0.033771 -vt 0.929571 0.033771 -vt 0.986128 0.219839 -vt 0.929753 0.219840 -vt 0.986185 0.221297 -vt 0.929803 0.221297 -vt 0.986128 0.223159 -vt 0.929753 0.223159 -vt 0.986130 0.405512 -vt 0.929754 0.405512 -vt 0.986187 0.407279 -vt 0.929804 0.407279 -vt 0.986130 0.408766 -vt 0.929754 0.408766 -vt 0.986014 0.591803 -vt 0.929651 0.591803 -vt 0.986070 0.593755 -vt 0.929701 0.593755 -vt 0.986012 0.595479 -vt 0.929649 0.595479 -vt 0.986131 0.777910 -vt 0.929755 0.777910 -vt 0.986186 0.779684 -vt 0.929804 0.779685 -vt 0.986128 0.781428 -vt 0.929752 0.781428 -vt 0.985966 0.970318 -vt 0.929608 0.970318 -vt 0.968244 0.997116 -vt 0.914411 0.997116 -vt 0.862925 0.006942 -vt 0.872073 0.033771 -vt 0.872212 0.219840 -vt 0.872251 0.221297 -vt 0.872212 0.223159 -vt 0.872213 0.405512 -vt 0.872252 0.407280 -vt 0.872214 0.408766 -vt 0.872134 0.591803 -vt 0.872172 0.593755 -vt 0.872132 0.595479 -vt 0.872214 0.777910 -vt 0.872252 0.779685 -vt 0.872212 0.781428 -vt 0.872101 0.970318 -vt 0.860807 0.997116 -vt 0.807061 0.006942 -vt 0.812088 0.033771 -vt 0.812165 0.219840 -vt 0.812186 0.221297 -vt 0.812165 0.223159 -vt 0.812165 0.405512 -vt 0.812186 0.407280 -vt 0.812165 0.408766 -vt 0.812121 0.591803 -vt 0.812142 0.593755 -vt 0.812120 0.595479 -vt 0.812165 0.777910 -vt 0.812186 0.779685 -vt 0.812164 0.781428 -vt 0.812103 0.970318 -vt 0.806101 0.997116 -vn -0.000000 1.000000 -0.000002 -vn 0.000005 1.000000 -0.000011 -vn -0.174206 0.981504 -0.079382 -vn -0.006136 0.999893 -0.013316 -vn -0.957768 0.001051 0.287540 -vn -0.838452 0.001110 -0.544975 -vn -0.838454 0.001114 -0.544971 -vn -0.656315 0.001192 -0.754486 -vn -0.656308 0.001181 -0.754492 -vn -0.421557 0.001281 -0.906801 -vn -0.145272 0.001395 -0.989391 -vn -0.145283 0.001408 -0.989389 -vn 0.145270 0.001532 -0.989391 -vn 0.145274 0.001527 -0.989390 -vn -0.838451 0.001109 0.544975 -vn -0.838455 0.001101 0.544970 -vn -0.656309 0.001173 0.754492 -vn -0.656305 0.001178 0.754494 -vn -0.421562 0.001275 0.906798 -vn -0.421560 0.001272 0.906800 -vn -0.145269 0.001391 0.989391 -vn 0.145268 0.001519 0.989391 -vn 0.145271 0.001514 0.989391 -vn 0.421557 0.001638 0.906800 -vn 0.421556 0.001639 0.906801 -vn 0.656306 0.001727 0.754493 -vn 0.656314 0.001739 0.754486 -vn 0.421561 0.001646 -0.906799 -vn 0.656304 0.001746 -0.754494 -vn 0.656309 0.001739 -0.754490 -vn 0.875118 0.001811 -0.483906 -vn 0.875115 0.001820 -0.483911 -vn 0.989389 0.001885 -0.145280 -vn 0.989389 0.001886 -0.145281 -vn 0.976485 0.001860 0.215577 -vn 0.976484 0.001853 0.215580 -vn 0.838448 0.001813 0.544979 -vn 0.838444 0.001805 0.544985 -vn -0.000888 -0.999981 -0.006046 -vn -0.003092 -0.999962 -0.008161 -vn -0.004812 -0.999973 -0.005531 -vn -0.003092 -0.999973 -0.006647 -vn -0.957768 0.001058 -0.287540 -vn -0.957769 0.001054 -0.287537 -vn -0.008039 -0.999946 0.006612 -vn -0.004899 -0.999987 0.001463 -vn -0.004617 -0.999981 0.004017 -vn -0.002355 -0.999966 0.007845 -vn 0.007663 -0.999946 0.006969 -vn 0.002159 -0.999987 0.004644 -vn 0.003460 -0.999982 0.004817 -vn 0.003695 -0.999984 0.004248 -vn 0.006142 -0.999973 0.003993 -vn 0.139040 -0.032083 0.989767 -vn 0.287427 0.028580 0.957376 -vn 0.432601 -0.032593 0.900996 -vn -0.000000 0.034790 0.999395 -vn -0.140128 -0.031191 0.989642 -vn -0.287425 0.028174 0.957389 -vn -0.417598 -0.025697 0.908268 -vn -0.544788 0.023708 0.838238 -vn -0.653572 -0.022241 0.756537 -vn -0.754311 0.021219 0.656174 -vn -0.836929 -0.020718 0.546919 -vn -0.906632 0.020485 0.421424 -vn -0.975254 -0.042086 0.217046 -vn -0.989393 0.000002 0.145263 -vn -0.989393 0.000001 -0.145262 -vn -0.989393 0.000001 -0.145261 -vn -0.833813 -0.064473 -0.548269 -vn -0.656151 0.022168 -0.754304 -vn 0.006887 -0.999963 -0.005192 -vn 0.797867 0.042802 -0.601313 -vn 0.957769 -0.000002 -0.287540 -vn 0.989734 0.000000 0.142923 -vn 0.994106 0.082261 0.070618 -vn 0.905723 -0.020728 0.423363 -vn 0.797961 0.041489 0.601279 -vn 0.544211 0.048568 0.837541 -vn -0.002700 0.999996 0.000812 -vn 0.015571 0.999869 0.004498 -vn 0.595675 -0.044920 -0.801969 -vn 0.204573 -0.057494 -0.977161 -vn 0.483278 0.051180 -0.873970 -vn 0.071900 0.068381 -0.995065 -vn -0.139990 -0.031221 -0.989661 -vn 0.800546 0.044118 0.597645 -vn 0.421559 0.001648 -0.906799 -vn -0.052549 -0.264167 -0.963045 -vn -0.170460 -0.859539 -0.481806 -vn -0.170467 -0.859585 -0.481720 -vn -0.178701 -0.901113 0.395046 -vn -0.178712 -0.901152 0.394953 -vn -0.177179 -0.893417 -0.412812 -vn -0.177183 -0.893450 -0.412738 -vn -0.171254 -0.863560 0.474275 -vn -0.171265 -0.863605 0.474189 -vn -0.180517 -0.910265 -0.372601 -vn -0.180521 -0.910304 -0.372504 -vn -0.175814 -0.886568 0.427886 -vn -0.175819 -0.886589 0.427841 -vn -0.178097 -0.898043 -0.402245 -vn -0.178102 -0.898086 -0.402146 -vn -0.194505 -0.980828 0.011991 -vn -0.046028 -0.234506 0.971024 -vn -0.046528 -0.234632 0.970970 -vn -0.006629 -0.033780 0.999407 -vn -0.040043 -0.059925 -0.997400 -vn -0.149557 -0.224110 -0.963020 -vn -0.149640 -0.223949 -0.963044 -vn -0.555020 -0.831698 -0.015216 -vn -0.486425 -0.728891 -0.481777 -vn -0.486444 -0.728922 -0.481711 -vn -0.509944 -0.764140 0.395029 -vn -0.509969 -0.764172 0.394934 -vn -0.555092 -0.831789 -0.000119 -vn -0.555090 -0.831790 -0.000118 -vn -0.505588 -0.757605 -0.412815 -vn -0.505600 -0.757626 -0.412760 -vn -0.488691 -0.732292 0.474268 -vn -0.488720 -0.732331 0.474177 -vn -0.555066 -0.831759 0.008900 -vn -0.555069 -0.831757 0.008898 -vn -0.515125 -0.771906 -0.372568 -vn -0.515131 -0.771916 -0.372541 -vn -0.501689 -0.751780 0.427942 -vn -0.501723 -0.751824 0.427824 -vn -0.555068 -0.831755 -0.009169 -vn -0.555063 -0.831758 -0.009166 -vn -0.508209 -0.761534 -0.402230 -vn -0.508218 -0.761548 -0.402193 -vn -0.502110 -0.752396 0.426363 -vn -0.502113 -0.752401 0.426352 -vn -0.555046 -0.831733 0.011991 -vn -0.555053 -0.831729 0.011988 -vn -0.132266 -0.199041 0.971024 -vn -0.223937 -0.149816 -0.963020 -vn -0.223952 -0.149641 -0.963044 -vn -0.831053 -0.555986 -0.015220 -vn -0.831048 -0.555993 -0.015216 -vn -0.728329 -0.487261 -0.481781 -vn -0.728340 -0.487269 -0.481757 -vn -0.763565 -0.510835 0.394989 -vn -0.763568 -0.510837 0.394981 -vn -0.831149 -0.556049 -0.000118 -vn -0.757014 -0.506449 -0.412842 -vn -0.757033 -0.506464 -0.412791 -vn -0.731732 -0.489539 0.474257 -vn -0.731738 -0.489543 0.474243 -vn -0.831116 -0.556028 0.008899 -vn -0.771288 -0.516003 -0.372632 -vn -0.771316 -0.516025 -0.372544 -vn -0.751211 -0.502575 0.427903 -vn -0.751247 -0.502596 0.427815 -vn -0.831112 -0.556030 -0.009167 -vn -0.760931 -0.509069 -0.402283 -vn -0.760967 -0.509097 -0.402181 -vn -0.751782 -0.502953 0.426454 -vn -0.751838 -0.502986 0.426315 -vn -0.831085 -0.556016 0.011990 -vn -0.831089 -0.556010 0.011987 -vn -0.198366 -0.133274 0.971025 -vn -0.198808 -0.133011 0.970970 -vn -0.070688 -0.014059 -0.997399 -vn -0.264169 -0.052546 -0.963044 -vn -0.980560 -0.195630 -0.015220 -vn -0.980557 -0.195643 -0.015215 -vn -0.859321 -0.171441 -0.481846 -vn -0.859321 -0.171440 -0.481846 -vn -0.900899 -0.179739 0.395064 -vn -0.900936 -0.179744 0.394976 -vn -0.980673 -0.195656 -0.000118 -vn -0.980673 -0.195655 -0.000119 -vn -0.893182 -0.178198 -0.412881 -vn -0.893213 -0.178207 -0.412810 -vn -0.863334 -0.172245 0.474327 -vn -0.863417 -0.172258 0.474171 -vn -0.980633 -0.195654 0.008901 -vn -0.980634 -0.195648 0.008898 -vn -0.910046 -0.181568 -0.372625 -vn -0.910097 -0.181582 -0.372494 -vn -0.886360 -0.176844 0.427894 -vn -0.886421 -0.176852 0.427762 -vn -0.897830 -0.179123 -0.402263 -vn -0.897864 -0.179132 -0.402184 -vn -0.887054 -0.176978 0.426396 -vn -0.887112 -0.176986 0.426272 -vn -0.980601 -0.195645 0.011990 -vn -0.234577 -0.046800 0.970970 -vn -0.070688 0.014059 -0.997399 -vn -0.264286 0.052409 -0.963019 -vn -0.264171 0.052545 -0.963044 -vn -0.980785 0.194499 -0.015218 -vn -0.980785 0.194495 -0.015217 -vn -0.859469 0.170448 -0.481934 -vn -0.859648 0.170476 -0.481604 -vn -0.901109 0.178701 0.395056 -vn -0.901190 0.178722 0.394860 -vn -0.980898 0.194525 -0.000119 -vn -0.980898 0.194524 -0.000119 -vn -0.893381 0.177174 -0.412891 -vn -0.893456 0.177184 -0.412725 -vn -0.863570 0.171259 0.474255 -vn -0.863574 0.171260 0.474247 -vn -0.980859 0.194514 0.008900 -vn -0.980858 0.194519 0.008898 -vn -0.910278 0.180518 -0.372568 -vn -0.886588 0.175817 0.427842 -vn -0.886601 0.175821 0.427815 -vn -0.980857 0.194512 -0.009166 -vn -0.898035 0.178092 -0.402264 -vn -0.898032 0.178092 -0.402270 -vn -0.887277 0.175958 0.426355 -vn -0.887296 0.175963 0.426314 -vn -0.980827 0.194510 0.011989 -vn -0.234505 0.046030 0.971025 -vn -0.234631 0.046527 0.970971 -vn -0.033779 0.006630 0.999407 -vn -0.059926 0.040039 -0.997400 -vn -0.831692 0.555028 -0.015220 -vn -0.831698 0.555019 -0.015216 -vn -0.728921 0.486441 -0.481714 -vn -0.728893 0.486424 -0.481774 -vn -0.764164 0.509964 0.394955 -vn -0.764152 0.509955 0.394991 -vn -0.831790 0.555091 -0.000119 -vn -0.831789 0.555092 -0.000119 -vn -0.757610 0.505590 -0.412803 -vn -0.757644 0.505609 -0.412716 -vn -0.732259 0.488671 0.474338 -vn -0.732314 0.488712 0.474212 -vn -0.831759 0.555066 0.008900 -vn -0.831757 0.555069 0.008898 -vn -0.771888 0.515113 -0.372623 -vn -0.771913 0.515128 -0.372549 -vn -0.751794 0.501702 0.427903 -vn -0.751826 0.501726 0.427820 -vn -0.831755 0.555067 -0.009168 -vn -0.761494 0.508183 -0.402340 -vn -0.761544 0.508212 -0.402209 -vn -0.752383 0.502101 0.426396 -vn -0.752406 0.502119 0.426335 -vn -0.831735 0.555044 0.011992 -vn -0.831728 0.555053 0.011987 -vn -0.199039 0.132265 0.971025 -vn -0.028670 0.019052 0.999407 -vn -0.040039 0.059926 -0.997400 -vn -0.149820 0.223939 -0.963019 -vn -0.149638 0.223954 -0.963044 -vn -0.555986 0.831053 -0.015219 -vn -0.555991 0.831049 -0.015216 -vn -0.487237 0.728299 -0.481851 -vn -0.487291 0.728373 -0.481685 -vn -0.510816 0.763535 0.395070 -vn -0.510834 0.763565 0.394990 -vn -0.556049 0.831149 -0.000119 -vn -0.506456 0.757024 -0.412816 -vn -0.506479 0.757054 -0.412733 -vn -0.489525 0.731711 0.474304 -vn -0.489558 0.731767 0.474184 -vn -0.556027 0.831116 0.008898 -vn -0.516010 0.771294 -0.372610 -vn -0.516016 0.771302 -0.372586 -vn -0.502574 0.751209 0.427908 -vn -0.502607 0.751266 0.427768 -vn -0.556026 0.831114 -0.009169 -vn -0.556030 0.831112 -0.009167 -vn -0.509073 0.760934 -0.402274 -vn -0.509093 0.760961 -0.402198 -vn -0.502967 0.751806 0.426395 -vn -0.502982 0.751831 0.426333 -vn -0.556014 0.831086 0.011990 -vn -0.556010 0.831089 0.011988 -vn -0.133271 0.198368 0.971025 -vn -0.133007 0.198810 0.970971 -vn -0.019196 0.028574 0.999407 -vn -0.014060 0.070687 -0.997399 -vn -0.052721 0.264225 -0.963019 -vn -0.052547 0.264169 -0.963044 -vn -0.195642 0.980557 -0.015215 -vn -0.171453 0.859362 -0.481768 -vn -0.171458 0.859382 -0.481730 -vn -0.179738 0.900898 0.395066 -vn -0.179742 0.900930 0.394991 -vn -0.195654 0.980673 -0.000119 -vn -0.178205 0.893215 -0.412807 -vn -0.178209 0.893233 -0.412767 -vn -0.172249 0.863363 0.474273 -vn -0.172252 0.863385 0.474232 -vn -0.195647 0.980634 0.008898 -vn -0.181565 0.910038 -0.372645 -vn -0.176845 0.886376 0.427859 -vn -0.176847 0.886386 0.427839 -vn -0.195647 0.980632 -0.009168 -vn -0.195652 0.980631 -0.009166 -vn -0.179124 0.897827 -0.402269 -vn -0.179134 0.897865 -0.402180 -vn -0.176976 0.887052 0.426402 -vn -0.176983 0.887098 0.426304 -vn -0.195647 0.980601 0.011991 -vn -0.195641 0.980602 0.011988 -vn 0.014060 0.070687 -0.997399 -vn 0.052406 0.264286 -0.963020 -vn 0.052546 0.264167 -0.963045 -vn 0.170458 0.859534 -0.481815 -vn 0.170464 0.859571 -0.481746 -vn 0.178700 0.901104 0.395067 -vn 0.178712 0.901148 0.394962 -vn 0.194525 0.980897 -0.000118 -vn 0.177175 0.893401 -0.412847 -vn 0.171251 0.863538 0.474316 -vn 0.171265 0.863595 0.474206 -vn 0.194517 0.980859 0.008898 -vn 0.180520 0.910300 -0.372514 -vn 0.175812 0.886552 0.427919 -vn 0.175821 0.886591 0.427837 -vn 0.178094 0.898037 -0.402258 -vn 0.175956 0.887263 0.426384 -vn 0.194510 0.980827 0.011988 -vn 0.046029 0.234504 0.971025 -vn 0.006630 0.033780 0.999407 -vn 0.040039 0.059926 -0.997400 -vn 0.149555 0.224110 -0.963020 -vn 0.149638 0.223951 -0.963044 -vn 0.555027 0.831693 -0.015218 -vn 0.555020 0.831698 -0.015214 -vn 0.486407 0.728865 -0.481833 -vn 0.486425 0.728895 -0.481770 -vn 0.509943 0.764136 0.395036 -vn 0.509957 0.764154 0.394984 -vn 0.555090 0.831790 -0.000118 -vn 0.555091 0.831790 -0.000118 -vn 0.505599 0.757629 -0.412757 -vn 0.488678 0.732270 0.474316 -vn 0.488739 0.732354 0.474122 -vn 0.555066 0.831759 0.008900 -vn 0.555069 0.831757 0.008899 -vn 0.515122 0.771903 -0.372580 -vn 0.515125 0.771909 -0.372563 -vn 0.501700 0.751791 0.427910 -vn 0.501732 0.751833 0.427800 -vn 0.508225 0.761564 -0.402154 -vn 0.502124 0.752417 0.426310 -vn 0.555045 0.831734 0.011992 -vn 0.132778 0.198966 0.970970 -vn 0.059923 0.040042 -0.997400 -vn 0.223934 0.149819 -0.963020 -vn 0.223949 0.149640 -0.963045 -vn 0.831053 0.555985 -0.015217 -vn 0.831049 0.555991 -0.015214 -vn 0.728287 0.487232 -0.481875 -vn 0.728329 0.487263 -0.481780 -vn 0.763536 0.510814 0.395072 -vn 0.763565 0.510831 0.394993 -vn 0.831150 0.556048 -0.000118 -vn 0.831150 0.556049 -0.000118 -vn 0.757022 0.506454 -0.412821 -vn 0.757043 0.506470 -0.412765 -vn 0.731758 0.489553 0.474203 -vn 0.731743 0.489544 0.474235 -vn 0.831113 0.556032 0.008901 -vn 0.771287 0.516003 -0.372635 -vn 0.771325 0.516033 -0.372516 -vn 0.751225 0.502584 0.427868 -vn 0.751236 0.502591 0.427839 -vn 0.831115 0.556026 -0.009167 -vn 0.831112 0.556030 -0.009165 -vn 0.760944 0.509078 -0.402248 -vn 0.760975 0.509102 -0.402158 -vn 0.751803 0.502965 0.426402 -vn 0.751846 0.502990 0.426297 -vn 0.831087 0.556014 0.011991 -vn 0.198371 0.133272 0.971024 -vn 0.198812 0.133009 0.970970 -vn 0.264223 0.052715 -0.963020 -vn 0.980559 0.195634 -0.015218 -vn 0.980558 0.195642 -0.015214 -vn 0.859309 0.171439 -0.481868 -vn 0.859381 0.171457 -0.481732 -vn 0.900895 0.179738 0.395074 -vn 0.900923 0.179742 0.395008 -vn 0.980673 0.195656 -0.000118 -vn 0.893199 0.178201 -0.412843 -vn 0.893251 0.178215 -0.412725 -vn 0.863339 0.172246 0.474318 -vn 0.863385 0.172253 0.474232 -vn 0.980633 0.195652 0.008901 -vn 0.980634 0.195647 0.008899 -vn 0.910059 0.181570 -0.372591 -vn 0.910090 0.181579 -0.372512 -vn 0.886347 0.176840 0.427920 -vn 0.886393 0.176846 0.427823 -vn 0.980632 0.195646 -0.009167 -vn 0.980631 0.195651 -0.009165 -vn 0.897841 0.179126 -0.402237 -vn 0.897881 0.179136 -0.402145 -vn 0.887064 0.176980 0.426375 -vn 0.887127 0.176988 0.426241 -vn 0.980601 0.195649 0.011992 -vn 0.980602 0.195642 0.011989 -vn 0.264286 -0.052405 -0.963020 -vn 0.264169 -0.052543 -0.963044 -vn 0.980784 -0.194502 -0.015218 -vn 0.980786 -0.194493 -0.015214 -vn 0.859535 -0.170458 -0.481813 -vn 0.859562 -0.170462 -0.481763 -vn 0.901097 -0.178698 0.395084 -vn 0.901135 -0.178708 0.394994 -vn 0.980898 -0.194524 -0.000118 -vn 0.893421 -0.177178 -0.412804 -vn 0.893432 -0.177179 -0.412780 -vn 0.863538 -0.171249 0.474316 -vn 0.863629 -0.171272 0.474142 -vn 0.980859 -0.194513 0.008901 -vn 0.980859 -0.194516 0.008900 -vn 0.910271 -0.180517 -0.372586 -vn 0.910284 -0.180519 -0.372553 -vn 0.886560 -0.175813 0.427903 -vn 0.886591 -0.175821 0.427834 -vn 0.980856 -0.194517 -0.009167 -vn 0.980857 -0.194514 -0.009165 -vn 0.898053 -0.178099 -0.402222 -vn 0.898097 -0.178104 -0.402121 -vn 0.887294 -0.175963 0.426317 -vn 0.887334 -0.175973 0.426230 -vn 0.980828 -0.194504 0.011992 -vn 0.980827 -0.194512 0.011989 -vn 0.234506 -0.046031 0.971024 -vn 0.234632 -0.046530 0.970970 -vn 0.059923 -0.040039 -0.997400 -vn 0.224109 -0.149560 -0.963020 -vn 0.223953 -0.149641 -0.963043 -vn 0.831693 -0.555028 -0.015218 -vn 0.831698 -0.555020 -0.015214 -vn 0.728860 -0.486405 -0.481844 -vn 0.728915 -0.486438 -0.481727 -vn 0.764125 -0.509937 0.395065 -vn 0.764138 -0.509947 0.395028 -vn 0.831790 -0.555091 -0.000118 -vn 0.831789 -0.555092 -0.000118 -vn 0.757587 -0.505577 -0.412860 -vn 0.757651 -0.505615 -0.412697 -vn 0.732309 -0.488705 0.474227 -vn 0.732312 -0.488708 0.474219 -vn 0.831759 -0.555065 0.008901 -vn 0.831756 -0.555070 0.008899 -vn 0.771886 -0.515112 -0.372629 -vn 0.771924 -0.515133 -0.372520 -vn 0.751791 -0.501699 0.427912 -vn 0.751815 -0.501718 0.427847 -vn 0.831755 -0.555067 -0.009167 -vn 0.831757 -0.555064 -0.009166 -vn 0.761545 -0.508216 -0.402201 -vn 0.752413 -0.502119 0.426322 -vn 0.752433 -0.502134 0.426271 -vn 0.831732 -0.555047 0.011992 -vn 0.831730 -0.555051 0.011989 -vn 0.199041 -0.132267 0.971024 -vn 0.198966 -0.132778 0.970970 -vn 0.028672 -0.019053 0.999407 -vn 0.040034 -0.059927 -0.997400 -vn 0.149822 -0.223937 -0.963019 -vn 0.149633 -0.223953 -0.963045 -vn 0.555992 -0.831049 -0.015214 -vn 0.487251 -0.728319 -0.481807 -vn 0.487282 -0.728361 -0.481712 -vn 0.510809 -0.763528 0.395093 -vn 0.510830 -0.763564 0.394997 -vn 0.506461 -0.757033 -0.412794 -vn 0.506486 -0.757065 -0.412705 -vn 0.489521 -0.731705 0.474317 -vn 0.489549 -0.731751 0.474217 -vn 0.556032 -0.831113 0.008901 -vn 0.556028 -0.831116 0.008899 -vn 0.516012 -0.771302 -0.372593 -vn 0.516032 -0.771327 -0.372513 -vn 0.502572 -0.751204 0.427917 -vn 0.502593 -0.751239 0.427832 -vn 0.556024 -0.831115 -0.009168 -vn 0.556031 -0.831111 -0.009164 -vn 0.509092 -0.760965 -0.402192 -vn 0.502975 -0.751820 0.426361 -vn 0.502985 -0.751837 0.426319 -vn 0.556015 -0.831086 0.011992 -vn 0.556008 -0.831091 0.011988 -vn 0.133010 -0.198812 0.970970 -vn 0.019199 -0.028574 0.999407 -vn 0.195634 -0.980559 -0.015218 -vn 0.195641 -0.980557 -0.015215 -vn 0.171448 -0.859351 -0.481791 -vn 0.171457 -0.859388 -0.481721 -vn 0.179741 -0.900894 0.395074 -vn 0.179746 -0.900939 0.394970 -vn 0.178206 -0.893226 -0.412784 -vn 0.178212 -0.893248 -0.412734 -vn 0.172249 -0.863345 0.474305 -vn 0.172258 -0.863406 0.474191 -vn 0.195653 -0.980633 0.008900 -vn 0.181570 -0.910057 -0.372596 -vn 0.181577 -0.910084 -0.372527 -vn 0.176841 -0.886345 0.427924 -vn 0.176849 -0.886401 0.427805 -vn 0.195648 -0.980631 -0.009167 -vn 0.195652 -0.980630 -0.009165 -vn 0.179125 -0.897830 -0.402263 -vn 0.179136 -0.897871 -0.402168 -vn 0.176979 -0.887057 0.426389 -vn 0.047216 -0.234271 0.971024 -vn 0.006801 -0.033746 0.999407 -s off -f 1943/1012/931 1945/1013/931 1944/1014/931 -f 1943/1012/932 1946/1015/932 1945/1013/932 -f 1942/1016/933 1946/1015/933 1943/1012/933 -f 1942/1016/934 1947/1017/934 1946/1015/934 -f 1942/1016/935 1948/1018/935 1947/1017/935 -f 1942/1016/936 1929/1019/936 1928/1020/936 -f 1942/1016/934 1930/1021/934 1929/1019/934 -f 1942/1016/937 1931/1022/937 1930/1021/937 -f 1942/1016/935 1932/1023/935 1931/1022/935 -f 1942/1016/1571 1934/1024/1571 1933/1025/1571 -f 1942/1016/934 1935/1026/934 1934/1024/934 -f 1942/1016/939 1936/1027/939 1935/1026/939 -f 1942/1016/934 1937/1028/934 1936/1027/934 -f 1941/1029/940 1937/1028/940 1942/1016/940 -f 1941/1029/941 1938/1030/941 1937/1028/941 -f 1941/1029/941 1939/1031/941 1938/1030/941 -f 1941/1029/1572 1940/1032/1572 1939/1031/1572 -f 1942/1016/1573 1928/1020/1573 1910/1033/1573 -f 1909/1034/1574 1942/1016/1574 1933/1025/1574 -f 1949/1035/945 1950/1036/945 1932/1023/945 -f 1932/1023/1575 1933/1025/1575 1949/1035/1575 -f 1951/1037/1576 1935/1026/1576 1936/1027/1576 -f 1952/1038/1577 1951/1037/1577 1936/1027/1577 -f 1952/1038/1578 1936/1027/1578 1937/1028/1578 -f 1953/1039/1579 1952/1038/1579 1937/1028/1579 -f 1953/1039/1580 1937/1028/1580 1938/1030/1580 -f 1938/1030/952 1954/1040/952 1953/1039/952 -f 1954/1040/1581 1938/1030/1581 1939/1031/1581 -f 1939/1031/1582 1955/1041/1582 1954/1040/1582 -f 1955/1041/1583 1939/1031/1583 1940/1032/1583 -f 1940/1032/1584 1956/1042/1584 1955/1041/1584 -f 1932/1023/1585 1950/1036/1585 1957/1043/1585 -f 1931/1022/1586 1932/1023/1586 1957/1043/1586 -f 1958/1044/1587 1930/1021/1587 1931/1022/1587 -f 1931/1022/1588 1957/1043/1588 1958/1044/1588 -f 1958/1044/1589 1959/1045/1589 1929/1019/1589 -f 1929/1019/1590 1930/1021/1590 1958/1044/1590 -f 1959/1045/1591 1960/1046/1591 1929/1019/1591 -f 1960/1046/1591 1928/1020/1591 1929/1019/1591 -f 1960/1046/1592 1961/1047/1592 1948/1018/1592 -f 1928/1020/1593 1960/1046/1593 1948/1018/1593 -f 1947/1017/1594 1948/1018/1594 1961/1047/1594 -f 1962/1048/1595 1947/1017/1595 1961/1047/1595 -f 1963/1049/1596 1946/1015/1596 1947/1017/1596 -f 1947/1017/1597 1962/1048/1597 1963/1049/1597 -f 1940/1032/1598 1941/1029/1598 1956/1042/1598 -f 1964/1050/1599 1941/1029/1599 1942/1016/1599 -f 1942/1016/1600 1965/1051/1600 1964/1050/1600 -f 1965/1051/1601 1942/1016/1601 1943/1012/1601 -f 1943/1012/1602 1966/1052/1602 1965/1051/1602 -f 1966/1052/1603 1944/1014/1603 1967/1053/1603 -f 1966/1052/1604 1943/1012/1604 1944/1014/1604 -f 1967/1053/1605 1944/1014/1605 1945/1013/1605 -f 1945/1013/1606 1968/1054/1606 1967/1053/1606 -f 1968/1054/1607 1945/1013/1607 1946/1015/1607 -f 1946/1015/1608 1963/1049/1608 1968/1054/1608 -f 1969/1055/979 1964/1050/979 1965/1051/979 -f 1969/1055/980 1970/1056/980 1964/1050/980 -f 1970/1056/981 1956/1042/981 1964/1050/981 -f 1955/1041/982 1956/1042/982 1970/1056/982 -f 1971/1057/1609 1954/1040/1609 1955/1041/1609 -f 1955/1041/1610 1970/1056/1610 1971/1057/1610 -f 1971/1057/1611 1972/1058/1611 1953/1039/1611 -f 1953/1039/1612 1954/1040/1612 1971/1057/1612 -f 1952/1038/987 1953/1039/987 1972/1058/987 -f 1972/1058/988 1973/1059/988 1952/1038/988 -f 1973/1059/989 1951/1037/989 1952/1038/989 -f 1973/1059/990 1974/1060/990 1951/1037/990 -f 1974/1060/991 1975/1061/991 1951/1037/991 -f 1974/1060/992 1976/1062/992 1975/1061/992 -f 1934/1024/1613 1935/1026/1613 1951/1037/1613 -f 1975/1061/1614 1934/1024/1614 1951/1037/1614 -f 1975/1061/996 1949/1035/996 1933/1025/996 -f 1933/1025/996 1934/1024/996 1975/1061/996 -f 1976/1062/997 1949/1035/997 1975/1061/997 -f 1976/1062/1615 1977/1063/1615 1949/1035/1615 -f 1977/1063/1616 1950/1036/1616 1949/1035/1616 -f 1977/1063/1617 1978/1064/1617 1950/1036/1617 -f 1978/1064/1001 1957/1043/1001 1950/1036/1001 -f 1978/1064/1002 1979/1065/1002 1957/1043/1002 -f 1958/1044/1003 1957/1043/1003 1979/1065/1003 -f 1979/1065/1618 1980/1066/1618 1958/1044/1618 -f 1980/1066/1005 1959/1045/1005 1958/1044/1005 -f 1980/1066/1006 1981/1067/1006 1959/1045/1006 -f 1960/1046/1007 1959/1045/1007 1981/1067/1007 -f 1981/1067/1008 1982/1068/1008 1960/1046/1008 -f 1961/1047/1009 1960/1046/1009 1982/1068/1009 -f 1982/1068/1619 1983/1069/1619 1961/1047/1619 -f 1962/1048/1620 1961/1047/1620 1983/1069/1620 -f 1983/1069/1621 1984/1070/1621 1963/1049/1621 -f 1963/1049/1622 1962/1048/1622 1983/1069/1622 -f 1968/1054/1623 1963/1049/1623 1984/1070/1623 -f 1984/1070/1015 1985/1071/1015 1968/1054/1015 -f 1967/1053/1016 1968/1054/1016 1985/1071/1016 -f 1985/1071/1017 1986/1072/1017 1967/1053/1017 -f 1966/1052/1018 1967/1053/1018 1986/1072/1018 -f 1981/1067/1624 1911/1073/1624 1916/1074/1624 -f 1982/1068/1625 1981/1067/1625 1916/1074/1625 -f 1916/1074/1626 1915/1075/1626 1982/1068/1626 -f 1911/1073/1627 1981/1067/1627 1980/1066/1627 -f 1911/1073/1628 1980/1066/1628 1926/1076/1628 -f 1926/1076/1629 1980/1066/1629 1979/1065/1629 -f 1979/1065/1630 1927/1077/1630 1926/1076/1630 -f 1927/1077/1631 1979/1065/1631 1978/1064/1631 -f 1978/1064/1632 1925/1078/1632 1927/1077/1632 -f 1925/1078/1633 1978/1064/1633 1977/1063/1633 -f 1925/1078/1634 1977/1063/1634 1920/1079/1634 -f 1920/1079/1635 1977/1063/1635 1976/1062/1635 -f 1976/1062/1636 1921/1080/1636 1920/1079/1636 -f 1921/1080/1637 1976/1062/1637 1974/1060/1637 -f 1921/1080/1638 1974/1060/1638 1973/1059/1638 -f 1973/1059/1639 1922/1081/1639 1921/1080/1639 -f 1922/1081/1035 1973/1059/1035 1972/1058/1035 -f 1972/1058/1640 1923/1082/1640 1922/1081/1640 -f 1923/1082/1641 1972/1058/1641 1971/1057/1641 -f 1971/1057/1038 1924/1083/1038 1923/1082/1038 -f 1969/1055/1039 1965/1051/1039 1987/1084/1039 -f 1987/1084/1040 1965/1051/1040 1966/1052/1040 -f 1966/1052/1642 1986/1072/1642 1987/1084/1642 -f 1914/1085/1643 1987/1084/1643 1986/1072/1643 -f 1917/1086/1043 1914/1085/1043 1986/1072/1043 -f 1917/1086/1644 1986/1072/1644 1985/1071/1644 -f 1917/1086/1645 1985/1071/1645 1984/1070/1645 -f 1984/1070/1646 1919/1087/1646 1917/1086/1646 -f 1918/1088/1647 1919/1087/1647 1984/1070/1647 -f 1918/1088/1648 1984/1070/1648 1983/1069/1648 -f 1915/1075/1649 1983/1069/1649 1982/1068/1649 -f 1932/1023/1650 1909/1034/1650 1933/1025/1650 -f 1909/1034/1051 1932/1023/1051 1942/1016/1051 -f 1948/1018/1052 1910/1033/1052 1928/1020/1052 -f 1948/1018/1651 1942/1016/1651 1910/1033/1651 -f 1987/1084/1652 1914/1085/1652 1913/1089/1652 -f 1971/1057/1055 1970/1056/1055 1924/1083/1055 -f 1969/1055/1653 1913/1089/1653 1912/1090/1653 -f 1913/1089/1654 1969/1055/1654 1987/1084/1654 -f 1912/1090/1655 1970/1056/1655 1969/1055/1655 -f 1970/1056/1656 1912/1090/1656 1924/1083/1656 -f 1918/1088/1657 1983/1069/1657 1915/1075/1657 -f 1956/1042/1658 1941/1029/1658 1964/1050/1658 -f 1988/1091/1062 1989/1092/1062 2006/1093/1062 -f 1989/1092/1063 1990/1094/1063 2007/1095/1063 -f 1989/1092/1659 2007/1095/1659 2006/1093/1659 -f 1990/1094/1065 1991/1096/1065 2008/1097/1065 -f 1990/1094/1066 2008/1097/1066 2007/1095/1066 -f 1991/1096/1660 1992/1098/1660 2009/1099/1660 -f 1991/1096/1661 2009/1099/1661 2008/1097/1661 -f 1992/1098/1662 1993/1100/1662 2010/1101/1662 -f 1992/1098/1663 2010/1101/1663 2009/1099/1663 -f 1993/1100/1072 1994/1102/1072 2011/1103/1072 -f 1993/1100/1071 2011/1103/1071 2010/1101/1071 -f 1994/1102/1664 1995/1104/1664 2012/1105/1664 -f 1994/1102/1665 2012/1105/1665 2011/1103/1665 -f 1995/1104/1666 1996/1106/1666 2013/1107/1666 -f 1995/1104/1667 2013/1107/1667 2012/1105/1667 -f 1996/1106/1077 1997/1108/1077 2014/1109/1077 -f 1996/1106/1078 2014/1109/1078 2013/1107/1078 -f 1997/1108/1668 1998/1110/1668 2015/1111/1668 -f 1997/1108/1669 2015/1111/1669 2014/1109/1669 -f 1998/1110/1670 1999/1112/1670 2016/1113/1670 -f 1998/1110/1671 2016/1113/1671 2015/1111/1671 -f 1999/1112/1083 2000/1114/1083 2017/1115/1083 -f 1999/1112/1084 2017/1115/1084 2016/1113/1084 -f 2000/1114/1672 2001/1116/1672 2018/1117/1672 -f 2000/1114/1673 2018/1117/1673 2017/1115/1673 -f 2001/1116/1087 2002/1118/1087 2019/1119/1087 -f 2001/1116/1088 2019/1119/1088 2018/1117/1088 -f 2002/1118/1674 2003/1120/1674 2020/1121/1674 -f 2002/1118/1090 2020/1121/1090 2019/1119/1090 -f 2003/1120/1675 2004/1122/1675 2021/1123/1675 -f 2003/1120/1676 2021/1123/1676 2020/1121/1676 -f 2004/1122/1677 2005/1124/1677 2021/1123/1677 -f 1988/1091/1678 2006/1093/1678 2022/1125/1678 -f 2006/1093/1679 2007/1095/1679 2023/1126/1679 -f 2006/1093/1680 2023/1126/1680 2022/1125/1680 -f 2007/1095/1097 2008/1097/1097 2024/1127/1097 -f 2007/1095/1681 2024/1127/1681 2023/1126/1681 -f 2008/1097/1682 2009/1099/1682 2025/1128/1682 -f 2008/1097/1683 2025/1128/1683 2024/1127/1683 -f 2009/1099/1684 2010/1101/1684 2026/1129/1684 -f 2009/1099/1685 2026/1129/1685 2025/1128/1685 -f 2010/1101/1686 2011/1103/1686 2027/1130/1686 -f 2010/1101/1687 2027/1130/1687 2026/1129/1687 -f 2011/1103/1688 2012/1105/1688 2028/1131/1688 -f 2011/1103/1689 2028/1131/1689 2027/1130/1689 -f 2012/1105/1690 2013/1107/1690 2029/1132/1690 -f 2012/1105/1691 2029/1132/1691 2028/1131/1691 -f 2013/1107/1692 2014/1109/1692 2030/1133/1692 -f 2013/1107/1693 2030/1133/1693 2029/1132/1693 -f 2014/1109/1694 2015/1111/1694 2031/1134/1694 -f 2014/1109/1695 2031/1134/1695 2030/1133/1695 -f 2015/1111/1696 2016/1113/1696 2032/1135/1696 -f 2015/1111/1697 2032/1135/1697 2031/1134/1697 -f 2016/1113/1698 2017/1115/1698 2033/1136/1698 -f 2016/1113/1699 2033/1136/1699 2032/1135/1699 -f 2017/1115/1700 2018/1117/1700 2034/1137/1700 -f 2017/1115/1701 2034/1137/1701 2033/1136/1701 -f 2018/1117/1702 2019/1119/1702 2035/1138/1702 -f 2018/1117/1703 2035/1138/1703 2034/1137/1703 -f 2019/1119/1704 2020/1121/1704 2036/1139/1704 -f 2019/1119/1705 2036/1139/1705 2035/1138/1705 -f 2020/1121/1706 2021/1123/1706 2037/1140/1706 -f 2020/1121/1124 2037/1140/1124 2036/1139/1124 -f 2021/1123/1125 2005/1124/1125 2037/1140/1125 -f 1988/1091/1126 2022/1125/1126 2038/1141/1126 -f 2022/1125/1707 2023/1126/1707 2039/1142/1707 -f 2022/1125/1708 2039/1142/1708 2038/1141/1708 -f 2023/1126/1709 2024/1127/1709 2040/1143/1709 -f 2023/1126/1710 2040/1143/1710 2039/1142/1710 -f 2024/1127/1711 2025/1128/1711 2041/1144/1711 -f 2024/1127/1712 2041/1144/1712 2040/1143/1712 -f 2025/1128/1713 2026/1129/1713 2042/1145/1713 -f 2025/1128/1714 2042/1145/1714 2041/1144/1714 -f 2026/1129/1715 2027/1130/1715 2043/1146/1715 -f 2026/1129/1715 2043/1146/1715 2042/1145/1715 -f 2027/1130/1716 2028/1131/1716 2044/1147/1716 -f 2027/1130/1717 2044/1147/1717 2043/1146/1717 -f 2028/1131/1718 2029/1132/1718 2045/1148/1718 -f 2028/1131/1719 2045/1148/1719 2044/1147/1719 -f 2029/1132/1141 2030/1133/1141 2046/1149/1141 -f 2029/1132/1720 2046/1149/1720 2045/1148/1720 -f 2030/1133/1721 2031/1134/1721 2047/1150/1721 -f 2030/1133/1722 2047/1150/1722 2046/1149/1722 -f 2031/1134/1723 2032/1135/1723 2048/1151/1723 -f 2031/1134/1724 2048/1151/1724 2047/1150/1724 -f 2032/1135/1147 2033/1136/1147 2049/1152/1147 -f 2032/1135/1725 2049/1152/1725 2048/1151/1725 -f 2033/1136/1726 2034/1137/1726 2050/1153/1726 -f 2033/1136/1727 2050/1153/1727 2049/1152/1727 -f 2034/1137/1728 2035/1138/1728 2051/1154/1728 -f 2034/1137/1729 2051/1154/1729 2050/1153/1729 -f 2035/1138/1730 2036/1139/1730 2052/1155/1730 -f 2035/1138/1731 2052/1155/1731 2051/1154/1731 -f 2036/1139/1732 2037/1140/1732 2053/1156/1732 -f 2036/1139/1733 2053/1156/1733 2052/1155/1733 -f 2037/1140/1157 2005/1124/1157 2053/1156/1157 -f 1988/1091/1734 2038/1141/1734 2054/1157/1734 -f 2038/1141/1159 2039/1142/1159 2055/1158/1159 -f 2038/1141/1735 2055/1158/1735 2054/1157/1735 -f 2039/1142/1736 2040/1143/1736 2056/1159/1736 -f 2039/1142/1737 2056/1159/1737 2055/1158/1737 -f 2040/1143/1738 2041/1144/1738 2057/1160/1738 -f 2040/1143/1739 2057/1160/1739 2056/1159/1739 -f 2041/1144/1740 2042/1145/1740 2058/1161/1740 -f 2041/1144/1741 2058/1161/1741 2057/1160/1741 -f 2042/1145/1742 2043/1146/1742 2059/1162/1742 -f 2042/1145/1743 2059/1162/1743 2058/1161/1743 -f 2043/1146/1744 2044/1147/1744 2060/1163/1744 -f 2043/1146/1745 2060/1163/1745 2059/1162/1745 -f 2044/1147/1746 2045/1148/1746 2061/1164/1746 -f 2044/1147/1747 2061/1164/1747 2060/1163/1747 -f 2045/1148/1748 2046/1149/1748 2062/1165/1748 -f 2045/1148/1749 2062/1165/1749 2061/1164/1749 -f 2046/1149/1750 2047/1150/1750 2063/1166/1750 -f 2046/1149/1751 2063/1166/1751 2062/1165/1751 -f 2047/1150/1752 2048/1151/1752 2064/1167/1752 -f 2047/1150/1753 2064/1167/1753 2063/1166/1753 -f 2048/1151/1179 2049/1152/1179 2065/1168/1179 -f 2048/1151/1180 2065/1168/1180 2064/1167/1180 -f 2049/1152/1754 2050/1153/1754 2066/1169/1754 -f 2049/1152/1755 2066/1169/1755 2065/1168/1755 -f 2050/1153/1756 2051/1154/1756 2067/1170/1756 -f 2050/1153/1757 2067/1170/1757 2066/1169/1757 -f 2051/1154/1758 2052/1155/1758 2068/1171/1758 -f 2051/1154/1186 2068/1171/1186 2067/1170/1186 -f 2052/1155/1187 2053/1156/1187 2069/1172/1187 -f 2052/1155/1759 2069/1172/1759 2068/1171/1759 -f 2053/1156/1189 2005/1124/1189 2069/1172/1189 -f 1988/1091/1760 2054/1157/1760 2070/1173/1760 -f 2054/1157/1761 2055/1158/1761 2071/1174/1761 -f 2054/1157/1762 2071/1174/1762 2070/1173/1762 -f 2055/1158/1763 2056/1159/1763 2072/1175/1763 -f 2055/1158/1764 2072/1175/1764 2071/1174/1764 -f 2056/1159/1765 2057/1160/1765 2073/1176/1765 -f 2056/1159/1766 2073/1176/1766 2072/1175/1766 -f 2057/1160/1767 2058/1161/1767 2074/1177/1767 -f 2057/1160/1768 2074/1177/1768 2073/1176/1768 -f 2058/1161/1769 2059/1162/1769 2075/1178/1769 -f 2058/1161/1770 2075/1178/1770 2074/1177/1770 -f 2059/1162/1771 2060/1163/1771 2076/1179/1771 -f 2059/1162/1772 2076/1179/1772 2075/1178/1772 -f 2060/1163/1773 2061/1164/1773 2077/1180/1773 -f 2060/1163/1774 2077/1180/1774 2076/1179/1774 -f 2061/1164/1775 2062/1165/1775 2078/1181/1775 -f 2061/1164/1776 2078/1181/1776 2077/1180/1776 -f 2062/1165/1777 2063/1166/1777 2079/1182/1777 -f 2062/1165/1208 2079/1182/1208 2078/1181/1208 -f 2063/1166/1778 2064/1167/1778 2080/1183/1778 -f 2063/1166/1779 2080/1183/1779 2079/1182/1779 -f 2064/1167/1211 2065/1168/1211 2081/1184/1211 -f 2064/1167/1780 2081/1184/1780 2080/1183/1780 -f 2065/1168/1781 2066/1169/1781 2082/1185/1781 -f 2065/1168/1782 2082/1185/1782 2081/1184/1782 -f 2066/1169/1783 2067/1170/1783 2083/1186/1783 -f 2066/1169/1784 2083/1186/1784 2082/1185/1784 -f 2067/1170/1217 2068/1171/1217 2084/1187/1217 -f 2067/1170/1785 2084/1187/1785 2083/1186/1785 -f 2068/1171/1786 2069/1172/1786 2085/1188/1786 -f 2068/1171/1787 2085/1188/1787 2084/1187/1787 -f 2069/1172/1788 2005/1124/1788 2085/1188/1788 -f 1988/1091/1789 2070/1173/1789 2086/1189/1789 -f 2070/1173/1223 2071/1174/1223 2087/1190/1223 -f 2070/1173/1224 2087/1190/1224 2086/1189/1224 -f 2071/1174/1790 2072/1175/1790 2088/1191/1790 -f 2071/1174/1791 2088/1191/1791 2087/1190/1791 -f 2072/1175/1792 2073/1176/1792 2089/1192/1792 -f 2072/1175/1793 2089/1192/1793 2088/1191/1793 -f 2073/1176/1794 2074/1177/1794 2090/1193/1794 -f 2073/1176/1795 2090/1193/1795 2089/1192/1795 -f 2074/1177/1796 2075/1178/1796 2091/1194/1796 -f 2074/1177/1797 2091/1194/1797 2090/1193/1797 -f 2075/1178/1798 2076/1179/1798 2092/1195/1798 -f 2075/1178/1799 2092/1195/1799 2091/1194/1799 -f 2076/1179/1800 2077/1180/1800 2093/1196/1800 -f 2076/1179/1801 2093/1196/1801 2092/1195/1801 -f 2077/1180/1802 2078/1181/1802 2094/1197/1802 -f 2077/1180/1803 2094/1197/1803 2093/1196/1803 -f 2078/1181/1804 2079/1182/1804 2095/1198/1804 -f 2078/1181/1805 2095/1198/1805 2094/1197/1805 -f 2079/1182/1806 2080/1183/1806 2096/1199/1806 -f 2079/1182/1807 2096/1199/1807 2095/1198/1807 -f 2080/1183/1808 2081/1184/1808 2097/1200/1808 -f 2080/1183/1244 2097/1200/1244 2096/1199/1244 -f 2081/1184/1809 2082/1185/1809 2098/1201/1809 -f 2081/1184/1810 2098/1201/1810 2097/1200/1810 -f 2082/1185/1811 2083/1186/1811 2099/1202/1811 -f 2082/1185/1812 2099/1202/1812 2098/1201/1812 -f 2083/1186/1813 2084/1187/1813 2100/1203/1813 -f 2083/1186/1814 2100/1203/1814 2099/1202/1814 -f 2084/1187/1815 2085/1188/1815 2101/1204/1815 -f 2084/1187/1252 2101/1204/1252 2100/1203/1252 -f 2085/1188/1816 2005/1124/1816 2101/1204/1816 -f 1988/1091/1817 2086/1189/1817 2102/1205/1817 -f 2086/1189/1818 2087/1190/1818 2103/1206/1818 -f 2086/1189/1819 2103/1206/1819 2102/1205/1819 -f 2087/1190/1820 2088/1191/1820 2104/1207/1820 -f 2087/1190/1821 2104/1207/1821 2103/1206/1821 -f 2088/1191/1822 2089/1192/1822 2105/1208/1822 -f 2088/1191/1823 2105/1208/1823 2104/1207/1823 -f 2089/1192/1824 2090/1193/1824 2106/1209/1824 -f 2089/1192/1825 2106/1209/1825 2105/1208/1825 -f 2090/1193/1826 2091/1194/1826 2107/1210/1826 -f 2090/1193/1264 2107/1210/1264 2106/1209/1264 -f 2091/1194/1827 2092/1195/1827 2108/1211/1827 -f 2091/1194/1828 2108/1211/1828 2107/1210/1828 -f 2092/1195/1829 2093/1196/1829 2109/1212/1829 -f 2092/1195/1830 2109/1212/1830 2108/1211/1830 -f 2093/1196/1269 2094/1197/1269 2110/1213/1269 -f 2093/1196/1831 2110/1213/1831 2109/1212/1831 -f 2094/1197/1832 2095/1198/1832 2111/1214/1832 -f 2094/1197/1833 2111/1214/1833 2110/1213/1833 -f 2095/1198/1834 2096/1199/1834 2112/1215/1834 -f 2095/1198/1835 2112/1215/1835 2111/1214/1835 -f 2096/1199/1836 2097/1200/1836 2113/1216/1836 -f 2096/1199/1837 2113/1216/1837 2112/1215/1837 -f 2097/1200/1838 2098/1201/1838 2114/1217/1838 -f 2097/1200/1839 2114/1217/1839 2113/1216/1839 -f 2098/1201/1840 2099/1202/1840 2115/1218/1840 -f 2098/1201/1841 2115/1218/1841 2114/1217/1841 -f 2099/1202/1842 2100/1203/1842 2116/1219/1842 -f 2099/1202/1843 2116/1219/1843 2115/1218/1843 -f 2100/1203/1844 2101/1204/1844 2117/1220/1844 -f 2100/1203/1845 2117/1220/1845 2116/1219/1845 -f 2101/1204/1846 2005/1124/1846 2117/1220/1846 -f 2246/1221/1847 2102/1205/1847 2118/1222/1847 -f 2102/1205/1848 2103/1206/1848 2119/1223/1848 -f 2102/1205/1849 2119/1223/1849 2118/1222/1849 -f 2103/1206/1289 2104/1207/1289 2120/1224/1289 -f 2103/1206/1850 2120/1224/1850 2119/1223/1850 -f 2104/1207/1851 2105/1208/1851 2121/1225/1851 -f 2104/1207/1852 2121/1225/1852 2120/1224/1852 -f 2105/1208/1853 2106/1209/1853 2122/1226/1853 -f 2105/1208/1854 2122/1226/1854 2121/1225/1854 -f 2106/1209/1855 2107/1210/1855 2123/1227/1855 -f 2106/1209/1296 2123/1227/1296 2122/1226/1296 -f 2107/1210/1856 2108/1211/1856 2124/1228/1856 -f 2107/1210/1857 2124/1228/1857 2123/1227/1857 -f 2108/1211/1858 2109/1212/1858 2125/1229/1858 -f 2108/1211/1859 2125/1229/1859 2124/1228/1859 -f 2109/1212/1301 2110/1213/1301 2126/1230/1301 -f 2109/1212/1860 2126/1230/1860 2125/1229/1860 -f 2110/1213/1861 2111/1214/1861 2127/1231/1861 -f 2110/1213/1304 2127/1231/1304 2126/1230/1304 -f 2111/1214/1862 2112/1215/1862 2128/1232/1862 -f 2111/1214/1863 2128/1232/1863 2127/1231/1863 -f 2112/1215/1864 2113/1216/1864 2129/1233/1864 -f 2112/1215/1865 2129/1233/1865 2128/1232/1865 -f 2113/1216/1866 2114/1217/1866 2130/1234/1866 -f 2113/1216/1867 2130/1234/1867 2129/1233/1867 -f 2114/1217/1868 2115/1218/1868 2131/1235/1868 -f 2114/1217/1869 2131/1235/1869 2130/1234/1869 -f 2115/1218/1870 2116/1219/1870 2132/1236/1870 -f 2115/1218/1871 2132/1236/1871 2131/1235/1871 -f 2116/1219/1315 2117/1220/1315 2133/1237/1315 -f 2116/1219/1316 2133/1237/1316 2132/1236/1316 -f 2117/1220/1317 2005/1124/1317 2133/1237/1317 -f 2247/1221/1872 2118/1222/1872 2134/1238/1872 -f 2118/1222/1873 2119/1223/1873 2135/1239/1873 -f 2118/1222/1874 2135/1239/1874 2134/1238/1874 -f 2119/1223/1321 2120/1224/1321 2136/1240/1321 -f 2119/1223/1322 2136/1240/1322 2135/1239/1322 -f 2120/1224/1875 2121/1225/1875 2137/1241/1875 -f 2120/1224/1876 2137/1241/1876 2136/1240/1876 -f 2121/1225/1877 2122/1226/1877 2138/1242/1877 -f 2121/1225/1878 2138/1242/1878 2137/1241/1878 -f 2122/1226/1879 2123/1227/1879 2139/1243/1879 -f 2122/1226/1327 2139/1243/1327 2138/1242/1327 -f 2123/1227/1880 2124/1228/1880 2140/1244/1880 -f 2123/1227/1329 2140/1244/1329 2139/1243/1329 -f 2124/1228/1881 2125/1229/1881 2141/1245/1881 -f 2124/1228/1882 2141/1245/1882 2140/1244/1882 -f 2125/1229/1332 2126/1230/1332 2142/1246/1332 -f 2125/1229/1883 2142/1246/1883 2141/1245/1883 -f 2126/1230/1334 2127/1231/1334 2143/1247/1334 -f 2126/1230/1884 2143/1247/1884 2142/1246/1884 -f 2127/1231/1885 2128/1232/1885 2144/1248/1885 -f 2127/1231/1886 2144/1248/1886 2143/1247/1886 -f 2128/1232/1338 2129/1233/1338 2145/1249/1338 -f 2128/1232/1339 2145/1249/1339 2144/1248/1339 -f 2129/1233/1887 2130/1234/1887 2146/1250/1887 -f 2129/1233/1341 2146/1250/1341 2145/1249/1341 -f 2130/1234/1888 2131/1235/1888 2147/1251/1888 -f 2130/1234/1343 2147/1251/1343 2146/1250/1343 -f 2131/1235/1344 2132/1236/1344 2148/1252/1344 -f 2131/1235/1889 2148/1252/1889 2147/1251/1889 -f 2132/1236/1890 2133/1237/1890 2149/1253/1890 -f 2132/1236/1347 2149/1253/1347 2148/1252/1347 -f 2133/1237/1891 2248/1254/1891 2149/1253/1891 -f 2249/1221/1892 2134/1238/1892 2150/1255/1892 -f 2134/1238/1893 2135/1239/1893 2151/1256/1893 -f 2134/1238/1894 2151/1256/1894 2150/1255/1894 -f 2135/1239/1895 2136/1240/1895 2152/1257/1895 -f 2135/1239/1896 2152/1257/1896 2151/1256/1896 -f 2136/1240/1897 2137/1241/1897 2153/1258/1897 -f 2136/1240/1898 2153/1258/1898 2152/1257/1898 -f 2137/1241/1899 2138/1242/1899 2154/1259/1899 -f 2137/1241/1900 2154/1259/1900 2153/1258/1900 -f 2138/1242/1901 2139/1243/1901 2155/1260/1901 -f 2138/1242/1902 2155/1260/1902 2154/1259/1902 -f 2139/1243/1360 2140/1244/1360 2156/1261/1360 -f 2139/1243/1903 2156/1261/1903 2155/1260/1903 -f 2140/1244/1904 2141/1245/1904 2157/1262/1904 -f 2140/1244/1905 2157/1262/1905 2156/1261/1905 -f 2141/1245/1906 2142/1246/1906 2158/1263/1906 -f 2141/1245/1907 2158/1263/1907 2157/1262/1907 -f 2142/1246/1908 2143/1247/1908 2159/1264/1908 -f 2142/1246/1909 2159/1264/1909 2158/1263/1909 -f 2143/1247/1910 2144/1248/1910 2160/1265/1910 -f 2143/1247/1911 2160/1265/1911 2159/1264/1911 -f 2144/1248/1370 2145/1249/1370 2161/1266/1370 -f 2144/1248/1371 2161/1266/1371 2160/1265/1371 -f 2145/1249/1372 2146/1250/1372 2162/1267/1372 -f 2145/1249/1912 2162/1267/1912 2161/1266/1912 -f 2146/1250/1374 2147/1251/1374 2163/1268/1374 -f 2146/1250/1913 2163/1268/1913 2162/1267/1913 -f 2147/1251/1914 2148/1252/1914 2164/1269/1914 -f 2147/1251/1377 2164/1269/1377 2163/1268/1377 -f 2148/1252/1378 2149/1253/1378 2165/1270/1378 -f 2148/1252/1915 2165/1270/1915 2164/1269/1915 -f 2149/1253/1380 2250/1254/1380 2165/1270/1380 -f 2251/1221/1916 2150/1255/1916 2166/1271/1916 -f 2150/1255/1917 2151/1256/1917 2167/1272/1917 -f 2150/1255/1918 2167/1272/1918 2166/1271/1918 -f 2151/1256/1919 2152/1257/1919 2168/1273/1919 -f 2151/1256/1920 2168/1273/1920 2167/1272/1920 -f 2152/1257/1921 2153/1258/1921 2169/1274/1921 -f 2152/1257/1922 2169/1274/1922 2168/1273/1922 -f 2153/1258/1923 2154/1259/1923 2170/1275/1923 -f 2153/1258/1924 2170/1275/1924 2169/1274/1924 -f 2154/1259/1925 2155/1260/1925 2171/1276/1925 -f 2154/1259/1926 2171/1276/1926 2170/1275/1926 -f 2155/1260/1927 2156/1261/1927 2172/1277/1927 -f 2155/1260/1928 2172/1277/1928 2171/1276/1928 -f 2156/1261/1929 2157/1262/1929 2173/1278/1929 -f 2156/1261/1930 2173/1278/1930 2172/1277/1930 -f 2157/1262/1931 2158/1263/1931 2174/1279/1931 -f 2157/1262/1396 2174/1279/1396 2173/1278/1396 -f 2158/1263/1932 2159/1264/1932 2175/1280/1932 -f 2158/1263/1933 2175/1280/1933 2174/1279/1933 -f 2159/1264/1934 2160/1265/1934 2176/1281/1934 -f 2159/1264/1935 2176/1281/1935 2175/1280/1935 -f 2160/1265/1936 2161/1266/1936 2177/1282/1936 -f 2160/1265/1937 2177/1282/1937 2176/1281/1937 -f 2161/1266/1938 2162/1267/1938 2178/1283/1938 -f 2161/1266/1939 2178/1283/1939 2177/1282/1939 -f 2162/1267/1940 2163/1268/1940 2179/1284/1940 -f 2162/1267/1941 2179/1284/1941 2178/1283/1941 -f 2163/1268/1942 2164/1269/1942 2180/1285/1942 -f 2163/1268/1408 2180/1285/1408 2179/1284/1408 -f 2164/1269/1943 2165/1270/1943 2181/1286/1943 -f 2164/1269/1944 2181/1286/1944 2180/1285/1944 -f 2165/1270/1411 2252/1254/1411 2181/1286/1411 -f 2253/1221/1412 2166/1271/1412 2182/1287/1412 -f 2166/1271/1945 2167/1272/1945 2183/1288/1945 -f 2166/1271/1414 2183/1288/1414 2182/1287/1414 -f 2167/1272/1946 2168/1273/1946 2184/1289/1946 -f 2167/1272/1947 2184/1289/1947 2183/1288/1947 -f 2168/1273/1948 2169/1274/1948 2185/1290/1948 -f 2168/1273/1949 2185/1290/1949 2184/1289/1949 -f 2169/1274/1950 2170/1275/1950 2186/1291/1950 -f 2169/1274/1951 2186/1291/1951 2185/1290/1951 -f 2170/1275/1952 2171/1276/1952 2187/1292/1952 -f 2170/1275/1952 2187/1292/1952 2186/1291/1952 -f 2171/1276/1953 2172/1277/1953 2188/1293/1953 -f 2171/1276/1954 2188/1293/1954 2187/1292/1954 -f 2172/1277/1955 2173/1278/1955 2189/1294/1955 -f 2172/1277/1956 2189/1294/1956 2188/1293/1956 -f 2173/1278/1957 2174/1279/1957 2190/1295/1957 -f 2173/1278/1958 2190/1295/1958 2189/1294/1958 -f 2174/1279/1959 2175/1280/1959 2191/1296/1959 -f 2174/1279/1960 2191/1296/1960 2190/1295/1960 -f 2175/1280/1961 2176/1281/1961 2192/1297/1961 -f 2175/1280/1962 2192/1297/1962 2191/1296/1962 -f 2176/1281/1963 2177/1282/1963 2193/1298/1963 -f 2176/1281/1964 2193/1298/1964 2192/1297/1964 -f 2177/1282/1965 2178/1283/1965 2194/1299/1965 -f 2177/1282/1966 2194/1299/1966 2193/1298/1966 -f 2178/1283/1967 2179/1284/1967 2195/1300/1967 -f 2178/1283/1968 2195/1300/1968 2194/1299/1968 -f 2179/1284/1969 2180/1285/1969 2196/1301/1969 -f 2179/1284/1970 2196/1301/1970 2195/1300/1970 -f 2180/1285/1441 2181/1286/1441 2197/1302/1441 -f 2180/1285/1442 2197/1302/1442 2196/1301/1442 -f 2181/1286/1443 2254/1254/1443 2197/1302/1443 -f 1988/1091/1444 2255/1303/1444 2198/1304/1444 -f 2256/1303/1971 2257/1305/1971 2199/1306/1971 -f 2258/1303/1972 2199/1306/1972 2198/1304/1972 -f 2259/1305/1973 2260/1307/1973 2200/1308/1973 -f 2261/1305/1974 2200/1308/1974 2199/1306/1974 -f 2262/1307/1975 2263/1309/1975 2201/1310/1975 -f 2264/1307/1976 2201/1310/1976 2200/1308/1976 -f 2265/1309/1977 2266/1311/1977 2202/1312/1977 -f 2267/1309/1978 2202/1312/1978 2201/1310/1978 -f 2268/1311/1454 2269/1313/1454 2203/1314/1454 -f 2270/1311/1979 2203/1314/1979 2202/1312/1979 -f 2271/1313/1980 2272/1315/1980 2204/1316/1980 -f 2273/1313/1981 2204/1316/1981 2203/1314/1981 -f 2274/1315/1982 2275/1317/1982 2205/1318/1982 -f 2276/1315/1983 2205/1318/1983 2204/1316/1983 -f 2277/1317/1984 2278/1319/1984 2206/1320/1984 -f 2279/1317/1985 2206/1320/1985 2205/1318/1985 -f 2280/1319/1986 2281/1321/1986 2207/1322/1986 -f 2282/1319/1987 2207/1322/1987 2206/1320/1987 -f 2283/1321/1988 2284/1323/1988 2208/1324/1988 -f 2285/1321/1989 2208/1324/1989 2207/1322/1989 -f 2286/1323/1990 2287/1325/1990 2209/1326/1990 -f 2288/1323/1991 2209/1326/1991 2208/1324/1991 -f 2289/1325/1992 2290/1327/1992 2210/1328/1992 -f 2291/1325/1993 2210/1328/1993 2209/1326/1993 -f 2292/1327/1994 2293/1329/1994 2211/1330/1994 -f 2294/1327/1995 2211/1330/1995 2210/1328/1995 -f 2295/1329/1996 2296/1331/1996 2212/1332/1996 -f 2297/1329/1997 2212/1332/1997 2211/1330/1997 -f 2298/1331/1998 2299/1333/1998 2213/1334/1998 -f 2300/1331/1999 2213/1334/1999 2212/1332/1999 -f 2301/1333/1475 2005/1124/1475 2213/1334/1475 -f 1988/1091/2000 2198/1304/2000 2214/1335/2000 -f 2198/1304/2001 2199/1306/2001 2215/1336/2001 -f 2198/1304/2002 2215/1336/2002 2214/1335/2002 -f 2199/1306/2003 2200/1308/2003 2216/1337/2003 -f 2199/1306/2004 2216/1337/2004 2215/1336/2004 -f 2200/1308/2005 2201/1310/2005 2217/1338/2005 -f 2200/1308/2006 2217/1338/2006 2216/1337/2006 -f 2201/1310/2007 2202/1312/2007 2218/1339/2007 -f 2201/1310/2008 2218/1339/2008 2217/1338/2008 -f 2202/1312/2009 2203/1314/2009 2219/1340/2009 -f 2202/1312/2010 2219/1340/2010 2218/1339/2010 -f 2203/1314/2011 2204/1316/2011 2220/1341/2011 -f 2203/1314/2012 2220/1341/2012 2219/1340/2012 -f 2204/1316/2013 2205/1318/2013 2221/1342/2013 -f 2204/1316/2014 2221/1342/2014 2220/1341/2014 -f 2205/1318/2015 2206/1320/2015 2222/1343/2015 -f 2205/1318/2016 2222/1343/2016 2221/1342/2016 -f 2206/1320/2017 2207/1322/2017 2223/1344/2017 -f 2206/1320/2018 2223/1344/2018 2222/1343/2018 -f 2207/1322/2019 2208/1324/2019 2224/1345/2019 -f 2207/1322/2020 2224/1345/2020 2223/1344/2020 -f 2208/1324/2021 2209/1326/2021 2225/1346/2021 -f 2208/1324/2022 2225/1346/2022 2224/1345/2022 -f 2209/1326/2023 2210/1328/2023 2226/1347/2023 -f 2209/1326/1499 2226/1347/1499 2225/1346/1499 -f 2210/1328/2024 2211/1330/2024 2227/1348/2024 -f 2210/1328/2025 2227/1348/2025 2226/1347/2025 -f 2211/1330/2026 2212/1332/2026 2228/1349/2026 -f 2211/1330/2027 2228/1349/2027 2227/1348/2027 -f 2212/1332/2028 2213/1334/2028 2229/1350/2028 -f 2212/1332/2029 2229/1350/2029 2228/1349/2029 -f 2213/1334/2030 2005/1124/2030 2229/1350/2030 -f 1988/1091/2031 2214/1335/2031 2230/1351/2031 -f 2214/1335/2032 2215/1336/2032 2231/1352/2032 -f 2214/1335/2033 2231/1352/2033 2230/1351/2033 -f 2215/1336/1510 2216/1337/1510 2232/1353/1510 -f 2215/1336/2034 2232/1353/2034 2231/1352/2034 -f 2216/1337/2035 2217/1338/2035 2233/1354/2035 -f 2216/1337/2036 2233/1354/2036 2232/1353/2036 -f 2217/1338/2037 2218/1339/2037 2234/1355/2037 -f 2217/1338/2038 2234/1355/2038 2233/1354/2038 -f 2218/1339/1517 2219/1340/1517 2235/1356/1517 -f 2218/1339/1517 2235/1356/1517 2234/1355/1517 -f 2219/1340/2039 2220/1341/2039 2236/1357/2039 -f 2219/1340/2040 2236/1357/2040 2235/1356/2040 -f 2220/1341/2041 2221/1342/2041 2237/1358/2041 -f 2220/1341/2042 2237/1358/2042 2236/1357/2042 -f 2221/1342/2043 2222/1343/2043 2238/1359/2043 -f 2221/1342/2044 2238/1359/2044 2237/1358/2044 -f 2222/1343/2045 2223/1344/2045 2239/1360/2045 -f 2222/1343/2046 2239/1360/2046 2238/1359/2046 -f 2223/1344/2047 2224/1345/2047 2240/1361/2047 -f 2223/1344/2048 2240/1361/2048 2239/1360/2048 -f 2224/1345/2049 2225/1346/2049 2241/1362/2049 -f 2224/1345/2050 2241/1362/2050 2240/1361/2050 -f 2225/1346/1530 2226/1347/1530 2242/1363/1530 -f 2225/1346/2051 2242/1363/2051 2241/1362/2051 -f 2226/1347/2052 2227/1348/2052 2243/1364/2052 -f 2226/1347/2053 2243/1364/2053 2242/1363/2053 -f 2227/1348/2054 2228/1349/2054 2244/1365/2054 -f 2227/1348/2055 2244/1365/2055 2243/1364/2055 -f 2228/1349/1536 2229/1350/1536 2245/1366/1536 -f 2228/1349/2056 2245/1366/2056 2244/1365/2056 -f 2229/1350/2057 2005/1124/2057 2245/1366/2057 -f 1988/1091/1539 2230/1351/1539 1989/1092/1539 -f 2230/1351/1540 2231/1352/1540 1990/1094/1540 -f 2230/1351/1541 1990/1094/1541 1989/1092/1541 -f 2231/1352/2058 2232/1353/2058 1991/1096/2058 -f 2231/1352/2059 1991/1096/2059 1990/1094/2059 -f 2232/1353/2060 2233/1354/2060 1992/1098/2060 -f 2232/1353/2061 1992/1098/2061 1991/1096/2061 -f 2233/1354/2062 2234/1355/2062 1993/1100/2062 -f 2233/1354/2063 1993/1100/2063 1992/1098/2063 -f 2234/1355/1548 2235/1356/1548 1994/1102/1548 -f 2234/1355/1549 1994/1102/1549 1993/1100/1549 -f 2235/1356/2064 2236/1357/2064 1995/1104/2064 -f 2235/1356/2065 1995/1104/2065 1994/1102/2065 -f 2236/1357/2066 2237/1358/2066 1996/1106/2066 -f 2236/1357/2067 1996/1106/2067 1995/1104/2067 -f 2237/1358/2068 2238/1359/2068 1997/1108/2068 -f 2237/1358/1555 1997/1108/1555 1996/1106/1555 -f 2238/1359/2069 2239/1360/2069 1998/1110/2069 -f 2238/1359/2070 1998/1110/2070 1997/1108/2070 -f 2239/1360/2071 2240/1361/2071 1999/1112/2071 -f 2239/1360/2072 1999/1112/2072 1998/1110/2072 -f 2240/1361/2073 2241/1362/2073 2000/1114/2073 -f 2240/1361/2074 2000/1114/2074 1999/1112/2074 -f 2241/1362/2075 2242/1363/2075 2001/1116/2075 -f 2241/1362/2076 2001/1116/2076 2000/1114/2076 -f 2242/1363/2077 2243/1364/2077 2002/1118/2077 -f 2242/1363/1565 2002/1118/1565 2001/1116/1565 -f 2243/1364/1566 2244/1365/1566 2003/1120/1566 -f 2243/1364/1567 2003/1120/1567 2002/1118/1567 -f 2244/1365/2078 2245/1366/2078 2004/1122/2078 -f 2244/1365/1569 2004/1122/1569 2003/1120/1569 -f 2245/1366/2079 2005/1124/2079 2004/1122/2079 -o diesTor2 -v -0.121174 0.081108 -3.220146 -v -0.279660 0.081108 -3.220136 -v -0.279614 0.081108 -3.561658 -v -0.121175 0.081108 -3.561658 -v -0.121175 1.021814 -3.561658 -v -0.279613 1.021814 -3.561658 -v -0.279659 1.021814 -3.220136 -v -0.121174 1.021814 -3.220147 -v -0.121054 1.083170 -3.495022 -v -0.235293 1.083170 -3.495020 -v -0.235322 1.083171 -3.286775 -v -0.121054 1.083170 -3.286783 -vn -1.000000 0.000000 -0.000135 -vn 0.000066 0.000000 1.000000 -vn 0.000068 0.000001 1.000000 -vn 0.000001 0.735652 -0.677360 -vn -0.000011 0.735666 -0.677345 -vn -0.810579 0.585629 -0.000109 -vn -0.810580 0.585628 -0.000110 -vn 0.000046 0.735647 0.677365 -vn 0.000052 0.735652 0.677360 -vn -0.000000 1.000000 -0.000001 -s off -f 2305//105 2304//105 2306//105 -f 2307//105 2306//105 2304//105 -f 2304//2080 2303//2080 2307//2080 -f 2308//2080 2307//2080 2303//2080 -f 2303//2081 2302//2081 2308//2081 -f 2302//2082 2309//2082 2308//2082 -f 2306//2083 2307//2083 2310//2083 -f 2311//2084 2310//2084 2307//2084 -f 2307//2085 2308//2085 2311//2085 -f 2312//2086 2311//2086 2308//2086 -f 2308//2087 2309//2087 2312//2087 -f 2313//2088 2312//2088 2309//2088 -f 2311//2089 2312//2089 2310//2089 -f 2313//938 2310//938 2312//938 -o diesTor3 -v 0.157877 0.466232 -3.388764 -v -0.049119 0.081074 -3.388764 -v -0.038222 0.081074 -3.429434 -v -0.016486 0.222057 -3.388764 -v -0.009961 0.222057 -3.413117 -v -0.019060 0.444358 -3.402505 -v -0.093437 0.466232 -3.388764 -v -0.076089 0.466144 -3.451296 -v -0.085450 0.866339 -3.420294 -v -0.012809 0.904039 -3.382836 -v -0.012548 2.009546 -3.388764 -v -0.053920 0.866339 -3.474904 -v -0.008450 0.081075 -3.459206 -v -0.030500 0.466232 -3.497398 -v 0.000691 0.866339 -3.506434 -v 0.011167 0.081075 -3.467332 -v 0.019613 0.222057 -3.435810 -v 0.018479 0.444358 -3.440044 -v 0.032220 0.466232 -3.514205 -v 0.032220 2.009546 -3.433012 -v 0.032220 0.081108 -3.470077 -v 0.072889 0.081075 -3.459206 -v 0.094939 0.466232 -3.497399 -v 0.044076 0.904039 -3.433012 -v 0.102661 0.081074 -3.429434 -v 0.066660 0.222057 -3.423204 -v 0.140528 0.466144 -3.451296 -v 0.137719 0.866339 -3.449674 -v 0.078196 0.444358 -3.415309 -v 0.084404 0.444358 -3.373738 -v 0.113558 0.081074 -3.388764 -v 0.080926 0.222057 -3.388764 -v 0.154040 0.866339 -3.388764 -v 0.076988 0.904039 -3.388764 -v 0.076468 2.009546 -3.388764 -v 0.102662 0.081074 -3.348095 -v 0.074400 0.222057 -3.364412 -v 0.140528 0.466144 -3.326232 -v 0.137719 0.866339 -3.327854 -v 0.072890 0.081074 -3.318323 -v 0.094940 0.466232 -3.280130 -v 0.093130 0.866339 -3.283265 -v 0.032220 0.081108 -3.307451 -v 0.044826 0.222057 -3.341718 -v 0.045960 0.444358 -3.337485 -v 0.032220 0.466232 -3.263324 -v 0.032220 2.009546 -3.344516 -v -0.008449 0.081074 -3.318322 -v -0.030500 0.466232 -3.280130 -v 0.000691 0.866339 -3.271095 -v 0.009316 0.904039 -3.349093 -v -0.038222 0.081074 -3.348094 -v -0.009960 0.222057 -3.364411 -v -0.076088 0.466144 -3.326232 -v -0.013756 0.444358 -3.362220 -v -0.085450 0.866339 -3.357235 -v 0.017740 2.009546 -3.390671 -v 0.028129 2.009546 -3.404034 -v 0.040124 2.009546 -3.402455 -v 0.047670 2.009546 -3.388764 -v 0.040124 2.009546 -3.375073 -v 0.024315 2.009546 -3.375073 -v -0.012809 0.904039 -3.382836 -v 0.076988 0.904039 -3.388764 -v 0.076988 0.904039 -3.388764 -v 0.076988 0.904039 -3.388764 -v 0.009316 0.904039 -3.349093 -v 0.009316 0.904039 -3.349093 -v 0.009316 0.904039 -3.349093 -v -0.012809 0.904039 -3.382836 -vt 0.750000 0.704656 -vt 0.750000 0.653986 -vt 0.745293 0.635870 -vt 0.743291 0.683061 -vt 0.746362 0.706374 -vt 0.750000 0.847632 -vt 0.722247 0.945192 -vt 0.732883 0.826662 -vt 0.678606 0.919138 -vt 0.756675 0.891814 -vt 0.738394 0.613802 -vt 0.736452 0.563542 -vt 0.720486 0.741064 -vt 0.657434 0.792142 -vt -0.243325 0.891814 -vt 0.250000 0.624485 -vt 0.257298 0.500000 -vt 0.740915 0.542953 -vt 0.701691 0.303215 -vt 0.737060 0.560765 -vt 0.716048 0.500001 -vt 0.736610 0.500001 -vt 0.738394 0.386199 -vt 0.742975 0.310185 -vt 0.720486 0.258937 -vt 0.743346 0.386865 -vt 0.697791 0.063379 -vt 0.743291 0.316940 -vt 0.753979 0.290949 -vt 0.732882 0.173338 -vt 0.750000 0.108679 -vt 0.250000 0.376822 -vt -0.250000 0.108679 -vt 0.750000 0.346014 -vt 0.750000 0.295344 -vt 0.750000 0.152368 -vt 0.750000 0.052186 -vt 0.754707 0.364130 -vt 0.756709 0.316939 -vt 0.767117 0.173338 -vt 0.802209 0.063379 -vt 0.761606 0.386199 -vt 0.763548 0.436459 -vt 0.779514 0.258937 -vt 0.834773 0.116725 -vt 0.242701 0.500001 -vt 0.759085 0.457048 -vt 0.793572 0.801075 -vt -0.206428 0.801075 -vt 0.763390 0.499999 -vt 0.783952 0.499999 -vt 0.761606 0.613801 -vt 0.757025 0.689816 -vt 0.779514 0.741063 -vt 0.842567 0.792141 -vt 0.754707 0.635869 -vt 0.756709 0.683061 -vt 0.777754 0.945192 -vt 0.767118 0.826662 -vt 0.250315 0.542204 -vt 0.252520 0.511989 -vt 0.252260 0.476871 -vt 0.250000 0.455009 -vt 0.247740 0.476871 -vt 0.247740 0.523131 -vn -0.942655 0.218194 -0.252573 -vn -0.942656 0.218196 -0.252566 -vn -0.965572 -0.027171 -0.258713 -vn -0.963604 -0.001830 -0.267328 -vn -0.865879 0.018473 -0.499913 -vn -0.363082 0.907870 -0.209625 -vn -0.690069 0.218197 -0.690069 -vn -0.707099 0.004813 -0.707098 -vn -0.197842 -0.960136 -0.197476 -vn -0.711057 -0.002091 -0.703132 -vn -0.175934 0.936048 -0.304732 -vn -0.702958 -0.003648 -0.711222 -vn -0.590193 0.245119 -0.769148 -vn -0.608664 -0.018212 -0.793219 -vn -0.197527 -0.960191 -0.197527 -vn -0.271499 0.911892 -0.307801 -vn -0.661482 -0.007094 -0.749927 -vn -0.372991 0.223677 -0.900470 -vn -0.079179 -0.952058 -0.295493 -vn -0.258823 -0.001636 -0.965923 -vn -0.126375 0.223652 -0.966441 -vn 0.250238 0.249791 -0.935407 -vn 0.382637 -0.015642 -0.923766 -vn 0.098358 -0.966405 -0.237459 -vn 0.072300 -0.960191 -0.269827 -vn 0.258624 0.039126 -0.965185 -vn 0.250604 0.249908 -0.935277 -vn 0.258759 0.020872 -0.965716 -vn 0.381770 0.069116 -0.921670 -vn 0.691758 0.207215 -0.691761 -vn 0.226820 0.805417 -0.547591 -vn 0.599735 -0.795170 -0.089566 -vn 0.158750 -0.974456 -0.158849 -vn 0.325057 0.914265 -0.241780 -vn 0.707091 0.007583 -0.707082 -vn 0.802379 0.000378 -0.596815 -vn 0.895691 0.245118 -0.371017 -vn 0.942655 0.218191 -0.252575 -vn 0.987983 -0.046030 -0.147548 -vn 0.923816 0.011411 -0.382667 -vn 0.270687 -0.959839 -0.073742 -vn 0.965896 0.007828 -0.258811 -vn 0.963558 0.009240 -0.267338 -vn 0.436479 0.892081 -0.116953 -vn 0.942651 0.218190 0.252593 -vn 0.942656 0.218196 0.252568 -vn 0.965410 -0.032594 0.258691 -vn 0.299724 -0.950512 0.081812 -vn 0.963558 0.009239 0.267339 -vn 0.965896 0.007828 0.258812 -vn 0.436479 0.892081 0.116954 -vn 0.690074 0.218196 0.690064 -vn 0.686071 -0.000354 0.727535 -vn 0.201707 -0.958538 0.201293 -vn 0.707083 0.007828 0.707087 -vn 0.711043 0.008726 0.703094 -vn 0.283858 0.915886 0.283860 -vn 0.707109 0.000333 0.707105 -vn 0.590197 0.245119 0.769145 -vn 0.608668 -0.018212 0.793216 -vn 0.191319 -0.960331 0.202881 -vn 0.179700 0.934743 0.306535 -vn 0.505682 -0.014048 0.862605 -vn 0.252800 0.207153 0.945082 -vn 0.079176 -0.952058 0.295493 -vn 0.258810 0.008738 0.965889 -vn -0.250239 0.249790 0.935407 -vn -0.382633 -0.015639 0.923768 -vn -0.098358 -0.966406 0.237457 -vn -0.072299 -0.960191 0.269825 -vn 0.130472 0.029528 0.991012 -vn -0.366751 0.285524 0.885421 -vn -0.382636 -0.015639 0.923767 -vn -0.258818 -0.001636 0.965925 -vn 0.057880 0.896312 0.439630 -vn -0.690066 0.218197 0.690072 -vn -0.710590 0.037806 0.702590 -vn -0.706565 0.039125 0.706566 -vn -0.211649 -0.954272 0.211116 -vn -0.337278 0.878912 0.337279 -vn -0.503601 0.798348 0.330191 -vn -0.702917 0.011619 0.711177 -vn -0.836270 0.003137 0.548308 -vn -0.942648 0.218198 0.252594 -vn -0.942654 0.218194 0.252578 -vn -0.991280 -0.018213 0.130508 -vn -0.965911 0.004815 0.258828 -vn -0.308684 -0.950296 0.040640 -vn -0.963602 -0.001831 0.267337 -vn -0.356870 -0.934154 0.000001 -vn -0.005092 -0.999987 0.000000 -vn -0.999801 0.019959 0.000000 -vn -0.460648 0.887583 0.000000 -vn 0.711042 0.007840 -0.703106 -vn -0.499902 0.019418 -0.865864 -s off -f 2315/1367/2090 2317/1368/2090 2318/1369/2090 -f 2315/1367/2091 2318/1369/2091 2316/1370/2091 -f 2317/1368/2092 2319/1371/2092 2318/1369/2092 -f 2320/1372/2093 2322/1373/2093 2321/1374/2093 -f 2321/1374/2094 2322/1373/2094 2325/1375/2094 -f 2322/1373/2095 2323/1376/2095 2325/1375/2095 -f 2316/1370/2096 2318/1369/2096 2326/1377/2096 -f 2318/1369/2097 2319/1371/2097 2331/1378/2097 -f 2319/1371/2098 2321/1374/2098 2327/1379/2098 -f 2321/1374/2099 2325/1375/2099 2327/1379/2099 -f 2323/1376/2100 2328/1380/2100 2325/1375/2100 -f 2376/1381/2101 2324/1382/2101 2333/1383/2101 -f 2326/1377/2102 2318/1369/2102 2330/1384/2102 -f 2318/1369/2103 2331/1378/2103 2330/1384/2103 -f 2331/1378/2104 2319/1371/2104 2327/1379/2104 -f 2328/1380/2105 2323/1376/2105 2337/1385/2105 -f 2323/1376/2106 2333/1383/2106 2337/1385/2106 -f 2326/1377/2107 2330/1384/2107 2329/1386/2107 -f 2327/1379/2108 2332/1387/2108 2331/1378/2108 -f 2327/1379/2109 2328/1380/2109 2332/1387/2109 -f 2329/1386/2110 2330/1384/2110 2334/1388/2110 -f 2334/1388/2111 2330/1384/2111 2335/1389/2111 -f 2330/1384/2112 2331/1378/2112 2342/1390/2112 -f 2331/1378/2113 2336/1391/2113 2342/1390/2113 -f 2331/1378/2114 2332/1387/2114 2336/1391/2114 -f 2332/1387/2115 2328/1380/2115 2336/1391/2115 -f 2335/1389/2116 2330/1384/2116 2339/1392/2116 -f 2330/1384/2117 2342/1390/2117 2339/1392/2117 -f 2336/1391/2118 2328/1380/2118 2341/1393/2118 -f 2335/1389/2119 2339/1392/2119 2338/1394/2119 -f 2328/1380/2120 2337/1385/2120 2341/1393/2120 -f 2342/1390/2121 2336/1391/2121 2343/1395/2121 -f 2336/1391/2122 2340/1396/2122 2343/1395/2122 -f 2341/1393/2123 2337/1385/2123 2347/1397/2123 -f 2337/1385/2124 2333/1383/2124 2348/1398/2124 -f 2337/1385/2125 2348/1398/2125 2377/1399/2125 -f 2338/1394/2126 2339/1392/2126 2345/1400/2126 -f 2338/1394/2127 2345/1400/2127 2344/1401/2127 -f 2339/1392/2128 2342/1390/2128 2343/1395/2128 -f 2339/1392/2129 2343/1395/2129 2345/1400/2129 -f 2314/1402/2130 2343/1395/2130 2340/1396/2130 -f 2340/1396/2131 2341/1393/2131 2346/1403/2131 -f 2314/1402/2132 2340/1396/2132 2346/1403/2132 -f 2341/1393/2133 2347/1397/2133 2346/1403/2133 -f 2344/1401/2134 2345/1400/2134 2350/1404/2134 -f 2344/1401/2135 2350/1404/2135 2349/1405/2135 -f 2345/1400/2136 2343/1395/2136 2350/1404/2136 -f 2314/1402/2137 2351/1406/2137 2343/1395/2137 -f 2314/1402/2138 2346/1403/2138 2351/1406/2138 -f 2346/1403/2139 2352/1407/2139 2351/1406/2139 -f 2346/1403/2140 2347/1397/2140 2352/1407/2140 -f 2349/1405/2141 2350/1404/2141 2353/1408/2141 -f 2350/1404/2142 2343/1395/2142 2358/1409/2142 -f 2343/1395/2143 2351/1406/2143 2354/1410/2143 -f 2351/1406/2144 2352/1407/2144 2355/1411/2144 -f 2351/1406/2145 2355/1411/2145 2354/1410/2145 -f 2352/1407/2146 2347/1397/2146 2355/1411/2146 -f 2378/1399/2147 2348/1398/2147 2360/1412/2147 -f 2353/1408/2148 2350/1404/2148 2357/1413/2148 -f 2350/1404/2149 2358/1409/2149 2357/1413/2149 -f 2358/1409/2150 2343/1395/2150 2354/1410/2150 -f 2355/1411/2151 2347/1397/2151 2364/1414/2151 -f 2379/1399/2152 2360/1412/2152 2380/1415/2152 -f 2353/1408/2153 2357/1413/2153 2356/1416/2153 -f 2354/1410/2154 2359/1417/2154 2358/1409/2154 -f 2354/1410/2155 2355/1411/2155 2359/1417/2155 -f 2356/1416/2156 2357/1413/2156 2361/1418/2156 -f 2357/1413/2157 2358/1409/2157 2368/1419/2157 -f 2358/1409/2158 2362/1420/2158 2368/1419/2158 -f 2358/1409/2159 2359/1417/2159 2362/1420/2159 -f 2359/1417/2160 2355/1411/2160 2363/1421/2160 -f 2361/1418/2161 2357/1413/2161 2366/1422/2161 -f 2357/1413/2162 2368/1419/2162 2366/1422/2162 -f 2359/1417/2163 2363/1421/2163 2362/1420/2163 -f 2355/1411/2164 2364/1414/2164 2363/1421/2164 -f 2361/1418/2165 2366/1422/2165 2365/1423/2165 -f 2362/1420/2166 2369/1424/2166 2367/1425/2166 -f 2362/1420/2167 2363/1421/2167 2369/1424/2167 -f 2368/1419/2168 2362/1420/2168 2367/1425/2168 -f 2369/1424/2169 2363/1421/2169 2323/1376/2169 -f 2363/1421/2170 2364/1414/2170 2323/1376/2170 -f 2381/1415/2171 2360/1412/2171 2324/1382/2171 -f 2382/1415/2172 2324/1382/2172 2383/1381/2172 -f 2365/1423/2173 2366/1422/2173 2317/1368/2173 -f 2365/1423/2174 2317/1368/2174 2315/1367/2174 -f 2366/1422/2175 2368/1419/2175 2319/1371/2175 -f 2366/1422/2176 2319/1371/2176 2317/1368/2176 -f 2368/1419/2177 2367/1425/2177 2319/1371/2177 -f 2367/1425/2178 2369/1424/2178 2320/1372/2178 -f 2367/1425/2179 2321/1374/2179 2319/1371/2179 -f 2367/1425/2180 2320/1372/2180 2321/1374/2180 -f 2320/1372/2181 2369/1424/2181 2322/1373/2181 -f 2369/1424/2182 2323/1376/2182 2322/1373/2182 -f 2336/1391/2183 2341/1393/2183 2340/1396/2183 -f 2328/1380/2184 2327/1379/2184 2325/1375/2184 -f 2333/1383/331 2324/1382/331 2370/1426/331 -f 2370/1426/331 2371/1427/331 2333/1383/331 -f 2371/1427/331 2372/1428/331 2333/1383/331 -f 2348/1398/331 2333/1383/331 2373/1429/331 -f 2372/1428/331 2373/1429/331 2333/1383/331 -f 2348/1398/331 2373/1429/331 2360/1412/331 -f 2374/1430/331 2360/1412/331 2373/1429/331 -f 2374/1430/331 2375/1431/331 2360/1412/331 -f 2324/1382/331 2360/1412/331 2370/1426/331 -f 2375/1431/331 2370/1426/331 2360/1412/331 -o diesentr -v -1.749531 0.798069 0.757057 -v -1.216430 0.798069 0.757057 -v -1.749531 0.798069 0.482212 -v -1.216430 0.798069 0.482212 -v -1.749531 0.093855 0.757057 -v -1.216430 0.093855 0.757057 -v -1.749531 0.093855 0.482212 -v -1.216430 0.093855 0.482212 -v -1.216430 0.798069 0.757057 -v -1.216430 0.093855 0.757057 -v -1.216430 0.093855 0.757057 -vt 0.424239 0.775438 -vt 0.575761 0.775438 -vt 0.075761 0.775438 -vt -0.075761 0.775438 -vt -0.075761 0.224562 -vt 0.575761 0.224562 -vt 0.075761 0.224562 -vt 0.424239 0.224562 -vt 0.924239 0.775438 -vt 0.924239 0.224562 +f 73//9 74//9 76//9 +f 75//10 76//10 78//10 +f 77//11 78//11 80//11 +f 79//12 80//12 82//12 +f 81//13 82//13 84//13 +f 83//14 84//14 86//14 +f 85//15 86//15 88//15 +f 87//16 88//16 90//16 +f 89//17 90//17 92//17 +f 91//18 92//18 94//18 +f 93//19 94//19 96//19 +f 95//20 96//20 98//20 +f 97//21 98//21 100//21 +f 99//22 100//22 102//22 +f 101//23 102//23 104//23 +f 103//24 104//24 106//24 +f 105//25 106//25 107//25 +f 107//26 108//26 109//26 +f 109//27 110//27 111//27 +f 111//28 112//28 113//28 +f 113//29 114//29 115//29 +f 115//43 116//43 117//43 +f 117//44 118//44 119//44 +f 119//32 120//32 121//32 +f 121//33 122//33 123//33 +f 123//45 124//45 125//45 +f 125//35 126//35 127//35 +f 127//36 128//36 129//36 +f 129//37 130//37 131//37 +f 131//38 132//38 133//38 +f 76//39 74//39 78//39 +f 135//40 136//40 73//40 +f 133//41 134//41 135//41 +f 73//42 75//42 135//42 +f 75//9 73//9 76//9 +f 77//10 75//10 78//10 +f 79//11 77//11 80//11 +f 81//12 79//12 82//12 +f 83//13 81//13 84//13 +f 85//14 83//14 86//14 +f 87//15 85//15 88//15 +f 89//16 87//16 90//16 +f 91//17 89//17 92//17 +f 93//18 91//18 94//18 +f 95//19 93//19 96//19 +f 97//20 95//20 98//20 +f 99//21 97//21 100//21 +f 101//22 99//22 102//22 +f 103//23 101//23 104//23 +f 105//24 103//24 106//24 +f 106//25 108//25 107//25 +f 108//26 110//26 109//26 +f 110//27 112//27 111//27 +f 112//28 114//28 113//28 +f 114//29 116//29 115//29 +f 116//43 118//43 117//43 +f 118//44 120//44 119//44 +f 120//32 122//32 121//32 +f 122//33 124//33 123//33 +f 124//45 126//45 125//45 +f 126//35 128//35 127//35 +f 128//36 130//36 129//36 +f 130//37 132//37 131//37 +f 132//38 134//38 133//38 +f 74//39 136//39 78//39 +f 136//39 134//39 78//39 +f 134//39 132//39 78//39 +f 132//39 130//39 78//39 +f 130//39 128//39 78//39 +f 128//39 126//39 78//39 +f 126//39 124//39 78//39 +f 124//39 122//39 78//39 +f 122//39 120//39 78//39 +f 120//39 118//39 78//39 +f 118//39 116//39 78//39 +f 116//39 114//39 78//39 +f 114//39 112//39 78//39 +f 112//39 110//39 78//39 +f 110//39 108//39 78//39 +f 108//39 106//39 78//39 +f 106//39 104//39 78//39 +f 104//39 102//39 78//39 +f 102//39 100//39 78//39 +f 100//39 98//39 78//39 +f 98//39 96//39 78//39 +f 96//39 94//39 78//39 +f 94//39 92//39 78//39 +f 92//39 90//39 78//39 +f 90//39 88//39 78//39 +f 88//39 86//39 78//39 +f 86//39 84//39 78//39 +f 84//39 82//39 80//39 +f 78//39 84//39 80//39 +f 136//40 74//40 73//40 +f 134//41 136//41 135//41 +f 75//42 77//42 135//42 +f 77//42 79//42 135//42 +f 79//42 81//42 135//42 +f 81//42 83//42 135//42 +f 83//42 85//42 135//42 +f 85//42 87//42 135//42 +f 87//42 89//42 135//42 +f 89//42 91//42 135//42 +f 91//42 93//42 135//42 +f 93//42 95//42 135//42 +f 95//42 97//42 135//42 +f 97//42 99//42 135//42 +f 99//42 101//42 135//42 +f 101//42 103//42 135//42 +f 103//42 105//42 135//42 +f 105//42 107//42 135//42 +f 107//42 109//42 135//42 +f 109//42 111//42 135//42 +f 111//42 113//42 135//42 +f 113//42 115//42 135//42 +f 115//42 117//42 135//42 +f 117//42 119//42 135//42 +f 119//42 121//42 135//42 +f 121//42 123//42 135//42 +f 123//42 125//42 135//42 +f 125//42 127//42 135//42 +f 127//42 129//42 135//42 +f 129//42 131//42 135//42 +f 131//42 133//42 135//42 +v -2.345663 0.025178 -0.194338 +v -2.345663 0.025178 -0.594338 +v -1.345663 0.025178 -0.594338 +v -1.345663 0.025178 -0.194338 +v -2.345663 1.525178 -0.194338 +v -2.345663 1.525178 -0.594338 +v -1.345663 1.525178 -0.594338 +v -1.345663 1.525178 -0.194338 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 1.000000 s off -f 2386/1432/331 2384/1433/331 2387/1434/331 -f 2384/1433/331 2385/1435/331 2387/1434/331 -f 2389/1436/3 2388/1437/3 2391/1438/3 -f 2390/1439/3 2391/1438/3 2388/1437/3 -f 2392/1440/21 2384/1433/21 2393/1441/21 -f 2384/1433/21 2388/1437/21 2394/1441/21 -f 2387/1434/63 2385/1435/63 2391/1438/63 -f 2389/1436/63 2391/1438/63 2385/1435/63 -f 2386/1432/105 2387/1434/105 2390/1439/105 -f 2391/1438/105 2390/1439/105 2387/1434/105 -f 2384/1433/7 2386/1432/7 2388/1437/7 -f 2390/1439/7 2388/1437/7 2386/1432/7 -o diestable -v 1.257437 0.108984 1.444684 -v 1.268351 0.108984 1.444684 -v 1.257437 0.108984 1.433770 -v 1.268351 0.108984 1.433770 -v 1.257437 0.210344 1.444684 -v 1.268351 0.210344 1.444684 -v 1.257437 0.210344 1.433770 -v 1.268351 0.210344 1.433770 -v 1.125997 0.218131 1.449539 -v 1.273299 0.218131 1.449539 -v 1.125997 0.218131 1.300170 -v 1.273299 0.218131 1.300170 -v 1.125997 0.209975 1.449539 -v 1.273299 0.209975 1.449539 -v 1.125997 0.209975 1.300170 -v 1.273299 0.209975 1.300170 -v 1.257437 0.108984 1.315815 -v 1.268351 0.108984 1.315815 -v 1.257437 0.108984 1.304900 -v 1.268351 0.108984 1.304900 -v 1.257437 0.210344 1.315815 -v 1.268351 0.210344 1.315815 -v 1.257437 0.210344 1.304900 -v 1.268351 0.210344 1.304900 -v 1.130359 0.108984 1.444684 -v 1.141273 0.108984 1.444684 -v 1.130359 0.108984 1.433770 -v 1.141273 0.108984 1.433770 -v 1.130359 0.210344 1.444684 -v 1.141273 0.210344 1.444684 -v 1.130359 0.210344 1.433770 -v 1.141273 0.210344 1.433770 -v 1.130359 0.108984 1.315815 -v 1.141273 0.108984 1.315815 -v 1.130359 0.108984 1.304900 -v 1.141273 0.108984 1.304900 -v 1.130359 0.210344 1.315815 -v 1.141273 0.210344 1.315815 -v 1.130359 0.210344 1.304900 -v 1.141273 0.210344 1.304900 -v 1.049546 0.372457 1.743024 -v 1.350588 0.372457 1.743024 -v 1.049546 0.372457 1.475445 -v 1.350588 0.372457 1.475445 -v 1.049546 0.355648 1.743024 -v 1.350588 0.355648 1.743024 -v 1.049546 0.355648 1.475445 -v 1.350588 0.355648 1.475445 -v 1.316244 0.355807 1.733738 -v 1.342980 0.355807 1.733738 -v 1.316244 0.355807 1.710513 -v 1.342980 0.355807 1.710513 -v 1.316244 0.108981 1.733738 -v 1.342980 0.108981 1.733738 -v 1.316244 0.108981 1.710513 -v 1.342980 0.108981 1.710513 -v 1.316244 0.355807 1.508034 -v 1.342980 0.355807 1.508034 -v 1.316244 0.355807 1.484808 -v 1.342980 0.355807 1.484808 -v 1.316244 0.108981 1.508034 -v 1.342980 0.108981 1.508034 -v 1.316244 0.108981 1.484808 -v 1.342980 0.108981 1.484808 -v 1.056349 0.355807 1.508034 -v 1.083084 0.355807 1.508034 -v 1.056349 0.355807 1.484808 -v 1.083084 0.355807 1.484808 -v 1.056349 0.108981 1.508034 -v 1.083084 0.108981 1.508034 -v 1.056349 0.108981 1.484808 -v 1.083084 0.108981 1.484808 -v 1.056349 0.355807 1.733738 -v 1.083084 0.355807 1.733738 -v 1.056349 0.355807 1.710513 -v 1.083084 0.355807 1.710513 -v 1.056349 0.108981 1.733738 -v 1.083084 0.108981 1.733738 -v 1.056349 0.108981 1.710513 -v 1.083084 0.108981 1.710513 -vt 0.107686 0.967496 -vt 0.107686 0.894425 -vt 0.033590 0.894425 -vt 0.033590 0.967496 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 0.000000 -vt 0.000000 1.000000 -vt 0.107685 0.104738 -vt 0.107685 0.031668 -vt 0.033589 0.031668 -vt 0.033589 0.104738 -vt 0.970391 0.967496 -vt 0.970391 0.894425 -vt 0.896295 0.894425 -vt 0.896295 0.967496 -vt 0.970390 0.104738 -vt 0.970390 0.031668 -vt 0.896294 0.031668 -vt 0.896295 0.104738 -vt 0.025273 0.965299 -vt 0.114081 0.965299 -vt 0.025273 0.878500 -vt 0.114081 0.878500 -vt 0.025273 0.121792 -vt 0.114081 0.121792 -vt 0.025273 0.034992 -vt 0.114081 0.034992 -vt 0.888592 0.121792 -vt 0.977400 0.121792 -vt 0.888592 0.034992 -vt 0.977400 0.034992 -vt 0.888592 0.965299 -vt 0.977400 0.965299 -vt 0.888592 0.878499 -vt 0.977400 0.878499 +f 141//46 142//46 137//46 +f 142//47 143//47 138//47 +f 143//48 144//48 140//48 +f 144//49 141//49 137//49 +f 137//42 138//42 139//42 +f 144//39 143//39 142//39 +f 142//46 138//46 137//46 +f 143//47 139//47 138//47 +f 139//48 143//48 140//48 +f 140//49 144//49 137//49 +f 140//42 137//42 139//42 +f 141//39 144//39 142//39 +v 1.364119 0.019809 -0.205019 +v 1.364119 0.019809 -0.605019 +v 2.364120 0.019809 -0.605019 +v 2.364120 0.019809 -0.205019 +v 1.364119 1.419809 -0.205019 +v 1.364119 1.419809 -0.605019 +v 2.364120 1.419809 -0.605019 +v 2.364120 1.419809 -0.205019 s off -f 2395/1442/3 2397/1443/3 2398/1444/3 -f 2395/1442/3 2398/1444/3 2396/1445/3 -f 2399/1442/331 2400/1445/331 2402/1444/331 -f 2402/1444/331 2401/1443/331 2399/1442/331 -f 2395/1442/21 2396/1445/21 2400/1445/21 -f 2395/1442/21 2400/1445/21 2399/1442/21 -f 2396/1445/63 2398/1444/63 2402/1444/63 -f 2402/1444/63 2400/1445/63 2396/1445/63 -f 2398/1444/105 2397/1443/105 2401/1443/105 -f 2401/1443/105 2402/1444/105 2398/1444/105 -f 2397/1443/7 2395/1442/7 2399/1442/7 -f 2399/1442/7 2401/1443/7 2397/1443/7 -f 2405/1446/331 2403/1447/331 2406/1448/331 -f 2404/1449/331 2406/1448/331 2403/1447/331 -f 2408/1449/3 2407/1447/3 2410/1448/3 -f 2409/1446/3 2410/1448/3 2407/1447/3 -f 2404/1449/21 2403/1447/21 2408/1449/21 -f 2407/1447/21 2408/1449/21 2403/1447/21 -f 2406/1448/63 2404/1449/63 2410/1448/63 -f 2408/1449/63 2410/1448/63 2404/1449/63 -f 2405/1446/105 2406/1448/105 2409/1446/105 -f 2410/1448/105 2409/1446/105 2406/1448/105 -f 2403/1447/7 2405/1446/7 2407/1447/7 -f 2409/1446/7 2407/1447/7 2405/1446/7 -f 2411/1450/3 2413/1451/3 2414/1452/3 -f 2414/1452/3 2412/1453/3 2411/1450/3 -f 2415/1450/331 2416/1453/331 2418/1452/331 -f 2418/1452/331 2417/1451/331 2415/1450/331 -f 2411/1450/21 2412/1453/21 2416/1453/21 -f 2416/1453/21 2415/1450/21 2411/1450/21 -f 2412/1453/63 2414/1452/63 2418/1452/63 -f 2418/1452/63 2416/1453/63 2412/1453/63 -f 2414/1452/105 2413/1451/105 2417/1451/105 -f 2417/1451/105 2418/1452/105 2414/1452/105 -f 2413/1451/7 2411/1450/7 2415/1450/7 -f 2415/1450/7 2417/1451/7 2413/1451/7 -f 2419/1454/3 2421/1455/3 2422/1456/3 -f 2422/1456/3 2420/1457/3 2419/1454/3 -f 2423/1454/331 2424/1457/331 2426/1456/331 -f 2426/1456/331 2425/1455/331 2423/1454/331 -f 2419/1454/21 2420/1457/21 2424/1457/21 -f 2424/1457/21 2423/1454/21 2419/1454/21 -f 2420/1457/63 2422/1456/63 2426/1456/63 -f 2426/1456/63 2424/1457/63 2420/1457/63 -f 2422/1456/105 2421/1455/105 2425/1455/105 -f 2425/1455/105 2426/1456/105 2422/1456/105 -f 2421/1455/7 2419/1454/7 2423/1454/7 -f 2423/1454/7 2425/1455/7 2421/1455/7 -f 2427/1458/3 2429/1459/3 2430/1460/3 -f 2430/1460/3 2428/1461/3 2427/1458/3 -f 2431/1458/331 2432/1461/331 2434/1460/331 -f 2434/1460/331 2433/1459/331 2431/1458/331 -f 2427/1458/21 2428/1461/21 2432/1461/21 -f 2432/1461/21 2431/1458/21 2427/1458/21 -f 2428/1461/63 2430/1460/63 2434/1460/63 -f 2434/1460/63 2432/1461/63 2428/1461/63 -f 2430/1460/105 2429/1459/105 2433/1459/105 -f 2433/1459/105 2434/1460/105 2430/1460/105 -f 2429/1459/7 2427/1458/7 2431/1458/7 -f 2431/1458/7 2433/1459/7 2429/1459/7 -f 2437/1446/331 2435/1447/331 2438/1448/331 -f 2436/1449/331 2438/1448/331 2435/1447/331 -f 2440/1449/3 2439/1447/3 2442/1448/3 -f 2441/1446/3 2442/1448/3 2439/1447/3 -f 2436/1449/21 2435/1447/21 2440/1449/21 -f 2439/1447/21 2440/1449/21 2435/1447/21 -f 2438/1448/63 2436/1449/63 2442/1448/63 -f 2440/1449/63 2442/1448/63 2436/1449/63 -f 2437/1446/105 2438/1448/105 2441/1446/105 -f 2442/1448/105 2441/1446/105 2438/1448/105 -f 2435/1447/7 2437/1446/7 2439/1447/7 -f 2441/1446/7 2439/1447/7 2437/1446/7 -f 2444/1462/21 2443/1463/21 2448/1462/21 -f 2447/1463/21 2448/1462/21 2443/1463/21 -f 2446/1464/63 2444/1462/63 2450/1464/63 -f 2448/1462/63 2450/1464/63 2444/1462/63 -f 2445/1465/105 2446/1464/105 2449/1465/105 -f 2450/1464/105 2449/1465/105 2446/1464/105 -f 2443/1463/7 2445/1465/7 2447/1463/7 -f 2449/1465/7 2447/1463/7 2445/1465/7 -f 2452/1466/21 2451/1467/21 2456/1466/21 -f 2455/1467/21 2456/1466/21 2451/1467/21 -f 2454/1468/63 2452/1466/63 2458/1468/63 -f 2456/1466/63 2458/1468/63 2452/1466/63 -f 2453/1469/105 2454/1468/105 2457/1469/105 -f 2458/1468/105 2457/1469/105 2454/1468/105 -f 2451/1467/7 2453/1469/7 2455/1467/7 -f 2457/1469/7 2455/1467/7 2453/1469/7 -f 2460/1470/21 2459/1471/21 2464/1470/21 -f 2463/1471/21 2464/1470/21 2459/1471/21 -f 2462/1472/63 2460/1470/63 2466/1472/63 -f 2464/1470/63 2466/1472/63 2460/1470/63 -f 2461/1473/105 2462/1472/105 2465/1473/105 -f 2466/1472/105 2465/1473/105 2462/1472/105 -f 2459/1471/7 2461/1473/7 2463/1471/7 -f 2465/1473/7 2463/1471/7 2461/1473/7 -f 2468/1474/21 2467/1475/21 2472/1474/21 -f 2471/1475/21 2472/1474/21 2467/1475/21 -f 2470/1476/63 2468/1474/63 2474/1476/63 -f 2472/1474/63 2474/1476/63 2468/1474/63 -f 2469/1477/105 2470/1476/105 2473/1477/105 -f 2474/1476/105 2473/1477/105 2470/1476/105 -f 2467/1475/7 2469/1477/7 2471/1475/7 -f 2473/1477/7 2471/1475/7 2469/1477/7 -o diesveta -v 0.284820 3.117997 3.288503 -v 0.301529 3.117997 3.288503 -v 0.284820 3.117997 3.276784 -v 0.301529 3.117997 3.276784 -v 0.284820 0.094288 3.288503 -v 0.301529 0.094288 3.288503 -v 0.284820 0.094288 3.276784 -v 0.301529 0.094288 3.276784 -v 0.284820 3.117997 3.475511 -v 0.301529 3.117997 3.475511 -v 0.284820 3.117997 3.463792 -v 0.301529 3.117997 3.463792 -v 0.284820 0.094288 3.475511 -v 0.301529 0.094288 3.475511 -v 0.284820 0.094288 3.463792 -v 0.301529 0.094288 3.463792 -v 0.285544 3.117019 3.463942 -v 0.300805 3.117019 3.463942 -v 0.285544 3.124938 3.463942 -v 0.300805 3.124938 3.463942 -v 0.285544 3.117019 3.288942 -v 0.300805 3.117019 3.288942 -v 0.285544 3.124938 3.288942 -v 0.300805 3.124938 3.288942 -v 0.285544 3.004029 3.463942 -v 0.300805 3.004029 3.463942 -v 0.285544 3.011948 3.463942 -v 0.300805 3.011948 3.463942 -v 0.285544 3.004029 3.288942 -v 0.300805 3.004029 3.288942 -v 0.285544 3.011948 3.288942 -v 0.300805 3.011948 3.288942 -v 0.285544 2.879785 3.463942 -v 0.300805 2.879785 3.463942 -v 0.285544 2.887704 3.463942 -v 0.300805 2.887704 3.463942 -v 0.285544 2.879785 3.288942 -v 0.300805 2.879785 3.288942 -v 0.285544 2.887704 3.288942 -v 0.300805 2.887704 3.288942 -v 0.285544 2.755542 3.463942 -v 0.300805 2.755542 3.463942 -v 0.285544 2.763461 3.463942 -v 0.300805 2.763461 3.463942 -v 0.285544 2.755542 3.288942 -v 0.300805 2.755542 3.288942 -v 0.285544 2.763461 3.288942 -v 0.300805 2.763461 3.288942 -v 0.285544 2.631298 3.463942 -v 0.300805 2.631298 3.463942 -v 0.285544 2.639217 3.463942 -v 0.300805 2.639217 3.463942 -v 0.285544 2.631298 3.288942 -v 0.300805 2.631298 3.288942 -v 0.285544 2.639217 3.288942 -v 0.300805 2.639217 3.288942 -v 0.285544 2.507055 3.463942 -v 0.300805 2.507055 3.463942 -v 0.285544 2.514973 3.463942 -v 0.300805 2.514973 3.463942 -v 0.285544 2.507055 3.288942 -v 0.300805 2.507055 3.288942 -v 0.285544 2.514973 3.288942 -v 0.300805 2.514973 3.288942 -v 0.285544 2.382811 3.463942 -v 0.300805 2.382811 3.463942 -v 0.285544 2.390730 3.463942 -v 0.300805 2.390730 3.463942 -v 0.285544 2.382811 3.288942 -v 0.300805 2.382811 3.288942 -v 0.285544 2.390730 3.288942 -v 0.300805 2.390730 3.288942 -v 0.285544 2.258567 3.463942 -v 0.300805 2.258567 3.463942 -v 0.285544 2.266486 3.463942 -v 0.300805 2.266486 3.463942 -v 0.285544 2.258567 3.288942 -v 0.300805 2.258567 3.288942 -v 0.285544 2.266486 3.288942 -v 0.300805 2.266486 3.288942 -v 0.285544 2.134324 3.463942 -v 0.300805 2.134324 3.463942 -v 0.285544 2.142243 3.463942 -v 0.300805 2.142243 3.463942 -v 0.285544 2.134324 3.288942 -v 0.300805 2.134324 3.288942 -v 0.285544 2.142243 3.288942 -v 0.300805 2.142243 3.288942 -v 0.285544 2.010080 3.463942 -v 0.300805 2.010080 3.463942 -v 0.285544 2.017999 3.463942 -v 0.300805 2.017999 3.463942 -v 0.285544 2.010080 3.288942 -v 0.300805 2.010080 3.288942 -v 0.285544 2.017999 3.288942 -v 0.300805 2.017999 3.288942 -v 0.285544 1.885837 3.463942 -v 0.300805 1.885837 3.463942 -v 0.285544 1.893756 3.463942 -v 0.300805 1.893756 3.463942 -v 0.285544 1.885837 3.288942 -v 0.300805 1.885837 3.288942 -v 0.285544 1.893756 3.288942 -v 0.300805 1.893756 3.288942 -v 0.285544 1.761593 3.463942 -v 0.300805 1.761593 3.463942 -v 0.285544 1.769512 3.463942 -v 0.300805 1.769512 3.463942 -v 0.285544 1.761593 3.288942 -v 0.300805 1.761593 3.288942 -v 0.285544 1.769512 3.288942 -v 0.300805 1.769512 3.288942 -v 0.285544 1.637350 3.463942 -v 0.300805 1.637350 3.463942 -v 0.285544 1.645269 3.463942 -v 0.300805 1.645269 3.463942 -v 0.285544 1.637350 3.288942 -v 0.300805 1.637350 3.288942 -v 0.285544 1.645269 3.288942 -v 0.300805 1.645269 3.288942 -v 0.285544 1.513106 3.463942 -v 0.300805 1.513106 3.463942 -v 0.285544 1.521025 3.463942 -v 0.300805 1.521025 3.463942 -v 0.285544 1.513106 3.288942 -v 0.300805 1.513106 3.288942 -v 0.285544 1.521025 3.288942 -v 0.300805 1.521025 3.288942 -v 0.285544 1.388863 3.463942 -v 0.300805 1.388863 3.463942 -v 0.285544 1.396782 3.463942 -v 0.300805 1.396782 3.463942 -v 0.285544 1.388863 3.288942 -v 0.300805 1.388863 3.288942 -v 0.285544 1.396782 3.288942 -v 0.300805 1.396782 3.288942 -v 0.285544 1.264619 3.463942 -v 0.300805 1.264619 3.463942 -v 0.285544 1.272538 3.463942 -v 0.300805 1.272538 3.463942 -v 0.285544 1.264619 3.288942 -v 0.300805 1.264619 3.288942 -v 0.285544 1.272538 3.288942 -v 0.300805 1.272538 3.288942 -v 0.285544 1.140376 3.463942 -v 0.300805 1.140376 3.463942 -v 0.285544 1.148295 3.463942 -v 0.300805 1.148295 3.463942 -v 0.285544 1.140376 3.288942 -v 0.300805 1.140376 3.288942 -v 0.285544 1.148295 3.288942 -v 0.300805 1.148295 3.288942 -v 0.285544 1.016132 3.463942 -v 0.300805 1.016132 3.463942 -v 0.285544 1.024051 3.463942 -v 0.300805 1.024051 3.463942 -v 0.285544 1.016132 3.288942 -v 0.300805 1.016132 3.288942 -v 0.285544 1.024051 3.288942 -v 0.300805 1.024051 3.288942 -v 0.285544 0.891889 3.463942 -v 0.300805 0.891889 3.463942 -v 0.285544 0.899808 3.463942 -v 0.300805 0.899808 3.463942 -v 0.285544 0.891889 3.288942 -v 0.300805 0.891889 3.288942 -v 0.285544 0.899808 3.288942 -v 0.300805 0.899808 3.288942 -v 0.285544 0.767645 3.463942 -v 0.300805 0.767645 3.463942 -v 0.285544 0.775564 3.463942 -v 0.300805 0.775564 3.463942 -v 0.285544 0.767645 3.288942 -v 0.300805 0.767645 3.288942 -v 0.285544 0.775564 3.288942 -v 0.300805 0.775564 3.288942 -v 0.285544 0.643402 3.463942 -v 0.300805 0.643402 3.463942 -v 0.285544 0.651320 3.463942 -v 0.300805 0.651320 3.463942 -v 0.285544 0.643402 3.288942 -v 0.300805 0.643402 3.288942 -v 0.285544 0.651320 3.288942 -v 0.300805 0.651320 3.288942 -v 0.285544 0.519158 3.463942 -v 0.300805 0.519158 3.463942 -v 0.285544 0.527077 3.463942 -v 0.300805 0.527077 3.463942 -v 0.285544 0.519158 3.288942 -v 0.300805 0.519158 3.288942 -v 0.285544 0.527077 3.288942 -v 0.300805 0.527077 3.288942 -v 0.285544 0.394915 3.463942 -v 0.300805 0.394915 3.463942 -v 0.285544 0.402834 3.463942 -v 0.300805 0.402834 3.463942 -v 0.285544 0.394915 3.288942 -v 0.300805 0.394915 3.288942 -v 0.285544 0.402834 3.288942 -v 0.300805 0.402834 3.288942 -v 0.285544 0.270671 3.463942 -v 0.300805 0.270671 3.463942 -v 0.285544 0.278590 3.463942 -v 0.300805 0.278590 3.463942 -v 0.285544 0.270671 3.288942 -v 0.300805 0.270671 3.288942 -v 0.285544 0.278590 3.288942 -v 0.300805 0.278590 3.288942 -v 0.285544 0.146428 3.463942 -v 0.300805 0.146428 3.463942 -v 0.285544 0.154347 3.463942 -v 0.300805 0.154347 3.463942 -v 0.285544 0.146428 3.288942 -v 0.300805 0.146428 3.288942 -v 0.285544 0.154347 3.288942 -v 0.300805 0.154347 3.288942 -v 0.301410 2.643810 3.489135 -v 0.376276 2.643811 3.524195 -v 0.376281 2.643811 3.519145 -v 0.301464 2.643810 3.496503 -v 0.444948 2.643811 3.509104 -v 0.442711 2.643811 3.504622 -v 0.504548 2.643811 3.388581 -v 0.499693 2.643811 3.388503 -v 0.424202 2.643811 3.230654 -v 0.422936 2.643811 3.235530 -v 0.368515 2.643811 3.226357 -v 0.368852 2.643811 3.231395 -v 0.301451 2.643811 3.253116 -v 0.301497 2.643811 3.262935 -v 0.301410 2.637257 3.489135 -v 0.376281 2.637258 3.519145 -v 0.301464 2.637257 3.496503 -v 0.376276 2.637258 3.524195 -v 0.442711 2.637258 3.504622 -v 0.444948 2.637258 3.509104 -v 0.499693 2.637257 3.388503 -v 0.504548 2.637257 3.388581 -v 0.422936 2.637257 3.235530 -v 0.424202 2.637257 3.230654 -v 0.368852 2.637257 3.231395 -v 0.368515 2.637257 3.226357 -v 0.301497 2.637257 3.262935 -v 0.301451 2.637257 3.253116 -v 0.301410 2.162579 3.489135 -v 0.376276 2.162579 3.524195 -v 0.376281 2.162579 3.519145 -v 0.301464 2.162579 3.496503 -v 0.444948 2.162579 3.509104 -v 0.442711 2.162579 3.504622 -v 0.504548 2.162579 3.388581 -v 0.499693 2.162579 3.388503 -v 0.424202 2.162579 3.230654 -v 0.422936 2.162579 3.235530 -v 0.368515 2.162579 3.226357 -v 0.368852 2.162579 3.231395 -v 0.301451 2.162579 3.253116 -v 0.301497 2.162579 3.262935 -v 0.301410 2.156025 3.489135 -v 0.376281 2.156026 3.519145 -v 0.301464 2.156025 3.496503 -v 0.376276 2.156026 3.524195 -v 0.442711 2.156026 3.504622 -v 0.444948 2.156026 3.509104 -v 0.499693 2.156025 3.388503 -v 0.504548 2.156025 3.388581 -v 0.422936 2.156026 3.235530 -v 0.424202 2.156026 3.230654 -v 0.368852 2.156026 3.231395 -v 0.368515 2.156026 3.226357 -v 0.301497 2.156026 3.262935 -v 0.301451 2.156026 3.253116 -v 0.301410 1.681347 3.489135 -v 0.376276 1.681347 3.524195 -v 0.376281 1.681347 3.519145 -v 0.301464 1.681347 3.496503 -v 0.444948 1.681347 3.509104 -v 0.442711 1.681347 3.504622 -v 0.504548 1.681347 3.388581 -v 0.499693 1.681347 3.388503 -v 0.424202 1.681348 3.230654 -v 0.422936 1.681348 3.235530 -v 0.368515 1.681348 3.226357 -v 0.368852 1.681348 3.231395 -v 0.301451 1.681348 3.253116 -v 0.301497 1.681348 3.262935 -v 0.301410 1.674794 3.489135 -v 0.376281 1.674794 3.519145 -v 0.301464 1.674794 3.496503 -v 0.376276 1.674794 3.524195 -v 0.442711 1.674794 3.504622 -v 0.444948 1.674794 3.509104 -v 0.499693 1.674794 3.388503 -v 0.504548 1.674794 3.388581 -v 0.422936 1.674794 3.235530 -v 0.424202 1.674794 3.230654 -v 0.368852 1.674794 3.231395 -v 0.368515 1.674794 3.226357 -v 0.301497 1.674794 3.262935 -v 0.301451 1.674794 3.253116 -v 0.301410 1.200115 3.489135 -v 0.376276 1.200115 3.524195 -v 0.376281 1.200115 3.519145 -v 0.301464 1.200115 3.496503 -v 0.444948 1.200115 3.509104 -v 0.442711 1.200115 3.504622 -v 0.504548 1.200115 3.388581 -v 0.499693 1.200115 3.388503 -v 0.424202 1.200116 3.230654 -v 0.422936 1.200116 3.235530 -v 0.368515 1.200116 3.226357 -v 0.368852 1.200116 3.231395 -v 0.301451 1.200116 3.253116 -v 0.301497 1.200116 3.262935 -v 0.301410 1.193562 3.489135 -v 0.376281 1.193562 3.519145 -v 0.301464 1.193562 3.496503 -v 0.376276 1.193562 3.524195 -v 0.442711 1.193562 3.504622 -v 0.444948 1.193562 3.509104 -v 0.499693 1.193562 3.388503 -v 0.504548 1.193562 3.388581 -v 0.422936 1.193562 3.235530 -v 0.424202 1.193562 3.230654 -v 0.368852 1.193562 3.231395 -v 0.368515 1.193562 3.226357 -v 0.301497 1.193562 3.262935 -v 0.301451 1.193562 3.253116 -v 0.301410 3.125042 3.489135 -v 0.376276 3.125042 3.524195 -v 0.376281 3.125042 3.519145 -v 0.301464 3.125042 3.496503 -v 0.444948 3.125042 3.509104 -v 0.442711 3.125042 3.504622 -v 0.504548 3.125042 3.388581 -v 0.499693 3.125042 3.388503 -v 0.424202 3.125043 3.230654 -v 0.422936 3.125043 3.235530 -v 0.368515 3.125043 3.226357 -v 0.368852 3.125043 3.231395 -v 0.301451 3.125042 3.253116 -v 0.301497 3.125042 3.262935 -v 0.301410 3.118489 3.489135 -v 0.376281 3.118489 3.519145 -v 0.301464 3.118489 3.496503 -v 0.376276 3.118489 3.524195 -v 0.442711 3.118489 3.504622 -v 0.444948 3.118489 3.509104 -v 0.499693 3.118489 3.388503 -v 0.504548 3.118489 3.388581 -v 0.422936 3.118489 3.235530 -v 0.424202 3.118489 3.230654 -v 0.368852 3.118489 3.231395 -v 0.368515 3.118489 3.226357 -v 0.301497 3.118489 3.262935 -v 0.301451 3.118489 3.253116 -v 0.301495 3.125048 3.514077 -v 0.301468 3.387222 3.513988 -v 0.301468 3.387222 3.523932 -v 0.301468 3.118244 3.523932 -v 0.301495 3.125048 3.236090 -v 0.301467 3.118245 3.226146 -v 0.301468 3.387223 3.226146 -v 0.301468 3.387223 3.236090 -v 0.284795 3.125048 3.514077 -v 0.284795 3.387223 3.513988 -v 0.284795 3.387222 3.523932 -v 0.284795 3.118244 3.523932 -v 0.284795 3.118245 3.226146 -v 0.284795 3.387223 3.226146 -v 0.284795 3.387223 3.236090 -v 0.284795 3.125048 3.236090 -v 0.499693 2.643811 3.388503 -v 0.499693 2.643811 3.388503 -v 0.504548 2.643811 3.388581 -v 0.499693 2.643811 3.388503 -v 0.499693 2.637257 3.388503 -v 0.499693 2.643811 3.388503 -v 0.504548 2.643811 3.388581 -v 0.504548 2.637257 3.388581 -v 0.504548 2.637257 3.388581 -v 0.504548 2.637257 3.388581 -v 0.499693 2.637257 3.388503 -v 0.504548 2.637257 3.388581 -v 0.499693 2.162579 3.388503 -v 0.499693 2.162579 3.388503 -v 0.504548 2.162579 3.388581 -v 0.499693 2.162579 3.388503 -v 0.499693 2.156025 3.388503 -v 0.499693 2.162579 3.388503 -v 0.504548 2.162579 3.388581 -v 0.504548 2.156025 3.388581 -v 0.504548 2.156025 3.388581 -v 0.504548 2.156025 3.388581 -v 0.499693 2.156025 3.388503 -v 0.504548 2.156025 3.388581 -v 0.499693 1.681347 3.388503 -v 0.499693 1.681347 3.388503 -v 0.504548 1.681347 3.388581 -v 0.499693 1.681347 3.388503 -v 0.499693 1.674794 3.388503 -v 0.499693 1.681347 3.388503 -v 0.504548 1.681347 3.388581 -v 0.504548 1.674794 3.388581 -v 0.504548 1.674794 3.388581 -v 0.504548 1.674794 3.388581 -v 0.499693 1.674794 3.388503 -v 0.504548 1.674794 3.388581 -v 0.499693 1.200115 3.388503 -v 0.499693 1.200115 3.388503 -v 0.504548 1.200115 3.388581 -v 0.499693 1.200115 3.388503 -v 0.499693 1.193562 3.388503 -v 0.499693 1.200115 3.388503 -v 0.504548 1.200115 3.388581 -v 0.504548 1.193562 3.388581 -v 0.504548 1.193562 3.388581 -v 0.504548 1.193562 3.388581 -v 0.499693 1.193562 3.388503 -v 0.504548 1.193562 3.388581 -v 0.499693 3.125042 3.388503 -v 0.499693 3.125042 3.388503 -v 0.504548 3.125042 3.388581 -v 0.499693 3.125042 3.388503 -v 0.499693 3.118489 3.388503 -v 0.499693 3.125042 3.388503 -v 0.504548 3.125042 3.388581 -v 0.504548 3.118489 3.388581 -v 0.504548 3.118489 3.388581 -v 0.504548 3.118489 3.388581 -v 0.499693 3.118489 3.388503 -v 0.504548 3.118489 3.388581 -vt 0.383754 0.966046 -vt 0.393690 0.967771 -vt 0.370644 0.968788 -vt 0.380729 0.970678 -vt 0.380729 0.024548 -vt 0.393690 0.026986 -vt 0.370644 0.026134 -vt 0.383754 0.028434 -vt 0.608040 0.967492 -vt 0.617803 0.965747 -vt 0.621042 0.970371 -vt 0.630918 0.968461 -vt 0.630918 0.026408 -vt 0.617803 0.028686 -vt 0.621042 0.024805 -vt 0.608040 0.027220 -vt 0.381746 0.970604 -vt 0.393571 0.967941 -vt 0.381746 0.970771 -vt 0.393571 0.968123 -vt 0.620561 0.970206 -vt 0.608687 0.967577 -vt 0.620561 0.970376 -vt 0.608687 0.967761 -vt 0.620561 0.967559 -vt 0.608687 0.964699 -vt 0.381746 0.967992 -vt 0.393571 0.965095 -vt 0.620561 0.967760 -vt 0.381746 0.968190 -vt 0.608687 0.964917 -vt 0.393571 0.965311 -vt 0.620561 0.964049 -vt 0.608687 0.960886 -vt 0.381746 0.964528 -vt 0.393571 0.961324 -vt 0.620561 0.964295 -vt 0.381746 0.964771 -vt 0.608687 0.961153 -vt 0.393571 0.961588 -vt 0.620561 0.959692 -vt 0.608687 0.956154 -vt 0.381746 0.960227 -vt 0.393571 0.956644 -vt 0.620561 0.960001 -vt 0.381746 0.960532 -vt 0.608687 0.956489 -vt 0.393571 0.956975 -vt 0.620561 0.954141 -vt 0.608687 0.950130 -vt 0.381746 0.954749 -vt 0.393571 0.950685 -vt 0.620561 0.954540 -vt 0.381746 0.955142 -vt 0.608687 0.950563 -vt 0.393571 0.951113 -vt 0.620561 0.946834 -vt 0.608687 0.942209 -vt 0.381746 0.947535 -vt 0.393571 0.942849 -vt 0.620561 0.947368 -vt 0.381746 0.948062 -vt 0.608687 0.942788 -vt 0.393571 0.943421 -vt 0.620561 0.936793 -vt 0.608687 0.931343 -vt 0.381746 0.937620 -vt 0.393571 0.932096 -vt 0.620561 0.937544 -vt 0.381746 0.938361 -vt 0.608687 0.932154 -vt 0.393571 0.932899 -vt 0.620561 0.922170 -vt 0.608687 0.915562 -vt 0.381746 0.923174 -vt 0.393571 0.916474 -vt 0.620561 0.923297 -vt 0.381746 0.924288 -vt 0.608687 0.916777 -vt 0.393571 0.917676 -vt 0.620561 0.899037 -vt 0.608687 0.890730 -vt 0.381746 0.900305 -vt 0.393571 0.891873 -vt 0.620561 0.900901 -vt 0.381746 0.902149 -vt 0.608687 0.892724 -vt 0.393571 0.893849 -vt 0.620561 0.857627 -vt 0.608687 0.846783 -vt 0.381746 0.859298 -vt 0.393571 0.848264 -vt 0.620561 0.861192 -vt 0.381746 0.862831 -vt 0.608687 0.850537 -vt 0.393571 0.851993 -vt 0.620561 0.768416 -vt 0.608687 0.754909 -vt 0.381746 0.770550 -vt 0.393571 0.756718 -vt 0.620561 0.776788 -vt 0.381746 0.778906 -vt 0.608687 0.763352 -vt 0.393571 0.765155 -vt 0.620561 0.550902 -vt 0.608687 0.546810 -vt 0.381746 0.551582 -vt 0.393571 0.547338 -vt 0.620561 0.569714 -vt 0.381746 0.570632 -vt 0.608687 0.564184 -vt 0.393571 0.564899 -vt 0.620561 0.285149 -vt 0.608687 0.298230 -vt 0.381746 0.283047 -vt 0.393571 0.296500 -vt 0.620561 0.297402 -vt 0.381746 0.295341 -vt 0.608687 0.310179 -vt 0.393571 0.308493 -vt 0.620561 0.164310 -vt 0.608687 0.176187 -vt 0.381746 0.162470 -vt 0.393571 0.174573 -vt 0.620561 0.169191 -vt 0.381746 0.167318 -vt 0.608687 0.181266 -vt 0.393571 0.179626 -vt 0.620561 0.112002 -vt 0.608687 0.121054 -vt 0.381746 0.110618 -vt 0.393571 0.119812 -vt 0.620561 0.114367 -vt 0.381746 0.112958 -vt 0.608687 0.123572 -vt 0.393571 0.122309 -vt 0.620561 0.084340 -vt 0.608687 0.091443 -vt 0.381746 0.083259 -vt 0.393571 0.090464 -vt 0.620561 0.085699 -vt 0.381746 0.084602 -vt 0.608687 0.092904 -vt 0.393571 0.091911 -vt 0.620561 0.067468 -vt 0.608687 0.073261 -vt 0.381746 0.066589 -vt 0.393571 0.072461 -vt 0.620561 0.068343 -vt 0.381746 0.067453 -vt 0.608687 0.074206 -vt 0.393571 0.073396 -vt 0.620561 0.056162 -vt 0.608687 0.061036 -vt 0.381746 0.055424 -vt 0.393571 0.060362 -vt 0.620561 0.056770 -vt 0.381746 0.056024 -vt 0.608687 0.061693 -vt 0.393571 0.061013 -vt 0.620561 0.048077 -vt 0.608687 0.052275 -vt 0.381746 0.047441 -vt 0.393571 0.051694 -vt 0.620561 0.048523 -vt 0.381746 0.047881 -vt 0.608687 0.052759 -vt 0.393571 0.052173 -vt 0.620561 0.042015 -vt 0.608687 0.045699 -vt 0.381746 0.041457 -vt 0.393571 0.045189 -vt 0.620561 0.042355 -vt 0.381746 0.041793 -vt 0.608687 0.046069 -vt 0.393571 0.045555 -vt 0.620561 0.037304 -vt 0.608687 0.040584 -vt 0.381746 0.036808 -vt 0.393571 0.040130 -vt 0.620561 0.037573 -vt 0.381746 0.037073 -vt 0.608687 0.040876 -vt 0.393571 0.040419 -vt 0.620561 0.033540 -vt 0.608687 0.036494 -vt 0.381746 0.033093 -vt 0.393571 0.036085 -vt 0.620561 0.033757 -vt 0.381746 0.033307 -vt 0.608687 0.036730 -vt 0.393571 0.036319 -vt 0.620561 0.030463 -vt 0.608687 0.033151 -vt 0.381746 0.030057 -vt 0.393571 0.032779 -vt 0.620561 0.030642 -vt 0.381746 0.030234 -vt 0.608687 0.033346 -vt 0.393571 0.032971 -vt 0.620561 0.027902 -vt 0.608687 0.030367 -vt 0.381746 0.027530 -vt 0.393571 0.030026 -vt 0.620561 0.028053 -vt 0.381746 0.027678 -vt 0.608687 0.030531 -vt 0.393571 0.030187 -vt 0.620561 0.025738 -vt 0.608687 0.028013 -vt 0.381746 0.025394 -vt 0.393571 0.027698 -vt 0.620561 0.025866 -vt 0.381746 0.025520 -vt 0.608687 0.028152 -vt 0.393571 0.027836 -vt 0.640847 0.948546 -vt 0.730453 0.947553 -vt 0.729780 0.949273 -vt 0.645746 0.946577 -vt 0.807153 0.949990 -vt 0.806555 0.951704 -vt 0.980671 0.961177 -vt 0.979902 0.962854 -vt -0.020098 0.962854 -vt 0.217920 0.948463 -vt 0.218214 0.950192 -vt -0.019329 0.961177 -vt 0.277692 0.947231 -vt 0.278281 0.948953 -vt 0.353809 0.946378 -vt 0.360274 0.949023 -vt 0.729780 0.948909 -vt 0.640847 0.948177 -vt 0.645746 0.946194 -vt 0.730453 0.947177 -vt 0.806556 0.951357 -vt 0.807153 0.949630 -vt 0.979902 0.962585 -vt 0.980671 0.960896 -vt 0.218214 0.949834 -vt -0.020098 0.962585 -vt -0.019329 0.960896 -vt 0.217920 0.948093 -vt 0.278281 0.948587 -vt 0.277692 0.946852 -vt 0.360274 0.948657 -vt 0.353809 0.945994 -vt 0.640847 0.893087 -vt 0.730453 0.891144 -vt 0.729780 0.894513 -vt 0.645746 0.889242 -vt 0.807153 0.895921 -vt 0.806555 0.899305 -vt 0.980671 0.918313 -vt 0.979902 0.921731 -vt -0.020098 0.921731 -vt 0.217920 0.892924 -vt 0.218214 0.896319 -vt -0.019329 0.918313 -vt 0.277692 0.890515 -vt 0.278281 0.893885 -vt 0.353809 0.888855 -vt 0.360274 0.894022 -vt 0.729780 0.892970 -vt 0.640847 0.891527 -vt 0.645746 0.887635 -vt 0.730453 0.889560 -vt 0.806556 0.897822 -vt 0.807153 0.894396 -vt 0.979902 0.920546 -vt 0.980671 0.917081 -vt 0.218214 0.894799 -vt -0.020098 0.920546 -vt -0.019329 0.917081 -vt 0.217920 0.891362 -vt 0.278281 0.892334 -vt 0.277692 0.888923 -vt 0.360274 0.892474 -vt 0.353809 0.887244 -vt 0.640847 0.377943 -vt 0.730453 0.380078 -vt 0.729780 0.376336 -vt 0.645746 0.382108 -vt 0.807153 0.374713 -vt 0.806555 0.370667 -vt 0.980671 0.343209 -vt 0.979902 0.337222 -vt -0.020098 0.337222 -vt 0.217920 0.378125 -vt 0.218214 0.374249 -vt -0.019329 0.343209 -vt 0.277692 0.380756 -vt 0.278281 0.377049 -vt 0.353809 0.382515 -vt 0.360274 0.376893 -vt 0.729780 0.364224 -vt 0.640847 0.365951 -vt 0.645746 0.370434 -vt 0.730453 0.368249 -vt 0.806556 0.358143 -vt 0.807153 0.362482 -vt 0.979902 0.322633 -vt 0.980671 0.328940 -vt 0.218214 0.361983 -vt -0.020098 0.322633 -vt -0.019329 0.328940 -vt 0.217920 0.366147 -vt 0.278281 0.364990 -vt 0.277692 0.368978 -vt 0.360274 0.364823 -vt 0.353809 0.370873 -vt 0.640847 0.084648 -vt 0.730453 0.086233 -vt 0.729780 0.083487 -vt 0.645746 0.087786 -vt 0.807153 0.082341 -vt 0.806555 0.079594 -vt 0.980671 0.064283 -vt 0.979902 0.061550 -vt -0.020098 0.061550 -vt 0.217920 0.084781 -vt 0.218214 0.082018 -vt -0.019329 0.064283 -vt 0.277692 0.086746 -vt 0.278281 0.083999 -vt 0.353809 0.088102 -vt 0.360274 0.083886 -vt 0.729780 0.082532 -vt 0.640847 0.083681 -vt 0.645746 0.086786 -vt 0.730453 0.085249 -vt 0.806556 0.078679 -vt 0.807153 0.081398 -vt 0.979902 0.060831 -vt 0.980671 0.063534 -vt 0.218214 0.081078 -vt -0.020098 0.060831 -vt -0.019329 0.063534 -vt 0.217920 0.083812 -vt 0.278281 0.083038 -vt 0.277692 0.085757 -vt 0.360274 0.082927 -vt 0.353809 0.087099 -vt 0.640847 0.966265 -vt 0.730453 0.965607 -vt 0.729780 0.966746 -vt 0.645746 0.964960 -vt 0.807153 0.967221 -vt 0.806555 0.968354 -vt 0.980671 0.974601 -vt 0.979902 0.975704 -vt -0.020098 0.975704 -vt 0.217920 0.966210 -vt 0.218214 0.967354 -vt -0.019329 0.974601 -vt 0.277692 0.965393 -vt 0.278281 0.966534 -vt 0.353809 0.964829 -vt 0.360274 0.966581 -vt 0.729780 0.966589 -vt 0.640847 0.966106 -vt 0.645746 0.964795 -vt 0.730453 0.965445 -vt 0.806556 0.968205 -vt 0.807153 0.967066 -vt 0.979902 0.975589 -vt 0.980671 0.974481 -vt 0.218214 0.967200 -vt -0.020098 0.975589 -vt -0.019329 0.974481 -vt 0.217920 0.966051 -vt 0.278281 0.966376 -vt 0.277692 0.965230 -vt 0.360274 0.966423 -vt 0.353809 0.964663 -vt 0.655963 0.961724 -vt 0.655895 0.967785 -vt 0.660921 0.966189 -vt 0.660921 0.959652 -vt 0.343945 0.961692 -vt 0.338953 0.959601 -vt 0.338953 0.966147 -vt 0.343966 0.967743 -vt 0.643488 0.959495 -vt 0.643438 0.965904 -vt 0.648750 0.964395 -vt 0.648750 0.957518 -vt 0.351116 0.957470 -vt 0.351116 0.964354 -vt 0.356415 0.965865 -vt 0.356415 0.959464 -vn 0.000000 -1.000000 0.000001 -vn -0.000006 1.000000 -0.000000 -vn 0.000002 1.000000 -0.000001 -vn 0.372048 0.000000 -0.928213 -vn -0.347132 0.000000 0.937816 -vn -0.213577 0.000000 -0.976926 -vn 0.214625 -0.000000 0.976697 -vn 0.214623 0.000016 0.976697 -vn -0.897735 0.000000 -0.440535 -vn 0.896386 0.000065 0.443275 -vn 0.896387 0.000000 0.443272 -vn -0.893795 0.000000 0.448475 -vn 0.891283 0.000000 -0.453447 -vn -0.076242 0.000000 0.997089 -vn 0.076943 0.000000 -0.997036 -vn 0.076944 0.000006 -0.997036 -vn 0.424078 -0.000000 0.905626 -vn -0.370605 -0.000027 -0.928790 -vn -0.370603 -0.000000 -0.928791 -vn 0.000000 -1.000000 -0.000002 -vn -0.000004 -1.000000 0.000002 -vn -0.000000 -1.000000 0.000004 -vn 0.000006 -1.000000 0.000000 -vn -0.000013 1.000000 0.000024 -vn 0.000003 1.000000 0.000024 +f 149//46 150//46 145//46 +f 150//47 151//47 146//47 +f 151//48 152//48 148//48 +f 152//49 149//49 145//49 +f 145//42 146//42 147//42 +f 152//39 151//39 150//39 +f 150//46 146//46 145//46 +f 151//47 147//47 146//47 +f 147//48 151//48 148//48 +f 148//49 152//49 145//49 +f 148//42 145//42 147//42 +f 149//39 152//39 150//39 +v -1.384247 0.015116 3.993316 +v -1.384247 0.015113 -0.006684 +v -1.189157 0.034331 3.993316 +v -1.189157 0.034328 -0.006684 +v -1.001564 0.091236 3.993316 +v -1.001564 0.091234 -0.006684 +v -0.828677 0.183646 3.993316 +v -0.828677 0.183644 -0.006684 +v -0.677140 0.308009 3.993316 +v -0.677140 0.308007 -0.006684 +v -0.552777 0.459546 3.993316 +v -0.552777 0.459543 -0.006684 +v -0.460368 0.632432 3.993316 +v -0.460368 0.632430 -0.006684 +v -0.403462 0.820025 3.993316 +v -0.403462 0.820023 -0.006684 +v -0.384247 1.015116 3.993316 +v -0.384247 1.015113 -0.006684 +v -0.403462 1.210206 3.993316 +v -0.403462 1.210203 -0.006685 +v -0.460368 1.397799 3.993315 +v -0.460368 1.397797 -0.006685 +v -0.552777 1.570686 3.993315 +v -0.552777 1.570683 -0.006685 +v -0.677140 1.722223 3.993315 +v -0.677140 1.722220 -0.006685 +v -0.828677 1.846586 3.993315 +v -0.828677 1.846583 -0.006685 +v -1.001564 1.938995 3.993315 +v -1.001564 1.938993 -0.006685 +v -1.189157 1.995901 3.993315 +v -1.189157 1.995899 -0.006685 +v -1.384247 2.015116 3.993315 +v -1.384247 2.015113 -0.006685 +v -1.579338 1.995901 3.993315 +v -1.579338 1.995898 -0.006685 +v -1.766931 1.938995 3.993315 +v -1.766931 1.938993 -0.006685 +v -1.939818 1.846585 3.993315 +v -1.939818 1.846583 -0.006685 +v -2.091354 1.722222 3.993315 +v -2.091354 1.722220 -0.006685 +v -2.215717 1.570685 3.993315 +v -2.215717 1.570683 -0.006685 +v -2.308127 1.397799 3.993315 +v -2.308127 1.397796 -0.006685 +v -2.365032 1.210205 3.993316 +v -2.365032 1.210203 -0.006685 +v -2.384247 1.015115 3.993316 +v -2.384247 1.015112 -0.006684 +v -2.365032 0.820024 3.993316 +v -2.365032 0.820022 -0.006684 +v -2.308126 0.632431 3.993316 +v -2.308126 0.632429 -0.006684 +v -2.215716 0.459545 3.993316 +v -2.215716 0.459542 -0.006684 +v -2.091353 0.308008 3.993316 +v -2.091353 0.308006 -0.006684 +v -1.939816 0.183645 3.993316 +v -1.939816 0.183643 -0.006684 +v -1.766929 0.091236 3.993316 +v -1.766929 0.091233 -0.006684 +v -1.579336 0.034330 3.993316 +v -1.579336 0.034328 -0.006684 +v -1.384247 0.619839 -0.156215 +v -1.307133 0.627434 -0.156215 +v -1.232982 0.649928 -0.156215 +v -1.164645 0.686455 -0.156215 +v -1.104746 0.735612 -0.156215 +v -1.055589 0.795511 -0.156215 +v -1.019062 0.863848 -0.156216 +v -0.996568 0.937999 -0.156216 +v -0.988973 1.015113 -0.156216 +v -0.996568 1.092227 -0.156216 +v -1.019062 1.166378 -0.156216 +v -1.055589 1.234715 -0.156216 +v -1.104746 1.294614 -0.156216 +v -1.164645 1.343771 -0.156216 +v -1.232982 1.380298 -0.156216 +v -1.307133 1.402792 -0.156216 +v -1.384247 1.410387 -0.156216 +v -1.461361 1.402792 -0.156216 +v -1.535512 1.380298 -0.156216 +v -1.603849 1.343771 -0.156216 +v -1.663748 1.294613 -0.156216 +v -1.712905 1.234715 -0.156216 +v -1.749432 1.166377 -0.156216 +v -1.771926 1.092227 -0.156216 +v -1.779521 1.015113 -0.156216 +v -1.771925 0.937999 -0.156216 +v -1.749432 0.863848 -0.156216 +v -1.712905 0.795510 -0.156215 +v -1.663747 0.735612 -0.156215 +v -1.603849 0.686455 -0.156215 +v -1.535511 0.649928 -0.156215 +v -1.461360 0.627434 -0.156215 +v -1.384247 0.605419 4.159918 +v -1.304319 0.613291 4.159918 +v -1.227463 0.636605 4.159918 +v -1.156632 0.674465 4.159918 +v -1.094548 0.725416 4.159918 +v -1.043596 0.787500 4.159918 +v -1.005736 0.858332 4.159918 +v -0.982422 0.935188 4.159918 +v -0.974550 1.015116 4.159918 +v -0.982422 1.095044 4.159918 +v -1.005736 1.171900 4.159918 +v -1.043596 1.242731 4.159918 +v -1.094548 1.304815 4.159918 +v -1.156632 1.355766 4.159918 +v -1.227463 1.393626 4.159918 +v -1.304319 1.416940 4.159918 +v -1.384247 1.424813 4.159918 +v -1.464175 1.416940 4.159918 +v -1.541031 1.393626 4.159918 +v -1.611863 1.355766 4.159918 +v -1.673947 1.304815 4.159918 +v -1.724898 1.242731 4.159918 +v -1.762758 1.171900 4.159918 +v -1.786072 1.095043 4.159918 +v -1.793944 1.015115 4.159918 +v -1.786072 0.935187 4.159918 +v -1.762757 0.858331 4.159918 +v -1.724897 0.787500 4.159918 +v -1.673946 0.725416 4.159918 +v -1.611862 0.674465 4.159918 +v -1.541031 0.636605 4.159918 +v -1.464174 0.613291 4.159918 +v 0.006492 3.927105 -3.525056 +v 0.006492 4.374522 -3.525055 +v 0.050135 3.927105 -3.520757 +v 0.050135 4.374522 -3.520757 +v 0.092102 3.927104 -3.508027 +v 0.092102 4.374522 -3.508027 +v 0.130778 3.927104 -3.487354 +v 0.130778 4.374522 -3.487354 +v 0.164678 3.927104 -3.459533 +v 0.164678 4.374522 -3.459533 +v 0.192499 3.927104 -3.425632 +v 0.192499 4.374522 -3.425633 +v 0.213172 3.927105 -3.386956 +v 0.213172 4.374522 -3.386957 +v 0.225902 3.927105 -3.344990 +v 0.225902 4.374522 -3.344990 +v 0.230201 3.927105 -3.301347 +v 0.230201 4.374522 -3.301347 +v 0.225902 3.927105 -3.257704 +v 0.225902 4.374522 -3.257703 +v 0.213172 3.927105 -3.215737 +v 0.213172 4.374522 -3.215738 +v 0.192499 3.927105 -3.177061 +v 0.192499 4.374522 -3.177062 +v 0.164678 3.927105 -3.143161 +v 0.164678 4.374522 -3.143161 +v 0.130778 3.927105 -3.115340 +v 0.130778 4.374522 -3.115340 +v 0.092102 3.927105 -3.094666 +v 0.092102 4.374522 -3.094667 +v 0.050135 3.927105 -3.081937 +v 0.050135 4.374522 -3.081936 +v 0.006492 3.927105 -3.077638 +v 0.006492 4.374522 -3.077638 +v -0.037151 3.927105 -3.081937 +v -0.037151 4.374522 -3.081936 +v -0.079118 3.927105 -3.094666 +v -0.079118 4.374522 -3.094667 +v -0.117794 3.927105 -3.115340 +v -0.117794 4.374522 -3.115340 +v -0.151694 3.927105 -3.143161 +v -0.151694 4.374522 -3.143161 +v -0.179515 3.927105 -3.177061 +v -0.179515 4.374522 -3.177062 +v -0.200188 3.927105 -3.215737 +v -0.200188 4.374522 -3.215738 +v -0.212918 3.927105 -3.257704 +v -0.212918 4.374522 -3.257704 +v -0.217217 3.927105 -3.301347 +v -0.217217 4.374522 -3.301347 +v -0.212918 3.927105 -3.344991 +v -0.212918 4.374522 -3.344990 +v -0.200188 3.927105 -3.386957 +v -0.200188 4.374522 -3.386957 +v -0.179515 3.927104 -3.425633 +v -0.179515 4.374522 -3.425633 +v -0.151694 3.927104 -3.459533 +v -0.151694 4.374522 -3.459533 +v -0.117794 3.927104 -3.487354 +v -0.117794 4.374522 -3.487354 +v -0.079117 3.927104 -3.508027 +v -0.079117 4.374522 -3.508027 +v -0.037151 3.927105 -3.520757 +v -0.037151 4.374522 -3.520757 +vn 0.098018 -0.995185 0.000001 +vn 0.290285 -0.956940 0.000001 +vn 0.471397 -0.881921 0.000001 +vn 0.634393 -0.773010 0.000000 +vn 0.773010 -0.634393 0.000000 +vn 0.881921 -0.471397 0.000000 +vn 0.956940 -0.290285 0.000000 +vn 0.995185 -0.098017 0.000000 +vn 0.995185 0.098017 -0.000000 +vn 0.956940 0.290285 -0.000000 +vn 0.881922 0.471396 -0.000000 +vn 0.773010 0.634393 -0.000000 +vn 0.634393 0.773011 -0.000000 +vn 0.471397 0.881921 -0.000001 +vn 0.290284 0.956941 -0.000001 +vn 0.098017 0.995185 -0.000001 +vn -0.098017 0.995185 -0.000001 +vn -0.290285 0.956940 -0.000001 +vn -0.471397 0.881921 -0.000001 +vn -0.634394 0.773010 -0.000000 +vn -0.773011 0.634393 -0.000000 +vn -0.881922 0.471396 -0.000000 +vn -0.956941 0.290283 -0.000000 +vn -0.995185 0.098017 -0.000000 +vn -0.995185 -0.098018 0.000000 +vn -0.956940 -0.290286 0.000000 +vn -0.881920 -0.471398 0.000000 +vn -0.773010 -0.634394 0.000000 +vn -0.634393 -0.773011 0.000000 +vn -0.471395 -0.881922 0.000001 +vn -0.239975 -0.023636 -0.970491 +vn -0.098017 -0.995185 0.000001 +vn -0.290283 -0.956941 0.000001 +vn -0.210907 0.173086 0.962060 +vn 0.152975 0.186400 -0.970492 +vn -0.023635 -0.239975 -0.970491 +vn -0.152975 0.186400 -0.970492 +vn 0.239975 -0.023636 -0.970491 +vn -0.212662 -0.113672 -0.970491 +vn 0.069999 0.230752 -0.970492 +vn 0.113670 -0.212663 -0.970491 +vn -0.212662 0.113670 -0.970492 +vn 0.230752 0.069998 -0.970492 +vn -0.152975 -0.186401 -0.970491 +vn -0.023636 0.239974 -0.970492 +vn 0.186400 -0.152976 -0.970491 +vn -0.239974 0.023634 -0.970491 +vn 0.186401 0.152974 -0.970491 +vn -0.069998 -0.230753 -0.970491 +vn -0.113670 0.212662 -0.970492 +vn 0.230753 -0.069999 -0.970491 +vn -0.230752 -0.069999 -0.970491 +vn 0.113670 0.212662 -0.970491 +vn 0.069998 -0.230753 -0.970491 +vn -0.186401 0.152974 -0.970491 +vn 0.239975 0.023634 -0.970492 +vn -0.186400 -0.152976 -0.970491 +vn 0.023635 0.239974 -0.970492 +vn 0.152975 -0.186401 -0.970491 +vn -0.230752 0.069998 -0.970492 +vn 0.023636 -0.239975 -0.970491 +vn 0.212662 0.113670 -0.970492 +vn -0.113670 -0.212664 -0.970491 +vn -0.069999 0.230751 -0.970492 +vn 0.212663 -0.113671 -0.970491 +vn 0.271524 0.026743 0.962060 +vn -0.210906 -0.173085 0.962060 +vn 0.026743 0.271524 0.962060 +vn 0.173086 -0.210906 0.962060 +vn -0.261089 0.079201 0.962060 +vn 0.026743 -0.271523 0.962060 +vn 0.240621 0.128616 0.962060 +vn -0.128614 -0.240621 0.962060 +vn -0.079201 0.261090 0.962060 +vn 0.240621 -0.128614 0.962060 +vn -0.271524 -0.026742 0.962060 +vn 0.173087 0.210907 0.962060 +vn -0.026742 -0.271523 0.962060 +vn -0.173087 0.210907 0.962060 +vn 0.271524 -0.026742 0.962060 +vn -0.240621 -0.128615 0.962060 +vn 0.079201 0.261090 0.962060 +vn 0.128614 -0.240621 0.962060 +vn -0.240621 0.128616 0.962060 +vn 0.261089 0.079202 0.962060 +vn -0.173086 -0.210906 0.962060 +vn -0.026743 0.271524 0.962060 +vn 0.210907 -0.173085 0.962060 +vn -0.271524 0.026743 0.962060 +vn 0.210907 0.173087 0.962060 +vn -0.079201 -0.261088 0.962060 +vn -0.128615 0.240622 0.962060 +vn 0.261089 -0.079200 0.962060 +vn -0.261089 -0.079201 0.962060 +vn 0.128615 0.240622 0.962060 +vn 0.079201 -0.261088 0.962060 +vn 0.098012 0.000001 -0.995185 +vn 0.290289 -0.000001 -0.956939 +vn 0.471395 0.000001 -0.881922 +vn 0.634385 0.000001 -0.773018 +vn 0.773012 -0.000001 -0.634391 +vn 0.881922 -0.000001 -0.471395 +vn 0.956942 -0.000000 -0.290279 +vn 0.995184 -0.000000 -0.098022 +vn 0.995184 0.000000 0.098020 +vn 0.956940 -0.000000 0.290285 +vn 0.881922 0.000001 0.471395 +vn 0.773012 0.000001 0.634391 +vn 0.634398 0.000001 0.773007 +vn 0.471395 -0.000001 0.881922 +vn 0.290289 0.000001 0.956939 +vn 0.098010 -0.000001 0.995185 +vn -0.098033 0.000001 0.995183 +vn -0.290269 -0.000001 0.956945 +vn -0.471412 0.000001 0.881913 +vn -0.634385 -0.000001 0.773018 +vn -0.773012 0.000001 0.634391 +vn -0.881922 0.000001 0.471395 +vn -0.956942 0.000000 0.290279 +vn -0.995184 0.000000 0.098022 +vn -0.995184 -0.000000 -0.098020 +vn -0.956939 0.000000 -0.290289 +vn -0.881922 0.000001 -0.471395 +vn -0.773003 0.000001 -0.634402 +vn -0.634398 -0.000001 -0.773007 +vn -0.471395 0.000001 -0.881922 +vn -0.098032 -0.000001 -0.995183 +vn -0.290292 0.000001 -0.956938 +vn 0.098017 -0.995185 0.000001 +vn 0.881921 -0.471396 0.000000 +vn 0.881921 0.471397 -0.000000 +vn 0.634394 0.773010 -0.000001 +vn 0.471396 0.881922 -0.000001 +vn 0.290285 0.956940 -0.000001 +vn -0.098018 0.995185 -0.000001 +vn -0.881920 -0.471399 0.000000 +vn -0.239974 -0.023636 -0.970491 +vn -0.210907 0.173087 0.962060 +vn 0.000000 -0.000003 -1.000000 +vn 0.152975 0.186400 -0.970491 +vn 0.239975 -0.023635 -0.970491 +vn -0.212662 -0.113674 -0.970491 +vn 0.069998 0.230752 -0.970492 +vn 0.113671 -0.212663 -0.970491 +vn -0.212664 0.113668 -0.970491 +vn 0.230752 0.069998 -0.970491 +vn -0.023635 0.239974 -0.970492 +vn 0.186401 -0.152975 -0.970491 +vn -0.239974 0.023635 -0.970492 +vn 0.186400 0.152975 -0.970491 +vn 0.230753 -0.069998 -0.970491 +vn -0.230753 -0.069998 -0.970491 +vn -0.186400 0.152974 -0.970492 +vn 0.239974 0.023635 -0.970492 +vn -0.186400 -0.152975 -0.970491 +vn 0.023635 -0.239975 -0.970491 +vn 0.212664 0.113668 -0.970491 +vn -0.113670 -0.212663 -0.970491 +vn -0.069998 0.230752 -0.970492 +vn 0.212662 -0.113674 -0.970491 +vn -0.210905 -0.173086 0.962060 +vn -0.261089 0.079200 0.962060 +vn 0.026743 -0.271523 0.962061 +vn 0.240622 0.128615 0.962060 +vn 0.240621 -0.128615 0.962060 +vn -0.271523 -0.026743 0.962060 +vn 0.271523 -0.026743 0.962060 +vn 0.079200 0.261090 0.962060 +vn 0.128615 -0.240620 0.962060 +vn -0.240622 0.128615 0.962060 +vn 0.261089 0.079200 0.962060 +vn -0.173085 -0.210906 0.962060 +vn 0.210906 -0.173086 0.962060 +vn -0.271524 0.026742 0.962060 +vn -0.079200 -0.261088 0.962061 +vn -0.261089 -0.079200 0.962060 +vn 0.079200 -0.261088 0.962060 +vn 0.098033 -0.000001 -0.995183 +vn 0.290269 0.000001 -0.956945 +vn 0.634398 -0.000001 -0.773007 +vn 0.995184 -0.000000 0.098022 +vn 0.956942 0.000000 0.290279 +vn 0.634385 -0.000001 0.773018 +vn 0.471412 0.000001 0.881913 +vn 0.290269 -0.000001 0.956945 +vn 0.098032 0.000001 0.995183 +vn -0.098012 -0.000001 0.995185 +vn -0.290289 0.000001 0.956939 +vn -0.471395 -0.000001 0.881922 +vn -0.634398 0.000001 0.773007 +vn -0.995184 0.000000 -0.098022 +vn -0.773012 -0.000001 -0.634391 +vn -0.634385 0.000001 -0.773018 +vn -0.098010 0.000001 -0.995185 +vn -0.290272 -0.000001 -0.956944 +vn 0.000000 -1.000000 -0.000019 +vn -0.000002 -1.000000 0.000007 +vn 0.000001 -1.000000 -0.000000 +vn -0.000027 -1.000000 -0.000008 +vn -0.000009 -1.000000 -0.000001 +vn -0.000005 -1.000000 0.000000 vn -0.000003 -1.000000 0.000001 -vn -0.000000 -1.000000 0.000003 -vn 0.076943 0.000000 -0.997035 -vn 0.076944 0.000006 -0.997035 -vn -0.000003 1.000000 -0.000000 -vn 0.000004 1.000000 0.000001 -vn -0.000000 1.000000 0.000003 -vn -0.000004 1.000000 0.000000 -vn 0.891284 0.000000 -0.453447 vn -0.000002 -1.000000 0.000001 -vn -0.000000 -1.000000 0.000002 -vn 0.000003 -1.000000 0.000000 -vn 1.000000 0.000104 0.000000 -vn 0.999996 -0.000000 0.002776 -vn 0.999996 -0.000002 -0.002798 -vn -0.000000 -0.000339 -1.000000 -vn 0.000000 1.000000 0.000024 -vn 0.000014 1.000000 -0.000000 -vn 0.000000 -0.000001 1.000000 -s off -f 2477/1478/331 2475/1479/331 2478/1480/331 -f 2475/1479/331 2476/1481/331 2478/1480/331 -f 2480/1482/3 2479/1483/3 2482/1484/3 -f 2481/1485/3 2482/1484/3 2479/1483/3 -f 2476/1481/21 2475/1479/21 2480/1482/21 -f 2475/1479/21 2479/1483/21 2480/1482/21 -f 2478/1480/63 2476/1481/63 2482/1484/63 -f 2480/1482/63 2482/1484/63 2476/1481/63 -f 2477/1478/105 2478/1480/105 2481/1485/105 -f 2482/1484/105 2481/1485/105 2478/1480/105 -f 2475/1479/7 2477/1478/7 2479/1483/7 -f 2481/1485/7 2479/1483/7 2477/1478/7 -f 2485/1486/331 2483/1487/331 2486/1488/331 -f 2484/1489/331 2486/1488/331 2483/1487/331 -f 2488/1490/3 2487/1491/3 2490/1492/3 -f 2489/1493/3 2490/1492/3 2487/1491/3 -f 2484/1489/21 2483/1487/21 2488/1490/21 -f 2487/1491/21 2488/1490/21 2483/1487/21 -f 2486/1488/63 2484/1489/63 2490/1492/63 -f 2488/1490/63 2490/1492/63 2484/1489/63 -f 2485/1486/105 2486/1488/105 2489/1493/105 -f 2490/1492/105 2489/1493/105 2486/1488/105 -f 2483/1487/7 2485/1486/7 2487/1491/7 -f 2489/1493/7 2487/1491/7 2485/1486/7 -f 2496/1494/105 2495/1495/105 2498/1496/105 -f 2497/1497/105 2498/1496/105 2495/1495/105 -f 2492/1498/3 2491/1499/3 2496/1494/3 -f 2495/1495/3 2496/1494/3 2491/1499/3 -f 2494/1500/63 2492/1498/63 2498/1496/63 -f 2496/1494/63 2498/1496/63 2492/1498/63 -f 2493/1501/331 2494/1500/331 2497/1497/331 -f 2498/1496/331 2497/1497/331 2494/1500/331 -f 2491/1499/7 2493/1501/7 2495/1495/7 -f 2497/1497/7 2495/1495/7 2493/1501/7 -f 2500/1502/3 2499/1503/3 2504/1504/3 -f 2503/1505/3 2504/1504/3 2499/1503/3 -f 2502/1506/63 2500/1502/63 2506/1507/63 -f 2504/1504/63 2506/1507/63 2500/1502/63 -f 2501/1508/331 2502/1506/331 2505/1509/331 -f 2506/1507/331 2505/1509/331 2502/1506/331 -f 2499/1503/7 2501/1508/7 2503/1505/7 -f 2505/1509/7 2503/1505/7 2501/1508/7 -f 2508/1510/3 2507/1511/3 2512/1512/3 -f 2511/1513/3 2512/1512/3 2507/1511/3 -f 2510/1514/63 2508/1510/63 2514/1515/63 -f 2512/1512/63 2514/1515/63 2508/1510/63 -f 2509/1516/331 2510/1514/331 2513/1517/331 -f 2514/1515/331 2513/1517/331 2510/1514/331 -f 2507/1511/7 2509/1516/7 2511/1513/7 -f 2513/1517/7 2511/1513/7 2509/1516/7 -f 2516/1518/3 2515/1519/3 2520/1520/3 -f 2519/1521/3 2520/1520/3 2515/1519/3 -f 2518/1522/63 2516/1518/63 2522/1523/63 -f 2520/1520/63 2522/1523/63 2516/1518/63 -f 2517/1524/331 2518/1522/331 2521/1525/331 -f 2522/1523/331 2521/1525/331 2518/1522/331 -f 2515/1519/7 2517/1524/7 2519/1521/7 -f 2521/1525/7 2519/1521/7 2517/1524/7 -f 2524/1526/3 2523/1527/3 2528/1528/3 -f 2527/1529/3 2528/1528/3 2523/1527/3 -f 2526/1530/63 2524/1526/63 2530/1531/63 -f 2528/1528/63 2530/1531/63 2524/1526/63 -f 2525/1532/331 2526/1530/331 2529/1533/331 -f 2530/1531/331 2529/1533/331 2526/1530/331 -f 2523/1527/7 2525/1532/7 2527/1529/7 -f 2529/1533/7 2527/1529/7 2525/1532/7 -f 2532/1534/3 2531/1535/3 2536/1536/3 -f 2535/1537/3 2536/1536/3 2531/1535/3 -f 2534/1538/63 2532/1534/63 2538/1539/63 -f 2536/1536/63 2538/1539/63 2532/1534/63 -f 2533/1540/331 2534/1538/331 2537/1541/331 -f 2538/1539/331 2537/1541/331 2534/1538/331 -f 2531/1535/7 2533/1540/7 2535/1537/7 -f 2537/1541/7 2535/1537/7 2533/1540/7 -f 2540/1542/3 2539/1543/3 2544/1544/3 -f 2543/1545/3 2544/1544/3 2539/1543/3 -f 2542/1546/63 2540/1542/63 2546/1547/63 -f 2544/1544/63 2546/1547/63 2540/1542/63 -f 2541/1548/331 2542/1546/331 2545/1549/331 -f 2546/1547/331 2545/1549/331 2542/1546/331 -f 2539/1543/7 2541/1548/7 2543/1545/7 -f 2545/1549/7 2543/1545/7 2541/1548/7 -f 2548/1550/3 2547/1551/3 2552/1552/3 -f 2551/1553/3 2552/1552/3 2547/1551/3 -f 2550/1554/63 2548/1550/63 2554/1555/63 -f 2552/1552/63 2554/1555/63 2548/1550/63 -f 2549/1556/331 2550/1554/331 2553/1557/331 -f 2554/1555/331 2553/1557/331 2550/1554/331 -f 2547/1551/7 2549/1556/7 2551/1553/7 -f 2553/1557/7 2551/1553/7 2549/1556/7 -f 2556/1558/3 2555/1559/3 2560/1560/3 -f 2559/1561/3 2560/1560/3 2555/1559/3 -f 2558/1562/63 2556/1558/63 2562/1563/63 -f 2560/1560/63 2562/1563/63 2556/1558/63 -f 2557/1564/331 2558/1562/331 2561/1565/331 -f 2562/1563/331 2561/1565/331 2558/1562/331 -f 2555/1559/7 2557/1564/7 2559/1561/7 -f 2561/1565/7 2559/1561/7 2557/1564/7 -f 2564/1566/3 2563/1567/3 2568/1568/3 -f 2567/1569/3 2568/1568/3 2563/1567/3 -f 2566/1570/63 2564/1566/63 2570/1571/63 -f 2568/1568/63 2570/1571/63 2564/1566/63 -f 2565/1572/331 2566/1570/331 2569/1573/331 -f 2570/1571/331 2569/1573/331 2566/1570/331 -f 2563/1567/7 2565/1572/7 2567/1569/7 -f 2569/1573/7 2567/1569/7 2565/1572/7 -f 2572/1574/2185 2571/1575/2185 2576/1576/2185 -f 2575/1577/2185 2576/1576/2185 2571/1575/2185 -f 2574/1578/63 2572/1574/63 2578/1579/63 -f 2576/1576/63 2578/1579/63 2572/1574/63 -f 2573/1580/331 2574/1578/331 2577/1581/331 -f 2578/1579/331 2577/1581/331 2574/1578/331 -f 2571/1575/7 2573/1580/7 2575/1577/7 -f 2577/1581/7 2575/1577/7 2573/1580/7 -f 2580/1582/2185 2579/1583/2185 2584/1584/2185 -f 2583/1585/2185 2584/1584/2185 2579/1583/2185 -f 2582/1586/63 2580/1582/63 2586/1587/63 -f 2584/1584/63 2586/1587/63 2580/1582/63 -f 2581/1588/331 2582/1586/331 2585/1589/331 -f 2586/1587/331 2585/1589/331 2582/1586/331 -f 2579/1583/7 2581/1588/7 2583/1585/7 -f 2585/1589/7 2583/1585/7 2581/1588/7 -f 2588/1590/2185 2587/1591/2185 2592/1592/2185 -f 2591/1593/2185 2592/1592/2185 2587/1591/2185 -f 2590/1594/63 2588/1590/63 2594/1595/63 -f 2592/1592/63 2594/1595/63 2588/1590/63 -f 2589/1596/331 2590/1594/331 2593/1597/331 -f 2594/1595/331 2593/1597/331 2590/1594/331 -f 2587/1591/7 2589/1596/7 2591/1593/7 -f 2593/1597/7 2591/1593/7 2589/1596/7 -f 2596/1598/2185 2595/1599/2185 2600/1600/2185 -f 2599/1601/2185 2600/1600/2185 2595/1599/2185 -f 2598/1602/63 2596/1598/63 2602/1603/63 -f 2600/1600/63 2602/1603/63 2596/1598/63 -f 2597/1604/331 2598/1602/331 2601/1605/331 -f 2602/1603/331 2601/1605/331 2598/1602/331 -f 2595/1599/7 2597/1604/7 2599/1601/7 -f 2601/1605/7 2599/1601/7 2597/1604/7 -f 2604/1606/2185 2603/1607/2185 2608/1608/2185 -f 2607/1609/2185 2608/1608/2185 2603/1607/2185 -f 2606/1610/63 2604/1606/63 2610/1611/63 -f 2608/1608/63 2610/1611/63 2604/1606/63 -f 2605/1612/331 2606/1610/331 2609/1613/331 -f 2610/1611/331 2609/1613/331 2606/1610/331 -f 2603/1607/7 2605/1612/7 2607/1609/7 -f 2609/1613/7 2607/1609/7 2605/1612/7 -f 2612/1614/2185 2611/1615/2185 2616/1616/2185 -f 2615/1617/2185 2616/1616/2185 2611/1615/2185 -f 2614/1618/63 2612/1614/63 2618/1619/63 -f 2616/1616/63 2618/1619/63 2612/1614/63 -f 2613/1620/331 2614/1618/331 2617/1621/331 -f 2618/1619/331 2617/1621/331 2614/1618/331 -f 2611/1615/7 2613/1620/7 2615/1617/7 -f 2617/1621/7 2615/1617/7 2613/1620/7 -f 2620/1622/2185 2619/1623/2185 2624/1624/2185 -f 2623/1625/2185 2624/1624/2185 2619/1623/2185 -f 2622/1626/63 2620/1622/63 2626/1627/63 -f 2624/1624/63 2626/1627/63 2620/1622/63 -f 2621/1628/331 2622/1626/331 2625/1629/331 -f 2626/1627/331 2625/1629/331 2622/1626/331 -f 2619/1623/7 2621/1628/7 2623/1625/7 -f 2625/1629/7 2623/1625/7 2621/1628/7 -f 2628/1630/3 2627/1631/3 2632/1632/3 -f 2631/1633/3 2632/1632/3 2627/1631/3 -f 2630/1634/63 2628/1630/63 2634/1635/63 -f 2632/1632/63 2634/1635/63 2628/1630/63 -f 2629/1636/331 2630/1634/331 2633/1637/331 -f 2634/1635/331 2633/1637/331 2630/1634/331 -f 2627/1631/7 2629/1636/7 2631/1633/7 -f 2633/1637/7 2631/1633/7 2629/1636/7 -f 2636/1638/3 2635/1639/3 2640/1640/3 -f 2639/1641/3 2640/1640/3 2635/1639/3 -f 2638/1642/63 2636/1638/63 2642/1643/63 -f 2640/1640/63 2642/1643/63 2636/1638/63 -f 2637/1644/331 2638/1642/331 2641/1645/331 -f 2642/1643/331 2641/1645/331 2638/1642/331 -f 2635/1639/7 2637/1644/7 2639/1641/7 -f 2641/1645/7 2639/1641/7 2637/1644/7 -f 2644/1646/3 2643/1647/3 2648/1648/3 -f 2647/1649/3 2648/1648/3 2643/1647/3 -f 2646/1650/63 2644/1646/63 2650/1651/63 -f 2648/1648/63 2650/1651/63 2644/1646/63 -f 2645/1652/331 2646/1650/331 2649/1653/331 -f 2650/1651/331 2649/1653/331 2646/1650/331 -f 2643/1647/7 2645/1652/7 2647/1649/7 -f 2649/1653/7 2647/1649/7 2645/1652/7 -f 2652/1654/3 2651/1655/3 2656/1656/3 -f 2655/1657/3 2656/1656/3 2651/1655/3 -f 2654/1658/63 2652/1654/63 2658/1659/63 -f 2656/1656/63 2658/1659/63 2652/1654/63 -f 2653/1660/331 2654/1658/331 2657/1661/331 -f 2658/1659/331 2657/1661/331 2654/1658/331 -f 2651/1655/7 2653/1660/7 2655/1657/7 -f 2657/1661/7 2655/1657/7 2653/1660/7 -f 2660/1662/3 2659/1663/3 2664/1664/3 -f 2663/1665/3 2664/1664/3 2659/1663/3 -f 2662/1666/63 2660/1662/63 2666/1667/63 -f 2664/1664/63 2666/1667/63 2660/1662/63 -f 2661/1668/331 2662/1666/331 2665/1669/331 -f 2666/1667/331 2665/1669/331 2662/1666/331 -f 2659/1663/7 2661/1668/7 2663/1665/7 -f 2665/1669/7 2663/1665/7 2661/1668/7 -f 2668/1670/3 2667/1671/3 2672/1672/3 -f 2671/1673/3 2672/1672/3 2667/1671/3 -f 2670/1674/63 2668/1670/63 2674/1675/63 -f 2672/1672/63 2674/1675/63 2668/1670/63 -f 2669/1676/331 2670/1674/331 2673/1677/331 -f 2674/1675/331 2673/1677/331 2670/1674/331 -f 2667/1671/7 2669/1676/7 2671/1673/7 -f 2673/1677/7 2671/1673/7 2669/1676/7 -f 2676/1678/3 2675/1679/3 2680/1680/3 -f 2679/1681/3 2680/1680/3 2675/1679/3 -f 2678/1682/63 2676/1678/63 2682/1683/63 -f 2680/1680/63 2682/1683/63 2676/1678/63 -f 2677/1684/331 2678/1682/331 2681/1685/331 -f 2682/1683/331 2681/1685/331 2678/1682/331 -f 2675/1679/7 2677/1684/7 2679/1681/7 -f 2681/1685/7 2679/1681/7 2677/1684/7 -f 2684/1686/3 2683/1687/3 2688/1688/3 -f 2687/1689/3 2688/1688/3 2683/1687/3 -f 2686/1690/63 2684/1686/63 2690/1691/63 -f 2688/1688/63 2690/1691/63 2684/1686/63 -f 2685/1692/331 2686/1690/331 2689/1693/331 -f 2690/1691/331 2689/1693/331 2686/1690/331 -f 2683/1687/7 2685/1692/7 2687/1689/7 -f 2689/1693/7 2687/1689/7 2685/1692/7 -f 2691/1694/2186 2692/1695/2186 2693/1696/2186 -f 2691/1694/2186 2694/1697/2186 2692/1695/2186 -f 2693/1696/331 2695/1698/331 2696/1699/331 -f 2693/1696/331 2692/1695/331 2695/1698/331 -f 2696/1699/1571 2697/1700/1571 2698/1701/1571 -f 2696/1699/2187 2695/1698/2187 2697/1700/2187 -f 2847/1702/942 2699/1703/942 2700/1704/942 -f 2848/1702/933 2849/1705/933 2699/1703/933 -f 2700/1704/331 2701/1706/331 2702/1707/331 -f 2700/1704/331 2699/1703/331 2701/1706/331 -f 2702/1707/331 2703/1708/331 2704/1709/331 -f 2702/1707/331 2701/1706/331 2703/1708/331 -f 2691/1694/2188 2693/1696/2188 2706/1710/2188 -f 2706/1710/2188 2705/1711/2188 2691/1694/2188 -f 2692/1695/2189 2694/1697/2189 2707/1712/2189 -f 2707/1712/2189 2708/1713/2189 2692/1695/2189 -f 2693/1696/2190 2696/1699/2190 2709/1714/2190 -f 2709/1714/2190 2706/1710/2190 2693/1696/2190 -f 2695/1698/2191 2692/1695/2191 2708/1713/2191 -f 2708/1713/2192 2710/1715/2192 2695/1698/2192 -f 2696/1699/2193 2698/1701/2193 2711/1716/2193 -f 2711/1716/2193 2709/1714/2193 2696/1699/2193 -f 2697/1700/2194 2695/1698/2194 2710/1715/2194 -f 2710/1715/2195 2712/1717/2195 2697/1700/2195 -f 2850/1702/2196 2700/1704/2196 2713/1718/2196 -f 2713/1718/2196 2851/1719/2196 2852/1702/2196 -f 2699/1703/2197 2853/1705/2197 2854/1720/2197 -f 2855/1720/2197 2714/1721/2197 2699/1703/2197 -f 2700/1704/2198 2702/1707/2198 2715/1722/2198 -f 2715/1722/2198 2713/1718/2198 2700/1704/2198 -f 2701/1706/2199 2699/1703/2199 2714/1721/2199 -f 2714/1721/2200 2716/1723/2200 2701/1706/2200 -f 2702/1707/2201 2704/1709/2201 2717/1724/2201 -f 2717/1724/2201 2715/1722/2201 2702/1707/2201 -f 2703/1708/2202 2701/1706/2202 2716/1723/2202 -f 2716/1723/2203 2718/1725/2203 2703/1708/2203 -f 2718/1725/3 2716/1723/3 2715/1722/3 -f 2715/1722/3 2717/1724/3 2718/1725/3 -f 2716/1723/3 2714/1721/3 2713/1718/3 -f 2715/1722/3 2716/1723/3 2713/1718/3 -f 2713/1718/2204 2856/1720/2204 2857/1719/2204 -f 2858/1720/251 2713/1718/251 2714/1721/251 -f 2712/1717/2205 2710/1715/2205 2709/1714/2205 -f 2709/1714/2206 2711/1716/2206 2712/1717/2206 -f 2710/1715/3 2708/1713/3 2706/1710/3 -f 2709/1714/3 2710/1715/3 2706/1710/3 -f 2705/1711/2207 2706/1710/2207 2708/1713/2207 -f 2708/1713/2207 2707/1712/2207 2705/1711/2207 -f 2719/1726/2186 2720/1727/2186 2721/1728/2186 -f 2719/1726/2186 2722/1729/2186 2720/1727/2186 -f 2721/1728/331 2723/1730/331 2724/1731/331 -f 2721/1728/331 2720/1727/331 2723/1730/331 -f 2724/1731/1571 2725/1732/1571 2726/1733/1571 -f 2724/1731/2187 2723/1730/2187 2725/1732/2187 -f 2859/1734/942 2727/1735/942 2728/1736/942 -f 2860/1734/933 2861/1737/933 2727/1735/933 -f 2728/1736/331 2729/1738/331 2730/1739/331 -f 2728/1736/331 2727/1735/331 2729/1738/331 -f 2730/1739/331 2731/1740/331 2732/1741/331 -f 2730/1739/331 2729/1738/331 2731/1740/331 -f 2719/1726/2188 2721/1728/2188 2734/1742/2188 -f 2734/1742/2188 2733/1743/2188 2719/1726/2188 -f 2720/1727/2189 2722/1729/2189 2735/1744/2189 -f 2735/1744/2189 2736/1745/2189 2720/1727/2189 -f 2721/1728/2190 2724/1731/2190 2737/1746/2190 -f 2737/1746/2190 2734/1742/2190 2721/1728/2190 -f 2723/1730/2191 2720/1727/2191 2736/1745/2191 -f 2736/1745/2192 2738/1747/2192 2723/1730/2192 -f 2724/1731/2193 2726/1733/2193 2739/1748/2193 -f 2739/1748/2193 2737/1746/2193 2724/1731/2193 -f 2725/1732/2194 2723/1730/2194 2738/1747/2194 -f 2738/1747/2195 2740/1749/2195 2725/1732/2195 -f 2862/1734/2196 2728/1736/2196 2741/1750/2196 -f 2741/1750/2196 2863/1751/2196 2864/1734/2196 -f 2727/1735/2197 2865/1737/2197 2866/1752/2197 -f 2867/1752/2197 2742/1753/2197 2727/1735/2197 -f 2728/1736/2198 2730/1739/2198 2743/1754/2198 -f 2743/1754/2198 2741/1750/2198 2728/1736/2198 -f 2729/1738/2199 2727/1735/2199 2742/1753/2199 -f 2742/1753/2200 2744/1755/2200 2729/1738/2200 -f 2730/1739/2201 2732/1741/2201 2745/1756/2201 -f 2745/1756/2201 2743/1754/2201 2730/1739/2201 -f 2731/1740/2202 2729/1738/2202 2744/1755/2202 -f 2744/1755/2203 2746/1757/2203 2731/1740/2203 -f 2746/1757/3 2744/1755/3 2743/1754/3 -f 2743/1754/3 2745/1756/3 2746/1757/3 -f 2744/1755/3 2742/1753/3 2741/1750/3 -f 2743/1754/3 2744/1755/3 2741/1750/3 -f 2741/1750/2204 2868/1752/2204 2869/1751/2204 -f 2870/1752/251 2741/1750/251 2742/1753/251 -f 2740/1749/2205 2738/1747/2205 2737/1746/2205 -f 2737/1746/2206 2739/1748/2206 2740/1749/2206 -f 2738/1747/3 2736/1745/3 2734/1742/3 -f 2737/1746/3 2738/1747/3 2734/1742/3 -f 2733/1743/2207 2734/1742/2207 2736/1745/2207 -f 2736/1745/2207 2735/1744/2207 2733/1743/2207 -f 2747/1758/2208 2748/1759/2208 2749/1760/2208 -f 2747/1758/936 2750/1761/936 2748/1759/936 -f 2749/1760/331 2751/1762/331 2752/1763/331 -f 2749/1760/2209 2748/1759/2209 2751/1762/2209 -f 2752/1763/2089 2753/1764/2089 2754/1765/2089 -f 2752/1763/938 2751/1762/938 2753/1764/938 -f 2871/1766/942 2755/1767/942 2756/1768/942 -f 2872/1766/933 2873/1769/933 2755/1767/933 -f 2756/1768/331 2757/1770/331 2758/1771/331 -f 2756/1768/331 2755/1767/331 2757/1770/331 -f 2758/1771/331 2759/1772/331 2760/1773/331 -f 2758/1771/331 2757/1770/331 2759/1772/331 -f 2747/1758/2188 2749/1760/2188 2762/1774/2188 -f 2762/1774/2188 2761/1775/2188 2747/1758/2188 -f 2748/1759/2189 2750/1761/2189 2763/1776/2189 -f 2763/1776/2189 2764/1777/2189 2748/1759/2189 -f 2749/1760/2190 2752/1763/2190 2765/1778/2190 -f 2765/1778/2190 2762/1774/2190 2749/1760/2190 -f 2751/1762/2191 2748/1759/2191 2764/1777/2191 -f 2764/1777/2192 2766/1779/2192 2751/1762/2192 -f 2752/1763/2193 2754/1765/2193 2767/1780/2193 -f 2767/1780/2193 2765/1778/2193 2752/1763/2193 -f 2753/1764/2194 2751/1762/2194 2766/1779/2194 -f 2766/1779/2195 2768/1781/2195 2753/1764/2195 -f 2874/1766/2196 2756/1768/2196 2769/1782/2196 -f 2769/1782/2196 2875/1783/2196 2876/1766/2196 -f 2755/1767/2197 2877/1769/2197 2878/1784/2197 -f 2879/1784/2197 2770/1785/2197 2755/1767/2197 -f 2756/1768/2198 2758/1771/2198 2771/1786/2198 -f 2771/1786/2198 2769/1782/2198 2756/1768/2198 -f 2757/1770/2199 2755/1767/2199 2770/1785/2199 -f 2770/1785/2200 2772/1787/2200 2757/1770/2200 -f 2758/1771/2201 2760/1773/2201 2773/1788/2201 -f 2773/1788/2201 2771/1786/2201 2758/1771/2201 -f 2759/1772/2202 2757/1770/2202 2772/1787/2202 -f 2772/1787/2203 2774/1789/2203 2759/1772/2203 -f 2774/1789/3 2772/1787/3 2771/1786/3 -f 2771/1786/3 2773/1788/3 2774/1789/3 -f 2772/1787/3 2770/1785/3 2769/1782/3 -f 2771/1786/3 2772/1787/3 2769/1782/3 -f 2769/1782/2204 2880/1784/2204 2881/1783/2204 -f 2882/1784/251 2769/1782/251 2770/1785/251 -f 2768/1781/2210 2766/1779/2210 2765/1778/2210 -f 2765/1778/2211 2767/1780/2211 2768/1781/2211 -f 2766/1779/3 2764/1777/3 2762/1774/3 -f 2765/1778/3 2766/1779/3 2762/1774/3 -f 2761/1775/2207 2762/1774/2207 2764/1777/2207 -f 2764/1777/2207 2763/1776/2207 2761/1775/2207 -f 2775/1790/2208 2776/1791/2208 2777/1792/2208 -f 2775/1790/936 2778/1793/936 2776/1791/936 -f 2777/1792/331 2779/1794/331 2780/1795/331 -f 2777/1792/2209 2776/1791/2209 2779/1794/2209 -f 2780/1795/2089 2781/1796/2089 2782/1797/2089 -f 2780/1795/938 2779/1794/938 2781/1796/938 -f 2883/1798/942 2783/1799/942 2784/1800/942 -f 2884/1798/933 2885/1801/933 2783/1799/933 -f 2784/1800/331 2785/1802/331 2786/1803/331 -f 2784/1800/331 2783/1799/331 2785/1802/331 -f 2786/1803/331 2787/1804/331 2788/1805/331 -f 2786/1803/331 2785/1802/331 2787/1804/331 -f 2775/1790/2188 2777/1792/2188 2790/1806/2188 -f 2790/1806/2188 2789/1807/2188 2775/1790/2188 -f 2776/1791/2189 2778/1793/2189 2791/1808/2189 -f 2791/1808/2189 2792/1809/2189 2776/1791/2189 -f 2777/1792/2190 2780/1795/2190 2793/1810/2190 -f 2793/1810/2190 2790/1806/2190 2777/1792/2190 -f 2779/1794/2191 2776/1791/2191 2792/1809/2191 -f 2792/1809/2192 2794/1811/2192 2779/1794/2192 -f 2780/1795/2193 2782/1797/2193 2795/1812/2193 -f 2795/1812/2193 2793/1810/2193 2780/1795/2193 -f 2781/1796/2194 2779/1794/2194 2794/1811/2194 -f 2794/1811/2195 2796/1813/2195 2781/1796/2195 -f 2886/1798/2196 2784/1800/2196 2797/1814/2196 -f 2797/1814/2196 2887/1815/2196 2888/1798/2196 -f 2783/1799/2197 2889/1801/2197 2890/1816/2197 -f 2891/1816/2197 2798/1817/2197 2783/1799/2197 -f 2784/1800/2198 2786/1803/2198 2799/1818/2198 -f 2799/1818/2198 2797/1814/2198 2784/1800/2198 -f 2785/1802/2212 2783/1799/2212 2798/1817/2212 -f 2798/1817/2213 2800/1819/2213 2785/1802/2213 -f 2786/1803/2201 2788/1805/2201 2801/1820/2201 -f 2801/1820/2201 2799/1818/2201 2786/1803/2201 -f 2787/1804/2202 2785/1802/2202 2800/1819/2202 -f 2800/1819/2203 2802/1821/2203 2787/1804/2203 -f 2802/1821/3 2800/1819/3 2799/1818/3 -f 2799/1818/3 2801/1820/3 2802/1821/3 -f 2800/1819/3 2798/1817/3 2797/1814/3 -f 2799/1818/3 2800/1819/3 2797/1814/3 -f 2797/1814/2204 2892/1816/2204 2893/1815/2204 -f 2894/1816/251 2797/1814/251 2798/1817/251 -f 2796/1813/2210 2794/1811/2210 2793/1810/2210 -f 2793/1810/2211 2795/1812/2211 2796/1813/2211 -f 2794/1811/3 2792/1809/3 2790/1806/3 -f 2793/1810/3 2794/1811/3 2790/1806/3 -f 2789/1807/2207 2790/1806/2207 2792/1809/2207 -f 2792/1809/2207 2791/1808/2207 2789/1807/2207 -f 2803/1822/2214 2804/1823/2214 2805/1824/2214 -f 2803/1822/2214 2806/1825/2214 2804/1823/2214 -f 2805/1824/331 2807/1826/331 2808/1827/331 -f 2805/1824/331 2804/1823/331 2807/1826/331 -f 2808/1827/1571 2809/1828/1571 2810/1829/1571 -f 2808/1827/2187 2807/1826/2187 2809/1828/2187 -f 2895/1830/2215 2811/1831/2215 2812/1832/2215 -f 2896/1830/2216 2897/1833/2216 2811/1831/2216 -f 2812/1832/331 2813/1834/331 2814/1835/331 -f 2812/1832/331 2811/1831/331 2813/1834/331 -f 2814/1835/2217 2815/1836/2217 2816/1837/2217 -f 2814/1835/2214 2813/1834/2214 2815/1836/2214 -f 2803/1822/2188 2805/1824/2188 2818/1838/2188 -f 2818/1838/2188 2817/1839/2188 2803/1822/2188 -f 2804/1823/2189 2806/1825/2189 2819/1840/2189 -f 2819/1840/2189 2820/1841/2189 2804/1823/2189 -f 2805/1824/2190 2808/1827/2190 2821/1842/2190 -f 2821/1842/2190 2818/1838/2190 2805/1824/2190 -f 2807/1826/2191 2804/1823/2191 2820/1841/2191 -f 2820/1841/2192 2822/1843/2192 2807/1826/2192 -f 2808/1827/2193 2810/1829/2193 2823/1844/2193 -f 2823/1844/2193 2821/1842/2193 2808/1827/2193 -f 2809/1828/2194 2807/1826/2194 2822/1843/2194 -f 2822/1843/2195 2824/1845/2195 2809/1828/2195 -f 2898/1830/2196 2812/1832/2196 2825/1846/2196 -f 2825/1846/2196 2899/1847/2196 2900/1830/2196 -f 2811/1831/2197 2901/1833/2197 2902/1848/2197 -f 2903/1848/2218 2826/1849/2218 2811/1831/2218 -f 2812/1832/2198 2814/1835/2198 2827/1850/2198 -f 2827/1850/2198 2825/1846/2198 2812/1832/2198 -f 2813/1834/2199 2811/1831/2199 2826/1849/2199 -f 2826/1849/2213 2828/1851/2213 2813/1834/2213 -f 2814/1835/2201 2816/1837/2201 2829/1852/2201 -f 2829/1852/2201 2827/1850/2201 2814/1835/2201 -f 2815/1836/2202 2813/1834/2202 2828/1851/2202 -f 2828/1851/2203 2830/1853/2203 2815/1836/2203 -f 2830/1853/3 2828/1851/3 2827/1850/3 -f 2827/1850/3 2829/1852/3 2830/1853/3 -f 2828/1851/3 2826/1849/3 2825/1846/3 -f 2827/1850/3 2828/1851/3 2825/1846/3 -f 2825/1846/2204 2904/1848/2204 2905/1847/2204 -f 2906/1848/251 2825/1846/251 2826/1849/251 -f 2824/1845/2219 2822/1843/2219 2821/1842/2219 -f 2821/1842/2220 2823/1844/2220 2824/1845/2220 -f 2822/1843/3 2820/1841/3 2818/1838/3 -f 2821/1842/3 2822/1843/3 2818/1838/3 -f 2817/1839/2221 2818/1838/2221 2820/1841/2221 -f 2820/1841/2221 2819/1840/2221 2817/1839/2221 -f 2831/1854/2222 2832/1855/2222 2833/1856/2222 -f 2831/1854/2223 2833/1856/2223 2834/1857/2223 -f 2835/1858/2224 2836/1859/2224 2837/1860/2224 -f 2838/1861/2222 2835/1858/2222 2837/1860/2222 -f 2839/1862/2225 2840/1863/2225 2832/1855/2225 -f 2832/1855/2225 2831/1854/2225 2839/1862/2225 -f 2840/1863/2226 2841/1864/2226 2833/1856/2226 -f 2833/1856/2227 2832/1855/2227 2840/1863/2227 -f 2841/1864/2228 2842/1865/2228 2834/1857/2228 -f 2834/1857/2228 2833/1856/2228 2841/1864/2228 -f 2843/1866/356 2844/1867/356 2837/1860/356 -f 2837/1860/356 2836/1859/356 2843/1866/356 -f 2845/1868/2228 2846/1869/2228 2835/1858/2228 -f 2835/1858/2228 2838/1861/2228 2845/1868/2228 -f 2844/1867/331 2845/1868/331 2838/1861/331 -f 2838/1861/331 2837/1860/331 2844/1867/331 -f 2846/1869/7 2845/1868/7 2844/1867/7 -f 2844/1867/7 2843/1866/7 2846/1869/7 -f 2842/1865/7 2841/1864/7 2839/1862/7 -f 2839/1862/7 2841/1864/7 2840/1863/7 -o diespipe -v -0.292075 0.095761 0.910208 -v -0.307054 0.110567 0.910064 -v -0.292067 0.118629 0.910036 -v -0.278101 0.110565 0.910073 -v -0.278263 0.100553 0.910141 -v -0.587005 0.096190 0.910078 -v -0.601497 0.093851 0.910043 -v -0.601496 0.110514 0.910021 -v -0.572545 0.093849 0.910052 -v -0.307192 0.100167 0.910132 -v -0.587019 0.118924 0.910021 -v -0.572544 0.110565 0.910021 -v -0.292578 0.094251 0.065413 -v -0.307056 0.094251 0.071849 -v -0.307056 0.115094 0.084720 -v -0.292578 0.120427 0.091155 -v -0.278101 0.115094 0.084720 -v -0.278101 0.094251 0.071849 -v -0.307056 0.123153 0.065185 -v -0.292578 0.123094 0.056827 -v -0.278101 0.123153 0.065185 -v -0.307055 1.451027 0.065422 -v -0.292577 1.445030 0.059599 -v -0.307055 1.444126 0.084606 -v -0.292577 1.444209 0.092963 -v -0.278100 1.444126 0.084606 -v -0.278100 1.451027 0.065422 -v -0.307055 1.463019 0.077068 -v -0.292577 1.469016 0.082891 -v -0.278100 1.463019 0.077068 -v -0.307055 1.470944 0.058367 -v -0.292577 1.479302 0.058447 -v -0.278100 1.470944 0.058367 -v -0.306964 1.455421 -0.332629 -v -0.292692 1.447077 -0.346968 -v -0.307072 1.472122 -0.332597 -v -0.292763 1.480468 -0.346924 -v -0.277996 1.472120 -0.332597 -v -0.277888 1.455419 -0.332629 -v -0.587020 0.084905 0.092576 -v -0.601498 0.104427 0.071849 -v -0.587020 0.099093 0.065413 -v -0.601498 0.093258 0.092887 -v -0.601498 0.115094 0.084720 -v -0.587020 0.120428 0.091155 -v -0.572543 0.115094 0.084720 -v -0.572543 0.104427 0.071849 -v -0.572543 0.093257 0.092886 -v -0.601498 0.123154 0.065185 -v -0.587020 0.123094 0.056827 -v -0.572543 0.123153 0.065185 -v -0.601497 1.451027 0.065422 -v -0.587019 1.445030 0.059599 -v -0.601496 1.444126 0.084606 -v -0.587019 1.444210 0.092964 -v -0.572542 1.444126 0.084606 -v -0.572542 1.451027 0.065422 -v -0.601496 1.463020 0.077068 -v -0.587019 1.469016 0.082891 -v -0.572542 1.463020 0.077068 -v -0.601496 1.470944 0.058368 -v -0.587019 1.479302 0.058447 -v -0.572542 1.470944 0.058368 -v -0.601550 1.455442 -0.332629 -v -0.586949 1.447104 -0.346968 -v -0.601550 1.472143 -0.332597 -v -0.586948 1.480496 -0.346925 -v -0.572379 1.472141 -0.332597 -v -0.572380 1.455440 -0.332629 -v -1.147675 1.480534 -0.347007 -v -1.155754 1.527605 -0.361467 -v -1.147733 1.527605 -0.347018 -v -1.155766 1.472177 -0.361457 -v -1.171797 1.527605 -0.361468 -v -1.171787 1.472179 -0.361457 -v -1.179818 1.527605 -0.347018 -v -1.179854 1.480535 -0.347007 -v -1.171797 1.527605 -0.332569 -v -1.171787 1.472179 -0.332557 -v -1.155754 1.527605 -0.332568 -v -1.155766 1.472177 -0.332557 -v -1.151367 1.527673 -0.300325 -v -1.151367 1.553988 -0.300325 -v -1.129875 1.527673 -0.312836 -v -1.122256 1.553988 -0.322848 -v -1.115832 1.527673 -0.347018 -v -1.117467 1.553988 -0.359529 -v -1.129875 1.527673 -0.381200 -v -1.139804 1.553988 -0.388882 -v -1.163775 1.527673 -0.395358 -v -1.176184 1.553988 -0.393712 -v -1.197676 1.527673 -0.381200 -v -1.205295 1.553988 -0.371188 -v -1.211718 1.527673 -0.347018 -v -1.210084 1.553988 -0.334507 -v -1.197676 1.527673 -0.312836 -v -1.187746 1.553988 -0.305154 -v -1.176184 1.527673 -0.300325 -v -1.176184 1.553988 -0.300325 -v 0.298350 1.480443 -0.347008 -v 0.290305 1.527603 -0.361468 -v 0.298327 1.527603 -0.347018 -v 0.290347 1.472108 -0.361457 -v 0.274263 1.527603 -0.361468 -v 0.274246 1.472110 -0.361457 -v 0.266241 1.527603 -0.347018 -v 0.266271 1.480445 -0.347008 -v 0.274263 1.527603 -0.332569 -v 0.274246 1.472110 -0.332558 -v 0.290305 1.527603 -0.332569 -v 0.290347 1.472108 -0.332558 -v 0.294692 1.527671 -0.300325 -v 0.294692 1.553986 -0.300325 -v 0.316185 1.527671 -0.312837 -v 0.323804 1.553986 -0.322848 -v 0.330227 1.527671 -0.347018 -v 0.328593 1.553986 -0.359530 -v 0.316185 1.527671 -0.381200 -v 0.306255 1.553986 -0.388882 -v 0.282284 1.527671 -0.395359 -v 0.269876 1.553986 -0.393712 -v 0.248383 1.527671 -0.381200 -v 0.240764 1.553986 -0.371189 -v 0.234341 1.527671 -0.347018 -v 0.235975 1.553986 -0.334507 -v 0.248384 1.527671 -0.312837 -v 0.258312 1.553986 -0.305155 -v 0.269876 1.527671 -0.300325 -v 0.269876 1.553986 -0.300325 -v 0.381154 1.440537 -0.332547 -v 0.384937 1.465925 -0.332546 -v 0.375690 1.452036 -0.332547 -v 0.397818 1.441383 -0.332546 -v 0.389561 1.472869 -0.346997 -v 0.406150 1.441805 -0.346997 -v 0.384937 1.465925 -0.361447 -v 0.397818 1.441383 -0.361447 -v 0.375690 1.452037 -0.361447 -v 0.381154 1.440538 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.367567 1.472087 -0.332546 -v 0.367698 1.480429 -0.346997 -v 0.367567 1.472087 -0.361446 -v 0.274228 1.455423 -0.332546 -v 0.274229 1.455423 -0.361447 -v 0.274228 1.447081 -0.346997 -v -0.292856 1.472118 -0.361446 -v -0.292857 1.455432 -0.361446 -v -0.586936 1.472161 -0.361446 -v -0.586937 1.455476 -0.361446 -v -1.155780 1.455486 -0.332546 -v -1.155780 1.455486 -0.361446 -v -1.155780 1.447144 -0.346996 -v -1.236537 1.472195 -0.332546 -v -1.236636 1.480537 -0.346996 -v -1.236537 1.472195 -0.361446 -v -1.264335 1.465568 -0.332546 -v -1.254110 1.452384 -0.332546 -v -1.269448 1.472160 -0.346996 -v -1.264336 1.465568 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.248996 1.445791 -0.346996 -v -1.281743 1.444267 -0.332546 -v -1.265282 1.441541 -0.332546 -v -1.289974 1.445631 -0.346996 -v -1.281743 1.444267 -0.361446 -v -1.265282 1.441541 -0.361446 -v -1.257051 1.440177 -0.346996 -v -1.281659 1.397097 -0.361446 -v -1.264987 1.397097 -0.361446 -v 0.380231 1.397095 -0.361446 -v 0.371888 1.397095 -0.346997 -v 0.380231 1.397095 -0.332546 -v 0.396917 1.397095 -0.361447 -v 0.405259 1.397095 -0.346997 -v 0.396917 1.397095 -0.332547 -v 0.387445 1.397095 -0.332546 -v 0.387456 1.397095 -0.332547 -v -1.264987 1.397097 -0.332546 -v -1.281659 1.397097 -0.332546 -v -1.289994 1.397097 -0.346996 -v -1.256652 1.397097 -0.346996 -v -1.467952 0.686714 0.234200 -v -1.482925 0.698137 0.223114 -v -1.467952 0.698141 0.231759 -v -1.468099 0.668499 0.477396 -v -1.468099 0.685681 0.477396 -v -1.482979 0.694272 0.477396 -v -1.497860 0.685681 0.477396 -v -1.482979 0.659907 0.477396 -v -1.497860 0.668499 0.477396 -v -1.497900 0.669545 0.252358 -v -1.482926 0.661201 0.250097 -v -1.497900 0.692191 0.252964 -v -1.467952 0.669545 0.252358 -v -1.467952 0.694141 0.249813 -v -1.497900 0.686715 0.234200 -v -1.482926 0.683001 0.226393 -v -1.467952 0.686714 0.234200 -v -1.482926 0.698154 0.257693 -v -1.497899 1.450291 0.228780 -v -1.482925 1.444157 0.222690 -v -1.497899 1.462561 0.240963 -v -1.482925 1.468695 0.247054 -v -1.467951 1.462561 0.240963 -v -1.467951 1.447184 0.227851 -v -1.497899 1.449471 -0.332978 -v -1.482925 1.443342 -0.326881 -v -1.497899 1.472101 -0.320973 -v -1.482924 1.480746 -0.321005 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.454811 -0.320908 -v -1.497899 1.461730 -0.345170 -v -1.482925 1.467860 -0.351266 -v -1.467952 1.461730 -0.345170 -v -1.467952 1.444925 -0.336195 -v -1.497900 1.440084 -0.355280 -v -1.482925 1.440333 -0.363922 -v -1.467952 1.440084 -0.355281 -v -1.497899 1.397098 -0.355443 -v -1.482990 1.397098 -0.364135 -v -1.467999 1.397098 -0.355555 -v -1.482925 1.397098 -0.329592 -v -1.497819 1.397098 -0.338191 -v -1.467952 1.397098 -0.338237 -v 0.615024 0.668496 0.477378 -v 0.615024 0.685679 0.477378 -v 0.600144 0.694270 0.477378 -v 0.585263 0.685679 0.477378 -v 0.600144 0.659905 0.477378 -v 0.585263 0.668496 0.477378 -v 0.585223 0.669543 0.252340 -v 0.600197 0.661199 0.250078 -v 0.585223 0.692189 0.252946 -v 0.615171 0.669543 0.252340 -v 0.615171 0.694139 0.249795 -v 0.585223 0.686712 0.234181 -v 0.600197 0.682999 0.226374 -v 0.615171 0.686712 0.234181 -v 0.600197 0.698152 0.257674 -v 0.585224 1.450289 0.228762 -v 0.600198 1.444155 0.222671 -v 0.585224 1.462559 0.240944 -v 0.600198 1.468693 0.247036 -v 0.615172 1.462559 0.240944 -v 0.615172 1.447181 0.227832 -v 0.585224 1.449469 -0.332997 -v 0.600198 1.443340 -0.326900 -v 0.585224 1.472099 -0.320992 -v 0.600198 1.480744 -0.321024 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.454809 -0.320927 -v 0.585224 1.461728 -0.345189 -v 0.600197 1.467858 -0.351285 -v 0.615171 1.461728 -0.345189 -v 0.615171 1.444923 -0.336214 -v 0.585223 1.440082 -0.355299 -v 0.600197 1.440331 -0.363941 -v 0.615171 1.440082 -0.355299 -v 0.585224 1.397096 -0.355461 -v 0.600133 1.397096 -0.364154 -v 0.615123 1.397096 -0.355573 -v 0.600197 1.397096 -0.329611 -v 0.585303 1.397096 -0.338210 -v 0.615171 1.397096 -0.338256 -v -0.433317 0.676592 2.698729 -v -0.433273 0.695542 2.698728 -v -0.449769 0.667176 2.699296 -v -0.449592 0.705025 2.699290 -v -0.465995 0.695641 2.699864 -v -0.466089 0.676719 2.699867 -v -0.449682 0.124829 2.328056 -v -0.449682 0.094779 2.341581 -v -0.433248 0.100781 2.326608 -v -0.466116 0.123353 2.338130 -v -0.466116 0.106945 2.347295 -v -0.433248 0.123353 2.338130 -v -0.466116 0.127242 2.357770 -v -0.449682 0.127267 2.367258 -v -0.433248 0.127242 2.357770 -v -0.466115 0.661664 2.338843 -v -0.449681 0.661686 2.329355 -v -0.466115 0.664713 2.358441 -v -0.449681 0.662700 2.367486 -v -0.433248 0.661620 2.357819 -v -0.433248 0.661664 2.338843 -v -0.466114 0.693041 2.361220 -v -0.449681 0.702079 2.358333 -v -0.433248 0.671832 2.362039 -v -0.433248 0.693041 2.361220 -v -0.466114 0.675520 2.372075 -v -0.449682 0.124019 2.112728 -v -0.466115 0.114532 2.112725 -v -0.466112 0.095554 2.112725 -v -0.449663 0.096334 2.112726 -v -0.433248 0.095564 2.112732 -v -0.433248 0.114532 2.112733 -v -0.449675 0.124016 2.112728 -v -0.443805 3.183812 3.439444 -v -0.458152 3.183558 3.447723 -v -0.443805 3.186335 3.473371 -v -0.429459 3.192196 3.467518 -v -0.429459 3.183558 3.447723 -v -0.458152 3.203918 3.455812 -v -0.443805 3.209780 3.449959 -v -0.458152 3.192196 3.467518 -v -0.429459 3.203918 3.455812 -v -0.458152 3.211245 3.475512 -v -0.443805 3.219528 3.475507 -v -0.429459 3.211245 3.475512 -v -0.458152 3.211244 4.092529 -v -0.443805 3.219527 4.092540 -v -0.458152 3.188301 4.102205 -v -0.443805 3.186088 4.093656 -v -0.429458 3.188301 4.102205 -v -0.429458 3.211244 4.092529 -v -0.458152 3.203329 4.111561 -v -0.443805 3.209200 4.117404 -v -0.429458 3.203329 4.111561 -v -0.443805 3.184472 4.128129 -v -0.429458 3.184475 4.119846 -v -0.458152 3.184475 4.119846 -v -0.458156 0.094247 4.117269 -v -0.443809 0.094247 4.125552 -v -0.458156 0.094247 4.100702 -v -0.443809 0.094247 4.092418 -v -0.429462 0.094247 4.100701 -v -0.429462 0.094247 4.117269 -v -0.443807 3.148010 3.439536 -v -0.443805 3.148010 3.439536 -v -0.458152 3.148010 3.447819 -v -0.458152 3.148010 3.464385 -v -0.458151 3.148010 3.464386 -v -0.443805 3.148010 3.472668 -v -0.443804 3.148010 3.472667 -v -0.429459 3.148010 3.464385 -v -0.429459 3.148010 3.447819 -v -0.429460 3.148010 3.447818 -v -0.292578 0.123094 0.056827 -v -0.292578 0.123094 0.056827 -v -0.307056 0.123153 0.065185 -v -0.307055 1.451027 0.065422 -v -0.307056 0.123153 0.065185 -v -0.307055 1.451027 0.065422 -v -0.307056 0.123153 0.065185 -v -0.307056 0.115094 0.084720 -v -0.307055 1.444126 0.084606 -v -0.307056 0.115094 0.084720 -v -0.307055 1.444126 0.084606 -v -0.307056 0.115094 0.084720 -v -0.292577 1.444209 0.092963 -v -0.292578 0.120427 0.091155 -v -0.278101 0.115094 0.084720 -v -0.278100 1.444126 0.084606 -v -0.278101 0.115094 0.084720 -v -0.278100 1.444126 0.084606 -v -0.278101 0.115094 0.084720 -v -0.278101 0.123153 0.065185 -v -0.278101 0.123153 0.065185 -v -0.292577 1.445030 0.059599 -v -0.278100 1.451027 0.065422 -v -0.278101 0.123153 0.065185 -v -0.292578 0.123094 0.056827 -v -0.292577 1.445030 0.059599 -v -0.307055 1.451027 0.065422 -v -0.307055 1.444126 0.084606 -v -0.307055 1.444126 0.084606 -v -0.307055 1.463019 0.077068 -v -0.307055 1.444126 0.084606 -v -0.292577 1.444209 0.092963 -v -0.292577 1.469016 0.082891 -v -0.292577 1.444209 0.092963 -v -0.292577 1.469016 0.082891 -v -0.292577 1.444209 0.092963 -v -0.278100 1.444126 0.084606 -v -0.278100 1.463019 0.077068 -v -0.278100 1.444126 0.084606 -v -0.278100 1.451027 0.065422 -v -0.278100 1.463019 0.077068 -v -0.307055 1.451027 0.065422 -v -0.307055 1.463019 0.077068 -v -0.307055 1.463019 0.077068 -v -0.307055 1.463019 0.077068 -v -0.292577 1.469016 0.082891 -v -0.292577 1.479302 0.058447 -v -0.292577 1.469016 0.082891 -v -0.292577 1.479302 0.058447 -v -0.292577 1.469016 0.082891 -v -0.278100 1.463019 0.077068 -v -0.278100 1.470944 0.058367 -v -0.278100 1.463019 0.077068 -v -0.278100 1.451027 0.065422 -v -0.278100 1.470944 0.058367 -v -0.292577 1.445030 0.059599 -v -0.292577 1.445030 0.059599 -v -0.307055 1.451027 0.065422 -v -0.306964 1.455421 -0.332629 -v -0.307055 1.451027 0.065422 -v -0.306964 1.455421 -0.332629 -v -0.307055 1.451027 0.065422 -v -0.307055 1.470944 0.058367 -v -0.307072 1.472122 -0.332597 -v -0.307055 1.470944 0.058367 -v -0.307072 1.472122 -0.332597 -v -0.307055 1.470944 0.058367 -v -0.292577 1.479302 0.058447 -v -0.292763 1.480468 -0.346924 -v -0.292577 1.479302 0.058447 -v -0.292763 1.480468 -0.346924 -v -0.292577 1.479302 0.058447 -v -0.278100 1.470944 0.058367 -v -0.277996 1.472120 -0.332597 -v -0.278100 1.470944 0.058367 -v -0.277996 1.472120 -0.332597 -v -0.278100 1.470944 0.058367 -v -0.278100 1.451027 0.065422 -v -0.277888 1.455419 -0.332629 -v -0.278100 1.451027 0.065422 -v -0.292692 1.447077 -0.346968 -v -0.277888 1.455419 -0.332629 -v -0.278100 1.451027 0.065422 -v -0.292577 1.445030 0.059599 -v -0.292692 1.447077 -0.346968 -v -0.587020 0.084905 0.092576 -v -0.601498 0.104427 0.071849 -v -0.601498 0.093258 0.092887 -v -0.601498 0.104427 0.071849 -v -0.572543 0.093257 0.092886 -v -0.587020 0.099093 0.065413 -v -0.572543 0.104427 0.071849 -v -0.572543 0.093257 0.092886 -v -0.587020 0.084905 0.092576 -v -0.587020 0.099093 0.065413 -v -0.587020 0.099093 0.065413 -v -0.601498 0.104427 0.071849 -v -0.601498 0.123154 0.065185 -v -0.601498 0.104427 0.071849 -v -0.601498 0.115094 0.084720 -v -0.601498 0.123154 0.065185 -v -0.572543 0.115094 0.084720 -v -0.572543 0.104427 0.071849 -v -0.587020 0.123094 0.056827 -v -0.572543 0.123153 0.065185 -v -0.572543 0.104427 0.071849 -v -0.587020 0.099093 0.065413 -v -0.587020 0.123094 0.056827 -v -0.587020 0.123094 0.056827 -v -0.601498 0.123154 0.065185 -v -0.601497 1.451027 0.065422 -v -0.601498 0.123154 0.065185 -v -0.601497 1.451027 0.065422 -v -0.601498 0.123154 0.065185 -v -0.601498 0.115094 0.084720 -v -0.601496 1.444126 0.084606 -v -0.601498 0.115094 0.084720 -v -0.601496 1.444126 0.084606 -v -0.601498 0.115094 0.084720 -v -0.587019 1.444210 0.092964 -v -0.587020 0.120428 0.091155 -v -0.587019 1.444210 0.092964 -v -0.587020 0.120428 0.091155 -v -0.572543 0.115094 0.084720 -v -0.572542 1.444126 0.084606 -v -0.572543 0.115094 0.084720 -v -0.572542 1.444126 0.084606 -v -0.572543 0.115094 0.084720 -v -0.572543 0.123153 0.065185 -v -0.572542 1.451027 0.065422 -v -0.587019 1.445030 0.059599 -v -0.572542 1.451027 0.065422 -v -0.572543 0.123153 0.065185 -v -0.587020 0.123094 0.056827 -v -0.587019 1.445030 0.059599 -v -0.601497 1.451027 0.065422 -v -0.601496 1.444126 0.084606 -v -0.601496 1.444126 0.084606 -v -0.601496 1.463020 0.077068 -v -0.601496 1.444126 0.084606 -v -0.587019 1.444210 0.092964 -v -0.587019 1.469016 0.082891 -v -0.587019 1.444210 0.092964 -v -0.587019 1.469016 0.082891 -v -0.587019 1.444210 0.092964 -v -0.572542 1.444126 0.084606 -v -0.572542 1.463020 0.077068 -v -0.572542 1.444126 0.084606 -v -0.572542 1.451027 0.065422 -v -0.572542 1.463020 0.077068 -v -0.601497 1.451027 0.065422 -v -0.601496 1.463020 0.077068 -v -0.601496 1.470944 0.058368 -v -0.601496 1.463020 0.077068 -v -0.587019 1.469016 0.082891 -v -0.587019 1.479302 0.058447 -v -0.587019 1.469016 0.082891 -v -0.587019 1.479302 0.058447 -v -0.587019 1.469016 0.082891 -v -0.572542 1.463020 0.077068 -v -0.572542 1.470944 0.058368 -v -0.572542 1.463020 0.077068 -v -0.572542 1.451027 0.065422 -v -0.572542 1.470944 0.058368 -v -0.587019 1.445030 0.059599 -v -0.587019 1.445030 0.059599 -v -0.601497 1.451027 0.065422 -v -0.601550 1.455442 -0.332629 -v -0.601497 1.451027 0.065422 -v -0.601550 1.455442 -0.332629 -v -0.601497 1.451027 0.065422 -v -0.601496 1.470944 0.058368 -v -0.601550 1.472143 -0.332597 -v -0.601496 1.470944 0.058368 -v -0.601550 1.472143 -0.332597 -v -0.601496 1.470944 0.058368 -v -0.587019 1.479302 0.058447 -v -0.586948 1.480496 -0.346925 -v -0.587019 1.479302 0.058447 -v -0.586948 1.480496 -0.346925 -v -0.587019 1.479302 0.058447 -v -0.572542 1.470944 0.058368 -v -0.572379 1.472141 -0.332597 -v -0.572542 1.470944 0.058368 -v -0.572379 1.472141 -0.332597 -v -0.572542 1.470944 0.058368 -v -0.572542 1.451027 0.065422 -v -0.572380 1.455440 -0.332629 -v -0.572542 1.451027 0.065422 -v -0.586949 1.447104 -0.346968 -v -0.572380 1.455440 -0.332629 -v -0.572542 1.451027 0.065422 -v -0.587019 1.445030 0.059599 -v -0.586949 1.447104 -0.346968 -v -1.147675 1.480534 -0.347007 -v -1.155754 1.527605 -0.361467 -v -1.155766 1.472177 -0.361457 -v -1.155754 1.527605 -0.361467 -v -1.155766 1.472177 -0.361457 -v -1.171797 1.527605 -0.361468 -v -1.171787 1.472179 -0.361457 -v -1.171797 1.527605 -0.361468 -v -1.179818 1.527605 -0.347018 -v -1.179854 1.480535 -0.347007 -v -1.179818 1.527605 -0.347018 -v -1.179854 1.480535 -0.347007 -v -1.171797 1.527605 -0.332569 -v -1.171787 1.472179 -0.332557 -v -1.171797 1.527605 -0.332569 -v -1.171787 1.472179 -0.332557 -v -1.155754 1.527605 -0.332568 -v -1.155766 1.472177 -0.332557 -v -1.147733 1.527605 -0.347018 -v -1.155754 1.527605 -0.332568 -v -1.155766 1.472177 -0.332557 -v -1.147675 1.480534 -0.347007 -v -1.147733 1.527605 -0.347018 -v -1.151367 1.553988 -0.300325 -v -1.129875 1.527673 -0.312836 -v -1.122256 1.553988 -0.322848 -v -1.129875 1.527673 -0.312836 -v -1.122256 1.553988 -0.322848 -v -1.115832 1.527673 -0.347018 -v -1.117467 1.553988 -0.359529 -v -1.115832 1.527673 -0.347018 -v -1.117467 1.553988 -0.359529 -v -1.129875 1.527673 -0.381200 -v -1.139804 1.553988 -0.388882 -v -1.129875 1.527673 -0.381200 -v -1.139804 1.553988 -0.388882 -v -1.163775 1.527673 -0.395358 -v -1.176184 1.553988 -0.393712 -v -1.163775 1.527673 -0.395358 -v -1.176184 1.553988 -0.393712 -v -1.197676 1.527673 -0.381200 -v -1.205295 1.553988 -0.371188 -v -1.197676 1.527673 -0.381200 -v -1.205295 1.553988 -0.371188 -v -1.211718 1.527673 -0.347018 -v -1.210084 1.553988 -0.334507 -v -1.211718 1.527673 -0.347018 -v -1.210084 1.553988 -0.334507 -v -1.197676 1.527673 -0.312836 -v -1.187746 1.553988 -0.305154 -v -1.197676 1.527673 -0.312836 -v -1.187746 1.553988 -0.305154 -v -1.176184 1.527673 -0.300325 -v -1.176184 1.553988 -0.300325 -v -1.176184 1.527673 -0.300325 -v -1.151367 1.527673 -0.300325 -v -1.176184 1.553988 -0.300325 -v -1.151367 1.527673 -0.300325 -v -1.151367 1.553988 -0.300325 -v -1.151367 1.527673 -0.300325 -v -1.176184 1.527673 -0.300325 -v -1.171797 1.527605 -0.332569 -v -1.176184 1.527673 -0.300325 -v -1.197676 1.527673 -0.312836 -v -1.171797 1.527605 -0.332569 -v -1.197676 1.527673 -0.312836 -v -1.179818 1.527605 -0.347018 -v -1.171797 1.527605 -0.332569 -v -1.197676 1.527673 -0.312836 -v -1.211718 1.527673 -0.347018 -v -1.179818 1.527605 -0.347018 -v -1.155754 1.527605 -0.332568 -v -1.129875 1.527673 -0.312836 -v -1.151367 1.527673 -0.300325 -v -1.155754 1.527605 -0.332568 -v -1.147733 1.527605 -0.347018 -v -1.129875 1.527673 -0.312836 -v -1.129875 1.527673 -0.312836 -v -1.147733 1.527605 -0.347018 -v -1.115832 1.527673 -0.347018 -v -1.147733 1.527605 -0.347018 -v -1.129875 1.527673 -0.381200 -v -1.115832 1.527673 -0.347018 -v -1.147733 1.527605 -0.347018 -v -1.155754 1.527605 -0.361467 -v -1.129875 1.527673 -0.381200 -v -1.129875 1.527673 -0.381200 -v -1.155754 1.527605 -0.361467 -v -1.163775 1.527673 -0.395358 -v -1.155754 1.527605 -0.361467 -v -1.171797 1.527605 -0.361468 -v -1.163775 1.527673 -0.395358 -v -1.171797 1.527605 -0.361468 -v -1.197676 1.527673 -0.381200 -v -1.163775 1.527673 -0.395358 -v -1.179818 1.527605 -0.347018 -v -1.211718 1.527673 -0.347018 -v -1.197676 1.527673 -0.381200 -v -1.171797 1.527605 -0.361468 -v -1.179818 1.527605 -0.347018 -v -1.197676 1.527673 -0.381200 -v -1.155754 1.527605 -0.332568 -v -1.151367 1.527673 -0.300325 -v -1.171797 1.527605 -0.332569 -v -1.139804 1.553988 -0.388882 -v -1.187746 1.553988 -0.305154 -v -1.176184 1.553988 -0.300325 -v -1.139804 1.553988 -0.388882 -v -1.176184 1.553988 -0.300325 -v -1.151367 1.553988 -0.300325 -v -1.151367 1.553988 -0.300325 -v -1.117467 1.553988 -0.359529 -v -1.139804 1.553988 -0.388882 -v -1.117467 1.553988 -0.359529 -v -1.151367 1.553988 -0.300325 -v -1.122256 1.553988 -0.322848 -v -1.187746 1.553988 -0.305154 -v -1.139804 1.553988 -0.388882 -v -1.176184 1.553988 -0.393712 -v -1.187746 1.553988 -0.305154 -v -1.176184 1.553988 -0.393712 -v -1.210084 1.553988 -0.334507 -v -1.176184 1.553988 -0.393712 -v -1.205295 1.553988 -0.371188 -v -1.210084 1.553988 -0.334507 -v 0.298350 1.480443 -0.347008 -v 0.290305 1.527603 -0.361468 -v 0.290347 1.472108 -0.361457 -v 0.290305 1.527603 -0.361468 -v 0.290347 1.472108 -0.361457 -v 0.274263 1.527603 -0.361468 -v 0.274246 1.472110 -0.361457 -v 0.274263 1.527603 -0.361468 -v 0.274246 1.472110 -0.361457 -v 0.266241 1.527603 -0.347018 -v 0.266271 1.480445 -0.347008 -v 0.266241 1.527603 -0.347018 -v 0.266271 1.480445 -0.347008 -v 0.274263 1.527603 -0.332569 -v 0.274246 1.472110 -0.332558 -v 0.274263 1.527603 -0.332569 -v 0.274246 1.472110 -0.332558 -v 0.290305 1.527603 -0.332569 -v 0.290347 1.472108 -0.332558 -v 0.298327 1.527603 -0.347018 -v 0.290305 1.527603 -0.332569 -v 0.290347 1.472108 -0.332558 -v 0.298350 1.480443 -0.347008 -v 0.298327 1.527603 -0.347018 -v 0.294692 1.553986 -0.300325 -v 0.316185 1.527671 -0.312837 -v 0.323804 1.553986 -0.322848 -v 0.316185 1.527671 -0.312837 -v 0.328593 1.553986 -0.359530 -v 0.330227 1.527671 -0.347018 -v 0.306255 1.553986 -0.388882 -v 0.316185 1.527671 -0.381200 -v 0.306255 1.553986 -0.388882 -v 0.282284 1.527671 -0.395359 -v 0.269876 1.553986 -0.393712 -v 0.282284 1.527671 -0.395359 -v 0.240764 1.553986 -0.371189 -v 0.248383 1.527671 -0.381200 -v 0.240764 1.553986 -0.371189 -v 0.234341 1.527671 -0.347018 -v 0.235975 1.553986 -0.334507 -v 0.234341 1.527671 -0.347018 -v 0.258312 1.553986 -0.305155 -v 0.248384 1.527671 -0.312837 -v 0.269876 1.553986 -0.300325 -v 0.269876 1.527671 -0.300325 -v 0.294692 1.527671 -0.300325 -v 0.294692 1.527671 -0.300325 -v 0.294692 1.553986 -0.300325 -v 0.294692 1.527671 -0.300325 -v 0.269876 1.527671 -0.300325 -v 0.274263 1.527603 -0.332569 -v 0.269876 1.527671 -0.300325 -v 0.248384 1.527671 -0.312837 -v 0.274263 1.527603 -0.332569 -v 0.248384 1.527671 -0.312837 -v 0.266241 1.527603 -0.347018 -v 0.274263 1.527603 -0.332569 -v 0.248384 1.527671 -0.312837 -v 0.234341 1.527671 -0.347018 -v 0.266241 1.527603 -0.347018 -v 0.290305 1.527603 -0.332569 -v 0.316185 1.527671 -0.312837 -v 0.294692 1.527671 -0.300325 -v 0.290305 1.527603 -0.332569 -v 0.298327 1.527603 -0.347018 -v 0.316185 1.527671 -0.312837 -v 0.316185 1.527671 -0.312837 -v 0.298327 1.527603 -0.347018 -v 0.330227 1.527671 -0.347018 -v 0.298327 1.527603 -0.347018 -v 0.316185 1.527671 -0.381200 -v 0.330227 1.527671 -0.347018 -v 0.298327 1.527603 -0.347018 -v 0.290305 1.527603 -0.361468 -v 0.316185 1.527671 -0.381200 -v 0.316185 1.527671 -0.381200 -v 0.290305 1.527603 -0.361468 -v 0.282284 1.527671 -0.395359 -v 0.290305 1.527603 -0.361468 -v 0.274263 1.527603 -0.361468 -v 0.282284 1.527671 -0.395359 -v 0.274263 1.527603 -0.361468 -v 0.248383 1.527671 -0.381200 -v 0.282284 1.527671 -0.395359 -v 0.266241 1.527603 -0.347018 -v 0.234341 1.527671 -0.347018 -v 0.248383 1.527671 -0.381200 -v 0.274263 1.527603 -0.361468 -v 0.266241 1.527603 -0.347018 -v 0.248383 1.527671 -0.381200 -v 0.290305 1.527603 -0.332569 -v 0.294692 1.527671 -0.300325 -v 0.274263 1.527603 -0.332569 -v 0.306255 1.553986 -0.388882 -v 0.258312 1.553986 -0.305155 -v 0.269876 1.553986 -0.300325 -v 0.306255 1.553986 -0.388882 -v 0.269876 1.553986 -0.300325 -v 0.294692 1.553986 -0.300325 -v 0.294692 1.553986 -0.300325 -v 0.328593 1.553986 -0.359530 -v 0.306255 1.553986 -0.388882 -v 0.328593 1.553986 -0.359530 -v 0.294692 1.553986 -0.300325 -v 0.323804 1.553986 -0.322848 -v 0.258312 1.553986 -0.305155 -v 0.306255 1.553986 -0.388882 -v 0.269876 1.553986 -0.393712 -v 0.258312 1.553986 -0.305155 -v 0.269876 1.553986 -0.393712 -v 0.235975 1.553986 -0.334507 -v 0.269876 1.553986 -0.393712 -v 0.240764 1.553986 -0.371189 -v 0.235975 1.553986 -0.334507 -v 0.381154 1.440537 -0.332547 -v 0.384937 1.465925 -0.332546 -v 0.397818 1.441383 -0.332546 -v 0.384937 1.465925 -0.332546 -v 0.397818 1.441383 -0.332546 -v 0.389561 1.472869 -0.346997 -v 0.389561 1.472869 -0.346997 -v 0.406150 1.441805 -0.346997 -v 0.384937 1.465925 -0.361447 -v 0.384937 1.465925 -0.361447 -v 0.397818 1.441383 -0.361447 -v 0.375690 1.452037 -0.361447 -v 0.375690 1.452037 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.381154 1.440537 -0.332547 -v 0.375690 1.452036 -0.332547 -v 0.375690 1.452036 -0.332547 -v 0.384937 1.465925 -0.332546 -v 0.384937 1.465925 -0.332546 -v 0.367567 1.472087 -0.332546 -v 0.384937 1.465925 -0.332546 -v 0.389561 1.472869 -0.346997 -v 0.367698 1.480429 -0.346997 -v 0.389561 1.472869 -0.346997 -v 0.367698 1.480429 -0.346997 -v 0.384937 1.465925 -0.361447 -v 0.367567 1.472087 -0.361446 -v 0.384937 1.465925 -0.361447 -v 0.375690 1.452037 -0.361447 -v 0.367567 1.472087 -0.361446 -v 0.375690 1.452036 -0.332547 -v 0.290347 1.472108 -0.332558 -v 0.375690 1.452036 -0.332547 -v 0.367567 1.472087 -0.332546 -v 0.290347 1.472108 -0.332558 -v 0.367567 1.472087 -0.332546 -v 0.298350 1.480443 -0.347008 -v 0.290347 1.472108 -0.332558 -v 0.367567 1.472087 -0.332546 -v 0.367698 1.480429 -0.346997 -v 0.298350 1.480443 -0.347008 -v 0.367698 1.480429 -0.346997 -v 0.290347 1.472108 -0.361457 -v 0.298350 1.480443 -0.347008 -v 0.367698 1.480429 -0.346997 -v 0.367567 1.472087 -0.361446 -v 0.290347 1.472108 -0.361457 -v 0.367567 1.472087 -0.361446 -v 0.290347 1.472108 -0.361457 -v 0.367567 1.472087 -0.361446 -v 0.375690 1.452037 -0.361447 -v 0.274229 1.455423 -0.361447 -v 0.375690 1.452037 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.274229 1.455423 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.375690 1.452036 -0.332547 -v 0.274228 1.455423 -0.332546 -v 0.274228 1.455423 -0.332546 -v 0.290347 1.472108 -0.332558 -v 0.274246 1.472110 -0.332558 -v 0.290347 1.472108 -0.361457 -v 0.274229 1.455423 -0.361447 -v 0.274246 1.472110 -0.361457 -v 0.274229 1.455423 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.371067 1.445092 -0.346997 -v 0.274228 1.455423 -0.332546 -v 0.274228 1.447081 -0.346997 -v 0.274228 1.455423 -0.332546 -v -0.277996 1.472120 -0.332597 -v -0.277888 1.455419 -0.332629 -v 0.274228 1.455423 -0.332546 -v 0.274246 1.472110 -0.332558 -v -0.277996 1.472120 -0.332597 -v 0.274246 1.472110 -0.332558 -v -0.292763 1.480468 -0.346924 -v -0.277996 1.472120 -0.332597 -v 0.274246 1.472110 -0.332558 -v 0.266271 1.480445 -0.347008 -v -0.292763 1.480468 -0.346924 -v 0.266271 1.480445 -0.347008 -v -0.292763 1.480468 -0.346924 -v 0.274246 1.472110 -0.361457 -v -0.292856 1.472118 -0.361446 -v 0.274246 1.472110 -0.361457 -v -0.292856 1.472118 -0.361446 -v 0.274229 1.455423 -0.361447 -v -0.292857 1.455432 -0.361446 -v 0.274229 1.455423 -0.361447 -v -0.292692 1.447077 -0.346968 -v -0.292857 1.455432 -0.361446 -v 0.274229 1.455423 -0.361447 -v 0.274228 1.447081 -0.346997 -v -0.292692 1.447077 -0.346968 -v 0.274228 1.447081 -0.346997 -v -0.277888 1.455419 -0.332629 -v -0.292692 1.447077 -0.346968 -v 0.274228 1.447081 -0.346997 -v 0.274228 1.455423 -0.332546 -v -0.277888 1.455419 -0.332629 -v -0.306964 1.455421 -0.332629 -v -0.572379 1.472141 -0.332597 -v -0.572380 1.455440 -0.332629 -v -0.306964 1.455421 -0.332629 -v -0.307072 1.472122 -0.332597 -v -0.572379 1.472141 -0.332597 -v -0.307072 1.472122 -0.332597 -v -0.586948 1.480496 -0.346925 -v -0.572379 1.472141 -0.332597 -v -0.307072 1.472122 -0.332597 -v -0.292763 1.480468 -0.346924 -v -0.586948 1.480496 -0.346925 -v -0.292763 1.480468 -0.346924 -v -0.292856 1.472118 -0.361446 -v -0.586948 1.480496 -0.346925 -v -0.292857 1.455432 -0.361446 -v -0.292692 1.447077 -0.346968 -v -0.586949 1.447104 -0.346968 -v -0.292692 1.447077 -0.346968 -v -0.572380 1.455440 -0.332629 -v -0.586949 1.447104 -0.346968 -v -0.292692 1.447077 -0.346968 -v -0.306964 1.455421 -0.332629 -v -0.572380 1.455440 -0.332629 -v -0.586948 1.480496 -0.346925 -v -0.292856 1.472118 -0.361446 -v -0.292856 1.472118 -0.361446 -v -0.586936 1.472161 -0.361446 -v -0.292856 1.472118 -0.361446 -v -0.292857 1.455432 -0.361446 -v -0.586937 1.455476 -0.361446 -v -0.292857 1.455432 -0.361446 -v -0.586949 1.447104 -0.346968 -v -0.586937 1.455476 -0.361446 -v -0.601550 1.455442 -0.332629 -v -1.155766 1.472177 -0.332557 -v -0.601550 1.455442 -0.332629 -v -0.601550 1.472143 -0.332597 -v -1.155766 1.472177 -0.332557 -v -0.601550 1.472143 -0.332597 -v -1.147675 1.480534 -0.347007 -v -1.155766 1.472177 -0.332557 -v -0.601550 1.472143 -0.332597 -v -0.586948 1.480496 -0.346925 -v -1.147675 1.480534 -0.347007 -v -0.586948 1.480496 -0.346925 -v -1.155766 1.472177 -0.361457 -v -1.147675 1.480534 -0.347007 -v -0.586948 1.480496 -0.346925 -v -0.586936 1.472161 -0.361446 -v -1.155766 1.472177 -0.361457 -v -0.586936 1.472161 -0.361446 -v -1.155766 1.472177 -0.361457 -v -0.586936 1.472161 -0.361446 -v -0.586937 1.455476 -0.361446 -v -1.155780 1.455486 -0.361446 -v -0.586937 1.455476 -0.361446 -v -1.155780 1.455486 -0.361446 -v -0.586937 1.455476 -0.361446 -v -0.586949 1.447104 -0.346968 -v -1.155780 1.447144 -0.346996 -v -0.586949 1.447104 -0.346968 -v -1.155780 1.455486 -0.332546 -v -1.155780 1.447144 -0.346996 -v -0.586949 1.447104 -0.346968 -v -0.601550 1.455442 -0.332629 -v -1.155780 1.455486 -0.332546 -v -1.155780 1.455486 -0.332546 -v -1.155766 1.472177 -0.332557 -v -1.171787 1.472179 -0.332557 -v -1.155766 1.472177 -0.361457 -v -1.155780 1.455486 -0.361446 -v -1.171787 1.472179 -0.361457 -v -1.155780 1.455486 -0.332546 -v -1.171787 1.472179 -0.332557 -v -1.171787 1.472179 -0.332557 -v -1.171787 1.472179 -0.332557 -v -1.179854 1.480535 -0.347007 -v -1.179854 1.480535 -0.347007 -v -1.179854 1.480535 -0.347007 -v -1.171787 1.472179 -0.361457 -v -1.171787 1.472179 -0.361457 -v -1.236537 1.472195 -0.361446 -v -1.171787 1.472179 -0.361457 -v -1.155780 1.455486 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.155780 1.455486 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.155780 1.455486 -0.361446 -v -1.155780 1.447144 -0.346996 -v -1.248996 1.445791 -0.346996 -v -1.155780 1.447144 -0.346996 -v -1.155780 1.455486 -0.332546 -v -1.248996 1.445791 -0.346996 -v -1.155780 1.455486 -0.332546 -v -1.155780 1.455486 -0.332546 -v -1.236537 1.472195 -0.332546 -v -1.264335 1.465568 -0.332546 -v -1.236537 1.472195 -0.332546 -v -1.264335 1.465568 -0.332546 -v -1.236537 1.472195 -0.332546 -v -1.236636 1.480537 -0.346996 -v -1.269448 1.472160 -0.346996 -v -1.236636 1.480537 -0.346996 -v -1.269448 1.472160 -0.346996 -v -1.236636 1.480537 -0.346996 -v -1.236537 1.472195 -0.361446 -v -1.264336 1.465568 -0.361446 -v -1.236537 1.472195 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.264336 1.465568 -0.361446 -v -1.248996 1.445791 -0.346996 -v -1.155780 1.455486 -0.332546 -v -1.254110 1.452384 -0.332546 -v -1.254110 1.452384 -0.332546 -v -1.254110 1.452384 -0.332546 -v -1.264335 1.465568 -0.332546 -v -1.281743 1.444267 -0.332546 -v -1.264335 1.465568 -0.332546 -v -1.281743 1.444267 -0.332546 -v -1.264335 1.465568 -0.332546 -v -1.269448 1.472160 -0.346996 -v -1.289974 1.445631 -0.346996 -v -1.269448 1.472160 -0.346996 -v -1.289974 1.445631 -0.346996 -v -1.269448 1.472160 -0.346996 -v -1.264336 1.465568 -0.361446 -v -1.281743 1.444267 -0.361446 -v -1.264336 1.465568 -0.361446 -v -1.281743 1.444267 -0.361446 -v -1.264336 1.465568 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.265282 1.441541 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.265282 1.441541 -0.361446 -v -1.254110 1.452384 -0.361446 -v -1.248996 1.445791 -0.346996 -v -1.257051 1.440177 -0.346996 -v -1.248996 1.445791 -0.346996 -v -1.265282 1.441541 -0.332546 -v -1.257051 1.440177 -0.346996 -v -1.248996 1.445791 -0.346996 -v -1.254110 1.452384 -0.332546 -v -1.265282 1.441541 -0.332546 -v -1.289974 1.445631 -0.346996 -v -1.281743 1.444267 -0.361446 -v -1.281743 1.444267 -0.361446 -v -1.289994 1.397097 -0.346996 -v -1.281659 1.397097 -0.361446 -v -1.281743 1.444267 -0.361446 -v -1.264987 1.397097 -0.361446 -v -1.281743 1.444267 -0.361446 -v -1.265282 1.441541 -0.361446 -v -1.264987 1.397097 -0.361446 -v -1.265282 1.441541 -0.361446 -v -1.257051 1.440177 -0.346996 -v 0.381154 1.440538 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.381154 1.440538 -0.361447 -v 0.397818 1.441383 -0.361447 -v 0.371067 1.445092 -0.346997 -v 0.380231 1.397095 -0.361446 -v 0.371067 1.445092 -0.346997 -v 0.371888 1.397095 -0.346997 -v 0.381154 1.440537 -0.332547 -v 0.381154 1.440537 -0.332547 -v 0.371888 1.397095 -0.346997 -v 0.397818 1.441383 -0.361447 -v 0.380231 1.397095 -0.361446 -v 0.397818 1.441383 -0.361447 -v 0.406150 1.441805 -0.346997 -v 0.406150 1.441805 -0.346997 -v 0.397818 1.441383 -0.332546 -v 0.405259 1.397095 -0.346997 -v 0.396917 1.397095 -0.361447 -v 0.406150 1.441805 -0.346997 -v 0.397818 1.441383 -0.332546 -v 0.405259 1.397095 -0.346997 -v 0.397818 1.441383 -0.332546 -v 0.381154 1.440537 -0.332547 -v 0.380231 1.397095 -0.332546 -v 0.381154 1.440537 -0.332547 -v 0.387445 1.397095 -0.332546 -v 0.381154 1.440537 -0.332547 -v 0.387456 1.397095 -0.332547 -v 0.396917 1.397095 -0.332547 -v 0.381154 1.440537 -0.332547 -v -1.265282 1.441541 -0.332546 -v -1.257051 1.440177 -0.346996 -v -1.265282 1.441541 -0.332546 -v -1.281743 1.444267 -0.332546 -v -1.281743 1.444267 -0.332546 -v -1.264987 1.397097 -0.332546 -v -1.281743 1.444267 -0.332546 -v -1.289974 1.445631 -0.346996 -v -1.289974 1.445631 -0.346996 -v -1.289994 1.397097 -0.346996 -v -1.281659 1.397097 -0.332546 -v -1.264987 1.397097 -0.361446 -v -1.257051 1.440177 -0.346996 -v -1.264987 1.397097 -0.332546 -v -1.256652 1.397097 -0.346996 -v -1.257051 1.440177 -0.346996 -v -0.307056 0.094251 0.071849 -v -0.292578 0.094251 0.065413 -v -0.307056 0.094251 0.071849 -v -0.292075 0.095761 0.910208 -v -0.307056 0.094251 0.071849 -v -0.307192 0.100167 0.910132 -v -0.307056 0.115094 0.084720 -v -0.307056 0.115094 0.084720 -v -0.307192 0.100167 0.910132 -v -0.307056 0.115094 0.084720 -v -0.307054 0.110567 0.910064 -v -0.292578 0.120427 0.091155 -v -0.292578 0.120427 0.091155 -v -0.307054 0.110567 0.910064 -v -0.292578 0.120427 0.091155 -v -0.292067 0.118629 0.910036 -v -0.278101 0.115094 0.084720 -v -0.278101 0.115094 0.084720 -v -0.292067 0.118629 0.910036 -v -0.278101 0.115094 0.084720 -v -0.278101 0.110565 0.910073 -v -0.278101 0.094251 0.071849 -v -0.278101 0.094251 0.071849 -v -0.278101 0.110565 0.910073 -v -0.278101 0.094251 0.071849 -v -0.278263 0.100553 0.910141 -v -0.292578 0.094251 0.065413 -v -0.278263 0.100553 0.910141 -v -0.292075 0.095761 0.910208 -v -0.292578 0.094251 0.065413 -v -0.601498 0.093258 0.092887 -v -0.587020 0.084905 0.092576 -v -0.601498 0.093258 0.092887 -v -0.587005 0.096190 0.910078 -v -0.601498 0.093258 0.092887 -v -0.601497 0.093851 0.910043 -v -0.601498 0.115094 0.084720 -v -0.601498 0.115094 0.084720 -v -0.601497 0.093851 0.910043 -v -0.572543 0.093257 0.092886 -v -0.587020 0.084905 0.092576 -v -0.572545 0.093849 0.910052 -v -0.587005 0.096190 0.910078 -v -0.587020 0.084905 0.092576 -v -0.601498 0.115094 0.084720 -v -0.601496 0.110514 0.910021 -v -0.587020 0.120428 0.091155 -v -0.587020 0.120428 0.091155 -v -0.601496 0.110514 0.910021 -v -0.587020 0.120428 0.091155 -v -0.587019 0.118924 0.910021 -v -0.572543 0.115094 0.084720 -v -0.587019 0.118924 0.910021 -v -0.572543 0.115094 0.084720 -v -0.572543 0.115094 0.084720 -v -0.572544 0.110565 0.910021 -v -0.572543 0.093257 0.092886 -v -0.572543 0.093257 0.092886 -v -0.572544 0.110565 0.910021 -v -0.572545 0.093849 0.910052 -v -1.497860 0.668499 0.477396 -v -1.497900 0.669545 0.252358 -v -1.497860 0.668499 0.477396 -v -1.497900 0.692191 0.252964 -v -1.497860 0.685681 0.477396 -v -1.497900 0.692191 0.252964 -v -1.482926 0.698154 0.257693 -v -1.482979 0.694272 0.477396 -v -1.482926 0.698154 0.257693 -v -1.482979 0.694272 0.477396 -v -1.467952 0.694141 0.249813 -v -1.467952 0.694141 0.249813 -v -1.482979 0.659907 0.477396 -v -1.497900 0.669545 0.252358 -v -1.467952 0.694141 0.249813 -v -1.468099 0.668499 0.477396 -v -1.468099 0.668499 0.477396 -v -1.482926 0.661201 0.250097 -v -1.467952 0.669545 0.252358 -v -1.468099 0.668499 0.477396 -v -1.482979 0.659907 0.477396 -v -1.482926 0.661201 0.250097 -v -1.482926 0.661201 0.250097 -v -1.482926 0.661201 0.250097 -v -1.497900 0.669545 0.252358 -v -1.497900 0.686715 0.234200 -v -1.497900 0.669545 0.252358 -v -1.497900 0.692191 0.252964 -v -1.497900 0.686715 0.234200 -v -1.467952 0.694141 0.249813 -v -1.467952 0.669545 0.252358 -v -1.467952 0.669545 0.252358 -v -1.482926 0.683001 0.226393 -v -1.467952 0.686714 0.234200 -v -1.467952 0.669545 0.252358 -v -1.482926 0.661201 0.250097 -v -1.482926 0.683001 0.226393 -v -1.482926 0.683001 0.226393 -v -1.482926 0.683001 0.226393 -v -1.497900 0.686715 0.234200 -v -1.497899 1.450291 0.228780 -v -1.497900 0.686715 0.234200 -v -1.497899 1.450291 0.228780 -v -1.497900 0.686715 0.234200 -v -1.497900 0.692191 0.252964 -v -1.497899 1.462561 0.240963 -v -1.497900 0.692191 0.252964 -v -1.497899 1.462561 0.240963 -v -1.497900 0.692191 0.252964 -v -1.482926 0.698154 0.257693 -v -1.482925 1.468695 0.247054 -v -1.482926 0.698154 0.257693 -v -1.482925 1.468695 0.247054 -v -1.482926 0.698154 0.257693 -v -1.467952 0.694141 0.249813 -v -1.467951 1.462561 0.240963 -v -1.467952 0.694141 0.249813 -v -1.467951 1.462561 0.240963 -v -1.467952 0.694141 0.249813 -v -1.467952 0.686714 0.234200 -v -1.467951 1.447184 0.227851 -v -1.467952 0.686714 0.234200 -v -1.482925 1.444157 0.222690 -v -1.467951 1.447184 0.227851 -v -1.467952 0.686714 0.234200 -v -1.482926 0.683001 0.226393 -v -1.482925 1.444157 0.222690 -v -1.482925 1.444157 0.222690 -v -1.482925 1.444157 0.222690 -v -1.497899 1.450291 0.228780 -v -1.497899 1.449471 -0.332978 -v -1.497899 1.450291 0.228780 -v -1.497899 1.449471 -0.332978 -v -1.497899 1.450291 0.228780 -v -1.497899 1.462561 0.240963 -v -1.497899 1.472101 -0.320973 -v -1.497899 1.462561 0.240963 -v -1.497899 1.472101 -0.320973 -v -1.497899 1.462561 0.240963 -v -1.482925 1.468695 0.247054 -v -1.482924 1.480746 -0.321005 -v -1.482925 1.468695 0.247054 -v -1.482924 1.480746 -0.321005 -v -1.482925 1.468695 0.247054 -v -1.467951 1.462561 0.240963 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.462561 0.240963 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.462561 0.240963 -v -1.467951 1.447184 0.227851 -v -1.467951 1.454811 -0.320908 -v -1.467951 1.447184 0.227851 -v -1.482925 1.443342 -0.326881 -v -1.467951 1.454811 -0.320908 -v -1.467951 1.447184 0.227851 -v -1.482925 1.444157 0.222690 -v -1.482925 1.443342 -0.326881 -v -1.497899 1.472101 -0.320973 -v -1.482924 1.480746 -0.321005 -v -1.482924 1.480746 -0.321005 -v -1.467951 1.472101 -0.320973 -v -1.497899 1.449471 -0.332978 -v -1.497899 1.472101 -0.320973 -v -1.497899 1.472101 -0.320973 -v -1.482925 1.467860 -0.351266 -v -1.482925 1.467860 -0.351266 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.472101 -0.320973 -v -1.467951 1.454811 -0.320908 -v -1.467952 1.444925 -0.336195 -v -1.467951 1.454811 -0.320908 -v -1.482925 1.443342 -0.326881 -v -1.467952 1.444925 -0.336195 -v -1.497899 1.449471 -0.332978 -v -1.497899 1.461730 -0.345170 -v -1.497899 1.461730 -0.345170 -v -1.482925 1.467860 -0.351266 -v -1.482925 1.467860 -0.351266 -v -1.467952 1.461730 -0.345170 -v -1.467952 1.461730 -0.345170 -v -1.467952 1.444925 -0.336195 -v -1.497900 1.440084 -0.355280 -v -1.482925 1.467860 -0.351266 -v -1.482925 1.467860 -0.351266 -v -1.467952 1.440084 -0.355281 -v -1.497899 1.449471 -0.332978 -v -1.497900 1.440084 -0.355280 -v -1.497900 1.440084 -0.355280 -v -1.497899 1.397098 -0.355443 -v -1.482990 1.397098 -0.364135 -v -1.497900 1.440084 -0.355280 -v -1.482925 1.440333 -0.363922 -v -1.482925 1.440333 -0.363922 -v -1.467952 1.440084 -0.355281 -v -1.482925 1.440333 -0.363922 -v -1.467999 1.397098 -0.355555 -v -1.482990 1.397098 -0.364135 -v -1.467952 1.444925 -0.336195 -v -1.482925 1.443342 -0.326881 -v -1.482925 1.443342 -0.326881 -v -1.482925 1.397098 -0.329592 -v -1.497819 1.397098 -0.338191 -v -1.482925 1.443342 -0.326881 -v -1.497899 1.449471 -0.332978 -v -1.497899 1.397098 -0.355443 -v -1.497819 1.397098 -0.338191 -v -1.497899 1.449471 -0.332978 -v -1.467952 1.440084 -0.355281 -v -1.467952 1.444925 -0.336195 -v -1.467999 1.397098 -0.355555 -v -1.467952 1.440084 -0.355281 -v -1.482925 1.397098 -0.329592 -v -1.467952 1.397098 -0.338237 -v -1.467952 1.444925 -0.336195 -v 0.585263 0.668496 0.477378 -v 0.585223 0.669543 0.252340 -v 0.585263 0.668496 0.477378 -v 0.585223 0.692189 0.252946 -v 0.585263 0.685679 0.477378 -v 0.585223 0.692189 0.252946 -v 0.600197 0.698152 0.257674 -v 0.600144 0.694270 0.477378 -v 0.600197 0.698152 0.257674 -v 0.600144 0.694270 0.477378 -v 0.615171 0.694139 0.249795 -v 0.615171 0.694139 0.249795 -v 0.600144 0.659905 0.477378 -v 0.585223 0.669543 0.252340 -v 0.615171 0.694139 0.249795 -v 0.615024 0.668496 0.477378 -v 0.615024 0.668496 0.477378 -v 0.600197 0.661199 0.250078 -v 0.615171 0.669543 0.252340 -v 0.615024 0.668496 0.477378 -v 0.600144 0.659905 0.477378 -v 0.600197 0.661199 0.250078 -v 0.600197 0.661199 0.250078 -v 0.600197 0.661199 0.250078 -v 0.585223 0.669543 0.252340 -v 0.585223 0.686712 0.234181 -v 0.585223 0.669543 0.252340 -v 0.585223 0.692189 0.252946 -v 0.585223 0.686712 0.234181 -v 0.615171 0.694139 0.249795 -v 0.615171 0.669543 0.252340 -v 0.615171 0.669543 0.252340 -v 0.600197 0.682999 0.226374 -v 0.615171 0.686712 0.234181 -v 0.615171 0.669543 0.252340 -v 0.600197 0.661199 0.250078 -v 0.600197 0.682999 0.226374 -v 0.600197 0.682999 0.226374 -v 0.600197 0.682999 0.226374 -v 0.585223 0.686712 0.234181 -v 0.585224 1.450289 0.228762 -v 0.585223 0.686712 0.234181 -v 0.585224 1.450289 0.228762 -v 0.585223 0.686712 0.234181 -v 0.585223 0.692189 0.252946 -v 0.585224 1.462559 0.240944 -v 0.585223 0.692189 0.252946 -v 0.585224 1.462559 0.240944 -v 0.585223 0.692189 0.252946 -v 0.600197 0.698152 0.257674 -v 0.600198 1.468693 0.247036 -v 0.600197 0.698152 0.257674 -v 0.600198 1.468693 0.247036 -v 0.600197 0.698152 0.257674 -v 0.615171 0.694139 0.249795 -v 0.615172 1.462559 0.240944 -v 0.615171 0.694139 0.249795 -v 0.615172 1.462559 0.240944 -v 0.615171 0.694139 0.249795 -v 0.615171 0.686712 0.234181 -v 0.615172 1.447181 0.227832 -v 0.615171 0.686712 0.234181 -v 0.600198 1.444155 0.222671 -v 0.615172 1.447181 0.227832 -v 0.615171 0.686712 0.234181 -v 0.600197 0.682999 0.226374 -v 0.600198 1.444155 0.222671 -v 0.600198 1.444155 0.222671 -v 0.600198 1.444155 0.222671 -v 0.585224 1.450289 0.228762 -v 0.585224 1.449469 -0.332997 -v 0.585224 1.450289 0.228762 -v 0.585224 1.449469 -0.332997 -v 0.585224 1.450289 0.228762 -v 0.585224 1.462559 0.240944 -v 0.585224 1.472099 -0.320992 -v 0.585224 1.462559 0.240944 -v 0.585224 1.472099 -0.320992 -v 0.585224 1.462559 0.240944 -v 0.600198 1.468693 0.247036 -v 0.600198 1.480744 -0.321024 -v 0.600198 1.468693 0.247036 -v 0.600198 1.480744 -0.321024 -v 0.600198 1.468693 0.247036 -v 0.615172 1.462559 0.240944 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.462559 0.240944 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.462559 0.240944 -v 0.615172 1.447181 0.227832 -v 0.615172 1.454809 -0.320927 -v 0.615172 1.447181 0.227832 -v 0.600198 1.443340 -0.326900 -v 0.615172 1.454809 -0.320927 -v 0.615172 1.447181 0.227832 -v 0.600198 1.444155 0.222671 -v 0.600198 1.443340 -0.326900 -v 0.585224 1.472099 -0.320992 -v 0.600198 1.480744 -0.321024 -v 0.600198 1.480744 -0.321024 -v 0.615172 1.472099 -0.320992 -v 0.585224 1.449469 -0.332997 -v 0.585224 1.472099 -0.320992 -v 0.585224 1.472099 -0.320992 -v 0.600197 1.467858 -0.351285 -v 0.600197 1.467858 -0.351285 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.472099 -0.320992 -v 0.615172 1.454809 -0.320927 -v 0.615171 1.444923 -0.336214 -v 0.615172 1.454809 -0.320927 -v 0.600198 1.443340 -0.326900 -v 0.615171 1.444923 -0.336214 -v 0.585224 1.449469 -0.332997 -v 0.585224 1.461728 -0.345189 -v 0.585224 1.461728 -0.345189 -v 0.600197 1.467858 -0.351285 -v 0.600197 1.467858 -0.351285 -v 0.615171 1.461728 -0.345189 -v 0.615171 1.461728 -0.345189 -v 0.615171 1.444923 -0.336214 -v 0.585223 1.440082 -0.355299 -v 0.600197 1.467858 -0.351285 -v 0.600197 1.467858 -0.351285 -v 0.615171 1.440082 -0.355299 -v 0.585224 1.449469 -0.332997 -v 0.585223 1.440082 -0.355299 -v 0.585223 1.440082 -0.355299 -v 0.585224 1.397096 -0.355461 -v 0.600133 1.397096 -0.364154 -v 0.585223 1.440082 -0.355299 -v 0.600197 1.440331 -0.363941 -v 0.600197 1.440331 -0.363941 -v 0.615171 1.440082 -0.355299 -v 0.600197 1.440331 -0.363941 -v 0.615123 1.397096 -0.355573 -v 0.600133 1.397096 -0.364154 -v 0.615171 1.444923 -0.336214 -v 0.600198 1.443340 -0.326900 -v 0.600198 1.443340 -0.326900 -v 0.600197 1.397096 -0.329611 -v 0.585303 1.397096 -0.338210 -v 0.600198 1.443340 -0.326900 -v 0.585224 1.449469 -0.332997 -v 0.585224 1.397096 -0.355461 -v 0.585303 1.397096 -0.338210 -v 0.585224 1.449469 -0.332997 -v 0.615171 1.440082 -0.355299 -v 0.615171 1.444923 -0.336214 -v 0.615123 1.397096 -0.355573 -v 0.615171 1.440082 -0.355299 -v 0.600197 1.397096 -0.329611 -v 0.615171 1.397096 -0.338256 -v 0.615171 1.444923 -0.336214 -v -0.466116 0.106945 2.347295 -v -0.466116 0.127242 2.357770 -v -0.466116 0.106945 2.347295 -v -0.449682 0.127267 2.367258 -v -0.449682 0.094779 2.341581 -v -0.449682 0.127267 2.367258 -v -0.449682 0.094779 2.341581 -v -0.433248 0.127242 2.357770 -v -0.433248 0.100781 2.326608 -v -0.433248 0.127242 2.357770 -v -0.449682 0.124829 2.328056 -v -0.466116 0.123353 2.338130 -v -0.466115 0.661664 2.338843 -v -0.466116 0.123353 2.338130 -v -0.466115 0.661664 2.338843 -v -0.466116 0.123353 2.338130 -v -0.466116 0.127242 2.357770 -v -0.466115 0.664713 2.358441 -v -0.466116 0.127242 2.357770 -v -0.466115 0.664713 2.358441 -v -0.466116 0.127242 2.357770 -v -0.449682 0.127267 2.367258 -v -0.449681 0.662700 2.367486 -v -0.449682 0.127267 2.367258 -v -0.449681 0.662700 2.367486 -v -0.449682 0.127267 2.367258 -v -0.433248 0.127242 2.357770 -v -0.433248 0.661620 2.357819 -v -0.433248 0.127242 2.357770 -v -0.433248 0.661620 2.357819 -v -0.433248 0.127242 2.357770 -v -0.433248 0.123353 2.338130 -v -0.433248 0.661664 2.338843 -v -0.433248 0.123353 2.338130 -v -0.449681 0.661686 2.329355 -v -0.433248 0.661664 2.338843 -v -0.433248 0.123353 2.338130 -v -0.449682 0.124829 2.328056 -v -0.449681 0.661686 2.329355 -v -0.449681 0.662700 2.367486 -v -0.433248 0.661620 2.357819 -v -0.433248 0.661620 2.357819 -v -0.433248 0.661664 2.338843 -v -0.433248 0.671832 2.362039 -v -0.449681 0.661686 2.329355 -v -0.449681 0.661686 2.329355 -v -0.466115 0.661664 2.338843 -v -0.466114 0.693041 2.361220 -v -0.466115 0.661664 2.338843 -v -0.466115 0.664713 2.358441 -v -0.466114 0.693041 2.361220 -v -0.433248 0.671832 2.362039 -v -0.433248 0.661664 2.338843 -v -0.433248 0.661664 2.338843 -v -0.449681 0.702079 2.358333 -v -0.433248 0.693041 2.361220 -v -0.433248 0.661664 2.338843 -v -0.449681 0.661686 2.329355 -v -0.449681 0.702079 2.358333 -v -0.466114 0.693041 2.361220 -v -0.466115 0.664713 2.358441 -v -0.466115 0.664713 2.358441 -v -0.449681 0.662700 2.367486 -v -0.466116 0.123353 2.338130 -v -0.449682 0.124829 2.328056 -v -0.466116 0.123353 2.338130 -v -0.449682 0.124019 2.112728 -v -0.466116 0.123353 2.338130 -v -0.466115 0.114532 2.112725 -v -0.466116 0.106945 2.347295 -v -0.466116 0.106945 2.347295 -v -0.466115 0.114532 2.112725 -v -0.466116 0.106945 2.347295 -v -0.466112 0.095554 2.112725 -v -0.449682 0.094779 2.341581 -v -0.449682 0.094779 2.341581 -v -0.466112 0.095554 2.112725 -v -0.449682 0.094779 2.341581 -v -0.449663 0.096334 2.112726 -v -0.433248 0.100781 2.326608 -v -0.449663 0.096334 2.112726 -v -0.433248 0.100781 2.326608 -v -0.433248 0.100781 2.326608 -v -0.433248 0.095564 2.112732 -v -0.433248 0.123353 2.338130 -v -0.433248 0.123353 2.338130 -v -0.449682 0.124829 2.328056 -v -0.449682 0.124019 2.112728 -v -0.449682 0.124829 2.328056 -v -0.449675 0.124016 2.112728 -v -0.449682 0.124829 2.328056 -v -0.433248 0.114532 2.112733 -v -0.433248 0.123353 2.338130 -v -0.433248 0.095564 2.112732 -v -0.449681 0.662700 2.367486 -v -0.433248 0.671832 2.362039 -v -0.433248 0.671832 2.362039 -v -0.433317 0.676592 2.698729 -v -0.433273 0.695542 2.698728 -v -0.433248 0.671832 2.362039 -v -0.433248 0.693041 2.361220 -v -0.466114 0.675520 2.372075 -v -0.449681 0.662700 2.367486 -v -0.449681 0.662700 2.367486 -v -0.433317 0.676592 2.698729 -v -0.449681 0.702079 2.358333 -v -0.465995 0.695641 2.699864 -v -0.449681 0.702079 2.358333 -v -0.466114 0.693041 2.361220 -v -0.466114 0.693041 2.361220 -v -0.466089 0.676719 2.699867 -v -0.466114 0.693041 2.361220 -v -0.466114 0.675520 2.372075 -v -0.466089 0.676719 2.699867 -v -0.466114 0.675520 2.372075 -v -0.449769 0.667176 2.699296 -v -0.449681 0.702079 2.358333 -v -0.449592 0.705025 2.699290 -v -0.433248 0.693041 2.361220 -v -0.433248 0.693041 2.361220 -v -0.449592 0.705025 2.699290 -v -0.433273 0.695542 2.698728 -v -0.443805 3.209780 3.449959 -v -0.443805 3.183812 3.439444 -v -0.443805 3.209780 3.449959 -v -0.443805 3.209780 3.449959 -v -0.443805 3.209780 3.449959 -v -0.458152 3.203918 3.455812 -v -0.458152 3.203918 3.455812 -v -0.458152 3.192196 3.467518 -v -0.458152 3.211245 3.475512 -v -0.429459 3.192196 3.467518 -v -0.429459 3.203918 3.455812 -v -0.429459 3.203918 3.455812 -v -0.443805 3.219528 3.475507 -v -0.429459 3.203918 3.455812 -v -0.443805 3.209780 3.449959 -v -0.443805 3.219528 3.475507 -v -0.458152 3.211245 3.475512 -v -0.458152 3.211244 4.092529 -v -0.458152 3.211245 3.475512 -v -0.458152 3.192196 3.467518 -v -0.458152 3.192196 3.467518 -v -0.458152 3.192196 3.467518 -v -0.429459 3.192196 3.467518 -v -0.429459 3.192196 3.467518 -v -0.429459 3.192196 3.467518 -v -0.429459 3.211245 3.475512 -v -0.429459 3.211245 3.475512 -v -0.443805 3.219527 4.092540 -v -0.429459 3.211245 3.475512 -v -0.443805 3.219528 3.475507 -v -0.443805 3.219527 4.092540 -v -0.443805 3.219527 4.092540 -v -0.443805 3.219527 4.092540 -v -0.458152 3.211244 4.092529 -v -0.458152 3.211244 4.092529 -v -0.458152 3.188301 4.102205 -v -0.429458 3.188301 4.102205 -v -0.429458 3.211244 4.092529 -v -0.429458 3.211244 4.092529 -v -0.443805 3.209200 4.117404 -v -0.429458 3.203329 4.111561 -v -0.429458 3.211244 4.092529 -v -0.443805 3.219527 4.092540 -v -0.443805 3.209200 4.117404 -v -0.443805 3.209200 4.117404 -v -0.443805 3.209200 4.117404 -v -0.458152 3.203329 4.111561 -v -0.458152 3.203329 4.111561 -v -0.458152 3.188301 4.102205 -v -0.429458 3.188301 4.102205 -v -0.429458 3.203329 4.111561 -v -0.429458 3.203329 4.111561 -v -0.443805 3.184472 4.128129 -v -0.429458 3.203329 4.111561 -v -0.443805 3.209200 4.117404 -v -0.443805 3.184472 4.128129 -v -0.443805 3.184472 4.128129 -v -0.443805 3.184472 4.128129 -v -0.458152 3.184475 4.119846 -v -0.458152 3.184475 4.119846 -v -0.458152 3.184475 4.119846 -v -0.458152 3.188301 4.102205 -v -0.458152 3.188301 4.102205 -v -0.458152 3.188301 4.102205 -v -0.443805 3.186088 4.093656 -v -0.443805 3.186088 4.093656 -v -0.443809 0.094247 4.092418 -v -0.443805 3.186088 4.093656 -v -0.429458 3.188301 4.102205 -v -0.429458 3.188301 4.102205 -v -0.429458 3.188301 4.102205 -v -0.429458 3.184475 4.119846 -v -0.429458 3.184475 4.119846 -v -0.443809 0.094247 4.125552 -v -0.429458 3.184475 4.119846 -v -0.443805 3.184472 4.128129 -v -0.443809 0.094247 4.125552 -v -0.458152 3.183558 3.447723 -v -0.443805 3.183812 3.439444 -v -0.443805 3.183812 3.439444 -v -0.443807 3.148010 3.439536 -v -0.458152 3.183558 3.447723 -v -0.443807 3.148010 3.439536 -v -0.458152 3.183558 3.447723 -v -0.458152 3.148010 3.447819 -v -0.458152 3.192196 3.467518 -v -0.458152 3.192196 3.467518 -v -0.458152 3.148010 3.447819 -v -0.458152 3.192196 3.467518 -v -0.458152 3.148010 3.464385 -v -0.443805 3.186335 3.473371 -v -0.443805 3.186335 3.473371 -v -0.458152 3.148010 3.464385 -v -0.443805 3.186335 3.473371 -v -0.458152 3.148010 3.464385 -v -0.443805 3.186335 3.473371 -v -0.443805 3.148010 3.472668 -v -0.429459 3.192196 3.467518 -v -0.458151 3.148010 3.464386 -v -0.458152 3.148010 3.464385 -v -0.443805 3.186335 3.473371 -v -0.429459 3.192196 3.467518 -v -0.443805 3.148010 3.472668 -v -0.429459 3.192196 3.467518 -v -0.443804 3.148010 3.472667 -v -0.429459 3.192196 3.467518 -v -0.429459 3.148010 3.464385 -v -0.429459 3.183558 3.447723 -v -0.429459 3.183558 3.447723 -v -0.429459 3.148010 3.464385 -v -0.429459 3.183558 3.447723 -v -0.429459 3.148010 3.447819 -v -0.443805 3.183812 3.439444 -v -0.443805 3.183812 3.439444 -v -0.429459 3.148010 3.447819 -v -0.443805 3.148010 3.439536 -v -0.443805 3.183812 3.439444 -vt 0.553158 0.969055 -vt 0.556971 0.967589 -vt 0.553158 0.968707 -vt 0.556971 0.967937 -vt 0.556971 0.965353 -vt 0.549345 0.965700 -vt 0.549345 0.967937 -vt 0.549345 0.967589 -vt 0.553158 0.876089 -vt 0.556971 0.877194 -vt 0.553158 0.876076 -vt 0.554034 0.876346 -vt 0.556971 0.877207 -vt 0.556971 0.879430 -vt 0.556971 0.878253 -vt 0.556971 0.879444 -vt 0.553158 0.880547 -vt 0.556970 0.879444 -vt 0.556614 0.879548 -vt 0.553158 0.880562 -vt 0.556374 0.879619 -vt 0.549345 0.879430 -vt 0.552650 0.880413 -vt 0.550724 0.879848 -vt 0.550150 0.879680 -vt 0.549345 0.879444 -vt 0.549345 0.877194 -vt 0.549346 0.877207 -vt 0.550904 0.876750 -vt 0.512968 0.424220 -vt 0.516816 0.421421 -vt 0.512968 0.420552 -vt 0.516816 0.424262 -vt 0.516816 0.423159 -vt 0.516816 0.424346 -vt 0.512968 0.424388 -vt 0.509121 0.424346 -vt 0.509121 0.423159 -vt 0.509121 0.421421 -vt 0.509121 0.424262 -vt 0.516816 0.420522 -vt 0.512968 0.419393 -vt 0.516816 0.422778 -vt 0.512968 0.423907 -vt 0.512968 0.424028 -vt 0.509121 0.422778 -vt 0.509121 0.420522 -vt 0.512968 0.424272 -vt 0.516816 0.423143 -vt 0.509121 0.423143 -vt 0.509121 0.420887 -vt 0.512968 0.422912 -vt 0.516816 0.422126 -vt 0.509121 0.422126 -vt 0.509121 0.420553 -vt 0.512968 0.419767 -vt 0.512968 0.419758 -vt 0.516816 0.419580 -vt 0.512968 0.419569 -vt 0.516816 0.420553 -vt 0.516816 0.419601 -vt 0.512968 0.419612 -vt 0.509121 0.419601 -vt 0.509121 0.419580 -vt 0.516792 0.366813 -vt 0.512999 0.364877 -vt 0.516820 0.366817 -vt 0.509065 0.366813 -vt 0.591216 0.424220 -vt 0.595064 0.421421 -vt 0.591216 0.420552 -vt 0.595064 0.424262 -vt 0.595064 0.423159 -vt 0.595064 0.424346 -vt 0.591216 0.424388 -vt 0.587369 0.424346 -vt 0.587369 0.423159 -vt 0.587369 0.421421 -vt 0.587369 0.424262 -vt 0.595064 0.420522 -vt 0.591216 0.419393 -vt 0.595064 0.422778 -vt 0.591216 0.423907 -vt 0.591216 0.424028 -vt 0.587369 0.422778 -vt 0.587369 0.420522 -vt 0.595064 0.420887 -vt 0.591216 0.419758 -vt 0.595064 0.423143 -vt 0.591216 0.424272 -vt 0.587369 0.423143 -vt 0.587369 0.420887 -vt 0.595064 0.420553 -vt 0.591216 0.419767 -vt 0.595064 0.422126 -vt 0.591216 0.422912 -vt 0.587369 0.422126 -vt 0.587369 0.420553 -vt 0.595064 0.419580 -vt 0.591216 0.419569 -vt 0.595064 0.419601 -vt 0.591216 0.419612 -vt 0.587369 0.419601 -vt 0.587369 0.419580 -vt 0.595078 0.366813 -vt 0.591198 0.364877 -vt 0.595078 0.366817 -vt 0.591197 0.364883 -vt 0.587326 0.366817 -vt 0.587326 0.366813 -vt 0.740210 0.364872 -vt 0.742357 0.362920 -vt 0.740226 0.364870 -vt 0.742361 0.362921 -vt 0.746621 0.362919 -vt 0.746618 0.362921 -vt 0.748752 0.364870 -vt 0.748762 0.364872 -vt 0.746621 0.366821 -vt 0.746618 0.366823 -vt 0.742357 0.366821 -vt 0.742361 0.366823 -vt 0.744489 0.371397 -vt 0.741192 0.371174 -vt 0.738119 0.370522 -vt 0.735480 0.369485 -vt 0.733455 0.368133 -vt 0.732182 0.366559 -vt 0.731748 0.364870 -vt 0.732182 0.363181 -vt 0.733455 0.361607 -vt 0.735480 0.360255 -vt 0.738119 0.359218 -vt 0.741192 0.358566 -vt 0.744489 0.358344 -vt 0.747787 0.358566 -vt 0.750859 0.359218 -vt 0.753498 0.360255 -vt 0.755523 0.361607 -vt 0.756796 0.363181 -vt 0.757230 0.364870 -vt 0.756796 0.366559 -vt 0.755523 0.368133 -vt 0.753498 0.369485 -vt 0.750859 0.370522 -vt 0.747787 0.371174 -vt 0.355930 0.364872 -vt 0.358068 0.362920 -vt 0.355936 0.364870 -vt 0.358056 0.362921 -vt 0.362331 0.362919 -vt 0.362335 0.362921 -vt 0.364463 0.364870 -vt 0.364455 0.364872 -vt 0.362331 0.366821 -vt 0.362335 0.366823 -vt 0.358068 0.366821 -vt 0.358056 0.366823 -vt 0.360199 0.371397 -vt 0.356902 0.371174 -vt 0.353829 0.370522 -vt 0.351190 0.369485 -vt 0.349165 0.368133 -vt 0.347893 0.366559 -vt 0.347459 0.364870 -vt 0.347893 0.363181 -vt 0.349165 0.361607 -vt 0.351190 0.360255 -vt 0.353829 0.359218 -vt 0.356902 0.358566 -vt 0.360199 0.358344 -vt 0.363497 0.358566 -vt 0.366570 0.359218 -vt 0.369208 0.360255 -vt 0.371233 0.361607 -vt 0.372506 0.363181 -vt 0.372940 0.364870 -vt 0.372506 0.366559 -vt 0.371233 0.368133 -vt 0.369208 0.369485 -vt 0.366570 0.370522 -vt 0.363497 0.371174 -vt 0.327282 0.364873 -vt 0.329496 0.362922 -vt 0.332919 0.362922 -vt 0.335377 0.362922 -vt 0.333925 0.362922 -vt 0.336605 0.364873 -vt 0.336139 0.364873 -vt 0.335377 0.366824 -vt 0.333925 0.366824 -vt 0.337535 0.366824 -vt 0.337605 0.366824 -vt 0.332919 0.366824 -vt 0.337501 0.364873 -vt 0.331690 0.364873 -vt 0.337535 0.362922 -vt 0.362340 0.362922 -vt 0.513043 0.362922 -vt 0.362340 0.364873 -vt 0.362340 0.366824 -vt 0.513018 0.364883 -vt 0.591182 0.362922 -vt 0.591194 0.362922 -vt 0.742364 0.366824 -vt 0.742364 0.362922 -vt 0.742364 0.364873 -vt 0.746616 0.366824 -vt 0.591216 0.534582 -vt 0.587369 0.534582 -vt 0.587369 0.534586 -vt 0.829303 0.441843 -vt 0.825324 0.443010 -vt 0.825324 0.443340 -vt 0.829317 0.476174 -vt 0.833282 0.446787 -vt 0.829303 0.446783 -vt 0.833272 0.476174 -vt 0.833282 0.446794 -vt 0.833282 0.445792 -vt 0.829303 0.445486 -vt 0.833282 0.446402 -vt 0.829303 0.446708 -vt 0.829303 0.446797 -vt 0.825324 0.446402 -vt 0.825324 0.445796 -vt 0.825324 0.444017 -vt 0.825324 0.445792 -vt 0.829303 0.443127 -vt 0.833282 0.443340 -vt 0.829303 0.442286 -vt 0.833282 0.444017 -vt 0.833282 0.445448 -vt 0.833282 0.445796 -vt 0.829303 0.446502 -vt 0.829303 0.446686 -vt 0.825324 0.445448 -vt 0.833282 0.445345 -vt 0.833282 0.443010 -vt 0.825324 0.445345 -vt 0.833282 0.442994 -vt 0.829303 0.441826 -vt 0.829303 0.446512 -vt 0.829303 0.446495 -vt 0.825323 0.445328 -vt 0.825323 0.442994 -vt 0.833282 0.442946 -vt 0.829303 0.441814 -vt 0.833282 0.445210 -vt 0.833282 0.445328 -vt 0.829303 0.446342 -vt 0.825324 0.445210 -vt 0.825324 0.442946 -vt 0.833282 0.442608 -vt 0.829303 0.441786 -vt 0.833282 0.444253 -vt 0.829303 0.445075 -vt 0.825324 0.444253 -vt 0.825324 0.442608 -vt 0.556971 0.877667 -vt 0.553158 0.876682 -vt 0.556971 0.879637 -vt 0.549345 0.879637 -vt 0.549345 0.877667 -vt 0.556971 0.878286 -vt 0.553158 0.877496 -vt 0.553158 0.880622 -vt 0.553158 0.880657 -vt 0.549345 0.879867 -vt 0.549345 0.878286 -vt 0.556971 0.879972 -vt 0.553158 0.879695 -vt 0.556971 0.880526 -vt 0.556971 0.879867 -vt 0.553158 0.880803 -vt 0.549345 0.880526 -vt 0.549345 0.879972 -vt 0.553158 0.880948 -vt 0.556971 0.880947 -vt 0.549345 0.880947 -vt 0.553158 0.880945 -vt 0.556971 0.964249 -vt 0.553158 0.964250 -vt 0.556971 0.880946 -vt 0.556971 0.964246 -vt 0.553158 0.964244 -vt 0.549345 0.964246 -vt 0.549345 0.964761 -vt 0.553158 0.964401 -vt 0.549345 0.965483 -vt 0.549345 0.964249 -vt 0.553158 0.965844 -vt 0.556971 0.966818 -vt 0.553158 0.967607 -vt 0.556971 0.965483 -vt 0.556971 0.965240 -vt 0.556971 0.964761 -vt 0.553158 0.964451 -vt 0.549345 0.965240 -vt 0.549345 0.966818 -vt 0.556971 0.967645 -vt 0.553158 0.968691 -vt 0.556971 0.965555 -vt 0.553158 0.964510 -vt 0.549345 0.965555 -vt 0.549345 0.967645 -vn -0.484937 -0.249540 -0.838192 -vn -0.397482 -0.206176 -0.894147 -vn -1.000000 0.000001 0.000000 -vn 0.490904 -0.195752 -0.848938 -vn 0.391952 -0.262505 -0.881740 -vn -0.372467 0.001947 -0.928043 -vn -0.499983 0.000155 -0.866035 -vn -0.499960 0.000075 0.866049 -vn -0.405800 -0.001248 0.913961 -vn 0.499967 -0.001183 0.866044 -vn 0.406222 0.000078 0.913775 -vn 0.373114 0.000165 -0.927785 -vn 0.499966 0.001816 -0.866043 -vn -1.000000 0.000002 0.000001 -vn -0.466258 0.327809 0.821672 -vn -0.473133 0.331435 0.816270 -vn 0.467259 0.332612 0.819170 -vn 0.474021 0.326276 0.817831 -vn -0.470849 0.812296 0.344204 -vn -0.473617 0.811784 0.341604 -vn 0.471238 0.812960 0.342099 -vn 0.473986 0.810748 0.343547 -vn -0.507861 -0.861429 -0.004193 -vn -0.386167 -0.922372 -0.010271 -vn -0.999979 -0.006491 -0.000299 -vn -1.000000 0.000018 0.000046 -vn -0.501848 0.864952 0.002630 -vn -0.499990 0.866027 0.002721 -vn 0.490446 0.871469 0.002282 -vn 0.500004 0.866019 0.002739 -vn 0.999979 0.006491 0.000285 -vn 1.000000 0.000190 0.000535 -vn 0.497759 -0.867266 -0.009305 -vn 0.384302 -0.923195 -0.004755 -vn -0.469933 -0.782399 -0.408674 -vn -0.461111 -0.783735 -0.416095 -vn 0.470951 -0.779151 -0.413676 -vn 0.462280 -0.785966 -0.410554 -vn -0.478536 -0.295780 -0.826751 -vn -0.476735 -0.294709 -0.828173 -vn -1.000000 0.000002 -0.000002 -vn 0.478740 -0.294346 -0.827145 -vn 0.476951 -0.296070 -0.827563 -vn -0.372468 0.001947 -0.928043 -vn -0.499995 0.000155 -0.866028 -vn -1.000000 0.000001 0.000025 -vn -1.000000 0.000001 -0.000003 -vn -0.499983 0.000075 0.866035 -vn -0.405788 -0.001248 0.913966 -vn 0.499992 -0.001184 0.866029 -vn 0.406234 0.000078 0.913769 -vn 1.000000 -0.000001 0.000003 -vn 0.373125 0.000166 -0.927781 -vn 0.499977 0.001816 -0.866037 -vn -1.000000 0.000012 0.000029 -vn -0.466272 0.327809 0.821664 -vn -0.473151 0.331438 0.816258 -vn 0.467271 0.332616 0.819161 -vn 0.474041 0.326274 0.817821 -vn 1.000000 -0.000002 0.000002 -vn -1.000000 0.000028 0.000012 -vn -0.470834 0.812298 0.344219 -vn -0.473628 0.811782 0.341595 -vn 0.471225 0.812969 0.342094 -vn 0.474000 0.810736 0.343557 -vn -0.499226 -0.866460 -0.004505 -vn -0.386136 -0.922386 -0.010179 -vn -1.000000 0.000028 0.000135 -vn -1.000000 0.000073 0.000137 -vn -0.494500 0.869174 0.002733 -vn -0.499981 0.866033 0.002462 -vn 0.495511 0.868598 0.002645 -vn 0.499995 0.866024 0.002860 -vn 1.000000 -0.000036 0.000416 -vn 1.000000 0.000145 0.000409 -vn 0.503524 -0.863930 -0.009372 -vn 0.384275 -0.923207 -0.004643 -vn 0.874312 0.000965 -0.485363 -vn 0.872579 -0.000288 -0.488473 -vn 0.000030 -0.000189 -1.000000 -vn 0.000015 -0.000194 -1.000000 -vn -0.874332 -0.000256 -0.485329 -vn -0.873021 0.000547 -0.487683 -vn -0.874328 0.000775 0.485335 -vn -0.873168 -0.000063 0.487420 -vn -0.000015 0.000202 1.000000 -vn 0.000000 0.000198 1.000000 -vn 0.874332 -0.000107 0.485329 -vn 0.872214 0.001190 0.489123 -vn 0.503100 -0.000000 0.864228 -vn 0.607304 0.122813 0.784920 -vn 0.918044 -0.122298 0.377146 -vn 0.984149 0.122217 0.128503 -vn 0.918045 -0.122301 -0.377143 -vn 0.789780 0.122549 -0.601024 -vn 0.382447 -0.123028 -0.915750 -vn 0.130595 0.123133 -0.983760 -vn -0.382453 -0.123039 -0.915746 -vn -0.607291 0.122796 -0.784933 -vn -0.918046 -0.122327 -0.377131 -vn -0.984155 0.122186 -0.128490 -vn -0.918049 -0.122311 0.377129 -vn -0.789768 0.122570 0.601036 -vn -0.502105 -0.062322 0.862558 -vn -0.385408 0.000000 0.922746 -vn 0.000000 -0.999998 0.002107 -vn -0.001147 -0.999997 0.001951 -vn -0.001860 -0.999998 0.001016 -vn -0.002123 -0.999997 0.000879 -vn 0.001143 -0.999997 0.001944 -vn 0.001845 -0.999998 0.001024 -vn 0.002123 -0.999997 0.000879 -vn 0.002123 -0.999997 -0.000872 -vn 0.001838 -0.999998 -0.001020 -vn 0.000926 -0.999997 -0.002217 -vn 0.000000 -0.999998 -0.001998 -vn -0.000934 -0.999997 -0.002219 -vn -0.002123 -0.999997 -0.000879 -vn -0.001845 -0.999998 -0.001024 -vn 0.000015 -0.999998 0.002098 -vn 0.000001 1.000000 -0.000002 -vn 0.000010 1.000000 0.000001 -vn 0.000000 1.000000 -0.000003 -vn 0.000003 1.000000 -0.000002 -vn 0.000009 1.000000 0.000001 -vn 0.874287 0.000303 -0.485409 -vn 0.874661 0.000573 -0.484735 -vn 0.000015 -0.000189 -1.000000 -vn -0.000000 -0.000193 -1.000000 -vn -0.874304 0.000172 -0.485378 -vn -0.875669 -0.000667 -0.482912 -vn -0.874297 -0.000445 0.485391 -vn -0.875423 0.000368 0.483357 -vn -0.000015 0.000211 1.000000 -vn 0.000015 0.000202 1.000000 -vn 0.874301 0.000754 0.485384 -vn 0.874677 0.000524 0.484707 -vn 0.503104 -0.000000 0.864226 -vn 0.607290 0.122795 0.784933 -vn 0.918044 -0.122326 0.377136 -vn 0.984154 0.122190 0.128489 -vn 0.918049 -0.122313 -0.377129 -vn 0.789779 0.122549 -0.601025 -vn 0.382463 -0.123018 -0.915745 -vn 0.130593 0.123161 -0.983756 -vn -0.382459 -0.123025 -0.915746 -vn -0.607296 0.122809 -0.784927 -vn -0.918048 -0.122305 -0.377133 -vn -0.984152 0.122196 -0.128503 -vn -0.918040 -0.122320 0.377147 -vn -0.789775 0.122532 0.601034 -vn -0.502119 -0.062349 0.862548 -vn -0.385379 0.000000 0.922758 -vn -0.000010 0.000000 1.000000 -vn -0.001851 -0.999998 0.001028 -vn -0.002138 -0.999997 0.000878 -vn 0.001147 -0.999997 0.001951 -vn 0.001851 -0.999998 0.001028 -vn 0.002138 -0.999997 0.000878 -vn 0.002138 -0.999997 -0.000871 -vn 0.001845 -0.999998 -0.001024 -vn 0.000925 -0.999997 -0.002231 -vn 0.000000 -0.999998 -0.002012 -vn -0.000932 -0.999997 -0.002233 -vn -0.002138 -0.999997 -0.000878 -vn -0.001851 -0.999998 -0.001028 -vn 0.000017 1.000000 0.000010 -vn -0.000010 1.000000 -0.000001 -vn -0.000030 -0.000014 1.000000 -vn -0.000013 -0.000017 1.000000 -vn 0.789880 0.414533 0.451943 -vn 0.781845 0.417516 0.463033 -vn 0.786234 0.419867 -0.453373 -vn 0.784250 0.411598 -0.464262 -vn -0.809399 -0.384578 -0.443817 -vn -0.809403 -0.384580 0.443806 -vn -0.000010 -0.000028 1.000000 -vn 0.293295 0.826814 0.479955 -vn 0.285269 0.825052 0.487761 -vn 0.286502 0.828616 -0.480949 -vn 0.291708 0.822338 -0.488535 -vn -0.000011 0.000007 -1.000000 -vn 0.000027 0.000674 1.000000 -vn -0.000151 -0.000085 1.000000 -vn 0.000162 0.866200 0.499698 -vn 0.000092 0.866054 0.499951 -vn 0.000253 0.866174 -0.499742 -vn 0.000309 0.866046 -0.499965 -vn 0.000142 -0.000780 -1.000000 -vn 0.000000 0.000012 -1.000000 -vn -0.029946 -0.897132 -0.440747 -vn -0.029946 -0.897140 0.440730 -vn 0.000015 0.000686 1.000000 -vn -0.000000 -0.000643 -1.000000 -vn -0.017785 -0.865895 -0.499910 -vn -0.017783 -0.865898 0.499904 -vn -0.000150 -0.001928 0.999998 -vn -0.000071 0.000686 1.000000 -vn -0.000020 0.864022 0.503455 -vn 0.000111 0.866269 0.499578 -vn -0.000038 0.866908 -0.498468 -vn 0.000002 0.866236 -0.499636 -vn -0.000019 0.000000 -1.000000 -vn -0.000014 -0.866114 -0.499847 -vn -0.000019 -0.866032 -0.499989 -vn 0.000032 -0.864354 0.502884 -vn -0.000069 -0.866035 0.499983 -vn -0.000000 -0.001941 0.999998 -vn -0.000001 -0.001956 0.999998 -vn 0.000062 0.863896 0.503670 -vn 0.000080 0.864050 0.503406 -vn 0.000082 0.866908 -0.498469 -vn -0.000081 -0.866114 -0.499846 -vn -0.000081 -0.864481 0.502665 -vn -0.000061 -0.864312 0.502956 -vn 0.000127 0.867300 -0.497785 -vn -0.000000 -0.000014 -1.000000 -vn -0.000001 0.000000 -1.000000 -vn -0.000127 -0.865703 -0.500559 -vn 0.000151 0.000686 1.000000 -vn 0.000071 -0.001941 0.999998 -vn 0.000089 0.865638 0.500670 -vn -0.000015 0.863926 0.503619 -vn 0.000132 0.865627 -0.500689 -vn 0.000034 0.867300 -0.497785 -vn 0.000018 -0.000629 -1.000000 -vn -0.000016 -0.866022 -0.500006 -vn -0.000035 -0.865703 -0.500559 -vn -0.000085 -0.866029 0.499993 -vn 0.000007 -0.864458 0.502706 -vn 0.000000 0.000686 1.000000 -vn 0.000015 -0.000629 -1.000000 -vn 0.000177 0.000855 1.000000 -vn 0.000312 0.866049 0.499960 -vn 0.000131 0.865697 0.500568 -vn -0.000058 0.866041 -0.499974 -vn 0.000140 0.865703 -0.500558 -vn -0.000166 0.000147 -1.000000 -vn 0.000020 -0.000624 -1.000000 -vn 0.028575 -0.905567 -0.423241 -vn 0.012561 -0.865954 -0.499966 -vn 0.012564 -0.865961 0.499954 -vn -0.205270 0.860966 0.465405 -vn -0.215739 0.845018 0.489287 -vn -0.218610 0.856265 -0.467996 -vn -0.202079 0.847578 -0.490689 -vn -0.000011 0.000010 -1.000000 -vn 0.028575 -0.905567 0.423241 -vn 0.000003 0.000019 1.000000 -vn 0.000007 0.000005 1.000000 -vn -0.692360 0.565829 0.447744 -vn -0.690371 0.534134 0.487944 -vn -0.705073 0.545509 -0.453091 -vn -0.674833 0.551490 -0.490366 -vn 0.000014 -0.000001 -1.000000 -vn -0.000022 0.000001 -1.000000 -vn 0.631641 -0.650846 -0.421223 -vn 0.495364 -0.710700 -0.499520 -vn 0.530328 -0.760902 0.373872 -vn 0.604064 -0.622410 0.497707 -vn -0.868904 0.000367 -0.494980 -vn -0.866194 -0.001555 -0.499706 -vn -0.000014 -0.000005 -1.000000 -vn 0.000015 0.000005 -1.000000 -vn 0.869132 0.005775 -0.494546 -vn -0.817269 0.017362 -0.575994 -vn 0.000000 -0.000005 -1.000000 -vn -0.865930 -0.014824 -0.499946 -vn -0.821969 -0.014071 0.569358 -vn -0.865889 0.018401 0.499898 -vn -0.000014 0.000000 -1.000000 -vn 0.866381 -0.017620 -0.499072 -vn 0.866389 -0.017265 0.499071 -vn 0.865912 -0.017256 -0.499899 -vn 0.865910 -0.017613 0.499890 -vn -0.000014 -0.000005 1.000000 -vn 0.000000 0.000005 1.000000 -vn 0.020404 0.002960 0.999787 -vn 0.869146 0.005770 0.494522 -vn -0.000001 -0.000005 1.000000 -vn 0.000000 -0.000005 1.000000 -vn -0.868992 -0.001560 0.494824 -vn -0.866206 0.000366 0.499688 -vn 0.866199 0.008022 -0.499635 -vn 0.866199 0.008028 0.499635 -vn 0.000794 -0.999998 0.001786 -vn -0.279825 -0.960027 0.006729 -vn -1.000000 0.000103 -0.000164 -vn -0.999912 0.013267 0.000074 -vn -0.347708 0.937589 0.005143 -vn -0.473733 0.880665 0.002230 -vn 0.346423 0.938077 0.001844 -vn 0.500042 0.865988 0.004752 -vn 0.999869 -0.016168 0.000314 -vn -0.003343 -0.999966 0.007516 -vn 0.327793 -0.944748 0.001493 -vn -0.499505 -0.866228 0.011967 -vn 0.159350 -0.987222 0.000717 -vn -1.000000 0.000061 0.000002 -vn 0.499735 -0.866178 0.000628 -vn -0.159788 -0.987057 0.013629 -vn -0.347717 0.937585 0.005204 -vn -0.502312 0.864685 0.001589 -vn 0.346383 0.938091 0.001723 -vn 0.500070 0.865972 0.004753 -vn 1.000000 -0.000061 0.000002 -vn 0.491688 -0.181956 -0.851549 -vn -0.499988 -0.866024 -0.003938 -vn -1.000000 -0.000005 0.000176 -vn -1.000000 -0.000000 0.000177 -vn -0.377151 0.925761 0.026921 -vn -0.499923 0.865937 0.015179 -vn 0.267224 0.963483 0.017089 -vn 0.499738 0.865567 0.032498 -vn 1.000000 -0.000000 0.000644 -vn -0.487341 -0.873197 -0.005084 -vn 1.000000 0.000067 0.000652 -vn 0.487201 -0.873282 -0.003743 -vn 0.499995 -0.866015 -0.004811 -vn -0.472051 -0.648878 -0.596762 -vn -0.453381 -0.647647 -0.612372 -vn -1.000000 -0.000000 0.000006 -vn 1.000000 -0.000001 -0.000007 -vn 0.474067 -0.639777 -0.604934 -vn 0.456025 -0.655056 -0.602448 -vn -0.378351 -0.004503 -0.925651 -vn -0.463526 -0.006288 -0.886061 -vn -1.000000 0.000001 0.000009 -vn -1.000000 0.000001 0.000006 -vn -0.381827 0.014397 0.924122 -vn -0.305829 0.013144 0.951996 -vn 0.381272 0.012762 0.924375 -vn 0.467786 0.010179 0.883783 -vn 1.000000 -0.000001 -0.000008 -vn 0.327279 -0.007889 -0.944895 -vn 0.463158 -0.004312 -0.886265 -vn -0.379308 -0.925269 0.001373 -vn -0.378614 -0.925554 0.001351 -vn -1.000000 0.000005 0.000000 -vn -1.000000 0.000009 0.000000 -vn -0.499899 0.865959 0.014702 -vn -0.385843 0.922357 0.019567 -vn 0.499905 0.865885 0.018369 -vn 0.384526 0.922981 0.015670 -vn 1.000000 -0.000008 -0.000000 -vn 0.610821 -0.791693 -0.011004 -vn 0.197634 -0.980275 0.001454 -vn -0.469676 0.812264 -0.345879 -vn 0.469713 0.812238 -0.345890 -vn -1.000000 0.000003 0.000003 -vn -0.472845 0.809895 -0.347114 -vn 0.472858 0.809887 -0.347115 -vn 1.000000 -0.000002 -0.000004 -vn 1.000000 -0.000000 -0.000008 -vn 0.392367 -0.772369 0.499495 -vn -1.000000 0.000015 0.000015 -vn -0.476583 0.372042 -0.796526 -vn 0.476594 0.372038 -0.796521 -vn -0.469174 0.368892 -0.802368 -vn 0.469188 0.368889 -0.802361 -vn -1.000000 -0.000011 0.000026 -vn -0.503668 0.003253 -0.863891 -vn -0.499881 0.005017 -0.866079 -vn 0.499894 0.004962 -0.866072 -vn 0.496773 0.003536 -0.867873 -vn 0.531315 -0.049569 0.845723 -vn -0.499356 -0.050691 0.864912 -vn -0.407261 -0.091076 0.908759 -vn -0.999987 -0.001989 0.004637 -vn 1.000000 -0.000010 0.000003 -vn 0.999996 -0.001097 -0.002740 -vn 0.499675 -0.036943 0.865425 -vn -0.499988 -0.866023 -0.003938 -vn -0.377168 0.925754 0.026921 -vn -0.499932 0.865932 0.015180 -vn 0.267219 0.963484 0.017089 -vn 0.499737 0.865567 0.032498 -vn -0.487350 -0.873192 -0.005083 -vn 0.487190 -0.873288 -0.003743 -vn 0.499992 -0.866016 -0.004811 -vn -0.472054 -0.648876 -0.596763 -vn -0.453391 -0.647645 -0.612366 -vn 0.474054 -0.639781 -0.604940 -vn 0.456013 -0.655059 -0.602454 -vn -0.378374 -0.004503 -0.925642 -vn -0.463527 -0.006288 -0.886061 -vn -0.381838 0.014397 0.924117 -vn -0.305852 0.013144 0.951988 -vn 0.381262 0.012762 0.924379 -vn 0.467774 0.010179 0.883789 -vn 0.327283 -0.007889 -0.944893 -vn 0.463146 -0.004312 -0.886271 -vn -0.379331 -0.925260 0.001372 -vn -0.378637 -0.925544 0.001351 -vn -0.499913 0.865951 0.014703 -vn -0.385866 0.922347 0.019566 -vn 0.499881 0.865899 0.018369 -vn 0.384528 0.922980 0.015670 -vn 0.610800 -0.791708 -0.011004 -vn 0.197643 -0.980273 0.001454 -vn -0.469692 0.812253 -0.345882 -vn 0.469695 0.812249 -0.345887 -vn -0.472858 0.809887 -0.347115 -vn 0.472873 0.809873 -0.347125 -vn 1.000000 0.000016 -0.000036 -vn 0.392352 -0.772379 0.499490 -vn -0.476594 0.372039 -0.796520 -vn 0.476604 0.372050 -0.796510 -vn 1.000000 0.000031 -0.000008 -vn -0.469186 0.368890 -0.802362 -vn 0.469176 0.368892 -0.802367 -vn -0.503671 0.003253 -0.863890 -vn -0.499893 0.005013 -0.866073 -vn 0.499882 0.004957 -0.866079 -vn 0.496782 0.003540 -0.867868 -vn 0.531303 -0.049569 0.845731 -vn -0.499354 -0.050691 0.864914 -vn -0.407272 -0.091071 0.908755 -vn -0.999988 -0.001974 0.004602 -vn 1.000000 -0.000013 0.000003 -vn 0.999996 -0.001108 -0.002760 -vn 0.499666 -0.036944 0.865430 -vn -0.455993 -0.408157 0.790872 -vn -0.183097 -0.609591 0.771281 -vn 0.411893 -0.565031 0.714901 -vn 0.655579 -0.575614 0.488759 -vn -0.499989 0.002096 -0.866029 -vn -0.522673 0.001130 -0.852532 -vn -0.482255 -0.001093 0.876030 -vn -0.499997 -0.000367 0.866027 -vn 0.506987 -0.000366 0.861953 -vn 0.499997 -0.000079 0.866027 -vn 0.500007 0.001147 -0.866021 -vn 0.522750 0.002062 -0.852483 -vn 0.460336 -0.338989 0.820474 -vn -0.420405 0.528892 -0.737247 -vn -0.425969 0.525323 -0.736605 -vn -1.000000 0.000019 -0.000003 -vn 1.000000 -0.000001 0.000001 -vn 0.419674 0.527016 -0.739005 -vn 0.425295 0.527561 -0.735394 -vn -1.000000 0.000016 0.000026 -vn -0.401120 -0.717841 0.569040 -vn -0.091728 0.995777 -0.003746 -vn -0.499697 0.865537 -0.033876 -vn -1.000000 0.000001 -0.000002 -vn -1.000000 -0.000160 -0.000007 -vn -0.585677 -0.809591 0.039304 -vn 0.047341 -0.998856 -0.006783 -vn 0.337958 -0.941140 -0.006367 -vn -0.046861 -0.998604 0.024362 -vn 0.112993 0.992836 -0.038858 -vn 0.467797 0.883830 -0.003324 -vn 0.500002 0.866018 -0.003255 -vn 0.488876 -0.872265 0.012432 -vn 0.999997 -0.002365 0.000240 -vn 1.000000 0.000001 0.000074 -vn -0.613252 -0.789817 0.010492 -vn 0.497018 -0.867660 0.011836 -vn -0.496732 0.867873 -0.007367 -vn -0.482783 0.875716 -0.006553 -vn -0.999988 0.004952 0.000314 -vn -1.000000 0.000048 0.000078 -vn -0.504719 -0.863278 0.003197 -vn 0.482926 0.875627 -0.007690 -vn 0.502232 0.864709 -0.006370 -vn -0.469318 0.331433 -0.818470 -vn -0.477097 0.324485 -0.816754 -vn -1.000000 0.000002 -0.000001 -vn 1.000000 -0.000002 0.000001 -vn 0.468269 0.326224 -0.821159 -vn 0.476205 0.330045 -0.815045 -vn -0.474845 0.822242 -0.313752 -vn -0.464944 0.829805 -0.308627 -vn 0.476002 0.824279 -0.306572 -vn 0.466324 0.826488 -0.315373 -vn -0.500000 0.866025 0.000001 -vn -0.500003 0.866024 0.000001 -vn -0.155956 -0.987745 -0.006062 -vn -0.378054 -0.925783 -0.000369 -vn 0.152661 -0.988279 -0.000394 -vn 0.376177 -0.926530 -0.005686 -vn 0.500000 0.866025 0.000001 -vn 0.499990 0.866031 0.000001 -vn -0.471139 0.814581 0.338358 -vn -0.470627 0.814681 0.338830 -vn 0.471207 0.814394 0.338711 -vn 0.470695 0.814800 0.338449 -vn -0.467984 0.351631 0.810769 -vn -0.473439 0.354365 0.806400 -vn 0.467225 0.355689 0.809436 -vn 0.472740 0.350621 0.808444 -vn -0.500000 -0.000722 0.866025 -vn -0.499979 -0.000722 0.866037 -vn -0.500057 0.000421 -0.865993 -vn -0.511862 0.000344 -0.859067 -vn 0.499987 0.000346 -0.866033 -vn 0.511854 0.000417 -0.859072 -vn 0.500000 -0.000723 0.866025 -vn 0.499979 -0.000723 0.866037 -vn -0.499811 -0.002216 -0.866132 -vn -0.425796 -0.002319 -0.904816 -vn -0.500009 -0.002322 -0.866017 -vn -0.399549 -0.064842 0.914416 -vn -0.755360 0.132308 0.641815 -vn -0.499962 -0.015879 0.865902 -vn 0.383606 -0.016934 0.923342 -vn 0.755253 -0.132190 -0.641965 -vn 0.613487 -0.108038 0.782280 -vn 0.499035 -0.061287 0.864412 -vn 0.499806 -0.002318 -0.866134 -vn 0.418405 -0.044337 -0.907178 -vn 0.499996 -0.002221 -0.866025 -s off -f 2919/1870/2229 2925/1871/2229 2926/1872/2229 -f 2919/1870/2230 2920/1873/2230 2925/1871/2230 -f 2920/1873/2231 2921/1874/2231 2925/1871/2231 -f 2923/1875/63 2924/1876/63 2927/1877/63 -f 2924/1876/2232 2926/1872/2232 2927/1877/2232 -f 2924/1876/2233 2919/1870/2233 2926/1872/2233 -f 3245/1878/2234 2928/1879/2234 2929/1880/2234 -f 3246/1880/2235 3247/1878/2235 3248/1878/2235 -f 3249/1879/2231 2930/1878/2231 3250/1881/2231 -f 3251/1882/2231 3252/1879/2231 3253/1881/2231 -f 3254/1879/2236 2931/1882/2236 3255/1883/2236 -f 3256/1882/2237 2922/1883/2237 2931/1882/2237 -f 2922/1883/2238 2932/1882/2238 3257/1884/2238 -f 3258/1885/2239 3259/1883/2239 3260/1884/2239 -f 3261/1883/274 2933/1885/274 3262/1886/274 -f 3263/1887/274 3264/1886/274 2933/1885/274 -f 3265/1886/2240 3266/1887/2240 3267/1888/2240 -f 3268/1889/2241 3269/1886/2241 3270/1890/2241 -f 3271/1889/2242 3272/1891/2242 2934/1889/2242 -f 3273/1889/2243 2935/1892/2243 3274/1891/2243 -f 3275/1892/2244 3276/1893/2244 3277/1891/2244 -f 3278/1891/2245 2936/1893/2245 3279/1894/2245 -f 3280/1895/2246 3281/1891/2246 3282/1894/2246 -f 3283/1891/63 3284/1895/63 3285/1896/63 -f 3286/1897/2242 3287/1898/2242 2937/1880/2242 -f 3288/1898/2247 2938/1878/2247 2937/1880/2247 -f 3289/1899/2248 3290/1900/2248 3291/1901/2248 -f 3292/1899/2249 2939/1902/2249 3293/1900/2249 -f 3294/1902/2250 3295/1903/2250 3296/1900/2250 -f 3297/1902/63 3298/1904/63 3299/1903/63 -f 3300/1905/2251 2940/1906/2251 2941/1907/2251 -f 3301/1906/2252 3302/1908/2252 3303/1907/2252 -f 3304/1906/2253 2942/1909/2253 3305/1908/2253 -f 3306/1909/2254 3307/1901/2254 3308/1908/2254 -f 3309/1909/2255 2943/1899/2255 3310/1901/2255 -f 3311/1901/2256 3312/1910/2256 3313/1911/2256 -f 3314/1901/2257 2944/1900/2257 3315/1910/2257 -f 3316/1900/2258 3317/1912/2258 3318/1910/2258 -f 3319/1900/2259 2945/1903/2259 3320/1912/2259 -f 3321/1903/2260 3322/1913/2260 3323/1912/2260 -f 3324/1903/2261 3325/1914/2261 3326/1913/2261 -f 3327/1914/2262 3328/1915/2262 3329/1913/2262 -f 2946/1914/2263 2947/1907/2263 2948/1915/2263 -f 3330/1907/2264 2949/1916/2264 3331/1915/2264 -f 3332/1907/7 2950/1908/7 3333/1916/7 -f 2952/1912/63 2954/1917/63 2953/1918/63 -f 3334/1912/2265 3335/1913/2265 3336/1917/2265 -f 3337/1913/2266 3338/1919/2266 3339/1917/2266 -f 3340/1913/2267 2955/1915/2267 2956/1919/2267 -f 2948/1915/2268 3341/1920/2268 3342/1919/2268 -f 3343/1915/2269 3344/1916/2269 3345/1920/2269 -f 3346/1918/63 3347/1921/63 2957/1922/63 -f 2953/1918/2270 3348/1917/2270 3349/1921/2270 -f 3350/1917/2271 3351/1923/2271 3352/1921/2271 -f 3353/1917/2272 2958/1919/2272 2959/1923/2272 -f 2956/1919/2273 3354/1924/2273 3355/1923/2273 -f 3356/1919/2274 2960/1920/2274 3357/1924/2274 -f 3358/1920/2275 3359/1925/2275 3360/1924/2275 -f 3361/1920/2276 2961/1926/2276 3362/1925/2276 -f 3363/1925/2277 2951/1927/2277 3364/1928/2277 -f 3365/1925/2278 2962/1929/2278 3366/1927/2278 -f 3367/1929/2279 3368/1930/2279 3369/1927/2279 -f 3370/1929/2280 2963/1922/2280 3371/1930/2280 -f 3372/1922/274 3373/1931/274 3374/1930/274 -f 2957/1922/2281 3375/1921/2281 3376/1931/2281 -f 3377/1921/2282 3378/1932/2282 3379/1931/2282 -f 3380/1924/2283 3381/1928/2283 2964/1933/2283 -f 3382/1924/2284 2965/1925/2284 3383/1928/2284 -f 3384/1928/2285 3385/1934/2285 3386/1935/2285 -f 3387/1928/2286 2966/1927/2286 3388/1934/2286 -f 3389/1927/2287 3390/1936/2287 3391/1934/2287 -f 3392/1927/2288 3393/1930/2288 3394/1936/2288 -f 3395/1933/2289 3396/1935/2289 2967/1937/2289 -f 2964/1933/2290 2968/1928/2290 3397/1935/2290 -f 3398/1938/2291 3399/1939/2291 3400/1940/2291 -f 3401/1938/2292 2969/1941/2292 3402/1939/2292 -f 3403/1941/2293 3404/1942/2293 3405/1939/2293 -f 3406/1941/63 3407/1943/63 3408/1942/63 -f 3409/1944/2294 2970/1945/2294 2971/1946/2294 -f 3410/1945/2295 3411/1947/2295 3412/1946/2295 -f 3413/1945/2296 2972/1948/2296 3414/1947/2296 -f 3415/1948/2297 3416/1940/2297 3417/1947/2297 -f 3418/1948/2298 2973/1938/2298 3419/1940/2298 -f 3420/1940/2299 3421/1949/2299 3422/1950/2299 -f 3423/1940/2300 2974/1939/2300 3424/1949/2300 -f 3425/1939/2301 3426/1951/2301 3427/1949/2301 -f 3428/1939/2302 2975/1942/2302 3429/1951/2302 -f 3430/1942/2303 3431/1952/2303 3432/1951/2303 -f 3433/1942/2304 3434/1953/2304 3435/1952/2304 -f 3436/1953/2305 3437/1954/2305 3438/1952/2305 -f 2976/1953/2306 2977/1946/2306 2978/1954/2306 -f 3439/1946/2307 2979/1955/2307 3440/1954/2307 -f 3441/1946/2308 2980/1947/2308 3442/1955/2308 -f 3443/1947/2309 2981/1950/2309 3444/1955/2309 -f 3445/1947/2310 2982/1940/2310 3446/1950/2310 -f 2981/1950/2311 2983/1956/2311 3447/1957/2311 -f 3448/1950/2312 2984/1949/2312 3449/1956/2312 -f 3450/1949/2313 2985/1958/2313 3451/1956/2313 -f 3452/1949/2314 2986/1951/2314 3453/1958/2314 -f 3454/1951/2315 2987/1959/2315 3455/1958/2315 -f 3456/1951/2316 3457/1952/2316 3458/1959/2316 -f 3459/1952/2317 3460/1960/2317 3461/1959/2317 -f 2989/1952/2318 2988/1954/2318 2990/1960/2318 -f 3462/1954/2319 3463/1961/2319 2991/1960/2319 -f 3464/1954/2320 3465/1955/2320 2992/1961/2320 -f 3466/1955/2321 3467/1957/2321 2993/1961/2321 -f 3468/1955/2322 3469/1950/2322 2994/1957/2322 -f 3470/1957/2323 3471/1962/2323 2995/1963/2323 -f 3472/1957/2324 3473/1956/2324 2996/1962/2324 -f 3474/1956/2325 3475/1964/2325 2997/1962/2325 -f 3476/1956/2326 3477/1958/2326 2998/1964/2326 -f 3478/1958/2327 3479/1965/2327 2999/1964/2327 -f 3480/1958/2328 3481/1959/2328 3000/1965/2328 -f 3482/1959/2329 3483/1966/2329 3001/1965/2329 -f 3484/1959/2330 3485/1960/2330 3002/1966/2330 -f 3486/1960/2331 3487/1967/2331 3003/1966/2331 -f 3488/1960/2332 3489/1961/2332 3004/1967/2332 -f 3490/1961/2333 3491/1963/2333 3005/1967/2333 -f 3492/1961/21 3493/1957/21 3494/1963/21 -f 3495/1963/21 3496/1968/21 3497/1969/21 -f 3498/1963/2334 3499/1962/2334 3500/1968/2334 -f 3501/1962/2335 3502/1970/2335 3503/1968/2335 -f 3504/1962/2336 3505/1964/2336 3506/1970/2336 -f 3507/1964/2337 3508/1971/2337 3509/1970/2337 -f 3510/1964/2338 3511/1965/2338 3512/1971/2338 -f 3513/1965/2339 3514/1972/2339 3515/1971/2339 -f 3516/1965/2340 3517/1966/2340 3518/1972/2340 -f 3519/1966/2341 3520/1973/2341 3521/1972/2341 -f 3522/1966/2342 3523/1967/2342 3524/1973/2342 -f 3525/1967/2343 3526/1969/2343 3527/1973/2343 -f 3528/1967/2344 3529/1963/2344 3530/1969/2344 -f 3531/1969/2345 3532/1974/2345 3533/1975/2345 -f 3534/1969/2346 3535/1968/2346 3536/1974/2346 -f 3537/1968/2347 3538/1976/2347 3539/1974/2347 -f 3540/1968/2348 3541/1970/2348 3542/1976/2348 -f 3543/1970/2349 3544/1977/2349 3545/1976/2349 -f 3546/1970/2350 3547/1971/2350 3548/1977/2350 -f 3549/1971/331 3550/1978/331 3551/1977/331 -f 3552/1971/331 3553/1972/331 3554/1978/331 -f 3555/1972/2351 3556/1979/2351 3557/1978/2351 -f 3558/1972/2352 3559/1973/2352 3560/1979/2352 -f 3561/1973/2353 3562/1975/2353 3563/1979/2353 -f 3006/1973/2354 3007/1969/2354 3008/1975/2354 -f 3564/1980/2355 3009/1981/2355 3565/1982/2355 -f 3566/1980/2356 3010/1983/2356 3567/1981/2356 -f 3568/1983/2357 3011/1984/2357 3569/1981/2357 -f 3570/1983/2358 3012/1985/2358 3571/1984/2358 -f 3572/1985/2359 3013/1986/2359 3573/1984/2359 -f 3574/1985/2360 3014/1987/2360 3575/1986/2360 -f 3576/1987/2361 3015/1988/2361 3577/1986/2361 -f 3578/1987/2362 3016/1989/2362 3579/1988/2362 -f 3580/1989/2363 3017/1990/2363 3581/1988/2363 -f 3582/1989/2364 3583/1991/2364 3584/1990/2364 -f 3585/1991/2365 3586/1982/2365 3587/1990/2365 -f 3019/1991/2366 3018/1980/2366 3020/1982/2366 -f 3588/1992/2367 3589/1992/2367 3021/1993/2367 -f 3590/1992/2368 3591/1993/2368 3022/1993/2368 -f 3021/1993/2369 3022/1993/2369 3023/1994/2369 -f 3592/1993/2370 3593/1994/2370 3024/1994/2370 -f 3023/1994/2371 3024/1994/2371 3025/1995/2371 -f 3594/1994/2372 3595/1995/2372 3026/1995/2372 -f 3596/1995/2373 3597/1995/2373 3027/1996/2373 -f 3598/1995/2374 3599/1996/2374 3028/1996/2374 -f 3027/1996/2375 3028/1996/2375 3029/1997/2375 -f 3600/1996/2376 3601/1997/2376 3030/1997/2376 -f 3602/1997/2377 3603/1997/2377 3031/1998/2377 -f 3604/1997/2378 3605/1998/2378 3032/1998/2378 -f 3031/1998/2379 3032/1998/2379 3033/1999/2379 -f 3606/1998/2380 3607/1999/2380 3034/1999/2380 -f 3033/1999/2381 3034/1999/2381 3035/2000/2381 -f 3608/1999/2382 3609/2000/2382 3610/2000/2382 -f 3035/2000/2382 3611/2000/2382 3612/2001/2382 -f 3613/2000/2334 3614/2001/2334 3615/2001/2334 -f 3616/2001/2335 3617/2001/2335 3618/2002/2335 -f 3619/2001/2383 3620/2002/2383 3621/2002/2383 -f 3622/2002/2384 3623/2002/2384 3624/2003/2384 -f 3625/2002/2385 3626/2003/2385 3627/2003/2385 -f 3628/2003/2386 3629/2003/2386 3630/2004/2386 -f 3631/2003/2387 3632/2004/2387 3633/2004/2387 -f 3634/2004/2388 3635/2004/2388 3636/2005/2388 -f 3637/2004/2389 3638/2005/2389 3639/2005/2389 -f 3640/2005/2390 3641/2005/2390 3642/2006/2390 -f 3643/2005/2391 3644/2006/2391 3645/2006/2391 -f 3646/2006/2392 3647/2006/2392 3648/2007/2392 -f 3649/2006/2393 3650/2007/2393 3651/2007/2393 -f 3652/2007/2394 3653/2007/2394 3654/2008/2394 -f 3655/2007/2334 3656/2008/2334 3657/2008/2334 -f 3658/2008/2395 3659/2008/2395 3660/2009/2395 -f 3661/2008/2396 3662/2009/2396 3663/2009/2396 -f 3664/2009/331 3665/2009/331 3666/2010/331 -f 3667/2009/331 3668/2010/331 3669/2010/331 -f 3670/2010/331 3671/2010/331 3672/2011/331 -f 3673/2010/2353 3674/2011/2353 3675/2011/2353 -f 3676/2011/2353 3677/2011/2353 3678/2012/2353 -f 3036/2011/2397 3037/2012/2397 3038/2012/2397 -f 3679/2012/2398 3039/2012/2398 3680/2013/2398 -f 3681/2012/2399 3040/2013/2399 3682/2013/2399 -f 3683/2013/2400 3041/2013/2400 3684/2014/2400 -f 3041/2013/2401 3042/2014/2401 3685/2014/2401 -f 3686/2014/2402 3043/2014/2402 3687/2015/2402 -f 3043/2014/105 3044/2015/105 3688/2015/105 -f 3689/2015/105 3045/2015/105 3690/1992/105 -f 3045/2015/2403 3046/1992/2403 3691/1992/2403 -f 3692/1994/2404 3693/1993/2404 3694/1990/2404 -f 3695/1990/2405 3696/1993/2405 3047/1992/2405 -f 3697/1992/2406 3048/2015/2406 3698/1988/2406 -f 3699/2015/2407 3700/2014/2407 3701/1988/2407 -f 3702/2014/2408 3049/2013/2408 3703/1988/2408 -f 3040/2013/2409 3704/1986/2409 3705/1988/2409 -f 3706/2013/2410 3707/2012/2410 3708/1986/2410 -f 3709/2012/2411 3710/2011/2411 3050/1986/2411 -f 3711/1986/2412 3712/2011/2412 3713/2010/2412 -f 3714/2010/2413 3715/2009/2413 3716/1986/2413 -f 3717/1990/2414 3718/1995/2414 3719/1994/2414 -f 3720/1996/2415 3721/1995/2415 3722/1990/2415 -f 3723/1990/2416 3724/1982/2416 3725/1996/2416 -f 3726/1996/2417 3051/1982/2417 3727/1997/2417 -f 3728/1997/2418 3729/1982/2418 3730/1998/2418 -f 3731/1982/2419 3732/1999/2419 3733/1998/2419 -f 3734/1982/2420 3735/2000/2420 3736/1999/2420 -f 3737/1982/2421 3738/1981/2421 3739/2000/2421 -f 3740/2000/2422 3741/1981/2422 3742/2001/2422 -f 3743/2001/2423 3744/1981/2423 3052/2002/2423 -f 3745/2002/2424 3746/1981/2424 3747/2003/2424 -f 3748/1981/2425 3749/2004/2425 3750/2003/2425 -f 3751/1981/2426 3752/1984/2426 3753/2004/2426 -f 3754/1984/2427 3755/2005/2427 3756/2004/2427 -f 3757/1984/2428 3758/2006/2428 3759/2005/2428 -f 3760/1984/2429 3053/2007/2429 3761/2006/2429 -f 3013/1986/2430 3762/2009/2430 3763/2008/2430 -f 3764/2008/2431 3054/2007/2431 3765/1984/2431 -f 3011/1984/2422 3766/1986/2422 3767/2008/2422 -f 3768/1990/2432 3769/1992/2432 3770/1988/2432 -f 3771/2011/2433 3772/2007/2433 3773/2010/2433 -f 3774/2009/2434 3775/2010/2434 3776/2007/2434 -f 3777/2007/2435 3778/2008/2435 3779/2009/2435 -f 3780/2003/2436 3781/2014/2436 3782/2015/2436 -f 3783/2015/2437 3784/2002/2437 3785/2003/2437 -f 3786/2002/2438 3787/2015/2438 3788/1992/2438 -f 3789/1992/2439 3790/1993/2439 3791/2002/2439 -f 3792/2002/2440 3793/1993/2440 3794/2001/2440 -f 3795/2001/2441 3796/1993/2441 3797/1994/2441 -f 3798/1994/2442 3799/2000/2442 3800/2001/2442 -f 3801/2000/2443 3802/1994/2443 3803/1995/2443 -f 3804/1995/2444 3805/1999/2444 3055/2000/2444 -f 3806/1999/2445 3056/1995/2445 3807/1996/2445 -f 3808/1996/2446 3809/1997/2446 3810/1999/2446 -f 3811/1998/2447 3812/1999/2447 3813/1997/2447 -f 3814/2014/2448 3815/2003/2448 3057/2004/2448 -f 3816/2014/2449 3817/2004/2449 3818/2005/2449 -f 3819/2005/2450 3820/2006/2450 3821/2014/2450 -f 3822/2006/2451 3823/2013/2451 3824/2014/2451 -f 3825/2013/2452 3826/2006/2452 3827/2012/2452 -f 3828/2006/2453 3829/2011/2453 3830/2012/2453 -f 3831/2006/2454 3058/2007/2454 3832/2011/2454 -f 3833/2016/2445 3834/2017/2445 3835/2018/2445 -f 3836/2016/2455 3059/2019/2455 3837/2017/2455 -f 3838/2019/2456 3839/2020/2456 3840/2017/2456 -f 3841/2019/2457 3842/2021/2457 3843/2020/2457 -f 3844/2021/2458 3845/2022/2458 3846/2020/2458 -f 3847/2021/2459 3848/2023/2459 3849/2022/2459 -f 3850/2023/2460 3851/2024/2460 3852/2022/2460 -f 3853/2023/2461 3854/2025/2461 3060/2024/2461 -f 3855/2025/2462 3061/2026/2462 3060/2024/2462 -f 3856/2025/2463 3857/2027/2463 3061/2026/2463 -f 3858/2027/2464 3062/2018/2464 3061/2026/2464 -f 3859/2027/2465 3860/2016/2465 3062/2018/2465 -f 3861/2028/2466 3067/2028/2466 3862/2029/2466 -f 3863/2028/2467 3864/2029/2467 3865/2029/2467 -f 3866/2029/2468 3068/2029/2468 3867/2030/2468 -f 3868/2029/2469 3869/2030/2469 3870/2030/2469 -f 3871/2030/2470 3872/2030/2470 3873/2031/2470 -f 3874/2030/21 3063/2031/21 3064/2031/21 -f 3875/2031/21 3876/2031/21 3877/2032/21 -f 3878/2031/2471 3065/2032/2471 3879/2032/2471 -f 3880/2032/2472 3881/2032/2472 3882/2033/2472 -f 3883/2032/2473 3066/2033/2473 3884/2033/2473 -f 3885/2033/2474 3886/2033/2474 3887/2034/2474 -f 3888/2033/2475 3889/2034/2475 3890/2034/2475 -f 3891/2034/2476 3892/2034/2476 3893/2035/2476 -f 3894/2034/2477 3069/2035/2477 3070/2035/2477 -f 3895/2035/2478 3896/2035/2478 3897/2036/2478 -f 3898/2035/2479 3071/2036/2479 3899/2036/2479 -f 3900/2036/2480 3901/2036/2480 3902/2037/2480 -f 3903/2036/2481 3072/2037/2481 3904/2037/2481 -f 3905/2037/2482 3906/2037/2482 3907/2038/2482 -f 3908/2037/2483 3073/2038/2483 3909/2038/2483 -f 3910/2038/2484 3911/2038/2484 3912/2039/2484 -f 3913/2038/2485 3074/2039/2485 3914/2039/2485 -f 3915/2039/2486 3916/2039/2486 3917/2040/2486 -f 3918/2039/2487 3919/2040/2487 3920/2040/2487 -f 3921/2040/2488 3922/2040/2488 3923/2041/2488 -f 3087/2040/2489 3924/2041/2489 3925/2041/2489 -f 3926/2041/2490 3075/2041/2490 3927/2042/2490 -f 3076/2041/2491 3928/2042/2491 3929/2042/2491 -f 3930/2042/2492 3931/2042/2492 3932/2043/2492 -f 3933/2042/2493 3934/2043/2493 3935/2043/2493 -f 3936/2043/2494 3077/2043/2494 3937/2044/2494 -f 3077/2043/2495 3938/2044/2495 3939/2044/2495 -f 3078/2044/2496 3940/2044/2496 3941/2045/2496 -f 3942/2044/2497 3943/2045/2497 3944/2045/2497 -f 3079/2045/2498 3945/2045/2498 3946/2046/2498 -f 3947/2045/2499 3080/2046/2499 3948/2046/2499 -f 3080/2046/2500 3949/2046/2500 3950/2047/2500 -f 3081/2046/2501 3951/2047/2501 3952/2047/2501 -f 3953/2047/2502 3954/2047/2502 3955/2048/2502 -f 3956/2047/2503 3082/2048/2503 3957/2048/2503 -f 3082/2048/2504 3958/2048/2504 3959/2049/2504 -f 3960/2048/2505 3083/2049/2505 3961/2049/2505 -f 3962/2049/2506 3084/2049/2506 3963/2050/2506 -f 3964/2049/21 3965/2050/21 3966/2050/21 -f 3967/2050/2507 3085/2050/2507 3968/2051/2507 -f 3085/2050/2508 3969/2051/2508 3970/2051/2508 -f 3971/2051/2509 3086/2051/2509 3972/2028/2509 -f 3086/2051/2510 3973/2028/2510 3974/2028/2510 -f 3975/2030/2511 3976/2029/2511 3977/2026/2511 -f 3978/2026/2512 3979/2029/2512 3088/2028/2512 -f 3980/2028/2513 3981/2051/2513 3982/2024/2513 -f 2907/2051/2514 3983/2050/2514 3984/2024/2514 -f 2916/2050/2515 3985/2049/2515 3986/2024/2515 -f 3987/2049/2516 3988/2022/2516 3989/2024/2516 -f 2908/2049/2517 3990/2048/2517 3991/2022/2517 -f 3992/2048/2518 3993/2047/2518 3994/2022/2518 -f 2909/2022/2519 3995/2047/2519 3996/2046/2519 -f 3997/2046/2520 3998/2045/2520 3999/2022/2520 -f 2910/2026/2521 4000/2031/2521 4001/2030/2521 -f 4002/2032/63 4003/2031/63 4004/2026/63 -f 2911/2026/2522 4005/2018/2522 4006/2032/2522 -f 4007/2032/2523 4008/2018/2523 4009/2033/2523 -f 4010/2033/2524 4011/2018/2524 4012/2034/2524 -f 2912/2018/2525 4013/2035/2525 4014/2034/2525 -f 2913/2018/2526 4015/2036/2526 4016/2035/2526 -f 4017/2018/7 4018/2017/7 4019/2036/7 -f 4020/2036/2527 4021/2017/2527 2914/2037/2527 -f 4022/2037/2528 2915/2017/2528 4023/2038/2528 -f 4024/2038/2529 4025/2017/2529 4026/2039/2529 -f 4027/2017/2530 4028/2040/2530 4029/2039/2530 -f 2917/2017/2531 4030/2020/2531 4031/2040/2531 -f 4032/2020/2532 4033/2041/2532 4034/2040/2532 -f 4035/2020/2533 2918/2042/2533 4036/2041/2533 -f 4037/2020/63 4038/2043/63 4039/2042/63 -f 4040/2022/2534 4041/2045/2534 4042/2044/2534 -f 3090/2044/2535 3091/2043/2535 3089/2020/2535 -f 3096/2020/2536 3097/2022/2536 3098/2044/2536 -f 4043/2026/2537 3100/2028/2537 4044/2024/2537 -f 4045/2047/2538 3095/2043/2538 4046/2046/2538 -f 4047/2045/2539 3106/2046/2539 4048/2043/2539 -f 3095/2043/2540 3094/2044/2540 4049/2045/2540 -f 4050/2039/2541 3102/2050/2541 4051/2051/2541 -f 4052/2051/2542 3093/2038/2542 4053/2039/2542 -f 3093/2038/2543 3092/2051/2543 4054/2028/2543 -f 4055/2028/2544 4056/2029/2544 3099/2038/2544 -f 4057/2038/2545 4058/2029/2545 3101/2037/2545 -f 4059/2037/2546 4060/2029/2546 4061/2030/2546 -f 4062/2030/2547 4063/2036/2547 4064/2037/2547 -f 4065/2036/2548 3103/2030/2548 3104/2031/2548 -f 4066/2031/2549 4067/2035/2549 4068/2036/2549 -f 4069/2035/2550 4070/2031/2550 4071/2032/2550 -f 4072/2032/2551 4073/2033/2551 3105/2035/2551 -f 4074/2034/2552 4075/2035/2552 4076/2033/2552 -f 4077/2050/2553 4078/2039/2553 4079/2040/2553 -f 4080/2052/2554 3107/2053/2554 3108/2054/2554 -f 4081/2053/2555 4082/2055/2555 4083/2054/2555 -f 4084/2053/2556 3109/2056/2556 4085/2055/2556 -f 4086/2056/2557 4087/2057/2557 4088/2055/2557 -f 4089/2056/2558 3110/2058/2558 4090/2057/2558 -f 4091/2058/2559 4092/2059/2559 4093/2057/2559 -f 4094/2058/2560 3111/2060/2560 4095/2059/2560 -f 4096/2059/2561 4097/2061/2561 4098/2062/2561 -f 4099/2059/2562 3112/2063/2562 4100/2061/2562 -f 4101/2063/2551 4102/2064/2551 4103/2061/2551 -f 4104/2063/2563 4105/2065/2563 4106/2064/2563 -f 4107/2065/2564 4108/2066/2564 4109/2064/2564 -f 4110/2021/2565 3113/2067/2565 3114/2068/2565 -f 4111/2067/2566 4112/1935/2566 4113/2068/2566 -f 4114/2067/2567 3115/2069/2567 4115/1935/2567 -f 4116/2069/2568 4117/1937/2568 4118/1935/2568 -f 4119/2069/2569 3116/2070/2569 4120/1937/2569 -f 4121/1934/2570 4122/1978/2570 4123/1979/2570 -f 4124/1934/2571 3117/1936/2571 4125/1978/2571 -f 4126/1936/2572 4127/1977/2572 4128/1978/2572 -f 4129/1936/63 3118/2071/63 4130/1977/63 -f 4131/2071/2573 4132/2072/2573 4133/1977/2573 -f 4134/2071/2574 4135/2068/2574 4136/2072/2574 -f 4137/2068/2575 4138/2072/2575 4139/2072/2575 -f 4140/2068/2576 4141/2068/2576 3120/2072/2576 -f 4142/2068/2577 4143/1975/2577 3120/2072/2577 -f 4144/1977/2578 4145/2072/2578 3119/2073/2578 -f 4146/2072/2579 4147/2073/2579 3119/2073/2579 -f 4148/2072/2580 4149/2072/2580 3121/2073/2580 -f 4150/2072/2581 3122/1975/2581 3121/2073/2581 -f 4151/1974/2582 4152/1991/2582 4153/2074/2582 -f 4154/1974/2583 4155/1976/2583 4156/1991/2583 -f 4157/1976/2584 4158/1977/2584 3123/1980/2584 -f 4159/1977/2585 4160/1983/2585 3123/1980/2585 -f 4161/1977/2586 4162/2073/2586 3125/1983/2586 -f 4163/2073/63 4164/2075/63 3125/1983/63 -f 4165/2073/2587 4166/2073/2587 3124/2075/2587 -f 4167/2073/2588 4168/2076/2588 3124/2075/2588 -f 3126/2073/2589 4169/1975/2589 4170/2076/2589 -f 4171/1975/2590 3127/2074/2590 4172/2076/2590 -f 4173/1975/2591 4174/1974/2591 4175/2074/2591 -f 3128/2074/2592 4176/1989/2592 4177/2077/2592 -f 4178/2074/2593 4179/1991/2593 4180/1989/2593 -f 3129/2078/2594 4181/2079/2594 4182/1945/2594 -f 4183/1945/2595 3130/2079/2595 4184/1948/2595 -f 4185/1948/2596 4186/2079/2596 4187/2080/2596 -f 4188/2081/2597 4189/2082/2597 4190/2083/2597 -f 3131/2084/2598 4191/2085/2598 4192/2086/2598 -f 3131/2084/2599 4193/2087/2599 4194/2085/2599 -f 4195/2087/2600 4196/2088/2600 4197/2085/2600 -f 3136/2020/2601 3137/2022/2601 3138/2044/2601 -f 4198/2026/2537 3140/2028/2537 4199/2024/2537 -f 4200/2047/2538 3135/2043/2538 4201/2046/2538 -f 4202/2045/2602 3146/2046/2602 4203/2043/2602 -f 3135/2043/2603 3134/2044/2603 4204/2045/2603 -f 4205/2039/2604 3142/2050/2604 4206/2051/2604 -f 4207/2051/2605 3133/2038/2605 4208/2039/2605 -f 3133/2038/2543 3132/2051/2543 4209/2028/2543 -f 4210/2028/2606 4211/2029/2606 3139/2038/2606 -f 4212/2038/2545 4213/2029/2545 3141/2037/2545 -f 4214/2037/2607 4215/2029/2607 4216/2030/2607 -f 4217/2030/2608 4218/2036/2608 4219/2037/2608 -f 4220/2036/2609 3143/2030/2609 3144/2031/2609 -f 4221/2031/2610 4222/2035/2610 4223/2036/2610 -f 4224/2035/2550 4225/2031/2550 4226/2032/2550 -f 4227/2032/2551 4228/2033/2551 3145/2035/2551 -f 4229/2034/2611 4230/2035/2611 4231/2033/2611 -f 4232/2050/2612 4233/2039/2612 4234/2040/2612 -f 4235/2052/2613 3147/2053/2613 3148/2054/2613 -f 4236/2053/2614 4237/2055/2614 4238/2054/2614 -f 4239/2053/2556 3149/2056/2556 4240/2055/2556 -f 4241/2056/2557 4242/2057/2557 4243/2055/2557 -f 4244/2056/2615 3150/2058/2615 4245/2057/2615 -f 4246/2058/2616 4247/2059/2616 4248/2057/2616 -f 4249/2058/2617 3151/2060/2617 4250/2059/2617 -f 4251/2059/2618 4252/2061/2618 4253/2062/2618 -f 4254/2059/2562 3152/2063/2562 4255/2061/2562 -f 4256/2063/2551 4257/2064/2551 4258/2061/2551 -f 4259/2063/2619 4260/2065/2619 4261/2064/2619 -f 4262/2065/2620 4263/2066/2620 4264/2064/2620 -f 4265/2021/2621 3153/2067/2621 3154/2068/2621 -f 4266/2067/2622 4267/1935/2622 4268/2068/2622 -f 4269/2067/2567 3155/2069/2567 4270/1935/2567 -f 4271/2069/2568 4272/1937/2568 4273/1935/2568 -f 4274/2069/2623 3156/2070/2623 4275/1937/2623 -f 4276/1934/2624 4277/1978/2624 4278/1979/2624 -f 4279/1934/2625 3157/1936/2625 4280/1978/2625 -f 4281/1936/2626 4282/1977/2626 4283/1978/2626 -f 4284/1936/63 3158/2071/63 4285/1977/63 -f 4286/2071/2573 4287/2072/2573 4288/1977/2573 -f 4289/2071/2627 4290/2068/2627 4291/2072/2627 -f 4292/2068/2628 4293/2072/2628 4294/2072/2628 -f 4295/2068/2629 4296/2068/2629 3160/2072/2629 -f 4297/2068/2630 4298/1975/2630 3160/2072/2630 -f 4299/1977/2578 4300/2072/2578 3159/2073/2578 -f 4301/2072/2631 4302/2073/2631 3159/2073/2631 -f 4303/2072/2632 4304/2072/2632 3161/2073/2632 -f 4305/2072/2633 3162/1975/2633 3161/2073/2633 -f 4306/1974/2582 4307/1991/2582 4308/2074/2582 -f 4309/1974/2634 4310/1976/2634 4311/1991/2634 -f 4312/1976/2584 4313/1977/2584 3163/1980/2584 -f 4314/1977/2635 4315/1983/2635 3163/1980/2635 -f 4316/1977/2636 4317/2073/2636 3165/1983/2636 -f 4318/2073/2637 4319/2075/2637 3165/1983/2637 -f 4320/2073/2638 4321/2073/2638 3164/2075/2638 -f 4322/2073/2639 4323/2076/2639 3164/2075/2639 -f 3166/2073/2589 4324/1975/2589 4325/2076/2589 -f 4326/1975/2640 3167/2074/2640 4327/2076/2640 -f 4328/1975/2641 4329/1974/2641 4330/2074/2641 -f 3168/2074/2642 4331/1989/2642 4332/2077/2642 -f 4333/2074/2643 4334/1991/2643 4335/1989/2643 -f 3169/2078/2644 4336/2079/2644 4337/1945/2644 -f 4338/1945/2645 3170/2079/2645 4339/1948/2645 -f 4340/1948/2646 4341/2079/2646 4342/2080/2646 -f 4343/2081/2647 4344/2082/2647 4345/2083/2647 -f 3171/2084/2648 4346/2085/2648 4347/2086/2648 -f 3171/2084/2649 4348/2087/2649 4349/2085/2649 -f 4350/2087/2650 4351/2088/2650 4352/2085/2650 -f 3181/2086/363 3182/2089/363 3184/2090/363 -f 4353/2086/2651 3185/2085/2651 4354/2089/2651 -f 4355/2085/2652 3179/2091/2652 4356/2089/2652 -f 4357/2085/2653 3186/2088/2653 4358/2091/2653 -f 4359/2088/2654 3180/2092/2654 4360/2091/2654 -f 4361/2088/274 3183/2093/274 4362/2092/274 -f 3178/2092/2655 3187/2094/2655 3188/2095/2655 -f 4363/2094/2656 4364/2096/2656 4365/2095/2656 -f 4366/2094/2231 3189/2097/2231 4367/2096/2231 -f 4368/2097/2231 4369/2098/2231 4370/2096/2231 -f 4371/2097/2657 3190/2090/2657 4372/2098/2657 -f 4373/2098/2658 4374/2099/2658 4375/2100/2658 -f 4376/2098/2659 3191/2101/2659 4377/2099/2659 -f 4378/2101/2660 4379/2102/2660 4380/2099/2660 -f 4381/2101/274 3192/2103/274 4382/2102/274 -f 4383/2103/274 4384/2104/274 4385/2102/274 -f 4386/2103/2661 4387/2105/2661 4388/2104/2661 -f 4389/2105/2662 4390/2106/2662 4391/2104/2662 -f 4392/2099/2663 4393/2107/2663 3195/2108/2663 -f 4394/2099/63 4395/2102/63 4396/2107/63 -f 4397/2104/2664 3193/2106/2664 3194/2109/2664 -f 4398/2106/2665 4399/2082/2665 4400/2109/2665 -f 4401/2106/2666 4402/2083/2666 4403/2082/2666 -f 4404/2083/2667 4405/2100/2667 3196/2081/2667 -f 4406/2081/2668 4407/2110/2668 4408/2111/2668 -f 4409/2081/2669 4410/2108/2669 4411/2110/2669 -f 4412/2107/2670 4413/2112/2670 3197/2113/2670 -f 4414/2112/2671 4415/2114/2671 3197/2113/2671 -f 3198/2082/2672 4416/2111/2672 4417/2115/2672 -f 3199/2082/2673 4418/2081/2673 4419/2111/2673 -f 4420/2111/2674 4421/2116/2674 4422/2117/2674 -f 3200/2111/2675 4423/2110/2675 4424/2116/2675 -f 4425/2110/2676 4426/2118/2676 4427/2116/2676 -f 3201/2110/2677 4428/2119/2677 4429/2118/2677 -f 4430/2119/2678 4431/2120/2678 4432/2118/2678 -f 4433/2119/2679 3202/2113/2679 4434/2120/2679 -f 4435/2113/2288 4436/2121/2288 4437/2120/2288 -f 4438/2113/2680 3203/2114/2680 4439/2121/2680 -f 4440/2114/2681 4441/2122/2681 3204/2121/2681 -f 3203/2114/2682 4442/2115/2682 4443/2122/2682 -f 4444/2115/2288 4445/2117/2288 4446/2122/2288 -f 3172/2115/2683 4447/2111/2683 4448/2117/2683 -f 4449/2117/2684 3173/2123/2684 4450/2124/2684 -f 4451/2117/2685 4452/2116/2685 4453/2123/2685 -f 3174/2116/2686 4454/2125/2686 4455/2123/2686 -f 3174/2116/2687 4456/2118/2687 4457/2125/2687 -f 4458/2118/2688 3176/2126/2688 3175/2125/2688 -f 4459/2118/2689 4460/2120/2689 4461/2126/2689 -f 4462/2120/2690 3177/2127/2690 3176/2126/2690 -f 4463/2120/2691 4464/2121/2691 4465/2127/2691 -f 4466/2121/2692 4467/2128/2692 4468/2127/2692 -f 4469/2121/2693 4470/2122/2693 4471/2128/2693 -f 4472/2122/2694 4473/2124/2694 4474/2128/2694 -f 3205/1880/2695 3210/2129/2695 3211/2130/2695 -f 3205/1880/2696 3206/1879/2696 3210/2129/2696 -f 3206/1879/2697 3212/2131/2697 3210/2129/2697 -f 3208/1886/2698 3209/1891/2698 3213/2132/2698 -f 3209/1891/2699 4475/2133/2699 3213/2132/2699 -f 3209/1891/2700 4476/1896/2700 4477/2133/2700 -f 4478/1896/2701 3214/2130/2701 3215/2133/2701 -f 4479/1896/2702 4480/1880/2702 3214/2130/2702 -f 4481/2130/2697 4482/2134/2697 4483/2135/2697 -f 4484/2131/2698 4485/2136/2698 3216/2137/2698 -f 4486/2136/2703 4487/2138/2703 3216/2137/2703 -f 4488/2136/2704 4489/2132/2704 4490/2138/2704 -f 3215/2133/2705 3217/2135/2705 3218/2139/2705 -f 3215/2133/2706 3214/2130/2706 3217/2135/2706 -f 4491/2135/364 3219/2140/364 4492/2141/364 -f 4493/2135/2697 4494/2134/2697 3219/2140/2697 -f 4495/2134/2707 3220/2142/2707 3219/2140/2707 -f 4496/2134/2708 3207/2143/2708 3220/2142/2708 -f 3207/2143/2709 3221/2144/2709 3220/2142/2709 -f 3207/2143/2710 4497/2137/2710 3221/2144/2710 -f 4498/2137/274 3222/2145/274 3221/2144/274 -f 4499/2137/274 4500/2138/274 3222/2145/274 -f 4501/2138/2711 4502/2146/2711 3222/2145/2711 -f 4503/2138/2712 4504/2139/2712 4505/2146/2712 -f 4506/2142/2713 3223/2147/2713 3224/2148/2713 -f 4507/2142/2714 4508/2144/2714 3223/2147/2714 -f 4509/2144/2242 4510/2149/2242 3223/2147/2242 -f 4511/2146/2667 4512/2141/2667 3225/2150/2667 -f 4513/2150/2715 4514/2151/2715 4515/2152/2715 -f 4516/2150/2716 4517/2153/2716 4518/2151/2716 -f 4519/2153/2717 3228/2154/2717 3226/2151/2717 -f 4520/2153/2718 4521/2148/2718 3228/2154/2718 -f 4522/2148/363 4523/2155/363 3228/2154/363 -f 4524/2148/63 4525/2147/63 3227/2155/63 -f 4526/2147/2719 4527/2156/2719 3227/2155/2719 -f 4528/2147/2720 4529/2149/2720 4530/2156/2720 -f 4531/2155/2721 3229/2157/2721 3230/2158/2721 -f 4532/2155/2722 4533/2156/2722 3229/2157/2722 -f 4534/2156/2231 3231/2159/2231 3229/2157/2231 -f 4535/2156/2231 4536/2160/2231 3231/2159/2231 -f 4537/2160/2723 3232/2161/2723 3231/2159/2723 -f 4538/2160/2724 4539/2152/2724 3232/2161/2724 -f 4540/2161/2725 3233/2162/2725 4541/2163/2725 -f 4542/2161/2726 4543/2164/2726 3233/2162/2726 -f 4544/2164/274 3234/2165/274 3233/2162/274 -f 4545/2164/274 4546/2166/274 3234/2165/274 -f 4547/2166/2727 4548/2167/2727 3234/2165/2727 -f 4549/2166/2728 4550/2158/2728 4551/2167/2728 -f 3235/2158/2729 4552/2168/2729 4553/2167/2729 -f 4554/2158/2730 3236/2157/2730 4555/2168/2730 -f 3237/2157/2731 4556/2169/2731 4557/2168/2731 -f 4558/2157/2697 4559/2159/2697 4560/2169/2697 -f 3238/2159/362 4561/2163/362 4562/2169/362 -f 4563/2159/2732 4564/2161/2732 4565/2163/2732 -f 3239/2163/2733 4566/2170/2733 4567/2171/2733 -f 3240/2163/2734 4568/2162/2734 4569/2170/2734 -f 4570/2162/2735 4571/2172/2735 4572/2170/2735 -f 4573/2162/2736 4574/2165/2736 4575/2172/2736 -f 3241/2165/2737 4576/2167/2737 4577/2173/2737 -f 3242/2167/2738 4578/2174/2738 4579/2173/2738 -f 4580/2167/274 4581/2168/274 4582/2174/274 -f 3243/2168/274 4583/2175/274 4584/2174/274 -f 4585/2168/2739 4586/2169/2739 4587/2175/2739 -f 3244/2169/2740 4588/2171/2740 4589/2175/2740 -f 3244/2169/2741 4590/2163/2741 4591/2171/2741 -o dieshara -v -0.205252 3.245716 3.742707 -v -0.216276 3.245716 3.749071 -v -0.216276 3.245716 3.736342 -v -0.205252 3.118819 3.742707 -v -0.216276 3.118819 3.749071 -v -0.216276 3.118819 3.736342 -v -0.206203 3.387220 3.741983 -v -0.207522 3.387220 3.737924 -v -0.210975 3.387220 3.735415 -v -0.215244 3.387220 3.735415 -v -0.218697 3.387220 3.737924 -v -0.220016 3.387220 3.741983 -v -0.218697 3.387220 3.746043 -v -0.215244 3.387220 3.748552 -v -0.210975 3.387220 3.748552 -v -0.207522 3.387220 3.746043 -v -0.206203 3.262122 3.741983 -v -0.207522 3.262122 3.737924 -v -0.210975 3.262122 3.735415 -v -0.215244 3.262122 3.735415 -v -0.218697 3.262122 3.737924 -v -0.220016 3.262122 3.741983 -v -0.218697 3.262122 3.746043 -v -0.215244 3.262122 3.748552 -v -0.210975 3.262122 3.748552 -v -0.207522 3.262122 3.746043 -v -0.679881 3.387220 3.743565 -v -0.681200 3.387220 3.739506 -v -0.684653 3.387220 3.736997 -v -0.688922 3.387220 3.736997 -v -0.692375 3.387220 3.739506 -v -0.693694 3.387220 3.743565 -v -0.692375 3.387220 3.747625 -v -0.688922 3.387220 3.750134 -v -0.684653 3.387220 3.750134 -v -0.681200 3.387220 3.747625 -v -0.679881 3.262123 3.743565 -v -0.681200 3.262123 3.739506 -v -0.684654 3.262123 3.736997 -v -0.688922 3.262123 3.736997 -v -0.692375 3.262123 3.739506 -v -0.693694 3.262123 3.743565 -v -0.692375 3.262123 3.747625 -v -0.688922 3.262123 3.750134 -v -0.684653 3.262123 3.750134 -v -0.681200 3.262123 3.747625 -v -0.881025 3.387221 3.393770 -v -0.882344 3.387221 3.389710 -v -0.885798 3.387221 3.387201 -v -0.890066 3.387221 3.387201 -v -0.893519 3.387221 3.389710 -v -0.894838 3.387221 3.393770 -v -0.893519 3.387221 3.397829 -v -0.890066 3.387221 3.400338 -v -0.885798 3.387221 3.400338 -v -0.882344 3.387221 3.397829 -v -0.881025 3.262124 3.393770 -v -0.882344 3.262124 3.389710 -v -0.885798 3.262124 3.387201 -v -0.890066 3.262124 3.387201 -v -0.893519 3.262124 3.389710 -v -0.894838 3.262124 3.393770 -v -0.893519 3.262124 3.397829 -v -0.890066 3.262124 3.400338 -v -0.885798 3.262124 3.400338 -v -0.882344 3.262124 3.397829 -v -0.682628 3.387222 3.012104 -v -0.683946 3.387222 3.008044 -v -0.687400 3.387222 3.005535 -v -0.691668 3.387222 3.005535 -v -0.695121 3.387222 3.008044 -v -0.696440 3.387222 3.012104 -v -0.695121 3.387222 3.016163 -v -0.691668 3.387222 3.018672 -v -0.687400 3.387222 3.018672 -v -0.683946 3.387222 3.016163 -v -0.682628 3.262125 3.012104 -v -0.683946 3.262125 3.008044 -v -0.687400 3.262125 3.005535 -v -0.691668 3.262125 3.005535 -v -0.695121 3.262125 3.008044 -v -0.696440 3.262125 3.012104 -v -0.695121 3.262125 3.016163 -v -0.691668 3.262125 3.018672 -v -0.687400 3.262125 3.018672 -v -0.683946 3.262125 3.016163 -v -0.204912 3.387222 3.015418 -v -0.206232 3.387222 3.011359 -v -0.209685 3.387222 3.008850 -v -0.213953 3.387222 3.008850 -v -0.217406 3.387222 3.011359 -v -0.218725 3.387222 3.015418 -v -0.217406 3.387222 3.019477 -v -0.213953 3.387222 3.021986 -v -0.209685 3.387222 3.021986 -v -0.206232 3.387222 3.019478 -v -0.204913 3.262125 3.015418 -v -0.206232 3.262125 3.011359 -v -0.209685 3.262125 3.008850 -v -0.213953 3.262125 3.008850 -v -0.217406 3.262125 3.011359 -v -0.218725 3.262125 3.015418 -v -0.217406 3.262125 3.019477 -v -0.213953 3.262125 3.021986 -v -0.209685 3.262125 3.021986 -v -0.206232 3.262125 3.019477 -v -0.029668 3.387221 3.235538 -v -0.030987 3.387221 3.231478 -v -0.034441 3.387221 3.228969 -v -0.038709 3.387221 3.228969 -v -0.042162 3.387221 3.231478 -v -0.043481 3.387221 3.235538 -v -0.042162 3.387221 3.239597 -v -0.038709 3.387221 3.242106 -v -0.034441 3.387221 3.242106 -v -0.030987 3.387221 3.239597 -v -0.029668 3.262125 3.235538 -v -0.030987 3.262125 3.231478 -v -0.034441 3.262125 3.228969 -v -0.038709 3.262125 3.228969 -v -0.042162 3.262125 3.231478 -v -0.043481 3.262125 3.235538 -v -0.042162 3.262125 3.239597 -v -0.038709 3.262125 3.242106 -v -0.034441 3.262125 3.242106 -v -0.030987 3.262125 3.239597 -v -0.028398 3.245787 3.234976 -v -0.029717 3.245787 3.230917 -v -0.033170 3.245787 3.228408 -v -0.037439 3.245787 3.228407 -v -0.040892 3.245787 3.230917 -v -0.042211 3.245787 3.234976 -v -0.040892 3.245787 3.239035 -v -0.037439 3.245787 3.241544 -v -0.033170 3.245787 3.241544 -v -0.029717 3.245787 3.239035 -v -0.205022 3.245788 3.015661 -v -0.206341 3.245788 3.011601 -v -0.209794 3.245788 3.009092 -v -0.214063 3.245788 3.009092 -v -0.217516 3.245788 3.011601 -v -0.218835 3.245788 3.015661 -v -0.217516 3.245788 3.019720 -v -0.214063 3.245788 3.022229 -v -0.209794 3.245788 3.022229 -v -0.206341 3.245788 3.019720 -v -0.684006 3.245789 3.011274 -v -0.685325 3.245789 3.007215 -v -0.688778 3.245789 3.004705 -v -0.693047 3.245789 3.004705 -v -0.696500 3.245789 3.007214 -v -0.697819 3.245789 3.011274 -v -0.696500 3.245789 3.015333 -v -0.693047 3.245789 3.017842 -v -0.688778 3.245789 3.017842 -v -0.685325 3.245789 3.015333 -v -0.881019 3.245789 3.394308 -v -0.882338 3.245789 3.390249 -v -0.885792 3.245789 3.387740 -v -0.890060 3.245789 3.387740 -v -0.893513 3.245789 3.390249 -v -0.894832 3.245789 3.394308 -v -0.893513 3.245789 3.398368 -v -0.890060 3.245789 3.400877 -v -0.885792 3.245789 3.400877 -v -0.882338 3.245789 3.398368 -v -0.680241 3.245789 3.743258 -v -0.681560 3.245789 3.739198 -v -0.685013 3.245789 3.736689 -v -0.689281 3.245789 3.736689 -v -0.692734 3.245789 3.739198 -v -0.694053 3.245789 3.743258 -v -0.692734 3.245789 3.747317 -v -0.689281 3.245789 3.749826 -v -0.685013 3.245789 3.749826 -v -0.681560 3.245789 3.747317 -v -0.206203 3.245790 3.741984 -v -0.207522 3.245790 3.737924 -v -0.210975 3.245790 3.735415 -v -0.215244 3.245790 3.735415 -v -0.218697 3.245790 3.737924 -v -0.220016 3.245790 3.741984 -v -0.218697 3.245790 3.746043 -v -0.215244 3.245790 3.748552 -v -0.210975 3.245790 3.748552 -v -0.207522 3.245790 3.746043 -v -0.034618 3.245790 3.514323 -v -0.035937 3.245790 3.510264 -v -0.039390 3.245790 3.507755 -v -0.043659 3.245790 3.507755 -v -0.047112 3.245790 3.510264 -v -0.048431 3.245790 3.514323 -v -0.047112 3.245790 3.518383 -v -0.043659 3.245790 3.520892 -v -0.039390 3.245790 3.520892 -v -0.035937 3.245790 3.518383 -v 0.284792 3.262126 3.243422 -v 0.259520 3.262126 3.226256 -v 0.259520 3.262126 3.243422 -v 0.284792 3.262126 3.226256 -v 0.259520 3.245787 3.226256 -v 0.284792 3.245787 3.226256 -v 0.259520 3.245787 3.243422 -v 0.284792 3.245787 3.243422 -v 0.243297 3.262126 3.226256 -v 0.243297 3.262126 3.243422 -v 0.243297 3.245787 3.226256 -v 0.243297 3.245787 3.243422 -v 0.214357 3.262126 3.226256 -v 0.214357 3.262126 3.243422 -v 0.214357 3.245787 3.226256 -v 0.214357 3.245787 3.243422 -v 0.185533 3.262126 3.226256 -v 0.185533 3.262126 3.243422 -v 0.185533 3.245787 3.226256 -v 0.185533 3.245787 3.243422 -v 0.156862 3.262125 3.226256 -v 0.156862 3.262126 3.243421 -v 0.156862 3.245787 3.226256 -v 0.156862 3.245787 3.243421 -v 0.128382 3.262125 3.226256 -v 0.128382 3.262125 3.243422 -v 0.128382 3.245787 3.226256 -v 0.128382 3.245787 3.243421 -v 0.100132 3.262125 3.226256 -v 0.100132 3.262125 3.243421 -v 0.100132 3.245787 3.226256 -v 0.100132 3.245787 3.243421 -v 0.072150 3.262125 3.226256 -v 0.072150 3.262125 3.243421 -v 0.072150 3.245787 3.226256 -v 0.072150 3.245787 3.243421 -v 0.044475 3.262125 3.226256 -v 0.044475 3.262125 3.243421 -v 0.044475 3.245787 3.226256 -v 0.044475 3.245787 3.243421 -v 0.017144 3.262125 3.226256 -v 0.017144 3.262125 3.243421 -v 0.017144 3.245787 3.226256 -v 0.017144 3.245787 3.243421 -v -0.009803 3.262125 3.226256 -v -0.009803 3.262125 3.243421 -v -0.009803 3.245787 3.226256 -v -0.009803 3.245787 3.243421 -v -0.030544 3.262125 3.226463 -v -0.030544 3.245787 3.226463 -v -0.040496 3.262125 3.243532 -v -0.040496 3.245787 3.243532 -v -0.048924 3.245787 3.191907 -v -0.048924 3.262125 3.191907 -v -0.063603 3.245787 3.200301 -v -0.063603 3.262125 3.200301 -v -0.071262 3.262125 3.154022 -v -0.085398 3.262125 3.163335 -v -0.071262 3.245788 3.154022 -v -0.085398 3.245788 3.163335 -v -0.096033 3.262125 3.117762 -v -0.109477 3.262125 3.128085 -v -0.096033 3.245788 3.117762 -v -0.109477 3.245788 3.128085 -v -0.123474 3.262125 3.083504 -v -0.136054 3.262125 3.094904 -v -0.123474 3.245788 3.083504 -v -0.136054 3.245788 3.094904 -v -0.153822 3.262125 3.051628 -v -0.165346 3.262125 3.064136 -v -0.153822 3.245788 3.051628 -v -0.165346 3.245788 3.064136 -v -0.187307 3.262125 3.022520 -v -0.197574 3.262125 3.036119 -v -0.187307 3.245788 3.022520 -v -0.197574 3.245788 3.036119 -v -0.224147 3.245788 2.996572 -v -0.224147 3.262125 2.996572 -v -0.232970 3.262125 3.011187 -v -0.232970 3.245788 3.011187 -v -0.264553 3.262125 2.974174 -v -0.271778 3.262125 2.989675 -v -0.264553 3.245788 2.974174 -v -0.271778 3.245788 2.989675 -v -0.308721 3.262125 2.955713 -v -0.314251 3.262125 2.971923 -v -0.308721 3.245788 2.955713 -v -0.314251 3.245788 2.971923 -v -0.356845 3.262125 2.941563 -v -0.360649 3.262125 2.958282 -v -0.356845 3.245788 2.941563 -v -0.360649 3.245788 2.958282 -v -0.409118 3.262125 2.932087 -v -0.411230 3.262125 2.949114 -v -0.409118 3.245788 2.932087 -v -0.411230 3.245788 2.949114 -v -0.466206 3.262125 2.927636 -v -0.465779 3.262125 2.944794 -v -0.466206 3.245788 2.927636 -v -0.465779 3.245788 2.944794 -v -0.529976 3.262125 2.936305 -v -0.526731 3.262125 2.953146 -v -0.529976 3.245788 2.936306 -v -0.526731 3.245788 2.953146 -v -0.589490 3.262125 2.952163 -v -0.584227 3.262125 2.968465 -v -0.589490 3.245789 2.952163 -v -0.584227 3.245789 2.968465 -v -0.644802 3.262125 2.974759 -v -0.637564 3.262125 2.990253 -v -0.644802 3.245789 2.974759 -v -0.637564 3.245789 2.990253 -v -0.695562 3.262125 3.003613 -v -0.695562 3.245789 3.003613 -v -0.686442 3.245789 3.018036 -v -0.686442 3.262125 3.018036 -v -0.741423 3.245789 3.038244 -v -0.741423 3.262125 3.038244 -v -0.730557 3.245789 3.051347 -v -0.730557 3.262125 3.051347 -v -0.782041 3.262125 3.078164 -v -0.769605 3.262125 3.089724 -v -0.782041 3.245789 3.078164 -v -0.769605 3.245789 3.089724 -v -0.817074 3.262125 3.122883 -v -0.803277 3.262125 3.132705 -v -0.817074 3.245789 3.122883 -v -0.803277 3.245789 3.132705 -v -0.846186 3.262125 3.171909 -v -0.831261 3.262125 3.179834 -v -0.846186 3.245789 3.171909 -v -0.831261 3.245789 3.179834 -v -0.869040 3.262124 3.224748 -v -0.853242 3.262124 3.230654 -v -0.869040 3.245789 3.224748 -v -0.853242 3.245789 3.230654 -v -0.885307 3.262124 3.280902 -v -0.868901 3.262124 3.284711 -v -0.885307 3.245789 3.280902 -v -0.868901 3.245789 3.284711 -v -0.894660 3.262124 3.339877 -v -0.877915 3.262124 3.341551 -v -0.894660 3.245789 3.339877 -v -0.877915 3.245789 3.341551 -v -0.896754 3.245789 3.401602 -v -0.896754 3.262124 3.401602 -v -0.879978 3.262124 3.400293 -v -0.879978 3.245789 3.400293 -v -0.886838 3.262124 3.456983 -v -0.870454 3.262124 3.453084 -v -0.886838 3.245789 3.456983 -v -0.870454 3.245789 3.453084 -v -0.871997 3.262124 3.510005 -v -0.856069 3.262124 3.504477 -v -0.871997 3.245789 3.510005 -v -0.856069 3.245789 3.504477 -v -0.852213 3.262123 3.560639 -v -0.836931 3.262123 3.553460 -v -0.852213 3.245789 3.560639 -v -0.836931 3.245789 3.553460 -v -0.827519 3.262123 3.608358 -v -0.813096 3.262123 3.599522 -v -0.827519 3.245789 3.608358 -v -0.813096 3.245789 3.599522 -v -0.797948 3.262123 3.652627 -v -0.784621 3.262123 3.642153 -v -0.797948 3.245789 3.652627 -v -0.784621 3.245789 3.642153 -v -0.763539 3.262123 3.692903 -v -0.751557 3.262123 3.680856 -v -0.763539 3.245789 3.692902 -v -0.751557 3.245789 3.680856 -v -0.724334 3.262123 3.728637 -v -0.713949 3.262123 3.715136 -v -0.724334 3.245789 3.728637 -v -0.713949 3.245789 3.715136 -v -0.680392 3.245789 3.759278 -v -0.680392 3.262123 3.759278 -v -0.671831 3.262123 3.744505 -v -0.671831 3.245789 3.744505 -v -0.631781 3.262123 3.784274 -v -0.625221 3.262123 3.768472 -v -0.631781 3.245789 3.784274 -v -0.625221 3.245789 3.768472 -v -0.578584 3.262123 3.803084 -v -0.574128 3.262123 3.786537 -v -0.578584 3.245789 3.803084 -v -0.574128 3.245789 3.786537 -v -0.520888 3.262123 3.815180 -v -0.518553 3.262123 3.798187 -v -0.520888 3.245789 3.815180 -v -0.518553 3.245789 3.798187 -v -0.458851 3.262123 3.820048 -v -0.458429 3.262123 3.802893 -v -0.458851 3.245789 3.820048 -v -0.458429 3.245789 3.802893 -v -0.405006 3.262122 3.818570 -v -0.406488 3.262122 3.801477 -v -0.405006 3.245789 3.818570 -v -0.406488 3.245789 3.801477 -v -0.353588 3.262122 3.810728 -v -0.357075 3.262122 3.793941 -v -0.353588 3.245789 3.810728 -v -0.357075 3.245789 3.793941 -v -0.304946 3.262122 3.797126 -v -0.310338 3.262122 3.780872 -v -0.304946 3.245789 3.797126 -v -0.310338 3.245790 3.780872 -v -0.259343 3.262122 3.778374 -v -0.266508 3.262122 3.762849 -v -0.259343 3.245789 3.778374 -v -0.266508 3.245790 3.762849 -v -0.217037 3.262122 3.755083 -v -0.225826 3.262122 3.740452 -v -0.217037 3.245790 3.755083 -v -0.225826 3.245790 3.740452 -v -0.178276 3.245790 3.727859 -v -0.178275 3.262122 3.727859 -v -0.188539 3.262122 3.714264 -v -0.188539 3.245790 3.714264 -v -0.143304 3.262122 3.697305 -v -0.154900 3.262122 3.684873 -v -0.143304 3.245790 3.697305 -v -0.154900 3.245790 3.684873 -v -0.112366 3.262122 3.664016 -v -0.125160 3.262122 3.652875 -v -0.112366 3.245790 3.664016 -v -0.125161 3.245790 3.652875 -v -0.085706 3.262122 3.628582 -v -0.099574 3.262122 3.618870 -v -0.085706 3.245790 3.628582 -v -0.099574 3.245790 3.618870 -v -0.063569 3.262122 3.591585 -v -0.078389 3.262122 3.583466 -v -0.063569 3.245790 3.591585 -v -0.078389 3.245790 3.583466 -v -0.046212 3.262122 3.553601 -v -0.061850 3.262122 3.547277 -v -0.046212 3.245790 3.553601 -v -0.061850 3.245790 3.547277 -v -0.035721 3.262122 3.522561 -v -0.047433 3.262122 3.504187 -v -0.035721 3.245790 3.522561 -v -0.047433 3.245790 3.504187 -v -0.015910 3.262122 3.522476 -v -0.016229 3.262122 3.504577 -v -0.015910 3.245790 3.522476 -v -0.016229 3.245790 3.504577 -v 0.010685 3.262122 3.522476 -v 0.010484 3.262122 3.504565 -v 0.010685 3.245790 3.522476 -v 0.010484 3.245790 3.504565 -v 0.037908 3.262122 3.522476 -v 0.037809 3.262122 3.504558 -v 0.037908 3.245790 3.522476 -v 0.037809 3.245790 3.504558 -v 0.065696 3.262122 3.522476 -v 0.065685 3.262122 3.504555 -v 0.065696 3.245790 3.522476 -v 0.065685 3.245790 3.504555 -v 0.093987 3.262122 3.522476 -v 0.094050 3.262122 3.504557 -v 0.093987 3.245790 3.522476 -v 0.094050 3.245790 3.504557 -v 0.122718 3.262122 3.522476 -v 0.122844 3.262122 3.504561 -v 0.122718 3.245790 3.522476 -v 0.122844 3.245790 3.504561 -v 0.151826 3.262122 3.522476 -v 0.152004 3.262122 3.504569 -v 0.151826 3.245790 3.522476 -v 0.152004 3.245790 3.504569 -v 0.181249 3.262122 3.522477 -v 0.181469 3.262122 3.504580 -v 0.181249 3.245790 3.522477 -v 0.181469 3.245790 3.504580 -v 0.210926 3.262122 3.522477 -v 0.211177 3.262122 3.504592 -v 0.210926 3.245790 3.522477 -v 0.211177 3.245790 3.504592 -v 0.240793 3.262122 3.522478 -v 0.241065 3.262122 3.504606 -v 0.240793 3.245790 3.522478 -v 0.241065 3.245790 3.504607 -v 0.257997 3.262122 3.522478 -v 0.258280 3.262122 3.504621 -v 0.257997 3.245790 3.522478 -v 0.258280 3.245790 3.504621 -v 0.284467 3.262122 3.523059 -v 0.284373 3.262122 3.504870 -v 0.284467 3.245790 3.523059 -v 0.284373 3.245790 3.507518 -v -0.034791 3.387363 3.514364 -v -0.036109 3.387364 3.510304 -v -0.039563 3.387364 3.507795 -v -0.043831 3.387364 3.507795 -v -0.047284 3.387364 3.510304 -v -0.048603 3.387365 3.514364 -v -0.047284 3.387364 3.518423 -v -0.043831 3.387364 3.520932 -v -0.039563 3.387363 3.520932 -v -0.036109 3.387363 3.518423 -v -0.897977 3.403733 3.400838 -v -0.878715 3.403806 3.336111 -v -0.895821 3.403806 3.334201 -v -0.881836 3.403733 3.400838 -v -0.878715 3.387264 3.336111 -v -0.881837 3.387337 3.400838 -v -0.895821 3.387264 3.334201 -v -0.897978 3.387336 3.400838 -v -0.867843 3.403804 3.274055 -v -0.884532 3.403804 3.269795 -v -0.867843 3.387266 3.274055 -v -0.884532 3.387266 3.269795 -v -0.849117 3.403800 3.215166 -v -0.865072 3.403800 3.208618 -v -0.849117 3.387269 3.215166 -v -0.865072 3.387269 3.208619 -v -0.822961 3.403798 3.160172 -v -0.837871 3.403798 3.151441 -v -0.822961 3.387272 3.160172 -v -0.837871 3.387272 3.151441 -v -0.789799 3.403796 3.109801 -v -0.803358 3.403796 3.099029 -v -0.789799 3.387275 3.109801 -v -0.803358 3.387275 3.099029 -v -0.750053 3.403794 3.064780 -v -0.761967 3.403793 3.052154 -v -0.750053 3.387277 3.064780 -v -0.761967 3.387277 3.052154 -v -0.704138 3.403790 3.025832 -v -0.714135 3.403790 3.011588 -v -0.704138 3.387279 3.025832 -v -0.714135 3.387279 3.011588 -v -0.652463 3.403788 2.993680 -v -0.660309 3.403788 2.978104 -v -0.652463 3.387282 2.993680 -v -0.660309 3.387283 2.978104 -v -0.595428 3.403785 2.969051 -v -0.600944 3.403785 2.952474 -v -0.595427 3.387285 2.969051 -v -0.600944 3.387285 2.952474 -v -0.533420 3.403783 2.952676 -v -0.536505 3.403784 2.935461 -v -0.533420 3.387287 2.952676 -v -0.536505 3.387288 2.935461 -v -0.467084 3.403780 2.945306 -v -0.467201 3.403781 2.927811 -v -0.467084 3.387290 2.945306 -v -0.467201 3.387290 2.927811 -v -0.407494 3.403779 2.950058 -v -0.405304 3.403779 2.932710 -v -0.407495 3.387292 2.950057 -v -0.405304 3.387292 2.932710 -v -0.352922 3.403777 2.960197 -v -0.348926 3.403777 2.943193 -v -0.352921 3.387295 2.960197 -v -0.348925 3.387295 2.943193 -v -0.303357 3.403774 2.975363 -v -0.297479 3.403774 2.958941 -v -0.303357 3.387296 2.975363 -v -0.297479 3.387296 2.958941 -v -0.258460 3.403773 2.995206 -v -0.250709 3.403773 2.979618 -v -0.258460 3.387299 2.995206 -v -0.250709 3.387299 2.979618 -v -0.217887 3.403770 3.019398 -v -0.208365 3.403770 3.004872 -v -0.217887 3.387300 3.019398 -v -0.208365 3.387300 3.004872 -v -0.181299 3.403768 3.047629 -v -0.170191 3.403768 3.034332 -v -0.181299 3.387302 3.047629 -v -0.170191 3.387302 3.034332 -v -0.148374 3.403765 3.079597 -v -0.135915 3.403766 3.067616 -v -0.148374 3.387304 3.079597 -v -0.135915 3.387304 3.067616 -v -0.118806 3.403764 3.115002 -v -0.105247 3.403764 3.104342 -v -0.118806 3.387307 3.115002 -v -0.105247 3.387307 3.104342 -v -0.092305 3.403762 3.153536 -v -0.077881 3.403762 3.144137 -v -0.092305 3.387308 3.153536 -v -0.077882 3.387308 3.144137 -v -0.068589 3.403759 3.194881 -v -0.053507 3.403759 3.186636 -v -0.068589 3.387310 3.194881 -v -0.053507 3.387310 3.186636 -v -0.044226 3.403758 3.243448 -v -0.034330 3.403758 3.226375 -v -0.044226 3.387312 3.243448 -v -0.034330 3.387312 3.226375 -v -0.009815 3.403756 3.243817 -v -0.009816 3.403756 3.226373 -v -0.009813 3.387314 3.243818 -v -0.009815 3.387314 3.226374 -v 0.022104 3.403755 3.243811 -v 0.022102 3.403754 3.226371 -v 0.022106 3.387316 3.243812 -v 0.022104 3.387315 3.226372 -v 0.055940 3.403753 3.243804 -v 0.055938 3.403752 3.226367 -v 0.055942 3.387317 3.243804 -v 0.055940 3.387316 3.226367 -v 0.091472 3.403751 3.243795 -v 0.091470 3.403750 3.226361 -v 0.091474 3.387318 3.243795 -v 0.091472 3.387318 3.226362 -v 0.128477 3.403750 3.243785 -v 0.128476 3.403750 3.226355 -v 0.128479 3.387320 3.243786 -v 0.128477 3.387320 3.226355 -v 0.166736 3.403749 3.243775 -v 0.166734 3.403748 3.226348 -v 0.166738 3.387322 3.243776 -v 0.166736 3.387321 3.226348 -v 0.206025 3.403747 3.243765 -v 0.206024 3.403747 3.226341 -v 0.206027 3.387323 3.243766 -v 0.206026 3.387323 3.226342 -v 0.246124 3.403745 3.243757 -v 0.246122 3.403745 3.226336 -v 0.246126 3.387325 3.243757 -v 0.246124 3.387324 3.226336 -v 0.286810 3.403744 3.243749 -v 0.286809 3.403744 3.226331 -v 0.286812 3.387326 3.243749 -v 0.286811 3.387326 3.226332 -v 0.327863 3.403743 3.243743 -v 0.327861 3.403742 3.226329 -v 0.327865 3.387328 3.243744 -v 0.327863 3.387327 3.226330 -v 0.369072 3.403741 3.243740 -v 0.369045 3.403740 3.226329 -v 0.369074 3.387329 3.243741 -v 0.369047 3.387329 3.226330 -v 0.389608 3.403740 3.245059 -v 0.392026 3.403740 3.227825 -v 0.389610 3.387331 3.245060 -v 0.392028 3.387330 3.227826 -v 0.408457 3.403739 3.249382 -v 0.413538 3.403739 3.232763 -v 0.408460 3.387331 3.249383 -v 0.413540 3.387331 3.232764 -v 0.425682 3.403738 3.256446 -v 0.433310 3.403738 3.240876 -v 0.425683 3.387332 3.256447 -v 0.433312 3.387331 3.240877 -v 0.441232 3.403737 3.266013 -v 0.451177 3.403737 3.251870 -v 0.441233 3.387332 3.266015 -v 0.451179 3.387332 3.251872 -v 0.455044 3.403737 3.277862 -v 0.466993 3.403736 3.265438 -v 0.455045 3.387334 3.277864 -v 0.466994 3.387333 3.265440 -v 0.467029 3.403736 3.291773 -v 0.480633 3.403735 3.281270 -v 0.467029 3.387334 3.291773 -v 0.480633 3.387334 3.281271 -v 0.477081 3.403735 3.307518 -v 0.491990 3.403734 3.299059 -v 0.477081 3.387335 3.307519 -v 0.491991 3.387335 3.299061 -v 0.485086 3.403734 3.324862 -v 0.500970 3.403733 3.318515 -v 0.485086 3.387336 3.324863 -v 0.500969 3.387335 3.318515 -v 0.490925 3.403733 3.343559 -v 0.507476 3.403733 3.339351 -v 0.490925 3.387337 3.343560 -v 0.507475 3.387336 3.339351 -v 0.494481 3.403732 3.363354 -v 0.511416 3.403732 3.361290 -v 0.494480 3.387338 3.363355 -v 0.511415 3.387337 3.361291 -v 0.495639 3.403732 3.383988 -v 0.512692 3.403731 3.384063 -v 0.495638 3.387338 3.383990 -v 0.512691 3.387338 3.384065 -v 0.494190 3.403731 3.403972 -v 0.511059 3.403730 3.406520 -v 0.494189 3.387339 3.403972 -v 0.511058 3.387338 3.406520 -v 0.490162 3.403731 3.422238 -v 0.506461 3.403729 3.427344 -v 0.490161 3.387341 3.422238 -v 0.506460 3.387339 3.427344 -v 0.483777 3.403730 3.438778 -v 0.499101 3.403729 3.446400 -v 0.483775 3.387341 3.438780 -v 0.499099 3.387340 3.446401 -v 0.475233 3.403729 3.453587 -v 0.489201 3.403728 3.463554 -v 0.475230 3.387342 3.453588 -v 0.489198 3.387341 3.463555 -v 0.464709 3.403728 3.466645 -v 0.477006 3.403727 3.478683 -v 0.464707 3.387342 3.466645 -v 0.477003 3.387341 3.478684 -v 0.452373 3.403728 3.477911 -v 0.462771 3.403726 3.491684 -v 0.452371 3.387344 3.477911 -v 0.462769 3.387342 3.491684 -v 0.438393 3.403727 3.487329 -v 0.446755 3.403726 3.502474 -v 0.438391 3.387344 3.487329 -v 0.446752 3.387342 3.502473 -v 0.422939 3.403726 3.494823 -v 0.429205 3.403724 3.510984 -v 0.422938 3.387345 3.494822 -v 0.429204 3.387344 3.510983 -v 0.406200 3.403725 3.500308 -v 0.410363 3.403724 3.517158 -v 0.406199 3.387346 3.500306 -v 0.410362 3.387345 3.517156 -v 0.388366 3.403724 3.503696 -v 0.390457 3.403723 3.520940 -v 0.388364 3.387347 3.503694 -v 0.390455 3.387345 3.520938 -v 0.369579 3.403723 3.504902 -v 0.369770 3.403722 3.522274 -v 0.369577 3.387347 3.504900 -v 0.369769 3.387346 3.522272 -v 0.341038 3.403723 3.505027 -v 0.341138 3.403721 3.522397 -v 0.341034 3.387349 3.505025 -v 0.341134 3.387348 3.522395 -v 0.307508 3.403721 3.504871 -v 0.307542 3.403719 3.522238 -v 0.307505 3.387350 3.504869 -v 0.307539 3.387348 3.522237 -v 0.270053 3.403719 3.504832 -v 0.270042 3.403717 3.522183 -v 0.270051 3.387352 3.504832 -v 0.270040 3.387350 3.522183 -v 0.229737 3.403717 3.504830 -v 0.229695 3.403715 3.522181 -v 0.229735 3.387353 3.504830 -v 0.229692 3.387352 3.522181 -v 0.187622 3.403716 3.504826 -v 0.187556 3.403715 3.522177 -v 0.187621 3.387355 3.504826 -v 0.187555 3.387353 3.522177 -v 0.144769 3.403715 3.504821 -v 0.144685 3.403713 3.522172 -v 0.144767 3.387357 3.504820 -v 0.144684 3.387355 3.522171 -v 0.102240 3.403713 3.504813 -v 0.102142 3.403711 3.522166 -v 0.102238 3.387358 3.504813 -v 0.102141 3.387357 3.522165 -v 0.061094 3.403711 3.504806 -v 0.060986 3.403709 3.522159 -v 0.061093 3.387359 3.504806 -v 0.060985 3.387357 3.522158 -v 0.022391 3.403710 3.504798 -v 0.022277 3.403708 3.522151 -v 0.022390 3.387361 3.504798 -v 0.022276 3.387360 3.522151 -v -0.012810 3.403708 3.504791 -v -0.012924 3.403706 3.522145 -v -0.012811 3.387363 3.504791 -v -0.012925 3.387361 3.522144 -v -0.048399 3.403707 3.504735 -v -0.036162 3.403705 3.522184 -v -0.048400 3.387364 3.504734 -v -0.036164 3.387363 3.522183 -v -0.064707 3.403705 3.549778 -v -0.048984 3.403703 3.556363 -v -0.064709 3.387367 3.549779 -v -0.048986 3.387365 3.556363 -v -0.083518 3.403702 3.589091 -v -0.068733 3.403701 3.597631 -v -0.083521 3.387368 3.589092 -v -0.068735 3.387366 3.597631 -v -0.107852 3.403701 3.627356 -v -0.094157 3.403699 3.637607 -v -0.107854 3.387370 3.627356 -v -0.094159 3.387369 3.637607 -v -0.137374 3.403698 3.663773 -v -0.124913 3.403697 3.675541 -v -0.137376 3.387372 3.663773 -v -0.124915 3.387371 3.675541 -v -0.171746 3.403696 3.697555 -v -0.160666 3.403694 3.710676 -v -0.171748 3.387374 3.697554 -v -0.160668 3.387372 3.710675 -v -0.210624 3.403694 3.727921 -v -0.201085 3.403692 3.742241 -v -0.210626 3.387377 3.727921 -v -0.201087 3.387374 3.742240 -v -0.253662 3.403692 3.754103 -v -0.245838 3.403690 3.769461 -v -0.253663 3.387378 3.754102 -v -0.245838 3.387377 3.769460 -v -0.300521 3.403690 3.775338 -v -0.294588 3.403688 3.791548 -v -0.300523 3.387380 3.775337 -v -0.294590 3.387379 3.791547 -v -0.350870 3.403688 3.790871 -v -0.346994 3.403687 3.807711 -v -0.350871 3.387382 3.790869 -v -0.346995 3.387380 3.807710 -v -0.404387 3.403686 3.799948 -v -0.402699 3.403684 3.817156 -v -0.404387 3.387385 3.799946 -v -0.402700 3.387383 3.817154 -v -0.460839 3.403684 3.801810 -v -0.461261 3.403682 3.819094 -v -0.460840 3.387387 3.801808 -v -0.461262 3.387385 3.819093 -v -0.526396 3.403682 3.796171 -v -0.528992 3.403680 3.813252 -v -0.526397 3.387389 3.796169 -v -0.528992 3.387387 3.813250 -v -0.587176 3.403679 3.782070 -v -0.592096 3.403678 3.798605 -v -0.587176 3.387392 3.782068 -v -0.592096 3.387390 3.798603 -v -0.643018 3.403677 3.760283 -v -0.650180 3.403675 3.775937 -v -0.643018 3.387394 3.760281 -v -0.650180 3.387392 3.775934 -v -0.693684 3.403674 3.731570 -v -0.702931 3.403672 3.746037 -v -0.693684 3.387396 3.731568 -v -0.702931 3.387394 3.746035 -v -0.738925 3.403672 3.696689 -v -0.750044 3.403670 3.709709 -v -0.738925 3.387398 3.696687 -v -0.750043 3.387396 3.709707 -v -0.778483 3.403670 3.656393 -v -0.791225 3.403667 3.667752 -v -0.778482 3.387402 3.656391 -v -0.791225 3.387399 3.667749 -v -0.812087 3.403667 3.611438 -v -0.826192 3.403665 3.620966 -v -0.812086 3.387403 3.611436 -v -0.826191 3.387402 3.620965 -v -0.839463 3.403665 3.562584 -v -0.854664 3.403663 3.570148 -v -0.839462 3.387406 3.562582 -v -0.854663 3.387404 3.570146 -v -0.860336 3.403663 3.510597 -v -0.876366 3.403661 3.516085 -v -0.860335 3.387409 3.510596 -v -0.876364 3.387407 3.516083 -v -0.874431 3.403660 3.456248 -v -0.891019 3.403658 3.459564 -v -0.874429 3.387411 3.456247 -v -0.891017 3.387409 3.459563 -v -0.679256 3.245716 3.743027 -v -0.690281 3.245716 3.749392 -v -0.690281 3.245716 3.736662 -v -0.679256 3.118819 3.743027 -v -0.690281 3.118819 3.749392 -v -0.690281 3.118819 3.736662 -v -0.880437 3.245716 3.393795 -v -0.891462 3.245716 3.400160 -v -0.891462 3.245716 3.387431 -v -0.880437 3.118819 3.393795 -v -0.891462 3.118819 3.400160 -v -0.891462 3.118819 3.387431 -v -0.679256 3.387444 3.743027 -v -0.690281 3.387444 3.749392 -v -0.690281 3.387444 3.736662 -v -0.679256 3.261928 3.743027 -v -0.690281 3.261928 3.749392 -v -0.690281 3.261928 3.736662 -v -0.682661 3.245716 3.011692 -v -0.693685 3.245716 3.018057 -v -0.693685 3.245716 3.005327 -v -0.682661 3.118819 3.011692 -v -0.693685 3.118819 3.018057 -v -0.693685 3.118819 3.005327 -v -0.205252 3.387444 3.742707 -v -0.216276 3.387444 3.749071 -v -0.216276 3.387444 3.736342 -v -0.205252 3.261928 3.742707 -v -0.216276 3.261928 3.749071 -v -0.216276 3.261928 3.736342 -v -0.204039 3.245716 3.014293 -v -0.215063 3.245716 3.020658 -v -0.215063 3.245716 3.007928 -v -0.204039 3.118819 3.014293 -v -0.215063 3.118819 3.020658 -v -0.215063 3.118819 3.007928 -v -0.034328 3.387444 3.514317 -v -0.045353 3.387444 3.520681 -v -0.045353 3.387444 3.507952 -v -0.034328 3.261928 3.514317 -v -0.045353 3.261928 3.520681 -v -0.045353 3.261928 3.507952 -v -0.028292 3.245716 3.234825 -v -0.039316 3.245716 3.241190 -v -0.039316 3.245716 3.228460 -v -0.028292 3.118819 3.234825 -v -0.039316 3.118819 3.241190 -v -0.039316 3.118819 3.228460 -v -0.034328 3.245716 3.514317 -v -0.045353 3.245716 3.520681 -v -0.045353 3.245716 3.507952 -v -0.034328 3.118819 3.514317 -v -0.045353 3.118819 3.520681 -v -0.045353 3.118819 3.507952 -v -0.028292 3.387444 3.234825 -v -0.039316 3.387444 3.241190 -v -0.039316 3.387444 3.228460 -v -0.028292 3.261928 3.234825 -v -0.039316 3.261928 3.241190 -v -0.039316 3.261928 3.228460 -v -0.204039 3.387444 3.014293 -v -0.215063 3.387444 3.020658 -v -0.215063 3.387444 3.007928 -v -0.204039 3.261928 3.014293 -v -0.215063 3.261928 3.020658 -v -0.215063 3.261928 3.007928 -v -0.682661 3.387444 3.011692 -v -0.693685 3.387444 3.018057 -v -0.693685 3.387444 3.005327 -v -0.682661 3.261928 3.011692 -v -0.693685 3.261928 3.018057 -v -0.693685 3.261928 3.005327 -v -0.880437 3.387444 3.393795 -v -0.891462 3.387444 3.400160 -v -0.891462 3.387444 3.387431 -v -0.880437 3.261928 3.393795 -v -0.891462 3.261928 3.400160 -v -0.891462 3.261928 3.387431 -v -0.210975 3.387220 3.735415 -v -0.206203 3.387220 3.741983 -v -0.206203 3.387220 3.741983 -v -0.218697 3.387220 3.737924 -v -0.206203 3.387220 3.741983 -v -0.220016 3.387220 3.741983 -v -0.206203 3.387220 3.741983 -v -0.218697 3.387220 3.746043 -v -0.206203 3.387220 3.741983 -v -0.206203 3.387220 3.741983 -v -0.210975 3.387220 3.748552 -v -0.684653 3.387220 3.736997 -v -0.679881 3.387220 3.743565 -v -0.679881 3.387220 3.743565 -v -0.692375 3.387220 3.739506 -v -0.679881 3.387220 3.743565 -v -0.693694 3.387220 3.743565 -v -0.679881 3.387220 3.743565 -v -0.692375 3.387220 3.747625 -v -0.684653 3.387220 3.750134 -v -0.885798 3.387221 3.387201 -v -0.881025 3.387221 3.393770 -v -0.881025 3.387221 3.393770 -v -0.893519 3.387221 3.389710 -v -0.881025 3.387221 3.393770 -v -0.894838 3.387221 3.393770 -v -0.881025 3.387221 3.393770 -v -0.893519 3.387221 3.397829 -v -0.881025 3.387221 3.393770 -v -0.890066 3.387221 3.400338 -v -0.881025 3.387221 3.393770 -v -0.885798 3.387221 3.400338 -v -0.687400 3.387222 3.005535 -v -0.682628 3.387222 3.012104 -v -0.682628 3.387222 3.012104 -v -0.695121 3.387222 3.008044 -v -0.682628 3.387222 3.012104 -v -0.696440 3.387222 3.012104 -v -0.682628 3.387222 3.012104 -v -0.695121 3.387222 3.016163 -v -0.687400 3.387222 3.018672 -v -0.209685 3.387222 3.008850 -v -0.204912 3.387222 3.015418 -v -0.204912 3.387222 3.015418 -v -0.217406 3.387222 3.011359 -v -0.204912 3.387222 3.015418 -v -0.218725 3.387222 3.015418 -v -0.204912 3.387222 3.015418 -v -0.217406 3.387222 3.019477 -v -0.204912 3.387222 3.015418 -v -0.204912 3.387222 3.015418 -v -0.209685 3.387222 3.021986 -v -0.034441 3.387221 3.228969 -v -0.029668 3.387221 3.235538 -v -0.029668 3.387221 3.235538 -v -0.042162 3.387221 3.231478 -v -0.029668 3.387221 3.235538 -v -0.043481 3.387221 3.235538 -v -0.029668 3.387221 3.235538 -v -0.042162 3.387221 3.239597 -v -0.034441 3.387221 3.242106 -v 0.284792 3.262126 3.226256 -v 0.259520 3.262126 3.226256 -v 0.284792 3.262126 3.226256 -v 0.259520 3.262126 3.243422 -v 0.284792 3.262126 3.243422 -v 0.259520 3.262126 3.243422 -v 0.259520 3.262126 3.226256 -v 0.243297 3.262126 3.226256 -v 0.259520 3.262126 3.226256 -v 0.243297 3.262126 3.243422 -v 0.259520 3.262126 3.243422 -v 0.243297 3.262126 3.243422 -v 0.243297 3.262126 3.226256 -v 0.214357 3.262126 3.226256 -v 0.243297 3.262126 3.226256 -v 0.214357 3.262126 3.243422 -v 0.243297 3.262126 3.243422 -v 0.214357 3.262126 3.243422 -v 0.214357 3.262126 3.226256 -v 0.185533 3.262126 3.226256 -v 0.214357 3.262126 3.226256 -v 0.185533 3.262126 3.243422 -v 0.214357 3.262126 3.243422 -v 0.185533 3.262126 3.243422 -v 0.185533 3.262126 3.226256 -v 0.156862 3.262125 3.226256 -v 0.185533 3.262126 3.226256 -v 0.156862 3.262126 3.243421 -v 0.185533 3.262126 3.243422 -v 0.156862 3.262126 3.243421 -v 0.156862 3.262125 3.226256 -v 0.128382 3.262125 3.226256 -v 0.156862 3.262125 3.226256 -v 0.128382 3.262125 3.243422 -v 0.156862 3.262126 3.243421 -v 0.128382 3.262125 3.243422 -v 0.128382 3.262125 3.226256 -v 0.100132 3.262125 3.226256 -v 0.128382 3.262125 3.226256 -v 0.100132 3.262125 3.243421 -v 0.128382 3.262125 3.243422 -v 0.100132 3.262125 3.243421 -v 0.100132 3.262125 3.226256 -v 0.072150 3.262125 3.226256 -v 0.100132 3.262125 3.226256 -v 0.072150 3.245787 3.243421 -v 0.100132 3.245787 3.243421 -v 0.100132 3.262125 3.243421 -v 0.072150 3.262125 3.243421 -v 0.072150 3.262125 3.243421 -v 0.072150 3.262125 3.226256 -v 0.044475 3.262125 3.226256 -v 0.072150 3.262125 3.226256 -v 0.044475 3.262125 3.226256 -v 0.072150 3.262125 3.226256 -v 0.072150 3.245787 3.226256 -v 0.044475 3.245787 3.226256 -v 0.072150 3.245787 3.226256 -v 0.044475 3.245787 3.226256 -v 0.072150 3.245787 3.226256 -v 0.072150 3.245787 3.243421 -v 0.044475 3.245787 3.243421 -v 0.072150 3.245787 3.243421 -v 0.044475 3.262125 3.243421 -v 0.044475 3.245787 3.243421 -v 0.072150 3.245787 3.243421 -v 0.072150 3.262125 3.243421 -v 0.044475 3.262125 3.243421 -v 0.044475 3.262125 3.243421 -v 0.044475 3.262125 3.243421 -v 0.044475 3.262125 3.226256 -v 0.017144 3.262125 3.226256 -v 0.044475 3.262125 3.226256 -v 0.017144 3.262125 3.226256 -v 0.044475 3.262125 3.226256 -v 0.044475 3.245787 3.226256 -v 0.017144 3.245787 3.226256 -v 0.044475 3.245787 3.226256 -v 0.017144 3.245787 3.226256 -v 0.044475 3.245787 3.226256 -v 0.044475 3.245787 3.243421 -v 0.017144 3.245787 3.243421 -v 0.044475 3.245787 3.243421 -v 0.017144 3.262125 3.243421 -v 0.017144 3.245787 3.243421 -v 0.044475 3.245787 3.243421 -v 0.044475 3.262125 3.243421 -v 0.017144 3.262125 3.243421 -v 0.017144 3.262125 3.243421 -v 0.017144 3.262125 3.243421 -v 0.017144 3.262125 3.226256 -v -0.009803 3.262125 3.226256 -v 0.017144 3.262125 3.226256 -v -0.009803 3.262125 3.226256 -v 0.017144 3.262125 3.226256 -v 0.017144 3.245787 3.226256 -v -0.009803 3.245787 3.226256 -v 0.017144 3.245787 3.226256 -v -0.009803 3.245787 3.226256 -v 0.017144 3.245787 3.226256 -v 0.017144 3.245787 3.243421 -v -0.009803 3.245787 3.243421 -v 0.017144 3.245787 3.243421 -v -0.009803 3.262125 3.243421 -v -0.009803 3.245787 3.243421 -v 0.017144 3.245787 3.243421 -v 0.017144 3.262125 3.243421 -v -0.009803 3.262125 3.243421 -v -0.009803 3.262125 3.243421 -v -0.009803 3.262125 3.226256 -v -0.009803 3.262125 3.226256 -v -0.009803 3.262125 3.226256 -v -0.009803 3.245787 3.226256 -v -0.009803 3.245787 3.243421 -v -0.009803 3.245787 3.243421 -v -0.009803 3.262125 3.243421 -v -0.030544 3.262125 3.226463 -v -0.030544 3.262125 3.226463 -v -0.030544 3.245787 3.226463 -v -0.030544 3.245787 3.226463 -v -0.040496 3.245787 3.243532 -v -0.040496 3.245787 3.243532 -v -0.040496 3.262125 3.243532 -v -0.063603 3.262125 3.200301 -v -0.063603 3.262125 3.200301 -v -0.048924 3.262125 3.191907 -v -0.071262 3.262125 3.154022 -v -0.048924 3.262125 3.191907 -v -0.071262 3.262125 3.154022 -v -0.048924 3.245787 3.191907 -v -0.071262 3.245788 3.154022 -v -0.071262 3.245788 3.154022 -v -0.063603 3.245787 3.200301 -v -0.085398 3.245788 3.163335 -v -0.063603 3.245787 3.200301 -v -0.085398 3.245788 3.163335 -v -0.063603 3.262125 3.200301 -v -0.085398 3.262125 3.163335 -v -0.085398 3.262125 3.163335 -v -0.071262 3.262125 3.154022 -v -0.096033 3.262125 3.117762 -v -0.071262 3.262125 3.154022 -v -0.096033 3.262125 3.117762 -v -0.071262 3.262125 3.154022 -v -0.071262 3.245788 3.154022 -v -0.096033 3.245788 3.117762 -v -0.071262 3.245788 3.154022 -v -0.096033 3.245788 3.117762 -v -0.071262 3.245788 3.154022 -v -0.085398 3.245788 3.163335 -v -0.109477 3.245788 3.128085 -v -0.085398 3.245788 3.163335 -v -0.109477 3.262125 3.128085 -v -0.109477 3.245788 3.128085 -v -0.085398 3.245788 3.163335 -v -0.085398 3.262125 3.163335 -v -0.109477 3.262125 3.128085 -v -0.109477 3.262125 3.128085 -v -0.109477 3.262125 3.128085 -v -0.096033 3.262125 3.117762 -v -0.123474 3.262125 3.083504 -v -0.096033 3.262125 3.117762 -v -0.123474 3.262125 3.083504 -v -0.096033 3.262125 3.117762 -v -0.096033 3.245788 3.117762 -v -0.123474 3.245788 3.083504 -v -0.096033 3.245788 3.117762 -v -0.123474 3.245788 3.083504 -v -0.096033 3.245788 3.117762 -v -0.109477 3.245788 3.128085 -v -0.136054 3.245788 3.094904 -v -0.109477 3.245788 3.128085 -v -0.136054 3.245788 3.094904 -v -0.109477 3.245788 3.128085 -v -0.109477 3.262125 3.128085 -v -0.136054 3.262125 3.094904 -v -0.136054 3.262125 3.094904 -v -0.123474 3.262125 3.083504 -v -0.153822 3.262125 3.051628 -v -0.123474 3.262125 3.083504 -v -0.153822 3.262125 3.051628 -v -0.123474 3.262125 3.083504 -v -0.123474 3.245788 3.083504 -v -0.153822 3.245788 3.051628 -v -0.123474 3.245788 3.083504 -v -0.153822 3.245788 3.051628 -v -0.123474 3.245788 3.083504 -v -0.136054 3.245788 3.094904 -v -0.165346 3.245788 3.064136 -v -0.136054 3.245788 3.094904 -v -0.165346 3.245788 3.064136 -v -0.136054 3.245788 3.094904 -v -0.136054 3.262125 3.094904 -v -0.165346 3.262125 3.064136 -v -0.165346 3.262125 3.064136 -v -0.153822 3.262125 3.051628 -v -0.187307 3.262125 3.022520 -v -0.153822 3.262125 3.051628 -v -0.187307 3.262125 3.022520 -v -0.153822 3.262125 3.051628 -v -0.153822 3.245788 3.051628 -v -0.187307 3.245788 3.022520 -v -0.153822 3.245788 3.051628 -v -0.187307 3.245788 3.022520 -v -0.153822 3.245788 3.051628 -v -0.165346 3.245788 3.064136 -v -0.197574 3.245788 3.036119 -v -0.165346 3.245788 3.064136 -v -0.197574 3.245788 3.036119 -v -0.165346 3.245788 3.064136 -v -0.165346 3.262125 3.064136 -v -0.197574 3.262125 3.036119 -v -0.187307 3.262125 3.022520 -v -0.187307 3.262125 3.022520 -v -0.187307 3.245788 3.022520 -v -0.224147 3.245788 2.996572 -v -0.197574 3.245788 3.036119 -v -0.197574 3.245788 3.036119 -v -0.197574 3.262125 3.036119 -v -0.232970 3.262125 3.011187 -v -0.224147 3.262125 2.996572 -v -0.264553 3.262125 2.974174 -v -0.224147 3.262125 2.996572 -v -0.264553 3.262125 2.974174 -v -0.224147 3.245788 2.996572 -v -0.264553 3.245788 2.974174 -v -0.224147 3.245788 2.996572 -v -0.264553 3.245788 2.974174 -v -0.224147 3.245788 2.996572 -v -0.232970 3.245788 3.011187 -v -0.271778 3.245788 2.989675 -v -0.232970 3.245788 3.011187 -v -0.271778 3.245788 2.989675 -v -0.232970 3.262125 3.011187 -v -0.271778 3.262125 2.989675 -v -0.264553 3.262125 2.974174 -v -0.308721 3.262125 2.955713 -v -0.264553 3.262125 2.974174 -v -0.308721 3.262125 2.955713 -v -0.264553 3.262125 2.974174 -v -0.264553 3.245788 2.974174 -v -0.308721 3.245788 2.955713 -v -0.264553 3.245788 2.974174 -v -0.308721 3.245788 2.955713 -v -0.264553 3.245788 2.974174 -v -0.271778 3.245788 2.989675 -v -0.314251 3.245788 2.971923 -v -0.271778 3.245788 2.989675 -v -0.314251 3.245788 2.971923 -v -0.271778 3.245788 2.989675 -v -0.271778 3.262125 2.989675 -v -0.314251 3.262125 2.971923 -v -0.308721 3.262125 2.955713 -v -0.356845 3.262125 2.941563 -v -0.308721 3.262125 2.955713 -v -0.356845 3.262125 2.941563 -v -0.308721 3.262125 2.955713 -v -0.308721 3.245788 2.955713 -v -0.356845 3.245788 2.941563 -v -0.308721 3.245788 2.955713 -v -0.356845 3.245788 2.941563 -v -0.308721 3.245788 2.955713 -v -0.314251 3.245788 2.971923 -v -0.360649 3.245788 2.958282 -v -0.314251 3.245788 2.971923 -v -0.360649 3.245788 2.958282 -v -0.314251 3.245788 2.971923 -v -0.314251 3.262125 2.971923 -v -0.360649 3.262125 2.958282 -v -0.356845 3.262125 2.941563 -v -0.409118 3.262125 2.932087 -v -0.356845 3.262125 2.941563 -v -0.409118 3.262125 2.932087 -v -0.356845 3.262125 2.941563 -v -0.356845 3.245788 2.941563 -v -0.409118 3.245788 2.932087 -v -0.356845 3.245788 2.941563 -v -0.409118 3.245788 2.932087 -v -0.356845 3.245788 2.941563 -v -0.360649 3.245788 2.958282 -v -0.411230 3.245788 2.949114 -v -0.360649 3.245788 2.958282 -v -0.411230 3.245788 2.949114 -v -0.360649 3.245788 2.958282 -v -0.360649 3.262125 2.958282 -v -0.411230 3.262125 2.949114 -v -0.409118 3.262125 2.932087 -v -0.466206 3.262125 2.927636 -v -0.409118 3.262125 2.932087 -v -0.466206 3.262125 2.927636 -v -0.409118 3.262125 2.932087 -v -0.409118 3.245788 2.932087 -v -0.466206 3.245788 2.927636 -v -0.409118 3.245788 2.932087 -v -0.466206 3.245788 2.927636 -v -0.409118 3.245788 2.932087 -v -0.411230 3.245788 2.949114 -v -0.465779 3.245788 2.944794 -v -0.411230 3.245788 2.949114 -v -0.465779 3.245788 2.944794 -v -0.411230 3.245788 2.949114 -v -0.411230 3.262125 2.949114 -v -0.465779 3.262125 2.944794 -v -0.466206 3.262125 2.927636 -v -0.529976 3.262125 2.936305 -v -0.466206 3.262125 2.927636 -v -0.529976 3.262125 2.936305 -v -0.466206 3.262125 2.927636 -v -0.466206 3.245788 2.927636 -v -0.529976 3.245788 2.936306 -v -0.466206 3.245788 2.927636 -v -0.529976 3.245788 2.936306 -v -0.466206 3.245788 2.927636 -v -0.465779 3.245788 2.944794 -v -0.526731 3.245788 2.953146 -v -0.465779 3.245788 2.944794 -v -0.526731 3.245788 2.953146 -v -0.465779 3.245788 2.944794 -v -0.465779 3.262125 2.944794 -v -0.526731 3.262125 2.953146 -v -0.529976 3.262125 2.936305 -v -0.589490 3.262125 2.952163 -v -0.529976 3.262125 2.936305 -v -0.589490 3.262125 2.952163 -v -0.529976 3.262125 2.936305 -v -0.529976 3.245788 2.936306 -v -0.589490 3.245789 2.952163 -v -0.529976 3.245788 2.936306 -v -0.589490 3.245789 2.952163 -v -0.529976 3.245788 2.936306 -v -0.526731 3.245788 2.953146 -v -0.584227 3.245789 2.968465 -v -0.526731 3.245788 2.953146 -v -0.584227 3.245789 2.968465 -v -0.526731 3.245788 2.953146 -v -0.526731 3.262125 2.953146 -v -0.584227 3.262125 2.968465 -v -0.589490 3.262125 2.952163 -v -0.644802 3.262125 2.974759 -v -0.589490 3.262125 2.952163 -v -0.644802 3.262125 2.974759 -v -0.589490 3.262125 2.952163 -v -0.589490 3.245789 2.952163 -v -0.644802 3.245789 2.974759 -v -0.589490 3.245789 2.952163 -v -0.644802 3.245789 2.974759 -v -0.589490 3.245789 2.952163 -v -0.584227 3.245789 2.968465 -v -0.637564 3.245789 2.990253 -v -0.584227 3.245789 2.968465 -v -0.637564 3.245789 2.990253 -v -0.584227 3.245789 2.968465 -v -0.584227 3.262125 2.968465 -v -0.637564 3.262125 2.990253 -v -0.644802 3.262125 2.974759 -v -0.644802 3.262125 2.974759 -v -0.644802 3.262125 2.974759 -v -0.644802 3.245789 2.974759 -v -0.644802 3.245789 2.974759 -v -0.637564 3.245789 2.990253 -v -0.637564 3.245789 2.990253 -v -0.637564 3.245789 2.990253 -v -0.637564 3.262125 2.990253 -v -0.686442 3.262125 3.018036 -v -0.695562 3.262125 3.003613 -v -0.695562 3.245789 3.003613 -v -0.741423 3.245789 3.038244 -v -0.695562 3.245789 3.003613 -v -0.741423 3.245789 3.038244 -v -0.686442 3.245789 3.018036 -v -0.730557 3.245789 3.051347 -v -0.686442 3.245789 3.018036 -v -0.686442 3.262125 3.018036 -v -0.730557 3.262125 3.051347 -v -0.730557 3.262125 3.051347 -v -0.741423 3.262125 3.038244 -v -0.741423 3.262125 3.038244 -v -0.782041 3.262125 3.078164 -v -0.741423 3.262125 3.038244 -v -0.741423 3.245789 3.038244 -v -0.741423 3.245789 3.038244 -v -0.741423 3.245789 3.038244 -v -0.730557 3.245789 3.051347 -v -0.730557 3.245789 3.051347 -v -0.769605 3.262125 3.089724 -v -0.730557 3.245789 3.051347 -v -0.769605 3.262125 3.089724 -v -0.782041 3.262125 3.078164 -v -0.817074 3.262125 3.122883 -v -0.782041 3.262125 3.078164 -v -0.803277 3.262125 3.132705 -v -0.769605 3.262125 3.089724 -v -0.803277 3.262125 3.132705 -v -0.817074 3.262125 3.122883 -v -0.846186 3.262125 3.171909 -v -0.817074 3.262125 3.122883 -v -0.831261 3.262125 3.179834 -v -0.803277 3.262125 3.132705 -v -0.831261 3.262125 3.179834 -v -0.846186 3.262125 3.171909 -v -0.869040 3.262124 3.224748 -v -0.846186 3.262125 3.171909 -v -0.853242 3.262124 3.230654 -v -0.831261 3.262125 3.179834 -v -0.853242 3.262124 3.230654 -v -0.869040 3.262124 3.224748 -v -0.885307 3.262124 3.280902 -v -0.869040 3.262124 3.224748 -v -0.885307 3.245789 3.280902 -v -0.853242 3.245789 3.230654 -v -0.868901 3.245789 3.284711 -v -0.868901 3.245789 3.284711 -v -0.853242 3.245789 3.230654 -v -0.853242 3.262124 3.230654 -v -0.868901 3.262124 3.284711 -v -0.868901 3.262124 3.284711 -v -0.868901 3.262124 3.284711 -v -0.885307 3.262124 3.280902 -v -0.894660 3.262124 3.339877 -v -0.885307 3.262124 3.280902 -v -0.894660 3.262124 3.339877 -v -0.885307 3.262124 3.280902 -v -0.885307 3.245789 3.280902 -v -0.894660 3.245789 3.339877 -v -0.885307 3.245789 3.280902 -v -0.894660 3.245789 3.339877 -v -0.885307 3.245789 3.280902 -v -0.868901 3.245789 3.284711 -v -0.877915 3.245789 3.341551 -v -0.868901 3.245789 3.284711 -v -0.877915 3.262124 3.341551 -v -0.877915 3.245789 3.341551 -v -0.868901 3.245789 3.284711 -v -0.868901 3.262124 3.284711 -v -0.877915 3.262124 3.341551 -v -0.894660 3.262124 3.339877 -v -0.894660 3.245789 3.339877 -v -0.877915 3.245789 3.341551 -v -0.877915 3.245789 3.341551 -v -0.877915 3.262124 3.341551 -v -0.879978 3.262124 3.400293 -v -0.879978 3.262124 3.400293 -v -0.896754 3.262124 3.401602 -v -0.886838 3.262124 3.456983 -v -0.896754 3.262124 3.401602 -v -0.886838 3.262124 3.456983 -v -0.896754 3.262124 3.401602 -v -0.896754 3.245789 3.401602 -v -0.886838 3.245789 3.456983 -v -0.896754 3.245789 3.401602 -v -0.886838 3.245789 3.456983 -v -0.879978 3.245789 3.400293 -v -0.870454 3.262124 3.453084 -v -0.870454 3.245789 3.453084 -v -0.879978 3.245789 3.400293 -v -0.879978 3.262124 3.400293 -v -0.870454 3.262124 3.453084 -v -0.870454 3.262124 3.453084 -v -0.870454 3.262124 3.453084 -v -0.886838 3.262124 3.456983 -v -0.886838 3.262124 3.456983 -v -0.871997 3.262124 3.510005 -v -0.886838 3.262124 3.456983 -v -0.886838 3.245789 3.456983 -v -0.886838 3.245789 3.456983 -v -0.871997 3.245789 3.510005 -v -0.886838 3.245789 3.456983 -v -0.870454 3.245789 3.453084 -v -0.870454 3.245789 3.453084 -v -0.856069 3.262124 3.504477 -v -0.856069 3.245789 3.504477 -v -0.870454 3.245789 3.453084 -v -0.870454 3.262124 3.453084 -v -0.856069 3.262124 3.504477 -v -0.856069 3.262124 3.504477 -v -0.856069 3.262124 3.504477 -v -0.871997 3.262124 3.510005 -v -0.852213 3.262123 3.560639 -v -0.871997 3.262124 3.510005 -v -0.852213 3.262123 3.560639 -v -0.871997 3.262124 3.510005 -v -0.871997 3.245789 3.510005 -v -0.852213 3.245789 3.560639 -v -0.871997 3.245789 3.510005 -v -0.852213 3.245789 3.560639 -v -0.871997 3.245789 3.510005 -v -0.856069 3.245789 3.504477 -v -0.836931 3.245789 3.553460 -v -0.856069 3.245789 3.504477 -v -0.836931 3.262123 3.553460 -v -0.836931 3.245789 3.553460 -v -0.856069 3.245789 3.504477 -v -0.856069 3.262124 3.504477 -v -0.836931 3.262123 3.553460 -v -0.836931 3.262123 3.553460 -v -0.836931 3.262123 3.553460 -v -0.852213 3.262123 3.560639 -v -0.827519 3.262123 3.608358 -v -0.852213 3.262123 3.560639 -v -0.827519 3.262123 3.608358 -v -0.852213 3.262123 3.560639 -v -0.852213 3.245789 3.560639 -v -0.827519 3.245789 3.608358 -v -0.852213 3.245789 3.560639 -v -0.827519 3.245789 3.608358 -v -0.852213 3.245789 3.560639 -v -0.836931 3.245789 3.553460 -v -0.836931 3.245789 3.553460 -v -0.813096 3.262123 3.599522 -v -0.813096 3.245789 3.599522 -v -0.836931 3.245789 3.553460 -v -0.836931 3.262123 3.553460 -v -0.813096 3.262123 3.599522 -v -0.813096 3.262123 3.599522 -v -0.813096 3.262123 3.599522 -v -0.827519 3.262123 3.608358 -v -0.827519 3.262123 3.608358 -v -0.797948 3.262123 3.652627 -v -0.827519 3.262123 3.608358 -v -0.827519 3.245789 3.608358 -v -0.797948 3.245789 3.652627 -v -0.827519 3.245789 3.608358 -v -0.797948 3.245789 3.652627 -v -0.827519 3.245789 3.608358 -v -0.813096 3.245789 3.599522 -v -0.813096 3.245789 3.599522 -v -0.784621 3.262123 3.642153 -v -0.784621 3.245789 3.642153 -v -0.813096 3.245789 3.599522 -v -0.813096 3.262123 3.599522 -v -0.784621 3.262123 3.642153 -v -0.784621 3.262123 3.642153 -v -0.784621 3.262123 3.642153 -v -0.797948 3.262123 3.652627 -v -0.797948 3.262123 3.652627 -v -0.763539 3.262123 3.692903 -v -0.797948 3.262123 3.652627 -v -0.797948 3.245789 3.652627 -v -0.797948 3.245789 3.652627 -v -0.763539 3.245789 3.692902 -v -0.797948 3.245789 3.652627 -v -0.784621 3.245789 3.642153 -v -0.751557 3.245789 3.680856 -v -0.784621 3.245789 3.642153 -v -0.751557 3.262123 3.680856 -v -0.751557 3.245789 3.680856 -v -0.784621 3.245789 3.642153 -v -0.784621 3.262123 3.642153 -v -0.751557 3.262123 3.680856 -v -0.751557 3.262123 3.680856 -v -0.751557 3.262123 3.680856 -v -0.763539 3.262123 3.692903 -v -0.724334 3.262123 3.728637 -v -0.763539 3.262123 3.692903 -v -0.724334 3.262123 3.728637 -v -0.763539 3.262123 3.692903 -v -0.763539 3.245789 3.692902 -v -0.724334 3.245789 3.728637 -v -0.763539 3.245789 3.692902 -v -0.724334 3.245789 3.728637 -v -0.763539 3.245789 3.692902 -v -0.751557 3.245789 3.680856 -v -0.713949 3.245789 3.715136 -v -0.751557 3.245789 3.680856 -v -0.713949 3.262123 3.715136 -v -0.713949 3.245789 3.715136 -v -0.751557 3.245789 3.680856 -v -0.751557 3.262123 3.680856 -v -0.713949 3.262123 3.715136 -v -0.724334 3.262123 3.728637 -v -0.724334 3.262123 3.728637 -v -0.724334 3.245789 3.728637 -v -0.680392 3.245789 3.759278 -v -0.713949 3.245789 3.715136 -v -0.713949 3.245789 3.715136 -v -0.713949 3.262123 3.715136 -v -0.671831 3.262123 3.744505 -v -0.671831 3.262123 3.744505 -v -0.680392 3.262123 3.759278 -v -0.680392 3.262123 3.759278 -v -0.631781 3.262123 3.784274 -v -0.680392 3.262123 3.759278 -v -0.680392 3.245789 3.759278 -v -0.680392 3.245789 3.759278 -v -0.631781 3.245789 3.784274 -v -0.680392 3.245789 3.759278 -v -0.671831 3.245789 3.744505 -v -0.671831 3.245789 3.744505 -v -0.625221 3.262123 3.768472 -v -0.625221 3.245789 3.768472 -v -0.671831 3.245789 3.744505 -v -0.671831 3.262123 3.744505 -v -0.625221 3.262123 3.768472 -v -0.625221 3.262123 3.768472 -v -0.625221 3.262123 3.768472 -v -0.631781 3.262123 3.784274 -v -0.631781 3.262123 3.784274 -v -0.578584 3.262123 3.803084 -v -0.631781 3.262123 3.784274 -v -0.631781 3.245789 3.784274 -v -0.578584 3.245789 3.803084 -v -0.631781 3.245789 3.784274 -v -0.578584 3.245789 3.803084 -v -0.631781 3.245789 3.784274 -v -0.625221 3.245789 3.768472 -v -0.574128 3.245789 3.786537 -v -0.625221 3.245789 3.768472 -v -0.574128 3.262123 3.786537 -v -0.574128 3.245789 3.786537 -v -0.625221 3.245789 3.768472 -v -0.625221 3.262123 3.768472 -v -0.574128 3.262123 3.786537 -v -0.574128 3.262123 3.786537 -v -0.574128 3.262123 3.786537 -v -0.578584 3.262123 3.803084 -v -0.520888 3.262123 3.815180 -v -0.578584 3.262123 3.803084 -v -0.520888 3.262123 3.815180 -v -0.578584 3.262123 3.803084 -v -0.578584 3.245789 3.803084 -v -0.520888 3.245789 3.815180 -v -0.578584 3.245789 3.803084 -v -0.520888 3.245789 3.815180 -v -0.578584 3.245789 3.803084 -v -0.574128 3.245789 3.786537 -v -0.518553 3.245789 3.798187 -v -0.574128 3.245789 3.786537 -v -0.518553 3.262123 3.798187 -v -0.518553 3.245789 3.798187 -v -0.574128 3.245789 3.786537 -v -0.574128 3.262123 3.786537 -v -0.518553 3.262123 3.798187 -v -0.518553 3.262123 3.798187 -v -0.518553 3.262123 3.798187 -v -0.520888 3.262123 3.815180 -v -0.458851 3.262123 3.820048 -v -0.458851 3.262123 3.820048 -v -0.520888 3.262123 3.815180 -v -0.520888 3.245789 3.815180 -v -0.458851 3.245789 3.820048 -v -0.520888 3.245789 3.815180 -v -0.458851 3.245789 3.820048 -v -0.518553 3.245789 3.798187 -v -0.518553 3.245789 3.798187 -v -0.458429 3.262123 3.802893 -v -0.458429 3.245789 3.802893 -v -0.518553 3.245789 3.798187 -v -0.518553 3.262123 3.798187 -v -0.458429 3.262123 3.802893 -v -0.458429 3.262123 3.802893 -v -0.458429 3.262123 3.802893 -v -0.458851 3.262123 3.820048 -v -0.458851 3.262123 3.820048 -v -0.405006 3.262122 3.818570 -v -0.458851 3.262123 3.820048 -v -0.458851 3.245789 3.820048 -v -0.458851 3.245789 3.820048 -v -0.405006 3.245789 3.818570 -v -0.458851 3.245789 3.820048 -v -0.458429 3.245789 3.802893 -v -0.406488 3.245789 3.801477 -v -0.458429 3.245789 3.802893 -v -0.406488 3.262122 3.801477 -v -0.406488 3.245789 3.801477 -v -0.458429 3.245789 3.802893 -v -0.458429 3.262123 3.802893 -v -0.406488 3.262122 3.801477 -v -0.406488 3.262122 3.801477 -v -0.406488 3.262122 3.801477 -v -0.405006 3.262122 3.818570 -v -0.405006 3.262122 3.818570 -v -0.353588 3.262122 3.810728 -v -0.405006 3.262122 3.818570 -v -0.405006 3.245789 3.818570 -v -0.353588 3.245789 3.810728 -v -0.405006 3.245789 3.818570 -v -0.353588 3.245789 3.810728 -v -0.405006 3.245789 3.818570 -v -0.406488 3.245789 3.801477 -v -0.357075 3.245789 3.793941 -v -0.406488 3.245789 3.801477 -v -0.357075 3.262122 3.793941 -v -0.357075 3.245789 3.793941 -v -0.406488 3.245789 3.801477 -v -0.406488 3.262122 3.801477 -v -0.357075 3.262122 3.793941 -v -0.357075 3.262122 3.793941 -v -0.357075 3.262122 3.793941 -v -0.353588 3.262122 3.810728 -v -0.304946 3.262122 3.797126 -v -0.353588 3.262122 3.810728 -v -0.304946 3.262122 3.797126 -v -0.353588 3.262122 3.810728 -v -0.353588 3.245789 3.810728 -v -0.304946 3.245789 3.797126 -v -0.353588 3.245789 3.810728 -v -0.304946 3.245789 3.797126 -v -0.353588 3.245789 3.810728 -v -0.357075 3.245789 3.793941 -v -0.310338 3.245790 3.780872 -v -0.357075 3.245789 3.793941 -v -0.310338 3.262122 3.780872 -v -0.310338 3.245790 3.780872 -v -0.357075 3.245789 3.793941 -v -0.357075 3.262122 3.793941 -v -0.310338 3.262122 3.780872 -v -0.310338 3.262122 3.780872 -v -0.310338 3.262122 3.780872 -v -0.304946 3.262122 3.797126 -v -0.259343 3.262122 3.778374 -v -0.304946 3.262122 3.797126 -v -0.259343 3.262122 3.778374 -v -0.304946 3.262122 3.797126 -v -0.304946 3.245789 3.797126 -v -0.304946 3.245789 3.797126 -v -0.259343 3.245789 3.778374 -v -0.304946 3.245789 3.797126 -v -0.310338 3.245790 3.780872 -v -0.266508 3.245790 3.762849 -v -0.310338 3.245790 3.780872 -v -0.266508 3.262122 3.762849 -v -0.266508 3.245790 3.762849 -v -0.310338 3.245790 3.780872 -v -0.310338 3.262122 3.780872 -v -0.266508 3.262122 3.762849 -v -0.266508 3.262122 3.762849 -v -0.266508 3.262122 3.762849 -v -0.259343 3.262122 3.778374 -v -0.259343 3.262122 3.778374 -v -0.217037 3.262122 3.755083 -v -0.259343 3.262122 3.778374 -v -0.259343 3.245789 3.778374 -v -0.259343 3.245789 3.778374 -v -0.217037 3.245790 3.755083 -v -0.259343 3.245789 3.778374 -v -0.266508 3.245790 3.762849 -v -0.266508 3.245790 3.762849 -v -0.225826 3.262122 3.740452 -v -0.225826 3.245790 3.740452 -v -0.266508 3.245790 3.762849 -v -0.266508 3.262122 3.762849 -v -0.225826 3.262122 3.740452 -v -0.217037 3.262122 3.755083 -v -0.217037 3.262122 3.755083 -v -0.217037 3.245790 3.755083 -v -0.178276 3.245790 3.727859 -v -0.225826 3.245790 3.740452 -v -0.225826 3.245790 3.740452 -v -0.225826 3.262122 3.740452 -v -0.188539 3.262122 3.714264 -v -0.188539 3.262122 3.714264 -v -0.188539 3.262122 3.714264 -v -0.178275 3.262122 3.727859 -v -0.143304 3.262122 3.697305 -v -0.178275 3.262122 3.727859 -v -0.143304 3.262122 3.697305 -v -0.178275 3.262122 3.727859 -v -0.178276 3.245790 3.727859 -v -0.143304 3.245790 3.697305 -v -0.178276 3.245790 3.727859 -v -0.143304 3.245790 3.697305 -v -0.178276 3.245790 3.727859 -v -0.188539 3.245790 3.714264 -v -0.154900 3.245790 3.684873 -v -0.188539 3.245790 3.714264 -v -0.154900 3.262122 3.684873 -v -0.154900 3.245790 3.684873 -v -0.188539 3.245790 3.714264 -v -0.188539 3.262122 3.714264 -v -0.154900 3.262122 3.684873 -v -0.154900 3.262122 3.684873 -v -0.154900 3.262122 3.684873 -v -0.143304 3.262122 3.697305 -v -0.112366 3.262122 3.664016 -v -0.112366 3.262122 3.664016 -v -0.143304 3.262122 3.697305 -v -0.143304 3.245790 3.697305 -v -0.112366 3.245790 3.664016 -v -0.143304 3.245790 3.697305 -v -0.112366 3.245790 3.664016 -v -0.154900 3.245790 3.684873 -v -0.154900 3.245790 3.684873 -v -0.125160 3.262122 3.652875 -v -0.125161 3.245790 3.652875 -v -0.154900 3.245790 3.684873 -v -0.154900 3.262122 3.684873 -v -0.125160 3.262122 3.652875 -v -0.125160 3.262122 3.652875 -v -0.125160 3.262122 3.652875 -v -0.112366 3.262122 3.664016 -v -0.112366 3.262122 3.664016 -v -0.085706 3.262122 3.628582 -v -0.112366 3.262122 3.664016 -v -0.112366 3.245790 3.664016 -v -0.112366 3.245790 3.664016 -v -0.085706 3.245790 3.628582 -v -0.112366 3.245790 3.664016 -v -0.125161 3.245790 3.652875 -v -0.125161 3.245790 3.652875 -v -0.099574 3.262122 3.618870 -v -0.099574 3.245790 3.618870 -v -0.125161 3.245790 3.652875 -v -0.125160 3.262122 3.652875 -v -0.099574 3.262122 3.618870 -v -0.099574 3.262122 3.618870 -v -0.099574 3.262122 3.618870 -v -0.085706 3.262122 3.628582 -v -0.063569 3.262122 3.591585 -v -0.085706 3.262122 3.628582 -v -0.063569 3.262122 3.591585 -v -0.085706 3.262122 3.628582 -v -0.085706 3.245790 3.628582 -v -0.063569 3.245790 3.591585 -v -0.085706 3.245790 3.628582 -v -0.063569 3.245790 3.591585 -v -0.085706 3.245790 3.628582 -v -0.099574 3.245790 3.618870 -v -0.078389 3.245790 3.583466 -v -0.099574 3.245790 3.618870 -v -0.078389 3.262122 3.583466 -v -0.078389 3.245790 3.583466 -v -0.099574 3.245790 3.618870 -v -0.099574 3.262122 3.618870 -v -0.078389 3.262122 3.583466 -v -0.078389 3.262122 3.583466 -v -0.078389 3.262122 3.583466 -v -0.063569 3.262122 3.591585 -v -0.046212 3.262122 3.553601 -v -0.063569 3.262122 3.591585 -v -0.046212 3.262122 3.553601 -v -0.063569 3.262122 3.591585 -v -0.063569 3.245790 3.591585 -v -0.046212 3.245790 3.553601 -v -0.063569 3.245790 3.591585 -v -0.046212 3.245790 3.553601 -v -0.063569 3.245790 3.591585 -v -0.078389 3.245790 3.583466 -v -0.061850 3.245790 3.547277 -v -0.078389 3.245790 3.583466 -v -0.061850 3.262122 3.547277 -v -0.061850 3.245790 3.547277 -v -0.078389 3.245790 3.583466 -v -0.078389 3.262122 3.583466 -v -0.061850 3.262122 3.547277 -v -0.061850 3.262122 3.547277 -v -0.061850 3.262122 3.547277 -v -0.046212 3.262122 3.553601 -v -0.035721 3.262122 3.522561 -v -0.046212 3.262122 3.553601 -v -0.035721 3.262122 3.522561 -v -0.046212 3.245790 3.553601 -v -0.061850 3.245790 3.547277 -v -0.047433 3.262122 3.504187 -v -0.061850 3.245790 3.547277 -v -0.047433 3.262122 3.504187 -v -0.047433 3.262122 3.504187 -v -0.047433 3.262122 3.504187 -v -0.035721 3.262122 3.522561 -v -0.035721 3.262122 3.522561 -v -0.015910 3.262122 3.522476 -v -0.035721 3.262122 3.522561 -v -0.035721 3.245790 3.522561 -v -0.035721 3.245790 3.522561 -v -0.015910 3.245790 3.522476 -v -0.047433 3.245790 3.504187 -v -0.016229 3.262122 3.504577 -v -0.047433 3.245790 3.504187 -v -0.047433 3.262122 3.504187 -v -0.016229 3.262122 3.504577 -v -0.016229 3.262122 3.504577 -v -0.016229 3.262122 3.504577 -v -0.015910 3.262122 3.522476 -v 0.010685 3.262122 3.522476 -v -0.015910 3.262122 3.522476 -v -0.015910 3.262122 3.522476 -v -0.015910 3.245790 3.522476 -v 0.010685 3.245790 3.522476 -v -0.015910 3.245790 3.522476 -v -0.015910 3.245790 3.522476 -v -0.016229 3.245790 3.504577 -v 0.010484 3.245790 3.504565 -v -0.016229 3.245790 3.504577 -v 0.010484 3.262122 3.504565 -v 0.010484 3.245790 3.504565 -v -0.016229 3.245790 3.504577 -v -0.016229 3.262122 3.504577 -v 0.010484 3.262122 3.504565 -v 0.010484 3.262122 3.504565 -v 0.010484 3.262122 3.504565 -v 0.010685 3.262122 3.522476 -v 0.037908 3.262122 3.522476 -v 0.010685 3.262122 3.522476 -v 0.037908 3.262122 3.522476 -v 0.010685 3.262122 3.522476 -v 0.010685 3.245790 3.522476 -v 0.037908 3.245790 3.522476 -v 0.010685 3.245790 3.522476 -v 0.037908 3.245790 3.522476 -v 0.010685 3.245790 3.522476 -v 0.010484 3.245790 3.504565 -v 0.010484 3.245790 3.504565 -v 0.037809 3.262122 3.504558 -v 0.037809 3.245790 3.504558 -v 0.010484 3.245790 3.504565 -v 0.010484 3.262122 3.504565 -v 0.037809 3.262122 3.504558 -v 0.037809 3.262122 3.504558 -v 0.037809 3.262122 3.504558 -v 0.037908 3.262122 3.522476 -v 0.065696 3.262122 3.522476 -v 0.037908 3.262122 3.522476 -v 0.065696 3.262122 3.522476 -v 0.037908 3.262122 3.522476 -v 0.037908 3.245790 3.522476 -v 0.037908 3.245790 3.522476 -v 0.065696 3.245790 3.522476 -v 0.037908 3.245790 3.522476 -v 0.037809 3.245790 3.504558 -v 0.037809 3.245790 3.504558 -v 0.065685 3.262122 3.504555 -v 0.065685 3.245790 3.504555 -v 0.037809 3.245790 3.504558 -v 0.037809 3.262122 3.504558 -v 0.065685 3.262122 3.504555 -v 0.065685 3.262122 3.504555 -v 0.065685 3.262122 3.504555 -v 0.065696 3.262122 3.522476 -v 0.065696 3.262122 3.522476 -v 0.093987 3.262122 3.522476 -v 0.065696 3.262122 3.522476 -v 0.065696 3.245790 3.522476 -v 0.093987 3.245790 3.522476 -v 0.065696 3.245790 3.522476 -v 0.093987 3.245790 3.522476 -v 0.065696 3.245790 3.522476 -v 0.065685 3.245790 3.504555 -v 0.065685 3.245790 3.504555 -v 0.094050 3.262122 3.504557 -v 0.094050 3.245790 3.504557 -v 0.065685 3.245790 3.504555 -v 0.065685 3.262122 3.504555 -v 0.094050 3.262122 3.504557 -v 0.094050 3.262122 3.504557 -v 0.094050 3.262122 3.504557 -v 0.093987 3.262122 3.522476 -v 0.122718 3.262122 3.522476 -v 0.093987 3.262122 3.522476 -v 0.122718 3.262122 3.522476 -v 0.093987 3.262122 3.522476 -v 0.093987 3.245790 3.522476 -v 0.093987 3.245790 3.522476 -v 0.122718 3.245790 3.522476 -v 0.093987 3.245790 3.522476 -v 0.094050 3.245790 3.504557 -v 0.094050 3.245790 3.504557 -v 0.122844 3.262122 3.504561 -v 0.122844 3.245790 3.504561 -v 0.094050 3.245790 3.504557 -v 0.094050 3.262122 3.504557 -v 0.122844 3.262122 3.504561 -v 0.122844 3.262122 3.504561 -v 0.122844 3.262122 3.504561 -v 0.122718 3.262122 3.522476 -v 0.122718 3.262122 3.522476 -v 0.151826 3.262122 3.522476 -v 0.122718 3.262122 3.522476 -v 0.122718 3.245790 3.522476 -v 0.122718 3.245790 3.522476 -v 0.151826 3.245790 3.522476 -v 0.122718 3.245790 3.522476 -v 0.122844 3.245790 3.504561 -v 0.152004 3.245790 3.504569 -v 0.122844 3.245790 3.504561 -v 0.152004 3.262122 3.504569 -v 0.152004 3.245790 3.504569 -v 0.122844 3.245790 3.504561 -v 0.122844 3.262122 3.504561 -v 0.152004 3.262122 3.504569 -v 0.152004 3.262122 3.504569 -v 0.152004 3.262122 3.504569 -v 0.151826 3.262122 3.522476 -v 0.151826 3.262122 3.522476 -v 0.181249 3.262122 3.522477 -v 0.151826 3.262122 3.522476 -v 0.151826 3.245790 3.522476 -v 0.151826 3.245790 3.522476 -v 0.181249 3.245790 3.522477 -v 0.151826 3.245790 3.522476 -v 0.152004 3.245790 3.504569 -v 0.181469 3.245790 3.504580 -v 0.152004 3.245790 3.504569 -v 0.181469 3.262122 3.504580 -v 0.181469 3.245790 3.504580 -v 0.152004 3.245790 3.504569 -v 0.152004 3.262122 3.504569 -v 0.181469 3.262122 3.504580 -v 0.181469 3.262122 3.504580 -v 0.181469 3.262122 3.504580 -v 0.181249 3.262122 3.522477 -v 0.181249 3.262122 3.522477 -v 0.210926 3.262122 3.522477 -v 0.181249 3.262122 3.522477 -v 0.181249 3.245790 3.522477 -v 0.181249 3.245790 3.522477 -v 0.210926 3.245790 3.522477 -v 0.181249 3.245790 3.522477 -v 0.181469 3.245790 3.504580 -v 0.181469 3.245790 3.504580 -v 0.211177 3.262122 3.504592 -v 0.211177 3.245790 3.504592 -v 0.181469 3.245790 3.504580 -v 0.181469 3.262122 3.504580 -v 0.211177 3.262122 3.504592 -v 0.211177 3.262122 3.504592 -v 0.211177 3.262122 3.504592 -v 0.210926 3.262122 3.522477 -v 0.210926 3.262122 3.522477 -v 0.240793 3.262122 3.522478 -v 0.210926 3.262122 3.522477 -v 0.210926 3.245790 3.522477 -v 0.240793 3.245790 3.522478 -v 0.210926 3.245790 3.522477 -v 0.240793 3.245790 3.522478 -v 0.210926 3.245790 3.522477 -v 0.211177 3.245790 3.504592 -v 0.211177 3.245790 3.504592 -v 0.241065 3.262122 3.504606 -v 0.241065 3.245790 3.504607 -v 0.211177 3.245790 3.504592 -v 0.211177 3.262122 3.504592 -v 0.241065 3.262122 3.504606 -v 0.241065 3.262122 3.504606 -v 0.241065 3.262122 3.504606 -v 0.240793 3.262122 3.522478 -v 0.240793 3.262122 3.522478 -v 0.257997 3.262122 3.522478 -v 0.240793 3.262122 3.522478 -v 0.240793 3.245790 3.522478 -v 0.240793 3.245790 3.522478 -v 0.257997 3.245790 3.522478 -v 0.240793 3.245790 3.522478 -v 0.241065 3.245790 3.504607 -v 0.241065 3.245790 3.504607 -v 0.258280 3.262122 3.504621 -v 0.258280 3.245790 3.504621 -v 0.241065 3.245790 3.504607 -v 0.241065 3.262122 3.504606 -v 0.258280 3.262122 3.504621 -v 0.258280 3.262122 3.504621 -v 0.258280 3.262122 3.504621 -v 0.257997 3.262122 3.522478 -v 0.257997 3.262122 3.522478 -v 0.284467 3.262122 3.523059 -v 0.257997 3.262122 3.522478 -v 0.257997 3.245790 3.522478 -v 0.257997 3.245790 3.522478 -v 0.284467 3.245790 3.523059 -v 0.257997 3.245790 3.522478 -v 0.258280 3.245790 3.504621 -v 0.258280 3.245790 3.504621 -v 0.284373 3.262122 3.504870 -v 0.284373 3.245790 3.507518 -v 0.258280 3.245790 3.504621 -v 0.258280 3.262122 3.504621 -v 0.284373 3.262122 3.504870 -v 0.284792 3.245787 3.226256 -v 0.284792 3.262126 3.243422 -v 0.284792 3.245787 3.243422 -v 0.284792 3.262126 3.226256 -v 0.284792 3.262126 3.243422 -v 0.284792 3.245787 3.226256 -v 0.284467 3.245790 3.523059 -v 0.284373 3.245790 3.507518 -v 0.284373 3.262122 3.504870 -v 0.284467 3.262122 3.523059 -v 0.284467 3.245790 3.523059 -v 0.284373 3.262122 3.504870 -v -0.016229 3.245790 3.504577 -v -0.035721 3.245790 3.522561 -v -0.016229 3.245790 3.504577 -v -0.034618 3.245790 3.514323 -v -0.047433 3.245790 3.504187 -v -0.016229 3.245790 3.504577 -v -0.016229 3.245790 3.504577 -v -0.035937 3.245790 3.510264 -v -0.039390 3.245790 3.507755 -v -0.047433 3.245790 3.504187 -v -0.039390 3.245790 3.507755 -v -0.047433 3.245790 3.504187 -v -0.043659 3.245790 3.507755 -v -0.047433 3.245790 3.504187 -v -0.047112 3.245790 3.510264 -v -0.061850 3.245790 3.547277 -v -0.046212 3.245790 3.553601 -v -0.061850 3.245790 3.547277 -v -0.061850 3.245790 3.547277 -v -0.047112 3.245790 3.510264 -v -0.048431 3.245790 3.514323 -v -0.046212 3.245790 3.553601 -v -0.048431 3.245790 3.514323 -v -0.035721 3.245790 3.522561 -v -0.046212 3.245790 3.553601 -v -0.046212 3.245790 3.553601 -v -0.047112 3.245790 3.518383 -v -0.043659 3.245790 3.520892 -v -0.035721 3.245790 3.522561 -v -0.035721 3.245790 3.522561 -v -0.035937 3.245790 3.518383 -v -0.034618 3.245790 3.514323 -v -0.035721 3.245790 3.522561 -v -0.188539 3.245790 3.714264 -v -0.178276 3.245790 3.727859 -v -0.188539 3.245790 3.714264 -v -0.206203 3.245790 3.741984 -v -0.188539 3.245790 3.714264 -v -0.225826 3.245790 3.740452 -v -0.188539 3.245790 3.714264 -v -0.188539 3.245790 3.714264 -v -0.210975 3.245790 3.735415 -v -0.215244 3.245790 3.735415 -v -0.225826 3.245790 3.740452 -v -0.217037 3.245790 3.755083 -v -0.225826 3.245790 3.740452 -v -0.225826 3.245790 3.740452 -v -0.220016 3.245790 3.741984 -v -0.217037 3.245790 3.755083 -v -0.220016 3.245790 3.741984 -v -0.217037 3.245790 3.755083 -v -0.218697 3.245790 3.746043 -v -0.178276 3.245790 3.727859 -v -0.217037 3.245790 3.755083 -v -0.217037 3.245790 3.755083 -v -0.210975 3.245790 3.748552 -v -0.178276 3.245790 3.727859 -v -0.210975 3.245790 3.748552 -v -0.207522 3.245790 3.746043 -v -0.206203 3.245790 3.741984 -v -0.178276 3.245790 3.727859 -v -0.671831 3.245789 3.744505 -v -0.680392 3.245789 3.759278 -v -0.713949 3.245789 3.715136 -v -0.671831 3.245789 3.744505 -v -0.671831 3.245789 3.744505 -v -0.680241 3.245789 3.743258 -v -0.681560 3.245789 3.739198 -v -0.713949 3.245789 3.715136 -v -0.724334 3.245789 3.728637 -v -0.713949 3.245789 3.715136 -v -0.685013 3.245789 3.736689 -v -0.724334 3.245789 3.728637 -v -0.724334 3.245789 3.728637 -v -0.689281 3.245789 3.736689 -v -0.724334 3.245789 3.728637 -v -0.692734 3.245789 3.739198 -v -0.680392 3.245789 3.759278 -v -0.724334 3.245789 3.728637 -v -0.724334 3.245789 3.728637 -v -0.692734 3.245789 3.747317 -v -0.680392 3.245789 3.759278 -v -0.692734 3.245789 3.747317 -v -0.680392 3.245789 3.759278 -v -0.689281 3.245789 3.749826 -v -0.680392 3.245789 3.759278 -v -0.681560 3.245789 3.747317 -v -0.680241 3.245789 3.743258 -v -0.680392 3.245789 3.759278 -v -0.894660 3.245789 3.339877 -v -0.877915 3.245789 3.341551 -v -0.877915 3.245789 3.341551 -v -0.879978 3.245789 3.400293 -v -0.881019 3.245789 3.394308 -v -0.894660 3.245789 3.339877 -v -0.881019 3.245789 3.394308 -v -0.894660 3.245789 3.339877 -v -0.882338 3.245789 3.390249 -v -0.894660 3.245789 3.339877 -v -0.894660 3.245789 3.339877 -v -0.890060 3.245789 3.387740 -v -0.896754 3.245789 3.401602 -v -0.894660 3.245789 3.339877 -v -0.894660 3.245789 3.339877 -v -0.894832 3.245789 3.394308 -v -0.896754 3.245789 3.401602 -v -0.894832 3.245789 3.394308 -v -0.896754 3.245789 3.401602 -v -0.896754 3.245789 3.401602 -v -0.890060 3.245789 3.400877 -v -0.870454 3.245789 3.453084 -v -0.879978 3.245789 3.400293 -v -0.870454 3.245789 3.453084 -v -0.870454 3.245789 3.453084 -v -0.890060 3.245789 3.400877 -v -0.885792 3.245789 3.400877 -v -0.879978 3.245789 3.400293 -v -0.885792 3.245789 3.400877 -v -0.881019 3.245789 3.394308 -v -0.879978 3.245789 3.400293 -v -0.644802 3.245789 2.974759 -v -0.695562 3.245789 3.003613 -v -0.644802 3.245789 2.974759 -v -0.644802 3.245789 2.974759 -v -0.685325 3.245789 3.007215 -v -0.688778 3.245789 3.004705 -v -0.695562 3.245789 3.003613 -v -0.688778 3.245789 3.004705 -v -0.730557 3.245789 3.051347 -v -0.695562 3.245789 3.003613 -v -0.695562 3.245789 3.003613 -v -0.693047 3.245789 3.004705 -v -0.696500 3.245789 3.007214 -v -0.730557 3.245789 3.051347 -v -0.696500 3.245789 3.007214 -v -0.730557 3.245789 3.051347 -v -0.686442 3.245789 3.018036 -v -0.730557 3.245789 3.051347 -v -0.730557 3.245789 3.051347 -v -0.696500 3.245789 3.015333 -v -0.686442 3.245789 3.018036 -v -0.693047 3.245789 3.017842 -v -0.686442 3.245789 3.018036 -v -0.644802 3.245789 2.974759 -v -0.686442 3.245789 3.018036 -v -0.685325 3.245789 3.015333 -v -0.684006 3.245789 3.011274 -v -0.644802 3.245789 2.974759 -v -0.685325 3.245789 3.015333 -v -0.224147 3.245788 2.996572 -v -0.187307 3.245788 3.022520 -v -0.187307 3.245788 3.022520 -v -0.224147 3.245788 2.996572 -v -0.206341 3.245788 3.011601 -v -0.232970 3.245788 3.011187 -v -0.224147 3.245788 2.996572 -v -0.224147 3.245788 2.996572 -v -0.209794 3.245788 3.009092 -v -0.214063 3.245788 3.009092 -v -0.232970 3.245788 3.011187 -v -0.214063 3.245788 3.009092 -v -0.232970 3.245788 3.011187 -v -0.217516 3.245788 3.011601 -v -0.197574 3.245788 3.036119 -v -0.232970 3.245788 3.011187 -v -0.232970 3.245788 3.011187 -v -0.218835 3.245788 3.015661 -v -0.217516 3.245788 3.019720 -v -0.197574 3.245788 3.036119 -v -0.217516 3.245788 3.019720 -v -0.187307 3.245788 3.022520 -v -0.197574 3.245788 3.036119 -v -0.187307 3.245788 3.022520 -v -0.214063 3.245788 3.022229 -v -0.187307 3.245788 3.022520 -v -0.209794 3.245788 3.022229 -v -0.205022 3.245788 3.015661 -v -0.187307 3.245788 3.022520 -v -0.030544 3.245787 3.226463 -v -0.009803 3.245787 3.226256 -v -0.030544 3.245787 3.226463 -v -0.028398 3.245787 3.234976 -v -0.030544 3.245787 3.226463 -v -0.029717 3.245787 3.230917 -v -0.063603 3.245787 3.200301 -v -0.063603 3.245787 3.200301 -v -0.029717 3.245787 3.230917 -v -0.063603 3.245787 3.200301 -v -0.033170 3.245787 3.228408 -v -0.063603 3.245787 3.200301 -v -0.037439 3.245787 3.228407 -v -0.040496 3.245787 3.243532 -v -0.063603 3.245787 3.200301 -v -0.063603 3.245787 3.200301 -v -0.040892 3.245787 3.230917 -v -0.040496 3.245787 3.243532 -v -0.042211 3.245787 3.234976 -v -0.040496 3.245787 3.243532 -v -0.040892 3.245787 3.239035 -v -0.040496 3.245787 3.243532 -v -0.037439 3.245787 3.241544 -v -0.009803 3.245787 3.243421 -v -0.009803 3.245787 3.226256 -v -0.009803 3.245787 3.243421 -v -0.009803 3.245787 3.243421 -v -0.037439 3.245787 3.241544 -v -0.028398 3.245787 3.234976 -v -0.009803 3.245787 3.226256 -v -0.009803 3.262125 3.243421 -v -0.030544 3.262125 3.226463 -v -0.029668 3.262125 3.235538 -v -0.030544 3.262125 3.226463 -v -0.030987 3.262125 3.231478 -v -0.030544 3.262125 3.226463 -v -0.048924 3.262125 3.191907 -v -0.030987 3.262125 3.231478 -v -0.048924 3.262125 3.191907 -v -0.034441 3.262125 3.228969 -v -0.048924 3.262125 3.191907 -v -0.038709 3.262125 3.228969 -v -0.048924 3.262125 3.191907 -v -0.048924 3.262125 3.191907 -v -0.063603 3.262125 3.200301 -v -0.042162 3.262125 3.231478 -v -0.048924 3.262125 3.191907 -v -0.063603 3.262125 3.200301 -v -0.040496 3.262125 3.243532 -v -0.043481 3.262125 3.235538 -v -0.063603 3.262125 3.200301 -v -0.042162 3.262125 3.239597 -v -0.040496 3.262125 3.243532 -v -0.040496 3.262125 3.243532 -v -0.009803 3.262125 3.243421 -v -0.009803 3.262125 3.243421 -v -0.034441 3.262125 3.242106 -v -0.009803 3.262125 3.243421 -v -0.029668 3.262125 3.235538 -v -0.030987 3.262125 3.239597 -v -0.009803 3.262125 3.243421 -v -0.197574 3.262125 3.036119 -v -0.187307 3.262125 3.022520 -v -0.187307 3.262125 3.022520 -v -0.224147 3.262125 2.996572 -v -0.204913 3.262125 3.015418 -v -0.187307 3.262125 3.022520 -v -0.206232 3.262125 3.011359 -v -0.224147 3.262125 2.996572 -v -0.224147 3.262125 2.996572 -v -0.224147 3.262125 2.996572 -v -0.232970 3.262125 3.011187 -v -0.213953 3.262125 3.008850 -v -0.224147 3.262125 2.996572 -v -0.217406 3.262125 3.011359 -v -0.232970 3.262125 3.011187 -v -0.232970 3.262125 3.011187 -v -0.197574 3.262125 3.036119 -v -0.218725 3.262125 3.015418 -v -0.232970 3.262125 3.011187 -v -0.217406 3.262125 3.019477 -v -0.217406 3.262125 3.019477 -v -0.197574 3.262125 3.036119 -v -0.213953 3.262125 3.021986 -v -0.197574 3.262125 3.036119 -v -0.197574 3.262125 3.036119 -v -0.206232 3.262125 3.019477 -v -0.197574 3.262125 3.036119 -v -0.204913 3.262125 3.015418 -v -0.637564 3.262125 2.990253 -v -0.637564 3.262125 2.990253 -v -0.695562 3.262125 3.003613 -v -0.683946 3.262125 3.008044 -v -0.637564 3.262125 2.990253 -v -0.687400 3.262125 3.005535 -v -0.695562 3.262125 3.003613 -v -0.691668 3.262125 3.005535 -v -0.695562 3.262125 3.003613 -v -0.741423 3.262125 3.038244 -v -0.691668 3.262125 3.005535 -v -0.741423 3.262125 3.038244 -v -0.741423 3.262125 3.038244 -v -0.696440 3.262125 3.012104 -v -0.741423 3.262125 3.038244 -v -0.695121 3.262125 3.016163 -v -0.741423 3.262125 3.038244 -v -0.741423 3.262125 3.038244 -v -0.730557 3.262125 3.051347 -v -0.730557 3.262125 3.051347 -v -0.686442 3.262125 3.018036 -v -0.691668 3.262125 3.018672 -v -0.741423 3.262125 3.038244 -v -0.687400 3.262125 3.018672 -v -0.686442 3.262125 3.018036 -v -0.637564 3.262125 2.990253 -v -0.687400 3.262125 3.018672 -v -0.686442 3.262125 3.018036 -v -0.683946 3.262125 3.016163 -v -0.682628 3.262125 3.012104 -v -0.683946 3.262125 3.016163 -v -0.637564 3.262125 2.990253 -v -0.879978 3.262124 3.400293 -v -0.877915 3.262124 3.341551 -v -0.881025 3.262124 3.393770 -v -0.877915 3.262124 3.341551 -v -0.882344 3.262124 3.389710 -v -0.877915 3.262124 3.341551 -v -0.885798 3.262124 3.387201 -v -0.877915 3.262124 3.341551 -v -0.890066 3.262124 3.387201 -v -0.877915 3.262124 3.341551 -v -0.894660 3.262124 3.339877 -v -0.890066 3.262124 3.387201 -v -0.894660 3.262124 3.339877 -v -0.894660 3.262124 3.339877 -v -0.896754 3.262124 3.401602 -v -0.893519 3.262124 3.389710 -v -0.894660 3.262124 3.339877 -v -0.894838 3.262124 3.393770 -v -0.894838 3.262124 3.393770 -v -0.896754 3.262124 3.401602 -v -0.896754 3.262124 3.401602 -v -0.896754 3.262124 3.401602 -v -0.879978 3.262124 3.400293 -v -0.890066 3.262124 3.400338 -v -0.896754 3.262124 3.401602 -v -0.885798 3.262124 3.400338 -v -0.879978 3.262124 3.400293 -v -0.882344 3.262124 3.397829 -v -0.879978 3.262124 3.400293 -v -0.881025 3.262124 3.393770 -v -0.680392 3.262123 3.759278 -v -0.671831 3.262123 3.744505 -v -0.671831 3.262123 3.744505 -v -0.713949 3.262123 3.715136 -v -0.679881 3.262123 3.743565 -v -0.671831 3.262123 3.744505 -v -0.713949 3.262123 3.715136 -v -0.688922 3.262123 3.736997 -v -0.713949 3.262123 3.715136 -v -0.692375 3.262123 3.739506 -v -0.713949 3.262123 3.715136 -v -0.724334 3.262123 3.728637 -v -0.692375 3.262123 3.739506 -v -0.724334 3.262123 3.728637 -v -0.724334 3.262123 3.728637 -v -0.680392 3.262123 3.759278 -v -0.693694 3.262123 3.743565 -v -0.724334 3.262123 3.728637 -v -0.692375 3.262123 3.747625 -v -0.680392 3.262123 3.759278 -v -0.680392 3.262123 3.759278 -v -0.684653 3.262123 3.750134 -v -0.680392 3.262123 3.759278 -v -0.681200 3.262123 3.747625 -v -0.680392 3.262123 3.759278 -v -0.679881 3.262123 3.743565 -v -0.178275 3.262122 3.727859 -v -0.178275 3.262122 3.727859 -v -0.188539 3.262122 3.714264 -v -0.207522 3.262122 3.737924 -v -0.178275 3.262122 3.727859 -v -0.210975 3.262122 3.735415 -v -0.188539 3.262122 3.714264 -v -0.225826 3.262122 3.740452 -v -0.210975 3.262122 3.735415 -v -0.188539 3.262122 3.714264 -v -0.215244 3.262122 3.735415 -v -0.215244 3.262122 3.735415 -v -0.225826 3.262122 3.740452 -v -0.218697 3.262122 3.737924 -v -0.225826 3.262122 3.740452 -v -0.225826 3.262122 3.740452 -v -0.217037 3.262122 3.755083 -v -0.220016 3.262122 3.741983 -v -0.217037 3.262122 3.755083 -v -0.218697 3.262122 3.746043 -v -0.217037 3.262122 3.755083 -v -0.215244 3.262122 3.748552 -v -0.217037 3.262122 3.755083 -v -0.217037 3.262122 3.755083 -v -0.178275 3.262122 3.727859 -v -0.210975 3.262122 3.748552 -v -0.178275 3.262122 3.727859 -v -0.178275 3.262122 3.727859 -v -0.206203 3.262122 3.741983 -v -0.897977 3.403733 3.400838 -v -0.878715 3.403806 3.336111 -v -0.881836 3.403733 3.400838 -v -0.878715 3.403806 3.336111 -v -0.881836 3.403733 3.400838 -v -0.878715 3.387264 3.336111 -v -0.881837 3.387337 3.400838 -v -0.878715 3.387264 3.336111 -v -0.881837 3.387337 3.400838 -v -0.895821 3.387264 3.334201 -v -0.897978 3.387336 3.400838 -v -0.895821 3.403806 3.334201 -v -0.895821 3.387264 3.334201 -v -0.897977 3.403733 3.400838 -v -0.895821 3.403806 3.334201 -v -0.895821 3.403806 3.334201 -v -0.878715 3.403806 3.336111 -v -0.867843 3.403804 3.274055 -v -0.878715 3.403806 3.336111 -v -0.867843 3.403804 3.274055 -v -0.878715 3.403806 3.336111 -v -0.878715 3.387264 3.336111 -v -0.867843 3.387266 3.274055 -v -0.878715 3.387264 3.336111 -v -0.867843 3.387266 3.274055 -v -0.878715 3.387264 3.336111 -v -0.895821 3.387264 3.334201 -v -0.884532 3.387266 3.269795 -v -0.895821 3.387264 3.334201 -v -0.884532 3.403804 3.269795 -v -0.884532 3.387266 3.269795 -v -0.895821 3.387264 3.334201 -v -0.895821 3.403806 3.334201 -v -0.884532 3.403804 3.269795 -v -0.884532 3.403804 3.269795 -v -0.867843 3.403804 3.274055 -v -0.849117 3.403800 3.215166 -v -0.867843 3.403804 3.274055 -v -0.849117 3.403800 3.215166 -v -0.867843 3.403804 3.274055 -v -0.867843 3.387266 3.274055 -v -0.849117 3.387269 3.215166 -v -0.867843 3.387266 3.274055 -v -0.849117 3.387269 3.215166 -v -0.867843 3.387266 3.274055 -v -0.884532 3.387266 3.269795 -v -0.865072 3.387269 3.208619 -v -0.884532 3.387266 3.269795 -v -0.865072 3.403800 3.208618 -v -0.865072 3.387269 3.208619 -v -0.884532 3.387266 3.269795 -v -0.884532 3.403804 3.269795 -v -0.865072 3.403800 3.208618 -v -0.865072 3.403800 3.208618 -v -0.849117 3.403800 3.215166 -v -0.822961 3.403798 3.160172 -v -0.849117 3.403800 3.215166 -v -0.822961 3.403798 3.160172 -v -0.849117 3.403800 3.215166 -v -0.849117 3.387269 3.215166 -v -0.822961 3.387272 3.160172 -v -0.849117 3.387269 3.215166 -v -0.822961 3.387272 3.160172 -v -0.849117 3.387269 3.215166 -v -0.865072 3.387269 3.208619 -v -0.837871 3.387272 3.151441 -v -0.865072 3.387269 3.208619 -v -0.837871 3.403798 3.151441 -v -0.837871 3.387272 3.151441 -v -0.865072 3.387269 3.208619 -v -0.865072 3.403800 3.208618 -v -0.837871 3.403798 3.151441 -v -0.837871 3.403798 3.151441 -v -0.822961 3.403798 3.160172 -v -0.789799 3.403796 3.109801 -v -0.822961 3.403798 3.160172 -v -0.789799 3.403796 3.109801 -v -0.822961 3.403798 3.160172 -v -0.822961 3.387272 3.160172 -v -0.789799 3.387275 3.109801 -v -0.822961 3.387272 3.160172 -v -0.789799 3.387275 3.109801 -v -0.822961 3.387272 3.160172 -v -0.837871 3.387272 3.151441 -v -0.803358 3.387275 3.099029 -v -0.837871 3.387272 3.151441 -v -0.803358 3.403796 3.099029 -v -0.803358 3.387275 3.099029 -v -0.837871 3.387272 3.151441 -v -0.837871 3.403798 3.151441 -v -0.803358 3.403796 3.099029 -v -0.803358 3.403796 3.099029 -v -0.789799 3.403796 3.109801 -v -0.750053 3.403794 3.064780 -v -0.789799 3.403796 3.109801 -v -0.750053 3.403794 3.064780 -v -0.789799 3.403796 3.109801 -v -0.789799 3.387275 3.109801 -v -0.750053 3.387277 3.064780 -v -0.789799 3.387275 3.109801 -v -0.750053 3.387277 3.064780 -v -0.789799 3.387275 3.109801 -v -0.803358 3.387275 3.099029 -v -0.761967 3.387277 3.052154 -v -0.803358 3.387275 3.099029 -v -0.761967 3.403793 3.052154 -v -0.761967 3.387277 3.052154 -v -0.803358 3.387275 3.099029 -v -0.803358 3.403796 3.099029 -v -0.761967 3.403793 3.052154 -v -0.761967 3.403793 3.052154 -v -0.750053 3.403794 3.064780 -v -0.704138 3.403790 3.025832 -v -0.750053 3.403794 3.064780 -v -0.704138 3.403790 3.025832 -v -0.750053 3.403794 3.064780 -v -0.750053 3.387277 3.064780 -v -0.704138 3.387279 3.025832 -v -0.750053 3.387277 3.064780 -v -0.704138 3.387279 3.025832 -v -0.750053 3.387277 3.064780 -v -0.761967 3.387277 3.052154 -v -0.714135 3.387279 3.011588 -v -0.761967 3.387277 3.052154 -v -0.714135 3.403790 3.011588 -v -0.714135 3.387279 3.011588 -v -0.761967 3.387277 3.052154 -v -0.761967 3.403793 3.052154 -v -0.714135 3.403790 3.011588 -v -0.704138 3.403790 3.025832 -v -0.704138 3.403790 3.025832 -v -0.652463 3.403788 2.993680 -v -0.704138 3.403790 3.025832 -v -0.704138 3.387279 3.025832 -v -0.652463 3.387282 2.993680 -v -0.704138 3.387279 3.025832 -v -0.652463 3.387282 2.993680 -v -0.704138 3.387279 3.025832 -v -0.714135 3.387279 3.011588 -v -0.660309 3.387283 2.978104 -v -0.714135 3.387279 3.011588 -v -0.660309 3.387283 2.978104 -v -0.714135 3.387279 3.011588 -v -0.714135 3.403790 3.011588 -v -0.660309 3.403788 2.978104 -v -0.660309 3.403788 2.978104 -v -0.660309 3.403788 2.978104 -v -0.652463 3.403788 2.993680 -v -0.652463 3.403788 2.993680 -v -0.595428 3.403785 2.969051 -v -0.652463 3.403788 2.993680 -v -0.652463 3.387282 2.993680 -v -0.652463 3.387282 2.993680 -v -0.652463 3.387282 2.993680 -v -0.660309 3.387283 2.978104 -v -0.660309 3.387283 2.978104 -v -0.600944 3.403785 2.952474 -v -0.660309 3.387283 2.978104 -v -0.660309 3.403788 2.978104 -v -0.600944 3.403785 2.952474 -v -0.595428 3.403785 2.969051 -v -0.533420 3.403783 2.952676 -v -0.595428 3.403785 2.969051 -v -0.536505 3.403784 2.935461 -v -0.600944 3.403785 2.952474 -v -0.536505 3.403784 2.935461 -v -0.533420 3.403783 2.952676 -v -0.467084 3.403780 2.945306 -v -0.533420 3.403783 2.952676 -v -0.467201 3.403781 2.927811 -v -0.536505 3.403784 2.935461 -v -0.467201 3.403781 2.927811 -v -0.467084 3.403780 2.945306 -v -0.407494 3.403779 2.950058 -v -0.467084 3.403780 2.945306 -v -0.405304 3.403779 2.932710 -v -0.467201 3.403781 2.927811 -v -0.405304 3.403779 2.932710 -v -0.407494 3.403779 2.950058 -v -0.352922 3.403777 2.960197 -v -0.407494 3.403779 2.950058 -v -0.348926 3.403777 2.943193 -v -0.405304 3.403779 2.932710 -v -0.348926 3.403777 2.943193 -v -0.352922 3.403777 2.960197 -v -0.303357 3.403774 2.975363 -v -0.352922 3.403777 2.960197 -v -0.297479 3.403774 2.958941 -v -0.348926 3.403777 2.943193 -v -0.297479 3.403774 2.958941 -v -0.303357 3.403774 2.975363 -v -0.258460 3.403773 2.995206 -v -0.303357 3.403774 2.975363 -v -0.303357 3.387296 2.975363 -v -0.258460 3.387299 2.995206 -v -0.303357 3.387296 2.975363 -v -0.297479 3.387296 2.958941 -v -0.297479 3.387296 2.958941 -v -0.250709 3.403773 2.979618 -v -0.250709 3.387299 2.979618 -v -0.297479 3.387296 2.958941 -v -0.297479 3.403774 2.958941 -v -0.250709 3.403773 2.979618 -v -0.250709 3.403773 2.979618 -v -0.250709 3.403773 2.979618 -v -0.258460 3.403773 2.995206 -v -0.258460 3.403773 2.995206 -v -0.258460 3.403773 2.995206 -v -0.258460 3.387299 2.995206 -v -0.258460 3.387299 2.995206 -v -0.258460 3.387299 2.995206 -v -0.250709 3.387299 2.979618 -v -0.208365 3.387300 3.004872 -v -0.250709 3.387299 2.979618 -v -0.208365 3.387300 3.004872 -v -0.250709 3.387299 2.979618 -v -0.250709 3.403773 2.979618 -v -0.208365 3.403770 3.004872 -v -0.217887 3.403770 3.019398 -v -0.181299 3.403768 3.047629 -v -0.181299 3.403768 3.047629 -v -0.217887 3.403770 3.019398 -v -0.217887 3.387300 3.019398 -v -0.181299 3.387302 3.047629 -v -0.181299 3.387302 3.047629 -v -0.217887 3.387300 3.019398 -v -0.208365 3.387300 3.004872 -v -0.170191 3.387302 3.034332 -v -0.208365 3.387300 3.004872 -v -0.170191 3.387302 3.034332 -v -0.208365 3.387300 3.004872 -v -0.208365 3.403770 3.004872 -v -0.170191 3.403768 3.034332 -v -0.181299 3.403768 3.047629 -v -0.148374 3.403765 3.079597 -v -0.181299 3.403768 3.047629 -v -0.148374 3.403765 3.079597 -v -0.181299 3.403768 3.047629 -v -0.181299 3.387302 3.047629 -v -0.148374 3.387304 3.079597 -v -0.181299 3.387302 3.047629 -v -0.148374 3.387304 3.079597 -v -0.181299 3.387302 3.047629 -v -0.170191 3.387302 3.034332 -v -0.135915 3.387304 3.067616 -v -0.170191 3.387302 3.034332 -v -0.135915 3.387304 3.067616 -v -0.170191 3.387302 3.034332 -v -0.170191 3.403768 3.034332 -v -0.135915 3.403766 3.067616 -v -0.148374 3.403765 3.079597 -v -0.118806 3.403764 3.115002 -v -0.148374 3.403765 3.079597 -v -0.118806 3.403764 3.115002 -v -0.148374 3.403765 3.079597 -v -0.148374 3.387304 3.079597 -v -0.118806 3.387307 3.115002 -v -0.148374 3.387304 3.079597 -v -0.118806 3.387307 3.115002 -v -0.148374 3.387304 3.079597 -v -0.135915 3.387304 3.067616 -v -0.105247 3.387307 3.104342 -v -0.135915 3.387304 3.067616 -v -0.105247 3.387307 3.104342 -v -0.135915 3.387304 3.067616 -v -0.135915 3.403766 3.067616 -v -0.105247 3.403764 3.104342 -v -0.118806 3.403764 3.115002 -v -0.092305 3.403762 3.153536 -v -0.118806 3.403764 3.115002 -v -0.092305 3.403762 3.153536 -v -0.118806 3.403764 3.115002 -v -0.118806 3.387307 3.115002 -v -0.092305 3.387308 3.153536 -v -0.118806 3.387307 3.115002 -v -0.092305 3.387308 3.153536 -v -0.118806 3.387307 3.115002 -v -0.105247 3.387307 3.104342 -v -0.077882 3.387308 3.144137 -v -0.105247 3.387307 3.104342 -v -0.077882 3.387308 3.144137 -v -0.105247 3.387307 3.104342 -v -0.105247 3.403764 3.104342 -v -0.077881 3.403762 3.144137 -v -0.092305 3.403762 3.153536 -v -0.068589 3.403759 3.194881 -v -0.092305 3.403762 3.153536 -v -0.068589 3.403759 3.194881 -v -0.092305 3.403762 3.153536 -v -0.092305 3.387308 3.153536 -v -0.068589 3.387310 3.194881 -v -0.092305 3.387308 3.153536 -v -0.068589 3.387310 3.194881 -v -0.092305 3.387308 3.153536 -v -0.077882 3.387308 3.144137 -v -0.053507 3.387310 3.186636 -v -0.077882 3.387308 3.144137 -v -0.053507 3.403759 3.186636 -v -0.053507 3.387310 3.186636 -v -0.077882 3.387308 3.144137 -v -0.077881 3.403762 3.144137 -v -0.053507 3.403759 3.186636 -v -0.053507 3.403759 3.186636 -v -0.068589 3.403759 3.194881 -v -0.044226 3.403758 3.243448 -v -0.068589 3.403759 3.194881 -v -0.044226 3.403758 3.243448 -v -0.068589 3.403759 3.194881 -v -0.068589 3.387310 3.194881 -v -0.044226 3.387312 3.243448 -v -0.068589 3.387310 3.194881 -v -0.044226 3.387312 3.243448 -v -0.068589 3.387310 3.194881 -v -0.053507 3.387310 3.186636 -v -0.034330 3.387312 3.226375 -v -0.053507 3.387310 3.186636 -v -0.034330 3.387312 3.226375 -v -0.053507 3.387310 3.186636 -v -0.053507 3.403759 3.186636 -v -0.034330 3.403758 3.226375 -v -0.034330 3.403758 3.226375 -v -0.034330 3.403758 3.226375 -v -0.044226 3.403758 3.243448 -v -0.009815 3.403756 3.243817 -v -0.044226 3.403758 3.243448 -v -0.009815 3.403756 3.243817 -v -0.044226 3.403758 3.243448 -v -0.044226 3.387312 3.243448 -v -0.009813 3.387314 3.243818 -v -0.044226 3.387312 3.243448 -v -0.009813 3.387314 3.243818 -v -0.044226 3.387312 3.243448 -v -0.034330 3.387312 3.226375 -v -0.009815 3.387314 3.226374 -v -0.034330 3.387312 3.226375 -v -0.009815 3.387314 3.226374 -v -0.034330 3.387312 3.226375 -v -0.034330 3.403758 3.226375 -v -0.009816 3.403756 3.226373 -v -0.009816 3.403756 3.226373 -v -0.009815 3.403756 3.243817 -v 0.022104 3.403755 3.243811 -v -0.009815 3.403756 3.243817 -v 0.022104 3.403755 3.243811 -v -0.009815 3.403756 3.243817 -v -0.009813 3.387314 3.243818 -v 0.022106 3.387316 3.243812 -v -0.009813 3.387314 3.243818 -v 0.022106 3.387316 3.243812 -v -0.009813 3.387314 3.243818 -v -0.009815 3.387314 3.226374 -v 0.022104 3.387315 3.226372 -v -0.009815 3.387314 3.226374 -v 0.022104 3.387315 3.226372 -v -0.009815 3.387314 3.226374 -v -0.009816 3.403756 3.226373 -v 0.022102 3.403754 3.226371 -v 0.022102 3.403754 3.226371 -v 0.022104 3.403755 3.243811 -v 0.055940 3.403753 3.243804 -v 0.022104 3.403755 3.243811 -v 0.055940 3.403753 3.243804 -v 0.022104 3.403755 3.243811 -v 0.022106 3.387316 3.243812 -v 0.055942 3.387317 3.243804 -v 0.022106 3.387316 3.243812 -v 0.055942 3.387317 3.243804 -v 0.022106 3.387316 3.243812 -v 0.022104 3.387315 3.226372 -v 0.055940 3.387316 3.226367 -v 0.022104 3.387315 3.226372 -v 0.055940 3.387316 3.226367 -v 0.022104 3.387315 3.226372 -v 0.022102 3.403754 3.226371 -v 0.055938 3.403752 3.226367 -v 0.055938 3.403752 3.226367 -v 0.055940 3.403753 3.243804 -v 0.091472 3.403751 3.243795 -v 0.055940 3.403753 3.243804 -v 0.091472 3.403751 3.243795 -v 0.055940 3.403753 3.243804 -v 0.055942 3.387317 3.243804 -v 0.091474 3.387318 3.243795 -v 0.055942 3.387317 3.243804 -v 0.091474 3.387318 3.243795 -v 0.055942 3.387317 3.243804 -v 0.055940 3.387316 3.226367 -v 0.091472 3.387318 3.226362 -v 0.055940 3.387316 3.226367 -v 0.091472 3.387318 3.226362 -v 0.055940 3.387316 3.226367 -v 0.055938 3.403752 3.226367 -v 0.091470 3.403750 3.226361 -v 0.091470 3.403750 3.226361 -v 0.091472 3.403751 3.243795 -v 0.128477 3.403750 3.243785 -v 0.091472 3.403751 3.243795 -v 0.128477 3.403750 3.243785 -v 0.091472 3.403751 3.243795 -v 0.091474 3.387318 3.243795 -v 0.128479 3.387320 3.243786 -v 0.091474 3.387318 3.243795 -v 0.128479 3.387320 3.243786 -v 0.091474 3.387318 3.243795 -v 0.091472 3.387318 3.226362 -v 0.128477 3.387320 3.226355 -v 0.091472 3.387318 3.226362 -v 0.128477 3.387320 3.226355 -v 0.091472 3.387318 3.226362 -v 0.091470 3.403750 3.226361 -v 0.128476 3.403750 3.226355 -v 0.128476 3.403750 3.226355 -v 0.128477 3.403750 3.243785 -v 0.166736 3.403749 3.243775 -v 0.128477 3.403750 3.243785 -v 0.166736 3.403749 3.243775 -v 0.128477 3.403750 3.243785 -v 0.128479 3.387320 3.243786 -v 0.166738 3.387322 3.243776 -v 0.128479 3.387320 3.243786 -v 0.166738 3.387322 3.243776 -v 0.128479 3.387320 3.243786 -v 0.128477 3.387320 3.226355 -v 0.166736 3.387321 3.226348 -v 0.128477 3.387320 3.226355 -v 0.166736 3.387321 3.226348 -v 0.128477 3.387320 3.226355 -v 0.128476 3.403750 3.226355 -v 0.166734 3.403748 3.226348 -v 0.166734 3.403748 3.226348 -v 0.166736 3.403749 3.243775 -v 0.206025 3.403747 3.243765 -v 0.166736 3.403749 3.243775 -v 0.206025 3.403747 3.243765 -v 0.166736 3.403749 3.243775 -v 0.166738 3.387322 3.243776 -v 0.206027 3.387323 3.243766 -v 0.166738 3.387322 3.243776 -v 0.206027 3.387323 3.243766 -v 0.166738 3.387322 3.243776 -v 0.166736 3.387321 3.226348 -v 0.206026 3.387323 3.226342 -v 0.166736 3.387321 3.226348 -v 0.206026 3.387323 3.226342 -v 0.166736 3.387321 3.226348 -v 0.166734 3.403748 3.226348 -v 0.206024 3.403747 3.226341 -v 0.206024 3.403747 3.226341 -v 0.206025 3.403747 3.243765 -v 0.246124 3.403745 3.243757 -v 0.206025 3.403747 3.243765 -v 0.246124 3.403745 3.243757 -v 0.206025 3.403747 3.243765 -v 0.206027 3.387323 3.243766 -v 0.246126 3.387325 3.243757 -v 0.206027 3.387323 3.243766 -v 0.246126 3.387325 3.243757 -v 0.206027 3.387323 3.243766 -v 0.206026 3.387323 3.226342 -v 0.246124 3.387324 3.226336 -v 0.206026 3.387323 3.226342 -v 0.246122 3.403745 3.226336 -v 0.246124 3.387324 3.226336 -v 0.206026 3.387323 3.226342 -v 0.206024 3.403747 3.226341 -v 0.246122 3.403745 3.226336 -v 0.246122 3.403745 3.226336 -v 0.246122 3.403745 3.226336 -v 0.246124 3.403745 3.243757 -v 0.286810 3.403744 3.243749 -v 0.246124 3.403745 3.243757 -v 0.286810 3.403744 3.243749 -v 0.246124 3.403745 3.243757 -v 0.246126 3.387325 3.243757 -v 0.286812 3.387326 3.243749 -v 0.246126 3.387325 3.243757 -v 0.286812 3.387326 3.243749 -v 0.246126 3.387325 3.243757 -v 0.246124 3.387324 3.226336 -v 0.286811 3.387326 3.226332 -v 0.246124 3.387324 3.226336 -v 0.286811 3.387326 3.226332 -v 0.246124 3.387324 3.226336 -v 0.246122 3.403745 3.226336 -v 0.286809 3.403744 3.226331 -v 0.286809 3.403744 3.226331 -v 0.286810 3.403744 3.243749 -v 0.327863 3.403743 3.243743 -v 0.286810 3.403744 3.243749 -v 0.327863 3.403743 3.243743 -v 0.286810 3.403744 3.243749 -v 0.286812 3.387326 3.243749 -v 0.327865 3.387328 3.243744 -v 0.286812 3.387326 3.243749 -v 0.327865 3.387328 3.243744 -v 0.286812 3.387326 3.243749 -v 0.286811 3.387326 3.226332 -v 0.327863 3.387327 3.226330 -v 0.286811 3.387326 3.226332 -v 0.327861 3.403742 3.226329 -v 0.327863 3.387327 3.226330 -v 0.286811 3.387326 3.226332 -v 0.286809 3.403744 3.226331 -v 0.327861 3.403742 3.226329 -v 0.327861 3.403742 3.226329 -v 0.327861 3.403742 3.226329 -v 0.327863 3.403743 3.243743 -v 0.369072 3.403741 3.243740 -v 0.327863 3.403743 3.243743 -v 0.369072 3.403741 3.243740 -v 0.327863 3.403743 3.243743 -v 0.327865 3.387328 3.243744 -v 0.369074 3.387329 3.243741 -v 0.327865 3.387328 3.243744 -v 0.369074 3.387329 3.243741 -v 0.327865 3.387328 3.243744 -v 0.327863 3.387327 3.226330 -v 0.369047 3.387329 3.226330 -v 0.327863 3.387327 3.226330 -v 0.369047 3.387329 3.226330 -v 0.327863 3.387327 3.226330 -v 0.327861 3.403742 3.226329 -v 0.369045 3.403740 3.226329 -v 0.369072 3.403741 3.243740 -v 0.389608 3.403740 3.245059 -v 0.369072 3.403741 3.243740 -v 0.389608 3.403740 3.245059 -v 0.369072 3.403741 3.243740 -v 0.369074 3.387329 3.243741 -v 0.389610 3.387331 3.245060 -v 0.369074 3.387329 3.243741 -v 0.389610 3.387331 3.245060 -v 0.369074 3.387329 3.243741 -v 0.369047 3.387329 3.226330 -v 0.392028 3.387330 3.227826 -v 0.369047 3.387329 3.226330 -v 0.392026 3.403740 3.227825 -v 0.392028 3.387330 3.227826 -v 0.369047 3.387329 3.226330 -v 0.369045 3.403740 3.226329 -v 0.392026 3.403740 3.227825 -v 0.392026 3.403740 3.227825 -v 0.389608 3.403740 3.245059 -v 0.408457 3.403739 3.249382 -v 0.389608 3.403740 3.245059 -v 0.408457 3.403739 3.249382 -v 0.389608 3.403740 3.245059 -v 0.389610 3.387331 3.245060 -v 0.408460 3.387331 3.249383 -v 0.389610 3.387331 3.245060 -v 0.408460 3.387331 3.249383 -v 0.389610 3.387331 3.245060 -v 0.392028 3.387330 3.227826 -v 0.413540 3.387331 3.232764 -v 0.392028 3.387330 3.227826 -v 0.413540 3.387331 3.232764 -v 0.392028 3.387330 3.227826 -v 0.392026 3.403740 3.227825 -v 0.413538 3.403739 3.232763 -v 0.408457 3.403739 3.249382 -v 0.425682 3.403738 3.256446 -v 0.408457 3.403739 3.249382 -v 0.425682 3.403738 3.256446 -v 0.408457 3.403739 3.249382 -v 0.408460 3.387331 3.249383 -v 0.425683 3.387332 3.256447 -v 0.408460 3.387331 3.249383 -v 0.425683 3.387332 3.256447 -v 0.408460 3.387331 3.249383 -v 0.413540 3.387331 3.232764 -v 0.433312 3.387331 3.240877 -v 0.413540 3.387331 3.232764 -v 0.433312 3.387331 3.240877 -v 0.413540 3.387331 3.232764 -v 0.413538 3.403739 3.232763 -v 0.433310 3.403738 3.240876 -v 0.425682 3.403738 3.256446 -v 0.441232 3.403737 3.266013 -v 0.425682 3.403738 3.256446 -v 0.441232 3.403737 3.266013 -v 0.425682 3.403738 3.256446 -v 0.425683 3.387332 3.256447 -v 0.441233 3.387332 3.266015 -v 0.425683 3.387332 3.256447 -v 0.441233 3.387332 3.266015 -v 0.425683 3.387332 3.256447 -v 0.433312 3.387331 3.240877 -v 0.451179 3.387332 3.251872 -v 0.433312 3.387331 3.240877 -v 0.451179 3.387332 3.251872 -v 0.433312 3.387331 3.240877 -v 0.433310 3.403738 3.240876 -v 0.451177 3.403737 3.251870 -v 0.451177 3.403737 3.251870 -v 0.441232 3.403737 3.266013 -v 0.455044 3.403737 3.277862 -v 0.441232 3.403737 3.266013 -v 0.455044 3.403737 3.277862 -v 0.441232 3.403737 3.266013 -v 0.441233 3.387332 3.266015 -v 0.455045 3.387334 3.277864 -v 0.441233 3.387332 3.266015 -v 0.455045 3.387334 3.277864 -v 0.441233 3.387332 3.266015 -v 0.451179 3.387332 3.251872 -v 0.466994 3.387333 3.265440 -v 0.451179 3.387332 3.251872 -v 0.466994 3.387333 3.265440 -v 0.451179 3.387332 3.251872 -v 0.451177 3.403737 3.251870 -v 0.466993 3.403736 3.265438 -v 0.466993 3.403736 3.265438 -v 0.466993 3.403736 3.265438 -v 0.455044 3.403737 3.277862 -v 0.455044 3.403737 3.277862 -v 0.467029 3.403736 3.291773 -v 0.455044 3.403737 3.277862 -v 0.455045 3.387334 3.277864 -v 0.455045 3.387334 3.277864 -v 0.455045 3.387334 3.277864 -v 0.466994 3.387333 3.265440 -v 0.466994 3.387333 3.265440 -v 0.480633 3.403735 3.281270 -v 0.466994 3.387333 3.265440 -v 0.466993 3.403736 3.265438 -v 0.480633 3.403735 3.281270 -v 0.467029 3.403736 3.291773 -v 0.477081 3.403735 3.307518 -v 0.467029 3.403736 3.291773 -v 0.491990 3.403734 3.299059 -v 0.480633 3.403735 3.281270 -v 0.491990 3.403734 3.299059 -v 0.477081 3.403735 3.307518 -v 0.485086 3.403734 3.324862 -v 0.477081 3.403735 3.307518 -v 0.500970 3.403733 3.318515 -v 0.491990 3.403734 3.299059 -v 0.500970 3.403733 3.318515 -v 0.485086 3.403734 3.324862 -v 0.490925 3.403733 3.343559 -v 0.485086 3.403734 3.324862 -v 0.507476 3.403733 3.339351 -v 0.500970 3.403733 3.318515 -v 0.507476 3.403733 3.339351 -v 0.490925 3.403733 3.343559 -v 0.494481 3.403732 3.363354 -v 0.490925 3.403733 3.343559 -v 0.511416 3.403732 3.361290 -v 0.507476 3.403733 3.339351 -v 0.511416 3.403732 3.361290 -v 0.494481 3.403732 3.363354 -v 0.495639 3.403732 3.383988 -v 0.494481 3.403732 3.363354 -v 0.512692 3.403731 3.384063 -v 0.511416 3.403732 3.361290 -v 0.512692 3.403731 3.384063 -v 0.495639 3.403732 3.383988 -v 0.494190 3.403731 3.403972 -v 0.495639 3.403732 3.383988 -v 0.511059 3.403730 3.406520 -v 0.512692 3.403731 3.384063 -v 0.511059 3.403730 3.406520 -v 0.494190 3.403731 3.403972 -v 0.490162 3.403731 3.422238 -v 0.494190 3.403731 3.403972 -v 0.506461 3.403729 3.427344 -v 0.511059 3.403730 3.406520 -v 0.506461 3.403729 3.427344 -v 0.490162 3.403731 3.422238 -v 0.483777 3.403730 3.438778 -v 0.490162 3.403731 3.422238 -v 0.499101 3.403729 3.446400 -v 0.506461 3.403729 3.427344 -v 0.499101 3.403729 3.446400 -v 0.483777 3.403730 3.438778 -v 0.475233 3.403729 3.453587 -v 0.483777 3.403730 3.438778 -v 0.489201 3.403728 3.463554 -v 0.499101 3.403729 3.446400 -v 0.489201 3.403728 3.463554 -v 0.475233 3.403729 3.453587 -v 0.464709 3.403728 3.466645 -v 0.475233 3.403729 3.453587 -v 0.477006 3.403727 3.478683 -v 0.489201 3.403728 3.463554 -v 0.477006 3.403727 3.478683 -v 0.464709 3.403728 3.466645 -v 0.452373 3.403728 3.477911 -v 0.464709 3.403728 3.466645 -v 0.464707 3.387342 3.466645 -v 0.452371 3.387344 3.477911 -v 0.452371 3.387344 3.477911 -v 0.462769 3.387342 3.491684 -v 0.477003 3.387341 3.478684 -v 0.462771 3.403726 3.491684 -v 0.462769 3.387342 3.491684 -v 0.477003 3.387341 3.478684 -v 0.477006 3.403727 3.478683 -v 0.462771 3.403726 3.491684 -v 0.462771 3.403726 3.491684 -v 0.462771 3.403726 3.491684 -v 0.452373 3.403728 3.477911 -v 0.438393 3.403727 3.487329 -v 0.452373 3.403728 3.477911 -v 0.438393 3.403727 3.487329 -v 0.452373 3.403728 3.477911 -v 0.452371 3.387344 3.477911 -v 0.438391 3.387344 3.487329 -v 0.452371 3.387344 3.477911 -v 0.438391 3.387344 3.487329 -v 0.452371 3.387344 3.477911 -v 0.462769 3.387342 3.491684 -v 0.446752 3.387342 3.502473 -v 0.462769 3.387342 3.491684 -v 0.446755 3.403726 3.502474 -v 0.446752 3.387342 3.502473 -v 0.462769 3.387342 3.491684 -v 0.462771 3.403726 3.491684 -v 0.446755 3.403726 3.502474 -v 0.446755 3.403726 3.502474 -v 0.446755 3.403726 3.502474 -v 0.438393 3.403727 3.487329 -v 0.422939 3.403726 3.494823 -v 0.438393 3.403727 3.487329 -v 0.422939 3.403726 3.494823 -v 0.438393 3.403727 3.487329 -v 0.438391 3.387344 3.487329 -v 0.422938 3.387345 3.494822 -v 0.438391 3.387344 3.487329 -v 0.422938 3.387345 3.494822 -v 0.438391 3.387344 3.487329 -v 0.446752 3.387342 3.502473 -v 0.429204 3.387344 3.510983 -v 0.446752 3.387342 3.502473 -v 0.429205 3.403724 3.510984 -v 0.429204 3.387344 3.510983 -v 0.446752 3.387342 3.502473 -v 0.446755 3.403726 3.502474 -v 0.429205 3.403724 3.510984 -v 0.429205 3.403724 3.510984 -v 0.429205 3.403724 3.510984 -v 0.422939 3.403726 3.494823 -v 0.406200 3.403725 3.500308 -v 0.422939 3.403726 3.494823 -v 0.406200 3.403725 3.500308 -v 0.422939 3.403726 3.494823 -v 0.422938 3.387345 3.494822 -v 0.406199 3.387346 3.500306 -v 0.422938 3.387345 3.494822 -v 0.406199 3.387346 3.500306 -v 0.422938 3.387345 3.494822 -v 0.429204 3.387344 3.510983 -v 0.410362 3.387345 3.517156 -v 0.429204 3.387344 3.510983 -v 0.410363 3.403724 3.517158 -v 0.410362 3.387345 3.517156 -v 0.429204 3.387344 3.510983 -v 0.429205 3.403724 3.510984 -v 0.410363 3.403724 3.517158 -v 0.410363 3.403724 3.517158 -v 0.410363 3.403724 3.517158 -v 0.406200 3.403725 3.500308 -v 0.388366 3.403724 3.503696 -v 0.406200 3.403725 3.500308 -v 0.388366 3.403724 3.503696 -v 0.406200 3.403725 3.500308 -v 0.406199 3.387346 3.500306 -v 0.388364 3.387347 3.503694 -v 0.406199 3.387346 3.500306 -v 0.388364 3.387347 3.503694 -v 0.406199 3.387346 3.500306 -v 0.410362 3.387345 3.517156 -v 0.390455 3.387345 3.520938 -v 0.410362 3.387345 3.517156 -v 0.390457 3.403723 3.520940 -v 0.390455 3.387345 3.520938 -v 0.410362 3.387345 3.517156 -v 0.410363 3.403724 3.517158 -v 0.390457 3.403723 3.520940 -v 0.390457 3.403723 3.520940 -v 0.390457 3.403723 3.520940 -v 0.388366 3.403724 3.503696 -v 0.369579 3.403723 3.504902 -v 0.388366 3.403724 3.503696 -v 0.369579 3.403723 3.504902 -v 0.388366 3.403724 3.503696 -v 0.388364 3.387347 3.503694 -v 0.369577 3.387347 3.504900 -v 0.388364 3.387347 3.503694 -v 0.369577 3.387347 3.504900 -v 0.388364 3.387347 3.503694 -v 0.390455 3.387345 3.520938 -v 0.369769 3.387346 3.522272 -v 0.390455 3.387345 3.520938 -v 0.369770 3.403722 3.522274 -v 0.369769 3.387346 3.522272 -v 0.390455 3.387345 3.520938 -v 0.390457 3.403723 3.520940 -v 0.369770 3.403722 3.522274 -v 0.369770 3.403722 3.522274 -v 0.369770 3.403722 3.522274 -v 0.369579 3.403723 3.504902 -v 0.341038 3.403723 3.505027 -v 0.369579 3.403723 3.504902 -v 0.341038 3.403723 3.505027 -v 0.369579 3.403723 3.504902 -v 0.369577 3.387347 3.504900 -v 0.341034 3.387349 3.505025 -v 0.369577 3.387347 3.504900 -v 0.341034 3.387349 3.505025 -v 0.369577 3.387347 3.504900 -v 0.369769 3.387346 3.522272 -v 0.341134 3.387348 3.522395 -v 0.369769 3.387346 3.522272 -v 0.341138 3.403721 3.522397 -v 0.341134 3.387348 3.522395 -v 0.369769 3.387346 3.522272 -v 0.369770 3.403722 3.522274 -v 0.341138 3.403721 3.522397 -v 0.341138 3.403721 3.522397 -v 0.341138 3.403721 3.522397 -v 0.341038 3.403723 3.505027 -v 0.307508 3.403721 3.504871 -v 0.341038 3.403723 3.505027 -v 0.307508 3.403721 3.504871 -v 0.341038 3.403723 3.505027 -v 0.341034 3.387349 3.505025 -v 0.307505 3.387350 3.504869 -v 0.307505 3.387350 3.504869 -v 0.341034 3.387349 3.505025 -v 0.341134 3.387348 3.522395 -v 0.307539 3.387348 3.522237 -v 0.341134 3.387348 3.522395 -v 0.307542 3.403719 3.522238 -v 0.307539 3.387348 3.522237 -v 0.341134 3.387348 3.522395 -v 0.341138 3.403721 3.522397 -v 0.307542 3.403719 3.522238 -v 0.307542 3.403719 3.522238 -v 0.307542 3.403719 3.522238 -v 0.307508 3.403721 3.504871 -v 0.270053 3.403719 3.504832 -v 0.307508 3.403721 3.504871 -v 0.270053 3.403719 3.504832 -v 0.307508 3.403721 3.504871 -v 0.307505 3.387350 3.504869 -v 0.270051 3.387352 3.504832 -v 0.307505 3.387350 3.504869 -v 0.270051 3.387352 3.504832 -v 0.307505 3.387350 3.504869 -v 0.307539 3.387348 3.522237 -v 0.270040 3.387350 3.522183 -v 0.307539 3.387348 3.522237 -v 0.270042 3.403717 3.522183 -v 0.270040 3.387350 3.522183 -v 0.307539 3.387348 3.522237 -v 0.307542 3.403719 3.522238 -v 0.270042 3.403717 3.522183 -v 0.270042 3.403717 3.522183 -v 0.270042 3.403717 3.522183 -v 0.270053 3.403719 3.504832 -v 0.229737 3.403717 3.504830 -v 0.270053 3.403719 3.504832 -v 0.229737 3.403717 3.504830 -v 0.270053 3.403719 3.504832 -v 0.270051 3.387352 3.504832 -v 0.229735 3.387353 3.504830 -v 0.270051 3.387352 3.504832 -v 0.229735 3.387353 3.504830 -v 0.270051 3.387352 3.504832 -v 0.270040 3.387350 3.522183 -v 0.229692 3.387352 3.522181 -v 0.270040 3.387350 3.522183 -v 0.229695 3.403715 3.522181 -v 0.229692 3.387352 3.522181 -v 0.270040 3.387350 3.522183 -v 0.270042 3.403717 3.522183 -v 0.229695 3.403715 3.522181 -v 0.229695 3.403715 3.522181 -v 0.229695 3.403715 3.522181 -v 0.229737 3.403717 3.504830 -v 0.187622 3.403716 3.504826 -v 0.229737 3.403717 3.504830 -v 0.187622 3.403716 3.504826 -v 0.229737 3.403717 3.504830 -v 0.229735 3.387353 3.504830 -v 0.187621 3.387355 3.504826 -v 0.229735 3.387353 3.504830 -v 0.187621 3.387355 3.504826 -v 0.229735 3.387353 3.504830 -v 0.229692 3.387352 3.522181 -v 0.187555 3.387353 3.522177 -v 0.229692 3.387352 3.522181 -v 0.187556 3.403715 3.522177 -v 0.187555 3.387353 3.522177 -v 0.229692 3.387352 3.522181 -v 0.229695 3.403715 3.522181 -v 0.187556 3.403715 3.522177 -v 0.187556 3.403715 3.522177 -v 0.187556 3.403715 3.522177 -v 0.187622 3.403716 3.504826 -v 0.144769 3.403715 3.504821 -v 0.187622 3.403716 3.504826 -v 0.144769 3.403715 3.504821 -v 0.187622 3.403716 3.504826 -v 0.187621 3.387355 3.504826 -v 0.144767 3.387357 3.504820 -v 0.187621 3.387355 3.504826 -v 0.144767 3.387357 3.504820 -v 0.187621 3.387355 3.504826 -v 0.187555 3.387353 3.522177 -v 0.144684 3.387355 3.522171 -v 0.187555 3.387353 3.522177 -v 0.144685 3.403713 3.522172 -v 0.144684 3.387355 3.522171 -v 0.187555 3.387353 3.522177 -v 0.187556 3.403715 3.522177 -v 0.144685 3.403713 3.522172 -v 0.144685 3.403713 3.522172 -v 0.144685 3.403713 3.522172 -v 0.144769 3.403715 3.504821 -v 0.102240 3.403713 3.504813 -v 0.144769 3.403715 3.504821 -v 0.102240 3.403713 3.504813 -v 0.144769 3.403715 3.504821 -v 0.144767 3.387357 3.504820 -v 0.102238 3.387358 3.504813 -v 0.144767 3.387357 3.504820 -v 0.102238 3.387358 3.504813 -v 0.144767 3.387357 3.504820 -v 0.144684 3.387355 3.522171 -v 0.102141 3.387357 3.522165 -v 0.144684 3.387355 3.522171 -v 0.102142 3.403711 3.522166 -v 0.102141 3.387357 3.522165 -v 0.144685 3.403713 3.522172 -v 0.102142 3.403711 3.522166 -v 0.102142 3.403711 3.522166 -v 0.102142 3.403711 3.522166 -v 0.102240 3.403713 3.504813 -v 0.061094 3.403711 3.504806 -v 0.102240 3.403713 3.504813 -v 0.061094 3.403711 3.504806 -v 0.102240 3.403713 3.504813 -v 0.102238 3.387358 3.504813 -v 0.061093 3.387359 3.504806 -v 0.102238 3.387358 3.504813 -v 0.061093 3.387359 3.504806 -v 0.102238 3.387358 3.504813 -v 0.102141 3.387357 3.522165 -v 0.060985 3.387357 3.522158 -v 0.102141 3.387357 3.522165 -v 0.060986 3.403709 3.522159 -v 0.060985 3.387357 3.522158 -v 0.102141 3.387357 3.522165 -v 0.102142 3.403711 3.522166 -v 0.060986 3.403709 3.522159 -v 0.060986 3.403709 3.522159 -v 0.060986 3.403709 3.522159 -v 0.061094 3.403711 3.504806 -v 0.022391 3.403710 3.504798 -v 0.061094 3.403711 3.504806 -v 0.022391 3.403710 3.504798 -v 0.061094 3.403711 3.504806 -v 0.061093 3.387359 3.504806 -v 0.022390 3.387361 3.504798 -v 0.061093 3.387359 3.504806 -v 0.022390 3.387361 3.504798 -v 0.061093 3.387359 3.504806 -v 0.060985 3.387357 3.522158 -v 0.022276 3.387360 3.522151 -v 0.060985 3.387357 3.522158 -v 0.022277 3.403708 3.522151 -v 0.022276 3.387360 3.522151 -v 0.060985 3.387357 3.522158 -v 0.060986 3.403709 3.522159 -v 0.022277 3.403708 3.522151 -v 0.022277 3.403708 3.522151 -v 0.022277 3.403708 3.522151 -v 0.022391 3.403710 3.504798 -v -0.012810 3.403708 3.504791 -v 0.022391 3.403710 3.504798 -v -0.012810 3.403708 3.504791 -v 0.022391 3.403710 3.504798 -v 0.022390 3.387361 3.504798 -v -0.012811 3.387363 3.504791 -v 0.022390 3.387361 3.504798 -v -0.012811 3.387363 3.504791 -v 0.022390 3.387361 3.504798 -v 0.022276 3.387360 3.522151 -v -0.012925 3.387361 3.522144 -v 0.022276 3.387360 3.522151 -v -0.012924 3.403706 3.522145 -v -0.012925 3.387361 3.522144 -v 0.022276 3.387360 3.522151 -v 0.022277 3.403708 3.522151 -v -0.012924 3.403706 3.522145 -v -0.012924 3.403706 3.522145 -v -0.012924 3.403706 3.522145 -v -0.012810 3.403708 3.504791 -v -0.048399 3.403707 3.504735 -v -0.012810 3.403708 3.504791 -v -0.048399 3.403707 3.504735 -v -0.012810 3.403708 3.504791 -v -0.012811 3.387363 3.504791 -v -0.048400 3.387364 3.504734 -v -0.012811 3.387363 3.504791 -v -0.012925 3.387361 3.522144 -v -0.012925 3.387361 3.522144 -v -0.036162 3.403705 3.522184 -v -0.036164 3.387363 3.522183 -v -0.012925 3.387361 3.522144 -v -0.012924 3.403706 3.522145 -v -0.036162 3.403705 3.522184 -v -0.036162 3.403705 3.522184 -v -0.036162 3.403705 3.522184 -v -0.048399 3.403707 3.504735 -v -0.064707 3.403705 3.549778 -v -0.048399 3.403707 3.504735 -v -0.064707 3.403705 3.549778 -v -0.048399 3.403707 3.504735 -v -0.048400 3.387364 3.504734 -v -0.064709 3.387367 3.549779 -v -0.036164 3.387363 3.522183 -v -0.048984 3.403703 3.556363 -v -0.036164 3.387363 3.522183 -v -0.036162 3.403705 3.522184 -v -0.048984 3.403703 3.556363 -v -0.048984 3.403703 3.556363 -v -0.048984 3.403703 3.556363 -v -0.064707 3.403705 3.549778 -v -0.083518 3.403702 3.589091 -v -0.064707 3.403705 3.549778 -v -0.083518 3.403702 3.589091 -v -0.064707 3.403705 3.549778 -v -0.064709 3.387367 3.549779 -v -0.083521 3.387368 3.589092 -v -0.064709 3.387367 3.549779 -v -0.083521 3.387368 3.589092 -v -0.064709 3.387367 3.549779 -v -0.068735 3.387366 3.597631 -v -0.048986 3.387365 3.556363 -v -0.068733 3.403701 3.597631 -v -0.068735 3.387366 3.597631 -v -0.048986 3.387365 3.556363 -v -0.048984 3.403703 3.556363 -v -0.068733 3.403701 3.597631 -v -0.068733 3.403701 3.597631 -v -0.068733 3.403701 3.597631 -v -0.083518 3.403702 3.589091 -v -0.107852 3.403701 3.627356 -v -0.083518 3.403702 3.589091 -v -0.107852 3.403701 3.627356 -v -0.083518 3.403702 3.589091 -v -0.083521 3.387368 3.589092 -v -0.107854 3.387370 3.627356 -v -0.083521 3.387368 3.589092 -v -0.107854 3.387370 3.627356 -v -0.083521 3.387368 3.589092 -v -0.068735 3.387366 3.597631 -v -0.094159 3.387369 3.637607 -v -0.068735 3.387366 3.597631 -v -0.094157 3.403699 3.637607 -v -0.094159 3.387369 3.637607 -v -0.068735 3.387366 3.597631 -v -0.068733 3.403701 3.597631 -v -0.094157 3.403699 3.637607 -v -0.094157 3.403699 3.637607 -v -0.094157 3.403699 3.637607 -v -0.107852 3.403701 3.627356 -v -0.137374 3.403698 3.663773 -v -0.107852 3.403701 3.627356 -v -0.137374 3.403698 3.663773 -v -0.107852 3.403701 3.627356 -v -0.107854 3.387370 3.627356 -v -0.137376 3.387372 3.663773 -v -0.107854 3.387370 3.627356 -v -0.137376 3.387372 3.663773 -v -0.107854 3.387370 3.627356 -v -0.094159 3.387369 3.637607 -v -0.124915 3.387371 3.675541 -v -0.094159 3.387369 3.637607 -v -0.124913 3.403697 3.675541 -v -0.124915 3.387371 3.675541 -v -0.094159 3.387369 3.637607 -v -0.094157 3.403699 3.637607 -v -0.124913 3.403697 3.675541 -v -0.124913 3.403697 3.675541 -v -0.124913 3.403697 3.675541 -v -0.137374 3.403698 3.663773 -v -0.171746 3.403696 3.697555 -v -0.137374 3.403698 3.663773 -v -0.171746 3.403696 3.697555 -v -0.137374 3.403698 3.663773 -v -0.137376 3.387372 3.663773 -v -0.171748 3.387374 3.697554 -v -0.137376 3.387372 3.663773 -v -0.171748 3.387374 3.697554 -v -0.137376 3.387372 3.663773 -v -0.124915 3.387371 3.675541 -v -0.160668 3.387372 3.710675 -v -0.124915 3.387371 3.675541 -v -0.160666 3.403694 3.710676 -v -0.160668 3.387372 3.710675 -v -0.124915 3.387371 3.675541 -v -0.124913 3.403697 3.675541 -v -0.160666 3.403694 3.710676 -v -0.160666 3.403694 3.710676 -v -0.160666 3.403694 3.710676 -v -0.171746 3.403696 3.697555 -v -0.210624 3.403694 3.727921 -v -0.171746 3.403696 3.697555 -v -0.210624 3.403694 3.727921 -v -0.171746 3.403696 3.697555 -v -0.171748 3.387374 3.697554 -v -0.210626 3.387377 3.727921 -v -0.171748 3.387374 3.697554 -v -0.210626 3.387377 3.727921 -v -0.171748 3.387374 3.697554 -v -0.160668 3.387372 3.710675 -v -0.201087 3.387374 3.742240 -v -0.160668 3.387372 3.710675 -v -0.201085 3.403692 3.742241 -v -0.201087 3.387374 3.742240 -v -0.160668 3.387372 3.710675 -v -0.160666 3.403694 3.710676 -v -0.201085 3.403692 3.742241 -v -0.201085 3.403692 3.742241 -v -0.201085 3.403692 3.742241 -v -0.210624 3.403694 3.727921 -v -0.253662 3.403692 3.754103 -v -0.210624 3.403694 3.727921 -v -0.253662 3.403692 3.754103 -v -0.210624 3.403694 3.727921 -v -0.210626 3.387377 3.727921 -v -0.253663 3.387378 3.754102 -v -0.210626 3.387377 3.727921 -v -0.253663 3.387378 3.754102 -v -0.210626 3.387377 3.727921 -v -0.201087 3.387374 3.742240 -v -0.245838 3.387377 3.769460 -v -0.201087 3.387374 3.742240 -v -0.245838 3.403690 3.769461 -v -0.245838 3.387377 3.769460 -v -0.201087 3.387374 3.742240 -v -0.201085 3.403692 3.742241 -v -0.245838 3.403690 3.769461 -v -0.245838 3.403690 3.769461 -v -0.245838 3.403690 3.769461 -v -0.253662 3.403692 3.754103 -v -0.300521 3.403690 3.775338 -v -0.253662 3.403692 3.754103 -v -0.300521 3.403690 3.775338 -v -0.253662 3.403692 3.754103 -v -0.253663 3.387378 3.754102 -v -0.300523 3.387380 3.775337 -v -0.253663 3.387378 3.754102 -v -0.300523 3.387380 3.775337 -v -0.253663 3.387378 3.754102 -v -0.245838 3.387377 3.769460 -v -0.245838 3.387377 3.769460 -v -0.294588 3.403688 3.791548 -v -0.294590 3.387379 3.791547 -v -0.245838 3.387377 3.769460 -v -0.245838 3.403690 3.769461 -v -0.294588 3.403688 3.791548 -v -0.294588 3.403688 3.791548 -v -0.294588 3.403688 3.791548 -v -0.300521 3.403690 3.775338 -v -0.300521 3.403690 3.775338 -v -0.350870 3.403688 3.790871 -v -0.300521 3.403690 3.775338 -v -0.300523 3.387380 3.775337 -v -0.300523 3.387380 3.775337 -v -0.350871 3.387382 3.790869 -v -0.300523 3.387380 3.775337 -v -0.294590 3.387379 3.791547 -v -0.346995 3.387380 3.807710 -v -0.294590 3.387379 3.791547 -v -0.346994 3.403687 3.807711 -v -0.346995 3.387380 3.807710 -v -0.294590 3.387379 3.791547 -v -0.294588 3.403688 3.791548 -v -0.346994 3.403687 3.807711 -v -0.346994 3.403687 3.807711 -v -0.346994 3.403687 3.807711 -v -0.350870 3.403688 3.790871 -v -0.404387 3.403686 3.799948 -v -0.350870 3.403688 3.790871 -v -0.404387 3.403686 3.799948 -v -0.350870 3.403688 3.790871 -v -0.350871 3.387382 3.790869 -v -0.404387 3.387385 3.799946 -v -0.350871 3.387382 3.790869 -v -0.404387 3.387385 3.799946 -v -0.350871 3.387382 3.790869 -v -0.346995 3.387380 3.807710 -v -0.402700 3.387383 3.817154 -v -0.346995 3.387380 3.807710 -v -0.402699 3.403684 3.817156 -v -0.402700 3.387383 3.817154 -v -0.346995 3.387380 3.807710 -v -0.346994 3.403687 3.807711 -v -0.402699 3.403684 3.817156 -v -0.402699 3.403684 3.817156 -v -0.402699 3.403684 3.817156 -v -0.404387 3.403686 3.799948 -v -0.460839 3.403684 3.801810 -v -0.404387 3.403686 3.799948 -v -0.460839 3.403684 3.801810 -v -0.404387 3.403686 3.799948 -v -0.404387 3.387385 3.799946 -v -0.460840 3.387387 3.801808 -v -0.404387 3.387385 3.799946 -v -0.460840 3.387387 3.801808 -v -0.404387 3.387385 3.799946 -v -0.402700 3.387383 3.817154 -v -0.461262 3.387385 3.819093 -v -0.402700 3.387383 3.817154 -v -0.461261 3.403682 3.819094 -v -0.461262 3.387385 3.819093 -v -0.402700 3.387383 3.817154 -v -0.402699 3.403684 3.817156 -v -0.461261 3.403682 3.819094 -v -0.461261 3.403682 3.819094 -v -0.460839 3.403684 3.801810 -v -0.526396 3.403682 3.796171 -v -0.460839 3.403684 3.801810 -v -0.526396 3.403682 3.796171 -v -0.460839 3.403684 3.801810 -v -0.460840 3.387387 3.801808 -v -0.526397 3.387389 3.796169 -v -0.460840 3.387387 3.801808 -v -0.526397 3.387389 3.796169 -v -0.460840 3.387387 3.801808 -v -0.461262 3.387385 3.819093 -v -0.528992 3.387387 3.813250 -v -0.461262 3.387385 3.819093 -v -0.528992 3.403680 3.813252 -v -0.528992 3.387387 3.813250 -v -0.461262 3.387385 3.819093 -v -0.461261 3.403682 3.819094 -v -0.528992 3.403680 3.813252 -v -0.528992 3.403680 3.813252 -v -0.526396 3.403682 3.796171 -v -0.587176 3.403679 3.782070 -v -0.526396 3.403682 3.796171 -v -0.587176 3.403679 3.782070 -v -0.526396 3.403682 3.796171 -v -0.526397 3.387389 3.796169 -v -0.587176 3.387392 3.782068 -v -0.526397 3.387389 3.796169 -v -0.587176 3.387392 3.782068 -v -0.526397 3.387389 3.796169 -v -0.528992 3.387387 3.813250 -v -0.592096 3.387390 3.798603 -v -0.528992 3.387387 3.813250 -v -0.592096 3.403678 3.798605 -v -0.592096 3.387390 3.798603 -v -0.528992 3.387387 3.813250 -v -0.528992 3.403680 3.813252 -v -0.592096 3.403678 3.798605 -v -0.592096 3.403678 3.798605 -v -0.587176 3.403679 3.782070 -v -0.643018 3.403677 3.760283 -v -0.587176 3.403679 3.782070 -v -0.643018 3.403677 3.760283 -v -0.587176 3.403679 3.782070 -v -0.587176 3.387392 3.782068 -v -0.643018 3.387394 3.760281 -v -0.587176 3.387392 3.782068 -v -0.643018 3.387394 3.760281 -v -0.587176 3.387392 3.782068 -v -0.592096 3.387390 3.798603 -v -0.650180 3.387392 3.775934 -v -0.592096 3.387390 3.798603 -v -0.650180 3.403675 3.775937 -v -0.650180 3.387392 3.775934 -v -0.592096 3.387390 3.798603 -v -0.592096 3.403678 3.798605 -v -0.650180 3.403675 3.775937 -v -0.650180 3.403675 3.775937 -v -0.643018 3.403677 3.760283 -v -0.693684 3.403674 3.731570 -v -0.643018 3.403677 3.760283 -v -0.693684 3.403674 3.731570 -v -0.643018 3.403677 3.760283 -v -0.643018 3.387394 3.760281 -v -0.693684 3.387396 3.731568 -v -0.643018 3.387394 3.760281 -v -0.693684 3.387396 3.731568 -v -0.643018 3.387394 3.760281 -v -0.650180 3.387392 3.775934 -v -0.702931 3.387394 3.746035 -v -0.650180 3.387392 3.775934 -v -0.702931 3.403672 3.746037 -v -0.702931 3.387394 3.746035 -v -0.650180 3.387392 3.775934 -v -0.650180 3.403675 3.775937 -v -0.702931 3.403672 3.746037 -v -0.702931 3.403672 3.746037 -v -0.693684 3.403674 3.731570 -v -0.738925 3.403672 3.696689 -v -0.693684 3.403674 3.731570 -v -0.738925 3.403672 3.696689 -v -0.693684 3.403674 3.731570 -v -0.693684 3.387396 3.731568 -v -0.738925 3.387398 3.696687 -v -0.693684 3.387396 3.731568 -v -0.738925 3.387398 3.696687 -v -0.693684 3.387396 3.731568 -v -0.702931 3.387394 3.746035 -v -0.750043 3.387396 3.709707 -v -0.702931 3.387394 3.746035 -v -0.750044 3.403670 3.709709 -v -0.750043 3.387396 3.709707 -v -0.702931 3.387394 3.746035 -v -0.702931 3.403672 3.746037 -v -0.750044 3.403670 3.709709 -v -0.750044 3.403670 3.709709 -v -0.738925 3.403672 3.696689 -v -0.778483 3.403670 3.656393 -v -0.738925 3.403672 3.696689 -v -0.778483 3.403670 3.656393 -v -0.738925 3.403672 3.696689 -v -0.738925 3.387398 3.696687 -v -0.778482 3.387402 3.656391 -v -0.738925 3.387398 3.696687 -v -0.778482 3.387402 3.656391 -v -0.738925 3.387398 3.696687 -v -0.750043 3.387396 3.709707 -v -0.791225 3.387399 3.667749 -v -0.750043 3.387396 3.709707 -v -0.791225 3.403667 3.667752 -v -0.791225 3.387399 3.667749 -v -0.750043 3.387396 3.709707 -v -0.750044 3.403670 3.709709 -v -0.791225 3.403667 3.667752 -v -0.791225 3.403667 3.667752 -v -0.778483 3.403670 3.656393 -v -0.812087 3.403667 3.611438 -v -0.778483 3.403670 3.656393 -v -0.812087 3.403667 3.611438 -v -0.778483 3.403670 3.656393 -v -0.778482 3.387402 3.656391 -v -0.812086 3.387403 3.611436 -v -0.778482 3.387402 3.656391 -v -0.812086 3.387403 3.611436 -v -0.778482 3.387402 3.656391 -v -0.791225 3.387399 3.667749 -v -0.826191 3.387402 3.620965 -v -0.791225 3.387399 3.667749 -v -0.826192 3.403665 3.620966 -v -0.826191 3.387402 3.620965 -v -0.791225 3.387399 3.667749 -v -0.791225 3.403667 3.667752 -v -0.826192 3.403665 3.620966 -v -0.826192 3.403665 3.620966 -v -0.812087 3.403667 3.611438 -v -0.839463 3.403665 3.562584 -v -0.812087 3.403667 3.611438 -v -0.839463 3.403665 3.562584 -v -0.812087 3.403667 3.611438 -v -0.812086 3.387403 3.611436 -v -0.839462 3.387406 3.562582 -v -0.812086 3.387403 3.611436 -v -0.839462 3.387406 3.562582 -v -0.812086 3.387403 3.611436 -v -0.826191 3.387402 3.620965 -v -0.854663 3.387404 3.570146 -v -0.826191 3.387402 3.620965 -v -0.854664 3.403663 3.570148 -v -0.854663 3.387404 3.570146 -v -0.826191 3.387402 3.620965 -v -0.826192 3.403665 3.620966 -v -0.854664 3.403663 3.570148 -v -0.854664 3.403663 3.570148 -v -0.839463 3.403665 3.562584 -v -0.860336 3.403663 3.510597 -v -0.839463 3.403665 3.562584 -v -0.860336 3.403663 3.510597 -v -0.839463 3.403665 3.562584 -v -0.839462 3.387406 3.562582 -v -0.860335 3.387409 3.510596 -v -0.839462 3.387406 3.562582 -v -0.860335 3.387409 3.510596 -v -0.839462 3.387406 3.562582 -v -0.854663 3.387404 3.570146 -v -0.876364 3.387407 3.516083 -v -0.854663 3.387404 3.570146 -v -0.876366 3.403661 3.516085 -v -0.876364 3.387407 3.516083 -v -0.854663 3.387404 3.570146 -v -0.854664 3.403663 3.570148 -v -0.876366 3.403661 3.516085 -v -0.876366 3.403661 3.516085 -v -0.860336 3.403663 3.510597 -v -0.874431 3.403660 3.456248 -v -0.860336 3.403663 3.510597 -v -0.874431 3.403660 3.456248 -v -0.860336 3.403663 3.510597 -v -0.860335 3.387409 3.510596 -v -0.874429 3.387411 3.456247 -v -0.860335 3.387409 3.510596 -v -0.874429 3.387411 3.456247 -v -0.860335 3.387409 3.510596 -v -0.876364 3.387407 3.516083 -v -0.891017 3.387409 3.459563 -v -0.876364 3.387407 3.516083 -v -0.891019 3.403658 3.459564 -v -0.891017 3.387409 3.459563 -v -0.876364 3.387407 3.516083 -v -0.876366 3.403661 3.516085 -v -0.891019 3.403658 3.459564 -v -0.891019 3.403658 3.459564 -v -0.881836 3.403733 3.400838 -v -0.897977 3.403733 3.400838 -v -0.874431 3.403660 3.456248 -v -0.881836 3.403733 3.400838 -v -0.874431 3.403660 3.456248 -v -0.881837 3.387337 3.400838 -v -0.881836 3.403733 3.400838 -v -0.874431 3.403660 3.456248 -v -0.874429 3.387411 3.456247 -v -0.881837 3.387337 3.400838 -v -0.874429 3.387411 3.456247 -v -0.897978 3.387336 3.400838 -v -0.881837 3.387337 3.400838 -v -0.874429 3.387411 3.456247 -v -0.891017 3.387409 3.459563 -v -0.897978 3.387336 3.400838 -v -0.891017 3.387409 3.459563 -v -0.897977 3.403733 3.400838 -v -0.897978 3.387336 3.400838 -v -0.891017 3.387409 3.459563 -v -0.891019 3.403658 3.459564 -v -0.897977 3.403733 3.400838 -v -0.012811 3.387363 3.504791 -v -0.036164 3.387363 3.522183 -v -0.012811 3.387363 3.504791 -v -0.034791 3.387363 3.514364 -v -0.048400 3.387364 3.504734 -v -0.012811 3.387363 3.504791 -v -0.012811 3.387363 3.504791 -v -0.036109 3.387364 3.510304 -v -0.048400 3.387364 3.504734 -v -0.039563 3.387364 3.507795 -v -0.048400 3.387364 3.504734 -v -0.043831 3.387364 3.507795 -v -0.064709 3.387367 3.549779 -v -0.048400 3.387364 3.504734 -v -0.047284 3.387364 3.510304 -v -0.048986 3.387365 3.556363 -v -0.064709 3.387367 3.549779 -v -0.064709 3.387367 3.549779 -v -0.047284 3.387364 3.510304 -v -0.048603 3.387365 3.514364 -v -0.048986 3.387365 3.556363 -v -0.048603 3.387365 3.514364 -v -0.036164 3.387363 3.522183 -v -0.048986 3.387365 3.556363 -v -0.048986 3.387365 3.556363 -v -0.047284 3.387364 3.518423 -v -0.036164 3.387363 3.522183 -v -0.043831 3.387364 3.520932 -v -0.036164 3.387363 3.522183 -v -0.036109 3.387363 3.518423 -v -0.034791 3.387363 3.514364 -v -0.036164 3.387363 3.522183 -v -0.029717 3.245787 3.239035 -v -0.009803 3.245787 3.243421 -v -0.033170 3.245787 3.241544 -vt 0.357565 0.854108 -vt 0.352049 0.884888 -vt 0.348469 0.885324 -vt 0.349075 0.885926 -vt 0.351231 0.884360 -vt 0.345286 0.886759 -vt 0.344897 0.886109 -vt 0.335112 0.886824 -vt 0.325214 0.887013 -vt 0.325480 0.886346 -vt 0.335113 0.887506 -vt 0.310169 0.882883 -vt 0.306391 0.878970 -vt 0.305245 0.879283 -vt 0.311084 0.882402 -vt 0.302178 0.874711 -vt 0.303438 0.874563 -vt 0.302940 0.862782 -vt 0.304010 0.857267 -vt 0.305228 0.857493 -vt 0.301660 0.862694 -vt 0.314295 0.849797 -vt 0.322713 0.848533 -vt 0.322377 0.847875 -vt 0.315020 0.850361 -vt 0.332449 0.847216 -vt 0.332460 0.847898 -vt 0.341754 0.848257 -vt 0.346538 0.848134 -vt 0.346165 0.848787 -vt 0.341963 0.847584 -vt 0.309233 0.853349 -vt 0.337175 0.847295 -vt 0.337086 0.847975 -vt 0.350624 0.848999 -vt 0.350023 0.849603 -vt 0.354080 0.850249 -vt 0.353038 0.850732 -vt 0.356835 0.852123 -vt 0.356836 0.853532 -vt 0.356835 0.853532 -vt 0.356835 0.882048 -vt 0.356835 0.883121 -vt 0.356836 0.883119 -vt 0.356835 0.882044 -vt 0.359543 0.880996 -vt 0.356832 0.880996 -vt 0.356832 0.886978 -vt 0.356836 0.882044 -vt 0.351787 0.884888 -vt 0.350969 0.884360 -vt 0.348813 0.885926 -vt 0.348207 0.885324 -vt 0.345024 0.886759 -vt 0.344635 0.886109 -vt 0.340383 0.887310 -vt 0.340200 0.886635 -vt 0.334851 0.887506 -vt 0.334850 0.886824 -vt 0.324952 0.887013 -vt 0.325218 0.886346 -vt 0.316602 0.885468 -vt 0.317196 0.884863 -vt 0.309907 0.882883 -vt 0.310822 0.882402 -vt 0.304983 0.879283 -vt 0.306129 0.878970 -vt 0.301916 0.874711 -vt 0.303176 0.874563 -vt 0.300763 0.869197 -vt 0.302053 0.869186 -vt 0.301398 0.862694 -vt 0.302678 0.862782 -vt 0.303748 0.857267 -vt 0.304966 0.857493 -vt 0.307926 0.852949 -vt 0.308971 0.853349 -vt 0.314033 0.849797 -vt 0.314759 0.850361 -vt 0.322115 0.847875 -vt 0.322451 0.848533 -vt 0.332187 0.847216 -vt 0.332198 0.847898 -vt 0.336914 0.847295 -vt 0.336824 0.847975 -vt 0.341701 0.847584 -vt 0.341492 0.848257 -vt 0.346276 0.848134 -vt 0.345903 0.848787 -vt 0.350362 0.848999 -vt 0.349761 0.849603 -vt 0.353818 0.850249 -vt 0.352777 0.850732 -vt 0.356836 0.852123 -vt 0.356832 0.854108 -vt 0.356832 0.847787 -vt 0.359543 0.854108 -vt 0.446297 0.886191 -vt 0.444812 0.885643 -vt 0.444462 0.886191 -vt 0.445730 0.885304 -vt 0.446864 0.885304 -vt 0.447782 0.885643 -vt 0.448132 0.886191 -vt 0.447782 0.886739 -vt 0.446864 0.887078 -vt 0.445730 0.887078 -vt 0.444812 0.886739 -vt 0.491850 0.916922 -vt 0.490015 0.916922 -vt 0.490365 0.916374 -vt 0.491283 0.916035 -vt 0.492417 0.916035 -vt 0.493335 0.916374 -vt 0.493685 0.916922 -vt 0.493335 0.917470 -vt 0.492417 0.917809 -vt 0.491283 0.917809 -vt 0.490365 0.917470 -vt 0.617730 0.917135 -vt 0.615894 0.917135 -vt 0.616245 0.916587 -vt 0.617163 0.916249 -vt 0.618297 0.916249 -vt 0.619215 0.916587 -vt 0.619565 0.917135 -vt 0.619215 0.917683 -vt 0.618297 0.918022 -vt 0.617163 0.918022 -vt 0.616245 0.917683 -vt 0.671183 0.869910 -vt 0.669348 0.869910 -vt 0.669699 0.869362 -vt 0.670616 0.869023 -vt 0.671751 0.869023 -vt 0.672668 0.869362 -vt 0.673019 0.869910 -vt 0.672668 0.870458 -vt 0.671751 0.870797 -vt 0.670616 0.870797 -vt 0.669699 0.870458 -vt 0.618459 0.818382 -vt 0.616624 0.818382 -vt 0.616974 0.817834 -vt 0.617892 0.817495 -vt 0.619026 0.817495 -vt 0.619944 0.817834 -vt 0.620295 0.818382 -vt 0.619944 0.818930 -vt 0.619026 0.819268 -vt 0.617892 0.819268 -vt 0.616974 0.818930 -vt 0.491507 0.818829 -vt 0.489671 0.818829 -vt 0.490022 0.818281 -vt 0.490939 0.817942 -vt 0.492074 0.817942 -vt 0.492991 0.818281 -vt 0.493342 0.818829 -vt 0.492991 0.819377 -vt 0.492074 0.819716 -vt 0.490939 0.819716 -vt 0.490022 0.819377 -vt 0.444936 0.848547 -vt 0.443100 0.848547 -vt 0.443451 0.847999 -vt 0.444368 0.847660 -vt 0.445503 0.847660 -vt 0.446420 0.847999 -vt 0.446771 0.848547 -vt 0.446420 0.849095 -vt 0.445503 0.849434 -vt 0.444368 0.849434 -vt 0.443451 0.849095 -vt 0.442763 0.848471 -vt 0.443113 0.849019 -vt 0.443113 0.847923 -vt 0.444031 0.847584 -vt 0.445165 0.847584 -vt 0.446083 0.847923 -vt 0.446433 0.848471 -vt 0.446083 0.849019 -vt 0.445165 0.849358 -vt 0.444031 0.849358 -vt 0.489700 0.818862 -vt 0.490051 0.819410 -vt 0.490051 0.818314 -vt 0.490969 0.817975 -vt 0.492103 0.817975 -vt 0.493021 0.818314 -vt 0.493371 0.818862 -vt 0.493021 0.819410 -vt 0.492103 0.819749 -vt 0.490969 0.819749 -vt 0.616990 0.818270 -vt 0.617341 0.818818 -vt 0.617341 0.817721 -vt 0.618259 0.817383 -vt 0.618258 0.817383 -vt 0.619393 0.817383 -vt 0.620310 0.817721 -vt 0.620661 0.818270 -vt 0.620310 0.818818 -vt 0.619393 0.819156 -vt 0.618259 0.819156 -vt 0.618258 0.819156 -vt 0.669347 0.869983 -vt 0.669697 0.870531 -vt 0.669697 0.869435 -vt 0.670615 0.869096 -vt 0.671749 0.869096 -vt 0.672667 0.869435 -vt 0.673017 0.869983 -vt 0.672667 0.870531 -vt 0.671749 0.870869 -vt 0.670615 0.870869 -vt 0.615990 0.917094 -vt 0.616340 0.917642 -vt 0.616340 0.916546 -vt 0.617258 0.916207 -vt 0.618392 0.916207 -vt 0.619310 0.916546 -vt 0.619661 0.917094 -vt 0.619310 0.917642 -vt 0.618392 0.917981 -vt 0.617258 0.917981 -vt 0.444416 0.886186 -vt 0.444766 0.886734 -vt 0.444766 0.885638 -vt 0.445684 0.885299 -vt 0.446818 0.885299 -vt 0.447736 0.885638 -vt 0.448087 0.886186 -vt 0.447736 0.886734 -vt 0.446818 0.887072 -vt 0.445684 0.887072 -vt 0.359533 0.849612 -vt 0.366249 0.847294 -vt 0.366249 0.849612 -vt 0.359533 0.847294 -vt 0.370560 0.847294 -vt 0.370560 0.849612 -vt 0.378251 0.847294 -vt 0.378251 0.849612 -vt 0.385911 0.847294 -vt 0.385911 0.849612 -vt 0.393530 0.847294 -vt 0.393530 0.849611 -vt 0.401099 0.847294 -vt 0.401099 0.849612 -vt 0.401099 0.849611 -vt 0.408606 0.847294 -vt 0.408606 0.849611 -vt 0.416042 0.847294 -vt 0.416042 0.849611 -vt 0.423397 0.847294 -vt 0.423397 0.849611 -vt 0.430660 0.847294 -vt 0.430660 0.849611 -vt 0.437821 0.847294 -vt 0.437821 0.849611 -vt 0.443333 0.847322 -vt 0.445978 0.849626 -vt 0.448217 0.842657 -vt 0.452118 0.843790 -vt 0.454154 0.837542 -vt 0.457910 0.838799 -vt 0.460737 0.832646 -vt 0.464309 0.834040 -vt 0.468029 0.828021 -vt 0.471372 0.829560 -vt 0.476094 0.823718 -vt 0.479157 0.825406 -vt 0.484993 0.819788 -vt 0.487721 0.821624 -vt 0.507441 0.815354 -vt 0.505521 0.813261 -vt 0.517258 0.810768 -vt 0.518728 0.812957 -vt 0.530047 0.808858 -vt 0.531058 0.811115 -vt 0.543939 0.807579 -vt 0.544500 0.809877 -vt 0.559110 0.806978 -vt 0.558996 0.809294 -vt 0.576057 0.808148 -vt 0.575194 0.810422 -vt 0.591873 0.810289 -vt 0.590474 0.812490 -vt 0.606572 0.813340 -vt 0.604648 0.815431 -vt 0.620061 0.817235 -vt 0.617637 0.819182 -vt 0.632249 0.821911 -vt 0.629361 0.823680 -vt 0.643043 0.827300 -vt 0.639738 0.828861 -vt 0.652353 0.833338 -vt 0.648686 0.834664 -vt 0.660089 0.839957 -vt 0.656123 0.841027 -vt 0.666163 0.847090 -vt 0.661965 0.847888 -vt 0.670486 0.854672 -vt 0.666126 0.855186 -vt 0.672972 0.862634 -vt 0.668522 0.862860 -vt 0.673528 0.870967 -vt 0.669070 0.870791 -vt 0.670893 0.878444 -vt 0.666539 0.877918 -vt 0.666949 0.885603 -vt 0.662716 0.884856 -vt 0.661691 0.892439 -vt 0.657630 0.891470 -vt 0.655129 0.898881 -vt 0.651296 0.897688 -vt 0.647271 0.904858 -vt 0.643729 0.903444 -vt 0.638126 0.910296 -vt 0.634942 0.908669 -vt 0.638126 0.910295 -vt 0.627708 0.915120 -vt 0.624948 0.913297 -vt 0.616030 0.919257 -vt 0.613755 0.917262 -vt 0.603112 0.922632 -vt 0.601368 0.920498 -vt 0.588975 0.925171 -vt 0.587790 0.922937 -vt 0.573642 0.926804 -vt 0.573022 0.924510 -vt 0.557156 0.927461 -vt 0.557044 0.925145 -vt 0.542846 0.927262 -vt 0.543240 0.924954 -vt 0.529182 0.926203 -vt 0.530109 0.923937 -vt 0.516255 0.924367 -vt 0.517688 0.922172 -vt 0.504137 0.921835 -vt 0.506040 0.919739 -vt 0.492894 0.918690 -vt 0.495229 0.916715 -vt 0.482593 0.915015 -vt 0.485320 0.913179 -vt 0.473299 0.910890 -vt 0.476381 0.909211 -vt 0.465077 0.906396 -vt 0.468477 0.904891 -vt 0.457992 0.901612 -vt 0.461678 0.900300 -vt 0.452110 0.896617 -vt 0.456048 0.895521 -vt 0.447497 0.891488 -vt 0.451653 0.890635 -vt 0.444709 0.887298 -vt 0.447821 0.884817 -vt 0.439444 0.887286 -vt 0.439529 0.884870 -vt 0.432377 0.887286 -vt 0.432430 0.884868 -vt 0.425142 0.887286 -vt 0.425168 0.884867 -vt 0.417757 0.887286 -vt 0.417760 0.884867 -vt 0.410239 0.887286 -vt 0.410222 0.884867 -vt 0.402604 0.887286 -vt 0.402570 0.884868 -vt 0.394868 0.887286 -vt 0.394821 0.884869 -vt 0.387049 0.887286 -vt 0.386991 0.884870 -vt 0.379163 0.887287 -vt 0.379096 0.884872 -vt 0.371225 0.887287 -vt 0.371153 0.884874 -vt 0.366653 0.887287 -vt 0.366578 0.884876 -vt 0.359619 0.887365 -vt 0.359644 0.884909 -vt 0.359644 0.885267 -vt 0.494783 0.816285 -vt 0.497128 0.818258 -vt 0.673853 0.870864 -vt 0.668734 0.862126 -vt 0.673280 0.861868 -vt 0.669564 0.870864 -vt 0.665845 0.853747 -vt 0.670280 0.853172 -vt 0.660869 0.845797 -vt 0.665109 0.844913 -vt 0.653918 0.838372 -vt 0.657880 0.837193 -vt 0.645105 0.831572 -vt 0.648708 0.830117 -vt 0.634542 0.825493 -vt 0.637708 0.823789 -vt 0.622340 0.820235 -vt 0.624997 0.818312 -vt 0.608608 0.815894 -vt 0.610693 0.813791 -vt 0.593451 0.812569 -vt 0.594917 0.810331 -vt 0.593450 0.812569 -vt 0.594916 0.810331 -vt 0.576972 0.810358 -vt 0.577792 0.808034 -vt 0.559343 0.809363 -vt 0.559374 0.807001 -vt 0.543507 0.810005 -vt 0.542925 0.807663 -vt 0.529005 0.811374 -vt 0.527943 0.809078 -vt 0.515833 0.813421 -vt 0.514271 0.811204 -vt 0.503902 0.816100 -vt 0.501842 0.813996 -vn 0.499993 0.000000 0.866030 -vn 0.499993 0.000000 -0.866030 -vn -0.000112 1.000000 0.000154 -vn -0.000000 1.000000 0.000073 -vn 0.000026 1.000000 0.000036 -vn 0.000000 1.000000 0.000117 -vn -0.000009 1.000000 0.000000 -vn 0.000000 -1.000000 0.000014 -vn 0.000015 0.000000 -1.000000 -vn -0.000015 -1.000000 0.000000 -vn -0.000008 0.000015 -1.000000 -vn -0.000008 -1.000000 -0.000000 -vn 0.000000 1.000000 -0.000014 -vn -0.000008 1.000000 0.000000 -vn 0.000008 -1.000000 0.000028 -vn -0.000017 0.000000 1.000000 -vn -0.000008 -1.000000 0.000014 -vn 0.000000 -1.000000 0.000028 -vn 0.000000 -0.000029 1.000000 -vn 0.000017 0.000000 1.000000 -vn -0.000017 -0.000029 1.000000 -vn -0.009955 -0.000000 -0.999950 -vn 0.003604 -0.000000 0.999994 -vn 0.882877 0.000000 -0.469604 -vn -0.881930 0.000000 0.471381 -vn 0.000003 1.000000 0.000005 -vn 0.861407 0.000000 -0.507915 -vn -0.000006 -1.000000 -0.000009 -vn -0.000006 -1.000000 -0.000010 -vn -0.861423 0.000000 0.507889 -vn -0.861423 0.000000 0.507888 -vn -0.000003 1.000000 -0.000004 -vn -0.000003 1.000000 -0.000005 -vn 0.825715 0.000000 -0.564088 -vn -0.000003 -1.000000 -0.000004 -vn -0.000003 -1.000000 -0.000005 -vn -0.825727 0.000000 0.564070 -vn 0.780481 0.000000 -0.625180 -vn -0.780499 -0.000009 0.625157 -vn -0.780497 0.000000 0.625159 -vn 0.000004 1.000000 0.000004 -vn 0.724257 0.000000 -0.689530 -vn -0.724276 -0.000020 0.689510 -vn -0.724273 -0.000010 0.689513 -vn 0.656066 0.000000 -0.754704 -vn -0.000009 -1.000000 0.000011 -vn -0.000004 -1.000000 -0.000004 -vn -0.656081 0.000000 0.754690 -vn -0.656087 -0.000022 0.754685 -vn 0.575840 0.000000 -0.817562 -vn -0.575853 0.000000 0.817553 -vn 0.484814 0.000000 -0.874618 -vn -0.000009 -1.000000 -0.000004 -vn -0.000009 -1.000000 -0.000006 -vn -0.484808 0.000000 0.874621 -vn 0.385642 -0.000013 -0.922648 -vn 0.385638 0.000000 -0.922650 -vn -0.385633 0.000000 0.922652 -vn 0.282089 0.000000 -0.959388 -vn 0.282093 -0.000014 -0.959387 -vn -0.282065 0.000000 0.959395 -vn 0.178377 0.000000 -0.983962 -vn -0.178346 0.000000 0.983968 -vn -0.000004 1.000000 -0.000001 -vn 0.077732 0.000000 -0.996974 -vn -0.078959 0.000000 0.996878 -vn -0.134708 -0.000029 -0.990885 -vn -0.134716 0.000000 -0.990884 -vn 0.135762 -0.000000 0.990741 -vn -0.257477 -0.000000 -0.966285 -vn -0.257469 -0.000028 -0.966286 -vn -0.000004 -1.000000 0.000001 -vn 0.257454 -0.000000 0.966291 -vn -0.378174 -0.000000 -0.925735 -vn 0.378157 -0.000000 0.925741 -vn -0.000004 1.000000 0.000002 -vn -0.494185 0.000013 -0.869357 -vn -0.494182 0.000000 -0.869359 -vn 0.494166 -0.000000 0.869368 -vn -0.602613 -0.000000 -0.798034 -vn -0.602616 0.000012 -0.798032 -vn 0.000008 -1.000000 0.000011 -vn 0.602604 -0.000000 0.798041 -vn 0.000007 1.000000 0.000013 -vn -0.700951 -0.000000 -0.713209 -vn -0.000003 -1.000000 0.000003 -vn 0.000010 -1.000000 0.000010 -vn 0.700950 -0.000000 0.713211 -vn -0.787203 -0.000000 -0.616695 -vn -0.000011 -1.000000 -0.000009 -vn 0.000003 -1.000000 -0.000003 -vn 0.787198 -0.000000 0.616700 -vn -0.859838 -0.000000 -0.510566 -vn 0.000002 -1.000000 -0.000004 -vn -0.000012 -1.000000 -0.000007 -vn 0.859842 -0.000000 0.510560 -vn -0.000005 1.000000 0.000012 -vn -0.000006 1.000000 0.000011 -vn -0.917826 -0.000000 -0.396984 -vn -0.000001 -1.000000 0.000004 -vn -0.000002 -1.000000 0.000004 -vn 0.917825 -0.000006 0.396985 -vn 0.917826 0.000000 0.396983 -vn 0.000001 1.000000 -0.000004 -vn -0.960510 -0.000000 -0.278244 -vn 0.960512 -0.000000 0.278240 -vn 0.960511 -0.000004 0.278241 -vn -0.987656 -0.000000 -0.156637 -vn 0.000000 -1.000000 -0.000004 -vn 0.000001 -1.000000 -0.000004 -vn 0.987659 -0.000002 0.156622 -vn 0.987659 0.000000 0.156622 -vn -0.999425 -0.000000 -0.033908 -vn 0.999384 -0.000000 0.035099 -vn 0.999384 -0.000001 0.035099 -vn -0.984347 0.000000 0.176242 -vn 0.000001 -1.000000 0.000004 -vn 0.984111 0.000000 -0.177552 -vn 0.000001 1.000000 0.000004 -vn -0.962987 -0.000004 0.269548 -vn -0.962987 0.000000 0.269549 -vn 0.962992 0.000000 -0.269530 -vn 0.962992 0.000000 -0.269529 -vn 0.000002 1.000000 0.000004 -vn -0.931426 0.000000 0.363930 -vn -0.931427 -0.000005 0.363929 -vn 0.000011 -1.000000 -0.000009 -vn 0.931432 0.000000 -0.363916 -vn -0.888126 0.000000 0.459600 -vn 0.000002 -1.000000 0.000004 -vn 0.000013 -1.000000 -0.000006 -vn 0.888138 0.000000 -0.459577 -vn -0.831546 0.000000 0.555455 -vn -0.000002 -1.000000 -0.000004 -vn 0.831559 0.000000 -0.555437 -vn -0.000011 1.000000 0.000009 -vn 0.000003 1.000000 0.000004 -vn -0.760305 -0.000009 0.649566 -vn -0.760303 0.000000 0.649569 -vn 0.760320 0.000000 -0.649549 -vn 0.000007 1.000000 0.000006 -vn -0.000006 1.000000 0.000014 -vn -0.673641 0.000000 0.739059 -vn -0.673644 -0.000011 0.739056 -vn 0.673659 0.000000 -0.739042 -vn -0.571973 0.000000 0.820273 -vn 0.571975 0.000000 -0.820271 -vn -0.000004 1.000000 -0.000002 -vn -0.457296 0.000000 0.889315 -vn 0.000004 -1.000000 0.000002 -vn 0.457292 0.000013 -0.889317 -vn 0.457295 0.000000 -0.889315 -vn -0.333367 0.000000 0.942797 -vn 0.000001 -1.000000 -0.000014 -vn 0.333346 0.000000 -0.942805 -vn 0.333342 0.000014 -0.942806 -vn -0.205193 0.000000 0.978721 -vn -0.000001 -1.000000 -0.000015 -vn 0.205158 0.000000 -0.978729 -vn -0.078217 0.000000 0.996936 -vn 0.000004 -1.000000 0.000000 -vn 0.000004 -1.000000 0.000001 -vn 0.078047 0.000000 -0.996950 -vn 0.000010 1.000000 0.000013 -vn 0.000013 1.000000 0.000000 -vn 0.027429 0.000000 0.999624 -vn -0.027256 0.000000 -0.999628 -vn 0.000002 1.000000 0.000014 -vn 0.150769 0.000000 0.988569 -vn -0.150761 0.000000 -0.988570 -vn 0.000004 1.000000 0.000013 -vn 0.269301 -0.000014 0.963056 -vn 0.269305 -0.000000 0.963055 -vn -0.000012 -1.000000 -0.000025 -vn 0.000005 -1.000000 -0.000001 -vn -0.269304 0.000000 -0.963055 -vn 0.000001 1.000000 0.000014 -vn 0.380309 -0.000014 0.924860 -vn 0.380309 -0.000014 0.924859 -vn -0.000011 -1.000000 -0.000026 -vn -0.380309 0.000000 -0.924859 -vn 0.482284 0.000000 0.876015 -vn 0.482280 -0.000013 0.876017 -vn 0.000013 -1.000000 -0.000008 -vn -0.000009 -1.000000 -0.000027 -vn -0.482284 0.000000 -0.876015 -vn 0.574746 -0.000017 0.818332 -vn 0.574750 -0.000000 0.818329 -vn -0.574747 0.000000 -0.818331 -vn 0.657946 0.000000 0.753065 -vn 0.657941 -0.000019 0.753069 -vn -0.657942 0.000000 -0.753069 -vn 0.732499 0.000000 0.680768 -vn -0.732494 0.000022 -0.680773 -vn -0.732489 -0.000000 -0.680779 -vn 0.799079 0.000000 0.601226 -vn -0.799060 0.000000 -0.601251 -vn -0.799066 0.000024 -0.601243 -vn 0.858127 0.000000 0.513438 -vn 0.000003 -1.000000 -0.000005 -vn -0.858112 0.000000 -0.513462 -vn 0.000002 1.000000 -0.000006 -vn 0.000003 1.000000 -0.000005 -vn 0.909535 0.000000 0.415628 -vn 0.000002 -1.000000 -0.000005 -vn -0.909514 0.000000 -0.415674 -vn 0.947354 0.000000 0.320187 -vn -0.948327 0.000000 -0.317294 -vn 0.000008 1.000000 -0.000000 -vn 0.000000 1.000000 0.000013 -vn 0.004284 0.000000 0.999991 -vn 0.012499 0.000000 -0.999922 -vn 0.000018 0.000000 1.000000 -vn -0.000464 0.000000 -1.000000 -vn 0.000009 0.000000 1.000000 -vn -0.000262 0.000000 -1.000000 -vn -0.000103 0.000000 -1.000000 -vn 0.000059 0.000000 -1.000000 -vn 0.000157 0.000015 -1.000000 -vn 0.000166 0.000000 -1.000000 -vn -0.000008 0.000000 1.000000 -vn 0.000008 -1.000000 0.000000 -vn 0.000278 0.000000 -1.000000 -vn 0.000270 0.000015 -1.000000 -vn 0.000356 0.000000 -1.000000 -vn -0.000024 0.000000 1.000000 -vn 0.000417 0.000000 -1.000000 -vn -0.000016 0.000000 1.000000 -vn 0.000487 -0.000029 -1.000000 -vn 0.000471 0.000000 -1.000000 -vn -0.000028 0.000000 1.000000 -vn 0.000845 0.000000 -1.000000 -vn 0.000873 -0.000029 -1.000000 -vn 0.000009 1.000000 0.000000 -vn -0.021946 0.000000 0.999759 -vn 0.108923 -0.159078 -0.981239 -vn 0.009539 0.000000 -0.999954 -vn 0.999982 -0.000973 -0.006000 -vn 0.999987 0.000000 -0.005127 -vn -0.000027 -1.000000 -0.000050 -vn -0.000008 -1.000000 0.000018 -vn -0.000009 -1.000000 0.000012 -vn 0.000014 -1.000000 -0.000001 -vn 0.000003 -1.000000 -0.000006 -vn 0.000088 -1.000000 0.000029 -vn 0.000023 -1.000000 -0.000007 -vn -0.000065 -1.000000 -0.000005 -vn -0.000020 -1.000000 0.000037 -vn -0.000328 -1.000000 0.000452 -vn 0.000005 -1.000000 0.000004 -vn 0.000000 -1.000000 0.000030 -vn 0.000005 -1.000000 0.000007 -vn 0.000007 -1.000000 0.000002 -vn 0.000019 -1.000000 -0.000020 -vn 0.000009 -1.000000 -0.000003 -vn 0.000000 -1.000000 0.000005 -vn -0.000011 -1.000000 -0.000003 -vn -0.000012 -1.000000 -0.000004 -vn -0.000005 -1.000000 0.000002 -vn -0.000000 -1.000000 0.000007 -vn -0.000003 -1.000000 0.000004 -vn -0.000024 -1.000000 0.000044 -vn -0.000091 -1.000000 0.000125 -vn -0.000000 -1.000000 0.000017 -vn 0.000422 -1.000000 -0.000078 -vn 0.000017 -1.000000 -0.000003 -vn -0.000055 -1.000000 0.000041 -vn -0.000003 -1.000000 0.000014 -vn -0.000015 -1.000000 -0.000005 -vn 0.000033 1.000000 -0.000056 -vn 0.000098 1.000000 -0.000135 -vn 0.000000 1.000000 -0.000019 -vn -0.000015 1.000000 -0.000009 -vn -0.000009 1.000000 -0.000012 -vn -0.000015 1.000000 -0.000005 -vn -0.000042 1.000000 0.000050 -vn -0.000019 1.000000 0.000006 -vn -0.000002 1.000000 0.000009 -vn -0.000024 1.000000 -0.000062 -vn 0.000005 1.000000 0.000014 -vn 0.000040 1.000000 0.000059 -vn -0.000020 1.000000 -0.000027 -vn 0.000034 1.000000 0.000070 -vn -0.000021 1.000000 0.000003 -vn -0.000012 1.000000 0.000004 -vn 0.000000 1.000000 0.000005 -vn -0.000001 1.000000 0.000005 -vn 0.000018 1.000000 0.000004 -vn 0.000014 1.000000 0.000004 -vn -0.000018 1.000000 0.000035 -vn 0.000000 1.000000 0.000011 -vn 0.000004 1.000000 0.000006 -vn 0.000007 1.000000 0.000002 -vn 0.000019 1.000000 -0.000020 -vn 0.000009 1.000000 -0.000003 -vn 0.000007 1.000000 -0.000002 -vn 0.000006 1.000000 -0.000005 -vn 0.000006 1.000000 -0.000008 -vn -0.000013 1.000000 -0.000028 -vn 0.000000 1.000000 -0.000011 -vn 0.000018 1.000000 0.000016 -vn 0.000057 1.000000 0.000078 -vn 0.000010 1.000000 0.000003 -vn -0.000123 0.999999 0.001098 -vn -0.000044 0.999999 0.001121 -vn 0.998839 0.000000 0.048163 -vn 0.998839 -0.000058 0.048178 -vn -0.000154 -0.999999 0.001127 -vn 0.000059 -0.999999 0.001082 -vn -0.999476 0.000000 -0.032357 -vn -0.999477 0.000062 -0.032341 -vn 0.000007 1.000000 -0.000028 -vn 0.000003 1.000000 -0.000030 -vn 0.985000 0.000000 0.172554 -vn 0.000010 -1.000000 -0.000040 -vn -0.000024 -1.000000 -0.000037 -vn -0.984984 0.000000 -0.172647 -vn 0.000021 1.000000 -0.000052 -vn 0.000014 1.000000 -0.000056 -vn 0.952980 0.000000 0.303035 -vn 0.952979 -0.000000 0.303035 -vn 0.000013 -1.000000 -0.000032 -vn 0.000008 -1.000000 -0.000032 -vn -0.952949 -0.000009 -0.303130 -vn -0.952950 -0.000000 -0.303128 -vn 0.000019 1.000000 -0.000033 -vn 0.000015 1.000000 -0.000036 -vn 0.903061 0.000000 0.429513 -vn 0.000028 -1.000000 -0.000047 -vn 0.000020 -1.000000 -0.000049 -vn -0.903023 0.000000 -0.429592 -vn -0.903022 -0.000012 -0.429594 -vn 0.000021 1.000000 -0.000027 -vn 0.000018 1.000000 -0.000031 -vn 0.835242 0.000008 0.549883 -vn 0.835241 -0.000000 0.549885 -vn 0.000032 -1.000000 -0.000040 -vn 0.000025 -1.000000 -0.000043 -vn -0.835187 0.000000 -0.549966 -vn 0.000020 1.000000 -0.000038 -vn 0.000025 1.000000 -0.000031 -vn 0.749655 0.000000 0.661829 -vn 0.749657 0.000010 0.661827 -vn 0.000050 -1.000000 -0.000009 -vn 0.000019 -1.000000 -0.000024 -vn -0.749594 0.000000 -0.661898 -vn 0.000037 1.000000 -0.000026 -vn 0.000029 1.000000 -0.000046 -vn 0.646881 0.000000 0.762591 -vn 0.000026 -1.000000 -0.000018 -vn 0.000045 -1.000000 -0.000005 -vn -0.646807 -0.000022 -0.762654 -vn -0.646811 -0.000000 -0.762650 -vn 0.000038 1.000000 -0.000004 -vn 0.000032 1.000000 -0.000023 -vn 0.528281 0.000000 0.849069 -vn 0.000038 -1.000000 -0.000035 -vn 0.000043 -1.000000 -0.000030 -vn -0.528213 0.000000 -0.849112 -vn -0.528207 -0.000025 -0.849115 -vn 0.000042 1.000000 -0.000014 -vn 0.000043 1.000000 -0.000006 -vn 0.396437 0.000011 0.918062 -vn 0.396435 -0.000000 0.918063 -vn 0.000044 -1.000000 -0.000015 -vn 0.000031 -1.000000 -0.000031 -vn -0.396374 0.000013 -0.918089 -vn -0.396371 -0.000000 -0.918091 -vn 0.000035 1.000000 0.000021 -vn 0.000035 1.000000 -0.000012 -vn 0.255326 -0.000014 0.966855 -vn 0.255331 0.000007 0.966854 -vn 0.000022 -1.000000 -0.000032 -vn 0.000034 -1.000000 -0.000011 -vn -0.255270 0.000014 -0.966870 -vn 0.000043 1.000000 0.000013 -vn 0.000042 1.000000 0.000020 -vn 0.110429 0.000000 0.993884 -vn 0.110425 -0.000014 0.993884 -vn 0.000043 -1.000000 -0.000000 -vn 0.000031 -1.000000 -0.000033 -vn -0.109712 0.000000 -0.993963 -vn -0.109716 0.000014 -0.993963 -vn 0.000034 1.000000 0.000004 -vn 0.000031 1.000000 0.000013 -vn -0.079488 -0.000012 0.996836 -vn -0.079485 0.000000 0.996836 -vn 0.000032 -1.000000 0.000004 -vn 0.000031 -1.000000 -0.000000 -vn 0.078902 -0.000002 -0.996882 -vn 0.078901 0.000000 -0.996882 -vn 0.000032 1.000000 0.000008 -vn -0.182677 0.000009 0.983173 -vn -0.182682 -0.000009 0.983172 -vn 0.000050 -1.000000 0.000012 -vn 0.000050 -1.000000 0.000006 -vn 0.182802 0.000005 -0.983150 -vn 0.182805 -0.000005 -0.983149 -vn 0.000050 1.000000 0.000018 -vn 0.000054 1.000000 0.000013 -vn -0.292580 0.000000 0.956241 -vn -0.292578 0.000005 0.956242 -vn 0.000022 -1.000000 0.000008 -vn 0.000022 -1.000000 0.000005 -vn 0.292689 0.000028 -0.956208 -vn 0.292695 0.000008 -0.956206 -vn 0.000021 1.000000 0.000010 -vn 0.000023 1.000000 0.000008 -vn -0.404252 0.000000 0.914648 -vn 0.000048 -1.000000 0.000024 -vn 0.000048 -1.000000 0.000017 -vn 0.404360 0.000000 -0.914600 -vn 0.404352 0.000026 -0.914603 -vn 0.000045 1.000000 0.000029 -vn 0.000050 1.000000 0.000025 -vn -0.512137 0.000000 0.858903 -vn -0.512137 0.000000 0.858904 -vn 0.000025 -1.000000 0.000017 -vn 0.000026 -1.000000 0.000013 -vn 0.512223 0.000000 -0.858852 -vn 0.000030 1.000000 0.000025 -vn 0.000035 1.000000 0.000023 -vn -0.610889 0.000000 0.791716 -vn 0.000032 -1.000000 0.000026 -vn 0.000033 -1.000000 0.000022 -vn 0.610951 0.000000 -0.791669 -vn 0.000025 1.000000 0.000046 -vn 0.000044 1.000000 0.000037 -vn -0.696601 0.000000 0.717459 -vn 0.000038 -1.000000 0.000020 -vn 0.000035 -1.000000 0.000029 -vn 0.696642 0.000010 -0.717419 -vn 0.696645 0.000000 -0.717416 -vn 0.000025 1.000000 0.000031 -vn 0.000015 1.000000 0.000035 -vn -0.767534 0.000000 0.641009 -vn 0.000038 -1.000000 0.000049 -vn 0.000049 -1.000000 0.000031 -vn 0.767578 0.000000 -0.640956 -vn 0.767576 0.000009 -0.640958 -vn 0.000022 1.000000 0.000033 -vn 0.000025 1.000000 0.000032 -vn -0.823955 -0.000016 0.566656 -vn -0.823951 0.000000 0.566660 -vn 0.000017 -1.000000 0.000026 -vn 0.000018 -1.000000 0.000023 -vn 0.823983 -0.000008 -0.566614 -vn 0.823982 0.000000 -0.566616 -vn 0.000023 1.000000 0.000043 -vn 0.000027 1.000000 0.000042 -vn -0.867426 0.000000 0.497567 -vn -0.867428 -0.000014 0.497562 -vn 0.000022 -1.000000 0.000040 -vn 0.000024 -1.000000 0.000037 -vn 0.867458 0.000000 -0.497511 -vn 0.867460 -0.000012 -0.497507 -vn 0.000045 1.000000 0.000026 -vn 0.000017 1.000000 0.000031 -vn -0.893838 0.000000 0.448391 -vn 0.000041 -1.000000 0.000024 -vn 0.000023 -1.000000 0.000043 -vn 0.900615 0.000000 -0.434617 -vn 0.000068 1.000000 -0.000027 -vn 0.000034 1.000000 0.000020 -vn -0.010732 0.000042 0.999942 -vn -0.010752 0.000000 0.999942 -vn 0.000055 -1.000000 0.000027 -vn 0.000058 -1.000000 0.000034 -vn -0.000049 -0.000029 -1.000000 -vn -0.000068 -0.000000 -1.000000 -vn 0.000060 1.000000 -0.000041 -vn 0.000052 1.000000 -0.000027 -vn 0.000179 0.000058 1.000000 -vn 0.000172 0.000044 1.000000 -vn 0.000037 -1.000000 0.000055 -vn 0.000022 -1.000000 0.000027 -vn -0.000067 -0.000058 -1.000000 -vn -0.000082 -0.000029 -1.000000 -vn 0.000049 1.000000 -0.000027 -vn 0.000056 1.000000 -0.000041 -vn 0.000211 0.000029 1.000000 -vn 0.000225 0.000058 1.000000 -vn 0.000035 -1.000000 0.000027 -vn 0.000049 -1.000000 0.000055 -vn -0.000127 -0.000029 -1.000000 -vn -0.000113 -0.000058 -1.000000 -vn 0.000054 1.000000 -0.000027 -vn 0.000262 0.000044 1.000000 -vn 0.000255 0.000029 1.000000 -vn 0.000040 -1.000000 0.000027 -vn -0.000161 -0.000044 -1.000000 -vn -0.000168 -0.000029 -1.000000 -vn 0.000019 1.000000 -0.000027 -vn 0.000258 0.000044 1.000000 -vn 0.000058 -1.000000 0.000027 -vn -0.000180 -0.000029 -1.000000 -vn -0.000174 -0.000044 -1.000000 -vn 0.000056 1.000000 -0.000068 -vn 0.000037 1.000000 -0.000027 -vn 0.000268 0.000044 1.000000 -vn 0.000037 -1.000000 0.000041 -vn 0.000031 -1.000000 0.000027 -vn -0.000181 -0.000029 -1.000000 -vn 0.000024 1.000000 -0.000041 -vn 0.000036 1.000000 -0.000068 -vn 0.000243 0.000044 1.000000 -vn 0.000042 -1.000000 0.000027 -vn 0.000049 -1.000000 0.000041 -vn -0.000170 -0.000029 -1.000000 -vn -0.000164 -0.000044 -1.000000 -vn 0.000042 1.000000 -0.000027 -vn 0.000048 1.000000 -0.000041 -vn 0.000220 0.000029 1.000000 -vn 0.000226 0.000044 1.000000 -vn 0.000042 -1.000000 0.000041 -vn 0.000036 -1.000000 0.000027 -vn -0.000137 -0.000044 -1.000000 -vn -0.000143 -0.000029 -1.000000 -vn 0.000035 1.000000 -0.000041 -vn 0.000029 1.000000 -0.000027 -vn 0.000193 0.000044 1.000000 -vn 0.000188 0.000029 1.000000 -vn 0.000035 -1.000000 0.000055 -vn 0.000029 -1.000000 0.000041 -vn -0.000105 -0.000044 -1.000000 -vn 0.000035 1.000000 -0.000027 -vn 0.000041 1.000000 -0.000041 -vn 0.000128 0.000044 1.000000 -vn 0.000035 -1.000000 0.000041 -vn 0.000041 -1.000000 0.000055 -vn -0.000052 -0.000058 -1.000000 -vn -0.000058 -0.000044 -1.000000 -vn 0.000046 1.000000 -0.000041 -vn 0.000040 1.000000 -0.000027 -vn 0.000081 0.000058 1.000000 -vn 0.000075 0.000044 1.000000 -vn 0.000006 -0.000044 -1.000000 -vn 0.000012 -0.000058 -1.000000 -vn 0.000022 1.000000 -0.000025 -vn 0.000037 1.000000 -0.000041 -vn -0.064093 0.000038 0.997944 -vn -0.064081 0.000052 0.997945 -vn 0.000056 -1.000000 0.000035 -vn 0.000060 -1.000000 0.000041 -vn 0.064965 -0.000052 -0.997888 -vn 0.064953 -0.000036 -0.997888 -vn 0.000034 1.000000 -0.000004 -vn 0.000055 1.000000 -0.000020 -vn -0.223532 0.000045 0.974697 -vn -0.223551 0.000022 0.974692 -vn 0.000029 -1.000000 0.000038 -vn 0.000026 -1.000000 0.000031 -vn 0.223731 -0.000052 -0.974651 -vn 0.223721 -0.000037 -0.974653 -vn 0.000066 1.000000 -0.000014 -vn 0.000042 1.000000 -0.000001 -vn -0.379455 0.000048 0.925210 -vn -0.379483 0.000013 0.925199 -vn 0.000013 -1.000000 0.000037 -vn 0.000011 -1.000000 0.000032 -vn 0.379600 -0.000033 -0.925151 -vn 0.379594 -0.000024 -0.925153 -vn 0.000068 1.000000 -0.000003 -vn 0.000081 1.000000 -0.000006 -vn -0.524009 0.000044 0.851713 -vn -0.524021 0.000029 0.851705 -vn 0.000003 -1.000000 0.000019 -vn 0.000006 -1.000000 0.000034 -vn 0.524089 -0.000027 -0.851663 -vn 0.524081 -0.000014 -0.851668 -vn 0.000044 1.000000 -0.000034 -vn 0.000027 1.000000 -0.000032 -vn -0.651117 0.000037 0.758977 -vn -0.651123 0.000028 0.758972 -vn 0.000058 -1.000000 0.000094 -vn 0.000057 -1.000000 0.000057 -vn 0.651138 -0.000039 -0.758959 -vn 0.651119 -0.000007 -0.758976 -vn 0.000038 1.000000 0.000027 -vn 0.000108 1.000000 0.000027 -vn -0.757590 0.000041 0.652731 -vn -0.757602 0.000020 0.652716 -vn -0.000005 -1.000000 0.000039 -vn -0.000005 -1.000000 0.000034 -vn 0.757600 -0.000028 -0.652719 -vn 0.757597 -0.000022 -0.652722 -vn 0.000046 1.000000 0.000024 -vn -0.842878 0.000030 0.538105 -vn -0.842873 0.000040 0.538113 -vn -0.000005 -1.000000 0.000048 -vn -0.000003 -1.000000 0.000042 -vn 0.842876 -0.000035 -0.538107 -vn 0.842871 -0.000023 -0.538115 -vn 0.000046 1.000000 0.000040 -vn 0.000056 1.000000 0.000043 -vn -0.907955 0.000048 0.419068 -vn -0.907966 0.000016 0.419044 -vn -0.000016 -1.000000 0.000035 -vn -0.000014 -1.000000 0.000031 -vn 0.907973 -0.000065 -0.419029 -vn 0.907958 -0.000019 -0.419061 -vn 0.000045 1.000000 0.000009 -vn 0.000031 1.000000 0.000003 -vn -0.954535 0.000044 0.298098 -vn -0.000038 -1.000000 0.000076 -vn -0.000014 -1.000000 0.000039 -vn 0.954538 -0.000040 -0.298091 -vn 0.954543 -0.000064 -0.298073 -vn 0.000048 1.000000 0.000046 -vn 0.000056 1.000000 0.000050 -vn -0.984248 0.000047 0.176795 -vn -0.984249 0.000040 0.176790 -vn -0.000048 -1.000000 0.000069 -vn -0.000042 -1.000000 0.000062 -vn 0.984256 -0.000049 -0.176751 -vn 0.984254 -0.000037 -0.176759 -vn 0.000056 1.000000 0.000028 -vn 0.000045 1.000000 0.000021 -vn -0.998430 0.000064 0.056018 -vn -0.998431 0.000035 0.055995 -vn -0.000042 -1.000000 0.000025 -vn -0.000052 -1.000000 0.000034 -vn 0.998434 -0.000067 -0.055935 -vn 0.998433 -0.000036 -0.055958 -vn 0.000037 1.000000 0.000035 -vn 0.000056 1.000000 0.000052 -vn -0.997384 0.000057 -0.072281 -vn -0.997384 0.000051 -0.072286 -vn -0.000047 -1.000000 0.000032 -vn -0.000042 -1.000000 0.000029 -vn 0.997364 -0.000088 0.072564 -vn 0.997365 -0.000054 0.072540 -vn 0.000072 1.000000 0.000050 -vn 0.000041 1.000000 0.000009 -vn -0.976534 0.000057 -0.215362 -vn -0.976534 0.000054 -0.215365 -vn -0.000105 -1.000000 0.000055 -vn -0.000046 -1.000000 0.000024 -vn 0.976482 -0.000089 0.215600 -vn 0.976483 -0.000079 0.215593 -vn 0.000063 1.000000 0.000062 -vn 0.000066 1.000000 0.000069 -vn -0.932900 0.000086 -0.360136 -vn -0.932889 0.000054 -0.360163 -vn -0.000070 -1.000000 0.000016 -vn -0.000096 -1.000000 0.000026 -vn 0.932823 -0.000091 0.360335 -vn 0.932825 -0.000085 0.360331 -vn 0.000039 1.000000 0.000064 -vn 0.000048 1.000000 0.000092 -vn -0.866173 0.000115 -0.499745 -vn -0.866150 0.000068 -0.499784 -vn -0.000059 -1.000000 -0.000006 -vn 0.866101 -0.000107 0.499869 -vn 0.866114 -0.000075 0.499846 -vn 0.000011 1.000000 0.000088 -vn 0.000013 1.000000 0.000102 -vn -0.778611 0.000107 -0.627507 -vn -0.778605 0.000098 -0.627514 -vn -0.000073 -1.000000 -0.000004 -vn 0.778570 -0.000098 0.627557 -vn 0.778575 -0.000089 0.627551 -vn 0.000027 1.000000 0.000066 -vn 0.000027 1.000000 0.000072 -vn -0.674390 0.000101 -0.738376 -vn -0.674382 0.000090 -0.738383 -vn -0.000123 -1.000000 -0.000029 -vn -0.000055 -1.000000 -0.000023 -vn 0.674380 -0.000081 0.738385 -vn 0.674381 -0.000079 0.738384 -vn 0.000006 1.000000 0.000075 -vn 0.000005 1.000000 0.000083 -vn -0.558684 0.000091 -0.829381 -vn -0.558678 0.000083 -0.829385 -vn -0.000079 -1.000000 -0.000067 -vn -0.000074 -1.000000 -0.000065 -vn 0.558671 -0.000107 0.829389 -vn 0.558700 -0.000067 0.829370 -vn -0.000015 1.000000 0.000109 -vn -0.000006 1.000000 0.000082 -vn -0.436323 0.000091 -0.899790 -vn -0.436313 0.000079 -0.899795 -vn -0.000101 -1.000000 -0.000049 -vn -0.000106 -1.000000 -0.000051 -vn 0.436330 -0.000117 0.899787 -vn 0.436349 -0.000091 0.899777 -vn -0.000014 1.000000 0.000074 -vn -0.000033 1.000000 0.000116 -vn -0.311365 0.000129 -0.950290 -vn -0.311329 0.000087 -0.950302 -vn -0.000048 -1.000000 -0.000059 -vn -0.000059 -1.000000 -0.000065 -vn 0.311349 -0.000129 0.950296 -vn 0.311360 -0.000115 0.950292 -vn -0.000022 1.000000 0.000072 -vn -0.000025 1.000000 0.000077 -vn -0.186650 0.000108 -0.982426 -vn -0.186665 0.000125 -0.982424 -vn -0.000055 -1.000000 -0.000076 -vn -0.000036 -1.000000 -0.000062 -vn 0.186642 -0.000123 0.982428 -vn 0.186639 -0.000125 0.982428 -vn -0.000030 1.000000 0.000069 -vn -0.000033 1.000000 0.000073 -vn -0.064068 0.000108 -0.997946 -vn -0.064057 0.000095 -0.997946 -vn -0.000044 -1.000000 -0.000096 -vn -0.000028 -1.000000 -0.000080 -vn 0.064372 -0.000124 0.997926 -vn 0.064383 -0.000109 0.997925 -vn -0.000050 1.000000 0.000096 -vn -0.000033 1.000000 0.000069 -vn -0.004377 0.000118 -0.999990 -vn -0.004369 0.000102 -0.999990 -vn -0.000067 -1.000000 -0.000082 -vn -0.000075 -1.000000 -0.000095 -vn 0.004280 -0.000132 0.999991 -vn 0.004288 -0.000117 0.999991 -vn -0.000064 1.000000 0.000124 -vn 0.004643 0.000116 -0.999989 -vn 0.004643 0.000115 -0.999989 -vn -0.000028 -1.000000 -0.000096 -vn -0.000021 -1.000000 -0.000082 -vn -0.004712 -0.000101 0.999989 -vn -0.004726 -0.000130 0.999989 -vn -0.000045 1.000000 0.000110 -vn -0.000051 1.000000 0.000124 -vn 0.001038 0.000014 -0.999999 -vn 0.000993 0.000116 -1.000000 -vn -0.000051 -1.000000 -0.000110 -vn -0.001437 -0.000014 0.999999 -vn -0.001475 -0.000102 0.999999 -vn -0.000041 1.000000 0.000082 -vn -0.000053 1.000000 0.000110 -vn 0.000047 0.000015 -1.000000 -vn -0.000024 -1.000000 -0.000083 -vn -0.000035 -1.000000 -0.000110 -vn -0.000047 -0.000015 1.000000 -vn -0.000017 1.000000 0.000082 -vn 0.000096 0.000015 -1.000000 -vn -0.000051 -1.000000 -0.000124 -vn -0.000034 -1.000000 -0.000083 -vn -0.000091 -0.000015 1.000000 -vn -0.000039 1.000000 0.000110 -vn -0.000028 1.000000 0.000082 -vn 0.000134 0.000029 -1.000000 -vn 0.000139 0.000015 -1.000000 -vn -0.000056 -1.000000 -0.000124 -vn -0.000128 -0.000029 1.000000 -vn -0.000122 -0.000015 1.000000 -vn -0.000039 1.000000 0.000096 -vn 0.000168 0.000015 -1.000000 -vn 0.000163 0.000029 -1.000000 -vn -0.000034 -1.000000 -0.000110 -vn -0.000146 -0.000015 1.000000 -vn -0.000151 -0.000029 1.000000 -vn -0.000046 1.000000 0.000110 -vn -0.000041 1.000000 0.000096 -vn 0.000185 -0.000000 -1.000000 -vn 0.000180 0.000015 -1.000000 -vn -0.000023 -1.000000 -0.000110 -vn -0.000168 -0.000015 1.000000 -vn -0.000031 1.000000 0.000082 -vn -0.000043 1.000000 0.000110 -vn 0.000197 -0.000000 -1.000000 -vn -0.000043 -1.000000 -0.000083 -vn -0.000055 -1.000000 -0.000110 -vn -0.000191 -0.000029 1.000000 -vn -0.000185 -0.000015 1.000000 -vn -0.000054 1.000000 0.000123 -vn -0.000034 1.000000 0.000082 -vn 0.000210 -0.000000 -1.000000 -vn -0.000054 -1.000000 -0.000124 -vn -0.000190 -0.000015 1.000000 -vn -0.000196 -0.000029 1.000000 -vn -0.000051 1.000000 0.000131 -vn -0.000047 1.000000 0.000123 -vn 0.001568 0.000044 -0.999999 -vn 0.001588 -0.000000 -0.999999 -vn -0.000082 -1.000000 -0.000124 -vn 0.001683 -0.000044 0.999999 -vn 0.001703 -0.000015 0.999999 -vn 0.000074 1.000000 0.000077 -vn 0.000055 1.000000 0.000057 -vn -0.940268 0.000107 -0.340437 -vn -0.940270 0.000127 -0.340430 -vn 0.936282 -0.000107 0.351250 -vn 0.936278 -0.000127 0.351259 -vn 0.000047 1.000000 0.000086 -vn 0.000063 1.000000 0.000103 -vn -0.902052 0.000122 -0.431628 -vn -0.902048 0.000101 -0.431635 -vn -0.000087 -1.000000 -0.000017 -vn -0.000113 -1.000000 -0.000019 -vn 0.902035 -0.000122 0.431662 -vn 0.902039 -0.000101 0.431655 -vn 0.000061 1.000000 0.000081 -vn 0.000055 1.000000 0.000072 -vn -0.843826 0.000101 -0.536616 -vn -0.843828 0.000111 -0.536613 -vn -0.000094 -1.000000 0.000009 -vn -0.000101 -1.000000 0.000007 -vn 0.843805 -0.000101 0.536649 -vn 0.843804 -0.000111 0.536652 -vn 0.000028 1.000000 0.000092 -vn 0.000039 1.000000 0.000110 -vn -0.776810 0.000111 -0.629735 -vn -0.776806 0.000093 -0.629740 -vn -0.000104 -1.000000 -0.000032 -vn -0.000072 -1.000000 -0.000020 -vn 0.776771 -0.000111 0.629784 -vn 0.776775 -0.000093 0.629779 -vn 0.000048 1.000000 0.000123 -vn 0.000031 1.000000 0.000088 -vn -0.700953 0.000105 -0.713207 -vn -0.000095 -1.000000 -0.000047 -vn -0.000091 -1.000000 -0.000045 -vn 0.700905 -0.000104 0.713255 -vn 0.700905 -0.000105 0.713255 -vn 0.000037 1.000000 0.000092 -vn 0.000047 1.000000 0.000124 -vn -0.615567 0.000120 -0.788084 -vn -0.615561 0.000097 -0.788089 -vn -0.000121 -1.000000 -0.000069 -vn -0.000092 -1.000000 -0.000050 -vn 0.615503 -0.000108 0.788135 -vn 0.615505 -0.000101 0.788133 -vn 0.000021 1.000000 0.000113 -vn 0.000019 1.000000 0.000104 -vn -0.519720 0.000106 -0.854337 -vn -0.519721 0.000112 -0.854336 -vn -0.000080 -1.000000 -0.000068 -vn -0.000099 -1.000000 -0.000084 -vn 0.519654 -0.000093 0.854377 -vn 0.519652 -0.000100 0.854378 -vn 0.000001 1.000000 0.000088 -vn 0.000004 1.000000 0.000122 -vn -0.412756 0.000102 -0.910842 -vn -0.412756 0.000105 -0.910841 -vn -0.000069 -1.000000 -0.000063 -vn -0.000076 -1.000000 -0.000070 -vn 0.412685 -0.000102 0.910874 -vn 0.412688 -0.000091 0.910872 -vn -0.000005 1.000000 0.000100 -vn -0.000005 1.000000 0.000090 -vn -0.294798 0.000102 -0.955560 -vn -0.294795 0.000091 -0.955561 -vn -0.000072 -1.000000 -0.000097 -vn -0.000053 -1.000000 -0.000069 -vn 0.294720 -0.000102 0.955584 -vn 0.294723 -0.000091 0.955583 -vn -0.000030 1.000000 0.000100 -vn -0.000031 1.000000 0.000106 -vn -0.167222 0.000091 -0.985919 -vn -0.167224 0.000097 -0.985919 -vn -0.000062 -1.000000 -0.000105 -vn -0.000060 -1.000000 -0.000100 -vn 0.167159 -0.000121 0.985930 -vn 0.167166 -0.000097 0.985929 -vn -0.000026 1.000000 0.000082 -vn -0.032971 0.000134 -0.999456 -vn -0.032958 0.000089 -0.999457 -vn -0.000037 -1.000000 -0.000097 -vn -0.000040 -1.000000 -0.000107 -vn 0.033077 -0.000119 0.999453 -vn 0.033077 -0.000118 0.999453 -vn -0.000044 1.000000 0.000105 -vn -0.000036 1.000000 0.000082 -vn 0.085701 0.000114 -0.996321 -vn 0.085698 0.000126 -0.996321 -vn -0.000025 -1.000000 -0.000088 -vn -0.000027 -1.000000 -0.000097 -vn -0.085945 -0.000129 0.996300 -vn -0.085941 -0.000111 0.996300 -vn -0.000054 1.000000 0.000085 -vn -0.000063 1.000000 0.000102 -vn 0.225992 0.000143 -0.974129 -vn 0.226001 0.000107 -0.974127 -vn -0.000025 -1.000000 -0.000094 -vn -0.226093 -0.000128 0.974106 -vn -0.226091 -0.000122 0.974106 -vn -0.000086 1.000000 0.000083 -vn -0.000081 1.000000 0.000077 -vn 0.363481 0.000120 -0.931602 -vn 0.363477 0.000136 -0.931603 -vn 0.000016 -1.000000 -0.000160 -vn 0.000008 -1.000000 -0.000084 -vn -0.363566 -0.000123 0.931568 -vn -0.000085 1.000000 0.000078 -vn -0.000088 1.000000 0.000081 -vn 0.493033 0.000127 -0.870011 -vn 0.493035 0.000116 -0.870009 -vn 0.000020 -1.000000 -0.000102 -vn 0.000032 -1.000000 -0.000153 -vn -0.493102 -0.000115 0.869971 -vn -0.000102 1.000000 0.000060 -vn -0.000107 1.000000 0.000063 -vn 0.610588 0.000111 -0.791948 -vn 0.610587 0.000116 -0.791949 -vn 0.000045 -1.000000 -0.000127 -vn 0.000032 -1.000000 -0.000095 -vn -0.610646 -0.000122 0.791904 -vn -0.610642 -0.000104 0.791907 -vn -0.000127 1.000000 0.000068 -vn -0.000106 1.000000 0.000056 -vn 0.713615 0.000134 -0.700538 -vn 0.713621 0.000103 -0.700531 -vn 0.000053 -1.000000 -0.000129 -vn 0.000050 -1.000000 -0.000123 -vn -0.713672 -0.000124 0.700481 -vn -0.713670 -0.000113 0.700482 -vn -0.000122 1.000000 0.000045 -vn -0.000141 1.000000 0.000052 -vn 0.800963 0.000103 -0.598713 -vn 0.800959 0.000126 -0.598719 -vn 0.000060 -1.000000 -0.000087 -vn 0.000074 -1.000000 -0.000106 -vn -0.801009 -0.000144 0.598653 -vn -0.801003 -0.000111 0.598660 -vn -0.000127 1.000000 0.000029 -vn -0.000132 1.000000 0.000030 -vn 0.872370 0.000101 -0.488847 -vn 0.872370 0.000097 -0.488846 -vn 0.000075 -1.000000 -0.000101 -vn 0.000061 -1.000000 -0.000086 -vn -0.872406 -0.000144 0.488783 -vn -0.872405 -0.000137 0.488784 -vn -0.000088 1.000000 0.000004 -vn -0.000137 1.000000 0.000009 -vn 0.927993 0.000112 -0.372598 -vn 0.927995 0.000093 -0.372593 -vn 0.000076 -1.000000 -0.000081 -vn 0.000083 -1.000000 -0.000086 -vn -0.928022 -0.000136 0.372526 -vn -0.928021 -0.000134 0.372527 -vn -0.000121 1.000000 -0.000028 -vn -0.000099 1.000000 -0.000027 -vn 0.967977 0.000136 -0.251039 -vn 0.967979 0.000107 -0.251031 -vn 0.000115 -1.000000 -0.000069 -vn 0.000086 -1.000000 -0.000052 -vn -0.967999 -0.000136 0.250952 -vn -0.967999 -0.000132 0.250953 -vn -0.000044 0.999999 0.001272 -vn 0.000145 0.999999 0.001302 -vn 0.991190 -0.000058 -0.132450 -vn 0.991183 0.000130 -0.132504 -vn 0.000059 -0.999999 0.001326 -vn 0.000368 -0.999999 0.001195 -vn -0.993048 0.000061 0.117710 -vn -0.993054 -0.000129 0.117658 -vn -0.000014 -1.000000 -0.000033 -vn -0.000090 -1.000000 -0.000206 -vn -0.000040 -1.000000 0.000038 -vn -0.000048 -1.000000 -0.000029 -vn 0.000000 -1.000000 -0.000078 -vn -0.000060 -1.000000 0.000012 -vn -0.000094 -1.000000 0.000019 -vn -0.000123 -1.000000 0.000005 -vn -0.000014 -1.000000 0.000054 -vn -0.000193 -1.000000 0.000004 -vn -0.000185 -1.000000 -0.000007 -vn -0.000076 -1.000000 0.000009 -vn -0.000279 -1.000000 0.000568 -vn -0.000047 -1.000000 -0.000064 -vn -0.000204 -1.000000 -0.000066 -vn 0.499976 0.000000 0.866039 -vn 0.499991 0.000000 -0.866031 -vn 0.499979 0.000000 0.866038 -vn 0.499979 0.000000 -0.866038 -vn 0.499993 0.000000 0.866029 -vn 0.499978 0.000000 -0.866038 -vn 0.499978 0.000000 0.866038 -s off -f 4592/2176/2742 4596/2176/2742 4595/2176/2742 -f 4592/2176/2742 4593/2176/2742 4596/2176/2742 -f 4593/2176/7 4597/2176/7 4596/2176/7 -f 4593/2176/7 4594/2176/7 4597/2176/7 -f 4594/2176/2743 4595/2176/2743 4597/2176/2743 -f 4594/2176/2743 4592/2176/2743 4595/2176/2743 -f 4598/2177/331 4599/2178/331 4600/2179/331 -f 4598/2177/331 5520/2180/331 4601/2178/331 -f 5521/2180/331 4601/2178/331 4602/2178/331 -f 5522/2180/331 5523/2180/331 4603/2178/331 -f 5524/2178/331 5525/2181/331 4604/2182/331 -f 5526/2178/331 5527/2179/331 4605/2181/331 -f 5528/2179/331 4605/2181/331 4606/2181/331 -f 5529/2179/331 5530/2179/331 4607/2181/331 -f 4618/2183/331 4619/2184/331 4620/2185/331 -f 4618/2183/331 5531/2186/331 4621/2184/331 -f 5532/2186/331 4621/2184/331 4622/2184/331 -f 5533/2186/331 5534/2186/331 4623/2184/331 -f 5535/2186/331 5536/2185/331 4624/2184/331 -f 5537/2186/331 5538/2183/331 4625/2185/331 -f 4618/2183/331 4625/2185/331 4626/2185/331 -f 4618/2183/331 5539/2183/331 4627/2185/331 -f 4638/2187/331 4639/2188/331 4640/2189/331 -f 4638/2187/331 5540/2190/331 4641/2188/331 -f 5541/2190/331 4641/2188/331 4642/2188/331 -f 5542/2190/331 5543/2190/331 4643/2188/331 -f 5544/2188/331 5545/2191/331 4644/2192/331 -f 5546/2188/331 5547/2189/331 4645/2191/331 -f 5548/2189/331 5549/2191/331 4646/2191/331 -f 5550/2189/331 5551/2189/331 4647/2191/331 -f 4658/2193/331 4659/2194/331 4660/2195/331 -f 4658/2193/331 5552/2196/331 4661/2194/331 -f 5553/2196/331 4661/2194/331 4662/2194/331 -f 5554/2196/331 5555/2196/331 4663/2194/331 -f 5556/2196/331 5557/2195/331 4664/2194/331 -f 5558/2196/331 5559/2193/331 4665/2195/331 -f 4658/2193/331 4665/2195/331 4666/2195/331 -f 4658/2193/331 5560/2193/331 4667/2195/331 -f 4678/2197/331 4679/2198/331 4680/2199/331 -f 4678/2197/331 5561/2200/331 4681/2198/331 -f 5562/2200/331 4681/2198/331 4682/2198/331 -f 5563/2200/331 5564/2200/331 4683/2198/331 -f 5565/2198/331 5566/2201/331 4684/2202/331 -f 5567/2198/331 5568/2199/331 4685/2201/331 -f 5569/2199/331 4685/2201/331 4686/2201/331 -f 5570/2199/331 5571/2199/331 4687/2201/331 -f 4698/2203/2744 4699/2204/2744 4700/2205/2744 -f 4698/2203/2745 5572/2206/2745 4701/2204/2745 -f 5573/2206/2746 4701/2204/2746 4702/2204/2746 -f 5574/2206/2747 5575/2206/2747 4703/2204/2747 -f 5576/2206/331 5577/2205/331 4704/2204/331 -f 5578/2206/331 5579/2203/331 4705/2205/331 -f 4698/2203/331 4705/2205/331 4706/2205/331 -f 4698/2203/331 5580/2203/331 4707/2205/331 -f 4788/2207/2748 4789/2200/2748 4790/2200/2748 -f 4788/2207/2748 4791/2207/2748 4789/2200/2748 -f 5581/2200/105 4792/2199/105 5582/2198/105 -f 5583/2200/105 4793/2197/105 4792/2199/105 -f 4793/2197/2749 4794/2199/2749 4792/2199/2749 -f 4793/2197/2749 4795/2197/2749 4794/2199/2749 -f 4795/2197/21 5584/2198/21 4794/2199/21 -f 4795/2197/21 5585/2200/21 5586/2198/21 -f 4790/2200/331 4796/2198/331 4797/2198/331 -f 4790/2200/331 4789/2200/331 4796/2198/331 -f 5587/2198/2750 4798/2201/2750 5588/2202/2750 -f 5589/2198/2750 4792/2199/2750 4798/2201/2750 -f 4792/2199/2751 4799/2201/2751 4798/2201/2751 -f 4792/2199/2749 4794/2199/2749 4799/2201/2749 -f 4794/2199/21 5590/2202/21 4799/2201/21 -f 4794/2199/21 5591/2198/21 5592/2202/21 -f 4797/2198/331 4800/2202/331 4801/2202/331 -f 4797/2198/331 4796/2198/331 4800/2202/331 -f 5593/2202/2752 4802/2208/2752 5594/2209/2752 -f 5595/2202/105 4798/2201/105 4802/2208/105 -f 4798/2201/2749 4803/2208/2749 4802/2208/2749 -f 4798/2201/2753 4799/2201/2753 4803/2208/2753 -f 4799/2201/21 5596/2209/21 4803/2208/21 -f 4799/2201/21 5597/2202/21 5598/2209/21 -f 4801/2202/331 4804/2209/331 4805/2209/331 -f 4801/2202/331 4800/2202/331 4804/2209/331 -f 5599/2209/105 4806/2206/105 5600/2203/105 -f 5601/2209/2752 4802/2208/2752 4806/2206/2752 -f 4802/2208/2749 4807/2206/2749 4806/2206/2749 -f 4802/2208/2749 4803/2208/2749 4807/2206/2749 -f 4803/2208/21 5602/2203/21 4807/2206/21 -f 4803/2208/21 5603/2209/21 5604/2203/21 -f 4805/2209/2754 4808/2203/2754 4809/2203/2754 -f 4805/2209/2755 4804/2209/2755 4808/2203/2755 -f 5605/2203/105 4810/2204/105 5606/2205/105 -f 5607/2203/105 4806/2206/105 4810/2204/105 -f 4806/2206/2756 4811/2204/2756 4810/2204/2756 -f 4806/2206/2749 4807/2206/2749 4811/2204/2749 -f 4807/2206/2757 5608/2205/2757 4811/2204/2757 -f 4807/2206/2757 5609/2203/2757 5610/2205/2757 -f 4809/2203/2755 4812/2205/2755 4813/2205/2755 -f 4809/2203/2754 4808/2203/2754 4812/2205/2754 -f 5611/2205/105 4814/2210/105 5612/2211/105 -f 5613/2205/105 4810/2204/105 4814/2210/105 -f 4810/2204/2758 4815/2210/2758 4814/2210/2758 -f 4810/2204/2759 4811/2204/2759 4815/2210/2759 -f 4811/2204/2760 5614/2211/2760 4815/2210/2760 -f 4811/2204/2761 5615/2205/2761 5616/2211/2761 -f 4813/2205/331 4816/2211/331 4817/2211/331 -f 4813/2205/331 4812/2205/331 4816/2211/331 -f 5617/2211/105 4818/2212/105 5618/2213/105 -f 5619/2211/105 4814/2210/105 4818/2212/105 -f 4814/2210/2749 4819/2212/2749 4818/2212/2749 -f 4814/2210/2749 4815/2210/2749 4819/2212/2749 -f 4815/2210/21 5620/2213/21 4819/2212/21 -f 4815/2210/2762 5621/2211/2762 5622/2213/2762 -f 4817/2211/331 4820/2213/331 4821/2213/331 -f 4817/2211/331 4816/2211/331 4820/2213/331 -f 5623/2213/105 4822/2214/105 5624/2215/105 -f 5625/2213/105 4818/2212/105 4822/2214/105 -f 4818/2212/2749 4823/2214/2749 4822/2214/2749 -f 4818/2212/2749 4819/2212/2749 4823/2214/2749 -f 4819/2212/21 4821/2213/21 5626/2216/21 -f 5627/2213/21 5628/2215/21 5629/2216/21 -f 4821/2213/2748 4824/2213/2748 4825/2215/2748 -f 5630/2217/2748 5631/2218/2748 5632/2219/2748 -f 5633/2220/105 4826/2218/105 5634/2217/105 -f 5635/2221/105 5636/2220/105 5637/2222/105 -f 5638/2218/2749 4827/2221/2749 5639/2223/2749 -f 5640/2217/2749 5641/2221/2749 5642/2222/2749 -f 5643/2221/21 5644/2219/21 5645/2223/21 -f 5646/2222/21 5647/2220/21 5648/2222/21 -f 5649/2222/331 4828/2220/331 4829/2217/331 -f 5650/2218/331 5651/2223/331 5652/2219/331 -f 5653/2219/105 4830/2223/105 5654/2223/105 -f 5655/2224/105 5656/2225/105 5657/2226/105 -f 5658/2224/2749 4831/2218/2749 5659/2225/2749 -f 5660/2218/2749 5661/2225/2749 5662/2225/2749 -f 5663/2218/21 5664/2219/21 5665/2225/21 -f 5666/2219/21 5667/2226/21 5668/2225/21 -f 5669/2219/331 4832/2217/331 4833/2226/331 -f 5670/2217/331 5671/2226/331 5672/2226/331 -f 5673/2217/105 4834/2224/105 5674/2226/105 -f 5675/2226/105 5676/2227/105 5677/2228/105 -f 5678/2226/2749 4835/2225/2749 5679/2227/2749 -f 5680/2225/2749 5681/2227/2749 5682/2227/2749 -f 5683/2225/21 5684/2225/21 5685/2227/21 -f 5686/2225/21 5687/2228/21 5688/2227/21 -f 5689/2225/331 5690/2226/331 4836/2228/331 -f 5691/2226/2763 4837/2228/2763 4836/2228/2763 -f 5692/2226/2763 5693/2226/2763 4837/2228/2763 -f 5694/2228/2764 4838/2229/2764 4839/2230/2764 -f 5695/2228/2764 5696/2227/2764 4838/2229/2764 -f 5697/2227/2765 4840/2229/2765 4841/2229/2765 -f 5698/2227/2765 5699/2227/2765 4840/2229/2765 -f 5700/2227/3 4842/2230/3 4840/2229/3 -f 5701/2227/2766 4843/2228/2766 4842/2230/2766 -f 5702/2228/2766 5703/2230/2766 5704/2230/2766 -f 4843/2228/2767 4844/2228/2767 4845/2230/2767 -f 5705/2230/2767 5706/2231/2767 5707/2232/2767 -f 5708/2230/2768 4846/2229/2768 5709/2231/2768 -f 4841/2229/2768 5710/2231/2768 5711/2231/2768 -f 4840/2229/2769 4847/2229/2769 5712/2231/2769 -f 4840/2229/2770 5713/2232/2770 5714/2231/2770 -f 5715/2229/2771 4845/2230/2771 5716/2232/2771 -f 4842/2230/2772 5717/2232/2772 5718/2232/2772 -f 4845/2230/2773 4848/2230/2773 4849/2232/2773 -f 5719/2232/2774 5720/2233/2774 5721/2234/2774 -f 5722/2232/2775 4850/2231/2775 5723/2233/2775 -f 5724/2231/2775 5725/2233/2775 5726/2233/2775 -f 5727/2231/2776 4851/2231/2776 5728/2233/2776 -f 5729/2231/2777 5730/2234/2777 5731/2233/2777 -f 5732/2231/2778 5733/2232/2778 5734/2234/2778 -f 5735/2232/2778 5736/2234/2778 5737/2234/2778 -f 5738/2232/331 4852/2232/331 4853/2234/331 -f 5739/2234/331 5740/2235/331 5741/2236/331 -f 5742/2234/2779 4854/2233/2779 5743/2235/2779 -f 5744/2233/2779 5745/2235/2779 5746/2235/2779 -f 5747/2233/3 4855/2233/3 5748/2235/3 -f 5749/2233/3 5750/2236/3 5751/2235/3 -f 5752/2233/2780 4853/2234/2780 5753/2236/2780 -f 5754/2234/2781 5755/2236/2781 5756/2236/2781 -f 4853/2234/2782 4856/2234/2782 4857/2236/2782 -f 5757/2236/2782 5758/2237/2782 5759/2238/2782 -f 5760/2236/2783 4858/2235/2783 5761/2237/2783 -f 5762/2235/2783 5763/2237/2783 5764/2237/2783 -f 5765/2235/3 4859/2235/3 5766/2237/3 -f 5767/2235/3 5768/2238/3 5769/2237/3 -f 5770/2235/2784 4857/2236/2784 5771/2238/2784 -f 5772/2236/2785 5773/2238/2785 5774/2238/2785 -f 4857/2236/331 4860/2236/331 4861/2238/331 -f 5775/2238/331 5776/2239/331 5777/2240/331 -f 5778/2238/2786 4862/2237/2786 5779/2239/2786 -f 5780/2237/2786 5781/2239/2786 5782/2239/2786 -f 5783/2237/2787 4863/2237/2787 5784/2239/2787 -f 5785/2237/2788 5786/2240/2788 5787/2239/2788 -f 5788/2237/2789 4861/2238/2789 5789/2240/2789 -f 5790/2238/2790 5791/2240/2790 5792/2240/2790 -f 5793/2238/2791 4864/2238/2791 4865/2240/2791 -f 5794/2240/2791 5795/2241/2791 5796/2242/2791 -f 5797/2240/2792 4866/2239/2792 4867/2241/2792 -f 5798/2239/2792 5799/2241/2792 5800/2241/2792 -f 4866/2239/331 4868/2239/331 4869/2241/331 -f 4866/2239/331 5801/2242/331 5802/2241/331 -f 5803/2239/2793 4870/2240/2793 5804/2242/2793 -f 4865/2240/2793 5805/2242/2793 5806/2242/2793 -f 5807/2240/2794 4871/2240/2794 5808/2242/2794 -f 5809/2242/2795 5810/2243/2795 5811/2244/2795 -f 5812/2242/2796 4869/2241/2796 5813/2243/2796 -f 4867/2241/2796 5814/2243/2796 5815/2243/2796 -f 4869/2241/331 4872/2241/331 4873/2243/331 -f 4869/2241/331 5816/2244/331 5817/2243/331 -f 5818/2241/2797 4874/2242/2797 5819/2244/2797 -f 5820/2242/2798 5821/2244/2798 5822/2244/2798 -f 5823/2242/3 4875/2242/3 5824/2244/3 -f 5825/2244/3 5826/2245/3 5827/2246/3 -f 5828/2244/2799 4873/2243/2799 5829/2245/2799 -f 5830/2243/2799 5831/2245/2799 5832/2245/2799 -f 4873/2243/331 4876/2243/331 4877/2245/331 -f 4873/2243/331 5833/2246/331 5834/2245/331 -f 5835/2243/2800 4878/2244/2800 5836/2246/2800 -f 5837/2244/2801 5838/2246/2801 5839/2246/2801 -f 5840/2244/3 4879/2244/3 5841/2246/3 -f 5842/2246/3 5843/2247/3 5844/2248/3 -f 5845/2246/2802 4877/2245/2802 5846/2247/2802 -f 5847/2245/2802 5848/2247/2802 5849/2247/2802 -f 4877/2245/331 4880/2245/331 4881/2247/331 -f 4877/2245/331 5850/2248/331 5851/2247/331 -f 5852/2245/2803 4882/2246/2803 5853/2248/2803 -f 5854/2246/2803 5855/2248/2803 5856/2248/2803 -f 5857/2246/3 4883/2246/3 5858/2248/3 -f 5859/2248/3 5860/2249/3 5861/2250/3 -f 5862/2248/2804 4881/2247/2804 5863/2249/2804 -f 5864/2247/2804 5865/2249/2804 5866/2249/2804 -f 4881/2247/2217 4884/2247/2217 4885/2249/2217 -f 4881/2247/2805 5867/2250/2805 5868/2249/2805 -f 5869/2247/2806 4886/2248/2806 5870/2250/2806 -f 5871/2248/2806 5872/2250/2806 5873/2250/2806 -f 5874/2248/3 4887/2248/3 5875/2250/3 -f 5876/2250/3 5877/2251/3 5878/2252/3 -f 5879/2250/2807 4885/2249/2807 5880/2251/2807 -f 5881/2249/2807 5882/2251/2807 5883/2251/2807 -f 4885/2249/331 4888/2249/331 4889/2251/331 -f 4885/2249/331 5884/2252/331 5885/2251/331 -f 5886/2249/2808 4890/2250/2808 5887/2252/2808 -f 5888/2250/2809 5889/2252/2809 5890/2252/2809 -f 5891/2250/3 4891/2250/3 5892/2252/3 -f 5893/2252/3 5894/2253/3 5895/2254/3 -f 5896/2252/2810 4889/2251/2810 5897/2253/2810 -f 5898/2251/2810 5899/2253/2810 5900/2253/2810 -f 4889/2251/331 4892/2251/331 4893/2253/331 -f 4889/2251/331 5901/2254/331 5902/2253/331 -f 5903/2251/2811 4894/2252/2811 5904/2254/2811 -f 5905/2252/2812 5906/2254/2812 5907/2254/2812 -f 5908/2252/2813 4895/2252/2813 5909/2254/2813 -f 5910/2254/2813 5911/2255/2813 5912/2256/2813 -f 5913/2254/2814 4893/2253/2814 5914/2255/2814 -f 5915/2253/2814 5916/2255/2814 5917/2255/2814 -f 4893/2253/331 4896/2253/331 4897/2255/331 -f 4893/2253/331 5918/2256/331 5919/2255/331 -f 5920/2253/2815 4898/2254/2815 5921/2256/2815 -f 5922/2254/2815 5923/2256/2815 5924/2256/2815 -f 5925/2254/3 4899/2254/3 5926/2256/3 -f 5927/2256/3 5928/2257/3 5929/2258/3 -f 5930/2256/2816 4897/2255/2816 5931/2257/2816 -f 5932/2255/2816 5933/2257/2816 5934/2257/2816 -f 4897/2255/2817 5935/2255/2817 4900/2257/2817 -f 5936/2255/2818 4901/2258/2818 4900/2257/2818 -f 5937/2255/2819 5938/2256/2819 4901/2258/2819 -f 5939/2256/3 5940/2258/3 4902/2258/3 -f 5941/2256/2820 4903/2256/2820 4902/2258/2820 -f 5942/2258/2820 5943/2259/2820 5944/2260/2820 -f 5945/2258/2821 4904/2257/2821 4905/2259/2821 -f 4900/2257/2822 5946/2259/2822 5947/2259/2822 -f 5948/2257/2823 4906/2257/2823 5949/2259/2823 -f 5950/2257/2824 4907/2260/2824 5951/2259/2824 -f 5952/2257/2824 5953/2258/2824 4907/2260/2824 -f 5954/2258/331 4908/2260/331 4909/2260/331 -f 5955/2258/2825 5956/2258/2825 4908/2260/2825 -f 5957/2260/2826 4910/2261/2826 5958/2262/2826 -f 5959/2260/2826 5960/2259/2826 4910/2261/2826 -f 5961/2259/2827 4911/2261/2827 4910/2261/2827 -f 5962/2259/2828 5963/2259/2828 4911/2261/2828 -f 5964/2259/2829 5965/2262/2829 4911/2261/2829 -f 5966/2259/2829 4907/2260/2829 5967/2262/2829 -f 4909/2260/331 4912/2262/331 4913/2262/331 -f 4909/2260/331 4908/2260/331 4912/2262/331 -f 5968/2262/2830 4914/2263/2830 5969/2264/2830 -f 5970/2262/2830 4910/2261/2830 4914/2263/2830 -f 4910/2261/2831 4915/2263/2831 4914/2263/2831 -f 4910/2261/2832 4911/2261/2832 4915/2263/2832 -f 4911/2261/2833 5971/2264/2833 4915/2263/2833 -f 4911/2261/2833 5972/2262/2833 5973/2264/2833 -f 4913/2262/331 4916/2264/331 4917/2264/331 -f 4913/2262/331 4912/2262/331 4916/2264/331 -f 5974/2264/2834 4918/2265/2834 5975/2266/2834 -f 5976/2264/2834 4914/2263/2834 4918/2265/2834 -f 4914/2263/2835 4919/2265/2835 4918/2265/2835 -f 4914/2263/2836 4915/2263/2836 4919/2265/2836 -f 4915/2263/2837 5977/2266/2837 4919/2265/2837 -f 4915/2263/2837 5978/2264/2837 5979/2266/2837 -f 4917/2264/2838 4920/2266/2838 4921/2266/2838 -f 4917/2264/2839 4916/2264/2839 4920/2266/2839 -f 5980/2266/2840 4922/2267/2840 5981/2268/2840 -f 5982/2266/2840 4918/2265/2840 4922/2267/2840 -f 4918/2265/2841 4923/2267/2841 4922/2267/2841 -f 4918/2265/2842 4919/2265/2842 4923/2267/2842 -f 4919/2265/2843 5983/2268/2843 4923/2267/2843 -f 4919/2265/2844 5984/2266/2844 5985/2268/2844 -f 4921/2266/2845 4924/2268/2845 4925/2268/2845 -f 4921/2266/2845 4920/2266/2845 4924/2268/2845 -f 5986/2268/2846 4926/2214/2846 5987/2215/2846 -f 5988/2268/2846 4922/2267/2846 4926/2214/2846 -f 4922/2267/2841 4927/2267/2841 5989/2269/2841 -f 4922/2267/2841 5990/2216/2841 5991/2269/2841 -f 4923/2267/2847 4925/2268/2847 5992/2216/2847 -f 5993/2268/2848 5994/2268/2848 5995/2215/2848 -f 5996/2217/331 4928/2218/331 4929/2219/331 -f 5997/2224/331 5998/2218/331 5999/2217/331 -f 6000/2221/2849 4930/2224/2849 6001/2222/2849 -f 6002/2218/2849 6003/2221/2849 6004/2223/2849 -f 6005/2217/2850 4931/2221/2850 6006/2222/2850 -f 6007/2221/2851 6008/2219/2851 6009/2223/2851 -f 6010/2222/2852 6011/2224/2852 6012/2222/2852 -f 6013/2222/2853 6014/2224/2853 6015/2217/2853 -f 4928/2218/2854 4932/2223/2854 4933/2219/2854 -f 6016/2219/2854 6017/2223/2854 4932/2223/2854 -f 6018/2215/2855 4934/2176/2855 4935/2270/2855 -f 6019/2214/2856 6020/2271/2856 6021/2271/2856 -f 4934/2176/331 4936/2214/331 4937/2271/331 -f 6022/2272/331 6023/2216/331 6024/2270/331 -f 6025/2269/2857 4938/2272/2857 6026/2271/2857 -f 6027/2272/2857 6028/2216/2857 6029/2270/2857 -f 6030/2214/2858 4939/2272/2858 6031/2271/2858 -f 6032/2273/2859 6033/2274/2859 6034/2275/2859 -f 6035/2273/2859 6036/2276/2859 6037/2274/2859 -f 6038/2273/2860 4940/2277/2860 4941/2276/2860 -f 6039/2273/2860 6040/2278/2860 4940/2277/2860 -f 6041/2273/2861 4942/2279/2861 6042/2278/2861 -f 6043/2273/2862 6044/2280/2862 4942/2279/2862 -f 6045/2273/3 4943/2281/3 6046/2280/3 -f 6047/2273/3 6048/2282/3 4943/2281/3 -f 6049/2273/2863 6050/2283/2863 6051/2282/2863 -f 6052/2273/2864 6053/2275/2864 6054/2283/2864 -f 6055/2284/2865 4944/2285/2865 4945/2286/2865 -f 6056/2284/2860 6057/2286/2860 6058/2287/2860 -f 6059/2284/2866 4946/2287/2866 6060/2288/2866 -f 6061/2284/2867 6062/2288/2867 6063/2289/2867 -f 6064/2284/2868 4947/2289/2868 6065/2290/2868 -f 6066/2284/3 6067/2290/3 6068/2291/3 -f 6069/2284/2869 6070/2291/2869 6071/2292/2869 -f 6072/2284/2869 6073/2292/2869 6074/2293/2869 -f 6075/2284/331 4948/2293/331 4949/2294/331 -f 6076/2284/331 6077/2294/331 6078/2285/331 -f 6079/2285/2870 4950/2286/2870 6080/2285/2870 -f 6081/2286/2870 6082/2286/2870 6083/2285/2870 -f 6084/2286/2871 4951/2286/2871 6085/2287/2871 -f 6086/2287/2872 6087/2287/2872 4951/2286/2872 -f 6088/2287/2873 6089/2287/2873 6090/2288/2873 -f 6091/2288/2873 6092/2288/2873 6093/2287/2873 -f 6094/2288/331 4952/2288/331 4953/2289/331 -f 6095/2289/331 6096/2289/331 4952/2288/331 -f 6097/2289/2874 4954/2289/2874 6098/2290/2874 -f 6099/2289/2874 6100/2290/2874 6101/2290/2874 -f 6102/2290/2776 4955/2290/2776 6103/2291/2776 -f 6104/2291/2875 6105/2291/2875 4955/2290/2875 -f 6106/2291/2876 6107/2291/2876 6108/2292/2876 -f 6109/2292/2876 6110/2292/2876 6111/2291/2876 -f 6112/2292/2877 4956/2292/2877 4957/2293/2877 -f 6113/2293/2878 6114/2293/2878 4956/2292/2878 -f 6115/2293/2879 4958/2293/2879 6116/2294/2879 -f 6117/2294/2880 6118/2294/2880 4958/2293/2880 -f 6119/2294/3 4959/2294/3 6120/2285/3 -f 6121/2294/3 6122/2285/3 6123/2285/3 -f 6124/2295/2881 6125/2296/2881 6126/2297/2881 -f 6127/2295/2881 6128/2297/2881 6129/2298/2881 -f 6130/2295/2882 4960/2298/2882 4961/2299/2882 -f 6131/2295/2883 6132/2299/2883 6133/2300/2883 -f 6134/2295/2884 4962/2300/2884 6135/2301/2884 -f 6136/2295/2885 6137/2301/2885 6138/2302/2885 -f 6139/2295/3 4963/2302/3 6140/2303/3 -f 6141/2295/3 6142/2303/3 6143/2304/3 -f 6144/2295/2886 6145/2304/2886 6146/2305/2886 -f 6147/2295/2886 6148/2305/2886 6149/2296/2886 -f 6150/2296/2887 4964/2297/2887 4965/2296/2887 -f 6151/2297/2887 6152/2297/2887 6153/2296/2887 -f 6154/2297/2888 4966/2297/2888 4967/2298/2888 -f 6155/2298/2888 6156/2298/2888 4966/2297/2888 -f 6157/2298/2889 4968/2298/2889 4969/2299/2889 -f 6158/2299/2889 6159/2299/2889 4968/2298/2889 -f 6160/2299/2890 4970/2299/2890 6161/2300/2890 -f 6162/2300/2890 6163/2300/2890 4970/2299/2890 -f 6164/2300/2891 4971/2300/2891 6165/2301/2891 -f 6166/2301/2891 6167/2301/2891 4971/2300/2891 -f 6168/2301/2892 6169/2301/2892 6170/2302/2892 -f 6171/2302/2893 6172/2302/2893 6173/2301/2893 -f 6174/2302/331 4972/2302/331 4973/2303/331 -f 6175/2303/331 6176/2303/331 4972/2302/331 -f 6177/2303/2894 4974/2303/2894 6178/2304/2894 -f 6179/2304/2894 6180/2304/2894 6181/2305/2894 -f 6182/2303/2895 4975/2304/2895 6183/2304/2895 -f 6184/2304/3 6185/2305/3 6186/2305/3 -f 6187/2305/2896 6188/2305/2896 6189/2296/2896 -f 6190/2305/2897 6191/2296/2897 6192/2296/2897 -f 6193/2306/331 4976/2307/331 4977/2308/331 -f 6194/2306/331 6195/2308/331 6196/2309/331 -f 6197/2306/2898 4978/2309/2898 6198/2310/2898 -f 6199/2306/2898 6200/2310/2898 6201/2311/2898 -f 6202/2306/3 4979/2311/3 6203/2312/3 -f 6204/2306/2899 6205/2312/2899 6206/2313/2899 -f 6207/2306/2900 6208/2313/2900 6209/2314/2900 -f 6210/2306/2900 6211/2314/2900 6212/2315/2900 -f 6213/2306/331 4980/2315/331 4981/2316/331 -f 6214/2306/331 6215/2316/331 6216/2307/331 -f 4976/2307/2901 4982/2308/2901 6217/2307/2901 -f 6218/2308/2901 6219/2308/2901 6220/2307/2901 -f 6221/2308/2902 4983/2308/2902 6222/2309/2902 -f 4978/2309/2903 6223/2309/2903 4983/2308/2903 -f 6224/2309/2904 6225/2309/2904 6226/2310/2904 -f 6227/2310/2904 6228/2310/2904 6229/2309/2904 -f 6230/2310/2905 4984/2310/2905 4985/2311/2905 -f 6231/2311/2906 6232/2311/2906 4984/2310/2906 -f 6233/2311/2907 4986/2311/2907 6234/2312/2907 -f 6235/2312/2907 6236/2312/2907 4986/2311/2907 -f 6237/2312/3 4987/2312/3 6238/2313/3 -f 6239/2313/3 6240/2313/3 6241/2314/3 -f 6242/2312/2908 6243/2313/2908 6244/2313/2908 -f 6245/2314/2908 6246/2314/2908 6247/2315/2908 -f 6248/2313/2909 4988/2314/2909 4989/2314/2909 -f 6249/2315/2909 6250/2315/2909 4988/2314/2909 -f 6251/2315/2910 4990/2315/2910 6252/2316/2910 -f 6253/2316/2910 6254/2316/2910 6255/2307/2910 -f 6256/2315/3 4991/2316/3 6257/2316/3 -f 6258/2316/3 6259/2307/3 6260/2307/3 -f 6261/2317/2911 6262/2318/2911 6263/2319/2911 -f 6264/2317/2911 6265/2319/2911 6266/2320/2911 -f 6267/2317/2912 4992/2320/2912 4993/2321/2912 -f 6268/2317/2912 6269/2321/2912 6270/2322/2912 -f 6271/2317/2913 4994/2322/2913 6272/2323/2913 -f 6273/2317/2914 6274/2323/2914 6275/2324/2914 -f 6276/2317/2915 4995/2324/2915 6277/2325/2915 -f 6278/2317/2916 6279/2325/2916 6280/2326/2916 -f 6281/2317/2917 6282/2326/2917 6283/2327/2917 -f 6284/2317/2917 6285/2327/2917 6286/2318/2917 -f 6287/2318/331 4996/2319/331 4997/2318/331 -f 6288/2319/2918 6289/2319/2918 6290/2318/2918 -f 6291/2319/2919 4998/2319/2919 6292/2320/2919 -f 6293/2320/2920 6294/2320/2920 4998/2319/2920 -f 6295/2320/2921 4999/2320/2921 6296/2321/2921 -f 6297/2321/2921 6298/2321/2921 6299/2322/2921 -f 6300/2320/2922 6301/2321/2922 6302/2321/2922 -f 6303/2322/2922 6304/2322/2922 6305/2321/2922 -f 6306/2322/331 5000/2322/331 5001/2323/331 -f 6307/2323/331 6308/2323/331 5000/2322/331 -f 6309/2323/2923 5002/2323/2923 6310/2324/2923 -f 6311/2324/2924 6312/2324/2924 5002/2323/2924 -f 6313/2324/2925 5003/2324/2925 6314/2325/2925 -f 6315/2325/2926 6316/2325/2926 5003/2324/2926 -f 6317/2325/2927 6318/2325/2927 6319/2326/2927 -f 6320/2326/2927 6321/2326/2927 6322/2325/2927 -f 6323/2326/2928 5004/2326/2928 5005/2327/2928 -f 6324/2327/2929 6325/2327/2929 6326/2318/2929 -f 6327/2326/2930 5006/2327/2930 5007/2327/2930 -f 6328/2318/2930 6329/2327/2930 6330/2318/2930 -f 6331/2328/331 5008/2329/331 5009/2330/331 -f 6332/2328/331 6333/2330/331 6334/2331/331 -f 6335/2328/2931 5010/2331/2931 6336/2332/2931 -f 6337/2328/2932 6338/2332/2932 6339/2333/2932 -f 6340/2328/3 5011/2333/3 6341/2334/3 -f 6342/2328/3 6343/2334/3 6344/2335/3 -f 6345/2328/2933 6346/2335/2933 6347/2336/2933 -f 6348/2328/2933 6349/2336/2933 6350/2337/2933 -f 6351/2328/331 5012/2337/331 5013/2338/331 -f 6352/2328/331 6353/2338/331 6354/2329/331 -f 5008/2329/2934 5014/2330/2934 6355/2329/2934 -f 6356/2330/2934 6357/2330/2934 6358/2329/2934 -f 6359/2330/3 5015/2330/3 6360/2331/3 -f 5010/2331/3 6361/2331/3 5015/2330/3 -f 6362/2331/2935 6363/2331/2935 6364/2332/2935 -f 6365/2332/2936 6366/2332/2936 6367/2331/2936 -f 6368/2332/331 5016/2332/331 5017/2333/331 -f 6369/2333/331 6370/2333/331 5016/2332/331 -f 6371/2333/2937 5018/2333/2937 6372/2334/2937 -f 6373/2334/2937 6374/2334/2937 5018/2333/2937 -f 6375/2334/3 5019/2334/3 6376/2335/3 -f 6377/2335/3 6378/2335/3 5019/2334/3 -f 6379/2335/2938 6380/2335/2938 6381/2336/2938 -f 6382/2336/2939 6383/2336/2939 6384/2335/2939 -f 6385/2336/866 5020/2336/866 5021/2337/866 -f 6386/2337/866 6387/2337/866 6388/2338/866 -f 6389/2336/2940 5022/2337/2940 6390/2337/2940 -f 6391/2338/2940 6392/2338/2940 6393/2329/2940 -f 6394/2337/2941 5023/2338/2941 6395/2338/2941 -f 6396/2338/2941 6397/2329/2941 6398/2329/2941 -f 6399/2339/2942 6400/2340/2942 6401/2341/2942 -f 6402/2339/2942 6403/2341/2942 6404/2342/2942 -f 6405/2339/2943 5024/2342/2943 5025/2343/2943 -f 6406/2339/2944 6407/2343/2944 6408/2344/2944 -f 6409/2339/2945 5026/2344/2945 6410/2345/2945 -f 6411/2339/2945 6412/2345/2945 6413/2346/2945 -f 6414/2339/2946 5027/2346/2946 6415/2347/2946 -f 6416/2339/2941 6417/2347/2941 6418/2348/2941 -f 6419/2339/2947 6420/2348/2947 6421/2349/2947 -f 6422/2339/2947 6423/2349/2947 6424/2340/2947 -f 6425/2340/862 5028/2341/862 5029/2340/862 -f 6426/2341/331 6427/2341/331 6428/2340/331 -f 6429/2341/2948 5030/2341/2948 6430/2342/2948 -f 5024/2342/2948 6431/2342/2948 5030/2341/2948 -f 6432/2342/2949 6433/2342/2949 5031/2343/2949 -f 6434/2343/2949 5025/2343/2949 6435/2342/2949 -f 6436/2343/2950 5032/2343/2950 5033/2344/2950 -f 6437/2344/2951 6438/2344/2951 5032/2343/2951 -f 6439/2344/2952 5034/2344/2952 6440/2345/2952 -f 6441/2345/2952 6442/2345/2952 5034/2344/2952 -f 6443/2345/3 5035/2345/3 6444/2346/3 -f 6445/2346/2953 6446/2346/2953 5035/2345/2953 -f 6447/2346/2953 6448/2346/2953 6449/2347/2953 -f 6450/2347/331 5036/2347/331 5037/2348/331 -f 6451/2347/331 6452/2347/331 6453/2346/331 -f 6454/2348/2954 5038/2348/2954 5036/2347/2954 -f 6455/2348/2954 6456/2348/2954 6457/2349/2954 -f 6458/2349/3 5039/2349/3 5038/2348/3 -f 6459/2349/3 6460/2349/3 6461/2340/3 -f 6462/2340/2955 6463/2349/2955 6464/2340/2955 -f 6465/2350/2955 6466/2350/2955 6467/2351/2955 -f 6468/2350/331 5040/2350/331 5041/2352/331 -f 6469/2352/331 6470/2352/331 6471/2350/331 -f 6472/2352/2956 5042/2352/2956 6473/2353/2956 -f 6474/2353/2956 6475/2353/2956 6476/2352/2956 -f 6477/2353/3 5043/2353/3 6478/2354/3 -f 6479/2354/3 6480/2354/3 5043/2353/3 -f 6481/2354/2957 6482/2354/2957 6483/2355/2957 -f 6484/2355/2957 6485/2355/2957 6486/2354/2957 -f 6487/2355/331 5044/2355/331 5045/2356/331 -f 6488/2356/331 6489/2356/331 6490/2355/331 -f 6491/2356/21 5046/2356/21 6492/2357/21 -f 6493/2357/21 6494/2357/21 5046/2356/21 -f 6495/2357/3 5047/2357/3 6496/2358/3 -f 6497/2358/3 6498/2358/3 5047/2357/3 -f 6499/2358/2958 6500/2358/2958 6501/2359/2958 -f 6502/2359/2958 6503/2359/2958 6504/2358/2958 -f 6505/2359/2950 5048/2359/2950 5049/2351/2950 -f 6506/2351/2950 6507/2351/2950 5048/2359/2950 -f 6508/2351/21 5050/2351/21 6509/2350/21 -f 6510/2360/21 6511/2360/21 6512/2361/21 -f 6513/2360/3 5051/2360/3 6514/2362/3 -f 6515/2362/3 6516/2362/3 5051/2360/3 -f 6517/2362/2959 6518/2362/2959 6519/2363/2959 -f 6520/2363/2959 6521/2363/2959 6522/2362/2959 -f 6523/2363/331 5052/2363/331 5053/2364/331 -f 6524/2364/331 6525/2364/331 6526/2363/331 -f 6527/2364/2757 5054/2364/2757 6528/2365/2757 -f 6529/2365/2757 6530/2365/2757 5054/2364/2757 -f 6531/2365/3 5055/2365/3 6532/2366/3 -f 6533/2366/3 6534/2366/3 5055/2365/3 -f 6535/2366/2960 6536/2366/2960 6537/2367/2960 -f 6538/2367/2961 6539/2367/2961 6540/2366/2961 -f 6541/2367/331 5056/2367/331 5057/2368/331 -f 6542/2368/331 6543/2368/331 5056/2367/331 -f 6544/2368/2962 5058/2368/2962 6545/2369/2962 -f 6546/2369/2962 6547/2369/2962 5058/2368/2962 -f 6548/2369/2963 5059/2369/2963 6549/2361/2963 -f 6550/2361/2963 6551/2361/2963 6552/2369/2963 -f 6553/2361/2964 6554/2361/2964 6555/2360/2964 -f 6556/2370/2965 6557/2370/2965 6558/2371/2965 -f 6559/2370/331 5060/2370/331 5061/2372/331 -f 6560/2372/331 6561/2372/331 5060/2370/331 -f 6562/2372/2962 5062/2372/2962 6563/2373/2962 -f 6564/2373/2962 6565/2374/2962 5062/2372/2962 -f 6566/2374/3 5063/2373/3 6567/2375/3 -f 6568/2375/3 6569/2375/3 6570/2374/3 -f 6571/2375/2966 6572/2375/2966 6573/2376/2966 -f 6574/2376/2966 6575/2376/2966 6576/2375/2966 -f 6577/2376/331 5064/2376/331 5065/2377/331 -f 6578/2377/331 6579/2377/331 5064/2376/331 -f 6580/2377/2967 5066/2377/2967 6581/2378/2967 -f 6582/2378/2967 6583/2378/2967 5066/2377/2967 -f 6584/2378/3 5067/2378/3 6585/2379/3 -f 6586/2379/3 6587/2379/3 5067/2378/3 -f 6588/2379/2968 6589/2379/2968 6590/2380/2968 -f 6591/2380/2968 6592/2381/2968 6593/2379/2968 -f 6594/2371/331 5068/2380/331 5069/2371/331 -f 6595/2371/331 6596/2381/331 5068/2380/331 -f 6597/2371/2969 5070/2371/2969 6598/2370/2969 -f 6599/2382/2969 6600/2382/2969 6601/2383/2969 -f 6602/2382/3 5071/2382/3 6603/2384/3 -f 6604/2384/3 6605/2384/3 5071/2382/3 -f 6606/2384/2970 6607/2384/2970 6608/2385/2970 -f 6609/2385/2971 6610/2385/2971 6611/2384/2971 -f 6612/2385/331 5072/2385/331 5073/2386/331 -f 6613/2386/331 6614/2386/331 5072/2385/331 -f 6615/2386/2972 5074/2386/2972 6616/2387/2972 -f 6617/2387/2972 6618/2387/2972 5074/2386/2972 -f 6619/2387/3 5075/2387/3 6620/2388/3 -f 6621/2388/3 6622/2388/3 5075/2387/3 -f 6623/2389/2973 6624/2388/2973 6625/2388/2973 -f 6626/2389/2974 6627/2388/2974 6628/2389/2974 -f 6629/2389/2951 5076/2389/2951 5077/2390/2951 -f 6630/2390/2975 6631/2390/2975 5076/2389/2975 -f 6632/2390/2976 5078/2390/2976 6633/2391/2976 -f 6634/2391/2976 6635/2391/2976 5078/2390/2976 -f 6636/2391/3 5079/2391/3 6637/2383/3 -f 6638/2383/3 6639/2383/3 5079/2391/3 -f 6640/2383/2977 6641/2383/2977 6642/2382/2977 -f 6643/2392/2978 6644/2392/2978 6645/2393/2978 -f 6646/2392/63 6647/2392/63 6648/2394/63 -f 6649/2394/63 6650/2394/63 6651/2392/63 -f 6652/2394/2979 6653/2394/2979 6654/2395/2979 -f 6655/2395/2980 6656/2395/2980 6657/2394/2980 -f 6658/2395/3 6659/2395/3 4778/2396/3 -f 6660/2396/2981 6661/2396/2981 4779/2395/2981 -f 6662/2396/2982 6663/2396/2982 4780/2397/2982 -f 6664/2397/2983 6665/2397/2983 6666/2396/2983 -f 4781/2397/3 6667/2397/3 6668/2398/3 -f 6669/2398/3 6670/2398/3 4782/2397/3 -f 6671/2398/2984 6672/2398/2984 6673/2399/2984 -f 6674/2399/2985 6675/2399/2985 4783/2398/2985 -f 6676/2399/2986 6677/2399/2986 6678/2400/2986 -f 6679/2400/2987 6680/2400/2987 4784/2399/2987 -f 6681/2400/3 6682/2400/3 4785/2401/3 -f 6683/2401/2988 6684/2401/2988 6685/2400/2988 -f 6686/2401/3 4785/2401/3 4786/2393/3 -f 6687/2393/3 4786/2393/3 4787/2401/3 -f 6688/2393/3 6689/2393/3 6690/2392/3 -f 6691/2285/3 6692/2285/3 4768/2294/3 -f 6693/2285/3 6694/2285/3 4769/2286/3 -f 6695/2286/3 4769/2286/3 4770/2285/3 -f 6696/2286/3 6697/2286/3 4771/2287/3 -f 6698/2287/3 6699/2287/3 6700/2286/3 -f 6701/2287/3 4771/2287/3 4772/2288/3 -f 6702/2288/3 6703/2288/3 4773/2287/3 -f 6704/2288/3 4772/2288/3 6705/2289/3 -f 6706/2289/3 6707/2289/3 4774/2288/3 -f 6708/2289/3 6709/2289/3 4775/2290/3 -f 6710/2290/3 6711/2290/3 4776/2289/3 -f 6712/2290/3 4775/2290/3 6713/2291/3 -f 6714/2291/3 6715/2291/3 4777/2290/3 -f 6716/2291/3 6717/2291/3 6718/2292/3 -f 6719/2292/3 6720/2292/3 4758/2291/3 -f 6721/2292/2989 6722/2292/2989 4759/2293/2989 -f 6723/2293/3 6724/2293/3 6725/2292/3 -f 6726/2293/2990 4759/2293/2990 4760/2294/2990 -f 6727/2294/2991 6728/2294/2991 6729/2293/2991 -f 6730/2294/2992 4760/2294/2992 4761/2285/2992 -f 6731/2402/2993 6732/2402/2993 4762/2403/2993 -f 6733/2402/2994 6734/2402/2994 4763/2404/2994 -f 6735/2404/2995 6736/2404/2995 4764/2402/2995 -f 6737/2404/2996 4763/2404/2996 6738/2405/2996 -f 6739/2405/3 6740/2405/3 4765/2404/3 -f 6741/2406/3 6742/2405/3 4766/2405/3 -f 6743/2406/3 4766/2405/3 4767/2406/3 -f 6744/2406/3 6745/2406/3 6746/2407/3 -f 6747/2407/3 6748/2407/3 4748/2406/3 -f 6749/2407/3 6750/2407/3 6751/2408/3 -f 6752/2408/3 6753/2408/3 4749/2407/3 -f 6754/2408/3 6755/2408/3 4750/2409/3 -f 6756/2409/3 4750/2409/3 4751/2408/3 -f 6757/2409/3 6758/2409/3 4752/2410/3 -f 6759/2410/3 6760/2410/3 4753/2409/3 -f 6761/2410/3 4752/2410/3 6762/2411/3 -f 4754/2411/3 6763/2411/3 6764/2410/3 -f 6765/2411/3 4754/2411/3 4755/2403/3 -f 6766/2403/2206 6767/2403/2206 6768/2411/2206 -f 6769/2403/2206 6770/2403/2206 4756/2402/2206 -f 6771/2412/2997 6772/2413/2997 6773/2414/2997 -f 6774/2412/3 6775/2415/3 4757/2413/3 -f 6776/2415/3 6777/2413/3 4757/2413/3 -f 6778/2415/3 4738/2415/3 4739/2413/3 -f 6779/2415/3 6780/2414/3 4740/2413/3 -f 6781/2415/3 6782/2412/3 6783/2414/3 -f 6784/2412/3 6785/2414/3 4741/2414/3 -f 6786/2412/2998 6787/2412/2998 4742/2414/2998 -f 6788/2414/3 6789/2416/3 6790/2417/3 -f 6791/2414/2999 6792/2413/2999 4743/2416/2999 -f 6793/2413/3000 4743/2416/3000 4744/2416/3000 -f 6794/2413/3001 6795/2413/3001 4745/2416/3001 -f 6796/2413/3002 6797/2417/3002 4745/2416/3002 -f 6798/2413/3 6799/2414/3 4746/2417/3 -f 4747/2414/3 6800/2417/3 4746/2417/3 -f 6801/2414/3 6802/2414/3 6803/2417/3 -f 6804/2417/3 6805/2418/3 6806/2419/3 -f 6807/2417/3 6808/2416/3 4729/2418/3 -f 6809/2416/3 4728/2418/3 4729/2418/3 -f 6810/2416/3 6811/2416/3 4730/2418/3 -f 6812/2416/3 6813/2419/3 4731/2418/3 -f 6814/2416/3 6815/2417/3 6816/2419/3 -f 6817/2417/3 6818/2419/3 4732/2419/3 -f 6819/2417/3 6820/2417/3 4733/2419/3 -f 6821/2419/3003 6822/2420/3003 4734/2421/3003 -f 6823/2419/3 6824/2418/3 6825/2420/3 -f 6826/2418/3004 6827/2420/3004 4735/2420/3004 -f 6828/2418/3005 6829/2418/3005 4735/2420/3005 -f 6830/2418/3 6831/2421/3 4736/2420/3 -f 6832/2418/3 6833/2419/3 4737/2421/3 -f 6834/2419/3 6835/2421/3 4737/2421/3 -f 6836/2419/2759 6837/2419/2759 4718/2421/2759 -f 6838/2421/3006 6839/2422/3006 4719/2423/3006 -f 6840/2421/3 6841/2420/3 6842/2422/3 -f 6843/2420/3 6844/2422/3 4720/2422/3 -f 6845/2420/3 6846/2420/3 4721/2422/3 -f 6847/2420/3 6848/2423/3 4722/2422/3 -f 6849/2420/3007 6850/2421/3007 4723/2423/3007 -f 6851/2421/3008 6852/2423/3008 4723/2423/3008 -f 6853/2421/3 6854/2421/3 4724/2423/3 -f 6855/2423/3 6856/2424/3 4725/2425/3 -f 6857/2423/3 6858/2422/3 6859/2424/3 -f 6860/2422/3009 6861/2424/3009 4727/2424/3009 -f 6862/2422/3 6863/2422/3 4726/2424/3 -f 6864/2422/3010 6865/2426/3010 4727/2424/3010 -f 6866/2422/331 6867/2423/331 4708/2426/331 -f 6868/2423/331 6869/2425/331 4709/2426/331 -f 6870/2423/331 6871/2423/331 6872/2425/331 -f 6873/2425/331 6874/2427/331 4710/2428/331 -f 6875/2425/331 6876/2424/331 4711/2427/331 -f 6877/2424/331 6878/2427/331 4712/2427/331 -f 6879/2424/331 6880/2424/331 4713/2427/331 -f 6881/2424/331 6882/2428/331 4713/2427/331 -f 6883/2424/331 6884/2426/331 4714/2428/331 -f 6885/2426/331 6886/2428/331 4714/2428/331 -f 6887/2426/331 6888/2425/331 4715/2428/331 -f 4715/2428/331 6889/2429/331 6890/2430/331 -f 4715/2428/331 6891/2427/331 4716/2429/331 -f 6892/2427/331 6893/2429/331 4717/2429/331 -f 6894/2427/331 6895/2427/331 6896/2429/331 -f 6897/2427/331 6898/2430/331 4688/2429/331 -f 6899/2427/3011 6900/2428/3011 4689/2430/3011 -f 6901/2428/331 6902/2430/331 4689/2430/331 -f 6903/2428/3012 6904/2428/3012 4690/2430/3012 -f 4690/2430/3013 6905/2431/3013 4691/2432/3013 -f 6906/2430/3014 6907/2429/3014 4692/2431/3014 -f 6908/2429/3015 6909/2431/3015 4692/2431/3015 -f 6910/2429/3016 6911/2429/3016 4693/2431/3016 -f 6912/2429/3017 6913/2432/3017 4694/2431/3017 -f 6914/2429/3018 6915/2430/3018 6916/2432/3018 -f 6917/2430/331 6918/2432/331 4695/2432/331 -f 6919/2430/331 6920/2430/331 4696/2432/331 -f 4696/2432/331 6921/2433/331 4697/2434/331 -f 6922/2432/331 6923/2431/331 6924/2433/331 -f 4668/2431/331 6925/2433/331 4669/2433/331 -f 6926/2431/3019 6927/2431/3019 4670/2433/3019 -f 6928/2431/3020 6929/2434/3020 4670/2433/3020 -f 6930/2431/331 6931/2432/331 4671/2434/331 -f 6932/2432/331 6933/2434/331 6934/2434/331 -f 6935/2432/331 6936/2432/331 4672/2434/331 -f 4672/2434/331 6937/2435/331 4673/2436/331 -f 6938/2434/331 6939/2433/331 4674/2435/331 -f 6940/2433/331 6941/2435/331 4675/2435/331 -f 6942/2433/3021 6943/2433/3021 4676/2435/3021 -f 6944/2433/3022 6945/2436/3022 4676/2435/3022 -f 6946/2433/331 6947/2434/331 6948/2436/331 -f 4677/2434/3023 6949/2436/3023 6950/2436/3023 -f 6951/2434/331 6952/2434/331 6953/2436/331 -f 6954/2436/3024 6955/2435/3024 6956/2437/3024 -f 6957/2435/3025 6958/2437/3025 4648/2437/3025 -f 6959/2435/3026 6960/2435/3026 4649/2437/3026 -f 6961/2436/866 6962/2438/866 4650/2438/866 -f 6963/2436/3027 6964/2436/3027 4651/2438/3027 -f 6965/2437/3028 6966/2439/3028 6967/2439/3028 -f 6968/2437/2767 6969/2437/2767 4652/2439/2767 -f 6970/2437/3029 6971/2440/3029 4653/2439/3029 -f 6972/2438/3030 6973/2440/3030 6974/2440/3030 -f 6975/2438/331 6976/2438/331 4654/2440/331 -f 4654/2440/331 6977/2441/331 4655/2442/331 -f 6978/2440/331 6979/2439/331 4656/2441/331 -f 6980/2439/331 6981/2441/331 4656/2441/331 -f 6982/2439/331 6983/2439/331 4657/2441/331 -f 6984/2439/331 6985/2442/331 6986/2441/331 -f 6987/2439/331 6988/2440/331 4628/2442/331 -f 6989/2440/3031 6990/2442/3031 4629/2442/3031 -f 6991/2440/331 6992/2440/331 4629/2442/331 -f 4630/2442/3032 6993/2441/3032 4631/2443/3032 -f 6994/2441/3033 6995/2443/3033 4632/2443/3033 -f 6996/2441/883 6997/2441/883 6998/2443/883 -f 6999/2441/3034 7000/2444/3034 4633/2443/3034 -f 7001/2441/3035 7002/2442/3035 4634/2444/3035 -f 7003/2442/3036 7004/2444/3036 4634/2444/3036 -f 7005/2442/331 7006/2442/331 4635/2444/331 -f 4635/2444/331 7007/2445/331 4636/2446/331 -f 7008/2444/331 7009/2443/331 4637/2445/331 -f 7010/2443/331 7011/2445/331 7012/2445/331 -f 4608/2443/3037 7013/2443/3037 4609/2445/3037 -f 7014/2443/3038 7015/2446/3038 4610/2445/3038 -f 7016/2443/3039 7017/2444/3039 7018/2446/3039 -f 7019/2444/3040 7020/2446/3040 4611/2446/3040 -f 7021/2444/3041 7022/2444/3041 7023/2446/3041 -f 7024/2446/331 7025/2447/331 4612/2448/331 -f 7026/2446/331 7027/2445/331 4613/2447/331 -f 7028/2445/331 7029/2447/331 4613/2447/331 -f 7030/2445/331 7031/2445/331 4614/2447/331 -f 7032/2445/331 7033/2448/331 4615/2447/331 -f 7034/2445/331 7035/2446/331 4616/2448/331 -f 7036/2446/3042 7037/2448/3042 4616/2448/3042 -f 7038/2446/3043 7039/2446/3043 4617/2448/3043 -f 4617/2448/3044 7040/2449/3044 7041/2450/3044 -f 5090/2451/3045 5091/2452/3045 5092/2453/3045 -f 7042/2452/3046 5093/2453/3046 7043/2453/3046 -f 7044/2452/3047 5094/2452/3047 7045/2453/3047 -f 7046/2452/3048 5095/2454/3048 7047/2453/3048 -f 7048/2452/3049 5096/2451/3049 7049/2454/3049 -f 7050/2451/3050 5097/2454/3050 7051/2454/3050 -f 7052/2451/3051 7053/2451/3051 7054/2454/3051 -f 5097/2454/3052 7055/2455/3052 7056/2456/3052 -f 7057/2454/3053 5098/2453/3053 5099/2455/3053 -f 5092/2453/3054 7058/2455/3054 7059/2455/3054 -f 7060/2453/3055 5100/2453/3055 7061/2455/3055 -f 7062/2453/3055 7063/2456/3055 7064/2455/3055 -f 7065/2453/3056 5101/2454/3056 7066/2456/3056 -f 7067/2454/3057 7068/2456/3057 7069/2456/3057 -f 7070/2454/3058 7071/2454/3058 7072/2456/3058 -f 7073/2456/3058 7074/2457/3058 7075/2458/3058 -f 7076/2456/3059 5102/2455/3059 5103/2457/3059 -f 5099/2455/3060 7077/2457/3060 7078/2457/3060 -f 7079/2455/3061 5104/2455/3061 7080/2457/3061 -f 7081/2455/3062 7082/2458/3062 7083/2457/3062 -f 7084/2455/3063 5105/2456/3063 7085/2458/3063 -f 7086/2456/3064 7087/2458/3064 7088/2458/3064 -f 7089/2456/3065 7090/2456/3065 7091/2458/3065 -f 7092/2458/3066 7093/2459/3066 7094/2460/3066 -f 7095/2458/3067 5106/2457/3067 5107/2459/3067 -f 5103/2457/3068 7096/2459/3068 7097/2459/3068 -f 7098/2457/3069 5108/2457/3069 7099/2459/3069 -f 7100/2457/3069 7101/2460/3069 7102/2459/3069 -f 7103/2457/3070 5109/2458/3070 7104/2460/3070 -f 7105/2458/3071 7106/2460/3071 7107/2460/3071 -f 7108/2458/3072 7109/2458/3072 7110/2460/3072 -f 7111/2460/3073 7112/2461/3073 7113/2462/3073 -f 7114/2460/3074 5110/2459/3074 5111/2461/3074 -f 5107/2459/3075 7115/2461/3075 7116/2461/3075 -f 7117/2459/3076 5112/2459/3076 7118/2461/3076 -f 7119/2459/3077 7120/2462/3077 7121/2461/3077 -f 7122/2459/3078 5113/2460/3078 7123/2462/3078 -f 7124/2460/3079 7125/2462/3079 7126/2462/3079 -f 7127/2460/3080 7128/2460/3080 7129/2462/3080 -f 7130/2462/3080 7131/2463/3080 7132/2464/3080 -f 7133/2462/3081 5114/2461/3081 5115/2463/3081 -f 5111/2461/3082 7134/2463/3082 7135/2463/3082 -f 7136/2461/3083 5116/2461/3083 7137/2463/3083 -f 7138/2461/3084 7139/2464/3084 7140/2463/3084 -f 7141/2461/3085 5117/2462/3085 7142/2464/3085 -f 7143/2462/3086 7144/2464/3086 7145/2464/3086 -f 7146/2462/3087 7147/2462/3087 7148/2464/3087 -f 7149/2464/3087 7150/2465/3087 7151/2466/3087 -f 7152/2464/3088 5118/2463/3088 5119/2465/3088 -f 5115/2463/3089 7153/2465/3089 7154/2465/3089 -f 7155/2463/3090 5120/2463/3090 7156/2465/3090 -f 7157/2463/3090 7158/2466/3090 7159/2465/3090 -f 7160/2463/3091 5121/2464/3091 7161/2466/3091 -f 7162/2464/3092 7163/2466/3092 7164/2466/3092 -f 7165/2464/3093 7166/2464/3093 7167/2466/3093 -f 7168/2466/3094 7169/2465/3094 7170/2467/3094 -f 5119/2465/3095 5122/2467/3095 5123/2467/3095 -f 5119/2465/3096 7171/2465/3096 5122/2467/3096 -f 7172/2465/3097 5124/2466/3097 7173/2468/3097 -f 7174/2466/3097 7175/2468/3097 7176/2468/3097 -f 7177/2466/3098 5125/2466/3098 7178/2468/3098 -f 7179/2467/3099 7180/2469/3099 7181/2469/3099 -f 7182/2467/3100 5123/2467/3100 7183/2469/3100 -f 7184/2467/3101 7185/2470/3101 7186/2469/3101 -f 7187/2468/3102 5126/2470/3102 5127/2470/3102 -f 7188/2468/3103 7189/2468/3103 5126/2470/3103 -f 7190/2470/3104 5128/2471/3104 7191/2472/3104 -f 7192/2470/3105 7193/2469/3105 5128/2471/3105 -f 7194/2469/3106 5129/2471/3106 5128/2471/3106 -f 7195/2469/3107 7196/2469/3107 5129/2471/3107 -f 7197/2469/3108 7198/2472/3108 5129/2471/3108 -f 7199/2469/3109 7200/2470/3109 7201/2472/3109 -f 5127/2470/3110 5130/2472/3110 5131/2472/3110 -f 5127/2470/3111 5126/2470/3111 5130/2472/3111 -f 7202/2472/3112 5132/2473/3112 7203/2474/3112 -f 7204/2472/3113 5128/2471/3113 5132/2473/3113 -f 5128/2471/3114 5133/2473/3114 5132/2473/3114 -f 5128/2471/3115 5129/2471/3115 5133/2473/3115 -f 5129/2471/3116 7205/2474/3116 5133/2473/3116 -f 5129/2471/3116 7206/2472/3116 7207/2474/3116 -f 5131/2472/3117 5134/2474/3117 5135/2474/3117 -f 5131/2472/3118 5130/2472/3118 5134/2474/3118 -f 7208/2474/3119 5136/2475/3119 7209/2476/3119 -f 7210/2474/3120 5132/2473/3120 5136/2475/3120 -f 5132/2473/3121 5137/2475/3121 5136/2475/3121 -f 5132/2473/3122 5133/2473/3122 5137/2475/3122 -f 5133/2473/3123 7211/2476/3123 5137/2475/3123 -f 5133/2473/3124 7212/2474/3124 7213/2476/3124 -f 5135/2474/3125 5138/2476/3125 5139/2476/3125 -f 5135/2474/3126 5134/2474/3126 5138/2476/3126 -f 7214/2476/3127 5140/2477/3127 7215/2478/3127 -f 7216/2476/3128 5136/2475/3128 5140/2477/3128 -f 5136/2475/3129 5141/2477/3129 5140/2477/3129 -f 5136/2475/3130 5137/2475/3130 5141/2477/3130 -f 5137/2475/3131 7217/2478/3131 5141/2477/3131 -f 5137/2475/3132 7218/2476/3132 7219/2478/3132 -f 5139/2476/3133 5142/2478/3133 5143/2478/3133 -f 5139/2476/3125 5138/2476/3125 5142/2478/3125 -f 7220/2478/3134 5144/2479/3134 7221/2480/3134 -f 7222/2478/3135 5140/2477/3135 5144/2479/3135 -f 5140/2477/3136 5145/2479/3136 5144/2479/3136 -f 5140/2477/3137 5141/2477/3137 5145/2479/3137 -f 5141/2477/3138 7223/2480/3138 5145/2479/3138 -f 5141/2477/3139 7224/2478/3139 7225/2480/3139 -f 5143/2478/3140 5146/2480/3140 5147/2480/3140 -f 5143/2478/3141 5142/2478/3141 5146/2480/3141 -f 7226/2480/3142 5148/2481/3142 7227/2482/3142 -f 7228/2480/3143 5144/2479/3143 5148/2481/3143 -f 5144/2479/3144 5149/2481/3144 5148/2481/3144 -f 5144/2479/3145 5145/2479/3145 5149/2481/3145 -f 5145/2479/3146 7229/2482/3146 5149/2481/3146 -f 5145/2479/3147 7230/2480/3147 7231/2482/3147 -f 5147/2480/3148 5150/2482/3148 5151/2482/3148 -f 5147/2480/3149 5146/2480/3149 5150/2482/3149 -f 7232/2481/3150 5152/2483/3150 7233/2483/3150 -f 7234/2481/3150 5148/2481/3150 5152/2483/3150 -f 7235/2482/3151 5153/2484/3151 7236/2484/3151 -f 7237/2482/3152 7238/2482/3152 5153/2484/3152 -f 7239/2484/3153 7240/2485/3153 7241/2486/3153 -f 7242/2484/3154 7243/2483/3154 7244/2485/3154 -f 7245/2483/3155 5154/2485/3155 5155/2485/3155 -f 7246/2483/3156 7247/2483/3156 5154/2485/3156 -f 7248/2483/3157 5156/2486/3157 5154/2485/3157 -f 7249/2484/3158 7250/2486/3158 5156/2486/3158 -f 7251/2484/3159 5157/2484/3159 5156/2486/3159 -f 7252/2486/3160 7253/2487/3160 7254/2488/3160 -f 7255/2486/3161 5155/2485/3161 7256/2487/3161 -f 7257/2485/3161 7258/2487/3161 7259/2487/3161 -f 5155/2485/3162 5158/2485/3162 5159/2487/3162 -f 5155/2485/3163 7260/2488/3163 7261/2487/3163 -f 5154/2485/3164 5160/2486/3164 7262/2488/3164 -f 7263/2486/3164 7264/2488/3164 7265/2488/3164 -f 5156/2486/3165 5161/2486/3165 7266/2488/3165 -f 7267/2488/3166 7268/2489/3166 7269/2490/3166 -f 7270/2488/3167 5159/2487/3167 7271/2489/3167 -f 7272/2487/3167 7273/2489/3167 7274/2489/3167 -f 5159/2487/3168 5162/2487/3168 5163/2489/3168 -f 5159/2487/3169 7275/2490/3169 7276/2489/3169 -f 7277/2487/3170 5164/2488/3170 7278/2490/3170 -f 7279/2488/3170 7280/2490/3170 7281/2490/3170 -f 7282/2488/3171 5165/2488/3171 7283/2490/3171 -f 7284/2490/3172 7285/2491/3172 7286/2492/3172 -f 7287/2490/3173 5163/2489/3173 7288/2491/3173 -f 7289/2489/3174 7290/2491/3174 7291/2491/3174 -f 5163/2489/3175 5166/2489/3175 5167/2491/3175 -f 5163/2489/3176 7292/2492/3176 7293/2491/3176 -f 7294/2489/3177 5168/2490/3177 7295/2492/3177 -f 7296/2490/3177 7297/2492/3177 7298/2492/3177 -f 7299/2490/3178 5169/2490/3178 7300/2492/3178 -f 7301/2492/3179 7302/2493/3179 7303/2494/3179 -f 7304/2492/3180 5167/2491/3180 7305/2493/3180 -f 7306/2491/3181 7307/2493/3181 7308/2493/3181 -f 5167/2491/3182 5170/2491/3182 5171/2493/3182 -f 5167/2491/3183 7309/2494/3183 7310/2493/3183 -f 7311/2491/3184 5172/2492/3184 7312/2494/3184 -f 7313/2492/3185 7314/2494/3185 7315/2494/3185 -f 7316/2492/3186 5173/2492/3186 7317/2494/3186 -f 7318/2494/3187 7319/2495/3187 7320/2496/3187 -f 7321/2494/3188 5171/2493/3188 7322/2495/3188 -f 7323/2493/3189 7324/2497/3189 7325/2495/3189 -f 5171/2493/3190 5174/2493/3190 5175/2497/3190 -f 5171/2493/3191 7326/2496/3191 7327/2497/3191 -f 7328/2493/3192 5176/2494/3192 7329/2496/3192 -f 7330/2494/3193 7331/2496/3193 7332/2496/3193 -f 7333/2494/3194 5177/2494/3194 7334/2496/3194 -f 7335/2496/3195 7336/2498/3195 7337/2499/3195 -f 7338/2496/3196 7339/2495/3196 7340/2498/3196 -f 7341/2495/3197 7342/2498/3197 7343/2498/3197 -f 7344/2495/3198 5178/2497/3198 5179/2498/3198 -f 5175/2497/3199 7345/2499/3199 7346/2498/3199 -f 7347/2497/3200 5180/2496/3200 7348/2499/3200 -f 7349/2496/3200 7350/2499/3200 7351/2499/3200 -f 7352/2496/3201 5181/2496/3201 7353/2499/3201 -f 7354/2498/3202 7355/2500/3202 7356/2500/3202 -f 7357/2498/3203 5179/2498/3203 7358/2500/3203 -f 7359/2499/3203 7360/2501/3203 7361/2501/3203 -f 7362/2499/3204 5182/2499/3204 5183/2501/3204 -f 7363/2501/3205 7364/2502/3205 7365/2503/3205 -f 7366/2501/3206 5184/2500/3206 7367/2502/3206 -f 7368/2500/3207 7369/2502/3207 7370/2502/3207 -f 7371/2500/3208 5185/2500/3208 7372/2502/3208 -f 7373/2500/3209 7374/2503/3209 7375/2502/3209 -f 7376/2500/3210 5183/2501/3210 7377/2503/3210 -f 7378/2501/3211 7379/2503/3211 7380/2503/3211 -f 5183/2501/3212 5186/2501/3212 5187/2503/3212 -f 7381/2503/3213 7382/2504/3213 7383/2505/3213 -f 7384/2503/3214 5188/2502/3214 7385/2504/3214 -f 7386/2502/3215 7387/2504/3215 7388/2504/3215 -f 7389/2502/3216 5189/2502/3216 7390/2504/3216 -f 7391/2502/3217 7392/2505/3217 7393/2504/3217 -f 7394/2502/3218 5187/2503/3218 7395/2505/3218 -f 7396/2503/3219 7397/2505/3219 7398/2505/3219 -f 5187/2503/3220 5190/2503/3220 5191/2505/3220 -f 7399/2505/3221 7400/2506/3221 7401/2507/3221 -f 7402/2505/3222 5192/2504/3222 7403/2506/3222 -f 7404/2504/3223 7405/2506/3223 7406/2506/3223 -f 7407/2504/3224 5193/2504/3224 7408/2506/3224 -f 7409/2504/3225 7410/2507/3225 7411/2506/3225 -f 7412/2504/3226 5191/2505/3226 7413/2507/3226 -f 7414/2505/3227 7415/2507/3227 7416/2507/3227 -f 5191/2505/3228 5194/2505/3228 5195/2507/3228 -f 7417/2507/3228 7418/2508/3228 7419/2509/3228 -f 7420/2507/3229 5196/2506/3229 7421/2508/3229 -f 7422/2506/3230 7423/2508/3230 7424/2508/3230 -f 7425/2506/3231 5197/2506/3231 7426/2508/3231 -f 7427/2506/3231 7428/2509/3231 7429/2508/3231 -f 7430/2506/3232 5195/2507/3232 7431/2509/3232 -f 7432/2507/3233 7433/2509/3233 7434/2509/3233 -f 5195/2507/3234 5198/2507/3234 5199/2509/3234 -f 7435/2509/3234 7436/2510/3234 7437/2511/3234 -f 7438/2509/3235 5200/2508/3235 7439/2510/3235 -f 7440/2508/3235 7441/2510/3235 7442/2510/3235 -f 7443/2508/3236 5201/2508/3236 7444/2510/3236 -f 7445/2508/3236 7446/2511/3236 7447/2510/3236 -f 7448/2508/3237 5199/2509/3237 7449/2511/3237 -f 7450/2509/3238 7451/2511/3238 7452/2511/3238 -f 5199/2509/3239 5202/2509/3239 5203/2511/3239 -f 7453/2511/3240 7454/2512/3240 7455/2513/3240 -f 7456/2511/3241 5204/2510/3241 7457/2512/3241 -f 7458/2510/3241 7459/2512/3241 7460/2512/3241 -f 7461/2510/3242 5205/2510/3242 7462/2512/3242 -f 7463/2510/3243 7464/2513/3243 7465/2512/3243 -f 7466/2510/3238 5203/2511/3238 7467/2513/3238 -f 7468/2511/3244 7469/2513/3244 7470/2513/3244 -f 5203/2511/3245 5206/2511/3245 5207/2513/3245 -f 7471/2513/3246 7472/2514/3246 7473/2515/3246 -f 7474/2513/3247 5208/2512/3247 7475/2514/3247 -f 7476/2512/3247 7477/2514/3247 7478/2514/3247 -f 7479/2512/3248 5209/2512/3248 7480/2514/3248 -f 7481/2512/3249 7482/2515/3249 7483/2514/3249 -f 7484/2512/3250 5207/2513/3250 7485/2515/3250 -f 7486/2513/3251 7487/2515/3251 7488/2515/3251 -f 5207/2513/3252 5210/2513/3252 5211/2515/3252 -f 7489/2515/3253 7490/2516/3253 7491/2517/3253 -f 7492/2515/3254 5212/2514/3254 7493/2516/3254 -f 7494/2514/3255 7495/2516/3255 7496/2516/3255 -f 7497/2514/3256 5213/2514/3256 7498/2516/3256 -f 7499/2514/3257 7500/2517/3257 7501/2516/3257 -f 7502/2514/3258 7503/2515/3258 7504/2517/3258 -f 7505/2515/3259 7506/2517/3259 7507/2517/3259 -f 7508/2515/3260 5214/2515/3260 5215/2517/3260 -f 7509/2517/3261 7510/2518/3261 7511/2519/3261 -f 7512/2517/3262 5216/2516/3262 7513/2518/3262 -f 7514/2516/3263 7515/2518/3263 7516/2518/3263 -f 7517/2516/3264 5217/2516/3264 7518/2518/3264 -f 7519/2516/3265 7520/2519/3265 7521/2518/3265 -f 7522/2516/3266 5215/2517/3266 7523/2519/3266 -f 7524/2517/3266 7525/2519/3266 7526/2519/3266 -f 5215/2517/3267 5218/2517/3267 5219/2519/3267 -f 7527/2518/3268 7528/2520/3268 7529/2520/3268 -f 7530/2518/3269 5220/2518/3269 7531/2520/3269 -f 7532/2519/3269 7533/2521/3269 7534/2521/3269 -f 7535/2519/3270 5221/2519/3270 7536/2521/3270 -f 7537/2521/3271 7538/2522/3271 7539/2523/3271 -f 7540/2521/3272 7541/2520/3272 7542/2522/3272 -f 7543/2520/3273 7544/2522/3273 7545/2522/3273 -f 7546/2520/3274 5222/2520/3274 5223/2522/3274 -f 7547/2520/3275 7548/2523/3275 7549/2522/3275 -f 7550/2520/3276 5224/2521/3276 7551/2523/3276 -f 7552/2521/3277 7553/2523/3277 7554/2523/3277 -f 7555/2521/3270 5225/2521/3270 7556/2523/3270 -f 7557/2523/3270 7558/2524/3270 7559/2525/3270 -f 7560/2523/3278 5223/2522/3278 7561/2524/3278 -f 7562/2522/3279 7563/2524/3279 7564/2524/3279 -f 5223/2522/3280 5226/2522/3280 5227/2524/3280 -f 5223/2522/3281 7565/2525/3281 7566/2524/3281 -f 7567/2522/3282 5228/2523/3282 7568/2525/3282 -f 7569/2523/3283 7570/2525/3283 7571/2525/3283 -f 7572/2523/3284 5229/2523/3284 7573/2525/3284 -f 7574/2525/3285 7575/2526/3285 7576/2527/3285 -f 7577/2525/3286 7578/2524/3286 7579/2526/3286 -f 7580/2524/3287 7581/2526/3287 7582/2526/3287 -f 7583/2524/3288 5230/2524/3288 5231/2526/3288 -f 5227/2524/3289 7584/2527/3289 7585/2526/3289 -f 7586/2524/3290 5232/2525/3290 7587/2527/3290 -f 7588/2525/3291 7589/2527/3291 7590/2527/3291 -f 7591/2525/3292 5233/2525/3292 7592/2527/3292 -f 7593/2527/3293 7594/2528/3293 7595/2529/3293 -f 7596/2527/3294 5231/2526/3294 7597/2528/3294 -f 7598/2526/3295 7599/2528/3295 7600/2528/3295 -f 5231/2526/3296 5234/2526/3296 5235/2528/3296 -f 5231/2526/3297 7601/2529/3297 7602/2528/3297 -f 7603/2526/3298 5236/2527/3298 7604/2529/3298 -f 7605/2527/3299 7606/2529/3299 7607/2529/3299 -f 7608/2527/3300 5237/2527/3300 7609/2529/3300 -f 7610/2529/3301 7611/2530/3301 7612/2531/3301 -f 7613/2529/3302 5235/2528/3302 7614/2530/3302 -f 7615/2528/3303 7616/2530/3303 7617/2530/3303 -f 5235/2528/3304 5238/2528/3304 5239/2530/3304 -f 5235/2528/3305 7618/2531/3305 7619/2530/3305 -f 7620/2528/3306 5240/2529/3306 7621/2531/3306 -f 7622/2529/3307 7623/2531/3307 7624/2531/3307 -f 7625/2529/3308 5241/2529/3308 7626/2531/3308 -f 7627/2531/3309 7628/2532/3309 7629/2533/3309 -f 7630/2531/3310 5239/2530/3310 7631/2532/3310 -f 7632/2530/3311 7633/2532/3311 7634/2532/3311 -f 5239/2530/3312 5242/2530/3312 5243/2532/3312 -f 7635/2531/3313 7636/2533/3313 7637/2533/3313 -f 7638/2531/3314 5244/2531/3314 7639/2533/3314 -f 7640/2533/3315 7641/2534/3315 7642/2535/3315 -f 7643/2533/3316 5245/2532/3316 7644/2534/3316 -f 7645/2532/3317 7646/2534/3317 7647/2534/3317 -f 7648/2532/3318 5243/2532/3318 7649/2534/3318 -f 7650/2532/3319 7651/2535/3319 7652/2534/3319 -f 7653/2533/3320 5246/2535/3320 5247/2535/3320 -f 7654/2533/3321 7655/2533/3321 5246/2535/3321 -f 7656/2535/3322 5248/2536/3322 7657/2537/3322 -f 7658/2535/3323 7659/2534/3323 5248/2536/3323 -f 7660/2534/3324 5249/2536/3324 5248/2536/3324 -f 7661/2534/3325 7662/2534/3325 5249/2536/3325 -f 7663/2534/3326 7664/2537/3326 5249/2536/3326 -f 7665/2534/3327 7666/2535/3327 7667/2537/3327 -f 5247/2535/3328 5250/2537/3328 5251/2537/3328 -f 5247/2535/3163 5246/2535/3163 5250/2537/3163 -f 7668/2537/3329 5252/2538/3329 7669/2539/3329 -f 7670/2537/3330 5248/2536/3330 5252/2538/3330 -f 5248/2536/3331 5253/2538/3331 5252/2538/3331 -f 5248/2536/3332 5249/2536/3332 5253/2538/3332 -f 5249/2536/3333 7671/2539/3333 5253/2538/3333 -f 5249/2536/3334 7672/2537/3334 7673/2539/3334 -f 5251/2537/3335 5254/2539/3335 5255/2539/3335 -f 5251/2537/3336 5250/2537/3336 5254/2539/3336 -f 7674/2539/3337 5256/2540/3337 7675/2541/3337 -f 7676/2539/3338 5252/2538/3338 5256/2540/3338 -f 5252/2538/3339 5257/2540/3339 5256/2540/3339 -f 5252/2538/3340 5253/2538/3340 5257/2540/3340 -f 5253/2538/3341 7677/2541/3341 5257/2540/3341 -f 5253/2538/3342 7678/2539/3342 7679/2541/3342 -f 5255/2539/3343 5258/2541/3343 5259/2541/3343 -f 5255/2539/3344 5254/2539/3344 5258/2541/3344 -f 7680/2541/3345 5260/2542/3345 7681/2543/3345 -f 7682/2541/3345 5256/2540/3345 5260/2542/3345 -f 5256/2540/3346 5261/2542/3346 5260/2542/3346 -f 5256/2540/3347 5257/2540/3347 5261/2542/3347 -f 5257/2540/3348 7683/2543/3348 5261/2542/3348 -f 5257/2540/3349 7684/2541/3349 7685/2543/3349 -f 5259/2541/3350 5262/2543/3350 5263/2543/3350 -f 5259/2541/3351 5258/2541/3351 5262/2543/3351 -f 7686/2543/3352 5264/2544/3352 7687/2545/3352 -f 7688/2543/3353 5260/2542/3353 5264/2544/3353 -f 5260/2542/3354 5265/2544/3354 5264/2544/3354 -f 5260/2542/3355 5261/2542/3355 5265/2544/3355 -f 5261/2542/3356 7689/2545/3356 5265/2544/3356 -f 5261/2542/3357 7690/2543/3357 7691/2545/3357 -f 5263/2543/3358 5266/2545/3358 5267/2545/3358 -f 5263/2543/3359 5262/2543/3359 5266/2545/3359 -f 7692/2545/3360 5268/2546/3360 7693/2547/3360 -f 7694/2545/3361 5264/2544/3361 5268/2546/3361 -f 5264/2544/3362 5269/2546/3362 5268/2546/3362 -f 5264/2544/3363 5265/2544/3363 5269/2546/3363 -f 5265/2544/3364 7695/2547/3364 5269/2546/3364 -f 5265/2544/3365 7696/2545/3365 7697/2547/3365 -f 5267/2545/3366 5270/2547/3366 5271/2547/3366 -f 5267/2545/3367 5266/2545/3367 5270/2547/3367 -f 7698/2547/3368 5272/2548/3368 7699/2549/3368 -f 7700/2547/3369 5268/2546/3369 5272/2548/3369 -f 5268/2546/3370 5273/2548/3370 5272/2548/3370 -f 5268/2546/3371 5269/2546/3371 5273/2548/3371 -f 5269/2546/3372 7701/2549/3372 5273/2548/3372 -f 5269/2546/3373 7702/2547/3373 7703/2549/3373 -f 5271/2547/3374 5274/2549/3374 5275/2549/3374 -f 5271/2547/3375 5270/2547/3375 5274/2549/3375 -f 7704/2549/3376 5276/2550/3376 7705/2551/3376 -f 7706/2549/3377 5272/2548/3377 5276/2550/3377 -f 5272/2548/3378 5277/2550/3378 5276/2550/3378 -f 5272/2548/3379 5273/2548/3379 5277/2550/3379 -f 5273/2548/3380 7707/2551/3380 5277/2550/3380 -f 5273/2548/3381 7708/2549/3381 7709/2551/3381 -f 5275/2549/3382 5278/2551/3382 5279/2551/3382 -f 5275/2549/3383 5274/2549/3383 5278/2551/3383 -f 7710/2551/3384 5280/2552/3384 7711/2553/3384 -f 7712/2551/3385 5276/2550/3385 5280/2552/3385 -f 5276/2550/3386 5281/2552/3386 5280/2552/3386 -f 5276/2550/3387 5277/2550/3387 5281/2552/3387 -f 5277/2550/3388 7713/2553/3388 5281/2552/3388 -f 5277/2550/3389 7714/2551/3389 7715/2553/3389 -f 5279/2551/3390 5282/2553/3390 5283/2553/3390 -f 5279/2551/3391 5278/2551/3391 5282/2553/3391 -f 7716/2553/3392 5284/2554/3392 7717/2555/3392 -f 7718/2553/3393 5280/2552/3393 5284/2554/3393 -f 5280/2552/2988 5285/2554/2988 5284/2554/2988 -f 5280/2552/3394 5281/2552/3394 5285/2554/3394 -f 5281/2552/3395 7719/2555/3395 5285/2554/3395 -f 5281/2552/3396 7720/2553/3396 7721/2555/3396 -f 5283/2553/3397 5286/2555/3397 5287/2555/3397 -f 5283/2553/3398 5282/2553/3398 5286/2555/3398 -f 7722/2555/3399 5288/2556/3399 7723/2557/3399 -f 7724/2555/3400 5284/2554/3400 5288/2556/3400 -f 5284/2554/3401 5289/2556/3401 5288/2556/3401 -f 5284/2554/2988 5285/2554/2988 5289/2556/2988 -f 5285/2554/3402 7725/2558/3402 5289/2556/3402 -f 5285/2554/3403 7726/2555/3403 7727/2558/3403 -f 5287/2555/3404 5290/2557/3404 5291/2558/3404 -f 5287/2555/3405 5286/2555/3405 5290/2557/3405 -f 7728/2415/3406 5292/2412/3406 7729/2412/3406 -f 7730/2415/3407 7731/2412/3407 7732/2415/3407 -f 5288/2556/3408 5293/2558/3408 7733/2557/3408 -f 5288/2556/3409 5289/2556/3409 7734/2557/3409 -f 7735/2535/3410 7736/2532/3410 7737/2402/3410 -f 7738/2535/3411 7739/2402/3411 7740/2404/3411 -f 7741/2533/3412 5294/2535/3412 5295/2405/3412 -f 7742/2535/3413 7743/2404/3413 7744/2405/3413 -f 7745/2406/3414 5296/2533/3414 7746/2405/3414 -f 7747/2533/3415 7748/2406/3415 7749/2407/3415 -f 7750/2533/3416 5297/2407/3416 7751/2531/3416 -f 7752/2530/3417 7753/2531/3417 7754/2408/3417 -f 7755/2531/3418 7756/2407/3418 7757/2408/3418 -f 7758/2530/3419 7759/2408/3419 7760/2409/3419 -f 7761/2532/3420 5298/2530/3420 5299/2410/3420 -f 7762/2530/3421 7763/2409/3421 7764/2410/3421 -f 7765/2532/3422 5300/2410/3422 7766/2411/3422 -f 7767/2532/3423 7768/2411/3423 7769/2403/3423 -f 7770/2403/3424 5301/2402/3424 7771/2532/3424 -f 7772/2521/3425 7773/2520/3425 7774/2285/3425 -f 7775/2521/3426 7776/2285/3426 7777/2286/3426 -f 7778/2521/3427 7779/2286/3427 7780/2287/3427 -f 7781/2519/3428 5302/2521/3428 5303/2288/3428 -f 7782/2521/3429 7783/2287/3429 7784/2288/3429 -f 7785/2519/3430 5304/2288/3430 7786/2289/3430 -f 7787/2518/3431 7788/2519/3431 7789/2290/3431 -f 7790/2519/3432 5305/2289/3432 7791/2290/3432 -f 7792/2518/3433 7793/2290/3433 7794/2291/3433 -f 7795/2518/3434 7796/2291/3434 7797/2292/3434 -f 7798/2520/3435 7799/2518/3435 7800/2293/3435 -f 7801/2518/3436 5306/2292/3436 5307/2293/3436 -f 7802/2520/3437 7803/2293/3437 7804/2294/3437 -f 7805/2294/3438 5308/2285/3438 7806/2520/3438 -f 7807/2501/3439 7808/2500/3439 7809/2392/3439 -f 7810/2499/3440 5309/2501/3440 7811/2394/3440 -f 7812/2501/3441 7813/2392/3441 7814/2394/3441 -f 7815/2499/3442 7816/2394/3442 7817/2395/3442 -f 7818/2498/3443 7819/2499/3443 7820/2395/3443 -f 7821/2498/3444 5310/2395/3444 5311/2396/3444 -f 7822/2498/3445 7823/2396/3445 7824/2397/3445 -f 7825/2498/3446 5312/2397/3446 7826/2398/3446 -f 7827/2500/3447 7828/2498/3447 7829/2399/3447 -f 7830/2498/3448 5313/2398/3448 7831/2399/3448 -f 7832/2500/3449 7833/2399/3449 7834/2400/3449 -f 7835/2500/3450 7836/2400/3450 7837/2401/3450 -f 7838/2500/3451 7839/2401/3451 7840/2393/3451 -f 7841/2393/3452 5314/2392/3452 5315/2500/3452 -f 7842/2481/3453 7843/2482/3453 7844/2382/3453 -f 7845/2482/3454 5316/2484/3454 7846/2382/3454 -f 7847/2481/3455 7848/2382/3455 7849/2384/3455 -f 7850/2481/3456 5317/2384/3456 7851/2385/3456 -f 7852/2481/3457 7853/2385/3457 7854/2386/3457 -f 7855/2481/3458 7856/2386/3458 7857/2387/3458 -f 7858/2483/3459 7859/2481/3459 7860/2388/3459 -f 7861/2481/3460 5318/2387/3460 5319/2388/3460 -f 7862/2389/3452 7863/2483/3452 7864/2388/3452 -f 7865/2483/3461 5320/2389/3461 7866/2390/3461 -f 7867/2483/3462 7868/2390/3462 7869/2486/3462 -f 5316/2484/3463 5321/2486/3463 7870/2391/3463 -f 7871/2486/3464 7872/2390/3464 7873/2391/3464 -f 7874/2484/3465 7875/2391/3465 7876/2383/3465 -f 7877/2382/3466 7878/2484/3466 7879/2383/3466 -f 7880/2465/3467 5322/2370/3467 5323/2372/3467 -f 7881/2467/3468 7882/2465/3468 7883/2374/3468 -f 7884/2465/3469 5324/2372/3469 7885/2374/3469 -f 7886/2467/3470 7887/2374/3470 7888/2375/3470 -f 7889/2470/3471 5325/2467/3471 7890/2376/3471 -f 7891/2467/3448 7892/2375/3448 7893/2376/3448 -f 7894/2470/3472 7895/2376/3472 7896/2377/3472 -f 7897/2470/3473 7898/2377/3473 7899/2378/3473 -f 7900/2468/3474 5326/2470/3474 5327/2379/3474 -f 7901/2470/3475 7902/2378/3475 7903/2379/3475 -f 7904/2468/3476 5328/2379/3476 7905/2381/3476 -f 7906/2371/3476 7907/2468/3476 7908/2381/3476 -f 7909/2465/3477 5329/2468/3477 7910/2371/3477 -f 7911/2370/3478 7912/2465/3478 7913/2371/3478 -f 7914/2559/3479 7915/2449/3479 7916/2362/3479 -f 7917/2449/3479 7918/2360/3479 7919/2362/3479 -f 7920/2559/3480 5330/2362/3480 5331/2363/3480 -f 7921/2560/3480 7922/2559/3480 7923/2364/3480 -f 7924/2559/3481 5332/2363/3481 7925/2364/3481 -f 7926/2560/3481 7927/2364/3481 7928/2365/3481 -f 7929/2560/3482 5333/2365/3482 7930/2366/3482 -f 7931/2450/3483 7932/2560/3483 7933/2367/3483 -f 7934/2560/3484 7935/2366/3484 7936/2367/3484 -f 7937/2450/3484 7938/2367/3484 7939/2368/3484 -f 7940/2449/3485 5334/2450/3485 5335/2368/3485 -f 7941/2449/3486 7942/2368/3486 7943/2369/3486 -f 7944/2449/3487 5336/2369/3487 7945/2361/3487 -f 7946/2360/3488 7947/2449/3488 7948/2361/3488 -f 7949/2437/3448 5337/2435/3448 7950/2350/3448 -f 7951/2437/3489 7952/2350/3489 7953/2352/3489 -f 7954/2437/3490 7955/2352/3490 7956/2440/3490 -f 7957/2440/3491 7958/2352/3491 7959/2353/3491 -f 7960/2440/3492 5338/2353/3492 5339/2354/3492 -f 7961/2440/3467 7962/2354/3467 7963/2355/3467 -f 7964/2438/3493 5340/2440/3493 7965/2356/3493 -f 7966/2440/3494 7967/2355/3494 7968/2356/3494 -f 7969/2438/3495 5341/2356/3495 7970/2357/3495 -f 7971/2438/3463 7972/2357/3463 7973/2358/3463 -f 7974/2438/3496 7975/2358/3496 7976/2436/3496 -f 5337/2435/3497 7977/2436/3497 7978/2351/3497 -f 7979/2436/3498 5342/2358/3498 5343/2359/3498 -f 7980/2350/3499 7981/2435/3499 7982/2351/3499 -f 7983/2436/3500 5344/2437/3500 7984/2340/3500 -f 7985/2340/3501 7986/2437/3501 7987/2341/3501 -f 7988/2341/3502 5345/2437/3502 7989/2439/3502 -f 7990/2341/3502 7991/2439/3502 7992/2342/3502 -f 7993/2342/3503 7994/2439/3503 7995/2343/3503 -f 7996/2343/3503 7997/2439/3503 7998/2344/3503 -f 7999/2439/3504 5346/2440/3504 5347/2345/3504 -f 8000/2344/3505 8001/2439/3505 8002/2345/3505 -f 8003/2440/3506 5348/2438/3506 8004/2346/3506 -f 8005/2345/3506 8006/2440/3506 8007/2346/3506 -f 8008/2346/3507 5349/2438/3507 8009/2347/3507 -f 8010/2347/3508 8011/2438/3508 8012/2436/3508 -f 8013/2347/3509 8014/2436/3509 8015/2348/3509 -f 8016/2348/3510 8017/2436/3510 8018/2349/3510 -f 8019/2340/3511 5350/2349/3511 5351/2436/3511 -f 8020/2450/3512 8021/2449/3512 8022/2329/3512 -f 8023/2449/3513 5352/2559/3513 8024/2330/3513 -f 8025/2329/3513 8026/2449/3513 8027/2330/3513 -f 8028/2330/3514 5353/2559/3514 8029/2331/3514 -f 8030/2331/3483 8031/2559/3483 8032/2332/3483 -f 8033/2559/3515 8034/2560/3515 8035/2333/3515 -f 8036/2332/3516 8037/2559/3516 8038/2333/3516 -f 8039/2333/3517 5354/2560/3517 5355/2334/3517 -f 8040/2560/3518 8041/2450/3518 8042/2335/3518 -f 8043/2334/3519 5356/2560/3519 8044/2335/3519 -f 8045/2335/3520 8046/2450/3520 8047/2336/3520 -f 8048/2336/3521 8049/2450/3521 5357/2337/3521 -f 8050/2337/3522 8051/2450/3522 8052/2338/3522 -f 8053/2338/3523 8054/2450/3523 8055/2329/3523 -f 8056/2318/3524 5358/2466/3524 5359/2319/3524 -f 8057/2466/3525 8058/2467/3525 8059/2320/3525 -f 8060/2319/3526 5360/2466/3526 8061/2320/3526 -f 8062/2320/3527 8063/2467/3527 8064/2321/3527 -f 8065/2321/3528 8066/2467/3528 5361/2469/3528 -f 8067/2321/3529 8068/2469/3529 8069/2322/3529 -f 8070/2322/3530 5362/2469/3530 5363/2323/3530 -f 8071/2323/3531 8072/2469/3531 8073/2324/3531 -f 8074/2324/3532 5364/2469/3532 8075/2325/3532 -f 8076/2469/3533 8077/2470/3533 8078/2326/3533 -f 8079/2470/3534 5365/2468/3534 8080/2326/3534 -f 8081/2325/3535 5361/2469/3535 8082/2326/3535 -f 8083/2327/3536 8084/2468/3536 8085/2466/3536 -f 8086/2326/3537 8087/2468/3537 8088/2327/3537 -f 8089/2318/3538 5366/2327/3538 5367/2466/3538 -f 8090/2484/3539 8091/2482/3539 8092/2307/3539 -f 8093/2307/3540 5368/2482/3540 8094/2308/3540 -f 8095/2308/3541 8096/2482/3541 8097/2309/3541 -f 8098/2309/3542 5369/2482/3542 8099/2310/3542 -f 8100/2310/3543 8101/2482/3543 8102/2481/3543 -f 8103/2310/3544 8104/2481/3544 8105/2311/3544 -f 8106/2481/3545 8107/2483/3545 8108/2312/3545 -f 8109/2311/3546 5370/2481/3546 5371/2312/3546 -f 8110/2312/3547 8111/2483/3547 8112/2313/3547 -f 8113/2313/3548 5372/2483/3548 8114/2314/3548 -f 8115/2483/3549 8116/2484/3549 8117/2315/3549 -f 8118/2314/3550 5373/2483/3550 8119/2315/3550 -f 8120/2315/3551 8121/2484/3551 8122/2316/3551 -f 8123/2316/3552 8124/2484/3552 8125/2307/3552 -f 8126/2500/3553 8127/2501/3553 8128/2296/3553 -f 8129/2501/3554 5374/2499/3554 5375/2297/3554 -f 8130/2296/3555 8131/2501/3555 8132/2297/3555 -f 8133/2297/3556 5376/2499/3556 8134/2298/3556 -f 8135/2298/3556 8136/2499/3556 8137/2299/3556 -f 8138/2299/3557 5377/2499/3557 8139/2300/3557 -f 8140/2300/3558 8141/2499/3558 8142/2498/3558 -f 8143/2300/3559 8144/2498/3559 8145/2301/3559 -f 8146/2498/3560 8147/2500/3560 8148/2302/3560 -f 8149/2301/3561 5378/2498/3561 5379/2302/3561 -f 8150/2302/3562 8151/2500/3562 8152/2303/3562 -f 8153/2303/3563 5380/2500/3563 8154/2304/3563 -f 8155/2304/3564 8156/2500/3564 8157/2305/3564 -f 8158/2305/3565 5381/2500/3565 8159/2296/3565 -f 8160/2285/3566 8161/2520/3566 8162/2286/3566 -f 8163/2520/3567 8164/2521/3567 8165/2287/3567 -f 8166/2286/3568 8167/2520/3568 8168/2287/3568 -f 8169/2521/3569 5382/2519/3569 5383/2288/3569 -f 8170/2287/3570 8171/2521/3570 8172/2288/3570 -f 8173/2288/3571 5384/2519/3571 8174/2289/3571 -f 8175/2289/3572 8176/2519/3572 8177/2290/3572 -f 8178/2519/3573 5385/2518/3573 8179/2290/3573 -f 8180/2290/3574 8181/2518/3574 8182/2291/3574 -f 8183/2291/3575 8184/2518/3575 8185/2292/3575 -f 8186/2292/3576 8187/2518/3576 8188/2293/3576 -f 8189/2518/3577 5386/2520/3577 5387/2293/3577 -f 8190/2293/3578 8191/2520/3578 8192/2294/3578 -f 8193/2294/3579 5388/2520/3579 8194/2285/3579 -f 8195/2275/3580 8196/2275/3580 8197/2283/3580 -f 8198/2275/3581 5389/2275/3581 8199/2274/3581 -f 8200/2274/3582 8201/2274/3582 5389/2275/3582 -f 8202/2274/3583 8203/2274/3583 8204/2276/3583 -f 8205/2276/3584 8206/2276/3584 8207/2274/3584 -f 8208/2276/3585 5390/2276/3585 5391/2277/3585 -f 8209/2277/3586 8210/2277/3586 5390/2276/3586 -f 8211/2277/3587 5392/2277/3587 8212/2278/3587 -f 8213/2278/3588 8214/2278/3588 5392/2277/3588 -f 8215/2278/3589 5393/2278/3589 8216/2279/3589 -f 8217/2279/3590 8218/2279/3590 8219/2278/3590 -f 8220/2279/3591 8221/2279/3591 8222/2280/3591 -f 8223/2280/3592 8224/2280/3592 8225/2279/3592 -f 8226/2280/3593 5394/2280/3593 5395/2281/3593 -f 8227/2281/3594 8228/2281/3594 8229/2280/3594 -f 8230/2281/3595 5396/2281/3595 8231/2282/3595 -f 8232/2282/3596 8233/2282/3596 8234/2281/3596 -f 8235/2282/3597 5397/2282/3597 8236/2283/3597 -f 8237/2283/3598 8238/2283/3598 8239/2282/3598 -f 8240/2283/3599 8241/2283/3599 8242/2275/3599 -f 8243/2561/3600 8244/2562/3600 8245/2563/3600 -f 8246/2561/3601 5398/2564/3601 5399/2562/3601 -f 8247/2564/3593 8248/2562/3593 8249/2562/3593 -f 8250/2564/3602 5400/2564/3602 8251/2562/3602 -f 8252/2564/3603 8253/2563/3603 8254/2562/3603 -f 8255/2564/3604 5401/2561/3604 8256/2563/3604 -f 8257/2561/3605 8258/2563/3605 8259/2563/3605 -f 8260/2561/3606 8261/2561/3606 8262/2563/3606 -f 8263/2563/3607 8264/2565/3607 8265/2566/3607 -f 8266/2563/3608 5402/2562/3608 5403/2565/3608 -f 5399/2562/3609 8267/2565/3609 8268/2565/3609 -f 8269/2562/3610 5404/2562/3610 8270/2565/3610 -f 8271/2562/3611 8272/2566/3611 8273/2565/3611 -f 8274/2562/3612 5405/2563/3612 8275/2566/3612 -f 8276/2563/3613 8277/2566/3613 8278/2566/3613 -f 8279/2563/3614 8280/2563/3614 8281/2566/3614 -f 8282/2566/3615 8283/2567/3615 8284/2568/3615 -f 8285/2566/3616 5406/2565/3616 5407/2567/3616 -f 5403/2565/3617 8286/2567/3617 8287/2567/3617 -f 8288/2565/3618 5408/2565/3618 8289/2567/3618 -f 8290/2565/3619 8291/2568/3619 8292/2567/3619 -f 8293/2565/3620 5409/2566/3620 8294/2568/3620 -f 8295/2566/3612 8296/2568/3612 8297/2568/3612 -f 8298/2566/3621 8299/2566/3621 8300/2568/3621 -f 8301/2568/3622 8302/2569/3622 8303/2570/3622 -f 8304/2568/3623 5410/2567/3623 5411/2569/3623 -f 5407/2567/3624 8305/2569/3624 8306/2569/3624 -f 8307/2567/3625 5412/2567/3625 8308/2569/3625 -f 8309/2567/3626 8310/2570/3626 8311/2569/3626 -f 8312/2567/3627 5413/2568/3627 8313/2570/3627 -f 8314/2568/3628 8315/2570/3628 8316/2570/3628 -f 8317/2568/3629 8318/2568/3629 8319/2570/3629 -f 8320/2570/3629 8321/2571/3629 8322/2572/3629 -f 8323/2570/3630 5414/2569/3630 5415/2571/3630 -f 5411/2569/3631 8324/2571/3631 8325/2571/3631 -f 8326/2569/3632 5416/2569/3632 8327/2571/3632 -f 8328/2569/3633 8329/2572/3633 8330/2571/3633 -f 8331/2569/3634 5417/2570/3634 8332/2572/3634 -f 8333/2570/3635 8334/2572/3635 8335/2572/3635 -f 8336/2570/3636 8337/2570/3636 8338/2572/3636 -f 8339/2572/3636 8340/2573/3636 8341/2574/3636 -f 8342/2572/3637 5418/2571/3637 5419/2573/3637 -f 5415/2571/3638 8343/2573/3638 8344/2573/3638 -f 8345/2571/3639 5420/2571/3639 8346/2573/3639 -f 8347/2571/3640 8348/2574/3640 8349/2573/3640 -f 8350/2571/3641 5421/2572/3641 8351/2574/3641 -f 8352/2572/3642 8353/2574/3642 8354/2574/3642 -f 8355/2572/3643 8356/2572/3643 8357/2574/3643 -f 8358/2574/3644 8359/2575/3644 8360/2576/3644 -f 8361/2574/3645 5422/2573/3645 5423/2575/3645 -f 5419/2573/3646 8362/2575/3646 8363/2575/3646 -f 8364/2573/3647 5424/2573/3647 8365/2575/3647 -f 8366/2573/3648 8367/2576/3648 8368/2575/3648 -f 8369/2573/3649 5425/2574/3649 8370/2576/3649 -f 8371/2574/3650 8372/2576/3650 8373/2576/3650 -f 8374/2574/3651 8375/2574/3651 8376/2576/3651 -f 8377/2576/3652 8378/2577/3652 8379/2578/3652 -f 8380/2576/3653 5426/2575/3653 5427/2577/3653 -f 5423/2575/3654 8381/2577/3654 8382/2577/3654 -f 8383/2575/3655 5428/2575/3655 8384/2577/3655 -f 8385/2575/3656 8386/2578/3656 8387/2577/3656 -f 8388/2575/3657 5429/2576/3657 8389/2578/3657 -f 8390/2576/3658 8391/2578/3658 8392/2578/3658 -f 8393/2576/3659 8394/2576/3659 8395/2578/3659 -f 8396/2578/3660 8397/2579/3660 8398/2580/3660 -f 8399/2578/3661 5430/2577/3661 5431/2579/3661 -f 5427/2577/3662 8400/2581/3662 8401/2579/3662 -f 8402/2577/3663 5432/2577/3663 8403/2581/3663 -f 8404/2577/3664 8405/2582/3664 8406/2581/3664 -f 8407/2577/3665 5433/2578/3665 8408/2582/3665 -f 8409/2578/3666 8410/2580/3666 8411/2582/3666 -f 8412/2578/3667 8413/2578/3667 8414/2580/3667 -f 8415/2580/3668 8416/2583/3668 8417/2584/3668 -f 8418/2580/3669 5434/2579/3669 5435/2583/3669 -f 5431/2579/3670 8419/2583/3670 8420/2583/3670 -f 8421/2579/3671 5436/2581/3671 8422/2583/3671 -f 8423/2581/3672 8424/2584/3672 8425/2583/3672 -f 8426/2581/3673 5437/2582/3673 8427/2584/3673 -f 8428/2582/3674 8429/2584/3674 8430/2584/3674 -f 8431/2582/3675 8432/2580/3675 8433/2584/3675 -f 8434/2584/3676 8435/2585/3676 8436/2586/3676 -f 8437/2584/3677 5438/2583/3677 5439/2585/3677 -f 5435/2583/3678 8438/2585/3678 8439/2585/3678 -f 8440/2583/3679 5440/2583/3679 8441/2585/3679 -f 8442/2583/3680 8443/2586/3680 8444/2585/3680 -f 8445/2583/3681 5441/2584/3681 8446/2586/3681 -f 8447/2584/3682 8448/2586/3682 8449/2586/3682 -f 8450/2584/3683 8451/2584/3683 8452/2586/3683 -f 8453/2586/3684 8454/2587/3684 8455/2588/3684 -f 8456/2586/3685 8457/2585/3685 8458/2587/3685 -f 5439/2585/3686 8459/2587/3686 8460/2587/3686 -f 8461/2585/3687 8462/2585/3687 8463/2587/3687 -f 8464/2585/3688 8465/2588/3688 8466/2587/3688 -f 8467/2585/3689 8468/2586/3689 8469/2588/3689 -f 8470/2586/3690 8471/2588/3690 8472/2588/3690 -f 8473/2586/3691 8474/2586/3691 8475/2588/3691 -f 8476/2588/3692 8477/2589/3692 8478/2590/3692 -f 8479/2588/3693 8480/2587/3693 5080/2589/3693 -f 8481/2587/3694 8482/2589/3694 5081/2589/3694 -f 8483/2587/3695 8484/2587/3695 5082/2589/3695 -f 8485/2587/3696 8486/2590/3696 5082/2589/3696 -f 8487/2587/3697 8488/2588/3697 5083/2590/3697 -f 8489/2588/3698 8490/2590/3698 5084/2590/3698 -f 8491/2588/3699 8492/2588/3699 8493/2590/3699 -f 8494/2590/3700 8495/2591/3700 5085/2592/3700 -f 8496/2590/3701 8497/2589/3701 8498/2591/3701 -f 8499/2589/3702 8500/2591/3702 5086/2591/3702 -f 8501/2589/3703 8502/2589/3703 5087/2591/3703 -f 8503/2589/3704 8504/2592/3704 5087/2591/3704 -f 8505/2589/3705 8506/2590/3705 5088/2592/3705 -f 8507/2590/3706 5088/2592/3706 5089/2592/3706 -f 8508/2590/3707 8509/2590/3707 8510/2592/3707 -f 8511/2592/3 8512/2593/3 8513/2594/3 -f 5442/2176/3708 5446/2176/3708 5445/2176/3708 -f 5442/2176/3708 5443/2176/3708 5446/2176/3708 -f 5443/2176/7 5447/2176/7 5446/2176/7 -f 5443/2176/7 5444/2176/7 5447/2176/7 -f 5444/2176/3709 5445/2176/3709 5447/2176/3709 -f 5444/2176/3709 5442/2176/3709 5445/2176/3709 -f 5448/2176/3710 5452/2176/3710 5451/2176/3710 -f 5448/2176/3710 5449/2176/3710 5452/2176/3710 -f 5449/2176/7 5453/2176/7 5452/2176/7 -f 5449/2176/7 5450/2176/7 5453/2176/7 -f 5450/2176/2743 5451/2176/2743 5453/2176/2743 -f 5450/2176/2743 5448/2176/2743 5451/2176/2743 -f 5454/2176/3708 5458/2176/3708 5457/2176/3708 -f 5454/2176/3708 5455/2176/3708 5458/2176/3708 -f 5455/2176/7 5459/2176/7 5458/2176/7 -f 5455/2176/7 5456/2176/7 5459/2176/7 -f 5456/2176/3709 5457/2176/3709 5459/2176/3709 -f 5456/2176/3709 5454/2176/3709 5457/2176/3709 -f 5460/2176/2742 5464/2176/2742 5463/2176/2742 -f 5460/2176/2742 5461/2176/2742 5464/2176/2742 -f 5461/2176/7 5465/2176/7 5464/2176/7 -f 5461/2176/7 5462/2176/7 5465/2176/7 -f 5462/2176/3711 5463/2176/3711 5465/2176/3711 -f 5462/2176/3711 5460/2176/3711 5463/2176/3711 -f 5466/2176/2742 5470/2176/2742 5469/2176/2742 -f 5466/2176/2742 5467/2176/2742 5470/2176/2742 -f 5467/2176/7 5471/2176/7 5470/2176/7 -f 5467/2176/7 5468/2176/7 5471/2176/7 -f 5468/2176/2743 5469/2176/2743 5471/2176/2743 -f 5468/2176/2743 5466/2176/2743 5469/2176/2743 -f 5472/2176/2742 5476/2176/2742 5475/2176/2742 -f 5472/2176/2742 5473/2176/2742 5476/2176/2742 -f 5473/2176/7 5477/2176/7 5476/2176/7 -f 5473/2176/7 5474/2176/7 5477/2176/7 -f 5474/2176/2743 5475/2176/2743 5477/2176/2743 -f 5474/2176/2743 5472/2176/2743 5475/2176/2743 -f 5478/2176/3712 5482/2176/3712 5481/2176/3712 -f 5478/2176/3712 5479/2176/3712 5482/2176/3712 -f 5479/2176/7 5483/2176/7 5482/2176/7 -f 5479/2176/7 5480/2176/7 5483/2176/7 -f 5480/2176/3711 5481/2176/3711 5483/2176/3711 -f 5480/2176/3711 5478/2176/3711 5481/2176/3711 -f 5484/2176/2742 5488/2176/2742 5487/2176/2742 -f 5484/2176/2742 5485/2176/2742 5488/2176/2742 -f 5485/2176/7 5489/2176/7 5488/2176/7 -f 5485/2176/7 5486/2176/7 5489/2176/7 -f 5486/2176/2743 5487/2176/2743 5489/2176/2743 -f 5486/2176/2743 5484/2176/2743 5487/2176/2743 -f 5490/2176/3712 5494/2176/3712 5493/2176/3712 -f 5490/2176/3712 5491/2176/3712 5494/2176/3712 -f 5491/2176/7 5495/2176/7 5494/2176/7 -f 5491/2176/7 5492/2176/7 5495/2176/7 -f 5492/2176/3711 5493/2176/3711 5495/2176/3711 -f 5492/2176/3711 5490/2176/3711 5493/2176/3711 -f 5496/2176/2742 5500/2176/2742 5499/2176/2742 -f 5496/2176/2742 5497/2176/2742 5500/2176/2742 -f 5497/2176/7 5501/2176/7 5500/2176/7 -f 5497/2176/7 5498/2176/7 5501/2176/7 -f 5498/2176/2743 5499/2176/2743 5501/2176/2743 -f 5498/2176/2743 5496/2176/2743 5499/2176/2743 -f 5502/2176/2742 5506/2176/2742 5505/2176/2742 -f 5502/2176/2742 5503/2176/2742 5506/2176/2742 -f 5503/2176/7 5507/2176/7 5506/2176/7 -f 5503/2176/7 5504/2176/7 5507/2176/7 -f 5504/2176/2743 5505/2176/2743 5507/2176/2743 -f 5504/2176/2743 5502/2176/2743 5505/2176/2743 -f 5508/2176/2742 5512/2176/2742 5511/2176/2742 -f 5508/2176/2742 5509/2176/2742 5512/2176/2742 -f 5509/2176/7 5513/2176/7 5512/2176/7 -f 5509/2176/7 5510/2176/7 5513/2176/7 -f 5510/2176/3713 5511/2176/3713 5513/2176/3713 -f 5510/2176/3713 5508/2176/3713 5511/2176/3713 -f 5514/2176/3714 5518/2176/3714 5517/2176/3714 -f 5514/2176/3714 5515/2176/3714 5518/2176/3714 -f 5515/2176/7 5519/2176/7 5518/2176/7 -f 5515/2176/7 5516/2176/7 5519/2176/7 -f 5516/2176/2743 5517/2176/2743 5519/2176/2743 -f 5516/2176/2743 5514/2176/2743 5517/2176/2743 -o diesflot -v -0.401193 0.055775 -3.209282 -v 1.604848 0.055775 -3.209282 -v -0.401193 0.055775 -3.580296 -v 1.604848 0.055775 -3.580296 -v -0.401193 0.078960 -3.209282 -v 1.604848 0.078960 -3.209282 -v -0.401193 0.078960 -3.580296 -v 1.604848 0.078960 -3.580296 -vt 1.000000 0.999999 -vt 1.000000 -0.000000 -vt -0.000000 0.000001 -vt 0.000000 1.000000 -s off -f 8514/2595/3 8516/2596/3 8517/2597/3 -f 8514/2595/3 8517/2597/3 8515/2598/3 -f 8518/2595/331 8519/2598/331 8521/2597/331 -f 8521/2597/331 8520/2596/331 8518/2595/331 -f 8514/2595/21 8515/2598/21 8519/2598/21 -f 8514/2595/21 8519/2598/21 8518/2595/21 -f 8515/2598/63 8517/2597/63 8521/2597/63 -f 8521/2597/63 8519/2598/63 8515/2598/63 -f 8517/2597/105 8516/2596/105 8520/2596/105 -f 8520/2596/105 8521/2597/105 8517/2597/105 -f 8516/2596/7 8514/2595/7 8518/2595/7 -f 8518/2595/7 8520/2596/7 8516/2596/7 -o diessta1 -v 0.407273 1.560407 -3.273475 -v 1.274506 0.079407 -3.273476 -v 0.407273 1.753628 -3.273475 -v 1.384322 0.078328 -3.273476 -v 0.407273 1.560407 -3.256104 -v 1.274506 0.079407 -3.256105 -v 0.407273 1.753628 -3.256104 -v 1.384322 0.078328 -3.256105 -vn -0.000002 -0.000001 1.000000 -vn -0.862937 -0.505312 -0.000000 -vn -0.009819 -0.999952 -0.000000 -vn 0.863826 0.503790 0.000000 -vn 0.863826 0.503791 -0.000000 -s off -f 8522//105 8524//105 8525//105 -f 8522//105 8525//105 8523//105 -f 8526//21 8527//21 8529//21 -f 8529//3715 8528//3715 8526//3715 -f 8522//3716 8523//3716 8527//3716 -f 8522//3716 8527//3716 8526//3716 -f 8523//3717 8525//3717 8529//3717 -f 8529//3717 8527//3717 8523//3717 -f 8525//3718 8524//3718 8528//3718 -f 8528//3719 8529//3719 8525//3719 -f 8524//7 8522//7 8526//7 -f 8526//7 8528//7 8524//7 -o diestowe -v 0.306703 1.715652 -3.136786 -v -0.241581 1.715652 -3.136786 -v 0.306703 1.645991 -3.136786 -v -0.241581 1.645991 -3.136786 -v 0.306703 1.715651 -3.088839 -v -0.241581 1.715652 -3.088839 -v 0.306703 1.645991 -3.088839 -v -0.241581 1.645991 -3.088839 -v -0.242075 1.624523 -3.136786 -v -0.242075 1.913041 -3.136786 -v -0.311735 1.624523 -3.136786 -v -0.311735 1.913041 -3.136786 -v -0.242075 1.624523 -3.088839 -v -0.242075 1.913041 -3.088839 -v -0.311735 1.624523 -3.088839 -v -0.311735 1.913041 -3.088839 -v -0.309031 1.914657 -3.136786 -v 0.374756 1.914657 -3.136786 -v -0.309031 1.971231 -3.136786 -v 0.374756 1.971231 -3.136786 -v -0.309031 1.914656 -3.088839 -v 0.374756 1.914657 -3.088839 -v -0.309031 1.971231 -3.088839 -v 0.374756 1.971231 -3.088839 -v 0.003541 1.825624 -3.136786 -v -0.241096 1.825624 -3.136786 -v 0.003541 1.786256 -3.136786 -v -0.241096 1.786256 -3.136786 -v 0.003541 1.825624 -3.088839 -v -0.241096 1.825624 -3.088839 -v 0.003541 1.786256 -3.088839 -v -0.241096 1.786256 -3.088839 -v 0.301138 1.825624 -3.136786 -v 0.056500 1.825624 -3.136786 -v 0.301138 1.786256 -3.136786 -v 0.056500 1.786256 -3.136786 -v 0.301138 1.825624 -3.088839 -v 0.056500 1.825624 -3.088839 -v 0.301138 1.786256 -3.088839 -v 0.056500 1.786256 -3.088839 -v 0.056593 1.719998 -3.136786 -v 0.056593 1.913041 -3.136786 -v 0.005808 1.719998 -3.136786 -v 0.005808 1.913041 -3.136786 -v 0.056593 1.719998 -3.088839 -v 0.056593 1.913041 -3.088839 -v 0.005808 1.719998 -3.088839 -v 0.005808 1.913041 -3.088839 -v 0.375739 1.624523 -3.136786 -v 0.375739 1.913041 -3.136786 -v 0.306079 1.624523 -3.136786 -v 0.306079 1.913041 -3.136786 -v 0.375739 1.624523 -3.088839 -v 0.375739 1.913041 -3.088839 -v 0.306079 1.624523 -3.088840 -v 0.306079 1.913041 -3.088839 -v -0.040921 1.566501 -3.265816 -v -0.312383 1.104840 -3.265816 -v -0.123557 1.567101 -3.265816 -v -0.312914 1.211838 -3.265815 -v -0.040921 1.566501 -3.219866 -v -0.312383 1.104840 -3.219866 -v -0.123557 1.567101 -3.219866 -v -0.312914 1.211838 -3.219866 -v -0.345949 0.126149 -3.273591 -v -0.345949 0.308024 -3.516224 -v -0.345949 0.190034 -3.273591 -v -0.345949 0.371909 -3.516224 -v -0.313570 0.126149 -3.273591 -v -0.313570 0.308024 -3.516224 -v -0.313570 0.190034 -3.273591 -v -0.313570 0.371909 -3.516224 -v -0.345949 0.606722 -3.273591 -v -0.345949 0.414207 -3.516224 -v -0.345949 0.672715 -3.273591 -v -0.345949 0.480200 -3.516224 -v -0.313570 0.606722 -3.273591 -v -0.313570 0.414207 -3.516224 -v -0.313570 0.672715 -3.273591 -v -0.313570 0.480200 -3.516224 -v -0.345949 0.726221 -3.273591 -v -0.345949 0.904923 -3.516224 -v -0.345949 0.790954 -3.273591 -v -0.345949 0.969656 -3.516224 -v -0.313570 0.726221 -3.273591 -v -0.313570 0.904923 -3.516224 -v -0.313570 0.790954 -3.273591 -v -0.313570 0.969656 -3.516224 -v -0.345949 1.193540 -3.273590 -v -0.345949 1.009300 -3.516224 -v -0.345949 1.262894 -3.273590 -v -0.345949 1.078654 -3.516224 -v -0.313570 1.193540 -3.273590 -v -0.313570 1.009300 -3.516224 -v -0.313570 1.262894 -3.273590 -v -0.313570 1.078654 -3.516224 -v -0.345949 1.328254 -3.273590 -v -0.345949 1.514726 -3.516224 -v -0.345949 1.391820 -3.273590 -v -0.345949 1.578292 -3.516224 -v -0.313570 1.328254 -3.273590 -v -0.313570 1.514726 -3.516224 -v -0.313570 1.391820 -3.273590 -v -0.313570 1.578292 -3.516224 -v -0.345400 1.914020 -3.704611 -v -0.345400 1.914020 -3.572824 -v -0.345400 1.969632 -3.704611 -v -0.345400 1.969632 -3.572824 -v -0.313363 1.914020 -3.704611 -v -0.313363 1.914020 -3.572824 -v -0.313363 1.969632 -3.704611 -v -0.313363 1.969632 -3.572824 -v -0.345401 0.082163 -3.572693 -v -0.345401 0.082162 -3.516119 -v -0.345400 1.969846 -3.572692 -v -0.345400 1.969846 -3.516118 -v -0.312896 0.082163 -3.572693 -v -0.312896 0.082162 -3.516119 -v -0.312896 1.969846 -3.572692 -v -0.312896 1.969846 -3.516118 -v -0.345400 1.914020 -3.085090 -v -0.345400 1.914020 -3.216877 -v -0.345400 1.969631 -3.085090 -v -0.345400 1.969631 -3.216877 -v -0.313363 1.914020 -3.085090 -v -0.313363 1.914020 -3.216877 -v -0.313363 1.969631 -3.085090 -v -0.313363 1.969631 -3.216877 -v -0.345401 0.082162 -3.217010 -v -0.345401 0.082162 -3.273584 -v -0.345400 1.969846 -3.217009 -v -0.345400 1.969846 -3.273583 -v -0.312896 0.082162 -3.217010 -v -0.312896 0.082162 -3.273584 -v -0.312896 1.969846 -3.217009 -v -0.312896 1.969846 -3.273583 -v 0.104214 1.566501 -3.265816 -v 0.375676 1.104840 -3.265816 -v 0.186850 1.567101 -3.265816 -v 0.376207 1.211838 -3.265815 -v 0.104214 1.566501 -3.219866 -v 0.375676 1.104840 -3.219866 -v 0.186850 1.567101 -3.219866 -v 0.376207 1.211838 -3.219865 -v -0.040922 1.566501 -3.569497 -v -0.312384 1.104840 -3.569497 -v -0.123558 1.567101 -3.569497 -v -0.312914 1.211838 -3.569497 -v -0.040922 1.566501 -3.523546 -v -0.312384 1.104840 -3.523546 -v -0.123558 1.567101 -3.523546 -v -0.312914 1.211839 -3.523546 -v 0.104214 1.566501 -3.569497 -v 0.375676 1.104840 -3.569497 -v 0.186850 1.567101 -3.569497 -v 0.376207 1.211838 -3.569497 -v 0.104214 1.566501 -3.523546 -v 0.375676 1.104840 -3.523546 -v 0.186850 1.567101 -3.523546 -v 0.376207 1.211838 -3.523546 -v 0.375967 0.126149 -3.273591 -v 0.375967 0.308025 -3.516224 -v 0.375967 0.190034 -3.273591 -v 0.375967 0.371910 -3.516224 -v 0.408347 0.126149 -3.273591 -v 0.408347 0.308025 -3.516224 -v 0.408347 0.190034 -3.273591 -v 0.408347 0.371910 -3.516224 -v 0.375967 0.606722 -3.273591 -v 0.375967 0.414207 -3.516224 -v 0.375967 0.672715 -3.273591 -v 0.375967 0.480200 -3.516224 -v 0.408347 0.606722 -3.273591 -v 0.408347 0.414207 -3.516224 -v 0.408347 0.672715 -3.273591 -v 0.408347 0.480200 -3.516224 -v 0.375967 0.726221 -3.273591 -v 0.375967 0.904923 -3.516224 -v 0.375967 0.790954 -3.273591 -v 0.375967 0.969656 -3.516224 -v 0.408347 0.726221 -3.273591 -v 0.408347 0.904923 -3.516224 -v 0.408347 0.790954 -3.273591 -v 0.408348 0.969656 -3.516224 -v 0.375967 1.193540 -3.273590 -v 0.375967 1.009300 -3.516224 -v 0.375967 1.262894 -3.273590 -v 0.375967 1.078654 -3.516224 -v 0.408348 1.193540 -3.273590 -v 0.408348 1.009300 -3.516224 -v 0.408348 1.262894 -3.273590 -v 0.408348 1.078654 -3.516224 -v 0.375967 1.328254 -3.273590 -v 0.375967 1.514726 -3.516224 -v 0.375967 1.391820 -3.273590 -v 0.375967 1.578292 -3.516224 -v 0.408347 1.328254 -3.273590 -v 0.408347 1.514726 -3.516224 -v 0.408348 1.391820 -3.273590 -v 0.408348 1.578292 -3.516224 -v 0.376516 1.914020 -3.704611 -v 0.376516 1.914020 -3.572824 -v 0.376516 1.969632 -3.704611 -v 0.376516 1.969631 -3.572824 -v 0.408554 1.914020 -3.704611 -v 0.408554 1.914020 -3.572824 -v 0.408554 1.969632 -3.704611 -v 0.408554 1.969631 -3.572824 -v 0.376516 0.082163 -3.572693 -v 0.376516 0.082163 -3.516119 -v 0.376516 1.969846 -3.572692 -v 0.376516 1.969846 -3.516118 -v 0.409021 0.082163 -3.572693 -v 0.409021 0.082163 -3.516119 -v 0.409021 1.969846 -3.572692 -v 0.409021 1.969846 -3.516118 -v 0.376516 1.914020 -3.085090 -v 0.376516 1.914020 -3.216877 -v 0.376516 1.969631 -3.085090 -v 0.376516 1.969631 -3.216877 -v 0.408554 1.914020 -3.085090 -v 0.408554 1.914020 -3.216877 -v 0.408554 1.969631 -3.085090 -v 0.408554 1.969631 -3.216877 -v 0.376516 0.082163 -3.217010 -v 0.376516 0.082163 -3.273584 -v 0.376516 1.969846 -3.217009 -v 0.376516 1.969846 -3.273583 -v 0.409021 0.082163 -3.217010 -v 0.409021 0.082163 -3.273584 -v 0.409021 1.969846 -3.217009 -v 0.409021 1.969846 -3.273583 -v 0.306702 1.715652 -3.704375 -v -0.241581 1.715652 -3.704375 -v 0.306702 1.645991 -3.704375 -v -0.241581 1.645992 -3.704375 -v 0.306702 1.715652 -3.656428 -v -0.241581 1.715652 -3.656428 -v 0.306702 1.645991 -3.656428 -v -0.241581 1.645992 -3.656428 -v -0.242075 1.624523 -3.704375 -v -0.242075 1.913041 -3.704374 -v -0.311735 1.624523 -3.704375 -v -0.311735 1.913041 -3.704374 -v -0.242075 1.624523 -3.656428 -v -0.242075 1.913041 -3.656428 -v -0.311735 1.624523 -3.656428 -v -0.311735 1.913041 -3.656428 -v -0.309031 1.914657 -3.704374 -v 0.374756 1.914657 -3.704374 -v -0.309031 1.971231 -3.704374 -v 0.374756 1.971231 -3.704374 -v -0.309031 1.914657 -3.656428 -v 0.374756 1.914657 -3.656428 -v -0.309031 1.971231 -3.656428 -v 0.374756 1.971231 -3.656428 -v 0.003541 1.825624 -3.704375 -v -0.241096 1.825624 -3.704375 -v 0.003541 1.786256 -3.704375 -v -0.241096 1.786256 -3.704375 -v 0.003541 1.825624 -3.656428 -v -0.241096 1.825624 -3.656428 -v 0.003541 1.786256 -3.656428 -v -0.241096 1.786256 -3.656428 -v 0.301138 1.825624 -3.704375 -v 0.056500 1.825624 -3.704375 -v 0.301138 1.786256 -3.704375 -v 0.056500 1.786256 -3.704375 -v 0.301138 1.825624 -3.656428 -v 0.056500 1.825624 -3.656428 -v 0.301138 1.786256 -3.656428 -v 0.056500 1.786256 -3.656428 -v 0.056593 1.719998 -3.704375 -v 0.056593 1.913041 -3.704375 -v 0.005808 1.719998 -3.704375 -v 0.005808 1.913041 -3.704375 -v 0.056593 1.719998 -3.656428 -v 0.056593 1.913041 -3.656428 -v 0.005808 1.719998 -3.656428 -v 0.005808 1.913041 -3.656428 -v 0.375739 1.624523 -3.704375 -v 0.375739 1.913041 -3.704375 -v 0.306079 1.624523 -3.704375 -v 0.306079 1.913041 -3.704375 -v 0.375739 1.624523 -3.656428 -v 0.375739 1.913041 -3.656428 -v 0.306079 1.624523 -3.656428 -v 0.306079 1.913041 -3.656428 -v 1.370150 0.081107 -3.523300 -v 1.340369 0.149246 -3.517422 -v 0.997722 0.738212 -3.517422 -v 0.697908 1.253554 -3.517422 -v 1.370150 0.081107 -3.504046 -v 1.340369 0.149246 -3.504046 -v 1.033800 0.676198 -3.504045 -v 0.997722 0.738212 -3.504045 -v 0.734028 1.191466 -3.504045 -v 0.697908 1.253554 -3.504045 -v 1.340369 0.149246 -3.523300 -v 1.033800 0.676197 -3.523300 -v 0.997722 0.738212 -3.523300 -v 0.734028 1.191466 -3.523300 -v 0.697908 1.253554 -3.523300 -v 1.340345 0.484758 -3.523300 -v 1.370128 0.425825 -3.523300 -v 0.990942 1.086166 -3.523300 -v 1.027019 1.024152 -3.523300 -v 0.691127 1.601508 -3.523300 -v 0.727248 1.539420 -3.523300 -v 1.370128 0.425825 -3.504045 -v 1.340345 0.484758 -3.504045 -v 1.027019 1.024152 -3.504045 -v 0.990942 1.086166 -3.504045 -v 0.727248 1.539420 -3.504045 -v 0.691127 1.601508 -3.504045 -v 1.340345 0.484758 -3.517422 -v 1.370128 0.425825 -3.517422 -v 0.990942 1.086166 -3.517422 -v 0.691127 1.601508 -3.517422 -v 1.340480 0.543128 -3.517422 -v 1.370263 0.484195 -3.517422 -v 1.340480 0.543128 -3.504045 -v 1.370263 0.484195 -3.504045 -v 0.990401 1.145780 -3.517422 -v 1.026478 1.083765 -3.523300 -v 0.990401 1.145780 -3.504045 -v 1.026478 1.083765 -3.504045 -v 0.690587 1.661121 -3.523300 -v 0.726706 1.599034 -3.523300 -v 0.690587 1.661121 -3.504045 -v 0.726706 1.599034 -3.504045 -v 1.340480 0.543128 -3.523300 -v 1.370263 0.484195 -3.523300 -v 0.990401 1.145780 -3.523300 -v 0.508759 1.969596 -3.517422 -v 0.508759 1.969596 -3.504045 -v 0.508759 1.969596 -3.523300 -v 0.493598 1.938539 -3.504045 -v 0.493598 1.938539 -3.517422 -v 0.493598 1.938539 -3.523300 -v 0.409109 1.937471 -3.504045 -v 0.409109 1.937471 -3.517422 -v 0.409105 1.969562 -3.517422 -v 0.409105 1.969561 -3.504045 -v 0.409109 1.937471 -3.523300 -v 0.409105 1.969562 -3.523300 -v 1.480814 0.287450 -3.504046 -v 1.480814 0.287450 -3.517422 -v 1.480814 0.287450 -3.523300 -v 1.447263 0.290953 -3.517422 -v 1.447263 0.290953 -3.504046 -v 1.447263 0.290953 -3.523300 -v 1.432788 0.273403 -3.517422 -v 1.432788 0.273403 -3.504046 -v 1.454261 0.251148 -3.504046 -v 1.454261 0.251148 -3.517422 -v 1.432788 0.273403 -3.523300 -v 1.454261 0.251148 -3.523300 -v 1.370149 0.081107 -3.261425 -v 1.340369 0.149246 -3.261425 -v 0.997722 0.738212 -3.261425 -v 0.697908 1.253554 -3.261425 -v 1.370149 0.081107 -3.274242 -v 1.340369 0.149246 -3.274242 -v 1.033800 0.676197 -3.274242 -v 0.997722 0.738212 -3.274242 -v 0.734028 1.191466 -3.274241 -v 0.697908 1.253554 -3.274241 -v 1.370149 0.081107 -3.255793 -v 1.340369 0.149246 -3.255793 -v 1.033800 0.676197 -3.255793 -v 0.997722 0.738212 -3.255793 -v 0.734028 1.191466 -3.255793 -v 0.697908 1.253554 -3.255793 -v 1.340345 0.484759 -3.255793 -v 1.370128 0.425825 -3.255793 -v 0.990941 1.086166 -3.255793 -v 1.027019 1.024152 -3.255793 -v 0.691127 1.601508 -3.255793 -v 0.727247 1.539420 -3.255793 -v 1.370128 0.425825 -3.274241 -v 1.340345 0.484759 -3.274241 -v 1.027019 1.024152 -3.274241 -v 0.990941 1.086166 -3.274241 -v 0.727247 1.539420 -3.274241 -v 0.691127 1.601508 -3.274241 -v 1.340345 0.484759 -3.261425 -v 1.370128 0.425825 -3.261425 -v 0.990941 1.086166 -3.261425 -v 0.691127 1.601508 -3.261425 -v 1.340480 0.543128 -3.261425 -v 1.370263 0.484195 -3.261425 -v 1.340480 0.543128 -3.274242 -v 1.370263 0.484195 -3.274241 -v 0.990401 1.145780 -3.261425 -v 1.026478 1.083765 -3.255793 -v 0.990401 1.145780 -3.274241 -v 1.026478 1.083765 -3.274241 -v 0.690587 1.661121 -3.255793 -v 0.726706 1.599034 -3.255793 -v 0.690587 1.661121 -3.274241 -v 0.726706 1.599034 -3.274241 -v 1.340480 0.543128 -3.255793 -v 1.370263 0.484195 -3.255793 -v 0.990401 1.145780 -3.255793 -v 0.508759 1.969596 -3.261425 -v 0.508759 1.969596 -3.274241 -v 0.508759 1.969596 -3.255793 -v 0.493598 1.938539 -3.274241 -v 0.493598 1.938539 -3.261425 -v 0.493598 1.938539 -3.255793 -v 0.409109 1.937471 -3.274241 -v 0.409109 1.937471 -3.261425 -v 0.409105 1.969561 -3.261425 -v 0.409105 1.969561 -3.274241 -v 0.409109 1.937471 -3.255793 -v 0.409105 1.969561 -3.255793 -v 1.480813 0.287450 -3.274241 -v 1.480813 0.287450 -3.261425 -v 1.480813 0.287450 -3.255793 -v 1.447263 0.290952 -3.261425 -v 1.447263 0.290952 -3.274241 -v 1.447263 0.290953 -3.255793 -v 1.432788 0.273403 -3.261425 -v 1.432788 0.273403 -3.274242 -v 1.454261 0.251148 -3.274242 -v 1.454261 0.251148 -3.261425 -v 1.432788 0.273403 -3.255793 -v 1.454261 0.251148 -3.255793 -v -0.345949 1.078654 -3.516224 -v -0.345949 1.193540 -3.273590 -v -0.313570 1.078654 -3.516224 -v -0.313570 1.193540 -3.273590 -v -0.345949 1.193540 -3.273590 -v -0.345949 1.193540 -3.273590 -v -0.313570 1.078654 -3.516224 -v -0.345400 1.969846 -3.572692 -v -0.345400 1.969846 -3.516118 -v -0.312896 1.969846 -3.572692 -v -0.312896 1.969846 -3.516118 -v -0.312896 1.969846 -3.572692 -v -0.345400 1.969846 -3.516118 -v -0.345400 1.969846 -3.273583 -v -0.345400 1.969846 -3.217009 -v -0.312896 1.969846 -3.217009 -v -0.312896 1.969846 -3.217009 -v -0.312896 1.969846 -3.273583 -v -0.345400 1.969846 -3.273583 -v 0.375967 1.078654 -3.516224 -v 0.375967 1.193540 -3.273590 -v 0.408348 1.078654 -3.516224 -v 0.408348 1.193540 -3.273590 -v 0.375967 1.193540 -3.273590 -v 0.375967 1.193540 -3.273590 -v 0.408348 1.078654 -3.516224 -v 0.376516 1.969846 -3.572692 -v 0.376516 1.969846 -3.516118 -v 0.409021 1.969846 -3.572692 -v 0.409021 1.969846 -3.516118 -v 0.409021 1.969846 -3.572692 -v 0.376516 1.969846 -3.516118 -v 0.376516 1.969846 -3.273583 -v 0.376516 1.969846 -3.217009 -v 0.409021 1.969846 -3.217009 -v 0.409021 1.969846 -3.217009 -v 0.409021 1.969846 -3.273583 -v 0.376516 1.969846 -3.273583 -vt 0.821799 0.523678 -vt 0.828666 0.525755 -vt 0.914218 0.515038 -vt 0.906572 0.514589 -vt 0.821799 0.528056 -vt 0.906572 0.517295 -vt 0.914218 0.517827 -vt 0.828666 0.530513 -vt 0.916711 0.515167 -vt 0.922278 0.514240 -vt 0.893839 0.512671 -vt 0.887398 0.513311 -vt 0.916711 0.517980 -vt 0.887398 0.515780 -vt 0.893839 0.515022 -vt 0.922278 0.516881 -vt 0.893459 0.512686 -vt 0.888648 0.512377 -vt 0.790660 0.518585 -vt 0.793128 0.519683 -vt 0.893459 0.515040 -vt 0.793128 0.523328 -vt 0.790660 0.522027 -vt 0.888648 0.514673 -vt 0.866947 0.516851 -vt 0.870954 0.517314 -vt 0.899244 0.514136 -vt 0.895383 0.513881 -vt 0.866947 0.519974 -vt 0.895383 0.516456 -vt 0.899244 0.516758 -vt 0.870954 0.520523 -vt 0.814192 0.520878 -vt 0.817143 0.521779 -vt 0.863148 0.518098 -vt 0.859190 0.517571 -vt 0.814192 0.524743 -vt 0.859190 0.520827 -vt 0.863148 0.521451 -vt 0.817143 0.525810 -vt 0.870350 0.519032 -vt 0.877889 0.518162 -vt 0.858475 0.515900 -vt 0.851177 0.516474 -vt 0.870350 0.522557 -vt 0.851177 0.519528 -vt 0.858475 0.518848 -vt 0.877889 0.521527 -vt 0.811983 0.528026 -vt 0.831193 0.526444 -vt 0.807452 0.519148 -vt 0.792993 0.519723 -vt 0.811983 0.533198 -vt 0.792993 0.523376 -vt 0.807452 0.522694 -vt 0.831193 0.531328 -vt 0.912700 0.508757 -vt 0.903517 0.509579 -vt 0.974031 0.507949 -vt 0.988909 0.508041 -vt 0.988909 0.510902 -vt 0.903517 0.512987 -vt 0.974031 0.510777 -vt 0.912700 0.511873 -vt 0.104351 0.505784 -vt 0.098746 0.505937 -vt 0.081143 0.493625 -vt 0.087608 0.493775 -vt 0.107140 0.505915 -vt 0.090190 0.493611 -vt 0.083613 0.493449 -vt 0.101479 0.506079 -vt 0.054781 0.506869 -vt 0.046689 0.506985 -vt 0.069482 0.493381 -vt 0.076692 0.493528 -vt 0.056631 0.507091 -vt 0.079076 0.493343 -vt 0.071709 0.493184 -vt 0.048303 0.507219 -vt 0.039938 0.507068 -vt 0.031572 0.507154 -vt 0.007681 0.492705 -vt 0.016433 0.492735 -vt 0.041342 0.507311 -vt 0.017032 0.492471 -vt 0.007963 0.492438 -vt 0.032701 0.507406 -vt 0.977388 0.507223 -vt 0.968230 0.507152 -vt 0.992866 0.492704 -vt -0.007134 0.492704 -vt 0.002294 0.492697 -vt -0.022612 0.507223 -vt -0.023431 0.507483 -vt 0.002379 0.492429 -vt -0.007396 0.492436 -vt 0.992604 0.492436 -vt 0.967095 0.507404 -vt 0.976569 0.507483 -vt 0.959789 0.507065 -vt 0.951796 0.506965 -vt 0.929832 0.493395 -vt 0.937050 0.493260 -vt 0.958377 0.507308 -vt 0.934982 0.493051 -vt 0.927590 0.493198 -vt 0.950136 0.507197 -vt 0.891955 0.485492 -vt 0.896648 0.485154 -vt 0.891955 0.491661 -vt 0.896648 0.491466 -vt 0.893897 0.491273 -vt 0.893897 0.484818 -vt 0.889167 0.491481 -vt 0.889167 0.485180 -vt -0.108062 0.491667 -vt 0.108089 0.491669 -vt -0.108062 0.494317 -vt 0.108089 0.494318 -vt 0.110920 0.494194 -vt 0.110920 0.491486 -vt -0.110893 0.494193 -vt -0.110893 0.491485 -vt 0.891938 0.491667 -vt 0.891938 0.494317 -vt 0.889107 0.491485 -vt 0.889107 0.494193 -vt 0.896648 0.514846 -vt 0.891955 0.514508 -vt 0.891955 0.508339 -vt 0.896648 0.508534 -vt 0.893897 0.515182 -vt 0.893897 0.508727 -vt 0.889167 0.508519 -vt 0.889167 0.514820 -vt 0.108089 0.508331 -vt -0.108062 0.508333 -vt -0.108062 0.505683 -vt 0.108089 0.505682 -vt 0.110920 0.508514 -vt 0.110920 0.505806 -vt -0.110893 0.505807 -vt -0.110893 0.508515 -vt 0.891938 0.505683 -vt 0.891938 0.508333 -vt 0.889107 0.508515 -vt 0.889107 0.505807 -vt 0.882447 0.511318 -vt 0.866748 0.512472 -vt 0.896781 0.529478 -vt 0.950673 0.535086 -vt 0.882447 0.515343 -vt 0.950673 0.547420 -vt 0.896781 0.539879 -vt 0.866748 0.516906 -vt 0.912700 0.488150 -vt 0.903517 0.487038 -vt 0.974031 0.489244 -vt 0.988909 0.489119 -vt 0.988909 0.491980 -vt 0.903517 0.490446 -vt 0.974031 0.492072 -vt 0.912700 0.491266 -vt 0.882447 0.484687 -vt 0.866748 0.483127 -vt 0.896781 0.460197 -vt 0.950673 0.452671 -vt 0.882447 0.488712 -vt 0.950673 0.465006 -vt 0.896781 0.470599 -vt 0.866748 0.487561 -vt 0.207654 0.509152 -vt 0.204586 0.509797 -vt 0.192914 0.487773 -vt 0.197618 0.488741 -vt 0.214559 0.509251 -vt 0.205991 0.488555 -vt 0.201940 0.487533 -vt 0.211949 0.509919 -vt 0.165783 0.517557 -vt 0.153447 0.519823 -vt 0.182799 0.485729 -vt 0.189329 0.487043 -vt 0.178016 0.518292 -vt 0.198836 0.486756 -vt 0.193140 0.485343 -vt 0.166757 0.520900 -vt 0.140904 0.522004 -vt 0.121666 0.525076 -vt 0.036040 0.466170 -vt 0.073066 0.468861 -vt 0.155016 0.523506 -vt 0.085415 0.464109 -vt 0.043051 0.459800 -vt 0.136369 0.527371 -vt 0.904700 0.528680 -vt 0.877825 0.524999 -vt 0.966451 0.466053 -vt -0.033549 0.466053 -vt 0.010929 0.465372 -vt -0.095300 0.528680 -vt -0.109429 0.532270 -vt 0.013144 0.458441 -vt -0.040115 0.459603 -vt 0.959885 0.459603 -vt 0.863127 0.527271 -vt 0.890571 0.532270 -vt 0.858543 0.521911 -vt 0.844039 0.519371 -vt 0.816537 0.485862 -vt 0.824053 0.484377 -vt 0.844460 0.523392 -vt 0.812898 0.483867 -vt 0.806278 0.485487 -vt 0.830927 0.520372 -vt 0.790370 0.477655 -vt 0.792782 0.476356 -vt 0.790370 0.487148 -vt 0.792782 0.486399 -vt 0.785866 0.486249 -vt 0.785866 0.476097 -vt 0.783817 0.487022 -vt 0.783817 0.477436 -vt -0.209639 0.487160 -vt 0.209652 0.487164 -vt -0.209639 0.491242 -vt 0.209652 0.491245 -vt 0.216299 0.491158 -vt 0.216299 0.487037 -vt -0.216287 0.491155 -vt -0.216287 0.487032 -vt 0.790361 0.487160 -vt 0.790361 0.491242 -vt 0.783713 0.487032 -vt 0.783713 0.491155 -vt 0.792782 0.523644 -vt 0.790370 0.522345 -vt 0.790370 0.512852 -vt 0.792782 0.513601 -vt 0.785866 0.523903 -vt 0.785866 0.513751 -vt 0.783817 0.512978 -vt 0.783817 0.522564 -vt 0.209652 0.512836 -vt -0.209639 0.512840 -vt -0.209639 0.508758 -vt 0.209652 0.508755 -vt 0.216299 0.512963 -vt 0.216299 0.508842 -vt -0.216287 0.508845 -vt -0.216287 0.512968 -vt 0.790361 0.508758 -vt 0.790361 0.512840 -vt 0.783713 0.512968 -vt 0.783713 0.508845 -vt 0.821799 0.471624 -vt 0.828666 0.469139 -vt 0.914218 0.481969 -vt 0.906572 0.482507 -vt 0.821799 0.476001 -vt 0.906572 0.485212 -vt 0.914218 0.484758 -vt 0.828666 0.473896 -vt 0.916711 0.481814 -vt 0.922278 0.482925 -vt 0.893839 0.484806 -vt 0.887398 0.484039 -vt 0.916711 0.484626 -vt 0.887398 0.486508 -vt 0.893839 0.487157 -vt 0.922278 0.485566 -vt 0.893459 0.484788 -vt 0.888648 0.485158 -vt 0.790660 0.477720 -vt 0.793128 0.476405 -vt 0.893459 0.487142 -vt 0.793128 0.480050 -vt 0.790660 0.481163 -vt 0.888648 0.487455 -vt 0.866947 0.479797 -vt 0.870954 0.479242 -vt 0.899244 0.483050 -vt 0.895383 0.483356 -vt 0.866947 0.482920 -vt 0.895383 0.485931 -vt 0.899244 0.485672 -vt 0.870954 0.482451 -vt 0.814192 0.474974 -vt 0.817143 0.473895 -vt 0.863148 0.478303 -vt 0.859190 0.478934 -vt 0.814192 0.478838 -vt 0.859190 0.482190 -vt 0.863148 0.481656 -vt 0.817143 0.477925 -vt 0.870350 0.477185 -vt 0.877889 0.478226 -vt 0.858475 0.480936 -vt 0.851177 0.480249 -vt 0.870350 0.480710 -vt 0.851177 0.483302 -vt 0.858475 0.483884 -vt 0.877889 0.481591 -vt 0.811983 0.466424 -vt 0.831193 0.468315 -vt 0.807452 0.477046 -vt 0.792993 0.476357 -vt 0.811983 0.471595 -vt 0.792993 0.480009 -vt 0.807452 0.480592 -vt 0.831193 0.473198 -vt 0.422813 0.492577 -vt 0.427775 0.492168 -vt 0.427775 0.493022 -vt 0.422813 0.493386 -vt 0.515538 0.484703 -vt 0.534578 0.484457 -vt 0.534578 0.486151 -vt 0.515538 0.486993 -vt 0.695542 0.485136 -vt 0.711239 0.486183 -vt 0.711239 0.488252 -vt 0.695542 0.487361 -vt 0.427775 0.491792 -vt 0.422813 0.492221 -vt 0.534578 0.483713 -vt 0.381713 0.493524 -vt 0.384644 0.493162 -vt 0.415898 0.492405 -vt 0.420363 0.491986 -vt 0.415665 0.486943 -vt 0.423384 0.485465 -vt 0.499455 0.484648 -vt 0.517529 0.483443 -vt 0.604883 0.466614 -vt 0.649112 0.468055 -vt 0.689591 0.483644 -vt 0.707225 0.484853 -vt 0.384644 0.494187 -vt 0.381713 0.494495 -vt 0.420363 0.493187 -vt 0.415898 0.493543 -vt 0.423384 0.487642 -vt 0.415665 0.488899 -vt 0.517529 0.485922 -vt 0.499455 0.486947 -vt 0.649112 0.472818 -vt 0.604883 0.471590 -vt 0.707225 0.487121 -vt 0.689591 0.486093 -vt 0.384644 0.493475 -vt 0.420363 0.492353 -vt 0.415898 0.492752 -vt 0.423384 0.486129 -vt 0.517529 0.484200 -vt 0.649112 0.469507 -vt 0.707225 0.485546 -vt 0.405062 0.494262 -vt 0.405062 0.493559 -vt 0.404720 0.494409 -vt 0.404720 0.493724 -vt 0.405062 0.493251 -vt 0.404720 0.493424 -vt 0.762654 0.491877 -vt 0.762654 0.490882 -vt 0.762654 0.490445 -vt 0.766441 0.490592 -vt 0.766441 0.491619 -vt 0.766441 0.490141 -vt 0.784854 0.490757 -vt 0.784854 0.491765 -vt 0.783705 0.492033 -vt 0.783705 0.491057 -vt 0.784854 0.490314 -vt 0.783705 0.490628 -vt 0.410375 0.493763 -vt 0.410375 0.494444 -vt 0.410375 0.493464 -vt 0.408011 0.494286 -vt 0.408011 0.493587 -vt 0.408011 0.493279 -vt 0.427775 0.508526 -vt 0.422813 0.508081 -vt 0.427775 0.507707 -vt 0.422813 0.507305 -vt 0.534578 0.516917 -vt 0.515538 0.516558 -vt 0.534578 0.515295 -vt 0.515538 0.514365 -vt 0.711239 0.514957 -vt 0.695542 0.516090 -vt 0.711239 0.512975 -vt 0.695542 0.513958 -vt 0.427775 0.508885 -vt 0.422813 0.508422 -vt 0.534578 0.517630 -vt 0.384644 0.507402 -vt 0.381713 0.507010 -vt 0.415898 0.508222 -vt 0.420363 0.508675 -vt 0.423384 0.515733 -vt 0.415665 0.514134 -vt 0.499455 0.516617 -vt 0.517529 0.517921 -vt 0.649112 0.534564 -vt 0.604883 0.536121 -vt 0.689591 0.517704 -vt 0.707225 0.516395 -vt 0.381713 0.506081 -vt 0.384644 0.506421 -vt 0.420363 0.507525 -vt 0.415898 0.507132 -vt 0.415665 0.512261 -vt 0.423384 0.513649 -vt 0.517529 0.515548 -vt 0.499455 0.514416 -vt 0.604883 0.531362 -vt 0.649112 0.530007 -vt 0.707225 0.514223 -vt 0.689591 0.515359 -vt 0.384644 0.507103 -vt 0.420363 0.508324 -vt 0.381713 0.506727 -vt 0.415898 0.507889 -vt 0.423384 0.515097 -vt 0.517529 0.517197 -vt 0.649112 0.533174 -vt 0.707225 0.515732 -vt 0.405062 0.507011 -vt 0.405062 0.506338 -vt 0.404720 0.506175 -vt 0.404720 0.506831 -vt 0.405062 0.507307 -vt 0.404720 0.507119 -vt 0.762654 0.508972 -vt 0.762654 0.509925 -vt 0.762654 0.510344 -vt 0.766441 0.510240 -vt 0.766441 0.509257 -vt 0.766441 0.510672 -vt 0.784854 0.510061 -vt 0.784854 0.509095 -vt 0.783705 0.508800 -vt 0.783705 0.509734 -vt 0.784854 0.510485 -vt 0.783705 0.510145 -vt 0.410375 0.506789 -vt 0.410375 0.506137 -vt 0.410375 0.507076 -vt 0.408011 0.506311 -vt 0.408011 0.506981 -vt 0.408011 0.507276 -vn 0.000000 -0.000004 1.000000 -vn -0.000003 -0.000001 1.000000 -vn -0.000000 -0.000001 -1.000000 -vn -0.000007 0.000004 -1.000000 -vn 0.000003 -0.000002 1.000000 -vn 0.862019 -0.506876 0.000000 -vn -0.999988 -0.004955 0.000000 -vn -0.882474 0.470362 0.000000 -vn 0.007253 0.999974 0.000000 -vn -0.000000 -0.800158 -0.599790 -vn 0.000000 0.800158 0.599790 -vn 0.000000 -0.783369 0.621556 -vn 0.000000 0.783370 -0.621556 -vn 0.000001 -0.805183 -0.593026 -vn -0.000001 0.805183 0.593027 -vn -0.000000 0.805183 0.593027 -vn 0.000000 -0.796418 0.604747 -vn 0.000000 0.796417 -0.604747 -vn -0.000000 -0.792891 -0.609363 -vn -0.000003 -0.792891 -0.609363 -vn 0.000000 0.792891 0.609363 -vn 0.000004 0.000002 -1.000000 -vn -0.000004 -0.000002 1.000000 -vn -0.000000 0.000001 1.000000 -vn -0.862019 -0.506876 -0.000000 -vn -0.862019 -0.506876 -0.000001 -vn 0.999988 -0.004955 0.000000 -vn 0.882473 0.470363 0.000000 -vn -0.007253 0.999974 0.000003 -vn -0.007255 0.999974 0.000000 -vn -0.999988 -0.004958 0.000000 -vn -0.882473 0.470363 0.000000 -vn -0.882473 0.470363 -0.000001 -vn 0.007255 0.999974 0.000000 -vn -0.007253 0.999974 0.000000 -vn -0.000000 -0.800157 -0.599790 -vn 1.000000 0.000006 -0.000005 -vn 0.000000 -0.783370 0.621556 -vn 0.000000 0.783369 -0.621557 -vn 1.000000 -0.000006 -0.000004 -vn -0.000000 -0.805183 -0.593026 -vn 1.000000 -0.000006 -0.000005 -vn 1.000000 -0.000007 -0.000005 -vn 0.000000 0.000004 -1.000000 -vn 0.892503 0.451040 0.000000 -vn 0.892504 0.451040 -0.000000 -vn 0.864368 0.502860 -0.000023 -vn 0.864371 0.502855 -0.000000 -vn 0.864371 0.502854 0.000000 -vn 0.864369 0.502859 0.000000 -vn -0.000001 -0.000001 -1.000000 -vn -0.000007 -0.000000 -1.000000 -vn -0.000001 -0.000001 1.000000 -vn 0.000001 0.000001 1.000000 -vn -1.000000 -0.000071 -0.000000 -vn 1.000000 0.000063 -0.000000 -vn 0.999810 0.019483 0.000000 -vn -0.999810 -0.019482 -0.000000 -vn 0.999810 0.019482 0.000000 -vn -0.719633 -0.694354 0.000000 -vn -0.000007 -0.000004 1.000000 -vn 0.000007 0.000000 1.000000 -vn -0.719634 -0.694354 0.000000 -vn 0.861480 0.507792 -0.000000 -vn 0.861480 0.507792 -0.000005 -vn -0.862743 -0.505642 -0.000000 -vn -0.862743 -0.505642 0.000005 -vn -0.000006 -0.000004 1.000000 -vn 0.000007 0.000004 -1.000000 -vn 0.012634 -0.999920 0.000009 -vn 0.012635 -0.999920 0.000000 -vn -0.000346 1.000000 -0.000009 -vn -0.000343 1.000000 0.000009 -vn 0.012634 -0.999920 0.000000 -vn -0.000343 1.000000 0.000000 -vn 0.864731 0.502235 -0.000000 -vn 0.864362 0.502869 -0.000023 -vn 0.864363 0.502869 0.000000 -vn -0.864698 -0.502291 -0.000000 -vn -0.864363 -0.502869 -0.000000 -vn 0.871800 0.489863 0.000000 -vn -0.868064 -0.496453 -0.000004 -vn -0.868064 -0.496452 -0.000000 -vn 0.000002 -0.000000 1.000000 -vn -0.771453 0.636287 0.000000 -vn 0.807143 -0.590356 0.000000 -vn 0.892506 0.451036 0.000000 -vn 0.864369 0.502857 0.000000 -vn 0.864370 0.502857 0.000000 -vn 0.000006 -0.000001 1.000000 -vn 0.000003 0.000001 -1.000000 -vn 1.000000 0.000062 -0.000000 -vn 1.000000 0.000063 0.000028 -vn 0.999810 0.019484 0.000000 -vn -0.999810 -0.019483 -0.000000 -vn -0.000008 -0.000004 -1.000000 -vn 0.000008 -0.000000 -1.000000 -vn -0.719630 -0.694358 0.000000 -vn 0.000000 0.000004 1.000000 -vn -0.862744 -0.505641 -0.000005 -vn -0.862744 -0.505641 0.000000 -vn 0.000003 0.000000 1.000000 -vn 0.012638 -0.999920 0.000000 -vn -0.000348 1.000000 0.000000 -vn 0.864731 0.502236 -0.000000 -vn -0.864698 -0.502292 -0.000000 -vn -0.864363 -0.502869 0.000005 -vn -0.000007 -0.000004 -1.000000 -vn 0.000008 0.000004 1.000000 -vn -0.000008 -0.000004 1.000000 -vn -0.000001 -0.000000 1.000000 -vn -0.868065 -0.496451 -0.000024 -vn -0.868064 -0.496452 -0.000011 -vn -0.868064 -0.496453 0.000011 -vn 0.000001 0.000006 -1.000000 -vn 0.000008 0.000007 -1.000000 -vn 0.807148 -0.590349 0.000000 -vn -0.771453 0.636287 -0.000013 -vn -0.771455 0.636284 0.000000 -s off -f 8530/2599/105 8532/2600/105 8533/2601/105 -f 8530/2599/105 8533/2601/105 8531/2602/105 -f 8534/2603/21 8535/2604/21 8537/2605/21 -f 8537/2605/21 8536/2606/21 8534/2603/21 -f 8530/2599/331 8531/2602/331 8535/2604/331 -f 8530/2599/933 8535/2604/933 8534/2603/933 -f 8533/2601/3 8532/2600/3 8536/2606/3 -f 8536/2606/2204 8537/2605/2204 8533/2601/2204 -f 8538/2607/353 8540/2608/353 8541/2609/353 -f 8541/2609/353 8539/2610/353 8538/2607/353 -f 8542/2611/21 8543/2612/21 8545/2613/21 -f 8545/2613/21 8544/2614/21 8542/2611/21 -f 8538/2607/63 8539/2610/63 8543/2612/63 -f 8543/2612/63 8542/2611/63 8538/2607/63 -f 8541/2609/2231 8540/2608/2231 8544/2614/2231 -f 8544/2614/2231 8545/2613/2231 8541/2609/2231 -f 8546/2615/105 8548/2616/105 8549/2617/105 -f 8549/2617/105 8547/2618/105 8546/2615/105 -f 8550/2619/3720 8551/2620/3720 8553/2621/3720 -f 8553/2621/3720 8552/2622/3720 8550/2619/3720 -f 8546/2615/3 8547/2618/3 8551/2620/3 -f 8551/2620/2204 8550/2619/2204 8546/2615/2204 -f 8549/2617/331 8548/2616/331 8552/2622/331 -f 8552/2622/1571 8553/2621/1571 8549/2617/1571 -f 8554/2623/105 8556/2624/105 8557/2625/105 -f 8557/2625/105 8555/2626/105 8554/2623/105 -f 8558/2627/21 8559/2628/21 8561/2629/21 -f 8561/2629/21 8560/2630/21 8558/2627/21 -f 8554/2623/933 8555/2626/933 8559/2628/933 -f 8559/2628/1571 8558/2627/1571 8554/2623/1571 -f 8557/2625/2204 8556/2624/2204 8560/2630/2204 -f 8560/2630/3 8561/2629/3 8557/2625/3 -f 8562/2631/105 8564/2632/105 8565/2633/105 -f 8565/2633/105 8563/2634/105 8562/2631/105 -f 8566/2635/21 8567/2636/21 8569/2637/21 -f 8569/2637/21 8568/2638/21 8566/2635/21 -f 8562/2631/1571 8563/2634/1571 8567/2636/1571 -f 8567/2636/331 8566/2635/331 8562/2631/331 -f 8565/2633/2204 8564/2632/2204 8568/2638/2204 -f 8568/2638/2220 8569/2637/2220 8565/2633/2220 -f 8570/2639/105 8572/2640/105 8573/2641/105 -f 8573/2641/105 8571/2642/105 8570/2639/105 -f 8574/2643/21 8575/2644/21 8577/2645/21 -f 8577/2645/21 8576/2646/21 8574/2643/21 -f 8570/2639/63 8571/2642/63 8575/2644/63 -f 8575/2644/63 8574/2643/63 8570/2639/63 -f 8573/2641/7 8572/2640/7 8576/2646/7 -f 8576/2646/7 8577/2645/7 8573/2641/7 -f 8578/2647/105 8580/2648/105 8581/2649/105 -f 8581/2649/105 8579/2650/105 8578/2647/105 -f 8582/2651/21 8583/2652/21 8585/2653/21 -f 8585/2653/3721 8584/2654/3721 8582/2651/3721 -f 8578/2647/63 8579/2650/63 8583/2652/63 -f 8583/2652/63 8582/2651/63 8578/2647/63 -f 8581/2649/7 8580/2648/7 8584/2654/7 -f 8584/2654/7 8585/2653/7 8581/2649/7 -f 8588/2655/3722 8586/2656/3722 8589/2657/3722 -f 8587/2658/3723 8589/2657/3723 8586/2656/3723 -f 8591/2659/3724 8590/2660/3724 8593/2661/3724 -f 8592/2662/21 8593/2661/21 8590/2660/21 -f 8587/2658/3725 8586/2656/3725 8591/2659/3725 -f 8590/2660/3725 8591/2659/3725 8586/2656/3725 -f 8589/2657/3726 8587/2658/3726 8593/2661/3726 -f 8591/2659/3726 8593/2661/3726 8587/2658/3726 -f 8588/2655/3727 8589/2657/3727 8592/2662/3727 -f 8593/2661/3727 8592/2662/3727 8589/2657/3727 -f 8586/2656/3728 8588/2655/3728 8590/2660/3728 -f 8592/2662/3728 8590/2660/3728 8588/2655/3728 -f 8594/2663/7 8596/2664/7 8597/2665/7 -f 8597/2665/7 8595/2666/7 8594/2663/7 -f 8598/2667/63 8599/2668/63 8601/2669/63 -f 8601/2669/63 8600/2670/63 8598/2667/63 -f 8594/2663/3729 8595/2666/3729 8599/2668/3729 -f 8599/2668/3729 8598/2667/3729 8594/2663/3729 -f 8597/2665/3730 8596/2664/3730 8600/2670/3730 -f 8600/2670/3730 8601/2669/3730 8597/2665/3730 -f 8602/2671/7 8604/2672/7 8605/2673/7 -f 8605/2673/7 8603/2674/7 8602/2671/7 -f 8606/2675/63 8607/2676/63 8609/2677/63 -f 8609/2677/63 8608/2678/63 8606/2675/63 -f 8602/2671/3731 8603/2674/3731 8607/2676/3731 -f 8607/2676/3731 8606/2675/3731 8602/2671/3731 -f 8605/2673/3732 8604/2672/3732 8608/2678/3732 -f 8608/2678/3732 8609/2677/3732 8605/2673/3732 -f 8610/2679/7 8612/2680/7 8613/2681/7 -f 8613/2681/7 8611/2682/7 8610/2679/7 -f 8614/2683/63 8615/2684/63 8617/2685/63 -f 8617/2685/63 8616/2686/63 8614/2683/63 -f 8610/2679/3733 8611/2682/3733 8615/2684/3733 -f 8615/2684/3733 8614/2683/3733 8610/2679/3733 -f 8613/2681/3734 8612/2680/3734 8616/2686/3734 -f 8616/2686/3735 8617/2685/3735 8613/2681/3735 -f 8618/2687/7 8620/2688/7 8621/2689/7 -f 8959/2690/7 8619/2691/7 8960/2692/7 -f 8622/2693/63 8623/2694/63 8625/2695/63 -f 8961/2696/63 8624/2697/63 8962/2698/63 -f 8963/2692/3736 8619/2691/3736 8623/2694/3736 -f 8623/2694/3736 8622/2693/3736 8964/2692/3736 -f 8621/2689/3737 8620/2688/3737 8624/2697/3737 -f 8624/2697/3737 8965/2696/3737 8621/2689/3737 -f 8626/2699/7 8628/2700/7 8629/2701/7 -f 8629/2701/7 8627/2702/7 8626/2699/7 -f 8630/2703/63 8631/2704/63 8633/2705/63 -f 8633/2705/63 8632/2706/63 8630/2703/63 -f 8626/2699/3738 8627/2702/3738 8631/2704/3738 -f 8631/2704/3739 8630/2703/3739 8626/2699/3739 -f 8629/2701/3740 8628/2700/3740 8632/2706/3740 -f 8632/2706/3740 8633/2705/3740 8629/2701/3740 -f 8636/2707/7 8634/2708/7 8637/2709/7 -f 8635/2710/7 8637/2709/7 8634/2708/7 -f 8639/2711/63 8638/2712/63 8641/2713/63 -f 8640/2714/63 8641/2713/63 8638/2712/63 -f 8635/2710/3 8634/2708/3 8639/2711/3 -f 8638/2712/3 8639/2711/3 8634/2708/3 -f 8637/2709/3720 8635/2710/3720 8641/2713/3720 -f 8639/2711/3720 8641/2713/3720 8635/2710/3720 -f 8636/2707/331 8637/2709/331 8640/2714/331 -f 8641/2713/331 8640/2714/331 8637/2709/331 -f 8634/2708/105 8636/2707/105 8638/2712/105 -f 8640/2714/105 8638/2712/105 8636/2707/105 -f 8644/2715/7 8642/2716/7 8645/2717/7 -f 8643/2718/7 8645/2717/7 8642/2716/7 -f 8647/2719/63 8646/2720/63 8649/2721/63 -f 8648/2722/63 8649/2721/63 8646/2720/63 -f 8643/2718/2204 8642/2716/2204 8647/2719/2204 -f 8646/2720/2204 8647/2719/2204 8642/2716/2204 -f 8645/2717/2228 8643/2718/2228 8649/2721/2228 -f 8647/2719/2228 8649/2721/2228 8643/2718/2228 -f 8966/2723/331 8967/2724/331 8968/2725/331 -f 8969/2726/331 8970/2725/331 8971/2724/331 -f 8642/2716/356 8644/2715/356 8646/2720/356 -f 8648/2722/356 8646/2720/356 8644/2715/356 -f 8650/2727/7 8652/2728/7 8653/2729/7 -f 8653/2729/7 8651/2730/7 8650/2727/7 -f 8654/2731/63 8655/2732/63 8657/2733/63 -f 8657/2733/63 8656/2734/63 8654/2731/63 -f 8650/2727/3 8651/2730/3 8655/2732/3 -f 8655/2732/3 8654/2731/3 8650/2727/3 -f 8651/2730/105 8653/2729/105 8657/2733/105 -f 8657/2733/105 8655/2732/105 8651/2730/105 -f 8653/2729/331 8652/2728/331 8656/2734/331 -f 8656/2734/331 8657/2733/331 8653/2729/331 -f 8652/2728/21 8650/2727/21 8654/2731/21 -f 8654/2731/21 8656/2734/21 8652/2728/21 -f 8658/2735/7 8660/2736/7 8661/2737/7 -f 8661/2737/7 8659/2738/7 8658/2735/7 -f 8662/2739/63 8663/2740/63 8665/2741/63 -f 8665/2741/63 8664/2742/63 8662/2739/63 -f 8658/2735/3 8659/2738/3 8663/2740/3 -f 8663/2740/3 8662/2739/3 8658/2735/3 -f 8659/2738/105 8661/2737/105 8665/2741/105 -f 8665/2741/105 8663/2740/105 8659/2738/105 -f 8972/2743/933 8973/2744/933 8974/2745/933 -f 8975/2745/3037 8976/2746/3037 8977/2743/3037 -f 8660/2736/2228 8658/2735/2228 8662/2739/2228 -f 8662/2739/2228 8664/2742/2228 8660/2736/2228 -f 8666/2747/3722 8668/2748/3722 8669/2749/3722 -f 8669/2749/3741 8667/2750/3741 8666/2747/3741 -f 8670/2751/3742 8671/2752/3742 8673/2753/3742 -f 8673/2753/3743 8672/2754/3743 8670/2751/3743 -f 8666/2747/3744 8667/2750/3744 8671/2752/3744 -f 8671/2752/3745 8670/2751/3745 8666/2747/3745 -f 8667/2750/3746 8669/2749/3746 8673/2753/3746 -f 8673/2753/3746 8671/2752/3746 8667/2750/3746 -f 8669/2749/3747 8668/2748/3747 8672/2754/3747 -f 8672/2754/3747 8673/2753/3747 8669/2749/3747 -f 8668/2748/3748 8666/2747/3748 8670/2751/3748 -f 8670/2751/3749 8672/2754/3749 8668/2748/3749 -f 8676/2755/105 8674/2756/105 8677/2757/105 -f 8675/2758/105 8677/2757/105 8674/2756/105 -f 8679/2759/21 8678/2760/21 8681/2761/21 -f 8680/2762/21 8681/2761/21 8678/2760/21 -f 8675/2758/3725 8674/2756/3725 8679/2759/3725 -f 8678/2760/3725 8679/2759/3725 8674/2756/3725 -f 8677/2757/3750 8675/2758/3750 8681/2761/3750 -f 8679/2759/3750 8681/2761/3750 8675/2758/3750 -f 8676/2755/3751 8677/2757/3751 8680/2762/3751 -f 8681/2761/3752 8680/2762/3752 8677/2757/3752 -f 8674/2756/3753 8676/2755/3753 8678/2760/3753 -f 8680/2762/3753 8678/2760/3753 8676/2755/3753 -f 8682/2763/105 8684/2764/105 8685/2765/105 -f 8685/2765/105 8683/2766/105 8682/2763/105 -f 8686/2767/21 8687/2768/21 8689/2769/21 -f 8689/2769/21 8688/2770/21 8686/2767/21 -f 8682/2763/3744 8683/2766/3744 8687/2768/3744 -f 8687/2768/3744 8686/2767/3744 8682/2763/3744 -f 8683/2766/3746 8685/2765/3746 8689/2769/3746 -f 8689/2769/3746 8687/2768/3746 8683/2766/3746 -f 8685/2765/3747 8684/2764/3747 8688/2770/3747 -f 8688/2770/3747 8689/2769/3747 8685/2765/3747 -f 8684/2764/3754 8682/2763/3754 8686/2767/3754 -f 8686/2767/3754 8688/2770/3754 8684/2764/3754 -f 8690/2771/7 8692/2772/7 8693/2773/7 -f 8693/2773/7 8691/2774/7 8690/2771/7 -f 8694/2775/63 8695/2776/63 8697/2777/63 -f 8697/2777/63 8696/2778/63 8694/2775/63 -f 8690/2771/3755 8691/2774/3755 8695/2776/3755 -f 8695/2776/3755 8694/2775/3755 8690/2771/3755 -f 8693/2773/3730 8692/2772/3730 8696/2778/3730 -f 8696/2778/3730 8697/2777/3730 8693/2773/3730 -f 8698/2779/7 8700/2780/7 8701/2781/7 -f 8701/2781/7 8699/2782/7 8698/2779/7 -f 8702/2783/3756 8703/2784/3756 8705/2785/3756 -f 8705/2785/235 8704/2786/235 8702/2783/235 -f 8698/2779/3757 8699/2782/3757 8703/2784/3757 -f 8703/2784/3757 8702/2783/3757 8698/2779/3757 -f 8701/2781/3758 8700/2780/3758 8704/2786/3758 -f 8704/2786/3758 8705/2785/3758 8701/2781/3758 -f 8706/2787/7 8708/2788/7 8709/2789/7 -f 8709/2789/7 8707/2790/7 8706/2787/7 -f 8710/2791/3759 8711/2792/3759 8713/2793/3759 -f 8713/2793/3759 8712/2794/3759 8710/2791/3759 -f 8706/2787/3760 8707/2790/3760 8711/2792/3760 -f 8711/2792/3760 8710/2791/3760 8706/2787/3760 -f 8709/2789/3735 8708/2788/3735 8712/2794/3735 -f 8712/2794/3735 8713/2793/3735 8709/2789/3735 -f 8714/2795/7 8716/2796/7 8717/2797/7 -f 8978/2798/7 8715/2799/7 8979/2800/7 -f 8718/2801/63 8719/2802/63 8721/2803/63 -f 8980/2804/63 8720/2805/63 8981/2806/63 -f 8982/2800/3736 8715/2799/3736 8719/2802/3736 -f 8719/2802/3736 8718/2801/3736 8983/2800/3736 -f 8717/2797/3737 8716/2796/3737 8720/2805/3737 -f 8720/2805/3737 8984/2804/3737 8717/2797/3737 -f 8722/2807/7 8724/2808/7 8725/2809/7 -f 8725/2809/7 8723/2810/7 8722/2807/7 -f 8726/2811/3761 8727/2812/3761 8729/2813/3761 -f 8729/2813/3762 8728/2814/3762 8726/2811/3762 -f 8722/2807/3738 8723/2810/3738 8727/2812/3738 -f 8727/2812/3738 8726/2811/3738 8722/2807/3738 -f 8725/2809/3740 8724/2808/3740 8728/2814/3740 -f 8728/2814/3740 8729/2813/3740 8725/2809/3740 -f 8732/2815/7 8730/2816/7 8733/2817/7 -f 8731/2818/7 8733/2817/7 8730/2816/7 -f 8735/2819/63 8734/2820/63 8737/2821/63 -f 8736/2822/63 8737/2821/63 8734/2820/63 -f 8731/2818/3 8730/2816/3 8735/2819/3 -f 8734/2820/3 8735/2819/3 8730/2816/3 -f 8733/2817/3720 8731/2818/3720 8737/2821/3720 -f 8735/2819/3720 8737/2821/3720 8731/2818/3720 -f 8732/2815/243 8733/2817/243 8736/2822/243 -f 8737/2821/243 8736/2822/243 8733/2817/243 -f 8730/2816/3763 8732/2815/3763 8734/2820/3763 -f 8736/2822/3763 8734/2820/3763 8732/2815/3763 -f 8740/2823/7 8738/2824/7 8741/2825/7 -f 8739/2826/7 8741/2825/7 8738/2824/7 -f 8743/2827/63 8742/2828/63 8745/2829/63 -f 8744/2830/63 8745/2829/63 8742/2828/63 -f 8739/2826/2204 8738/2824/2204 8743/2827/2204 -f 8742/2828/2204 8743/2827/2204 8738/2824/2204 -f 8741/2825/2228 8739/2826/2228 8745/2829/2228 -f 8743/2827/2228 8745/2829/2228 8739/2826/2228 -f 8985/2831/331 8986/2832/331 8987/2833/331 -f 8988/2834/331 8989/2833/331 8990/2832/331 -f 8738/2824/356 8740/2823/356 8742/2828/356 -f 8744/2830/356 8742/2828/356 8740/2823/356 -f 8746/2835/7 8748/2836/7 8749/2837/7 -f 8749/2837/7 8747/2838/7 8746/2835/7 -f 8750/2839/63 8751/2840/63 8753/2841/63 -f 8753/2841/63 8752/2842/63 8750/2839/63 -f 8746/2835/252 8747/2838/252 8751/2840/252 -f 8751/2840/252 8750/2839/252 8746/2835/252 -f 8747/2838/3763 8749/2837/3763 8753/2841/3763 -f 8753/2841/3763 8751/2840/3763 8747/2838/3763 -f 8749/2837/2089 8748/2836/2089 8752/2842/2089 -f 8752/2842/2089 8753/2841/2089 8749/2837/2089 -f 8748/2836/21 8746/2835/21 8750/2839/21 -f 8750/2839/21 8752/2842/21 8748/2836/21 -f 8754/2843/7 8756/2844/7 8757/2845/7 -f 8757/2845/7 8755/2846/7 8754/2843/7 -f 8758/2847/63 8759/2848/63 8761/2849/63 -f 8761/2849/63 8760/2850/63 8758/2847/63 -f 8754/2843/3 8755/2846/3 8759/2848/3 -f 8759/2848/3 8758/2847/3 8754/2843/3 -f 8755/2846/105 8757/2845/105 8761/2849/105 -f 8761/2849/105 8759/2848/105 8755/2846/105 -f 8991/2851/331 8992/2852/331 8993/2853/331 -f 8994/2853/331 8995/2854/331 8996/2851/331 -f 8756/2844/2228 8754/2843/2228 8758/2847/2228 -f 8758/2847/2228 8760/2850/2228 8756/2844/2228 -f 8762/2855/105 8764/2856/105 8765/2857/105 -f 8765/2857/105 8763/2858/105 8762/2855/105 -f 8766/2859/21 8767/2860/21 8769/2861/21 -f 8769/2861/21 8768/2862/21 8766/2859/21 -f 8762/2855/1571 8763/2858/1571 8767/2860/1571 -f 8767/2860/331 8766/2859/331 8762/2855/331 -f 8765/2857/3 8764/2856/3 8768/2862/3 -f 8768/2862/3 8769/2861/3 8765/2857/3 -f 8770/2863/353 8772/2864/353 8773/2865/353 -f 8773/2865/353 8771/2866/353 8770/2863/353 -f 8774/2867/2228 8775/2868/2228 8777/2869/2228 -f 8777/2869/2228 8776/2870/2228 8774/2867/2228 -f 8770/2863/63 8771/2866/63 8775/2868/63 -f 8775/2868/63 8774/2867/63 8770/2863/63 -f 8773/2865/7 8772/2864/7 8776/2870/7 -f 8776/2870/7 8777/2869/7 8773/2865/7 -f 8778/2871/105 8780/2872/105 8781/2873/105 -f 8781/2873/105 8779/2874/105 8778/2871/105 -f 8782/2875/21 8783/2876/21 8785/2877/21 -f 8785/2877/21 8784/2878/21 8782/2875/21 -f 8778/2871/3 8779/2874/3 8783/2876/3 -f 8783/2876/3 8782/2875/3 8778/2871/3 -f 8781/2873/331 8780/2872/331 8784/2878/331 -f 8784/2878/331 8785/2877/331 8781/2873/331 -f 8786/2879/105 8788/2880/105 8789/2881/105 -f 8789/2881/105 8787/2882/105 8786/2879/105 -f 8790/2883/21 8791/2884/21 8793/2885/21 -f 8793/2885/21 8792/2886/21 8790/2883/21 -f 8786/2879/1571 8787/2882/1571 8791/2884/1571 -f 8791/2884/331 8790/2883/331 8786/2879/331 -f 8789/2881/3 8788/2880/3 8792/2886/3 -f 8792/2886/3 8793/2885/3 8789/2881/3 -f 8794/2887/105 8796/2888/105 8797/2889/105 -f 8797/2889/105 8795/2890/105 8794/2887/105 -f 8798/2891/21 8799/2892/21 8801/2893/21 -f 8801/2893/21 8800/2894/21 8798/2891/21 -f 8794/2887/331 8795/2890/331 8799/2892/331 -f 8799/2892/933 8798/2891/933 8794/2887/933 -f 8797/2889/2204 8796/2888/2204 8800/2894/2204 -f 8800/2894/2204 8801/2893/2204 8797/2889/2204 -f 8802/2895/105 8804/2896/105 8805/2897/105 -f 8805/2897/105 8803/2898/105 8802/2895/105 -f 8806/2899/21 8807/2900/21 8809/2901/21 -f 8809/2901/21 8808/2902/21 8806/2899/21 -f 8802/2895/63 8803/2898/63 8807/2900/63 -f 8807/2900/63 8806/2899/63 8802/2895/63 -f 8805/2897/7 8804/2896/7 8808/2902/7 -f 8808/2902/7 8809/2901/7 8805/2897/7 -f 8810/2903/105 8812/2904/105 8813/2905/105 -f 8813/2905/105 8811/2906/105 8810/2903/105 -f 8814/2907/21 8815/2908/21 8817/2909/21 -f 8817/2909/21 8816/2910/21 8814/2907/21 -f 8810/2903/274 8811/2906/274 8815/2908/274 -f 8815/2908/274 8814/2907/274 8810/2903/274 -f 8813/2905/7 8812/2904/7 8816/2910/7 -f 8816/2910/7 8817/2909/7 8813/2905/7 -f 8850/2911/3764 8849/2912/3764 8851/2913/3764 -f 8851/2913/3765 8852/2914/3765 8850/2911/3765 -f 8854/2915/3766 8853/2916/3766 8855/2917/3766 -f 8855/2917/3767 8856/2918/3767 8854/2915/3767 -f 8858/2919/3768 8857/2920/3768 8859/2921/3768 -f 8859/2921/3768 8860/2922/3768 8858/2919/3768 -f 8849/2912/3764 8850/2911/3764 8861/2923/3764 -f 8862/2924/3764 8861/2923/3764 8850/2911/3764 -f 8853/2916/3769 8854/2915/3769 8863/2925/3769 -f 8818/2926/105 8828/2927/105 8834/2928/105 -f 8833/2929/105 8834/2928/105 8828/2927/105 -f 8829/2930/105 8830/2931/105 8836/2932/105 -f 8835/2933/105 8836/2932/105 8830/2931/105 -f 8831/2934/3770 8832/2935/3770 8838/2936/3770 -f 8837/2937/3771 8838/2936/3771 8832/2935/3771 -f 8823/2938/3715 8822/2939/3715 8840/2940/3715 -f 8839/2941/3772 8840/2940/3772 8822/2939/3772 -f 8825/2942/21 8824/2943/21 8842/2944/21 -f 8841/2945/21 8842/2944/21 8824/2943/21 -f 8827/2946/3773 8826/2947/3773 8844/2948/3773 -f 8843/2949/3773 8844/2948/3773 8826/2947/3773 -f 8819/2950/3774 8823/2938/3774 8845/2951/3774 -f 8840/2940/3774 8845/2951/3774 8823/2938/3774 -f 8822/2939/3775 8818/2926/3775 8839/2941/3775 -f 8846/2952/3775 8839/2941/3775 8818/2926/3775 -f 8836/2932/3776 8841/2945/3776 8824/2943/3776 -f 8820/2953/3777 8825/2942/3777 8847/2954/3777 -f 8842/2944/3777 8847/2954/3777 8825/2942/3777 -f 8838/2936/3778 8843/2949/3778 8826/2947/3778 -f 8821/2955/3777 8827/2946/3777 8848/2956/3777 -f 8844/2948/3777 8848/2956/3777 8827/2946/3777 -f 8834/2928/3775 8846/2952/3775 8818/2926/3775 -f 8828/2927/3774 8819/2950/3774 8833/2929/3774 -f 8845/2951/3774 8833/2929/3774 8819/2950/3774 -f 8824/2943/3776 8829/2930/3776 8836/2932/3776 -f 8830/2931/3777 8820/2953/3777 8835/2933/3777 -f 8847/2954/3777 8835/2933/3777 8820/2953/3777 -f 8826/2947/3778 8831/2934/3778 8838/2936/3778 -f 8832/2935/3777 8821/2955/3777 8837/2937/3777 -f 8848/2956/3777 8837/2937/3777 8821/2955/3777 -f 8840/2940/21 8839/2941/21 8851/2913/21 -f 8852/2914/21 8851/2913/21 8839/2941/21 -f 8883/2957/3779 8882/2958/3779 8884/2959/3779 -f 8885/2960/3779 8884/2959/3779 8882/2958/3779 -f 8842/2944/3780 8841/2945/3780 8855/2917/3780 -f 8856/2918/3781 8855/2917/3781 8841/2945/3781 -f 8844/2948/3780 8843/2949/3780 8859/2921/3780 -f 8860/2922/3781 8859/2921/3781 8843/2949/3781 -f 8834/2928/105 8833/2929/105 8862/2924/105 -f 8861/2923/105 8862/2924/105 8833/2929/105 -f 8882/2958/3782 8886/2961/3782 8885/2960/3782 -f 8887/2962/3782 8885/2960/3782 8886/2961/3782 -f 8836/2932/105 8835/2933/105 8854/2915/105 -f 8863/2925/3763 8854/2915/3763 8835/2933/3763 -f 8838/2936/3763 8837/2937/3763 8858/2919/3763 -f 8857/2920/3763 8858/2919/3763 8837/2937/3763 -f 8859/2921/3783 8857/2920/3783 8865/2963/3783 -f 8864/2964/3784 8865/2963/3784 8857/2920/3784 -f 8866/2965/3783 8864/2964/3783 8857/2920/3783 -f 8848/2956/3785 8844/2948/3785 8868/2966/3785 -f 8867/2967/3786 8868/2966/3786 8844/2948/3786 -f 8837/2937/3785 8848/2956/3785 8869/2968/3785 -f 8868/2966/3785 8869/2968/3785 8848/2956/3785 -f 8844/2948/3787 8859/2921/3787 8867/2967/3787 -f 8865/2963/21 8867/2967/21 8859/2921/21 -f 8857/2920/3788 8837/2937/3788 8866/2965/3788 -f 8869/2968/2446 8866/2965/2446 8837/2937/2446 -f 8868/2966/3789 8867/2967/3789 8871/2969/3789 -f 8870/2970/3790 8871/2969/3790 8867/2967/3790 -f 8865/2963/3791 8864/2964/3791 8873/2971/3791 -f 8872/2972/3792 8873/2971/3792 8864/2964/3792 -f 8867/2967/21 8865/2963/21 8870/2970/21 -f 8873/2971/21 8870/2970/21 8865/2963/21 -f 8869/2968/3793 8868/2966/3793 8874/2973/3793 -f 8871/2969/3793 8874/2973/3793 8868/2966/3793 -f 8866/2965/105 8869/2968/105 8875/2974/105 -f 8874/2973/105 8875/2974/105 8869/2968/105 -f 8864/2964/3794 8866/2965/3794 8872/2972/3794 -f 8875/2974/3794 8872/2972/3794 8866/2965/3794 -f 8851/2913/3795 8849/2912/3795 8856/2918/3795 -f 8854/2915/3795 8856/2918/3795 8849/2912/3795 -f 8855/2917/3796 8853/2916/3796 8860/2922/3796 -f 8858/2919/3797 8860/2922/3797 8853/2916/3797 -f 8849/2912/3795 8861/2923/3795 8854/2915/3795 -f 8853/2916/3797 8863/2925/3797 8858/2919/3797 -f 8845/2951/3798 8840/2940/3798 8836/2932/3798 -f 8841/2945/3798 8836/2932/3798 8840/2940/3798 -f 8847/2954/3799 8842/2944/3799 8838/2936/3799 -f 8843/2949/3799 8838/2936/3799 8842/2944/3799 -f 8833/2929/3798 8845/2951/3798 8836/2932/3798 -f 8835/2933/3799 8847/2954/3799 8838/2936/3799 -f 8840/2940/21 8851/2913/21 8841/2945/21 -f 8856/2918/21 8841/2945/21 8851/2913/21 -f 8842/2944/3787 8855/2917/3787 8843/2949/3787 -f 8860/2922/21 8843/2949/21 8855/2917/21 -f 8861/2923/105 8833/2929/105 8854/2915/105 -f 8836/2932/105 8854/2915/105 8833/2929/105 -f 8863/2925/3788 8835/2933/3788 8858/2919/3788 -f 8838/2936/3788 8858/2919/3788 8835/2933/3788 -f 8850/2911/3800 8852/2914/3800 8877/2975/3800 -f 8876/2976/3800 8877/2975/3800 8852/2914/3800 -f 8862/2924/3800 8850/2911/3800 8878/2977/3800 -f 8877/2975/3800 8878/2977/3800 8850/2911/3800 -f 8839/2941/3801 8846/2952/3801 8880/2978/3801 -f 8879/2979/3802 8880/2978/3802 8846/2952/3802 -f 8846/2952/3802 8834/2928/3802 8879/2979/3802 -f 8881/2980/3802 8879/2979/3802 8834/2928/3802 -f 8852/2914/3803 8839/2941/3803 8876/2976/3803 -f 8880/2978/357 8876/2976/357 8839/2941/357 -f 8834/2928/105 8862/2924/105 8881/2980/105 -f 8878/2977/105 8881/2980/105 8862/2924/105 -f 8880/2978/3804 8879/2979/3804 8883/2957/3804 -f 8882/2958/3804 8883/2957/3804 8879/2979/3804 -f 8876/2976/21 8880/2978/21 8884/2959/21 -f 8883/2957/21 8884/2959/21 8880/2978/21 -f 8877/2975/3805 8876/2976/3805 8885/2960/3805 -f 8884/2959/3805 8885/2960/3805 8876/2976/3805 -f 8879/2979/3804 8881/2980/3804 8882/2958/3804 -f 8886/2961/3804 8882/2958/3804 8881/2980/3804 -f 8878/2977/3805 8877/2975/3805 8887/2962/3805 -f 8885/2960/3805 8887/2962/3805 8877/2975/3805 -f 8881/2980/105 8878/2977/105 8886/2961/105 -f 8887/2962/105 8886/2961/105 8878/2977/105 -f 8920/2981/3806 8921/2982/3806 8922/2983/3806 -f 8923/2984/3806 8922/2983/3806 8921/2982/3806 -f 8924/2985/3807 8925/2986/3807 8926/2987/3807 -f 8927/2988/3808 8926/2987/3808 8925/2986/3808 -f 8928/2989/3768 8929/2990/3768 8930/2991/3768 -f 8931/2992/3768 8930/2991/3768 8929/2990/3768 -f 8921/2982/3806 8920/2981/3806 8932/2993/3806 -f 8932/2993/3806 8933/2994/3806 8921/2982/3806 -f 8925/2986/3807 8924/2985/3807 8934/2995/3807 -f 8899/2996/3715 8898/2997/3715 8905/2998/3715 -f 8905/2998/3772 8904/2999/3772 8899/2996/3772 -f 8901/3000/21 8900/3001/21 8907/3002/21 -f 8907/3002/3809 8906/3003/3809 8901/3000/3809 -f 8903/3004/3773 8902/3005/3773 8909/3006/3773 -f 8909/3006/3773 8908/3007/3773 8903/3004/3773 -f 8892/3008/3810 8893/3009/3810 8911/3010/3810 -f 8911/3010/3810 8910/3011/3810 8892/3008/3810 -f 8894/3012/354 8895/3013/354 8913/3014/354 -f 8913/3014/354 8912/3015/354 8894/3012/354 -f 8896/3016/354 8897/3017/354 8915/3018/354 -f 8915/3018/354 8914/3019/354 8896/3016/354 -f 8893/3009/3774 8889/3020/3774 8916/3021/3774 -f 8916/3021/3774 8911/3010/3774 8893/3009/3774 -f 8888/3022/3811 8892/3008/3811 8910/3011/3811 -f 8910/3011/3812 8917/3023/3812 8888/3022/3812 -f 8912/3015/3813 8907/3002/3813 8894/3012/3813 -f 8895/3013/3814 8890/3024/3814 8918/3025/3814 -f 8918/3025/3814 8913/3014/3814 8895/3013/3814 -f 8914/3019/3776 8909/3006/3776 8896/3016/3776 -f 8897/3017/3814 8891/3026/3814 8919/3027/3814 -f 8919/3027/3814 8915/3018/3814 8897/3017/3814 -f 8898/2997/3775 8888/3022/3775 8917/3023/3775 -f 8917/3023/3775 8905/2998/3775 8898/2997/3775 -f 8889/3020/3774 8899/2996/3774 8904/2999/3774 -f 8904/2999/3774 8916/3021/3774 8889/3020/3774 -f 8900/3001/3813 8894/3012/3813 8907/3002/3813 -f 8890/3024/3814 8901/3000/3814 8906/3003/3814 -f 8906/3003/3814 8918/3025/3814 8890/3024/3814 -f 8902/3005/3776 8896/3016/3776 8909/3006/3776 -f 8891/3026/3814 8903/3004/3814 8908/3007/3814 -f 8908/3007/3814 8919/3027/3814 8891/3026/3814 -f 8910/3011/3815 8911/3010/3815 8922/2983/3815 -f 8922/2983/3816 8923/2984/3816 8910/3011/3816 -f 8953/3028/3817 8954/3029/3817 8955/3030/3817 -f 8955/3030/3817 8956/3031/3817 8953/3028/3817 -f 8912/3015/105 8913/3014/105 8926/2987/105 -f 8926/2987/105 8927/2988/105 8912/3015/105 -f 8914/3019/105 8915/3018/105 8930/2991/105 -f 8930/2991/105 8931/2992/105 8914/3019/105 -f 8904/2999/21 8905/2998/21 8933/2994/21 -f 8933/2994/3818 8932/2993/3818 8904/2999/3818 -f 8957/3032/3817 8953/3028/3817 8956/3031/3817 -f 8956/3031/3817 8958/3033/3817 8957/3032/3817 -f 8906/3003/3720 8907/3002/3720 8925/2986/3720 -f 8925/2986/21 8934/2995/21 8906/3003/21 -f 8908/3007/21 8909/3006/21 8929/2990/21 -f 8929/2990/21 8928/2989/21 8908/3007/21 -f 8928/2989/3783 8930/2991/3783 8936/3034/3783 -f 8936/3034/3783 8935/3035/3783 8928/2989/3783 -f 8935/3035/3783 8937/3036/3783 8928/2989/3783 -f 8915/3018/3819 8919/3027/3819 8939/3037/3819 -f 8939/3037/3820 8938/3038/3820 8915/3018/3820 -f 8919/3027/3820 8908/3007/3820 8940/3039/3820 -f 8940/3039/3820 8939/3037/3820 8919/3027/3820 -f 8930/2991/105 8915/3018/105 8938/3038/105 -f 8938/3038/105 8936/3034/105 8930/2991/105 -f 8908/3007/3821 8928/2989/3821 8937/3036/3821 -f 8937/3036/365 8940/3039/365 8908/3007/365 -f 8938/3038/3822 8939/3037/3822 8942/3040/3822 -f 8942/3040/3822 8941/3041/3822 8938/3038/3822 -f 8935/3035/3823 8936/3034/3823 8944/3042/3823 -f 8944/3042/3823 8943/3043/3823 8935/3035/3823 -f 8936/3034/105 8938/3038/105 8941/3041/105 -f 8941/3041/105 8944/3042/105 8936/3034/105 -f 8939/3037/3822 8940/3039/3822 8945/3044/3822 -f 8945/3044/3822 8942/3040/3822 8939/3037/3822 -f 8940/3039/21 8937/3036/21 8946/3045/21 -f 8946/3045/21 8945/3044/21 8940/3039/21 -f 8937/3036/3823 8935/3035/3823 8943/3043/3823 -f 8943/3043/3823 8946/3045/3823 8937/3036/3823 -f 8920/2981/3795 8922/2983/3795 8927/2988/3795 -f 8927/2988/3795 8925/2986/3795 8920/2981/3795 -f 8924/2985/3797 8926/2987/3797 8931/2992/3797 -f 8931/2992/3797 8929/2990/3797 8924/2985/3797 -f 8932/2993/3824 8920/2981/3824 8925/2986/3824 -f 8934/2995/3797 8924/2985/3797 8929/2990/3797 -f 8911/3010/3825 8916/3021/3825 8907/3002/3825 -f 8907/3002/3825 8912/3015/3825 8911/3010/3825 -f 8913/3014/3826 8918/3025/3826 8909/3006/3826 -f 8909/3006/3799 8914/3019/3799 8913/3014/3799 -f 8916/3021/3825 8904/2999/3825 8907/3002/3825 -f 8918/3025/3799 8906/3003/3799 8909/3006/3799 -f 8922/2983/3827 8911/3010/3827 8912/3015/3827 -f 8912/3015/2446 8927/2988/2446 8922/2983/2446 -f 8926/2987/2446 8913/3014/2446 8914/3019/2446 -f 8914/3019/2446 8931/2992/2446 8926/2987/2446 -f 8904/2999/3828 8932/2993/3828 8925/2986/3828 -f 8925/2986/3829 8907/3002/3829 8904/2999/3829 -f 8906/3003/3830 8934/2995/3830 8929/2990/3830 -f 8929/2990/3830 8909/3006/3830 8906/3003/3830 -f 8923/2984/3800 8921/2982/3800 8948/3046/3800 -f 8948/3046/3800 8947/3047/3800 8923/2984/3800 -f 8921/2982/3800 8933/2994/3800 8949/3048/3800 -f 8949/3048/3800 8948/3046/3800 8921/2982/3800 -f 8917/3023/3831 8910/3011/3831 8951/3049/3831 -f 8951/3049/3802 8950/3050/3802 8917/3023/3802 -f 8905/2998/3832 8917/3023/3832 8950/3050/3832 -f 8950/3050/3833 8952/3051/3833 8905/2998/3833 -f 8910/3011/105 8923/2984/105 8947/3047/105 -f 8947/3047/105 8951/3049/105 8910/3011/105 -f 8933/2994/3821 8905/2998/3821 8952/3051/3821 -f 8952/3051/2228 8949/3048/2228 8933/2994/2228 -f 8950/3050/3804 8951/3049/3804 8954/3029/3804 -f 8954/3029/3804 8953/3028/3804 8950/3050/3804 -f 8951/3049/3834 8947/3047/3834 8955/3030/3834 -f 8955/3030/3835 8954/3029/3835 8951/3049/3835 -f 8947/3047/3836 8948/3046/3836 8956/3031/3836 -f 8956/3031/3836 8955/3030/3836 8947/3047/3836 -f 8952/3051/3837 8950/3050/3837 8953/3028/3837 -f 8953/3028/3838 8957/3032/3838 8952/3051/3838 -f 8948/3046/3836 8949/3048/3836 8958/3033/3836 -f 8958/3033/3836 8956/3031/3836 8948/3046/3836 -f 8949/3048/21 8952/3051/21 8957/3032/21 -f 8957/3032/21 8958/3033/21 8949/3048/21 -o diesstt -v -0.296352 1.662356 -3.221428 -v -0.296352 1.662356 -3.275026 -v -0.296352 1.662356 -3.506036 -v -0.296352 1.662356 -3.561567 -v 0.359187 1.662355 -3.506504 -v 0.359187 1.662354 -3.561833 -v 0.359187 1.662355 -3.275478 -v 0.359186 1.662355 -3.224203 -v 0.080829 1.662355 -3.401248 -v 0.359288 1.662620 -3.643597 -v 0.071182 1.662355 -3.421006 -v 0.054191 1.662355 -3.434626 -v 0.032265 1.662355 -3.439701 -v 0.080829 1.662355 -3.378388 -v -0.295763 1.662621 -3.643598 -v -0.296266 1.662489 -3.125565 -v 0.359029 1.662488 -3.125564 -v 0.010338 1.662355 -3.434626 -v -0.006651 1.662355 -3.421006 -v -0.016299 1.662355 -3.401248 -v -0.016299 1.662356 -3.378388 -v -0.006651 1.662356 -3.358629 -v 0.071182 1.662355 -3.358629 -v 0.010338 1.662356 -3.345009 -v 0.054191 1.662355 -3.345009 -v 0.032265 1.662356 -3.339934 -v 0.376012 1.662473 -3.505132 -v 0.376012 1.662474 -3.275120 -v -0.313058 1.662191 -3.505301 -v -0.311537 1.662192 -3.275289 -v 1.340575 0.149549 -3.274866 -v 1.333836 0.161131 -3.274866 -v 1.297768 0.223128 -3.274866 -v 1.290971 0.234809 -3.274866 -v 1.254944 0.296738 -3.274866 -v 1.248148 0.308419 -3.274866 -v 1.212107 0.370371 -3.274866 -v 1.205317 0.382039 -3.274866 -v 1.169291 0.443965 -3.274867 -v 1.162495 0.455645 -3.274867 -v 1.126440 0.517620 -3.274866 -v 1.121320 0.526422 -3.274867 -v 1.083573 0.591304 -3.274867 -v 1.076895 0.602781 -3.274867 -v 1.040779 0.664862 -3.274867 -v 1.034006 0.676502 -3.274867 -v 0.997929 0.738517 -3.274867 -v 0.991194 0.750091 -3.274867 -v 0.955109 0.812120 -3.274868 -v 0.948392 0.823662 -3.274868 -v 0.912284 0.885729 -3.274868 -v 0.905546 0.897310 -3.274867 -v 0.869469 0.959324 -3.274868 -v 0.862736 0.970895 -3.274868 -v 0.826588 1.033030 -3.274868 -v 0.819927 1.044479 -3.274868 -v 0.783743 1.106676 -3.274868 -v 0.777116 1.118065 -3.274868 -v 0.740983 1.180176 -3.274868 -v 0.734235 1.191773 -3.274868 -v 0.698115 1.253860 -3.274868 -v 0.691429 1.265351 -3.274868 -v 0.655343 1.327381 -3.274869 -v 0.648537 1.339078 -3.274869 -v 0.612501 1.401021 -3.274869 -v 0.605827 1.412492 -3.274869 -v 0.569634 1.474705 -3.274869 -v 0.562958 1.486177 -3.274869 -v 0.526792 1.548344 -3.274869 -v 0.520148 1.559763 -3.274869 -v 1.234700 0.146925 -3.274866 -v 1.227960 0.158507 -3.274866 -v 1.191893 0.220504 -3.274866 -v 1.185096 0.232186 -3.274866 -v 1.149069 0.294114 -3.274866 -v 1.142272 0.305795 -3.274866 -v 1.106231 0.367747 -3.274866 -v 1.099442 0.379415 -3.274867 -v 1.063416 0.441341 -3.274867 -v 1.056620 0.453021 -3.274867 -v 1.020565 0.514996 -3.274867 -v 1.015444 0.523798 -3.274867 -v 0.977697 0.588680 -3.274867 -v 0.971020 0.600157 -3.274867 -v 0.934903 0.662239 -3.274867 -v 0.928131 0.673878 -3.274867 -v 0.892053 0.735893 -3.274867 -v 0.885319 0.747467 -3.274867 -v 0.849233 0.809496 -3.274868 -v 0.842517 0.821038 -3.274868 -v 0.806409 0.883106 -3.274868 -v 0.799670 0.894686 -3.274868 -v 0.763593 0.956700 -3.274868 -v 0.756860 0.968271 -3.274868 -v 0.720713 1.030406 -3.274868 -v 0.714051 1.041855 -3.274868 -v 0.677868 1.104052 -3.274868 -v 0.671241 1.115441 -3.274868 -v 0.631716 1.178019 -3.274869 -v 0.628359 1.189149 -3.274869 -v 0.592240 1.251236 -3.274869 -v 0.585554 1.262727 -3.274869 -v 0.549467 1.324757 -3.274869 -v 0.542661 1.336454 -3.274869 -v 0.506626 1.398397 -3.274869 -v 0.499951 1.409868 -3.274869 -v 0.463758 1.472081 -3.274869 -v 0.457083 1.483553 -3.274869 -v 0.420916 1.545720 -3.274869 -v 0.414273 1.557139 -3.274870 -v 1.340575 0.149548 -3.504670 -v 1.333836 0.161130 -3.504670 -v 1.297768 0.223128 -3.504670 -v 1.290972 0.234809 -3.504670 -v 1.254944 0.296737 -3.504670 -v 1.248148 0.308418 -3.504670 -v 1.212107 0.370370 -3.504670 -v 1.205317 0.382038 -3.504670 -v 1.169291 0.443964 -3.504670 -v 1.162495 0.455644 -3.504670 -v 1.126441 0.517620 -3.504670 -v 1.121319 0.526422 -3.504670 -v 1.083573 0.591304 -3.504671 -v 1.076895 0.602780 -3.504671 -v 1.040779 0.664862 -3.504671 -v 1.034006 0.676502 -3.504671 -v 0.997929 0.738517 -3.504671 -v 0.991194 0.750090 -3.504671 -v 0.955109 0.812119 -3.504671 -v 0.948392 0.823661 -3.504671 -v 0.912284 0.885729 -3.504671 -v 0.905546 0.897310 -3.504671 -v 0.869469 0.959324 -3.504672 -v 0.862736 0.970895 -3.504672 -v 0.826588 1.033030 -3.504672 -v 0.819927 1.044479 -3.504672 -v 0.783743 1.106676 -3.504672 -v 0.777116 1.118065 -3.504672 -v 0.740983 1.180176 -3.504672 -v 0.734235 1.191772 -3.504672 -v 0.698115 1.253860 -3.504672 -v 0.691429 1.265351 -3.504672 -v 0.655343 1.327380 -3.504673 -v 0.648537 1.339078 -3.504673 -v 0.612501 1.401020 -3.504673 -v 0.605827 1.412491 -3.504673 -v 0.569633 1.474705 -3.504673 -v 0.562959 1.486177 -3.504673 -v 0.526792 1.548344 -3.504673 -v 0.520148 1.559763 -3.504673 -v 1.234700 0.146924 -3.504670 -v 1.227961 0.158506 -3.504670 -v 1.191893 0.220504 -3.504670 -v 1.185096 0.232185 -3.504670 -v 1.149069 0.294113 -3.504670 -v 1.142272 0.305794 -3.504670 -v 1.106231 0.367746 -3.504670 -v 1.099442 0.379414 -3.504670 -v 1.063416 0.441340 -3.504670 -v 1.056620 0.453020 -3.504670 -v 1.020565 0.514996 -3.504671 -v 1.015444 0.523798 -3.504671 -v 0.977697 0.588680 -3.504671 -v 0.971020 0.600157 -3.504671 -v 0.934903 0.662238 -3.504671 -v 0.928131 0.673878 -3.504671 -v 0.892053 0.735892 -3.504671 -v 0.885319 0.747466 -3.504671 -v 0.849233 0.809495 -3.504671 -v 0.842517 0.821037 -3.504671 -v 0.806409 0.883105 -3.504672 -v 0.799671 0.894686 -3.504672 -v 0.763593 0.956700 -3.504672 -v 0.756861 0.968271 -3.504672 -v 0.720713 1.030406 -3.504672 -v 0.714051 1.041855 -3.504672 -v 0.677868 1.104052 -3.504672 -v 0.671241 1.115441 -3.504672 -v 0.635107 1.177552 -3.504672 -v 0.628360 1.189148 -3.504672 -v 0.592240 1.251236 -3.504672 -v 0.585554 1.262727 -3.504673 -v 0.549467 1.324756 -3.504673 -v 0.542661 1.336454 -3.504673 -v 0.506625 1.398396 -3.504673 -v 0.499951 1.409867 -3.504673 -v 0.463758 1.472081 -3.504673 -v 0.457083 1.483553 -3.504673 -v 0.420916 1.545720 -3.504673 -v 0.414273 1.557139 -3.504673 -vt 2.999985 4.153948 -vt 1.596516 5.332810 -vt 2.526482 4.154374 -vt 1.710941 5.373654 -vt 1.789814 5.445583 -vt 2.206063 4.154374 -vt 0.868175 4.154374 -vt 1.819201 5.538409 -vt 1.464133 5.332810 -vt 2.999987 6.927130 -vt 1.789814 5.631235 -vt 1.710941 5.703163 -vt 2.524935 6.929626 -vt 2.203353 6.929626 -vt 0.865555 6.929626 -vt 1.596516 5.744008 -vt 1.464133 5.744008 -vt 1.349707 5.703163 -vt 1.349707 5.373654 -vt 0.571240 4.154374 -vt 0.555166 6.929626 -vt 1.270835 5.631235 -vt 0.000013 4.155042 -vt 1.270835 5.445583 -vt 0.000013 6.929258 -vt 1.241448 5.538409 -vt 2.198123 4.083143 -vt 0.866102 4.083143 -vt 2.199098 7.000349 -vt 0.867076 6.993907 -vt 2.190341 -0.000348 -vt 2.190380 0.028182 -vt 0.859529 -0.000349 -vt 0.859568 0.028182 -vt 2.190590 0.180874 -vt 2.190629 0.209649 -vt 0.859778 0.180874 -vt 0.859818 0.209649 -vt 2.190839 0.362171 -vt 2.190879 0.390945 -vt 0.860027 0.362171 -vt 0.860067 0.390945 -vt 2.191088 0.543524 -vt 2.191128 0.572267 -vt 0.860277 0.543524 -vt 0.860316 0.572266 -vt 2.191338 0.724783 -vt 2.191377 0.753554 -vt 0.860526 0.724783 -vt 0.860566 0.753554 -vt 2.191587 0.906193 -vt 2.191617 0.927873 -vt 0.860776 0.906193 -vt 0.860805 0.927872 -vt 2.191837 1.087673 -vt 2.191876 1.115944 -vt 0.861025 1.087672 -vt 0.861064 1.115943 -vt 2.192086 1.268843 -vt 2.192125 1.297515 -vt 0.861274 1.268842 -vt 0.861314 1.297514 -vt 2.192336 1.450250 -vt 2.192375 1.478760 -vt 0.861524 1.450249 -vt 0.861563 1.478760 -vt 2.192585 1.631529 -vt 2.192624 1.659962 -vt 0.861773 1.631529 -vt 0.861812 1.659961 -vt 2.192834 1.812826 -vt 2.192873 1.841353 -vt 0.862023 1.812826 -vt 0.862062 1.841353 -vt 2.193084 1.994087 -vt 2.193123 2.022590 -vt 0.862272 1.994086 -vt 0.862311 2.022589 -vt 2.193333 2.175620 -vt 2.193372 2.203823 -vt 0.862522 2.175620 -vt 0.862561 2.203823 -vt 2.193583 2.357006 -vt 2.193621 2.385061 -vt 0.862771 2.357006 -vt 0.862810 2.385060 -vt 2.193831 2.538034 -vt 2.193871 2.566599 -vt 0.863020 2.538033 -vt 0.863059 2.566598 -vt 2.194081 2.719514 -vt 2.194120 2.747819 -vt 0.863270 2.719513 -vt 0.863309 2.747819 -vt 2.194330 2.900590 -vt 2.194370 2.929405 -vt 0.863519 2.900589 -vt 0.863558 2.929404 -vt 2.194580 3.081962 -vt 2.194618 3.110219 -vt 0.863768 3.081962 -vt 0.863807 3.110218 -vt 2.194829 3.263443 -vt 2.194868 3.291701 -vt 0.864018 3.263442 -vt 0.864057 3.291701 -vt 2.195079 3.444812 -vt 2.195117 3.472940 -vt 0.864267 3.444811 -vt 0.864306 3.472939 -vt 2.190331 0.447880 -vt 0.859520 0.447879 -vt 2.190371 0.476410 -vt 0.859559 0.476409 -vt 2.190581 0.629103 -vt 0.859769 0.629102 -vt 2.190620 0.657877 -vt 0.859809 0.657877 -vt 2.190830 0.810399 -vt 0.860018 0.810399 -vt 2.190870 0.839173 -vt 0.860058 0.839172 -vt 2.191079 0.991753 -vt 0.860268 0.991752 -vt 2.191119 1.020495 -vt 0.860307 1.020495 -vt 2.191329 1.173012 -vt 0.860517 1.173011 -vt 2.191368 1.201782 -vt 0.860557 1.201782 -vt 2.191578 1.354421 -vt 0.860767 1.354420 -vt 2.191608 1.376101 -vt 0.860797 1.376100 -vt 2.191828 1.535901 -vt 0.861016 1.535900 -vt 2.191867 1.564172 -vt 0.861055 1.564171 -vt 2.192077 1.717071 -vt 0.861265 1.717070 -vt 2.192116 1.745743 -vt 0.861305 1.745742 -vt 2.192327 1.898478 -vt 0.861515 1.898477 -vt 2.192366 1.926988 -vt 0.861554 1.926988 -vt 2.192576 2.079757 -vt 0.861764 2.079756 -vt 2.192615 2.108190 -vt 0.861804 2.108189 -vt 2.192825 2.261055 -vt 0.862014 2.261054 -vt 2.192864 2.289581 -vt 0.862053 2.289581 -vt 2.193075 2.442315 -vt 0.862263 2.442314 -vt 2.193114 2.470817 -vt 0.862302 2.470817 -vt 2.193324 2.623848 -vt 0.862513 2.623847 -vt 2.193363 2.652051 -vt 0.862552 2.652051 -vt 2.193574 2.805234 -vt 0.862762 2.805233 -vt 2.193612 2.833289 -vt 0.862801 2.833288 -vt 2.193822 2.986262 -vt 0.863013 3.000615 -vt 2.193862 3.014827 -vt 0.863051 3.014826 -vt 2.194072 3.167742 -vt 0.863261 3.167741 -vt 2.194111 3.196048 -vt 0.863300 3.196047 -vt 2.194321 3.348818 -vt 0.863510 3.348818 -vt 2.194361 3.377633 -vt 0.863550 3.377632 -vt 2.194571 3.530190 -vt 0.863759 3.530190 -vt 2.194609 3.558446 -vt 0.863798 3.558446 -vt 2.194820 3.711671 -vt 0.864009 3.711670 -vt 2.194859 3.739929 -vt 0.864048 3.739929 -vt 2.195070 3.893040 -vt 0.864259 3.893039 -vt 2.195108 3.921168 -vt 0.864297 3.921167 -vn 0.001875 0.999993 0.003245 -vn -0.000666 1.000000 0.000325 -vn -0.000467 1.000000 0.000583 -vn -0.000219 1.000000 0.000945 -vn 0.000002 0.999999 0.001299 -vn 0.000224 1.000000 0.000942 -vn 0.000468 1.000000 0.000584 -vn -0.001562 0.999994 0.003221 -vn 0.000003 1.000000 0.000002 -vn 0.000000 1.000000 -0.000005 -vn -0.000000 1.000000 -0.000006 -vn 0.000629 0.999999 -0.001345 -vn -0.000229 1.000000 -0.000286 -vn 0.000002 1.000000 -0.000606 -vn -0.000215 1.000000 -0.000953 -vn 0.000106 1.000000 -0.000460 -vn -0.000556 0.999999 -0.001386 -vn -0.007021 0.999975 -0.000002 -vn -0.007071 0.999975 -0.000005 -vn -0.009837 0.999952 0.000064 -vn -0.010833 0.999941 -0.000002 -vn 0.864343 0.502902 -0.000001 -vn 0.864336 0.502915 -0.000000 -vn 0.864332 0.502921 -0.000001 -vn 0.864328 0.502928 -0.000001 -vn 0.864346 0.502898 -0.000001 -vn 0.864344 0.502902 -0.000001 -vn 0.864333 0.502920 -0.000001 -vn 0.864327 0.502931 -0.000000 -vn 0.864333 0.502919 -0.000000 -vn 0.864334 0.502917 -0.000000 -vn 0.864339 0.502909 -0.000000 -vn 0.864358 0.502878 -0.000002 -vn 0.864331 0.502923 -0.000002 -vn 0.864330 0.502925 -0.000001 -vn 0.864336 0.502915 -0.000002 -vn 0.864324 0.502935 -0.000001 -vn 0.864321 0.502941 -0.000000 -vn 0.864331 0.502923 -0.000001 -vn 0.864322 0.502939 -0.000000 -vn 0.864337 0.502913 -0.000001 -vn 0.864320 0.502943 -0.000001 -vn 0.864339 0.502910 -0.000003 -vn 0.864335 0.502917 -0.000000 -vn 0.864332 0.502922 -0.000000 -vn 0.864330 0.502925 -0.000000 -vn 0.864325 0.502934 0.000000 -vn 0.864327 0.502930 -0.000000 -vn 0.864336 0.502916 -0.000000 -vn 0.864335 0.502916 -0.000000 -vn 0.864340 0.502907 0.000000 -vn 0.864347 0.502896 -0.000001 -vn 0.864340 0.502908 -0.000003 -vn 0.864338 0.502911 -0.000002 -vn 0.864345 0.502899 -0.000003 -vn 0.864323 0.502937 -0.000000 -vn 0.864340 0.502909 -0.000001 -vn 0.864337 0.502912 -0.000000 -vn 0.024777 -0.999693 0.000002 -vn -0.024775 0.999693 -0.000002 -vn 0.024777 -0.999693 0.000003 -vn 0.024775 -0.999693 0.000002 -vn -0.024774 0.999693 -0.000002 -vn 0.024774 -0.999693 0.000002 -vn 0.024775 -0.999693 0.000003 -vn -0.024777 0.999693 -0.000002 -vn 0.024776 -0.999693 0.000002 -vn -0.024775 0.999693 -0.000003 -vn -0.024776 0.999693 -0.000002 -vn 0.024776 -0.999690 0.002395 -vn 0.019744 -0.999805 0.000002 -vn 0.024778 -0.999693 0.000002 -vn 0.024775 -0.999693 0.000001 -vn -0.864342 -0.502905 0.000000 -vn -0.864334 -0.502918 0.000001 -vn -0.864337 -0.502914 0.000001 -vn -0.864338 -0.502911 0.000001 -vn -0.864338 -0.502912 0.000001 -vn -0.864330 -0.502925 0.000001 -vn -0.864333 -0.502920 0.000000 -vn -0.864327 -0.502931 0.000001 -vn -0.864328 -0.502928 0.000001 -vn -0.864340 -0.502908 0.000000 -vn -0.864356 -0.502880 0.000000 -vn -0.864346 -0.502898 0.000001 -vn -0.864343 -0.502903 0.000001 -vn -0.864343 -0.502902 0.000001 -vn -0.864336 -0.502915 0.000002 -vn -0.864333 -0.502919 0.000000 -vn -0.864330 -0.502926 0.000001 -vn -0.864339 -0.502910 0.000000 -vn -0.864319 -0.502943 0.000003 -vn -0.864337 -0.502913 0.000000 -vn -0.864336 -0.502915 0.000000 -vn -0.864338 -0.502912 0.000000 -vn -0.864339 -0.502910 0.000001 -vn -0.864320 -0.502942 0.000000 -vn -0.864318 -0.502946 0.000000 -vn -0.864321 -0.502940 0.000000 -vn -0.957312 -0.288739 -0.013540 -vn -0.864337 -0.502912 0.000000 -vn -0.864345 -0.502900 0.000000 -vn -0.864343 -0.502904 0.000000 -vn -0.864324 -0.502935 0.000002 -vn -0.864341 -0.502906 0.000000 -vn -0.864325 -0.502933 0.000002 -vn -0.864355 -0.502882 0.000000 +vn -0.000001 -1.000000 0.000001 +vn 0.000000 -1.000000 0.000001 s off -f 9006/3052/3839 9005/3053/3839 9002/3054/3839 -f 9005/3053/3840 9006/3052/3840 9007/3055/3840 -f 9007/3055/3841 9006/3052/3841 9008/3056/3841 -f 9002/3054/940 9005/3053/940 9001/3057/940 -f 9001/3057/940 9005/3053/940 9003/3058/940 -f 9008/3056/3842 9006/3052/3842 9009/3059/3842 -f 9005/3053/938 9010/3060/938 9003/3058/938 -f 9006/3052/3843 9011/3061/3843 9009/3059/3843 -f 9009/3059/3844 9011/3061/3844 9014/3062/3844 -f 9014/3062/3845 9011/3061/3845 9015/3063/3845 -f 9011/3061/3846 9000/3064/3846 9015/3063/3846 -f 9000/3064/940 8999/3065/940 9015/3063/940 -f 8999/3065/940 8998/3066/940 9015/3063/940 -f 9015/3063/3847 8998/3066/3847 9016/3067/3847 -f 9016/3067/3848 8998/3066/3848 9017/3068/3848 -f 9017/3068/3849 8998/3066/3849 9018/3069/3849 -f 9010/3060/2944 9019/3070/2944 9003/3058/2944 -f 9003/3058/940 9019/3070/940 9004/3071/940 -f 8998/3066/2349 8997/3072/2349 9018/3069/2349 -f 9018/3069/2782 8997/3072/2782 9020/3073/2782 -f 9004/3071/3850 9019/3070/3850 9013/3074/3850 -f 9019/3070/3851 9021/3075/3851 9013/3074/3851 -f 9013/3074/3852 9021/3075/3852 9012/3076/3852 -f 9021/3075/3853 9022/3077/3853 9012/3076/3853 -f 9022/3077/3854 9020/3073/3854 9012/3076/3854 -f 9020/3073/3855 8997/3072/3855 9012/3076/3855 -f 9023/3078/3856 9001/3057/3856 9003/3058/3856 -f 9003/3058/3857 9024/3079/3857 9023/3078/3857 -f 8999/3065/3858 9025/3080/3858 9026/3081/3858 -f 8999/3065/3859 9026/3081/3859 8998/3066/3859 -f 9107/3082/3860 9108/3083/3860 9027/3084/3860 -f 9028/3085/3861 9027/3084/3861 9108/3083/3861 -f 9109/3086/3862 9110/3087/3862 9029/3088/3862 -f 9030/3089/3863 9029/3088/3863 9110/3087/3863 -f 9111/3090/3864 9112/3091/3864 9031/3092/3864 -f 9032/3093/3865 9031/3092/3865 9112/3091/3865 -f 9113/3094/3866 9114/3095/3866 9033/3096/3866 -f 9034/3097/3867 9033/3096/3867 9114/3095/3867 -f 9115/3098/3868 9116/3099/3868 9035/3100/3868 -f 9036/3101/3869 9035/3100/3869 9116/3099/3869 -f 9117/3102/3870 9118/3103/3870 9037/3104/3870 -f 9038/3105/3871 9037/3104/3871 9118/3103/3871 -f 9119/3106/3872 9120/3107/3872 9039/3108/3872 -f 9040/3109/3873 9039/3108/3873 9120/3107/3873 -f 9121/3110/3874 9122/3111/3874 9041/3112/3874 -f 9042/3113/3875 9041/3112/3875 9122/3111/3875 -f 9123/3114/3862 9124/3115/3862 9043/3116/3862 -f 9044/3117/3876 9043/3116/3876 9124/3115/3876 -f 9125/3118/3877 9126/3119/3877 9045/3120/3877 -f 9046/3121/3878 9045/3120/3878 9126/3119/3878 -f 9127/3122/3879 9128/3123/3879 9047/3124/3879 -f 9048/3125/3866 9047/3124/3866 9128/3123/3866 -f 9129/3126/3880 9130/3127/3880 9049/3128/3880 -f 9050/3129/3881 9049/3128/3881 9130/3127/3881 -f 9131/3130/3882 9132/3131/3882 9051/3132/3882 -f 9052/3133/3879 9051/3132/3879 9132/3131/3879 -f 9133/3134/3883 9134/3135/3883 9053/3136/3883 -f 9054/3137/3884 9053/3136/3884 9134/3135/3884 -f 9135/3138/3885 9136/3139/3885 9055/3140/3885 -f 9056/3141/3886 9055/3140/3886 9136/3139/3886 -f 9137/3142/3887 9138/3143/3887 9057/3144/3887 -f 9058/3145/3888 9057/3144/3888 9138/3143/3888 -f 9139/3146/3889 9140/3147/3889 9059/3148/3889 -f 9060/3149/3890 9059/3148/3890 9140/3147/3890 -f 9141/3150/3891 9142/3151/3891 9061/3152/3891 -f 9062/3153/3892 9061/3152/3892 9142/3151/3892 -f 9143/3154/3893 9144/3155/3893 9063/3156/3893 -f 9064/3157/3894 9063/3156/3894 9144/3155/3894 -f 9145/3158/3895 9146/3159/3895 9065/3160/3895 -f 9066/3161/3896 9065/3160/3896 9146/3159/3896 -f 9147/3162/3897 9107/3082/3897 9067/3163/3897 -f 9027/3084/3897 9067/3163/3897 9107/3082/3897 -f 9108/3083/3898 9148/3164/3898 9028/3085/3898 -f 9068/3165/3898 9028/3085/3898 9148/3164/3898 -f 9149/3166/3899 9109/3086/3899 9069/3167/3899 -f 9029/3088/3900 9069/3167/3900 9109/3086/3900 -f 9110/3087/3901 9150/3168/3901 9030/3089/3901 -f 9070/3169/3901 9030/3089/3901 9150/3168/3901 -f 9151/3170/3902 9111/3090/3902 9071/3171/3902 -f 9031/3092/3903 9071/3171/3903 9111/3090/3903 -f 9112/3091/3904 9152/3172/3904 9032/3093/3904 -f 9072/3173/3904 9032/3093/3904 9152/3172/3904 -f 9153/3174/3903 9113/3094/3903 9073/3175/3903 -f 9033/3096/3903 9073/3175/3903 9113/3094/3903 -f 9114/3095/3898 9154/3176/3898 9034/3097/3898 -f 9074/3177/3898 9034/3097/3898 9154/3176/3898 -f 9155/3178/3905 9115/3098/3905 9075/3179/3905 -f 9035/3100/3900 9075/3179/3900 9115/3098/3900 -f 9116/3099/3904 9156/3180/3904 9036/3101/3904 -f 9076/3181/3904 9036/3101/3904 9156/3180/3904 -f 9157/3182/3900 9117/3102/3900 9077/3183/3900 -f 9037/3104/3905 9077/3183/3905 9117/3102/3905 -f 9118/3103/3906 9158/3184/3906 9038/3105/3906 -f 9078/3185/3904 9038/3105/3904 9158/3184/3904 -f 9159/3186/3900 9119/3106/3900 9079/3187/3900 -f 9039/3108/3900 9079/3187/3900 9119/3106/3900 -f 9120/3107/3898 9160/3188/3898 9040/3109/3898 -f 9080/3189/3898 9040/3109/3898 9160/3188/3898 -f 9161/3190/3905 9121/3110/3905 9081/3191/3905 -f 9041/3112/3900 9081/3191/3900 9121/3110/3900 -f 9122/3111/3907 9162/3192/3907 9042/3113/3907 -f 9082/3193/3898 9042/3113/3898 9162/3192/3898 -f 9163/3194/3897 9123/3114/3897 9083/3195/3897 -f 9043/3116/3905 9083/3195/3905 9123/3114/3905 -f 9124/3115/3907 9164/3196/3907 9044/3117/3907 -f 9084/3197/3898 9044/3117/3898 9164/3196/3898 -f 9165/3198/3905 9125/3118/3905 9085/3199/3905 -f 9045/3120/3899 9085/3199/3899 9125/3118/3899 -f 9126/3119/3907 9166/3200/3907 9046/3121/3907 -f 9086/3201/3907 9046/3121/3907 9166/3200/3907 -f 9167/3202/3900 9127/3122/3900 9087/3203/3900 -f 9047/3124/3900 9087/3203/3900 9127/3122/3900 -f 9128/3123/3898 9168/3204/3898 9048/3125/3898 -f 9088/3205/3907 9048/3125/3907 9168/3204/3907 -f 9169/3206/3900 9129/3126/3900 9089/3207/3900 -f 9049/3128/3905 9089/3207/3905 9129/3126/3905 -f 9130/3127/3907 9170/3208/3907 9050/3129/3907 -f 9090/3209/3904 9050/3129/3904 9170/3208/3904 -f 9171/3210/3897 9131/3130/3897 9091/3211/3897 -f 9051/3132/3900 9091/3211/3900 9131/3130/3900 -f 9132/3131/3904 9172/3212/3904 9052/3133/3904 -f 9092/3213/3904 9052/3133/3904 9172/3212/3904 -f 9173/3214/3897 9133/3134/3897 9093/3215/3897 -f 9053/3136/3900 9093/3215/3900 9133/3134/3900 -f 9134/3135/3898 9174/3216/3898 9054/3137/3898 -f 9094/3217/3904 9054/3137/3904 9174/3216/3904 -f 9175/3218/3908 9135/3138/3908 9095/3219/3908 -f 9055/3140/3909 9095/3219/3909 9135/3138/3909 -f 9136/3139/3907 9176/3220/3907 9056/3141/3907 -f 9096/3221/3904 9056/3141/3904 9176/3220/3904 -f 9177/3222/3897 9137/3142/3897 9097/3223/3897 -f 9057/3144/3897 9097/3223/3897 9137/3142/3897 -f 9138/3143/3904 9178/3224/3904 9058/3145/3904 -f 9098/3225/3898 9058/3145/3898 9178/3224/3898 -f 9179/3226/3910 9139/3146/3910 9099/3227/3910 -f 9059/3148/3911 9099/3227/3911 9139/3146/3911 -f 9140/3147/3898 9180/3228/3898 9060/3149/3898 -f 9100/3229/3904 9060/3149/3904 9180/3228/3904 -f 9181/3230/3900 9141/3150/3900 9101/3231/3900 -f 9061/3152/3900 9101/3231/3900 9141/3150/3900 -f 9142/3151/3904 9182/3232/3904 9062/3153/3904 -f 9102/3233/3906 9062/3153/3906 9182/3232/3906 -f 9183/3234/3900 9143/3154/3900 9103/3235/3900 -f 9063/3156/3899 9103/3235/3899 9143/3154/3899 -f 9144/3155/3904 9184/3236/3904 9064/3157/3904 -f 9104/3237/3898 9064/3157/3898 9184/3236/3898 -f 9185/3238/3900 9145/3158/3900 9105/3239/3900 -f 9065/3160/3899 9105/3239/3899 9145/3158/3899 -f 9146/3159/3907 9186/3240/3907 9066/3161/3907 -f 9106/3241/3907 9066/3161/3907 9186/3240/3907 -f 9148/3164/3912 9147/3162/3912 9068/3165/3912 -f 9067/3163/3913 9068/3165/3913 9147/3162/3913 -f 9150/3168/3914 9149/3166/3914 9070/3169/3914 -f 9069/3167/3915 9070/3169/3915 9149/3166/3915 -f 9152/3172/3916 9151/3170/3916 9072/3173/3916 -f 9071/3171/3917 9072/3173/3917 9151/3170/3917 -f 9154/3176/3918 9153/3174/3918 9074/3177/3918 -f 9073/3175/3919 9074/3177/3919 9153/3174/3919 -f 9156/3180/3920 9155/3178/3920 9076/3181/3920 -f 9075/3179/3921 9076/3181/3921 9155/3178/3921 -f 9158/3184/3922 9157/3182/3922 9078/3185/3922 -f 9077/3183/3923 9078/3185/3923 9157/3182/3923 -f 9160/3188/3924 9159/3186/3924 9080/3189/3924 -f 9079/3187/3915 9080/3189/3915 9159/3186/3915 -f 9162/3192/3925 9161/3190/3925 9082/3193/3925 -f 9081/3191/3926 9082/3193/3926 9161/3190/3926 -f 9164/3196/3927 9163/3194/3927 9084/3197/3927 -f 9083/3195/3928 9084/3197/3928 9163/3194/3928 -f 9166/3200/3929 9165/3198/3929 9086/3201/3929 -f 9085/3199/3930 9086/3201/3930 9165/3198/3930 -f 9168/3204/3931 9167/3202/3931 9088/3205/3931 -f 9087/3203/3932 9088/3205/3932 9167/3202/3932 -f 9170/3208/3933 9169/3206/3933 9090/3209/3933 -f 9089/3207/3912 9090/3209/3912 9169/3206/3912 -f 9172/3212/3934 9171/3210/3934 9092/3213/3934 -f 9091/3211/3934 9092/3213/3934 9171/3210/3934 -f 9174/3216/3935 9173/3214/3935 9094/3217/3935 -f 9093/3215/3936 9094/3217/3936 9173/3214/3936 -f 9176/3220/3937 9175/3218/3937 9096/3221/3937 -f 9095/3219/3938 9096/3221/3938 9175/3218/3938 -f 9178/3224/3939 9177/3222/3939 9098/3225/3939 -f 9097/3223/3939 9098/3225/3939 9177/3222/3939 -f 9180/3228/3940 9179/3226/3940 9100/3229/3940 -f 9099/3227/3941 9100/3229/3941 9179/3226/3941 -f 9182/3232/3916 9181/3230/3916 9102/3233/3916 -f 9101/3231/3942 9102/3233/3942 9181/3230/3942 -f 9184/3236/3943 9183/3234/3943 9104/3237/3943 -f 9103/3235/3944 9104/3237/3944 9183/3234/3944 -f 9186/3240/3945 9185/3238/3945 9106/3241/3945 -f 9105/3239/3945 9106/3241/3945 9185/3238/3945 -o diesnohu -v 1.463325 0.093492 2.192520 -v 1.463327 0.094038 4.103106 -v 0.900380 0.094857 4.103106 -v 0.900378 0.094311 2.192519 -v 0.900749 0.094193 1.781114 -v 0.900605 0.094032 1.218040 -v 1.463663 0.093374 1.781233 -v 1.464291 0.931704 2.165873 -v 1.463476 0.875838 2.165874 -v 1.463327 0.875999 2.192522 -v 1.463327 0.875999 2.222919 -v 1.463327 0.875998 4.072710 -v 1.463327 0.875998 4.103107 -v 1.464291 0.931702 4.131416 -v 1.463476 0.875836 4.131416 -v 1.431916 0.929351 2.165873 -v 1.431082 0.875838 2.165874 -v 1.432104 0.929460 2.192521 -v 1.431223 0.876204 2.192522 -v 1.432104 0.929460 2.222919 -v 1.431223 0.876204 2.222919 -v 1.432105 0.929459 4.072710 -v 1.431223 0.876202 4.072710 -v 1.432105 0.929459 4.103107 -v 1.431223 0.876202 4.103107 -v 1.431917 0.929349 4.131416 -v 1.431083 0.875836 4.131415 -v 1.431917 0.929349 4.063842 -v 1.431082 0.875836 4.063842 -v 1.431916 0.929351 2.234157 -v 1.431082 0.875838 2.234158 -v 1.380968 0.873080 2.234158 -v 1.381833 0.925676 2.234157 -v 1.381834 0.925674 4.063842 -v 1.380969 0.873078 4.063842 -v 0.900543 0.892141 2.165873 -v 0.900381 0.845629 2.166436 -v 0.900381 0.845629 2.192521 -v 0.900381 0.845629 2.222919 -v 0.900381 0.845628 4.072709 -v 0.900544 0.892139 4.131415 -v 0.900381 0.845628 4.103106 -v 0.900381 0.845628 4.130291 -v 0.932918 0.894427 2.165873 -v 0.931798 0.844994 2.165873 -v 0.933051 0.893983 2.192521 -v 0.931815 0.845715 2.192521 -v 0.933051 0.893983 2.222919 -v 0.931815 0.845715 2.222919 -v 0.932939 0.893980 4.072709 -v 0.931880 0.845713 4.072709 -v 0.932939 0.893980 4.103106 -v 0.931880 0.845713 4.103106 -v 0.932919 0.894425 4.131415 -v 0.931799 0.844993 4.131415 -v 0.932918 0.894425 4.063841 -v 0.931799 0.844993 4.063841 -v 0.932918 0.894427 2.234158 -v 0.931798 0.844994 2.234157 -v 0.981911 0.848079 2.234157 -v 0.983002 0.897949 2.234158 -v 0.983003 0.897947 4.063841 -v 0.981912 0.848078 4.063841 -v 0.900378 0.115100 2.222918 -v 1.463327 0.115100 2.222918 -v 1.415778 0.552529 2.205991 -v 1.185138 0.552529 2.205991 -v 1.185139 0.831028 2.205991 -v 1.415778 0.848654 2.205991 -v 1.149921 0.553503 2.205991 -v 0.965106 0.553503 2.205991 -v 0.965105 0.814653 2.205991 -v 1.149921 0.828695 2.205991 -v 0.943114 0.837778 2.216147 -v 1.436269 0.871013 2.216148 -v 1.436268 0.531104 2.216147 -v 0.943115 0.531104 2.216147 -v 1.416596 0.849704 2.216148 -v 1.416596 0.551479 2.216147 -v 1.184321 0.831953 2.216147 -v 1.184320 0.551479 2.216147 -v 1.151280 0.551479 2.216147 -v 0.963746 0.551479 2.216147 -v 0.963746 0.816470 2.216147 -v 1.151280 0.830719 2.216147 -v 0.943114 0.837778 2.222919 -v 1.436269 0.871013 2.222919 -v 1.436268 0.531104 2.222918 -v 0.943115 0.531104 2.222918 -v 0.943114 0.837778 2.195835 -v 1.436269 0.871013 2.195835 -v 1.436268 0.531104 2.195834 -v 0.943115 0.531104 2.195835 -v 1.416596 0.849704 2.195835 -v 1.416596 0.551479 2.195835 -v 1.184321 0.831953 2.195835 -v 1.184320 0.551479 2.195835 -v 1.151280 0.551479 2.195835 -v 0.963746 0.551479 2.195835 -v 0.963746 0.816470 2.195835 -v 1.151280 0.830719 2.195835 -v 0.943114 0.837778 2.192521 -v 1.436269 0.871013 2.192522 -v 1.436268 0.531104 2.192521 -v 0.943115 0.531104 2.192521 -v 0.900379 0.115098 4.072709 -v 1.463328 0.115098 4.072709 -v 1.415779 0.552528 4.089636 -v 1.185139 0.552528 4.089636 -v 1.185139 0.831026 4.089637 -v 1.415779 0.848652 4.089637 -v 1.149922 0.553501 4.089636 -v 0.965106 0.553501 4.089636 -v 0.965106 0.814651 4.089637 -v 1.149922 0.828693 4.089637 -v 0.937493 0.837777 4.079480 -v 1.436269 0.871011 4.079480 -v 1.436269 0.531102 4.079480 -v 0.943115 0.531102 4.079480 -v 1.416597 0.849702 4.079480 -v 1.416597 0.551477 4.079480 -v 1.184321 0.831951 4.079480 -v 1.184321 0.551478 4.079480 -v 1.151281 0.551478 4.079480 -v 0.963747 0.551478 4.079480 -v 0.963746 0.816468 4.079480 -v 1.151280 0.830717 4.079480 -v 0.937493 0.837777 4.072709 -v 1.436269 0.871011 4.072710 -v 1.436269 0.531102 4.072709 -v 0.943115 0.531102 4.072709 -v 0.937493 0.837777 4.099792 -v 1.436269 0.871011 4.099793 -v 1.436269 0.531102 4.099793 -v 0.943115 0.531102 4.099792 -v 1.416597 0.849702 4.099793 -v 1.416597 0.551477 4.099793 -v 1.184321 0.831951 4.099792 -v 1.184321 0.551478 4.099793 -v 1.151281 0.551478 4.099793 -v 0.963747 0.551478 4.099792 -v 0.963746 0.816468 4.099793 -v 1.151280 0.830717 4.099792 -v 0.937493 0.837777 4.103106 -v 1.436269 0.871011 4.103107 -v 1.436269 0.531102 4.103107 -v 0.943115 0.531102 4.103106 -v 1.345370 0.115099 3.027511 -v 1.017895 0.115099 3.027511 -v 1.345370 0.133115 3.027511 -v 1.017895 0.133115 3.027511 -v 1.345370 0.115099 2.511425 -v 1.345370 0.133116 2.511426 -v 1.017895 0.115099 2.511426 -v 1.017895 0.133116 2.511426 -v 1.279150 0.133115 2.979055 -v 1.083920 0.133114 2.979055 -v 1.279150 0.133115 2.562004 -v 1.083920 0.133115 2.562004 -v 1.345370 0.115098 3.787743 -v 1.017895 0.115098 3.787743 -v 1.345370 0.133115 3.787743 -v 1.017895 0.133115 3.787743 -v 1.345370 0.115099 3.271658 -v 1.345370 0.133115 3.271658 -v 1.017895 0.115099 3.271658 -v 1.017895 0.133115 3.271658 -v 1.279149 0.133114 3.739287 -v 1.083920 0.133114 3.739287 -v 1.279149 0.133114 3.322236 -v 1.083921 0.133114 3.322236 -v 1.463727 0.936778 1.780627 -v 1.463696 0.867985 1.748138 -v 1.463728 0.867985 1.250921 -v 1.463727 0.936778 1.218442 -v 1.431609 0.868086 1.250921 -v 1.431576 0.868086 1.748138 -v 1.431633 0.934468 1.250921 -v 1.431600 0.934468 1.748138 -v 0.943519 0.830164 1.218051 -v 1.436672 0.863063 1.218051 -v 1.463730 0.109174 1.218051 -v 1.436672 0.526584 1.218050 -v 0.900781 0.897513 1.218051 -v 0.943519 0.526583 1.218050 -v 1.417001 0.546753 1.223843 -v 1.417000 0.841969 1.223843 -v 1.184725 0.824397 1.223843 -v 1.184725 0.546753 1.223843 -v 1.151685 0.546753 1.223843 -v 0.964151 0.546753 1.223843 -v 0.964150 0.809070 1.223843 -v 1.151684 0.823175 1.223843 -v 0.943519 0.830164 1.223843 -v 1.436672 0.863063 1.223843 -v 1.436672 0.526584 1.223843 -v 0.943519 0.526584 1.223843 -v 1.416366 0.547560 1.227852 -v 1.416366 0.841163 1.227852 -v 1.185360 0.823687 1.227853 -v 1.185359 0.547560 1.227852 -v 0.964919 0.547886 1.227852 -v 1.150915 0.547886 1.227852 -v 0.964919 0.808053 1.227853 -v 1.150916 0.822042 1.227853 -v 0.943519 0.830164 1.251065 -v 1.436672 0.863063 1.251065 -v 1.463731 0.109174 1.251065 -v 1.436672 0.526584 1.251065 -v 0.933952 0.899798 1.251059 -v 0.933952 0.109174 1.251058 -v 0.943519 0.526583 1.251065 -v 1.417000 0.841969 1.237170 -v 1.417001 0.546753 1.237170 -v 1.184725 0.824397 1.237170 -v 1.184725 0.546753 1.237170 -v 1.151685 0.546753 1.237170 -v 0.964151 0.546753 1.237170 -v 0.964150 0.809070 1.237170 -v 1.151684 0.823175 1.237170 -v 1.436672 0.863063 1.237170 -v 0.943519 0.830164 1.237170 -v 1.436672 0.526584 1.237170 -v 0.943519 0.526583 1.237170 -v 0.933962 0.830208 1.253380 -v 0.933962 0.526628 1.253380 -v 0.933941 0.899524 1.748221 -v 0.933962 0.830208 1.746534 -v 0.933941 0.109174 1.748220 -v 0.933962 0.526627 1.746533 -v 0.920025 0.809114 1.273052 -v 0.920026 0.546798 1.273052 -v 0.920026 0.546797 1.399789 -v 0.920026 0.546797 1.437342 -v 0.920026 0.546797 1.564079 -v 0.920026 0.546797 1.599165 -v 0.920026 0.546797 1.725902 -v 0.920025 0.809114 1.399789 -v 0.920026 0.809114 1.725902 -v 0.920025 0.809114 1.437342 -v 0.920025 0.809114 1.564079 -v 0.920025 0.809114 1.599165 -v 0.920025 0.830208 1.253380 -v 0.920025 0.830208 1.746534 -v 0.920026 0.526628 1.253380 -v 0.920026 0.526627 1.746534 -v 0.910735 0.807993 1.273594 -v 0.910735 0.547919 1.273593 -v 0.910735 0.547918 1.399247 -v 0.910735 0.547958 1.437903 -v 0.910735 0.547958 1.563518 -v 0.910734 0.547273 1.599721 -v 0.910734 0.547273 1.725346 -v 0.910735 0.807993 1.399248 -v 0.910735 0.808665 1.725346 -v 0.910735 0.807953 1.437903 -v 0.910735 0.807953 1.563518 -v 0.910735 0.808665 1.599721 -v 0.900781 0.526628 1.253380 -v 0.900781 0.830208 1.253380 -v 0.900748 0.897512 1.781117 -v 0.900780 0.830208 1.746534 -v 0.900780 0.526628 1.746534 -v 0.906754 0.546798 1.273052 -v 0.906753 0.809114 1.273052 -v 0.906754 0.546797 1.399789 -v 0.906754 0.546797 1.437342 -v 0.906754 0.546797 1.564079 -v 0.906754 0.546797 1.599165 -v 0.906754 0.546797 1.725902 -v 0.906753 0.809114 1.399789 -v 0.906753 0.809114 1.725902 -v 0.906753 0.809114 1.437342 -v 0.906753 0.809114 1.564079 -v 0.906753 0.809114 1.599165 -v 0.906753 0.830208 1.746534 -v 0.906753 0.830208 1.253380 -v 0.906754 0.526628 1.253380 -v 0.906754 0.526627 1.746533 -v 0.943453 0.830163 1.781234 -v 1.436607 0.863063 1.781234 -v 1.436607 0.526583 1.781234 -v 0.943453 0.526583 1.781234 -v 1.416935 0.841969 1.775442 -v 1.416935 0.546753 1.775442 -v 1.184659 0.824397 1.775442 -v 1.184659 0.546753 1.775442 -v 1.151619 0.546753 1.775442 -v 0.964085 0.546753 1.775442 -v 0.964086 0.809070 1.775442 -v 1.151619 0.823175 1.775442 -v 1.436607 0.863063 1.775442 -v 0.943453 0.830163 1.775442 -v 1.436607 0.526583 1.775442 -v 0.943453 0.526583 1.775442 -v 1.416300 0.841162 1.771433 -v 1.416300 0.547559 1.771433 -v 1.185294 0.823686 1.771433 -v 1.185294 0.547559 1.771433 -v 1.150850 0.547886 1.771433 -v 0.964854 0.547886 1.771433 -v 0.964854 0.808052 1.771433 -v 1.150850 0.822042 1.771433 -v 0.943454 0.830163 1.748220 -v 1.436607 0.863062 1.748220 -v 1.463665 0.109174 1.748219 -v 1.436607 0.526583 1.748220 -v 0.943453 0.526583 1.748220 -v 1.416935 0.546753 1.762115 -v 1.416935 0.841969 1.762115 -v 1.184659 0.824397 1.762116 -v 1.184659 0.546753 1.762115 -v 1.151619 0.546753 1.762115 -v 0.964085 0.546753 1.762115 -v 0.964086 0.809070 1.762115 -v 1.151619 0.823175 1.762115 -v 0.943453 0.830163 1.762115 -v 1.436607 0.863062 1.762115 -v 1.436607 0.526583 1.762115 -v 0.943453 0.526583 1.762115 -v 1.349776 0.355679 1.742367 -v 1.049500 0.355679 1.742367 -v 1.349776 0.372361 1.742367 -v 1.049500 0.372361 1.742367 -v 1.464291 0.931704 2.165873 -v 1.463476 0.875838 2.165874 -v 1.431082 0.875838 2.165874 -v 1.431082 0.875838 2.165874 -v 1.431916 0.929351 2.165873 -v 1.464291 0.931704 2.165873 -v 1.463476 0.875838 2.165874 -v 1.463327 0.875999 2.192522 -v 1.431223 0.876204 2.192522 -v 1.431223 0.876204 2.192522 -v 1.431082 0.875838 2.165874 -v 1.463476 0.875838 2.165874 -v 1.463327 0.875998 4.103107 -v 1.463476 0.875836 4.131416 -v 1.431083 0.875836 4.131415 -v 1.431083 0.875836 4.131415 -v 1.431223 0.876202 4.103107 -v 1.463327 0.875998 4.103107 -v 1.463476 0.875836 4.131416 -v 1.464291 0.931702 4.131416 -v 1.431917 0.929349 4.131416 -v 1.431917 0.929349 4.131416 -v 1.431083 0.875836 4.131415 -v 1.463476 0.875836 4.131416 -v 1.463327 0.875999 2.222919 -v 1.431082 0.875838 2.234158 -v 1.431223 0.876204 2.222919 -v 1.431916 0.929351 2.234157 -v 1.431082 0.875838 2.234158 -v 1.431916 0.929351 2.234157 -v 1.431082 0.875836 4.063842 -v 1.431917 0.929349 4.063842 -v 1.431082 0.875836 4.063842 -v 0.900381 0.845629 2.166436 -v 0.900543 0.892141 2.165873 -v 0.931798 0.844994 2.165873 -v 0.932918 0.894427 2.165873 -v 0.931798 0.844994 2.165873 -v 0.900543 0.892141 2.165873 -v 0.900381 0.845629 2.192521 -v 0.900381 0.845629 2.166436 -v 0.931815 0.845715 2.192521 -v 0.931798 0.844994 2.165873 -v 0.931815 0.845715 2.192521 -v 0.900381 0.845629 2.166436 -v 0.900381 0.845628 4.130291 -v 0.900381 0.845628 4.103106 -v 0.931799 0.844993 4.131415 -v 0.931880 0.845713 4.103106 -v 0.931799 0.844993 4.131415 -v 0.900381 0.845628 4.103106 -v 0.900544 0.892139 4.131415 -v 0.900381 0.845628 4.130291 -v 0.932919 0.894425 4.131415 -v 0.931799 0.844993 4.131415 -v 0.932919 0.894425 4.131415 -v 0.900381 0.845628 4.130291 -v 0.931798 0.844994 2.234157 -v 0.900381 0.845629 2.222919 -v 0.931815 0.845715 2.222919 -v 0.931798 0.844994 2.234157 -v 0.932918 0.894427 2.234158 -v 0.932918 0.894427 2.234158 -v 0.932918 0.894425 4.063841 -v 0.931799 0.844993 4.063841 -v 0.931799 0.844993 4.063841 -v 1.431223 0.876204 2.222919 -v 1.463327 0.875999 2.222919 -v 1.431223 0.876204 2.222919 -v 1.463327 0.875999 2.222919 -v 1.431223 0.876204 2.222919 -v 1.432104 0.929460 2.222919 -v 0.933051 0.893983 2.222919 -v 1.431223 0.876204 2.222919 -v 0.933051 0.893983 2.222919 -v 0.933051 0.893983 2.222919 -v 0.931815 0.845715 2.222919 -v 0.900381 0.845629 2.222919 -v 0.900381 0.845629 2.222919 -v 0.931815 0.845715 2.222919 -v 0.900381 0.845629 2.222919 -v 1.416596 0.551479 2.216147 -v 1.416596 0.551479 2.216147 -v 1.416596 0.849704 2.216148 -v 1.415778 0.848654 2.205991 -v 1.416596 0.849704 2.216148 -v 1.416596 0.849704 2.216148 -v 1.184321 0.831953 2.216147 -v 1.415778 0.552529 2.205991 -v 1.184320 0.551479 2.216147 -v 1.184320 0.551479 2.216147 -v 1.416596 0.551479 2.216147 -v 1.415778 0.552529 2.205991 -v 0.963746 0.551479 2.216147 -v 0.963746 0.551479 2.216147 -v 1.151280 0.551479 2.216147 -v 0.965106 0.553503 2.205991 -v 0.963746 0.816470 2.216147 -v 0.963746 0.816470 2.216147 -v 0.963746 0.551479 2.216147 -v 0.965106 0.553503 2.205991 -v 1.185138 0.552529 2.205991 -v 1.185139 0.831028 2.205991 -v 1.184321 0.831953 2.216147 -v 1.184321 0.831953 2.216147 -v 1.184320 0.551479 2.216147 -v 1.185138 0.552529 2.205991 -v 1.149921 0.553503 2.205991 -v 1.151280 0.551479 2.216147 -v 1.151280 0.551479 2.216147 -v 1.151280 0.830719 2.216147 -v 0.965105 0.814653 2.205991 -v 1.149921 0.828695 2.205991 -v 1.151280 0.830719 2.216147 -v 1.151280 0.830719 2.216147 -v 0.963746 0.816470 2.216147 -v 0.965105 0.814653 2.205991 -v 0.943114 0.837778 2.216147 -v 1.436269 0.871013 2.216148 -v 1.436269 0.871013 2.222919 -v 1.436269 0.871013 2.222919 -v 0.943114 0.837778 2.222919 -v 0.943114 0.837778 2.216147 -v 1.436269 0.871013 2.216148 -v 1.436268 0.531104 2.216147 -v 1.436268 0.531104 2.222918 -v 1.436268 0.531104 2.222918 -v 1.436269 0.871013 2.222919 -v 1.436269 0.871013 2.216148 -v 1.436268 0.531104 2.216147 -v 0.943115 0.531104 2.216147 -v 0.943115 0.531104 2.222918 -v 0.943115 0.531104 2.222918 -v 1.436268 0.531104 2.222918 -v 1.436268 0.531104 2.216147 -v 0.943115 0.531104 2.216147 -v 0.943114 0.837778 2.216147 -v 0.943114 0.837778 2.222919 -v 0.943114 0.837778 2.222919 -v 0.943115 0.531104 2.222918 -v 0.943115 0.531104 2.216147 -v 1.431223 0.876204 2.192522 -v 1.431223 0.876204 2.192522 -v 1.463327 0.875999 2.192522 -v 1.463327 0.875999 2.192522 -v 1.432104 0.929460 2.192521 -v 1.431223 0.876204 2.192522 -v 0.933051 0.893983 2.192521 -v 1.431223 0.876204 2.192522 -v 0.933051 0.893983 2.192521 -v 0.933051 0.893983 2.192521 -v 0.931815 0.845715 2.192521 -v 0.900381 0.845629 2.192521 -v 0.900381 0.845629 2.192521 -v 0.900381 0.845629 2.192521 -v 0.931815 0.845715 2.192521 -v 1.463327 0.115100 2.222918 -v 1.463325 0.093492 2.192520 -v 1.463327 0.115100 2.222918 -v 0.900378 0.115100 2.222918 -v 0.900378 0.094311 2.192519 -v 0.900378 0.094311 2.192519 -v 1.416596 0.551479 2.195835 -v 1.416596 0.849704 2.195835 -v 1.416596 0.551479 2.195835 -v 1.415778 0.848654 2.205991 -v 1.416596 0.849704 2.195835 -v 1.184321 0.831953 2.195835 -v 1.416596 0.849704 2.195835 -v 1.415778 0.552529 2.205991 -v 1.184320 0.551479 2.195835 -v 1.416596 0.551479 2.195835 -v 1.184320 0.551479 2.195835 -v 1.415778 0.552529 2.205991 -v 0.963746 0.551479 2.195835 -v 1.151280 0.551479 2.195835 -v 0.963746 0.551479 2.195835 -v 0.965106 0.553503 2.205991 -v 0.963746 0.816470 2.195835 -v 0.963746 0.551479 2.195835 -v 0.963746 0.816470 2.195835 -v 0.965106 0.553503 2.205991 -v 1.185139 0.831028 2.205991 -v 1.185138 0.552529 2.205991 -v 1.184321 0.831953 2.195835 -v 1.184320 0.551479 2.195835 -v 1.184321 0.831953 2.195835 -v 1.185138 0.552529 2.205991 -v 1.149921 0.553503 2.205991 -v 1.151280 0.551479 2.195835 -v 1.151280 0.830719 2.195835 -v 1.151280 0.551479 2.195835 -v 1.149921 0.828695 2.205991 -v 0.965105 0.814653 2.205991 -v 1.151280 0.830719 2.195835 -v 0.963746 0.816470 2.195835 -v 1.151280 0.830719 2.195835 -v 0.965105 0.814653 2.205991 -v 1.436269 0.871013 2.195835 -v 0.943114 0.837778 2.195835 -v 1.436269 0.871013 2.192522 -v 0.943114 0.837778 2.192521 -v 1.436269 0.871013 2.192522 -v 0.943114 0.837778 2.195835 -v 1.436268 0.531104 2.195834 -v 1.436269 0.871013 2.195835 -v 1.436268 0.531104 2.192521 -v 1.436269 0.871013 2.192522 -v 1.436268 0.531104 2.192521 -v 1.436269 0.871013 2.195835 -v 0.943115 0.531104 2.195835 -v 1.436268 0.531104 2.195834 -v 0.943115 0.531104 2.192521 -v 1.436268 0.531104 2.192521 -v 0.943115 0.531104 2.192521 -v 1.436268 0.531104 2.195834 -v 0.943114 0.837778 2.195835 -v 0.943115 0.531104 2.195835 -v 0.943114 0.837778 2.192521 -v 0.943115 0.531104 2.192521 -v 0.943114 0.837778 2.192521 -v 0.943115 0.531104 2.195835 -v 1.431223 0.876202 4.072710 -v 1.431223 0.876202 4.072710 -v 1.463327 0.875998 4.072710 -v 1.463327 0.875998 4.072710 -v 1.432105 0.929459 4.072710 -v 1.431223 0.876202 4.072710 -v 0.932939 0.893980 4.072709 -v 1.431223 0.876202 4.072710 -v 0.932939 0.893980 4.072709 -v 0.932939 0.893980 4.072709 -v 0.931880 0.845713 4.072709 -v 0.900381 0.845628 4.072709 -v 0.900381 0.845628 4.072709 -v 0.900381 0.845628 4.072709 -v 0.931880 0.845713 4.072709 -v 1.416597 0.551477 4.079480 -v 1.416597 0.849702 4.079480 -v 1.416597 0.551477 4.079480 -v 1.415779 0.848652 4.089637 -v 1.416597 0.849702 4.079480 -v 1.184321 0.831951 4.079480 -v 1.416597 0.849702 4.079480 -v 1.415779 0.552528 4.089636 -v 1.184321 0.551478 4.079480 -v 1.416597 0.551477 4.079480 -v 1.184321 0.551478 4.079480 -v 1.415779 0.552528 4.089636 -v 0.963747 0.551478 4.079480 -v 1.151281 0.551478 4.079480 -v 0.963747 0.551478 4.079480 -v 0.965106 0.553501 4.089636 -v 0.963746 0.816468 4.079480 -v 0.963747 0.551478 4.079480 -v 0.963746 0.816468 4.079480 -v 0.965106 0.553501 4.089636 -v 1.185139 0.831026 4.089637 -v 1.185139 0.552528 4.089636 -v 1.184321 0.831951 4.079480 -v 1.184321 0.551478 4.079480 -v 1.184321 0.831951 4.079480 -v 1.185139 0.552528 4.089636 -v 1.149922 0.553501 4.089636 -v 1.151281 0.551478 4.079480 -v 1.151280 0.830717 4.079480 -v 1.151281 0.551478 4.079480 -v 1.149922 0.828693 4.089637 -v 0.965106 0.814651 4.089637 -v 1.151280 0.830717 4.079480 -v 0.963746 0.816468 4.079480 -v 1.151280 0.830717 4.079480 -v 0.965106 0.814651 4.089637 -v 1.436269 0.871011 4.079480 -v 0.937493 0.837777 4.079480 -v 1.436269 0.871011 4.072710 -v 0.937493 0.837777 4.072709 -v 1.436269 0.871011 4.072710 -v 0.937493 0.837777 4.079480 -v 1.436269 0.531102 4.079480 -v 1.436269 0.871011 4.079480 -v 1.436269 0.531102 4.072709 -v 1.436269 0.871011 4.072710 -v 1.436269 0.531102 4.072709 -v 1.436269 0.871011 4.079480 -v 0.943115 0.531102 4.079480 -v 1.436269 0.531102 4.079480 -v 0.943115 0.531102 4.072709 -v 1.436269 0.531102 4.072709 -v 0.943115 0.531102 4.072709 -v 1.436269 0.531102 4.079480 -v 0.937493 0.837777 4.079480 -v 0.943115 0.531102 4.079480 -v 0.937493 0.837777 4.072709 -v 0.943115 0.531102 4.072709 -v 0.937493 0.837777 4.072709 -v 0.943115 0.531102 4.079480 -v 1.431223 0.876202 4.103107 -v 1.463327 0.875998 4.103107 -v 1.431223 0.876202 4.103107 -v 1.463327 0.875998 4.103107 -v 1.431223 0.876202 4.103107 -v 1.432105 0.929459 4.103107 -v 0.932939 0.893980 4.103106 -v 1.431223 0.876202 4.103107 -v 0.932939 0.893980 4.103106 -v 0.932939 0.893980 4.103106 -v 0.931880 0.845713 4.103106 -v 0.900381 0.845628 4.103106 -v 0.900381 0.845628 4.103106 -v 0.931880 0.845713 4.103106 -v 0.900381 0.845628 4.103106 -v 1.463328 0.115098 4.072709 -v 1.463327 0.094038 4.103106 -v 1.463328 0.115098 4.072709 -v 0.900379 0.115098 4.072709 -v 0.900380 0.094857 4.103106 -v 0.900380 0.094857 4.103106 -v 1.416597 0.551477 4.099793 -v 1.416597 0.551477 4.099793 -v 1.416597 0.849702 4.099793 -v 1.415779 0.848652 4.089637 -v 1.416597 0.849702 4.099793 -v 1.416597 0.849702 4.099793 -v 1.184321 0.831951 4.099792 -v 1.415779 0.552528 4.089636 -v 1.184321 0.551478 4.099793 -v 1.184321 0.551478 4.099793 -v 1.416597 0.551477 4.099793 -v 1.415779 0.552528 4.089636 -v 0.963747 0.551478 4.099792 -v 0.963747 0.551478 4.099792 -v 1.151281 0.551478 4.099793 -v 0.965106 0.553501 4.089636 -v 0.963746 0.816468 4.099793 -v 0.963746 0.816468 4.099793 -v 0.963747 0.551478 4.099792 -v 0.965106 0.553501 4.089636 -v 1.185139 0.552528 4.089636 -v 1.185139 0.831026 4.089637 -v 1.184321 0.831951 4.099792 -v 1.184321 0.831951 4.099792 -v 1.184321 0.551478 4.099793 -v 1.185139 0.552528 4.089636 -v 1.149922 0.553501 4.089636 -v 1.151281 0.551478 4.099793 -v 1.151281 0.551478 4.099793 -v 1.151280 0.830717 4.099792 -v 0.965106 0.814651 4.089637 -v 1.149922 0.828693 4.089637 -v 1.151280 0.830717 4.099792 -v 1.151280 0.830717 4.099792 -v 0.963746 0.816468 4.099793 -v 0.965106 0.814651 4.089637 -v 0.937493 0.837777 4.099792 -v 1.436269 0.871011 4.099793 -v 1.436269 0.871011 4.103107 -v 1.436269 0.871011 4.103107 -v 0.937493 0.837777 4.103106 -v 0.937493 0.837777 4.099792 -v 1.436269 0.871011 4.099793 -v 1.436269 0.531102 4.099793 -v 1.436269 0.531102 4.103107 -v 1.436269 0.531102 4.103107 -v 1.436269 0.871011 4.103107 -v 1.436269 0.871011 4.099793 -v 1.436269 0.531102 4.099793 -v 0.943115 0.531102 4.099792 -v 0.943115 0.531102 4.103106 -v 0.943115 0.531102 4.103106 -v 1.436269 0.531102 4.103107 -v 1.436269 0.531102 4.099793 -v 0.943115 0.531102 4.099792 -v 0.937493 0.837777 4.099792 -v 0.937493 0.837777 4.103106 -v 0.937493 0.837777 4.103106 -v 0.943115 0.531102 4.103106 -v 0.943115 0.531102 4.099792 -v 1.345370 0.115099 3.027511 -v 1.345370 0.133115 3.027511 -v 1.345370 0.115099 3.027511 -v 1.017895 0.115099 3.027511 -v 1.017895 0.133115 3.027511 -v 1.017895 0.133115 3.027511 -v 1.345370 0.115099 2.511425 -v 1.017895 0.115099 2.511426 -v 1.017895 0.133116 2.511426 -v 1.017895 0.133116 2.511426 -v 1.345370 0.133116 2.511426 -v 1.345370 0.115099 2.511425 -v 1.017895 0.133115 3.027511 -v 1.345370 0.133115 3.027511 -v 1.017895 0.133115 3.027511 -v 1.345370 0.133115 3.027511 -v 1.345370 0.133116 2.511426 -v 1.345370 0.133115 3.027511 -v 1.017895 0.133116 2.511426 -v 1.017895 0.133115 3.027511 -v 1.017895 0.133116 2.511426 -v 1.345370 0.133116 2.511426 -v 1.017895 0.133116 2.511426 -v 1.345370 0.133116 2.511426 -v 1.345370 0.115098 3.787743 -v 1.345370 0.133115 3.787743 -v 1.345370 0.115098 3.787743 -v 1.017895 0.115098 3.787743 -v 1.017895 0.133115 3.787743 -v 1.017895 0.133115 3.787743 -v 1.345370 0.115099 3.271658 -v 1.017895 0.115099 3.271658 -v 1.017895 0.133115 3.271658 -v 1.017895 0.133115 3.271658 -v 1.345370 0.133115 3.271658 -v 1.345370 0.115099 3.271658 -v 1.017895 0.133115 3.787743 -v 1.345370 0.133115 3.787743 -v 1.017895 0.133115 3.787743 -v 1.345370 0.133115 3.787743 -v 1.345370 0.133115 3.271658 -v 1.345370 0.133115 3.787743 -v 1.017895 0.133115 3.271658 -v 1.017895 0.133115 3.787743 -v 1.017895 0.133115 3.271658 -v 1.345370 0.133115 3.271658 -v 1.017895 0.133115 3.271658 -v 1.345370 0.133115 3.271658 -v 0.900378 0.115100 2.222918 -v 1.017895 0.115099 2.511426 -v 1.345370 0.115099 2.511425 -v 0.900378 0.115100 2.222918 -v 1.345370 0.115099 2.511425 -v 1.463327 0.115100 2.222918 -v 1.463327 0.115100 2.222918 -v 1.345370 0.115099 2.511425 -v 1.345370 0.115099 3.027511 -v 0.900378 0.115100 2.222918 -v 1.017895 0.115099 3.027511 -v 1.017895 0.115099 2.511426 -v 1.463327 0.115100 2.222918 -v 1.345370 0.115099 3.027511 -v 1.345370 0.115099 3.271658 -v 1.345370 0.115098 3.787743 -v 1.463328 0.115098 4.072709 -v 1.345370 0.115099 3.271658 -v 1.345370 0.115099 3.271658 -v 1.463328 0.115098 4.072709 -v 1.463327 0.115100 2.222918 -v 1.463327 0.115100 2.222918 -v 1.463328 0.115098 4.072709 -v 1.463327 0.094038 4.103106 -v 1.463327 0.094038 4.103106 -v 1.463325 0.093492 2.192520 -v 1.463327 0.115100 2.222918 -v 1.017895 0.115099 3.271658 -v 1.345370 0.115099 3.027511 -v 1.017895 0.115099 3.027511 -v 1.017895 0.115099 3.271658 -v 1.345370 0.115099 3.271658 -v 1.345370 0.115099 3.027511 -v 1.017895 0.115099 3.027511 -v 0.900378 0.115100 2.222918 -v 1.017895 0.115099 3.271658 -v 0.900379 0.115098 4.072709 -v 1.017895 0.115098 3.787743 -v 1.017895 0.115099 3.271658 -v 0.900379 0.115098 4.072709 -v 1.017895 0.115099 3.271658 -v 0.900378 0.115100 2.222918 -v 0.900379 0.115098 4.072709 -v 0.900378 0.115100 2.222918 -v 0.900380 0.094857 4.103106 -v 0.900380 0.094857 4.103106 -v 0.900378 0.115100 2.222918 -v 0.900378 0.094311 2.192519 -v 0.900379 0.115098 4.072709 -v 1.463328 0.115098 4.072709 -v 1.017895 0.115098 3.787743 -v 1.345370 0.115098 3.787743 -v 1.017895 0.115098 3.787743 -v 1.463328 0.115098 4.072709 -v 1.417001 0.546753 1.223843 -v 1.417000 0.841969 1.223843 -v 1.417001 0.546753 1.223843 -v 1.416366 0.841163 1.227852 -v 1.417000 0.841969 1.223843 -v 1.184725 0.824397 1.223843 -v 1.417000 0.841969 1.223843 -v 1.416366 0.547560 1.227852 -v 1.184725 0.546753 1.223843 -v 1.417001 0.546753 1.223843 -v 1.184725 0.546753 1.223843 -v 1.416366 0.547560 1.227852 -v 0.964151 0.546753 1.223843 -v 1.151685 0.546753 1.223843 -v 0.964151 0.546753 1.223843 -v 0.964919 0.547886 1.227852 -v 0.964150 0.809070 1.223843 -v 0.964151 0.546753 1.223843 -v 0.964150 0.809070 1.223843 -v 0.964919 0.547886 1.227852 -v 1.185360 0.823687 1.227853 -v 1.185359 0.547560 1.227852 -v 1.184725 0.824397 1.223843 -v 1.184725 0.546753 1.223843 -v 1.184725 0.824397 1.223843 -v 1.185359 0.547560 1.227852 -v 1.150915 0.547886 1.227852 -v 1.151685 0.546753 1.223843 -v 1.151684 0.823175 1.223843 -v 1.151685 0.546753 1.223843 -v 1.150916 0.822042 1.227853 -v 0.964919 0.808053 1.227853 -v 1.151684 0.823175 1.223843 -v 0.964150 0.809070 1.223843 -v 1.151684 0.823175 1.223843 -v 0.964919 0.808053 1.227853 -v 1.436672 0.863063 1.223843 -v 0.943519 0.830164 1.223843 -v 1.436672 0.863063 1.218051 -v 0.943519 0.830164 1.218051 -v 1.436672 0.863063 1.218051 -v 0.943519 0.830164 1.223843 -v 1.436672 0.526584 1.223843 -v 1.436672 0.863063 1.223843 -v 1.436672 0.526584 1.218050 -v 1.436672 0.863063 1.218051 -v 1.436672 0.526584 1.218050 -v 1.436672 0.863063 1.223843 -v 0.943519 0.830164 1.223843 -v 0.943519 0.526584 1.223843 -v 0.943519 0.830164 1.218051 -v 0.943519 0.526583 1.218050 -v 0.943519 0.830164 1.218051 -v 0.943519 0.526584 1.223843 -v 0.943519 0.526584 1.223843 -v 1.436672 0.526584 1.223843 -v 0.943519 0.526583 1.218050 -v 1.436672 0.526584 1.218050 -v 0.943519 0.526583 1.218050 -v 1.436672 0.526584 1.223843 -v 1.463730 0.109174 1.218051 -v 1.463727 0.936778 1.218442 -v 1.463728 0.867985 1.250921 -v 1.463728 0.867985 1.250921 -v 1.463731 0.109174 1.251065 -v 1.463730 0.109174 1.218051 -v 1.417001 0.546753 1.237170 -v 1.417001 0.546753 1.237170 -v 1.417000 0.841969 1.237170 -v 1.416366 0.841163 1.227852 -v 1.417000 0.841969 1.237170 -v 1.417000 0.841969 1.237170 -v 1.184725 0.824397 1.237170 -v 1.416366 0.547560 1.227852 -v 1.184725 0.546753 1.237170 -v 1.184725 0.546753 1.237170 -v 1.417001 0.546753 1.237170 -v 1.416366 0.547560 1.227852 -v 0.964151 0.546753 1.237170 -v 0.964151 0.546753 1.237170 -v 1.151685 0.546753 1.237170 -v 0.964919 0.547886 1.227852 -v 0.964150 0.809070 1.237170 -v 0.964150 0.809070 1.237170 -v 0.964151 0.546753 1.237170 -v 0.964919 0.547886 1.227852 -v 1.185359 0.547560 1.227852 -v 1.185360 0.823687 1.227853 -v 1.184725 0.824397 1.237170 -v 1.184725 0.824397 1.237170 -v 1.184725 0.546753 1.237170 -v 1.185359 0.547560 1.227852 -v 1.150915 0.547886 1.227852 -v 1.151685 0.546753 1.237170 -v 1.151685 0.546753 1.237170 -v 1.151684 0.823175 1.237170 -v 0.964919 0.808053 1.227853 -v 1.150916 0.822042 1.227853 -v 1.151684 0.823175 1.237170 -v 1.151684 0.823175 1.237170 -v 0.964150 0.809070 1.237170 -v 0.964919 0.808053 1.227853 -v 0.943519 0.830164 1.237170 -v 1.436672 0.863063 1.237170 -v 1.436672 0.863063 1.251065 -v 1.436672 0.863063 1.251065 -v 0.943519 0.830164 1.251065 -v 0.943519 0.830164 1.237170 -v 1.436672 0.863063 1.237170 -v 1.436672 0.526584 1.237170 -v 1.436672 0.526584 1.251065 -v 1.436672 0.526584 1.251065 -v 1.436672 0.863063 1.251065 -v 1.436672 0.863063 1.237170 -v 0.943519 0.526583 1.237170 -v 0.943519 0.830164 1.237170 -v 0.943519 0.830164 1.251065 -v 0.943519 0.830164 1.251065 -v 0.943519 0.526583 1.251065 -v 0.943519 0.526583 1.237170 -v 1.436672 0.526584 1.237170 -v 0.943519 0.526583 1.237170 -v 0.943519 0.526583 1.251065 -v 0.943519 0.526583 1.251065 -v 1.436672 0.526584 1.251065 -v 1.436672 0.526584 1.237170 -v 0.933952 0.899798 1.251059 -v 0.933952 0.109174 1.251058 -v 0.933952 0.899798 1.251059 -v 0.933952 0.899798 1.251059 -v 0.933952 0.109174 1.251058 -v 0.920026 0.546798 1.273052 -v 0.920026 0.546798 1.273052 -v 0.920025 0.809114 1.273052 -v 0.910735 0.547919 1.273593 -v 0.920026 0.546797 1.399789 -v 0.920026 0.546797 1.399789 -v 0.920026 0.546798 1.273052 -v 0.910735 0.547919 1.273593 -v 0.920026 0.546797 1.564079 -v 0.920026 0.546797 1.564079 -v 0.920026 0.546797 1.437342 -v 0.920026 0.546797 1.725902 -v 0.920026 0.546797 1.725902 -v 0.920026 0.546797 1.599165 -v 0.910735 0.807993 1.273594 -v 0.920025 0.809114 1.273052 -v 0.920025 0.809114 1.273052 -v 0.920025 0.809114 1.399789 -v 0.910734 0.547273 1.725346 -v 0.920026 0.809114 1.725902 -v 0.920026 0.809114 1.725902 -v 0.920026 0.546797 1.725902 -v 0.910734 0.547273 1.725346 -v 0.910735 0.547918 1.399247 -v 0.910735 0.807993 1.399248 -v 0.920025 0.809114 1.399789 -v 0.920025 0.809114 1.399789 -v 0.920026 0.546797 1.399789 -v 0.910735 0.547918 1.399247 -v 0.910735 0.547958 1.437903 -v 0.920026 0.546797 1.437342 -v 0.920026 0.546797 1.437342 -v 0.920025 0.809114 1.437342 -v 0.910735 0.807953 1.437903 -v 0.920025 0.809114 1.437342 -v 0.920025 0.809114 1.437342 -v 0.920025 0.809114 1.564079 -v 0.910735 0.547958 1.563518 -v 0.910735 0.807953 1.563518 -v 0.920025 0.809114 1.564079 -v 0.920025 0.809114 1.564079 -v 0.920026 0.546797 1.564079 -v 0.910735 0.547958 1.563518 -v 0.910734 0.547273 1.599721 -v 0.920026 0.546797 1.599165 -v 0.920026 0.546797 1.599165 -v 0.920025 0.809114 1.599165 -v 0.910735 0.808665 1.725346 -v 0.910735 0.808665 1.599721 -v 0.920025 0.809114 1.599165 -v 0.920025 0.809114 1.599165 -v 0.920026 0.809114 1.725902 -v 0.910735 0.808665 1.725346 -v 0.920025 0.830208 1.253380 -v 0.920026 0.526628 1.253380 -v 0.933962 0.526628 1.253380 -v 0.933962 0.526628 1.253380 -v 0.933962 0.830208 1.253380 -v 0.920025 0.830208 1.253380 -v 0.920025 0.830208 1.746534 -v 0.920025 0.830208 1.253380 -v 0.933962 0.830208 1.253380 -v 0.933962 0.830208 1.253380 -v 0.933962 0.830208 1.746534 -v 0.920025 0.830208 1.746534 -v 0.920026 0.526627 1.746534 -v 0.920025 0.830208 1.746534 -v 0.933962 0.830208 1.746534 -v 0.933962 0.830208 1.746534 -v 0.933962 0.526627 1.746533 -v 0.920026 0.526627 1.746534 -v 0.920026 0.526628 1.253380 -v 0.920026 0.526627 1.746534 -v 0.933962 0.526627 1.746533 -v 0.933962 0.526627 1.746533 -v 0.933962 0.526628 1.253380 -v 0.920026 0.526628 1.253380 -v 0.900781 0.897513 1.218051 -v 0.900781 0.897513 1.218051 -v 0.900605 0.094032 1.218040 -v 0.900781 0.897513 1.218051 -v 0.900605 0.094032 1.218040 -v 0.906754 0.546798 1.273052 -v 0.906753 0.809114 1.273052 -v 0.906754 0.546798 1.273052 -v 0.910735 0.547919 1.273593 -v 0.906754 0.546797 1.399789 -v 0.906754 0.546798 1.273052 -v 0.906754 0.546797 1.399789 -v 0.910735 0.547919 1.273593 -v 0.906754 0.546797 1.564079 -v 0.906754 0.546797 1.437342 -v 0.906754 0.546797 1.564079 -v 0.906754 0.546797 1.725902 -v 0.906754 0.546797 1.599165 -v 0.906754 0.546797 1.725902 -v 0.910735 0.807993 1.273594 -v 0.906753 0.809114 1.273052 -v 0.906753 0.809114 1.399789 -v 0.906753 0.809114 1.273052 -v 0.910734 0.547273 1.725346 -v 0.906753 0.809114 1.725902 -v 0.906754 0.546797 1.725902 -v 0.906753 0.809114 1.725902 -v 0.910734 0.547273 1.725346 -v 0.910735 0.807993 1.399248 -v 0.910735 0.547918 1.399247 -v 0.906753 0.809114 1.399789 -v 0.906754 0.546797 1.399789 -v 0.906753 0.809114 1.399789 -v 0.910735 0.547918 1.399247 -v 0.910735 0.547958 1.437903 -v 0.906754 0.546797 1.437342 -v 0.906753 0.809114 1.437342 -v 0.906754 0.546797 1.437342 -v 0.910735 0.807953 1.437903 -v 0.906753 0.809114 1.437342 -v 0.906753 0.809114 1.564079 -v 0.906753 0.809114 1.437342 -v 0.910735 0.807953 1.563518 -v 0.910735 0.547958 1.563518 -v 0.906753 0.809114 1.564079 -v 0.906754 0.546797 1.564079 -v 0.906753 0.809114 1.564079 -v 0.910735 0.547958 1.563518 -v 0.910734 0.547273 1.599721 -v 0.906754 0.546797 1.599165 -v 0.906753 0.809114 1.599165 -v 0.906754 0.546797 1.599165 -v 0.910735 0.808665 1.599721 -v 0.910735 0.808665 1.725346 -v 0.906753 0.809114 1.599165 -v 0.906753 0.809114 1.725902 -v 0.906753 0.809114 1.599165 -v 0.910735 0.808665 1.725346 -v 0.906754 0.526628 1.253380 -v 0.906753 0.830208 1.253380 -v 0.900781 0.526628 1.253380 -v 0.900781 0.830208 1.253380 -v 0.900781 0.526628 1.253380 -v 0.906753 0.830208 1.253380 -v 0.906753 0.830208 1.253380 -v 0.906753 0.830208 1.746534 -v 0.900781 0.830208 1.253380 -v 0.900780 0.830208 1.746534 -v 0.900781 0.830208 1.253380 -v 0.906753 0.830208 1.746534 -v 0.906753 0.830208 1.746534 -v 0.906754 0.526627 1.746533 -v 0.900780 0.830208 1.746534 -v 0.900780 0.526628 1.746534 -v 0.900780 0.830208 1.746534 -v 0.906754 0.526627 1.746533 -v 0.906754 0.526627 1.746533 -v 0.906754 0.526628 1.253380 -v 0.900780 0.526628 1.746534 -v 0.900781 0.526628 1.253380 -v 0.900780 0.526628 1.746534 -v 0.906754 0.526628 1.253380 -v 0.900748 0.897512 1.781117 -v 0.900748 0.897512 1.781117 -v 0.900749 0.094193 1.781114 -v 0.900749 0.094193 1.781114 -v 0.900749 0.094193 1.781114 -v 0.900749 0.094193 1.781114 -v 1.416935 0.546753 1.775442 -v 1.416935 0.546753 1.775442 -v 1.416935 0.841969 1.775442 -v 1.416300 0.841162 1.771433 -v 1.416935 0.841969 1.775442 -v 1.416935 0.841969 1.775442 -v 1.184659 0.824397 1.775442 -v 1.416300 0.547559 1.771433 -v 1.184659 0.546753 1.775442 -v 1.184659 0.546753 1.775442 -v 1.416935 0.546753 1.775442 -v 1.416300 0.547559 1.771433 -v 0.964085 0.546753 1.775442 -v 0.964085 0.546753 1.775442 -v 1.151619 0.546753 1.775442 -v 0.964854 0.547886 1.771433 -v 0.964086 0.809070 1.775442 -v 0.964086 0.809070 1.775442 -v 0.964085 0.546753 1.775442 -v 0.964854 0.547886 1.771433 -v 1.185294 0.547559 1.771433 -v 1.185294 0.823686 1.771433 -v 1.184659 0.824397 1.775442 -v 1.184659 0.824397 1.775442 -v 1.184659 0.546753 1.775442 -v 1.185294 0.547559 1.771433 -v 1.150850 0.547886 1.771433 -v 1.151619 0.546753 1.775442 -v 1.151619 0.546753 1.775442 -v 1.151619 0.823175 1.775442 -v 0.964854 0.808052 1.771433 -v 1.150850 0.822042 1.771433 -v 1.151619 0.823175 1.775442 -v 1.151619 0.823175 1.775442 -v 0.964086 0.809070 1.775442 -v 0.964854 0.808052 1.771433 -v 0.943453 0.830163 1.775442 -v 1.436607 0.863063 1.775442 -v 1.436607 0.863063 1.781234 -v 1.436607 0.863063 1.781234 -v 0.943453 0.830163 1.781234 -v 0.943453 0.830163 1.775442 -v 1.436607 0.863063 1.775442 -v 1.436607 0.526583 1.775442 -v 1.436607 0.526583 1.781234 -v 1.436607 0.526583 1.781234 -v 1.436607 0.863063 1.781234 -v 1.436607 0.863063 1.775442 -v 0.943453 0.526583 1.775442 -v 0.943453 0.830163 1.775442 -v 0.943453 0.830163 1.781234 -v 0.943453 0.830163 1.781234 -v 0.943453 0.526583 1.781234 -v 0.943453 0.526583 1.775442 -v 1.436607 0.526583 1.775442 -v 0.943453 0.526583 1.775442 -v 0.943453 0.526583 1.781234 -v 0.943453 0.526583 1.781234 -v 1.436607 0.526583 1.781234 -v 1.436607 0.526583 1.775442 -v 0.933941 0.899524 1.748221 -v 0.933941 0.899524 1.748221 -v 0.933941 0.899524 1.748221 -v 0.933941 0.109174 1.748220 -v 0.933941 0.109174 1.748220 -v 0.933941 0.109174 1.748220 -v 0.933941 0.109174 1.748220 -v 1.463727 0.936778 1.780627 -v 1.463663 0.093374 1.781233 -v 1.463696 0.867985 1.748138 -v 1.463665 0.109174 1.748219 -v 1.463696 0.867985 1.748138 -v 1.463663 0.093374 1.781233 -v 1.416935 0.546753 1.762115 -v 1.416935 0.841969 1.762115 -v 1.416935 0.546753 1.762115 -v 1.416300 0.841162 1.771433 -v 1.416935 0.841969 1.762115 -v 1.184659 0.824397 1.762116 -v 1.416935 0.841969 1.762115 -v 1.416300 0.547559 1.771433 -v 1.184659 0.546753 1.762115 -v 1.416935 0.546753 1.762115 -v 1.184659 0.546753 1.762115 -v 1.416300 0.547559 1.771433 -v 0.964085 0.546753 1.762115 -v 1.151619 0.546753 1.762115 -v 0.964085 0.546753 1.762115 -v 0.964854 0.547886 1.771433 -v 0.964086 0.809070 1.762115 -v 0.964085 0.546753 1.762115 -v 0.964086 0.809070 1.762115 -v 0.964854 0.547886 1.771433 -v 1.185294 0.823686 1.771433 -v 1.185294 0.547559 1.771433 -v 1.184659 0.824397 1.762116 -v 1.184659 0.546753 1.762115 -v 1.184659 0.824397 1.762116 -v 1.185294 0.547559 1.771433 -v 1.150850 0.547886 1.771433 -v 1.151619 0.546753 1.762115 -v 1.151619 0.823175 1.762115 -v 1.151619 0.546753 1.762115 -v 1.150850 0.822042 1.771433 -v 0.964854 0.808052 1.771433 -v 1.151619 0.823175 1.762115 -v 0.964086 0.809070 1.762115 -v 1.151619 0.823175 1.762115 -v 0.964854 0.808052 1.771433 -v 1.436607 0.863062 1.762115 -v 0.943453 0.830163 1.762115 -v 1.436607 0.863062 1.748220 -v 0.943454 0.830163 1.748220 -v 1.436607 0.863062 1.748220 -v 0.943453 0.830163 1.762115 -v 1.436607 0.526583 1.762115 -v 1.436607 0.863062 1.762115 -v 1.436607 0.526583 1.748220 -v 1.436607 0.863062 1.748220 -v 1.436607 0.526583 1.748220 -v 1.436607 0.863062 1.762115 -v 0.943453 0.830163 1.762115 -v 0.943453 0.526583 1.762115 -v 0.943454 0.830163 1.748220 -v 0.943453 0.526583 1.748220 -v 0.943454 0.830163 1.748220 -v 0.943453 0.526583 1.762115 -v 0.943453 0.526583 1.762115 -v 1.436607 0.526583 1.762115 -v 0.943453 0.526583 1.748220 -v 1.436607 0.526583 1.748220 -v 0.943453 0.526583 1.748220 -v 1.436607 0.526583 1.762115 -v 1.463731 0.109174 1.251065 -v 1.463665 0.109174 1.748219 -v 1.463663 0.093374 1.781233 -v 1.463663 0.093374 1.781233 -v 1.463730 0.109174 1.218051 -v 1.463731 0.109174 1.251065 -v 0.933941 0.109174 1.748220 -v 1.463665 0.109174 1.748219 -v 1.463731 0.109174 1.251065 -v 1.463731 0.109174 1.251065 -v 0.933952 0.109174 1.251058 -v 0.933941 0.109174 1.748220 -vt 0.072063 0.334485 -vt 0.072254 0.325338 -vt 0.006016 0.325338 -vt 0.072063 0.344919 -vt 0.072062 0.990283 -vt 0.072062 0.979849 -vt 0.006015 1.000000 -vt 0.072254 1.000000 -vt 0.008805 0.325338 -vt 0.071820 0.334485 -vt 0.008675 0.334485 -vt 0.071820 0.979849 -vt 0.008675 0.979849 -vt 0.008805 0.976806 -vt 0.008675 0.990283 -vt 0.071820 0.990283 -vt 0.008805 1.000000 -vt 0.000001 0.006016 -vt 0.001446 0.072254 -vt 0.058890 0.072254 -vt 0.057412 0.008805 -vt 0.001446 0.325338 -vt 0.001711 0.334485 -vt 0.058642 0.334485 -vt 0.058890 0.325338 -vt 0.001710 0.990283 -vt 0.001445 1.000000 -vt 0.058889 1.000000 -vt 0.058641 0.990283 -vt 0.001445 0.072254 -vt 0.000000 0.006015 -vt 0.057410 0.008805 -vt 0.058889 0.072254 -vt 0.072254 0.348777 -vt 0.008675 0.344919 -vt 0.071820 0.344919 -vt 0.001711 0.344919 -vt 0.058890 0.348777 -vt 0.058642 0.344919 -vt 0.008805 0.348776 -vt 0.072254 0.976806 -vt 0.147758 0.075524 -vt 0.146225 0.013162 -vt 0.146223 0.013162 -vt 0.147757 0.075524 -vt 0.108072 0.325531 -vt 0.108072 0.334485 -vt 0.052924 0.325338 -vt 0.108072 0.344919 -vt 0.108071 0.979849 -vt 0.108071 0.990283 -vt 0.052924 1.000000 -vt 0.108071 0.999614 -vt 0.108824 0.325338 -vt 0.050213 0.325338 -vt 0.107970 0.334485 -vt 0.050740 0.334485 -vt 0.050741 0.979849 -vt 0.107970 0.979849 -vt 0.050213 0.976805 -vt 0.107970 0.990283 -vt 0.050741 0.990283 -vt 0.108824 1.000000 -vt 0.050213 1.000000 -vt 0.999995 0.108072 -vt 0.999706 0.052924 -vt 0.944281 0.108824 -vt 0.942296 0.050213 -vt 0.999995 0.334485 -vt 0.999995 0.325531 -vt 0.944252 0.334485 -vt 0.944281 0.325338 -vt 0.999994 0.999614 -vt 0.999994 0.990283 -vt 0.944280 1.000000 -vt 0.944137 0.990283 -vt 0.999705 0.052924 -vt 0.999994 0.108071 -vt 0.942294 0.050213 -vt 0.944280 0.108824 -vt 0.050740 0.344919 -vt 0.108824 0.348776 -vt 0.107970 0.344919 -vt 0.944282 0.348776 -vt 0.999995 0.344919 -vt 0.944252 0.344919 -vt 0.050213 0.348776 -vt 0.108824 0.976805 -vt 0.944282 0.108824 -vt 0.855414 0.105166 -vt 0.853480 0.046037 -vt 0.942295 0.050213 -vt 0.853479 0.046037 -vt 0.855413 0.105166 -vt 0.058642 0.071820 -vt 0.924214 0.117380 -vt 0.049694 0.077975 -vt 0.001711 0.072063 -vt 0.001711 0.974240 -vt 0.049694 0.480996 -vt 0.057078 0.008675 -vt 0.942060 0.050740 -vt 0.944252 0.107970 -vt 1.000000 0.974239 -vt 0.924213 0.480995 -vt 0.496477 0.124287 -vt 0.084579 0.103240 -vt 0.084579 0.456837 -vt 0.496478 0.456837 -vt 0.555070 0.456837 -vt 0.887627 0.456837 -vt 0.887627 0.142645 -vt 0.555069 0.125751 -vt 0.104485 0.339109 -vt 0.455592 0.339109 -vt 0.456837 0.342595 -vt 0.103240 0.342595 -vt 0.495027 0.339109 -vt 0.086029 0.339109 -vt 0.084579 0.342595 -vt 0.496477 0.342595 -vt 0.495028 0.339109 -vt 0.496478 0.342595 -vt 0.557479 0.339109 -vt 0.885216 0.339108 -vt 0.887627 0.342595 -vt 0.555070 0.342595 -vt 0.454438 0.339108 -vt 0.144800 0.339109 -vt 0.142645 0.342595 -vt 0.125384 0.339109 -vt 0.124287 0.342595 -vt 0.128150 0.339109 -vt 0.454438 0.339109 -vt 0.125751 0.342595 -vt 0.885217 0.339109 -vt 0.555069 0.342595 -vt 0.924214 0.342595 -vt 0.049694 0.342595 -vt 0.049694 0.344919 -vt 0.924214 0.344919 -vt 0.077975 0.342595 -vt 0.480996 0.342595 -vt 0.480996 0.344919 -vt 0.077975 0.344919 -vt 0.924213 0.342595 -vt 0.924213 0.344919 -vt 0.480995 0.342595 -vt 0.117380 0.342595 -vt 0.117380 0.344919 -vt 0.480995 0.344919 -vt 0.001713 0.999860 -vt 0.999999 0.998889 -vt 0.974240 0.344919 -vt 0.999860 0.334485 -vt 0.974239 0.344919 -vt 0.998889 0.334485 -vt 0.456837 0.335622 -vt 0.103240 0.335623 -vt 0.084579 0.335623 -vt 0.496477 0.335623 -vt 0.496478 0.335622 -vt 0.084579 0.335622 -vt 0.887627 0.335622 -vt 0.555070 0.335622 -vt 0.142645 0.335622 -vt 0.124287 0.335623 -vt 0.125751 0.335623 -vt 0.555069 0.335623 -vt 0.049694 0.335623 -vt 0.924214 0.335622 -vt 0.049694 0.334485 -vt 0.924214 0.334485 -vt 0.480996 0.335622 -vt 0.077975 0.335623 -vt 0.480996 0.334485 -vt 0.077975 0.334485 -vt 0.924213 0.335622 -vt 0.049694 0.335622 -vt 0.924213 0.334485 -vt 0.117380 0.335622 -vt 0.480995 0.335622 -vt 0.117380 0.334485 -vt 0.480995 0.334485 -vt 0.934182 0.117380 -vt 0.058641 0.071820 -vt 0.049693 0.077975 -vt 0.001710 0.072062 -vt 0.001709 0.974239 -vt 0.049693 0.480995 -vt 0.057077 0.008675 -vt 0.942258 0.050741 -vt 0.944137 0.107970 -vt 0.999998 0.974239 -vt 0.084578 0.103240 -vt 0.084577 0.456837 -vt 0.496477 0.456837 -vt 0.555068 0.456837 -vt 0.887626 0.456837 -vt 0.887626 0.142645 -vt 0.555068 0.125750 -vt 0.455592 0.985659 -vt 0.104485 0.985659 -vt 0.456837 0.982173 -vt 0.103240 0.982173 -vt 0.086028 0.985659 -vt 0.495026 0.985659 -vt 0.084578 0.982173 -vt 0.496477 0.982173 -vt 0.495027 0.985659 -vt 0.084577 0.982173 -vt 0.885216 0.985659 -vt 0.557478 0.985659 -vt 0.887626 0.982173 -vt 0.555068 0.982173 -vt 0.144799 0.985659 -vt 0.454437 0.985659 -vt 0.142645 0.982173 -vt 0.125384 0.985659 -vt 0.124287 0.982173 -vt 0.454438 0.985659 -vt 0.128150 0.985659 -vt 0.125750 0.982173 -vt 0.049693 0.982173 -vt 0.934182 0.982173 -vt 0.049693 0.979849 -vt 0.934182 0.979849 -vt 0.480995 0.982173 -vt 0.077975 0.982173 -vt 0.480995 0.979849 -vt 0.077975 0.979849 -vt 0.924213 0.982173 -vt 0.924213 0.979849 -vt 0.117380 0.982173 -vt 0.117380 0.979849 -vt 0.001710 0.999210 -vt 0.999997 0.998239 -vt 0.974239 0.979849 -vt 0.999210 0.990283 -vt 0.998239 0.990283 -vt 0.456837 0.989146 -vt 0.103240 0.989146 -vt 0.084578 0.989146 -vt 0.496477 0.989145 -vt 0.496477 0.989146 -vt 0.084577 0.989146 -vt 0.887626 0.989145 -vt 0.555068 0.989146 -vt 0.142645 0.989146 -vt 0.456837 0.989145 -vt 0.124287 0.989145 -vt 0.125750 0.989145 -vt 0.555068 0.989145 -vt 0.887626 0.989146 -vt 0.934182 0.989145 -vt 0.049693 0.989146 -vt 0.049693 0.990283 -vt 0.934182 0.990283 -vt 0.077975 0.989146 -vt 0.480995 0.989146 -vt 0.480995 0.990283 -vt 0.077975 0.990283 -vt 0.924213 0.989145 -vt 0.924213 0.990283 -vt 0.480995 0.989145 -vt 0.117380 0.989145 -vt 0.117380 0.990283 -vt 0.791605 0.974240 -vt 0.210886 0.974240 -vt 0.210886 0.952878 -vt 0.791605 0.952878 -vt 0.974240 0.621091 -vt 0.974240 0.443947 -vt 0.952878 0.443948 -vt 0.952878 0.621091 -vt 0.974240 0.443948 -vt 0.791605 0.621091 -vt 0.210886 0.621091 -vt 0.328316 0.604459 -vt 0.674520 0.604459 -vt 0.210886 0.443948 -vt 0.328316 0.461308 -vt 0.791605 0.443948 -vt 0.674520 0.461308 -vt 0.974240 0.882036 -vt 0.974240 0.704893 -vt 0.952878 0.704893 -vt 0.952878 0.882036 -vt 0.791605 0.882036 -vt 0.210886 0.882036 -vt 0.328317 0.865404 -vt 0.674520 0.865404 -vt 0.210886 0.704893 -vt 0.328317 0.722254 -vt 0.791605 0.704893 -vt 0.674520 0.722254 -vt 1.000000 0.344919 -vt 0.210886 0.443947 -vt 0.001709 0.979849 -vt 0.999998 0.979849 -vt 0.923496 0.126410 -vt 0.001001 0.000000 -vt 0.048977 0.087402 -vt 0.000995 0.981267 -vt 0.048978 0.486356 -vt 0.999285 0.046556 -vt 0.999597 0.999220 -vt 0.923497 0.486356 -vt 0.083862 0.112412 -vt 0.495761 0.133247 -vt 0.083862 0.462441 -vt 0.495761 0.462441 -vt 0.554352 0.462441 -vt 0.886909 0.462441 -vt 0.886910 0.151420 -vt 0.554352 0.134696 -vt 0.461485 0.003368 -vt 0.113368 0.003368 -vt 0.462441 0.001992 -vt 0.112412 0.001991 -vt 0.084988 0.003368 -vt 0.494635 0.003368 -vt 0.083862 0.001991 -vt 0.495761 0.001992 -vt 0.494636 0.003368 -vt 0.083862 0.001992 -vt 0.885547 0.003368 -vt 0.555716 0.003368 -vt 0.886909 0.001992 -vt 0.554352 0.001992 -vt 0.152626 0.003368 -vt 0.461098 0.003368 -vt 0.151420 0.001992 -vt 0.134089 0.003368 -vt 0.133247 0.001992 -vt 0.136039 0.003368 -vt 0.134696 0.001992 -vt 0.555715 0.003368 -vt 0.886910 0.001992 -vt 0.048977 0.001992 -vt 0.923496 0.001992 -vt 0.048977 0.000004 -vt 0.923496 0.000004 -vt 0.486356 0.001992 -vt 0.087402 0.001992 -vt 0.486356 0.000004 -vt 0.087402 0.000004 -vt 0.126410 0.001992 -vt 0.126410 0.000004 -vt 0.923497 0.001992 -vt 0.048978 0.001992 -vt 0.923497 0.000004 -vt 0.048978 0.000004 -vt 0.057956 0.081446 -vt 0.048978 0.087402 -vt 0.000998 0.081566 -vt 0.057913 0.002739 -vt 0.940461 0.043846 -vt 0.940461 0.981267 -vt 0.923497 0.126410 -vt 0.886910 0.462441 -vt 0.981267 0.000004 -vt 0.000000 0.000138 -vt 0.081566 0.011286 -vt 0.981267 0.011336 -vt 0.462441 0.006566 -vt 0.112412 0.006566 -vt 0.083862 0.006566 -vt 0.495761 0.006566 -vt 0.886910 0.006566 -vt 0.554352 0.006566 -vt 0.151420 0.006566 -vt 0.133247 0.006566 -vt 0.134696 0.006566 -vt 0.923497 0.006566 -vt 0.048977 0.006566 -vt 0.048978 0.011335 -vt 0.923496 0.011335 -vt 0.087402 0.006566 -vt 0.486356 0.006566 -vt 0.486356 0.011335 -vt 0.087402 0.011335 -vt 0.126410 0.006566 -vt 0.126410 0.011335 -vt 0.048978 0.006566 -vt 0.923497 0.011335 -vt 0.126357 0.012130 -vt 0.486303 0.012130 -vt 0.043846 0.011333 -vt 0.981267 0.011333 -vt 0.044170 0.181981 -vt 0.126357 0.181402 -vt 0.981267 0.181981 -vt 0.486303 0.181402 -vt 0.462389 0.018882 -vt 0.462389 0.062384 -vt 0.462389 0.075274 -vt 0.462389 0.118776 -vt 0.462389 0.130819 -vt 0.462389 0.174321 -vt 0.151367 0.062384 -vt 0.151367 0.018882 -vt 0.151367 0.174321 -vt 0.151367 0.075274 -vt 0.151367 0.118776 -vt 0.151367 0.130819 -vt 0.981633 0.152696 -vt 0.981633 0.461060 -vt 0.965157 0.462389 -vt 0.965158 0.151367 -vt 0.981633 0.019068 -vt 0.981633 0.062198 -vt 0.965157 0.062384 -vt 0.965157 0.018882 -vt 0.981633 0.075466 -vt 0.981633 0.118583 -vt 0.965157 0.118776 -vt 0.965157 0.075274 -vt 0.981634 0.131010 -vt 0.981634 0.174130 -vt 0.965157 0.174321 -vt 0.965157 0.130819 -vt 0.965158 0.018882 -vt 0.965158 0.062384 -vt 0.981634 0.461825 -vt 0.981633 0.151900 -vt 0.965157 0.151367 -vt 0.981633 0.152743 -vt 0.981633 0.461013 -vt 0.965158 0.075274 -vt 0.965158 0.118776 -vt 0.981633 0.174130 -vt 0.981633 0.131010 -vt 0.965158 0.130819 -vt 0.965158 0.126357 -vt 0.965157 0.486303 -vt 0.940444 0.486303 -vt 0.940443 0.126357 -vt 0.965158 0.181402 -vt 0.965158 0.012130 -vt 0.940443 0.012130 -vt 0.940444 0.181402 -vt 0.940444 0.126357 -vt 0.965157 0.012130 -vt 0.965157 0.181402 -vt 0.940444 0.012130 -vt 0.486304 0.012130 -vt 0.046556 0.000004 -vt 0.999220 0.000000 -vt 0.046556 0.193273 -vt 0.999029 0.193272 -vt 0.988694 0.462389 -vt 0.988694 0.151367 -vt 0.988694 0.062384 -vt 0.988694 0.018882 -vt 0.988694 0.118776 -vt 0.988694 0.075274 -vt 0.988694 0.174321 -vt 0.988694 0.130819 -vt 0.988694 0.486304 -vt 0.988694 0.126357 -vt 0.999286 0.486304 -vt 0.999285 0.126357 -vt 0.988694 0.012130 -vt 0.988694 0.181402 -vt 0.999285 0.012130 -vt 0.999286 0.181402 -vt 0.988694 0.486303 -vt 0.999286 0.126357 -vt 0.999286 0.486303 -vt 0.999286 0.012130 -vt 0.923613 0.126410 -vt 0.049094 0.087402 -vt 0.001113 1.000000 -vt 0.049094 0.486356 -vt 0.999343 0.046556 -vt 0.999341 0.999029 -vt 0.923613 0.486356 -vt 0.495877 0.133247 -vt 0.083978 0.112412 -vt 0.083978 0.462441 -vt 0.495877 0.462441 -vt 0.554468 0.462441 -vt 0.887026 0.462441 -vt 0.887025 0.151420 -vt 0.554469 0.134696 -vt 0.113368 0.189949 -vt 0.461485 0.189949 -vt 0.462441 0.191325 -vt 0.112412 0.191325 -vt 0.494751 0.189949 -vt 0.085104 0.189949 -vt 0.083978 0.191325 -vt 0.495877 0.191325 -vt 0.494752 0.189949 -vt 0.555831 0.189949 -vt 0.885664 0.189949 -vt 0.887026 0.191325 -vt 0.554468 0.191325 -vt 0.461098 0.189949 -vt 0.152626 0.189949 -vt 0.151420 0.191325 -vt 0.134089 0.189949 -vt 0.133247 0.191325 -vt 0.136039 0.189949 -vt 0.134696 0.191325 -vt 0.885663 0.189949 -vt 0.554469 0.191325 -vt 0.887025 0.191325 -vt 0.923613 0.191325 -vt 0.049094 0.191325 -vt 0.049094 0.193313 -vt 0.923613 0.193313 -vt 0.087402 0.191325 -vt 0.486356 0.191325 -vt 0.486356 0.193313 -vt 0.087402 0.193313 -vt 0.126410 0.191325 -vt 0.126410 0.193313 -vt 0.923612 0.126410 -vt 0.058014 0.081446 -vt 0.001056 0.081566 -vt 0.001110 0.981267 -vt 0.057971 0.002739 -vt 0.940482 0.044170 -vt 0.940482 0.981267 -vt 0.000000 0.193105 -vt 1.000000 0.193313 -vt 0.081566 0.181953 -vt 0.462441 0.186751 -vt 0.112412 0.186751 -vt 0.083978 0.186751 -vt 0.495877 0.186751 -vt 0.887026 0.186751 -vt 0.554468 0.186751 -vt 0.151420 0.186751 -vt 0.133247 0.186751 -vt 0.134696 0.186751 -vt 0.554469 0.186751 -vt 0.887025 0.186751 -vt 0.049094 0.186751 -vt 0.923613 0.186751 -vt 0.049094 0.181981 -vt 0.923612 0.181981 -vt 0.486356 0.186751 -vt 0.087402 0.186751 -vt 0.486356 0.181981 -vt 0.087402 0.181981 -vt 0.126410 0.186751 -vt 0.126410 0.181981 -vt 0.923613 0.181981 -vt 0.735558 0.688993 -vt 0.203072 0.688993 -vt 0.203072 0.669213 -vt 0.735558 0.669213 -vt 0.940482 0.181981 -vt 0.001110 0.181981 -vt 0.000995 0.011336 -vt 0.940461 0.011333 -vn 0.999877 -0.014583 0.005693 -vn 0.999850 -0.017306 -0.000000 -vn 0.999879 -0.014583 -0.005359 -vn -0.999866 0.015576 0.005051 -vn -0.999839 0.016544 0.006981 -vn -0.999643 0.016549 0.020961 -vn -0.999852 0.016553 -0.004742 -vn -0.999857 0.015587 -0.006571 -vn 0.000000 -0.000009 -1.000000 -vn 0.000001 -0.000009 -1.000000 -vn -0.006366 -0.999962 0.006017 -vn 0.000000 -0.999906 0.013721 -vn 0.000000 -0.999984 -0.005695 -vn -0.006366 -0.999896 -0.012946 -vn -0.000015 -0.000009 1.000000 -vn -0.999792 0.016543 -0.011944 -vn -0.006365 -0.999448 -0.032598 -vn -0.999742 0.015574 -0.016561 -vn -0.999763 0.015590 0.015203 -vn -0.999994 0.003496 -0.000000 -vn -0.999994 0.003498 0.000000 -vn 0.999744 -0.022646 -0.000009 -vn 0.999658 -0.025605 -0.005422 -vn 0.999753 -0.021938 -0.003426 -vn 0.999757 -0.021939 0.002288 -vn 0.999743 -0.022641 0.001072 -vn -0.018148 -0.012031 -0.999763 -vn 0.002729 -0.999996 0.000002 -vn -0.019702 -0.999440 0.027030 -vn -0.020206 -0.999796 0.000000 -vn 0.002709 -0.999673 -0.025429 -vn 0.001706 -0.024163 0.999707 -vn -0.035734 0.000809 0.999361 -vn 0.999672 -0.025605 -0.000146 -vn 0.002723 -0.997949 -0.063963 -vn 0.999662 -0.022649 0.012738 -vn 0.999718 -0.022633 -0.007246 -vn -0.000001 0.000010 -1.000000 -vn -0.000024 -0.000002 1.000000 +f 153//50 154//50 156//50 +f 155//51 156//51 158//51 +f 157//52 158//52 160//52 +f 159//53 160//53 162//53 +f 161//54 162//54 164//54 +f 163//55 164//55 166//55 +f 165//56 166//56 168//56 +f 167//57 168//57 170//57 +f 169//58 170//58 172//58 +f 171//59 172//59 174//59 +f 173//60 174//60 176//60 +f 175//61 176//61 178//61 +f 177//62 178//62 180//62 +f 179//63 180//63 182//63 +f 181//64 182//64 184//64 +f 183//65 184//65 186//65 +f 185//66 186//66 187//66 +f 187//67 188//67 189//67 +f 189//68 190//68 191//68 +f 191//69 192//69 193//69 +f 193//70 194//70 195//70 +f 195//71 196//71 197//71 +f 197//72 198//72 199//72 +f 199//73 200//73 201//73 +f 201//74 202//74 203//74 +f 203//75 204//75 205//75 +f 205//76 206//76 207//76 +f 207//77 208//77 209//77 +f 209//78 210//78 211//78 +f 211//79 212//79 213//79 +f 204//80 202//80 242//80 +f 215//81 216//81 153//81 +f 213//82 214//82 215//82 +f 193//83 195//83 269//83 +f 246//47 248//47 247//47 +f 180//84 178//84 229//84 +f 154//85 216//85 217//85 +f 194//86 192//86 237//86 +f 170//87 168//87 224//87 +f 208//88 206//88 244//88 +f 184//89 182//89 231//89 +f 160//90 158//90 219//90 +f 198//91 196//91 239//91 +f 174//92 172//92 226//92 +f 212//93 210//93 246//93 +f 188//94 186//94 234//94 +f 164//95 162//95 221//95 +f 202//96 200//96 241//96 +f 178//97 176//97 228//97 +f 216//98 214//98 248//98 +f 192//99 190//99 236//99 +f 168//100 166//100 223//100 +f 206//101 204//101 243//101 +f 182//102 180//102 230//102 +f 158//103 156//103 218//103 +f 196//104 194//104 238//104 +f 172//105 170//105 225//105 +f 210//106 208//106 245//106 +f 186//107 184//107 232//107 +f 162//108 160//108 220//108 +f 200//109 198//109 240//109 +f 156//110 154//110 217//110 +f 176//111 174//111 227//111 +f 214//112 212//112 247//112 +f 190//113 188//113 235//113 +f 166//114 164//114 222//114 +f 249//49 250//49 280//49 +f 169//115 171//115 258//115 +f 207//116 209//116 276//116 +f 183//117 185//117 265//117 +f 159//118 161//118 253//118 +f 197//119 199//119 271//119 +f 153//120 155//120 250//120 +f 173//121 175//121 260//121 +f 211//122 213//122 278//122 +f 187//123 189//123 266//123 +f 163//124 165//124 255//124 +f 201//125 203//125 273//125 +f 177//126 179//126 262//126 +f 215//127 153//127 280//127 +f 191//128 193//128 268//128 +f 167//129 169//129 257//129 +f 205//130 207//130 275//130 +f 181//131 183//131 264//131 +f 157//132 159//132 252//132 +f 195//133 197//133 270//133 +f 171//134 173//134 259//134 +f 209//135 211//135 277//135 +f 185//136 187//136 265//136 +f 161//137 163//137 254//137 +f 199//138 201//138 272//138 +f 175//139 177//139 261//139 +f 213//140 215//140 279//140 +f 189//141 191//141 267//141 +f 165//142 167//142 256//142 +f 203//143 205//143 274//143 +f 179//144 181//144 263//144 +f 155//145 157//145 251//145 +f 281//146 282//146 284//146 +f 283//147 284//147 286//147 +f 285//148 286//148 288//148 +f 287//149 288//149 290//149 +f 289//150 290//150 292//150 +f 291//151 292//151 294//151 +f 293//152 294//152 296//152 +f 295//153 296//153 298//153 +f 297//154 298//154 300//154 +f 299//155 300//155 302//155 +f 301//156 302//156 304//156 +f 303//157 304//157 306//157 +f 305//158 306//158 308//158 +f 307//159 308//159 310//159 +f 309//160 310//160 312//160 +f 311//161 312//161 314//161 +f 313//162 314//162 315//162 +f 315//163 316//163 317//163 +f 317//164 318//164 319//164 +f 319//165 320//165 321//165 +f 321//166 322//166 323//166 +f 323//167 324//167 325//167 +f 325//168 326//168 327//168 +f 327//169 328//169 329//169 +f 329//170 330//170 331//170 +f 331//171 332//171 333//171 +f 333//172 334//172 335//172 +f 335//173 336//173 337//173 +f 337//174 338//174 339//174 +f 339//175 340//175 341//175 +f 284//39 282//39 286//39 +f 343//176 344//176 281//176 +f 341//177 342//177 344//177 +f 281//42 283//42 343//42 +f 155//178 153//178 156//178 +f 157//51 155//51 158//51 +f 159//52 157//52 160//52 +f 161//53 159//53 162//53 +f 163//54 161//54 164//54 +f 165//179 163//179 166//179 +f 167//56 165//56 168//56 +f 169//57 167//57 170//57 +f 171//58 169//58 172//58 +f 173//59 171//59 174//59 +f 175//180 173//180 176//180 +f 177//61 175//61 178//61 +f 179//181 177//181 180//181 +f 181//182 179//182 182//182 +f 183//183 181//183 184//183 +f 185//65 183//65 186//65 +f 186//184 188//184 187//184 +f 188//67 190//67 189//67 +f 190//68 192//68 191//68 +f 192//69 194//69 193//69 +f 194//70 196//70 195//70 +f 196//71 198//71 197//71 +f 198//72 200//72 199//72 +f 200//73 202//73 201//73 +f 202//74 204//74 203//74 +f 204//75 206//75 205//75 +f 206//185 208//185 207//185 +f 208//77 210//77 209//77 +f 210//78 212//78 211//78 +f 212//79 214//79 213//79 +f 202//186 241//186 242//186 +f 216//81 154//81 153//81 +f 214//82 216//82 215//82 +f 195//187 270//187 269//187 +f 245//47 248//47 246//47 +f 244//47 248//47 245//47 +f 234//47 236//47 235//47 +f 234//47 237//47 236//47 +f 234//47 238//47 237//47 +f 229//47 231//47 230//47 +f 228//47 231//47 229//47 +f 219//47 221//47 220//47 +f 219//47 222//47 221//47 +f 218//47 217//47 219//47 +f 217//47 248//47 219//47 +f 248//47 244//47 219//47 +f 219//47 244//47 222//47 +f 244//188 243//188 222//188 +f 222//188 243//188 223//188 +f 223//47 243//47 224//47 +f 243//47 242//47 224//47 +f 242//47 241//47 224//47 +f 241//47 240//47 224//47 +f 224//47 240//47 225//47 +f 225//47 240//47 226//47 +f 240//47 239//47 226//47 +f 226//47 239//47 227//47 +f 239//188 238//188 227//188 +f 227//188 238//188 228//188 +f 228//47 238//47 231//47 +f 238//47 234//47 231//47 +f 234//47 233//47 232//47 +f 231//47 234//47 232//47 +f 230//189 180//189 229//189 +f 216//85 248//85 217//85 +f 192//86 236//86 237//86 +f 225//190 170//190 224//190 +f 206//191 243//191 244//191 +f 232//192 184//192 231//192 +f 220//193 160//193 219//193 +f 196//194 238//194 239//194 +f 227//195 174//195 226//195 +f 210//93 245//93 246//93 +f 186//196 233//196 234//196 +f 222//197 164//197 221//197 +f 200//198 240//198 241//198 +f 229//199 178//199 228//199 +f 214//98 247//98 248//98 +f 190//99 235//99 236//99 +f 224//200 168//200 223//200 +f 204//201 242//201 243//201 +f 231//102 182//102 230//102 +f 219//103 158//103 218//103 +f 194//202 237//202 238//202 +f 226//203 172//203 225//203 +f 208//204 244//204 245//204 +f 233//107 186//107 232//107 +f 221//108 162//108 220//108 +f 198//109 239//109 240//109 +f 218//205 156//205 217//205 +f 228//206 176//206 227//206 +f 212//207 246//207 247//207 +f 188//208 234//208 235//208 +f 223//209 166//209 222//209 +f 250//49 251//49 280//49 +f 251//49 252//49 280//49 +f 252//49 253//49 280//49 +f 253//49 254//49 280//49 +f 254//49 255//49 280//49 +f 255//49 256//49 280//49 +f 256//49 257//49 280//49 +f 257//49 258//49 280//49 +f 258//49 259//49 280//49 +f 259//49 260//49 280//49 +f 260//49 261//49 280//49 +f 261//49 262//49 280//49 +f 262//49 263//49 280//49 +f 263//49 264//49 280//49 +f 264//49 265//49 280//49 +f 265//49 266//49 280//49 +f 266//49 267//49 280//49 +f 267//49 268//49 280//49 +f 268//49 269//49 280//49 +f 269//49 270//49 280//49 +f 270//49 271//49 280//49 +f 271//49 272//49 280//49 +f 272//49 273//49 280//49 +f 273//49 274//49 280//49 +f 274//49 275//49 280//49 +f 275//49 276//49 280//49 +f 276//49 277//49 280//49 +f 277//49 278//49 279//49 +f 280//49 277//49 279//49 +f 257//115 169//115 258//115 +f 209//210 277//210 276//210 +f 264//117 183//117 265//117 +f 252//118 159//118 253//118 +f 199//211 272//211 271//211 +f 249//212 153//212 250//212 +f 259//213 173//213 260//213 +f 213//122 279//122 278//122 +f 189//123 267//123 266//123 +f 254//214 163//214 255//214 +f 203//215 274//215 273//215 +f 261//126 177//126 262//126 +f 153//127 249//127 280//127 +f 193//128 269//128 268//128 +f 256//216 167//216 257//216 +f 207//130 276//130 275//130 +f 263//217 181//217 264//217 +f 251//218 157//218 252//218 +f 197//219 271//219 270//219 +f 258//220 171//220 259//220 +f 211//221 278//221 277//221 +f 187//136 266//136 265//136 +f 253//222 161//222 254//222 +f 201//223 273//223 272//223 +f 260//139 175//139 261//139 +f 215//224 280//224 279//224 +f 191//141 268//141 267//141 +f 255//142 165//142 256//142 +f 205//225 275//225 274//225 +f 262//144 179//144 263//144 +f 250//226 155//226 251//226 +f 283//227 281//227 284//227 +f 285//228 283//228 286//228 +f 287//148 285//148 288//148 +f 289//229 287//229 290//229 +f 291//150 289//150 292//150 +f 293//151 291//151 294//151 +f 295//152 293//152 296//152 +f 297//153 295//153 298//153 +f 299//230 297//230 300//230 +f 301//231 299//231 302//231 +f 303//156 301//156 304//156 +f 305//157 303//157 306//157 +f 307//232 305//232 308//232 +f 309//233 307//233 310//233 +f 311//234 309//234 312//234 +f 313//235 311//235 314//235 +f 314//236 316//236 315//236 +f 316//237 318//237 317//237 +f 318//238 320//238 319//238 +f 320//239 322//239 321//239 +f 322//166 324//166 323//166 +f 324//167 326//167 325//167 +f 326//168 328//168 327//168 +f 328//169 330//169 329//169 +f 330//240 332//240 331//240 +f 332//171 334//171 333//171 +f 334//172 336//172 335//172 +f 336//241 338//241 337//241 +f 338//242 340//242 339//242 +f 340//175 342//175 341//175 +f 282//39 344//39 286//39 +f 344//39 342//39 286//39 +f 342//39 340//39 286//39 +f 340//39 338//39 286//39 +f 338//39 336//39 286//39 +f 336//39 334//39 286//39 +f 334//39 332//39 286//39 +f 332//39 330//39 286//39 +f 330//39 328//39 286//39 +f 328//39 326//39 286//39 +f 326//39 324//39 286//39 +f 324//39 322//39 286//39 +f 322//39 320//39 286//39 +f 320//39 318//39 286//39 +f 318//39 316//39 286//39 +f 316//39 314//39 286//39 +f 314//39 312//39 286//39 +f 312//39 310//39 286//39 +f 310//39 308//39 286//39 +f 308//39 306//39 286//39 +f 306//39 304//39 286//39 +f 304//39 302//39 286//39 +f 302//39 300//39 286//39 +f 300//39 298//39 286//39 +f 298//39 296//39 286//39 +f 296//39 294//39 286//39 +f 294//39 292//39 286//39 +f 292//39 290//39 286//39 +f 290//39 288//39 286//39 +f 344//243 282//243 281//243 +f 343//244 341//244 344//244 +f 283//245 285//245 343//245 +f 343//245 285//245 341//245 +f 285//42 287//42 341//42 +f 287//42 289//42 341//42 +f 289//42 291//42 341//42 +f 291//246 293//246 341//246 +f 293//247 295//247 341//247 +f 335//248 331//248 333//248 +f 295//247 297//247 341//247 +f 297//247 299//247 341//247 +f 335//249 329//249 331//249 +f 299//247 301//247 341//247 +f 335//250 327//250 329//250 +f 301//247 303//247 341//247 +f 335//251 325//251 327//251 +f 303//42 305//42 341//42 +f 335//252 323//252 325//252 +f 305//42 307//42 341//42 +f 335//253 321//253 323//253 +f 307//42 309//42 341//42 +f 335//253 319//253 321//253 +f 309//254 311//254 341//254 +f 335//254 317//254 319//254 +f 311//254 313//254 341//254 +f 315//254 317//254 335//254 +f 313//254 315//254 341//254 +f 315//254 335//254 341//254 +f 335//42 337//42 339//42 +f 341//42 335//42 339//42 +v 1.365790 0.015116 4.001092 +v 1.365790 0.015113 0.001092 +v 1.560881 0.034331 4.001092 +v 1.560881 0.034328 0.001092 +v 1.748474 0.091236 4.001092 +v 1.748474 0.091234 0.001092 +v 1.921361 0.183646 4.001092 +v 1.921361 0.183644 0.001092 +v 2.072897 0.308009 4.001092 +v 2.072897 0.308007 0.001092 +v 2.197260 0.459546 4.001092 +v 2.197260 0.459543 0.001092 +v 2.289670 0.632432 4.001092 +v 2.289670 0.632430 0.001092 +v 2.346576 0.820025 4.001092 +v 2.346576 0.820023 0.001092 +v 2.365790 1.015116 4.001092 +v 2.365790 1.015113 0.001092 +v 2.346576 1.210206 4.001091 +v 2.346576 1.210203 0.001091 +v 2.289670 1.397799 4.001091 +v 2.289670 1.397797 0.001091 +v 2.197260 1.570686 4.001091 +v 2.197260 1.570683 0.001091 +v 2.072897 1.722223 4.001091 +v 2.072897 1.722220 0.001091 +v 1.921361 1.846586 4.001091 +v 1.921361 1.846583 0.001091 +v 1.748474 1.938995 4.001091 +v 1.748474 1.938993 0.001091 +v 1.560881 1.995901 4.001091 +v 1.560881 1.995899 0.001091 +v 1.365790 2.015116 4.001091 +v 1.365790 2.015113 0.001091 +v 1.170700 1.995901 4.001091 +v 1.170700 1.995898 0.001091 +v 0.983107 1.938995 4.001091 +v 0.983107 1.938993 0.001091 +v 0.810220 1.846585 4.001091 +v 0.810220 1.846583 0.001091 +v 0.658683 1.722222 4.001091 +v 0.658683 1.722220 0.001091 +v 0.534320 1.570685 4.001091 +v 0.534320 1.570683 0.001091 +v 0.441911 1.397799 4.001091 +v 0.441911 1.397796 0.001091 +v 0.385005 1.210205 4.001091 +v 0.385005 1.210203 0.001091 +v 0.365790 1.015115 4.001092 +v 0.365790 1.015112 0.001092 +v 0.385005 0.820024 4.001092 +v 0.385005 0.820022 0.001092 +v 0.441911 0.632431 4.001092 +v 0.441911 0.632429 0.001092 +v 0.534322 0.459545 4.001092 +v 0.534322 0.459542 0.001092 +v 0.658685 0.308008 4.001092 +v 0.658685 0.308006 0.001092 +v 0.810221 0.183645 4.001092 +v 0.810221 0.183643 0.001092 +v 0.983108 0.091236 4.001092 +v 0.983108 0.091233 0.001092 +v 1.170702 0.034330 4.001092 +v 1.170702 0.034328 0.001092 +v 1.365791 0.649119 -0.167860 +v 1.437192 0.656151 -0.167860 +v 1.505850 0.676978 -0.167860 +v 1.569126 0.710800 -0.167860 +v 1.624587 0.756316 -0.167860 +v 1.670104 0.811778 -0.167860 +v 1.703925 0.875053 -0.167860 +v 1.724752 0.943711 -0.167860 +v 1.731785 1.015113 -0.167860 +v 1.724752 1.086515 -0.167860 +v 1.703925 1.155173 -0.167860 +v 1.670104 1.218448 -0.167861 +v 1.624587 1.273910 -0.167861 +v 1.569126 1.319426 -0.167861 +v 1.505850 1.353247 -0.167861 +v 1.437192 1.374075 -0.167861 +v 1.365790 1.381107 -0.167861 +v 1.294389 1.374075 -0.167861 +v 1.225731 1.353247 -0.167861 +v 1.162455 1.319426 -0.167861 +v 1.106993 1.273910 -0.167861 +v 1.061477 1.218448 -0.167861 +v 1.027656 1.155173 -0.167860 +v 1.006829 1.086515 -0.167860 +v 0.999797 1.015113 -0.167860 +v 1.006829 0.943711 -0.167860 +v 1.027656 0.875053 -0.167860 +v 1.061478 0.811777 -0.167860 +v 1.106994 0.756316 -0.167860 +v 1.162456 0.710800 -0.167860 +v 1.225731 0.676978 -0.167860 +v 1.294389 0.656151 -0.167860 +v 1.365791 0.605024 4.157856 +v 1.445795 0.612904 4.157856 +v 1.522726 0.636241 4.157856 +v 1.593625 0.674137 4.157856 +v 1.655769 0.725137 4.157856 +v 1.706769 0.787281 4.157856 +v 1.744666 0.858181 4.157855 +v 1.768002 0.935111 4.157855 +v 1.775882 1.015116 4.157855 +v 1.768002 1.095121 4.157855 +v 1.744666 1.172051 4.157855 +v 1.706769 1.242950 4.157855 +v 1.655769 1.305094 4.157855 +v 1.593625 1.356094 4.157855 +v 1.522726 1.393991 4.157855 +v 1.445795 1.417328 4.157855 +v 1.365790 1.425207 4.157855 +v 1.285786 1.417327 4.157855 +v 1.208855 1.393991 4.157855 +v 1.137956 1.356094 4.157855 +v 1.075812 1.305094 4.157855 +v 1.024812 1.242950 4.157855 +v 0.986915 1.172051 4.157855 +v 0.963579 1.095120 4.157855 +v 0.955699 1.015115 4.157855 +v 0.963579 0.935110 4.157855 +v 0.986916 0.858180 4.157855 +v 1.024812 0.787281 4.157856 +v 1.075812 0.725137 4.157856 +v 1.137956 0.674137 4.157856 +v 1.208856 0.636240 4.157856 +v 1.285786 0.612904 4.157856 +vn 0.634394 -0.773010 0.000000 +vn 0.773010 -0.634394 0.000000 +vn 0.773010 0.634394 -0.000000 +vn 0.634394 0.773010 -0.000000 +vn -0.956941 0.290284 -0.000000 +vn -0.995185 0.098016 -0.000000 +vn -0.881921 -0.471398 0.000000 +vn -0.634392 -0.773011 0.000000 +vn -0.075085 -0.247523 -0.965968 +vn -0.199427 0.163668 0.966148 +vn -0.121931 0.228117 -0.965969 +vn 0.247522 -0.075086 -0.965968 +vn -0.247522 -0.075086 -0.965968 +vn 0.121931 0.228117 -0.965969 +vn 0.075085 -0.247523 -0.965968 +vn -0.199948 0.164091 -0.965968 +vn 0.257414 0.025352 -0.965968 +vn -0.199947 -0.164093 -0.965968 +vn 0.025353 0.257414 -0.965969 +vn 0.164092 -0.199947 -0.965968 +vn -0.247522 0.075085 -0.965969 +vn 0.025353 -0.257415 -0.965968 +vn 0.228118 0.121931 -0.965969 +vn -0.121931 -0.228119 -0.965968 +vn -0.075086 0.247521 -0.965969 +vn 0.228118 -0.121932 -0.965968 +vn -0.257414 -0.025354 -0.965968 +vn 0.164092 0.199946 -0.965969 +vn -0.025353 -0.257415 -0.965968 +vn -0.164092 0.199946 -0.965969 +vn 0.257415 -0.025354 -0.965968 +vn -0.228117 -0.121932 -0.965968 +vn 0.075086 0.247521 -0.965969 +vn 0.121931 -0.228119 -0.965968 +vn -0.228117 0.121931 -0.965968 +vn 0.247522 0.075085 -0.965969 +vn -0.164092 -0.199947 -0.965968 +vn -0.025353 0.257414 -0.965969 +vn 0.199947 -0.164093 -0.965968 +vn -0.257414 0.025352 -0.965968 +vn 0.199947 0.164091 -0.965968 +vn 0.256746 0.025290 0.966148 +vn -0.199428 -0.163666 0.966148 +vn 0.025287 0.256747 0.966148 +vn 0.163666 -0.199428 0.966148 +vn -0.246880 0.074890 0.966148 +vn 0.025287 -0.256746 0.966148 +vn 0.227526 0.121615 0.966148 +vn -0.121615 -0.227526 0.966148 +vn -0.074890 0.246880 0.966148 +vn 0.227525 -0.121615 0.966148 +vn -0.256745 -0.025287 0.966148 +vn 0.163667 0.199428 0.966148 +vn -0.025287 -0.256746 0.966148 +vn -0.163667 0.199428 0.966148 +vn 0.256746 -0.025287 0.966148 +vn -0.227525 -0.121615 0.966148 +vn 0.074890 0.246880 0.966148 +vn 0.121615 -0.227526 0.966148 +vn -0.227526 0.121615 0.966148 +vn 0.246880 0.074890 0.966148 +vn -0.163666 -0.199428 0.966148 +vn -0.025287 0.256747 0.966148 +vn 0.199428 -0.163666 0.966148 +vn -0.256746 0.025289 0.966148 +vn 0.199427 0.163668 0.966148 +vn -0.074892 -0.246879 0.966148 +vn -0.121615 0.227526 0.966148 +vn 0.246879 -0.074890 0.966148 +vn -0.246879 -0.074890 0.966148 +vn 0.121615 0.227526 0.966148 +vn 0.074892 -0.246879 0.966148 +vn -0.199428 0.163666 0.966148 +vn 0.000000 -0.000004 -1.000000 +vn 0.247522 -0.075085 -0.965968 +vn -0.199947 0.164092 -0.965969 +vn 0.257414 0.025353 -0.965969 +vn -0.199947 -0.164092 -0.965968 +vn 0.228120 0.121929 -0.965968 +vn -0.121931 -0.228118 -0.965968 +vn -0.075085 0.247521 -0.965969 +vn 0.228117 -0.121935 -0.965968 +vn -0.257414 -0.025353 -0.965968 +vn 0.164092 0.199947 -0.965969 +vn 0.257415 -0.025353 -0.965968 +vn -0.228117 -0.121935 -0.965968 +vn 0.075085 0.247521 -0.965969 +vn 0.121932 -0.228118 -0.965968 +vn -0.228120 0.121928 -0.965968 +vn 0.199947 -0.164092 -0.965968 +vn -0.257414 0.025353 -0.965969 +vn 0.199946 0.164092 -0.965969 +vn -0.000004 0.000009 1.000000 +vn 0.000001 -0.000000 1.000000 +vn -0.000029 -0.000009 1.000000 +vn -0.000010 -0.000001 1.000000 +vn -0.000005 0.000001 1.000000 +vn -0.000003 0.000001 1.000000 +vn -0.000002 0.000001 1.000000 vn -0.000001 0.000001 1.000000 -vn 0.000015 -0.000001 1.000000 -vn -0.000001 -0.000003 1.000000 -vn -0.000000 -0.000020 1.000000 -vn 0.000000 -0.000023 1.000000 -vn -0.000003 0.000003 1.000000 -vn 0.000002 -0.000002 1.000000 -vn 0.000010 -0.000002 1.000000 -vn -0.000000 -0.000012 1.000000 -vn -0.996774 -0.000001 0.080257 -vn -0.996773 -0.000001 0.080267 -vn 0.075845 -0.992439 0.096500 -vn 0.000000 0.994697 0.102850 -vn 0.000000 0.994698 0.102844 -vn 0.000000 0.980725 0.195396 -vn -0.000000 0.980727 0.195386 -vn 0.991166 0.000003 0.132623 -vn 0.991156 -0.000000 0.132704 -vn 0.996774 -0.000001 0.080259 -vn 0.996771 -0.000002 0.080291 -vn -0.991168 -0.000000 0.132609 -vn -0.991168 0.000000 0.132616 -vn 0.074451 -0.979865 0.185262 -vn 0.074451 -0.979865 0.185261 -vn 0.067239 -0.997737 0.000000 -vn 0.000008 0.000002 -1.000000 -vn 0.000001 0.000000 -1.000000 -vn 0.000000 0.000003 -1.000000 -vn 0.000005 0.000002 -1.000000 -vn 0.000001 -0.000010 -1.000000 -vn -0.000012 0.000000 -1.000000 -vn 0.000001 -0.000016 -1.000000 -vn 0.000002 0.000013 -1.000000 -vn 0.000010 0.000002 -1.000000 -vn -0.000021 0.000004 -1.000000 -vn 0.000000 0.000011 -1.000000 -vn -0.000001 0.000022 -1.000000 -vn 1.000000 -0.000002 -0.000042 -vn -1.000000 0.000004 -0.000022 -vn -0.996774 -0.000001 -0.080260 -vn -0.996773 -0.000001 -0.080274 -vn 0.075845 -0.992438 -0.096509 -vn 0.075845 -0.992439 -0.096505 -vn 0.000000 0.994697 -0.102849 -vn 0.000001 0.980723 -0.195404 -vn 0.000000 0.980725 -0.195394 -vn 0.991166 0.000003 -0.132623 -vn 0.991155 0.000000 -0.132710 -vn 0.996774 -0.000001 -0.080262 -vn 0.996771 -0.000002 -0.080295 -vn -0.991167 0.000000 -0.132616 -vn -0.991168 0.000000 -0.132616 -vn 0.074451 -0.979865 -0.185262 -vn 0.074451 -0.979863 -0.185272 -vn 0.000000 1.000000 -0.000018 -vn 0.000004 0.000001 -1.000000 -vn -0.000006 0.000001 -1.000000 -vn -0.000002 0.000002 -1.000000 -vn -0.000018 -0.000000 -1.000000 -vn 0.000001 0.000023 -1.000000 -vn -0.996771 0.000001 -0.080292 -vn -0.996777 -0.000001 -0.080222 -vn 0.075844 -0.992439 -0.096506 -vn 0.075845 -0.992439 -0.096499 -vn 0.000000 0.994697 -0.102850 -vn 0.000001 0.980726 -0.195389 -vn 0.000000 0.980727 -0.195386 -vn 0.991160 -0.000000 -0.132672 -vn 0.991172 0.000003 -0.132582 -vn 0.996773 -0.000001 -0.080268 -vn 0.996774 -0.000001 -0.080257 -vn -0.991161 0.000000 -0.132667 -vn -0.991170 -0.000002 -0.132599 -vn 0.074451 -0.979866 -0.185254 -vn 0.074451 -0.979867 -0.185252 -vn 0.066485 -0.997787 0.000000 -vn 0.066485 -0.997787 -0.000009 -vn 0.000000 1.000000 -0.000009 -vn 0.999832 0.018329 0.000000 -vn 0.000035 -0.000000 1.000000 -vn -0.000001 -0.000002 1.000000 -vn -0.000009 -0.000001 1.000000 -vn -0.000000 -0.000021 1.000000 -vn -0.000020 -0.000002 1.000000 -vn 0.000000 0.000002 1.000000 -vn 0.000001 0.000023 1.000000 -vn 1.000000 0.000001 0.000000 -vn 1.000000 0.000001 0.000008 -vn -1.000000 0.000003 0.000034 -vn -0.996771 0.000001 0.080292 -vn -0.996777 -0.000002 0.080226 -vn 0.075844 -0.992438 0.096511 -vn 0.075844 -0.992438 0.096514 -vn 0.000001 0.994696 0.102855 -vn -0.000001 0.980727 0.195386 -vn 0.991158 -0.000001 0.132684 -vn 0.991173 0.000003 0.132576 -vn 0.996773 -0.000001 0.080276 -vn 0.996774 -0.000001 0.080257 -vn -0.991161 -0.000000 0.132667 -vn -0.991168 -0.000002 0.132611 -vn 0.074451 -0.979863 0.185271 -vn 0.074451 -0.979863 0.185269 -vn 0.066485 -0.997787 -0.000018 -vn -0.000000 0.000026 -1.000000 -vn -0.000000 1.000000 -0.000016 -vn -0.000001 1.000000 -0.000018 -vn -0.000012 1.000000 0.000001 -vn -0.000013 1.000000 0.000001 -vn 0.000014 1.000000 0.000001 -vn 0.000012 1.000000 0.000001 -vn -0.000000 1.000000 0.000018 -vn -0.000000 1.000000 0.000016 -vn 0.000013 1.000000 0.000001 -vn -0.000004 1.000000 0.000001 -vn 0.000006 1.000000 0.000001 -vn -0.000005 1.000000 0.000001 -vn 1.000000 -0.000012 -0.000001 -vn 1.000000 -0.000059 -0.000001 -vn -1.000000 -0.000046 0.000000 -vn -1.000000 -0.000030 0.000001 -vn -0.000362 0.005434 -0.999985 -vn 0.013156 0.000472 -0.999913 -vn 0.000059 0.000002 -1.000000 -vn 0.000666 0.000419 -1.000000 -vn 0.000026 0.000013 -1.000000 -vn 0.000223 0.000002 -1.000000 -vn 0.000019 -0.000000 -1.000000 -vn -0.000000 0.000024 -1.000000 -vn -0.000000 -0.000021 -1.000000 -vn 0.000007 0.000000 -1.000000 -vn 0.000003 0.000119 -1.000000 -vn -0.000001 0.000011 -1.000000 -vn -0.000001 0.000013 -1.000000 -vn 0.000013 -0.000001 -1.000000 -vn -0.987686 0.000000 -0.156450 -vn -0.987716 -0.000003 -0.156260 -vn 0.074129 -0.979868 -0.185374 -vn 0.074128 -0.979863 -0.185401 -vn -0.000000 0.980353 -0.197251 -vn -0.000000 0.962318 -0.271927 -vn 0.000000 0.962314 -0.271940 -vn 0.982112 0.000001 -0.188299 -vn 0.982127 0.000003 -0.188220 -vn 0.987693 -0.000000 -0.156403 -vn 0.987691 -0.000001 -0.156421 -vn -0.982084 0.000001 -0.188445 -vn -0.982112 -0.000001 -0.188300 -vn 0.072457 -0.963346 -0.258291 -vn 0.072458 -0.963352 -0.258267 -vn 0.066564 -0.997782 0.000000 -vn 0.066564 -0.997782 0.000010 -vn 0.000000 1.000000 -0.000010 -vn -0.001788 0.026807 0.999639 -vn 0.000090 0.028698 0.999588 -vn 0.005279 0.000189 0.999986 -vn 0.000029 0.000001 1.000000 -vn 0.000276 -0.000000 1.000000 -vn 0.000285 0.000132 1.000000 -vn -0.000675 -0.000000 1.000000 -vn -0.000698 0.000000 1.000000 -vn -0.000012 -0.000002 1.000000 -vn 0.000000 -0.000016 1.000000 -vn 0.000037 0.000002 1.000000 -vn -0.000001 -0.000035 1.000000 -vn 1.000000 0.000004 -0.000029 -vn 1.000000 0.000003 -0.000014 -vn -0.997686 -0.000000 0.067992 -vn -0.997691 -0.000002 0.067916 -vn 0.075190 -0.993882 0.080905 -vn 0.075189 -0.993880 0.080921 -vn -0.000000 0.996274 0.086243 -vn -0.000000 0.992690 0.120692 -vn 0.996613 0.000001 0.082235 -vn 0.996616 0.000002 0.082199 -vn 0.997687 -0.000001 0.067983 -vn 0.997687 -0.000001 0.067979 -vn -0.996610 0.000001 0.082275 -vn -0.996614 -0.000001 0.082229 -vn 0.074511 -0.990649 0.114296 -vn 0.074510 -0.990647 0.114306 -vn 0.066564 -0.997782 -0.000003 -vn 0.066564 -0.997782 -0.000001 -vn -1.000000 0.000001 -0.000017 -vn 1.000000 -0.000001 -0.000017 -vn -0.000000 1.000000 0.000004 -vn 0.999990 -0.000001 -0.004388 -vn 0.999991 0.000000 -0.004262 -vn 1.000000 0.000146 0.000023 -vn 1.000000 0.000308 0.000000 -vn 0.999920 -0.000000 0.012660 -vn 0.999918 -0.000000 0.012789 -vn 1.000000 -0.000024 0.000023 -vn 1.000000 -0.000052 -0.000000 -vn 1.000000 -0.000044 -0.000002 -vn 1.000000 0.000097 0.000006 -vn 1.000000 0.000002 0.000002 -vn 1.000000 -0.000000 0.000023 -vn 1.000000 0.000003 0.000006 -vn 1.000000 0.000026 -0.000004 -vn 1.000000 0.000002 -0.000002 -vn 0.058202 -0.000001 0.998305 -vn 0.058205 -0.000001 0.998305 -vn 0.119784 0.992800 0.000001 -vn 0.119787 0.992800 0.000001 -vn 0.123964 0.992287 0.000001 -vn 0.051105 0.998693 0.000000 -vn 0.051099 0.998694 0.000001 -vn 0.119793 -0.992799 -0.000001 -vn 0.059746 0.000001 -0.998214 -vn 0.059745 0.000001 -0.998214 -vn 0.058192 0.000001 -0.998305 -vn 0.058213 0.000001 -0.998304 -vn 0.060244 -0.000001 0.998184 -vn 0.060247 -0.000001 0.998183 -vn 0.123958 -0.992288 -0.000000 -vn 0.123964 -0.992287 0.000000 -vn 0.060234 0.000001 -0.998184 -vn 0.060231 0.000001 -0.998185 -vn 0.059693 -0.000001 0.998217 -vn 0.059711 -0.000000 0.998216 -vn 0.048277 -0.998834 -0.000001 -vn 0.048275 -0.998834 -0.000001 -vn -0.000009 0.000001 -1.000000 -vn -1.000000 0.000000 -0.000013 -vn -0.999997 0.000219 0.002288 -vn -1.000000 -0.000023 -0.000058 -vn -1.000000 -0.000469 -0.000001 -vn -1.000000 -0.000001 -0.000911 -vn -1.000000 0.000000 -0.000889 -vn -1.000000 0.000385 0.000256 -vn -1.000000 0.000071 -0.000001 -vn -1.000000 -0.000002 -0.000002 -vn -1.000000 -0.000003 0.000003 -vn -1.000000 -0.000003 -0.000000 -vn -1.000000 -0.000003 -0.000003 -vn -1.000000 -0.000002 0.000002 -vn -0.134822 -0.000001 0.990870 -vn -0.134798 -0.000001 0.990873 -vn -0.271049 0.962566 0.000001 -vn -0.271049 0.962565 0.000001 -vn -0.279907 0.960027 0.000001 -vn -0.118595 0.992943 0.000000 -vn -0.118580 0.992944 0.000001 -vn -0.271004 -0.962578 -0.000001 -vn -0.138320 0.000001 -0.990388 -vn -0.138352 0.000001 -0.990383 -vn -0.134769 0.000001 -0.990877 -vn -0.134822 0.000001 -0.990870 -vn -0.139478 -0.000001 0.990225 -vn -0.139483 -0.000001 0.990224 -vn -0.279848 -0.960044 -0.000000 -vn -0.139424 0.000001 -0.990233 -vn -0.139449 0.000001 -0.990229 -vn -0.138323 -0.000001 0.990387 -vn -0.138233 -0.000002 0.990400 -vn -0.112067 -0.993701 -0.000001 -vn -0.000020 0.000001 -1.000000 -vn -0.000563 0.008441 0.999964 -vn 0.020430 0.000716 0.999791 -vn 0.000053 -0.000000 1.000000 -vn 0.000716 0.002201 0.999997 -vn -0.002760 -0.000003 0.999996 -vn -0.002800 -0.000001 0.999996 -vn -0.000211 -0.000016 1.000000 -vn 0.000000 -0.000277 1.000000 -vn 0.000000 -0.000006 1.000000 -vn -0.000005 -0.000001 1.000000 -vn 0.000005 -0.000001 1.000000 -vn -0.987697 0.000000 0.156379 -vn -0.987684 0.000001 0.156460 -vn 0.074130 -0.979874 0.185345 -vn 0.074129 -0.979869 0.185371 -vn -0.000000 0.980356 0.197234 -vn -0.000000 0.980359 0.197220 -vn -0.000000 0.962328 0.271891 -vn 0.000000 0.962321 0.271918 -vn 0.982135 -0.000001 0.188175 -vn 0.982120 -0.000002 0.188259 -vn 0.987698 -0.000002 0.156375 -vn 0.987715 -0.000000 0.156264 -vn -0.982098 -0.000000 0.188372 -vn -0.982120 -0.000002 0.188254 -vn 0.072458 -0.963348 0.258283 -vn 0.072458 -0.963346 0.258292 -vn 0.001017 -0.015259 -0.999883 -vn -0.000051 -0.016329 -0.999867 -vn -0.002999 -0.000107 -0.999995 -vn -0.000011 0.000001 -1.000000 -vn -0.000166 0.000002 -1.000000 -vn -0.000167 -0.000018 -1.000000 -vn -0.000029 0.000001 -1.000000 -vn -0.000086 0.000002 -1.000000 -vn 0.000000 -0.000015 -1.000000 -vn 0.000001 -0.000006 -1.000000 -vn -0.000004 0.000043 -1.000000 -vn -0.000000 0.000006 -1.000000 -vn 0.000005 0.000001 -1.000000 -vn -0.000005 0.000000 -1.000000 -vn -0.000004 0.000002 -1.000000 -vn 0.000002 0.000051 -1.000000 -vn -0.000005 0.000001 -1.000000 -vn 1.000000 -0.000076 -0.000811 -vn 1.000000 -0.000040 0.000042 -vn -0.997687 -0.000000 -0.067970 -vn -0.997685 0.000001 -0.068009 -vn 0.075189 -0.993882 -0.080897 -vn 0.075189 -0.993881 -0.080910 -vn 0.000000 0.996274 -0.086240 -vn 0.000000 0.996274 -0.086241 -vn -0.000000 0.992689 -0.120698 -vn 0.996619 -0.000001 -0.082164 -vn 0.996616 -0.000002 -0.082203 -vn 0.997687 -0.000002 -0.067972 -vn 0.997691 0.000000 -0.067919 -vn -0.996611 0.000000 -0.082254 -vn -0.996615 -0.000002 -0.082205 -vn 0.074511 -0.990648 -0.114299 -vn 0.074512 -0.990649 -0.114291 -vn 0.066564 -0.997782 0.000001 -vn 1.000000 -0.000001 0.000017 -vn 1.000000 0.000145 0.000131 -vn 0.999989 -0.004732 -0.000014 +vn 0.000000 0.000001 1.000000 +vn 0.256746 0.025287 0.966148 +vn -0.074891 0.246880 0.966148 +vn 0.227529 -0.121610 0.966148 +vn -0.256746 -0.025287 0.966148 +vn -0.227529 -0.121610 0.966148 +vn -0.256746 0.025287 0.966148 +vn 0.199428 0.163666 0.966148 +vn -0.074889 -0.246879 0.966148 +vn 0.074890 -0.246879 0.966148 s off -f 9196/3242/3946 9195/3243/3946 9194/3244/3946 -f 9197/3245/3947 9196/3242/3947 9194/3244/3947 -f 9199/3246/3947 9198/3247/3947 9200/3248/3947 -f 9201/3249/3948 9199/3246/3948 9200/3248/3948 -f 9202/3250/3949 9203/3243/3949 9205/3251/3949 -f 9205/3251/3950 9204/3252/3950 9202/3250/3950 -f 9209/3253/3951 9208/3254/3951 9214/3255/3951 -f 9210/3256/3952 9211/3257/3952 9213/3249/3952 -f 9213/3249/3953 9212/3258/3953 9210/3256/3953 -f 9511/3259/3954 9512/3260/3954 9513/3261/3954 -f 9514/3261/3955 9515/3262/3955 9516/3259/3955 -f 9517/3263/3956 9518/3264/3956 9519/3265/3956 -f 9520/3265/3957 9521/3266/3957 9522/3263/3957 -f 9523/3267/3958 9524/3268/3958 9525/3269/3958 -f 9526/3269/3959 9527/3270/3959 9528/3267/3959 -f 9529/3271/21 9530/3272/21 9531/3273/21 -f 9532/3273/3960 9533/3274/3960 9534/3271/3960 -f 9217/3275/3961 9206/3276/3961 9207/3277/3961 -f 9535/3278/3962 9536/3279/3962 9537/3280/3962 -f 9216/3281/3963 9206/3276/3963 9217/3275/3963 -f 9215/3282/3964 9209/3253/3964 9214/3255/3964 -f 9538/3262/3954 9539/3261/3954 9218/3283/3954 -f 9218/3283/3955 9219/3284/3955 9540/3262/3955 -f 9541/3261/21 9542/3273/21 9220/3285/21 -f 9220/3285/21 9221/3286/21 9543/3261/21 -f 9223/3287/3965 9224/3288/3965 9222/3289/3965 -f 9224/3288/3965 9225/3290/3965 9222/3289/3965 -f 9226/3291/3966 9228/3292/3966 9227/3293/3966 -f 9228/3292/3966 9229/3294/3966 9227/3293/3966 -f 9231/3295/3967 9230/3296/3967 9233/3297/3967 -f 9232/3298/3968 9233/3297/3968 9230/3296/3968 -f 9236/3299/3969 9237/3300/3969 9242/3301/3969 -f 9239/3302/3970 9238/3303/3970 9241/3304/3970 -f 9240/3305/3971 9241/3304/3971 9238/3303/3971 -f 9544/3306/3972 9545/3307/3972 9546/3308/3972 -f 9547/3309/105 9548/3308/105 9549/3307/105 -f 9550/3310/3973 9551/3311/3973 9552/3312/3973 -f 9553/3313/3974 9554/3312/3974 9555/3311/3974 -f 9556/3314/3975 9557/3315/3975 9558/3316/3975 -f 9559/3317/3976 9560/3316/3976 9561/3315/3976 -f 9562/3318/3977 9563/3319/3977 9564/3320/3977 -f 9565/3321/3978 9566/3320/3978 9567/3319/3978 -f 9234/3322/3979 9245/3323/3979 9235/3324/3979 -f 9568/3325/3980 9569/3326/3980 9570/3327/3980 -f 9234/3322/3981 9244/3328/3981 9245/3323/3981 -f 9237/3300/3982 9243/3329/3982 9242/3301/3982 -f 9571/3330/3983 9572/3309/3983 9246/3331/3983 -f 9247/3332/3983 9246/3331/3983 9573/3309/3983 -f 9574/3333/21 9575/3321/21 9248/3334/21 -f 9249/3335/21 9248/3334/21 9576/3321/21 -f 9577/3336/21 9272/3337/21 9273/3338/21 -f 9578/3339/21 9579/3336/21 9273/3338/21 -f 9251/3340/2228 9580/3339/2228 9273/3338/2228 -f 9251/3340/3984 9273/3338/3984 9274/3341/3984 -f 9581/3336/3818 9582/3342/3818 9583/3343/3818 -f 9272/3337/21 9584/3336/21 9585/3343/21 -f 9272/3337/21 9586/3343/21 9587/3344/21 -f 9250/3345/2228 9251/3340/2228 9274/3341/2228 -f 9250/3345/3985 9274/3341/3985 9275/3346/3985 -f 9588/3306/3986 9250/3345/3986 9275/3346/3986 -f 9589/3306/3987 9275/3346/3987 9272/3337/3987 -f 9590/3344/21 9591/3306/21 9272/3337/21 -f 9266/3347/3988 9264/3348/3988 9260/3337/3988 -f 9263/3346/3989 9265/3349/3989 9267/3350/3989 -f 9263/3346/3989 9267/3350/3989 9268/3351/3989 -f 9263/3346/3990 9268/3351/3990 9269/3352/3990 -f 9260/3337/3991 9263/3346/3991 9269/3352/3991 -f 9260/3337/359 9269/3352/359 9270/3353/359 -f 9268/3351/21 9267/3350/21 9266/3347/21 -f 9271/3354/21 9268/3351/21 9266/3347/21 -f 9271/3354/21 9266/3347/21 9260/3337/21 -f 9270/3353/21 9271/3354/21 9260/3337/21 -f 9261/3338/3991 9264/3348/3991 9265/3349/3991 -f 9265/3349/3992 9262/3341/3992 9261/3338/3992 -f 9260/3337/3985 9264/3348/3985 9261/3338/3985 -f 9263/3346/3993 9262/3341/3993 9265/3349/3993 -f 9255/3355/3994 9252/3356/3994 9592/3357/3994 -f 9593/3357/3995 9594/3358/3995 9255/3355/3995 -f 9254/3359/3996 9595/3360/3996 9596/3361/3996 -f 9597/3361/3996 9598/3362/3996 9254/3359/3996 -f 9599/3360/3997 9253/3363/3997 9600/3364/3997 -f 9601/3364/3998 9602/3361/3998 9603/3360/3998 -f 9256/3365/3999 9257/3366/3999 9604/3367/3999 -f 9605/3367/4000 9606/3368/4000 9256/3365/4000 -f 9607/3369/4001 9258/3370/4001 9608/3371/4001 -f 9609/3371/4002 9610/3357/4002 9611/3369/4002 -f 9612/3356/4003 9613/3372/4003 9614/3373/4003 -f 9615/3373/4004 9616/3357/4004 9617/3356/4004 -f 9259/3374/4005 9618/3375/4005 9619/3357/4005 -f 9620/3357/4006 9621/3376/4006 9259/3374/4006 -f 9622/3377/4007 9623/3365/4007 9624/3378/4007 -f 9625/3378/4008 9626/3367/4008 9627/3377/4008 -f 9628/3379/4009 9629/3380/4009 9630/3381/4009 -f 9631/3381/4009 9632/3382/4009 9633/3379/4009 -f 9634/3383/2231 9635/3384/2231 9636/3385/2231 -f 9637/3385/2231 9638/3386/2231 9639/3383/2231 -f 9640/3380/331 9641/3387/331 9642/3388/331 -f 9643/3388/331 9644/3381/331 9645/3380/331 -f 9646/3389/123 9647/3390/123 9648/3391/123 -f 9649/3391/123 9650/3392/123 9651/3389/123 -f 9288/3337/354 9652/3336/354 9289/3338/354 -f 9653/3336/105 9654/3339/105 9289/3338/105 -f 9655/3339/353 9187/3393/353 9289/3338/353 -f 9289/3338/4010 9187/3393/4010 9290/3341/4010 -f 9656/3342/3955 9657/3336/3955 9658/3343/3955 -f 9659/3336/4011 9288/3337/4011 9660/3343/4011 -f 9661/3343/105 9288/3337/105 9662/3344/105 -f 9187/3393/355 9190/3394/355 9290/3341/355 -f 9290/3341/4012 9190/3394/4012 9291/3346/4012 -f 9190/3394/4013 9663/3306/4013 9291/3346/4013 -f 9291/3346/353 9664/3306/353 9288/3337/353 -f 9665/3306/105 9666/3344/105 9288/3337/105 -f 9280/3348/4014 9282/3347/4014 9276/3337/4014 -f 9281/3349/105 9279/3346/105 9283/3350/105 -f 9283/3350/105 9279/3346/105 9284/3351/105 -f 9284/3351/105 9279/3346/105 9285/3352/105 -f 9279/3346/360 9276/3337/360 9285/3352/360 -f 9285/3352/4015 9276/3337/4015 9286/3353/4015 -f 9283/3350/353 9284/3351/353 9282/3347/353 -f 9284/3351/353 9287/3354/353 9282/3347/353 -f 9282/3347/4016 9287/3354/4016 9276/3337/4016 -f 9287/3354/4017 9286/3353/4017 9276/3337/4017 -f 9280/3348/4018 9277/3338/4018 9281/3349/4018 -f 9278/3341/4019 9281/3349/4019 9277/3338/4019 -f 9280/3348/4020 9276/3337/4020 9277/3338/4020 -f 9278/3341/4021 9279/3346/4021 9281/3349/4021 -f 9197/3245/63 9667/3395/63 9196/3242/63 -f 9668/3396/4022 9196/3242/4022 9669/3395/4022 -f 9670/3397/4023 9225/3290/4023 9671/3398/4023 -f 9224/3288/76 9672/3398/76 9225/3290/76 -f 9252/3356/4024 9255/3355/4024 9673/3399/4024 -f 9674/3400/4025 9675/3399/4025 9255/3355/4025 -f 9676/3360/4026 9254/3359/4026 9677/3401/4026 -f 9678/3402/4027 9679/3401/4027 9254/3359/4027 -f 9253/3363/4028 9680/3360/4028 9681/3403/4028 -f 9682/3404/4028 9683/3403/4028 9684/3360/4028 -f 9257/3366/4029 9256/3365/4029 9685/3405/4029 -f 9686/3406/4030 9687/3405/4030 9256/3365/4030 -f 9258/3370/4031 9688/3369/4031 9689/3407/4031 -f 9690/3399/4032 9691/3407/4032 9692/3369/4032 -f 9693/3372/4033 9694/3356/4033 9695/3408/4033 -f 9696/3399/4034 9697/3408/4034 9698/3356/4034 -f 9699/3375/4035 9259/3374/4035 9700/3399/4035 -f 9701/3409/4036 9702/3399/4036 9259/3374/4036 -f 9703/3365/4037 9704/3377/4037 9705/3410/4037 -f 9706/3405/4038 9707/3410/4038 9708/3377/4038 -f 9709/3411/4009 9710/3412/4009 9711/3413/4009 -f 9712/3414/4009 9713/3413/4009 9714/3412/4009 -f 9715/3415/2231 9716/3416/2231 9717/3417/2231 -f 9718/3418/2231 9719/3417/2231 9720/3416/2231 -f 9721/3419/4039 9722/3420/4039 9723/3421/4039 -f 9724/3413/331 9725/3421/331 9726/3420/331 -f 9727/3422/123 9728/3423/123 9729/3424/123 -f 9730/3425/123 9731/3424/123 9732/3423/123 -f 9314/3426/354 9733/3427/354 9315/3428/354 -f 9734/3427/105 9735/3429/105 9315/3428/105 -f 9736/3429/356 9293/3430/356 9315/3428/356 -f 9315/3428/4040 9293/3430/4040 9316/3431/4040 -f 9737/3432/4011 9738/3427/4011 9739/3433/4011 -f 9740/3427/4011 9314/3426/4011 9741/3433/4011 -f 9742/3433/105 9314/3426/105 9743/3434/105 -f 9293/3430/356 9292/3435/356 9316/3431/356 -f 9316/3431/4011 9292/3435/4011 9317/3346/4011 -f 9292/3435/4041 9744/3319/4041 9317/3346/4041 -f 9317/3346/353 9745/3319/353 9314/3426/353 -f 9746/3319/105 9747/3434/105 9314/3426/105 -f 9306/3436/105 9308/3347/105 9302/3426/105 -f 9307/3437/105 9305/3346/105 9309/3438/105 -f 9309/3438/105 9305/3346/105 9310/3439/105 -f 9310/3439/105 9305/3346/105 9311/3440/105 -f 9305/3346/4042 9302/3426/4042 9311/3440/4042 -f 9311/3440/4043 9302/3426/4043 9312/3441/4043 -f 9309/3438/353 9310/3439/353 9308/3347/353 -f 9310/3439/353 9313/3442/353 9308/3347/353 -f 9308/3347/105 9313/3442/105 9302/3426/105 -f 9313/3442/4044 9312/3441/4044 9302/3426/4044 -f 9306/3436/4042 9303/3428/4042 9307/3437/4042 -f 9304/3431/354 9307/3437/354 9303/3428/354 -f 9306/3436/105 9302/3426/105 9303/3428/105 -f 9304/3431/105 9305/3346/105 9307/3437/105 -f 9294/3443/4045 9297/3444/4045 9748/3445/4045 -f 9749/3446/4046 9750/3445/4046 9297/3444/4046 -f 9751/3447/4047 9296/3448/4047 9752/3449/4047 -f 9753/3450/4048 9754/3449/4048 9296/3448/4048 -f 9295/3451/4049 9755/3447/4049 9756/3450/4049 -f 9757/3452/4049 9758/3450/4049 9759/3447/4049 -f 9299/3453/4050 9298/3454/4050 9760/3455/4050 -f 9761/3456/4051 9762/3455/4051 9298/3454/4051 -f 9300/3457/4052 9763/3458/4052 9764/3459/4052 -f 9765/3445/4053 9766/3459/4053 9767/3458/4053 -f 9768/3460/4054 9769/3443/4054 9770/3461/4054 -f 9771/3445/4055 9772/3461/4055 9773/3443/4055 -f 9774/3462/4056 9301/3463/4056 9775/3445/4056 -f 9776/3464/4057 9777/3445/4057 9301/3463/4057 -f 9778/3454/4058 9779/3453/4058 9780/3456/4058 -f 9781/3455/4059 9782/3456/4059 9783/3453/4059 -f 9784/3465/4060 9785/3466/4060 9786/3467/4060 -f 9787/3468/4061 9788/3467/4061 9789/3466/4061 -f 9790/3469/7 9791/3470/7 9792/3471/7 -f 9793/3472/7 9794/3471/7 9795/3470/7 -f 9796/3473/331 9797/3465/331 9798/3474/331 -f 9799/3467/4062 9800/3474/4062 9801/3465/4062 -f 9802/3475/4063 9803/3469/4063 9804/3476/4063 -f 9805/3471/4063 9806/3476/4063 9807/3469/4063 -f 9808/3427/3772 9330/3426/3772 9331/3428/3772 -f 9809/3429/21 9810/3427/21 9331/3428/21 -f 9188/3477/2228 9811/3429/2228 9331/3428/2228 -f 9188/3477/4064 9331/3428/4064 9332/3431/4064 -f 9812/3427/3830 9813/3432/3830 9814/3433/3830 -f 9330/3426/3830 9815/3427/3830 9816/3433/3830 -f 9330/3426/21 9817/3433/21 9818/3434/21 -f 9189/3478/4065 9188/3477/4065 9332/3431/4065 -f 9189/3478/4065 9332/3431/4065 9333/3346/4065 -f 9819/3319/4066 9189/3478/4066 9333/3346/4066 -f 9820/3319/21 9333/3346/21 9330/3426/21 -f 9821/3434/21 9822/3319/21 9330/3426/21 -f 9324/3347/4067 9322/3436/4067 9318/3426/4067 -f 9321/3346/3989 9323/3437/3989 9325/3438/3989 -f 9321/3346/3989 9325/3438/3989 9326/3439/3989 -f 9321/3346/3990 9326/3439/3990 9327/3440/3990 -f 9318/3426/21 9321/3346/21 9327/3440/21 -f 9318/3426/4068 9327/3440/4068 9328/3441/4068 -f 9326/3439/4069 9325/3438/4069 9324/3347/4069 -f 9329/3442/4069 9326/3439/4069 9324/3347/4069 -f 9329/3442/21 9324/3347/21 9318/3426/21 -f 9328/3441/4070 9329/3442/4070 9318/3426/4070 -f 9319/3428/21 9322/3436/21 9323/3437/21 -f 9323/3437/21 9320/3431/21 9319/3428/21 -f 9318/3426/3985 9322/3436/3985 9319/3428/3985 -f 9321/3346/3772 9320/3431/3772 9323/3437/3772 -f 9823/3479/4071 9198/3247/4071 9199/3246/4071 -f 9199/3246/4072 9824/3480/4072 9825/3479/4072 -f 9226/3291/4073 9826/3479/4073 9827/3481/4073 -f 9828/3481/363 9228/3292/363 9226/3291/363 -f 9297/3444/4074 9294/3443/4074 9829/3482/4074 -f 9830/3482/4075 9831/3483/4075 9297/3444/4075 -f 9296/3448/4076 9832/3447/4076 9833/3484/4076 -f 9834/3484/4077 9835/3485/4077 9296/3448/4077 -f 9836/3447/3997 9295/3451/3997 9837/3486/3997 -f 9838/3486/4078 9839/3487/4078 9840/3447/4078 -f 9298/3454/4079 9299/3453/4079 9841/3488/4079 -f 9842/3488/4000 9843/3489/4000 9298/3454/4000 -f 9844/3458/4080 9300/3457/4080 9845/3490/4080 -f 9846/3490/4081 9847/3491/4081 9848/3458/4081 -f 9849/3443/4082 9850/3460/4082 9851/3492/4082 -f 9852/3492/4083 9853/3482/4083 9854/3443/4083 -f 9301/3463/4084 9855/3462/4084 9856/3482/4084 -f 9857/3482/4085 9858/3493/4085 9301/3463/4085 -f 9859/3453/4086 9860/3454/4086 9861/3494/4086 -f 9862/3494/4087 9863/3495/4087 9864/3453/4087 -f 9865/3496/4088 9866/3497/4088 9867/3498/4088 -f 9868/3498/4060 9869/3499/4060 9870/3496/4060 -f 9871/3500/7 9872/3501/7 9873/3502/7 -f 9874/3502/7 9875/3503/7 9876/3500/7 -f 9877/3497/331 9878/3504/331 9879/3505/331 -f 9880/3505/331 9881/3498/331 9882/3497/331 -f 9883/3506/4063 9884/3507/4063 9885/3508/4063 -f 9886/3508/4063 9887/3502/4063 9888/3506/4063 -f 9335/3509/21 9334/3510/21 9336/3511/21 -f 9336/3511/21 9337/3512/21 9335/3509/21 -f 9889/3513/63 9338/3514/63 9339/3515/63 -f 9339/3515/63 9890/3516/63 9891/3513/63 -f 9340/3517/7 9892/3513/7 9893/3516/7 -f 9894/3516/7 9341/3515/7 9340/3517/7 -f 9895/3510/2446 9896/3509/2446 9897/3512/2446 -f 9898/3512/4089 9899/3511/4089 9900/3510/4089 -f 9901/3518/4090 9902/3519/4090 9342/3520/4090 -f 9342/3520/4091 9343/3521/4091 9903/3518/4091 -f 9904/3519/4092 9905/3522/4092 9344/3523/4092 -f 9344/3523/4093 9342/3520/4093 9906/3519/4093 -f 9907/3524/4094 9908/3518/4094 9343/3521/4094 -f 9343/3521/4095 9345/3525/4095 9909/3524/4095 -f 9910/3522/4096 9911/3524/4096 9345/3525/4096 -f 9345/3525/4097 9344/3523/4097 9912/3522/4097 -f 9347/3509/21 9346/3510/21 9348/3511/21 -f 9348/3511/21 9349/3512/21 9347/3509/21 -f 9913/3526/63 9350/3527/63 9351/3528/63 -f 9351/3528/63 9914/3529/63 9915/3526/63 -f 9352/3527/7 9916/3526/7 9917/3529/7 -f 9918/3529/7 9353/3528/7 9352/3527/7 -f 9919/3510/105 9920/3509/105 9921/3512/105 -f 9922/3512/105 9923/3511/105 9924/3510/105 -f 9925/3530/4090 9926/3531/4090 9354/3532/4090 -f 9354/3532/4090 9355/3533/4090 9927/3530/4090 -f 9928/3531/4092 9929/3534/4092 9356/3535/4092 -f 9356/3535/4093 9354/3532/4093 9930/3531/4093 -f 9931/3536/4098 9932/3530/4098 9355/3533/4098 -f 9355/3533/4095 9357/3537/4095 9933/3536/4095 -f 9934/3534/4097 9935/3536/4097 9357/3537/4097 -f 9357/3537/4097 9356/3535/4097 9936/3534/4097 -f 9937/3538/2216 9938/3524/2216 9939/3539/2216 -f 9940/3538/2216 9941/3539/2216 9942/3278/2216 -f 9943/3278/4099 9944/3539/4099 9945/3519/4099 -f 9946/3538/4100 9947/3518/4100 9948/3524/4100 -f 9949/3278/4101 9950/3519/4101 9951/3534/4101 -f 9952/3531/908 9953/3540/908 9954/3534/908 -f 9955/3534/4099 9956/3540/4099 9957/3278/4099 -f 9958/3395/4102 9959/3479/4102 9960/3480/4102 -f 9961/3480/4103 9962/3396/4103 9963/3395/4103 -f 9964/3536/331 9965/3519/331 9966/3518/331 -f 9967/3536/243 9968/3534/243 9969/3519/243 -f 9970/3518/2950 9971/3538/2950 9972/3536/2950 -f 9973/3541/2215 9974/3530/2215 9975/3536/2215 -f 9976/3541/2215 9977/3536/2215 9978/3538/2215 -f 9979/3479/4104 9980/3397/4104 9981/3481/4104 -f 9982/3481/4105 9983/3397/4105 9984/3398/4105 -f 9985/3541/2089 9986/3540/2089 9987/3530/2089 -f 9988/3531/1571 9989/3530/1571 9990/3540/1571 -f 9366/3542/4106 9361/3543/4106 9367/3544/4106 -f 9361/3543/4107 9368/3545/4107 9367/3544/4107 -f 9367/3544/4108 9368/3545/4108 9369/3546/4108 -f 9361/3543/4109 9366/3542/4109 9370/3547/4109 -f 9370/3547/4110 9366/3542/4110 9192/3548/4110 -f 9366/3542/4111 9371/3549/4111 9192/3548/4111 -f 9368/3545/4112 9192/3548/4112 9369/3546/4112 -f 9369/3546/4113 9192/3548/4113 9371/3549/4113 -f 9373/3550/4114 9374/3551/4114 9380/3542/4114 -f 9372/3552/105 9383/3549/105 9375/3553/105 -f 9375/3553/105 9383/3549/105 9376/3554/105 -f 9376/3554/105 9383/3549/105 9377/3555/105 -f 9383/3549/360 9380/3542/360 9377/3555/360 -f 9377/3555/4015 9380/3542/4015 9378/3556/4015 -f 9375/3553/356 9376/3554/356 9374/3551/356 -f 9376/3554/4115 9379/3557/4115 9374/3551/4115 -f 9374/3551/4116 9379/3557/4116 9380/3542/4116 -f 9379/3557/4117 9378/3556/4117 9380/3542/4117 -f 9373/3550/4118 9380/3542/4118 9381/3544/4118 -f 9373/3550/4119 9381/3544/4119 9372/3552/4119 -f 9382/3546/105 9372/3552/105 9381/3544/105 -f 9382/3546/105 9383/3549/105 9372/3552/105 -f 9384/3558/4120 9385/3559/4120 9991/3560/4120 -f 9992/3561/4121 9993/3560/4121 9385/3559/4121 -f 9994/3562/4122 9386/3563/4122 9995/3564/4122 -f 9996/3565/4123 9997/3564/4123 9386/3563/4123 -f 9387/3566/4124 9998/3562/4124 9999/3565/4124 -f 10000/3567/4124 10001/3565/4124 10002/3562/4124 -f 9388/3568/4125 9389/3569/4125 10003/3570/4125 -f 10004/3571/4126 10005/3570/4126 9389/3569/4126 -f 9390/3572/4127 10006/3573/4127 10007/3574/4127 -f 10008/3560/4128 10009/3574/4128 10010/3573/4128 -f 10011/3575/4129 10012/3558/4129 10013/3576/4129 -f 10014/3560/4130 10015/3576/4130 10016/3558/4130 -f 10017/3573/4131 9391/3577/4131 10018/3560/4131 -f 10019/3578/4132 10020/3560/4132 9391/3577/4132 -f 10021/3579/4133 10022/3568/4133 10023/3571/4133 -f 10024/3580/4134 10025/3571/4134 10026/3568/4134 -f 10027/3581/4135 10028/3582/4135 10029/3583/4135 -f 10030/3584/4136 10031/3583/4136 10032/3582/4136 -f 10033/3585/2231 10034/3586/2231 10035/3587/2231 -f 10036/3588/2231 10037/3587/2231 10038/3586/2231 -f 10039/3589/311 10040/3585/311 10041/3590/311 -f 10042/3587/311 10043/3590/311 10044/3585/311 -f 10045/3591/4137 10046/3592/4137 10047/3593/4137 -f 10048/3594/331 10049/3593/331 10050/3592/331 -f 9362/3595/4138 9392/3542/4138 9393/3596/4138 -f 9360/3597/4139 9362/3595/4139 9393/3596/4139 -f 9394/3545/4140 9360/3597/4140 9393/3596/4140 -f 9394/3545/4141 9393/3596/4141 9395/3546/4141 -f 9362/3595/4142 9364/3598/4142 9396/3599/4142 -f 9392/3542/4143 9362/3595/4143 9396/3599/4143 -f 9392/3542/4144 9396/3599/4144 9397/3600/4144 -f 9398/3549/4145 9392/3542/4145 9397/3600/4145 -f 9397/3600/4146 9394/3545/4146 9395/3546/4146 -f 9397/3600/4147 9395/3546/4147 9398/3549/4147 -f 9401/3551/21 9399/3550/21 9408/3601/21 -f 9404/3602/21 9400/3552/21 9402/3553/21 -f 9404/3602/21 9402/3553/21 9403/3554/21 -f 9408/3601/4148 9404/3602/4148 9405/3556/4148 -f 9403/3554/2228 9402/3553/2228 9401/3551/2228 -f 9406/3557/2228 9403/3554/2228 9401/3551/2228 -f 9406/3557/21 9401/3551/21 9408/3601/21 -f 9405/3556/4149 9406/3557/4149 9408/3601/4149 -f 9408/3601/21 9399/3550/21 9407/3544/21 -f 9407/3544/365 9399/3550/365 9400/3552/365 -f 9400/3552/3772 9409/3546/3772 9407/3544/3772 -f 9400/3552/21 9404/3602/21 9410/3549/21 -f 9410/3549/21 9409/3546/21 9400/3552/21 -f 9408/3601/365 9410/3549/365 9404/3602/365 -f 10051/3603/4150 10052/3604/4150 10053/3605/4150 -f 10054/3605/4151 10055/3606/4151 10056/3603/4151 -f 9385/3559/4152 9384/3558/4152 10057/3607/4152 -f 10058/3607/4153 10059/3608/4153 9385/3559/4153 -f 9386/3563/4154 10060/3562/4154 10061/3609/4154 -f 10062/3609/4155 10063/3610/4155 9386/3563/4155 -f 10064/3562/4156 9387/3566/4156 10065/3610/4156 -f 10066/3610/4156 10067/3609/4156 10068/3562/4156 -f 9389/3569/4157 9388/3568/4157 10069/3611/4157 -f 10070/3611/4157 10071/3612/4157 9389/3569/4157 -f 10072/3573/4158 9390/3572/4158 10073/3613/4158 -f 10074/3613/4159 10075/3607/4159 10076/3573/4159 -f 10077/3558/4160 10078/3575/4160 10079/3614/4160 -f 10080/3614/4161 10081/3607/4161 10082/3558/4161 -f 9391/3577/4162 10083/3573/4162 10084/3607/4162 -f 10085/3607/4163 10086/3615/4163 9391/3577/4163 -f 10087/3568/4164 10088/3579/4164 10089/3612/4164 -f 10090/3612/4165 10091/3611/4165 10092/3568/4165 -f 10093/3616/4166 10094/3617/4166 10095/3618/4166 -f 10096/3618/4167 10097/3619/4167 10098/3616/4167 -f 10099/3620/2231 10100/3621/2231 10101/3622/2231 -f 10102/3622/4168 10103/3623/4168 10104/3620/4168 -f 10105/3621/4169 10106/3624/4169 10107/3625/4169 -f 10108/3625/311 10109/3622/311 10110/3621/311 -f 10111/3626/331 10112/3616/331 10113/3627/331 -f 10114/3627/4170 10115/3618/4170 10116/3626/4170 -f 9411/3628/4171 9412/3629/4171 10117/3630/4171 -f 10118/3631/4172 10119/3630/4172 9412/3629/4172 -f 9411/3628/4173 10120/3630/4173 9413/3632/4173 -f 9414/3633/4174 9411/3628/4174 9413/3632/4174 -f 9414/3633/4175 9413/3632/4175 9415/3634/4175 -f 9416/3635/4176 9414/3633/4176 9415/3634/4176 -f 9415/3634/4177 10121/3631/4177 9412/3629/4177 -f 9415/3634/4178 9412/3629/4178 9416/3635/4178 -f 9432/3635/4179 9418/3636/4179 9419/3637/4179 -f 9432/3635/4180 9419/3637/4180 9420/3638/4180 -f 9432/3635/63 9420/3638/63 9421/3639/63 -f 9432/3635/63 9421/3639/63 9422/3640/63 -f 9432/3635/63 9422/3640/63 9423/3641/63 -f 9424/3642/63 9417/3643/63 9430/3633/63 -f 9430/3633/4181 9432/3635/4181 9423/3641/4181 -f 9430/3633/4182 9423/3641/4182 9425/3644/4182 -f 9420/3638/4183 9419/3637/4183 9424/3642/4183 -f 9426/3645/123 9420/3638/123 9424/3642/123 -f 9426/3645/63 9424/3642/63 9430/3633/63 -f 9427/3646/63 9426/3645/63 9430/3633/63 -f 9422/3640/123 9421/3639/123 9427/3646/123 -f 9428/3647/123 9422/3640/123 9427/3646/123 -f 9428/3647/63 9427/3646/63 9430/3633/63 -f 9425/3644/4184 9428/3647/4184 9430/3633/4184 -f 9429/3628/63 9430/3633/63 9417/3643/63 -f 9429/3628/4181 9417/3643/4181 9418/3636/4181 -f 9418/3636/4185 9431/3629/4185 9429/3628/4185 -f 9432/3635/63 9431/3629/63 9418/3636/63 -f 9433/3648/4186 9434/3649/4186 10122/3650/4186 -f 10123/3650/4187 10124/3651/4187 9433/3648/4187 -f 10125/3652/4188 9435/3653/4188 10126/3654/4188 -f 10127/3654/4189 10128/3655/4189 10129/3652/4189 -f 9436/3656/4190 9437/3657/4190 10130/3658/4190 -f 10131/3658/4190 10132/3659/4190 9436/3656/4190 -f 9438/3660/4191 9439/3661/4191 10133/3662/4191 -f 10134/3662/4192 10135/3663/4192 9438/3660/4192 -f 9440/3653/4193 10136/3652/4193 10137/3664/4193 -f 10138/3664/4193 10139/3665/4193 9440/3653/4193 -f 10140/3666/4194 9441/3667/4194 10141/3668/4194 -f 10142/3668/4195 10143/3650/4195 10144/3666/4195 -f 10145/3649/4196 10146/3648/4196 10147/3651/4196 -f 10148/3651/4197 10149/3650/4197 10150/3649/4197 -f 9442/3669/4198 10151/3670/4198 10152/3650/4198 -f 10153/3650/4199 10154/3651/4199 9442/3669/4199 -f 9443/3657/4200 10155/3656/4200 10156/3671/4200 -f 10157/3671/4201 10158/3672/4201 9443/3657/4201 -f 10159/3670/4202 10160/3669/4202 10161/3651/4202 -f 10162/3651/4203 10163/3650/4203 10164/3670/4203 -f 9444/3667/4204 10165/3666/4204 10166/3650/4204 -f 10167/3650/4205 10168/3651/4205 9444/3667/4205 -f 10169/3673/4206 10170/3674/4206 10171/3675/4206 -f 10172/3675/4207 10173/3662/4207 10174/3673/4207 -f 10175/3676/2228 10176/3677/2228 10177/3678/2228 -f 10178/3678/2228 10179/3679/2228 10180/3676/2228 -f 10181/3680/252 10182/3681/252 10183/3682/252 -f 10184/3682/252 10185/3683/252 10186/3680/252 -f 10187/3677/356 10188/3676/356 10189/3684/356 -f 10190/3684/4208 10191/3678/4208 10192/3677/4208 -f 10193/3685/243 10194/3686/243 10195/3683/243 -f 10196/3683/243 10197/3687/243 10198/3685/243 -f 9445/3688/4209 9446/3628/4209 10199/3689/4209 -f 10200/3689/4210 10201/3690/4210 9445/3688/4210 -f 10202/3689/4211 9446/3628/4211 9447/3691/4211 -f 9446/3628/4212 9448/3633/4212 9447/3691/4212 -f 9447/3691/4213 9448/3633/4213 9191/3692/4213 -f 9448/3633/4214 9449/3635/4214 9191/3692/4214 -f 10203/3690/4215 9191/3692/4215 9445/3688/4215 -f 9445/3688/4216 9191/3692/4216 9449/3635/4216 -f 9450/3636/7 9465/3635/7 9452/3637/7 -f 9452/3637/7 9465/3635/7 9453/3638/7 -f 9453/3638/7 9465/3635/7 9454/3639/7 -f 9454/3639/7 9465/3635/7 9455/3640/7 -f 9455/3640/7 9465/3635/7 9456/3641/7 -f 9451/3643/7 9457/3642/7 9462/3633/7 -f 9465/3635/4217 9462/3633/4217 9456/3641/4217 -f 9456/3641/4218 9462/3633/4218 9458/3644/4218 -f 9452/3637/4219 9453/3638/4219 9457/3642/4219 -f 9453/3638/4219 9459/3645/4219 9457/3642/4219 -f 9457/3642/7 9459/3645/7 9462/3633/7 -f 9459/3645/7 9460/3646/7 9462/3633/7 -f 9454/3639/4219 9455/3640/4219 9460/3646/4219 -f 9455/3640/4219 9461/3647/4219 9460/3646/4219 -f 9460/3646/7 9461/3647/7 9462/3633/7 -f 9461/3647/7 9458/3644/7 9462/3633/7 -f 9462/3633/7 9463/3628/7 9451/3643/7 -f 9451/3643/4220 9463/3628/4220 9450/3636/4220 -f 9464/3688/4221 9450/3636/4221 9463/3628/4221 -f 9464/3688/7 9465/3635/7 9450/3636/7 -f 9434/3649/4222 9433/3648/4222 10204/3693/4222 -f 10205/3694/4223 10206/3693/4223 9433/3648/4223 -f 9435/3653/4224 10207/3652/4224 10208/3695/4224 -f 10209/3696/4225 10210/3695/4225 10211/3652/4225 -f 9437/3657/4226 9436/3656/4226 10212/3697/4226 -f 10213/3698/4226 10214/3697/4226 9436/3656/4226 -f 9439/3661/4227 9438/3660/4227 10215/3699/4227 -f 10216/3700/4228 10217/3699/4228 9438/3660/4228 -f 10218/3652/4229 9440/3653/4229 10219/3696/4229 -f 10220/3695/4229 10221/3696/4229 9440/3653/4229 -f 9441/3667/4230 10222/3666/4230 10223/3694/4230 -f 10224/3693/4231 10225/3694/4231 10226/3666/4231 -f 10227/3648/4232 10228/3649/4232 10229/3694/4232 -f 10230/3693/4233 10231/3694/4233 10232/3649/4233 -f 10233/3670/4234 9442/3669/4234 10234/3693/4234 -f 10235/3694/4235 10236/3693/4235 9442/3669/4235 -f 10237/3656/4236 9443/3657/4236 10238/3698/4236 -f 10239/3697/4236 10240/3698/4236 9443/3657/4236 -f 10241/3669/4237 10242/3670/4237 10243/3694/4237 -f 10244/3693/4238 10245/3694/4238 10246/3670/4238 -f 10247/3666/4239 9444/3667/4239 10248/3693/4239 -f 10249/3694/4240 10250/3693/4240 9444/3667/4240 -f 10251/3674/4241 10252/3673/4241 10253/3700/4241 -f 10254/3699/4241 10255/3700/4241 10256/3673/4241 -f 10257/3701/2228 10258/3702/2228 10259/3703/2228 -f 10260/3704/2228 10261/3703/2228 10262/3702/2228 -f 10263/3705/252 10264/3706/252 10265/3707/252 -f 10266/3708/252 10267/3707/252 10268/3706/252 -f 10269/3702/356 10270/3709/356 10271/3710/356 -f 10272/3711/4242 10273/3710/4242 10274/3709/4242 -f 10275/3706/2350 10276/3705/2350 10277/3708/2350 -f 10278/3712/243 10279/3708/243 10280/3705/243 -f 9358/3543/4243 9466/3713/4243 9467/3714/4243 -f 9193/3715/4244 9358/3543/4244 9467/3714/4244 -f 9193/3715/4245 9467/3714/4245 9468/3716/4245 -f 9466/3713/4246 9358/3543/4246 10281/3717/4246 -f 9466/3713/4247 10282/3717/4247 10283/3718/4247 -f 9469/3719/4248 9466/3713/4248 10284/3718/4248 -f 10285/3718/4249 9193/3715/4249 9468/3716/4249 -f 10286/3718/4250 9468/3716/4250 9469/3719/4250 -f 9472/3720/2505 9470/3721/2505 9479/3713/2505 -f 9481/3719/4251 9471/3722/4251 9473/3723/4251 -f 9481/3719/4251 9473/3723/4251 9474/3724/4251 -f 9481/3719/4251 9474/3724/4251 9475/3725/4251 -f 9479/3713/4252 9481/3719/4252 9475/3725/4252 -f 9479/3713/3772 9475/3725/3772 9476/3726/3772 -f 9474/3724/2228 9473/3723/2228 9472/3720/2228 -f 9477/3727/2228 9474/3724/2228 9472/3720/2228 -f 9477/3727/21 9472/3720/21 9479/3713/21 -f 9476/3726/21 9477/3727/21 9479/3713/21 -f 9479/3713/21 9470/3721/21 9478/3714/21 -f 9478/3714/21 9470/3721/21 9471/3722/21 -f 9471/3722/4253 9480/3716/4253 9478/3714/4253 -f 9481/3719/4251 9480/3716/4251 9471/3722/4251 -f 9482/3728/4254 9483/3729/4254 10287/3730/4254 -f 10288/3730/4255 10289/3731/4255 9482/3728/4255 -f 9484/3732/4256 10290/3733/4256 10291/3734/4256 -f 10292/3734/4257 10293/3735/4257 9484/3732/4257 -f 10294/3733/4258 9485/3736/4258 10295/3735/4258 -f 10296/3735/4259 10297/3734/4259 10298/3733/4259 -f 9486/3737/4260 9487/3738/4260 10299/3739/4260 -f 10300/3739/4261 10301/3740/4261 9486/3737/4261 -f 10302/3741/4262 9488/3742/4262 10303/3743/4262 -f 10304/3743/4263 10305/3730/4263 10306/3741/4263 -f 10307/3729/4264 10308/3744/4264 10309/3745/4264 -f 10310/3745/4265 10311/3730/4265 10312/3729/4265 -f 9489/3746/4266 10313/3741/4266 10314/3730/4266 -f 10315/3730/4267 10316/3747/4267 9489/3746/4267 -f 10317/3748/4268 10318/3737/4268 10319/3749/4268 -f 10320/3749/4269 10321/3750/4269 10322/3748/4269 -f 10323/3751/4135 10324/3752/4135 10325/3753/4135 -f 10326/3753/4135 10327/3754/4135 10328/3751/4135 -f 10329/3755/7 10330/3756/7 10331/3757/7 -f 10332/3757/7 10333/3758/7 10334/3755/7 -f 10335/3756/274 10336/3759/274 10337/3760/274 -f 10338/3760/274 10339/3757/274 10340/3756/274 -f 10341/3752/331 10342/3751/331 10343/3754/331 -f 10344/3754/4137 10345/3753/4137 10346/3752/4137 -f 9490/3761/4270 9363/3762/4270 9491/3714/4270 -f 9363/3762/4271 9359/3763/4271 9491/3714/4271 -f 9359/3763/4272 9492/3764/4272 9491/3714/4272 -f 9491/3714/4273 9492/3764/4273 9493/3716/4273 -f 9365/3765/4274 9363/3762/4274 10347/3766/4274 -f 9363/3762/4275 9490/3761/4275 10348/3766/4275 -f 10349/3766/4276 9490/3761/4276 10350/3767/4276 -f 9490/3761/4277 9494/3719/4277 10351/3767/4277 -f 9492/3764/360 10352/3767/360 9493/3716/360 -f 9493/3716/105 10353/3767/105 9494/3719/105 -f 9496/3721/4278 9497/3720/4278 9503/3713/4278 -f 9495/3722/4279 9506/3719/4279 9498/3723/4279 -f 9498/3723/4280 9506/3719/4280 9499/3724/4280 -f 9499/3724/4281 9506/3719/4281 9500/3725/4281 -f 9506/3719/4282 9503/3713/4282 9500/3725/4282 -f 9500/3725/4283 9503/3713/4283 9501/3726/4283 -f 9498/3723/4284 9499/3724/4284 9497/3720/4284 -f 9499/3724/4040 9502/3727/4040 9497/3720/4040 -f 9497/3720/4285 9502/3727/4285 9503/3713/4285 -f 9502/3727/4281 9501/3726/4281 9503/3713/4281 -f 9496/3721/105 9503/3713/105 9504/3714/105 -f 9496/3721/105 9504/3714/105 9495/3722/105 -f 9505/3716/4286 9495/3722/4286 9504/3714/4286 -f 9505/3716/4281 9506/3719/4281 9495/3722/4281 -f 10354/3768/4287 10355/3769/4287 10356/3770/4287 -f 10357/3634/4288 10358/3770/4288 10359/3769/4288 -f 9483/3729/4289 9482/3728/4289 10360/3771/4289 -f 10361/3772/4290 10362/3771/4290 9482/3728/4290 -f 10363/3733/4291 9484/3732/4291 10364/3773/4291 -f 10365/3774/4292 10366/3773/4292 9484/3732/4292 -f 9485/3736/4293 10367/3733/4293 10368/3774/4293 -f 10369/3773/4294 10370/3774/4294 10371/3733/4294 -f 9487/3738/4295 9486/3737/4295 10372/3775/4295 -f 10373/3776/4295 10374/3775/4295 9486/3737/4295 -f 9488/3742/4296 10375/3741/4296 10376/3777/4296 -f 10377/3771/4297 10378/3777/4297 10379/3741/4297 -f 10380/3744/4298 10381/3729/4298 10382/3778/4298 -f 10383/3771/4299 10384/3778/4299 10385/3729/4299 -f 10386/3741/4300 9489/3746/4300 10387/3771/4300 -f 10388/3779/4301 10389/3771/4301 9489/3746/4301 -f 10390/3737/4302 10391/3748/4302 10392/3780/4302 -f 10393/3781/4303 10394/3780/4303 10395/3748/4303 -f 10396/3782/4135 10397/3783/4135 10398/3784/4135 -f 10399/3785/4304 10400/3784/4304 10401/3783/4304 -f 10402/3786/7 10403/3787/7 10404/3788/7 -f 10405/3789/7 10406/3788/7 10407/3787/7 -f 10408/3790/4305 10409/3786/4305 10410/3791/4305 -f 10411/3788/311 10412/3791/311 10413/3786/311 -f 10414/3783/331 10415/3782/331 10416/3792/331 -f 10417/3784/331 10418/3792/331 10419/3782/331 -f 10420/3606/4306 10421/3634/4306 10422/3769/4306 -f 10423/3769/4307 10424/3603/4307 10425/3606/4307 -f 9508/3793/21 9507/3794/21 9509/3795/21 -f 9509/3795/21 9510/3796/21 9508/3793/21 -f 10426/3797/243 10427/3798/243 10428/3799/243 -f 10429/3799/243 10430/3800/243 10431/3797/243 -o diesent1 -v 0.333828 0.798069 0.757057 -v 0.866927 0.798069 0.757057 -v 0.333828 0.798069 0.482212 -v 0.866927 0.798069 0.482212 -v 0.333828 0.093855 0.757057 -v 0.866927 0.093855 0.757057 -v 0.333828 0.093855 0.482212 -v 0.866927 0.093855 0.482212 -v 0.866927 0.798069 0.757057 -v 0.866927 0.093855 0.757057 -v 0.866927 0.093855 0.757057 -vt 0.424239 0.775438 -vt 0.575761 0.775438 -vt 0.075761 0.775438 -vt -0.075761 0.775438 -vt -0.075761 0.224562 -vt 0.575761 0.224562 -vt 0.075761 0.224562 -vt 0.424239 0.224562 -vt 0.924239 0.775438 -vt 0.924239 0.224562 +f 345//50 346//50 348//50 +f 347//51 348//51 350//51 +f 349//52 350//52 352//52 +f 351//255 352//255 354//255 +f 353//256 354//256 356//256 +f 355//55 356//55 358//55 +f 357//56 358//56 360//56 +f 359//57 360//57 362//57 +f 361//58 362//58 364//58 +f 363//59 364//59 366//59 +f 365//60 366//60 368//60 +f 367//257 368//257 370//257 +f 369//258 370//258 372//258 +f 371//63 372//63 374//63 +f 373//64 374//64 376//64 +f 375//65 376//65 378//65 +f 377//66 378//66 379//66 +f 379//67 380//67 381//67 +f 381//68 382//68 383//68 +f 383//69 384//69 385//69 +f 385//70 386//70 387//70 +f 387//71 388//71 389//71 +f 389//259 390//259 391//259 +f 391//260 392//260 393//260 +f 393//74 394//74 395//74 +f 395//75 396//75 397//75 +f 397//261 398//261 399//261 +f 399//77 400//77 401//77 +f 401//262 402//262 403//262 +f 403//79 404//79 405//79 +f 408//263 406//263 440//263 +f 407//81 408//81 345//81 +f 405//82 406//82 407//82 +f 385//264 387//264 461//264 +f 437//47 439//47 438//47 +f 384//265 382//265 428//265 +f 360//266 358//266 415//266 +f 398//267 396//267 435//267 +f 374//268 372//268 422//268 +f 350//269 348//269 410//269 +f 388//270 386//270 430//270 +f 364//271 362//271 417//271 +f 402//272 400//272 437//272 +f 378//273 376//273 424//273 +f 354//274 352//274 412//274 +f 392//275 390//275 432//275 +f 348//276 346//276 409//276 +f 368//277 366//277 419//277 +f 406//278 404//278 439//278 +f 382//279 380//279 427//279 +f 358//280 356//280 414//280 +f 396//281 394//281 434//281 +f 372//282 370//282 421//282 +f 346//283 408//283 409//283 +f 386//284 384//284 429//284 +f 362//285 360//285 416//285 +f 400//286 398//286 436//286 +f 376//287 374//287 423//287 +f 352//288 350//288 411//288 +f 390//289 388//289 431//289 +f 366//290 364//290 418//290 +f 404//291 402//291 438//291 +f 380//292 378//292 426//292 +f 356//293 354//293 413//293 +f 394//294 392//294 433//294 +f 370//295 368//295 420//295 +f 441//49 442//49 472//49 +f 361//296 363//296 450//296 +f 399//297 401//297 468//297 +f 375//298 377//298 457//298 +f 351//299 353//299 445//299 +f 389//300 391//300 463//300 +f 345//301 347//301 442//301 +f 365//302 367//302 452//302 +f 403//303 405//303 470//303 +f 379//304 381//304 458//304 +f 355//305 357//305 447//305 +f 393//306 395//306 465//306 +f 369//307 371//307 454//307 +f 407//308 345//308 472//308 +f 383//309 385//309 460//309 +f 359//310 361//310 449//310 +f 397//311 399//311 467//311 +f 373//312 375//312 456//312 +f 349//313 351//313 444//313 +f 387//314 389//314 462//314 +f 363//315 365//315 451//315 +f 401//316 403//316 469//316 +f 377//317 379//317 457//317 +f 353//318 355//318 446//318 +f 391//319 393//319 464//319 +f 367//320 369//320 453//320 +f 405//321 407//321 471//321 +f 381//322 383//322 459//322 +f 357//323 359//323 448//323 +f 395//324 397//324 466//324 +f 371//325 373//325 455//325 +f 347//326 349//326 443//326 +f 347//178 345//178 348//178 +f 349//51 347//51 350//51 +f 351//52 349//52 352//52 +f 353//255 351//255 354//255 +f 355//256 353//256 356//256 +f 357//179 355//179 358//179 +f 359//56 357//56 360//56 +f 361//57 359//57 362//57 +f 363//58 361//58 364//58 +f 365//59 363//59 366//59 +f 367//60 365//60 368//60 +f 369//257 367//257 370//257 +f 371//181 369//181 372//181 +f 373//182 371//182 374//182 +f 375//183 373//183 376//183 +f 377//65 375//65 378//65 +f 378//184 380//184 379//184 +f 380//67 382//67 381//67 +f 382//68 384//68 383//68 +f 384//69 386//69 385//69 +f 386//70 388//70 387//70 +f 388//71 390//71 389//71 +f 390//259 392//259 391//259 +f 392//260 394//260 393//260 +f 394//74 396//74 395//74 +f 396//75 398//75 397//75 +f 398//261 400//261 399//261 +f 400//77 402//77 401//77 +f 402//262 404//262 403//262 +f 404//79 406//79 405//79 +f 406//263 439//263 440//263 +f 408//81 346//81 345//81 +f 406//82 408//82 407//82 +f 387//327 462//327 461//327 +f 436//47 439//47 437//47 +f 427//47 429//47 428//47 +f 427//47 430//47 429//47 +f 421//47 423//47 422//47 +f 420//47 423//47 421//47 +f 411//47 413//47 412//47 +f 411//47 414//47 413//47 +f 410//47 409//47 411//47 +f 409//47 440//47 411//47 +f 440//47 439//47 411//47 +f 439//47 436//47 411//47 +f 411//47 436//47 414//47 +f 436//328 435//328 414//328 +f 414//328 435//328 415//328 +f 435//47 434//47 415//47 +f 434//47 433//47 415//47 +f 433//47 432//47 415//47 +f 432//47 431//47 415//47 +f 415//47 431//47 416//47 +f 416//47 431//47 417//47 +f 417//47 431//47 418//47 +f 418//47 431//47 419//47 +f 431//328 430//328 419//328 +f 419//328 430//328 420//328 +f 430//47 427//47 420//47 +f 420//47 427//47 423//47 +f 427//47 426//47 423//47 +f 426//47 425//47 424//47 +f 423//47 426//47 424//47 +f 382//265 427//265 428//265 +f 416//329 360//329 415//329 +f 396//267 434//267 435//267 +f 423//268 374//268 422//268 +f 411//269 350//269 410//269 +f 386//330 429//330 430//330 +f 418//331 364//331 417//331 +f 400//332 436//332 437//332 +f 425//273 378//273 424//273 +f 413//274 354//274 412//274 +f 390//275 431//275 432//275 +f 410//276 348//276 409//276 +f 420//333 368//333 419//333 +f 404//334 438//334 439//334 +f 380//335 426//335 427//335 +f 415//336 358//336 414//336 +f 394//337 433//337 434//337 +f 422//338 372//338 421//338 +f 408//283 440//283 409//283 +f 384//284 428//284 429//284 +f 417//339 362//339 416//339 +f 398//340 435//340 436//340 +f 424//341 376//341 423//341 +f 412//342 352//342 411//342 +f 388//343 430//343 431//343 +f 419//290 366//290 418//290 +f 402//291 437//291 438//291 +f 378//292 425//292 426//292 +f 414//344 356//344 413//344 +f 392//345 432//345 433//345 +f 421//346 370//346 420//346 +f 442//49 443//49 472//49 +f 443//49 444//49 472//49 +f 444//49 445//49 472//49 +f 445//49 446//49 472//49 +f 446//347 447//347 472//347 +f 447//348 448//348 472//348 +f 468//349 466//349 467//349 +f 448//348 449//348 472//348 +f 468//350 465//350 466//350 +f 449//348 450//348 472//348 +f 468//351 464//351 465//351 +f 450//348 451//348 472//348 +f 468//352 463//352 464//352 +f 451//348 452//348 472//348 +f 468//353 462//353 463//353 +f 452//348 453//348 472//348 +f 468//354 461//354 462//354 +f 453//49 454//49 472//49 +f 468//354 460//354 461//354 +f 454//355 455//355 472//355 +f 468//354 459//354 460//354 +f 455//355 456//355 472//355 +f 468//355 458//355 459//355 +f 456//355 457//355 472//355 +f 457//355 458//355 472//355 +f 458//355 468//355 472//355 +f 468//49 469//49 472//49 +f 469//49 470//49 471//49 +f 472//49 469//49 471//49 +f 449//356 361//356 450//356 +f 401//297 469//297 468//297 +f 456//298 375//298 457//298 +f 444//299 351//299 445//299 +f 391//300 464//300 463//300 +f 441//301 345//301 442//301 +f 451//302 365//302 452//302 +f 405//303 471//303 470//303 +f 381//357 459//357 458//357 +f 446//358 355//358 447//358 +f 395//359 466//359 465//359 +f 453//307 369//307 454//307 +f 345//308 441//308 472//308 +f 385//309 461//309 460//309 +f 448//310 359//310 449//310 +f 399//360 468//360 467//360 +f 455//312 373//312 456//312 +f 443//313 349//313 444//313 +f 389//314 463//314 462//314 +f 450//315 363//315 451//315 +f 403//316 470//316 469//316 +f 379//317 458//317 457//317 +f 445//318 353//318 446//318 +f 393//361 465//361 464//361 +f 452//362 367//362 453//362 +f 407//363 472//363 471//363 +f 383//322 460//322 459//322 +f 447//323 357//323 448//323 +f 397//324 467//324 466//324 +f 454//325 371//325 455//325 +f 442//364 347//364 443//364 +v 0.000000 0.010026 -4.301087 +v 0.000000 4.010026 -4.301087 +v 0.195090 0.010026 -4.281873 +v 0.195090 4.010026 -4.281873 +v 0.382683 0.010026 -4.224967 +v 0.382683 4.010026 -4.224967 +v 0.555570 0.010026 -4.132557 +v 0.555570 4.010026 -4.132557 +v 0.707107 0.010026 -4.008194 +v 0.707107 4.010026 -4.008194 +v 0.831470 0.010026 -3.856658 +v 0.831470 4.010026 -3.856658 +v 0.923880 0.010026 -3.683771 +v 0.923880 4.010026 -3.683771 +v 0.980785 0.010026 -3.496178 +v 0.980785 4.010026 -3.496178 +v 1.000000 0.010026 -3.301088 +v 1.000000 4.010026 -3.301088 +v 0.980785 0.010026 -3.105997 +v 0.980785 4.010026 -3.105997 +v 0.923880 0.010026 -2.918404 +v 0.923880 4.010026 -2.918404 +v 0.831470 0.010026 -2.745517 +v 0.831470 4.010026 -2.745517 +v 0.707107 0.010026 -2.593981 +v 0.707107 4.010026 -2.593981 +v 0.555570 0.010026 -2.469618 +v 0.555570 4.010026 -2.469618 +v 0.382683 0.010026 -2.377208 +v 0.382683 4.010026 -2.377208 +v 0.195090 0.010026 -2.320302 +v 0.195090 4.010026 -2.320302 +v -0.000000 0.010026 -2.301088 +v -0.000000 4.010026 -2.301088 +v -0.195091 0.010026 -2.320302 +v -0.195091 4.010026 -2.320302 +v -0.382684 0.010026 -2.377208 +v -0.382684 4.010026 -2.377208 +v -0.555571 0.010026 -2.469618 +v -0.555571 4.010026 -2.469618 +v -0.707107 0.010026 -2.593981 +v -0.707107 4.010026 -2.593981 +v -0.831470 0.010026 -2.745518 +v -0.831470 4.010026 -2.745518 +v -0.923880 0.010026 -2.918405 +v -0.923880 4.010026 -2.918405 +v -0.980785 0.010026 -3.105998 +v -0.980785 4.010026 -3.105998 +v -1.000000 0.010026 -3.301089 +v -1.000000 4.010026 -3.301089 +v -0.980785 0.010026 -3.496179 +v -0.980785 4.010026 -3.496179 +v -0.923879 0.010026 -3.683772 +v -0.923879 4.010026 -3.683772 +v -0.831469 0.010026 -3.856659 +v -0.831469 4.010026 -3.856659 +v -0.707106 0.010026 -4.008195 +v -0.707106 4.010026 -4.008195 +v -0.555569 0.010026 -4.132558 +v -0.555569 4.010026 -4.132558 +v -0.382682 0.010026 -4.224968 +v -0.382682 4.010026 -4.224968 +v -0.195089 0.010026 -4.281873 +v -0.195089 4.010026 -4.281873 +v 0.000000 4.270857 -3.619825 +v 0.062183 4.270857 -3.613700 +v 0.121975 4.270857 -3.595562 +v 0.177081 4.270857 -3.566108 +v 0.225381 4.270857 -3.526469 +v 0.265020 4.270857 -3.478168 +v 0.294475 4.270857 -3.423063 +v 0.312612 4.270857 -3.363270 +v 0.318737 4.270857 -3.301088 +v 0.312613 4.270857 -3.238905 +v 0.294475 4.270857 -3.179112 +v 0.265020 4.270857 -3.124007 +v 0.225381 4.270857 -3.075707 +v 0.177081 4.270857 -3.036068 +v 0.121975 4.270857 -3.006613 +v 0.062182 4.270857 -2.988475 +v -0.000000 4.270857 -2.982351 +v -0.062183 4.270857 -2.988475 +v -0.121975 4.270857 -3.006613 +v -0.177081 4.270857 -3.036068 +v -0.225381 4.270857 -3.075707 +v -0.265020 4.270857 -3.124007 +v -0.294475 4.270857 -3.179113 +v -0.312613 4.270857 -3.238906 +v -0.318737 4.270857 -3.301088 +v -0.312612 4.270857 -3.363271 +v -0.294474 4.270857 -3.423064 +v -0.265020 4.270857 -3.478169 +v -0.225381 4.270857 -3.526469 +v -0.177080 4.270857 -3.566108 +v -0.121975 4.270857 -3.595562 +v -0.062182 4.270857 -3.613700 +vn 0.098017 0.000000 -0.995185 +vn 0.290285 0.000000 -0.956940 +vn 0.471396 0.000000 -0.881922 +vn 0.634394 0.000000 -0.773010 +vn 0.773011 0.000000 -0.634393 +vn 0.881921 0.000000 -0.471397 +vn 0.956940 0.000000 -0.290285 +vn 0.995185 0.000000 -0.098017 +vn 0.995185 0.000000 0.098017 +vn 0.881921 0.000000 0.471397 +vn 0.773011 0.000000 0.634393 +vn 0.634394 0.000000 0.773010 +vn 0.471396 0.000000 0.881921 +vn 0.290285 0.000000 0.956940 +vn 0.098017 0.000000 0.995185 +vn -0.098018 0.000000 0.995185 +vn -0.290285 0.000000 0.956940 +vn -0.471397 0.000000 0.881921 +vn -0.634394 0.000000 0.773010 +vn -0.773011 0.000000 0.634393 +vn -0.881922 0.000000 0.471396 +vn -0.956941 0.000000 0.290284 +vn -0.995185 0.000000 0.098016 +vn -0.995185 -0.000000 -0.098018 +vn -0.956940 -0.000000 -0.290286 +vn -0.881921 -0.000000 -0.471398 +vn -0.773010 -0.000000 -0.634394 +vn -0.634392 -0.000000 -0.773012 +vn -0.471397 -0.000000 -0.881921 +vn -0.357332 0.933314 -0.035195 +vn -0.098015 -0.000000 -0.995185 +vn -0.290282 -0.000000 -0.956941 +vn 0.227786 0.933314 0.277558 +vn -0.035193 0.933314 -0.357332 +vn -0.227786 0.933314 0.277558 +vn 0.357332 0.933314 -0.035194 +vn -0.316663 0.933314 -0.169261 +vn 0.104230 0.933314 0.343600 +vn 0.169260 0.933314 -0.316664 +vn -0.316664 0.933314 0.169260 +vn 0.343600 0.933314 0.104230 +vn -0.227785 0.933314 -0.277559 +vn -0.035194 0.933314 0.357332 +vn 0.277558 0.933314 -0.227786 +vn -0.357332 0.933314 0.035194 +vn 0.277558 0.933314 0.227786 +vn -0.104229 0.933314 -0.343600 +vn -0.169260 0.933314 0.316663 +vn 0.343600 0.933314 -0.104230 +vn -0.343600 0.933314 -0.104230 +vn 0.169260 0.933314 0.316664 +vn 0.104230 0.933314 -0.343600 +vn -0.277558 0.933314 0.227786 +vn 0.357332 0.933314 0.035194 +vn -0.277558 0.933314 -0.227786 +vn 0.035194 0.933314 0.357332 +vn 0.227786 0.933314 -0.277558 +vn -0.343600 0.933314 0.104230 +vn 0.035194 0.933314 -0.357332 +vn 0.316664 0.933314 0.169260 +vn -0.169260 0.933314 -0.316664 +vn -0.104230 0.933314 0.343600 +vn 0.316664 0.933314 -0.169260 +vn -0.357332 0.933314 -0.035194 +vn -0.035195 0.933314 -0.357332 +vn -0.316664 0.933314 -0.169260 +vn 0.169261 0.933314 -0.316663 +vn -0.227786 0.933314 -0.277558 +vn -0.357332 0.933314 0.035193 +vn -0.104230 0.933314 -0.343600 +vn -0.169261 0.933314 0.316663 +vn 0.035195 0.933314 -0.357332 +vn -0.169259 0.933314 -0.316664 s off -f 10434/3801/331 10432/3802/331 10435/3803/331 -f 10432/3802/331 10433/3804/331 10435/3803/331 -f 10437/3805/3 10436/3806/3 10439/3807/3 -f 10438/3808/3 10439/3807/3 10436/3806/3 -f 10440/3809/21 10432/3802/21 10441/3810/21 -f 10432/3802/21 10436/3806/21 10442/3810/21 -f 10435/3803/63 10433/3804/63 10439/3807/63 -f 10437/3805/63 10439/3807/63 10433/3804/63 -f 10434/3801/105 10435/3803/105 10438/3808/105 -f 10439/3807/105 10438/3808/105 10435/3803/105 -f 10432/3802/7 10434/3801/7 10436/3806/7 -f 10438/3808/7 10436/3806/7 10434/3801/7 -o diespump -v 1.183788 0.526257 2.556130 -v 1.183788 0.541556 2.556130 -v 1.197042 0.549206 2.556130 -v 1.210296 0.541529 2.556130 -v 1.210296 0.526257 2.556130 -v 1.197051 0.518613 2.556130 -v 1.260328 0.135139 2.973181 -v 1.065098 0.135139 2.973180 -v 1.260328 0.135139 2.556130 -v 1.065099 0.135139 2.556130 -v 1.260328 0.393582 2.954599 -v 1.260328 0.393583 2.574712 -v 1.260328 0.384988 2.574579 -v 1.260328 0.384988 2.758081 -v 1.260328 0.144767 2.758081 -v 1.260328 0.384988 2.771100 -v 1.260328 0.384988 2.954602 -v 1.260328 0.144767 2.771100 -v 1.260328 0.690886 2.574712 -v 1.260328 0.702328 2.556130 -v 1.260328 0.702327 2.973181 -v 1.260328 0.690886 2.954600 -v 1.260328 0.331349 2.565462 -v 1.260328 0.201994 2.574576 -v 1.260328 0.331349 2.574541 -v 1.260328 0.201994 2.565498 -v 1.260328 0.360397 2.574541 -v 1.260328 0.360397 2.565461 -v 1.260328 0.172946 2.574576 -v 1.260328 0.172946 2.565497 -v 1.260328 0.144767 2.574579 -v 1.260328 0.360396 2.954621 -v 1.260328 0.360396 2.963701 -v 1.260328 0.144767 2.954602 -v 1.260328 0.331348 2.963701 -v 1.260328 0.407143 2.592039 -v 1.260328 0.407143 2.937272 -v 1.260328 0.677326 2.592039 -v 1.260328 0.677325 2.937273 -v 1.299571 0.291820 2.733095 -v 1.299571 0.294369 2.731623 -v 1.299571 0.289270 2.731623 -v 1.299571 0.294369 2.728679 -v 1.299571 0.289270 2.728679 -v 1.299571 0.291820 2.727207 -v 1.299571 0.291820 2.800351 -v 1.299571 0.294369 2.798878 -v 1.299571 0.289270 2.798878 -v 1.299571 0.294369 2.795934 -v 1.299571 0.289270 2.795934 -v 1.299571 0.291820 2.794462 -v 1.260328 0.331348 2.954622 -v 1.260328 0.201993 2.963623 -v 1.260328 0.172945 2.963623 -v 1.275802 0.201993 2.954545 -v 1.275802 0.172945 2.954545 -v 1.275802 0.172945 2.963623 -v 1.275802 0.201993 2.963623 -v 1.260328 0.172945 2.954545 -v 1.260328 0.201993 2.954545 -v 1.275802 0.360396 2.954621 -v 1.275802 0.331348 2.954621 -v 1.275802 0.331348 2.963701 -v 1.275802 0.360396 2.963701 -v 1.275802 0.201994 2.574576 -v 1.275802 0.201994 2.565498 -v 1.275802 0.172946 2.574576 -v 1.275802 0.172946 2.565498 -v 1.275802 0.360397 2.565461 -v 1.275802 0.331349 2.565462 -v 1.275802 0.360397 2.574541 -v 1.275802 0.331349 2.574541 -v 1.292898 0.407143 2.592039 -v 1.292898 0.393583 2.574712 -v 1.292898 0.407143 2.937272 -v 1.292898 0.393582 2.954599 -v 1.292898 0.690886 2.574712 -v 1.292898 0.677326 2.592039 -v 1.292898 0.690886 2.954600 -v 1.292898 0.677325 2.937272 -v 1.292898 0.294369 2.728679 -v 1.292898 0.291820 2.727207 -v 1.292898 0.289270 2.728679 -v 1.292898 0.144767 2.574579 -v 1.292898 0.144767 2.758081 -v 1.292898 0.289270 2.731623 -v 1.292898 0.291820 2.733095 -v 1.292898 0.384988 2.758082 -v 1.292898 0.294369 2.731623 -v 1.292898 0.384988 2.574579 -v 1.292898 0.294369 2.795934 -v 1.292898 0.384988 2.771100 -v 1.292898 0.291820 2.794462 -v 1.292898 0.144767 2.771100 -v 1.292898 0.289270 2.795934 -v 1.292898 0.144767 2.954602 -v 1.292898 0.289270 2.798878 -v 1.292898 0.291820 2.800351 -v 1.292898 0.294369 2.798878 -v 1.292898 0.384988 2.954602 -v 1.065099 0.702327 2.973181 -v 1.065099 0.702328 2.556130 -v 1.183788 0.526257 3.316362 -v 1.183788 0.541556 3.316362 -v 1.197042 0.549205 3.316362 -v 1.210296 0.541529 3.316362 -v 1.210296 0.526257 3.316362 -v 1.197051 0.518612 3.316362 -v 1.260328 0.135138 3.733413 -v 1.065099 0.135138 3.733413 -v 1.260328 0.135138 3.316362 -v 1.065098 0.135138 3.316362 -v 1.260328 0.393582 3.714832 -v 1.260328 0.393582 3.334944 -v 1.260328 0.384987 3.334811 -v 1.260328 0.384987 3.518314 -v 1.260328 0.144766 3.518314 -v 1.260328 0.384987 3.531332 -v 1.260328 0.384987 3.714834 -v 1.260328 0.144766 3.531332 -v 1.260328 0.690885 3.334944 -v 1.260328 0.702327 3.316362 -v 1.260328 0.702327 3.733414 -v 1.260328 0.690885 3.714832 -v 1.260328 0.331348 3.325694 -v 1.260328 0.201993 3.334808 -v 1.260328 0.331348 3.334773 -v 1.260328 0.201993 3.325729 -v 1.260328 0.360396 3.334773 -v 1.260328 0.360396 3.325694 -v 1.260328 0.172945 3.334808 -v 1.260328 0.172945 3.325729 -v 1.260328 0.144766 3.334811 -v 1.260328 0.360395 3.714854 -v 1.260328 0.360395 3.723933 -v 1.260328 0.144766 3.714834 -v 1.260328 0.331348 3.723933 -v 1.260328 0.407143 3.352271 -v 1.260328 0.407142 3.697504 -v 1.260328 0.677325 3.352272 -v 1.260328 0.677324 3.697504 -v 1.299571 0.291819 3.493328 -v 1.299571 0.294369 3.491856 -v 1.299571 0.289269 3.491856 -v 1.299571 0.294369 3.488912 -v 1.299571 0.289269 3.488911 -v 1.299571 0.291819 3.487439 -v 1.299571 0.291819 3.560583 -v 1.299571 0.294369 3.559111 -v 1.299571 0.289269 3.559111 -v 1.299571 0.294369 3.556166 -v 1.299571 0.289269 3.556167 -v 1.299571 0.291819 3.554694 -v 1.260328 0.331348 3.714854 -v 1.260328 0.201992 3.723855 -v 1.260328 0.172945 3.723855 -v 1.275802 0.201992 3.714778 -v 1.275802 0.172945 3.714777 -v 1.275802 0.172945 3.723855 -v 1.275802 0.201992 3.723855 -v 1.260328 0.172945 3.714777 -v 1.260328 0.201992 3.714777 -v 1.275802 0.360395 3.714854 -v 1.275802 0.331348 3.714854 -v 1.275802 0.331348 3.723933 -v 1.275802 0.360395 3.723933 -v 1.275802 0.201993 3.334808 -v 1.275802 0.201993 3.325729 -v 1.275802 0.172945 3.334808 -v 1.275802 0.172945 3.325729 -v 1.275802 0.360396 3.325694 -v 1.275802 0.331348 3.325694 -v 1.275802 0.360396 3.334773 -v 1.275802 0.331348 3.334773 -v 1.292898 0.407143 3.352271 -v 1.292898 0.393582 3.334944 -v 1.292898 0.407142 3.697504 -v 1.292898 0.393582 3.714831 -v 1.292898 0.690885 3.334944 -v 1.292898 0.677325 3.352272 -v 1.292898 0.690885 3.714832 -v 1.292898 0.677324 3.697504 -v 1.292898 0.294369 3.488911 -v 1.292898 0.291819 3.487439 -v 1.292898 0.289269 3.488911 -v 1.292898 0.144766 3.334811 -v 1.292898 0.144766 3.518314 -v 1.292898 0.289269 3.491856 -v 1.292898 0.291819 3.493328 -v 1.292898 0.384987 3.518314 -v 1.292898 0.294369 3.491856 -v 1.292898 0.384987 3.334811 -v 1.292898 0.294368 3.556166 -v 1.292898 0.384987 3.531332 -v 1.292898 0.291819 3.554694 -v 1.292898 0.144766 3.531332 -v 1.292898 0.289269 3.556167 -v 1.292898 0.144766 3.714834 -v 1.292898 0.289269 3.559111 -v 1.292898 0.291819 3.560582 -v 1.292898 0.294368 3.559111 -v 1.292898 0.384987 3.714834 -v 1.065099 0.702327 3.733414 -v 1.065099 0.702327 3.316362 -vn 1.000000 0.000010 -0.000026 -vn 1.000000 0.000008 -0.000198 -vn 1.000000 -0.000000 -0.000025 -vn 1.000000 -0.000007 0.000004 -vn -0.000000 -0.000271 -1.000000 -vn 0.000005 1.000000 -0.000005 -vn 0.000000 0.001551 -0.999999 -vn -0.000001 -1.000000 0.000013 -vn 0.000015 -0.000102 -1.000000 -vn 0.000000 0.000785 1.000000 -vn -0.000000 -0.000008 -1.000000 -vn 0.000000 0.000016 -1.000000 -vn 0.000031 0.000000 -1.000000 -vn 0.000000 -1.000000 -0.000010 -vn 0.000015 -0.000008 1.000000 -vn -0.000001 -1.000000 -0.000002 -vn 0.000000 0.002039 0.999998 -vn -0.000000 -0.000593 1.000000 -vn 0.000015 -0.000592 1.000000 -vn -0.003361 0.000000 0.999994 -vn 0.001130 -0.000000 0.999999 -vn 0.000140 -0.000008 -1.000000 -vn 0.002217 0.000000 -0.999998 -vn -0.000001 -1.000000 -0.000001 -vn -0.000007 -0.000001 1.000000 -vn -0.000002 1.000000 0.000001 -vn 0.000007 -0.000002 1.000000 -vn -0.000022 0.000003 -1.000000 -vn -0.000007 0.000001 -1.000000 -vn -0.000740 -0.000271 -1.000000 -vn -0.000000 -0.000093 -1.000000 -vn 0.002230 0.000001 -0.999998 -vn 0.000003 1.000000 0.000000 -vn -0.005341 -0.000592 0.999986 -vn 0.001126 0.000001 0.999999 -vn 0.000000 -0.499980 0.866037 -vn 0.000000 1.000000 0.000020 -vn 0.000004 0.499928 -0.866067 -vn 0.000000 0.499937 -0.866062 -vn -0.000000 -0.499924 -0.866069 -vn 0.000000 0.500106 0.865964 -vn -0.000004 0.500097 0.865969 -vn 0.000000 -0.500106 0.865964 -vn 0.000009 -1.000000 0.000000 -vn 0.000000 -1.000000 -0.000020 -vn -0.000004 0.499924 -0.866069 -vn 0.000004 -0.499985 -0.866034 -vn -0.000015 -0.000002 1.000000 -vn -1.000000 0.000000 -0.000001 -vn -0.000002 0.000001 -1.000000 -vn 0.000016 -0.000004 -1.000000 -vn -0.000004 0.000000 -1.000000 -vn -0.000002 0.000004 -1.000000 -vn 0.000007 0.000001 -1.000000 -vn 0.000001 0.000003 -1.000000 -vn -0.000017 -0.000002 -1.000000 -vn 1.000000 0.000000 -0.000001 -vn 1.000000 0.000030 -0.000001 -vn 1.000000 -0.000001 0.000002 -vn 1.000000 -0.000000 0.000010 -vn 1.000000 0.000001 -0.000001 -vn 1.000000 0.000025 0.000000 -vn 1.000000 -0.000003 -0.000001 -vn 1.000000 -0.000000 0.000026 -vn -0.000000 -1.000000 -0.000003 -vn -0.000000 -0.000269 -1.000000 -vn -0.000006 1.000000 0.000010 -vn -0.000000 -0.000118 -1.000000 -vn 0.000000 0.000805 1.000000 -vn 0.000000 0.000008 -1.000000 -vn 0.000000 -0.000008 1.000000 -vn -0.000015 -0.000016 1.000000 -vn -0.000001 -1.000000 0.000005 -vn -0.000005 -1.000000 -0.000002 -vn 0.000006 1.000000 -0.000007 -vn -0.000046 -0.000592 1.000000 -vn 0.000000 -0.000586 1.000000 -vn -0.003360 -0.000025 0.999994 -vn 0.001181 -0.000016 0.999999 -vn 0.000209 0.000000 -1.000000 -vn 0.002335 0.000008 -0.999997 -vn 0.000002 -1.000000 -0.000001 -vn 0.000007 -0.000001 1.000000 -vn -0.000015 0.000002 -1.000000 -vn -0.000692 -0.000269 -1.000000 -vn 0.000007 -0.000122 -1.000000 -vn -0.000002 -1.000000 -0.000002 -vn 0.002231 0.000000 -0.999997 -vn 0.000022 0.002027 0.999998 -vn -0.005239 -0.000586 0.999986 -vn 0.001136 -0.000002 0.999999 -vn -0.000001 1.000000 0.000001 -vn 0.000000 0.499993 0.866029 -vn 0.000004 -0.499976 0.866039 -vn 0.000000 -0.499984 0.866034 -vn 0.000013 -1.000000 0.000000 -vn 0.000009 -1.000000 -0.000010 -vn 0.000031 0.499998 -0.866027 -vn 0.000000 0.500058 -0.865992 -vn -0.000000 -0.499971 -0.866042 -vn 0.000007 -0.499984 -0.866034 -vn -0.000062 0.499876 0.866097 -vn -0.000004 0.499989 0.866032 -vn 0.000000 -0.499924 0.866069 -vn -0.000062 -0.500045 0.865999 -vn -0.000013 1.000000 0.000010 -vn -0.000007 0.499998 -0.866027 -vn 0.000000 0.499984 -0.866034 -vn -0.000000 -0.500045 -0.865999 -vn 0.000004 -0.500054 -0.865994 -vn 0.000007 0.000001 1.000000 -vn -1.000000 -0.000000 0.000001 -vn 0.000021 0.000016 -1.000000 -vn -0.000003 0.000001 -1.000000 -vn 0.000117 0.000016 -1.000000 -s off -f 10454//63 10453//63 10455//63 -f 10456//63 10455//63 10453//63 -f 10458//63 10457//63 10456//63 -f 10458//63 10456//63 10453//63 -f 10459//63 10458//63 10453//63 -f 10457//63 10458//63 10460//63 -f 10461//63 10454//63 10462//63 -f 10461//63 10462//63 10463//63 -f 10464//63 10461//63 10463//63 -f 10464//63 10463//63 10449//63 -f 10466//63 10465//63 10467//63 -f 10465//63 10466//63 10468//63 -f 10455//4308 10469//4308 10470//4308 -f 10472//2573 10471//2573 10473//2573 -f 10475//63 10474//63 10459//63 -f 10475//63 10459//63 10453//63 -f 10454//63 10455//63 10470//63 -f 10462//63 10454//63 10470//63 -f 10451//63 10462//63 10470//63 -f 10451//4309 10470//4309 10465//4309 -f 10451//4310 10465//4310 10468//4310 -f 10451//4310 10468//4310 10472//4310 -f 10451//4311 10472//4311 10473//4311 -f 10449//63 10451//63 10473//63 -f 10449//63 10473//63 10457//63 -f 10449//63 10457//63 10460//63 -f 10449//63 10460//63 10476//63 -f 10475//63 10453//63 10464//63 -f 10475//63 10464//63 10449//63 -f 10475//63 10449//63 10477//63 -f 10483//63 10482//63 10484//63 -f 10485//63 10483//63 10484//63 -f 10485//63 10484//63 10486//63 -f 10487//63 10485//63 10486//63 -f 10489//63 10488//63 10490//63 -f 10491//63 10489//63 10490//63 -f 10491//63 10490//63 10492//63 -f 10493//63 10491//63 10492//63 -f 10494//63 10477//63 10495//63 -f 10477//63 10449//63 10495//63 -f 10496//63 10495//63 10449//63 -f 10449//63 10476//63 10496//63 -f 10498//63 10497//63 10499//63 -f 10499//63 10497//63 10500//63 -f 10476//63 10501//63 10496//63 -f 10502//63 10494//63 10495//63 -f 10504//63 10503//63 10505//63 -f 10505//63 10503//63 10506//63 -f 10508//63 10507//63 10509//63 -f 10509//63 10510//63 10508//63 -f 10512//63 10511//63 10513//63 -f 10514//63 10512//63 10513//63 -f 10516//63 10515//63 10517//63 -f 10517//63 10518//63 10516//63 -f 10516//63 10519//63 10520//63 -f 10520//63 10515//63 10516//63 -f 10519//63 10521//63 10522//63 -f 10522//63 10520//63 10519//63 -f 10522//63 10521//63 10518//63 -f 10518//63 10517//63 10522//63 -f 10526//63 10523//63 10524//63 -f 10526//63 10524//63 10525//63 -f 10526//63 10525//63 10527//63 -f 10527//63 10525//63 10528//63 -f 10528//63 10529//63 10527//63 -f 10529//63 10530//63 10527//63 -f 10531//63 10530//63 10529//63 -f 10523//63 10530//63 10531//63 -f 10523//63 10526//63 10532//63 -f 10532//63 10530//63 10523//63 -f 10534//63 10533//63 10535//63 -f 10535//63 10536//63 10534//63 -f 10535//63 10537//63 10536//63 -f 10537//63 10538//63 10536//63 -f 10537//63 10539//63 10538//63 -f 10539//63 10540//63 10538//63 -f 10540//63 10542//63 10538//63 -f 10541//63 10542//63 10540//63 -f 10541//63 10534//63 10542//63 -f 10533//63 10534//63 10541//63 -f 10544//243 10543//243 10463//243 -f 10463//243 10462//243 10544//243 -f 10543//4065 10450//4065 10449//4065 -f 10449//365 10463//365 10543//365 -f 10467//3 10465//3 10512//3 -f 10512//3 10514//3 10467//3 -f 10466//4312 10467//4312 10514//4312 -f 10514//4312 10507//4312 10466//4312 -f 10468//934 10466//934 10507//934 -f 10507//4313 10508//4313 10468//4313 -f 10455//4314 10513//4314 10469//4314 -f 10470//331 10469//331 10513//331 -f 10513//331 10511//331 10470//331 -f 10471//4315 10472//4315 10510//4315 -f 10510//4315 10509//4315 10471//4315 -f 10473//4316 10471//4316 10509//4316 -f 10474//2216 10475//2216 10506//2216 -f 10506//2216 10503//2216 10474//2216 -f 10459//4317 10474//4317 10503//4317 -f 10465//4318 10470//4318 10511//4318 -f 10511//4318 10512//4318 10465//4318 -f 10472//4319 10468//4319 10508//4319 -f 10508//4320 10510//4320 10472//4320 -f 10475//21 10477//21 10505//21 -f 10505//21 10506//21 10475//21 -f 10477//2207 10494//2207 10504//2207 -f 10504//4321 10505//4321 10477//4321 -f 10495//4322 10496//4322 10499//4322 -f 10499//4147 10500//4147 10495//4147 -f 10496//4323 10501//4323 10498//4323 -f 10498//4323 10499//4323 10496//4323 -f 10502//934 10495//934 10500//934 -f 10500//934 10497//934 10502//934 -f 10476//4324 10498//4324 10501//4324 -f 10494//4325 10502//4325 10497//4325 -f 10497//4326 10504//4326 10494//4326 -f 10497//4327 10498//4327 10538//4327 -f 10503//4328 10504//4328 10542//4328 -f 10509//4329 10507//4329 10526//4329 -f 10514//4330 10513//4330 10526//4330 -f 10478//243 10479//243 10517//243 -f 10517//243 10515//243 10478//243 -f 10453//4331 10454//4331 10516//4331 -f 10516//4331 10518//4331 10453//4331 -f 10454//356 10461//356 10519//356 -f 10519//356 10516//356 10454//356 -f 10480//21 10478//21 10515//21 -f 10515//4332 10520//4332 10480//4332 -f 10461//4333 10464//4333 10521//4333 -f 10521//243 10519//243 10461//243 -f 10481//252 10480//252 10520//252 -f 10520//251 10522//251 10481//251 -f 10464//4334 10453//4334 10518//4334 -f 10518//357 10521//357 10464//357 -f 10479//4335 10481//4335 10522//4335 -f 10522//4336 10517//4336 10479//4336 -f 10507//4337 10514//4337 10526//4337 -f 10473//4338 10509//4338 10526//4338 -f 10457//252 10473//252 10526//252 -f 10526//252 10527//252 10457//252 -f 10513//4314 10455//4314 10532//4314 -f 10532//4339 10526//4339 10513//4339 -f 10455//243 10456//243 10530//243 -f 10530//4340 10532//4340 10455//4340 -f 10476//252 10460//252 10536//252 -f 10536//251 10538//251 10476//251 -f 10498//4324 10476//4324 10538//4324 -f 10504//4341 10497//4341 10538//4341 -f 10538//4342 10542//4342 10504//4342 -f 10459//4317 10503//4317 10542//4317 -f 10458//243 10459//243 10542//243 -f 10542//243 10534//243 10458//243 -f 10531//59 10529//59 10482//59 -f 10482//59 10483//59 10531//59 -f 10529//4343 10528//4343 10484//4343 -f 10484//4343 10482//4343 10529//4343 -f 10523//4344 10531//4344 10483//4344 -f 10483//2975 10485//2975 10523//2975 -f 10528//4321 10525//4321 10486//4321 -f 10486//4321 10484//4321 10528//4321 -f 10524//4345 10523//4345 10485//4345 -f 10485//4346 10487//4346 10524//4346 -f 10525//4347 10524//4347 10487//4347 -f 10487//4347 10486//4347 10525//4347 -f 10541//4348 10540//4348 10488//4348 -f 10488//4349 10489//4349 10541//4349 -f 10540//4350 10539//4350 10490//4350 -f 10490//4350 10488//4350 10540//4350 -f 10533//2748 10541//2748 10489//2748 -f 10489//2748 10491//2748 10533//2748 -f 10539//4351 10537//4351 10492//4351 -f 10492//4352 10490//4352 10539//4352 -f 10535//4353 10533//4353 10491//4353 -f 10491//4353 10493//4353 10535//4353 -f 10537//4354 10535//4354 10493//4354 -f 10493//4354 10492//4354 10537//4354 -f 10527//4355 10530//4355 10456//4355 -f 10456//21 10457//21 10527//21 -f 10534//105 10536//105 10460//105 -f 10460//105 10458//105 10534//105 -f 10543//7 10544//7 10452//7 -f 10450//4356 10543//4356 10452//4356 -f 10443//4357 10452//4357 10544//4357 -f 10443//4358 10448//4358 10452//4358 -f 10443//4359 10544//4359 10444//4359 -f 10544//4012 10462//4012 10444//4012 -f 10462//4360 10445//4360 10444//4360 -f 10462//4361 10451//4361 10446//4361 -f 10445//4362 10462//4362 10446//4362 -f 10446//105 10451//105 10447//105 -f 10452//354 10448//354 10451//354 -f 10451//4363 10448//4363 10447//4363 -f 10556//4364 10555//4364 10557//4364 -f 10558//4365 10557//4365 10555//4365 -f 10560//274 10559//274 10558//274 -f 10560//63 10558//63 10555//63 -f 10561//63 10560//63 10555//63 -f 10559//274 10560//274 10562//274 -f 10563//274 10556//274 10564//274 -f 10563//63 10564//63 10565//63 -f 10566//63 10563//63 10565//63 -f 10566//63 10565//63 10551//63 -f 10568//63 10567//63 10569//63 -f 10567//63 10568//63 10570//63 -f 10557//63 10571//63 10572//63 -f 10574//63 10573//63 10575//63 -f 10577//63 10576//63 10561//63 -f 10577//63 10561//63 10555//63 -f 10556//63 10557//63 10572//63 -f 10564//4366 10556//4366 10572//4366 -f 10553//4367 10564//4367 10572//4367 -f 10553//63 10572//63 10567//63 -f 10553//63 10567//63 10570//63 -f 10553//63 10570//63 10574//63 -f 10553//63 10574//63 10575//63 -f 10551//4368 10553//4368 10575//4368 -f 10551//4369 10575//4369 10559//4369 -f 10551//4369 10559//4369 10562//4369 -f 10551//4370 10562//4370 10578//4370 -f 10577//63 10555//63 10566//63 -f 10577//63 10566//63 10551//63 -f 10577//63 10551//63 10579//63 -f 10585//63 10584//63 10586//63 -f 10587//63 10585//63 10586//63 -f 10587//63 10586//63 10588//63 -f 10589//63 10587//63 10588//63 -f 10591//63 10590//63 10592//63 -f 10593//63 10591//63 10592//63 -f 10593//63 10592//63 10594//63 -f 10595//63 10593//63 10594//63 -f 10596//63 10579//63 10597//63 -f 10579//63 10551//63 10597//63 -f 10598//63 10597//63 10551//63 -f 10551//63 10578//63 10598//63 -f 10600//4371 10599//4371 10601//4371 -f 10601//4371 10599//4371 10602//4371 -f 10578//63 10603//63 10598//63 -f 10604//63 10596//63 10597//63 -f 10606//4371 10605//4371 10607//4371 -f 10607//4371 10605//4371 10608//4371 -f 10610//63 10609//63 10611//63 -f 10611//63 10612//63 10610//63 -f 10614//63 10613//63 10615//63 -f 10616//63 10614//63 10615//63 -f 10618//63 10617//63 10619//63 -f 10619//63 10620//63 10618//63 -f 10618//63 10621//63 10622//63 -f 10622//63 10617//63 10618//63 -f 10621//63 10623//63 10624//63 -f 10624//63 10622//63 10621//63 -f 10624//63 10623//63 10620//63 -f 10620//63 10619//63 10624//63 -f 10628//63 10625//63 10626//63 -f 10628//63 10626//63 10627//63 -f 10628//63 10627//63 10629//63 -f 10629//63 10627//63 10630//63 -f 10630//63 10631//63 10629//63 -f 10631//63 10632//63 10629//63 -f 10633//63 10632//63 10631//63 -f 10625//63 10632//63 10633//63 -f 10625//63 10628//63 10634//63 -f 10634//63 10632//63 10625//63 -f 10636//63 10635//63 10637//63 -f 10637//63 10638//63 10636//63 -f 10637//63 10639//63 10638//63 -f 10639//63 10640//63 10638//63 -f 10639//63 10641//63 10640//63 -f 10641//63 10642//63 10640//63 -f 10642//63 10644//63 10640//63 -f 10643//63 10644//63 10642//63 -f 10643//63 10636//63 10644//63 -f 10635//63 10636//63 10643//63 -f 10646//243 10645//243 10565//243 -f 10565//243 10564//243 10646//243 -f 10645//4065 10552//4065 10551//4065 -f 10551//2228 10565//2228 10645//2228 -f 10569//4372 10567//4372 10614//4372 -f 10614//4372 10616//4372 10569//4372 -f 10568//4373 10569//4373 10616//4373 -f 10616//4373 10609//4373 10568//4373 -f 10570//2817 10568//2817 10609//2817 -f 10609//2817 10610//2817 10570//2817 -f 10557//4314 10615//4314 10571//4314 -f 10572//4374 10571//4374 10615//4374 -f 10615//331 10613//331 10572//331 -f 10573//4323 10574//4323 10612//4323 -f 10612//4323 10611//4323 10573//4323 -f 10575//4375 10573//4375 10611//4375 -f 10576//331 10577//331 10608//331 -f 10608//331 10605//331 10576//331 -f 10561//4376 10576//4376 10605//4376 -f 10567//4377 10572//4377 10613//4377 -f 10613//4377 10614//4377 10567//4377 -f 10574//105 10570//105 10610//105 -f 10610//105 10612//105 10574//105 -f 10577//4378 10579//4378 10607//4378 -f 10607//4379 10608//4379 10577//4379 -f 10579//2902 10596//2902 10606//2902 -f 10606//326 10607//326 10579//326 -f 10597//4378 10598//4378 10601//4378 -f 10601//4378 10602//4378 10597//4378 -f 10598//4380 10603//4380 10600//4380 -f 10600//4381 10601//4381 10598//4381 -f 10604//4382 10597//4382 10602//4382 -f 10602//934 10599//934 10604//934 -f 10578//4324 10600//4324 10603//4324 -f 10596//4383 10604//4383 10599//4383 -f 10599//4384 10606//4384 10596//4384 -f 10599//4385 10600//4385 10640//4385 -f 10605//4386 10606//4386 10644//4386 -f 10611//4387 10609//4387 10628//4387 -f 10616//4388 10615//4388 10628//4388 -f 10580//942 10581//942 10619//942 -f 10619//935 10617//935 10580//935 -f 10555//4331 10556//4331 10618//4331 -f 10618//4331 10620//4331 10555//4331 -f 10556//353 10563//353 10621//353 -f 10621//353 10618//353 10556//353 -f 10582//357 10580//357 10617//357 -f 10617//357 10622//357 10582//357 -f 10563//243 10566//243 10623//243 -f 10623//243 10621//243 10563//243 -f 10583//4389 10582//4389 10622//4389 -f 10622//252 10624//252 10583//252 -f 10566//4390 10555//4390 10620//4390 -f 10620//357 10623//357 10566//357 -f 10581//105 10583//105 10624//105 -f 10624//4391 10619//4391 10581//4391 -f 10609//4392 10616//4392 10628//4392 -f 10575//4393 10611//4393 10628//4393 -f 10559//4394 10575//4394 10628//4394 -f 10628//252 10629//252 10559//252 -f 10615//4314 10557//4314 10634//4314 -f 10634//4395 10628//4395 10615//4395 -f 10557//935 10558//935 10632//935 -f 10632//942 10634//942 10557//942 -f 10578//3 10562//3 10638//3 -f 10638//3 10640//3 10578//3 -f 10600//4396 10578//4396 10640//4396 -f 10606//4397 10599//4397 10640//4397 -f 10640//4398 10644//4398 10606//4398 -f 10561//4376 10605//4376 10644//4376 -f 10560//4399 10561//4399 10644//4399 -f 10644//243 10636//243 10560//243 -f 10633//4400 10631//4400 10584//4400 -f 10584//4400 10585//4400 10633//4400 -f 10631//4401 10630//4401 10586//4401 -f 10586//4402 10584//4402 10631//4402 -f 10625//331 10633//331 10585//331 -f 10585//331 10587//331 10625//331 -f 10630//4403 10627//4403 10588//4403 -f 10588//4404 10586//4404 10630//4404 -f 10626//4405 10625//4405 10587//4405 -f 10587//4406 10589//4406 10626//4406 -f 10627//4407 10626//4407 10589//4407 -f 10589//4408 10588//4408 10627//4408 -f 10643//4409 10642//4409 10590//4409 -f 10590//4410 10591//4410 10643//4410 -f 10642//4411 10641//4411 10592//4411 -f 10592//4412 10590//4412 10642//4412 -f 10635//2748 10643//2748 10591//2748 -f 10591//4413 10593//4413 10635//4413 -f 10641//4351 10639//4351 10594//4351 -f 10594//4352 10592//4352 10641//4352 -f 10637//4414 10635//4414 10593//4414 -f 10593//4415 10595//4415 10637//4415 -f 10639//4416 10637//4416 10595//4416 -f 10595//4417 10594//4417 10639//4417 -f 10629//4418 10632//4418 10558//4418 -f 10558//21 10559//21 10629//21 -f 10636//2750 10638//2750 10562//2750 -f 10562//353 10560//353 10636//353 -f 10645//7 10646//7 10554//7 -f 10552//4419 10645//4419 10554//4419 -f 10554//360 10646//360 10545//360 -f 10550//356 10554//356 10545//356 -f 10646//4420 10546//4420 10545//4420 -f 10646//105 10564//105 10546//105 -f 10564//105 10547//105 10546//105 -f 10564//4421 10553//4421 10548//4421 -f 10547//105 10564//105 10548//105 -f 10548//4422 10553//4422 10549//4422 -f 10554//356 10550//356 10553//356 -f 10553//356 10550//356 10549//356 -o diestube -v 0.024503 2.034427 -3.269937 -v 0.029510 2.030835 -3.270235 -v 0.035484 2.029452 -3.270625 -v 0.041514 2.030488 -3.271049 -v 0.046684 2.033785 -3.271441 -v 0.050204 2.038842 -3.271742 -v 0.047210 2.056257 -3.271747 -v 0.042203 2.059849 -3.271449 -v 0.036229 2.061232 -3.271059 -v 0.030199 2.060196 -3.270635 -v 0.025030 2.056899 -3.270242 -v 0.021509 2.051841 -3.269941 -v 0.010635 2.044261 -3.269347 -v 0.012470 2.055936 -3.269375 -v 0.018209 2.064179 -3.269865 -v 0.026635 2.069554 -3.270504 -v 0.036464 2.071243 -3.271195 -v 0.046201 2.068988 -3.271832 -v 0.054364 2.063133 -3.272317 -v 0.059993 2.052969 -3.272829 -v 0.061422 2.044602 -3.272576 -v 0.059244 2.034747 -3.272309 -v 0.053505 2.026505 -3.271819 -v 0.045079 2.021130 -3.271179 -v 0.035249 2.019442 -3.270489 -v 0.025512 2.021696 -3.269852 -v 0.017704 2.029020 -3.280683 -v 0.359737 0.196687 -3.268408 -v 0.361765 0.197644 -3.268652 -v 0.014096 2.055922 -3.286190 -v 0.060747 2.036602 -3.283722 -v 0.361517 0.197001 -3.268580 -v 0.363545 0.197958 -3.268824 -v 0.055538 2.063230 -3.283653 -v 0.024060 2.040180 -3.297788 -v 0.027339 2.034927 -3.297948 -v 0.013432 2.044793 -3.297039 -v 0.023008 2.046296 -3.297789 -v 0.020185 2.028051 -3.297377 -v 0.015306 2.056437 -3.297386 -v 0.024345 2.052341 -3.297954 -v 0.028348 2.022196 -3.297864 -v 0.032346 2.031335 -3.298247 -v 0.021045 2.064679 -3.297877 -v 0.027865 2.057399 -3.298254 -v 0.029471 2.070054 -3.298516 -v 0.033035 2.060696 -3.298646 -v 0.039300 2.071742 -3.299207 -v 0.039065 2.061731 -3.299070 -v 0.049037 2.069487 -3.299844 -v 0.045039 2.060348 -3.299461 -v 0.038085 2.019942 -3.298501 -v 0.038320 2.029952 -3.298637 -v 0.047914 2.021630 -3.299191 -v 0.044350 2.030988 -3.299061 -v 0.056341 2.027005 -3.299831 -v 0.049519 2.034286 -3.299453 -v 0.053040 2.039342 -3.299754 -v 0.054377 2.045388 -3.299918 -v 0.062792 2.053495 -3.300536 -v 0.053325 2.051503 -3.299920 -v 0.057200 2.063633 -3.300329 -v 0.050046 2.056757 -3.299759 -v 0.063729 2.048181 -3.300542 -v 0.063169 2.040174 -3.300454 -v 0.014369 2.039483 -3.297047 -v 0.060930 2.047655 -3.272835 -v 0.011572 2.038950 -3.269356 -v 0.014677 2.031832 -3.269235 -v 0.013540 2.055816 -3.280681 -v 0.018261 2.029126 -3.286191 -v 0.056095 2.063335 -3.289165 -v 0.061304 2.036707 -3.289233 -v 1.023580 2.239589 -3.352769 -v 0.926453 2.222463 -3.345940 -v 0.927320 2.216949 -3.344934 -v -0.094876 2.036708 -3.273077 -v -0.096202 2.045141 -3.274615 -v -0.270318 2.014446 -3.262351 -v 1.024489 2.238942 -3.360386 -v 0.927362 2.221816 -3.353556 -v 0.927877 2.217053 -3.350445 -v -0.094319 2.036813 -3.278589 -v -0.095107 2.044096 -3.283345 -v -0.269222 2.013401 -3.271084 -v 1.025793 2.235528 -3.367112 -v 0.928666 2.218402 -3.360282 -v 0.928750 2.215117 -3.355540 -v 0.057798 2.061544 -3.294318 -v 0.014145 2.053842 -3.291224 -v -0.093446 2.034876 -3.283684 -v -0.093575 2.039901 -3.290934 -v -0.267689 2.009204 -3.278675 -v 1.027293 2.229868 -3.371923 -v 0.930167 2.212742 -3.365093 -v 0.929807 2.211433 -3.359442 -v 0.060381 2.058130 -3.298327 -v 0.013671 2.049892 -3.295016 -v -0.092389 2.031192 -3.287585 -v -0.091840 2.033194 -3.296227 -v -0.265954 2.002495 -3.283968 -v 1.028761 2.222823 -3.374088 -v 0.931635 2.205696 -3.367258 -v 0.930886 2.206564 -3.361557 -v -0.091310 2.026323 -3.289700 -v -0.090166 2.024997 -3.298418 -v -0.264280 1.994295 -3.286160 -v 1.029974 2.215464 -3.373276 -v 0.932847 2.198338 -3.366446 -v 0.931824 2.201250 -3.361564 -v -0.090372 2.021009 -3.289707 -v -0.088807 2.016556 -3.297173 -v -0.262921 1.985852 -3.284913 -v 1.030747 2.208913 -3.369611 -v 0.933620 2.191787 -3.362782 -v 0.932477 2.196300 -3.359461 -v 0.063581 2.043090 -3.298383 -v 0.015830 2.034678 -3.295003 -v -0.089718 2.016060 -3.287604 -v -0.087972 2.009159 -3.292681 -v -0.262085 1.978453 -3.280421 -v 1.030962 2.204168 -3.363652 -v 0.933835 2.187041 -3.356822 -v 0.932747 2.192468 -3.355569 -v 0.062301 2.038986 -3.294382 -v 0.017593 2.031111 -3.291219 -v -0.089449 2.012228 -3.283711 -v -0.087786 2.003929 -3.285628 -v -0.261899 1.973222 -3.273364 -v 1.030586 2.201950 -3.356304 -v 0.933459 2.184823 -3.349474 -v 0.932591 2.190338 -3.350479 -v 0.587018 2.129404 -3.326179 -v 0.530405 2.119422 -3.322198 -v -0.089605 2.010098 -3.278622 -v -0.088278 2.001664 -3.277085 -v -0.262392 1.970957 -3.264819 -v 1.029678 2.202596 -3.348688 -v 0.932550 2.185470 -3.341858 -v 0.932034 2.190233 -3.344968 -v 0.586462 2.129299 -3.320668 -v 0.529847 2.119317 -3.316688 -v -0.090162 2.009993 -3.273111 -v -0.089374 2.002709 -3.268355 -v -0.263488 1.972003 -3.256087 -v 1.028373 2.206010 -3.341962 -v 0.931246 2.188884 -3.335132 -v 0.931161 2.192170 -3.339874 -v 0.060715 2.038687 -3.278687 -v 0.016008 2.030809 -3.275533 -v -0.091035 2.011930 -3.268017 -v -0.090906 2.006905 -3.260766 -v -0.265020 1.976200 -3.248495 -v 1.026873 2.211670 -3.337150 -v 0.929746 2.194544 -3.330320 -v 0.930104 2.195853 -3.335972 -v 0.061207 2.042644 -3.274894 -v 0.013459 2.034226 -3.271528 -v -0.092091 2.015613 -3.264115 -v -0.092641 2.013611 -3.255473 -v -0.266755 1.982909 -3.243201 -v 1.025404 2.218716 -3.334985 -v 0.928277 2.201590 -3.328156 -v 0.929025 2.200722 -3.333857 -v -0.093171 2.020482 -3.261999 -v -0.094315 2.021809 -3.253282 -v -0.268430 1.991109 -3.241011 -v 1.024191 2.226074 -3.335798 -v 0.927064 2.208948 -3.328967 -v 0.928087 2.206036 -3.333850 -v -0.094109 2.025797 -3.261993 -v -0.095673 2.030249 -3.254528 -v -0.269789 1.999551 -3.242257 -v 1.023419 2.232625 -3.339462 -v 0.926292 2.215499 -3.332633 -v 0.927434 2.210986 -3.335953 -v 0.058008 2.057683 -3.274838 -v 0.011300 2.049440 -3.271541 -v -0.094762 2.030746 -3.264096 -v -0.096509 2.037647 -3.259019 -v -0.270624 2.006951 -3.246750 -v 1.023204 2.237371 -3.345422 -v 0.926077 2.220245 -3.338592 -v 0.927165 2.214818 -3.339845 -v 0.056212 2.061246 -3.278622 -v 0.012561 2.053540 -3.275538 -v -0.095031 2.034578 -3.267988 -v -0.096695 2.042876 -3.266072 -v -0.270810 2.012181 -3.253806 -v 0.545799 2.103575 -3.323039 -v 0.577967 2.109243 -3.325300 -v 0.577266 2.110056 -3.319956 -v 0.545099 2.104385 -3.317694 -v 0.532864 2.113647 -3.322221 -v 0.532163 2.114460 -3.316877 -v 0.561972 2.102748 -3.318830 -v 0.562673 2.101935 -3.324175 -v 0.582449 2.116489 -3.320359 -v 0.583150 2.115676 -3.325703 -v 0.537408 2.109182 -3.317200 -v 0.538110 2.108369 -3.322544 -v 0.055538 2.063230 -3.283653 -v 0.056095 2.063335 -3.289165 -v 0.056095 2.063335 -3.289165 -v 0.060747 2.036602 -3.283722 -v 0.060747 2.036602 -3.283722 -v 0.060747 2.036602 -3.283722 -v 0.060930 2.047655 -3.272835 -v 0.059993 2.052969 -3.272829 -v 0.059993 2.052969 -3.272829 -v 0.055538 2.063230 -3.283653 -v 0.055538 2.063230 -3.283653 -v 0.060715 2.038687 -3.278687 -v 0.060715 2.038687 -3.278687 -v 0.061207 2.042644 -3.274894 -v 0.061207 2.042644 -3.274894 -v 0.061207 2.042644 -3.274894 -v 0.058008 2.057683 -3.274838 -v 0.058008 2.057683 -3.274838 -v 0.056212 2.061246 -3.278622 -v 0.056212 2.061246 -3.278622 -v 0.060930 2.047655 -3.272835 -v 0.059993 2.052969 -3.272829 -v 0.059993 2.052969 -3.272829 -vt 0.959908 0.501828 -vt 0.959856 0.496848 -vt 0.960169 0.507154 -vt 0.959907 0.507185 -vt 0.959854 0.512202 -vt 0.960036 0.516684 -vt 0.959883 0.485857 -vt 0.960038 0.492221 -vt 0.959757 0.492935 -vt 0.959879 0.523155 -vt 0.959754 0.516186 -vt 0.959665 0.527142 -vt 0.959620 0.518541 -vt 0.959421 0.527886 -vt 0.959471 0.518843 -vt 0.959183 0.524998 -vt 0.959328 0.516943 -vt 0.959670 0.482023 -vt 0.959623 0.490679 -vt 0.959427 0.481462 -vt 0.959474 0.490490 -vt 0.959188 0.484540 -vt 0.959331 0.492503 -vt 0.958943 0.495480 -vt 0.959218 0.496496 -vt 0.958922 0.503019 -vt 0.959155 0.501869 -vt 0.958927 0.508260 -vt 0.959154 0.507720 -vt 0.958993 0.518667 -vt 0.959216 0.513042 -vt 0.978153 0.523140 -vt 0.967196 0.516447 -vt 0.970723 0.516438 -vt 0.978711 0.481476 -vt 0.979005 0.484553 -vt 0.979242 0.491039 -vt 0.971037 0.492509 -vt 0.978184 0.512193 -vt 0.978148 0.485867 -vt 0.967172 0.493406 -vt 0.978307 0.516175 -vt 0.978417 0.527122 -vt 0.978472 0.518527 -vt 0.978718 0.527865 -vt 0.978657 0.518829 -vt 0.979011 0.524978 -vt 0.978833 0.516930 -vt 0.978410 0.482036 -vt 0.978304 0.492941 -vt 0.978468 0.490686 -vt 0.978653 0.490497 -vt 0.978829 0.492508 -vt 0.967041 0.492514 -vt 0.978969 0.496499 -vt 0.978971 0.513031 -vt 0.967067 0.518599 -vt 0.979375 0.499984 -vt 0.979188 0.502985 -vt 0.979193 0.508222 -vt 0.979246 0.518651 -vt 0.977960 0.516673 -vt 0.978182 0.496850 -vt 0.977705 0.507116 -vt 0.977700 0.502584 -vt 0.977906 0.496219 -vt 0.960164 0.502618 -vt 0.970693 0.493400 -vt 0.971057 0.518590 -vt 0.466722 0.513991 -vt 0.466923 0.511895 -vt 0.469942 0.513545 -vt 0.469659 0.511516 -vt 0.466298 0.510861 -vt 0.468627 0.510866 -vt -0.028943 0.518590 -vt -0.032933 0.518599 -vt 0.969342 0.518252 -vt 0.970100 0.512672 -vt 0.965037 0.517453 -vt 0.967383 0.512677 -vt 0.969003 0.513341 -vt 0.965858 0.512757 -vt 0.472075 0.509802 -vt 0.472783 0.511529 -vt 0.470780 0.509709 -vt 0.963368 0.516661 -vt 0.964870 0.511327 -vt 0.963945 0.514664 -vt 0.961298 0.514569 -vt 0.963125 0.510651 -vt 0.473802 0.507018 -vt 0.474814 0.508253 -vt 0.472428 0.507569 -vt 0.960504 0.513048 -vt 0.962947 0.508830 -vt 0.961484 0.511384 -vt 0.958694 0.510046 -vt 0.474578 0.503586 -vt 0.475727 0.504218 -vt 0.473322 0.504772 -vt 0.961906 0.505567 -vt 0.957618 0.504576 -vt 0.961220 0.507345 -vt 0.960433 0.503345 -vt 0.474287 0.500030 -vt 0.473324 0.501744 -vt 0.475385 0.500035 -vt 0.958230 0.498987 -vt 0.961902 0.502035 -vt 0.472972 0.496888 -vt 0.473838 0.496339 -vt 0.472436 0.498944 -vt 0.960477 0.498177 -vt 0.960438 0.494123 -vt 0.962938 0.498769 -vt 0.960881 0.499258 -vt 0.962497 0.495702 -vt 0.470832 0.494639 -vt 0.471321 0.493693 -vt 0.470792 0.496799 -vt 0.963340 0.494496 -vt 0.961479 0.498420 -vt 0.964857 0.496266 -vt 0.963930 0.495177 -vt 0.963912 0.490726 -vt 0.468193 0.493627 -vt 0.468217 0.492503 -vt 0.468641 0.495636 -vt 0.469626 0.488280 -vt 0.470224 0.483813 -vt 0.967366 0.494908 -vt 0.968124 0.489319 -vt 0.965037 0.493221 -vt 0.968114 0.492194 -vt 0.465457 0.494007 -vt 0.464998 0.492950 -vt 0.466312 0.495632 -vt 0.463369 0.488275 -vt -0.028963 0.492509 -vt 0.461580 0.483811 -vt 0.972429 0.490120 -vt 0.970084 0.494904 -vt 0.971260 0.492779 -vt 0.463042 0.495721 -vt 0.462157 0.494967 -vt 0.464160 0.496789 -vt -0.025255 0.494481 -vt 0.972595 0.496254 -vt 0.973933 0.495160 -vt 0.976166 0.493005 -vt 0.461315 0.498505 -vt 0.460128 0.498242 -vt 0.462512 0.498929 -vt -0.022379 0.498151 -vt 0.974517 0.498750 -vt 0.976382 0.498393 -vt 0.978767 0.497526 -vt 0.973992 0.494886 -vt 0.975895 0.498191 -vt 0.460539 0.501935 -vt 0.459215 0.502276 -vt 0.461619 0.501725 -vt 0.979842 0.502993 -vt 0.975559 0.502012 -vt 0.976682 0.502189 -vt 0.460830 0.505491 -vt 0.459557 0.506457 -vt 0.461616 0.504752 -vt -0.020812 0.502985 -vt -0.020807 0.508222 -vt 0.979231 0.508579 -vt 0.975562 0.505544 -vt 0.976235 0.506276 -vt 0.462145 0.508632 -vt 0.461103 0.510152 -vt 0.462504 0.507552 -vt 0.977025 0.513442 -vt 0.974620 0.509831 -vt 0.464284 0.510882 -vt 0.463618 0.512799 -vt 0.464147 0.509697 -vt -0.022381 0.513012 -vt -0.025244 0.516635 -vt 0.972081 0.512313 -vt 0.973553 0.516841 -vt 0.972609 0.511313 -vt 0.973963 0.514640 -vt 0.470085 0.471402 -vt 0.461782 0.473312 -vt 0.470074 0.460042 -vt 0.463365 0.469478 -vt 0.462819 0.448533 -vt 0.462286 0.451993 -vt 0.469858 0.446937 -vt 0.469618 0.468045 -vt 0.461996 0.461892 -vt 0.463249 0.459907 -vt 0.469701 0.458435 -vt 0.470032 0.450237 -vt 0.976408 0.511350 -vt 0.974745 0.494481 -vt 0.977621 0.498151 -vt 0.977619 0.513012 -vt 0.974756 0.516635 -vt 0.974527 0.508809 -vn -0.078240 -0.018390 -0.996765 -vn -0.076053 -0.013311 -0.997015 -vn -0.068103 -0.012087 -0.997605 -vn -0.068090 -0.011973 -0.997607 -vn -0.068053 -0.011970 -0.997610 -vn -0.068053 -0.011977 -0.997610 -vn -0.068008 -0.011965 -0.997613 -vn -0.068050 -0.012004 -0.997610 -vn -0.068022 -0.012007 -0.997612 -vn -0.068036 -0.012013 -0.997610 -vn -0.067986 -0.012042 -0.997614 -vn -0.068062 -0.012040 -0.997608 -vn -0.068083 -0.012012 -0.997607 -vn -0.067977 -0.012004 -0.997615 -vn -0.067958 -0.011994 -0.997616 -vn -0.068064 -0.011992 -0.997609 -vn -0.068033 -0.011955 -0.997611 -vn -0.068046 -0.011960 -0.997610 -vn -0.068053 -0.011980 -0.997610 -vn -0.068028 -0.011957 -0.997612 -vn -0.067975 -0.012079 -0.997614 -vn -0.068462 -0.006172 -0.997635 -vn -0.062694 -0.013176 -0.997946 -vn -0.063610 -0.010102 -0.997924 -vn -0.062664 -0.011088 -0.997973 -vn -0.068013 -0.011981 -0.997612 -vn -0.067974 -0.012021 -0.997615 -vn -0.068049 -0.012027 -0.997609 -vn -0.827691 0.556427 -0.072913 -vn 0.539483 -0.841064 0.039608 -vn 0.820493 -0.566983 0.072950 -vn 0.881293 -0.470916 0.039512 -vn 0.985351 0.169444 0.019290 -vn 0.972570 -0.212479 0.094658 -vn -0.666034 -0.744680 -0.043021 -vn -0.584152 -0.808305 -0.073555 -vn -0.826801 0.557639 -0.073750 -vn 0.820543 -0.566911 0.072943 -vn 0.820559 -0.566888 0.072938 -vn -0.539480 0.841067 -0.039593 -vn -0.539524 0.841038 -0.039617 -vn 0.539493 -0.841059 0.039596 -vn 0.539442 -0.841091 0.039603 -vn -0.169316 0.985562 0.000441 -vn -0.169265 0.985570 0.000464 -vn 0.169280 -0.985568 -0.000458 -vn 0.169210 -0.985580 -0.000450 -vn 0.227939 0.972836 0.040426 -vn 0.227953 0.972832 0.040432 -vn -0.227823 -0.972863 -0.040424 -vn -0.227897 -0.972846 -0.040414 -vn -0.227892 -0.972847 -0.040425 -vn -0.227873 -0.972851 -0.040430 -vn 0.227869 0.972852 0.040430 -vn 0.227886 0.972848 0.040435 -vn 0.169264 -0.985571 -0.000457 -vn 0.169267 -0.985570 -0.000458 -vn -0.169248 0.985573 0.000463 -vn -0.169270 0.985570 0.000457 -vn 0.539449 -0.841087 0.039589 -vn -0.539497 0.841056 -0.039597 -vn -0.539521 0.841040 -0.039606 -vn 0.887861 -0.460080 0.005368 -vn -0.820512 0.566957 -0.072940 -vn -0.972582 0.212421 -0.094666 -vn -0.969036 -0.166647 -0.182204 -vn -0.969021 -0.166705 -0.182228 -vn -0.845804 -0.524967 -0.094994 -vn 0.596911 0.798271 0.080383 -vn 0.584089 0.808352 0.073541 -vn -0.584202 -0.808269 -0.073544 -vn -0.584102 -0.808340 -0.073562 -vn 0.067993 0.011987 0.997614 -vn 0.067987 0.012071 0.997613 -vn 0.028347 0.088945 0.995633 -vn 0.088252 0.015432 0.995979 -vn 0.083304 -0.003980 0.996516 -vn 0.068010 0.012022 0.997612 -vn 0.068054 0.012025 0.997609 -vn 0.067998 0.011991 0.997613 -vn 0.067930 0.012080 0.997617 -vn 0.068064 0.011993 0.997609 -vn 0.068070 0.011990 0.997608 -vn 0.068020 0.012010 0.997612 -vn 0.068086 0.012001 0.997607 -vn 0.067993 0.011984 0.997614 -vn 0.067986 0.012071 0.997613 -vn 0.048531 0.008603 0.998785 -vn 0.059826 0.043032 0.997281 -vn 0.068026 0.012011 0.997611 -vn 0.068029 0.012058 0.997611 -vn 0.068045 0.011992 0.997610 -vn 0.068034 0.012007 0.997611 -vn 0.067990 0.011996 0.997614 -vn 0.067994 0.011994 0.997614 -vn 0.068045 0.012016 0.997610 -vn 0.068054 0.012044 0.997609 -vn -0.062074 -0.013890 -0.997975 -vn -0.073323 -0.011416 -0.997243 -vn -0.075373 -0.017634 -0.997000 -vn -0.072067 -0.007816 -0.997369 -vn 0.089476 0.014576 0.995882 -vn 0.067980 0.012056 0.997614 -vn 0.059382 -0.007006 0.998211 -vn 0.047193 0.006712 0.998863 -vn -0.820112 0.566058 -0.083632 -vn -0.820790 0.567793 -0.062568 -vn -0.622482 -0.778753 -0.077843 -vn -0.683187 -0.730243 -0.001283 -vn 0.590372 0.803649 0.074897 -vn 0.584151 0.808837 0.067457 -vn 0.851444 -0.518873 0.076250 -vn -0.179823 0.978129 -0.104535 -vn -0.179823 0.978127 -0.104555 -vn -0.979646 -0.172731 -0.102258 -vn -0.979647 -0.172721 -0.102271 -vn -0.173568 0.984821 0.001169 -vn -0.173574 0.984820 0.001079 -vn 0.979643 0.172749 0.102265 -vn 0.979653 0.172709 0.102236 -vn -0.181429 0.973490 -0.139284 -vn -0.181429 0.973489 -0.139291 -vn 0.979601 0.173029 0.102192 -vn -0.185145 0.861349 -0.473073 -vn -0.185145 0.861349 -0.473075 -vn -0.979653 -0.172702 -0.102242 -vn -0.979651 -0.172690 -0.102282 -vn -0.186472 0.907290 -0.376899 -vn -0.186473 0.907325 -0.376815 -vn -0.186344 0.907329 -0.376868 -vn -0.186351 0.907375 -0.376755 -vn 0.979654 0.172704 0.102228 -vn 0.979629 0.172829 0.102258 -vn -0.184259 0.843929 -0.503818 -vn -0.184266 0.843972 -0.503744 -vn 0.979660 0.172620 0.102317 -vn -0.162543 0.613707 -0.772621 -vn -0.162542 0.613700 -0.772627 -vn -0.979649 -0.172698 -0.102288 -vn -0.979643 -0.172703 -0.102343 -vn -0.171396 0.692786 -0.700479 -vn -0.171401 0.692833 -0.700432 -vn -0.171213 0.692773 -0.700537 -vn -0.171245 0.692955 -0.700349 -vn 0.979631 0.172822 0.102252 -vn 0.979648 0.172715 0.102269 -vn 0.979647 0.172731 0.102259 -vn -0.114790 0.269734 -0.956068 -vn -0.114800 0.269775 -0.956056 -vn -0.979640 -0.172716 -0.102346 -vn -0.979650 -0.172688 -0.102293 -vn -0.130017 0.370768 -0.919579 -vn -0.130000 0.370658 -0.919626 -vn -0.129793 0.370705 -0.919637 -vn -0.129835 0.370910 -0.919548 -vn 0.979650 0.172708 0.102267 -vn 0.979646 0.172740 0.102248 -vn -0.109542 0.235686 -0.965636 -vn -0.109544 0.235694 -0.965634 -vn 0.979644 0.172754 0.102239 -vn -0.979650 -0.172691 -0.102293 -vn -0.979646 -0.172707 -0.102305 -vn -0.068201 -0.010912 -0.997612 -vn -0.068233 -0.010739 -0.997612 -vn 0.979649 0.172723 0.102251 -vn 0.979647 0.172767 0.102193 -vn 0.979644 0.172757 0.102236 -vn 0.024229 -0.485857 -0.873702 -vn 0.024248 -0.485917 -0.873668 -vn -0.979637 -0.172787 -0.102256 -vn -0.979647 -0.172738 -0.102242 -vn 0.004164 -0.390597 -0.920552 -vn 0.979650 0.172738 0.102210 -vn 0.979651 0.172744 0.102189 -vn 0.030765 -0.516200 -0.855915 -vn 0.030760 -0.516182 -0.855926 -vn 0.979644 0.172728 0.102288 -vn 0.093289 -0.777221 -0.622273 -vn 0.093294 -0.777233 -0.622258 -vn -0.979647 -0.172729 -0.102255 -vn -0.979631 -0.172825 -0.102244 -vn 0.075481 -0.708002 -0.702165 -vn 0.075470 -0.707956 -0.702212 -vn 0.075672 -0.708012 -0.702134 -vn 0.075604 -0.707801 -0.702354 -vn 0.979653 0.172683 0.102273 -vn 0.979641 0.172696 0.102367 -vn 0.979645 0.172736 0.102263 -vn 0.147707 -0.948890 -0.278909 -vn 0.147706 -0.948889 -0.278915 -vn -0.979627 -0.172809 -0.102312 -vn -0.979629 -0.172795 -0.102320 -vn 0.134778 -0.915517 -0.379030 -vn 0.134769 -0.915494 -0.379088 -vn 0.134774 -0.915480 -0.379120 -vn 0.134961 -0.915982 -0.377840 -vn 0.134905 -0.915459 -0.379124 -vn 0.134861 -0.915371 -0.379352 -vn 0.979649 0.172726 0.102242 -vn 0.979670 0.172667 0.102143 -vn 0.151627 -0.957589 -0.245016 -vn 0.151608 -0.957562 -0.245133 -vn -0.979653 -0.172722 -0.102209 -vn 0.979654 0.172748 0.102153 -vn 0.179829 -0.978122 0.104587 -vn 0.179812 -0.978140 0.104453 -vn -0.979644 -0.172776 -0.102204 -vn -0.979644 -0.172789 -0.102188 -vn 0.173565 -0.984822 -0.001221 -vn 0.173561 -0.984822 -0.001266 -vn 0.173573 -0.984820 -0.001113 -vn 0.173560 -0.984822 -0.001267 -vn 0.979657 0.172682 0.102239 -vn 0.979612 0.172861 0.102368 -vn 0.181499 -0.973472 0.139322 -vn 0.181496 -0.973476 0.139294 -vn 0.979638 0.172761 0.102289 -vn 0.185141 -0.861367 0.473043 -vn 0.185146 -0.861325 0.473117 -vn -0.979638 -0.172805 -0.102215 -vn -0.979635 -0.172787 -0.102276 -vn 0.186482 -0.907306 0.376856 -vn 0.186465 -0.907289 0.376904 -vn 0.186497 -0.907271 0.376932 -vn 0.186485 -0.907374 0.376691 -vn 0.979645 0.172764 0.102214 -vn 0.979652 0.172730 0.102206 -vn 0.979643 0.172750 0.102255 -vn 0.162544 -0.613700 0.772627 -vn 0.162545 -0.613745 0.772591 -vn -0.979628 -0.172816 -0.102296 -vn -0.979652 -0.172796 -0.102096 -vn 0.171397 -0.692801 0.700464 -vn 0.171403 -0.692854 0.700410 -vn 0.171386 -0.692910 0.700359 -vn 0.171389 -0.693004 0.700265 -vn 0.979630 0.172818 0.102267 -vn 0.979662 0.172620 0.102298 -vn 0.159305 -0.585774 0.794664 -vn 0.159312 -0.585889 0.794578 -vn -0.979645 -0.172745 -0.102249 -vn 0.979635 0.172772 0.102294 -vn 0.114800 -0.269812 0.956045 -vn 0.114795 -0.269753 0.956063 -vn -0.979665 -0.172729 -0.102081 -vn -0.979643 -0.172790 -0.102192 -vn 0.979647 0.172695 0.102314 -vn 0.979639 0.172768 0.102270 -vn 0.109602 -0.235598 0.965651 -vn 0.109610 -0.235679 0.965630 -vn -0.979641 -0.172759 -0.102260 -vn 0.979651 0.172722 0.102234 -vn 0.049027 0.117511 0.991861 -vn 0.049025 0.117539 0.991857 -vn -0.979644 -0.172786 -0.102193 -vn -0.979644 -0.172784 -0.102191 -vn 0.068218 0.010823 0.997612 -vn 0.068223 0.010789 0.997612 -vn 0.979643 0.172738 0.102275 -vn 0.979645 0.172694 0.102334 -vn 0.042682 0.152589 0.987368 -vn 0.042681 0.152598 0.987366 -vn -0.979625 -0.172832 -0.102295 -vn 0.979627 0.172811 0.102306 -vn -0.024249 0.485954 0.873648 -vn -0.024240 0.485882 0.873688 -vn -0.979647 -0.172760 -0.102206 -vn -0.979672 -0.172636 -0.102172 -vn 0.979640 0.172739 0.102306 -vn -0.979668 -0.172621 -0.102241 -vn 0.979664 0.172650 0.102222 -vn -0.093289 0.777226 0.622268 -vn -0.093285 0.777199 0.622301 -vn -0.979674 -0.172595 -0.102228 -vn -0.979635 -0.172828 -0.102201 -vn -0.075471 0.707959 0.702209 -vn -0.075472 0.707963 0.702206 -vn -0.098841 0.798175 0.594261 -vn -0.098830 0.798113 0.594347 -vn -0.147705 0.948891 0.278908 -vn -0.147705 0.948888 0.278917 -vn -0.979631 -0.172811 -0.102273 -vn -0.979639 -0.172740 -0.102312 -vn -0.134766 0.915458 0.379177 -vn -0.134768 0.915463 0.379164 -vn -0.134756 0.915510 0.379054 -vn -0.134736 0.915417 0.379286 -vn 0.979638 0.172770 0.102273 -vn 0.979647 0.172744 0.102230 -vn -0.151551 0.957591 0.245056 -vn -0.151547 0.957573 0.245129 -vn -0.915536 -0.389580 -0.100107 -vn -0.902135 -0.428151 -0.053282 -vn -0.708810 -0.705256 0.014251 -vn 0.069746 0.002235 0.997562 -vn 0.069313 -0.005833 0.997578 -vn 0.067781 0.006098 0.997682 -vn 0.068735 0.008540 0.997598 -vn -0.065885 -0.024151 -0.997535 -vn -0.069705 -0.011018 -0.997507 -vn 0.950999 -0.295683 0.090397 -vn -0.063213 -0.016797 -0.997859 -vn -0.067913 -0.006430 -0.997671 -vn 0.068153 0.006578 0.997653 -vn 0.070824 0.005413 0.997474 -vn -0.070707 -0.005587 -0.997481 -vn -0.067686 -0.005560 -0.997691 -vn 0.950873 -0.262205 0.164587 -vn 0.769858 -0.608181 0.193482 -vn 0.769890 -0.608106 0.193588 -vn 0.434629 -0.880126 0.190986 -vn 0.434598 -0.880167 0.190869 -vn 0.186471 -0.907074 0.377419 -vn 0.186478 -0.906689 0.378339 -vn -0.086355 -0.986553 0.138765 -vn -0.086622 -0.986627 0.138070 -vn -0.525529 -0.848679 0.059692 -vn -0.525276 -0.848801 0.060173 -vn -0.708818 -0.705248 0.014234 -vn -0.985613 0.155016 0.067359 -vn -0.973741 0.206965 -0.094840 -vn -0.974057 0.205697 -0.094352 -vn -0.914757 -0.397818 0.070435 -vn -0.847874 -0.521711 -0.094488 -vn -0.839727 -0.535408 -0.090541 -vn -0.845666 -0.525187 -0.095017 -vn -0.847347 -0.522052 -0.097283 -vn -0.830773 -0.411852 -0.374425 -vn -0.973330 0.208554 -0.095572 -vn -0.955667 0.146187 -0.255596 -vn 0.846329 0.523620 0.097722 -vn 0.845664 0.524616 0.098135 -vn 0.873515 0.483042 -0.060349 -vn 0.974621 -0.200240 0.100089 -vn 0.973280 -0.207424 0.098491 -vn 0.992677 -0.070527 -0.098072 -vn 0.972853 -0.211595 0.093727 -vn 0.972922 -0.211145 0.094021 -vn 0.973017 -0.212586 0.089693 -vn 0.968591 0.138406 -0.206579 -vn 0.854661 0.461348 0.238144 -vn 0.846815 0.523983 0.091358 -vn 0.848014 0.521867 0.092343 -vn -0.049027 -0.117510 -0.991861 -vn -0.049029 -0.117503 -0.991861 -vn 0.004146 -0.390513 -0.920588 -vn 0.130003 -0.370670 0.919621 -vn 0.129997 -0.370636 0.919635 -vn -0.004153 0.390544 0.920575 -vn -0.004157 0.390564 0.920566 -vn 0.979638 0.172778 0.102256 -vn 0.979639 0.172774 0.102258 -vn 0.979640 0.172738 0.102312 -vn -0.030677 0.516151 0.855948 -vn -0.030706 0.516256 0.855884 -vn 0.184333 -0.843939 0.503775 -vn 0.184333 -0.843954 0.503748 -vn 0.129972 -0.370803 0.919572 -vn 0.129949 -0.370689 0.919621 -vn 0.068123 0.010898 0.997617 -vn -0.004191 0.390419 0.920628 -vn -0.004214 0.390569 0.920564 -vn -0.075485 0.707934 0.702233 -vn -0.075462 0.707805 0.702366 -vn -0.173473 0.984838 0.001442 -vn -0.173499 0.984833 0.001220 -vn -0.159232 0.585806 -0.794655 -vn -0.159246 0.585880 -0.794598 -vn -0.042617 -0.152534 -0.987379 -vn -0.042603 -0.152637 -0.987364 -vn -0.979650 -0.172611 -0.102428 -vn -0.979655 -0.172782 -0.102090 -vn -0.979646 -0.172735 -0.102258 -vn -0.979642 -0.172733 -0.102294 -vn -0.979644 -0.172740 -0.102263 -vn -0.979656 -0.172708 -0.102208 -vn -0.979630 -0.172829 -0.102253 -vn -0.979639 -0.172774 -0.102260 -vn -0.979632 -0.172821 -0.102244 -vn 0.098904 -0.798124 -0.594320 -vn 0.098910 -0.798158 -0.594274 -vn -0.068050 -0.010485 -0.997627 -vn 0.004317 -0.390334 -0.920663 -vn 0.004370 -0.390535 -0.920577 -vn -0.068028 -0.010664 -0.997626 -vn 0.173617 -0.984812 -0.001391 -vn 0.173647 -0.984807 -0.001139 -vn 0.068232 0.010426 0.997615 -vn 0.985357 0.169410 0.019305 -vn 0.845779 0.525010 0.094984 -vn 0.584171 0.808291 0.073559 -vn 0.584134 0.808317 0.073566 -s off -f 10681/3811/4423 10682/3812/4423 10683/3813/4423 -f 10684/3814/4424 10681/3811/4424 10683/3813/4424 -f 10687/3815/4425 10684/3814/4425 10686/3816/4425 -f 10688/3817/4426 10685/3818/4426 10682/3812/4426 -f 10688/3817/4427 10682/3812/4427 10689/3819/4427 -f 10687/3815/4428 10686/3816/4428 10690/3820/4428 -f 10691/3821/4429 10687/3815/4429 10690/3820/4429 -f 10691/3821/4430 10690/3820/4430 10692/3822/4430 -f 10693/3823/4431 10691/3821/4431 10692/3822/4431 -f 10693/3823/4432 10692/3822/4432 10694/3824/4432 -f 10695/3825/4433 10693/3823/4433 10694/3824/4433 -f 10695/3825/4434 10694/3824/4434 10696/3826/4434 -f 10697/3827/4435 10695/3825/4435 10696/3826/4435 -f 10698/3828/4436 10688/3817/4436 10689/3819/4436 -f 10698/3828/4437 10689/3819/4437 10699/3829/4437 -f 10700/3830/4438 10698/3828/4438 10699/3829/4438 -f 10700/3830/4439 10699/3829/4439 10701/3831/4439 -f 10702/3832/4440 10700/3830/4440 10701/3831/4440 -f 10702/3832/4441 10701/3831/4441 10703/3833/4441 -f 10711/3834/4442 10702/3832/4442 10703/3833/4442 -f 10711/3834/4443 10703/3833/4443 10704/3835/4443 -f 10710/3836/4444 10711/3834/4444 10704/3835/4444 -f 10710/3836/4445 10704/3835/4445 10705/3837/4445 -f 10706/3838/4446 10710/3836/4446 10705/3837/4446 -f 10706/3838/4447 10705/3837/4447 10707/3839/4447 -f 10708/3840/4448 10707/3839/4448 10709/3841/4448 -f 10696/3826/4449 10708/3840/4449 10709/3841/4449 -f 10697/3827/4450 10696/3826/4450 10709/3841/4450 -f 10661/3842/4451 10676/3843/4451 10716/3844/4451 -f 10670/3845/4452 10702/3832/4452 10669/3846/4452 -f 10668/3847/4453 10669/3846/4453 10702/3832/4453 -f 10702/3832/4454 10677/3848/4454 10668/3847/4454 -f 10681/3811/4455 10684/3814/4455 10658/3849/4455 -f 10684/3814/4456 10687/3815/4456 10658/3849/4456 -f 10672/3850/4457 10717/3851/4457 10685/3818/4457 -f 10685/3818/4458 10688/3817/4458 10672/3850/4458 -f 10676/3843/4459 10661/3842/4459 10690/3820/4459 -f 10657/3852/4460 10658/3849/4460 10687/3815/4460 -f 10687/3815/4461 10691/3821/4461 10657/3852/4461 -f 10661/3842/4462 10662/3853/4462 10692/3822/4462 -f 10692/3822/4463 10690/3820/4463 10661/3842/4463 -f 10656/3854/4464 10657/3852/4464 10691/3821/4464 -f 10691/3821/4465 10693/3823/4465 10656/3854/4465 -f 10662/3853/4466 10663/3855/4466 10694/3824/4466 -f 10694/3824/4467 10692/3822/4467 10662/3853/4467 -f 10655/3856/4468 10656/3854/4468 10693/3823/4468 -f 10693/3823/4469 10695/3825/4469 10655/3856/4469 -f 10663/3855/4470 10664/3857/4470 10696/3826/4470 -f 10696/3826/4471 10694/3824/4471 10663/3855/4471 -f 10654/3858/4472 10655/3856/4472 10695/3825/4472 -f 10695/3825/4473 10697/3827/4473 10654/3858/4473 -f 10671/3859/4474 10672/3850/4474 10688/3817/4474 -f 10688/3817/4475 10698/3828/4475 10671/3859/4475 -f 10648/3860/4476 10649/3861/4476 10699/3829/4476 -f 10699/3829/4477 10689/3819/4477 10648/3860/4477 -f 10670/3845/4478 10671/3859/4478 10698/3828/4478 -f 10698/3828/4479 10700/3830/4479 10670/3845/4479 -f 10649/3861/4480 10650/3862/4480 10701/3831/4480 -f 10701/3831/4481 10699/3829/4481 10649/3861/4481 -f 10702/3832/4482 10670/3845/4482 10700/3830/4482 -f 10650/3862/4483 10651/3863/4483 10703/3833/4483 -f 10703/3833/4484 10701/3831/4484 10650/3862/4484 -f 10702/3832/4485 10711/3834/4485 10719/3864/4485 -f 10651/3863/4486 10652/3865/4486 10704/3835/4486 -f 10705/3837/4487 10704/3835/4487 10652/3865/4487 -f 10652/3865/4488 10653/3866/4488 10707/3839/4488 -f 10707/3839/4489 10705/3837/4489 10652/3865/4489 -f 10709/3841/4490 10707/3839/4490 10653/3866/4490 -f 10664/3857/4491 10718/3867/4491 10708/3840/4491 -f 10708/3840/4492 10696/3826/4492 10664/3857/4492 -f 10653/3866/4493 10654/3858/4493 10697/3827/4493 -f 10697/3827/4494 10709/3841/4494 10653/3866/4494 -f 10651/3863/4495 10669/3846/4495 10668/3847/4495 -f 10652/3865/4496 10651/3863/4496 10668/3847/4496 -f 10652/3865/4497 10667/3868/4497 10713/3869/4497 -f 10666/3870/4498 10653/3866/4498 10652/3865/4498 -f 10653/3866/4499 10666/3870/4499 10665/3871/4499 -f 10653/3866/4500 10665/3871/4500 10664/3857/4500 -f 10664/3857/4501 10654/3858/4501 10653/3866/4501 -f 10664/3857/4502 10663/3855/4502 10655/3856/4502 -f 10655/3856/4503 10654/3858/4503 10664/3857/4503 -f 10663/3855/4504 10662/3853/4504 10656/3854/4504 -f 10656/3854/4505 10655/3856/4505 10663/3855/4505 -f 10662/3853/4506 10661/3842/4506 10657/3852/4506 -f 10657/3852/4507 10656/3854/4507 10662/3853/4507 -f 10661/3842/4508 10660/3872/4508 10657/3852/4508 -f 10660/3872/4509 10658/3849/4509 10657/3852/4509 -f 10647/3873/4510 10658/3849/4510 10659/3874/4510 -f 10647/3873/4511 10714/3875/4511 10715/3876/4511 -f 10715/3876/4512 10672/3850/4512 10648/3860/4512 -f 10648/3860/4513 10647/3873/4513 10715/3876/4513 -f 10672/3850/4514 10671/3859/4514 10649/3861/4514 -f 10649/3861/4515 10648/3860/4515 10672/3850/4515 -f 10671/3859/4516 10670/3845/4516 10650/3862/4516 -f 10650/3862/4517 10649/3861/4517 10671/3859/4517 -f 10650/3862/4518 10670/3845/4518 10669/3846/4518 -f 10650/3862/4519 10669/3846/4519 10651/3863/4519 -f 10707/3839/4520 10708/3840/4520 10706/3838/4520 -f 10682/3812/4521 10712/3877/4521 10683/3813/4521 -f 10686/3816/4522 10684/3814/4522 10683/3813/4522 -f 10682/3812/4523 10685/3818/4523 10712/3877/4523 -f 10652/3865/4524 10713/3869/4524 10666/3870/4524 -f 10652/3865/4525 10668/3847/4525 10667/3868/4525 -f 10658/3849/4526 10660/3872/4526 10659/3874/4526 -f 10714/3875/4527 10647/3873/4527 10659/3874/4527 -f 10661/3842/4528 10716/3844/4528 10660/3872/4528 -f 10690/3820/4529 10686/3816/4529 10676/3843/4529 -f 10717/3851/4530 10672/3850/4530 10673/3878/4530 -f 10673/3878/4531 10672/3850/4531 10715/3876/4531 -f 10718/3867/4532 10664/3857/4532 10680/3879/4532 -f 10680/3879/4533 10664/3857/4533 10665/3871/4533 -f 10702/3832/4534 10719/3864/4534 10677/3848/4534 -f 10721/3880/4535 10720/3881/4535 10727/3882/4535 -f 10727/3882/4536 10720/3881/4536 10726/3883/4536 -f 10722/3884/4537 10721/3880/4537 10728/3885/4537 -f 10728/3885/4538 10721/3880/4538 10727/3882/4538 -f 10848/3886/4539 10722/3884/4539 10849/3887/4539 -f 10850/3887/4540 10722/3884/4540 10728/3885/4540 -f 10724/3888/4541 10723/3889/4541 10730/3890/4541 -f 10730/3890/4542 10723/3889/4542 10729/3891/4542 -f 10725/3892/4543 10724/3888/4543 10731/3893/4543 -f 10731/3893/4544 10724/3888/4544 10730/3890/4544 -f 10726/3883/4545 10720/3881/4545 10732/3894/4545 -f 10727/3882/4546 10726/3883/4546 10733/3895/4546 -f 10733/3895/4547 10726/3883/4547 10732/3894/4547 -f 10728/3885/4548 10727/3882/4548 10734/3896/4548 -f 10734/3896/4549 10727/3882/4549 10733/3895/4549 -f 10718/3867/4550 10728/3885/4550 10735/3897/4550 -f 10735/3897/4551 10728/3885/4551 10734/3896/4551 -f 10729/3891/4552 10676/3843/4552 10737/3898/4552 -f 10737/3898/4553 10676/3843/4553 10736/3899/4553 -f 10730/3890/4554 10729/3891/4554 10738/3900/4554 -f 10738/3900/4555 10729/3891/4555 10737/3898/4555 -f 10731/3893/4556 10730/3890/4556 10739/3901/4556 -f 10739/3901/4557 10730/3890/4557 10738/3900/4557 -f 10732/3894/4558 10720/3881/4558 10740/3902/4558 -f 10733/3895/4559 10732/3894/4559 10741/3903/4559 -f 10741/3903/4560 10732/3894/4560 10740/3902/4560 -f 10734/3896/4561 10733/3895/4561 10742/3904/4561 -f 10742/3904/4562 10733/3895/4562 10741/3903/4562 -f 10735/3897/4563 10734/3896/4563 10743/3905/4563 -f 10743/3905/4564 10734/3896/4564 10742/3904/4564 -f 10737/3898/4565 10736/3899/4565 10745/3906/4565 -f 10745/3906/4566 10736/3899/4566 10744/3907/4566 -f 10738/3900/4567 10737/3898/4567 10746/3908/4567 -f 10746/3908/4568 10737/3898/4568 10745/3906/4568 -f 10740/3902/4569 10720/3881/4569 10748/3909/4569 -f 10741/3903/4570 10740/3902/4570 10749/3910/4570 -f 10749/3910/4571 10740/3902/4571 10748/3909/4571 -f 10742/3904/4572 10741/3903/4572 10750/3911/4572 -f 10750/3911/4573 10741/3903/4573 10749/3910/4573 -f 10743/3905/4574 10742/3904/4574 10706/3838/4574 -f 10706/3838/4575 10742/3904/4575 10750/3911/4575 -f 10745/3906/4576 10744/3907/4576 10751/3912/4576 -f 10751/3912/4577 10744/3907/4577 10683/3813/4577 -f 10746/3908/4578 10745/3906/4578 10752/3913/4578 -f 10752/3913/4579 10745/3906/4579 10751/3912/4579 -f 10747/3914/4580 10746/3908/4580 10753/3915/4580 -f 10753/3915/4581 10746/3908/4581 10752/3913/4581 -f 10748/3909/4582 10720/3881/4582 10754/3916/4582 -f 10750/3911/4583 10749/3910/4583 10756/3917/4583 -f 10756/3917/4584 10749/3910/4584 10755/3918/4584 -f 10706/3838/4585 10750/3911/4585 10710/3836/4585 -f 10710/3836/4586 10750/3911/4586 10756/3917/4586 -f 10752/3913/4587 10751/3912/4587 10758/3919/4587 -f 10758/3919/4588 10751/3912/4588 10757/3920/4588 -f 10754/3916/4589 10720/3881/4589 10760/3921/4589 -f 10755/3918/4590 10754/3916/4590 10761/3922/4590 -f 10761/3922/4591 10754/3916/4591 10760/3921/4591 -f 10756/3917/4592 10755/3918/4592 10762/3923/4592 -f 10762/3923/4593 10755/3918/4593 10761/3922/4593 -f 10710/3836/4594 10756/3917/4594 10763/3924/4594 -f 10758/3919/4595 10757/3920/4595 10766/3925/4595 -f 10766/3925/4596 10757/3920/4596 10765/3926/4596 -f 10759/3927/4597 10758/3919/4597 10767/3928/4597 -f 10767/3928/4598 10758/3919/4598 10766/3925/4598 -f 10760/3921/4599 10720/3881/4599 10768/3929/4599 -f 10761/3922/4600 10760/3921/4600 10769/3930/4600 -f 10769/3930/4601 10760/3921/4601 10768/3929/4601 -f 10762/3923/4602 10761/3922/4602 10770/3931/4602 -f 10770/3931/4603 10761/3922/4603 10769/3930/4603 -f 10763/3924/4604 10762/3923/4604 10770/3931/4604 -f 10771/3932/4605 10763/3924/4605 10770/3931/4605 -f 10765/3926/4606 10764/3933/4606 10773/3934/4606 -f 10773/3934/4607 10764/3933/4607 10772/3935/4607 -f 10766/3925/4608 10765/3926/4608 10774/3936/4608 -f 10774/3936/4609 10765/3926/4609 10773/3934/4609 -f 10768/3929/4610 10720/3881/4610 10776/3937/4610 -f 10769/3930/4611 10768/3929/4611 10777/3938/4611 -f 10777/3938/4612 10768/3929/4612 10776/3937/4612 -f 10770/3931/4613 10769/3930/4613 10778/3939/4613 -f 10778/3939/4614 10769/3930/4614 10777/3938/4614 -f 10779/3940/4615 10770/3931/4615 10778/3939/4615 -f 10780/3941/4616 10770/3931/4616 10779/3940/4616 -f 10771/3932/4617 10770/3931/4617 10719/3864/4617 -f 10719/3864/4618 10770/3931/4618 10780/3941/4618 -f 10773/3934/4619 10772/3935/4619 10781/3942/4619 -f 10781/3942/4620 10772/3935/4620 10717/3851/4620 -f 10774/3936/4621 10773/3934/4621 10782/3943/4621 -f 10782/3943/4622 10773/3934/4622 10781/3942/4622 -f 10775/3944/4623 10774/3936/4623 10783/3945/4623 -f 10783/3945/4624 10774/3936/4624 10782/3943/4624 -f 10739/3901/4625 10775/3944/4625 10783/3945/4625 -f 10776/3937/4626 10720/3881/4626 10784/3946/4626 -f 10777/3938/4627 10776/3937/4627 10785/3947/4627 -f 10785/3947/4628 10776/3937/4628 10784/3946/4628 -f 10778/3939/4629 10777/3938/4629 10786/3948/4629 -f 10786/3948/4630 10777/3938/4630 10785/3947/4630 -f 10779/3940/4631 10778/3939/4631 10787/3949/4631 -f 10787/3949/4632 10778/3939/4632 10786/3948/4632 -f 10719/3864/4633 10780/3941/4633 10851/3950/4633 -f 10852/3950/4634 10780/3941/4634 10788/3951/4634 -f 10782/3943/4635 10781/3942/4635 10790/3952/4635 -f 10790/3952/4636 10781/3942/4636 10789/3953/4636 -f 10783/3945/4637 10782/3943/4637 10791/3954/4637 -f 10791/3954/4638 10782/3943/4638 10790/3952/4638 -f 10784/3946/4639 10720/3881/4639 10792/3955/4639 -f 10785/3947/4640 10784/3946/4640 10793/3956/4640 -f 10793/3956/4641 10784/3946/4641 10792/3955/4641 -f 10786/3948/4642 10785/3947/4642 10794/3957/4642 -f 10794/3957/4643 10785/3947/4643 10793/3956/4643 -f 10787/3949/4644 10786/3948/4644 10794/3957/4644 -f 10853/3950/4645 10788/3951/4645 10795/3958/4645 -f 10789/3953/4646 10673/3878/4646 10797/3959/4646 -f 10797/3959/4647 10673/3878/4647 10796/3960/4647 -f 10790/3952/4648 10789/3953/4648 10798/3961/4648 -f 10798/3961/4649 10789/3953/4649 10797/3959/4649 -f 10792/3955/4650 10720/3881/4650 10800/3962/4650 -f 10793/3956/4651 10792/3955/4651 10801/3963/4651 -f 10801/3963/4652 10792/3955/4652 10800/3962/4652 -f 10794/3957/4653 10793/3956/4653 10802/3964/4653 -f 10802/3964/4654 10793/3956/4654 10801/3963/4654 -f 10795/3958/4655 10794/3957/4655 10802/3964/4655 -f 10803/3965/4656 10795/3958/4656 10802/3964/4656 -f 10797/3959/4657 10796/3960/4657 10805/3966/4657 -f 10805/3966/4658 10796/3960/4658 10804/3967/4658 -f 10798/3961/4659 10797/3959/4659 10806/3968/4659 -f 10806/3968/4660 10797/3959/4660 10805/3966/4660 -f 10799/3969/4661 10798/3961/4661 10807/3970/4661 -f 10807/3970/4662 10798/3961/4662 10806/3968/4662 -f 10739/3901/4663 10799/3969/4663 10807/3970/4663 -f 10800/3962/4664 10720/3881/4664 10808/3971/4664 -f 10801/3963/4665 10800/3962/4665 10809/3972/4665 -f 10809/3972/4666 10800/3962/4666 10808/3971/4666 -f 10802/3964/4667 10801/3963/4667 10810/3973/4667 -f 10810/3973/4668 10801/3963/4668 10809/3972/4668 -f 10806/3968/4669 10805/3966/4669 10812/3974/4669 -f 10812/3974/4670 10805/3966/4670 10811/3975/4670 -f 10807/3970/4671 10806/3968/4671 10813/3976/4671 -f 10813/3976/4672 10806/3968/4672 10812/3974/4672 -f 10739/3901/4673 10807/3970/4673 10813/3976/4673 -f 10808/3971/4674 10720/3881/4674 10814/3977/4674 -f 10809/3972/4675 10808/3971/4675 10815/3978/4675 -f 10815/3978/4676 10808/3971/4676 10814/3977/4676 -f 10810/3973/4677 10809/3972/4677 10816/3979/4677 -f 10816/3979/4678 10809/3972/4678 10815/3978/4678 -f 10854/3980/4679 10810/3973/4679 10855/3981/4679 -f 10856/3981/4680 10810/3973/4680 10816/3979/4680 -f 10812/3974/4681 10811/3975/4681 10818/3982/4681 -f 10818/3982/4682 10811/3975/4682 10817/3983/4682 -f 10813/3976/4683 10812/3974/4683 10819/3984/4683 -f 10819/3984/4684 10812/3974/4684 10818/3982/4684 -f 10739/3901/4685 10813/3976/4685 10819/3984/4685 -f 10814/3977/4686 10720/3881/4686 10820/3985/4686 -f 10815/3978/4687 10814/3977/4687 10821/3986/4687 -f 10821/3986/4688 10814/3977/4688 10820/3985/4688 -f 10816/3979/4689 10815/3978/4689 10822/3987/4689 -f 10822/3987/4690 10815/3978/4690 10821/3986/4690 -f 10818/3982/4691 10817/3983/4691 10826/3988/4691 -f 10739/3901/4692 10819/3984/4692 10827/3989/4692 -f 10820/3985/4693 10720/3881/4693 10828/3990/4693 -f 10821/3986/4694 10820/3985/4694 10829/3991/4694 -f 10829/3991/4695 10820/3985/4695 10828/3990/4695 -f 10822/3987/4696 10821/3986/4696 10830/3992/4696 -f 10830/3992/4697 10821/3986/4697 10829/3991/4697 -f 10823/3993/4698 10822/3987/4698 10831/3994/4698 -f 10831/3994/4699 10822/3987/4699 10830/3992/4699 -f 10827/3989/4700 10826/3988/4700 10835/3995/4700 -f 10835/3995/4701 10826/3988/4701 10834/3996/4701 -f 10829/3991/4702 10828/3990/4702 10721/3880/4702 -f 10721/3880/4703 10828/3990/4703 10720/3881/4703 -f 10830/3992/4704 10829/3991/4704 10722/3884/4704 -f 10722/3884/4705 10829/3991/4705 10721/3880/4705 -f 10831/3994/4706 10830/3992/4706 10857/3886/4706 -f 10858/3886/4707 10830/3992/4707 10722/3884/4707 -f 10833/3997/4708 10832/3998/4708 10723/3889/4708 -f 10723/3889/4709 10832/3998/4709 10716/3844/4709 -f 10834/3996/4710 10833/3997/4710 10724/3888/4710 -f 10724/3888/4711 10833/3997/4711 10723/3889/4711 -f 10835/3995/4712 10834/3996/4712 10725/3892/4712 -f 10725/3892/4713 10834/3996/4713 10724/3888/4713 -f 10780/3941/4714 10840/3999/4714 10788/3951/4714 -f 10840/3999/4715 10841/4000/4715 10788/3951/4715 -f 10840/3999/4716 10847/4001/4716 10841/4000/4716 -f 10844/4002/4717 10787/3949/4717 10788/3951/4717 -f 10788/3951/4718 10841/4000/4718 10844/4002/4718 -f 10842/4003/4719 10841/4000/4719 10839/4004/4719 -f 10842/4003/4720 10844/4002/4720 10841/4000/4720 -f 10840/3999/4721 10780/3941/4721 10779/3940/4721 -f 10779/3940/4722 10843/4005/4722 10840/3999/4722 -f 10787/3949/4723 10844/4002/4723 10779/3940/4723 -f 10843/4005/4724 10779/3940/4724 10845/4006/4724 -f 10840/3999/4725 10843/4005/4725 10847/4001/4725 -f 10839/4004/4726 10841/4000/4726 10846/4007/4726 -f 10844/4002/4727 10842/4003/4727 10838/4008/4727 -f 10843/4005/4728 10845/4006/4728 10837/4009/4728 -f 10847/4001/4729 10843/4005/4729 10836/4010/4729 -f 10779/3940/4730 10844/4002/4730 10845/4006/4730 -f 10845/4006/4731 10844/4002/4731 10838/4008/4731 -f 10845/4006/4732 10838/4008/4732 10837/4009/4732 -f 10837/4009/4733 10838/4008/4733 10842/4003/4733 -f 10842/4003/4734 10843/4005/4734 10837/4009/4734 -f 10787/3949/4735 10794/3957/4735 10795/3958/4735 -f 10788/3951/4736 10787/3949/4736 10795/3958/4736 -f 10842/4003/4737 10839/4004/4737 10843/4005/4737 -f 10839/4004/4738 10836/4010/4738 10843/4005/4738 -f 10836/4010/4739 10839/4004/4739 10846/4007/4739 -f 10846/4007/4740 10847/4001/4740 10836/4010/4740 -f 10847/4001/4741 10846/4007/4741 10841/4000/4741 -f 10660/3872/4742 10824/4011/4742 10659/3874/4742 -f 10832/3998/4743 10824/4011/4743 10660/3872/4743 -f 10660/3872/4744 10716/3844/4744 10832/3998/4744 -f 10804/3967/4745 10715/3876/4745 10714/3875/4745 -f 10804/3967/4746 10796/3960/4746 10715/3876/4746 -f 10796/3960/4747 10673/3878/4747 10715/3876/4747 -f 10717/3851/4748 10772/3935/4748 10685/3818/4748 -f 10772/3935/4749 10764/3933/4749 10685/3818/4749 -f 10764/3933/4750 10712/3877/4750 10685/3818/4750 -f 10676/3843/4751 10686/3816/4751 10736/3899/4751 -f 10686/3816/4751 10744/3907/4751 10736/3899/4751 -f 10744/3907/4752 10686/3816/4752 10683/3813/4752 -f 10708/3840/4753 10718/3867/4753 10735/3897/4753 -f 10735/3897/4754 10743/3905/4754 10708/3840/4754 -f 10706/3838/4755 10708/3840/4755 10743/3905/4755 -f 10771/3932/4756 10719/3864/4756 10711/3834/4756 -f 10711/3834/4757 10763/3924/4757 10771/3932/4757 -f 10711/3834/4758 10710/3836/4758 10763/3924/4758 -f 10677/3848/4759 10859/4012/4759 10668/3847/4759 -f 10860/4012/4760 10861/4013/4760 10668/3847/4760 -f 10862/4013/4761 10667/3868/4761 10668/3847/4761 -f 10713/3869/4762 10667/3868/4762 10863/4013/4762 -f 10666/3870/4763 10864/4014/4763 10665/3871/4763 -f 10865/4014/4764 10866/4015/4764 10665/3871/4764 -f 10867/4015/4765 10680/3879/4765 10665/3871/4765 -f 10749/3910/4766 10748/3909/4766 10755/3918/4766 -f 10755/3918/4767 10748/3909/4767 10754/3916/4767 -f 10762/3923/4768 10763/3924/4768 10756/3917/4768 -f 10803/3965/4769 10802/3964/4769 10810/3973/4769 -f 10868/3980/4770 10803/3965/4770 10810/3973/4770 -f 10869/3981/4771 10816/3979/4771 10822/3987/4771 -f 10822/3987/4772 10823/3993/4772 10870/3981/4772 -f 10826/3988/4773 10825/4016/4773 10833/3997/4773 -f 10826/3988/4774 10833/3997/4774 10834/3996/4774 -f 10826/3988/4775 10817/3983/4775 10825/4016/4775 -f 10819/3984/4776 10818/3982/4776 10826/3988/4776 -f 10826/3988/4777 10827/3989/4777 10819/3984/4777 -f 10799/3969/4778 10791/3954/4778 10790/3952/4778 -f 10798/3961/4779 10799/3969/4779 10790/3952/4779 -f 10805/3966/4780 10804/3967/4780 10714/3875/4780 -f 10714/3875/4781 10811/3975/4781 10805/3966/4781 -f 10659/3874/4782 10817/3983/4782 10811/3975/4782 -f 10659/3874/4783 10824/4011/4783 10825/4016/4783 -f 10825/4016/4784 10817/3983/4784 10659/3874/4784 -f 10833/3997/4785 10825/4016/4785 10824/4011/4785 -f 10824/4011/4786 10832/3998/4786 10833/3997/4786 -f 10723/3889/4787 10716/3844/4787 10676/3843/4787 -f 10676/3843/4788 10729/3891/4788 10723/3889/4788 -f 10747/3914/4789 10739/3901/4789 10738/3900/4789 -f 10746/3908/4790 10747/3914/4790 10738/3900/4790 -f 10753/3915/4791 10752/3913/4791 10758/3919/4791 -f 10758/3919/4792 10759/3927/4792 10753/3915/4792 -f 10739/3901/4793 10747/3914/4793 10753/3915/4793 -f 10739/3901/4794 10753/3915/4794 10759/3927/4794 -f 10739/3901/4795 10759/3927/4795 10767/3928/4795 -f 10767/3928/4796 10775/3944/4796 10739/3901/4796 -f 10739/3901/4797 10783/3945/4797 10791/3954/4797 -f 10791/3954/4798 10799/3969/4798 10739/3901/4798 -f 10827/3989/4799 10835/3995/4799 10739/3901/4799 -f 10835/3995/4800 10725/3892/4800 10739/3901/4800 -f 10725/3892/4801 10731/3893/4801 10739/3901/4801 -f 10767/3928/4802 10766/3925/4802 10774/3936/4802 -f 10774/3936/4803 10775/3944/4803 10767/3928/4803 -f 10751/3912/4804 10683/3813/4804 10712/3877/4804 -f 10764/3933/4805 10765/3926/4805 10712/3877/4805 -f 10765/3926/4806 10757/3920/4806 10712/3877/4806 -f 10757/3920/4807 10751/3912/4807 10712/3877/4807 -f 10717/3851/4808 10673/3878/4808 10789/3953/4808 -f 10789/3953/4809 10781/3942/4809 10717/3851/4809 -f 10659/3874/4810 10811/3975/4810 10714/3875/4810 -f 10647/3873/4811 10681/3811/4811 10658/3849/4811 -f 10704/3835/4486 10703/3833/4486 10651/3863/4486 -f 10647/3873/4812 10682/3812/4812 10681/3811/4812 -f 10682/3812/4813 10647/3873/4813 10648/3860/4813 -f 10648/3860/4814 10689/3819/4814 10682/3812/4814 -o diesrehu -v -0.101007 0.095483 0.910240 -v -0.466117 0.114525 2.112727 -v -0.466113 0.095555 2.112726 -v -0.433249 0.095564 2.112734 -v -0.433256 0.114536 2.112735 -v -0.445459 0.121581 2.112732 -v -0.800347 0.946820 0.910339 -v -0.800001 0.946748 2.112063 -v -0.100786 1.015438 2.112143 -v -0.100823 1.015553 0.910444 -v -0.100965 0.122363 2.112811 -v -0.640063 0.861893 0.910022 -v -0.358989 0.492151 0.916695 -v -0.640079 0.861893 0.916695 -v -0.289797 0.861893 0.916695 -v -0.640152 0.708323 0.910022 -v -0.289797 0.122409 0.916695 -v -0.640152 0.212372 0.910021 -v -0.640063 0.122409 0.910022 -v -0.681146 0.175972 0.910022 -v -0.642814 0.178288 0.910022 -v -0.800098 0.122354 0.910022 -v -0.681146 0.273272 0.910022 -v -0.681146 0.671911 0.910022 -v -0.681146 0.769212 0.910022 -v -0.642825 0.766895 0.910022 -v -0.640159 0.736488 0.910022 -v -0.642825 0.270956 0.910022 -v -0.642814 0.674228 0.910022 -v -0.640159 0.240592 0.910022 -v -0.289782 0.122409 0.910022 -v -0.104247 0.545789 1.402032 -v -0.104251 0.545789 1.161450 -v -0.107593 0.821093 1.163104 -v -0.107592 0.821093 1.400360 -v -0.107593 0.674159 1.631422 -v -0.107593 0.563470 1.631422 -v -0.107593 0.547699 1.620274 -v -0.107593 0.821093 1.620274 -v -0.107592 0.695121 1.749918 -v -0.107593 0.805810 1.728574 -v -0.107593 0.805810 1.749918 -v -0.107593 0.695121 1.728574 -v -0.107592 0.547699 1.857530 -v -0.107593 0.563470 1.728574 -v -0.107593 0.674159 1.728574 -v -0.107592 0.674159 1.749918 -v -0.107593 0.563470 1.749918 -v -0.107592 0.563470 1.847070 -v -0.107592 0.821093 1.857530 -v -0.107592 0.674159 1.847070 -v -0.107592 0.695121 1.847070 -v -0.107592 0.805810 1.847070 -v -0.107593 0.805810 1.631422 -v -0.107593 0.695121 1.631422 -v -13.479593 14.484671 1.955962 -v -13.534984 12.837234 2.927241 -v -13.466154 11.168139 1.959777 -v -13.534967 9.498934 2.927236 -v -0.799965 0.122333 2.112651 -v -0.292076 0.095762 0.910209 -v -0.307056 0.110567 0.910065 -v -0.292068 0.118630 0.910037 -v -0.278102 0.110566 0.910073 -v -0.278265 0.100554 0.910141 -v -0.601498 0.093851 0.910044 -v -0.601497 0.110514 0.910022 -v -0.572545 0.093849 0.910052 -v -0.307194 0.100168 0.910133 -v -0.587020 0.118924 0.910022 -v -0.572544 0.110565 0.910022 -v -0.107593 0.674159 1.175333 -v -0.107593 0.563470 1.175333 -v -0.107592 0.695121 1.293829 -v -0.107593 0.805810 1.272485 -v -0.107593 0.805810 1.293829 -v -0.107593 0.695121 1.272485 -v -0.107593 0.563470 1.272485 -v -0.107593 0.674159 1.272485 -v -0.107592 0.674159 1.293829 -v -0.107593 0.563470 1.293829 -v -0.107592 0.563470 1.390981 -v -0.107592 0.674159 1.390981 -v -0.107592 0.695121 1.390981 -v -0.107592 0.805810 1.390981 -v -0.107593 0.805810 1.175333 -v -0.107593 0.695121 1.175333 -v -0.289797 0.861893 0.916695 -v -0.640079 0.861893 0.916695 -v -0.640063 0.861893 0.910022 -v -0.289797 0.861893 0.916695 -v -0.289797 0.122409 0.916695 -v -0.640159 0.736488 0.910022 -v -0.640063 0.861893 0.910022 -v -0.640079 0.861893 0.916695 -v -0.100965 0.122363 2.112811 -v -0.100965 0.122363 2.112811 -v -0.100965 0.122363 2.112811 -v -0.100786 1.015438 2.112143 -v -0.100786 1.015438 2.112143 -v -0.100786 1.015438 2.112143 -v -0.100823 1.015553 0.910444 -v -0.100823 1.015553 0.910444 -v -0.100823 1.015553 0.910444 -v -0.100823 1.015553 0.910444 -v -0.100823 1.015553 0.910444 -v -0.101007 0.095483 0.910240 -v -0.101007 0.095483 0.910240 -v -0.101007 0.095483 0.910240 -v -0.100965 0.122363 2.112811 -v -0.100965 0.122363 2.112811 -v -0.800001 0.946748 2.112063 -v -0.800347 0.946820 0.910339 -v -0.800098 0.122354 0.910022 -v -0.800001 0.946748 2.112063 -v -0.800098 0.122354 0.910022 -v -0.289782 0.122409 0.910022 -v -0.799965 0.122333 2.112651 -v -0.799965 0.122333 2.112651 -v -0.799965 0.122333 2.112651 -v -0.799965 0.122333 2.112651 -v -0.289782 0.122409 0.910022 -v -0.289782 0.122409 0.910022 -v -0.640063 0.122409 0.910022 -v -0.289797 0.122409 0.916695 -v -0.289782 0.122409 0.910022 -vt -0.000000 0.000124 -vt 0.999507 0.074648 -vt 0.000255 0.969063 -vt 0.770881 0.166713 -vt 1.000000 0.074571 -vt 0.000052 0.000000 -vt 0.270185 0.166713 -vt 0.000315 0.998227 -vt 0.771017 0.302771 -vt 0.770902 0.166713 -vt 0.771007 0.333328 -vt 0.369092 0.567864 -vt 0.771016 0.840792 -vt 0.771007 0.871409 -vt 0.270185 0.969014 -vt 0.774812 0.908388 -vt 0.770880 0.969014 -vt 0.829606 0.910902 -vt 0.999645 0.969074 -vt 0.829606 0.805336 -vt 0.829606 0.372833 -vt 0.829606 0.267267 -vt 0.774828 0.269780 -vt 0.774828 0.807849 -vt 0.774812 0.370319 -vt 0.270185 0.005548 -vt 0.770902 0.005548 -vt 0.770881 0.000000 -vt 0.166713 0.005548 -vt 0.969014 0.000000 -vt 0.969014 0.005548 -vt 0.302771 0.000000 -vt 0.166713 0.000000 -vt 0.210978 0.407668 -vt 0.210978 0.590504 -vt 0.509669 0.409058 -vt 0.507596 0.590504 -vt 0.969063 1.000000 -vt 0.507596 0.787759 -vt 0.000124 0.999444 -vt 0.210978 0.787759 -vt 0.000000 0.000351 -vt 0.210978 0.210413 -vt 0.998227 0.000182 -vt 0.509669 0.209037 -vt 0.370393 0.599772 -vt 0.490485 0.599772 -vt 0.347651 0.698290 -vt 0.227559 0.680544 -vt 0.227559 0.698290 -vt 0.347651 0.680545 -vt 0.490486 0.680545 -vt 0.370393 0.680545 -vt 0.370393 0.698290 -vt 0.490486 0.698290 -vt 0.490486 0.779062 -vt 0.370393 0.779062 -vt 0.347651 0.779062 -vt 0.227559 0.779062 -vt 0.227559 0.599773 -vt 0.347651 0.599772 -vt 0.074648 0.999377 -vt 0.074571 0.000263 -vt 0.969074 0.000000 -vt 0.969095 0.999867 -vt 0.270163 0.969014 -vt 0.715752 0.981920 -vt 0.715753 0.999998 -vt 0.695057 0.972795 -vt 0.999455 0.969095 -vt 0.492699 0.969911 -vt 0.522228 0.977567 -vt 0.475255 0.977555 -vt 0.475245 0.998138 -vt 0.522223 0.998149 -vt 0.253700 0.992726 -vt 0.253467 0.981864 -vt 0.273442 0.997926 -vt 0.273431 0.973115 -vt 0.294856 0.981862 -vt 0.674363 0.981865 -vt 0.295052 0.993145 -vt 0.674365 1.000000 -vt 0.770880 0.000000 -vt 0.270163 0.000000 -vt 0.370394 0.220580 -vt 0.490486 0.220580 -vt 0.347652 0.319097 -vt 0.227559 0.301352 -vt 0.227559 0.319097 -vt 0.347652 0.301352 -vt 0.490486 0.301352 -vt 0.370394 0.301352 -vt 0.370394 0.319097 -vt 0.490486 0.319097 -vt 0.490486 0.399870 -vt 0.370394 0.399870 -vt 0.347651 0.399870 -vt 0.227559 0.399869 -vt 0.227560 0.220580 -vt 0.347652 0.220580 -vn -0.000188 0.000748 1.000000 -vn -0.000182 0.003387 -0.999994 -vn 0.019010 -0.063969 -0.997771 -vn -0.033246 0.000228 -0.999447 -vn 0.000001 0.053137 -0.998587 -vn 0.019045 -0.000004 -0.999819 -vn 0.020744 -0.003881 -0.999777 -vn 0.023727 0.000001 -0.999718 -vn 0.023707 0.000022 -0.999719 -vn 0.020005 0.003745 -0.999793 -vn 0.000000 -0.000004 -1.000000 -vn -0.000021 -0.000005 -1.000000 -vn -0.000490 0.000384 -1.000000 -vn -0.002659 0.000001 -0.999996 -vn -0.002649 0.000005 -0.999996 -vn -0.001602 0.000708 -0.999998 -vn -0.000000 -0.000003 -1.000000 -vn -0.000089 0.000000 -1.000000 -vn 0.000012 0.000001 -1.000000 -vn -0.000096 -0.000001 -1.000000 -vn 0.000166 0.000001 -1.000000 -vn -0.000000 -1.000000 0.000009 -vn -0.999997 -0.000001 -0.002287 -vn 0.999997 -0.000763 0.002296 -vn 0.999926 0.012148 0.000002 -vn 0.999883 -0.000000 0.015326 -vn 0.999343 0.032975 0.015030 -vn 0.999879 0.015577 -0.000002 -vn 0.999654 -0.000220 -0.026316 -vn 0.999643 -0.000000 -0.026720 -vn 0.999389 -0.034952 -0.000034 -vn 0.999394 -0.034798 -0.000002 -vn 0.999395 -0.034782 0.000002 -vn 0.999395 -0.034793 -0.000002 -vn 0.999645 -0.000206 0.026625 -vn 0.999886 0.012188 -0.008935 -vn 0.999973 0.007315 -0.000198 -vn 0.999970 0.007722 -0.000017 +f 473//365 474//365 476//365 +f 475//366 476//366 478//366 +f 477//367 478//367 480//367 +f 479//368 480//368 482//368 +f 481//369 482//369 484//369 +f 483//370 484//370 486//370 +f 485//371 486//371 488//371 +f 487//372 488//372 490//372 +f 489//373 490//373 492//373 +f 491//155 492//155 494//155 +f 493//374 494//374 496//374 +f 495//375 496//375 498//375 +f 497//376 498//376 500//376 +f 499//377 500//377 502//377 +f 501//378 502//378 504//378 +f 503//379 504//379 506//379 +f 505//380 506//380 507//380 +f 507//381 508//381 509//381 +f 509//382 510//382 511//382 +f 511//383 512//383 513//383 +f 513//384 514//384 515//384 +f 515//385 516//385 517//385 +f 517//386 518//386 519//386 +f 519//387 520//387 521//387 +f 521//388 522//388 523//388 +f 523//389 524//389 525//389 +f 525//390 526//390 527//390 +f 527//391 528//391 529//391 +f 529//392 530//392 531//392 +f 531//393 532//393 533//393 +f 524//394 522//394 562//394 +f 535//395 536//395 473//395 +f 533//396 534//396 535//396 +f 473//42 475//42 535//42 +f 538//39 537//39 539//39 +f 500//397 498//397 549//397 +f 474//398 536//398 537//398 +f 514//399 512//399 557//399 +f 490//400 488//400 544//400 +f 528//401 526//401 564//401 +f 504//402 502//402 551//402 +f 480//403 478//403 539//403 +f 518//404 516//404 559//404 +f 494//405 492//405 546//405 +f 532//406 530//406 566//406 +f 508//407 506//407 554//407 +f 484//408 482//408 541//408 +f 522//409 520//409 561//409 +f 498//410 496//410 548//410 +f 536//411 534//411 568//411 +f 512//412 510//412 556//412 +f 488//413 486//413 543//413 +f 526//414 524//414 563//414 +f 502//415 500//415 550//415 +f 478//416 476//416 538//416 +f 516//417 514//417 558//417 +f 492//418 490//418 545//418 +f 530//419 528//419 565//419 +f 506//420 504//420 552//420 +f 482//421 480//421 540//421 +f 520//422 518//422 560//422 +f 476//423 474//423 537//423 +f 496//424 494//424 547//424 +f 534//425 532//425 567//425 +f 510//426 508//426 555//426 +f 486//427 484//427 542//427 +f 475//365 473//365 476//365 +f 477//366 475//366 478//366 +f 479//367 477//367 480//367 +f 481//368 479//368 482//368 +f 483//369 481//369 484//369 +f 485//370 483//370 486//370 +f 487//371 485//371 488//371 +f 489//372 487//372 490//372 +f 491//373 489//373 492//373 +f 493//155 491//155 494//155 +f 495//374 493//374 496//374 +f 497//375 495//375 498//375 +f 499//376 497//376 500//376 +f 501//377 499//377 502//377 +f 503//378 501//378 504//378 +f 505//379 503//379 506//379 +f 506//380 508//380 507//380 +f 508//381 510//381 509//381 +f 510//382 512//382 511//382 +f 512//383 514//383 513//383 +f 514//384 516//384 515//384 +f 516//385 518//385 517//385 +f 518//386 520//386 519//386 +f 520//387 522//387 521//387 +f 522//388 524//388 523//388 +f 524//389 526//389 525//389 +f 526//390 528//390 527//390 +f 528//391 530//391 529//391 +f 530//392 532//392 531//392 +f 532//393 534//393 533//393 +f 522//428 561//428 562//428 +f 536//395 474//395 473//395 +f 534//396 536//396 535//396 +f 475//42 477//42 535//42 +f 477//42 479//42 535//42 +f 479//42 481//42 535//42 +f 481//42 483//42 535//42 +f 483//42 485//42 535//42 +f 485//42 487//42 535//42 +f 487//42 489//42 535//42 +f 489//42 491//42 535//42 +f 491//42 493//42 535//42 +f 493//42 495//42 535//42 +f 495//42 497//42 535//42 +f 497//42 499//42 535//42 +f 499//42 501//42 535//42 +f 501//42 503//42 535//42 +f 503//42 505//42 535//42 +f 505//42 507//42 535//42 +f 507//42 509//42 535//42 +f 509//42 511//42 535//42 +f 511//42 513//42 535//42 +f 513//42 515//42 535//42 +f 515//42 517//42 535//42 +f 517//42 519//42 535//42 +f 519//42 521//42 535//42 +f 521//42 523//42 535//42 +f 523//42 525//42 535//42 +f 525//42 527//42 535//42 +f 527//42 529//42 535//42 +f 529//42 531//42 533//42 +f 535//42 529//42 533//42 +f 537//39 568//39 539//39 +f 568//39 567//39 539//39 +f 567//39 566//39 539//39 +f 566//39 565//39 539//39 +f 565//39 564//39 539//39 +f 564//39 563//39 539//39 +f 563//39 562//39 539//39 +f 562//39 561//39 539//39 +f 561//39 560//39 539//39 +f 560//39 559//39 539//39 +f 559//39 558//39 539//39 +f 558//39 557//39 539//39 +f 557//39 556//39 539//39 +f 556//39 555//39 539//39 +f 555//39 554//39 539//39 +f 554//39 553//39 539//39 +f 553//39 552//39 539//39 +f 552//39 551//39 539//39 +f 551//39 550//39 539//39 +f 550//39 549//39 539//39 +f 549//39 548//39 539//39 +f 548//39 547//39 539//39 +f 547//39 546//39 539//39 +f 546//39 545//39 539//39 +f 545//39 544//39 539//39 +f 544//39 543//39 539//39 +f 543//39 542//39 539//39 +f 542//39 541//39 539//39 +f 541//39 540//39 539//39 +f 550//397 500//397 549//397 +f 536//429 568//429 537//429 +f 512//399 556//399 557//399 +f 545//400 490//400 544//400 +f 526//430 563//430 564//430 +f 552//402 504//402 551//402 +f 540//431 480//431 539//431 +f 516//404 558//404 559//404 +f 547//405 494//405 546//405 +f 530//432 565//432 566//432 +f 506//407 553//407 554//407 +f 542//408 484//408 541//408 +f 520//433 560//433 561//433 +f 549//410 498//410 548//410 +f 534//434 567//434 568//434 +f 510//435 555//435 556//435 +f 544//413 488//413 543//413 +f 524//414 562//414 563//414 +f 551//415 502//415 550//415 +f 539//416 478//416 538//416 +f 514//417 557//417 558//417 +f 546//418 492//418 545//418 +f 528//419 564//419 565//419 +f 553//420 506//420 552//420 +f 541//421 482//421 540//421 +f 518//422 559//422 560//422 +f 538//436 476//436 537//436 +f 548//424 496//424 547//424 +f 532//437 566//437 567//437 +f 508//426 554//426 555//426 +f 543//427 486//427 542//427 +v 0.609274 0.018251 -1.901238 +v 0.609274 0.018251 -0.682690 +v -0.609274 0.018251 -0.682690 +v -0.609274 0.018251 -1.901238 +v 0.609274 1.236799 -1.901237 +v 0.609273 1.236799 -0.682690 +v -0.609274 1.236799 -0.682690 +v -0.609274 1.236799 -1.901238 vn 1.000000 -0.000000 0.000001 -vn 1.000000 0.000004 0.000000 -vn 1.000000 -0.000000 -0.000024 -vn 1.000000 0.000032 0.000000 -vn 1.000000 -0.000005 0.000000 -vn 1.000000 -0.000003 -0.000005 -vn 1.000000 0.000000 -0.000003 -vn 1.000000 0.000001 -0.000002 -vn 1.000000 -0.000044 -0.000005 -vn 1.000000 0.000000 0.000003 -vn -1.000000 -0.000302 0.000287 -vn -1.000000 -0.000044 0.000110 -vn -0.000002 0.000000 -1.000000 -vn 0.002444 0.009024 -0.999956 -vn -0.000078 -0.001316 -0.999999 -vn -0.000227 0.000713 1.000000 -vn -0.000231 0.000712 1.000000 -vn -0.000229 -0.000006 1.000000 -vn -0.000230 -0.000026 1.000000 -vn -0.000229 -0.000038 1.000000 -vn -0.000230 -0.000050 1.000000 -vn 0.000232 0.000081 -1.000000 -vn 0.000366 -0.006769 -0.999977 -vn 0.000144 -0.014542 -0.999894 -vn 0.000651 -0.003426 -0.999994 -vn 0.000551 -0.004245 -0.999991 -vn 0.000047 -0.003576 -0.999994 -vn 0.000162 0.000280 -1.000000 -vn 0.000162 -0.006559 -0.999978 -vn 0.000347 -0.001826 -0.999998 -vn 0.000659 -0.014943 -0.999888 -vn -0.000298 -0.037955 0.999279 -vn -0.000000 -0.003911 -0.999992 -vn 0.000051 0.000775 -1.000000 -vn 0.019047 0.000013 -0.999819 -vn 0.972240 -0.000001 0.233985 -vn 0.990816 0.011215 0.134750 -vn 0.982607 0.185699 -0.000017 -vn 0.982567 0.185909 0.000000 -vn 0.982573 0.185876 -0.000005 -vn 0.961405 0.010010 -0.274957 -vn 1.000000 -0.000047 -0.000006 -vn 1.000000 0.000000 0.000002 -vn 0.982567 0.185907 0.000000 -s off -f 10879/4017/4815 10878/4018/4815 10881/4019/4815 -f 10882/4020/4816 10877/4021/4816 10880/4022/4816 -f 10885/4023/4817 10882/4020/4817 10880/4022/4817 -f 10871/4024/4818 10885/4023/4818 10880/4022/4818 -f 10897/4025/4819 10884/4026/4819 10885/4023/4819 -f 10897/4025/4820 10885/4023/4820 10886/4027/4820 -f 10886/4027/4821 10885/4023/4821 10883/4028/4821 -f 10886/4027/4822 10883/4028/4822 10900/4029/4822 -f 10883/4028/4823 10888/4030/4823 10900/4029/4823 -f 10883/4028/4357 10885/4023/4357 10887/4031/4357 -f 10888/4030/4824 10883/4028/4824 10887/4031/4824 -f 10891/4032/4825 10889/4033/4825 10890/4034/4825 -f 10888/4030/4826 10889/4033/4826 10891/4032/4826 -f 10892/4035/4827 10877/4021/4827 10893/4036/4827 -f 10893/4036/4828 10877/4021/4828 10894/4037/4828 -f 10894/4037/4829 10877/4021/4829 10895/4038/4829 -f 10877/4021/4830 10882/4020/4830 10895/4038/4830 -f 10882/4020/4831 10896/4039/4831 10895/4038/4831 -f 10896/4039/4832 10882/4020/4832 10897/4025/4832 -f 10893/4036/4833 10894/4037/4833 10898/4040/4833 -f 10898/4040/3722 10894/4037/3722 10899/4041/3722 -f 10899/4041/4834 10900/4029/4834 10898/4040/4834 -f 10899/4041/4835 10886/4027/4835 10900/4029/4835 -f 10958/4042/4836 10959/4043/4836 10960/4044/4836 -f 10961/4045/4837 10901/4046/4837 10962/4047/4837 -f 10963/4048/4838 10964/4049/4838 10965/4045/4838 -f 10905/4050/4839 10909/4051/4839 10902/4052/4839 -f 10909/4051/4840 10908/4053/4840 10902/4052/4840 -f 10902/4052/4841 10908/4053/4841 10966/4054/4841 -f 10908/4053/4842 10914/4055/4842 10967/4054/4842 -f 10968/4054/4843 10914/4055/4843 10969/4056/4843 -f 10914/4055/4844 10920/4057/4844 10970/4056/4844 -f 10971/4056/4845 10920/4057/4845 10972/4058/4845 -f 10920/4057/4846 10909/4051/4846 10973/4058/4846 -f 10909/4051/4847 10905/4050/4847 10974/4058/4847 -f 10905/4050/4848 10904/4059/4848 10975/4058/4848 -f 10976/4058/4849 10904/4059/4849 10977/4060/4849 -f 10904/4059/4850 10903/4061/4850 10978/4060/4850 -f 10979/4060/4851 10903/4061/4851 10980/4054/4851 -f 10981/4054/4852 10903/4061/4852 10902/4052/4852 -f 10906/4062/63 10907/4063/63 10908/4053/63 -f 10908/4053/4853 10909/4051/4853 10906/4062/4853 -f 10910/4064/4854 10911/4065/4854 10912/4066/4854 -f 10911/4065/4855 10910/4064/4855 10913/4067/4855 -f 10908/4053/4185 10907/4063/4185 10914/4055/4185 -f 10907/4063/4856 10915/4068/4856 10914/4055/4856 -f 10916/4069/4855 10917/4070/4855 10915/4068/4855 -f 10917/4070/4857 10918/4071/4857 10915/4068/4857 -f 10915/4068/4856 10918/4071/4856 10914/4055/4856 -f 10918/4071/4858 10919/4072/4858 10914/4055/4858 -f 10914/4055/63 10919/4072/63 10920/4057/63 -f 10919/4072/4859 10921/4073/4859 10920/4057/4859 -f 10921/4073/4859 10922/4074/4859 10920/4057/4859 -f 10922/4074/63 10923/4075/63 10920/4057/63 -f 10920/4057/4860 10923/4075/4860 10909/4051/4860 -f 10923/4075/4861 10912/4066/4861 10909/4051/4861 -f 10912/4066/63 10911/4065/63 10909/4051/63 -f 10911/4065/63 10924/4076/63 10909/4051/63 -f 10922/4074/63 10921/4073/63 10910/4064/63 -f 10921/4073/63 10917/4070/63 10910/4064/63 -f 10917/4070/4855 10916/4069/4855 10910/4064/4855 -f 10910/4064/4855 10916/4069/4855 10913/4067/4855 -f 10916/4069/63 10906/4062/63 10913/4067/63 -f 10913/4067/63 10906/4062/63 10925/4077/63 -f 10906/4062/4862 10909/4051/4862 10925/4077/4862 -f 10925/4077/63 10909/4051/63 10924/4076/63 -f 10982/4078/4863 10983/4079/4863 10984/4080/4863 -f 10930/4081/4864 10985/4078/4864 10986/4080/4864 -f 10892/4035/4865 10893/4036/4865 10890/4034/4865 -f 10892/4035/4825 10890/4034/4825 10889/4033/4825 -f 10885/4023/4866 10871/4024/4866 10987/4082/4866 -f 10892/4035/4867 10937/4083/4867 10936/4084/4867 -f 10937/4083/105 10892/4035/105 10889/4033/105 -f 10937/4083/105 10889/4033/105 10940/4085/105 -f 10878/4018/4868 10988/4086/4868 10876/4087/4868 -f 10881/4019/4869 10878/4018/4869 10876/4087/4869 -f 10876/4087/4870 10989/4086/4870 10872/4088/4870 -f 10881/4019/4871 10876/4087/4871 10875/4089/4871 -f 10881/4019/4872 10875/4089/4872 10874/4090/4872 -f 10873/4091/4873 10872/4088/4873 10990/4086/4873 -f 10874/4090/4874 10873/4091/4874 10991/4086/4874 -f 10871/4024/4875 10935/4092/4875 10934/4093/4875 -f 10871/4024/4876 10931/4094/4876 10935/4092/4876 -f 10871/4024/4877 10934/4093/4877 10933/4095/4877 -f 10871/4024/4878 10933/4095/4878 10992/4082/4878 -f 10940/4085/4879 10933/4095/4879 10932/4096/4879 -f 10940/4085/4880 10932/4096/4880 10941/4097/4880 -f 10941/4097/4881 10932/4096/4881 10939/4098/4881 -f 10939/4098/4882 10938/4099/4882 10941/4097/4882 -f 10938/4099/4883 10939/4098/4883 10931/4094/4883 -f 10931/4094/4884 10936/4084/4884 10938/4099/4884 -f 10889/4033/4885 10993/4082/4885 10933/4095/4885 -f 10933/4095/4886 10940/4085/4886 10889/4033/4886 -f 10994/4100/933 10995/4042/933 10996/4101/933 -f 10889/4033/4887 10888/4030/4887 10887/4031/4887 -f 10942/4102/4888 10943/4103/4888 10903/4061/4888 -f 10903/4061/4889 10904/4059/4889 10942/4102/4889 -f 10944/4104/4854 10945/4105/4854 10946/4106/4854 -f 10945/4105/4855 10944/4104/4855 10947/4107/4855 -f 10903/4061/4890 10943/4103/4890 10902/4052/4890 -f 10943/4103/4891 10948/4108/4891 10902/4052/4891 -f 10949/4109/4855 10950/4110/4855 10948/4108/4855 -f 10950/4110/4857 10951/4111/4857 10948/4108/4857 -f 10951/4111/4892 10952/4112/4892 10902/4052/4892 -f 10902/4052/4893 10952/4112/4893 10905/4050/4893 -f 10952/4112/4859 10953/4113/4859 10905/4050/4859 -f 10954/4114/63 10955/4115/63 10905/4050/63 -f 10905/4050/4860 10955/4115/4860 10904/4059/4860 -f 10955/4115/4894 10946/4106/4894 10904/4059/4894 -f 10945/4105/63 10956/4116/63 10904/4059/63 -f 10954/4114/63 10953/4113/63 10944/4104/63 -f 10953/4113/63 10950/4110/63 10944/4104/63 -f 10950/4110/4855 10949/4109/4855 10944/4104/4855 -f 10944/4104/4855 10949/4109/4855 10947/4107/4855 -f 10949/4109/63 10942/4102/63 10947/4107/63 -f 10947/4107/63 10942/4102/63 10957/4117/63 -f 10942/4102/4895 10904/4059/4895 10957/4117/4895 -f 10957/4117/63 10904/4059/63 10956/4116/63 -f 10902/4052/4896 10948/4108/4896 10951/4111/4896 -f 10946/4106/63 10945/4105/63 10904/4059/63 -f 10905/4050/4859 10953/4113/4859 10954/4114/4859 -o dieswast -v -0.831751 0.473587 -2.763217 -v -0.813035 0.473587 -2.763217 -v -0.831751 0.473587 -2.915788 -v -0.813035 0.473587 -2.915788 -v -0.831751 0.491832 -2.763217 -v -0.813035 0.491832 -2.763217 -v -0.831751 0.491832 -2.915788 -v -0.813035 0.491832 -2.915788 -v -0.798346 0.382801 -2.763217 -v -0.779630 0.382801 -2.763217 -v -0.798346 0.382801 -2.915788 -v -0.779630 0.382801 -2.915788 -v -0.798346 0.401046 -2.763217 -v -0.779630 0.401046 -2.763217 -v -0.798346 0.401046 -2.915788 -v -0.779630 0.401046 -2.915788 -v -0.764942 0.292015 -2.763217 -v -0.746226 0.292015 -2.763217 -v -0.764942 0.292015 -2.915788 -v -0.746226 0.292015 -2.915788 -v -0.764942 0.310260 -2.763217 -v -0.746226 0.310260 -2.763217 -v -0.764942 0.310260 -2.915788 -v -0.746226 0.310260 -2.915788 -v -0.731537 0.201229 -2.763217 -v -0.712821 0.201229 -2.763217 -v -0.731537 0.201229 -2.915788 -v -0.712821 0.201229 -2.915788 -v -0.731537 0.219474 -2.763217 -v -0.712821 0.219474 -2.763217 -v -0.731537 0.219474 -2.915788 -v -0.712821 0.219474 -2.915788 -v -0.698132 0.110443 -2.763217 -v -0.679416 0.110443 -2.763217 -v -0.698132 0.110443 -2.915788 -v -0.679416 0.110443 -2.915788 -v -0.698132 0.128688 -2.763217 -v -0.679416 0.128688 -2.763217 -v -0.698132 0.128688 -2.915788 -v -0.679416 0.128688 -2.915788 -v -0.990517 0.473587 -2.763217 -v -1.009233 0.473587 -2.763217 -v -0.990517 0.473587 -2.915788 -v -1.009233 0.473587 -2.915788 -v -0.990517 0.491832 -2.763217 -v -1.009233 0.491832 -2.763217 -v -0.990517 0.491832 -2.915788 -v -1.009233 0.491832 -2.915788 -v -1.023921 0.382801 -2.763217 -v -1.042637 0.382801 -2.763217 -v -1.023921 0.382801 -2.915788 -v -1.042637 0.382801 -2.915788 -v -1.023921 0.401046 -2.763217 -v -1.042637 0.401046 -2.763217 -v -1.023921 0.401046 -2.915788 -v -1.042637 0.401046 -2.915788 -v -1.057326 0.292015 -2.763217 -v -1.076042 0.292015 -2.763217 -v -1.057326 0.292015 -2.915788 -v -1.076042 0.292015 -2.915788 -v -1.057326 0.310260 -2.763217 -v -1.076042 0.310260 -2.763217 -v -1.057326 0.310260 -2.915788 -v -1.076042 0.310260 -2.915788 -v -1.090731 0.201229 -2.763217 -v -1.109447 0.201229 -2.763217 -v -1.090731 0.201229 -2.915788 -v -1.109447 0.201229 -2.915788 -v -1.090731 0.219474 -2.763217 -v -1.109447 0.219474 -2.763217 -v -1.090731 0.219474 -2.915788 -v -1.109447 0.219474 -2.915788 -v -1.124136 0.110443 -2.763217 -v -1.142851 0.110443 -2.763217 -v -1.124136 0.110443 -2.915788 -v -1.142851 0.110443 -2.915788 -v -1.124136 0.128688 -2.763217 -v -1.142851 0.128688 -2.763217 -v -1.124136 0.128688 -2.915788 -v -1.142851 0.128688 -2.915788 -v -0.816083 0.509859 -2.748582 -v -1.007656 0.509859 -2.748582 -v -0.816083 0.509859 -2.932427 -v -1.007656 0.509859 -2.932427 -v -0.820644 0.521511 -2.748582 -v -1.003095 0.521511 -2.748582 -v -0.820644 0.521511 -2.932427 -v -1.003095 0.521511 -2.932427 -v -0.696656 0.093283 -2.749060 -v -0.661219 0.093283 -2.749060 -v -0.696656 0.093283 -2.762797 -v -0.661219 0.093283 -2.762797 -v -0.852122 0.509832 -2.749060 -v -0.816684 0.509832 -2.749060 -v -0.852122 0.509832 -2.762797 -v -0.816684 0.509832 -2.762797 -v -1.127208 0.093283 -2.749060 -v -1.162645 0.093283 -2.749060 -v -1.127208 0.093283 -2.762797 -v -1.162645 0.093283 -2.762797 -v -0.971743 0.509832 -2.749060 -v -1.007180 0.509832 -2.749060 -v -0.971743 0.509832 -2.762797 -v -1.007180 0.509832 -2.762797 -v -0.696656 0.093283 -2.918105 -v -0.661219 0.093283 -2.918105 -v -0.696656 0.093283 -2.931842 -v -0.661219 0.093283 -2.931842 -v -0.852122 0.509832 -2.918105 -v -0.816684 0.509832 -2.918105 -v -0.852122 0.509832 -2.931842 -v -0.816684 0.509832 -2.931842 -v -1.127208 0.093283 -2.918105 -v -1.162645 0.093283 -2.918105 -v -1.127208 0.093283 -2.931842 -v -1.162645 0.093283 -2.931842 -v -0.971743 0.509832 -2.918105 -v -1.007180 0.509832 -2.918105 -v -0.971743 0.509832 -2.931842 -v -1.007180 0.509832 -2.931842 -v -2.718358 0.472506 -2.763302 -v -2.699643 0.472506 -2.763302 -v -2.718358 0.472506 -2.915873 -v -2.699643 0.472506 -2.915873 -v -2.718358 0.490751 -2.763302 -v -2.699643 0.490751 -2.763302 -v -2.718358 0.490751 -2.915873 -v -2.699643 0.490751 -2.915873 -v -2.684954 0.381720 -2.763302 -v -2.666238 0.381720 -2.763302 -v -2.684954 0.381720 -2.915873 -v -2.666238 0.381720 -2.915873 -v -2.684954 0.399965 -2.763302 -v -2.666238 0.399965 -2.763302 -v -2.684954 0.399964 -2.915873 -v -2.666238 0.399964 -2.915873 -v -2.651549 0.290934 -2.763302 -v -2.632833 0.290934 -2.763302 -v -2.651549 0.290934 -2.915873 -v -2.632833 0.290934 -2.915873 -v -2.651549 0.309178 -2.763302 -v -2.632833 0.309178 -2.763302 -v -2.651549 0.309178 -2.915873 -v -2.632833 0.309178 -2.915873 -v -2.618145 0.200148 -2.763302 -v -2.599429 0.200148 -2.763302 -v -2.618145 0.200148 -2.915873 -v -2.599429 0.200148 -2.915873 -v -2.618145 0.218392 -2.763302 -v -2.599429 0.218392 -2.763302 -v -2.618145 0.218392 -2.915873 -v -2.599429 0.218392 -2.915873 -v -2.584739 0.109362 -2.763302 -v -2.566024 0.109362 -2.763302 -v -2.584739 0.109362 -2.915873 -v -2.566024 0.109362 -2.915873 -v -2.584739 0.127606 -2.763302 -v -2.566024 0.127606 -2.763302 -v -2.584739 0.127606 -2.915873 -v -2.566024 0.127606 -2.915873 -v -2.877125 0.472506 -2.763302 -v -2.895840 0.472506 -2.763302 -v -2.877125 0.472506 -2.915873 -v -2.895840 0.472506 -2.915873 -v -2.877125 0.490750 -2.763302 -v -2.895840 0.490750 -2.763302 -v -2.877125 0.490750 -2.915873 -v -2.895840 0.490750 -2.915873 -v -2.910528 0.381720 -2.763302 -v -2.929244 0.381720 -2.763302 -v -2.910528 0.381720 -2.915873 -v -2.929244 0.381720 -2.915873 -v -2.910528 0.399965 -2.763302 -v -2.929244 0.399965 -2.763302 -v -2.910528 0.399964 -2.915873 -v -2.929244 0.399964 -2.915873 -v -2.943934 0.290934 -2.763302 -v -2.962649 0.290934 -2.763302 -v -2.943934 0.290934 -2.915873 -v -2.962649 0.290934 -2.915873 -v -2.943934 0.309178 -2.763302 -v -2.962649 0.309178 -2.763302 -v -2.943934 0.309178 -2.915873 -v -2.962649 0.309178 -2.915873 -v -2.977338 0.200148 -2.763302 -v -2.996054 0.200148 -2.763302 -v -2.977338 0.200148 -2.915873 -v -2.996054 0.200148 -2.915873 -v -2.977338 0.218392 -2.763302 -v -2.996054 0.218392 -2.763302 -v -2.977338 0.218392 -2.915873 -v -2.996054 0.218392 -2.915873 -v -3.010743 0.109362 -2.763302 -v -3.029459 0.109362 -2.763302 -v -3.010743 0.109362 -2.915873 -v -3.029459 0.109362 -2.915873 -v -3.010743 0.127606 -2.763302 -v -3.029459 0.127606 -2.763302 -v -3.010743 0.127606 -2.915873 -v -3.029459 0.127606 -2.915873 -v -2.702691 0.508778 -2.748667 -v -2.894263 0.508778 -2.748667 -v -2.702691 0.508778 -2.932512 -v -2.894263 0.508778 -2.932512 -v -2.707252 0.520430 -2.748667 -v -2.889702 0.520430 -2.748667 -v -2.707252 0.520430 -2.932512 -v -2.889702 0.520430 -2.932512 -v -2.583263 0.092202 -2.749145 -v -2.547826 0.092202 -2.749145 -v -2.583263 0.092202 -2.762882 -v -2.547826 0.092202 -2.762882 -v -2.738729 0.508751 -2.749145 -v -2.703292 0.508751 -2.749145 -v -2.738729 0.508751 -2.762882 -v -2.703292 0.508751 -2.762882 -v -3.013815 0.092202 -2.749145 -v -3.049253 0.092202 -2.749145 -v -3.013815 0.092202 -2.762882 -v -3.049253 0.092202 -2.762882 -v -2.858350 0.508751 -2.749145 -v -2.893787 0.508751 -2.749145 -v -2.858350 0.508751 -2.762882 -v -2.893787 0.508751 -2.762882 -v -2.583263 0.092202 -2.918190 -v -2.547826 0.092202 -2.918190 -v -2.583263 0.092202 -2.931927 -v -2.547826 0.092202 -2.931927 -v -2.738729 0.508751 -2.918190 -v -2.703292 0.508751 -2.918190 -v -2.738729 0.508751 -2.931927 -v -2.703292 0.508751 -2.931927 -v -3.013815 0.092202 -2.918190 -v -3.049253 0.092202 -2.918190 -v -3.013815 0.092202 -2.931927 -v -3.049253 0.092202 -2.931927 -v -2.858350 0.508751 -2.918190 -v -2.893787 0.508751 -2.918190 -v -2.858350 0.508751 -2.931927 -v -2.893787 0.508751 -2.931927 -v -2.039265 0.561766 2.501917 -v -2.018563 0.562510 2.501917 -v -2.039265 0.561766 2.327986 -v -2.018563 0.562510 2.327986 -v -2.040031 0.584368 2.501917 -v -2.019330 0.585112 2.501917 -v -2.040031 0.584368 2.327986 -v -2.019330 0.585112 2.327986 -v -1.998505 0.450623 2.501917 -v -1.977803 0.451367 2.501917 -v -1.998505 0.450623 2.327986 -v -1.977803 0.451367 2.327986 -v -1.999271 0.473225 2.501917 -v -1.978568 0.473970 2.501917 -v -1.999271 0.473225 2.327986 -v -1.978568 0.473970 2.327986 -v -1.957743 0.339481 2.501917 -v -1.937042 0.340225 2.501917 -v -1.957743 0.339481 2.327986 -v -1.937042 0.340225 2.327986 -v -1.958509 0.362083 2.501917 -v -1.937807 0.362827 2.501917 -v -1.958509 0.362083 2.327986 -v -1.937807 0.362827 2.327986 -v -1.916983 0.228338 2.501917 -v -1.896280 0.229082 2.501917 -v -1.916983 0.228338 2.327986 -v -1.896280 0.229082 2.327986 -v -1.917748 0.250940 2.501917 -v -1.897046 0.251684 2.501917 -v -1.917748 0.250940 2.327986 -v -1.897046 0.251684 2.327986 -v -1.876221 0.117195 2.501917 -v -1.855520 0.117939 2.501917 -v -1.876221 0.117195 2.327986 -v -1.855520 0.117939 2.327986 -v -1.876988 0.139798 2.501917 -v -1.856285 0.140542 2.501917 -v -1.876988 0.139798 2.327986 -v -1.856285 0.140542 2.327986 -v -2.202856 0.562519 2.501917 -v -2.223564 0.563077 2.501917 -v -2.202856 0.562519 2.327986 -v -2.223564 0.563077 2.327986 -v -2.202282 0.585128 2.501917 -v -2.222990 0.585686 2.501917 -v -2.202282 0.585128 2.327986 -v -2.222990 0.585686 2.327986 -v -2.242675 0.451015 2.501917 -v -2.263382 0.451573 2.501917 -v -2.242675 0.451015 2.327986 -v -2.263382 0.451573 2.327986 -v -2.242100 0.473623 2.501917 -v -2.262807 0.474181 2.501917 -v -2.242100 0.473623 2.327986 -v -2.262807 0.474181 2.327986 -v -2.282493 0.339510 2.501917 -v -2.303200 0.340068 2.501917 -v -2.282493 0.339510 2.327986 -v -2.303200 0.340068 2.327986 -v -2.281918 0.362118 2.501917 -v -2.302626 0.362677 2.501917 -v -2.281918 0.362118 2.327986 -v -2.302626 0.362677 2.327986 -v -2.322311 0.228005 2.501917 -v -2.343018 0.228564 2.501917 -v -2.322311 0.228005 2.327986 -v -2.343018 0.228564 2.327986 -v -2.321737 0.250614 2.501917 -v -2.342444 0.251172 2.501917 -v -2.321737 0.250614 2.327986 -v -2.342444 0.251172 2.327986 -v -2.362129 0.116501 2.501917 -v -2.382837 0.117059 2.501917 -v -2.362129 0.116501 2.327986 -v -2.382837 0.117059 2.327986 -v -2.361555 0.139109 2.501917 -v -2.382262 0.139667 2.501917 -v -2.361555 0.139109 2.327986 -v -2.382262 0.139667 2.327986 -v -2.023457 0.609319 2.518600 -v -2.220677 0.609973 2.518600 -v -2.023457 0.609319 2.309017 -v -2.220677 0.609973 2.309017 -v -2.028991 0.621578 2.518600 -v -2.215264 0.622281 2.518600 -v -2.028991 0.621578 2.309017 -v -2.215264 0.622281 2.309017 -v -1.873868 0.094593 2.518056 -v -1.834671 0.096002 2.518056 -v -1.873868 0.094593 2.502396 -v -1.834671 0.096002 2.502396 -v -2.063319 0.607853 2.518056 -v -2.024121 0.609262 2.518056 -v -2.063319 0.607853 2.502396 -v -2.024121 0.609262 2.502396 -v -2.366068 0.093925 2.518056 -v -2.405277 0.094982 2.518056 -v -2.366068 0.093925 2.502396 -v -2.405277 0.094982 2.502396 -v -2.180943 0.608868 2.518056 -v -2.220151 0.609925 2.518056 -v -2.180943 0.608868 2.502396 -v -2.220151 0.609925 2.502396 -v -1.873868 0.094593 2.325345 -v -1.834671 0.096002 2.325345 -v -1.873868 0.094593 2.309684 -v -1.834671 0.096002 2.309684 -v -2.063319 0.607852 2.325345 -v -2.024121 0.609262 2.325345 -v -2.063319 0.607852 2.309684 -v -2.024121 0.609262 2.309684 -v -2.366068 0.093925 2.325345 -v -2.405277 0.094982 2.325345 -v -2.366068 0.093925 2.309684 -v -2.405277 0.094982 2.309684 -v -2.180943 0.608868 2.325345 -v -2.220151 0.609925 2.325345 -v -2.180943 0.608868 2.309684 -v -2.220151 0.609925 2.309684 -vt 0.071411 0.031057 -vt 0.071411 0.003068 -vt 0.063574 0.003068 -vt 0.063574 0.031057 -vt 0.057423 0.031057 -vt 0.057423 0.003068 -vt 0.049585 0.003068 -vt 0.049585 0.031057 -vt 0.043434 0.031057 -vt 0.043434 0.003068 -vt 0.035597 0.003068 -vt 0.035597 0.031057 -vt 0.029446 0.031057 -vt 0.029446 0.003068 -vt 0.021609 0.003068 -vt 0.021609 0.031057 -vt 0.015458 0.031057 -vt 0.015458 0.003068 -vt 0.007620 0.003068 -vt 0.007620 0.031057 -vt 0.137895 0.003068 -vt 0.137895 0.031057 -vt 0.145732 0.003068 -vt 0.145732 0.031057 -vt 0.151883 0.003068 -vt 0.151883 0.031057 -vt 0.159721 0.003068 -vt 0.159721 0.031057 -vt 0.165872 0.003068 -vt 0.165872 0.031057 -vt 0.173709 0.003068 -vt 0.173709 0.031057 -vt 0.179860 0.003068 -vt 0.179860 0.031057 -vt 0.187697 0.003068 -vt 0.187697 0.031057 -vt 0.193848 0.003068 -vt 0.193848 0.031057 -vt 0.201686 0.003068 -vt 0.201686 0.031057 -vt 0.064850 0.000016 -vt 0.064850 0.033742 -vt 0.145072 0.000016 -vt 0.145072 0.033742 -vt 0.143162 0.033742 -vt 0.066760 0.033742 -vt 0.143162 0.000016 -vt 0.066760 0.000016 -vt 0.014839 0.033654 -vt 0.014839 0.031134 -vt -0.000000 0.031134 -vt -0.000000 0.033654 -vt 0.079941 0.033654 -vt 0.065102 0.033654 -vt 0.065102 0.031134 -vt 0.079941 0.031134 -vt 0.195135 0.031134 -vt 0.195135 0.033654 -vt 0.209974 0.031134 -vt 0.209974 0.033654 -vt 0.144873 0.033654 -vt 0.130033 0.033654 -vt 0.144873 0.031134 -vt 0.130033 0.031134 -vt 0.014839 0.002643 -vt 0.014839 0.000123 -vt -0.000000 0.000123 -vt -0.000000 0.002643 -vt 0.079941 0.002643 -vt 0.065102 0.002643 -vt 0.065102 0.000123 -vt 0.079941 0.000123 -vt 0.195135 0.000123 -vt 0.195135 0.002643 -vt 0.209974 0.000123 -vt 0.209974 0.002643 -vt 0.144873 0.002643 -vt 0.130033 0.002643 -vt 0.144873 0.000123 -vt 0.130033 0.000123 -vt 0.861437 0.031041 -vt 0.861437 0.003052 -vt 0.853599 0.003052 -vt 0.853599 0.031041 -vt 0.847448 0.031041 -vt 0.847448 0.003052 -vt 0.839611 0.003052 -vt 0.839611 0.031041 -vt 0.833460 0.031041 -vt 0.833460 0.003052 -vt 0.825623 0.003052 -vt 0.825623 0.031041 -vt 0.819472 0.031041 -vt 0.819472 0.003052 -vt 0.811634 0.003052 -vt 0.811634 0.031041 -vt 0.805483 0.031041 -vt 0.805483 0.003052 -vt 0.797646 0.003052 -vt 0.797646 0.031041 -vt 0.927921 0.003052 -vt 0.927921 0.031041 -vt 0.935758 0.003052 -vt 0.935758 0.031041 -vt 0.941909 0.003052 -vt 0.941909 0.031041 -vt 0.949746 0.003052 -vt 0.949746 0.031041 -vt 0.955897 0.003052 -vt 0.955897 0.031041 -vt 0.963735 0.003052 -vt 0.963735 0.031041 -vt 0.969886 0.003052 -vt 0.969886 0.031041 -vt 0.977723 0.003052 -vt 0.977723 0.031041 -vt 0.983874 0.003052 -vt 0.983874 0.031041 -vt 0.991711 0.003052 -vt 0.991711 0.031041 -vt 0.854876 0.000000 -vt 0.854876 0.033726 -vt 0.935098 0.000000 -vt 0.935098 0.033726 -vt 0.933188 0.033726 -vt 0.856786 0.033726 -vt 0.933188 0.000000 -vt 0.856786 0.000000 -vt 0.804865 0.033638 -vt 0.804865 0.031118 -vt 0.790026 0.031118 -vt 0.790026 0.033638 -vt 0.869967 0.033638 -vt 0.855127 0.033638 -vt 0.855127 0.031118 -vt 0.869967 0.031118 -vt 0.985161 0.031118 -vt 0.985161 0.033638 -vt 1.000000 0.031118 -vt 1.000000 0.033638 -vt 0.934898 0.033638 -vt 0.920059 0.033638 -vt 0.934898 0.031118 -vt 0.920059 0.031118 -vt 0.804865 0.002627 -vt 0.804865 0.000107 -vt 0.790026 0.000107 -vt 0.790026 0.002627 -vt 0.869967 0.002627 -vt 0.855127 0.002627 -vt 0.855127 0.000107 -vt 0.869967 0.000107 -vt 0.985161 0.000107 -vt 0.985161 0.002627 -vt 1.000000 0.000107 -vt 1.000000 0.002627 -vt 0.934898 0.002627 -vt 0.920059 0.002627 -vt 0.934898 0.000107 -vt 0.920059 0.000107 -vt 0.577064 0.996939 -vt 0.577064 0.965032 -vt 0.568395 0.965032 -vt 0.568395 0.996939 -vt 0.577384 0.996939 -vt 0.568715 0.996939 -vt 0.568715 0.965032 -vt 0.577384 0.965032 -vt 0.559995 0.996939 -vt 0.559995 0.965032 -vt 0.551326 0.965032 -vt 0.551326 0.996939 -vt 0.560316 0.996939 -vt 0.551647 0.996939 -vt 0.551647 0.965032 -vt 0.560316 0.965032 -vt 0.542926 0.996939 -vt 0.542926 0.965032 -vt 0.534257 0.965032 -vt 0.534257 0.996939 -vt 0.543247 0.996939 -vt 0.534578 0.996939 -vt 0.534578 0.965032 -vt 0.543247 0.965032 -vt 0.525857 0.996939 -vt 0.525857 0.965032 -vt 0.517188 0.965032 -vt 0.517188 0.996939 -vt 0.526178 0.996939 -vt 0.517509 0.996939 -vt 0.517509 0.965032 -vt 0.526178 0.965032 -vt 0.508788 0.996939 -vt 0.508788 0.965032 -vt 0.500119 0.965032 -vt 0.500119 0.996939 -vt 0.509109 0.996939 -vt 0.500440 0.996939 -vt 0.500440 0.965032 -vt 0.509109 0.965032 -vt 0.645568 0.965032 -vt 0.645568 0.996939 -vt 0.654239 0.965032 -vt 0.654239 0.996939 -vt 0.653999 0.996939 -vt 0.645328 0.996939 -vt 0.653999 0.965032 -vt 0.645328 0.965032 -vt 0.662242 0.965032 -vt 0.662242 0.996939 -vt 0.670913 0.965032 -vt 0.670913 0.996939 -vt 0.670673 0.996939 -vt 0.662001 0.996939 -vt 0.670673 0.965032 -vt 0.662001 0.965032 -vt 0.678916 0.965032 -vt 0.678916 0.996939 -vt 0.687587 0.965032 -vt 0.687587 0.996939 -vt 0.687347 0.996939 -vt 0.678676 0.996939 -vt 0.687347 0.965032 -vt 0.678676 0.965032 -vt 0.695590 0.965032 -vt 0.695590 0.996939 -vt 0.704262 0.965032 -vt 0.704262 0.996939 -vt 0.704021 0.996939 -vt 0.695350 0.996939 -vt 0.704021 0.965032 -vt 0.695350 0.965032 -vt 0.712264 0.965032 -vt 0.712264 0.996939 -vt 0.720936 0.965032 -vt 0.720936 0.996939 -vt 0.720695 0.996939 -vt 0.712024 0.996939 -vt 0.720695 0.965032 -vt 0.712024 0.965032 -vt 0.570444 0.961552 -vt 0.570444 1.000000 -vt 0.653031 0.961552 -vt 0.653031 1.000000 -vt 0.650764 1.000000 -vt 0.572761 1.000000 -vt 0.650764 0.961552 -vt 0.572761 0.961552 -vt 0.507803 0.999900 -vt 0.507803 0.997027 -vt 0.491389 0.997027 -vt 0.491389 0.999900 -vt 0.587136 0.999900 -vt 0.570722 0.999900 -vt 0.570722 0.997027 -vt 0.587136 0.997027 -vt 0.713914 0.997027 -vt 0.713914 0.999900 -vt 0.730333 0.997027 -vt 0.730333 0.999900 -vt 0.652810 0.999900 -vt 0.636392 0.999900 -vt 0.652810 0.997027 -vt 0.636392 0.997027 -vt 0.507803 0.964547 -vt 0.507803 0.961675 -vt 0.491389 0.961675 -vt 0.491389 0.964547 -vt 0.587136 0.964547 -vt 0.570722 0.964547 -vt 0.570722 0.961675 -vt 0.587136 0.961675 -vt 0.713914 0.961675 -vt 0.713914 0.964547 -vt 0.730333 0.961675 -vt 0.730333 0.964547 -vt 0.652810 0.964547 -vt 0.636392 0.964547 -vt 0.652810 0.961675 -vt 0.636392 0.961675 -vn -0.931195 0.364521 0.000000 -vn -0.931196 0.364519 -0.000000 -vn 0.931183 0.364552 -0.000000 -vn 0.931182 0.364554 -0.000000 -vn 0.936876 0.349663 -0.000000 -vn -0.936875 -0.349663 -0.000000 -vn -0.936876 0.349662 0.000000 -vn 0.936876 -0.349662 0.000000 -vn -0.931193 0.364528 0.000000 -vn -0.931193 0.364526 -0.000000 -vn 0.931200 0.364509 -0.000000 -vn 0.931199 0.364511 -0.000000 -vn 0.936875 0.349664 -0.000000 -vn -0.936875 -0.349664 -0.000000 -vn -0.936876 0.349663 0.000000 -vn 0.936876 -0.349663 0.000000 -vn 0.936875 0.349665 -0.000000 -vn 0.035929 -0.999354 0.000000 -vn 0.035926 -0.999354 0.000000 -vn -0.035929 0.999354 0.000000 -vn 0.999425 0.033894 -0.000000 -vn -0.999426 -0.033883 0.000000 -vn -0.035927 0.999354 -0.000000 -vn -0.035926 0.999354 0.000000 -vn 0.999426 0.033867 -0.000000 -vn -0.999426 -0.033867 0.000000 -vn 0.035927 -0.999354 0.000000 -vn -0.035928 0.999354 0.000000 -vn 0.999427 0.033852 -0.000000 -vn -0.999426 -0.033873 0.000000 -vn 0.035921 -0.999355 0.000000 -vn 0.035925 -0.999355 0.000001 -vn -0.035925 0.999354 -0.000000 -vn 0.999426 0.033873 -0.000000 -vn -0.999427 -0.033852 0.000000 -vn 0.035923 -0.999355 -0.000000 -vn -0.035921 0.999355 0.000000 -vn -0.035924 0.999355 -0.000000 -vn 0.999427 0.033851 -0.000000 -vn -0.999426 -0.033888 -0.000000 -vn -0.026949 -0.999637 0.000000 -vn -0.026946 -0.999637 0.000000 -vn 0.026946 0.999637 0.000000 -vn 0.026949 0.999637 -0.000000 -vn -0.999678 0.025386 0.000000 -vn 0.999678 -0.025386 0.000000 -vn -0.026950 -0.999637 0.000000 -vn 0.026950 0.999637 -0.000000 -vn 0.026948 0.999637 0.000000 -vn -0.999677 0.025407 -0.000000 -vn 0.999677 -0.025407 0.000000 -vn 0.999677 -0.025428 0.000000 -vn -0.999678 0.025365 -0.000000 -vn 0.999678 -0.025375 0.000000 -vn -0.026947 -0.999637 0.000000 -vn 0.026945 0.999637 -0.000000 -vn -0.003314 -0.999995 0.000000 -vn 0.003773 0.999993 0.000000 -vn -0.915369 0.402616 -0.000000 -vn -0.915368 0.402618 0.000000 -vn 0.911427 0.411462 -0.000000 -vn 0.911428 0.411460 0.000000 -vn 0.938133 0.346276 -0.000000 -vn -0.938133 -0.346276 -0.000000 -vn -0.941034 0.338310 0.000000 -vn 0.941035 -0.338309 0.000000 -vn 0.035925 -0.999354 0.000000 -vn 0.035927 -0.999354 0.000006 -vn 0.938133 0.346276 -0.000002 -s off -f 10997/4118/3 10999/4119/3 11000/4120/3 -f 10997/4118/3 11000/4120/3 10998/4121/3 -f 11001/4118/331 11002/4121/331 11004/4120/331 -f 11004/4120/331 11003/4119/331 11001/4118/331 -f 10997/4118/21 10998/4121/21 11002/4121/21 -f 10997/4118/21 11002/4121/21 11001/4118/21 -f 10998/4121/63 11000/4120/63 11004/4120/63 -f 11004/4120/63 11002/4121/63 10998/4121/63 -f 11000/4120/105 10999/4119/105 11003/4119/105 -f 11003/4119/105 11004/4120/105 11000/4120/105 -f 10999/4119/7 10997/4118/7 11001/4118/7 -f 11001/4118/7 11003/4119/7 10999/4119/7 -f 11005/4122/3 11007/4123/3 11008/4124/3 -f 11008/4124/3 11006/4125/3 11005/4122/3 -f 11009/4122/331 11010/4125/331 11012/4124/331 -f 11012/4124/331 11011/4123/331 11009/4122/331 -f 11005/4122/21 11006/4125/21 11010/4125/21 -f 11010/4125/21 11009/4122/21 11005/4122/21 -f 11006/4125/63 11008/4124/63 11012/4124/63 -f 11012/4124/63 11010/4125/63 11006/4125/63 -f 11008/4124/105 11007/4123/105 11011/4123/105 -f 11011/4123/105 11012/4124/105 11008/4124/105 -f 11007/4123/7 11005/4122/7 11009/4122/7 -f 11009/4122/7 11011/4123/7 11007/4123/7 -f 11013/4126/3 11015/4127/3 11016/4128/3 -f 11016/4128/3 11014/4129/3 11013/4126/3 -f 11017/4126/331 11018/4129/331 11020/4128/331 -f 11020/4128/331 11019/4127/331 11017/4126/331 -f 11013/4126/21 11014/4129/21 11018/4129/21 -f 11018/4129/21 11017/4126/21 11013/4126/21 -f 11014/4129/63 11016/4128/63 11020/4128/63 -f 11020/4128/63 11018/4129/63 11014/4129/63 -f 11016/4128/105 11015/4127/105 11019/4127/105 -f 11019/4127/105 11020/4128/105 11016/4128/105 -f 11015/4127/7 11013/4126/7 11017/4126/7 -f 11017/4126/7 11019/4127/7 11015/4127/7 -f 11021/4130/3 11023/4131/3 11024/4132/3 -f 11024/4132/3 11022/4133/3 11021/4130/3 -f 11025/4130/331 11026/4133/331 11028/4132/331 -f 11028/4132/331 11027/4131/331 11025/4130/331 -f 11021/4130/21 11022/4133/21 11026/4133/21 -f 11026/4133/21 11025/4130/21 11021/4130/21 -f 11022/4133/63 11024/4132/63 11028/4132/63 -f 11028/4132/63 11026/4133/63 11022/4133/63 -f 11024/4132/105 11023/4131/105 11027/4131/105 -f 11027/4131/105 11028/4132/105 11024/4132/105 -f 11023/4131/7 11021/4130/7 11025/4130/7 -f 11025/4130/7 11027/4131/7 11023/4131/7 -f 11029/4134/3 11031/4135/3 11032/4136/3 -f 11032/4136/3 11030/4137/3 11029/4134/3 -f 11033/4134/331 11034/4137/331 11036/4136/331 -f 11036/4136/331 11035/4135/331 11033/4134/331 -f 11029/4134/21 11030/4137/21 11034/4137/21 -f 11034/4137/21 11033/4134/21 11029/4134/21 -f 11030/4137/63 11032/4136/63 11036/4136/63 -f 11036/4136/63 11034/4137/63 11030/4137/63 -f 11032/4136/105 11031/4135/105 11035/4135/105 -f 11035/4135/105 11036/4136/105 11032/4136/105 -f 11031/4135/7 11029/4134/7 11033/4134/7 -f 11033/4134/7 11035/4135/7 11031/4135/7 -f 11039/4138/3 11037/4139/3 11040/4140/3 -f 11038/4141/3 11040/4140/3 11037/4139/3 -f 11042/4141/331 11041/4139/331 11044/4140/331 -f 11043/4138/331 11044/4140/331 11041/4139/331 -f 11038/4141/21 11037/4139/21 11042/4141/21 -f 11041/4139/21 11042/4141/21 11037/4139/21 -f 11040/4140/7 11038/4141/7 11044/4140/7 -f 11042/4141/7 11044/4140/7 11038/4141/7 -f 11039/4138/105 11040/4140/105 11043/4138/105 -f 11044/4140/105 11043/4138/105 11040/4140/105 -f 11037/4139/63 11039/4138/63 11041/4139/63 -f 11043/4138/63 11041/4139/63 11039/4138/63 -f 11047/4142/3 11045/4143/3 11048/4144/3 -f 11046/4145/3 11048/4144/3 11045/4143/3 -f 11050/4145/331 11049/4143/331 11052/4144/331 -f 11051/4142/331 11052/4144/331 11049/4143/331 -f 11046/4145/21 11045/4143/21 11050/4145/21 -f 11049/4143/21 11050/4145/21 11045/4143/21 -f 11048/4144/7 11046/4145/7 11052/4144/7 -f 11050/4145/7 11052/4144/7 11046/4145/7 -f 11047/4142/105 11048/4144/105 11051/4142/105 -f 11052/4144/105 11051/4142/105 11048/4144/105 -f 11045/4143/63 11047/4142/63 11049/4143/63 -f 11051/4142/63 11049/4143/63 11047/4142/63 -f 11055/4146/3 11053/4147/3 11056/4148/3 -f 11054/4149/3 11056/4148/3 11053/4147/3 -f 11058/4149/331 11057/4147/331 11060/4148/331 -f 11059/4146/331 11060/4148/331 11057/4147/331 -f 11054/4149/21 11053/4147/21 11058/4149/21 -f 11057/4147/21 11058/4149/21 11053/4147/21 -f 11056/4148/7 11054/4149/7 11060/4148/7 -f 11058/4149/7 11060/4148/7 11054/4149/7 -f 11055/4146/105 11056/4148/105 11059/4146/105 -f 11060/4148/105 11059/4146/105 11056/4148/105 -f 11053/4147/63 11055/4146/63 11057/4147/63 -f 11059/4146/63 11057/4147/63 11055/4146/63 -f 11063/4150/3 11061/4151/3 11064/4152/3 -f 11062/4153/3 11064/4152/3 11061/4151/3 -f 11066/4153/331 11065/4151/331 11068/4152/331 -f 11067/4150/331 11068/4152/331 11065/4151/331 -f 11062/4153/21 11061/4151/21 11066/4153/21 -f 11065/4151/21 11066/4153/21 11061/4151/21 -f 11064/4152/7 11062/4153/7 11068/4152/7 -f 11066/4153/7 11068/4152/7 11062/4153/7 -f 11063/4150/105 11064/4152/105 11067/4150/105 -f 11068/4152/105 11067/4150/105 11064/4152/105 -f 11061/4151/63 11063/4150/63 11065/4151/63 -f 11067/4150/63 11065/4151/63 11063/4150/63 -f 11071/4154/3 11069/4155/3 11072/4156/3 -f 11070/4157/3 11072/4156/3 11069/4155/3 -f 11074/4157/331 11073/4155/331 11076/4156/331 -f 11075/4154/331 11076/4156/331 11073/4155/331 -f 11070/4157/21 11069/4155/21 11074/4157/21 -f 11073/4155/21 11074/4157/21 11069/4155/21 -f 11072/4156/7 11070/4157/7 11076/4156/7 -f 11074/4157/7 11076/4156/7 11070/4157/7 -f 11071/4154/105 11072/4156/105 11075/4154/105 -f 11076/4156/105 11075/4154/105 11072/4156/105 -f 11069/4155/63 11071/4154/63 11073/4155/63 -f 11075/4154/63 11073/4155/63 11071/4154/63 -f 11079/4158/3 11077/4159/3 11080/4160/3 -f 11078/4161/3 11080/4160/3 11077/4159/3 -f 11082/4162/331 11081/4163/331 11084/4164/331 -f 11083/4165/331 11084/4164/331 11081/4163/331 -f 11078/4161/21 11077/4159/21 11082/4162/21 -f 11081/4163/21 11082/4162/21 11077/4159/21 -f 11080/4160/4897 11078/4161/4897 11084/4164/4897 -f 11082/4162/4898 11084/4164/4898 11078/4161/4898 -f 11079/4158/105 11080/4160/105 11083/4165/105 -f 11084/4164/105 11083/4165/105 11080/4160/105 -f 11077/4159/4899 11079/4158/4899 11081/4163/4899 -f 11083/4165/4900 11081/4163/4900 11079/4158/4900 -f 11085/4166/3 11087/4167/3 11088/4168/3 -f 11088/4168/3 11086/4169/3 11085/4166/3 -f 11089/4170/331 11090/4171/331 11092/4172/331 -f 11092/4172/331 11091/4173/331 11089/4170/331 -f 11085/4166/21 11086/4169/21 11090/4171/21 -f 11090/4171/21 11089/4170/21 11085/4166/21 -f 11086/4169/4901 11088/4168/4901 11092/4172/4901 -f 11092/4172/4901 11090/4171/4901 11086/4169/4901 -f 11088/4168/105 11087/4167/105 11091/4173/105 -f 11091/4173/105 11092/4172/105 11088/4168/105 -f 11087/4167/4902 11085/4166/4902 11089/4170/4902 -f 11089/4170/4902 11091/4173/4902 11087/4167/4902 -f 11095/4174/3 11093/4175/3 11096/4176/3 -f 11094/4177/3 11096/4176/3 11093/4175/3 -f 11098/4178/331 11097/4179/331 11100/4180/331 -f 11099/4181/331 11100/4180/331 11097/4179/331 -f 11094/4177/21 11093/4175/21 11098/4178/21 -f 11097/4179/21 11098/4178/21 11093/4175/21 -f 11096/4176/4903 11094/4177/4903 11100/4180/4903 -f 11098/4178/4903 11100/4180/4903 11094/4177/4903 -f 11095/4174/105 11096/4176/105 11099/4181/105 -f 11100/4180/105 11099/4181/105 11096/4176/105 -f 11093/4175/4904 11095/4174/4904 11097/4179/4904 -f 11099/4181/4904 11097/4179/4904 11095/4174/4904 -f 11101/4182/3 11103/4183/3 11104/4184/3 -f 11104/4184/3 11102/4185/3 11101/4182/3 -f 11105/4186/331 11106/4187/331 11108/4188/331 -f 11108/4188/331 11107/4189/331 11105/4186/331 -f 11101/4182/21 11102/4185/21 11106/4187/21 -f 11106/4187/21 11105/4186/21 11101/4182/21 -f 11102/4185/4901 11104/4184/4901 11108/4188/4901 -f 11108/4188/4901 11106/4187/4901 11102/4185/4901 -f 11104/4184/3722 11103/4183/3722 11107/4189/3722 -f 11107/4189/3722 11108/4188/3722 11104/4184/3722 -f 11103/4183/4902 11101/4182/4902 11105/4186/4902 -f 11105/4186/4902 11107/4189/4902 11103/4183/4902 -f 11111/4190/3 11109/4191/3 11112/4192/3 -f 11110/4193/3 11112/4192/3 11109/4191/3 -f 11114/4194/331 11113/4195/331 11116/4196/331 -f 11115/4197/331 11116/4196/331 11113/4195/331 -f 11110/4193/21 11109/4191/21 11114/4194/21 -f 11113/4195/21 11114/4194/21 11109/4191/21 -f 11112/4192/4903 11110/4193/4903 11116/4196/4903 -f 11114/4194/4903 11116/4196/4903 11110/4193/4903 -f 11111/4190/3722 11112/4192/3722 11115/4197/3722 -f 11116/4196/3722 11115/4197/3722 11112/4192/3722 -f 11109/4191/4904 11111/4190/4904 11113/4195/4904 -f 11115/4197/4904 11113/4195/4904 11111/4190/4904 -f 11117/4198/3 11119/4199/3 11120/4200/3 -f 11120/4200/3 11118/4201/3 11117/4198/3 -f 11121/4198/331 11122/4201/331 11124/4200/331 -f 11124/4200/331 11123/4199/331 11121/4198/331 -f 11117/4198/21 11118/4201/21 11122/4201/21 -f 11122/4201/21 11121/4198/21 11117/4198/21 -f 11118/4201/63 11120/4200/63 11124/4200/63 -f 11124/4200/63 11122/4201/63 11118/4201/63 -f 11120/4200/105 11119/4199/105 11123/4199/105 -f 11123/4199/105 11124/4200/105 11120/4200/105 -f 11119/4199/7 11117/4198/7 11121/4198/7 -f 11121/4198/7 11123/4199/7 11119/4199/7 -f 11125/4202/3 11127/4203/3 11128/4204/3 -f 11128/4204/3 11126/4205/3 11125/4202/3 -f 11129/4202/331 11130/4205/331 11132/4204/331 -f 11132/4204/331 11131/4203/331 11129/4202/331 -f 11125/4202/21 11126/4205/21 11130/4205/21 -f 11130/4205/21 11129/4202/21 11125/4202/21 -f 11126/4205/63 11128/4204/63 11132/4204/63 -f 11132/4204/63 11130/4205/63 11126/4205/63 -f 11128/4204/105 11127/4203/105 11131/4203/105 -f 11131/4203/105 11132/4204/105 11128/4204/105 -f 11127/4203/7 11125/4202/7 11129/4202/7 -f 11129/4202/7 11131/4203/7 11127/4203/7 -f 11133/4206/3 11135/4207/3 11136/4208/3 -f 11136/4208/3 11134/4209/3 11133/4206/3 -f 11137/4206/331 11138/4209/331 11140/4208/331 -f 11140/4208/331 11139/4207/331 11137/4206/331 -f 11133/4206/21 11134/4209/21 11138/4209/21 -f 11138/4209/21 11137/4206/21 11133/4206/21 -f 11134/4209/63 11136/4208/63 11140/4208/63 -f 11140/4208/63 11138/4209/63 11134/4209/63 -f 11136/4208/105 11135/4207/105 11139/4207/105 -f 11139/4207/105 11140/4208/105 11136/4208/105 -f 11135/4207/7 11133/4206/7 11137/4206/7 -f 11137/4206/7 11139/4207/7 11135/4207/7 -f 11141/4210/3 11143/4211/3 11144/4212/3 -f 11144/4212/3 11142/4213/3 11141/4210/3 -f 11145/4210/331 11146/4213/331 11148/4212/331 -f 11148/4212/331 11147/4211/331 11145/4210/331 -f 11141/4210/21 11142/4213/21 11146/4213/21 -f 11146/4213/21 11145/4210/21 11141/4210/21 -f 11142/4213/63 11144/4212/63 11148/4212/63 -f 11148/4212/63 11146/4213/63 11142/4213/63 -f 11144/4212/105 11143/4211/105 11147/4211/105 -f 11147/4211/105 11148/4212/105 11144/4212/105 -f 11143/4211/7 11141/4210/7 11145/4210/7 -f 11145/4210/7 11147/4211/7 11143/4211/7 -f 11149/4214/3 11151/4215/3 11152/4216/3 -f 11152/4216/3 11150/4217/3 11149/4214/3 -f 11153/4214/331 11154/4217/331 11156/4216/331 -f 11156/4216/331 11155/4215/331 11153/4214/331 -f 11149/4214/21 11150/4217/21 11154/4217/21 -f 11154/4217/21 11153/4214/21 11149/4214/21 -f 11150/4217/63 11152/4216/63 11156/4216/63 -f 11156/4216/63 11154/4217/63 11150/4217/63 -f 11152/4216/105 11151/4215/105 11155/4215/105 -f 11155/4215/105 11156/4216/105 11152/4216/105 -f 11151/4215/7 11149/4214/7 11153/4214/7 -f 11153/4214/7 11155/4215/7 11151/4215/7 -f 11159/4218/3 11157/4219/3 11160/4220/3 -f 11158/4221/3 11160/4220/3 11157/4219/3 -f 11162/4221/331 11161/4219/331 11164/4220/331 -f 11163/4218/331 11164/4220/331 11161/4219/331 -f 11158/4221/21 11157/4219/21 11162/4221/21 -f 11161/4219/21 11162/4221/21 11157/4219/21 -f 11160/4220/7 11158/4221/7 11164/4220/7 -f 11162/4221/7 11164/4220/7 11158/4221/7 -f 11159/4218/105 11160/4220/105 11163/4218/105 -f 11164/4220/105 11163/4218/105 11160/4220/105 -f 11157/4219/63 11159/4218/63 11161/4219/63 -f 11163/4218/63 11161/4219/63 11159/4218/63 -f 11167/4222/3 11165/4223/3 11168/4224/3 -f 11166/4225/3 11168/4224/3 11165/4223/3 -f 11170/4225/331 11169/4223/331 11172/4224/331 -f 11171/4222/331 11172/4224/331 11169/4223/331 -f 11166/4225/21 11165/4223/21 11170/4225/21 -f 11169/4223/21 11170/4225/21 11165/4223/21 -f 11168/4224/7 11166/4225/7 11172/4224/7 -f 11170/4225/7 11172/4224/7 11166/4225/7 -f 11167/4222/105 11168/4224/105 11171/4222/105 -f 11172/4224/105 11171/4222/105 11168/4224/105 -f 11165/4223/63 11167/4222/63 11169/4223/63 -f 11171/4222/63 11169/4223/63 11167/4222/63 -f 11175/4226/3 11173/4227/3 11176/4228/3 -f 11174/4229/3 11176/4228/3 11173/4227/3 -f 11178/4229/331 11177/4227/331 11180/4228/331 -f 11179/4226/331 11180/4228/331 11177/4227/331 -f 11174/4229/21 11173/4227/21 11178/4229/21 -f 11177/4227/21 11178/4229/21 11173/4227/21 -f 11176/4228/7 11174/4229/7 11180/4228/7 -f 11178/4229/7 11180/4228/7 11174/4229/7 -f 11175/4226/105 11176/4228/105 11179/4226/105 -f 11180/4228/105 11179/4226/105 11176/4228/105 -f 11173/4227/63 11175/4226/63 11177/4227/63 -f 11179/4226/63 11177/4227/63 11175/4226/63 -f 11183/4230/3 11181/4231/3 11184/4232/3 -f 11182/4233/3 11184/4232/3 11181/4231/3 -f 11186/4233/331 11185/4231/331 11188/4232/331 -f 11187/4230/331 11188/4232/331 11185/4231/331 -f 11182/4233/21 11181/4231/21 11186/4233/21 -f 11185/4231/21 11186/4233/21 11181/4231/21 -f 11184/4232/7 11182/4233/7 11188/4232/7 -f 11186/4233/7 11188/4232/7 11182/4233/7 -f 11183/4230/105 11184/4232/105 11187/4230/105 -f 11188/4232/105 11187/4230/105 11184/4232/105 -f 11181/4231/63 11183/4230/63 11185/4231/63 -f 11187/4230/63 11185/4231/63 11183/4230/63 -f 11191/4234/3 11189/4235/3 11192/4236/3 -f 11190/4237/3 11192/4236/3 11189/4235/3 -f 11194/4237/331 11193/4235/331 11196/4236/331 -f 11195/4234/331 11196/4236/331 11193/4235/331 -f 11190/4237/21 11189/4235/21 11194/4237/21 -f 11193/4235/21 11194/4237/21 11189/4235/21 -f 11192/4236/7 11190/4237/7 11196/4236/7 -f 11194/4237/7 11196/4236/7 11190/4237/7 -f 11191/4234/105 11192/4236/105 11195/4234/105 -f 11196/4236/105 11195/4234/105 11192/4236/105 -f 11189/4235/63 11191/4234/63 11193/4235/63 -f 11195/4234/63 11193/4235/63 11191/4234/63 -f 11199/4238/3 11197/4239/3 11200/4240/3 -f 11198/4241/3 11200/4240/3 11197/4239/3 -f 11202/4242/331 11201/4243/331 11204/4244/331 -f 11203/4245/331 11204/4244/331 11201/4243/331 -f 11198/4241/21 11197/4239/21 11202/4242/21 -f 11201/4243/21 11202/4242/21 11197/4239/21 -f 11200/4240/4905 11198/4241/4905 11204/4244/4905 -f 11202/4242/4906 11204/4244/4906 11198/4241/4906 -f 11199/4238/105 11200/4240/105 11203/4245/105 -f 11204/4244/105 11203/4245/105 11200/4240/105 -f 11197/4239/4907 11199/4238/4907 11201/4243/4907 -f 11203/4245/4908 11201/4243/4908 11199/4238/4908 -f 11205/4246/3 11207/4247/3 11208/4248/3 -f 11208/4248/3 11206/4249/3 11205/4246/3 -f 11209/4250/331 11210/4251/331 11212/4252/331 -f 11212/4252/331 11211/4253/331 11209/4250/331 -f 11205/4246/3743 11206/4249/3743 11210/4251/3743 -f 11210/4251/3743 11209/4250/3743 11205/4246/3743 -f 11206/4249/4909 11208/4248/4909 11212/4252/4909 -f 11212/4252/4909 11210/4251/4909 11206/4249/4909 -f 11208/4248/105 11207/4247/105 11211/4253/105 -f 11211/4253/105 11212/4252/105 11208/4248/105 -f 11207/4247/4910 11205/4246/4910 11209/4250/4910 -f 11209/4250/4910 11211/4253/4910 11207/4247/4910 -f 11215/4254/3 11213/4255/3 11216/4256/3 -f 11214/4257/3 11216/4256/3 11213/4255/3 -f 11218/4258/331 11217/4259/331 11220/4260/331 -f 11219/4261/331 11220/4260/331 11217/4259/331 -f 11214/4257/3743 11213/4255/3743 11218/4258/3743 -f 11217/4259/3743 11218/4258/3743 11213/4255/3743 -f 11216/4256/4911 11214/4257/4911 11220/4260/4911 -f 11218/4258/4911 11220/4260/4911 11214/4257/4911 -f 11215/4254/105 11216/4256/105 11219/4261/105 -f 11220/4260/105 11219/4261/105 11216/4256/105 -f 11213/4255/4912 11215/4254/4912 11217/4259/4912 -f 11219/4261/4912 11217/4259/4912 11215/4254/4912 -f 11221/4262/3 11223/4263/3 11224/4264/3 -f 11224/4264/3 11222/4265/3 11221/4262/3 -f 11225/4266/331 11226/4267/331 11228/4268/331 -f 11228/4268/331 11227/4269/331 11225/4266/331 -f 11221/4262/21 11222/4265/21 11226/4267/21 -f 11226/4267/21 11225/4266/21 11221/4262/21 -f 11222/4265/4913 11224/4264/4913 11228/4268/4913 -f 11228/4268/4913 11226/4267/4913 11222/4265/4913 -f 11224/4264/105 11223/4263/105 11227/4269/105 -f 11227/4269/105 11228/4268/105 11224/4264/105 -f 11223/4263/4910 11221/4262/4910 11225/4266/4910 -f 11225/4266/4910 11227/4269/4910 11223/4263/4910 -f 11231/4270/3 11229/4271/3 11232/4272/3 -f 11230/4273/3 11232/4272/3 11229/4271/3 -f 11234/4274/331 11233/4275/331 11236/4276/331 -f 11235/4277/331 11236/4276/331 11233/4275/331 -f 11230/4273/21 11229/4271/21 11234/4274/21 -f 11233/4275/21 11234/4274/21 11229/4271/21 -f 11232/4272/4911 11230/4273/4911 11236/4276/4911 -f 11234/4274/4911 11236/4276/4911 11230/4273/4911 -f 11231/4270/105 11232/4272/105 11235/4277/105 -f 11236/4276/105 11235/4277/105 11232/4272/105 -f 11229/4271/4912 11231/4270/4912 11233/4275/4912 -f 11235/4277/4912 11233/4275/4912 11231/4270/4912 -f 11237/4278/4914 11239/4279/4914 11240/4280/4914 -f 11240/4280/4915 11238/4281/4915 11237/4278/4915 -f 11241/4282/4916 11242/4283/4916 11244/4284/4916 -f 11244/4284/4916 11243/4285/4916 11241/4282/4916 -f 11237/4278/21 11238/4281/21 11242/4283/21 -f 11242/4283/21 11241/4282/21 11237/4278/21 -f 11238/4281/4917 11240/4280/4917 11244/4284/4917 -f 11244/4284/4917 11242/4283/4917 11238/4281/4917 -f 11240/4280/105 11239/4279/105 11243/4285/105 -f 11243/4285/105 11244/4284/105 11240/4280/105 -f 11239/4279/4918 11237/4278/4918 11241/4282/4918 -f 11241/4282/4918 11243/4285/4918 11239/4279/4918 -f 11245/4286/4915 11247/4287/4915 11248/4288/4915 -f 11248/4288/4915 11246/4289/4915 11245/4286/4915 -f 11249/4290/4919 11250/4291/4919 11252/4292/4919 -f 11252/4292/4920 11251/4293/4920 11249/4290/4920 -f 11245/4286/21 11246/4289/21 11250/4291/21 -f 11250/4291/21 11249/4290/21 11245/4286/21 -f 11246/4289/4921 11248/4288/4921 11252/4292/4921 -f 11252/4292/4921 11250/4291/4921 11246/4289/4921 -f 11248/4288/105 11247/4287/105 11251/4293/105 -f 11251/4293/105 11252/4292/105 11248/4288/105 -f 11247/4287/4922 11245/4286/4922 11249/4290/4922 -f 11249/4290/4922 11251/4293/4922 11247/4287/4922 -f 11253/4294/4923 11255/4295/4923 11256/4296/4923 -f 11256/4296/4915 11254/4297/4915 11253/4294/4915 -f 11257/4298/4916 11258/4299/4916 11260/4300/4916 -f 11260/4300/4924 11259/4301/4924 11257/4298/4924 -f 11253/4294/21 11254/4297/21 11258/4299/21 -f 11258/4299/21 11257/4298/21 11253/4294/21 -f 11254/4297/4925 11256/4296/4925 11260/4300/4925 -f 11260/4300/4925 11258/4299/4925 11254/4297/4925 -f 11256/4296/105 11255/4295/105 11259/4301/105 -f 11259/4301/105 11260/4300/105 11256/4296/105 -f 11255/4295/4926 11253/4294/4926 11257/4298/4926 -f 11257/4298/4926 11259/4301/4926 11255/4295/4926 -f 11261/4302/4927 11263/4303/4927 11264/4304/4927 -f 11264/4304/4928 11262/4305/4928 11261/4302/4928 -f 11265/4306/4919 11266/4307/4919 11268/4308/4919 -f 11268/4308/4929 11267/4309/4929 11265/4306/4929 -f 11261/4302/21 11262/4305/21 11266/4307/21 -f 11266/4307/21 11265/4306/21 11261/4302/21 -f 11262/4305/4930 11264/4304/4930 11268/4308/4930 -f 11268/4308/4930 11266/4307/4930 11262/4305/4930 -f 11264/4304/105 11263/4303/105 11267/4309/105 -f 11267/4309/105 11268/4308/105 11264/4304/105 -f 11263/4303/4931 11261/4302/4931 11265/4306/4931 -f 11265/4306/4931 11267/4309/4931 11263/4303/4931 -f 11269/4310/4932 11271/4311/4932 11272/4312/4932 -f 11272/4312/4923 11270/4313/4923 11269/4310/4923 -f 11273/4314/4933 11274/4315/4933 11276/4316/4933 -f 11276/4316/4934 11275/4317/4934 11273/4314/4934 -f 11269/4310/21 11270/4313/21 11274/4315/21 -f 11274/4315/21 11273/4314/21 11269/4310/21 -f 11270/4313/4935 11272/4312/4935 11276/4316/4935 -f 11276/4316/4925 11274/4315/4925 11270/4313/4925 -f 11272/4312/105 11271/4311/105 11275/4317/105 -f 11275/4317/105 11276/4316/105 11272/4312/105 -f 11271/4311/4936 11269/4310/4936 11273/4314/4936 -f 11273/4314/4936 11275/4317/4936 11271/4311/4936 -f 11279/4318/4937 11277/4319/4937 11280/4320/4937 -f 11278/4321/4938 11280/4320/4938 11277/4319/4938 -f 11282/4322/4939 11281/4323/4939 11284/4324/4939 -f 11283/4325/4940 11284/4324/4940 11281/4323/4940 -f 11278/4321/21 11277/4319/21 11282/4322/21 -f 11281/4323/21 11282/4322/21 11277/4319/21 -f 11280/4320/4941 11278/4321/4941 11284/4324/4941 -f 11282/4322/4941 11284/4324/4941 11278/4321/4941 -f 11279/4318/105 11280/4320/105 11283/4325/105 -f 11284/4324/105 11283/4325/105 11280/4320/105 -f 11277/4319/4942 11279/4318/4942 11281/4323/4942 -f 11283/4325/4942 11281/4323/4942 11279/4318/4942 -f 11287/4326/4943 11285/4327/4943 11288/4328/4943 -f 11286/4329/4943 11288/4328/4943 11285/4327/4943 -f 11290/4330/4944 11289/4331/4944 11292/4332/4944 -f 11291/4333/4945 11292/4332/4945 11289/4331/4945 -f 11286/4329/21 11285/4327/21 11290/4330/21 -f 11289/4331/21 11290/4330/21 11285/4327/21 -f 11288/4328/4946 11286/4329/4946 11292/4332/4946 -f 11290/4330/4946 11292/4332/4946 11286/4329/4946 -f 11287/4326/105 11288/4328/105 11291/4333/105 -f 11292/4332/105 11291/4333/105 11288/4328/105 -f 11285/4327/4947 11287/4326/4947 11289/4331/4947 -f 11291/4333/4947 11289/4331/4947 11287/4326/4947 -f 11295/4334/4943 11293/4335/4943 11296/4336/4943 -f 11294/4337/4943 11296/4336/4943 11293/4335/4943 -f 11298/4338/4945 11297/4339/4945 11300/4340/4945 -f 11299/4341/4945 11300/4340/4945 11297/4339/4945 -f 11294/4337/21 11293/4335/21 11298/4338/21 -f 11297/4339/21 11298/4338/21 11293/4335/21 -f 11296/4336/4946 11294/4337/4946 11300/4340/4946 -f 11298/4338/4946 11300/4340/4946 11294/4337/4946 -f 11295/4334/105 11296/4336/105 11299/4341/105 -f 11300/4340/105 11299/4341/105 11296/4336/105 -f 11293/4335/4948 11295/4334/4948 11297/4339/4948 -f 11299/4341/4948 11297/4339/4948 11295/4334/4948 -f 11303/4342/4943 11301/4343/4943 11304/4344/4943 -f 11302/4345/4943 11304/4344/4943 11301/4343/4943 -f 11306/4346/4940 11305/4347/4940 11308/4348/4940 -f 11307/4349/4940 11308/4348/4940 11305/4347/4940 -f 11302/4345/21 11301/4343/21 11306/4346/21 -f 11305/4347/21 11306/4346/21 11301/4343/21 -f 11304/4344/4949 11302/4345/4949 11308/4348/4949 -f 11306/4346/4949 11308/4348/4949 11302/4345/4949 -f 11303/4342/105 11304/4344/105 11307/4349/105 -f 11308/4348/105 11307/4349/105 11304/4344/105 -f 11301/4343/4950 11303/4342/4950 11305/4347/4950 -f 11307/4349/4950 11305/4347/4950 11303/4342/4950 -f 11311/4350/4951 11309/4351/4951 11312/4352/4951 -f 11310/4353/4951 11312/4352/4951 11309/4351/4951 -f 11314/4354/4952 11313/4355/4952 11316/4356/4952 -f 11315/4357/4952 11316/4356/4952 11313/4355/4952 -f 11310/4353/21 11309/4351/21 11314/4354/21 -f 11313/4355/21 11314/4354/21 11309/4351/21 -f 11312/4352/4946 11310/4353/4946 11316/4356/4946 -f 11314/4354/4946 11316/4356/4946 11310/4353/4946 -f 11311/4350/105 11312/4352/105 11315/4357/105 -f 11316/4356/105 11315/4357/105 11312/4352/105 -f 11309/4351/4947 11311/4350/4947 11313/4355/4947 -f 11315/4357/4947 11313/4355/4947 11311/4350/4947 -f 11319/4358/4953 11317/4359/4953 11320/4360/4953 -f 11318/4361/4953 11320/4360/4953 11317/4359/4953 -f 11322/4362/4954 11321/4363/4954 11324/4364/4954 -f 11323/4365/4954 11324/4364/4954 11321/4363/4954 -f 11318/4361/21 11317/4359/21 11322/4362/21 -f 11321/4363/21 11322/4362/21 11317/4359/21 -f 11320/4360/4955 11318/4361/4955 11324/4364/4955 -f 11322/4362/4956 11324/4364/4956 11318/4361/4956 -f 11319/4358/105 11320/4360/105 11323/4365/105 -f 11324/4364/105 11323/4365/105 11320/4360/105 -f 11317/4359/4957 11319/4358/4957 11321/4363/4957 -f 11323/4365/4958 11321/4363/4958 11319/4358/4958 -f 11325/4366/4923 11327/4367/4923 11328/4368/4923 -f 11328/4368/4923 11326/4369/4923 11325/4366/4923 -f 11329/4370/4919 11330/4371/4919 11332/4372/4919 -f 11332/4372/4919 11331/4373/4919 11329/4370/4919 -f 11325/4366/21 11326/4369/21 11330/4371/21 -f 11330/4371/21 11329/4370/21 11325/4366/21 -f 11326/4369/4959 11328/4368/4959 11332/4372/4959 -f 11332/4372/4959 11330/4371/4959 11326/4369/4959 -f 11328/4368/105 11327/4367/105 11331/4373/105 -f 11331/4373/105 11332/4372/105 11328/4368/105 -f 11327/4367/4960 11325/4366/4960 11329/4370/4960 -f 11329/4370/4960 11331/4373/4960 11327/4367/4960 -f 11335/4374/4938 11333/4375/4938 11336/4376/4938 -f 11334/4377/4938 11336/4376/4938 11333/4375/4938 -f 11338/4378/4945 11337/4379/4945 11340/4380/4945 -f 11339/4381/4945 11340/4380/4945 11337/4379/4945 -f 11334/4377/21 11333/4375/21 11338/4378/21 -f 11337/4379/21 11338/4378/21 11333/4375/21 -f 11336/4376/4961 11334/4377/4961 11340/4380/4961 -f 11338/4378/4961 11340/4380/4961 11334/4377/4961 -f 11335/4374/105 11336/4376/105 11339/4381/105 -f 11340/4380/105 11339/4381/105 11336/4376/105 -f 11333/4375/4962 11335/4374/4962 11337/4379/4962 -f 11339/4381/4962 11337/4379/4962 11335/4374/4962 -f 11341/4382/4963 11343/4383/4963 11344/4384/4963 -f 11344/4384/4964 11342/4385/4964 11341/4382/4964 -f 11345/4386/4919 11346/4387/4919 11348/4388/4919 -f 11348/4388/4919 11347/4389/4919 11345/4386/4919 -f 11341/4382/21 11342/4385/21 11346/4387/21 -f 11346/4387/21 11345/4386/21 11341/4382/21 -f 11342/4385/4965 11344/4384/4965 11348/4388/4965 -f 11348/4388/4959 11346/4387/4959 11342/4385/4959 -f 11344/4384/105 11343/4383/105 11347/4389/105 -f 11347/4389/105 11348/4388/105 11344/4384/105 -f 11343/4383/4960 11341/4382/4960 11345/4386/4960 -f 11345/4386/4960 11347/4389/4960 11343/4383/4960 -f 11351/4390/4938 11349/4391/4938 11352/4392/4938 -f 11350/4393/4938 11352/4392/4938 11349/4391/4938 -f 11354/4394/4945 11353/4395/4945 11356/4396/4945 -f 11355/4397/4945 11356/4396/4945 11353/4395/4945 -f 11350/4393/21 11349/4391/21 11354/4394/21 -f 11353/4395/21 11354/4394/21 11349/4391/21 -f 11352/4392/4961 11350/4393/4961 11356/4396/4961 -f 11354/4394/4961 11356/4396/4961 11350/4393/4961 -f 11351/4390/105 11352/4392/105 11355/4397/105 -f 11356/4396/105 11355/4397/105 11352/4392/105 -f 11349/4391/4962 11351/4390/4962 11353/4395/4962 -f 11355/4397/4962 11353/4395/4962 11351/4390/4962 -o diescel1 -v 1.568650 0.939638 4.205615 -v 1.566468 0.970314 4.145766 -v 1.568531 0.941317 4.095775 -v 1.566468 0.970314 4.045747 -v 1.568531 0.941317 3.995721 -v 1.566468 0.970314 3.945694 -v 1.568129 0.939765 3.895751 -v 1.566468 0.970314 3.846585 -v 1.568530 0.941317 3.796558 -v 1.566468 0.970314 3.746531 -v 1.568118 0.941307 3.697373 -v 1.566467 0.970314 3.645339 -v 1.568530 0.941317 3.596447 -v 1.566467 0.970314 3.546419 -v 1.568530 0.941317 3.497529 -v 1.566467 0.970314 3.447502 -v 1.568530 0.941317 3.397475 -v 1.566467 0.970315 3.347448 -v 1.568530 0.941318 3.296745 -v 1.566467 0.970315 3.246718 -v 1.568122 0.940530 3.196421 -v 1.566467 0.970315 3.147801 -v 1.568530 0.941318 3.097774 -v 1.566467 0.970315 3.047747 -v 1.568529 0.941318 2.998277 -v 1.566466 0.970315 2.948250 -v 1.568119 0.940566 2.899584 -v 1.566466 0.970315 2.848195 -v 1.568529 0.941318 2.798165 -v 1.566466 0.970315 2.748138 -v 1.568118 0.941276 2.698358 -v 1.566466 0.970315 2.649002 -v 1.568529 0.941318 2.598942 -v 1.566466 0.970315 2.549357 -v 1.568529 0.941318 2.499330 -v 1.566466 0.970316 2.449302 -v 1.568528 0.941319 2.400410 -v 1.566466 0.970316 2.350380 -v 1.568528 0.941319 2.300355 -v 1.566465 0.970316 2.250622 -v 1.568111 0.939970 2.201785 -v 1.566465 0.970317 2.150519 -v 1.568678 0.939216 2.093021 -v 0.802168 0.887129 2.091790 -v 0.800954 0.917680 2.150144 -v 0.803017 0.888684 2.200220 -v 0.800954 0.917681 2.250247 -v 0.802608 0.888667 2.298717 -v 0.800954 0.917681 2.350379 -v 0.802606 0.888701 2.400319 -v 0.800954 0.917681 2.449301 -v 0.803017 0.888684 2.499329 -v 0.800955 0.917681 2.549356 -v 0.802603 0.888575 2.597593 -v 0.800955 0.917681 2.649001 -v 0.802615 0.888569 2.698760 -v 0.800955 0.917681 2.748137 -v 0.803018 0.888684 2.798164 -v 0.800955 0.917681 2.848194 -v 0.802608 0.888676 2.898180 -v 0.800955 0.917680 2.948248 -v 0.803018 0.888683 2.998275 -v 0.800955 0.917680 3.047746 -v 0.802599 0.886698 3.096807 -v 0.800955 0.917680 3.147799 -v 0.803018 0.888683 3.197827 -v 0.800956 0.917680 3.246717 -v 0.803018 0.888683 3.296744 -v 0.800956 0.917680 3.347447 -v 0.803019 0.888683 3.397474 -v 0.800956 0.917680 3.447501 -v 0.803019 0.888683 3.497528 -v 0.800956 0.917680 3.546418 -v 0.802611 0.888662 3.594321 -v 0.800956 0.917680 3.645338 -v 0.802607 0.888715 3.697372 -v 0.800956 0.917680 3.746530 -v 0.802608 0.888697 3.795832 -v 0.800957 0.917679 3.846584 -v 0.802618 0.887875 3.895750 -v 0.800957 0.917679 3.945693 -v 0.803019 0.888682 3.995719 -v 0.800957 0.917679 4.045746 -v 0.802606 0.888749 4.095835 -v 0.801131 0.918595 4.144407 -v 0.803025 0.887172 4.204730 -vt 0.997303 0.999582 -vt 0.000036 1.000000 -vt 0.002878 0.971687 -vt 0.999770 0.971044 -vt 0.002882 0.027783 -vt 0.000000 0.000582 -vt 0.998419 -0.000000 -vt 1.000000 0.027606 -vt 0.997313 0.051295 -vt 0.000738 0.052036 -vt 0.002881 0.075140 -vt 0.997849 0.948066 -vt 1.000000 0.074962 -vt 0.997846 0.097892 -vt 0.000191 0.948038 -vt 0.002878 0.924371 -vt 0.999997 0.924370 -vt 0.997311 0.900704 -vt 0.000192 0.900704 -vt 0.002879 0.877038 -vt 0.999997 0.877037 -vt 0.997833 0.853410 -vt 0.000715 0.853411 -vt 0.002879 0.830152 -vt 0.999997 0.830151 -vt 0.997846 0.806142 -vt 0.000192 0.806485 -vt 0.002879 0.782818 -vt 0.999998 0.782818 -vt 0.997848 0.759562 -vt 0.000729 0.759563 -vt 0.002879 0.734947 -vt 0.999998 0.734947 -vt 0.997843 0.710811 -vt 0.000192 0.711817 -vt 0.002879 0.688151 -vt 0.999998 0.688150 -vt 0.997311 0.665021 -vt 0.000193 0.665022 -vt 0.002879 0.641355 -vt 0.999998 0.641355 -vt 0.997311 0.617688 -vt 0.000193 0.617689 -vt 0.002879 0.594022 -vt 0.999998 0.594021 -vt 0.997312 0.570035 -vt 0.000193 0.570035 -vt 0.002880 0.546369 -vt 0.999998 0.546368 -vt 0.997312 0.523239 -vt 0.000723 0.522575 -vt 0.002880 0.499574 -vt 0.999999 0.499573 -vt 0.997857 0.475450 -vt 0.000193 0.475907 -vt 0.002880 0.452240 -vt 0.999999 0.452240 -vt 0.997312 0.428837 -vt 0.000193 0.428837 -vt 0.002880 0.405171 -vt 0.999999 0.405170 -vt 0.997846 0.381484 -vt 0.000727 0.382148 -vt 0.002880 0.357837 -vt 0.999999 0.357837 -vt 0.997312 0.334169 -vt 0.000193 0.334169 -vt 0.002881 0.310503 -vt 0.999999 0.310502 -vt 0.997837 0.287143 -vt 0.000729 0.286953 -vt 0.002881 0.263604 -vt 0.999999 0.263603 -vt 0.997853 0.239283 -vt 0.000194 0.239921 -vt 0.002881 0.216464 -vt 0.999999 0.216463 -vt 0.997313 0.192797 -vt 0.000194 0.192797 -vt 0.002881 0.169131 -vt 1.000000 0.169130 -vt 0.997849 0.145957 -vt 0.000194 0.146001 -vt 0.002881 0.122333 -vt 1.000000 0.122332 -vt 0.000194 0.098667 -vn -0.061333 0.887327 0.457043 -vn -0.060591 0.884475 0.462636 -vn -0.058838 0.877106 -0.476679 -vn -0.060541 0.883781 -0.463967 -vn -0.059572 0.862791 0.502039 -vn -0.058572 0.858228 0.509916 -vn -0.055710 0.847220 -0.528314 -vn -0.056502 0.849884 -0.523931 -vn -0.059064 0.862600 -0.502427 -vn -0.059084 0.855637 0.514194 -vn -0.059230 0.862432 -0.502696 -vn -0.059163 0.862598 0.502419 -vn -0.059377 0.863568 0.500724 -vn -0.059308 0.862585 -0.502425 -vn -0.059308 0.862582 -0.502428 -vn -0.059310 0.862582 0.502428 -vn -0.059310 0.862582 0.502429 -vn -0.058881 0.856364 -0.513004 -vn -0.057671 0.850798 -0.522319 -vn -0.057423 0.847120 0.528289 -vn -0.058637 0.852794 0.518945 -vn -0.059543 0.866001 -0.496484 -vn -0.058788 0.862622 -0.502422 -vn -0.059735 0.862556 0.502423 -vn -0.059112 0.859703 0.507362 -vn -0.059075 0.859194 -0.508229 -vn -0.059005 0.858868 -0.508786 -vn -0.059845 0.871075 0.487491 -vn -0.059914 0.871376 0.486944 -vn -0.059602 0.866852 -0.494989 -vn -0.057541 0.857618 -0.511057 -vn -0.060689 0.862488 0.502426 -vn -0.058646 0.852934 0.518713 -vn -0.058959 0.857507 -0.511082 -vn -0.058959 0.857508 -0.511081 -vn -0.059310 0.862585 0.502424 -vn -0.059310 0.862584 0.502425 -vn -0.059308 0.862584 -0.502425 -vn -0.059308 0.862585 -0.502423 -vn -0.059507 0.865483 -0.497391 -vn -0.059508 0.865485 -0.497387 -vn -0.059310 0.862584 0.502426 -vn -0.059085 0.858091 -0.510086 -vn -0.056673 0.850489 0.522931 -vn -0.058602 0.852313 -0.519739 -vn -0.060870 0.862476 -0.502424 -vn -0.062132 0.862384 0.502428 -vn -0.057978 0.843218 0.534436 -vn -0.059140 0.860132 -0.506632 -vn -0.059139 0.860129 -0.506636 -vn -0.059332 0.862921 -0.501843 -vn -0.056727 0.850984 -0.522120 -vn -0.059424 0.863086 0.501548 -vn -0.059308 0.862559 0.502468 -vn -0.059309 0.862598 -0.502401 -vn -0.059309 0.862597 -0.502403 -vn -0.059066 0.859058 -0.508460 -vn -0.059574 0.861382 -0.504452 -vn -0.058915 0.859528 0.507682 -vn -0.059184 0.860756 0.505566 -vn -0.059670 0.867835 -0.493256 -vn -0.058529 0.862784 -0.502173 -vn -0.060151 0.860570 0.505767 -vn -0.058709 0.853847 0.517203 -vn -0.059308 0.862586 -0.502422 -vn -0.059309 0.862588 -0.502419 -vn -0.059012 0.858275 -0.509786 -vn -0.058850 0.857527 -0.511061 -vn -0.059319 0.862595 0.502405 -vn -0.059307 0.862540 0.502502 -vn -0.059786 0.869529 -0.490250 -vn -0.106284 0.994336 0.000001 -vn 0.997479 0.070959 -0.000002 -s off -f 11442/4398/4966 11357/4399/4966 11358/4400/4966 -f 11441/4401/4967 11442/4398/4967 11358/4400/4967 -f 11398/4402/4968 11399/4403/4968 11400/4404/4968 -f 11398/4402/4969 11400/4404/4969 11401/4405/4969 -f 11398/4402/4970 11401/4405/4970 11402/4406/4970 -f 11397/4407/4971 11398/4402/4971 11402/4406/4971 -f 11396/4408/4972 11397/4407/4972 11402/4406/4972 -f 11440/4409/4973 11441/4401/4973 11358/4400/4973 -f 11396/4408/4974 11402/4406/4974 11403/4410/4974 -f 11396/4408/4975 11403/4410/4975 11404/4411/4975 -f 11440/4409/4976 11358/4400/4976 11359/4412/4976 -f 11440/4409/4977 11359/4412/4977 11360/4413/4977 -f 11439/4414/4978 11440/4409/4978 11360/4413/4978 -f 11438/4415/4979 11439/4414/4979 11360/4413/4979 -f 11438/4415/4980 11360/4413/4980 11361/4416/4980 -f 11438/4415/4981 11361/4416/4981 11362/4417/4981 -f 11437/4418/4982 11438/4415/4982 11362/4417/4982 -f 11436/4419/4983 11437/4418/4983 11362/4417/4983 -f 11436/4419/4984 11362/4417/4984 11363/4420/4984 -f 11436/4419/4985 11363/4420/4985 11364/4421/4985 -f 11435/4422/4986 11436/4419/4986 11364/4421/4986 -f 11434/4423/4987 11435/4422/4987 11364/4421/4987 -f 11434/4423/4988 11364/4421/4988 11365/4424/4988 -f 11434/4423/4989 11365/4424/4989 11366/4425/4989 -f 11433/4426/4990 11434/4423/4990 11366/4425/4990 -f 11432/4427/4991 11433/4426/4991 11366/4425/4991 -f 11432/4427/4992 11366/4425/4992 11367/4428/4992 -f 11432/4427/4993 11367/4428/4993 11368/4429/4993 -f 11431/4430/4994 11432/4427/4994 11368/4429/4994 -f 11430/4431/4995 11431/4430/4995 11368/4429/4995 -f 11430/4431/4996 11368/4429/4996 11369/4432/4996 -f 11430/4431/4997 11369/4432/4997 11370/4433/4997 -f 11429/4434/4998 11430/4431/4998 11370/4433/4998 -f 11428/4435/4999 11429/4434/4999 11370/4433/4999 -f 11428/4435/5000 11370/4433/5000 11371/4436/5000 -f 11428/4435/5001 11371/4436/5001 11372/4437/5001 -f 11427/4438/5002 11428/4435/5002 11372/4437/5002 -f 11426/4439/5003 11427/4438/5003 11372/4437/5003 -f 11426/4439/5004 11372/4437/5004 11373/4440/5004 -f 11426/4439/4982 11373/4440/4982 11374/4441/4982 -f 11425/4442/5002 11426/4439/5002 11374/4441/5002 -f 11424/4443/5005 11425/4442/5005 11374/4441/5005 -f 11424/4443/5006 11374/4441/5006 11375/4444/5006 -f 11424/4443/5007 11375/4444/5007 11376/4445/5007 -f 11423/4446/5001 11424/4443/5001 11376/4445/5001 -f 11422/4447/5000 11423/4446/5000 11376/4445/5000 -f 11422/4447/5008 11376/4445/5008 11377/4448/5008 -f 11422/4447/5009 11377/4448/5009 11378/4449/5009 -f 11421/4450/5007 11422/4447/5007 11378/4449/5007 -f 11420/4451/5010 11421/4450/5010 11378/4449/5010 -f 11420/4451/5011 11378/4449/5011 11379/4452/5011 -f 11420/4451/5012 11379/4452/5012 11380/4453/5012 -f 11419/4454/5013 11420/4451/5013 11380/4453/5013 -f 11418/4455/5014 11419/4454/5014 11380/4453/5014 -f 11418/4455/5015 11380/4453/5015 11381/4456/5015 -f 11418/4455/5002 11381/4456/5002 11382/4457/5002 -f 11417/4458/5007 11418/4455/5007 11382/4457/5007 -f 11416/4459/5016 11417/4458/5016 11382/4457/5016 -f 11416/4459/5017 11382/4457/5017 11383/4460/5017 -f 11416/4459/5018 11383/4460/5018 11384/4461/5018 -f 11415/4462/5019 11416/4459/5019 11384/4461/5019 -f 11414/4463/5020 11415/4462/5020 11384/4461/5020 -f 11414/4463/5021 11384/4461/5021 11385/4464/5021 -f 11414/4463/5007 11385/4464/5007 11386/4465/5007 -f 11413/4466/5007 11414/4463/5007 11386/4465/5007 -f 11412/4467/5022 11413/4466/5022 11386/4465/5022 -f 11412/4467/5023 11386/4465/5023 11387/4468/5023 -f 11412/4467/5024 11387/4468/5024 11388/4469/5024 -f 11411/4470/5025 11412/4467/5025 11388/4469/5025 -f 11410/4471/5026 11411/4470/5026 11388/4469/5026 -f 11410/4471/5027 11388/4469/5027 11389/4472/5027 -f 11410/4471/5028 11389/4472/5028 11390/4473/5028 -f 11409/4474/5029 11410/4471/5029 11390/4473/5029 -f 11408/4475/5030 11409/4474/5030 11390/4473/5030 -f 11408/4475/5031 11390/4473/5031 11391/4476/5031 -f 11408/4475/5002 11391/4476/5002 11392/4477/5002 -f 11407/4478/5001 11408/4475/5001 11392/4477/5001 -f 11406/4479/5032 11407/4478/5032 11392/4477/5032 -f 11406/4479/5033 11392/4477/5033 11393/4480/5033 -f 11406/4479/5034 11393/4480/5034 11394/4481/5034 -f 11405/4482/5035 11406/4479/5035 11394/4481/5035 -f 11404/4411/5036 11405/4482/5036 11394/4481/5036 -f 11396/4408/5037 11404/4411/5037 11394/4481/5037 -f 11396/4408/5038 11394/4481/5038 11395/4483/5038 -o diescel2 -v 1.534572 0.942170 1.848745 -v 1.532588 0.972846 1.788897 -v 1.534464 0.943849 1.738906 -v 1.532588 0.972846 1.688878 -v 1.534464 0.943849 1.638851 -v 1.532588 0.972846 1.588825 -v 1.534098 0.942298 1.538881 -v 1.532588 0.972846 1.489716 -v 1.534463 0.943849 1.439688 -v 1.532588 0.972846 1.389661 -v 1.534088 0.943839 1.340504 -v 1.532588 0.972846 1.288470 -v 1.534463 0.943849 1.239577 -v 1.532588 0.972847 1.189550 -v 1.534463 0.943850 1.140660 -v 0.838544 0.891215 1.140659 -v 0.836669 0.920212 1.189549 -v 0.838173 0.891194 1.237451 -v 0.836669 0.920212 1.288469 -v 0.838169 0.891248 1.340503 -v 0.836669 0.920212 1.389660 -v 0.838170 0.891229 1.438963 -v 0.836669 0.920212 1.489714 -v 0.838179 0.890407 1.538880 -v 0.836669 0.920211 1.588824 -v 0.838544 0.891214 1.638850 -v 0.836669 0.920211 1.688877 -v 0.838168 0.891282 1.738966 -v 0.836828 0.921127 1.787538 -v 0.838549 0.889704 1.847860 -vt 0.997306 0.998751 -vt 0.000000 1.000000 -vt 0.002842 0.915478 -vt 0.999772 0.913559 -vt 0.997852 0.844963 -vt 0.000155 0.844878 -vt 0.002842 0.774226 -vt 0.999999 0.774225 -vt 0.997313 0.703574 -vt 0.000156 0.703576 -vt 0.002843 0.632926 -vt 0.999999 0.632924 -vt 0.997836 0.562391 -vt 0.000679 0.562393 -vt 0.002843 0.492958 -vt 0.999999 0.492956 -vt 0.997848 0.421282 -vt 0.000156 0.422307 -vt 0.002843 0.351656 -vt 1.000000 0.351654 -vt 0.997850 0.282231 -vt 0.000693 0.282233 -vt 0.002843 0.208748 -vt 1.000000 0.208746 -vt 0.997845 0.136696 -vt 0.000156 0.139698 -vt 0.002843 0.069047 -vt 1.000000 0.069045 -vt 0.997313 -0.000000 -vt 0.000157 0.000002 -vn -0.067440 0.886977 0.456864 -vn -0.066625 0.884135 0.462457 -vn -0.062131 0.849599 -0.523757 -vn -0.065129 0.862116 -0.502508 -vn -0.065055 0.862280 0.502236 -vn -0.065291 0.863249 0.500538 -vn -0.065215 0.862265 -0.502241 -vn -0.065215 0.862265 -0.502242 -vn -0.065217 0.862264 0.502243 -vn -0.064745 0.856053 -0.512817 -vn -0.063416 0.850501 -0.522136 -vn -0.063143 0.846827 0.528106 -vn -0.064477 0.852487 0.518757 -vn -0.065473 0.865679 -0.496299 -vn -0.064643 0.862309 -0.502240 -vn -0.065684 0.862233 0.502235 -vn -0.064999 0.859388 0.507176 -vn -0.064959 0.858879 -0.508042 -vn -0.064881 0.858555 -0.508599 -vn -0.065805 0.870747 0.487308 -vn -0.065881 0.871047 0.486761 -vn -0.065537 0.866529 -0.494805 -vn -0.063274 0.857320 -0.510881 -vn -0.066732 0.862155 0.502231 -vn -0.064488 0.852626 0.518526 -vn -0.064831 0.857195 -0.510895 -s off -f 11472/4484/5039 11443/4485/5039 11444/4486/5039 -f 11471/4487/5040 11472/4484/5040 11444/4486/5040 -f 11470/4488/5041 11471/4487/5041 11444/4486/5041 -f 11470/4488/5042 11444/4486/5042 11445/4489/5042 -f 11470/4488/5043 11445/4489/5043 11446/4490/5043 -f 11469/4491/5044 11470/4488/5044 11446/4490/5044 -f 11468/4492/5045 11469/4491/5045 11446/4490/5045 -f 11468/4492/5046 11446/4490/5046 11447/4493/5046 -f 11468/4492/5047 11447/4493/5047 11448/4494/5047 -f 11467/4495/5047 11468/4492/5047 11448/4494/5047 -f 11466/4496/5048 11467/4495/5048 11448/4494/5048 -f 11466/4496/5049 11448/4494/5049 11449/4497/5049 -f 11466/4496/5050 11449/4497/5050 11450/4498/5050 -f 11465/4499/5051 11466/4496/5051 11450/4498/5051 -f 11464/4500/5052 11465/4499/5052 11450/4498/5052 -f 11464/4500/5053 11450/4498/5053 11451/4501/5053 -f 11464/4500/5054 11451/4501/5054 11452/4502/5054 -f 11463/4503/5055 11464/4500/5055 11452/4502/5055 -f 11462/4504/5056 11463/4503/5056 11452/4502/5056 -f 11462/4504/5057 11452/4502/5057 11453/4505/5057 -f 11462/4504/5058 11453/4505/5058 11454/4506/5058 -f 11461/4507/5059 11462/4504/5059 11454/4506/5059 -f 11460/4508/5060 11461/4507/5060 11454/4506/5060 -f 11460/4508/5061 11454/4506/5061 11455/4509/5061 -f 11460/4508/5062 11455/4509/5062 11456/4510/5062 -f 11459/4511/5063 11460/4508/5063 11456/4510/5063 -f 11458/4512/5064 11459/4511/5064 11456/4510/5064 -f 11458/4512/5064 11456/4510/5064 11457/4513/5064 -o diesplat -v 1.582823 0.094055 0.344612 -v 1.610250 0.094055 0.344612 -v 1.582823 0.094055 0.255997 -v 1.610250 0.094055 0.255997 -v 1.582823 1.274342 -0.588823 -v 1.610250 1.274342 -0.588823 -v 1.582823 1.274342 -0.677438 -v 1.610250 1.274342 -0.677438 -v 1.310300 0.094055 0.344612 -v 1.337727 0.094055 0.344612 -v 1.310300 0.094055 0.255997 -v 1.337728 0.094055 0.255997 -v 1.310300 1.274342 -0.588823 -v 1.337727 1.274342 -0.588823 -v 1.310300 1.274342 -0.677438 -v 1.337727 1.274342 -0.677438 -v -0.026408 3.118518 3.219061 -v -0.209857 3.118518 2.992233 -v -0.748455 3.118518 3.034065 -v -0.904553 3.118518 3.376332 -v -0.642079 3.118517 3.787742 -v -0.209855 3.118517 3.760431 -v -0.026408 3.118518 3.533604 -v -0.885329 3.118518 3.507257 -v -0.831417 3.118517 3.623225 -v -0.748455 3.118517 3.718599 -v -0.517928 3.118517 3.825014 -v -0.398558 3.118517 3.826936 -v -0.299362 3.118517 3.803921 -v -0.132731 3.118517 3.699114 -v -0.070684 3.118518 3.622622 -v 0.284708 3.102596 3.533605 -v 0.284708 3.102597 3.219061 -v -0.070686 3.118518 3.130042 -v -0.132734 3.118518 3.053550 -v -0.299363 3.118518 2.948743 -v -0.398559 3.118518 2.925729 -v -0.517928 3.118518 2.927651 -v -0.642079 3.118518 2.964923 -v -0.831417 3.118518 3.129439 -v -0.885329 3.118518 3.245407 -v -0.606146 3.118518 3.376332 -v -0.581118 3.118518 3.291842 -v -0.516323 3.118518 3.235542 -v -0.434659 3.118518 3.221945 -v -0.375287 3.118518 3.240774 -v -0.329014 3.118518 3.280277 -v -0.299141 3.118518 3.340073 -v -0.294943 3.118518 3.374745 -v -0.306808 3.118518 3.433857 -v -0.342438 3.118518 3.487313 -v -0.435288 3.118518 3.530784 -v -0.516323 3.118518 3.517123 -v -0.581118 3.118518 3.460823 -v -0.444811 1.305869 -0.605765 -v -1.198792 1.305868 -0.629850 -v 0.315971 1.305869 -0.605676 -v 0.691758 1.305869 -0.606763 -v 1.221857 1.305869 -0.605901 -v -1.532013 1.305869 -0.939113 -v -1.460398 1.305868 -0.605495 -v 1.338122 1.267407 -0.582751 -v 1.338122 1.274090 -0.588686 -v 1.337857 1.267465 -0.672249 -v 1.337857 1.274168 -0.677320 -v 1.337750 0.155016 0.294652 -v 1.337750 0.148214 0.300042 -v 1.337749 0.228449 0.236673 -v 1.337749 0.221699 0.241573 -v 1.337749 0.302457 0.178439 -v 1.337749 0.296024 0.183373 -v 1.337749 0.376442 0.119701 -v 1.337749 0.370097 0.124749 -v 1.337749 0.450727 0.061470 -v 1.337749 0.443793 0.066404 -v 1.337749 0.525233 0.002503 -v 1.337749 0.518202 0.007887 -v 1.337749 0.599119 -0.055887 -v 1.337749 0.592569 -0.050798 -v 1.337749 0.672775 -0.113962 -v 1.337749 0.666092 -0.109027 -v 1.337749 0.747194 -0.172734 -v 1.337749 0.740356 -0.167496 -v 1.337749 0.821051 -0.230896 -v 1.337749 0.814117 -0.225462 -v 1.337749 0.894818 -0.288881 -v 1.337749 0.888385 -0.283947 -v 1.337749 0.968837 -0.347834 -v 1.337749 0.962154 -0.342399 -v 1.337749 1.043094 -0.406064 -v 1.337749 1.036160 -0.400880 -v 1.337749 1.116601 -0.463806 -v 1.337749 1.110169 -0.459123 -v 1.337749 1.190897 -0.522788 -v 1.337749 1.184213 -0.517353 -v 1.337749 0.148214 0.211355 -v 1.337749 0.155016 0.205965 -v 1.337749 0.221699 0.152885 -v 1.337749 0.228449 0.147985 -v 1.337749 0.296024 0.094686 -v 1.337749 0.302457 0.089752 -v 1.337749 0.370097 0.036061 -v 1.337749 0.376442 0.031013 -v 1.337749 0.443793 -0.022283 -v 1.337749 0.450727 -0.027218 -v 1.337749 0.518202 -0.080801 -v 1.337749 0.525233 -0.086185 -v 1.337749 0.592569 -0.139485 -v 1.337749 0.599119 -0.144574 -v 1.337749 0.666092 -0.197715 -v 1.337749 0.672775 -0.202650 -v 1.337749 0.740356 -0.256183 -v 1.337749 0.747194 -0.261422 -v 1.337749 0.814117 -0.314150 -v 1.337749 0.821051 -0.319584 -v 1.337749 0.888385 -0.372634 -v 1.337749 0.894818 -0.377568 -v 1.337749 0.962154 -0.431086 -v 1.337749 0.968838 -0.436521 -v 1.337749 1.036160 -0.489568 -v 1.337749 1.043094 -0.494752 -v 1.337749 1.110169 -0.547811 -v 1.337749 1.116602 -0.552494 -v 1.337749 1.184214 -0.606041 -v 1.337749 1.190897 -0.611476 -v 1.584126 1.267465 -0.671593 -v 1.584126 1.274168 -0.677320 -v 1.583581 1.267407 -0.582751 -v 1.583582 0.148214 0.300042 -v 1.583582 0.155017 0.294652 -v 1.583582 0.221700 0.241572 -v 1.583582 0.228449 0.236672 -v 1.583582 0.296024 0.183373 -v 1.583582 0.302457 0.178439 -v 1.583582 0.370097 0.124749 -v 1.583582 0.376442 0.119701 -v 1.583582 0.443793 0.066404 -v 1.583582 0.450727 0.061470 -v 1.583582 0.518202 0.007887 -v 1.582903 0.525233 0.002503 -v 1.583581 0.599119 -0.055887 -v 1.583581 0.592570 -0.050797 -v 1.583581 0.666092 -0.109027 -v 1.583757 0.672775 -0.113961 -v 1.583581 0.740356 -0.167496 -v 1.583581 0.747194 -0.172735 -v 1.583643 0.814117 -0.225462 -v 1.584306 0.821051 -0.230897 -v 1.583581 0.888385 -0.283946 -v 1.583581 0.894818 -0.288881 -v 1.583581 0.962154 -0.342399 -v 1.583581 0.968838 -0.347833 -v 1.583581 1.036160 -0.400880 -v 1.583581 1.043094 -0.406064 -v 1.583581 1.110169 -0.459122 -v 1.583581 1.116601 -0.463806 -v 1.583581 1.184214 -0.517353 -v 1.583581 1.190897 -0.522788 -v 1.583581 1.274091 -0.588687 -v 1.583581 0.148214 0.211354 -v 1.583581 0.155017 0.205964 -v 1.583581 0.221700 0.152885 -v 1.583581 0.228449 0.147984 -v 1.583581 0.296024 0.094686 -v 1.583581 0.302457 0.089752 -v 1.583581 0.370097 0.036061 -v 1.583581 0.376442 0.031013 -v 1.583581 0.443793 -0.022284 -v 1.583581 0.450727 -0.027218 -v 1.582903 0.518202 -0.080801 -v 1.583581 0.525233 -0.086185 -v 1.583582 0.592569 -0.139485 -v 1.583581 0.599119 -0.144574 -v 1.583757 0.666092 -0.197715 -v 1.583581 0.672775 -0.202649 -v 1.583581 0.740356 -0.256183 -v 1.583581 0.747194 -0.261422 -v 1.584362 0.814117 -0.314149 -v 1.583581 0.821051 -0.319584 -v 1.583581 0.888385 -0.372634 -v 1.583581 0.894818 -0.377568 -v 1.583582 0.962154 -0.431086 -v 1.583581 0.968838 -0.436521 -v 1.583581 1.036160 -0.489568 -v 1.583581 1.043094 -0.494752 -v 1.583582 1.110169 -0.547810 -v 1.583582 1.116602 -0.552494 -v 1.583582 1.184214 -0.606041 -v 1.583582 1.190897 -0.611476 -v -1.531984 1.305868 -0.606394 -v 0.409249 1.305869 -0.492926 -v 0.409249 1.305869 -0.605664 -v 0.434870 1.305869 -0.504313 -v 0.576752 1.305869 -0.493790 -v 0.577001 1.305869 -0.606940 -v 1.637660 1.305869 -0.605936 -v 1.637663 1.305869 -0.653825 -v 1.584123 1.305869 -0.606264 -v 1.338480 1.305869 -0.605931 -v -1.151550 1.305868 -0.605855 -v -1.292491 1.305868 -0.605866 -v 1.637688 1.305869 -0.939714 -v 1.241132 1.305869 -0.939639 -v 0.387777 1.305869 -0.939478 -v -0.392253 1.305869 -0.939329 -v -1.148097 1.305869 -0.939186 -v 0.513524 1.305869 -0.513244 -v 1.312979 1.305869 -0.677695 -v 1.584057 1.305869 -0.677965 -v 1.617928 1.305869 -0.642239 -v -1.292401 1.305868 -0.490972 -v -1.460288 1.305868 -0.491771 -v -1.329123 1.305868 -0.507527 -v -1.377064 1.305868 -0.514566 -v -1.447052 1.305868 -0.499114 -v 1.337728 0.094055 0.255997 -v 1.310300 0.094055 0.344612 -v 1.337727 1.274342 -0.677438 -v 1.310300 1.274342 -0.588823 -v 1.310300 0.094055 0.344612 -v 1.337727 0.094055 0.344612 -v 1.337727 1.274342 -0.588823 -v 1.337727 1.274342 -0.588823 -v 1.310300 1.274342 -0.588823 -v 1.310300 0.094055 0.344612 -v 1.337727 0.094055 0.344612 -v 1.337728 0.094055 0.255997 -v 1.337727 1.274342 -0.677438 -v 1.337727 1.274342 -0.677438 -v 1.337727 1.274342 -0.588823 -v 1.337727 0.094055 0.344612 -v 1.337728 0.094055 0.255997 -v 1.310300 0.094055 0.255997 -v 1.310300 1.274342 -0.677438 -v 1.310300 1.274342 -0.677438 -v 1.337727 1.274342 -0.677438 -v 1.337728 0.094055 0.255997 -v 1.310300 0.094055 0.255997 -v 1.310300 0.094055 0.344612 -v 1.310300 1.274342 -0.588823 -v 1.310300 1.274342 -0.588823 -v 1.310300 1.274342 -0.677438 -v 1.310300 0.094055 0.255997 -v -0.606146 3.118518 3.376332 -v -0.885329 3.118518 3.507257 -v -0.904553 3.118518 3.376332 -v -0.606146 3.118518 3.376332 -v -0.581118 3.118518 3.460823 -v -0.885329 3.118518 3.507257 -v -0.885329 3.118518 3.245407 -v -0.606146 3.118518 3.376332 -v -0.831417 3.118518 3.129439 -v -0.606146 3.118518 3.376332 -v -0.581118 3.118518 3.460823 -v -0.831417 3.118517 3.623225 -v -0.581118 3.118518 3.460823 -v -0.748455 3.118517 3.718599 -v -0.831417 3.118518 3.129439 -v -0.581118 3.118518 3.291842 -v -0.516323 3.118518 3.517123 -v -0.748455 3.118517 3.718599 -v -0.516323 3.118518 3.517123 -v -0.642079 3.118517 3.787742 -v -0.516323 3.118518 3.517123 -v -0.517928 3.118517 3.825014 -v -0.435288 3.118518 3.530784 -v -0.517928 3.118517 3.825014 -v -0.748455 3.118518 3.034065 -v -0.581118 3.118518 3.291842 -v -0.642079 3.118518 2.964923 -v -0.581118 3.118518 3.291842 -v -0.642079 3.118518 2.964923 -v -0.516323 3.118518 3.235542 -v -0.517928 3.118518 2.927651 -v -0.516323 3.118518 3.235542 -v -0.398559 3.118518 2.925729 -v -0.516323 3.118518 3.235542 -v -0.435288 3.118518 3.530784 -v -0.398558 3.118517 3.826936 -v -0.435288 3.118518 3.530784 -v -0.299362 3.118517 3.803921 -v -0.398559 3.118518 2.925729 -v -0.434659 3.118518 3.221945 -v -0.299363 3.118518 2.948743 -v -0.434659 3.118518 3.221945 -v -0.434659 3.118518 3.221945 -v -0.209857 3.118518 2.992233 -v -0.375287 3.118518 3.240774 -v -0.132734 3.118518 3.053550 -v -0.375287 3.118518 3.240774 -v -0.132734 3.118518 3.053550 -v -0.329014 3.118518 3.280277 -v -0.070686 3.118518 3.130042 -v -0.329014 3.118518 3.280277 -v -0.026408 3.118518 3.219061 -v -0.329014 3.118518 3.280277 -v -0.342438 3.118518 3.487313 -v -0.299362 3.118517 3.803921 -v -0.342438 3.118518 3.487313 -v -0.209855 3.118517 3.760431 -v -0.342438 3.118518 3.487313 -v -0.132731 3.118517 3.699114 -v -0.342438 3.118518 3.487313 -v -0.070684 3.118518 3.622622 -v -0.306808 3.118518 3.433857 -v -0.070684 3.118518 3.622622 -v -0.026408 3.118518 3.219061 -v -0.026408 3.118518 3.533604 -v 0.284708 3.102596 3.533605 -v -0.026408 3.118518 3.219061 -v -0.306808 3.118518 3.433857 -v -0.026408 3.118518 3.219061 -v -0.306808 3.118518 3.433857 -v -0.026408 3.118518 3.219061 -v -0.299141 3.118518 3.340073 -v -0.026408 3.118518 3.219061 -v 1.584126 1.267465 -0.671593 -v 1.337857 1.274168 -0.677320 -v 1.337857 1.267465 -0.672249 -v 1.584126 1.267465 -0.671593 -v 1.584126 1.267465 -0.671593 -v 1.338122 1.267407 -0.582751 -v 1.337750 0.155016 0.294652 -v 1.583582 0.148214 0.300042 -v 1.337749 0.228449 0.236673 -v 1.583582 0.221700 0.241572 -v 1.337749 0.302457 0.178439 -v 1.583582 0.296024 0.183373 -v 1.337749 0.376442 0.119701 -v 1.583582 0.370097 0.124749 -v 1.337749 0.450727 0.061470 -v 1.583582 0.443793 0.066404 -v 1.337749 0.525233 0.002503 -v 1.583582 0.518202 0.007887 -v 1.337749 0.599119 -0.055887 -v 1.583581 0.592570 -0.050797 -v 1.337749 0.672775 -0.113962 -v 1.583581 0.666092 -0.109027 -v 1.337749 0.747194 -0.172734 -v 1.583581 0.740356 -0.167496 -v 1.337749 0.821051 -0.230896 -v 1.583643 0.814117 -0.225462 -v 1.337749 0.894818 -0.288881 -v 1.583581 0.888385 -0.283946 -v 1.337749 0.968837 -0.347834 -v 1.583581 0.962154 -0.342399 -v 1.337749 1.043094 -0.406064 -v 1.583581 1.036160 -0.400880 -v 1.337749 1.116601 -0.463806 -v 1.583581 1.110169 -0.459122 -v 1.337749 1.190897 -0.522788 -v 1.583581 1.184214 -0.517353 -v 1.337749 0.148214 0.211355 -v 1.583581 0.155017 0.205964 -v 1.337749 0.221699 0.152885 -v 1.583581 0.228449 0.147984 -v 1.337749 0.296024 0.094686 -v 1.583581 0.302457 0.089752 -v 1.337749 0.370097 0.036061 -v 1.583581 0.376442 0.031013 -v 1.337749 0.443793 -0.022283 -v 1.583581 0.450727 -0.027218 -v 1.337749 0.518202 -0.080801 -v 1.583581 0.525233 -0.086185 -v 1.337749 0.592569 -0.139485 -v 1.583581 0.599119 -0.144574 -v 1.337749 0.666092 -0.197715 -v 1.583581 0.672775 -0.202649 -v 1.337749 0.740356 -0.256183 -v 1.583581 0.747194 -0.261422 -v 1.337749 0.814117 -0.314150 -v 1.583581 0.821051 -0.319584 -v 1.337749 0.888385 -0.372634 -v 1.583581 0.894818 -0.377568 -v 1.337749 0.962154 -0.431086 -v 1.583581 0.968838 -0.436521 -v 1.337749 1.036160 -0.489568 -v 1.583581 1.043094 -0.494752 -v 1.337749 1.110169 -0.547811 -v 1.583582 1.116602 -0.552494 -v 1.337749 1.184214 -0.606041 -v 1.583582 1.190897 -0.611476 -v 1.583582 1.184214 -0.606041 -v 1.583581 1.184214 -0.517353 -v 1.337749 1.184214 -0.606041 -v 1.337749 1.184213 -0.517353 -v 1.337749 1.184214 -0.606041 -v 1.583581 1.184214 -0.517353 -v 1.583581 1.190897 -0.522788 -v 1.583582 1.190897 -0.611476 -v 1.337749 1.190897 -0.522788 -v 1.337749 1.190897 -0.611476 -v 1.337749 1.190897 -0.522788 -v 1.583582 1.190897 -0.611476 -v 1.583581 1.116601 -0.463806 -v 1.583582 1.116602 -0.552494 -v 1.337749 1.116602 -0.552494 -v 1.337749 1.116602 -0.552494 -v 1.337749 1.116601 -0.463806 -v 1.583581 1.116601 -0.463806 -v 1.583582 1.110169 -0.547810 -v 1.583581 1.110169 -0.459122 -v 1.337749 1.110169 -0.547811 -v 1.337749 1.110169 -0.459123 -v 1.337749 1.110169 -0.547811 -v 1.583581 1.110169 -0.459122 -v 1.583581 1.043094 -0.406064 -v 1.583581 1.043094 -0.494752 -v 1.337749 1.043094 -0.494752 -v 1.337749 1.043094 -0.494752 -v 1.337749 1.043094 -0.406064 -v 1.583581 1.043094 -0.406064 -v 1.583581 1.036160 -0.489568 -v 1.583581 1.036160 -0.400880 -v 1.337749 1.036160 -0.489568 -v 1.337749 1.036160 -0.400880 -v 1.337749 1.036160 -0.489568 -v 1.583581 1.036160 -0.400880 -v 1.583581 0.968838 -0.347833 -v 1.583581 0.968838 -0.436521 -v 1.337749 0.968838 -0.436521 -v 1.337749 0.968838 -0.436521 -v 1.337749 0.968837 -0.347834 -v 1.583581 0.968838 -0.347833 -v 1.583582 0.962154 -0.431086 -v 1.583581 0.962154 -0.342399 -v 1.337749 0.962154 -0.431086 -v 1.337749 0.962154 -0.342399 -v 1.337749 0.962154 -0.431086 -v 1.583581 0.962154 -0.342399 -v 1.583581 0.894818 -0.288881 -v 1.583581 0.894818 -0.377568 -v 1.337749 0.894818 -0.377568 -v 1.337749 0.894818 -0.377568 -v 1.337749 0.894818 -0.288881 -v 1.583581 0.894818 -0.288881 -v 1.583581 0.888385 -0.372634 -v 1.583581 0.888385 -0.283946 -v 1.337749 0.888385 -0.372634 -v 1.337749 0.888385 -0.283947 -v 1.337749 0.888385 -0.372634 -v 1.583581 0.888385 -0.283946 -v 1.584306 0.821051 -0.230897 -v 1.583581 0.821051 -0.319584 -v 1.337749 0.821051 -0.319584 -v 1.337749 0.821051 -0.319584 -v 1.337749 0.821051 -0.230896 -v 1.584306 0.821051 -0.230897 -v 1.584362 0.814117 -0.314149 -v 1.583643 0.814117 -0.225462 -v 1.337749 0.814117 -0.314150 -v 1.337749 0.814117 -0.225462 -v 1.337749 0.814117 -0.314150 -v 1.583643 0.814117 -0.225462 -v 1.583581 0.747194 -0.172735 -v 1.583581 0.747194 -0.261422 -v 1.337749 0.747194 -0.261422 -v 1.337749 0.747194 -0.261422 -v 1.337749 0.747194 -0.172734 -v 1.583581 0.747194 -0.172735 -v 1.583581 0.740356 -0.256183 -v 1.583581 0.740356 -0.167496 -v 1.337749 0.740356 -0.256183 -v 1.337749 0.740356 -0.167496 -v 1.337749 0.740356 -0.256183 -v 1.583581 0.740356 -0.167496 -v 1.583757 0.672775 -0.113961 -v 1.583581 0.672775 -0.202649 -v 1.337749 0.672775 -0.202650 -v 1.337749 0.672775 -0.202650 -v 1.337749 0.672775 -0.113962 -v 1.583757 0.672775 -0.113961 -v 1.583757 0.666092 -0.197715 -v 1.583581 0.666092 -0.109027 -v 1.337749 0.666092 -0.197715 -v 1.337749 0.666092 -0.109027 -v 1.337749 0.666092 -0.197715 -v 1.583581 0.666092 -0.109027 -v 1.583581 0.599119 -0.055887 -v 1.583581 0.599119 -0.144574 -v 1.337749 0.599119 -0.144574 -v 1.337749 0.599119 -0.144574 -v 1.337749 0.599119 -0.055887 -v 1.583581 0.599119 -0.055887 -v 1.583582 0.592569 -0.139485 -v 1.583581 0.592570 -0.050797 -v 1.337749 0.592569 -0.139485 -v 1.337749 0.592569 -0.050798 -v 1.337749 0.592569 -0.139485 -v 1.583581 0.592570 -0.050797 -v 1.582903 0.525233 0.002503 -v 1.583581 0.525233 -0.086185 -v 1.337749 0.525233 -0.086185 -v 1.337749 0.525233 -0.086185 -v 1.337749 0.525233 0.002503 -v 1.582903 0.525233 0.002503 -v 1.582903 0.518202 -0.080801 -v 1.583582 0.518202 0.007887 -v 1.337749 0.518202 -0.080801 -v 1.337749 0.518202 0.007887 -v 1.337749 0.518202 -0.080801 -v 1.583582 0.518202 0.007887 -v 1.583582 0.450727 0.061470 -v 1.583581 0.450727 -0.027218 -v 1.337749 0.450727 -0.027218 -v 1.337749 0.450727 -0.027218 -v 1.337749 0.450727 0.061470 -v 1.583582 0.450727 0.061470 -v 1.583581 0.443793 -0.022284 -v 1.583582 0.443793 0.066404 -v 1.337749 0.443793 -0.022283 -v 1.337749 0.443793 0.066404 -v 1.337749 0.443793 -0.022283 -v 1.583582 0.443793 0.066404 -v 1.583582 0.376442 0.119701 -v 1.583581 0.376442 0.031013 -v 1.337749 0.376442 0.031013 -v 1.337749 0.376442 0.031013 -v 1.337749 0.376442 0.119701 -v 1.583582 0.376442 0.119701 -v 1.583581 0.370097 0.036061 -v 1.583582 0.370097 0.124749 -v 1.337749 0.370097 0.036061 -v 1.337749 0.370097 0.124749 -v 1.337749 0.370097 0.036061 -v 1.583582 0.370097 0.124749 -v 1.583582 0.302457 0.178439 -v 1.583581 0.302457 0.089752 -v 1.337749 0.302457 0.089752 -v 1.337749 0.302457 0.089752 -v 1.337749 0.302457 0.178439 -v 1.583582 0.302457 0.178439 -v 1.583581 0.296024 0.094686 -v 1.583582 0.296024 0.183373 -v 1.337749 0.296024 0.094686 -v 1.337749 0.296024 0.183373 -v 1.337749 0.296024 0.094686 -v 1.583582 0.296024 0.183373 -v 1.583582 0.228449 0.236672 -v 1.583581 0.228449 0.147984 -v 1.337749 0.228449 0.147985 -v 1.337749 0.228449 0.147985 -v 1.337749 0.228449 0.236673 -v 1.583582 0.228449 0.236672 -v 1.583581 0.221700 0.152885 -v 1.583582 0.221700 0.241572 -v 1.337749 0.221699 0.152885 -v 1.337749 0.221699 0.241573 -v 1.337749 0.221699 0.152885 -v 1.583582 0.221700 0.241572 -v 1.583582 0.155017 0.294652 -v 1.583581 0.155017 0.205964 -v 1.337749 0.155016 0.205965 -v 1.337749 0.155016 0.205965 -v 1.337750 0.155016 0.294652 -v 1.583582 0.155017 0.294652 -v 1.583581 0.148214 0.211354 -v 1.583582 0.148214 0.300042 -v 1.337749 0.148214 0.211355 -v 1.337750 0.148214 0.300042 -v 1.337749 0.148214 0.211355 -v 1.583582 0.148214 0.300042 -v -1.532013 1.305869 -0.939113 -v -1.460398 1.305868 -0.605495 -v -1.460398 1.305868 -0.605495 -v -1.198792 1.305868 -0.629850 -v -1.198792 1.305868 -0.629850 -v -1.292491 1.305868 -0.605866 -v -1.198792 1.305868 -0.629850 -v -1.151550 1.305868 -0.605855 -v -1.148097 1.305869 -0.939186 -v -1.532013 1.305869 -0.939113 -v -1.198792 1.305868 -0.629850 -v -1.148097 1.305869 -0.939186 -v -1.151550 1.305868 -0.605855 -v -1.148097 1.305869 -0.939186 -v -0.444811 1.305869 -0.605765 -v -0.392253 1.305869 -0.939329 -v -0.444811 1.305869 -0.605765 -v 0.315971 1.305869 -0.605676 -v -0.392253 1.305869 -0.939329 -v 0.387777 1.305869 -0.939478 -v 0.315971 1.305869 -0.605676 -v 0.577001 1.305869 -0.606940 -v 0.387777 1.305869 -0.939478 -v 0.513524 1.305869 -0.513244 -v 0.513524 1.305869 -0.513244 -v 0.387777 1.305869 -0.939478 -v 0.409249 1.305869 -0.605664 -v 0.387777 1.305869 -0.939478 -v 0.577001 1.305869 -0.606940 -v 1.337857 1.274168 -0.677320 -v 1.583581 1.274091 -0.588687 -v 1.584126 1.274168 -0.677320 -v 1.337857 1.274168 -0.677320 -v 0.387777 1.305869 -0.939478 -v 0.691758 1.305869 -0.606763 -v 1.241132 1.305869 -0.939639 -v 0.691758 1.305869 -0.606763 -v 1.221857 1.305869 -0.605901 -v 1.241132 1.305869 -0.939639 -v 1.221857 1.305869 -0.605901 -v 1.312979 1.305869 -0.677695 -v 1.312979 1.305869 -0.677695 -v 1.338480 1.305869 -0.605931 -v 1.584123 1.305869 -0.606264 -v 1.241132 1.305869 -0.939639 -v 1.312979 1.305869 -0.677695 -v 1.584123 1.305869 -0.606264 -v 1.241132 1.305869 -0.939639 -v 1.637660 1.305869 -0.605936 -v 1.617928 1.305869 -0.642239 -v 1.584123 1.305869 -0.606264 -v 1.584123 1.305869 -0.606264 -v 1.617928 1.305869 -0.642239 -v 1.584057 1.305869 -0.677965 -v 1.584057 1.305869 -0.677965 -v 1.617928 1.305869 -0.642239 -v 1.637688 1.305869 -0.939714 -v 1.241132 1.305869 -0.939639 -v 1.584057 1.305869 -0.677965 -v 1.583581 1.274091 -0.588687 -v 1.338122 1.274090 -0.588686 -v 1.583581 1.267407 -0.582751 -v 1.583581 1.267407 -0.582751 -v 1.338122 1.274090 -0.588686 -v 1.338122 1.267407 -0.582751 -v 1.637688 1.305869 -0.939714 -v 1.617928 1.305869 -0.642239 -v 1.637663 1.305869 -0.653825 -v 0.434870 1.305869 -0.504313 -v 0.513524 1.305869 -0.513244 -v 0.409249 1.305869 -0.605664 -v -1.292491 1.305868 -0.605866 -v -1.292491 1.305868 -0.605866 -v -1.460398 1.305868 -0.605495 -v -1.460398 1.305868 -0.605495 -v -1.460398 1.305868 -0.605495 -v -1.292491 1.305868 -0.605866 -vt 8.691670 3.227463 -vt 3.228502 26.218016 -vt 3.215717 26.257504 -vt 3.236587 26.259426 -vt 3.199730 26.240496 -vt 3.306045 24.460445 -vt 3.297960 24.419033 -vt 3.280178 24.432928 -vt 3.318830 24.420959 -vt 3.331912 24.487963 -vt 3.339814 24.463558 -vt 3.314130 24.501858 -vt 3.272276 24.457333 -vt 3.277273 24.482927 -vt 6.744643 27.544409 -vt 6.488793 27.789074 -vt 6.212293 27.981550 -vt 5.920009 28.121319 -vt 4.183487 23.007385 -vt 4.941600 24.579468 -vt 4.954184 24.571917 -vt 4.599287 25.879627 -vt 3.244054 26.578735 -vt 4.635959 25.959673 -vt 4.569165 25.796175 -vt 4.545637 25.709980 -vt 3.097569 25.996679 -vt 3.157965 26.292049 -vt 4.515058 25.441420 -vt 3.072668 25.087482 -vt 3.054708 25.391493 -vt 4.518344 25.350746 -vt 4.530889 25.245071 -vt 3.117175 24.786402 -vt 4.528443 25.260586 -vt 4.533539 25.229591 -vt 3.188439 24.491156 -vt 4.553782 25.137705 -vt 4.549891 25.152884 -vt 4.557880 25.122589 -vt 2.023186 23.251575 -vt 4.572317 25.054996 -vt 4.566701 25.092554 -vt 4.586352 25.011194 -vt 4.664010 24.861412 -vt 4.633695 24.912497 -vt 4.696759 24.811708 -vt 4.730445 24.765299 -vt 4.844639 24.650700 -vt 4.822166 24.664879 -vt 4.880172 24.621735 -vt 4.868211 24.631088 -vt 4.892247 24.612677 -vt 5.857315 26.059120 -vt 6.974970 27.248066 -vt 7.421564 26.178345 -vt 7.317145 26.553879 -vt 5.974413 25.821560 -vt 6.010146 25.693047 -vt 5.690937 26.244265 -vt 5.596314 26.310135 -vt 5.496290 26.357964 -vt 5.616812 28.207863 -vt 8.793430 3.335716 -vt 8.963280 3.082446 -vt 9.243841 2.664092 -vt 9.073992 2.917363 -vt 8.979249 3.058634 -vt 9.259811 2.640278 -vt 8.173079 2.941836 -vt 7.892519 3.360191 -vt 8.306983 3.801093 -vt 11.481998 -0.673346 -vt 11.190547 -0.498734 -vt 11.292310 -0.390483 -vt 11.383794 -0.784363 -vt 11.099678 -0.363237 -vt 10.909987 -0.080378 -vt 11.201440 -0.254986 -vt 11.011748 0.027873 -vt 7.387641 2.823107 -vt 7.241775 3.040769 -vt 7.285890 2.714867 -vt 7.139880 2.932375 -vt 7.404691 2.797683 -vt 7.302941 2.689441 -vt 7.572608 2.547293 -vt 7.470860 2.439053 -vt 7.588108 2.524180 -vt 7.486360 2.415942 -vt 7.756719 2.272756 -vt 7.654971 2.164517 -vt 7.772328 2.249481 -vt 7.670578 2.141244 -vt 7.958146 1.972399 -vt 7.942177 1.996211 -vt 7.856397 1.864158 -vt 7.840428 1.887973 -vt 8.126745 1.720984 -vt 8.025000 1.612748 -vt 8.142354 1.697709 -vt 8.040608 1.589473 -vt 8.311863 1.444945 -vt 8.210118 1.336709 -vt 8.331437 1.422253 -vt 8.227149 1.311312 -vt 8.513612 1.144115 -vt 8.497513 1.168121 -vt 8.411863 1.035876 -vt 8.681722 0.893438 -vt 8.579974 0.785197 -vt 8.696673 0.869465 -vt 8.595582 0.761924 -vt 8.866686 0.617629 -vt 8.764936 0.509390 -vt 8.883260 0.592914 -vt 8.781510 0.484674 -vt 9.049829 0.343946 -vt 8.948311 0.235951 -vt 9.064539 0.315668 -vt 8.965503 0.210316 -vt 9.235074 0.068305 -vt 9.133326 -0.039935 -vt 9.250684 0.045029 -vt 9.148936 -0.063209 -vt 9.419988 -0.207424 -vt 9.318237 -0.315665 -vt 9.437180 -0.233063 -vt 9.335431 -0.341302 -vt 9.604989 -0.483294 -vt 9.503241 -0.591531 -vt 9.621391 -0.507751 -vt 9.519643 -0.615990 -vt 9.789239 -0.758038 -vt 9.687490 -0.866276 -vt 9.804056 -0.780132 -vt 9.702309 -0.888371 -vt 9.973452 -1.032727 -vt 9.871703 -1.140965 -vt 9.990644 -1.058364 -vt 9.888894 -1.166605 -vt 10.199113 -1.369220 -vt 10.180336 -1.341222 -vt 10.097363 -1.477462 -vt 10.078585 -1.449463 -vt 7.420463 2.513988 -vt 7.522356 2.622381 -vt 7.566452 2.296512 -vt 7.668201 2.404749 -vt 7.583503 2.271086 -vt 7.685253 2.379323 -vt 7.751421 2.020695 -vt 7.853169 2.128935 -vt 7.766922 1.997584 -vt 7.868670 2.105820 -vt 7.935530 1.746162 -vt 8.037278 1.854400 -vt 7.951139 1.722886 -vt 8.052887 1.831125 -vt 8.120988 1.469615 -vt 8.222738 1.577853 -vt 8.136957 1.445803 -vt 8.238706 1.554041 -vt 8.305560 1.194390 -vt 8.407309 1.302629 -vt 8.321169 1.171114 -vt 8.422918 1.279353 -vt 8.594968 1.029290 -vt 8.490680 0.918350 -vt 8.507711 0.892953 -vt 8.609459 1.001193 -vt 8.676325 0.641522 -vt 8.778073 0.749761 -vt 8.692423 0.617518 -vt 8.794172 0.725757 -vt 8.860535 0.366840 -vt 8.961625 0.474381 -vt 8.876143 0.343563 -vt 8.977892 0.451803 -vt 9.045496 0.091033 -vt 9.147245 0.199272 -vt 9.062070 0.066321 -vt 9.163819 0.174560 -vt 9.228871 -0.182407 -vt 9.327697 -0.077277 -vt 9.246063 -0.208041 -vt 9.347813 -0.099805 -vt 9.515635 -0.350052 -vt 9.413887 -0.458291 -vt 9.429496 -0.481567 -vt 9.531244 -0.373328 -vt 9.598797 -0.734021 -vt 9.700546 -0.625785 -vt 9.615991 -0.759660 -vt 9.717739 -0.651421 -vt 9.783801 -1.009892 -vt 9.885551 -0.901653 -vt 9.800203 -1.034348 -vt 9.901951 -0.926107 -vt 9.968053 -1.284636 -vt 10.069799 -1.176399 -vt 9.982868 -1.306729 -vt 10.084616 -1.198493 -vt 10.152263 -1.559325 -vt 10.254010 -1.451087 -vt 10.169454 -1.584962 -vt 10.377923 -1.895820 -vt 10.477459 -1.789494 -vt 10.459341 -1.762478 -vt 10.589499 -0.661404 -vt 10.308938 -0.243047 -vt 10.574682 -0.639312 -vt 10.294122 -0.220951 -vt 10.390433 -0.364566 -vt 10.020516 0.187033 -vt 9.739956 0.605392 -vt 9.114342 1.538277 -vt 8.833778 1.956635 -vt 8.927800 1.816440 -vt 8.647238 2.234795 -vt 8.912190 1.839716 -vt 8.743587 2.091125 -vt 8.463025 2.509483 -vt 8.557767 2.368210 -vt 8.542159 2.391484 -vt 8.373549 2.642907 -vt 8.358047 2.666020 -vt 8.077486 3.084380 -vt 8.190131 2.916410 -vt 7.909571 3.334765 -vt 11.266186 -0.372013 -vt 11.608371 -0.009204 -vt 11.608368 -0.009201 -vt 15.000564 3.601183 -vt 14.651163 3.229590 -vt 14.026266 2.557976 -vt 12.591950 -1.660313 -vt 13.596533 2.098807 -vt 14.026901 2.555202 -vt 15.688848 1.797528 -vt 13.987474 3.265111 -vt 13.596533 2.098806 -vt 13.652785 2.090883 -vt 13.691926 2.073108 -vt 18.679764 4.919809 -vt 18.647970 4.885989 -vt 18.708647 4.849053 -vt 15.752421 1.865156 -vt 15.787593 1.740475 -vt 12.569705 -1.579991 -vt 11.399836 -0.808284 -vt 13.620980 2.057049 -vn 0.000000 0.620311 0.784356 -vn 0.000000 -0.620311 -0.784356 -vn 1.000000 0.000002 0.000003 -vn -0.000004 1.000000 -0.000003 -vn -0.000002 1.000000 0.000004 -vn 0.051107 0.998693 0.000002 -vn 0.051109 0.998693 0.000000 -vn 0.002127 -0.603302 -0.797510 -vn 0.000001 -0.649590 -0.760284 -vn 0.000002 -1.000000 -0.000642 -vn -0.000000 -1.000000 -0.000648 -vn -0.000002 0.620969 0.783835 -vn 0.000000 0.621022 0.783794 -vn -0.000000 0.587479 0.809240 -vn 0.000001 0.587497 0.809226 -vn -0.000002 0.608604 0.793474 -vn -0.000001 0.608632 0.793453 -vn -0.000001 0.622576 0.782559 -vn -0.000000 0.622588 0.782550 -vn -0.000002 0.579808 0.814753 -vn -0.000002 0.579809 0.814753 -vn -0.000001 0.607958 0.793969 -vn -0.000002 0.607939 0.793984 -vn -0.000001 0.613550 0.789656 -vn -0.000002 0.613527 0.789674 -vn -0.000002 0.593929 0.804517 -vn -0.000001 0.593955 0.804498 -vn 0.000001 0.608200 0.793784 -vn -0.000001 0.608153 0.793820 -vn 0.000000 0.616918 0.787028 -vn -0.000001 0.608631 0.793454 -vn -0.000001 0.608634 0.793451 -vn -0.000000 0.630929 0.775840 -vn -0.000001 0.630926 0.775843 -vn 0.000001 0.598874 0.800844 -vn -0.000001 0.598818 0.800885 -vn -0.000000 0.588629 0.808403 -vn -0.000000 0.630920 0.775848 -vn 0.000001 0.630951 0.775823 -vn -0.000001 -0.621013 -0.783800 -vn -0.000000 -0.621036 -0.783782 -vn 0.000000 -0.587499 -0.809225 -vn -0.000001 -0.587467 -0.809249 -vn 0.000002 -0.608620 -0.793462 -vn 0.000001 -0.608589 -0.793486 -vn -0.000001 -0.622553 -0.782578 -vn 0.000002 -0.622607 -0.782535 -vn -0.000000 -0.579800 -0.814759 -vn 0.000001 -0.579828 -0.814739 -vn 0.000001 -0.607936 -0.793986 -vn 0.000002 -0.607958 -0.793969 -vn -0.000001 -0.613508 -0.789688 -vn 0.000000 -0.613543 -0.789661 -vn 0.000002 -0.593973 -0.804485 -vn 0.000001 -0.593955 -0.804498 -vn 0.000001 -0.608167 -0.793809 -vn 0.000001 -0.608174 -0.793803 -vn 0.000000 -0.616920 -0.787026 -vn -0.000001 -0.616883 -0.787054 -vn 0.000000 -0.608613 -0.793467 -vn -0.000001 -0.630902 -0.775863 -vn 0.000001 -0.630929 -0.775840 -vn 0.000000 -0.598805 -0.800895 -vn 0.000001 -0.598823 -0.800882 -vn 0.000000 -0.588600 -0.808425 -vn -0.000000 -0.588582 -0.808437 -vn 0.000000 -0.630910 -0.775856 -vn 0.000000 -0.630920 -0.775848 -vn 0.000001 -1.000000 -0.000003 -vn -0.000001 1.000000 0.000000 -vn 0.000001 -1.000000 -0.000001 -vn 0.000001 -1.000000 -0.000002 -vn -0.000001 1.000000 0.000002 -vn 0.000001 -1.000000 0.000000 -vn -0.000002 1.000000 0.000003 -vn -0.000001 1.000000 0.000004 -vn -0.000001 1.000000 -0.000003 -vn 0.000001 1.000000 0.000003 -vn -0.000000 1.000000 0.000874 -vn -0.000001 1.000000 0.000876 -vn 0.000005 1.000000 -0.000002 -vn 0.000004 1.000000 -0.000000 -vn 0.000000 0.664030 0.747706 -vn 0.000000 0.664033 0.747703 -vn 0.000007 1.000000 0.000001 s off -f 11473/4514/3 11475/4514/3 11476/4514/3 -f 11473/4514/3 11476/4514/3 11474/4514/3 -f 11477/4514/331 11478/4514/331 11480/4514/331 -f 11480/4514/331 11479/4514/331 11477/4514/331 -f 11473/4514/5065 11474/4514/5065 11478/4514/5065 -f 11473/4514/5065 11478/4514/5065 11477/4514/5065 -f 11474/4514/63 11476/4514/63 11480/4514/63 -f 11480/4514/63 11478/4514/63 11474/4514/63 -f 11476/4514/5066 11475/4514/5066 11479/4514/5066 -f 11479/4514/5066 11480/4514/5066 11476/4514/5066 -f 11475/4514/7 11473/4514/7 11477/4514/7 -f 11477/4514/7 11479/4514/7 11475/4514/7 -f 11481/4515/3 11483/4516/3 11484/4517/3 -f 11688/4515/3 11482/4518/3 11689/4516/3 -f 11485/4519/331 11486/4520/331 11488/4521/331 -f 11690/4519/331 11487/4522/331 11691/4520/331 -f 11692/4519/5065 11693/4523/5065 11694/4524/5065 -f 11695/4519/5065 11696/4525/5065 11697/4523/5065 -f 11698/4519/5067 11699/4526/5067 11700/4527/5067 -f 11701/4519/63 11702/4521/63 11703/4526/63 -f 11704/4528/5066 11705/4529/5066 11706/4528/5066 -f 11707/4528/5066 11708/4529/5066 11709/4529/5066 -f 11710/4530/7 11711/4531/7 11712/4530/7 -f 11713/4530/7 11714/4531/7 11715/4531/7 -f 11514/4532/331 11492/4533/331 11496/4534/331 -f 11526/4535/331 11716/4536/331 11717/4537/331 -f 11513/4538/331 11718/4536/331 11719/4535/331 -f 11720/4539/2860 11721/4540/2860 11497/4541/2860 -f 11512/4542/331 11722/4543/331 11723/4544/331 -f 11724/4545/331 11725/4543/331 11515/4542/331 -f 11726/4546/4399 11727/4547/4399 11498/4548/4399 -f 11525/4549/4399 11728/4547/4399 11729/4546/4399 -f 11491/4549/331 11730/4550/331 11731/4547/331 -f 11732/4551/4399 11733/4550/4399 11493/4552/4399 -f 11734/4553/933 11735/4550/933 11499/4551/933 -f 11524/4550/933 11736/4532/933 11737/4554/933 -f 11738/4555/933 11739/4532/933 11500/4556/933 -f 11511/4557/331 11740/4532/331 11741/4555/331 -f 11742/4558/331 11743/4532/331 11516/4559/331 -f 11510/4560/331 11744/4532/331 11745/4558/331 -f 11509/4561/331 11746/4532/331 11747/4560/331 -f 11748/4562/331 11749/4532/331 11517/4563/331 -f 11750/4564/933 11751/4532/933 11501/4565/933 -f 11523/4566/935 11752/4532/935 11753/4564/935 -f 11508/4567/331 11754/4568/331 11755/4528/331 -f 11490/4569/331 11756/4570/331 11757/4571/331 -f 11490/4569/331 11758/4571/331 11518/4572/331 -f 11507/4573/331 11759/4529/331 11760/4530/331 -f 11761/4574/331 11762/4530/331 11519/4531/331 -f 11506/4575/5068 11763/4531/5068 11764/4576/5068 -f 11489/4577/939 11765/4578/939 11766/4579/939 -f 11767/4579/331 11768/4580/331 11520/4577/331 -f 11769/4578/935 11770/4581/935 11494/4582/935 -f 11771/4582/935 11772/4579/935 11502/4578/935 -f 11773/4583/5069 11774/4584/5069 11503/4585/5069 -f 11522/4586/331 11775/4587/331 11776/4588/331 -f 11777/4589/331 11778/4587/331 11495/4586/331 -f 11504/4589/5070 11505/4590/5070 11779/4591/5070 -f 11780/4589/5071 11781/4591/5071 11782/4587/5071 -f 11783/4592/331 11495/4586/331 11784/4588/331 -f 11521/4592/331 11785/4588/331 11786/4593/331 -f 11787/4591/331 11521/4592/331 11788/4593/331 -f 11536/4590/5072 11537/4592/5072 11598/4591/5072 -f 11599/4594/5073 11789/4595/5073 11790/4596/5073 -f 11534/4597/5074 11791/4596/5074 11792/4595/5074 -f 11793/4598/5075 11600/4594/5075 11794/4599/5075 -f 11601/4596/5076 11602/4599/5076 11538/4594/5076 -f 11795/4600/5077 11539/4598/5077 11796/4601/5077 -f 11603/4602/5078 11604/4600/5078 11540/4603/5078 -f 11797/4601/5079 11541/4603/5079 11798/4600/5079 -f 11605/4604/5080 11606/4602/5080 11542/4605/5080 -f 11799/4603/5081 11543/4605/5081 11800/4602/5081 -f 11607/4606/5082 11608/4604/5082 11544/4607/5082 -f 11801/4605/5083 11545/4607/5083 11802/4604/5083 -f 11609/4608/5084 11610/4609/5084 11546/4610/5084 -f 11803/4611/5085 11547/4610/5085 11804/4609/5085 -f 11611/4612/5086 11612/4608/5086 11548/4613/5086 -f 11805/4610/5087 11549/4613/5087 11806/4608/5087 -f 11614/4614/5088 11613/4612/5088 11550/4615/5088 -f 11807/4613/5089 11551/4615/5089 11808/4612/5089 -f 11615/4616/5090 11616/4614/5090 11552/4617/5090 -f 11809/4615/5091 11553/4617/5091 11810/4614/5091 -f 11617/4618/5092 11618/4616/5092 11554/4619/5092 -f 11811/4617/5093 11555/4619/5093 11812/4616/5093 -f 11619/4620/5094 11620/4621/5094 11556/4622/5094 -f 11813/4623/5094 11557/4620/5094 11814/4624/5094 -f 11621/4622/5095 11622/4624/5095 11558/4620/5095 -f 11815/4625/5096 11559/4623/5096 11816/4626/5096 -f 11623/4624/5097 11624/4626/5097 11560/4623/5097 -f 11817/4627/5098 11561/4625/5098 11818/4628/5098 -f 11625/4626/5099 11626/4628/5099 11562/4625/5099 -f 11819/4629/5100 11563/4627/5100 11820/4630/5100 -f 11627/4628/5101 11628/4630/5101 11564/4627/5101 -f 11821/4631/5101 11565/4629/5101 11822/4632/5101 -f 11629/4630/5102 11630/4632/5102 11566/4629/5102 -f 11823/4633/5103 11567/4631/5103 11824/4634/5103 -f 11633/4632/5104 11632/4634/5104 11568/4631/5104 -f 11825/4635/5105 11569/4633/5105 11826/4636/5105 -f 11635/4634/5106 11634/4636/5106 11570/4633/5106 -f 11827/4637/5107 11571/4635/5107 11828/4638/5107 -f 11637/4636/5108 11636/4638/5108 11572/4635/5108 -f 11829/4639/5109 11573/4637/5109 11830/4640/5109 -f 11639/4638/5110 11638/4640/5110 11574/4637/5110 -f 11831/4641/5111 11575/4639/5111 11832/4642/5111 -f 11641/4640/5112 11640/4642/5112 11576/4639/5112 -f 11833/4643/5113 11577/4641/5113 11834/4644/5113 -f 11643/4645/5114 11642/4643/5114 11578/4646/5114 -f 11835/4644/5115 11579/4646/5115 11836/4643/5115 -f 11645/4647/5116 11644/4645/5116 11580/4648/5116 -f 11837/4646/5117 11581/4648/5117 11838/4645/5117 -f 11647/4649/5118 11646/4647/5118 11582/4650/5118 -f 11839/4648/5119 11583/4650/5119 11840/4647/5119 -f 11649/4651/5120 11648/4649/5120 11584/4652/5120 -f 11841/4650/5121 11585/4652/5121 11842/4649/5121 -f 11651/4653/5122 11650/4651/5122 11586/4654/5122 -f 11843/4652/5123 11587/4654/5123 11844/4651/5123 -f 11653/4655/5124 11652/4656/5124 11588/4657/5124 -f 11845/4658/5124 11589/4657/5124 11846/4656/5124 -f 11655/4659/5125 11654/4660/5125 11590/4661/5125 -f 11847/4662/5126 11591/4661/5126 11848/4660/5126 -f 11657/4661/5127 11656/4662/5127 11592/4663/5127 -f 11849/4664/5128 11593/4663/5128 11850/4662/5128 -f 11659/4663/5129 11658/4664/5129 11594/4665/5129 -f 11851/4666/5130 11595/4665/5130 11852/4664/5130 -f 11661/4665/5131 11660/4666/5131 11596/4667/5131 -f 11853/4668/5132 11597/4667/5132 11854/4666/5132 -f 11855/4667/5133 11856/4668/5133 11857/4669/5133 -f 11858/4670/252 11859/4669/252 11860/4668/252 -f 11861/4669/243 11862/4670/243 11863/4671/243 -f 11864/4672/331 11865/4671/331 11866/4670/331 -f 11867/4671/2216 11868/4672/2216 11869/4673/2216 -f 11870/4674/243 11871/4673/243 11872/4672/243 -f 11873/4673/252 11874/4674/252 11875/4675/252 -f 11876/4676/252 11877/4675/252 11878/4674/252 -f 11879/4675/2216 11880/4676/2216 11881/4677/2216 -f 11882/4678/2216 11883/4677/2216 11884/4676/2216 -f 11885/4677/3 11886/4678/3 11887/4679/3 -f 11888/4680/3 11889/4679/3 11890/4678/3 -f 11891/4681/243 11892/4682/243 11893/4680/243 -f 11894/4682/243 11895/4681/243 11896/4683/243 -f 11897/4684/3 11898/4683/3 11899/4681/3 -f 11900/4683/252 11901/4684/252 11902/4685/252 -f 11903/4686/243 11904/4685/243 11905/4684/243 -f 11906/4685/243 11907/4686/243 11908/4687/243 -f 11909/4688/252 11910/4687/252 11911/4686/252 -f 11912/4687/252 11913/4688/252 11914/4689/252 -f 11915/4690/243 11916/4689/243 11917/4688/243 -f 11918/4689/243 11919/4690/243 11920/4691/243 -f 11921/4692/252 11922/4691/252 11923/4690/252 -f 11924/4691/252 11925/4692/252 11926/4693/252 -f 11927/4694/5134 11928/4693/5134 11929/4692/5134 -f 11930/4693/4399 11931/4694/4399 11932/4695/4399 -f 11933/4696/252 11934/4695/252 11935/4694/252 -f 11936/4695/5135 11937/4696/5135 11938/4697/5135 -f 11939/4698/4399 11940/4697/4399 11941/4696/4399 -f 11942/4697/4399 11943/4698/4399 11944/4699/4399 -f 11945/4700/5136 11946/4699/5136 11947/4698/5136 -f 11948/4701/252 11949/4702/252 11950/4700/252 -f 11951/4702/331 11952/4701/331 11953/4703/331 -f 11954/4704/4399 11955/4703/4399 11956/4701/4399 -f 11957/4703/2185 11958/4704/2185 11959/4705/2185 -f 11960/4706/5135 11961/4705/5135 11962/4704/5135 -f 11963/4705/4399 11964/4706/4399 11965/4707/4399 -f 11966/4708/4399 11967/4707/4399 11968/4706/4399 -f 11969/4707/3 11970/4708/3 11971/4709/3 -f 11972/4710/5135 11973/4709/5135 11974/4708/5135 -f 11975/4709/5137 11976/4710/5137 11977/4711/5137 -f 11978/4712/5137 11979/4711/5137 11980/4710/5137 -f 11981/4711/3 11982/4712/3 11983/4713/3 -f 11984/4714/5136 11985/4713/5136 11986/4712/5136 -f 11987/4713/4399 11988/4714/4399 11989/4715/4399 -f 11990/4716/331 11991/4715/331 11992/4714/331 -f 11993/4715/5135 11994/4716/5135 11995/4717/5135 -f 11996/4718/5138 11997/4717/5138 11998/4716/5138 -f 11999/4607/2089 12000/4605/2089 12001/4671/2089 -f 12002/4669/5139 12003/4671/5139 12004/4605/5139 -f 12005/4611/5136 12006/4607/5136 12007/4673/5136 -f 12008/4671/5135 12009/4673/5135 12010/4607/5135 -f 12011/4613/243 12012/4610/243 12013/4677/243 -f 12014/4675/5140 12015/4677/5140 12016/4610/5140 -f 12017/4715/5138 12018/4717/5138 12019/4650/5138 -f 12020/4654/5135 12021/4652/5135 12022/4719/5135 -f 12023/4717/4333 12024/4719/4333 12025/4652/4333 -f 12026/4657/4399 12027/4658/4399 12028/4720/4399 -f 12029/4721/4372 12030/4722/4372 12031/4655/4372 -f 12032/4651/2850 12033/4653/2850 12034/4718/2850 -f 11533/4723/243 11532/4724/243 11662/4649/243 -f 12035/4714/243 12036/4647/243 11528/4725/243 -f 12037/4726/5141 11673/4725/5141 12038/4647/5141 -f 11672/4710/5142 12039/4643/5142 12040/4727/5142 -f 11678/4701/942 12041/4635/942 12042/4728/942 -f 12043/4729/243 12044/4728/243 12045/4635/243 -f 12046/4618/4399 12047/4684/4399 11527/4730/4399 -f 12048/4730/331 12049/4731/331 11677/4618/331 -f 11529/4732/331 12050/4733/331 12051/4614/331 -f 12052/4678/243 11676/4612/243 12053/4734/243 -f 12054/4608/935 12055/4676/935 11664/4735/935 -f 11664/4735/4099 11663/4736/4099 11665/4608/4099 -f 11667/4606/5137 11679/4672/5137 11666/4737/5137 -f 12056/4670/5137 12057/4604/5137 12058/4738/5137 -f 12059/4602/243 12060/4668/243 12061/4739/243 -f 11530/4666/243 12062/4600/243 12063/4740/243 -f 12064/4741/5143 11535/4740/5143 11631/4600/5143 -f 12065/4742/5144 12066/4743/5144 12067/4598/5144 -f 11675/4662/243 12068/4594/243 12069/4583/243 -f 12070/4584/243 12071/4583/243 11531/4594/243 -f 12072/4744/331 11671/4745/331 11680/4746/331 -f 12073/4747/935 12074/4748/935 12075/4748/935 -f 11670/4749/331 12076/4750/331 12077/4751/331 -f 12078/4752/4399 12079/4753/4399 12080/4754/4399 -f 12081/4754/331 11681/4753/331 12082/4748/331 -f 11669/4755/5145 11682/4756/5145 11668/4752/5145 -f 12083/4756/2187 12084/4757/2187 12085/4752/2187 -f 12086/4757/5146 12087/4753/5146 12088/4752/5146 -f 11674/4758/942 12089/4759/942 12090/4760/942 -f 12091/4759/331 12092/4761/331 12093/4762/331 -f 12094/4759/5147 12095/4762/5147 12096/4760/5147 -f 12097/4762/5148 12098/4763/5148 12099/4750/5148 -f 12100/4655/5149 12101/4721/5149 12102/4764/5149 -f 12103/4765/938 12104/4756/938 12105/4755/938 -f 12106/4514/933 11686/4514/933 11685/4514/933 -f 11686/4514/5137 12107/4514/5137 12108/4514/5137 -f 11686/4514/243 12109/4514/243 11687/4514/243 -f 12110/4514/935 11684/4514/935 11687/4514/935 -f 11685/4514/5137 11683/4514/5137 12111/4514/5137 +f 569//42 570//42 571//42 +f 573//39 576//39 575//39 +f 569//438 573//438 574//438 +f 570//49 574//49 571//49 +f 571//46 575//46 572//46 +f 573//47 569//47 572//47 +f 572//42 569//42 571//42 +f 574//39 573//39 575//39 +f 570//48 569//48 574//48 +f 574//49 575//49 571//49 +f 575//46 576//46 572//46 +f 576//47 573//47 572//47 -- cgit v1.2.3 From d4f9ef652df196953551ff73b22be4ccbfd04a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 28 Apr 2014 09:13:39 +0300 Subject: Added blender files from customitems example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I698535a2ff768f8abd0fd75ee955b2fe099e275f Change-Id: I698535a2ff768f8abd0fd75ee955b2fe099e275f Reviewed-by: Tomi Korpipää --- tools/blender/oilrefinery.blend | Bin 0 -> 542224 bytes tools/blender/oilrig.blend | Bin 0 -> 521540 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/blender/oilrefinery.blend create mode 100644 tools/blender/oilrig.blend diff --git a/tools/blender/oilrefinery.blend b/tools/blender/oilrefinery.blend new file mode 100644 index 00000000..aba692a5 Binary files /dev/null and b/tools/blender/oilrefinery.blend differ diff --git a/tools/blender/oilrig.blend b/tools/blender/oilrig.blend new file mode 100644 index 00000000..5717ab3f Binary files /dev/null and b/tools/blender/oilrig.blend differ -- cgit v1.2.3 From ac276e4f176844e6048ad3eb7b4de5eed7eaefcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 28 Apr 2014 09:33:54 +0300 Subject: Updated customitems example meshes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If52735af2629cce80e88bdca04aecafd6768e08e Change-Id: If52735af2629cce80e88bdca04aecafd6768e08e Reviewed-by: Tomi Korpipää --- examples/datavisualization/customitems/oilrig.obj | 2309 +++++++++++-------- .../datavisualization/customitems/refinery.obj | 2417 +++++++++++--------- tools/blender/oilrefinery.blend | Bin 542224 -> 567896 bytes tools/blender/oilrig.blend | Bin 521540 -> 553204 bytes 4 files changed, 2601 insertions(+), 2125 deletions(-) diff --git a/examples/datavisualization/customitems/oilrig.obj b/examples/datavisualization/customitems/oilrig.obj index 2ed9421f..c3b6ea57 100644 --- a/examples/datavisualization/customitems/oilrig.obj +++ b/examples/datavisualization/customitems/oilrig.obj @@ -1,6 +1,5 @@ # Blender v2.66 (sub 0) OBJ File: 'oilrig.blend' # www.blender.org -o Cylinder.007 v 0.057462 2.272318 -1.170324 v 0.057461 8.181165 -0.128434 v 0.055540 2.268930 -1.151111 @@ -65,6 +64,42 @@ v 0.049850 2.278963 -1.208010 v 0.049849 8.187810 -0.166121 v 0.055540 2.275706 -1.189536 v 0.055539 8.184552 -0.147646 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.961940 0.308658 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.990393 0.597545 +vt 0.915735 0.222215 +vt 0.961940 0.691342 +vt 0.853553 0.146447 +vt 0.915735 0.777785 +vt 0.777785 0.084265 +vt 0.853553 0.853553 +vt 0.691342 0.038060 +vt 0.777785 0.915735 +vt 0.597545 0.009607 +vt 0.691342 0.961940 +vt 0.000000 0.500000 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.038060 0.691342 +vt 0.009607 0.597546 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.308659 0.961940 +vt 0.222215 0.915735 +vt 0.084265 0.222215 +vt 0.146447 0.853554 +vt 0.084266 0.777786 vn 0.995185 -0.017020 0.096528 vn 0.956940 -0.050408 0.285877 vn 0.881921 -0.081857 0.464235 @@ -171,131 +206,130 @@ vn 0.000005 -0.984808 -0.173646 vn 0.000003 -0.984808 -0.173647 vn 0.000008 -0.984805 -0.173663 s off -f 1//1 2//1 4//1 -f 3//2 4//2 6//2 -f 5//3 6//3 8//3 -f 7//4 8//4 10//4 -f 9//5 10//5 12//5 -f 11//6 12//6 14//6 -f 13//7 14//7 16//7 -f 15//8 16//8 18//8 -f 17//9 18//9 19//9 -f 19//10 20//10 21//10 -f 21//11 22//11 23//11 -f 23//12 24//12 25//12 -f 25//13 26//13 27//13 -f 27//14 28//14 29//14 -f 29//15 30//15 31//15 -f 31//16 32//16 33//16 -f 33//17 34//17 35//17 -f 35//18 36//18 37//18 -f 37//19 38//19 39//19 -f 39//20 40//20 41//20 -f 41//21 42//21 43//21 -f 43//22 44//22 45//22 -f 45//23 46//23 47//23 -f 47//24 48//24 49//24 -f 49//25 50//25 52//25 -f 51//26 52//26 54//26 -f 53//27 54//27 56//27 -f 55//28 56//28 58//28 -f 57//29 58//29 60//29 -f 59//30 60//30 62//30 -f 48//31 52//31 50//31 -f 63//32 64//32 2//32 -f 61//33 62//33 64//33 -f 1//34 3//34 63//34 -f 3//35 1//35 4//35 -f 5//36 3//36 6//36 -f 7//37 5//37 8//37 -f 9//38 7//38 10//38 -f 11//39 9//39 12//39 -f 13//40 11//40 14//40 -f 15//41 13//41 16//41 -f 17//42 15//42 18//42 -f 18//43 20//43 19//43 -f 20//44 22//44 21//44 -f 22//45 24//45 23//45 -f 24//46 26//46 25//46 -f 26//47 28//47 27//47 -f 28//48 30//48 29//48 -f 30//49 32//49 31//49 -f 32//50 34//50 33//50 -f 34//17 36//17 35//17 -f 36//51 38//51 37//51 -f 38//52 40//52 39//52 -f 40//53 42//53 41//53 -f 42//54 44//54 43//54 -f 44//55 46//55 45//55 -f 46//56 48//56 47//56 -f 48//57 50//57 49//57 -f 51//58 49//58 52//58 -f 53//59 51//59 54//59 -f 55//60 53//60 56//60 -f 57//28 55//28 58//28 -f 59//61 57//61 60//61 -f 61//62 59//62 62//62 -f 48//63 54//63 52//63 -f 46//64 54//64 48//64 -f 46//65 56//65 54//65 -f 44//65 56//65 46//65 -f 44//66 58//66 56//66 -f 42//66 58//66 44//66 -f 42//67 60//67 58//67 -f 40//67 60//67 42//67 -f 40//68 62//68 60//68 -f 38//68 62//68 40//68 -f 38//69 64//69 62//69 -f 20//70 24//70 22//70 -f 16//71 20//71 18//71 -f 16//72 24//72 20//72 -f 36//69 64//69 38//69 -f 34//73 64//73 36//73 -f 2//74 64//74 34//74 -f 4//75 2//75 34//75 -f 4//75 34//75 32//75 -f 6//76 4//76 32//76 -f 6//76 32//76 30//76 -f 6//68 30//68 28//68 -f 8//68 6//68 28//68 -f 10//73 8//73 28//73 -f 10//67 28//67 26//67 -f 12//77 10//77 26//77 -f 12//78 26//78 24//78 -f 14//79 12//79 24//79 -f 16//80 14//80 24//80 -f 1//32 63//32 2//32 -f 63//81 61//81 64//81 -f 19//82 15//82 17//82 -f 41//83 37//83 39//83 -f 3//84 5//84 63//84 -f 45//85 41//85 43//85 -f 45//86 37//86 41//86 -f 49//87 45//87 47//87 -f 49//84 37//84 45//84 -f 49//84 35//84 37//84 -f 49//84 33//84 35//84 -f 49//84 31//84 33//84 -f 55//88 51//88 53//88 -f 59//89 55//89 57//89 -f 61//90 55//90 59//90 -f 63//91 55//91 61//91 -f 63//92 5//92 55//92 -f 5//93 7//93 55//93 -f 7//94 9//94 55//94 -f 29//95 25//95 27//95 -f 31//96 25//96 29//96 -f 49//97 25//97 31//97 -f 49//98 23//98 25//98 -f 9//93 11//93 55//93 -f 11//99 13//99 55//99 -f 13//100 15//100 55//100 -f 15//101 19//101 55//101 -f 19//102 21//102 55//102 -f 21//103 23//103 55//103 -f 23//104 49//104 55//104 -f 49//105 51//105 55//105 -o Cylinder.006 +f 1/1/1 2/2/1 4/3/1 +f 3/1/2 4/2/2 6/3/2 +f 5/1/3 6/2/3 8/3/3 +f 7/1/4 8/2/4 10/3/4 +f 9/1/5 10/2/5 12/3/5 +f 11/1/6 12/2/6 14/3/6 +f 13/1/7 14/2/7 16/3/7 +f 15/1/8 16/2/8 18/3/8 +f 17/1/9 18/2/9 19/4/9 +f 19/1/10 20/2/10 21/4/10 +f 21/1/11 22/2/11 23/4/11 +f 23/1/12 24/2/12 25/4/12 +f 25/1/13 26/2/13 27/4/13 +f 27/1/14 28/2/14 29/4/14 +f 29/1/15 30/2/15 31/4/15 +f 31/1/16 32/2/16 33/4/16 +f 33/1/17 34/2/17 35/4/17 +f 35/1/18 36/2/18 37/4/18 +f 37/1/19 38/2/19 39/4/19 +f 39/1/20 40/2/20 41/4/20 +f 41/1/21 42/2/21 43/4/21 +f 43/1/22 44/2/22 45/4/22 +f 45/1/23 46/2/23 47/4/23 +f 47/1/24 48/2/24 49/4/24 +f 49/1/25 50/2/25 52/3/25 +f 51/1/26 52/2/26 54/3/26 +f 53/1/27 54/2/27 56/3/27 +f 55/1/28 56/2/28 58/3/28 +f 57/1/29 58/2/29 60/3/29 +f 59/1/30 60/2/30 62/3/30 +f 48/5/31 52/6/31 50/7/31 +f 63/1/32 64/2/32 2/3/32 +f 61/1/33 62/2/33 64/3/33 +f 1/8/34 3/9/34 63/10/34 +f 3/4/35 1/1/35 4/3/35 +f 5/4/36 3/1/36 6/3/36 +f 7/4/37 5/1/37 8/3/37 +f 9/4/38 7/1/38 10/3/38 +f 11/4/39 9/1/39 12/3/39 +f 13/4/40 11/1/40 14/3/40 +f 15/4/41 13/1/41 16/3/41 +f 17/4/42 15/1/42 18/3/42 +f 18/2/43 20/3/43 19/4/43 +f 20/2/44 22/3/44 21/4/44 +f 22/2/45 24/3/45 23/4/45 +f 24/2/46 26/3/46 25/4/46 +f 26/2/47 28/3/47 27/4/47 +f 28/2/48 30/3/48 29/4/48 +f 30/2/49 32/3/49 31/4/49 +f 32/2/50 34/3/50 33/4/50 +f 34/2/17 36/3/17 35/4/17 +f 36/2/51 38/3/51 37/4/51 +f 38/2/52 40/3/52 39/4/52 +f 40/2/53 42/3/53 41/4/53 +f 42/2/54 44/3/54 43/4/54 +f 44/2/55 46/3/55 45/4/55 +f 46/2/56 48/3/56 47/4/56 +f 48/2/57 50/3/57 49/4/57 +f 51/4/58 49/1/58 52/3/58 +f 53/4/59 51/1/59 54/3/59 +f 55/4/60 53/1/60 56/3/60 +f 57/4/28 55/1/28 58/3/28 +f 59/4/61 57/1/61 60/3/61 +f 61/4/62 59/1/62 62/3/62 +f 48/5/63 54/11/63 52/6/63 +f 46/12/64 54/11/64 48/5/64 +f 46/12/65 56/13/65 54/11/65 +f 44/14/65 56/13/65 46/12/65 +f 44/14/66 58/15/66 56/13/66 +f 42/16/66 58/15/66 44/14/66 +f 42/16/67 60/17/67 58/15/67 +f 40/18/67 60/17/67 42/16/67 +f 40/18/68 62/19/68 60/17/68 +f 38/20/68 62/19/68 40/18/68 +f 38/20/69 64/21/69 62/19/69 +f 20/22/70 24/23/70 22/24/70 +f 16/25/71 20/22/71 18/26/71 +f 16/25/72 24/23/72 20/22/72 +f 36/27/69 64/21/69 38/20/69 +f 34/28/73 64/21/73 36/27/73 +f 2/9/74 64/21/74 34/28/74 +f 4/8/75 2/9/75 34/28/75 +f 4/8/75 34/28/75 32/29/75 +f 6/10/76 4/8/76 32/29/76 +f 6/10/76 32/29/76 30/30/76 +f 6/10/68 30/30/68 28/31/68 +f 8/32/68 6/10/68 28/31/68 +f 10/33/73 8/32/73 28/31/73 +f 10/33/67 28/31/67 26/34/67 +f 12/35/77 10/33/77 26/34/77 +f 12/35/78 26/34/78 24/23/78 +f 14/36/79 12/35/79 24/23/79 +f 16/25/80 14/36/80 24/23/80 +f 1/4/32 63/1/32 2/3/32 +f 63/4/81 61/1/81 64/3/81 +f 19/7/82 15/11/82 17/6/82 +f 41/31/83 37/29/83 39/30/83 +f 3/9/84 5/21/84 63/10/84 +f 45/23/85 41/31/85 43/34/85 +f 45/23/86 37/29/86 41/31/86 +f 49/22/87 45/23/87 47/24/87 +f 49/22/84 37/29/84 45/23/84 +f 49/22/84 35/28/84 37/29/84 +f 49/22/84 33/27/84 35/28/84 +f 49/22/84 31/20/84 33/27/84 +f 55/36/88 51/26/88 53/25/88 +f 59/33/89 55/36/89 57/35/89 +f 61/32/90 55/36/90 59/33/90 +f 63/10/91 55/36/91 61/32/91 +f 63/10/92 5/21/92 55/36/92 +f 5/21/93 7/19/93 55/36/93 +f 7/19/94 9/17/94 55/36/94 +f 29/18/95 25/14/95 27/16/95 +f 31/20/96 25/14/96 29/18/96 +f 49/22/97 25/14/97 31/20/97 +f 49/22/98 23/12/98 25/14/98 +f 9/17/93 11/15/93 55/36/93 +f 11/15/99 13/13/99 55/36/99 +f 13/13/100 15/11/100 55/36/100 +f 15/11/101 19/7/101 55/36/101 +f 19/7/102 21/5/102 55/36/102 +f 21/5/103 23/12/103 55/36/103 +f 23/12/104 49/22/104 55/36/104 +f 49/22/105 51/26/105 55/36/105 v 0.053672 2.252534 1.125439 v 0.053673 8.161380 0.083549 v 0.051751 2.255921 1.144652 @@ -360,6 +394,42 @@ v 0.046060 2.245888 1.087752 v 0.046061 8.154735 0.045863 v 0.051751 2.249146 1.106226 v 0.051752 8.157992 0.064337 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.308659 0.961940 +vt 0.222215 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 0.990393 0.402455 +vt 1.000000 0.500000 +vt 0.853553 0.146447 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.691342 0.038060 +vt 0.777785 0.084265 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.146447 0.853554 +vt 0.084266 0.777786 +vt 0.038060 0.691342 +vt 0.308658 0.038060 +vt 0.402455 0.009607 +vt 0.146446 0.146447 +vt 0.222215 0.084265 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.009607 0.597546 +vt 0.000000 0.500000 vn 0.995185 0.017020 0.096528 vn 0.956940 0.050408 0.285877 vn 0.881921 0.081857 0.464236 @@ -471,131 +541,130 @@ vn -0.000000 -0.984810 0.173637 vn 0.000000 -0.984806 0.173659 vn -0.000001 -0.984805 0.173664 s off -f 65//106 66//106 68//106 -f 67//107 68//107 70//107 -f 69//108 70//108 72//108 -f 71//109 72//109 74//109 -f 73//110 74//110 76//110 -f 75//111 76//111 78//111 -f 77//112 78//112 80//112 -f 79//113 80//113 82//113 -f 81//114 82//114 83//114 -f 83//115 84//115 85//115 -f 85//116 86//116 87//116 -f 87//117 88//117 89//117 -f 89//118 90//118 91//118 -f 91//119 92//119 93//119 -f 93//120 94//120 95//120 -f 95//121 96//121 97//121 -f 97//122 98//122 99//122 -f 99//123 100//123 101//123 -f 101//124 102//124 103//124 -f 103//125 104//125 105//125 -f 105//126 106//126 107//126 -f 107//127 108//127 109//127 -f 109//128 110//128 111//128 -f 111//129 112//129 113//129 -f 113//130 114//130 116//130 -f 115//131 116//131 118//131 -f 117//132 118//132 120//132 -f 119//133 120//133 122//133 -f 121//134 122//134 124//134 -f 123//135 124//135 126//135 -f 68//136 66//136 70//136 -f 127//137 128//137 66//137 -f 125//138 126//138 128//138 -f 65//139 67//139 69//139 -f 67//140 65//140 68//140 -f 69//141 67//141 70//141 -f 71//142 69//142 72//142 -f 73//143 71//143 74//143 -f 75//144 73//144 76//144 -f 77//145 75//145 78//145 -f 79//146 77//146 80//146 -f 81//147 79//147 82//147 -f 82//148 84//148 83//148 -f 84//149 86//149 85//149 -f 86//150 88//150 87//150 -f 88//151 90//151 89//151 -f 90//152 92//152 91//152 -f 92//153 94//153 93//153 -f 94//154 96//154 95//154 -f 96//155 98//155 97//155 -f 98//156 100//156 99//156 -f 100//157 102//157 101//157 -f 102//124 104//124 103//124 -f 104//158 106//158 105//158 -f 106//159 108//159 107//159 -f 108//160 110//160 109//160 -f 110//161 112//161 111//161 -f 112//162 114//162 113//162 -f 115//163 113//163 116//163 -f 117//164 115//164 118//164 -f 119//165 117//165 120//165 -f 121//166 119//166 122//166 -f 123//167 121//167 124//167 -f 125//168 123//168 126//168 -f 66//169 128//169 126//169 -f 70//170 66//170 126//170 -f 72//171 70//171 74//171 -f 70//172 126//172 74//172 -f 126//173 124//173 74//173 -f 122//174 120//174 118//174 -f 124//175 122//175 118//175 -f 114//176 118//176 116//176 -f 124//177 118//177 114//177 -f 108//178 112//178 110//178 -f 104//179 108//179 106//179 -f 102//180 108//180 104//180 -f 100//181 108//181 102//181 -f 76//182 74//182 78//182 -f 78//183 74//183 80//183 -f 96//184 100//184 98//184 -f 96//185 108//185 100//185 -f 92//186 96//186 94//186 -f 90//187 96//187 92//187 -f 88//188 96//188 90//188 -f 86//189 96//189 88//189 -f 82//176 86//176 84//176 -f 74//190 124//190 80//190 -f 124//191 114//191 80//191 -f 114//192 112//192 80//192 -f 112//193 108//193 80//193 -f 108//194 96//194 80//194 -f 96//195 86//195 80//195 -f 86//196 82//196 80//196 -f 65//137 127//137 66//137 -f 127//197 125//197 128//197 -f 127//198 65//198 125//198 -f 83//199 79//199 81//199 -f 97//200 93//200 95//200 -f 99//200 93//200 97//200 -f 103//201 99//201 101//201 -f 103//202 93//202 99//202 -f 105//203 93//203 103//203 -f 115//199 111//199 113//199 -f 115//204 109//204 111//204 -f 117//205 109//205 115//205 -f 117//206 107//206 109//206 -f 119//207 107//207 117//207 -f 119//208 105//208 107//208 -f 121//208 105//208 119//208 -f 123//200 105//200 121//200 -f 125//209 105//209 123//209 -f 125//200 65//200 105//200 -f 105//200 65//200 93//200 -f 65//210 69//210 93//210 -f 69//209 71//209 93//209 -f 93//200 71//200 91//200 -f 91//211 71//211 89//211 -f 71//212 73//212 89//212 -f 73//211 75//211 89//211 -f 89//208 75//208 87//208 -f 75//213 77//213 87//213 -f 87//207 77//207 85//207 -f 77//214 79//214 85//214 -f 79//215 83//215 85//215 -o Cylinder.005 +f 65/37/106 66/38/106 68/39/106 +f 67/37/107 68/38/107 70/39/107 +f 69/37/108 70/38/108 72/39/108 +f 71/37/109 72/38/109 74/39/109 +f 73/37/110 74/38/110 76/39/110 +f 75/37/111 76/38/111 78/39/111 +f 77/37/112 78/38/112 80/39/112 +f 79/37/113 80/38/113 82/39/113 +f 81/37/114 82/38/114 83/40/114 +f 83/37/115 84/38/115 85/40/115 +f 85/37/116 86/38/116 87/40/116 +f 87/37/117 88/38/117 89/40/117 +f 89/37/118 90/38/118 91/40/118 +f 91/37/119 92/38/119 93/40/119 +f 93/37/120 94/38/120 95/40/120 +f 95/37/121 96/38/121 97/40/121 +f 97/37/122 98/38/122 99/40/122 +f 99/37/123 100/38/123 101/40/123 +f 101/37/124 102/38/124 103/40/124 +f 103/37/125 104/38/125 105/40/125 +f 105/37/126 106/38/126 107/40/126 +f 107/37/127 108/38/127 109/40/127 +f 109/37/128 110/38/128 111/40/128 +f 111/37/129 112/38/129 113/40/129 +f 113/37/130 114/38/130 116/39/130 +f 115/37/131 116/38/131 118/39/131 +f 117/37/132 118/38/132 120/39/132 +f 119/37/133 120/38/133 122/39/133 +f 121/37/134 122/38/134 124/39/134 +f 123/37/135 124/38/135 126/39/135 +f 68/41/136 66/42/136 70/43/136 +f 127/37/137 128/38/137 66/39/137 +f 125/37/138 126/38/138 128/39/138 +f 65/41/139 67/42/139 69/44/139 +f 67/40/140 65/37/140 68/39/140 +f 69/40/141 67/37/141 70/39/141 +f 71/40/142 69/37/142 72/39/142 +f 73/40/143 71/37/143 74/39/143 +f 75/40/144 73/37/144 76/39/144 +f 77/40/145 75/37/145 78/39/145 +f 79/40/146 77/37/146 80/39/146 +f 81/40/147 79/37/147 82/39/147 +f 82/38/148 84/39/148 83/40/148 +f 84/38/149 86/39/149 85/40/149 +f 86/38/150 88/39/150 87/40/150 +f 88/38/151 90/39/151 89/40/151 +f 90/38/152 92/39/152 91/40/152 +f 92/38/153 94/39/153 93/40/153 +f 94/38/154 96/39/154 95/40/154 +f 96/38/155 98/39/155 97/40/155 +f 98/38/156 100/39/156 99/40/156 +f 100/38/157 102/39/157 101/40/157 +f 102/38/124 104/39/124 103/40/124 +f 104/38/158 106/39/158 105/40/158 +f 106/38/159 108/39/159 107/40/159 +f 108/38/160 110/39/160 109/40/160 +f 110/38/161 112/39/161 111/40/161 +f 112/38/162 114/39/162 113/40/162 +f 115/40/163 113/37/163 116/39/163 +f 117/40/164 115/37/164 118/39/164 +f 119/40/165 117/37/165 120/39/165 +f 121/40/166 119/37/166 122/39/166 +f 123/40/167 121/37/167 124/39/167 +f 125/40/168 123/37/168 126/39/168 +f 66/42/169 128/44/169 126/45/169 +f 70/43/170 66/42/170 126/45/170 +f 72/46/171 70/43/171 74/47/171 +f 70/43/172 126/45/172 74/47/172 +f 126/45/173 124/48/173 74/47/173 +f 122/49/174 120/50/174 118/51/174 +f 124/48/175 122/49/175 118/51/175 +f 114/52/176 118/51/176 116/53/176 +f 124/48/177 118/51/177 114/52/177 +f 108/54/178 112/55/178 110/56/178 +f 104/57/179 108/54/179 106/58/179 +f 102/59/180 108/54/180 104/57/180 +f 100/60/181 108/54/181 102/59/181 +f 76/61/182 74/47/182 78/62/182 +f 78/62/183 74/47/183 80/63/183 +f 96/64/184 100/60/184 98/65/184 +f 96/64/185 108/54/185 100/60/185 +f 92/66/186 96/64/186 94/67/186 +f 90/68/187 96/64/187 92/66/187 +f 88/69/188 96/64/188 90/68/188 +f 86/70/189 96/64/189 88/69/189 +f 82/71/176 86/70/176 84/72/176 +f 74/47/190 124/48/190 80/63/190 +f 124/48/191 114/52/191 80/63/191 +f 114/52/192 112/55/192 80/63/192 +f 112/55/193 108/54/193 80/63/193 +f 108/54/194 96/64/194 80/63/194 +f 96/64/195 86/70/195 80/63/195 +f 86/70/196 82/71/196 80/63/196 +f 65/40/137 127/37/137 66/39/137 +f 127/40/197 125/37/197 128/39/197 +f 127/43/198 65/41/198 125/46/198 +f 83/52/199 79/51/199 81/53/199 +f 97/60/200 93/57/200 95/59/200 +f 99/65/200 93/57/200 97/60/200 +f 103/67/201 99/65/201 101/64/201 +f 103/67/202 93/57/202 99/65/202 +f 105/66/203 93/57/203 103/67/203 +f 115/71/199 111/70/199 113/72/199 +f 115/71/204 109/69/204 111/70/204 +f 117/63/205 109/69/205 115/71/205 +f 117/63/206 107/68/206 109/69/206 +f 119/62/207 107/68/207 117/63/207 +f 119/62/208 105/66/208 107/68/208 +f 121/61/208 105/66/208 119/62/208 +f 123/47/200 105/66/200 121/61/200 +f 125/46/209 105/66/209 123/47/209 +f 125/46/200 65/41/200 105/66/200 +f 105/66/200 65/41/200 93/57/200 +f 65/41/210 69/44/210 93/57/210 +f 69/44/209 71/45/209 93/57/209 +f 93/57/200 71/45/200 91/58/200 +f 91/58/211 71/45/211 89/54/211 +f 71/45/212 73/48/212 89/54/212 +f 73/48/211 75/49/211 89/54/211 +f 89/54/208 75/49/208 87/56/208 +f 75/49/213 77/50/213 87/56/213 +f 87/56/207 77/50/207 85/55/207 +f 77/50/214 79/51/214 85/55/214 +f 79/51/215 83/52/215 85/55/215 v 1.116865 2.257815 -0.125221 v 0.074976 8.166661 -0.125221 v 1.136078 2.261203 -0.123300 @@ -660,6 +729,42 @@ v 1.079178 2.251170 -0.117609 v 0.037289 8.160016 -0.117609 v 1.097653 2.254427 -0.123300 v 0.055763 8.163274 -0.123300 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.000000 0.500000 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.146447 0.853554 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.308659 0.961940 +vt 0.222215 0.915735 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.009607 0.597546 +vt 0.084265 0.222215 vn 0.096528 0.017020 -0.995185 vn 0.285876 0.050408 -0.956940 vn 0.464235 0.081857 -0.881921 @@ -773,131 +878,130 @@ vn 0.173645 -0.984808 -0.000007 vn 0.173654 -0.984807 0.000007 vn 0.173646 -0.984808 -0.000004 s off -f 129//216 130//216 132//216 -f 131//217 132//217 134//217 -f 133//218 134//218 136//218 -f 135//219 136//219 138//219 -f 137//220 138//220 140//220 -f 139//221 140//221 142//221 -f 141//222 142//222 144//222 -f 143//223 144//223 146//223 -f 145//224 146//224 148//224 -f 147//225 148//225 150//225 -f 149//226 150//226 152//226 -f 151//227 152//227 154//227 -f 153//228 154//228 156//228 -f 155//229 156//229 158//229 -f 157//230 158//230 160//230 -f 159//231 160//231 162//231 -f 161//232 162//232 163//232 -f 163//233 164//233 165//233 -f 165//234 166//234 167//234 -f 167//235 168//235 169//235 -f 169//236 170//236 171//236 -f 171//237 172//237 173//237 -f 173//238 174//238 175//238 -f 175//239 176//239 177//239 -f 177//240 178//240 179//240 -f 179//241 180//241 181//241 -f 181//242 182//242 183//242 -f 183//243 184//243 185//243 -f 185//244 186//244 187//244 -f 187//245 188//245 189//245 -f 132//246 130//246 134//246 -f 191//247 192//247 129//247 -f 189//248 190//248 191//248 -f 129//249 131//249 191//249 -f 131//216 129//216 132//216 -f 133//250 131//250 134//250 -f 135//251 133//251 136//251 -f 137//252 135//252 138//252 -f 139//253 137//253 140//253 -f 141//254 139//254 142//254 -f 143//255 141//255 144//255 -f 145//256 143//256 146//256 -f 147//257 145//257 148//257 -f 149//258 147//258 150//258 -f 151//259 149//259 152//259 -f 153//260 151//260 154//260 -f 155//261 153//261 156//261 -f 157//262 155//262 158//262 -f 159//263 157//263 160//263 -f 161//231 159//231 162//231 -f 162//264 164//264 163//264 -f 164//265 166//265 165//265 -f 166//234 168//234 167//234 -f 168//266 170//266 169//266 -f 170//267 172//267 171//267 -f 172//268 174//268 173//268 -f 174//269 176//269 175//269 -f 176//270 178//270 177//270 -f 178//271 180//271 179//271 -f 180//241 182//241 181//241 -f 182//272 184//272 183//272 -f 184//273 186//273 185//273 -f 186//274 188//274 187//274 -f 188//275 190//275 189//275 -f 130//276 192//276 134//276 -f 192//277 190//277 134//277 -f 190//278 188//278 134//278 -f 188//279 186//279 134//279 -f 186//280 184//280 134//280 -f 184//281 182//281 134//281 -f 182//282 180//282 134//282 -f 180//283 178//283 134//283 -f 178//284 176//284 134//284 -f 176//285 174//285 134//285 -f 174//286 172//286 134//286 -f 170//287 168//287 166//287 -f 170//288 166//288 164//288 -f 148//289 152//289 150//289 -f 140//290 144//290 142//290 -f 172//287 170//287 164//287 -f 134//291 172//291 164//291 -f 136//292 134//292 138//292 -f 134//291 164//291 138//291 -f 162//293 160//293 158//293 -f 162//294 158//294 156//294 -f 146//295 152//295 148//295 -f 146//296 154//296 152//296 -f 144//297 154//297 146//297 -f 140//298 154//298 144//298 -f 138//299 164//299 140//299 -f 162//300 156//300 154//300 -f 164//301 162//301 140//301 -f 162//302 154//302 140//302 -f 192//303 130//303 129//303 -f 190//304 192//304 191//304 -f 131//305 133//305 191//305 -f 133//306 135//306 191//306 -f 135//305 137//305 191//305 -f 137//307 139//307 191//307 -f 139//308 141//308 191//308 -f 141//309 143//309 191//309 -f 143//310 145//310 191//310 -f 145//311 147//311 191//311 -f 147//312 149//312 191//312 -f 149//313 151//313 191//313 -f 151//314 153//314 191//314 -f 153//305 155//305 191//305 -f 155//315 157//315 191//315 -f 157//305 159//305 191//305 -f 159//316 161//316 191//316 -f 161//305 163//305 191//305 -f 163//305 165//305 191//305 -f 165//317 167//317 191//317 -f 167//317 169//317 191//317 -f 169//318 171//318 191//318 -f 171//319 173//319 191//319 -f 173//320 175//320 191//320 -f 175//321 177//321 191//321 -f 177//322 179//322 191//322 -f 179//323 181//323 191//323 -f 181//324 183//324 191//324 -f 183//325 185//325 191//325 -f 185//326 187//326 189//326 -f 191//327 185//327 189//327 -o Cylinder.004 +f 129/73/216 130/74/216 132/75/216 +f 131/73/217 132/74/217 134/75/217 +f 133/73/218 134/74/218 136/75/218 +f 135/73/219 136/74/219 138/75/219 +f 137/73/220 138/74/220 140/75/220 +f 139/73/221 140/74/221 142/75/221 +f 141/73/222 142/74/222 144/75/222 +f 143/73/223 144/74/223 146/75/223 +f 145/73/224 146/74/224 148/75/224 +f 147/73/225 148/74/225 150/75/225 +f 149/73/226 150/74/226 152/75/226 +f 151/73/227 152/74/227 154/75/227 +f 153/73/228 154/74/228 156/75/228 +f 155/73/229 156/74/229 158/75/229 +f 157/73/230 158/74/230 160/75/230 +f 159/73/231 160/74/231 162/75/231 +f 161/73/232 162/74/232 163/76/232 +f 163/73/233 164/74/233 165/76/233 +f 165/73/234 166/74/234 167/76/234 +f 167/73/235 168/74/235 169/76/235 +f 169/73/236 170/74/236 171/76/236 +f 171/73/237 172/74/237 173/76/237 +f 173/73/238 174/74/238 175/76/238 +f 175/73/239 176/74/239 177/76/239 +f 177/73/240 178/74/240 179/76/240 +f 179/73/241 180/74/241 181/76/241 +f 181/73/242 182/74/242 183/76/242 +f 183/73/243 184/74/243 185/76/243 +f 185/73/244 186/74/244 187/76/244 +f 187/73/245 188/74/245 189/76/245 +f 132/77/246 130/78/246 134/79/246 +f 191/73/247 192/74/247 129/76/247 +f 189/73/248 190/74/248 191/76/248 +f 129/77/249 131/78/249 191/79/249 +f 131/76/216 129/73/216 132/75/216 +f 133/76/250 131/73/250 134/75/250 +f 135/76/251 133/73/251 136/75/251 +f 137/76/252 135/73/252 138/75/252 +f 139/76/253 137/73/253 140/75/253 +f 141/76/254 139/73/254 142/75/254 +f 143/76/255 141/73/255 144/75/255 +f 145/76/256 143/73/256 146/75/256 +f 147/76/257 145/73/257 148/75/257 +f 149/76/258 147/73/258 150/75/258 +f 151/76/259 149/73/259 152/75/259 +f 153/76/260 151/73/260 154/75/260 +f 155/76/261 153/73/261 156/75/261 +f 157/76/262 155/73/262 158/75/262 +f 159/76/263 157/73/263 160/75/263 +f 161/76/231 159/73/231 162/75/231 +f 162/74/264 164/75/264 163/76/264 +f 164/74/265 166/75/265 165/76/265 +f 166/74/234 168/75/234 167/76/234 +f 168/74/266 170/75/266 169/76/266 +f 170/74/267 172/75/267 171/76/267 +f 172/74/268 174/75/268 173/76/268 +f 174/74/269 176/75/269 175/76/269 +f 176/74/270 178/75/270 177/76/270 +f 178/74/271 180/75/271 179/76/271 +f 180/74/241 182/75/241 181/76/241 +f 182/74/272 184/75/272 183/76/272 +f 184/74/273 186/75/273 185/76/273 +f 186/74/274 188/75/274 187/76/274 +f 188/74/275 190/75/275 189/76/275 +f 130/78/276 192/80/276 134/79/276 +f 192/80/277 190/81/277 134/79/277 +f 190/81/278 188/82/278 134/79/278 +f 188/82/279 186/83/279 134/79/279 +f 186/83/280 184/84/280 134/79/280 +f 184/84/281 182/85/281 134/79/281 +f 182/85/282 180/86/282 134/79/282 +f 180/86/283 178/87/283 134/79/283 +f 178/87/284 176/88/284 134/79/284 +f 176/88/285 174/89/285 134/79/285 +f 174/89/286 172/90/286 134/79/286 +f 170/91/287 168/92/287 166/93/287 +f 170/91/288 166/93/288 164/94/288 +f 148/95/289 152/96/289 150/97/289 +f 140/98/290 144/99/290 142/100/290 +f 172/90/287 170/91/287 164/94/287 +f 134/79/291 172/90/291 164/94/291 +f 136/101/292 134/79/292 138/102/292 +f 134/79/291 164/94/291 138/102/291 +f 162/103/293 160/104/293 158/105/293 +f 162/103/294 158/105/294 156/106/294 +f 146/107/295 152/96/295 148/95/295 +f 146/107/296 154/108/296 152/96/296 +f 144/99/297 154/108/297 146/107/297 +f 140/98/298 154/108/298 144/99/298 +f 138/102/299 164/94/299 140/98/299 +f 162/103/300 156/106/300 154/108/300 +f 164/94/301 162/103/301 140/98/301 +f 162/103/302 154/108/302 140/98/302 +f 192/74/303 130/75/303 129/76/303 +f 190/74/304 192/75/304 191/76/304 +f 131/78/305 133/80/305 191/79/305 +f 133/80/306 135/81/306 191/79/306 +f 135/81/305 137/82/305 191/79/305 +f 137/82/307 139/83/307 191/79/307 +f 139/83/308 141/84/308 191/79/308 +f 141/84/309 143/85/309 191/79/309 +f 143/85/310 145/86/310 191/79/310 +f 145/86/311 147/87/311 191/79/311 +f 147/87/312 149/88/312 191/79/312 +f 149/88/313 151/89/313 191/79/313 +f 151/89/314 153/90/314 191/79/314 +f 153/90/305 155/91/305 191/79/305 +f 155/91/315 157/92/315 191/79/315 +f 157/92/305 159/93/305 191/79/305 +f 159/93/316 161/94/316 191/79/316 +f 161/94/305 163/103/305 191/79/305 +f 163/103/305 165/104/305 191/79/305 +f 165/104/317 167/105/317 191/79/317 +f 167/105/317 169/106/317 191/79/317 +f 169/106/318 171/108/318 191/79/318 +f 171/108/319 173/96/319 191/79/319 +f 173/96/320 175/97/320 191/79/320 +f 175/97/321 177/95/321 191/79/321 +f 177/95/322 179/107/322 191/79/322 +f 179/107/323 181/99/323 191/79/323 +f 181/99/324 183/100/324 191/79/324 +f 183/100/325 185/98/325 191/79/325 +f 185/98/326 187/102/326 189/101/326 +f 191/79/327 185/98/327 189/101/327 v -1.178897 2.277600 -0.129009 v -0.137008 8.186446 -0.129009 v -1.159685 2.274212 -0.127088 @@ -962,6 +1066,42 @@ v -1.216584 2.284245 -0.121397 v -0.174695 8.193091 -0.121397 v -1.198110 2.280987 -0.127088 v -0.156220 8.189834 -0.127088 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.096528 -0.017020 -0.995185 vn 0.285876 -0.050408 -0.956940 vn 0.464236 -0.081857 -0.881921 @@ -1081,131 +1221,130 @@ vn -0.173647 -0.984808 0.000002 vn -0.173640 -0.984809 -0.000005 vn -0.173647 -0.984808 -0.000001 s off -f 193//328 194//328 196//328 -f 195//329 196//329 198//329 -f 197//330 198//330 200//330 -f 199//331 200//331 202//331 -f 201//332 202//332 204//332 -f 203//333 204//333 206//333 -f 205//334 206//334 208//334 -f 207//335 208//335 210//335 -f 209//336 210//336 212//336 -f 211//337 212//337 214//337 -f 213//338 214//338 216//338 -f 215//339 216//339 218//339 -f 217//340 218//340 220//340 -f 219//341 220//341 222//341 -f 221//342 222//342 224//342 -f 223//343 224//343 226//343 -f 225//344 226//344 227//344 -f 227//345 228//345 229//345 -f 229//346 230//346 231//346 -f 231//347 232//347 233//347 -f 233//348 234//348 235//348 -f 235//349 236//349 237//349 -f 237//350 238//350 239//350 -f 239//351 240//351 241//351 -f 241//352 242//352 243//352 -f 243//353 244//353 245//353 -f 245//354 246//354 247//354 -f 247//355 248//355 249//355 -f 249//356 250//356 251//356 -f 251//357 252//357 253//357 -f 196//358 194//358 198//358 -f 255//359 256//359 193//359 -f 253//360 254//360 255//360 -f 193//361 195//361 255//361 -f 195//328 193//328 196//328 -f 197//362 195//362 198//362 -f 199//363 197//363 200//363 -f 201//364 199//364 202//364 -f 203//365 201//365 204//365 -f 205//366 203//366 206//366 -f 207//367 205//367 208//367 -f 209//368 207//368 210//368 -f 211//369 209//369 212//369 -f 213//370 211//370 214//370 -f 215//371 213//371 216//371 -f 217//372 215//372 218//372 -f 219//373 217//373 220//373 -f 221//374 219//374 222//374 -f 223//375 221//375 224//375 -f 225//343 223//343 226//343 -f 226//376 228//376 227//376 -f 228//377 230//377 229//377 -f 230//378 232//378 231//378 -f 232//379 234//379 233//379 -f 234//380 236//380 235//380 -f 236//381 238//381 237//381 -f 238//382 240//382 239//382 -f 240//383 242//383 241//383 -f 242//384 244//384 243//384 -f 244//385 246//385 245//385 -f 246//386 248//386 247//386 -f 248//387 250//387 249//387 -f 250//388 252//388 251//388 -f 252//389 254//389 253//389 -f 194//390 256//390 198//390 -f 256//391 254//391 198//391 -f 254//392 252//392 198//392 -f 252//393 250//393 198//393 -f 250//394 248//394 198//394 -f 248//395 246//395 198//395 -f 246//396 244//396 198//396 -f 244//397 242//397 198//397 -f 242//398 240//398 198//398 -f 240//399 238//399 198//399 -f 238//400 236//400 198//400 -f 236//401 234//401 198//401 -f 234//402 232//402 198//402 -f 232//403 230//403 198//403 -f 230//404 228//404 198//404 -f 228//405 226//405 198//405 -f 226//406 224//406 198//406 -f 224//407 222//407 198//407 -f 222//408 220//408 198//408 -f 220//409 218//409 198//409 -f 218//410 216//410 198//410 -f 216//411 214//411 198//411 -f 214//412 212//412 198//412 -f 212//413 210//413 198//413 -f 210//398 208//398 198//398 -f 208//414 206//414 198//414 -f 206//415 204//415 198//415 -f 204//416 202//416 200//416 -f 198//417 204//417 200//417 -f 256//418 194//418 193//418 -f 254//419 256//419 255//419 -f 195//420 197//420 255//420 -f 197//421 199//421 255//421 -f 199//422 201//422 255//422 -f 201//423 203//423 255//423 -f 203//424 205//424 255//424 -f 205//425 207//425 255//425 -f 207//426 209//426 255//426 -f 209//427 211//427 255//427 -f 211//428 213//428 255//428 -f 213//429 215//429 255//429 -f 215//430 217//430 255//430 -f 237//431 233//431 235//431 -f 247//432 243//432 245//432 -f 241//433 237//433 239//433 -f 241//434 233//434 237//434 -f 251//435 247//435 249//435 -f 251//436 243//436 247//436 -f 219//437 221//437 223//437 -f 219//438 223//438 225//438 -f 233//439 229//439 231//439 -f 241//440 229//440 233//440 -f 255//437 251//437 253//437 -f 255//441 217//441 251//441 -f 251//441 217//441 243//441 -f 219//442 225//442 227//442 -f 217//443 219//443 227//443 -f 243//420 217//420 227//420 -f 241//444 243//444 229//444 -f 243//445 227//445 229//445 -o Cube_Cube.001 +f 193/109/328 194/110/328 196/111/328 +f 195/109/329 196/110/329 198/111/329 +f 197/109/330 198/110/330 200/111/330 +f 199/109/331 200/110/331 202/111/331 +f 201/109/332 202/110/332 204/111/332 +f 203/109/333 204/110/333 206/111/333 +f 205/109/334 206/110/334 208/111/334 +f 207/109/335 208/110/335 210/111/335 +f 209/109/336 210/110/336 212/111/336 +f 211/109/337 212/110/337 214/111/337 +f 213/109/338 214/110/338 216/111/338 +f 215/109/339 216/110/339 218/111/339 +f 217/109/340 218/110/340 220/111/340 +f 219/109/341 220/110/341 222/111/341 +f 221/109/342 222/110/342 224/111/342 +f 223/109/343 224/110/343 226/111/343 +f 225/109/344 226/110/344 227/112/344 +f 227/109/345 228/110/345 229/112/345 +f 229/109/346 230/110/346 231/112/346 +f 231/109/347 232/110/347 233/112/347 +f 233/109/348 234/110/348 235/112/348 +f 235/109/349 236/110/349 237/112/349 +f 237/109/350 238/110/350 239/112/350 +f 239/109/351 240/110/351 241/112/351 +f 241/109/352 242/110/352 243/112/352 +f 243/109/353 244/110/353 245/112/353 +f 245/109/354 246/110/354 247/112/354 +f 247/109/355 248/110/355 249/112/355 +f 249/109/356 250/110/356 251/112/356 +f 251/109/357 252/110/357 253/112/357 +f 196/113/358 194/114/358 198/115/358 +f 255/109/359 256/110/359 193/112/359 +f 253/109/360 254/110/360 255/112/360 +f 193/113/361 195/114/361 255/115/361 +f 195/112/328 193/109/328 196/111/328 +f 197/112/362 195/109/362 198/111/362 +f 199/112/363 197/109/363 200/111/363 +f 201/112/364 199/109/364 202/111/364 +f 203/112/365 201/109/365 204/111/365 +f 205/112/366 203/109/366 206/111/366 +f 207/112/367 205/109/367 208/111/367 +f 209/112/368 207/109/368 210/111/368 +f 211/112/369 209/109/369 212/111/369 +f 213/112/370 211/109/370 214/111/370 +f 215/112/371 213/109/371 216/111/371 +f 217/112/372 215/109/372 218/111/372 +f 219/112/373 217/109/373 220/111/373 +f 221/112/374 219/109/374 222/111/374 +f 223/112/375 221/109/375 224/111/375 +f 225/112/343 223/109/343 226/111/343 +f 226/110/376 228/111/376 227/112/376 +f 228/110/377 230/111/377 229/112/377 +f 230/110/378 232/111/378 231/112/378 +f 232/110/379 234/111/379 233/112/379 +f 234/110/380 236/111/380 235/112/380 +f 236/110/381 238/111/381 237/112/381 +f 238/110/382 240/111/382 239/112/382 +f 240/110/383 242/111/383 241/112/383 +f 242/110/384 244/111/384 243/112/384 +f 244/110/385 246/111/385 245/112/385 +f 246/110/386 248/111/386 247/112/386 +f 248/110/387 250/111/387 249/112/387 +f 250/110/388 252/111/388 251/112/388 +f 252/110/389 254/111/389 253/112/389 +f 194/114/390 256/116/390 198/115/390 +f 256/116/391 254/117/391 198/115/391 +f 254/117/392 252/118/392 198/115/392 +f 252/118/393 250/119/393 198/115/393 +f 250/119/394 248/120/394 198/115/394 +f 248/120/395 246/121/395 198/115/395 +f 246/121/396 244/122/396 198/115/396 +f 244/122/397 242/123/397 198/115/397 +f 242/123/398 240/124/398 198/115/398 +f 240/124/399 238/125/399 198/115/399 +f 238/125/400 236/126/400 198/115/400 +f 236/126/401 234/127/401 198/115/401 +f 234/127/402 232/128/402 198/115/402 +f 232/128/403 230/129/403 198/115/403 +f 230/129/404 228/130/404 198/115/404 +f 228/130/405 226/131/405 198/115/405 +f 226/131/406 224/132/406 198/115/406 +f 224/132/407 222/133/407 198/115/407 +f 222/133/408 220/134/408 198/115/408 +f 220/134/409 218/135/409 198/115/409 +f 218/135/410 216/136/410 198/115/410 +f 216/136/411 214/137/411 198/115/411 +f 214/137/412 212/138/412 198/115/412 +f 212/138/413 210/139/413 198/115/413 +f 210/139/398 208/140/398 198/115/398 +f 208/140/414 206/141/414 198/115/414 +f 206/141/415 204/142/415 198/115/415 +f 204/142/416 202/143/416 200/144/416 +f 198/115/417 204/142/417 200/144/417 +f 256/110/418 194/111/418 193/112/418 +f 254/110/419 256/111/419 255/112/419 +f 195/114/420 197/116/420 255/115/420 +f 197/116/421 199/117/421 255/115/421 +f 199/117/422 201/118/422 255/115/422 +f 201/118/423 203/119/423 255/115/423 +f 203/119/424 205/120/424 255/115/424 +f 205/120/425 207/121/425 255/115/425 +f 207/121/426 209/122/426 255/115/426 +f 209/122/427 211/123/427 255/115/427 +f 211/123/428 213/124/428 255/115/428 +f 213/124/429 215/125/429 255/115/429 +f 215/125/430 217/126/430 255/115/430 +f 237/136/431 233/134/431 235/135/431 +f 247/141/432 243/139/432 245/140/432 +f 241/138/433 237/136/433 239/137/433 +f 241/138/434 233/134/434 237/136/434 +f 251/143/435 247/141/435 249/142/435 +f 251/143/436 243/139/436 247/141/436 +f 219/127/437 221/128/437 223/129/437 +f 219/127/438 223/129/438 225/130/438 +f 233/134/439 229/132/439 231/133/439 +f 241/138/440 229/132/440 233/134/440 +f 255/115/437 251/143/437 253/144/437 +f 255/115/441 217/126/441 251/143/441 +f 251/143/441 217/126/441 243/139/441 +f 219/127/442 225/130/442 227/131/442 +f 217/126/443 219/127/443 227/131/443 +f 243/139/420 217/126/420 227/131/420 +f 241/138/444 243/139/444 229/132/444 +f 243/139/445 227/131/445 229/132/445 v -3.858562 2.027707 3.871576 v -3.858562 2.027707 -3.907549 v 3.920563 2.027707 -3.907549 @@ -1214,6 +1353,10 @@ v -3.858562 2.306528 3.871576 v -3.858562 2.306528 -3.907549 v 3.920563 2.306528 -3.907549 v 3.920563 2.306528 3.871576 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 vn -1.000000 0.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 1.000000 -0.000000 0.000000 @@ -1221,19 +1364,18 @@ vn 0.000000 0.000000 1.000000 vn 0.000000 -1.000000 0.000000 vn 0.000000 1.000000 0.000000 s off -f 261//446 262//446 257//446 -f 262//447 263//447 258//447 -f 263//448 264//448 260//448 -f 264//449 261//449 257//449 -f 257//450 258//450 259//450 -f 264//451 263//451 262//451 -f 262//446 258//446 257//446 -f 263//447 259//447 258//447 -f 259//448 263//448 260//448 -f 260//449 264//449 257//449 -f 260//450 257//450 259//450 -f 261//451 264//451 262//451 -o Cylinder.003 +f 261/145/446 262/146/446 257/147/446 +f 262/145/447 263/146/447 258/147/447 +f 263/145/448 264/146/448 260/148/448 +f 264/145/449 261/146/449 257/148/449 +f 257/145/450 258/146/450 259/148/450 +f 264/145/451 263/146/451 262/148/451 +f 262/146/446 258/148/446 257/147/446 +f 263/146/447 259/148/447 258/147/447 +f 259/147/448 263/145/448 260/148/448 +f 260/147/449 264/145/449 257/148/449 +f 260/147/450 257/145/450 259/148/450 +f 261/147/451 264/145/451 262/148/451 v 2.043798 0.024218 -3.001008 v 2.043798 2.024218 -3.001008 v 2.238889 0.024218 -2.981793 @@ -1298,6 +1440,42 @@ v 1.661116 0.024218 -2.924888 v 1.661116 2.024218 -2.924888 v 1.848710 0.024218 -2.981794 v 1.848710 2.024218 -2.981794 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.098018 0.000000 -0.995185 vn 0.290285 0.000000 -0.956940 vn 0.471397 0.000000 -0.881921 @@ -1331,131 +1509,130 @@ vn -0.471396 -0.000000 -0.881922 vn -0.098016 -0.000000 -0.995185 vn -0.290283 -0.000000 -0.956941 s off -f 265//452 266//452 268//452 -f 267//453 268//453 270//453 -f 269//454 270//454 272//454 -f 271//455 272//455 274//455 -f 273//456 274//456 276//456 -f 275//457 276//457 278//457 -f 277//458 278//458 280//458 -f 279//459 280//459 282//459 -f 281//460 282//460 284//460 -f 283//461 284//461 286//461 -f 285//462 286//462 288//462 -f 287//463 288//463 290//463 -f 289//464 290//464 292//464 -f 291//465 292//465 294//465 -f 293//466 294//466 296//466 -f 295//467 296//467 298//467 -f 297//468 298//468 299//468 -f 299//469 300//469 301//469 -f 301//470 302//470 303//470 -f 303//471 304//471 305//471 -f 305//472 306//472 307//472 -f 307//473 308//473 309//473 -f 309//474 310//474 311//474 -f 311//475 312//475 313//475 -f 313//476 314//476 315//476 -f 315//477 316//477 317//477 -f 317//478 318//478 319//478 -f 319//479 320//479 321//479 -f 321//480 322//480 323//480 -f 323//481 324//481 325//481 -f 268//451 266//451 270//451 -f 327//482 328//482 265//482 -f 325//483 326//483 327//483 -f 265//450 267//450 327//450 -f 267//452 265//452 268//452 -f 269//453 267//453 270//453 -f 271//454 269//454 272//454 -f 273//455 271//455 274//455 -f 275//456 273//456 276//456 -f 277//457 275//457 278//457 -f 279//458 277//458 280//458 -f 281//459 279//459 282//459 -f 283//460 281//460 284//460 -f 285//461 283//461 286//461 -f 287//462 285//462 288//462 -f 289//463 287//463 290//463 -f 291//464 289//464 292//464 -f 293//465 291//465 294//465 -f 295//466 293//466 296//466 -f 297//467 295//467 298//467 -f 298//468 300//468 299//468 -f 300//469 302//469 301//469 -f 302//470 304//470 303//470 -f 304//471 306//471 305//471 -f 306//472 308//472 307//472 -f 308//473 310//473 309//473 -f 310//474 312//474 311//474 -f 312//475 314//475 313//475 -f 314//476 316//476 315//476 -f 316//477 318//477 317//477 -f 318//478 320//478 319//478 -f 320//479 322//479 321//479 -f 322//480 324//480 323//480 -f 324//481 326//481 325//481 -f 266//451 328//451 270//451 -f 328//451 326//451 270//451 -f 326//451 324//451 270//451 -f 324//451 322//451 270//451 -f 322//451 320//451 270//451 -f 320//451 318//451 270//451 -f 318//451 316//451 270//451 -f 316//451 314//451 270//451 -f 314//451 312//451 270//451 -f 312//451 310//451 270//451 -f 310//451 308//451 270//451 -f 308//451 306//451 270//451 -f 306//451 304//451 270//451 -f 304//451 302//451 270//451 -f 302//451 300//451 270//451 -f 300//451 298//451 270//451 -f 298//451 296//451 270//451 -f 296//451 294//451 270//451 -f 294//451 292//451 270//451 -f 292//451 290//451 270//451 -f 290//451 288//451 270//451 -f 288//451 286//451 270//451 -f 286//451 284//451 270//451 -f 284//451 282//451 270//451 -f 282//451 280//451 270//451 -f 280//451 278//451 270//451 -f 278//451 276//451 270//451 -f 276//451 274//451 270//451 -f 274//451 272//451 270//451 -f 328//482 266//482 265//482 -f 326//483 328//483 327//483 -f 267//450 269//450 327//450 -f 269//450 271//450 327//450 -f 271//450 273//450 327//450 -f 273//450 275//450 327//450 -f 275//450 277//450 327//450 -f 277//450 279//450 327//450 -f 279//450 281//450 327//450 -f 281//450 283//450 327//450 -f 283//450 285//450 327//450 -f 285//450 287//450 327//450 -f 287//450 289//450 327//450 -f 289//450 291//450 327//450 -f 291//450 293//450 327//450 -f 293//450 295//450 327//450 -f 295//450 297//450 327//450 -f 297//450 299//450 327//450 -f 299//450 301//450 327//450 -f 301//450 303//450 327//450 -f 303//450 305//450 327//450 -f 305//450 307//450 327//450 -f 307//450 309//450 327//450 -f 309//450 311//450 327//450 -f 311//450 313//450 327//450 -f 313//450 315//450 327//450 -f 315//450 317//450 327//450 -f 317//450 319//450 327//450 -f 319//450 321//450 327//450 -f 321//450 323//450 325//450 -f 327//450 321//450 325//450 -o Cylinder.002 +f 265/149/452 266/150/452 268/151/452 +f 267/149/453 268/150/453 270/151/453 +f 269/149/454 270/150/454 272/151/454 +f 271/149/455 272/150/455 274/151/455 +f 273/149/456 274/150/456 276/151/456 +f 275/149/457 276/150/457 278/151/457 +f 277/149/458 278/150/458 280/151/458 +f 279/149/459 280/150/459 282/151/459 +f 281/149/460 282/150/460 284/151/460 +f 283/149/461 284/150/461 286/151/461 +f 285/149/462 286/150/462 288/151/462 +f 287/149/463 288/150/463 290/151/463 +f 289/149/464 290/150/464 292/151/464 +f 291/149/465 292/150/465 294/151/465 +f 293/149/466 294/150/466 296/151/466 +f 295/149/467 296/150/467 298/151/467 +f 297/149/468 298/150/468 299/152/468 +f 299/149/469 300/150/469 301/152/469 +f 301/149/470 302/150/470 303/152/470 +f 303/149/471 304/150/471 305/152/471 +f 305/149/472 306/150/472 307/152/472 +f 307/149/473 308/150/473 309/152/473 +f 309/149/474 310/150/474 311/152/474 +f 311/149/475 312/150/475 313/152/475 +f 313/149/476 314/150/476 315/152/476 +f 315/149/477 316/150/477 317/152/477 +f 317/149/478 318/150/478 319/152/478 +f 319/149/479 320/150/479 321/152/479 +f 321/149/480 322/150/480 323/152/480 +f 323/149/481 324/150/481 325/152/481 +f 268/153/451 266/154/451 270/155/451 +f 327/149/482 328/150/482 265/152/482 +f 325/149/483 326/150/483 327/152/483 +f 265/153/450 267/154/450 327/155/450 +f 267/152/452 265/149/452 268/151/452 +f 269/152/453 267/149/453 270/151/453 +f 271/152/454 269/149/454 272/151/454 +f 273/152/455 271/149/455 274/151/455 +f 275/152/456 273/149/456 276/151/456 +f 277/152/457 275/149/457 278/151/457 +f 279/152/458 277/149/458 280/151/458 +f 281/152/459 279/149/459 282/151/459 +f 283/152/460 281/149/460 284/151/460 +f 285/152/461 283/149/461 286/151/461 +f 287/152/462 285/149/462 288/151/462 +f 289/152/463 287/149/463 290/151/463 +f 291/152/464 289/149/464 292/151/464 +f 293/152/465 291/149/465 294/151/465 +f 295/152/466 293/149/466 296/151/466 +f 297/152/467 295/149/467 298/151/467 +f 298/150/468 300/151/468 299/152/468 +f 300/150/469 302/151/469 301/152/469 +f 302/150/470 304/151/470 303/152/470 +f 304/150/471 306/151/471 305/152/471 +f 306/150/472 308/151/472 307/152/472 +f 308/150/473 310/151/473 309/152/473 +f 310/150/474 312/151/474 311/152/474 +f 312/150/475 314/151/475 313/152/475 +f 314/150/476 316/151/476 315/152/476 +f 316/150/477 318/151/477 317/152/477 +f 318/150/478 320/151/478 319/152/478 +f 320/150/479 322/151/479 321/152/479 +f 322/150/480 324/151/480 323/152/480 +f 324/150/481 326/151/481 325/152/481 +f 266/154/451 328/156/451 270/155/451 +f 328/156/451 326/157/451 270/155/451 +f 326/157/451 324/158/451 270/155/451 +f 324/158/451 322/159/451 270/155/451 +f 322/159/451 320/160/451 270/155/451 +f 320/160/451 318/161/451 270/155/451 +f 318/161/451 316/162/451 270/155/451 +f 316/162/451 314/163/451 270/155/451 +f 314/163/451 312/164/451 270/155/451 +f 312/164/451 310/165/451 270/155/451 +f 310/165/451 308/166/451 270/155/451 +f 308/166/451 306/167/451 270/155/451 +f 306/167/451 304/168/451 270/155/451 +f 304/168/451 302/169/451 270/155/451 +f 302/169/451 300/170/451 270/155/451 +f 300/170/451 298/171/451 270/155/451 +f 298/171/451 296/172/451 270/155/451 +f 296/172/451 294/173/451 270/155/451 +f 294/173/451 292/174/451 270/155/451 +f 292/174/451 290/175/451 270/155/451 +f 290/175/451 288/176/451 270/155/451 +f 288/176/451 286/177/451 270/155/451 +f 286/177/451 284/178/451 270/155/451 +f 284/178/451 282/179/451 270/155/451 +f 282/179/451 280/180/451 270/155/451 +f 280/180/451 278/181/451 270/155/451 +f 278/181/451 276/182/451 270/155/451 +f 276/182/451 274/183/451 270/155/451 +f 274/183/451 272/184/451 270/155/451 +f 328/150/482 266/151/482 265/152/482 +f 326/150/483 328/151/483 327/152/483 +f 267/154/450 269/156/450 327/155/450 +f 269/156/450 271/157/450 327/155/450 +f 271/157/450 273/158/450 327/155/450 +f 273/158/450 275/159/450 327/155/450 +f 275/159/450 277/160/450 327/155/450 +f 277/160/450 279/161/450 327/155/450 +f 279/161/450 281/162/450 327/155/450 +f 281/162/450 283/163/450 327/155/450 +f 283/163/450 285/164/450 327/155/450 +f 285/164/450 287/165/450 327/155/450 +f 287/165/450 289/166/450 327/155/450 +f 289/166/450 291/167/450 327/155/450 +f 291/167/450 293/168/450 327/155/450 +f 293/168/450 295/169/450 327/155/450 +f 295/169/450 297/170/450 327/155/450 +f 297/170/450 299/171/450 327/155/450 +f 299/171/450 301/172/450 327/155/450 +f 301/172/450 303/173/450 327/155/450 +f 303/173/450 305/174/450 327/155/450 +f 305/174/450 307/175/450 327/155/450 +f 307/175/450 309/176/450 327/155/450 +f 309/176/450 311/177/450 327/155/450 +f 311/177/450 313/178/450 327/155/450 +f 313/178/450 315/179/450 327/155/450 +f 315/179/450 317/180/450 327/155/450 +f 317/180/450 319/181/450 327/155/450 +f 319/181/450 321/182/450 327/155/450 +f 321/182/450 323/183/450 325/184/450 +f 327/155/450 321/182/450 325/184/450 v -2.014818 0.007922 0.998641 v -2.014818 2.007922 0.998641 v -1.819728 0.007922 1.017856 @@ -1520,6 +1697,42 @@ v -2.397501 0.007922 1.074761 v -2.397501 2.007922 1.074761 v -2.209907 0.007922 1.017856 v -2.209907 2.007922 1.017856 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.098017 0.000000 -0.995185 vn 0.881921 0.000000 -0.471397 vn 0.634393 0.000000 0.773010 @@ -1528,131 +1741,130 @@ vn -0.881920 -0.000000 -0.471398 vn -0.634393 -0.000000 -0.773011 vn -0.471395 -0.000000 -0.881922 s off -f 329//484 330//484 332//484 -f 331//453 332//453 334//453 -f 333//454 334//454 336//454 -f 335//455 336//455 338//455 -f 337//456 338//456 340//456 -f 339//485 340//485 342//485 -f 341//458 342//458 344//458 -f 343//459 344//459 346//459 -f 345//460 346//460 348//460 -f 347//461 348//461 350//461 -f 349//462 350//462 352//462 -f 351//463 352//463 354//463 -f 353//486 354//486 356//486 -f 355//487 356//487 358//487 -f 357//466 358//466 360//466 -f 359//467 360//467 362//467 -f 361//468 362//468 363//468 -f 363//469 364//469 365//469 -f 365//470 366//470 367//470 -f 367//471 368//471 369//471 -f 369//472 370//472 371//472 -f 371//473 372//473 373//473 -f 373//474 374//474 375//474 -f 375//475 376//475 377//475 -f 377//476 378//476 379//476 -f 379//477 380//477 381//477 -f 381//488 382//488 383//488 -f 383//479 384//479 385//479 -f 385//489 386//489 387//489 -f 387//490 388//490 389//490 -f 332//451 330//451 334//451 -f 391//482 392//482 329//482 -f 389//483 390//483 391//483 -f 329//450 331//450 391//450 -f 331//484 329//484 332//484 -f 333//453 331//453 334//453 -f 335//454 333//454 336//454 -f 337//455 335//455 338//455 -f 339//456 337//456 340//456 -f 341//485 339//485 342//485 -f 343//458 341//458 344//458 -f 345//459 343//459 346//459 -f 347//460 345//460 348//460 -f 349//461 347//461 350//461 -f 351//462 349//462 352//462 -f 353//463 351//463 354//463 -f 355//486 353//486 356//486 -f 357//487 355//487 358//487 -f 359//466 357//466 360//466 -f 361//467 359//467 362//467 -f 362//468 364//468 363//468 -f 364//469 366//469 365//469 -f 366//470 368//470 367//470 -f 368//471 370//471 369//471 -f 370//472 372//472 371//472 -f 372//473 374//473 373//473 -f 374//474 376//474 375//474 -f 376//475 378//475 377//475 -f 378//476 380//476 379//476 -f 380//477 382//477 381//477 -f 382//488 384//488 383//488 -f 384//479 386//479 385//479 -f 386//489 388//489 387//489 -f 388//490 390//490 389//490 -f 330//451 392//451 334//451 -f 392//451 390//451 334//451 -f 390//451 388//451 334//451 -f 388//451 386//451 334//451 -f 386//451 384//451 334//451 -f 384//451 382//451 334//451 -f 382//451 380//451 334//451 -f 380//451 378//451 334//451 -f 378//451 376//451 334//451 -f 376//451 374//451 334//451 -f 374//451 372//451 334//451 -f 372//451 370//451 334//451 -f 370//451 368//451 334//451 -f 368//451 366//451 334//451 -f 366//451 364//451 334//451 -f 364//451 362//451 334//451 -f 362//451 360//451 334//451 -f 360//451 358//451 334//451 -f 358//451 356//451 334//451 -f 356//451 354//451 334//451 -f 354//451 352//451 334//451 -f 352//451 350//451 334//451 -f 350//451 348//451 334//451 -f 348//451 346//451 334//451 -f 346//451 344//451 334//451 -f 344//451 342//451 334//451 -f 342//451 340//451 334//451 -f 340//451 338//451 334//451 -f 338//451 336//451 334//451 -f 392//482 330//482 329//482 -f 390//483 392//483 391//483 -f 331//450 333//450 391//450 -f 333//450 335//450 391//450 -f 335//450 337//450 391//450 -f 337//450 339//450 391//450 -f 339//450 341//450 391//450 -f 341//450 343//450 391//450 -f 343//450 345//450 391//450 -f 345//450 347//450 391//450 -f 347//450 349//450 391//450 -f 349//450 351//450 391//450 -f 351//450 353//450 391//450 -f 353//450 355//450 391//450 -f 355//450 357//450 391//450 -f 357//450 359//450 391//450 -f 359//450 361//450 391//450 -f 361//450 363//450 391//450 -f 363//450 365//450 391//450 -f 365//450 367//450 391//450 -f 367//450 369//450 391//450 -f 369//450 371//450 391//450 -f 371//450 373//450 391//450 -f 373//450 375//450 391//450 -f 375//450 377//450 391//450 -f 377//450 379//450 391//450 -f 379//450 381//450 391//450 -f 381//450 383//450 391//450 -f 383//450 385//450 391//450 -f 385//450 387//450 391//450 -f 387//450 389//450 391//450 -o Cylinder.001 +f 329/185/484 330/186/484 332/187/484 +f 331/185/453 332/186/453 334/187/453 +f 333/185/454 334/186/454 336/187/454 +f 335/185/455 336/186/455 338/187/455 +f 337/185/456 338/186/456 340/187/456 +f 339/185/485 340/186/485 342/187/485 +f 341/185/458 342/186/458 344/187/458 +f 343/185/459 344/186/459 346/187/459 +f 345/185/460 346/186/460 348/187/460 +f 347/185/461 348/186/461 350/187/461 +f 349/185/462 350/186/462 352/187/462 +f 351/185/463 352/186/463 354/187/463 +f 353/185/486 354/186/486 356/187/486 +f 355/185/487 356/186/487 358/187/487 +f 357/185/466 358/186/466 360/187/466 +f 359/185/467 360/186/467 362/187/467 +f 361/185/468 362/186/468 363/188/468 +f 363/185/469 364/186/469 365/188/469 +f 365/185/470 366/186/470 367/188/470 +f 367/185/471 368/186/471 369/188/471 +f 369/185/472 370/186/472 371/188/472 +f 371/185/473 372/186/473 373/188/473 +f 373/185/474 374/186/474 375/188/474 +f 375/185/475 376/186/475 377/188/475 +f 377/185/476 378/186/476 379/188/476 +f 379/185/477 380/186/477 381/188/477 +f 381/185/488 382/186/488 383/188/488 +f 383/185/479 384/186/479 385/188/479 +f 385/185/489 386/186/489 387/188/489 +f 387/185/490 388/186/490 389/188/490 +f 332/189/451 330/190/451 334/191/451 +f 391/185/482 392/186/482 329/188/482 +f 389/185/483 390/186/483 391/188/483 +f 329/189/450 331/190/450 391/191/450 +f 331/188/484 329/185/484 332/187/484 +f 333/188/453 331/185/453 334/187/453 +f 335/188/454 333/185/454 336/187/454 +f 337/188/455 335/185/455 338/187/455 +f 339/188/456 337/185/456 340/187/456 +f 341/188/485 339/185/485 342/187/485 +f 343/188/458 341/185/458 344/187/458 +f 345/188/459 343/185/459 346/187/459 +f 347/188/460 345/185/460 348/187/460 +f 349/188/461 347/185/461 350/187/461 +f 351/188/462 349/185/462 352/187/462 +f 353/188/463 351/185/463 354/187/463 +f 355/188/486 353/185/486 356/187/486 +f 357/188/487 355/185/487 358/187/487 +f 359/188/466 357/185/466 360/187/466 +f 361/188/467 359/185/467 362/187/467 +f 362/186/468 364/187/468 363/188/468 +f 364/186/469 366/187/469 365/188/469 +f 366/186/470 368/187/470 367/188/470 +f 368/186/471 370/187/471 369/188/471 +f 370/186/472 372/187/472 371/188/472 +f 372/186/473 374/187/473 373/188/473 +f 374/186/474 376/187/474 375/188/474 +f 376/186/475 378/187/475 377/188/475 +f 378/186/476 380/187/476 379/188/476 +f 380/186/477 382/187/477 381/188/477 +f 382/186/488 384/187/488 383/188/488 +f 384/186/479 386/187/479 385/188/479 +f 386/186/489 388/187/489 387/188/489 +f 388/186/490 390/187/490 389/188/490 +f 330/190/451 392/192/451 334/191/451 +f 392/192/451 390/193/451 334/191/451 +f 390/193/451 388/194/451 334/191/451 +f 388/194/451 386/195/451 334/191/451 +f 386/195/451 384/196/451 334/191/451 +f 384/196/451 382/197/451 334/191/451 +f 382/197/451 380/198/451 334/191/451 +f 380/198/451 378/199/451 334/191/451 +f 378/199/451 376/200/451 334/191/451 +f 376/200/451 374/201/451 334/191/451 +f 374/201/451 372/202/451 334/191/451 +f 372/202/451 370/203/451 334/191/451 +f 370/203/451 368/204/451 334/191/451 +f 368/204/451 366/205/451 334/191/451 +f 366/205/451 364/206/451 334/191/451 +f 364/206/451 362/207/451 334/191/451 +f 362/207/451 360/208/451 334/191/451 +f 360/208/451 358/209/451 334/191/451 +f 358/209/451 356/210/451 334/191/451 +f 356/210/451 354/211/451 334/191/451 +f 354/211/451 352/212/451 334/191/451 +f 352/212/451 350/213/451 334/191/451 +f 350/213/451 348/214/451 334/191/451 +f 348/214/451 346/215/451 334/191/451 +f 346/215/451 344/216/451 334/191/451 +f 344/216/451 342/217/451 334/191/451 +f 342/217/451 340/218/451 334/191/451 +f 340/218/451 338/219/451 334/191/451 +f 338/219/451 336/220/451 334/191/451 +f 392/186/482 330/187/482 329/188/482 +f 390/186/483 392/187/483 391/188/483 +f 331/190/450 333/192/450 391/191/450 +f 333/192/450 335/193/450 391/191/450 +f 335/193/450 337/194/450 391/191/450 +f 337/194/450 339/195/450 391/191/450 +f 339/195/450 341/196/450 391/191/450 +f 341/196/450 343/197/450 391/191/450 +f 343/197/450 345/198/450 391/191/450 +f 345/198/450 347/199/450 391/191/450 +f 347/199/450 349/200/450 391/191/450 +f 349/200/450 351/201/450 391/191/450 +f 351/201/450 353/202/450 391/191/450 +f 353/202/450 355/203/450 391/191/450 +f 355/203/450 357/204/450 391/191/450 +f 357/204/450 359/205/450 391/191/450 +f 359/205/450 361/206/450 391/191/450 +f 361/206/450 363/207/450 391/191/450 +f 363/207/450 365/208/450 391/191/450 +f 365/208/450 367/209/450 391/191/450 +f 367/209/450 369/210/450 391/191/450 +f 369/210/450 371/211/450 391/191/450 +f 371/211/450 373/212/450 391/191/450 +f 373/212/450 375/213/450 391/191/450 +f 375/213/450 377/214/450 391/191/450 +f 377/214/450 379/215/450 391/191/450 +f 379/215/450 381/216/450 391/191/450 +f 381/216/450 383/217/450 391/191/450 +f 383/217/450 385/218/450 391/191/450 +f 385/218/450 387/219/450 391/191/450 +f 387/219/450 389/220/450 391/191/450 v -2.001621 -0.021814 -3.021079 v -2.001621 1.978186 -3.021079 v -1.806530 -0.021814 -3.001864 @@ -1717,137 +1929,172 @@ v -2.384303 -0.021814 -2.944959 v -2.384303 1.978186 -2.944959 v -2.196710 -0.021814 -3.001864 v -2.196710 1.978186 -3.001864 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.471398 0.000000 -0.881921 vn -0.634393 0.000000 0.773010 vn -0.881921 -0.000000 -0.471397 vn -0.773009 -0.000000 -0.634395 vn -0.634393 -0.000000 -0.773010 s off -f 393//484 394//484 396//484 -f 395//453 396//453 398//453 -f 397//491 398//491 400//491 -f 399//455 400//455 402//455 -f 401//456 402//456 404//456 -f 403//485 404//485 406//485 -f 405//458 406//458 408//458 -f 407//459 408//459 410//459 -f 409//460 410//460 412//460 -f 411//461 412//461 414//461 -f 413//462 414//462 416//462 -f 415//463 416//463 418//463 -f 417//464 418//464 420//464 -f 419//465 420//465 422//465 -f 421//466 422//466 424//466 -f 423//467 424//467 426//467 -f 425//468 426//468 427//468 -f 427//469 428//469 429//469 -f 429//470 430//470 431//470 -f 431//492 432//492 433//492 -f 433//472 434//472 435//472 -f 435//473 436//473 437//473 -f 437//474 438//474 439//474 -f 439//475 440//475 441//475 -f 441//476 442//476 443//476 -f 443//477 444//477 445//477 -f 445//493 446//493 447//493 -f 447//494 448//494 449//494 -f 449//495 450//495 451//495 -f 451//490 452//490 453//490 -f 396//451 394//451 398//451 -f 455//482 456//482 393//482 -f 453//483 454//483 455//483 -f 393//450 395//450 455//450 -f 395//484 393//484 396//484 -f 397//453 395//453 398//453 -f 399//491 397//491 400//491 -f 401//455 399//455 402//455 -f 403//456 401//456 404//456 -f 405//485 403//485 406//485 -f 407//458 405//458 408//458 -f 409//459 407//459 410//459 -f 411//460 409//460 412//460 -f 413//461 411//461 414//461 -f 415//462 413//462 416//462 -f 417//463 415//463 418//463 -f 419//464 417//464 420//464 -f 421//465 419//465 422//465 -f 423//466 421//466 424//466 -f 425//467 423//467 426//467 -f 426//468 428//468 427//468 -f 428//469 430//469 429//469 -f 430//470 432//470 431//470 -f 432//492 434//492 433//492 -f 434//472 436//472 435//472 -f 436//473 438//473 437//473 -f 438//474 440//474 439//474 -f 440//475 442//475 441//475 -f 442//476 444//476 443//476 -f 444//477 446//477 445//477 -f 446//493 448//493 447//493 -f 448//494 450//494 449//494 -f 450//495 452//495 451//495 -f 452//490 454//490 453//490 -f 394//451 456//451 398//451 -f 456//451 454//451 398//451 -f 454//451 452//451 398//451 -f 452//451 450//451 398//451 -f 450//451 448//451 398//451 -f 448//451 446//451 398//451 -f 446//451 444//451 398//451 -f 444//451 442//451 398//451 -f 442//451 440//451 398//451 -f 440//451 438//451 398//451 -f 438//451 436//451 398//451 -f 436//451 434//451 398//451 -f 434//451 432//451 398//451 -f 432//451 430//451 398//451 -f 430//451 428//451 398//451 -f 428//451 426//451 398//451 -f 426//451 424//451 398//451 -f 424//451 422//451 398//451 -f 422//451 420//451 398//451 -f 420//451 418//451 398//451 -f 418//451 416//451 398//451 -f 416//451 414//451 398//451 -f 414//451 412//451 398//451 -f 412//451 410//451 398//451 -f 410//451 408//451 398//451 -f 408//451 406//451 398//451 -f 406//451 404//451 398//451 -f 404//451 402//451 398//451 -f 402//451 400//451 398//451 -f 456//482 394//482 393//482 -f 454//483 456//483 455//483 -f 395//450 397//450 455//450 -f 397//450 399//450 455//450 -f 399//450 401//450 455//450 -f 401//450 403//450 455//450 -f 403//450 405//450 455//450 -f 405//450 407//450 455//450 -f 407//450 409//450 455//450 -f 409//450 411//450 455//450 -f 411//450 413//450 455//450 -f 413//450 415//450 455//450 -f 415//450 417//450 455//450 -f 417//450 419//450 455//450 -f 419//450 421//450 455//450 -f 421//450 423//450 455//450 -f 423//450 425//450 455//450 -f 425//450 427//450 455//450 -f 427//450 429//450 455//450 -f 429//450 431//450 455//450 -f 431//450 433//450 455//450 -f 433//450 435//450 455//450 -f 435//450 437//450 455//450 -f 437//450 439//450 455//450 -f 439//450 441//450 455//450 -f 441//450 443//450 455//450 -f 443//450 445//450 455//450 -f 445//450 447//450 455//450 -f 447//450 449//450 455//450 -f 449//450 451//450 455//450 -f 451//450 453//450 455//450 -o Cylinder +f 393/221/484 394/222/484 396/223/484 +f 395/221/453 396/222/453 398/223/453 +f 397/221/491 398/222/491 400/223/491 +f 399/221/455 400/222/455 402/223/455 +f 401/221/456 402/222/456 404/223/456 +f 403/221/485 404/222/485 406/223/485 +f 405/221/458 406/222/458 408/223/458 +f 407/221/459 408/222/459 410/223/459 +f 409/221/460 410/222/460 412/223/460 +f 411/221/461 412/222/461 414/223/461 +f 413/221/462 414/222/462 416/223/462 +f 415/221/463 416/222/463 418/223/463 +f 417/221/464 418/222/464 420/223/464 +f 419/221/465 420/222/465 422/223/465 +f 421/221/466 422/222/466 424/223/466 +f 423/221/467 424/222/467 426/223/467 +f 425/221/468 426/222/468 427/224/468 +f 427/221/469 428/222/469 429/224/469 +f 429/221/470 430/222/470 431/224/470 +f 431/221/492 432/222/492 433/224/492 +f 433/221/472 434/222/472 435/224/472 +f 435/221/473 436/222/473 437/224/473 +f 437/221/474 438/222/474 439/224/474 +f 439/221/475 440/222/475 441/224/475 +f 441/221/476 442/222/476 443/224/476 +f 443/221/477 444/222/477 445/224/477 +f 445/221/493 446/222/493 447/224/493 +f 447/221/494 448/222/494 449/224/494 +f 449/221/495 450/222/495 451/224/495 +f 451/221/490 452/222/490 453/224/490 +f 396/225/451 394/226/451 398/227/451 +f 455/221/482 456/222/482 393/224/482 +f 453/221/483 454/222/483 455/224/483 +f 393/225/450 395/226/450 455/227/450 +f 395/224/484 393/221/484 396/223/484 +f 397/224/453 395/221/453 398/223/453 +f 399/224/491 397/221/491 400/223/491 +f 401/224/455 399/221/455 402/223/455 +f 403/224/456 401/221/456 404/223/456 +f 405/224/485 403/221/485 406/223/485 +f 407/224/458 405/221/458 408/223/458 +f 409/224/459 407/221/459 410/223/459 +f 411/224/460 409/221/460 412/223/460 +f 413/224/461 411/221/461 414/223/461 +f 415/224/462 413/221/462 416/223/462 +f 417/224/463 415/221/463 418/223/463 +f 419/224/464 417/221/464 420/223/464 +f 421/224/465 419/221/465 422/223/465 +f 423/224/466 421/221/466 424/223/466 +f 425/224/467 423/221/467 426/223/467 +f 426/222/468 428/223/468 427/224/468 +f 428/222/469 430/223/469 429/224/469 +f 430/222/470 432/223/470 431/224/470 +f 432/222/492 434/223/492 433/224/492 +f 434/222/472 436/223/472 435/224/472 +f 436/222/473 438/223/473 437/224/473 +f 438/222/474 440/223/474 439/224/474 +f 440/222/475 442/223/475 441/224/475 +f 442/222/476 444/223/476 443/224/476 +f 444/222/477 446/223/477 445/224/477 +f 446/222/493 448/223/493 447/224/493 +f 448/222/494 450/223/494 449/224/494 +f 450/222/495 452/223/495 451/224/495 +f 452/222/490 454/223/490 453/224/490 +f 394/226/451 456/228/451 398/227/451 +f 456/228/451 454/229/451 398/227/451 +f 454/229/451 452/230/451 398/227/451 +f 452/230/451 450/231/451 398/227/451 +f 450/231/451 448/232/451 398/227/451 +f 448/232/451 446/233/451 398/227/451 +f 446/233/451 444/234/451 398/227/451 +f 444/234/451 442/235/451 398/227/451 +f 442/235/451 440/236/451 398/227/451 +f 440/236/451 438/237/451 398/227/451 +f 438/237/451 436/238/451 398/227/451 +f 436/238/451 434/239/451 398/227/451 +f 434/239/451 432/240/451 398/227/451 +f 432/240/451 430/241/451 398/227/451 +f 430/241/451 428/242/451 398/227/451 +f 428/242/451 426/243/451 398/227/451 +f 426/243/451 424/244/451 398/227/451 +f 424/244/451 422/245/451 398/227/451 +f 422/245/451 420/246/451 398/227/451 +f 420/246/451 418/247/451 398/227/451 +f 418/247/451 416/248/451 398/227/451 +f 416/248/451 414/249/451 398/227/451 +f 414/249/451 412/250/451 398/227/451 +f 412/250/451 410/251/451 398/227/451 +f 410/251/451 408/252/451 398/227/451 +f 408/252/451 406/253/451 398/227/451 +f 406/253/451 404/254/451 398/227/451 +f 404/254/451 402/255/451 398/227/451 +f 402/255/451 400/256/451 398/227/451 +f 456/222/482 394/223/482 393/224/482 +f 454/222/483 456/223/483 455/224/483 +f 395/226/450 397/228/450 455/227/450 +f 397/228/450 399/229/450 455/227/450 +f 399/229/450 401/230/450 455/227/450 +f 401/230/450 403/231/450 455/227/450 +f 403/231/450 405/232/450 455/227/450 +f 405/232/450 407/233/450 455/227/450 +f 407/233/450 409/234/450 455/227/450 +f 409/234/450 411/235/450 455/227/450 +f 411/235/450 413/236/450 455/227/450 +f 413/236/450 415/237/450 455/227/450 +f 415/237/450 417/238/450 455/227/450 +f 417/238/450 419/239/450 455/227/450 +f 419/239/450 421/240/450 455/227/450 +f 421/240/450 423/241/450 455/227/450 +f 423/241/450 425/242/450 455/227/450 +f 425/242/450 427/243/450 455/227/450 +f 427/243/450 429/244/450 455/227/450 +f 429/244/450 431/245/450 455/227/450 +f 431/245/450 433/246/450 455/227/450 +f 433/246/450 435/247/450 455/227/450 +f 435/247/450 437/248/450 455/227/450 +f 437/248/450 439/249/450 455/227/450 +f 439/249/450 441/250/450 455/227/450 +f 441/250/450 443/251/450 455/227/450 +f 443/251/450 445/252/450 455/227/450 +f 445/252/450 447/253/450 455/227/450 +f 447/253/450 449/254/450 455/227/450 +f 449/254/450 451/255/450 455/227/450 +f 451/255/450 453/256/450 455/227/450 v 2.021592 0.003623 1.016610 v 2.021592 2.003623 1.016610 v 2.216682 0.003623 1.035825 @@ -1912,128 +2159,164 @@ v 1.638910 0.003623 1.092730 v 1.638910 2.003623 1.092730 v 1.826503 0.003623 1.035825 v 1.826503 2.003623 1.035825 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 s off -f 457//484 458//484 460//484 -f 459//453 460//453 462//453 -f 461//454 462//454 464//454 -f 463//455 464//455 466//455 -f 465//456 466//456 468//456 -f 467//457 468//457 470//457 -f 469//458 470//458 472//458 -f 471//459 472//459 474//459 -f 473//460 474//460 476//460 -f 475//461 476//461 478//461 -f 477//462 478//462 480//462 -f 479//463 480//463 482//463 -f 481//464 482//464 484//464 -f 483//465 484//465 486//465 -f 485//466 486//466 488//466 -f 487//467 488//467 490//467 -f 489//468 490//468 491//468 -f 491//469 492//469 493//469 -f 493//470 494//470 495//470 -f 495//471 496//471 497//471 -f 497//472 498//472 499//472 -f 499//473 500//473 501//473 -f 501//474 502//474 503//474 -f 503//475 504//475 505//475 -f 505//476 506//476 507//476 -f 507//477 508//477 509//477 -f 509//478 510//478 511//478 -f 511//494 512//494 513//494 -f 513//489 514//489 515//489 -f 515//490 516//490 517//490 -f 460//451 458//451 462//451 -f 519//482 520//482 457//482 -f 517//483 518//483 519//483 -f 457//450 459//450 519//450 -f 459//484 457//484 460//484 -f 461//453 459//453 462//453 -f 463//454 461//454 464//454 -f 465//455 463//455 466//455 -f 467//456 465//456 468//456 -f 469//457 467//457 470//457 -f 471//458 469//458 472//458 -f 473//459 471//459 474//459 -f 475//460 473//460 476//460 -f 477//461 475//461 478//461 -f 479//462 477//462 480//462 -f 481//463 479//463 482//463 -f 483//464 481//464 484//464 -f 485//465 483//465 486//465 -f 487//466 485//466 488//466 -f 489//467 487//467 490//467 -f 490//468 492//468 491//468 -f 492//469 494//469 493//469 -f 494//470 496//470 495//470 -f 496//471 498//471 497//471 -f 498//472 500//472 499//472 -f 500//473 502//473 501//473 -f 502//474 504//474 503//474 -f 504//475 506//475 505//475 -f 506//476 508//476 507//476 -f 508//477 510//477 509//477 -f 510//478 512//478 511//478 -f 512//494 514//494 513//494 -f 514//489 516//489 515//489 -f 516//490 518//490 517//490 -f 458//451 520//451 462//451 -f 520//451 518//451 462//451 -f 518//451 516//451 462//451 -f 516//451 514//451 462//451 -f 514//451 512//451 462//451 -f 512//451 510//451 462//451 -f 510//451 508//451 462//451 -f 508//451 506//451 462//451 -f 506//451 504//451 462//451 -f 504//451 502//451 462//451 -f 502//451 500//451 462//451 -f 500//451 498//451 462//451 -f 498//451 496//451 462//451 -f 496//451 494//451 462//451 -f 494//451 492//451 462//451 -f 492//451 490//451 462//451 -f 490//451 488//451 462//451 -f 488//451 486//451 462//451 -f 486//451 484//451 462//451 -f 484//451 482//451 462//451 -f 482//451 480//451 462//451 -f 480//451 478//451 462//451 -f 478//451 476//451 462//451 -f 476//451 474//451 462//451 -f 474//451 472//451 462//451 -f 472//451 470//451 462//451 -f 470//451 468//451 462//451 -f 468//451 466//451 462//451 -f 466//451 464//451 462//451 -f 520//482 458//482 457//482 -f 518//483 520//483 519//483 -f 459//450 461//450 519//450 -f 461//450 463//450 519//450 -f 463//450 465//450 519//450 -f 465//450 467//450 519//450 -f 467//450 469//450 519//450 -f 469//450 471//450 519//450 -f 471//450 473//450 519//450 -f 473//450 475//450 519//450 -f 475//450 477//450 519//450 -f 477//450 479//450 519//450 -f 479//450 481//450 519//450 -f 481//450 483//450 519//450 -f 483//450 485//450 519//450 -f 485//450 487//450 519//450 -f 487//450 489//450 519//450 -f 489//450 491//450 519//450 -f 491//450 493//450 519//450 -f 493//450 495//450 519//450 -f 495//450 497//450 519//450 -f 497//450 499//450 519//450 -f 499//450 501//450 519//450 -f 501//450 503//450 519//450 -f 503//450 505//450 519//450 -f 505//450 507//450 519//450 -f 507//450 509//450 519//450 -f 509//450 511//450 519//450 -f 511//450 513//450 519//450 -f 513//450 515//450 519//450 -f 515//450 517//450 519//450 +f 457/257/484 458/258/484 460/259/484 +f 459/257/453 460/258/453 462/259/453 +f 461/257/454 462/258/454 464/259/454 +f 463/257/455 464/258/455 466/259/455 +f 465/257/456 466/258/456 468/259/456 +f 467/257/457 468/258/457 470/259/457 +f 469/257/458 470/258/458 472/259/458 +f 471/257/459 472/258/459 474/259/459 +f 473/257/460 474/258/460 476/259/460 +f 475/257/461 476/258/461 478/259/461 +f 477/257/462 478/258/462 480/259/462 +f 479/257/463 480/258/463 482/259/463 +f 481/257/464 482/258/464 484/259/464 +f 483/257/465 484/258/465 486/259/465 +f 485/257/466 486/258/466 488/259/466 +f 487/257/467 488/258/467 490/259/467 +f 489/257/468 490/258/468 491/260/468 +f 491/257/469 492/258/469 493/260/469 +f 493/257/470 494/258/470 495/260/470 +f 495/257/471 496/258/471 497/260/471 +f 497/257/472 498/258/472 499/260/472 +f 499/257/473 500/258/473 501/260/473 +f 501/257/474 502/258/474 503/260/474 +f 503/257/475 504/258/475 505/260/475 +f 505/257/476 506/258/476 507/260/476 +f 507/257/477 508/258/477 509/260/477 +f 509/257/478 510/258/478 511/260/478 +f 511/257/494 512/258/494 513/260/494 +f 513/257/489 514/258/489 515/260/489 +f 515/257/490 516/258/490 517/260/490 +f 460/261/451 458/262/451 462/263/451 +f 519/257/482 520/258/482 457/260/482 +f 517/257/483 518/258/483 519/260/483 +f 457/261/450 459/262/450 519/263/450 +f 459/260/484 457/257/484 460/259/484 +f 461/260/453 459/257/453 462/259/453 +f 463/260/454 461/257/454 464/259/454 +f 465/260/455 463/257/455 466/259/455 +f 467/260/456 465/257/456 468/259/456 +f 469/260/457 467/257/457 470/259/457 +f 471/260/458 469/257/458 472/259/458 +f 473/260/459 471/257/459 474/259/459 +f 475/260/460 473/257/460 476/259/460 +f 477/260/461 475/257/461 478/259/461 +f 479/260/462 477/257/462 480/259/462 +f 481/260/463 479/257/463 482/259/463 +f 483/260/464 481/257/464 484/259/464 +f 485/260/465 483/257/465 486/259/465 +f 487/260/466 485/257/466 488/259/466 +f 489/260/467 487/257/467 490/259/467 +f 490/258/468 492/259/468 491/260/468 +f 492/258/469 494/259/469 493/260/469 +f 494/258/470 496/259/470 495/260/470 +f 496/258/471 498/259/471 497/260/471 +f 498/258/472 500/259/472 499/260/472 +f 500/258/473 502/259/473 501/260/473 +f 502/258/474 504/259/474 503/260/474 +f 504/258/475 506/259/475 505/260/475 +f 506/258/476 508/259/476 507/260/476 +f 508/258/477 510/259/477 509/260/477 +f 510/258/478 512/259/478 511/260/478 +f 512/258/494 514/259/494 513/260/494 +f 514/258/489 516/259/489 515/260/489 +f 516/258/490 518/259/490 517/260/490 +f 458/262/451 520/264/451 462/263/451 +f 520/264/451 518/265/451 462/263/451 +f 518/265/451 516/266/451 462/263/451 +f 516/266/451 514/267/451 462/263/451 +f 514/267/451 512/268/451 462/263/451 +f 512/268/451 510/269/451 462/263/451 +f 510/269/451 508/270/451 462/263/451 +f 508/270/451 506/271/451 462/263/451 +f 506/271/451 504/272/451 462/263/451 +f 504/272/451 502/273/451 462/263/451 +f 502/273/451 500/274/451 462/263/451 +f 500/274/451 498/275/451 462/263/451 +f 498/275/451 496/276/451 462/263/451 +f 496/276/451 494/277/451 462/263/451 +f 494/277/451 492/278/451 462/263/451 +f 492/278/451 490/279/451 462/263/451 +f 490/279/451 488/280/451 462/263/451 +f 488/280/451 486/281/451 462/263/451 +f 486/281/451 484/282/451 462/263/451 +f 484/282/451 482/283/451 462/263/451 +f 482/283/451 480/284/451 462/263/451 +f 480/284/451 478/285/451 462/263/451 +f 478/285/451 476/286/451 462/263/451 +f 476/286/451 474/287/451 462/263/451 +f 474/287/451 472/288/451 462/263/451 +f 472/288/451 470/289/451 462/263/451 +f 470/289/451 468/290/451 462/263/451 +f 468/290/451 466/291/451 462/263/451 +f 466/291/451 464/292/451 462/263/451 +f 520/258/482 458/259/482 457/260/482 +f 518/258/483 520/259/483 519/260/483 +f 459/262/450 461/264/450 519/263/450 +f 461/264/450 463/265/450 519/263/450 +f 463/265/450 465/266/450 519/263/450 +f 465/266/450 467/267/450 519/263/450 +f 467/267/450 469/268/450 519/263/450 +f 469/268/450 471/269/450 519/263/450 +f 471/269/450 473/270/450 519/263/450 +f 473/270/450 475/271/450 519/263/450 +f 475/271/450 477/272/450 519/263/450 +f 477/272/450 479/273/450 519/263/450 +f 479/273/450 481/274/450 519/263/450 +f 481/274/450 483/275/450 519/263/450 +f 483/275/450 485/276/450 519/263/450 +f 485/276/450 487/277/450 519/263/450 +f 487/277/450 489/278/450 519/263/450 +f 489/278/450 491/279/450 519/263/450 +f 491/279/450 493/280/450 519/263/450 +f 493/280/450 495/281/450 519/263/450 +f 495/281/450 497/282/450 519/263/450 +f 497/282/450 499/283/450 519/263/450 +f 499/283/450 501/284/450 519/263/450 +f 501/284/450 503/285/450 519/263/450 +f 503/285/450 505/286/450 519/263/450 +f 505/286/450 507/287/450 519/263/450 +f 507/287/450 509/288/450 519/263/450 +f 509/288/450 511/289/450 519/263/450 +f 511/289/450 513/290/450 519/263/450 +f 513/290/450 515/291/450 519/263/450 +f 515/291/450 517/292/450 519/263/450 diff --git a/examples/datavisualization/customitems/refinery.obj b/examples/datavisualization/customitems/refinery.obj index 2f0de7f4..ed90c361 100644 --- a/examples/datavisualization/customitems/refinery.obj +++ b/examples/datavisualization/customitems/refinery.obj @@ -8,6 +8,10 @@ v -2.719012 0.012961 4.805554 v -2.719012 0.012961 -4.824533 v 2.730989 0.012961 -4.824533 v 2.730989 0.012961 4.805554 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 vn -0.577349 0.577349 0.577349 vn -0.577349 0.577349 -0.577349 vn -0.577349 -0.577349 0.577349 @@ -17,18 +21,18 @@ vn 0.577349 0.577349 0.577349 vn 0.577349 -0.577349 0.577349 vn -0.577349 -0.577349 -0.577349 s 1 -f 5//1 6//2 1//3 -f 6//2 7//4 3//5 -f 7//4 8//6 4//7 -f 8//6 5//1 1//3 -f 1//3 2//8 3//5 -f 8//6 7//4 6//2 -f 6//2 2//8 1//3 -f 2//8 6//2 3//5 -f 3//5 7//4 4//7 -f 4//7 8//6 1//3 -f 4//7 1//3 3//5 -f 5//1 8//6 6//2 +f 5/1/1 6/2/2 1/3/3 +f 6/1/2 7/2/4 3/4/5 +f 7/1/4 8/2/6 4/4/7 +f 8/1/6 5/2/1 1/4/3 +f 1/1/3 2/2/8 3/4/5 +f 8/1/6 7/2/4 6/4/2 +f 6/2/2 2/4/8 1/3/3 +f 2/3/8 6/1/2 3/4/5 +f 3/3/5 7/1/4 4/4/7 +f 4/3/7 8/1/6 1/4/3 +f 4/3/7 1/1/3 3/4/5 +f 5/3/1 8/1/6 6/4/2 v -1.384247 1.252743 0.422195 v -1.384247 2.069450 0.422195 v -1.303725 1.252743 0.430041 @@ -93,6 +97,42 @@ v -1.542196 1.252743 0.453279 v -1.542196 2.069450 0.453279 v -1.464768 1.252743 0.430041 v -1.464768 2.069450 0.430041 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.096985 0.000000 -0.995286 vn 0.287455 0.000000 -0.957794 vn 0.467486 0.000000 -0.884001 @@ -128,130 +168,130 @@ vn -0.096985 -0.000000 -0.995286 vn -0.287454 -0.000000 -0.957794 vn 0.000000 -1.000000 -0.000000 s off -f 9//9 10//9 12//9 -f 11//10 12//10 14//10 -f 13//11 14//11 16//11 -f 15//12 16//12 18//12 -f 17//13 18//13 20//13 -f 19//14 20//14 22//14 -f 21//15 22//15 24//15 -f 23//16 24//16 26//16 -f 25//17 26//17 28//17 -f 27//18 28//18 30//18 -f 29//19 30//19 32//19 -f 31//20 32//20 34//20 -f 33//21 34//21 36//21 -f 35//22 36//22 38//22 -f 37//23 38//23 40//23 -f 39//24 40//24 42//24 -f 41//25 42//25 43//25 -f 43//26 44//26 45//26 -f 45//27 46//27 47//27 -f 47//28 48//28 49//28 -f 49//29 50//29 51//29 -f 51//30 52//30 53//30 -f 53//31 54//31 55//31 -f 55//32 56//32 57//32 -f 57//33 58//33 59//33 -f 59//34 60//34 61//34 -f 61//35 62//35 63//35 -f 63//36 64//36 65//36 -f 65//37 66//37 67//37 -f 67//38 68//38 69//38 -f 12//39 10//39 14//39 -f 71//40 72//40 9//40 -f 69//41 70//41 71//41 -f 9//42 11//42 71//42 -f 11//9 9//9 12//9 -f 13//10 11//10 14//10 -f 15//11 13//11 16//11 -f 17//12 15//12 18//12 -f 19//13 17//13 20//13 -f 21//14 19//14 22//14 -f 23//15 21//15 24//15 -f 25//16 23//16 26//16 -f 27//17 25//17 28//17 -f 29//18 27//18 30//18 -f 31//19 29//19 32//19 -f 33//20 31//20 34//20 -f 35//21 33//21 36//21 -f 37//22 35//22 38//22 -f 39//23 37//23 40//23 -f 41//24 39//24 42//24 -f 42//25 44//25 43//25 -f 44//26 46//26 45//26 -f 46//27 48//27 47//27 -f 48//28 50//28 49//28 -f 50//29 52//29 51//29 -f 52//30 54//30 53//30 -f 54//31 56//31 55//31 -f 56//32 58//32 57//32 -f 58//33 60//33 59//33 -f 60//34 62//34 61//34 -f 62//35 64//35 63//35 -f 64//36 66//36 65//36 -f 66//37 68//37 67//37 -f 68//38 70//38 69//38 -f 10//39 72//39 14//39 -f 72//39 70//39 14//39 -f 70//39 68//39 14//39 -f 68//39 66//39 14//39 -f 66//39 64//39 14//39 -f 64//39 62//39 14//39 -f 62//39 60//39 14//39 -f 60//39 58//39 14//39 -f 58//39 56//39 14//39 -f 56//39 54//39 14//39 -f 54//39 52//39 14//39 -f 52//39 50//39 14//39 -f 50//39 48//39 14//39 -f 48//39 46//39 14//39 -f 46//39 44//39 14//39 -f 44//39 42//39 14//39 -f 42//39 40//39 14//39 -f 40//39 38//39 14//39 -f 38//39 36//39 14//39 -f 36//39 34//39 14//39 -f 34//39 32//39 14//39 -f 32//39 30//39 14//39 -f 30//39 28//39 14//39 -f 28//39 26//39 14//39 -f 26//39 24//39 14//39 -f 24//39 22//39 14//39 -f 22//39 20//39 14//39 -f 20//39 18//39 16//39 -f 14//39 20//39 16//39 -f 72//40 10//40 9//40 -f 70//41 72//41 71//41 -f 11//42 13//42 71//42 -f 13//42 15//42 71//42 -f 15//42 17//42 71//42 -f 17//42 19//42 71//42 -f 19//42 21//42 71//42 -f 21//42 23//42 71//42 -f 23//42 25//42 71//42 -f 25//42 27//42 71//42 -f 27//42 29//42 71//42 -f 29//42 31//42 71//42 -f 31//42 33//42 71//42 -f 33//42 35//42 71//42 -f 35//42 37//42 71//42 -f 37//42 39//42 71//42 -f 39//42 41//42 71//42 -f 41//42 43//42 71//42 -f 43//42 45//42 71//42 -f 45//42 47//42 71//42 -f 47//42 49//42 71//42 -f 49//42 51//42 71//42 -f 51//42 53//42 71//42 -f 53//42 55//42 71//42 -f 55//42 57//42 71//42 -f 57//42 59//42 71//42 -f 59//42 61//42 71//42 -f 61//42 63//42 71//42 -f 63//42 65//42 71//42 -f 65//42 67//42 71//42 -f 67//42 69//42 71//42 +f 9/5/9 10/6/9 12/7/9 +f 11/5/10 12/6/10 14/7/10 +f 13/5/11 14/6/11 16/7/11 +f 15/5/12 16/6/12 18/7/12 +f 17/5/13 18/6/13 20/7/13 +f 19/5/14 20/6/14 22/7/14 +f 21/5/15 22/6/15 24/7/15 +f 23/5/16 24/6/16 26/7/16 +f 25/5/17 26/6/17 28/7/17 +f 27/5/18 28/6/18 30/7/18 +f 29/5/19 30/6/19 32/7/19 +f 31/5/20 32/6/20 34/7/20 +f 33/5/21 34/6/21 36/7/21 +f 35/5/22 36/6/22 38/7/22 +f 37/5/23 38/6/23 40/7/23 +f 39/5/24 40/6/24 42/7/24 +f 41/5/25 42/6/25 43/8/25 +f 43/5/26 44/6/26 45/8/26 +f 45/5/27 46/6/27 47/8/27 +f 47/5/28 48/6/28 49/8/28 +f 49/5/29 50/6/29 51/8/29 +f 51/5/30 52/6/30 53/8/30 +f 53/5/31 54/6/31 55/8/31 +f 55/5/32 56/6/32 57/8/32 +f 57/5/33 58/6/33 59/8/33 +f 59/5/34 60/6/34 61/8/34 +f 61/5/35 62/6/35 63/8/35 +f 63/5/36 64/6/36 65/8/36 +f 65/5/37 66/6/37 67/8/37 +f 67/5/38 68/6/38 69/8/38 +f 12/9/39 10/10/39 14/11/39 +f 71/5/40 72/6/40 9/8/40 +f 69/5/41 70/6/41 71/8/41 +f 9/9/42 11/10/42 71/11/42 +f 11/8/9 9/5/9 12/7/9 +f 13/8/10 11/5/10 14/7/10 +f 15/8/11 13/5/11 16/7/11 +f 17/8/12 15/5/12 18/7/12 +f 19/8/13 17/5/13 20/7/13 +f 21/8/14 19/5/14 22/7/14 +f 23/8/15 21/5/15 24/7/15 +f 25/8/16 23/5/16 26/7/16 +f 27/8/17 25/5/17 28/7/17 +f 29/8/18 27/5/18 30/7/18 +f 31/8/19 29/5/19 32/7/19 +f 33/8/20 31/5/20 34/7/20 +f 35/8/21 33/5/21 36/7/21 +f 37/8/22 35/5/22 38/7/22 +f 39/8/23 37/5/23 40/7/23 +f 41/8/24 39/5/24 42/7/24 +f 42/6/25 44/7/25 43/8/25 +f 44/6/26 46/7/26 45/8/26 +f 46/6/27 48/7/27 47/8/27 +f 48/6/28 50/7/28 49/8/28 +f 50/6/29 52/7/29 51/8/29 +f 52/6/30 54/7/30 53/8/30 +f 54/6/31 56/7/31 55/8/31 +f 56/6/32 58/7/32 57/8/32 +f 58/6/33 60/7/33 59/8/33 +f 60/6/34 62/7/34 61/8/34 +f 62/6/35 64/7/35 63/8/35 +f 64/6/36 66/7/36 65/8/36 +f 66/6/37 68/7/37 67/8/37 +f 68/6/38 70/7/38 69/8/38 +f 10/10/39 72/12/39 14/11/39 +f 72/12/39 70/13/39 14/11/39 +f 70/13/39 68/14/39 14/11/39 +f 68/14/39 66/15/39 14/11/39 +f 66/15/39 64/16/39 14/11/39 +f 64/16/39 62/17/39 14/11/39 +f 62/17/39 60/18/39 14/11/39 +f 60/18/39 58/19/39 14/11/39 +f 58/19/39 56/20/39 14/11/39 +f 56/20/39 54/21/39 14/11/39 +f 54/21/39 52/22/39 14/11/39 +f 52/22/39 50/23/39 14/11/39 +f 50/23/39 48/24/39 14/11/39 +f 48/24/39 46/25/39 14/11/39 +f 46/25/39 44/26/39 14/11/39 +f 44/26/39 42/27/39 14/11/39 +f 42/27/39 40/28/39 14/11/39 +f 40/28/39 38/29/39 14/11/39 +f 38/29/39 36/30/39 14/11/39 +f 36/30/39 34/31/39 14/11/39 +f 34/31/39 32/32/39 14/11/39 +f 32/32/39 30/33/39 14/11/39 +f 30/33/39 28/34/39 14/11/39 +f 28/34/39 26/35/39 14/11/39 +f 26/35/39 24/36/39 14/11/39 +f 24/36/39 22/37/39 14/11/39 +f 22/37/39 20/38/39 14/11/39 +f 20/38/39 18/39/39 16/40/39 +f 14/11/39 20/38/39 16/40/39 +f 72/6/40 10/7/40 9/8/40 +f 70/6/41 72/7/41 71/8/41 +f 11/10/42 13/12/42 71/11/42 +f 13/12/42 15/13/42 71/11/42 +f 15/13/42 17/14/42 71/11/42 +f 17/14/42 19/15/42 71/11/42 +f 19/15/42 21/16/42 71/11/42 +f 21/16/42 23/17/42 71/11/42 +f 23/17/42 25/18/42 71/11/42 +f 25/18/42 27/19/42 71/11/42 +f 27/19/42 29/20/42 71/11/42 +f 29/20/42 31/21/42 71/11/42 +f 31/21/42 33/22/42 71/11/42 +f 33/22/42 35/23/42 71/11/42 +f 35/23/42 37/24/42 71/11/42 +f 37/24/42 39/25/42 71/11/42 +f 39/25/42 41/26/42 71/11/42 +f 41/26/42 43/27/42 71/11/42 +f 43/27/42 45/28/42 71/11/42 +f 45/28/42 47/29/42 71/11/42 +f 47/29/42 49/30/42 71/11/42 +f 49/30/42 51/31/42 71/11/42 +f 51/31/42 53/32/42 71/11/42 +f 53/32/42 55/33/42 71/11/42 +f 55/33/42 57/34/42 71/11/42 +f 57/34/42 59/35/42 71/11/42 +f 59/35/42 61/36/42 71/11/42 +f 61/36/42 63/37/42 71/11/42 +f 63/37/42 65/38/42 71/11/42 +f 65/38/42 67/39/42 71/11/42 +f 67/39/42 69/40/42 71/11/42 v 1.365790 1.252743 0.402799 v 1.365790 2.069450 0.402799 v 1.446312 1.252743 0.410646 @@ -316,134 +356,170 @@ v 1.207842 1.252743 0.433883 v 1.207842 2.069450 0.433883 v 1.285269 1.252743 0.410646 v 1.285269 2.069450 0.410646 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn -0.879812 0.000000 0.475321 vn -0.956071 0.000000 0.293136 vn -0.956070 -0.000000 -0.293137 s off -f 73//9 74//9 76//9 -f 75//10 76//10 78//10 -f 77//11 78//11 80//11 -f 79//12 80//12 82//12 -f 81//13 82//13 84//13 -f 83//14 84//14 86//14 -f 85//15 86//15 88//15 -f 87//16 88//16 90//16 -f 89//17 90//17 92//17 -f 91//18 92//18 94//18 -f 93//19 94//19 96//19 -f 95//20 96//20 98//20 -f 97//21 98//21 100//21 -f 99//22 100//22 102//22 -f 101//23 102//23 104//23 -f 103//24 104//24 106//24 -f 105//25 106//25 107//25 -f 107//26 108//26 109//26 -f 109//27 110//27 111//27 -f 111//28 112//28 113//28 -f 113//29 114//29 115//29 -f 115//43 116//43 117//43 -f 117//44 118//44 119//44 -f 119//32 120//32 121//32 -f 121//33 122//33 123//33 -f 123//45 124//45 125//45 -f 125//35 126//35 127//35 -f 127//36 128//36 129//36 -f 129//37 130//37 131//37 -f 131//38 132//38 133//38 -f 76//39 74//39 78//39 -f 135//40 136//40 73//40 -f 133//41 134//41 135//41 -f 73//42 75//42 135//42 -f 75//9 73//9 76//9 -f 77//10 75//10 78//10 -f 79//11 77//11 80//11 -f 81//12 79//12 82//12 -f 83//13 81//13 84//13 -f 85//14 83//14 86//14 -f 87//15 85//15 88//15 -f 89//16 87//16 90//16 -f 91//17 89//17 92//17 -f 93//18 91//18 94//18 -f 95//19 93//19 96//19 -f 97//20 95//20 98//20 -f 99//21 97//21 100//21 -f 101//22 99//22 102//22 -f 103//23 101//23 104//23 -f 105//24 103//24 106//24 -f 106//25 108//25 107//25 -f 108//26 110//26 109//26 -f 110//27 112//27 111//27 -f 112//28 114//28 113//28 -f 114//29 116//29 115//29 -f 116//43 118//43 117//43 -f 118//44 120//44 119//44 -f 120//32 122//32 121//32 -f 122//33 124//33 123//33 -f 124//45 126//45 125//45 -f 126//35 128//35 127//35 -f 128//36 130//36 129//36 -f 130//37 132//37 131//37 -f 132//38 134//38 133//38 -f 74//39 136//39 78//39 -f 136//39 134//39 78//39 -f 134//39 132//39 78//39 -f 132//39 130//39 78//39 -f 130//39 128//39 78//39 -f 128//39 126//39 78//39 -f 126//39 124//39 78//39 -f 124//39 122//39 78//39 -f 122//39 120//39 78//39 -f 120//39 118//39 78//39 -f 118//39 116//39 78//39 -f 116//39 114//39 78//39 -f 114//39 112//39 78//39 -f 112//39 110//39 78//39 -f 110//39 108//39 78//39 -f 108//39 106//39 78//39 -f 106//39 104//39 78//39 -f 104//39 102//39 78//39 -f 102//39 100//39 78//39 -f 100//39 98//39 78//39 -f 98//39 96//39 78//39 -f 96//39 94//39 78//39 -f 94//39 92//39 78//39 -f 92//39 90//39 78//39 -f 90//39 88//39 78//39 -f 88//39 86//39 78//39 -f 86//39 84//39 78//39 -f 84//39 82//39 80//39 -f 78//39 84//39 80//39 -f 136//40 74//40 73//40 -f 134//41 136//41 135//41 -f 75//42 77//42 135//42 -f 77//42 79//42 135//42 -f 79//42 81//42 135//42 -f 81//42 83//42 135//42 -f 83//42 85//42 135//42 -f 85//42 87//42 135//42 -f 87//42 89//42 135//42 -f 89//42 91//42 135//42 -f 91//42 93//42 135//42 -f 93//42 95//42 135//42 -f 95//42 97//42 135//42 -f 97//42 99//42 135//42 -f 99//42 101//42 135//42 -f 101//42 103//42 135//42 -f 103//42 105//42 135//42 -f 105//42 107//42 135//42 -f 107//42 109//42 135//42 -f 109//42 111//42 135//42 -f 111//42 113//42 135//42 -f 113//42 115//42 135//42 -f 115//42 117//42 135//42 -f 117//42 119//42 135//42 -f 119//42 121//42 135//42 -f 121//42 123//42 135//42 -f 123//42 125//42 135//42 -f 125//42 127//42 135//42 -f 127//42 129//42 135//42 -f 129//42 131//42 135//42 -f 131//42 133//42 135//42 +f 73/41/9 74/42/9 76/43/9 +f 75/41/10 76/42/10 78/43/10 +f 77/41/11 78/42/11 80/43/11 +f 79/41/12 80/42/12 82/43/12 +f 81/41/13 82/42/13 84/43/13 +f 83/41/14 84/42/14 86/43/14 +f 85/41/15 86/42/15 88/43/15 +f 87/41/16 88/42/16 90/43/16 +f 89/41/17 90/42/17 92/43/17 +f 91/41/18 92/42/18 94/43/18 +f 93/41/19 94/42/19 96/43/19 +f 95/41/20 96/42/20 98/43/20 +f 97/41/21 98/42/21 100/43/21 +f 99/41/22 100/42/22 102/43/22 +f 101/41/23 102/42/23 104/43/23 +f 103/41/24 104/42/24 106/43/24 +f 105/41/25 106/42/25 107/44/25 +f 107/41/26 108/42/26 109/44/26 +f 109/41/27 110/42/27 111/44/27 +f 111/41/28 112/42/28 113/44/28 +f 113/41/29 114/42/29 115/44/29 +f 115/41/43 116/42/43 117/44/43 +f 117/41/44 118/42/44 119/44/44 +f 119/41/32 120/42/32 121/44/32 +f 121/41/33 122/42/33 123/44/33 +f 123/41/45 124/42/45 125/44/45 +f 125/41/35 126/42/35 127/44/35 +f 127/41/36 128/42/36 129/44/36 +f 129/41/37 130/42/37 131/44/37 +f 131/41/38 132/42/38 133/44/38 +f 76/45/39 74/46/39 78/47/39 +f 135/41/40 136/42/40 73/44/40 +f 133/41/41 134/42/41 135/44/41 +f 73/45/42 75/46/42 135/47/42 +f 75/44/9 73/41/9 76/43/9 +f 77/44/10 75/41/10 78/43/10 +f 79/44/11 77/41/11 80/43/11 +f 81/44/12 79/41/12 82/43/12 +f 83/44/13 81/41/13 84/43/13 +f 85/44/14 83/41/14 86/43/14 +f 87/44/15 85/41/15 88/43/15 +f 89/44/16 87/41/16 90/43/16 +f 91/44/17 89/41/17 92/43/17 +f 93/44/18 91/41/18 94/43/18 +f 95/44/19 93/41/19 96/43/19 +f 97/44/20 95/41/20 98/43/20 +f 99/44/21 97/41/21 100/43/21 +f 101/44/22 99/41/22 102/43/22 +f 103/44/23 101/41/23 104/43/23 +f 105/44/24 103/41/24 106/43/24 +f 106/42/25 108/43/25 107/44/25 +f 108/42/26 110/43/26 109/44/26 +f 110/42/27 112/43/27 111/44/27 +f 112/42/28 114/43/28 113/44/28 +f 114/42/29 116/43/29 115/44/29 +f 116/42/43 118/43/43 117/44/43 +f 118/42/44 120/43/44 119/44/44 +f 120/42/32 122/43/32 121/44/32 +f 122/42/33 124/43/33 123/44/33 +f 124/42/45 126/43/45 125/44/45 +f 126/42/35 128/43/35 127/44/35 +f 128/42/36 130/43/36 129/44/36 +f 130/42/37 132/43/37 131/44/37 +f 132/42/38 134/43/38 133/44/38 +f 74/46/39 136/48/39 78/47/39 +f 136/48/39 134/49/39 78/47/39 +f 134/49/39 132/50/39 78/47/39 +f 132/50/39 130/51/39 78/47/39 +f 130/51/39 128/52/39 78/47/39 +f 128/52/39 126/53/39 78/47/39 +f 126/53/39 124/54/39 78/47/39 +f 124/54/39 122/55/39 78/47/39 +f 122/55/39 120/56/39 78/47/39 +f 120/56/39 118/57/39 78/47/39 +f 118/57/39 116/58/39 78/47/39 +f 116/58/39 114/59/39 78/47/39 +f 114/59/39 112/60/39 78/47/39 +f 112/60/39 110/61/39 78/47/39 +f 110/61/39 108/62/39 78/47/39 +f 108/62/39 106/63/39 78/47/39 +f 106/63/39 104/64/39 78/47/39 +f 104/64/39 102/65/39 78/47/39 +f 102/65/39 100/66/39 78/47/39 +f 100/66/39 98/67/39 78/47/39 +f 98/67/39 96/68/39 78/47/39 +f 96/68/39 94/69/39 78/47/39 +f 94/69/39 92/70/39 78/47/39 +f 92/70/39 90/71/39 78/47/39 +f 90/71/39 88/72/39 78/47/39 +f 88/72/39 86/73/39 78/47/39 +f 86/73/39 84/74/39 78/47/39 +f 84/74/39 82/75/39 80/76/39 +f 78/47/39 84/74/39 80/76/39 +f 136/42/40 74/43/40 73/44/40 +f 134/42/41 136/43/41 135/44/41 +f 75/46/42 77/48/42 135/47/42 +f 77/48/42 79/49/42 135/47/42 +f 79/49/42 81/50/42 135/47/42 +f 81/50/42 83/51/42 135/47/42 +f 83/51/42 85/52/42 135/47/42 +f 85/52/42 87/53/42 135/47/42 +f 87/53/42 89/54/42 135/47/42 +f 89/54/42 91/55/42 135/47/42 +f 91/55/42 93/56/42 135/47/42 +f 93/56/42 95/57/42 135/47/42 +f 95/57/42 97/58/42 135/47/42 +f 97/58/42 99/59/42 135/47/42 +f 99/59/42 101/60/42 135/47/42 +f 101/60/42 103/61/42 135/47/42 +f 103/61/42 105/62/42 135/47/42 +f 105/62/42 107/63/42 135/47/42 +f 107/63/42 109/64/42 135/47/42 +f 109/64/42 111/65/42 135/47/42 +f 111/65/42 113/66/42 135/47/42 +f 113/66/42 115/67/42 135/47/42 +f 115/67/42 117/68/42 135/47/42 +f 117/68/42 119/69/42 135/47/42 +f 119/69/42 121/70/42 135/47/42 +f 121/70/42 123/71/42 135/47/42 +f 123/71/42 125/72/42 135/47/42 +f 125/72/42 127/73/42 135/47/42 +f 127/73/42 129/74/42 135/47/42 +f 129/74/42 131/75/42 135/47/42 +f 131/75/42 133/76/42 135/47/42 v -2.345663 0.025178 -0.194338 v -2.345663 0.025178 -0.594338 v -1.345663 0.025178 -0.594338 @@ -452,23 +528,27 @@ v -2.345663 1.525178 -0.194338 v -2.345663 1.525178 -0.594338 v -1.345663 1.525178 -0.594338 v -1.345663 1.525178 -0.194338 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 vn -1.000000 0.000000 0.000000 vn 0.000000 0.000000 -1.000000 vn 1.000000 -0.000000 0.000000 vn 0.000000 0.000000 1.000000 s off -f 141//46 142//46 137//46 -f 142//47 143//47 138//47 -f 143//48 144//48 140//48 -f 144//49 141//49 137//49 -f 137//42 138//42 139//42 -f 144//39 143//39 142//39 -f 142//46 138//46 137//46 -f 143//47 139//47 138//47 -f 139//48 143//48 140//48 -f 140//49 144//49 137//49 -f 140//42 137//42 139//42 -f 141//39 144//39 142//39 +f 141/77/46 142/78/46 137/79/46 +f 142/77/47 143/78/47 138/79/47 +f 143/77/48 144/78/48 140/80/48 +f 144/77/49 141/78/49 137/80/49 +f 137/77/42 138/78/42 139/80/42 +f 144/77/39 143/78/39 142/80/39 +f 142/78/46 138/80/46 137/79/46 +f 143/78/47 139/80/47 138/79/47 +f 139/79/48 143/77/48 140/80/48 +f 140/79/49 144/77/49 137/80/49 +f 140/79/42 137/77/42 139/80/42 +f 141/79/39 144/77/39 142/80/39 v 1.364119 0.019809 -0.205019 v 1.364119 0.019809 -0.605019 v 2.364120 0.019809 -0.605019 @@ -477,19 +557,23 @@ v 1.364119 1.419809 -0.205019 v 1.364119 1.419809 -0.605019 v 2.364120 1.419809 -0.605019 v 2.364120 1.419809 -0.205019 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 s off -f 149//46 150//46 145//46 -f 150//47 151//47 146//47 -f 151//48 152//48 148//48 -f 152//49 149//49 145//49 -f 145//42 146//42 147//42 -f 152//39 151//39 150//39 -f 150//46 146//46 145//46 -f 151//47 147//47 146//47 -f 147//48 151//48 148//48 -f 148//49 152//49 145//49 -f 148//42 145//42 147//42 -f 149//39 152//39 150//39 +f 149/81/46 150/82/46 145/83/46 +f 150/81/47 151/82/47 146/83/47 +f 151/81/48 152/82/48 148/84/48 +f 152/81/49 149/82/49 145/84/49 +f 145/81/42 146/82/42 147/84/42 +f 152/81/39 151/82/39 150/84/39 +f 150/82/46 146/84/46 145/83/46 +f 151/82/47 147/84/47 146/83/47 +f 147/83/48 151/81/48 148/84/48 +f 148/83/49 152/81/49 145/84/49 +f 148/83/42 145/81/42 147/84/42 +f 149/83/39 152/81/39 150/84/39 v -1.384247 0.015116 3.993316 v -1.384247 0.015113 -0.006684 v -1.189157 0.034331 3.993316 @@ -682,6 +766,42 @@ v -0.079117 3.927104 -3.508027 v -0.079117 4.374522 -3.508027 v -0.037151 3.927105 -3.520757 v -0.037151 4.374522 -3.520757 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.853553 0.853553 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.500000 0.000000 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.777785 0.084265 +vt 0.853553 0.146447 +vt 0.084265 0.222215 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.038060 0.308659 +vt 0.222215 0.915735 +vt 0.308659 0.961940 +vt 0.146447 0.853554 +vt 0.990393 0.597545 +vt 0.084266 0.777786 +vt 0.038060 0.691342 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.009607 0.597546 +vt 0.000000 0.500000 +vt 0.915735 0.222215 +vt 0.009607 0.402455 +vt 0.402455 0.009607 +vt 0.308658 0.038060 vn 0.098018 -0.995185 0.000001 vn 0.290285 -0.956940 0.000001 vn 0.471397 -0.881921 0.000001 @@ -888,382 +1008,382 @@ vn -0.000002 -1.000000 0.000001 vn -0.000001 -1.000000 0.000001 vn 0.000000 -1.000000 0.000001 s off -f 153//50 154//50 156//50 -f 155//51 156//51 158//51 -f 157//52 158//52 160//52 -f 159//53 160//53 162//53 -f 161//54 162//54 164//54 -f 163//55 164//55 166//55 -f 165//56 166//56 168//56 -f 167//57 168//57 170//57 -f 169//58 170//58 172//58 -f 171//59 172//59 174//59 -f 173//60 174//60 176//60 -f 175//61 176//61 178//61 -f 177//62 178//62 180//62 -f 179//63 180//63 182//63 -f 181//64 182//64 184//64 -f 183//65 184//65 186//65 -f 185//66 186//66 187//66 -f 187//67 188//67 189//67 -f 189//68 190//68 191//68 -f 191//69 192//69 193//69 -f 193//70 194//70 195//70 -f 195//71 196//71 197//71 -f 197//72 198//72 199//72 -f 199//73 200//73 201//73 -f 201//74 202//74 203//74 -f 203//75 204//75 205//75 -f 205//76 206//76 207//76 -f 207//77 208//77 209//77 -f 209//78 210//78 211//78 -f 211//79 212//79 213//79 -f 204//80 202//80 242//80 -f 215//81 216//81 153//81 -f 213//82 214//82 215//82 -f 193//83 195//83 269//83 -f 246//47 248//47 247//47 -f 180//84 178//84 229//84 -f 154//85 216//85 217//85 -f 194//86 192//86 237//86 -f 170//87 168//87 224//87 -f 208//88 206//88 244//88 -f 184//89 182//89 231//89 -f 160//90 158//90 219//90 -f 198//91 196//91 239//91 -f 174//92 172//92 226//92 -f 212//93 210//93 246//93 -f 188//94 186//94 234//94 -f 164//95 162//95 221//95 -f 202//96 200//96 241//96 -f 178//97 176//97 228//97 -f 216//98 214//98 248//98 -f 192//99 190//99 236//99 -f 168//100 166//100 223//100 -f 206//101 204//101 243//101 -f 182//102 180//102 230//102 -f 158//103 156//103 218//103 -f 196//104 194//104 238//104 -f 172//105 170//105 225//105 -f 210//106 208//106 245//106 -f 186//107 184//107 232//107 -f 162//108 160//108 220//108 -f 200//109 198//109 240//109 -f 156//110 154//110 217//110 -f 176//111 174//111 227//111 -f 214//112 212//112 247//112 -f 190//113 188//113 235//113 -f 166//114 164//114 222//114 -f 249//49 250//49 280//49 -f 169//115 171//115 258//115 -f 207//116 209//116 276//116 -f 183//117 185//117 265//117 -f 159//118 161//118 253//118 -f 197//119 199//119 271//119 -f 153//120 155//120 250//120 -f 173//121 175//121 260//121 -f 211//122 213//122 278//122 -f 187//123 189//123 266//123 -f 163//124 165//124 255//124 -f 201//125 203//125 273//125 -f 177//126 179//126 262//126 -f 215//127 153//127 280//127 -f 191//128 193//128 268//128 -f 167//129 169//129 257//129 -f 205//130 207//130 275//130 -f 181//131 183//131 264//131 -f 157//132 159//132 252//132 -f 195//133 197//133 270//133 -f 171//134 173//134 259//134 -f 209//135 211//135 277//135 -f 185//136 187//136 265//136 -f 161//137 163//137 254//137 -f 199//138 201//138 272//138 -f 175//139 177//139 261//139 -f 213//140 215//140 279//140 -f 189//141 191//141 267//141 -f 165//142 167//142 256//142 -f 203//143 205//143 274//143 -f 179//144 181//144 263//144 -f 155//145 157//145 251//145 -f 281//146 282//146 284//146 -f 283//147 284//147 286//147 -f 285//148 286//148 288//148 -f 287//149 288//149 290//149 -f 289//150 290//150 292//150 -f 291//151 292//151 294//151 -f 293//152 294//152 296//152 -f 295//153 296//153 298//153 -f 297//154 298//154 300//154 -f 299//155 300//155 302//155 -f 301//156 302//156 304//156 -f 303//157 304//157 306//157 -f 305//158 306//158 308//158 -f 307//159 308//159 310//159 -f 309//160 310//160 312//160 -f 311//161 312//161 314//161 -f 313//162 314//162 315//162 -f 315//163 316//163 317//163 -f 317//164 318//164 319//164 -f 319//165 320//165 321//165 -f 321//166 322//166 323//166 -f 323//167 324//167 325//167 -f 325//168 326//168 327//168 -f 327//169 328//169 329//169 -f 329//170 330//170 331//170 -f 331//171 332//171 333//171 -f 333//172 334//172 335//172 -f 335//173 336//173 337//173 -f 337//174 338//174 339//174 -f 339//175 340//175 341//175 -f 284//39 282//39 286//39 -f 343//176 344//176 281//176 -f 341//177 342//177 344//177 -f 281//42 283//42 343//42 -f 155//178 153//178 156//178 -f 157//51 155//51 158//51 -f 159//52 157//52 160//52 -f 161//53 159//53 162//53 -f 163//54 161//54 164//54 -f 165//179 163//179 166//179 -f 167//56 165//56 168//56 -f 169//57 167//57 170//57 -f 171//58 169//58 172//58 -f 173//59 171//59 174//59 -f 175//180 173//180 176//180 -f 177//61 175//61 178//61 -f 179//181 177//181 180//181 -f 181//182 179//182 182//182 -f 183//183 181//183 184//183 -f 185//65 183//65 186//65 -f 186//184 188//184 187//184 -f 188//67 190//67 189//67 -f 190//68 192//68 191//68 -f 192//69 194//69 193//69 -f 194//70 196//70 195//70 -f 196//71 198//71 197//71 -f 198//72 200//72 199//72 -f 200//73 202//73 201//73 -f 202//74 204//74 203//74 -f 204//75 206//75 205//75 -f 206//185 208//185 207//185 -f 208//77 210//77 209//77 -f 210//78 212//78 211//78 -f 212//79 214//79 213//79 -f 202//186 241//186 242//186 -f 216//81 154//81 153//81 -f 214//82 216//82 215//82 -f 195//187 270//187 269//187 -f 245//47 248//47 246//47 -f 244//47 248//47 245//47 -f 234//47 236//47 235//47 -f 234//47 237//47 236//47 -f 234//47 238//47 237//47 -f 229//47 231//47 230//47 -f 228//47 231//47 229//47 -f 219//47 221//47 220//47 -f 219//47 222//47 221//47 -f 218//47 217//47 219//47 -f 217//47 248//47 219//47 -f 248//47 244//47 219//47 -f 219//47 244//47 222//47 -f 244//188 243//188 222//188 -f 222//188 243//188 223//188 -f 223//47 243//47 224//47 -f 243//47 242//47 224//47 -f 242//47 241//47 224//47 -f 241//47 240//47 224//47 -f 224//47 240//47 225//47 -f 225//47 240//47 226//47 -f 240//47 239//47 226//47 -f 226//47 239//47 227//47 -f 239//188 238//188 227//188 -f 227//188 238//188 228//188 -f 228//47 238//47 231//47 -f 238//47 234//47 231//47 -f 234//47 233//47 232//47 -f 231//47 234//47 232//47 -f 230//189 180//189 229//189 -f 216//85 248//85 217//85 -f 192//86 236//86 237//86 -f 225//190 170//190 224//190 -f 206//191 243//191 244//191 -f 232//192 184//192 231//192 -f 220//193 160//193 219//193 -f 196//194 238//194 239//194 -f 227//195 174//195 226//195 -f 210//93 245//93 246//93 -f 186//196 233//196 234//196 -f 222//197 164//197 221//197 -f 200//198 240//198 241//198 -f 229//199 178//199 228//199 -f 214//98 247//98 248//98 -f 190//99 235//99 236//99 -f 224//200 168//200 223//200 -f 204//201 242//201 243//201 -f 231//102 182//102 230//102 -f 219//103 158//103 218//103 -f 194//202 237//202 238//202 -f 226//203 172//203 225//203 -f 208//204 244//204 245//204 -f 233//107 186//107 232//107 -f 221//108 162//108 220//108 -f 198//109 239//109 240//109 -f 218//205 156//205 217//205 -f 228//206 176//206 227//206 -f 212//207 246//207 247//207 -f 188//208 234//208 235//208 -f 223//209 166//209 222//209 -f 250//49 251//49 280//49 -f 251//49 252//49 280//49 -f 252//49 253//49 280//49 -f 253//49 254//49 280//49 -f 254//49 255//49 280//49 -f 255//49 256//49 280//49 -f 256//49 257//49 280//49 -f 257//49 258//49 280//49 -f 258//49 259//49 280//49 -f 259//49 260//49 280//49 -f 260//49 261//49 280//49 -f 261//49 262//49 280//49 -f 262//49 263//49 280//49 -f 263//49 264//49 280//49 -f 264//49 265//49 280//49 -f 265//49 266//49 280//49 -f 266//49 267//49 280//49 -f 267//49 268//49 280//49 -f 268//49 269//49 280//49 -f 269//49 270//49 280//49 -f 270//49 271//49 280//49 -f 271//49 272//49 280//49 -f 272//49 273//49 280//49 -f 273//49 274//49 280//49 -f 274//49 275//49 280//49 -f 275//49 276//49 280//49 -f 276//49 277//49 280//49 -f 277//49 278//49 279//49 -f 280//49 277//49 279//49 -f 257//115 169//115 258//115 -f 209//210 277//210 276//210 -f 264//117 183//117 265//117 -f 252//118 159//118 253//118 -f 199//211 272//211 271//211 -f 249//212 153//212 250//212 -f 259//213 173//213 260//213 -f 213//122 279//122 278//122 -f 189//123 267//123 266//123 -f 254//214 163//214 255//214 -f 203//215 274//215 273//215 -f 261//126 177//126 262//126 -f 153//127 249//127 280//127 -f 193//128 269//128 268//128 -f 256//216 167//216 257//216 -f 207//130 276//130 275//130 -f 263//217 181//217 264//217 -f 251//218 157//218 252//218 -f 197//219 271//219 270//219 -f 258//220 171//220 259//220 -f 211//221 278//221 277//221 -f 187//136 266//136 265//136 -f 253//222 161//222 254//222 -f 201//223 273//223 272//223 -f 260//139 175//139 261//139 -f 215//224 280//224 279//224 -f 191//141 268//141 267//141 -f 255//142 165//142 256//142 -f 205//225 275//225 274//225 -f 262//144 179//144 263//144 -f 250//226 155//226 251//226 -f 283//227 281//227 284//227 -f 285//228 283//228 286//228 -f 287//148 285//148 288//148 -f 289//229 287//229 290//229 -f 291//150 289//150 292//150 -f 293//151 291//151 294//151 -f 295//152 293//152 296//152 -f 297//153 295//153 298//153 -f 299//230 297//230 300//230 -f 301//231 299//231 302//231 -f 303//156 301//156 304//156 -f 305//157 303//157 306//157 -f 307//232 305//232 308//232 -f 309//233 307//233 310//233 -f 311//234 309//234 312//234 -f 313//235 311//235 314//235 -f 314//236 316//236 315//236 -f 316//237 318//237 317//237 -f 318//238 320//238 319//238 -f 320//239 322//239 321//239 -f 322//166 324//166 323//166 -f 324//167 326//167 325//167 -f 326//168 328//168 327//168 -f 328//169 330//169 329//169 -f 330//240 332//240 331//240 -f 332//171 334//171 333//171 -f 334//172 336//172 335//172 -f 336//241 338//241 337//241 -f 338//242 340//242 339//242 -f 340//175 342//175 341//175 -f 282//39 344//39 286//39 -f 344//39 342//39 286//39 -f 342//39 340//39 286//39 -f 340//39 338//39 286//39 -f 338//39 336//39 286//39 -f 336//39 334//39 286//39 -f 334//39 332//39 286//39 -f 332//39 330//39 286//39 -f 330//39 328//39 286//39 -f 328//39 326//39 286//39 -f 326//39 324//39 286//39 -f 324//39 322//39 286//39 -f 322//39 320//39 286//39 -f 320//39 318//39 286//39 -f 318//39 316//39 286//39 -f 316//39 314//39 286//39 -f 314//39 312//39 286//39 -f 312//39 310//39 286//39 -f 310//39 308//39 286//39 -f 308//39 306//39 286//39 -f 306//39 304//39 286//39 -f 304//39 302//39 286//39 -f 302//39 300//39 286//39 -f 300//39 298//39 286//39 -f 298//39 296//39 286//39 -f 296//39 294//39 286//39 -f 294//39 292//39 286//39 -f 292//39 290//39 286//39 -f 290//39 288//39 286//39 -f 344//243 282//243 281//243 -f 343//244 341//244 344//244 -f 283//245 285//245 343//245 -f 343//245 285//245 341//245 -f 285//42 287//42 341//42 -f 287//42 289//42 341//42 -f 289//42 291//42 341//42 -f 291//246 293//246 341//246 -f 293//247 295//247 341//247 -f 335//248 331//248 333//248 -f 295//247 297//247 341//247 -f 297//247 299//247 341//247 -f 335//249 329//249 331//249 -f 299//247 301//247 341//247 -f 335//250 327//250 329//250 -f 301//247 303//247 341//247 -f 335//251 325//251 327//251 -f 303//42 305//42 341//42 -f 335//252 323//252 325//252 -f 305//42 307//42 341//42 -f 335//253 321//253 323//253 -f 307//42 309//42 341//42 -f 335//253 319//253 321//253 -f 309//254 311//254 341//254 -f 335//254 317//254 319//254 -f 311//254 313//254 341//254 -f 315//254 317//254 335//254 -f 313//254 315//254 341//254 -f 315//254 335//254 341//254 -f 335//42 337//42 339//42 -f 341//42 335//42 339//42 +f 153/85/50 154/86/50 156/87/50 +f 155/85/51 156/86/51 158/87/51 +f 157/85/52 158/86/52 160/87/52 +f 159/85/53 160/86/53 162/87/53 +f 161/85/54 162/86/54 164/87/54 +f 163/85/55 164/86/55 166/87/55 +f 165/85/56 166/86/56 168/87/56 +f 167/85/57 168/86/57 170/87/57 +f 169/85/58 170/86/58 172/87/58 +f 171/85/59 172/86/59 174/87/59 +f 173/85/60 174/86/60 176/87/60 +f 175/85/61 176/86/61 178/87/61 +f 177/85/62 178/86/62 180/87/62 +f 179/85/63 180/86/63 182/87/63 +f 181/85/64 182/86/64 184/87/64 +f 183/85/65 184/86/65 186/87/65 +f 185/85/66 186/86/66 187/88/66 +f 187/85/67 188/86/67 189/88/67 +f 189/85/68 190/86/68 191/88/68 +f 191/85/69 192/86/69 193/88/69 +f 193/85/70 194/86/70 195/88/70 +f 195/85/71 196/86/71 197/88/71 +f 197/85/72 198/86/72 199/88/72 +f 199/85/73 200/86/73 201/88/73 +f 201/85/74 202/86/74 203/88/74 +f 203/85/75 204/86/75 205/88/75 +f 205/85/76 206/86/76 207/88/76 +f 207/85/77 208/86/77 209/88/77 +f 209/85/78 210/86/78 211/88/78 +f 211/85/79 212/86/79 213/88/79 +f 204/85/80 202/86/80 242/88/80 +f 215/85/81 216/86/81 153/88/81 +f 213/85/82 214/86/82 215/88/82 +f 193/85/83 195/86/83 269/88/83 +f 246/89/47 248/90/47 247/91/47 +f 180/85/84 178/86/84 229/87/84 +f 154/85/85 216/86/85 217/88/85 +f 194/85/86 192/86/86 237/88/86 +f 170/85/87 168/86/87 224/87/87 +f 208/85/88 206/86/88 244/88/88 +f 184/85/89 182/86/89 231/87/89 +f 160/85/90 158/86/90 219/87/90 +f 198/85/91 196/86/91 239/88/91 +f 174/85/92 172/86/92 226/87/92 +f 212/85/93 210/86/93 246/88/93 +f 188/85/94 186/86/94 234/88/94 +f 164/85/95 162/86/95 221/87/95 +f 202/85/96 200/86/96 241/88/96 +f 178/85/97 176/86/97 228/87/97 +f 216/85/98 214/86/98 248/88/98 +f 192/85/99 190/86/99 236/88/99 +f 168/85/100 166/86/100 223/87/100 +f 206/85/101 204/86/101 243/88/101 +f 182/85/102 180/86/102 230/87/102 +f 158/85/103 156/86/103 218/87/103 +f 196/85/104 194/86/104 238/88/104 +f 172/85/105 170/86/105 225/87/105 +f 210/85/106 208/86/106 245/88/106 +f 186/85/107 184/86/107 232/87/107 +f 162/85/108 160/86/108 220/87/108 +f 200/85/109 198/86/109 240/88/109 +f 156/85/110 154/86/110 217/87/110 +f 176/85/111 174/86/111 227/87/111 +f 214/85/112 212/86/112 247/88/112 +f 190/85/113 188/86/113 235/88/113 +f 166/85/114 164/86/114 222/87/114 +f 249/92/49 250/93/49 280/94/49 +f 169/85/115 171/86/115 258/87/115 +f 207/85/116 209/86/116 276/88/116 +f 183/85/117 185/86/117 265/87/117 +f 159/85/118 161/86/118 253/87/118 +f 197/85/119 199/86/119 271/88/119 +f 153/85/120 155/86/120 250/87/120 +f 173/85/121 175/86/121 260/87/121 +f 211/85/122 213/86/122 278/88/122 +f 187/85/123 189/86/123 266/88/123 +f 163/85/124 165/86/124 255/87/124 +f 201/85/125 203/86/125 273/88/125 +f 177/85/126 179/86/126 262/87/126 +f 215/85/127 153/86/127 280/88/127 +f 191/85/128 193/86/128 268/88/128 +f 167/85/129 169/86/129 257/87/129 +f 205/85/130 207/86/130 275/88/130 +f 181/85/131 183/86/131 264/87/131 +f 157/85/132 159/86/132 252/87/132 +f 195/85/133 197/86/133 270/88/133 +f 171/85/134 173/86/134 259/87/134 +f 209/85/135 211/86/135 277/88/135 +f 185/85/136 187/86/136 265/88/136 +f 161/85/137 163/86/137 254/87/137 +f 199/85/138 201/86/138 272/88/138 +f 175/85/139 177/86/139 261/87/139 +f 213/85/140 215/86/140 279/88/140 +f 189/85/141 191/86/141 267/88/141 +f 165/85/142 167/86/142 256/87/142 +f 203/85/143 205/86/143 274/88/143 +f 179/85/144 181/86/144 263/87/144 +f 155/85/145 157/86/145 251/87/145 +f 281/85/146 282/86/146 284/87/146 +f 283/85/147 284/86/147 286/87/147 +f 285/85/148 286/86/148 288/87/148 +f 287/85/149 288/86/149 290/87/149 +f 289/85/150 290/86/150 292/87/150 +f 291/85/151 292/86/151 294/87/151 +f 293/85/152 294/86/152 296/87/152 +f 295/85/153 296/86/153 298/87/153 +f 297/85/154 298/86/154 300/87/154 +f 299/85/155 300/86/155 302/87/155 +f 301/85/156 302/86/156 304/87/156 +f 303/85/157 304/86/157 306/87/157 +f 305/85/158 306/86/158 308/87/158 +f 307/85/159 308/86/159 310/87/159 +f 309/85/160 310/86/160 312/87/160 +f 311/85/161 312/86/161 314/87/161 +f 313/85/162 314/86/162 315/88/162 +f 315/85/163 316/86/163 317/88/163 +f 317/85/164 318/86/164 319/88/164 +f 319/85/165 320/86/165 321/88/165 +f 321/85/166 322/86/166 323/88/166 +f 323/85/167 324/86/167 325/88/167 +f 325/85/168 326/86/168 327/88/168 +f 327/85/169 328/86/169 329/88/169 +f 329/85/170 330/86/170 331/88/170 +f 331/85/171 332/86/171 333/88/171 +f 333/85/172 334/86/172 335/88/172 +f 335/85/173 336/86/173 337/88/173 +f 337/85/174 338/86/174 339/88/174 +f 339/85/175 340/86/175 341/88/175 +f 284/92/39 282/93/39 286/94/39 +f 343/85/176 344/86/176 281/88/176 +f 341/85/177 342/86/177 344/87/177 +f 281/92/42 283/93/42 343/94/42 +f 155/88/178 153/85/178 156/87/178 +f 157/88/51 155/85/51 158/87/51 +f 159/88/52 157/85/52 160/87/52 +f 161/88/53 159/85/53 162/87/53 +f 163/88/54 161/85/54 164/87/54 +f 165/88/179 163/85/179 166/87/179 +f 167/88/56 165/85/56 168/87/56 +f 169/88/57 167/85/57 170/87/57 +f 171/88/58 169/85/58 172/87/58 +f 173/88/59 171/85/59 174/87/59 +f 175/88/180 173/85/180 176/87/180 +f 177/88/61 175/85/61 178/87/61 +f 179/88/181 177/85/181 180/87/181 +f 181/88/182 179/85/182 182/87/182 +f 183/88/183 181/85/183 184/87/183 +f 185/88/65 183/85/65 186/87/65 +f 186/86/184 188/87/184 187/88/184 +f 188/86/67 190/87/67 189/88/67 +f 190/86/68 192/87/68 191/88/68 +f 192/86/69 194/87/69 193/88/69 +f 194/86/70 196/87/70 195/88/70 +f 196/86/71 198/87/71 197/88/71 +f 198/86/72 200/87/72 199/88/72 +f 200/86/73 202/87/73 201/88/73 +f 202/86/74 204/87/74 203/88/74 +f 204/86/75 206/87/75 205/88/75 +f 206/86/185 208/87/185 207/88/185 +f 208/86/77 210/87/77 209/88/77 +f 210/86/78 212/87/78 211/88/78 +f 212/86/79 214/87/79 213/88/79 +f 202/86/186 241/87/186 242/88/186 +f 216/86/81 154/87/81 153/88/81 +f 214/86/82 216/87/82 215/88/82 +f 195/86/187 270/87/187 269/88/187 +f 245/95/47 248/90/47 246/89/47 +f 244/96/47 248/90/47 245/95/47 +f 234/97/47 236/98/47 235/99/47 +f 234/97/47 237/100/47 236/98/47 +f 234/97/47 238/101/47 237/100/47 +f 229/102/47 231/103/47 230/104/47 +f 228/105/47 231/103/47 229/102/47 +f 219/94/47 221/106/47 220/107/47 +f 219/94/47 222/108/47 221/106/47 +f 218/92/47 217/93/47 219/94/47 +f 217/93/47 248/90/47 219/94/47 +f 248/90/47 244/96/47 219/94/47 +f 219/94/47 244/96/47 222/108/47 +f 244/96/188 243/109/188 222/108/188 +f 222/108/188 243/109/188 223/110/188 +f 223/110/47 243/109/47 224/111/47 +f 243/109/47 242/112/47 224/111/47 +f 242/112/47 241/113/47 224/111/47 +f 241/113/47 240/114/47 224/111/47 +f 224/111/47 240/114/47 225/115/47 +f 225/115/47 240/114/47 226/116/47 +f 240/114/47 239/117/47 226/116/47 +f 226/116/47 239/117/47 227/118/47 +f 239/117/188 238/101/188 227/118/188 +f 227/118/188 238/101/188 228/105/188 +f 228/105/47 238/101/47 231/103/47 +f 238/101/47 234/97/47 231/103/47 +f 234/97/47 233/119/47 232/120/47 +f 231/103/47 234/97/47 232/120/47 +f 230/88/189 180/85/189 229/87/189 +f 216/86/85 248/87/85 217/88/85 +f 192/86/86 236/87/86 237/88/86 +f 225/88/190 170/85/190 224/87/190 +f 206/86/191 243/87/191 244/88/191 +f 232/88/192 184/85/192 231/87/192 +f 220/88/193 160/85/193 219/87/193 +f 196/86/194 238/87/194 239/88/194 +f 227/88/195 174/85/195 226/87/195 +f 210/86/93 245/87/93 246/88/93 +f 186/86/196 233/87/196 234/88/196 +f 222/88/197 164/85/197 221/87/197 +f 200/86/198 240/87/198 241/88/198 +f 229/88/199 178/85/199 228/87/199 +f 214/86/98 247/87/98 248/88/98 +f 190/86/99 235/87/99 236/88/99 +f 224/88/200 168/85/200 223/87/200 +f 204/86/201 242/87/201 243/88/201 +f 231/88/102 182/85/102 230/87/102 +f 219/88/103 158/85/103 218/87/103 +f 194/86/202 237/87/202 238/88/202 +f 226/88/203 172/85/203 225/87/203 +f 208/86/204 244/87/204 245/88/204 +f 233/88/107 186/85/107 232/87/107 +f 221/88/108 162/85/108 220/87/108 +f 198/86/109 239/87/109 240/88/109 +f 218/88/205 156/85/205 217/87/205 +f 228/88/206 176/85/206 227/87/206 +f 212/86/207 246/87/207 247/88/207 +f 188/86/208 234/87/208 235/88/208 +f 223/88/209 166/85/209 222/87/209 +f 250/93/49 251/90/49 280/94/49 +f 251/90/49 252/91/49 280/94/49 +f 252/91/49 253/89/49 280/94/49 +f 253/89/49 254/95/49 280/94/49 +f 254/95/49 255/96/49 280/94/49 +f 255/96/49 256/109/49 280/94/49 +f 256/109/49 257/112/49 280/94/49 +f 257/112/49 258/113/49 280/94/49 +f 258/113/49 259/114/49 280/94/49 +f 259/114/49 260/117/49 280/94/49 +f 260/117/49 261/101/49 280/94/49 +f 261/101/49 262/100/49 280/94/49 +f 262/100/49 263/98/49 280/94/49 +f 263/98/49 264/99/49 280/94/49 +f 264/99/49 265/97/49 280/94/49 +f 265/97/49 266/119/49 280/94/49 +f 266/119/49 267/120/49 280/94/49 +f 267/120/49 268/103/49 280/94/49 +f 268/103/49 269/104/49 280/94/49 +f 269/104/49 270/102/49 280/94/49 +f 270/102/49 271/105/49 280/94/49 +f 271/105/49 272/118/49 280/94/49 +f 272/118/49 273/116/49 280/94/49 +f 273/116/49 274/115/49 280/94/49 +f 274/115/49 275/111/49 280/94/49 +f 275/111/49 276/110/49 280/94/49 +f 276/110/49 277/108/49 280/94/49 +f 277/108/49 278/106/49 279/107/49 +f 280/94/49 277/108/49 279/107/49 +f 257/88/115 169/85/115 258/87/115 +f 209/86/210 277/87/210 276/88/210 +f 264/88/117 183/85/117 265/87/117 +f 252/88/118 159/85/118 253/87/118 +f 199/86/211 272/87/211 271/88/211 +f 249/88/212 153/85/212 250/87/212 +f 259/88/213 173/85/213 260/87/213 +f 213/86/122 279/87/122 278/88/122 +f 189/86/123 267/87/123 266/88/123 +f 254/88/214 163/85/214 255/87/214 +f 203/86/215 274/87/215 273/88/215 +f 261/88/126 177/85/126 262/87/126 +f 153/86/127 249/87/127 280/88/127 +f 193/86/128 269/87/128 268/88/128 +f 256/88/216 167/85/216 257/87/216 +f 207/86/130 276/87/130 275/88/130 +f 263/88/217 181/85/217 264/87/217 +f 251/88/218 157/85/218 252/87/218 +f 197/86/219 271/87/219 270/88/219 +f 258/88/220 171/85/220 259/87/220 +f 211/86/221 278/87/221 277/88/221 +f 187/86/136 266/87/136 265/88/136 +f 253/88/222 161/85/222 254/87/222 +f 201/86/223 273/87/223 272/88/223 +f 260/88/139 175/85/139 261/87/139 +f 215/86/224 280/87/224 279/88/224 +f 191/86/141 268/87/141 267/88/141 +f 255/88/142 165/85/142 256/87/142 +f 205/86/225 275/87/225 274/88/225 +f 262/88/144 179/85/144 263/87/144 +f 250/88/226 155/85/226 251/87/226 +f 283/88/227 281/85/227 284/87/227 +f 285/88/228 283/85/228 286/87/228 +f 287/88/148 285/85/148 288/87/148 +f 289/88/229 287/85/229 290/87/229 +f 291/88/150 289/85/150 292/87/150 +f 293/88/151 291/85/151 294/87/151 +f 295/88/152 293/85/152 296/87/152 +f 297/88/153 295/85/153 298/87/153 +f 299/88/230 297/85/230 300/87/230 +f 301/88/231 299/85/231 302/87/231 +f 303/88/156 301/85/156 304/87/156 +f 305/88/157 303/85/157 306/87/157 +f 307/88/232 305/85/232 308/87/232 +f 309/88/233 307/85/233 310/87/233 +f 311/88/234 309/85/234 312/87/234 +f 313/88/235 311/85/235 314/87/235 +f 314/86/236 316/87/236 315/88/236 +f 316/86/237 318/87/237 317/88/237 +f 318/86/238 320/87/238 319/88/238 +f 320/86/239 322/87/239 321/88/239 +f 322/86/166 324/87/166 323/88/166 +f 324/86/167 326/87/167 325/88/167 +f 326/86/168 328/87/168 327/88/168 +f 328/86/169 330/87/169 329/88/169 +f 330/86/240 332/87/240 331/88/240 +f 332/86/171 334/87/171 333/88/171 +f 334/86/172 336/87/172 335/88/172 +f 336/86/241 338/87/241 337/88/241 +f 338/86/242 340/87/242 339/88/242 +f 340/86/175 342/87/175 341/88/175 +f 282/93/39 344/90/39 286/94/39 +f 344/90/39 342/91/39 286/94/39 +f 342/91/39 340/89/39 286/94/39 +f 340/89/39 338/95/39 286/94/39 +f 338/95/39 336/96/39 286/94/39 +f 336/96/39 334/109/39 286/94/39 +f 334/109/39 332/112/39 286/94/39 +f 332/112/39 330/113/39 286/94/39 +f 330/113/39 328/114/39 286/94/39 +f 328/114/39 326/117/39 286/94/39 +f 326/117/39 324/101/39 286/94/39 +f 324/101/39 322/100/39 286/94/39 +f 322/100/39 320/98/39 286/94/39 +f 320/98/39 318/99/39 286/94/39 +f 318/99/39 316/97/39 286/94/39 +f 316/97/39 314/119/39 286/94/39 +f 314/119/39 312/120/39 286/94/39 +f 312/120/39 310/103/39 286/94/39 +f 310/103/39 308/104/39 286/94/39 +f 308/104/39 306/102/39 286/94/39 +f 306/102/39 304/105/39 286/94/39 +f 304/105/39 302/118/39 286/94/39 +f 302/118/39 300/116/39 286/94/39 +f 300/116/39 298/115/39 286/94/39 +f 298/115/39 296/111/39 286/94/39 +f 296/111/39 294/110/39 286/94/39 +f 294/110/39 292/108/39 286/94/39 +f 292/108/39 290/106/39 286/94/39 +f 290/106/39 288/107/39 286/94/39 +f 344/86/243 282/87/243 281/88/243 +f 343/88/244 341/85/244 344/87/244 +f 283/93/245 285/90/245 343/94/245 +f 343/94/245 285/90/245 341/107/245 +f 285/90/42 287/91/42 341/107/42 +f 287/91/42 289/89/42 341/107/42 +f 289/89/42 291/95/42 341/107/42 +f 291/95/246 293/96/246 341/107/246 +f 293/96/247 295/109/247 341/107/247 +f 335/110/248 331/115/248 333/111/248 +f 295/109/247 297/112/247 341/107/247 +f 297/112/247 299/113/247 341/107/247 +f 335/110/249 329/116/249 331/115/249 +f 299/113/247 301/114/247 341/107/247 +f 335/110/250 327/118/250 329/116/250 +f 301/114/247 303/117/247 341/107/247 +f 335/110/251 325/105/251 327/118/251 +f 303/117/42 305/101/42 341/107/42 +f 335/110/252 323/102/252 325/105/252 +f 305/101/42 307/100/42 341/107/42 +f 335/110/253 321/104/253 323/102/253 +f 307/100/42 309/98/42 341/107/42 +f 335/110/253 319/103/253 321/104/253 +f 309/98/254 311/99/254 341/107/254 +f 335/110/254 317/120/254 319/103/254 +f 311/99/254 313/97/254 341/107/254 +f 315/119/254 317/120/254 335/110/254 +f 313/97/254 315/119/254 341/107/254 +f 315/119/254 335/110/254 341/107/254 +f 335/110/42 337/108/42 339/106/42 +f 341/107/42 335/110/42 339/106/42 v 1.365790 0.015116 4.001092 v 1.365790 0.015113 0.001092 v 1.560881 0.034331 4.001092 @@ -1392,6 +1512,39 @@ v 1.075812 0.725137 4.157856 v 1.137956 0.674137 4.157856 v 1.208856 0.636240 4.157856 v 1.285786 0.612904 4.157856 +vt 0.000000 0.000000 +vt 0.450363 0.000088 +vt 0.519265 0.025135 +vt 0.412277 0.001462 +vt 0.592585 0.072108 +vt 0.660664 0.134431 +vt 0.714751 0.214466 +vt 0.755741 0.304410 +vt 0.778531 0.401983 +vt 0.781786 0.502742 +vt 0.147188 0.142771 +vt 0.050179 0.306373 +vt 0.093406 0.218681 +vt 0.765337 0.602148 +vt 0.019781 0.402090 +vt 0.729413 0.696327 +vt 0.000089 0.500905 +vt 0.680707 0.782826 +vt 0.000088 0.601389 +vt 0.627360 0.858268 +vt 0.022810 0.698277 +vt 0.566443 0.918999 +vt 0.063602 0.787572 +vt 0.501474 0.962949 +vt 0.119962 0.865210 +vt 0.436606 0.989270 +vt 0.188187 0.927714 +vt 0.377255 0.998855 +vt 0.263175 0.972402 +vt 0.336538 0.999912 +vt 0.208578 0.081678 +vt 0.280064 0.037078 +vt 0.344761 0.010798 vn 0.634394 -0.773010 0.000000 vn 0.773010 -0.634394 0.000000 vn 0.773010 0.634394 -0.000000 @@ -1503,258 +1656,258 @@ vn 0.199428 0.163666 0.966148 vn -0.074889 -0.246879 0.966148 vn 0.074890 -0.246879 0.966148 s off -f 345//50 346//50 348//50 -f 347//51 348//51 350//51 -f 349//52 350//52 352//52 -f 351//255 352//255 354//255 -f 353//256 354//256 356//256 -f 355//55 356//55 358//55 -f 357//56 358//56 360//56 -f 359//57 360//57 362//57 -f 361//58 362//58 364//58 -f 363//59 364//59 366//59 -f 365//60 366//60 368//60 -f 367//257 368//257 370//257 -f 369//258 370//258 372//258 -f 371//63 372//63 374//63 -f 373//64 374//64 376//64 -f 375//65 376//65 378//65 -f 377//66 378//66 379//66 -f 379//67 380//67 381//67 -f 381//68 382//68 383//68 -f 383//69 384//69 385//69 -f 385//70 386//70 387//70 -f 387//71 388//71 389//71 -f 389//259 390//259 391//259 -f 391//260 392//260 393//260 -f 393//74 394//74 395//74 -f 395//75 396//75 397//75 -f 397//261 398//261 399//261 -f 399//77 400//77 401//77 -f 401//262 402//262 403//262 -f 403//79 404//79 405//79 -f 408//263 406//263 440//263 -f 407//81 408//81 345//81 -f 405//82 406//82 407//82 -f 385//264 387//264 461//264 -f 437//47 439//47 438//47 -f 384//265 382//265 428//265 -f 360//266 358//266 415//266 -f 398//267 396//267 435//267 -f 374//268 372//268 422//268 -f 350//269 348//269 410//269 -f 388//270 386//270 430//270 -f 364//271 362//271 417//271 -f 402//272 400//272 437//272 -f 378//273 376//273 424//273 -f 354//274 352//274 412//274 -f 392//275 390//275 432//275 -f 348//276 346//276 409//276 -f 368//277 366//277 419//277 -f 406//278 404//278 439//278 -f 382//279 380//279 427//279 -f 358//280 356//280 414//280 -f 396//281 394//281 434//281 -f 372//282 370//282 421//282 -f 346//283 408//283 409//283 -f 386//284 384//284 429//284 -f 362//285 360//285 416//285 -f 400//286 398//286 436//286 -f 376//287 374//287 423//287 -f 352//288 350//288 411//288 -f 390//289 388//289 431//289 -f 366//290 364//290 418//290 -f 404//291 402//291 438//291 -f 380//292 378//292 426//292 -f 356//293 354//293 413//293 -f 394//294 392//294 433//294 -f 370//295 368//295 420//295 -f 441//49 442//49 472//49 -f 361//296 363//296 450//296 -f 399//297 401//297 468//297 -f 375//298 377//298 457//298 -f 351//299 353//299 445//299 -f 389//300 391//300 463//300 -f 345//301 347//301 442//301 -f 365//302 367//302 452//302 -f 403//303 405//303 470//303 -f 379//304 381//304 458//304 -f 355//305 357//305 447//305 -f 393//306 395//306 465//306 -f 369//307 371//307 454//307 -f 407//308 345//308 472//308 -f 383//309 385//309 460//309 -f 359//310 361//310 449//310 -f 397//311 399//311 467//311 -f 373//312 375//312 456//312 -f 349//313 351//313 444//313 -f 387//314 389//314 462//314 -f 363//315 365//315 451//315 -f 401//316 403//316 469//316 -f 377//317 379//317 457//317 -f 353//318 355//318 446//318 -f 391//319 393//319 464//319 -f 367//320 369//320 453//320 -f 405//321 407//321 471//321 -f 381//322 383//322 459//322 -f 357//323 359//323 448//323 -f 395//324 397//324 466//324 -f 371//325 373//325 455//325 -f 347//326 349//326 443//326 -f 347//178 345//178 348//178 -f 349//51 347//51 350//51 -f 351//52 349//52 352//52 -f 353//255 351//255 354//255 -f 355//256 353//256 356//256 -f 357//179 355//179 358//179 -f 359//56 357//56 360//56 -f 361//57 359//57 362//57 -f 363//58 361//58 364//58 -f 365//59 363//59 366//59 -f 367//60 365//60 368//60 -f 369//257 367//257 370//257 -f 371//181 369//181 372//181 -f 373//182 371//182 374//182 -f 375//183 373//183 376//183 -f 377//65 375//65 378//65 -f 378//184 380//184 379//184 -f 380//67 382//67 381//67 -f 382//68 384//68 383//68 -f 384//69 386//69 385//69 -f 386//70 388//70 387//70 -f 388//71 390//71 389//71 -f 390//259 392//259 391//259 -f 392//260 394//260 393//260 -f 394//74 396//74 395//74 -f 396//75 398//75 397//75 -f 398//261 400//261 399//261 -f 400//77 402//77 401//77 -f 402//262 404//262 403//262 -f 404//79 406//79 405//79 -f 406//263 439//263 440//263 -f 408//81 346//81 345//81 -f 406//82 408//82 407//82 -f 387//327 462//327 461//327 -f 436//47 439//47 437//47 -f 427//47 429//47 428//47 -f 427//47 430//47 429//47 -f 421//47 423//47 422//47 -f 420//47 423//47 421//47 -f 411//47 413//47 412//47 -f 411//47 414//47 413//47 -f 410//47 409//47 411//47 -f 409//47 440//47 411//47 -f 440//47 439//47 411//47 -f 439//47 436//47 411//47 -f 411//47 436//47 414//47 -f 436//328 435//328 414//328 -f 414//328 435//328 415//328 -f 435//47 434//47 415//47 -f 434//47 433//47 415//47 -f 433//47 432//47 415//47 -f 432//47 431//47 415//47 -f 415//47 431//47 416//47 -f 416//47 431//47 417//47 -f 417//47 431//47 418//47 -f 418//47 431//47 419//47 -f 431//328 430//328 419//328 -f 419//328 430//328 420//328 -f 430//47 427//47 420//47 -f 420//47 427//47 423//47 -f 427//47 426//47 423//47 -f 426//47 425//47 424//47 -f 423//47 426//47 424//47 -f 382//265 427//265 428//265 -f 416//329 360//329 415//329 -f 396//267 434//267 435//267 -f 423//268 374//268 422//268 -f 411//269 350//269 410//269 -f 386//330 429//330 430//330 -f 418//331 364//331 417//331 -f 400//332 436//332 437//332 -f 425//273 378//273 424//273 -f 413//274 354//274 412//274 -f 390//275 431//275 432//275 -f 410//276 348//276 409//276 -f 420//333 368//333 419//333 -f 404//334 438//334 439//334 -f 380//335 426//335 427//335 -f 415//336 358//336 414//336 -f 394//337 433//337 434//337 -f 422//338 372//338 421//338 -f 408//283 440//283 409//283 -f 384//284 428//284 429//284 -f 417//339 362//339 416//339 -f 398//340 435//340 436//340 -f 424//341 376//341 423//341 -f 412//342 352//342 411//342 -f 388//343 430//343 431//343 -f 419//290 366//290 418//290 -f 402//291 437//291 438//291 -f 378//292 425//292 426//292 -f 414//344 356//344 413//344 -f 392//345 432//345 433//345 -f 421//346 370//346 420//346 -f 442//49 443//49 472//49 -f 443//49 444//49 472//49 -f 444//49 445//49 472//49 -f 445//49 446//49 472//49 -f 446//347 447//347 472//347 -f 447//348 448//348 472//348 -f 468//349 466//349 467//349 -f 448//348 449//348 472//348 -f 468//350 465//350 466//350 -f 449//348 450//348 472//348 -f 468//351 464//351 465//351 -f 450//348 451//348 472//348 -f 468//352 463//352 464//352 -f 451//348 452//348 472//348 -f 468//353 462//353 463//353 -f 452//348 453//348 472//348 -f 468//354 461//354 462//354 -f 453//49 454//49 472//49 -f 468//354 460//354 461//354 -f 454//355 455//355 472//355 -f 468//354 459//354 460//354 -f 455//355 456//355 472//355 -f 468//355 458//355 459//355 -f 456//355 457//355 472//355 -f 457//355 458//355 472//355 -f 458//355 468//355 472//355 -f 468//49 469//49 472//49 -f 469//49 470//49 471//49 -f 472//49 469//49 471//49 -f 449//356 361//356 450//356 -f 401//297 469//297 468//297 -f 456//298 375//298 457//298 -f 444//299 351//299 445//299 -f 391//300 464//300 463//300 -f 441//301 345//301 442//301 -f 451//302 365//302 452//302 -f 405//303 471//303 470//303 -f 381//357 459//357 458//357 -f 446//358 355//358 447//358 -f 395//359 466//359 465//359 -f 453//307 369//307 454//307 -f 345//308 441//308 472//308 -f 385//309 461//309 460//309 -f 448//310 359//310 449//310 -f 399//360 468//360 467//360 -f 455//312 373//312 456//312 -f 443//313 349//313 444//313 -f 389//314 463//314 462//314 -f 450//315 363//315 451//315 -f 403//316 470//316 469//316 -f 379//317 458//317 457//317 -f 445//318 353//318 446//318 -f 393//361 465//361 464//361 -f 452//362 367//362 453//362 -f 407//363 472//363 471//363 -f 383//322 460//322 459//322 -f 447//323 357//323 448//323 -f 397//324 467//324 466//324 -f 454//325 371//325 455//325 -f 442//364 347//364 443//364 +f 345/121/50 346/121/50 348/121/50 +f 347/121/51 348/121/51 350/121/51 +f 349/121/52 350/121/52 352/121/52 +f 351/121/255 352/121/255 354/121/255 +f 353/121/256 354/121/256 356/121/256 +f 355/121/55 356/121/55 358/121/55 +f 357/121/56 358/121/56 360/121/56 +f 359/121/57 360/121/57 362/121/57 +f 361/121/58 362/121/58 364/121/58 +f 363/121/59 364/121/59 366/121/59 +f 365/121/60 366/121/60 368/121/60 +f 367/121/257 368/121/257 370/121/257 +f 369/121/258 370/121/258 372/121/258 +f 371/121/63 372/121/63 374/121/63 +f 373/121/64 374/121/64 376/121/64 +f 375/121/65 376/121/65 378/121/65 +f 377/121/66 378/121/66 379/121/66 +f 379/121/67 380/121/67 381/121/67 +f 381/121/68 382/121/68 383/121/68 +f 383/121/69 384/121/69 385/121/69 +f 385/121/70 386/121/70 387/121/70 +f 387/121/71 388/121/71 389/121/71 +f 389/121/259 390/121/259 391/121/259 +f 391/121/260 392/121/260 393/121/260 +f 393/121/74 394/121/74 395/121/74 +f 395/121/75 396/121/75 397/121/75 +f 397/121/261 398/121/261 399/121/261 +f 399/121/77 400/121/77 401/121/77 +f 401/121/262 402/121/262 403/121/262 +f 403/121/79 404/121/79 405/121/79 +f 408/121/263 406/121/263 440/121/263 +f 407/121/81 408/121/81 345/121/81 +f 405/121/82 406/121/82 407/121/82 +f 385/121/264 387/121/264 461/121/264 +f 437/121/47 439/121/47 438/121/47 +f 384/121/265 382/121/265 428/121/265 +f 360/121/266 358/121/266 415/121/266 +f 398/121/267 396/121/267 435/121/267 +f 374/121/268 372/121/268 422/121/268 +f 350/121/269 348/121/269 410/121/269 +f 388/121/270 386/121/270 430/121/270 +f 364/121/271 362/121/271 417/121/271 +f 402/121/272 400/121/272 437/121/272 +f 378/121/273 376/121/273 424/121/273 +f 354/121/274 352/121/274 412/121/274 +f 392/121/275 390/121/275 432/121/275 +f 348/121/276 346/121/276 409/121/276 +f 368/121/277 366/121/277 419/121/277 +f 406/121/278 404/121/278 439/121/278 +f 382/121/279 380/121/279 427/121/279 +f 358/121/280 356/121/280 414/121/280 +f 396/121/281 394/121/281 434/121/281 +f 372/121/282 370/121/282 421/121/282 +f 346/121/283 408/121/283 409/121/283 +f 386/121/284 384/121/284 429/121/284 +f 362/121/285 360/121/285 416/121/285 +f 400/121/286 398/121/286 436/121/286 +f 376/121/287 374/121/287 423/121/287 +f 352/121/288 350/121/288 411/121/288 +f 390/121/289 388/121/289 431/121/289 +f 366/121/290 364/121/290 418/121/290 +f 404/121/291 402/121/291 438/121/291 +f 380/121/292 378/121/292 426/121/292 +f 356/121/293 354/121/293 413/121/293 +f 394/121/294 392/121/294 433/121/294 +f 370/121/295 368/121/295 420/121/295 +f 441/122/49 442/123/49 472/124/49 +f 361/121/296 363/121/296 450/121/296 +f 399/121/297 401/121/297 468/121/297 +f 375/121/298 377/121/298 457/121/298 +f 351/121/299 353/121/299 445/121/299 +f 389/121/300 391/121/300 463/121/300 +f 345/121/301 347/121/301 442/121/301 +f 365/121/302 367/121/302 452/121/302 +f 403/121/303 405/121/303 470/121/303 +f 379/121/304 381/121/304 458/121/304 +f 355/121/305 357/121/305 447/121/305 +f 393/121/306 395/121/306 465/121/306 +f 369/121/307 371/121/307 454/121/307 +f 407/121/308 345/121/308 472/121/308 +f 383/121/309 385/121/309 460/121/309 +f 359/121/310 361/121/310 449/121/310 +f 397/121/311 399/121/311 467/121/311 +f 373/121/312 375/121/312 456/121/312 +f 349/121/313 351/121/313 444/121/313 +f 387/121/314 389/121/314 462/121/314 +f 363/121/315 365/121/315 451/121/315 +f 401/121/316 403/121/316 469/121/316 +f 377/121/317 379/121/317 457/121/317 +f 353/121/318 355/121/318 446/121/318 +f 391/121/319 393/121/319 464/121/319 +f 367/121/320 369/121/320 453/121/320 +f 405/121/321 407/121/321 471/121/321 +f 381/121/322 383/121/322 459/121/322 +f 357/121/323 359/121/323 448/121/323 +f 395/121/324 397/121/324 466/121/324 +f 371/121/325 373/121/325 455/121/325 +f 347/121/326 349/121/326 443/121/326 +f 347/121/178 345/121/178 348/121/178 +f 349/121/51 347/121/51 350/121/51 +f 351/121/52 349/121/52 352/121/52 +f 353/121/255 351/121/255 354/121/255 +f 355/121/256 353/121/256 356/121/256 +f 357/121/179 355/121/179 358/121/179 +f 359/121/56 357/121/56 360/121/56 +f 361/121/57 359/121/57 362/121/57 +f 363/121/58 361/121/58 364/121/58 +f 365/121/59 363/121/59 366/121/59 +f 367/121/60 365/121/60 368/121/60 +f 369/121/257 367/121/257 370/121/257 +f 371/121/181 369/121/181 372/121/181 +f 373/121/182 371/121/182 374/121/182 +f 375/121/183 373/121/183 376/121/183 +f 377/121/65 375/121/65 378/121/65 +f 378/121/184 380/121/184 379/121/184 +f 380/121/67 382/121/67 381/121/67 +f 382/121/68 384/121/68 383/121/68 +f 384/121/69 386/121/69 385/121/69 +f 386/121/70 388/121/70 387/121/70 +f 388/121/71 390/121/71 389/121/71 +f 390/121/259 392/121/259 391/121/259 +f 392/121/260 394/121/260 393/121/260 +f 394/121/74 396/121/74 395/121/74 +f 396/121/75 398/121/75 397/121/75 +f 398/121/261 400/121/261 399/121/261 +f 400/121/77 402/121/77 401/121/77 +f 402/121/262 404/121/262 403/121/262 +f 404/121/79 406/121/79 405/121/79 +f 406/121/263 439/121/263 440/121/263 +f 408/121/81 346/121/81 345/121/81 +f 406/121/82 408/121/82 407/121/82 +f 387/121/327 462/121/327 461/121/327 +f 436/121/47 439/121/47 437/121/47 +f 427/121/47 429/121/47 428/121/47 +f 427/121/47 430/121/47 429/121/47 +f 421/121/47 423/121/47 422/121/47 +f 420/121/47 423/121/47 421/121/47 +f 411/121/47 413/121/47 412/121/47 +f 411/121/47 414/121/47 413/121/47 +f 410/121/47 409/121/47 411/121/47 +f 409/121/47 440/121/47 411/121/47 +f 440/121/47 439/121/47 411/121/47 +f 439/121/47 436/121/47 411/121/47 +f 411/121/47 436/121/47 414/121/47 +f 436/121/328 435/121/328 414/121/328 +f 414/121/328 435/121/328 415/121/328 +f 435/121/47 434/121/47 415/121/47 +f 434/121/47 433/121/47 415/121/47 +f 433/121/47 432/121/47 415/121/47 +f 432/121/47 431/121/47 415/121/47 +f 415/121/47 431/121/47 416/121/47 +f 416/121/47 431/121/47 417/121/47 +f 417/121/47 431/121/47 418/121/47 +f 418/121/47 431/121/47 419/121/47 +f 431/121/328 430/121/328 419/121/328 +f 419/121/328 430/121/328 420/121/328 +f 430/121/47 427/121/47 420/121/47 +f 420/121/47 427/121/47 423/121/47 +f 427/121/47 426/121/47 423/121/47 +f 426/121/47 425/121/47 424/121/47 +f 423/121/47 426/121/47 424/121/47 +f 382/121/265 427/121/265 428/121/265 +f 416/121/329 360/121/329 415/121/329 +f 396/121/267 434/121/267 435/121/267 +f 423/121/268 374/121/268 422/121/268 +f 411/121/269 350/121/269 410/121/269 +f 386/121/330 429/121/330 430/121/330 +f 418/121/331 364/121/331 417/121/331 +f 400/121/332 436/121/332 437/121/332 +f 425/121/273 378/121/273 424/121/273 +f 413/121/274 354/121/274 412/121/274 +f 390/121/275 431/121/275 432/121/275 +f 410/121/276 348/121/276 409/121/276 +f 420/121/333 368/121/333 419/121/333 +f 404/121/334 438/121/334 439/121/334 +f 380/121/335 426/121/335 427/121/335 +f 415/121/336 358/121/336 414/121/336 +f 394/121/337 433/121/337 434/121/337 +f 422/121/338 372/121/338 421/121/338 +f 408/121/283 440/121/283 409/121/283 +f 384/121/284 428/121/284 429/121/284 +f 417/121/339 362/121/339 416/121/339 +f 398/121/340 435/121/340 436/121/340 +f 424/121/341 376/121/341 423/121/341 +f 412/121/342 352/121/342 411/121/342 +f 388/121/343 430/121/343 431/121/343 +f 419/121/290 366/121/290 418/121/290 +f 402/121/291 437/121/291 438/121/291 +f 378/121/292 425/121/292 426/121/292 +f 414/121/344 356/121/344 413/121/344 +f 392/121/345 432/121/345 433/121/345 +f 421/121/346 370/121/346 420/121/346 +f 442/123/49 443/125/49 472/124/49 +f 443/125/49 444/126/49 472/124/49 +f 444/126/49 445/127/49 472/124/49 +f 445/127/49 446/128/49 472/124/49 +f 446/128/347 447/129/347 472/124/347 +f 447/129/348 448/130/348 472/124/348 +f 468/131/349 466/132/349 467/133/349 +f 448/130/348 449/134/348 472/124/348 +f 468/131/350 465/135/350 466/132/350 +f 449/134/348 450/136/348 472/124/348 +f 468/131/351 464/137/351 465/135/351 +f 450/136/348 451/138/348 472/124/348 +f 468/131/352 463/139/352 464/137/352 +f 451/138/348 452/140/348 472/124/348 +f 468/131/353 462/141/353 463/139/353 +f 452/140/348 453/142/348 472/124/348 +f 468/131/354 461/143/354 462/141/354 +f 453/142/49 454/144/49 472/124/49 +f 468/131/354 460/145/354 461/143/354 +f 454/144/355 455/146/355 472/124/355 +f 468/131/354 459/147/354 460/145/354 +f 455/146/355 456/148/355 472/124/355 +f 468/131/355 458/149/355 459/147/355 +f 456/148/355 457/150/355 472/124/355 +f 457/150/355 458/149/355 472/124/355 +f 458/149/355 468/131/355 472/124/355 +f 468/131/49 469/151/49 472/124/49 +f 469/151/49 470/152/49 471/153/49 +f 472/124/49 469/151/49 471/153/49 +f 449/121/356 361/121/356 450/121/356 +f 401/121/297 469/121/297 468/121/297 +f 456/121/298 375/121/298 457/121/298 +f 444/121/299 351/121/299 445/121/299 +f 391/121/300 464/121/300 463/121/300 +f 441/121/301 345/121/301 442/121/301 +f 451/121/302 365/121/302 452/121/302 +f 405/121/303 471/121/303 470/121/303 +f 381/121/357 459/121/357 458/121/357 +f 446/121/358 355/121/358 447/121/358 +f 395/121/359 466/121/359 465/121/359 +f 453/121/307 369/121/307 454/121/307 +f 345/121/308 441/121/308 472/121/308 +f 385/121/309 461/121/309 460/121/309 +f 448/121/310 359/121/310 449/121/310 +f 399/121/360 468/121/360 467/121/360 +f 455/121/312 373/121/312 456/121/312 +f 443/121/313 349/121/313 444/121/313 +f 389/121/314 463/121/314 462/121/314 +f 450/121/315 363/121/315 451/121/315 +f 403/121/316 470/121/316 469/121/316 +f 379/121/317 458/121/317 457/121/317 +f 445/121/318 353/121/318 446/121/318 +f 393/121/361 465/121/361 464/121/361 +f 452/121/362 367/121/362 453/121/362 +f 407/121/363 472/121/363 471/121/363 +f 383/121/322 460/121/322 459/121/322 +f 447/121/323 357/121/323 448/121/323 +f 397/121/324 467/121/324 466/121/324 +f 454/121/325 371/121/325 455/121/325 +f 442/121/364 347/121/364 443/121/364 v 0.000000 0.010026 -4.301087 v 0.000000 4.010026 -4.301087 v 0.195090 0.010026 -4.281873 @@ -1851,6 +2004,42 @@ v -0.225381 4.270857 -3.526469 v -0.177080 4.270857 -3.566108 v -0.121975 4.270857 -3.595562 v -0.062182 4.270857 -3.613700 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.597545 0.990393 +vt 0.402456 0.990393 +vt 0.691342 0.961940 +vt 0.777785 0.915735 +vt 0.853553 0.853553 +vt 0.915735 0.777785 +vt 0.961940 0.691342 +vt 0.990393 0.597545 +vt 1.000000 0.500000 +vt 0.990393 0.402455 +vt 0.961940 0.308658 +vt 0.915735 0.222215 +vt 0.853553 0.146447 +vt 0.777785 0.084265 +vt 0.691342 0.038060 +vt 0.597545 0.009607 +vt 0.500000 0.000000 +vt 0.402455 0.009607 +vt 0.308658 0.038060 +vt 0.222215 0.084265 +vt 0.146446 0.146447 +vt 0.084265 0.222215 +vt 0.038060 0.308659 +vt 0.009607 0.402455 +vt 0.000000 0.500000 +vt 0.009607 0.597546 +vt 0.038060 0.691342 +vt 0.084266 0.777786 +vt 0.146447 0.853554 +vt 0.222215 0.915735 +vt 0.308659 0.961940 vn 0.098017 0.000000 -0.995185 vn 0.290285 0.000000 -0.956940 vn 0.471396 0.000000 -0.881922 @@ -1925,194 +2114,194 @@ vn -0.169261 0.933314 0.316663 vn 0.035195 0.933314 -0.357332 vn -0.169259 0.933314 -0.316664 s off -f 473//365 474//365 476//365 -f 475//366 476//366 478//366 -f 477//367 478//367 480//367 -f 479//368 480//368 482//368 -f 481//369 482//369 484//369 -f 483//370 484//370 486//370 -f 485//371 486//371 488//371 -f 487//372 488//372 490//372 -f 489//373 490//373 492//373 -f 491//155 492//155 494//155 -f 493//374 494//374 496//374 -f 495//375 496//375 498//375 -f 497//376 498//376 500//376 -f 499//377 500//377 502//377 -f 501//378 502//378 504//378 -f 503//379 504//379 506//379 -f 505//380 506//380 507//380 -f 507//381 508//381 509//381 -f 509//382 510//382 511//382 -f 511//383 512//383 513//383 -f 513//384 514//384 515//384 -f 515//385 516//385 517//385 -f 517//386 518//386 519//386 -f 519//387 520//387 521//387 -f 521//388 522//388 523//388 -f 523//389 524//389 525//389 -f 525//390 526//390 527//390 -f 527//391 528//391 529//391 -f 529//392 530//392 531//392 -f 531//393 532//393 533//393 -f 524//394 522//394 562//394 -f 535//395 536//395 473//395 -f 533//396 534//396 535//396 -f 473//42 475//42 535//42 -f 538//39 537//39 539//39 -f 500//397 498//397 549//397 -f 474//398 536//398 537//398 -f 514//399 512//399 557//399 -f 490//400 488//400 544//400 -f 528//401 526//401 564//401 -f 504//402 502//402 551//402 -f 480//403 478//403 539//403 -f 518//404 516//404 559//404 -f 494//405 492//405 546//405 -f 532//406 530//406 566//406 -f 508//407 506//407 554//407 -f 484//408 482//408 541//408 -f 522//409 520//409 561//409 -f 498//410 496//410 548//410 -f 536//411 534//411 568//411 -f 512//412 510//412 556//412 -f 488//413 486//413 543//413 -f 526//414 524//414 563//414 -f 502//415 500//415 550//415 -f 478//416 476//416 538//416 -f 516//417 514//417 558//417 -f 492//418 490//418 545//418 -f 530//419 528//419 565//419 -f 506//420 504//420 552//420 -f 482//421 480//421 540//421 -f 520//422 518//422 560//422 -f 476//423 474//423 537//423 -f 496//424 494//424 547//424 -f 534//425 532//425 567//425 -f 510//426 508//426 555//426 -f 486//427 484//427 542//427 -f 475//365 473//365 476//365 -f 477//366 475//366 478//366 -f 479//367 477//367 480//367 -f 481//368 479//368 482//368 -f 483//369 481//369 484//369 -f 485//370 483//370 486//370 -f 487//371 485//371 488//371 -f 489//372 487//372 490//372 -f 491//373 489//373 492//373 -f 493//155 491//155 494//155 -f 495//374 493//374 496//374 -f 497//375 495//375 498//375 -f 499//376 497//376 500//376 -f 501//377 499//377 502//377 -f 503//378 501//378 504//378 -f 505//379 503//379 506//379 -f 506//380 508//380 507//380 -f 508//381 510//381 509//381 -f 510//382 512//382 511//382 -f 512//383 514//383 513//383 -f 514//384 516//384 515//384 -f 516//385 518//385 517//385 -f 518//386 520//386 519//386 -f 520//387 522//387 521//387 -f 522//388 524//388 523//388 -f 524//389 526//389 525//389 -f 526//390 528//390 527//390 -f 528//391 530//391 529//391 -f 530//392 532//392 531//392 -f 532//393 534//393 533//393 -f 522//428 561//428 562//428 -f 536//395 474//395 473//395 -f 534//396 536//396 535//396 -f 475//42 477//42 535//42 -f 477//42 479//42 535//42 -f 479//42 481//42 535//42 -f 481//42 483//42 535//42 -f 483//42 485//42 535//42 -f 485//42 487//42 535//42 -f 487//42 489//42 535//42 -f 489//42 491//42 535//42 -f 491//42 493//42 535//42 -f 493//42 495//42 535//42 -f 495//42 497//42 535//42 -f 497//42 499//42 535//42 -f 499//42 501//42 535//42 -f 501//42 503//42 535//42 -f 503//42 505//42 535//42 -f 505//42 507//42 535//42 -f 507//42 509//42 535//42 -f 509//42 511//42 535//42 -f 511//42 513//42 535//42 -f 513//42 515//42 535//42 -f 515//42 517//42 535//42 -f 517//42 519//42 535//42 -f 519//42 521//42 535//42 -f 521//42 523//42 535//42 -f 523//42 525//42 535//42 -f 525//42 527//42 535//42 -f 527//42 529//42 535//42 -f 529//42 531//42 533//42 -f 535//42 529//42 533//42 -f 537//39 568//39 539//39 -f 568//39 567//39 539//39 -f 567//39 566//39 539//39 -f 566//39 565//39 539//39 -f 565//39 564//39 539//39 -f 564//39 563//39 539//39 -f 563//39 562//39 539//39 -f 562//39 561//39 539//39 -f 561//39 560//39 539//39 -f 560//39 559//39 539//39 -f 559//39 558//39 539//39 -f 558//39 557//39 539//39 -f 557//39 556//39 539//39 -f 556//39 555//39 539//39 -f 555//39 554//39 539//39 -f 554//39 553//39 539//39 -f 553//39 552//39 539//39 -f 552//39 551//39 539//39 -f 551//39 550//39 539//39 -f 550//39 549//39 539//39 -f 549//39 548//39 539//39 -f 548//39 547//39 539//39 -f 547//39 546//39 539//39 -f 546//39 545//39 539//39 -f 545//39 544//39 539//39 -f 544//39 543//39 539//39 -f 543//39 542//39 539//39 -f 542//39 541//39 539//39 -f 541//39 540//39 539//39 -f 550//397 500//397 549//397 -f 536//429 568//429 537//429 -f 512//399 556//399 557//399 -f 545//400 490//400 544//400 -f 526//430 563//430 564//430 -f 552//402 504//402 551//402 -f 540//431 480//431 539//431 -f 516//404 558//404 559//404 -f 547//405 494//405 546//405 -f 530//432 565//432 566//432 -f 506//407 553//407 554//407 -f 542//408 484//408 541//408 -f 520//433 560//433 561//433 -f 549//410 498//410 548//410 -f 534//434 567//434 568//434 -f 510//435 555//435 556//435 -f 544//413 488//413 543//413 -f 524//414 562//414 563//414 -f 551//415 502//415 550//415 -f 539//416 478//416 538//416 -f 514//417 557//417 558//417 -f 546//418 492//418 545//418 -f 528//419 564//419 565//419 -f 553//420 506//420 552//420 -f 541//421 482//421 540//421 -f 518//422 559//422 560//422 -f 538//436 476//436 537//436 -f 548//424 496//424 547//424 -f 532//437 566//437 567//437 -f 508//426 554//426 555//426 -f 543//427 486//427 542//427 +f 473/154/365 474/155/365 476/156/365 +f 475/154/366 476/155/366 478/156/366 +f 477/154/367 478/155/367 480/156/367 +f 479/154/368 480/155/368 482/156/368 +f 481/154/369 482/155/369 484/156/369 +f 483/154/370 484/155/370 486/156/370 +f 485/154/371 486/155/371 488/156/371 +f 487/154/372 488/155/372 490/156/372 +f 489/154/373 490/155/373 492/156/373 +f 491/154/155 492/155/155 494/156/155 +f 493/154/374 494/155/374 496/156/374 +f 495/154/375 496/155/375 498/156/375 +f 497/154/376 498/155/376 500/156/376 +f 499/154/377 500/155/377 502/156/377 +f 501/154/378 502/155/378 504/156/378 +f 503/154/379 504/155/379 506/156/379 +f 505/154/380 506/155/380 507/157/380 +f 507/154/381 508/155/381 509/157/381 +f 509/154/382 510/155/382 511/157/382 +f 511/154/383 512/155/383 513/157/383 +f 513/154/384 514/155/384 515/157/384 +f 515/154/385 516/155/385 517/157/385 +f 517/154/386 518/155/386 519/157/386 +f 519/154/387 520/155/387 521/157/387 +f 521/154/388 522/155/388 523/157/388 +f 523/154/389 524/155/389 525/157/389 +f 525/154/390 526/155/390 527/157/390 +f 527/154/391 528/155/391 529/157/391 +f 529/154/392 530/155/392 531/157/392 +f 531/154/393 532/155/393 533/157/393 +f 524/154/394 522/155/394 562/157/394 +f 535/154/395 536/155/395 473/157/395 +f 533/154/396 534/155/396 535/157/396 +f 473/158/42 475/159/42 535/160/42 +f 538/158/39 537/159/39 539/160/39 +f 500/154/397 498/155/397 549/156/397 +f 474/154/398 536/155/398 537/157/398 +f 514/154/399 512/155/399 557/157/399 +f 490/154/400 488/155/400 544/156/400 +f 528/154/401 526/155/401 564/157/401 +f 504/154/402 502/155/402 551/156/402 +f 480/154/403 478/155/403 539/156/403 +f 518/154/404 516/155/404 559/157/404 +f 494/154/405 492/155/405 546/156/405 +f 532/154/406 530/155/406 566/157/406 +f 508/154/407 506/155/407 554/157/407 +f 484/154/408 482/155/408 541/156/408 +f 522/154/409 520/155/409 561/157/409 +f 498/154/410 496/155/410 548/156/410 +f 536/154/411 534/155/411 568/157/411 +f 512/154/412 510/155/412 556/157/412 +f 488/154/413 486/155/413 543/156/413 +f 526/154/414 524/155/414 563/157/414 +f 502/154/415 500/155/415 550/156/415 +f 478/154/416 476/155/416 538/156/416 +f 516/154/417 514/155/417 558/157/417 +f 492/154/418 490/155/418 545/156/418 +f 530/154/419 528/155/419 565/157/419 +f 506/154/420 504/155/420 552/156/420 +f 482/154/421 480/155/421 540/156/421 +f 520/154/422 518/155/422 560/157/422 +f 476/154/423 474/155/423 537/156/423 +f 496/154/424 494/155/424 547/156/424 +f 534/154/425 532/155/425 567/157/425 +f 510/154/426 508/155/426 555/157/426 +f 486/154/427 484/155/427 542/156/427 +f 475/157/365 473/154/365 476/156/365 +f 477/157/366 475/154/366 478/156/366 +f 479/157/367 477/154/367 480/156/367 +f 481/157/368 479/154/368 482/156/368 +f 483/157/369 481/154/369 484/156/369 +f 485/157/370 483/154/370 486/156/370 +f 487/157/371 485/154/371 488/156/371 +f 489/157/372 487/154/372 490/156/372 +f 491/157/373 489/154/373 492/156/373 +f 493/157/155 491/154/155 494/156/155 +f 495/157/374 493/154/374 496/156/374 +f 497/157/375 495/154/375 498/156/375 +f 499/157/376 497/154/376 500/156/376 +f 501/157/377 499/154/377 502/156/377 +f 503/157/378 501/154/378 504/156/378 +f 505/157/379 503/154/379 506/156/379 +f 506/155/380 508/156/380 507/157/380 +f 508/155/381 510/156/381 509/157/381 +f 510/155/382 512/156/382 511/157/382 +f 512/155/383 514/156/383 513/157/383 +f 514/155/384 516/156/384 515/157/384 +f 516/155/385 518/156/385 517/157/385 +f 518/155/386 520/156/386 519/157/386 +f 520/155/387 522/156/387 521/157/387 +f 522/155/388 524/156/388 523/157/388 +f 524/155/389 526/156/389 525/157/389 +f 526/155/390 528/156/390 527/157/390 +f 528/155/391 530/156/391 529/157/391 +f 530/155/392 532/156/392 531/157/392 +f 532/155/393 534/156/393 533/157/393 +f 522/155/428 561/156/428 562/157/428 +f 536/155/395 474/156/395 473/157/395 +f 534/155/396 536/156/396 535/157/396 +f 475/159/42 477/161/42 535/160/42 +f 477/161/42 479/162/42 535/160/42 +f 479/162/42 481/163/42 535/160/42 +f 481/163/42 483/164/42 535/160/42 +f 483/164/42 485/165/42 535/160/42 +f 485/165/42 487/166/42 535/160/42 +f 487/166/42 489/167/42 535/160/42 +f 489/167/42 491/168/42 535/160/42 +f 491/168/42 493/169/42 535/160/42 +f 493/169/42 495/170/42 535/160/42 +f 495/170/42 497/171/42 535/160/42 +f 497/171/42 499/172/42 535/160/42 +f 499/172/42 501/173/42 535/160/42 +f 501/173/42 503/174/42 535/160/42 +f 503/174/42 505/175/42 535/160/42 +f 505/175/42 507/176/42 535/160/42 +f 507/176/42 509/177/42 535/160/42 +f 509/177/42 511/178/42 535/160/42 +f 511/178/42 513/179/42 535/160/42 +f 513/179/42 515/180/42 535/160/42 +f 515/180/42 517/181/42 535/160/42 +f 517/181/42 519/182/42 535/160/42 +f 519/182/42 521/183/42 535/160/42 +f 521/183/42 523/184/42 535/160/42 +f 523/184/42 525/185/42 535/160/42 +f 525/185/42 527/186/42 535/160/42 +f 527/186/42 529/187/42 535/160/42 +f 529/187/42 531/188/42 533/189/42 +f 535/160/42 529/187/42 533/189/42 +f 537/159/39 568/161/39 539/160/39 +f 568/161/39 567/162/39 539/160/39 +f 567/162/39 566/163/39 539/160/39 +f 566/163/39 565/164/39 539/160/39 +f 565/164/39 564/165/39 539/160/39 +f 564/165/39 563/166/39 539/160/39 +f 563/166/39 562/167/39 539/160/39 +f 562/167/39 561/168/39 539/160/39 +f 561/168/39 560/169/39 539/160/39 +f 560/169/39 559/170/39 539/160/39 +f 559/170/39 558/171/39 539/160/39 +f 558/171/39 557/172/39 539/160/39 +f 557/172/39 556/173/39 539/160/39 +f 556/173/39 555/174/39 539/160/39 +f 555/174/39 554/175/39 539/160/39 +f 554/175/39 553/176/39 539/160/39 +f 553/176/39 552/177/39 539/160/39 +f 552/177/39 551/178/39 539/160/39 +f 551/178/39 550/179/39 539/160/39 +f 550/179/39 549/180/39 539/160/39 +f 549/180/39 548/181/39 539/160/39 +f 548/181/39 547/182/39 539/160/39 +f 547/182/39 546/183/39 539/160/39 +f 546/183/39 545/184/39 539/160/39 +f 545/184/39 544/185/39 539/160/39 +f 544/185/39 543/186/39 539/160/39 +f 543/186/39 542/187/39 539/160/39 +f 542/187/39 541/188/39 539/160/39 +f 541/188/39 540/189/39 539/160/39 +f 550/157/397 500/154/397 549/156/397 +f 536/155/429 568/156/429 537/157/429 +f 512/155/399 556/156/399 557/157/399 +f 545/157/400 490/154/400 544/156/400 +f 526/155/430 563/156/430 564/157/430 +f 552/157/402 504/154/402 551/156/402 +f 540/157/431 480/154/431 539/156/431 +f 516/155/404 558/156/404 559/157/404 +f 547/157/405 494/154/405 546/156/405 +f 530/155/432 565/156/432 566/157/432 +f 506/155/407 553/156/407 554/157/407 +f 542/157/408 484/154/408 541/156/408 +f 520/155/433 560/156/433 561/157/433 +f 549/157/410 498/154/410 548/156/410 +f 534/155/434 567/156/434 568/157/434 +f 510/155/435 555/156/435 556/157/435 +f 544/157/413 488/154/413 543/156/413 +f 524/155/414 562/156/414 563/157/414 +f 551/157/415 502/154/415 550/156/415 +f 539/157/416 478/154/416 538/156/416 +f 514/155/417 557/156/417 558/157/417 +f 546/157/418 492/154/418 545/156/418 +f 528/155/419 564/156/419 565/157/419 +f 553/157/420 506/154/420 552/156/420 +f 541/157/421 482/154/421 540/156/421 +f 518/155/422 559/156/422 560/157/422 +f 538/157/436 476/154/436 537/156/436 +f 548/157/424 496/154/424 547/156/424 +f 532/155/437 566/156/437 567/157/437 +f 508/155/426 554/156/426 555/157/426 +f 543/157/427 486/154/427 542/156/427 v 0.609274 0.018251 -1.901238 v 0.609274 0.018251 -0.682690 v -0.609274 0.018251 -0.682690 @@ -2121,17 +2310,21 @@ v 0.609274 1.236799 -1.901237 v 0.609273 1.236799 -0.682690 v -0.609274 1.236799 -0.682690 v -0.609274 1.236799 -1.901238 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 vn 1.000000 -0.000000 0.000001 s off -f 569//42 570//42 571//42 -f 573//39 576//39 575//39 -f 569//438 573//438 574//438 -f 570//49 574//49 571//49 -f 571//46 575//46 572//46 -f 573//47 569//47 572//47 -f 572//42 569//42 571//42 -f 574//39 573//39 575//39 -f 570//48 569//48 574//48 -f 574//49 575//49 571//49 -f 575//46 576//46 572//46 -f 576//47 573//47 572//47 +f 569/190/42 570/191/42 571/192/42 +f 573/190/39 576/191/39 575/192/39 +f 569/190/438 573/191/438 574/192/438 +f 570/190/49 574/191/49 571/193/49 +f 571/190/46 575/191/46 572/193/46 +f 573/190/47 569/191/47 572/192/47 +f 572/193/42 569/190/42 571/192/42 +f 574/193/39 573/190/39 575/192/39 +f 570/193/48 569/190/48 574/192/48 +f 574/191/49 575/192/49 571/193/49 +f 575/191/46 576/192/46 572/193/46 +f 576/193/47 573/190/47 572/192/47 diff --git a/tools/blender/oilrefinery.blend b/tools/blender/oilrefinery.blend index aba692a5..ab50b8d7 100644 Binary files a/tools/blender/oilrefinery.blend and b/tools/blender/oilrefinery.blend differ diff --git a/tools/blender/oilrig.blend b/tools/blender/oilrig.blend index 5717ab3f..d7a3b5fa 100644 Binary files a/tools/blender/oilrig.blend and b/tools/blender/oilrig.blend differ -- cgit v1.2.3 From d5fe794178f755a259e7680bbf11571785abe14d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 28 Apr 2014 09:31:10 +0300 Subject: Fix texture cleanup. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make deleteTexture also zero the pointer and do the check if deletion is needed, as those are required anyway on the caller side in most cases. Change-Id: Ia12102c97a647127230db2518c32f81322ce6743 Reviewed-by: Tomi Korpipää --- src/datavisualization/data/customdataitem.cpp | 7 +++---- src/datavisualization/engine/abstract3drenderer.cpp | 11 ++--------- src/datavisualization/engine/bars3drenderer.cpp | 10 ++-------- src/datavisualization/engine/scatter3drenderer.cpp | 10 ++-------- src/datavisualization/engine/surface3drenderer.cpp | 15 +++------------ src/datavisualization/utils/texturehelper.cpp | 7 +++++-- src/datavisualization/utils/texturehelper_p.h | 2 +- 7 files changed, 18 insertions(+), 44 deletions(-) diff --git a/src/datavisualization/data/customdataitem.cpp b/src/datavisualization/data/customdataitem.cpp index 8d3a033d..d5964c62 100644 --- a/src/datavisualization/data/customdataitem.cpp +++ b/src/datavisualization/data/customdataitem.cpp @@ -31,15 +31,14 @@ CustomDataItem::CustomDataItem() : CustomDataItem::~CustomDataItem() { - if (m_texture) - m_textureHelper->deleteTexture(&m_texture); + m_textureHelper->deleteTexture(&m_texture); delete m_textureHelper; } void CustomDataItem::setTextureImage(const QImage &textureImage) { - if (m_texture) - m_textureHelper->deleteTexture(&m_texture); + m_textureHelper->deleteTexture(&m_texture); + // Make a texture out of the image if (!textureImage.isNull()) m_texture = m_textureHelper->create2DTexture(textureImage, true, true, true); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 458630ed..bd19959b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -475,11 +475,7 @@ void Abstract3DRenderer::lowerShadowQuality() void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *texture) { - if (*texture) { - m_textureHelper->deleteTexture(texture); - *texture = 0; - } - + m_textureHelper->deleteTexture(texture); *texture = m_textureHelper->createUniformTexture(color); } @@ -489,10 +485,7 @@ void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); gradient->setFinalStop(0.0, 0.0); - if (*gradientTexture) { - m_textureHelper->deleteTexture(gradientTexture); - *gradientTexture = 0; - } + m_textureHelper->deleteTexture(gradientTexture); *gradientTexture = m_textureHelper->createGradientTexture(*gradient); } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index e41d35b0..01fcebb2 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2267,10 +2267,7 @@ void Bars3DRenderer::initSelectionShader() void Bars3DRenderer::initSelectionBuffer() { - if (m_selectionTexture) { - m_textureHelper->deleteTexture(&m_selectionTexture); - m_selectionTexture = 0; - } + m_textureHelper->deleteTexture(&m_selectionTexture); if (m_cachedIsSlicingActivated || m_primarySubViewport.size().isEmpty()) return; @@ -2292,10 +2289,7 @@ void Bars3DRenderer::initDepthShader() void Bars3DRenderer::updateDepthBuffer() { - if (m_depthTexture) { - m_textureHelper->deleteTexture(&m_depthTexture); - m_depthTexture = 0; - } + m_textureHelper->deleteTexture(&m_depthTexture); if (m_primarySubViewport.size().isEmpty()) return; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3bd06517..5d37e6e1 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1690,10 +1690,7 @@ void Scatter3DRenderer::initSelectionShader() void Scatter3DRenderer::initSelectionBuffer() { - if (m_selectionTexture) { - m_textureHelper->deleteTexture(&m_selectionTexture); - m_selectionTexture = 0; - } + m_textureHelper->deleteTexture(&m_selectionTexture); if (m_primarySubViewport.size().isEmpty()) return; @@ -1715,10 +1712,7 @@ void Scatter3DRenderer::initDepthShader() void Scatter3DRenderer::updateDepthBuffer() { - if (m_depthTexture) { - m_textureHelper->deleteTexture(&m_depthTexture); - m_depthTexture = 0; - } + m_textureHelper->deleteTexture(&m_depthTexture); if (m_primarySubViewport.size().isEmpty()) return; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f79f92f6..f04277f7 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2041,10 +2041,7 @@ void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache, void Surface3DRenderer::initSelectionBuffer() { // Create the result selection texture and buffers - if (m_selectionResultTexture) { - m_textureHelper->deleteTexture(&m_selectionResultTexture); - m_selectionResultTexture = 0; - } + m_textureHelper->deleteTexture(&m_selectionResultTexture); m_selectionResultTexture = m_textureHelper->createSelectionTexture(m_primarySubViewport.size(), m_selectionFrameBuffer, @@ -2480,14 +2477,8 @@ void Surface3DRenderer::initDepthShader() void Surface3DRenderer::updateDepthBuffer() { - if (m_depthTexture) { - m_textureHelper->deleteTexture(&m_depthTexture); - m_depthTexture = 0; - } - if (m_depthModelTexture) { - m_textureHelper->deleteTexture(&m_depthModelTexture); - m_depthModelTexture = 0; - } + m_textureHelper->deleteTexture(&m_depthTexture); + m_textureHelper->deleteTexture(&m_depthModelTexture); if (m_primarySubViewport.size().isEmpty()) return; diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp index 07130d7e..185d99e4 100644 --- a/src/datavisualization/utils/texturehelper.cpp +++ b/src/datavisualization/utils/texturehelper.cpp @@ -241,9 +241,12 @@ void TextureHelper::fillDepthTexture(GLuint texture,const QSize &size, GLuint te } #endif -void TextureHelper::deleteTexture(const GLuint *texture) +void TextureHelper::deleteTexture(GLuint *texture) { - glDeleteTextures(1, texture); + if (texture && *texture) { + glDeleteTextures(1, texture); + *texture = 0; + } } QImage TextureHelper::convertToGLFormat(const QImage &srcImage) diff --git a/src/datavisualization/utils/texturehelper_p.h b/src/datavisualization/utils/texturehelper_p.h index ebfaa042..206cd291 100644 --- a/src/datavisualization/utils/texturehelper_p.h +++ b/src/datavisualization/utils/texturehelper_p.h @@ -56,7 +56,7 @@ class TextureHelper : protected QOpenGLFunctions GLuint createDepthTextureFrameBuffer(const QSize &size, GLuint &frameBuffer, GLuint textureSize); void fillDepthTexture(GLuint texture, const QSize &size, GLuint textureSize, GLfloat value); #endif - void deleteTexture(const GLuint *texture); + void deleteTexture(GLuint *texture); private: QImage convertToGLFormat(const QImage &srcImage); -- cgit v1.2.3 From ffbb171b3057e9f56374a7b13d3087307bb0cad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 28 Apr 2014 11:07:49 +0300 Subject: Updated customitems example snapshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ifb7e33872cbe28529c79d7cd2fd0d7e586c3294d Change-Id: Ifb7e33872cbe28529c79d7cd2fd0d7e586c3294d Reviewed-by: Tomi Korpipää --- .../customitems/doc/images/customitems-example.png | Bin 110217 -> 97631 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/datavisualization/customitems/doc/images/customitems-example.png b/examples/datavisualization/customitems/doc/images/customitems-example.png index 610ed73e..6002ea5f 100644 Binary files a/examples/datavisualization/customitems/doc/images/customitems-example.png and b/examples/datavisualization/customitems/doc/images/customitems-example.png differ -- cgit v1.2.3 From 3f3f27524a33cc076fa5d3bc50a7aa5298e605af Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 28 Apr 2014 13:11:53 +0300 Subject: Only disable theme forcing during initial loading of graph. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3010 Change-Id: If07c11052e11373ea80de47276dd9e8b291dc2fd Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/abstractdeclarative.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 3b756d4c..70ba8df8 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -171,7 +171,7 @@ Declarative3DScene* AbstractDeclarative::scene() const void AbstractDeclarative::setTheme(Q3DTheme *theme) { - m_controller->setActiveTheme(theme, false); + m_controller->setActiveTheme(theme, isComponentComplete()); } Q3DTheme *AbstractDeclarative::theme() const -- cgit v1.2.3 From a7ba1a313eb620e275608c0627efbc1e2c2b40c0 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 28 Apr 2014 13:15:27 +0300 Subject: Misc cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I126edfa39dcfe4fe71e89527b5ae05b7d773c61e Reviewed-by: Tomi Korpipää --- examples/datavisualization/bars/doc/src/bars.qdoc | 2 +- src/datavisualization/engine/abstract3drenderer_p.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/datavisualization/bars/doc/src/bars.qdoc b/examples/datavisualization/bars/doc/src/bars.qdoc index 8f8d6210..1fa3f934 100644 --- a/examples/datavisualization/bars/doc/src/bars.qdoc +++ b/examples/datavisualization/bars/doc/src/bars.qdoc @@ -171,7 +171,7 @@ \section1 Selecting a row/column by clicking an axis label Selection by axis label is default functionality for bar graphs. As an example, you can select - rows by clicking an axis label in the following way:" + rows by clicking an axis label in the following way: \list \li Change selection mode to \c SelectionRow diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 967a41a9..ecbbebac 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -62,8 +62,6 @@ protected: RenderingDepth }; - // QString generateValueLabel(const QString &format, float value); - public: virtual ~Abstract3DRenderer(); -- cgit v1.2.3 From baa7cc6531fc4d7764128289d49a8746a27239fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 29 Apr 2014 07:21:48 +0300 Subject: Android GLSL linker fix Task-number: QTRD-3059 Change-Id: Ie5b82c6418cb87f7d9c04fcca287f5924d8616a5 Change-Id: Ie5b82c6418cb87f7d9c04fcca287f5924d8616a5 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/shaders/colorOnY_ES2.frag | 4 ++-- src/datavisualization/engine/shaders/default.vert | 2 ++ src/datavisualization/engine/shaders/default_ES2.frag | 4 ++-- src/datavisualization/engine/shaders/surface_ES2.frag | 4 ++-- src/datavisualization/engine/shaders/texture.vert | 2 ++ src/datavisualization/engine/shaders/texture_ES2.frag | 4 ++-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/datavisualization/engine/shaders/colorOnY_ES2.frag b/src/datavisualization/engine/shaders/colorOnY_ES2.frag index f2cf14b8..4352de05 100644 --- a/src/datavisualization/engine/shaders/colorOnY_ES2.frag +++ b/src/datavisualization/engine/shaders/colorOnY_ES2.frag @@ -1,4 +1,3 @@ -uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; uniform sampler2D textureSampler; @@ -6,6 +5,7 @@ uniform highp float gradMin; uniform highp float gradHeight; uniform highp vec4 lightColor; +varying highp vec3 lightPosition_wrld_frag; varying highp vec3 position_wrld; varying highp vec3 normal_cmr; varying highp vec3 eyeDirection_cmr; @@ -18,7 +18,7 @@ void main() { highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; highp vec3 materialSpecularColor = lightColor.rgb; - highp float distance = length(lightPosition_wrld - position_wrld); + highp float distance = length(lightPosition_wrld_frag - position_wrld); highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); highp float cosTheta = dot(n, l); diff --git a/src/datavisualization/engine/shaders/default.vert b/src/datavisualization/engine/shaders/default.vert index e0718b20..b454913b 100644 --- a/src/datavisualization/engine/shaders/default.vert +++ b/src/datavisualization/engine/shaders/default.vert @@ -8,6 +8,7 @@ uniform highp mat4 M; uniform highp mat4 itM; uniform highp vec3 lightPosition_wrld; +varying highp vec3 lightPosition_wrld_frag; varying highp vec3 position_wrld; varying highp vec3 normal_cmr; varying highp vec3 eyeDirection_cmr; @@ -23,4 +24,5 @@ void main() { vec3 lightPosition_cmr = vec4(V * vec4(lightPosition_wrld, 1.0)).xyz; lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; + lightPosition_wrld_frag = lightPosition_wrld; } diff --git a/src/datavisualization/engine/shaders/default_ES2.frag b/src/datavisualization/engine/shaders/default_ES2.frag index 6c6d04ab..73d66d5b 100644 --- a/src/datavisualization/engine/shaders/default_ES2.frag +++ b/src/datavisualization/engine/shaders/default_ES2.frag @@ -4,8 +4,8 @@ varying highp vec3 position_wrld; varying highp vec3 normal_cmr; varying highp vec3 eyeDirection_cmr; varying highp vec3 lightDirection_cmr; +varying highp vec3 lightPosition_wrld_frag; -uniform highp vec3 lightPosition_wrld; uniform highp vec4 color_mdl; uniform highp float lightStrength; uniform highp float ambientStrength; @@ -16,7 +16,7 @@ void main() { highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; highp vec3 materialSpecularColor = lightColor.rgb; - highp float distance = length(lightPosition_wrld - position_wrld); + highp float distance = length(lightPosition_wrld_frag - position_wrld); highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/surface_ES2.frag b/src/datavisualization/engine/shaders/surface_ES2.frag index 1f3aedb6..58d13834 100644 --- a/src/datavisualization/engine/shaders/surface_ES2.frag +++ b/src/datavisualization/engine/shaders/surface_ES2.frag @@ -4,9 +4,9 @@ varying highp vec3 position_wrld; varying highp vec3 normal_cmr; varying highp vec3 eyeDirection_cmr; varying highp vec3 lightDirection_cmr; +varying highp vec3 lightPosition_wrld_frag; uniform sampler2D textureSampler; -uniform highp vec3 lightPosition_wrld; uniform highp float lightStrength; uniform highp float ambientStrength; uniform highp vec4 lightColor; @@ -17,7 +17,7 @@ void main() { highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; highp vec3 materialSpecularColor = lightColor.rgb; - highp float distance = length(lightPosition_wrld - position_wrld); + highp float distance = length(lightPosition_wrld_frag - position_wrld); highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); diff --git a/src/datavisualization/engine/shaders/texture.vert b/src/datavisualization/engine/shaders/texture.vert index 7d98b053..90c0ac23 100644 --- a/src/datavisualization/engine/shaders/texture.vert +++ b/src/datavisualization/engine/shaders/texture.vert @@ -8,6 +8,7 @@ attribute highp vec3 vertexPosition_mdl; attribute highp vec2 vertexUV; attribute highp vec3 vertexNormal_mdl; +varying highp vec3 lightPosition_wrld_frag; varying highp vec2 UV; varying highp vec3 position_wrld; varying highp vec3 normal_cmr; @@ -23,4 +24,5 @@ void main() { lightDirection_cmr = lightPosition_cmr + eyeDirection_cmr; normal_cmr = vec4(V * itM * vec4(vertexNormal_mdl, 0.0)).xyz; UV = vertexUV; + lightPosition_wrld_frag = lightPosition_wrld; } diff --git a/src/datavisualization/engine/shaders/texture_ES2.frag b/src/datavisualization/engine/shaders/texture_ES2.frag index d82c12fe..82ad6614 100644 --- a/src/datavisualization/engine/shaders/texture_ES2.frag +++ b/src/datavisualization/engine/shaders/texture_ES2.frag @@ -4,8 +4,8 @@ varying highp vec3 position_wrld; varying highp vec3 normal_cmr; varying highp vec3 eyeDirection_cmr; varying highp vec3 lightDirection_cmr; +varying highp vec3 lightPosition_wrld_frag; -uniform highp vec3 lightPosition_wrld; uniform highp sampler2D textureSampler; uniform highp float lightStrength; uniform highp float ambientStrength; @@ -16,7 +16,7 @@ void main() { highp vec3 materialAmbientColor = lightColor.rgb * ambientStrength * materialDiffuseColor; highp vec3 materialSpecularColor = lightColor.rgb; - highp float distance = length(lightPosition_wrld - position_wrld); + highp float distance = length(lightPosition_wrld_frag - position_wrld); highp vec3 n = normalize(normal_cmr); highp vec3 l = normalize(lightDirection_cmr); -- cgit v1.2.3 From 35a52776f687c43a4894fafbec9af3893f1d7f65 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 29 Apr 2014 08:28:57 +0300 Subject: Add revision macros to new invokables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I8c0834a6cb282e8a05d487fe62369ad5b1281c9d Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/abstractdeclarative_p.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 4f73380f..3bae3723 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -128,11 +128,13 @@ public: Q_INVOKABLE virtual void clearSelection(); - Q_INVOKABLE virtual int addCustomItem(const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, - const QString &textureFile = 0); - Q_INVOKABLE virtual void removeCustomItemAt(int index); - Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); + Q_REVISION(1) Q_INVOKABLE virtual int addCustomItem(const QString &meshFile, + const QVector3D &position, + const QVector3D &scaling, + const QQuaternion &rotation, + const QString &textureFile = 0); + Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(int index); + Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); -- cgit v1.2.3 From 44b410f080c4820cea682c4d1278152d2767595c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 29 Apr 2014 14:50:04 +0300 Subject: Bar data item and row changing optimizations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No longer reset the entire render item array if single item or row changes, significantly speeding up these operations. Task-number: QTRD-2190 Change-Id: I44b8abd384003e252e4bfc34af5d73ac1dee34bf Reviewed-by: Tomi Korpipää Reviewed-by: Mika Salmela --- src/datavisualization/engine/bars3dcontroller.cpp | 81 +++++-- src/datavisualization/engine/bars3dcontroller_p.h | 18 +- src/datavisualization/engine/bars3drenderer.cpp | 168 +++++++++---- src/datavisualization/engine/bars3drenderer_p.h | 6 + src/datavisualization/engine/scatter3drenderer.cpp | 6 +- .../engine/surface3dcontroller.cpp | 35 ++- src/datavisualization/engine/surface3drenderer.cpp | 19 +- src/datavisualization/engine/surface3drenderer_p.h | 2 +- tests/barstest/chart.cpp | 269 ++++++++++++++++++--- tests/barstest/chart.h | 6 +- tests/barstest/main.cpp | 13 +- tests/surfacetest/graphmodifier.cpp | 4 +- 12 files changed, 494 insertions(+), 133 deletions(-) diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 38870115..99fa8223 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -83,6 +83,18 @@ void Bars3DController::synchDataToRenderer() Abstract3DController::synchDataToRenderer(); // Notify changes to renderer + if (m_changeTracker.rowsChanged) { + m_renderer->updateRows(m_changedRows); + m_changeTracker.rowsChanged = false; + m_changedRows.clear(); + } + + if (m_changeTracker.itemChanged) { + m_renderer->updateItems(m_changedItems); + m_changeTracker.itemChanged = false; + m_changedItems.clear(); + } + if (m_changeTracker.multiSeriesScalingChanged) { m_renderer->updateMultiSeriesScaling(m_isMultiSeriesUniform); m_changeTracker.multiSeriesScalingChanged = false; @@ -131,17 +143,39 @@ void Bars3DController::handleRowsAdded(int startIndex, int count) void Bars3DController::handleRowsChanged(int startIndex, int count) { - Q_UNUSED(startIndex) - Q_UNUSED(count) QBar3DSeries *series = static_cast(sender())->series(); - if (series->isVisible()) { - adjustAxisRanges(); - m_isDataDirty = true; - series->d_ptr->markItemLabelDirty(); + int oldChangeCount = m_changedRows.size(); + if (!oldChangeCount) + m_changedRows.reserve(count); + + int selectedRow = m_selectedBar.x(); + for (int i = 0; i < count; i++) { + bool newItem = true; + int candidate = startIndex + i; + for (int j = 0; j < oldChangeCount; j++) { + const ChangeRow &oldChangeItem = m_changedRows.at(j); + if (oldChangeItem.row == candidate && series == oldChangeItem.series) { + newItem = false; + break; + } + } + if (newItem) { + ChangeRow newChangeItem = {series, candidate}; + m_changedRows.append(newChangeItem); + if (series == m_selectedBarSeries && selectedRow == candidate) + series->d_ptr->markItemLabelDirty(); + } + } + if (count) { + m_changeTracker.rowsChanged = true; + + if (series->isVisible()) + adjustAxisRanges(); + + // Clear selection unless still valid (row length might have changed) + setSelectedBar(m_selectedBar, m_selectedBarSeries, false); + emitNeedRender(); } - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); - emitNeedRender(); } void Bars3DController::handleRowsRemoved(int startIndex, int count) @@ -199,17 +233,28 @@ void Bars3DController::handleRowsInserted(int startIndex, int count) void Bars3DController::handleItemChanged(int rowIndex, int columnIndex) { - Q_UNUSED(rowIndex) - Q_UNUSED(columnIndex) QBar3DSeries *series = static_cast(sender())->series(); - if (series->isVisible()) { - adjustAxisRanges(); - m_isDataDirty = true; - series->d_ptr->markItemLabelDirty(); + + bool newItem = true; + QPoint candidate(rowIndex, columnIndex); + foreach (ChangeItem item, m_changedItems) { + if (item.point == candidate && item.series == series) { + newItem = false; + break; + } + } + + if (newItem) { + ChangeItem newItem = {series, candidate}; + m_changedItems.append(newItem); + m_changeTracker.itemChanged = true; + + if (series == m_selectedBarSeries && m_selectedBar == candidate) + series->d_ptr->markItemLabelDirty(); + if (series->isVisible()) + adjustAxisRanges(); + emitNeedRender(); } - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); - emitNeedRender(); } void Bars3DController::handleDataRowLabelsChanged() diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 33928306..00eda402 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -42,12 +42,16 @@ struct Bars3DChangeBitField { bool multiSeriesScalingChanged : 1; bool barSpecsChanged : 1; bool selectedBarChanged : 1; + bool rowsChanged : 1; + bool itemChanged : 1; Bars3DChangeBitField() : slicingActiveChanged(true), multiSeriesScalingChanged(true), barSpecsChanged(true), - selectedBarChanged(true) + selectedBarChanged(true), + rowsChanged(false), + itemChanged(false) { } }; @@ -56,8 +60,20 @@ class QT_DATAVISUALIZATION_EXPORT Bars3DController : public Abstract3DController { Q_OBJECT +public: + struct ChangeItem { + QBar3DSeries *series; + QPoint point; + }; + struct ChangeRow { + QBar3DSeries *series; + int row; + }; + private: Bars3DChangeBitField m_changeTracker; + QVector m_changedItems; + QVector m_changedRows; // Interaction QPoint m_selectedBar; // Points to row & column in data window. diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 01fcebb2..ec1f0c7e 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -95,7 +95,8 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_clickedPosition(Bars3DController::invalidSelectionPosition()), m_keepSeriesUniform(false), m_haveUniformColorSeries(false), - m_haveGradientSeries(false) + m_haveGradientSeries(false), + m_zeroPosition(0.0f) { m_axisCacheY.setScale(2.0f); m_axisCacheY.setTranslate(-1.0f); @@ -159,7 +160,6 @@ void Bars3DRenderer::updateData() int maxCol = m_axisCacheX.max(); int newRows = maxRow - minRow + 1; int newColumns = maxCol - minCol + 1; - int updateSize = 0; int dataRowCount = 0; int maxDataRowCount = 0; @@ -187,8 +187,7 @@ void Bars3DRenderer::updateData() calculateSceneScalingFactors(); } - const QValue3DAxisFormatter *axisFormatter = m_axisCacheY.formatter(); - float zeroPosition = axisFormatter->positionAt(0.0f); + m_zeroPosition = m_axisCacheY.formatter()->positionAt(0.0f); foreach (SeriesRenderCache *baseCache, m_renderCacheList) { BarSeriesRenderCache *cache = static_cast(baseCache); @@ -212,50 +211,12 @@ void Bars3DRenderer::updateData() if (maxDataRowCount < dataRowCount) maxDataRowCount = qMin(dataRowCount, newRows); int dataRowIndex = minRow; - GLfloat heightValue = 0.0f; for (int i = 0; i < newRows; i++) { - int j = 0; BarRenderItemRow &renderRow = renderArray[i]; - if (dataRowIndex < dataRowCount) { - const QBarDataRow *dataRow = dataProxy->rowAt(dataRowIndex); - updateSize = qMin((dataRow->size() - minCol), renderRow.size()); - if (dataRow) { - int dataColIndex = minCol; - for (; j < updateSize ; j++) { - float value = dataRow->at(dataColIndex).value(); - heightValue = axisFormatter->positionAt(value); - if (m_noZeroInRange) { - if (m_hasNegativeValues) { - heightValue = -1.0f + heightValue; - if (heightValue > 0.0f) - heightValue = 0.0f; - } else { - if (heightValue < 0.0f) - heightValue = 0.0f; - } - } else { - heightValue -= zeroPosition; - } - renderRow[j].setValue(value); - renderRow[j].setHeight(heightValue); - - float angle = dataRow->at(dataColIndex).rotation(); - if (angle) { - renderRow[j].setRotation( - QQuaternion::fromAxisAndAngle( - upVector, angle)); - } else { - renderRow[j].setRotation(identityQuaternion); - } - dataColIndex++; - } - } - } - for (; j < newColumns; j++) { - renderRow[j].setValue(0.0f); - renderRow[j].setHeight(0.0f); - renderRow[j].setRotation(identityQuaternion); - } + const QBarDataRow *dataRow = 0; + if (dataRowIndex < dataRowCount) + dataRow = dataProxy->rowAt(dataRowIndex); + updateRenderRow(dataRow, renderRow); dataRowIndex++; } cache->setDataDirty(false); @@ -268,6 +229,56 @@ void Bars3DRenderer::updateData() m_selectedSeriesCache ? m_selectedSeriesCache->series() : 0); } +void Bars3DRenderer::updateRenderRow(const QBarDataRow *dataRow, BarRenderItemRow &renderRow) +{ + int j = 0; + int renderRowSize = renderRow.size(); + int startIndex = m_axisCacheX.min(); + + if (dataRow) { + int updateSize = qMin((dataRow->size() - startIndex), renderRowSize); + int dataColIndex = startIndex; + for (; j < updateSize ; j++) { + updateRenderItem(dataRow->at(dataColIndex), renderRow[j]); + dataColIndex++; + } + } + for (; j < renderRowSize; j++) { + renderRow[j].setValue(0.0f); + renderRow[j].setHeight(0.0f); + renderRow[j].setRotation(identityQuaternion); + } +} + +void Bars3DRenderer::updateRenderItem(const QBarDataItem &dataItem, BarRenderItem &renderItem) +{ + float value = dataItem.value(); + float heightValue = m_axisCacheY.formatter()->positionAt(value); + if (m_noZeroInRange) { + if (m_hasNegativeValues) { + heightValue = -1.0f + heightValue; + if (heightValue > 0.0f) + heightValue = 0.0f; + } else { + if (heightValue < 0.0f) + heightValue = 0.0f; + } + } else { + heightValue -= m_zeroPosition; + } + renderItem.setValue(value); + renderItem.setHeight(heightValue); + + float angle = dataItem.rotation(); + if (angle) { + renderItem.setRotation( + QQuaternion::fromAxisAndAngle( + upVector, angle)); + } else { + renderItem.setRotation(identityQuaternion); + } +} + void Bars3DRenderer::updateSeries(const QList &seriesList) { Abstract3DRenderer::updateSeries(seriesList); @@ -283,9 +294,9 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) BarSeriesRenderCache *cache = static_cast(m_renderCacheList.value(barSeries)); if (noSelection - && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition() - && selectionLabel() != cache->itemLabel()) { - m_selectionLabelDirty = true; + && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition()) { + if (selectionLabel() != cache->itemLabel()) + m_selectionLabelDirty = true; noSelection = false; } cache->setVisualIndex(visualIndex++); @@ -304,6 +315,65 @@ SeriesRenderCache *Bars3DRenderer::createNewCache(QAbstract3DSeries *series) return new BarSeriesRenderCache(series, this); } +void Bars3DRenderer::updateRows(const QVector &rows) +{ + int minRow = m_axisCacheZ.min(); + int maxRow = m_axisCacheZ.max(); + BarSeriesRenderCache *cache = 0; + const QBar3DSeries *prevSeries = 0; + const QBarDataArray *dataArray = 0; + + foreach (Bars3DController::ChangeRow item, rows) { + const int row = item.row; + if (row < minRow || row > maxRow) + continue; + QBar3DSeries *currentSeries = item.series; + if (currentSeries != prevSeries) { + cache = static_cast(m_renderCacheList.value(currentSeries)); + prevSeries = currentSeries; + dataArray = item.series->dataProxy()->array(); + // Invisible series render caches are not updated, but instead just marked dirty, so that + // they can be completely recalculated when they are turned visible. + if (!cache->isVisible() && !cache->dataDirty()) + cache->setDataDirty(true); + } + if (cache->isVisible()) + updateRenderRow(dataArray->at(row), cache->renderArray()[row - minRow]); + } +} + +void Bars3DRenderer::updateItems(const QVector &points) +{ + int minRow = m_axisCacheZ.min(); + int maxRow = m_axisCacheZ.max(); + int minCol = m_axisCacheX.min(); + int maxCol = m_axisCacheX.max(); + BarSeriesRenderCache *cache = 0; + const QBar3DSeries *prevSeries = 0; + const QBarDataArray *dataArray = 0; + + foreach (Bars3DController::ChangeItem item, points) { + const int row = item.point.x(); + const int col = item.point.y(); + if (row < minRow || row > maxRow || col < minCol || col > maxCol) + continue; + QBar3DSeries *currentSeries = item.series; + if (currentSeries != prevSeries) { + cache = static_cast(m_renderCacheList.value(currentSeries)); + prevSeries = currentSeries; + dataArray = item.series->dataProxy()->array(); + // Invisible series render caches are not updated, but instead just marked dirty, so that + // they can be completely recalculated when they are turned visible. + if (!cache->isVisible() && !cache->dataDirty()) + cache->setDataDirty(true); + } + if (cache->isVisible()) { + updateRenderItem(dataArray->at(row)->at(col), + cache->renderArray()[row - minRow][col - minCol]); + } + } +} + void Bars3DRenderer::updateScene(Q3DScene *scene) { if (m_hasNegativeValues) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index ca0e690e..ddea546e 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -108,6 +108,7 @@ private: bool m_keepSeriesUniform; bool m_haveUniformColorSeries; bool m_haveGradientSeries; + float m_zeroPosition; public: explicit Bars3DRenderer(Bars3DController *controller); @@ -116,6 +117,8 @@ public: void updateData(); void updateSeries(const QList &seriesList); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); + void updateRows(const QVector &rows); + void updateItems(const QVector &points); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); @@ -169,6 +172,9 @@ private: QPoint selectionColorToArrayPosition(const QVector4D &selectionColor); QBar3DSeries *selectionColorToSeries(const QVector4D &selectionColor); + inline void updateRenderRow(const QBarDataRow *dataRow, BarRenderItemRow &renderRow); + inline void updateRenderItem(const QBarDataItem &dataItem, BarRenderItem &renderItem); + Q_DISABLE_COPY(Bars3DRenderer) friend class BarRenderItem; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 5d37e6e1..3f91e9c3 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -240,9 +240,9 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis if (cache->itemSize() != itemSize) cache->setItemSize(itemSize); if (noSelection - && scatterSeries->selectedItem() != QScatter3DSeries::invalidSelectionIndex() - && m_selectionLabel != cache->itemLabel()) { - m_selectionLabelDirty = true; + && scatterSeries->selectedItem() != QScatter3DSeries::invalidSelectionIndex()) { + if (m_selectionLabel != cache->itemLabel()) + m_selectionLabelDirty = true; noSelection = false; } diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 591cbdda..6f27c7df 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -76,7 +76,7 @@ void Surface3DController::synchDataToRenderer() } if (m_changeTracker.itemChanged) { - m_renderer->updateItem(m_changedItems); + m_renderer->updateItems(m_changedItems); m_changeTracker.itemChanged = false; m_changedItems.clear(); } @@ -309,36 +309,34 @@ void Surface3DController::handleFlatShadingSupportedChange(bool supported) void Surface3DController::handleRowsChanged(int startIndex, int count) { - QSurfaceDataProxy *sender = static_cast(QObject::sender()); - if (m_changedRows.size() == 0) - m_changedRows.reserve(sender->rowCount()); - - QSurface3DSeries *series = sender->series(); + QSurface3DSeries *series = static_cast(QObject::sender())->series(); int oldChangeCount = m_changedRows.size(); + if (!oldChangeCount) + m_changedRows.reserve(count); + int selectedRow = m_selectedPoint.x(); for (int i = 0; i < count; i++) { bool newItem = true; int candidate = startIndex + i; - for (int i = 0; i < oldChangeCount; i++) { - if (m_changedRows.at(i).row == candidate && - series == m_changedRows.at(i).series) { + for (int j = 0; j < oldChangeCount; j++) { + const ChangeRow &oldChangeItem = m_changedRows.at(j); + if (oldChangeItem.row == candidate && series == oldChangeItem.series) { newItem = false; break; } } if (newItem) { - ChangeRow newItem = {series, candidate}; - m_changedRows.append(newItem); + ChangeRow newChangeItem = {series, candidate}; + m_changedRows.append(newChangeItem); if (series == m_selectedSeries && selectedRow == candidate) series->d_ptr->markItemLabelDirty(); } } - if (m_changedRows.size()) { + if (count) { m_changeTracker.rowsChanged = true; - adjustAxisRanges(); - // Clear selection unless still valid - setSelectedPoint(m_selectedPoint, m_selectedSeries, false); + if (series->isVisible()) + adjustAxisRanges(); emitNeedRender(); } } @@ -349,7 +347,7 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) QSurface3DSeries *series = sender->series(); bool newItem = true; - QPoint candidate(columnIndex, rowIndex); + QPoint candidate(rowIndex, columnIndex); foreach (ChangeItem item, m_changedItems) { if (item.point == candidate && item.series == series) { newItem = false; @@ -364,9 +362,8 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) if (series == m_selectedSeries && m_selectedPoint == candidate) series->d_ptr->markItemLabelDirty(); - adjustAxisRanges(); - // Clear selection unless still valid - setSelectedPoint(m_selectedPoint, m_selectedSeries, false); + if (series->isVisible()) + adjustAxisRanges(); emitNeedRender(); } } diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f04277f7..198a034d 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -256,9 +256,9 @@ void Surface3DRenderer::updateSeries(const QList &seriesLis SurfaceSeriesRenderCache *cache = static_cast( m_renderCacheList.value(series)); if (noSelection - && surfaceSeries->selectedPoint() != QSurface3DSeries::invalidSelectionPosition() - && selectionLabel() != cache->itemLabel()) { - m_selectionLabelDirty = true; + && surfaceSeries->selectedPoint() != QSurface3DSeries::invalidSelectionPosition()) { + if (selectionLabel() != cache->itemLabel()) + m_selectionLabelDirty = true; noSelection = false; } @@ -346,7 +346,7 @@ void Surface3DRenderer::updateRows(const QVector updateSelectedPoint(m_selectedPoint, m_selectedSeries); } -void Surface3DRenderer::updateItem(const QVector &points) +void Surface3DRenderer::updateItems(const QVector &points) { foreach (Surface3DController::ChangeItem item, points) { SurfaceSeriesRenderCache *cache = @@ -364,14 +364,15 @@ void Surface3DRenderer::updateItem(const QVector= sampleSpace.y() && - point.x() <= sampleSpaceRight && point.x() >= sampleSpace.x()) { + if (point.x() <= sampleSpaceTop && point.x() >= sampleSpace.y() && + point.y() <= sampleSpaceRight && point.y() >= sampleSpace.x()) { updateBuffers = true; - int x = point.x() - sampleSpace.x(); - int y = point.y() - sampleSpace.y(); - (*(dstArray.at(y)))[x] = srcArray->at(point.y())->at(point.x()); + int x = point.y() - sampleSpace.x(); + int y = point.x() - sampleSpace.y(); + (*(dstArray.at(y)))[x] = srcArray->at(point.x())->at(point.y()); if (cache->isFlatShadingEnabled()) cache->surfaceObject()->updateCoarseItem(dstArray, y, x); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 0cd4502a..db46a17b 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -110,7 +110,7 @@ public: void cleanCache(SeriesRenderCache *cache); void updateSelectionMode(QAbstract3DGraph::SelectionFlags mode); void updateRows(const QVector &rows); - void updateItem(const QVector &points); + void updateItems(const QVector &points); void updateScene(Q3DScene *scene); void updateSlicingActive(bool isSlicing); void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series); diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 2c095cf8..9bf21cbd 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -316,32 +316,14 @@ void GraphModifier::releaseAxes() // Releases all axes - results in default axes for all dimensions. // Axes reset when the graph is switched as set*Axis calls are made, which // implicitly add axes. - m_graph->releaseAxis(m_autoAdjustingAxis); - m_graph->releaseAxis(m_fixedRangeAxis); - m_graph->releaseAxis(m_temperatureAxis); - m_graph->releaseAxis(m_yearAxis); - m_graph->releaseAxis(m_monthAxis); - m_graph->releaseAxis(m_genericRowAxis); - m_graph->releaseAxis(m_genericColumnAxis); + foreach (QAbstract3DAxis *axis, m_graph->axes()) + m_graph->releaseAxis(axis); } -void GraphModifier::releaseProxies() +void GraphModifier::releaseSeries() { - // Releases all series/add all series toggle - if (m_graph->seriesList().size() > 0) { - m_graph->removeSeries(m_temperatureData); - m_graph->removeSeries(m_temperatureData2); - m_graph->removeSeries(m_genericData); - m_graph->removeSeries(m_dummyData); - m_graph->removeSeries(m_dummyData2); - m_graph->removeSeries(m_dummyData3); - m_graph->removeSeries(m_dummyData4); - m_graph->removeSeries(m_dummyData5); - } else { - m_graph->addSeries(m_temperatureData); - m_graph->addSeries(m_temperatureData2); - m_graph->addSeries(m_genericData); - } + foreach (QBar3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(series); } void GraphModifier::flipViews() @@ -771,7 +753,7 @@ void GraphModifier::changeShadowQuality(int quality) void GraphModifier::showFiveSeries() { - releaseProxies(); + releaseSeries(); releaseAxes(); m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemRowAndColumn | QAbstract3DGraph::SelectionMultiSeries); @@ -838,7 +820,7 @@ void GraphModifier::primarySeriesTest() case 0: { qDebug() << "Step 0 - Init:"; m_graph->addSeries(m_dummyData); // Add one series to enforce release in releaseProxies() - releaseProxies(); + releaseSeries(); releaseAxes(); m_dummyData->dataProxy()->resetArray(makeDummyData(), testLabels, @@ -1028,11 +1010,11 @@ void GraphModifier::insertRemoveTestToggle() m_selectionTimer.stop(); m_graph->removeSeries(m_dummyData); m_graph->removeSeries(m_dummyData2); - releaseProxies(); + releaseSeries(); releaseAxes(); m_graph->setActiveInputHandler(m_defaultInputHandler); } else { - releaseProxies(); + releaseSeries(); releaseAxes(); m_graph->rowAxis()->setRange(0, 32); m_graph->columnAxis()->setRange(0, 10); @@ -1211,6 +1193,213 @@ void GraphModifier::addRemoveSeries() counter++; } +void GraphModifier::testItemAndRowChanges() +{ + static int counter = 0; + const int rowCount = 12; + const int colCount = 10; + const float flatValue = 10.0f; + static QBar3DSeries *series0 = 0; + static QBar3DSeries *series1 = 0; + static QBar3DSeries *series2 = 0; + QBarDataItem item25; + QBarDataItem item50; + QBarDataItem item75; + item25.setValue(25); + item50.setValue(50); + item75.setValue(75); + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test"; + releaseSeries(); + releaseAxes(); + delete series0; + delete series1; + delete series2; + series0 = new QBar3DSeries; + series1 = new QBar3DSeries; + series2 = new QBar3DSeries; + populateFlatSeries(series0, rowCount, colCount, flatValue); + populateFlatSeries(series1, rowCount, colCount, flatValue); + populateFlatSeries(series2, rowCount, colCount, flatValue); + m_graph->rowAxis()->setRange(4.0f, 8.0f); + m_graph->columnAxis()->setRange(3.0f, 6.0f); + m_graph->valueAxis()->setRange(0.0f, 100.0f); + m_graph->addSeries(series0); + m_graph->addSeries(series1); + m_graph->addSeries(series2); + //counter = 11; // skip single item tests + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Change single item, unselected"; + series0->dataProxy()->setItem(4, 3, item50); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Change single item, selected"; + series1->setSelectedBar(QPoint(4, 5)); + series1->dataProxy()->setItem(4, 5, item25); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Change item outside visible area"; + series1->dataProxy()->setItem(0, 3, item25); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, unselected"; + series0->dataProxy()->setItem(5, 3, item25); + series1->dataProxy()->setItem(5, 3, item75); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, one selected"; + series0->dataProxy()->setItem(5, 4, item25); + series1->dataProxy()->setItem(4, 5, item75); + } + break; + case 6: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, one outside range"; + series0->dataProxy()->setItem(1, 2, item25); + series1->dataProxy()->setItem(6, 6, item75); + } + break; + case 7: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, both outside range"; + series0->dataProxy()->setItem(1, 2, item25); + series1->dataProxy()->setItem(8, 8, item75); + } + break; + case 8: { + qDebug() << __FUNCTION__ << counter << "Change item to same value"; + series1->dataProxy()->setItem(6, 6, item75); + } + break; + case 9: { + qDebug() << __FUNCTION__ << counter << "Change 3 items on each series"; + series0->dataProxy()->setItem(7, 3, item25); + series0->dataProxy()->setItem(7, 4, item50); + series0->dataProxy()->setItem(7, 5, item75); + series1->dataProxy()->setItem(6, 3, item25); + series1->dataProxy()->setItem(6, 4, item50); + series1->dataProxy()->setItem(6, 5, item75); + } + break; + case 10: { + qDebug() << __FUNCTION__ << counter << "Level the field single item at a time"; + QBarDataItem item; + item.setValue(15.0f); + for (int i = 0; i < rowCount; i++) { + for (int j = 0; j < colCount; j++) { + series0->dataProxy()->setItem(i, j, item); + series1->dataProxy()->setItem(i, j, item); + series2->dataProxy()->setItem(i, j, item); + } + } + } + break; + case 11: { + qDebug() << __FUNCTION__ << counter << "Change same items multiple times"; + series0->dataProxy()->setItem(7, 3, item25); + series1->dataProxy()->setItem(7, 3, item25); + series0->dataProxy()->setItem(7, 3, item50); + series1->dataProxy()->setItem(7, 3, item50); + series0->dataProxy()->setItem(7, 3, item75); + series1->dataProxy()->setItem(7, 3, item75); + } + break; + case 12: { + qDebug() << __FUNCTION__ << counter << "Change row"; + series0->dataProxy()->setRow(5, createFlatRow(colCount, 50.0f)); + } + break; + case 13: { + qDebug() << __FUNCTION__ << counter << "Change row with selected item"; + series1->setSelectedBar(QPoint(6, 6)); + series1->dataProxy()->setRow(6, createFlatRow(colCount, 40.0f)); + } + break; + case 14: { + qDebug() << __FUNCTION__ << counter << "Change hidden row"; + series1->dataProxy()->setRow(9, createFlatRow(colCount, 50.0f)); + } + break; + case 15: { + qDebug() << __FUNCTION__ << counter << "Change multiple rows singly"; + series0->dataProxy()->setRow(6, createFlatRow(colCount, 70.0f)); + series1->dataProxy()->setRow(6, createFlatRow(colCount, 80.0f)); + series2->dataProxy()->setRow(6, createFlatRow(colCount, 90.0f)); + } + break; + case 16: { + qDebug() << __FUNCTION__ << counter << "Change multiple rows many at a time"; + QBarDataArray newRows; + newRows.reserve(4); + newRows.append(createFlatRow(colCount, 26.0f)); + newRows.append(createFlatRow(colCount, 30.0f)); + newRows.append(createFlatRow(colCount, 34.0f)); + newRows.append(createFlatRow(colCount, 38.0f)); + series0->dataProxy()->setRows(2, newRows); + newRows[0] = createFlatRow(colCount, 26.0f); + newRows[1] = createFlatRow(colCount, 30.0f); + newRows[2] = createFlatRow(colCount, 34.0f); + newRows[3] = createFlatRow(colCount, 38.0f); + series1->dataProxy()->setRows(3, newRows); + newRows[0] = createFlatRow(colCount, 26.0f); + newRows[1] = createFlatRow(colCount, 30.0f); + newRows[2] = createFlatRow(colCount, 34.0f); + newRows[3] = createFlatRow(colCount, 38.0f); + series2->dataProxy()->setRows(4, newRows); + } + break; + case 17: { + qDebug() << __FUNCTION__ << counter << "Change same rows multiple times"; + QBarDataArray newRows; + newRows.reserve(4); + newRows.append(createFlatRow(colCount, 65.0f)); + newRows.append(createFlatRow(colCount, 65.0f)); + newRows.append(createFlatRow(colCount, 65.0f)); + newRows.append(createFlatRow(colCount, 65.0f)); + series0->dataProxy()->setRows(4, newRows); + newRows[0] = createFlatRow(colCount, 65.0f); + newRows[1] = createFlatRow(colCount, 65.0f); + newRows[2] = createFlatRow(colCount, 65.0f); + newRows[3] = createFlatRow(colCount, 65.0f); + series1->dataProxy()->setRows(4, newRows); + newRows[0] = createFlatRow(colCount, 65.0f); + newRows[1] = createFlatRow(colCount, 65.0f); + newRows[2] = createFlatRow(colCount, 65.0f); + newRows[3] = createFlatRow(colCount, 65.0f); + series2->dataProxy()->setRows(4, newRows); + series0->dataProxy()->setRow(6, createFlatRow(colCount, 20.0f)); + series1->dataProxy()->setRow(6, createFlatRow(colCount, 20.0f)); + series2->dataProxy()->setRow(6, createFlatRow(colCount, 20.0f)); + series0->dataProxy()->setRow(6, createFlatRow(colCount, 90.0f)); + series1->dataProxy()->setRow(6, createFlatRow(colCount, 90.0f)); + series2->dataProxy()->setRow(6, createFlatRow(colCount, 90.0f)); + } + break; + case 18: { + qDebug() << __FUNCTION__ << counter << "Change row to different length"; + series0->dataProxy()->setRow(4, createFlatRow(5, 20.0f)); + series1->dataProxy()->setRow(4, createFlatRow(0, 20.0f)); + series2->dataProxy()->setRow(4, 0); + } + break; + case 19: { + qDebug() << __FUNCTION__ << counter << "Change selected row shorter so that selected item is no longer valid"; + series1->dataProxy()->setRow(6, createFlatRow(6, 20.0f)); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void GraphModifier::changeValueAxisSegments(int value) { qDebug() << __FUNCTION__ << value; @@ -1285,6 +1474,32 @@ void GraphModifier::handleFpsChange(qreal fps) m_fpsLabel->setText(fpsPrefix + QString::number(qRound(fps))); } +void GraphModifier::populateFlatSeries(QBar3DSeries *series, int rows, int columns, float value) +{ + QBarDataArray *dataArray = new QBarDataArray; + dataArray->reserve(rows); + for (int i = 0; i < rows; i++) { + QBarDataRow *dataRow = new QBarDataRow(columns); + for (int j = 0; j < columns; j++) + (*dataRow)[j].setValue(value); + dataArray->append(dataRow); + } + QStringList axisLabels; + int count = qMax(rows, columns); + for (int i = 0; i < count; i++) + axisLabels << QString::number(i); + + series->dataProxy()->resetArray(dataArray, axisLabels, axisLabels); +} + +QBarDataRow *GraphModifier::createFlatRow(int columns, float value) +{ + QBarDataRow *dataRow = new QBarDataRow(columns); + for (int j = 0; j < columns; j++) + (*dataRow)[j].setValue(value); + return dataRow; +} + void GraphModifier::setBackgroundEnabled(int enabled) { m_graph->activeTheme()->setBackgroundEnabled(bool(enabled)); diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index e64b282a..385e139c 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -77,7 +77,7 @@ public: void selectBar(); void swapAxis(); void releaseAxes(); - void releaseProxies(); + void releaseSeries(); void createMassiveArray(); void useOwnTheme(); void changeBaseColor(const QColor &color); @@ -92,6 +92,7 @@ public: void changeLogBase(const QString & text); void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } void addRemoveSeries(); + void testItemAndRowChanges(); public slots: void flipViews(); @@ -118,6 +119,9 @@ signals: void shadowQualityChanged(int quality); private: + void populateFlatSeries(QBar3DSeries *series, int rows, int columns, float value); + QBarDataRow *createFlatRow(int columns, float value); + Q3DBars *m_graph; QColorDialog *m_colorDialog; int m_columnCount; diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index e02bddce..1182ffdf 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -175,6 +175,10 @@ int main(int argc, char **argv) logAxisButton->setText(QStringLiteral("Use Log Axis")); logAxisButton->setEnabled(true); + QPushButton *testItemAndRowChangesButton = new QPushButton(widget); + testItemAndRowChangesButton->setText(QStringLiteral("Test Item/Row changing")); + testItemAndRowChangesButton->setEnabled(true); + QColorDialog *colorDialog = new QColorDialog(widget); QLinearGradient grBtoY(0, 0, 100, 0); @@ -337,7 +341,9 @@ int main(int argc, char **argv) vLayout->addWidget(ownThemeButton, 0, Qt::AlignTop); vLayout->addWidget(primarySeriesTestsButton, 0, Qt::AlignTop); vLayout->addWidget(toggleRotationButton, 0, Qt::AlignTop); - vLayout->addWidget(gradientBtoYPB, 1, Qt::AlignTop); + vLayout->addWidget(gradientBtoYPB, 0, Qt::AlignTop); + vLayout->addWidget(logAxisButton, 0, Qt::AlignTop); + vLayout->addWidget(testItemAndRowChangesButton, 1, Qt::AlignTop); vLayout2->addWidget(staticCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(rotationCheckBox, 0, Qt::AlignTop); @@ -372,7 +378,6 @@ int main(int argc, char **argv) vLayout2->addWidget(logBaseEdit, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Value axis segments")), 0, Qt::AlignTop); vLayout2->addWidget(valueAxisSegmentsSpin, 0, Qt::AlignTop); - vLayout->addWidget(logAxisButton, 1, Qt::AlignTop); // TODO: Add example for setMeshFileName widget->show(); @@ -446,7 +451,7 @@ int main(int argc, char **argv) QObject::connect(releaseAxesButton, &QPushButton::clicked, modifier, &GraphModifier::releaseAxes); QObject::connect(releaseProxiesButton, &QPushButton::clicked, modifier, - &GraphModifier::releaseProxies); + &GraphModifier::releaseSeries); QObject::connect(flipViewsButton, &QPushButton::clicked, modifier, &GraphModifier::flipViews); @@ -460,6 +465,8 @@ int main(int argc, char **argv) &GraphModifier::toggleRotation); QObject::connect(logAxisButton, &QPushButton::clicked, modifier, &GraphModifier::useLogAxis); + QObject::connect(testItemAndRowChangesButton, &QPushButton::clicked, modifier, + &GraphModifier::testItemAndRowChanges); QObject::connect(colorDialog, &QColorDialog::currentColorChanged, modifier, &GraphModifier::changeBaseColor); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index a4eb3a27..0f3aa985 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -143,7 +143,7 @@ void GraphModifier::fillSeries() for (int i = 0; i < m_zCount; i++) { QSurfaceDataRow *newRow[4]; float zAdjust = 0.0f; - if (i == 3) + if (i == 2) zAdjust = 0.7f; for (int s = 0; s < 4; s++) { @@ -151,7 +151,7 @@ void GraphModifier::fillSeries() float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[s] + zAdjust; for (int j = 0; j < m_xCount; j++) { float xAdjust = 0.0f; - if (j == 3) + if (j == 4) xAdjust = 0.7f; float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[s] + xAdjust; float angle = (z * x) / full * 1.57f; -- cgit v1.2.3 From 13d1117087e66c77d2eea2f0a046fc556c19cb3c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 30 Apr 2014 15:36:19 +0300 Subject: Scatter data changing optimization. No longer reset the entire render item array if single item changes, significantly speeding up this operation. Task-number: QTRD-2190 Change-Id: Ia3de833b761dc6f24acff581ad79668f51c3e9c5 Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- src/datavisualization/engine/bars3drenderer.cpp | 4 +- src/datavisualization/engine/bars3drenderer_p.h | 2 +- .../engine/scatter3dcontroller.cpp | 42 ++++- .../engine/scatter3dcontroller_p.h | 10 +- src/datavisualization/engine/scatter3drenderer.cpp | 67 ++++--- src/datavisualization/engine/scatter3drenderer_p.h | 2 + tests/scattertest/main.cpp | 20 ++- tests/scattertest/scatterchart.cpp | 197 ++++++++++++++++++++- tests/scattertest/scatterchart.h | 6 + 9 files changed, 311 insertions(+), 39 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index ec1f0c7e..ab7bb4ca 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -342,7 +342,7 @@ void Bars3DRenderer::updateRows(const QVector &rows } } -void Bars3DRenderer::updateItems(const QVector &points) +void Bars3DRenderer::updateItems(const QVector &items) { int minRow = m_axisCacheZ.min(); int maxRow = m_axisCacheZ.max(); @@ -352,7 +352,7 @@ void Bars3DRenderer::updateItems(const QVector &po const QBar3DSeries *prevSeries = 0; const QBarDataArray *dataArray = 0; - foreach (Bars3DController::ChangeItem item, points) { + foreach (Bars3DController::ChangeItem item, items) { const int row = item.point.x(); const int col = item.point.y(); if (row < minRow || row > maxRow || col < minCol || col > maxCol) diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index ddea546e..8e39ee11 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -118,7 +118,7 @@ public: void updateSeries(const QList &seriesList); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); void updateRows(const QVector &rows); - void updateItems(const QVector &points); + void updateItems(const QVector &items); void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 05c0efe7..2d38a4a7 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -71,6 +71,12 @@ void Scatter3DController::synchDataToRenderer() Abstract3DController::synchDataToRenderer(); // Notify changes to renderer + if (m_changeTracker.itemChanged) { + m_renderer->updateItems(m_changedItems); + m_changeTracker.itemChanged = false; + m_changedItems.clear(); + } + if (m_changeTracker.selectedItemChanged) { m_renderer->updateSelectedItem(m_selectedItem, m_selectedItemSeries); m_changeTracker.selectedItemChanged = false; @@ -144,17 +150,35 @@ void Scatter3DController::handleItemsAdded(int startIndex, int count) void Scatter3DController::handleItemsChanged(int startIndex, int count) { - Q_UNUSED(startIndex) - Q_UNUSED(count) QScatter3DSeries *series = static_cast(sender())->series(); - if (series->isVisible()) { - adjustAxisRanges(); - m_isDataDirty = true; - series->d_ptr->markItemLabelDirty(); + int oldChangeCount = m_changedItems.size(); + if (!oldChangeCount) + m_changedItems.reserve(count); + + for (int i = 0; i < count; i++) { + bool newItem = true; + int candidate = startIndex + i; + for (int j = 0; j < oldChangeCount; j++) { + const ChangeItem &oldChangeItem = m_changedItems.at(j); + if (oldChangeItem.index == candidate && series == oldChangeItem.series) { + newItem = false; + break; + } + } + if (newItem) { + ChangeItem newChangeItem = {series, candidate}; + m_changedItems.append(newChangeItem); + if (series == m_selectedItemSeries && m_selectedItem == candidate) + series->d_ptr->markItemLabelDirty(); + } + } + + if (count) { + m_changeTracker.itemChanged = true; + if (series->isVisible()) + adjustAxisRanges(); + emitNeedRender(); } - if (!m_changedSeriesList.contains(series)) - m_changedSeriesList.append(series); - emitNeedRender(); } void Scatter3DController::handleItemsRemoved(int startIndex, int count) diff --git a/src/datavisualization/engine/scatter3dcontroller_p.h b/src/datavisualization/engine/scatter3dcontroller_p.h index 1194bc3a..db5a95f5 100644 --- a/src/datavisualization/engine/scatter3dcontroller_p.h +++ b/src/datavisualization/engine/scatter3dcontroller_p.h @@ -40,9 +40,11 @@ class QScatter3DSeries; struct Scatter3DChangeBitField { bool selectedItemChanged : 1; + bool itemChanged : 1; Scatter3DChangeBitField() : - selectedItemChanged(true) + selectedItemChanged(true), + itemChanged(false) { } }; @@ -51,8 +53,14 @@ class QT_DATAVISUALIZATION_EXPORT Scatter3DController : public Abstract3DControl { Q_OBJECT +public: + struct ChangeItem { + QScatter3DSeries *series; + int index; + }; private: Scatter3DChangeBitField m_changeTracker; + QVector m_changedItems; // Rendering Scatter3DRenderer *m_renderer; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3f91e9c3..c1705179 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -165,12 +165,6 @@ void Scatter3DRenderer::initializeOpenGL() void Scatter3DRenderer::updateData() { calculateSceneScalingFactors(); - float minX = float(m_axisCacheX.min()); - float maxX = float(m_axisCacheX.max()); - float minY = float(m_axisCacheY.min()); - float maxY = float(m_axisCacheY.max()); - float minZ = float(m_axisCacheZ.min()); - float maxZ = float(m_axisCacheZ.max()); int totalDataSize = 0; foreach (SeriesRenderCache *baseCache, m_renderCacheList) { @@ -185,23 +179,8 @@ void Scatter3DRenderer::updateData() if (dataSize != renderArray.size()) renderArray.resize(dataSize); - for (int i = 0; i < dataSize; i++) { - QVector3D dotPos = dataArray.at(i).position(); - ScatterRenderItem &renderItem = renderArray[i]; - if ((dotPos.x() >= minX && dotPos.x() <= maxX ) - && (dotPos.y() >= minY && dotPos.y() <= maxY) - && (dotPos.z() >= minZ && dotPos.z() <= maxZ)) { - renderItem.setPosition(dotPos); - renderItem.setVisible(true); - if (!dataArray.at(i).rotation().isIdentity()) - renderItem.setRotation(dataArray.at(i).rotation().normalized()); - else - renderItem.setRotation(identityQuaternion); - calculateTranslation(renderItem); - } else { - renderItem.setVisible(false); - } - } + for (int i = 0; i < dataSize; i++) + updateRenderItem(dataArray.at(i), renderArray[i]); cache->setDataDirty(false); } } @@ -272,6 +251,30 @@ SeriesRenderCache *Scatter3DRenderer::createNewCache(QAbstract3DSeries *series) return new ScatterSeriesRenderCache(series, this); } +void Scatter3DRenderer::updateItems(const QVector &items) +{ + ScatterSeriesRenderCache *cache = 0; + const QScatter3DSeries *prevSeries = 0; + const QScatterDataArray *dataArray = 0; + + foreach (Scatter3DController::ChangeItem item, items) { + QScatter3DSeries *currentSeries = item.series; + if (currentSeries != prevSeries) { + cache = static_cast(m_renderCacheList.value(currentSeries)); + prevSeries = currentSeries; + dataArray = item.series->dataProxy()->array(); + // Invisible series render caches are not updated, but instead just marked dirty, so that + // they can be completely recalculated when they are turned visible. + if (!cache->isVisible() && !cache->dataDirty()) + cache->setDataDirty(true); + } + if (cache->isVisible()) { + const int index = item.index; + updateRenderItem(dataArray->at(index), cache->renderArray()[index]); + } + } +} + void Scatter3DRenderer::updateScene(Q3DScene *scene) { scene->activeCamera()->d_ptr->setMinYRotation(-90.0f); @@ -1802,6 +1805,24 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, series = 0; } +void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, ScatterRenderItem &renderItem) +{ + QVector3D dotPos = dataItem.position(); + if ((dotPos.x() >= m_axisCacheX.min() && dotPos.x() <= m_axisCacheX.max() ) + && (dotPos.y() >= m_axisCacheY.min() && dotPos.y() <= m_axisCacheY.max()) + && (dotPos.z() >= m_axisCacheZ.min() && dotPos.z() <= m_axisCacheZ.max())) { + renderItem.setPosition(dotPos); + renderItem.setVisible(true); + if (!dataItem.rotation().isIdentity()) + renderItem.setRotation(dataItem.rotation().normalized()); + else + renderItem.setRotation(identityQuaternion); + calculateTranslation(renderItem); + } else { + renderItem.setVisible(false); + } +} + QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position) { float xTrans = m_axisCacheX.positionAt(position.x()); float yTrans = m_axisCacheY.positionAt(position.y()); diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 172d0c46..09b8dace 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -105,6 +105,7 @@ public: void updateData(); void updateSeries(const QList &seriesList); SeriesRenderCache *createNewCache(QAbstract3DSeries *series); + void updateItems(const QVector &items); void updateScene(Q3DScene *scene); QVector3D convertPositionToTranslation(const QVector3D &position); @@ -154,6 +155,7 @@ public slots: private: void selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series); + inline void updateRenderItem(const QScatterDataItem &dataItem, ScatterRenderItem &renderItem); }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 78bab934..82d025aa 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -123,6 +123,9 @@ int main(int argc, char **argv) QPushButton *massiveDataTestButton = new QPushButton(widget); massiveDataTestButton->setText(QStringLiteral("Massive data test")); + QPushButton *testItemChangesButton = new QPushButton(widget); + testItemChangesButton->setText(QStringLiteral("Test Item changing")); + QLinearGradient grBtoY(0, 0, 100, 0); grBtoY.setColorAt(1.0, Qt::black); grBtoY.setColorAt(0.67, Qt::blue); @@ -137,6 +140,12 @@ int main(int argc, char **argv) gradientBtoYPB->setIcon(QIcon(pm)); gradientBtoYPB->setIconSize(QSize(100, 24)); + QLabel *fpsLabel = new QLabel(QStringLiteral("")); + + QCheckBox *fpsCheckBox = new QCheckBox(widget); + fpsCheckBox->setText(QStringLiteral("Measure Fps")); + fpsCheckBox->setChecked(false); + QCheckBox *backgroundCheckBox = new QCheckBox(widget); backgroundCheckBox->setText(QStringLiteral("Show background")); backgroundCheckBox->setChecked(true); @@ -232,9 +241,12 @@ int main(int argc, char **argv) vLayout->addWidget(toggleSeriesVisibilityButton, 0, Qt::AlignTop); vLayout->addWidget(changeSeriesNameButton, 0, Qt::AlignTop); vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); - vLayout->addWidget(massiveDataTestButton, 1, Qt::AlignTop); + vLayout->addWidget(massiveDataTestButton, 0, Qt::AlignTop); + vLayout->addWidget(testItemChangesButton, 1, Qt::AlignTop); vLayout2->addWidget(gradientBtoYPB, 0, Qt::AlignTop); + vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop); + vLayout2->addWidget(fpsCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(backgroundCheckBox); vLayout2->addWidget(gridCheckBox); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); @@ -302,6 +314,8 @@ int main(int argc, char **argv) &ScatterDataModifier::startStopTimer); QObject::connect(massiveDataTestButton, &QPushButton::clicked, modifier, &ScatterDataModifier::massiveDataTest); + QObject::connect(testItemChangesButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::testItemChanges); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, &ScatterDataModifier::setGradient); QObject::connect(themeButton, &QPushButton::clicked, modifier, @@ -316,6 +330,8 @@ int main(int argc, char **argv) QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier, &ScatterDataModifier::changeFont); + QObject::connect(fpsCheckBox, &QCheckBox::stateChanged, modifier, + &ScatterDataModifier::setFpsMeasurement); QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier, &ScatterDataModifier::setBackgroundEnabled); QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier, @@ -335,6 +351,8 @@ int main(int argc, char **argv) &ScatterDataModifier::setMaxZ); + modifier->setFpsLabel(fpsLabel); + modifier->start(); return app.exec(); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index c9404736..13a0f040 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -134,7 +134,6 @@ void ScatterDataModifier::massiveDataTest() xAxis->setSegmentCount(1); yAxis->setSegmentCount(1); zAxis->setSegmentCount(1); - m_chart->setMeasureFps(true); m_chart->setAxisX(xAxis); m_chart->setAxisY(yAxis); m_chart->setAxisZ(zAxis); @@ -231,6 +230,187 @@ void ScatterDataModifier::massiveTestAppendAndScroll() m_chart->axisZ()->setRange(min, max); } +void ScatterDataModifier::setFpsMeasurement(bool enable) +{ + m_chart->setMeasureFps(enable); +} + +void ScatterDataModifier::testItemChanges() +{ + static int counter = 0; + const int rowCount = 12; + const int colCount = 10; + static QScatter3DSeries *series0 = 0; + static QScatter3DSeries *series1 = 0; + static QScatter3DSeries *series2 = 0; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test"; + foreach (QScatter3DSeries *series, m_chart->seriesList()) + m_chart->removeSeries(series); + foreach (QValue3DAxis *axis, m_chart->axes()) + m_chart->releaseAxis(axis); + delete series0; + delete series1; + delete series2; + series0 = new QScatter3DSeries; + series1 = new QScatter3DSeries; + series2 = new QScatter3DSeries; + populateFlatSeries(series0, rowCount, colCount, 10.0f); + populateFlatSeries(series1, rowCount, colCount, 30.0f); + populateFlatSeries(series2, rowCount, colCount, 50.0f); + m_chart->axisX()->setRange(3.0f, 6.0f); + m_chart->axisY()->setRange(0.0f, 100.0f); + m_chart->axisZ()->setRange(4.0f, 8.0f); + m_chart->addSeries(series0); + m_chart->addSeries(series1); + m_chart->addSeries(series2); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Change single item, unselected"; + int itemIndex = 3 * colCount + 5; + QScatterDataItem item = *series0->dataProxy()->itemAt(itemIndex); + item.setY(75.0f); + series0->dataProxy()->setItem(itemIndex, item); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Change single item, selected"; + int itemIndex = 4 * colCount + 4; + series1->setSelectedItem(itemIndex); + QScatterDataItem item = *series1->dataProxy()->itemAt(itemIndex); + item.setY(75.0f); + series1->dataProxy()->setItem(itemIndex, item); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Change item outside visible area"; + int itemIndex = 2; + QScatterDataItem item = *series1->dataProxy()->itemAt(itemIndex); + item.setY(75.0f); + series1->dataProxy()->setItem(itemIndex, item); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, unselected"; + int itemIndex = 4 * colCount + 6; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex); + item0.setY(65.0f); + item1.setY(85.0f); + series0->dataProxy()->setItem(itemIndex, item0); + series1->dataProxy()->setItem(itemIndex, item1); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, one selected"; + int itemIndex0 = 5 * colCount + 5; + int itemIndex1 = 4 * colCount + 4; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex0); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex1); + item0.setY(65.0f); + item1.setY(85.0f); + series0->dataProxy()->setItem(itemIndex0, item0); + series1->dataProxy()->setItem(itemIndex1, item1); + } + break; + case 6: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, one outside range"; + int itemIndex0 = 6 * colCount + 6; + int itemIndex1 = 9 * colCount + 2; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex0); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex1); + item0.setY(65.0f); + item1.setY(85.0f); + series0->dataProxy()->setItem(itemIndex0, item0); + series1->dataProxy()->setItem(itemIndex1, item1); + } + break; + case 7: { + qDebug() << __FUNCTION__ << counter << "Change single item from two series, both outside range"; + int itemIndex0 = 1 * colCount + 3; + int itemIndex1 = 9 * colCount + 2; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex0); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex1); + item0.setY(65.0f); + item1.setY(85.0f); + series0->dataProxy()->setItem(itemIndex0, item0); + series1->dataProxy()->setItem(itemIndex1, item1); + } + break; + case 8: { + qDebug() << __FUNCTION__ << counter << "Change item to same value as previously"; + int itemIndex0 = 5 * colCount + 7; + int itemIndex1 = 4 * colCount + 7; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex0); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex1); + series0->dataProxy()->setItem(itemIndex0, item0); + series1->dataProxy()->setItem(itemIndex1, item1); + } + break; + case 9: { + qDebug() << __FUNCTION__ << counter << "Change 3 items on each series"; + int itemIndex0 = 5 * colCount + 6; + int itemIndex1 = 4 * colCount + 6; + QScatterDataItem item00 = *series0->dataProxy()->itemAt(itemIndex0); + QScatterDataItem item01 = *series0->dataProxy()->itemAt(itemIndex0 + 1); + QScatterDataItem item02 = *series0->dataProxy()->itemAt(itemIndex0 + 2); + QScatterDataItem item10 = *series1->dataProxy()->itemAt(itemIndex1); + QScatterDataItem item11 = *series1->dataProxy()->itemAt(itemIndex1 + 1); + QScatterDataItem item12 = *series1->dataProxy()->itemAt(itemIndex1 + 2); + item00.setY(65.0f); + item01.setY(70.0f); + item02.setY(75.0f); + item10.setY(80.0f); + item11.setY(85.0f); + item12.setY(90.0f); + series0->dataProxy()->setItem(itemIndex0, item00); + series0->dataProxy()->setItem(itemIndex0 + 1, item01); + series0->dataProxy()->setItem(itemIndex0 + 2, item02); + series1->dataProxy()->setItem(itemIndex1, item10); + series1->dataProxy()->setItem(itemIndex1 + 1, item11); + series1->dataProxy()->setItem(itemIndex1 + 2, item12); + } + break; + case 10: { + qDebug() << __FUNCTION__ << counter << "Level the field single item at a time"; + QScatterDataItem item; + for (int i = 0; i < rowCount; i++) { + for (int j = 0; j < colCount; j++) { + int itemIndex = i * colCount + j; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex); + QScatterDataItem item1 = *series1->dataProxy()->itemAt(itemIndex); + QScatterDataItem item2 = *series2->dataProxy()->itemAt(itemIndex); + item0.setY(10.0f); + item1.setY(15.0f); + item2.setY(20.0f); + series0->dataProxy()->setItem(itemIndex, item0); + series1->dataProxy()->setItem(itemIndex, item1); + series2->dataProxy()->setItem(itemIndex, item2); + } + } + } + break; + case 11: { + qDebug() << __FUNCTION__ << counter << "Change same items multiple times"; + int itemIndex0 = 6 * colCount + 6; + QScatterDataItem item0 = *series0->dataProxy()->itemAt(itemIndex0); + item0.setY(90.0f); + series0->dataProxy()->setItem(itemIndex0, item0); + series0->dataProxy()->setItem(itemIndex0, item0); + series0->dataProxy()->setItem(itemIndex0, item0); + series0->dataProxy()->setItem(itemIndex0, item0); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void ScatterDataModifier::addData() { // Add labels @@ -673,7 +853,8 @@ void ScatterDataModifier::handleAxisZChanged(QValue3DAxis *axis) void ScatterDataModifier::handleFpsChange(qreal fps) { - qDebug() << "FPS:" << fps; + static const QString fpsPrefix(QStringLiteral("FPS: ")); + m_fpsLabel->setText(fpsPrefix + QString::number(qRound(fps))); } void ScatterDataModifier::changeShadowQuality(int quality) @@ -757,3 +938,15 @@ QScatter3DSeries *ScatterDataModifier::createAndAddSeries() return series; } + +void ScatterDataModifier::populateFlatSeries(QScatter3DSeries *series, int rows, int columns, + float value) +{ + QScatterDataArray *dataArray = new QScatterDataArray; + dataArray->resize(rows * columns); + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) + (*dataArray)[i * columns + j].setPosition(QVector3D(float(i), value, float(j))); + } + series->dataProxy()->resetArray(dataArray); +} diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 66f69625..f239cb73 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -25,6 +25,7 @@ #include #include #include +#include using namespace QtDataVisualization; @@ -55,6 +56,9 @@ public: void massiveDataTest(); void massiveTestScroll(); void massiveTestAppendAndScroll(); + void setFpsMeasurement(bool enable); + void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } + void testItemChanges(); public slots: void changeShadowQuality(int quality); @@ -91,6 +95,7 @@ signals: private: QVector3D randVector(); QScatter3DSeries *createAndAddSeries(); + void populateFlatSeries(QScatter3DSeries *series, int rows, int columns, float value); Q3DScatter *m_chart; int m_fontSize; @@ -99,6 +104,7 @@ private: int m_selectedItem; QScatter3DSeries *m_targetSeries; QScatterDataArray m_massiveTestCacheArray; + QLabel *m_fpsLabel; }; #endif -- cgit v1.2.3 From dcb83cfdc0e6c8e92df0ca2aacfd34c0ca276e2e Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 May 2014 13:02:57 +0300 Subject: Optimize single item changes in bar/surface item models. We are only able to optimize this in cases where rows and columns of the model are directly mapped to rows and columns of the data proxy. In other cases we do not know if the new values of the changed data item in the model actually specify the same row/column in our data proxy as the previous values. Task-number: QTRD-2190 Change-Id: Ie014469ac894474900e5cfd6d91fd1a60353b1f7 Reviewed-by: Titta Heikkala --- src/datavisualization/data/baritemmodelhandler.cpp | 50 +++- src/datavisualization/data/baritemmodelhandler_p.h | 6 + .../data/scatteritemmodelhandler.cpp | 6 +- .../data/surfaceitemmodelhandler.cpp | 78 ++++-- .../data/surfaceitemmodelhandler_p.h | 7 + src/datavisualization/engine/bars3dcontroller.cpp | 6 +- src/datavisualization/engine/bars3drenderer.cpp | 13 +- tests/itemmodeltest/itemmodeltest.pro | 11 + tests/itemmodeltest/main.cpp | 293 +++++++++++++++++++++ tests/tests.pro | 3 +- 10 files changed, 439 insertions(+), 34 deletions(-) create mode 100644 tests/itemmodeltest/itemmodeltest.pro create mode 100644 tests/itemmodeltest/main.cpp diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index 4f44fe1d..3b02c1e3 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -26,7 +26,9 @@ BarItemModelHandler::BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject : AbstractItemModelHandler(parent), m_proxy(proxy), m_proxyArray(0), - m_columnCount(0) + m_columnCount(0), + m_valueRole(noRoleIndex), + m_rotationRole(noRoleIndex) { } @@ -34,6 +36,34 @@ BarItemModelHandler::~BarItemModelHandler() { } +void BarItemModelHandler::handleDataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight, + const QVector &roles) +{ + // Do nothing if full reset already pending + if (!m_fullReset) { + if (!m_proxy->useModelCategories()) { + // If the data model doesn't directly map rows and columns, we cannot optimize + AbstractItemModelHandler::handleDataChanged(topLeft, bottomRight, roles); + } else { + int startRow = qMin(topLeft.row(), bottomRight.row()); + int endRow = qMax(topLeft.row(), bottomRight.row()); + int startCol = qMin(topLeft.column(), bottomRight.column()); + int endCol = qMax(topLeft.column(), bottomRight.column()); + + for (int i = startRow; i <= endRow; i++) { + for (int j = startCol; j <= endCol; j++) { + QBarDataItem item; + item.setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat()); + if (m_rotationRole != noRoleIndex) + item.setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat()); + m_proxy->setItem(i, j, item); + } + } + } + } +} + // Resolve entire item model into QBarDataArray. void BarItemModelHandler::resolveModel() { @@ -54,8 +84,8 @@ void BarItemModelHandler::resolveModel() QHash roleHash = m_itemModel->roleNames(); // Default value role to display role if no mapping - int valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole); - int rotationRole = roleHash.key(m_proxy->rotationRole().toLatin1(), noRoleIndex); + m_valueRole = roleHash.key(m_proxy->valueRole().toLatin1(), Qt::DisplayRole); + m_rotationRole = roleHash.key(m_proxy->rotationRole().toLatin1(), noRoleIndex); int rowCount = m_itemModel->rowCount(); int columnCount = m_itemModel->columnCount(); @@ -71,9 +101,9 @@ void BarItemModelHandler::resolveModel() for (int i = 0; i < rowCount; i++) { QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnCount; j++) { - newProxyRow[j].setValue(m_itemModel->index(i, j).data(valueRole).toReal()); - if (rotationRole != noRoleIndex) - newProxyRow[j].setRotation(m_itemModel->index(i, j).data(rotationRole).toReal()); + newProxyRow[j].setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat()); + if (m_rotationRole != noRoleIndex) + newProxyRow[j].setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat()); } } // Generate labels from headers if using model rows/columns @@ -104,9 +134,9 @@ void BarItemModelHandler::resolveModel() QModelIndex index = m_itemModel->index(i, j); QString rowRoleStr = index.data(rowRole).toString(); QString columnRoleStr = index.data(columnRole).toString(); - itemValueMap[rowRoleStr][columnRoleStr] = index.data(valueRole).toReal(); - if (rotationRole != noRoleIndex) - itemRotationMap[rowRoleStr][columnRoleStr] = index.data(rotationRole).toReal(); + itemValueMap[rowRoleStr][columnRoleStr] = index.data(m_valueRole).toFloat(); + if (m_rotationRole != noRoleIndex) + itemRotationMap[rowRoleStr][columnRoleStr] = index.data(m_rotationRole).toFloat(); if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); rowList << rowRoleStr; @@ -142,7 +172,7 @@ void BarItemModelHandler::resolveModel() QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnList.size(); j++) { newProxyRow[j].setValue(itemValueMap[rowKey][columnList.at(j)]); - if (rotationRole != noRoleIndex) + if (m_rotationRole != noRoleIndex) newProxyRow[j].setRotation(itemRotationMap[rowKey][columnList.at(j)]); } } diff --git a/src/datavisualization/data/baritemmodelhandler_p.h b/src/datavisualization/data/baritemmodelhandler_p.h index 7bf7b0a1..737e0055 100644 --- a/src/datavisualization/data/baritemmodelhandler_p.h +++ b/src/datavisualization/data/baritemmodelhandler_p.h @@ -41,12 +41,18 @@ public: BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject *parent = 0); virtual ~BarItemModelHandler(); +public slots: + virtual void handleDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, + const QVector &roles = QVector ()); + protected: void virtual resolveModel(); QItemModelBarDataProxy *m_proxy; // Not owned QBarDataArray *m_proxyArray; // Not owned int m_columnCount; + int m_valueRole; + int m_rotationRole; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/scatteritemmodelhandler.cpp b/src/datavisualization/data/scatteritemmodelhandler.cpp index 08ed12f3..280f2a23 100644 --- a/src/datavisualization/data/scatteritemmodelhandler.cpp +++ b/src/datavisualization/data/scatteritemmodelhandler.cpp @@ -25,7 +25,11 @@ static const int noRoleIndex = -1; ScatterItemModelHandler::ScatterItemModelHandler(QItemModelScatterDataProxy *proxy, QObject *parent) : AbstractItemModelHandler(parent), m_proxy(proxy), - m_proxyArray(0) + m_proxyArray(0), + m_xPosRole(noRoleIndex), + m_yPosRole(noRoleIndex), + m_zPosRole(noRoleIndex), + m_rotationRole(noRoleIndex) { } diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index f4383dbf..584ddf28 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -25,7 +25,10 @@ static const int noRoleIndex = -1; SurfaceItemModelHandler::SurfaceItemModelHandler(QItemModelSurfaceDataProxy *proxy, QObject *parent) : AbstractItemModelHandler(parent), m_proxy(proxy), - m_proxyArray(0) + m_proxyArray(0), + m_xPosRole(noRoleIndex), + m_yPosRole(noRoleIndex), + m_zPosRole(noRoleIndex) { } @@ -33,6 +36,45 @@ SurfaceItemModelHandler::~SurfaceItemModelHandler() { } +void SurfaceItemModelHandler::handleDataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight, + const QVector &roles) +{ + // Do nothing if full reset already pending + if (!m_fullReset) { + if (!m_proxy->useModelCategories()) { + // If the data model doesn't directly map rows and columns, we cannot optimize + AbstractItemModelHandler::handleDataChanged(topLeft, bottomRight, roles); + } else { + int startRow = qMin(topLeft.row(), bottomRight.row()); + int endRow = qMax(topLeft.row(), bottomRight.row()); + int startCol = qMin(topLeft.column(), bottomRight.column()); + int endCol = qMax(topLeft.column(), bottomRight.column()); + + for (int i = startRow; i <= endRow; i++) { + for (int j = startCol; j <= endCol; j++) { + QSurfaceDataItem item; + const QSurfaceDataItem *oldItem = m_proxy->itemAt(i, j); + float xPos; + float zPos; + if (m_xPosRole != noRoleIndex) + xPos = m_itemModel->index(i, j).data(m_xPosRole).toFloat(); + else + xPos = oldItem->x(); + if (m_zPosRole != noRoleIndex) + zPos = m_itemModel->index(i, j).data(m_zPosRole).toFloat(); + else + zPos = oldItem->z(); + item.setPosition(QVector3D(xPos, + m_itemModel->index(i, j).data(m_yPosRole).toFloat(), + zPos)); + m_proxy->setItem(i, j, item); + } + } + } + } +} + // Resolve entire item model into QSurfaceDataArray. void SurfaceItemModelHandler::resolveModel() { @@ -52,9 +94,9 @@ void SurfaceItemModelHandler::resolveModel() QHash roleHash = m_itemModel->roleNames(); // Default to display role if no mapping - int xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex); - int yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), Qt::DisplayRole); - int zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex); + m_xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex); + m_yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), Qt::DisplayRole); + m_zPosRole = roleHash.key(m_proxy->zPosRole().toLatin1(), noRoleIndex); int rowCount = m_itemModel->rowCount(); int columnCount = m_itemModel->columnCount(); @@ -70,10 +112,10 @@ void SurfaceItemModelHandler::resolveModel() for (int i = 0; i < rowCount; i++) { QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnCount; j++) { - float xPos = j; - float zPos = i; - if (xPosRole != noRoleIndex) { - xPos = m_itemModel->index(i, j).data(xPosRole).toFloat(); + float xPos = float(j); + float zPos = float(i); + if (m_xPosRole != noRoleIndex) { + xPos = m_itemModel->index(i, j).data(m_xPosRole).toFloat(); } else { QString header = m_itemModel->headerData(j, Qt::Horizontal).toString(); bool ok = false; @@ -82,8 +124,8 @@ void SurfaceItemModelHandler::resolveModel() xPos = headerValue; } - if (zPosRole != noRoleIndex) { - zPos = m_itemModel->index(i, j).data(zPosRole).toFloat(); + if (m_zPosRole != noRoleIndex) { + zPos = m_itemModel->index(i, j).data(m_zPosRole).toFloat(); } else { QString header = m_itemModel->headerData(i, Qt::Vertical).toString(); bool ok = false; @@ -94,17 +136,17 @@ void SurfaceItemModelHandler::resolveModel() newProxyRow[j].setPosition( QVector3D(xPos, - m_itemModel->index(i, j).data(yPosRole).toFloat(), + m_itemModel->index(i, j).data(m_yPosRole).toFloat(), zPos)); } } } else { int rowRole = roleHash.key(m_proxy->rowRole().toLatin1()); int columnRole = roleHash.key(m_proxy->columnRole().toLatin1()); - if (xPosRole == noRoleIndex) - xPosRole = columnRole; - if (zPosRole == noRoleIndex) - zPosRole = rowRole; + if (m_xPosRole == noRoleIndex) + m_xPosRole = columnRole; + if (m_zPosRole == noRoleIndex) + m_zPosRole = rowRole; bool generateRows = m_proxy->autoRowCategories(); bool generateColumns = m_proxy->autoColumnCategories(); @@ -124,9 +166,9 @@ void SurfaceItemModelHandler::resolveModel() QModelIndex index = m_itemModel->index(i, j); QString rowRoleStr = index.data(rowRole).toString(); QString columnRoleStr = index.data(columnRole).toString(); - QVector3D itemPos(index.data(xPosRole).toReal(), - index.data(yPosRole).toReal(), - index.data(zPosRole).toReal()); + QVector3D itemPos(index.data(m_xPosRole).toFloat(), + index.data(m_yPosRole).toFloat(), + index.data(m_zPosRole).toFloat()); itemValueMap[rowRoleStr][columnRoleStr] = itemPos; if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); diff --git a/src/datavisualization/data/surfaceitemmodelhandler_p.h b/src/datavisualization/data/surfaceitemmodelhandler_p.h index ae426433..dbed0a60 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler_p.h +++ b/src/datavisualization/data/surfaceitemmodelhandler_p.h @@ -41,11 +41,18 @@ public: SurfaceItemModelHandler(QItemModelSurfaceDataProxy *proxy, QObject *parent = 0); virtual ~SurfaceItemModelHandler(); +public slots: + virtual void handleDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, + const QVector &roles = QVector ()); + protected: void virtual resolveModel(); QItemModelSurfaceDataProxy *m_proxy; // Not owned QSurfaceDataArray *m_proxyArray; // Not owned + int m_xPosRole; + int m_yPosRole; + int m_zPosRole; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 99fa8223..35b24218 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -148,7 +148,6 @@ void Bars3DController::handleRowsChanged(int startIndex, int count) if (!oldChangeCount) m_changedRows.reserve(count); - int selectedRow = m_selectedBar.x(); for (int i = 0; i < count; i++) { bool newItem = true; int candidate = startIndex + i; @@ -162,7 +161,7 @@ void Bars3DController::handleRowsChanged(int startIndex, int count) if (newItem) { ChangeRow newChangeItem = {series, candidate}; m_changedRows.append(newChangeItem); - if (series == m_selectedBarSeries && selectedRow == candidate) + if (series == m_selectedBarSeries && m_selectedBar.x() == candidate) series->d_ptr->markItemLabelDirty(); } } @@ -516,7 +515,8 @@ void Bars3DController::setSelectedBar(const QPoint &position, QBar3DSeries *seri adjustSelectionPosition(pos, series); if (selectionMode().testFlag(QAbstract3DGraph::SelectionSlice)) { - // If the selected bar is outside data window, or there is no visible selected bar, disable slicing + // If the selected bar is outside data window, or there is no visible selected bar, + // disable slicing. if (pos.x() < m_axisZ->min() || pos.x() > m_axisZ->max() || pos.y() < m_axisX->min() || pos.y() > m_axisX->max() || !series->isVisible()) { diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index ab7bb4ca..f93d20b6 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -337,8 +337,14 @@ void Bars3DRenderer::updateRows(const QVector &rows if (!cache->isVisible() && !cache->dataDirty()) cache->setDataDirty(true); } - if (cache->isVisible()) + if (cache->isVisible()) { updateRenderRow(dataArray->at(row), cache->renderArray()[row - minRow]); + if (m_cachedIsSlicingActivated + && cache == m_selectedSeriesCache + && m_selectedBarPos.x() == row) { + m_selectionDirty = true; // Need to update slice view + } + } } } @@ -370,6 +376,11 @@ void Bars3DRenderer::updateItems(const QVector &it if (cache->isVisible()) { updateRenderItem(dataArray->at(row)->at(col), cache->renderArray()[row - minRow][col - minCol]); + if (m_cachedIsSlicingActivated + && cache == m_selectedSeriesCache + && m_selectedBarPos == QPoint(row, col)) { + m_selectionDirty = true; // Need to update slice view + } } } } diff --git a/tests/itemmodeltest/itemmodeltest.pro b/tests/itemmodeltest/itemmodeltest.pro new file mode 100644 index 00000000..d1cf0959 --- /dev/null +++ b/tests/itemmodeltest/itemmodeltest.pro @@ -0,0 +1,11 @@ +android|ios { + error( "This test is not supported for android or ios." ) +} + +!include( ../tests.pri ) { + error( "Couldn't find the tests.pri file!" ) +} + +SOURCES += main.cpp + +QT += widgets diff --git a/tests/itemmodeltest/main.cpp b/tests/itemmodeltest/main.cpp new file mode 100644 index 00000000..419ee162 --- /dev/null +++ b/tests/itemmodeltest/main.cpp @@ -0,0 +1,293 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#define USE_STATIC_DATA + +using namespace QtDataVisualization; + +class GraphDataGenerator : public QObject +{ +public: + explicit GraphDataGenerator(Q3DBars *bargraph, Q3DSurface * surfaceGraph, + QTableWidget *tableWidget); + ~GraphDataGenerator(); + + void setupModel(); + void addRow(); + void changeStyle(); + void changePresetCamera(); + void changeTheme(); + void start(); + void selectFromTable(const QPoint &selection); + void selectedFromTable(int currentRow, int currentColumn, int previousRow, int previousColumn); + void fixTableSize(); + void changeSelectedButtonClicked(); + +private: + Q3DBars *m_barGraph; + Q3DSurface *m_surfaceGraph; + QTimer *m_dataTimer; + QTimer *m_styleTimer; + QTimer *m_presetTimer; + QTimer *m_themeTimer; + int m_columnCount; + int m_rowCount; + QTableWidget *m_tableWidget; // not owned +}; + +GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, Q3DSurface * surfaceGraph, + QTableWidget *tableWidget) + : m_barGraph(bargraph), + m_surfaceGraph(surfaceGraph), + m_dataTimer(0), + m_styleTimer(0), + m_presetTimer(0), + m_themeTimer(0), + m_columnCount(100), + m_rowCount(50), + m_tableWidget(tableWidget) +{ + // Set up bar specifications; make the bars as wide as they are deep, + // and add a small space between them + m_barGraph->setBarThickness(1.0f); + m_barGraph->setBarSpacing(QSizeF(0.2, 0.2)); + +#ifndef USE_STATIC_DATA + // Set up sample space; make it as deep as it's wide + m_barGraph->rowAxis()->setRange(0, m_rowCount); + m_barGraph->columnAxis()->setRange(0, m_columnCount); + m_tableWidget->setColumnCount(m_columnCount); + + // Set selection mode to full + m_barGraph->setSelectionMode(QAbstract3DGraph::SelectionItemRowAndColumn); + + // Hide axis labels by explicitly setting one empty string as label list + m_barGraph->rowAxis()->setLabels(QStringList(QString())); + m_barGraph->columnAxis()->setLabels(QStringList(QString())); + + m_barGraph->seriesList().at(0)->setItemLabelFormat(QStringLiteral("@valueLabel")); +#else + // Set selection mode to slice row + m_barGraph->setSelectionMode( + QAbstract3DGraph::SelectionItemAndRow | QAbstract3DGraph::SelectionSlice); + m_surfaceGraph->setSelectionMode( + QAbstract3DGraph::SelectionItemAndRow | QAbstract3DGraph::SelectionSlice); +#endif +} + +GraphDataGenerator::~GraphDataGenerator() +{ + if (m_dataTimer) { + m_dataTimer->stop(); + delete m_dataTimer; + } + delete m_barGraph; + delete m_surfaceGraph; +} + +void GraphDataGenerator::start() +{ +#ifndef USE_STATIC_DATA + m_dataTimer = new QTimer(); + m_dataTimer->setTimerType(Qt::CoarseTimer); + QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::addRow); + m_dataTimer->start(0); + m_tableWidget->setFixedWidth(m_graph->width()); +#else + setupModel(); + + // Table needs to be shown before the size of its headers can be accurately obtained, + // so we postpone it a bit + m_dataTimer = new QTimer(); + m_dataTimer->setSingleShot(true); + QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::fixTableSize); + m_dataTimer->start(0); +#endif +} + +void GraphDataGenerator::setupModel() +{ + // Set up row and column names + QStringList days; + days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday"; + QStringList weeks; + weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5"; + + // Set up data Mon Tue Wed Thu Fri Sat Sun + float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 10.0f}, // week 1 + {0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2 + {1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3 + {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4 + {3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5 + + // Add labels + m_barGraph->rowAxis()->setTitle("Week of year"); + m_barGraph->columnAxis()->setTitle("Day of week"); + m_barGraph->valueAxis()->setTitle("Hours spent on the Internet"); + m_barGraph->valueAxis()->setLabelFormat("%.1f h"); + + m_surfaceGraph->axisZ()->setTitle("Week of year"); + m_surfaceGraph->axisX()->setTitle("Day of week"); + m_surfaceGraph->axisY()->setTitle("Hours spent on the Internet"); + m_surfaceGraph->axisY()->setLabelFormat("%.1f h"); + + m_tableWidget->setRowCount(5); + m_tableWidget->setColumnCount(7); + m_tableWidget->setHorizontalHeaderLabels(days); + m_tableWidget->setVerticalHeaderLabels(weeks); + m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_tableWidget->setCurrentCell(-1, -1); + + for (int week = 0; week < weeks.size(); week++) { + for (int day = 0; day < days.size(); day++) { + QModelIndex index = m_tableWidget->model()->index(week, day); + m_tableWidget->model()->setData(index, hours[week][day]); + } + } +} + +void GraphDataGenerator::addRow() +{ + m_tableWidget->model()->insertRow(0); + if (m_tableWidget->model()->rowCount() > m_rowCount) + m_tableWidget->model()->removeRow(m_rowCount); + for (int i = 0; i < m_columnCount; i++) { + QModelIndex index = m_tableWidget->model()->index(0, i); + m_tableWidget->model()->setData(index, + ((float)i / (float)m_columnCount) / 2.0f + (float)(rand() % 30) / 100.0f); + } + m_tableWidget->resizeColumnsToContents(); +} + +void GraphDataGenerator::selectFromTable(const QPoint &selection) +{ + m_tableWidget->setFocus(); + m_tableWidget->setCurrentCell(selection.x(), selection.y()); +} + +void GraphDataGenerator::selectedFromTable(int currentRow, int currentColumn, + int previousRow, int previousColumn) +{ + Q_UNUSED(previousRow) + Q_UNUSED(previousColumn) + m_barGraph->seriesList().at(0)->setSelectedBar(QPoint(currentRow, currentColumn)); + m_surfaceGraph->seriesList().at(0)->setSelectedPoint(QPoint(currentRow, currentColumn)); +} + +void GraphDataGenerator::fixTableSize() +{ + int width = m_tableWidget->horizontalHeader()->length(); + width += m_tableWidget->verticalHeader()->width(); + m_tableWidget->setFixedWidth(width + 2); + int height = m_tableWidget->verticalHeader()->length(); + height += m_tableWidget->horizontalHeader()->height(); + m_tableWidget->setFixedHeight(height + 2); +} + +void GraphDataGenerator::changeSelectedButtonClicked() +{ + // Change all selected cells to a random value 1-10 + QVariant value = QVariant::fromValue(float((rand() % 10) + 1)); + QList selectedItems = m_tableWidget->selectedItems(); + foreach (QTableWidgetItem *item, selectedItems) + item->setData(Qt::DisplayRole, value); +} + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + Q3DBars *barGraph = new Q3DBars(); + Q3DSurface *surfaceGraph = new Q3DSurface(); + QWidget *barContainer = QWidget::createWindowContainer(barGraph); + QWidget *surfaceContainer = QWidget::createWindowContainer(surfaceGraph); + + barContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + barContainer->setFocusPolicy(Qt::StrongFocus); + surfaceContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + surfaceContainer->setFocusPolicy(Qt::StrongFocus); + + QWidget widget; + QVBoxLayout *mainLayout = new QVBoxLayout(&widget); + QHBoxLayout *graphLayout = new QHBoxLayout(); + QVBoxLayout *buttonLayout = new QVBoxLayout(); + QHBoxLayout *bottomLayout = new QHBoxLayout(); + QTableWidget *tableWidget = new QTableWidget(&widget); + QPushButton *changeSelectedButton = new QPushButton(&widget); + changeSelectedButton->setText(QStringLiteral("Change Selected")); + + buttonLayout->addWidget(changeSelectedButton); + graphLayout->addWidget(barContainer); + graphLayout->addWidget(surfaceContainer); + bottomLayout->addLayout(buttonLayout); + bottomLayout->addWidget(tableWidget); + mainLayout->addLayout(graphLayout); + mainLayout->addLayout(bottomLayout); + + tableWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + tableWidget->setAlternatingRowColors(true); + widget.setWindowTitle(QStringLiteral("Hours spent on the Internet")); + + // Since we are dealing with QTableWidget, the model will already have data sorted properly + // into rows and columns, so we simply set useModelCategories property to true to utilize this. + QItemModelBarDataProxy *barProxy = new QItemModelBarDataProxy(tableWidget->model()); + QItemModelSurfaceDataProxy *surfaceProxy = new QItemModelSurfaceDataProxy(tableWidget->model()); + barProxy->setUseModelCategories(true); + surfaceProxy->setUseModelCategories(true); + QBar3DSeries *barSeries = new QBar3DSeries(barProxy); + QSurface3DSeries *surfaceSeries = new QSurface3DSeries(surfaceProxy); + barSeries->setMesh(QAbstract3DSeries::MeshPyramid); + barGraph->addSeries(barSeries); + surfaceGraph->addSeries(surfaceSeries); + + GraphDataGenerator generator(barGraph, surfaceGraph, tableWidget); + QObject::connect(barSeries, &QBar3DSeries::selectedBarChanged, &generator, + &GraphDataGenerator::selectFromTable); + QObject::connect(surfaceSeries, &QSurface3DSeries::selectedPointChanged, &generator, + &GraphDataGenerator::selectFromTable); + QObject::connect(tableWidget, &QTableWidget::currentCellChanged, &generator, + &GraphDataGenerator::selectedFromTable); + QObject::connect(changeSelectedButton, &QPushButton::clicked, &generator, + &GraphDataGenerator::changeSelectedButtonClicked); + + QSize screenSize = barGraph->screen()->size(); + widget.resize(QSize(screenSize.width() / 2, screenSize.height() / 2)); + widget.show(); + generator.start(); + return app.exec(); +} diff --git a/tests/tests.pro b/tests/tests.pro index 613534e9..7b690c7d 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -14,7 +14,8 @@ SUBDIRS += barstest \ qmldynamicdata \ multigraphs \ directional \ - qmlmultiwindow + qmlmultiwindow \ + itemmodeltest #SUBDIRS += kinectsurface -- cgit v1.2.3 From 370705e2246df38f1c3e83fe7231e61a611738ea Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 2 May 2014 13:20:32 +0300 Subject: Add missing Q_REVISION macros to signals. Qt codes seem to always add Q_REVISION() macro to revisioned properties notify signals, so I assume it is necessary. Change-Id: I08f5f6d4034527020ed37b2a78267874f103d5a0 Reviewed-by: Titta Heikkala --- src/datavisualization/axis/qvalue3daxis.h | 2 +- src/datavisualization/data/qabstract3dseries.h | 4 ++-- src/datavisualizationqml2/abstractdeclarative_p.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/datavisualization/axis/qvalue3daxis.h b/src/datavisualization/axis/qvalue3daxis.h index bb90f6d3..39a4a886 100644 --- a/src/datavisualization/axis/qvalue3daxis.h +++ b/src/datavisualization/axis/qvalue3daxis.h @@ -54,7 +54,7 @@ signals: void segmentCountChanged(int count); void subSegmentCountChanged(int count); void labelFormatChanged(const QString &format); - void formatterChanged(QValue3DAxisFormatter *formatter); + Q_REVISION(1) void formatterChanged(QValue3DAxisFormatter *formatter); protected: QValue3DAxisPrivate *dptr(); diff --git a/src/datavisualization/data/qabstract3dseries.h b/src/datavisualization/data/qabstract3dseries.h index 55254904..87c4f3c1 100644 --- a/src/datavisualization/data/qabstract3dseries.h +++ b/src/datavisualization/data/qabstract3dseries.h @@ -140,8 +140,8 @@ signals: void multiHighlightColorChanged(const QColor &color); void multiHighlightGradientChanged(const QLinearGradient &gradient); void nameChanged(const QString &name); - void itemLabelChanged(const QString &label); - void itemLabelVisibilityChanged(bool visible); + Q_REVISION(1) void itemLabelChanged(const QString &label); + Q_REVISION(1) void itemLabelVisibilityChanged(bool visible); protected: QScopedPointer d_ptr; diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 3bae3723..d5ad8836 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -181,8 +181,8 @@ signals: void inputHandlerChanged(QAbstract3DInputHandler *inputHandler); void themeChanged(Q3DTheme *theme); void renderingModeChanged(AbstractDeclarative::RenderingMode mode); - void measureFpsChanged(bool enabled); - void currentFpsChanged(qreal fps); + Q_REVISION(1) void measureFpsChanged(bool enabled); + Q_REVISION(1) void currentFpsChanged(qreal fps); private: QPointer m_controller; -- cgit v1.2.3 From d6c1aadb3ee366ce8fd40da43fb65128ab3b2d44 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Sat, 3 May 2014 14:57:01 +0200 Subject: Fix some simple memory leaks Make sure all GLint arrays get deleted and also with delete []. Change-Id: I5ec46eed85f78aee87696986b96ef02f201a9be3 Reviewed-by: Miikka Heikkinen --- src/datavisualizationqml2/glstatestore.cpp | 16 +++++++--------- src/datavisualizationqml2/glstatestore_p.h | 15 ++++++++------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp index f053078b..6fbd3a34 100644 --- a/src/datavisualizationqml2/glstatestore.cpp +++ b/src/datavisualizationqml2/glstatestore.cpp @@ -50,13 +50,13 @@ GLStateStore::GLStateStore(QOpenGLContext *context, QObject *parent) : #endif m_maxVertexAttribs = qMin(maxVertexAttribs, 2); // Datavis only uses 2 attribs max - m_vertexAttribArrayEnabledStates = new GLint[maxVertexAttribs]; - m_vertexAttribArrayBoundBuffers = new GLint[maxVertexAttribs]; - m_vertexAttribArraySizes = new GLint[maxVertexAttribs]; - m_vertexAttribArrayTypes = new GLint[maxVertexAttribs]; - m_vertexAttribArrayNormalized = new GLint[maxVertexAttribs]; - m_vertexAttribArrayStrides = new GLint[maxVertexAttribs]; - m_vertexAttribArrayOffsets = new GLint[maxVertexAttribs]; + m_vertexAttribArrayEnabledStates.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArrayBoundBuffers.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArraySizes.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArrayTypes.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArrayNormalized.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArrayStrides.reset(new GLint[maxVertexAttribs]); + m_vertexAttribArrayOffsets.reset(new GLint[maxVertexAttribs]); initGLDefaultState(); } @@ -67,8 +67,6 @@ GLStateStore::~GLStateStore() EnumToStringMap::deleteInstance(); m_map = 0; #endif - delete m_vertexAttribArrayEnabledStates; - delete m_vertexAttribArrayBoundBuffers; } void GLStateStore::storeGLState() diff --git a/src/datavisualizationqml2/glstatestore_p.h b/src/datavisualizationqml2/glstatestore_p.h index 14c46c43..c5023657 100644 --- a/src/datavisualizationqml2/glstatestore_p.h +++ b/src/datavisualizationqml2/glstatestore_p.h @@ -32,6 +32,7 @@ #include #include #include +#include #include "enumtostringmap_p.h" class GLStateStore : public QObject, protected QOpenGLFunctions @@ -66,13 +67,13 @@ public: GLboolean m_isDepthWriteEnabled; GLint m_currentProgram; GLint m_maxVertexAttribs; - GLint *m_vertexAttribArrayEnabledStates; - GLint *m_vertexAttribArrayBoundBuffers; - GLint *m_vertexAttribArraySizes; - GLint *m_vertexAttribArrayTypes; - GLint *m_vertexAttribArrayNormalized; - GLint *m_vertexAttribArrayStrides; - GLint *m_vertexAttribArrayOffsets; + QScopedArrayPointer m_vertexAttribArrayEnabledStates; + QScopedArrayPointer m_vertexAttribArrayBoundBuffers; + QScopedArrayPointer m_vertexAttribArraySizes; + QScopedArrayPointer m_vertexAttribArrayTypes; + QScopedArrayPointer m_vertexAttribArrayNormalized; + QScopedArrayPointer m_vertexAttribArrayStrides; + QScopedArrayPointer m_vertexAttribArrayOffsets; GLint m_activeTexture; GLint m_texBinding2D; -- cgit v1.2.3 From 8ff45fe94c3f3f6916f8f673c3ce0b574a69cfdf Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 6 May 2014 09:52:24 +0300 Subject: Value axis reversing support Task-number: QTRD-2428 Change-Id: I51b3a1f8f974d5b72b36ee1188b7557539b9609b Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- examples/datavisualization/bars/graphmodifier.cpp | 5 + examples/datavisualization/bars/graphmodifier.h | 1 + examples/datavisualization/bars/main.cpp | 7 ++ src/datavisualization/axis/qvalue3daxis.cpp | 33 ++++- src/datavisualization/axis/qvalue3daxis.h | 5 + src/datavisualization/axis/qvalue3daxis_p.h | 1 + .../engine/abstract3dcontroller.cpp | 54 +++++++++ .../engine/abstract3dcontroller_p.h | 8 ++ .../engine/abstract3drenderer.cpp | 8 ++ .../engine/abstract3drenderer_p.h | 2 + src/datavisualization/engine/axisrendercache.cpp | 20 ++- src/datavisualization/engine/axisrendercache_p.h | 8 +- src/datavisualization/engine/bars3dcontroller.cpp | 14 +++ src/datavisualization/engine/bars3drenderer.cpp | 135 ++++++++++++--------- src/datavisualization/engine/bars3drenderer_p.h | 4 +- src/datavisualization/engine/q3dscene.h | 1 + src/datavisualization/engine/surface3drenderer.cpp | 6 + tests/barstest/chart.cpp | 5 + tests/barstest/chart.h | 1 + tests/barstest/main.cpp | 7 ++ tests/scattertest/main.cpp | 8 +- tests/scattertest/scatterchart.cpp | 80 ++++++++++++ tests/scattertest/scatterchart.h | 3 + tests/surfacetest/graphmodifier.cpp | 83 +++++++++++++ tests/surfacetest/graphmodifier.h | 3 + tests/surfacetest/main.cpp | 8 +- 26 files changed, 440 insertions(+), 70 deletions(-) diff --git a/examples/datavisualization/bars/graphmodifier.cpp b/examples/datavisualization/bars/graphmodifier.cpp index 5df4066c..d19910ec 100644 --- a/examples/datavisualization/bars/graphmodifier.cpp +++ b/examples/datavisualization/bars/graphmodifier.cpp @@ -278,3 +278,8 @@ void GraphModifier::setSeriesVisibility(int enabled) { m_secondarySeries->setVisible(bool(enabled)); } + +void GraphModifier::setReverseValueAxis(int enabled) +{ + m_graph->valueAxis()->setReversed(enabled); +} diff --git a/examples/datavisualization/bars/graphmodifier.h b/examples/datavisualization/bars/graphmodifier.h index cac002a1..e1aacaf7 100644 --- a/examples/datavisualization/bars/graphmodifier.h +++ b/examples/datavisualization/bars/graphmodifier.h @@ -48,6 +48,7 @@ public: void setGridEnabled(int enabled); void setSmoothBars(int smooth); void setSeriesVisibility(int enabled); + void setReverseValueAxis(int enabled); public slots: void changeRange(int range); diff --git a/examples/datavisualization/bars/main.cpp b/examples/datavisualization/bars/main.cpp index e6461202..79b2967a 100644 --- a/examples/datavisualization/bars/main.cpp +++ b/examples/datavisualization/bars/main.cpp @@ -132,6 +132,10 @@ int main(int argc, char **argv) seriesCheckBox->setText(QStringLiteral("Show second series")); seriesCheckBox->setChecked(false); + QCheckBox *reverseValueAxisCheckBox = new QCheckBox(widget); + reverseValueAxisCheckBox->setText(QStringLiteral("Reverse value axis")); + reverseValueAxisCheckBox->setChecked(false); + //! [4] QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget); rotationSliderX->setTickInterval(30); @@ -191,6 +195,7 @@ int main(int argc, char **argv) vLayout->addWidget(gridCheckBox); vLayout->addWidget(smoothCheckBox); vLayout->addWidget(seriesCheckBox); + vLayout->addWidget(reverseValueAxisCheckBox); vLayout->addWidget(new QLabel(QStringLiteral("Show year"))); vLayout->addWidget(rangeList); vLayout->addWidget(new QLabel(QStringLiteral("Change bar style"))); @@ -228,6 +233,8 @@ int main(int argc, char **argv) &GraphModifier::setSmoothBars); QObject::connect(seriesCheckBox, &QCheckBox::stateChanged, modifier, &GraphModifier::setSeriesVisibility); + QObject::connect(reverseValueAxisCheckBox, &QCheckBox::stateChanged, modifier, + &GraphModifier::setReverseValueAxis); QObject::connect(modifier, &GraphModifier::backgroundEnabledChanged, backgroundCheckBox, &QCheckBox::setChecked); diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 79d374ea..1c7b647a 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -82,6 +82,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * */ +/*! + * \qmlproperty bool ValueAxis3D::reversed + * \since QtDataVisualization 1.1 + * + * If \c{true}, the axis will be rendered in reverse, i.e. the positions of minimum and maximum + * values are swapped when the graph is rendered. This property doesn't affect the actual + * minimum and maximum values of the axis. + */ + /*! * Constructs QValue3DAxis with the given \a parent. */ @@ -203,6 +212,27 @@ QValue3DAxisFormatter *QValue3DAxis::formatter() const return dptrc()->m_formatter; } +/*! + * \property QValue3DAxis::reversed + * \since Qt Data Visualization 1.1 + * + * If \c{true}, the axis will be rendered in reverse, i.e. the positions of minimum and maximum + * values are swapped when the graph is rendered. This property doesn't affect the actual + * minimum and maximum values of the axis. + */ +void QValue3DAxis::setReversed(bool enable) +{ + if (dptr()->m_reversed != enable) { + dptr()->m_reversed = enable; + emit reversedChanged(enable); + } +} + +bool QValue3DAxis::reversed() const +{ + return dptrc()->m_reversed; +} + /*! * \internal */ @@ -225,7 +255,8 @@ QValue3DAxisPrivate::QValue3DAxisPrivate(QValue3DAxis *q) m_subSegmentCount(1), m_labelFormat(Utils::defaultLabelFormat()), m_labelsDirty(true), - m_formatter(0) + m_formatter(0), + m_reversed(false) { } diff --git a/src/datavisualization/axis/qvalue3daxis.h b/src/datavisualization/axis/qvalue3daxis.h index 39a4a886..f552269c 100644 --- a/src/datavisualization/axis/qvalue3daxis.h +++ b/src/datavisualization/axis/qvalue3daxis.h @@ -33,6 +33,7 @@ class QT_DATAVISUALIZATION_EXPORT QValue3DAxis : public QAbstract3DAxis Q_PROPERTY(int subSegmentCount READ subSegmentCount WRITE setSubSegmentCount NOTIFY subSegmentCountChanged) Q_PROPERTY(QString labelFormat READ labelFormat WRITE setLabelFormat NOTIFY labelFormatChanged) Q_PROPERTY(QValue3DAxisFormatter* formatter READ formatter WRITE setFormatter NOTIFY formatterChanged REVISION 1) + Q_PROPERTY(bool reversed READ reversed WRITE setReversed NOTIFY reversedChanged REVISION 1) public: explicit QValue3DAxis(QObject *parent = 0); @@ -50,11 +51,15 @@ public: void setFormatter(QValue3DAxisFormatter *formatter); QValue3DAxisFormatter *formatter() const; + void setReversed(bool enable); + bool reversed() const; + signals: void segmentCountChanged(int count); void subSegmentCountChanged(int count); void labelFormatChanged(const QString &format); Q_REVISION(1) void formatterChanged(QValue3DAxisFormatter *formatter); + Q_REVISION(1) void reversedChanged(bool enable); protected: QValue3DAxisPrivate *dptr(); diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index eeccf527..47fd7e06 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -63,6 +63,7 @@ protected: QString m_labelFormat; bool m_labelsDirty; QValue3DAxisFormatter *m_formatter; + bool m_reversed; private: QValue3DAxis *qptr(); diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 31dcab95..2b566a91 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -357,6 +357,33 @@ void Abstract3DController::synchDataToRenderer() } } + if (m_changeTracker.axisXReversedChanged) { + m_changeTracker.axisXReversedChanged = false; + if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisX = static_cast(m_axisX); + m_renderer->updateAxisReversed(QAbstract3DAxis::AxisOrientationX, + valueAxisX->reversed()); + } + } + + if (m_changeTracker.axisYReversedChanged) { + m_changeTracker.axisYReversedChanged = false; + if (m_axisY->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisY = static_cast(m_axisY); + m_renderer->updateAxisReversed(QAbstract3DAxis::AxisOrientationY, + valueAxisY->reversed()); + } + } + + if (m_changeTracker.axisZReversedChanged) { + m_changeTracker.axisZReversedChanged = false; + if (m_axisZ->type() & QAbstract3DAxis::AxisTypeValue) { + QValue3DAxis *valueAxisZ = static_cast(m_axisZ); + m_renderer->updateAxisReversed(QAbstract3DAxis::AxisOrientationZ, + valueAxisZ->reversed()); + } + } + if (m_changedSeriesList.size()) { m_renderer->modifiedSeriesList(m_changedSeriesList); m_changedSeriesList.clear(); @@ -985,6 +1012,12 @@ void Abstract3DController::handleAxisLabelFormatChanged(const QString &format) handleAxisLabelFormatChangedBySender(sender()); } +void Abstract3DController::handleAxisReversedChanged(bool enable) +{ + Q_UNUSED(enable) + handleAxisReversedChangedBySender(sender()); +} + void Abstract3DController::handleAxisFormatterDirty() { handleAxisFormatterDirtyBySender(sender()); @@ -1052,6 +1085,24 @@ void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) emitNeedRender(); } +void Abstract3DController::handleAxisReversedChangedBySender(QObject *sender) +{ + // Reversing change needs to dirty the data so item positions are recalculated + if (sender == m_axisX) { + m_isDataDirty = true; + m_changeTracker.axisXReversedChanged = true; + } else if (sender == m_axisY) { + m_isDataDirty = true; + m_changeTracker.axisYReversedChanged = true; + } else if (sender == m_axisZ) { + m_isDataDirty = true; + m_changeTracker.axisZReversedChanged = true; + } else { + qWarning() << __FUNCTION__ << "invoked for invalid axis"; + } + emitNeedRender(); +} + void Abstract3DController::handleAxisFormatterDirtyBySender(QObject *sender) { // Sender is QValue3DAxisPrivate @@ -1149,12 +1200,15 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient this, &Abstract3DController::handleAxisSubSegmentCountChanged); QObject::connect(valueAxis, &QValue3DAxis::labelFormatChanged, this, &Abstract3DController::handleAxisLabelFormatChanged); + QObject::connect(valueAxis, &QValue3DAxis::reversedChanged, + this, &Abstract3DController::handleAxisReversedChanged); QObject::connect(valueAxis->dptr(), &QValue3DAxisPrivate::formatterDirty, this, &Abstract3DController::handleAxisFormatterDirty); handleAxisSegmentCountChangedBySender(valueAxis); handleAxisSubSegmentCountChangedBySender(valueAxis); handleAxisLabelFormatChangedBySender(valueAxis); + handleAxisReversedChangedBySender(valueAxis); handleAxisFormatterDirtyBySender(valueAxis->dptr()); } } diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 07aa9ca3..78c6c81c 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -76,6 +76,9 @@ struct Abstract3DChangeBitField { bool axisXLabelFormatChanged : 1; bool axisYLabelFormatChanged : 1; bool axisZLabelFormatChanged : 1; + bool axisXReversedChanged : 1; + bool axisYReversedChanged : 1; + bool axisZReversedChanged : 1; bool axisXFormatterChanged : 1; bool axisYFormatterChanged : 1; bool axisZFormatterChanged : 1; @@ -107,6 +110,9 @@ struct Abstract3DChangeBitField { axisXLabelFormatChanged(true), axisYLabelFormatChanged(true), axisZLabelFormatChanged(true), + axisXReversedChanged(true), + axisYReversedChanged(true), + axisZReversedChanged(true), axisXFormatterChanged(true), axisYFormatterChanged(true), axisZFormatterChanged(true) @@ -254,6 +260,7 @@ public: virtual void handleAxisAutoAdjustRangeChangedInOrientation( QAbstract3DAxis::AxisOrientation orientation, bool autoAdjust) = 0; virtual void handleAxisLabelFormatChangedBySender(QObject *sender); + virtual void handleAxisReversedChangedBySender(QObject *sender); virtual void handleAxisFormatterDirtyBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; @@ -269,6 +276,7 @@ public slots: void handleAxisSubSegmentCountChanged(int count); void handleAxisAutoAdjustRangeChanged(bool autoAdjust); void handleAxisLabelFormatChanged(const QString &format); + void handleAxisReversedChanged(bool enable); void handleAxisFormatterDirty(); void handleInputViewChanged(QAbstract3DInputHandler::InputView view); void handleInputPositionChanged(const QPoint &position); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bd19959b..95cecbd3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -333,6 +333,14 @@ void Abstract3DRenderer::updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation axisCacheForOrientation(orientation).setLabelFormat(format); } +void Abstract3DRenderer::updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation, + bool enable) +{ + axisCacheForOrientation(orientation).setReversed(enable); + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); +} + void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, QValue3DAxisFormatter *formatter) { diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index ecbbebac..65dcd8f6 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -103,6 +103,8 @@ public: int count); virtual void updateAxisLabelFormat(QAbstract3DAxis::AxisOrientation orientation, const QString &format); + virtual void updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation, + bool enable); virtual void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, QValue3DAxisFormatter *formatter); virtual void modifiedSeriesList(const QVector &seriesList); diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index 8e78522a..baa733b3 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -29,6 +29,7 @@ AxisRenderCache::AxisRenderCache() m_max(10.0f), m_segmentCount(5), m_subSegmentCount(1), + m_reversed(false), m_font(QFont(QStringLiteral("Arial"))), m_formatter(0), m_ctrlFormatter(0), @@ -129,17 +130,24 @@ void AxisRenderCache::updateAllPositions() int index = 0; int grid = 0; int label = 0; + float position = 0.0f; for (; label < labelCount; label++) { - m_adjustedLabelPositions[label] = - m_formatter->labelPositions().at(label) * m_scale + m_translate; + position = m_formatter->labelPositions().at(label); + if (m_reversed) + position = 1.0f - position; + m_adjustedLabelPositions[label] = position * m_scale + m_translate; } for (; grid < gridCount; grid++) { - m_adjustedGridLinePositions[index++] = - m_formatter->gridPositions().at(grid) * m_scale + m_translate; + position = m_formatter->gridPositions().at(grid); + if (m_reversed) + position = 1.0f - position; + m_adjustedGridLinePositions[index++] = position * m_scale + m_translate; } for (int subGrid = 0; subGrid < subGridCount; subGrid++) { - m_adjustedGridLinePositions[index++] = - m_formatter->subGridPositions().at(subGrid) * m_scale + m_translate; + position = m_formatter->subGridPositions().at(subGrid); + if (m_reversed) + position = 1.0f - position; + m_adjustedGridLinePositions[index++] = position * m_scale + m_translate; } m_positionsDirty = false; diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index f37857d9..800421b1 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -62,6 +62,8 @@ public: inline int subSegmentCount() const { return m_subSegmentCount; } inline void setLabelFormat(const QString &format) { m_labelFormat = format; } inline const QString &labelFormat() const { return m_labelFormat; } + inline void setReversed(bool enable) { m_reversed = enable; m_positionsDirty = true; } + inline bool reversed() const { return m_reversed; } inline void setFormatter(QValue3DAxisFormatter *formatter) { m_formatter = formatter; m_positionsDirty = true; @@ -88,7 +90,10 @@ public: inline float scale() { return m_scale; } inline float positionAt(float value) { - return m_formatter->positionAt(value) * m_scale + m_translate; + if (m_reversed) + return (1.0f - m_formatter->positionAt(value)) * m_scale + m_translate; + else + return m_formatter->positionAt(value) * m_scale + m_translate; } public slots: @@ -106,6 +111,7 @@ private: int m_segmentCount; int m_subSegmentCount; QString m_labelFormat; + bool m_reversed; QFont m_font; QValue3DAxisFormatter *m_formatter; QPointer m_ctrlFormatter; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 35b24218..c394ad2f 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -80,6 +80,13 @@ void Bars3DController::synchDataToRenderer() series->d_ptr->m_changeTracker.meshChanged = true; } + // If y range or reverse changed, scene needs to be updated to update camera limits + bool needSceneUpdate = false; + if (Abstract3DController::m_changeTracker.axisYRangeChanged + || Abstract3DController::m_changeTracker.axisYReversedChanged) { + needSceneUpdate = true; + } + Abstract3DController::synchDataToRenderer(); // Notify changes to renderer @@ -110,6 +117,13 @@ void Bars3DController::synchDataToRenderer() m_renderer->updateSelectedBar(m_selectedBar, m_selectedBarSeries); m_changeTracker.selectedBarChanged = false; } + + if (needSceneUpdate) { + // Since scene is updated before axis updates are handled, + // do another render pass for scene update + m_scene->d_ptr->m_sceneDirty = true; + emitNeedRender(); + } } void Bars3DController::handleArrayReset() diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index f93d20b6..a6f893e5 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -75,7 +75,7 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_shadowQualityToShader(100.0f), m_shadowQualityMultiplier(3), m_heightNormalizer(1.0f), - m_negativeBackgroundAdjustment(0.0f), + m_backgroundAdjustment(0.0f), m_rowWidth(0), m_columnDepth(0), m_maxDimension(0), @@ -266,6 +266,9 @@ void Bars3DRenderer::updateRenderItem(const QBarDataItem &dataItem, BarRenderIte } else { heightValue -= m_zeroPosition; } + if (m_axisCacheY.reversed()) + heightValue = -heightValue; + renderItem.setValue(value); renderItem.setHeight(heightValue); @@ -387,10 +390,19 @@ void Bars3DRenderer::updateItems(const QVector &it void Bars3DRenderer::updateScene(Q3DScene *scene) { - if (m_hasNegativeValues) + if (!m_noZeroInRange) { scene->activeCamera()->d_ptr->setMinYRotation(-90.0); - else - scene->activeCamera()->d_ptr->setMinYRotation(0.0f); + scene->activeCamera()->d_ptr->setMaxYRotation(90.0); + } else { + if ((m_hasNegativeValues && !m_axisCacheY.reversed()) + || (!m_hasNegativeValues && m_axisCacheY.reversed())) { + scene->activeCamera()->d_ptr->setMinYRotation(-90.0f); + scene->activeCamera()->d_ptr->setMaxYRotation(0.0); + } else { + scene->activeCamera()->d_ptr->setMinYRotation(0.0f); + scene->activeCamera()->d_ptr->setMaxYRotation(90.0); + } + } if (m_resetCameraBaseOrientation) { // Set initial camera position. Also update if height adjustment has changed. @@ -455,7 +467,7 @@ void Bars3DRenderer::drawSlicedScene() bool itemMode = m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionItem); GLfloat barPosYAdjustment = -0.8f; // Translate to -1.0 + 0.2 for row/column labels - GLfloat gridAdjustment = 1.0f + barPosYAdjustment - m_negativeBackgroundAdjustment; + GLfloat gridAdjustment = 1.0f + barPosYAdjustment - m_backgroundAdjustment; GLfloat scaleFactor = 0.0f; if (rowMode) scaleFactor = (1.1f * m_rowWidth) / m_scaleFactor; @@ -463,10 +475,15 @@ void Bars3DRenderer::drawSlicedScene() scaleFactor = (1.1f * m_columnDepth) / m_scaleFactor; GLfloat barLabelYPos = barPosYAdjustment - 0.4f - labelMargin; // 0.4 for labels GLfloat zeroPosAdjustment = 0.0f; - if (!m_noZeroInRange) - zeroPosAdjustment = 2.0f * m_axisCacheY.min() / m_heightNormalizer; - else if (m_hasNegativeValues) - zeroPosAdjustment = -2.0f; + GLfloat directionMultiplier = 2.0f; + GLfloat directionBase = 0.0f; + if (m_axisCacheY.reversed()) { + directionMultiplier = -2.0f; + directionBase = -2.0f; + } + zeroPosAdjustment = directionBase + + directionMultiplier * m_axisCacheY.min() / m_heightNormalizer; + zeroPosAdjustment = qBound(-2.0f, zeroPosAdjustment, 0.0f); // Draw grid lines if (m_cachedTheme->isGridEnabled()) { @@ -624,7 +641,9 @@ void Bars3DRenderer::drawSlicedScene() QQuaternion seriesRotation; foreach (SeriesRenderCache *baseCache, m_renderCacheList) { - if (baseCache->isVisible()) { + if (baseCache->isVisible() + && (baseCache == m_selectedSeriesCache + || m_cachedSelectionMode.testFlag(QAbstract3DGraph::SelectionMultiSeries))) { BarSeriesRenderCache *cache = static_cast(baseCache); QVector &sliceArray = cache->sliceArray(); int sliceCount = sliceArray.size(); @@ -768,6 +787,7 @@ void Bars3DRenderer::drawSlicedScene() m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barLabelYPos, item.translation().z())); + // Draw labels m_drawer->drawLabel(m_dummyBarRenderItem, *m_sliceCache->labelItems().at(labelNo), viewMatrix, projectionMatrix, positionComp, sliceLabelRotation, @@ -811,7 +831,7 @@ void Bars3DRenderer::drawSlicedScene() } } } - } else { + } else if (selectedItem) { // Only draw value for selected item when grid labels are on // Create label texture if we need it if (selectedItem->sliceLabel().isNull() || m_updateLabels) { @@ -1468,7 +1488,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; QVector3D backgroundScaler(rowScaleFactor, 1.0f, columnScaleFactor); - modelMatrix.translate(0.0f, m_negativeBackgroundAdjustment, 0.0f); + modelMatrix.translate(0.0f, m_backgroundAdjustment, 0.0f); modelMatrix.scale(backgroundScaler); itModelMatrix.scale(backgroundScaler); @@ -1517,44 +1537,42 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_drawer->drawObject(m_backgroundShader, m_backgroundObj); } - // Draw floor for graph with negatives - if (m_hasNegativeValues) { - modelMatrix = QMatrix4x4(); - itModelMatrix = QMatrix4x4(); + // Draw floor + modelMatrix = QMatrix4x4(); + itModelMatrix = QMatrix4x4(); - modelMatrix.scale(backgroundScaler); + modelMatrix.scale(backgroundScaler); - if (m_yFlipped) - modelMatrix.rotate(90.0f, 1.0f, 0.0f, 0.0f); - else - modelMatrix.rotate(-90.0f, 1.0f, 0.0f, 0.0f); + if (m_yFlipped) + modelMatrix.rotate(90.0f, 1.0f, 0.0f, 0.0f); + else + modelMatrix.rotate(-90.0f, 1.0f, 0.0f, 0.0f); - itModelMatrix = modelMatrix; + itModelMatrix = modelMatrix; #ifdef SHOW_DEPTH_TEXTURE_SCENE - MVPMatrix = depthProjectionViewMatrix * modelMatrix; + MVPMatrix = depthProjectionViewMatrix * modelMatrix; #else - MVPMatrix = projectionViewMatrix * modelMatrix; + MVPMatrix = projectionViewMatrix * modelMatrix; #endif - // Set changed shader bindings - m_backgroundShader->setUniformValue(m_backgroundShader->model(), modelMatrix); - m_backgroundShader->setUniformValue(m_backgroundShader->nModel(), - itModelMatrix.inverted().transposed()); - m_backgroundShader->setUniformValue(m_backgroundShader->MVP(), MVPMatrix); + // Set changed shader bindings + m_backgroundShader->setUniformValue(m_backgroundShader->model(), modelMatrix); + m_backgroundShader->setUniformValue(m_backgroundShader->nModel(), + itModelMatrix.inverted().transposed()); + m_backgroundShader->setUniformValue(m_backgroundShader->MVP(), MVPMatrix); #if !defined(QT_OPENGL_ES_2) - if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { - // Set shadow shader bindings - QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; - m_backgroundShader->setUniformValue(m_backgroundShader->depth(), depthMVPMatrix); - // Draw the object - m_drawer->drawObject(m_backgroundShader, m_gridLineObj, 0, m_depthTexture); - } else + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + // Set shadow shader bindings + QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; + m_backgroundShader->setUniformValue(m_backgroundShader->depth(), depthMVPMatrix); + // Draw the object + m_drawer->drawObject(m_backgroundShader, m_gridLineObj, 0, m_depthTexture); + } else #endif - { - // Draw the object - m_drawer->drawObject(m_backgroundShader, m_gridLineObj); - } + { + // Draw the object + m_drawer->drawObject(m_backgroundShader, m_gridLineObj); } } @@ -2047,21 +2065,22 @@ void Bars3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orientatio if (orientation == QAbstract3DAxis::AxisOrientationY) { // Check if we have negative values - if (min < 0 && !m_hasNegativeValues) { + if (min < 0) m_hasNegativeValues = true; - // Reload background - loadBackgroundMesh(); - emit needRender(); - } else if (min >= 0 && m_hasNegativeValues) { + else if (min >= 0) m_hasNegativeValues = false; - // Reload background - loadBackgroundMesh(); - emit needRender(); - } calculateHeightAdjustment(); } } +void Bars3DRenderer::updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation, bool enable) +{ + Abstract3DRenderer::updateAxisReversed(orientation, enable); + if (orientation == QAbstract3DAxis::AxisOrientationY) + calculateHeightAdjustment(); +} + + void Bars3DRenderer::updateSelectedBar(const QPoint &position, QBar3DSeries *series) { m_selectedBarPos = position; @@ -2142,10 +2161,7 @@ void Bars3DRenderer::loadBackgroundMesh() { if (m_backgroundObj) delete m_backgroundObj; - if (m_hasNegativeValues) - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/negativeBackground")); - else - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/background")); + m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/negativeBackground")); m_backgroundObj->load(); } @@ -2216,13 +2232,14 @@ void Bars3DRenderer::calculateHeightAdjustment() m_gradientFraction = qMax(minAbs, maxAbs) / m_heightNormalizer * 2.0f; } - // Calculate translation adjustment for negative background - if (m_hasNegativeValues) - newAdjustment = (qBound(0.0f, (maxAbs / m_heightNormalizer), 1.0f) - 0.5f) * 2.0f; + // Calculate translation adjustment for background floor + newAdjustment = (qBound(0.0f, (maxAbs / m_heightNormalizer), 1.0f) - 0.5f) * 2.0f; + if (m_axisCacheY.reversed()) + newAdjustment = -newAdjustment; - if (newAdjustment != m_negativeBackgroundAdjustment) { - m_negativeBackgroundAdjustment = newAdjustment; - m_axisCacheY.setTranslate(m_negativeBackgroundAdjustment - 1.0f); + if (newAdjustment != m_backgroundAdjustment) { + m_backgroundAdjustment = newAdjustment; + m_axisCacheY.setTranslate(m_backgroundAdjustment - 1.0f); } } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 8e39ee11..68848673 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -86,7 +86,7 @@ private: GLint m_shadowQualityMultiplier; GLfloat m_heightNormalizer; GLfloat m_gradientFraction; - GLfloat m_negativeBackgroundAdjustment; + GLfloat m_backgroundAdjustment; GLfloat m_rowWidth; GLfloat m_columnDepth; GLfloat m_maxDimension; @@ -140,6 +140,8 @@ public slots: // Overloaded from abstract renderer virtual void updateAxisRange(QAbstract3DAxis::AxisOrientation orientation, float min, float max); + virtual void updateAxisReversed(QAbstract3DAxis::AxisOrientation orientation, + bool enable); private: virtual void initShaders(const QString &vertexShader, const QString &fragmentShader); diff --git a/src/datavisualization/engine/q3dscene.h b/src/datavisualization/engine/q3dscene.h index 39c9791f..1699b125 100644 --- a/src/datavisualization/engine/q3dscene.h +++ b/src/datavisualization/engine/q3dscene.h @@ -95,6 +95,7 @@ private: friend class QAbstract3DGraph; friend class QAbstract3DGraphPrivate; friend class Abstract3DController; + friend class Bars3DController; friend class Q3DScenePrivate; friend class Abstract3DRenderer; friend class Bars3DRenderer; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 198a034d..56219104 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -747,6 +747,9 @@ void Surface3DRenderer::drawSlicedScene() GLfloat scaleXBackground = 0.0f; + // Disable culling to avoid ugly conditionals with reversed axes and data + glDisable(GL_CULL_FACE); + if (!m_renderCacheList.isEmpty()) { bool drawGrid = false; @@ -825,6 +828,9 @@ void Surface3DRenderer::drawSlicedScene() // Disable textures glDisable(GL_TEXTURE_2D); + glEnable(GL_CULL_FACE); + glCullFace(GL_FRONT); + // Grid lines if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { #if !(defined QT_OPENGL_ES_2) diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 9bf21cbd..4e5c8976 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -1400,6 +1400,11 @@ void GraphModifier::testItemAndRowChanges() counter++; } +void GraphModifier::reverseValueAxis(int enabled) +{ + m_graph->valueAxis()->setReversed(enabled); +} + void GraphModifier::changeValueAxisSegments(int value) { qDebug() << __FUNCTION__ << value; diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h index 385e139c..47d29c25 100644 --- a/tests/barstest/chart.h +++ b/tests/barstest/chart.h @@ -93,6 +93,7 @@ public: void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } void addRemoveSeries(); void testItemAndRowChanges(); + void reverseValueAxis(int enabled); public slots: void flipViews(); diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp index 1182ffdf..5ecf63a4 100644 --- a/tests/barstest/main.cpp +++ b/tests/barstest/main.cpp @@ -201,6 +201,10 @@ int main(int argc, char **argv) fpsCheckBox->setText(QStringLiteral("Measure Fps")); fpsCheckBox->setChecked(false); + QCheckBox *reverseValueAxisCheckBox = new QCheckBox(widget); + reverseValueAxisCheckBox->setText(QStringLiteral("Reverse value axis")); + reverseValueAxisCheckBox->setChecked(false); + QCheckBox *backgroundCheckBox = new QCheckBox(widget); backgroundCheckBox->setText(QStringLiteral("Show background")); backgroundCheckBox->setChecked(true); @@ -364,6 +368,7 @@ int main(int argc, char **argv) vLayout2->addWidget(maxSliderY, 0, Qt::AlignTop); vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop); vLayout2->addWidget(fpsCheckBox, 0, Qt::AlignTop); + vLayout2->addWidget(reverseValueAxisCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(backgroundCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(gridCheckBox, 0, Qt::AlignTop); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop); @@ -477,6 +482,8 @@ int main(int argc, char **argv) QObject::connect(fpsCheckBox, &QCheckBox::stateChanged, modifier, &GraphModifier::setFpsMeasurement); + QObject::connect(reverseValueAxisCheckBox, &QCheckBox::stateChanged, modifier, + &GraphModifier::reverseValueAxis); QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier, &GraphModifier::setBackgroundEnabled); QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier, diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 82d025aa..b0e52c8c 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -126,6 +126,9 @@ int main(int argc, char **argv) QPushButton *testItemChangesButton = new QPushButton(widget); testItemChangesButton->setText(QStringLiteral("Test Item changing")); + QPushButton *testReverseButton = new QPushButton(widget); + testReverseButton->setText(QStringLiteral("Test Axis Reversing")); + QLinearGradient grBtoY(0, 0, 100, 0); grBtoY.setColorAt(1.0, Qt::black); grBtoY.setColorAt(0.67, Qt::blue); @@ -242,7 +245,8 @@ int main(int argc, char **argv) vLayout->addWidget(changeSeriesNameButton, 0, Qt::AlignTop); vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); vLayout->addWidget(massiveDataTestButton, 0, Qt::AlignTop); - vLayout->addWidget(testItemChangesButton, 1, Qt::AlignTop); + vLayout->addWidget(testItemChangesButton, 0, Qt::AlignTop); + vLayout->addWidget(testReverseButton, 1, Qt::AlignTop); vLayout2->addWidget(gradientBtoYPB, 0, Qt::AlignTop); vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop); @@ -316,6 +320,8 @@ int main(int argc, char **argv) &ScatterDataModifier::massiveDataTest); QObject::connect(testItemChangesButton, &QPushButton::clicked, modifier, &ScatterDataModifier::testItemChanges); + QObject::connect(testReverseButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::testAxisReverse); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, &ScatterDataModifier::setGradient); QObject::connect(themeButton, &QPushButton::clicked, modifier, diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 13a0f040..430279c3 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -411,6 +411,70 @@ void ScatterDataModifier::testItemChanges() counter++; } +void ScatterDataModifier::testAxisReverse() +{ + static int counter = 0; + const int rowCount = 16; + const int colCount = 16; + static QScatter3DSeries *series0 = 0; + static QScatter3DSeries *series1 = 0; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test"; + foreach (QScatter3DSeries *series, m_chart->seriesList()) + m_chart->removeSeries(series); + foreach (QValue3DAxis *axis, m_chart->axes()) + m_chart->releaseAxis(axis); + delete series0; + delete series1; + series0 = new QScatter3DSeries; + series1 = new QScatter3DSeries; + populateRisingSeries(series0, rowCount, colCount, 0.0f, 50.0f); + populateRisingSeries(series1, rowCount, colCount, -20.0f, 30.0f); + m_chart->axisX()->setRange(0.0f, 10.0f); + m_chart->axisY()->setRange(-20.0f, 50.0f); + m_chart->axisZ()->setRange(5.0f, 15.0f); + m_chart->addSeries(series0); + m_chart->addSeries(series1); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Reverse X axis"; + m_chart->axisX()->setReversed(true); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Reverse Y axis"; + m_chart->axisY()->setReversed(true); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Reverse Z axis"; + m_chart->axisZ()->setReversed(true); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Return all axes to normal"; + m_chart->axisX()->setReversed(false); + m_chart->axisY()->setReversed(false); + m_chart->axisZ()->setReversed(false); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Reverse all axes"; + m_chart->axisX()->setReversed(true); + m_chart->axisY()->setReversed(true); + m_chart->axisZ()->setReversed(true); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void ScatterDataModifier::addData() { // Add labels @@ -950,3 +1014,19 @@ void ScatterDataModifier::populateFlatSeries(QScatter3DSeries *series, int rows, } series->dataProxy()->resetArray(dataArray); } + +void ScatterDataModifier::populateRisingSeries(QScatter3DSeries *series, int rows, int columns, + float minValue, float maxValue) +{ + QScatterDataArray *dataArray = new QScatterDataArray; + int arraySize = rows * columns; + dataArray->resize(arraySize); + float range = maxValue - minValue; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + float yValue = minValue + (range * i * j / arraySize); + (*dataArray)[i * columns + j].setPosition(QVector3D(float(i), yValue, float(j))); + } + } + series->dataProxy()->resetArray(dataArray); +} diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index f239cb73..977e1201 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -59,6 +59,7 @@ public: void setFpsMeasurement(bool enable); void setFpsLabel(QLabel *fpsLabel) { m_fpsLabel = fpsLabel; } void testItemChanges(); + void testAxisReverse(); public slots: void changeShadowQuality(int quality); @@ -96,6 +97,8 @@ private: QVector3D randVector(); QScatter3DSeries *createAndAddSeries(); void populateFlatSeries(QScatter3DSeries *series, int rows, int columns, float value); + void populateRisingSeries(QScatter3DSeries *series, int rows, int columns, float minValue, + float maxValue); Q3DScatter *m_chart; int m_fontSize; diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 0f3aa985..6dd20de7 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -781,6 +781,25 @@ QSurfaceDataRow *GraphModifier::createMultiRow(int row, int series, bool change) return newRow; } +void GraphModifier::populateRisingSeries(QSurface3DSeries *series, int rows, int columns, + float minValue, float maxValue) +{ + QSurfaceDataArray *dataArray = new QSurfaceDataArray; + dataArray->reserve(rows); + float range = maxValue - minValue; + int arraySize = rows * columns; + for (int i = 0; i < rows; i++) { + QSurfaceDataRow *dataRow = new QSurfaceDataRow(columns); + for (int j = 0; j < columns; j++) { + float yValue = minValue + (range * i * j / arraySize); + (*dataRow)[j].setPosition(QVector3D(float(j), yValue, float(i))); + } + dataArray->append(dataRow); + } + series->dataProxy()->resetArray(dataArray); + +} + void GraphModifier::changeRows() { if (m_activeSample == GraphModifier::SqrtSin) { @@ -1278,6 +1297,70 @@ void GraphModifier::massiveTestAppendAndScroll() m_graph->axisZ()->setRange(min, max); } +void GraphModifier::testAxisReverse() +{ + static int counter = 0; + const int rowCount = 16; + const int colCount = 16; + static QSurface3DSeries *series0 = 0; + static QSurface3DSeries *series1 = 0; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test"; + foreach (QSurface3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(series); + foreach (QValue3DAxis *axis, m_graph->axes()) + m_graph->releaseAxis(axis); + delete series0; + delete series1; + series0 = new QSurface3DSeries; + series1 = new QSurface3DSeries; + populateRisingSeries(series0, rowCount, colCount, 0.0f, 50.0f); + populateRisingSeries(series1, rowCount, colCount, -20.0f, 30.0f); + m_graph->axisX()->setRange(0.0f, 10.0f); + m_graph->axisY()->setRange(-20.0f, 50.0f); + m_graph->axisZ()->setRange(5.0f, 15.0f); + m_graph->addSeries(series0); + m_graph->addSeries(series1); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Reverse X axis"; + m_graph->axisX()->setReversed(true); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Reverse Y axis"; + m_graph->axisY()->setReversed(true); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Reverse Z axis"; + m_graph->axisZ()->setReversed(true); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Return all axes to normal"; + m_graph->axisX()->setReversed(false); + m_graph->axisY()->setReversed(false); + m_graph->axisZ()->setReversed(false); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Reverse all axes"; + m_graph->axisX()->setReversed(true); + m_graph->axisY()->setReversed(true); + m_graph->axisZ()->setReversed(true); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void GraphModifier::changeMesh() { static int model = 0; diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index f79055df..f3e95a1b 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -110,6 +110,7 @@ public: void massiveDataTest(); void massiveTestScroll(); void massiveTestAppendAndScroll(); + void testAxisReverse(); public slots: void changeShadowQuality(int quality); @@ -128,6 +129,8 @@ private: void resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, float maxX); QSurfaceDataRow *createMultiRow(int row, int series, bool change); + void populateRisingSeries(QSurface3DSeries *series, int rows, int columns, float minValue, + float maxValue); Q3DSurface *m_graph; QSurface3DSeries *m_multiseries[4]; diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index aa300207..8371e2cf 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -56,7 +56,7 @@ int main(int argc, char *argv[]) surfaceGraph->activeTheme()->setType(Q3DTheme::Theme(initialTheme)); QWidget *container = QWidget::createWindowContainer(surfaceGraph); - container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2)); + container->setMinimumSize(QSize(screenSize.width() / 4, screenSize.height() / 4)); container->setMaximumSize(screenSize); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); container->setFocusPolicy(Qt::StrongFocus); @@ -347,6 +347,9 @@ int main(int argc, char *argv[]) QPushButton *massiveDataTestButton = new QPushButton(widget); massiveDataTestButton->setText(QStringLiteral("Massive data test")); + QPushButton *testReverseButton = new QPushButton(widget); + testReverseButton->setText(QStringLiteral("Test Axis Reversing")); + QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); @@ -435,6 +438,7 @@ int main(int argc, char *argv[]) vLayout2->addWidget(resetArrayButton); vLayout2->addWidget(resetArrayEmptyButton); vLayout2->addWidget(massiveDataTestButton); + vLayout2->addWidget(testReverseButton); widget->show(); @@ -592,6 +596,8 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::resetArrayEmpty); QObject::connect(massiveDataTestButton,&QPushButton::clicked, modifier, &GraphModifier::massiveDataTest); + QObject::connect(testReverseButton, &QPushButton::clicked, + modifier, &GraphModifier::testAxisReverse); #ifdef MULTI_SERIES modifier->setSeries1CB(series1CB); -- cgit v1.2.3 From 7b6ae38253e946225f1df27b7c97661d1cc14cf2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 6 May 2014 12:02:02 +0300 Subject: Allow surface rows and cols be in ascending or descending XZ order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows adding rows that have smaller Z-value than the previously added row instead of being forced to insert rows into the beginning of the data array in these cases. Task-number: QTRD-2428 Change-Id: I4dc6c5a48a55ca494a2372f917aa7447f61f336e Reviewed-by: Tomi Korpipää --- src/datavisualization/data/qsurfacedataproxy.cpp | 21 +++--- src/datavisualization/engine/surface3drenderer.cpp | 81 +++++++++++++++------- tests/surfacetest/graphmodifier.cpp | 73 +++++++++++++++++-- tests/surfacetest/graphmodifier.h | 3 +- tests/surfacetest/main.cpp | 6 ++ 5 files changed, 142 insertions(+), 42 deletions(-) diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 2e66bb5b..f8f2c900 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -28,8 +28,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \brief Base proxy class for Q3DSurface. * \since Qt Data Visualization 1.0 * - * QSurfaceDataProxy takes care of surface related data handling. The QSurfaceDataProxy handles the data - * in rows and for this it provides two auxiliary typedefs. QSurfaceDataArray is a QList for + * QSurfaceDataProxy takes care of surface related data handling. The QSurfaceDataProxy handles the + * data in rows and for this it provides two auxiliary typedefs. QSurfaceDataArray is a QList for * controlling the rows. For rows there is a QVector QSurfaceDataRow which contains QSurfaceDataItem * objects. See Q3DSurface documentation and basic sample code there how to feed the data for the * QSurfaceDataProxy. @@ -41,17 +41,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * If you use QSurfaceDataRow pointers to directly modify data after adding the array to the proxy, * you must also emit proper signal to make the graph update. * - * To make a sensible surface, the X-value of each successive item in the same row must be greater than the - * previous item in that row, and the the Z-value of each successive item in a column must be greater than - * the previous item in that column. + * To make a sensible surface, the X-value of each successive item in all rows must be + * either ascending or descending throughout the row. + * Similarly, the Z-value of each successive item in all columns must be either ascending or + * descending throughout the column. * - * \note In the initial release, only surfaces with straight rows and columns are fully supported. Any row - * with items that do not have the exact same Z-value or any columns with items that do not have the exact - * same X-value may get clipped incorrectly if the whole surface doesn't fit to the visible X or Z axis - * ranges. + * \note Currently only surfaces with straight rows and columns are fully supported. Any row + * with items that do not have the exact same Z-value or any column with items that do not have + * the exact same X-value may get clipped incorrectly if the whole surface doesn't completely fit + * in the visible X or Z axis ranges. * * \note Surfaces with less than two rows or columns are not considered valid surfaces and will - * not get rendered. + * not be rendered. * * \sa {Qt Data Visualization Data Handling} */ diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 56219104..d3898476 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -581,71 +581,100 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) { QRect sampleSpace; - int rowCount = array.size(); - int columnCount = array.at(0)->size(); - - int i; - bool found; - float axisMinX = m_axisCacheX.min(); - float axisMaxX = m_axisCacheX.max(); - float axisMinZ = m_axisCacheZ.min(); - float axisMaxZ = m_axisCacheZ.max(); - + const int rowCount = array.size(); + const int columnCount = array.at(0)->size(); + + const float axisMinX = m_axisCacheX.min(); + const float axisMaxX = m_axisCacheX.max(); + const float axisMinZ = m_axisCacheZ.min(); + const float axisMaxZ = m_axisCacheZ.max(); + + // We assume data is ordered sequentially in rows for X-value and in columns for Z-value. + // Determine if data is ascending or descending in each case. + const bool ascendingX = array.at(0)->at(0).x() < array.at(0)->at(columnCount - 1).x(); + const bool ascendingZ = array.at(0)->at(0).z() < array.at(rowCount - 1)->at(0).z(); + + const int minCol = ascendingX ? 0 : columnCount - 1; + const int maxCol = ascendingX ? columnCount - 1 : 0; + const int colStep = ascendingX ? 1 : -1; + const int minRow = ascendingZ ? 0 : rowCount - 1; + const int maxRow = ascendingZ ? rowCount - 1 : 0; + const int rowStep = ascendingZ ? 1 : -1; + + bool found = false; + int idx = 0; + int i = 0; // m_minVisibleColumnValue - for (i = 0, found = false; i < columnCount; i++) { - if (array.at(0)->at(i).x() >= axisMinX) { + for (i = 0, idx = minCol, found = false; i < columnCount; i++) { + if (array.at(0)->at(idx).x() >= axisMinX) { found = true; break; } + idx += colStep; } if (found) { - m_minVisibleColumnValue = array.at(0)->at(i).x(); - sampleSpace.setLeft(i); + m_minVisibleColumnValue = array.at(0)->at(idx).x(); + if (ascendingX) + sampleSpace.setLeft(idx); + else + sampleSpace.setRight(idx); } else { sampleSpace.setWidth(-1); // to indicate nothing needs to be shown return sampleSpace; } // m_maxVisibleColumnValue - for (i = columnCount - 1, found = false; i >= 0; i--) { - if (array.at(0)->at(i).x() <= axisMaxX) { + for (i = 0, idx = maxCol, found = false; i < columnCount; i++) { + if (array.at(0)->at(idx).x() <= axisMaxX) { found = true; break; } + idx -= colStep; } if (found) { - m_maxVisibleColumnValue = array.at(0)->at(i).x(); - sampleSpace.setRight(i); + m_maxVisibleColumnValue = array.at(0)->at(idx).x(); + if (ascendingX) + sampleSpace.setRight(idx); + else + sampleSpace.setLeft(idx); } else { sampleSpace.setWidth(-1); // to indicate nothing needs to be shown return sampleSpace; } // m_minVisibleRowValue - for (i = 0, found = false; i < rowCount; i++) { - if (array.at(i)->at(0).z() >= axisMinZ) { + for (i = 0, idx = minRow, found = false; i < rowCount; i++) { + if (array.at(idx)->at(0).z() >= axisMinZ) { found = true; break; } + idx += rowStep; } if (found) { - m_minVisibleRowValue = array.at(i)->at(0).z(); - sampleSpace.setTop(i); + m_minVisibleRowValue = array.at(idx)->at(0).z(); + if (ascendingZ) + sampleSpace.setTop(idx); + else + sampleSpace.setBottom(idx); } else { sampleSpace.setWidth(-1); // to indicate nothing needs to be shown return sampleSpace; } // m_maxVisibleRowValue - for (i = rowCount - 1, found = false; i >= 0; i--) { - if (array.at(i)->at(0).z() <= axisMaxZ) { + for (i = 0, idx = maxRow, found = false; i < rowCount; i++) { + if (array.at(idx)->at(0).z() <= axisMaxZ) { found = true; break; } + idx -= rowStep; } if (found) { - m_maxVisibleRowValue = array.at(i)->at(0).z(); - sampleSpace.setBottom(i); + m_maxVisibleRowValue = array.at(idx)->at(0).z(); + if (ascendingZ) + sampleSpace.setBottom(idx); + else + sampleSpace.setTop(idx); } else { sampleSpace.setWidth(-1); // to indicate nothing needs to be shown return sampleSpace; diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 6dd20de7..33cfb8a1 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -782,7 +782,8 @@ QSurfaceDataRow *GraphModifier::createMultiRow(int row, int series, bool change) } void GraphModifier::populateRisingSeries(QSurface3DSeries *series, int rows, int columns, - float minValue, float maxValue) + float minValue, float maxValue, bool ascendingX, + bool ascendingZ) { QSurfaceDataArray *dataArray = new QSurfaceDataArray; dataArray->reserve(rows); @@ -791,8 +792,10 @@ void GraphModifier::populateRisingSeries(QSurface3DSeries *series, int rows, int for (int i = 0; i < rows; i++) { QSurfaceDataRow *dataRow = new QSurfaceDataRow(columns); for (int j = 0; j < columns; j++) { + float xValue = ascendingX ? float(j) : float(columns - j - 1); float yValue = minValue + (range * i * j / arraySize); - (*dataRow)[j].setPosition(QVector3D(float(j), yValue, float(i))); + float zValue = ascendingZ ? float(i) : float(rows - i - 1); + (*dataRow)[j].setPosition(QVector3D(xValue, yValue, zValue)); } dataArray->append(dataRow); } @@ -1168,6 +1171,7 @@ void GraphModifier::massiveDataTest() const float yRangeMax = 1.0f; const float yRangeMargin = 0.05f; static QTimer *massiveTestTimer = 0; + static QSurface3DSeries *series = new QSurface3DSeries; // To speed up massive array creation, we generate a smaller cache array // and copy rows from that to our main array @@ -1221,6 +1225,9 @@ void GraphModifier::massiveDataTest() qDebug() << __FUNCTION__ << testPhase << ": Creating massive array..." << rows << "x" << columns; + // Reset to zero first to avoid having memory allocated for two massive arrays at the same + // time on the second and subsequent runs. + series->dataProxy()->resetArray(0); QSurfaceDataArray *massiveArray = new QSurfaceDataArray; massiveArray->reserve(rows); @@ -1232,7 +1239,6 @@ void GraphModifier::massiveDataTest() } qDebug() << __FUNCTION__ << testPhase << ": Massive array creation finished!"; - QSurface3DSeries *series = new QSurface3DSeries; series->dataProxy()->resetArray(massiveArray); m_graph->addSeries(series); break; @@ -1316,8 +1322,8 @@ void GraphModifier::testAxisReverse() delete series1; series0 = new QSurface3DSeries; series1 = new QSurface3DSeries; - populateRisingSeries(series0, rowCount, colCount, 0.0f, 50.0f); - populateRisingSeries(series1, rowCount, colCount, -20.0f, 30.0f); + populateRisingSeries(series0, rowCount, colCount, 0.0f, 50.0f, true, true); + populateRisingSeries(series1, rowCount, colCount, -20.0f, 30.0f, true, true); m_graph->axisX()->setRange(0.0f, 10.0f); m_graph->axisY()->setRange(-20.0f, 50.0f); m_graph->axisZ()->setRange(5.0f, 15.0f); @@ -1361,6 +1367,63 @@ void GraphModifier::testAxisReverse() counter++; } +void GraphModifier::testDataOrdering() +{ + static int counter = 0; + const int rowCount = 20; + const int colCount = 20; + static QSurface3DSeries *series0 = 0; + static QSurface3DSeries *series1 = 0; + const float series0min = 0.0f; + const float series0max = 50.0f; + const float series1min = -20.0f; + const float series1max = 30.0f; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test - both ascending"; + foreach (QSurface3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(series); + foreach (QValue3DAxis *axis, m_graph->axes()) + m_graph->releaseAxis(axis); + delete series0; + delete series1; + series0 = new QSurface3DSeries; + series1 = new QSurface3DSeries; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, true, true); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, true, true); + m_graph->axisX()->setRange(5.0f, 15.0f); + m_graph->axisY()->setRange(-20.0f, 50.0f); + m_graph->axisZ()->setRange(5.0f, 15.0f); + m_graph->addSeries(series0); + m_graph->addSeries(series1); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Ascending X, descending Z"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, true, false); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, true, false); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Descending X, ascending Z"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, false, true); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, false, true); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Both descending"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, false, false); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, false, false); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + void GraphModifier::changeMesh() { static int model = 0; diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index f3e95a1b..b02e1c31 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -111,6 +111,7 @@ public: void massiveTestScroll(); void massiveTestAppendAndScroll(); void testAxisReverse(); + void testDataOrdering(); public slots: void changeShadowQuality(int quality); @@ -130,7 +131,7 @@ private: float maxX); QSurfaceDataRow *createMultiRow(int row, int series, bool change); void populateRisingSeries(QSurface3DSeries *series, int rows, int columns, float minValue, - float maxValue); + float maxValue, bool ascendingX, bool ascendingZ); Q3DSurface *m_graph; QSurface3DSeries *m_multiseries[4]; diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 8371e2cf..9d6165e6 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -350,6 +350,9 @@ int main(int argc, char *argv[]) QPushButton *testReverseButton = new QPushButton(widget); testReverseButton->setText(QStringLiteral("Test Axis Reversing")); + QPushButton *testDataOrderingButton = new QPushButton(widget); + testDataOrderingButton->setText(QStringLiteral("Test data ordering")); + QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); @@ -439,6 +442,7 @@ int main(int argc, char *argv[]) vLayout2->addWidget(resetArrayEmptyButton); vLayout2->addWidget(massiveDataTestButton); vLayout2->addWidget(testReverseButton); + vLayout2->addWidget(testDataOrderingButton); widget->show(); @@ -598,6 +602,8 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::massiveDataTest); QObject::connect(testReverseButton, &QPushButton::clicked, modifier, &GraphModifier::testAxisReverse); + QObject::connect(testDataOrderingButton, &QPushButton::clicked, + modifier, &GraphModifier::testDataOrdering); #ifdef MULTI_SERIES modifier->setSeries1CB(series1CB); -- cgit v1.2.3 From bb36daafb6cb461d21c6f6dace10e23ee5fc2dde Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 7 May 2014 08:14:58 +0300 Subject: Remove invalid comment from common.pri MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ieaca061c62b06376dc0e1a2dd072521407cffbc3 Reviewed-by: Tomi Korpipää --- src/datavisualization/common.pri | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/datavisualization/common.pri b/src/datavisualization/common.pri index 4ffa5646..9a497c2c 100644 --- a/src/datavisualization/common.pri +++ b/src/datavisualization/common.pri @@ -1,6 +1,3 @@ -# This qmake file is included by all Patternist projects and contains common Qt defines, -# compiler warnings, and include paths. - INCLUDEPATH += $$PWD/engine \ $$PWD/global \ $$PWD/utils \ -- cgit v1.2.3 From 590d11726e0708e9f8fad0ec386cc5859dbe5cc8 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 8 May 2014 14:55:13 +0300 Subject: Enable mapping single role to multiple properties for bars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Surface and scatter to follow in separate task Task-number: QTRD-3074 Change-Id: I790078446cd1b805a83da2e3760eaf27c586aaab Reviewed-by: Tomi Korpipää --- .../datavisualization/qmlbars/doc/src/qmlbars.qdoc | 17 +- .../datavisualization/qmlbars/qml/qmlbars/Data.qml | 168 +++++------ .../datavisualization/qmlbars/qml/qmlbars/main.qml | 61 +++- src/datavisualization/data/baritemmodelhandler.cpp | 86 +++++- src/datavisualization/data/baritemmodelhandler_p.h | 6 + .../data/qitemmodelbardataproxy.cpp | 319 ++++++++++++++++++++- .../data/qitemmodelbardataproxy.h | 35 +++ .../data/qitemmodelbardataproxy_p.h | 10 + .../datavisualizationqml2_plugin.cpp | 1 + tests/itemmodeltest/main.cpp | 27 +- tests/qmlcamera/qml/qmlcamera/Axes.qml | 4 - tests/qmlcamera/qml/qmlcamera/Data.qml | 174 +++++------ 12 files changed, 685 insertions(+), 223 deletions(-) diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc index d3da5e6a..f2a0f8b0 100644 --- a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc +++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc @@ -39,9 +39,9 @@ \snippet qmlbars/qml/qmlbars/Data.qml 0 \dots - Each data item has four roles: year, month, income, and expenses. Years and months are natural to - map to rows and columns of a bar chart, but we can only show either income or expenses as the - value. + Each data item has three roles: timestamp, income, and expenses. The timestamp value is in + format: \c{-}. Years and months are natural to map to rows and + columns of a bar chart, but we can only show either income or expenses as the value. Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it, starting with a series for the income: @@ -50,7 +50,16 @@ \dots The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the - series. + series. For \c valueRole we simply specify the \c income field, as it contains the value we + want, but getting the years and months is a bit more complicated, since they are both found + in the same field. To extract those values, we specify the \c timestamp field for both + \c rowRole and \c columnRole, and additionally specify a search pattern and a replace rule + for those roles to extract the correct portion of the field contents for each role. + The search pattern is a normal JavaScript regular expression and the replace rule specifies + what the field content that matches the regular expression is replaced with. + In this case we want to replace the entire field content with just the year or the month. + For more information how the replace using regular expressions works, see + QString::replace(const QRegExp &rx, const QString &after) function documentation. Then we add another series for the expenses: diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml index 7e0978c6..6922ef17 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml @@ -24,96 +24,96 @@ Item { //! [0] ListModel { id: dataModel - ListElement{ year: "2006"; month: "Jan"; expenses: "4"; income: "5" } - ListElement{ year: "2006"; month: "Feb"; expenses: "5"; income: "6" } - ListElement{ year: "2006"; month: "Mar"; expenses: "7"; income: "4" } + ListElement{ timestamp: "2006-01"; expenses: "4"; income: "5" } + ListElement{ timestamp: "2006-02"; expenses: "5"; income: "6" } + ListElement{ timestamp: "2006-03"; expenses: "7"; income: "4" } //! [0] - ListElement{ year: "2006"; month: "Apr"; expenses: "3"; income: "2" } - ListElement{ year: "2006"; month: "May"; expenses: "4"; income: "1" } - ListElement{ year: "2006"; month: "Jun"; expenses: "2"; income: "2" } - ListElement{ year: "2006"; month: "Jul"; expenses: "1"; income: "3" } - ListElement{ year: "2006"; month: "Aug"; expenses: "5"; income: "1" } - ListElement{ year: "2006"; month: "Sep"; expenses: "2"; income: "3" } - ListElement{ year: "2006"; month: "Oct"; expenses: "5"; income: "2" } - ListElement{ year: "2006"; month: "Nov"; expenses: "8"; income: "5" } - ListElement{ year: "2006"; month: "Dec"; expenses: "3"; income: "3" } + ListElement{ timestamp: "2006-04"; expenses: "3"; income: "2" } + ListElement{ timestamp: "2006-05"; expenses: "4"; income: "1" } + ListElement{ timestamp: "2006-06"; expenses: "2"; income: "2" } + ListElement{ timestamp: "2006-07"; expenses: "1"; income: "3" } + ListElement{ timestamp: "2006-08"; expenses: "5"; income: "1" } + ListElement{ timestamp: "2006-09"; expenses: "2"; income: "3" } + ListElement{ timestamp: "2006-10"; expenses: "5"; income: "2" } + ListElement{ timestamp: "2006-11"; expenses: "8"; income: "5" } + ListElement{ timestamp: "2006-12"; expenses: "3"; income: "3" } - ListElement{ year: "2007"; month: "Jan"; expenses: "3"; income: "1" } - ListElement{ year: "2007"; month: "Feb"; expenses: "4"; income: "2" } - ListElement{ year: "2007"; month: "Mar"; expenses: "12"; income: "4" } - ListElement{ year: "2007"; month: "Apr"; expenses: "13"; income: "6" } - ListElement{ year: "2007"; month: "May"; expenses: "14"; income: "11" } - ListElement{ year: "2007"; month: "Jun"; expenses: "7"; income: "7" } - ListElement{ year: "2007"; month: "Jul"; expenses: "6"; income: "4" } - ListElement{ year: "2007"; month: "Aug"; expenses: "4"; income: "15" } - ListElement{ year: "2007"; month: "Sep"; expenses: "2"; income: "18" } - ListElement{ year: "2007"; month: "Oct"; expenses: "29"; income: "25" } - ListElement{ year: "2007"; month: "Nov"; expenses: "23"; income: "29" } - ListElement{ year: "2007"; month: "Dec"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2007-01"; expenses: "3"; income: "1" } + ListElement{ timestamp: "2007-02"; expenses: "4"; income: "2" } + ListElement{ timestamp: "2007-03"; expenses: "12"; income: "4" } + ListElement{ timestamp: "2007-04"; expenses: "13"; income: "6" } + ListElement{ timestamp: "2007-05"; expenses: "14"; income: "11" } + ListElement{ timestamp: "2007-06"; expenses: "7"; income: "7" } + ListElement{ timestamp: "2007-07"; expenses: "6"; income: "4" } + ListElement{ timestamp: "2007-08"; expenses: "4"; income: "15" } + ListElement{ timestamp: "2007-09"; expenses: "2"; income: "18" } + ListElement{ timestamp: "2007-10"; expenses: "29"; income: "25" } + ListElement{ timestamp: "2007-11"; expenses: "23"; income: "29" } + ListElement{ timestamp: "2007-12"; expenses: "5"; income: "9" } - ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" } - ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" } - ListElement{ year: "2008"; month: "Mar"; expenses: "10"; income: "20" } - ListElement{ year: "2008"; month: "Apr"; expenses: "12"; income: "24" } - ListElement{ year: "2008"; month: "May"; expenses: "10"; income: "19" } - ListElement{ year: "2008"; month: "Jun"; expenses: "5"; income: "8" } - ListElement{ year: "2008"; month: "Jul"; expenses: "1"; income: "4" } - ListElement{ year: "2008"; month: "Aug"; expenses: "7"; income: "12" } - ListElement{ year: "2008"; month: "Sep"; expenses: "4"; income: "16" } - ListElement{ year: "2008"; month: "Oct"; expenses: "22"; income: "33" } - ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" } - ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" } + ListElement{ timestamp: "2008-01"; expenses: "3"; income: "8" } + ListElement{ timestamp: "2008-02"; expenses: "8"; income: "14" } + ListElement{ timestamp: "2008-03"; expenses: "10"; income: "20" } + ListElement{ timestamp: "2008-04"; expenses: "12"; income: "24" } + ListElement{ timestamp: "2008-05"; expenses: "10"; income: "19" } + ListElement{ timestamp: "2008-06"; expenses: "5"; income: "8" } + ListElement{ timestamp: "2008-07"; expenses: "1"; income: "4" } + ListElement{ timestamp: "2008-08"; expenses: "7"; income: "12" } + ListElement{ timestamp: "2008-09"; expenses: "4"; income: "16" } + ListElement{ timestamp: "2008-10"; expenses: "22"; income: "33" } + ListElement{ timestamp: "2008-11"; expenses: "16"; income: "25" } + ListElement{ timestamp: "2008-12"; expenses: "2"; income: "7" } - ListElement{ year: "2009"; month: "Jan"; expenses: "4"; income: "5" } - ListElement{ year: "2009"; month: "Feb"; expenses: "4"; income: "7" } - ListElement{ year: "2009"; month: "Mar"; expenses: "11"; income: "14" } - ListElement{ year: "2009"; month: "Apr"; expenses: "16"; income: "22" } - ListElement{ year: "2009"; month: "May"; expenses: "3"; income: "5" } - ListElement{ year: "2009"; month: "Jun"; expenses: "4"; income: "8" } - ListElement{ year: "2009"; month: "Jul"; expenses: "7"; income: "9" } - ListElement{ year: "2009"; month: "Aug"; expenses: "9"; income: "13" } - ListElement{ year: "2009"; month: "Sep"; expenses: "1"; income: "6" } - ListElement{ year: "2009"; month: "Oct"; expenses: "14"; income: "25" } - ListElement{ year: "2009"; month: "Nov"; expenses: "19"; income: "29" } - ListElement{ year: "2009"; month: "Dec"; expenses: "5"; income: "7" } + ListElement{ timestamp: "2009-01"; expenses: "4"; income: "5" } + ListElement{ timestamp: "2009-02"; expenses: "4"; income: "7" } + ListElement{ timestamp: "2009-03"; expenses: "11"; income: "14" } + ListElement{ timestamp: "2009-04"; expenses: "16"; income: "22" } + ListElement{ timestamp: "2009-05"; expenses: "3"; income: "5" } + ListElement{ timestamp: "2009-06"; expenses: "4"; income: "8" } + ListElement{ timestamp: "2009-07"; expenses: "7"; income: "9" } + ListElement{ timestamp: "2009-08"; expenses: "9"; income: "13" } + ListElement{ timestamp: "2009-09"; expenses: "1"; income: "6" } + ListElement{ timestamp: "2009-10"; expenses: "14"; income: "25" } + ListElement{ timestamp: "2009-11"; expenses: "19"; income: "29" } + ListElement{ timestamp: "2009-12"; expenses: "5"; income: "7" } - ListElement{ year: "2010"; month: "Jan"; expenses: "14"; income: "22" } - ListElement{ year: "2010"; month: "Feb"; expenses: "5"; income: "7" } - ListElement{ year: "2010"; month: "Mar"; expenses: "1"; income: "9" } - ListElement{ year: "2010"; month: "Apr"; expenses: "1"; income: "12" } - ListElement{ year: "2010"; month: "May"; expenses: "5"; income: "9" } - ListElement{ year: "2010"; month: "Jun"; expenses: "5"; income: "8" } - ListElement{ year: "2010"; month: "Jul"; expenses: "3"; income: "7" } - ListElement{ year: "2010"; month: "Aug"; expenses: "1"; income: "5" } - ListElement{ year: "2010"; month: "Sep"; expenses: "2"; income: "4" } - ListElement{ year: "2010"; month: "Oct"; expenses: "10"; income: "13" } - ListElement{ year: "2010"; month: "Nov"; expenses: "12"; income: "17" } - ListElement{ year: "2010"; month: "Dec"; expenses: "6"; income: "9" } + ListElement{ timestamp: "2010-01"; expenses: "14"; income: "22" } + ListElement{ timestamp: "2010-02"; expenses: "5"; income: "7" } + ListElement{ timestamp: "2010-03"; expenses: "1"; income: "9" } + ListElement{ timestamp: "2010-04"; expenses: "1"; income: "12" } + ListElement{ timestamp: "2010-05"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2010-06"; expenses: "5"; income: "8" } + ListElement{ timestamp: "2010-07"; expenses: "3"; income: "7" } + ListElement{ timestamp: "2010-08"; expenses: "1"; income: "5" } + ListElement{ timestamp: "2010-09"; expenses: "2"; income: "4" } + ListElement{ timestamp: "2010-10"; expenses: "10"; income: "13" } + ListElement{ timestamp: "2010-11"; expenses: "12"; income: "17" } + ListElement{ timestamp: "2010-12"; expenses: "6"; income: "9" } - ListElement{ year: "2011"; month: "Jan"; expenses: "2"; income: "6" } - ListElement{ year: "2011"; month: "Feb"; expenses: "4"; income: "8" } - ListElement{ year: "2011"; month: "Mar"; expenses: "7"; income: "12" } - ListElement{ year: "2011"; month: "Apr"; expenses: "9"; income: "15" } - ListElement{ year: "2011"; month: "May"; expenses: "7"; income: "19" } - ListElement{ year: "2011"; month: "Jun"; expenses: "9"; income: "18" } - ListElement{ year: "2011"; month: "Jul"; expenses: "13"; income: "17" } - ListElement{ year: "2011"; month: "Aug"; expenses: "5"; income: "9" } - ListElement{ year: "2011"; month: "Sep"; expenses: "3"; income: "8" } - ListElement{ year: "2011"; month: "Oct"; expenses: "13"; income: "15" } - ListElement{ year: "2011"; month: "Nov"; expenses: "8"; income: "17" } - ListElement{ year: "2011"; month: "Dec"; expenses: "7"; income: "10" } + ListElement{ timestamp: "2011-01"; expenses: "2"; income: "6" } + ListElement{ timestamp: "2011-02"; expenses: "4"; income: "8" } + ListElement{ timestamp: "2011-03"; expenses: "7"; income: "12" } + ListElement{ timestamp: "2011-04"; expenses: "9"; income: "15" } + ListElement{ timestamp: "2011-05"; expenses: "7"; income: "19" } + ListElement{ timestamp: "2011-06"; expenses: "9"; income: "18" } + ListElement{ timestamp: "2011-07"; expenses: "13"; income: "17" } + ListElement{ timestamp: "2011-08"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2011-09"; expenses: "3"; income: "8" } + ListElement{ timestamp: "2011-10"; expenses: "13"; income: "15" } + ListElement{ timestamp: "2011-11"; expenses: "8"; income: "17" } + ListElement{ timestamp: "2011-12"; expenses: "7"; income: "10" } - ListElement{ year: "2012"; month: "Jan"; expenses: "12"; income: "16" } - ListElement{ year: "2012"; month: "Feb"; expenses: "24"; income: "28" } - ListElement{ year: "2012"; month: "Mar"; expenses: "27"; income: "22" } - ListElement{ year: "2012"; month: "Apr"; expenses: "29"; income: "25" } - ListElement{ year: "2012"; month: "May"; expenses: "27"; income: "29" } - ListElement{ year: "2012"; month: "Jun"; expenses: "19"; income: "18" } - ListElement{ year: "2012"; month: "Jul"; expenses: "13"; income: "17" } - ListElement{ year: "2012"; month: "Aug"; expenses: "15"; income: "19" } - ListElement{ year: "2012"; month: "Sep"; expenses: "3"; income: "8" } - ListElement{ year: "2012"; month: "Oct"; expenses: "3"; income: "6" } - ListElement{ year: "2012"; month: "Nov"; expenses: "4"; income: "8" } - ListElement{ year: "2012"; month: "Dec"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2012-01"; expenses: "12"; income: "16" } + ListElement{ timestamp: "2012-02"; expenses: "24"; income: "28" } + ListElement{ timestamp: "2012-03"; expenses: "27"; income: "22" } + ListElement{ timestamp: "2012-04"; expenses: "29"; income: "25" } + ListElement{ timestamp: "2012-05"; expenses: "27"; income: "29" } + ListElement{ timestamp: "2012-06"; expenses: "19"; income: "18" } + ListElement{ timestamp: "2012-07"; expenses: "13"; income: "17" } + ListElement{ timestamp: "2012-08"; expenses: "15"; income: "19" } + ListElement{ timestamp: "2012-09"; expenses: "3"; income: "8" } + ListElement{ timestamp: "2012-10"; expenses: "3"; income: "6" } + ListElement{ timestamp: "2012-11"; expenses: "4"; income: "8" } + ListElement{ timestamp: "2012-12"; expenses: "5"; income: "9" } } } diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml index 0df8d8ae..2bb5e376 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml @@ -19,7 +19,7 @@ import QtQuick 2.1 import QtQuick.Controls 1.0 import QtQuick.Layouts 1.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 import QtQuick.Window 2.0 import "." @@ -50,14 +50,13 @@ Rectangle { // Set tableView current row to selected bar var rowRole = series.dataProxy.rowLabels[position.x]; var colRole = series.dataProxy.columnLabels[position.y]; + var checkTimestamp = rowRole + "-" + colRole var currentRow = tableView.currentRow - if (currentRow === -1 || rowRole !== graphData.model.get(currentRow).year - || colRole !== graphData.model.get(currentRow).month) { + if (currentRow === -1 || checkTimestamp !== graphData.model.get(currentRow).timestamp) { var totalRows = tableView.rowCount; for (var i = 0; i < totalRows; i++) { - var currentRowRole = graphData.model.get(i).year - var currentColRole = graphData.model.get(i).month - if (currentRowRole === rowRole && currentColRole === colRole) { + var modelTimestamp = graphData.model.get(i).timestamp + if (modelTimestamp === checkTimestamp) { tableView.currentRow = i // Workaround to 5.2 row selection issue if (typeof tableView.selection != "undefined") { @@ -111,9 +110,13 @@ Rectangle { ItemModelBarDataProxy { id: modelProxy itemModel: graphData.model - rowRole: "year" - columnRole: "month" + rowRole: "timestamp" + columnRole: "timestamp" valueRole: "income" + rowRolePattern: /^(\d\d\d\d).*$/ + columnRolePattern: /^.*-(\d\d)$/ + rowRoleReplace: "\\1" + columnRoleReplace: "\\1" } //! [3] @@ -136,9 +139,13 @@ Rectangle { ItemModelBarDataProxy { id: secondaryProxy itemModel: graphData.model - rowRole: "year" - columnRole: "month" + rowRole: "timestamp" + columnRole: "timestamp" valueRole: "expenses" + rowRolePattern: /^(\d\d\d\d).*$/ + columnRolePattern: /^.*-(\d\d)$/ + rowRoleReplace: "\\1" + columnRoleReplace: "\\1" } //! [4] @@ -157,16 +164,42 @@ Rectangle { id: tableView anchors.top: parent.top anchors.left: parent.left - TableViewColumn{ role: "year" ; title: "Year" ; width: tableView.width / 4 } - TableViewColumn{ role: "month" ; title: "Month" ; width: tableView.width / 4 } + TableViewColumn{ role: "timestamp" ; title: "Month" ; width: tableView.width / 2 } TableViewColumn{ role: "expenses" ; title: "Expenses" ; width: tableView.width / 4 } TableViewColumn{ role: "income" ; title: "Income" ; width: tableView.width / 4 } + itemDelegate: Item { + Text { + anchors.verticalCenter: parent.verticalCenter + width: parent.width + anchors.leftMargin: 4 + anchors.left: parent.left + anchors.right: parent.right + color: styleData.textColor + elide: styleData.elideMode + text: styleData.value + horizontalAlignment: styleData.textAlignment + + Component.onCompleted: { + if (styleData.column === 0) { + var pattern = /(\d\d\d\d)-(\d\d)/ + var matches = pattern.exec(styleData.value) + var colIndex = parseInt(matches[2], 10) - 1 + text = matches[1] + " - " + barGraph.columnAxis.labels[colIndex] + + } + } + } + } + model: graphData.model //! [2] onCurrentRowChanged: { - var rowIndex = modelProxy.rowCategoryIndex(graphData.model.get(currentRow).year) - var colIndex = modelProxy.columnCategoryIndex(graphData.model.get(currentRow).month) + var timestamp = graphData.model.get(currentRow).timestamp + var pattern = /(\d\d\d\d)-(\d\d)/ + var matches = pattern.exec(timestamp) + var rowIndex = modelProxy.rowCategoryIndex(matches[1]) + var colIndex = modelProxy.columnCategoryIndex(matches[2]) if (selectedSeries.visible) mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex) else if (barSeries.visible) diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index 3b02c1e3..e8941c4b 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -28,7 +28,9 @@ BarItemModelHandler::BarItemModelHandler(QItemModelBarDataProxy *proxy, QObject m_proxyArray(0), m_columnCount(0), m_valueRole(noRoleIndex), - m_rotationRole(noRoleIndex) + m_rotationRole(noRoleIndex), + m_haveValuePattern(false), + m_haveRotationPattern(false) { } @@ -54,9 +56,24 @@ void BarItemModelHandler::handleDataChanged(const QModelIndex &topLeft, for (int i = startRow; i <= endRow; i++) { for (int j = startCol; j <= endCol; j++) { QBarDataItem item; - item.setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat()); - if (m_rotationRole != noRoleIndex) - item.setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat()); + QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole); + float value; + if (m_haveValuePattern) + value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); + else + value = valueVar.toFloat(); + item.setValue(value); + if (m_rotationRole != noRoleIndex) { + QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole); + float rotation; + if (m_haveRotationPattern) { + rotation = rotationVar.toString().replace(m_rotationPattern, + m_rotationReplace).toFloat(); + } else { + rotation = rotationVar.toFloat(); + } + item.setRotation(rotation); + } m_proxy->setItem(i, j, item); } } @@ -78,6 +95,21 @@ void BarItemModelHandler::resolveModel() return; } + // Value and rotation patterns can be reused on single item changes, + // so store them to member variables. + QRegExp rowPattern(m_proxy->rowRolePattern()); + QRegExp colPattern(m_proxy->columnRolePattern()); + m_valuePattern = m_proxy->valueRolePattern(); + m_rotationPattern = m_proxy->rotationRolePattern(); + QString rowReplace = m_proxy->rowRoleReplace(); + QString colReplace = m_proxy->columnRoleReplace(); + m_valueReplace = m_proxy->valueRoleReplace(); + m_rotationReplace = m_proxy->rotationRoleReplace(); + bool haveRowPattern = !rowPattern.isEmpty() && rowPattern.isValid(); + bool haveColPattern = !colPattern.isEmpty() && colPattern.isValid(); + m_haveValuePattern = !m_valuePattern.isEmpty() && m_valuePattern.isValid(); + m_haveRotationPattern = !m_rotationPattern.isEmpty() && m_rotationPattern.isValid(); + QStringList rowLabels; QStringList columnLabels; @@ -101,9 +133,24 @@ void BarItemModelHandler::resolveModel() for (int i = 0; i < rowCount; i++) { QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnCount; j++) { - newProxyRow[j].setValue(m_itemModel->index(i, j).data(m_valueRole).toFloat()); - if (m_rotationRole != noRoleIndex) - newProxyRow[j].setRotation(m_itemModel->index(i, j).data(m_rotationRole).toFloat()); + QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole); + float value; + if (m_haveValuePattern) + value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); + else + value = valueVar.toFloat(); + newProxyRow[j].setValue(value); + if (m_rotationRole != noRoleIndex) { + QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole); + float rotation; + if (m_haveRotationPattern) { + rotation = rotationVar.toString().replace(m_rotationPattern, + m_rotationReplace).toFloat(); + } else { + rotation = rotationVar.toFloat(); + } + newProxyRow[j].setRotation(rotation); + } } } // Generate labels from headers if using model rows/columns @@ -133,10 +180,29 @@ void BarItemModelHandler::resolveModel() for (int j = 0; j < columnCount; j++) { QModelIndex index = m_itemModel->index(i, j); QString rowRoleStr = index.data(rowRole).toString(); + if (haveRowPattern) + rowRoleStr.replace(rowPattern, rowReplace); QString columnRoleStr = index.data(columnRole).toString(); - itemValueMap[rowRoleStr][columnRoleStr] = index.data(m_valueRole).toFloat(); - if (m_rotationRole != noRoleIndex) - itemRotationMap[rowRoleStr][columnRoleStr] = index.data(m_rotationRole).toFloat(); + if (haveColPattern) + columnRoleStr.replace(colPattern, colReplace); + QVariant valueVar = index.data(m_valueRole); + float value; + if (m_haveValuePattern) + value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); + else + value = valueVar.toFloat(); + itemValueMap[rowRoleStr][columnRoleStr] = value; + if (m_rotationRole != noRoleIndex) { + QVariant rotationVar = index.data(m_rotationRole); + float rotation; + if (m_haveRotationPattern) { + rotation = rotationVar.toString().replace(m_rotationPattern, + m_rotationReplace).toFloat(); + } else { + rotation = rotationVar.toFloat(); + } + itemRotationMap[rowRoleStr][columnRoleStr] = rotation; + } if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); rowList << rowRoleStr; diff --git a/src/datavisualization/data/baritemmodelhandler_p.h b/src/datavisualization/data/baritemmodelhandler_p.h index 737e0055..6dea906e 100644 --- a/src/datavisualization/data/baritemmodelhandler_p.h +++ b/src/datavisualization/data/baritemmodelhandler_p.h @@ -53,6 +53,12 @@ protected: int m_columnCount; int m_valueRole; int m_rotationRole; + QRegExp m_valuePattern; + QRegExp m_rotationPattern; + QString m_valueReplace; + QString m_rotationReplace; + bool m_haveValuePattern; + bool m_haveRotationPattern; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index 2281e33f..2351bc25 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -50,12 +50,22 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * and in which order by defining an explicit list of categories for either or both of rows and * columns. * - * For example, assume that you have a custom QAbstractItemModel for storing various monthly values - * related to a business. - * Each item in the model has the roles "year", "month", "income", and "expenses". - * You could do the following to display the data in a bar graph: + * For example, assume that you have a custom QAbstractItemModel for storing various monthly values + * related to a business. + * Each item in the model has the roles "year", "month", "income", and "expenses". + * You could do the following to display the data in a bar graph: * - * \snippet doc_src_qtdatavisualization.cpp 3 + * \snippet doc_src_qtdatavisualization.cpp 3 + * + * If the fields of the model do not contain the data in the exact format you need, you can specify + * a search pattern regular expression and a replace rule for each role to get the value in a + * format you need. For more information how the replace using regular expressions works, see + * QString::replace(const QRegExp &rx, const QString &after) function documentation. Note that + * using regular expressions has an impact on the performance, so it's more efficient to utilize + * item models where doing search and replace is not necessary to get the desired values. + * + * For example about using the search patterns in conjunction with the roles, see + * \l{Qt Quick 2 Bars Example}. * * \sa {Qt Data Visualization Data Handling} */ @@ -90,35 +100,36 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string ItemModelBarDataProxy::rowRole - * The row role of the mapping. + * Defines the item model role to map into row category. */ /*! * \qmlproperty string ItemModelBarDataProxy::columnRole - * The column role of the mapping. + * Defines the item model role to map into column category. */ /*! * \qmlproperty string ItemModelBarDataProxy::valueRole - * The value role of the mapping. + * Defines the item model role to map into bar value. */ /*! * \qmlproperty string ItemModelBarDataProxy::rotationRole - * - * Defines the rotation role for the mapping. + * Defines the item model role to map into bar rotation angle. */ /*! * \qmlproperty list ItemModelBarDataProxy::rowCategories - * The row categories of the mapping. Only items with row roles that are found in this list are - * included when the data is resolved. The rows are ordered in the same order as they are in this list. + * The row categories of the mapping. Only items with row role values that are found in this list + * are included when the data is resolved. The rows are ordered in the same order as they are in + * this list. */ /*! * \qmlproperty list ItemModelBarDataProxy::columnCategories - * The column categories of the mapping. Only items with column roles that are found in this list are - * included when the data is resolved. The columns are ordered in the same order as they are in this list. + * The column categories of the mapping. Only items with column role values that are found in this + * list are included when the data is resolved. The columns are ordered in the same order as they + * are in this list. */ /*! @@ -142,6 +153,86 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * data from model is resolved. Defaults to \c{true}. */ +/*! + * \qmlproperty regExp ItemModelBarDataProxy::rowRolePattern + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from a single + * timestamp field in the item model. + * + * \sa rowRole, rowRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::columnRolePattern + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from + * a single timestamp field in the item model. + * + * \sa columnRole, columnRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::valueRolePattern + * When set, a search and replace is done on the value mapped by value role before it is used as + * a bar value. This property specifies the regular expression to find the portion of the + * mapped value to replace and valueRoleReplace property contains the replacement string. + * + * \sa valueRole, valueRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelBarDataProxy::rotationRolePattern + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a bar rotation angle. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::rowRoleReplace + * This property defines the replace content to be used in conjunction with rowRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rowRole, rowRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::columnRoleReplace + * This property defines the replace content to be used in conjunction with columnRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa columnRole, columnRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::valueRoleReplace + * This property defines the replace content to be used in conjunction with valueRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa valueRole, valueRolePattern + */ + +/*! + * \qmlproperty string ItemModelBarDataProxy::rotationRoleReplace + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern + */ + /*! * Constructs QItemModelBarDataProxy with optional \a parent. */ @@ -505,6 +596,190 @@ int QItemModelBarDataProxy::columnCategoryIndex(const QString &category) return dptr()->m_columnCategories.indexOf(category); } +/*! + * \property QItemModelBarDataProxy::rowRolePattern + * + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from a single + * timestamp field in the item model. + * + * \sa rowRole, rowRoleReplace + */ +void QItemModelBarDataProxy::setRowRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rowRolePattern != pattern) { + dptr()->m_rowRolePattern = pattern; + emit rowRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::rowRolePattern() const +{ + return dptrc()->m_rowRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::columnRolePattern + * + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * This is useful for example in parsing row and column categories from + * a single timestamp field in the item model. + * + * \sa columnRole, columnRoleReplace + */ +void QItemModelBarDataProxy::setColumnRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_columnRolePattern != pattern) { + dptr()->m_columnRolePattern = pattern; + emit columnRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::columnRolePattern() const +{ + return dptrc()->m_columnRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::valueRolePattern + * + * When set, a search and replace is done on the value mapped by value role before it is used as + * a bar value. This property specifies the regular expression to find the portion of the + * mapped value to replace and valueRoleReplace property contains the replacement string. + * + * \sa valueRole, valueRoleReplace + */ +void QItemModelBarDataProxy::setValueRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_valueRolePattern != pattern) { + dptr()->m_valueRolePattern = pattern; + emit valueRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::valueRolePattern() const +{ + return dptrc()->m_valueRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::rotationRolePattern + * + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a bar rotation angle. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ +void QItemModelBarDataProxy::setRotationRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rotationRolePattern != pattern) { + dptr()->m_rotationRolePattern = pattern; + emit rotationRolePatternChanged(pattern); + } +} + +QRegExp QItemModelBarDataProxy::rotationRolePattern() const +{ + return dptrc()->m_rotationRolePattern; +} + +/*! + * \property QItemModelBarDataProxy::rowRoleReplace + * + * This property defines the replace content to be used in conjunction with rowRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rowRole, rowRolePattern + */ +void QItemModelBarDataProxy::setRowRoleReplace(const QString &replace) +{ + if (dptr()->m_rowRoleReplace != replace) { + dptr()->m_rowRoleReplace = replace; + emit rowRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::rowRoleReplace() const +{ + return dptrc()->m_rowRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::columnRoleReplace + * + * This property defines the replace content to be used in conjunction with columnRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa columnRole, columnRolePattern + */ +void QItemModelBarDataProxy::setColumnRoleReplace(const QString &replace) +{ + if (dptr()->m_columnRoleReplace != replace) { + dptr()->m_columnRoleReplace = replace; + emit columnRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::columnRoleReplace() const +{ + return dptrc()->m_columnRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::valueRoleReplace + * + * This property defines the replace content to be used in conjunction with valueRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa valueRole, valueRolePattern + */ +void QItemModelBarDataProxy::setValueRoleReplace(const QString &replace) +{ + if (dptr()->m_valueRoleReplace != replace) { + dptr()->m_valueRoleReplace = replace; + emit valueRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::valueRoleReplace() const +{ + return dptrc()->m_valueRoleReplace; +} + +/*! + * \property QItemModelBarDataProxy::rotationRoleReplace + * + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern + */ +void QItemModelBarDataProxy::setRotationRoleReplace(const QString &replace) +{ + if (dptr()->m_rotationRoleReplace != replace) { + dptr()->m_rotationRoleReplace = replace; + emit rotationRoleReplaceChanged(replace); + } +} + +QString QItemModelBarDataProxy::rotationRoleReplace() const +{ + return dptrc()->m_rotationRoleReplace; +} + /*! * \internal */ @@ -564,6 +839,22 @@ void QItemModelBarDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelBarDataProxy::autoColumnCategoriesChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rowRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::columnRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::valueRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rowRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::columnRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::valueRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h index f19b4445..ad7be3a7 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.h +++ b/src/datavisualization/data/qitemmodelbardataproxy.h @@ -21,6 +21,7 @@ #include #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -39,6 +40,14 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged) Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories NOTIFY autoRowCategoriesChanged) Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories NOTIFY autoColumnCategoriesChanged) + Q_PROPERTY(QRegExp rowRolePattern READ rowRolePattern WRITE setRowRolePattern NOTIFY rowRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp columnRolePattern READ columnRolePattern WRITE setColumnRolePattern NOTIFY columnRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp valueRolePattern READ valueRolePattern WRITE setValueRolePattern NOTIFY valueRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp rotationRolePattern READ rotationRolePattern WRITE setRotationRolePattern NOTIFY rotationRolePatternChanged REVISION 1) + Q_PROPERTY(QString rowRoleReplace READ rowRoleReplace WRITE setRowRoleReplace NOTIFY rowRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString columnRoleReplace READ columnRoleReplace WRITE setColumnRoleReplace NOTIFY columnRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString valueRoleReplace READ valueRoleReplace WRITE setValueRoleReplace NOTIFY valueRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString rotationRoleReplace READ rotationRoleReplace WRITE setRotationRoleReplace NOTIFY rotationRoleReplaceChanged REVISION 1) public: explicit QItemModelBarDataProxy(QObject *parent = 0); @@ -93,6 +102,24 @@ public: Q_INVOKABLE int rowCategoryIndex(const QString& category); Q_INVOKABLE int columnCategoryIndex(const QString& category); + void setRowRolePattern(const QRegExp &pattern); + QRegExp rowRolePattern() const; + void setColumnRolePattern(const QRegExp &pattern); + QRegExp columnRolePattern() const; + void setValueRolePattern(const QRegExp &pattern); + QRegExp valueRolePattern() const; + void setRotationRolePattern(const QRegExp &pattern); + QRegExp rotationRolePattern() const; + + void setRowRoleReplace(const QString &replace); + QString rowRoleReplace() const; + void setColumnRoleReplace(const QString &replace); + QString columnRoleReplace() const; + void setValueRoleReplace(const QString &replace); + QString valueRoleReplace() const; + void setRotationRoleReplace(const QString &replace); + QString rotationRoleReplace() const; + signals: void itemModelChanged(const QAbstractItemModel* itemModel); void rowRoleChanged(const QString &role); @@ -104,6 +131,14 @@ signals: void useModelCategoriesChanged(bool enable); void autoRowCategoriesChanged(bool enable); void autoColumnCategoriesChanged(bool enable); + Q_REVISION(1) void rowRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void columnRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void valueRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void rotationRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void rowRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void columnRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void valueRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void rotationRoleReplaceChanged(const QString &replace); protected: QItemModelBarDataProxyPrivate *dptr(); diff --git a/src/datavisualization/data/qitemmodelbardataproxy_p.h b/src/datavisualization/data/qitemmodelbardataproxy_p.h index 2fd74bb2..3e8fa3ae 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy_p.h +++ b/src/datavisualization/data/qitemmodelbardataproxy_p.h @@ -63,6 +63,16 @@ private: bool m_autoRowCategories; bool m_autoColumnCategories; + QRegExp m_rowRolePattern; + QRegExp m_columnRolePattern; + QRegExp m_valueRolePattern; + QRegExp m_rotationRolePattern; + + QString m_rowRoleReplace; + QString m_columnRoleReplace; + QString m_valueRoleReplace; + QString m_rotationRoleReplace; + friend class BarItemModelHandler; friend class QItemModelBarDataProxy; }; diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index 71c54265..d7a82d6b 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -92,6 +92,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); + qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); diff --git a/tests/itemmodeltest/main.cpp b/tests/itemmodeltest/main.cpp index 419ee162..a607fe8d 100644 --- a/tests/itemmodeltest/main.cpp +++ b/tests/itemmodeltest/main.cpp @@ -149,11 +149,11 @@ void GraphDataGenerator::setupModel() weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5"; // Set up data Mon Tue Wed Thu Fri Sat Sun - float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 10.0f}, // week 1 - {0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2 - {1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3 - {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4 - {3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5 + const char *hours[5][7] = {{"2.0/30", "1.0/30", "3.0/30", "0.2/30", "1.0/30", "5.0/30", "10.0/30"}, // week 1 + {"0.5/45", "1.0/45", "3.0/45", "1.0/45", "2.0/45", "2.0/45", "3.0/45"}, // week 2 + {"1.0/60", "1.0/60", "2.0/60", "1.0/60", "4.0/60", "4.0/60", "4.0/60"}, // week 3 + {"0.0/75", "1.0/75", "0.0/75", "0.0/75", "2.0/75", "2.0/75", "0.3/75"}, // week 4 + {"3.0/90", "3.0/90", "6.0/90", "2.0/90", "2.0/90", "1.0/90", "1.0/90"}}; // week 5 // Add labels m_barGraph->rowAxis()->setTitle("Week of year"); @@ -190,7 +190,8 @@ void GraphDataGenerator::addRow() for (int i = 0; i < m_columnCount; i++) { QModelIndex index = m_tableWidget->model()->index(0, i); m_tableWidget->model()->setData(index, - ((float)i / (float)m_columnCount) / 2.0f + (float)(rand() % 30) / 100.0f); + ((float)i / (float)m_columnCount) / 2.0f + + (float)(rand() % 30) / 100.0f); } m_tableWidget->resizeColumnsToContents(); } @@ -225,8 +226,12 @@ void GraphDataGenerator::changeSelectedButtonClicked() // Change all selected cells to a random value 1-10 QVariant value = QVariant::fromValue(float((rand() % 10) + 1)); QList selectedItems = m_tableWidget->selectedItems(); - foreach (QTableWidgetItem *item, selectedItems) - item->setData(Qt::DisplayRole, value); + foreach (QTableWidgetItem *item, selectedItems) { + item->setData(Qt::DisplayRole, + QString::number(value.toReal()) + .append("/") + .append(QString::number(value.toReal() * 10))); + } } int main(int argc, char **argv) @@ -269,6 +274,12 @@ int main(int argc, char **argv) QItemModelSurfaceDataProxy *surfaceProxy = new QItemModelSurfaceDataProxy(tableWidget->model()); barProxy->setUseModelCategories(true); surfaceProxy->setUseModelCategories(true); + barProxy->setRotationRole(tableWidget->model()->roleNames().value(Qt::DisplayRole)); + barProxy->setValueRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$"))); + barProxy->setRotationRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$"))); + barProxy->setValueRoleReplace(QStringLiteral("\\1")); + barProxy->setRotationRoleReplace(QStringLiteral("\\2")); + // TODO surface proxy test QBar3DSeries *barSeries = new QBar3DSeries(barProxy); QSurface3DSeries *surfaceSeries = new QSurface3DSeries(surfaceProxy); barSeries->setMesh(QAbstract3DSeries::MeshPyramid); diff --git a/tests/qmlcamera/qml/qmlcamera/Axes.qml b/tests/qmlcamera/qml/qmlcamera/Axes.qml index a6b8d4de..6494adbc 100644 --- a/tests/qmlcamera/qml/qmlcamera/Axes.qml +++ b/tests/qmlcamera/qml/qmlcamera/Axes.qml @@ -35,15 +35,11 @@ Item { } ValueAxis3D { id: incomeAxis - min: 0 - max: 35 labelFormat: "%.2f M\u20AC" title: "Monthly income" } ValueAxis3D { id: expensesAxis - min: 0 - max: 35 labelFormat: "-%.2f M\u20AC" title: "Monthly expenses" } diff --git a/tests/qmlcamera/qml/qmlcamera/Data.qml b/tests/qmlcamera/qml/qmlcamera/Data.qml index bab6bf78..8a301925 100644 --- a/tests/qmlcamera/qml/qmlcamera/Data.qml +++ b/tests/qmlcamera/qml/qmlcamera/Data.qml @@ -17,7 +17,7 @@ ****************************************************************************/ import QtQuick 2.1 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 Item { property alias model: dataModel @@ -31,6 +31,10 @@ Item { columnRole: "month" valueRole: "expenses" rotationRole: "angle" + valueRolePattern: /@*(\d*)t*/ + rotationRolePattern: /jjj/ + valueRoleReplace: "\\1" + rotationRoleReplace: "1" } Bar3DSeries { @@ -43,95 +47,95 @@ Item { ListModel { id: dataModel - ListElement{ year: "2006"; month: "Jan"; expenses: "4"; angle: "1"; income: "5" } - ListElement{ year: "2006"; month: "Feb"; expenses: "5"; angle: "2"; income: "6" } - ListElement{ year: "2006"; month: "Mar"; expenses: "7"; angle: "3"; income: "4" } - ListElement{ year: "2006"; month: "Apr"; expenses: "3"; angle: "4"; income: "2" } - ListElement{ year: "2006"; month: "May"; expenses: "4"; angle: "5"; income: "1" } - ListElement{ year: "2006"; month: "Jun"; expenses: "2"; angle: "6"; income: "2" } - ListElement{ year: "2006"; month: "Jul"; expenses: "1"; angle: "7"; income: "3" } - ListElement{ year: "2006"; month: "Aug"; expenses: "5"; angle: "8"; income: "1" } - ListElement{ year: "2006"; month: "Sep"; expenses: "2"; angle: "9"; income: "3" } - ListElement{ year: "2006"; month: "Oct"; expenses: "5"; angle: "10"; income: "2" } - ListElement{ year: "2006"; month: "Nov"; expenses: "8"; angle: "11"; income: "5" } - ListElement{ year: "2006"; month: "Dec"; expenses: "3"; angle: "12"; income: "3" } + ListElement{ year: "2006"; month: "Jan"; expenses: "@@4ttt"; angle: "jjj1"; income: "5" } + ListElement{ year: "2006"; month: "Feb"; expenses: "@@5ttt"; angle: "jjj2"; income: "6" } + ListElement{ year: "2006"; month: "Mar"; expenses: "@@7ttt"; angle: "jjj3"; income: "4" } + ListElement{ year: "2006"; month: "Apr"; expenses: "@@3ttt"; angle: "jjj4"; income: "2" } + ListElement{ year: "2006"; month: "May"; expenses: "@@4ttt"; angle: "jjj5"; income: "1" } + ListElement{ year: "2006"; month: "Jun"; expenses: "@@2ttt"; angle: "jjj6"; income: "2" } + ListElement{ year: "2006"; month: "Jul"; expenses: "@@1ttt"; angle: "jjj7"; income: "3" } + ListElement{ year: "2006"; month: "Aug"; expenses: "@@5ttt"; angle: "jjj8"; income: "1" } + ListElement{ year: "2006"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj9"; income: "3" } + ListElement{ year: "2006"; month: "Oct"; expenses: "@@5ttt"; angle: "jjj10"; income: "2" } + ListElement{ year: "2006"; month: "Nov"; expenses: "@@8ttt"; angle: "jjj11"; income: "5" } + ListElement{ year: "2006"; month: "Dec"; expenses: "@@3ttt"; angle: "jjj12"; income: "3" } - ListElement{ year: "2007"; month: "Jan"; expenses: "3"; angle: "13"; income: "1" } - ListElement{ year: "2007"; month: "Feb"; expenses: "4"; angle: "14"; income: "2" } - ListElement{ year: "2007"; month: "Mar"; expenses: "12";angle: "15"; income: "4" } - ListElement{ year: "2007"; month: "Apr"; expenses: "13";angle: "16"; income: "6" } - ListElement{ year: "2007"; month: "May"; expenses: "14";angle: "17"; income: "11" } - ListElement{ year: "2007"; month: "Jun"; expenses: "7"; angle: "18"; income: "7" } - ListElement{ year: "2007"; month: "Jul"; expenses: "6"; angle: "19"; income: "4" } - ListElement{ year: "2007"; month: "Aug"; expenses: "4"; angle: "20"; income: "15" } - ListElement{ year: "2007"; month: "Sep"; expenses: "2"; angle: "21"; income: "18" } - ListElement{ year: "2007"; month: "Oct"; expenses: "29";angle: "22"; income: "25" } - ListElement{ year: "2007"; month: "Nov"; expenses: "23";angle: "23"; income: "29" } - ListElement{ year: "2007"; month: "Dec"; expenses: "5"; angle: "24"; income: "9" } + ListElement{ year: "2007"; month: "Jan"; expenses: "@@3ttt"; angle: "jjj13"; income: "1" } + ListElement{ year: "2007"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj14"; income: "2" } + ListElement{ year: "2007"; month: "Mar"; expenses: "@@12ttt"; angle: "jjj15"; income: "4" } + ListElement{ year: "2007"; month: "Apr"; expenses: "@@13ttt"; angle: "jjj16"; income: "6" } + ListElement{ year: "2007"; month: "May"; expenses: "@@14ttt"; angle: "jjj17"; income: "11" } + ListElement{ year: "2007"; month: "Jun"; expenses: "@@7ttt"; angle: "jjj18"; income: "7" } + ListElement{ year: "2007"; month: "Jul"; expenses: "@@6ttt"; angle: "jjj19"; income: "4" } + ListElement{ year: "2007"; month: "Aug"; expenses: "@@4ttt"; angle: "jjj20"; income: "15" } + ListElement{ year: "2007"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj21"; income: "18" } + ListElement{ year: "2007"; month: "Oct"; expenses: "@@29ttt"; angle: "jjj22"; income: "25" } + ListElement{ year: "2007"; month: "Nov"; expenses: "@@23ttt"; angle: "jjj23"; income: "29" } + ListElement{ year: "2007"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj24"; income: "9" } - ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" } - ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" } - ListElement{ year: "2008"; month: "Mar"; expenses: "10"; income: "20" } - ListElement{ year: "2008"; month: "Apr"; expenses: "12"; income: "24" } - ListElement{ year: "2008"; month: "May"; expenses: "10"; income: "19" } - ListElement{ year: "2008"; month: "Jun"; expenses: "5"; income: "8" } - ListElement{ year: "2008"; month: "Jul"; expenses: "1"; income: "4" } - ListElement{ year: "2008"; month: "Aug"; expenses: "7"; income: "12" } - ListElement{ year: "2008"; month: "Sep"; expenses: "4"; income: "16" } - ListElement{ year: "2008"; month: "Oct"; expenses: "22"; income: "33" } - ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" } - ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" } + ListElement{ year: "2008"; month: "Jan"; expenses: "@@3"; income: "8" } + ListElement{ year: "2008"; month: "Feb"; expenses: "@@8"; income: "14" } + ListElement{ year: "2008"; month: "Mar"; expenses: "@@10"; income: "20" } + ListElement{ year: "2008"; month: "Apr"; expenses: "@@12"; income: "24" } + ListElement{ year: "2008"; month: "May"; expenses: "@@10"; income: "19" } + ListElement{ year: "2008"; month: "Jun"; expenses: "@@5"; income: "8" } + ListElement{ year: "2008"; month: "Jul"; expenses: "@@1"; income: "4" } + ListElement{ year: "2008"; month: "Aug"; expenses: "@@7"; income: "12" } + ListElement{ year: "2008"; month: "Sep"; expenses: "@@4"; income: "16" } + ListElement{ year: "2008"; month: "Oct"; expenses: "@@22"; income: "33" } + ListElement{ year: "2008"; month: "Nov"; expenses: "@@16"; income: "25" } + ListElement{ year: "2008"; month: "Dec"; expenses: "@@2"; income: "7" } - ListElement{ year: "2009"; month: "Jan"; expenses: "4"; angle: "37"; income: "5" } - ListElement{ year: "2009"; month: "Feb"; expenses: "4"; angle: "38"; income: "7" } - ListElement{ year: "2009"; month: "Mar"; expenses: "11";angle: "39"; income: "14" } - ListElement{ year: "2009"; month: "Apr"; expenses: "16";angle: "40"; income: "22" } - ListElement{ year: "2009"; month: "May"; expenses: "3"; angle: "41"; income: "5" } - ListElement{ year: "2009"; month: "Jun"; expenses: "4"; angle: "42"; income: "8" } - ListElement{ year: "2009"; month: "Jul"; expenses: "7"; angle: "43"; income: "9" } - ListElement{ year: "2009"; month: "Aug"; expenses: "9"; angle: "44"; income: "13" } - ListElement{ year: "2009"; month: "Sep"; expenses: "1"; angle: "45"; income: "6" } - ListElement{ year: "2009"; month: "Oct"; expenses: "14";angle: "46"; income: "25" } - ListElement{ year: "2009"; month: "Nov"; expenses: "19";angle: "47"; income: "29" } - ListElement{ year: "2009"; month: "Dec"; expenses: "5"; angle: "48"; income: "7" } + ListElement{ year: "2009"; month: "Jan"; expenses: "@@4ttt"; angle: "jjj37"; income: "5" } + ListElement{ year: "2009"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj38"; income: "7" } + ListElement{ year: "2009"; month: "Mar"; expenses: "@@11ttt"; angle: "jjj39"; income: "14" } + ListElement{ year: "2009"; month: "Apr"; expenses: "@@16ttt"; angle: "jjj40"; income: "22" } + ListElement{ year: "2009"; month: "May"; expenses: "@@3ttt"; angle: "jjj41"; income: "5" } + ListElement{ year: "2009"; month: "Jun"; expenses: "@@4ttt"; angle: "jjj42"; income: "8" } + ListElement{ year: "2009"; month: "Jul"; expenses: "@@7ttt"; angle: "jjj43"; income: "9" } + ListElement{ year: "2009"; month: "Aug"; expenses: "@@9ttt"; angle: "jjj44"; income: "13" } + ListElement{ year: "2009"; month: "Sep"; expenses: "@@1ttt"; angle: "jjj45"; income: "6" } + ListElement{ year: "2009"; month: "Oct"; expenses: "@@14ttt"; angle: "jjj46"; income: "25" } + ListElement{ year: "2009"; month: "Nov"; expenses: "@@19ttt"; angle: "jjj47"; income: "29" } + ListElement{ year: "2009"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj48"; income: "7" } - ListElement{ year: "2010"; month: "Jan"; expenses: "14";angle: "49"; income: "22" } - ListElement{ year: "2010"; month: "Feb"; expenses: "5"; angle: "50"; income: "7" } - ListElement{ year: "2010"; month: "Mar"; expenses: "1"; angle: "51"; income: "9" } - ListElement{ year: "2010"; month: "Apr"; expenses: "1"; angle: "52"; income: "12" } - ListElement{ year: "2010"; month: "May"; expenses: "5"; angle: "53"; income: "9" } - ListElement{ year: "2010"; month: "Jun"; expenses: "5"; angle: "54"; income: "8" } - ListElement{ year: "2010"; month: "Jul"; expenses: "3"; angle: "55"; income: "7" } - ListElement{ year: "2010"; month: "Aug"; expenses: "1"; angle: "56"; income: "5" } - ListElement{ year: "2010"; month: "Sep"; expenses: "2"; angle: "57"; income: "4" } - ListElement{ year: "2010"; month: "Oct"; expenses: "10";angle: "58"; income: "13" } - ListElement{ year: "2010"; month: "Nov"; expenses: "12";angle: "59"; income: "17" } - ListElement{ year: "2010"; month: "Dec"; expenses: "6"; angle: "60"; income: "9" } + ListElement{ year: "2010"; month: "Jan"; expenses: "@@14ttt"; angle: "jjj49"; income: "22" } + ListElement{ year: "2010"; month: "Feb"; expenses: "@@5ttt"; angle: "jjj50"; income: "7" } + ListElement{ year: "2010"; month: "Mar"; expenses: "@@1ttt"; angle: "jjj51"; income: "9" } + ListElement{ year: "2010"; month: "Apr"; expenses: "@@1ttt"; angle: "jjj52"; income: "12" } + ListElement{ year: "2010"; month: "May"; expenses: "@@5ttt"; angle: "jjj53"; income: "9" } + ListElement{ year: "2010"; month: "Jun"; expenses: "@@5ttt"; angle: "jjj54"; income: "8" } + ListElement{ year: "2010"; month: "Jul"; expenses: "@@3ttt"; angle: "jjj55"; income: "7" } + ListElement{ year: "2010"; month: "Aug"; expenses: "@@1ttt"; angle: "jjj56"; income: "5" } + ListElement{ year: "2010"; month: "Sep"; expenses: "@@2ttt"; angle: "jjj57"; income: "4" } + ListElement{ year: "2010"; month: "Oct"; expenses: "@@10ttt"; angle: "jjj58"; income: "13" } + ListElement{ year: "2010"; month: "Nov"; expenses: "@@12ttt"; angle: "jjj59"; income: "17" } + ListElement{ year: "2010"; month: "Dec"; expenses: "@@6ttt"; angle: "jjj60"; income: "9" } - ListElement{ year: "2011"; month: "Jan"; expenses: "2"; angle: "61"; income: "6" } - ListElement{ year: "2011"; month: "Feb"; expenses: "4"; angle: "62"; income: "8" } - ListElement{ year: "2011"; month: "Mar"; expenses: "7"; angle: "63"; income: "12" } - ListElement{ year: "2011"; month: "Apr"; expenses: "9"; angle: "64"; income: "15" } - ListElement{ year: "2011"; month: "May"; expenses: "7"; angle: "65"; income: "19" } - ListElement{ year: "2011"; month: "Jun"; expenses: "9"; angle: "66"; income: "18" } - ListElement{ year: "2011"; month: "Jul"; expenses: "13";angle: "67"; income: "17" } - ListElement{ year: "2011"; month: "Aug"; expenses: "5"; angle: "68"; income: "9" } - ListElement{ year: "2011"; month: "Sep"; expenses: "3"; angle: "69"; income: "8" } - ListElement{ year: "2011"; month: "Oct"; expenses: "13";angle: "70"; income: "15" } - ListElement{ year: "2011"; month: "Nov"; expenses: "8"; angle: "71"; income: "17" } - ListElement{ year: "2011"; month: "Dec"; expenses: "7"; angle: "72"; income: "10" } + ListElement{ year: "2011"; month: "Jan"; expenses: "@@2ttt"; angle: "jjj61"; income: "6" } + ListElement{ year: "2011"; month: "Feb"; expenses: "@@4ttt"; angle: "jjj62"; income: "8" } + ListElement{ year: "2011"; month: "Mar"; expenses: "@@7ttt"; angle: "jjj63"; income: "12" } + ListElement{ year: "2011"; month: "Apr"; expenses: "@@9ttt"; angle: "jjj64"; income: "15" } + ListElement{ year: "2011"; month: "May"; expenses: "@@7ttt"; angle: "jjj65"; income: "19" } + ListElement{ year: "2011"; month: "Jun"; expenses: "@@9ttt"; angle: "jjj66"; income: "18" } + ListElement{ year: "2011"; month: "Jul"; expenses: "@@13ttt"; angle: "jjj67"; income: "17" } + ListElement{ year: "2011"; month: "Aug"; expenses: "@@5ttt"; angle: "jjj68"; income: "9" } + ListElement{ year: "2011"; month: "Sep"; expenses: "@@3ttt"; angle: "jjj69"; income: "8" } + ListElement{ year: "2011"; month: "Oct"; expenses: "@@13ttt"; angle: "jjj70"; income: "15" } + ListElement{ year: "2011"; month: "Nov"; expenses: "@@8ttt"; angle: "jjj71"; income: "17" } + ListElement{ year: "2011"; month: "Dec"; expenses: "@@7ttt"; angle: "jjj72"; income: "10" } - ListElement{ year: "2012"; month: "Jan"; expenses: "12";angle: "73"; income: "16" } - ListElement{ year: "2012"; month: "Feb"; expenses: "24";angle: "74"; income: "28" } - ListElement{ year: "2012"; month: "Mar"; expenses: "27";angle: "75"; income: "22" } - ListElement{ year: "2012"; month: "Apr"; expenses: "29";angle: "76"; income: "25" } - ListElement{ year: "2012"; month: "May"; expenses: "27";angle: "77"; income: "29" } - ListElement{ year: "2012"; month: "Jun"; expenses: "19";angle: "78"; income: "18" } - ListElement{ year: "2012"; month: "Jul"; expenses: "13";angle: "79"; income: "17" } - ListElement{ year: "2012"; month: "Aug"; expenses: "15";angle: "80"; income: "19" } - ListElement{ year: "2012"; month: "Sep"; expenses: "3"; angle: "81"; income: "8" } - ListElement{ year: "2012"; month: "Oct"; expenses: "3"; angle: "82"; income: "6" } - ListElement{ year: "2012"; month: "Nov"; expenses: "4"; angle: "83"; income: "8" } - ListElement{ year: "2012"; month: "Dec"; expenses: "5"; angle: "84"; income: "9" } + ListElement{ year: "2012"; month: "Jan"; expenses: "@@12ttt"; angle: "jjj73"; income: "16" } + ListElement{ year: "2012"; month: "Feb"; expenses: "@@24ttt"; angle: "jjj74"; income: "28" } + ListElement{ year: "2012"; month: "Mar"; expenses: "@@27ttt"; angle: "jjj75"; income: "22" } + ListElement{ year: "2012"; month: "Apr"; expenses: "@@29ttt"; angle: "jjj76"; income: "25" } + ListElement{ year: "2012"; month: "May"; expenses: "@@27ttt"; angle: "jjj77"; income: "29" } + ListElement{ year: "2012"; month: "Jun"; expenses: "@@19ttt"; angle: "jjj78"; income: "18" } + ListElement{ year: "2012"; month: "Jul"; expenses: "@@13ttt"; angle: "jjj79"; income: "17" } + ListElement{ year: "2012"; month: "Aug"; expenses: "@@15ttt"; angle: "jjj80"; income: "19" } + ListElement{ year: "2012"; month: "Sep"; expenses: "@@3ttt"; angle: "jjj81"; income: "8" } + ListElement{ year: "2012"; month: "Oct"; expenses: "@@3ttt"; angle: "jjj82"; income: "6" } + ListElement{ year: "2012"; month: "Nov"; expenses: "@@4ttt"; angle: "jjj83"; income: "8" } + ListElement{ year: "2012"; month: "Dec"; expenses: "@@5ttt"; angle: "jjj84"; income: "9" } } } -- cgit v1.2.3 From 6880277f23b47117f7788f08f855ed99b5120f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 12 May 2014 10:06:27 +0300 Subject: CustomDataItem made into a public class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3055 Change-Id: I1e449df7c1bcb48fc639dbae579e2e1499c9ef2b Reviewed-by: Tomi Korpipää --- .../customitems/customitemgraph.cpp | 38 +-- .../customitems/doc/src/customitems.qdoc | 11 +- src/datavisualization/data/customdataitem.cpp | 47 ---- src/datavisualization/data/customdataitem_p.h | 66 ----- src/datavisualization/data/data.pri | 5 +- src/datavisualization/data/qcustom3ditem.cpp | 274 +++++++++++++++++++++ src/datavisualization/data/qcustom3ditem.h | 84 +++++++ src/datavisualization/data/qcustom3ditem_p.h | 63 +++++ ...tdatavisualization-qml-abstractdeclarative.qdoc | 33 ++- .../engine/abstract3dcontroller.cpp | 60 +++-- .../engine/abstract3dcontroller_p.h | 11 +- .../engine/abstract3drenderer.cpp | 25 +- .../engine/abstract3drenderer_p.h | 4 +- src/datavisualization/engine/qabstract3dgraph.cpp | 42 ++-- src/datavisualization/engine/qabstract3dgraph.h | 8 +- src/datavisualizationqml2/abstractdeclarative.cpp | 51 +++- src/datavisualizationqml2/abstractdeclarative_p.h | 17 +- .../datavisualizationqml2_plugin.cpp | 5 +- .../datavisualizationqml2_plugin.h | 3 + src/datavisualizationqml2/declarativebars_p.h | 1 - src/datavisualizationqml2/declarativecolor.cpp | 2 + src/datavisualizationqml2/declarativetheme.cpp | 8 +- src/datavisualizationqml2/declarativetheme_p.h | 8 +- tests/qmlcamera/qml/qmlcamera/main.qml | 31 ++- 24 files changed, 637 insertions(+), 260 deletions(-) delete mode 100644 src/datavisualization/data/customdataitem.cpp delete mode 100644 src/datavisualization/data/customdataitem_p.h create mode 100644 src/datavisualization/data/qcustom3ditem.cpp create mode 100644 src/datavisualization/data/qcustom3ditem.h create mode 100644 src/datavisualization/data/qcustom3ditem_p.h diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 822ca24a..c2479a9a 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -19,6 +19,7 @@ #include "customitemgraph.h" #include +#include #include using namespace QtDataVisualization; @@ -104,15 +105,18 @@ void CustomItemGraph::toggleItemOne(bool show) color.fill(Qt::red); //! [0] //! [2] - m_graph->addCustomItem(":/items/oilrig.obj", positionOne, - QVector3D(0.025f, 0.025f, 0.025f), - QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 45.0f), - color); + QCustom3DItem *item = new QCustom3DItem(":/items/oilrig.obj", positionOne, + QVector3D(0.025f, 0.025f, 0.025f), + QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 45.0f), + color); //! [2] - } else { //! [3] - m_graph->removeCustomItemAt(positionOne); + m_graph->addCustomItem(item); //! [3] + } else { + //! [4] + m_graph->removeCustomItemAt(positionOne); + //! [4] } } @@ -122,10 +126,13 @@ void CustomItemGraph::toggleItemTwo(bool show) if (show) { QImage color = QImage(2, 2, QImage::Format_ARGB32); color.fill(Qt::red); - m_graph->addCustomItem(":/items/oilrig.obj", positionTwo, - QVector3D(0.025f, 0.025f, 0.025f), - QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f), - color); + QCustom3DItem *item = new QCustom3DItem(); + item->setMeshFile(":/items/oilrig.obj"); + item->setPosition(positionTwo); + item->setScaling(QVector3D(0.025f, 0.025f, 0.025f)); + item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f)); + item->setTextureImage(color); + m_graph->addCustomItem(item); } else { m_graph->removeCustomItemAt(positionTwo); } @@ -137,10 +144,13 @@ void CustomItemGraph::toggleItemThree(bool show) if (show) { QImage color = QImage(2, 2, QImage::Format_ARGB32); color.fill(Qt::darkMagenta); - m_graph->addCustomItem(":/items/refinery.obj", positionThree, - QVector3D(0.04f, 0.04f, 0.04f), - QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f), - color); + QCustom3DItem *item = new QCustom3DItem(); + item->setMeshFile(":/items/refinery.obj"); + item->setPosition(positionThree); + item->setScaling(QVector3D(0.04f, 0.04f, 0.04f)); + item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f)); + item->setTextureImage(color); + m_graph->addCustomItem(item); } else { m_graph->removeCustomItemAt(positionThree); } diff --git a/examples/datavisualization/customitems/doc/src/customitems.qdoc b/examples/datavisualization/customitems/doc/src/customitems.qdoc index 1878609b..d034019a 100644 --- a/examples/datavisualization/customitems/doc/src/customitems.qdoc +++ b/examples/datavisualization/customitems/doc/src/customitems.qdoc @@ -53,16 +53,19 @@ \snippet customitems/customitemgraph.cpp 1 - And finally we'll just add the item to the wanted position with the scale and rotation we want: + Then we'll create a new QCustom3DItem with all the parameters: \snippet customitems/customitemgraph.cpp 2 + And finally we'll just add the item: + + \snippet customitems/customitemgraph.cpp 3 + \section1 Removing custom item from a graph - We'll just call \c removeCustomItemAt() with the position - of the item: + We'll just call \c removeCustomItemAt() with the position of the item: - \snippet customitems/customitemgraph.cpp 3 + \snippet customitems/customitemgraph.cpp 4 \section1 Example Contents */ diff --git a/src/datavisualization/data/customdataitem.cpp b/src/datavisualization/data/customdataitem.cpp deleted file mode 100644 index d5964c62..00000000 --- a/src/datavisualization/data/customdataitem.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "customdataitem_p.h" -#include "objecthelper_p.h" -#include "texturehelper_p.h" - -QT_BEGIN_NAMESPACE_DATAVISUALIZATION - -CustomDataItem::CustomDataItem() : - m_textureHelper(0), - m_texture(0) -{ - m_textureHelper = new TextureHelper(); -} - -CustomDataItem::~CustomDataItem() -{ - m_textureHelper->deleteTexture(&m_texture); - delete m_textureHelper; -} - -void CustomDataItem::setTextureImage(const QImage &textureImage) -{ - m_textureHelper->deleteTexture(&m_texture); - - // Make a texture out of the image - if (!textureImage.isNull()) - m_texture = m_textureHelper->create2DTexture(textureImage, true, true, true); -} - -QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/customdataitem_p.h b/src/datavisualization/data/customdataitem_p.h deleted file mode 100644 index c077a17a..00000000 --- a/src/datavisualization/data/customdataitem_p.h +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVisualization module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the QtDataVisualization API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. - -#ifndef CUSTOMDATAITEM_P_H -#define CUSTOMDATAITEM_P_H - -#include "datavisualizationglobal_p.h" - -QT_BEGIN_NAMESPACE_DATAVISUALIZATION - -class TextureHelper; - -class QT_DATAVISUALIZATION_EXPORT CustomDataItem -{ -public: - CustomDataItem(); - virtual ~CustomDataItem(); - - inline void setMeshFile(const QString &meshFile) { m_meshFile = meshFile; } - inline QString meshFile() { return m_meshFile;} - void setTextureImage(const QImage &textureImage); - inline GLuint texture() { return m_texture; } - inline void setPosition(const QVector3D &position) { m_position = position; } - inline QVector3D position() { return m_position; } - inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } - inline QVector3D scaling() { return m_scaling; } - inline void setRotation(const QQuaternion &rotation) { m_rotation = rotation; } - inline QQuaternion rotation() { return m_rotation; } - -private: - TextureHelper *m_textureHelper; - GLuint m_texture; - QString m_meshFile; - QVector3D m_position; - QVector3D m_scaling; - QQuaternion m_rotation; -}; - -QT_END_NAMESPACE_DATAVISUALIZATION - -#endif diff --git a/src/datavisualization/data/data.pri b/src/datavisualization/data/data.pri index d3d67076..ca139984 100644 --- a/src/datavisualization/data/data.pri +++ b/src/datavisualization/data/data.pri @@ -38,7 +38,8 @@ HEADERS += \ $$PWD/qsurface3dseries.h \ $$PWD/qsurface3dseries_p.h \ $$PWD/customrenderitem_p.h \ - $$PWD/customdataitem_p.h + $$PWD/qcustom3ditem.h \ + $$PWD/qcustom3ditem_p.h SOURCES += \ $$PWD/labelitem.cpp \ @@ -65,4 +66,4 @@ SOURCES += \ $$PWD/qscatter3dseries.cpp \ $$PWD/qsurface3dseries.cpp \ $$PWD/customrenderitem.cpp \ - $$PWD/customdataitem.cpp + $$PWD/qcustom3ditem.cpp diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp new file mode 100644 index 00000000..69da30bf --- /dev/null +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "qcustom3ditem_p.h" +#include "objecthelper_p.h" +#include "texturehelper_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +/*! + * \class QCustom3DItem + * \inmodule QtDataVisualization + * \brief The QCustom3DItem class is for creating custom items to be added to a graph. + * \since Qt Data Visualization 1.1 + * + * This class is for creating custom items to be added to a graph. The item has a custom mesh, + * position, scaling, rotation, and an optional texture. + * + * \sa QAbstract3DGraph::addCustomItem() + */ + +/*! + * \qmltype Custom3DItem + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.1 + * \ingroup datavisualization_qml + * \instantiates QCustom3DItem + * \brief The Custom3DItem type is for creating custom items to be added to a graph. + * + * This type is for creating custom items to be added to a graph. The item has a custom mesh, + * position, scaling, rotation, and an optional texture. + */ + +/*! \qmlproperty string Custom3DItem::meshFile + * + * Holds item mesh file name. Item in the file must be in Wavefront obj format and include + * vertices, normals, and UVs. It also needs to be in triangles. + */ + +/*! \qmlproperty string Custom3DItem::textureFile + * + * Holds the texture file name for the item. If left unset, a solid gray texture will be + * used. + */ + +// TODO: Position check in task QTRD-3057 +/*! \qmlproperty vector3d Custom3DItem::position + * + * Holds the item \a position as a vector3d. Item position is in data coordinates. Defaults to + * \c {vector3d(0.0, 0.0, 0.0)}. + * + * \note No validity checks are made for the position of the item, so it is up to the user to + * provide a valid position. Items positioned outside axis ranges are still rendered. + */ + +/*! \qmlproperty vector3d Custom3DItem::scaling + * + * Holds the item \a scaling as a vector3d. Defaults to \c {vector3d(0.1, 0.1, 0.1)}. + */ + +/*! \qmlproperty quaternion Custom3DItem::rotation + * + * Holds the item \a rotation as a quaternion. Defaults to \c {quaternion(0.0, 0.0, 0.0, 0.0)}. + */ + +/*! + * \qmlmethod void Custom3DItem::setRotationAxisAndAngle(vector3d axis, real angle) + * + * A convenience function to construct rotation quaternion from \a axis and \a angle. + * + * \sa rotation + */ + +/*! + * Constructs QCustom3DItem with given \a parent. + */ +QCustom3DItem::QCustom3DItem(QObject *parent) : + d_ptr(new QCustom3DItemPrivate(this, parent)) +{ +} + +/*! + * Constructs QCustom3DItem with given \a meshFile, \a position, \a scaling, + * \a rotation, \a texture image, and optional \a parent. + */ +QCustom3DItem::QCustom3DItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QImage &texture, QObject *parent) : + d_ptr(new QCustom3DItemPrivate(this, meshFile, position, scaling, rotation, parent)) +{ + setTextureImage(texture); +} + +/*! + * Destroys QCustom3DItem. + */ +QCustom3DItem::~QCustom3DItem() +{ +} + +/*! \property QCustom3DItem::meshFile + * + * Holds item mesh file name. Item in the file must be in Wavefront obj format and include + * vertices, normals, and UVs. It also needs to be in triangles. + */ +void QCustom3DItem::setMeshFile(const QString &meshFile) +{ + if (d_ptr->m_meshFile != meshFile) { + d_ptr->m_meshFile = meshFile; + emit meshFileChanged(meshFile); + } +} + +QString QCustom3DItem::meshFile() +{ + return d_ptr->m_meshFile; +} + +/*! \property QCustom3DItem::position + * + * Holds the item \a position as a QVector3D. Item position is in data coordinates. Defaults to + * \c {QVector3D(0.0, 0.0, 0.0)}. + * + * \note No validity checks are made for the position of the item, so it is up to the user to + * provide a valid position. Items positioned outside axis ranges are still rendered. + */ +void QCustom3DItem::setPosition(const QVector3D &position) +{ + if (d_ptr->m_position != position) { + d_ptr->m_position = position; + emit positionChanged(position); + } +} + +QVector3D QCustom3DItem::position() +{ + return d_ptr->m_position; +} + +/*! \property QCustom3DItem::scaling + * + * Holds the item \a scaling as a QVector3D. Defaults to \c {QVector3D(0.1, 0.1, 0.1)}. + */ +void QCustom3DItem::setScaling(const QVector3D &scaling) +{ + if (d_ptr->m_scaling != scaling) { + d_ptr->m_scaling = scaling; + emit scalingChanged(scaling); + } +} + +QVector3D QCustom3DItem::scaling() +{ + return d_ptr->m_scaling; +} + +/*! \property QCustom3DItem::rotation + * + * Holds the item \a rotation as a QQuaternion. Defaults to \c {QQuaternion(0.0, 0.0, 0.0, 0.0)}. + */ +void QCustom3DItem::setRotation(const QQuaternion &rotation) +{ + if (d_ptr->m_rotation != rotation) { + d_ptr->m_rotation = rotation; + emit rotationChanged(rotation); + } +} + +QQuaternion QCustom3DItem::rotation() +{ + return d_ptr->m_rotation; +} + +/*! + * A convenience function to construct rotation quaternion from \a axis and \a angle. + * + * \sa rotation + */ +void QCustom3DItem::setRotationAxisAndAngle(const QVector3D &axis, float angle) +{ + setRotation(QQuaternion::fromAxisAndAngle(axis, angle)); +} + +/*! + * Set the \a textureImage as a QImage for the item. Texture defaults to solid gray. + */ +void QCustom3DItem::setTextureImage(const QImage &textureImage) +{ + if (textureImage.isNull()) { + // Make a solid gray texture + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage.fill(Qt::gray); + } else { + d_ptr->m_textureImage = textureImage; + } + + if (!d_ptr->m_textureFile.isEmpty()) { + d_ptr->m_textureFile.clear(); + emit textureFileChanged(d_ptr->m_textureFile); + } +} + +/*! \property QCustom3DItem::textureFile + * + * Holds the texture file name for the item. If both this and textureImage are unset, a solid + * gray texture will be used. + */ +void QCustom3DItem::setTextureFile(const QString &textureFile) +{ + if (d_ptr->m_textureFile != textureFile) { + d_ptr->m_textureFile = textureFile; + if (!textureFile.isEmpty()) { + d_ptr->m_textureImage = QImage(textureFile); + } else { + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage.fill(Qt::gray); + } + emit textureFileChanged(textureFile); + } +} + +QString QCustom3DItem::textureFile() +{ + return d_ptr->m_textureFile; +} + +QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : + QObject(parent), + q_ptr(q) +{ +} + +QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &meshFile, + const QVector3D &position, const QVector3D &scaling, + const QQuaternion &rotation, QObject *parent) : + QObject(parent), + q_ptr(q), + m_meshFile(meshFile), + m_position(position), + m_scaling(scaling), + m_rotation(rotation) +{ +} + +QCustom3DItemPrivate::~QCustom3DItemPrivate() +{ +} + +QImage QCustom3DItemPrivate::textureImage() +{ + return m_textureImage; +} + +void QCustom3DItemPrivate::clearTextureImage() +{ + m_textureImage = QImage(); +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h new file mode 100644 index 00000000..394c51d7 --- /dev/null +++ b/src/datavisualization/data/qcustom3ditem.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef QCUSTOM3DITEM_H +#define QCUSTOM3DITEM_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QCustom3DItemPrivate; + +class QT_DATAVISUALIZATION_EXPORT QCustom3DItem : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString meshFile READ meshFile WRITE setMeshFile NOTIFY meshFileChanged) + Q_PROPERTY(QString textureFile READ textureFile WRITE setTextureFile NOTIFY textureFileChanged) + Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) + Q_PROPERTY(QVector3D scaling READ scaling WRITE setScaling NOTIFY scalingChanged) + Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged) + +public: + explicit QCustom3DItem(QObject *parent = 0); + explicit QCustom3DItem(const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + const QImage &texture, QObject *parent = 0); + virtual ~QCustom3DItem(); + + void setMeshFile(const QString &meshFile); + QString meshFile(); + + void setTextureFile(const QString &textureFile); + QString textureFile(); + + void setPosition(const QVector3D &position); + QVector3D position(); + + void setScaling(const QVector3D &scaling); + QVector3D scaling(); + + void setRotation(const QQuaternion &rotation); + QQuaternion rotation(); + + Q_INVOKABLE void setRotationAxisAndAngle(const QVector3D &axis, float angle); + + void setTextureImage(const QImage &textureImage); + +signals: + void meshFileChanged(const QString &meshFile); + void textureFileChanged(const QString &textureFile); + void positionChanged(const QVector3D &position); + void scalingChanged(const QVector3D &scaling); + void rotationChanged(const QQuaternion &rotation); + +protected: + QScopedPointer d_ptr; + +private: + Q_DISABLE_COPY(QCustom3DItem) + + friend class Abstract3DRenderer; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h new file mode 100644 index 00000000..77062768 --- /dev/null +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef QCUSTOM3DITEM_P_H +#define QCUSTOM3DITEM_P_H + +#include "qcustom3ditem.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QCustom3DItemPrivate : public QObject +{ + Q_OBJECT +public: + QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent); + QCustom3DItemPrivate(QCustom3DItem *q, const QString &meshFile, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, QObject *parent); + virtual ~QCustom3DItemPrivate(); + + QImage textureImage(); + void clearTextureImage(); + +public: + QCustom3DItem *q_ptr; + QImage m_textureImage; + QString m_textureFile; + QString m_meshFile; + QVector3D m_position; + QVector3D m_scaling; + QQuaternion m_rotation; + +private: + friend class QCustom3DItem; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 36c812f1..4d0b8212 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -150,30 +150,30 @@ */ /*! - * \qmlmethod int AbstractGraph3D::addCustomItem(string meshFile, vector3d position, vector3d scaling, quaternion rotation, string textureFile) + * \qmlmethod int AbstractGraph3D::addCustomItem(Custom3DItem item) * - * Adds a custom mesh item located in \a meshFile to a graph at \a position with \a {scaling}, - * \a rotation and optional image for a texture located at \a textureFile. Item must be in - * Wavefront obj format and include vertices, normals and UVs. It also needs to be in triangles. - * Item position is given in data coordinates. + * Adds a Custom3DItem \a item to the graph. Graph takes ownership of the added item. * - * \return index to the added item. + * \return index to the added item if add was successful, -1 if trying to add a null item, and + * index of the item if trying to add an already added item. * - * \note No validity checks are made for the position of the item, so it is up to the user to - * provide a valid position. Items positioned outside axis ranges are still rendered. - * - * \sa removeCustomItemAt() + * \sa removeCustomItems(), removeCustomItem(), removeCustomItemAt() * * \since Qt Data Visualization 1.1 */ /*! - * \qmlmethod void AbstractGraph3D::removeCustomItemAt(int index) + * \qmlmethod void AbstractGraph3D::removeCustomItems() * - * Removes the custom item at \a {index}. Deletes the resources allocated to it. + * Removes all custom items. Deletes the resources allocated to them. * - * \note The index of the remaining items will change if the item removed is other than - * the last. + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod void AbstractGraph3D::removeCustomItem(Custom3DItem item) + * + * Removes the custom \a {item}. Deletes the resources allocated to it. * * \since Qt Data Visualization 1.1 */ @@ -181,10 +181,7 @@ /*! * \qmlmethod void AbstractGraph3D::removeCustomItemAt(vector3d position) * - * Removes the custom item at \a {position}. Deletes the resources allocated to it. - * - * \note The index of the remaining items will change if an item is removed from a position that - * is not at the last index. + * Removes all custom items at \a {position}. Deletes the resources allocated to them. * * \since Qt Data Visualization 1.1 */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 2b566a91..790a0889 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -88,7 +88,7 @@ Abstract3DController::~Abstract3DController() destroyRenderer(); delete m_scene; delete m_themeManager; - foreach (CustomDataItem *item, m_customItems) + foreach (QCustom3DItem *item, m_customItems) delete item; m_customItems.clear(); } @@ -851,46 +851,52 @@ void Abstract3DController::requestRender(QOpenGLFramebufferObject *fbo) m_renderer->render(fbo->handle()); } -int Abstract3DController::addCustomItem(const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, - const QImage &textureImage) +int Abstract3DController::addCustomItem(QCustom3DItem *item) { - CustomDataItem *newItem = new CustomDataItem(); - newItem->setMeshFile(meshFile); - newItem->setPosition(position); - newItem->setScaling(scaling); - newItem->setRotation(rotation); - newItem->setTextureImage(textureImage); - m_customItems.append(newItem); + if (!item) + return -1; + + int index = m_customItems.indexOf(item); + + if (index != -1) + return index; + + item->setParent(this); + m_customItems.append(item); m_isCustomDataDirty = true; emitNeedRender(); return m_customItems.count() - 1; } -void Abstract3DController::deleteCustomItem(int index) +void Abstract3DController::deleteCustomItems() { - if (m_customItems.size() > index) { - delete m_customItems[index]; - m_customItems.removeAt(index); - m_isCustomDataDirty = true; - emitNeedRender(); - } + foreach (QCustom3DItem *item, m_customItems) + delete item; + m_customItems.clear(); + m_isCustomDataDirty = true; + emitNeedRender(); +} + +void Abstract3DController::deleteCustomItem(QCustom3DItem *item) +{ + if (!item) + return; + + m_customItems.removeOne(item); + delete item; + item = 0; + m_isCustomDataDirty = true; + emitNeedRender(); } void Abstract3DController::deleteCustomItem(const QVector3D &position) { - int index = -1; - int counter = 0; - // Get the index for the item at position - foreach (CustomDataItem *item, m_customItems) { + // Get the item for the position + foreach (QCustom3DItem *item, m_customItems) { if (item->position() == position) { - index = counter; - break; + deleteCustomItem(item); } - counter++; } - if (index >= 0) - deleteCustomItem(index); } void Abstract3DController::handleAxisTitleChanged(const QString &title) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 78c6c81c..53560760 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -35,7 +35,7 @@ #include "qabstract3dinputhandler.h" #include "qabstractdataproxy.h" #include "q3dscene_p.h" -#include "customdataitem_p.h" +#include "qcustom3ditem.h" #include #include @@ -175,7 +175,7 @@ protected: QVector m_changedSeriesList; - QList m_customItems; + QList m_customItems; explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); @@ -236,9 +236,9 @@ public: void requestRender(QOpenGLFramebufferObject *fbo); - int addCustomItem(const QString &meshFile, const QVector3D &position, const QVector3D &scaling, - const QQuaternion &rotation, const QImage &textureImage); - void deleteCustomItem(int index); + int addCustomItem(QCustom3DItem *item); + void deleteCustomItems(); + void deleteCustomItem(QCustom3DItem *item); void deleteCustomItem(const QVector3D &position); void emitNeedRender(); @@ -321,6 +321,7 @@ private: void setAxisHelper(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis *axis, QAbstract3DAxis **axisPtr); + friend class AbstractDeclarative; friend class Bars3DController; friend class QAbstract3DGraphPrivate; }; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 95cecbd3..bff24bc7 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -28,6 +28,7 @@ #include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" +#include "qcustom3ditem_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -74,6 +75,13 @@ Abstract3DRenderer::~Abstract3DRenderer() } m_renderCacheList.clear(); + foreach (CustomRenderItem *item, m_customRenderCache) { + GLuint texture = item->texture(); + m_textureHelper->deleteTexture(&texture); + delete item; + } + m_customRenderCache.clear(); + delete m_textureHelper; } @@ -402,16 +410,19 @@ void Abstract3DRenderer::updateSeries(const QList &seriesLi } } -void Abstract3DRenderer::updateCustomData(const QList &customItems) +void Abstract3DRenderer::updateCustomData(const QList &customItems) { if (customItems.isEmpty() && m_customRenderCache.isEmpty()) return; // There are probably not too many custom items, just recreate the array if something changes - foreach (CustomRenderItem *item, m_customRenderCache) + foreach (CustomRenderItem *item, m_customRenderCache) { + GLuint texture = item->texture(); + m_textureHelper->deleteTexture(&texture); delete item; + } m_customRenderCache.clear(); - foreach (CustomDataItem *item, customItems) + foreach (QCustom3DItem *item, customItems) addCustomItem(item); } @@ -526,12 +537,16 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(CustomDataItem *item) { +void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); - newItem->setTexture(item->texture()); + GLuint texture = m_textureHelper->create2DTexture(item->d_ptr->textureImage(), + true, true, true); + newItem->setTexture(texture); + // TODO: Uncomment this once custom item render cache handling has been optimized + //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); m_customRenderCache.append(newItem); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 65dcd8f6..ea61ae51 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -67,7 +67,7 @@ public: virtual void updateData() = 0; virtual void updateSeries(const QList &seriesList); - virtual void updateCustomData(const QList &customItems); + virtual void updateCustomData(const QList &customItems); virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); @@ -111,7 +111,7 @@ public: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); - virtual void addCustomItem(CustomDataItem *item); + virtual void addCustomItem(QCustom3DItem *item); virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index e143e756..85ee79c9 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -382,46 +382,42 @@ void QAbstract3DGraph::clearSelection() } /*! - * Adds a custom mesh item located in \a meshFile to a graph at \a position with \a {scaling}, - * \a rotation and optional \a textureImage. Item must be in Wavefront obj format and include - * vertices, normals and UVs. It also needs to be in triangles. Item position is given in data - * coordinates. + * Adds a QCustom3DItem \a item to the graph. Graph takes ownership of the added item. * - * \return index to the added item. + * \return index to the added item if add was successful, -1 if trying to add a null item, and + * index of the item if trying to add an already added item. * - * \note No validity checks are made for the position of the item, so it is up to the user to - * provide a valid position. Items positioned outside axis ranges are still rendered. - * - * \sa removeCustomItemAt() + * \sa removeCustomItems(), removeCustomItem(), removeCustomItemAt() * * \since Qt Data Visualization 1.1 */ -int QAbstract3DGraph::addCustomItem(const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, - const QImage &textureImage) +int QAbstract3DGraph::addCustomItem(QCustom3DItem *item) { - return d_ptr->m_visualController->addCustomItem(meshFile, position, scaling, rotation, - textureImage); + return d_ptr->m_visualController->addCustomItem(item); } /*! - * Removes the custom item at \a {index}. Deletes the resources allocated to it. - * - * \note The index of the remaining items will change if the item removed is other than - * the last. + * Removes all custom items. Deletes the resources allocated to them. * * \since Qt Data Visualization 1.1 */ -void QAbstract3DGraph::removeCustomItemAt(int index) +void QAbstract3DGraph::removeCustomItems() { - d_ptr->m_visualController->deleteCustomItem(index); + d_ptr->m_visualController->deleteCustomItems(); } /*! - * Removes the custom item at \a {position}. Deletes the resources allocated to it. + * Removes the custom \a {item}. Deletes the resources allocated to it. * - * \note The index of the remaining items will change if an item is removed from a position that - * is not at the last index. + * \since Qt Data Visualization 1.1 + */ +void QAbstract3DGraph::removeCustomItem(QCustom3DItem *item) +{ + d_ptr->m_visualController->deleteCustomItem(item); +} + +/*! + * Removes all custom items at \a {position}. Deletes the resources allocated to them. * * \since Qt Data Visualization 1.1 */ diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index dc0bf6f0..ae1efacf 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -29,6 +29,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QAbstract3DGraphPrivate; +class QCustom3DItem; class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected QOpenGLFunctions { @@ -107,10 +108,9 @@ public: void clearSelection(); - int addCustomItem(const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, - const QImage &textureImage = QImage()); - void removeCustomItemAt(int index); + int addCustomItem(QCustom3DItem *item); + void removeCustomItems(); + void removeCustomItem(QCustom3DItem *item); void removeCustomItemAt(const QVector3D &position); QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 70ba8df8..fa69cac9 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -211,19 +211,19 @@ bool AbstractDeclarative::shadowsSupported() const return m_controller->shadowsSupported(); } -int AbstractDeclarative::addCustomItem(const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, - const QString &textureFile) +int AbstractDeclarative::addCustomItem(QCustom3DItem *item) { - QImage textureImage; - if (!textureFile.isNull()) - textureImage = QImage(textureFile); - return m_controller->addCustomItem(meshFile, position, scaling, rotation, textureImage); + return m_controller->addCustomItem(item); } -void AbstractDeclarative::removeCustomItemAt(int index) +void AbstractDeclarative::removeCustomItems() { - m_controller->deleteCustomItem(index); + m_controller->deleteCustomItems(); +} + +void AbstractDeclarative::removeCustomItem(QCustom3DItem *item) +{ + m_controller->deleteCustomItem(item); } void AbstractDeclarative::removeCustomItemAt(const QVector3D &position) @@ -231,6 +231,39 @@ void AbstractDeclarative::removeCustomItemAt(const QVector3D &position) m_controller->deleteCustomItem(position); } +QQmlListProperty AbstractDeclarative::customItemList() +{ + return QQmlListProperty(this, this, + &AbstractDeclarative::appendCustomItemFunc, + &AbstractDeclarative::countCustomItemFunc, + &AbstractDeclarative::atCustomItemFunc, + &AbstractDeclarative::clearCustomItemFunc); +} + +void AbstractDeclarative::appendCustomItemFunc(QQmlListProperty *list, + QCustom3DItem *item) +{ + AbstractDeclarative *decl = reinterpret_cast(list->data); + decl->addCustomItem(item); +} + +int AbstractDeclarative::countCustomItemFunc(QQmlListProperty *list) +{ + return reinterpret_cast(list->data)->m_controller->m_customItems.size(); +} + +QCustom3DItem *AbstractDeclarative::atCustomItemFunc(QQmlListProperty *list, + int index) +{ + return reinterpret_cast(list->data)->m_controller->m_customItems.at(index); +} + +void AbstractDeclarative::clearCustomItemFunc(QQmlListProperty *list) +{ + AbstractDeclarative *decl = reinterpret_cast(list->data); + decl->removeCustomItems(); +} + void AbstractDeclarative::setSharedController(Abstract3DController *controller) { Q_ASSERT(controller); diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index d5ad8836..8121e35d 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -68,6 +68,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(RenderingMode renderingMode READ renderingMode WRITE setRenderingMode NOTIFY renderingModeChanged) Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged REVISION 1) Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged REVISION 1) + Q_PROPERTY(QQmlListProperty customItemList READ customItemList REVISION 1) public: enum SelectionFlag { @@ -128,14 +129,18 @@ public: Q_INVOKABLE virtual void clearSelection(); - Q_REVISION(1) Q_INVOKABLE virtual int addCustomItem(const QString &meshFile, - const QVector3D &position, - const QVector3D &scaling, - const QQuaternion &rotation, - const QString &textureFile = 0); - Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(int index); + Q_REVISION(1) Q_INVOKABLE virtual int addCustomItem(QCustom3DItem *item); + Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItems(); + Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItem(QCustom3DItem *item); Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); + QQmlListProperty customItemList(); + static void appendCustomItemFunc(QQmlListProperty *list, + QCustom3DItem *item); + static int countCustomItemFunc(QQmlListProperty *list); + static QCustom3DItem *atCustomItemFunc(QQmlListProperty *list, int index); + static void clearCustomItemFunc(QQmlListProperty *list); + virtual void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); void setSharedController(Abstract3DController *controller); diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index d7a82d6b..d419d904 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -43,7 +43,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterUncreatableType(uri, 1, 0, "AbstractGraph3D", QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); qmlRegisterUncreatableType(uri, 1, 0, "Scene3D", - QLatin1String("Trying to create uncreatable: Scene3D.")); + QLatin1String("Trying to create uncreatable: Scene3D.")); qmlRegisterUncreatableType(uri, 1, 0, "Abstract3DSeries", QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); qmlRegisterUncreatableType(uri, 1, 0, "QBar3DSeries", @@ -89,7 +89,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // New revisions qmlRegisterType(uri, 1, 1, "ValueAxis3D"); qmlRegisterUncreatableType(uri, 1, 1, "Abstract3DSeries", - QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); + QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); @@ -97,6 +97,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); qmlRegisterType(uri, 1, 1, "LogValueAxis3DFormatter"); + qmlRegisterType(uri, 1, 1, "Custom3DItem"); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h index 14fb530e..fcc0bcde 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h @@ -45,6 +45,7 @@ #include "qabstract3dinputhandler.h" #include "declarativecolor_p.h" #include "declarativescene_p.h" +#include "qcustom3ditem.h" #include @@ -96,6 +97,8 @@ QML_DECLARE_TYPE(DeclarativeTheme3D) QML_DECLARE_TYPE(QAbstract3DInputHandler) +QML_DECLARE_TYPE(QCustom3DItem) + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QtDataVisualizationQml2Plugin : public QQmlExtensionPlugin diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h index 97f5882a..ae44e2ab 100644 --- a/src/datavisualizationqml2/declarativebars_p.h +++ b/src/datavisualizationqml2/declarativebars_p.h @@ -88,7 +88,6 @@ public: Q_INVOKABLE void insertSeries(int index, QBar3DSeries *series); void setPrimarySeries(QBar3DSeries *series); QBar3DSeries *primarySeries() const; - QBar3DSeries *selectedSeries() const; public slots: diff --git a/src/datavisualizationqml2/declarativecolor.cpp b/src/datavisualizationqml2/declarativecolor.cpp index ffd4227f..f8ef06d2 100644 --- a/src/datavisualizationqml2/declarativecolor.cpp +++ b/src/datavisualizationqml2/declarativecolor.cpp @@ -20,6 +20,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +// TODO: Docs missing? + DeclarativeColor::DeclarativeColor(QObject *parent) : QObject(parent) { diff --git a/src/datavisualizationqml2/declarativetheme.cpp b/src/datavisualizationqml2/declarativetheme.cpp index f051341e..ab10155e 100644 --- a/src/datavisualizationqml2/declarativetheme.cpp +++ b/src/datavisualizationqml2/declarativetheme.cpp @@ -36,17 +36,17 @@ DeclarativeTheme3D::~DeclarativeTheme3D() { } -QQmlListProperty DeclarativeTheme3D::seriesChildren() +QQmlListProperty DeclarativeTheme3D::themeChildren() { - return QQmlListProperty(this, this, &DeclarativeTheme3D::appendSeriesChildren, + return QQmlListProperty(this, this, &DeclarativeTheme3D::appendThemeChildren, 0, 0, 0); } -void DeclarativeTheme3D::appendSeriesChildren(QQmlListProperty *list, QObject *element) +void DeclarativeTheme3D::appendThemeChildren(QQmlListProperty *list, QObject *element) { Q_UNUSED(list) Q_UNUSED(element) - // Nothing to do, seriesChildren is there only to enable scoping gradient items in Theme3D item. + // Nothing to do, themeChildren is there only to enable scoping gradient items in Theme3D item. } void DeclarativeTheme3D::handleTypeChange(Theme themeType) diff --git a/src/datavisualizationqml2/declarativetheme_p.h b/src/datavisualizationqml2/declarativetheme_p.h index a7f40b1e..89b66f8c 100644 --- a/src/datavisualizationqml2/declarativetheme_p.h +++ b/src/datavisualizationqml2/declarativetheme_p.h @@ -42,19 +42,19 @@ class DeclarativeTheme3D : public Q3DTheme, public QQmlParserStatus { Q_OBJECT Q_INTERFACES(QQmlParserStatus) - Q_PROPERTY(QQmlListProperty seriesChildren READ seriesChildren) + Q_PROPERTY(QQmlListProperty themeChildren READ themeChildren) Q_PROPERTY(QQmlListProperty baseColors READ baseColors) Q_PROPERTY(QQmlListProperty baseGradients READ baseGradients) Q_PROPERTY(ColorGradient *singleHighlightGradient READ singleHighlightGradient WRITE setSingleHighlightGradient NOTIFY singleHighlightGradientChanged) Q_PROPERTY(ColorGradient *multiHighlightGradient READ multiHighlightGradient WRITE setMultiHighlightGradient NOTIFY multiHighlightGradientChanged) - Q_CLASSINFO("DefaultProperty", "seriesChildren") + Q_CLASSINFO("DefaultProperty", "themeChildren") public: DeclarativeTheme3D(QObject *parent = 0); virtual ~DeclarativeTheme3D(); - QQmlListProperty seriesChildren(); - static void appendSeriesChildren(QQmlListProperty *list, QObject *element); + QQmlListProperty themeChildren(); + static void appendThemeChildren(QQmlListProperty *list, QObject *element); QQmlListProperty baseColors(); static void appendBaseColorsFunc(QQmlListProperty *list, diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index 56e7d035..0f708615 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -18,7 +18,7 @@ import QtQuick 2.1 import QtQuick.Controls 1.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 import "." Rectangle { @@ -66,6 +66,16 @@ Rectangle { scene.activeCamera.yRotation: camControlArea.yValue scene.activeCamera.zoomLevel: zoomSlider.value inputHandler: null + + customItemList: [shuttleItem] + } + + Custom3DItem { + id: shuttleItem + meshFile: ":/items/shuttle.obj" + textureFile: ":/items/shuttle.png" + position: Qt.vector3d(5.0,35.0,3.0) + scaling: Qt.vector3d(0.2,0.2,0.2) } MouseArea { @@ -168,23 +178,10 @@ Rectangle { id: shuttleAdd anchors.bottom: dataToggle.top width: camControlArea.width - text: "Add Shuttle" - property bool addObject: true + text: "Remove Shuttle" onClicked: { - if (addObject === true) { - testChart.addCustomItem(":/items/shuttle.obj", - Qt.vector3d(5.0,35.0,3.0), - Qt.vector3d(0.2,0.2,0.2), - Qt.quaternion(0.0,0.0,0.0,0.0), - ":/items/shuttle.png") - text = "Remove Shuttle" - addObject = false - } else { - testChart.removeCustomItemAt(Qt.vector3d(5.0,35.0,3.0)) - text = "Add Shuttle" - addObject = true - } + testChart.removeCustomItemAt(Qt.vector3d(5.0,35.0,3.0)) + text = "Shuttle has been deleted" } } - } -- cgit v1.2.3 From 8e97d823208ed314278a22a924f0da10c9328839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 12 May 2014 10:12:41 +0300 Subject: Added docs for ThemeColor Task-number: QTRD-3081 Change-Id: Ic96e284685ee4641c3fa039a5e95680b58d3b46b Reviewed-by: Miikka Heikkinen --- .../doc/src/qtdatavisualization-qml-color.qdoc | 35 ++++++++++++++++++++++ src/datavisualizationqml2/declarativecolor.cpp | 2 -- 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 src/datavisualization/doc/src/qtdatavisualization-qml-color.qdoc diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-color.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-color.qdoc new file mode 100644 index 00000000..e845adea --- /dev/null +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-color.qdoc @@ -0,0 +1,35 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \qmltype ThemeColor + \inqmlmodule QtDataVisualization + \since QtDataVisualization 1.0 + \ingroup datavisualization_qml + \brief Defines the color in a Theme3D. + + Defines a color in Theme3D::baseColors property of Theme3D. +*/ + +/*! + \qmlproperty color ThemeColor::color + + The color property describes the color of this ThemeColor. + + The default color is black. +*/ diff --git a/src/datavisualizationqml2/declarativecolor.cpp b/src/datavisualizationqml2/declarativecolor.cpp index f8ef06d2..ffd4227f 100644 --- a/src/datavisualizationqml2/declarativecolor.cpp +++ b/src/datavisualizationqml2/declarativecolor.cpp @@ -20,8 +20,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -// TODO: Docs missing? - DeclarativeColor::DeclarativeColor(QObject *parent) : QObject(parent) { -- cgit v1.2.3 From 4dcef4be656aedb7c6c9e222f291a1a508641007 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 12 May 2014 11:10:46 +0300 Subject: Enable mapping single role to multiple properties for surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3074 Change-Id: If40de067526b6f24b3e55bf64ed804a79d473e5f Reviewed-by: Tomi Korpipää Reviewed-by: Titta Heikkala --- src/datavisualization/data/baritemmodelhandler.cpp | 10 +- .../data/qitemmodelsurfacedataproxy.cpp | 420 +++++++++++++++++++-- .../data/qitemmodelsurfacedataproxy.h | 43 +++ .../data/qitemmodelsurfacedataproxy_p.h | 12 + src/datavisualization/data/qsurfacedataproxy.cpp | 12 +- .../data/surfaceitemmodelhandler.cpp | 115 +++++- .../data/surfaceitemmodelhandler_p.h | 9 + .../datavisualizationqml2_plugin.cpp | 1 + tests/itemmodeltest/main.cpp | 37 +- tests/qmlmultitest/main.cpp | 47 +++ tests/qmlmultitest/qml/qmlmultitest/Data.qml | 48 +++ tests/qmlmultitest/qml/qmlmultitest/NewButton.qml | 52 +++ tests/qmlmultitest/qml/qmlmultitest/main.qml | 231 ++++++++++++ tests/qmlmultitest/qmlmultitest.pro | 12 + tests/qmlmultitest/qmlmultitest.qrc | 7 + tests/tests.pro | 3 +- 16 files changed, 990 insertions(+), 69 deletions(-) create mode 100644 tests/qmlmultitest/main.cpp create mode 100644 tests/qmlmultitest/qml/qmlmultitest/Data.qml create mode 100644 tests/qmlmultitest/qml/qmlmultitest/NewButton.qml create mode 100644 tests/qmlmultitest/qml/qmlmultitest/main.qml create mode 100644 tests/qmlmultitest/qmlmultitest.pro create mode 100644 tests/qmlmultitest/qmlmultitest.qrc diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index e8941c4b..4685be44 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -55,8 +55,9 @@ void BarItemModelHandler::handleDataChanged(const QModelIndex &topLeft, for (int i = startRow; i <= endRow; i++) { for (int j = startCol; j <= endCol; j++) { + QModelIndex index = m_itemModel->index(i, j); QBarDataItem item; - QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole); + QVariant valueVar = index.data(m_valueRole); float value; if (m_haveValuePattern) value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); @@ -64,7 +65,7 @@ void BarItemModelHandler::handleDataChanged(const QModelIndex &topLeft, value = valueVar.toFloat(); item.setValue(value); if (m_rotationRole != noRoleIndex) { - QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole); + QVariant rotationVar = index.data(m_rotationRole); float rotation; if (m_haveRotationPattern) { rotation = rotationVar.toString().replace(m_rotationPattern, @@ -133,7 +134,8 @@ void BarItemModelHandler::resolveModel() for (int i = 0; i < rowCount; i++) { QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnCount; j++) { - QVariant valueVar = m_itemModel->index(i, j).data(m_valueRole); + QModelIndex index = m_itemModel->index(i, j); + QVariant valueVar = index.data(m_valueRole); float value; if (m_haveValuePattern) value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); @@ -141,7 +143,7 @@ void BarItemModelHandler::resolveModel() value = valueVar.toFloat(); newProxyRow[j].setValue(value); if (m_rotationRole != noRoleIndex) { - QVariant rotationVar = m_itemModel->index(i, j).data(m_rotationRole); + QVariant rotationVar = index.data(m_rotationRole); float rotation; if (m_haveRotationPattern) { rotation = rotationVar.toString().replace(m_rotationPattern, diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 440ce2d6..77f90ed4 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -54,13 +54,24 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * and in which order by defining an explicit list of categories for either or both of rows and * columns. * - * For example, assume that you have a custom QAbstractItemModel storing surface topography data. - * Each item in the model has the roles "longitude", "latitude", and "height". The item model already - * contains the data properly sorted so that longitudes and latitudes are first encountered in - * correct order, which enables us to utilize the row and column category autogeneration. - * You could do the following to display the data in a surface graph: + * For example, assume that you have a custom QAbstractItemModel storing surface topography data. + * Each item in the model has the roles "longitude", "latitude", and "height". + * The item model already contains the data properly sorted so that longitudes and latitudes are + * first encountered in correct order, which enables us to utilize the row and column category + * autogeneration. + * You could do the following to display the data in a surface graph: * - * \snippet doc_src_qtdatavisualization.cpp 5 + * \snippet doc_src_qtdatavisualization.cpp 5 + * + * If the fields of the model do not contain the data in the exact format you need, you can specify + * a search pattern regular expression and a replace rule for each role to get the value in a + * format you need. For more information how the replace using regular expressions works, see + * QString::replace(const QRegExp &rx, const QString &after) function documentation. Note that + * using regular expressions has an impact on the performance, so it's more efficient to utilize + * item models where doing search and replace is not necessary to get the desired values. + * + * For example about using the search patterns in conjunction with the roles, see + * ItemModelBarDataProxy usage in \l{Qt Quick 2 Bars Example}. * * \sa {Qt Data Visualization Data Handling} */ @@ -95,33 +106,35 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string ItemModelSurfaceDataProxy::rowRole - * The row role of the mapping. + * Defines the item model role to map into row category. * In addition to defining which row the data belongs to, the value indicated by row role - * is also set as the Z-coordinate value of the QSurfaceDataItem when model data is resolved. + * is also set as the Z-coordinate value of the QSurfaceDataItem when model data is resolved, + * unless a separate zPos role is also defined. */ /*! * \qmlproperty string ItemModelSurfaceDataProxy::columnRole - * The column role of the mapping. + * Defines the item model role to map into column category. * In addition to defining which column the data belongs to, the value indicated by column role - * is also set as the X-coordinate value of the QSurfaceDataItem when model data is resolved. + * is also set as the X-coordinate value of the QSurfaceDataItem when model data is resolved, + * unless a separate xPos role is also defined. */ /*! * \qmlproperty string ItemModelSurfaceDataProxy::xPosRole - * The X position role of the mapping. If this role is not defined, columnRole is used to - * determine the X-coordinate value of resolved QSurfaceDataItems. + * Defines the item model role to map into X position. If this role is not defined, columnRole is + * used to determine the X-coordinate value of resolved QSurfaceDataItems. */ /*! * \qmlproperty string ItemModelSurfaceDataProxy::yPosRole - * The Y position role of the mapping. + * Defines the item model role to map into Y position. */ /*! * \qmlproperty string ItemModelSurfaceDataProxy::zPosRole - * The Z position role of the mapping. If this role is not defined, rowRole is used to - * determine the Z-coordinate value of resolved QSurfaceDataItems. + * Defines the item model role to map into Z position. If this role is not defined, rowRole is + * used to determine the Z-coordinate value of resolved QSurfaceDataItems. */ /*! @@ -132,8 +145,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty list ItemModelSurfaceDataProxy::columnCategories - * The column categories of the mapping. Only items with column roles that are found in this list are - * included when data is resolved. The columns are ordered in the same order as they are in this list. + * The column categories of the mapping. Only items with column roles that are found in this + * list are included when data is resolved. The columns are ordered in the same order as they are + * in this list. */ /*! @@ -158,6 +172,111 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * autogenerated from data when this is set to true. Defaults to \c{true}. */ +/*! + * \qmlproperty regExp ItemModelSurfaceDataProxy::rowRolePattern + * + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * + * \sa rowRole, rowRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelSurfaceDataProxy::columnRolePattern + * + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * + * \sa columnRole, columnRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelSurfaceDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelSurfaceDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelSurfaceDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::rowRoleReplace + * + * This property defines the replace content to be used in conjunction with rowRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rowRole, rowRolePattern + */ + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::columnRoleReplace + * + * This property defines the replace content to be used in conjunction with columnRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa columnRole, columnRolePattern + */ + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelSurfaceDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ + /*! * Constructs QItemModelSurfaceDataProxy with optional \a parent. */ @@ -331,7 +450,10 @@ const QAbstractItemModel *QItemModelSurfaceDataProxy::itemModel() const /*! * \property QItemModelSurfaceDataProxy::rowRole * - * Defines the row \a role for the mapping. + * Defines the item model role to map into row category. + * In addition to defining which row the data belongs to, the value indicated by row role + * is also set as the Z-coordinate value of the QSurfaceDataItem when model data is resolved, + * unless a separate zPos role is also defined. */ void QItemModelSurfaceDataProxy::setRowRole(const QString &role) { @@ -349,7 +471,10 @@ QString QItemModelSurfaceDataProxy::rowRole() const /*! * \property QItemModelSurfaceDataProxy::columnRole * - * Defines the column \a role for the mapping. + * Defines the item model role to map into column category. + * In addition to defining which column the data belongs to, the value indicated by column role + * is also set as the X-coordinate value of the QSurfaceDataItem when model data is resolved, + * unless a separate xPos role is also defined. */ void QItemModelSurfaceDataProxy::setColumnRole(const QString &role) { @@ -367,9 +492,8 @@ QString QItemModelSurfaceDataProxy::columnRole() const /*! * \property QItemModelSurfaceDataProxy::xPosRole * - * Defines the X position \a role for the mapping. - * If this role is not defined, columnRole is used to determine the X-coordinate - * value of resolved QSurfaceDataItems. + * Defines the item model role to map into X position. If this role is not defined, columnRole is + * used to determine the X-coordinate value of resolved QSurfaceDataItems. */ void QItemModelSurfaceDataProxy::setXPosRole(const QString &role) { @@ -387,7 +511,7 @@ QString QItemModelSurfaceDataProxy::xPosRole() const /*! * \property QItemModelSurfaceDataProxy::yPosRole * - * Defines the Y position \a role for the mapping. + * Defines the item model role to map into Y position. */ void QItemModelSurfaceDataProxy::setYPosRole(const QString &role) { @@ -405,9 +529,8 @@ QString QItemModelSurfaceDataProxy::yPosRole() const /*! * \property QItemModelSurfaceDataProxy::zPosRole * - * Defines the Z position \a role for the mapping. - * If this role is not defined, rowRole is used to determine the Z-coordinate - * value of resolved QSurfaceDataItems. + * Defines the item model role to map into Z position. If this role is not defined, rowRole is + * used to determine the Z-coordinate value of resolved QSurfaceDataItems. */ void QItemModelSurfaceDataProxy::setZPosRole(const QString &role) { @@ -560,6 +683,231 @@ int QItemModelSurfaceDataProxy::columnCategoryIndex(const QString &category) return dptr()->m_columnCategories.indexOf(category); } +/*! + * \property QItemModelSurfaceDataProxy::rowRolePattern + * + * When set, a search and replace is done on the value mapped by row role before it is used as + * a row category. This property specifies the regular expression to find the portion of the + * mapped value to replace and rowRoleReplace property contains the replacement string. + * + * \sa rowRole, rowRoleReplace + */ +void QItemModelSurfaceDataProxy::setRowRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rowRolePattern != pattern) { + dptr()->m_rowRolePattern = pattern; + emit rowRolePatternChanged(pattern); + } +} + +QRegExp QItemModelSurfaceDataProxy::rowRolePattern() const +{ + return dptrc()->m_rowRolePattern; +} + +/*! + * \property QItemModelSurfaceDataProxy::columnRolePattern + * + * When set, a search and replace is done on the value mapped by column role before it is used + * as a column category. This property specifies the regular expression to find the portion of the + * mapped value to replace and columnRoleReplace property contains the replacement string. + * + * \sa columnRole, columnRoleReplace + */ +void QItemModelSurfaceDataProxy::setColumnRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_columnRolePattern != pattern) { + dptr()->m_columnRolePattern = pattern; + emit columnRolePatternChanged(pattern); + } +} + +QRegExp QItemModelSurfaceDataProxy::columnRolePattern() const +{ + return dptrc()->m_columnRolePattern; +} + +/*! + * \property QItemModelSurfaceDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ +void QItemModelSurfaceDataProxy::setXPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_xPosRolePattern != pattern) { + dptr()->m_xPosRolePattern = pattern; + emit xPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelSurfaceDataProxy::xPosRolePattern() const +{ + return dptrc()->m_xPosRolePattern; +} + +/*! + * \property QItemModelSurfaceDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ +void QItemModelSurfaceDataProxy::setYPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_yPosRolePattern != pattern) { + dptr()->m_yPosRolePattern = pattern; + emit yPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelSurfaceDataProxy::yPosRolePattern() const +{ + return dptrc()->m_yPosRolePattern; +} + +/*! + * \property QItemModelSurfaceDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ +void QItemModelSurfaceDataProxy::setZPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_zPosRolePattern != pattern) { + dptr()->m_zPosRolePattern = pattern; + emit zPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelSurfaceDataProxy::zPosRolePattern() const +{ + return dptrc()->m_zPosRolePattern; +} + +/*! + * \property QItemModelSurfaceDataProxy::rowRoleReplace + * + * This property defines the replace content to be used in conjunction with rowRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rowRole, rowRolePattern + */ +void QItemModelSurfaceDataProxy::setRowRoleReplace(const QString &replace) +{ + if (dptr()->m_rowRoleReplace != replace) { + dptr()->m_rowRoleReplace = replace; + emit rowRoleReplaceChanged(replace); + } +} + +QString QItemModelSurfaceDataProxy::rowRoleReplace() const +{ + return dptrc()->m_rowRoleReplace; +} + +/*! + * \property QItemModelSurfaceDataProxy::columnRoleReplace + * + * This property defines the replace content to be used in conjunction with columnRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa columnRole, columnRolePattern + */ +void QItemModelSurfaceDataProxy::setColumnRoleReplace(const QString &replace) +{ + if (dptr()->m_columnRoleReplace != replace) { + dptr()->m_columnRoleReplace = replace; + emit columnRoleReplaceChanged(replace); + } +} + +QString QItemModelSurfaceDataProxy::columnRoleReplace() const +{ + return dptrc()->m_columnRoleReplace; +} + +/*! + * \property QItemModelSurfaceDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ +void QItemModelSurfaceDataProxy::setXPosRoleReplace(const QString &replace) +{ + if (dptr()->m_xPosRoleReplace != replace) { + dptr()->m_xPosRoleReplace = replace; + emit xPosRoleReplaceChanged(replace); + } +} + +QString QItemModelSurfaceDataProxy::xPosRoleReplace() const +{ + return dptrc()->m_xPosRoleReplace; +} + +/*! + * \property QItemModelSurfaceDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ +void QItemModelSurfaceDataProxy::setYPosRoleReplace(const QString &replace) +{ + if (dptr()->m_yPosRoleReplace != replace) { + dptr()->m_yPosRoleReplace = replace; + emit yPosRoleReplaceChanged(replace); + } +} + +QString QItemModelSurfaceDataProxy::yPosRoleReplace() const +{ + return dptrc()->m_yPosRoleReplace; +} + +/*! + * \property QItemModelSurfaceDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ +void QItemModelSurfaceDataProxy::setZPosRoleReplace(const QString &replace) +{ + if (dptr()->m_zPosRoleReplace != replace) { + dptr()->m_zPosRoleReplace = replace; + emit zPosRoleReplaceChanged(replace); + } +} + +QString QItemModelSurfaceDataProxy::zPosRoleReplace() const +{ + return dptrc()->m_zPosRoleReplace; +} + /*! * \internal */ @@ -621,6 +969,26 @@ void QItemModelSurfaceDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelSurfaceDataProxy::autoColumnCategoriesChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::rowRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::columnRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::xPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::yPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::zPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::rowRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::columnRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::xPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::yPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::zPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.h b/src/datavisualization/data/qitemmodelsurfacedataproxy.h index b1ebbeed..8fe736f5 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.h @@ -22,6 +22,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -41,6 +42,16 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDa Q_PROPERTY(bool useModelCategories READ useModelCategories WRITE setUseModelCategories NOTIFY useModelCategoriesChanged) Q_PROPERTY(bool autoRowCategories READ autoRowCategories WRITE setAutoRowCategories NOTIFY autoRowCategoriesChanged) Q_PROPERTY(bool autoColumnCategories READ autoColumnCategories WRITE setAutoColumnCategories NOTIFY autoColumnCategoriesChanged) + Q_PROPERTY(QRegExp rowRolePattern READ rowRolePattern WRITE setRowRolePattern NOTIFY rowRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp columnRolePattern READ columnRolePattern WRITE setColumnRolePattern NOTIFY columnRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp xPosRolePattern READ xPosRolePattern WRITE setXPosRolePattern NOTIFY xPosRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp yPosRolePattern READ yPosRolePattern WRITE setYPosRolePattern NOTIFY yPosRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp zPosRolePattern READ zPosRolePattern WRITE setZPosRolePattern NOTIFY zPosRolePatternChanged REVISION 1) + Q_PROPERTY(QString rowRoleReplace READ rowRoleReplace WRITE setRowRoleReplace NOTIFY rowRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString columnRoleReplace READ columnRoleReplace WRITE setColumnRoleReplace NOTIFY columnRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString xPosRoleReplace READ xPosRoleReplace WRITE setXPosRoleReplace NOTIFY xPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString yPosRoleReplace READ yPosRoleReplace WRITE setYPosRoleReplace NOTIFY yPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString zPosRoleReplace READ zPosRoleReplace WRITE setZPosRoleReplace NOTIFY zPosRoleReplaceChanged REVISION 1) public: explicit QItemModelSurfaceDataProxy(QObject *parent = 0); @@ -99,6 +110,28 @@ public: Q_INVOKABLE int rowCategoryIndex(const QString& category); Q_INVOKABLE int columnCategoryIndex(const QString& category); + void setRowRolePattern(const QRegExp &pattern); + QRegExp rowRolePattern() const; + void setColumnRolePattern(const QRegExp &pattern); + QRegExp columnRolePattern() const; + void setXPosRolePattern(const QRegExp &pattern); + QRegExp xPosRolePattern() const; + void setYPosRolePattern(const QRegExp &pattern); + QRegExp yPosRolePattern() const; + void setZPosRolePattern(const QRegExp &pattern); + QRegExp zPosRolePattern() const; + + void setRowRoleReplace(const QString &replace); + QString rowRoleReplace() const; + void setColumnRoleReplace(const QString &replace); + QString columnRoleReplace() const; + void setXPosRoleReplace(const QString &replace); + QString xPosRoleReplace() const; + void setYPosRoleReplace(const QString &replace); + QString yPosRoleReplace() const; + void setZPosRoleReplace(const QString &replace); + QString zPosRoleReplace() const; + signals: void itemModelChanged(const QAbstractItemModel* itemModel); void rowRoleChanged(const QString &role); @@ -111,6 +144,16 @@ signals: void useModelCategoriesChanged(bool enable); void autoRowCategoriesChanged(bool enable); void autoColumnCategoriesChanged(bool enable); + Q_REVISION(1) void rowRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void columnRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void xPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void yPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void zPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void rowRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void columnRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void xPosRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void yPosRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void zPosRoleReplaceChanged(const QString &replace); protected: QItemModelSurfaceDataProxyPrivate *dptr(); diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h index 0aaea8fd..06bfe2a1 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h @@ -64,6 +64,18 @@ private: bool m_autoRowCategories; bool m_autoColumnCategories; + QRegExp m_rowRolePattern; + QRegExp m_columnRolePattern; + QRegExp m_xPosRolePattern; + QRegExp m_yPosRolePattern; + QRegExp m_zPosRolePattern; + + QString m_rowRoleReplace; + QString m_columnRoleReplace; + QString m_xPosRoleReplace; + QString m_yPosRoleReplace; + QString m_zPosRoleReplace; + friend class SurfaceItemModelHandler; friend class QItemModelSurfaceDataProxy; }; diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index f8f2c900..058b0e21 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -521,10 +521,14 @@ void QSurfaceDataProxyPrivate::limitValues(QVector3D &minValues, QVector3D &maxV minValues.setY(min); maxValues.setY(max); if (columns) { - minValues.setX(m_dataArray->at(0)->at(0).x()); - minValues.setZ(m_dataArray->at(0)->at(0).z()); - maxValues.setX(m_dataArray->at(0)->last().x()); - maxValues.setZ(m_dataArray->last()->at(0).z()); + float xLow = m_dataArray->at(0)->at(0).x(); + float xHigh = m_dataArray->at(0)->last().x(); + float zLow = m_dataArray->at(0)->at(0).z(); + float zHigh = m_dataArray->last()->at(0).z(); + minValues.setX(qMin(xLow, xHigh)); + minValues.setZ(qMin(zLow, zHigh)); + maxValues.setX(qMax(xLow, xHigh)); + maxValues.setZ(qMax(zLow, zHigh)); } else { minValues.setX(0.0f); minValues.setZ(0.0f); diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index 584ddf28..fad02464 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -28,7 +28,10 @@ SurfaceItemModelHandler::SurfaceItemModelHandler(QItemModelSurfaceDataProxy *pro m_proxyArray(0), m_xPosRole(noRoleIndex), m_yPosRole(noRoleIndex), - m_zPosRole(noRoleIndex) + m_zPosRole(noRoleIndex), + m_haveXPosPattern(false), + m_haveYPosPattern(false), + m_haveZPosPattern(false) { } @@ -53,21 +56,38 @@ void SurfaceItemModelHandler::handleDataChanged(const QModelIndex &topLeft, for (int i = startRow; i <= endRow; i++) { for (int j = startCol; j <= endCol; j++) { + QModelIndex index = m_itemModel->index(i, j); QSurfaceDataItem item; + QVariant xValueVar = index.data(m_xPosRole); + QVariant yValueVar = index.data(m_yPosRole); + QVariant zValueVar = index.data(m_zPosRole); const QSurfaceDataItem *oldItem = m_proxy->itemAt(i, j); float xPos; + float yPos; float zPos; - if (m_xPosRole != noRoleIndex) - xPos = m_itemModel->index(i, j).data(m_xPosRole).toFloat(); - else + if (m_xPosRole != noRoleIndex) { + if (m_haveXPosPattern) + xPos = xValueVar.toString().replace(m_xPosPattern, m_xPosReplace).toFloat(); + else + xPos = xValueVar.toFloat(); + } else { xPos = oldItem->x(); - if (m_zPosRole != noRoleIndex) - zPos = m_itemModel->index(i, j).data(m_zPosRole).toFloat(); + } + + if (m_haveYPosPattern) + yPos = yValueVar.toString().replace(m_yPosPattern, m_yPosReplace).toFloat(); else + yPos = yValueVar.toFloat(); + + if (m_zPosRole != noRoleIndex) { + if (m_haveZPosPattern) + zPos = zValueVar.toString().replace(m_zPosPattern, m_zPosReplace).toFloat(); + else + zPos = zValueVar.toFloat(); + } else { zPos = oldItem->z(); - item.setPosition(QVector3D(xPos, - m_itemModel->index(i, j).data(m_yPosRole).toFloat(), - zPos)); + } + item.setPosition(QVector3D(xPos, yPos, zPos)); m_proxy->setItem(i, j, item); } } @@ -91,6 +111,23 @@ void SurfaceItemModelHandler::resolveModel() return; } + // Position patterns can be reused on single item changes, so store them to member variables. + QRegExp rowPattern(m_proxy->rowRolePattern()); + QRegExp colPattern(m_proxy->columnRolePattern()); + m_xPosPattern = m_proxy->xPosRolePattern(); + m_yPosPattern = m_proxy->yPosRolePattern(); + m_zPosPattern = m_proxy->zPosRolePattern(); + QString rowReplace = m_proxy->rowRoleReplace(); + QString colReplace = m_proxy->columnRoleReplace(); + m_xPosReplace = m_proxy->xPosRoleReplace(); + m_yPosReplace = m_proxy->yPosRoleReplace(); + m_zPosReplace = m_proxy->zPosRoleReplace(); + bool haveRowPattern = !rowPattern.isEmpty() && rowPattern.isValid(); + bool haveColPattern = !colPattern.isEmpty() && colPattern.isValid(); + m_haveXPosPattern = !m_xPosPattern.isEmpty() && m_xPosPattern.isValid(); + m_haveYPosPattern = !m_yPosPattern.isEmpty() && m_yPosPattern.isValid(); + m_haveZPosPattern = !m_zPosPattern.isEmpty() && m_zPosPattern.isValid(); + QHash roleHash = m_itemModel->roleNames(); // Default to display role if no mapping @@ -112,32 +149,49 @@ void SurfaceItemModelHandler::resolveModel() for (int i = 0; i < rowCount; i++) { QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnCount; j++) { - float xPos = float(j); - float zPos = float(i); + QModelIndex index = m_itemModel->index(i, j); + QVariant xValueVar = index.data(m_xPosRole); + QVariant yValueVar = index.data(m_yPosRole); + QVariant zValueVar = index.data(m_zPosRole); + float xPos; + float yPos; + float zPos; if (m_xPosRole != noRoleIndex) { - xPos = m_itemModel->index(i, j).data(m_xPosRole).toFloat(); + if (m_haveXPosPattern) + xPos = xValueVar.toString().replace(m_xPosPattern, m_xPosReplace).toFloat(); + else + xPos = xValueVar.toFloat(); } else { QString header = m_itemModel->headerData(j, Qt::Horizontal).toString(); bool ok = false; float headerValue = header.toFloat(&ok); if (ok) xPos = headerValue; + else + xPos = float(j); } + if (m_haveYPosPattern) + yPos = yValueVar.toString().replace(m_yPosPattern, m_yPosReplace).toFloat(); + else + yPos = yValueVar.toFloat(); + if (m_zPosRole != noRoleIndex) { - zPos = m_itemModel->index(i, j).data(m_zPosRole).toFloat(); + if (m_haveZPosPattern) + zPos = zValueVar.toString().replace(m_zPosPattern, m_zPosReplace).toFloat(); + else + zPos = zValueVar.toFloat(); } else { QString header = m_itemModel->headerData(i, Qt::Vertical).toString(); bool ok = false; float headerValue = header.toFloat(&ok); if (ok) zPos = headerValue; + else + zPos = float(i); } - newProxyRow[j].setPosition( - QVector3D(xPos, - m_itemModel->index(i, j).data(m_yPosRole).toFloat(), - zPos)); + newProxyRow[j].setPosition(QVector3D(xPos, yPos, zPos)); } } } else { @@ -165,10 +219,31 @@ void SurfaceItemModelHandler::resolveModel() for (int j = 0; j < columnCount; j++) { QModelIndex index = m_itemModel->index(i, j); QString rowRoleStr = index.data(rowRole).toString(); + if (haveRowPattern) + rowRoleStr.replace(rowPattern, rowReplace); QString columnRoleStr = index.data(columnRole).toString(); - QVector3D itemPos(index.data(m_xPosRole).toFloat(), - index.data(m_yPosRole).toFloat(), - index.data(m_zPosRole).toFloat()); + if (haveColPattern) + columnRoleStr.replace(colPattern, colReplace); + QVariant xValueVar = index.data(m_xPosRole); + QVariant yValueVar = index.data(m_yPosRole); + QVariant zValueVar = index.data(m_zPosRole); + float xPos; + float yPos; + float zPos; + if (m_haveXPosPattern) + xPos = xValueVar.toString().replace(m_xPosPattern, m_xPosReplace).toFloat(); + else + xPos = xValueVar.toFloat(); + if (m_haveYPosPattern) + yPos = yValueVar.toString().replace(m_yPosPattern, m_yPosReplace).toFloat(); + else + yPos = yValueVar.toFloat(); + if (m_haveZPosPattern) + zPos = zValueVar.toString().replace(m_zPosPattern, m_zPosReplace).toFloat(); + else + zPos = zValueVar.toFloat(); + + QVector3D itemPos(xPos, yPos, zPos); itemValueMap[rowRoleStr][columnRoleStr] = itemPos; if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); diff --git a/src/datavisualization/data/surfaceitemmodelhandler_p.h b/src/datavisualization/data/surfaceitemmodelhandler_p.h index dbed0a60..572788d6 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler_p.h +++ b/src/datavisualization/data/surfaceitemmodelhandler_p.h @@ -53,6 +53,15 @@ protected: int m_xPosRole; int m_yPosRole; int m_zPosRole; + QRegExp m_xPosPattern; + QRegExp m_yPosPattern; + QRegExp m_zPosPattern; + QString m_xPosReplace; + QString m_yPosReplace; + QString m_zPosReplace; + bool m_haveXPosPattern; + bool m_haveYPosPattern; + bool m_haveZPosPattern; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index d419d904..09afb6b1 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -93,6 +93,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); + qmlRegisterType(uri, 1, 1, "ItemModelSurfaceDataProxy"); // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); diff --git a/tests/itemmodeltest/main.cpp b/tests/itemmodeltest/main.cpp index a607fe8d..38454948 100644 --- a/tests/itemmodeltest/main.cpp +++ b/tests/itemmodeltest/main.cpp @@ -49,9 +49,6 @@ public: void setupModel(); void addRow(); - void changeStyle(); - void changePresetCamera(); - void changeTheme(); void start(); void selectFromTable(const QPoint &selection); void selectedFromTable(int currentRow, int currentColumn, int previousRow, int previousColumn); @@ -148,12 +145,14 @@ void GraphDataGenerator::setupModel() QStringList weeks; weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5"; - // Set up data Mon Tue Wed Thu Fri Sat Sun - const char *hours[5][7] = {{"2.0/30", "1.0/30", "3.0/30", "0.2/30", "1.0/30", "5.0/30", "10.0/30"}, // week 1 - {"0.5/45", "1.0/45", "3.0/45", "1.0/45", "2.0/45", "2.0/45", "3.0/45"}, // week 2 - {"1.0/60", "1.0/60", "2.0/60", "1.0/60", "4.0/60", "4.0/60", "4.0/60"}, // week 3 - {"0.0/75", "1.0/75", "0.0/75", "0.0/75", "2.0/75", "2.0/75", "0.3/75"}, // week 4 - {"3.0/90", "3.0/90", "6.0/90", "2.0/90", "2.0/90", "1.0/90", "1.0/90"}}; // week 5 + // Set up data + const char *hours[5][7] = + // Mon Tue Wed Thu Fri Sat Sun + {{"9/10/2.0/30", "9/11/1.0/30", "9/12/3.0/30", "9/13/0.2/30", "9/14/1.0/30", "9/15/5.0/30", "9/16/10.0/30"}, // week 1 + {"8/10/0.5/45", "8/11/1.0/45", "8/12/3.0/45", "8/13/1.0/45", "8/14/2.0/45", "8/15/2.0/45", "8/16/3.0/45"}, // week 2 + {"7/10/1.0/60", "7/11/1.0/60", "7/12/2.0/60", "7/13/1.0/60", "7/14/4.0/60", "7/15/4.0/60", "7/16/4.0/60"}, // week 3 + {"6/10/0.0/75", "6/11/1.0/75", "6/12/0.0/75", "6/13/0.0/75", "6/14/2.0/75", "6/15/2.0/75", "6/16/0.3/75"}, // week 4 + {"5/10/3.0/90", "5/11/3.0/90", "5/12/6.0/90", "5/13/2.0/90", "5/14/2.0/90", "5/15/1.0/90", "5/16/1.0/90"}}; // week 5 // Add labels m_barGraph->rowAxis()->setTitle("Week of year"); @@ -275,17 +274,27 @@ int main(int argc, char **argv) barProxy->setUseModelCategories(true); surfaceProxy->setUseModelCategories(true); barProxy->setRotationRole(tableWidget->model()->roleNames().value(Qt::DisplayRole)); - barProxy->setValueRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$"))); - barProxy->setRotationRolePattern(QRegExp(QStringLiteral("^(\\d*[\\.\\,]?\\d*)\\/(\\d*[\\.\\,]?\\d*)$"))); - barProxy->setValueRoleReplace(QStringLiteral("\\1")); - barProxy->setRotationRoleReplace(QStringLiteral("\\2")); - // TODO surface proxy test + barProxy->setValueRolePattern(QRegExp(QStringLiteral("^(\\d*)(\\/)(\\d*)\\/(\\d*[\\.\\,]?\\d*)\\/\\d*[\\.\\,]?\\d*$"))); + barProxy->setRotationRolePattern(QRegExp(QStringLiteral("^(\\d*)(\\/)\\d*\\/\\d*([\\.\\,]?)\\d*(\\/)(\\d*[\\.\\,]?\\d*)$"))); + barProxy->setValueRoleReplace(QStringLiteral("\\4")); + barProxy->setRotationRoleReplace(QStringLiteral("\\5")); + surfaceProxy->setXPosRole(tableWidget->model()->roleNames().value(Qt::DisplayRole)); + surfaceProxy->setZPosRole(tableWidget->model()->roleNames().value(Qt::DisplayRole)); + surfaceProxy->setXPosRolePattern(QRegExp(QStringLiteral("^(\\d*)\\/(\\d*)\\/\\d*[\\.\\,]?\\d*\\/\\d*[\\.\\,]?\\d*$"))); + surfaceProxy->setXPosRoleReplace(QStringLiteral("\\2")); + surfaceProxy->setYPosRolePattern(QRegExp(QStringLiteral("^\\d*(\\/)(\\d*)\\/(\\d*[\\.\\,]?\\d*)\\/\\d*[\\.\\,]?\\d*$"))); + surfaceProxy->setYPosRoleReplace(QStringLiteral("\\3")); + surfaceProxy->setZPosRolePattern(QRegExp(QStringLiteral("^(\\d*)(\\/)(\\d*)\\/\\d*[\\.\\,]?\\d*\\/\\d*[\\.\\,]?\\d*$"))); + surfaceProxy->setZPosRoleReplace(QStringLiteral("\\1")); QBar3DSeries *barSeries = new QBar3DSeries(barProxy); QSurface3DSeries *surfaceSeries = new QSurface3DSeries(surfaceProxy); barSeries->setMesh(QAbstract3DSeries::MeshPyramid); barGraph->addSeries(barSeries); surfaceGraph->addSeries(surfaceSeries); + barGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetBehind); + surfaceGraph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); + GraphDataGenerator generator(barGraph, surfaceGraph, tableWidget); QObject::connect(barSeries, &QBar3DSeries::selectedBarChanged, &generator, &GraphDataGenerator::selectFromTable); diff --git a/tests/qmlmultitest/main.cpp b/tests/qmlmultitest/main.cpp new file mode 100644 index 00000000..a4754f56 --- /dev/null +++ b/tests/qmlmultitest/main.cpp @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQuickView viewer; + + // The following are needed to make examples run without having to install the module + // in desktop environments. +#ifdef Q_OS_WIN + QString extraImportPath(QStringLiteral("%1/../../../%2")); +#else + QString extraImportPath(QStringLiteral("%1/../../%2")); +#endif + viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(), + QString::fromLatin1("qml"))); + QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close); + + viewer.setTitle(QStringLiteral("QML multitest")); + viewer.setSource(QUrl("qrc:/qml/qmlmultitest/main.qml")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/tests/qmlmultitest/qml/qmlmultitest/Data.qml b/tests/qmlmultitest/qml/qmlmultitest/Data.qml new file mode 100644 index 00000000..ddc0aad8 --- /dev/null +++ b/tests/qmlmultitest/qml/qmlmultitest/Data.qml @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 + +Item { + property alias sharedData: dataModel + + ListModel { + id: dataModel + ListElement{ coords: "0,0"; data: "20.0/10.0/4.75"; } + ListElement{ coords: "1,0"; data: "21.1/10.3/3.00"; } + ListElement{ coords: "2,0"; data: "22.5/10.7/1.24"; } + ListElement{ coords: "3,0"; data: "24.0/10.5/2.53"; } + ListElement{ coords: "0,1"; data: "20.2/11.2/3.55"; } + ListElement{ coords: "1,1"; data: "21.3/11.5/3.03"; } + ListElement{ coords: "2,1"; data: "22.6/11.7/3.46"; } + ListElement{ coords: "3,1"; data: "23.4/11.5/4.12"; } + ListElement{ coords: "0,2"; data: "20.2/12.3/3.37"; } + ListElement{ coords: "1,2"; data: "21.1/12.4/2.98"; } + ListElement{ coords: "2,2"; data: "22.5/12.1/3.33"; } + ListElement{ coords: "3,2"; data: "23.3/12.7/3.23"; } + ListElement{ coords: "0,3"; data: "20.7/13.3/5.34"; } + ListElement{ coords: "1,3"; data: "21.5/13.2/4.54"; } + ListElement{ coords: "2,3"; data: "22.4/13.6/4.65"; } + ListElement{ coords: "3,3"; data: "23.2/13.4/6.67"; } + ListElement{ coords: "0,4"; data: "20.6/15.0/6.01"; } + ListElement{ coords: "1,4"; data: "21.3/14.6/5.83"; } + ListElement{ coords: "2,4"; data: "22.5/14.8/7.32"; } + ListElement{ coords: "3,4"; data: "23.7/14.3/6.90"; } + } +} + diff --git a/tests/qmlmultitest/qml/qmlmultitest/NewButton.qml b/tests/qmlmultitest/qml/qmlmultitest/NewButton.qml new file mode 100644 index 00000000..e4fb99d2 --- /dev/null +++ b/tests/qmlmultitest/qml/qmlmultitest/NewButton.qml @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 + +Item { + id: newbutton + + property alias text: buttonText.text + + signal clicked + + implicitWidth: buttonText.implicitWidth + 5 + implicitHeight: buttonText.implicitHeight + 10 + + Button { + id: buttonText + width: parent.width + height: parent.height + + style: ButtonStyle { + label: Component { + Text { + text: buttonText.text + clip: true + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + } + } + onClicked: newbutton.clicked() + } +} diff --git a/tests/qmlmultitest/qml/qmlmultitest/main.qml b/tests/qmlmultitest/qml/qmlmultitest/main.qml new file mode 100644 index 00000000..da34c0bf --- /dev/null +++ b/tests/qmlmultitest/qml/qmlmultitest/main.qml @@ -0,0 +1,231 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtDataVisualization 1.1 +import "." + +Rectangle { + id: mainView + width: 800 + height: 600 + + Data { + id: data + } + + GridLayout { + id: gridLayout + columns: 2 + Layout.fillHeight: true + Layout.fillWidth: true + anchors.top: mainView.top + anchors.bottom: mainView.bottom + anchors.left: mainView.left + anchors.right: mainView.right + + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + border.color: surfaceGraph.theme.gridLineColor + border.width: 2 + + Surface3D { + id: surfaceGraph + anchors.fill: parent + anchors.margins: parent.border.width + theme: Theme3D { + type: Theme3D.ThemePrimaryColors + font.pointSize: 60 + } + scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh + + Surface3DSeries { + itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel" + ItemModelSurfaceDataProxy { + itemModel: data.sharedData + // The surface data points are not neatly lined up in rows and columns, + // so we define explicit row and column roles. + rowRole: "coords" + columnRole: "coords" + xPosRole: "data" + zPosRole: "data" + yPosRole: "data" + rowRolePattern: /(\d),\d/ + columnRolePattern: /(\d),(\d)/ + xPosRolePattern: /^([asd]*)([fgh]*)([jkl]*)[^\/]*\/([^\/]*)\/.*$/ + yPosRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ + zPosRolePattern: /^([asd]*)([qwe]*)([tyu]*)([fgj]*)([^\/]*)\/[^\/]*\/.*$/ + rowRoleReplace: "\\1" + columnRoleReplace: "\\2" + xPosRoleReplace: "\\4" + yPosRoleReplace: "\\3" + zPosRoleReplace: "\\5" + } + } + } + } + + // We'll use one grid cell for buttons + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + + GridLayout { + anchors.right: parent.right + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + columns: 2 + + NewButton { + Layout.minimumWidth: parent.width / 2 + Layout.fillHeight: true + Layout.fillWidth: true + text: "Clear Selections" + onClicked: clearSelections() // call a helper function to keep button itself simpler + } + + NewButton { + Layout.minimumWidth: parent.width / 2 + Layout.fillHeight: true + Layout.fillWidth: true + text: "Quit" + onClicked: Qt.quit(0); + } + + NewButton { + Layout.fillHeight: true + Layout.fillWidth: true + text: "Reset Cameras" + onClicked: resetCameras() // call a helper function to keep button itself simpler + } + + NewButton { + Layout.fillHeight: true + Layout.fillWidth: true + text: "Toggle Mesh Styles" + onClicked: toggleMeshStyle() // call a helper function to keep button itself simpler + } + } + } + + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + border.color: scatterGraph.theme.gridLineColor + border.width: 2 + + Scatter3D { + id: scatterGraph + anchors.fill: parent + anchors.margins: parent.border.width + theme: Theme3D { + type: Theme3D.ThemeDigia + font.pointSize: 60 + } + scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh + + Scatter3DSeries { + itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel" + ItemModelScatterDataProxy { + itemModel: data.sharedData + // Mapping model roles to scatter series item coordinates. + xPosRole: "data" + zPosRole: "data" + yPosRole: "data" + // TODO scatter test +// xPosRolePattern: /^([asd]*)([fgh]*)([jkl]*)[^\/]*\/([^\/]*)\/.*$/ +// yPosRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ +// zPosRolePattern: /^([asd]*)([qwe]*)([tyu]*)([fgj]*)([^\/]*)\/[^\/]*\/.*$/ +// xPosRoleReplace: "\\4" +// yPosRoleReplace: "\\3" +// zPosRoleReplace: "\\5" + } + } + } + } + + Rectangle { + Layout.fillHeight: true + Layout.fillWidth: true + border.color: barGraph.theme.gridLineColor + border.width: 2 + + Bars3D { + id: barGraph + anchors.fill: parent + anchors.margins: parent.border.width + theme: Theme3D { + type: Theme3D.ThemeQt + font.pointSize: 60 + } + selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice + scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh + + Bar3DSeries { + itemLabelFormat: "@seriesName: @valueLabel" + name: "Population density" + + ItemModelBarDataProxy { + itemModel: data.sharedData + // Mapping model roles to bar series rows, columns, and values. + rowRole: "coords" + columnRole: "coords" + valueRole: "data" + rowRolePattern: /(\d),\d/ + columnRolePattern: /(\d),(\d)/ + valueRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ + rowRoleReplace: "\\1" + columnRoleReplace: "\\2" + valueRoleReplace: "\\3" + } + } + } + } + } + + function clearSelections() { + barGraph.clearSelection() + scatterGraph.clearSelection() + surfaceGraph.clearSelection() + } + + function resetCameras() { + surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh + scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh + barGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh + surfaceGraph.scene.activeCamera.zoomLevel = 100.0 + scatterGraph.scene.activeCamera.zoomLevel = 100.0 + barGraph.scene.activeCamera.zoomLevel = 100.0 + } + + function toggleMeshStyle() { + if (barGraph.seriesList[0].meshSmooth === true) { + barGraph.seriesList[0].meshSmooth = false + if (surfaceGraph.seriesList[0].flatShadingSupported) + surfaceGraph.seriesList[0].flatShadingEnabled = true + scatterGraph.seriesList[0].meshSmooth = false + } else { + barGraph.seriesList[0].meshSmooth = true + surfaceGraph.seriesList[0].flatShadingEnabled = false + scatterGraph.seriesList[0].meshSmooth = true + } + } +} diff --git a/tests/qmlmultitest/qmlmultitest.pro b/tests/qmlmultitest/qmlmultitest.pro new file mode 100644 index 00000000..6e5e1b98 --- /dev/null +++ b/tests/qmlmultitest/qmlmultitest.pro @@ -0,0 +1,12 @@ +!include( ../tests.pri ) { + error( "Couldn't find the tests.pri file!" ) +} + +# The .cpp file which was generated for your project. Feel free to hack it. +SOURCES += main.cpp + +RESOURCES += qmlmultitest.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* \ + qml/qmlmultitest/* diff --git a/tests/qmlmultitest/qmlmultitest.qrc b/tests/qmlmultitest/qmlmultitest.qrc new file mode 100644 index 00000000..7fc9ade2 --- /dev/null +++ b/tests/qmlmultitest/qmlmultitest.qrc @@ -0,0 +1,7 @@ + + + qml/qmlmultitest/Data.qml + qml/qmlmultitest/main.qml + qml/qmlmultitest/NewButton.qml + + diff --git a/tests/tests.pro b/tests/tests.pro index 7b690c7d..8bbdc3f2 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -15,7 +15,8 @@ SUBDIRS += barstest \ multigraphs \ directional \ qmlmultiwindow \ - itemmodeltest + itemmodeltest \ + qmlmultitest #SUBDIRS += kinectsurface -- cgit v1.2.3 From 3d7f8820a86a4852fe2df27df53b745cfa32eb94 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 12 May 2014 12:55:10 +0300 Subject: Enable mapping single role to multiple properties for scatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3074 Change-Id: I7b1d338d28000eee7563a11a6069453f3e349c16 Reviewed-by: Tomi Korpipää --- .../data/qitemmodelbardataproxy.cpp | 3 + .../data/qitemmodelscatterdataproxy.cpp | 314 ++++++++++++++++++++- .../data/qitemmodelscatterdataproxy.h | 35 +++ .../data/qitemmodelscatterdataproxy_p.h | 10 + .../data/qitemmodelsurfacedataproxy.cpp | 3 + .../data/scatteritemmodelhandler.cpp | 72 ++++- .../data/scatteritemmodelhandler_p.h | 12 + .../datavisualizationqml2_plugin.cpp | 1 + tests/qmlmultitest/qml/qmlmultitest/main.qml | 17 +- 9 files changed, 436 insertions(+), 31 deletions(-) diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index 2351bc25..cccf7d44 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -33,6 +33,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * The data is resolved asynchronously whenever mappings or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. + * However, when useModelCategories property is set to true, single item changes are resolved + * synchronously, unless the same frame also contains a change that causes the whole model to be + * resolved. * * There are three ways to use mappings: * diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index 16a7b8b5..ad588ab1 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -36,7 +36,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * unless the same frame also contains a change that causes the whole model to be resolved. * * Mapping ignores rows and columns of the QAbstractItemModel and treats - * all items equally. It requires the model to provide at least three roles for the data items + * all items equally. It requires the model to provide roles for the data items * that can be mapped to X, Y, and Z-values for the scatter points. * * For example, assume that you have a custom QAbstractItemModel for storing various measurements @@ -45,6 +45,16 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * \snippet doc_src_qtdatavisualization.cpp 4 * + * If the fields of the model do not contain the data in the exact format you need, you can specify + * a search pattern regular expression and a replace rule for each role to get the value in a + * format you need. For more information how the replace using regular expressions works, see + * QString::replace(const QRegExp &rx, const QString &after) function documentation. Note that + * using regular expressions has an impact on the performance, so it's more efficient to utilize + * item models where doing search and replace is not necessary to get the desired values. + * + * For example about using the search patterns in conjunction with the roles, see + * ItemModelBarDataProxy usage in \l{Qt Quick 2 Bars Example}. + * * \sa {Qt Data Visualization Data Handling} */ @@ -78,27 +88,109 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string ItemModelScatterDataProxy::xPosRole - * The X position role of the mapping. + * Defines the item model role to map into X position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::yPosRole - * The Y position role of the mapping. + * Defines the item model role to map into Y position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::zPosRole - * The Z position role of the mapping. + * Defines the item model role to map into Z position. */ /*! * \qmlproperty string ItemModelScatterDataProxy::rotationRole * - * Defines the rotation role for the mapping. + * Defines the item model role to map into item rotation. * The model may supply the value for rotation as either variant that is directly convertible - * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. The first - * will construct the quaternion directly with given values, and the second one will construct - * the quaternion using QQuaternion::fromAxisAndAngle() method. + * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or + * \c{"@angle,x,y,z"}. The first format will construct the quaternion directly with given values, + * and the second one will construct the quaternion using QQuaternion::fromAxisAndAngle() method. + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ + +/*! + * \qmlproperty regExp ItemModelScatterDataProxy::rotationRolePattern + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a item rotation. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ + +/*! + * \qmlproperty string ItemModelScatterDataProxy::rotationRoleReplace + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern */ /*! @@ -190,7 +282,7 @@ const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const /*! * \property QItemModelScatterDataProxy::xPosRole * - * Defines the X position \a role for the mapping. + * Defines the item model role to map into X position. */ void QItemModelScatterDataProxy::setXPosRole(const QString &role) { @@ -208,7 +300,7 @@ QString QItemModelScatterDataProxy::xPosRole() const /*! * \property QItemModelScatterDataProxy::yPosRole * - * Defines the Y position \a role for the mapping. + * Defines the item model role to map into Y position. */ void QItemModelScatterDataProxy::setYPosRole(const QString &role) { @@ -226,7 +318,7 @@ QString QItemModelScatterDataProxy::yPosRole() const /*! * \property QItemModelScatterDataProxy::zPosRole * - * Defines the Z position \a role for the mapping. + * Defines the item model role to map into Z position. */ void QItemModelScatterDataProxy::setZPosRole(const QString &role) { @@ -244,7 +336,7 @@ QString QItemModelScatterDataProxy::zPosRole() const /*! * \property QItemModelScatterDataProxy::rotationRole * - * Defines the rotation \a role for the mapping. + * Defines the item model role to map into item rotation. * * The model may supply the value for rotation as either variant that is directly convertible * to QQuaternion, or as one of the string representations: \c{"scalar,x,y,z"} or \c{"@angle,x,y,z"}. @@ -264,6 +356,186 @@ QString QItemModelScatterDataProxy::rotationRole() const return dptrc()->m_rotationRole; } +/*! + * \property QItemModelScatterDataProxy::xPosRolePattern + * + * When set, a search and replace is done on the value mapped by xPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and xPosRoleReplace property contains the replacement string. + * + * \sa xPosRole, xPosRoleReplace + */ +void QItemModelScatterDataProxy::setXPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_xPosRolePattern != pattern) { + dptr()->m_xPosRolePattern = pattern; + emit xPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::xPosRolePattern() const +{ + return dptrc()->m_xPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::yPosRolePattern + * + * When set, a search and replace is done on the value mapped by yPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and yPosRoleReplace property contains the replacement string. + * + * \sa yPosRole, yPosRoleReplace + */ +void QItemModelScatterDataProxy::setYPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_yPosRolePattern != pattern) { + dptr()->m_yPosRolePattern = pattern; + emit yPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::yPosRolePattern() const +{ + return dptrc()->m_yPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::zPosRolePattern + * + * When set, a search and replace is done on the value mapped by zPos role before it is used as + * a item position value. This property specifies the regular expression to find the portion of the + * mapped value to replace and zPosRoleReplace property contains the replacement string. + * + * \sa zPosRole, zPosRoleReplace + */ +void QItemModelScatterDataProxy::setZPosRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_zPosRolePattern != pattern) { + dptr()->m_zPosRolePattern = pattern; + emit zPosRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::zPosRolePattern() const +{ + return dptrc()->m_zPosRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::rotationRolePattern + * + * When set, a search and replace is done on the value mapped by rotation role before it is used + * as a item rotation. This property specifies the regular expression to find the portion + * of the mapped value to replace and rotationRoleReplace property contains the replacement string. + * + * \sa rotationRole, rotationRoleReplace + */ +void QItemModelScatterDataProxy::setRotationRolePattern(const QRegExp &pattern) +{ + if (dptr()->m_rotationRolePattern != pattern) { + dptr()->m_rotationRolePattern = pattern; + emit rotationRolePatternChanged(pattern); + } +} + +QRegExp QItemModelScatterDataProxy::rotationRolePattern() const +{ + return dptrc()->m_rotationRolePattern; +} + +/*! + * \property QItemModelScatterDataProxy::xPosRoleReplace + * + * This property defines the replace content to be used in conjunction with xPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa xPosRole, xPosRolePattern + */ +void QItemModelScatterDataProxy::setXPosRoleReplace(const QString &replace) +{ + if (dptr()->m_xPosRoleReplace != replace) { + dptr()->m_xPosRoleReplace = replace; + emit xPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::xPosRoleReplace() const +{ + return dptrc()->m_xPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::yPosRoleReplace + * + * This property defines the replace content to be used in conjunction with yPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa yPosRole, yPosRolePattern + */ +void QItemModelScatterDataProxy::setYPosRoleReplace(const QString &replace) +{ + if (dptr()->m_yPosRoleReplace != replace) { + dptr()->m_yPosRoleReplace = replace; + emit yPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::yPosRoleReplace() const +{ + return dptrc()->m_yPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::zPosRoleReplace + * + * This property defines the replace content to be used in conjunction with zPosRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa zPosRole, zPosRolePattern + */ +void QItemModelScatterDataProxy::setZPosRoleReplace(const QString &replace) +{ + if (dptr()->m_zPosRoleReplace != replace) { + dptr()->m_zPosRoleReplace = replace; + emit zPosRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::zPosRoleReplace() const +{ + return dptrc()->m_zPosRoleReplace; +} + +/*! + * \property QItemModelScatterDataProxy::rotationRoleReplace + * + * This property defines the replace content to be used in conjunction with rotationRolePattern. + * Defaults to empty string. For more information on how the search and replace using regular + * expressions works, see QString::replace(const QRegExp &rx, const QString &after) + * function documentation. + * + * \sa rotationRole, rotationRolePattern + */ +void QItemModelScatterDataProxy::setRotationRoleReplace(const QString &replace) +{ + if (dptr()->m_rotationRoleReplace != replace) { + dptr()->m_rotationRoleReplace = replace; + emit rotationRoleReplaceChanged(replace); + } +} + +QString QItemModelScatterDataProxy::rotationRoleReplace() const +{ + return dptrc()->m_rotationRoleReplace; +} + /*! * Changes \a xPosRole, \a yPosRole, \a zPosRole, and \a rotationRole mapping. */ @@ -320,6 +592,24 @@ void QItemModelScatterDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRoleChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRoleChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::xPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::yPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRolePatternChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::xPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::yPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::zPosRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelScatterDataProxy::rotationRoleReplaceChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.h b/src/datavisualization/data/qitemmodelscatterdataproxy.h index c6d2245d..5c2bbce9 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.h +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.h @@ -22,6 +22,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -35,6 +36,14 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDa Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged) Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged) Q_PROPERTY(QString rotationRole READ rotationRole WRITE setRotationRole NOTIFY rotationRoleChanged) + Q_PROPERTY(QRegExp xPosRolePattern READ xPosRolePattern WRITE setXPosRolePattern NOTIFY xPosRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp yPosRolePattern READ yPosRolePattern WRITE setYPosRolePattern NOTIFY yPosRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp zPosRolePattern READ zPosRolePattern WRITE setZPosRolePattern NOTIFY zPosRolePatternChanged REVISION 1) + Q_PROPERTY(QRegExp rotationRolePattern READ rotationRolePattern WRITE setRotationRolePattern NOTIFY rotationRolePatternChanged REVISION 1) + Q_PROPERTY(QString xPosRoleReplace READ xPosRoleReplace WRITE setXPosRoleReplace NOTIFY xPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString yPosRoleReplace READ yPosRoleReplace WRITE setYPosRoleReplace NOTIFY yPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString zPosRoleReplace READ zPosRoleReplace WRITE setZPosRoleReplace NOTIFY zPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(QString rotationRoleReplace READ rotationRoleReplace WRITE setRotationRoleReplace NOTIFY rotationRoleReplaceChanged REVISION 1) public: explicit QItemModelScatterDataProxy(QObject *parent = 0); @@ -63,12 +72,38 @@ public: void remap(const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, const QString &rotationRole); + void setXPosRolePattern(const QRegExp &pattern); + QRegExp xPosRolePattern() const; + void setYPosRolePattern(const QRegExp &pattern); + QRegExp yPosRolePattern() const; + void setZPosRolePattern(const QRegExp &pattern); + QRegExp zPosRolePattern() const; + void setRotationRolePattern(const QRegExp &pattern); + QRegExp rotationRolePattern() const; + + void setXPosRoleReplace(const QString &replace); + QString xPosRoleReplace() const; + void setYPosRoleReplace(const QString &replace); + QString yPosRoleReplace() const; + void setZPosRoleReplace(const QString &replace); + QString zPosRoleReplace() const; + void setRotationRoleReplace(const QString &replace); + QString rotationRoleReplace() const; + signals: void itemModelChanged(const QAbstractItemModel* itemModel); void xPosRoleChanged(const QString &role); void yPosRoleChanged(const QString &role); void zPosRoleChanged(const QString &role); void rotationRoleChanged(const QString &role); + Q_REVISION(1) void xPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void yPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void zPosRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void rotationRolePatternChanged(const QRegExp &pattern); + Q_REVISION(1) void rotationRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void xPosRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void yPosRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void zPosRoleReplaceChanged(const QString &replace); protected: QItemModelScatterDataProxyPrivate *dptr(); diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h index 4e1f321f..733cbb1e 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy_p.h +++ b/src/datavisualization/data/qitemmodelscatterdataproxy_p.h @@ -54,6 +54,16 @@ private: QString m_zPosRole; QString m_rotationRole; + QRegExp m_xPosRolePattern; + QRegExp m_yPosRolePattern; + QRegExp m_zPosRolePattern; + QRegExp m_rotationRolePattern; + + QString m_xPosRoleReplace; + QString m_yPosRoleReplace; + QString m_zPosRoleReplace; + QString m_rotationRoleReplace; + friend class ScatterItemModelHandler; friend class QItemModelScatterDataProxy; }; diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 77f90ed4..94f36ec7 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -33,6 +33,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * Data is resolved asynchronously whenever the mapping or the model changes. * QSurfaceDataProxy::arrayReset() is emitted when the data has been resolved. + * However, when useModelCategories property is set to true, single item changes are resolved + * synchronously, unless the same frame also contains a change that causes the whole model to be + * resolved. * * There are three ways to use mappings: * diff --git a/src/datavisualization/data/scatteritemmodelhandler.cpp b/src/datavisualization/data/scatteritemmodelhandler.cpp index 280f2a23..8b4a6f89 100644 --- a/src/datavisualization/data/scatteritemmodelhandler.cpp +++ b/src/datavisualization/data/scatteritemmodelhandler.cpp @@ -29,7 +29,11 @@ ScatterItemModelHandler::ScatterItemModelHandler(QItemModelScatterDataProxy *pro m_xPosRole(noRoleIndex), m_yPosRole(noRoleIndex), m_zPosRole(noRoleIndex), - m_rotationRole(noRoleIndex) + m_rotationRole(noRoleIndex), + m_haveXPosPattern(false), + m_haveYPosPattern(false), + m_haveZPosPattern(false), + m_haveRotationPattern(false) { } @@ -134,17 +138,48 @@ void ScatterItemModelHandler::modelPosToScatterItem(int modelRow, int modelColum QScatterDataItem &item) { QModelIndex index = m_itemModel->index(modelRow, modelColumn); - float xPos(0.0f); - float yPos(0.0f); - float zPos(0.0f); - if (m_xPosRole != noRoleIndex) - xPos = index.data(m_xPosRole).toFloat(); - if (m_yPosRole != noRoleIndex) - yPos = index.data(m_yPosRole).toFloat(); - if (m_zPosRole != noRoleIndex) - zPos = index.data(m_zPosRole).toFloat(); - if (m_rotationRole != noRoleIndex) - item.setRotation(toQuaternion(index.data(m_rotationRole))); + float xPos; + float yPos; + float zPos; + if (m_xPosRole != noRoleIndex) { + QVariant xValueVar = index.data(m_xPosRole); + if (m_haveXPosPattern) + xPos = xValueVar.toString().replace(m_xPosPattern, m_xPosReplace).toFloat(); + else + xPos = xValueVar.toFloat(); + } else { + xPos = 0.0f; + } + if (m_yPosRole != noRoleIndex) { + QVariant yValueVar = index.data(m_yPosRole); + if (m_haveYPosPattern) + yPos = yValueVar.toString().replace(m_yPosPattern, m_yPosReplace).toFloat(); + else + yPos = yValueVar.toFloat(); + } else { + yPos = 0.0f; + } + if (m_zPosRole != noRoleIndex) { + QVariant zValueVar = index.data(m_zPosRole); + if (m_haveZPosPattern) + zPos = zValueVar.toString().replace(m_zPosPattern, m_zPosReplace).toFloat(); + else + zPos = zValueVar.toFloat(); + } else { + zPos = 0.0f; + } + if (m_rotationRole != noRoleIndex) { + QVariant rotationVar = index.data(m_rotationRole); + if (m_haveRotationPattern) { + item.setRotation( + toQuaternion( + QVariant(rotationVar.toString().replace(m_rotationPattern, + m_rotationReplace)))); + } else { + item.setRotation(toQuaternion(rotationVar)); + } + } + item.setPosition(QVector3D(xPos, yPos, zPos)); } @@ -157,6 +192,19 @@ void ScatterItemModelHandler::resolveModel() return; } + m_xPosPattern = m_proxy->xPosRolePattern(); + m_yPosPattern = m_proxy->yPosRolePattern(); + m_zPosPattern = m_proxy->zPosRolePattern(); + m_rotationPattern = m_proxy->rotationRolePattern(); + m_xPosReplace = m_proxy->xPosRoleReplace(); + m_yPosReplace = m_proxy->yPosRoleReplace(); + m_zPosReplace = m_proxy->zPosRoleReplace(); + m_rotationReplace = m_proxy->rotationRoleReplace(); + m_haveXPosPattern = !m_xPosPattern.isEmpty() && m_xPosPattern.isValid(); + m_haveYPosPattern = !m_yPosPattern.isEmpty() && m_yPosPattern.isValid(); + m_haveZPosPattern = !m_zPosPattern.isEmpty() && m_zPosPattern.isValid(); + m_haveRotationPattern = !m_rotationPattern.isEmpty() && m_rotationPattern.isValid(); + QHash roleHash = m_itemModel->roleNames(); m_xPosRole = roleHash.key(m_proxy->xPosRole().toLatin1(), noRoleIndex); m_yPosRole = roleHash.key(m_proxy->yPosRole().toLatin1(), noRoleIndex); diff --git a/src/datavisualization/data/scatteritemmodelhandler_p.h b/src/datavisualization/data/scatteritemmodelhandler_p.h index 0661d734..817b245d 100644 --- a/src/datavisualization/data/scatteritemmodelhandler_p.h +++ b/src/datavisualization/data/scatteritemmodelhandler_p.h @@ -59,6 +59,18 @@ private: int m_yPosRole; int m_zPosRole; int m_rotationRole; + QRegExp m_xPosPattern; + QRegExp m_yPosPattern; + QRegExp m_zPosPattern; + QRegExp m_rotationPattern; + QString m_xPosReplace; + QString m_yPosReplace; + QString m_zPosReplace; + QString m_rotationReplace; + bool m_haveXPosPattern; + bool m_haveYPosPattern; + bool m_haveZPosPattern; + bool m_haveRotationPattern; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index 09afb6b1..8e89109e 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -94,6 +94,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); qmlRegisterType(uri, 1, 1, "ItemModelSurfaceDataProxy"); + qmlRegisterType(uri, 1, 1, "ItemModelScatterDataProxy"); // New types qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); diff --git a/tests/qmlmultitest/qml/qmlmultitest/main.qml b/tests/qmlmultitest/qml/qmlmultitest/main.qml index da34c0bf..84eb4294 100644 --- a/tests/qmlmultitest/qml/qmlmultitest/main.qml +++ b/tests/qmlmultitest/qml/qmlmultitest/main.qml @@ -144,19 +144,22 @@ Rectangle { Scatter3DSeries { itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel" + mesh: Abstract3DSeries.MeshCube ItemModelScatterDataProxy { itemModel: data.sharedData // Mapping model roles to scatter series item coordinates. xPosRole: "data" zPosRole: "data" yPosRole: "data" - // TODO scatter test -// xPosRolePattern: /^([asd]*)([fgh]*)([jkl]*)[^\/]*\/([^\/]*)\/.*$/ -// yPosRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ -// zPosRolePattern: /^([asd]*)([qwe]*)([tyu]*)([fgj]*)([^\/]*)\/[^\/]*\/.*$/ -// xPosRoleReplace: "\\4" -// yPosRoleReplace: "\\3" -// zPosRoleReplace: "\\5" + rotationRole: "coords" + xPosRolePattern: /^([asd]*)([fgh]*)([jkl]*)[^\/]*\/([^\/]*)\/.*$/ + yPosRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ + zPosRolePattern: /^([asd]*)([qwe]*)([tyu]*)([fgj]*)([^\/]*)\/[^\/]*\/.*$/ + rotationRolePattern: /(\d)\,(\d)/ + xPosRoleReplace: "\\4" + yPosRoleReplace: "\\3" + zPosRoleReplace: "\\5" + rotationRoleReplace: "@\\2\\1,0,1,0" } } } -- cgit v1.2.3 From e5c7d46ba8c817e663d373fda191662b3276fdc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 13 May 2014 06:22:30 +0300 Subject: Added API for querying label selection Task-number: QTRD-3045 Change-Id: Ib5c8f29bcf0148ae604e27b2a81e6f72a2dbca2a Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 21 ++++++++++++ .../engine/abstract3dcontroller.cpp | 38 +++++++++++++++++++--- .../engine/abstract3dcontroller_p.h | 9 +++-- .../engine/abstract3drenderer_p.h | 4 +++ src/datavisualization/engine/bars3drenderer.cpp | 4 +++ src/datavisualization/engine/qabstract3dgraph.cpp | 28 ++++++++++++++++ src/datavisualization/engine/qabstract3dgraph.h | 4 +++ src/datavisualization/engine/scatter3drenderer.cpp | 4 +++ src/datavisualization/engine/surface3drenderer.cpp | 3 ++ src/datavisualizationqml2/abstractdeclarative.cpp | 10 ++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 3 ++ 11 files changed, 121 insertions(+), 7 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 4d0b8212..fc91e795 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -186,3 +186,24 @@ * \since Qt Data Visualization 1.1 */ +/*! + * \qmlmethod int AbstractGraph3D::selectedLabelIndex() + * + * Can be used to query the index of the selected label after receiving elementSelected signal with + * any label type. Selection is valid until the next elementSelected signal. + * + * \return index of the selected label, or -1. + * + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod Abstract3DAxis AbstractGraph3D::selectedAxis() + * + * Can be used to get the selected axis after receiving elementSelected signal with any label type. + * Selection is valid until the next elementSelected signal. + * + * \return the selected axis, or null. + * + * \since Qt Data Visualization 1.1 + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 790a0889..fd773675 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -580,7 +580,7 @@ void Abstract3DController::setAxisX(QAbstract3DAxis *axis) } } -QAbstract3DAxis *Abstract3DController::axisX() +QAbstract3DAxis *Abstract3DController::axisX() const { return m_axisX; } @@ -594,7 +594,7 @@ void Abstract3DController::setAxisY(QAbstract3DAxis *axis) } } -QAbstract3DAxis *Abstract3DController::axisY() +QAbstract3DAxis *Abstract3DController::axisY() const { return m_axisY; } @@ -608,7 +608,7 @@ void Abstract3DController::setAxisZ(QAbstract3DAxis *axis) } } -QAbstract3DAxis *Abstract3DController::axisZ() +QAbstract3DAxis *Abstract3DController::axisZ() const { return m_axisZ; } @@ -1263,6 +1263,36 @@ void Abstract3DController::handlePendingClick() { QAbstract3DGraph::ElementType type = m_renderer->clickedType(); emit elementSelected(type); - // TODO: Consider adding type specific signals } + +int Abstract3DController::selectedLabelIndex() const +{ + int index = m_renderer->m_selectedLabelIndex; + if (selectedAxis()->labels().count() <= index) + index = -1; + return index; +} + +QAbstract3DAxis *Abstract3DController::selectedAxis() const +{ + QAbstract3DAxis *axis = 0; + QAbstract3DGraph::ElementType type = m_renderer->clickedType(); + switch (type) { + case QAbstract3DGraph::ElementAxisXLabel: + axis = axisX(); + break; + case QAbstract3DGraph::ElementAxisYLabel: + axis = axisY(); + break; + case QAbstract3DGraph::ElementAxisZLabel: + axis = axisZ(); + break; + default: + axis = 0; + break; + } + + return axis; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 53560760..cebae72b 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -195,11 +195,11 @@ public: QList seriesList(); virtual void setAxisX(QAbstract3DAxis *axis); - virtual QAbstract3DAxis *axisX(); + virtual QAbstract3DAxis *axisX() const; virtual void setAxisY(QAbstract3DAxis *axis); - virtual QAbstract3DAxis *axisY(); + virtual QAbstract3DAxis *axisY() const; virtual void setAxisZ(QAbstract3DAxis *axis); - virtual QAbstract3DAxis *axisZ(); + virtual QAbstract3DAxis *axisZ() const; virtual void addAxis(QAbstract3DAxis *axis); virtual void releaseAxis(QAbstract3DAxis *axis); virtual QList axes() const; // Omits default axes @@ -241,6 +241,9 @@ public: void deleteCustomItem(QCustom3DItem *item); void deleteCustomItem(const QVector3D &position); + int selectedLabelIndex() const; + QAbstract3DAxis *selectedAxis() const; + void emitNeedRender(); virtual void clearSelection() = 0; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index ea61ae51..3ae36450 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -180,12 +180,16 @@ protected: bool m_clickPending; QAbstract3DSeries *m_clickedSeries; QAbstract3DGraph::ElementType m_clickedType; + int m_selectedLabelIndex; QString m_selectionLabel; LabelItem *m_selectionLabelItem; int m_visibleSeriesCount; ShaderHelper *m_customItemShader; + +private: + friend class Abstract3DController; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index a6f893e5..bf381754 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2269,6 +2269,7 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC { QPoint position = Bars3DController::invalidSelectionPosition(); m_clickedType = QAbstract3DGraph::ElementNone; + m_selectedLabelIndex = -1; if (selectionColor.w() == itemAlpha) { // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), @@ -2282,6 +2283,7 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC GLint previousCol = qMax(0, m_selectedBarPos.y()); // Use 0 if previous is invalid position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), previousCol); } + m_selectedLabelIndex = selectionColor.x(); // Pass label clicked info to input handler m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (selectionColor.w() == labelColumnAlpha) { @@ -2291,11 +2293,13 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC GLint previousRow = qMax(0, m_selectedBarPos.x()); // Use 0 if previous is invalid position = QPoint(previousRow, int(selectionColor.y()) + int(m_axisCacheX.min())); } + m_selectedLabelIndex = selectionColor.y(); // Pass label clicked info to input handler m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (selectionColor.w() == labelValueAlpha) { // Value selection position = Bars3DController::invalidSelectionPosition(); + m_selectedLabelIndex = selectionColor.z(); // Pass label clicked info to input handler m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } else if (selectionColor.w() == customItemAlpha) { diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 85ee79c9..13d7972a 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -426,6 +426,32 @@ void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) d_ptr->m_visualController->deleteCustomItem(position); } +/*! + * Can be used to query the index of the selected label after receiving elementSelected signal with + * any label type. Selection is valid until the next elementSelected signal. + * + * \return index of the selected label, or -1. + * + * \since Qt Data Visualization 1.1 + */ +int QAbstract3DGraph::selectedLabelIndex() const +{ + return d_ptr->m_visualController->selectedLabelIndex(); +} + +/*! + * Can be used to get the selected axis after receiving elementSelected signal with any label type. + * Selection is valid until the next elementSelected signal. + * + * \return pointer to the selected axis, or null. + * + * \since Qt Data Visualization 1.1 + */ +QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const +{ + return d_ptr->m_visualController->selectedAxis(); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. @@ -449,6 +475,8 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * * Signal can be used for example for implementing custom input handlers, as demonstrated in this * \l {Axis Range Dragging With Labels Example}{example}. + * + * \sa selectedLabelIndex(), selectedAxis() */ /*! diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index ae1efacf..2ff2d84f 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -30,6 +30,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QAbstract3DGraphPrivate; class QCustom3DItem; +class QAbstract3DAxis; class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected QOpenGLFunctions { @@ -113,6 +114,9 @@ public: void removeCustomItem(QCustom3DItem *item); void removeCustomItemAt(const QVector3D &position); + int selectedLabelIndex() const; + QAbstract3DAxis *selectedAxis() const; + QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); void setMeasureFps(bool enable); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index c1705179..ff01d51e 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1761,18 +1761,22 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, QAbstract3DSeries *&series) { m_clickedType = QAbstract3DGraph::ElementNone; + m_selectedLabelIndex = -1; if (color != selectionSkipColor) { if (color.w() == labelRowAlpha) { // Row selection index = Scatter3DController::invalidSelectionIndex(); + m_selectedLabelIndex = color.x(); m_clickedType = QAbstract3DGraph::ElementAxisZLabel; } else if (color.w() == labelColumnAlpha) { // Column selection index = Scatter3DController::invalidSelectionIndex(); + m_selectedLabelIndex = color.y(); m_clickedType = QAbstract3DGraph::ElementAxisXLabel; } else if (color.w() == labelValueAlpha) { // Value selection index = Scatter3DController::invalidSelectionIndex(); + m_selectedLabelIndex = color.z(); m_clickedType = QAbstract3DGraph::ElementAxisYLabel; } else if (color.w() == customItemAlpha) { // Custom item selection diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index d3898476..00e6e21f 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2289,12 +2289,15 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) m_clickedType = QAbstract3DGraph::ElementNone; // Check for label and custom item selection if (id / alphaMultiplier == labelRowAlpha) { + m_selectedLabelIndex = id - (alphaMultiplier * labelRowAlpha); m_clickedType = QAbstract3DGraph::ElementAxisZLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelColumnAlpha) { + m_selectedLabelIndex = (id - (alphaMultiplier * labelColumnAlpha)) / greenMultiplier; m_clickedType = QAbstract3DGraph::ElementAxisXLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelValueAlpha) { + m_selectedLabelIndex = (id - (alphaMultiplier * labelValueAlpha)) / blueMultiplier; m_clickedType = QAbstract3DGraph::ElementAxisYLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == customItemAlpha) { diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index fa69cac9..cdcfcf65 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -231,6 +231,16 @@ void AbstractDeclarative::removeCustomItemAt(const QVector3D &position) m_controller->deleteCustomItem(position); } +int AbstractDeclarative::selectedLabelIndex() const +{ + return m_controller->selectedLabelIndex(); +} + +QAbstract3DAxis *AbstractDeclarative::selectedAxis() const +{ + return m_controller->selectedAxis(); +} + QQmlListProperty AbstractDeclarative::customItemList() { return QQmlListProperty(this, this, diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 8121e35d..7db6c935 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -134,6 +134,9 @@ public: Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItem(QCustom3DItem *item); Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); + Q_REVISION(1) Q_INVOKABLE virtual int selectedLabelIndex() const; + Q_REVISION(1) Q_INVOKABLE virtual QAbstract3DAxis *selectedAxis() const; + QQmlListProperty customItemList(); static void appendCustomItemFunc(QQmlListProperty *list, QCustom3DItem *item); -- cgit v1.2.3 From 604d8a652cc088a4b3a4307ec291916757e03201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 13 May 2014 08:26:06 +0300 Subject: API to query custom item selection Task-number: QTRD-3046 + Added missing elementSelected signal to QML Change-Id: I5e79d8e910d2730e3d2ae5550ce576f01aac0b18 Change-Id: I5e79d8e910d2730e3d2ae5550ce576f01aac0b18 Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 29 +++++++++++++++-- .../customitems/customitemgraph.h | 7 +++- examples/datavisualization/customitems/main.cpp | 15 ++++++++- ...tdatavisualization-qml-abstractdeclarative.qdoc | 37 ++++++++++++++++++++-- .../engine/abstract3dcontroller.cpp | 20 +++++++++++- .../engine/abstract3dcontroller_p.h | 2 ++ .../engine/abstract3drenderer_p.h | 1 + src/datavisualization/engine/bars3drenderer.cpp | 4 +++ src/datavisualization/engine/qabstract3dgraph.cpp | 30 +++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 3 ++ src/datavisualization/engine/scatter3drenderer.cpp | 4 +++ src/datavisualization/engine/surface3drenderer.cpp | 3 ++ src/datavisualizationqml2/abstractdeclarative.cpp | 12 +++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 4 +++ 14 files changed, 163 insertions(+), 8 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index c2479a9a..0a757e7d 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -24,8 +24,9 @@ using namespace QtDataVisualization; -CustomItemGraph::CustomItemGraph(Q3DSurface *surface) - : m_graph(surface) +CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label) + : m_graph(surface), + m_textField(label) { QImage layerOneHMap(":/maps/layer_1.png"); QHeightMapSurfaceDataProxy *layerOneProxy = new QHeightMapSurfaceDataProxy(layerOneHMap); @@ -87,6 +88,9 @@ CustomItemGraph::CustomItemGraph(Q3DSurface *surface) m_graph->seriesList().at(2)->setColorStyle(Q3DTheme::ColorStyleRangeGradient); m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); + + connect(m_graph, &QAbstract3DGraph::elementSelected, + this, &CustomItemGraph::handleElementSelected); } CustomItemGraph::~CustomItemGraph() @@ -189,3 +193,24 @@ void CustomItemGraph::toggleShadows(bool shadows) else m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); } + +void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) +{ + if (type == QAbstract3DGraph::ElementCustomItem) { + int index = m_graph->selectedCustomItemIndex(); + QCustom3DItem *item = m_graph->selectedCustomItem(); + QString text; + text.setNum(index); + text.append(": "); + QStringList split = item->meshFile().split("/"); + text.append(split.last()); + m_textField->setText(text); + } else if (type == QAbstract3DGraph::ElementSeries) { + m_textField->setText("Surface"); + } else if (type > QAbstract3DGraph::ElementSeries + && type < QAbstract3DGraph::ElementCustomItem) { + m_textField->setText("Axis"); + } else { + m_textField->setText("Nothing"); + } +} diff --git a/examples/datavisualization/customitems/customitemgraph.h b/examples/datavisualization/customitems/customitemgraph.h index a13e8620..aee32c62 100644 --- a/examples/datavisualization/customitems/customitemgraph.h +++ b/examples/datavisualization/customitems/customitemgraph.h @@ -24,6 +24,7 @@ #include #include #include +#include using namespace QtDataVisualization; @@ -31,7 +32,7 @@ class CustomItemGraph : public QObject { Q_OBJECT public: - explicit CustomItemGraph(Q3DSurface *surface); + explicit CustomItemGraph(Q3DSurface *surface, QLabel *label); ~CustomItemGraph(); void toggleItemOne(bool show); @@ -41,8 +42,12 @@ public: void toggleOilHighlight(bool highlight); void toggleShadows(bool shadows); +private: + void handleElementSelected(QAbstract3DGraph::ElementType type); + private: Q3DSurface *m_graph; + QLabel *m_textField; }; #endif diff --git a/examples/datavisualization/customitems/main.cpp b/examples/datavisualization/customitems/main.cpp index a37cc76f..fe2d0edc 100644 --- a/examples/datavisualization/customitems/main.cpp +++ b/examples/datavisualization/customitems/main.cpp @@ -65,10 +65,12 @@ int main(int argc, char **argv) vLayoutLeft->addWidget(checkboxThree); QLabel *label2 = new QLabel("Visuals:"); + font.setBold(true); label2->setFont(font); vLayoutRight->addWidget(label2); QCheckBox *checkboxOneRight = new QCheckBox("See-Through"); + font.setBold(false); checkboxOneRight->setFont(font); vLayoutRight->addWidget(checkboxOneRight); @@ -81,11 +83,22 @@ int main(int argc, char **argv) checkboxThreeRight->setChecked(true); vLayoutRight->addWidget(checkboxThreeRight); + QLabel *label3 = new QLabel("Selection:"); + font.setBold(true); + label3->setFont(font); + vLayoutRight->addWidget(label3); + + QLabel *label4 = new QLabel("Nothing"); + font.setBold(false); + font.setPointSize(12); + label4->setFont(font); + vLayoutRight->addWidget(label4); + widget->setWindowTitle(QStringLiteral("Custom Items Example")); widget->show(); - CustomItemGraph *modifier = new CustomItemGraph(graph); + CustomItemGraph *modifier = new CustomItemGraph(graph, label4); QObject::connect(checkboxOne, &QCheckBox::stateChanged, modifier, &CustomItemGraph::toggleItemOne); diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index fc91e795..9995c508 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -28,8 +28,8 @@ Note that this type is uncreatable, but contains properties that are shared between the 3D visualizations. - For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag and - \l QAbstract3DGraph::ShadowQuality + For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag, + \l QAbstract3DGraph::ShadowQuality, and \l QAbstract3DGraph::ElementType \sa Bars3D, Scatter3D, Surface3D, {Qt Data Visualization C++ Classes} */ @@ -207,3 +207,36 @@ * * \since Qt Data Visualization 1.1 */ + +/*! + * \qmlmethod int AbstractGraph3D::selectedCustomItemIndex() + * + * Can be used to query the index of the selected custom item after receiving elementSelected signal + * with \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Selection is valid until + * the next elementSelected signal. + * + * \return index of the selected custom item, or -1. + * + * \since Qt Data Visualization 1.1 + */ + +/*! + * \qmlmethod Custom3DItem AbstractGraph3D::selectedCustomItem() + * + * Can be used to get the selected custom item after receiving elementSelected signal with + * \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Ownership of the item remains + * with the graph. Selection is valid until the next elementSelected signal. + * + * \return the selected custom item, or null. + * + * \since Qt Data Visualization 1.1 + */ + +/*! \qmlsignal AbstractGraph3D::elementSelected(ElementType type) + * + * Emits selection \a type when a selection is made in the graph. + * + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() + * + * \since Qt Data Visualization 1.1 + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index fd773675..7c30f1c0 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -1268,7 +1268,8 @@ void Abstract3DController::handlePendingClick() int Abstract3DController::selectedLabelIndex() const { int index = m_renderer->m_selectedLabelIndex; - if (selectedAxis()->labels().count() <= index) + QAbstract3DAxis *axis = selectedAxis(); + if (axis && axis->labels().count() <= index) index = -1; return index; } @@ -1295,4 +1296,21 @@ QAbstract3DAxis *Abstract3DController::selectedAxis() const return axis; } +int Abstract3DController::selectedCustomItemIndex() const +{ + int index = m_renderer->m_selectedCustomItemIndex; + if (m_customItems.count() <= index) + index = -1; + return index; +} + +QCustom3DItem *Abstract3DController::selectedCustomItem() const +{ + QCustom3DItem *item = 0; + int index = selectedCustomItemIndex(); + if (index >= 0) + item = m_customItems[index]; + return item; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index cebae72b..62b647a6 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -243,6 +243,8 @@ public: int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; + int selectedCustomItemIndex() const; + QCustom3DItem *selectedCustomItem() const; void emitNeedRender(); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 3ae36450..58173a61 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -181,6 +181,7 @@ protected: QAbstract3DSeries *m_clickedSeries; QAbstract3DGraph::ElementType m_clickedType; int m_selectedLabelIndex; + int m_selectedCustomItemIndex; QString m_selectionLabel; LabelItem *m_selectionLabelItem; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index bf381754..015f76d5 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2270,6 +2270,7 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC QPoint position = Bars3DController::invalidSelectionPosition(); m_clickedType = QAbstract3DGraph::ElementNone; m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; if (selectionColor.w() == itemAlpha) { // Normal selection item position = QPoint(int(selectionColor.x() + int(m_axisCacheZ.min())), @@ -2305,6 +2306,9 @@ QPoint Bars3DRenderer::selectionColorToArrayPosition(const QVector4D &selectionC } else if (selectionColor.w() == customItemAlpha) { // Custom item selection position = Bars3DController::invalidSelectionPosition(); + m_selectedCustomItemIndex = int(selectionColor.x()) + + (int(selectionColor.y()) << 8) + + (int(selectionColor.z()) << 16); m_clickedType = QAbstract3DGraph::ElementCustomItem; } return position; diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 13d7972a..f2942026 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -452,6 +452,34 @@ QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const return d_ptr->m_visualController->selectedAxis(); } +/*! + * Can be used to query the index of the selected custom item after receiving elementSelected signal + * with QAbstract3DGraph::ElementCustomItem type. Selection is valid until the next elementSelected + * signal. + * + * \return index of the selected custom item, or -1. + * + * \since Qt Data Visualization 1.1 + */ +int QAbstract3DGraph::selectedCustomItemIndex() const +{ + return d_ptr->m_visualController->selectedCustomItemIndex(); +} + +/*! + * Can be used to get the selected custom item after receiving elementSelected signal with + * QAbstract3DGraph::ElementCustomItem type. Ownership of the item remains with the graph. + * Selection is valid until the next elementSelected signal. + * + * \return pointer to the selected custom item, or null. + * + * \since Qt Data Visualization 1.1 + */ +QCustom3DItem *QAbstract3DGraph::selectedCustomItem() const +{ + return d_ptr->m_visualController->selectedCustomItem(); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. @@ -476,7 +504,7 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * Signal can be used for example for implementing custom input handlers, as demonstrated in this * \l {Axis Range Dragging With Labels Example}{example}. * - * \sa selectedLabelIndex(), selectedAxis() + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() */ /*! diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 2ff2d84f..aeccf667 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -117,6 +117,9 @@ public: int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; + int selectedCustomItemIndex() const; + QCustom3DItem *selectedCustomItem() const; + QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); void setMeasureFps(bool enable); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index ff01d51e..9e8712e3 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1762,6 +1762,7 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, { m_clickedType = QAbstract3DGraph::ElementNone; m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; if (color != selectionSkipColor) { if (color.w() == labelRowAlpha) { // Row selection @@ -1781,6 +1782,9 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, } else if (color.w() == customItemAlpha) { // Custom item selection index = Scatter3DController::invalidSelectionIndex(); + m_selectedCustomItemIndex = int(color.x()) + + (int(color.y()) << 8) + + (int(color.z()) << 16); m_clickedType = QAbstract3DGraph::ElementCustomItem; } else { int totalIndex = int(color.x()) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 00e6e21f..f405212f 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2287,6 +2287,8 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) { m_clickedType = QAbstract3DGraph::ElementNone; + m_selectedLabelIndex = -1; + m_selectedCustomItemIndex = -1; // Check for label and custom item selection if (id / alphaMultiplier == labelRowAlpha) { m_selectedLabelIndex = id - (alphaMultiplier * labelRowAlpha); @@ -2303,6 +2305,7 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) } else if (id / alphaMultiplier == customItemAlpha) { // Custom item selection m_clickedType = QAbstract3DGraph::ElementCustomItem; + m_selectedCustomItemIndex = id - (alphaMultiplier * customItemAlpha); return Surface3DController::invalidSelectionPosition(); } diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index cdcfcf65..375c9bdb 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -241,6 +241,16 @@ QAbstract3DAxis *AbstractDeclarative::selectedAxis() const return m_controller->selectedAxis(); } +int AbstractDeclarative::selectedCustomItemIndex() const +{ + return m_controller->selectedCustomItemIndex(); +} + +QCustom3DItem *AbstractDeclarative::selectedCustomItem() const +{ + return m_controller->selectedCustomItem(); +} + QQmlListProperty AbstractDeclarative::customItemList() { return QQmlListProperty(this, this, @@ -293,6 +303,8 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) &AbstractDeclarative::themeChanged); QObject::connect(m_controller.data(), &Abstract3DController::selectionModeChanged, this, &AbstractDeclarative::handleSelectionModeChange); + QObject::connect(m_controller.data(), &Abstract3DController::elementSelected, this, + &AbstractDeclarative::elementSelected); QObject::connect(m_controller.data(), &Abstract3DController::axisXChanged, this, &AbstractDeclarative::handleAxisXChanged); diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 7db6c935..3dd07dca 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -137,6 +137,9 @@ public: Q_REVISION(1) Q_INVOKABLE virtual int selectedLabelIndex() const; Q_REVISION(1) Q_INVOKABLE virtual QAbstract3DAxis *selectedAxis() const; + Q_REVISION(1) Q_INVOKABLE virtual int selectedCustomItemIndex() const; + Q_REVISION(1) Q_INVOKABLE virtual QCustom3DItem *selectedCustomItem() const; + QQmlListProperty customItemList(); static void appendCustomItemFunc(QQmlListProperty *list, QCustom3DItem *item); @@ -191,6 +194,7 @@ signals: void renderingModeChanged(AbstractDeclarative::RenderingMode mode); Q_REVISION(1) void measureFpsChanged(bool enabled); Q_REVISION(1) void currentFpsChanged(qreal fps); + Q_REVISION(1) void elementSelected(QAbstract3DGraph::ElementType type); private: QPointer m_controller; -- cgit v1.2.3 From 200031404f12422b78e9220aeb4fa12ba8f358a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 13 May 2014 09:56:06 +0300 Subject: Some changes to querying series selection Task-number: QTRD-3047 Change-Id: I95a3e4d5b4a19f1bca7e92bf1e55918a2f0eb3a0 Change-Id: I95a3e4d5b4a19f1bca7e92bf1e55918a2f0eb3a0 Reviewed-by: Miikka Heikkinen --- examples/datavisualization/customitems/customitemgraph.cpp | 14 +++++++++++++- .../src/qtdatavisualization-qml-abstractdeclarative.qdoc | 3 ++- src/datavisualization/engine/bars3dcontroller.cpp | 4 ++-- src/datavisualization/engine/qabstract3dgraph.cpp | 3 ++- src/datavisualization/engine/scatter3dcontroller.cpp | 4 ++-- src/datavisualization/engine/surface3dcontroller.cpp | 4 ++-- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 0a757e7d..e0344232 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -206,7 +206,19 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) text.append(split.last()); m_textField->setText(text); } else if (type == QAbstract3DGraph::ElementSeries) { - m_textField->setText("Surface"); + QString text = "Surface ("; + QSurface3DSeries *series = m_graph->selectedSeries(); + if (series) { + QPoint point = series->selectedPoint(); + QString posStr; + posStr.setNum(point.x()); + text.append(posStr); + text.append(", "); + posStr.setNum(point.y()); + text.append(posStr); + } + text.append(")"); + m_textField->setText(text); } else if (type > QAbstract3DGraph::ElementSeries && type < QAbstract3DGraph::ElementCustomItem) { m_textField->setText("Axis"); diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 9995c508..02e4ff4f 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -236,7 +236,8 @@ * * Emits selection \a type when a selection is made in the graph. * - * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), + * Bars3D::selectedSeries, Scatter3D::selectedSeries, Surface3D::selectedSeries * * \since Qt Data Visualization 1.1 */ diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index c394ad2f..f045a874 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -321,10 +321,10 @@ void Bars3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QBar3DSeries *series = static_cast(m_renderer->clickedSeries()); - Abstract3DController::handlePendingClick(); - setSelectedBar(position, series, true); + Abstract3DController::handlePendingClick(); + m_renderer->resetClickedStatus(); } diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index f2942026..48d8494e 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -504,7 +504,8 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * Signal can be used for example for implementing custom input handlers, as demonstrated in this * \l {Axis Range Dragging With Labels Example}{example}. * - * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem() + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), + * Q3DBars::selectedSeries(), Q3DScatter::selectedSeries(), Q3DSurface::selectedSeries() */ /*! diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index 2d38a4a7..f580244a 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -298,10 +298,10 @@ void Scatter3DController::handlePendingClick() } } - Abstract3DController::handlePendingClick(); - setSelectedItem(index, series); + Abstract3DController::handlePendingClick(); + m_renderer->resetClickedStatus(); } diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 6f27c7df..812efa3a 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -119,10 +119,10 @@ void Surface3DController::handlePendingClick() QPoint position = m_renderer->clickedPosition(); QSurface3DSeries *series = static_cast(m_renderer->clickedSeries()); - Abstract3DController::handlePendingClick(); - setSelectedPoint(position, series, true); + Abstract3DController::handlePendingClick(); + m_renderer->resetClickedStatus(); } -- cgit v1.2.3 From 576050ff96cbf67014313bd7c1f2b475b00dd80c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 13 May 2014 12:37:06 +0300 Subject: Multi-match behavior implementation for bar item model proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3074 Change-Id: I8e34d2546198a743e0132f0ce201dd38daf7ce7a Reviewed-by: Tomi Korpipää --- src/datavisualization/data/baritemmodelhandler.cpp | 49 ++++++++++++++--- .../data/qitemmodelbardataproxy.cpp | 61 +++++++++++++++++++++- .../data/qitemmodelbardataproxy.h | 13 +++++ .../data/qitemmodelbardataproxy_p.h | 2 + tests/qmlmultitest/qml/qmlmultitest/Data.qml | 21 ++++++++ tests/qmlmultitest/qml/qmlmultitest/main.qml | 32 ++++++++---- 6 files changed, 159 insertions(+), 19 deletions(-) diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index 4685be44..3d1ce82f 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "baritemmodelhandler_p.h" +#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -176,8 +177,17 @@ void BarItemModelHandler::resolveModel() // Sort values into rows and columns typedef QHash ColumnValueMap; - QHash itemValueMap; - QHash itemRotationMap; + QHash itemValueMap; + QHash itemRotationMap; + + bool cumulative = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBAverage + || m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBCumulative; + bool countMatches = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBAverage; + bool takeFirst = m_proxy->multiMatchBehavior() == QItemModelBarDataProxy::MMBFirst; + QHash > *matchCountMap = 0; + if (countMatches) + matchCountMap = new QHash >; + for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { QModelIndex index = m_itemModel->index(i, j); @@ -193,7 +203,19 @@ void BarItemModelHandler::resolveModel() value = valueVar.toString().replace(m_valuePattern, m_valueReplace).toFloat(); else value = valueVar.toFloat(); - itemValueMap[rowRoleStr][columnRoleStr] = value; + if (countMatches) + (*matchCountMap)[rowRoleStr][columnRoleStr]++; + + if (cumulative) { + itemValueMap[rowRoleStr][columnRoleStr] += value; + } else { + if (takeFirst && itemValueMap.contains(rowRoleStr)) { + if (itemValueMap.value(rowRoleStr).contains(columnRoleStr)) + continue; // We already have a value for this row/column combo + } + itemValueMap[rowRoleStr][columnRoleStr] = value; + } + if (m_rotationRole != noRoleIndex) { QVariant rotationVar = index.data(m_rotationRole); float rotation; @@ -203,7 +225,13 @@ void BarItemModelHandler::resolveModel() } else { rotation = rotationVar.toFloat(); } - itemRotationMap[rowRoleStr][columnRoleStr] = rotation; + if (cumulative) { + itemRotationMap[rowRoleStr][columnRoleStr] += rotation; + } else { + // We know we are in take last mode if we get here, + // as take first mode skips to next loop already earlier + itemRotationMap[rowRoleStr][columnRoleStr] = rotation; + } } if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); @@ -239,9 +267,16 @@ void BarItemModelHandler::resolveModel() QString rowKey = rowList.at(i); QBarDataRow &newProxyRow = *m_proxyArray->at(i); for (int j = 0; j < columnList.size(); j++) { - newProxyRow[j].setValue(itemValueMap[rowKey][columnList.at(j)]); - if (m_rotationRole != noRoleIndex) - newProxyRow[j].setRotation(itemRotationMap[rowKey][columnList.at(j)]); + float value = itemValueMap[rowKey][columnList.at(j)]; + if (countMatches) + value /= float((*matchCountMap)[rowKey][columnList.at(j)]); + newProxyRow[j].setValue(value); + if (m_rotationRole != noRoleIndex) { + float angle = itemRotationMap[rowKey][columnList.at(j)]; + if (countMatches) + angle /= float((*matchCountMap)[rowKey][columnList.at(j)]); + newProxyRow[j].setRotation(angle); + } } } diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index cccf7d44..ba98ced1 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -236,6 +236,37 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \sa rotationRole, rotationRolePattern */ +/*! + * \qmlproperty ItemModelBarDataProxy.MultiMatchBehavior ItemModelBarDataProxy::multiMatchBehavior + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to ItemModelBarDataProxy.MMBLast. The chosen behavior affects both bar value + * and rotation. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize total value of data items on each day with a bar graph. + * This can be done by specifying row and column categories so that each bar represents a day, + * and setting multiMatchBehavior to ItemModelBarDataProxy.MMBCumulative. + */ + +/*! + * \enum QItemModelBarDataProxy::MultiMatchBehavior + * + * Behavior types for QItemModelBarDataProxy::multiMatchBehavior property. + * + * \value MMBFirst + * The value is taken from the first item in the item model that matches + * each row/column combination. + * \value MMBLast + * The value is taken from the last item in the item model that matches + * each row/column combination. + * \value MMBAverage + * The values from all items matching each row/column combination are + * averaged together and the average is used as the bar value. + * \value MMBCumulative + * The values from all items matching each row/column combination are + * added together and the total is used as the bar value. + */ + /*! * Constructs QItemModelBarDataProxy with optional \a parent. */ @@ -783,6 +814,31 @@ QString QItemModelBarDataProxy::rotationRoleReplace() const return dptrc()->m_rotationRoleReplace; } +/*! + * \property QItemModelBarDataProxy::multiMatchBehavior + * + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to QItemModelBarDataProxy::MMBLast. The chosen behavior affects both bar value + * and rotation. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize total value of data items on each day with a bar graph. + * This can be done by specifying row and column categories so that each bar represents a day, + * and setting multiMatchBehavior to QItemModelBarDataProxy::MMBCumulative. + */ +void QItemModelBarDataProxy::setMultiMatchBehavior(QItemModelBarDataProxy::MultiMatchBehavior behavior) +{ + if (dptr()->m_multiMatchBehavior != behavior) { + dptr()->m_multiMatchBehavior = behavior; + emit multiMatchBehaviorChanged(behavior); + } +} + +QItemModelBarDataProxy::MultiMatchBehavior QItemModelBarDataProxy::multiMatchBehavior() const +{ + return dptrc()->m_multiMatchBehavior; +} + /*! * \internal */ @@ -806,7 +862,8 @@ QItemModelBarDataProxyPrivate::QItemModelBarDataProxyPrivate(QItemModelBarDataPr m_itemModelHandler(new BarItemModelHandler(q)), m_useModelCategories(false), m_autoRowCategories(true), - m_autoColumnCategories(true) + m_autoColumnCategories(true), + m_multiMatchBehavior(QItemModelBarDataProxy::MMBLast) { } @@ -858,6 +915,8 @@ void QItemModelBarDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelBarDataProxy::rotationRoleReplaceChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelBarDataProxy::multiMatchBehaviorChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h index ad7be3a7..317befdc 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.h +++ b/src/datavisualization/data/qitemmodelbardataproxy.h @@ -30,6 +30,7 @@ class QItemModelBarDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy { Q_OBJECT + Q_ENUMS(MultiMatchBehavior) Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) @@ -48,8 +49,16 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy Q_PROPERTY(QString columnRoleReplace READ columnRoleReplace WRITE setColumnRoleReplace NOTIFY columnRoleReplaceChanged REVISION 1) Q_PROPERTY(QString valueRoleReplace READ valueRoleReplace WRITE setValueRoleReplace NOTIFY valueRoleReplaceChanged REVISION 1) Q_PROPERTY(QString rotationRoleReplace READ rotationRoleReplace WRITE setRotationRoleReplace NOTIFY rotationRoleReplaceChanged REVISION 1) + Q_PROPERTY(MultiMatchBehavior multiMatchBehavior READ multiMatchBehavior WRITE setMultiMatchBehavior NOTIFY multiMatchBehaviorChanged REVISION 1) public: + enum MultiMatchBehavior { + MMBFirst = 0, + MMBLast = 1, + MMBAverage = 2, + MMBCumulative = 3 + }; + explicit QItemModelBarDataProxy(QObject *parent = 0); QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &valueRole, @@ -120,6 +129,9 @@ public: void setRotationRoleReplace(const QString &replace); QString rotationRoleReplace() const; + void setMultiMatchBehavior(MultiMatchBehavior behavior); + MultiMatchBehavior multiMatchBehavior() const; + signals: void itemModelChanged(const QAbstractItemModel* itemModel); void rowRoleChanged(const QString &role); @@ -139,6 +151,7 @@ signals: Q_REVISION(1) void columnRoleReplaceChanged(const QString &replace); Q_REVISION(1) void valueRoleReplaceChanged(const QString &replace); Q_REVISION(1) void rotationRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void multiMatchBehaviorChanged(MultiMatchBehavior behavior); protected: QItemModelBarDataProxyPrivate *dptr(); diff --git a/src/datavisualization/data/qitemmodelbardataproxy_p.h b/src/datavisualization/data/qitemmodelbardataproxy_p.h index 3e8fa3ae..84564d02 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy_p.h +++ b/src/datavisualization/data/qitemmodelbardataproxy_p.h @@ -73,6 +73,8 @@ private: QString m_valueRoleReplace; QString m_rotationRoleReplace; + QItemModelBarDataProxy::MultiMatchBehavior m_multiMatchBehavior; + friend class BarItemModelHandler; friend class QItemModelBarDataProxy; }; diff --git a/tests/qmlmultitest/qml/qmlmultitest/Data.qml b/tests/qmlmultitest/qml/qmlmultitest/Data.qml index ddc0aad8..2ef168da 100644 --- a/tests/qmlmultitest/qml/qmlmultitest/Data.qml +++ b/tests/qmlmultitest/qml/qmlmultitest/Data.qml @@ -43,6 +43,27 @@ Item { ListElement{ coords: "1,4"; data: "21.3/14.6/5.83"; } ListElement{ coords: "2,4"; data: "22.5/14.8/7.32"; } ListElement{ coords: "3,4"; data: "23.7/14.3/6.90"; } + + ListElement{ coords: "0,0"; data: "40.0/30.0/14.75"; } + ListElement{ coords: "1,0"; data: "41.1/30.3/13.00"; } + ListElement{ coords: "2,0"; data: "42.5/30.7/11.24"; } + ListElement{ coords: "3,0"; data: "44.0/30.5/12.53"; } + ListElement{ coords: "0,1"; data: "40.2/31.2/13.55"; } + ListElement{ coords: "1,1"; data: "41.3/31.5/13.03"; } + ListElement{ coords: "2,1"; data: "42.6/31.7/13.46"; } + ListElement{ coords: "3,1"; data: "43.4/31.5/14.12"; } + ListElement{ coords: "0,2"; data: "40.2/32.3/13.37"; } + ListElement{ coords: "1,2"; data: "41.1/32.4/12.98"; } + ListElement{ coords: "2,2"; data: "42.5/32.1/13.33"; } + ListElement{ coords: "3,2"; data: "43.3/32.7/13.23"; } + ListElement{ coords: "0,3"; data: "40.7/33.3/15.34"; } + ListElement{ coords: "1,3"; data: "41.5/33.2/14.54"; } + ListElement{ coords: "2,3"; data: "42.4/33.6/14.65"; } + ListElement{ coords: "3,3"; data: "43.2/33.4/16.67"; } + ListElement{ coords: "0,4"; data: "40.6/35.0/16.01"; } + ListElement{ coords: "1,4"; data: "41.3/34.6/15.83"; } + ListElement{ coords: "2,4"; data: "42.5/34.8/17.32"; } + ListElement{ coords: "3,4"; data: "43.7/34.3/16.90"; } } } diff --git a/tests/qmlmultitest/qml/qmlmultitest/main.qml b/tests/qmlmultitest/qml/qmlmultitest/main.qml index 84eb4294..b5a62902 100644 --- a/tests/qmlmultitest/qml/qmlmultitest/main.qml +++ b/tests/qmlmultitest/qml/qmlmultitest/main.qml @@ -59,6 +59,7 @@ Rectangle { Surface3DSeries { itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel" ItemModelSurfaceDataProxy { + id: surfaceProxy itemModel: data.sharedData // The surface data points are not neatly lined up in rows and columns, // so we define explicit row and column roles. @@ -118,10 +119,11 @@ Rectangle { } NewButton { + id: mmbButton Layout.fillHeight: true Layout.fillWidth: true - text: "Toggle Mesh Styles" - onClicked: toggleMeshStyle() // call a helper function to keep button itself simpler + text: "MMB: Last" + onClicked: changeMMB() // call a helper function to keep button itself simpler } } } @@ -146,6 +148,7 @@ Rectangle { itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel" mesh: Abstract3DSeries.MeshCube ItemModelScatterDataProxy { + id: scatterProxy itemModel: data.sharedData // Mapping model roles to scatter series item coordinates. xPosRole: "data" @@ -187,17 +190,21 @@ Rectangle { name: "Population density" ItemModelBarDataProxy { + id: barProxy itemModel: data.sharedData // Mapping model roles to bar series rows, columns, and values. rowRole: "coords" columnRole: "coords" valueRole: "data" + rotationRole: "coords" rowRolePattern: /(\d),\d/ columnRolePattern: /(\d),(\d)/ valueRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/ + rotationRolePattern: /(\d)\,(\d)/ rowRoleReplace: "\\1" columnRoleReplace: "\\2" valueRoleReplace: "\\3" + rotationRoleReplace: "\\2\\1" } } } @@ -219,16 +226,19 @@ Rectangle { barGraph.scene.activeCamera.zoomLevel = 100.0 } - function toggleMeshStyle() { - if (barGraph.seriesList[0].meshSmooth === true) { - barGraph.seriesList[0].meshSmooth = false - if (surfaceGraph.seriesList[0].flatShadingSupported) - surfaceGraph.seriesList[0].flatShadingEnabled = true - scatterGraph.seriesList[0].meshSmooth = false + function changeMMB() { + if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBLast) { + barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBAverage + mmbButton.text = "MMB: Average" + } else if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBAverage) { + barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBCumulative + mmbButton.text = "MMB: Cumulative" + } else if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBCumulative) { + barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBFirst + mmbButton.text = "MMB: First" } else { - barGraph.seriesList[0].meshSmooth = true - surfaceGraph.seriesList[0].flatShadingEnabled = false - scatterGraph.seriesList[0].meshSmooth = true + barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBLast + mmbButton.text = "MMB: Last" } } } -- cgit v1.2.3 From a309eb6a29fcdd57f37aef424c30bc13f3fde9b7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 13 May 2014 15:02:46 +0300 Subject: Add bar combining to qmlbars example Change-Id: Ie2a566e2ceb4dabcd7a0e2a2f034a49add34f1b8 Reviewed-by: Mika Salmela --- .../datavisualization/qmlbars/doc/src/qmlbars.qdoc | 34 ++++- .../datavisualization/qmlbars/qml/qmlbars/Axes.qml | 17 +-- .../datavisualization/qmlbars/qml/qmlbars/Data.qml | 168 ++++++++++----------- .../datavisualization/qmlbars/qml/qmlbars/main.qml | 101 ++++++++----- 4 files changed, 181 insertions(+), 139 deletions(-) diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc index f2a0f8b0..4034cdd2 100644 --- a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc +++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc @@ -57,21 +57,33 @@ for those roles to extract the correct portion of the field contents for each role. The search pattern is a normal JavaScript regular expression and the replace rule specifies what the field content that matches the regular expression is replaced with. - In this case we want to replace the entire field content with just the year or the month. + In this case we want to replace the entire field content with just the year or the month, + which is the first captured substring for both rows and columns. For more information how the replace using regular expressions works, see QString::replace(const QRegExp &rx, const QString &after) function documentation. + The \c multiMatchBehavior property specifies what to do in case multiple item model items match + the same row/column combination. In this case we want to add their values together. + This property has no effect when we are showing values for each month, as there are no + duplicate months in our item model, but it becomes relevant later when we want to show + the yearly totals. + Then we add another series for the expenses: \snippet qmlbars/qml/qmlbars/main.qml 4 \dots + The model contains expenses as negative values, but we want to show them as positive bars, so + that we can easily compare them to income bars. We use \c valueRolePattern to remove the minus + sign to achieve this. No replacement string needs to be specified as the default replacement + is an empty string. + We use the \c visible property of the series to hide the second series for now. \section1 Custom axis labels One interesting tidbit about axes is that we redefine the category labels for column axis in - \c Axes.qml. This is done because the data contains abbreviated month names, which we don't want + \c Axes.qml. This is done because the data contains numbers for months, which we don't want to use for our column labels: \snippet qmlbars/qml/qmlbars/Axes.qml 0 @@ -85,15 +97,23 @@ \snippet qmlbars/qml/qmlbars/main.qml 0 - The axis change is done because income and expenses have a different label format. The same could have - been achieved using a single axis and just changing the label format. + The axis label format and item selection label formats are tweaked to get the negative sign + showing properly for expenses, which were actually resolved as positive values. - The second interesting block is where we filter some of the rows away from the visualized data: + The second interesting block is where we change the visualized data by adjusting the proxy + propertes: \snippet qmlbars/qml/qmlbars/main.qml 1 - The filtering is done by setting \c autoRowCategories to false on the ItemModelBarDataProxy item and defining - the row categories explicitly. This way, only the items in specified rows are visualized. + To show yearly totals, we need to combine the twelve months of each year into a single bar. + We achieve this by specifying a \c columnRolePattern that matches all model items. That way + the data proxy will only have a single column. The cumulative \c multiMatchBehavior we + specified earlier for the proxy becomes relevant now, causing the values of all twelve months + of each year to be added up into a single bar. + + To show just a subset of years, we set \c autoRowCategories to false on the + ItemModelBarDataProxy item and define the row categories explicitly. This way, only the items + in specified row categories are visualized. The third interesting block shows how to get the row and column index of an item if you know the row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex() and \c columnCategoryIndex(): diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml index 29979e1b..a8257995 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml @@ -21,8 +21,8 @@ import QtDataVisualization 1.0 Item { property alias column: columnAxis - property alias expenses: expensesAxis - property alias income: incomeAxis + property alias value: valueAxis + property alias total: totalAxis // For row labels we can use row labels from data proxy, so default axis // suffices for rows. @@ -35,18 +35,15 @@ Item { "July", "August", "September", "October", "November", "December"] } //! [0] + CategoryAxis3D { + id: totalAxis + labels: ["Yearly total"] + } ValueAxis3D { - id: incomeAxis + id: valueAxis min: 0 max: 35 labelFormat: "%.2f M\u20AC" title: "Monthly income" } - ValueAxis3D { - id: expensesAxis - min: 0 - max: 35 - labelFormat: "-%.2f M\u20AC" - title: "Monthly expenses" - } } diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml index 6922ef17..dcb89dbf 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml @@ -24,96 +24,96 @@ Item { //! [0] ListModel { id: dataModel - ListElement{ timestamp: "2006-01"; expenses: "4"; income: "5" } - ListElement{ timestamp: "2006-02"; expenses: "5"; income: "6" } - ListElement{ timestamp: "2006-03"; expenses: "7"; income: "4" } + ListElement{ timestamp: "2006-01"; expenses: "-4"; income: "5" } + ListElement{ timestamp: "2006-02"; expenses: "-5"; income: "6" } + ListElement{ timestamp: "2006-03"; expenses: "-7"; income: "4" } //! [0] - ListElement{ timestamp: "2006-04"; expenses: "3"; income: "2" } - ListElement{ timestamp: "2006-05"; expenses: "4"; income: "1" } - ListElement{ timestamp: "2006-06"; expenses: "2"; income: "2" } - ListElement{ timestamp: "2006-07"; expenses: "1"; income: "3" } - ListElement{ timestamp: "2006-08"; expenses: "5"; income: "1" } - ListElement{ timestamp: "2006-09"; expenses: "2"; income: "3" } - ListElement{ timestamp: "2006-10"; expenses: "5"; income: "2" } - ListElement{ timestamp: "2006-11"; expenses: "8"; income: "5" } - ListElement{ timestamp: "2006-12"; expenses: "3"; income: "3" } + ListElement{ timestamp: "2006-04"; expenses: "-3"; income: "2" } + ListElement{ timestamp: "2006-05"; expenses: "-4"; income: "1" } + ListElement{ timestamp: "2006-06"; expenses: "-2"; income: "2" } + ListElement{ timestamp: "2006-07"; expenses: "-1"; income: "3" } + ListElement{ timestamp: "2006-08"; expenses: "-5"; income: "1" } + ListElement{ timestamp: "2006-09"; expenses: "-2"; income: "3" } + ListElement{ timestamp: "2006-10"; expenses: "-5"; income: "2" } + ListElement{ timestamp: "2006-11"; expenses: "-8"; income: "5" } + ListElement{ timestamp: "2006-12"; expenses: "-3"; income: "3" } - ListElement{ timestamp: "2007-01"; expenses: "3"; income: "1" } - ListElement{ timestamp: "2007-02"; expenses: "4"; income: "2" } - ListElement{ timestamp: "2007-03"; expenses: "12"; income: "4" } - ListElement{ timestamp: "2007-04"; expenses: "13"; income: "6" } - ListElement{ timestamp: "2007-05"; expenses: "14"; income: "11" } - ListElement{ timestamp: "2007-06"; expenses: "7"; income: "7" } - ListElement{ timestamp: "2007-07"; expenses: "6"; income: "4" } - ListElement{ timestamp: "2007-08"; expenses: "4"; income: "15" } - ListElement{ timestamp: "2007-09"; expenses: "2"; income: "18" } - ListElement{ timestamp: "2007-10"; expenses: "29"; income: "25" } - ListElement{ timestamp: "2007-11"; expenses: "23"; income: "29" } - ListElement{ timestamp: "2007-12"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2007-01"; expenses: "-3"; income: "1" } + ListElement{ timestamp: "2007-02"; expenses: "-4"; income: "2" } + ListElement{ timestamp: "2007-03"; expenses: "-12"; income: "4" } + ListElement{ timestamp: "2007-04"; expenses: "-13"; income: "6" } + ListElement{ timestamp: "2007-05"; expenses: "-14"; income: "11" } + ListElement{ timestamp: "2007-06"; expenses: "-7"; income: "7" } + ListElement{ timestamp: "2007-07"; expenses: "-6"; income: "4" } + ListElement{ timestamp: "2007-08"; expenses: "-4"; income: "15" } + ListElement{ timestamp: "2007-09"; expenses: "-2"; income: "18" } + ListElement{ timestamp: "2007-10"; expenses: "-29"; income: "25" } + ListElement{ timestamp: "2007-11"; expenses: "-23"; income: "29" } + ListElement{ timestamp: "2007-12"; expenses: "-5"; income: "9" } - ListElement{ timestamp: "2008-01"; expenses: "3"; income: "8" } - ListElement{ timestamp: "2008-02"; expenses: "8"; income: "14" } - ListElement{ timestamp: "2008-03"; expenses: "10"; income: "20" } - ListElement{ timestamp: "2008-04"; expenses: "12"; income: "24" } - ListElement{ timestamp: "2008-05"; expenses: "10"; income: "19" } - ListElement{ timestamp: "2008-06"; expenses: "5"; income: "8" } - ListElement{ timestamp: "2008-07"; expenses: "1"; income: "4" } - ListElement{ timestamp: "2008-08"; expenses: "7"; income: "12" } - ListElement{ timestamp: "2008-09"; expenses: "4"; income: "16" } - ListElement{ timestamp: "2008-10"; expenses: "22"; income: "33" } - ListElement{ timestamp: "2008-11"; expenses: "16"; income: "25" } - ListElement{ timestamp: "2008-12"; expenses: "2"; income: "7" } + ListElement{ timestamp: "2008-01"; expenses: "-3"; income: "8" } + ListElement{ timestamp: "2008-02"; expenses: "-8"; income: "14" } + ListElement{ timestamp: "2008-03"; expenses: "-10"; income: "20" } + ListElement{ timestamp: "2008-04"; expenses: "-12"; income: "24" } + ListElement{ timestamp: "2008-05"; expenses: "-10"; income: "19" } + ListElement{ timestamp: "2008-06"; expenses: "-5"; income: "8" } + ListElement{ timestamp: "2008-07"; expenses: "-1"; income: "4" } + ListElement{ timestamp: "2008-08"; expenses: "-7"; income: "12" } + ListElement{ timestamp: "2008-09"; expenses: "-4"; income: "16" } + ListElement{ timestamp: "2008-10"; expenses: "-22"; income: "33" } + ListElement{ timestamp: "2008-11"; expenses: "-16"; income: "25" } + ListElement{ timestamp: "2008-12"; expenses: "-2"; income: "7" } - ListElement{ timestamp: "2009-01"; expenses: "4"; income: "5" } - ListElement{ timestamp: "2009-02"; expenses: "4"; income: "7" } - ListElement{ timestamp: "2009-03"; expenses: "11"; income: "14" } - ListElement{ timestamp: "2009-04"; expenses: "16"; income: "22" } - ListElement{ timestamp: "2009-05"; expenses: "3"; income: "5" } - ListElement{ timestamp: "2009-06"; expenses: "4"; income: "8" } - ListElement{ timestamp: "2009-07"; expenses: "7"; income: "9" } - ListElement{ timestamp: "2009-08"; expenses: "9"; income: "13" } - ListElement{ timestamp: "2009-09"; expenses: "1"; income: "6" } - ListElement{ timestamp: "2009-10"; expenses: "14"; income: "25" } - ListElement{ timestamp: "2009-11"; expenses: "19"; income: "29" } - ListElement{ timestamp: "2009-12"; expenses: "5"; income: "7" } + ListElement{ timestamp: "2009-01"; expenses: "-4"; income: "5" } + ListElement{ timestamp: "2009-02"; expenses: "-4"; income: "7" } + ListElement{ timestamp: "2009-03"; expenses: "-11"; income: "14" } + ListElement{ timestamp: "2009-04"; expenses: "-16"; income: "22" } + ListElement{ timestamp: "2009-05"; expenses: "-3"; income: "5" } + ListElement{ timestamp: "2009-06"; expenses: "-4"; income: "8" } + ListElement{ timestamp: "2009-07"; expenses: "-7"; income: "9" } + ListElement{ timestamp: "2009-08"; expenses: "-9"; income: "13" } + ListElement{ timestamp: "2009-09"; expenses: "-1"; income: "6" } + ListElement{ timestamp: "2009-10"; expenses: "-14"; income: "25" } + ListElement{ timestamp: "2009-11"; expenses: "-19"; income: "29" } + ListElement{ timestamp: "2009-12"; expenses: "-5"; income: "7" } - ListElement{ timestamp: "2010-01"; expenses: "14"; income: "22" } - ListElement{ timestamp: "2010-02"; expenses: "5"; income: "7" } - ListElement{ timestamp: "2010-03"; expenses: "1"; income: "9" } - ListElement{ timestamp: "2010-04"; expenses: "1"; income: "12" } - ListElement{ timestamp: "2010-05"; expenses: "5"; income: "9" } - ListElement{ timestamp: "2010-06"; expenses: "5"; income: "8" } - ListElement{ timestamp: "2010-07"; expenses: "3"; income: "7" } - ListElement{ timestamp: "2010-08"; expenses: "1"; income: "5" } - ListElement{ timestamp: "2010-09"; expenses: "2"; income: "4" } - ListElement{ timestamp: "2010-10"; expenses: "10"; income: "13" } - ListElement{ timestamp: "2010-11"; expenses: "12"; income: "17" } - ListElement{ timestamp: "2010-12"; expenses: "6"; income: "9" } + ListElement{ timestamp: "2010-01"; expenses: "-14"; income: "22" } + ListElement{ timestamp: "2010-02"; expenses: "-5"; income: "7" } + ListElement{ timestamp: "2010-03"; expenses: "-1"; income: "9" } + ListElement{ timestamp: "2010-04"; expenses: "-1"; income: "12" } + ListElement{ timestamp: "2010-05"; expenses: "-5"; income: "9" } + ListElement{ timestamp: "2010-06"; expenses: "-5"; income: "8" } + ListElement{ timestamp: "2010-07"; expenses: "-3"; income: "7" } + ListElement{ timestamp: "2010-08"; expenses: "-1"; income: "5" } + ListElement{ timestamp: "2010-09"; expenses: "-2"; income: "4" } + ListElement{ timestamp: "2010-10"; expenses: "-10"; income: "13" } + ListElement{ timestamp: "2010-11"; expenses: "-12"; income: "17" } + ListElement{ timestamp: "2010-12"; expenses: "-6"; income: "9" } - ListElement{ timestamp: "2011-01"; expenses: "2"; income: "6" } - ListElement{ timestamp: "2011-02"; expenses: "4"; income: "8" } - ListElement{ timestamp: "2011-03"; expenses: "7"; income: "12" } - ListElement{ timestamp: "2011-04"; expenses: "9"; income: "15" } - ListElement{ timestamp: "2011-05"; expenses: "7"; income: "19" } - ListElement{ timestamp: "2011-06"; expenses: "9"; income: "18" } - ListElement{ timestamp: "2011-07"; expenses: "13"; income: "17" } - ListElement{ timestamp: "2011-08"; expenses: "5"; income: "9" } - ListElement{ timestamp: "2011-09"; expenses: "3"; income: "8" } - ListElement{ timestamp: "2011-10"; expenses: "13"; income: "15" } - ListElement{ timestamp: "2011-11"; expenses: "8"; income: "17" } - ListElement{ timestamp: "2011-12"; expenses: "7"; income: "10" } + ListElement{ timestamp: "2011-01"; expenses: "-2"; income: "6" } + ListElement{ timestamp: "2011-02"; expenses: "-4"; income: "8" } + ListElement{ timestamp: "2011-03"; expenses: "-7"; income: "12" } + ListElement{ timestamp: "2011-04"; expenses: "-9"; income: "15" } + ListElement{ timestamp: "2011-05"; expenses: "-7"; income: "19" } + ListElement{ timestamp: "2011-06"; expenses: "-9"; income: "18" } + ListElement{ timestamp: "2011-07"; expenses: "-13"; income: "17" } + ListElement{ timestamp: "2011-08"; expenses: "-5"; income: "9" } + ListElement{ timestamp: "2011-09"; expenses: "-3"; income: "8" } + ListElement{ timestamp: "2011-10"; expenses: "-13"; income: "15" } + ListElement{ timestamp: "2011-11"; expenses: "-8"; income: "17" } + ListElement{ timestamp: "2011-12"; expenses: "-7"; income: "10" } - ListElement{ timestamp: "2012-01"; expenses: "12"; income: "16" } - ListElement{ timestamp: "2012-02"; expenses: "24"; income: "28" } - ListElement{ timestamp: "2012-03"; expenses: "27"; income: "22" } - ListElement{ timestamp: "2012-04"; expenses: "29"; income: "25" } - ListElement{ timestamp: "2012-05"; expenses: "27"; income: "29" } - ListElement{ timestamp: "2012-06"; expenses: "19"; income: "18" } - ListElement{ timestamp: "2012-07"; expenses: "13"; income: "17" } - ListElement{ timestamp: "2012-08"; expenses: "15"; income: "19" } - ListElement{ timestamp: "2012-09"; expenses: "3"; income: "8" } - ListElement{ timestamp: "2012-10"; expenses: "3"; income: "6" } - ListElement{ timestamp: "2012-11"; expenses: "4"; income: "8" } - ListElement{ timestamp: "2012-12"; expenses: "5"; income: "9" } + ListElement{ timestamp: "2012-01"; expenses: "-12"; income: "16" } + ListElement{ timestamp: "2012-02"; expenses: "-24"; income: "28" } + ListElement{ timestamp: "2012-03"; expenses: "-27"; income: "22" } + ListElement{ timestamp: "2012-04"; expenses: "-29"; income: "25" } + ListElement{ timestamp: "2012-05"; expenses: "-27"; income: "29" } + ListElement{ timestamp: "2012-06"; expenses: "-19"; income: "18" } + ListElement{ timestamp: "2012-07"; expenses: "-13"; income: "17" } + ListElement{ timestamp: "2012-08"; expenses: "-15"; income: "19" } + ListElement{ timestamp: "2012-09"; expenses: "-3"; income: "8" } + ListElement{ timestamp: "2012-10"; expenses: "-3"; income: "6" } + ListElement{ timestamp: "2012-11"; expenses: "-4"; income: "8" } + ListElement{ timestamp: "2012-12"; expenses: "-5"; income: "9" } } } diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml index 2bb5e376..cc15dd50 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml @@ -49,7 +49,11 @@ Rectangle { // Set tableView current row to selected bar var rowRole = series.dataProxy.rowLabels[position.x]; - var colRole = series.dataProxy.columnLabels[position.y]; + var colRole + if (barGraph.columnAxis === graphAxes.total) + colRole = "01"; + else + colRole = series.dataProxy.columnLabels[position.y]; var checkTimestamp = rowRole + "-" + colRole var currentRow = tableView.currentRow if (currentRow === -1 || checkTimestamp !== graphData.model.get(currentRow).timestamp) { @@ -99,63 +103,66 @@ Rectangle { barSpacingRelative: false scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh columnAxis: graphAxes.column - valueAxis: graphAxes.income + valueAxis: graphAxes.value - //! [3] + //! [4] Bar3DSeries { - id: barSeries - itemLabelFormat: "Income for @colLabel, @rowLabel: @valueLabel" - baseGradient: barGradient + id: secondarySeries + visible: false + itemLabelFormat: "Expenses, @colLabel, @rowLabel: -@valueLabel" + baseGradient: secondaryGradient ItemModelBarDataProxy { - id: modelProxy + id: secondaryProxy itemModel: graphData.model rowRole: "timestamp" columnRole: "timestamp" - valueRole: "income" + valueRole: "expenses" rowRolePattern: /^(\d\d\d\d).*$/ columnRolePattern: /^.*-(\d\d)$/ + valueRolePattern: /-/ rowRoleReplace: "\\1" columnRoleReplace: "\\1" + multiMatchBehavior: ItemModelBarDataProxy.MMBCumulative } - //! [3] + //! [4] ColorGradient { - id: barGradient - ColorGradientStop { position: 1.0; color: "#00FF00" } - ColorGradientStop { position: 0.0; color: "#006000" } + id: secondaryGradient + ColorGradientStop { position: 1.0; color: "#FF0000" } + ColorGradientStop { position: 0.0; color: "#600000" } } - onSelectedBarChanged: handleSelectionChange(barSeries, position) + onSelectedBarChanged: handleSelectionChange(secondarySeries, position) } - //! [4] + //! [3] Bar3DSeries { - id: secondarySeries - visible: false - itemLabelFormat: "Expenses for @colLabel, @rowLabel: @valueLabel" - baseGradient: secondaryGradient + id: barSeries + itemLabelFormat: "Income, @colLabel, @rowLabel: @valueLabel" + baseGradient: barGradient ItemModelBarDataProxy { - id: secondaryProxy + id: modelProxy itemModel: graphData.model rowRole: "timestamp" columnRole: "timestamp" - valueRole: "expenses" + valueRole: "income" rowRolePattern: /^(\d\d\d\d).*$/ columnRolePattern: /^.*-(\d\d)$/ rowRoleReplace: "\\1" columnRoleReplace: "\\1" + multiMatchBehavior: ItemModelBarDataProxy.MMBCumulative } - //! [4] + //! [3] ColorGradient { - id: secondaryGradient - ColorGradientStop { position: 1.0; color: "#FF0000" } - ColorGradientStop { position: 0.0; color: "#600000" } + id: barGradient + ColorGradientStop { position: 1.0; color: "#00FF00" } + ColorGradientStop { position: 0.0; color: "#006000" } } - onSelectedBarChanged: handleSelectionChange(secondarySeries, position) + onSelectedBarChanged: handleSelectionChange(barSeries, position) } } } @@ -184,7 +191,7 @@ Rectangle { var pattern = /(\d\d\d\d)-(\d\d)/ var matches = pattern.exec(styleData.value) var colIndex = parseInt(matches[2], 10) - 1 - text = matches[1] + " - " + barGraph.columnAxis.labels[colIndex] + text = matches[1] + " - " + graphAxes.column.labels[colIndex] } } @@ -199,7 +206,11 @@ Rectangle { var pattern = /(\d\d\d\d)-(\d\d)/ var matches = pattern.exec(timestamp) var rowIndex = modelProxy.rowCategoryIndex(matches[1]) - var colIndex = modelProxy.columnCategoryIndex(matches[2]) + var colIndex + if (barGraph.columnAxis === graphAxes.total) + colIndex = 0 // Just one column when showing yearly totals + else + colIndex = modelProxy.columnCategoryIndex(matches[2]) if (selectedSeries.visible) mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex) else if (barSeries.visible) @@ -215,25 +226,38 @@ Rectangle { spacing: 0 Button { - id: dataToggle + id: changeDataButton Layout.fillWidth: true Layout.fillHeight: true text: "Show 2010 - 2012" clip: true //! [1] onClicked: { - if (barGraph.rowAxis.max !== 6) { - text = "Show 2010 - 2012" + if (text === "Show yearly totals") { modelProxy.autoRowCategories = true secondaryProxy.autoRowCategories = true - } else { + modelProxy.columnRolePattern = /^.*$/ + secondaryProxy.columnRolePattern = /^.*$/ + graphAxes.value.autoAdjustRange = true + barGraph.columnAxis = graphAxes.total text = "Show all years" + } else if (text === "Show all years") { + modelProxy.autoRowCategories = true + secondaryProxy.autoRowCategories = true + modelProxy.columnRolePattern = /^.*-(\d\d)$/ + secondaryProxy.columnRolePattern = /^.*-(\d\d)$/ + graphAxes.value.min = 0 + graphAxes.value.max = 35 + barGraph.columnAxis = graphAxes.column + text = "Show 2010 - 2012" + } else { // text === "Show 2010 - 2012" // Explicitly defining row categories, since we do not want to show data for // all years in the model, just for the selected ones. modelProxy.autoRowCategories = false secondaryProxy.autoRowCategories = false modelProxy.rowCategories = ["2010", "2011", "2012"] secondaryProxy.rowCategories = ["2010", "2011", "2012"] + text = "Show yearly totals" } } //! [1] @@ -265,19 +289,20 @@ Rectangle { clip: true //! [0] onClicked: { - if (!secondarySeries.visible) { - text = "Show Both" - barGraph.valueAxis = graphAxes.expenses + if (text === "Show Expenses") { barSeries.visible = false secondarySeries.visible = true - } else if (!barSeries.visible){ + barGraph.valueAxis.labelFormat = "-%.2f M\u20AC" + secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: @valueLabel" + text = "Show Both" + } else if (text === "Show Both") { barSeries.visible = true + barGraph.valueAxis.labelFormat = "%.2f M\u20AC" + secondarySeries.itemLabelFormat = "Expenses, @colLabel, @rowLabel: -@valueLabel" text = "Show Income" - barGraph.valueAxis = graphAxes.income - } else { + } else { // text === "Show Income" secondarySeries.visible = false text = "Show Expenses" - barGraph.valueAxis = graphAxes.income } } //! [0] -- cgit v1.2.3 From c5e993ad507cc0d56d0e2a62076584d020086ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 07:33:23 +0300 Subject: Use blending for custom items only when needed Task-number: QTRD-3077 Change-Id: I2406a8fd133943379a5cb1c1c2961a419ef9315f Reviewed-by: Titta Heikkala Reviewed-by: Miikka Heikkinen --- .../datavisualization/customitems/customitemgraph.cpp | 6 +++--- src/datavisualization/data/customrenderitem_p.h | 3 +++ src/datavisualization/data/qcustom3ditem.cpp | 5 +++-- src/datavisualization/engine/abstract3drenderer.cpp | 19 ++++++++++++++----- src/datavisualization/engine/bars3drenderer.cpp | 9 +++++---- src/datavisualization/engine/scatter3drenderer.cpp | 8 ++++---- src/datavisualization/engine/surface3drenderer.cpp | 8 ++++---- 7 files changed, 36 insertions(+), 22 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index e0344232..14117580 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -105,7 +105,7 @@ void CustomItemGraph::toggleItemOne(bool show) //! [1] if (show) { //! [0] - QImage color = QImage(2, 2, QImage::Format_ARGB32); + QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::red); //! [0] //! [2] @@ -128,7 +128,7 @@ void CustomItemGraph::toggleItemTwo(bool show) { QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f); if (show) { - QImage color = QImage(2, 2, QImage::Format_ARGB32); + QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::red); QCustom3DItem *item = new QCustom3DItem(); item->setMeshFile(":/items/oilrig.obj"); @@ -146,7 +146,7 @@ void CustomItemGraph::toggleItemThree(bool show) { QVector3D positionThree = QVector3D(34.5f, 86.0f, 19.1f); if (show) { - QImage color = QImage(2, 2, QImage::Format_ARGB32); + QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::darkMagenta); QCustom3DItem *item = new QCustom3DItem(); item->setMeshFile(":/items/refinery.obj"); diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 9b6dd167..0632f53e 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -47,11 +47,14 @@ public: inline ObjectHelper *mesh() { return m_object; } inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } inline QVector3D scaling() { return m_scaling; } + inline void setBlendNeeded(bool blend) { m_needBlend = blend; } + inline bool isBlendNeeded() { return m_needBlend; } private: GLuint m_texture; QVector3D m_scaling; ObjectHelper *m_object; + bool m_needBlend; }; typedef QVector CustomRenderItemArray; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 69da30bf..70795fdf 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -92,6 +92,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION QCustom3DItem::QCustom3DItem(QObject *parent) : d_ptr(new QCustom3DItemPrivate(this, parent)) { + setTextureImage(QImage()); } /*! @@ -203,7 +204,7 @@ void QCustom3DItem::setTextureImage(const QImage &textureImage) { if (textureImage.isNull()) { // Make a solid gray texture - d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); d_ptr->m_textureImage.fill(Qt::gray); } else { d_ptr->m_textureImage = textureImage; @@ -227,7 +228,7 @@ void QCustom3DItem::setTextureFile(const QString &textureFile) if (!textureFile.isEmpty()) { d_ptr->m_textureImage = QImage(textureFile); } else { - d_ptr->m_textureImage = QImage(2, 2, QImage::Format_ARGB32); + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); d_ptr->m_textureImage.fill(Qt::gray); } emit textureFileChanged(textureFile); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bff24bc7..6fde5f20 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -542,10 +542,11 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); - GLuint texture = m_textureHelper->create2DTexture(item->d_ptr->textureImage(), - true, true, true); + QImage textureImage = item->d_ptr->textureImage(); + newItem->setBlendNeeded(textureImage.hasAlphaChannel()); + GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized + // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); @@ -574,8 +575,6 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, shader->setUniformValue(shader->view(), viewMatrix); glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } // Draw custom items @@ -597,6 +596,15 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, shader->setUniformValue(shader->MVP(), MVPMatrix); shader->setUniformValue(shader->nModel(), itModelMatrix.inverted().transposed()); + if (item->isBlendNeeded()) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_CULL_FACE); + } else { + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); + } + #if !defined(QT_OPENGL_ES_2) if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { // Set shadow shader bindings @@ -632,6 +640,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, if (RenderingNormal == state) { glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); } } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 015f76d5..661c3f3e 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1474,10 +1474,6 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) // Reset culling glCullFace(GL_BACK); - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); @@ -1800,6 +1796,11 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } } } + + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix, rowScaleFactor, columnScaleFactor); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9e8712e3..b71cd22b 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -806,10 +806,6 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } #endif - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); @@ -1280,6 +1276,10 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } } + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); // Handle selection clearing and selection label drawing diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f405212f..a75cf699 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1361,10 +1361,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, - projectionViewMatrix, depthProjectionViewMatrix, - m_depthTexture, m_shadowQualityToShader); - // Bind background shader m_backgroundShader->bind(); glCullFace(GL_BACK); @@ -1770,6 +1766,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } + Abstract3DRenderer::drawCustomItems(RenderingNormal, m_customItemShader, viewMatrix, + projectionViewMatrix, depthProjectionViewMatrix, + m_depthTexture, m_shadowQualityToShader); + drawLabels(false, activeCamera, viewMatrix, projectionMatrix); // Release shader -- cgit v1.2.3 From 5f9be2bd06a3f0f8286325ad1eb323aa692126eb Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 14 May 2014 09:06:06 +0300 Subject: Multi-match behavior implementation for surface item model proxy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3074 Change-Id: I2dc67f0c524bce87498129bbc462bd8f014b8d2c Reviewed-by: Tomi Korpipää --- src/datavisualization/axis/qabstract3daxis.cpp | 3 +- src/datavisualization/data/baritemmodelhandler.cpp | 1 - src/datavisualization/data/qabstract3dseries.cpp | 2 +- src/datavisualization/data/qabstractdataproxy.cpp | 2 +- .../data/qitemmodelbardataproxy.cpp | 2 + .../data/qitemmodelsurfacedataproxy.cpp | 62 +++++++++++++++++++++- .../data/qitemmodelsurfacedataproxy.h | 13 +++++ .../data/qitemmodelsurfacedataproxy_p.h | 2 + src/datavisualization/data/qsurface3dseries.cpp | 2 +- .../data/surfaceitemmodelhandler.cpp | 38 +++++++++++-- ...tdatavisualization-qml-abstractdeclarative.qdoc | 2 +- src/datavisualization/engine/q3dcamera.cpp | 2 +- .../input/qabstract3dinputhandler.cpp | 2 +- src/datavisualization/theme/q3dtheme.cpp | 2 +- tests/qmlmultitest/qml/qmlmultitest/main.qml | 4 ++ 15 files changed, 126 insertions(+), 13 deletions(-) diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index 94ff4283..ef4959d4 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -42,7 +42,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * This type is uncreatable, but contains properties that are exposed via subtypes. * - * For AbstractAxis3D enums, see \l QAbstract3DAxis::AxisOrientation and \l QAbstract3DAxis::AxisType + * For AbstractAxis3D enums, see \l QAbstract3DAxis::AxisOrientation and + * \l{QAbstract3DAxis::AxisType}. */ /*! diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index 3d1ce82f..a899ef39 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "baritemmodelhandler_p.h" -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 827f2e7f..9119b61d 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * This type is uncreatable, but contains properties that are exposed via subtypes. * - * For Abstract3DSeries enums, see \l QAbstract3DSeries::SeriesType and \l QAbstract3DSeries::Mesh + * For Abstract3DSeries enums, see \l QAbstract3DSeries::SeriesType and \l{QAbstract3DSeries::Mesh}. * * \sa Bar3DSeries, Scatter3DSeries, Surface3DSeries, {Qt Data Visualization Data Handling} */ diff --git a/src/datavisualization/data/qabstractdataproxy.cpp b/src/datavisualization/data/qabstractdataproxy.cpp index 18d88971..5b05dd14 100644 --- a/src/datavisualization/data/qabstractdataproxy.cpp +++ b/src/datavisualization/data/qabstractdataproxy.cpp @@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * This type is uncreatable, but contains properties that are exposed via subtypes. * - * For AbstractDataProxy enums, see \l QAbstractDataProxy::DataType + * For AbstractDataProxy enums, see \l{QAbstractDataProxy::DataType}. * * \sa BarDataProxy, ScatterDataProxy, SurfaceDataProxy, {Qt Data Visualization Data Handling} */ diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index ba98ced1..f87deb20 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -87,6 +87,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Data is resolved asynchronously whenever the mapping or the model changes. * QBarDataProxy::arrayReset() is emitted when the data has been resolved. * + * For ItemModelBarDataProxy enums, see \l{QItemModelBarDataProxy::MultiMatchBehavior}. + * * For more details, see QItemModelBarDataProxy documentation. * * Usage example: diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 94f36ec7..6ed1ec07 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -93,6 +93,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Data is resolved asynchronously whenever the mapping or the model changes. * QSurfaceDataProxy::arrayReset() is emitted when the data has been resolved. * + * For ItemModelSurfaceDataProxy enums, see \l{QItemModelSurfaceDataProxy::MultiMatchBehavior}. + * * For more details, see QItemModelSurfaceDataProxy documentation. * * Usage example: @@ -280,6 +282,36 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \sa zPosRole, zPosRolePattern */ +/*! + * \qmlproperty ItemModelSurfaceDataProxy.MultiMatchBehavior ItemModelSurfaceDataProxy::multiMatchBehavior + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to ItemModelSurfaceDataProxy.MMBLast. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize an average position of data items on each hour with a surface graph. + * This can be done by specifying row and column categories so that each surface point represents + * an hour, and setting multiMatchBehavior to ItemModelSurfaceDataProxy.MMBAverage. + */ + +/*! + * \enum QItemModelSurfaceDataProxy::MultiMatchBehavior + * + * Behavior types for QItemModelSurfaceDataProxy::multiMatchBehavior property. + * + * \value MMBFirst + * The position values are taken from the first item in the item model that matches + * each row/column combination. + * \value MMBLast + * The position values are taken from the last item in the item model that matches + * each row/column combination. + * \value MMBAverage + * The position values from all items matching each row/column combination are + * averaged together and the averages are used as the surface point position. + * \value MMBCumulativeY + * For X and Z values this acts just like \c{MMBAverage}, but Y values are added together + * instead of averaged and the total is used as the surface point Y position. + */ + /*! * Constructs QItemModelSurfaceDataProxy with optional \a parent. */ @@ -911,6 +943,31 @@ QString QItemModelSurfaceDataProxy::zPosRoleReplace() const return dptrc()->m_zPosRoleReplace; } +/*! + * \property QItemModelSurfaceDataProxy::multiMatchBehavior + * + * This property defines how multiple matches for each row/column combination are handled. + * Defaults to QItemModelSurfaceDataProxy::MMBLast. + * + * For example, you might have an item model with timestamped data taken at irregular intervals + * and you want to visualize an average position of data items on each hour with a surface graph. + * This can be done by specifying row and column categories so that each surface point represents + * an hour, and setting multiMatchBehavior to QItemModelSurfaceDataProxy::MMBAverage. + */ + +void QItemModelSurfaceDataProxy::setMultiMatchBehavior(QItemModelSurfaceDataProxy::MultiMatchBehavior behavior) +{ + if (dptr()->m_multiMatchBehavior != behavior) { + dptr()->m_multiMatchBehavior = behavior; + emit multiMatchBehaviorChanged(behavior); + } +} + +QItemModelSurfaceDataProxy::MultiMatchBehavior QItemModelSurfaceDataProxy::multiMatchBehavior() const +{ + return dptrc()->m_multiMatchBehavior; +} + /*! * \internal */ @@ -934,7 +991,8 @@ QItemModelSurfaceDataProxyPrivate::QItemModelSurfaceDataProxyPrivate(QItemModelS m_itemModelHandler(new SurfaceItemModelHandler(q)), m_useModelCategories(false), m_autoRowCategories(true), - m_autoColumnCategories(true) + m_autoColumnCategories(true), + m_multiMatchBehavior(QItemModelSurfaceDataProxy::MMBLast) { } @@ -992,6 +1050,8 @@ void QItemModelSurfaceDataProxyPrivate::connectItemModelHandler() m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); QObject::connect(qptr(), &QItemModelSurfaceDataProxy::zPosRoleReplaceChanged, m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); + QObject::connect(qptr(), &QItemModelSurfaceDataProxy::multiMatchBehaviorChanged, + m_itemModelHandler, &AbstractItemModelHandler::handleMappingChanged); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.h b/src/datavisualization/data/qitemmodelsurfacedataproxy.h index 8fe736f5..27ce9ea5 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.h @@ -31,6 +31,7 @@ class QItemModelSurfaceDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDataProxy { Q_OBJECT + Q_ENUMS(MultiMatchBehavior) Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) @@ -52,8 +53,16 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDa Q_PROPERTY(QString xPosRoleReplace READ xPosRoleReplace WRITE setXPosRoleReplace NOTIFY xPosRoleReplaceChanged REVISION 1) Q_PROPERTY(QString yPosRoleReplace READ yPosRoleReplace WRITE setYPosRoleReplace NOTIFY yPosRoleReplaceChanged REVISION 1) Q_PROPERTY(QString zPosRoleReplace READ zPosRoleReplace WRITE setZPosRoleReplace NOTIFY zPosRoleReplaceChanged REVISION 1) + Q_PROPERTY(MultiMatchBehavior multiMatchBehavior READ multiMatchBehavior WRITE setMultiMatchBehavior NOTIFY multiMatchBehaviorChanged REVISION 1) public: + enum MultiMatchBehavior { + MMBFirst = 0, + MMBLast = 1, + MMBAverage = 2, + MMBCumulativeY = 3 + }; + explicit QItemModelSurfaceDataProxy(QObject *parent = 0); QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &yPosRole, @@ -132,6 +141,9 @@ public: void setZPosRoleReplace(const QString &replace); QString zPosRoleReplace() const; + void setMultiMatchBehavior(MultiMatchBehavior behavior); + MultiMatchBehavior multiMatchBehavior() const; + signals: void itemModelChanged(const QAbstractItemModel* itemModel); void rowRoleChanged(const QString &role); @@ -154,6 +166,7 @@ signals: Q_REVISION(1) void xPosRoleReplaceChanged(const QString &replace); Q_REVISION(1) void yPosRoleReplaceChanged(const QString &replace); Q_REVISION(1) void zPosRoleReplaceChanged(const QString &replace); + Q_REVISION(1) void multiMatchBehaviorChanged(MultiMatchBehavior behavior); protected: QItemModelSurfaceDataProxyPrivate *dptr(); diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h index 06bfe2a1..9a79dca2 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy_p.h @@ -76,6 +76,8 @@ private: QString m_yPosRoleReplace; QString m_zPosRoleReplace; + QItemModelSurfaceDataProxy::MultiMatchBehavior m_multiMatchBehavior; + friend class SurfaceItemModelHandler; friend class QItemModelSurfaceDataProxy; }; diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index 60e84f38..6ee17ab8 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -75,7 +75,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * This type manages the series specific visual elements, as well as series data * (via data proxy). * - * For Surface3DSeries enums, see \l QSurface3DSeries::DrawFlag + * For Surface3DSeries enums, see \l{QSurface3DSeries::DrawFlag}. * * For more complete description, see QSurface3DSeries. * diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index fad02464..e3d50a80 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -212,6 +212,14 @@ void SurfaceItemModelHandler::resolveModel() QHash rowListHash; QHash columnListHash; + bool cumulative = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBAverage + || m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBCumulativeY; + bool average = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBAverage; + bool takeFirst = m_proxy->multiMatchBehavior() == QItemModelSurfaceDataProxy::MMBFirst; + QHash > *matchCountMap = 0; + if (cumulative) + matchCountMap = new QHash >; + // Sort values into rows and columns typedef QHash ColumnValueMap; QHash itemValueMap; @@ -244,7 +252,20 @@ void SurfaceItemModelHandler::resolveModel() zPos = zValueVar.toFloat(); QVector3D itemPos(xPos, yPos, zPos); - itemValueMap[rowRoleStr][columnRoleStr] = itemPos; + + if (cumulative) + (*matchCountMap)[rowRoleStr][columnRoleStr]++; + + if (cumulative) { + itemValueMap[rowRoleStr][columnRoleStr] += itemPos; + } else { + if (takeFirst && itemValueMap.contains(rowRoleStr)) { + if (itemValueMap.value(rowRoleStr).contains(columnRoleStr)) + continue; // We already have a value for this row/column combo + } + itemValueMap[rowRoleStr][columnRoleStr] = itemPos; + } + if (generateRows && !rowListHash.value(rowRoleStr, false)) { rowListHash.insert(rowRoleStr, true); rowList << rowRoleStr; @@ -278,8 +299,19 @@ void SurfaceItemModelHandler::resolveModel() for (int i = 0; i < rowList.size(); i++) { QString rowKey = rowList.at(i); QSurfaceDataRow &newProxyRow = *m_proxyArray->at(i); - for (int j = 0; j < columnList.size(); j++) - newProxyRow[j].setPosition(itemValueMap[rowKey][columnList.at(j)]); + for (int j = 0; j < columnList.size(); j++) { + QVector3D &itemPos = itemValueMap[rowKey][columnList.at(j)]; + if (cumulative) { + if (average) { + itemPos /= float((*matchCountMap)[rowKey][columnList.at(j)]); + } else { // cumulativeY + float divisor = float((*matchCountMap)[rowKey][columnList.at(j)]); + itemPos.setX(itemPos.x() / divisor); + itemPos.setZ(itemPos.z() / divisor); + } + } + newProxyRow[j].setPosition(itemPos); + } } } diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 02e4ff4f..32210b98 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -29,7 +29,7 @@ the 3D visualizations. For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag, - \l QAbstract3DGraph::ShadowQuality, and \l QAbstract3DGraph::ElementType + \l QAbstract3DGraph::ShadowQuality, and \l{QAbstract3DGraph::ElementType}. \sa Bars3D, Scatter3D, Surface3D, {Qt Data Visualization C++ Classes} */ diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp index 50f2e319..1a23569d 100644 --- a/src/datavisualization/engine/q3dcamera.cpp +++ b/src/datavisualization/engine/q3dcamera.cpp @@ -85,7 +85,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * data visualization. The type offers simple methods for rotating the camera around the origin * and setting zoom level. * - * For Camera3D enums, see \l Q3DCamera::CameraPreset + * For Camera3D enums, see \l{Q3DCamera::CameraPreset}. */ /*! diff --git a/src/datavisualization/input/qabstract3dinputhandler.cpp b/src/datavisualization/input/qabstract3dinputhandler.cpp index 9e1e314c..55a7d3ea 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.cpp +++ b/src/datavisualization/input/qabstract3dinputhandler.cpp @@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * This type is uncreatable. * - * For AbstractInputHandler3D enums, see \l QAbstract3DInputHandler::InputView + * For AbstractInputHandler3D enums, see \l{QAbstract3DInputHandler::InputView}. */ /*! diff --git a/src/datavisualization/theme/q3dtheme.cpp b/src/datavisualization/theme/q3dtheme.cpp index 83da96f8..e86f439e 100644 --- a/src/datavisualization/theme/q3dtheme.cpp +++ b/src/datavisualization/theme/q3dtheme.cpp @@ -236,7 +236,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * \snippet doc_src_q3dtheme.cpp 6 * - * For Theme3D enums, see \l Q3DTheme::ColorStyle and \l Q3DTheme::Theme + * For Theme3D enums, see \l Q3DTheme::ColorStyle and \l{Q3DTheme::Theme}. */ /*! diff --git a/tests/qmlmultitest/qml/qmlmultitest/main.qml b/tests/qmlmultitest/qml/qmlmultitest/main.qml index b5a62902..e71b30de 100644 --- a/tests/qmlmultitest/qml/qmlmultitest/main.qml +++ b/tests/qmlmultitest/qml/qmlmultitest/main.qml @@ -229,15 +229,19 @@ Rectangle { function changeMMB() { if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBLast) { barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBAverage + surfaceProxy.multiMatchBehavior = ItemModelSurfaceDataProxy.MMBAverage mmbButton.text = "MMB: Average" } else if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBAverage) { barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBCumulative + surfaceProxy.multiMatchBehavior = ItemModelSurfaceDataProxy.MMBCumulativeY mmbButton.text = "MMB: Cumulative" } else if (barProxy.multiMatchBehavior === ItemModelBarDataProxy.MMBCumulative) { barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBFirst + surfaceProxy.multiMatchBehavior = ItemModelSurfaceDataProxy.MMBFirst mmbButton.text = "MMB: First" } else { barProxy.multiMatchBehavior = ItemModelBarDataProxy.MMBLast + surfaceProxy.multiMatchBehavior = ItemModelSurfaceDataProxy.MMBLast mmbButton.text = "MMB: Last" } } -- cgit v1.2.3 From 824cf363f6ab999d2fc38ebdab1f7faae5559ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 11:19:28 +0300 Subject: Added option to use orthographic projection Task-number: QTRD-3078 Change-Id: I07ebc2b7edd542cd28e405dfc80282f18b7a7314 Reviewed-by: Mika Salmela Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 16 +++++++++--- .../engine/abstract3dcontroller.cpp | 30 ++++++++++++++++++++++ .../engine/abstract3dcontroller_p.h | 10 +++++++- .../engine/abstract3drenderer.cpp | 3 ++- .../engine/abstract3drenderer_p.h | 2 ++ src/datavisualization/engine/bars3drenderer.cpp | 21 ++++++++++++--- src/datavisualization/engine/qabstract3dgraph.cpp | 24 +++++++++++++++-- src/datavisualization/engine/qabstract3dgraph.h | 5 ++++ src/datavisualization/engine/scatter3drenderer.cpp | 9 ++++++- src/datavisualization/engine/selectionpointer.cpp | 15 +++++++---- src/datavisualization/engine/selectionpointer_p.h | 2 +- src/datavisualization/engine/surface3drenderer.cpp | 14 +++++++--- src/datavisualizationqml2/abstractdeclarative.cpp | 13 ++++++++++ src/datavisualizationqml2/abstractdeclarative_p.h | 5 ++++ 14 files changed, 148 insertions(+), 21 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 32210b98..62e4034f 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -57,7 +57,7 @@ /*! \qmlproperty AbstractInputHandler3D AbstractGraph3D::inputHandler - Input handler. You can disable default input handlers by setting this property to \c null. + Input handler. You can disable default input handlers by setting this property to \c {null}. */ /*! @@ -119,7 +119,7 @@ When renderingMode is \c RenderDirectToBackground or \c RenderDirectToBackground_NoClear, this property value is read-only and returns the number of samples specified by the window surface format. - Defaults to 4. + Defaults to \c{4}. \sa renderingMode */ @@ -128,8 +128,8 @@ * \qmlproperty bool AbstractGraph3D::measureFps * \since QtDataVisualization 1.1 * - * If \c true, the rendering is done continuously instead of on demand, and currentFps property - * is updated. Defaults to false. + * If \c {true}, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to \c{false}. * * \sa currentFps */ @@ -241,3 +241,11 @@ * * \since Qt Data Visualization 1.1 */ + +/*! + * \qmlproperty bool QAbstract3DGraph::orthoProjection + * \since Qt Data Visualization 1.1 + * + * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. + * \note Shadows will be disabled when set to \c{true}. + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 7c30f1c0..6b6f154d 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -43,6 +43,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_themeManager(new ThemeManager(this)), m_selectionMode(QAbstract3DGraph::SelectionItem), m_shadowQuality(QAbstract3DGraph::ShadowQualityMedium), + m_useOrthoProjection(false), m_scene(scene), m_activeInputHandler(0), m_axisX(0), @@ -189,6 +190,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.selectionModeChanged = false; } + if (m_changeTracker.projectionChanged) { + m_renderer->m_useOrthoProjection = m_useOrthoProjection; + m_changeTracker.projectionChanged = false; + } + if (m_changeTracker.axisXFormatterChanged) { m_changeTracker.axisXFormatterChanged = false; if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { @@ -794,6 +800,12 @@ QAbstract3DGraph::SelectionFlags Abstract3DController::selectionMode() const } void Abstract3DController::setShadowQuality(QAbstract3DGraph::ShadowQuality quality) +{ + if (!m_useOrthoProjection) + doSetShadowQuality(quality); +} + +void Abstract3DController::doSetShadowQuality(QAbstract3DGraph::ShadowQuality quality) { if (quality != m_shadowQuality) { m_shadowQuality = quality; @@ -1313,4 +1325,22 @@ QCustom3DItem *Abstract3DController::selectedCustomItem() const return item; } +void Abstract3DController::setOrthoProjection(bool enable) +{ + if (enable != m_useOrthoProjection) { + m_useOrthoProjection = enable; + m_changeTracker.projectionChanged = true; + emit orthoProjectionChanged(m_useOrthoProjection); + // If changed to ortho, disable shadows + if (m_useOrthoProjection) + doSetShadowQuality(QAbstract3DGraph::ShadowQualityNone); + emitNeedRender(); + } +} + +bool Abstract3DController::isOrthoProjection() const +{ + return m_useOrthoProjection; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 62b647a6..41c75d8e 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -82,6 +82,7 @@ struct Abstract3DChangeBitField { bool axisXFormatterChanged : 1; bool axisYFormatterChanged : 1; bool axisZFormatterChanged : 1; + bool projectionChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -115,7 +116,8 @@ struct Abstract3DChangeBitField { axisZReversedChanged(true), axisXFormatterChanged(true), axisYFormatterChanged(true), - axisZFormatterChanged(true) + axisZFormatterChanged(true), + projectionChanged(true) { } }; @@ -148,6 +150,7 @@ private: ThemeManager *m_themeManager; QAbstract3DGraph::SelectionFlags m_selectionMode; QAbstract3DGraph::ShadowQuality m_shadowQuality; + bool m_useOrthoProjection; protected: Q3DScene *m_scene; @@ -223,6 +226,7 @@ public: virtual QAbstract3DGraph::SelectionFlags selectionMode() const; virtual void setShadowQuality(QAbstract3DGraph::ShadowQuality quality); + virtual void doSetShadowQuality(QAbstract3DGraph::ShadowQuality quality); virtual QAbstract3DGraph::ShadowQuality shadowQuality() const; virtual bool shadowsSupported() const; @@ -246,6 +250,9 @@ public: int selectedCustomItemIndex() const; QCustom3DItem *selectedCustomItem() const; + void setOrthoProjection(bool enable); + bool isOrthoProjection() const; + void emitNeedRender(); virtual void clearSelection() = 0; @@ -315,6 +322,7 @@ signals: void elementSelected(QAbstract3DGraph::ElementType type); void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); + void orthoProjectionChanged(bool enabled); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6fde5f20..bcf03ed7 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -51,7 +51,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0), m_visibleSeriesCount(0), - m_customItemShader(0) + m_customItemShader(0), + m_useOrthoProjection(false) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 58173a61..5063f506 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -189,6 +189,8 @@ protected: ShaderHelper *m_customItemShader; + bool m_useOrthoProjection; + private: friend class Abstract3DController; }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 661c3f3e..459f8c25 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -445,8 +445,16 @@ void Bars3DRenderer::drawSlicedScene() // Set up projection matrix QMatrix4x4 projectionMatrix; - projectionMatrix.perspective(35.0f, (GLfloat)m_secondarySubViewport.width() - / (GLfloat)m_secondarySubViewport.height(), 0.1f, 100.0f); + GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() + / (GLfloat)m_primarySubViewport.height(); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f / m_autoScaleAdjustment; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(35.0f, viewPortRatio, 0.1f, 100.0f); + } // Set view matrix QMatrix4x4 viewMatrix; @@ -923,7 +931,14 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 projectionMatrix; GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() / (GLfloat)m_primarySubViewport.height(); - projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } // Get the view matrix QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 48d8494e..b3a788cb 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -512,8 +512,8 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * \property QAbstract3DGraph::measureFps * \since Qt Data Visualization 1.1 * - * If \c true, the rendering is done continuously instead of on demand, and currentFps property - * is updated. Defaults to false. + * If \c {true}, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to \c{false}. * * \sa currentFps */ @@ -541,6 +541,23 @@ qreal QAbstract3DGraph::currentFps() const return d_ptr->m_visualController->currentFps(); } +/*! + * \property QAbstract3DGraph::orthoProjection + * \since Qt Data Visualization 1.1 + * + * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. + * \note Shadows will be disabled when set to \c{true}. + */ +void QAbstract3DGraph::setOrthoProjection(bool enable) +{ + d_ptr->m_visualController->setOrthoProjection(enable); +} + +bool QAbstract3DGraph::isOrthoProjection() const +{ + return d_ptr->m_visualController->isOrthoProjection(); +} + /*! * \internal */ @@ -683,6 +700,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::measureFpsChanged); QObject::connect(m_visualController, &Abstract3DController::currentFpsChanged, q_ptr, &QAbstract3DGraph::currentFpsChanged); + + QObject::connect(m_visualController, &Abstract3DController::orthoProjectionChanged, q_ptr, + &QAbstract3DGraph::orthoProjectionChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index aeccf667..bfc03cc1 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -44,6 +44,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(Q3DScene* scene READ scene) Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged) Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) + Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -126,6 +127,9 @@ public: bool measureFps() const; qreal currentFps() const; + void setOrthoProjection(bool enable); + bool isOrthoProjection() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -146,6 +150,7 @@ signals: void elementSelected(QAbstract3DGraph::ElementType type); void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); + void orthoProjectionChanged(bool enabled); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index b71cd22b..70fb7ed2 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -329,7 +329,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 projectionMatrix; GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() / (GLfloat)m_primarySubViewport.height(); - projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } // Calculate view matrix QMatrix4x4 viewMatrix = activeCamera->d_ptr->viewMatrix(); diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp index e3708095..646212f0 100644 --- a/src/datavisualization/engine/selectionpointer.cpp +++ b/src/datavisualization/engine/selectionpointer.cpp @@ -74,7 +74,7 @@ void SelectionPointer::updateScene(Q3DScene *scene) m_cachedScene = scene; } -void SelectionPointer::render(GLuint defaultFboHandle) +void SelectionPointer::render(GLuint defaultFboHandle, bool useOrtho) { Q_UNUSED(defaultFboHandle) @@ -89,17 +89,22 @@ void SelectionPointer::render(GLuint defaultFboHandle) // Get view matrix QMatrix4x4 viewMatrix; QMatrix4x4 projectionMatrix; + GLfloat viewPortRatio = (GLfloat)m_mainViewPort.width() / (GLfloat)m_mainViewPort.height(); if (m_cachedIsSlicingActivated) { - GLfloat aspect = (GLfloat)m_mainViewPort.width() / (GLfloat)m_mainViewPort.height(); GLfloat sliceUnitsScaled = sliceUnits / m_autoScaleAdjustment; viewMatrix.lookAt(QVector3D(0.0f, 0.0f, 1.0f), zeroVector, upVector); - projectionMatrix.ortho(-sliceUnitsScaled * aspect, sliceUnitsScaled * aspect, + projectionMatrix.ortho(-sliceUnitsScaled * viewPortRatio, sliceUnitsScaled * viewPortRatio, -sliceUnitsScaled, sliceUnitsScaled, -1.0f, 4.0f); + } else if (useOrtho) { + viewMatrix = camera->d_ptr->viewMatrix(); + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); } else { viewMatrix = camera->d_ptr->viewMatrix(); - projectionMatrix.perspective(45.0f, (GLfloat)m_mainViewPort.width() - / (GLfloat)m_mainViewPort.height(), 0.1f, 100.0f); + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); } // Calculate scale factor to get uniform font size diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h index 7c6762be..03e09cca 100644 --- a/src/datavisualization/engine/selectionpointer_p.h +++ b/src/datavisualization/engine/selectionpointer_p.h @@ -49,7 +49,7 @@ public: explicit SelectionPointer(Drawer *drawer); ~SelectionPointer(); - void render(GLuint defaultFboHandle = 0); + void render(GLuint defaultFboHandle = 0, bool useOrtho = false); void setPosition(const QVector3D &position); void setLabel(const QString &label); void setPointerObject(ObjectHelper *object); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index a75cf699..30ffc381 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -733,7 +733,7 @@ void Surface3DRenderer::render(GLuint defaultFboHandle) cache->sliceSelectionPointer()->render(defaultFboHandle); } if (cache->mainPointerActive() && cache->renderable()) - cache->mainSelectionPointer()->render(defaultFboHandle); + cache->mainSelectionPointer()->render(defaultFboHandle, m_useOrthoProjection); } } } @@ -1040,8 +1040,16 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Set up projection matrix QMatrix4x4 projectionMatrix; - projectionMatrix.perspective(45.0f, (GLfloat)m_primarySubViewport.width() - / (GLfloat)m_primarySubViewport.height(), 0.1f, 100.0f); + GLfloat viewPortRatio = (GLfloat)m_primarySubViewport.width() + / (GLfloat)m_primarySubViewport.height(); + if (m_useOrthoProjection) { + GLfloat orthoRatio = 2.0f; + projectionMatrix.ortho(-viewPortRatio * orthoRatio, viewPortRatio * orthoRatio, + -orthoRatio, orthoRatio, + 0.0f, 100.0f); + } else { + projectionMatrix.perspective(45.0f, viewPortRatio, 0.1f, 100.0f); + } const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 375c9bdb..ed122104 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -317,6 +317,9 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) &AbstractDeclarative::measureFpsChanged); QObject::connect(m_controller.data(), &Abstract3DController::currentFpsChanged, this, &AbstractDeclarative::currentFpsChanged); + + QObject::connect(m_controller.data(), &Abstract3DController::orthoProjectionChanged, this, + &AbstractDeclarative::orthoProjectionChanged); } void AbstractDeclarative::activateOpenGLContext(QQuickWindow *window) @@ -664,6 +667,16 @@ qreal AbstractDeclarative::currentFps() const return m_controller->currentFps(); } +void AbstractDeclarative::setOrthoProjection(bool enable) +{ + m_controller->setOrthoProjection(enable); +} + +bool AbstractDeclarative::isOrthoProjection() const +{ + return m_controller->isOrthoProjection(); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 3dd07dca..837c632c 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -69,6 +69,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged REVISION 1) Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged REVISION 1) Q_PROPERTY(QQmlListProperty customItemList READ customItemList REVISION 1) + Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1) public: enum SelectionFlag { @@ -163,6 +164,9 @@ public: bool measureFps() const; qreal currentFps() const; + void setOrthoProjection(bool enable); + bool isOrthoProjection() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -195,6 +199,7 @@ signals: Q_REVISION(1) void measureFpsChanged(bool enabled); Q_REVISION(1) void currentFpsChanged(qreal fps); Q_REVISION(1) void elementSelected(QAbstract3DGraph::ElementType type); + Q_REVISION(1) void orthoProjectionChanged(bool enabled); private: QPointer m_controller; -- cgit v1.2.3 From 8015a58ea819b41e0a896ea9e7d57d7f3a9f1c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 14 May 2014 13:40:35 +0300 Subject: Added visible flag and possibility to release ownership of custom item Task-number: QTRD-3080 Change-Id: I198930c48fe9bce6a158406aff5fbf31272b9afe Reviewed-by: Miikka Heikkinen --- src/datavisualization/data/customrenderitem.cpp | 3 ++- src/datavisualization/data/customrenderitem_p.h | 3 +++ src/datavisualization/data/qcustom3ditem.cpp | 26 ++++++++++++++++++++-- src/datavisualization/data/qcustom3ditem.h | 5 +++++ src/datavisualization/data/qcustom3ditem_p.h | 1 + ...tdatavisualization-qml-abstractdeclarative.qdoc | 8 +++++++ .../engine/abstract3dcontroller.cpp | 10 +++++++++ .../engine/abstract3dcontroller_p.h | 1 + .../engine/abstract3drenderer.cpp | 4 ++++ src/datavisualization/engine/qabstract3dgraph.cpp | 10 +++++++++ src/datavisualization/engine/qabstract3dgraph.h | 1 + src/datavisualizationqml2/abstractdeclarative.cpp | 5 +++++ src/datavisualizationqml2/abstractdeclarative_p.h | 1 + tests/qmlcamera/qml/qmlcamera/main.qml | 12 ++++++++-- 14 files changed, 85 insertions(+), 5 deletions(-) diff --git a/src/datavisualization/data/customrenderitem.cpp b/src/datavisualization/data/customrenderitem.cpp index ad1fba71..53db9bd1 100644 --- a/src/datavisualization/data/customrenderitem.cpp +++ b/src/datavisualization/data/customrenderitem.cpp @@ -23,7 +23,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION CustomRenderItem::CustomRenderItem() : AbstractRenderItem(), m_texture(0), - m_object(0) + m_object(0), + m_visible(true) { } diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 0632f53e..70c162b7 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -49,12 +49,15 @@ public: inline QVector3D scaling() { return m_scaling; } inline void setBlendNeeded(bool blend) { m_needBlend = blend; } inline bool isBlendNeeded() { return m_needBlend; } + inline void setVisible(bool visible) { m_visible = visible; } + inline bool isVisible() { return m_visible; } private: GLuint m_texture; QVector3D m_scaling; ObjectHelper *m_object; bool m_needBlend; + bool m_visible; }; typedef QVector CustomRenderItemArray; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 70795fdf..285f5a39 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -187,6 +187,23 @@ QQuaternion QCustom3DItem::rotation() return d_ptr->m_rotation; } +/*! \property QCustom3DItem::visible + * + * Sets the item \a visible. Defaults to \c{true}. + */ +void QCustom3DItem::setVisible(bool visible) +{ + if (d_ptr->m_visible != visible) { + d_ptr->m_visible = visible; + emit visibleChanged(visible); + } +} + +bool QCustom3DItem::isVisible() +{ + return d_ptr->m_visible; +} + /*! * A convenience function to construct rotation quaternion from \a axis and \a angle. * @@ -242,7 +259,11 @@ QString QCustom3DItem::textureFile() QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : QObject(parent), - q_ptr(q) + q_ptr(q), + m_position(QVector3D(0.0f, 0.0f, 0.0f)), + m_scaling(QVector3D(0.1f, 0.1f, 0.1f)), + m_rotation(QQuaternion(0.0f, 0.0f, 0.0f, 0.0f)), + m_visible(true) { } @@ -254,7 +275,8 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &mesh m_meshFile(meshFile), m_position(position), m_scaling(scaling), - m_rotation(rotation) + m_rotation(rotation), + m_visible(true) { } diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index 394c51d7..c9d0cd63 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -36,6 +36,7 @@ class QT_DATAVISUALIZATION_EXPORT QCustom3DItem : public QObject Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) Q_PROPERTY(QVector3D scaling READ scaling WRITE setScaling NOTIFY scalingChanged) Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) public: explicit QCustom3DItem(QObject *parent = 0); @@ -59,6 +60,9 @@ public: void setRotation(const QQuaternion &rotation); QQuaternion rotation(); + void setVisible(bool visible); + bool isVisible(); + Q_INVOKABLE void setRotationAxisAndAngle(const QVector3D &axis, float angle); void setTextureImage(const QImage &textureImage); @@ -69,6 +73,7 @@ signals: void positionChanged(const QVector3D &position); void scalingChanged(const QVector3D &scaling); void rotationChanged(const QQuaternion &rotation); + void visibleChanged(bool visible); protected: QScopedPointer d_ptr; diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 77062768..f85ec5bf 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -53,6 +53,7 @@ public: QVector3D m_position; QVector3D m_scaling; QQuaternion m_rotation; + bool m_visible; private: friend class QCustom3DItem; diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 62e4034f..4fac937b 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -186,6 +186,14 @@ * \since Qt Data Visualization 1.1 */ +/*! + * \qmlmethod void AbstractGraph3D::releaseCustomItem(Custom3DItem item) + * + * Gets ownership of \a item back and removes the \a item from the graph. + * + * \since Qt Data Visualization 1.1 + */ + /*! * \qmlmethod int AbstractGraph3D::selectedLabelIndex() * diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 6b6f154d..78ac135b 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -911,6 +911,16 @@ void Abstract3DController::deleteCustomItem(const QVector3D &position) } } +void Abstract3DController::releaseCustomItem(QCustom3DItem *item) +{ + if (item && m_customItems.contains(item)) { + m_customItems.removeOne(item); + item->setParent(0); + m_isCustomDataDirty = true; + emitNeedRender(); + } +} + void Abstract3DController::handleAxisTitleChanged(const QString &title) { Q_UNUSED(title) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 41c75d8e..79320c25 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -244,6 +244,7 @@ public: void deleteCustomItems(); void deleteCustomItem(QCustom3DItem *item); void deleteCustomItem(const QVector3D &position); + void releaseCustomItem(QCustom3DItem *item); int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index bcf03ed7..6dcc46df 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -551,6 +551,7 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { //item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); + newItem->setVisible(item->isVisible()); m_customRenderCache.append(newItem); } @@ -580,6 +581,9 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { + if (!item->isVisible()) + continue; + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index b3a788cb..9818d176 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -426,6 +426,16 @@ void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) d_ptr->m_visualController->deleteCustomItem(position); } +/*! + * Gets ownership of given \a item back and removes the \a item from the graph. + * + * \since Qt Data Visualization 1.1 + */ +void QAbstract3DGraph::releaseCustomItem(QCustom3DItem *item) +{ + return d_ptr->m_visualController->releaseCustomItem(item); +} + /*! * Can be used to query the index of the selected label after receiving elementSelected signal with * any label type. Selection is valid until the next elementSelected signal. diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index bfc03cc1..23dba269 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -114,6 +114,7 @@ public: void removeCustomItems(); void removeCustomItem(QCustom3DItem *item); void removeCustomItemAt(const QVector3D &position); + void releaseCustomItem(QCustom3DItem *item); int selectedLabelIndex() const; QAbstract3DAxis *selectedAxis() const; diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index ed122104..47d3bb66 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -231,6 +231,11 @@ void AbstractDeclarative::removeCustomItemAt(const QVector3D &position) m_controller->deleteCustomItem(position); } +void AbstractDeclarative::releaseCustomItem(QCustom3DItem *item) +{ + return m_controller->releaseCustomItem(item); +} + int AbstractDeclarative::selectedLabelIndex() const { return m_controller->selectedLabelIndex(); diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 837c632c..8095e87a 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -134,6 +134,7 @@ public: Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItems(); Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItem(QCustom3DItem *item); Q_REVISION(1) Q_INVOKABLE virtual void removeCustomItemAt(const QVector3D &position); + Q_REVISION(1) Q_INVOKABLE virtual void releaseCustomItem(QCustom3DItem *item); Q_REVISION(1) Q_INVOKABLE virtual int selectedLabelIndex() const; Q_REVISION(1) Q_INVOKABLE virtual QAbstract3DAxis *selectedAxis() const; diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index 0f708615..6b83bde2 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -179,9 +179,17 @@ Rectangle { anchors.bottom: dataToggle.top width: camControlArea.width text: "Remove Shuttle" + property bool addObject: false onClicked: { - testChart.removeCustomItemAt(Qt.vector3d(5.0,35.0,3.0)) - text = "Shuttle has been deleted" + if (addObject === true) { + testChart.addCustomItem(shuttleItem) + text = "Remove Shuttle" + addObject = false + } else { + testChart.releaseCustomItem(shuttleItem) + text = "Add Shuttle" + addObject = true + } } } } -- cgit v1.2.3 From c9a3325e59b224c26d5e49688b29b2a57134e019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 15 May 2014 07:02:01 +0300 Subject: GLStateStore ES2 fix Change-Id: I96e92601be00fc7dc1deef179b2ac825d6478283 Change-Id: I96e92601be00fc7dc1deef179b2ac825d6478283 Reviewed-by: Titta Heikkala --- src/datavisualizationqml2/enumtostringmap.cpp | 4 ++++ src/datavisualizationqml2/glstatestore.cpp | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/datavisualizationqml2/enumtostringmap.cpp b/src/datavisualizationqml2/enumtostringmap.cpp index 249fbae3..ebd89981 100644 --- a/src/datavisualizationqml2/enumtostringmap.cpp +++ b/src/datavisualizationqml2/enumtostringmap.cpp @@ -379,7 +379,11 @@ EnumToStringMap::EnumToStringMap() : m_map[GL_FRAMEBUFFER_UNSUPPORTED] = "FRAMEBUFFER_UNSUPPORTED"; m_map[GL_FRAMEBUFFER_BINDING] = "FRAMEBUFFER_BINDING"; +#if !defined(QT_OPENGL_ES_2) m_map[GL_RENDERBUFFER_BINDING] = "RENDERBUFFER_BINDING"; +#else + m_map[GL_RENDERBUFFER] = "RENDERBUFFER_BINDING"; +#endif m_map[GL_MAX_RENDERBUFFER_SIZE] = "MAX_RENDERBUFFER_SIZE"; m_map[GL_INVALID_FRAMEBUFFER_OPERATION] = "INVALID_FRAMEBUFFER_OPERATION"; diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp index 6fbd3a34..c590a4c1 100644 --- a/src/datavisualizationqml2/glstatestore.cpp +++ b/src/datavisualizationqml2/glstatestore.cpp @@ -78,8 +78,10 @@ void GLStateStore::storeGLState() #if !defined(QT_OPENGL_ES_2) glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &m_drawFramebuffer); glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &m_readFramebuffer); -#endif glGetIntegerv(GL_RENDERBUFFER_BINDING, &m_renderbuffer); +#else + glGetIntegerv(GL_RENDERBUFFER, &m_renderbuffer); +#endif glGetFloatv(GL_COLOR_CLEAR_VALUE, m_clearColor); m_isBlendingEnabled = glIsEnabled(GL_BLEND); m_isDepthTestEnabled = glIsEnabled(GL_DEPTH_TEST); @@ -171,8 +173,10 @@ void GLStateStore::printCurrentState(bool in) #if !defined(QT_OPENGL_ES_2) glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawFramebuffer); glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readFramebuffer); -#endif glGetIntegerv(GL_RENDERBUFFER_BINDING, &renderbuffer); +#else + glGetIntegerv(GL_RENDERBUFFER, &renderbuffer); +#endif glGetFloatv(GL_COLOR_CLEAR_VALUE, clearColor); glGetFloatv(GL_DEPTH_CLEAR_VALUE, &clearDepth); glGetIntegerv(GL_DEPTH_FUNC, &depthFunc); @@ -263,8 +267,10 @@ void GLStateStore::restoreGLState() #if !defined(QT_OPENGL_ES_2) glBindFramebuffer(GL_READ_FRAMEBUFFER, m_readFramebuffer); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_drawFramebuffer); -#endif glBindRenderbuffer(GL_RENDERBUFFER_BINDING, m_renderbuffer); +#else + glBindRenderbuffer(GL_RENDERBUFFER, m_renderbuffer); +#endif if (m_isScissorTestEnabled) glEnable(GL_SCISSOR_TEST); -- cgit v1.2.3 From 6368dd9a1d9e51016dcef9c93137526c07adcbeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 15 May 2014 12:01:47 +0300 Subject: Dirty bits to custom item Task-number: QTRD-3082 Change-Id: I1503b067edcc677904ca16c1501109187809f98b Change-Id: I1503b067edcc677904ca16c1501109187809f98b Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 23 ++++++++++ .../customitems/customitemgraph.h | 5 +++ src/datavisualization/data/customrenderitem_p.h | 5 +++ src/datavisualization/data/qcustom3ditem.cpp | 36 +++++++++++----- src/datavisualization/data/qcustom3ditem.h | 1 + src/datavisualization/data/qcustom3ditem_p.h | 24 +++++++++++ .../engine/abstract3dcontroller.cpp | 17 ++++++++ .../engine/abstract3dcontroller_p.h | 3 ++ .../engine/abstract3drenderer.cpp | 49 +++++++++++++++++++++- .../engine/abstract3drenderer_p.h | 2 + 10 files changed, 154 insertions(+), 11 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 14117580..56187d14 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -91,6 +91,11 @@ CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label) connect(m_graph, &QAbstract3DGraph::elementSelected, this, &CustomItemGraph::handleElementSelected); + + m_selectionAnimation = new QPropertyAnimation(this); + m_selectionAnimation->setPropertyName("scaling"); + m_selectionAnimation->setDuration(500); + m_selectionAnimation->setLoopCount(-1); } CustomItemGraph::~CustomItemGraph() @@ -118,6 +123,7 @@ void CustomItemGraph::toggleItemOne(bool show) m_graph->addCustomItem(item); //! [3] } else { + resetSelection(); //! [4] m_graph->removeCustomItemAt(positionOne); //! [4] @@ -138,6 +144,7 @@ void CustomItemGraph::toggleItemTwo(bool show) item->setTextureImage(color); m_graph->addCustomItem(item); } else { + resetSelection(); m_graph->removeCustomItemAt(positionTwo); } } @@ -156,6 +163,7 @@ void CustomItemGraph::toggleItemThree(bool show) item->setTextureImage(color); m_graph->addCustomItem(item); } else { + resetSelection(); m_graph->removeCustomItemAt(positionThree); } } @@ -196,15 +204,22 @@ void CustomItemGraph::toggleShadows(bool shadows) void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) { + resetSelection(); if (type == QAbstract3DGraph::ElementCustomItem) { int index = m_graph->selectedCustomItemIndex(); QCustom3DItem *item = m_graph->selectedCustomItem(); + m_previouslyAnimatedItem = item; + m_previousScaling = item->scaling(); QString text; text.setNum(index); text.append(": "); QStringList split = item->meshFile().split("/"); text.append(split.last()); m_textField->setText(text); + m_selectionAnimation->setTargetObject(item); + m_selectionAnimation->setStartValue(item->scaling()); + m_selectionAnimation->setEndValue(item->scaling() * 1.5f); + m_selectionAnimation->start(); } else if (type == QAbstract3DGraph::ElementSeries) { QString text = "Surface ("; QSurface3DSeries *series = m_graph->selectedSeries(); @@ -226,3 +241,11 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) m_textField->setText("Nothing"); } } + +void CustomItemGraph::resetSelection() +{ + m_selectionAnimation->stop(); + if (m_previouslyAnimatedItem) + m_previouslyAnimatedItem->setScaling(m_previousScaling); + m_previouslyAnimatedItem = 0; +} diff --git a/examples/datavisualization/customitems/customitemgraph.h b/examples/datavisualization/customitems/customitemgraph.h index aee32c62..e86d3910 100644 --- a/examples/datavisualization/customitems/customitemgraph.h +++ b/examples/datavisualization/customitems/customitemgraph.h @@ -25,6 +25,7 @@ #include #include #include +#include using namespace QtDataVisualization; @@ -44,10 +45,14 @@ public: private: void handleElementSelected(QAbstract3DGraph::ElementType type); + void resetSelection(); private: Q3DSurface *m_graph; QLabel *m_textField; + QPropertyAnimation *m_selectionAnimation; + QCustom3DItem *m_previouslyAnimatedItem; + QVector3D m_previousScaling; }; #endif diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 70c162b7..3bf8067e 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -34,6 +34,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +class QCustom3DItem; + class CustomRenderItem : public AbstractRenderItem { public: @@ -51,6 +53,8 @@ public: inline bool isBlendNeeded() { return m_needBlend; } inline void setVisible(bool visible) { m_visible = visible; } inline bool isVisible() { return m_visible; } + inline void setItemPointer(QCustom3DItem *item) { m_item = item; } + inline QCustom3DItem *itemPointer() { return m_item; } private: GLuint m_texture; @@ -58,6 +62,7 @@ private: ObjectHelper *m_object; bool m_needBlend; bool m_visible; + QCustom3DItem *m_item; }; typedef QVector CustomRenderItemArray; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 285f5a39..ca4cef16 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -123,7 +123,9 @@ void QCustom3DItem::setMeshFile(const QString &meshFile) { if (d_ptr->m_meshFile != meshFile) { d_ptr->m_meshFile = meshFile; + d_ptr->m_dirtyBits.meshDirty = true; emit meshFileChanged(meshFile); + emit d_ptr->needUpdate(); } } @@ -144,7 +146,9 @@ void QCustom3DItem::setPosition(const QVector3D &position) { if (d_ptr->m_position != position) { d_ptr->m_position = position; + d_ptr->m_dirtyBits.positionDirty = true; emit positionChanged(position); + emit d_ptr->needUpdate(); } } @@ -161,7 +165,9 @@ void QCustom3DItem::setScaling(const QVector3D &scaling) { if (d_ptr->m_scaling != scaling) { d_ptr->m_scaling = scaling; + d_ptr->m_dirtyBits.scalingDirty = true; emit scalingChanged(scaling); + emit d_ptr->needUpdate(); } } @@ -178,7 +184,9 @@ void QCustom3DItem::setRotation(const QQuaternion &rotation) { if (d_ptr->m_rotation != rotation) { d_ptr->m_rotation = rotation; + d_ptr->m_dirtyBits.rotationDirty = true; emit rotationChanged(rotation); + emit d_ptr->needUpdate(); } } @@ -195,7 +203,9 @@ void QCustom3DItem::setVisible(bool visible) { if (d_ptr->m_visible != visible) { d_ptr->m_visible = visible; + d_ptr->m_dirtyBits.visibleDirty = true; emit visibleChanged(visible); + emit d_ptr->needUpdate(); } } @@ -219,17 +229,21 @@ void QCustom3DItem::setRotationAxisAndAngle(const QVector3D &axis, float angle) */ void QCustom3DItem::setTextureImage(const QImage &textureImage) { - if (textureImage.isNull()) { - // Make a solid gray texture - d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); - d_ptr->m_textureImage.fill(Qt::gray); - } else { - d_ptr->m_textureImage = textureImage; - } + if (textureImage != d_ptr->m_textureImage) { + if (textureImage.isNull()) { + // Make a solid gray texture + d_ptr->m_textureImage = QImage(2, 2, QImage::Format_RGB32); + d_ptr->m_textureImage.fill(Qt::gray); + } else { + d_ptr->m_textureImage = textureImage; + } - if (!d_ptr->m_textureFile.isEmpty()) { - d_ptr->m_textureFile.clear(); - emit textureFileChanged(d_ptr->m_textureFile); + if (!d_ptr->m_textureFile.isEmpty()) { + d_ptr->m_textureFile.clear(); + emit textureFileChanged(d_ptr->m_textureFile); + } + d_ptr->m_dirtyBits.textureDirty = true; + emit d_ptr->needUpdate(); } } @@ -249,6 +263,8 @@ void QCustom3DItem::setTextureFile(const QString &textureFile) d_ptr->m_textureImage.fill(Qt::gray); } emit textureFileChanged(textureFile); + d_ptr->m_dirtyBits.textureDirty = true; + emit d_ptr->needUpdate(); } } diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index c9d0cd63..77e33404 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -82,6 +82,7 @@ private: Q_DISABLE_COPY(QCustom3DItem) friend class Abstract3DRenderer; + friend class Abstract3DController; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index f85ec5bf..89f47501 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -33,6 +33,25 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +struct QCustomItemDirtyBitField { + bool textureDirty : 1; + bool meshDirty : 1; + bool positionDirty : 1; + bool scalingDirty : 1; + bool rotationDirty : 1; + bool visibleDirty : 1; + + QCustomItemDirtyBitField() + : textureDirty(false), + meshDirty(false), + positionDirty(false), + scalingDirty(false), + rotationDirty(false), + visibleDirty(false) + { + } +}; + class QCustom3DItemPrivate : public QObject { Q_OBJECT @@ -55,6 +74,11 @@ public: QQuaternion m_rotation; bool m_visible; + QCustomItemDirtyBitField m_dirtyBits; + +signals: + void needUpdate(); + private: friend class QCustom3DItem; }; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 78ac135b..473ad34c 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -32,6 +32,7 @@ #include "q3dtheme_p.h" #include "q3dscene_p.h" #include "q3dscene.h" +#include "qcustom3ditem_p.h" #include #include @@ -52,6 +53,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_renderer(0), m_isDataDirty(true), m_isCustomDataDirty(true), + m_isCustomItemDirty(true), m_isSeriesVisualsDirty(true), m_renderPending(false), m_measureFps(false), @@ -411,6 +413,11 @@ void Abstract3DController::synchDataToRenderer() m_renderer->updateCustomData(m_customItems); m_isCustomDataDirty = false; } + + if (m_isCustomItemDirty) { + m_renderer->updateCustomItems(); + m_isCustomItemDirty = false; + } } void Abstract3DController::render(const GLuint defaultFboHandle) @@ -874,6 +881,8 @@ int Abstract3DController::addCustomItem(QCustom3DItem *item) return index; item->setParent(this); + connect(item->d_ptr.data(), &QCustom3DItemPrivate::needUpdate, + this, &Abstract3DController::updateCustomItem); m_customItems.append(item); m_isCustomDataDirty = true; emitNeedRender(); @@ -914,6 +923,8 @@ void Abstract3DController::deleteCustomItem(const QVector3D &position) void Abstract3DController::releaseCustomItem(QCustom3DItem *item) { if (item && m_customItems.contains(item)) { + disconnect(item->d_ptr.data(), &QCustom3DItemPrivate::needUpdate, + this, &Abstract3DController::updateCustomItem); m_customItems.removeOne(item); item->setParent(0); m_isCustomDataDirty = true; @@ -921,6 +932,12 @@ void Abstract3DController::releaseCustomItem(QCustom3DItem *item) } } +void Abstract3DController::updateCustomItem() +{ + m_isCustomItemDirty = true; + emitNeedRender(); +} + void Abstract3DController::handleAxisTitleChanged(const QString &title) { Q_UNUSED(title) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 79320c25..bd78b6fa 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -166,6 +166,7 @@ protected: Abstract3DRenderer *m_renderer; bool m_isDataDirty; bool m_isCustomDataDirty; + bool m_isCustomItemDirty; bool m_isSeriesVisualsDirty; bool m_renderPending; @@ -311,6 +312,8 @@ public slots: inline bool measureFps() const { return m_measureFps; } inline qreal currentFps() const { return m_currentFps; } + void updateCustomItem(); + signals: void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 6dcc46df..920b8cf0 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -427,6 +427,14 @@ void Abstract3DRenderer::updateCustomData(const QList &customIt addCustomItem(item); } +void Abstract3DRenderer::updateCustomItems() +{ + // Check all items + // TODO: Call updateCustomItem in a loop, as we can probably utilize the same function in updateCustomData when doing QTRD-3056 + foreach (CustomRenderItem *item, m_customRenderCache) + updateCustomItem(item); +} + SeriesRenderCache *Abstract3DRenderer::createNewCache(QAbstract3DSeries *series) { return new SeriesRenderCache(series, this); @@ -538,8 +546,10 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { +void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) +{ CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setRotation(item->rotation()); @@ -555,6 +565,43 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { m_customRenderCache.append(newItem); } +void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) +{ + QCustom3DItem *item = renderItem->itemPointer(); + if (item->d_ptr->m_dirtyBits.meshDirty) { + renderItem->setMesh(item->meshFile()); + item->d_ptr->m_dirtyBits.meshDirty = false; + } + if (item->d_ptr->m_dirtyBits.scalingDirty) { + renderItem->setScaling(item->scaling()); + item->d_ptr->m_dirtyBits.scalingDirty = false; + } + if (item->d_ptr->m_dirtyBits.rotationDirty) { + renderItem->setRotation(item->rotation()); + item->d_ptr->m_dirtyBits.rotationDirty = false; + } + if (item->d_ptr->m_dirtyBits.textureDirty) { + QImage textureImage = item->d_ptr->textureImage(); + renderItem->setBlendNeeded(textureImage.hasAlphaChannel()); + GLuint oldTexture = renderItem->texture(); + m_textureHelper->deleteTexture(&oldTexture); + GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); + renderItem->setTexture(texture); + // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) + //item->d_ptr->clearTextureImage(); + item->d_ptr->m_dirtyBits.textureDirty = false; + } + if (item->d_ptr->m_dirtyBits.positionDirty) { + QVector3D translation = convertPositionToTranslation(item->position()); + renderItem->setTranslation(translation); + item->d_ptr->m_dirtyBits.positionDirty = false; + } + if (item->d_ptr->m_dirtyBits.visibleDirty) { + renderItem->setVisible(item->isVisible()); + item->d_ptr->m_dirtyBits.visibleDirty = false; + } +} + void Abstract3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, const QMatrix4x4 &viewMatrix, diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 5063f506..949ba104 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -68,6 +68,7 @@ public: virtual void updateData() = 0; virtual void updateSeries(const QList &seriesList); virtual void updateCustomData(const QList &customItems); + virtual void updateCustomItems(); virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); @@ -112,6 +113,7 @@ public: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); virtual void addCustomItem(QCustom3DItem *item); + virtual void updateCustomItem(CustomRenderItem *renderItem); virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; -- cgit v1.2.3 From a998e49b3455c9e28d2ed85f024f28c69921cfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 08:39:47 +0300 Subject: Optimized custom item addition/removal Task-number: QTRD-3056 Change-Id: I653d8aeec797b76c19d9b542391b79e9370e7501 Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 3 +- src/datavisualization/data/customrenderitem_p.h | 20 ++++++---- src/datavisualization/data/qcustom3ditem.cpp | 10 +++++ src/datavisualization/data/qcustom3ditem_p.h | 1 + .../engine/abstract3dcontroller.cpp | 4 +- .../engine/abstract3drenderer.cpp | 46 +++++++++++++--------- .../engine/abstract3drenderer_p.h | 2 +- 7 files changed, 57 insertions(+), 29 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 56187d14..aeae61e9 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -26,7 +26,8 @@ using namespace QtDataVisualization; CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label) : m_graph(surface), - m_textField(label) + m_textField(label), + m_previouslyAnimatedItem(0) { QImage layerOneHMap(":/maps/layer_1.png"); QHeightMapSurfaceDataProxy *layerOneProxy = new QHeightMapSurfaceDataProxy(layerOneHMap); diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 3bf8067e..1722163b 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -44,17 +44,21 @@ public: virtual ~CustomRenderItem(); inline void setTexture(GLuint texture) { m_texture = texture; } - inline GLuint texture() { return m_texture; } + inline GLuint texture() const { return m_texture; } void setMesh(const QString &meshFile); - inline ObjectHelper *mesh() { return m_object; } + inline ObjectHelper *mesh() const { return m_object; } inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } - inline QVector3D scaling() { return m_scaling; } + inline QVector3D scaling() const { return m_scaling; } inline void setBlendNeeded(bool blend) { m_needBlend = blend; } - inline bool isBlendNeeded() { return m_needBlend; } + inline bool isBlendNeeded() const { return m_needBlend; } inline void setVisible(bool visible) { m_visible = visible; } - inline bool isVisible() { return m_visible; } + inline bool isVisible() const { return m_visible; } inline void setItemPointer(QCustom3DItem *item) { m_item = item; } - inline QCustom3DItem *itemPointer() { return m_item; } + inline QCustom3DItem *itemPointer() const { return m_item; } + inline void setValid(bool valid) { m_valid = valid; } + inline bool isValid() const { return m_valid; } + inline void setIndex(int index) { m_index = index; } + inline int index() const { return m_index; } private: GLuint m_texture; @@ -62,9 +66,11 @@ private: ObjectHelper *m_object; bool m_needBlend; bool m_visible; + bool m_valid; + int m_index; QCustom3DItem *m_item; }; -typedef QVector CustomRenderItemArray; +typedef QHash CustomRenderItemArray; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index ca4cef16..bb6c96eb 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -310,4 +310,14 @@ void QCustom3DItemPrivate::clearTextureImage() m_textureImage = QImage(); } +void QCustom3DItemPrivate::resetDirtyBits() +{ + m_dirtyBits.textureDirty = false; + m_dirtyBits.meshDirty = false; + m_dirtyBits.positionDirty = false; + m_dirtyBits.scalingDirty = false; + m_dirtyBits.rotationDirty = false; + m_dirtyBits.visibleDirty = false; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 89f47501..007c9fc4 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -63,6 +63,7 @@ public: QImage textureImage(); void clearTextureImage(); + void resetDirtyBits(); public: QCustom3DItem *q_ptr; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 473ad34c..98fff81e 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -884,6 +884,7 @@ int Abstract3DController::addCustomItem(QCustom3DItem *item) connect(item->d_ptr.data(), &QCustom3DItemPrivate::needUpdate, this, &Abstract3DController::updateCustomItem); m_customItems.append(item); + item->d_ptr->resetDirtyBits(); m_isCustomDataDirty = true; emitNeedRender(); return m_customItems.count() - 1; @@ -914,9 +915,8 @@ void Abstract3DController::deleteCustomItem(const QVector3D &position) { // Get the item for the position foreach (QCustom3DItem *item, m_customItems) { - if (item->position() == position) { + if (item->position() == position) deleteCustomItem(item); - } } } diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 920b8cf0..06954165 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -416,21 +416,34 @@ void Abstract3DRenderer::updateCustomData(const QList &customIt if (customItems.isEmpty() && m_customRenderCache.isEmpty()) return; - // There are probably not too many custom items, just recreate the array if something changes - foreach (CustomRenderItem *item, m_customRenderCache) { - GLuint texture = item->texture(); - m_textureHelper->deleteTexture(&texture); - delete item; + foreach (CustomRenderItem *item, m_customRenderCache) + item->setValid(false); + + int itemCount = customItems.size(); + // Check custom item list for items that are not yet in render item cache + for (int i = 0; i < itemCount; i++) { + QCustom3DItem *item = customItems.at(i); + CustomRenderItem *renderItem = m_customRenderCache.value(item); + if (!renderItem) + renderItem = addCustomItem(item); + renderItem->setValid(true); + renderItem->setIndex(i); // always update index, as it must match the custom item index + } + + // Check render item cache and remove items that are not in customItems list anymore + foreach (CustomRenderItem *renderItem, m_customRenderCache) { + if (!renderItem->isValid()) { + m_customRenderCache.remove(renderItem->itemPointer()); + GLuint texture = renderItem->texture(); + m_textureHelper->deleteTexture(&texture); + delete renderItem; + } } - m_customRenderCache.clear(); - foreach (QCustom3DItem *item, customItems) - addCustomItem(item); } void Abstract3DRenderer::updateCustomItems() { // Check all items - // TODO: Call updateCustomItem in a loop, as we can probably utilize the same function in updateCustomData when doing QTRD-3056 foreach (CustomRenderItem *item, m_customRenderCache) updateCustomItem(item); } @@ -546,7 +559,7 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) return QVector4D(idxRed, idxGreen, idxBlue, 0); } -void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) +CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); newItem->setItemPointer(item); // Store pointer for render item updates @@ -557,12 +570,12 @@ void Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) - //item->d_ptr->clearTextureImage(); + item->d_ptr->clearTextureImage(); QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); - m_customRenderCache.append(newItem); + m_customRenderCache.insert(item, newItem); + return newItem; } void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) @@ -587,8 +600,7 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) m_textureHelper->deleteTexture(&oldTexture); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); renderItem->setTexture(texture); - // TODO: Uncomment this once custom item render cache handling has been optimized (QTRD-3056) - //item->d_ptr->clearTextureImage(); + item->d_ptr->clearTextureImage(); item->d_ptr->m_dirtyBits.textureDirty = false; } if (item->d_ptr->m_dirtyBits.positionDirty) { @@ -613,8 +625,6 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, if (m_customRenderCache.isEmpty()) return; - int itemIndex = 0; - if (RenderingNormal == state) { shader->bind(); shader->setUniformValue(shader->lightP(), m_cachedScene->activeLight()->position()); @@ -677,7 +687,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, } else if (RenderingSelection == state) { // Selection render shader->setUniformValue(shader->MVP(), MVPMatrix); - QVector4D itemColor = indexToSelectionColor(itemIndex++); + QVector4D itemColor = indexToSelectionColor(item->index()); itemColor.setW(customItemAlpha); itemColor /= 255.0f; shader->setUniformValue(shader->color(), itemColor); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 949ba104..5cfb88ae 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -112,7 +112,7 @@ public: virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); - virtual void addCustomItem(QCustom3DItem *item); + virtual CustomRenderItem *addCustomItem(QCustom3DItem *item); virtual void updateCustomItem(CustomRenderItem *renderItem); virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; -- cgit v1.2.3 From 92ee7767f81f7a15b8773ed97356f01ecac68d0c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 16 May 2014 15:26:14 +0300 Subject: Implement axis label autorotation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2857 Change-Id: I158abb75272813cf7eb5d4b419e24325389d940e Reviewed-by: Tomi Korpipää --- examples/datavisualization/bars/graphmodifier.cpp | 3 + .../datavisualization/qmlbars/doc/src/qmlbars.qdoc | 3 + .../datavisualization/qmlbars/qml/qmlbars/Axes.qml | 15 +- .../datavisualization/qmlbars/qml/qmlbars/main.qml | 1 + .../datavisualization/surface/doc/src/surface.qdoc | 4 +- .../datavisualization/surface/surfacegraph.cpp | 3 + src/datavisualization/axis/qabstract3daxis.cpp | 38 +++- src/datavisualization/axis/qabstract3daxis.h | 5 + src/datavisualization/axis/qabstract3daxis_p.h | 1 + .../engine/abstract3dcontroller.cpp | 41 ++++ .../engine/abstract3dcontroller_p.h | 10 +- .../engine/abstract3drenderer.cpp | 8 + .../engine/abstract3drenderer_p.h | 2 + src/datavisualization/engine/axisrendercache.cpp | 3 +- src/datavisualization/engine/axisrendercache_p.h | 3 + src/datavisualization/engine/bars3drenderer.cpp | 206 +++++++++++++++--- src/datavisualization/engine/drawer.cpp | 61 ++---- src/datavisualization/engine/scatter3drenderer.cpp | 230 +++++++++++++++----- src/datavisualization/engine/surface3drenderer.cpp | 232 ++++++++++++++++----- .../datavisualizationqml2_plugin.cpp | 4 +- 20 files changed, 682 insertions(+), 191 deletions(-) diff --git a/examples/datavisualization/bars/graphmodifier.cpp b/examples/datavisualization/bars/graphmodifier.cpp index d19910ec..dc5d92c9 100644 --- a/examples/datavisualization/bars/graphmodifier.cpp +++ b/examples/datavisualization/bars/graphmodifier.cpp @@ -68,9 +68,12 @@ GraphModifier::GraphModifier(Q3DBars *bargraph) m_temperatureAxis->setSubSegmentCount(m_subSegments); m_temperatureAxis->setRange(m_minval, m_maxval); m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%.1f ") + celsiusString)); + m_temperatureAxis->setLabelAutoRotation(90.0f); m_yearAxis->setTitle("Year"); + m_yearAxis->setLabelAutoRotation(40.0f); m_monthAxis->setTitle("Month"); + m_monthAxis->setLabelAutoRotation(40.0f); m_graph->setValueAxis(m_temperatureAxis); m_graph->setRowAxis(m_yearAxis); diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc index 4034cdd2..01131388 100644 --- a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc +++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc @@ -88,6 +88,9 @@ \snippet qmlbars/qml/qmlbars/Axes.qml 0 + We also set automatic axis label rotation to make axis labels more readable at low camera + angles. + \section1 Switching series In the \c main.qml, we set up the graph and various UI elements. There are three interesting diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml index a8257995..f316eef5 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml @@ -17,33 +17,40 @@ ****************************************************************************/ import QtQuick 2.1 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 Item { property alias column: columnAxis + property alias row: rowAxis property alias value: valueAxis property alias total: totalAxis - // For row labels we can use row labels from data proxy, so default axis - // suffices for rows. - // Custom labels for columns, since the data contains abbreviated month names. //! [0] CategoryAxis3D { id: columnAxis labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + labelAutoRotation: 30 } //! [0] CategoryAxis3D { id: totalAxis labels: ["Yearly total"] + labelAutoRotation: 30 + } + CategoryAxis3D { + // For row labels we can use row labels from data proxy, no labels defined for rows. + id: rowAxis + labelAutoRotation: 30 } + ValueAxis3D { id: valueAxis min: 0 max: 35 labelFormat: "%.2f M\u20AC" title: "Monthly income" + labelAutoRotation: 90 } } diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml index cc15dd50..6b9efeca 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml @@ -103,6 +103,7 @@ Rectangle { barSpacingRelative: false scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh columnAxis: graphAxes.column + rowAxis: graphAxes.row valueAxis: graphAxes.value //! [4] diff --git a/examples/datavisualization/surface/doc/src/surface.qdoc b/examples/datavisualization/surface/doc/src/surface.qdoc index 31b41c59..af74bd58 100644 --- a/examples/datavisualization/surface/doc/src/surface.qdoc +++ b/examples/datavisualization/surface/doc/src/surface.qdoc @@ -85,8 +85,8 @@ \c {Sqrt & Sin} radio button, the selected series is activated with the following code. First we set the decorative issues like enable the grid for the surface and select the flat shading mode. Next lines define the axis label format and value - ranges. Finally we make sure the correct series is added to the - graph: + ranges. Automatic label rotation is set to improve label readability at low camera angles. + Finally we make sure the correct series is added to the graph: \snippet surface/surfacegraph.cpp 3 diff --git a/examples/datavisualization/surface/surfacegraph.cpp b/examples/datavisualization/surface/surfacegraph.cpp index d7524fbc..172b4daf 100644 --- a/examples/datavisualization/surface/surfacegraph.cpp +++ b/examples/datavisualization/surface/surfacegraph.cpp @@ -100,6 +100,9 @@ void SurfaceGraph::enableSqrtSinModel(bool enable) m_graph->axisX()->setRange(sampleMin, sampleMax); m_graph->axisY()->setRange(0.0f, 2.0f); m_graph->axisZ()->setRange(sampleMin, sampleMax); + m_graph->axisX()->setLabelAutoRotation(30); + m_graph->axisY()->setLabelAutoRotation(90); + m_graph->axisZ()->setLabelAutoRotation(30); m_graph->removeSeries(m_heightMapSeries); m_graph->addSeries(m_sqrtSinSeries); diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index ef4959d4..27951f4c 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -89,6 +89,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * If set, the axis will automatically adjust the range so that all data fits in it. */ +/*! + * \qmlproperty real AbstractAxis3D::labelAutoRotation + * + * Defines the maximum \a angle the labels can autorotate when the camera angle changes. + * The \a angle can be between 0 and 90, inclusive. The default value is 0. + * If the value is 0, axis labels do not automatically rotate. + * If the value is greater than zero, labels attempt to orient themselves toward the camera, up to + * the specified angle. + */ /*! * \enum QAbstract3DAxis::AxisOrientation @@ -193,6 +202,32 @@ void QAbstract3DAxis::setRange(float min, float max) setAutoAdjustRange(false); } +/*! + * \property QAbstract3DAxis::labelAutoRotation + * + * Defines the maximum \a angle the labels can autorotate when the camera angle changes. + * The \a angle can be between 0 and 90, inclusive. The default value is 0. + * If the value is 0, axis labels do not automatically rotate. + * If the value is greater than zero, labels attempt to orient themselves toward the camera, up to + * the specified angle. + */ +void QAbstract3DAxis::setLabelAutoRotation(float angle) +{ + if (angle < 0.0f) + angle = 0.0f; + if (angle > 90.0f) + angle = 90.0f; + if (d_ptr->m_labelAutoRotation != angle) { + d_ptr->m_labelAutoRotation = angle; + emit labelAutoRotationChanged(angle); + } +} + +float QAbstract3DAxis::labelAutoRotation() const +{ + return d_ptr->m_labelAutoRotation; +} + /*! * \property QAbstract3DAxis::min * @@ -266,7 +301,8 @@ QAbstract3DAxisPrivate::QAbstract3DAxisPrivate(QAbstract3DAxis *q, QAbstract3DAx m_isDefaultAxis(false), m_min(0.0f), m_max(10.0f), - m_autoAdjust(true) + m_autoAdjust(true), + m_labelAutoRotation(0.0f) { } diff --git a/src/datavisualization/axis/qabstract3daxis.h b/src/datavisualization/axis/qabstract3daxis.h index 2b2be229..286e87bd 100644 --- a/src/datavisualization/axis/qabstract3daxis.h +++ b/src/datavisualization/axis/qabstract3daxis.h @@ -40,6 +40,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DAxis : public QObject Q_PROPERTY(float min READ min WRITE setMin NOTIFY minChanged) Q_PROPERTY(float max READ max WRITE setMax NOTIFY maxChanged) Q_PROPERTY(bool autoAdjustRange READ isAutoAdjustRange WRITE setAutoAdjustRange NOTIFY autoAdjustRangeChanged) + Q_PROPERTY(float labelAutoRotation READ labelAutoRotation WRITE setLabelAutoRotation NOTIFY labelAutoRotationChanged REVISION 1) public: enum AxisOrientation { @@ -81,6 +82,9 @@ public: void setRange(float min, float max); + void setLabelAutoRotation(float angle); + float labelAutoRotation() const; + signals: void titleChanged(const QString &newTitle); void labelsChanged(); @@ -89,6 +93,7 @@ signals: void maxChanged(float value); void rangeChanged(float min, float max); void autoAdjustRangeChanged(bool autoAdjust); + Q_REVISION(1) void labelAutoRotationChanged(float angle); protected: QScopedPointer d_ptr; diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h index 38d5361c..eea3593c 100644 --- a/src/datavisualization/axis/qabstract3daxis_p.h +++ b/src/datavisualization/axis/qabstract3daxis_p.h @@ -67,6 +67,7 @@ protected: float m_min; float m_max; bool m_autoAdjust; + float m_labelAutoRotation; friend class QAbstract3DAxis; friend class QValue3DAxis; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 98fff81e..9ba39786 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -392,6 +392,24 @@ void Abstract3DController::synchDataToRenderer() } } + if (m_changeTracker.axisXLabelAutoRotationChanged) { + m_renderer->updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientationX, + m_axisX->labelAutoRotation()); + m_changeTracker.axisXLabelAutoRotationChanged = false; + } + + if (m_changeTracker.axisYLabelAutoRotationChanged) { + m_renderer->updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientationY, + m_axisY->labelAutoRotation()); + m_changeTracker.axisYLabelAutoRotationChanged = false; + } + + if (m_changeTracker.axisZLabelAutoRotationChanged) { + m_renderer->updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientationZ, + m_axisZ->labelAutoRotation()); + m_changeTracker.axisZLabelAutoRotationChanged = false; + } + if (m_changedSeriesList.size()) { m_renderer->modifiedSeriesList(m_changedSeriesList); m_changedSeriesList.clear(); @@ -1068,6 +1086,12 @@ void Abstract3DController::handleAxisFormatterDirty() handleAxisFormatterDirtyBySender(sender()); } +void Abstract3DController::handleAxisLabelAutoRotationChanged(float angle) +{ + Q_UNUSED(angle) + handleAxisLabelAutoRotationChangedBySender(sender()); +} + void Abstract3DController::handleInputViewChanged(QAbstract3DInputHandler::InputView view) { // When in automatic slicing mode, input view change to primary disables slice mode @@ -1167,6 +1191,20 @@ void Abstract3DController::handleAxisFormatterDirtyBySender(QObject *sender) emitNeedRender(); } +void Abstract3DController::handleAxisLabelAutoRotationChangedBySender(QObject *sender) +{ + if (sender == m_axisX) + m_changeTracker.axisXLabelAutoRotationChanged = true; + else if (sender == m_axisY) + m_changeTracker.axisYLabelAutoRotationChanged = true; + else if (sender == m_axisZ) + m_changeTracker.axisZLabelAutoRotationChanged = true; + else + qWarning() << __FUNCTION__ << "invoked for invalid axis"; + + emitNeedRender(); +} + void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { QAbstract3DSeries *series = static_cast(sender); @@ -1223,6 +1261,8 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient this, &Abstract3DController::handleAxisRangeChanged); QObject::connect(axis, &QAbstract3DAxis::autoAdjustRangeChanged, this, &Abstract3DController::handleAxisAutoAdjustRangeChanged); + QObject::connect(axis, &QAbstract3DAxis::labelAutoRotationChanged, + this, &Abstract3DController::handleAxisLabelAutoRotationChanged); if (orientation == QAbstract3DAxis::AxisOrientationX) m_changeTracker.axisXTypeChanged = true; @@ -1236,6 +1276,7 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient handleAxisRangeChangedBySender(axis); handleAxisAutoAdjustRangeChangedInOrientation(axis->orientation(), axis->isAutoAdjustRange()); + handleAxisLabelAutoRotationChangedBySender(axis); if (axis->type() & QAbstract3DAxis::AxisTypeValue) { QValue3DAxis *valueAxis = static_cast(axis); diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index bd78b6fa..e1b266ce 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -83,6 +83,9 @@ struct Abstract3DChangeBitField { bool axisYFormatterChanged : 1; bool axisZFormatterChanged : 1; bool projectionChanged : 1; + bool axisXLabelAutoRotationChanged : 1; + bool axisYLabelAutoRotationChanged : 1; + bool axisZLabelAutoRotationChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -117,7 +120,10 @@ struct Abstract3DChangeBitField { axisXFormatterChanged(true), axisYFormatterChanged(true), axisZFormatterChanged(true), - projectionChanged(true) + projectionChanged(true), + axisXLabelAutoRotationChanged(true), + axisYLabelAutoRotationChanged(true), + axisZLabelAutoRotationChanged(true) { } }; @@ -276,6 +282,7 @@ public: virtual void handleAxisLabelFormatChangedBySender(QObject *sender); virtual void handleAxisReversedChangedBySender(QObject *sender); virtual void handleAxisFormatterDirtyBySender(QObject *sender); + virtual void handleAxisLabelAutoRotationChangedBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; virtual void adjustAxisRanges() = 0; @@ -292,6 +299,7 @@ public slots: void handleAxisLabelFormatChanged(const QString &format); void handleAxisReversedChanged(bool enable); void handleAxisFormatterDirty(); + void handleAxisLabelAutoRotationChanged(float angle); void handleInputViewChanged(QAbstract3DInputHandler::InputView view); void handleInputPositionChanged(const QPoint &position); void handleSeriesVisibilityChanged(bool visible); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 06954165..a2181271 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -366,6 +366,14 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or cache->setDataDirty(true); } +void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, + float angle) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.labelAutoRotation() != angle) + cache.setLabelAutoRotation(angle); +} + void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) { foreach (QAbstract3DSeries *series, seriesList) { diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 5cfb88ae..ebe473b9 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -108,6 +108,8 @@ public: bool enable); virtual void updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, QValue3DAxisFormatter *formatter); + virtual void updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, + float angle); virtual void modifiedSeriesList(const QVector &seriesList); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index baa733b3..a90c9557 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -36,7 +36,8 @@ AxisRenderCache::AxisRenderCache() m_drawer(0), m_positionsDirty(true), m_translate(0.0f), - m_scale(1.0f) + m_scale(1.0f), + m_labelAutoRotation(0.0f) { } diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index 800421b1..c7f6574d 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -95,6 +95,8 @@ public: else return m_formatter->positionAt(value) * m_scale + m_translate; } + inline float labelAutoRotation() const { return m_labelAutoRotation; } + inline void setLabelAutoRotation(float angle) { m_labelAutoRotation = angle; } public slots: void updateTextures(); @@ -125,6 +127,7 @@ private: bool m_positionsDirty; float m_translate; float m_scale; + float m_labelAutoRotation; Q_DISABLE_COPY(AxisRenderCache) }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 459f8c25..537bb1ca 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -823,7 +823,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignLeft : Qt::AlignRight; Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barPosYAdjustment - zeroPosAdjustment @@ -849,7 +849,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->generateLabelItem(selectedItem->sliceLabelItem(), selectedItem->sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (selectedItem->height() < 0) ? Qt::AlignBottom : Qt::AlignTop; + Qt::AlignmentFlag alignment = (selectedItem->height() < 0) ? Qt::AlignLeft : Qt::AlignRight; Drawer::LabelPosition labelPos = (selectedItem->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(selectedItem->translation().x(), barPosYAdjustment - zeroPosAdjustment @@ -893,7 +893,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->drawLabel(m_dummyBarRenderItem, m_axisCacheY.titleItem(), viewMatrix, projectionMatrix, zeroVector, QVector3D(0.0f, 0.0f, 90.0f), 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, - false, false, Drawer::LabelMid, Qt::AlignHCenter); + false, false, Drawer::LabelMid, Qt::AlignBottom); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); @@ -1879,6 +1879,11 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer glEnable(GL_POLYGON_OFFSET_FILL); + float labelAutoAngle = m_axisCacheY.labelAutoRotation(); + float labelAngleFraction = labelAutoAngle / 90.0f; + float fractionCamY = activeCamera->yRotation() * labelAngleFraction; + float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + // Y Labels int labelNbr = 0; int labelCount = m_axisCacheY.labelCount(); @@ -1888,20 +1893,42 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer GLfloat labelZTrans = columnScaleFactor; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = Qt::AlignLeft; - Qt::AlignmentFlag sideAlignment = Qt::AlignLeft; + Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; - backLabelRotation.setY(90.0f); - sideAlignment = Qt::AlignRight; } if (m_zFlipped) { labelZTrans = -labelZTrans; labelMarginZTrans = -labelMargin; - backAlignment = Qt::AlignRight; - sideLabelRotation.setY(180.f); } + + if (labelAutoAngle == 0.0f) { + if (!m_xFlipped) + backLabelRotation.setY(90.0f); + if (m_zFlipped) + sideLabelRotation.setY(180.f); + } else { + // Orient side labels somewhat towards the camera + if (m_xFlipped) { + if (m_zFlipped) + sideLabelRotation.setY(180.0f + (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(-90.0f + labelAutoAngle - fractionCamX); + } else { + if (m_zFlipped) + sideLabelRotation.setY(180.0f - (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(90.0f - labelAutoAngle - fractionCamX); + } + } + sideLabelRotation.setX(-fractionCamY); + backLabelRotation.setX(-fractionCamY); + QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, @@ -1941,6 +1968,10 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer // Z labels // Calculate the positions for row and column labels and store them + labelAutoAngle = m_axisCacheZ.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; GLfloat labelYAdjustment = 0.005f; GLfloat scaledRowWidth = rowScaleFactor; GLfloat scaledColumnDepth = columnScaleFactor; @@ -1948,18 +1979,70 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer GLfloat rowPosValue = scaledColumnDepth + labelMargin; GLfloat rowPos = 0.0f; GLfloat colPos = 0.0f; - QVector3D labelRotation(-90.0f, 0.0f, 0.0f); - if (m_zFlipped) - labelRotation.setY(180.0f); - if (m_yFlipped) { + Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + QVector3D labelRotation; + + if (labelAutoAngle == 0.0f) { + labelRotation.setX(-90.0f); + if (m_zFlipped) + labelRotation.setY(180.0f); + if (m_yFlipped) { + if (m_zFlipped) + labelRotation.setY(0.0f); + else + labelRotation.setY(180.0f); + labelRotation.setZ(180.0f); + } + } else { if (m_zFlipped) - labelRotation.setY(0.0f); - else labelRotation.setY(180.0f); - labelRotation.setZ(180.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + (labelAutoAngle - fractionCamX) + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } + } } - Qt::AlignmentFlag alignment = m_xFlipped ? Qt::AlignLeft : Qt::AlignRight; for (int row = 0; row != m_cachedRowCount; row++) { if (m_axisCacheZ.labelItems().size() > row) { // Go through all rows and get position of max+1 or min-1 column, depending on x flip @@ -1991,19 +2074,76 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer false, drawSelection); } } - labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); - if (m_xFlipped) - labelRotation.setY(-90.0f); - if (m_yFlipped) { + + // X labels + labelAutoAngle = m_axisCacheX.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; + alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + if (labelAutoAngle == 0.0f) { + labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); + if (m_xFlipped) + labelRotation.setY(-90.0f); + if (m_yFlipped) { + if (m_xFlipped) + labelRotation.setY(90.0f); + else + labelRotation.setY(-90.0f); + labelRotation.setZ(180.0f); + } + } else { if (m_xFlipped) - labelRotation.setY(90.0f); - else labelRotation.setY(-90.0f); - labelRotation.setZ(180.0f); + else + labelRotation.setY(90.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + fractionCamX + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f - fractionCamX + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - fractionCamX + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f + fractionCamX + * -(labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } + } } - // X labels - alignment = m_zFlipped ? Qt::AlignRight : Qt::AlignLeft; for (int column = 0; column != m_cachedColumnCount; column++) { if (m_axisCacheX.labelItems().size() > column) { // Go through all columns and get position of max+1 or min-1 row, depending on z flip @@ -2036,6 +2176,20 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } } +#if 0 // Debug label + static LabelItem debugLabelItem; + QString debugLabelString(QStringLiteral("Flips: x:%1 y:%2 z:%3")); + QString finalDebugString = debugLabelString.arg(m_xFlipped).arg(m_yFlipped).arg(m_zFlipped); + m_dummyBarRenderItem.setTranslation(QVector3D(m_xFlipped ? -1.5f : 1.5f, + m_yFlipped ? 1.5f : -1.5f, + m_zFlipped ? -1.5f : 1.5f)); + + m_drawer->generateLabelItem(debugLabelItem, finalDebugString); + m_drawer->drawLabel(m_dummyBarRenderItem, debugLabelItem, viewMatrix, projectionMatrix, + zeroVector, labelRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, false, Drawer::LabelMid, Qt::AlignHCenter, false, drawSelection); +#endif glDisable(GL_POLYGON_OFFSET_FILL); } diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index ff48d71c..0e336019 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -299,58 +299,22 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte GLfloat scaleFactor = scaledFontSize / (GLfloat)textureSize.height(); // Apply alignment - GLfloat xAlignment = 0.0f; - GLfloat yAlignment = 0.0f; - GLfloat zAlignment = 0.0f; - GLfloat sinRotY = qFabs(qSin(qDegreesToRadians(rotation.y()))); - GLfloat cosRotY = qFabs(qCos(qDegreesToRadians(rotation.y()))); - GLfloat sinRotZ = 0.0f; - GLfloat cosRotZ = 0.0f; - if (rotation.z()) { - sinRotZ = qFabs(qSin(qDegreesToRadians(rotation.z()))); - cosRotZ = qFabs(qCos(qDegreesToRadians(rotation.z()))); - } + QVector3D anchorPoint; switch (alignment) { case Qt::AlignLeft: { - if (rotation.z() && rotation.z() != 180.0f && !rotation.y()) { - xAlignment = ((-(GLfloat)textureSize.width() * scaleFactor) * cosRotZ - - ((GLfloat)textureSize.height() * scaleFactor) * sinRotZ) / 2.0f; - yAlignment = (((GLfloat)textureSize.width() * scaleFactor) * sinRotZ - + ((GLfloat)textureSize.height() * scaleFactor) * cosRotZ) / 2.0f; - } else { - xAlignment = (-(GLfloat)textureSize.width() * scaleFactor) * cosRotY; - zAlignment = ((GLfloat)textureSize.width() * scaleFactor) * sinRotY; - } + anchorPoint.setX(float(-textureSize.width()) * scaleFactor); break; } case Qt::AlignRight: { - if (rotation.z() && rotation.z() != 180.0f && !rotation.y()) { - xAlignment = (((GLfloat)textureSize.width() * scaleFactor) * cosRotZ - + ((GLfloat)textureSize.height() * scaleFactor) * sinRotZ) / 2.0f; - yAlignment = (((GLfloat)textureSize.width() * scaleFactor) * sinRotZ - + ((GLfloat)textureSize.height() * scaleFactor) * cosRotZ) / 2.0f; - } else { - xAlignment = ((GLfloat)textureSize.width() * scaleFactor) * cosRotY; - zAlignment = (-(GLfloat)textureSize.width() * scaleFactor) * sinRotY; - } + anchorPoint.setX(float(textureSize.width()) * scaleFactor); break; } case Qt::AlignTop: { - yAlignment = ((GLfloat)textureSize.width() * scaleFactor) * cosRotY; + anchorPoint.setY(float(-textureSize.height()) * scaleFactor); break; } case Qt::AlignBottom: { - yAlignment = (-(GLfloat)textureSize.width() * scaleFactor) * cosRotY; - break; - } - case Qt::AlignHCenter: { - xAlignment = (-(GLfloat)textureSize.width() * scaleFactor) * cosRotZ - - ((GLfloat)textureSize.height() * scaleFactor) * sinRotZ; - break; - } - case Qt::AlignVCenter: { - yAlignment = ((GLfloat)textureSize.width() * scaleFactor) * cosRotZ - + ((GLfloat)textureSize.height() * scaleFactor) * sinRotZ; + anchorPoint.setY(float(textureSize.height()) * scaleFactor); break; } default: { @@ -367,15 +331,9 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte } // Position label - modelMatrix.translate(xPosition + xAlignment, yPosition + yAlignment, zPosition + zAlignment); + modelMatrix.translate(xPosition, yPosition, zPosition); // Rotate - QQuaternion rotQuatX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, rotation.x()); - QQuaternion rotQuatY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, rotation.y()); - QQuaternion rotQuatZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, rotation.z()); - QQuaternion rotQuaternion = rotQuatY * rotQuatZ * rotQuatX; - modelMatrix.rotate(rotQuaternion); - if (useDepth && !rotateAlong) { float yComp = float(qRadiansToDegrees(qTan(positionComp.y() / cameraDistance))); // Apply negative camera rotations to keep labels facing camera @@ -383,7 +341,14 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte float camRotationY = camera->yRotation(); modelMatrix.rotate(-camRotationX, 0.0f, 1.0f, 0.0f); modelMatrix.rotate(-camRotationY - yComp, 1.0f, 0.0f, 0.0f); + } else { + QQuaternion rotQuatX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, rotation.x()); + QQuaternion rotQuatY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, rotation.y()); + QQuaternion rotQuatZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, rotation.z()); + QQuaternion rotQuaternion = rotQuatY * rotQuatZ * rotQuatX; + modelMatrix.rotate(rotQuaternion); } + modelMatrix.translate(anchorPoint); // Scale label based on text size modelMatrix.scale(QVector3D((GLfloat)textureSize.width() * scaleFactor, diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 70fb7ed2..3fd8ece4 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1349,6 +1349,11 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa glEnable(GL_POLYGON_OFFSET_FILL); + float labelAutoAngle = m_axisCacheZ.labelAutoRotation(); + float labelAngleFraction = labelAutoAngle / 90.0f; + float fractionCamY = activeCamera->yRotation() * labelAngleFraction; + float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + // Z Labels if (m_axisCacheZ.segmentCount() > 0) { int labelCount = m_axisCacheZ.labelCount(); @@ -1362,22 +1367,72 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; - GLfloat rotLabelX = -90.0f; - GLfloat rotLabelY = 0.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignment = Qt::AlignRight; - if (m_zFlipped) - rotLabelY = 180.0f; - if (m_xFlipped) { + Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + QVector3D labelRotation; + if (m_xFlipped) labelXTrans = -labelXTrans; - alignment = Qt::AlignLeft; - } - if (m_yFlipped) { - rotLabelZ += 180.0f; - rotLabelY += 180.0f; + if (m_yFlipped) labelYTrans = -labelYTrans; + if (labelAutoAngle == 0.0f) { + labelRotation.setX(-90.0f); + if (m_zFlipped) + labelRotation.setY(180.0f); + if (m_yFlipped) { + if (m_zFlipped) + labelRotation.setY(0.0f); + else + labelRotation.setY(180.0f); + labelRotation.setZ(180.0f); + } + } else { + if (m_zFlipped) + labelRotation.setY(180.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + (labelAutoAngle - fractionCamX) + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } + } } - QVector3D labelRotateVector(rotLabelX, rotLabelY, rotLabelZ); QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); for (int label = 0; label < labelCount; label++) { if (m_axisCacheZ.labelItems().size() > labelNbr) { @@ -1396,7 +1451,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotateVector, 0, m_cachedSelectionMode, + zeroVector, labelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1405,6 +1460,10 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } // X Labels if (m_axisCacheX.segmentCount() > 0) { + labelAutoAngle = m_axisCacheX.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheX.labelCount(); #ifndef USE_UNIFORM_SCALING GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) @@ -1416,22 +1475,75 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; - GLfloat rotLabelX = -90.0f; - GLfloat rotLabelY = 90.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignment = Qt::AlignLeft; - if (m_xFlipped) - rotLabelY = -90.0f; - if (m_zFlipped) { + Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + QVector3D labelRotation; + if (m_zFlipped) labelZTrans = -labelZTrans; - alignment = Qt::AlignRight; - } - if (m_yFlipped) { - rotLabelZ += 180.0f; - rotLabelY += 180.0f; + if (m_yFlipped) labelYTrans = -labelYTrans; + if (labelAutoAngle == 0.0f) { + labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); + if (m_xFlipped) + labelRotation.setY(-90.0f); + if (m_yFlipped) { + if (m_xFlipped) + labelRotation.setY(90.0f); + else + labelRotation.setY(-90.0f); + labelRotation.setZ(180.0f); + } + } else { + if (m_xFlipped) + labelRotation.setY(-90.0f); + else + labelRotation.setY(90.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + fractionCamX + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f - fractionCamX + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - fractionCamX + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f + fractionCamX + * -(labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } + } } - QVector3D labelRotateVector(rotLabelX, rotLabelY, rotLabelZ); + QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); for (int label = 0; label < labelCount; label++) { if (m_axisCacheX.labelItems().size() > labelNbr) { @@ -1450,7 +1562,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotateVector, 0, m_cachedSelectionMode, + zeroVector, labelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1459,6 +1571,10 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } // Y Labels if (m_axisCacheY.segmentCount() > 0) { + labelAutoAngle = m_axisCacheY.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z @@ -1474,38 +1590,46 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa GLfloat labelXTrans = aspectRatio + m_backgroundMargin; GLfloat labelZTrans = labelXTrans; #endif - // Back wall init + // Back & side wall GLfloat labelMarginXTrans = labelMargin; GLfloat labelMarginZTrans = labelMargin; - GLfloat rotLabelX = 0.0f; - GLfloat rotLabelY = -90.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignmentBack = Qt::AlignLeft; + QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); + QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); + Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; - rotLabelY = 90.0f; } if (m_zFlipped) { labelZTrans = -labelZTrans; labelMarginZTrans = -labelMargin; - alignmentBack = Qt::AlignRight; } - QVector3D labelRotateVectorBack(rotLabelX, rotLabelY, rotLabelZ); - QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); - - // Side wall init - Qt::AlignmentFlag alignmentSide = Qt::AlignLeft; - if (m_xFlipped) - alignmentSide = Qt::AlignLeft; - else - alignmentSide = Qt::AlignRight; - if (m_zFlipped) - rotLabelY = 180.0f; - else - rotLabelY = 0.0f; + if (labelAutoAngle == 0.0f) { + if (!m_xFlipped) + backLabelRotation.setY(90.0f); + if (m_zFlipped) + sideLabelRotation.setY(180.f); + } else { + // Orient side labels somewhat towards the camera + if (m_xFlipped) { + if (m_zFlipped) + sideLabelRotation.setY(180.0f + (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(-90.0f + labelAutoAngle - fractionCamX); + } else { + if (m_zFlipped) + sideLabelRotation.setY(180.0f - (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(90.0f - labelAutoAngle - fractionCamX); + } + } + sideLabelRotation.setX(-fractionCamY); + backLabelRotation.setX(-fractionCamY); - QVector3D labelRotateVectorSide(rotLabelX, rotLabelY, rotLabelZ); + QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); for (int label = 0; label < labelCount; label++) { @@ -1525,17 +1649,17 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotateVectorBack, 0, m_cachedSelectionMode, + zeroVector, backLabelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignmentBack); + Drawer::LabelMid, backAlignment); // Side wall labelTransSide.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotateVectorSide, 0, m_cachedSelectionMode, + zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignmentSide); + Drawer::LabelMid, sideAlignment); } labelNbr++; } diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 30ffc381..b68a8087 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1016,7 +1016,7 @@ void Surface3DRenderer::drawSlicedScene() m_drawer->drawLabel(m_dummyRenderItem, m_axisCacheY.titleItem(), viewMatrix, projectionMatrix, zeroVector, QVector3D(0.0f, 0.0f, 90.0f), 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, - false, false, Drawer::LabelMid, Qt::AlignHCenter); + false, false, Drawer::LabelMid, Qt::AlignBottom); glDisable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); @@ -1836,6 +1836,11 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa glEnable(GL_POLYGON_OFFSET_FILL); + float labelAutoAngle = m_axisCacheZ.labelAutoRotation(); + float labelAngleFraction = labelAutoAngle / 90.0f; + float fractionCamY = activeCamera->yRotation() * labelAngleFraction; + float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + // Z Labels QVector3D positionZComp(0.0f, 0.0f, 0.0f); if (m_axisCacheZ.segmentCount() > 0) { @@ -1843,25 +1848,76 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; - GLfloat rotLabelX = -90.0f; - GLfloat rotLabelY = 0.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignment = Qt::AlignRight; - if (m_zFlipped) - rotLabelY = 180.0f; - if (m_xFlipped) { + Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + QVector3D labelRotation; + if (m_xFlipped) labelXTrans = -labelXTrans; - alignment = Qt::AlignLeft; - } - if (m_yFlipped) { - rotLabelZ += 180.0f; - rotLabelY += 180.0f; + if (m_yFlipped) labelYTrans = -labelYTrans; + if (labelAutoAngle == 0.0f) { + labelRotation.setX(-90.0f); + if (m_zFlipped) + labelRotation.setY(180.0f); + if (m_yFlipped) { + if (m_zFlipped) + labelRotation.setY(0.0f); + else + labelRotation.setY(180.0f); + labelRotation.setZ(180.0f); + } + } else { + if (m_zFlipped) + labelRotation.setY(180.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + (labelAutoAngle - fractionCamX) + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f - (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - (labelAutoAngle - fractionCamX) + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } + } } + QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); - QVector3D rotation(rotLabelX, rotLabelY, rotLabelZ); for (int label = 0; label < labelCount; label++) { if (m_axisCacheZ.labelItems().size() > labelNbr) { @@ -1878,7 +1934,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, rotation, 0, m_cachedSelectionMode, + positionZComp, labelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1887,30 +1943,86 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } // X Labels if (m_axisCacheX.segmentCount() > 0) { + labelAutoAngle = m_axisCacheX.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheX.labelCount(); int labelNbr = 0; GLfloat labelZTrans = m_scaleZWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; - GLfloat rotLabelX = -90.0f; - GLfloat rotLabelY = 90.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignment = Qt::AlignLeft; - if (m_xFlipped) - rotLabelY = -90.0f; - if (m_zFlipped) { + Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + QVector3D labelRotation; + if (m_zFlipped) labelZTrans = -labelZTrans; - alignment = Qt::AlignRight; - } - if (m_yFlipped) { - rotLabelZ += 180.0f; - rotLabelY += 180.0f; + if (m_yFlipped) labelYTrans = -labelYTrans; + if (labelAutoAngle == 0.0f) { + labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); + if (m_xFlipped) + labelRotation.setY(-90.0f); + if (m_yFlipped) { + if (m_xFlipped) + labelRotation.setY(90.0f); + else + labelRotation.setY(-90.0f); + labelRotation.setZ(180.0f); + } + } else { + if (m_xFlipped) + labelRotation.setY(-90.0f); + else + labelRotation.setY(90.0f); + if (m_yFlipped) { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(90.0f - (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(90.0f + fractionCamX + * -(labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(90.0f - fractionCamX + * (-labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle - fractionCamY); + } + } + } else { + if (m_zFlipped) { + if (m_xFlipped) { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle - fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } else { + labelRotation.setX(-90.0f + (2.0f * labelAutoAngle + fractionCamX) + * (labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } + } else { + if (m_xFlipped) { + labelRotation.setX(-90.0f - fractionCamX + * (-labelAutoAngle + fractionCamY) / labelAutoAngle); + labelRotation.setZ(-labelAutoAngle + fractionCamY); + } else { + labelRotation.setX(-90.0f + fractionCamX + * -(labelAutoAngle - fractionCamY) / labelAutoAngle); + labelRotation.setZ(labelAutoAngle - fractionCamY); + } + } + } } QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); - QVector3D rotation(rotLabelX, rotLabelY, rotLabelZ); for (int label = 0; label < labelCount; label++) { if (m_axisCacheX.labelItems().size() > labelNbr) { @@ -1927,7 +2039,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, rotation, 0, m_cachedSelectionMode, + positionZComp, labelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1936,44 +2048,56 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } // Y Labels if (m_axisCacheY.segmentCount() > 0) { + labelAutoAngle = m_axisCacheY.labelAutoRotation(); + labelAngleFraction = labelAutoAngle / 90.0f; + fractionCamY = activeCamera->yRotation() * labelAngleFraction; + fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground; GLfloat labelZTrans = m_scaleZWithBackground; - // Back wall init + // Back & side wall GLfloat labelMarginXTrans = labelMargin; GLfloat labelMarginZTrans = labelMargin; - GLfloat rotLabelX = 0.0f; - GLfloat rotLabelY = -90.0f; - GLfloat rotLabelZ = 0.0f; - Qt::AlignmentFlag alignmentBack = Qt::AlignLeft; + QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); + QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); + Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; - rotLabelY = 90.0f; } if (m_zFlipped) { labelZTrans = -labelZTrans; labelMarginZTrans = -labelMargin; - alignmentBack = Qt::AlignRight; } - QVector3D labelRotateVectorBack(rotLabelX, rotLabelY, rotLabelZ); - QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); - - // Side wall init - Qt::AlignmentFlag alignmentSide = Qt::AlignLeft; - if (m_xFlipped) - alignmentSide = Qt::AlignLeft; - else - alignmentSide = Qt::AlignRight; - if (m_zFlipped) - rotLabelY = 180.0f; - else - rotLabelY = 0.0f; + if (labelAutoAngle == 0.0f) { + if (!m_xFlipped) + backLabelRotation.setY(90.0f); + if (m_zFlipped) + sideLabelRotation.setY(180.f); + } else { + // Orient side labels somewhat towards the camera + if (m_xFlipped) { + if (m_zFlipped) + sideLabelRotation.setY(180.0f + (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(-90.0f + labelAutoAngle - fractionCamX); + } else { + if (m_zFlipped) + sideLabelRotation.setY(180.0f - (2.0f * labelAutoAngle) - fractionCamX); + else + sideLabelRotation.setY(-fractionCamX); + backLabelRotation.setY(90.0f - labelAutoAngle - fractionCamX); + } + } + sideLabelRotation.setX(-fractionCamY); + backLabelRotation.setX(-fractionCamY); - QVector3D labelRotateVectorSide(rotLabelX, rotLabelY, rotLabelZ); + QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); for (int label = 0; label < labelCount; label++) { @@ -1993,17 +2117,17 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, labelRotateVectorBack, 0, m_cachedSelectionMode, + positionZComp, backLabelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignmentBack); + true, true, Drawer::LabelMid, backAlignment); // Side wall labelTransSide.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, labelRotateVectorSide, 0, m_cachedSelectionMode, + positionZComp, sideLabelRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignmentSide); + true, true, Drawer::LabelMid, sideAlignment); } labelNbr++; } diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index 8e89109e..f90ffb4b 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -87,11 +87,13 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // QtDataVisualization 1.1 // New revisions - qmlRegisterType(uri, 1, 1, "ValueAxis3D"); + qmlRegisterUncreatableType(uri, 1, 1, "AbstractAxis3D", + QLatin1String("Trying to create uncreatable: AbstractAxis.")); qmlRegisterUncreatableType(uri, 1, 1, "Abstract3DSeries", QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); + qmlRegisterType(uri, 1, 1, "ValueAxis3D"); qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); qmlRegisterType(uri, 1, 1, "ItemModelSurfaceDataProxy"); qmlRegisterType(uri, 1, 1, "ItemModelScatterDataProxy"); -- cgit v1.2.3 From 806fd8ab43dd59da89d04651b22c5c0440032b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 10:16:11 +0300 Subject: Added property for disabling shadows on custom items Task-number: QTRD-3093 Change-Id: Ia24a1bc657af1bb1a528581e1f65fb50277e6874 Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 17 ++ .../datavisualization/customitems/customitems.qrc | 1 + examples/datavisualization/customitems/pipe.obj | 330 +++++++++++++++++++++ src/datavisualization/data/customrenderitem_p.h | 3 + src/datavisualization/data/qcustom3ditem.cpp | 58 +++- src/datavisualization/data/qcustom3ditem.h | 15 +- src/datavisualization/data/qcustom3ditem_p.h | 5 +- ...tdatavisualization-qml-abstractdeclarative.qdoc | 4 + .../engine/abstract3drenderer.cpp | 7 +- src/datavisualization/engine/qabstract3dgraph.cpp | 5 + tests/qmlcamera/qml/qmlcamera/main.qml | 1 + 11 files changed, 431 insertions(+), 15 deletions(-) create mode 100644 examples/datavisualization/customitems/pipe.obj diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index aeae61e9..be51f1f0 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -109,6 +109,7 @@ void CustomItemGraph::toggleItemOne(bool show) //! [1] QVector3D positionOne = QVector3D(39.0f, 77.0f, 19.2f); //! [1] + QVector3D positionOnePipe = QVector3D(39.0f, 45.0f, 19.2f); if (show) { //! [0] QImage color = QImage(2, 2, QImage::Format_RGB32); @@ -123,17 +124,25 @@ void CustomItemGraph::toggleItemOne(bool show) //! [3] m_graph->addCustomItem(item); //! [3] + item = new QCustom3DItem(":/items/pipe.obj", positionOnePipe, + QVector3D(0.005f, 0.5f, 0.005f), + QQuaternion(), + color); + item->setShadowCasting(false); + m_graph->addCustomItem(item); } else { resetSelection(); //! [4] m_graph->removeCustomItemAt(positionOne); //! [4] + m_graph->removeCustomItemAt(positionOnePipe); } } void CustomItemGraph::toggleItemTwo(bool show) { QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f); + QVector3D positionTwoPipe = QVector3D(34.5f, 45.0f, 23.4f); if (show) { QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::red); @@ -144,9 +153,16 @@ void CustomItemGraph::toggleItemTwo(bool show) item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f)); item->setTextureImage(color); m_graph->addCustomItem(item); + item = new QCustom3DItem(":/items/pipe.obj", positionTwoPipe, + QVector3D(0.005f, 0.5f, 0.005f), + QQuaternion(), + color); + item->setShadowCasting(false); + m_graph->addCustomItem(item); } else { resetSelection(); m_graph->removeCustomItemAt(positionTwo); + m_graph->removeCustomItemAt(positionTwoPipe); } } @@ -221,6 +237,7 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) m_selectionAnimation->setStartValue(item->scaling()); m_selectionAnimation->setEndValue(item->scaling() * 1.5f); m_selectionAnimation->start(); + item->setShadowCasting(false); } else if (type == QAbstract3DGraph::ElementSeries) { QString text = "Surface ("; QSurface3DSeries *series = m_graph->selectedSeries(); diff --git a/examples/datavisualization/customitems/customitems.qrc b/examples/datavisualization/customitems/customitems.qrc index af91d645..1337c9fc 100644 --- a/examples/datavisualization/customitems/customitems.qrc +++ b/examples/datavisualization/customitems/customitems.qrc @@ -7,5 +7,6 @@ refinery.obj oilrig.obj + pipe.obj diff --git a/examples/datavisualization/customitems/pipe.obj b/examples/datavisualization/customitems/pipe.obj new file mode 100644 index 00000000..6ccbb286 --- /dev/null +++ b/examples/datavisualization/customitems/pipe.obj @@ -0,0 +1,330 @@ +# Blender v2.66 (sub 0) OBJ File: 'cylinder.blend' +# www.blender.org +o Cylinder +v 0.000000 -1.000000 -1.000000 +v 0.000000 1.000000 -1.000000 +v 0.195090 -1.000000 -0.980785 +v 0.195090 1.000000 -0.980785 +v 0.382683 -1.000000 -0.923880 +v 0.382683 1.000000 -0.923880 +v 0.555570 -1.000000 -0.831470 +v 0.555570 1.000000 -0.831470 +v 0.707107 -1.000000 -0.707107 +v 0.707107 1.000000 -0.707107 +v 0.831470 -1.000000 -0.555570 +v 0.831470 1.000000 -0.555570 +v 0.923880 -1.000000 -0.382683 +v 0.923880 1.000000 -0.382683 +v 0.980785 -1.000000 -0.195090 +v 0.980785 1.000000 -0.195090 +v 1.000000 -1.000000 -0.000000 +v 1.000000 1.000000 -0.000000 +v 0.980785 -1.000000 0.195090 +v 0.980785 1.000000 0.195090 +v 0.923880 -1.000000 0.382683 +v 0.923880 1.000000 0.382683 +v 0.831470 -1.000000 0.555570 +v 0.831470 1.000000 0.555570 +v 0.707107 -1.000000 0.707107 +v 0.707107 1.000000 0.707107 +v 0.555570 -1.000000 0.831470 +v 0.555570 1.000000 0.831470 +v 0.382683 -1.000000 0.923880 +v 0.382683 1.000000 0.923880 +v 0.195090 -1.000000 0.980785 +v 0.195090 1.000000 0.980785 +v -0.000000 -1.000000 1.000000 +v -0.000000 1.000000 1.000000 +v -0.195091 -1.000000 0.980785 +v -0.195091 1.000000 0.980785 +v -0.382684 -1.000000 0.923879 +v -0.382684 1.000000 0.923879 +v -0.555571 -1.000000 0.831469 +v -0.555571 1.000000 0.831469 +v -0.707107 -1.000000 0.707106 +v -0.707107 1.000000 0.707106 +v -0.831470 -1.000000 0.555570 +v -0.831470 1.000000 0.555570 +v -0.923880 -1.000000 0.382683 +v -0.923880 1.000000 0.382683 +v -0.980785 -1.000000 0.195089 +v -0.980785 1.000000 0.195089 +v -1.000000 -1.000000 -0.000001 +v -1.000000 1.000000 -0.000001 +v -0.980785 -1.000000 -0.195091 +v -0.980785 1.000000 -0.195091 +v -0.923879 -1.000000 -0.382684 +v -0.923879 1.000000 -0.382684 +v -0.831469 -1.000000 -0.555571 +v -0.831469 1.000000 -0.555571 +v -0.707106 -1.000000 -0.707108 +v -0.707106 1.000000 -0.707108 +v -0.555569 -1.000000 -0.831470 +v -0.555569 1.000000 -0.831470 +v -0.382682 -1.000000 -0.923880 +v -0.382682 1.000000 -0.923880 +v -0.195089 -1.000000 -0.980786 +v -0.195089 1.000000 -0.980786 +vt 0.289718 0.879351 +vt 0.288367 0.438844 +vt 0.330714 0.438714 +vt 0.332066 0.879221 +vt 0.370605 0.438592 +vt 0.371956 0.879099 +vt 0.406505 0.438482 +vt 0.407857 0.878988 +vt 0.437036 0.438388 +vt 0.778904 0.000000 +vt 0.780256 0.440507 +vt 0.749725 0.440601 +vt 0.748373 0.000094 +vt 0.713824 0.440711 +vt 0.712473 0.000204 +vt 0.673934 0.440833 +vt 0.672582 0.000326 +vt 0.631586 0.440963 +vt 0.630235 0.000456 +vt 0.588409 0.441095 +vt 0.587057 0.000588 +vt 0.546061 0.441225 +vt 0.544710 0.000718 +vt 0.506171 0.441348 +vt 0.504819 0.000841 +vt 0.470270 0.441458 +vt 0.468919 0.000951 +vt 0.439739 0.441552 +vt 0.720545 0.882916 +vt 0.719194 0.442409 +vt 0.755094 0.442299 +vt 0.756446 0.882806 +vt 0.794985 0.442176 +vt 0.796336 0.882683 +vt 0.837333 0.442046 +vt 0.838684 0.882553 +vt 0.881861 0.882421 +vt 0.880510 0.441914 +vt 0.924209 0.882291 +vt 0.922857 0.441784 +vt 0.964099 0.882168 +vt 0.962748 0.441662 +vt 1.000000 0.882058 +vt 0.717842 0.441552 +vt 0.719194 0.882058 +vt 0.681942 0.441662 +vt 0.683293 0.882169 +vt 0.642051 0.441784 +vt 0.643403 0.882291 +vt 0.599704 0.441914 +vt 0.601055 0.882421 +vt 0.556526 0.442046 +vt 0.557878 0.882553 +vt 0.514179 0.442176 +vt 0.515530 0.882683 +vt 0.474288 0.442299 +vt 0.475640 0.882806 +vt 0.438388 0.442409 +vt 0.097872 0.879939 +vt 0.096520 0.439433 +vt 0.128403 0.879846 +vt 0.127051 0.439339 +vt 0.164303 0.879735 +vt 0.162952 0.439229 +vt 0.204194 0.879613 +vt 0.000000 0.197605 +vt 0.008423 0.155257 +vt 0.000000 0.240783 +vt 0.246541 0.879483 +vt 0.245190 0.438976 +vt 0.202842 0.439106 +vt 0.438388 0.878895 +vt 0.438388 0.001045 +vt 0.998649 0.441552 +vt 0.439739 0.882916 +vt 0.024947 0.115367 +vt 0.048935 0.079466 +vt 0.079466 0.048935 +vt 0.115366 0.024947 +vt 0.155257 0.008424 +vt 0.197605 0.000000 +vt 0.240782 0.000000 +vt 0.283130 0.008423 +vt 0.323021 0.024947 +vt 0.358922 0.048935 +vt 0.389453 0.079466 +vt 0.413441 0.115367 +vt 0.429964 0.155257 +vt 0.438388 0.197605 +vt 0.438388 0.240783 +vt 0.429964 0.283130 +vt 0.413441 0.323021 +vt 0.389453 0.358922 +vt 0.358922 0.389453 +vt 0.323021 0.413441 +vt 0.283130 0.429964 +vt 0.240783 0.438388 +vt 0.197605 0.438388 +vt 0.155257 0.429964 +vt 0.115367 0.413441 +vt 0.079466 0.389453 +vt 0.048935 0.358922 +vt 0.024947 0.323021 +vt 0.008423 0.283130 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.685690 -0.727866 +vn 0.142003 0.685690 -0.713889 +vn 0.195074 0.000000 -0.980773 +vn 0.278542 0.685690 -0.672475 +vn 0.382672 0.000000 -0.923856 +vn 0.404370 0.685690 -0.605213 +vn 0.555559 0.000000 -0.831446 +vn 0.514664 0.685690 -0.514664 +vn 0.707083 0.000000 -0.707083 +vn 0.605213 0.685690 -0.404370 +vn 0.831446 0.000000 -0.555559 +vn 0.672475 0.685690 -0.278542 +vn 0.923856 0.000000 -0.382672 +vn 0.713889 0.685690 -0.142003 +vn 0.980773 0.000000 -0.195074 +vn 0.727866 0.685690 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.713889 0.685690 0.142003 +vn 0.980773 0.000000 0.195074 +vn 0.672475 0.685690 0.278542 +vn 0.923856 0.000000 0.382672 +vn 0.605213 0.685690 0.404370 +vn 0.831446 0.000000 0.555559 +vn 0.514664 0.685690 0.514664 +vn 0.707083 0.000000 0.707083 +vn 0.404370 0.685690 0.605213 +vn 0.555559 0.000000 0.831446 +vn 0.278542 0.685690 0.672475 +vn 0.382672 0.000000 0.923856 +vn 0.142003 0.685690 0.713889 +vn 0.195074 0.000000 0.980773 +vn 0.000000 0.685690 0.727866 +vn 0.000000 0.000000 0.999969 +vn -0.195074 0.000000 0.980773 +vn -0.142003 0.685690 0.713889 +vn -0.382672 0.000000 0.923856 +vn -0.278542 0.685690 0.672475 +vn -0.555559 0.000000 0.831446 +vn -0.404370 0.685690 0.605213 +vn -0.707083 0.000000 0.707083 +vn -0.514664 0.685690 0.514664 +vn -0.831446 0.000000 0.555559 +vn -0.605213 0.685690 0.404370 +vn -0.923856 0.000000 0.382672 +vn -0.672475 0.685690 0.278542 +vn -0.980773 0.000000 0.195074 +vn -0.713889 0.685690 0.142003 +vn -1.000000 0.000000 0.000000 +vn -0.727866 0.685690 0.000000 +vn -0.980773 0.000000 -0.195074 +vn -0.713889 0.685690 -0.142003 +vn -0.923856 0.000000 -0.382672 +vn -0.672475 0.685690 -0.278542 +vn -0.831446 0.000000 -0.555559 +vn -0.605213 0.685690 -0.404370 +vn -0.707083 0.000000 -0.707083 +vn -0.514664 0.685690 -0.514695 +vn -0.555559 0.000000 -0.831446 +vn -0.404370 0.685690 -0.605213 +vn -0.382672 0.000000 -0.923856 +vn -0.195074 0.000000 -0.980773 +vn -0.142003 0.685690 -0.713889 +vn -0.278542 0.685690 -0.672475 +s 1 +f 1/1/1 2/2/2 4/3/3 +f 3/4/4 4/3/3 6/5/5 +f 5/6/6 6/5/5 8/7/7 +f 7/8/8 8/7/7 10/9/9 +f 9/10/10 10/11/9 12/12/11 +f 11/13/12 12/12/11 14/14/13 +f 13/15/14 14/14/13 16/16/15 +f 15/17/16 16/16/15 18/18/17 +f 17/19/18 18/18/17 20/20/19 +f 19/21/20 20/20/19 22/22/21 +f 21/23/22 22/22/21 24/24/23 +f 23/25/24 24/24/23 26/26/25 +f 25/27/26 26/26/25 28/28/27 +f 27/29/28 28/30/27 30/31/29 +f 29/32/30 30/31/29 32/33/31 +f 31/34/32 32/33/31 34/35/33 +f 33/36/34 34/35/33 35/37/35 +f 35/37/35 36/38/36 37/39/37 +f 37/39/37 38/40/38 39/41/39 +f 39/41/39 40/42/40 41/43/41 +f 41/44/41 42/45/42 43/46/43 +f 43/46/43 44/47/44 45/48/45 +f 45/48/45 46/49/46 47/50/47 +f 47/50/47 48/51/48 49/52/49 +f 49/52/49 50/53/50 51/54/51 +f 51/54/51 52/55/52 53/56/53 +f 53/56/53 54/57/54 55/58/55 +f 55/59/55 56/60/56 57/61/57 +f 57/61/57 58/62/58 59/63/59 +f 59/63/59 60/64/60 61/65/61 +f 4/66/3 2/67/2 6/68/5 +f 63/69/62 64/70/63 1/1/1 +f 61/65/61 62/71/64 63/69/62 +f 3/4/4 1/1/1 4/3/3 +f 5/6/6 3/4/4 6/5/5 +f 7/8/8 5/6/6 8/7/7 +f 9/72/10 7/8/8 10/9/9 +f 11/13/12 9/10/10 12/12/11 +f 13/15/14 11/13/12 14/14/13 +f 15/17/16 13/15/14 16/16/15 +f 17/19/18 15/17/16 18/18/17 +f 19/21/20 17/19/18 20/20/19 +f 21/23/22 19/21/20 22/22/21 +f 23/25/24 21/23/22 24/24/23 +f 25/27/26 23/25/24 26/26/25 +f 27/73/28 25/27/26 28/28/27 +f 29/32/30 27/29/28 30/31/29 +f 31/34/32 29/32/30 32/33/31 +f 33/36/34 31/34/32 34/35/33 +f 34/35/33 36/38/36 35/37/35 +f 36/38/36 38/40/38 37/39/37 +f 38/40/38 40/42/40 39/41/39 +f 40/42/40 42/74/42 41/43/41 +f 42/45/42 44/47/44 43/46/43 +f 44/47/44 46/49/46 45/48/45 +f 46/49/46 48/51/48 47/50/47 +f 48/51/48 50/53/50 49/52/49 +f 50/53/50 52/55/52 51/54/51 +f 52/55/52 54/57/54 53/56/53 +f 54/57/54 56/75/56 55/58/55 +f 56/60/56 58/62/58 57/61/57 +f 58/62/58 60/64/60 59/63/59 +f 60/64/60 62/71/64 61/65/61 +f 2/67/2 64/76/63 6/68/5 +f 64/76/63 62/77/64 6/68/5 +f 62/77/64 60/78/60 6/68/5 +f 60/78/60 58/79/58 6/68/5 +f 58/79/58 56/80/56 6/68/5 +f 56/80/56 54/81/54 6/68/5 +f 54/81/54 52/82/52 6/68/5 +f 52/82/52 50/83/50 6/68/5 +f 50/83/50 48/84/48 6/68/5 +f 48/84/48 46/85/46 6/68/5 +f 46/85/46 44/86/44 6/68/5 +f 44/86/44 42/87/42 6/68/5 +f 42/87/42 40/88/40 6/68/5 +f 40/88/40 38/89/38 6/68/5 +f 38/89/38 36/90/36 6/68/5 +f 36/90/36 34/91/33 6/68/5 +f 34/91/33 32/92/31 6/68/5 +f 32/92/31 30/93/29 6/68/5 +f 30/93/29 28/94/27 6/68/5 +f 28/94/27 26/95/25 6/68/5 +f 26/95/25 24/96/23 6/68/5 +f 24/96/23 22/97/21 6/68/5 +f 22/97/21 20/98/19 6/68/5 +f 20/98/19 18/99/17 6/68/5 +f 18/99/17 16/100/15 6/68/5 +f 16/100/15 14/101/13 6/68/5 +f 14/101/13 12/102/11 6/68/5 +f 12/102/11 10/103/9 8/104/7 +f 6/68/5 12/102/11 8/104/7 +f 64/70/63 2/2/2 1/1/1 +f 62/71/64 64/70/63 63/69/62 diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 1722163b..1dce62e5 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -59,6 +59,8 @@ public: inline bool isValid() const { return m_valid; } inline void setIndex(int index) { m_index = index; } inline int index() const { return m_index; } + inline void setShadowCasting(bool shadowCasting) { m_shadowCasting = shadowCasting; } + inline bool isShadowCasting() const { return m_shadowCasting; } private: GLuint m_texture; @@ -68,6 +70,7 @@ private: bool m_visible; bool m_valid; int m_index; + bool m_shadowCasting; QCustom3DItem *m_item; }; typedef QHash CustomRenderItemArray; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index bb6c96eb..0428d59b 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -56,6 +56,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * * Holds the texture file name for the item. If left unset, a solid gray texture will be * used. + * + * \note To conserve memory the Image loaded from the file is cleared after a texture is created. */ // TODO: Position check in task QTRD-3057 @@ -78,6 +80,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Holds the item \a rotation as a quaternion. Defaults to \c {quaternion(0.0, 0.0, 0.0, 0.0)}. */ +/*! \qmlproperty bool Custom3DItem::visible + * + * Sets the item \a visible. Defaults to \c{true}. + */ + +/*! \qmlproperty bool Custom3DItem::shadowCasting + * + * Sets shadow casting for the item to \a enabled. Defaults to \c{true}. + * If set \c{false}, the item does not cast shadows regardless of + * \l{QAbstract3DGraph::ShadowQuality}{ShadowQuality}. + */ + /*! * \qmlmethod void Custom3DItem::setRotationAxisAndAngle(vector3d axis, real angle) * @@ -129,7 +143,7 @@ void QCustom3DItem::setMeshFile(const QString &meshFile) } } -QString QCustom3DItem::meshFile() +QString QCustom3DItem::meshFile() const { return d_ptr->m_meshFile; } @@ -152,7 +166,7 @@ void QCustom3DItem::setPosition(const QVector3D &position) } } -QVector3D QCustom3DItem::position() +QVector3D QCustom3DItem::position() const { return d_ptr->m_position; } @@ -171,7 +185,7 @@ void QCustom3DItem::setScaling(const QVector3D &scaling) } } -QVector3D QCustom3DItem::scaling() +QVector3D QCustom3DItem::scaling() const { return d_ptr->m_scaling; } @@ -209,11 +223,32 @@ void QCustom3DItem::setVisible(bool visible) } } -bool QCustom3DItem::isVisible() +bool QCustom3DItem::isVisible() const { return d_ptr->m_visible; } + +/*! \property QCustom3DItem::shadowCasting + * + * Sets shadow casting for the item to \a enabled. Defaults to \c{true}. + * If set \c{false}, the item does not cast shadows regardless of QAbstract3DGraph::ShadowQuality. + */ +void QCustom3DItem::setShadowCasting(bool enabled) +{ + if (d_ptr->m_shadowCasting != enabled) { + d_ptr->m_shadowCasting = enabled; + d_ptr->m_dirtyBits.shadowCastingDirty = true; + emit shadowCastingChanged(enabled); + emit d_ptr->needUpdate(); + } +} + +bool QCustom3DItem::isShadowCasting() const +{ + return d_ptr->m_shadowCasting; +} + /*! * A convenience function to construct rotation quaternion from \a axis and \a angle. * @@ -226,6 +261,8 @@ void QCustom3DItem::setRotationAxisAndAngle(const QVector3D &axis, float angle) /*! * Set the \a textureImage as a QImage for the item. Texture defaults to solid gray. + * + * \note To conserve memory the given QImage is cleared after a texture is created. */ void QCustom3DItem::setTextureImage(const QImage &textureImage) { @@ -249,8 +286,10 @@ void QCustom3DItem::setTextureImage(const QImage &textureImage) /*! \property QCustom3DItem::textureFile * - * Holds the texture file name for the item. If both this and textureImage are unset, a solid + * Holds the texture file name for the item. If both this and texture image are unset, a solid * gray texture will be used. + * + * \note To conserve memory the QImage loaded from the file is cleared after a texture is created. */ void QCustom3DItem::setTextureFile(const QString &textureFile) { @@ -268,7 +307,7 @@ void QCustom3DItem::setTextureFile(const QString &textureFile) } } -QString QCustom3DItem::textureFile() +QString QCustom3DItem::textureFile() const { return d_ptr->m_textureFile; } @@ -279,7 +318,8 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : m_position(QVector3D(0.0f, 0.0f, 0.0f)), m_scaling(QVector3D(0.1f, 0.1f, 0.1f)), m_rotation(QQuaternion(0.0f, 0.0f, 0.0f, 0.0f)), - m_visible(true) + m_visible(true), + m_shadowCasting(true) { } @@ -292,7 +332,8 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &mesh m_position(position), m_scaling(scaling), m_rotation(rotation), - m_visible(true) + m_visible(true), + m_shadowCasting(true) { } @@ -318,6 +359,7 @@ void QCustom3DItemPrivate::resetDirtyBits() m_dirtyBits.scalingDirty = false; m_dirtyBits.rotationDirty = false; m_dirtyBits.visibleDirty = false; + m_dirtyBits.shadowCastingDirty = false; } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index 77e33404..72aad604 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -37,6 +37,7 @@ class QT_DATAVISUALIZATION_EXPORT QCustom3DItem : public QObject Q_PROPERTY(QVector3D scaling READ scaling WRITE setScaling NOTIFY scalingChanged) Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) + Q_PROPERTY(bool shadowCasting READ isShadowCasting WRITE setShadowCasting NOTIFY shadowCastingChanged) public: explicit QCustom3DItem(QObject *parent = 0); @@ -46,22 +47,25 @@ public: virtual ~QCustom3DItem(); void setMeshFile(const QString &meshFile); - QString meshFile(); + QString meshFile() const; void setTextureFile(const QString &textureFile); - QString textureFile(); + QString textureFile() const; void setPosition(const QVector3D &position); - QVector3D position(); + QVector3D position() const; void setScaling(const QVector3D &scaling); - QVector3D scaling(); + QVector3D scaling() const; void setRotation(const QQuaternion &rotation); QQuaternion rotation(); void setVisible(bool visible); - bool isVisible(); + bool isVisible() const; + + void setShadowCasting(bool enabled); + bool isShadowCasting() const; Q_INVOKABLE void setRotationAxisAndAngle(const QVector3D &axis, float angle); @@ -74,6 +78,7 @@ signals: void scalingChanged(const QVector3D &scaling); void rotationChanged(const QQuaternion &rotation); void visibleChanged(bool visible); + void shadowCastingChanged(bool shadowCasting); protected: QScopedPointer d_ptr; diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 007c9fc4..2523abd4 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -40,6 +40,7 @@ struct QCustomItemDirtyBitField { bool scalingDirty : 1; bool rotationDirty : 1; bool visibleDirty : 1; + bool shadowCastingDirty : 1; QCustomItemDirtyBitField() : textureDirty(false), @@ -47,7 +48,8 @@ struct QCustomItemDirtyBitField { positionDirty(false), scalingDirty(false), rotationDirty(false), - visibleDirty(false) + visibleDirty(false), + shadowCastingDirty(false) { } }; @@ -74,6 +76,7 @@ public: QVector3D m_scaling; QQuaternion m_rotation; bool m_visible; + bool m_shadowCasting; QCustomItemDirtyBitField m_dirtyBits; diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 4fac937b..a71bd28b 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -192,6 +192,10 @@ * Gets ownership of \a item back and removes the \a item from the graph. * * \since Qt Data Visualization 1.1 + * + * \note If the same item is added back to the graph, the texture file needs to be re-set. + * + * \sa Custom3DItem::textureFile */ /*! diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index a2181271..82952a26 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -582,6 +582,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) QVector3D translation = convertPositionToTranslation(item->position()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); + newItem->setShadowCasting(item->isShadowCasting()); m_customRenderCache.insert(item, newItem); return newItem; } @@ -620,6 +621,10 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) renderItem->setVisible(item->isVisible()); item->d_ptr->m_dirtyBits.visibleDirty = false; } + if (item->d_ptr->m_dirtyBits.shadowCastingDirty) { + renderItem->setShadowCasting(item->isShadowCasting()); + item->d_ptr->m_dirtyBits.shadowCastingDirty = false; + } } void Abstract3DRenderer::drawCustomItems(RenderingState state, @@ -700,7 +705,7 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, itemColor /= 255.0f; shader->setUniformValue(shader->color(), itemColor); m_drawer->drawObject(shader, item->mesh()); - } else { + } else if (item->isShadowCasting()) { // Depth render shader->setUniformValue(shader->MVP(), depthProjectionViewMatrix * modelMatrix); m_drawer->drawObject(shader, item->mesh()); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 9818d176..196460da 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -430,6 +430,11 @@ void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) * Gets ownership of given \a item back and removes the \a item from the graph. * * \since Qt Data Visualization 1.1 + * + * \note If the same item is added back to the graph, the texture or the texture file needs to be + * re-set. + * + * \sa QCustom3DItem::setTextureImage(), QCustom3DItem::setTextureFile() */ void QAbstract3DGraph::releaseCustomItem(QCustom3DItem *item) { diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index 6b83bde2..d32140e7 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -182,6 +182,7 @@ Rectangle { property bool addObject: false onClicked: { if (addObject === true) { + shuttleItem.textureFile(":/items/shuttle.png") testChart.addCustomItem(shuttleItem) text = "Remove Shuttle" addObject = false -- cgit v1.2.3 From 0c1389258e8c3bdb7ccd2ae55959e4e99a460970 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 19 May 2014 12:57:20 +0300 Subject: Optimize label rotations a bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ie6075aefa70228769d5a2717e9d96c23b9fee494 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/bars3drenderer.cpp | 37 +++++++++++++--------- src/datavisualization/engine/drawer.cpp | 8 ++--- src/datavisualization/engine/drawer_p.h | 2 +- src/datavisualization/engine/scatter3drenderer.cpp | 15 ++++++--- src/datavisualization/engine/surface3drenderer.cpp | 30 ++++++++++++------ src/datavisualization/utils/utils.cpp | 9 ++++++ src/datavisualization/utils/utils_p.h | 1 + 7 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 537bb1ca..8b234afb 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -585,7 +585,6 @@ void Bars3DRenderer::drawSlicedScene() // Draw grid labels int labelNbr = 0; int labelCount = m_axisCacheY.labelCount(); - QVector3D backLabelRotation(0.0f, 0.0f, 0.0f); QVector3D labelTrans = QVector3D(scaleFactor + labelMargin, 0.0f, 0.0f); for (int i = 0; i < labelCount; i++) { @@ -595,7 +594,7 @@ void Bars3DRenderer::drawSlicedScene() labelTrans.setY(gridPos); m_dummyBarRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, - projectionMatrix, zeroVector, backLabelRotation, 0, + projectionMatrix, zeroVector, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, Qt::AlignRight); } @@ -786,6 +785,8 @@ void Bars3DRenderer::drawSlicedScene() // Draw labels for bars QVector3D sliceValueRotation(0.0f, 0.0f, 90.0f); QVector3D sliceLabelRotation(0.0f, 0.0f, -45.0f); + QQuaternion totalSliceValueRotation = Utils::calculateRotation(sliceValueRotation); + QQuaternion totalSliceLabelRotation = Utils::calculateRotation(sliceLabelRotation); int labelCount = m_sliceCache->labelItems().size(); @@ -798,7 +799,7 @@ void Bars3DRenderer::drawSlicedScene() // Draw labels m_drawer->drawLabel(m_dummyBarRenderItem, *m_sliceCache->labelItems().at(labelNo), - viewMatrix, projectionMatrix, positionComp, sliceLabelRotation, + viewMatrix, projectionMatrix, positionComp, totalSliceLabelRotation, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelMid, Qt::AlignRight, true); @@ -831,7 +832,7 @@ void Bars3DRenderer::drawSlicedScene() item.translation().z())); m_drawer->drawLabel(m_dummyBarRenderItem, item.sliceLabelItem(), viewMatrix, - projectionMatrix, zeroVector, sliceValueRotation, + projectionMatrix, zeroVector, totalSliceValueRotation, item.height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, labelPos, alignment, true); @@ -857,7 +858,7 @@ void Bars3DRenderer::drawSlicedScene() selectedItem->translation().z())); m_drawer->drawLabel(m_dummyBarRenderItem, selectedItem->sliceLabelItem(), viewMatrix, - projectionMatrix, zeroVector, sliceValueRotation, + projectionMatrix, zeroVector, totalSliceValueRotation, selectedItem->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, labelPos, alignment, true); @@ -867,22 +868,22 @@ void Bars3DRenderer::drawSlicedScene() if (rowMode) { if (m_sliceTitleItem) { m_drawer->drawLabel(*dummyItem, sliceSelectionLabel, viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelTop, Qt::AlignCenter, true); } m_drawer->drawLabel(*dummyItem, m_axisCacheX.titleItem(), viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); } else { m_drawer->drawLabel(*dummyItem, m_axisCacheZ.titleItem(), viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); if (m_sliceTitleItem) { m_drawer->drawLabel(*dummyItem, sliceSelectionLabel, viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelTop, Qt::AlignCenter, true); } @@ -891,7 +892,7 @@ void Bars3DRenderer::drawSlicedScene() QVector3D labelTrans = QVector3D(-scaleFactor - labelMargin, 0.2f, 0.0f); // y = 0.2 for row/column labels (see barPosYAdjustment) m_dummyBarRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, m_axisCacheY.titleItem(), viewMatrix, - projectionMatrix, zeroVector, QVector3D(0.0f, 0.0f, 90.0f), 0, + projectionMatrix, zeroVector, totalSliceValueRotation, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelMid, Qt::AlignBottom); @@ -1838,7 +1839,7 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) } m_drawer->drawLabel(*selectedBar, labelItem, viewMatrix, projectionMatrix, - zeroVector, zeroVector, selectedBar->height(), + zeroVector, identityQuaternion, selectedBar->height(), m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, false); @@ -1929,6 +1930,9 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer sideLabelRotation.setX(-fractionCamY); backLabelRotation.setX(-fractionCamY); + QQuaternion totalSideRotation = Utils::calculateRotation(sideLabelRotation); + QQuaternion totalBackRotation = Utils::calculateRotation(backLabelRotation); + QVector3D backLabelTrans = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, @@ -1952,14 +1956,14 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer // Back wall m_dummyBarRenderItem.setTranslation(backLabelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, backLabelRotation, 0, m_cachedSelectionMode, + zeroVector, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, backAlignment); // Side wall m_dummyBarRenderItem.setTranslation(sideLabelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, + zeroVector, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, sideAlignment); } @@ -2043,6 +2047,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } } + QQuaternion totalRotation = Utils::calculateRotation(labelRotation); for (int row = 0; row != m_cachedRowCount; row++) { if (m_axisCacheZ.labelItems().size() > row) { // Go through all rows and get position of max+1 or min-1 column, depending on x flip @@ -2068,7 +2073,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotation, 0, m_cachedSelectionMode, + zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment, false, drawSelection); @@ -2144,6 +2149,8 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } } + totalRotation = Utils::calculateRotation(labelRotation); + for (int column = 0; column != m_cachedColumnCount; column++) { if (m_axisCacheX.labelItems().size() > column) { // Go through all columns and get position of max+1 or min-1 row, depending on z flip @@ -2170,7 +2177,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotation, 0, m_cachedSelectionMode, + zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment, false, drawSelection); } diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index 0e336019..a5fd6601 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -233,7 +233,7 @@ void Drawer::drawLine(ShaderHelper *shader) void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelItem, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, - const QVector3D &positionComp, const QVector3D &rotation, + const QVector3D &positionComp, const QQuaternion &rotation, GLfloat itemHeight, QAbstract3DGraph::SelectionFlags mode, ShaderHelper *shader, ObjectHelper *object, const Q3DCamera *camera, bool useDepth, bool rotateAlong, @@ -342,11 +342,7 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte modelMatrix.rotate(-camRotationX, 0.0f, 1.0f, 0.0f); modelMatrix.rotate(-camRotationY - yComp, 1.0f, 0.0f, 0.0f); } else { - QQuaternion rotQuatX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, rotation.x()); - QQuaternion rotQuatY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, rotation.y()); - QQuaternion rotQuatZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, rotation.z()); - QQuaternion rotQuaternion = rotQuatY * rotQuatZ * rotQuatX; - modelMatrix.rotate(rotQuaternion); + modelMatrix.rotate(rotation); } modelMatrix.translate(anchorPoint); diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index c4fb749f..cdda4f7d 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -80,7 +80,7 @@ public: void drawLine(ShaderHelper *shader); void drawLabel(const AbstractRenderItem &item, const LabelItem &labelItem, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, - const QVector3D &positionComp, const QVector3D &rotation, GLfloat itemHeight, + const QVector3D &positionComp, const QQuaternion &rotation, GLfloat itemHeight, QAbstract3DGraph::SelectionFlags mode, ShaderHelper *shader, ObjectHelper *object, const Q3DCamera *camera, bool useDepth = false, bool rotateAlong = false, LabelPosition position = LabelOver, diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3fd8ece4..940260d9 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1310,7 +1310,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } m_drawer->drawLabel(*selectedItem, labelItem, viewMatrix, projectionMatrix, - zeroVector, zeroVector, selectedItemSize, m_cachedSelectionMode, + zeroVector, identityQuaternion, selectedItemSize, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, false, Drawer::LabelOver); @@ -1433,6 +1433,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } } } + QQuaternion totalRotation = Utils::calculateRotation(labelRotation); QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); for (int label = 0; label < labelCount; label++) { if (m_axisCacheZ.labelItems().size() > labelNbr) { @@ -1451,7 +1452,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotation, 0, m_cachedSelectionMode, + zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1544,6 +1545,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } } + QQuaternion totalRotation = Utils::calculateRotation(labelRotation); QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); for (int label = 0; label < labelCount; label++) { if (m_axisCacheX.labelItems().size() > labelNbr) { @@ -1562,7 +1564,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotation, 0, m_cachedSelectionMode, + zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -1629,6 +1631,9 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa sideLabelRotation.setX(-fractionCamY); backLabelRotation.setX(-fractionCamY); + QQuaternion totalSideRotation = Utils::calculateRotation(sideLabelRotation); + QQuaternion totalBackRotation = Utils::calculateRotation(backLabelRotation); + QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); @@ -1649,7 +1654,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, backLabelRotation, 0, m_cachedSelectionMode, + zeroVector, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, backAlignment); @@ -1657,7 +1662,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransSide.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, sideLabelRotation, 0, m_cachedSelectionMode, + zeroVector, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, sideAlignment); } diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index b68a8087..03bd2ccd 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -958,7 +958,6 @@ void Surface3DRenderer::drawSlicedScene() int labelNbr = 0; QVector3D positionComp(0.0f, 0.0f, 0.0f); - QVector3D rotation(0.0f, 0.0f, 0.0f); QVector3D labelTrans = QVector3D(scaleXBackground + labelMargin, 0.0f, 0.0f); int labelCount = m_axisCacheY.labelCount(); for (int label = 0; label < labelCount; label++) { @@ -969,7 +968,7 @@ void Surface3DRenderer::drawSlicedScene() // Draw the label here m_dummyRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionComp, rotation, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, Qt::AlignRight, true); } @@ -979,9 +978,11 @@ void Surface3DRenderer::drawSlicedScene() // X Labels to ground int countLabelItems = sliceCache.labelItems().size(); + QVector3D rotation(0.0f, 0.0f, -45.0f); + QQuaternion totalRotation = Utils::calculateRotation(rotation); + labelNbr = 0; positionComp.setY(-0.1f); - rotation.setZ(-45.0f); labelTrans.setY(-backgroundMargin); labelCount = sliceCache.labelCount(); for (int label = 0; label < labelCount; label++) { @@ -995,7 +996,7 @@ void Surface3DRenderer::drawSlicedScene() axisLabelItem = sliceCache.labelItems().at(labelNbr); m_drawer->drawLabel(m_dummyRenderItem, *axisLabelItem, viewMatrix, projectionMatrix, - positionComp, rotation, 0, QAbstract3DGraph::SelectionRow, + positionComp, totalRotation, 0, QAbstract3DGraph::SelectionRow, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBelow, Qt::AlignBottom, true); } @@ -1006,15 +1007,17 @@ void Surface3DRenderer::drawSlicedScene() AbstractRenderItem *dummyItem(0); positionComp.setY(m_autoScaleAdjustment); m_drawer->drawLabel(*dummyItem, sliceCache.titleItem(), viewMatrix, projectionMatrix, - positionComp, zeroVector, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); // Y-axis label + rotation = QVector3D(0.0f, 0.0f, 90.0f); + totalRotation = Utils::calculateRotation(rotation); labelTrans = QVector3D(-scaleXBackground - labelMargin, 0.0f, 0.0f); m_dummyRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyRenderItem, m_axisCacheY.titleItem(), viewMatrix, - projectionMatrix, zeroVector, QVector3D(0.0f, 0.0f, 90.0f), 0, + projectionMatrix, zeroVector, totalRotation, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelMid, Qt::AlignBottom); @@ -1915,6 +1918,8 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } } + QQuaternion totalRotation = Utils::calculateRotation(labelRotation); + QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); @@ -1934,7 +1939,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, labelRotation, 0, m_cachedSelectionMode, + positionZComp, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -2020,6 +2025,8 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } } } + QQuaternion totalRotation = Utils::calculateRotation(labelRotation); + QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); @@ -2039,7 +2046,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, labelRotation, 0, m_cachedSelectionMode, + positionZComp, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment); } @@ -2097,6 +2104,9 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa sideLabelRotation.setX(-fractionCamY); backLabelRotation.setX(-fractionCamY); + QQuaternion totalSideRotation = Utils::calculateRotation(sideLabelRotation); + QQuaternion totalBackRotation = Utils::calculateRotation(backLabelRotation); + QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); @@ -2117,7 +2127,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransBack.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransBack); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, backLabelRotation, 0, m_cachedSelectionMode, + positionZComp, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, backAlignment); @@ -2125,7 +2135,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelTransSide.setY(labelYTrans); m_dummyRenderItem.setTranslation(labelTransSide); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, sideLabelRotation, 0, m_cachedSelectionMode, + positionZComp, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, sideAlignment); } diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index b00d1251..7343148d 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -234,4 +234,13 @@ float Utils::wrapValue(float value, float min, float max) return value; } +QQuaternion Utils::calculateRotation(const QVector3D &xyzRotations) +{ + QQuaternion rotQuatX = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, xyzRotations.x()); + QQuaternion rotQuatY = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, xyzRotations.y()); + QQuaternion rotQuatZ = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, xyzRotations.z()); + QQuaternion totalRotation = rotQuatY * rotQuatZ * rotQuatX; + return totalRotation; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index 46df980f..a7c73731 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -72,6 +72,7 @@ public: static QString defaultLabelFormat(); static float wrapValue(float value, float min, float max); + static QQuaternion calculateRotation(const QVector3D &xyzRotations); private: static ParamType mapFormatCharToParamType(const QChar &formatChar); -- cgit v1.2.3 From 05792cdf5140368a5dcf2e47886e34fd99c56398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 13:10:00 +0300 Subject: texture filename & test bug fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I40a5084de0cf59cee6373d3fcba4bdb9c39a4139 Change-Id: I40a5084de0cf59cee6373d3fcba4bdb9c39a4139 Reviewed-by: Tomi Korpipää --- src/datavisualization/data/qcustom3ditem.cpp | 1 + tests/qmlcamera/qml/qmlcamera/main.qml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 0428d59b..3254ac3b 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -349,6 +349,7 @@ QImage QCustom3DItemPrivate::textureImage() void QCustom3DItemPrivate::clearTextureImage() { m_textureImage = QImage(); + m_textureFile.clear(); } void QCustom3DItemPrivate::resetDirtyBits() diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index d32140e7..d2109772 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -182,7 +182,7 @@ Rectangle { property bool addObject: false onClicked: { if (addObject === true) { - shuttleItem.textureFile(":/items/shuttle.png") + shuttleItem.textureFile = ":/items/shuttle.png" testChart.addCustomItem(shuttleItem) text = "Remove Shuttle" addObject = false -- cgit v1.2.3 From ca8a5af99151250b676a4aaf387399165012ebb2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 19 May 2014 14:07:10 +0300 Subject: Fix label alignments - Left and right were logically swapped - Horizontal axis labels on slice views were incorrectly aligned Change-Id: I8c13acaeec02961464ee63f8b489e353dcb379e6 Reviewed-by: Mika Salmela --- src/datavisualization/engine/bars3drenderer.cpp | 18 ++++++++-------- src/datavisualization/engine/drawer.cpp | 25 ++++++---------------- src/datavisualization/engine/scatter3drenderer.cpp | 8 +++---- src/datavisualization/engine/surface3drenderer.cpp | 15 +++++++------ 4 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 8b234afb..bc49e7ed 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -481,7 +481,7 @@ void Bars3DRenderer::drawSlicedScene() scaleFactor = (1.1f * m_rowWidth) / m_scaleFactor; else scaleFactor = (1.1f * m_columnDepth) / m_scaleFactor; - GLfloat barLabelYPos = barPosYAdjustment - 0.4f - labelMargin; // 0.4 for labels + GLfloat barLabelYPos = barPosYAdjustment - labelMargin; GLfloat zeroPosAdjustment = 0.0f; GLfloat directionMultiplier = 2.0f; GLfloat directionBase = 0.0f; @@ -596,7 +596,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, - activeCamera, true, true, Drawer::LabelMid, Qt::AlignRight); + activeCamera, true, true, Drawer::LabelMid, Qt::AlignLeft); } labelNbr++; } @@ -802,7 +802,7 @@ void Bars3DRenderer::drawSlicedScene() viewMatrix, projectionMatrix, positionComp, totalSliceLabelRotation, 0, m_cachedSelectionMode, m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelMid, - Qt::AlignRight, true); + Qt::AlignmentFlag(Qt::AlignLeft | Qt::AlignTop), true); } if (!sliceGridLabels) { @@ -824,7 +824,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (item.height() < 0) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (item.height() > 0) ? Qt::AlignLeft : Qt::AlignRight; Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), barPosYAdjustment - zeroPosAdjustment @@ -850,7 +850,7 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->generateLabelItem(selectedItem->sliceLabelItem(), selectedItem->sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (selectedItem->height() < 0) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (selectedItem->height() > 0) ? Qt::AlignLeft : Qt::AlignRight; Drawer::LabelPosition labelPos = (selectedItem->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(selectedItem->translation().x(), barPosYAdjustment - zeroPosAdjustment @@ -1894,8 +1894,8 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer GLfloat labelZTrans = columnScaleFactor; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; - Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag backAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; @@ -1983,7 +1983,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer GLfloat rowPosValue = scaledColumnDepth + labelMargin; GLfloat rowPos = 0.0f; GLfloat colPos = 0.0f; - Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; if (labelAutoAngle == 0.0f) { @@ -2085,7 +2085,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; fractionCamX = activeCamera->xRotation() * labelAngleFraction; - alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (labelAutoAngle == 0.0f) { labelRotation = QVector3D(-90.0f, 90.0f, 0.0f); if (m_xFlipped) diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index a5fd6601..a14678ce 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -300,27 +300,16 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte // Apply alignment QVector3D anchorPoint; - switch (alignment) { - case Qt::AlignLeft: { - anchorPoint.setX(float(-textureSize.width()) * scaleFactor); - break; - } - case Qt::AlignRight: { + + if (alignment & Qt::AlignLeft) anchorPoint.setX(float(textureSize.width()) * scaleFactor); - break; - } - case Qt::AlignTop: { + else if (alignment & Qt::AlignRight) + anchorPoint.setX(float(-textureSize.width()) * scaleFactor); + + if (alignment & Qt::AlignTop) anchorPoint.setY(float(-textureSize.height()) * scaleFactor); - break; - } - case Qt::AlignBottom: { + else if (alignment & Qt::AlignBottom) anchorPoint.setY(float(textureSize.height()) * scaleFactor); - break; - } - default: { - break; - } - } if (position < LabelBottom) { xPosition = item.translation().x(); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 940260d9..3cf91833 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1367,7 +1367,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; - Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; if (m_xFlipped) labelXTrans = -labelXTrans; @@ -1476,7 +1476,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; - Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; if (m_zFlipped) labelZTrans = -labelZTrans; @@ -1597,8 +1597,8 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa GLfloat labelMarginZTrans = labelMargin; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; - Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag backAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 03bd2ccd..66caedc2 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -969,8 +969,8 @@ void Surface3DRenderer::drawSlicedScene() m_dummyRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, - true, true, Drawer::LabelMid, Qt::AlignRight, true); + m_labelObj, activeCamera, true, true, Drawer::LabelMid, + Qt::AlignLeft, true); } labelNbr++; } @@ -998,7 +998,8 @@ void Surface3DRenderer::drawSlicedScene() m_drawer->drawLabel(m_dummyRenderItem, *axisLabelItem, viewMatrix, projectionMatrix, positionComp, totalRotation, 0, QAbstract3DGraph::SelectionRow, m_labelShader, m_labelObj, activeCamera, - false, false, Drawer::LabelBelow, Qt::AlignBottom, true); + false, false, Drawer::LabelBelow, + Qt::AlignmentFlag(Qt::AlignLeft | Qt::AlignTop), true); } labelNbr++; } @@ -1851,7 +1852,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; - Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; if (m_xFlipped) labelXTrans = -labelXTrans; @@ -1957,7 +1958,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa int labelNbr = 0; GLfloat labelZTrans = m_scaleZWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; - Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; if (m_zFlipped) labelZTrans = -labelZTrans; @@ -2070,8 +2071,8 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa GLfloat labelMarginZTrans = labelMargin; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; - Qt::AlignmentFlag sideAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag backAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; -- cgit v1.2.3 From 0004b7598d5826bf5e1e4fb7256b13dbc220ec47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 19 May 2014 13:33:53 +0300 Subject: Surface slice grid line fix Task-number: QTRD-3115 Change-Id: I0be10ebb9c2a9472da63e258723bdd305e0102cf Change-Id: I0be10ebb9c2a9472da63e258723bdd305e0102cf Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/surface3drenderer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 66caedc2..cc4cf788 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -858,7 +858,7 @@ void Surface3DRenderer::drawSlicedScene() glDisable(GL_TEXTURE_2D); glEnable(GL_CULL_FACE); - glCullFace(GL_FRONT); + glCullFace(GL_BACK); // Grid lines if (m_cachedTheme->isGridEnabled() && m_heightNormalizer) { @@ -867,6 +867,7 @@ void Surface3DRenderer::drawSlicedScene() #else ShaderHelper *lineShader = m_selectionShader; // Plain color shader for GL_LINES #endif + // Bind line shader lineShader->bind(); @@ -950,7 +951,6 @@ void Surface3DRenderer::drawSlicedScene() m_labelShader->bind(); glEnable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); - glCullFace(GL_BACK); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -- cgit v1.2.3 From b6da9160b2d81283ec9fc082c08987ecc95650da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 20 May 2014 08:54:07 +0300 Subject: Do not draw custom items outside axis ranges Task-number: QTRD-3057 Change-Id: Icb8904fa0a1c009985ac21ee6fa51eefda81d9cc Change-Id: Icb8904fa0a1c009985ac21ee6fa51eefda81d9cc Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- src/datavisualization/data/customrenderitem_p.h | 3 +++ src/datavisualization/data/qcustom3ditem.cpp | 7 ++----- src/datavisualization/engine/abstract3drenderer.cpp | 11 ++++++++++- tests/qmlcamera/qml/qmlcamera/main.qml | 3 ++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 1dce62e5..81a78144 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -49,6 +49,8 @@ public: inline ObjectHelper *mesh() const { return m_object; } inline void setScaling(const QVector3D &scaling) { m_scaling = scaling; } inline QVector3D scaling() const { return m_scaling; } + inline void setPosition(const QVector3D &position) { m_position = position; } + inline QVector3D position() const { return m_position; } inline void setBlendNeeded(bool blend) { m_needBlend = blend; } inline bool isBlendNeeded() const { return m_needBlend; } inline void setVisible(bool visible) { m_visible = visible; } @@ -65,6 +67,7 @@ public: private: GLuint m_texture; QVector3D m_scaling; + QVector3D m_position; ObjectHelper *m_object; bool m_needBlend; bool m_visible; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 3254ac3b..f39a0478 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -60,14 +60,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \note To conserve memory the Image loaded from the file is cleared after a texture is created. */ -// TODO: Position check in task QTRD-3057 /*! \qmlproperty vector3d Custom3DItem::position * * Holds the item \a position as a vector3d. Item position is in data coordinates. Defaults to * \c {vector3d(0.0, 0.0, 0.0)}. * - * \note No validity checks are made for the position of the item, so it is up to the user to - * provide a valid position. Items positioned outside axis ranges are still rendered. + * \note Items positioned outside axis ranges are not rendered. */ /*! \qmlproperty vector3d Custom3DItem::scaling @@ -153,8 +151,7 @@ QString QCustom3DItem::meshFile() const * Holds the item \a position as a QVector3D. Item position is in data coordinates. Defaults to * \c {QVector3D(0.0, 0.0, 0.0)}. * - * \note No validity checks are made for the position of the item, so it is up to the user to - * provide a valid position. Items positioned outside axis ranges are still rendered. + * \note Items positioned outside axis ranges are not rendered. */ void QCustom3DItem::setPosition(const QVector3D &position) { diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 82952a26..684db1a5 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -573,6 +573,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); + newItem->setPosition(item->position()); newItem->setRotation(item->rotation()); QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); @@ -614,6 +615,7 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } if (item->d_ptr->m_dirtyBits.positionDirty) { QVector3D translation = convertPositionToTranslation(item->position()); + renderItem->setPosition(item->position()); renderItem->setTranslation(translation); item->d_ptr->m_dirtyBits.positionDirty = false; } @@ -651,7 +653,14 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { - if (!item->isVisible()) + // Check that the render item is visible and within axis ranges, and skip drawing if not + if (!item->isVisible() + || item->position().x() < m_axisCacheX.min() + || item->position().x() > m_axisCacheX.max() + || item->position().z() < m_axisCacheZ.min() + || item->position().z() > m_axisCacheZ.max() + || item->position().y() < m_axisCacheY.min() + || item->position().y() > m_axisCacheY.max()) continue; QMatrix4x4 modelMatrix; diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index d2109772..c357accf 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -74,7 +74,7 @@ Rectangle { id: shuttleItem meshFile: ":/items/shuttle.obj" textureFile: ":/items/shuttle.png" - position: Qt.vector3d(5.0,35.0,3.0) + position: Qt.vector3d(5.0,29.0,3.0) scaling: Qt.vector3d(0.2,0.2,0.2) } @@ -152,6 +152,7 @@ Rectangle { onClicked: { currentAngle += 5 chartData.series.meshAngle = currentAngle + shuttleItem.setRotationAxisAndAngle(Qt.vector3d(0.0, 1.0, 1.0), currentAngle) } } -- cgit v1.2.3 From 1fe989d12f8fe5c13675158044bb76551fb5eb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 20 May 2014 12:58:30 +0300 Subject: Added support for custom items with absolute coordinates Task-number: QTRD-3122 Change-Id: Iefd4c4adad45721ed3519bdcecbbfa1e97039f08 Reviewed-by: Mika Salmela --- src/datavisualization/data/customrenderitem_p.h | 3 ++ src/datavisualization/data/qcustom3ditem.cpp | 61 +++++++++++++++++++--- src/datavisualization/data/qcustom3ditem.h | 5 ++ src/datavisualization/data/qcustom3ditem_p.h | 3 ++ .../engine/abstract3drenderer.cpp | 32 ++++++++---- .../engine/abstract3drenderer_p.h | 3 +- src/datavisualization/engine/bars3drenderer.cpp | 24 ++++++--- src/datavisualization/engine/bars3drenderer_p.h | 2 +- src/datavisualization/engine/scatter3drenderer.cpp | 19 +++++-- src/datavisualization/engine/scatter3drenderer_p.h | 2 +- src/datavisualization/engine/surface3drenderer.cpp | 21 ++++++-- src/datavisualization/engine/surface3drenderer_p.h | 2 +- 12 files changed, 140 insertions(+), 37 deletions(-) diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 81a78144..f05540d0 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -51,6 +51,8 @@ public: inline QVector3D scaling() const { return m_scaling; } inline void setPosition(const QVector3D &position) { m_position = position; } inline QVector3D position() const { return m_position; } + inline void setPositionAbsolute(bool absolute) { m_absolute = absolute; } + inline bool isPositionAbsolute() const { return m_absolute; } inline void setBlendNeeded(bool blend) { m_needBlend = blend; } inline bool isBlendNeeded() const { return m_needBlend; } inline void setVisible(bool visible) { m_visible = visible; } @@ -68,6 +70,7 @@ private: GLuint m_texture; QVector3D m_scaling; QVector3D m_position; + bool m_absolute; ObjectHelper *m_object; bool m_needBlend; bool m_visible; diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index f39a0478..f1307d7a 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -62,15 +62,31 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! \qmlproperty vector3d Custom3DItem::position * - * Holds the item \a position as a vector3d. Item position is in data coordinates. Defaults to - * \c {vector3d(0.0, 0.0, 0.0)}. + * Holds the item \a position as a vector3d. Defaults to \c {vector3d(0.0, 0.0, 0.0)}. * - * \note Items positioned outside axis ranges are not rendered. + * Item position is either in data coordinates or in absolute coordinates, depending on + * positionAbsolute property. When using absolute coordinates, values between \c{-1.0...1.0} are + * within axis ranges. + * + * \note Items positioned outside any axis range are not rendered if positionAbsolute is \c{false}. + * + * \sa positionAbsolute + */ + +/*! \qmlproperty bool Custom3DItem::positionAbsolute + * + * This property dictates if item position is to be handled in data coordinates or in absolute + * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * whereas items with data coordinates are only rendered if they are within axis ranges. + * + * \sa position */ /*! \qmlproperty vector3d Custom3DItem::scaling * * Holds the item \a scaling as a vector3d. Defaults to \c {vector3d(0.1, 0.1, 0.1)}. + * The default value sets the item to 10% of the height of the graph, provided the item size is + * normalized. */ /*! \qmlproperty quaternion Custom3DItem::rotation @@ -148,10 +164,15 @@ QString QCustom3DItem::meshFile() const /*! \property QCustom3DItem::position * - * Holds the item \a position as a QVector3D. Item position is in data coordinates. Defaults to - * \c {QVector3D(0.0, 0.0, 0.0)}. + * Holds the item \a position as a QVector3D. Defaults to \c {QVector3D(0.0, 0.0, 0.0)}. + * + * Item position is either in data coordinates or in absolute coordinates, depending on + * positionAbsolute property. When using absolute coordinates, values between \c{-1.0...1.0} are + * within axis ranges. + * + * \note Items positioned outside any axis range are not rendered if positionAbsolute is \c{false}. * - * \note Items positioned outside axis ranges are not rendered. + * \sa positionAbsolute */ void QCustom3DItem::setPosition(const QVector3D &position) { @@ -168,9 +189,34 @@ QVector3D QCustom3DItem::position() const return d_ptr->m_position; } +/*! \property QCustom3DItem::positionAbsolute + * + * This property dictates if item position is to be handled in data coordinates or in absolute + * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * whereas items with data coordinates are only rendered if they are within axis ranges. + * + * \sa position + */ +void QCustom3DItem::setPositionAbsolute(bool positionAbsolute) +{ + if (d_ptr->m_positionAbsolute != positionAbsolute) { + d_ptr->m_positionAbsolute = positionAbsolute; + d_ptr->m_dirtyBits.positionAbsoluteDirty = true; + emit positionAbsoluteChanged(positionAbsolute); + emit d_ptr->needUpdate(); + } +} + +bool QCustom3DItem::isPositionAbsolute() const +{ + return d_ptr->m_positionAbsolute; +} + /*! \property QCustom3DItem::scaling * * Holds the item \a scaling as a QVector3D. Defaults to \c {QVector3D(0.1, 0.1, 0.1)}. + * The default value sets the item to 10% of the height of the graph, provided the item size is + * normalized. */ void QCustom3DItem::setScaling(const QVector3D &scaling) { @@ -313,6 +359,7 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : QObject(parent), q_ptr(q), m_position(QVector3D(0.0f, 0.0f, 0.0f)), + m_positionAbsolute(false), m_scaling(QVector3D(0.1f, 0.1f, 0.1f)), m_rotation(QQuaternion(0.0f, 0.0f, 0.0f, 0.0f)), m_visible(true), @@ -327,6 +374,7 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &mesh q_ptr(q), m_meshFile(meshFile), m_position(position), + m_positionAbsolute(false), m_scaling(scaling), m_rotation(rotation), m_visible(true), @@ -354,6 +402,7 @@ void QCustom3DItemPrivate::resetDirtyBits() m_dirtyBits.textureDirty = false; m_dirtyBits.meshDirty = false; m_dirtyBits.positionDirty = false; + m_dirtyBits.positionAbsoluteDirty = false; m_dirtyBits.scalingDirty = false; m_dirtyBits.rotationDirty = false; m_dirtyBits.visibleDirty = false; diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index 72aad604..53ec0bcf 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -34,6 +34,7 @@ class QT_DATAVISUALIZATION_EXPORT QCustom3DItem : public QObject Q_PROPERTY(QString meshFile READ meshFile WRITE setMeshFile NOTIFY meshFileChanged) Q_PROPERTY(QString textureFile READ textureFile WRITE setTextureFile NOTIFY textureFileChanged) Q_PROPERTY(QVector3D position READ position WRITE setPosition NOTIFY positionChanged) + Q_PROPERTY(bool positionAbsolute READ isPositionAbsolute WRITE setPositionAbsolute NOTIFY positionAbsoluteChanged) Q_PROPERTY(QVector3D scaling READ scaling WRITE setScaling NOTIFY scalingChanged) Q_PROPERTY(QQuaternion rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged) @@ -55,6 +56,9 @@ public: void setPosition(const QVector3D &position); QVector3D position() const; + void setPositionAbsolute(bool positionAbsolute); + bool isPositionAbsolute() const; + void setScaling(const QVector3D &scaling); QVector3D scaling() const; @@ -75,6 +79,7 @@ signals: void meshFileChanged(const QString &meshFile); void textureFileChanged(const QString &textureFile); void positionChanged(const QVector3D &position); + void positionAbsoluteChanged(bool positionAbsolute); void scalingChanged(const QVector3D &scaling); void rotationChanged(const QQuaternion &rotation); void visibleChanged(bool visible); diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 2523abd4..3e807df3 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -37,6 +37,7 @@ struct QCustomItemDirtyBitField { bool textureDirty : 1; bool meshDirty : 1; bool positionDirty : 1; + bool positionAbsoluteDirty : 1; bool scalingDirty : 1; bool rotationDirty : 1; bool visibleDirty : 1; @@ -46,6 +47,7 @@ struct QCustomItemDirtyBitField { : textureDirty(false), meshDirty(false), positionDirty(false), + positionAbsoluteDirty(false), scalingDirty(false), rotationDirty(false), visibleDirty(false), @@ -73,6 +75,7 @@ public: QString m_textureFile; QString m_meshFile; QVector3D m_position; + bool m_positionAbsolute; QVector3D m_scaling; QQuaternion m_rotation; bool m_visible; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 684db1a5..988ea21e 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -574,13 +574,15 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); newItem->setPosition(item->position()); + newItem->setPositionAbsolute(item->isPositionAbsolute()); newItem->setRotation(item->rotation()); QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); item->d_ptr->clearTextureImage(); - QVector3D translation = convertPositionToTranslation(item->position()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); newItem->setShadowCasting(item->isShadowCasting()); @@ -613,11 +615,14 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) item->d_ptr->clearTextureImage(); item->d_ptr->m_dirtyBits.textureDirty = false; } - if (item->d_ptr->m_dirtyBits.positionDirty) { - QVector3D translation = convertPositionToTranslation(item->position()); + if (item->d_ptr->m_dirtyBits.positionDirty || item->d_ptr->m_dirtyBits.positionAbsoluteDirty) { renderItem->setPosition(item->position()); + renderItem->setPositionAbsolute(item->isPositionAbsolute()); + QVector3D translation = convertPositionToTranslation(item->position(), + item->isPositionAbsolute()); renderItem->setTranslation(translation); item->d_ptr->m_dirtyBits.positionDirty = false; + item->d_ptr->m_dirtyBits.positionAbsoluteDirty = false; } if (item->d_ptr->m_dirtyBits.visibleDirty) { renderItem->setVisible(item->isVisible()); @@ -653,16 +658,21 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, // Draw custom items foreach (CustomRenderItem *item, m_customRenderCache) { - // Check that the render item is visible and within axis ranges, and skip drawing if not - if (!item->isVisible() - || item->position().x() < m_axisCacheX.min() - || item->position().x() > m_axisCacheX.max() - || item->position().z() < m_axisCacheZ.min() - || item->position().z() > m_axisCacheZ.max() - || item->position().y() < m_axisCacheY.min() - || item->position().y() > m_axisCacheY.max()) + // Check that the render item is visible, and skip drawing if not + if (!item->isVisible()) continue; + // Check if the render item is in data coordinates and not within axis ranges, and skip drawing if it is + if (!item->isPositionAbsolute() + && (item->position().x() < m_axisCacheX.min() + || item->position().x() > m_axisCacheX.max() + || item->position().z() < m_axisCacheZ.min() + || item->position().z() > m_axisCacheZ.max() + || item->position().y() < m_axisCacheY.min() + || item->position().y() > m_axisCacheY.max())) { + continue; + } + QMatrix4x4 modelMatrix; QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index ebe473b9..f5bf0ff4 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -117,7 +117,8 @@ public: virtual CustomRenderItem *addCustomItem(QCustom3DItem *item); virtual void updateCustomItem(CustomRenderItem *renderItem); - virtual QVector3D convertPositionToTranslation(const QVector3D &position) = 0; + virtual QVector3D convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) = 0; void generateBaseColorTexture(const QColor &color, GLuint *texture); void fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index bc49e7ed..4dcf296f 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2604,13 +2604,23 @@ void Bars3DRenderer::initLabelShaders(const QString &vertexShader, const QString m_labelShader->initialize(); } -QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position) { - // Convert row and column to translation on graph - float xTrans = (((position.x() + 0.5f) * m_cachedBarSpacing.width()) - m_rowWidth) - / m_scaleFactor; - float zTrans = (m_columnDepth - ((position.z() + 0.5f) * m_cachedBarSpacing.height())) - / m_scaleFactor; - float yTrans = m_axisCacheY.positionAt(position.y()); +QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position, bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + // Convert row and column to translation on graph + xTrans = (((position.x() + 0.5f) * m_cachedBarSpacing.width()) - m_rowWidth) + / m_scaleFactor; + zTrans = (m_columnDepth - ((position.z() + 0.5f) * m_cachedBarSpacing.height())) + / m_scaleFactor; + yTrans = m_axisCacheY.positionAt(position.y()); + } else { + xTrans = position.x() * m_scaleX; + yTrans = position.y(); + zTrans = position.z() * m_scaleZ; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 68848673..2e9ec0de 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -122,7 +122,7 @@ public: void updateScene(Q3DScene *scene); void render(GLuint defaultFboHandle = 0); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3cf91833..acdd3cb8 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1967,10 +1967,21 @@ void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, Scatt } } -QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position) { - float xTrans = m_axisCacheX.positionAt(position.x()); - float yTrans = m_axisCacheY.positionAt(position.y()); - float zTrans = m_axisCacheZ.positionAt(position.z()); +QVector3D Scatter3DRenderer::convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + xTrans = m_axisCacheX.positionAt(position.x()); + yTrans = m_axisCacheY.positionAt(position.y()); + zTrans = m_axisCacheZ.positionAt(position.z()); + } else { + xTrans = position.x() * m_axisCacheX.scale() / 2.0f; + yTrans = position.y(); + zTrans = position.z() * m_axisCacheZ.scale() / 2.0f; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 09b8dace..0b58102b 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -108,7 +108,7 @@ public: void updateItems(const QVector &items); void updateScene(Q3DScene *scene); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); inline int clickedIndex() const { return m_clickedIndex; } void resetClickedStatus(); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index cc4cf788..4b5464d5 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1212,7 +1212,7 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) // Draw selection buffer if (!m_cachedIsSlicingActivated && (!m_renderCacheList.isEmpty() - || !m_customRenderCache.isEmpty()) + || !m_customRenderCache.isEmpty()) && m_selectionState == SelectOnScene && m_cachedSelectionMode > QAbstract3DGraph::SelectionNone) { m_selectionShader->bind(); @@ -2682,10 +2682,21 @@ void Surface3DRenderer::updateDepthBuffer() } #endif -QVector3D Surface3DRenderer::convertPositionToTranslation(const QVector3D &position) { - float xTrans = m_axisCacheX.positionAt(position.x()); - float yTrans = m_axisCacheY.positionAt(position.y()); - float zTrans = m_axisCacheZ.positionAt(position.z()); +QVector3D Surface3DRenderer::convertPositionToTranslation(const QVector3D &position, + bool isAbsolute) +{ + float xTrans = 0.0f; + float yTrans = 0.0f; + float zTrans = 0.0f; + if (!isAbsolute) { + xTrans = m_axisCacheX.positionAt(position.x()); + yTrans = m_axisCacheY.positionAt(position.y()); + zTrans = m_axisCacheZ.positionAt(position.z()); + } else { + xTrans = position.x() * m_scaleX; + yTrans = position.y(); + zTrans = position.z() * m_scaleZ; + } return QVector3D(xTrans, yTrans, zTrans); } diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index db46a17b..7c3e461d 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -116,7 +116,7 @@ public: void updateSelectedPoint(const QPoint &position, QSurface3DSeries *series); inline QPoint clickedPosition() const { return m_clickedPosition; } void resetClickedStatus(); - QVector3D convertPositionToTranslation(const QVector3D &position); + QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); void render(GLuint defaultFboHandle = 0); -- cgit v1.2.3 From fdae1424df750bd02913b9ceec1716b1187b2ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 21 May 2014 10:10:36 +0300 Subject: Added enablers for axis dragging to QML Task-number: QTRD-3003 Will add an example in a separate commit Change-Id: I7fa9eb1b504d188c77b66ef8d4b2ee44416667e2 Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 3 +- .../draggableaxes/axesinputhandler.cpp | 2 +- ...tdatavisualization-qml-abstractdeclarative.qdoc | 39 +++++++++----- .../engine/abstract3dcontroller.cpp | 5 ++ .../engine/abstract3dcontroller_p.h | 2 + src/datavisualization/engine/qabstract3dgraph.cpp | 62 ++++++++++++++-------- src/datavisualization/engine/qabstract3dgraph.h | 6 ++- src/datavisualizationqml2/abstractdeclarative.cpp | 7 ++- src/datavisualizationqml2/abstractdeclarative_p.h | 15 +++++- .../datavisualizationqml2_plugin.cpp | 3 ++ 10 files changed, 104 insertions(+), 40 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index be51f1f0..ca6a46ef 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -90,7 +90,7 @@ CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label) m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront); - connect(m_graph, &QAbstract3DGraph::elementSelected, + connect(m_graph, &QAbstract3DGraph::selectedElementChanged, this, &CustomItemGraph::handleElementSelected); m_selectionAnimation = new QPropertyAnimation(this); @@ -237,7 +237,6 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) m_selectionAnimation->setStartValue(item->scaling()); m_selectionAnimation->setEndValue(item->scaling() * 1.5f); m_selectionAnimation->start(); - item->setShadowCasting(false); } else if (type == QAbstract3DGraph::ElementSeries) { QString text = "Surface ("; QSurface3DSeries *series = m_graph->selectedSeries(); diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.cpp b/examples/datavisualization/draggableaxes/axesinputhandler.cpp index 70086b1c..ef7b871b 100644 --- a/examples/datavisualization/draggableaxes/axesinputhandler.cpp +++ b/examples/datavisualization/draggableaxes/axesinputhandler.cpp @@ -30,7 +30,7 @@ AxesInputHandler::AxesInputHandler(QAbstract3DGraph *graph, QObject *parent) : { //! [3] // Connect to the item selection signal from graph - connect(graph, &QAbstract3DGraph::elementSelected, this, + connect(graph, &QAbstract3DGraph::selectedElementChanged, this, &AxesInputHandler::handleElementSelected); //! [3] } diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index a71bd28b..2af73021 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -201,55 +201,70 @@ /*! * \qmlmethod int AbstractGraph3D::selectedLabelIndex() * - * Can be used to query the index of the selected label after receiving elementSelected signal with - * any label type. Selection is valid until the next elementSelected signal. + * Can be used to query the index of the selected label after receiving \c selectedElementChanged + * signal with any label type. Selection is valid until the next \c selectedElementChanged signal. * * \return index of the selected label, or -1. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ /*! * \qmlmethod Abstract3DAxis AbstractGraph3D::selectedAxis() * - * Can be used to get the selected axis after receiving elementSelected signal with any label type. - * Selection is valid until the next elementSelected signal. + * Can be used to get the selected axis after receiving \c selectedElementChanged signal with any label + * type. Selection is valid until the next \c selectedElementChanged signal. * * \return the selected axis, or null. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ /*! * \qmlmethod int AbstractGraph3D::selectedCustomItemIndex() * - * Can be used to query the index of the selected custom item after receiving elementSelected signal - * with \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Selection is valid until - * the next elementSelected signal. + * Can be used to query the index of the selected custom item after receiving \c selectedElementChanged + * signal with \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Selection is valid + * until the next \c selectedElementChanged signal. * * \return index of the selected custom item, or -1. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ /*! * \qmlmethod Custom3DItem AbstractGraph3D::selectedCustomItem() * - * Can be used to get the selected custom item after receiving elementSelected signal with + * Can be used to get the selected custom item after receiving \c selectedElementChanged signal with * \l{QAbstract3DGraph::ElementCustomItem}{ElementCustomItem} type. Ownership of the item remains - * with the graph. Selection is valid until the next elementSelected signal. + * with the graph. Selection is valid until the next \c selectedElementChanged signal. * * \return the selected custom item, or null. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ -/*! \qmlsignal AbstractGraph3D::elementSelected(ElementType type) +/*! + * \qmlproperty AbstractGraph3D.ElementType AbstractGraph3D::selectedElement + * + * Can be used to query the selected element type. + * Type is valid until the next \c selectedElementChanged signal. + * + * \c selectedElementChanged signal is emitted when a selection is made in the graph. * - * Emits selection \a type when a selection is made in the graph. + * Signal can be used for example for implementing customized input handling, as demonstrated in + * this \l {Qt Quick 2 Axis Dragging Example}{example}. * * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), - * Bars3D::selectedSeries, Scatter3D::selectedSeries, Surface3D::selectedSeries + * Bars3D::selectedSeries, Scatter3D::selectedSeries, Scene3D::selectionQueryPosition * * \since Qt Data Visualization 1.1 */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 9ba39786..838d6926 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -1393,6 +1393,11 @@ QCustom3DItem *Abstract3DController::selectedCustomItem() const return item; } +QAbstract3DGraph::ElementType Abstract3DController::selectedElement() const +{ + return m_renderer->clickedType(); +} + void Abstract3DController::setOrthoProjection(bool enable) { if (enable != m_useOrthoProjection) { diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index e1b266ce..a5d00cff 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -320,6 +320,8 @@ public slots: inline bool measureFps() const { return m_measureFps; } inline qreal currentFps() const { return m_currentFps; } + QAbstract3DGraph::ElementType selectedElement() const; + void updateCustomItem(); signals: diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 196460da..a232af6e 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -442,12 +442,14 @@ void QAbstract3DGraph::releaseCustomItem(QCustom3DItem *item) } /*! - * Can be used to query the index of the selected label after receiving elementSelected signal with - * any label type. Selection is valid until the next elementSelected signal. + * Can be used to query the index of the selected label after receiving \c selectedElementChanged + * signal with any label type. Selection is valid until the next \c selectedElementChanged signal. * * \return index of the selected label, or -1. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ int QAbstract3DGraph::selectedLabelIndex() const { @@ -455,12 +457,14 @@ int QAbstract3DGraph::selectedLabelIndex() const } /*! - * Can be used to get the selected axis after receiving elementSelected signal with any label type. - * Selection is valid until the next elementSelected signal. + * Can be used to get the selected axis after receiving \c selectedElementChanged signal with any label + * type. Selection is valid until the next \c selectedElementChanged signal. * * \return pointer to the selected axis, or null. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const { @@ -468,13 +472,15 @@ QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const } /*! - * Can be used to query the index of the selected custom item after receiving elementSelected signal - * with QAbstract3DGraph::ElementCustomItem type. Selection is valid until the next elementSelected - * signal. + * Can be used to query the index of the selected custom item after receiving \c selectedElementChanged + * signal with QAbstract3DGraph::ElementCustomItem type. Selection is valid until the next + * \c selectedElementChanged signal. * * \return index of the selected custom item, or -1. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ int QAbstract3DGraph::selectedCustomItemIndex() const { @@ -482,19 +488,43 @@ int QAbstract3DGraph::selectedCustomItemIndex() const } /*! - * Can be used to get the selected custom item after receiving elementSelected signal with + * Can be used to get the selected custom item after receiving \c selectedElementChanged signal with * QAbstract3DGraph::ElementCustomItem type. Ownership of the item remains with the graph. - * Selection is valid until the next elementSelected signal. + * Selection is valid until the next \c selectedElementChanged signal. * * \return pointer to the selected custom item, or null. * * \since Qt Data Visualization 1.1 + * + * \sa selectedElement */ QCustom3DItem *QAbstract3DGraph::selectedCustomItem() const { return d_ptr->m_visualController->selectedCustomItem(); } +/*! + * \property QAbstract3DGraph::selectedElement + * + * Can be used to query the selected element type. + * Type is valid until the next \c selectedElementChanged signal. + * + * \c selectedElementChanged signal is emitted when a selection is made in the graph. + * + * Signal can be used for example for implementing custom input handlers, as demonstrated in this + * \l {Axis Range Dragging With Labels Example}{example}. + * + * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), + * Q3DBars::selectedSeries(), Q3DScatter::selectedSeries(), Q3DSurface::selectedSeries(), + * Q3DScene::setSelectionQueryPosition() + * + * \since Qt Data Visualization 1.1 + */ +QAbstract3DGraph::ElementType QAbstract3DGraph::selectedElement() const +{ + return d_ptr->m_visualController->selectedElement(); +} + /*! * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. @@ -511,18 +541,6 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) return d_ptr->renderToImage(msaaSamples, renderSize); } -/*! \fn QAbstract3DGraph::elementSelected(ElementType type) - * \since Qt Data Visualization 1.1 - * - * Emits selection \a type when a selection is made in the graph. - * - * Signal can be used for example for implementing custom input handlers, as demonstrated in this - * \l {Axis Range Dragging With Labels Example}{example}. - * - * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), - * Q3DBars::selectedSeries(), Q3DScatter::selectedSeries(), Q3DSurface::selectedSeries() - */ - /*! * \property QAbstract3DGraph::measureFps * \since Qt Data Visualization 1.1 @@ -699,7 +717,7 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll QObject::connect(m_visualController, &Abstract3DController::shadowQualityChanged, q_ptr, &QAbstract3DGraph::shadowQualityChanged); QObject::connect(m_visualController, &Abstract3DController::elementSelected, q_ptr, - &QAbstract3DGraph::elementSelected); + &QAbstract3DGraph::selectedElementChanged); QObject::connect(m_visualController, &Abstract3DController::needRender, this, &QAbstract3DGraphPrivate::renderLater); diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 23dba269..23214c57 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -36,6 +36,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q { Q_OBJECT Q_ENUMS(ShadowQuality) + Q_ENUMS(ElementType) Q_FLAGS(SelectionFlag SelectionFlags) Q_PROPERTY(QAbstract3DInputHandler* activeInputHandler READ activeInputHandler WRITE setActiveInputHandler NOTIFY activeInputHandlerChanged) Q_PROPERTY(Q3DTheme* activeTheme READ activeTheme WRITE setActiveTheme NOTIFY activeThemeChanged) @@ -45,6 +46,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged) Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) + Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -131,6 +133,8 @@ public: void setOrthoProjection(bool enable); bool isOrthoProjection() const; + ElementType selectedElement() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -148,7 +152,7 @@ signals: void activeThemeChanged(Q3DTheme *theme); void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode); void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); - void elementSelected(QAbstract3DGraph::ElementType type); + void selectedElementChanged(QAbstract3DGraph::ElementType type); void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 47d3bb66..c09204da 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -309,7 +309,7 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) QObject::connect(m_controller.data(), &Abstract3DController::selectionModeChanged, this, &AbstractDeclarative::handleSelectionModeChange); QObject::connect(m_controller.data(), &Abstract3DController::elementSelected, this, - &AbstractDeclarative::elementSelected); + &AbstractDeclarative::selectedElementChanged); QObject::connect(m_controller.data(), &Abstract3DController::axisXChanged, this, &AbstractDeclarative::handleAxisXChanged); @@ -682,6 +682,11 @@ bool AbstractDeclarative::isOrthoProjection() const return m_controller->isOrthoProjection(); } +AbstractDeclarative::ElementType AbstractDeclarative::selectedElement() const +{ + return ElementType(m_controller->selectedElement()); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 8095e87a..2cdcafc8 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -57,6 +57,7 @@ class AbstractDeclarative : public QQuickItem Q_OBJECT Q_ENUMS(ShadowQuality) Q_ENUMS(RenderingMode) + Q_ENUMS(ElementType) Q_FLAGS(SelectionFlag SelectionFlags) Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) @@ -70,6 +71,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged REVISION 1) Q_PROPERTY(QQmlListProperty customItemList READ customItemList REVISION 1) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1) + Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged REVISION 1) public: enum SelectionFlag { @@ -96,6 +98,15 @@ public: ShadowQualitySoftHigh }; + enum ElementType { + ElementNone = 0, + ElementSeries, + ElementAxisXLabel, + ElementAxisZLabel, + ElementAxisYLabel, + ElementCustomItem + }; + enum RenderingMode { RenderDirectToBackground = 0, RenderDirectToBackground_NoClear, @@ -168,6 +179,8 @@ public: void setOrthoProjection(bool enable); bool isOrthoProjection() const; + AbstractDeclarative::ElementType selectedElement() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -199,7 +212,7 @@ signals: void renderingModeChanged(AbstractDeclarative::RenderingMode mode); Q_REVISION(1) void measureFpsChanged(bool enabled); Q_REVISION(1) void currentFpsChanged(qreal fps); - Q_REVISION(1) void elementSelected(QAbstract3DGraph::ElementType type); + Q_REVISION(1) void selectedElementChanged(QAbstract3DGraph::ElementType type); Q_REVISION(1) void orthoProjectionChanged(bool enabled); private: diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index f90ffb4b..fd45bdca 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -102,6 +102,9 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); qmlRegisterType(uri, 1, 1, "LogValueAxis3DFormatter"); qmlRegisterType(uri, 1, 1, "Custom3DItem"); + + // New metatypes + qRegisterMetaType("QAbstract3DGraph::ElementType"); } QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 37a82fbeb7aa59260fe5f31b62228914ee4a44a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 21 May 2014 12:27:16 +0300 Subject: Added an example about QML axis dragging Task-number: QTRD-3128 To be documented Change-Id: I044a890c8ef4814274b97be68cf7582c07a77247 Reviewed-by: Miikka Heikkinen --- examples/datavisualization/datavisualization.pro | 3 +- examples/datavisualization/qmlaxisdrag/main.cpp | 48 +++ .../qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml | 44 +++ .../qmlaxisdrag/qml/qmlaxisdrag/cube.obj | 415 +++++++++++++++++++++ .../qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png | Bin 0 -> 10429 bytes .../qmlaxisdrag/qml/qmlaxisdrag/main.qml | 266 +++++++++++++ .../datavisualization/qmlaxisdrag/qmlaxisdrag.pro | 11 + .../datavisualization/qmlaxisdrag/qmlaxisdrag.qrc | 12 + 8 files changed, 798 insertions(+), 1 deletion(-) create mode 100644 examples/datavisualization/qmlaxisdrag/main.cpp create mode 100644 examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml create mode 100644 examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj create mode 100644 examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png create mode 100644 examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml create mode 100644 examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro create mode 100644 examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro index bd736360..1f72820c 100644 --- a/examples/datavisualization/datavisualization.pro +++ b/examples/datavisualization/datavisualization.pro @@ -7,7 +7,8 @@ SUBDIRS += qmlbars \ qmlmultigraph \ qmloscilloscope \ qmlsurfacelayers \ - qmlaxisformatter + qmlaxisformatter \ + qmlaxisdrag !android:!ios { SUBDIRS += bars \ diff --git a/examples/datavisualization/qmlaxisdrag/main.cpp b/examples/datavisualization/qmlaxisdrag/main.cpp new file mode 100644 index 00000000..523d8d16 --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/main.cpp @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQuickView viewer; + + // The following are needed to make examples run without having to install the module + // in desktop environments. +#ifdef Q_OS_WIN + QString extraImportPath(QStringLiteral("%1/../../../../%2")); +#else + QString extraImportPath(QStringLiteral("%1/../../../%2")); +#endif + viewer.engine()->addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(), + QString::fromLatin1("qml"))); + QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close); + + viewer.setTitle(QStringLiteral("QML Draggable Axes")); + + viewer.setSource(QUrl("qrc:/qml/qmlaxisdrag/main.qml")); + viewer.setResizeMode(QQuickView::SizeRootObjectToView); + viewer.show(); + + return app.exec(); +} diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml new file mode 100644 index 00000000..ce946ed8 --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/NewButton.qml @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Controls 1.0 + +Item { + id: newbutton + + property alias text: buttonText.text + + signal clicked + + height: 80 + + Button { + opacity: 0.5 + width: parent.width + height: parent.height + Text { + id: buttonText + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + onClicked: newbutton.clicked() + } +} diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj new file mode 100644 index 00000000..0197618f --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cube.obj @@ -0,0 +1,415 @@ +# Blender v2.66 (sub 0) OBJ File: 'beveled_cube.blend' +# www.blender.org +v -1.000000 -0.878027 0.878027 +v -0.978771 -0.929277 0.878027 +v -0.950975 -0.932562 0.932562 +v -0.978771 -0.878027 0.929277 +v -0.932562 -0.950975 0.932562 +v -0.929277 -0.978771 0.878027 +v -0.878027 -1.000000 0.878027 +v -0.878027 -0.978771 0.929277 +v -0.932562 -0.932562 0.950975 +v -0.878027 -0.929277 0.978771 +v -0.878027 -0.878027 1.000000 +v -0.929277 -0.878027 0.978771 +v -1.000000 -0.878027 -0.878027 +v -0.978771 -0.878027 -0.929277 +v -0.950975 -0.932562 -0.932562 +v -0.978771 -0.929277 -0.878027 +v -0.932562 -0.932562 -0.950975 +v -0.929277 -0.878027 -0.978771 +v -0.878027 -0.878027 -1.000000 +v -0.878027 -0.929277 -0.978771 +v -0.932562 -0.950975 -0.932562 +v -0.878027 -0.978771 -0.929277 +v -0.878027 -1.000000 -0.878027 +v -0.929277 -0.978771 -0.878027 +v 0.878027 -0.878027 -1.000000 +v 0.929277 -0.878027 -0.978771 +v 0.932562 -0.932562 -0.950975 +v 0.878027 -0.929277 -0.978771 +v 0.950975 -0.932562 -0.932562 +v 0.978771 -0.878027 -0.929277 +v 1.000000 -0.878027 -0.878027 +v 0.978771 -0.929277 -0.878027 +v 0.932562 -0.950975 -0.932562 +v 0.929277 -0.978771 -0.878027 +v 0.878027 -1.000000 -0.878027 +v 0.878027 -0.978771 -0.929277 +v 1.000000 -0.878027 0.878027 +v 0.978771 -0.878027 0.929277 +v 0.950975 -0.932562 0.932562 +v 0.978771 -0.929277 0.878027 +v 0.932562 -0.932562 0.950975 +v 0.929277 -0.878027 0.978771 +v 0.878027 -0.878027 1.000000 +v 0.878027 -0.929277 0.978771 +v 0.932562 -0.950975 0.932562 +v 0.878027 -0.978771 0.929277 +v 0.878027 -1.000000 0.878027 +v 0.929277 -0.978771 0.878027 +v -0.878027 0.878027 1.000000 +v -0.878027 0.929277 0.978771 +v -0.932562 0.932562 0.950975 +v -0.929277 0.878027 0.978771 +v -0.932562 0.950975 0.932562 +v -0.878027 0.978771 0.929277 +v -0.878027 1.000000 0.878027 +v -0.929277 0.978771 0.878027 +v -0.950975 0.932562 0.932562 +v -0.978771 0.929277 0.878027 +v -1.000000 0.878027 0.878027 +v -0.978771 0.878027 0.929277 +v -1.000000 0.878027 -0.878027 +v -0.978771 0.929277 -0.878027 +v -0.950975 0.932562 -0.932562 +v -0.978771 0.878027 -0.929277 +v -0.932562 0.950975 -0.932562 +v -0.929277 0.978771 -0.878027 +v -0.878027 1.000000 -0.878027 +v -0.878027 0.978771 -0.929277 +v -0.932562 0.932562 -0.950975 +v -0.878027 0.929277 -0.978771 +v -0.878027 0.878027 -1.000000 +v -0.929277 0.878027 -0.978771 +v 0.878027 0.878027 -1.000000 +v 0.878027 0.929277 -0.978771 +v 0.932562 0.932562 -0.950975 +v 0.929277 0.878027 -0.978771 +v 0.932562 0.950975 -0.932562 +v 0.878027 0.978771 -0.929277 +v 0.878027 1.000000 -0.878027 +v 0.929277 0.978771 -0.878027 +v 0.950975 0.932562 -0.932562 +v 0.978771 0.929277 -0.878027 +v 1.000000 0.878027 -0.878027 +v 0.978771 0.878027 -0.929277 +v 1.000000 0.878027 0.878027 +v 0.978771 0.929277 0.878027 +v 0.950975 0.932562 0.932562 +v 0.978771 0.878027 0.929277 +v 0.932562 0.950975 0.932562 +v 0.929277 0.978771 0.878027 +v 0.878027 1.000000 0.878027 +v 0.878027 0.978771 0.929277 +v 0.932562 0.932562 0.950975 +v 0.878027 0.929277 0.978771 +v 0.878027 0.878027 1.000000 +v 0.929277 0.878027 0.978771 +vt 0.024513 0.966281 +vt 0.033719 0.975487 +vt 0.033719 0.966281 +vt 0.964639 0.060986 +vt 0.964639 0.939014 +vt 0.989386 0.939014 +vt 0.939014 0.964639 +vt 0.060986 0.964639 +vt 0.939014 0.989386 +vt 0.060986 0.060986 +vt 0.060986 0.939014 +vt 0.939014 0.939014 +vt 0.035361 0.060986 +vt 0.035361 0.939014 +vt 0.010614 0.060986 +vt 0.010614 0.939014 +vt 0.989386 0.060986 +vt 0.939014 0.035361 +vt 0.060986 0.035361 +vt 0.060986 0.010614 +vt 0.060986 0.989386 +vt 0.939014 0.060986 +vt 0.966281 0.975487 +vt 0.966281 0.966281 +vt 0.975487 0.966281 +vt 0.975487 0.033719 +vt 0.966281 0.033719 +vt 0.966281 0.024513 +vt 0.033719 0.024513 +vt 0.033719 0.033719 +vt 0.024513 0.033719 +vt 0.939014 0.010614 +vn -0.713187 -0.495651 -0.495651 +vn -0.495651 -0.495651 -0.713187 +vn -0.495651 -0.713187 -0.495651 +vn 0.539384 -0.823450 0.175909 +vn 0.539384 -0.823450 -0.175909 +vn 0.823450 -0.539384 -0.175909 +vn -0.713187 0.495651 -0.495651 +vn -0.495651 0.713187 -0.495651 +vn -0.495651 0.495651 -0.713187 +vn 0.175909 -0.823450 -0.539384 +vn -0.185644 -0.825892 -0.532365 +vn 0.175909 -0.539384 -0.823450 +vn -0.193426 -0.961852 0.193426 +vn -0.193426 -0.961852 -0.193426 +vn 0.187689 -0.964110 -0.187689 +vn -0.532365 -0.185644 0.825892 +vn -0.532365 0.185644 0.825892 +vn -0.825892 -0.185644 0.532365 +vn -0.532365 0.185644 -0.825892 +vn -0.532365 -0.185644 -0.825892 +vn -0.825892 0.185644 -0.532365 +vn 0.823450 0.175909 -0.539384 +vn 0.823450 -0.175909 -0.539384 +vn 0.539384 -0.175909 -0.823450 +vn 0.539384 0.175909 0.823450 +vn 0.539384 -0.175909 0.823450 +vn 0.823450 -0.175909 0.539384 +vn 0.175909 0.823450 0.539384 +vn -0.185644 0.825892 0.532365 +vn -0.185644 0.532365 0.825892 +vn -0.185644 0.825892 -0.532365 +vn 0.175909 0.823450 -0.539384 +vn -0.185644 0.532365 -0.825892 +vn 0.539384 0.823450 -0.175909 +vn 0.539384 0.823450 0.175909 +vn 0.823450 0.539384 0.175909 +vn 0.187689 0.964110 0.187689 +vn 0.187689 0.964110 -0.187689 +vn -0.193426 0.961852 -0.193426 +vn -0.193426 0.193426 -0.961852 +vn 0.187689 0.187689 -0.964110 +vn -0.193426 -0.193426 -0.961852 +vn -0.961852 0.193426 0.193426 +vn -0.961852 0.193426 -0.193426 +vn -0.961852 -0.193426 0.193426 +vn -0.532365 -0.825892 -0.185644 +vn -0.532365 -0.825892 0.185644 +vn -0.825892 -0.532365 -0.185644 +vn 0.498856 0.498856 -0.708701 +vn 0.498856 0.708701 -0.498856 +vn 0.708701 0.498856 -0.498856 +vn 0.964110 0.187689 -0.187689 +vn 0.964110 0.187689 0.187689 +vn 0.964110 -0.187689 0.187689 +vn 0.498856 -0.498856 -0.708701 +vn 0.708701 -0.498856 -0.498856 +vn 0.498856 -0.708701 -0.498856 +vn 0.708701 0.498856 0.498856 +vn 0.498856 0.708701 0.498856 +vn 0.498856 0.498856 0.708701 +vn -0.495651 0.495651 0.713187 +vn -0.495651 0.713187 0.495651 +vn -0.713187 0.495651 0.495651 +vn 0.708701 -0.498856 0.498856 +vn 0.498856 -0.498856 0.708701 +vn 0.498856 -0.708701 0.498856 +vn -0.532365 0.825892 0.185644 +vn -0.532365 0.825892 -0.185644 +vn -0.825892 0.532365 0.185644 +vn 0.187689 0.187689 0.964110 +vn -0.193426 0.193426 0.961852 +vn -0.193426 -0.193426 0.961852 +vn -0.185644 -0.825892 0.532365 +vn 0.175909 -0.823450 0.539384 +vn 0.175909 -0.539384 0.823450 +vn -0.825892 -0.532365 0.185644 +vn -0.713187 -0.495651 0.495651 +vn -0.495651 -0.713187 0.495651 +vn -0.495651 -0.495651 0.713187 +vn -0.185644 -0.532365 0.825892 +vn -0.961852 -0.193426 -0.193426 +vn -0.825892 -0.185644 -0.532365 +vn 0.187689 -0.187689 -0.964110 +vn 0.823450 -0.539384 0.175909 +vn -0.193426 0.961852 0.193426 +vn -0.825892 0.532365 -0.185644 +vn 0.175909 0.539384 -0.823450 +vn 0.539384 0.175909 -0.823450 +vn 0.823450 0.539384 -0.175909 +vn 0.823450 0.175909 0.539384 +vn 0.175909 0.539384 0.823450 +vn -0.185644 -0.532365 -0.825892 +vn -0.825892 0.185644 0.532365 +vn 0.964110 -0.187689 -0.187689 +vn 0.187689 -0.187689 0.964110 +vn 0.187689 -0.964110 0.187689 +s 1 +f 15/1/1 17/2/2 21/3/3 +f 48/4/4 34/5/5 32/6/6 +f 63/1/7 65/3/8 69/2/9 +f 36/7/10 22/8/11 28/9/12 +f 7/10/13 23/11/14 35/12/15 +f 12/13/16 52/14/17 4/15/18 +f 72/14/19 18/13/20 64/16/21 +f 84/6/22 30/17/23 26/4/24 +f 96/5/25 42/4/26 38/17/27 +f 92/18/28 54/19/29 50/20/30 +f 68/8/31 78/7/32 70/21/33 +f 80/5/34 90/4/35 86/17/36 +f 91/22/37 79/12/38 67/11/39 +f 71/11/40 73/12/41 19/10/42 +f 59/11/43 61/12/44 1/10/45 +f 24/14/46 6/13/47 16/16/48 +f 75/23/49 77/24/50 81/25/51 +f 83/12/52 85/11/53 37/10/54 +f 27/23/55 29/25/56 33/24/57 +f 87/26/58 89/27/59 93/28/60 +f 51/29/61 53/30/62 57/31/63 +f 39/26/64 41/28/65 45/27/66 +f 56/13/67 66/14/68 58/15/69 +f 95/12/70 49/11/71 11/10/72 +f 8/19/73 46/18/74 44/32/75 +f 1/10/45 2/19/76 3/30/77 +f 5/30/78 6/13/47 7/10/13 +f 9/30/79 10/19/80 11/10/72 +f 13/22/81 14/4/82 15/27/1 +f 17/30/2 18/13/20 19/10/42 +f 21/3/3 22/8/11 23/11/14 +f 25/22/83 26/4/24 28/18/12 +f 29/27/56 30/4/23 32/18/6 +f 33/24/57 34/5/5 36/7/10 +f 37/10/54 38/13/27 40/19/84 +f 41/27/65 42/4/26 44/18/75 +f 45/27/66 46/18/74 48/4/4 +f 49/11/71 50/8/30 51/3/61 +f 53/30/62 54/19/29 55/10/85 +f 57/3/63 58/8/69 59/11/43 +f 61/12/44 62/7/86 63/24/7 +f 65/3/8 66/14/68 67/11/39 +f 69/3/9 70/8/33 71/11/40 +f 73/12/41 74/7/87 76/5/88 +f 77/24/50 78/7/32 80/5/34 +f 81/24/51 82/7/89 84/5/22 +f 85/11/53 86/8/36 88/14/90 +f 89/27/59 90/4/35 92/18/28 +f 93/24/60 94/7/91 96/5/25 +f 2/15/76 6/13/47 3/31/77 +f 8/19/73 10/20/80 5/30/78 +f 12/13/16 4/15/18 9/30/79 +f 14/15/82 18/13/20 15/31/1 +f 20/21/92 22/8/11 17/2/2 +f 24/14/46 16/16/48 21/3/3 +f 26/4/24 30/17/23 29/26/56 +f 32/6/6 34/5/5 33/24/57 +f 36/7/10 28/9/12 27/23/55 +f 38/17/27 42/4/26 41/27/65 +f 44/32/75 46/18/74 45/27/66 +f 48/4/4 40/17/84 39/26/64 +f 50/20/30 54/19/29 51/29/61 +f 56/13/67 58/15/69 53/30/62 +f 60/16/93 52/14/17 57/1/63 +f 62/16/86 66/14/68 63/1/7 +f 68/8/31 70/21/33 65/3/8 +f 72/14/19 64/16/21 69/3/9 +f 74/9/87 78/7/32 77/24/50 +f 80/5/34 82/6/89 81/25/51 +f 84/6/22 76/5/88 75/24/49 +f 86/17/36 90/4/35 89/27/59 +f 92/18/28 94/32/91 93/28/60 +f 96/5/25 88/6/90 87/25/58 +f 55/10/85 67/11/39 56/13/67 +f 61/12/44 59/11/43 62/7/86 +f 71/11/40 19/10/42 72/14/19 +f 13/22/81 61/12/44 14/4/82 +f 23/11/14 7/10/13 24/14/46 +f 1/10/45 13/22/81 2/19/76 +f 11/10/72 49/11/71 12/13/16 +f 59/11/43 1/10/45 60/14/93 +f 67/11/39 79/12/38 68/8/31 +f 73/12/41 71/11/40 74/7/87 +f 83/12/52 31/22/94 30/4/23 +f 25/22/83 73/12/41 76/5/88 +f 35/12/15 23/11/14 36/7/10 +f 19/10/42 25/22/83 20/19/92 +f 79/12/38 91/22/37 90/4/35 +f 85/11/53 83/12/52 82/7/89 +f 95/12/70 43/22/95 42/4/26 +f 37/10/54 85/11/53 88/14/90 +f 47/22/96 35/12/15 34/5/5 +f 31/22/94 37/10/54 40/19/84 +f 91/22/37 55/10/85 54/19/29 +f 49/11/71 95/12/70 94/7/91 +f 7/10/13 47/22/96 46/18/74 +f 43/22/95 11/10/72 10/19/80 +f 3/31/77 5/30/78 9/29/79 +f 40/17/84 48/4/4 32/6/6 +f 22/8/11 20/21/92 28/9/12 +f 47/22/96 7/10/13 35/12/15 +f 52/14/17 60/16/93 4/15/18 +f 18/13/20 14/15/82 64/16/21 +f 76/5/88 84/6/22 26/4/24 +f 88/6/90 96/5/25 38/17/27 +f 94/32/91 92/18/28 50/20/30 +f 78/7/32 74/9/87 70/21/33 +f 82/6/89 80/5/34 86/17/36 +f 55/10/85 91/22/37 67/11/39 +f 73/12/41 25/22/83 19/10/42 +f 61/12/44 13/22/81 1/10/45 +f 6/13/47 2/15/76 16/16/48 +f 31/22/94 83/12/52 37/10/54 +f 66/14/68 62/16/86 58/15/69 +f 43/22/95 95/12/70 11/10/72 +f 10/20/80 8/19/73 44/32/75 +f 4/13/18 1/10/45 3/30/77 +f 8/19/73 5/30/78 7/10/13 +f 12/13/16 9/30/79 11/10/72 +f 16/18/48 13/22/81 15/27/1 +f 20/19/92 17/30/2 19/10/42 +f 24/14/46 21/3/3 23/11/14 +f 26/4/24 27/27/55 28/18/12 +f 30/4/23 31/22/94 32/18/6 +f 34/5/5 35/12/15 36/7/10 +f 38/13/27 39/30/64 40/19/84 +f 42/4/26 43/22/95 44/18/75 +f 46/18/74 47/22/96 48/4/4 +f 52/14/17 49/11/71 51/3/61 +f 56/13/67 53/30/62 55/10/85 +f 60/14/93 57/3/63 59/11/43 +f 64/5/21 61/12/44 63/24/7 +f 68/8/31 65/3/8 67/11/39 +f 72/14/19 69/3/9 71/11/40 +f 74/7/87 75/24/49 76/5/88 +f 78/7/32 79/12/38 80/5/34 +f 82/7/89 83/12/52 84/5/22 +f 86/8/36 87/3/58 88/14/90 +f 90/4/35 91/22/37 92/18/28 +f 94/7/91 95/12/70 96/5/25 +f 6/13/47 5/30/78 3/31/77 +f 10/20/80 9/29/79 5/30/78 +f 4/15/18 3/31/77 9/30/79 +f 18/13/20 17/30/2 15/31/1 +f 22/8/11 21/3/3 17/2/2 +f 16/16/48 15/1/1 21/3/3 +f 27/27/55 26/4/24 29/26/56 +f 29/25/56 32/6/6 33/24/57 +f 33/24/57 36/7/10 27/23/55 +f 39/26/64 38/17/27 41/27/65 +f 41/28/65 44/32/75 45/27/66 +f 45/27/66 48/4/4 39/26/64 +f 54/19/29 53/30/62 51/29/61 +f 58/15/69 57/31/63 53/30/62 +f 52/14/17 51/3/61 57/1/63 +f 66/14/68 65/3/8 63/1/7 +f 70/21/33 69/2/9 65/3/8 +f 64/16/21 63/1/7 69/3/9 +f 75/23/49 74/9/87 77/24/50 +f 77/24/50 80/5/34 81/25/51 +f 81/25/51 84/6/22 75/24/49 +f 87/26/58 86/17/36 89/27/59 +f 89/27/59 92/18/28 93/28/60 +f 93/24/60 96/5/25 87/25/58 +f 67/11/39 66/14/68 56/13/67 +f 59/11/43 58/8/69 62/7/86 +f 19/10/42 18/13/20 72/14/19 +f 61/12/44 64/5/21 14/4/82 +f 7/10/13 6/13/47 24/14/46 +f 13/22/81 16/18/48 2/19/76 +f 49/11/71 52/14/17 12/13/16 +f 1/10/45 4/13/18 60/14/93 +f 79/12/38 78/7/32 68/8/31 +f 71/11/40 70/8/33 74/7/87 +f 84/5/22 83/12/52 30/4/23 +f 26/4/24 25/22/83 76/5/88 +f 23/11/14 22/8/11 36/7/10 +f 25/22/83 28/18/12 20/19/92 +f 80/5/34 79/12/38 90/4/35 +f 86/8/36 85/11/53 82/7/89 +f 96/5/25 95/12/70 42/4/26 +f 38/13/27 37/10/54 88/14/90 +f 48/4/4 47/22/96 34/5/5 +f 32/18/6 31/22/94 40/19/84 +f 92/18/28 91/22/37 54/19/29 +f 50/8/30 49/11/71 94/7/91 +f 8/19/73 7/10/13 46/18/74 +f 44/18/75 43/22/95 10/19/80 diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png new file mode 100644 index 00000000..3cea6863 Binary files /dev/null and b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/cubetexture.png differ diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml new file mode 100644 index 00000000..64472a57 --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -0,0 +1,266 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +import QtQuick 2.1 +import QtDataVisualization 1.1 +import "." + +Item { + id: mainView + width: 800 + height: 600 + visible: true + + property int selectedAxisLabel: -1 + property real dragSpeedModifier: 100.0 + + ListModel { + id: graphModel + ListElement{ xPos: 0.0; yPos: 0.0; zPos: 0.0; rotation: "@0,0,0,0" } + ListElement{ xPos: 1.0; yPos: 1.0; zPos: 1.0; rotation: "@45,1,1,1" } + } + + Timer { + id: dataTimer + interval: 1 + running: true + repeat: true + property bool isIncreasing: true + property real rotationAngle: 0 + + function generateQuaternion() { + return "@" + Math.random() * 360 + "," + Math.random() + "," + + Math.random() + "," + Math.random() + } + + function appendRow() { + graphModel.append({"xPos": Math.random(), + "yPos": Math.random(), + "zPos": Math.random(), + "rotation": generateQuaternion() + }); + } + + onTriggered: { + rotationAngle = rotationAngle + 1 + scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle) + qtCube.setRotationAxisAndAngle(Qt.vector3d(1,0,1), rotationAngle) + if (isIncreasing) { + for (var i = 0; i < 10; i++) + appendRow() + if (graphModel.count > 2002) { + scatterGraph.theme = isabelleTheme + isIncreasing = false + } + } else { + graphModel.remove(2, 10); + if (graphModel.count == 2) { + scatterGraph.theme = dynamicColorTheme + isIncreasing = true + } + } + } + } + + ThemeColor { + id: dynamicColor + ColorAnimation on color { + from: "red" + to: "yellow" + duration: 2000 + loops: Animation.Infinite + } + } + + Theme3D { + id: dynamicColorTheme + type: Theme3D.ThemeEbony + baseColors: [dynamicColor] + font.pointSize: 50 + labelBorderEnabled: true + labelBackgroundColor: "gold" + labelTextColor: "black" + } + + Theme3D { + id: isabelleTheme + type: Theme3D.ThemeIsabelle + font.pointSize: 50 + labelBorderEnabled: true + labelBackgroundColor: "gold" + labelTextColor: "black" + } + + Item { + id: dataView + anchors.bottom: parent.bottom + width: parent.width + height: parent.height + + Scatter3D { + id: scatterGraph + width: dataView.width + height: dataView.height + theme: dynamicColorTheme + shadowQuality: AbstractGraph3D.ShadowQualityNone + scene.activeCamera.yRotation: 45.0 + scene.activeCamera.xRotation: 45.0 + scene.activeCamera.zoomLevel: 75.0 + inputHandler: null + + Scatter3DSeries { + id: scatterSeries + itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel" + mesh: Abstract3DSeries.MeshCube + + ItemModelScatterDataProxy { + itemModel: graphModel + xPosRole: "xPos" + yPosRole: "yPos" + zPosRole: "zPos" + rotationRole: "rotation" + } + } + customItemList: [ + Custom3DItem { + id: qtCube + meshFile: ":/mesh/cube" + textureFile: ":/texture/texture" + position: Qt.vector3d(0.5,0.5,0.5) + scaling: Qt.vector3d(0.3,0.3,0.3) + } + ] + onSelectedElementChanged: { + if (selectedElement >= AbstractGraph3D.ElementAxisXLabel + && selectedElement <= AbstractGraph3D.ElementAxisYLabel) + selectedAxisLabel = selectedElement + else + selectedAxisLabel = -1 + } + } + + MouseArea { + id: inputArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.LeftButton + property int mouseX: -1 + property int mouseY: -1 + property int previousMouseX: -1 + property int previousMouseY: -1 + + onPositionChanged: { + mouseX = mouse.x; + mouseY = mouse.y; + if (pressed && selectedAxisLabel != -1) + dragAxis(mouseX, mouseY, previousMouseX, previousMouseY); + previousMouseX = mouseX; + previousMouseY = mouseY; + } + + onPressed: { + scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, + inputArea.mouseY); + } + } + } + + function dragAxis(mouseX, mouseY, previousMouseX, previousMouseY) { + // Directional drag multipliers based on rotation + // In this example camera is locked to 45 degrees, so we can use precalculated values + var xMulX = 0.70710678146 + var xMulY = 0.7071067809 + var zMulX = 0.7071067809 + var zMulY = 0.70710678146 + + // Get the drag amount + var moveX = mouseX - previousMouseX + var moveY = mouseY - previousMouseY + + // Adjust axes + switch (selectedAxisLabel) { + case AbstractGraph3D.ElementAxisXLabel: + var distance = (moveX * xMulX - moveY * xMulY) / dragSpeedModifier + scatterGraph.axisX.min -= distance + scatterGraph.axisX.max -= distance + break + case AbstractGraph3D.ElementAxisZLabel: + distance = (moveX * zMulX + moveY * zMulY) / dragSpeedModifier + scatterGraph.axisZ.min += distance + scatterGraph.axisZ.max += distance + break + case AbstractGraph3D.ElementAxisYLabel: + distance = moveY / dragSpeedModifier + scatterGraph.axisY.min += distance + scatterGraph.axisY.max += distance + break + } + } + + NewButton { + id: rangeToggle + width: parent.width / 3 // We're adding 3 buttons and want to divide them equally + text: "Use Preset Range" + anchors.left: parent.left + property bool autoRange: true + onClicked: { + if (autoRange) { + text = "Use Automatic Range" + scatterGraph.axisX.min = 0.3 + scatterGraph.axisX.max = 0.7 + scatterGraph.axisY.min = 0.3 + scatterGraph.axisY.max = 0.7 + scatterGraph.axisZ.min = 0.3 + scatterGraph.axisZ.max = 0.7 + autoRange = false + dragSpeedModifier = 200.0 + } else { + text = "Use Preset Range" + autoRange = true + dragSpeedModifier = 100.0 + } + scatterGraph.axisX.autoAdjustRange = autoRange + scatterGraph.axisY.autoAdjustRange = autoRange + scatterGraph.axisZ.autoAdjustRange = autoRange + } + } + + NewButton { + id: orthoToggle + width: parent.width / 3 + text: "Display Orthographic" + anchors.left: rangeToggle.right + onClicked: { + if (scatterGraph.orthoProjection) { + text = "Display Orthographic"; + scatterGraph.orthoProjection = false + } else { + text = "Display Perspective"; + scatterGraph.orthoProjection = true + } + } + } + + NewButton { + id: exitButton + width: parent.width / 3 + text: "Quit" + anchors.left: orthoToggle.right + onClicked: Qt.quit(0); + } +} diff --git a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro new file mode 100644 index 00000000..d45525ad --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.pro @@ -0,0 +1,11 @@ +!include( ../examples.pri ) { + error( "Couldn't find the examples.pri file!" ) +} + +SOURCES += main.cpp + +RESOURCES += qmlaxisdrag.qrc + +OTHER_FILES += doc/src/* \ + doc/images/* \ + qml/qmlaxisdrag/* diff --git a/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc new file mode 100644 index 00000000..c6c45e26 --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/qmlaxisdrag.qrc @@ -0,0 +1,12 @@ + + + qml/qmlaxisdrag/main.qml + qml/qmlaxisdrag/NewButton.qml + + + qml/qmlaxisdrag/cube.obj + + + qml/qmlaxisdrag/cubetexture.png + + -- cgit v1.2.3 From cb79f11be1c0c379a1eccea62606a58b73442f2f Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 21 May 2014 13:37:11 +0300 Subject: Cache ObjectHelper instances MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2792 Change-Id: I90d83bd9b73a0f337fd26f1b92000e72b3ec0607 Reviewed-by: Tomi Korpipää --- src/datavisualization/data/customrenderitem.cpp | 18 ++--- src/datavisualization/data/customrenderitem_p.h | 9 ++- .../engine/abstract3drenderer.cpp | 1 + src/datavisualization/engine/bars3drenderer.cpp | 24 +++---- src/datavisualization/engine/bars3drenderer_p.h | 6 +- src/datavisualization/engine/scatter3drenderer.cpp | 24 +++---- src/datavisualization/engine/scatter3drenderer_p.h | 6 +- src/datavisualization/engine/selectionpointer.cpp | 15 ++--- src/datavisualization/engine/selectionpointer_p.h | 4 +- src/datavisualization/engine/seriesrendercache.cpp | 10 +-- src/datavisualization/engine/seriesrendercache_p.h | 2 +- src/datavisualization/engine/surface3drenderer.cpp | 26 ++++---- src/datavisualization/engine/surface3drenderer_p.h | 6 +- src/datavisualization/utils/objecthelper.cpp | 76 +++++++++++++++++++++- src/datavisualization/utils/objecthelper_p.h | 15 ++++- tests/multigraphs/data.cpp | 2 + 16 files changed, 148 insertions(+), 96 deletions(-) diff --git a/src/datavisualization/data/customrenderitem.cpp b/src/datavisualization/data/customrenderitem.cpp index 53db9bd1..a1c70057 100644 --- a/src/datavisualization/data/customrenderitem.cpp +++ b/src/datavisualization/data/customrenderitem.cpp @@ -24,29 +24,19 @@ CustomRenderItem::CustomRenderItem() : AbstractRenderItem(), m_texture(0), m_object(0), - m_visible(true) + m_visible(true), + m_renderer(0) { } -CustomRenderItem::CustomRenderItem(const CustomRenderItem &other) - : AbstractRenderItem(other) -{ - m_texture = other.m_texture; -} - CustomRenderItem::~CustomRenderItem() { - if (m_object) - delete m_object; + ObjectHelper::releaseObjectHelper(m_renderer, m_object); } void CustomRenderItem::setMesh(const QString &meshFile) { - if (m_object) - delete m_object; - // Load mesh and make an object of it - m_object = new ObjectHelper(meshFile); - m_object->load(); + ObjectHelper::resetObjectHelper(m_renderer, m_object, meshFile); } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index f05540d0..17195f7b 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -35,12 +35,12 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QCustom3DItem; +class Abstract3DRenderer; class CustomRenderItem : public AbstractRenderItem { public: CustomRenderItem(); - CustomRenderItem(const CustomRenderItem &other); virtual ~CustomRenderItem(); inline void setTexture(GLuint texture) { m_texture = texture; } @@ -65,19 +65,24 @@ public: inline int index() const { return m_index; } inline void setShadowCasting(bool shadowCasting) { m_shadowCasting = shadowCasting; } inline bool isShadowCasting() const { return m_shadowCasting; } + inline void setRenderer(Abstract3DRenderer *renderer) { m_renderer = renderer; } private: + Q_DISABLE_COPY(CustomRenderItem) + GLuint m_texture; QVector3D m_scaling; QVector3D m_position; bool m_absolute; - ObjectHelper *m_object; + ObjectHelper *m_object; // shared reference bool m_needBlend; bool m_visible; bool m_valid; int m_index; bool m_shadowCasting; QCustom3DItem *m_item; + Abstract3DRenderer *m_renderer; + }; typedef QHash CustomRenderItemArray; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 988ea21e..8c2e9578 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -570,6 +570,7 @@ QVector4D Abstract3DRenderer::indexToSelectionColor(GLint index) CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) { CustomRenderItem *newItem = new CustomRenderItem(); + newItem->setRenderer(this); newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); newItem->setScaling(item->scaling()); diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 4dcf296f..ec13525b 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -120,9 +120,9 @@ Bars3DRenderer::~Bars3DRenderer() delete m_depthShader; delete m_selectionShader; delete m_backgroundShader; - delete m_backgroundObj; - delete m_gridLineObj; - delete m_labelObj; + ObjectHelper::releaseObjectHelper(this, m_backgroundObj); + ObjectHelper::releaseObjectHelper(this, m_gridLineObj); + ObjectHelper::releaseObjectHelper(this, m_labelObj); delete m_labelShader; } @@ -2336,26 +2336,20 @@ void Bars3DRenderer::updateShadowQuality(QAbstract3DGraph::ShadowQuality quality void Bars3DRenderer::loadBackgroundMesh() { - if (m_backgroundObj) - delete m_backgroundObj; - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/negativeBackground")); - m_backgroundObj->load(); + ObjectHelper::resetObjectHelper(this, m_backgroundObj, + QStringLiteral(":/defaultMeshes/negativeBackground")); } void Bars3DRenderer::loadGridLineMesh() { - if (m_gridLineObj) - delete m_gridLineObj; - m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_gridLineObj->load(); + ObjectHelper::resetObjectHelper(this, m_gridLineObj, + QStringLiteral(":/defaultMeshes/plane")); } void Bars3DRenderer::loadLabelMesh() { - if (m_labelObj) - delete m_labelObj; - m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_labelObj->load(); + ObjectHelper::resetObjectHelper(this, m_labelObj, + QStringLiteral(":/defaultMeshes/plane")); } void Bars3DRenderer::updateTextures() diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 2e9ec0de..d62171eb 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -73,9 +73,9 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_backgroundObj; - ObjectHelper *m_gridLineObj; - ObjectHelper *m_labelObj; + ObjectHelper *m_backgroundObj; // Shared reference + ObjectHelper *m_gridLineObj; // Shared reference + ObjectHelper *m_labelObj; // Shared reference GLuint m_bgrTexture; GLuint m_depthTexture; GLuint m_selectionTexture; diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index acdd3cb8..3c1adfa0 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -118,11 +118,11 @@ Scatter3DRenderer::~Scatter3DRenderer() delete m_selectionShader; delete m_backgroundShader; delete m_labelShader; - delete m_backgroundObj; + ObjectHelper::releaseObjectHelper(this, m_backgroundObj); #if !defined(QT_OPENGL_ES_2) - delete m_gridLineObj; + ObjectHelper::releaseObjectHelper(this, m_gridLineObj); #endif - delete m_labelObj; + ObjectHelper::releaseObjectHelper(this, m_labelObj); } void Scatter3DRenderer::initializeOpenGL() @@ -1731,28 +1731,22 @@ void Scatter3DRenderer::updateShadowQuality(QAbstract3DGraph::ShadowQuality qual void Scatter3DRenderer::loadBackgroundMesh() { - if (m_backgroundObj) - delete m_backgroundObj; - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/background")); - m_backgroundObj->load(); + ObjectHelper::resetObjectHelper(this, m_backgroundObj, + QStringLiteral(":/defaultMeshes/background")); } #if !(defined QT_OPENGL_ES_2) void Scatter3DRenderer::loadGridLineMesh() { - if (m_gridLineObj) - delete m_gridLineObj; - m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_gridLineObj->load(); + ObjectHelper::resetObjectHelper(this, m_gridLineObj, + QStringLiteral(":/defaultMeshes/plane")); } #endif void Scatter3DRenderer::loadLabelMesh() { - if (m_labelObj) - delete m_labelObj; - m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_labelObj->load(); + ObjectHelper::resetObjectHelper(this, m_labelObj, + QStringLiteral(":/defaultMeshes/plane")); } void Scatter3DRenderer::updateTextures() diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 0b58102b..b6a110ff 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -68,11 +68,11 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_backgroundObj; + ObjectHelper *m_backgroundObj; // Shared reference #if !(defined QT_OPENGL_ES_2) - ObjectHelper *m_gridLineObj; + ObjectHelper *m_gridLineObj; // Shared reference #endif - ObjectHelper *m_labelObj; + ObjectHelper *m_labelObj; // Shared reference GLuint m_bgrTexture; GLuint m_depthTexture; GLuint m_selectionTexture; diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp index 646212f0..fe9325cf 100644 --- a/src/datavisualization/engine/selectionpointer.cpp +++ b/src/datavisualization/engine/selectionpointer.cpp @@ -54,7 +54,6 @@ SelectionPointer::~SelectionPointer() { delete m_labelShader; delete m_pointShader; - delete m_labelObj; delete m_textureHelper; } @@ -66,7 +65,6 @@ void SelectionPointer::initializeOpenGL() m_drawer->initializeOpenGL(); initShaders(); - loadLabelMesh(); } void SelectionPointer::updateScene(Q3DScene *scene) @@ -235,6 +233,11 @@ void SelectionPointer::setPointerObject(ObjectHelper *object) m_pointObj = object; } +void SelectionPointer::setLabelObject(ObjectHelper *object) +{ + m_labelObj = object; +} + void SelectionPointer::handleDrawerChange() { m_cachedTheme = m_drawer->theme(); @@ -269,12 +272,4 @@ void SelectionPointer::initShaders() } -void SelectionPointer::loadLabelMesh() -{ - if (m_labelObj) - delete m_labelObj; - m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_labelObj->load(); -} - QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h index 03e09cca..f33cd6cd 100644 --- a/src/datavisualization/engine/selectionpointer_p.h +++ b/src/datavisualization/engine/selectionpointer_p.h @@ -53,6 +53,7 @@ public: void setPosition(const QVector3D &position); void setLabel(const QString &label); void setPointerObject(ObjectHelper *object); + void setLabelObject(ObjectHelper *object); void handleDrawerChange(); void updateBoundingRect(const QRect &rect); void updateScene(Q3DScene *scene); @@ -63,12 +64,11 @@ public: private: void initializeOpenGL(); void initShaders(); - void loadLabelMesh(); private: ShaderHelper *m_labelShader; ShaderHelper *m_pointShader; - ObjectHelper *m_labelObj; + ObjectHelper *m_labelObj; // Not owned ObjectHelper *m_pointObj; // Not owned TextureHelper *m_textureHelper; Q3DTheme *m_cachedTheme; diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index e674ae43..e4f221f8 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -109,13 +109,7 @@ void SeriesRenderCache::populate(bool newSeries) m_renderer->fixMeshFileName(meshFileName, m_mesh); } - delete m_object; - if (meshFileName.isEmpty()) { - m_object = 0; - } else { - m_object = new ObjectHelper(meshFileName); - m_object->load(); - } + ObjectHelper::resetObjectHelper(m_renderer, m_object, meshFileName); } if (newSeries || changeTracker.meshRotationChanged) { @@ -193,7 +187,7 @@ void SeriesRenderCache::populate(bool newSeries) void SeriesRenderCache::cleanup(TextureHelper *texHelper) { - delete m_object; + ObjectHelper::releaseObjectHelper(m_renderer, m_object); if (QOpenGLContext::currentContext()) { texHelper->deleteTexture(&m_baseUniformTexture); texHelper->deleteTexture(&m_baseGradientTexture); diff --git a/src/datavisualization/engine/seriesrendercache_p.h b/src/datavisualization/engine/seriesrendercache_p.h index 3cd94487..96b61b87 100644 --- a/src/datavisualization/engine/seriesrendercache_p.h +++ b/src/datavisualization/engine/seriesrendercache_p.h @@ -74,7 +74,7 @@ public: protected: QAbstract3DSeries *m_series; - ObjectHelper *m_object; + ObjectHelper *m_object; // Shared reference QAbstract3DSeries::Mesh m_mesh; QQuaternion m_meshRotation; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 4b5464d5..1f3a6932 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -142,11 +142,11 @@ Surface3DRenderer::~Surface3DRenderer() delete m_surfaceSliceSmoothShader; delete m_labelShader; - delete m_backgroundObj; + ObjectHelper::releaseObjectHelper(this, m_backgroundObj); #if !defined(QT_OPENGL_ES_2) - delete m_gridLineObj; + ObjectHelper::releaseObjectHelper(this, m_gridLineObj); #endif - delete m_labelObj; + ObjectHelper::releaseObjectHelper(this, m_labelObj); } void Surface3DRenderer::initializeOpenGL() @@ -2311,19 +2311,15 @@ void Surface3DRenderer::resetClickedStatus() void Surface3DRenderer::loadBackgroundMesh() { - if (m_backgroundObj) - delete m_backgroundObj; - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/background")); - m_backgroundObj->load(); + ObjectHelper::resetObjectHelper(this, m_backgroundObj, + QStringLiteral(":/defaultMeshes/background")); } #if !(defined QT_OPENGL_ES_2) void Surface3DRenderer::loadGridLineMesh() { - if (m_gridLineObj) - delete m_gridLineObj; - m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_gridLineObj->load(); + ObjectHelper::resetObjectHelper(this, m_gridLineObj, + QStringLiteral(":/defaultMeshes/plane")); } #endif @@ -2407,6 +2403,7 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co slicePointer->setPosition((subPosFront + subPosBack) / 2.0f); slicePointer->setLabel(selectionLabel); slicePointer->setPointerObject(cache->object()); + slicePointer->setLabelObject(m_labelObj); slicePointer->setHighlightColor(cache->singleHighlightColor()); slicePointer->updateScene(m_cachedScene); slicePointer->setRotation(cache->meshRotation()); @@ -2420,6 +2417,7 @@ void Surface3DRenderer::updateSelectionPoint(SurfaceSeriesRenderCache *cache, co mainPointer->setPosition(mainPos); mainPointer->setLabel(selectionLabel); mainPointer->setPointerObject(cache->object()); + mainPointer->setLabelObject(m_labelObj); mainPointer->setHighlightColor(cache->singleHighlightColor()); mainPointer->updateScene(m_cachedScene); mainPointer->setRotation(cache->meshRotation()); @@ -2548,10 +2546,8 @@ void Surface3DRenderer::updateSlicingActive(bool isSlicing) void Surface3DRenderer::loadLabelMesh() { - if (m_labelObj) - delete m_labelObj; - m_labelObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/plane")); - m_labelObj->load(); + ObjectHelper::resetObjectHelper(this, m_labelObj, + QStringLiteral(":/defaultMeshes/plane")); } void Surface3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 7c3e461d..e6c66a90 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -73,11 +73,11 @@ private: GLfloat m_maxVisibleRowValue; GLfloat m_visibleColumnRange; GLfloat m_visibleRowRange; - ObjectHelper *m_backgroundObj; + ObjectHelper *m_backgroundObj; // Shared reference #if !(defined QT_OPENGL_ES_2) - ObjectHelper *m_gridLineObj; + ObjectHelper *m_gridLineObj; // Shared reference #endif - ObjectHelper *m_labelObj; + ObjectHelper *m_labelObj; // Shared reference GLuint m_depthTexture; GLuint m_depthModelTexture; GLuint m_depthFrameBuffer; diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp index 97695193..8cbf2aa2 100644 --- a/src/datavisualization/utils/objecthelper.cpp +++ b/src/datavisualization/utils/objecthelper.cpp @@ -27,15 +27,87 @@ ObjectHelper::ObjectHelper(const QString &objectFile) : m_objectFile(objectFile) { m_indicesType = GL_UNSIGNED_SHORT; + load(); } +struct ObjectHelperRef { + int refCount; + ObjectHelper *obj; +}; + +// The "Abstract3DRenderer *" key identifies the renderer +static QHash *> cacheTable; + ObjectHelper::~ObjectHelper() { } -void ObjectHelper::setObjectFile(const QString &objectFile) +void ObjectHelper::resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj, + const QString &meshFile) +{ + Q_ASSERT(cacheId); + + if (obj) { + const QString &oldFile = obj->objectFile(); + if (meshFile == oldFile) + return; // same file, do nothing + releaseObjectHelper(cacheId, obj); + } + obj = getObjectHelper(cacheId, meshFile); +} + +void ObjectHelper::releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj) +{ + Q_ASSERT(cacheId); + + if (obj) { + QHash *objectTable = cacheTable.value(cacheId, 0); + if (objectTable) { + // Delete object if last reference is released + ObjectHelperRef *objRef = objectTable->value(obj->m_objectFile, 0); + if (objRef) { + objRef->refCount--; + if (objRef->refCount <= 0) { + objectTable->remove(obj->m_objectFile); + delete objRef->obj; + delete objRef; + } + } + if (objectTable->isEmpty()) { + // Remove the entire cache if last object was removed + cacheTable.remove(cacheId); + delete objectTable; + } + } else { + // Just delete the object if unknown cache + delete obj; + } + obj = 0; + } +} + +ObjectHelper *ObjectHelper::getObjectHelper(const Abstract3DRenderer *cacheId, + const QString &objectFile) { - m_objectFile = objectFile; + if (objectFile.isEmpty()) + return 0; + + QHash *objectTable = cacheTable.value(cacheId, 0); + if (!objectTable) { + objectTable = new QHash; + cacheTable.insert(cacheId, objectTable); + } + + // Check if object helper for this mesh already exists + ObjectHelperRef *objRef = objectTable->value(objectFile, 0); + if (!objRef) { + objRef = new ObjectHelperRef; + objRef->refCount = 0; + objRef->obj = new ObjectHelper(objectFile); + objectTable->insert(objectFile, objRef); + } + objRef->refCount++; + return objRef->obj; } void ObjectHelper::load() diff --git a/src/datavisualization/utils/objecthelper_p.h b/src/datavisualization/utils/objecthelper_p.h index 0260dd05..93dc6c94 100644 --- a/src/datavisualization/utils/objecthelper_p.h +++ b/src/datavisualization/utils/objecthelper_p.h @@ -35,17 +35,26 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +class Abstract3DRenderer; + class ObjectHelper : public AbstractObjectHelper { +private: + ObjectHelper(const QString &objectFile); public: - ObjectHelper(const QString &objectFile = QString()); ~ObjectHelper(); - void setObjectFile(const QString &objectFile); + static void resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj, + const QString &meshFile); + static void releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj); - void load(); + inline const QString &objectFile() { return m_objectFile; } private: + static ObjectHelper *getObjectHelper(const Abstract3DRenderer *cacheId, + const QString &objectFile); + void load(); + QString m_objectFile; }; diff --git a/tests/multigraphs/data.cpp b/tests/multigraphs/data.cpp index dc736d46..c1e7b409 100644 --- a/tests/multigraphs/data.cpp +++ b/tests/multigraphs/data.cpp @@ -268,6 +268,8 @@ void Data::changeMode(int mode) void Data::start() { m_started = true; + // Reset resolution before starting (otherwise restart will crash due to empty data) + setResolution(m_resolutionLevel); updateData(); m_statusArea->append(QStringLiteral("Started<\b>")); } -- cgit v1.2.3 From 4e37f474d69c64cb1f7d605467e47538464ba332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 22 May 2014 08:38:49 +0300 Subject: Docs for qml axis drag example Task-number: QTRD-3128 Change-Id: I731074040d51dc7dcd7aa2774c5889d5ae588191 Reviewed-by: Miikka Heikkinen --- .../customitems/doc/src/customitems.qdoc | 1 + .../draggableaxes/doc/src/draggableaxes.qdoc | 1 + .../qmlaxisdrag/doc/images/qmlaxisdrag-example.png | Bin 0 -> 89048 bytes .../qmlaxisdrag/doc/src/qmlaxisdrag.qdoc | 110 +++++++++++++++++++++ .../qmlaxisdrag/qml/qmlaxisdrag/main.qml | 39 ++++++-- .../qmlaxisformatter/doc/src/qmlaxisformatter.qdoc | 1 + 6 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png create mode 100644 examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc diff --git a/examples/datavisualization/customitems/doc/src/customitems.qdoc b/examples/datavisualization/customitems/doc/src/customitems.qdoc index d034019a..20f5f96d 100644 --- a/examples/datavisualization/customitems/doc/src/customitems.qdoc +++ b/examples/datavisualization/customitems/doc/src/customitems.qdoc @@ -21,6 +21,7 @@ \title Custom Items Example \ingroup qtdatavisualization_examples \brief Adding custom items to a surface graph. + \since Qt Data Visualization 1.1 The custom items example shows how to add your own custom meshes as items to a graph, and how to remove them. diff --git a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc index 82add19d..af081d97 100644 --- a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc +++ b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc @@ -21,6 +21,7 @@ \title Axis Range Dragging With Labels Example \ingroup qtdatavisualization_examples \brief Implementing a custom input handler to support axis dragging. + \since Qt Data Visualization 1.1 The Axis Range Dragging example shows how to customize the 3D graph controls in a widget application to allow changing axis ranges by clicking on an axis label and dragging. This is diff --git a/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png b/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png new file mode 100644 index 00000000..de33ba66 Binary files /dev/null and b/examples/datavisualization/qmlaxisdrag/doc/images/qmlaxisdrag-example.png differ diff --git a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc new file mode 100644 index 00000000..0371dcaf --- /dev/null +++ b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +/*! + \example qmlaxisdrag + \title Qt Quick 2 Axis Dragging Example + \ingroup qtdatavisualization_examples + \brief Implementing axis dragging in QML + \since Qt Data Visualization 1.1 + + The Qt Quick 2 axis dragging example concentrates on showing how to implement axis range + changing by dragging axis labels in QML. It also gives a quick peek to two other new features + in Qt Data Visualization 1.1: orthographic projection and dynamic custom item handling. + + \image qmlaxisdrag-example.png + + \section1 Overriding default input handling + + First we deactivate the default input handling mechanism by setting the active input handler + of Scatter3D graph to \c{null}: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 0 + \dots + + Then we add a MouseArea and set it to fill the parent, which is the same \c Item our + \c scatterGraph is contained in. We also set it to accept only left mouse button presses, + as in this example we are not interested in other buttons: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 1 + \dots + + Then we need to listen to mouse presses, and when caught, send a selection query to the graph: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 2 + + Mouse position (\c mouseX and \c mouseY used in \c{onPressed}) is caught in + \c{onPositionChanged}: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 3 + \dots + + At the end of \c{onPositionChanged}, we'll save the previous mouse position for move distance + calculation that will be introduced later: + + \dots 0 + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 4 + + \section1 Translating mouse movement to axis range change + + in \c scatterGraph we will need to listen to \c onSelectedElementChanged signal. The signal + is emitted after the selection query has been made in the \c{onPressed} of \c{inputArea}. We + set the element type into a property we defined (\c{property int selectedAxisLabel: -1}) in our + main component, since it is of a type we are interested in: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 5 + + Then, back in the \c onPositionChanged of \c{inputArea}, we check if a mouse button is pressed + and if we have a current axis label selection. If the conditions are met, we'll call the + function that does the conversion from mouse movement to axis range update: + + \dots 0 + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 6 + \dots 0 + + The conversion is easy in this case, as we have a fixed camera rotation. We can use some + precalculated values, calculate mouse move distance, and apply the values to the + selected axis range: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 7 + + For a more sophisticated conversion from mouse movement to axis range update, see + \l{Axis Range Dragging With Labels Example}{this example}. + + \section1 Other features + + The example also demonstrates how to use orthographic projection and how to update properties + of a custom item on the fly. + + Orthographic projection is very simple. You'll just need to change \c orthoProjection property + of \c{scatterGraph}. In this example we have a button for toggling it on and off: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 8 + + For custom items, first we'll add one in the \c customItemList of \c{scatterGraph}: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 9 + + We have implemented a timer to add, remove, and rotate all the items in the graph, + and we'll use the same timer for rotating the custom item: + + \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 10 + \dots + + \section1 Example contents +*/ diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml index 64472a57..06f59bf1 100644 --- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -56,10 +56,12 @@ Item { }); } + //! [10] onTriggered: { rotationAngle = rotationAngle + 1 - scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle) qtCube.setRotationAxisAndAngle(Qt.vector3d(1,0,1), rotationAngle) + //! [10] + scatterSeries.setMeshAxisAndAngle(Qt.vector3d(1,1,1), rotationAngle) if (isIncreasing) { for (var i = 0; i < 10; i++) appendRow() @@ -112,8 +114,11 @@ Item { width: parent.width height: parent.height + //! [0] Scatter3D { id: scatterGraph + inputHandler: null + //! [0] width: dataView.width height: dataView.height theme: dynamicColorTheme @@ -121,7 +126,6 @@ Item { scene.activeCamera.yRotation: 45.0 scene.activeCamera.xRotation: 45.0 scene.activeCamera.zoomLevel: 75.0 - inputHandler: null Scatter3DSeries { id: scatterSeries @@ -136,6 +140,7 @@ Item { rotationRole: "rotation" } } + //! [9] customItemList: [ Custom3DItem { id: qtCube @@ -145,6 +150,8 @@ Item { scaling: Qt.vector3d(0.3,0.3,0.3) } ] + //! [9] + //! [5] onSelectedElementChanged: { if (selectedElement >= AbstractGraph3D.ElementAxisXLabel && selectedElement <= AbstractGraph3D.ElementAxisYLabel) @@ -152,41 +159,50 @@ Item { else selectedAxisLabel = -1 } + //! [5] } + //! [1] MouseArea { id: inputArea anchors.fill: parent - hoverEnabled: true acceptedButtons: Qt.LeftButton + //! [1] property int mouseX: -1 property int mouseY: -1 property int previousMouseX: -1 property int previousMouseY: -1 + //! [3] onPositionChanged: { mouseX = mouse.x; mouseY = mouse.y; + //! [3] + //! [6] if (pressed && selectedAxisLabel != -1) dragAxis(mouseX, mouseY, previousMouseX, previousMouseY); + //! [6] + //! [4] previousMouseX = mouseX; previousMouseY = mouseY; } + //! [4] + //! [2] onPressed: { scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, inputArea.mouseY); } + //! [2] } } + //! [7] function dragAxis(mouseX, mouseY, previousMouseX, previousMouseY) { // Directional drag multipliers based on rotation - // In this example camera is locked to 45 degrees, so we can use precalculated values - var xMulX = 0.70710678146 - var xMulY = 0.7071067809 - var zMulX = 0.7071067809 - var zMulY = 0.70710678146 + // Camera is locked to 45 degrees, so we can use one precalculated value instead of + // calculating xx, xy, zx and zy individually + var cameraMultiplier = 0.70710678 // Get the drag amount var moveX = mouseX - previousMouseX @@ -195,12 +211,12 @@ Item { // Adjust axes switch (selectedAxisLabel) { case AbstractGraph3D.ElementAxisXLabel: - var distance = (moveX * xMulX - moveY * xMulY) / dragSpeedModifier + var distance = ((moveX - moveY) * cameraMultiplier) / dragSpeedModifier scatterGraph.axisX.min -= distance scatterGraph.axisX.max -= distance break case AbstractGraph3D.ElementAxisZLabel: - distance = (moveX * zMulX + moveY * zMulY) / dragSpeedModifier + distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier scatterGraph.axisZ.min += distance scatterGraph.axisZ.max += distance break @@ -211,6 +227,7 @@ Item { break } } + //! [7] NewButton { id: rangeToggle @@ -240,6 +257,7 @@ Item { } } + //! [8] NewButton { id: orthoToggle width: parent.width / 3 @@ -255,6 +273,7 @@ Item { } } } + //! [8] NewButton { id: exitButton diff --git a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc index b990c490..156135bd 100644 --- a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc +++ b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc @@ -21,6 +21,7 @@ \title Qt Quick 2 Axis Formatter Example \ingroup qtdatavisualization_examples \brief Example of a hybrid C++ and QML application demonstrating different axis formatters. + \since Qt Data Visualization 1.1 The Qt Quick axis formatter example shows how to use predefined axis formatters and how to create a custom one. -- cgit v1.2.3 From a5d500d4cba7b346c9ba1aedd6f5aaf651da4ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 22 May 2014 09:41:15 +0300 Subject: QML axis label regression bug fix Task-number: QTRD-3131 Change-Id: I89d150228848f6b151f474fb6bf64f1f64dbfdc1 Change-Id: I89d150228848f6b151f474fb6bf64f1f64dbfdc1 Reviewed-by: Miikka Heikkinen --- examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml index 06f59bf1..8daf4983 100644 --- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -166,6 +166,7 @@ Item { MouseArea { id: inputArea anchors.fill: parent + hoverEnabled: true acceptedButtons: Qt.LeftButton //! [1] property int mouseX: -1 -- cgit v1.2.3 From 2f16e9dc324cd67f1c89b229477ed5a4da3087b2 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 22 May 2014 09:32:58 +0300 Subject: Fix qmlbars example table delegate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Order of some signals seems to have changed between 5.2.1 and 5.3.0, so delegate behavior changed. Task-number: QTRD-3125 Change-Id: I5486e2e80f51089eaeef3c2d7ae05e29a81e116a Reviewed-by: Tomi Korpipää --- examples/datavisualization/qmlbars/qml/qmlbars/main.qml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml index 6b9efeca..32767cc4 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml @@ -177,6 +177,7 @@ Rectangle { TableViewColumn{ role: "income" ; title: "Income" ; width: tableView.width / 4 } itemDelegate: Item { Text { + id: delegateText anchors.verticalCenter: parent.verticalCenter width: parent.width anchors.leftMargin: 4 @@ -187,13 +188,15 @@ Rectangle { text: styleData.value horizontalAlignment: styleData.textAlignment - Component.onCompleted: { - if (styleData.column === 0) { + property bool customFormatted: false + + onTextChanged: { + if (styleData.column === 0 && !customFormatted) { + customFormatted = true var pattern = /(\d\d\d\d)-(\d\d)/ - var matches = pattern.exec(styleData.value) + var matches = pattern.exec(delegateText.text) var colIndex = parseInt(matches[2], 10) - 1 - text = matches[1] + " - " + graphAxes.column.labels[colIndex] - + delegateText.text = matches[1] + " - " + graphAxes.column.labels[colIndex] } } } -- cgit v1.2.3 From 0de21b382c039d6094a65d225d34185a821b583b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 22 May 2014 10:09:03 +0300 Subject: Update custom item translation when axes change, if needed Task-number: QTRD-3129 Change-Id: If7e28778ca7fd628159d37ee74ae2afb8d941e53 Change-Id: If7e28778ca7fd628159d37ee74ae2afb8d941e53 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 16 ++++++++++++++++ src/datavisualization/engine/abstract3drenderer_p.h | 1 + 2 files changed, 17 insertions(+) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 8c2e9578..da839e2d 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -320,6 +320,8 @@ void Abstract3DRenderer::updateAxisRange(QAbstract3DAxis::AxisOrientation orient foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisSegmentCount(QAbstract3DAxis::AxisOrientation orientation, @@ -348,6 +350,8 @@ void Abstract3DRenderer::updateAxisReversed(QAbstract3DAxis::AxisOrientation ori axisCacheForOrientation(orientation).setReversed(enable); foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation orientation, @@ -364,6 +368,8 @@ void Abstract3DRenderer::updateAxisFormatter(QAbstract3DAxis::AxisOrientation or foreach (SeriesRenderCache *cache, m_renderCacheList) cache->setDataDirty(true); + + updateCustomItemPositions(); } void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, @@ -635,6 +641,16 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } } +void Abstract3DRenderer::updateCustomItemPositions() +{ + foreach (CustomRenderItem *renderItem, m_customRenderCache) { + if (!renderItem->isPositionAbsolute()) { + QVector3D translation = convertPositionToTranslation(renderItem->position(), false); + renderItem->setTranslation(translation); + } + } +} + void Abstract3DRenderer::drawCustomItems(RenderingState state, ShaderHelper *shader, const QMatrix4x4 &viewMatrix, diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index f5bf0ff4..4a6ee545 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -69,6 +69,7 @@ public: virtual void updateSeries(const QList &seriesList); virtual void updateCustomData(const QList &customItems); virtual void updateCustomItems(); + virtual void updateCustomItemPositions(); virtual SeriesRenderCache *createNewCache(QAbstract3DSeries *series); virtual void cleanCache(SeriesRenderCache *cache); virtual void render(GLuint defaultFboHandle); -- cgit v1.2.3 From 71185c7f11d3cb19a7a4b678861457af7a7f8af1 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 22 May 2014 11:17:25 +0300 Subject: Fix misc minor issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename bars background mesh more logically - Reorder ElementAxis enums logically - Change the sun in rotations example to a custom item Task-number: QTRD-3132 Change-Id: I00dacb68ebce222edc1a732cf7d14f1660934b36 Reviewed-by: Tomi Korpipää --- .../draggableaxes/axesinputhandler.cpp | 6 +++--- .../qmlaxisdrag/qml/qmlaxisdrag/main.qml | 12 ++++++------ .../rotations/scatterdatamodifier.cpp | 21 ++++++++++----------- .../rotations/scatterdatamodifier.h | 2 +- src/datavisualization/engine/bars3drenderer.cpp | 2 +- src/datavisualization/engine/engine.qrc | 2 +- .../engine/meshes/backgroundNegatives.obj | 22 ---------------------- .../engine/meshes/backgroundNoFloor.obj | 22 ++++++++++++++++++++++ src/datavisualization/engine/qabstract3dgraph.cpp | 4 ++-- src/datavisualization/engine/qabstract3dgraph.h | 2 +- src/datavisualizationqml2/abstractdeclarative_p.h | 2 +- 11 files changed, 48 insertions(+), 49 deletions(-) delete mode 100644 src/datavisualization/engine/meshes/backgroundNegatives.obj create mode 100644 src/datavisualization/engine/meshes/backgroundNoFloor.obj diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.cpp b/examples/datavisualization/draggableaxes/axesinputhandler.cpp index ef7b871b..7b570e5c 100644 --- a/examples/datavisualization/draggableaxes/axesinputhandler.cpp +++ b/examples/datavisualization/draggableaxes/axesinputhandler.cpp @@ -76,12 +76,12 @@ void AxesInputHandler::handleElementSelected(QAbstract3DGraph::ElementType type) case QAbstract3DGraph::ElementAxisXLabel: m_state = StateDraggingX; break; - case QAbstract3DGraph::ElementAxisZLabel: - m_state = StateDraggingZ; - break; case QAbstract3DGraph::ElementAxisYLabel: m_state = StateDraggingY; break; + case QAbstract3DGraph::ElementAxisZLabel: + m_state = StateDraggingZ; + break; default: m_state = StateNormal; break; diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml index 8daf4983..e161cf41 100644 --- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -154,7 +154,7 @@ Item { //! [5] onSelectedElementChanged: { if (selectedElement >= AbstractGraph3D.ElementAxisXLabel - && selectedElement <= AbstractGraph3D.ElementAxisYLabel) + && selectedElement <= AbstractGraph3D.ElementAxisZLabel) selectedAxisLabel = selectedElement else selectedAxisLabel = -1 @@ -216,16 +216,16 @@ Item { scatterGraph.axisX.min -= distance scatterGraph.axisX.max -= distance break - case AbstractGraph3D.ElementAxisZLabel: - distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier - scatterGraph.axisZ.min += distance - scatterGraph.axisZ.max += distance - break case AbstractGraph3D.ElementAxisYLabel: distance = moveY / dragSpeedModifier scatterGraph.axisY.min += distance scatterGraph.axisY.max += distance break + case AbstractGraph3D.ElementAxisZLabel: + distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier + scatterGraph.axisZ.min += distance + scatterGraph.axisZ.max += distance + break } } //! [7] diff --git a/examples/datavisualization/rotations/scatterdatamodifier.cpp b/examples/datavisualization/rotations/scatterdatamodifier.cpp index c4b439b1..d2c2c52d 100644 --- a/examples/datavisualization/rotations/scatterdatamodifier.cpp +++ b/examples/datavisualization/rotations/scatterdatamodifier.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include using namespace QtDataVisualization; @@ -40,7 +41,7 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) m_fieldLines(12), m_arrowsPerLine(16), m_magneticField(new QScatter3DSeries), - m_sun(new QScatter3DSeries), + m_sun(new QCustom3DItem), m_magneticFieldArray(0), m_angleOffset(0.0f), m_angleStep(doublePi / m_arrowsPerLine / animationFrames) @@ -62,17 +63,15 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter) m_magneticField->setColorStyle(Q3DTheme::ColorStyleRangeGradient); //! [4] - // For 'sun' we use a custom large sphere. - m_sun->setItemSize(0.2f); - m_sun->setName(QStringLiteral("Sun")); - m_sun->setItemLabelFormat(QStringLiteral("@seriesName")); - m_sun->setMesh(QAbstract3DSeries::MeshUserDefined); - m_sun->setUserDefinedMesh(QStringLiteral(":/mesh/largesphere.obj")); - m_sun->setBaseColor(QColor(0xff, 0xBB, 0x00)); - m_sun->dataProxy()->addItem(QScatterDataItem(QVector3D())); + // For 'sun' we use a custom large sphere + m_sun->setScaling(QVector3D(0.07f, 0.07f, 0.07f)); + m_sun->setMeshFile(QStringLiteral(":/mesh/largesphere.obj")); + QImage sunColor = QImage(2, 2, QImage::Format_RGB32); + sunColor.fill(QColor(0xff, 0xbb, 0x00)); + m_sun->setTextureImage(sunColor); m_graph->addSeries(m_magneticField); - m_graph->addSeries(m_sun); + m_graph->addCustomItem(m_sun); // Configure the axes according to the data m_graph->axisX()->setRange(-horizontalRange, horizontalRange); @@ -171,7 +170,7 @@ void ScatterDataModifier::triggerRotation() void ScatterDataModifier::toggleSun() { - m_sun->setVisible(!m_graph->seriesList().at(1)->isVisible()); + m_sun->setVisible(!m_sun->isVisible()); } void ScatterDataModifier::toggleRotation() diff --git a/examples/datavisualization/rotations/scatterdatamodifier.h b/examples/datavisualization/rotations/scatterdatamodifier.h index 9df1f26a..c4f7e7a4 100644 --- a/examples/datavisualization/rotations/scatterdatamodifier.h +++ b/examples/datavisualization/rotations/scatterdatamodifier.h @@ -47,7 +47,7 @@ private: int m_fieldLines; int m_arrowsPerLine; QScatter3DSeries *m_magneticField; - QScatter3DSeries *m_sun; + QCustom3DItem *m_sun; QScatterDataArray *m_magneticFieldArray; float m_angleOffset; float m_angleStep; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index ec13525b..b9448687 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2337,7 +2337,7 @@ void Bars3DRenderer::updateShadowQuality(QAbstract3DGraph::ShadowQuality quality void Bars3DRenderer::loadBackgroundMesh() { ObjectHelper::resetObjectHelper(this, m_backgroundObj, - QStringLiteral(":/defaultMeshes/negativeBackground")); + QStringLiteral(":/defaultMeshes/backgroundNoFloor")); } void Bars3DRenderer::loadGridLineMesh() diff --git a/src/datavisualization/engine/engine.qrc b/src/datavisualization/engine/engine.qrc index 4d95f030..673b6ee0 100644 --- a/src/datavisualization/engine/engine.qrc +++ b/src/datavisualization/engine/engine.qrc @@ -24,7 +24,7 @@ meshes/barFilledSmooth.obj meshes/cubeFilledFlat.obj meshes/cubeFilledSmooth.obj - meshes/backgroundNegatives.obj + meshes/backgroundNoFloor.obj meshes/minimalFlat.obj meshes/minimalSmooth.obj meshes/arrowFlat.obj diff --git a/src/datavisualization/engine/meshes/backgroundNegatives.obj b/src/datavisualization/engine/meshes/backgroundNegatives.obj deleted file mode 100644 index 0b94617f..00000000 --- a/src/datavisualization/engine/meshes/backgroundNegatives.obj +++ /dev/null @@ -1,22 +0,0 @@ -# Blender v2.66 (sub 0) OBJ File: 'backgroudNegativesWall.blend' -# www.blender.org -o Cube -v 1.000000 1.000000 1.000000 -v -1.000000 1.000000 1.000000 -v -1.000000 1.000000 -1.000000 -v 1.000000 -1.000000 1.000000 -v -1.000000 -1.000000 1.000000 -v -1.000000 -1.000000 -1.000000 -vt 0.000000 0.000000 -vt 0.500000 0.000000 -vt 0.500000 1.000000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vn 0.000000 -0.000000 -1.000000 -vn 1.000000 0.000000 0.000000 -s off -f 4/1/1 5/2/1 2/3/1 -f 5/2/2 6/4/2 3/5/2 -f 1/6/1 4/1/1 2/3/1 -f 2/3/2 5/2/2 3/5/2 diff --git a/src/datavisualization/engine/meshes/backgroundNoFloor.obj b/src/datavisualization/engine/meshes/backgroundNoFloor.obj new file mode 100644 index 00000000..0b94617f --- /dev/null +++ b/src/datavisualization/engine/meshes/backgroundNoFloor.obj @@ -0,0 +1,22 @@ +# Blender v2.66 (sub 0) OBJ File: 'backgroudNegativesWall.blend' +# www.blender.org +o Cube +v 1.000000 1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +v -1.000000 -1.000000 -1.000000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +s off +f 4/1/1 5/2/1 2/3/1 +f 5/2/2 6/4/2 3/5/2 +f 1/6/1 4/1/1 2/3/1 +f 2/3/2 5/2/2 3/5/2 diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index a232af6e..02606b85 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -131,10 +131,10 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION A series (i.e. an item in a series). \value ElementAxisXLabel X axis label. - \value ElementAxisZLabel - Z axis label. \value ElementAxisYLabel Y axis label. + \value ElementAxisZLabel + Z axis label. \value ElementCustomItem Custom item. */ diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 23214c57..0db9fc4c 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -81,8 +81,8 @@ public: ElementNone = 0, ElementSeries, ElementAxisXLabel, - ElementAxisZLabel, ElementAxisYLabel, + ElementAxisZLabel, ElementCustomItem }; diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 2cdcafc8..374e6fb3 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -102,8 +102,8 @@ public: ElementNone = 0, ElementSeries, ElementAxisXLabel, - ElementAxisZLabel, ElementAxisYLabel, + ElementAxisZLabel, ElementCustomItem }; -- cgit v1.2.3 From 4a56455f7a5b64473da6f6cb724c366fe9942c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 22 May 2014 12:49:02 +0300 Subject: Android and iOS config fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + example tweak Change-Id: I408cd43a7af3efceccd42bd2439803e41c5272d6 Change-Id: I408cd43a7af3efceccd42bd2439803e41c5272d6 Reviewed-by: Tomi Korpipää --- examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml | 5 +++-- tests/itemmodeltest/itemmodeltest.pro | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml index e161cf41..08d6e088 100644 --- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -122,7 +122,7 @@ Item { width: dataView.width height: dataView.height theme: dynamicColorTheme - shadowQuality: AbstractGraph3D.ShadowQualityNone + shadowQuality: AbstractGraph3D.ShadowQualityLow scene.activeCamera.yRotation: 45.0 scene.activeCamera.xRotation: 45.0 scene.activeCamera.zoomLevel: 75.0 @@ -146,7 +146,7 @@ Item { id: qtCube meshFile: ":/mesh/cube" textureFile: ":/texture/texture" - position: Qt.vector3d(0.5,0.5,0.5) + position: Qt.vector3d(0.65,0.35,0.65) scaling: Qt.vector3d(0.3,0.3,0.3) } ] @@ -268,6 +268,7 @@ Item { if (scatterGraph.orthoProjection) { text = "Display Orthographic"; scatterGraph.orthoProjection = false + scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityLow } else { text = "Display Perspective"; scatterGraph.orthoProjection = true diff --git a/tests/itemmodeltest/itemmodeltest.pro b/tests/itemmodeltest/itemmodeltest.pro index d1cf0959..47f12915 100644 --- a/tests/itemmodeltest/itemmodeltest.pro +++ b/tests/itemmodeltest/itemmodeltest.pro @@ -1,7 +1,3 @@ -android|ios { - error( "This test is not supported for android or ios." ) -} - !include( ../tests.pri ) { error( "Couldn't find the tests.pri file!" ) } -- cgit v1.2.3 From f0ccb395f2688ed619ed769d23cfdc4b191ad609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 23 May 2014 07:17:02 +0300 Subject: Fixed axis dragging example for touch devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3139 Change-Id: If81d707618d5426d6463de17334d8a391054143d Reviewed-by: Tomi Korpipää --- .../qmlaxisdrag/doc/src/qmlaxisdrag.qdoc | 2 +- .../qmlaxisdrag/qml/qmlaxisdrag/main.qml | 80 +++++++++++++++------- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc index 0371dcaf..8f8fff7f 100644 --- a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc +++ b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc @@ -48,7 +48,7 @@ \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 2 - Mouse position (\c mouseX and \c mouseY used in \c{onPressed}) is caught in + Current mouse position, that will be needed for move distance calculation, is caught in \c{onPositionChanged}: \snippet qmlaxisdrag/qml/qmlaxisdrag/main.qml 3 diff --git a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml index 08d6e088..91685297 100644 --- a/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml +++ b/examples/datavisualization/qmlaxisdrag/qml/qmlaxisdrag/main.qml @@ -28,6 +28,10 @@ Item { property int selectedAxisLabel: -1 property real dragSpeedModifier: 100.0 + property int currentMouseX: -1 + property int currentMouseY: -1 + property int previousMouseX: -1 + property int previousMouseY: -1 ListModel { id: graphModel @@ -164,67 +168,92 @@ Item { //! [1] MouseArea { - id: inputArea anchors.fill: parent hoverEnabled: true acceptedButtons: Qt.LeftButton //! [1] - property int mouseX: -1 - property int mouseY: -1 - property int previousMouseX: -1 - property int previousMouseY: -1 //! [3] onPositionChanged: { - mouseX = mouse.x; - mouseY = mouse.y; + currentMouseX = mouse.x; + currentMouseY = mouse.y; //! [3] //! [6] if (pressed && selectedAxisLabel != -1) - dragAxis(mouseX, mouseY, previousMouseX, previousMouseY); + dragAxis(); //! [6] //! [4] - previousMouseX = mouseX; - previousMouseY = mouseY; + previousMouseX = currentMouseX; + previousMouseY = currentMouseY; } //! [4] //! [2] onPressed: { - scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, - inputArea.mouseY); + scatterGraph.scene.selectionQueryPosition = Qt.point(mouse.x, mouse.y); } //! [2] + + onReleased: { + // We need to clear mouse positions and selected axis, because touch devices cannot + // track position all the time + selectedAxisLabel = -1 + currentMouseX = -1 + currentMouseY = -1 + previousMouseX = -1 + previousMouseY = -1 + } } } //! [7] - function dragAxis(mouseX, mouseY, previousMouseX, previousMouseY) { - // Directional drag multipliers based on rotation - // Camera is locked to 45 degrees, so we can use one precalculated value instead of - // calculating xx, xy, zx and zy individually + function dragAxis() { + // Do nothing if previous mouse position is uninitialized + if (previousMouseX === -1) + return + + // Directional drag multipliers based on rotation. Camera is locked to 45 degrees, so we + // can use one precalculated value instead of calculating xx, xy, zx and zy individually var cameraMultiplier = 0.70710678 - // Get the drag amount - var moveX = mouseX - previousMouseX - var moveY = mouseY - previousMouseY + // Calculate the mouse move amount + var moveX = currentMouseX - previousMouseX + var moveY = currentMouseY - previousMouseY // Adjust axes switch (selectedAxisLabel) { case AbstractGraph3D.ElementAxisXLabel: var distance = ((moveX - moveY) * cameraMultiplier) / dragSpeedModifier - scatterGraph.axisX.min -= distance - scatterGraph.axisX.max -= distance + // Check if we need to change min or max first to avoid invalid ranges + if (distance > 0) { + scatterGraph.axisX.min -= distance + scatterGraph.axisX.max -= distance + } else { + scatterGraph.axisX.max -= distance + scatterGraph.axisX.min -= distance + } break case AbstractGraph3D.ElementAxisYLabel: distance = moveY / dragSpeedModifier - scatterGraph.axisY.min += distance - scatterGraph.axisY.max += distance + // Check if we need to change min or max first to avoid invalid ranges + if (distance > 0) { + scatterGraph.axisY.max += distance + scatterGraph.axisY.min += distance + } else { + scatterGraph.axisY.min += distance + scatterGraph.axisY.max += distance + } break case AbstractGraph3D.ElementAxisZLabel: distance = ((moveX + moveY) * cameraMultiplier) / dragSpeedModifier - scatterGraph.axisZ.min += distance - scatterGraph.axisZ.max += distance + // Check if we need to change min or max first to avoid invalid ranges + if (distance > 0) { + scatterGraph.axisZ.max += distance + scatterGraph.axisZ.min += distance + } else { + scatterGraph.axisZ.min += distance + scatterGraph.axisZ.max += distance + } break } } @@ -268,6 +297,7 @@ Item { if (scatterGraph.orthoProjection) { text = "Display Orthographic"; scatterGraph.orthoProjection = false + // Orthographic projection disables shadows, so we need to switch them back on scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityLow } else { text = "Display Perspective"; -- cgit v1.2.3 From d73731665b754f279719dfa8b5c7d43b21278387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 23 May 2014 09:01:50 +0300 Subject: Regenerated plugins.qmltypes Task-number: QTRD-3011 Change-Id: I195721bb87b6c7b70e6a4a02f77fde5cbed05c9c Change-Id: I195721bb87b6c7b70e6a4a02f77fde5cbed05c9c Reviewed-by: Miikka Heikkinen --- src/datavisualizationqml2/plugins.qmltypes | 440 +++++++++++++++++++++++++++-- 1 file changed, 414 insertions(+), 26 deletions(-) diff --git a/src/datavisualizationqml2/plugins.qmltypes b/src/datavisualizationqml2/plugins.qmltypes index 48a30665..0bd76543 100644 --- a/src/datavisualizationqml2/plugins.qmltypes +++ b/src/datavisualizationqml2/plugins.qmltypes @@ -4,16 +4,19 @@ import QtQuick.tooling 1.1 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtDataVisualization 1.0' +// 'qmlplugindump -nonrelocatable QtDataVisualization 1.1' Module { Component { name: "QtDataVisualization::AbstractDeclarative" defaultProperty: "data" prototype: "QQuickItem" - exports: ["QtDataVisualization/AbstractGraph3D 1.0"] + exports: [ + "QtDataVisualization/AbstractGraph3D 1.0", + "QtDataVisualization/AbstractGraph3D 1.1" + ] isCreatable: false - exportMetaObjectRevisions: [0] + exportMetaObjectRevisions: [0, 1] Enum { name: "SelectionFlag" values: { @@ -56,6 +59,17 @@ Module { "ShadowQualitySoftHigh": 6 } } + Enum { + name: "ElementType" + values: { + "ElementNone": 0, + "ElementSeries": 1, + "ElementAxisXLabel": 2, + "ElementAxisYLabel": 3, + "ElementAxisZLabel": 4, + "ElementCustomItem": 5 + } + } Enum { name: "RenderingMode" values: { @@ -66,18 +80,34 @@ Module { } Property { name: "selectionMode"; type: "SelectionFlags" } Property { name: "shadowQuality"; type: "ShadowQuality" } + Property { name: "shadowsSupported"; type: "bool"; isReadonly: true } Property { name: "msaaSamples"; type: "int" } Property { name: "scene"; type: "Declarative3DScene"; isReadonly: true; isPointer: true } Property { name: "inputHandler"; type: "QAbstract3DInputHandler"; isPointer: true } Property { name: "theme"; type: "Q3DTheme"; isPointer: true } Property { name: "renderingMode"; type: "RenderingMode" } + Property { name: "measureFps"; revision: 1; type: "bool" } + Property { name: "currentFps"; revision: 1; type: "double"; isReadonly: true } + Property { + name: "customItemList" + revision: 1 + type: "QCustom3DItem" + isList: true + isReadonly: true + } + Property { name: "orthoProjection"; revision: 1; type: "bool" } + Property { name: "selectedElement"; revision: 1; type: "ElementType"; isReadonly: true } Signal { name: "selectionModeChanged" - Parameter { name: "mode"; type: "SelectionFlags" } + Parameter { name: "mode"; type: "AbstractDeclarative::SelectionFlags" } } Signal { name: "shadowQualityChanged" - Parameter { name: "quality"; type: "ShadowQuality" } + Parameter { name: "quality"; type: "AbstractDeclarative::ShadowQuality" } + } + Signal { + name: "shadowsSupportedChanged" + Parameter { name: "supported"; type: "bool" } } Signal { name: "msaaSamplesChanged" @@ -97,7 +127,27 @@ Module { } Signal { name: "renderingModeChanged" - Parameter { name: "mode"; type: "RenderingMode" } + Parameter { name: "mode"; type: "AbstractDeclarative::RenderingMode" } + } + Signal { + name: "measureFpsChanged" + revision: 1 + Parameter { name: "enabled"; type: "bool" } + } + Signal { + name: "currentFpsChanged" + revision: 1 + Parameter { name: "fps"; type: "double" } + } + Signal { + name: "selectedElementChanged" + revision: 1 + Parameter { name: "type"; type: "QAbstract3DGraph::ElementType" } + } + Signal { + name: "orthoProjectionChanged" + revision: 1 + Parameter { name: "enabled"; type: "bool" } } Method { name: "handleAxisXChanged" @@ -116,6 +166,32 @@ Module { Parameter { name: "obj"; type: "QObject"; isPointer: true } } Method { name: "clearSelection" } + Method { + name: "addCustomItem" + revision: 1 + type: "int" + Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true } + } + Method { name: "removeCustomItems"; revision: 1 } + Method { + name: "removeCustomItem" + revision: 1 + Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true } + } + Method { + name: "removeCustomItemAt" + revision: 1 + Parameter { name: "position"; type: "QVector3D" } + } + Method { + name: "releaseCustomItem" + revision: 1 + Parameter { name: "item"; type: "QCustom3DItem"; isPointer: true } + } + Method { name: "selectedLabelIndex"; revision: 1; type: "int" } + Method { name: "selectedAxis"; revision: 1; type: "QAbstract3DAxis*" } + Method { name: "selectedCustomItemIndex"; revision: 1; type: "int" } + Method { name: "selectedCustomItem"; revision: 1; type: "QCustom3DItem*" } } Component { name: "QtDataVisualization::ColorGradient" @@ -437,11 +513,11 @@ Module { } Component { name: "QtDataVisualization::DeclarativeTheme3D" - defaultProperty: "seriesChildren" + defaultProperty: "themeChildren" prototype: "QtDataVisualization::Q3DTheme" exports: ["QtDataVisualization/Theme3D 1.0"] exportMetaObjectRevisions: [0] - Property { name: "seriesChildren"; type: "QObject"; isList: true; isReadonly: true } + Property { name: "themeChildren"; type: "QObject"; isList: true; isReadonly: true } Property { name: "baseColors"; type: "DeclarativeColor"; isList: true; isReadonly: true } Property { name: "baseGradients"; type: "ColorGradient"; isList: true; isReadonly: true } Property { name: "singleHighlightGradient"; type: "ColorGradient"; isPointer: true } @@ -510,7 +586,7 @@ Module { } Signal { name: "cameraPresetChanged" - Parameter { name: "preset"; type: "CameraPreset" } + Parameter { name: "preset"; type: "Q3DCamera::CameraPreset" } } Signal { name: "wrapXRotationChanged" @@ -642,7 +718,7 @@ Module { Property { name: "colorStyle"; type: "ColorStyle" } Signal { name: "typeChanged" - Parameter { name: "themeType"; type: "Theme" } + Parameter { name: "themeType"; type: "Q3DTheme::Theme" } } Signal { name: "baseColorsChanged" @@ -726,15 +802,18 @@ Module { } Signal { name: "colorStyleChanged" - Parameter { name: "style"; type: "ColorStyle" } + Parameter { name: "style"; type: "Q3DTheme::ColorStyle" } } } Component { name: "QtDataVisualization::QAbstract3DAxis" prototype: "QObject" - exports: ["QtDataVisualization/AbstractAxis3D 1.0"] + exports: [ + "QtDataVisualization/AbstractAxis3D 1.0", + "QtDataVisualization/AbstractAxis3D 1.1" + ] isCreatable: false - exportMetaObjectRevisions: [0] + exportMetaObjectRevisions: [0, 1] Enum { name: "AxisOrientation" values: { @@ -759,13 +838,14 @@ Module { Property { name: "min"; type: "double" } Property { name: "max"; type: "double" } Property { name: "autoAdjustRange"; type: "bool" } + Property { name: "labelAutoRotation"; revision: 1; type: "double" } Signal { name: "titleChanged" Parameter { name: "newTitle"; type: "string" } } Signal { name: "orientationChanged" - Parameter { name: "orientation"; type: "AxisOrientation" } + Parameter { name: "orientation"; type: "QAbstract3DAxis::AxisOrientation" } } Signal { name: "minChanged" @@ -784,6 +864,11 @@ Module { name: "autoAdjustRangeChanged" Parameter { name: "autoAdjust"; type: "bool" } } + Signal { + name: "labelAutoRotationChanged" + revision: 1 + Parameter { name: "angle"; type: "double" } + } } Component { name: "QtDataVisualization::QAbstract3DInputHandler" @@ -808,7 +893,7 @@ Module { } Signal { name: "inputViewChanged" - Parameter { name: "view"; type: "InputView" } + Parameter { name: "view"; type: "QAbstract3DInputHandler::InputView" } } Signal { name: "sceneChanged" @@ -818,9 +903,12 @@ Module { Component { name: "QtDataVisualization::QAbstract3DSeries" prototype: "QObject" - exports: ["QtDataVisualization/Abstract3DSeries 1.0"] + exports: [ + "QtDataVisualization/Abstract3DSeries 1.0", + "QtDataVisualization/Abstract3DSeries 1.1" + ] isCreatable: false - exportMetaObjectRevisions: [0] + exportMetaObjectRevisions: [0, 1] Enum { name: "SeriesType" values: { @@ -862,6 +950,8 @@ Module { Property { name: "multiHighlightColor"; type: "QColor" } Property { name: "multiHighlightGradient"; type: "QLinearGradient" } Property { name: "name"; type: "string" } + Property { name: "itemLabel"; revision: 1; type: "string"; isReadonly: true } + Property { name: "itemLabelVisible"; revision: 1; type: "bool" } Signal { name: "itemLabelFormatChanged" Parameter { name: "format"; type: "string" } @@ -872,7 +962,7 @@ Module { } Signal { name: "meshChanged" - Parameter { name: "mesh"; type: "Mesh" } + Parameter { name: "mesh"; type: "QAbstract3DSeries::Mesh" } } Signal { name: "meshSmoothChanged" @@ -918,6 +1008,16 @@ Module { name: "nameChanged" Parameter { name: "name"; type: "string" } } + Signal { + name: "itemLabelChanged" + revision: 1 + Parameter { name: "label"; type: "string" } + } + Signal { + name: "itemLabelVisibilityChanged" + revision: 1 + Parameter { name: "visible"; type: "bool" } + } Method { name: "setMeshAxisAndAngle" Parameter { name: "axis"; type: "QVector3D" } @@ -1015,6 +1115,57 @@ Module { exportMetaObjectRevisions: [0] Property { name: "labels"; type: "QStringList" } } + Component { + name: "QtDataVisualization::QCustom3DItem" + prototype: "QObject" + exports: ["QtDataVisualization/Custom3DItem 1.1"] + exportMetaObjectRevisions: [0] + Property { name: "meshFile"; type: "string" } + Property { name: "textureFile"; type: "string" } + Property { name: "position"; type: "QVector3D" } + Property { name: "positionAbsolute"; type: "bool" } + Property { name: "scaling"; type: "QVector3D" } + Property { name: "rotation"; type: "QQuaternion" } + Property { name: "visible"; type: "bool" } + Property { name: "shadowCasting"; type: "bool" } + Signal { + name: "meshFileChanged" + Parameter { name: "meshFile"; type: "string" } + } + Signal { + name: "textureFileChanged" + Parameter { name: "textureFile"; type: "string" } + } + Signal { + name: "positionChanged" + Parameter { name: "position"; type: "QVector3D" } + } + Signal { + name: "positionAbsoluteChanged" + Parameter { name: "positionAbsolute"; type: "bool" } + } + Signal { + name: "scalingChanged" + Parameter { name: "scaling"; type: "QVector3D" } + } + Signal { + name: "rotationChanged" + Parameter { name: "rotation"; type: "QQuaternion" } + } + Signal { + name: "visibleChanged" + Parameter { name: "visible"; type: "bool" } + } + Signal { + name: "shadowCastingChanged" + Parameter { name: "shadowCasting"; type: "bool" } + } + Method { + name: "setRotationAxisAndAngle" + Parameter { name: "axis"; type: "QVector3D" } + Parameter { name: "angle"; type: "double" } + } + } Component { name: "QtDataVisualization::QHeightMapSurfaceDataProxy" prototype: "QtDataVisualization::QSurfaceDataProxy" @@ -1054,8 +1205,20 @@ Module { Component { name: "QtDataVisualization::QItemModelBarDataProxy" prototype: "QtDataVisualization::QBarDataProxy" - exports: ["QtDataVisualization/ItemModelBarDataProxy 1.0"] - exportMetaObjectRevisions: [0] + exports: [ + "QtDataVisualization/ItemModelBarDataProxy 1.0", + "QtDataVisualization/ItemModelBarDataProxy 1.1" + ] + exportMetaObjectRevisions: [0, 1] + Enum { + name: "MultiMatchBehavior" + values: { + "MMBFirst": 0, + "MMBLast": 1, + "MMBAverage": 2, + "MMBCumulative": 3 + } + } Property { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } Property { name: "rowRole"; type: "string" } Property { name: "columnRole"; type: "string" } @@ -1066,6 +1229,15 @@ Module { Property { name: "useModelCategories"; type: "bool" } Property { name: "autoRowCategories"; type: "bool" } Property { name: "autoColumnCategories"; type: "bool" } + Property { name: "rowRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "columnRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "valueRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "rotationRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "rowRoleReplace"; revision: 1; type: "string" } + Property { name: "columnRoleReplace"; revision: 1; type: "string" } + Property { name: "valueRoleReplace"; revision: 1; type: "string" } + Property { name: "rotationRoleReplace"; revision: 1; type: "string" } + Property { name: "multiMatchBehavior"; revision: 1; type: "MultiMatchBehavior" } Signal { name: "itemModelChanged" Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } @@ -1098,6 +1270,51 @@ Module { name: "autoColumnCategoriesChanged" Parameter { name: "enable"; type: "bool" } } + Signal { + name: "rowRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "columnRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "valueRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "rotationRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "rowRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "columnRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "valueRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "rotationRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "multiMatchBehaviorChanged" + revision: 1 + Parameter { name: "behavior"; type: "MultiMatchBehavior" } + } Method { name: "rowCategoryIndex" type: "int" @@ -1112,13 +1329,24 @@ Module { Component { name: "QtDataVisualization::QItemModelScatterDataProxy" prototype: "QtDataVisualization::QScatterDataProxy" - exports: ["QtDataVisualization/ItemModelScatterDataProxy 1.0"] - exportMetaObjectRevisions: [0] + exports: [ + "QtDataVisualization/ItemModelScatterDataProxy 1.0", + "QtDataVisualization/ItemModelScatterDataProxy 1.1" + ] + exportMetaObjectRevisions: [0, 1] Property { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } Property { name: "xPosRole"; type: "string" } Property { name: "yPosRole"; type: "string" } Property { name: "zPosRole"; type: "string" } Property { name: "rotationRole"; type: "string" } + Property { name: "xPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "yPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "zPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "rotationRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "xPosRoleReplace"; revision: 1; type: "string" } + Property { name: "yPosRoleReplace"; revision: 1; type: "string" } + Property { name: "zPosRoleReplace"; revision: 1; type: "string" } + Property { name: "rotationRoleReplace"; revision: 1; type: "string" } Signal { name: "itemModelChanged" Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } @@ -1139,12 +1367,64 @@ Module { name: "rotationRoleChanged" Parameter { name: "role"; type: "string" } } + Signal { + name: "xPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "yPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "zPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "rotationRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "rotationRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "xPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "yPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "zPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } } Component { name: "QtDataVisualization::QItemModelSurfaceDataProxy" prototype: "QtDataVisualization::QSurfaceDataProxy" - exports: ["QtDataVisualization/ItemModelSurfaceDataProxy 1.0"] - exportMetaObjectRevisions: [0] + exports: [ + "QtDataVisualization/ItemModelSurfaceDataProxy 1.0", + "QtDataVisualization/ItemModelSurfaceDataProxy 1.1" + ] + exportMetaObjectRevisions: [0, 1] + Enum { + name: "MultiMatchBehavior" + values: { + "MMBFirst": 0, + "MMBLast": 1, + "MMBAverage": 2, + "MMBCumulativeY": 3 + } + } Property { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } Property { name: "rowRole"; type: "string" } Property { name: "columnRole"; type: "string" } @@ -1156,6 +1436,17 @@ Module { Property { name: "useModelCategories"; type: "bool" } Property { name: "autoRowCategories"; type: "bool" } Property { name: "autoColumnCategories"; type: "bool" } + Property { name: "rowRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "columnRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "xPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "yPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "zPosRolePattern"; revision: 1; type: "QRegExp" } + Property { name: "rowRoleReplace"; revision: 1; type: "string" } + Property { name: "columnRoleReplace"; revision: 1; type: "string" } + Property { name: "xPosRoleReplace"; revision: 1; type: "string" } + Property { name: "yPosRoleReplace"; revision: 1; type: "string" } + Property { name: "zPosRoleReplace"; revision: 1; type: "string" } + Property { name: "multiMatchBehavior"; revision: 1; type: "MultiMatchBehavior" } Signal { name: "itemModelChanged" Parameter { name: "itemModel"; type: "const QAbstractItemModel"; isPointer: true } @@ -1192,6 +1483,61 @@ Module { name: "autoColumnCategoriesChanged" Parameter { name: "enable"; type: "bool" } } + Signal { + name: "rowRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "columnRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "xPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "yPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "zPosRolePatternChanged" + revision: 1 + Parameter { name: "pattern"; type: "QRegExp" } + } + Signal { + name: "rowRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "columnRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "xPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "yPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "zPosRoleReplaceChanged" + revision: 1 + Parameter { name: "replace"; type: "string" } + } + Signal { + name: "multiMatchBehaviorChanged" + revision: 1 + Parameter { name: "behavior"; type: "MultiMatchBehavior" } + } Method { name: "rowCategoryIndex" type: "int" @@ -1203,6 +1549,27 @@ Module { Parameter { name: "category"; type: "string" } } } + Component { + name: "QtDataVisualization::QLogValue3DAxisFormatter" + prototype: "QtDataVisualization::QValue3DAxisFormatter" + exports: ["QtDataVisualization/LogValueAxis3DFormatter 1.1"] + exportMetaObjectRevisions: [0] + Property { name: "base"; type: "double" } + Property { name: "autoSubGrid"; type: "bool" } + Property { name: "showEdgeLabels"; type: "bool" } + Signal { + name: "baseChanged" + Parameter { name: "base"; type: "double" } + } + Signal { + name: "autoSubGridChanged" + Parameter { name: "enabled"; type: "bool" } + } + Signal { + name: "showEdgeLabelsChanged" + Parameter { name: "enabled"; type: "bool" } + } + } Component { name: "QtDataVisualization::QScatter3DSeries" prototype: "QtDataVisualization::QAbstract3DSeries" @@ -1366,11 +1733,16 @@ Module { Component { name: "QtDataVisualization::QValue3DAxis" prototype: "QtDataVisualization::QAbstract3DAxis" - exports: ["QtDataVisualization/ValueAxis3D 1.0"] - exportMetaObjectRevisions: [0] + exports: [ + "QtDataVisualization/ValueAxis3D 1.0", + "QtDataVisualization/ValueAxis3D 1.1" + ] + exportMetaObjectRevisions: [0, 1] Property { name: "segmentCount"; type: "int" } Property { name: "subSegmentCount"; type: "int" } Property { name: "labelFormat"; type: "string" } + Property { name: "formatter"; revision: 1; type: "QValue3DAxisFormatter"; isPointer: true } + Property { name: "reversed"; revision: 1; type: "bool" } Signal { name: "segmentCountChanged" Parameter { name: "count"; type: "int" } @@ -1383,5 +1755,21 @@ Module { name: "labelFormatChanged" Parameter { name: "format"; type: "string" } } + Signal { + name: "formatterChanged" + revision: 1 + Parameter { name: "formatter"; type: "QValue3DAxisFormatter"; isPointer: true } + } + Signal { + name: "reversedChanged" + revision: 1 + Parameter { name: "enable"; type: "bool" } + } + } + Component { + name: "QtDataVisualization::QValue3DAxisFormatter" + prototype: "QObject" + exports: ["QtDataVisualization/ValueAxis3DFormatter 1.1"] + exportMetaObjectRevisions: [0] } } -- cgit v1.2.3 From 039a4b04c5207e869fed958baefcd74fe9423426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Fri, 23 May 2014 10:16:22 +0300 Subject: Specifics files updates with new properties Task-number: QTRD-3140 Change-Id: I6e08a4de1b91d593af5a938d4ceaa0eefb2bf7eb Change-Id: I6e08a4de1b91d593af5a938d4ceaa0eefb2bf7eb Reviewed-by: Miikka Heikkinen --- .../designer/Bars3DSpecifics.qml | 23 ++++++++++++++++++++++ .../designer/Scatter3DSpecifics.qml | 22 +++++++++++++++++++++ .../designer/Surface3DSpecifics.qml | 23 ++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/datavisualizationqml2/designer/Bars3DSpecifics.qml b/src/datavisualizationqml2/designer/Bars3DSpecifics.qml index e52320ac..cb5fb4a0 100644 --- a/src/datavisualizationqml2/designer/Bars3DSpecifics.qml +++ b/src/datavisualizationqml2/designer/Bars3DSpecifics.qml @@ -266,6 +266,29 @@ Column { } } } + Label { + text: qsTr("measureFps") + toolTip: qsTr("Measure Frames Per Second") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.measureFps + Layout.fillWidth: true + } + } + Label { + text: qsTr("orthoProjection") + toolTip: qsTr("Use Orthographic Projection") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.orthoProjection + Layout.fillWidth: true + } + } + // Kept for debugging Label { } SecondColumnLayout { diff --git a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml index b9a9ef97..26c49f9b 100644 --- a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml +++ b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml @@ -84,6 +84,28 @@ Column { scope: "AbstractGraph3D" } } + Label { + text: qsTr("measureFps") + toolTip: qsTr("Measure Frames Per Second") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.measureFps + Layout.fillWidth: true + } + } + Label { + text: qsTr("orthoProjection") + toolTip: qsTr("Use Orthographic Projection") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.orthoProjection + Layout.fillWidth: true + } + } } } } diff --git a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml index 74470e4b..f6c4129e 100644 --- a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml +++ b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml @@ -204,6 +204,29 @@ Column { } } } + Label { + text: qsTr("measureFps") + toolTip: qsTr("Measure Frames Per Second") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.measureFps + Layout.fillWidth: true + } + } + Label { + text: qsTr("orthoProjection") + toolTip: qsTr("Use Orthographic Projection") + Layout.fillWidth: true + } + SecondColumnLayout { + CheckBox { + backendValue: backendValues.orthoProjection + Layout.fillWidth: true + } + } + // Kept for debugging Label { } SecondColumnLayout { -- cgit v1.2.3 From 5611563234ac7edd47ad9df3a8bf0a293718d8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 09:57:25 +0300 Subject: Added API for changing data aspect ratio Task-number: QTRD-3144 Change-Id: I9acd1be13083d7fbbed840882260a60f46c5f698 Reviewed-by: Miikka Heikkinen --- ...tdatavisualization-qml-abstractdeclarative.qdoc | 12 +++- .../engine/abstract3dcontroller.cpp | 24 +++++++- .../engine/abstract3dcontroller_p.h | 9 ++- .../engine/abstract3drenderer.cpp | 33 ++++++++--- .../engine/abstract3drenderer_p.h | 6 ++ src/datavisualization/engine/bars3drenderer.cpp | 5 ++ src/datavisualization/engine/bars3drenderer_p.h | 2 + src/datavisualization/engine/qabstract3dgraph.cpp | 22 +++++++ src/datavisualization/engine/qabstract3dgraph.h | 5 ++ src/datavisualization/engine/scatter3drenderer.cpp | 67 ++++++++++++---------- src/datavisualization/engine/surface3drenderer.cpp | 7 +-- src/datavisualizationqml2/abstractdeclarative.cpp | 13 +++++ src/datavisualizationqml2/abstractdeclarative_p.h | 5 ++ tests/scattertest/main.cpp | 31 +++++++--- tests/scattertest/scatterchart.cpp | 6 ++ tests/scattertest/scatterchart.h | 1 + tests/surfacetest/graphmodifier.cpp | 6 ++ tests/surfacetest/graphmodifier.h | 2 + tests/surfacetest/main.cpp | 10 ++++ 19 files changed, 211 insertions(+), 55 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 2af73021..ece4f681 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -270,9 +270,19 @@ */ /*! - * \qmlproperty bool QAbstract3DGraph::orthoProjection + * \qmlproperty bool AbstractGraph3D::orthoProjection * \since Qt Data Visualization 1.1 * * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. * \note Shadows will be disabled when set to \c{true}. */ + +/*! + * \qmlproperty real AbstractGraph3D::aspectRatio + * \since Qt Data Visualization 1.1 + * + * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and + * vertical axes. Defaults to \c{2.0}. + * + * \note Has no effect on Bars3D. + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 838d6926..98b0c792 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -58,7 +58,8 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_renderPending(false), m_measureFps(false), m_numFrames(0), - m_currentFps(0.0) + m_currentFps(0.0), + m_aspectRatio(2.0f) { if (!m_scene) m_scene = new Q3DScene; @@ -197,6 +198,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.projectionChanged = false; } + if (m_changeTracker.aspectRatioChanged) { + m_renderer->updateAspectRatio(m_aspectRatio); + m_changeTracker.aspectRatioChanged = false; + } + if (m_changeTracker.axisXFormatterChanged) { m_changeTracker.axisXFormatterChanged = false; if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { @@ -1416,4 +1422,20 @@ bool Abstract3DController::isOrthoProjection() const return m_useOrthoProjection; } +void Abstract3DController::setAspectRatio(float ratio) +{ + if (m_aspectRatio != ratio) { + m_aspectRatio = ratio; + m_changeTracker.aspectRatioChanged = true; + emit aspectRatioChanged(m_aspectRatio); + m_isDataDirty = true; + emitNeedRender(); + } +} + +float Abstract3DController::aspectRatio() +{ + return m_aspectRatio; +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index a5d00cff..e359d40d 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -86,6 +86,7 @@ struct Abstract3DChangeBitField { bool axisXLabelAutoRotationChanged : 1; bool axisYLabelAutoRotationChanged : 1; bool axisZLabelAutoRotationChanged : 1; + bool aspectRatioChanged : 1; Abstract3DChangeBitField() : zoomLevelChanged(true), @@ -123,7 +124,8 @@ struct Abstract3DChangeBitField { projectionChanged(true), axisXLabelAutoRotationChanged(true), axisYLabelAutoRotationChanged(true), - axisZLabelAutoRotationChanged(true) + axisZLabelAutoRotationChanged(true), + aspectRatioChanged(true) { } }; @@ -157,6 +159,7 @@ private: QAbstract3DGraph::SelectionFlags m_selectionMode; QAbstract3DGraph::ShadowQuality m_shadowQuality; bool m_useOrthoProjection; + float m_aspectRatio; protected: Q3DScene *m_scene; @@ -324,6 +327,9 @@ public slots: void updateCustomItem(); + void setAspectRatio(float ratio); + float aspectRatio(); + signals: void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); @@ -337,6 +343,7 @@ signals: void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); + void aspectRatioChanged(float ratio); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index da839e2d..adba857b 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -52,7 +52,8 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_selectionLabelItem(0), m_visibleSeriesCount(0), m_customItemShader(0), - m_useOrthoProjection(false) + m_useOrthoProjection(false), + m_graphAspectRatio(2.0f) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -271,18 +272,23 @@ void Abstract3DRenderer::updateSelectionMode(QAbstract3DGraph::SelectionFlags mo m_selectionDirty = true; } +void Abstract3DRenderer::updateAspectRatio(float ratio) +{ + m_graphAspectRatio = ratio; + calculateZoomLevel(); + m_cachedScene->activeCamera()->d_ptr->updateViewMatrix(m_autoScaleAdjustment); + foreach (SeriesRenderCache *cache, m_renderCacheList) + cache->setDataDirty(true); + updateCustomItemPositions(); +} + void Abstract3DRenderer::handleResize() { if (m_primarySubViewport.width() == 0 || m_primarySubViewport.height() == 0) return; - // Calculate zoom level based on aspect ratio - GLfloat div; - GLfloat zoomAdjustment; - div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); - zoomAdjustment = defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)); - m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f + // Recalculate zoom + calculateZoomLevel(); // Re-init selection buffer initSelectionBuffer(); @@ -293,6 +299,17 @@ void Abstract3DRenderer::handleResize() #endif } +void Abstract3DRenderer::calculateZoomLevel() +{ + // Calculate zoom level based on aspect ratio + GLfloat div; + GLfloat zoomAdjustment; + div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); + zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f +} + void Abstract3DRenderer::updateAxisType(QAbstract3DAxis::AxisOrientation orientation, QAbstract3DAxis::AxisType type) { diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 4a6ee545..cd3608a8 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -118,6 +118,8 @@ public: virtual CustomRenderItem *addCustomItem(QCustom3DItem *item); virtual void updateCustomItem(CustomRenderItem *renderItem); + virtual void updateAspectRatio(float ratio); + virtual QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute) = 0; @@ -159,6 +161,8 @@ protected: void fixGradient(QLinearGradient *gradient, GLuint *gradientTexture); + void calculateZoomLevel(); + bool m_hasNegativeValues; Q3DTheme *m_cachedTheme; Drawer *m_drawer; @@ -197,6 +201,8 @@ protected: bool m_useOrthoProjection; + float m_graphAspectRatio; + private: friend class Abstract3DController; }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index b9448687..db23460c 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2618,4 +2618,9 @@ QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position return QVector3D(xTrans, yTrans, zTrans); } +void Bars3DRenderer::updateAspectRatio(float ratio) +{ + Q_UNUSED(ratio) +} + QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index d62171eb..4b544082 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -124,6 +124,8 @@ public: QVector3D convertPositionToTranslation(const QVector3D &position, bool isAbsolute); + void updateAspectRatio(float ratio); + protected: virtual void initializeOpenGL(); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 02606b85..480307fe 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -591,6 +591,25 @@ bool QAbstract3DGraph::isOrthoProjection() const return d_ptr->m_visualController->isOrthoProjection(); } +/*! + * \property QAbstract3DGraph::aspectRatio + * \since Qt Data Visualization 1.1 + * + * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and + * vertical axes. Defaults to \c{2.0}. + * + * \note Has no effect on Q3DBars. + */ +void QAbstract3DGraph::setAspectRatio(qreal ratio) +{ + d_ptr->m_visualController->setAspectRatio(float(ratio)); +} + +qreal QAbstract3DGraph::aspectRatio() const +{ + return d_ptr->m_visualController->aspectRatio(); +} + /*! * \internal */ @@ -736,6 +755,9 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll QObject::connect(m_visualController, &Abstract3DController::orthoProjectionChanged, q_ptr, &QAbstract3DGraph::orthoProjectionChanged); + + QObject::connect(m_visualController, &Abstract3DController::aspectRatioChanged, q_ptr, + &QAbstract3DGraph::aspectRatioChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 0db9fc4c..2d4f18da 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -47,6 +47,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged) + Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -135,6 +136,9 @@ public: ElementType selectedElement() const; + void setAspectRatio(qreal ratio); + qreal aspectRatio() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -156,6 +160,7 @@ signals: void measureFpsChanged(bool enabled); void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); + void aspectRatioChanged(qreal ratio); private: Q_DISABLE_COPY(QAbstract3DGraph) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 3c1adfa0..e37089a2 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define USE_UNIFORM_SCALING // Scale x and z uniformly, or based on autoscaled values -const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. const GLfloat labelMargin = 0.05f; const GLfloat defaultMinSize = 0.01f; const GLfloat defaultMaxSize = 0.1f; @@ -825,17 +824,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 itModelMatrix; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; - GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; if (m_maxItemSize > zScale) zScale = m_maxItemSize; QVector3D bgScale(xScale, 1.0f + m_backgroundMargin, zScale); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D bgScale((aspectRatio + m_backgroundMargin), + QVector3D bgScale((m_graphAspectRatio + m_backgroundMargin), 1.0f + m_backgroundMargin, - (aspectRatio + m_backgroundMargin)); + (m_graphAspectRatio + m_backgroundMargin)); #endif modelMatrix.scale(bgScale); // If we're viewing from below, background object must be flipped @@ -948,12 +949,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheZ.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), + QVector3D gridLineScaler((m_graphAspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif @@ -997,12 +999,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Side wall lines gridLineScaler = QVector3D(gridLineWidth, 1.0f + m_backgroundMargin, gridLineWidth); #ifndef USE_UNIFORM_SCALING - GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + GLfloat lineXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; #else - GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineXTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_xFlipped) lineXTrans = -lineXTrans; @@ -1059,13 +1061,14 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheX.gridLineCount(); #ifndef USE_UNIFORM_SCALING - GLfloat zScale = (aspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; QVector3D gridLineScaler(gridLineWidth, gridLineWidth, zScale); #else QVector3D gridLineScaler(gridLineWidth, gridLineWidth, - aspectRatio + m_backgroundMargin); + m_graphAspectRatio + m_backgroundMargin); #endif for (int line = 0; line < gridLineCount; line++) { @@ -1107,12 +1110,12 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Back wall lines #ifndef USE_UNIFORM_SCALING - GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + GLfloat lineZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; #else - GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineZTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; #endif if (!m_zFlipped) lineZTrans = -lineZTrans; @@ -1170,17 +1173,18 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) int gridLineCount = m_axisCacheY.gridLineCount(); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineZTrans = (aspectRatio * m_areaSize.height()) + GLfloat lineZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineZTrans) lineZTrans = m_maxItemSize - gridLineOffset; - GLfloat xScale = (aspectRatio * m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; + GLfloat xScale = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + + m_backgroundMargin; if (m_maxItemSize > xScale) xScale = m_maxItemSize; QVector3D gridLineScaler(xScale, gridLineWidth, gridLineWidth); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineZTrans = aspectRatio + m_backgroundMargin - gridLineOffset; - QVector3D gridLineScaler((aspectRatio + m_backgroundMargin), + GLfloat lineZTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; + QVector3D gridLineScaler((m_graphAspectRatio + m_backgroundMargin), gridLineWidth, gridLineWidth); #endif if (!m_zFlipped) @@ -1227,19 +1231,19 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Side wall #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat lineXTrans = (aspectRatio * m_areaSize.width()) + GLfloat lineXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor - gridLineOffset + m_backgroundMargin; if (m_maxItemSize > lineXTrans) lineXTrans = m_maxItemSize - gridLineOffset; - GLfloat zScale = (aspectRatio * m_areaSize.height()) + GLfloat zScale = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > zScale) zScale = m_maxItemSize; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, zScale); #else // ..and this if we want uniform scaling based on largest dimension - GLfloat lineXTrans = aspectRatio + m_backgroundMargin - gridLineOffset; + GLfloat lineXTrans = m_graphAspectRatio + m_backgroundMargin - gridLineOffset; gridLineScaler = QVector3D(gridLineWidth, gridLineWidth, - aspectRatio + m_backgroundMargin); + m_graphAspectRatio + m_backgroundMargin); #endif if (!m_xFlipped) lineXTrans = -lineXTrans; @@ -1358,12 +1362,12 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa if (m_axisCacheZ.segmentCount() > 0) { int labelCount = m_axisCacheZ.labelCount(); #ifndef USE_UNIFORM_SCALING - GLfloat labelXTrans = (aspectRatio * m_areaSize.width()) + GLfloat labelXTrans = (m_graphAspectRatio * m_areaSize.width()) / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize + labelMargin; #else - GLfloat labelXTrans = aspectRatio + m_backgroundMargin + labelMargin; + GLfloat labelXTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; @@ -1467,12 +1471,12 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheX.labelCount(); #ifndef USE_UNIFORM_SCALING - GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + GLfloat labelZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + labelMargin + m_backgroundMargin; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize + labelMargin; #else - GLfloat labelZTrans = aspectRatio + m_backgroundMargin + labelMargin; + GLfloat labelZTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; @@ -1580,16 +1584,16 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa int labelCount = m_axisCacheY.labelCount(); int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - GLfloat labelXTrans = (aspectRatio* m_areaSize.width()) + GLfloat labelXTrans = (m_graphAspectRatio* m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; - GLfloat labelZTrans = (aspectRatio * m_areaSize.height()) + GLfloat labelZTrans = (m_graphAspectRatio * m_areaSize.height()) / m_scaleFactor + m_backgroundMargin; if (m_maxItemSize > labelXTrans) labelXTrans = m_maxItemSize; if (m_maxItemSize > labelZTrans) labelZTrans = m_maxItemSize; #else // ..and this if we want uniform scaling based on largest dimension - GLfloat labelXTrans = aspectRatio + m_backgroundMargin; + GLfloat labelXTrans = m_graphAspectRatio + m_backgroundMargin; GLfloat labelZTrans = labelXTrans; #endif // Back & side wall @@ -1784,11 +1788,11 @@ void Scatter3DRenderer::calculateSceneScalingFactors() m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z - float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + float factorScaler = 2.0f * m_graphAspectRatio / m_scaleFactor; m_axisCacheX.setScale(factorScaler * m_areaSize.width()); m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); #else // ..and this if we want uniform scaling based on largest dimension - m_axisCacheX.setScale(2.0f * aspectRatio); + m_axisCacheX.setScale(2.0f * m_graphAspectRatio); m_axisCacheZ.setScale(-m_axisCacheX.scale()); #endif m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); @@ -1943,7 +1947,8 @@ void Scatter3DRenderer::selectionColorToSeriesAndIndex(const QVector4D &color, series = 0; } -void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, ScatterRenderItem &renderItem) +void Scatter3DRenderer::updateRenderItem(const QScatterDataItem &dataItem, + ScatterRenderItem &renderItem) { QVector3D dotPos = dataItem.position(); if ((dotPos.x() >= m_axisCacheX.min() && dotPos.x() <= m_axisCacheX.max() ) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 1f3a6932..54544396 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -40,7 +40,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define SHOW_DEPTH_TEXTURE_SCENE -const GLfloat aspectRatio = 2.0f; // Forced ratio of x and z to y. Dynamic will make it look odd. // Margin for background (1.10 make it 10% larger to avoid // selection ball being drawn inside background) const GLfloat backgroundMargin = 1.1f; @@ -2262,12 +2261,12 @@ void Surface3DRenderer::calculateSceneScalingFactors() m_areaSize.setHeight(m_axisCacheZ.max() - m_axisCacheZ.min()); m_areaSize.setWidth(m_axisCacheX.max() - m_axisCacheX.min()); m_scaleFactor = qMax(m_areaSize.width(), m_areaSize.height()); - m_scaleX = aspectRatio * m_areaSize.width() / m_scaleFactor; - m_scaleZ = aspectRatio * m_areaSize.height() / m_scaleFactor; + m_scaleX = m_graphAspectRatio * m_areaSize.width() / m_scaleFactor; + m_scaleZ = m_graphAspectRatio * m_areaSize.height() / m_scaleFactor; m_scaleXWithBackground = m_scaleX + backgroundMargin - 1.0f; m_scaleZWithBackground = m_scaleZ + backgroundMargin - 1.0f; - float factorScaler = 2.0f * aspectRatio / m_scaleFactor; + float factorScaler = 2.0f * m_graphAspectRatio / m_scaleFactor; m_axisCacheX.setScale(factorScaler * m_areaSize.width()); m_axisCacheZ.setScale(-factorScaler * m_areaSize.height()); m_axisCacheX.setTranslate(-m_axisCacheX.scale() / 2.0f); diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index c09204da..9805cfb4 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -325,6 +325,9 @@ void AbstractDeclarative::setSharedController(Abstract3DController *controller) QObject::connect(m_controller.data(), &Abstract3DController::orthoProjectionChanged, this, &AbstractDeclarative::orthoProjectionChanged); + + QObject::connect(m_controller.data(), &Abstract3DController::aspectRatioChanged, this, + &AbstractDeclarative::aspectRatioChanged); } void AbstractDeclarative::activateOpenGLContext(QQuickWindow *window) @@ -687,6 +690,16 @@ AbstractDeclarative::ElementType AbstractDeclarative::selectedElement() const return ElementType(m_controller->selectedElement()); } +void AbstractDeclarative::setAspectRatio(qreal ratio) +{ + m_controller->setAspectRatio(float(ratio)); +} + +qreal AbstractDeclarative::aspectRatio() const +{ + return m_controller->aspectRatio(); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index 374e6fb3..c2f9ee08 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -72,6 +72,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(QQmlListProperty customItemList READ customItemList REVISION 1) Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged REVISION 1) + Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged REVISION 1) public: enum SelectionFlag { @@ -181,6 +182,9 @@ public: AbstractDeclarative::ElementType selectedElement() const; + void setAspectRatio(qreal ratio); + qreal aspectRatio() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -214,6 +218,7 @@ signals: Q_REVISION(1) void currentFpsChanged(qreal fps); Q_REVISION(1) void selectedElementChanged(QAbstract3DGraph::ElementType type); Q_REVISION(1) void orthoProjectionChanged(bool enabled); + Q_REVISION(1) void aspectRatioChanged(qreal ratio); private: QPointer m_controller; diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index b0e52c8c..ad147b0d 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -170,59 +170,68 @@ int main(int argc, char **argv) QFontComboBox *fontList = new QFontComboBox(widget); QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget); - fontSizeSlider->setTickInterval(1); + fontSizeSlider->setTickInterval(15); + fontSizeSlider->setTickPosition(QSlider::TicksBelow); fontSizeSlider->setMinimum(1); fontSizeSlider->setValue(30); fontSizeSlider->setMaximum(200); QSlider *pointSizeSlider = new QSlider(Qt::Horizontal, widget); - pointSizeSlider->setTickInterval(1); + pointSizeSlider->setTickInterval(15); + pointSizeSlider->setTickPosition(QSlider::TicksBelow); pointSizeSlider->setMinimum(1); pointSizeSlider->setValue(30); pointSizeSlider->setMaximum(100); QSlider *minSliderX = new QSlider(Qt::Horizontal, widget); - minSliderX->setTickInterval(1); + minSliderX->setTickInterval(50); minSliderX->setTickPosition(QSlider::TicksBelow); minSliderX->setMinimum(-100); minSliderX->setValue(-50); minSliderX->setMaximum(100); QSlider *minSliderY = new QSlider(Qt::Horizontal, widget); - minSliderY->setTickInterval(1); + minSliderY->setTickInterval(100); minSliderY->setTickPosition(QSlider::TicksBelow); minSliderY->setMinimum(-200); minSliderY->setValue(-100); minSliderY->setMaximum(200); QSlider *minSliderZ = new QSlider(Qt::Horizontal, widget); - minSliderZ->setTickInterval(1); + minSliderZ->setTickInterval(50); minSliderZ->setTickPosition(QSlider::TicksBelow); minSliderZ->setMinimum(-100); minSliderZ->setValue(-50); minSliderZ->setMaximum(100); QSlider *maxSliderX = new QSlider(Qt::Horizontal, widget); - maxSliderX->setTickInterval(1); + maxSliderX->setTickInterval(50); maxSliderX->setTickPosition(QSlider::TicksAbove); maxSliderX->setMinimum(-100); maxSliderX->setValue(50); maxSliderX->setMaximum(100); QSlider *maxSliderY = new QSlider(Qt::Horizontal, widget); - maxSliderY->setTickInterval(1); + maxSliderY->setTickInterval(100); maxSliderY->setTickPosition(QSlider::TicksAbove); maxSliderY->setMinimum(-200); maxSliderY->setValue(120); maxSliderY->setMaximum(200); QSlider *maxSliderZ = new QSlider(Qt::Horizontal, widget); - maxSliderZ->setTickInterval(1); + maxSliderZ->setTickInterval(50); maxSliderZ->setTickPosition(QSlider::TicksAbove); maxSliderZ->setMinimum(-100); maxSliderZ->setValue(50); maxSliderZ->setMaximum(100); + QSlider *aspectRatioSlider = new QSlider(Qt::Horizontal, widget); + aspectRatioSlider->setTickInterval(10); + aspectRatioSlider->setTickPosition(QSlider::TicksBelow); + aspectRatioSlider->setMinimum(1); + aspectRatioSlider->setValue(20); + aspectRatioSlider->setMaximum(100); + vLayout->addWidget(themeButton, 0, Qt::AlignTop); vLayout->addWidget(labelButton, 0, Qt::AlignTop); vLayout->addWidget(styleButton, 0, Qt::AlignTop); @@ -267,7 +276,9 @@ int main(int argc, char **argv) vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); vLayout2->addWidget(fontList); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size"))); - vLayout2->addWidget(fontSizeSlider, 1, Qt::AlignTop); + vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust aspect ratio"))); + vLayout2->addWidget(aspectRatioSlider, 1, Qt::AlignTop); widget->show(); @@ -356,6 +367,8 @@ int main(int argc, char **argv) QObject::connect(maxSliderZ, &QSlider::valueChanged, modifier, &ScatterDataModifier::setMaxZ); + QObject::connect(aspectRatioSlider, &QSlider::valueChanged, modifier, + &ScatterDataModifier::setAspectRatio); modifier->setFpsLabel(fpsLabel); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 430279c3..3f900909 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -968,6 +968,12 @@ void ScatterDataModifier::setMaxZ(int max) m_chart->axisZ()->setMax(max); } +void ScatterDataModifier::setAspectRatio(int ratio) +{ + float aspectRatio = float(ratio) / 10.0f; + m_chart->setAspectRatio(aspectRatio); +} + QVector3D ScatterDataModifier::randVector() { QVector3D retvec = QVector3D( diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 977e1201..34826aba 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -52,6 +52,7 @@ public: void setMaxX(int max); void setMaxY(int max); void setMaxZ(int max); + void setAspectRatio(int ratio); void start(); void massiveDataTest(); void massiveTestScroll(); diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 33cfb8a1..442e7742 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -1489,3 +1489,9 @@ void GraphModifier::updateSamples() break; } } + +void GraphModifier::setAspectRatio(int ratio) +{ + float aspectRatio = float(ratio) / 10.0f; + m_graph->setAspectRatio(aspectRatio); +} diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index b02e1c31..ff0b325e 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -113,6 +113,8 @@ public: void testAxisReverse(); void testDataOrdering(); + void setAspectRatio(int ratio); + public slots: void changeShadowQuality(int quality); void changeTheme(int theme); diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 9d6165e6..7444a66a 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -218,6 +218,11 @@ int main(int argc, char *argv[]) axisMinSliderZ->setMaximum(100); axisMinSliderZ->setEnabled(true); + QSlider *aspectRatioSlider = new QSlider(Qt::Horizontal, widget); + aspectRatioSlider->setMinimum(1); + aspectRatioSlider->setValue(20); + aspectRatioSlider->setMaximum(100); + QLinearGradient gr(0, 0, 100, 1); gr.setColorAt(0.0, Qt::black); gr.setColorAt(0.33, Qt::blue); @@ -403,6 +408,8 @@ int main(int argc, char *argv[]) vLayout->addWidget(gridSliderX); vLayout->addWidget(gridSliderZ); #endif + vLayout->addWidget(new QLabel(QStringLiteral("Adjust aspect ratio"))); + vLayout->addWidget(aspectRatioSlider); vLayout->addWidget(new QLabel(QStringLiteral("Adjust axis range"))); vLayout->addWidget(axisRangeSliderX); vLayout->addWidget(axisRangeSliderY); @@ -605,6 +612,9 @@ int main(int argc, char *argv[]) QObject::connect(testDataOrderingButton, &QPushButton::clicked, modifier, &GraphModifier::testDataOrdering); + QObject::connect(aspectRatioSlider, &QSlider::valueChanged, + modifier, &GraphModifier::setAspectRatio); + #ifdef MULTI_SERIES modifier->setSeries1CB(series1CB); modifier->setSeries2CB(series2CB); -- cgit v1.2.3 From 8cdc2f9727049639b3d93f58011cc27d8a7fe7e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 10:07:07 +0300 Subject: Updated plugins.qmltypes and Specifics.qml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3011 Task-number: QTRD-3140 Change-Id: Ie69e750b233eb3b20ef505b2c145943a32d20f6d Change-Id: Ie69e750b233eb3b20ef505b2c145943a32d20f6d Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/designer/Scatter3DSpecifics.qml | 15 +++++++++++++++ src/datavisualizationqml2/designer/Surface3DSpecifics.qml | 15 +++++++++++++++ src/datavisualizationqml2/plugins.qmltypes | 10 ++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml index 26c49f9b..1e2556ec 100644 --- a/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml +++ b/src/datavisualizationqml2/designer/Scatter3DSpecifics.qml @@ -106,6 +106,21 @@ Column { Layout.fillWidth: true } } + Label { + text: qsTr("aspectRatio") + toolTip: qsTr("Horizontal to Vertical Aspect Ratio") + Layout.fillWidth: true + } + SecondColumnLayout { + SpinBox { + backendValue: backendValues.aspectRatio + minimumValue: 0.1 + maximumValue: 10.0 + stepSize: 0.1 + decimals: 1 + Layout.fillWidth: true + } + } } } } diff --git a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml index f6c4129e..65a65d37 100644 --- a/src/datavisualizationqml2/designer/Surface3DSpecifics.qml +++ b/src/datavisualizationqml2/designer/Surface3DSpecifics.qml @@ -226,6 +226,21 @@ Column { Layout.fillWidth: true } } + Label { + text: qsTr("aspectRatio") + toolTip: qsTr("Horizontal to Vertical Aspect Ratio") + Layout.fillWidth: true + } + SecondColumnLayout { + SpinBox { + backendValue: backendValues.aspectRatio + minimumValue: 0.1 + maximumValue: 10.0 + stepSize: 0.1 + decimals: 1 + Layout.fillWidth: true + } + } // Kept for debugging Label { } diff --git a/src/datavisualizationqml2/plugins.qmltypes b/src/datavisualizationqml2/plugins.qmltypes index 0bd76543..99fa53de 100644 --- a/src/datavisualizationqml2/plugins.qmltypes +++ b/src/datavisualizationqml2/plugins.qmltypes @@ -97,6 +97,7 @@ Module { } Property { name: "orthoProjection"; revision: 1; type: "bool" } Property { name: "selectedElement"; revision: 1; type: "ElementType"; isReadonly: true } + Property { name: "aspectRatio"; revision: 1; type: "double" } Signal { name: "selectionModeChanged" Parameter { name: "mode"; type: "AbstractDeclarative::SelectionFlags" } @@ -149,6 +150,11 @@ Module { revision: 1 Parameter { name: "enabled"; type: "bool" } } + Signal { + name: "aspectRatioChanged" + revision: 1 + Parameter { name: "ratio"; type: "double" } + } Method { name: "handleAxisXChanged" Parameter { name: "axis"; type: "QAbstract3DAxis"; isPointer: true } @@ -568,7 +574,7 @@ Module { } Property { name: "xRotation"; type: "double" } Property { name: "yRotation"; type: "double" } - Property { name: "zoomLevel"; type: "int" } + Property { name: "zoomLevel"; type: "double" } Property { name: "cameraPreset"; type: "CameraPreset" } Property { name: "wrapXRotation"; type: "bool" } Property { name: "wrapYRotation"; type: "bool" } @@ -582,7 +588,7 @@ Module { } Signal { name: "zoomLevelChanged" - Parameter { name: "zoomLevel"; type: "int" } + Parameter { name: "zoomLevel"; type: "double" } } Signal { name: "cameraPresetChanged" -- cgit v1.2.3 From a097124a5a2ac615be0d0078f94532daf8618260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 10:15:26 +0300 Subject: Updated version to 1.1.0 Change-Id: I410d69ae7ae5c35984a2d8384cd83dc86228e22a Reviewed-by: Miikka Heikkinen --- .qmake.conf | 2 +- README | 2 +- src/datavisualization/doc/qtdatavisualization.qdocconf | 10 +++++----- src/datavisualization/global/qdatavisualizationglobal.h | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.qmake.conf b/.qmake.conf index c44318c8..9c6617fa 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,4 +1,4 @@ load(qt_build_config) CONFIG += qt_example_installs -MODULE_VERSION=1.0.0 +MODULE_VERSION=1.1.0 diff --git a/README b/README index b51eb586..83497ffb 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ --------------------------- -Qt Data Visualization 1.0.0 +Qt Data Visualization 1.1.0 --------------------------- Qt Data Visualization module provides multiple graph types to visualize data in 3D space diff --git a/src/datavisualization/doc/qtdatavisualization.qdocconf b/src/datavisualization/doc/qtdatavisualization.qdocconf index 5c871b5a..6e9f09b4 100644 --- a/src/datavisualization/doc/qtdatavisualization.qdocconf +++ b/src/datavisualization/doc/qtdatavisualization.qdocconf @@ -6,7 +6,7 @@ include($QT_INSTALL_DOCS/global/qt-html-templates-offline.qdocconf) project = QtDataVisualization description = Qt Data Visualization Reference Documentation -version = 1.0.0 +version = 1.1.0 exampledirs += ../../../examples/datavisualization \ snippets @@ -27,14 +27,14 @@ indexes += $QT_INSTALL_DOCS/qtcore/qtcore.index \ qhp.projects = QtDataVisualization qhp.QtDataVisualization.file = qtdatavisualization.qhp -qhp.QtDataVisualization.namespace = com.digia.qtdatavisualization.100 +qhp.QtDataVisualization.namespace = com.digia.qtdatavisualization.110 qhp.QtDataVisualization.virtualFolder = qtdatavisualization qhp.QtDataVisualization.indexTitle = Qt Data Visualization qhp.QtDataVisualization.indexRoot = -qhp.QtDataVisualization.filterAttributes = qtdatavisualization 1.0.0 qtrefdoc -qhp.QtDataVisualization.customFilters.Qt.name = QtDataVisualization 1.0.0 -qhp.QtDataVisualization.customFilters.Qt.filterAttributes = qtdatavisualization 1.0.0 +qhp.QtDataVisualization.filterAttributes = qtdatavisualization 1.1.0 qtrefdoc +qhp.QtDataVisualization.customFilters.Qt.name = QtDataVisualization 1.1.0 +qhp.QtDataVisualization.customFilters.Qt.filterAttributes = qtdatavisualization 1.1.0 qhp.QtDataVisualization.subprojects = gettingstarted examples classes types qhp.QtDataVisualization.subprojects.gettingstarted.title = Getting Started qhp.QtDataVisualization.subprojects.gettingstarted.indexTitle = Qt Data Visualization Getting Started diff --git a/src/datavisualization/global/qdatavisualizationglobal.h b/src/datavisualization/global/qdatavisualizationglobal.h index 186db94c..e84d03c0 100644 --- a/src/datavisualization/global/qdatavisualizationglobal.h +++ b/src/datavisualization/global/qdatavisualizationglobal.h @@ -21,11 +21,11 @@ #include -#define QT_DATAVISUALIZATION_VERSION_STR "1.0.0" +#define QT_DATAVISUALIZATION_VERSION_STR "1.1.0" /* QT_DATAVISUALIZATION_VERSION is (major << 16) + (minor << 8) + patch. */ -#define QT_DATAVISUALIZATION_VERSION 0x010000 +#define QT_DATAVISUALIZATION_VERSION 0x010100 /* can be used like #if (QT_DATAVISUALIZATION_VERSION >= QT_DATAVISUALIZATION_VERSION_CHECK(1, 0, 0)) */ -- cgit v1.2.3 From 1da51fd24458710d6b740feaba73c21fe2b1273a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 26 May 2014 12:42:55 +0300 Subject: Code cleanups Task-number: QTRD-3149 Change-Id: I7db55daf41ea61548604e816d7a49b7bade450d2 Change-Id: I7db55daf41ea61548604e816d7a49b7bade450d2 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3dcontroller.cpp | 13 ------------- src/datavisualization/engine/abstract3dcontroller_p.h | 10 +--------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 98b0c792..7e310ab8 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -762,19 +762,6 @@ QList Abstract3DController::inputHandlers() const return m_inputHandlers; } -int Abstract3DController::zoomLevel() -{ - return m_scene->activeCamera()->zoomLevel(); -} - -void Abstract3DController::setZoomLevel(int zoomLevel) -{ - m_scene->activeCamera()->setZoomLevel(zoomLevel); - - m_changeTracker.zoomLevelChanged = true; - emitNeedRender(); -} - void Abstract3DController::addTheme(Q3DTheme *theme) { m_themeManager->addTheme(theme); diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index e359d40d..5869d388 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -33,13 +33,12 @@ #include "qabstract3daxis.h" #include "drawer_p.h" #include "qabstract3dinputhandler.h" -#include "qabstractdataproxy.h" +#include "qabstract3dgraph.h" #include "q3dscene_p.h" #include "qcustom3ditem.h" #include #include -class QFont; class QOpenGLFramebufferObject; QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -50,11 +49,9 @@ class QAbstract3DSeries; class ThemeManager; struct Abstract3DChangeBitField { - bool zoomLevelChanged : 1; bool themeChanged : 1; bool shadowQualityChanged : 1; bool selectionModeChanged : 1; - bool objFileChanged : 1; bool axisXTypeChanged : 1; bool axisYTypeChanged : 1; bool axisZTypeChanged : 1; @@ -89,11 +86,9 @@ struct Abstract3DChangeBitField { bool aspectRatioChanged : 1; Abstract3DChangeBitField() : - zoomLevelChanged(true), themeChanged(true), shadowQualityChanged(true), selectionModeChanged(true), - objFileChanged(true), axisXTypeChanged(true), axisYTypeChanged(true), axisZTypeChanged(true), @@ -223,9 +218,6 @@ public: virtual QAbstract3DInputHandler *activeInputHandler(); virtual QList inputHandlers() const; - virtual int zoomLevel(); - virtual void setZoomLevel(int zoomLevel); - virtual void addTheme(Q3DTheme *theme); virtual void releaseTheme(Q3DTheme *theme); virtual void setActiveTheme(Q3DTheme *theme, bool force = true); -- cgit v1.2.3 From d9cb05d0f46efc58e508c233a3c67542a4c177fa Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 23 May 2014 16:06:28 +0300 Subject: Optionally show axis titles on the graph MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2961 Change-Id: I6a344156bd29fa8fb1ede0546af4d0e67e5e2db4 Reviewed-by: Tomi Korpipää --- examples/datavisualization/bars/graphmodifier.cpp | 30 ++- examples/datavisualization/bars/graphmodifier.h | 3 + examples/datavisualization/bars/main.cpp | 27 ++- examples/datavisualization/itemmodel/main.cpp | 3 + src/datavisualization/axis/qabstract3daxis.cpp | 74 +++++- src/datavisualization/axis/qabstract3daxis.h | 10 + src/datavisualization/axis/qabstract3daxis_p.h | 2 + .../engine/abstract3dcontroller.cpp | 77 +++++++ .../engine/abstract3dcontroller_p.h | 18 +- .../engine/abstract3drenderer.cpp | 252 ++++++++++++++++++++- .../engine/abstract3drenderer_p.h | 31 +++ src/datavisualization/engine/axisrendercache.cpp | 4 +- src/datavisualization/engine/axisrendercache_p.h | 6 + src/datavisualization/engine/bars3drenderer.cpp | 61 ++--- src/datavisualization/engine/bars3drenderer_p.h | 8 - src/datavisualization/engine/drawer.cpp | 9 +- src/datavisualization/engine/drawer_p.h | 2 + src/datavisualization/engine/scatter3drenderer.cpp | 60 +++-- src/datavisualization/engine/scatter3drenderer_p.h | 10 - src/datavisualization/engine/surface3drenderer.cpp | 61 +++-- src/datavisualization/engine/surface3drenderer_p.h | 10 - .../global/datavisualizationglobal_p.h | 1 + tests/scattertest/main.cpp | 28 ++- tests/scattertest/scatterchart.cpp | 27 ++- tests/scattertest/scatterchart.h | 4 +- tests/surfacetest/graphmodifier.cpp | 21 ++ tests/surfacetest/graphmodifier.h | 3 + tests/surfacetest/main.cpp | 25 ++ 28 files changed, 727 insertions(+), 140 deletions(-) diff --git a/examples/datavisualization/bars/graphmodifier.cpp b/examples/datavisualization/bars/graphmodifier.cpp index dc5d92c9..9c280bfb 100644 --- a/examples/datavisualization/bars/graphmodifier.cpp +++ b/examples/datavisualization/bars/graphmodifier.cpp @@ -68,12 +68,15 @@ GraphModifier::GraphModifier(Q3DBars *bargraph) m_temperatureAxis->setSubSegmentCount(m_subSegments); m_temperatureAxis->setRange(m_minval, m_maxval); m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%.1f ") + celsiusString)); - m_temperatureAxis->setLabelAutoRotation(90.0f); + m_temperatureAxis->setLabelAutoRotation(30.0f); + m_temperatureAxis->setTitleVisible(true); m_yearAxis->setTitle("Year"); - m_yearAxis->setLabelAutoRotation(40.0f); + m_yearAxis->setLabelAutoRotation(30.0f); + m_yearAxis->setTitleVisible(true); m_monthAxis->setTitle("Month"); - m_monthAxis->setLabelAutoRotation(40.0f); + m_monthAxis->setLabelAutoRotation(30.0f); + m_monthAxis->setTitleVisible(true); m_graph->setValueAxis(m_temperatureAxis); m_graph->setRowAxis(m_yearAxis); @@ -239,6 +242,27 @@ void GraphModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality emit shadowQualityChanged(quality); } +void GraphModifier::changeLabelRotation(int rotation) +{ + m_temperatureAxis->setLabelAutoRotation(float(rotation)); + m_monthAxis->setLabelAutoRotation(float(rotation)); + m_yearAxis->setLabelAutoRotation(float(rotation)); +} + +void GraphModifier::setAxisTitleVisibility(bool enabled) +{ + m_temperatureAxis->setTitleVisible(enabled); + m_monthAxis->setTitleVisible(enabled); + m_yearAxis->setTitleVisible(enabled); +} + +void GraphModifier::setAxisTitleFixed(bool enabled) +{ + m_temperatureAxis->setTitleFixed(enabled); + m_monthAxis->setTitleFixed(enabled); + m_yearAxis->setTitleFixed(enabled); +} + void GraphModifier::changeShadowQuality(int quality) { QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality); diff --git a/examples/datavisualization/bars/graphmodifier.h b/examples/datavisualization/bars/graphmodifier.h index e1aacaf7..107ffbab 100644 --- a/examples/datavisualization/bars/graphmodifier.h +++ b/examples/datavisualization/bars/graphmodifier.h @@ -57,6 +57,9 @@ public slots: void changeTheme(int theme); void changeShadowQuality(int quality); void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality); + void changeLabelRotation(int rotation); + void setAxisTitleVisibility(bool enabled); + void setAxisTitleFixed(bool enabled); signals: void shadowQualityChanged(int quality); diff --git a/examples/datavisualization/bars/main.cpp b/examples/datavisualization/bars/main.cpp index 79b2967a..96abdc51 100644 --- a/examples/datavisualization/bars/main.cpp +++ b/examples/datavisualization/bars/main.cpp @@ -183,6 +183,21 @@ int main(int argc, char **argv) rangeList->addItem(QStringLiteral("All")); rangeList->setCurrentIndex(8); + QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget); + axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible")); + axisTitlesVisibleCB->setChecked(true); + + QCheckBox *axisTitlesFixedCB = new QCheckBox(widget); + axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed")); + axisTitlesFixedCB->setChecked(true); + + QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget); + axisLabelRotationSlider->setTickInterval(10); + axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow); + axisLabelRotationSlider->setMinimum(0); + axisLabelRotationSlider->setValue(30); + axisLabelRotationSlider->setMaximum(90); + //! [5] vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally"))); vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop); @@ -196,6 +211,8 @@ int main(int argc, char **argv) vLayout->addWidget(smoothCheckBox); vLayout->addWidget(seriesCheckBox); vLayout->addWidget(reverseValueAxisCheckBox); + vLayout->addWidget(axisTitlesVisibleCB); + vLayout->addWidget(axisTitlesFixedCB); vLayout->addWidget(new QLabel(QStringLiteral("Show year"))); vLayout->addWidget(rangeList); vLayout->addWidget(new QLabel(QStringLiteral("Change bar style"))); @@ -209,7 +226,9 @@ int main(int argc, char **argv) vLayout->addWidget(new QLabel(QStringLiteral("Change font"))); vLayout->addWidget(fontList); vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size"))); - vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop); + vLayout->addWidget(fontSizeSlider); + vLayout->addWidget(new QLabel(QStringLiteral("Axis label rotation"))); + vLayout->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop); //! [2] GraphModifier *modifier = new GraphModifier(widgetgraph); @@ -271,6 +290,12 @@ int main(int argc, char **argv) QObject::connect(modifier, &GraphModifier::fontChanged, fontList, &QFontComboBox::setCurrentFont); + QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, modifier, + &GraphModifier::setAxisTitleVisibility); + QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, modifier, + &GraphModifier::setAxisTitleFixed); + QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier, + &GraphModifier::changeLabelRotation); //! [3] widget->show(); return app.exec(); diff --git a/examples/datavisualization/itemmodel/main.cpp b/examples/datavisualization/itemmodel/main.cpp index ad9f0112..f00702eb 100644 --- a/examples/datavisualization/itemmodel/main.cpp +++ b/examples/datavisualization/itemmodel/main.cpp @@ -167,8 +167,11 @@ void GraphDataGenerator::setupModel() // Add labels //! [10] m_graph->rowAxis()->setTitle("Week of year"); + m_graph->rowAxis()->setTitleVisible(true); m_graph->columnAxis()->setTitle("Day of week"); + m_graph->columnAxis()->setTitleVisible(true); m_graph->valueAxis()->setTitle("Hours spent on the Internet"); + m_graph->valueAxis()->setTitleVisible(true); m_graph->valueAxis()->setLabelFormat("%.1f h"); //! [10] diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index 27951f4c..681c435f 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -49,6 +49,8 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string AbstractAxis3D::title * Defines the title for the axis. + * + * \sa titleVisible, titleFixed */ /*! @@ -99,6 +101,27 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * the specified angle. */ +/*! + * \qmlproperty bool AbstractAxis3D::titleVisible + * + * Defines if the axis title is visible in the primary graph view. The default value is \c{false}. + * + * \sa title, titleFixed + */ + +/*! + * \qmlproperty bool AbstractAxis3D::titleFixed + * + * If \c{true}, axis titles in the primary graph view will be rotated towards the camera similarly + * to the axis labels. + * If \c{false}, axis titles are only rotated around their axis but are not otherwise oriented + * towards the camera. + * This property doesn't have any effect if labelAutoRotation property value is zero. + * Default value is \c{true}. + * + * \sa labelAutoRotation, title, titleVisible + */ + /*! * \enum QAbstract3DAxis::AxisOrientation * @@ -160,6 +183,8 @@ QAbstract3DAxis::AxisType QAbstract3DAxis::type() const * \property QAbstract3DAxis::title * * Defines the title for the axis. + * + * \sa titleVisible, titleFixed */ void QAbstract3DAxis::setTitle(const QString &title) { @@ -228,6 +253,51 @@ float QAbstract3DAxis::labelAutoRotation() const return d_ptr->m_labelAutoRotation; } +/*! + * \property QAbstract3DAxis::titleVisible + * + * Defines if the axis title is visible in the primary graph view. The default value is \c{false}. + * + * \sa title, titleFixed + */ +void QAbstract3DAxis::setTitleVisible(bool visible) +{ + if (d_ptr->m_titleVisible != visible) { + d_ptr->m_titleVisible = visible; + emit titleVisibilityChanged(visible); + } +} + +bool QAbstract3DAxis::isTitleVisible() const +{ + return d_ptr->m_titleVisible; +} + +/*! + * \property QAbstract3DAxis::titleFixed + * + * If \c{true}, axis titles in the primary graph view will be rotated towards the camera similarly + * to the axis labels. + * If \c{false}, axis titles are only rotated around their axis but are not otherwise oriented + * towards the camera. + * This property doesn't have any effect if labelAutoRotation property value is zero. + * Default value is \c{true}. + * + * \sa labelAutoRotation, title, titleVisible + */ +void QAbstract3DAxis::setTitleFixed(bool fixed) +{ + if (d_ptr->m_titleFixed != fixed) { + d_ptr->m_titleFixed = fixed; + emit titleFixedChanged(fixed); + } +} + +bool QAbstract3DAxis::isTitleFixed() const +{ + return d_ptr->m_titleFixed; +} + /*! * \property QAbstract3DAxis::min * @@ -302,7 +372,9 @@ QAbstract3DAxisPrivate::QAbstract3DAxisPrivate(QAbstract3DAxis *q, QAbstract3DAx m_min(0.0f), m_max(10.0f), m_autoAdjust(true), - m_labelAutoRotation(0.0f) + m_labelAutoRotation(0.0f), + m_titleVisible(false), + m_titleFixed(true) { } diff --git a/src/datavisualization/axis/qabstract3daxis.h b/src/datavisualization/axis/qabstract3daxis.h index 286e87bd..a9f75550 100644 --- a/src/datavisualization/axis/qabstract3daxis.h +++ b/src/datavisualization/axis/qabstract3daxis.h @@ -41,6 +41,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DAxis : public QObject Q_PROPERTY(float max READ max WRITE setMax NOTIFY maxChanged) Q_PROPERTY(bool autoAdjustRange READ isAutoAdjustRange WRITE setAutoAdjustRange NOTIFY autoAdjustRangeChanged) Q_PROPERTY(float labelAutoRotation READ labelAutoRotation WRITE setLabelAutoRotation NOTIFY labelAutoRotationChanged REVISION 1) + Q_PROPERTY(bool titleVisible READ isTitleVisible WRITE setTitleVisible NOTIFY titleVisibilityChanged REVISION 1) + Q_PROPERTY(bool titleFixed READ isTitleFixed WRITE setTitleFixed NOTIFY titleFixedChanged REVISION 1) public: enum AxisOrientation { @@ -85,6 +87,12 @@ public: void setLabelAutoRotation(float angle); float labelAutoRotation() const; + void setTitleVisible(bool visible); + bool isTitleVisible() const; + + void setTitleFixed(bool fixed); + bool isTitleFixed() const; + signals: void titleChanged(const QString &newTitle); void labelsChanged(); @@ -94,6 +102,8 @@ signals: void rangeChanged(float min, float max); void autoAdjustRangeChanged(bool autoAdjust); Q_REVISION(1) void labelAutoRotationChanged(float angle); + Q_REVISION(1) void titleVisibilityChanged(bool visible); + Q_REVISION(1) void titleFixedChanged(bool fixed); protected: QScopedPointer d_ptr; diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h index eea3593c..72e5b15d 100644 --- a/src/datavisualization/axis/qabstract3daxis_p.h +++ b/src/datavisualization/axis/qabstract3daxis_p.h @@ -68,6 +68,8 @@ protected: float m_max; bool m_autoAdjust; float m_labelAutoRotation; + bool m_titleVisible; + bool m_titleFixed; friend class QAbstract3DAxis; friend class QValue3DAxis; diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 7e310ab8..ea084f9f 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -416,6 +416,37 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.axisZLabelAutoRotationChanged = false; } + if (m_changeTracker.axisXTitleVisibilityChanged) { + m_renderer->updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientationX, + m_axisX->isTitleVisible()); + m_changeTracker.axisXTitleVisibilityChanged = false; + } + if (m_changeTracker.axisYTitleVisibilityChanged) { + m_renderer->updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientationY, + m_axisY->isTitleVisible()); + m_changeTracker.axisYTitleVisibilityChanged = false; + } + if (m_changeTracker.axisZTitleVisibilityChanged) { + m_renderer->updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientationZ, + m_axisZ->isTitleVisible()); + m_changeTracker.axisZTitleVisibilityChanged = false; + } + if (m_changeTracker.axisXTitleFixedChanged) { + m_renderer->updateAxisTitleFixed(QAbstract3DAxis::AxisOrientationX, + m_axisX->isTitleFixed()); + m_changeTracker.axisXTitleFixedChanged = false; + } + if (m_changeTracker.axisYTitleFixedChanged) { + m_renderer->updateAxisTitleFixed(QAbstract3DAxis::AxisOrientationY, + m_axisY->isTitleFixed()); + m_changeTracker.axisYTitleFixedChanged = false; + } + if (m_changeTracker.axisZTitleFixedChanged) { + m_renderer->updateAxisTitleFixed(QAbstract3DAxis::AxisOrientationZ, + m_axisZ->isTitleFixed()); + m_changeTracker.axisZTitleFixedChanged = false; + } + if (m_changedSeriesList.size()) { m_renderer->modifiedSeriesList(m_changedSeriesList); m_changedSeriesList.clear(); @@ -1085,6 +1116,18 @@ void Abstract3DController::handleAxisLabelAutoRotationChanged(float angle) handleAxisLabelAutoRotationChangedBySender(sender()); } +void Abstract3DController::handleAxisTitleVisibilityChanged(bool visible) +{ + Q_UNUSED(visible) + handleAxisTitleVisibilityChangedBySender(sender()); +} + +void Abstract3DController::handleAxisTitleFixedChanged(bool fixed) +{ + Q_UNUSED(fixed) + handleAxisTitleFixedChangedBySender(sender()); +} + void Abstract3DController::handleInputViewChanged(QAbstract3DInputHandler::InputView view) { // When in automatic slicing mode, input view change to primary disables slice mode @@ -1198,6 +1241,34 @@ void Abstract3DController::handleAxisLabelAutoRotationChangedBySender(QObject *s emitNeedRender(); } +void Abstract3DController::handleAxisTitleVisibilityChangedBySender(QObject *sender) +{ + if (sender == m_axisX) + m_changeTracker.axisXTitleVisibilityChanged = true; + else if (sender == m_axisY) + m_changeTracker.axisYTitleVisibilityChanged = true; + else if (sender == m_axisZ) + m_changeTracker.axisZTitleVisibilityChanged = true; + else + qWarning() << __FUNCTION__ << "invoked for invalid axis"; + + emitNeedRender(); +} + +void Abstract3DController::handleAxisTitleFixedChangedBySender(QObject *sender) +{ + if (sender == m_axisX) + m_changeTracker.axisXTitleFixedChanged = true; + else if (sender == m_axisY) + m_changeTracker.axisYTitleFixedChanged = true; + else if (sender == m_axisZ) + m_changeTracker.axisZTitleFixedChanged = true; + else + qWarning() << __FUNCTION__ << "invoked for invalid axis"; + + emitNeedRender(); +} + void Abstract3DController::handleSeriesVisibilityChangedBySender(QObject *sender) { QAbstract3DSeries *series = static_cast(sender); @@ -1256,6 +1327,10 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient this, &Abstract3DController::handleAxisAutoAdjustRangeChanged); QObject::connect(axis, &QAbstract3DAxis::labelAutoRotationChanged, this, &Abstract3DController::handleAxisLabelAutoRotationChanged); + QObject::connect(axis, &QAbstract3DAxis::titleVisibilityChanged, + this, &Abstract3DController::handleAxisTitleVisibilityChanged); + QObject::connect(axis, &QAbstract3DAxis::titleFixedChanged, + this, &Abstract3DController::handleAxisTitleFixedChanged); if (orientation == QAbstract3DAxis::AxisOrientationX) m_changeTracker.axisXTypeChanged = true; @@ -1270,6 +1345,8 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient handleAxisAutoAdjustRangeChangedInOrientation(axis->orientation(), axis->isAutoAdjustRange()); handleAxisLabelAutoRotationChangedBySender(axis); + handleAxisTitleVisibilityChangedBySender(axis); + handleAxisTitleFixedChangedBySender(axis); if (axis->type() & QAbstract3DAxis::AxisTypeValue) { QValue3DAxis *valueAxis = static_cast(axis); diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index 5869d388..e5d1154c 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -84,6 +84,12 @@ struct Abstract3DChangeBitField { bool axisYLabelAutoRotationChanged : 1; bool axisZLabelAutoRotationChanged : 1; bool aspectRatioChanged : 1; + bool axisXTitleVisibilityChanged : 1; + bool axisYTitleVisibilityChanged : 1; + bool axisZTitleVisibilityChanged : 1; + bool axisXTitleFixedChanged : 1; + bool axisYTitleFixedChanged : 1; + bool axisZTitleFixedChanged : 1; Abstract3DChangeBitField() : themeChanged(true), @@ -120,7 +126,13 @@ struct Abstract3DChangeBitField { axisXLabelAutoRotationChanged(true), axisYLabelAutoRotationChanged(true), axisZLabelAutoRotationChanged(true), - aspectRatioChanged(true) + aspectRatioChanged(true), + axisXTitleVisibilityChanged(true), + axisYTitleVisibilityChanged(true), + axisZTitleVisibilityChanged(true), + axisXTitleFixedChanged(true), + axisYTitleFixedChanged(true), + axisZTitleFixedChanged(true) { } }; @@ -278,6 +290,8 @@ public: virtual void handleAxisReversedChangedBySender(QObject *sender); virtual void handleAxisFormatterDirtyBySender(QObject *sender); virtual void handleAxisLabelAutoRotationChangedBySender(QObject *sender); + virtual void handleAxisTitleVisibilityChangedBySender(QObject *sender); + virtual void handleAxisTitleFixedChangedBySender(QObject *sender); virtual void handleSeriesVisibilityChangedBySender(QObject *sender); virtual void handlePendingClick() = 0; virtual void adjustAxisRanges() = 0; @@ -295,6 +309,8 @@ public slots: void handleAxisReversedChanged(bool enable); void handleAxisFormatterDirty(); void handleAxisLabelAutoRotationChanged(float angle); + void handleAxisTitleVisibilityChanged(bool visible); + void handleAxisTitleFixedChanged(bool fixed); void handleInputViewChanged(QAbstract3DInputHandler::InputView view); void handleInputPositionChanged(const QPoint &position); void handleSeriesVisibilityChanged(bool visible); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index adba857b..cd03073d 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -53,8 +53,13 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_visibleSeriesCount(0), m_customItemShader(0), m_useOrthoProjection(false), - m_graphAspectRatio(2.0f) - + m_graphAspectRatio(2.0f), + m_xFlipped(false), + m_yFlipped(false), + m_zFlipped(false), + m_backgroundObj(0), + m_gridLineObj(0), + m_labelObj(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); QObject::connect(this, &Abstract3DRenderer::needRender, controller, @@ -84,6 +89,10 @@ Abstract3DRenderer::~Abstract3DRenderer() } m_customRenderCache.clear(); + ObjectHelper::releaseObjectHelper(this, m_backgroundObj); + ObjectHelper::releaseObjectHelper(this, m_gridLineObj); + ObjectHelper::releaseObjectHelper(this, m_labelObj); + delete m_textureHelper; } @@ -397,6 +406,22 @@ void Abstract3DRenderer::updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrient cache.setLabelAutoRotation(angle); } +void Abstract3DRenderer::updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientation orientation, + bool visible) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.isTitleVisible() != visible) + cache.setTitleVisible(visible); +} + +void Abstract3DRenderer::updateAxisTitleFixed(QAbstract3DAxis::AxisOrientation orientation, + bool fixed) +{ + AxisRenderCache &cache = axisCacheForOrientation(orientation); + if (cache.isTitleFixed() != fixed) + cache.setTitleFixed(fixed); +} + void Abstract3DRenderer::modifiedSeriesList(const QVector &seriesList) { foreach (QAbstract3DSeries *series, seriesList) { @@ -545,6 +570,229 @@ void Abstract3DRenderer::lowerShadowQuality() updateShadowQuality(newQuality); } +void Abstract3DRenderer::drawAxisTitleY(const QVector3D &sideLabelRotation, + const QVector3D &backLabelRotation, + const QVector3D &sideLabelTrans, + const QVector3D &backLabelTrans, + const QQuaternion &totalSideRotation, + const QQuaternion &totalBackRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheY.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float yRotation; + QVector3D titleTrans; + QQuaternion totalRotation; + if (m_xFlipped == m_zFlipped) { + yRotation = backLabelRotation.y(); + titleTrans = backLabelTrans; + totalRotation = totalBackRotation; + } else { + yRotation = sideLabelRotation.y(); + titleTrans = sideLabelTrans; + totalRotation = totalSideRotation; + } + + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(-titleOffset, 0.0f, 0.0f)); + + QQuaternion titleRotation; + if (m_axisCacheY.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, 90.0f); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, 90.0f); + } + dummyItem.setTranslation(titleTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheY.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, Qt::AlignBottom); +} + +void Abstract3DRenderer::drawAxisTitleX(const QVector3D &labelRotation, + const QVector3D &labelTrans, + const QQuaternion &totalRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheX.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float zRotation = 0.0f; + float yRotation = 0.0f; + float xRotation = -90.0f + labelRotation.z(); + float offsetRotation = labelRotation.z(); + float extraRotation = -90.0f; + Qt::AlignmentFlag alignment = Qt::AlignTop; + if (m_yFlipped) { + alignment = Qt::AlignBottom; + if (m_zFlipped) { + zRotation = 180.0f; + titleOffset = -titleOffset; + if (m_xFlipped) { + offsetRotation = -offsetRotation; + extraRotation = -extraRotation; + } else { + xRotation = -90.0f - labelRotation.z(); + } + } else { + zRotation = 180.0f; + yRotation = 180.0f; + if (m_xFlipped) { + offsetRotation = -offsetRotation; + xRotation = -90.0f - labelRotation.z(); + } else { + extraRotation = -extraRotation; + } + } + } else { + if (m_zFlipped) { + titleOffset = -titleOffset; + if (m_xFlipped) { + yRotation = 180.0f; + offsetRotation = -offsetRotation; + } else { + yRotation = 180.0f; + xRotation = -90.0f - labelRotation.z(); + extraRotation = -extraRotation; + } + } else { + if (m_xFlipped) { + offsetRotation = -offsetRotation; + xRotation = -90.0f - labelRotation.z(); + extraRotation = -extraRotation; + } + } + } + + if (offsetRotation == 180.0f || offsetRotation == -180.0f) + offsetRotation = 0.0f; + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, offsetRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(0.0f, 0.0f, titleOffset)); + + QQuaternion titleRotation; + if (m_axisCacheX.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, zRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, xRotation); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, extraRotation); + } + dummyItem.setTranslation(labelTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheX.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment); +} + +void Abstract3DRenderer::drawAxisTitleZ(const QVector3D &labelRotation, + const QVector3D &labelTrans, + const QQuaternion &totalRotation, + AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, + const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader) +{ + float scaleFactor = m_drawer->scaledFontSize() / m_axisCacheZ.titleItem().size().height(); + float titleOffset = 2.0f * (labelMargin + (labelsMaxWidth * scaleFactor)); + float zRotation = labelRotation.z(); + float yRotation = -90.0f; + float xRotation = -90.0f; + float extraRotation = 90.0f; + Qt::AlignmentFlag alignment = Qt::AlignTop; + if (m_yFlipped) { + alignment = Qt::AlignBottom; + xRotation = -xRotation; + if (m_zFlipped) { + if (m_xFlipped) { + titleOffset = -titleOffset; + zRotation = -zRotation; + extraRotation = -extraRotation; + } else { + zRotation = -zRotation; + yRotation = -yRotation; + } + } else { + if (m_xFlipped) { + titleOffset = -titleOffset; + } else { + extraRotation = -extraRotation; + yRotation = -yRotation; + } + } + } else { + if (m_zFlipped) { + zRotation = -zRotation; + if (m_xFlipped) { + titleOffset = -titleOffset; + } else { + extraRotation = -extraRotation; + yRotation = -yRotation; + } + } else { + if (m_xFlipped) { + titleOffset = -titleOffset; + extraRotation = -extraRotation; + } else { + yRotation = -yRotation; + } + } + } + + float offsetRotation = zRotation; + if (offsetRotation == 180.0f || offsetRotation == -180.0f) + offsetRotation = 0.0f; + QQuaternion offsetRotator = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, offsetRotation); + QVector3D titleOffsetVector = + offsetRotator.rotatedVector(QVector3D(titleOffset, 0.0f, 0.0f)); + + QQuaternion titleRotation; + if (m_axisCacheZ.isTitleFixed()) { + titleRotation = QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, zRotation) + * QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, yRotation) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, xRotation); + } else { + titleRotation = totalRotation + * QQuaternion::fromAxisAndAngle(0.0f, 0.0f, 1.0f, extraRotation); + } + dummyItem.setTranslation(labelTrans + titleOffsetVector); + + m_drawer->drawLabel(dummyItem, m_axisCacheZ.titleItem(), viewMatrix, + projectionMatrix, zeroVector, titleRotation, 0, + m_cachedSelectionMode, shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment); +} + +void Abstract3DRenderer::loadGridLineMesh() +{ + ObjectHelper::resetObjectHelper(this, m_gridLineObj, + QStringLiteral(":/defaultMeshes/plane")); +} + +void Abstract3DRenderer::loadLabelMesh() +{ + ObjectHelper::resetObjectHelper(this, m_labelObj, + QStringLiteral(":/defaultMeshes/plane")); +} + + void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *texture) { m_textureHelper->deleteTexture(texture); diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index cd3608a8..35b6ff27 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -111,6 +111,10 @@ public: QValue3DAxisFormatter *formatter); virtual void updateAxisLabelAutoRotation(QAbstract3DAxis::AxisOrientation orientation, float angle); + virtual void updateAxisTitleVisibility(QAbstract3DAxis::AxisOrientation orientation, + bool visible); + virtual void updateAxisTitleFixed(QAbstract3DAxis::AxisOrientation orientation, + bool fixed); virtual void modifiedSeriesList(const QVector &seriesList); virtual void fixMeshFileName(QString &fileName, QAbstract3DSeries::Mesh mesh); @@ -162,6 +166,26 @@ protected: void fixGradient(QLinearGradient *gradient, GLuint *gradientTexture); void calculateZoomLevel(); + void drawAxisTitleY(const QVector3D &sideLabelRotation, const QVector3D &backLabelRotation, + const QVector3D &sideLabelTrans, const QVector3D &backLabelTrans, + const QQuaternion &totalSideRotation, const QQuaternion &totalBackRotation, + AbstractRenderItem &dummyItem, const Q3DCamera *activeCamera, + float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader); + void drawAxisTitleX(const QVector3D &labelRotation, const QVector3D &labelTrans, + const QQuaternion &totalRotation, AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader); + void drawAxisTitleZ(const QVector3D &labelRotation, const QVector3D &labelTrans, + const QQuaternion &totalRotation, AbstractRenderItem &dummyItem, + const Q3DCamera *activeCamera, float labelsMaxWidth, + const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix, + ShaderHelper *shader); + + void loadGridLineMesh(); + void loadLabelMesh(); bool m_hasNegativeValues; Q3DTheme *m_cachedTheme; @@ -200,6 +224,13 @@ protected: ShaderHelper *m_customItemShader; bool m_useOrthoProjection; + bool m_xFlipped; + bool m_zFlipped; + bool m_yFlipped; + + ObjectHelper *m_backgroundObj; // Shared reference + ObjectHelper *m_gridLineObj; // Shared reference + ObjectHelper *m_labelObj; // Shared reference float m_graphAspectRatio; diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index a90c9557..bf661fe4 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -37,7 +37,9 @@ AxisRenderCache::AxisRenderCache() m_positionsDirty(true), m_translate(0.0f), m_scale(1.0f), - m_labelAutoRotation(0.0f) + m_labelAutoRotation(0.0f), + m_titleVisible(false), + m_titleFixed(false) { } diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index c7f6574d..0f82fda0 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -97,6 +97,10 @@ public: } inline float labelAutoRotation() const { return m_labelAutoRotation; } inline void setLabelAutoRotation(float angle) { m_labelAutoRotation = angle; } + inline bool isTitleVisible() const { return m_titleVisible; } + inline void setTitleVisible(bool visible) { m_titleVisible = visible; } + inline bool isTitleFixed() const { return m_titleFixed; } + inline void setTitleFixed(bool fixed) { m_titleFixed = fixed; } public slots: void updateTextures(); @@ -128,6 +132,8 @@ private: float m_translate; float m_scale; float m_labelAutoRotation; + bool m_titleVisible; + bool m_titleFixed; Q_DISABLE_COPY(AxisRenderCache) }; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index db23460c..97589765 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -40,9 +40,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; - const bool sliceGridLabels = true; Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) @@ -53,9 +51,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_selectedBar(0), m_sliceCache(0), m_sliceTitleItem(0), - m_xFlipped(false), - m_zFlipped(false), - m_yFlipped(false), m_updateLabels(false), m_barShader(0), m_barGradientShader(0), @@ -63,9 +58,6 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) m_selectionShader(0), m_backgroundShader(0), m_labelShader(0), - m_backgroundObj(0), - m_gridLineObj(0), - m_labelObj(0), m_bgrTexture(0), m_depthTexture(0), m_selectionTexture(0), @@ -120,9 +112,6 @@ Bars3DRenderer::~Bars3DRenderer() delete m_depthShader; delete m_selectionShader; delete m_backgroundShader; - ObjectHelper::releaseObjectHelper(this, m_backgroundObj); - ObjectHelper::releaseObjectHelper(this, m_gridLineObj); - ObjectHelper::releaseObjectHelper(this, m_labelObj); delete m_labelShader; } @@ -1884,6 +1873,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer float labelAngleFraction = labelAutoAngle / 90.0f; float fractionCamY = activeCamera->yRotation() * labelAngleFraction; float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + float labelsMaxWidth = 0.0f; // Y Labels int labelNbr = 0; @@ -1958,20 +1948,31 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment); + true, true, Drawer::LabelMid, backAlignment, false, drawSelection); // Side wall m_dummyBarRenderItem.setTranslation(sideLabelTrans); m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment); + true, true, Drawer::LabelMid, sideAlignment, false, drawSelection); + + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheY.isTitleVisible()) { + sideLabelTrans.setY(m_backgroundAdjustment); + backLabelTrans.setY(m_backgroundAdjustment); + drawAxisTitleY(sideLabelRotation, backLabelRotation, sideLabelTrans, backLabelTrans, + totalSideRotation, totalBackRotation, m_dummyBarRenderItem, activeCamera, + labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } + // Z labels // Calculate the positions for row and column labels and store them + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheZ.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -2077,10 +2078,18 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } } + if (!drawSelection && m_axisCacheZ.isTitleVisible()) { + QVector3D titleTrans(colPos, 0.0f, 0.0f); + drawAxisTitleZ(labelRotation, titleTrans, totalRotation, m_dummyBarRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } + // X labels + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheX.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -2180,20 +2189,28 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } } + if (!drawSelection && m_axisCacheX.isTitleVisible()) { + QVector3D titleTrans(0.0f, 0.0f, rowPos); + drawAxisTitleX(labelRotation, titleTrans, totalRotation, m_dummyBarRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } + #if 0 // Debug label static LabelItem debugLabelItem; - QString debugLabelString(QStringLiteral("Flips: x:%1 y:%2 z:%3")); - QString finalDebugString = debugLabelString.arg(m_xFlipped).arg(m_yFlipped).arg(m_zFlipped); + QString debugLabelString(QStringLiteral("Flips: x:%1 y:%2 z:%3 xr:%4 yr:%5")); + QString finalDebugString = debugLabelString.arg(m_xFlipped).arg(m_yFlipped).arg(m_zFlipped) + .arg(activeCamera->xRotation()).arg(activeCamera->yRotation()); m_dummyBarRenderItem.setTranslation(QVector3D(m_xFlipped ? -1.5f : 1.5f, m_yFlipped ? 1.5f : -1.5f, m_zFlipped ? -1.5f : 1.5f)); m_drawer->generateLabelItem(debugLabelItem, finalDebugString); m_drawer->drawLabel(m_dummyBarRenderItem, debugLabelItem, viewMatrix, projectionMatrix, - zeroVector, labelRotation, 0, m_cachedSelectionMode, + zeroVector, identityQuaternion, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, false, Drawer::LabelMid, Qt::AlignHCenter, false, drawSelection); #endif @@ -2340,18 +2357,6 @@ void Bars3DRenderer::loadBackgroundMesh() QStringLiteral(":/defaultMeshes/backgroundNoFloor")); } -void Bars3DRenderer::loadGridLineMesh() -{ - ObjectHelper::resetObjectHelper(this, m_gridLineObj, - QStringLiteral(":/defaultMeshes/plane")); -} - -void Bars3DRenderer::loadLabelMesh() -{ - ObjectHelper::resetObjectHelper(this, m_labelObj, - QStringLiteral(":/defaultMeshes/plane")); -} - void Bars3DRenderer::updateTextures() { // Drawer has changed; this flag needs to be checked when checking if we need to update labels diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index 4b544082..c4d25430 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -63,9 +63,6 @@ private: BarRenderItem *m_selectedBar; // points to renderitem array AxisRenderCache *m_sliceCache; // not owned const LabelItem *m_sliceTitleItem; // not owned - bool m_xFlipped; - bool m_zFlipped; - bool m_yFlipped; bool m_updateLabels; ShaderHelper *m_barShader; ShaderHelper *m_barGradientShader; @@ -73,9 +70,6 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_backgroundObj; // Shared reference - ObjectHelper *m_gridLineObj; // Shared reference - ObjectHelper *m_labelObj; // Shared reference GLuint m_bgrTexture; GLuint m_depthTexture; GLuint m_selectionTexture; @@ -159,8 +153,6 @@ private: GLfloat rowScaleFactor, GLfloat columnScaleFactor); void loadBackgroundMesh(); - void loadGridLineMesh(); - void loadLabelMesh(); void initSelectionShader(); void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader); void initLabelShaders(const QString &vertexShader, const QString &fragmentShader); diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index a14678ce..d6c9fdce 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -55,7 +55,8 @@ Drawer::Drawer(Q3DTheme *theme) : m_theme(theme), m_textureHelper(0), m_pointbuffer(0), - m_linebuffer(0) + m_linebuffer(0), + m_scaledFontSize(0.0f) { } @@ -79,6 +80,7 @@ void Drawer::initializeOpenGL() void Drawer::setTheme(Q3DTheme *theme) { m_theme = theme; + m_scaledFontSize = 0.05f + m_theme->font().pointSizeF() / 500.0f; emit drawerChanged(); } @@ -295,8 +297,7 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte } // Calculate scale factor to get uniform font size - GLfloat scaledFontSize = 0.05f + m_theme->font().pointSizeF() / 500.0f; - GLfloat scaleFactor = scaledFontSize / (GLfloat)textureSize.height(); + GLfloat scaleFactor = m_scaledFontSize / (GLfloat)textureSize.height(); // Apply alignment QVector3D anchorPoint; @@ -337,7 +338,7 @@ void Drawer::drawLabel(const AbstractRenderItem &item, const LabelItem &labelIte // Scale label based on text size modelMatrix.scale(QVector3D((GLfloat)textureSize.width() * scaleFactor, - scaledFontSize, + m_scaledFontSize, 0.0f)); MVPMatrix = projectionmatrix * viewmatrix * modelMatrix; diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index cdda4f7d..966ccb85 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -71,6 +71,7 @@ public: void setTheme(Q3DTheme *theme); Q3DTheme *theme() const; QFont font() const; + inline GLfloat scaledFontSize() const { return m_scaledFontSize; } void drawObject(ShaderHelper *shader, AbstractObjectHelper *object, GLuint textureId = 0, GLuint depthTextureId = 0); @@ -98,6 +99,7 @@ private: TextureHelper *m_textureHelper; GLuint m_pointbuffer; GLuint m_linebuffer; + GLfloat m_scaledFontSize; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index e37089a2..dd84139d 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION //#define USE_UNIFORM_SCALING // Scale x and z uniformly, or based on autoscaled values -const GLfloat labelMargin = 0.05f; const GLfloat defaultMinSize = 0.01f; const GLfloat defaultMaxSize = 0.1f; const GLfloat itemScaler = 3.0f; @@ -54,9 +53,6 @@ const GLfloat gridLineWidth = 0.005f; Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) : Abstract3DRenderer(controller), m_selectedItem(0), - m_xFlipped(false), - m_zFlipped(false), - m_yFlipped(false), m_updateLabels(false), m_dotShader(0), m_dotGradientShader(0), @@ -67,11 +63,6 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_selectionShader(0), m_backgroundShader(0), m_labelShader(0), - m_backgroundObj(0), - #if !defined(QT_OPENGL_ES_2) - m_gridLineObj(0), - #endif - m_labelObj(0), m_bgrTexture(0), m_depthTexture(0), m_selectionTexture(0), @@ -117,11 +108,6 @@ Scatter3DRenderer::~Scatter3DRenderer() delete m_selectionShader; delete m_backgroundShader; delete m_labelShader; - ObjectHelper::releaseObjectHelper(this, m_backgroundObj); -#if !defined(QT_OPENGL_ES_2) - ObjectHelper::releaseObjectHelper(this, m_gridLineObj); -#endif - ObjectHelper::releaseObjectHelper(this, m_labelObj); } void Scatter3DRenderer::initializeOpenGL() @@ -1357,6 +1343,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa float labelAngleFraction = labelAutoAngle / 90.0f; float fractionCamY = activeCamera->yRotation() * labelAngleFraction; float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + float labelsMaxWidth = 0.0f; // Z Labels if (m_axisCacheZ.segmentCount() > 0) { @@ -1458,13 +1445,21 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignment); + Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheZ.isTitleVisible()) { + labelTrans.setZ(0.0f); + drawAxisTitleZ(labelRotation, labelTrans, totalRotation, m_dummyRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } } + // X Labels if (m_axisCacheX.segmentCount() > 0) { + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheX.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -1570,13 +1565,21 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignment); + Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheX.isTitleVisible()) { + labelTrans.setX(0.0f); + drawAxisTitleX(labelRotation, labelTrans, totalRotation, m_dummyRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } } + // Y Labels if (m_axisCacheY.segmentCount() > 0) { + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheY.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -1660,7 +1663,7 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, backAlignment); + Drawer::LabelMid, backAlignment, false, drawSelection); // Side wall labelTransSide.setY(labelYTrans); @@ -1668,10 +1671,17 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, zeroVector, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, sideAlignment); + Drawer::LabelMid, sideAlignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheY.isTitleVisible()) { + drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, + totalSideRotation, totalBackRotation, m_dummyRenderItem, activeCamera, + labelsMaxWidth, viewMatrix, projectionMatrix, + shader); + } } glDisable(GL_POLYGON_OFFSET_FILL); } @@ -1739,20 +1749,6 @@ void Scatter3DRenderer::loadBackgroundMesh() QStringLiteral(":/defaultMeshes/background")); } -#if !(defined QT_OPENGL_ES_2) -void Scatter3DRenderer::loadGridLineMesh() -{ - ObjectHelper::resetObjectHelper(this, m_gridLineObj, - QStringLiteral(":/defaultMeshes/plane")); -} -#endif - -void Scatter3DRenderer::loadLabelMesh() -{ - ObjectHelper::resetObjectHelper(this, m_labelObj, - QStringLiteral(":/defaultMeshes/plane")); -} - void Scatter3DRenderer::updateTextures() { // Drawer has changed; this flag needs to be checked when checking if we need to update labels diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index b6a110ff..373e0f38 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -55,9 +55,6 @@ class QT_DATAVISUALIZATION_EXPORT Scatter3DRenderer : public Abstract3DRenderer private: // Internal state ScatterRenderItem *m_selectedItem; // points to renderitem array - bool m_xFlipped; - bool m_zFlipped; - bool m_yFlipped; bool m_updateLabels; ShaderHelper *m_dotShader; ShaderHelper *m_dotGradientShader; @@ -68,11 +65,6 @@ private: ShaderHelper *m_selectionShader; ShaderHelper *m_backgroundShader; ShaderHelper *m_labelShader; - ObjectHelper *m_backgroundObj; // Shared reference -#if !(defined QT_OPENGL_ES_2) - ObjectHelper *m_gridLineObj; // Shared reference -#endif - ObjectHelper *m_labelObj; // Shared reference GLuint m_bgrTexture; GLuint m_depthTexture; GLuint m_selectionTexture; @@ -130,13 +122,11 @@ private: const QMatrix4x4 &viewMatrix, const QMatrix4x4 &projectionMatrix); void loadBackgroundMesh(); - void loadLabelMesh(); void initSelectionShader(); void initBackgroundShaders(const QString &vertexShader, const QString &fragmentShader); void initLabelShaders(const QString &vertexShader, const QString &fragmentShader); void initSelectionBuffer(); #if !defined(QT_OPENGL_ES_2) - void loadGridLineMesh(); void initDepthShader(); void updateDepthBuffer(); #else diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 54544396..83bf738c 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -43,7 +43,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION // Margin for background (1.10 make it 10% larger to avoid // selection ball being drawn inside background) const GLfloat backgroundMargin = 1.1f; -const GLfloat labelMargin = 0.05f; const GLfloat gridLineWidth = 0.005f; const GLfloat sliceZScale = 0.1f; const GLfloat sliceUnits = 2.5f; @@ -75,11 +74,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_maxVisibleRowValue(0.0f), m_visibleColumnRange(0.0f), m_visibleRowRange(0.0f), - m_backgroundObj(0), - #if !defined(QT_OPENGL_ES_2) - m_gridLineObj(0), - #endif - m_labelObj(0), m_depthTexture(0), m_depthModelTexture(0), m_depthFrameBuffer(0), @@ -89,9 +83,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_shadowQualityToShader(33.3f), m_flatSupported(true), m_selectionActive(false), - m_xFlipped(false), - m_zFlipped(false), - m_yFlipped(false), m_shadowQualityMultiplier(3), m_hasHeightAdjustmentChanged(true), m_selectedPoint(Surface3DController::invalidSelectionPosition()), @@ -140,12 +131,6 @@ Surface3DRenderer::~Surface3DRenderer() delete m_surfaceSliceFlatShader; delete m_surfaceSliceSmoothShader; delete m_labelShader; - - ObjectHelper::releaseObjectHelper(this, m_backgroundObj); -#if !defined(QT_OPENGL_ES_2) - ObjectHelper::releaseObjectHelper(this, m_gridLineObj); -#endif - ObjectHelper::releaseObjectHelper(this, m_labelObj); } void Surface3DRenderer::initializeOpenGL() @@ -1843,6 +1828,7 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa float labelAngleFraction = labelAutoAngle / 90.0f; float fractionCamY = activeCamera->yRotation() * labelAngleFraction; float fractionCamX = activeCamera->xRotation() * labelAngleFraction; + float labelsMaxWidth = 0.0f; // Z Labels QVector3D positionZComp(0.0f, 0.0f, 0.0f); @@ -1941,13 +1927,20 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment); + true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheZ.isTitleVisible()) { + labelTrans.setZ(0.0f); + drawAxisTitleZ(labelRotation, labelTrans, totalRotation, m_dummyRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } } // X Labels if (m_axisCacheX.segmentCount() > 0) { + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheX.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -2048,13 +2041,20 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, totalRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment); + true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheX.isTitleVisible()) { + labelTrans.setX(0.0f); + drawAxisTitleX(labelRotation, labelTrans, totalRotation, m_dummyRenderItem, + activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, shader); + } } // Y Labels if (m_axisCacheY.segmentCount() > 0) { + labelsMaxWidth = 0.0f; labelAutoAngle = m_axisCacheY.labelAutoRotation(); labelAngleFraction = labelAutoAngle / 90.0f; fractionCamY = activeCamera->yRotation() * labelAngleFraction; @@ -2129,7 +2129,8 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, totalBackRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment); + true, true, Drawer::LabelMid, backAlignment, false, + drawSelection); // Side wall labelTransSide.setY(labelYTrans); @@ -2137,10 +2138,18 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, positionZComp, totalSideRotation, 0, m_cachedSelectionMode, shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment); + true, true, Drawer::LabelMid, sideAlignment, false, + drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } labelNbr++; } + if (!drawSelection && m_axisCacheY.isTitleVisible()) { + drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, + totalSideRotation, totalBackRotation, m_dummyRenderItem, activeCamera, + labelsMaxWidth, viewMatrix, projectionMatrix, + shader); + } } glDisable(GL_POLYGON_OFFSET_FILL); @@ -2314,14 +2323,6 @@ void Surface3DRenderer::loadBackgroundMesh() QStringLiteral(":/defaultMeshes/background")); } -#if !(defined QT_OPENGL_ES_2) -void Surface3DRenderer::loadGridLineMesh() -{ - ObjectHelper::resetObjectHelper(this, m_gridLineObj, - QStringLiteral(":/defaultMeshes/plane")); -} -#endif - void Surface3DRenderer::surfacePointSelected(const QPoint &point) { foreach (SeriesRenderCache *baseCache, m_renderCacheList) { @@ -2543,12 +2544,6 @@ void Surface3DRenderer::updateSlicingActive(bool isSlicing) } } -void Surface3DRenderer::loadLabelMesh() -{ - ObjectHelper::resetObjectHelper(this, m_labelObj, - QStringLiteral(":/defaultMeshes/plane")); -} - void Surface3DRenderer::initShaders(const QString &vertexShader, const QString &fragmentShader) { Q_UNUSED(vertexShader); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index e6c66a90..9af3f47d 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -73,11 +73,6 @@ private: GLfloat m_maxVisibleRowValue; GLfloat m_visibleColumnRange; GLfloat m_visibleRowRange; - ObjectHelper *m_backgroundObj; // Shared reference -#if !(defined QT_OPENGL_ES_2) - ObjectHelper *m_gridLineObj; // Shared reference -#endif - ObjectHelper *m_labelObj; // Shared reference GLuint m_depthTexture; GLuint m_depthModelTexture; GLuint m_depthFrameBuffer; @@ -87,9 +82,6 @@ private: GLfloat m_shadowQualityToShader; bool m_flatSupported; bool m_selectionActive; - bool m_xFlipped; - bool m_zFlipped; - bool m_yFlipped; AbstractRenderItem m_dummyRenderItem; GLint m_shadowQualityMultiplier; QSizeF m_areaSize; @@ -139,7 +131,6 @@ private: void initShaders(const QString &vertexShader, const QString &fragmentShader); QRect calculateSampleRect(const QSurfaceDataArray &array); void loadBackgroundMesh(); - void loadLabelMesh(); void drawSlicedScene(); void drawScene(GLuint defaultFboHandle); @@ -161,7 +152,6 @@ private: void updateSelectionPoint(SurfaceSeriesRenderCache *cache, const QPoint &point, bool label); QPoint selectionIdToSurfacePoint(uint id); #if !defined(QT_OPENGL_ES_2) - void loadGridLineMesh(); void updateDepthBuffer(); #endif void emitSelectedPointChanged(QPoint position); diff --git a/src/datavisualization/global/datavisualizationglobal_p.h b/src/datavisualization/global/datavisualizationglobal_p.h index 612b7bea..abdac998 100644 --- a/src/datavisualization/global/datavisualizationglobal_p.h +++ b/src/datavisualization/global/datavisualizationglobal_p.h @@ -68,6 +68,7 @@ static const GLfloat gradientTextureHeight = 1024.0f; static const GLfloat gradientTextureWidth = 2.0f; static const GLfloat uniformTextureHeight = 64.0f; static const GLfloat uniformTextureWidth = 2.0f; +static const GLfloat labelMargin = 0.05f; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index ad147b0d..50c73901 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -232,6 +232,21 @@ int main(int argc, char **argv) aspectRatioSlider->setValue(20); aspectRatioSlider->setMaximum(100); + QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget); + axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible")); + axisTitlesVisibleCB->setChecked(false); + + QCheckBox *axisTitlesFixedCB = new QCheckBox(widget); + axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed")); + axisTitlesFixedCB->setChecked(true); + + QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget); + axisLabelRotationSlider->setTickInterval(10); + axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow); + axisLabelRotationSlider->setMinimum(0); + axisLabelRotationSlider->setValue(0); + axisLabelRotationSlider->setMaximum(90); + vLayout->addWidget(themeButton, 0, Qt::AlignTop); vLayout->addWidget(labelButton, 0, Qt::AlignTop); vLayout->addWidget(styleButton, 0, Qt::AlignTop); @@ -276,9 +291,13 @@ int main(int argc, char **argv) vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); vLayout2->addWidget(fontList); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size"))); - vLayout2->addWidget(fontSizeSlider, 0, Qt::AlignTop); + vLayout2->addWidget(fontSizeSlider); vLayout2->addWidget(new QLabel(QStringLiteral("Adjust aspect ratio"))); vLayout2->addWidget(aspectRatioSlider, 1, Qt::AlignTop); + vLayout2->addWidget(axisTitlesVisibleCB); + vLayout2->addWidget(axisTitlesFixedCB); + vLayout2->addWidget(new QLabel(QStringLiteral("Axis label rotation"))); + vLayout2->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop); widget->show(); @@ -366,7 +385,12 @@ int main(int argc, char **argv) &ScatterDataModifier::setMaxY); QObject::connect(maxSliderZ, &QSlider::valueChanged, modifier, &ScatterDataModifier::setMaxZ); - + QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, modifier, + &ScatterDataModifier::toggleAxisTitleVisibility); + QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, modifier, + &ScatterDataModifier::toggleAxisTitleFixed); + QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier, + &ScatterDataModifier::changeLabelRotation); QObject::connect(aspectRatioSlider, &QSlider::valueChanged, modifier, &ScatterDataModifier::setAspectRatio); diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index 3f900909..dce73e61 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -478,9 +478,9 @@ void ScatterDataModifier::testAxisReverse() void ScatterDataModifier::addData() { // Add labels - m_chart->axisX()->setTitle("X"); - m_chart->axisY()->setTitle("Y"); - m_chart->axisZ()->setTitle("Z"); + m_chart->axisX()->setTitle("X - Axis"); + m_chart->axisY()->setTitle("Y - Axis"); + m_chart->axisZ()->setTitle("Z - Axis"); m_chart->axisX()->setRange(-50.0f, 50.0f); m_chart->axisY()->setRange(-1.0f, 1.2f); m_chart->axisZ()->setRange(-50.0f, 50.0f); @@ -921,6 +921,27 @@ void ScatterDataModifier::handleFpsChange(qreal fps) m_fpsLabel->setText(fpsPrefix + QString::number(qRound(fps))); } +void ScatterDataModifier::changeLabelRotation(int rotation) +{ + m_chart->axisX()->setLabelAutoRotation(float(rotation)); + m_chart->axisY()->setLabelAutoRotation(float(rotation)); + m_chart->axisZ()->setLabelAutoRotation(float(rotation)); +} + +void ScatterDataModifier::toggleAxisTitleVisibility(bool enabled) +{ + m_chart->axisX()->setTitleVisible(enabled); + m_chart->axisY()->setTitleVisible(enabled); + m_chart->axisZ()->setTitleVisible(enabled); +} + +void ScatterDataModifier::toggleAxisTitleFixed(bool enabled) +{ + m_chart->axisX()->setTitleFixed(enabled); + m_chart->axisY()->setTitleFixed(enabled); + m_chart->axisZ()->setTitleFixed(enabled); +} + void ScatterDataModifier::changeShadowQuality(int quality) { QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 34826aba..420c68e3 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -85,11 +85,13 @@ public slots: void removeSeries(); void toggleSeriesVisibility(); void changeSeriesName(); - void handleAxisXChanged(QValue3DAxis *axis); void handleAxisYChanged(QValue3DAxis *axis); void handleAxisZChanged(QValue3DAxis *axis); void handleFpsChange(qreal fps); + void changeLabelRotation(int rotation); + void toggleAxisTitleVisibility(bool enabled); + void toggleAxisTitleFixed(bool enabled); signals: void shadowQualityChanged(int quality); diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 442e7742..13cf9fad 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -700,6 +700,27 @@ void GraphModifier::handleFpsChange(qreal fps) qDebug() << "FPS:" << fps; } +void GraphModifier::changeLabelRotation(int rotation) +{ + m_graph->axisX()->setLabelAutoRotation(float(rotation)); + m_graph->axisY()->setLabelAutoRotation(float(rotation)); + m_graph->axisZ()->setLabelAutoRotation(float(rotation)); +} + +void GraphModifier::toggleAxisTitleVisibility(bool enabled) +{ + m_graph->axisX()->setTitleVisible(enabled); + m_graph->axisY()->setTitleVisible(enabled); + m_graph->axisZ()->setTitleVisible(enabled); +} + +void GraphModifier::toggleAxisTitleFixed(bool enabled) +{ + m_graph->axisX()->setTitleFixed(enabled); + m_graph->axisY()->setTitleFixed(enabled); + m_graph->axisZ()->setTitleFixed(enabled); +} + void GraphModifier::resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, float maxX) { m_axisMinSliderX->setValue(minX); diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index ff0b325e..1cf13b97 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -126,6 +126,9 @@ public slots: void handleAxisYChanged(QValue3DAxis *axis); void handleAxisZChanged(QValue3DAxis *axis); void handleFpsChange(qreal fps); + void changeLabelRotation(int rotation); + void toggleAxisTitleVisibility(bool enabled); + void toggleAxisTitleFixed(bool enabled); private: void fillSeries(); diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 7444a66a..0b146678 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -370,6 +370,21 @@ int main(int argc, char *argv[]) line3->setFrameShape(QFrame::HLine); line3->setFrameShadow(QFrame::Sunken); + QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget); + axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible")); + axisTitlesVisibleCB->setChecked(false); + + QCheckBox *axisTitlesFixedCB = new QCheckBox(widget); + axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed")); + axisTitlesFixedCB->setChecked(true); + + QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget); + axisLabelRotationSlider->setTickInterval(10); + axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow); + axisLabelRotationSlider->setMinimum(0); + axisLabelRotationSlider->setValue(0); + axisLabelRotationSlider->setMaximum(90); + // Add controls to the layout #ifdef MULTI_SERIES vLayout->addWidget(series1CB); @@ -450,6 +465,10 @@ int main(int argc, char *argv[]) vLayout2->addWidget(massiveDataTestButton); vLayout2->addWidget(testReverseButton); vLayout2->addWidget(testDataOrderingButton); + vLayout2->addWidget(axisTitlesVisibleCB); + vLayout2->addWidget(axisTitlesFixedCB); + vLayout2->addWidget(new QLabel(QStringLiteral("Axis label rotation"))); + vLayout2->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop); widget->show(); @@ -611,6 +630,12 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::testAxisReverse); QObject::connect(testDataOrderingButton, &QPushButton::clicked, modifier, &GraphModifier::testDataOrdering); + QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleAxisTitleVisibility); + QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleAxisTitleFixed); + QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier, + &GraphModifier::changeLabelRotation); QObject::connect(aspectRatioSlider, &QSlider::valueChanged, modifier, &GraphModifier::setAspectRatio); -- cgit v1.2.3 From f48233015f5b3694002a456b9db61d3e58541c5c Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 27 May 2014 11:36:44 +0300 Subject: Fix labels transparency within each axis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3141 Change-Id: I8ca51b411e2d92e0c615c81d215d89575d614acd Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/bars3drenderer.cpp | 185 ++++++++++++--------- src/datavisualization/engine/scatter3drenderer.cpp | 157 +++++++++-------- src/datavisualization/engine/surface3drenderer.cpp | 161 ++++++++++-------- 3 files changed, 282 insertions(+), 221 deletions(-) diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 97589765..87fecbf2 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -1875,8 +1875,11 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer float fractionCamX = activeCamera->xRotation() * labelAngleFraction; float labelsMaxWidth = 0.0f; + int startIndex; + int endIndex; + int indexStep; + // Y Labels - int labelNbr = 0; int labelCount = m_axisCacheY.labelCount(); GLfloat labelMarginXTrans = labelMargin; GLfloat labelMarginZTrans = labelMargin; @@ -1928,38 +1931,44 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer QVector3D sideLabelTrans = QVector3D(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); - for (int i = 0; i < labelCount; i++) { - if (m_axisCacheY.labelItems().size() > labelNbr) { - backLabelTrans.setY(m_axisCacheY.labelPosition(i)); - sideLabelTrans.setY(backLabelTrans.y()); + if (m_yFlipped) { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } + for (int i = startIndex; i != endIndex; i = i + indexStep) { + backLabelTrans.setY(m_axisCacheY.labelPosition(i)); + sideLabelTrans.setY(backLabelTrans.y()); - glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); + glPolygonOffset(GLfloat(i) / -10.0f, 1.0f); - const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); + const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(i); - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, 0.0f, i / 255.0f, - alphaForValueSelection); - shader->setUniformValue(shader->color(), labelColor); - } - - // Back wall - m_dummyBarRenderItem.setTranslation(backLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalBackRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment, false, drawSelection); - - // Side wall - m_dummyBarRenderItem.setTranslation(sideLabelTrans); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalSideRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment, false, drawSelection); - - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, i / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + // Back wall + m_dummyBarRenderItem.setTranslation(backLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalBackRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, backAlignment, false, drawSelection); + + // Side wall + m_dummyBarRenderItem.setTranslation(sideLabelTrans); + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalSideRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, sideAlignment, false, drawSelection); + + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheY.isTitleVisible()) { @@ -2049,37 +2058,44 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } QQuaternion totalRotation = Utils::calculateRotation(labelRotation); - for (int row = 0; row != m_cachedRowCount; row++) { - if (m_axisCacheZ.labelItems().size() > row) { - // Go through all rows and get position of max+1 or min-1 column, depending on x flip - // We need only positions for them, labels have already been generated - rowPos = (row + 0.5f) * m_cachedBarSpacing.height(); - if (m_xFlipped) - colPos = -colPosValue; - else - colPos = colPosValue; - - glPolygonOffset(GLfloat(row) / -10.0f, 1.0f); + if (m_zFlipped) { + startIndex = 0; + endIndex = m_cachedRowCount; + indexStep = 1; + } else { + startIndex = m_cachedRowCount - 1; + endIndex = -1; + indexStep = -1; + } + for (int row = startIndex; row != endIndex; row = row + indexStep) { + // Go through all rows and get position of max+1 or min-1 column, depending on x flip + // We need only positions for them, labels have already been generated + rowPos = (row + 0.5f) * m_cachedBarSpacing.height(); + if (m_xFlipped) + colPos = -colPosValue; + else + colPos = colPosValue; - QVector3D labelPos = QVector3D(colPos, - labelYAdjustment, // raise a bit over background to avoid depth "glimmering" - (m_columnDepth - rowPos) / m_scaleFactor); + glPolygonOffset(GLfloat(row) / -10.0f, 1.0f); - m_dummyBarRenderItem.setTranslation(labelPos); - const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(row); + QVector3D labelPos = QVector3D(colPos, + labelYAdjustment, // raise a bit over background to avoid depth "glimmering" + (m_columnDepth - rowPos) / m_scaleFactor); - if (drawSelection) { - QVector4D labelColor = QVector4D(row / 255.0f, 0.0f, 0.0f, alphaForRowSelection); - shader->setUniformValue(shader->color(), labelColor); - } + m_dummyBarRenderItem.setTranslation(labelPos); + const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(row); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment, - false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(row / 255.0f, 0.0f, 0.0f, alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); } + + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, + false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheZ.isTitleVisible()) { @@ -2160,37 +2176,44 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer totalRotation = Utils::calculateRotation(labelRotation); - for (int column = 0; column != m_cachedColumnCount; column++) { - if (m_axisCacheX.labelItems().size() > column) { - // Go through all columns and get position of max+1 or min-1 row, depending on z flip - // We need only positions for them, labels have already been generated - colPos = (column + 0.5f) * m_cachedBarSpacing.width(); - if (m_zFlipped) - rowPos = -rowPosValue; - else - rowPos = rowPosValue; - - glPolygonOffset(GLfloat(column) / -10.0f, 1.0f); + if (m_xFlipped) { + startIndex = m_cachedColumnCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = m_cachedColumnCount; + indexStep = 1; + } + for (int column = startIndex; column != endIndex; column = column + indexStep) { + // Go through all columns and get position of max+1 or min-1 row, depending on z flip + // We need only positions for them, labels have already been generated + colPos = (column + 0.5f) * m_cachedBarSpacing.width(); + if (m_zFlipped) + rowPos = -rowPosValue; + else + rowPos = rowPosValue; - QVector3D labelPos = QVector3D((colPos - m_rowWidth) / m_scaleFactor, - labelYAdjustment, // raise a bit over background to avoid depth "glimmering" - rowPos); + glPolygonOffset(GLfloat(column) / -10.0f, 1.0f); - m_dummyBarRenderItem.setTranslation(labelPos); - const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(column); + QVector3D labelPos = QVector3D((colPos - m_rowWidth) / m_scaleFactor, + labelYAdjustment, // raise a bit over background to avoid depth "glimmering" + rowPos); - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, column / 255.0f, 0.0f, - alphaForColumnSelection); - shader->setUniformValue(shader->color(), labelColor); - } + m_dummyBarRenderItem.setTranslation(labelPos); + const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(column); - m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, column / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); } + + m_drawer->drawLabel(m_dummyBarRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheX.isTitleVisible()) { diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index dd84139d..10160bed 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1345,6 +1345,10 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa float fractionCamX = activeCamera->xRotation() * labelAngleFraction; float labelsMaxWidth = 0.0f; + int startIndex; + int endIndex; + int indexStep; + // Z Labels if (m_axisCacheZ.segmentCount() > 0) { int labelCount = m_axisCacheZ.labelCount(); @@ -1356,7 +1360,6 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #else GLfloat labelXTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif - int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; @@ -1426,29 +1429,35 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa } QQuaternion totalRotation = Utils::calculateRotation(labelRotation); QVector3D labelTrans = QVector3D(labelXTrans, labelYTrans, 0.0f); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheZ.labelItems().size() > labelNbr) { - labelTrans.setZ(m_axisCacheZ.labelPosition(label)); - - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (m_zFlipped) { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } else { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + labelTrans.setZ(m_axisCacheZ.labelPosition(label)); - // Draw the label here - m_dummyRenderItem.setTranslation(labelTrans); - const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - if (drawSelection) { - QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, - alphaForRowSelection); - shader->setUniformValue(shader->color(), labelColor); - } + // Draw the label here + m_dummyRenderItem.setTranslation(labelTrans); + const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(label); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, + alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, true, true, + Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheZ.isTitleVisible()) { labelTrans.setZ(0.0f); @@ -1473,7 +1482,6 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa #else GLfloat labelZTrans = m_graphAspectRatio + m_backgroundMargin + labelMargin; #endif - int labelNbr = 0; GLfloat labelYTrans = -1.0f - m_backgroundMargin; Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; QVector3D labelRotation; @@ -1546,29 +1554,35 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa QQuaternion totalRotation = Utils::calculateRotation(labelRotation); QVector3D labelTrans = QVector3D(0.0f, labelYTrans, labelZTrans); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheX.labelItems().size() > labelNbr) { - labelTrans.setX(m_axisCacheX.labelPosition(label)); - - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (m_xFlipped) { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + labelTrans.setX(m_axisCacheX.labelPosition(label)); - // Draw the label here - m_dummyRenderItem.setTranslation(labelTrans); - const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, - alphaForColumnSelection); - shader->setUniformValue(shader->color(), labelColor); - } + // Draw the label here + m_dummyRenderItem.setTranslation(labelTrans); + const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(label); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, alignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, true, true, + Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheX.isTitleVisible()) { labelTrans.setX(0.0f); @@ -1585,7 +1599,6 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa fractionCamY = activeCamera->yRotation() * labelAngleFraction; fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheY.labelCount(); - int labelNbr = 0; #ifndef USE_UNIFORM_SCALING // Use this if we want to use autoscaling for x and z GLfloat labelXTrans = (m_graphAspectRatio* m_areaSize.width()) / m_scaleFactor + m_backgroundMargin; @@ -1644,37 +1657,43 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheY.labelItems().size() > labelNbr) { - const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); - const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (m_yFlipped) { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(label); + const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, - alphaForValueSelection); - shader->setUniformValue(shader->color(), labelColor); - } + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - // Back wall - labelTransBack.setY(labelYTrans); - m_dummyRenderItem.setTranslation(labelTransBack); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalBackRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, backAlignment, false, drawSelection); - - // Side wall - labelTransSide.setY(labelYTrans); - m_dummyRenderItem.setTranslation(labelTransSide); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - zeroVector, totalSideRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, true, true, - Drawer::LabelMid, sideAlignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + // Back wall + labelTransBack.setY(labelYTrans); + m_dummyRenderItem.setTranslation(labelTransBack); + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalBackRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, true, true, + Drawer::LabelMid, backAlignment, false, drawSelection); + + // Side wall + labelTransSide.setY(labelYTrans); + m_dummyRenderItem.setTranslation(labelTransSide); + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + zeroVector, totalSideRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, true, true, + Drawer::LabelMid, sideAlignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheY.isTitleVisible()) { drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 83bf738c..6fc0aec1 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1830,11 +1830,14 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa float fractionCamX = activeCamera->xRotation() * labelAngleFraction; float labelsMaxWidth = 0.0f; + int startIndex; + int endIndex; + int indexStep; + // Z Labels QVector3D positionZComp(0.0f, 0.0f, 0.0f); if (m_axisCacheZ.segmentCount() > 0) { int labelCount = m_axisCacheZ.labelCount(); - int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; Qt::AlignmentFlag alignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; @@ -1910,27 +1913,33 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelYTrans, 0.0f); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheZ.labelItems().size() > labelNbr) { - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - // Draw the label here - labelTrans.setZ(m_axisCacheZ.labelPosition(label)); - m_dummyRenderItem.setTranslation(labelTrans); - const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(labelNbr); - - if (drawSelection) { - QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, - alphaForRowSelection); - shader->setUniformValue(shader->color(), labelColor); - } + if (m_zFlipped) { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } else { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + // Draw the label here + labelTrans.setZ(m_axisCacheZ.labelPosition(label)); + m_dummyRenderItem.setTranslation(labelTrans); + const LabelItem &axisLabelItem = *m_axisCacheZ.labelItems().at(label); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(label / 255.0f, 0.0f, 0.0f, + alphaForRowSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + positionZComp, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheZ.isTitleVisible()) { labelTrans.setZ(0.0f); @@ -1947,7 +1956,6 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheX.labelCount(); - int labelNbr = 0; GLfloat labelZTrans = m_scaleZWithBackground + labelMargin; GLfloat labelYTrans = -backgroundMargin; Qt::AlignmentFlag alignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; @@ -2024,27 +2032,33 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelYTrans, labelZTrans); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheX.labelItems().size() > labelNbr) { - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - // Draw the label here - labelTrans.setX(m_axisCacheX.labelPosition(label)); - m_dummyRenderItem.setTranslation(labelTrans); - const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(labelNbr); - - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, - alphaForColumnSelection); - shader->setUniformValue(shader->color(), labelColor); - } + if (m_xFlipped) { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + // Draw the label here + labelTrans.setX(m_axisCacheX.labelPosition(label)); + m_dummyRenderItem.setTranslation(labelTrans); + const LabelItem &axisLabelItem = *m_axisCacheX.labelItems().at(label); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, totalRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, alignment, false, drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, label / 255.0f, 0.0f, + alphaForColumnSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + positionZComp, totalRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, alignment, false, drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheX.isTitleVisible()) { labelTrans.setX(0.0f); @@ -2061,7 +2075,6 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa fractionCamX = activeCamera->xRotation() * labelAngleFraction; int labelCount = m_axisCacheY.labelCount(); - int labelNbr = 0; GLfloat labelXTrans = m_scaleXWithBackground; GLfloat labelZTrans = m_scaleZWithBackground; @@ -2110,39 +2123,45 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa QVector3D labelTransBack = QVector3D(labelXTrans, 0.0f, labelZTrans + labelMarginZTrans); QVector3D labelTransSide(-labelXTrans - labelMarginXTrans, 0.0f, -labelZTrans); - for (int label = 0; label < labelCount; label++) { - if (m_axisCacheY.labelItems().size() > labelNbr) { - const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(labelNbr); - const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - - glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); + if (m_yFlipped) { + startIndex = labelCount - 1; + endIndex = -1; + indexStep = -1; + } else { + startIndex = 0; + endIndex = labelCount; + indexStep = 1; + } + for (int label = startIndex; label != endIndex; label = label + indexStep) { + const LabelItem &axisLabelItem = *m_axisCacheY.labelItems().at(label); + const GLfloat labelYTrans = m_axisCacheY.labelPosition(label); - if (drawSelection) { - QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, - alphaForValueSelection); - shader->setUniformValue(shader->color(), labelColor); - } + glPolygonOffset(GLfloat(label) / -10.0f, 1.0f); - // Back wall - labelTransBack.setY(labelYTrans); - m_dummyRenderItem.setTranslation(labelTransBack); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, totalBackRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, backAlignment, false, - drawSelection); - - // Side wall - labelTransSide.setY(labelYTrans); - m_dummyRenderItem.setTranslation(labelTransSide); - m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionZComp, totalSideRotation, 0, m_cachedSelectionMode, - shader, m_labelObj, activeCamera, - true, true, Drawer::LabelMid, sideAlignment, false, - drawSelection); - labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); + if (drawSelection) { + QVector4D labelColor = QVector4D(0.0f, 0.0f, label / 255.0f, + alphaForValueSelection); + shader->setUniformValue(shader->color(), labelColor); } - labelNbr++; + + // Back wall + labelTransBack.setY(labelYTrans); + m_dummyRenderItem.setTranslation(labelTransBack); + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + positionZComp, totalBackRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, backAlignment, false, + drawSelection); + + // Side wall + labelTransSide.setY(labelYTrans); + m_dummyRenderItem.setTranslation(labelTransSide); + m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, + positionZComp, totalSideRotation, 0, m_cachedSelectionMode, + shader, m_labelObj, activeCamera, + true, true, Drawer::LabelMid, sideAlignment, false, + drawSelection); + labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheY.isTitleVisible()) { drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, -- cgit v1.2.3 From bda4432c80fd340a3d75ba077830ed93724fd9f1 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 28 May 2014 09:23:54 +0300 Subject: Implement binary search for determining surface sample space MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3066 Change-Id: I3a6d727c528e37e914aa1c3f08ee6d268a2c5230 Reviewed-by: Tomi Korpipää --- .../doc/src/qtdatavisualization.qdoc | 44 +++--- src/datavisualization/engine/surface3drenderer.cpp | 147 +++++++++++---------- src/datavisualization/engine/surface3drenderer_p.h | 6 - tests/surfacetest/graphmodifier.cpp | 56 ++++++++ tests/surfacetest/graphmodifier.h | 2 + tests/surfacetest/main.cpp | 14 ++ 6 files changed, 176 insertions(+), 93 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index cdbd4e4b..c3196dee 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -238,9 +238,18 @@ and which role specifies the value of the item. When the proxy resolves the data from the model, it uses these mappings to generate the rows and columns of the bar graph. + Often the item models will have a single role that contains information you want to map to + multiple values. A typical example of this is a timestamp field when generating a bar graph + with two time related axes, for example years and months. To enable mapping a single item + model role to more than one data field, pattern matching and replacing mechanism is provided + by item model proxies. You can also use this mechanism to reformat data even in one-to-one + mapping cases. + Depending on the visualization type, proxies may support other functionalities as well, such as QItemModelBarDataProxy optionally mapping QAbstractItemModel rows and columns directly - into bar graph rows and columns. See individual proxy classes for more information and examples + into bar graph rows and columns. + + See individual proxy classes for more information and examples about how to use them: QItemModelBarDataProxy, QItemModelScatterDataProxy, and QItemModelSurfaceDataProxy. @@ -257,28 +266,27 @@ When you have a data set that updates rapidly, it is important to handle data properly to ensure good performance. Since memory allocation is a costly operation, always use - QList::reserve() and QVector::resize() where possible to avoid reallocations when constructing - the array to give to the proxy. If you need to change the entire data set for each frame, - it is in most cases best to reuse the existing array - especially if the array dimensions do not - change. If you need to add, insert, remove, or change several rows or items for each frame, it - is always more efficient to do it with one method call instead of multiple calls affecting - a single row or item each. For example, adding ten rows with a single QBarDataProxy::addRows() call - is much more efficient than ten separate QBarDataProxy::addRow() calls. - - Bars renderer is optimized to access only data that is within the data window and thus should not - suffer noticeable slowdown even if more data is continually added to the proxy. + QList::reserve() and QVector::resize() where possible to avoid unnecessary reallocations when + constructing the array to give to the proxy. If you need to change the entire data set + for each frame, it is in most cases best to reuse the existing array - especially if the + array dimensions do not change. If you need to add, insert, remove, or change several + rows or items for each frame, it is always more efficient to do it with one method call + instead of multiple calls affecting a single row or item each. For example, adding ten + rows with a single QBarDataProxy::addRows() call is much more efficient than ten + separate QBarDataProxy::addRow() calls. + + Bars renderer is optimized to access only data that is within the data window and thus + should not suffer noticeable slowdown even if more data is continually added to the proxy. Due to the unsorted nature of the scatter data, any change in the data window ranges requires all data points to be checked for visibility, which can cause increasing slowdown if data is - continually added to the proxy. + continually added to the proxy. For the best performance with the scatter graphs, only keep + the data you need in the proxy. Surface data, while on item level similar to scatter data, is already assigned into rows and - columns, so the surface renderer can do some optimization by making the assumption that the data in - rows and columns is sorted along their respective axes, but it is nowhere near as efficient - as in the bars case. Surface rendering can suffer significant slowdown if the data size grows unchecked. - - For the best performance with the scatter and surface graphs, only keep the data you need in the - proxy. + columns, so the surface renderer can optimize drawing by making the assumption that + the data in the rows and columns is sorted along their respective axes. It is not quite as + efficient as in the bars case, but nearly so. */ /*! diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 6fc0aec1..ea750c78 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -68,12 +68,6 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) m_scaleZ(0.0f), m_scaleXWithBackground(0.0f), m_scaleZWithBackground(0.0f), - m_minVisibleColumnValue(0.0f), - m_maxVisibleColumnValue(0.0f), - m_minVisibleRowValue(0.0f), - m_maxVisibleRowValue(0.0f), - m_visibleColumnRange(0.0f), - m_visibleRowRange(0.0f), m_depthTexture(0), m_depthModelTexture(0), m_depthFrameBuffer(0), @@ -561,43 +555,78 @@ void Surface3DRenderer::updateSliceObject(SurfaceSeriesRenderCache *cache, const } } +inline static float getDataValue(const QSurfaceDataArray &array, bool searchRow, int index) +{ + if (searchRow) + return array.at(0)->at(index).x(); + else + return array.at(index)->at(0).z(); +} + +inline static int binarySearchArray(const QSurfaceDataArray &array, int maxIdx, float limitValue, + bool searchRow, bool lowBound, bool ascending) +{ + int min = 0; + int max = maxIdx; + int mid = 0; + int retVal; + while (max >= min) { + mid = (min + max) / 2; + float arrayValue = getDataValue(array, searchRow, mid); + if (arrayValue == limitValue) + return mid; + if (ascending) { + if (arrayValue < limitValue) + min = mid + 1; + else + max = mid - 1; + } else { + if (arrayValue > limitValue) + min = mid + 1; + else + max = mid - 1; + } + } + + // Exact match not found, return closest depending on bound. + // The boundary is between last mid and min/max. + if (lowBound == ascending) { + if (mid > max) + retVal = mid; + else + retVal = min; + } else { + if (mid > max) + retVal = max; + else + retVal = mid; + } + if (retVal < 0 || retVal > maxIdx) { + retVal = -1; + } else if (lowBound) { + if (getDataValue(array, searchRow, retVal) < limitValue) + retVal = -1; + } else { + if (getDataValue(array, searchRow, retVal) > limitValue) + retVal = -1; + } + return retVal; +} + QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) { QRect sampleSpace; - const int rowCount = array.size(); - const int columnCount = array.at(0)->size(); - - const float axisMinX = m_axisCacheX.min(); - const float axisMaxX = m_axisCacheX.max(); - const float axisMinZ = m_axisCacheZ.min(); - const float axisMaxZ = m_axisCacheZ.max(); + const int maxRow = array.size() - 1; + const int maxColumn = array.at(0)->size() - 1; // We assume data is ordered sequentially in rows for X-value and in columns for Z-value. // Determine if data is ascending or descending in each case. - const bool ascendingX = array.at(0)->at(0).x() < array.at(0)->at(columnCount - 1).x(); - const bool ascendingZ = array.at(0)->at(0).z() < array.at(rowCount - 1)->at(0).z(); - - const int minCol = ascendingX ? 0 : columnCount - 1; - const int maxCol = ascendingX ? columnCount - 1 : 0; - const int colStep = ascendingX ? 1 : -1; - const int minRow = ascendingZ ? 0 : rowCount - 1; - const int maxRow = ascendingZ ? rowCount - 1 : 0; - const int rowStep = ascendingZ ? 1 : -1; - - bool found = false; - int idx = 0; - int i = 0; - // m_minVisibleColumnValue - for (i = 0, idx = minCol, found = false; i < columnCount; i++) { - if (array.at(0)->at(idx).x() >= axisMinX) { - found = true; - break; - } - idx += colStep; - } - if (found) { - m_minVisibleColumnValue = array.at(0)->at(idx).x(); + const bool ascendingX = array.at(0)->at(0).x() < array.at(0)->at(maxColumn).x(); + const bool ascendingZ = array.at(0)->at(0).z() < array.at(maxRow)->at(0).z(); + + int idx = binarySearchArray(array, maxColumn, m_axisCacheX.min(), true, true, ascendingX); + if (idx != -1) { if (ascendingX) sampleSpace.setLeft(idx); else @@ -607,16 +636,8 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) return sampleSpace; } - // m_maxVisibleColumnValue - for (i = 0, idx = maxCol, found = false; i < columnCount; i++) { - if (array.at(0)->at(idx).x() <= axisMaxX) { - found = true; - break; - } - idx -= colStep; - } - if (found) { - m_maxVisibleColumnValue = array.at(0)->at(idx).x(); + idx = binarySearchArray(array, maxColumn, m_axisCacheX.max(), true, false, ascendingX); + if (idx != -1) { if (ascendingX) sampleSpace.setRight(idx); else @@ -626,16 +647,8 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) return sampleSpace; } - // m_minVisibleRowValue - for (i = 0, idx = minRow, found = false; i < rowCount; i++) { - if (array.at(idx)->at(0).z() >= axisMinZ) { - found = true; - break; - } - idx += rowStep; - } - if (found) { - m_minVisibleRowValue = array.at(idx)->at(0).z(); + idx = binarySearchArray(array, maxRow, m_axisCacheZ.min(), false, true, ascendingZ); + if (idx != -1) { if (ascendingZ) sampleSpace.setTop(idx); else @@ -645,16 +658,8 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) return sampleSpace; } - // m_maxVisibleRowValue - for (i = 0, idx = maxRow, found = false; i < rowCount; i++) { - if (array.at(idx)->at(0).z() <= axisMaxZ) { - found = true; - break; - } - idx -= rowStep; - } - if (found) { - m_maxVisibleRowValue = array.at(idx)->at(0).z(); + idx = binarySearchArray(array, maxRow, m_axisCacheZ.max(), false, false, ascendingZ); + if (idx != -1) { if (ascendingZ) sampleSpace.setBottom(idx); else @@ -664,9 +669,6 @@ QRect Surface3DRenderer::calculateSampleRect(const QSurfaceDataArray &array) return sampleSpace; } - m_visibleColumnRange = m_maxVisibleColumnValue - m_minVisibleColumnValue; - m_visibleRowRange = m_maxVisibleRowValue - m_minVisibleRowValue; - return sampleSpace; } @@ -2203,11 +2205,18 @@ void Surface3DRenderer::updateSelectionTextures() void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache, uint &lastSelectionId) { + // Create the selection ID image. Each grid corner gets 2x2 pixel area of // ID color so that each vertex (data point) has 4x4 pixel area of ID color const QRect &sampleSpace = cache->sampleSpace(); int idImageWidth = (sampleSpace.width() - 1) * 4; int idImageHeight = (sampleSpace.height() - 1) * 4; + + if (idImageHeight < 0 || idImageWidth < 0) { + cache->setSelectionIdRange(-1, -1); + return; + } + int stride = idImageWidth * 4 * sizeof(uchar); // 4 = number of color components (rgba) uint idStart = lastSelectionId; diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 9af3f47d..0c286136 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -67,12 +67,6 @@ private: GLfloat m_scaleZ; GLfloat m_scaleXWithBackground; GLfloat m_scaleZWithBackground; - GLfloat m_minVisibleColumnValue; - GLfloat m_maxVisibleColumnValue; - GLfloat m_minVisibleRowValue; - GLfloat m_maxVisibleRowValue; - GLfloat m_visibleColumnRange; - GLfloat m_visibleRowRange; GLuint m_depthTexture; GLuint m_depthModelTexture; GLuint m_depthFrameBuffer; diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 13cf9fad..ed86f03c 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -721,6 +721,62 @@ void GraphModifier::toggleAxisTitleFixed(bool enabled) m_graph->axisZ()->setTitleFixed(enabled); } +void GraphModifier::toggleXAscending(bool enabled) +{ + // Flip data array contents if necessary + foreach (QSurface3DSeries *series, m_graph->seriesList()) { + QSurfaceDataArray *array = const_cast(series->dataProxy()->array()); + const int rowCount = array->size(); + const int columnCount = array->at(0)->size(); + const bool dataAscending = array->at(0)->at(0).x() < array->at(0)->at(columnCount - 1).x(); + if (dataAscending != enabled) { + // Create new array of equal size + QSurfaceDataArray *newArray = new QSurfaceDataArray; + newArray->reserve(rowCount); + for (int i = 0; i < rowCount; i++) + newArray->append(new QSurfaceDataRow(columnCount)); + + // Flip each row + for (int i = 0; i < rowCount; i++) { + QSurfaceDataRow *oldRow = array->at(i); + QSurfaceDataRow *newRow = newArray->at(i); + for (int j = 0; j < columnCount; j++) + (*newRow)[j] = oldRow->at(columnCount - 1 - j); + } + + series->dataProxy()->resetArray(newArray); + } + } +} + +void GraphModifier::toggleZAscending(bool enabled) +{ + // Flip data array contents if necessary + foreach (QSurface3DSeries *series, m_graph->seriesList()) { + QSurfaceDataArray *array = const_cast(series->dataProxy()->array()); + const int rowCount = array->size(); + const int columnCount = array->at(0)->size(); + const bool dataAscending = array->at(0)->at(0).z() < array->at(rowCount - 1)->at(0).z(); + if (dataAscending != enabled) { + // Create new array of equal size + QSurfaceDataArray *newArray = new QSurfaceDataArray; + newArray->reserve(rowCount); + for (int i = 0; i < rowCount; i++) + newArray->append(new QSurfaceDataRow(columnCount)); + + // Flip each column + for (int i = 0; i < rowCount; i++) { + QSurfaceDataRow *oldRow = array->at(rowCount - 1 - i); + QSurfaceDataRow *newRow = newArray->at(i); + for (int j = 0; j < columnCount; j++) + (*newRow)[j] = oldRow->at(j); + } + + series->dataProxy()->resetArray(newArray); + } + } +} + void GraphModifier::resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, float maxX) { m_axisMinSliderX->setValue(minX); diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index 1cf13b97..5f1a252a 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -129,6 +129,8 @@ public slots: void changeLabelRotation(int rotation); void toggleAxisTitleVisibility(bool enabled); void toggleAxisTitleFixed(bool enabled); + void toggleXAscending(bool enabled); + void toggleZAscending(bool enabled); private: void fillSeries(); diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 0b146678..5806d7b0 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -385,6 +385,14 @@ int main(int argc, char *argv[]) axisLabelRotationSlider->setValue(0); axisLabelRotationSlider->setMaximum(90); + QCheckBox *xAscendingCB = new QCheckBox(widget); + xAscendingCB->setText(QStringLiteral("X Ascending")); + xAscendingCB->setChecked(true); + + QCheckBox *zAscendingCB = new QCheckBox(widget); + zAscendingCB->setText(QStringLiteral("Z Ascending")); + zAscendingCB->setChecked(true); + // Add controls to the layout #ifdef MULTI_SERIES vLayout->addWidget(series1CB); @@ -433,6 +441,8 @@ int main(int argc, char *argv[]) vLayout->addWidget(axisMinSliderX); vLayout->addWidget(axisMinSliderY); vLayout->addWidget(axisMinSliderZ); + vLayout->addWidget(xAscendingCB); + vLayout->addWidget(zAscendingCB); vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); vLayout2->addWidget(fontList); vLayout2->addWidget(labelButton); @@ -636,6 +646,10 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::toggleAxisTitleFixed); QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier, &GraphModifier::changeLabelRotation); + QObject::connect(xAscendingCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleXAscending); + QObject::connect(zAscendingCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleZAscending); QObject::connect(aspectRatioSlider, &QSlider::valueChanged, modifier, &GraphModifier::setAspectRatio); -- cgit v1.2.3 From f1d7a4679711734b74538be649567d0826278920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 28 May 2014 13:49:15 +0300 Subject: Added CustomLabelItem Task-number: QTRD-3135 Change-Id: Ie13c7ab5cbfca2eef88ed4ca17eaf46f2aeb4788 Reviewed-by: Miikka Heikkinen --- .../customitems/customitemgraph.cpp | 40 ++- src/datavisualization/data/customrenderitem_p.h | 6 +- src/datavisualization/data/data.pri | 7 +- src/datavisualization/data/qcustom3ditem.cpp | 34 +- src/datavisualization/data/qcustom3ditem.h | 2 + src/datavisualization/data/qcustom3ditem_p.h | 8 +- src/datavisualization/data/qcustom3dlabel.cpp | 358 +++++++++++++++++++++ src/datavisualization/data/qcustom3dlabel.h | 93 ++++++ src/datavisualization/data/qcustom3dlabel_p.h | 73 +++++ .../engine/abstract3drenderer.cpp | 100 +++++- src/datavisualization/engine/bars3drenderer.cpp | 2 +- .../datavisualizationqml2_plugin.cpp | 5 +- .../datavisualizationqml2_plugin.h | 2 + tests/qmlcamera/qml/qmlcamera/main.qml | 11 +- 14 files changed, 705 insertions(+), 36 deletions(-) create mode 100644 src/datavisualization/data/qcustom3dlabel.cpp create mode 100644 src/datavisualization/data/qcustom3dlabel.h create mode 100644 src/datavisualization/data/qcustom3dlabel_p.h diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index ca6a46ef..07ee1b9a 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -20,6 +20,7 @@ #include #include +#include #include using namespace QtDataVisualization; @@ -97,6 +98,17 @@ CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label) m_selectionAnimation->setPropertyName("scaling"); m_selectionAnimation->setDuration(500); m_selectionAnimation->setLoopCount(-1); + + QFont titleFont = QFont("Century Gothic", 30); + titleFont.setBold(true); + QCustom3DLabel *titleLabel = new QCustom3DLabel("Oil Rigs on Imaginary Sea", titleFont, + QVector3D(0.0f, 1.2f, 0.0f), + QVector3D(1.0f, 1.0f, 0.0f), + QQuaternion()); + titleLabel->setPositionAbsolute(true); + titleLabel->setFacingCamera(true); + titleLabel->setBackgroundColor(QColor(0x66cdaa)); + m_graph->addCustomItem(titleLabel); } CustomItemGraph::~CustomItemGraph() @@ -110,6 +122,7 @@ void CustomItemGraph::toggleItemOne(bool show) QVector3D positionOne = QVector3D(39.0f, 77.0f, 19.2f); //! [1] QVector3D positionOnePipe = QVector3D(39.0f, 45.0f, 19.2f); + QVector3D positionOneLabel = QVector3D(39.0f, 107.0f, 19.2f); if (show) { //! [0] QImage color = QImage(2, 2, QImage::Format_RGB32); @@ -130,12 +143,19 @@ void CustomItemGraph::toggleItemOne(bool show) color); item->setShadowCasting(false); m_graph->addCustomItem(item); + + QCustom3DLabel *label = new QCustom3DLabel(); + label->setText("Oil Rig One"); + label->setPosition(positionOneLabel); + label->setScaling(QVector3D(1.0f, 1.0f, 1.0f)); + m_graph->addCustomItem(label); } else { resetSelection(); //! [4] m_graph->removeCustomItemAt(positionOne); //! [4] m_graph->removeCustomItemAt(positionOnePipe); + m_graph->removeCustomItemAt(positionOneLabel); } } @@ -143,6 +163,7 @@ void CustomItemGraph::toggleItemTwo(bool show) { QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f); QVector3D positionTwoPipe = QVector3D(34.5f, 45.0f, 23.4f); + QVector3D positionTwoLabel = QVector3D(34.5f, 107.0f, 23.4f); if (show) { QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::red); @@ -159,16 +180,24 @@ void CustomItemGraph::toggleItemTwo(bool show) color); item->setShadowCasting(false); m_graph->addCustomItem(item); + + QCustom3DLabel *label = new QCustom3DLabel(); + label->setText("Oil Rig Two"); + label->setPosition(positionTwoLabel); + label->setScaling(QVector3D(1.0f, 1.0f, 1.0f)); + m_graph->addCustomItem(label); } else { resetSelection(); m_graph->removeCustomItemAt(positionTwo); m_graph->removeCustomItemAt(positionTwoPipe); + m_graph->removeCustomItemAt(positionTwoLabel); } } void CustomItemGraph::toggleItemThree(bool show) { QVector3D positionThree = QVector3D(34.5f, 86.0f, 19.1f); + QVector3D positionThreeLabel = QVector3D(34.5f, 116.0f, 19.1f); if (show) { QImage color = QImage(2, 2, QImage::Format_RGB32); color.fill(Qt::darkMagenta); @@ -179,9 +208,16 @@ void CustomItemGraph::toggleItemThree(bool show) item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f)); item->setTextureImage(color); m_graph->addCustomItem(item); + + QCustom3DLabel *label = new QCustom3DLabel(); + label->setText("Refinery"); + label->setPosition(positionThreeLabel); + label->setScaling(QVector3D(1.0f, 1.0f, 1.0f)); + m_graph->addCustomItem(label); } else { resetSelection(); m_graph->removeCustomItemAt(positionThree); + m_graph->removeCustomItemAt(positionThreeLabel); } } @@ -225,14 +261,14 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) if (type == QAbstract3DGraph::ElementCustomItem) { int index = m_graph->selectedCustomItemIndex(); QCustom3DItem *item = m_graph->selectedCustomItem(); - m_previouslyAnimatedItem = item; - m_previousScaling = item->scaling(); QString text; text.setNum(index); text.append(": "); QStringList split = item->meshFile().split("/"); text.append(split.last()); m_textField->setText(text); + m_previouslyAnimatedItem = item; + m_previousScaling = item->scaling(); m_selectionAnimation->setTargetObject(item); m_selectionAnimation->setStartValue(item->scaling()); m_selectionAnimation->setEndValue(item->scaling() * 1.5f); diff --git a/src/datavisualization/data/customrenderitem_p.h b/src/datavisualization/data/customrenderitem_p.h index 17195f7b..4fb94276 100644 --- a/src/datavisualization/data/customrenderitem_p.h +++ b/src/datavisualization/data/customrenderitem_p.h @@ -65,6 +65,8 @@ public: inline int index() const { return m_index; } inline void setShadowCasting(bool shadowCasting) { m_shadowCasting = shadowCasting; } inline bool isShadowCasting() const { return m_shadowCasting; } + inline void setFacingCamera(bool facing) { m_isFacingCamera = facing; } + inline bool isFacingCamera() const { return m_isFacingCamera; } inline void setRenderer(Abstract3DRenderer *renderer) { m_renderer = renderer; } private: @@ -80,10 +82,10 @@ private: bool m_valid; int m_index; bool m_shadowCasting; + bool m_isFacingCamera; QCustom3DItem *m_item; Abstract3DRenderer *m_renderer; - - }; +}; typedef QHash CustomRenderItemArray; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/data.pri b/src/datavisualization/data/data.pri index ca139984..73f398bf 100644 --- a/src/datavisualization/data/data.pri +++ b/src/datavisualization/data/data.pri @@ -39,7 +39,9 @@ HEADERS += \ $$PWD/qsurface3dseries_p.h \ $$PWD/customrenderitem_p.h \ $$PWD/qcustom3ditem.h \ - $$PWD/qcustom3ditem_p.h + $$PWD/qcustom3ditem_p.h \ + $$PWD/qcustom3dlabel.h \ + $$PWD/qcustom3dlabel_p.h SOURCES += \ $$PWD/labelitem.cpp \ @@ -66,4 +68,5 @@ SOURCES += \ $$PWD/qscatter3dseries.cpp \ $$PWD/qsurface3dseries.cpp \ $$PWD/customrenderitem.cpp \ - $$PWD/qcustom3ditem.cpp + $$PWD/qcustom3ditem.cpp \ + $$PWD/qcustom3dlabel.cpp diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index f1307d7a..17d17502 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -17,8 +17,6 @@ ****************************************************************************/ #include "qcustom3ditem_p.h" -#include "objecthelper_p.h" -#include "texturehelper_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -76,7 +74,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! \qmlproperty bool Custom3DItem::positionAbsolute * * This property dictates if item position is to be handled in data coordinates or in absolute - * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * coordinates. Defaults to \c{false}. Items with absolute coordinates will always be rendered, * whereas items with data coordinates are only rendered if they are within axis ranges. * * \sa position @@ -118,7 +116,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * Constructs QCustom3DItem with given \a parent. */ QCustom3DItem::QCustom3DItem(QObject *parent) : - d_ptr(new QCustom3DItemPrivate(this, parent)) + QObject(parent), + d_ptr(new QCustom3DItemPrivate(this)) +{ + setTextureImage(QImage()); +} + +/*! + * \internal + */ +QCustom3DItem::QCustom3DItem(QCustom3DItemPrivate *d, QObject *parent) : + QObject(parent), + d_ptr(d) { setTextureImage(QImage()); } @@ -130,7 +139,8 @@ QCustom3DItem::QCustom3DItem(QObject *parent) : QCustom3DItem::QCustom3DItem(const QString &meshFile, const QVector3D &position, const QVector3D &scaling, const QQuaternion &rotation, const QImage &texture, QObject *parent) : - d_ptr(new QCustom3DItemPrivate(this, meshFile, position, scaling, rotation, parent)) + QObject(parent), + d_ptr(new QCustom3DItemPrivate(this, meshFile, position, scaling, rotation)) { setTextureImage(texture); } @@ -192,7 +202,7 @@ QVector3D QCustom3DItem::position() const /*! \property QCustom3DItem::positionAbsolute * * This property dictates if item position is to be handled in data coordinates or in absolute - * coordinates. Defaults to \c{false}. Items with absolute cooridnates will always be rendered, + * coordinates. Defaults to \c{false}. Items with absolute coordinates will always be rendered, * whereas items with data coordinates are only rendered if they are within axis ranges. * * \sa position @@ -355,22 +365,21 @@ QString QCustom3DItem::textureFile() const return d_ptr->m_textureFile; } -QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent) : - QObject(parent), +QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q) : q_ptr(q), m_position(QVector3D(0.0f, 0.0f, 0.0f)), m_positionAbsolute(false), m_scaling(QVector3D(0.1f, 0.1f, 0.1f)), m_rotation(QQuaternion(0.0f, 0.0f, 0.0f, 0.0f)), m_visible(true), - m_shadowCasting(true) + m_shadowCasting(true), + m_isLabelItem(false) { } QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &meshFile, const QVector3D &position, const QVector3D &scaling, - const QQuaternion &rotation, QObject *parent) : - QObject(parent), + const QQuaternion &rotation) : q_ptr(q), m_meshFile(meshFile), m_position(position), @@ -378,7 +387,8 @@ QCustom3DItemPrivate::QCustom3DItemPrivate(QCustom3DItem *q, const QString &mesh m_scaling(scaling), m_rotation(rotation), m_visible(true), - m_shadowCasting(true) + m_shadowCasting(true), + m_isLabelItem(false) { } diff --git a/src/datavisualization/data/qcustom3ditem.h b/src/datavisualization/data/qcustom3ditem.h index 53ec0bcf..2f7f37cf 100644 --- a/src/datavisualization/data/qcustom3ditem.h +++ b/src/datavisualization/data/qcustom3ditem.h @@ -86,6 +86,8 @@ signals: void shadowCastingChanged(bool shadowCasting); protected: + QCustom3DItem(QCustom3DItemPrivate *d, QObject *parent = 0); + QScopedPointer d_ptr; private: diff --git a/src/datavisualization/data/qcustom3ditem_p.h b/src/datavisualization/data/qcustom3ditem_p.h index 3e807df3..c1ce5996 100644 --- a/src/datavisualization/data/qcustom3ditem_p.h +++ b/src/datavisualization/data/qcustom3ditem_p.h @@ -60,9 +60,9 @@ class QCustom3DItemPrivate : public QObject { Q_OBJECT public: - QCustom3DItemPrivate(QCustom3DItem *q, QObject *parent); + QCustom3DItemPrivate(QCustom3DItem *q); QCustom3DItemPrivate(QCustom3DItem *q, const QString &meshFile, const QVector3D &position, - const QVector3D &scaling, const QQuaternion &rotation, QObject *parent); + const QVector3D &scaling, const QQuaternion &rotation); virtual ~QCustom3DItemPrivate(); QImage textureImage(); @@ -81,12 +81,16 @@ public: bool m_visible; bool m_shadowCasting; + bool m_isLabelItem; + QCustomItemDirtyBitField m_dirtyBits; signals: void needUpdate(); private: + QCustom3DItemPrivate(QCustom3DItemPrivate *d); + friend class QCustom3DItem; }; diff --git a/src/datavisualization/data/qcustom3dlabel.cpp b/src/datavisualization/data/qcustom3dlabel.cpp new file mode 100644 index 00000000..585f4f35 --- /dev/null +++ b/src/datavisualization/data/qcustom3dlabel.cpp @@ -0,0 +1,358 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "qcustom3dlabel_p.h" +#include "utils_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +/*! + * \class QCustom3DLabel + * \inmodule QtDataVisualization + * \brief The QCustom3DLabel class is for creating custom labels to be added to a graph. + * \since Qt Data Visualization 1.1 + * + * This class is for creating custom labels to be added to a graph. You can set text, font, + * position, scaling, rotation, and colors. You can also toggle borders and background for the + * label. Colors, borders and background are used from active theme unless any of them is set + * explicitly. + * + * \note In scaling, z has no effect. Setting the same x and y retains the original + * font dimensions. + * + * \sa QAbstract3DGraph::addCustomItem() + */ + +/*! + * \qmltype Custom3DLabel + * \inqmlmodule QtDataVisualization + * \since QtDataVisualization 1.1 + * \ingroup datavisualization_qml + * \instantiates QCustom3DLabel + * \brief The Custom3DLabel type is for creating custom labels to be added to a graph. + * + * This type is for creating custom labels to be added to a graph. You can set text, font, + * position, scaling, rotation, and colors. You can also toggle borders and background for the + * label. Colors, borders and background are used from active theme unless any of them is set + * explicitly. + * + * \note In scaling, z has no effect. Setting the same x and y retains the original + * font dimensions. + */ + +/*! \qmlproperty string Custom3DLabel::text + * + * The text for the label. Rich text is not supported. + */ + +/*! \qmlproperty font Custom3DLabel::font + * + * The font to be used for the label. Defaults to \c{Font {family: "Arial"; pointSize: 20}}. + * Special formatting (for example outlined) is not supported. + */ + +/*! \qmlproperty color Custom3DLabel::textColor + * + * Color for the label text. Also affects label border, if enabled. Defaults to \c{"white"}. + * + * \sa borderEnabled + */ + +/*! \qmlproperty color Custom3DLabel::backgroundColor + * + * Color for the label background, if enabled. Defaults to \c{"gray"}. + * + * \sa backgroundEnabled + */ + +/*! \qmlproperty bool Custom3DLabel::backgroundEnabled + * + * Enable label background. If set to \c{false}, backgroundColor has no effect. Defaults + * to \c{true}. + */ + +/*! \qmlproperty bool Custom3DLabel::borderEnabled + * + * Enable label borders. Defaults to \c{true}. + */ + +/*! \qmlproperty bool Custom3DLabel::facingCamera + * + * Forces the label to face camera always. Defaults to \c{false}. If set to \c{true}, rotation() + * has no effect. + */ + +/*! + * Constructs QCustom3DLabel with given \a parent. + */ +QCustom3DLabel::QCustom3DLabel(QObject *parent) : + QCustom3DItem(new QCustom3DLabelPrivate(this), parent) +{ +} + +/*! + * Constructs QCustom3DLabel with given \a text, \a font, \a position, \a scaling, + * \a rotation, and optional \a parent. + * + * \note Setting the same x and y for \a scaling retains the original font dimensions. + */ +QCustom3DLabel::QCustom3DLabel(const QString &text, const QFont &font, + const QVector3D &position, const QVector3D &scaling, + const QQuaternion &rotation, QObject *parent) : + QCustom3DItem(new QCustom3DLabelPrivate(this, text, font, position, scaling, rotation), + parent) +{ +} + +/*! + * Destroys QCustom3DLabel. + */ +QCustom3DLabel::~QCustom3DLabel() +{ +} + +/*! \property QCustom3DLabel::text + * + * The text for the label. Rich text is not supported. + */ +void QCustom3DLabel::setText(const QString &text) +{ + if (dptr()->m_text != text) { + dptr()->m_text = text; + dptr()->handleTextureChange(); + emit textChanged(text); + emit dptr()->needUpdate(); + } +} + +QString QCustom3DLabel::text() const +{ + return dptrc()->m_text; +} + +/*! \property QCustom3DLabel::font + * + * The font to be used for the label. Defaults to \c{QFont("Arial", 20)}. Special formatting + * (for example outlined) is not supported. + */ +void QCustom3DLabel::setFont(const QFont &font) +{ + if (dptr()->m_font != font) { + dptr()->m_font = font; + dptr()->handleTextureChange(); + emit fontChanged(font); + emit dptr()->needUpdate(); + } +} + +QFont QCustom3DLabel::font() const +{ + return dptrc()->m_font; +} + +/*! \property QCustom3DLabel::textColor + * + * Color for the label text. Also affects label border, if enabled. Defaults to \c{Qt::white}. + * + * \sa borderEnabled + */ +void QCustom3DLabel::setTextColor(const QColor &color) +{ + if (dptr()->m_txtColor != color) { + dptr()->m_txtColor = color; + dptr()->m_customVisuals = true; + dptr()->handleTextureChange(); + emit textColorChanged(color); + emit dptr()->needUpdate(); + } +} + +QColor QCustom3DLabel::textColor() const +{ + return dptrc()->m_txtColor; +} + +/*! \property QCustom3DLabel::backgroundColor + * + * Color for the label background, if enabled. Defaults to \c{Qt::gray}. + * + * \sa backgroundEnabled + */ +void QCustom3DLabel::setBackgroundColor(const QColor &color) +{ + if (dptr()->m_bgrColor != color) { + dptr()->m_bgrColor = color; + dptr()->m_customVisuals = true; + dptr()->handleTextureChange(); + emit backgroundColorChanged(color); + emit dptr()->needUpdate(); + } +} + +QColor QCustom3DLabel::backgroundColor() const +{ + return dptrc()->m_bgrColor; +} + +/*! \property QCustom3DLabel::borderEnabled + * + * Enable label borders. Defaults to \c{true}. + */ +void QCustom3DLabel::setBorderEnabled(bool enabled) +{ + if (dptr()->m_borders != enabled) { + dptr()->m_borders = enabled; + dptr()->m_customVisuals = true; + dptr()->handleTextureChange(); + emit borderEnabledChanged(enabled); + emit dptr()->needUpdate(); + } +} + +bool QCustom3DLabel::isBorderEnabled() const +{ + return dptrc()->m_borders; +} + +/*! \property QCustom3DLabel::backgroundEnabled + * + * Enable label background. If set to \c{false}, backgroundColor() has no effect. Defaults + * to \c{true}. + */ +void QCustom3DLabel::setBackgroundEnabled(bool enabled) +{ + if (dptr()->m_background != enabled) { + dptr()->m_background = enabled; + dptr()->m_customVisuals = true; + dptr()->handleTextureChange(); + emit backgroundEnabledChanged(enabled); + emit dptr()->needUpdate(); + } +} + +bool QCustom3DLabel::isBackgroundEnabled() const +{ + return dptrc()->m_background; +} + +/*! \property QCustom3DLabel::facingCamera + * + * Forces the label to face camera always. Defaults to \c{false}. If set to \c{true}, rotation() + * has no effect. + */ +void QCustom3DLabel::setFacingCamera(bool enabled) +{ + if (dptr()->m_facingCamera != enabled) { + dptr()->m_facingCamera = enabled; + dptr()->m_facingCameraDirty = true; + emit facingCameraChanged(enabled); + emit dptr()->needUpdate(); + } +} + +bool QCustom3DLabel::isFacingCamera() const +{ + return dptrc()->m_facingCamera; +} + +/*! + * \internal + */ +QCustom3DLabelPrivate *QCustom3DLabel::dptr() +{ + return static_cast(d_ptr.data()); +} + +/*! + * \internal + */ +const QCustom3DLabelPrivate *QCustom3DLabel::dptrc() const +{ + return static_cast(d_ptr.data()); +} + +QCustom3DLabelPrivate::QCustom3DLabelPrivate(QCustom3DLabel *q) : + QCustom3DItemPrivate(q), + m_font(QFont(QStringLiteral("Arial"), 20)), + m_bgrColor(Qt::gray), + m_txtColor(Qt::white), + m_background(true), + m_borders(true), + m_facingCamera(false), + m_customVisuals(false), + m_facingCameraDirty(false) +{ + m_isLabelItem = true; + m_shadowCasting = false; + m_meshFile = QStringLiteral(":/defaultMeshes/plane"); + createTextureImage(); +} + +QCustom3DLabelPrivate::QCustom3DLabelPrivate(QCustom3DLabel *q, const QString &text, + const QFont &font, const QVector3D &position, + const QVector3D &scaling, + const QQuaternion &rotation) : + QCustom3DItemPrivate(q, QStringLiteral(":/defaultMeshes/plane"), position, scaling, rotation), + m_text(text), + m_font(font), + m_bgrColor(Qt::gray), + m_txtColor(Qt::white), + m_background(true), + m_borders(true), + m_facingCamera(false), + m_customVisuals(false), + m_facingCameraDirty(false) +{ + m_isLabelItem = true; + m_shadowCasting = false; + createTextureImage(); +} + +QCustom3DLabelPrivate::~QCustom3DLabelPrivate() +{ +} + +void QCustom3DLabelPrivate::resetDirtyBits() +{ + QCustom3DItemPrivate::resetDirtyBits(); + m_facingCameraDirty = false; +} + +void QCustom3DLabelPrivate::createTextureImage() +{ + createTextureImage(m_bgrColor, m_txtColor, m_background, m_borders); +} + +void QCustom3DLabelPrivate::createTextureImage(const QColor &bgrColor, const QColor &txtColor, + bool background, bool borders) +{ + m_textureImage = Utils::printTextToImage(m_font, m_text, bgrColor, txtColor, background, + borders, 0); +} + +void QCustom3DLabelPrivate::handleTextureChange() +{ + createTextureImage(); + m_dirtyBits.textureDirty = true; + if (!m_textureFile.isEmpty()) { + m_textureFile.clear(); + emit q_ptr->textureFileChanged(m_textureFile); + } +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qcustom3dlabel.h b/src/datavisualization/data/qcustom3dlabel.h new file mode 100644 index 00000000..f42ee378 --- /dev/null +++ b/src/datavisualization/data/qcustom3dlabel.h @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef QCUSTOMLABELITEM_H +#define QCUSTOMLABELITEM_H + +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QCustom3DLabelPrivate; + +class QT_DATAVISUALIZATION_EXPORT QCustom3DLabel : public QCustom3DItem +{ + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor NOTIFY textColorChanged) + Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged) + Q_PROPERTY(bool borderEnabled READ isBorderEnabled WRITE setBorderEnabled NOTIFY borderEnabledChanged) + Q_PROPERTY(bool backgroundEnabled READ isBackgroundEnabled WRITE setBackgroundEnabled NOTIFY backgroundEnabledChanged) + Q_PROPERTY(bool facingCamera READ isFacingCamera WRITE setFacingCamera NOTIFY facingCameraChanged) + +public: + explicit QCustom3DLabel(QObject *parent = 0); + explicit QCustom3DLabel(const QString &text, const QFont &font, const QVector3D &position, + const QVector3D &scaling, const QQuaternion &rotation, + QObject *parent = 0); + virtual ~QCustom3DLabel(); + + void setText(const QString &text); + QString text() const; + + void setFont(const QFont &font); + QFont font() const; + + void setTextColor(const QColor &color); + QColor textColor() const; + + void setBackgroundColor(const QColor &color); + QColor backgroundColor() const; + + void setBorderEnabled(bool enabled); + bool isBorderEnabled() const; + + void setBackgroundEnabled(bool enabled); + bool isBackgroundEnabled() const; + + void setFacingCamera(bool enabled); + bool isFacingCamera() const; + +signals: + void textChanged(const QString &text); + void fontChanged(const QFont &font); + void textColorChanged(const QColor &color); + void backgroundColorChanged(const QColor &color); + void borderEnabledChanged(bool enabled); + void backgroundEnabledChanged(bool enabled); + void facingCameraChanged(bool enabled); + +protected: + QCustom3DLabelPrivate *dptr(); + const QCustom3DLabelPrivate *dptrc() const; + +private: + Q_DISABLE_COPY(QCustom3DLabel) + + friend class Abstract3DRenderer; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/data/qcustom3dlabel_p.h b/src/datavisualization/data/qcustom3dlabel_p.h new file mode 100644 index 00000000..0bb0e017 --- /dev/null +++ b/src/datavisualization/data/qcustom3dlabel_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef QCUSTOMLABELITEM_P_H +#define QCUSTOMLABELITEM_P_H + +#include "qcustom3dlabel.h" +#include "qcustom3ditem_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class QCustom3DLabelPrivate : public QCustom3DItemPrivate +{ + Q_OBJECT + +public: + QCustom3DLabelPrivate(QCustom3DLabel *q); + QCustom3DLabelPrivate(QCustom3DLabel *q, const QString &text, const QFont &font, + const QVector3D &position, const QVector3D &scaling, + const QQuaternion &rotation); + virtual ~QCustom3DLabelPrivate(); + + void resetDirtyBits(); + void createTextureImage(); + void createTextureImage(const QColor &bgrColor, const QColor &txtColor, bool background, + bool borders); + void handleTextureChange(); + +public: + QString m_text; + QFont m_font; + QColor m_bgrColor; + QColor m_txtColor; + bool m_background; + bool m_borders; + bool m_facingCamera; + + bool m_customVisuals; + + bool m_facingCameraDirty; + +private: + friend class QCustom3DLabel; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index cd03073d..0f9109db 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -29,6 +29,7 @@ #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" #include "qcustom3ditem_p.h" +#include "qcustom3dlabel_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -315,7 +316,7 @@ void Abstract3DRenderer::calculateZoomLevel() GLfloat zoomAdjustment; div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f } @@ -844,11 +845,33 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setRenderer(this); newItem->setItemPointer(item); // Store pointer for render item updates newItem->setMesh(item->meshFile()); - newItem->setScaling(item->scaling()); + QVector3D scaling = item->scaling(); + QImage textureImage = item->d_ptr->textureImage(); + bool facingCamera = false; + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + float pointSize = labelItem->font().pointSizeF(); + // Check do we have custom visuals or need to use theme + if (!labelItem->dptr()->m_customVisuals) { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + pointSize = m_cachedTheme->font().pointSizeF(); + textureImage = item->d_ptr->textureImage(); + } + // Calculate scaling based on text (texture size), font size and asked scaling + float scaledFontSize = (0.05f + pointSize / 500.0f) / float(textureImage.height()); + scaling.setX(scaling.x() * textureImage.width() * scaledFontSize); + scaling.setY(scaling.y() * textureImage.height() * scaledFontSize); + // Check if facing camera + facingCamera = labelItem->isFacingCamera(); + } + newItem->setScaling(scaling); + newItem->setRotation(item->rotation()); newItem->setPosition(item->position()); newItem->setPositionAbsolute(item->isPositionAbsolute()); - newItem->setRotation(item->rotation()); - QImage textureImage = item->d_ptr->textureImage(); newItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint texture = m_textureHelper->create2DTexture(textureImage, true, true, true); newItem->setTexture(texture); @@ -858,6 +881,7 @@ CustomRenderItem *Abstract3DRenderer::addCustomItem(QCustom3DItem *item) newItem->setTranslation(translation); newItem->setVisible(item->isVisible()); newItem->setShadowCasting(item->isShadowCasting()); + newItem->setFacingCamera(facingCamera); m_customRenderCache.insert(item, newItem); return newItem; } @@ -870,7 +894,31 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) item->d_ptr->m_dirtyBits.meshDirty = false; } if (item->d_ptr->m_dirtyBits.scalingDirty) { - renderItem->setScaling(item->scaling()); + QVector3D scaling = item->scaling(); + // In case we have label item, we need to recreate texture for scaling adjustment + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + float pointSize = labelItem->font().pointSizeF(); + // Check do we have custom visuals or need to use theme + if (labelItem->dptr()->m_customVisuals) { + // Recreate texture + labelItem->dptr()->createTextureImage(); + } else { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + pointSize = m_cachedTheme->font().pointSizeF(); + } + QImage textureImage = item->d_ptr->textureImage(); + // Calculate scaling based on text (texture size), font size and asked scaling + float scaledFontSize = (0.05f + pointSize / 500.0f) / float(textureImage.height()); + scaling.setX(scaling.x() * textureImage.width() * scaledFontSize); + scaling.setY(scaling.y() * textureImage.height() * scaledFontSize); + item->d_ptr->clearTextureImage(); + } + renderItem->setScaling(scaling); item->d_ptr->m_dirtyBits.scalingDirty = false; } if (item->d_ptr->m_dirtyBits.rotationDirty) { @@ -879,6 +927,18 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) } if (item->d_ptr->m_dirtyBits.textureDirty) { QImage textureImage = item->d_ptr->textureImage(); + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + // Check do we have custom visuals or need to use theme + if (!labelItem->dptr()->m_customVisuals) { + // Recreate texture using theme + labelItem->dptr()->createTextureImage(m_cachedTheme->labelBackgroundColor(), + m_cachedTheme->labelTextColor(), + m_cachedTheme->isLabelBackgroundEnabled(), + m_cachedTheme->isLabelBorderEnabled()); + textureImage = item->d_ptr->textureImage(); + } + } renderItem->setBlendNeeded(textureImage.hasAlphaChannel()); GLuint oldTexture = renderItem->texture(); m_textureHelper->deleteTexture(&oldTexture); @@ -904,15 +964,21 @@ void Abstract3DRenderer::updateCustomItem(CustomRenderItem *renderItem) renderItem->setShadowCasting(item->isShadowCasting()); item->d_ptr->m_dirtyBits.shadowCastingDirty = false; } + if (item->d_ptr->m_isLabelItem) { + QCustom3DLabel *labelItem = static_cast(item); + if (labelItem->dptr()->m_facingCameraDirty) { + renderItem->setFacingCamera(labelItem->isFacingCamera()); + labelItem->dptr()->m_facingCameraDirty = false; + } + } } void Abstract3DRenderer::updateCustomItemPositions() { foreach (CustomRenderItem *renderItem, m_customRenderCache) { - if (!renderItem->isPositionAbsolute()) { - QVector3D translation = convertPositionToTranslation(renderItem->position(), false); - renderItem->setTranslation(translation); - } + QVector3D translation = convertPositionToTranslation(renderItem->position(), + renderItem->isPositionAbsolute()); + renderItem->setTranslation(translation); } } @@ -959,11 +1025,21 @@ void Abstract3DRenderer::drawCustomItems(RenderingState state, QMatrix4x4 itModelMatrix; QMatrix4x4 MVPMatrix; + QQuaternion rotation = item->rotation(); + // Check if the (label) item should be facing camera, and adjust rotation accordingly + if (item->isFacingCamera()) { + float camRotationX = m_cachedScene->activeCamera()->xRotation(); + float camRotationY = m_cachedScene->activeCamera()->yRotation(); + rotation = QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, -camRotationX) + * QQuaternion::fromAxisAndAngle(1.0f, 0.0f, 0.0f, -camRotationY); + } + modelMatrix.translate(item->translation()); - modelMatrix.rotate(item->rotation()); + modelMatrix.rotate(rotation); modelMatrix.scale(item->scaling()); - itModelMatrix.rotate(item->rotation()); - itModelMatrix.scale(item->scaling()); + itModelMatrix.rotate(rotation); + if (!item->isFacingCamera()) + itModelMatrix.scale(item->scaling()); MVPMatrix = projectionViewMatrix * modelMatrix; if (RenderingNormal == state) { diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 87fecbf2..73a2eb3a 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2640,7 +2640,7 @@ QVector3D Bars3DRenderer::convertPositionToTranslation(const QVector3D &position yTrans = m_axisCacheY.positionAt(position.y()); } else { xTrans = position.x() * m_scaleX; - yTrans = position.y(); + yTrans = position.y() + m_backgroundAdjustment; zTrans = position.z() * m_scaleZ; } return QVector3D(xTrans, yTrans, zTrans); diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index fd45bdca..6893a286 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -88,11 +88,11 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // New revisions qmlRegisterUncreatableType(uri, 1, 1, "AbstractAxis3D", - QLatin1String("Trying to create uncreatable: AbstractAxis.")); + QLatin1String("Trying to create uncreatable: AbstractAxis.")); qmlRegisterUncreatableType(uri, 1, 1, "Abstract3DSeries", QLatin1String("Trying to create uncreatable: Abstract3DSeries.")); qmlRegisterUncreatableType(uri, 1, 1, "AbstractGraph3D", - QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); + QLatin1String("Trying to create uncreatable: AbstractGraph3D.")); qmlRegisterType(uri, 1, 1, "ValueAxis3D"); qmlRegisterType(uri, 1, 1, "ItemModelBarDataProxy"); qmlRegisterType(uri, 1, 1, "ItemModelSurfaceDataProxy"); @@ -102,6 +102,7 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 1, "ValueAxis3DFormatter"); qmlRegisterType(uri, 1, 1, "LogValueAxis3DFormatter"); qmlRegisterType(uri, 1, 1, "Custom3DItem"); + qmlRegisterType(uri, 1, 1, "Custom3DLabel"); // New metatypes qRegisterMetaType("QAbstract3DGraph::ElementType"); diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h index fcc0bcde..1e566ac1 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h @@ -46,6 +46,7 @@ #include "declarativecolor_p.h" #include "declarativescene_p.h" #include "qcustom3ditem.h" +#include "qcustom3dlabel.h" #include @@ -98,6 +99,7 @@ QML_DECLARE_TYPE(DeclarativeTheme3D) QML_DECLARE_TYPE(QAbstract3DInputHandler) QML_DECLARE_TYPE(QCustom3DItem) +QML_DECLARE_TYPE(QCustom3DLabel) QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/tests/qmlcamera/qml/qmlcamera/main.qml b/tests/qmlcamera/qml/qmlcamera/main.qml index c357accf..444e175c 100644 --- a/tests/qmlcamera/qml/qmlcamera/main.qml +++ b/tests/qmlcamera/qml/qmlcamera/main.qml @@ -67,7 +67,7 @@ Rectangle { scene.activeCamera.zoomLevel: zoomSlider.value inputHandler: null - customItemList: [shuttleItem] + customItemList: [shuttleItem, labelItem] } Custom3DItem { @@ -78,6 +78,15 @@ Rectangle { scaling: Qt.vector3d(0.2,0.2,0.2) } + Custom3DLabel { + id: labelItem + facingCamera: true + positionAbsolute: true + position: Qt.vector3d(0.0,1.5,0.0) + scaling: Qt.vector3d(1.0,1.0,1.0) + text: "Qt Shuttle" + } + MouseArea { id: inputArea anchors.fill: parent -- cgit v1.2.3 From 62bcc7affd7ca0cda298f1e373c441e6b2cde53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 28 May 2014 13:52:16 +0300 Subject: Fixed crash whe mixing charts and datavis Task-number: QTRD-3142 Change-Id: Ic12253cb4ea63cb6a81a9d363a43982690fa33ae Change-Id: Ic12253cb4ea63cb6a81a9d363a43982690fa33ae Reviewed-by: Miikka Heikkinen --- src/datavisualizationqml2/datavisualizationqml2_plugin.cpp | 4 ++-- src/datavisualizationqml2/datavisualizationqml2_plugin.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp index 6893a286..09780dc5 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.cpp @@ -28,8 +28,8 @@ void QtDataVisualizationQml2Plugin::registerTypes(const char *uri) // QtDataVisualization 1.0 - qmlRegisterUncreatableType(uri, 1, 0, "AbstractItemModel", - QLatin1String("Trying to create uncreatable: AbstractItemModel.")); + qmlRegisterUncreatableType(uri, 1, 0, "AbstractItemModel", + QLatin1String("Trying to create uncreatable: AbstractItemModel.")); qmlRegisterUncreatableType(uri, 1, 0, "AbstractAxis3D", QLatin1String("Trying to create uncreatable: AbstractAxis.")); qmlRegisterUncreatableType(uri, 1, 0, "AbstractDataProxy", diff --git a/src/datavisualizationqml2/datavisualizationqml2_plugin.h b/src/datavisualizationqml2/datavisualizationqml2_plugin.h index 1e566ac1..21ef85b8 100644 --- a/src/datavisualizationqml2/datavisualizationqml2_plugin.h +++ b/src/datavisualizationqml2/datavisualizationqml2_plugin.h @@ -57,7 +57,7 @@ QML_DECLARE_TYPE(DeclarativeBars) QML_DECLARE_TYPE(DeclarativeScatter) QML_DECLARE_TYPE(DeclarativeSurface) -QML_DECLARE_TYPE(const QAbstractItemModel) +QML_DECLARE_TYPE(QAbstractItemModel) QML_DECLARE_TYPE(QAbstract3DAxis) QML_DECLARE_TYPE(QCategory3DAxis) -- cgit v1.2.3 From 4d107b5280fbc056568674e6a8cf1d588a9d0d99 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 11:05:22 +0300 Subject: Fix surface selection texture generation Task-number: QTRD-3157 Change-Id: Ida6cdac83a9f233a57ab5a621799bd1af2dd0cfc Reviewed-by: Titta Heikkala --- src/datavisualization/engine/surface3drenderer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index ea750c78..0628a77e 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2205,15 +2205,15 @@ void Surface3DRenderer::updateSelectionTextures() void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache, uint &lastSelectionId) { - // Create the selection ID image. Each grid corner gets 2x2 pixel area of // ID color so that each vertex (data point) has 4x4 pixel area of ID color const QRect &sampleSpace = cache->sampleSpace(); int idImageWidth = (sampleSpace.width() - 1) * 4; int idImageHeight = (sampleSpace.height() - 1) * 4; - if (idImageHeight < 0 || idImageWidth < 0) { + if (idImageHeight <= 0 || idImageWidth <= 0) { cache->setSelectionIdRange(-1, -1); + cache->setSelectionTexture(0); return; } @@ -2245,7 +2245,7 @@ void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache, cache->setSelectionIdRange(idStart, lastSelectionId - 1); // Move the ID image (bits) to the texture - QImage image = QImage(bits, idImageWidth, idImageHeight, QImage::Format_RGB32); + QImage image = QImage(bits, idImageWidth, idImageHeight, QImage::Format_ARGB32); GLuint selectionTexture = m_textureHelper->create2DTexture(image, false, false, false); cache->setSelectionTexture(selectionTexture); -- cgit v1.2.3 From 0ccf6aa5a9af9db400f7dd8e21d34499e5af7b28 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 11:07:25 +0300 Subject: Fix qml version number in docs Change-Id: Id080d853908b6d75d55cece06d522c7bfc39f2e2 Reviewed-by: Titta Heikkala --- .../doc/snippets/doc_src_qmldatavisualization.cpp | 8 ++++---- src/datavisualization/doc/src/qtdatavisualization.qdoc | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp b/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp index 0c54c2fe..56bfc5ee 100644 --- a/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp +++ b/src/datavisualization/doc/snippets/doc_src_qmldatavisualization.cpp @@ -17,12 +17,12 @@ ****************************************************************************/ //! [0] -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 //! [0] //! [1] import QtQuick 2.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 Item { width: 640 @@ -61,7 +61,7 @@ Item { //! [2] import QtQuick 2.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 Item { width: 640 @@ -94,7 +94,7 @@ Item { //! [3] import QtQuick 2.0 -import QtDataVisualization 1.0 +import QtDataVisualization 1.1 Item { width: 640 diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index c3196dee..88816f4b 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -37,7 +37,7 @@ */ /*! - \qmlmodule QtDataVisualization 1.0 + \qmlmodule QtDataVisualization 1.1 \title Qt Data Visualization QML Types \ingroup qmlmodules -- cgit v1.2.3 From aac8c10200d1cc9354c0f5190adb858021f77e6b Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 12:35:53 +0300 Subject: Fix the documentation about finding examples in creator Task-number: QTRD-3143 Change-Id: Ic186fc5dbba499f72053b22e7181d9a5996c81ea Reviewed-by: Titta Heikkala --- src/datavisualization/doc/src/qtdatavisualization.qdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index 88816f4b..afe15a9a 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -73,8 +73,8 @@ in the package manager. After installation Qt Data Visualization documentation and examples are available in Qt Creator. - You can find all Qt Data Visualization examples by typing \c visualization in the - \c {Search in Examples...} field. + Examples can be found on the examples page of Qt Creator by selecting the Qt Data Visualization + component from the drop-down menu. The source code is installed into the QtDataVisualization folder under EnterpriseAddOns. -- cgit v1.2.3 From 5170c3fb57210a89978501108e07c598fb083fbc Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 14:37:43 +0300 Subject: Fix various issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I4a6d4775f3ca578370a9ce23491bddcb0f5486ec Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3dcontroller.cpp | 4 ++-- src/datavisualization/engine/abstract3drenderer.cpp | 4 ++-- src/datavisualization/engine/abstract3drenderer_p.h | 2 +- src/datavisualization/engine/axisrendercache_p.h | 9 ++++++++- src/datavisualization/engine/bars3drenderer.cpp | 18 +++++++++++------- src/datavisualization/engine/scatter3drenderer.cpp | 7 +++++-- tests/barstest/chart.cpp | 17 +++++++++-------- 7 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index ea084f9f..13708896 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -45,6 +45,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_selectionMode(QAbstract3DGraph::SelectionItem), m_shadowQuality(QAbstract3DGraph::ShadowQualityMedium), m_useOrthoProjection(false), + m_aspectRatio(2.0f), m_scene(scene), m_activeInputHandler(0), m_axisX(0), @@ -58,8 +59,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_renderPending(false), m_measureFps(false), m_numFrames(0), - m_currentFps(0.0), - m_aspectRatio(2.0f) + m_currentFps(0.0) { if (!m_scene) m_scene = new Q3DScene; diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0f9109db..9a063e0c 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -54,13 +54,13 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_visibleSeriesCount(0), m_customItemShader(0), m_useOrthoProjection(false), - m_graphAspectRatio(2.0f), m_xFlipped(false), m_yFlipped(false), m_zFlipped(false), m_backgroundObj(0), m_gridLineObj(0), - m_labelObj(0) + m_labelObj(0), + m_graphAspectRatio(2.0f) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); QObject::connect(this, &Abstract3DRenderer::needRender, controller, diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 35b6ff27..664933bc 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -225,8 +225,8 @@ protected: bool m_useOrthoProjection; bool m_xFlipped; - bool m_zFlipped; bool m_yFlipped; + bool m_zFlipped; ObjectHelper *m_backgroundObj; // Shared reference ObjectHelper *m_gridLineObj; // Shared reference diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index 0f82fda0..0e4492b4 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -80,7 +80,14 @@ public: inline float gridLinePosition(int index) { return m_adjustedGridLinePositions.at(index); } inline int gridLineCount() { return m_adjustedGridLinePositions.size(); } inline float labelPosition(int index) { return m_adjustedLabelPositions.at(index); } - inline int labelCount() { return m_adjustedLabelPositions.size(); } + inline int labelCount() { + // Some value axis formatters may opt to not show all labels, + // so use positions array for determining count in that case. + if (m_type == QAbstract3DAxis::AxisTypeValue) + return m_adjustedLabelPositions.size(); + else + return m_labels.size(); + } void updateAllPositions(); inline bool positionsDirty() const { return m_positionsDirty; } inline void markPositionsDirty() { m_positionsDirty = true; } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 73a2eb3a..afa249c7 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -298,8 +298,11 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) m_haveGradientSeries = true; } } - if (noSelection && !selectionLabel().isEmpty()) - m_selectionLabelDirty = true; + if (noSelection) { + if (!selectionLabel().isEmpty()) + m_selectionLabelDirty = true; + m_selectedSeriesCache = 0; + } } SeriesRenderCache *Bars3DRenderer::createNewCache(QAbstract3DSeries *series) @@ -2058,12 +2061,13 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } QQuaternion totalRotation = Utils::calculateRotation(labelRotation); + labelCount = qMin(m_axisCacheZ.labelCount(), m_cachedColumnCount); if (m_zFlipped) { startIndex = 0; - endIndex = m_cachedRowCount; + endIndex = labelCount; indexStep = 1; } else { - startIndex = m_cachedRowCount - 1; + startIndex = labelCount - 1; endIndex = -1; indexStep = -1; } @@ -2175,14 +2179,14 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } totalRotation = Utils::calculateRotation(labelRotation); - + labelCount = qMin(m_axisCacheX.labelCount(), m_cachedColumnCount); if (m_xFlipped) { - startIndex = m_cachedColumnCount - 1; + startIndex = labelCount - 1; endIndex = -1; indexStep = -1; } else { startIndex = 0; - endIndex = m_cachedColumnCount; + endIndex = labelCount; indexStep = 1; } for (int column = startIndex; column != endIndex; column = column + indexStep) { diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 10160bed..bd1ba17d 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -227,8 +227,11 @@ void Scatter3DRenderer::updateSeries(const QList &seriesLis else m_backgroundMargin = defaultMaxSize; - if (noSelection && !selectionLabel().isEmpty()) - m_selectionLabelDirty = true; + if (noSelection) { + if (!selectionLabel().isEmpty()) + m_selectionLabelDirty = true; + m_selectedSeriesCache = 0; + } } SeriesRenderCache *Scatter3DRenderer::createNewCache(QAbstract3DSeries *series) diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp index 4e5c8976..d3c38d85 100644 --- a/tests/barstest/chart.cpp +++ b/tests/barstest/chart.cpp @@ -313,11 +313,16 @@ void GraphModifier::swapAxis() void GraphModifier::releaseAxes() { - // Releases all axes - results in default axes for all dimensions. + // Releases all axes we have created - results in default axes for all dimensions. // Axes reset when the graph is switched as set*Axis calls are made, which // implicitly add axes. - foreach (QAbstract3DAxis *axis, m_graph->axes()) - m_graph->releaseAxis(axis); + m_graph->releaseAxis(m_autoAdjustingAxis); + m_graph->releaseAxis(m_fixedRangeAxis); + m_graph->releaseAxis(m_temperatureAxis); + m_graph->releaseAxis(m_yearAxis); + m_graph->releaseAxis(m_monthAxis); + m_graph->releaseAxis(m_genericRowAxis); + m_graph->releaseAxis(m_genericColumnAxis); } void GraphModifier::releaseSeries() @@ -999,8 +1004,6 @@ void GraphModifier::primarySeriesTest() nextStep = 0; break; } - - } void GraphModifier::insertRemoveTestToggle() @@ -1038,7 +1041,7 @@ void GraphModifier::toggleRotation() void GraphModifier::useLogAxis() { static int counter = -1; - static QLogValue3DAxisFormatter *logFormatter = new QLogValue3DAxisFormatter; + static QLogValue3DAxisFormatter *logFormatter = 0; static float minRange = 1.0f; counter++; @@ -1115,8 +1118,6 @@ void GraphModifier::useLogAxis() counter = -1; break; } - - } void GraphModifier::changeValueAxisFormat(const QString & text) -- cgit v1.2.3 From cef4b02271dee2fda16b7c7238cc4507dffd35c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 2 Jun 2014 10:34:55 +0300 Subject: New snapshots for changed examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3158 Change-Id: Ib192e8b470bdb4bad431918fc586157b787fe79f Change-Id: Ib192e8b470bdb4bad431918fc586157b787fe79f Reviewed-by: Tomi Korpipää --- .../bars/doc/images/bars-example.png | Bin 151337 -> 188289 bytes .../customitems/doc/images/customitems-example.png | Bin 97631 -> 109729 bytes .../qmlbars/doc/images/qmlbars-example.png | Bin 149167 -> 146667 bytes .../doc/images/qmloscilloscope-example.png | Bin 134021 -> 129028 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/datavisualization/bars/doc/images/bars-example.png b/examples/datavisualization/bars/doc/images/bars-example.png index 5bd2c7d9..fb79668d 100644 Binary files a/examples/datavisualization/bars/doc/images/bars-example.png and b/examples/datavisualization/bars/doc/images/bars-example.png differ diff --git a/examples/datavisualization/customitems/doc/images/customitems-example.png b/examples/datavisualization/customitems/doc/images/customitems-example.png index 6002ea5f..2732638e 100644 Binary files a/examples/datavisualization/customitems/doc/images/customitems-example.png and b/examples/datavisualization/customitems/doc/images/customitems-example.png differ diff --git a/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png index 64ad6b0e..c2ab2459 100644 Binary files a/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png and b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png differ diff --git a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png index a3e1baab..d8a79a36 100644 Binary files a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png and b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png differ -- cgit v1.2.3 From 6a36592a1df28b523cfaf1b6359970273efb6e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 2 Jun 2014 11:55:09 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: Ic8337601cd0635b48a940c0238d3dfd894dd7fab Change-Id: Ic8337601cd0635b48a940c0238d3dfd894dd7fab Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/abstract3dcontroller_p.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index e5d1154c..efaf691f 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -149,15 +149,6 @@ public: SelectionColumn }; - enum MouseState { - MouseNone = 0, - MouseOnScene, - MouseOnOverview, - MouseOnZoom, - MouseRotating, - MouseOnPinch - }; - private: Abstract3DChangeBitField m_changeTracker; GLfloat m_horizontalRotation; -- cgit v1.2.3 From 7f505c5b6c1a613ffad90fb4d90ff81071cb6236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 2 Jun 2014 12:34:43 +0300 Subject: Fix QML item model crashes Needed to allow using charts and data visualization from the same application. Low-impact binary break Change-Id: I4b82e540b202e18e2e7a4278d06c9e9f43001a8f Change-Id: I4b82e540b202e18e2e7a4278d06c9e9f43001a8f Reviewed-by: Miikka Heikkinen --- .../data/abstractitemmodelhandler.cpp | 4 ++-- .../data/abstractitemmodelhandler_p.h | 6 +++--- .../data/qitemmodelbardataproxy.cpp | 16 +++++++-------- .../data/qitemmodelbardataproxy.h | 18 ++++++++-------- .../data/qitemmodelscatterdataproxy.cpp | 10 ++++----- .../data/qitemmodelscatterdataproxy.h | 12 +++++------ .../data/qitemmodelsurfacedataproxy.cpp | 16 +++++++-------- .../data/qitemmodelsurfacedataproxy.h | 24 ++++++++++++---------- 8 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/datavisualization/data/abstractitemmodelhandler.cpp b/src/datavisualization/data/abstractitemmodelhandler.cpp index 9f2ccd86..f8ddf7b7 100644 --- a/src/datavisualization/data/abstractitemmodelhandler.cpp +++ b/src/datavisualization/data/abstractitemmodelhandler.cpp @@ -34,7 +34,7 @@ AbstractItemModelHandler::~AbstractItemModelHandler() { } -void AbstractItemModelHandler::setItemModel(const QAbstractItemModel *itemModel) +void AbstractItemModelHandler::setItemModel(QAbstractItemModel *itemModel) { if (itemModel != m_itemModel.data()) { if (!m_itemModel.isNull()) @@ -69,7 +69,7 @@ void AbstractItemModelHandler::setItemModel(const QAbstractItemModel *itemModel) } } -const QAbstractItemModel *AbstractItemModelHandler::itemModel() const +QAbstractItemModel *AbstractItemModelHandler::itemModel() const { return m_itemModel.data(); } diff --git a/src/datavisualization/data/abstractitemmodelhandler_p.h b/src/datavisualization/data/abstractitemmodelhandler_p.h index ecbfe61c..e11d229a 100644 --- a/src/datavisualization/data/abstractitemmodelhandler_p.h +++ b/src/datavisualization/data/abstractitemmodelhandler_p.h @@ -43,8 +43,8 @@ public: AbstractItemModelHandler(QObject *parent = 0); virtual ~AbstractItemModelHandler(); - virtual void setItemModel(const QAbstractItemModel *itemModel); - virtual const QAbstractItemModel *itemModel() const; + virtual void setItemModel(QAbstractItemModel *itemModel); + virtual QAbstractItemModel *itemModel() const; public slots: virtual void handleColumnsInserted(const QModelIndex &parent, int start, int end); @@ -71,7 +71,7 @@ signals: protected: virtual void resolveModel() = 0; - QPointer m_itemModel; // Not owned + QPointer m_itemModel; // Not owned bool resolvePending; QTimer m_resolveTimer; bool m_fullReset; diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index f87deb20..6683e06f 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -282,7 +282,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(QObject *parent) * Constructs QItemModelBarDataProxy with \a itemModel and optional \a parent. Proxy doesn't take * ownership of the \a itemModel, as typically item models are owned by other controls. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent) +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, QObject *parent) : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { setItemModel(itemModel); @@ -296,7 +296,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * This constructor is meant to be used with models that have data properly sorted * in rows and columns already, so it also sets useModelCategories property to true. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &valueRole, QObject *parent) : QBarDataProxy(new QItemModelBarDataProxyPrivate(this), parent) { @@ -311,7 +311,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * ownership of the \a itemModel, as typically item models are owned by other controls. * The role mappings are set with \a rowRole, \a columnRole, and \a valueRole. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, QObject *parent) @@ -329,7 +329,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * ownership of the \a itemModel, as typically item models are owned by other controls. * The role mappings are set with \a rowRole, \a columnRole, \a valueRole, and \a rotationRole. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -352,7 +352,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -379,7 +379,7 @@ QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemMod * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelBarDataProxy::QItemModelBarDataProxy(const QAbstractItemModel *itemModel, +QItemModelBarDataProxy::QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, @@ -414,12 +414,12 @@ QItemModelBarDataProxy::~QItemModelBarDataProxy() * Defines item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelBarDataProxy::setItemModel(const QAbstractItemModel *itemModel) +void QItemModelBarDataProxy::setItemModel(QAbstractItemModel *itemModel) { dptr()->m_itemModelHandler->setItemModel(itemModel); } -const QAbstractItemModel *QItemModelBarDataProxy::itemModel() const +QAbstractItemModel *QItemModelBarDataProxy::itemModel() const { return dptrc()->m_itemModelHandler->itemModel(); } diff --git a/src/datavisualization/data/qitemmodelbardataproxy.h b/src/datavisualization/data/qitemmodelbardataproxy.h index 317befdc..d7394dcf 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.h +++ b/src/datavisualization/data/qitemmodelbardataproxy.h @@ -31,7 +31,7 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelBarDataProxy : public QBarDataProxy { Q_OBJECT Q_ENUMS(MultiMatchBehavior) - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) Q_PROPERTY(QString valueRole READ valueRole WRITE setValueRole NOTIFY valueRoleChanged) @@ -60,27 +60,27 @@ public: }; explicit QItemModelBarDataProxy(QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &valueRole, + QItemModelBarDataProxy(QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &valueRole, QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, const QString &rotationRole, QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, const QStringList &rowCategories, const QStringList &columnCategories, QObject *parent = 0); - QItemModelBarDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelBarDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &valueRole, const QString &rotationRole, const QStringList &rowCategories, const QStringList &columnCategories, QObject *parent = 0); virtual ~QItemModelBarDataProxy(); - void setItemModel(const QAbstractItemModel *itemModel); - const QAbstractItemModel *itemModel() const; + void setItemModel(QAbstractItemModel *itemModel); + QAbstractItemModel *itemModel() const; void setRowRole(const QString &role); QString rowRole() const; diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index ad588ab1..56e164f9 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -206,7 +206,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(QObject *parent) * Constructs QItemModelScatterDataProxy with \a itemModel and optional \a parent. Proxy doesn't take * ownership of the \a itemModel, as typically item models are owned by other controls. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, QObject *parent) : QScatterDataProxy(new QItemModelScatterDataProxyPrivate(this), parent) { @@ -220,7 +220,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, and zPosRole property * to \a zPosRole. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, @@ -240,7 +240,7 @@ QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel * The xPosRole property is set to \a xPosRole, yPosRole property to \a yPosRole, zPosRole property * to \a zPosRole, and rotationRole property to \a rotationRole. */ -QItemModelScatterDataProxy::QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, +QItemModelScatterDataProxy::QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, @@ -269,12 +269,12 @@ QItemModelScatterDataProxy::~QItemModelScatterDataProxy() * Defines the item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelScatterDataProxy::setItemModel(const QAbstractItemModel *itemModel) +void QItemModelScatterDataProxy::setItemModel(QAbstractItemModel *itemModel) { dptr()->m_itemModelHandler->setItemModel(itemModel); } -const QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const +QAbstractItemModel *QItemModelScatterDataProxy::itemModel() const { return dptrc()->m_itemModelHandler->itemModel(); } diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.h b/src/datavisualization/data/qitemmodelscatterdataproxy.h index 5c2bbce9..3215c688 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.h +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.h @@ -31,7 +31,7 @@ class QItemModelScatterDataProxyPrivate; class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDataProxy { Q_OBJECT - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged) Q_PROPERTY(QString yPosRole READ yPosRole WRITE setYPosRole NOTIFY yPosRoleChanged) Q_PROPERTY(QString zPosRole READ zPosRole WRITE setZPosRole NOTIFY zPosRoleChanged) @@ -47,18 +47,18 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelScatterDataProxy : public QScatterDa public: explicit QItemModelScatterDataProxy(QObject *parent = 0); - QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); - QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, + QItemModelScatterDataProxy(QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, QObject *parent = 0); - QItemModelScatterDataProxy(const QAbstractItemModel *itemModel, + QItemModelScatterDataProxy(QAbstractItemModel *itemModel, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, const QString &rotationRole, QObject *parent = 0); virtual ~QItemModelScatterDataProxy(); - void setItemModel(const QAbstractItemModel *itemModel); - const QAbstractItemModel *itemModel() const; + void setItemModel(QAbstractItemModel *itemModel); + QAbstractItemModel *itemModel() const; void setXPosRole(const QString &role); QString xPosRole() const; diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 6ed1ec07..00f9b201 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -325,7 +325,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QObject *parent) * Constructs QItemModelSurfaceDataProxy with \a itemModel and optional \a parent. Proxy doesn't take * ownership of the \a itemModel, as typically item models are owned by other controls. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, QObject *parent) : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) { @@ -340,7 +340,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel * This constructor is meant to be used with models that have data properly sorted * in rows and columns already, so it also sets useModelCategories property to true. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &yPosRole, QObject *parent) : QSurfaceDataProxy(new QItemModelSurfaceDataProxyPrivate(this), parent) @@ -357,7 +357,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel * The role mappings are set with \a rowRole, \a columnRole, and \a yPosRole. * The zPosRole and the xPosRole are set to \a rowRole and \a columnRole, respectively. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &yPosRole, @@ -379,7 +379,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel * The role mappings are set with \a rowRole, \a columnRole, \a xPosRole, \a yPosRole, and * \a zPosRole. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &xPosRole, @@ -405,7 +405,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &yPosRole, @@ -435,7 +435,7 @@ QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel * Row and column categories are set with \a rowCategories and \a columnCategories. * This constructor also sets autoRowCategories and autoColumnCategories to false. */ -QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, +QItemModelSurfaceDataProxy::QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &xPosRole, @@ -472,12 +472,12 @@ QItemModelSurfaceDataProxy::~QItemModelSurfaceDataProxy() * Defines item model. Does not take ownership of the model, but does connect to it to listen for * changes. */ -void QItemModelSurfaceDataProxy::setItemModel(const QAbstractItemModel *itemModel) +void QItemModelSurfaceDataProxy::setItemModel(QAbstractItemModel *itemModel) { dptr()->m_itemModelHandler->setItemModel(itemModel); } -const QAbstractItemModel *QItemModelSurfaceDataProxy::itemModel() const +QAbstractItemModel *QItemModelSurfaceDataProxy::itemModel() const { return dptrc()->m_itemModelHandler->itemModel(); } diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.h b/src/datavisualization/data/qitemmodelsurfacedataproxy.h index 27ce9ea5..1b95ed90 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.h +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.h @@ -32,7 +32,7 @@ class QT_DATAVISUALIZATION_EXPORT QItemModelSurfaceDataProxy : public QSurfaceDa { Q_OBJECT Q_ENUMS(MultiMatchBehavior) - Q_PROPERTY(const QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) + Q_PROPERTY(QAbstractItemModel* itemModel READ itemModel WRITE setItemModel NOTIFY itemModelChanged) Q_PROPERTY(QString rowRole READ rowRole WRITE setRowRole NOTIFY rowRoleChanged) Q_PROPERTY(QString columnRole READ columnRole WRITE setColumnRole NOTIFY columnRoleChanged) Q_PROPERTY(QString xPosRole READ xPosRole WRITE setXPosRole NOTIFY xPosRoleChanged) @@ -64,29 +64,31 @@ public: }; explicit QItemModelSurfaceDataProxy(QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &yPosRole, + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, QObject *parent = 0); + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &yPosRole, QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &yPosRole, QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &yPosRole, - const QStringList &rowCategories, const QStringList &columnCategories, + const QStringList &rowCategories, + const QStringList &columnCategories, QObject *parent = 0); - QItemModelSurfaceDataProxy(const QAbstractItemModel *itemModel, const QString &rowRole, + QItemModelSurfaceDataProxy(QAbstractItemModel *itemModel, const QString &rowRole, const QString &columnRole, const QString &xPosRole, const QString &yPosRole, const QString &zPosRole, - const QStringList &rowCategories, const QStringList &columnCategories, + const QStringList &rowCategories, + const QStringList &columnCategories, QObject *parent = 0); virtual ~QItemModelSurfaceDataProxy(); - void setItemModel(const QAbstractItemModel *itemModel); - const QAbstractItemModel *itemModel() const; + void setItemModel(QAbstractItemModel *itemModel); + QAbstractItemModel *itemModel() const; void setRowRole(const QString &role); QString rowRole() const; -- cgit v1.2.3 From e001973214143698f57fbacd9442ac4d9f1b32c9 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 2 Jun 2014 10:47:29 +0300 Subject: Misc fixes found while valgrinding. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If744721eff62f07f20bff95ca815ca80ca50fee1 Reviewed-by: Tomi Korpipää --- .../customitems/customitemgraph.cpp | 25 ++++++++++++++++------ examples/datavisualization/customitems/main.cpp | 2 +- .../draggableaxes/axesinputhandler.cpp | 2 ++ src/datavisualization/data/barrenderitem.cpp | 1 + src/datavisualization/engine/bars3drenderer.cpp | 12 ++++++++--- src/datavisualization/engine/surface3drenderer.cpp | 16 +++++++------- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp index 07ee1b9a..96ce5e46 100644 --- a/examples/datavisualization/customitems/customitemgraph.cpp +++ b/examples/datavisualization/customitems/customitemgraph.cpp @@ -259,13 +259,17 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) { resetSelection(); if (type == QAbstract3DGraph::ElementCustomItem) { - int index = m_graph->selectedCustomItemIndex(); QCustom3DItem *item = m_graph->selectedCustomItem(); QString text; - text.setNum(index); - text.append(": "); - QStringList split = item->meshFile().split("/"); - text.append(split.last()); + if (qobject_cast(item) != 0) { + text.append("Custom label: "); + } else { + QStringList split = item->meshFile().split("/"); + text.append(split.last()); + text.append(": "); + } + int index = m_graph->selectedCustomItemIndex(); + text.append(QString::number(index)); m_textField->setText(text); m_previouslyAnimatedItem = item; m_previousScaling = item->scaling(); @@ -289,7 +293,16 @@ void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type) m_textField->setText(text); } else if (type > QAbstract3DGraph::ElementSeries && type < QAbstract3DGraph::ElementCustomItem) { - m_textField->setText("Axis"); + int index = m_graph->selectedLabelIndex(); + QString text; + if (type == QAbstract3DGraph::ElementAxisXLabel) + text.append("Axis X label: "); + else if (type == QAbstract3DGraph::ElementAxisYLabel) + text.append("Axis Y label: "); + else + text.append("Axis Z label: "); + text.append(QString::number(index)); + m_textField->setText(text); } else { m_textField->setText("Nothing"); } diff --git a/examples/datavisualization/customitems/main.cpp b/examples/datavisualization/customitems/main.cpp index fe2d0edc..7f5dd01e 100644 --- a/examples/datavisualization/customitems/main.cpp +++ b/examples/datavisualization/customitems/main.cpp @@ -31,7 +31,7 @@ int main(int argc, char **argv) Q3DSurface *graph = new Q3DSurface(); QWidget *container = QWidget::createWindowContainer(graph); - container->setMinimumSize(QSize(1280, 768)); + container->setMinimumSize(QSize(800, 600)); container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); container->setFocusPolicy(Qt::StrongFocus); diff --git a/examples/datavisualization/draggableaxes/axesinputhandler.cpp b/examples/datavisualization/draggableaxes/axesinputhandler.cpp index 7b570e5c..f79f3d4e 100644 --- a/examples/datavisualization/draggableaxes/axesinputhandler.cpp +++ b/examples/datavisualization/draggableaxes/axesinputhandler.cpp @@ -130,6 +130,8 @@ void AxesInputHandler::handleAxisDragging() distance = move.y() / m_speedModifier; // No need to use adjusted y move here m_axisY->setRange(m_axisY->min() + distance, m_axisY->max() + distance); break; + default: + break; } //! [9] } diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp index 2d9d3daa..9ceadbcd 100644 --- a/src/datavisualization/data/barrenderitem.cpp +++ b/src/datavisualization/data/barrenderitem.cpp @@ -66,6 +66,7 @@ void BarRenderSliceItem::setItem(const BarRenderItem &renderItem) m_position = renderItem.position(); m_height = renderItem.height(); m_sliceLabel = QString(); + delete m_sliceLabelItem; m_sliceLabelItem = 0; } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index afa249c7..14523929 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -282,9 +282,9 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) m_haveGradientSeries = false; for (int i = 0; i < seriesCount; i++) { QBar3DSeries *barSeries = static_cast(seriesList[i]); + BarSeriesRenderCache *cache = + static_cast(m_renderCacheList.value(barSeries)); if (barSeries->isVisible()) { - BarSeriesRenderCache *cache = - static_cast(m_renderCacheList.value(barSeries)); if (noSelection && barSeries->selectedBar() != QBar3DSeries::invalidSelectionPosition()) { if (selectionLabel() != cache->itemLabel()) @@ -296,7 +296,10 @@ void Bars3DRenderer::updateSeries(const QList &seriesList) m_haveUniformColorSeries = true; else m_haveGradientSeries = true; + } else { + cache->setVisualIndex(-1); } + } if (noSelection) { if (!selectionLabel().isEmpty()) @@ -1830,10 +1833,13 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) m_selectedBar = selectedBar; } + Drawer::LabelPosition position = + m_selectedBar->height() >= 0 ? Drawer::LabelOver : Drawer::LabelBelow; + m_drawer->drawLabel(*selectedBar, labelItem, viewMatrix, projectionMatrix, zeroVector, identityQuaternion, selectedBar->height(), m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, true, false); + m_labelObj, activeCamera, true, false, position); // Reset label update flag; they should have been updated when we get here m_updateLabels = false; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 0628a77e..f703ed97 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1241,10 +1241,10 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); // Put the RGBA value back to uint - uint selectionId = clickedColor.x() - + clickedColor.y() * greenMultiplier - + clickedColor.z() * blueMultiplier - + clickedColor.w() * alphaMultiplier; + uint selectionId = uint(clickedColor.x()) + + uint(clickedColor.y()) * greenMultiplier + + uint(clickedColor.z()) * blueMultiplier + + uint(clickedColor.w()) * alphaMultiplier; m_clickedPosition = selectionIdToSurfacePoint(selectionId); @@ -2460,21 +2460,21 @@ QPoint Surface3DRenderer::selectionIdToSurfacePoint(uint id) m_selectedCustomItemIndex = -1; // Check for label and custom item selection if (id / alphaMultiplier == labelRowAlpha) { - m_selectedLabelIndex = id - (alphaMultiplier * labelRowAlpha); + m_selectedLabelIndex = id - (alphaMultiplier * uint(labelRowAlpha)); m_clickedType = QAbstract3DGraph::ElementAxisZLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelColumnAlpha) { - m_selectedLabelIndex = (id - (alphaMultiplier * labelColumnAlpha)) / greenMultiplier; + m_selectedLabelIndex = (id - (alphaMultiplier * uint(labelColumnAlpha))) / greenMultiplier; m_clickedType = QAbstract3DGraph::ElementAxisXLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == labelValueAlpha) { - m_selectedLabelIndex = (id - (alphaMultiplier * labelValueAlpha)) / blueMultiplier; + m_selectedLabelIndex = (id - (alphaMultiplier * uint(labelValueAlpha))) / blueMultiplier; m_clickedType = QAbstract3DGraph::ElementAxisYLabel; return Surface3DController::invalidSelectionPosition(); } else if (id / alphaMultiplier == customItemAlpha) { // Custom item selection m_clickedType = QAbstract3DGraph::ElementCustomItem; - m_selectedCustomItemIndex = id - (alphaMultiplier * customItemAlpha); + m_selectedCustomItemIndex = id - (alphaMultiplier * uint(customItemAlpha)); return Surface3DController::invalidSelectionPosition(); } -- cgit v1.2.3 From c1717ad4f2ffc1bc8141c96005b7dadfd74d583d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Mon, 2 Jun 2014 13:20:34 +0300 Subject: Clean up Task-number: QTRD-3149 Change-Id: I386501dcb489e36a0163109dbd40f29941bd5868 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3dcontroller.cpp | 8 -------- src/datavisualization/engine/abstract3dcontroller_p.h | 4 ---- src/datavisualization/engine/bars3dcontroller.cpp | 4 ---- src/datavisualization/engine/bars3dcontroller_p.h | 2 -- src/datavisualization/engine/scatter3dcontroller.cpp | 5 ----- src/datavisualization/engine/surface3dcontroller.cpp | 6 ------ src/datavisualization/engine/surface3dcontroller_p.h | 4 ---- 7 files changed, 33 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index 13708896..e7f5f5f8 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -17,21 +17,13 @@ ****************************************************************************/ #include "abstract3dcontroller_p.h" -#include "camerahelper_p.h" #include "qabstract3daxis_p.h" #include "qvalue3daxis_p.h" -#include "qcategory3daxis.h" #include "abstract3drenderer_p.h" -#include "q3dcamera.h" -#include "q3dlight.h" -#include "qabstractdataproxy_p.h" #include "qabstract3dinputhandler_p.h" #include "qtouch3dinputhandler.h" -#include "qabstract3dseries_p.h" #include "thememanager_p.h" #include "q3dtheme_p.h" -#include "q3dscene_p.h" -#include "q3dscene.h" #include "qcustom3ditem_p.h" #include #include diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index efaf691f..f7e8967d 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -43,7 +43,6 @@ class QOpenGLFramebufferObject; QT_BEGIN_NAMESPACE_DATAVISUALIZATION -class CameraHelper; class Abstract3DRenderer; class QAbstract3DSeries; class ThemeManager; @@ -151,8 +150,6 @@ public: private: Abstract3DChangeBitField m_changeTracker; - GLfloat m_horizontalRotation; - GLfloat m_verticalRotation; ThemeManager *m_themeManager; QAbstract3DGraph::SelectionFlags m_selectionMode; QAbstract3DGraph::ShadowQuality m_shadowQuality; @@ -163,7 +160,6 @@ protected: Q3DScene *m_scene; QList m_inputHandlers; // List of all added input handlers QAbstract3DInputHandler *m_activeInputHandler; - CameraHelper *m_cameraHelper; // Active axes QAbstract3DAxis *m_axisX; QAbstract3DAxis *m_axisY; diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index f045a874..76e6793e 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -18,8 +18,6 @@ #include "bars3dcontroller_p.h" #include "bars3drenderer_p.h" -#include "camerahelper_p.h" -#include "qabstract3daxis_p.h" #include "qvalue3daxis_p.h" #include "qcategory3daxis_p.h" #include "qbardataproxy_p.h" @@ -27,8 +25,6 @@ #include "thememanager_p.h" #include "q3dtheme_p.h" -#include - QT_BEGIN_NAMESPACE_DATAVISUALIZATION Bars3DController::Bars3DController(QRect boundRect, Q3DScene *scene) diff --git a/src/datavisualization/engine/bars3dcontroller_p.h b/src/datavisualization/engine/bars3dcontroller_p.h index 00eda402..4f0e1f20 100644 --- a/src/datavisualization/engine/bars3dcontroller_p.h +++ b/src/datavisualization/engine/bars3dcontroller_p.h @@ -38,7 +38,6 @@ class Bars3DRenderer; class QBar3DSeries; struct Bars3DChangeBitField { - bool slicingActiveChanged : 1; bool multiSeriesScalingChanged : 1; bool barSpecsChanged : 1; bool selectedBarChanged : 1; @@ -46,7 +45,6 @@ struct Bars3DChangeBitField { bool itemChanged : 1; Bars3DChangeBitField() : - slicingActiveChanged(true), multiSeriesScalingChanged(true), barSpecsChanged(true), selectedBarChanged(true), diff --git a/src/datavisualization/engine/scatter3dcontroller.cpp b/src/datavisualization/engine/scatter3dcontroller.cpp index f580244a..da40fc85 100644 --- a/src/datavisualization/engine/scatter3dcontroller.cpp +++ b/src/datavisualization/engine/scatter3dcontroller.cpp @@ -18,15 +18,10 @@ #include "scatter3dcontroller_p.h" #include "scatter3drenderer_p.h" -#include "camerahelper_p.h" -#include "qabstract3daxis_p.h" #include "qvalue3daxis_p.h" #include "qscatterdataproxy_p.h" #include "qscatter3dseries_p.h" -#include -#include - QT_BEGIN_NAMESPACE_DATAVISUALIZATION static const int insertRemoveRecordReserveSize = 31; diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index 812efa3a..e6c25260 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -18,15 +18,9 @@ #include "surface3dcontroller_p.h" #include "surface3drenderer_p.h" -#include "camerahelper_p.h" -#include "qabstract3daxis_p.h" #include "qvalue3daxis_p.h" -#include "qcategory3daxis.h" #include "qsurfacedataproxy_p.h" #include "qsurface3dseries_p.h" -#include "shaderhelper_p.h" - -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h index b742b6bb..2be74f35 100644 --- a/src/datavisualization/engine/surface3dcontroller_p.h +++ b/src/datavisualization/engine/surface3dcontroller_p.h @@ -38,15 +38,11 @@ class Surface3DRenderer; class QSurface3DSeries; struct Surface3DChangeBitField { - bool smoothStatusChanged : 1; - bool surfaceGridChanged : 1; bool selectedPointChanged : 1; bool rowsChanged : 1; bool itemChanged : 1; Surface3DChangeBitField() : - smoothStatusChanged(true), - surfaceGridChanged(true), selectedPointChanged(true), rowsChanged(false), itemChanged(false) -- cgit v1.2.3 From c80c034c712d607f9c9b748cecda02e2af67820a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 06:56:24 +0300 Subject: Clean up renderers Task-number: QTRD-3149 Change-Id: I71b9b7533ad3730d0d203c3d07e66d824b690fbb Reviewed-by: Titta Heikkala Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/abstract3drenderer.cpp | 6 ------ src/datavisualization/engine/abstract3drenderer_p.h | 1 - src/datavisualization/engine/bars3drenderer.cpp | 9 --------- src/datavisualization/engine/bars3drenderer_p.h | 5 ----- src/datavisualization/engine/scatter3drenderer.cpp | 21 --------------------- src/datavisualization/engine/scatter3drenderer_p.h | 21 ++++++--------------- src/datavisualization/engine/surface3drenderer.cpp | 10 ---------- src/datavisualization/engine/surface3drenderer_p.h | 5 ----- 8 files changed, 6 insertions(+), 72 deletions(-) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 9a063e0c..0d7aa3c3 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -17,15 +17,9 @@ ****************************************************************************/ #include "abstract3drenderer_p.h" -#include "qvalue3daxis.h" #include "texturehelper_p.h" -#include "utils_p.h" -#include "q3dscene_p.h" #include "q3dcamera_p.h" -#include "q3dlight_p.h" -#include "qabstract3dseries_p.h" #include "q3dtheme_p.h" -#include "objecthelper_p.h" #include "qvalue3daxisformatter_p.h" #include "shaderhelper_p.h" #include "qcustom3ditem_p.h" diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index 664933bc..b8aad730 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -34,7 +34,6 @@ #include "datavisualizationglobal_p.h" #include "abstract3dcontroller_p.h" #include "axisrendercache_p.h" -#include "qabstractdataproxy.h" #include "seriesrendercache_p.h" #include "customrenderitem_p.h" diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 14523929..23e36c5b 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -17,21 +17,12 @@ ****************************************************************************/ #include "bars3drenderer_p.h" -#include "bars3dcontroller_p.h" #include "q3dcamera_p.h" #include "shaderhelper_p.h" -#include "objecthelper_p.h" #include "texturehelper_p.h" #include "utils_p.h" -#include "drawer_p.h" -#include "qbardataitem.h" -#include "q3dlight.h" -#include "qbar3dseries_p.h" #include "barseriesrendercache_p.h" -#include -#include -#include #include // You can verify that depth buffer drawing works correctly by uncommenting this. diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index c4d25430..3a0ab3b8 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -32,17 +32,14 @@ #include "datavisualizationglobal_p.h" #include "bars3dcontroller_p.h" #include "abstract3drenderer_p.h" -#include "qbardataproxy.h" #include "barrenderitem_p.h" class QPoint; class QSizeF; -class QOpenGLShaderProgram; QT_BEGIN_NAMESPACE_DATAVISUALIZATION class ShaderHelper; -class ObjectHelper; class LabelItem; class Q3DScene; class BarSeriesRenderCache; @@ -172,8 +169,6 @@ private: inline void updateRenderItem(const QBarDataItem &dataItem, BarRenderItem &renderItem); Q_DISABLE_COPY(Bars3DRenderer) - - friend class BarRenderItem; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index bd1ba17d..f1508193 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -17,26 +17,14 @@ ****************************************************************************/ #include "scatter3drenderer_p.h" -#include "scatter3dcontroller_p.h" -#include "q3dcamera.h" #include "q3dcamera_p.h" #include "shaderhelper_p.h" -#include "objecthelper_p.h" #include "texturehelper_p.h" #include "utils_p.h" -#include "q3dlight.h" -#include "qscatter3dseries_p.h" #include "scatterseriesrendercache_p.h" -#include -#include -#include #include -// Commenting this draws the shadow map with perspective projection. Otherwise it's drawn in -// orthographic projection. -//#define USE_WIDER_SHADOWS - // You can verify that depth buffer drawing works correctly by uncommenting this. // You should see the scene from where the light is //#define SHOW_DEPTH_TEXTURE_SCENE @@ -393,16 +381,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) zeroVector, 0.0f, 2.5f / m_autoScaleAdjustment); depthViewMatrix.lookAt(depthLightPos, zeroVector, upVector); // Set the depth projection matrix -#ifndef USE_WIDER_SHADOWS - // Use this for perspective shadows depthProjectionMatrix.perspective(15.0f, viewPortRatio, 3.0f, 100.0f); -#else - // Use these for orthographic shadows - GLfloat testAspectRatio = viewPortRatio; - depthProjectionMatrix.ortho(-testAspectRatio * 2.0f, testAspectRatio * 2.0f, - -m_heightNormalizer * 2.0f, m_heightNormalizer * 2.0f, - 0.0f, 100.0f); -#endif depthProjectionViewMatrix = depthProjectionMatrix * depthViewMatrix; // Draw dots to depth buffer diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 373e0f38..b6bafb3b 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -32,21 +32,16 @@ #include "datavisualizationglobal_p.h" #include "scatter3dcontroller_p.h" #include "abstract3drenderer_p.h" -#include "qscatterdataproxy.h" #include "scatterrenderitem_p.h" -class QPoint; class QSizeF; -class QOpenGLShaderProgram; QT_BEGIN_NAMESPACE_DATAVISUALIZATION class ShaderHelper; -class ObjectHelper; -class LabelItem; class Q3DScene; -class QAbstractAxisPrivate; class ScatterSeriesRenderCache; +class QScatterDataItem; class QT_DATAVISUALIZATION_EXPORT Scatter3DRenderer : public Abstract3DRenderer { @@ -79,7 +74,6 @@ private: ScatterSeriesRenderCache *m_selectedSeriesCache; QSizeF m_areaSize; GLfloat m_dotSizeScale; - QVector3D m_translationOffset; bool m_hasHeightAdjustmentChanged; ScatterRenderItem m_dummyRenderItem; GLfloat m_backgroundMargin; @@ -107,6 +101,9 @@ public: void render(GLuint defaultFboHandle); +public slots: + void updateSelectedItem(int index, QScatter3DSeries *series); + protected: virtual void initializeOpenGL(); @@ -135,17 +132,11 @@ private: void calculateTranslation(ScatterRenderItem &item); void calculateSceneScalingFactors(); - Q_DISABLE_COPY(Scatter3DRenderer) - - friend class ScatterRenderItem; - -public slots: - void updateSelectedItem(int index, QScatter3DSeries *series); - -private: void selectionColorToSeriesAndIndex(const QVector4D &color, int &index, QAbstract3DSeries *&series); inline void updateRenderItem(const QScatterDataItem &dataItem, ScatterRenderItem &renderItem); + + Q_DISABLE_COPY(Scatter3DRenderer) }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f703ed97..c7856834 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -16,22 +16,12 @@ ** ****************************************************************************/ -#include "surface3dcontroller_p.h" #include "surface3drenderer_p.h" -#include "q3dcamera.h" #include "q3dcamera_p.h" #include "shaderhelper_p.h" -#include "objecthelper_p.h" -#include "surfaceobject_p.h" #include "texturehelper_p.h" -#include "selectionpointer_p.h" #include "utils_p.h" -#include "drawer_p.h" -#include "q3dlight.h" -#include "qsurface3dseries_p.h" -#include -#include #include static const int ID_TO_RGBA_MASK = 0xff; diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 0c286136..efa8ff7e 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -32,17 +32,12 @@ #include "datavisualizationglobal_p.h" #include "surface3dcontroller_p.h" #include "abstract3drenderer_p.h" -#include "scatterrenderitem_p.h" -#include "qsurfacedataproxy.h" #include "surfaceseriesrendercache_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION class ShaderHelper; -class ObjectHelper; -class SurfaceObject; class Q3DScene; -class SelectionPointer; class QT_DATAVISUALIZATION_EXPORT Surface3DRenderer : public Abstract3DRenderer { -- cgit v1.2.3 From f3d19d795bafb6a7e6af19b3bdbafb8eabc11842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 08:38:36 +0300 Subject: Clean up the rest of engine Task-number: QTRD-3149 Change-Id: Id1c9f72480c63878cc9fa9a71cb3b1b057a79454 Change-Id: Id1c9f72480c63878cc9fa9a71cb3b1b057a79454 Reviewed-by: Miikka Heikkinen --- src/datavisualization/engine/axisrendercache.cpp | 1 - src/datavisualization/engine/axisrendercache_p.h | 2 -- src/datavisualization/engine/barseriesrendercache.cpp | 1 - src/datavisualization/engine/drawer.cpp | 3 --- src/datavisualization/engine/q3dbars.cpp | 6 ------ src/datavisualization/engine/q3dcamera.cpp | 3 --- src/datavisualization/engine/q3dlight.cpp | 2 -- src/datavisualization/engine/q3dobject.cpp | 1 - src/datavisualization/engine/q3dscatter.cpp | 4 ---- src/datavisualization/engine/q3dscene.cpp | 5 ----- src/datavisualization/engine/q3dsurface.cpp | 4 ---- src/datavisualization/engine/scatterseriesrendercache.cpp | 1 - src/datavisualization/engine/selectionpointer.cpp | 5 ----- src/datavisualization/engine/selectionpointer_p.h | 2 -- src/datavisualization/engine/seriesrendercache.cpp | 1 - src/datavisualization/engine/surfaceseriesrendercache.cpp | 5 +---- src/datavisualization/engine/surfaceseriesrendercache_p.h | 4 ---- 17 files changed, 1 insertion(+), 49 deletions(-) diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp index bf661fe4..0b7a5c7a 100644 --- a/src/datavisualization/engine/axisrendercache.cpp +++ b/src/datavisualization/engine/axisrendercache.cpp @@ -18,7 +18,6 @@ #include "axisrendercache_p.h" -#include #include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h index 0e4492b4..90321740 100644 --- a/src/datavisualization/engine/axisrendercache_p.h +++ b/src/datavisualization/engine/axisrendercache_p.h @@ -30,8 +30,6 @@ #define AXISRENDERCACHE_P_H #include "datavisualizationglobal_p.h" -#include "labelitem_p.h" -#include "qabstract3daxis_p.h" #include "drawer_p.h" #include diff --git a/src/datavisualization/engine/barseriesrendercache.cpp b/src/datavisualization/engine/barseriesrendercache.cpp index 83d3e366..95da3680 100644 --- a/src/datavisualization/engine/barseriesrendercache.cpp +++ b/src/datavisualization/engine/barseriesrendercache.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "barseriesrendercache_p.h" -#include "bars3drenderer_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index d6c9fdce..8a8df4fd 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -18,10 +18,7 @@ #include "drawer_p.h" #include "shaderhelper_p.h" -#include "objecthelper_p.h" -#include "abstractobjecthelper_p.h" #include "surfaceobject_p.h" -#include "q3dcamera.h" #include "utils_p.h" #include "texturehelper_p.h" #include "abstract3drenderer_p.h" diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index 7b37715f..ca90156e 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -16,13 +16,7 @@ ** ****************************************************************************/ -#include "q3dbars.h" #include "q3dbars_p.h" -#include "bars3dcontroller_p.h" -#include "qvalue3daxis.h" -#include "qcategory3daxis.h" -#include "q3dcamera.h" -#include "qbar3dseries_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp index 1a23569d..8aa8a2e0 100644 --- a/src/datavisualization/engine/q3dcamera.cpp +++ b/src/datavisualization/engine/q3dcamera.cpp @@ -16,10 +16,7 @@ ** ****************************************************************************/ -#include "q3dcamera.h" #include "q3dcamera_p.h" -#include "q3dscene.h" -#include "q3dobject.h" #include "utils_p.h" #include diff --git a/src/datavisualization/engine/q3dlight.cpp b/src/datavisualization/engine/q3dlight.cpp index 8ac9e3a0..2a7c56fa 100644 --- a/src/datavisualization/engine/q3dlight.cpp +++ b/src/datavisualization/engine/q3dlight.cpp @@ -16,8 +16,6 @@ ** ****************************************************************************/ -#include "q3dlight.h" -#include "q3dscene.h" #include "q3dlight_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/q3dobject.cpp b/src/datavisualization/engine/q3dobject.cpp index 05edf287..b74b8ab7 100644 --- a/src/datavisualization/engine/q3dobject.cpp +++ b/src/datavisualization/engine/q3dobject.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "q3dobject.h" #include "q3dobject_p.h" #include "q3dscene_p.h" diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index 7c7809f3..123cd658 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -18,10 +18,6 @@ #include "q3dscatter.h" #include "q3dscatter_p.h" -#include "scatter3dcontroller_p.h" -#include "qvalue3daxis.h" -#include "q3dcamera.h" -#include "qscatter3dseries_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 3e21d624..c1cc1a03 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -16,15 +16,10 @@ ** ****************************************************************************/ -#include "datavisualizationglobal_p.h" - -#include "q3dscene.h" #include "q3dscene_p.h" #include "q3dcamera_p.h" #include "q3dlight_p.h" -#include - QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index 7724cb24..e5b21387 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -18,10 +18,6 @@ #include "q3dsurface.h" #include "q3dsurface_p.h" -#include "qvalue3daxis.h" -#include "qsurfacedataproxy.h" -#include "q3dcamera.h" -#include "qsurface3dseries_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatterseriesrendercache.cpp b/src/datavisualization/engine/scatterseriesrendercache.cpp index 2a2c5393..5b2cf1ef 100644 --- a/src/datavisualization/engine/scatterseriesrendercache.cpp +++ b/src/datavisualization/engine/scatterseriesrendercache.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "scatterseriesrendercache_p.h" -#include "scatter3drenderer_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/selectionpointer.cpp b/src/datavisualization/engine/selectionpointer.cpp index fe9325cf..183d3f8e 100644 --- a/src/datavisualization/engine/selectionpointer.cpp +++ b/src/datavisualization/engine/selectionpointer.cpp @@ -17,16 +17,11 @@ ****************************************************************************/ #include "selectionpointer_p.h" -#include "surface3dcontroller_p.h" #include "shaderhelper_p.h" #include "objecthelper_p.h" #include "texturehelper_p.h" #include "q3dcamera_p.h" -#include "drawer_p.h" #include "utils_p.h" -#include "q3dlight.h" - -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/selectionpointer_p.h b/src/datavisualization/engine/selectionpointer_p.h index f33cd6cd..7dc28024 100644 --- a/src/datavisualization/engine/selectionpointer_p.h +++ b/src/datavisualization/engine/selectionpointer_p.h @@ -29,7 +29,6 @@ #ifndef SELECTIONPOINTER_P_H #define SELECTIONPOINTER_P_H -#include "q3dscene.h" #include "datavisualizationglobal_p.h" #include "surface3dcontroller_p.h" @@ -37,7 +36,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class ShaderHelper; class ObjectHelper; -class SurfaceObject; class TextureHelper; class Drawer; diff --git a/src/datavisualization/engine/seriesrendercache.cpp b/src/datavisualization/engine/seriesrendercache.cpp index e4f221f8..dc4b9db3 100644 --- a/src/datavisualization/engine/seriesrendercache.cpp +++ b/src/datavisualization/engine/seriesrendercache.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "seriesrendercache_p.h" -#include "objecthelper_p.h" #include "abstract3drenderer_p.h" #include "texturehelper_p.h" #include "utils_p.h" diff --git a/src/datavisualization/engine/surfaceseriesrendercache.cpp b/src/datavisualization/engine/surfaceseriesrendercache.cpp index db3fa9f7..1cce5288 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache.cpp +++ b/src/datavisualization/engine/surfaceseriesrendercache.cpp @@ -16,12 +16,9 @@ ** ****************************************************************************/ -#include "seriesrendercache_p.h" #include "surfaceseriesrendercache_p.h" -#include "objecthelper_p.h" #include "surface3drenderer_p.h" #include "texturehelper_p.h" -#include "utils_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -33,7 +30,7 @@ SurfaceSeriesRenderCache::SurfaceSeriesRenderCache(QAbstract3DSeries *series, m_surfaceFlatShading(false), m_surfaceObj(new SurfaceObject(renderer)), m_sliceSurfaceObj(new SurfaceObject(renderer)), - m_sampleSpace(QRect(0, 0, 0 , 0)), + m_sampleSpace(QRect(0, 0, 0, 0)), m_selectionTexture(0), m_selectionIdStart(0), m_selectionIdEnd(0), diff --git a/src/datavisualization/engine/surfaceseriesrendercache_p.h b/src/datavisualization/engine/surfaceseriesrendercache_p.h index 9d373812..b6254a75 100644 --- a/src/datavisualization/engine/surfaceseriesrendercache_p.h +++ b/src/datavisualization/engine/surfaceseriesrendercache_p.h @@ -31,7 +31,6 @@ #include "datavisualizationglobal_p.h" #include "seriesrendercache_p.h" -#include "qabstract3dseries_p.h" #include "qsurface3dseries_p.h" #include "surfaceobject_p.h" #include "selectionpointer_p.h" @@ -40,10 +39,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -class Abstract3DRenderer; class Surface3DRenderer; -class ObjectHelper; -class TextureHelper; class SurfaceSeriesRenderCache : public SeriesRenderCache { -- cgit v1.2.3 From d161e0418e994d760436235675f72497de6dff5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 09:01:05 +0300 Subject: Clean up axis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I0583f1fd5f842b15160dd09b26c7e234290a8f44 Change-Id: I0583f1fd5f842b15160dd09b26c7e234290a8f44 Reviewed-by: Tomi Korpipää --- src/datavisualization/axis/qabstract3daxis.cpp | 1 - src/datavisualization/axis/qcategory3daxis.cpp | 2 -- src/datavisualization/axis/qvalue3daxis.cpp | 1 - 3 files changed, 4 deletions(-) diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index 681c435f..d33730ff 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qabstract3daxis.h" #include "qabstract3daxis_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qcategory3daxis.cpp b/src/datavisualization/axis/qcategory3daxis.cpp index d4152c90..ca19986a 100644 --- a/src/datavisualization/axis/qcategory3daxis.cpp +++ b/src/datavisualization/axis/qcategory3daxis.cpp @@ -16,10 +16,8 @@ ** ****************************************************************************/ -#include "qcategory3daxis.h" #include "qcategory3daxis_p.h" #include "bars3dcontroller_p.h" -#include "qbardataproxy.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 1c7b647a..c7396de8 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qvalue3daxis.h" #include "qvalue3daxis_p.h" #include "qvalue3daxisformatter_p.h" -- cgit v1.2.3 From d946344ac21393e4b08e42e657d217a0981840f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 10:24:27 +0300 Subject: Clean up data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I2b2a791fb617e3363865da29ce4c1a6980dbca49 Change-Id: I2b2a791fb617e3363865da29ce4c1a6980dbca49 Reviewed-by: Tomi Korpipää --- src/datavisualization/axis/qabstract3daxis_p.h | 7 +++---- src/datavisualization/axis/qcategory3daxis_p.h | 7 +++---- src/datavisualization/axis/qlogvalue3daxisformatter_p.h | 8 +++----- src/datavisualization/axis/qvalue3daxis_p.h | 6 +++--- src/datavisualization/axis/qvalue3daxisformatter_p.h | 6 +++--- src/datavisualization/data/abstractrenderitem_p.h | 2 -- src/datavisualization/data/barrenderitem.cpp | 1 - src/datavisualization/data/barrenderitem_p.h | 2 -- src/datavisualization/data/labelitem_p.h | 1 - src/datavisualization/data/qabstract3dseries.cpp | 1 - src/datavisualization/data/qabstract3dseries_p.h | 6 +++--- src/datavisualization/data/qabstractdataproxy.cpp | 1 - src/datavisualization/data/qabstractdataproxy_p.h | 6 +++--- src/datavisualization/data/qbardataitem_p.h | 3 --- src/datavisualization/data/qbardataproxy.cpp | 1 - src/datavisualization/data/qbardataproxy_p.h | 1 - src/datavisualization/data/qscatterdataitem_p.h | 3 --- src/datavisualization/data/qscatterdataproxy.cpp | 1 - src/datavisualization/data/qsurfacedataitem_p.h | 3 --- src/datavisualization/data/qsurfacedataproxy.cpp | 1 - src/datavisualization/data/scatterrenderitem.cpp | 2 -- src/datavisualization/data/scatterrenderitem_p.h | 4 ---- src/datavisualization/engine/q3dscene_p.h | 1 - src/datavisualization/engine/qabstract3dgraph_p.h | 1 - 24 files changed, 21 insertions(+), 54 deletions(-) diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h index 72e5b15d..7181362f 100644 --- a/src/datavisualization/axis/qabstract3daxis_p.h +++ b/src/datavisualization/axis/qabstract3daxis_p.h @@ -26,13 +26,12 @@ // // We mean it. -#include "datavisualizationglobal_p.h" -#include "qabstract3daxis.h" -#include "abstract3dcontroller_p.h" - #ifndef QABSTRACT3DAXIS_P_H #define QABSTRACT3DAXIS_P_H +#include "datavisualizationglobal_p.h" +#include "qabstract3daxis.h" + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QAbstract3DAxisPrivate : public QObject diff --git a/src/datavisualization/axis/qcategory3daxis_p.h b/src/datavisualization/axis/qcategory3daxis_p.h index 0f590ece..27126620 100644 --- a/src/datavisualization/axis/qcategory3daxis_p.h +++ b/src/datavisualization/axis/qcategory3daxis_p.h @@ -26,13 +26,12 @@ // // We mean it. -#include "qcategory3daxis.h" -#include "qabstract3daxis_p.h" -#include "qbardataitem.h" - #ifndef QCATEGORY3DAXIS_P_H #define QCATEGORY3DAXIS_P_H +#include "qcategory3daxis.h" +#include "qabstract3daxis_p.h" + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QCategory3DAxisPrivate : public QAbstract3DAxisPrivate diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h index af056a06..df2d41d1 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h @@ -26,17 +26,15 @@ // // We mean it. +#ifndef QLOGVALUE3DAXISFORMATTER_P_H +#define QLOGVALUE3DAXISFORMATTER_P_H + #include "datavisualizationglobal_p.h" #include "qlogvalue3daxisformatter.h" #include "qvalue3daxisformatter_p.h" -#ifndef QLOGVALUE3DAXISFORMATTER_P_H -#define QLOGVALUE3DAXISFORMATTER_P_H - QT_BEGIN_NAMESPACE_DATAVISUALIZATION -class QLogValue3DAxis; - class QLogValue3DAxisFormatterPrivate : public QValue3DAxisFormatterPrivate { Q_OBJECT diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h index 47fd7e06..b7394c0a 100644 --- a/src/datavisualization/axis/qvalue3daxis_p.h +++ b/src/datavisualization/axis/qvalue3daxis_p.h @@ -26,12 +26,12 @@ // // We mean it. -#include "qvalue3daxis.h" -#include "qabstract3daxis_p.h" - #ifndef QVALUE3DAXIS_P_H #define QVALUE3DAXIS_P_H +#include "qvalue3daxis.h" +#include "qabstract3daxis_p.h" + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QValue3DAxisPrivate : public QAbstract3DAxisPrivate diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h index f7fd001e..2d1dc920 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter_p.h +++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h @@ -26,13 +26,13 @@ // // We mean it. +#ifndef QVALUE3DAXISFORMATTER_P_H +#define QVALUE3DAXISFORMATTER_P_H + #include "datavisualizationglobal_p.h" #include "qvalue3daxisformatter.h" #include "utils_p.h" -#ifndef QVALUE3DAXISFORMATTER_P_H -#define QVALUE3DAXISFORMATTER_P_H - QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QValue3DAxis; diff --git a/src/datavisualization/data/abstractrenderitem_p.h b/src/datavisualization/data/abstractrenderitem_p.h index 912a09f3..57977a3c 100644 --- a/src/datavisualization/data/abstractrenderitem_p.h +++ b/src/datavisualization/data/abstractrenderitem_p.h @@ -32,8 +32,6 @@ #include "datavisualizationglobal_p.h" #include "labelitem_p.h" -#include -#include #include #include diff --git a/src/datavisualization/data/barrenderitem.cpp b/src/datavisualization/data/barrenderitem.cpp index 9ceadbcd..eab5178b 100644 --- a/src/datavisualization/data/barrenderitem.cpp +++ b/src/datavisualization/data/barrenderitem.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "barrenderitem_p.h" -#include "bars3drenderer_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/barrenderitem_p.h b/src/datavisualization/data/barrenderitem_p.h index 97c069e2..72c5abc1 100644 --- a/src/datavisualization/data/barrenderitem_p.h +++ b/src/datavisualization/data/barrenderitem_p.h @@ -33,8 +33,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -class Bars3DRenderer; - class BarRenderItem : public AbstractRenderItem { public: diff --git a/src/datavisualization/data/labelitem_p.h b/src/datavisualization/data/labelitem_p.h index 3a2c1eb1..89b6cc56 100644 --- a/src/datavisualization/data/labelitem_p.h +++ b/src/datavisualization/data/labelitem_p.h @@ -30,7 +30,6 @@ #define LABELITEM_P_H #include "datavisualizationglobal_p.h" -#include #include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 9119b61d..b4b49d1e 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qabstract3dseries.h" #include "qabstract3dseries_p.h" #include "qabstractdataproxy_p.h" #include "abstract3dcontroller_p.h" diff --git a/src/datavisualization/data/qabstract3dseries_p.h b/src/datavisualization/data/qabstract3dseries_p.h index e62543af..dd574e03 100644 --- a/src/datavisualization/data/qabstract3dseries_p.h +++ b/src/datavisualization/data/qabstract3dseries_p.h @@ -26,12 +26,12 @@ // // We mean it. -#include "datavisualizationglobal_p.h" -#include "qabstract3dseries.h" - #ifndef QABSTRACT3DSERIES_P_H #define QABSTRACT3DSERIES_P_H +#include "datavisualizationglobal_p.h" +#include "qabstract3dseries.h" + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QAbstractDataProxy; diff --git a/src/datavisualization/data/qabstractdataproxy.cpp b/src/datavisualization/data/qabstractdataproxy.cpp index 5b05dd14..ef6b1a00 100644 --- a/src/datavisualization/data/qabstractdataproxy.cpp +++ b/src/datavisualization/data/qabstractdataproxy.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qabstractdataproxy.h" #include "qabstractdataproxy_p.h" #include "qabstract3dseries_p.h" diff --git a/src/datavisualization/data/qabstractdataproxy_p.h b/src/datavisualization/data/qabstractdataproxy_p.h index eb901f4c..c2f53369 100644 --- a/src/datavisualization/data/qabstractdataproxy_p.h +++ b/src/datavisualization/data/qabstractdataproxy_p.h @@ -26,12 +26,12 @@ // // We mean it. -#include "datavisualizationglobal_p.h" -#include "qabstractdataproxy.h" - #ifndef QABSTRACTDATAPROXY_P_H #define QABSTRACTDATAPROXY_P_H +#include "datavisualizationglobal_p.h" +#include "qabstractdataproxy.h" + QT_BEGIN_NAMESPACE_DATAVISUALIZATION class QAbstract3DSeries; diff --git a/src/datavisualization/data/qbardataitem_p.h b/src/datavisualization/data/qbardataitem_p.h index c06ddea9..623c4012 100644 --- a/src/datavisualization/data/qbardataitem_p.h +++ b/src/datavisualization/data/qbardataitem_p.h @@ -39,9 +39,6 @@ class QBarDataItemPrivate public: QBarDataItemPrivate(); virtual ~QBarDataItemPrivate(); - -protected: - friend class QBarDataItem; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp index 1c1170ff..1723b2a4 100644 --- a/src/datavisualization/data/qbardataproxy.cpp +++ b/src/datavisualization/data/qbardataproxy.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qbardataproxy.h" #include "qbardataproxy_p.h" #include "qbar3dseries_p.h" diff --git a/src/datavisualization/data/qbardataproxy_p.h b/src/datavisualization/data/qbardataproxy_p.h index eb0a0873..4d1489d9 100644 --- a/src/datavisualization/data/qbardataproxy_p.h +++ b/src/datavisualization/data/qbardataproxy_p.h @@ -31,7 +31,6 @@ #include "qbardataproxy.h" #include "qabstractdataproxy_p.h" -#include "qbardataitem.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qscatterdataitem_p.h b/src/datavisualization/data/qscatterdataitem_p.h index efb1cc5c..2884c2e3 100644 --- a/src/datavisualization/data/qscatterdataitem_p.h +++ b/src/datavisualization/data/qscatterdataitem_p.h @@ -39,9 +39,6 @@ class QScatterDataItemPrivate public: QScatterDataItemPrivate(); virtual ~QScatterDataItemPrivate(); - -protected: - friend class QScatterDataItem; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qscatterdataproxy.cpp b/src/datavisualization/data/qscatterdataproxy.cpp index 84bb57e7..4aa9c938 100644 --- a/src/datavisualization/data/qscatterdataproxy.cpp +++ b/src/datavisualization/data/qscatterdataproxy.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qscatterdataproxy.h" #include "qscatterdataproxy_p.h" #include "qscatter3dseries_p.h" diff --git a/src/datavisualization/data/qsurfacedataitem_p.h b/src/datavisualization/data/qsurfacedataitem_p.h index 0cec7eab..e00134e3 100644 --- a/src/datavisualization/data/qsurfacedataitem_p.h +++ b/src/datavisualization/data/qsurfacedataitem_p.h @@ -39,9 +39,6 @@ class QSurfaceDataItemPrivate public: QSurfaceDataItemPrivate(); virtual ~QSurfaceDataItemPrivate(); - -protected: - friend class QSurfaceDataItem; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 058b0e21..04f4f89d 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -16,7 +16,6 @@ ** ****************************************************************************/ -#include "qsurfacedataproxy.h" #include "qsurfacedataproxy_p.h" #include "qsurface3dseries_p.h" diff --git a/src/datavisualization/data/scatterrenderitem.cpp b/src/datavisualization/data/scatterrenderitem.cpp index 33df4d28..0b5398f1 100644 --- a/src/datavisualization/data/scatterrenderitem.cpp +++ b/src/datavisualization/data/scatterrenderitem.cpp @@ -17,8 +17,6 @@ ****************************************************************************/ #include "scatterrenderitem_p.h" -#include "scatter3drenderer_p.h" -#include "qscatterdataproxy.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/data/scatterrenderitem_p.h b/src/datavisualization/data/scatterrenderitem_p.h index eb070682..d754a8ca 100644 --- a/src/datavisualization/data/scatterrenderitem_p.h +++ b/src/datavisualization/data/scatterrenderitem_p.h @@ -33,8 +33,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION -class Scatter3DRenderer; - class ScatterRenderItem : public AbstractRenderItem { public: @@ -55,8 +53,6 @@ public: protected: QVector3D m_position; bool m_visible; - - friend class QScatterDataItem; }; typedef QVector ScatterRenderItemArray; diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h index bc6a7223..2c69e5e0 100644 --- a/src/datavisualization/engine/q3dscene_p.h +++ b/src/datavisualization/engine/q3dscene_p.h @@ -36,7 +36,6 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION class Q3DCamera; class Q3DLight; -class Q3DScene; struct Q3DSceneChangeBitField { bool viewportChanged : 1; diff --git a/src/datavisualization/engine/qabstract3dgraph_p.h b/src/datavisualization/engine/qabstract3dgraph_p.h index 8e571355..a8b0965a 100644 --- a/src/datavisualization/engine/qabstract3dgraph_p.h +++ b/src/datavisualization/engine/qabstract3dgraph_p.h @@ -32,7 +32,6 @@ #include "datavisualizationglobal_p.h" class QOpenGLContext; -class QOpenGLPaintDevice; class QOffscreenSurface; QT_BEGIN_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 9beca180adc3109e9e258cbf54459960b33fa7d6 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 3 Jun 2014 10:36:46 +0300 Subject: Misc fixes for bugs found during examples testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - qmlbars TableView year/month display got messed up when scrolled. - qmllegend black background on transparent item bug was back due to some changes in 5.3. Worked around the issue differently. - qmloscilloscope displayed warnings about circular property binding. - Incorrect count was used to determine amount of labels for rows in bar charts. Change-Id: Id5851019af258c256a92648561bb8ce766993b5c Reviewed-by: Tomi Korpipää --- .../datavisualization/qmlbars/qml/qmlbars/main.qml | 22 +++++++++++++--------- .../qmllegend/qml/qmllegend/LegendItem.qml | 6 ++++++ .../qmllegend/qml/qmllegend/main.qml | 12 ------------ .../qmloscilloscope/qml/qmloscilloscope/main.qml | 17 ++++++++--------- src/datavisualization/engine/bars3drenderer.cpp | 2 +- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml index 32767cc4..5172e27d 100644 --- a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml +++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml @@ -185,18 +185,22 @@ Rectangle { anchors.right: parent.right color: styleData.textColor elide: styleData.elideMode - text: styleData.value + text: customText horizontalAlignment: styleData.textAlignment - property bool customFormatted: false + property string originalText: styleData.value + property string customText - onTextChanged: { - if (styleData.column === 0 && !customFormatted) { - customFormatted = true - var pattern = /(\d\d\d\d)-(\d\d)/ - var matches = pattern.exec(delegateText.text) - var colIndex = parseInt(matches[2], 10) - 1 - delegateText.text = matches[1] + " - " + graphAxes.column.labels[colIndex] + onOriginalTextChanged: { + if (styleData.column === 0) { + if (delegateText.originalText !== "") { + var pattern = /(\d\d\d\d)-(\d\d)/ + var matches = pattern.exec(delegateText.originalText) + var colIndex = parseInt(matches[2], 10) - 1 + delegateText.customText = matches[1] + " - " + graphAxes.column.labels[colIndex] + } + } else { + delegateText.customText = originalText } } } diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml index 50be7a8d..f8c71650 100644 --- a/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml +++ b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml @@ -31,6 +31,12 @@ Rectangle { id: legendItem state: "unselected" + // Workaround for a layout bug that in some situations causes changing from fully opaque color + // to a transparent one to use black background instead of what is actually under the items. + // Having the control always slighthly transparent forces the background to be refreshed + // properly. + opacity: 0.999 + //! [1] RowLayout { anchors.fill: parent diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/main.qml b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml index f7e2d803..0fe107cb 100644 --- a/examples/datavisualization/qmllegend/qml/qmllegend/main.qml +++ b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml @@ -121,34 +121,22 @@ Rectangle { Layout.fillHeight: true series: station1 theme: barGraph.theme - onColorChanged: legendPanel.relayout() } LegendItem { Layout.fillWidth: true Layout.fillHeight: true series: station2 theme: barGraph.theme - onColorChanged: legendPanel.relayout() } LegendItem { Layout.fillWidth: true Layout.fillHeight: true series: station3 theme: barGraph.theme - onColorChanged: legendPanel.relayout() } } //! [0] - function relayout() { - // Workaround for a layout bug that causes transparent colors to use black background - // instead of what is actually under the items if just the color changes. - // Forcing a relayout by adjusting layout's available area fixes the background. - var originalWidth = border.width - border.width = originalWidth + 1 - border.width = originalWidth - } - states: [ State { name: "topleft" diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml index 1373d4f9..c2e6b70b 100644 --- a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml +++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml @@ -82,6 +82,13 @@ Item { meshSmooth: true itemLabelFormat: "@xLabel, @zLabel: @yLabel" itemLabelVisible: false + + onItemLabelChanged: { + if (surfaceSeries.selectedPoint === surfaceSeries.invalidSelectionPosition) + selectionText.text = "No selection" + else + selectionText.text = surfaceSeries.itemLabel + } } //! [0] @@ -244,15 +251,7 @@ Item { anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter - - Binding on text { - when: surfaceSeries.itemLabel.length - value: surfaceSeries.itemLabel - } - Binding on text { - when: !surfaceSeries.itemLabel.length - value: "No selection" - } + text: "No selection" } } } diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 23e36c5b..30be2eae 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -2058,7 +2058,7 @@ void Bars3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCamer } QQuaternion totalRotation = Utils::calculateRotation(labelRotation); - labelCount = qMin(m_axisCacheZ.labelCount(), m_cachedColumnCount); + labelCount = qMin(m_axisCacheZ.labelCount(), m_cachedRowCount); if (m_zFlipped) { startIndex = 0; endIndex = labelCount; -- cgit v1.2.3 From 69926b074405f5117e6a1f124804f21416ef3fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 10:50:53 +0300 Subject: Clean up input, theme, utils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I47e1a1590043c14ccd5d1ad11f0fa643b883cded Change-Id: I47e1a1590043c14ccd5d1ad11f0fa643b883cded Reviewed-by: Tomi Korpipää --- src/datavisualization/input/q3dinputhandler.cpp | 1 - src/datavisualization/input/qabstract3dinputhandler.cpp | 1 - src/datavisualization/input/qabstract3dinputhandler_p.h | 3 --- src/datavisualization/input/qtouch3dinputhandler.cpp | 1 - src/datavisualization/utils/abstractobjecthelper_p.h | 1 - src/datavisualization/utils/camerahelper_p.h | 2 -- src/datavisualization/utils/objecthelper.cpp | 1 - src/datavisualization/utils/objecthelper_p.h | 1 - src/datavisualization/utils/shaderhelper_p.h | 1 - src/datavisualization/utils/surfaceobject.cpp | 1 - src/datavisualization/utils/texturehelper.cpp | 1 - src/datavisualization/utils/texturehelper_p.h | 1 - src/datavisualization/utils/utils.cpp | 5 ----- src/datavisualization/utils/utils_p.h | 8 -------- 14 files changed, 28 deletions(-) diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp index bcbf1014..fdb78983 100644 --- a/src/datavisualization/input/q3dinputhandler.cpp +++ b/src/datavisualization/input/q3dinputhandler.cpp @@ -18,7 +18,6 @@ #include "datavisualizationglobal_p.h" #include "q3dinputhandler_p.h" -#include "q3dcamera_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/input/qabstract3dinputhandler.cpp b/src/datavisualization/input/qabstract3dinputhandler.cpp index 55a7d3ea..cb7d576b 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.cpp +++ b/src/datavisualization/input/qabstract3dinputhandler.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "qabstract3dinputhandler_p.h" -#include "q3dscene.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/input/qabstract3dinputhandler_p.h b/src/datavisualization/input/qabstract3dinputhandler_p.h index fa5a2315..b4b2eda2 100644 --- a/src/datavisualization/input/qabstract3dinputhandler_p.h +++ b/src/datavisualization/input/qabstract3dinputhandler_p.h @@ -55,9 +55,6 @@ public: int m_prevDistance; QPoint m_previousInputPos; - GLfloat m_defaultXRotation; - GLfloat m_defaultYRotation; - private: QAbstract3DInputHandler::InputView m_inputView; QPoint m_inputPosition; diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp index d40fbf5a..90201115 100644 --- a/src/datavisualization/input/qtouch3dinputhandler.cpp +++ b/src/datavisualization/input/qtouch3dinputhandler.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "qtouch3dinputhandler_p.h" -#include "q3dcamera_p.h" #include #include diff --git a/src/datavisualization/utils/abstractobjecthelper_p.h b/src/datavisualization/utils/abstractobjecthelper_p.h index 3220b37d..c1618909 100644 --- a/src/datavisualization/utils/abstractobjecthelper_p.h +++ b/src/datavisualization/utils/abstractobjecthelper_p.h @@ -30,7 +30,6 @@ #define ABSTRACTOBJECTHELPER_H #include "datavisualizationglobal_p.h" -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/camerahelper_p.h b/src/datavisualization/utils/camerahelper_p.h index f410ceb5..89dd48f4 100644 --- a/src/datavisualization/utils/camerahelper_p.h +++ b/src/datavisualization/utils/camerahelper_p.h @@ -33,9 +33,7 @@ #include "q3dcamera.h" class QMatrix4x4; -class QVector3D; class QPoint; -class QPointF; QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp index 8cbf2aa2..30f119f2 100644 --- a/src/datavisualization/utils/objecthelper.cpp +++ b/src/datavisualization/utils/objecthelper.cpp @@ -19,7 +19,6 @@ #include "meshloader_p.h" #include "vertexindexer_p.h" #include "objecthelper_p.h" -#include "abstractobjecthelper_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/objecthelper_p.h b/src/datavisualization/utils/objecthelper_p.h index 93dc6c94..1c3217b7 100644 --- a/src/datavisualization/utils/objecthelper_p.h +++ b/src/datavisualization/utils/objecthelper_p.h @@ -31,7 +31,6 @@ #include "datavisualizationglobal_p.h" #include "abstractobjecthelper_p.h" -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/shaderhelper_p.h b/src/datavisualization/utils/shaderhelper_p.h index ced27572..fdef0dff 100644 --- a/src/datavisualization/utils/shaderhelper_p.h +++ b/src/datavisualization/utils/shaderhelper_p.h @@ -30,7 +30,6 @@ #define SHADERHELPER_P_H #include "datavisualizationglobal_p.h" -#include class QOpenGLShaderProgram; diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp index 96d04094..088bb150 100644 --- a/src/datavisualization/utils/surfaceobject.cpp +++ b/src/datavisualization/utils/surfaceobject.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "surfaceobject_p.h" -#include "abstractobjecthelper_p.h" #include "surface3drenderer_p.h" #include diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp index 185d99e4..4ea808a5 100644 --- a/src/datavisualization/utils/texturehelper.cpp +++ b/src/datavisualization/utils/texturehelper.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "texturehelper_p.h" -#include "utils_p.h" #include #include diff --git a/src/datavisualization/utils/texturehelper_p.h b/src/datavisualization/utils/texturehelper_p.h index 206cd291..aec137a4 100644 --- a/src/datavisualization/utils/texturehelper_p.h +++ b/src/datavisualization/utils/texturehelper_p.h @@ -30,7 +30,6 @@ #define TEXTUREHELPER_P_H #include "datavisualizationglobal_p.h" -#include #include #include diff --git a/src/datavisualization/utils/utils.cpp b/src/datavisualization/utils/utils.cpp index 7343148d..5852bf11 100644 --- a/src/datavisualization/utils/utils.cpp +++ b/src/datavisualization/utils/utils.cpp @@ -18,12 +18,7 @@ #include "utils_p.h" -#include #include -#include -#include -#include -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/utils_p.h b/src/datavisualization/utils/utils_p.h index a7c73731..d7187c16 100644 --- a/src/datavisualization/utils/utils_p.h +++ b/src/datavisualization/utils/utils_p.h @@ -31,12 +31,6 @@ #include "datavisualizationglobal_p.h" -class QVector3D; -class QColor; -class QPainter; -class QString; -class QPoint; -class QImage; class QLinearGradient; QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -55,8 +49,6 @@ public: static QVector4D vectorFromColor(const QColor &color); static QColor colorFromVector(const QVector3D &colorVector); static QColor colorFromVector(const QVector4D &colorVector); - static void printText(QPainter *painter, const QString &text, const QSize &position, - bool absoluteCoords = true, float rotation = 0.0f, float scale = 1.0f); static QImage printTextToImage(const QFont &font, const QString &text, const QColor &bgrColor, -- cgit v1.2.3 From 51c5836ccb6d9f71b4f6301e1e9834aa8b95f975 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 30 May 2014 12:01:42 +0300 Subject: Flip surface normals if either rows or columns are descending If both are descending or ascending, do not flip. Flip is needed to make specular highlight work correctly. Task-number: QTRD-3156 Change-Id: Ida256ee4ff96553c6f1cd5bf94e71d2e95ce7cf4 Reviewed-by: Titta Heikkala Reviewed-by: Mika Salmela --- src/datavisualization/utils/surfaceobject.cpp | 75 ++++++++++++++++++++------- src/datavisualization/utils/surfaceobject_p.h | 3 +- 2 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/datavisualization/utils/surfaceobject.cpp b/src/datavisualization/utils/surfaceobject.cpp index 088bb150..d999ba90 100644 --- a/src/datavisualization/utils/surfaceobject.cpp +++ b/src/datavisualization/utils/surfaceobject.cpp @@ -101,25 +101,30 @@ void SurfaceObject::setUpSmoothData(const QSurfaceDataArray &dataArray, const QR m_normals.resize(totalSize); totalIndex = 0; + const bool flipNormal = checkFlipNormal(dataArray); for (int row = 0; row < rowColLimit; row += m_columns) { for (int j = 0; j < colLimit; j++) { m_normals[totalIndex++] = normal(m_vertices.at(row + j), m_vertices.at(row + j + 1), - m_vertices.at(row + m_columns + j)); + m_vertices.at(row + m_columns + j), + flipNormal); } int p = row + colLimit; m_normals[totalIndex++] = normal(m_vertices.at(p), m_vertices.at(p + m_columns), - m_vertices.at(p - 1)); + m_vertices.at(p - 1), + flipNormal); } for (int j = rowColLimit; j < totalLimit; j++) { m_normals[totalIndex++] = normal(m_vertices.at(j), m_vertices.at(j - m_columns), - m_vertices.at(j + 1)); + m_vertices.at(j + 1), + flipNormal); } m_normals[totalIndex++] = normal(m_vertices.at(totalLimit), m_vertices.at(totalLimit - 1), - m_vertices.at(totalLimit - m_columns)); + m_vertices.at(totalLimit - m_columns), + flipNormal); // Create indices table if (changeGeometry) @@ -156,18 +161,21 @@ void SurfaceObject::updateSmoothRow(const QSurfaceDataArray &dataArray, int rowI if (rowIndex == m_rows - 1) rowLimit = rowIndex * m_columns; // The rowIndex is top most row, special handling + const bool flipNormal = checkFlipNormal(dataArray); for (int row = totalIndex; row < rowLimit; row += m_columns) { for (int j = 0; j < colLimit; j++) { // One right and one up m_normals[totalIndex++] = normal(m_vertices.at(row + j), m_vertices.at(row + j + 1), - m_vertices.at(row + m_columns + j)); + m_vertices.at(row + m_columns + j), + flipNormal); } int p = row + colLimit; // One up and one left m_normals[totalIndex++] = normal(m_vertices.at(p), m_vertices.at(p + m_columns), - m_vertices.at(p - 1)); + m_vertices.at(p - 1), + flipNormal); } if (rowIndex == m_rows - 1) { // Top most line, nothing above, must have different handling. @@ -176,13 +184,15 @@ void SurfaceObject::updateSmoothRow(const QSurfaceDataArray &dataArray, int rowI for (int j = rowIndex * m_columns; j < rowLimit; j++) { m_normals[totalIndex++] = normal(m_vertices.at(j), m_vertices.at(j - m_columns), - m_vertices.at(j + 1)); + m_vertices.at(j + 1), + flipNormal); } // Top left corner. Take from one left and one down m_normals[totalIndex++] = normal(m_vertices.at(rowLimit), m_vertices.at(rowLimit - 1), - m_vertices.at(rowLimit - m_columns)); + m_vertices.at(rowLimit - m_columns), + flipNormal); } } @@ -205,6 +215,7 @@ void SurfaceObject::updateSmoothItem(const QSurfaceDataArray &dataArray, int row int rightCol = m_columns - 1; int topRow = m_rows - 1; + const bool flipNormal = checkFlipNormal(dataArray); for (int i = startRow; i <= row; i++) { for (int j = startCol; j <= column; j++) { int p = i * m_columns + j; @@ -213,12 +224,14 @@ void SurfaceObject::updateSmoothItem(const QSurfaceDataArray &dataArray, int row // One right and one up m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p + 1), - m_vertices.at(p + m_columns)); + m_vertices.at(p + m_columns), + flipNormal); } else { // Last item, nothing on the right. One up and one left m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p + m_columns), - m_vertices.at(p - 1)); + m_vertices.at(p - 1), + flipNormal); } } else { // Top most line, nothing above, must have different handling. @@ -226,12 +239,14 @@ void SurfaceObject::updateSmoothItem(const QSurfaceDataArray &dataArray, int row // Take from one down and one right. Read till second-to-last m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p - m_columns), - m_vertices.at(p + 1)); + m_vertices.at(p + 1), + flipNormal); } else { // Top left corner. Take from one left and one down m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p - 1), - m_vertices.at(p - m_columns)); + m_vertices.at(p - m_columns), + flipNormal); } } } @@ -383,6 +398,7 @@ void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &s } totalIndex = 0; + const bool flipNormal = checkFlipNormal(dataArray); for (int row = 0, upperRow = doubleColumns; row < rowColLimit; row += doubleColumns, upperRow += doubleColumns) { @@ -390,12 +406,14 @@ void SurfaceObject::setUpData(const QSurfaceDataArray &dataArray, const QRect &s // Normal for the left triangle m_normals[totalIndex++] = normal(m_vertices.at(row + j), m_vertices.at(row + j + 1), - m_vertices.at(upperRow + j)); + m_vertices.at(upperRow + j), + flipNormal); // Normal for the right triangle m_normals[totalIndex++] = normal(m_vertices.at(row + j + 1), m_vertices.at(upperRow + j + 1), - m_vertices.at(upperRow + j)); + m_vertices.at(upperRow + j), + flipNormal); if (changeGeometry) { // Left triangle @@ -448,6 +466,7 @@ void SurfaceObject::updateCoarseRow(const QSurfaceDataArray &dataArray, int rowI int rowLimit = (rowIndex + 1) * doubleColumns; if (rowIndex == m_rows - 1) rowLimit = rowIndex * doubleColumns; //Topmost row, no normals + const bool flipNormal = checkFlipNormal(dataArray); for (int row = p, upperRow = p + doubleColumns; row < rowLimit; row += doubleColumns, upperRow += doubleColumns) { @@ -455,12 +474,14 @@ void SurfaceObject::updateCoarseRow(const QSurfaceDataArray &dataArray, int rowI // Normal for the left triangle m_normals[p++] = normal(m_vertices.at(row + j), m_vertices.at(row + j + 1), - m_vertices.at(upperRow + j)); + m_vertices.at(upperRow + j), + flipNormal); // Normal for the right triangle m_normals[p++] = normal(m_vertices.at(row + j + 1), m_vertices.at(upperRow + j + 1), - m_vertices.at(upperRow + j)); + m_vertices.at(upperRow + j), + flipNormal); } } } @@ -494,19 +515,22 @@ void SurfaceObject::updateCoarseItem(const QSurfaceDataArray &dataArray, int row if (column == m_columns - 1) column--; + const bool flipNormal = checkFlipNormal(dataArray); for (int i = startRow; i <= row; i++) { for (int j = startCol; j <= column; j++) { p = i * doubleColumns + j * 2; // Normal for the left triangle m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p + 1), - m_vertices.at(p + doubleColumns)); + m_vertices.at(p + doubleColumns), + flipNormal); p++; // Normal for the right triangle m_normals[p] = normal(m_vertices.at(p), m_vertices.at(p + doubleColumns), - m_vertices.at(p + doubleColumns - 1)); + m_vertices.at(p + doubleColumns - 1), + flipNormal); } } } @@ -642,6 +666,13 @@ void SurfaceObject::createBuffers(const QVector &vertices, const QVec m_meshDataLoaded = true; } +bool SurfaceObject::checkFlipNormal(const QSurfaceDataArray &array) +{ + const bool ascendingX = array.at(0)->at(0).x() < array.at(0)->at(array.at(0)->size() - 1).x(); + const bool ascendingZ = array.at(0)->at(0).z() < array.at(array.size() - 1)->at(0).z(); + return ascendingX != ascendingZ; +} + GLuint SurfaceObject::gridElementBuf() { if (!m_meshDataLoaded) @@ -676,11 +707,15 @@ void SurfaceObject::clear() m_normals.clear(); } -QVector3D SurfaceObject::normal(const QVector3D &a, const QVector3D &b, const QVector3D &c) +QVector3D SurfaceObject::normal(const QVector3D &a, const QVector3D &b, const QVector3D &c, + bool flipNormal) { QVector3D v1 = b - a; QVector3D v2 = c - a; - return QVector3D::crossProduct(v1, v2); + QVector3D normal = QVector3D::crossProduct(v1, v2); + if (flipNormal) + normal *= -1; + return normal; } QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/surfaceobject_p.h b/src/datavisualization/utils/surfaceobject_p.h index c8f7de95..9c18dcb2 100644 --- a/src/datavisualization/utils/surfaceobject_p.h +++ b/src/datavisualization/utils/surfaceobject_p.h @@ -72,10 +72,11 @@ public: void clear(); private: - QVector3D normal(const QVector3D &a, const QVector3D &b, const QVector3D &c); + QVector3D normal(const QVector3D &a, const QVector3D &b, const QVector3D &c, bool flipNormal); void createBuffers(const QVector &vertices, const QVector &uvs, const QVector &normals, const GLint *indices, bool changeGeometry); + bool checkFlipNormal(const QSurfaceDataArray &array); private: SurfaceType m_surfaceType; -- cgit v1.2.3 From 0dedc62bbc09514a50400182402df46a273a7c3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Tue, 3 Jun 2014 12:55:12 +0300 Subject: Clean up declarative MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: Icaa8aba25a5041268709f625c3d1b0be91fab069 Change-Id: Icaa8aba25a5041268709f625c3d1b0be91fab069 Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/abstractdeclarative.cpp | 1 - src/datavisualizationqml2/abstractdeclarative_p.h | 3 --- src/datavisualizationqml2/declarativebars.cpp | 3 --- src/datavisualizationqml2/declarativebars_p.h | 5 ----- src/datavisualizationqml2/declarativerendernode.cpp | 2 -- src/datavisualizationqml2/declarativerendernode_p.h | 4 ---- src/datavisualizationqml2/declarativescatter.cpp | 2 -- src/datavisualizationqml2/declarativescatter_p.h | 3 --- src/datavisualizationqml2/declarativeseries.cpp | 12 ++++++------ src/datavisualizationqml2/declarativesurface.cpp | 3 --- src/datavisualizationqml2/declarativesurface_p.h | 3 --- src/datavisualizationqml2/enumtostringmap.cpp | 5 +++-- src/datavisualizationqml2/glstatestore.cpp | 1 + src/datavisualizationqml2/glstatestore_p.h | 2 -- 14 files changed, 10 insertions(+), 39 deletions(-) diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 9805cfb4..04c41964 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -17,7 +17,6 @@ ****************************************************************************/ #include "abstractdeclarative_p.h" -#include "qvalue3daxis.h" #include "declarativetheme_p.h" #include "declarativerendernode_p.h" diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index c2f9ee08..ce19edd2 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -31,12 +31,9 @@ #include "datavisualizationglobal_p.h" #include "abstract3dcontroller_p.h" -#include "qabstract3dinputhandler.h" #include "declarativescene_p.h" -#include #include -#include #include #include diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index 4f984c32..f2ad2435 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -17,9 +17,6 @@ ****************************************************************************/ #include "declarativebars_p.h" -#include "qvalue3daxis.h" -#include "qitemmodelbardataproxy.h" -#include "declarativescene_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativebars_p.h b/src/datavisualizationqml2/declarativebars_p.h index ae44e2ab..52690813 100644 --- a/src/datavisualizationqml2/declarativebars_p.h +++ b/src/datavisualizationqml2/declarativebars_p.h @@ -32,11 +32,6 @@ #include "datavisualizationglobal_p.h" #include "abstractdeclarative_p.h" #include "bars3dcontroller_p.h" -#include "declarativebars_p.h" -#include "qvalue3daxis.h" -#include "qcategory3daxis.h" -#include "qbardataproxy.h" -#include "qbar3dseries.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativerendernode.cpp b/src/datavisualizationqml2/declarativerendernode.cpp index 1f6d4b56..d42ceb03 100644 --- a/src/datavisualizationqml2/declarativerendernode.cpp +++ b/src/datavisualizationqml2/declarativerendernode.cpp @@ -17,9 +17,7 @@ ****************************************************************************/ #include "declarativerendernode_p.h" -#include "abstract3dcontroller_p.h" #include "abstractdeclarative_p.h" -#include #include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativerendernode_p.h b/src/datavisualizationqml2/declarativerendernode_p.h index e35791d4..a7ede03a 100644 --- a/src/datavisualizationqml2/declarativerendernode_p.h +++ b/src/datavisualizationqml2/declarativerendernode_p.h @@ -33,12 +33,8 @@ #include #include -#include #include -class QOpenGLContext; -class QOpenGLFramebufferObject; - QT_BEGIN_NAMESPACE_DATAVISUALIZATION class Abstract3DController; diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp index dcc52a3d..50ec9384 100644 --- a/src/datavisualizationqml2/declarativescatter.cpp +++ b/src/datavisualizationqml2/declarativescatter.cpp @@ -17,8 +17,6 @@ ****************************************************************************/ #include "declarativescatter_p.h" -#include "qitemmodelscatterdataproxy.h" -#include "declarativescene_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativescatter_p.h b/src/datavisualizationqml2/declarativescatter_p.h index 79b56e02..370750ea 100644 --- a/src/datavisualizationqml2/declarativescatter_p.h +++ b/src/datavisualizationqml2/declarativescatter_p.h @@ -32,9 +32,6 @@ #include "datavisualizationglobal_p.h" #include "abstractdeclarative_p.h" #include "scatter3dcontroller_p.h" -#include "declarativescatter_p.h" -#include "qvalue3daxis.h" -#include "qscatterdataproxy.h" #include "qscatter3dseries.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativeseries.cpp b/src/datavisualizationqml2/declarativeseries.cpp index 21555f45..661f87ba 100644 --- a/src/datavisualizationqml2/declarativeseries.cpp +++ b/src/datavisualizationqml2/declarativeseries.cpp @@ -17,14 +17,12 @@ ****************************************************************************/ #include "declarativeseries_p.h" -#include "qbardataproxy.h" -#include "qscatterdataproxy.h" -#include "qsurfacedataproxy.h" #include QT_BEGIN_NAMESPACE_DATAVISUALIZATION -static void setSeriesGradient(QAbstract3DSeries *series, const ColorGradient &gradient, GradientType type) +static void setSeriesGradient(QAbstract3DSeries *series, const ColorGradient &gradient, + GradientType type) { QLinearGradient newGradient; QGradientStops stops; @@ -198,7 +196,8 @@ QQmlListProperty DeclarativeScatter3DSeries::seriesChildren() , 0, 0, 0); } -void DeclarativeScatter3DSeries::appendSeriesChildren(QQmlListProperty *list, QObject *element) +void DeclarativeScatter3DSeries::appendSeriesChildren(QQmlListProperty *list, + QObject *element) { QScatterDataProxy *proxy = qobject_cast(element); if (proxy) @@ -293,7 +292,8 @@ QQmlListProperty DeclarativeSurface3DSeries::seriesChildren() , 0, 0, 0); } -void DeclarativeSurface3DSeries::appendSeriesChildren(QQmlListProperty *list, QObject *element) +void DeclarativeSurface3DSeries::appendSeriesChildren(QQmlListProperty *list, + QObject *element) { QSurfaceDataProxy *proxy = qobject_cast(element); if (proxy) diff --git a/src/datavisualizationqml2/declarativesurface.cpp b/src/datavisualizationqml2/declarativesurface.cpp index 78519586..3075d207 100644 --- a/src/datavisualizationqml2/declarativesurface.cpp +++ b/src/datavisualizationqml2/declarativesurface.cpp @@ -17,9 +17,6 @@ ****************************************************************************/ #include "declarativesurface_p.h" -#include "qvalue3daxis.h" -#include "qitemmodelsurfacedataproxy.h" -#include "declarativescene_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/declarativesurface_p.h b/src/datavisualizationqml2/declarativesurface_p.h index a4747167..6fe800ba 100644 --- a/src/datavisualizationqml2/declarativesurface_p.h +++ b/src/datavisualizationqml2/declarativesurface_p.h @@ -32,9 +32,6 @@ #include "datavisualizationglobal_p.h" #include "abstractdeclarative_p.h" #include "surface3dcontroller_p.h" -#include "declarativesurface_p.h" -#include "qvalue3daxis.h" -#include "qsurfacedataproxy.h" #include "qsurface3dseries.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualizationqml2/enumtostringmap.cpp b/src/datavisualizationqml2/enumtostringmap.cpp index ebd89981..99399482 100644 --- a/src/datavisualizationqml2/enumtostringmap.cpp +++ b/src/datavisualizationqml2/enumtostringmap.cpp @@ -15,12 +15,13 @@ ** contact form at http://qt.digia.com ** ****************************************************************************/ + #include "enumtostringmap_p.h" -#include -#include #ifdef VERBOSE_STATE_STORE +#include + static EnumToStringMap *theInstance = 0; static unsigned int theInstanceCount = 0; diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp index c590a4c1..35897cf5 100644 --- a/src/datavisualizationqml2/glstatestore.cpp +++ b/src/datavisualizationqml2/glstatestore.cpp @@ -15,6 +15,7 @@ ** contact form at http://qt.digia.com ** ****************************************************************************/ + #include "glstatestore_p.h" #include #include diff --git a/src/datavisualizationqml2/glstatestore_p.h b/src/datavisualizationqml2/glstatestore_p.h index c5023657..4add606b 100644 --- a/src/datavisualizationqml2/glstatestore_p.h +++ b/src/datavisualizationqml2/glstatestore_p.h @@ -29,9 +29,7 @@ #ifndef GLSTATESTORE_P_H #define GLSTATESTORE_P_H -#include #include -#include #include #include "enumtostringmap_p.h" -- cgit v1.2.3 From f667d18c842088d72b1b7a8f7b73d720e7647be3 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 3 Jun 2014 12:45:17 +0300 Subject: Fix surface shadows and other misc fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove culling from surface shadows to make them look correct - Remove unnecessary metatype registration from qmloscilloscope - itemmodeltest multi-change fixed - Valgrind fixes Task-number: QTRD-3160 Change-Id: I2da8b3e024dae56c52afb6b915535f49c6c987fc Reviewed-by: Tomi Korpipää --- examples/datavisualization/qmloscilloscope/datasource.cpp | 2 -- examples/datavisualization/qmloscilloscope/datasource.h | 1 - .../datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc | 4 ++-- src/datavisualization/engine/surface3drenderer.cpp | 3 --- src/datavisualization/input/qabstract3dinputhandler.cpp | 3 ++- tests/itemmodeltest/main.cpp | 4 +++- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmloscilloscope/datasource.cpp index 40ebd962..f466b2b0 100644 --- a/examples/datavisualization/qmloscilloscope/datasource.cpp +++ b/examples/datavisualization/qmloscilloscope/datasource.cpp @@ -23,7 +23,6 @@ using namespace QtDataVisualization; //! [3] Q_DECLARE_METATYPE(QSurface3DSeries *) -Q_DECLARE_METATYPE(QValue3DAxis *) //! [3] DataSource::DataSource(QObject *parent) : @@ -33,7 +32,6 @@ DataSource::DataSource(QObject *parent) : { //! [4] qRegisterMetaType(); - qRegisterMetaType(); //! [4] } diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h index 76ba7c9c..483523e0 100644 --- a/examples/datavisualization/qmloscilloscope/datasource.h +++ b/examples/datavisualization/qmloscilloscope/datasource.h @@ -20,7 +20,6 @@ #define DATASOURCE_H #include -#include using namespace QtDataVisualization; diff --git a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc index 93bd5c30..e13320c3 100644 --- a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc +++ b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc @@ -64,9 +64,9 @@ \snippet qmloscilloscope/main.cpp 0 - To make it possible to use Qt Data Visualization class pointers as parameters on the + To make it possible to use QSurface3DSeries pointers as parameters on the \c DataSource class methods on all environments and builds, we need to make sure the meta - types are registered: + type is registered: \snippet qmloscilloscope/datasource.cpp 3 \dots 0 diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index c7856834..f65ec634 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -1126,9 +1126,6 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) } } - glEnable(GL_CULL_FACE); - glCullFace(GL_FRONT); - Abstract3DRenderer::drawCustomItems(RenderingDepth, m_depthShader, viewMatrix, projectionViewMatrix, depthProjectionViewMatrix, m_depthTexture, m_shadowQualityToShader); diff --git a/src/datavisualization/input/qabstract3dinputhandler.cpp b/src/datavisualization/input/qabstract3dinputhandler.cpp index cb7d576b..c063ae58 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.cpp +++ b/src/datavisualization/input/qabstract3dinputhandler.cpp @@ -230,7 +230,8 @@ QAbstract3DInputHandlerPrivate::QAbstract3DInputHandlerPrivate(QAbstract3DInputH m_previousInputPos(QPoint(0,0)), m_inputView(QAbstract3DInputHandler::InputViewNone), m_inputPosition(QPoint(0,0)), - m_scene(0) + m_scene(0), + m_isDefaultHandler(false) { } diff --git a/tests/itemmodeltest/main.cpp b/tests/itemmodeltest/main.cpp index 38454948..b2231594 100644 --- a/tests/itemmodeltest/main.cpp +++ b/tests/itemmodeltest/main.cpp @@ -226,8 +226,10 @@ void GraphDataGenerator::changeSelectedButtonClicked() QVariant value = QVariant::fromValue(float((rand() % 10) + 1)); QList selectedItems = m_tableWidget->selectedItems(); foreach (QTableWidgetItem *item, selectedItems) { + QString oldData = item->data(Qt::DisplayRole).toString(); item->setData(Qt::DisplayRole, - QString::number(value.toReal()) + oldData.left(5) + .append(QString::number(value.toReal())) .append("/") .append(QString::number(value.toReal() * 10))); } -- cgit v1.2.3 From a02662d8df3b0de1e5e236fe10a09f756b0e25cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 07:39:55 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I97424ac30cb87e896613a3bb4a7d80925d2ad4be Change-Id: I97424ac30cb87e896613a3bb4a7d80925d2ad4be Reviewed-by: Tomi Korpipää --- src/datavisualization/data/qabstract3dseries.cpp | 3 ++- src/datavisualization/data/qbardataproxy.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index b4b49d1e..7655bbd8 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -646,7 +646,8 @@ bool QAbstract3DSeries::isItemLabelVisible() const // QAbstract3DSeriesPrivate -QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, QAbstract3DSeries::SeriesType type) +QAbstract3DSeriesPrivate::QAbstract3DSeriesPrivate(QAbstract3DSeries *q, + QAbstract3DSeries::SeriesType type) : QObject(0), q_ptr(q), m_type(type), diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp index 1723b2a4..6fc65193 100644 --- a/src/datavisualization/data/qbardataproxy.cpp +++ b/src/datavisualization/data/qbardataproxy.cpp @@ -553,7 +553,8 @@ void QBarDataProxyPrivate::setRow(int rowIndex, QBarDataRow *row, const QString } } -void QBarDataProxyPrivate::setRows(int rowIndex, const QBarDataArray &rows, const QStringList *labels) +void QBarDataProxyPrivate::setRows(int rowIndex, const QBarDataArray &rows, + const QStringList *labels) { QBarDataArray &dataArray = *m_dataArray; Q_ASSERT(rowIndex >= 0 && (rowIndex + rows.size()) <= dataArray.size()); @@ -603,7 +604,8 @@ void QBarDataProxyPrivate::insertRow(int rowIndex, QBarDataRow *row, const QStri m_dataArray->insert(rowIndex, row); } -void QBarDataProxyPrivate::insertRows(int rowIndex, const QBarDataArray &rows, const QStringList *labels) +void QBarDataProxyPrivate::insertRows(int rowIndex, const QBarDataArray &rows, + const QStringList *labels) { Q_ASSERT(rowIndex >= 0 && rowIndex <= m_dataArray->size()); if (labels) @@ -655,7 +657,8 @@ void QBarDataProxyPrivate::clearArray() * \internal * Fixes the row label array to include specified labels. */ -void QBarDataProxyPrivate::fixRowLabels(int startIndex, int count, const QStringList &newLabels, bool isInsert) +void QBarDataProxyPrivate::fixRowLabels(int startIndex, int count, const QStringList &newLabels, + bool isInsert) { bool changed = false; int currentSize = m_rowLabels.size(); -- cgit v1.2.3 From 779da0484f409ac93d32e3fdd5af7a30a52883a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 08:07:39 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I37ae7bc7e88b7d8a2c81585333ab87e7fcb8fcc0 Change-Id: I37ae7bc7e88b7d8a2c81585333ab87e7fcb8fcc0 Reviewed-by: Tomi Korpipää --- .../engine/abstract3dcontroller.cpp | 6 ++- .../engine/abstract3drenderer.cpp | 8 ++-- src/datavisualization/engine/bars3dcontroller.cpp | 15 ++++--- src/datavisualization/engine/bars3drenderer.cpp | 47 +++++++++++++--------- src/datavisualization/engine/q3dcamera.cpp | 16 +++++--- src/datavisualization/engine/qabstract3dgraph.cpp | 3 +- .../engine/surface3dcontroller.cpp | 3 +- src/datavisualization/engine/surface3drenderer.cpp | 18 +++++---- 8 files changed, 72 insertions(+), 44 deletions(-) diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index e7f5f5f8..df63ea42 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -582,7 +582,8 @@ void Abstract3DController::handleThemeSingleHighlightColorChanged(const QColor & markSeriesVisualsDirty(); } -void Abstract3DController::handleThemeSingleHighlightGradientChanged(const QLinearGradient &gradient) +void Abstract3DController::handleThemeSingleHighlightGradientChanged( + const QLinearGradient &gradient) { // Set value for series that have not explicitly set this value foreach (QAbstract3DSeries *series, m_seriesList) { @@ -1361,7 +1362,8 @@ void Abstract3DController::setAxisHelper(QAbstract3DAxis::AxisOrientation orient } } -QAbstract3DAxis *Abstract3DController::createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation) +QAbstract3DAxis *Abstract3DController::createDefaultAxis( + QAbstract3DAxis::AxisOrientation orientation) { Q_UNUSED(orientation) diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 0d7aa3c3..18719483 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -309,8 +309,9 @@ void Abstract3DRenderer::calculateZoomLevel() GLfloat div; GLfloat zoomAdjustment; div = qMin(m_primarySubViewport.width(), m_primarySubViewport.height()); - zoomAdjustment = 2.0f * defaultRatio * ((m_primarySubViewport.width() / div) - / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; + zoomAdjustment = 2.0f * defaultRatio + * ((m_primarySubViewport.width() / div) + / (m_primarySubViewport.height() / div)) / m_graphAspectRatio; m_autoScaleAdjustment = qMin(zoomAdjustment, 1.0f); // clamp to 1.0f } @@ -794,7 +795,8 @@ void Abstract3DRenderer::generateBaseColorTexture(const QColor &color, GLuint *t *texture = m_textureHelper->createUniformTexture(color); } -void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, GLuint *gradientTexture) +void Abstract3DRenderer::fixGradientAndGenerateTexture(QLinearGradient *gradient, + GLuint *gradientTexture) { // Readjust start/stop to match gradient texture size gradient->setStart(qreal(gradientTextureWidth), qreal(gradientTextureHeight)); diff --git a/src/datavisualization/engine/bars3dcontroller.cpp b/src/datavisualization/engine/bars3dcontroller.cpp index 76e6793e..3a240c24 100644 --- a/src/datavisualization/engine/bars3dcontroller.cpp +++ b/src/datavisualization/engine/bars3dcontroller.cpp @@ -584,7 +584,8 @@ void Bars3DController::adjustAxisRanges() int seriesCount = m_seriesList.size(); if (adjustZ || adjustX) { for (int series = 0; series < seriesCount; series++) { - const QBar3DSeries *barSeries = static_cast(m_seriesList.at(series)); + const QBar3DSeries *barSeries = + static_cast(m_seriesList.at(series)); if (barSeries->isVisible()) { const QBarDataProxy *proxy = barSeries->dataProxy(); @@ -620,14 +621,16 @@ void Bars3DController::adjustAxisRanges() // Now that we know the row and column ranges, figure out the value axis range if (adjustY) { for (int series = 0; series < seriesCount; series++) { - const QBar3DSeries *barSeries = static_cast(m_seriesList.at(series)); + const QBar3DSeries *barSeries = + static_cast(m_seriesList.at(series)); if (barSeries->isVisible()) { const QBarDataProxy *proxy = barSeries->dataProxy(); if (adjustY && proxy) { - QPair limits = proxy->dptrc()->limitValues(categoryAxisZ->min(), - categoryAxisZ->max(), - categoryAxisX->min(), - categoryAxisX->max()); + QPair limits = + proxy->dptrc()->limitValues(categoryAxisZ->min(), + categoryAxisZ->max(), + categoryAxisX->min(), + categoryAxisX->max()); if (!series) { // First series initializes the values minValue = limits.first; diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index 30be2eae..3805e760 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -549,7 +549,8 @@ void Bars3DRenderer::drawSlicedScene() itModelMatrix.inverted().transposed()); lineShader->setUniformValue(lineShader->MVP(), MVPMatrix); lineShader->setUniformValue(lineShader->color(), - Utils::vectorFromColor(m_cachedTheme->labelTextColor())); + Utils::vectorFromColor( + m_cachedTheme->labelTextColor())); // Draw the object #if !(defined QT_OPENGL_ES_2) @@ -810,10 +811,13 @@ void Bars3DRenderer::drawSlicedScene() m_drawer->generateLabelItem(item.sliceLabelItem(), item.sliceLabel()); m_updateLabels = false; } - Qt::AlignmentFlag alignment = (item.height() > 0) ? Qt::AlignLeft : Qt::AlignRight; - Drawer::LabelPosition labelPos = (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + Qt::AlignmentFlag alignment = + (item.height() > 0) ? Qt::AlignLeft : Qt::AlignRight; + Drawer::LabelPosition labelPos = + (item.height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(item.translation().x(), - barPosYAdjustment - zeroPosAdjustment + barPosYAdjustment + - zeroPosAdjustment + item.height(), item.translation().z())); @@ -837,7 +841,8 @@ void Bars3DRenderer::drawSlicedScene() m_updateLabels = false; } Qt::AlignmentFlag alignment = (selectedItem->height() > 0) ? Qt::AlignLeft : Qt::AlignRight; - Drawer::LabelPosition labelPos = (selectedItem->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; + Drawer::LabelPosition labelPos = + (selectedItem->height() < 0) ? Drawer::LabelBelow : Drawer::LabelOver; m_dummyBarRenderItem.setTranslation(QVector3D(selectedItem->translation().x(), barPosYAdjustment - zeroPosAdjustment + selectedItem->height(), @@ -854,22 +859,24 @@ void Bars3DRenderer::drawSlicedScene() if (rowMode) { if (m_sliceTitleItem) { m_drawer->drawLabel(*dummyItem, sliceSelectionLabel, viewMatrix, projectionMatrix, - positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, Drawer::LabelTop, - Qt::AlignCenter, true); + positionComp, identityQuaternion, 0, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, false, false, + Drawer::LabelTop, Qt::AlignCenter, true); } m_drawer->drawLabel(*dummyItem, m_axisCacheX.titleItem(), viewMatrix, projectionMatrix, - positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, false, false, Drawer::LabelBottom, - Qt::AlignCenter, true); + positionComp, identityQuaternion, 0, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, false, false, + Drawer::LabelBottom, Qt::AlignCenter, true); } else { m_drawer->drawLabel(*dummyItem, m_axisCacheZ.titleItem(), viewMatrix, projectionMatrix, - positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelBottom, Qt::AlignCenter, true); if (m_sliceTitleItem) { m_drawer->drawLabel(*dummyItem, sliceSelectionLabel, viewMatrix, projectionMatrix, - positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, + positionComp, identityQuaternion, 0, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, false, false, Drawer::LabelTop, Qt::AlignCenter, true); } @@ -1256,7 +1263,8 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) QVector4D baseColor; QVector4D barColor; QVector3D modelScaler(m_scaleX * m_seriesScaleX, 0.0f, m_scaleZ * m_seriesScaleZ); - bool somethingSelected = (m_visualSelectedBarPos != Bars3DController::invalidSelectionPosition()); + bool somethingSelected = + (m_visualSelectedBarPos != Bars3DController::invalidSelectionPosition()); foreach (SeriesRenderCache *baseCache, m_renderCacheList) { if (baseCache->isVisible()) { BarSeriesRenderCache *cache = static_cast(baseCache); @@ -1404,8 +1412,9 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_cachedIsSlicingActivated) { QVector3D translation = modelMatrix.column(3).toVector3D(); if (m_visibleSeriesCount > 1) { - translation.setZ((m_columnDepth - ((row + seriesPos) - * (m_cachedBarSpacing.height()))) + translation.setZ((m_columnDepth + - ((row + seriesPos) + * (m_cachedBarSpacing.height()))) / m_scaleFactor); } item.setTranslation(translation); @@ -1447,13 +1456,15 @@ void Bars3DRenderer::drawScene(GLuint defaultFboHandle) if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { // Set shadow shader bindings QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; - barShader->setUniformValue(barShader->shadowQ(), m_shadowQualityToShader); + barShader->setUniformValue(barShader->shadowQ(), + m_shadowQualityToShader); barShader->setUniformValue(barShader->depth(), depthMVPMatrix); barShader->setUniformValue(barShader->lightS(), shadowLightStrength); barShader->setUniformValue(barShader->lightColor(), lightColor); // Draw the object - m_drawer->drawObject(barShader, barObj, gradientTexture, m_depthTexture); + m_drawer->drawObject(barShader, barObj, gradientTexture, + m_depthTexture); } else #else Q_UNUSED(shadowLightStrength); diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp index 8aa8a2e0..831fc994 100644 --- a/src/datavisualization/engine/q3dcamera.cpp +++ b/src/datavisualization/engine/q3dcamera.cpp @@ -205,10 +205,12 @@ float Q3DCamera::xRotation() const { void Q3DCamera::setXRotation(float rotation) { - if (d_ptr->m_wrapXRotation) + if (d_ptr->m_wrapXRotation) { rotation = Utils::wrapValue(rotation, d_ptr->m_minXRotation, d_ptr->m_maxXRotation); - else - rotation = qBound(float(d_ptr->m_minXRotation), float(rotation), float(d_ptr->m_maxXRotation)); + } else { + rotation = qBound(float(d_ptr->m_minXRotation), float(rotation), + float(d_ptr->m_maxXRotation)); + } if (d_ptr->m_xRotation != rotation) { d_ptr->setXRotation(rotation); @@ -232,10 +234,12 @@ float Q3DCamera::yRotation() const { void Q3DCamera::setYRotation(float rotation) { - if (d_ptr->m_wrapYRotation) + if (d_ptr->m_wrapYRotation) { rotation = Utils::wrapValue(rotation, d_ptr->m_minYRotation, d_ptr->m_maxYRotation); - else - rotation = qBound(float(d_ptr->m_minYRotation), float(rotation), float(d_ptr->m_maxYRotation)); + } else { + rotation = qBound(float(d_ptr->m_minYRotation), float(rotation), + float(d_ptr->m_maxYRotation)); + } if (d_ptr->m_yRotation != rotation) { d_ptr->setYRotation(rotation); diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 480307fe..5c31382e 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -187,7 +187,8 @@ QAbstract3DGraph::QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFor #if !defined(QT_OPENGL_ES_2) // If we have real OpenGL, GLSL version must be 1.2 or over. Quit if not. - QStringList splitversionstr = QString::fromLatin1((const char *)shaderVersion).split(QChar::fromLatin1(' ')); + QStringList splitversionstr = + QString::fromLatin1((const char *)shaderVersion).split(QChar::fromLatin1(' ')); if (splitversionstr[0].toFloat() < 1.2) qFatal("GLSL version must be 1.20 or higher. Try installing latest display drivers."); #else diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index e6c25260..c03bafd8 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -200,7 +200,8 @@ void Surface3DController::setSelectionMode(QAbstract3DGraph::SelectionFlags mode } } -void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series, bool enterSlice) +void Surface3DController::setSelectedPoint(const QPoint &position, QSurface3DSeries *series, + bool enterSlice) { // If the selection targets non-existent point, clear selection instead. QPoint pos = position; diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index f65ec634..e193cf67 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -944,9 +944,9 @@ void Surface3DRenderer::drawSlicedScene() // Draw the label here m_dummyRenderItem.setTranslation(labelTrans); m_drawer->drawLabel(m_dummyRenderItem, axisLabelItem, viewMatrix, projectionMatrix, - positionComp, identityQuaternion, 0, m_cachedSelectionMode, m_labelShader, - m_labelObj, activeCamera, true, true, Drawer::LabelMid, - Qt::AlignLeft, true); + positionComp, identityQuaternion, 0, m_cachedSelectionMode, + m_labelShader, m_labelObj, activeCamera, true, true, + Drawer::LabelMid, Qt::AlignLeft, true); } labelNbr++; } @@ -1480,7 +1480,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, yFloorLinePosition, m_axisCacheZ.gridLinePosition(line)); + modelMatrix.translate(0.0f, yFloorLinePosition, + m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaleX); itModelMatrix.scale(gridLineScaleX); @@ -1574,7 +1575,8 @@ void Surface3DRenderer::drawScene(GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, 0.0f); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, + 0.0f); modelMatrix.scale(gridLineScaleZ); itModelMatrix.scale(gridLineScaleZ); @@ -2072,8 +2074,10 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa GLfloat labelMarginZTrans = labelMargin; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; - Qt::AlignmentFlag sideAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag backAlignment = + (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = + (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; -- cgit v1.2.3 From b49bd4aea2265de243e41c19ffa44f04759bcf8d Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 3 Jun 2014 14:15:50 +0300 Subject: Misc fixes found during testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Memory leaks - Y-axis placement issues in scatter and surface Change-Id: I7ec6c9c3e53502445b52c049c973186a7c54c95f Reviewed-by: Titta Heikkala Reviewed-by: Tomi Korpipää --- src/datavisualization/data/baritemmodelhandler.cpp | 2 ++ src/datavisualization/data/surfaceitemmodelhandler.cpp | 2 ++ src/datavisualization/engine/scatter3drenderer.cpp | 2 ++ src/datavisualization/engine/surface3drenderer.cpp | 2 ++ tests/scattertest/scatterchart.cpp | 16 +++++++++++----- tests/scattertest/scatterchart.h | 1 + 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/datavisualization/data/baritemmodelhandler.cpp b/src/datavisualization/data/baritemmodelhandler.cpp index a899ef39..62e6390d 100644 --- a/src/datavisualization/data/baritemmodelhandler.cpp +++ b/src/datavisualization/data/baritemmodelhandler.cpp @@ -282,6 +282,8 @@ void BarItemModelHandler::resolveModel() rowLabels = rowList; columnLabels = columnList; m_columnCount = columnList.size(); + + delete matchCountMap; } m_proxy->resetArray(m_proxyArray, rowLabels, columnLabels); diff --git a/src/datavisualization/data/surfaceitemmodelhandler.cpp b/src/datavisualization/data/surfaceitemmodelhandler.cpp index e3d50a80..e6d1e70d 100644 --- a/src/datavisualization/data/surfaceitemmodelhandler.cpp +++ b/src/datavisualization/data/surfaceitemmodelhandler.cpp @@ -313,6 +313,8 @@ void SurfaceItemModelHandler::resolveModel() newProxyRow[j].setPosition(itemPos); } } + + delete matchCountMap; } m_proxy->resetArray(m_proxyArray); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index f1508193..9a93a7ca 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -1678,6 +1678,8 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheY.isTitleVisible()) { + labelTransSide.setY(0.0f); + labelTransBack.setY(0.0f); drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, totalSideRotation, totalBackRotation, m_dummyRenderItem, activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index e193cf67..09699278 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2157,6 +2157,8 @@ void Surface3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa labelsMaxWidth = qMax(labelsMaxWidth, float(axisLabelItem.size().width())); } if (!drawSelection && m_axisCacheY.isTitleVisible()) { + labelTransSide.setY(0.0f); + labelTransBack.setY(0.0f); drawAxisTitleY(sideLabelRotation, backLabelRotation, labelTransSide, labelTransBack, totalSideRotation, totalBackRotation, m_dummyRenderItem, activeCamera, labelsMaxWidth, viewMatrix, projectionMatrix, diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index dce73e61..e498b2da 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -250,7 +250,7 @@ void ScatterDataModifier::testItemChanges() foreach (QScatter3DSeries *series, m_chart->seriesList()) m_chart->removeSeries(series); foreach (QValue3DAxis *axis, m_chart->axes()) - m_chart->releaseAxis(axis); + deleteAxis(axis); delete series0; delete series1; delete series2; @@ -425,7 +425,7 @@ void ScatterDataModifier::testAxisReverse() foreach (QScatter3DSeries *series, m_chart->seriesList()) m_chart->removeSeries(series); foreach (QValue3DAxis *axis, m_chart->axes()) - m_chart->releaseAxis(axis); + deleteAxis(axis); delete series0; delete series1; series0 = new QScatter3DSeries; @@ -627,11 +627,17 @@ void ScatterDataModifier::clear() qDebug() << m_loopCounter << "Cleared array"; } +void ScatterDataModifier::deleteAxis(QValue3DAxis *axis) +{ + m_chart->releaseAxis(axis); + delete axis; +} + void ScatterDataModifier::resetAxes() { - m_chart->releaseAxis(m_chart->axisX()); - m_chart->releaseAxis(m_chart->axisY()); - m_chart->releaseAxis(m_chart->axisZ()); + deleteAxis(m_chart->axisX()); + deleteAxis(m_chart->axisY()); + deleteAxis(m_chart->axisZ()); m_chart->setAxisX(new QValue3DAxis); m_chart->setAxisY(new QValue3DAxis); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 420c68e3..983b605a 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -102,6 +102,7 @@ private: void populateFlatSeries(QScatter3DSeries *series, int rows, int columns, float value); void populateRisingSeries(QScatter3DSeries *series, int rows, int columns, float minValue, float maxValue); + void deleteAxis(QValue3DAxis *axis); Q3DScatter *m_chart; int m_fontSize; -- cgit v1.2.3 From fb46e6ca7471865789f0f53d96bd105092e2f370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 08:55:00 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: I6d9808afc8f007fee84ddbb6f7c3366fb94cc8d2 Change-Id: I6d9808afc8f007fee84ddbb6f7c3366fb94cc8d2 Reviewed-by: Tomi Korpipää --- src/datavisualizationqml2/declarativebars.cpp | 3 ++- .../declarativerendernode.cpp | 24 ++++++++++++---------- src/datavisualizationqml2/declarativescatter.cpp | 11 +++++----- src/datavisualizationqml2/enumtostringmap.cpp | 6 ++++-- src/datavisualizationqml2/glstatestore.cpp | 18 ++++++++++------ 5 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/datavisualizationqml2/declarativebars.cpp b/src/datavisualizationqml2/declarativebars.cpp index f2ad2435..9670a7db 100644 --- a/src/datavisualizationqml2/declarativebars.cpp +++ b/src/datavisualizationqml2/declarativebars.cpp @@ -87,7 +87,8 @@ bool DeclarativeBars::isMultiSeriesUniform() const void DeclarativeBars::setBarThickness(float thicknessRatio) { if (thicknessRatio != barThickness()) { - m_barsController->setBarSpecs(GLfloat(thicknessRatio), barSpacing(), isBarSpacingRelative()); + m_barsController->setBarSpecs(GLfloat(thicknessRatio), barSpacing(), + isBarSpacingRelative()); emit barThicknessChanged(thicknessRatio); } } diff --git a/src/datavisualizationqml2/declarativerendernode.cpp b/src/datavisualizationqml2/declarativerendernode.cpp index d42ceb03..e9bb65fd 100644 --- a/src/datavisualizationqml2/declarativerendernode.cpp +++ b/src/datavisualizationqml2/declarativerendernode.cpp @@ -24,15 +24,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION DeclarativeRenderNode::DeclarativeRenderNode(AbstractDeclarative *declarative) : QSGGeometryNode(), - m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4), - m_texture(0), - m_declarative(declarative), - m_controller(0), - m_fbo(0), - m_multisampledFBO(0), - m_window(0), - m_samples(0), - m_dirtyFBO(false) + m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4), + m_texture(0), + m_declarative(declarative), + m_controller(0), + m_fbo(0), + m_multisampledFBO(0), + m_window(0), + m_samples(0), + m_dirtyFBO(false) { setMaterial(&m_material); setOpaqueMaterial(&m_materialO); @@ -90,8 +90,10 @@ void DeclarativeRenderNode::updateFBO() QSGGeometry::updateTexturedRectGeometry(&m_geometry, QRectF(0, 0, - m_size.width() / m_controller->scene()->devicePixelRatio(), - m_size.height() / m_controller->scene()->devicePixelRatio()), + m_size.width() + / m_controller->scene()->devicePixelRatio(), + m_size.height() + / m_controller->scene()->devicePixelRatio()), QRectF(0, 1, 1, -1)); delete m_texture; diff --git a/src/datavisualizationqml2/declarativescatter.cpp b/src/datavisualizationqml2/declarativescatter.cpp index 50ec9384..96af6df6 100644 --- a/src/datavisualizationqml2/declarativescatter.cpp +++ b/src/datavisualizationqml2/declarativescatter.cpp @@ -77,13 +77,14 @@ QScatter3DSeries *DeclarativeScatter::selectedSeries() const QQmlListProperty DeclarativeScatter::seriesList() { return QQmlListProperty(this, this, - &DeclarativeScatter::appendSeriesFunc, - &DeclarativeScatter::countSeriesFunc, - &DeclarativeScatter::atSeriesFunc, - &DeclarativeScatter::clearSeriesFunc); + &DeclarativeScatter::appendSeriesFunc, + &DeclarativeScatter::countSeriesFunc, + &DeclarativeScatter::atSeriesFunc, + &DeclarativeScatter::clearSeriesFunc); } -void DeclarativeScatter::appendSeriesFunc(QQmlListProperty *list, QScatter3DSeries *series) +void DeclarativeScatter::appendSeriesFunc(QQmlListProperty *list, + QScatter3DSeries *series) { reinterpret_cast(list->data)->addSeries(series); } diff --git a/src/datavisualizationqml2/enumtostringmap.cpp b/src/datavisualizationqml2/enumtostringmap.cpp index 99399482..b4b04fc2 100644 --- a/src/datavisualizationqml2/enumtostringmap.cpp +++ b/src/datavisualizationqml2/enumtostringmap.cpp @@ -368,7 +368,8 @@ EnumToStringMap::EnumToStringMap() : m_map[GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE] = "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"; m_map[GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME] = "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"; m_map[GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL] = "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"; - m_map[GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE] = "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"; + m_map[GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE] = + "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"; m_map[GL_COLOR_ATTACHMENT0] = "COLOR_ATTACHMENT0"; m_map[GL_DEPTH_ATTACHMENT] = "DEPTH_ATTACHMENT"; @@ -376,7 +377,8 @@ EnumToStringMap::EnumToStringMap() : m_map[GL_FRAMEBUFFER_COMPLETE] = "FRAMEBUFFER_COMPLETE"; m_map[GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT] = "FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; - m_map[GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT] = "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; + m_map[GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT] = + "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; m_map[GL_FRAMEBUFFER_UNSUPPORTED] = "FRAMEBUFFER_UNSUPPORTED"; m_map[GL_FRAMEBUFFER_BINDING] = "FRAMEBUFFER_BINDING"; diff --git a/src/datavisualizationqml2/glstatestore.cpp b/src/datavisualizationqml2/glstatestore.cpp index 35897cf5..973d5054 100644 --- a/src/datavisualizationqml2/glstatestore.cpp +++ b/src/datavisualizationqml2/glstatestore.cpp @@ -112,11 +112,14 @@ void GLStateStore::storeGLState() glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &m_boundElementArrayBuffer); for (int i = 0; i < m_maxVertexAttribs;i++) { - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &m_vertexAttribArrayEnabledStates[i]); - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &m_vertexAttribArrayBoundBuffers[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, + &m_vertexAttribArrayEnabledStates[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, + &m_vertexAttribArrayBoundBuffers[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &m_vertexAttribArraySizes[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &m_vertexAttribArrayTypes[i]); - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &m_vertexAttribArrayNormalized[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + &m_vertexAttribArrayNormalized[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &m_vertexAttribArrayStrides[i]); } } @@ -201,11 +204,14 @@ void GLStateStore::printCurrentState(bool in) glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &arrayBufferBinding); for (int i = 0; i < m_maxVertexAttribs;i++) { - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertexAttribArrayEnabledStates[i]); - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &vertexAttribArrayBoundBuffers[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, + &vertexAttribArrayEnabledStates[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, + &vertexAttribArrayBoundBuffers[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vertexAttribArraySizes[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vertexAttribArrayTypes[i]); - glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vertexAttribArrayNormalized[i]); + glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + &vertexAttribArrayNormalized[i]); glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vertexAttribArrayStrides[i]); } -- cgit v1.2.3 From 32c321b3ebedee0986783c201a123a7dffd38054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 09:24:46 +0300 Subject: Clean up (android compilation fixes) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: Ibfb2cf19c4e97df4d7e278d5c5588feee015cd5b Change-Id: Ibfb2cf19c4e97df4d7e278d5c5588feee015cd5b Reviewed-by: Tomi Korpipää --- src/datavisualization/utils/texturehelper.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datavisualization/utils/texturehelper.cpp b/src/datavisualization/utils/texturehelper.cpp index 4ea808a5..185d99e4 100644 --- a/src/datavisualization/utils/texturehelper.cpp +++ b/src/datavisualization/utils/texturehelper.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "texturehelper_p.h" +#include "utils_p.h" #include #include -- cgit v1.2.3 From 90d88a8e76a421f3a3b430328c48b29d93d78676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 11:29:41 +0300 Subject: Android surface selection fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3163 Change-Id: I61589f9848ebcce7b0166e22d504c2375e564347 Change-Id: I61589f9848ebcce7b0166e22d504c2375e564347 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/surface3drenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index 09699278..12627966 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -2238,7 +2238,7 @@ void Surface3DRenderer::createSelectionTexture(SurfaceSeriesRenderCache *cache, cache->setSelectionIdRange(idStart, lastSelectionId - 1); // Move the ID image (bits) to the texture - QImage image = QImage(bits, idImageWidth, idImageHeight, QImage::Format_ARGB32); + QImage image = QImage(bits, idImageWidth, idImageHeight, QImage::Format_RGB32); GLuint selectionTexture = m_textureHelper->create2DTexture(image, false, false, false); cache->setSelectionTexture(selectionTexture); -- cgit v1.2.3 From 3953654a954b7ecc2b0b8ea514e8a520df2ba413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Wed, 4 Jun 2014 11:32:33 +0300 Subject: Mouse enabled for Android Task-number: QTEE-532 Change-Id: Id33345398a648fc2b7aea3ed97126a5c42324ed3 Reviewed-by: Miikka Heikkinen --- src/datavisualization/input/q3dinputhandler.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp index fdb78983..8c8da056 100644 --- a/src/datavisualization/input/q3dinputhandler.cpp +++ b/src/datavisualization/input/q3dinputhandler.cpp @@ -87,7 +87,7 @@ Q3DInputHandler::~Q3DInputHandler() */ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos) { -#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) +#if defined(Q_OS_IOS) Q_UNUSED(event); Q_UNUSED(mousePos); #else @@ -126,7 +126,7 @@ void Q3DInputHandler::mousePressEvent(QMouseEvent *event, const QPoint &mousePos void Q3DInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mousePos) { Q_UNUSED(event); -#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) +#if defined(Q_OS_IOS) Q_UNUSED(mousePos); #else if (QAbstract3DInputHandlerPrivate::InputStateRotating == d_ptr->m_inputState) { @@ -145,7 +145,7 @@ void Q3DInputHandler::mouseReleaseEvent(QMouseEvent *event, const QPoint &mouseP void Q3DInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos) { Q_UNUSED(event); -#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) +#if defined(Q_OS_IOS) Q_UNUSED(mousePos); #else if (QAbstract3DInputHandlerPrivate::InputStateRotating == d_ptr->m_inputState) { -- cgit v1.2.3 From 964a6c7f8ff2354737ef897067ee46e3d0cd55a9 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 4 Jun 2014 13:51:21 +0300 Subject: Add testing of renderToImage to scatter test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I03c3868ac7c98658fafa71c19409eb3afe851a10 Reviewed-by: Tomi Korpipää --- tests/scattertest/main.cpp | 15 ++++++++++++--- tests/scattertest/scatterchart.cpp | 22 ++++++++++++++++++++++ tests/scattertest/scatterchart.h | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp index 50c73901..207da530 100644 --- a/tests/scattertest/main.cpp +++ b/tests/scattertest/main.cpp @@ -129,6 +129,9 @@ int main(int argc, char **argv) QPushButton *testReverseButton = new QPushButton(widget); testReverseButton->setText(QStringLiteral("Test Axis Reversing")); + QPushButton *renderToImageButton = new QPushButton(widget); + renderToImageButton->setText(QStringLiteral("Render the graph to an image")); + QLinearGradient grBtoY(0, 0, 100, 0); grBtoY.setColorAt(1.0, Qt::black); grBtoY.setColorAt(0.67, Qt::blue); @@ -270,7 +273,8 @@ int main(int argc, char **argv) vLayout->addWidget(startTimerButton, 0, Qt::AlignTop); vLayout->addWidget(massiveDataTestButton, 0, Qt::AlignTop); vLayout->addWidget(testItemChangesButton, 0, Qt::AlignTop); - vLayout->addWidget(testReverseButton, 1, Qt::AlignTop); + vLayout->addWidget(testReverseButton, 0, Qt::AlignTop); + vLayout->addWidget(renderToImageButton, 1, Qt::AlignTop); vLayout2->addWidget(gradientBtoYPB, 0, Qt::AlignTop); vLayout2->addWidget(fpsLabel, 0, Qt::AlignTop); @@ -299,8 +303,6 @@ int main(int argc, char **argv) vLayout2->addWidget(new QLabel(QStringLiteral("Axis label rotation"))); vLayout2->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop); - widget->show(); - ScatterDataModifier *modifier = new ScatterDataModifier(chart); QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier, @@ -352,6 +354,8 @@ int main(int argc, char **argv) &ScatterDataModifier::testItemChanges); QObject::connect(testReverseButton, &QPushButton::clicked, modifier, &ScatterDataModifier::testAxisReverse); + QObject::connect(renderToImageButton, &QPushButton::clicked, modifier, + &ScatterDataModifier::renderToImage); QObject::connect(gradientBtoYPB, &QPushButton::clicked, modifier, &ScatterDataModifier::setGradient); QObject::connect(themeButton, &QPushButton::clicked, modifier, @@ -396,7 +400,12 @@ int main(int argc, char **argv) modifier->setFpsLabel(fpsLabel); + chart->setGeometry(QRect(0, 0, 800, 800)); + modifier->start(); + modifier->renderToImage(); // Initial hidden render + + widget->show(); return app.exec(); } diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp index e498b2da..c00c526a 100644 --- a/tests/scattertest/scatterchart.cpp +++ b/tests/scattertest/scatterchart.cpp @@ -948,6 +948,28 @@ void ScatterDataModifier::toggleAxisTitleFixed(bool enabled) m_chart->axisZ()->setTitleFixed(enabled); } +void ScatterDataModifier::renderToImage() +{ + QImage renderedImage8AA = m_chart->renderToImage(8); + QImage renderedImageNoAA = m_chart->renderToImage(0); + QImage renderedImage8AASmall = m_chart->renderToImage(8, QSize(100, 100)); + QImage renderedImageNoAASmall = m_chart->renderToImage(0, QSize(100, 100)); + + if (m_chart->isVisible()) { + renderedImage8AA.save(QStringLiteral("./renderedImage8AA_visible.png")); + renderedImageNoAA.save(QStringLiteral("./renderedImageNoAA_visible.png")); + renderedImage8AASmall.save(QStringLiteral("./renderedImage8AASmall_visible.png")); + renderedImageNoAASmall.save(QStringLiteral("./renderedImageNoAASmall_visible.png")); + qDebug() << "Visible images rendered!"; + } else { + renderedImage8AA.save(QStringLiteral("./renderedImage8AA_hidden.png")); + renderedImageNoAA.save(QStringLiteral("./renderedImageNoAA_hidden.png")); + renderedImage8AASmall.save(QStringLiteral("./renderedImage8AASmall_hidden.png")); + renderedImageNoAASmall.save(QStringLiteral("./renderedImageNoAASmall_hidden.png")); + qDebug() << "Hidden images rendered!"; + } +} + void ScatterDataModifier::changeShadowQuality(int quality) { QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality); diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h index 983b605a..97c3b1f9 100644 --- a/tests/scattertest/scatterchart.h +++ b/tests/scattertest/scatterchart.h @@ -92,6 +92,7 @@ public slots: void changeLabelRotation(int rotation); void toggleAxisTitleVisibility(bool enabled); void toggleAxisTitleFixed(bool enabled); + void renderToImage(); signals: void shadowQualityChanged(int quality); -- cgit v1.2.3 From 3eb656382e43fbd8cec36c801ec5eefd5efdcd77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 5 Jun 2014 07:00:48 +0300 Subject: Doc \since changes Task-number: QTRD-3150 All \since -tags changed to use the same format. Change-Id: I858afd61002cef7ecb3cf56deda0dabc431c4fd5 Change-Id: I858afd61002cef7ecb3cf56deda0dabc431c4fd5 Reviewed-by: Titta Heikkala --- .../customitems/doc/src/customitems.qdoc | 2 +- .../draggableaxes/doc/src/draggableaxes.qdoc | 2 +- .../qmlaxisdrag/doc/src/qmlaxisdrag.qdoc | 2 +- .../qmlaxisformatter/doc/src/qmlaxisformatter.qdoc | 2 +- src/datavisualization/axis/qabstract3daxis.cpp | 2 +- src/datavisualization/axis/qcategory3daxis.cpp | 2 +- .../axis/qlogvalue3daxisformatter.cpp | 2 +- src/datavisualization/axis/qvalue3daxis.cpp | 6 ++-- .../axis/qvalue3daxisformatter.cpp | 2 +- src/datavisualization/data/qabstract3dseries.cpp | 6 ++-- src/datavisualization/data/qabstractdataproxy.cpp | 2 +- src/datavisualization/data/qbar3dseries.cpp | 2 +- src/datavisualization/data/qbardataitem.cpp | 2 +- src/datavisualization/data/qbardataproxy.cpp | 2 +- src/datavisualization/data/qcustom3ditem.cpp | 2 +- src/datavisualization/data/qcustom3dlabel.cpp | 2 +- .../data/qheightmapsurfacedataproxy.cpp | 2 +- .../data/qitemmodelbardataproxy.cpp | 2 +- .../data/qitemmodelscatterdataproxy.cpp | 2 +- .../data/qitemmodelsurfacedataproxy.cpp | 2 +- src/datavisualization/data/qscatter3dseries.cpp | 2 +- src/datavisualization/data/qscatterdataitem.cpp | 2 +- src/datavisualization/data/qscatterdataproxy.cpp | 2 +- src/datavisualization/data/qsurface3dseries.cpp | 2 +- src/datavisualization/data/qsurfacedataitem.cpp | 2 +- src/datavisualization/data/qsurfacedataproxy.cpp | 2 +- ...tdatavisualization-qml-abstractdeclarative.qdoc | 24 +++++++-------- src/datavisualization/engine/q3dbars.cpp | 2 +- src/datavisualization/engine/q3dcamera.cpp | 2 +- src/datavisualization/engine/q3dlight.cpp | 2 +- src/datavisualization/engine/q3dobject.cpp | 2 +- src/datavisualization/engine/q3dscatter.cpp | 2 +- src/datavisualization/engine/q3dscene.cpp | 2 +- src/datavisualization/engine/q3dsurface.cpp | 2 +- src/datavisualization/engine/qabstract3dgraph.cpp | 34 +++++++++++----------- src/datavisualization/input/q3dinputhandler.cpp | 2 +- .../input/qabstract3dinputhandler.cpp | 2 +- .../input/qtouch3dinputhandler.cpp | 2 +- src/datavisualization/theme/q3dtheme.cpp | 2 +- 39 files changed, 70 insertions(+), 70 deletions(-) diff --git a/examples/datavisualization/customitems/doc/src/customitems.qdoc b/examples/datavisualization/customitems/doc/src/customitems.qdoc index 20f5f96d..f2699998 100644 --- a/examples/datavisualization/customitems/doc/src/customitems.qdoc +++ b/examples/datavisualization/customitems/doc/src/customitems.qdoc @@ -21,7 +21,7 @@ \title Custom Items Example \ingroup qtdatavisualization_examples \brief Adding custom items to a surface graph. - \since Qt Data Visualization 1.1 + \since QtDataVisualization 1.1 The custom items example shows how to add your own custom meshes as items to a graph, and how to remove them. diff --git a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc index af081d97..124bbbac 100644 --- a/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc +++ b/examples/datavisualization/draggableaxes/doc/src/draggableaxes.qdoc @@ -21,7 +21,7 @@ \title Axis Range Dragging With Labels Example \ingroup qtdatavisualization_examples \brief Implementing a custom input handler to support axis dragging. - \since Qt Data Visualization 1.1 + \since QtDataVisualization 1.1 The Axis Range Dragging example shows how to customize the 3D graph controls in a widget application to allow changing axis ranges by clicking on an axis label and dragging. This is diff --git a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc index 8f8fff7f..317f855f 100644 --- a/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc +++ b/examples/datavisualization/qmlaxisdrag/doc/src/qmlaxisdrag.qdoc @@ -21,7 +21,7 @@ \title Qt Quick 2 Axis Dragging Example \ingroup qtdatavisualization_examples \brief Implementing axis dragging in QML - \since Qt Data Visualization 1.1 + \since QtDataVisualization 1.1 The Qt Quick 2 axis dragging example concentrates on showing how to implement axis range changing by dragging axis labels in QML. It also gives a quick peek to two other new features diff --git a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc index 156135bd..3568e507 100644 --- a/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc +++ b/examples/datavisualization/qmlaxisformatter/doc/src/qmlaxisformatter.qdoc @@ -21,7 +21,7 @@ \title Qt Quick 2 Axis Formatter Example \ingroup qtdatavisualization_examples \brief Example of a hybrid C++ and QML application demonstrating different axis formatters. - \since Qt Data Visualization 1.1 + \since QtDataVisualization 1.1 The Qt Quick axis formatter example shows how to use predefined axis formatters and how to create a custom one. diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp index d33730ff..9fd5a832 100644 --- a/src/datavisualization/axis/qabstract3daxis.cpp +++ b/src/datavisualization/axis/qabstract3daxis.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QAbstract3DAxis * \inmodule QtDataVisualization * \brief QAbstract3DAxis is base class for axes of a graph. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * You should not need to use this class directly, but one of its subclasses instead. * diff --git a/src/datavisualization/axis/qcategory3daxis.cpp b/src/datavisualization/axis/qcategory3daxis.cpp index ca19986a..f2cd0a84 100644 --- a/src/datavisualization/axis/qcategory3daxis.cpp +++ b/src/datavisualization/axis/qcategory3daxis.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QCategory3DAxis * \inmodule QtDataVisualization * \brief The QCategory3DAxis class is used for manipulating an axis of a graph. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QCategory3DAxis provides an axis that can be given labels. The axis is divided into equal-sized * categories based on the data window size defined by setting the axis range. diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp index 128d784d..7367e7c5 100644 --- a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp @@ -26,7 +26,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QLogValue3DAxisFormatter * \inmodule QtDataVisualization * \brief QLogValue3DAxisFormatter implements logarithmic value axis formatter. - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * This class provides formatting rules for a logarithmic QValue3DAxis. * diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index c7396de8..8207174f 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QValue3DAxis * \inmodule QtDataVisualization * \brief The QValue3DAxis class is used for manipulating an axis of a graph. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QValue3DAxis provides an axis that can be given a range of values and segment and subsegment * counts to divide the range into. @@ -187,7 +187,7 @@ QString QValue3DAxis::labelFormat() const /*! * \property QValue3DAxis::formatter - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter * is set. @@ -213,7 +213,7 @@ QValue3DAxisFormatter *QValue3DAxis::formatter() const /*! * \property QValue3DAxis::reversed - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * If \c{true}, the axis will be rendered in reverse, i.e. the positions of minimum and maximum * values are swapped when the graph is rendered. This property doesn't affect the actual diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp index 4cd84d88..56ca3b0f 100644 --- a/src/datavisualization/axis/qvalue3daxisformatter.cpp +++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QValue3DAxisFormatter * \inmodule QtDataVisualization * \brief QValue3DAxisFormatter is base class for value axis formatters. - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * This class provides formatting rules for a linear QValue3DAxis. Subclass it if you * want to implement custom value axes. diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 7655bbd8..48fbc69a 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -26,7 +26,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QAbstract3DSeries * \inmodule QtDataVisualization * \brief Base class for all QtDataVisualization series. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * You use the visualization type specific inherited classes instead of the base class. * \sa QBar3DSeries, QScatter3DSeries, QSurface3DSeries, {Qt Data Visualization Data Handling} @@ -609,7 +609,7 @@ QString QAbstract3DSeries::name() const /*! * \property QAbstract3DSeries::itemLabel - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * Contains the formatted item label. If there is no selected item or the selected item is not * visible, returns an empty string. @@ -623,7 +623,7 @@ QString QAbstract3DSeries::itemLabel() const /*! * \property QAbstract3DSeries::itemLabelVisible - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not * drawn. If you prefer to show the item label in an external control, set this property to diff --git a/src/datavisualization/data/qabstractdataproxy.cpp b/src/datavisualization/data/qabstractdataproxy.cpp index ef6b1a00..eb15cec8 100644 --- a/src/datavisualization/data/qabstractdataproxy.cpp +++ b/src/datavisualization/data/qabstractdataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QAbstractDataProxy * \inmodule QtDataVisualization * \brief Base class for all QtDataVisualization data proxies. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * You use the visualization type specific inherited classes instead of the base class. * \sa QBarDataProxy, QScatterDataProxy, QSurfaceDataProxy, {Qt Data Visualization Data Handling} diff --git a/src/datavisualization/data/qbar3dseries.cpp b/src/datavisualization/data/qbar3dseries.cpp index 8a05100f..3440a3db 100644 --- a/src/datavisualization/data/qbar3dseries.cpp +++ b/src/datavisualization/data/qbar3dseries.cpp @@ -26,7 +26,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QBar3DSeries * \inmodule QtDataVisualization * \brief Base series class for Q3DBars. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QBar3DSeries manages the series specific visual elements, as well as series data * (via data proxy). diff --git a/src/datavisualization/data/qbardataitem.cpp b/src/datavisualization/data/qbardataitem.cpp index 37c2033f..8f370e24 100644 --- a/src/datavisualization/data/qbardataitem.cpp +++ b/src/datavisualization/data/qbardataitem.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QBarDataItem * \inmodule QtDataVisualization * \brief The QBarDataItem class provides a container for resolved data to be added to bar graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * A QBarDataItem holds data for a single rendered bar in a graph. * Bar data proxies parse data into QBarDataItem instances for visualizing. diff --git a/src/datavisualization/data/qbardataproxy.cpp b/src/datavisualization/data/qbardataproxy.cpp index 6fc65193..8e4f25de 100644 --- a/src/datavisualization/data/qbardataproxy.cpp +++ b/src/datavisualization/data/qbardataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QBarDataProxy * \inmodule QtDataVisualization * \brief Base proxy class for Q3DBars. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QBarDataProxy handles adding, inserting, changing and removing rows of data. * diff --git a/src/datavisualization/data/qcustom3ditem.cpp b/src/datavisualization/data/qcustom3ditem.cpp index 17d17502..f5d8470f 100644 --- a/src/datavisualization/data/qcustom3ditem.cpp +++ b/src/datavisualization/data/qcustom3ditem.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QCustom3DItem * \inmodule QtDataVisualization * \brief The QCustom3DItem class is for creating custom items to be added to a graph. - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * This class is for creating custom items to be added to a graph. The item has a custom mesh, * position, scaling, rotation, and an optional texture. diff --git a/src/datavisualization/data/qcustom3dlabel.cpp b/src/datavisualization/data/qcustom3dlabel.cpp index 585f4f35..85a37e2d 100644 --- a/src/datavisualization/data/qcustom3dlabel.cpp +++ b/src/datavisualization/data/qcustom3dlabel.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QCustom3DLabel * \inmodule QtDataVisualization * \brief The QCustom3DLabel class is for creating custom labels to be added to a graph. - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * This class is for creating custom labels to be added to a graph. You can set text, font, * position, scaling, rotation, and colors. You can also toggle borders and background for the diff --git a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp index 56fcf5d1..d64046be 100644 --- a/src/datavisualization/data/qheightmapsurfacedataproxy.cpp +++ b/src/datavisualization/data/qheightmapsurfacedataproxy.cpp @@ -28,7 +28,7 @@ const float defaultMaxValue = 10.0f; * \class QHeightMapSurfaceDataProxy * \inmodule QtDataVisualization * \brief Base proxy class for Q3DSurface. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QHeightMapSurfaceDataProxy takes care of surface related height map data handling. It provides a * way to give a height map to be visualized as a surface plot. diff --git a/src/datavisualization/data/qitemmodelbardataproxy.cpp b/src/datavisualization/data/qitemmodelbardataproxy.cpp index 6683e06f..3d4a980a 100644 --- a/src/datavisualization/data/qitemmodelbardataproxy.cpp +++ b/src/datavisualization/data/qitemmodelbardataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QItemModelBarDataProxy * \inmodule QtDataVisualization * \brief Proxy class for presenting data in item models with Q3DBars. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QItemModelBarDataProxy allows you to use QAbstractItemModel derived models as a data source * for Q3DBars. It uses the defined mappings to map data from the model to rows, columns, and diff --git a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp index 56e164f9..4e6464ea 100644 --- a/src/datavisualization/data/qitemmodelscatterdataproxy.cpp +++ b/src/datavisualization/data/qitemmodelscatterdataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QItemModelScatterDataProxy * \inmodule QtDataVisualization * \brief Proxy class for presenting data in item models with Q3DScatter. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QItemModelScatterDataProxy allows you to use QAbstractItemModel derived models as a data source * for Q3DScatter. It maps roles of QAbstractItemModel to the XYZ-values of Q3DScatter points. diff --git a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp index 00f9b201..5117d386 100644 --- a/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp +++ b/src/datavisualization/data/qitemmodelsurfacedataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QItemModelSurfaceDataProxy * \inmodule QtDataVisualization * \brief Proxy class for presenting data in item models with Q3DSurface. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QItemModelSurfaceDataProxy allows you to use QAbstractItemModel derived models as a data source * for Q3DSurface. It uses the defined mappings to map data from the model to rows, columns, and diff --git a/src/datavisualization/data/qscatter3dseries.cpp b/src/datavisualization/data/qscatter3dseries.cpp index f4509ae4..e81933ed 100644 --- a/src/datavisualization/data/qscatter3dseries.cpp +++ b/src/datavisualization/data/qscatter3dseries.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QScatter3DSeries * \inmodule QtDataVisualization * \brief Base series class for Q3DScatter. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QScatter3DSeries manages the series specific visual elements, as well as series data * (via data proxy). diff --git a/src/datavisualization/data/qscatterdataitem.cpp b/src/datavisualization/data/qscatterdataitem.cpp index 9751dfeb..e45b22f3 100644 --- a/src/datavisualization/data/qscatterdataitem.cpp +++ b/src/datavisualization/data/qscatterdataitem.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \inmodule QtDataVisualization * \brief The QScatterDataItem class provides a container for resolved data to be added to scatter * graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * A QScatterDataItem holds data for a single rendered item in a scatter graph. * Scatter data proxies parse data into QScatterDataItem instances for visualizing. diff --git a/src/datavisualization/data/qscatterdataproxy.cpp b/src/datavisualization/data/qscatterdataproxy.cpp index 4aa9c938..cc2e3bd8 100644 --- a/src/datavisualization/data/qscatterdataproxy.cpp +++ b/src/datavisualization/data/qscatterdataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QScatterDataProxy * \inmodule QtDataVisualization * \brief Base proxy class for Q3DScatter. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QScatterDataProxy handles adding, inserting, changing, and removing data items. * diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index 6ee17ab8..1107d721 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QSurface3DSeries * \inmodule QtDataVisualization * \brief Base series class for Q3DSurface. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QSurface3DSeries manages the series specific visual elements, as well as series data * (via data proxy). diff --git a/src/datavisualization/data/qsurfacedataitem.cpp b/src/datavisualization/data/qsurfacedataitem.cpp index c8a76a67..cd3819c7 100644 --- a/src/datavisualization/data/qsurfacedataitem.cpp +++ b/src/datavisualization/data/qsurfacedataitem.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \inmodule QtDataVisualization * \brief The QSurfaceDataItem class provides a container for resolved data to be added to surface * graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * A QSurfaceDataItem holds data for a single vertex in surface graph. * Surface data proxies parse data into QSurfaceDataItem instances for visualizing. diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 04f4f89d..dbe7cc49 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QSurfaceDataProxy * \inmodule QtDataVisualization * \brief Base proxy class for Q3DSurface. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QSurfaceDataProxy takes care of surface related data handling. The QSurfaceDataProxy handles the * data in rows and for this it provides two auxiliary typedefs. QSurfaceDataArray is a QList for diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index ece4f681..89d38a3d 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -159,7 +159,7 @@ * * \sa removeCustomItems(), removeCustomItem(), removeCustomItemAt() * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ /*! @@ -167,7 +167,7 @@ * * Removes all custom items. Deletes the resources allocated to them. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ /*! @@ -175,7 +175,7 @@ * * Removes the custom \a {item}. Deletes the resources allocated to it. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ /*! @@ -183,7 +183,7 @@ * * Removes all custom items at \a {position}. Deletes the resources allocated to them. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ /*! @@ -191,7 +191,7 @@ * * Gets ownership of \a item back and removes the \a item from the graph. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \note If the same item is added back to the graph, the texture file needs to be re-set. * @@ -206,7 +206,7 @@ * * \return index of the selected label, or -1. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -219,7 +219,7 @@ * * \return the selected axis, or null. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -233,7 +233,7 @@ * * \return index of the selected custom item, or -1. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -247,7 +247,7 @@ * * \return the selected custom item, or null. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -266,12 +266,12 @@ * \sa selectedLabelIndex(), selectedAxis(), selectedCustomItemIndex(), selectedCustomItem(), * Bars3D::selectedSeries, Scatter3D::selectedSeries, Scene3D::selectionQueryPosition * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ /*! * \qmlproperty bool AbstractGraph3D::orthoProjection - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. * \note Shadows will be disabled when set to \c{true}. @@ -279,7 +279,7 @@ /*! * \qmlproperty real AbstractGraph3D::aspectRatio - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and * vertical axes. Defaults to \c{2.0}. diff --git a/src/datavisualization/engine/q3dbars.cpp b/src/datavisualization/engine/q3dbars.cpp index ca90156e..a903d831 100644 --- a/src/datavisualization/engine/q3dbars.cpp +++ b/src/datavisualization/engine/q3dbars.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DBars * \inmodule QtDataVisualization * \brief The Q3DBars class provides methods for rendering 3D bar graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * This class enables developers to render bar graphs in 3D and to view them by rotating the scene * freely. Rotation is done by holding down the right mouse button and moving the mouse. Zooming diff --git a/src/datavisualization/engine/q3dcamera.cpp b/src/datavisualization/engine/q3dcamera.cpp index 831fc994..9866a34e 100644 --- a/src/datavisualization/engine/q3dcamera.cpp +++ b/src/datavisualization/engine/q3dcamera.cpp @@ -27,7 +27,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DCamera * \inmodule QtDataVisualization * \brief Representation of a camera in 3D space. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * Q3DCamera represents a basic orbit around centerpoint 3D camera that is used when rendering the * data visualization. The class offers simple methods for rotating the camera around the origin diff --git a/src/datavisualization/engine/q3dlight.cpp b/src/datavisualization/engine/q3dlight.cpp index 2a7c56fa..03f094cb 100644 --- a/src/datavisualization/engine/q3dlight.cpp +++ b/src/datavisualization/engine/q3dlight.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DLight * \inmodule QtDataVisualization * \brief Representation of a light source in 3D space. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * Q3DLight represents a monochrome non variable light source in 3D space. */ diff --git a/src/datavisualization/engine/q3dobject.cpp b/src/datavisualization/engine/q3dobject.cpp index b74b8ab7..56edb098 100644 --- a/src/datavisualization/engine/q3dobject.cpp +++ b/src/datavisualization/engine/q3dobject.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION \class Q3DObject \inmodule QtDataVisualization \brief Simple baseclass for all the objects in the 3D scene. - \since Qt Data Visualization 1.0 + \since QtDataVisualization 1.0 Q3DObject is a baseclass that contains only position information for an object in 3D scene. The object is considered to be a single point in the coordinate space without dimensions. diff --git a/src/datavisualization/engine/q3dscatter.cpp b/src/datavisualization/engine/q3dscatter.cpp index 123cd658..40bd5021 100644 --- a/src/datavisualization/engine/q3dscatter.cpp +++ b/src/datavisualization/engine/q3dscatter.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DScatter * \inmodule QtDataVisualization * \brief The Q3DScatter class provides methods for rendering 3D scatter graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * This class enables developers to render scatter graphs in 3D and to view them by rotating the scene * freely. Rotation is done by holding down the right mouse button and moving the mouse. Zooming diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index c1cc1a03..62cb681a 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -26,7 +26,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DScene * \inmodule QtDataVisualization * \brief Q3DScene class provides description of the 3D scene being visualized. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * The 3D scene contains a single active camera and a single active light source. * Visualized data is assumed to be at a fixed location. diff --git a/src/datavisualization/engine/q3dsurface.cpp b/src/datavisualization/engine/q3dsurface.cpp index e5b21387..162b7a67 100644 --- a/src/datavisualization/engine/q3dsurface.cpp +++ b/src/datavisualization/engine/q3dsurface.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DSurface * \inmodule QtDataVisualization * \brief The Q3DSurface class provides methods for rendering 3D surface plots. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * This class enables developers to render 3D surface plots and to view them by rotating the scene * freely. The visual properties of the surface such as draw mode and shading can be controlled diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 5c31382e..71ef7dbb 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -36,7 +36,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QAbstract3DGraph * \inmodule QtDataVisualization * \brief The QAbstract3DGraph class provides a window and render loop for graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * This class subclasses a QWindow and provides render loop for graphs inheriting it. * @@ -121,7 +121,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! \enum QAbstract3DGraph::ElementType - \since Qt Data Visualization 1.1 + \since QtDataVisualization 1.1 Type of an element in the graph. @@ -390,7 +390,7 @@ void QAbstract3DGraph::clearSelection() * * \sa removeCustomItems(), removeCustomItem(), removeCustomItemAt() * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ int QAbstract3DGraph::addCustomItem(QCustom3DItem *item) { @@ -400,7 +400,7 @@ int QAbstract3DGraph::addCustomItem(QCustom3DItem *item) /*! * Removes all custom items. Deletes the resources allocated to them. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ void QAbstract3DGraph::removeCustomItems() { @@ -410,7 +410,7 @@ void QAbstract3DGraph::removeCustomItems() /*! * Removes the custom \a {item}. Deletes the resources allocated to it. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ void QAbstract3DGraph::removeCustomItem(QCustom3DItem *item) { @@ -420,7 +420,7 @@ void QAbstract3DGraph::removeCustomItem(QCustom3DItem *item) /*! * Removes all custom items at \a {position}. Deletes the resources allocated to them. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) { @@ -430,7 +430,7 @@ void QAbstract3DGraph::removeCustomItemAt(const QVector3D &position) /*! * Gets ownership of given \a item back and removes the \a item from the graph. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \note If the same item is added back to the graph, the texture or the texture file needs to be * re-set. @@ -448,7 +448,7 @@ void QAbstract3DGraph::releaseCustomItem(QCustom3DItem *item) * * \return index of the selected label, or -1. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -463,7 +463,7 @@ int QAbstract3DGraph::selectedLabelIndex() const * * \return pointer to the selected axis, or null. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -479,7 +479,7 @@ QAbstract3DAxis *QAbstract3DGraph::selectedAxis() const * * \return index of the selected custom item, or -1. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -495,7 +495,7 @@ int QAbstract3DGraph::selectedCustomItemIndex() const * * \return pointer to the selected custom item, or null. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \sa selectedElement */ @@ -519,7 +519,7 @@ QCustom3DItem *QAbstract3DGraph::selectedCustomItem() const * Q3DBars::selectedSeries(), Q3DScatter::selectedSeries(), Q3DSurface::selectedSeries(), * Q3DScene::setSelectionQueryPosition() * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 */ QAbstract3DGraph::ElementType QAbstract3DGraph::selectedElement() const { @@ -530,7 +530,7 @@ QAbstract3DGraph::ElementType QAbstract3DGraph::selectedElement() const * Renders current frame to an image of \a imageSize. Default size is the window size. Image is * rendered with antialiasing level given in \a msaaSamples. Default level is \c{0}. * - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * \return rendered image. */ @@ -544,7 +544,7 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) /*! * \property QAbstract3DGraph::measureFps - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * If \c {true}, the rendering is done continuously instead of on demand, and currentFps property * is updated. Defaults to \c{false}. @@ -563,7 +563,7 @@ bool QAbstract3DGraph::measureFps() const /*! * \property QAbstract3DGraph::currentFps - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * When fps measuring is enabled, the results for the last second are stored in this read-only * property. It takes at least a second before this value updates after measurement is activated. @@ -577,7 +577,7 @@ qreal QAbstract3DGraph::currentFps() const /*! * \property QAbstract3DGraph::orthoProjection - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * If \c {true}, orthographic projection will be used for displaying the graph. Defaults to \c{false}. * \note Shadows will be disabled when set to \c{true}. @@ -594,7 +594,7 @@ bool QAbstract3DGraph::isOrthoProjection() const /*! * \property QAbstract3DGraph::aspectRatio - * \since Qt Data Visualization 1.1 + * \since QtDataVisualization 1.1 * * Aspect ratio of the graph data. This is the ratio of data scaling between horizontal and * vertical axes. Defaults to \c{2.0}. diff --git a/src/datavisualization/input/q3dinputhandler.cpp b/src/datavisualization/input/q3dinputhandler.cpp index 8c8da056..f0044096 100644 --- a/src/datavisualization/input/q3dinputhandler.cpp +++ b/src/datavisualization/input/q3dinputhandler.cpp @@ -36,7 +36,7 @@ const float rotationSpeed = 100.0f; * \class Q3DInputHandler * \inmodule QtDataVisualization * \brief Basic wheel mouse based input handler. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * Q3DInputHandler is the basic input handler for wheel mouse type of input devices. * diff --git a/src/datavisualization/input/qabstract3dinputhandler.cpp b/src/datavisualization/input/qabstract3dinputhandler.cpp index c063ae58..5109631f 100644 --- a/src/datavisualization/input/qabstract3dinputhandler.cpp +++ b/src/datavisualization/input/qabstract3dinputhandler.cpp @@ -24,7 +24,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class QAbstract3DInputHandler * \inmodule QtDataVisualization * \brief The base class for implementations of input handlers. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QAbstract3DInputHandler is the base class that is subclassed by different input handling implementations * that take input events and translate those to camera and light movements. Input handlers also translate diff --git a/src/datavisualization/input/qtouch3dinputhandler.cpp b/src/datavisualization/input/qtouch3dinputhandler.cpp index 90201115..30f31d4a 100644 --- a/src/datavisualization/input/qtouch3dinputhandler.cpp +++ b/src/datavisualization/input/qtouch3dinputhandler.cpp @@ -38,7 +38,7 @@ const int maxZoomLevel = 500; * \class QTouch3DInputHandler * \inmodule QtDataVisualization * \brief Basic touch display based input handler. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * QTouch3DInputHandler is the basic input handler for touch screen devices. * diff --git a/src/datavisualization/theme/q3dtheme.cpp b/src/datavisualization/theme/q3dtheme.cpp index e86f439e..eaed3c41 100644 --- a/src/datavisualization/theme/q3dtheme.cpp +++ b/src/datavisualization/theme/q3dtheme.cpp @@ -25,7 +25,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \class Q3DTheme * \inmodule QtDataVisualization * \brief Q3DTheme class provides a visual style for graphs. - * \since Qt Data Visualization 1.0 + * \since QtDataVisualization 1.0 * * Q3DTheme is used to specify visual properties that affect the whole graph. There are several * built-in themes that can be used directly, or be modified freely. User can also create a theme -- cgit v1.2.3 From 2620998f56548b1c5f12f660078f9ea6a2fc3912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 5 Jun 2014 07:31:29 +0300 Subject: Binary break info added to docs and README Task-number: QTRD-3150 Change-Id: I99272555dc7e02e54037289ccbef1f2c56a8ee61 Reviewed-by: Titta Heikkala --- README | 4 ++++ src/datavisualization/doc/src/qtdatavisualization.qdoc | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README b/README index 83497ffb..da0715d0 100644 --- a/README +++ b/README @@ -84,3 +84,7 @@ Known Issues - The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. - Widget based examples layout incorrectly in iOS. - Reparenting a graph to an item in another QQuickWindow is not supported. +- There is a low-impact binary break between 1.0 and 1.1. The break is due to a QML type + registration conflict with QAbstractItemModel between QtDataVisualization and + QtCommercial.Charts. Introducing the binary break makes it possible to use both + Charts and Data Visualization in the same QML application. diff --git a/src/datavisualization/doc/src/qtdatavisualization.qdoc b/src/datavisualization/doc/src/qtdatavisualization.qdoc index afe15a9a..af419814 100644 --- a/src/datavisualization/doc/src/qtdatavisualization.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization.qdoc @@ -333,6 +333,10 @@ \li The color style Q3DTheme::ColorStyleObjectGradient doesn't work for surface graphs. \li Widget based examples layout incorrectly in iOS. \li Reparenting a graph to an item in another QQuickWindow is not supported. + \li There is a low-impact binary break between 1.0 and 1.1. The break is due to a QML type + registration conflict with QAbstractItemModel between QtDataVisualization and + QtCommercial.Charts. Introducing the binary break makes it possible to use both + Charts and Data Visualization in the same QML application. \endlist */ -- cgit v1.2.3 From f8e9d36ce868adaade5aaa6769ba681763d16874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpipa=CC=88a=CC=88?= Date: Thu, 5 Jun 2014 09:48:48 +0300 Subject: Fix iOS qmlaxisformatter bug Change-Id: Ib7920fe85b4a436e66e641249037b6229535226c Reviewed-by: Miikka Heikkinen --- examples/datavisualization/qmlaxisformatter/customformatter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/datavisualization/qmlaxisformatter/customformatter.cpp b/examples/datavisualization/qmlaxisformatter/customformatter.cpp index 4a52d273..486287ef 100644 --- a/examples/datavisualization/qmlaxisformatter/customformatter.cpp +++ b/examples/datavisualization/qmlaxisformatter/customformatter.cpp @@ -23,11 +23,14 @@ using namespace QtDataVisualization; +Q_DECLARE_METATYPE(QValue3DAxisFormatter *) + static const qreal oneDayMs = 60.0 * 60.0 * 24.0 * 1000.0; CustomFormatter::CustomFormatter(QObject *parent) : QValue3DAxisFormatter(parent) { + qRegisterMetaType(); } CustomFormatter::~CustomFormatter() -- cgit v1.2.3 From 2299481acb0b36d76414ed9e0ae2b2d110ff13d8 Mon Sep 17 00:00:00 2001 From: Mika Salmela Date: Thu, 5 Jun 2014 10:32:24 +0300 Subject: Scatter perf improvement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3148 Change-Id: I2c9efa84184819aaac123ee29685bc3a9e35bfe6 Reviewed-by: Tomi Korpipää Reviewed-by: Miikka Heikkinen --- src/datavisualization/data/qabstract3dseries.cpp | 24 +- ...tdatavisualization-qml-abstractdeclarative.qdoc | 19 +- .../engine/abstract3dcontroller.cpp | 22 ++ .../engine/abstract3dcontroller_p.h | 7 + .../engine/abstract3drenderer.cpp | 6 + .../engine/abstract3drenderer_p.h | 2 + src/datavisualization/engine/drawer.cpp | 17 ++ src/datavisualization/engine/drawer_p.h | 2 + src/datavisualization/engine/qabstract3dgraph.cpp | 36 +++ src/datavisualization/engine/qabstract3dgraph.h | 13 + src/datavisualization/engine/scatter3drenderer.cpp | 268 ++++++++++++++++++--- src/datavisualization/engine/scatter3drenderer_p.h | 1 + .../engine/scatterseriesrendercache.cpp | 10 +- .../engine/scatterseriesrendercache_p.h | 15 ++ src/datavisualization/utils/objecthelper.cpp | 30 +-- src/datavisualization/utils/objecthelper_p.h | 10 +- .../utils/scatterobjectbufferhelper.cpp | 226 +++++++++++++++++ .../utils/scatterobjectbufferhelper_p.h | 51 ++++ .../utils/scatterpointbufferhelper.cpp | 113 +++++++++ .../utils/scatterpointbufferhelper_p.h | 62 +++++ src/datavisualization/utils/utils.pri | 8 +- src/datavisualizationqml2/abstractdeclarative.cpp | 12 + src/datavisualizationqml2/abstractdeclarative_p.h | 13 + 23 files changed, 904 insertions(+), 63 deletions(-) create mode 100644 src/datavisualization/utils/scatterobjectbufferhelper.cpp create mode 100644 src/datavisualization/utils/scatterobjectbufferhelper_p.h create mode 100644 src/datavisualization/utils/scatterpointbufferhelper.cpp create mode 100644 src/datavisualization/utils/scatterpointbufferhelper_p.h diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 48fbc69a..f8fe6b4f 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -710,32 +710,48 @@ void QAbstract3DSeriesPrivate::setMesh(QAbstract3DSeries::Mesh mesh) { m_mesh = mesh; m_changeTracker.meshChanged = true; - if (m_controller) + if (m_controller) { m_controller->markSeriesVisualsDirty(); + + if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic)) + m_controller->markDataDirty(); + } } void QAbstract3DSeriesPrivate::setMeshSmooth(bool enable) { m_meshSmooth = enable; m_changeTracker.meshSmoothChanged = true; - if (m_controller) + if (m_controller) { m_controller->markSeriesVisualsDirty(); + + if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic)) + m_controller->markDataDirty(); + } } void QAbstract3DSeriesPrivate::setMeshRotation(const QQuaternion &rotation) { m_meshRotation = rotation; m_changeTracker.meshRotationChanged = true; - if (m_controller) + if (m_controller) { m_controller->markSeriesVisualsDirty(); + + if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic)) + m_controller->markDataDirty(); + } } void QAbstract3DSeriesPrivate::setUserDefinedMesh(const QString &meshFile) { m_userDefinedMesh = meshFile; m_changeTracker.userDefinedMeshChanged = true; - if (m_controller) + if (m_controller) { m_controller->markSeriesVisualsDirty(); + + if (m_controller->optimizationHints().testFlag(QAbstract3DGraph::OptimizationStatic)) + m_controller->markDataDirty(); + } } void QAbstract3DSeriesPrivate::setColorStyle(Q3DTheme::ColorStyle style) diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 89d38a3d..ba3173b0 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -28,8 +28,9 @@ Note that this type is uncreatable, but contains properties that are shared between the 3D visualizations. - For AbstractGraph3D enums, see \l QAbstract3DGraph::SelectionFlag, - \l QAbstract3DGraph::ShadowQuality, and \l{QAbstract3DGraph::ElementType}. + For AbstractGraph3D enums, see \l{QAbstract3DGraph::SelectionFlag}, + \l{QAbstract3DGraph::ShadowQuality}, \l{QAbstract3DGraph::ElementType}, and + \l{QAbstract3DGraph::OptimizationHint}. \sa Bars3D, Scatter3D, Surface3D, {Qt Data Visualization C++ Classes} */ @@ -286,3 +287,17 @@ * * \note Has no effect on Bars3D. */ + +/*! + * \qmlproperty AbstractGraph3D.OptimizationHints AbstractGraph3D::optimizationHints + * \since Qt Data Visualization 1.1 + * + * Defines if the rendering optimization is default or static. Default mode provides the full feature set at + * reasonable performance. Static is a beta level feature and currently supports only a subset of the + * features on the Scatter graph. Missing features are object gradient for mesh objects, both gradients + * for points, and diffuse and specular color on rotations. At this point static is intended just for + * introducing a new feature. It optimizes graph rendering and is ideal for large non-changing data + * sets. It is slower with dynamic data changes and item rotations. Selection is not optimized, so using it + * with massive data sets is not advisable. + * Defaults to \c{OptimizationDefault} + */ diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index df63ea42..8658d463 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -38,6 +38,7 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_shadowQuality(QAbstract3DGraph::ShadowQualityMedium), m_useOrthoProjection(false), m_aspectRatio(2.0f), + m_optimizationHints(QAbstract3DGraph::OptimizationDefault), m_scene(scene), m_activeInputHandler(0), m_axisX(0), @@ -195,6 +196,11 @@ void Abstract3DController::synchDataToRenderer() m_changeTracker.aspectRatioChanged = false; } + if (m_changeTracker.optimizationHintChanged) { + m_renderer->updateOptimizationHint(m_optimizationHints); + m_changeTracker.optimizationHintChanged = false; + } + if (m_changeTracker.axisXFormatterChanged) { m_changeTracker.axisXFormatterChanged = false; if (m_axisX->type() & QAbstract3DAxis::AxisTypeValue) { @@ -862,6 +868,22 @@ QAbstract3DGraph::ShadowQuality Abstract3DController::shadowQuality() const return m_shadowQuality; } +void Abstract3DController::setOptimizationHints(QAbstract3DGraph::OptimizationHints hints) +{ + if (hints != m_optimizationHints) { + m_optimizationHints = hints; + m_changeTracker.optimizationHintChanged = true; + m_isDataDirty = true; + emit optimizationHintsChanged(hints); + emitNeedRender(); + } +} + +QAbstract3DGraph::OptimizationHints Abstract3DController::optimizationHints() const +{ + return m_optimizationHints; +} + bool Abstract3DController::shadowsSupported() const { #if defined(QT_OPENGL_ES_2) diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index f7e8967d..0e4d1add 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -51,6 +51,7 @@ struct Abstract3DChangeBitField { bool themeChanged : 1; bool shadowQualityChanged : 1; bool selectionModeChanged : 1; + bool optimizationHintChanged : 1; bool axisXTypeChanged : 1; bool axisYTypeChanged : 1; bool axisZTypeChanged : 1; @@ -94,6 +95,7 @@ struct Abstract3DChangeBitField { themeChanged(true), shadowQualityChanged(true), selectionModeChanged(true), + optimizationHintChanged(true), axisXTypeChanged(true), axisYTypeChanged(true), axisZTypeChanged(true), @@ -155,6 +157,7 @@ private: QAbstract3DGraph::ShadowQuality m_shadowQuality; bool m_useOrthoProjection; float m_aspectRatio; + QAbstract3DGraph::OptimizationHints m_optimizationHints; protected: Q3DScene *m_scene; @@ -231,6 +234,9 @@ public: virtual QAbstract3DGraph::ShadowQuality shadowQuality() const; virtual bool shadowsSupported() const; + void setOptimizationHints(QAbstract3DGraph::OptimizationHints hints); + QAbstract3DGraph::OptimizationHints optimizationHints() const; + bool isSlicingActive() const; void setSlicingActive(bool isSlicing); @@ -339,6 +345,7 @@ signals: void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); void aspectRatioChanged(float ratio); + void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 18719483..5d97a6ca 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -35,6 +35,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_cachedShadowQuality(QAbstract3DGraph::ShadowQualityMedium), m_autoScaleAdjustment(1.0f), m_cachedSelectionMode(QAbstract3DGraph::SelectionNone), + m_cachedOptimizationHint(QAbstract3DGraph::OptimizationDefault), m_textureHelper(0), m_cachedScene(new Q3DScene()), m_selectionDirty(true), @@ -286,6 +287,11 @@ void Abstract3DRenderer::updateAspectRatio(float ratio) updateCustomItemPositions(); } +void Abstract3DRenderer::updateOptimizationHint(QAbstract3DGraph::OptimizationHints hint) +{ + m_cachedOptimizationHint = hint; +} + void Abstract3DRenderer::handleResize() { if (m_primarySubViewport.width() == 0 || m_primarySubViewport.height() == 0) diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index b8aad730..0dfc7367 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -75,6 +75,7 @@ public: virtual void updateTheme(Q3DTheme *theme); virtual void updateSelectionMode(QAbstract3DGraph::SelectionFlags newMode); + virtual void updateOptimizationHint(QAbstract3DGraph::OptimizationHints hint); virtual void updateScene(Q3DScene *scene); virtual void updateTextures() = 0; virtual void initSelectionBuffer() = 0; @@ -194,6 +195,7 @@ protected: GLfloat m_autoScaleAdjustment; QAbstract3DGraph::SelectionFlags m_cachedSelectionMode; + QAbstract3DGraph::OptimizationHints m_cachedOptimizationHint; AxisRenderCache m_axisCacheX; AxisRenderCache m_axisCacheY; diff --git a/src/datavisualization/engine/drawer.cpp b/src/datavisualization/engine/drawer.cpp index 8a8df4fd..b8726840 100644 --- a/src/datavisualization/engine/drawer.cpp +++ b/src/datavisualization/engine/drawer.cpp @@ -22,6 +22,7 @@ #include "utils_p.h" #include "texturehelper_p.h" #include "abstract3drenderer_p.h" +#include "scatterpointbufferhelper_p.h" #include #include @@ -205,6 +206,22 @@ void Drawer::drawPoint(ShaderHelper *shader) glDisableVertexAttribArray(shader->posAtt()); } +void Drawer::drawPoints(ShaderHelper *shader, ScatterPointBufferHelper *object) +{ + // 1st attribute buffer : vertices + glEnableVertexAttribArray(shader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, object->pointBuf()); + glVertexAttribPointer(shader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + // Draw the points + glDrawArrays(GL_POINTS, 0, object->indexCount()); + + // Free buffers + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableVertexAttribArray(shader->posAtt()); +} + void Drawer::drawLine(ShaderHelper *shader) { // Draw a single line diff --git a/src/datavisualization/engine/drawer_p.h b/src/datavisualization/engine/drawer_p.h index 966ccb85..ffcea315 100644 --- a/src/datavisualization/engine/drawer_p.h +++ b/src/datavisualization/engine/drawer_p.h @@ -44,6 +44,7 @@ class SurfaceObject; class TextureHelper; class Q3DCamera; class Abstract3DRenderer; +class ScatterPointBufferHelper; class Drawer : public QObject, public QOpenGLFunctions { @@ -78,6 +79,7 @@ public: void drawSelectionObject(ShaderHelper *shader, AbstractObjectHelper *object); void drawSurfaceGrid(ShaderHelper *shader, SurfaceObject *object); void drawPoint(ShaderHelper *shader); + void drawPoints(ShaderHelper *shader, ScatterPointBufferHelper *object); void drawLine(ShaderHelper *shader); void drawLabel(const AbstractRenderItem &item, const LabelItem &labelItem, const QMatrix4x4 &viewmatrix, const QMatrix4x4 &projectionmatrix, diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 71ef7dbb..dabec744 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -139,6 +139,18 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION Custom item. */ +/*! + \enum QAbstract3DGraph::OptimizationHint + \since Qt Data Visualization 1.1 + + The optimization hint for rendering. + + \value OptimizationDefault + Provides the full feature set at a reasonable performance. + \value OptimizationStatic + Beta level feature. Optimizes the rendering of static data sets at the expense of some features. +*/ + /*! * \internal */ @@ -611,6 +623,28 @@ qreal QAbstract3DGraph::aspectRatio() const return d_ptr->m_visualController->aspectRatio(); } +/*! + * \property QAbstract3DGraph::optimizationHints + * + * Defines if the rendering optimization is default or static. Default mode provides the full feature set at + * reasonable performance. Static is a beta level feature and currently supports only a subset of the + * features on the Scatter graph. Missing features are object gradient for mesh objects, both gradients + * for points, and diffuse and specular color on rotations. At this point static is intended just for + * introducing a new feature. It optimizes graph rendering and is ideal for large non-changing data + * sets. It is slower with dynamic data changes and item rotations. Selection is not optimized, so using it + * with massive data sets is not advisable. + * Defaults to \c{OptimizationDefault}. + */ +void QAbstract3DGraph::setOptimizationHints(OptimizationHints hints) +{ + d_ptr->m_visualController->setOptimizationHints(hints); +} + +QAbstract3DGraph::OptimizationHints QAbstract3DGraph::optimizationHints() const +{ + return d_ptr->m_visualController->optimizationHints(); +} + /*! * \internal */ @@ -736,6 +770,8 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraph::selectionModeChanged); QObject::connect(m_visualController, &Abstract3DController::shadowQualityChanged, q_ptr, &QAbstract3DGraph::shadowQualityChanged); + QObject::connect(m_visualController, &Abstract3DController::optimizationHintsChanged, q_ptr, + &QAbstract3DGraph::optimizationHintsChanged); QObject::connect(m_visualController, &Abstract3DController::elementSelected, q_ptr, &QAbstract3DGraph::selectedElementChanged); diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 2d4f18da..59f61aae 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -38,6 +38,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_ENUMS(ShadowQuality) Q_ENUMS(ElementType) Q_FLAGS(SelectionFlag SelectionFlags) + Q_FLAGS(OptimizationHint OptimizationHints) Q_PROPERTY(QAbstract3DInputHandler* activeInputHandler READ activeInputHandler WRITE setActiveInputHandler NOTIFY activeInputHandlerChanged) Q_PROPERTY(Q3DTheme* activeTheme READ activeTheme WRITE setActiveTheme NOTIFY activeThemeChanged) Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) @@ -48,6 +49,7 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged) Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged) + Q_PROPERTY(OptimizationHints optimizationHints READ optimizationHints WRITE setOptimizationHints NOTIFY optimizationHintsChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -87,6 +89,12 @@ public: ElementCustomItem }; + enum OptimizationHint { + OptimizationDefault = 0, + OptimizationStatic = 1 + }; + Q_DECLARE_FLAGS(OptimizationHints, OptimizationHint) + public: virtual ~QAbstract3DGraph(); @@ -139,6 +147,9 @@ public: void setAspectRatio(qreal ratio); qreal aspectRatio() const; + void setOptimizationHints(OptimizationHints hints); + OptimizationHints optimizationHints() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -161,6 +172,7 @@ signals: void currentFpsChanged(qreal fps); void orthoProjectionChanged(bool enabled); void aspectRatioChanged(qreal ratio); + void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints); private: Q_DISABLE_COPY(QAbstract3DGraph) @@ -171,6 +183,7 @@ private: friend class Q3DSurface; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstract3DGraph::SelectionFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(QAbstract3DGraph::OptimizationHints) QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 9a93a7ca..6142f237 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -22,6 +22,8 @@ #include "texturehelper_p.h" #include "utils_p.h" #include "scatterseriesrendercache_p.h" +#include "scatterobjectbufferhelper_p.h" +#include "scatterpointbufferhelper_p.h" #include @@ -63,6 +65,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) m_scaleFactor(0), m_selectedItemIndex(Scatter3DController::invalidSelectionIndex()), m_selectedSeriesCache(0), + m_oldSelectedSeriesCache(0), m_areaSize(QSizeF(0.0, 0.0)), m_dotSizeScale(1.0f), m_hasHeightAdjustmentChanged(true), @@ -163,6 +166,39 @@ void Scatter3DRenderer::updateData() defaultMaxSize)); } + if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic)) { + foreach (SeriesRenderCache *baseCache, m_renderCacheList) { + ScatterSeriesRenderCache *cache = static_cast(baseCache); + if (cache->isVisible()) { + ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + + if (cache->mesh() == QAbstract3DSeries::MeshPoint) { + ScatterPointBufferHelper *points = cache->bufferPoints(); + if (!points) { + points = new ScatterPointBufferHelper(); + cache->setBufferPoints(points); + } + points->load(cache); + } else { + ScatterObjectBufferHelper *object = cache->bufferObject(); + if (!object) { + object = new ScatterObjectBufferHelper(); + cache->setBufferObject(object); + } + if (renderArraySize != cache->oldArraySize() + || cache->object()->objectFile() != cache->oldMeshFileName()) { + object->fullLoad(cache, m_dotSizeScale); + cache->setOldArraySize(renderArraySize); + cache->setOldMeshFileName(cache->object()->objectFile()); + } else { + object->update(cache, m_dotSizeScale); + } + } + } + } + } + updateSelectedItem(m_selectedItemIndex, m_selectedSeriesCache ? m_selectedSeriesCache->series() : 0); } @@ -291,6 +327,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) GLfloat backgroundRotation = 0; GLfloat selectedItemSize = 0.0f; + // Get the optimization flag + const bool optimizationDefault = !m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic); + const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); QVector4D lightColor = Utils::vectorFromColor(m_cachedTheme->lightColor()); @@ -401,19 +440,25 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glPointSize(itemSize * 100.0f * m_shadowQualityMultiplier); } QVector3D modelScaler(itemSize, itemSize, itemSize); - for (int dot = 0; dot < renderArraySize; dot++) { + + int loopCount = 1; + if (optimizationDefault) + loopCount = renderArraySize; + for (int dot = 0; dot < loopCount; dot++) { const ScatterRenderItem &item = renderArray.at(dot); - if (!item.isVisible()) + if (!item.isVisible() && optimizationDefault) continue; QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; - modelMatrix.translate(item.translation()); - if (!drawingPoints) { - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) - modelMatrix.rotate(seriesRotation * item.rotation()); - modelMatrix.scale(modelScaler); + if (optimizationDefault) { + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) + modelMatrix.rotate(seriesRotation * item.rotation()); + modelMatrix.scale(modelScaler); + } } MVPMatrix = depthProjectionViewMatrix * modelMatrix; @@ -421,26 +466,51 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_depthShader->setUniformValue(m_depthShader->MVP(), MVPMatrix); if (drawingPoints) { - m_drawer->drawPoint(m_depthShader); + if (optimizationDefault) + m_drawer->drawPoint(m_depthShader); + else + m_drawer->drawPoints(m_depthShader, cache->bufferPoints()); } else { - // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_depthShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); - glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, - (void *)0); - - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); - - // Draw the triangles - glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, - (void *)0); - - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableVertexAttribArray(m_depthShader->posAtt()); + if (optimizationDefault) { + // 1st attribute buffer : vertices + glEnableVertexAttribArray(m_depthShader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, dotObj->vertexBuf()); + glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, + (void *)0); + + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dotObj->elementBuf()); + + // Draw the triangles + glDrawElements(GL_TRIANGLES, dotObj->indexCount(), GL_UNSIGNED_SHORT, + (void *)0); + + // Free buffers + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableVertexAttribArray(m_depthShader->posAtt()); + } else { + ScatterObjectBufferHelper *object = cache->bufferObject(); + // 1st attribute buffer : vertices + glEnableVertexAttribArray(m_depthShader->posAtt()); + glBindBuffer(GL_ARRAY_BUFFER, object->vertexBuf()); + glVertexAttribPointer(m_depthShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, + (void *)0); + + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object->elementBuf()); + + // Draw the triangles + glDrawElements(GL_TRIANGLES, object->indexCount(), object->indicesType(), + (void *)0); + + // Free buffers + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glDisableVertexAttribArray(m_depthShader->posAtt()); + } } } } @@ -672,24 +742,29 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) baseColor = cache->baseColor(); dotColor = baseColor; } - for (int i = 0; i < renderArraySize; i++) { + int loopCount = 1; + if (optimizationDefault) + loopCount = renderArraySize; + for (int i = 0; i < loopCount; i++) { ScatterRenderItem &item = renderArray[i]; - if (!item.isVisible()) + if (!item.isVisible() && optimizationDefault) continue; QMatrix4x4 modelMatrix; QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(item.translation()); - if (!drawingPoints) { - if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { - QQuaternion totalRotation = seriesRotation * item.rotation(); - modelMatrix.rotate(totalRotation); - itModelMatrix.rotate(totalRotation); + if (optimizationDefault) { + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { + QQuaternion totalRotation = seriesRotation * item.rotation(); + modelMatrix.rotate(totalRotation); + itModelMatrix.rotate(totalRotation); + } + modelMatrix.scale(modelScaler); + itModelMatrix.scale(modelScaler); } - modelMatrix.scale(modelScaler); - itModelMatrix.scale(modelScaler); } #ifdef SHOW_DEPTH_TEXTURE_SCENE MVPMatrix = depthProjectionViewMatrix * modelMatrix; @@ -712,7 +787,7 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) } GLfloat lightStrength = m_cachedTheme->lightStrength(); - if (selectedSeries && (m_selectedItemIndex == i)) { + if (optimizationDefault && selectedSeries && (m_selectedItemIndex == i)) { if (useColor) dotColor = cache->singleHighlightColor(); else @@ -750,6 +825,106 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->depth(), depthMVPMatrix); dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); + // Draw the object + if (optimizationDefault) + m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); + else + m_drawer->drawObject(dotShader, cache->bufferObject(), gradientTexture, m_depthTexture); + } else { + // Draw the object + if (optimizationDefault) + m_drawer->drawPoint(dotShader); + else + m_drawer->drawPoints(dotShader, cache->bufferPoints()); + } + } else +#endif + { + if (!drawingPoints) { + // Set shadowless shader bindings + dotShader->setUniformValue(dotShader->lightS(), lightStrength); + // Draw the object + if (optimizationDefault) + m_drawer->drawObject(dotShader, dotObj, gradientTexture); + else + m_drawer->drawObject(dotShader, cache->bufferObject(), gradientTexture); + } else { + // Draw the object + if (optimizationDefault) + m_drawer->drawPoint(dotShader); + else + m_drawer->drawPoints(dotShader, cache->bufferPoints()); + } + } + } + + // Draw the selected item on static optimization + if (!optimizationDefault && selectedSeries + && m_selectedItemIndex != Scatter3DController::invalidSelectionIndex()) { + ScatterRenderItem &item = renderArray[m_selectedItemIndex]; + ObjectHelper *dotObj = cache->object(); + + QMatrix4x4 modelMatrix; + QMatrix4x4 itModelMatrix; + + modelMatrix.translate(item.translation()); + if (!drawingPoints) { + if (!seriesRotation.isIdentity() || !item.rotation().isIdentity()) { + QQuaternion totalRotation = seriesRotation * item.rotation(); + modelMatrix.rotate(totalRotation); + itModelMatrix.rotate(totalRotation); + } + modelMatrix.scale(modelScaler); + itModelMatrix.scale(modelScaler); + } + + QMatrix4x4 MVPMatrix; +#ifdef SHOW_DEPTH_TEXTURE_SCENE + MVPMatrix = depthProjectionViewMatrix * modelMatrix; +#else + MVPMatrix = projectionViewMatrix * modelMatrix; +#endif + + if (useColor) + dotColor = cache->singleHighlightColor(); + else + gradientTexture = cache->singleHighlightGradientTexture(); + GLfloat lightStrength = m_cachedTheme->highlightLightStrength(); + // Save the reference to the item to be used on label drawing + selectedItem = &item; + dotSelectionFound = true; + // Save selected item size (adjusted with font size) for selection label + // positioning + selectedItemSize = itemSize + (m_cachedTheme->font().pointSizeF() / 500.0f); + + if (!drawingPoints) { + // Set shader bindings + dotShader->setUniformValue(dotShader->model(), modelMatrix); + dotShader->setUniformValue(dotShader->nModel(), + itModelMatrix.inverted().transposed()); + } + + dotShader->setUniformValue(dotShader->MVP(), MVPMatrix); + if (useColor) { + dotShader->setUniformValue(dotShader->color(), dotColor); + } else if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + dotShader->setUniformValue(dotShader->gradientMin(), + (item.translation().y() + 1.0f) / 2.0f); + } + + if (!drawingPoints) { + glEnable(GL_POLYGON_OFFSET_FILL); + glPolygonOffset(-0.5f, 1.0f); + } + +#if !defined(QT_OPENGL_ES_2) + if (m_cachedShadowQuality > QAbstract3DGraph::ShadowQualityNone) { + if (!drawingPoints) { + // Set shadow shader bindings + QMatrix4x4 depthMVPMatrix = depthProjectionViewMatrix * modelMatrix; + dotShader->setUniformValue(dotShader->depth(), depthMVPMatrix); + dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); + // Draw the object m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); } else { @@ -769,6 +944,9 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) m_drawer->drawPoint(dotShader); } } + + if (!drawingPoints) + glDisable(GL_POLYGON_OFFSET_FILL); } } } @@ -1697,10 +1875,24 @@ void Scatter3DRenderer::updateSelectedItem(int index, QScatter3DSeries *series) static_cast(m_renderCacheList.value(series, 0)); m_selectedItemIndex = Scatter3DController::invalidSelectionIndex(); + if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic) + && m_oldSelectedSeriesCache + && m_oldSelectedSeriesCache->mesh() == QAbstract3DSeries::MeshPoint) { + m_oldSelectedSeriesCache->bufferPoints()->popPoint(); + m_oldSelectedSeriesCache = 0; + } + if (m_selectedSeriesCache) { const ScatterRenderItemArray &renderArray = m_selectedSeriesCache->renderArray(); - if (index < renderArray.size() && index >= 0) + if (index < renderArray.size() && index >= 0) { m_selectedItemIndex = index; + + if (m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic) + && m_selectedSeriesCache->mesh() == QAbstract3DSeries::MeshPoint) { + m_selectedSeriesCache->bufferPoints()->pushPoint(m_selectedItemIndex); + m_oldSelectedSeriesCache = m_selectedSeriesCache; + } + } } } diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index b6bafb3b..7f213179 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -72,6 +72,7 @@ private: GLfloat m_scaleFactor; int m_selectedItemIndex; ScatterSeriesRenderCache *m_selectedSeriesCache; + ScatterSeriesRenderCache *m_oldSelectedSeriesCache; QSizeF m_areaSize; GLfloat m_dotSizeScale; bool m_hasHeightAdjustmentChanged; diff --git a/src/datavisualization/engine/scatterseriesrendercache.cpp b/src/datavisualization/engine/scatterseriesrendercache.cpp index 5b2cf1ef..e8888d19 100644 --- a/src/datavisualization/engine/scatterseriesrendercache.cpp +++ b/src/datavisualization/engine/scatterseriesrendercache.cpp @@ -17,6 +17,8 @@ ****************************************************************************/ #include "scatterseriesrendercache_p.h" +#include "scatterobjectbufferhelper_p.h" +#include "scatterpointbufferhelper_p.h" QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -24,12 +26,18 @@ ScatterSeriesRenderCache::ScatterSeriesRenderCache(QAbstract3DSeries *series, Abstract3DRenderer *renderer) : SeriesRenderCache(series, renderer), m_itemSize(0.0f), - m_selectionIndexOffset(0) + m_selectionIndexOffset(0), + m_oldRenderArraySize(0), + m_oldMeshFileName(QString()), + m_scatterBufferObj(0), + m_scatterBufferPoints(0) { } ScatterSeriesRenderCache::~ScatterSeriesRenderCache() { + delete m_scatterBufferObj; + delete m_scatterBufferPoints; } void ScatterSeriesRenderCache::cleanup(TextureHelper *texHelper) diff --git a/src/datavisualization/engine/scatterseriesrendercache_p.h b/src/datavisualization/engine/scatterseriesrendercache_p.h index b2e2d55f..490e21fb 100644 --- a/src/datavisualization/engine/scatterseriesrendercache_p.h +++ b/src/datavisualization/engine/scatterseriesrendercache_p.h @@ -36,6 +36,9 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION +class ScatterObjectBufferHelper; +class ScatterPointBufferHelper; + class ScatterSeriesRenderCache : public SeriesRenderCache { public: @@ -50,11 +53,23 @@ public: inline float itemSize() const { return m_itemSize; } inline void setSelectionIndexOffset(int offset) { m_selectionIndexOffset = offset; } inline int selectionIndexOffset() const { return m_selectionIndexOffset; } + inline int oldArraySize() const { return m_oldRenderArraySize; } + inline void setOldArraySize(int size) { m_oldRenderArraySize = size; } + inline const QString &oldMeshFileName() const { return m_oldMeshFileName; } + inline void setOldMeshFileName(const QString &meshFileName) { m_oldMeshFileName = meshFileName; } + inline void setBufferObject(ScatterObjectBufferHelper *object) { m_scatterBufferObj = object; } + inline ScatterObjectBufferHelper *bufferObject() const { return m_scatterBufferObj; } + inline void setBufferPoints(ScatterPointBufferHelper *object) { m_scatterBufferPoints = object; } + inline ScatterPointBufferHelper *bufferPoints() const { return m_scatterBufferPoints; } protected: ScatterRenderItemArray m_renderArray; float m_itemSize; int m_selectionIndexOffset; // Temporarily cached value for selection color calculations + int m_oldRenderArraySize; // Used to detect if full buffer change needed + QString m_oldMeshFileName; // Used to detect if full buffer change needed + ScatterObjectBufferHelper *m_scatterBufferObj; + ScatterPointBufferHelper *m_scatterBufferPoints; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/objecthelper.cpp b/src/datavisualization/utils/objecthelper.cpp index 30f119f2..a66e0f7e 100644 --- a/src/datavisualization/utils/objecthelper.cpp +++ b/src/datavisualization/utils/objecthelper.cpp @@ -118,6 +118,10 @@ void ObjectHelper::load() glDeleteBuffers(1, &m_uvbuffer); glDeleteBuffers(1, &m_normalbuffer); glDeleteBuffers(1, &m_elementbuffer); + m_indices.clear(); + m_indexedVertices.clear(); + m_indexedUVs.clear(); + m_indexedNormals.clear(); } QVector vertices; QVector uvs; @@ -127,36 +131,32 @@ void ObjectHelper::load() qFatal("loading failed"); // Index vertices - QVector indices; - QVector indexed_vertices; - QVector indexed_uvs; - QVector indexed_normals; - VertexIndexer::indexVBO(vertices, uvs, normals, indices, indexed_vertices, indexed_uvs, - indexed_normals); + VertexIndexer::indexVBO(vertices, uvs, normals, m_indices, m_indexedVertices, m_indexedUVs, + m_indexedNormals); - m_indexCount = indices.size(); + m_indexCount = m_indices.size(); glGenBuffers(1, &m_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); - glBufferData(GL_ARRAY_BUFFER, indexed_vertices.size() * sizeof(QVector3D), - &indexed_vertices.at(0), + glBufferData(GL_ARRAY_BUFFER, m_indexedVertices.size() * sizeof(QVector3D), + &m_indexedVertices.at(0), GL_STATIC_DRAW); glGenBuffers(1, &m_normalbuffer); glBindBuffer(GL_ARRAY_BUFFER, m_normalbuffer); - glBufferData(GL_ARRAY_BUFFER, indexed_normals.size() * sizeof(QVector3D), - &indexed_normals.at(0), + glBufferData(GL_ARRAY_BUFFER, m_indexedNormals.size() * sizeof(QVector3D), + &m_indexedNormals.at(0), GL_STATIC_DRAW); glGenBuffers(1, &m_uvbuffer); glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); - glBufferData(GL_ARRAY_BUFFER, indexed_uvs.size() * sizeof(QVector2D), - &indexed_uvs.at(0), GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, m_indexedUVs.size() * sizeof(QVector2D), + &m_indexedUVs.at(0), GL_STATIC_DRAW); glGenBuffers(1, &m_elementbuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_elementbuffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned short), - &indices.at(0), GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size() * sizeof(unsigned short), + &m_indices.at(0), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); diff --git a/src/datavisualization/utils/objecthelper_p.h b/src/datavisualization/utils/objecthelper_p.h index 1c3217b7..c84f53bd 100644 --- a/src/datavisualization/utils/objecthelper_p.h +++ b/src/datavisualization/utils/objecthelper_p.h @@ -46,15 +46,23 @@ public: static void resetObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj, const QString &meshFile); static void releaseObjectHelper(const Abstract3DRenderer *cacheId, ObjectHelper *&obj); - inline const QString &objectFile() { return m_objectFile; } + inline const QVector &indices() const { return m_indices; } + inline const QVector &indexedvertices() const { return m_indexedVertices; } + inline const QVector &indexedUVs() const { return m_indexedUVs; } + inline const QVector &indexedNormals() const { return m_indexedNormals; } + private: static ObjectHelper *getObjectHelper(const Abstract3DRenderer *cacheId, const QString &objectFile); void load(); QString m_objectFile; + QVector m_indices; + QVector m_indexedVertices; + QVector m_indexedUVs; + QVector m_indexedNormals; }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/scatterobjectbufferhelper.cpp b/src/datavisualization/utils/scatterobjectbufferhelper.cpp new file mode 100644 index 00000000..123588f1 --- /dev/null +++ b/src/datavisualization/utils/scatterobjectbufferhelper.cpp @@ -0,0 +1,226 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "scatterobjectbufferhelper_p.h" +#include "objecthelper_p.h" +#include +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +const GLfloat itemScaler = 3.0f; + +ScatterObjectBufferHelper::ScatterObjectBufferHelper() +{ + m_indicesType = GL_UNSIGNED_INT; +} + +ScatterObjectBufferHelper::~ScatterObjectBufferHelper() +{ +} + +void ScatterObjectBufferHelper::fullLoad(ScatterSeriesRenderCache *cache, qreal dotScale) +{ + initializeOpenGLFunctions(); + + ObjectHelper *dotObj = cache->object(); + ScatterRenderItemArray &renderArray = cache->renderArray(); + const uint renderArraySize = renderArray.size(); + uint itemCount = renderArraySize; + QQuaternion seriesRotation(cache->meshRotation()); + + if (m_meshDataLoaded) { + // Delete old data + glDeleteBuffers(1, &m_vertexbuffer); + glDeleteBuffers(1, &m_uvbuffer); + glDeleteBuffers(1, &m_normalbuffer); + glDeleteBuffers(1, &m_elementbuffer); + } + + // Index vertices + const QVector indices = dotObj->indices(); + const QVector indexed_vertices = dotObj->indexedvertices(); + const QVector indexed_uvs = dotObj->indexedUVs(); + const QVector indexed_normals = dotObj->indexedNormals(); + int indicesCount = indices.count(); + int verticeCount = indexed_vertices.count(); + int uvsCount = indexed_uvs.count(); + int normalsCount = indexed_normals.count(); + + float itemSize = cache->itemSize() / itemScaler; + if (itemSize == 0.0f) + itemSize = dotScale; + QVector3D modelScaler(itemSize, itemSize, itemSize); + QMatrix4x4 modelMatrix; + if (!seriesRotation.isIdentity()) { + QMatrix4x4 matrix; + matrix.rotate(seriesRotation); + modelMatrix = matrix.transposed(); + } + modelMatrix.scale(modelScaler); + + QVector scaled_vertices; + scaled_vertices.resize(verticeCount); + for (int i = 0; i < verticeCount; i++) + scaled_vertices[i] = indexed_vertices[i] * modelMatrix; + + QVector buffered_indices; + QVector buffered_vertices; + QVector buffered_uvs; + QVector buffered_normals; + + buffered_indices.resize(indicesCount * renderArraySize); + buffered_vertices.resize(verticeCount * renderArraySize); + buffered_uvs.resize(uvsCount * renderArraySize); + buffered_normals.resize(normalsCount * renderArraySize); + uint pos = 0; + for (uint i = 0; i < renderArraySize; i++) { + ScatterRenderItem &item = renderArray[i]; + if (!item.isVisible()) { + itemCount--; + continue; + } + + int offset = pos * verticeCount; + if (item.rotation().isIdentity()) { + for (int j = 0; j < verticeCount; j++) + buffered_vertices[j + offset] = scaled_vertices[j] + item.translation(); + } else { + QMatrix4x4 matrix; + matrix.rotate(seriesRotation * item.rotation()); + modelMatrix = matrix.transposed(); + modelMatrix.scale(modelScaler); + + for (int j = 0; j < verticeCount; j++) + buffered_vertices[j + offset] = indexed_vertices[j] * modelMatrix + + item.translation(); + } + + offset = pos * normalsCount; + for (int j = 0; j < normalsCount; j++) + buffered_normals[j + offset] = indexed_normals[j]; + + offset = pos * uvsCount; + for (int j = 0; j < uvsCount; j++) + buffered_uvs[j + offset] = indexed_uvs[j]; + + int offsetVertice = i * verticeCount; + offset = pos * indicesCount; + for (int j = 0; j < indicesCount; j++) { + buffered_indices[j + offset] = GLuint(indices[j] + offsetVertice); + } + + pos++; + } + + m_indexCount = indicesCount * itemCount; + + glGenBuffers(1, &m_vertexbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); + glBufferData(GL_ARRAY_BUFFER, verticeCount * itemCount * sizeof(QVector3D), + &buffered_vertices.at(0), + GL_STATIC_DRAW); + + glGenBuffers(1, &m_normalbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_normalbuffer); + glBufferData(GL_ARRAY_BUFFER, normalsCount * itemCount * sizeof(QVector3D), + &buffered_normals.at(0), + GL_STATIC_DRAW); + + glGenBuffers(1, &m_uvbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_uvbuffer); + glBufferData(GL_ARRAY_BUFFER, uvsCount * itemCount * sizeof(QVector2D), + &buffered_uvs.at(0), GL_STATIC_DRAW); + + glGenBuffers(1, &m_elementbuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_elementbuffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesCount * itemCount * sizeof(GLint), + &buffered_indices.at(0), GL_STATIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + m_meshDataLoaded = true; +} + +void ScatterObjectBufferHelper::update(ScatterSeriesRenderCache *cache, qreal dotScale) +{ + initializeOpenGLFunctions(); + + ObjectHelper *dotObj = cache->object(); + ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + QQuaternion seriesRotation(cache->meshRotation()); + + // Index vertices + const QVector indexed_vertices = dotObj->indexedvertices(); + int verticeCount = indexed_vertices.count(); + + float itemSize = cache->itemSize() / itemScaler; + if (itemSize == 0.0f) + itemSize = dotScale; + QVector3D modelScaler(itemSize, itemSize, itemSize); + QMatrix4x4 modelMatrix; + if (!seriesRotation.isIdentity()) { + QMatrix4x4 matrix; + matrix.rotate(seriesRotation); + modelMatrix = matrix.transposed(); + } + modelMatrix.scale(modelScaler); + + QVector scaled_vertices; + scaled_vertices.resize(verticeCount); + for (int i = 0; i < verticeCount; i++) + scaled_vertices[i] = indexed_vertices[i] * modelMatrix; + + QVector buffered_vertices; + + buffered_vertices.resize(verticeCount * renderArraySize); + for (int i = 0; i < renderArraySize; i++) { + ScatterRenderItem &item = renderArray[i]; + if (!item.isVisible()) + continue; + + const int offset = i * verticeCount; + if (item.rotation().isIdentity()) { + for (int j = 0; j < verticeCount; j++) + buffered_vertices[j + offset] = scaled_vertices[j] + item.translation(); + } else { + QMatrix4x4 matrix; + matrix.rotate(seriesRotation * item.rotation()); + modelMatrix = matrix.transposed(); + modelMatrix.scale(modelScaler); + + for (int j = 0; j < verticeCount; j++) + buffered_vertices[j + offset] = indexed_vertices[j] * modelMatrix + + item.translation(); + } + } + + glBindBuffer(GL_ARRAY_BUFFER, m_vertexbuffer); + glBufferData(GL_ARRAY_BUFFER, buffered_vertices.size() * sizeof(QVector3D), + &buffered_vertices.at(0), + GL_DYNAMIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + m_meshDataLoaded = true; +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/scatterobjectbufferhelper_p.h b/src/datavisualization/utils/scatterobjectbufferhelper_p.h new file mode 100644 index 00000000..0bba45f5 --- /dev/null +++ b/src/datavisualization/utils/scatterobjectbufferhelper_p.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef SCATTEROBJECTBUFFERHELPER_P_H +#define SCATTEROBJECTBUFFERHELPER_P_H + +#include "datavisualizationglobal_p.h" +#include "abstractobjecthelper_p.h" +#include "scatterseriesrendercache_p.h" +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class ScatterObjectBufferHelper : public AbstractObjectHelper +{ +public: + ScatterObjectBufferHelper(); + ~ScatterObjectBufferHelper(); + + void fullLoad(ScatterSeriesRenderCache *cache, qreal dotScale); + void update(ScatterSeriesRenderCache *cache, qreal dotScale); +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/utils/scatterpointbufferhelper.cpp b/src/datavisualization/utils/scatterpointbufferhelper.cpp new file mode 100644 index 00000000..0f290aeb --- /dev/null +++ b/src/datavisualization/utils/scatterpointbufferhelper.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "scatterpointbufferhelper_p.h" + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +const GLfloat itemScaler = 3.0f; +const QVector3D hiddenPos(-1000.0f, -1000.0f, -1000.0f); + +ScatterPointBufferHelper::ScatterPointBufferHelper() + : m_pointbuffer(0), + m_oldRemoveIndex(0), + m_oldRemove(false) +{ + m_indicesType = GL_UNSIGNED_INT; +} + +ScatterPointBufferHelper::~ScatterPointBufferHelper() +{ + if (QOpenGLContext::currentContext()) + glDeleteBuffers(1, &m_pointbuffer); +} + +GLuint ScatterPointBufferHelper::pointBuf() +{ + if (!m_meshDataLoaded) + qFatal("No loaded object"); + return m_pointbuffer; +} + +void ScatterPointBufferHelper::pushPoint(uint pointIndex) +{ + glBindBuffer(GL_ARRAY_BUFFER, m_pointbuffer); + + if (m_oldRemove && m_oldRemoveIndex < pointIndex) { + glBufferSubData(GL_ARRAY_BUFFER, m_oldRemoveIndex * sizeof(QVector3D), + sizeof(QVector3D), &m_bufferedPoints.at(m_oldRemoveIndex)); + } + + glBufferSubData(GL_ARRAY_BUFFER, pointIndex * sizeof(QVector3D), + sizeof(QVector3D), + &hiddenPos); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + m_oldRemoveIndex = pointIndex; + m_oldRemove = true; +} + +void ScatterPointBufferHelper::popPoint() +{ + if (m_oldRemove) { + glBindBuffer(GL_ARRAY_BUFFER, m_pointbuffer); + glBufferSubData(GL_ARRAY_BUFFER, m_oldRemoveIndex * sizeof(QVector3D), + sizeof(QVector3D), &m_bufferedPoints.at(m_oldRemoveIndex)); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + + m_oldRemoveIndex = 0; + m_oldRemove = false; +} + +void ScatterPointBufferHelper::load(ScatterSeriesRenderCache *cache) +{ + initializeOpenGLFunctions(); + + ScatterRenderItemArray &renderArray = cache->renderArray(); + const int renderArraySize = renderArray.size(); + + if (m_meshDataLoaded) { + // Delete old data + glDeleteBuffers(1, &m_pointbuffer); + m_bufferedPoints.clear(); + } + + m_bufferedPoints.resize(renderArraySize); + for (int i = 0; i < renderArraySize; i++) { + ScatterRenderItem &item = renderArray[i]; + if (!item.isVisible()) + m_bufferedPoints[i] = hiddenPos; + else + m_bufferedPoints[i] = item.translation(); + } + + m_indexCount = renderArraySize; + + glGenBuffers(1, &m_pointbuffer); + glBindBuffer(GL_ARRAY_BUFFER, m_pointbuffer); + glBufferData(GL_ARRAY_BUFFER, m_bufferedPoints.size() * sizeof(QVector3D), + &m_bufferedPoints.at(0), + GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + m_meshDataLoaded = true; +} + +QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/scatterpointbufferhelper_p.h b/src/datavisualization/utils/scatterpointbufferhelper_p.h new file mode 100644 index 00000000..39903b1a --- /dev/null +++ b/src/datavisualization/utils/scatterpointbufferhelper_p.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the QtDataVisualization API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef SCATTERPOINTBUFFERHELPER_P_H +#define SCATTERPOINTBUFFERHELPER_P_H + +#include "datavisualizationglobal_p.h" +#include "abstractobjecthelper_p.h" +#include "scatterseriesrendercache_p.h" +#include + +QT_BEGIN_NAMESPACE_DATAVISUALIZATION + +class ScatterPointBufferHelper : public AbstractObjectHelper +{ +public: + ScatterPointBufferHelper(); + ~ScatterPointBufferHelper(); + + GLuint pointBuf(); + + void pushPoint(uint pointIndex); + void popPoint(); + void load(ScatterSeriesRenderCache *cache); + +public: + GLuint m_pointbuffer; + +private: + QVector m_bufferedPoints; + uint m_oldRemoveIndex; + bool m_oldRemove; +}; + +QT_END_NAMESPACE_DATAVISUALIZATION + +#endif diff --git a/src/datavisualization/utils/utils.pri b/src/datavisualization/utils/utils.pri index 8ce8794e..30bfb156 100644 --- a/src/datavisualization/utils/utils.pri +++ b/src/datavisualization/utils/utils.pri @@ -7,7 +7,9 @@ HEADERS += $$PWD/meshloader_p.h \ $$PWD/utils_p.h \ $$PWD/abstractobjecthelper_p.h \ $$PWD/surfaceobject_p.h \ - $$PWD/qutils.h + $$PWD/qutils.h \ + $$PWD/scatterobjectbufferhelper_p.h \ + $$PWD/scatterpointbufferhelper_p.h SOURCES += $$PWD/meshloader.cpp \ $$PWD/vertexindexer.cpp \ @@ -17,4 +19,6 @@ SOURCES += $$PWD/meshloader.cpp \ $$PWD/texturehelper.cpp \ $$PWD/utils.cpp \ $$PWD/abstractobjecthelper.cpp \ - $$PWD/surfaceobject.cpp + $$PWD/surfaceobject.cpp \ + $$PWD/scatterobjectbufferhelper.cpp \ + $$PWD/scatterpointbufferhelper.cpp diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 04c41964..a6dee6eb 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -699,6 +699,18 @@ qreal AbstractDeclarative::aspectRatio() const return m_controller->aspectRatio(); } +void AbstractDeclarative::setOptimizationHints(OptimizationHints hints) +{ + int intmode = int(hints); + m_controller->setOptimizationHints(QAbstract3DGraph::OptimizationHints(intmode)); +} + +AbstractDeclarative::OptimizationHints AbstractDeclarative::optimizationHints() const +{ + int intmode = int(m_controller->optimizationHints()); + return OptimizationHints(intmode); +} + void AbstractDeclarative::windowDestroyed(QObject *obj) { // Remove destroyed window from window lists diff --git a/src/datavisualizationqml2/abstractdeclarative_p.h b/src/datavisualizationqml2/abstractdeclarative_p.h index ce19edd2..ebe8b49c 100644 --- a/src/datavisualizationqml2/abstractdeclarative_p.h +++ b/src/datavisualizationqml2/abstractdeclarative_p.h @@ -56,6 +56,7 @@ class AbstractDeclarative : public QQuickItem Q_ENUMS(RenderingMode) Q_ENUMS(ElementType) Q_FLAGS(SelectionFlag SelectionFlags) + Q_FLAGS(OptimizationHint OptimizationHints) Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) Q_PROPERTY(bool shadowsSupported READ shadowsSupported NOTIFY shadowsSupportedChanged) @@ -70,6 +71,7 @@ class AbstractDeclarative : public QQuickItem Q_PROPERTY(bool orthoProjection READ isOrthoProjection WRITE setOrthoProjection NOTIFY orthoProjectionChanged REVISION 1) Q_PROPERTY(ElementType selectedElement READ selectedElement NOTIFY selectedElementChanged REVISION 1) Q_PROPERTY(qreal aspectRatio READ aspectRatio WRITE setAspectRatio NOTIFY aspectRatioChanged REVISION 1) + Q_PROPERTY(OptimizationHints optimizationHints READ optimizationHints WRITE setOptimizationHints NOTIFY optimizationHintsChanged REVISION 1) public: enum SelectionFlag { @@ -111,6 +113,12 @@ public: RenderIndirect }; + enum OptimizationHint { + OptimizationDefault = 0, + OptimizationStatic = 1 + }; + Q_DECLARE_FLAGS(OptimizationHints, OptimizationHint) + public: explicit AbstractDeclarative(QQuickItem *parent = 0); virtual ~AbstractDeclarative(); @@ -182,6 +190,9 @@ public: void setAspectRatio(qreal ratio); qreal aspectRatio() const; + void setOptimizationHints(OptimizationHints hints); + OptimizationHints optimizationHints() const; + public slots: virtual void handleAxisXChanged(QAbstract3DAxis *axis) = 0; virtual void handleAxisYChanged(QAbstract3DAxis *axis) = 0; @@ -216,6 +227,7 @@ signals: Q_REVISION(1) void selectedElementChanged(QAbstract3DGraph::ElementType type); Q_REVISION(1) void orthoProjectionChanged(bool enabled); Q_REVISION(1) void aspectRatioChanged(qreal ratio); + Q_REVISION(1) void optimizationHintsChanged(QAbstract3DGraph::OptimizationHints hints); private: QPointer m_controller; @@ -236,6 +248,7 @@ private: bool m_runningInDesigner; }; Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::SelectionFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDeclarative::OptimizationHints) QT_END_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From 7a2b9e43c7ebaa88a43e9960c405cc5ead07480e Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 5 Jun 2014 11:03:37 +0300 Subject: Minor doc fix to scene MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ibff77f2aea13c7627bf612ae75358025231198c8 Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/q3dscene.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp index 62cb681a..9464bc8d 100644 --- a/src/datavisualization/engine/q3dscene.cpp +++ b/src/datavisualization/engine/q3dscene.cpp @@ -255,8 +255,12 @@ void Q3DScene::setSecondarySubViewport(const QRect &secondarySubViewport) * * This property contains the coordinates for the user input that should be processed * by the scene as selection. If this is set to value other than invalidSelectionPoint() the - * graph tries to select a data item at the given \a point within the primary viewport. - * After the rendering pass the property is returned to its default state of invalidSelectionPoint(). + * graph tries to select a data item, axis label, or a custom item at the given \a point within + * the primary viewport. + * After the rendering pass the property is returned to its default state of + * invalidSelectionPoint(). + * + * \sa QAbstract3DGraph::selectedElement */ void Q3DScene::setSelectionQueryPosition(const QPoint &point) { -- cgit v1.2.3 From 2fc831ff5fa7662318e008fb250e633a8b61a368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomi=20Korpip=C3=A4=C3=A4?= Date: Thu, 5 Jun 2014 11:39:10 +0300 Subject: Clean up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-3149 Change-Id: Ife8937e93b06b118b369ff909097a137106736cf Reviewed-by: Tomi Korpipää --- src/datavisualization/engine/scatter3drenderer.cpp | 36 ++++++++++++++-------- .../utils/scatterobjectbufferhelper_p.h | 1 - .../utils/scatterpointbufferhelper_p.h | 1 - 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 6142f237..21d86d03 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -293,7 +293,8 @@ void Scatter3DRenderer::updateScene(Q3DScene *scene) if (m_hasHeightAdjustmentChanged) { // Set initial camera position. Also update if height adjustment has changed. - scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector, zeroVector, upVector); + scene->activeCamera()->d_ptr->setBaseOrientation(cameraDistanceVector, zeroVector, + upVector); m_hasHeightAdjustmentChanged = false; } @@ -328,7 +329,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) GLfloat selectedItemSize = 0.0f; // Get the optimization flag - const bool optimizationDefault = !m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic); + const bool optimizationDefault = + !m_cachedOptimizationHint.testFlag(QAbstract3DGraph::OptimizationStatic); const Q3DCamera *activeCamera = m_cachedScene->activeCamera(); @@ -426,7 +428,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) // Draw dots to depth buffer foreach (SeriesRenderCache *baseCache, m_renderCacheList) { if (baseCache->isVisible()) { - ScatterSeriesRenderCache *cache = static_cast(baseCache); + ScatterSeriesRenderCache *cache = + static_cast(baseCache); ObjectHelper *dotObj = cache->object(); QQuaternion seriesRotation(cache->meshRotation()); const ScatterRenderItemArray &renderArray = cache->renderArray(); @@ -502,8 +505,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object->elementBuf()); // Draw the triangles - glDrawElements(GL_TRIANGLES, object->indexCount(), object->indicesType(), - (void *)0); + glDrawElements(GL_TRIANGLES, object->indexCount(), + object->indicesType(), (void *)0); // Free buffers glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); @@ -826,10 +829,13 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) dotShader->setUniformValue(dotShader->lightS(), lightStrength / 10.0f); // Draw the object - if (optimizationDefault) - m_drawer->drawObject(dotShader, dotObj, gradientTexture, m_depthTexture); - else - m_drawer->drawObject(dotShader, cache->bufferObject(), gradientTexture, m_depthTexture); + if (optimizationDefault) { + m_drawer->drawObject(dotShader, dotObj, gradientTexture, + m_depthTexture); + } else { + m_drawer->drawObject(dotShader, cache->bufferObject(), gradientTexture, + m_depthTexture); + } } else { // Draw the object if (optimizationDefault) @@ -1110,7 +1116,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(0.0f, yFloorLinePosition, m_axisCacheZ.gridLinePosition(line)); + modelMatrix.translate(0.0f, yFloorLinePosition, + m_axisCacheZ.gridLinePosition(line)); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1222,7 +1229,8 @@ void Scatter3DRenderer::drawScene(const GLuint defaultFboHandle) QMatrix4x4 MVPMatrix; QMatrix4x4 itModelMatrix; - modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, 0.0f); + modelMatrix.translate(m_axisCacheX.gridLinePosition(line), yFloorLinePosition, + 0.0f); modelMatrix.scale(gridLineScaler); itModelMatrix.scale(gridLineScaler); @@ -1777,8 +1785,10 @@ void Scatter3DRenderer::drawLabels(bool drawSelection, const Q3DCamera *activeCa GLfloat labelMarginZTrans = labelMargin; QVector3D backLabelRotation(0.0f, -90.0f, 0.0f); QVector3D sideLabelRotation(0.0f, 0.0f, 0.0f); - Qt::AlignmentFlag backAlignment = (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; - Qt::AlignmentFlag sideAlignment = (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag backAlignment = + (m_xFlipped != m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; + Qt::AlignmentFlag sideAlignment = + (m_xFlipped == m_zFlipped) ? Qt::AlignLeft : Qt::AlignRight; if (!m_xFlipped) { labelXTrans = -labelXTrans; labelMarginXTrans = -labelMargin; diff --git a/src/datavisualization/utils/scatterobjectbufferhelper_p.h b/src/datavisualization/utils/scatterobjectbufferhelper_p.h index 0bba45f5..952c3d7d 100644 --- a/src/datavisualization/utils/scatterobjectbufferhelper_p.h +++ b/src/datavisualization/utils/scatterobjectbufferhelper_p.h @@ -32,7 +32,6 @@ #include "datavisualizationglobal_p.h" #include "abstractobjecthelper_p.h" #include "scatterseriesrendercache_p.h" -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/utils/scatterpointbufferhelper_p.h b/src/datavisualization/utils/scatterpointbufferhelper_p.h index 39903b1a..b3adcfa8 100644 --- a/src/datavisualization/utils/scatterpointbufferhelper_p.h +++ b/src/datavisualization/utils/scatterpointbufferhelper_p.h @@ -32,7 +32,6 @@ #include "datavisualizationglobal_p.h" #include "abstractobjecthelper_p.h" #include "scatterseriesrendercache_p.h" -#include QT_BEGIN_NAMESPACE_DATAVISUALIZATION -- cgit v1.2.3 From c51e0f83ef6dd9e85db6953995585ba0cafb35d7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 5 Jun 2014 11:13:19 +0300 Subject: Changes file for 1.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia452a6b30df6ea16e7d7fbfb6060a489b82fde11 Reviewed-by: Tomi Korpipää --- dist/changes-1.1.0 | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 dist/changes-1.1.0 diff --git a/dist/changes-1.1.0 b/dist/changes-1.1.0 new file mode 100644 index 00000000..8a470ccb --- /dev/null +++ b/dist/changes-1.1.0 @@ -0,0 +1,77 @@ +Qt Data Visualization 1.1 + +New features +------------ + +- Support for rendering the graph into an image. +- QValue3DAxisFormatter class for creating custom value axis formatters. + With a custom formatter, you can control axis grid line and label positions, + as well as fully customize the label strings. +- Logarithmic value axes are now supported via a QLogValue3DAxisFormatter. +- Support for adding custom items and labels inside the graph with + QCustom3DItem and QCustom3DLabel classes. +- Q3DScene::selectionQueryPosition now can select axis labels and custom items + as well as data items. Selection is detected via QAbstract3DGraph::selectedElement + property. +- The current frames per second (FPS) measurement can be enabled and queried via + QAbstract3DGraph::measureFps and QAbstract3DGraph::currentFps properties. +- QValue3DAxis::reversed property allows drawing the axis in reverse direction. +- A single item model role can be mapped to multiple properties of the data items + when using item model proxies. Regular expression search and replace can be used + to make the data unique for each property. Useful for parsing e.g. timestamp field + to get values for both rows and columns of a bar chart. +- Support for aggregating multiple mapping matches in bar and surface item model + proxies into single bar or surface point. +- Support for orthographic projection in graphs via QAbstract3DGraph::orthoProjection. +- Axis labels can now be set to automatically orient towards the camera with + QAbstract3DAxis::labelAutoRotation property to increase label readability + at all angles. +- Bars3D: Clicking row/column labels can now be used to highlight rows/columns if + the selection mode allows it. +- Surface3D: X values in items of a row and Z values of items of a column can now be + either ascending or descending for the surface to be valid. +- Aspect ratio, i.e. the ratio between horizontal and vertical axes can be changed + for scatter and surface graphs. +- Axis titles can now be optionally displayed beside the axes in the primary graph view. +- Added support for optional optimizations via QAbstract3DGraph::optimizationHints. + Note: This feature is currently in beta. The only optimization hint currently supported + is OptimizationStatic for scatter graphs, which vastly improves the render speed for + large static data sets, allowing millions of points to be displayed on desktop platforms. + +Fixed issues +------------ + +General: +- Optimized series caching in renderer. +- Optimized object mesh caching in renderer. +- Optimized visible are calculation for surface graphs. +- Fixed crash when setting null color/gradient to theme in QML. +- Fixed overriding theme color with explicit series color in QML. +- Optimized changing only single item/row in data proxies. +- Fixed a crash when using both Qt Charts and Qt Data Visualization in the same application. + Note: This causes a binary break for the item model proxies. +- Bars3D: Fixed incorrect label positioning in slice mode when grid off. +- Bars3D: User defined meshes that have flat base no longer glimmer through graph floor + when viewed from below. +- Scatter3D: Range gradient now works for MeshPoints. +- Surface3D: Fixed a crash when shadows were supported by OpenGL but flat shading was not. +- Surface3D: Selection texture no longer gets corrupted in case there are multiple surfaces + visible and the axis ranges are adjusted. +- Surface3D: Fixed shadow culling, improving the shadow cast on the surface itself. + +New examples +------------ + +- customitems: Example about showing custom items and labels in the graph. +- draggableaxes: Shows how to implement an input handler to enable scrolling + the graph via dragging the axes. +- qmlaxisdrag: Shows how to implement an input handler to enable scrolling + the graph via dragging the axes in QML. +- qmlaxisformatter: Shows how to use customize axes using axis formatters. + +Platform specific changes +------------------------- + +- Fixed issue with graph not always updating before rotating the graph in iOS. +- Fixed shader linking error on some Android versions. +- Fixed memory leaks in Mac and Android builds. -- cgit v1.2.3