1 // Subsystem that manages interpolation of properties.
3 // Copyright (C) 2013 Thomas Geymayer <tomgey@gmail.com>
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Library General Public
7 // License as published by the Free Software Foundation; either
8 // version 2 of the License, or (at your option) any later version.
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Library General Public License for more details.
15 // You should have received a copy of the GNU Library General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #ifndef SG_PROPERTY_INTERPOLATION_MGR_HXX_
20 #define SG_PROPERTY_INTERPOLATION_MGR_HXX_
22 #include "PropertyInterpolator.hxx"
24 #include <simgear/math/sg_types.hxx>
25 #include <simgear/misc/make_new.hxx>
26 #include <simgear/props/props.hxx>
27 #include <simgear/structure/subsystem_mgr.hxx>
35 * Subsystem that manages interpolation of properties.
37 * By default the numeric values of the properties are interpolated. For
38 * example, for strings this is probably not the wanted behavior. For this
39 * adapter classes can be registered to allow providing specific
40 * interpolations for certain types of properties. Using the type "color",
41 * provided by ColorInterpolator, strings containing %CSS colors can also be
44 * Additionally different functions can be used for easing of the animation.
45 * By default "linear" (constant animation speed) and "swing" (smooth
46 * acceleration and deceleration) are available.
48 class PropertyInterpolationMgr:
52 typedef PropertyInterpolator* (*InterpolatorFactory)();
54 PropertyInterpolationMgr();
57 * Update all active interpolators.
59 void update(double dt);
62 * Create a new property interpolator.
64 * @note To actually use it the interpolator needs to be attached to a
65 * property using PropertyInterpolationMgr::interpolate.
67 * @param type Type of animation ("numeric", "color", etc.)
68 * @param target Property containing target value
69 * @param duration Duration if the animation (in seconds)
70 * @param easing Type of easing ("linear", "swing", etc.)
73 createInterpolator( const std::string& type,
74 const SGPropertyNode& target,
76 const std::string& easing );
79 * Add animation of the given property from its current value to the
80 * target value of the interpolator. If no interpolator is given any
81 * existing animation of the given property is aborted.
83 * @param prop Property to be interpolated
84 * @param interp Interpolator used for interpolation
86 bool interpolate( SGPropertyNode* prop,
87 PropertyInterpolatorRef interp = 0 );
89 bool interpolate( SGPropertyNode* prop,
90 const std::string& type,
91 const SGPropertyNode& target,
93 const std::string& easing );
95 bool interpolate( SGPropertyNode* prop,
96 const std::string& type,
97 const PropertyList& values,
98 const double_list& deltas,
99 const std::string& easing );
102 * Register factory for interpolation type.
104 void addInterpolatorFactory( const std::string& type,
105 InterpolatorFactory factory );
107 void addInterpolatorFactory(const std::string& type)
109 addInterpolatorFactory
112 &simgear::make_new_derived<PropertyInterpolator, T>
117 * Register easing function.
119 void addEasingFunction(const std::string& type, easing_func_t func);
122 * Set property containing real time delta (not sim time)
124 * TODO better pass both deltas to all update methods...
126 void setRealtimeProperty(SGPropertyNode* node);
130 typedef std::map<std::string, InterpolatorFactory> InterpolatorFactoryMap;
131 typedef std::map<std::string, easing_func_t> EasingFunctionMap;
132 typedef std::pair< SGPropertyNode*,
133 PropertyInterpolatorRef > PropertyInterpolatorPair;
134 typedef std::list<PropertyInterpolatorPair> InterpolatorList;
136 struct PredicateIsSameProp;
138 InterpolatorFactoryMap _interpolator_factories;
139 EasingFunctionMap _easing_functions;
140 InterpolatorList _interpolators;
142 SGPropertyNode_ptr _rt_prop;
145 } // namespace simgear
147 #endif /* SG_PROPERTY_INTERPOLATION_MGR_HXX_ */