Blender  V2.59
KX_BlenderMaterial.h
Go to the documentation of this file.
00001 
00006 #ifndef __KX_BLENDER_MATERIAL_H__
00007 #define __KX_BLENDER_MATERIAL_H__
00008 
00009 #include <vector>
00010 
00011 
00012 #include "RAS_IPolygonMaterial.h"
00013 #include "BL_Material.h"
00014 #include "BL_Texture.h"
00015 #include "BL_Shader.h"
00016 #include "BL_BlenderShader.h"
00017 
00018 #include "PyObjectPlus.h"
00019 
00020 #include "MT_Vector3.h"
00021 #include "MT_Vector4.h"
00022 
00023 #ifdef WITH_CXX_GUARDEDALLOC
00024 #include "MEM_guardedalloc.h"
00025 #endif
00026 
00027 #include "SCA_IScene.h" /* only for Replace_IScene */
00028 #include "KX_Scene.h"
00029 
00030 struct MTFace;
00031 class KX_Scene;
00032 
00033 class KX_BlenderMaterial :  public PyObjectPlus, public RAS_IPolyMaterial
00034 {
00035         Py_Header;
00036 public:
00037         // --------------------------------
00038         KX_BlenderMaterial();
00039         void Initialize(
00040                 class KX_Scene* scene,
00041                 BL_Material*    mat
00042         );
00043 
00044         virtual ~KX_BlenderMaterial();
00045 
00046         // --------------------------------
00047         virtual TCachingInfo GetCachingInfo(void) const {
00048                 return (void*) this;
00049         }
00050 
00051         virtual 
00052         bool Activate(
00053                 RAS_IRasterizer* rasty, 
00054                 TCachingInfo& cachingInfo
00055         ) const;
00056         
00057         virtual 
00058         void ActivateMeshSlot(
00059                 const RAS_MeshSlot & ms, 
00060                 RAS_IRasterizer* rasty 
00061         ) const;
00062         
00063         void ActivateMat(
00064                 RAS_IRasterizer* rasty,
00065                 TCachingInfo& cachingInfo
00066         )const;
00067 
00068         void ActivatShaders(
00069                 RAS_IRasterizer* rasty, 
00070                 TCachingInfo& cachingInfo
00071         )const;
00072 
00073         void ActivateBlenderShaders(
00074                 RAS_IRasterizer* rasty, 
00075                 TCachingInfo& cachingInfo
00076         )const;
00077 
00078         Material* GetBlenderMaterial() const;
00079         MTFace* GetMTFace(void) const;
00080         unsigned int* GetMCol(void) const;
00081         BL_Texture * getTex (unsigned int idx) { 
00082                 return (idx < MAXTEX) ? mTextures + idx : NULL; 
00083         }
00084         Image * getImage (unsigned int idx) { 
00085                 return (idx < MAXTEX && mMaterial) ? mMaterial->img[idx] : NULL; 
00086         }
00087         unsigned int* getBlendFunc() {
00088                 return mBlendFunc;
00089         }
00090         // for ipos
00091         void UpdateIPO(
00092                 MT_Vector4 rgba, MT_Vector3 specrgb,
00093                 MT_Scalar hard, MT_Scalar spec,
00094                 MT_Scalar ref, MT_Scalar emit, MT_Scalar alpha
00095         );
00096         
00097         virtual void Replace_IScene(SCA_IScene *val)
00098         {
00099                 mScene= static_cast<KX_Scene *>(val);
00100                 if (mBlenderShader)
00101                 {
00102                         mBlenderShader->SetScene(mScene);
00103                 }
00104         };
00105 
00106 #ifdef WITH_PYTHON
00107         // --------------------------------
00108         virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
00109 
00110         static PyObject* pyattr_get_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
00111         static PyObject* pyattr_get_materialIndex(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
00112         static PyObject* pyattr_get_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
00113         static int       pyattr_set_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
00114 
00115         KX_PYMETHOD_DOC( KX_BlenderMaterial, getShader );
00116         KX_PYMETHOD_DOC( KX_BlenderMaterial, getMaterialIndex );
00117         KX_PYMETHOD_DOC( KX_BlenderMaterial, getTexture );
00118         KX_PYMETHOD_DOC( KX_BlenderMaterial, setTexture );
00119 
00120         KX_PYMETHOD_DOC( KX_BlenderMaterial, setBlending );
00121 #endif // WITH_PYTHON
00122 
00123         // --------------------------------
00124         // pre calculate to avoid pops/lag at startup
00125         virtual void OnConstruction(int layer);
00126 
00127         static void     EndFrame();
00128 
00129 private:
00130         BL_Material*            mMaterial;
00131         BL_Shader*                      mShader;
00132         BL_BlenderShader*       mBlenderShader;
00133         KX_Scene*               mScene;
00134         BL_Texture              mTextures[MAXTEX];              // texture array
00135         bool                    mUserDefBlend;
00136         unsigned int    mBlendFunc[2];
00137         bool                    mModified;
00138         bool                    mConstructed;                   // if false, don't clean on exit
00139 
00140         void SetBlenderGLSLShader(int layer);
00141 
00142         void ActivatGLMaterials( RAS_IRasterizer* rasty )const;
00143         void ActivateTexGen( RAS_IRasterizer *ras ) const;
00144 
00145         bool UsesLighting(RAS_IRasterizer *rasty) const;
00146         void GetMaterialRGBAColor(unsigned char *rgba) const;
00147         Scene* GetBlenderScene() const;
00148         void ReleaseMaterial();
00149 
00150         // message centers
00151         void    setTexData( bool enable,RAS_IRasterizer *ras);
00152         void    setBlenderShaderData( bool enable, RAS_IRasterizer *ras);
00153         void    setShaderData( bool enable, RAS_IRasterizer *ras);
00154 
00155         void    setObjectMatrixData(int i, RAS_IRasterizer *ras);
00156         void    setTexMatrixData(int i);
00157 
00158         void    setLightData();
00159 
00160         // cleanup stuff
00161         void    OnExit();
00162 
00163         // shader chacing
00164         static BL_BlenderShader *mLastBlenderShader;
00165         static BL_Shader                *mLastShader;
00166 
00167         mutable int     mPass;
00168 };
00169 
00170 
00171 #endif