diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2009-05-12 23:48:18 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2009-05-12 23:48:18 +0400 |
commit | 5a0de728b0a6a4b916f88554322cc56884f17ad8 (patch) | |
tree | 1ddaa69c4035f060a71cd0487fd121763bf2a75d /source | |
parent | 705764fe050fd15703fe2ab410516ff3ccc3f421 (diff) |
BGE performance: allow to create display list on meshes with modifiers but without armature and shape keys. These modified meshes are static and can be put safely in a display list. As the rendering of modifiers is done in direct openGL call, it results is a bit performance boost.
Diffstat (limited to 'source')
6 files changed, 17 insertions, 6 deletions
diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h index d1754618df2..11ca3b00a1d 100644 --- a/source/gameengine/Converter/BL_MeshDeformer.h +++ b/source/gameengine/Converter/BL_MeshDeformer.h @@ -66,7 +66,7 @@ public: virtual bool Update(void){ return false; }; virtual bool UpdateBuckets(void){ return false; }; virtual RAS_Deformer* GetReplica(){return NULL;}; - virtual void ProcessReplica() { }; + virtual void ProcessReplica() {m_bDynamic=false;}; struct Mesh* GetMesh() { return m_bmesh; }; // virtual void InitDeform(double time){}; diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp index bf5eb5cbcb3..e04d4dad015 100644 --- a/source/gameengine/Converter/BL_ShapeDeformer.cpp +++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp @@ -121,7 +121,7 @@ bool BL_ShapeDeformer::ExecuteShapeDrivers(void) ForceUpdate(); m_armobj->RestorePose(); - + m_bDynamic = true; return true; } return false; @@ -144,8 +144,10 @@ bool BL_ShapeDeformer::Update(void) /* we will blend the key directly in mvert array: it is used by armature as the start position */ /* m_bmesh->key can be NULL in case of Modifier deformer */ - if (m_bmesh->key) + if (m_bmesh->key) { do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)m_bmesh->mvert->co, m_bmesh->key, 0); + m_bDynamic = true; + } // Don't release the weight array as in Blender, it will most likely be reusable on next frame // The weight array are ultimately deleted when the skin mesh is destroyed diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp index d40776a645d..e92c3b29543 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.cpp +++ b/source/gameengine/Converter/BL_SkinDeformer.cpp @@ -201,7 +201,8 @@ bool BL_SkinDeformer::Update(void) m_lastArmaUpdate=m_armobj->GetLastFrame(); m_armobj->RestorePose(); - + /* dynamic vertex, cannot use display list */ + m_bDynamic = true; /* indicate that the m_transverts and normals are up to date */ return true; } diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp index 1943c436258..07fdc8ec41b 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp @@ -757,6 +757,7 @@ void KX_ConvertODEEngineObject(KX_GameObject* gameobj, virtual bool Update(void) { //printf("update\n"); + m_bDynamic = true; return true;//?? } virtual bool UpdateBuckets(void) @@ -775,6 +776,7 @@ void KX_ConvertODEEngineObject(KX_GameObject* gameobj, virtual void ProcessReplica() { // we have two pointers to deal with but we cannot do it now, will be done in Relink + m_bDynamic = false; } virtual bool SkipVertexTransform() { diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h index fe081dd4aa5..bb8e3750485 100644 --- a/source/gameengine/Rasterizer/RAS_Deformer.h +++ b/source/gameengine/Rasterizer/RAS_Deformer.h @@ -39,7 +39,7 @@ class RAS_Deformer { public: - RAS_Deformer(){}; + RAS_Deformer() : m_pMesh(0), m_bDynamic(false) {}; virtual ~RAS_Deformer(){}; virtual void Relink(GEN_Map<class GEN_HashedPtr, void*>*map)=0; virtual bool Apply(class RAS_IPolyMaterial *polymat)=0; @@ -55,8 +55,14 @@ public: { return true; } + // true when deformer produces varying vertex (shape or armature) + bool IsDynamic() + { + return m_bDynamic; + } protected: class RAS_MeshObject *m_pMesh; + bool m_bDynamic; }; #endif diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp index db6394c1ec0..841264465cf 100644 --- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp +++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp @@ -597,7 +597,7 @@ void RAS_MaterialBucket::RenderMeshSlot(const MT_Transform& cameratrans, RAS_IRa // then it won't have texture coordinates for actual drawing. also // for zsort we can't make a display list, since the polygon order // changes all the time. - if(ms.m_pDeformer) + if(ms.m_pDeformer && ms.m_pDeformer->IsDynamic()) ms.m_bDisplayList = false; else if(!ms.m_DisplayList && rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW) ms.m_bDisplayList = false; |