SceneNode.cpp 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Serialization/SerializeContext.h>
  9. #include <AzCore/Math/Quaternion.h>
  10. #include <AzCore/Math/Transform.h>
  11. #include <AzCore/Component/ComponentApplicationBus.h>
  12. #include <AzCore/Component/TransformBus.h>
  13. #include <AzCore/Time/ITime.h>
  14. #include <AzFramework/Components/CameraBus.h>
  15. #include "MathConversion.h"
  16. #include "SceneNode.h"
  17. #include "AnimSequence.h"
  18. #include "AnimTrack.h"
  19. #include "EventTrack.h"
  20. #include "ConsoleTrack.h"
  21. #include "SequenceTrack.h"
  22. #include "GotoTrack.h"
  23. #include "CaptureTrack.h"
  24. #include "ISystem.h"
  25. #include "AnimAZEntityNode.h"
  26. #include "AnimComponentNode.h"
  27. #include "Movie.h"
  28. #include "Maestro/Types/AnimNodeType.h"
  29. #include "Maestro/Types/AnimValueType.h"
  30. #include "Maestro/Types/AnimParamType.h"
  31. #include <AzCore/Math/MathUtils.h>
  32. #include <IAudioSystem.h>
  33. #include <IConsole.h>
  34. #define s_nodeParamsInitialized s_nodeParamsInitializedScene
  35. #define s_nodeParams s_nodeParamsSene
  36. #define AddSupportedParam AddSupportedParamScene
  37. namespace {
  38. bool s_nodeParamsInitialized = false;
  39. AZStd::vector<CAnimNode::SParamInfo> s_nodeParams;
  40. void AddSupportedParam(const char* sName, AnimParamType paramId, AnimValueType valueType, int flags = 0)
  41. {
  42. CAnimNode::SParamInfo param;
  43. param.name = sName;
  44. param.paramType = paramId;
  45. param.valueType = valueType;
  46. param.flags = (IAnimNode::ESupportedParamFlags)flags;
  47. s_nodeParams.push_back(param);
  48. }
  49. class CComponentEntitySceneCamera
  50. : public CAnimSceneNode::ISceneCamera
  51. {
  52. public:
  53. CComponentEntitySceneCamera(const AZ::EntityId& entityId)
  54. : m_cameraEntityId(entityId) {}
  55. virtual ~CComponentEntitySceneCamera() = default;
  56. const Vec3& GetPosition() const override
  57. {
  58. AZ::Vector3 pos;
  59. AZ::TransformBus::EventResult(pos, m_cameraEntityId, &AZ::TransformBus::Events::GetWorldTranslation);
  60. m_vec3Buffer.Set(pos.GetX(), pos.GetY(), pos.GetZ());
  61. return m_vec3Buffer;
  62. }
  63. const Quat& GetRotation() const override
  64. {
  65. AZ::Quaternion quat(AZ::Quaternion::CreateIdentity());
  66. AZ::TransformBus::EventResult(quat, m_cameraEntityId, &AZ::TransformBus::Events::GetWorldRotationQuaternion);
  67. m_quatBuffer = AZQuaternionToLYQuaternion(quat);
  68. return m_quatBuffer;
  69. }
  70. void SetPosition(const Vec3& localPosition) override
  71. {
  72. AZ::Vector3 pos(localPosition.x, localPosition.y, localPosition.z);
  73. AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetWorldTranslation, pos);
  74. }
  75. void SetRotation(const Quat& localRotation) override
  76. {
  77. AZ::Quaternion quat = LYQuaternionToAZQuaternion(localRotation);
  78. AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, quat);
  79. }
  80. float GetFoV() const override
  81. {
  82. float retFoV = DEFAULT_FOV;
  83. Camera::CameraRequestBus::EventResult(retFoV, m_cameraEntityId, &Camera::CameraComponentRequests::GetFovDegrees);
  84. return retFoV;
  85. }
  86. float GetNearZ() const override
  87. {
  88. float retNearZ = DEFAULT_NEAR;
  89. Camera::CameraRequestBus::EventResult(retNearZ, m_cameraEntityId, &Camera::CameraComponentRequests::GetNearClipDistance);
  90. return retNearZ;
  91. }
  92. void SetNearZAndFOVIfChanged(float fov, float nearZ) override
  93. {
  94. float degFoV = AZ::RadToDeg(fov);
  95. if (!AZ::IsClose(GetFoV(), degFoV, FLT_EPSILON))
  96. {
  97. Camera::CameraRequestBus::Event(m_cameraEntityId, &Camera::CameraComponentRequests::SetFovDegrees, degFoV);
  98. }
  99. if (!AZ::IsClose(GetNearZ(), nearZ, FLT_EPSILON))
  100. {
  101. Camera::CameraRequestBus::Event(m_cameraEntityId, &Camera::CameraComponentRequests::SetNearClipDistance, nearZ);
  102. }
  103. }
  104. void TransformPositionFromLocalToWorldSpace(Vec3& position) override
  105. {
  106. AZ::EntityId parentId;
  107. AZ::TransformBus::EventResult(parentId, m_cameraEntityId, &AZ::TransformBus::Events::GetParentId);
  108. if (parentId.IsValid())
  109. {
  110. AZ::Vector3 pos(position.x, position.y, position.z);
  111. AZ::Transform worldTM;
  112. AZ::TransformBus::EventResult(worldTM, parentId, &AZ::TransformBus::Events::GetWorldTM);
  113. pos = worldTM.TransformPoint(pos);
  114. position.Set(pos.GetX(), pos.GetY(), pos.GetZ());
  115. }
  116. }
  117. void TransformPositionFromWorldToLocalSpace(Vec3& position) override
  118. {
  119. AZ::EntityId parentId;
  120. AZ::TransformBus::EventResult(parentId, m_cameraEntityId, &AZ::TransformBus::Events::GetParentId);
  121. if (parentId.IsValid())
  122. {
  123. AZ::Vector3 pos(position.x, position.y, position.z);
  124. AZ::Transform worldTM;
  125. AZ::TransformBus::EventResult(worldTM, parentId, &AZ::TransformBus::Events::GetWorldTM);
  126. worldTM = worldTM.GetInverse();
  127. pos = worldTM.TransformPoint(pos);
  128. position.Set(pos.GetX(), pos.GetY(), pos.GetZ());
  129. }
  130. }
  131. void TransformRotationFromLocalToWorldSpace(Quat& rotation) override
  132. {
  133. AZ::EntityId parentId;
  134. AZ::TransformBus::EventResult(parentId, m_cameraEntityId, &AZ::TransformBus::Events::GetParentId);
  135. if (parentId.IsValid())
  136. {
  137. AZ::Quaternion rot = LYQuaternionToAZQuaternion(rotation);
  138. AZ::Transform worldTM;
  139. AZ::TransformBus::EventResult(worldTM, parentId, &AZ::TransformBus::Events::GetWorldTM);
  140. AZ::Quaternion worldRot = worldTM.GetRotation();
  141. rot = worldRot * rot;
  142. rotation = AZQuaternionToLYQuaternion(rot);
  143. }
  144. }
  145. void SetWorldRotation(const Quat& rotation) override
  146. {
  147. AZ::EntityId parentId;
  148. AZ::TransformBus::EventResult(parentId, m_cameraEntityId, &AZ::TransformBus::Events::GetParentId);
  149. if (parentId.IsValid())
  150. {
  151. AZ::Quaternion rot = LYQuaternionToAZQuaternion(rotation);
  152. AZ::Transform parentWorldTM;
  153. AZ::Transform worldTM;
  154. AZ::TransformBus::EventResult(parentWorldTM, parentId, &AZ::TransformBus::Events::GetWorldTM);
  155. AZ::TransformBus::EventResult(worldTM, m_cameraEntityId, &AZ::TransformBus::Events::GetWorldTM);
  156. parentWorldTM.SetRotation(rot);
  157. parentWorldTM.SetTranslation(worldTM.GetTranslation());
  158. AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetWorldTM, parentWorldTM);
  159. }
  160. else
  161. {
  162. SetRotation(rotation);
  163. }
  164. }
  165. bool HasParent() const override
  166. {
  167. AZ::EntityId parentId;
  168. AZ::TransformBus::EventResult(parentId, m_cameraEntityId, &AZ::TransformBus::Events::GetParentId);
  169. return parentId.IsValid();
  170. }
  171. private:
  172. AZ::EntityId m_cameraEntityId;
  173. mutable Vec3 m_vec3Buffer; // buffer for returning references
  174. mutable Quat m_quatBuffer; // buffer for returning references
  175. };
  176. }
  177. //////////////////////////////////////////////////////////////////////////
  178. CAnimSceneNode::CAnimSceneNode(const int id)
  179. : CAnimNode(id, AnimNodeType::Director)
  180. {
  181. m_lastCameraKey = -1;
  182. m_lastEventKey = -1;
  183. m_lastConsoleKey = -1;
  184. m_lastSequenceKey = -1;
  185. m_nLastGotoKey = -1;
  186. m_lastCaptureKey = -1;
  187. m_bLastCapturingEnded = true;
  188. m_captureFrameCount = 0;
  189. m_pCamNodeOnHoldForInterp = nullptr;
  190. m_CurrentSelectTrack = nullptr;
  191. m_CurrentSelectTrackKeyNumber = 0;
  192. m_lastPrecachePoint = -1.f;
  193. SetName("Scene");
  194. CAnimSceneNode::Initialize();
  195. SetFlags(GetFlags() | eAnimNodeFlags_CanChangeName);
  196. }
  197. //////////////////////////////////////////////////////////////////////////
  198. CAnimSceneNode::CAnimSceneNode()
  199. : CAnimSceneNode(0)
  200. {
  201. }
  202. //////////////////////////////////////////////////////////////////////////
  203. CAnimSceneNode::~CAnimSceneNode()
  204. {
  205. ReleaseSounds();
  206. }
  207. //////////////////////////////////////////////////////////////////////////
  208. void CAnimSceneNode::Initialize()
  209. {
  210. if (!s_nodeParamsInitialized)
  211. {
  212. s_nodeParamsInitialized = true;
  213. s_nodeParams.reserve(9);
  214. AddSupportedParam("Camera", AnimParamType::Camera, AnimValueType::Select);
  215. AddSupportedParam("Event", AnimParamType::Event, AnimValueType::Unknown);
  216. AddSupportedParam("Sound", AnimParamType::Sound, AnimValueType::Unknown);
  217. AddSupportedParam("Sequence", AnimParamType::Sequence, AnimValueType::Unknown);
  218. AddSupportedParam("Console", AnimParamType::Console, AnimValueType::Unknown);
  219. AddSupportedParam("GoTo", AnimParamType::Goto, AnimValueType::DiscreteFloat);
  220. AddSupportedParam("Capture", AnimParamType::Capture, AnimValueType::Unknown);
  221. AddSupportedParam("Timewarp", AnimParamType::TimeWarp, AnimValueType::Float);
  222. AddSupportedParam("FixedTimeStep", AnimParamType::FixedTimeStep, AnimValueType::Float);
  223. }
  224. }
  225. //////////////////////////////////////////////////////////////////////////
  226. void CAnimSceneNode::CreateDefaultTracks()
  227. {
  228. CreateTrack(AnimParamType::Camera);
  229. };
  230. //////////////////////////////////////////////////////////////////////////
  231. unsigned int CAnimSceneNode::GetParamCount() const
  232. {
  233. return static_cast<unsigned int>(s_nodeParams.size());
  234. }
  235. //////////////////////////////////////////////////////////////////////////
  236. CAnimParamType CAnimSceneNode::GetParamType(unsigned int nIndex) const
  237. {
  238. if (nIndex < s_nodeParams.size())
  239. {
  240. return s_nodeParams[nIndex].paramType;
  241. }
  242. return AnimParamType::Invalid;
  243. }
  244. //////////////////////////////////////////////////////////////////////////
  245. bool CAnimSceneNode::GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const
  246. {
  247. for (int i = 0; i < (int)s_nodeParams.size(); i++)
  248. {
  249. if (s_nodeParams[i].paramType == paramId)
  250. {
  251. info = s_nodeParams[i];
  252. return true;
  253. }
  254. }
  255. return false;
  256. }
  257. //////////////////////////////////////////////////////////////////////////
  258. void CAnimSceneNode::Activate(bool bActivate)
  259. {
  260. CAnimNode::Activate(bActivate);
  261. int trackCount = NumTracks();
  262. for (int paramIndex = 0; paramIndex < trackCount; paramIndex++)
  263. {
  264. CAnimParamType paramId = m_tracks[paramIndex]->GetParameterType();
  265. IAnimTrack* pTrack = m_tracks[paramIndex].get();
  266. if (paramId.GetType() != AnimParamType::Sequence)
  267. {
  268. continue;
  269. }
  270. CSequenceTrack* pSequenceTrack = (CSequenceTrack*)pTrack;
  271. for (int currKey = 0; currKey < pSequenceTrack->GetNumKeys(); currKey++)
  272. {
  273. ISequenceKey key;
  274. pSequenceTrack->GetKey(currKey, &key);
  275. IAnimSequence* pSequence = GetSequenceFromSequenceKey(key);
  276. if (pSequence)
  277. {
  278. if (bActivate)
  279. {
  280. pSequence->Activate();
  281. if (key.bOverrideTimes)
  282. {
  283. key.fDuration = (key.fEndTime - key.fStartTime) > 0.0f ? (key.fEndTime - key.fStartTime) : 0.0f;
  284. }
  285. else
  286. {
  287. key.fDuration = pSequence->GetTimeRange().Length();
  288. }
  289. pTrack->SetKey(currKey, &key);
  290. }
  291. else
  292. {
  293. pSequence->Deactivate();
  294. }
  295. }
  296. }
  297. }
  298. }
  299. //////////////////////////////////////////////////////////////////////////
  300. void CAnimSceneNode::Animate(SAnimContext& ec)
  301. {
  302. if (ec.resetting)
  303. {
  304. return;
  305. }
  306. CSelectTrack* cameraTrack = nullptr;
  307. CEventTrack* pEventTrack = nullptr;
  308. CSequenceTrack* pSequenceTrack = nullptr;
  309. CConsoleTrack* pConsoleTrack = nullptr;
  310. CGotoTrack* pGotoTrack = nullptr;
  311. CCaptureTrack* pCaptureTrack = nullptr;
  312. /*
  313. bool bTimeJump = false;
  314. if (ec.time < m_time)
  315. bTimeJump = true;
  316. */
  317. if (gEnv->IsEditor() && m_time > ec.time)
  318. {
  319. m_lastPrecachePoint = -1.f;
  320. }
  321. PrecacheDynamic(ec.time);
  322. size_t nNumAudioTracks = 0;
  323. int trackCount = NumTracks();
  324. for (int paramIndex = 0; paramIndex < trackCount; paramIndex++)
  325. {
  326. CAnimParamType paramId = m_tracks[paramIndex]->GetParameterType();
  327. IAnimTrack* pTrack = m_tracks[paramIndex].get();
  328. if (pTrack->GetFlags() & IAnimTrack::eAnimTrackFlags_Disabled)
  329. {
  330. continue;
  331. }
  332. if (pTrack->IsMasked(ec.trackMask))
  333. {
  334. continue;
  335. }
  336. switch (paramId.GetType())
  337. {
  338. case AnimParamType::Camera:
  339. cameraTrack = (CSelectTrack*)pTrack;
  340. break;
  341. case AnimParamType::Event:
  342. pEventTrack = (CEventTrack*)pTrack;
  343. break;
  344. case AnimParamType::Sequence:
  345. pSequenceTrack = (CSequenceTrack*)pTrack;
  346. break;
  347. case AnimParamType::Console:
  348. pConsoleTrack = (CConsoleTrack*)pTrack;
  349. break;
  350. case AnimParamType::Capture:
  351. pCaptureTrack = (CCaptureTrack*)pTrack;
  352. break;
  353. case AnimParamType::Goto:
  354. pGotoTrack = (CGotoTrack*)pTrack;
  355. break;
  356. case AnimParamType::Sound:
  357. ++nNumAudioTracks;
  358. if (nNumAudioTracks > m_SoundInfo.size())
  359. {
  360. m_SoundInfo.resize(nNumAudioTracks);
  361. }
  362. AnimateSound(m_SoundInfo, ec, pTrack, nNumAudioTracks);
  363. break;
  364. case AnimParamType::TimeWarp:
  365. {
  366. float timeScale = 1.0f;
  367. pTrack->GetValue(ec.time, timeScale);
  368. if (timeScale < .0f)
  369. {
  370. timeScale = .0f;
  371. }
  372. if (auto* timeSystem = AZ::Interface<AZ::ITime>::Get())
  373. {
  374. m_simulationTickOverrideBackup = timeSystem->GetSimulationTickDeltaOverride();
  375. // if set, disable fixed time step cvar so timewarping will have an affect.
  376. timeSystem->SetSimulationTickDeltaOverride(AZ::Time::ZeroTimeMs);
  377. m_timeScaleBackup = timeSystem->GetSimulationTickScale();
  378. timeSystem->SetSimulationTickScale(timeScale);
  379. }
  380. }
  381. break;
  382. case AnimParamType::FixedTimeStep:
  383. {
  384. float timeStep = 0;
  385. pTrack->GetValue(ec.time, timeStep);
  386. if (timeStep < 0)
  387. {
  388. timeStep = 0;
  389. }
  390. if (auto* timeSystem = AZ::Interface<AZ::ITime>::Get())
  391. {
  392. m_simulationTickOverrideBackup = timeSystem->GetSimulationTickDeltaOverride();
  393. // if set, disable fixed time step cvar so timewarping will have an affect.
  394. timeSystem->SetSimulationTickDeltaOverride(AZ::SecondsToTimeMs(timeStep));
  395. }
  396. }
  397. break;
  398. }
  399. }
  400. // Animate Camera Track (aka Select Track)
  401. // Check if a camera override is set by CVar
  402. const char* overrideCamName = m_movieSystem->GetOverrideCamName();
  403. AZ::EntityId overrideCamId;
  404. if (overrideCamName != nullptr && strlen(overrideCamName) > 0)
  405. {
  406. // overriding with a Camera Component entity is done by entityId (as names are not unique among AZ::Entities) - try to convert string to u64 to see if it's an id
  407. AZ::u64 u64Id = strtoull(overrideCamName, nullptr, /*base (radix)*/ 10);
  408. if (u64Id)
  409. {
  410. overrideCamId = AZ::EntityId(u64Id);
  411. }
  412. }
  413. if (overrideCamId.IsValid()) // There is a valid overridden camera.
  414. {
  415. if (overrideCamId != m_movieSystem->GetCameraParams().cameraEntityId)
  416. {
  417. ISelectKey key;
  418. key.szSelection = overrideCamName;
  419. key.cameraAzEntityId = overrideCamId;
  420. ApplyCameraKey(key, ec);
  421. }
  422. }
  423. else if (cameraTrack) // No camera override by CVar, use the camera track
  424. {
  425. ISelectKey key;
  426. int cameraKey = cameraTrack->GetActiveKey(ec.time, &key);
  427. m_CurrentSelectTrackKeyNumber = cameraKey;
  428. m_CurrentSelectTrack = cameraTrack;
  429. ApplyCameraKey(key, ec);
  430. m_lastCameraKey = cameraKey;
  431. }
  432. if (pEventTrack)
  433. {
  434. IEventKey key;
  435. int nEventKey = pEventTrack->GetActiveKey(ec.time, &key);
  436. if (nEventKey != m_lastEventKey && nEventKey >= 0)
  437. {
  438. bool bNotTrigger = key.bNoTriggerInScrubbing && ec.singleFrame && key.time != ec.time;
  439. if (!bNotTrigger)
  440. {
  441. ApplyEventKey(key, ec);
  442. }
  443. }
  444. m_lastEventKey = nEventKey;
  445. }
  446. if (pConsoleTrack)
  447. {
  448. IConsoleKey key;
  449. int nConsoleKey = pConsoleTrack->GetActiveKey(ec.time, &key);
  450. if (nConsoleKey != m_lastConsoleKey && nConsoleKey >= 0)
  451. {
  452. if (!ec.singleFrame || key.time == ec.time) // If Single frame update key time must match current time.
  453. {
  454. ApplyConsoleKey(key, ec);
  455. }
  456. }
  457. m_lastConsoleKey = nConsoleKey;
  458. }
  459. if (pSequenceTrack)
  460. {
  461. ISequenceKey key;
  462. int nSequenceKey = pSequenceTrack->GetActiveKey(ec.time, &key);
  463. IAnimSequence* pSequence = GetSequenceFromSequenceKey(key);
  464. if (!gEnv->IsEditing() && (nSequenceKey != m_lastSequenceKey || !GetMovieSystem()->IsPlaying(pSequence)))
  465. {
  466. ApplySequenceKey(pSequenceTrack, m_lastSequenceKey, nSequenceKey, key, ec);
  467. }
  468. m_lastSequenceKey = nSequenceKey;
  469. }
  470. if (pGotoTrack)
  471. {
  472. ApplyGotoKey(pGotoTrack, ec);
  473. }
  474. if (pCaptureTrack && m_movieSystem->IsInBatchRenderMode() == false)
  475. {
  476. ICaptureKey key;
  477. int nCaptureKey = pCaptureTrack->GetActiveKey(ec.time, &key);
  478. bool justEnded = false;
  479. if (!m_bLastCapturingEnded && key.time + key.duration < ec.time)
  480. {
  481. justEnded = true;
  482. }
  483. if (!ec.singleFrame && !(gEnv->IsEditor() && gEnv->IsEditing()))
  484. {
  485. if (nCaptureKey != m_lastCaptureKey && nCaptureKey >= 0)
  486. {
  487. if (m_bLastCapturingEnded == false)
  488. {
  489. assert(0);
  490. m_movieSystem->EndCapture();
  491. m_bLastCapturingEnded = true;
  492. }
  493. m_movieSystem->EnableFixedStepForCapture(key.timeStep);
  494. m_movieSystem->StartCapture(key, m_captureFrameCount);
  495. if (key.once == false)
  496. {
  497. m_bLastCapturingEnded = false;
  498. }
  499. m_lastCaptureKey = nCaptureKey;
  500. }
  501. else if (justEnded)
  502. {
  503. m_movieSystem->DisableFixedStepForCapture();
  504. m_movieSystem->EndCapture();
  505. m_bLastCapturingEnded = true;
  506. }
  507. }
  508. m_captureFrameCount++;
  509. }
  510. m_time = ec.time;
  511. if (m_pOwner)
  512. {
  513. m_pOwner->OnNodeAnimated(this);
  514. }
  515. }
  516. //////////////////////////////////////////////////////////////////////////
  517. void CAnimSceneNode::OnReset()
  518. {
  519. if (m_lastSequenceKey >= 0)
  520. {
  521. {
  522. int trackCount = NumTracks();
  523. for (int paramIndex = 0; paramIndex < trackCount; paramIndex++)
  524. {
  525. CAnimParamType paramId = m_tracks[paramIndex]->GetParameterType();
  526. IAnimTrack* pTrack = m_tracks[paramIndex].get();
  527. if (paramId.GetType() != AnimParamType::Sequence)
  528. {
  529. continue;
  530. }
  531. CSequenceTrack* pSequenceTrack = (CSequenceTrack*)pTrack;
  532. ISequenceKey prevKey;
  533. pSequenceTrack->GetKey(m_lastSequenceKey, &prevKey);
  534. IAnimSequence* sequence = GetSequenceFromSequenceKey(prevKey);
  535. if (sequence)
  536. {
  537. GetMovieSystem()->StopSequence(sequence);
  538. }
  539. }
  540. }
  541. }
  542. // If the last capturing hasn't finished properly, end it here.
  543. if (m_bLastCapturingEnded == false)
  544. {
  545. GetMovieSystem()->EndCapture();
  546. m_bLastCapturingEnded = true;
  547. }
  548. m_lastEventKey = -1;
  549. m_lastConsoleKey = -1;
  550. m_lastSequenceKey = -1;
  551. m_nLastGotoKey = -1;
  552. m_lastCaptureKey = -1;
  553. m_bLastCapturingEnded = true;
  554. m_captureFrameCount = 0;
  555. if (auto* timeSystem = AZ::Interface<AZ::ITime>::Get())
  556. {
  557. if (GetTrackForParameter(AnimParamType::TimeWarp))
  558. {
  559. timeSystem->SetSimulationTickScale(m_timeScaleBackup);
  560. timeSystem->SetSimulationTickDeltaOverride(m_simulationTickOverrideBackup);
  561. }
  562. if (GetTrackForParameter(AnimParamType::FixedTimeStep))
  563. {
  564. timeSystem->SetSimulationTickDeltaOverride(m_simulationTickOverrideBackup);
  565. }
  566. }
  567. }
  568. //////////////////////////////////////////////////////////////////////////
  569. void CAnimSceneNode::OnStart()
  570. {
  571. ResetSounds();
  572. }
  573. void CAnimSceneNode::OnPause()
  574. {
  575. }
  576. void CAnimSceneNode::OnLoop()
  577. {
  578. ResetSounds();
  579. }
  580. void CAnimSceneNode::OnStop()
  581. {
  582. ReleaseSounds();
  583. }
  584. //////////////////////////////////////////////////////////////////////////
  585. void CAnimSceneNode::ResetSounds()
  586. {
  587. for (int i = static_cast<int>(m_SoundInfo.size()); --i >= 0; )
  588. {
  589. m_SoundInfo[i].Reset();
  590. }
  591. }
  592. //////////////////////////////////////////////////////////////////////////
  593. void CAnimSceneNode::ReleaseSounds()
  594. {
  595. // Stop all sounds on the global audio object,
  596. // but we want to have it filter based on the owner (this)
  597. // so we don't stop sounds that didn't originate with track view.
  598. if (auto audioSystem = AZ::Interface<Audio::IAudioSystem>::Get(); audioSystem != nullptr)
  599. {
  600. Audio::ObjectRequest::StopAllTriggers stopAll;
  601. stopAll.m_filterByOwner = true;
  602. stopAll.m_owner = this;
  603. audioSystem->PushRequest(AZStd::move(stopAll));
  604. }
  605. }
  606. //////////////////////////////////////////////////////////////////////////
  607. // InterpolateCameras()
  608. //
  609. // This rather long function takes care of the interpolation (or blending) of
  610. // two camera keys, specifically FoV, nearZ, position and rotation blending.
  611. //
  612. void CAnimSceneNode::InterpolateCameras(SCameraParams& retInterpolatedCameraParams, ISceneCamera* firstCamera,
  613. ISelectKey& firstKey, ISelectKey& secondKey, float time)
  614. {
  615. if (!secondKey.cameraAzEntityId.IsValid())
  616. {
  617. // abort - can't interpolate if there isn't a valid Id for a component entity camera
  618. return;
  619. }
  620. float interpolatedFoV;
  621. ISceneCamera* secondCamera = static_cast<ISceneCamera*>(new CComponentEntitySceneCamera(secondKey.cameraAzEntityId));
  622. float t = 1 - ((secondKey.time - time) / firstKey.fBlendTime);
  623. t = min(t, 1.0f);
  624. t = aznumeric_cast<float>(pow(t, 3) * (t * (t * 6 - 15) + 10)); // use a cubic curve for the camera blend
  625. bool haveStashedInterpData = (m_InterpolatingCameraStartStates.find(m_CurrentSelectTrackKeyNumber) != m_InterpolatingCameraStartStates.end());
  626. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  627. // at the start of the blend, stash the starting point first camera data to use throughout the interpolation
  628. if (!haveStashedInterpData)
  629. {
  630. InterpolatingCameraStartState camData;
  631. camData.m_interpolatedCamFirstPos = firstCamera->GetPosition();
  632. camData.m_interpolatedCamFirstRot = firstCamera->GetRotation();
  633. // stash FoV from the first camera entity
  634. camData.m_FoV = firstCamera->GetFoV();
  635. // stash nearZ
  636. camData.m_nearZ = firstCamera->GetNearZ();
  637. m_InterpolatingCameraStartStates.insert(AZStd::make_pair(m_CurrentSelectTrackKeyNumber, camData));
  638. }
  639. const auto& retStashedInterpCamData = m_InterpolatingCameraStartStates.find(m_CurrentSelectTrackKeyNumber);
  640. InterpolatingCameraStartState stashedInterpCamData = retStashedInterpCamData->second;
  641. // interpolate FOV
  642. float secondCameraFOV = secondCamera->GetFoV();
  643. interpolatedFoV = stashedInterpCamData.m_FoV + (secondCameraFOV - stashedInterpCamData.m_FoV) * t;
  644. // store the interpolated FoV to be returned, in radians
  645. retInterpolatedCameraParams.fov = DEG2RAD(interpolatedFoV);
  646. // interpolate NearZ
  647. float secondCameraNearZ = secondCamera->GetNearZ();
  648. retInterpolatedCameraParams.nearZ = stashedInterpCamData.m_nearZ + (secondCameraNearZ - stashedInterpCamData.m_nearZ) * t;
  649. // update the Camera entity's component FOV and nearZ directly if needed (if they weren't set via anim node SetParamValue() above)
  650. firstCamera->SetNearZAndFOVIfChanged(retInterpolatedCameraParams.fov, retInterpolatedCameraParams.nearZ);
  651. ////////////////////////
  652. // interpolate Position
  653. Vec3 vFirstCamPos = stashedInterpCamData.m_interpolatedCamFirstPos;
  654. Vec3 secondKeyPos = secondCamera->GetPosition();
  655. Vec3 interpolatedPos = vFirstCamPos + (secondKeyPos - vFirstCamPos) * t;
  656. firstCamera->SetPosition(interpolatedPos);
  657. ////////////////////////
  658. // interpolate Rotation
  659. Quat firstCameraRotation = stashedInterpCamData.m_interpolatedCamFirstRot;
  660. Quat secondCameraRotation = secondCamera->GetRotation();
  661. Quat interpolatedRotation;
  662. interpolatedRotation.SetSlerp(firstCameraRotation, secondCameraRotation, t);
  663. firstCamera->SetWorldRotation(interpolatedRotation);
  664. // clean-up
  665. if (secondCamera)
  666. {
  667. delete secondCamera;
  668. }
  669. }
  670. //////////////////////////////////////////////////////////////////////////
  671. void CAnimSceneNode::ApplyCameraKey(ISelectKey& key, SAnimContext& ec)
  672. {
  673. ISelectKey nextKey;
  674. int nextCameraKeyNumber = m_CurrentSelectTrackKeyNumber + 1;
  675. bool bInterpolateCamera = false;
  676. if (nextCameraKeyNumber < m_CurrentSelectTrack->GetNumKeys())
  677. {
  678. m_CurrentSelectTrack->GetKey(nextCameraKeyNumber, &nextKey);
  679. float fInterTime = nextKey.time - ec.time;
  680. if (fInterTime >= 0 && fInterTime <= key.fBlendTime)
  681. {
  682. bInterpolateCamera = true;
  683. }
  684. }
  685. // check if we're finished interpolating and there is a camera node on hold for interpolation. If so, unset it from hold.
  686. if (!bInterpolateCamera && m_pCamNodeOnHoldForInterp)
  687. {
  688. m_pCamNodeOnHoldForInterp->SetSkipInterpolatedCameraNode(false);
  689. m_pCamNodeOnHoldForInterp = nullptr;
  690. }
  691. SCameraParams cameraParams;
  692. cameraParams.cameraEntityId.SetInvalid();
  693. cameraParams.fov = 0;
  694. cameraParams.justActivated = true;
  695. // With component entities, the fov and near plane may be animated on an
  696. // entity with a Camera component. Don't stomp the values if this update happens
  697. // after those properties are animated.
  698. ///////////////////////////////////////////////////////////////////
  699. // find the Scene Camera (Camera Component Camera)
  700. ISceneCamera* firstSceneCamera = nullptr;
  701. if (key.cameraAzEntityId.IsValid())
  702. {
  703. // camera component entity
  704. cameraParams.cameraEntityId = key.cameraAzEntityId;
  705. firstSceneCamera = static_cast<ISceneCamera*>(new CComponentEntitySceneCamera(key.cameraAzEntityId));
  706. }
  707. if (firstSceneCamera)
  708. {
  709. cameraParams.fov = DEG2RAD(firstSceneCamera->GetFoV());
  710. }
  711. if (bInterpolateCamera && firstSceneCamera)
  712. {
  713. InterpolateCameras(cameraParams, firstSceneCamera, key, nextKey, ec.time);
  714. }
  715. // Broadcast camera changes
  716. const SCameraParams& lastCameraParams = m_movieSystem->GetCameraParams();
  717. if (lastCameraParams.cameraEntityId != cameraParams.cameraEntityId)
  718. {
  719. Maestro::SequenceComponentNotificationBus::Event(
  720. m_pSequence->GetSequenceEntityId(), &Maestro::SequenceComponentNotificationBus::Events::OnCameraChanged,
  721. lastCameraParams.cameraEntityId, cameraParams.cameraEntityId);
  722. // note: only update the active view if we're currently exporting/capturing a sequence
  723. if (m_movieSystem->IsInBatchRenderMode())
  724. {
  725. Camera::CameraRequestBus::Event(
  726. cameraParams.cameraEntityId, &Camera::CameraRequestBus::Events::MakeActiveView);
  727. }
  728. }
  729. m_movieSystem->SetCameraParams(cameraParams);
  730. // This detects when we've switched from one Camera to another on the Camera Track
  731. // If cameras were interpolated (blended), reset cameras to their pre-interpolated positions and
  732. // clean up cached data used for the interpolation
  733. if (m_lastCameraKey != m_CurrentSelectTrackKeyNumber && m_lastCameraKey >= 0)
  734. {
  735. const auto& retStashedData = m_InterpolatingCameraStartStates.find(m_lastCameraKey);
  736. if (retStashedData != m_InterpolatingCameraStartStates.end())
  737. {
  738. InterpolatingCameraStartState stashedData = retStashedData->second;
  739. ISelectKey prevKey;
  740. ISceneCamera* prevSceneCamera = nullptr;
  741. m_CurrentSelectTrack->GetKey(m_lastCameraKey, &prevKey);
  742. if (prevKey.cameraAzEntityId.IsValid())
  743. {
  744. prevSceneCamera = static_cast<ISceneCamera*>(new CComponentEntitySceneCamera(prevKey.cameraAzEntityId));
  745. }
  746. if (prevSceneCamera)
  747. {
  748. prevSceneCamera->SetPosition(stashedData.m_interpolatedCamFirstPos);
  749. prevSceneCamera->SetRotation(stashedData.m_interpolatedCamFirstRot);
  750. }
  751. IAnimNode* prevCameraAnimNode = m_pSequence->FindNodeByName(prevKey.szSelection.c_str(), this);
  752. if (prevCameraAnimNode == nullptr)
  753. {
  754. prevCameraAnimNode = m_pSequence->FindNodeByName(prevKey.szSelection.c_str(), nullptr);
  755. }
  756. if (prevSceneCamera)
  757. {
  758. prevSceneCamera->SetNearZAndFOVIfChanged(DEG2RAD(stashedData.m_FoV), stashedData.m_nearZ);
  759. }
  760. m_InterpolatingCameraStartStates.erase(m_lastCameraKey);
  761. // clean up
  762. if (prevSceneCamera)
  763. {
  764. delete prevSceneCamera;
  765. }
  766. }
  767. }
  768. // clean up
  769. if (firstSceneCamera)
  770. {
  771. delete firstSceneCamera;
  772. }
  773. }
  774. //////////////////////////////////////////////////////////////////////////
  775. void CAnimSceneNode::ApplyEventKey(IEventKey& key, [[maybe_unused]] SAnimContext& ec)
  776. {
  777. char funcName[1024];
  778. azstrcpy(funcName, AZ_ARRAY_SIZE(funcName), "Event_");
  779. azstrcat(funcName, AZ_ARRAY_SIZE(funcName), key.event.c_str());
  780. m_movieSystem->SendGlobalEvent(funcName);
  781. }
  782. //////////////////////////////////////////////////////////////////////////
  783. void CAnimSceneNode::ApplyAudioKey(char const* const sTriggerName, bool const bPlay /* = true */)
  784. {
  785. Audio::TAudioControlID nAudioTriggerID = INVALID_AUDIO_CONTROL_ID;
  786. if (auto audioSystem = AZ::Interface<Audio::IAudioSystem>::Get(); audioSystem != nullptr)
  787. {
  788. nAudioTriggerID = audioSystem->GetAudioTriggerID(sTriggerName);
  789. if (nAudioTriggerID != INVALID_AUDIO_CONTROL_ID)
  790. {
  791. if (bPlay)
  792. {
  793. Audio::ObjectRequest::ExecuteTrigger execTrigger;
  794. execTrigger.m_triggerId = nAudioTriggerID;
  795. execTrigger.m_owner = this;
  796. audioSystem->PushRequest(AZStd::move(execTrigger));
  797. }
  798. else
  799. {
  800. Audio::ObjectRequest::StopTrigger stopTrigger;
  801. stopTrigger.m_triggerId = nAudioTriggerID;
  802. stopTrigger.m_owner = this;
  803. audioSystem->PushRequest(AZStd::move(stopTrigger));
  804. }
  805. }
  806. }
  807. }
  808. //////////////////////////////////////////////////////////////////////////
  809. void CAnimSceneNode::ApplySequenceKey(IAnimTrack* pTrack, [[maybe_unused]] int nPrevKey, int nCurrKey, ISequenceKey& key, SAnimContext& ec)
  810. {
  811. if (nCurrKey < 0)
  812. {
  813. return;
  814. }
  815. IAnimSequence* pSequence = GetSequenceFromSequenceKey(key);
  816. if (!pSequence)
  817. {
  818. return;
  819. }
  820. if (key.bOverrideTimes)
  821. {
  822. key.fDuration = (key.fEndTime - key.fStartTime) > 0.0f ? (key.fEndTime - key.fStartTime) : 0.0f;
  823. }
  824. else
  825. {
  826. key.fDuration = pSequence->GetTimeRange().Length();
  827. }
  828. pTrack->SetKey(nCurrKey, &key);
  829. SAnimContext newAnimContext = ec;
  830. newAnimContext.time = std::min(ec.time - key.time + key.fStartTime, key.fDuration + key.fStartTime);
  831. if (static_cast<CAnimSequence*>(pSequence)->GetTime() != newAnimContext.time)
  832. {
  833. pSequence->Animate(newAnimContext);
  834. }
  835. }
  836. //////////////////////////////////////////////////////////////////////////
  837. void CAnimSceneNode::ApplyConsoleKey(IConsoleKey& key, [[maybe_unused]] SAnimContext& ec)
  838. {
  839. if (!key.command.empty())
  840. {
  841. gEnv->pConsole->ExecuteString(key.command.c_str());
  842. }
  843. }
  844. void CAnimSceneNode::ApplyGotoKey(CGotoTrack* poGotoTrack, SAnimContext& ec)
  845. {
  846. IDiscreteFloatKey stDiscreteFloadKey;
  847. int nCurrentActiveKeyIndex(-1);
  848. nCurrentActiveKeyIndex = poGotoTrack->GetActiveKey(ec.time, &stDiscreteFloadKey);
  849. if (nCurrentActiveKeyIndex != m_nLastGotoKey && nCurrentActiveKeyIndex >= 0)
  850. {
  851. if (!ec.singleFrame)
  852. {
  853. if (stDiscreteFloadKey.m_fValue >= 0)
  854. {
  855. AZStd::string fullname = m_pSequence->GetName();
  856. GetMovieSystem()->GoToFrame(fullname.c_str(), stDiscreteFloadKey.m_fValue);
  857. }
  858. }
  859. }
  860. m_nLastGotoKey = nCurrentActiveKeyIndex;
  861. }
  862. /// @deprecated Serialization for Sequence data in Component Entity Sequences now occurs through AZ::SerializeContext and the Sequence Component
  863. void CAnimSceneNode::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks)
  864. {
  865. CAnimNode::Serialize(xmlNode, bLoading, bLoadEmptyTracks);
  866. // To enable renaming even for previously saved director nodes
  867. SetFlags(GetFlags() | eAnimNodeFlags_CanChangeName);
  868. }
  869. void CAnimSceneNode::Reflect(AZ::ReflectContext* context)
  870. {
  871. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  872. {
  873. serializeContext->Class<CAnimSceneNode, CAnimNode>()
  874. ->Version(1);
  875. }
  876. }
  877. void CAnimSceneNode::PrecacheStatic(float startTime)
  878. {
  879. m_lastPrecachePoint = -1.f;
  880. const uint numTracks = GetTrackCount();
  881. for (uint trackIndex = 0; trackIndex < numTracks; ++trackIndex)
  882. {
  883. IAnimTrack* pAnimTrack = GetTrackByIndex(trackIndex);
  884. if (pAnimTrack->GetParameterType() == AnimParamType::Sequence)
  885. {
  886. CSequenceTrack* pSequenceTrack = static_cast<CSequenceTrack*>(pAnimTrack);
  887. const uint numKeys = pSequenceTrack->GetNumKeys();
  888. for (uint keyIndex = 0; keyIndex < numKeys; ++keyIndex)
  889. {
  890. ISequenceKey key;
  891. pSequenceTrack->GetKey(keyIndex, &key);
  892. CAnimSequence* pSubSequence = static_cast<CAnimSequence*>(GetSequenceFromSequenceKey(key));
  893. if (pSubSequence)
  894. {
  895. pSubSequence->PrecacheStatic(startTime - (key.fStartTime + key.time));
  896. }
  897. }
  898. }
  899. }
  900. }
  901. void CAnimSceneNode::PrecacheDynamic(float time)
  902. {
  903. const uint numTracks = GetTrackCount();
  904. float fLastPrecachePoint = m_lastPrecachePoint;
  905. for (uint trackIndex = 0; trackIndex < numTracks; ++trackIndex)
  906. {
  907. IAnimTrack* pAnimTrack = GetTrackByIndex(trackIndex);
  908. if (pAnimTrack->GetParameterType() == AnimParamType::Sequence)
  909. {
  910. CSequenceTrack* pSequenceTrack = static_cast<CSequenceTrack*>(pAnimTrack);
  911. const uint numKeys = pSequenceTrack->GetNumKeys();
  912. for (uint keyIndex = 0; keyIndex < numKeys; ++keyIndex)
  913. {
  914. ISequenceKey key;
  915. pSequenceTrack->GetKey(keyIndex, &key);
  916. CAnimSequence* pSubSequence = static_cast<CAnimSequence*>(GetSequenceFromSequenceKey(key));
  917. if (pSubSequence)
  918. {
  919. pSubSequence->PrecacheDynamic(time - (key.fStartTime + key.time));
  920. }
  921. }
  922. }
  923. else if (pAnimTrack->GetParameterType() == AnimParamType::Camera)
  924. {
  925. const float fPrecacheCameraTime = CMovieSystem::m_mov_cameraPrecacheTime;
  926. if (fPrecacheCameraTime > 0.f)
  927. {
  928. CSelectTrack* pCameraTrack = static_cast<CSelectTrack*>(pAnimTrack);
  929. ISelectKey key;
  930. pCameraTrack->GetActiveKey(time + fPrecacheCameraTime, &key);
  931. if (time < key.time && (time + fPrecacheCameraTime) > key.time && key.time > m_lastPrecachePoint)
  932. {
  933. fLastPrecachePoint = max(key.time, fLastPrecachePoint);
  934. }
  935. }
  936. }
  937. }
  938. m_lastPrecachePoint = fLastPrecachePoint;
  939. }
  940. void CAnimSceneNode::InitializeTrackDefaultValue(IAnimTrack* pTrack, const CAnimParamType& paramType)
  941. {
  942. if (paramType.GetType() == AnimParamType::TimeWarp)
  943. {
  944. pTrack->SetValue(0.0f, 1.0f, true);
  945. }
  946. }
  947. /*static*/ IAnimSequence* CAnimSceneNode::GetSequenceFromSequenceKey(const ISequenceKey& sequenceKey)
  948. {
  949. IAnimSequence* retSequence = nullptr;
  950. IMovieSystem* movieSystem = AZ::Interface<IMovieSystem>::Get();
  951. if (movieSystem)
  952. {
  953. if (sequenceKey.sequenceEntityId.IsValid())
  954. {
  955. retSequence = movieSystem->FindSequence(sequenceKey.sequenceEntityId);
  956. }
  957. else if (!sequenceKey.szSelection.empty())
  958. {
  959. // legacy Deprecate ISequenceKey used names to identify sequences
  960. retSequence = movieSystem->FindLegacySequenceByName(sequenceKey.szSelection.c_str());
  961. }
  962. }
  963. return retSequence;
  964. }
  965. #undef s_nodeParamsInitialized
  966. #undef s_nodeParams
  967. #undef AddSupportedParam