AnimNode.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "AnimConnector.hpp"
4 #include "../../Defs.hpp"
6 
7 namespace iv
8 {
9 
10 extern TableId AnimNode_DebugTable;
11 class AnimSystem;
12 
15 class AnimNodeI
16 {
17 public:
19 
20  AnimNodeI( Instance * inst );
21  ~AnimNodeI();
22 
23  Instance * instance() const;
24  void status( TableDebugView * view );
25 
29  AnimNodeI * label( std::string const & );
30  std::string const & label() const;
31 
34  virtual void StringIO_SetTarget( const char * source, Context const * context ){}
35  virtual std::string StringIO_GetTarget( Context const * context ){ return ""; }
36 
37 //------------------------- anim graph ----------------------------------
40  void anim_setParent( AnimConnector * );
43 
46  void anim_addChild( AnimConnector * );
48  void anim_eachChild( std::function< void( AnimConnector * ) > const & );
49 
50 //------------------------- update algorithm ----------------------------------------
51 
55  void System_UpdateStart();
56 
60  void System_UpdateEnd();
61 
65  std::optional< unsigned > System_UpdateId() const;
66 
70  void Connector_RequestStep( Anim_float step_distance );
71 
75  void Connector_UpdateDistance( Anim_float new_distance );
76 
77 //------------------------- update read fields -------------------------------------------
81  Anim_float Step();
82 
87  bool Active();
88 
92  void Activate();
93 
99 
102  bool IsInTarget();
103 
107  Anim_float Speed() const;
109  AnimNodeI * Speed_inf();
110 
111 protected:
112  // AnimNodeI
113  virtual void UpdateLastTarget(){};
114  virtual bool TargetStabilized(){ return true; }
115 
116  static const constexpr unsigned ActiveCooldownFrames = 5;
117 
118 protected:
119  // identity
122  std::string _label;
125 
126  // structure
128  std::unordered_set< AnimConnector * > _children;
129 
130  //
131  std::optional< unsigned > _activation_id;
132  unsigned _active_cooldown;
133  bool _active;
134 
138 
140 
141  std::optional< unsigned > _update_id;
142 
144 };
145 
148 template< class T >
149 class AnimNode : public AnimNodeI
150 {
151 public:
153  AnimNode( Instance * inst, T const & initial_value );
154  void status( TableDebugView * view );
155 
156  AnimNode< T > * label( std::string const & );
157  std::string const & label() const;
158 
159  virtual void StringIO_SetTarget( const char * source, Context const * context ) override;
160  virtual std::string StringIO_GetTarget( Context const * context ) override;
161 
162  //--------------------- anim state and update ----------------------------------------
165  Anim_float Speed() const;
168 
172  AnimNode< T > * Target( T const & target );
173  T const & Target();
174 
178  T const & LastTarget();
179 
182  bool IsInTarget();
183  bool IsInTarget( T const & target );
184 
185 private:
186  virtual void UpdateLastTarget() override;
187  virtual bool TargetStabilized() override;
188 
189 private:
190  T _target;
191  T _last_target;
192 };
193 
194 }
195 
196 #include "AnimNode.inl"