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