[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