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 }