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

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "fovsymbolnode.h"
0008 
0009 #include "nodes/rectnode.h"
0010 #include "nodes/ellipsenode.h"
0011 
0012 #include <QSGFlatColorMaterial>
0013 
0014 FOVSymbolNode::FOVSymbolNode(const QString &name, float a, float b, float xoffset, float yoffset, float rot,
0015                              FOVItem::Shape shape, const QString &color)
0016     : m_symbol(nullptr)
0017 {
0018     m_name  = name;
0019     m_sizeX = a;
0020     m_sizeY = (b < 0.0) ? a : b;
0021 
0022     m_offsetX  = xoffset;
0023     m_offsetY  = yoffset;
0024     m_rotation = rot;
0025     m_color    = color;
0026     m_northPA  = 0;
0027     m_center.setRA(0);
0028     m_center.setDec(0);
0029 
0030     switch (shape)
0031     {
0032         case FOVItem::SQUARE:
0033             m_symbol = new SquareFOV();
0034             break;
0035         case FOVItem::CIRCLE:
0036             m_symbol = new CircleFOV();
0037             break;
0038         case FOVItem::CROSSHAIRS:
0039             m_symbol = new CrosshairFOV();
0040             break;
0041         case FOVItem::BULLSEYE:
0042             m_symbol = new BullsEyeFOV();
0043             break;
0044         case FOVItem::SOLIDCIRCLE:
0045             m_symbol = new SolidCircleFOV();
0046             break;
0047         default:
0048             break;
0049     }
0050 
0051     if (m_symbol)
0052         addChildNode(m_symbol);
0053 }
0054 
0055 void FOVSymbolNode::update(float zoomFactor)
0056 {
0057     show();
0058     float pixelSizeX = m_sizeX * zoomFactor / 57.3 / 60.0;
0059     float pixelSizeY = m_sizeY * zoomFactor / 57.3 / 60.0;
0060 
0061     float offsetXPixelSize = m_offsetX * zoomFactor / 57.3 / 60.0;
0062     float offsetYPixelSize = m_offsetY * zoomFactor / 57.3 / 60.0;
0063     SkyMapLite *map        = SkyMapLite::Instance();
0064 
0065     QMatrix4x4 newMatrix;
0066 
0067     if (m_center.ra().Degrees() > 0)
0068     {
0069         m_center.EquatorialToHorizontal(KStarsData::Instance()->lst(), KStarsData::Instance()->geo()->lat());
0070         QPointF skypoint_center = map->projector()->toScreen(&m_center);
0071         newMatrix.translate(skypoint_center.toPoint().x(), skypoint_center.toPoint().y());
0072     }
0073     else
0074     {
0075         QPoint center(map->width() / 2, map->height() / 2);
0076         newMatrix.translate(center.x(), center.y());
0077     }
0078 
0079     newMatrix.translate(offsetXPixelSize, offsetYPixelSize);
0080     newMatrix.rotate(m_rotation + m_northPA, 0, 0, 1);
0081 
0082     m_symbol->setMatrix(newMatrix);
0083 
0084     m_symbol->updateSymbol(m_color, pixelSizeX, pixelSizeY);
0085 }
0086 
0087 FOVSymbolBase::FOVSymbolBase(FOVItem::Shape shape) : m_shape(shape) //Will be changed by the subclass
0088 {
0089 }
0090 
0091 SquareFOV::SquareFOV() : FOVSymbolBase(FOVItem::SQUARE)
0092 {
0093     rect1 = new RectNode();
0094     appendChildNode(rect1);
0095 
0096     rect2 = new RectNode();
0097     appendChildNode(rect2);
0098 
0099     lines = new QSGGeometryNode;
0100     appendChildNode(lines);
0101 
0102     lines->setGeometry(new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0));
0103     lines->setOpaqueMaterial(new QSGFlatColorMaterial);
0104     lines->setFlag(QSGNode::OwnsGeometry);
0105     lines->setFlag(QSGNode::OwnsMaterial);
0106     lines->geometry()->allocate(6);
0107     lines->geometry()->setDrawingMode(GL_LINES);
0108 }
0109 
0110 void SquareFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
0111 {
0112     QPoint center(0, 0);
0113 
0114     /*if (m_imageDisplay)
0115     {
0116         //QTransform imageT;
0117         //imageT.rotate(m_rotation+m_northPA);
0118         //p.drawImage(targetRect, m_image.transformed(imageT));
0119         p.drawImage(targetRect, m_image);
0120     }*/
0121 
0122     rect1->setRect(center.x() - pixelSizeX / 2, center.y() - pixelSizeY / 2, pixelSizeX, pixelSizeY);
0123     rect1->setColor(color);
0124 
0125     rect2->setRect(center.x(), center.y() - (3 * pixelSizeY / 5), pixelSizeX / 40, pixelSizeX / 10);
0126     rect2->setColor(color);
0127 
0128     QSGFlatColorMaterial *material = static_cast<QSGFlatColorMaterial *>(lines->opaqueMaterial());
0129     if (material->color() != color)
0130     {
0131         material->setColor(color);
0132         lines->markDirty(QSGNode::DirtyMaterial);
0133     }
0134 
0135     QSGGeometry::Point2D *vertex = lines->geometry()->vertexDataAsPoint2D();
0136     vertex[0].set(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5));
0137     vertex[1].set(center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5));
0138 
0139     vertex[2].set(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5));
0140     vertex[3].set(center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY));
0141 
0142     vertex[4].set(center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5));
0143     vertex[5].set(center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY));
0144 
0145     lines->markDirty(QSGNode::DirtyGeometry);
0146 }
0147 
0148 CircleFOV::CircleFOV() : FOVSymbolBase(FOVItem::CIRCLE)
0149 {
0150     el = new EllipseNode();
0151     appendChildNode(el);
0152 }
0153 
0154 void CircleFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
0155 {
0156     el->setColor(color);
0157     el->updateGeometry(0, 0, pixelSizeX / 2, pixelSizeY / 2, false);
0158 }
0159 
0160 CrosshairFOV::CrosshairFOV() : FOVSymbolBase(FOVItem::CROSSHAIRS)
0161 {
0162     lines = new QSGGeometryNode;
0163     appendChildNode(lines);
0164 
0165     lines->setGeometry(new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0));
0166     lines->setOpaqueMaterial(new QSGFlatColorMaterial);
0167     lines->setFlag(QSGNode::OwnsGeometry);
0168     lines->setFlag(QSGNode::OwnsMaterial);
0169     lines->geometry()->allocate(8);
0170     lines->geometry()->setDrawingMode(GL_LINES);
0171 
0172     el1 = new EllipseNode;
0173     appendChildNode(el1);
0174 
0175     el2 = new EllipseNode;
0176     appendChildNode(el2);
0177 }
0178 
0179 void CrosshairFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
0180 {
0181     QPoint center(0, 0);
0182 
0183     QSGGeometry::Point2D *vertex = lines->geometry()->vertexDataAsPoint2D();
0184     vertex[0].set(center.x() + 0.5 * pixelSizeX, center.y());
0185     vertex[1].set(center.x() + 1.5 * pixelSizeX, center.y());
0186 
0187     vertex[2].set(center.x() - 0.5 * pixelSizeX, center.y());
0188     vertex[3].set(center.x() - 1.5 * pixelSizeX, center.y());
0189 
0190     vertex[4].set(center.x(), center.y() + 0.5 * pixelSizeY);
0191     vertex[5].set(center.x(), center.y() + 1.5 * pixelSizeY);
0192 
0193     vertex[6].set(center.x(), center.y() - 0.5 * pixelSizeY);
0194     vertex[7].set(center.x(), center.y() - 1.5 * pixelSizeY);
0195 
0196     lines->markDirty(QSGNode::DirtyGeometry);
0197 
0198     //Draw circles at 0.5 & 1 degrees
0199     el1->setColor(color);
0200     el1->updateGeometry(center.x(), center.y(), 0.5 * pixelSizeX, 0.5 * pixelSizeY, false);
0201 
0202     el2->setColor(color);
0203     el1->updateGeometry(center.x(), center.y(), pixelSizeX, pixelSizeY, false);
0204 }
0205 
0206 BullsEyeFOV::BullsEyeFOV() : FOVSymbolBase(FOVItem::BULLSEYE)
0207 {
0208     el1 = new EllipseNode;
0209     appendChildNode(el1);
0210 
0211     el2 = new EllipseNode;
0212     appendChildNode(el2);
0213 
0214     el3 = new EllipseNode;
0215     appendChildNode(el3);
0216 }
0217 
0218 void BullsEyeFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
0219 {
0220     el1->setColor(color);
0221     el1->updateGeometry(0, 0, 0.5 * pixelSizeX, 0.5 * pixelSizeY, false);
0222 
0223     el2->setColor(color);
0224     el2->updateGeometry(0, 0, 2.0 * pixelSizeX, 2.0 * pixelSizeY, false);
0225 
0226     el3->setColor(color);
0227     el3->updateGeometry(0, 0, 4.0 * pixelSizeX, 4.0 * pixelSizeY, false);
0228 }
0229 
0230 SolidCircleFOV::SolidCircleFOV() : FOVSymbolBase(FOVItem::SOLIDCIRCLE)
0231 {
0232     el = new EllipseNode;
0233     appendChildNode(el);
0234 }
0235 
0236 void SolidCircleFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
0237 {
0238     QColor colorAlpha = color;
0239     colorAlpha.setAlpha(127);
0240     el->setColor(colorAlpha);
0241     el->updateGeometry(0, 0, pixelSizeX / 2, pixelSizeY / 2, false);
0242 }