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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to