TrinityCore
Loading...
Searching...
No Matches
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;
89
90 void init_spline(MoveSplineInitArgs const& args);
91
92 protected:
93 MySpline::ControlArray const& getPath() const { return spline.getPoints(); }
94 Location computePosition(int32 time_point, int32 point_index) const;
95 void computeParabolicElevation(int32 time_point, float& el) const;
96 void computeFallElevation(int32 time_point, float& el) const;
97
98 UpdateResult _updateState(int32& ms_time_diff);
99 void reinit_spline_for_next_cycle();
100 int32 next_timestamp() const { return spline.length(point_Idx + 1); }
101 int32 segment_time_elapsed() const { return next_timestamp() - time_passed; }
102
103 public:
104 int32 timeRemaining() const { return Duration() - time_passed; }
105 int32 timePassed() const { return time_passed; }
106 int32 Duration() const { return spline.length(); }
107 MySpline const& _Spline() const { return spline; }
108 int32 _currentSplineIdx() const { return point_Idx; }
109 float Velocity() const { return velocity; }
110 void _Finalize();
111 void _Interrupt() { splineflags.Done = true; }
112
113 public:
114 void Initialize(MoveSplineInitArgs const&);
115 bool Initialized() const { return !spline.empty(); }
116
117 MoveSpline();
118
119 template<class UpdateHandler>
120 void updateState(int32 difftime, UpdateHandler& handler)
121 {
122 ASSERT(Initialized());
123 do
124 handler(_updateState(difftime));
125 while (difftime > 0);
126 }
127
128 void updateState(int32 difftime)
129 {
130 ASSERT(Initialized());
131 do _updateState(difftime);
132 while (difftime > 0);
133 }
134
135 Location ComputePosition() const;
136 Location ComputePosition(int32 time_offset) const;
137
138 uint32 GetId() const { return m_Id; }
139 bool Finalized() const { return splineflags.Done; }
140 bool isCyclic() const { return splineflags.Cyclic; }
141 bool isFalling() const { return splineflags.Falling; }
142 bool isTurning() const { return splineflags.Turning; }
143 Vector3 const& FinalDestination() const { return Initialized() ? spline.getPoint(spline.last()) : Vector3::zero(); }
144 Vector3 const& CurrentDestination() const { return Initialized() ? spline.getPoint(point_Idx + 1) : Vector3::zero(); }
145 int32 currentPathIdx() const;
146
147 Optional<AnimTier> GetAnimation() const { return anim_tier ? anim_tier->AnimTier : Optional<AnimTier>{}; }
148
151 std::string ToString() const;
152 bool HasStarted() const
153 {
154 return time_passed > 0;
155 }
156 };
157}
158#endif // TRINITYSERVER_MOVEPLINE_H
#define TC_GAME_API
Definition Define.h:129
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define ASSERT
Definition Errors.h:80
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
AnimTier
Definition UnitDefines.h:69
bool isTurning() const
Definition MoveSpline.h:142
int32 next_timestamp() const
Definition MoveSpline.h:100
bool isCyclic() const
Definition MoveSpline.h:140
float Velocity() const
Definition MoveSpline.h:109
Optional< TurnData > turn
Definition MoveSpline.h:87
uint32 GetId() const
Definition MoveSpline.h:138
bool isFalling() const
Definition MoveSpline.h:141
bool Finalized() const
Definition MoveSpline.h:139
Vector3 const & CurrentDestination() const
Definition MoveSpline.h:144
MySpline::ControlArray const & getPath() const
Definition MoveSpline.h:93
int32 timePassed() const
Definition MoveSpline.h:105
void updateState(int32 difftime)
Definition MoveSpline.h:128
Optional< AnimTierTransition > anim_tier
Definition MoveSpline.h:88
Optional< AnimTier > GetAnimation() const
Definition MoveSpline.h:147
MySpline const & _Spline() const
Definition MoveSpline.h:107
Vector3 const & FinalDestination() const
Definition MoveSpline.h:143
int32 Duration() const
Definition MoveSpline.h:106
int32 _currentSplineIdx() const
Definition MoveSpline.h:108
bool Initialized() const
Definition MoveSpline.h:115
int32 segment_time_elapsed() const
Definition MoveSpline.h:101
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:120
MoveSplineFlag splineflags
Definition MoveSpline.h:74
Optional< SpellEffectExtraData > spell_effect_extra
Definition MoveSpline.h:86
int32 timeRemaining() const
Definition MoveSpline.h:104
Spline< int32 > MySpline
Definition MoveSpline.h:57
bool HasStarted() const
Definition MoveSpline.h:152
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)
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