File indexing completed on 2024-04-28 03:44:24
0001 /* 0002 SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com> 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 #include "crosshairnode.h" 0006 #include "Options.h" 0007 #include "ksutils.h" 0008 #include "nodes/ellipsenode.h" 0009 #include "labelnode.h" 0010 #include "../labelsitem.h" 0011 0012 #include <QSGFlatColorMaterial> 0013 0014 CrosshairNode::CrosshairNode(INDI::BaseDevice *baseDevice, RootNode *rootNode) 0015 : el1(new EllipseNode), el2(new EllipseNode), lines(new QSGGeometryNode), bd(baseDevice) 0016 { 0017 addChildNode(el1); 0018 addChildNode(el2); 0019 0020 QSGGeometry *linesGeo = new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0); 0021 0022 lines->setGeometry(linesGeo); 0023 //lines->setFlag(QSGNode::OwnsGeometry); 0024 0025 material = new QSGFlatColorMaterial; 0026 0027 lines->setMaterial(material); 0028 //lines->setFlag(QSGNode::OwnsMaterial); 0029 0030 linesGeo->setDrawingMode(GL_LINES); 0031 linesGeo->allocate(8); 0032 0033 addChildNode(lines); 0034 labelsItem = rootNode->labelsItem(); 0035 label = labelsItem->addLabel(bd->getDeviceName(), LabelsItem::TELESCOPE_SYMBOL); 0036 } 0037 0038 CrosshairNode::~CrosshairNode() 0039 { 0040 labelsItem->deleteLabel(label); 0041 removeChildNode(lines); 0042 removeChildNode(el1); 0043 removeChildNode(el2); 0044 delete lines->geometry(); 0045 delete material; 0046 delete lines; 0047 delete el1; 0048 delete el2; 0049 } 0050 0051 void CrosshairNode::setColor(QColor color) 0052 { 0053 if (material->color() != color) 0054 { 0055 material->setColor(color); 0056 lines->markDirty(QSGNode::DirtyMaterial); 0057 } 0058 el1->setColor(color); 0059 el2->setColor(color); 0060 } 0061 0062 void CrosshairNode::update() 0063 { 0064 SkyPoint indi_sp; 0065 KStarsData *m_KStarsData = KStarsData::Instance(); 0066 0067 //psky.setPen( QPen( QColor( m_KStarsData->colorScheme()->colorNamed("TargetColor" ) ) ) ); 0068 float pxperdegree = Options::zoomFactor() / 57.3; 0069 0070 auto coordNP = bd->getNumber("EQUATORIAL_EOD_COORD"); 0071 0072 if (!coordNP) 0073 { 0074 coordNP = bd->getNumber("HORIZONTAL_COORD"); 0075 if (!coordNP) 0076 { 0077 hide(); 0078 } 0079 else 0080 { 0081 auto np = coordNP->findWidgetByName("AZ"); 0082 0083 if (!np) 0084 hide(); 0085 0086 indi_sp.setAz(np->getValue()); 0087 0088 np = coordNP->findWidgetByName("ALT"); 0089 if (!np) 0090 hide(); 0091 0092 indi_sp.setAlt(np->getValue()); 0093 indi_sp.HorizontalToEquatorial(m_KStarsData->lst(), m_KStarsData->geo()->lat()); 0094 } 0095 } 0096 else 0097 { 0098 autonp = coordNP->findWidgetByName("RA"); 0099 0100 if (!np ) 0101 hide(); 0102 0103 indi_sp.setRA(np->value); 0104 0105 np = coordNP->findWidgetByName("DEC"); 0106 if (!np) 0107 hide(); 0108 0109 indi_sp.setDec(np->getValue()); 0110 } 0111 0112 if (Options::useAltAz()) 0113 indi_sp.EquatorialToHorizontal(m_KStarsData->lst(), m_KStarsData->geo()->lat()); 0114 0115 if (std::isnan(indi_sp.ra().Degrees()) || std::isnan(indi_sp.dec().Degrees())) 0116 hide(); 0117 0118 QPointF P = SkyMapLite::Instance()->projector()->toScreen(&indi_sp); 0119 float s1 = 0.5 * pxperdegree; 0120 float s2 = pxperdegree; 0121 float s3 = 2.0 * pxperdegree; 0122 0123 float x0 = P.x(); 0124 float y0 = P.y(); 0125 float x1 = x0 - 0.5 * s1; 0126 float y1 = y0 - 0.5 * s1; 0127 //float x2 = x0 - 0.5*s2; float y2 = y0 - 0.5*s2; 0128 float x3 = x0 - 0.5 * s3; 0129 float y3 = y0 - 0.5 * s3; 0130 0131 //Draw radial lines 0132 0133 QSGGeometry::Point2D *vertex = lines->geometry()->vertexDataAsPoint2D(); 0134 0135 vertex[0].set(x1, y0); 0136 vertex[1].set(x3, y0); 0137 vertex[2].set(x0 + s2, y0); 0138 vertex[3].set(x0 + 0.5 * s1, y0); 0139 vertex[4].set(x0, y1); 0140 vertex[5].set(x0, y3); 0141 vertex[6].set(x0, y0 + 0.5 * s1); 0142 vertex[7].set(x0, y0 + s2); 0143 0144 lines->markDirty(QSGNode::DirtyGeometry); 0145 0146 //material 0147 //Draw circles at 0.5 & 1 degrees*/ 0148 el1->updateGeometry(x0, y0, s1, s1, false); 0149 el2->updateGeometry(x0, y0, s2, s2, false); 0150 0151 label->setLabelPos(QPointF(x0 + s2 + 2., y0)); 0152 } 0153 0154 void CrosshairNode::hide() 0155 { 0156 SkyNode::hide(); 0157 label->hide(); 0158 }