diff options
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Converter/BL_ShapeDeformer.cpp | 12 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MeshObject.cpp | 57 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_MeshObject.h | 3 |
3 files changed, 8 insertions, 64 deletions
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp index 59cf10d326a..5aec3c9e965 100644 --- a/source/gameengine/Converter/BL_ShapeDeformer.cpp +++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp @@ -159,16 +159,20 @@ bool BL_ShapeDeformer::Update(void) /* the key coefficient have been set already, we just need to blend the keys */ Object* blendobj = m_gameobj->GetBlendObject(); - // make sure the vertex weight cache is in line with this object - m_pMeshObject->CheckWeightCache(blendobj); - /* we will blend the key directly in m_transverts array: it is used by armature as the start position */ /* m_key can be NULL in case of Modifier deformer */ if (m_key) { + WeightsArrayCache cache = {0, NULL}; + float **per_keyblock_weights; + /* store verts locally */ VerifyStorage(); - BKE_key_evaluate_relative(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_key, NULL, 0); /* last arg is ignored */ + per_keyblock_weights = BKE_keyblock_get_per_block_weights(blendobj, m_key, &cache); + BKE_key_evaluate_relative(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, + m_key, NULL, per_keyblock_weights, 0); /* last arg is ignored */ + BKE_keyblock_free_per_block_weights(m_key, per_keyblock_weights, &cache); + m_bDynamic = true; } diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp index 2af71c5efa9..92f134c1702 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp +++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp @@ -125,17 +125,6 @@ RAS_MeshObject::~RAS_MeshObject() { vector<RAS_Polygon*>::iterator it; - if (m_mesh && m_mesh->key) - { - KeyBlock *kb; - // remove the weight cache to avoid memory leak - for (kb = (KeyBlock *)m_mesh->key->block.first; kb; kb = (KeyBlock *)kb->next) { - if (kb->weights) - MEM_freeN(kb->weights); - kb->weights= NULL; - } - } - for (it=m_Polygons.begin(); it!=m_Polygons.end(); it++) delete (*it); @@ -571,49 +560,3 @@ static int get_def_index(Object* ob, const char* vgroup) return -1; } - -void RAS_MeshObject::CheckWeightCache(Object* obj) -{ - KeyBlock *kb; - int kbindex, defindex; - MDeformVert *dv= NULL; - int totvert, i; - float *weights; - - if (!m_mesh->key) - return; - - for (kbindex = 0, kb = (KeyBlock *)m_mesh->key->block.first; kb; kb = kb->next, kbindex++) - { - // first check the cases where the weight must be cleared - if (kb->vgroup[0] == 0 || - m_mesh->dvert == NULL || - (defindex = get_def_index(obj, kb->vgroup)) == -1) { - if (kb->weights) { - MEM_freeN(kb->weights); - kb->weights = NULL; - } - m_cacheWeightIndex[kbindex] = -1; - } else if (m_cacheWeightIndex[kbindex] != defindex) { - // a weight array is required but the cache is not matching - if (kb->weights) { - MEM_freeN(kb->weights); - kb->weights = NULL; - } - - dv= m_mesh->dvert; - totvert= m_mesh->totvert; - - weights= (float*)MEM_mallocN(totvert*sizeof(float), "weights"); - - for (i=0; i < totvert; i++, dv++) { - weights[i] = defvert_find_weight(dv, defindex); - } - - kb->weights = weights; - m_cacheWeightIndex[kbindex] = defindex; - } - } -} - - diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h index d77d0483024..e5ae78d006e 100644 --- a/source/gameengine/Rasterizer/RAS_MeshObject.h +++ b/source/gameengine/Rasterizer/RAS_MeshObject.h @@ -83,9 +83,6 @@ public: virtual ~RAS_MeshObject(); - // for shape keys, - void CheckWeightCache(struct Object* obj); - /* materials */ int NumMaterials(); const STR_String& GetMaterialName(unsigned int matid); |