1#include "CinematicCameraSystem.h"
2#include "Components/Core/TransformComponent.h"
4#include "Foundation/Logging/Logger.h"
12Cogs::Core::CinematicCameraSystem::~CinematicCameraSystem()
21 &EasingFn::quadraticIn, &EasingFn::quadraticOut, &EasingFn::quadraticInOut,
22 &EasingFn::cubicIn, &EasingFn::cubicOut, &EasingFn::cubicInOut,
23 &EasingFn::quarticIn, &EasingFn::quarticOut, &EasingFn::quarticInOut,
24 &EasingFn::quinticIn, &EasingFn::quinticOut, &EasingFn::quinticInOut,
25 &EasingFn::sinusoidalIn, &EasingFn::sinusoidalOut, &EasingFn::sinusoidalInOut,
26 &EasingFn::exponentialIn, &EasingFn::exponentialOut, &EasingFn::exponentialInOut,
27 &EasingFn::circularIn, &EasingFn::circularOut, &EasingFn::circularInOut,
28 &EasingFn::elasticIn, &EasingFn::elasticOut, &EasingFn::elasticInOut,
29 &EasingFn::backIn, &EasingFn::backOut, &EasingFn::backInOut,
30 &EasingFn::bounceIn, &EasingFn::bounceOut, &EasingFn::bounceInOut };
35 for (
auto& cinematicCamComp : pool)
39 if (cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointRotation.size()
40 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointTimeToReach.size()
41 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointWaitingTime.size()
42 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointEasingMode.size())
44 LOG_ERROR(logger,
"Mismatching size of component data arrays, cannot interpolate with incomplete data");
48 auto& compData = getData(&cinematicCamComp);
51 if (cinematicCamComp.hasChanged())
53 if (!compData.positionInterpolator && !compData.rotationInterpolator && transform !=
nullptr)
56 compData.positionInterpolator = std::make_unique<Cogs::Interpolator<glm::vec3>>(transform->position);
57 compData.rotationInterpolator = std::make_unique<Cogs::Interpolator<glm::quat>>(transform->rotation);
60 if (cinematicCamComp.isCinematicPlaying)
62 triggerTargetPoint(cinematicCamComp, 0);
63 compData.currentRunningID = 0;
68 if (cinematicCamComp.isCinematicPlaying)
70 if (compData.timer.elapsedSeconds() >=
71 cinematicCamComp.interestPointTimeToReach[compData.currentRunningID] + cinematicCamComp.interestPointWaitingTime[compData.currentRunningID])
73 compData.timer.stop();
76 if (!triggerTargetPoint(cinematicCamComp, ++(compData.currentRunningID)))
83 compData.positionInterpolator->process();
84 compData.rotationInterpolator->process();
85 if(transform !=
nullptr)
86 transform->setChanged();
93 for (
auto& cinematicCamComp : pool)
95 auto& compData = getData(&cinematicCamComp);
96 if (compData.positionInterpolator) compData.positionInterpolator =
nullptr;
97 if (compData.rotationInterpolator) compData.rotationInterpolator =
nullptr;
103 for (
auto& cinematicCamComp : pool)
106 if (std::addressof(targetComp) == std::addressof(cinematicCamComp))
109 if (transform !=
nullptr)
111 cinematicCamComp.interestPointPosition.push_back(transform->position);
112 cinematicCamComp.interestPointRotation.push_back(transform->rotation);
113 cinematicCamComp.interestPointTimeToReach.push_back(3.f);
114 cinematicCamComp.interestPointWaitingTime.push_back(3.f);
115 cinematicCamComp.interestPointEasingMode.push_back(CameraEasingMode::Linear);
124 for (
auto& cinematicCamComp : pool)
127 if (std::addressof(targetComp) == std::addressof(cinematicCamComp))
129 cinematicCamComp.interestPointPosition.push_back(pos);
130 cinematicCamComp.interestPointRotation.push_back(rot);
131 cinematicCamComp.interestPointTimeToReach.push_back(time);
132 cinematicCamComp.interestPointWaitingTime.push_back(waitTime);
133 cinematicCamComp.interestPointEasingMode.push_back(mode);
141 for (
auto& cinematicCamComp : pool)
144 if (std::addressof(targetComp) == std::addressof(cinematicCamComp))
146 auto& compData = getData(&cinematicCamComp);
149 if (cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointRotation.size()
150 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointTimeToReach.size()
151 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointWaitingTime.size()
152 || cinematicCamComp.interestPointPosition.size() != cinematicCamComp.interestPointEasingMode.size())
154 LOG_ERROR(logger,
"Mismatching size of component data arrays, cannot interpolate with incomplete data");
161 cinematicCamComp.isCinematicPlaying =
true;
162 triggerTargetPoint(targetComp, 0);
163 compData.currentRunningID = 0;
174 for (
auto& cinematicCamComp : pool)
177 if (std::addressof(targetComp) == std::addressof(cinematicCamComp))
179 auto& compData = getData(&cinematicCamComp);
180 if (
id < cinematicCamComp.interestPointPosition.size())
183 compData.positionInterpolator->setTarget(cinematicCamComp.interestPointPosition[
id], easingFn[(
size_t)cinematicCamComp.interestPointEasingMode[
id]], cinematicCamComp.interestPointTimeToReach[
id]);
184 compData.rotationInterpolator->setTarget(cinematicCamComp.interestPointRotation[
id], easingFn[(
size_t)cinematicCamComp.interestPointEasingMode[
id]], cinematicCamComp.interestPointTimeToReach[
id]);
187 compData.positionInterpolator->process();
188 compData.rotationInterpolator->process();
189 compData.timer.start();
195 if (cinematicCamComp.loop)
197 playCameraSequence(cinematicCamComp);
203 cinematicCamComp.isCinematicPlaying =
false;
204 compData.currentRunningID = -1;
205 cinematicCamComp.setChanged();
void addInterestPoint(const CinematicCameraComponent &targetComp)
Add default point (camPos, camRot, 2.0f, 2.0f, linear)
void cleanup(Context *context) override
Provided for custom cleanup logic in derived systems.
bool triggerTargetPoint(const CinematicCameraComponent &targetComp, const short &id=0)
Trigger Interpolator segment "id" belonging to interpolator [{start,0},...,{n-1,n}].
void playCameraSequence(const CinematicCameraComponent &targetComp)
Notify system to start playing the whole sequence.
void initialize(Context *context) override
Initialize the system.
virtual void initialize(Context *context)
Initialize the system.
void update()
Updates the system state to that of the current frame.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept