Merge from trunk 16122-16307
[blender.git] / source / gameengine / Ketsji / BL_Shader.h
index 2e08eeb0d70d00551908636dd8a53b9474a25b49..8f3034540873488bb99108fad027d4b0d4cc9602 100644 (file)
 
 #include "PyObjectPlus.h"
 #include "BL_Material.h"
-
-// -----------------------------------
-// user state management
-typedef struct uSampler
+#include "BL_Texture.h"
+// --
+#include "MT_Matrix4x4.h"
+#include "MT_Matrix3x3.h"
+#include "MT_Tuple2.h"
+#include "MT_Tuple3.h"
+#include "MT_Tuple4.h"
+
+#define SHADER_ATTRIBMAX 1
+
+/**
+ * BL_Sampler
+ *  Sampler access 
+ */
+class BL_Sampler
 {
-       unsigned int    type;
-       int                             pass;
-       int                             unit;
-       int                             loc;
-       unsigned int    glTexture;
-}uSampler;
+public:
+       BL_Sampler():
+               mLoc(-1)
+       {
+       }
+       int                             mLoc;           // Sampler location
+};
 
-#define SAMP_2D                1
-#define SAMP_CUBE      2
+/**
+ * BL_Uniform
+ *  uniform storage 
+ */
+class BL_Uniform 
+{
+private:
+       int                     mLoc;           // Uniform location
+       void*           mData;          // Memory allocated for variable
+       bool            mDirty;         // Caching variable  
+       int                     mType;          // Enum UniformTypes
+       bool            mTranspose; // Transpose matrices
+       const int       mDataLen;       // Length of our data
+public:
+       BL_Uniform(int data_size);
+       ~BL_Uniform();
+       
 
+       void Apply(class BL_Shader *shader);
+       void SetData(int location, int type, bool transpose=false);
+
+       enum UniformTypes {
+               UNI_NONE        =0,
+               UNI_INT,
+               UNI_FLOAT,
+               UNI_INT2,
+               UNI_FLOAT2,
+               UNI_INT3,
+               UNI_FLOAT3,
+               UNI_INT4,
+               UNI_FLOAT4,
+               UNI_MAT3,
+               UNI_MAT4,
+               UNI_MAX
+       };
+
+       int GetLocation()       { return mLoc; }
+       void* getData()         { return mData; }
+};
 
-// -----------------------------------
-typedef struct uBlending
+/**
+ * BL_DefUniform
+ * pre defined uniform storage 
+ */
+class BL_DefUniform
 {
-       unsigned int pass;
-       int src;        // GL_ blend func values
-       int dest;
-       float const_color[4];
-}uBlending;
-// -----------------------------------
-
-// ----------------
+public:
+       BL_DefUniform() :
+               mType(0),
+               mLoc(0),
+               mFlag(0)
+       {
+       }
+       int                             mType;
+       int                             mLoc;
+       unsigned int    mFlag;
+};
+
+/**
+ * BL_Shader
+ *  shader access
+ */
 class BL_Shader : public PyObjectPlus
 {
        Py_Header;
 private:
-       unsigned int    mShader, 
-                                       mVert,
-                                       mFrag;
-       int                             mPass;
-       bool                    mOk;
-       bool                    mUse;
-       uSampler                mSampler[MAXTEX];
-       uBlending               mBlending;
-       char*                   vertProg;
-       char*                   fragProg;
-       bool                    LinkProgram();
-       bool                    PrintInfo(int len, unsigned int handle, const char *type);
+       typedef std::vector<BL_Uniform*>        BL_UniformVec;
+       typedef std::vector<BL_DefUniform*>     BL_UniformVecDef;
+
+       unsigned int    mShader;                        // Shader object 
+       int                             mPass;                          // 1.. unused
+       bool                    mOk;                            // Valid and ok
+       bool                    mUse;                           // ...
+//BL_Sampler           mSampler[MAXTEX];       // Number of samplers
+       int                             mAttr;                          // Tangent attribute
+       char*                   vertProg;                       // Vertex program string
+       char*                   fragProg;                       // Fragment program string
+       bool                    mError;                         // ...
+       bool                    mDirty;                         // 
+
+       // Compiles and links the shader
+       bool LinkProgram();
+
+       // Stored uniform variables
+       BL_UniformVec           mUniforms;
+       BL_UniformVecDef        mPreDef;
+
+       // search by location
+       BL_Uniform*             FindUniform(const int location);
+       // clears uniform data
+       void                    ClearUniforms();
 
 public:
-       BL_Shader(int n, PyTypeObject *T=&Type);
+       BL_Shader(PyTypeObject *T=&Type);
        virtual ~BL_Shader();
 
-       char*           GetVertPtr();
-       char*           GetFragPtr();
-       void            SetVertPtr( char *vert );
-       void            SetFragPtr( char *frag );
+       // Unused for now tangent is set as 
+       // tex coords
+       enum AttribTypes {
+               SHD_TANGENT =1
+       };
+
+       enum GenType {
+               MODELVIEWMATRIX,
+               MODELVIEWMATRIX_TRANSPOSE,
+               MODELVIEWMATRIX_INVERSE,
+               MODELVIEWMATRIX_INVERSETRANSPOSE,
+       
+               // Model matrix
+               MODELMATRIX,
+               MODELMATRIX_TRANSPOSE,
+               MODELMATRIX_INVERSE,
+               MODELMATRIX_INVERSETRANSPOSE,
+       
+               // View Matrix
+               VIEWMATRIX,
+               VIEWMATRIX_TRANSPOSE,
+               VIEWMATRIX_INVERSE,
+               VIEWMATRIX_INVERSETRANSPOSE,
+
+               // Current camera position 
+               CAM_POS,
+
+               // RAS timer
+               CONSTANT_TIMER
+       };
+
+       const char* GetVertPtr();
+       const char* GetFragPtr();
+       void SetVertPtr( char *vert );
+       void SetFragPtr( char *frag );
        
        // ---
        int getNumPass()        {return mPass;}
-       bool use()                      {return mUse;}
-
+       bool GetError()         {return mError;}
        // ---
-       // access
-       const uSampler*         getSampler(int i);
-       const uBlending*        getBlending( int pass );
-       const bool                      Ok()const;
+       //const BL_Sampler*     GetSampler(int i);
+       void                            SetSampler(int loc, int unit);
 
+       const bool                      Ok()const;
        unsigned int            GetProg();
-       unsigned int            GetVertexShader();
-       unsigned int            GetFragmentShader();
-       
-       void InitializeSampler(
-               int type,
-               int unit,
-               int pass,
-               unsigned int texture
-       );
+       void                            SetProg(bool enable);
+       int                                     GetAttribute(){return mAttr;};
 
-       // -----------------------------------
-       // python interface
+       // -- 
+       // Apply methods : sets colected uniforms
+       void ApplyShader();
+       void UnloadShader();
+
+       // Update predefined uniforms each render call
+       void Update(const class KX_MeshSlot & ms, class RAS_IRasterizer* rasty);
+
+       //// Set sampler units (copied)
+       //void InitializeSampler(int unit, BL_Texture* texture );
+
+
+       void SetUniformfv(int location,int type, float *param, int size,bool transpose=false);
+       void SetUniformiv(int location,int type, int *param, int size,bool transpose=false);
+
+       int GetAttribLocation(const STR_String& name);
+       void BindAttribute(const STR_String& attr, int loc);
+       int GetUniformLocation(const STR_String& name);
+
+       void SetUniform(int uniform, const MT_Tuple2& vec);
+       void SetUniform(int uniform, const MT_Tuple3& vec);
+       void SetUniform(int uniform, const MT_Tuple4& vec);
+       void SetUniform(int uniform, const MT_Matrix4x4& vec, bool transpose=false);
+       void SetUniform(int uniform, const MT_Matrix3x3& vec, bool transpose=false);
+       void SetUniform(int uniform, const float& val);
+       void SetUniform(int uniform, const float* val, int len);
+       void SetUniform(int uniform, const int* val, int len);
+       void SetUniform(int uniform, const unsigned int& val);
+       void SetUniform(int uniform, const int val);
+
+       // Python interface
        virtual PyObject* _getattr(const STR_String& attr);
 
+       // -----------------------------------
        KX_PYMETHOD_DOC( BL_Shader, setSource );
        KX_PYMETHOD_DOC( BL_Shader, delSource );
        KX_PYMETHOD_DOC( BL_Shader, getVertexProg );
        KX_PYMETHOD_DOC( BL_Shader, getFragmentProg );
        KX_PYMETHOD_DOC( BL_Shader, setNumberOfPasses );
-
-       // -----------------------------------
        KX_PYMETHOD_DOC( BL_Shader, isValid);
        KX_PYMETHOD_DOC( BL_Shader, validate);
+
+       // -----------------------------------
        KX_PYMETHOD_DOC( BL_Shader, setUniform4f );
        KX_PYMETHOD_DOC( BL_Shader, setUniform3f );
        KX_PYMETHOD_DOC( BL_Shader, setUniform2f );
@@ -98,20 +222,13 @@ public:
        KX_PYMETHOD_DOC( BL_Shader, setUniform3i );
        KX_PYMETHOD_DOC( BL_Shader, setUniform2i );
        KX_PYMETHOD_DOC( BL_Shader, setUniform1i );
-
        KX_PYMETHOD_DOC( BL_Shader, setUniformfv );
        KX_PYMETHOD_DOC( BL_Shader, setUniformiv );
-
        KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix4 );
        KX_PYMETHOD_DOC( BL_Shader, setUniformMatrix3 );
-
-       // these come from within the material buttons
-       // sampler2d/samplerCube work
+       KX_PYMETHOD_DOC( BL_Shader, setUniformDef );
+       KX_PYMETHOD_DOC( BL_Shader, setAttrib );
        KX_PYMETHOD_DOC( BL_Shader, setSampler);
-       // user blending funcs
-       KX_PYMETHOD_DOC( BL_Shader, setBlending );
 };
 
-
-
 #endif//__BL_SHADER_H__