Revision: 27732
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27732
Author:   ben2610
Date:     2010-03-24 23:55:45 +0100 (Wed, 24 Mar 2010)

Log Message:
-----------
BGE: bug #21684 fixed: multiple material with static modifier now supported 
with display list.

Modified Paths:
--------------
    
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h

Modified: 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
===================================================================
--- 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
      2010-03-24 19:14:10 UTC (rev 27731)
+++ 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
      2010-03-24 22:55:45 UTC (rev 27732)
@@ -25,7 +25,8 @@
 :      KX_ListSlot(),
        m_list(0),
        m_flag(LIST_MODIFY|LIST_CREATE),
-       m_rasty(rasty)
+       m_rasty(rasty),
+       m_matnr(0)
 {
 }
 
@@ -121,11 +122,23 @@
        if (list->m_flag & LIST_DERIVEDMESH) {
                RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();
                while(it != mDerivedMeshLists.end()) {
-                       if (it->second == list) {
-                               mDerivedMeshLists.erase(it);
+                       RAS_ListSlots *slots = it->second;
+                       if (slots->size() > list->m_matnr && 
slots->at(list->m_matnr) == list) {
+                               (*slots)[list->m_matnr] = NULL;
+                               // check if all slots are NULL and if yes, 
delete the entry
+                               int i;
+                               for (i=slots->size(); i-- > 0; ) {
+                                       if (slots->at(i) != NULL)
+                                               break;
+                               }
+                               if (i < 0) {
+                                       slots->clear();
+                                       delete slots;
+                                       mDerivedMeshLists.erase(it);
+                               }
                                break;
                        }
-                       it++;
+                       ++it;
                }
        } else {
                RAS_ArrayLists::iterator it = mArrayLists.begin();
@@ -152,13 +165,28 @@
                if (ms.m_pDerivedMesh) {
                        // that means that we draw based on derived mesh, a 
display list is possible
                        // Note that we come here only for static derived mesh
+                       int matnr = 
ms.m_bucket->GetPolyMaterial()->GetMaterialIndex();
+                       RAS_ListSlots *listVector;
                        RAS_DerivedMeshLists::iterator it = 
mDerivedMeshLists.find(ms.m_pDerivedMesh);
                        if(it == mDerivedMeshLists.end()) {
+                               listVector = new RAS_ListSlots(matnr+4, NULL);
                                localSlot = new RAS_ListSlot(this);
                                localSlot->m_flag |= LIST_DERIVEDMESH;
-                               
mDerivedMeshLists.insert(std::pair<DerivedMesh*, 
RAS_ListSlot*>(ms.m_pDerivedMesh, localSlot));
+                               localSlot->m_matnr = matnr;
+                               (*listVector)[matnr] = localSlot;
+                               
mDerivedMeshLists.insert(std::pair<DerivedMesh*, 
RAS_ListSlots*>(ms.m_pDerivedMesh, listVector));
                        } else {
-                               localSlot = 
static_cast<RAS_ListSlot*>(it->second->AddRef());
+                               listVector = it->second;
+                               if (listVector->size() <= matnr)
+                                       listVector->resize(matnr+4, NULL);
+                               if ((localSlot = listVector->at(matnr)) == 
NULL) {
+                                       localSlot = new RAS_ListSlot(this);
+                                       localSlot->m_flag |= LIST_DERIVEDMESH;
+                                       localSlot->m_matnr = matnr;
+                                       (*listVector)[matnr] = localSlot;
+                               } else {
+                                       localSlot->AddRef();
+                               }
                        }
                } else {
                        RAS_ArrayLists::iterator it = 
mArrayLists.find(ms.m_displayArrays);
@@ -179,8 +207,16 @@
        for(RAS_ArrayLists::iterator it = mArrayLists.begin();it != 
mArrayLists.end();++it)
                delete it->second;
        mArrayLists.clear();
-       for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it 
!= mDerivedMeshLists.end();++it)
-               delete it->second;
+       for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it 
!= mDerivedMeshLists.end();++it) {
+               RAS_ListSlots* slots = it->second;
+               for (int i=slots->size(); i-- > 0; ) {
+                       RAS_ListSlot* slot = slots->at(i);
+                       if (slot)
+                               delete slot;
+               }
+               slots->clear();
+               delete slots;
+       }
        mDerivedMeshLists.clear();
 }
 

Modified: 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
===================================================================
--- 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
        2010-03-24 19:14:10 UTC (rev 27731)
+++ 
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
        2010-03-24 22:55:45 UTC (rev 27732)
@@ -12,6 +12,7 @@
        friend class RAS_ListRasterizer;
        unsigned int m_list;
        unsigned int m_flag;
+       unsigned int m_matnr;
        RAS_ListRasterizer* m_rasty;
 public:
        RAS_ListSlot(RAS_ListRasterizer* rasty);
@@ -40,7 +41,8 @@
 struct DerivedMesh;
 
 typedef std::map<RAS_DisplayArrayList, RAS_ListSlot*> RAS_ArrayLists;
-typedef std::map<DerivedMesh*, RAS_ListSlot*>            RAS_DerivedMeshLists;
+typedef std::vector<RAS_ListSlot*>                                       
RAS_ListSlots;        // indexed by material slot number
+typedef std::map<DerivedMesh*, RAS_ListSlots*>           RAS_DerivedMeshLists;
 
 class RAS_ListRasterizer : public RAS_VAOpenGLRasterizer
 {


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

Reply via email to