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/Converter/BL_SkinDeformer.cpp | |
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/Converter/BL_SkinDeformer.cpp')
-rw-r--r-- | source/gameengine/Converter/BL_SkinDeformer.cpp | 73 |
1 files changed, 40 insertions, 33 deletions
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; } |