[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19970] trunk/blender/source/gameengine: BGE: speed up mesh conversion by avoiding allocation/ deallocation of material object on each face.

Benoit Bolsee benoit.bolsee at online.be
Wed Apr 29 12:06:41 CEST 2009


Revision: 19970
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19970
Author:   ben2610
Date:     2009-04-29 12:06:38 +0200 (Wed, 29 Apr 2009)

Log Message:
-----------
BGE: speed up mesh conversion by avoiding allocation/deallocation of material object on each face. The speed up is minor on optimized builds but considerable on less optimized builds, good for debugging large scene.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Material.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Material.h
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-04-29 10:06:38 UTC (rev 19970)
@@ -318,7 +318,8 @@
 }MTF_localLayer;
 
 // ------------------------------------
-BL_Material* ConvertMaterial(
+bool ConvertMaterial(
+	BL_Material *material,
 	Material *mat, 
 	MTFace* tface,  
 	const char *tfaceName,
@@ -329,9 +330,7 @@
 	MTF_localLayer *layers,
 	bool glslmat)
 {
-	//this needs some type of manager
-	BL_Material *material = new BL_Material();
-
+	material->Initialize();
 	int numchan =	-1, texalpha = 0;
 	bool validmat	= (mat!=0);
 	bool validface	= (tface!=0);
@@ -720,7 +719,7 @@
 
 	material->tface		= tface;
 	material->material	= mat;
-	return material;
+	return true;
 }
 
 
@@ -781,6 +780,13 @@
 
 	meshobj->SetName(mesh->id.name);
 	meshobj->m_sharedvertex_map.resize(totvert);
+	RAS_IPolyMaterial* polymat = NULL;
+	STR_String imastr;
+	// These pointers will hold persistent material structure during the conversion
+	// to avoid countless allocation/deallocation of memory.
+	BL_Material* bl_mat = NULL;
+	KX_BlenderMaterial* kx_blmat = NULL;
+	KX_PolygonMaterial* kx_polymat = NULL;
 
 	for (int f=0;f<totface;f++,mface++)
 	{
@@ -843,8 +849,6 @@
 		{
 			bool visible = true;
 			bool twoside = false;
-			RAS_IPolyMaterial* polymat = NULL;
-			BL_Material *bl_mat = NULL;
 
 			if(converter->GetMaterials()) {
 				/* do Blender Multitexture and Blender GLSL materials */
@@ -852,7 +856,9 @@
 				MT_Point2 uv[4];
 
 				/* first is the BL_Material */
-				bl_mat = ConvertMaterial(ma, tface, tfaceName, mface, mcol,
+				if (!bl_mat)
+					bl_mat = new BL_Material();
+				ConvertMaterial(bl_mat, ma, tface, tfaceName, mface, mcol,
 					lightlayer, blenderobj, layers, converter->GetGLSLMaterials());
 
 				visible = ((bl_mat->ras_mode & POLY_VIS)!=0);
@@ -873,13 +879,16 @@
 				uv22 = uv[2]; uv23 = uv[3];
 				
 				/* then the KX_BlenderMaterial */
-				polymat = new KX_BlenderMaterial(scene, bl_mat, skinMesh, lightlayer);
+				if (kx_blmat == NULL)
+					kx_blmat = new KX_BlenderMaterial();
 
+				kx_blmat->Initialize(scene, bl_mat, skinMesh, lightlayer);
+				polymat = static_cast<RAS_IPolyMaterial*>(kx_blmat);
 			}
 			else {
 				/* do Texture Face materials */
 				Image* bima = (tface)? (Image*)tface->tpage: NULL;
-				STR_String imastr =  (tface)? (bima? (bima)->id.name : "" ) : "";
+				imastr =  (tface)? (bima? (bima)->id.name : "" ) : "";
 		
 				char transp=0;
 				short mode=0, tile=0;
@@ -957,9 +966,12 @@
 				bool alpha = (transp == TF_ALPHA || transp == TF_ADD);
 				bool zsort = (mode & TF_ALPHASORT)? alpha: 0;
 
-				polymat = new KX_PolygonMaterial(imastr, ma, (int)mface->mat_nr,
+				if (kx_polymat == NULL)
+					kx_polymat = new KX_PolygonMaterial();
+				kx_polymat->Initialize(imastr, ma, (int)mface->mat_nr,
 					tile, tilexrep, tileyrep, 
 					mode, transp, alpha, zsort, lightlayer, tface, (unsigned int*)mcol);
+				polymat = static_cast<RAS_IPolyMaterial*>(kx_polymat);
 	
 				if (ma) {
 					polymat->m_specular = MT_Vector3(ma->specr, ma->specg, ma->specb)*ma->spec;
@@ -984,15 +996,17 @@
 				converter->RegisterPolyMaterial(polymat);
 				if(converter->GetMaterials()) {
 					converter->RegisterBlenderMaterial(bl_mat);
+					// the poly material has been stored in the bucket, next time we must create a new one
+					bl_mat = NULL;
+					kx_blmat = NULL;
+				} else {
+					// the poly material has been stored in the bucket, next time we must create a new one
+					kx_polymat = NULL;
 				}
 			} else {
-				// delete the material objects since they are no longer needed
 				// from now on, use the polygon material from the material bucket
-				delete polymat;
-				if(converter->GetMaterials()) {
-					delete bl_mat;
-				}
 				polymat = bucket->GetPolyMaterial();
+				// keep the material pointers, they will be reused for next face
 			}
 						 
 			int nverts = (mface->v4)? 4: 3;
@@ -1036,7 +1050,13 @@
 		delete []layers;
 	
 	dm->release(dm);
-
+	// cleanup material
+	if (bl_mat)
+		delete bl_mat;
+	if (kx_blmat)
+		delete kx_blmat;
+	if (kx_polymat)
+		delete kx_polymat;
 	return meshobj;
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/BL_Material.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Material.cpp	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/BL_Material.cpp	2009-04-29 10:06:38 UTC (rev 19970)
@@ -28,6 +28,11 @@
 
 BL_Material::BL_Material()
 {
+	Initialize();
+}
+
+void BL_Material::Initialize()
+{
 	rgb[0] = 0;
 	rgb[1] = 0;
 	rgb[2] = 0;

Modified: trunk/blender/source/gameengine/Ketsji/BL_Material.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Material.h	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/BL_Material.h	2009-04-29 10:06:38 UTC (rev 19970)
@@ -44,6 +44,7 @@
 public:
 	// -----------------------------------
 	BL_Material();
+	void Initialize();
 
 	int IdMode;
 	unsigned int ras_mode;

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2009-04-29 10:06:38 UTC (rev 19970)
@@ -43,16 +43,30 @@
 //static PyObject *gTextureDict = 0;
 
 KX_BlenderMaterial::KX_BlenderMaterial(
+	PyTypeObject *T
+	)
+:	PyObjectPlus(T),
+	RAS_IPolyMaterial(),
+	mMaterial(NULL),
+	mShader(0),
+	mBlenderShader(0),
+	mScene(NULL),
+	mUserDefBlend(0),
+	mModified(0),
+	mConstructed(false),
+	mPass(0)
+{
+}
+
+void KX_BlenderMaterial::Initialize(
     KX_Scene *scene,
 	BL_Material *data,
 	bool skin,
-	int lightlayer,
-	PyTypeObject *T
-	)
-:	PyObjectPlus(T),
-	RAS_IPolyMaterial(
-		STR_String( data->texname[0] ),
-		STR_String( data->matname ), // needed for physics!
+	int lightlayer)
+{
+	RAS_IPolyMaterial::Initialize(
+		data->texname[0],
+		data->matname,
 		data->materialindex,
 		data->tile,
 		data->tilexrep[0],
@@ -62,17 +76,15 @@
 		((data->ras_mode &ALPHA)!=0),
 		((data->ras_mode &ZSORT)!=0),
 		lightlayer
-	),
-	mMaterial(data),
-	mShader(0),
-	mBlenderShader(0),
-	mScene(scene),
-	mUserDefBlend(0),
-	mModified(0),
-	mConstructed(false),
-	mPass(0)
-
-{
+	);
+	mMaterial = data;
+	mShader = 0;
+	mBlenderShader = 0;
+	mScene = scene;
+	mUserDefBlend = 0;
+	mModified = 0;
+	mConstructed = false;
+	mPass = 0;
 	// --------------------------------
 	// RAS_IPolyMaterial variables... 
 	m_flag |= RAS_BLENDERMAT;
@@ -96,7 +108,6 @@
 			 );
 	}
 	m_multimode += mMaterial->IdMode+ (mMaterial->ras_mode & ~(COLLIDER|USE_LIGHT));
-
 }
 
 KX_BlenderMaterial::~KX_BlenderMaterial()
@@ -107,7 +118,6 @@
 		OnExit();
 }
 
-
 MTFace* KX_BlenderMaterial::GetMTFace(void) const 
 {
 	// fonts on polys

Modified: trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h	2009-04-29 10:06:38 UTC (rev 19970)
@@ -24,11 +24,13 @@
 public:
 	// --------------------------------
 	KX_BlenderMaterial(
+		PyTypeObject*	T=&Type
+	);
+	void Initialize(
 		class KX_Scene*	scene,
 		BL_Material*	mat,
 		bool			skin,
-		int				lightlayer,
-		PyTypeObject*	T=&Type
+		int				lightlayer
 	);
 
 	virtual ~KX_BlenderMaterial();

Modified: trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp	2009-04-29 10:06:38 UTC (rev 19970)
@@ -51,23 +51,36 @@
 
 #include "KX_PyMath.h"
 
-KX_PolygonMaterial::KX_PolygonMaterial(const STR_String &texname,
-											   Material *material,
-											   int materialindex,
-											   int tile,
-											   int tilexrep,
-											   int tileyrep,
-											   int mode,
-											   int transp,
-											   bool alpha,
-											   bool zsort,
-											   int lightlayer,
-											   struct MTFace* tface,
-											   unsigned int* mcol,
-											   PyTypeObject *T)
+KX_PolygonMaterial::KX_PolygonMaterial(PyTypeObject *T) 
 		: PyObjectPlus(T),
-		  RAS_IPolyMaterial(texname,
-							STR_String(material?material->id.name:""),
+		  RAS_IPolyMaterial(),
+
+	m_tface(NULL),
+	m_mcol(NULL),
+	m_material(NULL),
+	m_pymaterial(NULL),
+	m_pass(0)
+{
+}
+
+void KX_PolygonMaterial::Initialize(
+		const STR_String &texname,
+		Material* ma,
+		int materialindex,
+		int tile,
+		int tilexrep,
+		int tileyrep,
+		int mode,
+		int transp,
+		bool alpha,
+		bool zsort,
+		int lightlayer,
+		struct MTFace* tface,
+		unsigned int* mcol)
+{
+	RAS_IPolyMaterial::Initialize(
+							texname,
+							ma?ma->id.name:"",
 							materialindex,
 							tile,
 							tilexrep,
@@ -76,13 +89,12 @@
 							transp,
 							alpha,
 							zsort,
-							lightlayer),
-		m_tface(tface),
-		m_mcol(mcol),
-		m_material(material),
-		m_pymaterial(0),
-		m_pass(0)
-{
+							lightlayer);
+	m_tface = tface;
+	m_mcol = mcol;
+	m_material = ma;
+	m_pymaterial = 0;
+	m_pass = 0;
 }
 
 KX_PolygonMaterial::~KX_PolygonMaterial()

Modified: trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h	2009-04-29 04:43:17 UTC (rev 19969)
+++ trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h	2009-04-29 10:06:38 UTC (rev 19970)
@@ -57,8 +57,8 @@
 
 	mutable int		m_pass;
 public:
-	
-	KX_PolygonMaterial(const STR_String &texname,
+	KX_PolygonMaterial(PyTypeObject *T = &Type);
+	void Initialize(const STR_String &texname,
 		Material* ma,
 		int materialindex,
 		int tile,
@@ -70,8 +70,8 @@
 		bool zsort,
 		int lightlayer,
 		struct MTFace* tface,
-		unsigned int* mcol,
-		PyTypeObject *T = &Type);
+		unsigned int* mcol);
+
 	virtual ~KX_PolygonMaterial();
 	
 	/**

Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list