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

OpenGL

开发平台:

Visual C++

  1. // deepskyobj.cpp
  2. //
  3. // Copyright (C) 2003, 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. #include <stdio.h>
  11. #include "celestia.h"
  12. #include <cassert>
  13. #include "astro.h"
  14. #include "deepskyobj.h"
  15. #include "galaxy.h"
  16. #include "globular.h"
  17. #include "nebula.h"
  18. #include "opencluster.h"
  19. #include <celutil/util.h>
  20. #include <celutil/debug.h>
  21. #include <celmath/intersect.h>
  22. using namespace std;
  23. const float DSO_DEFAULT_ABS_MAGNITUDE = -1000.0f;
  24. DeepSkyObject::DeepSkyObject() :
  25.     catalogNumber(InvalidCatalogNumber),
  26.     position(0, 0, 0),
  27.     orientation(1),
  28.     radius(1),
  29.     absMag(DSO_DEFAULT_ABS_MAGNITUDE),
  30.     infoURL(NULL),
  31.     visible(true),
  32.     clickable(true)
  33. {
  34. }
  35. DeepSkyObject::~DeepSkyObject()
  36. {
  37. }
  38. void DeepSkyObject::setCatalogNumber(uint32 n)
  39. {
  40.     catalogNumber = n;
  41. }
  42. Point3d DeepSkyObject::getPosition() const
  43. {
  44.     return position;
  45. }
  46. void DeepSkyObject::setPosition(const Point3d& p)
  47. {
  48.     position = p;
  49. }
  50. Quatf DeepSkyObject::getOrientation() const
  51. {
  52.     return orientation;
  53. }
  54. void DeepSkyObject::setOrientation(const Quatf& q)
  55. {
  56.     orientation = q;
  57. }
  58. void DeepSkyObject::setRadius(float r)
  59. {
  60.     radius = r;
  61. }
  62. float DeepSkyObject::getAbsoluteMagnitude() const
  63. {
  64.     return absMag;
  65. }
  66. void DeepSkyObject::setAbsoluteMagnitude(float _absMag)
  67. {
  68.     absMag = _absMag;
  69. }
  70. size_t DeepSkyObject::getDescription(char* buf, size_t bufLength) const
  71. {
  72.     if (bufLength > 0)
  73.         buf[0] = '';
  74.     return 0;
  75. }
  76. string DeepSkyObject::getInfoURL() const
  77. {
  78.     if (infoURL == NULL)
  79.         return "";
  80.     else
  81.         return *infoURL;
  82. }
  83. void DeepSkyObject::setInfoURL(const string& s)
  84. {
  85.     if (infoURL == NULL)
  86.         infoURL = new string(s);
  87.     else
  88.         *infoURL = s;
  89. }
  90. bool DeepSkyObject::pick(const Ray3d& ray,
  91.                          double& distanceToPicker,
  92.                          double& cosAngleToBoundCenter) const
  93. {
  94.     if (isVisible())
  95.         return testIntersection(ray, Sphered(position, (double) radius), distanceToPicker, cosAngleToBoundCenter);
  96.     else
  97.         return false;
  98. }
  99. void DeepSkyObject::hsv2rgb( float *r, float *g, float *b, float h, float s, float v )
  100. {
  101. // r,g,b values are from 0 to 1
  102. // h = [0,360], s = [0,1], v = [0,1]
  103. int i;
  104. float f, p, q, t;
  105. if( s == 0 ) 
  106. {
  107. // achromatic (grey)
  108. *r = *g = *b = v;
  109. return;
  110. }
  111. h /= 60;                      // sector 0 to 5
  112. i = (int) floorf( h );
  113. f = h - (float) i;            // factorial part of h
  114. p = v * ( 1 - s );
  115. q = v * ( 1 - s * f );
  116. t = v * ( 1 - s * ( 1 - f ) );
  117. switch( i ) 
  118. {
  119. case 0:
  120. *r = v;
  121. *g = t;
  122. *b = p;
  123. break;
  124. case 1:
  125. *r = q;
  126. *g = v;
  127. *b = p;
  128. break;
  129. case 2:
  130. *r = p;
  131. *g = v;
  132. *b = t;
  133. break;
  134. case 3:
  135. *r = p;
  136. *g = q;
  137. *b = v;
  138. break;
  139. case 4:
  140. *r = t;
  141. *g = p;
  142. *b = v;
  143. break;
  144. default:
  145. *r = v;
  146. *g = p;
  147. *b = q;
  148. break;
  149. }
  150. }
  151. bool DeepSkyObject::load(AssociativeArray* params, const string& resPath)
  152. {
  153.     // Get position
  154.     Vec3d position(0.0, 0.0, 0.0);
  155.     if (params->getVector("Position", position))
  156.     {
  157.         setPosition(Point3d(position.x, position.y, position.z));
  158.     }
  159.     else
  160.     {
  161.         double distance = 1.0;
  162.         double RA = 0.0;
  163.         double dec = 0.0;
  164.         params->getNumber("Distance", distance);
  165.         params->getNumber("RA", RA);
  166.         params->getNumber("Dec", dec);
  167.         Point3d p = astro::equatorialToCelestialCart(RA, dec, distance);
  168.         setPosition(p);
  169.     }
  170.     // Get orientation
  171.     Vec3d axis(1.0, 0.0, 0.0);
  172.     double angle = 0.0;
  173.     params->getVector("Axis", axis);
  174.     params->getNumber("Angle", angle);
  175.     Quatf q(1);
  176.     q.setAxisAngle(Vec3f((float) axis.x, (float) axis.y, (float) axis.z),
  177.                    (float) degToRad(angle));
  178.     setOrientation(q);
  179.     double radius = 1.0;
  180.     params->getNumber("Radius", radius);
  181.     setRadius((float) radius);
  182.     double absMag = 0.0;
  183.     if (params->getNumber("AbsMag", absMag))
  184.         setAbsoluteMagnitude((float) absMag);
  185.     string infoURL;
  186.     if (params->getString("InfoURL", infoURL))
  187.     {
  188.         if (infoURL.find(':') == string::npos)
  189.         {
  190.             // Relative URL, the base directory is the current one,
  191.             // not the main installation directory
  192.             if (resPath[1] == ':')
  193.                 // Absolute Windows path, file:/// is required
  194.                 infoURL = "file:///" + resPath + "/" + infoURL;
  195.             else if (!resPath.empty())
  196.                 infoURL = resPath + "/" + infoURL;
  197.         }
  198.         setInfoURL(infoURL);
  199.     }
  200.     
  201.     bool visible = true;
  202.     if (params->getBoolean("Visible", visible))
  203.     {
  204.         setVisible(visible);
  205.     }
  206.     
  207.     bool clickable = true;
  208.     if (params->getBoolean("Clickable", clickable))
  209.     {
  210.         setClickable(clickable);
  211.     }
  212.     
  213.     return true;
  214. }