Kstars

fovsymbolnode.cpp
1/*
2 SPDX-FileCopyrightText: 2016 Artem Fedoskin <afedoskin3@gmail.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "fovsymbolnode.h"
8
9#include "nodes/rectnode.h"
10#include "nodes/ellipsenode.h"
11
12#include <QSGFlatColorMaterial>
13
14FOVSymbolNode::FOVSymbolNode(const QString &name, float a, float b, float xoffset, float yoffset, float rot,
15 FOVItem::Shape shape, const QString &color)
16 : m_symbol(nullptr)
17{
18 m_name = name;
19 m_sizeX = a;
20 m_sizeY = (b < 0.0) ? a : b;
21
22 m_offsetX = xoffset;
23 m_offsetY = yoffset;
24 m_rotation = rot;
25 m_color = color;
26 m_northPA = 0;
27 m_center.setRA(0);
28 m_center.setDec(0);
29
30 switch (shape)
31 {
32 case FOVItem::SQUARE:
33 m_symbol = new SquareFOV();
34 break;
35 case FOVItem::CIRCLE:
36 m_symbol = new CircleFOV();
37 break;
38 case FOVItem::CROSSHAIRS:
39 m_symbol = new CrosshairFOV();
40 break;
41 case FOVItem::BULLSEYE:
42 m_symbol = new BullsEyeFOV();
43 break;
44 case FOVItem::SOLIDCIRCLE:
45 m_symbol = new SolidCircleFOV();
46 break;
47 default:
48 break;
49 }
50
51 if (m_symbol)
52 addChildNode(m_symbol);
53}
54
55void FOVSymbolNode::update(float zoomFactor)
56{
57 show();
58 float pixelSizeX = m_sizeX * zoomFactor / 57.3 / 60.0;
59 float pixelSizeY = m_sizeY * zoomFactor / 57.3 / 60.0;
60
61 float offsetXPixelSize = m_offsetX * zoomFactor / 57.3 / 60.0;
62 float offsetYPixelSize = m_offsetY * zoomFactor / 57.3 / 60.0;
63 SkyMapLite *map = SkyMapLite::Instance();
64
65 QMatrix4x4 newMatrix;
66
67 if (m_center.ra().Degrees() > 0)
68 {
69 m_center.EquatorialToHorizontal(KStarsData::Instance()->lst(), KStarsData::Instance()->geo()->lat());
70 QPointF skypoint_center = map->projector()->toScreen(&m_center);
71 newMatrix.translate(skypoint_center.toPoint().x(), skypoint_center.toPoint().y());
72 }
73 else
74 {
75 QPoint center(map->width() / 2, map->height() / 2);
76 newMatrix.translate(center.x(), center.y());
77 }
78
79 newMatrix.translate(offsetXPixelSize, offsetYPixelSize);
80 newMatrix.rotate(m_rotation + m_northPA, 0, 0, 1);
81
82 m_symbol->setMatrix(newMatrix);
83
84 m_symbol->updateSymbol(m_color, pixelSizeX, pixelSizeY);
85}
86
87FOVSymbolBase::FOVSymbolBase(FOVItem::Shape shape) : m_shape(shape) //Will be changed by the subclass
88{
89}
90
91SquareFOV::SquareFOV() : FOVSymbolBase(FOVItem::SQUARE)
92{
93 rect1 = new RectNode();
94 appendChildNode(rect1);
95
96 rect2 = new RectNode();
97 appendChildNode(rect2);
98
99 lines = new QSGGeometryNode;
100 appendChildNode(lines);
101
102 lines->setGeometry(new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0));
103 lines->setOpaqueMaterial(new QSGFlatColorMaterial);
104 lines->setFlag(QSGNode::OwnsGeometry);
105 lines->setFlag(QSGNode::OwnsMaterial);
106 lines->geometry()->allocate(6);
107 lines->geometry()->setDrawingMode(GL_LINES);
108}
109
110void SquareFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
111{
112 QPoint center(0, 0);
113
114 /*if (m_imageDisplay)
115 {
116 //QTransform imageT;
117 //imageT.rotate(m_rotation+m_northPA);
118 //p.drawImage(targetRect, m_image.transformed(imageT));
119 p.drawImage(targetRect, m_image);
120 }*/
121
122 rect1->setRect(center.x() - pixelSizeX / 2, center.y() - pixelSizeY / 2, pixelSizeX, pixelSizeY);
123 rect1->setColor(color);
124
125 rect2->setRect(center.x(), center.y() - (3 * pixelSizeY / 5), pixelSizeX / 40, pixelSizeX / 10);
126 rect2->setColor(color);
127
128 QSGFlatColorMaterial *material = static_cast<QSGFlatColorMaterial *>(lines->opaqueMaterial());
129 if (material->color() != color)
130 {
131 material->setColor(color);
132 lines->markDirty(QSGNode::DirtyMaterial);
133 }
134
135 QSGGeometry::Point2D *vertex = lines->geometry()->vertexDataAsPoint2D();
136 vertex[0].set(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5));
137 vertex[1].set(center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5));
138
139 vertex[2].set(center.x() - pixelSizeX / 30, center.y() - (3 * pixelSizeY / 5));
140 vertex[3].set(center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY));
141
142 vertex[4].set(center.x() + pixelSizeX / 20, center.y() - (3 * pixelSizeY / 5));
143 vertex[5].set(center.x() + pixelSizeX / 70, center.y() - (0.7 * pixelSizeY));
144
145 lines->markDirty(QSGNode::DirtyGeometry);
146}
147
148CircleFOV::CircleFOV() : FOVSymbolBase(FOVItem::CIRCLE)
149{
150 el = new EllipseNode();
151 appendChildNode(el);
152}
153
154void CircleFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
155{
156 el->setColor(color);
157 el->updateGeometry(0, 0, pixelSizeX / 2, pixelSizeY / 2, false);
158}
159
160CrosshairFOV::CrosshairFOV() : FOVSymbolBase(FOVItem::CROSSHAIRS)
161{
162 lines = new QSGGeometryNode;
163 appendChildNode(lines);
164
165 lines->setGeometry(new QSGGeometry(QSGGeometry::defaultAttributes_Point2D(), 0));
166 lines->setOpaqueMaterial(new QSGFlatColorMaterial);
167 lines->setFlag(QSGNode::OwnsGeometry);
168 lines->setFlag(QSGNode::OwnsMaterial);
169 lines->geometry()->allocate(8);
170 lines->geometry()->setDrawingMode(GL_LINES);
171
172 el1 = new EllipseNode;
173 appendChildNode(el1);
174
175 el2 = new EllipseNode;
176 appendChildNode(el2);
177}
178
179void CrosshairFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
180{
181 QPoint center(0, 0);
182
183 QSGGeometry::Point2D *vertex = lines->geometry()->vertexDataAsPoint2D();
184 vertex[0].set(center.x() + 0.5 * pixelSizeX, center.y());
185 vertex[1].set(center.x() + 1.5 * pixelSizeX, center.y());
186
187 vertex[2].set(center.x() - 0.5 * pixelSizeX, center.y());
188 vertex[3].set(center.x() - 1.5 * pixelSizeX, center.y());
189
190 vertex[4].set(center.x(), center.y() + 0.5 * pixelSizeY);
191 vertex[5].set(center.x(), center.y() + 1.5 * pixelSizeY);
192
193 vertex[6].set(center.x(), center.y() - 0.5 * pixelSizeY);
194 vertex[7].set(center.x(), center.y() - 1.5 * pixelSizeY);
195
196 lines->markDirty(QSGNode::DirtyGeometry);
197
198 //Draw circles at 0.5 & 1 degrees
199 el1->setColor(color);
200 el1->updateGeometry(center.x(), center.y(), 0.5 * pixelSizeX, 0.5 * pixelSizeY, false);
201
202 el2->setColor(color);
203 el1->updateGeometry(center.x(), center.y(), pixelSizeX, pixelSizeY, false);
204}
205
206BullsEyeFOV::BullsEyeFOV() : FOVSymbolBase(FOVItem::BULLSEYE)
207{
208 el1 = new EllipseNode;
209 appendChildNode(el1);
210
211 el2 = new EllipseNode;
212 appendChildNode(el2);
213
214 el3 = new EllipseNode;
215 appendChildNode(el3);
216}
217
218void BullsEyeFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
219{
220 el1->setColor(color);
221 el1->updateGeometry(0, 0, 0.5 * pixelSizeX, 0.5 * pixelSizeY, false);
222
223 el2->setColor(color);
224 el2->updateGeometry(0, 0, 2.0 * pixelSizeX, 2.0 * pixelSizeY, false);
225
226 el3->setColor(color);
227 el3->updateGeometry(0, 0, 4.0 * pixelSizeX, 4.0 * pixelSizeY, false);
228}
229
230SolidCircleFOV::SolidCircleFOV() : FOVSymbolBase(FOVItem::SOLIDCIRCLE)
231{
232 el = new EllipseNode;
233 appendChildNode(el);
234}
235
236void SolidCircleFOV::updateSymbol(QColor color, float pixelSizeX, float pixelSizeY)
237{
238 QColor colorAlpha = color;
239 colorAlpha.setAlpha(127);
240 el->setColor(colorAlpha);
241 el->updateGeometry(0, 0, pixelSizeX / 2, pixelSizeY / 2, false);
242}
This class handles representation of FOV symbols in SkyMapLite.
Definition fovitem.h:18
Shape
FOV symbol types.
Definition fovitem.h:22
FOVSymbolBase is a virtual class that should be subclassed by every type of FOV symbol.
FOVSymbolBase(FOVItem::Shape shape)
FOVSymbolNode(const QString &name, float a, float b, float xoffset, float yoffset, float rot, FOVItem::Shape shape=FOVItem::SQUARE, const QString &color="#FFFFFF")
Constructor.
QSGGeometryNode derived class that draws filled and non-filled rectangles.
Definition rectnode.h:22
This is the main item that displays all SkyItems.
Definition skymaplite.h:59
virtual void show()
shows all child nodes (sets opacity of m_opacity to 1)
Definition skynode.cpp:27
virtual void update()
Updates coordinate of the object on SkyMapLite.
Definition skynode.h:48
SkyMapLite * map() const
short function to access SkyMapLite
Definition skynode.h:45
void setAlpha(int alpha)
void rotate(const QQuaternion &quaternion)
void translate(const QVector3D &vector)
int x() const const
int y() const const
QPoint toPoint() const const
const QColor & color() const const
void setColor(const QColor &color)
void set(float x, float y)
const AttributeSet & defaultAttributes_Point2D()
void appendChildNode(QSGNode *node)
QTextStream & center(QTextStream &stream)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:53:02 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.