[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