TrinityCore
MoveSpline.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITYSERVER_MOVEPLINE_H
19#define TRINITYSERVER_MOVEPLINE_H
20
21#include "Spline.h"
22#include "MoveSplineInitArgs.h"
23#include <G3D/Vector3.h>
24
25enum class AnimTier : uint8;
26
27namespace WorldPackets
28{
29 namespace Movement
30 {
31 class CommonMovement;
32 class MonsterMove;
33 }
34}
35
36namespace Movement
37{
38 struct Location : public Vector3
39 {
41 Location(float x, float y, float z, float o) : Vector3(x, y, z), orientation(o) { }
42 Location(Vector3 const& v) : Vector3(v), orientation(0) { }
43 Location(Vector3 const& v, float o) : Vector3(v), orientation(o) { }
44
46 };
47
48 // MoveSpline represents smooth catmullrom or linear curve and point that moves belong it
49 // curve can be cyclic - in this case movement will be cyclic
50 // point can have vertical acceleration motion component (used in fall, parabolic movement)
52 {
55
56 public:
58
60 {
61 Result_None = 0x01,
62 Result_Arrived = 0x02,
63 Result_NextCycle = 0x04,
64 Result_NextSegment = 0x08
65 };
66
67 protected:
69
71
73
75
77 // currently duration mods are unused, but its _currently_
78 //float duration_mod;
79 //float duration_mod_next;
85 float velocity;
88
89 void init_spline(MoveSplineInitArgs const& args);
90
91 protected:
92 MySpline::ControlArray const& getPath() const { return spline.getPoints(); }
93 Location computePosition(int32 time_point, int32 point_index) const;
94 void computeParabolicElevation(int32 time_point, float& el) const;
95 void computeFallElevation(int32 time_point, float& el) const;
96
97 UpdateResult _updateState(int32& ms_time_diff);
98 int32 next_timestamp() const { return spline.length(point_Idx + 1); }
99 int32 segment_time_elapsed() const { return next_timestamp() - time_passed; }
100 int32 timeElapsed() const { return Duration() - time_passed; }
101
102 public:
103 int32 timePassed() const { return time_passed; }
104 int32 Duration() const { return spline.length(); }
105 MySpline const& _Spline() const { return spline; }
106 int32 _currentSplineIdx() const { return point_Idx; }
107 float Velocity() const { return velocity; }
108 void _Finalize();
109 void _Interrupt() { splineflags.done = true; }
110
111 public:
112 void Initialize(MoveSplineInitArgs const&);
113 bool Initialized() const { return !spline.empty(); }
114
115 MoveSpline();
116
117 template<class UpdateHandler>
118 void updateState(int32 difftime, UpdateHandler& handler)
119 {
120 ASSERT(Initialized());
121 do
122 handler(_updateState(difftime));
123 while (difftime > 0);
124 }
125
126 void updateState(int32 difftime)
127 {
128 ASSERT(Initialized());
129 do _updateState(difftime);
130 while (difftime > 0);
131 }
132
133 Location ComputePosition() const;
134 Location ComputePosition(int32 time_offset) const;
135
136 uint32 GetId() const { return m_Id; }
137 bool Finalized() const { return splineflags.done; }
138 bool isCyclic() const { return splineflags.cyclic; }
139 bool isFalling() const { return splineflags.falling; }
140 Vector3 const& FinalDestination() const { return Initialized() ? spline.getPoint(spline.last()) : Vector3::zero(); }
141 Vector3 const& CurrentDestination() const { return Initialized() ? spline.getPoint(point_Idx + 1) : Vector3::zero(); }
142 int32 currentPathIdx() const;
143
144 Optional<AnimTier> GetAnimation() const { return anim_tier ? anim_tier->AnimTier : Optional<AnimTier>{}; }
145
148 std::string ToString() const;
149 bool HasStarted() const
150 {
151 return time_passed > 0;
152 }
153 };
154}
155#endif // TRINITYSERVER_MOVEPLINE_H
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define ASSERT
Definition: Errors.h:68
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
AnimTier
Definition: UnitDefines.h:69
int32 next_timestamp() const
Definition: MoveSpline.h:98
bool isCyclic() const
Definition: MoveSpline.h:138
float Velocity() const
Definition: MoveSpline.h:107
int32 timeElapsed() const
Definition: MoveSpline.h:100
uint32 GetId() const
Definition: MoveSpline.h:136
bool isFalling() const
Definition: MoveSpline.h:139
bool Finalized() const
Definition: MoveSpline.h:137
Vector3 const & CurrentDestination() const
Definition: MoveSpline.h:141
MySpline::ControlArray const & getPath() const
Definition: MoveSpline.h:92
int32 timePassed() const
Definition: MoveSpline.h:103
void updateState(int32 difftime)
Definition: MoveSpline.h:126
Optional< AnimTierTransition > anim_tier
Definition: MoveSpline.h:87
Optional< AnimTier > GetAnimation() const
Definition: MoveSpline.h:144
MySpline const & _Spline() const
Definition: MoveSpline.h:105
float vertical_acceleration
Definition: MoveSpline.h:80
Vector3 const & FinalDestination() const
Definition: MoveSpline.h:140
int32 Duration() const
Definition: MoveSpline.h:104
int32 _currentSplineIdx() const
Definition: MoveSpline.h:106
bool Initialized() const
Definition: MoveSpline.h:113
int32 segment_time_elapsed() const
Definition: MoveSpline.h:99
FacingInfo facing
Definition: MoveSpline.h:70
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:118
MoveSplineFlag splineflags
Definition: MoveSpline.h:74
Optional< SpellEffectExtraData > spell_effect_extra
Definition: MoveSpline.h:86
Spline< int32 > MySpline
Definition: MoveSpline.h:57
bool HasStarted() const
Definition: MoveSpline.h:149
std::vector< Vector3 > ControlArray
Definition: Spline.h:33
ControlArray const & getPoints() const
Definition: Spline.h:117
bool empty() const
Definition: Spline.h:113
Vector3 const & getPoint(index_type i) const
Definition: Spline.h:119
index_type last() const
Definition: Spline.h:111
length_type length() const
Definition: Spline.h:199
float computeFallElevation(float t_passed, bool isSafeFall, float start_velocity=0.0f)
std::string ToString(Type &&val, Params &&... params)
Location(Vector3 const &v, float o)
Definition: MoveSpline.h:43
Location(Vector3 const &v)
Definition: MoveSpline.h:42
Location(float x, float y, float z, float o)
Definition: MoveSpline.h:41