00001
00002
00003
00004
00005
00006
00007
00008 #ifndef SHADER_H_
00009 #define SHADER_H_
00010
00011 #include<vector>
00012 #include"fv_inc.h"
00013 #include"Log.h"
00014
00015
00016 struct tagStrDict;
00017 namespace FemViewer {
00018
00019 extern tagStrDict ShaderDictionary[];
00020
00021 class Light;
00022
00023 typedef enum eRenderType {
00024 SH_UNKNOWN = -1,
00025 SH_EDGE = 0,
00026 SH_TRIANGLE,
00027 SH_TRIANGLE_STRIP,
00028 SH_ALL
00029 } glsl_program_type;
00030
00031 typedef enum {
00032 EDGE_VERT =0,
00033 EDGE_FRAG,
00034 TRI_VERT,
00035 TRI_GEOM,
00036 TRI_FRAG,
00037 TRISTRIP_GEOM
00038 } glslshader_type;
00039
00040 class Shader
00041 {
00042 public:
00043 static const int ProjectionBlkIdx;
00044 static const int IsoValuesBlkIdx;
00045
00046 public:
00047 Shader(eRenderType type = SH_UNKNOWN);
00048 virtual ~Shader();
00049 virtual bool Init();
00050 void Enable();
00051
00052
00053
00054
00055
00056 protected:
00057 bool Attach(GLenum Type,const char* FilePath);
00058 bool Complete();
00059 GLuint GetUniformParam(const char* NameOfParam);
00060 GLuint GetUniformBlockIndex(const char* UnifBlockName);
00061
00062 eRenderType _type;
00063 GLuint _programId;
00064 GLuint _UnifBlockIndexlocation;
00065 GLuint _IsoValuesUnifBlk;
00066 private:
00067 typedef std::vector<GLuint> vShaders;
00068 vShaders _shaders;
00069 };
00070
00071 class EdgeShader : public Shader
00072 {
00073 public:
00074 EdgeShader();
00075 ~EdgeShader() {mfp_log_debug("~EdgeShader");}
00076
00077 private:
00078 EdgeShader(const EdgeShader&);
00079 EdgeShader& operator=(const EdgeShader&);
00080 };
00081
00082 class TriangleShader : public Shader
00083 {
00084 public:
00085 TriangleShader(eRenderType type = SH_TRIANGLE);
00086 virtual ~TriangleShader() {mfp_log_debug("~TriangleShader");}
00087 virtual bool Init();
00088
00089 void SetMatrixNM(const float martix[]);
00090 void SetNumOfTriangles(int nTraingles);
00091 void SetLight(const Light& light);
00092 void EdgesOn(bool flag = true);
00093 void IsoLinesOn(bool flag = false);
00094 void ColoredIsoLines(bool flag = false);
00095
00096 protected:
00097 enum {
00098 NUM_OF_TRIFACES = 0,
00099 LIGHT_POSITION,
00100 LIGHT_INTENISTY,
00101 AMBIENT_INTENSITY,
00102 DRAW_EDGES,
00103 DRAW_ISOLINES,
00104 ISOLINES_COLORED,
00105 ALL_PARAMS
00106 };
00107
00108 GLuint _shParams[ALL_PARAMS];
00109 private:
00110 TriangleShader(const TriangleShader&);
00111 TriangleShader& operator=(const TriangleShader&);
00112 };
00113
00114
00115 class TriStripsVGFShader : public TriangleShader
00116 {
00117 public:
00118 TriStripsVGFShader() : TriangleShader(SH_TRIANGLE_STRIP)
00119 {}
00120 ~TriStripsVGFShader() { mfp_log_debug("~TriStripShader"); }
00121 private:
00122 TriStripsVGFShader(const TriStripsVGFShader&);
00123 TriStripsVGFShader& operator=(const TriStripsVGFShader&);
00124 };
00125
00126 class GLShader {
00127 public:
00128 static const char* GetPath(int type);
00129 public:
00130 GLShader(const char* path,int type);
00131 GLShader(const GLShader& rh);
00132 void Delete();
00133 bool IsLoaded() const { return m_loaded; }
00134 GLuint GetID() const { return m_id; }
00135 GLuint GetType() const { return m_type; }
00136 private:
00137 GLuint m_id;
00138 int m_type;
00139 bool m_loaded;
00140 };
00141
00142
00143 class GLShaderProgram
00144 {
00145 public:
00146 static const int MatricesBlokIndex;
00147 static const int ParametersBlockIndex;
00148 public:
00149 GLShaderProgram();
00150 ~GLShaderProgram();
00151
00152
00153 void Delete();
00154 bool AddShader(const char* path,int type);
00155 bool Complete();
00156 void Enable();
00157
00158 GLuint GetID();
00159
00160
00161 GLuint GetUniformBlockIndex(const char* blkName);
00162
00163 void SetUniform(const char* name,int value);
00164 void SetUniform(const char* name,const float* values);
00165
00166
00167 private:
00168 GLShaderProgram(const GLShaderProgram&);
00169 GLShaderProgram& operator=(const GLShaderProgram&);
00170
00171 typedef std::vector<GLShader> vShaders;
00172 vShaders m_shaders;
00173 bool m_linked;
00174 GLuint m_id;
00175
00176 GLuint m_blkProjID;
00177 GLuint m_blkParamID;
00178
00179 };
00180
00181 }
00182 #endif