File indexing completed on 2024-04-28 15:10:49
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 }