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

OpenGL

开发平台:

Visual C++

  1. // rendcontext.h
  2. //
  3. // Copyright (C) 2004-2006, 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. #ifndef _CELENGINE_RENDCONTEXT_H_
  10. #define _CELENGINE_RENDCONTEXT_H_
  11. #include <celmath/quaternion.h>
  12. #include "mesh.h"
  13. #include "shadermanager.h"
  14. class RenderContext
  15. {
  16.  public:
  17.     RenderContext(const Mesh::Material*);
  18.     RenderContext();
  19.     virtual ~RenderContext() {};
  20.     virtual void makeCurrent(const Mesh::Material&) = 0;
  21.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  22.                                  void* vertexData) = 0;
  23.     virtual void drawGroup(const Mesh::PrimitiveGroup& group);
  24.     const Mesh::Material* getMaterial() const;
  25.     void setMaterial(const Mesh::Material*);
  26.     void lock() { locked = true; }
  27.     void unlock() { locked = false; }
  28.     bool isLocked() const { return locked; }
  29.     enum RenderPass
  30.     {
  31.         PrimaryPass,
  32.         EmissivePass,
  33.     };
  34.     RenderPass getRenderPass() const { return renderPass; }
  35.     void setRenderPass(RenderPass rp) { renderPass = rp; }
  36.     void setPointScale(float);
  37.     float getPointScale() const;
  38.     
  39.     void setCameraOrientation(const Quatf& q);
  40.     Quatf getCameraOrientation() const;
  41.     
  42.  private:
  43.     const Mesh::Material* material;
  44.     bool locked;
  45.     RenderPass renderPass;
  46.     float pointScale;
  47.     Quatf cameraOrientation;  // required for drawing billboards
  48.  protected:
  49.     bool usePointSize;
  50.     bool useNormals;
  51.     bool useColors;
  52.     bool useTexCoords;
  53. };
  54. class FixedFunctionRenderContext : public RenderContext
  55. {
  56.  public:
  57.     FixedFunctionRenderContext(const Mesh::Material*);
  58.     FixedFunctionRenderContext();
  59.     virtual ~FixedFunctionRenderContext();
  60.     virtual void makeCurrent(const Mesh::Material&);
  61.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  62.                                  void* vertexData);
  63.     void setLighting(bool);
  64.  private:
  65.     Mesh::BlendMode blendMode;
  66.     bool specularOn;
  67.     bool lightingEnabled;
  68. };
  69. class VP_FP_RenderContext : public RenderContext
  70. {
  71.  public:
  72.     VP_FP_RenderContext();
  73.     VP_FP_RenderContext(const Mesh::Material*);
  74.     virtual void makeCurrent(const Mesh::Material&);
  75.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  76.                                  void* vertexData);
  77. };
  78. class VP_Combiner_RenderContext : public RenderContext
  79. {
  80.  public:
  81.     VP_Combiner_RenderContext();
  82.     VP_Combiner_RenderContext(const Mesh::Material*);
  83.     virtual void makeCurrent(const Mesh::Material&);
  84.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  85.                                  void* vertexData);
  86. };
  87. class GLSL_RenderContext : public RenderContext
  88. {
  89.  public:
  90.     GLSL_RenderContext(const LightingState& ls, float _objRadius, const Mat4f& _xform);
  91.     virtual ~GLSL_RenderContext();
  92.     
  93.     virtual void makeCurrent(const Mesh::Material&);
  94.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  95.                                  void* vertexData);
  96.                  
  97.     virtual void setLunarLambert(float);
  98.     virtual void setAtmosphere(const Atmosphere*);
  99.  private:
  100.      void initLightingEnvironment();
  101.      void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor);
  102.      void setShadowParameters(CelestiaGLProgram& prog);
  103.      
  104.  private:
  105.     const LightingState& lightingState;
  106.     const Atmosphere* atmosphere;
  107.     Mesh::BlendMode blendMode;
  108.     float objRadius;
  109.     Mat4f xform;
  110.     
  111.     // extended material properties
  112.     float lunarLambert;
  113.     
  114.     ShaderProperties shaderProps;
  115. };
  116. class GLSLUnlit_RenderContext : public RenderContext
  117. {
  118.  public:
  119.     GLSLUnlit_RenderContext(float _objRadius);
  120.     virtual ~GLSLUnlit_RenderContext();
  121.     
  122.     virtual void makeCurrent(const Mesh::Material&);
  123.     virtual void setVertexArrays(const Mesh::VertexDescription& desc,
  124.                                  void* vertexData);
  125.  private:
  126.      void initLightingEnvironment();
  127.      void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor);
  128.      
  129.  private:
  130.     Mesh::BlendMode blendMode;
  131.     float objRadius;
  132.     
  133.     ShaderProperties shaderProps;
  134. };
  135. #endif // _CELENGINE_RENDCONTEXT_H_