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