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 #pragma once
0008 
0009 #include "../fovitem.h"
0010 
0011 #include <QSGSimpleRectNode>
0012 #include <QSGTransformNode>
0013 
0014 class EllipseNode;
0015 class RectNode;
0016 
0017 /**
0018  * @class FOVSymbolBase
0019  *
0020  * FOVSymbolBase is a virtual class that should be subclassed by every type of FOV symbol. It is derived
0021  * from QSGTransformNode to provide transform matrix for updating coordinates of FOV symbol.
0022  *
0023  * @short A QSGTransformNode derived base class of every type of FOV symbol
0024  * @author Artem Fedoskin
0025  * @version 1.0
0026  */
0027 class FOVSymbolBase : public QSGTransformNode
0028 {
0029   public:
0030     /** @short updates geometry (position, size) of elements of this FOV symbol */
0031     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY) = 0;
0032 
0033     /** @short return type of this FOV symbol **/
0034     FOVItem::Shape type() { return m_shape; }
0035 
0036   protected:
0037     /** @param shape of the symbol. Each subclass sets its own type. Returned in type() */
0038     FOVSymbolBase(FOVItem::Shape shape);
0039     /*    QImage m_image; //Not supported yet
0040             bool m_imageDisplay;*/
0041     FOVItem::Shape m_shape;
0042 };
0043 
0044 class SquareFOV : public FOVSymbolBase
0045 {
0046   public:
0047     SquareFOV();
0048     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY);
0049 
0050   private:
0051     RectNode *rect1 { nullptr };
0052     RectNode *rect2 { nullptr };
0053     QSGGeometryNode *lines { nullptr };
0054 };
0055 class CircleFOV : public FOVSymbolBase
0056 {
0057   public:
0058     CircleFOV();
0059     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY);
0060 
0061   private:
0062     EllipseNode *el { nullptr };
0063 };
0064 
0065 class CrosshairFOV : public FOVSymbolBase
0066 {
0067   public:
0068     CrosshairFOV();
0069     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY);
0070 
0071   private:
0072     QSGGeometryNode *lines { nullptr };
0073     EllipseNode *el1 { nullptr };
0074     EllipseNode *el2 { nullptr };
0075 };
0076 
0077 class BullsEyeFOV : public FOVSymbolBase
0078 {
0079   public:
0080     BullsEyeFOV();
0081     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY);
0082 
0083   private:
0084     EllipseNode *el1 { nullptr };
0085     EllipseNode *el2 { nullptr };
0086     EllipseNode *el3 { nullptr };
0087 };
0088 
0089 class SolidCircleFOV : public FOVSymbolBase
0090 {
0091   public:
0092     SolidCircleFOV();
0093     virtual void updateSymbol(QColor color, float pixelSizeX, float pixelSizeY);
0094 
0095   private:
0096     EllipseNode *el { nullptr };
0097 };
0098 
0099 /**
0100  * @class FOVSymbolNode
0101  *
0102  * A SkyNode derived class used for displaying FOV symbol. FOVSymbolNade handles creation of FOVSymbolBase
0103  * and its update.
0104  *
0105  * @short A SkyNode derived class that is used for displaying FOV symbol
0106  * @author Artem Fedoskin
0107  * @version 1.0
0108  */
0109 class FOVSymbolNode : public SkyNode
0110 {
0111   public:
0112     /**
0113      * @short Constructor. Initialize m_symbol according to shape
0114      * @param name - name of the FOV symbol (used to switch it on/off through SkyMapLite from QML)
0115      * @param a - width
0116      * @param b - height
0117      * @param xoffset - x offset
0118      * @param yoffset - y offset
0119      * @param rot - rotation
0120      * @param shape - shape
0121      * @param color - RGB color
0122      */
0123     FOVSymbolNode(const QString &name, float a, float b, float xoffset, float yoffset, float rot,
0124                   FOVItem::Shape shape = FOVItem::SQUARE, const QString &color = "#FFFFFF");
0125     /** @short Update this FOV symbol according to the zoomFactor */
0126     void update(float zoomFactor);
0127 
0128     QString getName() { return m_name; }
0129 
0130   private:
0131     QString m_name;
0132     QString m_color;
0133     float m_sizeX { 0 };
0134     float m_sizeY { 0 };
0135     float m_offsetX { 0 };
0136     float m_offsetY { 0 };
0137     float m_rotation { 0 };
0138     float m_northPA { 0 };
0139     SkyPoint m_center;
0140     FOVSymbolBase *m_symbol { nullptr };
0141 };