-----------------------------------------------------------------------
| 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 | { |
nothing calls this directly
no test coverage detected