BsAnimation.cpp 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsAnimation.h"
  4. #include "BsAnimationManager.h"
  5. #include "BsAnimationClip.h"
  6. #include "BsAnimationUtility.h"
  7. #include "BsSceneObject.h"
  8. namespace BansheeEngine
  9. {
  10. AnimationClipInfo::AnimationClipInfo()
  11. : fadeDirection(0.0f), fadeTime(0.0f), fadeLength(0.0f), curveVersion(0), layerIdx((UINT32)-1), stateIdx((UINT32)-1)
  12. { }
  13. AnimationClipInfo::AnimationClipInfo(const HAnimationClip& clip)
  14. : fadeDirection(0.0f), fadeTime(0.0f), fadeLength(0.0f), clip(clip), curveVersion(0), layerIdx((UINT32)-1), stateIdx((UINT32)-1)
  15. { }
  16. Blend1DInfo::Blend1DInfo(UINT32 numClips)
  17. : clips(nullptr), numClips(numClips)
  18. {
  19. if (numClips > 0)
  20. clips = bs_newN<BlendClipInfo>(numClips);
  21. }
  22. Blend1DInfo::~Blend1DInfo()
  23. {
  24. if(clips != nullptr)
  25. bs_deleteN(clips, numClips);
  26. }
  27. AnimationProxy::AnimationProxy(UINT64 id)
  28. : id(id), layers(nullptr), numLayers(0), numSceneObjects(0), sceneObjectInfos(nullptr)
  29. , sceneObjectTransforms(nullptr), mCullEnabled(true), numGenericCurves(0), genericCurveOutputs(nullptr)
  30. { }
  31. AnimationProxy::~AnimationProxy()
  32. {
  33. clear();
  34. }
  35. void AnimationProxy::clear()
  36. {
  37. if (layers == nullptr)
  38. return;
  39. for(UINT32 i = 0; i < numLayers; i++)
  40. {
  41. AnimationStateLayer& layer = layers[i];
  42. for(UINT32 j = 0; j < layer.numStates; j++)
  43. {
  44. AnimationState& state = layer.states[j];
  45. if(state.curves != nullptr)
  46. {
  47. {
  48. UINT32 numCurves = (UINT32)state.curves->position.size();
  49. for (UINT32 k = 0; k < numCurves; k++)
  50. state.positionCaches[k].~TCurveCache();
  51. }
  52. {
  53. UINT32 numCurves = (UINT32)state.curves->rotation.size();
  54. for (UINT32 k = 0; k < numCurves; k++)
  55. state.rotationCaches[k].~TCurveCache();
  56. }
  57. {
  58. UINT32 numCurves = (UINT32)state.curves->scale.size();
  59. for (UINT32 k = 0; k < numCurves; k++)
  60. state.scaleCaches[k].~TCurveCache();
  61. }
  62. {
  63. UINT32 numCurves = (UINT32)state.curves->generic.size();
  64. for (UINT32 k = 0; k < numCurves; k++)
  65. state.genericCaches[k].~TCurveCache();
  66. }
  67. }
  68. if(skeleton != nullptr)
  69. {
  70. UINT32 numBones = skeleton->getNumBones();
  71. for (UINT32 k = 0; k < numBones; k++)
  72. state.boneToCurveMapping[k].~AnimationCurveMapping();
  73. }
  74. if(state.soToCurveMapping != nullptr)
  75. {
  76. for(UINT32 k = 0; k < numSceneObjects; k++)
  77. state.soToCurveMapping[k].~AnimationCurveMapping();
  78. }
  79. state.~AnimationState();
  80. }
  81. layer.~AnimationStateLayer();
  82. }
  83. // All of the memory is part of the same buffer, so we only need to free the first element
  84. bs_free(layers);
  85. layers = nullptr;
  86. genericCurveOutputs = nullptr;
  87. sceneObjectInfos = nullptr;
  88. sceneObjectTransforms = nullptr;
  89. numLayers = 0;
  90. numGenericCurves = 0;
  91. }
  92. void AnimationProxy::rebuild(const SPtr<Skeleton>& skeleton, const SkeletonMask& mask,
  93. Vector<AnimationClipInfo>& clipInfos, const Vector<AnimatedSceneObject>& sceneObjects)
  94. {
  95. this->skeleton = skeleton;
  96. this->skeletonMask = skeletonMask;
  97. // Note: I could avoid having a separate allocation for LocalSkeletonPoses and use the same buffer as the rest
  98. // of AnimationProxy
  99. if (skeleton != nullptr)
  100. skeletonPose = LocalSkeletonPose(skeleton->getNumBones());
  101. numSceneObjects = (UINT32)sceneObjects.size();
  102. if (numSceneObjects > 0)
  103. sceneObjectPose = LocalSkeletonPose(numSceneObjects);
  104. else
  105. sceneObjectPose = LocalSkeletonPose();
  106. rebuild(clipInfos, sceneObjects);
  107. }
  108. void AnimationProxy::rebuild(Vector<AnimationClipInfo>& clipInfos, const Vector<AnimatedSceneObject>& sceneObjects)
  109. {
  110. clear();
  111. bs_frame_mark();
  112. {
  113. FrameVector<bool> clipLoadState(clipInfos.size());
  114. FrameVector<AnimationStateLayer> tempLayers;
  115. UINT32 clipIdx = 0;
  116. for (auto& clipInfo : clipInfos)
  117. {
  118. UINT32 layer = clipInfo.state.layer;
  119. if (layer == (UINT32)-1)
  120. layer = 0;
  121. else
  122. layer += 1;
  123. auto iterFind = std::find_if(tempLayers.begin(), tempLayers.end(),
  124. [&](auto& x)
  125. {
  126. return x.index == layer;
  127. });
  128. bool isLoaded = clipInfo.clip.isLoaded();
  129. clipLoadState[clipIdx] = isLoaded;
  130. if (iterFind == tempLayers.end())
  131. {
  132. tempLayers.push_back(AnimationStateLayer());
  133. AnimationStateLayer& newLayer = tempLayers.back();
  134. newLayer.index = layer;
  135. newLayer.additive = isLoaded && clipInfo.clip->isAdditive();
  136. }
  137. clipIdx++;
  138. }
  139. std::sort(tempLayers.begin(), tempLayers.end(),
  140. [&](auto& x, auto& y)
  141. {
  142. return x.index < y.index;
  143. });
  144. numLayers = (UINT32)tempLayers.size();
  145. UINT32 numClips = (UINT32)clipInfos.size();
  146. UINT32 numBones;
  147. if (skeleton != nullptr)
  148. numBones = skeleton->getNumBones();
  149. else
  150. numBones = 0;
  151. UINT32 numPosCurves = 0;
  152. UINT32 numRotCurves = 0;
  153. UINT32 numScaleCurves = 0;
  154. clipIdx = 0;
  155. for (auto& clipInfo : clipInfos)
  156. {
  157. bool isLoaded = clipLoadState[clipIdx++];
  158. if (!isLoaded)
  159. continue;
  160. SPtr<AnimationCurves> curves = clipInfo.clip->getCurves();
  161. numPosCurves += (UINT32)curves->position.size();
  162. numRotCurves += (UINT32)curves->rotation.size();
  163. numScaleCurves += (UINT32)curves->scale.size();
  164. }
  165. numGenericCurves = 0;
  166. if(clipInfos.size() > 0 && clipLoadState[0])
  167. {
  168. SPtr<AnimationCurves> curves = clipInfos[0].clip->getCurves();
  169. numGenericCurves = (UINT32)curves->generic.size();
  170. }
  171. UINT32* mappedBoneIndices = (UINT32*)bs_frame_alloc(sizeof(UINT32) * numSceneObjects);
  172. for (UINT32 i = 0; i < numSceneObjects; i++)
  173. mappedBoneIndices[i] = -1;
  174. UINT32 numBoneMappedSOs = 0;
  175. if (skeleton != nullptr)
  176. {
  177. for (UINT32 i = 0; i < numSceneObjects; i++)
  178. {
  179. if (sceneObjects[i].so.isDestroyed(true))
  180. continue;
  181. // Empty string always means root bone
  182. if (sceneObjects[i].curveName.empty())
  183. {
  184. UINT32 rootBoneIdx = skeleton->getRootBoneIndex();
  185. if (rootBoneIdx != (UINT32)-1)
  186. {
  187. mappedBoneIndices[i] = rootBoneIdx;
  188. numBoneMappedSOs++;
  189. }
  190. }
  191. else
  192. {
  193. for (UINT32 j = 0; j < numBones; j++)
  194. {
  195. if (skeleton->getBoneInfo(j).name == sceneObjects[i].curveName)
  196. {
  197. mappedBoneIndices[i] = j;
  198. numBoneMappedSOs++;
  199. break;
  200. }
  201. }
  202. }
  203. }
  204. }
  205. UINT32 numBoneMappings = numBones * numClips;
  206. UINT32 layersSize = sizeof(AnimationStateLayer) * numLayers;
  207. UINT32 clipsSize = sizeof(AnimationState) * numClips;
  208. UINT32 boneMappingSize = numBoneMappings * sizeof(AnimationCurveMapping);
  209. UINT32 posCacheSize = numPosCurves * sizeof(TCurveCache<Vector3>);
  210. UINT32 rotCacheSize = numRotCurves * sizeof(TCurveCache<Quaternion>);
  211. UINT32 scaleCacheSize = numScaleCurves * sizeof(TCurveCache<Vector3>);
  212. UINT32 genCacheSize = numGenericCurves * sizeof(TCurveCache<float>);
  213. UINT32 genericCurveOutputSize = numGenericCurves * sizeof(float);
  214. UINT32 sceneObjectIdsSize = numSceneObjects * sizeof(AnimatedSceneObjectInfo);
  215. UINT32 sceneObjectTransformsSize = numBoneMappedSOs * sizeof(Matrix4);
  216. UINT8* data = (UINT8*)bs_alloc(layersSize + clipsSize + boneMappingSize + posCacheSize + rotCacheSize +
  217. scaleCacheSize + genCacheSize + genericCurveOutputSize + sceneObjectIdsSize + sceneObjectTransformsSize);
  218. layers = (AnimationStateLayer*)data;
  219. memcpy(layers, tempLayers.data(), layersSize);
  220. data += layersSize;
  221. AnimationState* states = (AnimationState*)data;
  222. for(UINT32 i = 0; i < numClips; i++)
  223. new (&states[i]) AnimationState();
  224. data += clipsSize;
  225. AnimationCurveMapping* boneMappings = (AnimationCurveMapping*)data;
  226. for (UINT32 i = 0; i < numBoneMappings; i++)
  227. new (&boneMappings[i]) AnimationCurveMapping();
  228. data += boneMappingSize;
  229. TCurveCache<Vector3>* posCache = (TCurveCache<Vector3>*)data;
  230. for (UINT32 i = 0; i < numPosCurves; i++)
  231. new (&posCache[i]) TCurveCache<Vector3>();
  232. data += posCacheSize;
  233. TCurveCache<Quaternion>* rotCache = (TCurveCache<Quaternion>*)data;
  234. for (UINT32 i = 0; i < numRotCurves; i++)
  235. new (&rotCache[i]) TCurveCache<Quaternion>();
  236. data += rotCacheSize;
  237. TCurveCache<Vector3>* scaleCache = (TCurveCache<Vector3>*)data;
  238. for (UINT32 i = 0; i < numScaleCurves; i++)
  239. new (&scaleCache[i]) TCurveCache<Vector3>();
  240. data += scaleCacheSize;
  241. TCurveCache<float>* genCache = (TCurveCache<float>*)data;
  242. for (UINT32 i = 0; i < numGenericCurves; i++)
  243. new (&genCache[i]) TCurveCache<float>();
  244. data += genCacheSize;
  245. genericCurveOutputs = (float*)data;
  246. data += genericCurveOutputSize;
  247. sceneObjectInfos = (AnimatedSceneObjectInfo*)data;
  248. data += sceneObjectIdsSize;
  249. sceneObjectTransforms = (Matrix4*)data;
  250. for (UINT32 i = 0; i < numBoneMappedSOs; i++)
  251. sceneObjectTransforms[i] = Matrix4::IDENTITY;
  252. data += sceneObjectTransformsSize;
  253. UINT32 curLayerIdx = 0;
  254. UINT32 curStateIdx = 0;
  255. // Note: Hidden dependency. First clip info must be in layers[0].states[0] (needed for generic curves which only
  256. // use the primary clip).
  257. for(UINT32 i = 0; i < numLayers; i++)
  258. {
  259. AnimationStateLayer& layer = layers[i];
  260. layer.states = &states[curStateIdx];
  261. layer.numStates = 0;
  262. UINT32 localStateIdx = 0;
  263. for(UINT32 j = 0; j < (UINT32)clipInfos.size(); j++)
  264. {
  265. AnimationClipInfo& clipInfo = clipInfos[j];
  266. UINT32 clipLayer = clipInfo.state.layer;
  267. if (clipLayer == (UINT32)-1)
  268. clipLayer = 0;
  269. else
  270. clipLayer += 1;
  271. if (clipLayer != layer.index)
  272. continue;
  273. AnimationState& state = states[curStateIdx];
  274. state.loop = clipInfo.state.wrapMode == AnimWrapMode::Loop;
  275. state.time = clipInfo.state.time;
  276. // Calculate weight if fading is active
  277. float weight = clipInfo.state.weight;
  278. //// Assumes time is clamped to [0, fadeLength] and fadeLength != 0
  279. if(clipInfo.fadeDirection < 0.0f)
  280. {
  281. float t = clipInfo.fadeTime / clipInfo.fadeLength;
  282. weight *= (1.0f - t);
  283. }
  284. else if(clipInfo.fadeDirection > 0.0f)
  285. {
  286. float t = clipInfo.fadeTime / clipInfo.fadeLength;
  287. weight *= t;
  288. }
  289. state.weight = weight;
  290. // Set up individual curves and their caches
  291. bool isClipValid = clipLoadState[j];
  292. if (isClipValid)
  293. {
  294. state.curves = clipInfo.clip->getCurves();
  295. state.disabled = false;
  296. }
  297. else
  298. {
  299. static SPtr<AnimationCurves> zeroCurves = bs_shared_ptr_new<AnimationCurves>();
  300. state.curves = zeroCurves;
  301. state.disabled = true;
  302. }
  303. state.positionCaches = posCache;
  304. posCache += state.curves->position.size();
  305. state.rotationCaches = rotCache;
  306. rotCache += state.curves->rotation.size();
  307. state.scaleCaches = scaleCache;
  308. scaleCache += state.curves->scale.size();
  309. state.genericCaches = genCache;
  310. genCache += state.curves->generic.size();
  311. clipInfo.layerIdx = curLayerIdx;
  312. clipInfo.stateIdx = localStateIdx;
  313. if(isClipValid)
  314. clipInfo.curveVersion = clipInfo.clip->getVersion();
  315. // Set up bone mapping
  316. if (skeleton != nullptr)
  317. {
  318. state.boneToCurveMapping = &boneMappings[curStateIdx * numBones];
  319. if (isClipValid)
  320. {
  321. clipInfo.clip->getBoneMapping(*skeleton, state.boneToCurveMapping);
  322. }
  323. else
  324. {
  325. AnimationCurveMapping emptyMapping = { (UINT32)-1, (UINT32)-1, (UINT32)-1 };
  326. for (UINT32 i = 0; i < numBones; i++)
  327. state.boneToCurveMapping[i] = emptyMapping;
  328. }
  329. }
  330. else
  331. state.boneToCurveMapping = nullptr;
  332. layer.numStates++;
  333. curStateIdx++;
  334. localStateIdx++;
  335. }
  336. curLayerIdx++;
  337. // Must be larger than zero otherwise the layer.states pointer will point to data held by some other layer
  338. assert(layer.numStates > 0);
  339. }
  340. Matrix4 invRootTransform(BsIdentity);
  341. for (UINT32 i = 0; i < numSceneObjects; i++)
  342. {
  343. if(sceneObjects[i].curveName.empty())
  344. {
  345. HSceneObject so = sceneObjects[i].so;
  346. if (!so.isDestroyed(true))
  347. invRootTransform = so->getWorldTfrm().inverseAffine();
  348. break;
  349. }
  350. }
  351. UINT32 boneIdx = 0;
  352. for(UINT32 i = 0; i < numSceneObjects; i++)
  353. {
  354. HSceneObject so = sceneObjects[i].so;
  355. AnimatedSceneObjectInfo& soInfo = sceneObjectInfos[i];
  356. soInfo.id = so.getInstanceId();
  357. soInfo.boneIdx = mappedBoneIndices[i];
  358. bool isSOValid = !so.isDestroyed(true);
  359. if (isSOValid)
  360. soInfo.hash = so->getTransformHash();
  361. else
  362. soInfo.hash = 0;
  363. soInfo.layerIdx = (UINT32)-1;
  364. soInfo.stateIdx = (UINT32)-1;
  365. // If no bone mapping, find curves directly
  366. if(soInfo.boneIdx == -1)
  367. {
  368. soInfo.curveIndices = { (UINT32)-1, (UINT32)-1, (UINT32)-1 };
  369. if (isSOValid)
  370. {
  371. for (UINT32 j = 0; j < (UINT32)clipInfos.size(); j++)
  372. {
  373. AnimationClipInfo& clipInfo = clipInfos[j];
  374. soInfo.layerIdx = clipInfo.layerIdx;
  375. soInfo.stateIdx = clipInfo.stateIdx;
  376. bool isClipValid = clipLoadState[j];
  377. if (isClipValid)
  378. {
  379. // Note: If there are multiple clips with the relevant curve name, we only use the first
  380. clipInfo.clip->getCurveMapping(sceneObjects[i].curveName, soInfo.curveIndices);
  381. break;
  382. }
  383. }
  384. }
  385. }
  386. else
  387. {
  388. // No need to check if SO is valid, if it has a bone connection it must be
  389. sceneObjectTransforms[boneIdx] = so->getWorldTfrm() * invRootTransform;
  390. boneIdx++;
  391. }
  392. }
  393. bs_frame_free(mappedBoneIndices);
  394. }
  395. bs_frame_clear();
  396. }
  397. void AnimationProxy::updateValues(const Vector<AnimationClipInfo>& clipInfos)
  398. {
  399. for(auto& clipInfo : clipInfos)
  400. {
  401. AnimationState& state = layers[clipInfo.layerIdx].states[clipInfo.stateIdx];
  402. state.loop = clipInfo.state.wrapMode == AnimWrapMode::Loop;
  403. state.weight = clipInfo.state.weight;
  404. state.time = clipInfo.state.time;
  405. }
  406. }
  407. void AnimationProxy::updateTransforms(const Vector<AnimatedSceneObject>& sceneObjects)
  408. {
  409. Matrix4 invRootTransform(BsIdentity);
  410. for (UINT32 i = 0; i < numSceneObjects; i++)
  411. {
  412. if (sceneObjects[i].curveName.empty())
  413. {
  414. HSceneObject so = sceneObjects[i].so;
  415. if (!so.isDestroyed(true))
  416. invRootTransform = so->getWorldTfrm().inverseAffine();
  417. break;
  418. }
  419. }
  420. UINT32 boneIdx = 0;
  421. for (UINT32 i = 0; i < numSceneObjects; i++)
  422. {
  423. HSceneObject so = sceneObjects[i].so;
  424. if (so.isDestroyed(true))
  425. {
  426. sceneObjectInfos[i].hash = 0;
  427. continue;
  428. }
  429. sceneObjectInfos[i].hash = so->getTransformHash();
  430. if (sceneObjectInfos[i].boneIdx == -1)
  431. continue;
  432. sceneObjectTransforms[boneIdx] = sceneObjects[i].so->getWorldTfrm() * invRootTransform;
  433. boneIdx++;
  434. }
  435. }
  436. void AnimationProxy::updateTime(const Vector<AnimationClipInfo>& clipInfos)
  437. {
  438. for (auto& clipInfo : clipInfos)
  439. {
  440. AnimationState& state = layers[clipInfo.layerIdx].states[clipInfo.stateIdx];
  441. state.time = clipInfo.state.time;
  442. }
  443. }
  444. Animation::Animation()
  445. : mDefaultWrapMode(AnimWrapMode::Loop), mDefaultSpeed(1.0f), mCull(true), mDirty(AnimDirtyStateFlag::Skeleton)
  446. , mGenericCurveValuesValid(false)
  447. {
  448. mId = AnimationManager::instance().registerAnimation(this);
  449. mAnimProxy = bs_shared_ptr_new<AnimationProxy>(mId);
  450. }
  451. Animation::~Animation()
  452. {
  453. AnimationManager::instance().unregisterAnimation(mId);
  454. }
  455. void Animation::setSkeleton(const SPtr<Skeleton>& skeleton)
  456. {
  457. mSkeleton = skeleton;
  458. mDirty |= AnimDirtyStateFlag::Skeleton;
  459. }
  460. void Animation::setMask(const SkeletonMask& mask)
  461. {
  462. mSkeletonMask = mask;
  463. mDirty |= AnimDirtyStateFlag::Skeleton;
  464. }
  465. void Animation::setWrapMode(AnimWrapMode wrapMode)
  466. {
  467. mDefaultWrapMode = wrapMode;
  468. for (auto& clipInfo : mClipInfos)
  469. clipInfo.state.wrapMode = wrapMode;
  470. mDirty |= AnimDirtyStateFlag::Value;
  471. }
  472. void Animation::setSpeed(float speed)
  473. {
  474. mDefaultSpeed = speed;
  475. for (auto& clipInfo : mClipInfos)
  476. {
  477. // Special case: Ignore non-moving ones
  478. if(!clipInfo.state.stopped)
  479. clipInfo.state.speed = speed;
  480. }
  481. mDirty |= AnimDirtyStateFlag::Value;
  482. }
  483. void Animation::setBounds(const AABox& bounds)
  484. {
  485. mBounds = bounds;
  486. mDirty |= AnimDirtyStateFlag::Culling;
  487. }
  488. void Animation::setCulling(bool cull)
  489. {
  490. mCull = cull;
  491. mDirty |= AnimDirtyStateFlag::Culling;
  492. }
  493. void Animation::play(const HAnimationClip& clip)
  494. {
  495. AnimationClipInfo* clipInfo = addClip(clip, (UINT32)-1);
  496. if(clipInfo != nullptr)
  497. {
  498. clipInfo->state.time = 0.0f;
  499. clipInfo->state.speed = mDefaultSpeed;
  500. clipInfo->state.weight = 1.0f;
  501. clipInfo->state.wrapMode = mDefaultWrapMode;
  502. }
  503. mDirty |= AnimDirtyStateFlag::Value;
  504. }
  505. void Animation::blendAdditive(const HAnimationClip& clip, float weight, float fadeLength, UINT32 layer)
  506. {
  507. if(clip != nullptr && !clip->isAdditive())
  508. {
  509. LOGWRN("blendAdditive() called with a clip that doesn't contain additive animation. Ignoring.");
  510. // Stop any clips on this layer, even if invalid
  511. HAnimationClip nullClip;
  512. addClip(nullClip, layer);
  513. return;
  514. }
  515. AnimationClipInfo* clipInfo = addClip(clip, layer);
  516. if (clipInfo != nullptr)
  517. {
  518. clipInfo->state.time = 0.0f;
  519. clipInfo->state.speed = mDefaultSpeed;
  520. clipInfo->state.weight = weight;
  521. clipInfo->state.wrapMode = mDefaultWrapMode;
  522. if(fadeLength > 0.0f)
  523. {
  524. clipInfo->fadeDirection = 1.0f;
  525. clipInfo->fadeTime = 0.0f;
  526. clipInfo->fadeLength = fadeLength;
  527. }
  528. mDirty |= AnimDirtyStateFlag::Value;
  529. }
  530. }
  531. void Animation::blend1D(const Blend1DInfo& info, float t)
  532. {
  533. if (info.numClips == 0)
  534. return;
  535. // Find valid range
  536. float startPos = 0.0f;
  537. float endPos = 0.0f;
  538. for (UINT32 i = 0; i < info.numClips; i++)
  539. {
  540. startPos = std::min(startPos, info.clips[i].position);
  541. endPos = std::min(endPos, info.clips[i].position);
  542. }
  543. float length = endPos - startPos;
  544. if(Math::approxEquals(length, 0.0f) || info.numClips < 2)
  545. {
  546. play(info.clips[0].clip);
  547. return;
  548. }
  549. // Clamp or loop time
  550. bool loop = mDefaultWrapMode == AnimWrapMode::Loop;
  551. if (t < startPos)
  552. {
  553. if (loop)
  554. t = t - std::floor(t / length) * length;
  555. else // Clamping
  556. t = startPos;
  557. }
  558. if (t > endPos)
  559. {
  560. if (loop)
  561. t = t - std::floor(t / length) * length;
  562. else // Clamping
  563. t = endPos;
  564. }
  565. // Find keys to blend between
  566. UINT32 leftKey = 0;
  567. UINT32 rightKey = 0;
  568. INT32 start = 0;
  569. INT32 searchLength = (INT32)info.numClips;
  570. while (searchLength > 0)
  571. {
  572. INT32 half = searchLength >> 1;
  573. INT32 mid = start + half;
  574. if (t < info.clips[mid].position)
  575. {
  576. searchLength = half;
  577. }
  578. else
  579. {
  580. start = mid + 1;
  581. searchLength -= (half + 1);
  582. }
  583. }
  584. leftKey = std::max(0, start - 1);
  585. rightKey = std::min(start, (INT32)info.numClips - 1);
  586. float interpLength = info.clips[rightKey].position - info.clips[leftKey].position;
  587. t = (t - info.clips[leftKey].position) / interpLength;
  588. // Add clips and set weights
  589. for(UINT32 i = 0; i < info.numClips; i++)
  590. {
  591. AnimationClipInfo* clipInfo = addClip(info.clips[i].clip, (UINT32)-1, i == 0);
  592. if (clipInfo != nullptr)
  593. {
  594. clipInfo->state.time = 0.0f;
  595. clipInfo->state.stopped = true;
  596. clipInfo->state.speed = 0.0f;
  597. clipInfo->state.wrapMode = AnimWrapMode::Clamp;
  598. if (i == leftKey)
  599. clipInfo->state.weight = 1.0f - t;
  600. else if (i == rightKey)
  601. clipInfo->state.weight = t;
  602. else
  603. clipInfo->state.weight = 0.0f;
  604. }
  605. }
  606. mDirty |= AnimDirtyStateFlag::Value;
  607. }
  608. void Animation::blend2D(const Blend2DInfo& info, const Vector2& t)
  609. {
  610. AnimationClipInfo* topLeftClipInfo = addClip(info.topLeftClip, (UINT32)-1, true);
  611. if (topLeftClipInfo != nullptr)
  612. {
  613. topLeftClipInfo->state.time = 0.0f;
  614. topLeftClipInfo->state.stopped = true;
  615. topLeftClipInfo->state.speed = 0.0f;
  616. topLeftClipInfo->state.weight = (1.0f - t.x) * (1.0f - t.y);
  617. topLeftClipInfo->state.wrapMode = AnimWrapMode::Clamp;
  618. }
  619. AnimationClipInfo* topRightClipInfo = addClip(info.topRightClip, (UINT32)-1, false);
  620. if (topRightClipInfo != nullptr)
  621. {
  622. topRightClipInfo->state.time = 0.0f;
  623. topRightClipInfo->state.stopped = true;
  624. topLeftClipInfo->state.speed = 0.0f;
  625. topRightClipInfo->state.weight = t.x * (1.0f - t.y);
  626. topRightClipInfo->state.wrapMode = AnimWrapMode::Clamp;
  627. }
  628. AnimationClipInfo* botLeftClipInfo = addClip(info.botLeftClip, (UINT32)-1, false);
  629. if (botLeftClipInfo != nullptr)
  630. {
  631. botLeftClipInfo->state.time = 0.0f;
  632. botLeftClipInfo->state.stopped = true;
  633. topLeftClipInfo->state.speed = 0.0f;
  634. botLeftClipInfo->state.weight = (1.0f - t.x) * t.y;
  635. botLeftClipInfo->state.wrapMode = AnimWrapMode::Clamp;
  636. }
  637. AnimationClipInfo* botRightClipInfo = addClip(info.botRightClip, (UINT32)-1, false);
  638. if (botRightClipInfo != nullptr)
  639. {
  640. botRightClipInfo->state.time = 0.0f;
  641. botRightClipInfo->state.stopped = true;
  642. botRightClipInfo->state.speed = 0.0f;
  643. botRightClipInfo->state.weight = t.x * t.y;
  644. botRightClipInfo->state.wrapMode = AnimWrapMode::Clamp;
  645. }
  646. mDirty |= AnimDirtyStateFlag::Value;
  647. }
  648. void Animation::crossFade(const HAnimationClip& clip, float fadeLength)
  649. {
  650. bool isFading = fadeLength > 0.0f;
  651. if(!isFading)
  652. {
  653. play(clip);
  654. return;
  655. }
  656. AnimationClipInfo* clipInfo = addClip(clip, (UINT32)-1, false);
  657. if (clipInfo != nullptr)
  658. {
  659. clipInfo->state.time = 0.0f;
  660. clipInfo->state.speed = mDefaultSpeed;
  661. clipInfo->state.weight = 1.0f;
  662. clipInfo->state.wrapMode = mDefaultWrapMode;
  663. // Set up fade lengths
  664. clipInfo->fadeDirection = 1.0f;
  665. clipInfo->fadeTime = 0.0f;
  666. clipInfo->fadeLength = fadeLength;
  667. for (auto& entry : mClipInfos)
  668. {
  669. if (entry.state.layer == (UINT32)-1 && entry.clip != clip)
  670. {
  671. // If other clips are already cross-fading, we need to persist their current weight before starting
  672. // a new crossfade. We do that by adjusting the fade times.
  673. if(clipInfo->fadeDirection != 0 && clipInfo->fadeTime < clipInfo->fadeLength)
  674. {
  675. float t = clipInfo->fadeTime / clipInfo->fadeLength;
  676. if (clipInfo->fadeDirection < 0.0f)
  677. t = (1.0f - t);
  678. clipInfo->state.weight *= t;
  679. }
  680. clipInfo->fadeDirection = -1.0f;
  681. clipInfo->fadeTime = 0.0f;
  682. clipInfo->fadeLength = fadeLength;
  683. }
  684. }
  685. }
  686. mDirty |= AnimDirtyStateFlag::Value;
  687. }
  688. void Animation::stop(UINT32 layer)
  689. {
  690. bs_frame_mark();
  691. {
  692. FrameVector<AnimationClipInfo> newClips;
  693. for (auto& clipInfo : mClipInfos)
  694. {
  695. if (clipInfo.state.layer != layer)
  696. newClips.push_back(clipInfo);
  697. else
  698. mDirty |= AnimDirtyStateFlag::Layout;
  699. }
  700. mClipInfos.resize(newClips.size());
  701. memcpy(mClipInfos.data(), newClips.data(), sizeof(AnimationClipInfo) * newClips.size());
  702. }
  703. bs_frame_clear();
  704. }
  705. void Animation::stopAll()
  706. {
  707. mClipInfos.clear();
  708. mDirty |= AnimDirtyStateFlag::Layout;
  709. }
  710. AnimationClipInfo* Animation::addClip(const HAnimationClip& clip, UINT32 layer, bool stopExisting)
  711. {
  712. AnimationClipInfo* output = nullptr;
  713. bool hasExisting = false;
  714. // Search for existing
  715. for (auto& clipInfo : mClipInfos)
  716. {
  717. if (clipInfo.state.layer == layer)
  718. {
  719. if (clipInfo.clip == clip)
  720. output = &clipInfo;
  721. else if (stopExisting)
  722. hasExisting = true;
  723. }
  724. }
  725. // Doesn't exist or found extra animations, rebuild
  726. if (output == nullptr || hasExisting)
  727. {
  728. bs_frame_mark();
  729. {
  730. FrameVector<AnimationClipInfo> newClips;
  731. for (auto& clipInfo : mClipInfos)
  732. {
  733. if (!stopExisting || clipInfo.state.layer != layer || clipInfo.clip == clip)
  734. newClips.push_back(clipInfo);
  735. }
  736. if (output == nullptr && clip != nullptr)
  737. newClips.push_back(AnimationClipInfo());
  738. mClipInfos.resize(newClips.size());
  739. memcpy(mClipInfos.data(), newClips.data(), sizeof(AnimationClipInfo) * newClips.size());
  740. mDirty |= AnimDirtyStateFlag::Layout;
  741. }
  742. bs_frame_clear();
  743. }
  744. // If new clip was added, get its address
  745. if (output == nullptr && clip != nullptr)
  746. {
  747. AnimationClipInfo& newInfo = mClipInfos.back();
  748. newInfo.clip = clip;
  749. newInfo.layerIdx = layer;
  750. output = &newInfo;
  751. }
  752. return output;
  753. }
  754. bool Animation::isPlaying() const
  755. {
  756. for(auto& clipInfo : mClipInfos)
  757. {
  758. if (clipInfo.clip.isLoaded())
  759. return true;
  760. }
  761. return false;
  762. }
  763. bool Animation::getState(const HAnimationClip& clip, AnimationClipState& state)
  764. {
  765. if (clip == nullptr)
  766. return false;
  767. for (auto& clipInfo : mClipInfos)
  768. {
  769. if (clipInfo.clip == clip)
  770. {
  771. state = clipInfo.state;
  772. return true;
  773. }
  774. }
  775. return false;
  776. }
  777. void Animation::setState(const HAnimationClip& clip, AnimationClipState state)
  778. {
  779. AnimationClipInfo* clipInfo = addClip(clip, state.layer, false);
  780. if (clipInfo == nullptr)
  781. return;
  782. float clipLength = 0.0f;
  783. if (clip.isLoaded())
  784. clipLength = clip->getLength();
  785. bool loop = state.wrapMode == AnimWrapMode::Loop;
  786. AnimationUtility::wrapTime(state.time, 0.0f, clipLength, loop);
  787. clipInfo->state = state;
  788. mDirty |= AnimDirtyStateFlag::Value;
  789. }
  790. UINT32 Animation::getNumClips() const
  791. {
  792. return (UINT32)mClipInfos.size();
  793. }
  794. HAnimationClip Animation::getClip(UINT32 idx) const
  795. {
  796. if (idx >= (UINT32)mClipInfos.size())
  797. return HAnimationClip();
  798. return mClipInfos[idx].clip;
  799. }
  800. void Animation::triggerEvents(float lastFrameTime, float delta)
  801. {
  802. for (auto& clipInfo : mClipInfos)
  803. {
  804. if (!clipInfo.clip.isLoaded())
  805. continue;
  806. const Vector<AnimationEvent>& events = clipInfo.clip->getEvents();
  807. bool loop = clipInfo.state.wrapMode == AnimWrapMode::Loop;
  808. float start = lastFrameTime;
  809. float end = start + delta;
  810. float clipLength = clipInfo.clip->getLength();
  811. AnimationUtility::wrapTime(start, 0.0f, clipLength, loop);
  812. AnimationUtility::wrapTime(end, 0.0f, clipLength, loop);
  813. if (start < end)
  814. {
  815. for (auto& event : events)
  816. {
  817. if (event.time > start && event.time <= end)
  818. onEventTriggered(clipInfo.clip, event.name);
  819. }
  820. }
  821. else if(end < start) // End is looped, but start is not
  822. {
  823. for (auto& event : events)
  824. {
  825. if (event.time > start && event.time < clipLength && event.time > 0 && event.time <= end)
  826. onEventTriggered(clipInfo.clip, event.name);
  827. }
  828. }
  829. }
  830. }
  831. void Animation::mapCurveToSceneObject(const String& curve, const HSceneObject& so)
  832. {
  833. AnimatedSceneObject animSo = { so, curve };
  834. mSceneObjects[so.getInstanceId()] = animSo;
  835. mDirty |= AnimDirtyStateFlag::Skeleton;
  836. }
  837. void Animation::unmapSceneObject(const HSceneObject& so)
  838. {
  839. mSceneObjects.erase(so.getInstanceId());
  840. mDirty |= AnimDirtyStateFlag::Skeleton;
  841. }
  842. bool Animation::getGenericCurveValue(UINT32 curveIdx, float& value)
  843. {
  844. if (!mGenericCurveValuesValid || curveIdx >= (UINT32)mGenericCurveOutputs.size())
  845. return false;
  846. value = mGenericCurveOutputs[curveIdx];
  847. return true;
  848. }
  849. SPtr<Animation> Animation::create()
  850. {
  851. Animation* anim = new (bs_alloc<Animation>()) Animation();
  852. SPtr<Animation> animPtr = bs_core_ptr(anim);
  853. animPtr->_setThisPtr(animPtr);
  854. animPtr->initialize();
  855. return animPtr;
  856. }
  857. void Animation::updateAnimProxy(float timeDelta)
  858. {
  859. // Check if any of the clip curves are dirty and advance time, perform fading
  860. for (auto& clipInfo : mClipInfos)
  861. {
  862. float scaledTimeDelta = timeDelta * clipInfo.state.speed;
  863. clipInfo.state.time += scaledTimeDelta;
  864. HAnimationClip clip = clipInfo.clip;
  865. float clipLength = 0.0f;
  866. if (clip.isLoaded())
  867. {
  868. if (clipInfo.curveVersion != clip->getVersion())
  869. mDirty |= AnimDirtyStateFlag::Layout;
  870. clipLength = clip->getLength();
  871. }
  872. bool loop = clipInfo.state.wrapMode == AnimWrapMode::Loop;
  873. AnimationUtility::wrapTime(clipInfo.state.time, 0.0f, clipLength, loop);
  874. float fadeTime = clipInfo.fadeTime + scaledTimeDelta;
  875. clipInfo.fadeTime = Math::clamp(fadeTime, 0.0f, clipInfo.fadeLength);
  876. }
  877. if (mDirty.isSet(AnimDirtyStateFlag::Culling))
  878. {
  879. mAnimProxy->mCullEnabled = mCull;
  880. mAnimProxy->mBounds = mBounds;
  881. mDirty.unset(AnimDirtyStateFlag::Culling);
  882. }
  883. auto getAnimatedSOList = [&]()
  884. {
  885. Vector<AnimatedSceneObject> animatedSO(mSceneObjects.size());
  886. UINT32 idx = 0;
  887. for (auto& entry : mSceneObjects)
  888. animatedSO[idx++] = entry.second;
  889. return animatedSO;
  890. };
  891. bool didFullRebuild = false;
  892. if((UINT32)mDirty == 0) // Clean
  893. {
  894. mAnimProxy->updateTime(mClipInfos);
  895. }
  896. else
  897. {
  898. if (mDirty.isSet(AnimDirtyStateFlag::Skeleton))
  899. {
  900. Vector<AnimatedSceneObject> animatedSOs = getAnimatedSOList();
  901. mAnimProxy->rebuild(mSkeleton, mSkeletonMask, mClipInfos, animatedSOs);
  902. didFullRebuild = true;
  903. }
  904. else if (mDirty.isSet(AnimDirtyStateFlag::Layout))
  905. {
  906. Vector<AnimatedSceneObject> animatedSOs = getAnimatedSOList();
  907. mAnimProxy->rebuild(mClipInfos, animatedSOs);
  908. didFullRebuild = true;
  909. }
  910. else if (mDirty.isSet(AnimDirtyStateFlag::Value))
  911. mAnimProxy->updateValues(mClipInfos);
  912. }
  913. // Check if there are dirty transforms
  914. if (!didFullRebuild)
  915. {
  916. for (UINT32 i = 0; i < mAnimProxy->numSceneObjects; i++)
  917. {
  918. AnimatedSceneObjectInfo& soInfo = mAnimProxy->sceneObjectInfos[i];
  919. auto iterFind = mSceneObjects.find(soInfo.id);
  920. if (iterFind == mSceneObjects.end())
  921. {
  922. assert(false); // Should never happen
  923. continue;
  924. }
  925. UINT32 hash;
  926. HSceneObject so = iterFind->second.so;
  927. if (so.isDestroyed(true))
  928. hash = 0;
  929. else
  930. hash = so->getTransformHash();
  931. if (hash != mAnimProxy->sceneObjectInfos[i].hash)
  932. {
  933. Vector<AnimatedSceneObject> animatedSOs = getAnimatedSOList();
  934. mAnimProxy->updateTransforms(animatedSOs);
  935. break;
  936. }
  937. }
  938. }
  939. mDirty = AnimDirtyState();
  940. }
  941. void Animation::updateFromProxy()
  942. {
  943. HSceneObject rootSO;
  944. // Write TRS animation results to relevant SceneObjects
  945. for(UINT32 i = 0; i < mAnimProxy->numSceneObjects; i++)
  946. {
  947. AnimatedSceneObjectInfo& soInfo = mAnimProxy->sceneObjectInfos[i];
  948. auto iterFind = mSceneObjects.find(soInfo.id);
  949. if (iterFind == mSceneObjects.end())
  950. continue;
  951. HSceneObject so = iterFind->second.so;
  952. if (iterFind->second.curveName.empty())
  953. rootSO = so;
  954. if (so.isDestroyed(true))
  955. continue;
  956. if(soInfo.boneIdx != -1)
  957. {
  958. if (mAnimProxy->skeletonPose.hasOverride[soInfo.boneIdx])
  959. continue;
  960. Vector3 position = mAnimProxy->skeletonPose.positions[soInfo.boneIdx];
  961. Quaternion rotation = mAnimProxy->skeletonPose.rotations[soInfo.boneIdx];
  962. Vector3 scale = mAnimProxy->skeletonPose.scales[soInfo.boneIdx];
  963. const SPtr<Skeleton>& skeleton = mAnimProxy->skeleton;
  964. UINT32 parentBoneIdx = skeleton->getBoneInfo(soInfo.boneIdx).parent;
  965. if (parentBoneIdx == -1)
  966. {
  967. so->setPosition(position);
  968. so->setRotation(rotation);
  969. so->setScale(scale);
  970. }
  971. else
  972. {
  973. while(parentBoneIdx != -1)
  974. {
  975. // Update rotation
  976. const Quaternion& parentOrientation = mAnimProxy->skeletonPose.rotations[parentBoneIdx];
  977. rotation = parentOrientation * rotation;
  978. // Update scale
  979. const Vector3& parentScale = mAnimProxy->skeletonPose.scales[parentBoneIdx];
  980. scale = parentScale * scale;
  981. // Update position
  982. position = parentOrientation.rotate(parentScale * position);
  983. position += mAnimProxy->skeletonPose.positions[parentBoneIdx];
  984. parentBoneIdx = skeleton->getBoneInfo(parentBoneIdx).parent;
  985. }
  986. // Search for root if not already found
  987. if(rootSO == nullptr)
  988. {
  989. for(auto& entry : mSceneObjects)
  990. {
  991. if (entry.second.curveName.empty())
  992. rootSO = entry.second.so;
  993. }
  994. }
  995. Vector3 rootParentPos = Vector3::ZERO;
  996. Quaternion rootParentRot = Quaternion::IDENTITY;
  997. Vector3 rootParentScale = Vector3::ONE;
  998. if(rootSO.isDestroyed(true))
  999. {
  1000. HSceneObject rootParent = rootSO->getParent();
  1001. if(!rootParent.isDestroyed(true))
  1002. {
  1003. rootParentPos = rootParent->getWorldPosition();
  1004. rootParentRot = rootParent->getWorldRotation();
  1005. rootParentScale = rootParent->getWorldScale();
  1006. }
  1007. }
  1008. // Transform from space relative to root's parent to world space
  1009. rotation = rootParentRot * rotation;
  1010. scale = rootParentScale * scale;
  1011. position = rootParentRot.rotate(rootParentScale * position);
  1012. position += rootParentPos;
  1013. so->setWorldPosition(position);
  1014. so->setWorldRotation(rotation);
  1015. so->setWorldScale(scale);
  1016. }
  1017. }
  1018. else
  1019. {
  1020. so->setPosition(mAnimProxy->sceneObjectPose.positions[i]);
  1021. so->setRotation(mAnimProxy->sceneObjectPose.rotations[i]);
  1022. so->setScale(mAnimProxy->sceneObjectPose.scales[i]);
  1023. }
  1024. soInfo.hash = so->getTransformHash();
  1025. }
  1026. // Must ensure that clip in the proxy and current primary clip are the same
  1027. mGenericCurveValuesValid = false;
  1028. if(mAnimProxy->numLayers > 0 && mAnimProxy->layers[0].numStates > 0)
  1029. {
  1030. const AnimationState& state = mAnimProxy->layers[0].states[0];
  1031. if(!state.disabled && mClipInfos.size() > 0)
  1032. {
  1033. const AnimationClipInfo& clipInfo = mClipInfos[0];
  1034. if (clipInfo.stateIdx == 0 && clipInfo.layerIdx == 0)
  1035. {
  1036. if (clipInfo.clip.isLoaded() && clipInfo.curveVersion == clipInfo.clip->getVersion())
  1037. {
  1038. UINT32 numGenericCurves = (UINT32)clipInfo.clip->getCurves()->generic.size();
  1039. mGenericCurveValuesValid = numGenericCurves == mAnimProxy->numGenericCurves;
  1040. }
  1041. }
  1042. }
  1043. }
  1044. if(mGenericCurveValuesValid)
  1045. {
  1046. mGenericCurveOutputs.resize(mAnimProxy->numGenericCurves);
  1047. memcpy(mGenericCurveOutputs.data(), mAnimProxy->genericCurveOutputs, mAnimProxy->numGenericCurves * sizeof(float));
  1048. }
  1049. }
  1050. }