]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/persparam.hxx
Add preliminary spot light animation
[simgear.git] / simgear / scene / model / persparam.hxx
1 /**
2  * $Id$
3  */
4
5 #ifndef _SG_PERSPARAM_HXX
6 #define _SG_PERSPARAM_HXX 1
7
8 #include <simgear/math/sg_random.h>
9
10
11 template <class T>
12 class SGPersonalityParameter {
13 public:
14   SGPersonalityParameter(const SGPropertyNode *props, const char *name, T defval )
15     : _var( defval ), _min( defval ), _max( defval ) {
16     const SGPropertyNode* node = props->getNode( name );
17     if ( node != 0 ) {
18       const SGPropertyNode* rand_n = node->getNode( "random" );
19       if ( rand_n != 0 ) {
20         _min = getNodeValue( rand_n, "min", (T)0 );
21         _max = getNodeValue( rand_n, "max", (T)1 );
22         shuffle();
23       } else {
24         _var = _min = _max = getNodeValue( props, name, defval );
25       }
26     }
27   }
28   SGPersonalityParameter<T> &operator=( T v ) { _var = v; return *this; }
29   SGPersonalityParameter<T> &operator+=( T v ) { _var += v; return *this; }
30   SGPersonalityParameter<T> &operator-=( T v ) { _var -= v; return *this; }
31   T shuffle() { return ( _var = _min + sg_random() * ( _max - _min ) ); }
32   T value() const { return _var; }
33   T getNodeValue(const SGPropertyNode *props, const char *name, T defval ) const;
34   operator T() const { return _var; }
35
36 private:
37   T _var;
38   T _min;
39   T _max;
40 };
41
42 template <> double
43 SGPersonalityParameter<double>::getNodeValue( const SGPropertyNode *props,
44                                               const char *name,
45                                               double defval ) const;
46
47 #endif // _SG_PERSPARAM_HXX
48