SceneNode.cpp 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118
  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 = gEnv->pMovieSystem->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 != gEnv->pMovieSystem->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 && gEnv->pMovieSystem->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. gEnv->pMovieSystem->EndCapture();
  491. m_bLastCapturingEnded = true;
  492. }
  493. gEnv->pMovieSystem->EnableFixedStepForCapture(key.timeStep);
  494. gEnv->pMovieSystem->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. gEnv->pMovieSystem->DisableFixedStepForCapture();
  504. gEnv->pMovieSystem->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 = gEnv->pMovieSystem->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 (gEnv->pMovieSystem->IsInBatchRenderMode())
  724. {
  725. Camera::CameraRequestBus::Event(
  726. cameraParams.cameraEntityId, &Camera::CameraRequestBus::Events::MakeActiveView);
  727. }
  728. }
  729. gEnv->pMovieSystem->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 (prevCameraAnimNode && prevCameraAnimNode->GetType() == AnimNodeType::Camera && prevCameraAnimNode->GetTrackForParameter(AnimParamType::FOV))
  757. {
  758. prevCameraAnimNode->SetParamValue(ec.time, AnimParamType::FOV, stashedData.m_FoV);
  759. }
  760. else if (prevSceneCamera)
  761. {
  762. prevSceneCamera->SetNearZAndFOVIfChanged(DEG2RAD(stashedData.m_FoV), stashedData.m_nearZ);
  763. }
  764. m_InterpolatingCameraStartStates.erase(m_lastCameraKey);
  765. // clean up
  766. if (prevSceneCamera)
  767. {
  768. delete prevSceneCamera;
  769. }
  770. }
  771. }
  772. // clean up
  773. if (firstSceneCamera)
  774. {
  775. delete firstSceneCamera;
  776. }
  777. }
  778. //////////////////////////////////////////////////////////////////////////
  779. void CAnimSceneNode::ApplyEventKey(IEventKey& key, [[maybe_unused]] SAnimContext& ec)
  780. {
  781. char funcName[1024];
  782. azstrcpy(funcName, AZ_ARRAY_SIZE(funcName), "Event_");
  783. azstrcat(funcName, AZ_ARRAY_SIZE(funcName), key.event.c_str());
  784. gEnv->pMovieSystem->SendGlobalEvent(funcName);
  785. }
  786. //////////////////////////////////////////////////////////////////////////
  787. void CAnimSceneNode::ApplyAudioKey(char const* const sTriggerName, bool const bPlay /* = true */)
  788. {
  789. Audio::TAudioControlID nAudioTriggerID = INVALID_AUDIO_CONTROL_ID;
  790. if (auto audioSystem = AZ::Interface<Audio::IAudioSystem>::Get(); audioSystem != nullptr)
  791. {
  792. nAudioTriggerID = audioSystem->GetAudioTriggerID(sTriggerName);
  793. if (nAudioTriggerID != INVALID_AUDIO_CONTROL_ID)
  794. {
  795. if (bPlay)
  796. {
  797. Audio::ObjectRequest::ExecuteTrigger execTrigger;
  798. execTrigger.m_triggerId = nAudioTriggerID;
  799. execTrigger.m_owner = this;
  800. audioSystem->PushRequest(AZStd::move(execTrigger));
  801. }
  802. else
  803. {
  804. Audio::ObjectRequest::StopTrigger stopTrigger;
  805. stopTrigger.m_triggerId = nAudioTriggerID;
  806. stopTrigger.m_owner = this;
  807. audioSystem->PushRequest(AZStd::move(stopTrigger));
  808. }
  809. }
  810. }
  811. }
  812. //////////////////////////////////////////////////////////////////////////
  813. void CAnimSceneNode::ApplySequenceKey(IAnimTrack* pTrack, [[maybe_unused]] int nPrevKey, int nCurrKey, ISequenceKey& key, SAnimContext& ec)
  814. {
  815. if (nCurrKey < 0)
  816. {
  817. return;
  818. }
  819. IAnimSequence* pSequence = GetSequenceFromSequenceKey(key);
  820. if (!pSequence)
  821. {
  822. return;
  823. }
  824. if (key.bOverrideTimes)
  825. {
  826. key.fDuration = (key.fEndTime - key.fStartTime) > 0.0f ? (key.fEndTime - key.fStartTime) : 0.0f;
  827. }
  828. else
  829. {
  830. key.fDuration = pSequence->GetTimeRange().Length();
  831. }
  832. pTrack->SetKey(nCurrKey, &key);
  833. SAnimContext newAnimContext = ec;
  834. newAnimContext.time = std::min(ec.time - key.time + key.fStartTime, key.fDuration + key.fStartTime);
  835. if (static_cast<CAnimSequence*>(pSequence)->GetTime() != newAnimContext.time)
  836. {
  837. pSequence->Animate(newAnimContext);
  838. }
  839. }
  840. //////////////////////////////////////////////////////////////////////////
  841. void CAnimSceneNode::ApplyConsoleKey(IConsoleKey& key, [[maybe_unused]] SAnimContext& ec)
  842. {
  843. if (!key.command.empty())
  844. {
  845. gEnv->pConsole->ExecuteString(key.command.c_str());
  846. }
  847. }
  848. void CAnimSceneNode::ApplyGotoKey(CGotoTrack* poGotoTrack, SAnimContext& ec)
  849. {
  850. IDiscreteFloatKey stDiscreteFloadKey;
  851. int nCurrentActiveKeyIndex(-1);
  852. nCurrentActiveKeyIndex = poGotoTrack->GetActiveKey(ec.time, &stDiscreteFloadKey);
  853. if (nCurrentActiveKeyIndex != m_nLastGotoKey && nCurrentActiveKeyIndex >= 0)
  854. {
  855. if (!ec.singleFrame)
  856. {
  857. if (stDiscreteFloadKey.m_fValue >= 0)
  858. {
  859. AZStd::string fullname = m_pSequence->GetName();
  860. GetMovieSystem()->GoToFrame(fullname.c_str(), stDiscreteFloadKey.m_fValue);
  861. }
  862. }
  863. }
  864. m_nLastGotoKey = nCurrentActiveKeyIndex;
  865. }
  866. /// @deprecated Serialization for Sequence data in Component Entity Sequences now occurs through AZ::SerializeContext and the Sequence Component
  867. void CAnimSceneNode::Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks)
  868. {
  869. CAnimNode::Serialize(xmlNode, bLoading, bLoadEmptyTracks);
  870. // To enable renaming even for previously saved director nodes
  871. SetFlags(GetFlags() | eAnimNodeFlags_CanChangeName);
  872. }
  873. void CAnimSceneNode::Reflect(AZ::ReflectContext* context)
  874. {
  875. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  876. {
  877. serializeContext->Class<CAnimSceneNode, CAnimNode>()
  878. ->Version(1);
  879. }
  880. }
  881. void CAnimSceneNode::PrecacheStatic(float startTime)
  882. {
  883. m_lastPrecachePoint = -1.f;
  884. const uint numTracks = GetTrackCount();
  885. for (uint trackIndex = 0; trackIndex < numTracks; ++trackIndex)
  886. {
  887. IAnimTrack* pAnimTrack = GetTrackByIndex(trackIndex);
  888. if (pAnimTrack->GetParameterType() == AnimParamType::Sequence)
  889. {
  890. CSequenceTrack* pSequenceTrack = static_cast<CSequenceTrack*>(pAnimTrack);
  891. const uint numKeys = pSequenceTrack->GetNumKeys();
  892. for (uint keyIndex = 0; keyIndex < numKeys; ++keyIndex)
  893. {
  894. ISequenceKey key;
  895. pSequenceTrack->GetKey(keyIndex, &key);
  896. CAnimSequence* pSubSequence = static_cast<CAnimSequence*>(GetSequenceFromSequenceKey(key));
  897. if (pSubSequence)
  898. {
  899. pSubSequence->PrecacheStatic(startTime - (key.fStartTime + key.time));
  900. }
  901. }
  902. }
  903. }
  904. }
  905. void CAnimSceneNode::PrecacheDynamic(float time)
  906. {
  907. const uint numTracks = GetTrackCount();
  908. float fLastPrecachePoint = m_lastPrecachePoint;
  909. for (uint trackIndex = 0; trackIndex < numTracks; ++trackIndex)
  910. {
  911. IAnimTrack* pAnimTrack = GetTrackByIndex(trackIndex);
  912. if (pAnimTrack->GetParameterType() == AnimParamType::Sequence)
  913. {
  914. CSequenceTrack* pSequenceTrack = static_cast<CSequenceTrack*>(pAnimTrack);
  915. const uint numKeys = pSequenceTrack->GetNumKeys();
  916. for (uint keyIndex = 0; keyIndex < numKeys; ++keyIndex)
  917. {
  918. ISequenceKey key;
  919. pSequenceTrack->GetKey(keyIndex, &key);
  920. CAnimSequence* pSubSequence = static_cast<CAnimSequence*>(GetSequenceFromSequenceKey(key));
  921. if (pSubSequence)
  922. {
  923. pSubSequence->PrecacheDynamic(time - (key.fStartTime + key.time));
  924. }
  925. }
  926. }
  927. else if (pAnimTrack->GetParameterType() == AnimParamType::Camera)
  928. {
  929. const float fPrecacheCameraTime = CMovieSystem::m_mov_cameraPrecacheTime;
  930. if (fPrecacheCameraTime > 0.f)
  931. {
  932. CSelectTrack* pCameraTrack = static_cast<CSelectTrack*>(pAnimTrack);
  933. ISelectKey key;
  934. pCameraTrack->GetActiveKey(time + fPrecacheCameraTime, &key);
  935. if (time < key.time && (time + fPrecacheCameraTime) > key.time && key.time > m_lastPrecachePoint)
  936. {
  937. fLastPrecachePoint = max(key.time, fLastPrecachePoint);
  938. }
  939. }
  940. }
  941. }
  942. m_lastPrecachePoint = fLastPrecachePoint;
  943. }
  944. void CAnimSceneNode::InitializeTrackDefaultValue(IAnimTrack* pTrack, const CAnimParamType& paramType)
  945. {
  946. if (paramType.GetType() == AnimParamType::TimeWarp)
  947. {
  948. pTrack->SetValue(0.0f, 1.0f, true);
  949. }
  950. }
  951. /*static*/ IAnimSequence* CAnimSceneNode::GetSequenceFromSequenceKey(const ISequenceKey& sequenceKey)
  952. {
  953. IAnimSequence* retSequence = nullptr;
  954. if (gEnv && gEnv->pMovieSystem)
  955. {
  956. if (sequenceKey.sequenceEntityId.IsValid())
  957. {
  958. retSequence = gEnv->pMovieSystem->FindSequence(sequenceKey.sequenceEntityId);
  959. }
  960. else if (!sequenceKey.szSelection.empty())
  961. {
  962. // legacy Deprecate ISequenceKey used names to identify sequences
  963. retSequence = gEnv->pMovieSystem->FindLegacySequenceByName(sequenceKey.szSelection.c_str());
  964. }
  965. }
  966. return retSequence;
  967. }
  968. #undef s_nodeParamsInitialized
  969. #undef s_nodeParams
  970. #undef AddSupportedParam