NLA SoC: Merge from 2.5
[blender.git] / source / gameengine / Ketsji / KX_BlenderMaterial.h
1 #ifndef __KX_BLENDER_MATERIAL_H__
2 #define __KX_BLENDER_MATERIAL_H__
3
4 #include <vector>
5
6
7 #include "RAS_IPolygonMaterial.h"
8 #include "BL_Material.h"
9 #include "BL_Texture.h"
10 #include "BL_Shader.h"
11 #include "BL_BlenderShader.h"
12
13 #include "PyObjectPlus.h"
14
15 #include "MT_Vector3.h"
16 #include "MT_Vector4.h"
17
18 struct MTFace;
19 class KX_Scene;
20
21 class KX_BlenderMaterial :  public PyObjectPlus, public RAS_IPolyMaterial
22 {
23         Py_Header;
24 public:
25         // --------------------------------
26         KX_BlenderMaterial();
27         void Initialize(
28                 class KX_Scene* scene,
29                 BL_Material*    mat,
30                 bool                    skin,
31                 int                             lightlayer
32         );
33
34         virtual ~KX_BlenderMaterial();
35
36         // --------------------------------
37         virtual TCachingInfo GetCachingInfo(void) const {
38                 return (void*) this;
39         }
40
41         virtual 
42         bool Activate(
43                 RAS_IRasterizer* rasty, 
44                 TCachingInfo& cachingInfo
45         ) const;
46         
47         virtual 
48         void ActivateMeshSlot(
49                 const RAS_MeshSlot & ms, 
50                 RAS_IRasterizer* rasty 
51         ) const;
52         
53         void ActivateMat(
54                 RAS_IRasterizer* rasty,
55                 TCachingInfo& cachingInfo
56         )const;
57
58         void ActivatShaders(
59                 RAS_IRasterizer* rasty, 
60                 TCachingInfo& cachingInfo
61         )const;
62
63         void ActivateBlenderShaders(
64                 RAS_IRasterizer* rasty, 
65                 TCachingInfo& cachingInfo
66         )const;
67
68         MTFace* GetMTFace(void) const;
69         unsigned int* GetMCol(void) const;
70         BL_Texture * getTex (unsigned int idx) { 
71                 return (idx < MAXTEX) ? mTextures + idx : NULL; 
72         }
73         Image * getImage (unsigned int idx) { 
74                 return (idx < MAXTEX && mMaterial) ? mMaterial->img[idx] : NULL; 
75         }
76         // for ipos
77         void UpdateIPO(
78                 MT_Vector4 rgba, MT_Vector3 specrgb,
79                 MT_Scalar hard, MT_Scalar spec,
80                 MT_Scalar ref, MT_Scalar emit, MT_Scalar alpha
81         );
82         
83         // --------------------------------
84         virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
85
86         KX_PYMETHOD_DOC( KX_BlenderMaterial, getShader );
87         KX_PYMETHOD_DOC( KX_BlenderMaterial, getMaterialIndex );
88         KX_PYMETHOD_DOC( KX_BlenderMaterial, getTexture );
89         KX_PYMETHOD_DOC( KX_BlenderMaterial, setTexture );
90
91         KX_PYMETHOD_DOC( KX_BlenderMaterial, setBlending );
92
93         // --------------------------------
94         // pre calculate to avoid pops/lag at startup
95         virtual void OnConstruction(int layer);
96
97         static void     EndFrame();
98
99 private:
100         BL_Material*            mMaterial;
101         BL_Shader*                      mShader;
102         BL_BlenderShader*       mBlenderShader;
103         KX_Scene*               mScene;
104         BL_Texture              mTextures[MAXTEX];              // texture array
105         bool                    mUserDefBlend;
106         unsigned int    mBlendFunc[2];
107         bool                    mModified;
108         bool                    mConstructed;                   // if false, don't clean on exit
109
110         void SetBlenderGLSLShader(int layer);
111
112         void ActivatGLMaterials( RAS_IRasterizer* rasty )const;
113         void ActivateTexGen( RAS_IRasterizer *ras ) const;
114
115         bool UsesLighting(RAS_IRasterizer *rasty) const;
116         void GetMaterialRGBAColor(unsigned char *rgba) const;
117         Material* GetBlenderMaterial() const;
118         Scene* GetBlenderScene() const;
119         void ReleaseMaterial();
120
121         // message centers
122         void    setTexData( bool enable,RAS_IRasterizer *ras);
123         void    setBlenderShaderData( bool enable, RAS_IRasterizer *ras);
124         void    setShaderData( bool enable, RAS_IRasterizer *ras);
125
126         void    setObjectMatrixData(int i, RAS_IRasterizer *ras);
127         void    setTexMatrixData(int i);
128
129         void    setLightData();
130
131         // cleanup stuff
132         void    OnExit();
133
134         // shader chacing
135         static BL_BlenderShader *mLastBlenderShader;
136         static BL_Shader                *mLastShader;
137
138         mutable int     mPass;
139 };
140
141
142 #endif