MCPcopy Create free account
hub / github.com/OGRECave/ogre-next / updateAnimationTransforms

Method updateAnimationTransforms

OgreMain/src/OgreSceneManager.cpp:1722–1771  ·  view source on GitHub ↗

-----------------------------------------------------------------------

Source from the content-addressed store, hash-verified

1720 }
1721 //-----------------------------------------------------------------------
1722 void SceneManager::updateAnimationTransforms( BySkeletonDef &bySkeletonDef, size_t threadIdx )
1723 {
1724 assert( !bySkeletonDef.skeletons.empty() );
1725
1726#ifndef NDEBUG
1727 BoneTransform _hiddenTransform;
1728#endif
1729
1730 // Unlike regular nodes, bones' number of parents and children is known before hand, thus
1731 // when magicDistance = 25; we update the root bones of the first 25 skeletons, then the children
1732 // of those bones, and so on; then we move to the next 25 skeletons. This behavior slightly
1733 // improves performance since the parent data is still hot in the cache when updating its child.
1734 // The value of 25 is arbitrary.
1735 const size_t magicDistance = 25;
1736
1737 const SkeletonDef *skeletonDef = bySkeletonDef.skeletonDef;
1738 const SkeletonDef::DepthLevelInfoVec &depthLevelInfo = skeletonDef->getDepthLevelInfo();
1739
1740 size_t firstIdx = bySkeletonDef.threadStarts[threadIdx];
1741 size_t lastIdx = std::min( firstIdx + magicDistance, bySkeletonDef.threadStarts[threadIdx + 1] );
1742 while( firstIdx != lastIdx )
1743 {
1744 SkeletonInstance *first = *( bySkeletonDef.skeletons.begin() + firstIdx );
1745 SkeletonInstance *last = *( bySkeletonDef.skeletons.begin() + lastIdx - 1 );
1746
1747 const TransformArray &firstTransforms = first->_getTransformArray();
1748 const TransformArray &lastTransforms = last->_getTransformArray();
1749 ArrayMatrixAf4x3 const *reverseBind = skeletonDef->getReverseBindPose().get();
1750
1751 assert( bySkeletonDef.boneMemoryManager.getNumDepths() == firstTransforms.size() );
1752
1753 for( size_t i = 0; i < firstTransforms.size(); ++i )
1754 {
1755 const size_t numNodes =
1756 static_cast<size_t>( lastTransforms[i].mOwner - firstTransforms[i].mOwner ) +
1757 lastTransforms[i].mIndex + depthLevelInfo[i].numBonesInLevel;
1758 assert( numNodes <=
1759 bySkeletonDef.boneMemoryManager.getFirstNode( _hiddenTransform, i ) );
1760
1761 Bone::updateAllTransforms( numNodes, firstTransforms[i], reverseBind,
1762 depthLevelInfo[i].numBonesInLevel );
1763 reverseBind +=
1764 ( depthLevelInfo[i].numBonesInLevel - 1 + ARRAY_PACKED_REALS ) / ARRAY_PACKED_REALS;
1765 }
1766
1767 firstIdx = lastIdx;
1768 lastIdx += magicDistance;
1769 lastIdx = std::min( lastIdx, bySkeletonDef.threadStarts[threadIdx + 1] );
1770 }
1771 }
1772 //-----------------------------------------------------------------------
1773 void SceneManager::updateAllAnimations()
1774 {

Callers

nothing calls this directly

Calls 6

emptyMethod · 0.45
beginMethod · 0.45
getMethod · 0.45
getNumDepthsMethod · 0.45
sizeMethod · 0.45
getFirstNodeMethod · 0.45

Tested by

no test coverage detected