File indexing completed on 2024-04-28 03:44:26

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "satellitenode.h"
0007 
0008 #include "ksutils.h"
0009 #include "labelnode.h"
0010 #include "linelist.h"
0011 #include "Options.h"
0012 #include "satellite.h"
0013 #include "nodes/pointnode.h"
0014 #include "nodes/polynode.h"
0015 #include "../rootnode.h"
0016 #include "../labelsitem.h"
0017 
0018 #include <QSGFlatColorMaterial>
0019 
0020 SatelliteNode::SatelliteNode(Satellite *sat, RootNode *rootNode)
0021     : m_sat(sat), m_rootNode(rootNode)
0022 {
0023 }
0024 
0025 void SatelliteNode::initLines()
0026 {
0027     if (m_point)
0028     {
0029         delete m_point;
0030         m_point = 0;
0031     }
0032     if (!m_lines)
0033     {
0034         m_lines    = new QSGGeometryNode;
0035         m_geometry = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0);
0036         m_lines->setGeometry(m_geometry);
0037         m_lines->setFlag(QSGNode::OwnsGeometry);
0038         m_geometry->setDrawingMode(GL_LINES);
0039 
0040         m_material = new QSGFlatColorMaterial;
0041         m_lines->setOpaqueMaterial(m_material);
0042         m_lines->setFlag(QSGNode::OwnsMaterial);
0043         addChildNode(m_lines);
0044 
0045         m_geometry->allocate(8);
0046         QSGGeometry::Point2D *vertex = m_geometry->vertexDataAsPoint2D();
0047 
0048         vertex[0].set(-0.5, -0.5);
0049         vertex[1].set(0.5, -0.5);
0050         vertex[2].set(0.5, -0.5);
0051         vertex[3].set(0.5, 0.5);
0052         vertex[4].set(0.5, 0.5);
0053         vertex[5].set(-0.5, 0.5);
0054         vertex[6].set(-0.5, 0.5);
0055         vertex[7].set(-0.5, -0.5);
0056 
0057         m_lines->markDirty(QSGNode::DirtyGeometry);
0058         m_lines->markDirty(QSGNode::DirtyMaterial);
0059     }
0060 }
0061 
0062 void SatelliteNode::initPoint()
0063 {
0064     if (m_lines)
0065     {
0066         delete m_lines;
0067         m_lines = 0;
0068     }
0069     if (!m_point)
0070     {
0071         m_point = new PointNode(m_rootNode, 'B', 3.5);
0072         addChildNode(m_point);
0073     }
0074 }
0075 
0076 void SatelliteNode::update()
0077 {
0078     if (m_sat->selected())
0079     {
0080         KStarsData *data        = KStarsData::Instance();
0081         const Projector *m_proj = SkyMapLite::Instance()->projector();
0082         QPointF pos;
0083 
0084         bool visible = false;
0085 
0086         m_sat->HorizontalToEquatorial(data->lst(), data->geo()->lat());
0087 
0088         pos = m_proj->toScreen(m_sat, true, &visible);
0089 
0090         if (!visible || !m_proj->onScreen(pos))
0091         {
0092             hide();
0093             return;
0094         }
0095         show();
0096 
0097         if (Options::drawSatellitesLikeStars())
0098         {
0099             initPoint();
0100         }
0101         else
0102         {
0103             QColor color;
0104             initLines();
0105             if (m_sat->isVisible())
0106                 color = data->colorScheme()->colorNamed("VisibleSatColor");
0107             else
0108                 color = data->colorScheme()->colorNamed("SatColor");
0109 
0110             m_material->setColor(color);
0111         }
0112 
0113         changePos(pos);
0114 
0115         if (Options::showSatellitesLabels())
0116         {
0117             if (!m_label)
0118             {
0119                 m_label = SkyMapLite::rootNode()->labelsItem()->addLabel(m_sat, LabelsItem::label_t::SATELLITE_LABEL);
0120             }
0121             m_label->setLabelPos(pos);
0122         }
0123     }
0124     else
0125     {
0126         hide();
0127     }
0128 }
0129 
0130 void SatelliteNode::hide()
0131 {
0132     SkyNode::hide();
0133     if (m_label)
0134         m_label->hide();
0135 }
0136 
0137 void SatelliteNode::changePos(QPointF pos)
0138 {
0139     //QSizeF size = m_point->size();
0140     QMatrix4x4 m(1, 0, 0, pos.x(), 0, 1, 0, pos.y(), 0, 0, 1, 0, 0, 0, 0, 1);
0141     //m.translate(-0.5*size.width(), -0.5*size.height());
0142 
0143     setMatrix(m);
0144     markDirty(QSGNode::DirtyMatrix);
0145 }