asterism.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:4k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // asterism.cpp
  2. //
  3. // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <algorithm>
  10. #ifndef _WIN32
  11. #ifndef TARGET_OS_MAC
  12. #include <config.h>
  13. #endif /* TARGET_OS_MAC */
  14. #endif /* _WIN32 */
  15. #include <celutil/util.h>
  16. #include <celutil/debug.h>
  17. #include "parser.h"
  18. #include "asterism.h"
  19. using namespace std;
  20. Asterism::Asterism(string _name) :
  21.     name(_name),
  22.     active(true),
  23.     useOverrideColor(false)
  24. {
  25.     i18nName = dgettext("celestia_constellations", _name.c_str());
  26. }
  27. Asterism::~Asterism()
  28. {
  29. }
  30. string Asterism::getName(bool i18n) const
  31. {
  32.     return i18n?i18nName:name;
  33. }
  34. int Asterism::getChainCount() const
  35. {
  36.     return chains.size();
  37. }
  38. const Asterism::Chain& Asterism::getChain(int index) const
  39. {
  40.     return *chains[index];
  41. }
  42. void Asterism::addChain(Asterism::Chain& chain)
  43. {
  44.     chains.insert(chains.end(), &chain);
  45. }
  46. /*! Return whether the constellation is visible.
  47.  */
  48. bool Asterism::getActive() const
  49. {
  50.     return active;
  51. }
  52. /*! Set whether or not the constellation is visible.
  53.  */
  54. void Asterism::setActive(bool _active)
  55. {
  56. active = _active;
  57. }
  58. /*! Get the override color for this constellation.
  59.  */
  60. Color Asterism::getOverrideColor() const
  61. {
  62.     return color;
  63. }
  64. /*! Set an override color for the constellation. If this method isn't
  65.  *  called, the constellation is drawn in the render's default color
  66.  *  for contellations. Calling unsetOverrideColor will remove the
  67.  *  override color.
  68.  */
  69. void Asterism::setOverrideColor(Color c)
  70. {
  71.     color = c;
  72.     useOverrideColor = true;
  73. }
  74. /*! Make this constellation appear in the default color (undoing any
  75.  *  calls to setOverrideColor.
  76.  */
  77. void Asterism::unsetOverrideColor()
  78. {
  79.     useOverrideColor = false;
  80. }
  81. /*! Return true if this constellation has a custom color, or false
  82.  *  if it should be drawn in the default color.
  83.  */
  84. bool Asterism::isColorOverridden() const
  85.     return useOverrideColor;
  86. }
  87. AsterismList* ReadAsterismList(istream& in, const StarDatabase& stardb)
  88. {
  89.     AsterismList* asterisms = new AsterismList();
  90.     Tokenizer tokenizer(&in);
  91.     Parser parser(&tokenizer);
  92.     while (tokenizer.nextToken() != Tokenizer::TokenEnd)
  93.     {
  94.         if (tokenizer.getTokenType() != Tokenizer::TokenString)
  95.         {
  96.             DPRINTF(0, "Error parsing asterism file.n");
  97.             for_each(asterisms->begin(), asterisms->end(), deleteFunc<Asterism*>());
  98.             delete asterisms;
  99.             return NULL;
  100.         }
  101.         string name = tokenizer.getStringValue();
  102.         Asterism* ast = new Asterism(name);
  103.         Value* chainsValue = parser.readValue();
  104.         if (chainsValue == NULL || chainsValue->getType() != Value::ArrayType)
  105.         {
  106.             DPRINTF(0, "Error parsing asterism %sn", name.c_str());
  107.             for_each(asterisms->begin(), asterisms->end(), deleteFunc<Asterism*>());
  108.             delete asterisms;
  109.             delete chainsValue;
  110.             return NULL;
  111.         }
  112.         Array* chains = chainsValue->getArray();
  113.         for (int i = 0; i < (int) chains->size(); i++)
  114.         {
  115.             if ((*chains)[i]->getType() == Value::ArrayType)
  116.             {
  117.                 Array* a = (*chains)[i]->getArray();
  118.                 Asterism::Chain* chain = new Asterism::Chain();
  119.                 for (Array::const_iterator iter = a->begin(); iter != a->end(); iter++)
  120.                 {
  121.                     if ((*iter)->getType() == Value::StringType)
  122.                     {
  123.                         Star* star = stardb.find((*iter)->getString());
  124.                         if (star != NULL)
  125.                             chain->insert(chain->end(), star->getPosition());
  126.                     }
  127.                 }
  128.                 ast->addChain(*chain);
  129.             }
  130.         }
  131.         asterisms->insert(asterisms->end(), ast);
  132.         delete chainsValue;
  133.     }
  134.     return asterisms;
  135. }