File indexing completed on 2024-12-01 09:40:44

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 "skyitem.h"
0009 #include "skyopacitynode.h"
0010 #include "deepskycomponent.h"
0011 #include "skynodes/trixelnode.h"
0012 
0013 class DeepSkyComponent;
0014 class SkyMesh;
0015 class StarBlockFactory;
0016 class MeshIterator;
0017 
0018 /**
0019  * @short This class represents DSOs from particular catalog. To create a node, first create a DSOTrixelNode,
0020  * (if a node of this trixelID is not a child of m_trixels yet), append it to m_trixels and then append
0021  * DeepSkyNode to DSOTrixelNode
0022  */
0023 class DSOIndexNode : public SkyOpacityNode
0024 {
0025   public:
0026     DSOIndexNode(DeepSkyIndex *index, LabelsItem::label_t labelType, QString colorString);
0027 
0028     /** @short hides the catalog nodes and their labels */
0029     virtual void hide();
0030 
0031     /** @short shows the catalog nodes and their labels */
0032     virtual void show();
0033 
0034     DeepSkyIndex *m_index { nullptr };
0035     QSGNode *m_trixels { nullptr };
0036     /** @short m_labelType holds label type of this catalog */
0037     LabelsItem::label_t m_labelType;
0038     /** @short schemeColor holds the color, with which nodes of this catalog should be drawn */
0039     QString schemeColor;
0040 };
0041 
0042 /**
0043  * @short The DSOTrixelNode class represents trixel. Symbols should be appended to m_symbols, labels to
0044  * m_labels and DeepSkyNodes directly to DSOTrixelNode
0045  */
0046 class DSOTrixelNode : public TrixelNode
0047 {
0048   public:
0049     explicit DSOTrixelNode(Trixel trixelID);
0050 
0051     virtual void deleteAllChildNodes();
0052 
0053     TrixelNode *m_labels { nullptr };
0054     QSGNode *m_symbols { nullptr };
0055 };
0056 
0057 /**
0058  * @class DeepSkyItem
0059  *
0060  * @short Class that handles representation of Deep Sky Objects.
0061  *
0062  * @author Artem Fedoskin
0063  * @version 1.0
0064  */
0065 class DeepSkyItem : public SkyItem
0066 {
0067   public:
0068     /**
0069      * @short Constructor. Instantiates DSOIndexNodes for catalogs
0070      * @param dsoComp pointer to DeepSkyComponent that handles data
0071      * @param rootNode parent RootNode that instantiated this object
0072      */
0073     DeepSkyItem(DeepSkyComponent *dsoComp, RootNode *rootNode);
0074 
0075     /** @short Call update on all DSOIndexNodes (catalogs) */
0076     virtual void update();
0077 
0078     /**
0079      * @short update all nodes needed to represent DSO in the given DSOIndexNode
0080      * In this function we perform some tricks to reduce memory consumption:
0081      * 1. Each TrixelNode has hideCount() function that returns the number of updates, during which this TrixelNode
0082      * was hidden. Whenever TrixelNode becomes visible this counter is set to 0 and is not being incremented.
0083      * 2. Based on the zoom level we calculate the limit for hideCount. If hideCount() of particular TrixelNode is
0084      * larger than the limit, we delete all nodes of this TrixelNode.
0085      * 3. If DSOTrixelNode is visible, we iterate over its DeepSkyObjects and DeepSkyNodes. If hideCount of DeepSkyNode
0086      * is larger than the limit we delete it. If DeepSkyObject is visible but no DeepSkyNode to represent this object
0087      * is created, we instantiate a new one.
0088      * @param node - DSOIndexNode(catalog) that should be updated
0089      * @param drawObject - true if objects from this catalog should be drawn, false otherwise
0090      * @param region - MeshIterator that should be used to iterate over visible trixels
0091      * @param drawImage - true if images for objects should be drawn, false otherwise
0092      */
0093     void updateDeepSkyNode(DSOIndexNode *node, bool drawObject, MeshIterator *region, bool drawImage = false);
0094 
0095   private:
0096     DeepSkyComponent *m_dsoComp { nullptr };
0097     SkyMesh *m_skyMesh { nullptr };
0098 
0099     DSOIndexNode *m_Messier { nullptr };
0100     DSOIndexNode *m_NGC { nullptr };
0101     DSOIndexNode *m_IC { nullptr };
0102     DSOIndexNode *m_other { nullptr };
0103 };