Kstars

deepstaritem.cpp
1 /*
2  SPDX-FileCopyrightText: 2016 Artem Fedoskin <[email protected]>
3  SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #include "deepstaritem.h"
7 
8 #include "deepstarcomponent.h"
9 #include "labelsitem.h"
10 #include "Options.h"
11 #include "rootnode.h"
12 #include "skymesh.h"
13 #include "starblock.h"
14 #include "starblockfactory.h"
15 #include "starblocklist.h"
16 #include "starcomponent.h"
17 #include "htmesh/MeshIterator.h"
18 #include "projections/projector.h"
19 #include "skynodes/pointsourcenode.h"
20 #include "skynodes/trixelnode.h"
21 
23  : SkyItem(LabelsItem::label_t::NO_LABEL, rootNode), m_deepStarComp(deepStarComp),
24  m_staticStars(deepStarComp->staticStars)
25 {
26  m_starBlockList = &m_deepStarComp->m_starBlockList;
27 
28  if (m_staticStars)
29  {
30  for (int c = 0; c < m_starBlockList->size(); ++c)
31  {
32  TrixelNode *trixel = new TrixelNode(m_starBlockList->at(c)->getTrixel());
33  appendChildNode(trixel);
34  int blockCount = m_starBlockList->at(c)->getBlockCount();
35 
36  for (int i = 0; i < blockCount; ++i)
37  {
38  std::shared_ptr<StarBlock> block = m_starBlockList->at(c)->block(i);
39  // qDebug() << "---> Drawing stars from block " << i << " of trixel " <<
40  // currentRegion << ". SB has " << block->getStarCount() << " stars" << endl;
41  int starCount = block->getStarCount();
42  for (int j = 0; j < starCount; j++)
43  {
44  StarObject *star = &(block->star(j)->star);
45 
46  if (star)
47  {
49  }
50  }
51  }
52  }
53  }
54 
55  m_skyMesh = SkyMesh::Instance();
56  m_StarBlockFactory = StarBlockFactory::Instance();
57 }
58 
60 {
61  if (m_staticStars) // dynamic stars under construction
62  {
63  SkyMapLite *map = SkyMapLite::Instance();
64  KStarsData *data = KStarsData::Instance();
65  UpdateID updateID = data->updateID();
66 
67  //FIXME_FOV -- maybe not clamp like that...
68  float radius = map->projector()->fov();
69  if (radius > 90.0)
70  radius = 90.0;
71 
72  if (m_skyMesh != SkyMesh::Instance() && m_skyMesh->inDraw())
73  {
74  printf("Warning: aborting concurrent DeepStarComponent::draw()");
75  }
76  bool checkSlewing = (map->isSlewing() && Options::hideOnSlew());
77 
78  //shortcuts to inform whether to draw different objects
79  bool hideFaintStars(checkSlewing && Options::hideStars());
80  double hideStarsMag = Options::magLimitHideStar();
81 
82  //adjust maglimit for ZoomLevel
83  // double lgmin = log10(MINZOOM);
84  // double lgmax = log10(MAXZOOM);
85  // double lgz = log10(Options::zoomFactor());
86  // TODO: Enable hiding of faint stars
87 
88  float maglim = StarComponent::zoomMagnitudeLimit();
89 
90  if (maglim < m_deepStarComp->triggerMag || !m_staticStars)
91  {
92  hide();
93  return;
94  }
95  else
96  {
97  show();
98  }
99 
100  //float m_zoomMagLimit = maglim;
101 
102  m_skyMesh->inDraw(true);
103 
104  SkyPoint *focus = map->focus();
105  m_skyMesh->aperture(focus, radius + 1.0, DRAW_BUF); // divide by 2 for testing
106 
107  MeshIterator region(m_skyMesh, DRAW_BUF);
108 
109  // If we are to hide the fainter stars (eg: while slewing), we set the magnitude limit to hideStarsMag.
110  if (hideFaintStars && maglim > hideStarsMag)
111  maglim = hideStarsMag;
112 
113  StarBlockFactory *m_StarBlockFactory = StarBlockFactory::Instance();
114  // m_StarBlockFactory->drawID = m_skyMesh->drawID();
115  // qDebug() << "Mesh size = " << m_skyMesh->size() << "; drawID = " << m_skyMesh->drawID();
116 
117  /*t_dynamicLoad = 0;
118  t_updateCache = 0;
119  t_drawUnnamed = 0;*/
120 
121  //visibleStarCount = 0;
122 
123  // Mark used blocks in the LRU Cache. Not required for static stars
124  if (!m_staticStars)
125  {
126  //Under construction
127  // while( region.hasNext() ) {
128  // Trixel currentRegion = region.next();
129  // for( int i = 0; i < m_starBlockList->at( currentRegion )->getBlockCount(); ++i ) {
130  // StarBlock *prevBlock = ( ( i >= 1 ) ? m_starBlockList->at( currentRegion )->block( i - 1 ) : nullptr );
131  // StarBlock *block = m_starBlockList->at( currentRegion )->block( i );
132 
133  // if( i == 0 && !m_StarBlockFactory->markFirst( block ) )
134  // qDebug() << "markFirst failed in trixel" << currentRegion;
135  // if( i > 0 && !m_StarBlockFactory->markNext( prevBlock, block ) )
136  // qDebug() << "markNext failed in trixel" << currentRegion << "while marking block" << i;
137  // if( i < m_starBlockList->at( currentRegion )->getBlockCount()
138  // && m_starBlockList->at( currentRegion )->block( i )->getFaintMag() < maglim )
139  // break;
140  // }
141  // }
142  // //t_updateCache = t.restart();
143  // region.reset();
144  }
145 
146  m_StarBlockFactory->drawID = m_skyMesh->drawID();
147 
148  int regionID = -1;
149  if (region.hasNext())
150  {
151  regionID = region.next();
152  }
153 
154  int trixelID = 0;
155 
156  QSGNode *firstTrixel = firstChild();
157  TrixelNode *trixel = static_cast<TrixelNode *>(firstTrixel);
158 
159  while (trixel != 0)
160  {
161  if (m_staticStars)
162  {
163  const Projector *projector = SkyMapLite::Instance()->projector();
164  double delLim = SkyMapLite::deleteLimit();
165 
166  if (trixelID != regionID)
167  {
168  trixel->hide();
169 
170  if (trixel->hideCount() > delLim)
171  {
173 
174  while (i != trixel->m_nodes.end())
175  {
176  SkyNode *node = (*i).second;
177  if (node)
178  {
179  trixel->removeChildNode(node);
180  delete node;
181 
182  *i = QPair<SkyObject *, SkyNode *>((*i).first, 0);
183  }
184  ++i;
185  }
186  }
187 
188  trixel = static_cast<TrixelNode *>(trixel->nextSibling());
189  ++trixelID;
190  continue;
191  }
192  else
193  {
194  trixel->show();
195 
196  if (region.hasNext())
197  {
198  regionID = region.next();
199  }
200 
201  QLinkedList<QPair<SkyObject *, SkyNode *>>::iterator i = (&trixel->m_nodes)->begin();
202 
203  while (i != (&trixel->m_nodes)->end())
204  {
205  bool hide = false;
206  bool hideSlew = false;
207 
208  bool drawLabel = false;
209 
210  StarObject *starObj = static_cast<StarObject *>((*i).first);
211  SkyNode *node = (*i).second;
212 
213  int mag = starObj->mag();
214 
215  // break loop if maglim is reached
216  if (mag > maglim)
217  hide = true;
218  if (hideFaintStars && hideStarsMag)
219  hideSlew = true;
220  if (starObj->updateID != KStarsData::Instance()->updateID())
221  starObj->JITupdate();
222 
223  if (node)
224  {
225  if (node->hideCount() > delLim || hide)
226  {
227  trixel->removeChildNode(node);
228  delete node;
229  *i = QPair<SkyObject *, SkyNode *>((*i).first, 0);
230  }
231  else
232  {
233  if (!hideSlew)
234  {
235  node->update(drawLabel);
236  }
237  else
238  {
239  node->hide();
240  }
241  }
242  }
243  else
244  {
245  if (!hide && !hideSlew && projector->checkVisibility(starObj))
246  {
247  QPointF pos;
248 
249  bool visible = false;
250  pos = projector->toScreen(starObj, true, &visible);
251  if (visible && projector->onScreen(pos))
252  {
253  PointSourceNode *point =
254  new PointSourceNode(starObj, rootNode(), LabelsItem::label_t::STAR_LABEL,
255  starObj->spchar(), starObj->mag(), trixelID);
256  trixel->appendChildNode(point);
257 
258  *i = QPair<SkyObject *, SkyNode *>((*i).first, static_cast<SkyNode *>(point));
259  point->updatePos(pos, drawLabel);
260  }
261  }
262  }
263  ++i;
264  }
265  }
266  }
267  else if (false)
268  {
269  //Dynamic stars are under construction
270  if (!m_staticStars && !m_starBlockList->at(regionID)->fillToMag(maglim) &&
271  maglim <= m_deepStarComp->m_FaintMagnitude * (1 - 1.5 / 16))
272  {
273  qDebug() << "SBL::fillToMag( " << maglim << " ) failed for trixel " << regionID << " !" << endl;
274  }
275 
276  for (int i = 0; i < m_starBlockList->at(regionID)->getBlockCount(); ++i)
277  {
278  bool hide = false;
279 
280  std::shared_ptr<StarBlock> block = m_starBlockList->at(regionID)->block(i);
281 
282  for (int j = 0; j < block->getStarCount(); j++)
283  {
284  StarNode *star = block->star(j);
285  StarObject *curStar = &(star->star);
286  PointSourceNode *point = star->starNode;
287 
288  if (curStar->updateID != updateID)
289  curStar->JITupdate();
290 
291  float mag = curStar->mag();
292 
293  if (!hide)
294  {
295  if (mag > maglim)
296  hide = true;
297  }
298 
299  if (!hide)
300  {
301  if (!point)
302  {
303  star->starNode = new PointSourceNode(curStar, rootNode(), LabelsItem::label_t::NO_LABEL,
304  curStar->spchar(), curStar->mag(), regionID);
305  point = star->starNode;
306  trixel->appendChildNode(point);
307  }
308  //point->setSizeMagLim(m_zoomMagLimit);
309  point->update();
310  }
311  else
312  {
313  if (point)
314  point->hide();
315  }
316  }
317  }
318  }
319  trixel = static_cast<TrixelNode *>(trixel->nextSibling());
320  trixelID++;
321  }
322  m_skyMesh->inDraw(false);
323  }
324 }
void append(const T &value)
A base class that is used for displaying SkyComponents on SkyMapLite.
Definition: skyitem.h:29
A container for nodes that holds collection of textures for stars and provides clipping.
Definition: rootnode.h:59
Stores dms coordinates for a point in the sky. for converting between coordinate systems.
Definition: skypoint.h:44
virtual void update()
updates all trixels that contain stars
void aperture(SkyPoint *center, double radius, MeshBufNum_t bufNum=DRAW_BUF)
finds the set of trixels that cover the circular aperture specified after first performing a reverse ...
Definition: skymesh.cpp:56
void appendChildNode(QSGNode *node)
QSGNode * firstChild() const const
virtual void update()
Updates coordinate of the object on SkyMapLite.
Definition: skynode.h:48
float mag() const
Definition: skyobject.h:206
Handles labels in SkyMapLite.
Definition: labelsitem.h:52
virtual void show() override
makes this node visible
Definition: skyitem.cpp:23
bool onScreen(const QPointF &p) const
Check whether the projected point is on-screen.
Definition: projector.cpp:98
static double deleteLimit()
return limit of hides for the node to delete it
Definition: skymaplite.cpp:199
virtual void show() override
makes this node visible
Definition: trixelnode.cpp:40
const Projector * projector() const
Get the current projector.
Definition: skymaplite.h:323
DrawID drawID() const
Definition: skymesh.h:264
subclass of SkyObject specialized for stars.
Definition: starobject.h:32
const T & at(int i) const const
A SkyNode derived class that represents stars and objects that are drawn as stars.
virtual void update() override
update updates coordinates of this node based on the visibility of its SkyObject
Convenience class that represents trixel in SkyMapLite.
Definition: trixelnode.h:20
virtual void hide() override
hides this item and corresponding labels
Definition: skyitem.cpp:37
QLinkedList< QPair< SkyObject *, SkyNode * > > m_nodes
m_nodes - holds SkyNodes with corresponding SkyObjects
Definition: trixelnode.h:41
bool hasNext() const
true if there are more trixel to iterate over.
Definition: MeshIterator.h:27
static SkyMesh * Instance()
returns the default instance of SkyMesh or null if it has not yet been created.
Definition: skymesh.cpp:39
Item for displaying sky objects; also handles user interaction events.
Definition: skymaplite.h:58
char spchar() const
Returns just the first character of the spectral type string.
Definition: starobject.cpp:554
void updatePos(QPointF pos, bool drawLabel)
updatePos updates position of this node and its label.
QLinkedList::iterator begin()
QPointF toScreen(const SkyPoint *o, bool oRefract=true, bool *onVisibleHemisphere=nullptr) const
This is exactly the same as toScreenVec but it returns a QPointF.
Definition: projector.cpp:93
QLinkedList::iterator end()
RootNode * rootNode()
Definition: skyitem.h:57
void JITupdate()
added for JIT updates from both StarComponent and ConstellationLines
Definition: starobject.cpp:526
int hideCount()
m_hideCount is a counter of how much updates of SkyMapLite this trixel remained hidden.
Definition: trixelnode.h:30
int size() const const
virtual void hide() override
hides this node
Definition: trixelnode.cpp:34
Provides virtual functions for update of coordinates and nodes hiding.
Definition: skynode.h:27
A factory that creates StarBlocks and recycles them in an LRU Cache.
virtual void hide() override
hides this node and its label.
QSGNode * nextSibling() const const
virtual void hide()
hides all child nodes (sets opacity of m_opacity to 0)
Definition: skynode.cpp:21
bool checkVisibility(const SkyPoint *p) const
Determine if the skypoint p is likely to be visible in the display window.
Definition: projector.cpp:183
void removeChildNode(QSGNode *node)
Trixel next() const
returns the next trixel
Definition: MeshIterator.h:31
DeepStarItem(DeepStarComponent *deepStarComp, RootNode *rootNode)
Constructor.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Tue Sep 26 2023 03:55:45 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.