]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/persparam.hxx
Better encapsulation for personality
[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( SGPropertyNode *props, const char *name, T defval )
15     : _var( defval ), _min( defval ), _max( defval ) {
16     SGPropertyNode_ptr node = props->getNode( name );
17     if ( node != 0 ) {
18       SGPropertyNode_ptr rand_n = node->getNode( "random" );
19       if ( rand_n != 0 ) {
20         _min = rand_n->getDoubleValue( "min", 0.0 );
21         _max = rand_n->getDoubleValue( "max", 1.0 );
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( 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 #endif // _SG_PERSPARAM_HXX