1
0
forked from 0ad/0ad

Move some methods out of the headers. Patch by Vladislav. Refs #3814

This was SVN commit r18000.
This commit is contained in:
sanderd17 2016-04-07 17:47:30 +00:00
parent 524d35ffdc
commit 22bbe450e4
4 changed files with 112 additions and 23 deletions

View File

@ -194,6 +194,41 @@ void CCinemaPath::DrawNodes(const CVector4D& RGBA) const
#endif
}
CVector3D CCinemaPath::GetNodePosition(const int index) const
{
return Node[index].Position;
}
fixed CCinemaPath::GetNodeDuration(const int index) const
{
return Node[index].Distance;
}
fixed CCinemaPath::GetDuration() const
{
return MaxDistance;
}
float CCinemaPath::GetNodeFraction() const
{
return (m_TimeElapsed - m_PreviousNodeTime) / Node[m_CurrentNode].Distance.ToFloat();
}
float CCinemaPath::GetElapsedTime() const
{
return m_TimeElapsed;
}
CStrW CCinemaPath::GetName() const
{
return m_Name;
}
void CCinemaPath::SetTimescale(fixed scale)
{
m_Timescale = scale;
}
void CCinemaPath::MoveToPointAt(float t, float nodet, const CVector3D& startRotation)
{
CCamera *camera = g_Game->GetView()->GetCamera();
@ -288,6 +323,11 @@ float CCinemaPath::EaseSine(float t) const
return t;
}
const CCinemaData* CCinemaPath::GetData() const
{
return CCinemaData::GetData();
}
bool CCinemaPath::Validate()
{
if (m_TimeElapsed > GetDuration().ToFloat() || m_TimeElapsed < 0.0f)
@ -324,4 +364,19 @@ bool CCinemaPath::Play(const float deltaRealTime)
MoveToPointAt(m_TimeElapsed / GetDuration().ToFloat(), GetNodeFraction(), m_PreviousRotation);
return true;
}
}
bool CCinemaPath::Empty() const
{
return Node.empty();
}
fixed CCinemaPath::GetTimescale() const
{
return m_Timescale;
}
const TNSpline& CCinemaPath::getTargetSpline() const
{
return m_TargetSpline;
}

View File

@ -59,7 +59,6 @@ class CCinemaPath : private CCinemaData, public TNSpline
public:
CCinemaPath() : m_TimeElapsed(0), m_PreviousNodeTime(0) {}
CCinemaPath(const CCinemaData& data, const TNSpline& spline, const TNSpline& targetSpline);
~CCinemaPath() { DistStylePtr = NULL; DistModePtr = NULL; }
// Sets camera position to calculated point on spline
void MoveToPointAt(float t, float nodet, const CVector3D&);
@ -80,7 +79,7 @@ public:
float (CCinemaPath::*DistStylePtr)(float ratio) const;
float (CCinemaPath::*DistModePtr)(float ratio) const;
const CCinemaData* GetData() const { return CCinemaData::GetData(); }
const CCinemaData* GetData() const;
public:
@ -88,16 +87,16 @@ public:
void DrawSpline(const RNSpline& spline, const CVector4D& RGBA, int smoothness, bool lines) const;
void DrawNodes(const CVector4D& RGBA) const;
inline CVector3D GetNodePosition(const int index) const { return Node[index].Position; }
inline fixed GetNodeDuration(const int index) const { return Node[index].Distance; }
inline fixed GetDuration() const { return MaxDistance; }
CVector3D GetNodePosition(const int index) const;
fixed GetNodeDuration(const int index) const;
fixed GetDuration() const;
inline float GetNodeFraction() const { return (m_TimeElapsed - m_PreviousNodeTime) / Node[m_CurrentNode].Distance.ToFloat(); }
inline float GetElapsedTime() const { return m_TimeElapsed; }
float GetNodeFraction() const;
float GetElapsedTime() const;
CStrW GetName() const { return m_Name; }
CStrW GetName() const;
inline void SetTimescale(fixed scale) { m_Timescale = scale; }
void SetTimescale(fixed scale);
float m_TimeElapsed;
float m_PreviousNodeTime; // How much time has passed before the current node
@ -122,11 +121,11 @@ public:
/**
* Returns true if path doesn't contain nodes
*/
bool Empty() { return Node.empty(); }
bool Empty() const;
fixed GetTimescale() const { return m_Timescale; }
fixed GetTimescale() const;
const TNSpline& getTargetSpline() const { return m_TargetSpline; }
const TNSpline& getTargetSpline() const;
private:

View File

@ -44,6 +44,11 @@ CVector3D GetPositionOnCubic(const CVector3D& startPos, const CVector3D& startVe
/*********************************** R N S **************************************************/
RNSpline::RNSpline()
: NodeCount(0)
{
}
// adds node and updates segment length
void RNSpline::AddNode(const CFixedVector3D& pos)
{
@ -124,6 +129,11 @@ CVector3D RNSpline::GetPosition(float time) const
Node[i+1].Position, endVel, t);
}
const std::vector<SplineData>& RNSpline::GetAllNodes() const
{
return Node;
}
// internal. Based on Equation 14
CVector3D RNSpline::GetStartVelocity(int index)
{
@ -144,6 +154,13 @@ CVector3D RNSpline::GetEndVelocity(int index)
/*********************************** S N S **************************************************/
void SNSpline::BuildSpline()
{
RNSpline::BuildSpline();
for (int i = 0; i < 3; ++i)
Smooth();
}
// smoothing filter.
void SNSpline::Smooth()
{
@ -223,6 +240,7 @@ void TNSpline::RemoveNode(const int index)
Node.erase(Node.begin() + index, Node.begin() + index + 1);
--NodeCount;
}
void TNSpline::UpdateNodeTime(const int index, fixed time)
{
if (NodeCount == 0 || index > NodeCount - 1)
@ -230,6 +248,7 @@ void TNSpline::UpdateNodeTime(const int index, fixed time)
Node[index].Distance = time;
}
void TNSpline::UpdateNodePos(const int index, const CFixedVector3D& pos)
{
if (NodeCount == 0 || index > NodeCount - 1)
@ -238,6 +257,22 @@ void TNSpline::UpdateNodePos(const int index, const CFixedVector3D& pos)
Node[index].Position = pos;
}
void TNSpline::BuildSpline()
{
RNSpline::BuildSpline();
for (int i = 0; i < 3; ++i)
Smooth();
}
void TNSpline::Smooth()
{
for (int i = 0; i < 3; ++i)
{
SNSpline::Smooth();
Constrain();
}
}
void TNSpline::Constrain()
{
if (NodeCount < 3)

View File

@ -51,14 +51,14 @@ class RNSpline
{
public:
RNSpline() { NodeCount = 0; }
virtual ~RNSpline() {}
RNSpline();
virtual ~RNSpline() = default;
void AddNode(const CFixedVector3D& pos);
void BuildSpline();
CVector3D GetPosition(float time) const;
CVector3D GetRotation(float time) const;
const std::vector<SplineData>& GetAllNodes() const { return Node; }
const std::vector<SplineData>& GetAllNodes() const;
fixed MaxDistance;
int NodeCount;
@ -78,8 +78,9 @@ protected:
class SNSpline : public RNSpline
{
public:
virtual ~SNSpline() {}
void BuildSpline(){ RNSpline::BuildSpline(); Smooth(); Smooth(); Smooth(); }
virtual ~SNSpline() = default;
void BuildSpline();
void Smooth();
};
@ -90,17 +91,16 @@ public:
class TNSpline : public SNSpline
{
public:
virtual ~TNSpline() {}
virtual ~TNSpline() = default;
void AddNode(const CFixedVector3D& pos, const CFixedVector3D& rotation, fixed timePeriod);
void PushNode() { Node.push_back( SplineData() ); }
void InsertNode(const int index, const CFixedVector3D& pos, const CFixedVector3D& rotation, fixed timePeriod);
void RemoveNode(const int index);
void UpdateNodeTime(const int index, fixed time);
void UpdateNodePos(const int index, const CFixedVector3D& pos);
void UpdateNodeTime(const int index, fixed time);
void BuildSpline(){ RNSpline::BuildSpline(); Smooth(); Smooth(); Smooth(); }
void Smooth(){ for (int x = 0; x < 3; ++x) { SNSpline::Smooth(); Constrain(); } }
void BuildSpline();
void Smooth();
void Constrain();
};