Pyrogenesis HEAD
Pyrogenesis, a RTS Engine
ICmpPosition.h
Go to the documentation of this file.
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#ifndef INCLUDED_ICMPPOSITION
19#define INCLUDED_ICMPPOSITION
20
22
24#include "maths/FixedVector3D.h"
25#include "maths/FixedVector2D.h"
26
27#include <set>
28
29class CMatrix3D;
30
31/**
32 * Represents an entity's position in the world (plus its orientation).
33 *
34 * Entity positions are determined by the following:
35 * - X, Z coordinates (giving left/right and front/back coordinates on the map)
36 * - Y offset (height; entities always snap to the ground, then are offset by this amount)
37 * - 'Floating' flag (snap to surface of water instead of going underneath)
38 * As far as the simulation code is concerned, movements are instantaneous.
39 * The only exception is GetInterpolatedTransform, used for rendering, which may
40 * interpolate between the previous and current positions.
41 * (The "Jump" methods circumvent the interpolation, and should be used whenever immediate
42 * movement is needed.)
43 *
44 * Orientations consist of the following:
45 * - Rotation around upwards 'Y' axis (the common form of rotation)
46 * - Terrain conformance mode, one of:
47 * - Upright (upwards axis is always the world Y axis, e.g. for humans)
48 * - Pitch (rotates backwards and forwards to match the terrain, e.g. for horses)
49 * - Pitch-Roll (rotates in all directions to match the terrain, e.g. for carts)
50 * - Roll (rotates sideways to match the terrain)
51 * NOTE: terrain conformance is currently only a local, visual effect; it doesn't change
52 * the network synchronized rotation or the data returned by GetRotation
53 * - Rotation around relative X (pitch), Z (roll) axes (rare; used for special effects)
54 * NOTE: if XZ rotation is non-zero, it will override the terrain conformance mode
55 *
56 * Entities can also be 'outside the world' (e.g. hidden inside a building), in which
57 * case they have no position. Callers <b>must</b> check the entity is in the world, before
58 * querying its position.
59 */
61{
62public:
63 /**
64 * Set this as a turret of an other entity
65 */
66 virtual void SetTurretParent(entity_id_t parent, const CFixedVector3D& offset) = 0;
67
68 /**
69 * Get the turret parent of this entity
70 */
71 virtual entity_id_t GetTurretParent() const = 0;
72
73 /**
74 * Has to be called to update the simulation position of the turret
75 */
76 virtual void UpdateTurretPosition() = 0;
77
78 /**
79 * Get the list of turrets to read or edit
80 */
81 virtual std::set<entity_id_t>* GetTurrets() = 0;
82
83 /**
84 * Returns true if the entity currently exists at a defined position in the world.
85 */
86 virtual bool IsInWorld() const = 0;
87
88 /**
89 * Causes IsInWorld to return false. (Use MoveTo() or JumpTo() to move back into the world.)
90 */
91 virtual void MoveOutOfWorld() = 0;
92
93 /**
94 * Move smoothly to the given location.
95 */
96 virtual void MoveTo(entity_pos_t x, entity_pos_t z) = 0;
97
98 /**
99 * Combines MoveTo and TurnTo to avoid an uncessary "AdvertisePositionChange"
100 */
102
103 /**
104 * Move immediately to the given location, with no interpolation.
105 */
106 virtual void JumpTo(entity_pos_t x, entity_pos_t z) = 0;
107
108 /**
109 * Set the vertical offset above the terrain/water surface.
110 */
111 virtual void SetHeightOffset(entity_pos_t dy) = 0;
112
113 /**
114 * Returns the current vertical offset above the terrain/water surface.
115 */
116 virtual entity_pos_t GetHeightOffset() const = 0;
117
118 /**
119 * Set the vertical position above the map zero point
120 */
121 virtual void SetHeightFixed(entity_pos_t y) = 0;
122
123 /**
124 * Returns the current vertical offset above above the map zero point.
125 */
126 virtual entity_pos_t GetHeightFixed() const = 0;
127
128 /**
129 * Returns the vertical offset above above the map zero point
130 * the unit would have at the given position.
131 */
133
134 /**
135 * Returns true iff the entity will follow the terrain height (possibly with an offset)
136 */
137 virtual bool IsHeightRelative() const = 0;
138
139 /**
140 * When set to true, the entity will follow the terrain height (possibly with an offset)
141 * When set to false, it's height won't change automatically
142 */
143 virtual void SetHeightRelative(bool flag) = 0;
144
145 /**
146 * Returns whether the entity can float on water.
147 */
148 virtual bool CanFloat() const = 0;
149
150 /**
151 * Set the entity to float on water
152 */
153 virtual void SetFloating(bool flag) = 0;
154
155 /**
156 * Set the entity to float on water, in a non-network-synchronised visual-only way.
157 * (This is to support the 'floating' flag in actor XMLs.)
158 */
159 virtual void SetActorFloating(bool flag) = 0;
160
161 /**
162 * Set construction progress of the model, this affects the rendered position of the model.
163 * 0.0 will be fully underground, 1.0 will be fully visible, 0.5 will be half underground.
164 */
165 virtual void SetConstructionProgress(fixed progress) = 0;
166
167 /**
168 * Returns the current x,y,z position (no interpolation).
169 * Depends on the current terrain heightmap.
170 * Must not be called unless IsInWorld is true.
171 */
172 virtual CFixedVector3D GetPosition() const = 0;
173
174 /**
175 * Returns the current x,z position (no interpolation).
176 * Must not be called unless IsInWorld is true.
177 */
178 virtual CFixedVector2D GetPosition2D() const = 0;
179
180 /**
181 * Returns the previous turn's x,y,z position (no interpolation).
182 * Depends on the current terrain heightmap.
183 * Must not be called unless IsInWorld is true.
184 */
186
187 /**
188 * Returns the previous turn's x,z position (no interpolation).
189 * Must not be called unless IsInWorld is true.
190 */
192
193 /**
194 * Returns the turn rate in radians per second.
195 */
196 virtual fixed GetTurnRate() const = 0;
197
198 /**
199 * Rotate smoothly to the given angle around the upwards axis.
200 * @param y clockwise radians from the +Z axis.
201 */
202 virtual void TurnTo(entity_angle_t y) = 0;
203
204 /**
205 * Rotate immediately to the given angle around the upwards axis.
206 * @param y clockwise radians from the +Z axis.
207 */
208 virtual void SetYRotation(entity_angle_t y) = 0;
209
210 /**
211 * Rotate immediately to the given angles around the X (pitch) and Z (roll) axes.
212 * @param x radians around the X axis. (TODO: in which direction?)
213 * @param z radians around the Z axis.
214 * @note if either x or z is non-zero, it will override terrain conformance mode
215 */
217
218 // NOTE: we separate Y from XZ because most code will only ever change Y;
219 // XZ are typically just used in the editor, and other code should never
220 // worry about them
221
222 /**
223 * Returns the current rotation (relative to the upwards axis), as Euler
224 * angles with X=pitch, Y=yaw, Z=roll. (TODO: is that the right way round?)
225 */
226 virtual CFixedVector3D GetRotation() const = 0;
227
228 /**
229 * Returns the distance that the unit will be interpolated over,
230 * i.e. the distance travelled since the start of the turn.
231 */
232 virtual fixed GetDistanceTravelled() const = 0;
233
234 /**
235 * Get the current interpolated 2D position and orientation, for rendering.
236 * Must not be called unless IsInWorld is true.
237 */
238 virtual void GetInterpolatedPosition2D(float frameOffset, float& x, float& z, float& rotY) const = 0;
239
240 /**
241 * Get the current interpolated transform matrix, for rendering.
242 * Must not be called unless IsInWorld is true.
243 */
244 virtual CMatrix3D GetInterpolatedTransform(float frameOffset) const = 0;
245
246 DECLARE_INTERFACE_TYPE(Position)
247};
248
249#endif // INCLUDED_ICMPPOSITION
#define DECLARE_INTERFACE_TYPE(iname)
Definition: Interface.h:23
Entity coordinate types.
Definition: FixedVector2D.h:25
Definition: FixedVector3D.h:25
A simple fixed-point number class.
Definition: Fixed.h:120
Definition: Matrix3D.h:34
Represents an entity's position in the world (plus its orientation).
Definition: ICmpPosition.h:61
virtual void UpdateTurretPosition()=0
Has to be called to update the simulation position of the turret.
virtual void GetInterpolatedPosition2D(float frameOffset, float &x, float &z, float &rotY) const =0
Get the current interpolated 2D position and orientation, for rendering.
virtual entity_id_t GetTurretParent() const =0
Get the turret parent of this entity.
virtual std::set< entity_id_t > * GetTurrets()=0
Get the list of turrets to read or edit.
virtual entity_pos_t GetHeightFixed() const =0
Returns the current vertical offset above above the map zero point.
virtual void SetTurretParent(entity_id_t parent, const CFixedVector3D &offset)=0
Set this as a turret of an other entity.
virtual entity_pos_t GetHeightOffset() const =0
Returns the current vertical offset above the terrain/water surface.
virtual void SetHeightFixed(entity_pos_t y)=0
Set the vertical position above the map zero point.
virtual void SetConstructionProgress(fixed progress)=0
Set construction progress of the model, this affects the rendered position of the model.
virtual void SetFloating(bool flag)=0
Set the entity to float on water.
virtual CFixedVector2D GetPosition2D() const =0
Returns the current x,z position (no interpolation).
virtual entity_pos_t GetHeightAtFixed(entity_pos_t x, entity_pos_t z) const =0
Returns the vertical offset above above the map zero point the unit would have at the given position.
virtual CFixedVector3D GetPreviousPosition() const =0
Returns the previous turn's x,y,z position (no interpolation).
virtual fixed GetDistanceTravelled() const =0
Returns the distance that the unit will be interpolated over, i.e.
virtual bool CanFloat() const =0
Returns whether the entity can float on water.
virtual void JumpTo(entity_pos_t x, entity_pos_t z)=0
Move immediately to the given location, with no interpolation.
virtual void SetYRotation(entity_angle_t y)=0
Rotate immediately to the given angle around the upwards axis.
virtual bool IsHeightRelative() const =0
Returns true iff the entity will follow the terrain height (possibly with an offset)
virtual void MoveTo(entity_pos_t x, entity_pos_t z)=0
Move smoothly to the given location.
virtual void SetHeightOffset(entity_pos_t dy)=0
Set the vertical offset above the terrain/water surface.
virtual void MoveOutOfWorld()=0
Causes IsInWorld to return false.
virtual CFixedVector3D GetPosition() const =0
Returns the current x,y,z position (no interpolation).
virtual void TurnTo(entity_angle_t y)=0
Rotate smoothly to the given angle around the upwards axis.
virtual fixed GetTurnRate() const =0
Returns the turn rate in radians per second.
virtual void SetActorFloating(bool flag)=0
Set the entity to float on water, in a non-network-synchronised visual-only way.
virtual void MoveAndTurnTo(entity_pos_t x, entity_pos_t z, entity_angle_t ry)=0
Combines MoveTo and TurnTo to avoid an uncessary "AdvertisePositionChange".
virtual CFixedVector2D GetPreviousPosition2D() const =0
Returns the previous turn's x,z position (no interpolation).
virtual CFixedVector3D GetRotation() const =0
Returns the current rotation (relative to the upwards axis), as Euler angles with X=pitch,...
virtual bool IsInWorld() const =0
Returns true if the entity currently exists at a defined position in the world.
virtual void SetHeightRelative(bool flag)=0
When set to true, the entity will follow the terrain height (possibly with an offset) When set to fal...
virtual CMatrix3D GetInterpolatedTransform(float frameOffset) const =0
Get the current interpolated transform matrix, for rendering.
virtual void SetXZRotation(entity_angle_t x, entity_angle_t z)=0
Rotate immediately to the given angles around the X (pitch) and Z (roll) axes.
Definition: IComponent.h:33
u32 entity_id_t
Entity ID type.
Definition: Entity.h:29