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

OpenGL

开发平台:

Visual C++

  1. // nebula.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 <celmath/mathlib.h>
  13. #include <celutil/util.h>
  14. #include <celutil/debug.h>
  15. #include "astro.h"
  16. #include "nebula.h"
  17. #include "meshmanager.h"
  18. #include "rendcontext.h"
  19. #include "gl.h"
  20. #include "glext.h"
  21. #include "vecgl.h"
  22. #include "render.h"
  23. using namespace std;
  24. Nebula::Nebula() :
  25.     geometry(InvalidResource)
  26. {
  27. }
  28. const char* Nebula::getType() const
  29. {
  30.     return "Nebula";
  31. }
  32. void Nebula::setType(const string& /*typeStr*/)
  33. {
  34. }
  35. size_t Nebula::getDescription(char* buf, size_t bufLength) const
  36. {
  37.     return snprintf(buf, bufLength, _("%s"), getType());
  38. }
  39. ResourceHandle Nebula::getGeometry() const
  40. {
  41.     return geometry;
  42. }
  43. void Nebula::setGeometry(ResourceHandle _geometry)
  44. {
  45.     geometry = _geometry;
  46. }
  47. const char* Nebula::getObjTypeName() const
  48. {
  49.     return "nebula";
  50. }
  51. bool Nebula::pick(const Ray3d& ray,
  52.                   double& distanceToPicker,
  53.                   double& cosAngleToBoundCenter) const
  54. {
  55.     // The preconditional sphere-ray intersection test is enough for now:
  56.     return DeepSkyObject::pick(ray, distanceToPicker, cosAngleToBoundCenter);
  57. }
  58. bool Nebula::load(AssociativeArray* params, const string& resPath)
  59. {
  60.     string geometryFileName;
  61.     if (params->getString("Mesh", geometryFileName))
  62.     {
  63.         ResourceHandle geometryHandle =
  64.             GetGeometryManager()->getHandle(GeometryInfo(geometryFileName, resPath));
  65.         setGeometry(geometryHandle);
  66.     }
  67.     return DeepSkyObject::load(params, resPath);
  68. }
  69. void Nebula::render(const GLContext& glcontext,
  70.                     const Vec3f&,
  71.                     const Quatf&,
  72.                     float,
  73.                     float pixelSize)
  74. {
  75.     Geometry* g = NULL;
  76.     if (geometry != InvalidResource)
  77.         g = GetGeometryManager()->find(geometry);
  78.     if (g == NULL)
  79.         return;
  80.     glDisable(GL_BLEND);
  81.     glScalef(getRadius(), getRadius(), getRadius());
  82.     glRotate(getOrientation());
  83.     if (glcontext.getRenderPath() == GLContext::GLPath_GLSL)
  84.     {
  85.         GLSLUnlit_RenderContext rc(getRadius());
  86.         rc.setPointScale(2.0f * getRadius() / pixelSize);
  87.         g->render(rc);
  88.         glx::glUseProgramObjectARB(0);
  89.     }
  90.     else
  91.     {
  92.         FixedFunctionRenderContext rc;
  93.         rc.setLighting(false);
  94.         g->render(rc);
  95.         // Reset the material
  96.         float black[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
  97.         float zero = 0.0f;
  98.         glColor4fv(black);
  99.         glMaterialfv(GL_FRONT, GL_EMISSION, black);
  100.         glMaterialfv(GL_FRONT, GL_SPECULAR, black);
  101.         glMaterialfv(GL_FRONT, GL_SHININESS, &zero);
  102.     }
  103.     glEnable(GL_BLEND);
  104. }
  105. unsigned int Nebula::getRenderMask() const
  106. {
  107.     return Renderer::ShowNebulae;
  108. }
  109. unsigned int Nebula::getLabelMask() const
  110. {
  111.     return Renderer::NebulaLabels;
  112. }