[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27732] trunk/blender/source/gameengine/ Rasterizer/RAS_OpenGLRasterizer: BGE: bug #21684 fixed: multiple material with static modifier now supported with display list.

Benoit Bolsee benoit.bolsee at online.be
Wed Mar 24 23:55:45 CET 2010


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
 {





More information about the Bf-blender-cvs mailing list