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

0001 /*
0002     SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #pragma once
0007 
0008 #include "skynode.h"
0009 
0010 #include <QSGNode>
0011 
0012 class DeepSkyObject;
0013 class EllipseNode;
0014 
0015 /**
0016  * @short A base class for all symbol nodes.
0017  */
0018 class SymbolNode : public QSGNode
0019 {
0020   public:
0021     /**
0022      * @short Update size and the symbol itself. Each SymbolNode should override this function,
0023      * and call SymbolNode::updateSymbol() in the beginning of overridden updateSymbol to
0024      * initialize values that are used across all symbols.
0025      */
0026     virtual void updateSymbol(float x, float y, float e, float size);
0027 
0028   protected:
0029     SymbolNode() {}
0030     float zoom { 0 };
0031     int isize { 0 };
0032 
0033     float dx1 { 0 };
0034     float dx2 { 0 };
0035     float dy1 { 0 };
0036     float dy2 { 0 };
0037     float x1 { 0 };
0038     float x2 { 0 };
0039     float y1 { 0 };
0040     float y2 { 0 };
0041 
0042     float dxa { 0 };
0043     float dxb { 0 };
0044     float dya { 0 };
0045     float dyb { 0 };
0046     float xa { 0 };
0047     float xb { 0 };
0048     float ya { 0 };
0049     float yb { 0 };
0050     float psize { 0 };
0051 };
0052 
0053 class StarSymbol : public SymbolNode
0054 {
0055   public:
0056     explicit StarSymbol(const QColor &color = QColor());
0057 
0058     virtual void updateSymbol(float x, float y, float e, float size) override;
0059 
0060     EllipseNode *m_ellipse { nullptr };
0061 };
0062 
0063 class AsterismSymbol : public SymbolNode
0064 {
0065   public:
0066     explicit AsterismSymbol(const QColor &color);
0067 
0068     virtual void updateSymbol(float x, float y, float e, float size) override;
0069 
0070     EllipseNode *e1 { nullptr };
0071     EllipseNode *e2 { nullptr };
0072     EllipseNode *e3 { nullptr };
0073     EllipseNode *e4 { nullptr };
0074     EllipseNode *e5 { nullptr };
0075     EllipseNode *e6 { nullptr };
0076     EllipseNode *e7 { nullptr };
0077     EllipseNode *e8 { nullptr };
0078 };
0079 
0080 class GlobularClusterSymbol : public SymbolNode
0081 {
0082   public:
0083     explicit GlobularClusterSymbol(const QColor &color);
0084 
0085     virtual void updateSymbol(float x, float y, float e, float size) override;
0086 
0087     EllipseNode *e1 { nullptr };
0088     QSGGeometryNode *lines { nullptr };
0089 };
0090 
0091 class DarkNebulaSymbol : public SymbolNode
0092 {
0093   public:
0094     explicit DarkNebulaSymbol(const QColor &color);
0095 
0096     virtual void updateSymbol(float x, float y, float e, float size) override;
0097 
0098     QSGGeometryNode *lines { nullptr };
0099 };
0100 
0101 class PlanetaryNebulaSymbol : public SymbolNode
0102 {
0103   public:
0104     explicit PlanetaryNebulaSymbol(const QColor &color);
0105 
0106     virtual void updateSymbol(float x, float y, float e, float size) override;
0107 
0108     EllipseNode *e1 { nullptr };
0109     QSGGeometryNode *lines { nullptr };
0110 };
0111 
0112 class SupernovaRemnantSymbol : public SymbolNode
0113 {
0114   public:
0115     explicit SupernovaRemnantSymbol(const QColor &color);
0116 
0117     virtual void updateSymbol(float x, float y, float e, float size) override;
0118 
0119     QSGGeometryNode *lines { nullptr };
0120 };
0121 
0122 class GalaxySymbol : public SymbolNode
0123 {
0124   public:
0125     explicit GalaxySymbol(const QColor &color);
0126 
0127     virtual void updateSymbol(float x, float y, float e, float size) override;
0128 
0129     EllipseNode *e1 { nullptr };
0130 };
0131 
0132 class GalaxyClusterSymbol : public SymbolNode
0133 {
0134   public:
0135     explicit GalaxyClusterSymbol(const QColor &color);
0136 
0137     virtual void updateSymbol(float x, float y, float e, float size) override;
0138 
0139     QSGGeometryNode *lines { nullptr };
0140 };
0141 
0142 /**
0143  * @class DSOSymbolNode
0144  * @short A SkyNode derived class used for Deep Sky symbols in SkyMapLite
0145  *
0146  * @author Artem Fedoskin
0147  * @version 1.0
0148  */
0149 class DSOSymbolNode : public SkyNode
0150 {
0151   public:
0152     /**
0153      * @short Constructor.
0154      * @param skyObject - DeepSkyObject, for which this symbol should be created
0155      * @param color of the symbol
0156      */
0157     explicit DSOSymbolNode(DeepSkyObject *skyObject, const QColor &color = QColor());
0158 
0159     /**
0160      * @short Changes position and rotation angle of the symbol
0161      * @param pos - new position
0162      * @param positionangle - rotation angle
0163      */
0164     void changePos(const QPointF &pos, float positionangle);
0165 
0166     /**
0167      * @short Update size and position of the symbol
0168      * @param size - new size of symbol
0169      * @param pos - new position
0170      * @param positionangle - new rotation angle
0171      */
0172     void update(float size, const QPointF &pos, float positionangle);
0173 
0174     /** Create SymbolNode based on the type of m_dso */
0175     void initSymbol();
0176     QColor getColor() { return m_color; }
0177 
0178   private:
0179     QColor m_color;
0180     //TODO deal setter for this when stars will be introduced
0181     DeepSkyObject *m_dso { nullptr };
0182     SymbolNode *m_symbol { nullptr };
0183     /// If the symbol needs rotation this should be set to true
0184     bool m_rotate { false };
0185 };