1 /* Copyright (C) 2017 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 #ifndef INCLUDED_SHAREDTYPES
19 #define INCLUDED_SHAREDTYPES
20
21 #include "Shareable.h"
22
23 #include <string>
24
25 class wxPoint;
26 class CVector3D;
27
28 namespace AtlasMessage
29 {
30
31 enum SELECTED_AXIS
32 {
33 AXIS_INVALID = -1,
34 AXIS_X = 1,
35 AXIS_Y = 2,
36 AXIS_Z = 4
37 };
38
39 // Represents a position in the game world, with an interface usable from the
40 // UI (which usually knows only about screen space). Typically constructed
41 // by the UI, then passed to the game which uses GetWorldSpace.
42
43 struct Position
44 {
PositionPosition45 Position() : type(0) { type0.x = type0.y = type0.z = 0.f; }
46
47 // Constructs a position with specified world-space coordinates
PositionPosition48 Position(float x, float y, float z) : type(0) { type0.x = x; type0.y = y; type0.z = z; }
49
50 // Constructs a position on the terrain underneath the screen-space coordinates
51 Position(const wxPoint& pt); // (implementation in ScenarioEditor.cpp)
52
53 // Store all possible position representations in a union, instead of something
54 // like inheritance and virtual functions, so we don't have to care about
55 // dynamic memory allocation across DLLs.
56 int type;
57 union {
58 struct { float x, y, z; } type0; // world-space coordinates
59 struct { int x, y; } type1; // screen-space coordinates, to be projected onto terrain
60 // type2: "same as previous" (e.g. for elevation-editing when the mouse hasn't moved)
61 };
62
63 // Constructs a position with the meaning "same as previous", which is handled
64 // in unspecified (but usually obvious) ways by different message handlers.
UnchangedPosition65 static Position Unchanged() { Position p; p.type = 2; return p; }
66
67 // Only for use in the game, not the UI.
68 // Implementations in Misc.cpp.
69 CVector3D GetWorldSpace(bool floating = false) const;
70 CVector3D GetWorldSpace(float h, bool floating = false) const;
71 CVector3D GetWorldSpace(const CVector3D& prev, bool floating = false) const;
72 void GetScreenSpace(float& x, float& y) const;
73 };
74 SHAREABLE_STRUCT(Position);
75
76
77 struct Color
78 {
ColorColor79 Color()
80 : r(255), g(0), b(255)
81 {
82 }
83
ColorColor84 Color(unsigned char r, unsigned char g, unsigned char b)
85 : r(r), g(g), b(b)
86 {
87 }
88
89 unsigned char r, g, b;
90 };
91 SHAREABLE_STRUCT(Color);
92
93
94 typedef unsigned int ObjectID;
ObjectIDIsValid(ObjectID id)95 inline bool ObjectIDIsValid(ObjectID id) { return (id != 0); }
96
97
98 struct sCinemaSplineNode
99 {
100 Shareable<float> px, py, pz, rx, ry, rz, t;
101 public:
sCinemaSplineNodesCinemaSplineNode102 sCinemaSplineNode(float _px, float _py, float _pz, float _rx, float _ry, float _rz)
103 : px(_px), py(_py), pz(_pz), rx(_rx), ry(_ry), rz(_rz), t(0.0f) {}
sCinemaSplineNodesCinemaSplineNode104 sCinemaSplineNode() {}
SetTimesCinemaSplineNode105 void SetTime(float _t) { t = _t; }
106 };
107 SHAREABLE_STRUCT(sCinemaSplineNode);
108
109 struct sCinemaPath
110 {
111 Shareable<std::vector<AtlasMessage::sCinemaSplineNode> > nodes;
112 Shareable<std::wstring> name;
113 Shareable<float> duration, timescale;
114 Shareable<int> mode, growth, change, style; // change == switch point
115
sCinemaPathsCinemaPath116 sCinemaPath(const std::wstring& _name) : name(_name), mode(0), style(0), change(0), growth(0), duration(0), timescale(1) {}
sCinemaPathsCinemaPath117 sCinemaPath() : mode(0), style(0), change(0), growth(0), duration(0), timescale(1) {}
118
119 /*AtlasMessage::sCinemaPath operator-(const AtlasMessage::sCinemaPath& path)
120 {
121 return AtlasMessage::sCinemaPath(x - path.x, y - path.y, z - path.z);
122 }
123 AtlasMessage::sCinemaPath operator+(const AtlasMessage::sCinemaPath& path)
124 {
125 return AtlasMessage::sCinemaPath(x + path.x, y + path.y, z + path.z);
126 }*/
127 };
128 SHAREABLE_STRUCT(sCinemaPath);
129
130 struct sCinemaPathNode
131 {
132 Shareable<std::wstring> name;
133 Shareable<int> index;
134 Shareable<bool> targetNode;
sCinemaPathNodesCinemaPathNode135 sCinemaPathNode() : index(-1), targetNode(false) {}
136 };
137 SHAREABLE_STRUCT(sCinemaPathNode);
138
139
140 struct eCinemaEventMode { enum { SMOOTH, SELECT, IMMEDIATE_PATH, RESET }; };
141 struct sCameraInfo
142 {
143 Shareable<float> pX, pY, pZ, rX, rY, rZ; // position and rotation
144 };
145 SHAREABLE_STRUCT(sCameraInfo);
146
147 }
148
149 #endif // INCLUDED_SHAREDTYPES
150