2006-04-24 01:14:18 +02:00
|
|
|
|
|
|
|
#ifndef H_CinemaTracks_H
|
|
|
|
#define H_CinemaTracks_H
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
#include <map>
|
2006-06-02 04:10:27 +02:00
|
|
|
#include "ps/CStr.h"
|
|
|
|
#include "maths/NUSpline.h"
|
2006-04-24 01:14:18 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
Andrew (aka pyrolink)
|
|
|
|
Contact: ajdecker1022@msn.com
|
|
|
|
desc: contains various functions used for cinematic camera tracks
|
2006-08-22 04:24:44 +02:00
|
|
|
See also: CinemaHandler.cpp, Cinematic.h/.cpp
|
2006-04-24 01:14:18 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
class CVector3D;
|
|
|
|
class CVector4D;
|
|
|
|
class CCamera;
|
|
|
|
|
|
|
|
//For loading data
|
|
|
|
class CCinemaData
|
|
|
|
{
|
2006-07-06 05:17:44 +02:00
|
|
|
public:
|
2006-08-22 04:24:44 +02:00
|
|
|
CCinemaData() : m_GrowthCount(0), m_Growth(0), m_Switch(0),
|
|
|
|
m_Mode(0), m_Style(0) {}
|
|
|
|
virtual ~CCinemaData() {}
|
2006-07-06 05:17:44 +02:00
|
|
|
|
|
|
|
const CCinemaData* GetData() const { return this; }
|
|
|
|
|
2006-04-24 01:14:18 +02:00
|
|
|
CVector3D m_TotalRotation;
|
|
|
|
|
|
|
|
//Distortion variables
|
2006-08-22 04:24:44 +02:00
|
|
|
mutable float m_GrowthCount;
|
2006-04-24 01:14:18 +02:00
|
|
|
float m_Growth;
|
|
|
|
float m_Switch;
|
|
|
|
int m_Mode;
|
|
|
|
int m_Style;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
//Once the data is part of the path, it shouldn't be changeable
|
|
|
|
class CCinemaPath : private CCinemaData, public TNSpline
|
2006-04-24 01:14:18 +02:00
|
|
|
{
|
2006-08-22 04:24:44 +02:00
|
|
|
//friend class CCinemaTrack;
|
2006-04-24 01:14:18 +02:00
|
|
|
public:
|
2006-07-06 05:17:44 +02:00
|
|
|
CCinemaPath(const CCinemaData& data, const TNSpline& spline);
|
2006-04-24 01:14:18 +02:00
|
|
|
~CCinemaPath() { DistStylePtr = NULL; DistModePtr = NULL; }
|
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
enum { EM_IN, EM_OUT, EM_INOUT, EM_OUTIN };
|
|
|
|
enum { ES_DEFAULT, ES_GROWTH, ES_EXPO, ES_CIRCLE, ES_SINE };
|
|
|
|
|
2006-04-24 01:14:18 +02:00
|
|
|
//sets camera position to calculated point on spline
|
|
|
|
void MoveToPointAt(float t, const CVector3D &startRotation);
|
|
|
|
|
|
|
|
//Distortion mode functions-change how ratio is passed to distortion style functions
|
2006-08-22 04:24:44 +02:00
|
|
|
float EaseIn(float t) const;
|
|
|
|
float EaseOut(float t) const;
|
|
|
|
float EaseInOut(float t) const;
|
|
|
|
float EaseOutIn(float t) const;
|
2006-04-24 01:14:18 +02:00
|
|
|
|
|
|
|
//Distortion style functions
|
2006-08-22 04:24:44 +02:00
|
|
|
float EaseDefault(float t) const;
|
|
|
|
float EaseGrowth(float t) const;
|
|
|
|
float EaseExpo(float t) const;
|
|
|
|
float EaseCircle(float t) const;
|
|
|
|
float EaseSine(float t) const;
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
float (CCinemaPath::*DistStylePtr)(float ratio) const;
|
|
|
|
float (CCinemaPath::*DistModePtr)(float ratio) const;
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
const CCinemaData* GetData() const { return CCinemaData::GetData(); }
|
|
|
|
|
2006-04-24 01:14:18 +02:00
|
|
|
public:
|
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
void DrawSpline(const CVector4D& RGBA, int smoothness, bool lines) const;
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
inline CVector3D GetNodePosition(const int index) const { return Node[index].Position; }
|
|
|
|
inline float GetNodeDuration(const int index) const { return Node[index].Distance; }
|
|
|
|
inline float GetDuration() const { return MaxDistance; }
|
|
|
|
inline float GetElapsedTime() const { return m_TimeElapsed; }
|
|
|
|
const std::vector<SplineData>& GetAllNodes() const { return Node; }
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
float m_TimeElapsed;
|
2006-04-24 01:14:18 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class CCinemaTrack
|
|
|
|
{
|
2006-07-06 05:17:44 +02:00
|
|
|
friend class CCinemaManager;
|
2006-04-24 01:14:18 +02:00
|
|
|
public:
|
2006-08-22 04:24:44 +02:00
|
|
|
CCinemaTrack();
|
2006-04-24 01:14:18 +02:00
|
|
|
~CCinemaTrack() {}
|
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
void AddPath(const CCinemaData& data, const TNSpline& spline);
|
|
|
|
void AddPath(const CCinemaPath& path);
|
|
|
|
inline void SetTimescale(float scale) { m_Timescale = scale; }
|
2006-07-06 05:17:44 +02:00
|
|
|
inline void SetStartRotation(CVector3D rotation) { m_StartRotation = rotation; }
|
|
|
|
void UpdateDuration();
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
//Returns false if finished
|
2006-07-06 05:17:44 +02:00
|
|
|
bool Play(float DeltaTime);
|
|
|
|
bool Validate();
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
inline const CVector3D& GetRotation() const { return m_StartRotation; }
|
2006-08-22 04:24:44 +02:00
|
|
|
inline float GetTimescale() const { return m_Timescale; }
|
2006-07-06 05:17:44 +02:00
|
|
|
inline float GetTotalDuration() const { return m_TotalDuration; }
|
|
|
|
inline const std::vector<CCinemaPath>& GetAllPaths() const { return m_Paths; }
|
2006-08-22 04:24:44 +02:00
|
|
|
|
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
private:
|
|
|
|
std::vector<CCinemaPath> m_Paths;
|
|
|
|
std::vector<CCinemaPath>::iterator m_CPA; //current path
|
|
|
|
CVector3D m_StartRotation;
|
2006-08-22 04:24:44 +02:00
|
|
|
float m_Timescale; //a negative timescale results in backwards play
|
2006-07-06 05:17:44 +02:00
|
|
|
float m_AbsoluteTime; //Current time of track, in absolute terms (not path)
|
|
|
|
float m_TotalDuration;
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
bool ValidateForward();
|
|
|
|
bool ValidateRewind();
|
2006-08-22 04:24:44 +02:00
|
|
|
CVector3D CalculateRotation();
|
2006-07-06 05:17:44 +02:00
|
|
|
};
|
2006-04-24 01:14:18 +02:00
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
//Class for in game playing of cinematics. Should only be instantiated
|
|
|
|
//in CGameView.
|
2006-04-24 01:14:18 +02:00
|
|
|
class CCinemaManager
|
|
|
|
{
|
|
|
|
public:
|
2006-08-22 04:24:44 +02:00
|
|
|
CCinemaManager();
|
2006-04-24 01:14:18 +02:00
|
|
|
~CCinemaManager() {}
|
2006-08-22 04:24:44 +02:00
|
|
|
|
2006-07-20 16:37:58 +02:00
|
|
|
void AddTrack(CCinemaTrack track, const CStrW& name);
|
2006-08-22 04:24:44 +02:00
|
|
|
|
|
|
|
//Adds track to list of being played.
|
2006-07-20 16:37:58 +02:00
|
|
|
void QueueTrack(const CStrW& name, bool queue);
|
|
|
|
void OverrideTrack(const CStrW& name); //clears track queue and replaces with 'name'
|
2006-04-24 01:14:18 +02:00
|
|
|
bool Update(float DeltaTime);
|
2006-07-06 05:17:44 +02:00
|
|
|
|
2006-08-22 04:24:44 +02:00
|
|
|
//These stop track play, and accept time, not ratio of time
|
|
|
|
void MoveToPointAt(float time);
|
|
|
|
void MoveToPointAbsolute(float time); //Time in terms of track
|
|
|
|
|
|
|
|
inline void StopPlaying() { m_TrackQueue.clear(); }
|
|
|
|
void DrawAllSplines() const;
|
|
|
|
|
2006-07-06 05:17:44 +02:00
|
|
|
inline bool IsPlaying() const { return !m_TrackQueue.empty(); }
|
2006-08-22 04:24:44 +02:00
|
|
|
bool HasTrack(const CStrW& name) const;
|
2006-07-06 05:17:44 +02:00
|
|
|
inline bool IsActive() const { return m_Active; }
|
|
|
|
inline void SetActive(bool active) { m_Active=active; }
|
|
|
|
|
|
|
|
inline const std::map<CStrW, CCinemaTrack>& GetAllTracks() { return m_Tracks; }
|
2006-08-22 04:24:44 +02:00
|
|
|
void SetAllTracks( const std::map<CStrW, CCinemaTrack>& tracks);
|
|
|
|
void SetCurrentTrack(const CStrW& name, bool all, bool current, bool lines);
|
|
|
|
void SetCurrentPath(int path);
|
|
|
|
|
2006-04-24 01:14:18 +02:00
|
|
|
private:
|
2006-08-22 04:24:44 +02:00
|
|
|
bool m_Active, m_DrawCurrentSpline, m_DrawAllSplines, m_DrawLines;
|
|
|
|
int m_CurrentPath;
|
|
|
|
CCinemaTrack* m_CurrentTrack;
|
2006-07-06 05:17:44 +02:00
|
|
|
std::map<CStrW, CCinemaTrack> m_Tracks;
|
2006-04-24 01:14:18 +02:00
|
|
|
std::list<CCinemaTrack> m_TrackQueue;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|