Commit: 087bbe624f6e0de50c409866faa8fce4585808c0 Author: Mitchell Stokes Date: Fri May 9 16:03:54 2014 -0700 https://developer.blender.org/rB087bbe624f6e0de50c409866faa8fce4585808c0
BGE: Fixing shape key animations on meshes with no armature. Their transverts were not being updated after code changes for multi-threaded skinning. =================================================================== M source/gameengine/Converter/BL_ShapeDeformer.cpp M source/gameengine/Converter/BL_SkinDeformer.cpp M source/gameengine/Converter/BL_SkinDeformer.h M source/gameengine/Ketsji/KX_Scene.cpp =================================================================== diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp index 8bb9f85..b9b2732 100644 --- a/source/gameengine/Converter/BL_ShapeDeformer.cpp +++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp @@ -222,6 +222,9 @@ bool BL_ShapeDeformer::Update(void) if (m_recalcNormal) RecalcNormals(); #endif + + // We also need to handle transverts now (used to be in BL_SkinDeformer::Apply()) + UpdateTransverts(); bSkinUpdate = true; } diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp index 8e1f512..e7137a5 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.cpp +++ b/source/gameengine/Converter/BL_SkinDeformer.cpp @@ -287,6 +287,43 @@ void BL_SkinDeformer::BGEDeformVerts() m_copyNormals = true; } +void BL_SkinDeformer::UpdateTransverts() +{ + RAS_MeshSlot::iterator it; + RAS_MeshMaterial *mmat; + RAS_MeshSlot *slot; + size_t i, nmat, imat; + + if (m_transverts) { + // the vertex cache is unique to this deformer, no need to update it + // if it wasn't updated! We must update all the materials at once + // because we will not get here again for the other material + nmat = m_pMeshObject->NumMaterials(); + for (imat=0; imat<nmat; imat++) { + mmat = m_pMeshObject->GetMeshMaterial(imat); + if (!mmat->m_slots[(void*)m_gameobj]) + continue; + + slot = *mmat->m_slots[(void*)m_gameobj]; + + // for each array + for (slot->begin(it); !slot->end(it); slot->next(it)) { + // for each vertex + // copy the untransformed data from the original mvert + for (i=it.startvertex; i<it.endvertex; i++) { + RAS_TexVert& v = it.vertex[i]; + v.SetXYZ(m_transverts[v.getOrigIndex()]); + if (m_copyNormals) + v.SetNormal(m_transnors[v.getOrigIndex()]); + } + } + } + + if (m_copyNormals) + m_copyNormals = false; + } +} + bool BL_SkinDeformer::UpdateInternal(bool shape_applied) { /* See if the armature has been updated for this frame */ @@ -317,40 +354,10 @@ bool BL_SkinDeformer::UpdateInternal(bool shape_applied) m_armobj->RestorePose(); /* dynamic vertex, cannot use display list */ m_bDynamic = true; - /* indicate that the m_transverts and normals are up to date */ - RAS_MeshSlot::iterator it; - RAS_MeshMaterial *mmat; - RAS_MeshSlot *slot; - size_t i, nmat, imat; - - if (m_transverts) { - // the vertex cache is unique to this deformer, no need to update it - // if it wasn't updated! We must update all the materials at once - // because we will not get here again for the other material - nmat = m_pMeshObject->NumMaterials(); - for (imat=0; imat<nmat; imat++) { - mmat = m_pMeshObject->GetMeshMaterial(imat); - if (!mmat->m_slots[(void*)m_gameobj]) - continue; - - slot = *mmat->m_slots[(void*)m_gameobj]; - - // for each array - for (slot->begin(it); !slot->end(it); slot->next(it)) { - // for each vertex - // copy the untransformed data from the original mvert - for (i=it.startvertex; i<it.endvertex; i++) { - RAS_TexVert& v = it.vertex[i]; - v.SetXYZ(m_transverts[v.getOrigIndex()]); - if (m_copyNormals) - v.SetNormal(m_transnors[v.getOrigIndex()]); - } - } - } - if (m_copyNormals) - m_copyNormals = false; - } + UpdateTransverts(); + + /* indicate that the m_transverts and normals are up to date */ return true; } diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h index 7495deb..79043f6 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.h +++ b/source/gameengine/Converter/BL_SkinDeformer.h @@ -114,6 +114,8 @@ protected: void BlenderDeformVerts(); void BGEDeformVerts(); + void UpdateTransverts(); + #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("GE:BL_SkinDeformer") diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 4c9fba8..c826f39 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1636,6 +1636,9 @@ static void update_anim_thread_func(TaskPool *pool, void *taskdata, int UNUSED(t gameobj->UpdateActionManager(curtime); children = gameobj->GetChildren(); + if (gameobj->GetDeformer()) + gameobj->GetDeformer()->Update(); + for (int j=0; j<children->GetCount(); ++j) { child = (KX_GameObject*)children->GetValue(j); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs