00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef PROGRAMMABLE_SHADER_H__
00020 #define PROGRAMMABLE_SHADER_H__
00021
00022 #include "stateGLI.h"
00023 #include "../texCoordGen/texCoordGen.h"
00024 #include "../texCoordGen/texCoordPerturb.h"
00025
00026 namespace glift {
00027
00028
00029
00030
00031
00032
00033
00034 class _export_ ProgShader :
00035 public StateGLI,
00036 public MultiTexCoordGen
00037 {
00038 public:
00039 ProgShader( int numTexUnits, PixelShader* pixShader, TexCoordPerturb* texCoordPerturb=NULL );
00040 ProgShader( int numTexUnits, VertexShader* vertShader, TexCoordPerturb* texCoordPerturb=NULL );
00041 ProgShader( int numTexUnits, PixelShader* pixShader, VertexShader* vertShader, TexCoordPerturb* texCoordPerturb=NULL );
00042 ProgShader( const ProgShader& rhs );
00043 ProgShader& operator=( const ProgShader& rhs );
00044 ~ProgShader();
00045
00046 void setPixelShader( PixelShader* shader ) {m_pixelShader = shader;}
00047 void setVertexShader( VertexShader* shader) {m_vertexShader = shader;}
00048
00049
00050
00051
00052 MultiTexCoord* genTexCoords( const gutz::arrayw2f& rawTexCoord, const gutz::vec3f& primScale ) const;
00053
00054
00055 int numTexUnits() {return m_numTexUnits;}
00056
00057 protected:
00058 virtual void bindDef();
00059 virtual void releaseDef();
00060
00061 private:
00062 int m_numTexUnits;
00063 PixelShader* m_pixelShader;
00064 VertexShader* m_vertexShader;
00065 TexCoordPerturb* m_texCoordPerturb;
00066
00067 ProgShader();
00068 void initMembers( const ProgShader& rhs );
00069 void initMembers( int numTexUnits, PixelShader* pixShader, VertexShader* vertShader,
00070 TexCoordPerturb* texCoordPerturb );
00071 };
00072
00073 typedef gutz::SmartPtr<ProgShader> ProgShaderSP;
00074
00075
00076
00077
00078
00079
00080
00081 ProgShaderSP getProgShaderFromFile(const char *fileName, std::ostream *es = 0);
00082 ProgShaderSP getProgShaderFromText(const char *progText, std::ostream *es = 0);
00083
00084
00085 }
00086
00087 #endif