File indexing completed on 2024-05-12 03:45:46

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "ellipsenode.h"
0007 
0008 #include <QSGFlatColorMaterial>
0009 #include <QSGGeometry>
0010 #include <QSGGeometryNode>
0011 
0012 #include <cmath>
0013 
0014 EllipseNode::EllipseNode(const QColor &color, int width)
0015     : m_geometryNode(new QSGGeometryNode), m_material(new QSGFlatColorMaterial)
0016 {
0017     m_geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0);
0018     m_geometry->allocate(60);
0019     m_geometryNode->setGeometry(m_geometry);
0020     m_geometryNode->setFlag(QSGNode::OwnsGeometry);
0021 
0022     m_geometryNode->setOpaqueMaterial(m_material);
0023     m_geometryNode->setFlag(QSGNode::OwnsMaterial);
0024 
0025     if (color.isValid())
0026     {
0027         setColor(color);
0028     }
0029     setLineWidth(width);
0030 
0031     appendChildNode(m_geometryNode);
0032 }
0033 
0034 void EllipseNode::setColor(QColor color)
0035 {
0036     if (color != m_material->color())
0037     {
0038         m_material->setColor(color);
0039         m_geometryNode->markDirty(QSGNode::DirtyMaterial);
0040     }
0041 }
0042 
0043 void EllipseNode::setLineWidth(int width)
0044 {
0045     if (width != m_geometry->lineWidth())
0046     {
0047         m_geometry->setLineWidth(width);
0048         m_geometryNode->markDirty(QSGNode::DirtyGeometry);
0049     }
0050 }
0051 
0052 void EllipseNode::updateGeometry(float x, float y, int width, int height, bool filled)
0053 {
0054     if (filled)
0055     {
0056         m_geometry->setDrawingMode(GL_TRIANGLE_FAN);
0057     }
0058     else
0059     {
0060         m_geometry->setDrawingMode(GL_LINE_LOOP);
0061     }
0062 
0063     QSGGeometry::Point2D *vertex = m_geometry->vertexDataAsPoint2D();
0064 
0065     float rad = M_PI / 180;
0066 
0067     width /= 2;
0068     height /= 2;
0069 
0070     if (m_width != width || m_height != height)
0071     {
0072         for (int i = 0; i < 360; i += 6)
0073         {
0074             vertex[i / 6].x = width * cos(i * rad);
0075             vertex[i / 6].y = height * sin(i * rad);
0076         }
0077         m_geometryNode->markDirty(QSGNode::DirtyGeometry);
0078 
0079         m_width  = width;
0080         m_height = height;
0081     }
0082     if (m_x != x || m_y != y)
0083     {
0084         QMatrix4x4 m(1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, 0, 0, 0, 0, 1);
0085         setMatrix(m);
0086         markDirty(QSGNode::DirtyMatrix);
0087 
0088         m_x = x;
0089         m_y = y;
0090     }
0091 }