Line data Source code
1 : /* Copyright (C) 2020 Wildfire Games.
2 : * This file is part of 0 A.D.
3 : *
4 : * 0 A.D. is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 2 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * 0 A.D. is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 : */
17 :
18 : /**
19 : * Contains classes for smooth splines
20 : * Borrowed from Game Programming Gems 4. (Slightly changed to better suit our purposes
21 : * and compatability. Any references to external material can be found there.
22 : */
23 :
24 : #ifndef INCLUDED_NUSPLINE
25 : #define INCLUDED_NUSPLINE
26 :
27 : #define MAX_SPLINE_NODES 128
28 :
29 : #include "FixedVector3D.h"
30 : #include "Vector3D.h"
31 :
32 : #include <vector>
33 :
34 : /**
35 : * Describes a node of the spline
36 : */
37 8 : struct SplineData
38 : {
39 : // Should be fixed, because used in the simulation
40 : CFixedVector3D Position;
41 : CVector3D Velocity;
42 : // TODO: make rotation as other spline
43 : CFixedVector3D Rotation;
44 : // Time interval to the previous node, should be 0 for the first node
45 : fixed Distance;
46 : };
47 :
48 :
49 : /**
50 : * Rounded Nonuniform Spline for describing spatial curves or paths with constant speed
51 : */
52 24 : class RNSpline
53 : {
54 : public:
55 :
56 : RNSpline();
57 : virtual ~RNSpline();
58 :
59 : void AddNode(const CFixedVector3D& pos);
60 : void BuildSpline();
61 : CVector3D GetPosition(float time) const;
62 : CVector3D GetRotation(float time) const;
63 : const std::vector<SplineData>& GetAllNodes() const;
64 :
65 : fixed MaxDistance;
66 : int NodeCount;
67 :
68 : protected:
69 :
70 : std::vector<SplineData> Node;
71 : CVector3D GetStartVelocity(int index);
72 : CVector3D GetEndVelocity(int index);
73 : };
74 :
75 :
76 : /**
77 : * Smooth Nonuniform Spline for describing paths with smooth acceleration and deceleration,
78 : * but without turning
79 : */
80 32 : class SNSpline : public RNSpline
81 : {
82 : public:
83 : virtual ~SNSpline();
84 :
85 : void BuildSpline();
86 : void Smooth();
87 : };
88 :
89 :
90 : /**
91 : * Timed Nonuniform Spline for paths with different time intervals between nodes
92 : */
93 32 : class TNSpline : public SNSpline
94 : {
95 : public:
96 : virtual ~TNSpline();
97 :
98 : void AddNode(const CFixedVector3D& pos, const CFixedVector3D& rotation, fixed timePeriod);
99 : void InsertNode(const int index, const CFixedVector3D& pos, const CFixedVector3D& rotation, fixed timePeriod);
100 : void RemoveNode(const int index);
101 : void UpdateNodePos(const int index, const CFixedVector3D& pos);
102 : void UpdateNodeTime(const int index, fixed time);
103 :
104 : void BuildSpline();
105 : void Smooth();
106 : void Constrain();
107 : };
108 :
109 : #endif // INCLUDED_NUSPLINE
|