df089cb7f99ede5c7155168d26cad6594a0bbaa9
[blender.git] / source / gameengine / Ketsji / KX_BlenderMaterial.h
1
2 /** \file KX_BlenderMaterial.h
3  *  \ingroup ketsji
4  */
5
6 #ifndef __KX_BLENDERMATERIAL_H__
7 #define __KX_BLENDERMATERIAL_H__
8
9 #include <vector>
10
11
12 #include "RAS_IPolygonMaterial.h"
13 #include "BL_Material.h"
14 #include "BL_Texture.h"
15 #include "BL_Shader.h"
16 #include "BL_BlenderShader.h"
17
18 #include "EXP_PyObjectPlus.h"
19
20 #include "MT_Vector3.h"
21 #include "MT_Vector4.h"
22
23 #ifdef WITH_CXX_GUARDEDALLOC
24 #include "MEM_guardedalloc.h"
25 #endif
26
27 #include "SCA_IScene.h" /* only for Replace_IScene */
28 #include "KX_Scene.h"
29
30 struct MTFace;
31 class KX_Scene;
32
33
34 #ifdef USE_MATHUTILS
35 void KX_BlenderMaterial_Mathutils_Callback_Init(void);
36 #endif
37
38 class KX_BlenderMaterial :  public PyObjectPlus, public RAS_IPolyMaterial
39 {
40         Py_Header
41 public:
42         // --------------------------------
43         KX_BlenderMaterial();
44         void Initialize(
45                 class KX_Scene* scene,
46                 BL_Material*    mat,
47                 GameSettings*   game,
48                 int                             lightlayer
49         );
50
51         virtual ~KX_BlenderMaterial();
52
53         // --------------------------------
54         virtual TCachingInfo GetCachingInfo(void) const {
55                 return (void*) this;
56         }
57
58         virtual 
59         bool Activate(
60                 RAS_IRasterizer* rasty, 
61                 TCachingInfo& cachingInfo
62         ) const;
63         
64         virtual 
65         void ActivateMeshSlot(
66                 const RAS_MeshSlot & ms, 
67                 RAS_IRasterizer* rasty 
68         ) const;
69         
70         void ActivateMat(
71                 RAS_IRasterizer* rasty,
72                 TCachingInfo& cachingInfo
73         )const;
74
75         void ActivatShaders(
76                 RAS_IRasterizer* rasty, 
77                 TCachingInfo& cachingInfo
78         )const;
79
80         void ActivateBlenderShaders(
81                 RAS_IRasterizer* rasty, 
82                 TCachingInfo& cachingInfo
83         )const;
84
85         Material* GetBlenderMaterial() const;
86         Image* GetBlenderImage() const;
87         MTexPoly *GetMTexPoly() const;
88         unsigned int* GetMCol() const;
89         BL_Texture * getTex (unsigned int idx) { 
90                 return (idx < MAXTEX) ? mTextures + idx : NULL; 
91         }
92         Image * getImage (unsigned int idx) { 
93                 return (idx < MAXTEX && mMaterial) ? mMaterial->img[idx] : NULL; 
94         }
95         unsigned int* getBlendFunc() {
96                 return mBlendFunc;
97         }
98         // for ipos
99         void UpdateIPO(
100                 MT_Vector4 rgba, MT_Vector3 specrgb,
101                 MT_Scalar hard, MT_Scalar spec,
102                 MT_Scalar ref, MT_Scalar emit, MT_Scalar alpha
103         );
104         
105         virtual void Replace_IScene(SCA_IScene *val);
106
107         BL_Material *GetBLMaterial();
108
109 #ifdef WITH_PYTHON
110         // --------------------------------
111         virtual PyObject *py_repr(void) { return PyUnicode_From_STR_String(mMaterial->matname); }
112
113         static PyObject *pyattr_get_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
114         static PyObject *pyattr_get_materialIndex(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
115         static PyObject *pyattr_get_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
116         static int       pyattr_set_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
117         static PyObject *pyattr_get_alpha(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
118         static int       pyattr_set_alpha(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
119         static PyObject *pyattr_get_hardness(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
120         static int       pyattr_set_hardness(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
121         static PyObject *pyattr_get_specular_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
122         static int       pyattr_set_specular_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
123         static PyObject *pyattr_get_specular_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
124         static int       pyattr_set_specular_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
125         static PyObject *pyattr_get_diffuse_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
126         static int       pyattr_set_diffuse_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
127         static PyObject *pyattr_get_diffuse_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
128         static int       pyattr_set_diffuse_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
129         static PyObject *pyattr_get_emit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
130         static int       pyattr_set_emit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
131
132         KX_PYMETHOD_DOC(KX_BlenderMaterial, getShader);
133         KX_PYMETHOD_DOC(KX_BlenderMaterial, getMaterialIndex);
134         KX_PYMETHOD_DOC(KX_BlenderMaterial, getTexture);
135         KX_PYMETHOD_DOC(KX_BlenderMaterial, setTexture);
136
137         KX_PYMETHOD_DOC(KX_BlenderMaterial, setBlending);
138 #endif  /* WITH_PYTHON */
139
140         // --------------------------------
141         // pre calculate to avoid pops/lag at startup
142         virtual void OnConstruction();
143
144         static void     EndFrame();
145
146 private:
147         BL_Material*            mMaterial;
148         BL_Shader*                      mShader;
149         BL_BlenderShader*       mBlenderShader;
150         KX_Scene*               mScene;
151         BL_Texture              mTextures[MAXTEX];              // texture array
152         bool                    mUserDefBlend;
153         unsigned int    mBlendFunc[2];
154         bool                    mModified;
155         bool                    mConstructed;                   // if false, don't clean on exit
156         int                             mLightLayer;
157
158         struct {
159                 float r, g, b, a;
160                 float specr, specg, specb;
161                 float spec;
162                 float ref;
163                 float hardness;
164                 float emit;
165         } mSavedData;
166
167         void InitTextures();
168
169         void SetBlenderGLSLShader();
170
171         void ActivatGLMaterials( RAS_IRasterizer* rasty )const;
172         void ActivateTexGen( RAS_IRasterizer *ras ) const;
173
174         bool UsesLighting(RAS_IRasterizer *rasty) const;
175         void GetMaterialRGBAColor(unsigned char *rgba) const;
176         Scene* GetBlenderScene() const;
177         void ReleaseMaterial();
178
179         // message centers
180         void    setTexData( bool enable,RAS_IRasterizer *ras);
181         void    setBlenderShaderData( bool enable, RAS_IRasterizer *ras);
182         void    setShaderData( bool enable, RAS_IRasterizer *ras);
183
184         void    setObjectMatrixData(int i, RAS_IRasterizer *ras);
185         void    setTexMatrixData(int i);
186
187         void    setLightData();
188
189         // cleanup stuff
190         void    OnExit();
191
192         // shader chacing
193         static BL_BlenderShader *mLastBlenderShader;
194         static BL_Shader                *mLastShader;
195
196         mutable int     mPass;
197 };
198
199
200 #endif