|
Blender
V2.59
|
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