15 #ifndef MOTIVE_UTIL_H_
16 #define MOTIVE_UTIL_H_
18 #include "motive/motivator.h"
19 #include "motive/target.h"
24 enum TwitchDirection {
26 kTwitchDirectionPositive,
27 kTwitchDirectionNegative
37 bool Settled(
float dist,
float velocity)
const {
42 template <
class Motivator>
44 float differences[Motivator::kDimensions];
45 float velocities[Motivator::kDimensions];
46 motivator.Differences(differences);
47 motivator.Velocities(velocities);
48 for (
int i = 0; i < Motivator::kDimensions; ++i) {
49 if (!
Settled(differences[i], velocities[i]))
return false;
63 inline bool Settled1f::Settled<Motivator1f>(
const Motivator1f& motivator)
65 return Settled(motivator.Difference(), motivator.Velocity());
75 inline void Twitch(TwitchDirection direction,
float velocity,
76 const Settled1f& settled, Motivator1f* motivator) {
77 if (direction != kTwitchDirectionNone && settled.Settled(*motivator)) {
78 motivator->SetTarget(Current1f(
80 direction == kTwitchDirectionPositive ? velocity : -velocity));
86 #endif // MOTIVE_UTIL_H_
bool Settled(const Motivator &motivator) const
Return true if motivator is "at the target" and "stopped".
Definition: util.h:43
float max_velocity
Consider ourselves "stopped" if the absolute velocity is less than this.
Definition: util.h:59
bool Settled(float dist, float velocity) const
Definition: util.h:37
Helper to determine if we're "at the target" and "stopped".
Definition: util.h:32
Drives a value towards a target value, or along a path.
Definition: motivator.h:47
float max_difference
Definition: util.h:56
Animate a vector of floating-point values.
Definition: motivator.h:365