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