diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2014-05-10 03:03:54 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2014-05-10 03:03:54 +0400 |
commit | 087bbe624f6e0de50c409866faa8fce4585808c0 (patch) | |
tree | dbf39b755b3834db2ebc857f1c23611852ff3a20 /source/gameengine | |
parent | ff08acc556d8e40d501522efcbecac68bb8973c6 (diff) |
BGE: Fixing shape key animations on meshes with no armature.
Their transverts were not being updated after code changes for
multi-threaded skinning.
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Converter/BL_ShapeDeformer.cpp | 3 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_SkinDeformer.cpp | 73 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_SkinDeformer.h | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 3 |
4 files changed, 48 insertions, 33 deletions
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp index 8bb9f850bcf..b9b2732276e 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 8e1f51238d5..e7137a5c379 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 7495deb2257..79043f60db8 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 4c9fba8a10b..c826f39517a 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); |