Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp')
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp68
1 files changed, 47 insertions, 21 deletions
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
index 65aadd63a40..014169f8838 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
@@ -104,9 +104,11 @@ bool RAS_ListSlot::End()
RAS_ListRasterizer::RAS_ListRasterizer(RAS_ICanvas* canvas, bool useVertexArrays, bool lock)
: RAS_VAOpenGLRasterizer(canvas, lock),
- mUseVertexArrays(useVertexArrays)
+ mUseVertexArrays(useVertexArrays),
+ mATI(false)
{
- // --
+ if (!strcmp((const char*)glGetString(GL_VENDOR), "ATI Technologies Inc."))
+ mATI = true;
}
RAS_ListRasterizer::~RAS_ListRasterizer()
@@ -116,13 +118,24 @@ RAS_ListRasterizer::~RAS_ListRasterizer()
void RAS_ListRasterizer::RemoveListSlot(RAS_ListSlot* list)
{
- RAS_Lists::iterator it = mLists.begin();
- while(it != mLists.end()) {
- if (it->second == list) {
- mLists.erase(it);
- break;
+ if (list->m_flag & LIST_DERIVEDMESH) {
+ RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();
+ while(it != mDerivedMeshLists.end()) {
+ if (it->second == list) {
+ mDerivedMeshLists.erase(it);
+ break;
+ }
+ it++;
+ }
+ } else {
+ RAS_ArrayLists::iterator it = mArrayLists.begin();
+ while(it != mArrayLists.end()) {
+ if (it->second == list) {
+ mArrayLists.erase(it);
+ break;
+ }
+ it++;
}
- it++;
}
}
@@ -136,12 +149,25 @@ RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms)
*/
RAS_ListSlot* localSlot = (RAS_ListSlot*)ms.m_DisplayList;
if(!localSlot) {
- RAS_Lists::iterator it = mLists.find(ms.m_displayArrays);
- if(it == mLists.end()) {
- localSlot = new RAS_ListSlot(this);
- mLists.insert(std::pair<RAS_DisplayArrayList, RAS_ListSlot*>(ms.m_displayArrays, localSlot));
+ 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
+ RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.find(ms.m_pDerivedMesh);
+ if(it == mDerivedMeshLists.end()) {
+ localSlot = new RAS_ListSlot(this);
+ localSlot->m_flag |= LIST_DERIVEDMESH;
+ mDerivedMeshLists.insert(std::pair<DerivedMesh*, RAS_ListSlot*>(ms.m_pDerivedMesh, localSlot));
+ } else {
+ localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef());
+ }
} else {
- localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef());
+ RAS_ArrayLists::iterator it = mArrayLists.find(ms.m_displayArrays);
+ if(it == mArrayLists.end()) {
+ localSlot = new RAS_ListSlot(this);
+ mArrayLists.insert(std::pair<RAS_DisplayArrayList, RAS_ListSlot*>(ms.m_displayArrays, localSlot));
+ } else {
+ localSlot = static_cast<RAS_ListSlot*>(it->second->AddRef());
+ }
}
}
MT_assert(localSlot);
@@ -150,12 +176,12 @@ RAS_ListSlot* RAS_ListRasterizer::FindOrAdd(RAS_MeshSlot& ms)
void RAS_ListRasterizer::ReleaseAlloc()
{
- RAS_Lists::iterator it = mLists.begin();
- while(it != mLists.end()) {
+ for(RAS_ArrayLists::iterator it = mArrayLists.begin();it != mArrayLists.end();++it)
delete it->second;
- it++;
- }
- mLists.clear();
+ mArrayLists.clear();
+ for (RAS_DerivedMeshLists::iterator it = mDerivedMeshLists.begin();it != mDerivedMeshLists.end();++it)
+ delete it->second;
+ mDerivedMeshLists.clear();
}
void RAS_ListRasterizer::IndexPrimitives(RAS_MeshSlot& ms)
@@ -172,8 +198,8 @@ void RAS_ListRasterizer::IndexPrimitives(RAS_MeshSlot& ms)
return;
}
}
-
- if (mUseVertexArrays)
+ // derived mesh cannot use vertex array
+ if (mUseVertexArrays && !ms.m_pDerivedMesh)
RAS_VAOpenGLRasterizer::IndexPrimitives(ms);
else
RAS_OpenGLRasterizer::IndexPrimitives(ms);
@@ -204,7 +230,7 @@ void RAS_ListRasterizer::IndexPrimitivesMulti(RAS_MeshSlot& ms)
// workaround: note how we do not use vertex arrays for making display
// lists, since glVertexAttribPointerARB doesn't seem to work correct
// in display lists on ATI? either a bug in the driver or in Blender ..
- if (mUseVertexArrays && !localSlot)
+ if (mUseVertexArrays && !mATI && !ms.m_pDerivedMesh)
RAS_VAOpenGLRasterizer::IndexPrimitivesMulti(ms);
else
RAS_OpenGLRasterizer::IndexPrimitivesMulti(ms);