File indexing completed on 2024-04-28 15:10:48
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 }