diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2010-03-25 01:55:45 +0300 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2010-03-25 01:55:45 +0300 |
commit | f1cfb5f13c76e28a5f56fe9dd03001be0c25c530 (patch) | |
tree | 3c8a677d0909ba3cd4b78b174cbde9ce4cb43653 /source/gameengine/Rasterizer | |
parent | d337448090caafc68b55d6716ec6b13d89ad7cf6 (diff) |
BGE: bug #21684 fixed: multiple material with static modifier now supported with display list.
Diffstat (limited to 'source/gameengine/Rasterizer')
-rw-r--r-- | source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp | 52 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h | 4 |
2 files changed, 47 insertions, 9 deletions
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp index 014169f8838..6f99d54e8cc 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp @@ -25,7 +25,8 @@ RAS_ListSlot::RAS_ListSlot(RAS_ListRasterizer* rasty) : KX_ListSlot(), m_list(0), m_flag(LIST_MODIFY|LIST_CREATE), - m_rasty(rasty) + m_rasty(rasty), + m_matnr(0) { } @@ -121,11 +122,23 @@ void RAS_ListRasterizer::RemoveListSlot(RAS_ListSlot* list) 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 @@ RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms) 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 @@ void RAS_ListRasterizer::ReleaseAlloc() 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(); } diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h index cff48081f02..d3c14b4758c 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h @@ -12,6 +12,7 @@ class RAS_ListSlot : public KX_ListSlot 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 @@ enum RAS_ListSlotFlags { 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 { |