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 }